Merge commit '0bb930fc0fbe5258261e807ee875bb77258c1a8' into master

Change-Id: I9cf4f50f3b8d42e5e34a83bfeaf66ab72807f2b4
diff --git a/.appveyor.yml b/.appveyor.yml
old mode 100644
new mode 100755
index 64e7ae6..5765d9e
--- a/.appveyor.yml
+++ b/.appveyor.yml
@@ -7,7 +7,7 @@
 os: Visual Studio 2013
 
 platform:
-  - Any CPU
+  - x64
 
 configuration:
   - Debug
@@ -17,6 +17,13 @@
   only:
     - master
 
+# Travis advances the master-tot tag to current top of the tree after
+# each push into the master branch, because it relies on that tag to
+# upload build artifacts to the master-tot release. This will cause
+# double testing for each push on Appveyor: one for the push, one for
+# the tag advance. Disable testing tags.
+skip_tags: true
+
 clone_depth: 5
 
 matrix:
@@ -24,7 +31,11 @@
 
 # scripts that run after cloning repository
 install:
+  - C:/Python27/python.exe update_glslang_sources.py
   - git clone https://github.com/google/googletest.git External/googletest
+  - cd External/googletest
+  - git checkout 440527a61e1c91188195f7de212c63c77e8f0a45
+  - cd ../..
 
 build:
   parallel: true  # enable MSBuild parallel builds
@@ -32,9 +43,52 @@
 
 build_script:
   - mkdir build && cd build
-  - cmake .. -DCMAKE_INSTALL_PREFIX=install
+  - cmake -G "Visual Studio 12 2013 Win64" -DCMAKE_INSTALL_PREFIX=install ..
   - cmake --build . --config %CONFIGURATION% --target install
 
 test_script:
   - ctest -C %CONFIGURATION% --output-on-failure
   - cd ../Test && bash runtests
+  - cd ../build
+
+after_test:
+  # For debug build, the generated dll has a postfix "d" in its name.
+  - ps: >-
+      If ($env:configuration -Match "Debug") {
+        $env:SUFFIX="d"
+      } Else {
+        $env:SUFFIX=""
+      }
+  - cd install
+  # Zip all glslang artifacts for uploading and deploying
+  - 7z a glslang-master-windows-"%PLATFORM%"-"%CONFIGURATION%".zip
+    bin\glslangValidator.exe
+    bin\spirv-remap.exe
+    include\glslang\*
+    include\SPIRV\*
+    lib\glslang%SUFFIX%.lib
+    lib\HLSL%SUFFIX%.lib
+    lib\OGLCompiler%SUFFIX%.lib
+    lib\OSDependent%SUFFIX%.lib
+    lib\SPIRV%SUFFIX%.lib
+    lib\SPVRemapper%SUFFIX%.lib
+    lib\SPIRV-Tools%SUFFIX%.lib
+    lib\SPIRV-Tools-opt%SUFFIX%.lib
+
+artifacts:
+  - path: build\install\*.zip
+    name: artifacts-zip
+
+deploy:
+  - provider: GitHub
+    auth_token:
+      secure: YglcSYdl0TylEa59H4K6lylBEDr586NAt2EMgZquSo+iuPrwgZQuJLPCoihSm9y6
+    release: master-tot
+    description: "Continuous build of the latest master branch by Appveyor and Travis CI"
+    artifact: artifacts-zip
+    draft: false
+    prerelease: false
+    force_update: true
+    on:
+      branch: master
+      APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2013
diff --git a/.gitattributes b/.gitattributes
old mode 100755
new mode 100644
diff --git a/.gitignore b/.gitignore
index 30889ac..a1fe394 100644
--- a/.gitignore
+++ b/.gitignore
@@ -6,8 +6,5 @@
 TAGS
 build/
 Test/localResults/
-Test/multiThread.out
-Test/singleThread.out
-Test/vert.spv
-Test/frag.spv
 External/googletest
+External/spirv-tools
diff --git a/.travis.yml b/.travis.yml
index 4a88dce..2478912 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -7,12 +7,15 @@
   - osx
 
 # Use Ubuntu 14.04 LTS (Trusty) as the Linux testing environment.
-sudo: required
+sudo: false
 dist: trusty
 
 env:
-  - GLSLANG_BUILD_TYPE=Release
-  - GLSLANG_BUILD_TYPE=Debug
+  global:
+    - secure: aGFrgzyKp+84hKrGkxVWg8cHV61uqrKEHT38gfSQK6+WS4GfLOyH83p7WnsEBb7AMhzU7LMNFdvOFr6+NaMpVnqRvc40CEG1Q+lNg9Pq9mhIZLowvDrfqTL9kQ+8Nbw5Q6/dg6CTvY7fvRfpfCEmKIUZBRkoKUuHeuM1uy3IupFcdNuL5bSYn3Beo+apSJginh9DI4BLDXFUgBzTRSLLyCX5g3cpaeGGOCr8quJlYx75W6HRck5g9SZuLtUoH9GFEV3l+ZEWB8noErW+J56L03bwNwFuuAh321evw++oQk5KFa8rlDvar3SJ3b1RHB8u/eq5DBYMyaK/fS8+Q7QbGr8diF/wDe68bKO7U9IhpNfExXmczCpExjHomW5TQv4rYdGhygPMfW97aIsPRYyNKcl4fkmb7NDrM8w0Jscdq2g5c2Kz0ItyZoBri/NXLwFQQjaVCs7Pf97TjuMA7mK0GJmDTRzi6SrDYlWMt5BQL3y0CCojyfLIRcTh0CQjQI29s97bLfQrYAxt9GNNFR+HTXRLLrkaAlJkPGEPwUywlSfEThnvHLesNxYqemolAYpQT4ithoL4GehGIHmaxsW295aKVhuRf8K9eBODNqrfblvM42UHhjntT+92ZnQ/Gkq80GqaMxnxi4PO5FyPIxt0r981b54YBkWi8YA4P7w5pNI=
+  matrix:
+    - GLSLANG_BUILD_TYPE=Release
+    - GLSLANG_BUILD_TYPE=Debug
 
 compiler:
   - clang
@@ -24,6 +27,9 @@
     # Skip GCC builds on Mac OS X.
     - os: osx
       compiler: gcc
+  include:
+    # Additional build using Android NDK.
+    - env: BUILD_NDK=ON
 
 cache:
   apt: true
@@ -36,25 +42,88 @@
   apt:
     packages:
       - clang-3.6
-      - ninja-build
 
 install:
-  # Install ninja on Mac OS X.
-  - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew update && brew install ninja; fi
-  # Make sure that clang-3.6 is selected.
+  # Make sure that clang-3.6 is selected on Linux.
   - if [[ "$TRAVIS_OS_NAME" == "linux" && "$CC" == "clang" ]]; then
       export CC=clang-3.6 CXX=clang++-3.6;
     fi
+  # Download a recent Android NDK and use its android.toolchain.cmake file.
+  - if [[ "$BUILD_NDK" == "ON" ]]; then
+      export ANDROID_NDK=$HOME/android-ndk;
+      git init $ANDROID_NDK;
+      pushd $ANDROID_NDK;
+        git remote add dneto0 https://github.com/dneto0/android-ndk.git;
+        git fetch --depth=1 dneto0 r17b-strip;
+        git checkout FETCH_HEAD;
+      popd;
+      export TOOLCHAIN_PATH=$ANDROID_NDK/build/cmake/android.toolchain.cmake;
+    fi
 
 before_script:
-  - git clone https://github.com/google/googletest.git External/googletest
+  - git clone --depth=1 https://github.com/google/googletest.git External/googletest
+  - ./update_glslang_sources.py
 
 script:
   - mkdir build && cd build
-  # We need to install the compiled binaries so the paths in the runtests script can resolve correctly.
-  - cmake -GNinja -DCMAKE_BUILD_TYPE=${GLSLANG_BUILD_TYPE} -DCMAKE_INSTALL_PREFIX=`pwd`/install ..
-  - ninja install
-  # Run Google-Test-based tests.
-  - ctest --output-on-failure
-  # Run runtests-based tests.
-  - cd ../Test && ./runtests
+  # For Android, do release building using NDK without testing.
+  # Use android-14, the oldest native API level supporeted by NDK r17b.
+  # We can use newer API levels if we want.
+  # For Linux and macOS, do debug/release building with testing.
+  - if [[ "$BUILD_NDK" == "ON" ]]; then
+      cmake -DCMAKE_TOOLCHAIN_FILE=${TOOLCHAIN_PATH}
+            -DANDROID_NATIVE_API_LEVEL=android-14
+            -DCMAKE_BUILD_TYPE=Release
+            -DANDROID_ABI="armeabi-v7a with NEON"
+            -DBUILD_TESTING=OFF ..;
+      make -j4;
+    else
+      cmake -DCMAKE_BUILD_TYPE=${GLSLANG_BUILD_TYPE}
+            -DCMAKE_INSTALL_PREFIX=`pwd`/install ..;
+      make -j4 install;
+      ctest --output-on-failure &&
+      cd ../Test && ./runtests;
+    fi
+
+after_success:
+  # For debug build, the generated dll has a postfix "d" in its name.
+  - if [[ "${GLSLANG_BUILD_TYPE}" == "Debug" ]]; then
+      export SUFFIX="d";
+    else
+      export SUFFIX="";
+    fi
+  # Create tarball for deployment
+  - if [[ ${CC} == clang* && "${BUILD_NDK}" != "ON" ]]; then
+      cd ../build/install;
+      export TARBALL=glslang-master-${TRAVIS_OS_NAME}-${GLSLANG_BUILD_TYPE}.zip;
+      zip ${TARBALL}
+        bin/glslangValidator
+        include/glslang/*
+        include/SPIRV/*
+        lib/libglslang${SUFFIX}.a
+        lib/libHLSL${SUFFIX}.a
+        lib/libOGLCompiler${SUFFIX}.a
+        lib/libOSDependent${SUFFIX}.a
+        lib/libSPIRV${SUFFIX}.a
+        lib/libSPVRemapper${SUFFIX}.a
+        lib/libSPIRV-Tools${SUFFIX}.a
+        lib/libSPIRV-Tools-opt${SUFFIX}.a;
+    fi
+
+before_deploy:
+  # Tag the current top of the tree as "master-tot".
+  # Travis CI replies on the tag name to properly push to GitHub Releases.
+  - git config --global user.name "Travis CI"
+  - git config --global user.email "builds@travis-ci.org"
+  - git tag -f master-tot
+  - git push -q -f https://${glslangtoken}@github.com/KhronosGroup/glslang --tags
+
+deploy:
+  provider: releases
+  api_key: ${glslangtoken}
+  on:
+    branch: master
+    condition: ${CC} == clang* && ${BUILD_NDK} != ON
+  file: ${TARBALL}
+  skip_cleanup: true
+  overwrite: true
diff --git a/Android.mk b/Android.mk
new file mode 100644
index 0000000..fda81a7
--- /dev/null
+++ b/Android.mk
@@ -0,0 +1,100 @@
+LOCAL_PATH := $(call my-dir)
+
+GLSLANG_OS_FLAGS := -DGLSLANG_OSINCLUDE_UNIX
+# AMD and NV extensions are turned on by default in upstream Glslang.
+GLSLANG_DEFINES:= -DAMD_EXTENSIONS -DNV_EXTENSIONS -DENABLE_HLSL $(GLSLANG_OS_FLAGS)
+
+include $(CLEAR_VARS)
+LOCAL_MODULE:=OSDependent
+LOCAL_CXXFLAGS:=-std=c++11 -fno-exceptions -fno-rtti $(GLSLANG_DEFINES)
+LOCAL_EXPORT_C_INCLUDES:=$(LOCAL_PATH)
+LOCAL_SRC_FILES:=glslang/OSDependent/Unix/ossource.cpp
+LOCAL_C_INCLUDES:=$(LOCAL_PATH) $(LOCAL_PATH)/glslang/OSDependent/Unix/
+LOCAL_EXPORT_C_INCLUDES:=$(LOCAL_PATH)/glslang/OSDependent/Unix/
+include $(BUILD_STATIC_LIBRARY)
+
+include $(CLEAR_VARS)
+LOCAL_MODULE:=OGLCompiler
+LOCAL_CXXFLAGS:=-std=c++11 -fno-exceptions -fno-rtti $(GLSLANG_DEFINES)
+LOCAL_EXPORT_C_INCLUDES:=$(LOCAL_PATH)
+LOCAL_SRC_FILES:=OGLCompilersDLL/InitializeDll.cpp
+LOCAL_C_INCLUDES:=$(LOCAL_PATH)/OGLCompiler
+LOCAL_STATIC_LIBRARIES:=OSDependent
+include $(BUILD_STATIC_LIBRARY)
+
+# Build Glslang's HLSL parser library.
+include $(CLEAR_VARS)
+LOCAL_MODULE:=HLSL
+LOCAL_CXXFLAGS:=-std=c++11 -fno-exceptions -fno-rtti $(GLSLANG_DEFINES)
+LOCAL_SRC_FILES:= \
+		hlsl/hlslAttributes.cpp \
+		hlsl/hlslGrammar.cpp \
+		hlsl/hlslOpMap.cpp \
+		hlsl/hlslParseables.cpp \
+		hlsl/hlslParseHelper.cpp \
+		hlsl/hlslScanContext.cpp \
+		hlsl/hlslTokenStream.cpp
+LOCAL_C_INCLUDES:=$(LOCAL_PATH) \
+	$(LOCAL_PATH)/hlsl
+include $(BUILD_STATIC_LIBRARY)
+
+include $(CLEAR_VARS)
+GLSLANG_OUT_PATH=$(if $(call host-path-is-absolute,$(TARGET_OUT)),$(TARGET_OUT),$(abspath $(TARGET_OUT)))
+
+LOCAL_MODULE:=glslang
+LOCAL_CXXFLAGS:=-std=c++11 -fno-exceptions -fno-rtti $(GLSLANG_DEFINES)
+LOCAL_EXPORT_C_INCLUDES:=$(LOCAL_PATH)
+LOCAL_SRC_FILES:= \
+		glslang/GenericCodeGen/CodeGen.cpp \
+		glslang/GenericCodeGen/Link.cpp \
+		glslang/MachineIndependent/attribute.cpp \
+		glslang/MachineIndependent/Constant.cpp \
+		glslang/MachineIndependent/glslang_tab.cpp \
+		glslang/MachineIndependent/InfoSink.cpp \
+		glslang/MachineIndependent/Initialize.cpp \
+		glslang/MachineIndependent/Intermediate.cpp \
+		glslang/MachineIndependent/intermOut.cpp \
+		glslang/MachineIndependent/IntermTraverse.cpp \
+		glslang/MachineIndependent/iomapper.cpp \
+		glslang/MachineIndependent/limits.cpp \
+		glslang/MachineIndependent/linkValidate.cpp \
+		glslang/MachineIndependent/parseConst.cpp \
+		glslang/MachineIndependent/ParseContextBase.cpp \
+		glslang/MachineIndependent/ParseHelper.cpp \
+		glslang/MachineIndependent/PoolAlloc.cpp \
+		glslang/MachineIndependent/propagateNoContraction.cpp \
+		glslang/MachineIndependent/reflection.cpp \
+		glslang/MachineIndependent/RemoveTree.cpp \
+		glslang/MachineIndependent/Scan.cpp \
+		glslang/MachineIndependent/ShaderLang.cpp \
+		glslang/MachineIndependent/SymbolTable.cpp \
+		glslang/MachineIndependent/Versions.cpp \
+		glslang/MachineIndependent/preprocessor/PpAtom.cpp \
+		glslang/MachineIndependent/preprocessor/PpContext.cpp \
+		glslang/MachineIndependent/preprocessor/Pp.cpp \
+		glslang/MachineIndependent/preprocessor/PpScanner.cpp \
+		glslang/MachineIndependent/preprocessor/PpTokens.cpp
+LOCAL_C_INCLUDES:=$(LOCAL_PATH) \
+	$(LOCAL_PATH)/glslang/MachineIndependent \
+	$(GLSLANG_OUT_PATH)
+LOCAL_STATIC_LIBRARIES:=OSDependent OGLCompiler HLSL
+include $(BUILD_STATIC_LIBRARY)
+
+include $(CLEAR_VARS)
+LOCAL_MODULE:=SPIRV
+LOCAL_CXXFLAGS:=-std=c++11 -fno-exceptions -fno-rtti -Werror $(GLSLANG_DEFINES)
+LOCAL_EXPORT_C_INCLUDES:=$(LOCAL_PATH)
+LOCAL_SRC_FILES:= \
+	SPIRV/GlslangToSpv.cpp \
+	SPIRV/InReadableOrder.cpp \
+	SPIRV/Logger.cpp \
+	SPIRV/SPVRemapper.cpp \
+	SPIRV/SpvBuilder.cpp \
+	SPIRV/SpvPostProcess.cpp \
+	SPIRV/SpvTools.cpp \
+	SPIRV/disassemble.cpp \
+	SPIRV/doc.cpp
+LOCAL_C_INCLUDES:=$(LOCAL_PATH) $(LOCAL_PATH)/glslang/SPIRV
+LOCAL_EXPORT_C_INCLUDES:=$(LOCAL_PATH)/glslang/SPIRV
+LOCAL_STATIC_LIBRARIES:=glslang
+include $(BUILD_STATIC_LIBRARY)
diff --git a/BUILD.gn b/BUILD.gn
index 470d511..5d5b150 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -1,147 +1,153 @@
-# Copyright 2017 The Fuchsia Authors
+# Copyright (C) 2018 Google, Inc.
 #
-# Permission is hereby granted, free of charge, to any person obtaining a
-# copy of this software and associated documentation files (the "Software"),
-# to deal in the Software without restriction, including without limitation
-# the rights to use, copy, modify, merge, publish, distribute, sublicense,
-# and/or sell copies of the Software, and to permit persons to whom the
-# Software is furnished to do so, subject to the following conditions:
+# All rights reserved.
 #
-# The above copyright notice and this permission notice (including the next
-# paragraph) shall be included in all copies or substantial portions of the
-# Software.
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
 #
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
-# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
-# IN THE SOFTWARE.
+#    Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+#
+#    Redistributions in binary form must reproduce the above
+#    copyright notice, this list of conditions and the following
+#    disclaimer in the documentation and/or other materials provided
+#    with the distribution.
+#
+#    Neither the name of Google Inc. nor the names of its
+#    contributors may be used to endorse or promote products derived
+#    from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
 
-static_library("glslang") {
-  cflags_cc = [
-    "-Wno-reorder",
-    "-Wno-inconsistent-missing-override",
-    "-Wno-missing-field-initializers",
-    "-Wno-ignored-qualifiers",
-  ]
+import("//build_overrides/glslang.gni")
+
+spirv_tools_dir = glslang_spirv_tools_dir
+
+config("glslang_public") {
+  include_dirs = [ "." ]
+}
+
+source_set("glslang_sources") {
+  public_configs = [ ":glslang_public" ]
+
   sources = [
+    "OGLCompilersDLL/InitializeDll.cpp",
+    "OGLCompilersDLL/InitializeDll.h",
+    "SPIRV/GLSL.ext.EXT.h",
+    "SPIRV/GLSL.ext.KHR.h",
+    "SPIRV/GLSL.std.450.h",
+    "SPIRV/GlslangToSpv.cpp",
+    "SPIRV/GlslangToSpv.h",
+    "SPIRV/InReadableOrder.cpp",
+    "SPIRV/Logger.cpp",
+    "SPIRV/Logger.h",
+    "SPIRV/SPVRemapper.cpp",
+    "SPIRV/SPVRemapper.h",
+    "SPIRV/SpvBuilder.cpp",
+    "SPIRV/SpvBuilder.h",
+    "SPIRV/SpvPostProcess.cpp",
+    "SPIRV/bitutils.h",
+    "SPIRV/disassemble.cpp",
+    "SPIRV/disassemble.h",
+    "SPIRV/doc.cpp",
+    "SPIRV/doc.h",
+    "SPIRV/hex_float.h",
+    "SPIRV/spirv.hpp",
+    "SPIRV/spvIR.h",
     "glslang/GenericCodeGen/CodeGen.cpp",
     "glslang/GenericCodeGen/Link.cpp",
+    "glslang/Include/BaseTypes.h",
+    "glslang/Include/Common.h",
+    "glslang/Include/ConstantUnion.h",
+    "glslang/Include/InfoSink.h",
+    "glslang/Include/InitializeGlobals.h",
+    "glslang/Include/PoolAlloc.h",
+    "glslang/Include/ResourceLimits.h",
+    "glslang/Include/ShHandle.h",
+    "glslang/Include/Types.h",
+    "glslang/Include/arrays.h",
+    "glslang/Include/intermediate.h",
+    "glslang/Include/revision.h",
     "glslang/MachineIndependent/Constant.cpp",
     "glslang/MachineIndependent/InfoSink.cpp",
     "glslang/MachineIndependent/Initialize.cpp",
+    "glslang/MachineIndependent/Initialize.h",
     "glslang/MachineIndependent/IntermTraverse.cpp",
     "glslang/MachineIndependent/Intermediate.cpp",
+    "glslang/MachineIndependent/LiveTraverser.h",
     "glslang/MachineIndependent/ParseContextBase.cpp",
     "glslang/MachineIndependent/ParseHelper.cpp",
+    "glslang/MachineIndependent/ParseHelper.h",
     "glslang/MachineIndependent/PoolAlloc.cpp",
     "glslang/MachineIndependent/RemoveTree.cpp",
+    "glslang/MachineIndependent/RemoveTree.h",
     "glslang/MachineIndependent/Scan.cpp",
+    "glslang/MachineIndependent/Scan.h",
+    "glslang/MachineIndependent/ScanContext.h",
     "glslang/MachineIndependent/ShaderLang.cpp",
     "glslang/MachineIndependent/SymbolTable.cpp",
+    "glslang/MachineIndependent/SymbolTable.h",
     "glslang/MachineIndependent/Versions.cpp",
+    "glslang/MachineIndependent/Versions.h",
+    "glslang/MachineIndependent/attribute.cpp",
+    "glslang/MachineIndependent/attribute.h",
+    "glslang/MachineIndependent/gl_types.h",
+    "glslang/MachineIndependent/glslang.y",
     "glslang/MachineIndependent/glslang_tab.cpp",
+    "glslang/MachineIndependent/glslang_tab.cpp.h",
     "glslang/MachineIndependent/intermOut.cpp",
     "glslang/MachineIndependent/iomapper.cpp",
+    "glslang/MachineIndependent/iomapper.h",
     "glslang/MachineIndependent/limits.cpp",
     "glslang/MachineIndependent/linkValidate.cpp",
+    "glslang/MachineIndependent/localintermediate.h",
     "glslang/MachineIndependent/parseConst.cpp",
+    "glslang/MachineIndependent/parseVersions.h",
     "glslang/MachineIndependent/preprocessor/Pp.cpp",
     "glslang/MachineIndependent/preprocessor/PpAtom.cpp",
     "glslang/MachineIndependent/preprocessor/PpContext.cpp",
-    "glslang/MachineIndependent/preprocessor/PpMemory.cpp",
+    "glslang/MachineIndependent/preprocessor/PpContext.h",
     "glslang/MachineIndependent/preprocessor/PpScanner.cpp",
-    "glslang/MachineIndependent/preprocessor/PpSymbols.cpp",
     "glslang/MachineIndependent/preprocessor/PpTokens.cpp",
+    "glslang/MachineIndependent/preprocessor/PpTokens.h",
     "glslang/MachineIndependent/propagateNoContraction.cpp",
+    "glslang/MachineIndependent/propagateNoContraction.h",
     "glslang/MachineIndependent/reflection.cpp",
+    "glslang/MachineIndependent/reflection.h",
+    "glslang/OSDependent/osinclude.h",
+    "glslang/Public/ShaderLang.h",
   ]
+
+  defines = []
+  if (is_win) {
+    sources += [ "glslang/OSDependent/Windows/ossource.cpp" ]
+    defines += [ "GLSLANG_OSINCLUDE_WIN32" ]
+  } else {
+    sources += [ "glslang/OSDependent/Unix/ossource.cpp" ]
+    defines += [ "GLSLANG_OSINCLUDE_UNIX" ]
+  }
+
+  if (is_clang) {
+    cflags_cc = [
+      "-Wno-implicit-fallthrough",
+      "-Wno-ignored-qualifiers",
+      "-Wno-unused-variable",
+    ]
+  }
+
   deps = [
-    ":HLSL",
-    ":OGLCompiler",
-    ":OSDependent",
-  ]
-}
-
-static_library("OSDependent") {
-  sources = [
-    "glslang/OSDependent/Unix/ossource.cpp",
-  ]
-}
-
-static_library("OGLCompiler") {
-  sources = [
-    "OGLCompilersDLL/InitializeDll.cpp",
-  ]
-}
-
-static_library("HLSL") {
-  cflags_cc = [
-    "-Wno-reorder",
-    "-Wno-inconsistent-missing-override",
-    "-Wno-missing-field-initializers",
-  ]
-  sources = [
-    "hlsl/hlslAttributes.cpp",
-    "hlsl/hlslGrammar.cpp",
-    "hlsl/hlslOpMap.cpp",
-    "hlsl/hlslParseHelper.cpp",
-    "hlsl/hlslParseables.cpp",
-    "hlsl/hlslScanContext.cpp",
-    "hlsl/hlslTokenStream.cpp",
-  ]
-}
-
-static_library("SPIRV") {
-  cflags_cc = [
-    "-Wno-reorder",
-    "-Wno-missing-field-initializers",
-  ]
-  sources = [
-    "SPIRV/GlslangToSpv.cpp",
-    "SPIRV/InReadableOrder.cpp",
-    "SPIRV/Logger.cpp",
-    "SPIRV/SpvBuilder.cpp",
-    "SPIRV/disassemble.cpp",
-    "SPIRV/doc.cpp",
-  ]
-}
-
-static_library("SPVRemapper") {
-  sources = [
-    "SPIRV/SPVRemapper.cpp",
-  ]
-}
-
-executable("spirv-remap") {
-  sources = [
-    "StandAlone/spirv-remap.cpp",
-  ]
-  deps = [
-    ":SPVRemapper",
-    ":SPIRV",
-    ":glslang"
-  ]
-}
-
-static_library("glslang-default-resource-limits") {
-  include_dirs = [ "." ]
-  sources = [
-    "StandAlone/ResourceLimits.cpp",
-  ]
-}
-
-executable("glslangValidator") {
-  include_dirs = [ "." ]
-  sources = [
-    "StandAlone/StandAlone.cpp",
-  ]
-  deps = [
-    ":SPIRV",
-    ":SPVRemapper",
-    ":glslang",
-    ":glslang-default-resource-limits",
+    "${spirv_tools_dir}:spvtools_opt",
   ]
 }
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 1d98c9f..7dc35b0 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,11 +1,28 @@
 # increase to 3.1 once all major distributions
 # include a version of CMake >= 3.1
 cmake_minimum_required(VERSION 2.8.12)
+if (POLICY CMP0048)
+  cmake_policy(SET CMP0048 NEW)
+endif()
 set_property(GLOBAL PROPERTY USE_FOLDERS ON)
 
 # Adhere to GNU filesystem layout conventions
 include(GNUInstallDirs)
 
+option(BUILD_SHARED_LIBS "Build Shared Libraries" OFF)
+
+set(LIB_TYPE STATIC)
+
+if(BUILD_SHARED_LIBS)
+    set(LIB_TYPE SHARED)
+endif()
+
+option(SKIP_GLSLANG_INSTALL "Skip installation" ${SKIP_GLSLANG_INSTALL})
+if(NOT ${SKIP_GLSLANG_INSTALL})
+  set(ENABLE_GLSLANG_INSTALL ON)
+endif()
+option(ENABLE_SPVREMAPPER "Enables building of SPVRemapper" ON)
+
 option(ENABLE_AMD_EXTENSIONS "Enables support of AMD-specific extensions" ON)
 option(ENABLE_GLSLANG_BINARIES "Builds glslangValidator and spirv-remap" ON)
 
@@ -13,10 +30,36 @@
 
 option(ENABLE_HLSL "Enables HLSL input support" ON)
 
+option(ENABLE_OPT "Enables spirv-opt capability if present" ON)
+
 if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT AND WIN32)
     set(CMAKE_INSTALL_PREFIX "install" CACHE STRING "..." FORCE)
 endif()
 
+option(USE_CCACHE "Use ccache" OFF)
+if(USE_CCACHE)
+    find_program(CCACHE_FOUND ccache)
+    if(CCACHE_FOUND)
+        set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ccache)
+    endif(CCACHE_FOUND)
+endif()
+
+# Precompiled header macro. Parameters are source file list and filename for pch cpp file.
+macro(glslang_pch SRCS PCHCPP)
+  if(MSVC)
+    if (CMAKE_GENERATOR MATCHES "^Visual Studio")
+      set(PCH_NAME "$(IntDir)\\pch.pch")
+    else()
+      set(PCH_NAME "${CMAKE_CURRENT_BINARY_DIR}/pch.pch")
+    endif()
+    # make source files use/depend on PCH_NAME
+    set_source_files_properties(${${SRCS}} PROPERTIES COMPILE_FLAGS "/Yupch.h /FIpch.h /Fp${PCH_NAME} /Zm300" OBJECT_DEPENDS "${PCH_NAME}")
+    # make PCHCPP file compile and generate PCH_NAME
+    set_source_files_properties(${PCHCPP} PROPERTIES COMPILE_FLAGS "/Ycpch.h /Fp${PCH_NAME} /Zm300" OBJECT_OUTPUTS "${PCH_NAME}")
+    list(APPEND ${SRCS} "${PCHCPP}")
+  endif()
+endmacro(glslang_pch)
+
 project(glslang)
 # make testing optional
 include(CTest)
@@ -34,7 +77,7 @@
 endif(ENABLE_HLSL)
 
 if(WIN32)
-    set(CMAKE_DEBUG_POSTFIX "d")
+    set(CMAKE_DEBUG_POSTFIX "d" CACHE STRING "Adds a postfix for debug-built libraries.")
     if(MSVC)
         include(ChooseMSVCCRT.cmake)
     endif(MSVC)
@@ -47,7 +90,7 @@
 
 if(${CMAKE_CXX_COMPILER_ID} MATCHES "GNU")
     add_compile_options(-Wall -Wmaybe-uninitialized -Wuninitialized -Wunused -Wunused-local-typedefs
-                        -Wunused-parameter -Wunused-value  -Wunused-variable -Wunused-but-set-parameter -Wunused-but-set-variable)
+                        -Wunused-parameter -Wunused-value  -Wunused-variable -Wunused-but-set-parameter -Wunused-but-set-variable -fno-exceptions)
     add_compile_options(-Wno-reorder)  # disable this from -Wall, since it happens all over.
 elseif(${CMAKE_CXX_COMPILER_ID} MATCHES "Clang")
     add_compile_options(-Wall -Wuninitialized -Wunused -Wunused-local-typedefs
@@ -78,6 +121,20 @@
 # We depend on these for later projects, so they should come first.
 add_subdirectory(External)
 
+if(NOT TARGET SPIRV-Tools-opt)
+    set(ENABLE_OPT OFF)
+endif()
+
+if(ENABLE_OPT)
+    message(STATUS "optimizer enabled")
+    add_definitions(-DENABLE_OPT=1)
+else()
+    if(ENABLE_HLSL)
+        message(STATUS "spirv-tools not linked - illegal SPIRV may be generated for HLSL")
+    endif()
+    add_definitions(-DENABLE_OPT=0)
+endif()
+
 add_subdirectory(glslang)
 add_subdirectory(OGLCompilersDLL)
 if(ENABLE_GLSLANG_BINARIES)
diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md
new file mode 100644
index 0000000..a11610b
--- /dev/null
+++ b/CODE_OF_CONDUCT.md
@@ -0,0 +1 @@
+A reminder that this issue tracker is managed by the Khronos Group. Interactions here should follow the Khronos Code of Conduct (https://www.khronos.org/developers/code-of-conduct), which prohibits aggressive or derogatory language. Please keep the discussion friendly and civil.
diff --git a/External/CMakeLists.txt b/External/CMakeLists.txt
index 4f694ee..4d96901 100644
--- a/External/CMakeLists.txt
+++ b/External/CMakeLists.txt
@@ -33,3 +33,11 @@
             "Google Mock was not found - tests based on that will not build")
     endif()
 endif()
+
+if(ENABLE_OPT AND NOT TARGET SPIRV-Tools-opt)
+    if(IS_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/spirv-tools)
+        set(SPIRV_SKIP_TESTS ON CACHE BOOL "Skip building SPIRV-Tools tests")
+        add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/spirv-tools spirv-tools)
+    endif()
+endif()
+
diff --git a/OGLCompilersDLL/CMakeLists.txt b/OGLCompilersDLL/CMakeLists.txt
index 8edd143..5bb3f0e 100644
--- a/OGLCompilersDLL/CMakeLists.txt
+++ b/OGLCompilersDLL/CMakeLists.txt
@@ -1,11 +1,14 @@
 set(SOURCES InitializeDll.cpp InitializeDll.h)
 
 add_library(OGLCompiler STATIC ${SOURCES})
-set_property(TARGET OGLCompiler PROPERTY FOLDER glslang POSITION_INDEPENDENT_CODE ON)
+set_property(TARGET OGLCompiler PROPERTY FOLDER glslang)
+set_property(TARGET OGLCompiler PROPERTY POSITION_INDEPENDENT_CODE ON)
 
 if(WIN32)
     source_group("Source" FILES ${SOURCES})
 endif(WIN32)
 
-install(TARGETS OGLCompiler
-        ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
+if(ENABLE_GLSLANG_INSTALL)
+    install(TARGETS OGLCompiler
+            ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
+endif(ENABLE_GLSLANG_INSTALL)
diff --git a/OGLCompilersDLL/InitializeDll.cpp b/OGLCompilersDLL/InitializeDll.cpp
index 2eb912c..abea910 100644
--- a/OGLCompilersDLL/InitializeDll.cpp
+++ b/OGLCompilersDLL/InitializeDll.cpp
@@ -38,13 +38,17 @@
 
 #include "InitializeDll.h"
 #include "../glslang/Include/InitializeGlobals.h"
-
 #include "../glslang/Public/ShaderLang.h"
+#include "../glslang/Include/PoolAlloc.h"
 
 namespace glslang {
 
 OS_TLSIndex ThreadInitializeIndex = OS_INVALID_TLS_INDEX;
 
+// Per-process initialization.
+// Needs to be called at least once before parsing, etc. is done.
+// Will also do thread initialization for the calling thread; other
+// threads will need to do that explicitly.
 bool InitProcess()
 {
     glslang::GetGlobalLock();
@@ -85,7 +89,9 @@
     return true;
 }
 
-
+// Per-thread scoped initialization.
+// Must be called at least once by each new thread sharing the
+// symbol tables, etc., needed to parse.
 bool InitThread()
 {
     //
@@ -99,17 +105,21 @@
     if (OS_GetTLSValue(ThreadInitializeIndex) != 0)
         return true;
 
-    InitializeMemoryPools();
-
     if (! OS_SetTLSValue(ThreadInitializeIndex, (void *)1)) {
         assert(0 && "InitThread(): Unable to set init flag.");
         return false;
     }
 
+    glslang::SetThreadPoolAllocator(nullptr);
+
     return true;
 }
 
-
+// Not necessary to call this: InitThread() is reentrant, and the need
+// to do per thread tear down has been removed.
+//
+// This is kept, with memory management removed, to satisfy any exiting
+// calls to it that rely on it.
 bool DetachThread()
 {
     bool success = true;
@@ -125,14 +135,18 @@
             assert(0 && "DetachThread(): Unable to clear init flag.");
             success = false;
         }
-
-        FreeGlobalPools();
-
     }
 
     return success;
 }
 
+// Not necessary to call this: InitProcess() is reentrant.
+//
+// This is kept, with memory management removed, to satisfy any exiting
+// calls to it that rely on it.
+//
+// Users of glslang should call shFinalize() or glslang::FinalizeProcess() for
+// process-scoped memory tear down.
 bool DetachProcess()
 {
     bool success = true;
@@ -140,12 +154,8 @@
     if (ThreadInitializeIndex == OS_INVALID_TLS_INDEX)
         return true;
 
-    ShFinalize();
-
     success = DetachThread();
 
-    FreePoolIndex();
-
     OS_FreeTLSIndex(ThreadInitializeIndex);
     ThreadInitializeIndex = OS_INVALID_TLS_INDEX;
 
diff --git a/OGLCompilersDLL/InitializeDll.h b/OGLCompilersDLL/InitializeDll.h
index 60b2b15..661cee4 100644
--- a/OGLCompilersDLL/InitializeDll.h
+++ b/OGLCompilersDLL/InitializeDll.h
@@ -40,8 +40,8 @@
 
 bool InitProcess();
 bool InitThread();
-bool DetachThread();
-bool DetachProcess();
+bool DetachThread();  // not called from standalone, perhaps other tools rely on parts of it
+bool DetachProcess(); // not called from standalone, perhaps other tools rely on parts of it
 
 } // end namespace glslang
 
diff --git a/README.md b/README.md
old mode 100644
new mode 100755
index 193e38d..ba7160d
--- a/README.md
+++ b/README.md
@@ -49,21 +49,31 @@
 Building
 --------
 
+Instead of building manually, you can also download the binaries for your
+platform directly from the [master-tot release][master-tot-release] on GitHub.
+Those binaries are automatically uploaded by the buildbots after successful
+testing and they always reflect the current top of the tree of the master
+branch.
+
 ### Dependencies
 
+* A C++11 compiler.
+  (For MSVS: 2015 is recommended, 2013 is fully supported/tested, and 2010 support is attempted, but not tested.)
 * [CMake][cmake]: for generating compilation targets.
+* make: _Linux_, ninja is an alternative, if configured.
+* [Python 2.7][python]: for executing SPIRV-Tools scripts. (Optional if not using SPIRV-Tools.)
 * [bison][bison]: _optional_, but needed when changing the grammar (glslang.y).
 * [googletest][googletest]: _optional_, but should use if making any changes to glslang.
 
 ### Build steps
 
+The following steps assume a Bash shell. On Windows, that could be the Git Bash
+shell or some other shell of your choosing.
+
 #### 1) Check-Out this project 
 
 ```bash
 cd <parent of where you want glslang to be>
-# If using SSH
-git clone git@github.com:KhronosGroup/glslang.git
-# Or if using HTTPS
 git clone https://github.com/KhronosGroup/glslang.git
 ```
 
@@ -74,24 +84,44 @@
 git clone https://github.com/google/googletest.git External/googletest
 ```
 
-#### 3) Configure
-
-Assume the source directory is `$SOURCE_DIR` and
-the build directory is `$BUILD_DIR`:
-
-For building on Linux (assuming using the Ninja generator):
+If you want to use googletest with Visual Studio 2013, you also need to check out an older version:
 
 ```bash
-cd $BUILD_DIR
+# to use googletest with Visual Studio 2013
+cd External/googletest
+git checkout 440527a61e1c91188195f7de212c63c77e8f0a45
+cd ../..
+```
 
-cmake -GNinja -DCMAKE_BUILD_TYPE={Debug|Release|RelWithDebInfo} \
-      -DCMAKE_INSTALL_PREFIX=`pwd`/install $SOURCE_DIR
+If you wish to assure that SPIR-V generated from HLSL is legal for Vulkan,
+or wish to invoke -Os to reduce SPIR-V size from HLSL or GLSL, install
+spirv-tools with this:
+
+```bash
+./update_glslang_sources.py
+```
+
+#### 3) Configure
+
+Assume the source directory is `$SOURCE_DIR` and the build directory is
+`$BUILD_DIR`. First ensure the build directory exists, then navigate to it:
+
+```bash
+mkdir -p $BUILD_DIR
+cd $BUILD_DIR
+```
+
+For building on Linux:
+
+```bash
+cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX="$(pwd)/install" $SOURCE_DIR
+# "Release" (for CMAKE_BUILD_TYPE) could also be "Debug" or "RelWithDebInfo"
 ```
 
 For building on Windows:
 
 ```bash
-cmake $SOURCE_DIR -DCMAKE_INSTALL_PREFIX=`pwd`/install
+cmake $SOURCE_DIR -DCMAKE_INSTALL_PREFIX="$(pwd)/install"
 # The CMAKE_INSTALL_PREFIX part is for testing (explained later).
 ```
 
@@ -101,11 +131,11 @@
 
 ```bash
 # for Linux:
-ninja install
+make -j4 install
 
 # for Windows:
-cmake --build . --config {Release|Debug|MinSizeRel|RelWithDebInfo} \
-      --target install
+cmake --build . --config Release --target install
+# "Release" (for --config) could also be "Debug", "MinSizeRel", or "RelWithDebInfo"
 ```
 
 If using MSVC, after running CMake to configure, use the
@@ -220,8 +250,11 @@
 void FinalizeProcess();
 
 class TShader
+    setStrings(...);
+    setEnvInput(EShSourceHlsl or EShSourceGlsl, stage,  EShClientVulkan or EShClientOpenGL, 100);
+    setEnvClient(EShClientVulkan or EShClientOpenGL, EShTargetVulkan_1_0 or EShTargetVulkan_1_1 or EShTargetOpenGL_450);
+    setEnvTarget(EShTargetSpv, EShTargetSpv_1_0 or EShTargetSpv_1_3);
     bool parse(...);
-    void setStrings(...);
     const char* getInfoLog();
 
 class TProgram
@@ -301,6 +334,8 @@
 
 
 [cmake]: https://cmake.org/
+[python]: https://www.python.org/
 [bison]: https://www.gnu.org/software/bison/
 [googletest]: https://github.com/google/googletest
 [bison-gnu-win32]: http://gnuwin32.sourceforge.net/packages/bison.htm
+[master-tot-release]: https://github.com/KhronosGroup/glslang/releases/tag/master-tot
diff --git a/SPIRV/CMakeLists.txt b/SPIRV/CMakeLists.txt
old mode 100755
new mode 100644
index 2ad86d6..1997e74
--- a/SPIRV/CMakeLists.txt
+++ b/SPIRV/CMakeLists.txt
@@ -3,7 +3,9 @@
     InReadableOrder.cpp
     Logger.cpp
     SpvBuilder.cpp
+    SpvPostProcess.cpp
     doc.cpp
+    SpvTools.cpp
     disassemble.cpp)
 
 set(SPVREMAP_SOURCES
@@ -14,6 +16,7 @@
     bitutils.h
     spirv.hpp
     GLSL.std.450.h
+    GLSL.ext.EXT.h
     GLSL.ext.KHR.h
     GlslangToSpv.h
     hex_float.h
@@ -21,6 +24,7 @@
     SpvBuilder.h
     spvIR.h
     doc.h
+    SpvTools.h
     disassemble.h)
 
 set(SPVREMAP_HEADERS
@@ -39,19 +43,58 @@
          GLSL.ext.NV.h)
 endif(ENABLE_NV_EXTENSIONS)
 
-add_library(SPIRV STATIC ${SOURCES} ${HEADERS})
-set_property(TARGET SPIRV PROPERTY FOLDER glslang POSITION_INDEPENDENT_CODE ON)
-target_link_libraries(SPIRV glslang)
+add_library(SPIRV ${LIB_TYPE} ${SOURCES} ${HEADERS})
+set_property(TARGET SPIRV PROPERTY FOLDER glslang)
+set_property(TARGET SPIRV PROPERTY POSITION_INDEPENDENT_CODE ON)
+target_include_directories(SPIRV PUBLIC ..)
 
-add_library(SPVRemapper STATIC ${SPVREMAP_SOURCES} ${SPVREMAP_HEADERS})
-set_property(TARGET SPVRemapper PROPERTY FOLDER glslang POSITION_INDEPENDENT_CODE ON)
+if (ENABLE_SPVREMAPPER)
+    add_library(SPVRemapper ${LIB_TYPE} ${SPVREMAP_SOURCES} ${SPVREMAP_HEADERS})
+    set_property(TARGET SPVRemapper PROPERTY FOLDER glslang)
+    set_property(TARGET SPVRemapper PROPERTY POSITION_INDEPENDENT_CODE ON)
+endif()
+
+if(WIN32 AND BUILD_SHARED_LIBS)
+    set_target_properties(SPIRV PROPERTIES PREFIX "")
+    if (ENABLE_SPVREMAPPER)
+        set_target_properties(SPVRemapper PROPERTIES PREFIX "")
+    endif()
+endif()
+
+if(ENABLE_OPT)
+    target_include_directories(SPIRV
+        PRIVATE ${spirv-tools_SOURCE_DIR}/include
+        PRIVATE ${spirv-tools_SOURCE_DIR}/source
+    )
+    target_link_libraries(SPIRV glslang SPIRV-Tools-opt)
+    target_include_directories(SPIRV PUBLIC ../External)
+else()
+    target_link_libraries(SPIRV glslang)
+endif(ENABLE_OPT)
 
 if(WIN32)
     source_group("Source" FILES ${SOURCES} ${HEADERS})
     source_group("Source" FILES ${SPVREMAP_SOURCES} ${SPVREMAP_HEADERS})
 endif(WIN32)
 
-install(TARGETS SPIRV SPVRemapper
-        ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
+if(ENABLE_GLSLANG_INSTALL)
+    if(BUILD_SHARED_LIBS)
+        if (ENABLE_SPVREMAPPER)
+            install(TARGETS SPVRemapper
+                    ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
+                    LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR})
+        endif()
+        install(TARGETS SPIRV
+                ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
+                LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR})
+    else()
+        if (ENABLE_SPVREMAPPER)
+            install(TARGETS SPVRemapper
+                    ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
+        endif()
+        install(TARGETS SPIRV
+                ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
+    endif()
 
-install(FILES ${HEADERS} ${SPVREMAP_HEADERS} DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/SPIRV/)
+    install(FILES ${HEADERS} ${SPVREMAP_HEADERS} DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/SPIRV/)
+endif(ENABLE_GLSLANG_INSTALL)
diff --git a/SPIRV/GLSL.ext.AMD.h b/SPIRV/GLSL.ext.AMD.h
index d2098cc..009d2f1 100644
--- a/SPIRV/GLSL.ext.AMD.h
+++ b/SPIRV/GLSL.ext.AMD.h
@@ -27,25 +27,12 @@
 #ifndef GLSLextAMD_H
 #define GLSLextAMD_H
 
-enum BuiltIn;
-enum Decoration;
-enum Op;
-
 static const int GLSLextAMDVersion = 100;
-static const int GLSLextAMDRevision = 2;
+static const int GLSLextAMDRevision = 7;
 
 // SPV_AMD_shader_ballot
 static const char* const E_SPV_AMD_shader_ballot = "SPV_AMD_shader_ballot";
 
-static const Op OpGroupIAddNonUniformAMD = static_cast<Op>(5000);
-static const Op OpGroupFAddNonUniformAMD = static_cast<Op>(5001);
-static const Op OpGroupFMinNonUniformAMD = static_cast<Op>(5002);
-static const Op OpGroupUMinNonUniformAMD = static_cast<Op>(5003);
-static const Op OpGroupSMinNonUniformAMD = static_cast<Op>(5004);
-static const Op OpGroupFMaxNonUniformAMD = static_cast<Op>(5005);
-static const Op OpGroupUMaxNonUniformAMD = static_cast<Op>(5006);
-static const Op OpGroupSMaxNonUniformAMD = static_cast<Op>(5007);
-
 enum ShaderBallotAMD {
     ShaderBallotBadAMD = 0, // Don't use
 
@@ -79,16 +66,6 @@
 // SPV_AMD_shader_explicit_vertex_parameter
 static const char* const E_SPV_AMD_shader_explicit_vertex_parameter = "SPV_AMD_shader_explicit_vertex_parameter";
 
-static const BuiltIn BuiltInBaryCoordNoPerspAMD           = static_cast<BuiltIn>(4992);
-static const BuiltIn BuiltInBaryCoordNoPerspCentroidAMD   = static_cast<BuiltIn>(4993);
-static const BuiltIn BuiltInBaryCoordNoPerspSampleAMD     = static_cast<BuiltIn>(4994);
-static const BuiltIn BuiltInBaryCoordSmoothAMD            = static_cast<BuiltIn>(4995);
-static const BuiltIn BuiltInBaryCoordSmoothCentroidAMD    = static_cast<BuiltIn>(4996);
-static const BuiltIn BuiltInBaryCoordSmoothSampleAMD      = static_cast<BuiltIn>(4997);
-static const BuiltIn BuiltInBaryCoordPullModelAMD         = static_cast<BuiltIn>(4998);
-
-static const Decoration DecorationExplicitInterpAMD       = static_cast<Decoration>(4999);
-
 enum ShaderExplicitVertexParameterAMD {
     ShaderExplicitVertexParameterBadAMD = 0, // Don't use
 
@@ -113,4 +90,19 @@
 // SPV_AMD_gpu_shader_half_float
 static const char* const E_SPV_AMD_gpu_shader_half_float = "SPV_AMD_gpu_shader_half_float";
 
+// SPV_AMD_texture_gather_bias_lod
+static const char* const E_SPV_AMD_texture_gather_bias_lod = "SPV_AMD_texture_gather_bias_lod";
+
+// SPV_AMD_gpu_shader_int16
+static const char* const E_SPV_AMD_gpu_shader_int16 = "SPV_AMD_gpu_shader_int16";
+
+// SPV_AMD_shader_image_load_store_lod
+static const char* const E_SPV_AMD_shader_image_load_store_lod = "SPV_AMD_shader_image_load_store_lod";
+
+// SPV_AMD_shader_fragment_mask
+static const char* const E_SPV_AMD_shader_fragment_mask = "SPV_AMD_shader_fragment_mask";
+
+// SPV_AMD_gpu_shader_half_float_fetch
+static const char* const E_SPV_AMD_gpu_shader_half_float_fetch = "SPV_AMD_gpu_shader_half_float_fetch";
+
 #endif  // #ifndef GLSLextAMD_H
diff --git a/SPIRV/GLSL.ext.EXT.h b/SPIRV/GLSL.ext.EXT.h
new file mode 100644
index 0000000..e29c055
--- /dev/null
+++ b/SPIRV/GLSL.ext.EXT.h
@@ -0,0 +1,38 @@
+/*
+** Copyright (c) 2014-2016 The Khronos Group Inc.
+**
+** Permission is hereby granted, free of charge, to any person obtaining a copy
+** of this software and/or associated documentation files (the "Materials"),
+** to deal in the Materials without restriction, including without limitation
+** the rights to use, copy, modify, merge, publish, distribute, sublicense,
+** and/or sell copies of the Materials, and to permit persons to whom the
+** Materials are furnished to do so, subject to the following conditions:
+**
+** The above copyright notice and this permission notice shall be included in
+** all copies or substantial portions of the Materials.
+**
+** MODIFICATIONS TO THIS FILE MAY MEAN IT NO LONGER ACCURATELY REFLECTS KHRONOS
+** STANDARDS. THE UNMODIFIED, NORMATIVE VERSIONS OF KHRONOS SPECIFICATIONS AND
+** HEADER INFORMATION ARE LOCATED AT https://www.khronos.org/registry/
+**
+** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+** OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+** FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+** THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+** LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+** FROM,OUT OF OR IN CONNECTION WITH THE MATERIALS OR THE USE OR OTHER DEALINGS
+** IN THE MATERIALS.
+*/
+
+#ifndef GLSLextEXT_H
+#define GLSLextEXT_H
+
+static const int GLSLextEXTVersion = 100;
+static const int GLSLextEXTRevision = 2;
+
+static const char* const E_SPV_EXT_shader_stencil_export        = "SPV_EXT_shader_stencil_export";
+static const char* const E_SPV_EXT_shader_viewport_index_layer  = "SPV_EXT_shader_viewport_index_layer";
+static const char* const E_SPV_EXT_fragment_fully_covered = "SPV_EXT_fragment_fully_covered";
+static const char* const E_SPV_EXT_fragment_invocation_density = "SPV_EXT_fragment_invocation_density";
+
+#endif  // #ifndef GLSLextEXT_H
diff --git a/SPIRV/GLSL.ext.KHR.h b/SPIRV/GLSL.ext.KHR.h
index c9e31a6..16b0d9c 100644
--- a/SPIRV/GLSL.ext.KHR.h
+++ b/SPIRV/GLSL.ext.KHR.h
@@ -27,12 +27,8 @@
 #ifndef GLSLextKHR_H
 #define GLSLextKHR_H
 
-enum BuiltIn;
-enum Op;
-enum Capability;
-
 static const int GLSLextKHRVersion = 100;
-static const int GLSLextKHRRevision = 1;
+static const int GLSLextKHRRevision = 2;
 
 static const char* const E_SPV_KHR_shader_ballot                = "SPV_KHR_shader_ballot";
 static const char* const E_SPV_KHR_subgroup_vote                = "SPV_KHR_subgroup_vote";
@@ -40,6 +36,9 @@
 static const char* const E_SPV_KHR_multiview                    = "SPV_KHR_multiview";
 static const char* const E_SPV_KHR_shader_draw_parameters       = "SPV_KHR_shader_draw_parameters";
 static const char* const E_SPV_KHR_16bit_storage                = "SPV_KHR_16bit_storage";
+static const char* const E_SPV_KHR_8bit_storage                 = "SPV_KHR_8bit_storage";
 static const char* const E_SPV_KHR_storage_buffer_storage_class = "SPV_KHR_storage_buffer_storage_class";
+static const char* const E_SPV_KHR_post_depth_coverage          = "SPV_KHR_post_depth_coverage";
+static const char* const E_SPV_KHR_vulkan_memory_model          = "SPV_KHR_vulkan_memory_model";
 
 #endif  // #ifndef GLSLextKHR_H
diff --git a/SPIRV/GLSL.ext.NV.h b/SPIRV/GLSL.ext.NV.h
index c01858b..102d645 100644
--- a/SPIRV/GLSL.ext.NV.h
+++ b/SPIRV/GLSL.ext.NV.h
@@ -33,7 +33,7 @@
 enum Capability;
 
 static const int GLSLextNVVersion = 100;
-static const int GLSLextNVRevision = 5;
+static const int GLSLextNVRevision = 11;
 
 //SPV_NV_sample_mask_override_coverage
 const char* const E_SPV_NV_sample_mask_override_coverage = "SPV_NV_sample_mask_override_coverage";
@@ -51,4 +51,25 @@
 //SPV_NVX_multiview_per_view_attributes
 const char* const E_SPV_NVX_multiview_per_view_attributes = "SPV_NVX_multiview_per_view_attributes";
 
-#endif  // #ifndef GLSLextNV_H
\ No newline at end of file
+//SPV_NV_shader_subgroup_partitioned
+const char* const E_SPV_NV_shader_subgroup_partitioned = "SPV_NV_shader_subgroup_partitioned";
+
+//SPV_NV_fragment_shader_barycentric
+const char* const E_SPV_NV_fragment_shader_barycentric = "SPV_NV_fragment_shader_barycentric";
+
+//SPV_NV_compute_shader_derivatives
+const char* const E_SPV_NV_compute_shader_derivatives = "SPV_NV_compute_shader_derivatives";
+
+//SPV_NV_shader_image_footprint
+const char* const E_SPV_NV_shader_image_footprint = "SPV_NV_shader_image_footprint";
+
+//SPV_NV_mesh_shader
+const char* const E_SPV_NV_mesh_shader = "SPV_NV_mesh_shader";
+
+//SPV_NV_raytracing
+const char* const E_SPV_NV_ray_tracing = "SPV_NV_ray_tracing";
+
+//SPV_NV_shading_rate
+const char* const E_SPV_NV_shading_rate = "SPV_NV_shading_rate";
+
+#endif  // #ifndef GLSLextNV_H
diff --git a/SPIRV/GLSL.std.450.h b/SPIRV/GLSL.std.450.h
old mode 100755
new mode 100644
diff --git a/SPIRV/GlslangToSpv.cpp b/SPIRV/GlslangToSpv.cpp
index 95ad7f9..4c1dbd4 100755
--- a/SPIRV/GlslangToSpv.cpp
+++ b/SPIRV/GlslangToSpv.cpp
@@ -1,6 +1,7 @@
 //
 // Copyright (C) 2014-2016 LunarG, Inc.
 // Copyright (C) 2015-2016 Google, Inc.
+// Copyright (C) 2017 ARM Limited.
 //
 // All rights reserved.
 //
@@ -44,6 +45,7 @@
 namespace spv {
     #include "GLSL.std.450.h"
     #include "GLSL.ext.KHR.h"
+    #include "GLSL.ext.EXT.h"
 #ifdef AMD_EXTENSIONS
     #include "GLSL.ext.AMD.h"
 #endif
@@ -68,11 +70,6 @@
 
 namespace {
 
-// For low-order part of the generator's magic number. Bump up
-// when there is a change in the style (e.g., if SSA form changes,
-// or a different instruction sequence to do something gets used).
-const int GeneratorVersion = 1;
-
 namespace {
 class SpecConstantOpModeGuard {
 public:
@@ -92,7 +89,14 @@
     spv::Builder* builder_;
     bool previous_flag_;
 };
-}
+
+struct OpDecorations {
+    spv::Decoration precision;
+    spv::Decoration noContraction;
+    spv::Decoration nonUniform;
+};
+
+} // namespace
 
 //
 // The main holder of information for translating glslang to SPIR-V.
@@ -101,7 +105,8 @@
 //
 class TGlslangToSpvTraverser : public glslang::TIntermTraverser {
 public:
-    TGlslangToSpvTraverser(const glslang::TIntermediate*, spv::SpvBuildLogger* logger);
+    TGlslangToSpvTraverser(unsigned int spvVersion, const glslang::TIntermediate*, spv::SpvBuildLogger* logger,
+        glslang::SpvOptions& options);
     virtual ~TGlslangToSpvTraverser() { }
 
     bool visitAggregate(glslang::TVisit, glslang::TIntermAggregate*);
@@ -118,19 +123,31 @@
     void dumpSpv(std::vector<unsigned int>& out);
 
 protected:
+    TGlslangToSpvTraverser(TGlslangToSpvTraverser&);
+    TGlslangToSpvTraverser& operator=(TGlslangToSpvTraverser&);
+
     spv::Decoration TranslateInterpolationDecoration(const glslang::TQualifier& qualifier);
     spv::Decoration TranslateAuxiliaryStorageDecoration(const glslang::TQualifier& qualifier);
+    spv::Decoration TranslateNonUniformDecoration(const glslang::TQualifier& qualifier);
+    spv::Builder::AccessChain::CoherentFlags TranslateCoherent(const glslang::TType& type);
+    spv::MemoryAccessMask TranslateMemoryAccess(const spv::Builder::AccessChain::CoherentFlags &coherentFlags);
+    spv::ImageOperandsMask TranslateImageOperands(const spv::Builder::AccessChain::CoherentFlags &coherentFlags);
+    spv::Scope TranslateMemoryScope(const spv::Builder::AccessChain::CoherentFlags &coherentFlags);
     spv::BuiltIn TranslateBuiltInDecoration(glslang::TBuiltInVariable, bool memberDeclaration);
     spv::ImageFormat TranslateImageFormat(const glslang::TType& type);
-    spv::LoopControlMask TranslateLoopControl(glslang::TLoopControl) const;
+    spv::SelectionControlMask TranslateSelectionControl(const glslang::TIntermSelection&) const;
+    spv::SelectionControlMask TranslateSwitchControl(const glslang::TIntermSwitch&) const;
+    spv::LoopControlMask TranslateLoopControl(const glslang::TIntermLoop&, unsigned int& dependencyLength) const;
     spv::StorageClass TranslateStorageClass(const glslang::TType&);
+    void addIndirectionIndexCapabilities(const glslang::TType& baseType, const glslang::TType& indexType);
     spv::Id createSpvVariable(const glslang::TIntermSymbol*);
     spv::Id getSampledType(const glslang::TSampler&);
     spv::Id getInvertedSwizzleType(const glslang::TIntermTyped&);
     spv::Id createInvertedSwizzle(spv::Decoration precision, const glslang::TIntermTyped&, spv::Id parentResult);
     void convertSwizzle(const glslang::TIntermAggregate&, std::vector<unsigned>& swizzle);
     spv::Id convertGlslangToSpvType(const glslang::TType& type);
-    spv::Id convertGlslangToSpvType(const glslang::TType& type, glslang::TLayoutPacking, const glslang::TQualifier&);
+    spv::Id convertGlslangToSpvType(const glslang::TType& type, glslang::TLayoutPacking, const glslang::TQualifier&,
+        bool lastBufferBlockMember);
     bool filterMember(const glslang::TType& member);
     spv::Id convertGlslangStructToSpvType(const glslang::TType&, const glslang::TTypeList* glslangStruct,
                                           glslang::TLayoutPacking, const glslang::TQualifier&);
@@ -143,10 +160,13 @@
     glslang::TLayoutPacking getExplicitLayout(const glslang::TType& type) const;
     int getArrayStride(const glslang::TType& arrayType, glslang::TLayoutPacking, glslang::TLayoutMatrix);
     int getMatrixStride(const glslang::TType& matrixType, glslang::TLayoutPacking, glslang::TLayoutMatrix);
-    void updateMemberOffset(const glslang::TType& structType, const glslang::TType& memberType, int& currentOffset, int& nextOffset, glslang::TLayoutPacking, glslang::TLayoutMatrix);
+    void updateMemberOffset(const glslang::TType& structType, const glslang::TType& memberType, int& currentOffset,
+                            int& nextOffset, glslang::TLayoutPacking, glslang::TLayoutMatrix);
     void declareUseOfStructMember(const glslang::TTypeList& members, int glslangMember);
 
     bool isShaderEntryPoint(const glslang::TIntermAggregate* node);
+    bool writableParam(glslang::TStorageQualifier) const;
+    bool originalParam(glslang::TStorageQualifier, const glslang::TType&, bool implicitThisParam);
     void makeFunctions(const glslang::TIntermSequence&);
     void makeGlobalInitializers(const glslang::TIntermSequence&);
     void visitFunctions(const glslang::TIntermSequence&);
@@ -156,29 +176,42 @@
     spv::Id createImageTextureFunctionCall(glslang::TIntermOperator* node);
     spv::Id handleUserFunctionCall(const glslang::TIntermAggregate*);
 
-    spv::Id createBinaryOperation(glslang::TOperator op, spv::Decoration precision, spv::Decoration noContraction, spv::Id typeId, spv::Id left, spv::Id right, glslang::TBasicType typeProxy, bool reduceComparison = true);
-    spv::Id createBinaryMatrixOperation(spv::Op, spv::Decoration precision, spv::Decoration noContraction, spv::Id typeId, spv::Id left, spv::Id right);
-    spv::Id createUnaryOperation(glslang::TOperator op, spv::Decoration precision, spv::Decoration noContraction, spv::Id typeId, spv::Id operand,glslang::TBasicType typeProxy);
-    spv::Id createUnaryMatrixOperation(spv::Op op, spv::Decoration precision, spv::Decoration noContraction, spv::Id typeId, spv::Id operand,glslang::TBasicType typeProxy);
-    spv::Id createConversion(glslang::TOperator op, spv::Decoration precision, spv::Decoration noContraction, spv::Id destTypeId, spv::Id operand, glslang::TBasicType typeProxy);
+    spv::Id createBinaryOperation(glslang::TOperator op, OpDecorations&, spv::Id typeId, spv::Id left, spv::Id right,
+                                  glslang::TBasicType typeProxy, bool reduceComparison = true);
+    spv::Id createBinaryMatrixOperation(spv::Op, OpDecorations&, spv::Id typeId, spv::Id left, spv::Id right);
+    spv::Id createUnaryOperation(glslang::TOperator op, OpDecorations&, spv::Id typeId, spv::Id operand,
+                                 glslang::TBasicType typeProxy);
+    spv::Id createUnaryMatrixOperation(spv::Op op, OpDecorations&, spv::Id typeId, spv::Id operand,
+                                       glslang::TBasicType typeProxy);
+    spv::Id createConversion(glslang::TOperator op, OpDecorations&, spv::Id destTypeId, spv::Id operand,
+                             glslang::TBasicType typeProxy);
+    spv::Id createIntWidthConversion(glslang::TOperator op, spv::Id operand, int vectorSize);
     spv::Id makeSmearedConstant(spv::Id constant, int vectorSize);
     spv::Id createAtomicOperation(glslang::TOperator op, spv::Decoration precision, spv::Id typeId, std::vector<spv::Id>& operands, glslang::TBasicType typeProxy);
     spv::Id createInvocationsOperation(glslang::TOperator op, spv::Id typeId, std::vector<spv::Id>& operands, glslang::TBasicType typeProxy);
     spv::Id CreateInvocationsVectorOperation(spv::Op op, spv::GroupOperation groupOperation, spv::Id typeId, std::vector<spv::Id>& operands);
+    spv::Id createSubgroupOperation(glslang::TOperator op, spv::Id typeId, std::vector<spv::Id>& operands, glslang::TBasicType typeProxy);
     spv::Id createMiscOperation(glslang::TOperator op, spv::Decoration precision, spv::Id typeId, std::vector<spv::Id>& operands, glslang::TBasicType typeProxy);
     spv::Id createNoArgOperation(glslang::TOperator op, spv::Decoration precision, spv::Id typeId);
     spv::Id getSymbolId(const glslang::TIntermSymbol* node);
-    void addDecoration(spv::Id id, spv::Decoration dec);
-    void addDecoration(spv::Id id, spv::Decoration dec, unsigned value);
-    void addMemberDecoration(spv::Id id, int member, spv::Decoration dec);
-    void addMemberDecoration(spv::Id id, int member, spv::Decoration dec, unsigned value);
+#ifdef NV_EXTENSIONS
+    void addMeshNVDecoration(spv::Id id, int member, const glslang::TQualifier & qualifier);
+#endif
     spv::Id createSpvConstant(const glslang::TIntermTyped&);
     spv::Id createSpvConstantFromConstUnionArray(const glslang::TType& type, const glslang::TConstUnionArray&, int& nextConst, bool specConstant);
     bool isTrivialLeaf(const glslang::TIntermTyped* node);
     bool isTrivial(const glslang::TIntermTyped* node);
     spv::Id createShortCircuit(glslang::TOperator, glslang::TIntermTyped& left, glslang::TIntermTyped& right);
+#ifdef AMD_EXTENSIONS
     spv::Id getExtBuiltins(const char* name);
+#endif
+    void addPre13Extension(const char* ext)
+    {
+        if (builder.getSpvVersion() < glslang::EShTargetSpv_1_3)
+            builder.addExtension(ext);
+    }
 
+    glslang::SpvOptions& options;
     spv::Function* shaderEntry;
     spv::Function* currentFunction;
     spv::Instruction* entryPoint;
@@ -200,8 +233,10 @@
     std::unordered_set<int> rValueParameters;  // set of formal function parameters passed as rValues, rather than a pointer
     std::unordered_map<std::string, spv::Function*> functionMap;
     std::unordered_map<const glslang::TTypeList*, spv::Id> structMap[glslang::ElpCount][glslang::ElmCount];
-    std::unordered_map<const glslang::TTypeList*, std::vector<int> > memberRemapper;  // for mapping glslang block indices to spv indices (e.g., due to hidden members)
+    // for mapping glslang block indices to spv indices (e.g., due to hidden members):
+    std::unordered_map<const glslang::TTypeList*, std::vector<int> > memberRemapper;
     std::stack<bool> breakForLoop;  // false means break for switch
+    std::unordered_map<std::string, const glslang::TIntermSymbol*> counterOriginator;
 };
 
 //
@@ -240,6 +275,16 @@
     case EShLangGeometry:         return spv::ExecutionModelGeometry;
     case EShLangFragment:         return spv::ExecutionModelFragment;
     case EShLangCompute:          return spv::ExecutionModelGLCompute;
+#ifdef NV_EXTENSIONS
+    case EShLangRayGenNV:         return spv::ExecutionModelRayGenerationNV;
+    case EShLangIntersectNV:      return spv::ExecutionModelIntersectionNV;
+    case EShLangAnyHitNV:         return spv::ExecutionModelAnyHitNV;
+    case EShLangClosestHitNV:     return spv::ExecutionModelClosestHitNV;
+    case EShLangMissNV:           return spv::ExecutionModelMissNV;
+    case EShLangCallableNV:       return spv::ExecutionModelCallableNV;
+    case EShLangTaskNV:           return spv::ExecutionModelTaskNV;
+    case EShLangMeshNV:           return spv::ExecutionModelMeshNV;
+#endif
     default:
         assert(0);
         return spv::ExecutionModelFragment;
@@ -289,6 +334,13 @@
         case glslang::EvqBuffer:       return useStorageBuffer ? spv::DecorationBlock : spv::DecorationBufferBlock;
         case glslang::EvqVaryingIn:    return spv::DecorationBlock;
         case glslang::EvqVaryingOut:   return spv::DecorationBlock;
+#ifdef NV_EXTENSIONS
+        case glslang::EvqPayloadNV:    return spv::DecorationBlock;
+        case glslang::EvqPayloadInNV:  return spv::DecorationBlock;
+        case glslang::EvqHitAttrNV:    return spv::DecorationBlock;
+        case glslang::EvqCallableDataNV:   return spv::DecorationBlock;
+        case glslang::EvqCallableDataInNV: return spv::DecorationBlock;
+#endif
         default:
             assert(0);
             break;
@@ -299,12 +351,16 @@
 }
 
 // Translate glslang type to SPIR-V memory decorations.
-void TranslateMemoryDecoration(const glslang::TQualifier& qualifier, std::vector<spv::Decoration>& memory)
+void TranslateMemoryDecoration(const glslang::TQualifier& qualifier, std::vector<spv::Decoration>& memory, bool useVulkanMemoryModel)
 {
-    if (qualifier.coherent)
-        memory.push_back(spv::DecorationCoherent);
-    if (qualifier.volatil)
-        memory.push_back(spv::DecorationVolatile);
+    if (!useVulkanMemoryModel) {
+        if (qualifier.coherent)
+            memory.push_back(spv::DecorationCoherent);
+        if (qualifier.volatil) {
+            memory.push_back(spv::DecorationVolatile);
+            memory.push_back(spv::DecorationCoherent);
+        }
+    }
     if (qualifier.restrict)
         memory.push_back(spv::DecorationRestrict);
     if (qualifier.readonly)
@@ -343,8 +399,24 @@
                 }
             case glslang::EvqVaryingIn:
             case glslang::EvqVaryingOut:
-                assert(type.getQualifier().layoutPacking == glslang::ElpNone);
+                if (type.getQualifier().isTaskMemory()) {
+                    switch (type.getQualifier().layoutPacking) {
+                    case glslang::ElpShared:  return spv::DecorationGLSLShared;
+                    case glslang::ElpPacked:  return spv::DecorationGLSLPacked;
+                    default: break;
+                    }
+                } else {
+                    assert(type.getQualifier().layoutPacking == glslang::ElpNone);
+                }
                 return spv::DecorationMax;
+#ifdef NV_EXTENSIONS
+            case glslang::EvqPayloadNV:
+            case glslang::EvqPayloadInNV:
+            case glslang::EvqHitAttrNV:
+            case glslang::EvqCallableDataNV:
+            case glslang::EvqCallableDataInNV:
+                return spv::DecorationMax;
+#endif
             default:
                 assert(0);
                 return spv::DecorationMax;
@@ -409,6 +481,116 @@
         return spv::DecorationMax;
 }
 
+// If glslang type is nonUniform, return SPIR-V NonUniform decoration.
+spv::Decoration TGlslangToSpvTraverser::TranslateNonUniformDecoration(const glslang::TQualifier& qualifier)
+{
+    if (qualifier.isNonUniform()) {
+        builder.addExtension("SPV_EXT_descriptor_indexing");
+        builder.addCapability(spv::CapabilityShaderNonUniformEXT);
+        return spv::DecorationNonUniformEXT;
+    } else
+        return spv::DecorationMax;
+}
+
+spv::MemoryAccessMask TGlslangToSpvTraverser::TranslateMemoryAccess(const spv::Builder::AccessChain::CoherentFlags &coherentFlags)
+{
+    if (!glslangIntermediate->usingVulkanMemoryModel() || coherentFlags.isImage) {
+        return spv::MemoryAccessMaskNone;
+    }
+    spv::MemoryAccessMask mask = spv::MemoryAccessMaskNone;
+    if (coherentFlags.volatil ||
+        coherentFlags.coherent ||
+        coherentFlags.devicecoherent ||
+        coherentFlags.queuefamilycoherent ||
+        coherentFlags.workgroupcoherent ||
+        coherentFlags.subgroupcoherent) {
+        mask = mask | spv::MemoryAccessMakePointerAvailableKHRMask |
+                      spv::MemoryAccessMakePointerVisibleKHRMask;
+    }
+    if (coherentFlags.nonprivate) {
+        mask = mask | spv::MemoryAccessNonPrivatePointerKHRMask;
+    }
+    if (coherentFlags.volatil) {
+        mask = mask | spv::MemoryAccessVolatileMask;
+    }
+    if (mask != spv::MemoryAccessMaskNone) {
+        builder.addCapability(spv::CapabilityVulkanMemoryModelKHR);
+    }
+    return mask;
+}
+
+spv::ImageOperandsMask TGlslangToSpvTraverser::TranslateImageOperands(const spv::Builder::AccessChain::CoherentFlags &coherentFlags)
+{
+    if (!glslangIntermediate->usingVulkanMemoryModel()) {
+        return spv::ImageOperandsMaskNone;
+    }
+    spv::ImageOperandsMask mask = spv::ImageOperandsMaskNone;
+    if (coherentFlags.volatil ||
+        coherentFlags.coherent ||
+        coherentFlags.devicecoherent ||
+        coherentFlags.queuefamilycoherent ||
+        coherentFlags.workgroupcoherent ||
+        coherentFlags.subgroupcoherent) {
+        mask = mask | spv::ImageOperandsMakeTexelAvailableKHRMask |
+                      spv::ImageOperandsMakeTexelVisibleKHRMask;
+    }
+    if (coherentFlags.nonprivate) {
+        mask = mask | spv::ImageOperandsNonPrivateTexelKHRMask;
+    }
+    if (coherentFlags.volatil) {
+        mask = mask | spv::ImageOperandsVolatileTexelKHRMask;
+    }
+    if (mask != spv::ImageOperandsMaskNone) {
+        builder.addCapability(spv::CapabilityVulkanMemoryModelKHR);
+    }
+    return mask;
+}
+
+spv::Builder::AccessChain::CoherentFlags TGlslangToSpvTraverser::TranslateCoherent(const glslang::TType& type)
+{
+    spv::Builder::AccessChain::CoherentFlags flags;
+    flags.coherent = type.getQualifier().coherent;
+    flags.devicecoherent = type.getQualifier().devicecoherent;
+    flags.queuefamilycoherent = type.getQualifier().queuefamilycoherent;
+    // shared variables are implicitly workgroupcoherent in GLSL.
+    flags.workgroupcoherent = type.getQualifier().workgroupcoherent ||
+                              type.getQualifier().storage == glslang::EvqShared;
+    flags.subgroupcoherent = type.getQualifier().subgroupcoherent;
+    // *coherent variables are implicitly nonprivate in GLSL
+    flags.nonprivate = type.getQualifier().nonprivate ||
+                       flags.subgroupcoherent ||
+                       flags.workgroupcoherent ||
+                       flags.queuefamilycoherent ||
+                       flags.devicecoherent ||
+                       flags.coherent;
+    flags.volatil = type.getQualifier().volatil;
+    flags.isImage = type.getBasicType() == glslang::EbtSampler;
+    return flags;
+}
+
+spv::Scope TGlslangToSpvTraverser::TranslateMemoryScope(const spv::Builder::AccessChain::CoherentFlags &coherentFlags)
+{
+    spv::Scope scope;
+    if (coherentFlags.coherent) {
+        // coherent defaults to Device scope in the old model, QueueFamilyKHR scope in the new model
+        scope = glslangIntermediate->usingVulkanMemoryModel() ? spv::ScopeQueueFamilyKHR : spv::ScopeDevice;
+    } else if (coherentFlags.devicecoherent) {
+        scope = spv::ScopeDevice;
+    } else if (coherentFlags.queuefamilycoherent) {
+        scope = spv::ScopeQueueFamilyKHR;
+    } else if (coherentFlags.workgroupcoherent) {
+        scope = spv::ScopeWorkgroup;
+    } else if (coherentFlags.subgroupcoherent) {
+        scope = spv::ScopeSubgroup;
+    } else {
+        scope = spv::ScopeMax;
+    }
+    if (glslangIntermediate->usingVulkanMemoryModel() && scope == spv::ScopeDevice) {
+        builder.addCapability(spv::CapabilityVulkanMemoryModelDeviceScopeKHR);
+    }
+    return scope;
+}
+
 // Translate a glslang built-in variable to a SPIR-V built in decoration.  Also generate
 // associated capabilities when required.  For some built-in variables, a capability
 // is generated only when using the variable in an executable instruction, but not when
@@ -451,17 +633,13 @@
         return spv::BuiltInCullDistance;
 
     case glslang::EbvViewportIndex:
-        if (!memberDeclaration) {
-            builder.addCapability(spv::CapabilityMultiViewport);
-#ifdef NV_EXTENSIONS
-            if (glslangIntermediate->getStage() == EShLangVertex ||
-                glslangIntermediate->getStage() == EShLangTessControl ||
-                glslangIntermediate->getStage() == EShLangTessEvaluation) {
+        builder.addCapability(spv::CapabilityMultiViewport);
+        if (glslangIntermediate->getStage() == EShLangVertex ||
+            glslangIntermediate->getStage() == EShLangTessControl ||
+            glslangIntermediate->getStage() == EShLangTessEvaluation) {
 
-                builder.addExtension(spv::E_SPV_NV_viewport_array2);
-                builder.addCapability(spv::CapabilityShaderViewportIndexLayerNV);
-            }
-#endif
+            builder.addExtension(spv::E_SPV_EXT_shader_viewport_index_layer);
+            builder.addCapability(spv::CapabilityShaderViewportIndexLayerEXT);
         }
         return spv::BuiltInViewportIndex;
 
@@ -474,23 +652,22 @@
         return spv::BuiltInSamplePosition;
 
     case glslang::EbvSampleMask:
-        builder.addCapability(spv::CapabilitySampleRateShading);
         return spv::BuiltInSampleMask;
 
     case glslang::EbvLayer:
-        if (!memberDeclaration) {
-            builder.addCapability(spv::CapabilityGeometry);
 #ifdef NV_EXTENSIONS
-            if (glslangIntermediate->getStage() == EShLangVertex ||
-                glslangIntermediate->getStage() == EShLangTessControl ||
-                glslangIntermediate->getStage() == EShLangTessEvaluation) {
-
-                builder.addExtension(spv::E_SPV_NV_viewport_array2);
-                builder.addCapability(spv::CapabilityShaderViewportIndexLayerNV);
-            }
-#endif
+        if (glslangIntermediate->getStage() == EShLangMeshNV) {
+            return spv::BuiltInLayer;
         }
+#endif
+        builder.addCapability(spv::CapabilityGeometry);
+        if (glslangIntermediate->getStage() == EShLangVertex ||
+            glslangIntermediate->getStage() == EShLangTessControl ||
+            glslangIntermediate->getStage() == EShLangTessEvaluation) {
 
+            builder.addExtension(spv::E_SPV_EXT_shader_viewport_index_layer);
+            builder.addCapability(spv::CapabilityShaderViewportIndexLayerEXT);
+        }
         return spv::BuiltInLayer;
 
     case glslang::EbvPosition:             return spv::BuiltInPosition;
@@ -500,17 +677,17 @@
     case glslang::EbvInstanceIndex:        return spv::BuiltInInstanceIndex;
 
     case glslang::EbvBaseVertex:
-        builder.addExtension(spv::E_SPV_KHR_shader_draw_parameters);
+        addPre13Extension(spv::E_SPV_KHR_shader_draw_parameters);
         builder.addCapability(spv::CapabilityDrawParameters);
         return spv::BuiltInBaseVertex;
 
     case glslang::EbvBaseInstance:
-        builder.addExtension(spv::E_SPV_KHR_shader_draw_parameters);
+        addPre13Extension(spv::E_SPV_KHR_shader_draw_parameters);
         builder.addCapability(spv::CapabilityDrawParameters);
         return spv::BuiltInBaseInstance;
 
     case glslang::EbvDrawId:
-        builder.addExtension(spv::E_SPV_KHR_shader_draw_parameters);
+        addPre13Extension(spv::E_SPV_KHR_shader_draw_parameters);
         builder.addCapability(spv::CapabilityDrawParameters);
         return spv::BuiltInDrawIndex;
 
@@ -519,6 +696,11 @@
             builder.addCapability(spv::CapabilityGeometry);
         return spv::BuiltInPrimitiveId;
 
+    case glslang::EbvFragStencilRef:
+        builder.addExtension(spv::E_SPV_EXT_shader_stencil_export);
+        builder.addCapability(spv::CapabilityStencilExportEXT);
+        return spv::BuiltInFragStencilRefEXT;
+
     case glslang::EbvInvocationId:         return spv::BuiltInInvocationId;
     case glslang::EbvTessLevelInner:       return spv::BuiltInTessLevelInner;
     case glslang::EbvTessLevelOuter:       return spv::BuiltInTessLevelOuter;
@@ -571,6 +753,46 @@
         builder.addCapability(spv::CapabilitySubgroupBallotKHR);
         return spv::BuiltInSubgroupLtMaskKHR;
 
+    case glslang::EbvNumSubgroups:
+        builder.addCapability(spv::CapabilityGroupNonUniform);
+        return spv::BuiltInNumSubgroups;
+
+    case glslang::EbvSubgroupID:
+        builder.addCapability(spv::CapabilityGroupNonUniform);
+        return spv::BuiltInSubgroupId;
+
+    case glslang::EbvSubgroupSize2:
+        builder.addCapability(spv::CapabilityGroupNonUniform);
+        return spv::BuiltInSubgroupSize;
+
+    case glslang::EbvSubgroupInvocation2:
+        builder.addCapability(spv::CapabilityGroupNonUniform);
+        return spv::BuiltInSubgroupLocalInvocationId;
+
+    case glslang::EbvSubgroupEqMask2:
+        builder.addCapability(spv::CapabilityGroupNonUniform);
+        builder.addCapability(spv::CapabilityGroupNonUniformBallot);
+        return spv::BuiltInSubgroupEqMask;
+
+    case glslang::EbvSubgroupGeMask2:
+        builder.addCapability(spv::CapabilityGroupNonUniform);
+        builder.addCapability(spv::CapabilityGroupNonUniformBallot);
+        return spv::BuiltInSubgroupGeMask;
+
+    case glslang::EbvSubgroupGtMask2:
+        builder.addCapability(spv::CapabilityGroupNonUniform);
+        builder.addCapability(spv::CapabilityGroupNonUniformBallot);
+        return spv::BuiltInSubgroupGtMask;
+
+    case glslang::EbvSubgroupLeMask2:
+        builder.addCapability(spv::CapabilityGroupNonUniform);
+        builder.addCapability(spv::CapabilityGroupNonUniformBallot);
+        return spv::BuiltInSubgroupLeMask;
+
+    case glslang::EbvSubgroupLtMask2:
+        builder.addCapability(spv::CapabilityGroupNonUniform);
+        builder.addCapability(spv::CapabilityGroupNonUniformBallot);
+        return spv::BuiltInSubgroupLtMask;
 #ifdef AMD_EXTENSIONS
     case glslang::EbvBaryCoordNoPersp:
         builder.addExtension(spv::E_SPV_AMD_shader_explicit_vertex_parameter);
@@ -602,15 +824,25 @@
 #endif
 
     case glslang::EbvDeviceIndex:
-        builder.addExtension(spv::E_SPV_KHR_device_group);
+        addPre13Extension(spv::E_SPV_KHR_device_group);
         builder.addCapability(spv::CapabilityDeviceGroup);
         return spv::BuiltInDeviceIndex;
 
     case glslang::EbvViewIndex:
-        builder.addExtension(spv::E_SPV_KHR_multiview);
+        addPre13Extension(spv::E_SPV_KHR_multiview);
         builder.addCapability(spv::CapabilityMultiView);
         return spv::BuiltInViewIndex;
 
+    case glslang::EbvFragSizeEXT:
+        builder.addExtension(spv::E_SPV_EXT_fragment_invocation_density);
+        builder.addCapability(spv::CapabilityFragmentDensityEXT);
+        return spv::BuiltInFragSizeEXT;
+
+    case glslang::EbvFragInvocationCountEXT:
+        builder.addExtension(spv::E_SPV_EXT_fragment_invocation_density);
+        builder.addCapability(spv::CapabilityFragmentDensityEXT);
+        return spv::BuiltInFragInvocationCountEXT;
+
 #ifdef NV_EXTENSIONS
     case glslang::EbvViewportMaskNV:
         if (!memberDeclaration) {
@@ -642,6 +874,72 @@
             builder.addCapability(spv::CapabilityPerViewAttributesNV);
         }
         return spv::BuiltInViewportMaskPerViewNV;
+    case glslang::EbvFragFullyCoveredNV:
+        builder.addExtension(spv::E_SPV_EXT_fragment_fully_covered);
+        builder.addCapability(spv::CapabilityFragmentFullyCoveredEXT);
+        return spv::BuiltInFullyCoveredEXT;
+    case glslang::EbvFragmentSizeNV:
+        builder.addExtension(spv::E_SPV_NV_shading_rate);
+        builder.addCapability(spv::CapabilityShadingRateNV);
+        return spv::BuiltInFragmentSizeNV;
+    case glslang::EbvInvocationsPerPixelNV:
+        builder.addExtension(spv::E_SPV_NV_shading_rate);
+        builder.addCapability(spv::CapabilityShadingRateNV);
+        return spv::BuiltInInvocationsPerPixelNV;
+
+    // raytracing
+    case glslang::EbvLaunchIdNV:
+        return spv::BuiltInLaunchIdNV;
+    case glslang::EbvLaunchSizeNV:
+        return spv::BuiltInLaunchSizeNV;
+    case glslang::EbvWorldRayOriginNV:
+        return spv::BuiltInWorldRayOriginNV;
+    case glslang::EbvWorldRayDirectionNV:
+        return spv::BuiltInWorldRayDirectionNV;
+    case glslang::EbvObjectRayOriginNV:
+        return spv::BuiltInObjectRayOriginNV;
+    case glslang::EbvObjectRayDirectionNV:
+        return spv::BuiltInObjectRayDirectionNV;
+    case glslang::EbvRayTminNV:
+        return spv::BuiltInRayTminNV;
+    case glslang::EbvRayTmaxNV:
+        return spv::BuiltInRayTmaxNV;
+    case glslang::EbvInstanceCustomIndexNV:
+        return spv::BuiltInInstanceCustomIndexNV;
+    case glslang::EbvHitTNV:
+        return spv::BuiltInHitTNV;
+    case glslang::EbvHitKindNV:
+        return spv::BuiltInHitKindNV;
+    case glslang::EbvObjectToWorldNV:
+        return spv::BuiltInObjectToWorldNV;
+    case glslang::EbvWorldToObjectNV:
+        return spv::BuiltInWorldToObjectNV;
+    case glslang::EbvIncomingRayFlagsNV:
+        return spv::BuiltInIncomingRayFlagsNV;
+    case glslang::EbvBaryCoordNV:
+        builder.addExtension(spv::E_SPV_NV_fragment_shader_barycentric);
+        builder.addCapability(spv::CapabilityFragmentBarycentricNV);
+        return spv::BuiltInBaryCoordNV;
+    case glslang::EbvBaryCoordNoPerspNV:
+        builder.addExtension(spv::E_SPV_NV_fragment_shader_barycentric);
+        builder.addCapability(spv::CapabilityFragmentBarycentricNV);
+        return spv::BuiltInBaryCoordNoPerspNV;
+     case glslang::EbvTaskCountNV:
+        return spv::BuiltInTaskCountNV;
+     case glslang::EbvPrimitiveCountNV:
+        return spv::BuiltInPrimitiveCountNV;
+     case glslang::EbvPrimitiveIndicesNV:
+        return spv::BuiltInPrimitiveIndicesNV;
+     case glslang::EbvClipDistancePerViewNV:
+        return spv::BuiltInClipDistancePerViewNV;
+     case glslang::EbvCullDistancePerViewNV:
+        return spv::BuiltInCullDistancePerViewNV;
+     case glslang::EbvLayerPerViewNV:
+        return spv::BuiltInLayerPerViewNV;
+     case glslang::EbvMeshViewCountNV:
+        return spv::BuiltInMeshViewCountNV;
+     case glslang::EbvMeshViewIndicesNV:
+        return spv::BuiltInMeshViewIndicesNV;
 #endif 
     default:
         return spv::BuiltInMax;
@@ -736,16 +1034,42 @@
     }
 }
 
-spv::LoopControlMask TGlslangToSpvTraverser::TranslateLoopControl(glslang::TLoopControl loopControl) const
+spv::SelectionControlMask TGlslangToSpvTraverser::TranslateSelectionControl(const glslang::TIntermSelection& selectionNode) const
 {
-    switch (loopControl) {
-    case glslang::ELoopControlNone:       return spv::LoopControlMaskNone;
-    case glslang::ELoopControlUnroll:     return spv::LoopControlUnrollMask;
-    case glslang::ELoopControlDontUnroll: return spv::LoopControlDontUnrollMask;
-    // TODO: DependencyInfinite
-    // TODO: DependencyLength
-    default:                              return spv::LoopControlMaskNone;
+    if (selectionNode.getFlatten())
+        return spv::SelectionControlFlattenMask;
+    if (selectionNode.getDontFlatten())
+        return spv::SelectionControlDontFlattenMask;
+    return spv::SelectionControlMaskNone;
+}
+
+spv::SelectionControlMask TGlslangToSpvTraverser::TranslateSwitchControl(const glslang::TIntermSwitch& switchNode) const
+{
+    if (switchNode.getFlatten())
+        return spv::SelectionControlFlattenMask;
+    if (switchNode.getDontFlatten())
+        return spv::SelectionControlDontFlattenMask;
+    return spv::SelectionControlMaskNone;
+}
+
+// return a non-0 dependency if the dependency argument must be set
+spv::LoopControlMask TGlslangToSpvTraverser::TranslateLoopControl(const glslang::TIntermLoop& loopNode,
+    unsigned int& dependencyLength) const
+{
+    spv::LoopControlMask control = spv::LoopControlMaskNone;
+
+    if (loopNode.getDontUnroll())
+        control = control | spv::LoopControlDontUnrollMask;
+    if (loopNode.getUnroll())
+        control = control | spv::LoopControlUnrollMask;
+    if (unsigned(loopNode.getLoopDependency()) == glslang::TIntermLoop::dependencyInfinite)
+        control = control | spv::LoopControlDependencyInfiniteMask;
+    else if (loopNode.getLoopDependency() > 0) {
+        control = control | spv::LoopControlDependencyLengthMask;
+        dependencyLength = loopNode.getLoopDependency();
     }
+
+    return control;
 }
 
 // Translate glslang type to SPIR-V storage class.
@@ -753,31 +1077,91 @@
 {
     if (type.getQualifier().isPipeInput())
         return spv::StorageClassInput;
-    else if (type.getQualifier().isPipeOutput())
+    if (type.getQualifier().isPipeOutput())
         return spv::StorageClassOutput;
-    else if (type.getBasicType() == glslang::EbtAtomicUint)
-        return spv::StorageClassAtomicCounter;
-    else if (type.containsOpaque())
-        return spv::StorageClassUniformConstant;
-    else if (glslangIntermediate->usingStorageBuffer() && type.getQualifier().storage == glslang::EvqBuffer) {
-        builder.addExtension(spv::E_SPV_KHR_storage_buffer_storage_class);
+
+    if (glslangIntermediate->getSource() != glslang::EShSourceHlsl ||
+        type.getQualifier().storage == glslang::EvqUniform) {
+        if (type.getBasicType() == glslang::EbtAtomicUint)
+            return spv::StorageClassAtomicCounter;
+        if (type.containsOpaque())
+            return spv::StorageClassUniformConstant;
+    }
+
+    if (glslangIntermediate->usingStorageBuffer() && type.getQualifier().storage == glslang::EvqBuffer) {
+        addPre13Extension(spv::E_SPV_KHR_storage_buffer_storage_class);
         return spv::StorageClassStorageBuffer;
-    } else if (type.getQualifier().isUniformOrBuffer()) {
+    }
+
+    if (type.getQualifier().isUniformOrBuffer()) {
         if (type.getQualifier().layoutPushConstant)
             return spv::StorageClassPushConstant;
+#ifdef NV_EXTENSIONS
+        if (type.getQualifier().layoutShaderRecordNV)
+            return spv::StorageClassShaderRecordBufferNV;
+#endif
         if (type.getBasicType() == glslang::EbtBlock)
             return spv::StorageClassUniform;
-        else
-            return spv::StorageClassUniformConstant;
+        return spv::StorageClassUniformConstant;
+    }
+
+    switch (type.getQualifier().storage) {
+    case glslang::EvqShared:        return spv::StorageClassWorkgroup;
+    case glslang::EvqGlobal:        return spv::StorageClassPrivate;
+    case glslang::EvqConstReadOnly: return spv::StorageClassFunction;
+    case glslang::EvqTemporary:     return spv::StorageClassFunction;
+#ifdef NV_EXTENSIONS
+    case glslang::EvqPayloadNV:        return spv::StorageClassRayPayloadNV;
+    case glslang::EvqPayloadInNV:      return spv::StorageClassIncomingRayPayloadNV;
+    case glslang::EvqHitAttrNV:        return spv::StorageClassHitAttributeNV;
+    case glslang::EvqCallableDataNV:   return spv::StorageClassCallableDataNV;
+    case glslang::EvqCallableDataInNV: return spv::StorageClassIncomingCallableDataNV;
+#endif
+    default:
+        assert(0);
+        break;
+    }
+
+    return spv::StorageClassFunction;
+}
+
+// Add capabilities pertaining to how an array is indexed.
+void TGlslangToSpvTraverser::addIndirectionIndexCapabilities(const glslang::TType& baseType,
+                                                             const glslang::TType& indexType)
+{
+    if (indexType.getQualifier().isNonUniform()) {
+        // deal with an asserted non-uniform index
+        // SPV_EXT_descriptor_indexing already added in TranslateNonUniformDecoration
+        if (baseType.getBasicType() == glslang::EbtSampler) {
+            if (baseType.getQualifier().hasAttachment())
+                builder.addCapability(spv::CapabilityInputAttachmentArrayNonUniformIndexingEXT);
+            else if (baseType.isImage() && baseType.getSampler().dim == glslang::EsdBuffer)
+                builder.addCapability(spv::CapabilityStorageTexelBufferArrayNonUniformIndexingEXT);
+            else if (baseType.isTexture() && baseType.getSampler().dim == glslang::EsdBuffer)
+                builder.addCapability(spv::CapabilityUniformTexelBufferArrayNonUniformIndexingEXT);
+            else if (baseType.isImage())
+                builder.addCapability(spv::CapabilityStorageImageArrayNonUniformIndexingEXT);
+            else if (baseType.isTexture())
+                builder.addCapability(spv::CapabilitySampledImageArrayNonUniformIndexingEXT);
+        } else if (baseType.getBasicType() == glslang::EbtBlock) {
+            if (baseType.getQualifier().storage == glslang::EvqBuffer)
+                builder.addCapability(spv::CapabilityStorageBufferArrayNonUniformIndexingEXT);
+            else if (baseType.getQualifier().storage == glslang::EvqUniform)
+                builder.addCapability(spv::CapabilityUniformBufferArrayNonUniformIndexingEXT);
+        }
     } else {
-        switch (type.getQualifier().storage) {
-        case glslang::EvqShared:        return spv::StorageClassWorkgroup;  break;
-        case glslang::EvqGlobal:        return spv::StorageClassPrivate;
-        case glslang::EvqConstReadOnly: return spv::StorageClassFunction;
-        case glslang::EvqTemporary:     return spv::StorageClassFunction;
-        default:
-            assert(0);
-            return spv::StorageClassFunction;
+        // assume a dynamically uniform index
+        if (baseType.getBasicType() == glslang::EbtSampler) {
+            if (baseType.getQualifier().hasAttachment()) {
+                builder.addExtension("SPV_EXT_descriptor_indexing");
+                builder.addCapability(spv::CapabilityInputAttachmentArrayDynamicIndexingEXT);
+            } else if (baseType.isImage() && baseType.getSampler().dim == glslang::EsdBuffer) {
+                builder.addExtension("SPV_EXT_descriptor_indexing");
+                builder.addCapability(spv::CapabilityStorageTexelBufferArrayDynamicIndexingEXT);
+            } else if (baseType.isTexture() && baseType.getSampler().dim == glslang::EsdBuffer) {
+                builder.addExtension("SPV_EXT_descriptor_indexing");
+                builder.addCapability(spv::CapabilityUniformTexelBufferArrayDynamicIndexingEXT);
+            }
         }
     }
 }
@@ -788,7 +1172,11 @@
 {
     // uniform and buffer blocks are included, unless it is a push_constant
     if (type.getBasicType() == glslang::EbtBlock)
-        return type.getQualifier().isUniformOrBuffer() && ! type.getQualifier().layoutPushConstant;
+        return type.getQualifier().isUniformOrBuffer() &&
+#ifdef NV_EXTENSIONS
+        ! type.getQualifier().layoutShaderRecordNV &&
+#endif
+        ! type.getQualifier().layoutPushConstant;
 
     // non block...
     // basically samplerXXX/subpass/sampler/texture are all included
@@ -824,6 +1212,16 @@
         child.sample = true;
     if (parent.coherent)
         child.coherent = true;
+    if (parent.devicecoherent)
+        child.devicecoherent = true;
+    if (parent.queuefamilycoherent)
+        child.queuefamilycoherent = true;
+    if (parent.workgroupcoherent)
+        child.workgroupcoherent = true;
+    if (parent.subgroupcoherent)
+        child.subgroupcoherent = true;
+    if (parent.nonprivate)
+        child.nonprivate = true;
     if (parent.volatil)
         child.volatil = true;
     if (parent.restrict)
@@ -832,6 +1230,14 @@
         child.readonly = true;
     if (parent.writeonly)
         child.writeonly = true;
+#ifdef NV_EXTENSIONS
+    if (parent.perPrimitiveNV)
+        child.perPrimitiveNV = true;
+    if (parent.perViewNV)
+        child.perViewNV = true;
+    if (parent.perTaskNV)
+        child.perTaskNV = true;
+#endif
 }
 
 bool HasNonLayoutQualifiers(const glslang::TType& type, const glslang::TQualifier& qualifier)
@@ -851,19 +1257,51 @@
 // Implement the TGlslangToSpvTraverser class.
 //
 
-TGlslangToSpvTraverser::TGlslangToSpvTraverser(const glslang::TIntermediate* glslangIntermediate, spv::SpvBuildLogger* buildLogger)
-    : TIntermTraverser(true, false, true), shaderEntry(nullptr), currentFunction(nullptr),
+TGlslangToSpvTraverser::TGlslangToSpvTraverser(unsigned int spvVersion, const glslang::TIntermediate* glslangIntermediate,
+                                               spv::SpvBuildLogger* buildLogger, glslang::SpvOptions& options)
+    : TIntermTraverser(true, false, true),
+      options(options),
+      shaderEntry(nullptr), currentFunction(nullptr),
       sequenceDepth(0), logger(buildLogger),
-      builder((glslang::GetKhronosToolId() << 16) | GeneratorVersion, logger),
+      builder(spvVersion, (glslang::GetKhronosToolId() << 16) | glslang::GetSpirvGeneratorVersion(), logger),
       inEntryPoint(false), entryPointTerminated(false), linkageOnly(false),
       glslangIntermediate(glslangIntermediate)
 {
     spv::ExecutionModel executionModel = TranslateExecutionModel(glslangIntermediate->getStage());
 
     builder.clearAccessChain();
-    builder.setSource(TranslateSourceLanguage(glslangIntermediate->getSource(), glslangIntermediate->getProfile()), glslangIntermediate->getVersion());
+    builder.setSource(TranslateSourceLanguage(glslangIntermediate->getSource(), glslangIntermediate->getProfile()),
+                      glslangIntermediate->getVersion());
+
+    if (options.generateDebugInfo) {
+        builder.setEmitOpLines();
+        builder.setSourceFile(glslangIntermediate->getSourceFile());
+
+        // Set the source shader's text. If for SPV version 1.0, include
+        // a preamble in comments stating the OpModuleProcessed instructions.
+        // Otherwise, emit those as actual instructions.
+        std::string text;
+        const std::vector<std::string>& processes = glslangIntermediate->getProcesses();
+        for (int p = 0; p < (int)processes.size(); ++p) {
+            if (glslangIntermediate->getSpv().spv < glslang::EShTargetSpv_1_1) {
+                text.append("// OpModuleProcessed ");
+                text.append(processes[p]);
+                text.append("\n");
+            } else
+                builder.addModuleProcessed(processes[p]);
+        }
+        if (glslangIntermediate->getSpv().spv < glslang::EShTargetSpv_1_1 && (int)processes.size() > 0)
+            text.append("#line 1\n");
+        text.append(glslangIntermediate->getSourceText());
+        builder.setSourceText(text);
+    }
     stdBuiltins = builder.import("GLSL.std.450");
-    builder.setMemoryModel(spv::AddressingModelLogical, spv::MemoryModelGLSL450);
+    if (glslangIntermediate->usingVulkanMemoryModel()) {
+        builder.setMemoryModel(spv::AddressingModelLogical, spv::MemoryModelVulkanKHR);
+        builder.addExtension(spv::E_SPV_KHR_vulkan_memory_model);
+    } else {
+        builder.setMemoryModel(spv::AddressingModelLogical, spv::MemoryModelGLSL450);
+    }
     shaderEntry = builder.makeEntryPoint(glslangIntermediate->getEntryPointName().c_str());
     entryPoint = builder.addEntryPoint(executionModel, shaderEntry, glslangIntermediate->getEntryPointName().c_str());
 
@@ -967,6 +1405,12 @@
         if (glslangIntermediate->getEarlyFragmentTests())
             builder.addExecutionMode(shaderEntry, spv::ExecutionModeEarlyFragmentTests);
 
+        if (glslangIntermediate->getPostDepthCoverage()) {
+            builder.addCapability(spv::CapabilitySampleMaskPostDepthCoverage);
+            builder.addExecutionMode(shaderEntry, spv::ExecutionModePostDepthCoverage);
+            builder.addExtension(spv::E_SPV_KHR_post_depth_coverage);
+        }
+
         switch(glslangIntermediate->getDepth()) {
         case glslang::EldGreater:  mode = spv::ExecutionModeDepthGreater; break;
         case glslang::EldLess:     mode = spv::ExecutionModeDepthLess;    break;
@@ -984,8 +1428,52 @@
         builder.addExecutionMode(shaderEntry, spv::ExecutionModeLocalSize, glslangIntermediate->getLocalSize(0),
                                                                            glslangIntermediate->getLocalSize(1),
                                                                            glslangIntermediate->getLocalSize(2));
+#ifdef NV_EXTENSIONS
+        if (glslangIntermediate->getLayoutDerivativeModeNone() == glslang::LayoutDerivativeGroupQuads) {
+            builder.addCapability(spv::CapabilityComputeDerivativeGroupQuadsNV);
+            builder.addExecutionMode(shaderEntry, spv::ExecutionModeDerivativeGroupQuadsNV);
+            builder.addExtension(spv::E_SPV_NV_compute_shader_derivatives);
+        } else if (glslangIntermediate->getLayoutDerivativeModeNone() == glslang::LayoutDerivativeGroupLinear) {
+            builder.addCapability(spv::CapabilityComputeDerivativeGroupLinearNV);
+            builder.addExecutionMode(shaderEntry, spv::ExecutionModeDerivativeGroupLinearNV);
+            builder.addExtension(spv::E_SPV_NV_compute_shader_derivatives);
+        }
+#endif
         break;
 
+#ifdef NV_EXTENSIONS
+    case EShLangRayGenNV:
+    case EShLangIntersectNV:
+    case EShLangAnyHitNV:
+    case EShLangClosestHitNV:
+    case EShLangMissNV:
+    case EShLangCallableNV:
+        builder.addCapability(spv::CapabilityRayTracingNV);
+        builder.addExtension("SPV_NV_ray_tracing");
+        break;
+    case EShLangTaskNV:
+    case EShLangMeshNV:
+        builder.addCapability(spv::CapabilityMeshShadingNV);
+        builder.addExtension(spv::E_SPV_NV_mesh_shader);
+        builder.addExecutionMode(shaderEntry, spv::ExecutionModeLocalSize, glslangIntermediate->getLocalSize(0),
+                                                                           glslangIntermediate->getLocalSize(1),
+                                                                           glslangIntermediate->getLocalSize(2));
+        if (glslangIntermediate->getStage() == EShLangMeshNV) {
+            builder.addExecutionMode(shaderEntry, spv::ExecutionModeOutputVertices, glslangIntermediate->getVertices());
+            builder.addExecutionMode(shaderEntry, spv::ExecutionModeOutputPrimitivesNV, glslangIntermediate->getPrimitives());
+
+            switch (glslangIntermediate->getOutputPrimitive()) {
+            case glslang::ElgPoints:        mode = spv::ExecutionModeOutputPoints;      break;
+            case glslang::ElgLines:         mode = spv::ExecutionModeOutputLinesNV;     break;
+            case glslang::ElgTriangles:     mode = spv::ExecutionModeOutputTrianglesNV; break;
+            default:                        mode = spv::ExecutionModeMax;               break;
+            }
+            if (mode != spv::ExecutionModeMax)
+                builder.addExecutionMode(shaderEntry, (spv::ExecutionMode)mode);
+        }
+        break;
+#endif
+
     default:
         break;
     }
@@ -994,6 +1482,7 @@
 // Finish creating SPV, after the traversal is complete.
 void TGlslangToSpvTraverser::finishSpv()
 {
+    // Finish the entry point function
     if (! entryPointTerminated) {
         builder.setBuildPoint(shaderEntry->getLastBlock());
         builder.leaveFunction();
@@ -1003,7 +1492,9 @@
     for (auto it = iOSet.cbegin(); it != iOSet.cend(); ++it)
         entryPoint->addIdOperand(*it);
 
-    builder.eliminateDeadDecorations();
+    // Add capabilities, extensions, remove unneeded decorations, etc., 
+    // based on the resulting SPIR-V.
+    builder.postProcess();
 }
 
 // Write the SPV into 'out'.
@@ -1040,8 +1531,10 @@
     // Include all "static use" and "linkage only" interface variables on the OpEntryPoint instruction
     if (builder.isPointer(id)) {
         spv::StorageClass sc = builder.getStorageClass(id);
-        if (sc == spv::StorageClassInput || sc == spv::StorageClassOutput)
-            iOSet.insert(id);
+        if (sc == spv::StorageClassInput || sc == spv::StorageClassOutput) {
+            if (!symbol->getType().isStruct() || symbol->getType().getStruct()->size() > 0)
+                iOSet.insert(id);
+        }
     }
 
     // Only process non-linkage-only nodes for generating actual static uses
@@ -1065,10 +1558,44 @@
         else
             builder.setAccessChainLValue(id);
     }
+
+    // Process linkage-only nodes for any special additional interface work.
+    if (linkageOnly) {
+        if (glslangIntermediate->getHlslFunctionality1()) {
+            // Map implicit counter buffers to their originating buffers, which should have been
+            // seen by now, given earlier pruning of unused counters, and preservation of order
+            // of declaration.
+            if (symbol->getType().getQualifier().isUniformOrBuffer()) {
+                if (!glslangIntermediate->hasCounterBufferName(symbol->getName())) {
+                    // Save possible originating buffers for counter buffers, keyed by
+                    // making the potential counter-buffer name.
+                    std::string keyName = symbol->getName().c_str();
+                    keyName = glslangIntermediate->addCounterBufferName(keyName);
+                    counterOriginator[keyName] = symbol;
+                } else {
+                    // Handle a counter buffer, by finding the saved originating buffer.
+                    std::string keyName = symbol->getName().c_str();
+                    auto it = counterOriginator.find(keyName);
+                    if (it != counterOriginator.end()) {
+                        id = getSymbolId(it->second);
+                        if (id != spv::NoResult) {
+                            spv::Id counterId = getSymbolId(symbol);
+                            if (counterId != spv::NoResult) {
+                                builder.addExtension("SPV_GOOGLE_hlsl_functionality1");
+                                builder.addDecorationId(id, spv::DecorationHlslCounterBufferGOOGLE, counterId);
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    }
 }
 
 bool TGlslangToSpvTraverser::visitBinary(glslang::TVisit /* visit */, glslang::TIntermBinary* node)
 {
+    builder.setLine(node->getLoc().line);
+
     SpecConstantOpModeGuard spec_constant_op_mode_setter(&builder);
     if (node->getType().getQualifier().isSpecConstant())
         spec_constant_op_mode_setter.turnOnSpecConstantOpMode();
@@ -1111,8 +1638,10 @@
                 spv::Id leftRValue = accessChainLoad(node->getLeft()->getType());
 
                 // do the operation
-                rValue = createBinaryOperation(node->getOp(), TranslatePrecisionDecoration(node->getOperationPrecision()),
-                                               TranslateNoContractionDecoration(node->getType().getQualifier()),
+                OpDecorations decorations = { TranslatePrecisionDecoration(node->getOperationPrecision()),
+                                              TranslateNoContractionDecoration(node->getType().getQualifier()),
+                                              TranslateNonUniformDecoration(node->getType().getQualifier()) };
+                rValue = createBinaryOperation(node->getOp(), decorations,
                                                convertGlslangToSpvType(node->getType()), leftRValue, rValue,
                                                node->getType().getBasicType());
 
@@ -1122,7 +1651,7 @@
 
             // store the result
             builder.setAccessChain(lValue);
-            multiTypeStore(node->getType(), rValue);
+            multiTypeStore(node->getLeft()->getType(), rValue);
 
             // assignments are expressions having an rValue after they are evaluated...
             builder.clearAccessChain();
@@ -1159,7 +1688,7 @@
                 }
 
                 // normal case for indexing array or structure or block
-                builder.accessChainPush(builder.makeIntConstant(spvIndex));
+                builder.accessChainPush(builder.makeIntConstant(spvIndex), TranslateCoherent(node->getLeft()->getType()));
 
                 // Add capabilities here for accessing PointSize and clip/cull distance.
                 // We have deferred generation of associated capabilities until now.
@@ -1187,13 +1716,15 @@
             node->getRight()->traverse(this);
             spv::Id index = accessChainLoad(node->getRight()->getType());
 
+            addIndirectionIndexCapabilities(node->getLeft()->getType(), node->getRight()->getType());
+
             // restore the saved access chain
             builder.setAccessChain(partial);
 
             if (! node->getLeft()->getType().isArray() && node->getLeft()->getType().isVector())
                 builder.accessChainPushComponent(index, convertGlslangToSpvType(node->getLeft()->getType()));
             else
-                builder.accessChainPush(index);
+                builder.accessChainPush(index, TranslateCoherent(node->getLeft()->getType()));
         }
         return false;
     case glslang::EOpVectorSwizzle:
@@ -1239,8 +1770,10 @@
     spv::Id right = accessChainLoad(node->getRight()->getType());
 
     // get result
-    spv::Id result = createBinaryOperation(node->getOp(), TranslatePrecisionDecoration(node->getOperationPrecision()),
-                                           TranslateNoContractionDecoration(node->getType().getQualifier()),
+    OpDecorations decorations = { TranslatePrecisionDecoration(node->getOperationPrecision()),
+                                  TranslateNoContractionDecoration(node->getType().getQualifier()),
+                                  TranslateNonUniformDecoration(node->getType().getQualifier()) };
+    spv::Id result = createBinaryOperation(node->getOp(), decorations,
                                            convertGlslangToSpvType(node->getType()), left, right,
                                            node->getLeft()->getType().getBasicType());
 
@@ -1256,6 +1789,8 @@
 
 bool TGlslangToSpvTraverser::visitUnary(glslang::TVisit /* visit */, glslang::TIntermUnary* node)
 {
+    builder.setLine(node->getLoc().line);
+
     SpecConstantOpModeGuard spec_constant_op_mode_setter(&builder);
     if (node->getType().getQualifier().isSpecConstant())
         spec_constant_op_mode_setter.turnOnSpecConstantOpMode();
@@ -1276,15 +1811,26 @@
     if (node->getOp() == glslang::EOpArrayLength) {
         // Quite special; won't want to evaluate the operand.
 
+        // Currently, the front-end does not allow .length() on an array until it is sized,
+        // except for the last block membeor of an SSBO.
+        // TODO: If this changes, link-time sized arrays might show up here, and need their
+        // size extracted.
+
         // Normal .length() would have been constant folded by the front-end.
         // So, this has to be block.lastMember.length().
         // SPV wants "block" and member number as the operands, go get them.
-        assert(node->getOperand()->getType().isRuntimeSizedArray());
+
         glslang::TIntermTyped* block = node->getOperand()->getAsBinaryNode()->getLeft();
         block->traverse(this);
         unsigned int member = node->getOperand()->getAsBinaryNode()->getRight()->getAsConstantUnion()->getConstArray()[0].getUConst();
         spv::Id length = builder.createArrayLength(builder.accessChainGetLValue(), member);
 
+        // GLSL semantics say the result of .length() is an int, while SPIR-V says
+        // signedness must be 0. So, convert from SPIR-V unsigned back to GLSL's
+        // AST expectation of a signed result.
+        if (glslangIntermediate->getSource() == glslang::EShSourceGlsl)
+            length = builder.createUnaryOp(spv::OpBitcast, builder.makeIntType(32), length);
+
         builder.clearAccessChain();
         builder.setAccessChainRValue(length);
 
@@ -1316,20 +1862,23 @@
     else
         operand = accessChainLoad(node->getOperand()->getType());
 
-    spv::Decoration precision = TranslatePrecisionDecoration(node->getOperationPrecision());
-    spv::Decoration noContraction = TranslateNoContractionDecoration(node->getType().getQualifier());
+    OpDecorations decorations = { TranslatePrecisionDecoration(node->getOperationPrecision()),
+                                  TranslateNoContractionDecoration(node->getType().getQualifier()),
+                                  TranslateNonUniformDecoration(node->getType().getQualifier()) };
 
     // it could be a conversion
     if (! result)
-        result = createConversion(node->getOp(), precision, noContraction, resultType(), operand, node->getOperand()->getBasicType());
+        result = createConversion(node->getOp(), decorations, resultType(), operand, node->getOperand()->getBasicType());
 
     // if not, then possibly an operation
     if (! result)
-        result = createUnaryOperation(node->getOp(), precision, noContraction, resultType(), operand, node->getOperand()->getBasicType());
+        result = createUnaryOperation(node->getOp(), decorations, resultType(), operand, node->getOperand()->getBasicType());
 
     if (result) {
-        if (invertedType)
-            result = createInvertedSwizzle(precision, *node->getOperand(), result);
+        if (invertedType) {
+            result = createInvertedSwizzle(decorations.precision, *node->getOperand(), result);
+            builder.addDecoration(result, decorations.nonUniform);
+        }
 
         builder.clearAccessChain();
         builder.setAccessChainRValue(result);
@@ -1350,10 +1899,12 @@
                 one = builder.makeFloatConstant(1.0F);
             else if (node->getBasicType() == glslang::EbtDouble)
                 one = builder.makeDoubleConstant(1.0);
-#ifdef AMD_EXTENSIONS
             else if (node->getBasicType() == glslang::EbtFloat16)
                 one = builder.makeFloat16Constant(1.0F);
-#endif
+            else if (node->getBasicType() == glslang::EbtInt8  || node->getBasicType() == glslang::EbtUint8)
+                one = builder.makeInt8Constant(1);
+            else if (node->getBasicType() == glslang::EbtInt16 || node->getBasicType() == glslang::EbtUint16)
+                one = builder.makeInt16Constant(1);
             else if (node->getBasicType() == glslang::EbtInt64 || node->getBasicType() == glslang::EbtUint64)
                 one = builder.makeInt64Constant(1);
             else
@@ -1365,8 +1916,7 @@
             else
                 op = glslang::EOpSub;
 
-            spv::Id result = createBinaryOperation(op, precision,
-                                                   TranslateNoContractionDecoration(node->getType().getQualifier()),
+            spv::Id result = createBinaryOperation(op, decorations,
                                                    convertGlslangToSpvType(node->getType()), operand, one,
                                                    node->getType().getBasicType());
             assert(result != spv::NoResult);
@@ -1414,7 +1964,11 @@
         builder.setAccessChainRValue(result);
 
         return false;
-    } else if (node->getOp() == glslang::EOpImageStore) {
+    } else if (node->getOp() == glslang::EOpImageStore ||
+#ifdef AMD_EXTENSIONS
+        node->getOp() == glslang::EOpImageStoreLod ||
+#endif
+        node->getOp() == glslang::EOpImageAtomicStore) {
         // "imageStore" is a special case, which has no result
         return false;
     }
@@ -1499,6 +2053,7 @@
         return false;
     case glslang::EOpFunctionCall:
     {
+        builder.setLine(node->getLoc().line);
         if (node->isUserDefined())
             result = handleUserFunctionCall(node);
         // assert(result);  // this can happen for bad shaders because the call graph completeness checking is not yet done
@@ -1528,7 +2083,33 @@
     case glslang::EOpConstructDMat4x2:
     case glslang::EOpConstructDMat4x3:
     case glslang::EOpConstructDMat4x4:
-#ifdef AMD_EXTENSIONS
+    case glslang::EOpConstructIMat2x2:
+    case glslang::EOpConstructIMat2x3:
+    case glslang::EOpConstructIMat2x4:
+    case glslang::EOpConstructIMat3x2:
+    case glslang::EOpConstructIMat3x3:
+    case glslang::EOpConstructIMat3x4:
+    case glslang::EOpConstructIMat4x2:
+    case glslang::EOpConstructIMat4x3:
+    case glslang::EOpConstructIMat4x4:
+    case glslang::EOpConstructUMat2x2:
+    case glslang::EOpConstructUMat2x3:
+    case glslang::EOpConstructUMat2x4:
+    case glslang::EOpConstructUMat3x2:
+    case glslang::EOpConstructUMat3x3:
+    case glslang::EOpConstructUMat3x4:
+    case glslang::EOpConstructUMat4x2:
+    case glslang::EOpConstructUMat4x3:
+    case glslang::EOpConstructUMat4x4:
+    case glslang::EOpConstructBMat2x2:
+    case glslang::EOpConstructBMat2x3:
+    case glslang::EOpConstructBMat2x4:
+    case glslang::EOpConstructBMat3x2:
+    case glslang::EOpConstructBMat3x3:
+    case glslang::EOpConstructBMat3x4:
+    case glslang::EOpConstructBMat4x2:
+    case glslang::EOpConstructBMat4x3:
+    case glslang::EOpConstructBMat4x4:
     case glslang::EOpConstructF16Mat2x2:
     case glslang::EOpConstructF16Mat2x3:
     case glslang::EOpConstructF16Mat2x4:
@@ -1538,7 +2119,6 @@
     case glslang::EOpConstructF16Mat4x2:
     case glslang::EOpConstructF16Mat4x3:
     case glslang::EOpConstructF16Mat4x4:
-#endif
         isMatrix = true;
         // fall through
     case glslang::EOpConstructFloat:
@@ -1549,16 +2129,30 @@
     case glslang::EOpConstructDVec2:
     case glslang::EOpConstructDVec3:
     case glslang::EOpConstructDVec4:
-#ifdef AMD_EXTENSIONS
     case glslang::EOpConstructFloat16:
     case glslang::EOpConstructF16Vec2:
     case glslang::EOpConstructF16Vec3:
     case glslang::EOpConstructF16Vec4:
-#endif
     case glslang::EOpConstructBool:
     case glslang::EOpConstructBVec2:
     case glslang::EOpConstructBVec3:
     case glslang::EOpConstructBVec4:
+    case glslang::EOpConstructInt8:
+    case glslang::EOpConstructI8Vec2:
+    case glslang::EOpConstructI8Vec3:
+    case glslang::EOpConstructI8Vec4:
+    case glslang::EOpConstructUint8:
+    case glslang::EOpConstructU8Vec2:
+    case glslang::EOpConstructU8Vec3:
+    case glslang::EOpConstructU8Vec4:
+    case glslang::EOpConstructInt16:
+    case glslang::EOpConstructI16Vec2:
+    case glslang::EOpConstructI16Vec3:
+    case glslang::EOpConstructI16Vec4:
+    case glslang::EOpConstructUint16:
+    case glslang::EOpConstructU16Vec2:
+    case glslang::EOpConstructU16Vec3:
+    case glslang::EOpConstructU16Vec4:
     case glslang::EOpConstructInt:
     case glslang::EOpConstructIVec2:
     case glslang::EOpConstructIVec3:
@@ -1578,6 +2172,7 @@
     case glslang::EOpConstructStruct:
     case glslang::EOpConstructTextureSampler:
     {
+        builder.setLine(node->getLoc().line);
         std::vector<spv::Id> arguments;
         translateArguments(*node, arguments);
         spv::Id constructed;
@@ -1649,14 +2244,24 @@
     case glslang::EOpMemoryBarrierImage:
     case glslang::EOpMemoryBarrierShared:
     case glslang::EOpGroupMemoryBarrier:
+    case glslang::EOpDeviceMemoryBarrier:
     case glslang::EOpAllMemoryBarrierWithGroupSync:
-    case glslang::EOpGroupMemoryBarrierWithGroupSync:
+    case glslang::EOpDeviceMemoryBarrierWithGroupSync:
     case glslang::EOpWorkgroupMemoryBarrier:
     case glslang::EOpWorkgroupMemoryBarrierWithGroupSync:
+    case glslang::EOpSubgroupBarrier:
+    case glslang::EOpSubgroupMemoryBarrier:
+    case glslang::EOpSubgroupMemoryBarrierBuffer:
+    case glslang::EOpSubgroupMemoryBarrierImage:
+    case glslang::EOpSubgroupMemoryBarrierShared:
         noReturnValue = true;
         // These all have 0 operands and will naturally finish up in the code below for 0 operands
         break;
 
+    case glslang::EOpAtomicStore:
+        noReturnValue = true;
+        // fallthrough
+    case glslang::EOpAtomicLoad:
     case glslang::EOpAtomicAdd:
     case glslang::EOpAtomicMin:
     case glslang::EOpAtomicMax:
@@ -1668,6 +2273,30 @@
         atomic = true;
         break;
 
+    case glslang::EOpAtomicCounterAdd:
+    case glslang::EOpAtomicCounterSubtract:
+    case glslang::EOpAtomicCounterMin:
+    case glslang::EOpAtomicCounterMax:
+    case glslang::EOpAtomicCounterAnd:
+    case glslang::EOpAtomicCounterOr:
+    case glslang::EOpAtomicCounterXor:
+    case glslang::EOpAtomicCounterExchange:
+    case glslang::EOpAtomicCounterCompSwap:
+        builder.addExtension("SPV_KHR_shader_atomic_counter_ops");
+        builder.addCapability(spv::CapabilityAtomicStorageOps);
+        atomic = true;
+        break;
+
+#ifdef NV_EXTENSIONS
+    case glslang::EOpIgnoreIntersectionNV:
+    case glslang::EOpTerminateRayNV:
+    case glslang::EOpTraceNV:
+    case glslang::EOpExecuteCallableNV:
+    case glslang::EOpWritePackedPrimitiveIndices4x8NV:
+        noReturnValue = true;
+        break;
+#endif
+
     default:
         break;
     }
@@ -1688,7 +2317,11 @@
         right->traverse(this);
         spv::Id rightId = accessChainLoad(right->getType());
 
-        result = createBinaryOperation(binOp, precision, TranslateNoContractionDecoration(node->getType().getQualifier()),
+        builder.setLine(node->getLoc().line);
+        OpDecorations decorations = { precision,
+                                      TranslateNoContractionDecoration(node->getType().getQualifier()),
+                                      TranslateNonUniformDecoration(node->getType().getQualifier()) };
+        result = createBinaryOperation(binOp, decorations,
                                        resultType(), leftId, rightId,
                                        left->getType().getBasicType(), reduceComparison);
 
@@ -1737,6 +2370,17 @@
         case glslang::EOpAtomicXor:
         case glslang::EOpAtomicExchange:
         case glslang::EOpAtomicCompSwap:
+        case glslang::EOpAtomicLoad:
+        case glslang::EOpAtomicStore:
+        case glslang::EOpAtomicCounterAdd:
+        case glslang::EOpAtomicCounterSubtract:
+        case glslang::EOpAtomicCounterMin:
+        case glslang::EOpAtomicCounterMax:
+        case glslang::EOpAtomicCounterAnd:
+        case glslang::EOpAtomicCounterOr:
+        case glslang::EOpAtomicCounterXor:
+        case glslang::EOpAtomicCounterExchange:
+        case glslang::EOpAtomicCounterCompSwap:
             if (arg == 0)
                 lvalue = true;
             break;
@@ -1760,10 +2404,13 @@
             glslangOperands[arg]->traverse(this);
         if (lvalue)
             operands.push_back(builder.accessChainGetLValue());
-        else
+        else {
+            builder.setLine(node->getLoc().line);
             operands.push_back(accessChainLoad(glslangOperands[arg]->getAsTyped()->getType()));
+        }
     }
 
+    builder.setLine(node->getLoc().line);
     if (atomic) {
         // Handle all atomics
         result = createAtomicOperation(node->getOp(), precision, resultType(), operands, node->getBasicType());
@@ -1774,11 +2421,15 @@
             result = createNoArgOperation(node->getOp(), precision, resultType());
             break;
         case 1:
-            result = createUnaryOperation(
-                node->getOp(), precision,
-                TranslateNoContractionDecoration(node->getType().getQualifier()),
-                resultType(), operands.front(),
-                glslangOperands[0]->getAsTyped()->getBasicType());
+            {
+                OpDecorations decorations = { precision, 
+                                              TranslateNoContractionDecoration(node->getType().getQualifier()),
+                                              TranslateNonUniformDecoration(node->getType().getQualifier()) };
+                result = createUnaryOperation(
+                    node->getOp(), decorations,
+                    resultType(), operands.front(),
+                    glslangOperands[0]->getAsTyped()->getBasicType());
+            }
             break;
         default:
             result = createMiscOperation(node->getOp(), precision, resultType(), operands, node->getBasicType());
@@ -1812,18 +2463,29 @@
 // next layer copies r-values into memory to use the access-chain mechanism
 bool TGlslangToSpvTraverser::visitSelection(glslang::TVisit /* visit */, glslang::TIntermSelection* node)
 {
-    // See if it simple and safe to generate OpSelect instead of using control flow.
-    // Crucially, side effects must be avoided, and there are performance trade-offs.
-    // Return true if good idea (and safe) for OpSelect, false otherwise.
-    const auto selectPolicy = [&]() -> bool {
-        if ((!node->getType().isScalar() && !node->getType().isVector()) ||
-            node->getBasicType() == glslang::EbtVoid)
-            return false;
-
+    // See if it simple and safe, or required, to execute both sides.
+    // Crucially, side effects must be either semantically required or avoided,
+    // and there are performance trade-offs.
+    // Return true if required or a good idea (and safe) to execute both sides,
+    // false otherwise.
+    const auto bothSidesPolicy = [&]() -> bool {
+        // do we have both sides?
         if (node->getTrueBlock()  == nullptr ||
             node->getFalseBlock() == nullptr)
             return false;
 
+        // required? (unless we write additional code to look for side effects
+        // and make performance trade-offs if none are present)
+        if (!node->getShortCircuit())
+            return true;
+
+        // if not required to execute both, decide based on performance/practicality...
+
+        // see if OpSelect can handle it
+        if ((!node->getType().isScalar() && !node->getType().isVector()) ||
+            node->getBasicType() == glslang::EbtVoid)
+            return false;
+
         assert(node->getType() == node->getTrueBlock() ->getAsTyped()->getType() &&
                node->getType() == node->getFalseBlock()->getAsTyped()->getType());
 
@@ -1836,79 +2498,113 @@
                operandOkay(node->getFalseBlock()->getAsTyped());
     };
 
-    // Emit OpSelect for this selection.
-    const auto handleAsOpSelect = [&]() {
-        node->getCondition()->traverse(this);
-        spv::Id condition = accessChainLoad(node->getCondition()->getType());
+    spv::Id result = spv::NoResult; // upcoming result selecting between trueValue and falseValue
+    // emit the condition before doing anything with selection
+    node->getCondition()->traverse(this);
+    spv::Id condition = accessChainLoad(node->getCondition()->getType());
+
+    // Find a way of executing both sides and selecting the right result.
+    const auto executeBothSides = [&]() -> void {
+        // execute both sides
         node->getTrueBlock()->traverse(this);
         spv::Id trueValue = accessChainLoad(node->getTrueBlock()->getAsTyped()->getType());
         node->getFalseBlock()->traverse(this);
         spv::Id falseValue = accessChainLoad(node->getTrueBlock()->getAsTyped()->getType());
 
-        // smear condition to vector, if necessary (AST is always scalar)
-        if (builder.isVector(trueValue))
-            condition = builder.smearScalar(spv::NoPrecision, condition, 
-                                            builder.makeVectorType(builder.makeBoolType(),
-                                                                   builder.getNumComponents(trueValue)));
+        builder.setLine(node->getLoc().line);
 
-        spv::Id select = builder.createTriOp(spv::OpSelect,
-                                             convertGlslangToSpvType(node->getType()), condition,
-                                                                     trueValue, falseValue);
-        builder.clearAccessChain();
-        builder.setAccessChainRValue(select);
+        // done if void
+        if (node->getBasicType() == glslang::EbtVoid)
+            return;
+
+        // emit code to select between trueValue and falseValue
+
+        // see if OpSelect can handle it
+        if (node->getType().isScalar() || node->getType().isVector()) {
+            // Emit OpSelect for this selection.
+
+            // smear condition to vector, if necessary (AST is always scalar)
+            if (builder.isVector(trueValue))
+                condition = builder.smearScalar(spv::NoPrecision, condition, 
+                                                builder.makeVectorType(builder.makeBoolType(),
+                                                                       builder.getNumComponents(trueValue)));
+
+            // OpSelect
+            result = builder.createTriOp(spv::OpSelect,
+                                         convertGlslangToSpvType(node->getType()), condition,
+                                                                 trueValue, falseValue);
+
+            builder.clearAccessChain();
+            builder.setAccessChainRValue(result);
+        } else {
+            // We need control flow to select the result.
+            // TODO: Once SPIR-V OpSelect allows arbitrary types, eliminate this path.
+            result = builder.createVariable(spv::StorageClassFunction, convertGlslangToSpvType(node->getType()));
+
+            // Selection control:
+            const spv::SelectionControlMask control = TranslateSelectionControl(*node);
+
+            // make an "if" based on the value created by the condition
+            spv::Builder::If ifBuilder(condition, control, builder);
+
+            // emit the "then" statement
+            builder.createStore(trueValue, result);
+            ifBuilder.makeBeginElse();
+            // emit the "else" statement
+            builder.createStore(falseValue, result);
+
+            // finish off the control flow
+            ifBuilder.makeEndIf();
+
+            builder.clearAccessChain();
+            builder.setAccessChainLValue(result);
+        }
     };
 
-    // Try for OpSelect
+    // Execute the one side needed, as per the condition
+    const auto executeOneSide = [&]() {
+        // Always emit control flow.
+        if (node->getBasicType() != glslang::EbtVoid)
+            result = builder.createVariable(spv::StorageClassFunction, convertGlslangToSpvType(node->getType()));
 
-    if (selectPolicy()) {
+        // Selection control:
+        const spv::SelectionControlMask control = TranslateSelectionControl(*node);
+
+        // make an "if" based on the value created by the condition
+        spv::Builder::If ifBuilder(condition, control, builder);
+
+        // emit the "then" statement
+        if (node->getTrueBlock() != nullptr) {
+            node->getTrueBlock()->traverse(this);
+            if (result != spv::NoResult)
+                builder.createStore(accessChainLoad(node->getTrueBlock()->getAsTyped()->getType()), result);
+        }
+
+        if (node->getFalseBlock() != nullptr) {
+            ifBuilder.makeBeginElse();
+            // emit the "else" statement
+            node->getFalseBlock()->traverse(this);
+            if (result != spv::NoResult)
+                builder.createStore(accessChainLoad(node->getFalseBlock()->getAsTyped()->getType()), result);
+        }
+
+        // finish off the control flow
+        ifBuilder.makeEndIf();
+
+        if (result != spv::NoResult) {
+            builder.clearAccessChain();
+            builder.setAccessChainLValue(result);
+        }
+    };
+
+    // Try for OpSelect (or a requirement to execute both sides)
+    if (bothSidesPolicy()) {
         SpecConstantOpModeGuard spec_constant_op_mode_setter(&builder);
         if (node->getType().getQualifier().isSpecConstant())
             spec_constant_op_mode_setter.turnOnSpecConstantOpMode();
-
-        handleAsOpSelect();
-        return false;
-    }
-
-    // Instead, emit control flow...
-
-    // Don't handle results as temporaries, because there will be two names
-    // and better to leave SSA to later passes.
-    spv::Id result = (node->getBasicType() == glslang::EbtVoid)
-                        ? spv::NoResult
-                        : builder.createVariable(spv::StorageClassFunction, convertGlslangToSpvType(node->getType()));
-
-    // emit the condition before doing anything with selection
-    node->getCondition()->traverse(this);
-
-    // make an "if" based on the value created by the condition
-    spv::Builder::If ifBuilder(accessChainLoad(node->getCondition()->getType()), builder);
-
-    // emit the "then" statement
-    if (node->getTrueBlock() != nullptr) {
-        node->getTrueBlock()->traverse(this);
-        if (result != spv::NoResult)
-             builder.createStore(accessChainLoad(node->getTrueBlock()->getAsTyped()->getType()), result);
-    }
-
-    if (node->getFalseBlock() != nullptr) {
-        ifBuilder.makeBeginElse();
-        // emit the "else" statement
-        node->getFalseBlock()->traverse(this);
-        if (result != spv::NoResult)
-            builder.createStore(accessChainLoad(node->getFalseBlock()->getAsTyped()->getType()), result);
-    }
-
-    // finish off the control flow
-    ifBuilder.makeEndIf();
-
-    if (result != spv::NoResult) {
-        // GLSL only has r-values as the result of a :?, but
-        // if we have an l-value, that can be more efficient if it will
-        // become the base of a complex r-value expression, because the
-        // next layer copies r-values into memory to use the access-chain mechanism
-        builder.clearAccessChain();
-        builder.setAccessChainLValue(result);
-    }
+        executeBothSides();
+    } else
+        executeOneSide();
 
     return false;
 }
@@ -1919,6 +2615,9 @@
     node->getCondition()->traverse(this);
     spv::Id selector = accessChainLoad(node->getCondition()->getAsTyped()->getType());
 
+    // Selection control:
+    const spv::SelectionControlMask control = TranslateSwitchControl(*node);
+
     // browse the children to sort out code segments
     int defaultSegment = -1;
     std::vector<TIntermNode*> codeSegments;
@@ -1944,7 +2643,7 @@
 
     // make the switch statement
     std::vector<spv::Block*> segmentBlocks; // returned, as the blocks allocated in the call
-    builder.makeSwitch(selector, (int)codeSegments.size(), caseValues, valueIndexToSegment, defaultSegment, segmentBlocks);
+    builder.makeSwitch(selector, control, (int)codeSegments.size(), caseValues, valueIndexToSegment, defaultSegment, segmentBlocks);
 
     // emit all the code in the segments
     breakForLoop.push(false);
@@ -1977,9 +2676,8 @@
     builder.createBranch(&blocks.head);
 
     // Loop control:
-    const spv::LoopControlMask control = TranslateLoopControl(node->getLoopControl());
-
-    // TODO: dependency length
+    unsigned int dependencyLength = glslang::TIntermLoop::dependencyInfinite;
+    const spv::LoopControlMask control = TranslateLoopControl(*node, dependencyLength);
 
     // Spec requires back edges to target header blocks, and every header block
     // must dominate its merge block.  Make a header block first to ensure these
@@ -1987,16 +2685,16 @@
     // by a block-ending branch.  But we don't want to put any other body/test
     // instructions in it, since the body/test may have arbitrary instructions,
     // including merges of its own.
+    builder.setLine(node->getLoc().line);
     builder.setBuildPoint(&blocks.head);
-    builder.createLoopMerge(&blocks.merge, &blocks.continue_target, control);
+    builder.createLoopMerge(&blocks.merge, &blocks.continue_target, control, dependencyLength);
     if (node->testFirst() && node->getTest()) {
         spv::Block& test = builder.makeNewBlock();
         builder.createBranch(&test);
 
         builder.setBuildPoint(&test);
         node->getTest()->traverse(this);
-        spv::Id condition =
-            accessChainLoad(node->getTest()->getType());
+        spv::Id condition = accessChainLoad(node->getTest()->getType());
         builder.createConditionalBranch(condition, &blocks.body, &blocks.merge);
 
         builder.setBuildPoint(&blocks.body);
@@ -2011,6 +2709,7 @@
             node->getTerminal()->traverse(this);
         builder.createBranch(&blocks.head);
     } else {
+        builder.setLine(node->getLoc().line);
         builder.createBranch(&blocks.body);
 
         breakForLoop.push(true);
@@ -2045,6 +2744,8 @@
     if (node->getExpression())
         node->getExpression()->traverse(this);
 
+    builder.setLine(node->getLoc().line);
+
     switch (node->getFlowOp()) {
     case glslang::EOpKill:
         builder.makeDiscard();
@@ -2090,30 +2791,59 @@
     // can still have a mapping to a SPIR-V Id.
     // This includes specialization constants.
     if (node->getQualifier().isConstant()) {
-        return createSpvConstant(*node);
+        spv::Id result = createSpvConstant(*node);
+        if (result != spv::NoResult)
+            return result;
     }
 
     // Now, handle actual variables
     spv::StorageClass storageClass = TranslateStorageClass(node->getType());
     spv::Id spvType = convertGlslangToSpvType(node->getType());
 
-#ifdef AMD_EXTENSIONS
-    const bool contains16BitType = node->getType().containsBasicType(glslang::EbtFloat16);
+    const bool contains16BitType = node->getType().containsBasicType(glslang::EbtFloat16) ||
+                                   node->getType().containsBasicType(glslang::EbtInt16)   ||
+                                   node->getType().containsBasicType(glslang::EbtUint16);
     if (contains16BitType) {
-        if (storageClass == spv::StorageClassInput || storageClass == spv::StorageClassOutput) {
-            builder.addExtension(spv::E_SPV_KHR_16bit_storage);
+        switch (storageClass) {
+        case spv::StorageClassInput:
+        case spv::StorageClassOutput:
+            addPre13Extension(spv::E_SPV_KHR_16bit_storage);
             builder.addCapability(spv::CapabilityStorageInputOutput16);
-        } else if (storageClass == spv::StorageClassPushConstant) {
-            builder.addExtension(spv::E_SPV_KHR_16bit_storage);
+            break;
+        case spv::StorageClassPushConstant:
+            addPre13Extension(spv::E_SPV_KHR_16bit_storage);
             builder.addCapability(spv::CapabilityStoragePushConstant16);
-        } else if (storageClass == spv::StorageClassUniform) {
-            builder.addExtension(spv::E_SPV_KHR_16bit_storage);
-            builder.addCapability(spv::CapabilityStorageUniform16);
+            break;
+        case spv::StorageClassUniform:
+            addPre13Extension(spv::E_SPV_KHR_16bit_storage);
             if (node->getType().getQualifier().storage == glslang::EvqBuffer)
                 builder.addCapability(spv::CapabilityStorageUniformBufferBlock16);
+            else
+                builder.addCapability(spv::CapabilityStorageUniform16);
+            break;
+        case spv::StorageClassStorageBuffer:
+            addPre13Extension(spv::E_SPV_KHR_16bit_storage);
+            builder.addCapability(spv::CapabilityStorageUniformBufferBlock16);
+            break;
+        default:
+            break;
         }
     }
-#endif
+
+    const bool contains8BitType = node->getType().containsBasicType(glslang::EbtInt8)   ||
+                                  node->getType().containsBasicType(glslang::EbtUint8);
+    if (contains8BitType) {
+        if (storageClass == spv::StorageClassPushConstant) {
+            builder.addExtension(spv::E_SPV_KHR_8bit_storage);
+            builder.addCapability(spv::CapabilityStoragePushConstant8);
+        } else if (storageClass == spv::StorageClassUniform) {
+            builder.addExtension(spv::E_SPV_KHR_8bit_storage);
+            builder.addCapability(spv::CapabilityUniformAndStorageBuffer8BitAccess);
+        } else if (storageClass == spv::StorageClassStorageBuffer) {
+            builder.addExtension(spv::E_SPV_KHR_8bit_storage);
+            builder.addCapability(spv::CapabilityStorageBuffer8BitAccess);
+        }
+    }
 
     const char* name = node->getName().c_str();
     if (glslang::IsAnonymous(name))
@@ -2127,6 +2857,12 @@
 {
     switch (sampler.type) {
         case glslang::EbtFloat:    return builder.makeFloatType(32);
+#ifdef AMD_EXTENSIONS
+        case glslang::EbtFloat16:
+            builder.addExtension(spv::E_SPV_AMD_gpu_shader_half_float_fetch);
+            builder.addCapability(spv::CapabilityFloat16ImageAMD);
+            return builder.makeFloatType(16);
+#endif
         case glslang::EbtInt:      return builder.makeIntType(32);
         case glslang::EbtUint:     return builder.makeUintType(32);
         default:
@@ -2169,13 +2905,14 @@
 // layout state rooted from the top-level type.
 spv::Id TGlslangToSpvTraverser::convertGlslangToSpvType(const glslang::TType& type)
 {
-    return convertGlslangToSpvType(type, getExplicitLayout(type), type.getQualifier());
+    return convertGlslangToSpvType(type, getExplicitLayout(type), type.getQualifier(), false);
 }
 
 // Do full recursive conversion of an arbitrary glslang type to a SPIR-V Id.
 // explicitLayout can be kept the same throughout the hierarchical recursive walk.
 // Mutually recursive with convertGlslangStructToSpvType().
-spv::Id TGlslangToSpvTraverser::convertGlslangToSpvType(const glslang::TType& type, glslang::TLayoutPacking explicitLayout, const glslang::TQualifier& qualifier)
+spv::Id TGlslangToSpvTraverser::convertGlslangToSpvType(const glslang::TType& type,
+    glslang::TLayoutPacking explicitLayout, const glslang::TQualifier& qualifier, bool lastBufferBlockMember)
 {
     spv::Id spvType = spv::NoResult;
 
@@ -2190,12 +2927,9 @@
     case glslang::EbtDouble:
         spvType = builder.makeFloatType(64);
         break;
-#ifdef AMD_EXTENSIONS
     case glslang::EbtFloat16:
-        builder.addExtension(spv::E_SPV_AMD_gpu_shader_half_float);
         spvType = builder.makeFloatType(16);
         break;
-#endif
     case glslang::EbtBool:
         // "transparent" bool doesn't exist in SPIR-V.  The GLSL convention is
         // a 32-bit int where non-0 means true.
@@ -2204,6 +2938,18 @@
         else
             spvType = builder.makeBoolType();
         break;
+    case glslang::EbtInt8:
+        spvType = builder.makeIntType(8);
+        break;
+    case glslang::EbtUint8:
+        spvType = builder.makeUintType(8);
+        break;
+    case glslang::EbtInt16:
+        spvType = builder.makeIntType(16);
+        break;
+    case glslang::EbtUint16:
+        spvType = builder.makeUintType(16);
+        break;
     case glslang::EbtInt:
         spvType = builder.makeIntType(32);
         break;
@@ -2211,17 +2957,20 @@
         spvType = builder.makeUintType(32);
         break;
     case glslang::EbtInt64:
-        builder.addCapability(spv::CapabilityInt64);
         spvType = builder.makeIntType(64);
         break;
     case glslang::EbtUint64:
-        builder.addCapability(spv::CapabilityInt64);
         spvType = builder.makeUintType(64);
         break;
     case glslang::EbtAtomicUint:
         builder.addCapability(spv::CapabilityAtomicStorage);
         spvType = builder.makeUintType(32);
         break;
+#ifdef NV_EXTENSIONS
+    case glslang::EbtAccStructNV:
+        spvType = builder.makeAccelerationStructureNVType();
+        break;
+#endif
     case glslang::EbtSampler:
         {
             const glslang::TSampler& sampler = type.getSampler();
@@ -2281,8 +3030,8 @@
                 // Use a dummy glslang type for querying internal strides of
                 // arrays of arrays, but using just a one-dimensional array.
                 glslang::TType simpleArrayType(type, 0); // deference type of the array
-                while (simpleArrayType.getArraySizes().getNumDims() > 1)
-                    simpleArrayType.getArraySizes().dereference();
+                while (simpleArrayType.getArraySizes()->getNumDims() > 1)
+                    simpleArrayType.getArraySizes()->dereference();
 
                 // Will compute the higher-order strides here, rather than making a whole
                 // pile of types and doing repetitive recursion on their contents.
@@ -2304,12 +3053,16 @@
                 stride = getArrayStride(type, explicitLayout, qualifier.layoutMatrix);
         }
 
-        // Do the outer dimension, which might not be known for a runtime-sized array
-        if (type.isRuntimeSizedArray()) {
-            spvType = builder.makeRuntimeArray(spvType);
-        } else {
-            assert(type.getOuterArraySize() > 0);
+        // Do the outer dimension, which might not be known for a runtime-sized array.
+        // (Unsized arrays that survive through linking will be runtime-sized arrays)
+        if (type.isSizedArray())
             spvType = builder.makeArrayType(spvType, makeArraySizeId(*type.getArraySizes(), 0), stride);
+        else {
+            if (!lastBufferBlockMember) {
+                builder.addExtension("SPV_EXT_descriptor_indexing");
+                builder.addCapability(spv::CapabilityRuntimeDescriptorArrayEXT);
+            }
+            spvType = builder.makeRuntimeArray(spvType);
         }
         if (stride > 0)
             builder.addDecoration(spvType, spv::DecorationArrayStride, stride);
@@ -2324,23 +3077,28 @@
 //
 bool TGlslangToSpvTraverser::filterMember(const glslang::TType& member)
 {
+#ifdef NV_EXTENSIONS
     auto& extensions = glslangIntermediate->getRequestedExtensions();
 
-    if (member.getFieldName() == "gl_ViewportMask" &&
-        extensions.find("GL_NV_viewport_array2") == extensions.end())
-        return true;
     if (member.getFieldName() == "gl_SecondaryViewportMaskNV" &&
         extensions.find("GL_NV_stereo_view_rendering") == extensions.end())
         return true;
     if (member.getFieldName() == "gl_SecondaryPositionNV" &&
         extensions.find("GL_NV_stereo_view_rendering") == extensions.end())
         return true;
-    if (member.getFieldName() == "gl_PositionPerViewNV" &&
-        extensions.find("GL_NVX_multiview_per_view_attributes") == extensions.end())
-        return true;
-    if (member.getFieldName() == "gl_ViewportMaskPerViewNV" &&
-        extensions.find("GL_NVX_multiview_per_view_attributes") == extensions.end())
-        return true;
+
+    if (glslangIntermediate->getStage() != EShLangMeshNV) {
+        if (member.getFieldName() == "gl_ViewportMask" &&
+            extensions.find("GL_NV_viewport_array2") == extensions.end())
+            return true;
+        if (member.getFieldName() == "gl_PositionPerViewNV" &&
+            extensions.find("GL_NVX_multiview_per_view_attributes") == extensions.end())
+            return true;
+        if (member.getFieldName() == "gl_ViewportMaskPerViewNV" &&
+            extensions.find("GL_NVX_multiview_per_view_attributes") == extensions.end())
+            return true;
+    }
+#endif
 
     return false;
 };
@@ -2356,7 +3114,6 @@
     // Create a vector of struct types for SPIR-V to consume
     std::vector<spv::Id> spvMembers;
     int memberDelta = 0;  // how much the member's index changes from glslang to SPIR-V, normally 0, except sometimes for blocks
-    int locationOffset = 0;  // for use across struct members, when they are called recursively
     for (int i = 0; i < (int)glslangMembers->size(); i++) {
         glslang::TType& glslangMember = *(*glslangMembers)[i].type;
         if (glslangMember.hiddenMember()) {
@@ -2373,14 +3130,15 @@
             glslang::TQualifier memberQualifier = glslangMember.getQualifier();
             InheritQualifiers(memberQualifier, qualifier);
 
-            // manually inherit location; it's more complex
+            // manually inherit location
             if (! memberQualifier.hasLocation() && qualifier.hasLocation())
-                memberQualifier.layoutLocation = qualifier.layoutLocation + locationOffset;
-            if (qualifier.hasLocation())
-                locationOffset += glslangIntermediate->computeTypeLocationSize(glslangMember);
+                memberQualifier.layoutLocation = qualifier.layoutLocation;
 
             // recurse
-            spvMembers.push_back(convertGlslangToSpvType(glslangMember, explicitLayout, memberQualifier));
+            bool lastBufferBlockMember = qualifier.storage == glslang::EvqBuffer &&
+                                         i == (int)glslangMembers->size() - 1;
+            spvMembers.push_back(
+                convertGlslangToSpvType(glslangMember, explicitLayout, memberQualifier, lastBufferBlockMember));
         }
     }
 
@@ -2418,114 +3176,113 @@
         InheritQualifiers(memberQualifier, qualifier);
 
         // using -1 above to indicate a hidden member
-        if (member >= 0) {
-            builder.addMemberName(spvType, member, glslangMember.getFieldName().c_str());
-            addMemberDecoration(spvType, member, TranslateLayoutDecoration(glslangMember, memberQualifier.layoutMatrix));
-            addMemberDecoration(spvType, member, TranslatePrecisionDecoration(glslangMember));
-            // Add interpolation and auxiliary storage decorations only to top-level members of Input and Output storage classes
-            if (type.getQualifier().storage == glslang::EvqVaryingIn ||
-                type.getQualifier().storage == glslang::EvqVaryingOut) {
-                if (type.getBasicType() == glslang::EbtBlock ||
-                    glslangIntermediate->getSource() == glslang::EShSourceHlsl) {
-                    addMemberDecoration(spvType, member, TranslateInterpolationDecoration(memberQualifier));
-                    addMemberDecoration(spvType, member, TranslateAuxiliaryStorageDecoration(memberQualifier));
-                }
+        if (member < 0)
+            continue;
+
+        builder.addMemberName(spvType, member, glslangMember.getFieldName().c_str());
+        builder.addMemberDecoration(spvType, member,
+                                    TranslateLayoutDecoration(glslangMember, memberQualifier.layoutMatrix));
+        builder.addMemberDecoration(spvType, member, TranslatePrecisionDecoration(glslangMember));
+        // Add interpolation and auxiliary storage decorations only to
+        // top-level members of Input and Output storage classes
+        if (type.getQualifier().storage == glslang::EvqVaryingIn ||
+            type.getQualifier().storage == glslang::EvqVaryingOut) {
+            if (type.getBasicType() == glslang::EbtBlock ||
+                glslangIntermediate->getSource() == glslang::EShSourceHlsl) {
+                builder.addMemberDecoration(spvType, member, TranslateInterpolationDecoration(memberQualifier));
+                builder.addMemberDecoration(spvType, member, TranslateAuxiliaryStorageDecoration(memberQualifier));
+#ifdef NV_EXTENSIONS
+                addMeshNVDecoration(spvType, member, memberQualifier);
+#endif
             }
-            addMemberDecoration(spvType, member, TranslateInvariantDecoration(memberQualifier));
+        }
+        builder.addMemberDecoration(spvType, member, TranslateInvariantDecoration(memberQualifier));
 
-            if (qualifier.storage == glslang::EvqBuffer) {
-                std::vector<spv::Decoration> memory;
-                TranslateMemoryDecoration(memberQualifier, memory);
-                for (unsigned int i = 0; i < memory.size(); ++i)
-                    addMemberDecoration(spvType, member, memory[i]);
-            }
+        if (type.getBasicType() == glslang::EbtBlock &&
+            qualifier.storage == glslang::EvqBuffer) {
+            // Add memory decorations only to top-level members of shader storage block
+            std::vector<spv::Decoration> memory;
+            TranslateMemoryDecoration(memberQualifier, memory, glslangIntermediate->usingVulkanMemoryModel());
+            for (unsigned int i = 0; i < memory.size(); ++i)
+                builder.addMemberDecoration(spvType, member, memory[i]);
+        }
 
-            // Compute location decoration; tricky based on whether inheritance is at play and
-            // what kind of container we have, etc.
-            // TODO: This algorithm (and it's cousin above doing almost the same thing) should
-            //       probably move to the linker stage of the front end proper, and just have the
-            //       answer sitting already distributed throughout the individual member locations.
-            int location = -1;                // will only decorate if present or inherited
-            // Ignore member locations if the container is an array, as that's
-            // ill-specified and decisions have been made to not allow this anyway.
-            // The object itself must have a location, and that comes out from decorating the object,
-            // not the type (this code decorates types).
-            if (! type.isArray()) {
-                if (memberQualifier.hasLocation()) { // no inheritance, or override of inheritance
-                    // struct members should not have explicit locations
-                    assert(type.getBasicType() != glslang::EbtStruct);
-                    location = memberQualifier.layoutLocation;
-                } else if (type.getBasicType() != glslang::EbtBlock) {
-                    // If it is a not a Block, (...) Its members are assigned consecutive locations (...)
-                    // The members, and their nested types, must not themselves have Location decorations.
-                } else if (qualifier.hasLocation()) // inheritance
-                    location = qualifier.layoutLocation + locationOffset;
-            }
-            if (location >= 0)
-                builder.addMemberDecoration(spvType, member, spv::DecorationLocation, location);
+        // Location assignment was already completed correctly by the front end,
+        // just track whether a member needs to be decorated.
+        // Ignore member locations if the container is an array, as that's
+        // ill-specified and decisions have been made to not allow this.
+        if (! type.isArray() && memberQualifier.hasLocation())
+            builder.addMemberDecoration(spvType, member, spv::DecorationLocation, memberQualifier.layoutLocation);
 
-            if (qualifier.hasLocation())      // track for upcoming inheritance
-                locationOffset += glslangIntermediate->computeTypeLocationSize(glslangMember);
+        if (qualifier.hasLocation())      // track for upcoming inheritance
+            locationOffset += glslangIntermediate->computeTypeLocationSize(
+                                            glslangMember, glslangIntermediate->getStage());
 
-            // component, XFB, others
-            if (glslangMember.getQualifier().hasComponent())
-                builder.addMemberDecoration(spvType, member, spv::DecorationComponent, glslangMember.getQualifier().layoutComponent);
-            if (glslangMember.getQualifier().hasXfbOffset())
-                builder.addMemberDecoration(spvType, member, spv::DecorationOffset, glslangMember.getQualifier().layoutXfbOffset);
-            else if (explicitLayout != glslang::ElpNone) {
-                // figure out what to do with offset, which is accumulating
-                int nextOffset;
-                updateMemberOffset(type, glslangMember, offset, nextOffset, explicitLayout, memberQualifier.layoutMatrix);
-                if (offset >= 0)
-                    builder.addMemberDecoration(spvType, member, spv::DecorationOffset, offset);
-                offset = nextOffset;
-            }
+        // component, XFB, others
+        if (glslangMember.getQualifier().hasComponent())
+            builder.addMemberDecoration(spvType, member, spv::DecorationComponent,
+                                        glslangMember.getQualifier().layoutComponent);
+        if (glslangMember.getQualifier().hasXfbOffset())
+            builder.addMemberDecoration(spvType, member, spv::DecorationOffset,
+                                        glslangMember.getQualifier().layoutXfbOffset);
+        else if (explicitLayout != glslang::ElpNone) {
+            // figure out what to do with offset, which is accumulating
+            int nextOffset;
+            updateMemberOffset(type, glslangMember, offset, nextOffset, explicitLayout, memberQualifier.layoutMatrix);
+            if (offset >= 0)
+                builder.addMemberDecoration(spvType, member, spv::DecorationOffset, offset);
+            offset = nextOffset;
+        }
 
-            if (glslangMember.isMatrix() && explicitLayout != glslang::ElpNone)
-                builder.addMemberDecoration(spvType, member, spv::DecorationMatrixStride, getMatrixStride(glslangMember, explicitLayout, memberQualifier.layoutMatrix));
+        if (glslangMember.isMatrix() && explicitLayout != glslang::ElpNone)
+            builder.addMemberDecoration(spvType, member, spv::DecorationMatrixStride,
+                                        getMatrixStride(glslangMember, explicitLayout, memberQualifier.layoutMatrix));
 
-            // built-in variable decorations
-            spv::BuiltIn builtIn = TranslateBuiltInDecoration(glslangMember.getQualifier().builtIn, true);
-            if (builtIn != spv::BuiltInMax)
-                addMemberDecoration(spvType, member, spv::DecorationBuiltIn, (int)builtIn);
+        // built-in variable decorations
+        spv::BuiltIn builtIn = TranslateBuiltInDecoration(glslangMember.getQualifier().builtIn, true);
+        if (builtIn != spv::BuiltInMax)
+            builder.addMemberDecoration(spvType, member, spv::DecorationBuiltIn, (int)builtIn);
+
+        // nonuniform
+        builder.addMemberDecoration(spvType, member, TranslateNonUniformDecoration(glslangMember.getQualifier()));
+
+        if (glslangIntermediate->getHlslFunctionality1() && memberQualifier.semanticName != nullptr) {
+            builder.addExtension("SPV_GOOGLE_hlsl_functionality1");
+            builder.addMemberDecoration(spvType, member, (spv::Decoration)spv::DecorationHlslSemanticGOOGLE,
+                                        memberQualifier.semanticName);
+        }
 
 #ifdef NV_EXTENSIONS
-            if (builtIn == spv::BuiltInLayer) {
-                // SPV_NV_viewport_array2 extension
-                if (glslangMember.getQualifier().layoutViewportRelative){
-                    addMemberDecoration(spvType, member, (spv::Decoration)spv::DecorationViewportRelativeNV);
-                    builder.addCapability(spv::CapabilityShaderViewportMaskNV);
-                    builder.addExtension(spv::E_SPV_NV_viewport_array2);
-                }
-                if (glslangMember.getQualifier().layoutSecondaryViewportRelativeOffset != -2048){
-                    addMemberDecoration(spvType, member, (spv::Decoration)spv::DecorationSecondaryViewportRelativeNV, glslangMember.getQualifier().layoutSecondaryViewportRelativeOffset);
-                    builder.addCapability(spv::CapabilityShaderStereoViewNV);
-                    builder.addExtension(spv::E_SPV_NV_stereo_view_rendering);
-                }
+        if (builtIn == spv::BuiltInLayer) {
+            // SPV_NV_viewport_array2 extension
+            if (glslangMember.getQualifier().layoutViewportRelative){
+                builder.addMemberDecoration(spvType, member, (spv::Decoration)spv::DecorationViewportRelativeNV);
+                builder.addCapability(spv::CapabilityShaderViewportMaskNV);
+                builder.addExtension(spv::E_SPV_NV_viewport_array2);
             }
-            if (glslangMember.getQualifier().layoutPassthrough) {
-                addMemberDecoration(spvType, member, (spv::Decoration)spv::DecorationPassthroughNV);
-                builder.addCapability(spv::CapabilityGeometryShaderPassthroughNV);
-                builder.addExtension(spv::E_SPV_NV_geometry_shader_passthrough);
+            if (glslangMember.getQualifier().layoutSecondaryViewportRelativeOffset != -2048){
+                builder.addMemberDecoration(spvType, member,
+                                            (spv::Decoration)spv::DecorationSecondaryViewportRelativeNV,
+                                            glslangMember.getQualifier().layoutSecondaryViewportRelativeOffset);
+                builder.addCapability(spv::CapabilityShaderStereoViewNV);
+                builder.addExtension(spv::E_SPV_NV_stereo_view_rendering);
             }
-#endif
         }
+        if (glslangMember.getQualifier().layoutPassthrough) {
+            builder.addMemberDecoration(spvType, member, (spv::Decoration)spv::DecorationPassthroughNV);
+            builder.addCapability(spv::CapabilityGeometryShaderPassthroughNV);
+            builder.addExtension(spv::E_SPV_NV_geometry_shader_passthrough);
+        }
+#endif
     }
 
     // Decorate the structure
-    addDecoration(spvType, TranslateLayoutDecoration(type, qualifier.layoutMatrix));
-    addDecoration(spvType, TranslateBlockDecoration(type, glslangIntermediate->usingStorageBuffer()));
+    builder.addDecoration(spvType, TranslateLayoutDecoration(type, qualifier.layoutMatrix));
+    builder.addDecoration(spvType, TranslateBlockDecoration(type, glslangIntermediate->usingStorageBuffer()));
     if (type.getQualifier().hasStream() && glslangIntermediate->isMultiStream()) {
         builder.addCapability(spv::CapabilityGeometryStreams);
         builder.addDecoration(spvType, spv::DecorationStream, type.getQualifier().layoutStream);
     }
-    if (glslangIntermediate->getXfbMode()) {
-        builder.addCapability(spv::CapabilityTransformFeedback);
-        if (type.getQualifier().hasXfbStride())
-            builder.addDecoration(spvType, spv::DecorationXfbStride, type.getQualifier().layoutXfbStride);
-        if (type.getQualifier().hasXfbBuffer())
-            builder.addDecoration(spvType, spv::DecorationXfbBuffer, type.getQualifier().layoutXfbBuffer);
-    }
 }
 
 // Turn the expression forming the array size into an id.
@@ -2556,7 +3313,15 @@
 spv::Id TGlslangToSpvTraverser::accessChainLoad(const glslang::TType& type)
 {
     spv::Id nominalTypeId = builder.accessChainGetInferredType();
-    spv::Id loadedId = builder.accessChainLoad(TranslatePrecisionDecoration(type), nominalTypeId);
+
+    spv::Builder::AccessChain::CoherentFlags coherentFlags = builder.getAccessChain().coherentFlags;
+    coherentFlags |= TranslateCoherent(type);
+
+    spv::Id loadedId = builder.accessChainLoad(TranslatePrecisionDecoration(type),
+                                               TranslateNonUniformDecoration(type.getQualifier()),
+                                               nominalTypeId,
+                                               spv::MemoryAccessMask(TranslateMemoryAccess(coherentFlags) & ~spv::MemoryAccessMakePointerAvailableKHRMask),
+                                               TranslateMemoryScope(coherentFlags));
 
     // Need to convert to abstract types when necessary
     if (type.getBasicType() == glslang::EbtBool) {
@@ -2591,23 +3356,33 @@
             // Conversion for bool
             spv::Id boolType = builder.makeBoolType();
             if (nominalTypeId != boolType) {
+                // keep these outside arguments, for determinant order-of-evaluation
+                spv::Id one = builder.makeUintConstant(1);
                 spv::Id zero = builder.makeUintConstant(0);
-                spv::Id one  = builder.makeUintConstant(1);
                 rvalue = builder.createTriOp(spv::OpSelect, nominalTypeId, rvalue, one, zero);
-            }
+            } else if (builder.getTypeId(rvalue) != boolType)
+                rvalue = builder.createBinOp(spv::OpINotEqual, boolType, rvalue, builder.makeUintConstant(0));
         } else if (builder.isVectorType(nominalTypeId)) {
             // Conversion for bvec
             int vecSize = builder.getNumTypeComponents(nominalTypeId);
             spv::Id bvecType = builder.makeVectorType(builder.makeBoolType(), vecSize);
             if (nominalTypeId != bvecType) {
+                // keep these outside arguments, for determinant order-of-evaluation
+                spv::Id one = makeSmearedConstant(builder.makeUintConstant(1), vecSize);
                 spv::Id zero = makeSmearedConstant(builder.makeUintConstant(0), vecSize);
-                spv::Id one  = makeSmearedConstant(builder.makeUintConstant(1), vecSize);
                 rvalue = builder.createTriOp(spv::OpSelect, nominalTypeId, rvalue, one, zero);
-            }
+            } else if (builder.getTypeId(rvalue) != bvecType)
+                rvalue = builder.createBinOp(spv::OpINotEqual, bvecType, rvalue,
+                                             makeSmearedConstant(builder.makeUintConstant(0), vecSize));
         }
     }
 
-    builder.accessChainStore(rvalue);
+    spv::Builder::AccessChain::CoherentFlags coherentFlags = builder.getAccessChain().coherentFlags;
+    coherentFlags |= TranslateCoherent(type);
+
+    builder.accessChainStore(rvalue,
+                             spv::MemoryAccessMask(TranslateMemoryAccess(coherentFlags) & ~spv::MemoryAccessMakePointerVisibleKHRMask),
+                             TranslateMemoryScope(coherentFlags));
 }
 
 // For storing when types match at the glslang level, but not might match at the
@@ -2653,7 +3428,7 @@
             // set up the target storage
             builder.clearAccessChain();
             builder.setAccessChainLValue(lValue);
-            builder.accessChainPush(builder.makeIntConstant(index));
+            builder.accessChainPush(builder.makeIntConstant(index), TranslateCoherent(type));
 
             // store the member
             multiTypeStore(glslangElementType, elementRValue);
@@ -2673,7 +3448,7 @@
             // set up the target storage
             builder.clearAccessChain();
             builder.setAccessChainLValue(lValue);
-            builder.accessChainPush(builder.makeIntConstant(m));
+            builder.accessChainPush(builder.makeIntConstant(m), TranslateCoherent(type));
 
             // store the member
             multiTypeStore(glslangMemberType, memberRValue);
@@ -2690,15 +3465,17 @@
     if (type.getBasicType() != glslang::EbtBlock)
         return glslang::ElpNone;
 
-    // has to be a uniform or buffer block
+    // has to be a uniform or buffer block or task in/out blocks
     if (type.getQualifier().storage != glslang::EvqUniform &&
-        type.getQualifier().storage != glslang::EvqBuffer)
+        type.getQualifier().storage != glslang::EvqBuffer &&
+        !type.getQualifier().isTaskMemory())
         return glslang::ElpNone;
 
     // return the layout to use
     switch (type.getQualifier().layoutPacking) {
     case glslang::ElpStd140:
     case glslang::ElpStd430:
+    case glslang::ElpScalar:
         return type.getQualifier().layoutPacking;
     default:
         return glslang::ElpNone;
@@ -2710,7 +3487,7 @@
 {
     int size;
     int stride;
-    glslangIntermediate->getBaseAlignment(arrayType, size, stride, explicitLayout == glslang::ElpStd140, matrixLayout == glslang::ElmRowMajor);
+    glslangIntermediate->getMemberAlignment(arrayType, size, stride, explicitLayout, matrixLayout == glslang::ElmRowMajor);
 
     return stride;
 }
@@ -2725,7 +3502,7 @@
 
     int size;
     int stride;
-    glslangIntermediate->getBaseAlignment(elementType, size, stride, explicitLayout == glslang::ElpStd140, matrixLayout == glslang::ElmRowMajor);
+    glslangIntermediate->getMemberAlignment(elementType, size, stride, explicitLayout, matrixLayout == glslang::ElmRowMajor);
 
     return stride;
 }
@@ -2736,7 +3513,7 @@
 // 'currentOffset' should be passed in already initialized, ready to modify, and reflecting
 // the migration of data from nextOffset -> currentOffset.  It should be -1 on the first call.
 // -1 means a non-forced member offset (no decoration needed).
-void TGlslangToSpvTraverser::updateMemberOffset(const glslang::TType& /*structType*/, const glslang::TType& memberType, int& currentOffset, int& nextOffset,
+void TGlslangToSpvTraverser::updateMemberOffset(const glslang::TType& structType, const glslang::TType& memberType, int& currentOffset, int& nextOffset,
                                                 glslang::TLayoutPacking explicitLayout, glslang::TLayoutMatrix matrixLayout)
 {
     // this will get a positive value when deemed necessary
@@ -2767,11 +3544,15 @@
 
     int memberSize;
     int dummyStride;
-    int memberAlignment = glslangIntermediate->getBaseAlignment(memberType, memberSize, dummyStride, explicitLayout == glslang::ElpStd140, matrixLayout == glslang::ElmRowMajor);
+    int memberAlignment = glslangIntermediate->getMemberAlignment(memberType, memberSize, dummyStride, explicitLayout, matrixLayout == glslang::ElmRowMajor);
 
     // Adjust alignment for HLSL rules
-    if (glslangIntermediate->usingHlslOFfsets() &&
-        ! memberType.isArray() && memberType.isVector()) {
+    // TODO: make this consistent in early phases of code:
+    //       adjusting this late means inconsistencies with earlier code, which for reflection is an issue
+    // Until reflection is brought in sync with these adjustments, don't apply to $Global,
+    // which is the most likely to rely on reflection, and least likely to rely implicit layouts
+    if (glslangIntermediate->usingHlslOffsets() &&
+        ! memberType.isArray() && memberType.isVector() && structType.getTypeName().compare("$Global") != 0) {
         int dummySize;
         int componentAlignment = glslangIntermediate->getBaseAlignmentScalar(memberType, dummySize);
         if (componentAlignment <= 4)
@@ -2782,7 +3563,7 @@
     glslang::RoundToPow2(currentOffset, memberAlignment);
 
     // Bump up to vec4 if there is a bad straddle
-    if (glslangIntermediate->improperStraddle(memberType, memberSize, currentOffset))
+    if (explicitLayout != glslang::ElpScalar && glslangIntermediate->improperStraddle(memberType, memberSize, currentOffset))
         glslang::RoundToPow2(currentOffset, 16);
 
     nextOffset = currentOffset + memberSize;
@@ -2797,13 +3578,19 @@
     case glslang::EbvCullDistance:
     case glslang::EbvPointSize:
 #ifdef NV_EXTENSIONS
-    case glslang::EbvLayer:
-    case glslang::EbvViewportIndex:
     case glslang::EbvViewportMaskNV:
     case glslang::EbvSecondaryPositionNV:
     case glslang::EbvSecondaryViewportMaskNV:
     case glslang::EbvPositionPerViewNV:
     case glslang::EbvViewportMaskPerViewNV:
+    case glslang::EbvTaskCountNV:
+    case glslang::EbvPrimitiveCountNV:
+    case glslang::EbvPrimitiveIndicesNV:
+    case glslang::EbvClipDistancePerViewNV:
+    case glslang::EbvCullDistancePerViewNV:
+    case glslang::EbvLayerPerViewNV:
+    case glslang::EbvMeshViewCountNV:
+    case glslang::EbvMeshViewIndicesNV:
 #endif
         // Generate the associated capability.  Delegate to TranslateBuiltInDecoration.
         // Alternately, we could just call this for any glslang built-in, since the
@@ -2821,9 +3608,40 @@
     return node->getName().compare(glslangIntermediate->getEntryPointMangledName().c_str()) == 0;
 }
 
+// Does parameter need a place to keep writes, separate from the original?
+// Assumes called after originalParam(), which filters out block/buffer/opaque-based
+// qualifiers such that we should have only in/out/inout/constreadonly here.
+bool TGlslangToSpvTraverser::writableParam(glslang::TStorageQualifier qualifier) const
+{
+    assert(qualifier == glslang::EvqIn ||
+           qualifier == glslang::EvqOut ||
+           qualifier == glslang::EvqInOut ||
+           qualifier == glslang::EvqConstReadOnly);
+    return qualifier != glslang::EvqConstReadOnly;
+}
+
+// Is parameter pass-by-original?
+bool TGlslangToSpvTraverser::originalParam(glslang::TStorageQualifier qualifier, const glslang::TType& paramType,
+                                           bool implicitThisParam)
+{
+    if (implicitThisParam)                                                                     // implicit this
+        return true;
+    if (glslangIntermediate->getSource() == glslang::EShSourceHlsl)
+        return paramType.getBasicType() == glslang::EbtBlock;
+    return paramType.containsOpaque() ||                                                       // sampler, etc.
+           (paramType.getBasicType() == glslang::EbtBlock && qualifier == glslang::EvqBuffer); // SSBO
+}
+
 // Make all the functions, skeletally, without actually visiting their bodies.
 void TGlslangToSpvTraverser::makeFunctions(const glslang::TIntermSequence& glslFunctions)
 {
+    const auto getParamDecorations = [](std::vector<spv::Decoration>& decorations, const glslang::TType& type, bool useVulkanMemoryModel) {
+        spv::Decoration paramPrecision = TranslatePrecisionDecoration(type);
+        if (paramPrecision != spv::NoPrecision)
+            decorations.push_back(paramPrecision);
+        TranslateMemoryDecoration(type.getQualifier(), decorations, useVulkanMemoryModel);
+    };
+
     for (int f = 0; f < (int)glslFunctions.size(); ++f) {
         glslang::TIntermAggregate* glslFunction = glslFunctions[f]->getAsAggregate();
         if (! glslFunction || glslFunction->getOp() != glslang::EOpFunction || isShaderEntryPoint(glslFunction))
@@ -2844,32 +3662,31 @@
         //   GLSL has copy-in/copy-out semantics.  They can be handled though with a pointer to a copy.
 
         std::vector<spv::Id> paramTypes;
-        std::vector<spv::Decoration> paramPrecisions;
+        std::vector<std::vector<spv::Decoration>> paramDecorations; // list of decorations per parameter
         glslang::TIntermSequence& parameters = glslFunction->getSequence()[0]->getAsAggregate()->getSequence();
 
-        bool implicitThis = (int)parameters.size() > 0 && parameters[0]->getAsSymbolNode()->getName() == glslangIntermediate->implicitThisName;
+        bool implicitThis = (int)parameters.size() > 0 && parameters[0]->getAsSymbolNode()->getName() ==
+                                                          glslangIntermediate->implicitThisName;
 
+        paramDecorations.resize(parameters.size());
         for (int p = 0; p < (int)parameters.size(); ++p) {
             const glslang::TType& paramType = parameters[p]->getAsTyped()->getType();
             spv::Id typeId = convertGlslangToSpvType(paramType);
-            // can we pass by reference?
-            if (paramType.containsOpaque() ||                                // sampler, etc.
-                (paramType.getBasicType() == glslang::EbtBlock &&
-                 paramType.getQualifier().storage == glslang::EvqBuffer) ||  // SSBO
-                (p == 0 && implicitThis))                                    // implicit 'this'
+            if (originalParam(paramType.getQualifier().storage, paramType, implicitThis && p == 0))
                 typeId = builder.makePointer(TranslateStorageClass(paramType), typeId);
-            else if (paramType.getQualifier().storage != glslang::EvqConstReadOnly)
+            else if (writableParam(paramType.getQualifier().storage))
                 typeId = builder.makePointer(spv::StorageClassFunction, typeId);
             else
                 rValueParameters.insert(parameters[p]->getAsSymbolNode()->getId());
-            paramPrecisions.push_back(TranslatePrecisionDecoration(paramType));
+            getParamDecorations(paramDecorations[p], paramType, glslangIntermediate->usingVulkanMemoryModel());
             paramTypes.push_back(typeId);
         }
 
         spv::Block* functionBlock;
         spv::Function *function = builder.makeFunctionEntry(TranslatePrecisionDecoration(glslFunction->getType()),
                                                             convertGlslangToSpvType(glslFunction->getType()),
-                                                            glslFunction->getName().c_str(), paramTypes, paramPrecisions, &functionBlock);
+                                                            glslFunction->getName().c_str(), paramTypes,
+                                                            paramDecorations, &functionBlock);
         if (implicitThis)
             function->setImplicitThis();
 
@@ -2925,9 +3742,15 @@
 
     glslang::TSampler sampler = {};
     bool cubeCompare = false;
+#ifdef AMD_EXTENSIONS
+    bool f16ShadowCompare = false;
+#endif
     if (node.isTexture() || node.isImage()) {
         sampler = glslangArguments[0]->getAsTyped()->getType().getSampler();
         cubeCompare = sampler.dim == glslang::EsdCube && sampler.arrayed && sampler.shadow;
+#ifdef AMD_EXTENSIONS
+        f16ShadowCompare = sampler.shadow && glslangArguments[1]->getAsTyped()->getType().getBasicType() == glslang::EbtFloat16;
+#endif
     }
 
     for (int i = 0; i < (int)glslangArguments.size(); ++i) {
@@ -2945,6 +3768,8 @@
         case glslang::EOpImageAtomicXor:
         case glslang::EOpImageAtomicExchange:
         case glslang::EOpImageAtomicCompSwap:
+        case glslang::EOpImageAtomicLoad:
+        case glslang::EOpImageAtomicStore:
             if (i == 0)
                 lvalue = true;
             break;
@@ -2952,6 +3777,21 @@
             if ((sampler.ms && i == 3) || (! sampler.ms && i == 2))
                 lvalue = true;
             break;
+#ifdef AMD_EXTENSIONS
+        case glslang::EOpSparseTexture:
+            if (((cubeCompare || f16ShadowCompare) && i == 3) || (! (cubeCompare || f16ShadowCompare) && i == 2))
+                lvalue = true;
+            break;
+        case glslang::EOpSparseTextureClamp:
+            if (((cubeCompare || f16ShadowCompare) && i == 4) || (! (cubeCompare || f16ShadowCompare) && i == 3))
+                lvalue = true;
+            break;
+        case glslang::EOpSparseTextureLod:
+        case glslang::EOpSparseTextureOffset:
+            if  ((f16ShadowCompare && i == 4) || (! f16ShadowCompare && i == 3))
+                lvalue = true;
+            break;
+#else
         case glslang::EOpSparseTexture:
             if ((cubeCompare && i == 3) || (! cubeCompare && i == 2))
                 lvalue = true;
@@ -2965,6 +3805,7 @@
             if (i == 3)
                 lvalue = true;
             break;
+#endif
         case glslang::EOpSparseTextureFetch:
             if ((sampler.dim != glslang::EsdRect && i == 3) || (sampler.dim == glslang::EsdRect && i == 2))
                 lvalue = true;
@@ -2973,6 +3814,23 @@
             if ((sampler.dim != glslang::EsdRect && i == 4) || (sampler.dim == glslang::EsdRect && i == 3))
                 lvalue = true;
             break;
+#ifdef AMD_EXTENSIONS
+        case glslang::EOpSparseTextureLodOffset:
+        case glslang::EOpSparseTextureGrad:
+        case glslang::EOpSparseTextureOffsetClamp:
+            if ((f16ShadowCompare && i == 5) || (! f16ShadowCompare && i == 4))
+                lvalue = true;
+            break;
+        case glslang::EOpSparseTextureGradOffset:
+        case glslang::EOpSparseTextureGradClamp:
+            if ((f16ShadowCompare && i == 6) || (! f16ShadowCompare && i == 5))
+                lvalue = true;
+            break;
+        case glslang::EOpSparseTextureGradOffsetClamp:
+            if ((f16ShadowCompare && i == 7) || (! f16ShadowCompare && i == 6))
+                lvalue = true;
+            break;
+#else
         case glslang::EOpSparseTextureLodOffset:
         case glslang::EOpSparseTextureGrad:
         case glslang::EOpSparseTextureOffsetClamp:
@@ -2988,7 +3846,8 @@
             if (i == 6)
                 lvalue = true;
             break;
-         case glslang::EOpSparseTextureGather:
+#endif
+        case glslang::EOpSparseTextureGather:
             if ((sampler.shadow && i == 3) || (! sampler.shadow && i == 2))
                 lvalue = true;
             break;
@@ -2997,6 +3856,40 @@
             if ((sampler.shadow && i == 4) || (! sampler.shadow && i == 3))
                 lvalue = true;
             break;
+#ifdef AMD_EXTENSIONS
+        case glslang::EOpSparseTextureGatherLod:
+            if (i == 3)
+                lvalue = true;
+            break;
+        case glslang::EOpSparseTextureGatherLodOffset:
+        case glslang::EOpSparseTextureGatherLodOffsets:
+            if (i == 4)
+                lvalue = true;
+            break;
+        case glslang::EOpSparseImageLoadLod:
+            if (i == 3)
+                lvalue = true;
+            break;
+#endif
+#ifdef NV_EXTENSIONS
+        case glslang::EOpImageSampleFootprintNV:
+            if (i == 4)
+                lvalue = true;
+            break;
+        case glslang::EOpImageSampleFootprintClampNV:
+        case glslang::EOpImageSampleFootprintLodNV:
+            if (i == 5)
+                lvalue = true;
+            break;
+        case glslang::EOpImageSampleFootprintGradNV:
+            if (i == 6)
+                lvalue = true;
+            break;
+        case glslang::EOpImageSampleFootprintGradClampNV:
+            if (i == 7)
+                lvalue = true;
+            break;
+#endif
         default:
             break;
         }
@@ -3017,14 +3910,22 @@
 
 spv::Id TGlslangToSpvTraverser::createImageTextureFunctionCall(glslang::TIntermOperator* node)
 {
-    if (! node->isImage() && ! node->isTexture()) {
+    if (! node->isImage() && ! node->isTexture())
         return spv::NoResult;
-    }
-    auto resultType = [&node,this]{ return convertGlslangToSpvType(node->getType()); };
+
+    builder.setLine(node->getLoc().line);
 
     // Process a GLSL texturing op (will be SPV image)
-    const glslang::TSampler sampler = node->getAsAggregate() ? node->getAsAggregate()->getSequence()[0]->getAsTyped()->getType().getSampler()
-                                                             : node->getAsUnaryNode()->getOperand()->getAsTyped()->getType().getSampler();
+
+    const glslang::TType &imageType = node->getAsAggregate() ? node->getAsAggregate()->getSequence()[0]->getAsTyped()->getType()
+                                                             : node->getAsUnaryNode()->getOperand()->getAsTyped()->getType();
+    const glslang::TSampler sampler = imageType.getSampler();
+#ifdef AMD_EXTENSIONS
+    bool f16ShadowCompare = (sampler.shadow && node->getAsAggregate())
+                                ? node->getAsAggregate()->getSequence()[1]->getAsTyped()->getType().getBasicType() == glslang::EbtFloat16
+                                : false;
+#endif
+
     std::vector<spv::Id> arguments;
     if (node->getAsAggregate())
         translateArguments(*node->getAsAggregate(), arguments);
@@ -3038,9 +3939,7 @@
     glslang::TCrackedTextureOp cracked;
     node->crackTexture(sampler, cracked);
 
-    const bool isUnsignedResult =
-        node->getType().getBasicType() == glslang::EbtUint64 ||
-        node->getType().getBasicType() == glslang::EbtUint;
+    const bool isUnsignedResult = node->getType().getBasicType() == glslang::EbtUint;
 
     // Check for queries
     if (cracked.query) {
@@ -3072,11 +3971,26 @@
         }
     }
 
+    int components = node->getType().getVectorSize();
+
+    if (node->getOp() == glslang::EOpTextureFetch) {
+        // These must produce 4 components, per SPIR-V spec.  We'll add a conversion constructor if needed.
+        // This will only happen through the HLSL path for operator[], so we do not have to handle e.g.
+        // the EOpTexture/Proj/Lod/etc family.  It would be harmless to do so, but would need more logic
+        // here around e.g. which ones return scalars or other types.
+        components = 4;
+    }
+
+    glslang::TType returnType(node->getType().getBasicType(), glslang::EvqTemporary, components);
+
+    auto resultType = [&returnType,this]{ return convertGlslangToSpvType(returnType); };
+
     // Check for image functions other than queries
     if (node->isImage()) {
-        std::vector<spv::Id> operands;
+        std::vector<spv::IdImmediate> operands;
         auto opIt = arguments.begin();
-        operands.push_back(*(opIt++));
+        spv::IdImmediate image = { true, *(opIt++) };
+        operands.push_back(image);
 
         // Handle subpass operations
         // TODO: GLSL should change to have the "MS" only on the type rather than the
@@ -3087,42 +4001,165 @@
             std::vector<spv::Id> comps;
             comps.push_back(zero);
             comps.push_back(zero);
-            operands.push_back(builder.makeCompositeConstant(builder.makeVectorType(builder.makeIntType(32), 2), comps));
+            spv::IdImmediate coord = { true,
+                builder.makeCompositeConstant(builder.makeVectorType(builder.makeIntType(32), 2), comps) };
+            operands.push_back(coord);
             if (sampler.ms) {
-                operands.push_back(spv::ImageOperandsSampleMask);
-                operands.push_back(*(opIt++));
+                spv::IdImmediate imageOperands = { false, spv::ImageOperandsSampleMask };
+                operands.push_back(imageOperands);
+                spv::IdImmediate imageOperand = { true, *(opIt++) };
+                operands.push_back(imageOperand);
             }
-            return builder.createOp(spv::OpImageRead, resultType(), operands);
+            spv::Id result = builder.createOp(spv::OpImageRead, resultType(), operands);
+            builder.setPrecision(result, precision);
+            return result;
         }
 
-        operands.push_back(*(opIt++));
+        spv::IdImmediate coord = { true, *(opIt++) };
+        operands.push_back(coord);
+#ifdef AMD_EXTENSIONS
+        if (node->getOp() == glslang::EOpImageLoad || node->getOp() == glslang::EOpImageLoadLod) {
+#else
         if (node->getOp() == glslang::EOpImageLoad) {
+#endif
+            spv::ImageOperandsMask mask = spv::ImageOperandsMaskNone;
             if (sampler.ms) {
-                operands.push_back(spv::ImageOperandsSampleMask);
-                operands.push_back(*opIt);
+                mask = mask | spv::ImageOperandsSampleMask;
             }
-            if (builder.getImageTypeFormat(builder.getImageType(operands.front())) == spv::ImageFormatUnknown)
-                builder.addCapability(spv::CapabilityStorageImageReadWithoutFormat);
-            return builder.createOp(spv::OpImageRead, resultType(), operands);
-        } else if (node->getOp() == glslang::EOpImageStore) {
-            if (sampler.ms) {
-                operands.push_back(*(opIt + 1));
-                operands.push_back(spv::ImageOperandsSampleMask);
-                operands.push_back(*opIt);
-            } else
-                operands.push_back(*opIt);
-            builder.createNoResultOp(spv::OpImageWrite, operands);
-            if (builder.getImageTypeFormat(builder.getImageType(operands.front())) == spv::ImageFormatUnknown)
-                builder.addCapability(spv::CapabilityStorageImageWriteWithoutFormat);
-            return spv::NoResult;
-        } else if (node->getOp() == glslang::EOpSparseImageLoad) {
-            builder.addCapability(spv::CapabilitySparseResidency);
-            if (builder.getImageTypeFormat(builder.getImageType(operands.front())) == spv::ImageFormatUnknown)
+#ifdef AMD_EXTENSIONS
+            if (cracked.lod) {
+                builder.addExtension(spv::E_SPV_AMD_shader_image_load_store_lod);
+                builder.addCapability(spv::CapabilityImageReadWriteLodAMD);
+                mask = mask | spv::ImageOperandsLodMask;
+            }
+#endif
+            mask = mask | TranslateImageOperands(TranslateCoherent(imageType));
+            mask = (spv::ImageOperandsMask)(mask & ~spv::ImageOperandsMakeTexelAvailableKHRMask);
+            if (mask) {
+                spv::IdImmediate imageOperands = { false, (unsigned int)mask };
+                operands.push_back(imageOperands);
+            }
+            if (mask & spv::ImageOperandsSampleMask) {
+                spv::IdImmediate imageOperand = { true, *opIt++ };
+                operands.push_back(imageOperand);
+            }
+#ifdef AMD_EXTENSIONS
+            if (mask & spv::ImageOperandsLodMask) {
+                spv::IdImmediate imageOperand = { true, *opIt++ };
+                operands.push_back(imageOperand);
+            }
+#endif
+            if (mask & spv::ImageOperandsMakeTexelVisibleKHRMask) {
+                spv::IdImmediate imageOperand = { true, builder.makeUintConstant(TranslateMemoryScope(TranslateCoherent(imageType))) };
+                operands.push_back(imageOperand);
+            }
+
+            if (builder.getImageTypeFormat(builder.getImageType(operands.front().word)) == spv::ImageFormatUnknown)
                 builder.addCapability(spv::CapabilityStorageImageReadWithoutFormat);
 
+            std::vector<spv::Id> result(1, builder.createOp(spv::OpImageRead, resultType(), operands));
+            builder.setPrecision(result[0], precision);
+
+            // If needed, add a conversion constructor to the proper size.
+            if (components != node->getType().getVectorSize())
+                result[0] = builder.createConstructor(precision, result, convertGlslangToSpvType(node->getType()));
+
+            return result[0];
+#ifdef AMD_EXTENSIONS
+        } else if (node->getOp() == glslang::EOpImageStore || node->getOp() == glslang::EOpImageStoreLod) {
+#else
+        } else if (node->getOp() == glslang::EOpImageStore) {
+#endif
+
+            // Push the texel value before the operands
+#ifdef AMD_EXTENSIONS
+            if (sampler.ms || cracked.lod) {
+#else
             if (sampler.ms) {
-                operands.push_back(spv::ImageOperandsSampleMask);
-                operands.push_back(*opIt++);
+#endif
+                spv::IdImmediate texel = { true, *(opIt + 1) };
+                operands.push_back(texel);
+            } else {
+                spv::IdImmediate texel = { true, *opIt };
+                operands.push_back(texel);
+            }
+
+            spv::ImageOperandsMask mask = spv::ImageOperandsMaskNone;
+            if (sampler.ms) {
+                mask = mask | spv::ImageOperandsSampleMask;
+            }
+#ifdef AMD_EXTENSIONS
+            if (cracked.lod) {
+                builder.addExtension(spv::E_SPV_AMD_shader_image_load_store_lod);
+                builder.addCapability(spv::CapabilityImageReadWriteLodAMD);
+                mask = mask | spv::ImageOperandsLodMask;
+            }
+#endif
+            mask = mask | TranslateImageOperands(TranslateCoherent(imageType));
+            mask = (spv::ImageOperandsMask)(mask & ~spv::ImageOperandsMakeTexelVisibleKHRMask);
+            if (mask) {
+                spv::IdImmediate imageOperands = { false, (unsigned int)mask };
+                operands.push_back(imageOperands);
+            }
+            if (mask & spv::ImageOperandsSampleMask) {
+                spv::IdImmediate imageOperand = { true, *opIt++ };
+                operands.push_back(imageOperand);
+            }
+#ifdef AMD_EXTENSIONS
+            if (mask & spv::ImageOperandsLodMask) {
+                spv::IdImmediate imageOperand = { true, *opIt++ };
+                operands.push_back(imageOperand);
+            }
+#endif
+            if (mask & spv::ImageOperandsMakeTexelAvailableKHRMask) {
+                spv::IdImmediate imageOperand = { true, builder.makeUintConstant(TranslateMemoryScope(TranslateCoherent(imageType))) };
+                operands.push_back(imageOperand);
+            }
+
+            builder.createNoResultOp(spv::OpImageWrite, operands);
+            if (builder.getImageTypeFormat(builder.getImageType(operands.front().word)) == spv::ImageFormatUnknown)
+                builder.addCapability(spv::CapabilityStorageImageWriteWithoutFormat);
+            return spv::NoResult;
+#ifdef AMD_EXTENSIONS
+        } else if (node->getOp() == glslang::EOpSparseImageLoad || node->getOp() == glslang::EOpSparseImageLoadLod) {
+#else
+        } else if (node->getOp() == glslang::EOpSparseImageLoad) {
+#endif
+            builder.addCapability(spv::CapabilitySparseResidency);
+            if (builder.getImageTypeFormat(builder.getImageType(operands.front().word)) == spv::ImageFormatUnknown)
+                builder.addCapability(spv::CapabilityStorageImageReadWithoutFormat);
+
+            spv::ImageOperandsMask mask = spv::ImageOperandsMaskNone;
+            if (sampler.ms) {
+                mask = mask | spv::ImageOperandsSampleMask;
+            }
+#ifdef AMD_EXTENSIONS
+            if (cracked.lod) {
+                builder.addExtension(spv::E_SPV_AMD_shader_image_load_store_lod);
+                builder.addCapability(spv::CapabilityImageReadWriteLodAMD);
+
+                mask = mask | spv::ImageOperandsLodMask;
+            }
+#endif
+            mask = mask | TranslateImageOperands(TranslateCoherent(imageType));
+            mask = (spv::ImageOperandsMask)(mask & ~spv::ImageOperandsMakeTexelAvailableKHRMask);
+            if (mask) {
+                spv::IdImmediate imageOperands = { false, (unsigned int)mask };
+                operands.push_back(imageOperands);
+            }
+            if (mask & spv::ImageOperandsSampleMask) {
+                spv::IdImmediate imageOperand = { true, *opIt++ };
+                operands.push_back(imageOperand);
+            }
+#ifdef AMD_EXTENSIONS
+            if (mask & spv::ImageOperandsLodMask) {
+                spv::IdImmediate imageOperand = { true, *opIt++ };
+                operands.push_back(imageOperand);
+            }
+#endif
+            if (mask & spv::ImageOperandsMakeTexelVisibleKHRMask) {
+                spv::IdImmediate imageOperand = { true, builder.makeUintConstant(TranslateMemoryScope(TranslateCoherent(imageType))) };
+                operands.push_back(imageOperand);
             }
 
             // Create the return type that was a special structure
@@ -3141,9 +4178,18 @@
 
             // GLSL "IMAGE_PARAMS" will involve in constructing an image texel pointer and this pointer,
             // as the first source operand, is required by SPIR-V atomic operations.
-            operands.push_back(sampler.ms ? *(opIt++) : builder.makeUintConstant(0)); // For non-MS, the value should be 0
+            // For non-MS, the sample value should be 0
+            spv::IdImmediate sample = { true, sampler.ms ? *(opIt++) : builder.makeUintConstant(0) };
+            operands.push_back(sample);
 
-            spv::Id resultTypeId = builder.makePointer(spv::StorageClassImage, resultType());
+            spv::Id resultTypeId;
+            // imageAtomicStore has a void return type so base the pointer type on
+            // the type of the value operand.
+            if (node->getOp() == glslang::EOpImageAtomicStore) {
+                resultTypeId = builder.makePointer(spv::StorageClassImage, builder.getTypeId(operands[2].word));                
+            } else {
+                resultTypeId = builder.makePointer(spv::StorageClassImage, resultType());
+            }
             spv::Id pointer = builder.createOp(spv::OpImageTexelPointer, resultTypeId, operands);
 
             std::vector<spv::Id> operands;
@@ -3155,23 +4201,86 @@
         }
     }
 
+#ifdef AMD_EXTENSIONS
+    // Check for fragment mask functions other than queries
+    if (cracked.fragMask) {
+        assert(sampler.ms);
+
+        auto opIt = arguments.begin();
+        std::vector<spv::Id> operands;
+
+        // Extract the image if necessary
+        if (builder.isSampledImage(params.sampler))
+            params.sampler = builder.createUnaryOp(spv::OpImage, builder.getImageType(params.sampler), params.sampler);
+
+        operands.push_back(params.sampler);
+        ++opIt;
+
+        if (sampler.isSubpass()) {
+            // add on the (0,0) coordinate
+            spv::Id zero = builder.makeIntConstant(0);
+            std::vector<spv::Id> comps;
+            comps.push_back(zero);
+            comps.push_back(zero);
+            operands.push_back(builder.makeCompositeConstant(builder.makeVectorType(builder.makeIntType(32), 2), comps));
+        }
+
+        for (; opIt != arguments.end(); ++opIt)
+            operands.push_back(*opIt);
+
+        spv::Op fragMaskOp = spv::OpNop;
+        if (node->getOp() == glslang::EOpFragmentMaskFetch)
+            fragMaskOp = spv::OpFragmentMaskFetchAMD;
+        else if (node->getOp() == glslang::EOpFragmentFetch)
+            fragMaskOp = spv::OpFragmentFetchAMD;
+
+        builder.addExtension(spv::E_SPV_AMD_shader_fragment_mask);
+        builder.addCapability(spv::CapabilityFragmentMaskAMD);
+        return builder.createOp(fragMaskOp, resultType(), operands);
+    }
+#endif
+
     // Check for texture functions other than queries
     bool sparse = node->isSparseTexture();
+#ifdef NV_EXTENSIONS
+    bool imageFootprint = node->isImageFootprint();
+#endif
+
     bool cubeCompare = sampler.dim == glslang::EsdCube && sampler.arrayed && sampler.shadow;
 
     // check for bias argument
     bool bias = false;
+#ifdef AMD_EXTENSIONS
+    if (! cracked.lod && ! cracked.grad && ! cracked.fetch && ! cubeCompare) {
+#else
     if (! cracked.lod && ! cracked.gather && ! cracked.grad && ! cracked.fetch && ! cubeCompare) {
+#endif
         int nonBiasArgCount = 2;
+#ifdef AMD_EXTENSIONS
+        if (cracked.gather)
+            ++nonBiasArgCount; // comp argument should be present when bias argument is present
+
+        if (f16ShadowCompare)
+            ++nonBiasArgCount;
+#endif
         if (cracked.offset)
             ++nonBiasArgCount;
+#ifdef AMD_EXTENSIONS
+        else if (cracked.offsets)
+            ++nonBiasArgCount;
+#endif
         if (cracked.grad)
             nonBiasArgCount += 2;
         if (cracked.lodClamp)
             ++nonBiasArgCount;
         if (sparse)
             ++nonBiasArgCount;
-
+#ifdef NV_EXTENSIONS
+        if (imageFootprint)
+            //Following three extra arguments
+            // int granularity, bool coarse, out gl_TextureFootprint2DNV footprint
+            nonBiasArgCount += 3;
+#endif
         if ((int)arguments.size() > nonBiasArgCount)
             bias = true;
     }
@@ -3183,6 +4292,17 @@
             params.sampler = builder.createUnaryOp(spv::OpImage, builder.getImageType(params.sampler), params.sampler);
     }
 
+#ifdef AMD_EXTENSIONS
+    if (cracked.gather) {
+        const auto& sourceExtensions = glslangIntermediate->getRequestedExtensions();
+        if (bias || cracked.lod ||
+            sourceExtensions.find(glslang::E_GL_AMD_texture_gather_bias_lod) != sourceExtensions.end()) {
+            builder.addExtension(spv::E_SPV_AMD_texture_gather_bias_lod);
+            builder.addCapability(spv::CapabilityImageGatherBiasLodAMD);
+        }
+    }
+#endif
+
     // set the rest of the arguments
 
     params.coords = arguments[1];
@@ -3190,7 +4310,11 @@
     bool noImplicitLod = false;
 
     // sort out where Dref is coming from
+#ifdef AMD_EXTENSIONS
+    if (cubeCompare || f16ShadowCompare) {
+#else
     if (cubeCompare) {
+#endif
         params.Dref = arguments[2];
         ++extraArgs;
     } else if (sampler.shadow && cracked.gather) {
@@ -3209,16 +4333,22 @@
 
     // lod
     if (cracked.lod) {
-        params.lod = arguments[2];
+        params.lod = arguments[2 + extraArgs];
         ++extraArgs;
-    } else if (glslangIntermediate->getStage() != EShLangFragment) {
+    } else if (glslangIntermediate->getStage() != EShLangFragment
+#ifdef NV_EXTENSIONS
+        // NV_compute_shader_derivatives layout qualifiers allow for implicit LODs
+           && !(glslangIntermediate->getStage() == EShLangCompute &&
+                (glslangIntermediate->getLayoutDerivativeModeNone() != glslang::LayoutDerivativeNone))
+#endif
+        ) {
         // we need to invent the default lod for an explicit lod instruction for a non-fragment stage
         noImplicitLod = true;
     }
 
     // multisample
     if (sampler.ms) {
-        params.sample = arguments[2]; // For MS, "sample" should be specified
+        params.sample = arguments[2 + extraArgs]; // For MS, "sample" should be specified
         ++extraArgs;
     }
 
@@ -3243,29 +4373,95 @@
         params.lodClamp = arguments[2 + extraArgs];
         ++extraArgs;
     }
-
     // sparse
     if (sparse) {
         params.texelOut = arguments[2 + extraArgs];
         ++extraArgs;
     }
 
-    // bias
-    if (bias) {
-        params.bias = arguments[2 + extraArgs];
-        ++extraArgs;
-    }
-
     // gather component
     if (cracked.gather && ! sampler.shadow) {
         // default component is 0, if missing, otherwise an argument
         if (2 + extraArgs < (int)arguments.size()) {
             params.component = arguments[2 + extraArgs];
             ++extraArgs;
-        } else {
+        } else
             params.component = builder.makeIntConstant(0);
-        }
     }
+#ifdef NV_EXTENSIONS
+    spv::Id  resultStruct = spv::NoResult;
+    if (imageFootprint) {
+        //Following three extra arguments
+        // int granularity, bool coarse, out gl_TextureFootprint2DNV footprint
+        params.granularity = arguments[2 + extraArgs];
+        params.coarse = arguments[3 + extraArgs];
+        resultStruct = arguments[4 + extraArgs];
+        extraArgs += 3;
+    }
+#endif
+    // bias
+    if (bias) {
+        params.bias = arguments[2 + extraArgs];
+        ++extraArgs;
+    }
+
+#ifdef NV_EXTENSIONS
+    if (imageFootprint) {
+        builder.addExtension(spv::E_SPV_NV_shader_image_footprint);
+        builder.addCapability(spv::CapabilityImageFootprintNV);
+
+
+        //resultStructType(OpenGL type) contains 5 elements:
+        //struct gl_TextureFootprint2DNV {
+        //    uvec2 anchor;
+        //    uvec2 offset;
+        //    uvec2 mask;
+        //    uint  lod;
+        //    uint  granularity;
+        //};
+        //or
+        //struct gl_TextureFootprint3DNV {
+        //    uvec3 anchor;
+        //    uvec3 offset;
+        //    uvec2 mask;
+        //    uint  lod;
+        //    uint  granularity;
+        //};
+        spv::Id resultStructType = builder.getContainedTypeId(builder.getTypeId(resultStruct));
+        assert(builder.isStructType(resultStructType));
+
+        //resType (SPIR-V type) contains 6 elements:
+        //Member 0 must be a Boolean type scalar(LOD), 
+        //Member 1 must be a vector of integer type, whose Signedness operand is 0(anchor),  
+        //Member 2 must be a vector of integer type, whose Signedness operand is 0(offset), 
+        //Member 3 must be a vector of integer type, whose Signedness operand is 0(mask), 
+        //Member 4 must be a scalar of integer type, whose Signedness operand is 0(lod),
+        //Member 5 must be a scalar of integer type, whose Signedness operand is 0(granularity).
+        std::vector<spv::Id> members;
+        members.push_back(resultType());
+        for (int i = 0; i < 5; i++) {
+            members.push_back(builder.getContainedTypeId(resultStructType, i));
+        }
+        spv::Id resType = builder.makeStructType(members, "ResType");
+
+        //call ImageFootprintNV
+        spv::Id res = builder.createTextureCall(precision, resType, sparse, cracked.fetch, cracked.proj, cracked.gather, noImplicitLod, params);
+        
+        //copy resType (SPIR-V type) to resultStructType(OpenGL type)
+        for (int i = 0; i < 5; i++) {
+            builder.clearAccessChain();
+            builder.setAccessChainLValue(resultStruct);
+
+            //Accessing to a struct we created, no coherent flag is set
+            spv::Builder::AccessChain::CoherentFlags flags;
+            flags.clear();
+
+            builder.accessChainPush(builder.makeIntConstant(i), flags);
+            builder.accessChainStore(builder.createCompositeExtract(res, builder.getContainedTypeId(resType, i+1), i+1));
+        }
+        return builder.createCompositeExtract(res, resultType(), 0);
+    }
+#endif
 
     // projective component (might not to move)
     // GLSL: "The texture coordinates consumed from P, not including the last component of P,
@@ -3291,7 +4487,24 @@
         }
     }
 
-    return builder.createTextureCall(precision, resultType(), sparse, cracked.fetch, cracked.proj, cracked.gather, noImplicitLod, params);
+    // nonprivate
+    if (imageType.getQualifier().nonprivate) {
+        params.nonprivate = true;
+    }
+
+    // volatile
+    if (imageType.getQualifier().volatil) {
+        params.volatil = true;
+    }
+
+    std::vector<spv::Id> result( 1, 
+        builder.createTextureCall(precision, resultType(), sparse, cracked.fetch, cracked.proj, cracked.gather, noImplicitLod, params)
+    );
+
+    if (components != node->getType().getVectorSize())
+        result[0] = builder.createConstructor(precision, result, convertGlslangToSpvType(node->getType()));
+
+    return result[0];
 }
 
 spv::Id TGlslangToSpvTraverser::handleUserFunctionCall(const glslang::TIntermAggregate* node)
@@ -3312,18 +4525,18 @@
     // 3. Make the call
     // 4. Copy back the results
 
-    // 1. Evaluate the arguments
+    // 1. Evaluate the arguments and their types
     std::vector<spv::Builder::AccessChain> lValues;
     std::vector<spv::Id> rValues;
     std::vector<const glslang::TType*> argTypes;
     for (int a = 0; a < (int)glslangArgs.size(); ++a) {
-        const glslang::TType& paramType = glslangArgs[a]->getAsTyped()->getType();
+        argTypes.push_back(&glslangArgs[a]->getAsTyped()->getType());
         // build l-value
         builder.clearAccessChain();
         glslangArgs[a]->traverse(this);
-        argTypes.push_back(&paramType);
-        // keep outputs and opaque objects as l-values, evaluate input-only as r-values
-        if (qualifiers[a] != glslang::EvqConstReadOnly || paramType.containsOpaque()) {
+        // keep outputs and pass-by-originals as l-values, evaluate others as r-values
+        if (originalParam(qualifiers[a], *argTypes[a], function->hasImplicitThis() && a == 0) ||
+            writableParam(qualifiers[a])) {
             // save l-value
             lValues.push_back(builder.getAccessChain());
         } else {
@@ -3340,28 +4553,33 @@
     int rValueCount = 0;
     std::vector<spv::Id> spvArgs;
     for (int a = 0; a < (int)glslangArgs.size(); ++a) {
-        const glslang::TType& paramType = glslangArgs[a]->getAsTyped()->getType();
         spv::Id arg;
-        if (paramType.containsOpaque() ||
-            (paramType.getBasicType() == glslang::EbtBlock && qualifiers[a] == glslang::EvqBuffer) ||
-            (a == 0 && function->hasImplicitThis())) {
+        if (originalParam(qualifiers[a], *argTypes[a], function->hasImplicitThis() && a == 0)) {
             builder.setAccessChain(lValues[lValueCount]);
             arg = builder.accessChainGetLValue();
             ++lValueCount;
-        } else if (qualifiers[a] != glslang::EvqConstReadOnly) {
+        } else if (writableParam(qualifiers[a])) {
             // need space to hold the copy
-            arg = builder.createVariable(spv::StorageClassFunction, convertGlslangToSpvType(paramType), "param");
+            arg = builder.createVariable(spv::StorageClassFunction, builder.getContainedTypeId(function->getParamType(a)), "param");
             if (qualifiers[a] == glslang::EvqIn || qualifiers[a] == glslang::EvqInOut) {
                 // need to copy the input into output space
                 builder.setAccessChain(lValues[lValueCount]);
                 spv::Id copy = accessChainLoad(*argTypes[a]);
                 builder.clearAccessChain();
                 builder.setAccessChainLValue(arg);
-                multiTypeStore(paramType, copy);
+                multiTypeStore(*argTypes[a], copy);
             }
             ++lValueCount;
         } else {
-            arg = rValues[rValueCount];
+            // process r-value, which involves a copy for a type mismatch
+            if (function->getParamType(a) != convertGlslangToSpvType(*argTypes[a])) {
+                spv::Id argCopy = builder.createVariable(spv::StorageClassFunction, function->getParamType(a), "arg");
+                builder.clearAccessChain();
+                builder.setAccessChainLValue(argCopy);
+                multiTypeStore(*argTypes[a], rValues[rValueCount]);
+                arg = builder.createLoad(argCopy);
+            } else
+                arg = rValues[rValueCount];
             ++rValueCount;
         }
         spvArgs.push_back(arg);
@@ -3374,12 +4592,13 @@
     // 4. Copy back out an "out" arguments.
     lValueCount = 0;
     for (int a = 0; a < (int)glslangArgs.size(); ++a) {
-        const glslang::TType& paramType = glslangArgs[a]->getAsTyped()->getType();
-        if (qualifiers[a] != glslang::EvqConstReadOnly) {
+        if (originalParam(qualifiers[a], *argTypes[a], function->hasImplicitThis() && a == 0))
+            ++lValueCount;
+        else if (writableParam(qualifiers[a])) {
             if (qualifiers[a] == glslang::EvqOut || qualifiers[a] == glslang::EvqInOut) {
                 spv::Id copy = builder.createLoad(spvArgs[a]);
                 builder.setAccessChain(lValues[lValueCount]);
-                multiTypeStore(paramType, copy);
+                multiTypeStore(*argTypes[a], copy);
             }
             ++lValueCount;
         }
@@ -3389,17 +4608,12 @@
 }
 
 // Translate AST operation to SPV operation, already having SPV-based operands/types.
-spv::Id TGlslangToSpvTraverser::createBinaryOperation(glslang::TOperator op, spv::Decoration precision,
-                                                      spv::Decoration noContraction,
+spv::Id TGlslangToSpvTraverser::createBinaryOperation(glslang::TOperator op, OpDecorations& decorations,
                                                       spv::Id typeId, spv::Id left, spv::Id right,
                                                       glslang::TBasicType typeProxy, bool reduceComparison)
 {
-    bool isUnsigned = typeProxy == glslang::EbtUint || typeProxy == glslang::EbtUint64;
-#ifdef AMD_EXTENSIONS
-    bool isFloat = typeProxy == glslang::EbtFloat || typeProxy == glslang::EbtDouble || typeProxy == glslang::EbtFloat16;
-#else
-    bool isFloat = typeProxy == glslang::EbtFloat || typeProxy == glslang::EbtDouble;
-#endif
+    bool isUnsigned = isTypeUnsignedInt(typeProxy);
+    bool isFloat = isTypeFloat(typeProxy);
     bool isBool = typeProxy == glslang::EbtBool;
 
     spv::Op binOp = spv::OpNop;
@@ -3436,7 +4650,9 @@
             assert(builder.isScalar(right));
             needMatchingVectors = false;
             binOp = spv::OpVectorTimesScalar;
-        } else
+        } else if (isFloat)
+            binOp = spv::OpFMul;
+          else
             binOp = spv::OpIMul;
         break;
     case glslang::EOpVectorTimesMatrix:
@@ -3531,15 +4747,16 @@
     if (binOp != spv::OpNop) {
         assert(comparison == false);
         if (builder.isMatrix(left) || builder.isMatrix(right))
-            return createBinaryMatrixOperation(binOp, precision, noContraction, typeId, left, right);
+            return createBinaryMatrixOperation(binOp, decorations, typeId, left, right);
 
         // No matrix involved; make both operands be the same number of components, if needed
         if (needMatchingVectors)
-            builder.promoteScalar(precision, left, right);
+            builder.promoteScalar(decorations.precision, left, right);
 
         spv::Id result = builder.createBinOp(binOp, typeId, left, right);
-        addDecoration(result, noContraction);
-        return builder.setPrecision(result, precision);
+        builder.addDecoration(result, decorations.noContraction);
+        builder.addDecoration(result, decorations.nonUniform);
+        return builder.setPrecision(result, decorations.precision);
     }
 
     if (! comparison)
@@ -3548,8 +4765,11 @@
     // Handle comparison instructions
 
     if (reduceComparison && (op == glslang::EOpEqual || op == glslang::EOpNotEqual)
-                         && (builder.isVector(left) || builder.isMatrix(left) || builder.isAggregate(left)))
-        return builder.createCompositeCompare(precision, left, right, op == glslang::EOpEqual);
+                         && (builder.isVector(left) || builder.isMatrix(left) || builder.isAggregate(left))) {
+        spv::Id result = builder.createCompositeCompare(decorations.precision, left, right, op == glslang::EOpEqual);
+        builder.addDecoration(result, decorations.nonUniform);
+        return result;
+    }
 
     switch (op) {
     case glslang::EOpLessThan:
@@ -3608,8 +4828,9 @@
 
     if (binOp != spv::OpNop) {
         spv::Id result = builder.createBinOp(binOp, typeId, left, right);
-        addDecoration(result, noContraction);
-        return builder.setPrecision(result, precision);
+        builder.addDecoration(result, decorations.noContraction);
+        builder.addDecoration(result, decorations.nonUniform);
+        return builder.setPrecision(result, decorations.precision);
     }
 
     return 0;
@@ -3629,7 +4850,8 @@
 //   matrix op scalar    op in {+, -, /}
 //   scalar op matrix    op in {+, -, /}
 //
-spv::Id TGlslangToSpvTraverser::createBinaryMatrixOperation(spv::Op op, spv::Decoration precision, spv::Decoration noContraction, spv::Id typeId, spv::Id left, spv::Id right)
+spv::Id TGlslangToSpvTraverser::createBinaryMatrixOperation(spv::Op op, OpDecorations& decorations, spv::Id typeId,
+                                                            spv::Id left, spv::Id right)
 {
     bool firstClass = true;
 
@@ -3638,7 +4860,8 @@
     case spv::OpFDiv:
         if (builder.isMatrix(left) && builder.isScalar(right)) {
             // turn matrix / scalar into a multiply...
-            right = builder.createBinOp(spv::OpFDiv, builder.getTypeId(right), builder.makeFloatConstant(1.0F), right);
+            spv::Id resultType = builder.getTypeId(right);
+            right = builder.createBinOp(spv::OpFDiv, resultType, builder.makeFpConstant(resultType, 1.0), right);
             op = spv::OpMatrixTimesScalar;
         } else
             firstClass = false;
@@ -3667,8 +4890,9 @@
 
     if (firstClass) {
         spv::Id result = builder.createBinOp(op, typeId, left, right);
-        addDecoration(result, noContraction);
-        return builder.setPrecision(result, precision);
+        builder.addDecoration(result, decorations.noContraction);
+        builder.addDecoration(result, decorations.nonUniform);
+        return builder.setPrecision(result, decorations.precision);
     }
 
     // Handle component-wise +, -, *, %, and / for all combinations of type.
@@ -3695,9 +4919,9 @@
         std::vector<spv::Id> results;
         spv::Id smearVec = spv::NoResult;
         if (builder.isScalar(left))
-            smearVec = builder.smearScalar(precision, left, vecType);
+            smearVec = builder.smearScalar(decorations.precision, left, vecType);
         else if (builder.isScalar(right))
-            smearVec = builder.smearScalar(precision, right, vecType);
+            smearVec = builder.smearScalar(decorations.precision, right, vecType);
 
         // do each vector op
         for (unsigned int c = 0; c < numCols; ++c) {
@@ -3706,12 +4930,15 @@
             spv::Id  leftVec =  leftMat ? builder.createCompositeExtract( left, vecType, indexes) : smearVec;
             spv::Id rightVec = rightMat ? builder.createCompositeExtract(right, vecType, indexes) : smearVec;
             spv::Id result = builder.createBinOp(op, vecType, leftVec, rightVec);
-            addDecoration(result, noContraction);
-            results.push_back(builder.setPrecision(result, precision));
+            builder.addDecoration(result, decorations.noContraction);
+            builder.addDecoration(result, decorations.nonUniform);
+            results.push_back(builder.setPrecision(result, decorations.precision));
         }
 
         // put the pieces together
-        return  builder.setPrecision(builder.createCompositeConstruct(typeId, results), precision);
+        spv::Id result = builder.setPrecision(builder.createCompositeConstruct(typeId, results), decorations.precision);
+        builder.addDecoration(result, decorations.nonUniform);
+        return result;
     }
     default:
         assert(0);
@@ -3719,24 +4946,21 @@
     }
 }
 
-spv::Id TGlslangToSpvTraverser::createUnaryOperation(glslang::TOperator op, spv::Decoration precision, spv::Decoration noContraction, spv::Id typeId, spv::Id operand, glslang::TBasicType typeProxy)
+spv::Id TGlslangToSpvTraverser::createUnaryOperation(glslang::TOperator op, OpDecorations& decorations, spv::Id typeId,
+                                                     spv::Id operand, glslang::TBasicType typeProxy)
 {
     spv::Op unaryOp = spv::OpNop;
     int extBuiltins = -1;
     int libCall = -1;
-    bool isUnsigned = typeProxy == glslang::EbtUint || typeProxy == glslang::EbtUint64;
-#ifdef AMD_EXTENSIONS
-    bool isFloat = typeProxy == glslang::EbtFloat || typeProxy == glslang::EbtDouble || typeProxy == glslang::EbtFloat16;
-#else
-    bool isFloat = typeProxy == glslang::EbtFloat || typeProxy == glslang::EbtDouble;
-#endif
+    bool isUnsigned = isTypeUnsignedInt(typeProxy);
+    bool isFloat = isTypeFloat(typeProxy);
 
     switch (op) {
     case glslang::EOpNegative:
         if (isFloat) {
             unaryOp = spv::OpFNegate;
             if (builder.isMatrixType(typeId))
-                return createUnaryMatrixOperation(unaryOp, precision, noContraction, typeId, operand, typeProxy);
+                return createUnaryMatrixOperation(unaryOp, decorations, typeId, operand, typeProxy);
         } else
             unaryOp = spv::OpSNegate;
         break;
@@ -3866,6 +5090,10 @@
     case glslang::EOpDoubleBitsToUint64:
     case glslang::EOpInt64BitsToDouble:
     case glslang::EOpUint64BitsToDouble:
+    case glslang::EOpFloat16BitsToInt16:
+    case glslang::EOpFloat16BitsToUint16:
+    case glslang::EOpInt16BitsToFloat16:
+    case glslang::EOpUint16BitsToFloat16:
         unaryOp = spv::OpBitcast;
         break;
 
@@ -3910,15 +5138,24 @@
     case glslang::EOpUnpackInt2x32:
     case glslang::EOpPackUint2x32:
     case glslang::EOpUnpackUint2x32:
-        unaryOp = spv::OpBitcast;
-        break;
-
-#ifdef AMD_EXTENSIONS
+    case glslang::EOpPack16:
+    case glslang::EOpPack32:
+    case glslang::EOpPack64:
+    case glslang::EOpUnpack32:
+    case glslang::EOpUnpack16:
+    case glslang::EOpUnpack8:
+    case glslang::EOpPackInt2x16:
+    case glslang::EOpUnpackInt2x16:
+    case glslang::EOpPackUint2x16:
+    case glslang::EOpUnpackUint2x16:
+    case glslang::EOpPackInt4x16:
+    case glslang::EOpUnpackInt4x16:
+    case glslang::EOpPackUint4x16:
+    case glslang::EOpUnpackUint4x16:
     case glslang::EOpPackFloat2x16:
     case glslang::EOpUnpackFloat2x16:
         unaryOp = spv::OpBitcast;
         break;
-#endif
 
     case glslang::EOpDPdx:
         unaryOp = spv::OpDPdx;
@@ -3930,31 +5167,28 @@
         unaryOp = spv::OpFwidth;
         break;
     case glslang::EOpDPdxFine:
-        builder.addCapability(spv::CapabilityDerivativeControl);
         unaryOp = spv::OpDPdxFine;
         break;
     case glslang::EOpDPdyFine:
-        builder.addCapability(spv::CapabilityDerivativeControl);
         unaryOp = spv::OpDPdyFine;
         break;
     case glslang::EOpFwidthFine:
-        builder.addCapability(spv::CapabilityDerivativeControl);
         unaryOp = spv::OpFwidthFine;
         break;
     case glslang::EOpDPdxCoarse:
-        builder.addCapability(spv::CapabilityDerivativeControl);
         unaryOp = spv::OpDPdxCoarse;
         break;
     case glslang::EOpDPdyCoarse:
-        builder.addCapability(spv::CapabilityDerivativeControl);
         unaryOp = spv::OpDPdyCoarse;
         break;
     case glslang::EOpFwidthCoarse:
-        builder.addCapability(spv::CapabilityDerivativeControl);
         unaryOp = spv::OpFwidthCoarse;
         break;
     case glslang::EOpInterpolateAtCentroid:
-        builder.addCapability(spv::CapabilityInterpolationFunction);
+#ifdef AMD_EXTENSIONS
+        if (typeProxy == glslang::EbtFloat16)
+            builder.addExtension(spv::E_SPV_AMD_gpu_shader_half_float);
+#endif
         libCall = spv::GLSLstd450InterpolateAtCentroid;
         break;
     case glslang::EOpAny:
@@ -3984,7 +5218,7 @@
         // Handle all of the atomics in one place, in createAtomicOperation()
         std::vector<spv::Id> operands;
         operands.push_back(operand);
-        return createAtomicOperation(op, precision, typeId, operands, typeProxy);
+        return createAtomicOperation(op, decorations.precision, typeId, operands, typeProxy);
     }
 
     case glslang::EOpBitFieldReverse:
@@ -4033,7 +5267,45 @@
         operands.push_back(operand);
         return createInvocationsOperation(op, typeId, operands, typeProxy);
     }
-
+    case glslang::EOpSubgroupAll:
+    case glslang::EOpSubgroupAny:
+    case glslang::EOpSubgroupAllEqual:
+    case glslang::EOpSubgroupBroadcastFirst:
+    case glslang::EOpSubgroupBallot:
+    case glslang::EOpSubgroupInverseBallot:
+    case glslang::EOpSubgroupBallotBitCount:
+    case glslang::EOpSubgroupBallotInclusiveBitCount:
+    case glslang::EOpSubgroupBallotExclusiveBitCount:
+    case glslang::EOpSubgroupBallotFindLSB:
+    case glslang::EOpSubgroupBallotFindMSB:
+    case glslang::EOpSubgroupAdd:
+    case glslang::EOpSubgroupMul:
+    case glslang::EOpSubgroupMin:
+    case glslang::EOpSubgroupMax:
+    case glslang::EOpSubgroupAnd:
+    case glslang::EOpSubgroupOr:
+    case glslang::EOpSubgroupXor:
+    case glslang::EOpSubgroupInclusiveAdd:
+    case glslang::EOpSubgroupInclusiveMul:
+    case glslang::EOpSubgroupInclusiveMin:
+    case glslang::EOpSubgroupInclusiveMax:
+    case glslang::EOpSubgroupInclusiveAnd:
+    case glslang::EOpSubgroupInclusiveOr:
+    case glslang::EOpSubgroupInclusiveXor:
+    case glslang::EOpSubgroupExclusiveAdd:
+    case glslang::EOpSubgroupExclusiveMul:
+    case glslang::EOpSubgroupExclusiveMin:
+    case glslang::EOpSubgroupExclusiveMax:
+    case glslang::EOpSubgroupExclusiveAnd:
+    case glslang::EOpSubgroupExclusiveOr:
+    case glslang::EOpSubgroupExclusiveXor:
+    case glslang::EOpSubgroupQuadSwapHorizontal:
+    case glslang::EOpSubgroupQuadSwapVertical:
+    case glslang::EOpSubgroupQuadSwapDiagonal: {
+        std::vector<spv::Id> operands;
+        operands.push_back(operand);
+        return createSubgroupOperation(op, typeId, operands, typeProxy);
+    }
 #ifdef AMD_EXTENSIONS
     case glslang::EOpMbcnt:
         extBuiltins = getExtBuiltins(spv::E_SPV_AMD_shader_ballot);
@@ -4050,7 +5322,11 @@
         libCall = spv::CubeFaceCoordAMD;
         break;
 #endif
-
+#ifdef NV_EXTENSIONS
+    case glslang::EOpSubgroupPartition:
+        unaryOp = spv::OpGroupNonUniformPartitionNV;
+        break;
+#endif
     default:
         return 0;
     }
@@ -4064,12 +5340,14 @@
         id = builder.createUnaryOp(unaryOp, typeId, operand);
     }
 
-    addDecoration(id, noContraction);
-    return builder.setPrecision(id, precision);
+    builder.addDecoration(id, decorations.noContraction);
+    builder.addDecoration(id, decorations.nonUniform);
+    return builder.setPrecision(id, decorations.precision);
 }
 
 // Create a unary operation on a matrix
-spv::Id TGlslangToSpvTraverser::createUnaryMatrixOperation(spv::Op op, spv::Decoration precision, spv::Decoration noContraction, spv::Id typeId, spv::Id operand, glslang::TBasicType /* typeProxy */)
+spv::Id TGlslangToSpvTraverser::createUnaryMatrixOperation(spv::Op op, OpDecorations& decorations, spv::Id typeId,
+                                                           spv::Id operand, glslang::TBasicType /* typeProxy */)
 {
     // Handle unary operations vector by vector.
     // The result type is the same type as the original type.
@@ -4091,30 +5369,123 @@
         indexes.push_back(c);
         spv::Id srcVec  = builder.createCompositeExtract(operand, srcVecType, indexes);
         spv::Id destVec = builder.createUnaryOp(op, destVecType, srcVec);
-        addDecoration(destVec, noContraction);
-        results.push_back(builder.setPrecision(destVec, precision));
+        builder.addDecoration(destVec, decorations.noContraction);
+        builder.addDecoration(destVec, decorations.nonUniform);
+        results.push_back(builder.setPrecision(destVec, decorations.precision));
     }
 
     // put the pieces together
-    return builder.setPrecision(builder.createCompositeConstruct(typeId, results), precision);
+    spv::Id result = builder.setPrecision(builder.createCompositeConstruct(typeId, results), decorations.precision);
+    builder.addDecoration(result, decorations.nonUniform);
+    return result;
 }
 
-spv::Id TGlslangToSpvTraverser::createConversion(glslang::TOperator op, spv::Decoration precision, spv::Decoration noContraction, spv::Id destType, spv::Id operand, glslang::TBasicType typeProxy)
+// For converting integers where both the bitwidth and the signedness could
+// change, but only do the width change here. The caller is still responsible
+// for the signedness conversion.
+spv::Id TGlslangToSpvTraverser::createIntWidthConversion(glslang::TOperator op, spv::Id operand, int vectorSize)
+{
+    // Get the result type width, based on the type to convert to.
+    int width = 32;
+    switch(op) {
+    case glslang::EOpConvInt16ToUint8:
+    case glslang::EOpConvIntToUint8:
+    case glslang::EOpConvInt64ToUint8:
+    case glslang::EOpConvUint16ToInt8:
+    case glslang::EOpConvUintToInt8:
+    case glslang::EOpConvUint64ToInt8:
+        width = 8;
+        break;
+    case glslang::EOpConvInt8ToUint16:
+    case glslang::EOpConvIntToUint16:
+    case glslang::EOpConvInt64ToUint16:
+    case glslang::EOpConvUint8ToInt16:
+    case glslang::EOpConvUintToInt16:
+    case glslang::EOpConvUint64ToInt16:
+        width = 16;
+        break;
+    case glslang::EOpConvInt8ToUint:
+    case glslang::EOpConvInt16ToUint:
+    case glslang::EOpConvInt64ToUint:
+    case glslang::EOpConvUint8ToInt:
+    case glslang::EOpConvUint16ToInt:
+    case glslang::EOpConvUint64ToInt:
+        width = 32;
+        break;
+    case glslang::EOpConvInt8ToUint64:
+    case glslang::EOpConvInt16ToUint64:
+    case glslang::EOpConvIntToUint64:
+    case glslang::EOpConvUint8ToInt64:
+    case glslang::EOpConvUint16ToInt64:
+    case glslang::EOpConvUintToInt64:
+        width = 64;
+        break;
+
+    default:
+        assert(false && "Default missing");
+        break;
+    }
+
+    // Get the conversion operation and result type,
+    // based on the target width, but the source type.
+    spv::Id type = spv::NoType;
+    spv::Op convOp = spv::OpNop;
+    switch(op) {
+    case glslang::EOpConvInt8ToUint16:
+    case glslang::EOpConvInt8ToUint:
+    case glslang::EOpConvInt8ToUint64:
+    case glslang::EOpConvInt16ToUint8:
+    case glslang::EOpConvInt16ToUint:
+    case glslang::EOpConvInt16ToUint64:
+    case glslang::EOpConvIntToUint8:
+    case glslang::EOpConvIntToUint16:
+    case glslang::EOpConvIntToUint64:
+    case glslang::EOpConvInt64ToUint8:
+    case glslang::EOpConvInt64ToUint16:
+    case glslang::EOpConvInt64ToUint:
+        convOp = spv::OpSConvert;
+        type = builder.makeIntType(width);
+        break;
+    default:
+        convOp = spv::OpUConvert;
+        type = builder.makeUintType(width);
+        break;
+    }
+
+    if (vectorSize > 0)
+        type = builder.makeVectorType(type, vectorSize);
+
+    return builder.createUnaryOp(convOp, type, operand);
+}
+
+spv::Id TGlslangToSpvTraverser::createConversion(glslang::TOperator op, OpDecorations& decorations, spv::Id destType,
+                                                 spv::Id operand, glslang::TBasicType typeProxy)
 {
     spv::Op convOp = spv::OpNop;
     spv::Id zero = 0;
     spv::Id one = 0;
-    spv::Id type = 0;
 
     int vectorSize = builder.isVectorType(destType) ? builder.getNumTypeComponents(destType) : 0;
 
     switch (op) {
+    case glslang::EOpConvInt8ToBool:
+    case glslang::EOpConvUint8ToBool:
+        zero = builder.makeUint8Constant(0);
+        zero = makeSmearedConstant(zero, vectorSize);
+        return builder.createBinOp(spv::OpINotEqual, destType, operand, zero);
+    case glslang::EOpConvInt16ToBool:
+    case glslang::EOpConvUint16ToBool:
+        zero = builder.makeUint16Constant(0);
+        zero = makeSmearedConstant(zero, vectorSize);
+        return builder.createBinOp(spv::OpINotEqual, destType, operand, zero);
     case glslang::EOpConvIntToBool:
     case glslang::EOpConvUintToBool:
+        zero = builder.makeUintConstant(0);
+        zero = makeSmearedConstant(zero, vectorSize);
+        return builder.createBinOp(spv::OpINotEqual, destType, operand, zero);
     case glslang::EOpConvInt64ToBool:
     case glslang::EOpConvUint64ToBool:
-        zero = (op == glslang::EOpConvInt64ToBool ||
-                op == glslang::EOpConvUint64ToBool) ? builder.makeUint64Constant(0) : builder.makeUintConstant(0);
+        zero = builder.makeUint64Constant(0);
         zero = makeSmearedConstant(zero, vectorSize);
         return builder.createBinOp(spv::OpINotEqual, destType, operand, zero);
 
@@ -4128,12 +5499,10 @@
         zero = makeSmearedConstant(zero, vectorSize);
         return builder.createBinOp(spv::OpFOrdNotEqual, destType, operand, zero);
 
-#ifdef AMD_EXTENSIONS
     case glslang::EOpConvFloat16ToBool:
         zero = builder.makeFloat16Constant(0.0F);
         zero = makeSmearedConstant(zero, vectorSize);
         return builder.createBinOp(spv::OpFOrdNotEqual, destType, operand, zero);
-#endif
 
     case glslang::EOpConvBoolToFloat:
         convOp = spv::OpSelect;
@@ -4147,82 +5516,141 @@
         one  = builder.makeDoubleConstant(1.0);
         break;
 
-#ifdef AMD_EXTENSIONS
     case glslang::EOpConvBoolToFloat16:
         convOp = spv::OpSelect;
         zero = builder.makeFloat16Constant(0.0F);
         one = builder.makeFloat16Constant(1.0F);
         break;
-#endif
+
+    case glslang::EOpConvBoolToInt8:
+        zero = builder.makeInt8Constant(0);
+        one  = builder.makeInt8Constant(1);
+        convOp = spv::OpSelect;
+        break;
+
+    case glslang::EOpConvBoolToUint8:
+        zero = builder.makeUint8Constant(0);
+        one  = builder.makeUint8Constant(1);
+        convOp = spv::OpSelect;
+        break;
+
+    case glslang::EOpConvBoolToInt16:
+        zero = builder.makeInt16Constant(0);
+        one  = builder.makeInt16Constant(1);
+        convOp = spv::OpSelect;
+        break;
+
+    case glslang::EOpConvBoolToUint16:
+        zero = builder.makeUint16Constant(0);
+        one  = builder.makeUint16Constant(1);
+        convOp = spv::OpSelect;
+        break;
 
     case glslang::EOpConvBoolToInt:
     case glslang::EOpConvBoolToInt64:
-        zero = (op == glslang::EOpConvBoolToInt64) ? builder.makeInt64Constant(0) : builder.makeIntConstant(0);
-        one  = (op == glslang::EOpConvBoolToInt64) ? builder.makeInt64Constant(1) : builder.makeIntConstant(1);
+        if (op == glslang::EOpConvBoolToInt64)
+            zero = builder.makeInt64Constant(0);
+        else
+            zero = builder.makeIntConstant(0);
+
+        if (op == glslang::EOpConvBoolToInt64)
+            one = builder.makeInt64Constant(1);
+        else
+            one = builder.makeIntConstant(1);
+
         convOp = spv::OpSelect;
         break;
 
     case glslang::EOpConvBoolToUint:
     case glslang::EOpConvBoolToUint64:
-        zero = (op == glslang::EOpConvBoolToUint64) ? builder.makeUint64Constant(0) : builder.makeUintConstant(0);
-        one  = (op == glslang::EOpConvBoolToUint64) ? builder.makeUint64Constant(1) : builder.makeUintConstant(1);
+        if (op == glslang::EOpConvBoolToUint64)
+            zero = builder.makeUint64Constant(0);
+        else
+            zero = builder.makeUintConstant(0);
+
+        if (op == glslang::EOpConvBoolToUint64)
+            one = builder.makeUint64Constant(1);
+        else
+            one = builder.makeUintConstant(1);
+
         convOp = spv::OpSelect;
         break;
 
+    case glslang::EOpConvInt8ToFloat16:
+    case glslang::EOpConvInt8ToFloat:
+    case glslang::EOpConvInt8ToDouble:
+    case glslang::EOpConvInt16ToFloat16:
+    case glslang::EOpConvInt16ToFloat:
+    case glslang::EOpConvInt16ToDouble:
+    case glslang::EOpConvIntToFloat16:
     case glslang::EOpConvIntToFloat:
     case glslang::EOpConvIntToDouble:
     case glslang::EOpConvInt64ToFloat:
     case glslang::EOpConvInt64ToDouble:
-#ifdef AMD_EXTENSIONS
-    case glslang::EOpConvIntToFloat16:
     case glslang::EOpConvInt64ToFloat16:
-#endif
         convOp = spv::OpConvertSToF;
         break;
 
+    case glslang::EOpConvUint8ToFloat16:
+    case glslang::EOpConvUint8ToFloat:
+    case glslang::EOpConvUint8ToDouble:
+    case glslang::EOpConvUint16ToFloat16:
+    case glslang::EOpConvUint16ToFloat:
+    case glslang::EOpConvUint16ToDouble:
+    case glslang::EOpConvUintToFloat16:
     case glslang::EOpConvUintToFloat:
     case glslang::EOpConvUintToDouble:
     case glslang::EOpConvUint64ToFloat:
     case glslang::EOpConvUint64ToDouble:
-#ifdef AMD_EXTENSIONS
-    case glslang::EOpConvUintToFloat16:
     case glslang::EOpConvUint64ToFloat16:
-#endif
         convOp = spv::OpConvertUToF;
         break;
 
     case glslang::EOpConvDoubleToFloat:
     case glslang::EOpConvFloatToDouble:
-#ifdef AMD_EXTENSIONS
     case glslang::EOpConvDoubleToFloat16:
     case glslang::EOpConvFloat16ToDouble:
     case glslang::EOpConvFloatToFloat16:
     case glslang::EOpConvFloat16ToFloat:
-#endif
         convOp = spv::OpFConvert;
         if (builder.isMatrixType(destType))
-            return createUnaryMatrixOperation(convOp, precision, noContraction, destType, operand, typeProxy);
+            return createUnaryMatrixOperation(convOp, decorations, destType, operand, typeProxy);
         break;
 
+    case glslang::EOpConvFloat16ToInt8:
+    case glslang::EOpConvFloatToInt8:
+    case glslang::EOpConvDoubleToInt8:
+    case glslang::EOpConvFloat16ToInt16:
+    case glslang::EOpConvFloatToInt16:
+    case glslang::EOpConvDoubleToInt16:
+    case glslang::EOpConvFloat16ToInt:
     case glslang::EOpConvFloatToInt:
     case glslang::EOpConvDoubleToInt:
+    case glslang::EOpConvFloat16ToInt64:
     case glslang::EOpConvFloatToInt64:
     case glslang::EOpConvDoubleToInt64:
-#ifdef AMD_EXTENSIONS
-    case glslang::EOpConvFloat16ToInt:
-    case glslang::EOpConvFloat16ToInt64:
-#endif
         convOp = spv::OpConvertFToS;
         break;
 
+    case glslang::EOpConvUint8ToInt8:
+    case glslang::EOpConvInt8ToUint8:
+    case glslang::EOpConvUint16ToInt16:
+    case glslang::EOpConvInt16ToUint16:
     case glslang::EOpConvUintToInt:
     case glslang::EOpConvIntToUint:
     case glslang::EOpConvUint64ToInt64:
     case glslang::EOpConvInt64ToUint64:
         if (builder.isInSpecConstCodeGenMode()) {
             // Build zero scalar or vector for OpIAdd.
-            zero = (op == glslang::EOpConvUint64ToInt64 ||
-                    op == glslang::EOpConvInt64ToUint64) ? builder.makeUint64Constant(0) : builder.makeUintConstant(0);
+            if(op == glslang::EOpConvUint8ToInt8 || op == glslang::EOpConvInt8ToUint8) {
+                zero = builder.makeUint8Constant(0);
+            } else if (op == glslang::EOpConvUint16ToInt16 || op == glslang::EOpConvInt16ToUint16) {
+                zero = builder.makeUint16Constant(0);
+            } else if (op == glslang::EOpConvUint64ToInt64 || op == glslang::EOpConvInt64ToUint64) {
+                zero = builder.makeUint64Constant(0);
+            } else {
+                zero = builder.makeUintConstant(0);
+            }
             zero = makeSmearedConstant(zero, vectorSize);
             // Use OpIAdd, instead of OpBitcast to do the conversion when
             // generating for OpSpecConstantOp instruction.
@@ -4232,63 +5660,117 @@
         convOp = spv::OpBitcast;
         break;
 
+    case glslang::EOpConvFloat16ToUint8:
+    case glslang::EOpConvFloatToUint8:
+    case glslang::EOpConvDoubleToUint8:
+    case glslang::EOpConvFloat16ToUint16:
+    case glslang::EOpConvFloatToUint16:
+    case glslang::EOpConvDoubleToUint16:
+    case glslang::EOpConvFloat16ToUint:
     case glslang::EOpConvFloatToUint:
     case glslang::EOpConvDoubleToUint:
     case glslang::EOpConvFloatToUint64:
     case glslang::EOpConvDoubleToUint64:
-#ifdef AMD_EXTENSIONS
-    case glslang::EOpConvFloat16ToUint:
     case glslang::EOpConvFloat16ToUint64:
-#endif
         convOp = spv::OpConvertFToU;
         break;
 
+    case glslang::EOpConvInt8ToInt16:
+    case glslang::EOpConvInt8ToInt:
+    case glslang::EOpConvInt8ToInt64:
+    case glslang::EOpConvInt16ToInt8:
+    case glslang::EOpConvInt16ToInt:
+    case glslang::EOpConvInt16ToInt64:
+    case glslang::EOpConvIntToInt8:
+    case glslang::EOpConvIntToInt16:
     case glslang::EOpConvIntToInt64:
+    case glslang::EOpConvInt64ToInt8:
+    case glslang::EOpConvInt64ToInt16:
     case glslang::EOpConvInt64ToInt:
         convOp = spv::OpSConvert;
         break;
 
+    case glslang::EOpConvUint8ToUint16:
+    case glslang::EOpConvUint8ToUint:
+    case glslang::EOpConvUint8ToUint64:
+    case glslang::EOpConvUint16ToUint8:
+    case glslang::EOpConvUint16ToUint:
+    case glslang::EOpConvUint16ToUint64:
+    case glslang::EOpConvUintToUint8:
+    case glslang::EOpConvUintToUint16:
     case glslang::EOpConvUintToUint64:
+    case glslang::EOpConvUint64ToUint8:
+    case glslang::EOpConvUint64ToUint16:
     case glslang::EOpConvUint64ToUint:
         convOp = spv::OpUConvert;
         break;
 
+    case glslang::EOpConvInt8ToUint16:
+    case glslang::EOpConvInt8ToUint:
+    case glslang::EOpConvInt8ToUint64:
+    case glslang::EOpConvInt16ToUint8:
+    case glslang::EOpConvInt16ToUint:
+    case glslang::EOpConvInt16ToUint64:
+    case glslang::EOpConvIntToUint8:
+    case glslang::EOpConvIntToUint16:
     case glslang::EOpConvIntToUint64:
+    case glslang::EOpConvInt64ToUint8:
+    case glslang::EOpConvInt64ToUint16:
     case glslang::EOpConvInt64ToUint:
-    case glslang::EOpConvUint64ToInt:
+    case glslang::EOpConvUint8ToInt16:
+    case glslang::EOpConvUint8ToInt:
+    case glslang::EOpConvUint8ToInt64:
+    case glslang::EOpConvUint16ToInt8:
+    case glslang::EOpConvUint16ToInt:
+    case glslang::EOpConvUint16ToInt64:
+    case glslang::EOpConvUintToInt8:
+    case glslang::EOpConvUintToInt16:
     case glslang::EOpConvUintToInt64:
+    case glslang::EOpConvUint64ToInt8:
+    case glslang::EOpConvUint64ToInt16:
+    case glslang::EOpConvUint64ToInt:
         // OpSConvert/OpUConvert + OpBitCast
-        switch (op) {
-        case glslang::EOpConvIntToUint64:
-            convOp = spv::OpSConvert;
-            type   = builder.makeIntType(64);
-            break;
-        case glslang::EOpConvInt64ToUint:
-            convOp = spv::OpSConvert;
-            type   = builder.makeIntType(32);
-            break;
-        case glslang::EOpConvUint64ToInt:
-            convOp = spv::OpUConvert;
-            type   = builder.makeUintType(32);
-            break;
-        case glslang::EOpConvUintToInt64:
-            convOp = spv::OpUConvert;
-            type   = builder.makeUintType(64);
-            break;
-        default:
-            assert(0);
-            break;
-        }
-
-        if (vectorSize > 0)
-            type = builder.makeVectorType(type, vectorSize);
-
-        operand = builder.createUnaryOp(convOp, type, operand);
+        operand = createIntWidthConversion(op, operand, vectorSize);
 
         if (builder.isInSpecConstCodeGenMode()) {
             // Build zero scalar or vector for OpIAdd.
-            zero = (op == glslang::EOpConvIntToUint64 ||
-                    op == glslang::EOpConvUintToInt64) ? builder.makeUint64Constant(0) : builder.makeUintConstant(0);
+            switch(op) {
+            case glslang::EOpConvInt16ToUint8:
+            case glslang::EOpConvIntToUint8:
+            case glslang::EOpConvInt64ToUint8:
+            case glslang::EOpConvUint16ToInt8:
+            case glslang::EOpConvUintToInt8:
+            case glslang::EOpConvUint64ToInt8:
+                zero = builder.makeUint8Constant(0);
+                break;
+            case glslang::EOpConvInt8ToUint16:
+            case glslang::EOpConvIntToUint16:
+            case glslang::EOpConvInt64ToUint16:
+            case glslang::EOpConvUint8ToInt16:
+            case glslang::EOpConvUintToInt16:
+            case glslang::EOpConvUint64ToInt16:
+                zero = builder.makeUint16Constant(0);
+                break;
+            case glslang::EOpConvInt8ToUint:
+            case glslang::EOpConvInt16ToUint:
+            case glslang::EOpConvInt64ToUint:
+            case glslang::EOpConvUint8ToInt:
+            case glslang::EOpConvUint16ToInt:
+            case glslang::EOpConvUint64ToInt:
+                zero = builder.makeUintConstant(0);
+                break;
+            case glslang::EOpConvInt8ToUint64:
+            case glslang::EOpConvInt16ToUint64:
+            case glslang::EOpConvIntToUint64:
+            case glslang::EOpConvUint8ToInt64:
+            case glslang::EOpConvUint16ToInt64:
+            case glslang::EOpConvUintToInt64:
+                zero = builder.makeUint64Constant(0);
+                break;
+            default:
+                assert(false && "Default missing");
+                break;
+            }
             zero = makeSmearedConstant(zero, vectorSize);
             // Use OpIAdd, instead of OpBitcast to do the conversion when
             // generating for OpSpecConstantOp instruction.
@@ -4312,7 +5794,9 @@
     } else
         result = builder.createUnaryOp(convOp, destType, operand);
 
-    return builder.setPrecision(result, precision);
+    result = builder.setPrecision(result, decorations.precision);
+    builder.addDecoration(result, decorations.nonUniform);
+    return result;
 }
 
 spv::Id TGlslangToSpvTraverser::makeSmearedConstant(spv::Id constant, int vectorSize)
@@ -4335,34 +5819,45 @@
     switch (op) {
     case glslang::EOpAtomicAdd:
     case glslang::EOpImageAtomicAdd:
+    case glslang::EOpAtomicCounterAdd:
         opCode = spv::OpAtomicIAdd;
         break;
+    case glslang::EOpAtomicCounterSubtract:
+        opCode = spv::OpAtomicISub;
+        break;
     case glslang::EOpAtomicMin:
     case glslang::EOpImageAtomicMin:
-        opCode = typeProxy == glslang::EbtUint ? spv::OpAtomicUMin : spv::OpAtomicSMin;
+    case glslang::EOpAtomicCounterMin:
+        opCode = (typeProxy == glslang::EbtUint || typeProxy == glslang::EbtUint64) ? spv::OpAtomicUMin : spv::OpAtomicSMin;
         break;
     case glslang::EOpAtomicMax:
     case glslang::EOpImageAtomicMax:
-        opCode = typeProxy == glslang::EbtUint ? spv::OpAtomicUMax : spv::OpAtomicSMax;
+    case glslang::EOpAtomicCounterMax:
+        opCode = (typeProxy == glslang::EbtUint || typeProxy == glslang::EbtUint64) ? spv::OpAtomicUMax : spv::OpAtomicSMax;
         break;
     case glslang::EOpAtomicAnd:
     case glslang::EOpImageAtomicAnd:
+    case glslang::EOpAtomicCounterAnd:
         opCode = spv::OpAtomicAnd;
         break;
     case glslang::EOpAtomicOr:
     case glslang::EOpImageAtomicOr:
+    case glslang::EOpAtomicCounterOr:
         opCode = spv::OpAtomicOr;
         break;
     case glslang::EOpAtomicXor:
     case glslang::EOpImageAtomicXor:
+    case glslang::EOpAtomicCounterXor:
         opCode = spv::OpAtomicXor;
         break;
     case glslang::EOpAtomicExchange:
     case glslang::EOpImageAtomicExchange:
+    case glslang::EOpAtomicCounterExchange:
         opCode = spv::OpAtomicExchange;
         break;
     case glslang::EOpAtomicCompSwap:
     case glslang::EOpImageAtomicCompSwap:
+    case glslang::EOpAtomicCounterCompSwap:
         opCode = spv::OpAtomicCompareExchange;
         break;
     case glslang::EOpAtomicCounterIncrement:
@@ -4372,49 +5867,112 @@
         opCode = spv::OpAtomicIDecrement;
         break;
     case glslang::EOpAtomicCounter:
+    case glslang::EOpImageAtomicLoad:
+    case glslang::EOpAtomicLoad:
         opCode = spv::OpAtomicLoad;
         break;
+    case glslang::EOpAtomicStore:
+    case glslang::EOpImageAtomicStore:
+        opCode = spv::OpAtomicStore;
+        break;
     default:
         assert(0);
         break;
     }
 
+    if (typeProxy == glslang::EbtInt64 || typeProxy == glslang::EbtUint64)
+        builder.addCapability(spv::CapabilityInt64Atomics);
+
     // Sort out the operands
     //  - mapping from glslang -> SPV
-    //  - there are extra SPV operands with no glslang source
+    //  - there are extra SPV operands that are optional in glslang
     //  - compare-exchange swaps the value and comparator
     //  - compare-exchange has an extra memory semantics
-    std::vector<spv::Id> spvAtomicOperands;  // hold the spv operands
-    auto opIt = operands.begin();            // walk the glslang operands
-    spvAtomicOperands.push_back(*(opIt++));
-    spvAtomicOperands.push_back(builder.makeUintConstant(spv::ScopeDevice));     // TBD: what is the correct scope?
-    spvAtomicOperands.push_back(builder.makeUintConstant(spv::MemorySemanticsMaskNone)); // TBD: what are the correct memory semantics?
-    if (opCode == spv::OpAtomicCompareExchange) {
-        // There are 2 memory semantics for compare-exchange. And the operand order of "comparator" and "new value" in GLSL
-        // differs from that in SPIR-V. Hence, special processing is required.
-        spvAtomicOperands.push_back(builder.makeUintConstant(spv::MemorySemanticsMaskNone));
-        spvAtomicOperands.push_back(*(opIt + 1));
-        spvAtomicOperands.push_back(*opIt);
-        opIt += 2;
+    //  - EOpAtomicCounterDecrement needs a post decrement
+    spv::Id pointerId = 0, compareId = 0, valueId = 0;
+    // scope defaults to Device in the old model, QueueFamilyKHR in the new model
+    spv::Id scopeId;
+    if (glslangIntermediate->usingVulkanMemoryModel()) {
+        scopeId = builder.makeUintConstant(spv::ScopeQueueFamilyKHR);
+    } else {
+        scopeId = builder.makeUintConstant(spv::ScopeDevice);
+    }
+    // semantics default to relaxed 
+    spv::Id semanticsId = builder.makeUintConstant(spv::MemorySemanticsMaskNone);
+    spv::Id semanticsId2 = semanticsId;
+
+    pointerId = operands[0];
+    if (opCode == spv::OpAtomicIIncrement || opCode == spv::OpAtomicIDecrement) {
+        // no additional operands
+    } else if (opCode == spv::OpAtomicCompareExchange) {
+        compareId = operands[1];
+        valueId = operands[2];
+        if (operands.size() > 3) {
+            scopeId = operands[3];
+            semanticsId = builder.makeUintConstant(builder.getConstantScalar(operands[4]) | builder.getConstantScalar(operands[5]));
+            semanticsId2 = builder.makeUintConstant(builder.getConstantScalar(operands[6]) | builder.getConstantScalar(operands[7]));
+        }
+    } else if (opCode == spv::OpAtomicLoad) {
+        if (operands.size() > 1) {
+            scopeId = operands[1];
+            semanticsId = builder.makeUintConstant(builder.getConstantScalar(operands[2]) | builder.getConstantScalar(operands[3]));
+        }
+    } else {
+        // atomic store or RMW
+        valueId = operands[1];
+        if (operands.size() > 2) {
+            scopeId = operands[2];
+            semanticsId = builder.makeUintConstant(builder.getConstantScalar(operands[3]) | builder.getConstantScalar(operands[4]));
+        }
     }
 
-    // Add the rest of the operands, skipping any that were dealt with above.
-    for (; opIt != operands.end(); ++opIt)
-        spvAtomicOperands.push_back(*opIt);
+    // Check for capabilities
+    unsigned semanticsImmediate = builder.getConstantScalar(semanticsId) | builder.getConstantScalar(semanticsId2);
+    if (semanticsImmediate & (spv::MemorySemanticsMakeAvailableKHRMask | spv::MemorySemanticsMakeVisibleKHRMask | spv::MemorySemanticsOutputMemoryKHRMask)) {
+        builder.addCapability(spv::CapabilityVulkanMemoryModelKHR);
+    }
 
-    return builder.createOp(opCode, typeId, spvAtomicOperands);
+    if (glslangIntermediate->usingVulkanMemoryModel() && builder.getConstantScalar(scopeId) == spv::ScopeDevice) {
+        builder.addCapability(spv::CapabilityVulkanMemoryModelDeviceScopeKHR);
+    }
+
+    std::vector<spv::Id> spvAtomicOperands;  // hold the spv operands
+    spvAtomicOperands.push_back(pointerId);
+    spvAtomicOperands.push_back(scopeId);
+    spvAtomicOperands.push_back(semanticsId);
+    if (opCode == spv::OpAtomicCompareExchange) {
+        spvAtomicOperands.push_back(semanticsId2);
+        spvAtomicOperands.push_back(valueId);
+        spvAtomicOperands.push_back(compareId);
+    } else if (opCode != spv::OpAtomicLoad && opCode != spv::OpAtomicIIncrement && opCode != spv::OpAtomicIDecrement) {
+        spvAtomicOperands.push_back(valueId);
+    }
+
+    if (opCode == spv::OpAtomicStore) {
+        builder.createNoResultOp(opCode, spvAtomicOperands);
+        return 0;
+    } else {
+        spv::Id resultId = builder.createOp(opCode, typeId, spvAtomicOperands);
+
+        // GLSL and HLSL atomic-counter decrement return post-decrement value,
+        // while SPIR-V returns pre-decrement value. Translate between these semantics.
+        if (op == glslang::EOpAtomicCounterDecrement)
+            resultId = builder.createBinOp(spv::OpISub, typeId, resultId, builder.makeIntConstant(1));
+
+        return resultId;
+    }
 }
 
 // Create group invocation operations.
 spv::Id TGlslangToSpvTraverser::createInvocationsOperation(glslang::TOperator op, spv::Id typeId, std::vector<spv::Id>& operands, glslang::TBasicType typeProxy)
 {
 #ifdef AMD_EXTENSIONS
-    bool isUnsigned = typeProxy == glslang::EbtUint || typeProxy == glslang::EbtUint64;
-    bool isFloat = typeProxy == glslang::EbtFloat || typeProxy == glslang::EbtDouble || typeProxy == glslang::EbtFloat16;
+    bool isUnsigned = isTypeUnsignedInt(typeProxy);
+    bool isFloat = isTypeFloat(typeProxy);
 #endif
 
     spv::Op opCode = spv::OpNop;
-    std::vector<spv::Id> spvGroupOperands;
+    std::vector<spv::IdImmediate> spvGroupOperands;
     spv::GroupOperation groupOperation = spv::GroupOperationMax;
 
     if (op == glslang::EOpBallot || op == glslang::EOpReadFirstInvocation ||
@@ -4441,7 +5999,6 @@
             builder.addExtension(spv::E_SPV_AMD_shader_ballot);
 #endif
 
-        spvGroupOperands.push_back(builder.makeUintConstant(spv::ScopeSubgroup));
 #ifdef AMD_EXTENSIONS
         switch (op) {
         case glslang::EOpMinInvocations:
@@ -4451,7 +6008,6 @@
         case glslang::EOpMaxInvocationsNonUniform:
         case glslang::EOpAddInvocationsNonUniform:
             groupOperation = spv::GroupOperationReduce;
-            spvGroupOperands.push_back(groupOperation);
             break;
         case glslang::EOpMinInvocationsInclusiveScan:
         case glslang::EOpMaxInvocationsInclusiveScan:
@@ -4460,7 +6016,6 @@
         case glslang::EOpMaxInvocationsInclusiveScanNonUniform:
         case glslang::EOpAddInvocationsInclusiveScanNonUniform:
             groupOperation = spv::GroupOperationInclusiveScan;
-            spvGroupOperands.push_back(groupOperation);
             break;
         case glslang::EOpMinInvocationsExclusiveScan:
         case glslang::EOpMaxInvocationsExclusiveScan:
@@ -4469,16 +6024,23 @@
         case glslang::EOpMaxInvocationsExclusiveScanNonUniform:
         case glslang::EOpAddInvocationsExclusiveScanNonUniform:
             groupOperation = spv::GroupOperationExclusiveScan;
-            spvGroupOperands.push_back(groupOperation);
             break;
         default:
             break;
         }
+        spv::IdImmediate scope = { true, builder.makeUintConstant(spv::ScopeSubgroup) };
+        spvGroupOperands.push_back(scope);
+        if (groupOperation != spv::GroupOperationMax) {
+            spv::IdImmediate groupOp = { false, (unsigned)groupOperation };
+            spvGroupOperands.push_back(groupOp);
+        }
 #endif
     }
 
-    for (auto opIt = operands.begin(); opIt != operands.end(); ++opIt)
-        spvGroupOperands.push_back(*opIt);
+    for (auto opIt = operands.begin(); opIt != operands.end(); ++opIt) {
+        spv::IdImmediate op = { true, *opIt };
+        spvGroupOperands.push_back(op);
+    }
 
     switch (op) {
     case glslang::EOpAnyInvocation:
@@ -4617,7 +6179,8 @@
 }
 
 // Create group invocation operations on a vector
-spv::Id TGlslangToSpvTraverser::CreateInvocationsVectorOperation(spv::Op op, spv::GroupOperation groupOperation, spv::Id typeId, std::vector<spv::Id>& operands)
+spv::Id TGlslangToSpvTraverser::CreateInvocationsVectorOperation(spv::Op op, spv::GroupOperation groupOperation,
+    spv::Id typeId, std::vector<spv::Id>& operands)
 {
 #ifdef AMD_EXTENSIONS
     assert(op == spv::OpGroupFMin || op == spv::OpGroupUMin || op == spv::OpGroupSMin ||
@@ -4650,18 +6213,23 @@
     for (int comp = 0; comp < numComponents; ++comp) {
         std::vector<unsigned int> indexes;
         indexes.push_back(comp);
-        spv::Id scalar = builder.createCompositeExtract(operands[0], scalarType, indexes);
-        std::vector<spv::Id> spvGroupOperands;
+        spv::IdImmediate scalar = { true, builder.createCompositeExtract(operands[0], scalarType, indexes) };
+        std::vector<spv::IdImmediate> spvGroupOperands;
         if (op == spv::OpSubgroupReadInvocationKHR) {
             spvGroupOperands.push_back(scalar);
-            spvGroupOperands.push_back(operands[1]);
+            spv::IdImmediate operand = { true, operands[1] };
+            spvGroupOperands.push_back(operand);
         } else if (op == spv::OpGroupBroadcast) {
-            spvGroupOperands.push_back(builder.makeUintConstant(spv::ScopeSubgroup));
+            spv::IdImmediate scope = { true, builder.makeUintConstant(spv::ScopeSubgroup) };
+            spvGroupOperands.push_back(scope);
             spvGroupOperands.push_back(scalar);
-            spvGroupOperands.push_back(operands[1]);
+            spv::IdImmediate operand = { true, operands[1] };
+            spvGroupOperands.push_back(operand);
         } else {
-            spvGroupOperands.push_back(builder.makeUintConstant(spv::ScopeSubgroup));
-            spvGroupOperands.push_back(groupOperation);
+            spv::IdImmediate scope = { true, builder.makeUintConstant(spv::ScopeSubgroup) };
+            spvGroupOperands.push_back(scope);
+            spv::IdImmediate groupOp = { false, (unsigned)groupOperation };
+            spvGroupOperands.push_back(groupOp);
             spvGroupOperands.push_back(scalar);
         }
 
@@ -4672,14 +6240,370 @@
     return builder.createCompositeConstruct(typeId, results);
 }
 
+// Create subgroup invocation operations.
+spv::Id TGlslangToSpvTraverser::createSubgroupOperation(glslang::TOperator op, spv::Id typeId,
+    std::vector<spv::Id>& operands, glslang::TBasicType typeProxy)
+{
+    // Add the required capabilities.
+    switch (op) {
+    case glslang::EOpSubgroupElect:
+        builder.addCapability(spv::CapabilityGroupNonUniform);
+        break;
+    case glslang::EOpSubgroupAll:
+    case glslang::EOpSubgroupAny:
+    case glslang::EOpSubgroupAllEqual:
+        builder.addCapability(spv::CapabilityGroupNonUniform);
+        builder.addCapability(spv::CapabilityGroupNonUniformVote);
+        break;
+    case glslang::EOpSubgroupBroadcast:
+    case glslang::EOpSubgroupBroadcastFirst:
+    case glslang::EOpSubgroupBallot:
+    case glslang::EOpSubgroupInverseBallot:
+    case glslang::EOpSubgroupBallotBitExtract:
+    case glslang::EOpSubgroupBallotBitCount:
+    case glslang::EOpSubgroupBallotInclusiveBitCount:
+    case glslang::EOpSubgroupBallotExclusiveBitCount:
+    case glslang::EOpSubgroupBallotFindLSB:
+    case glslang::EOpSubgroupBallotFindMSB:
+        builder.addCapability(spv::CapabilityGroupNonUniform);
+        builder.addCapability(spv::CapabilityGroupNonUniformBallot);
+        break;
+    case glslang::EOpSubgroupShuffle:
+    case glslang::EOpSubgroupShuffleXor:
+        builder.addCapability(spv::CapabilityGroupNonUniform);
+        builder.addCapability(spv::CapabilityGroupNonUniformShuffle);
+        break;
+    case glslang::EOpSubgroupShuffleUp:
+    case glslang::EOpSubgroupShuffleDown:
+        builder.addCapability(spv::CapabilityGroupNonUniform);
+        builder.addCapability(spv::CapabilityGroupNonUniformShuffleRelative);
+        break;
+    case glslang::EOpSubgroupAdd:
+    case glslang::EOpSubgroupMul:
+    case glslang::EOpSubgroupMin:
+    case glslang::EOpSubgroupMax:
+    case glslang::EOpSubgroupAnd:
+    case glslang::EOpSubgroupOr:
+    case glslang::EOpSubgroupXor:
+    case glslang::EOpSubgroupInclusiveAdd:
+    case glslang::EOpSubgroupInclusiveMul:
+    case glslang::EOpSubgroupInclusiveMin:
+    case glslang::EOpSubgroupInclusiveMax:
+    case glslang::EOpSubgroupInclusiveAnd:
+    case glslang::EOpSubgroupInclusiveOr:
+    case glslang::EOpSubgroupInclusiveXor:
+    case glslang::EOpSubgroupExclusiveAdd:
+    case glslang::EOpSubgroupExclusiveMul:
+    case glslang::EOpSubgroupExclusiveMin:
+    case glslang::EOpSubgroupExclusiveMax:
+    case glslang::EOpSubgroupExclusiveAnd:
+    case glslang::EOpSubgroupExclusiveOr:
+    case glslang::EOpSubgroupExclusiveXor:
+        builder.addCapability(spv::CapabilityGroupNonUniform);
+        builder.addCapability(spv::CapabilityGroupNonUniformArithmetic);
+        break;
+    case glslang::EOpSubgroupClusteredAdd:
+    case glslang::EOpSubgroupClusteredMul:
+    case glslang::EOpSubgroupClusteredMin:
+    case glslang::EOpSubgroupClusteredMax:
+    case glslang::EOpSubgroupClusteredAnd:
+    case glslang::EOpSubgroupClusteredOr:
+    case glslang::EOpSubgroupClusteredXor:
+        builder.addCapability(spv::CapabilityGroupNonUniform);
+        builder.addCapability(spv::CapabilityGroupNonUniformClustered);
+        break;
+    case glslang::EOpSubgroupQuadBroadcast:
+    case glslang::EOpSubgroupQuadSwapHorizontal:
+    case glslang::EOpSubgroupQuadSwapVertical:
+    case glslang::EOpSubgroupQuadSwapDiagonal:
+        builder.addCapability(spv::CapabilityGroupNonUniform);
+        builder.addCapability(spv::CapabilityGroupNonUniformQuad);
+        break;
+#ifdef NV_EXTENSIONS
+    case glslang::EOpSubgroupPartitionedAdd:
+    case glslang::EOpSubgroupPartitionedMul:
+    case glslang::EOpSubgroupPartitionedMin:
+    case glslang::EOpSubgroupPartitionedMax:
+    case glslang::EOpSubgroupPartitionedAnd:
+    case glslang::EOpSubgroupPartitionedOr:
+    case glslang::EOpSubgroupPartitionedXor:
+    case glslang::EOpSubgroupPartitionedInclusiveAdd:
+    case glslang::EOpSubgroupPartitionedInclusiveMul:
+    case glslang::EOpSubgroupPartitionedInclusiveMin:
+    case glslang::EOpSubgroupPartitionedInclusiveMax:
+    case glslang::EOpSubgroupPartitionedInclusiveAnd:
+    case glslang::EOpSubgroupPartitionedInclusiveOr:
+    case glslang::EOpSubgroupPartitionedInclusiveXor:
+    case glslang::EOpSubgroupPartitionedExclusiveAdd:
+    case glslang::EOpSubgroupPartitionedExclusiveMul:
+    case glslang::EOpSubgroupPartitionedExclusiveMin:
+    case glslang::EOpSubgroupPartitionedExclusiveMax:
+    case glslang::EOpSubgroupPartitionedExclusiveAnd:
+    case glslang::EOpSubgroupPartitionedExclusiveOr:
+    case glslang::EOpSubgroupPartitionedExclusiveXor:
+        builder.addExtension(spv::E_SPV_NV_shader_subgroup_partitioned);
+        builder.addCapability(spv::CapabilityGroupNonUniformPartitionedNV);
+        break;
+#endif
+    default: assert(0 && "Unhandled subgroup operation!");
+    }
+
+    const bool isUnsigned = typeProxy == glslang::EbtUint || typeProxy == glslang::EbtUint64;
+    const bool isFloat = typeProxy == glslang::EbtFloat || typeProxy == glslang::EbtDouble;
+    const bool isBool = typeProxy == glslang::EbtBool;
+
+    spv::Op opCode = spv::OpNop;
+
+    // Figure out which opcode to use.
+    switch (op) {
+    case glslang::EOpSubgroupElect:                   opCode = spv::OpGroupNonUniformElect; break;
+    case glslang::EOpSubgroupAll:                     opCode = spv::OpGroupNonUniformAll; break;
+    case glslang::EOpSubgroupAny:                     opCode = spv::OpGroupNonUniformAny; break;
+    case glslang::EOpSubgroupAllEqual:                opCode = spv::OpGroupNonUniformAllEqual; break;
+    case glslang::EOpSubgroupBroadcast:               opCode = spv::OpGroupNonUniformBroadcast; break;
+    case glslang::EOpSubgroupBroadcastFirst:          opCode = spv::OpGroupNonUniformBroadcastFirst; break;
+    case glslang::EOpSubgroupBallot:                  opCode = spv::OpGroupNonUniformBallot; break;
+    case glslang::EOpSubgroupInverseBallot:           opCode = spv::OpGroupNonUniformInverseBallot; break;
+    case glslang::EOpSubgroupBallotBitExtract:        opCode = spv::OpGroupNonUniformBallotBitExtract; break;
+    case glslang::EOpSubgroupBallotBitCount:
+    case glslang::EOpSubgroupBallotInclusiveBitCount:
+    case glslang::EOpSubgroupBallotExclusiveBitCount: opCode = spv::OpGroupNonUniformBallotBitCount; break;
+    case glslang::EOpSubgroupBallotFindLSB:           opCode = spv::OpGroupNonUniformBallotFindLSB; break;
+    case glslang::EOpSubgroupBallotFindMSB:           opCode = spv::OpGroupNonUniformBallotFindMSB; break;
+    case glslang::EOpSubgroupShuffle:                 opCode = spv::OpGroupNonUniformShuffle; break;
+    case glslang::EOpSubgroupShuffleXor:              opCode = spv::OpGroupNonUniformShuffleXor; break;
+    case glslang::EOpSubgroupShuffleUp:               opCode = spv::OpGroupNonUniformShuffleUp; break;
+    case glslang::EOpSubgroupShuffleDown:             opCode = spv::OpGroupNonUniformShuffleDown; break;
+    case glslang::EOpSubgroupAdd:
+    case glslang::EOpSubgroupInclusiveAdd:
+    case glslang::EOpSubgroupExclusiveAdd:
+    case glslang::EOpSubgroupClusteredAdd:
+#ifdef NV_EXTENSIONS
+    case glslang::EOpSubgroupPartitionedAdd:
+    case glslang::EOpSubgroupPartitionedInclusiveAdd:
+    case glslang::EOpSubgroupPartitionedExclusiveAdd:
+#endif
+        if (isFloat) {
+            opCode = spv::OpGroupNonUniformFAdd;
+        } else {
+            opCode = spv::OpGroupNonUniformIAdd;
+        }
+        break;
+    case glslang::EOpSubgroupMul:
+    case glslang::EOpSubgroupInclusiveMul:
+    case glslang::EOpSubgroupExclusiveMul:
+    case glslang::EOpSubgroupClusteredMul:
+#ifdef NV_EXTENSIONS
+    case glslang::EOpSubgroupPartitionedMul:
+    case glslang::EOpSubgroupPartitionedInclusiveMul:
+    case glslang::EOpSubgroupPartitionedExclusiveMul:
+#endif
+        if (isFloat) {
+            opCode = spv::OpGroupNonUniformFMul;
+        } else {
+            opCode = spv::OpGroupNonUniformIMul;
+        }
+        break;
+    case glslang::EOpSubgroupMin:
+    case glslang::EOpSubgroupInclusiveMin:
+    case glslang::EOpSubgroupExclusiveMin:
+    case glslang::EOpSubgroupClusteredMin:
+#ifdef NV_EXTENSIONS
+    case glslang::EOpSubgroupPartitionedMin:
+    case glslang::EOpSubgroupPartitionedInclusiveMin:
+    case glslang::EOpSubgroupPartitionedExclusiveMin:
+#endif
+        if (isFloat) {
+            opCode = spv::OpGroupNonUniformFMin;
+        } else if (isUnsigned) {
+            opCode = spv::OpGroupNonUniformUMin;
+        } else {
+            opCode = spv::OpGroupNonUniformSMin;
+        }
+        break;
+    case glslang::EOpSubgroupMax:
+    case glslang::EOpSubgroupInclusiveMax:
+    case glslang::EOpSubgroupExclusiveMax:
+    case glslang::EOpSubgroupClusteredMax:
+#ifdef NV_EXTENSIONS
+    case glslang::EOpSubgroupPartitionedMax:
+    case glslang::EOpSubgroupPartitionedInclusiveMax:
+    case glslang::EOpSubgroupPartitionedExclusiveMax:
+#endif
+        if (isFloat) {
+            opCode = spv::OpGroupNonUniformFMax;
+        } else if (isUnsigned) {
+            opCode = spv::OpGroupNonUniformUMax;
+        } else {
+            opCode = spv::OpGroupNonUniformSMax;
+        }
+        break;
+    case glslang::EOpSubgroupAnd:
+    case glslang::EOpSubgroupInclusiveAnd:
+    case glslang::EOpSubgroupExclusiveAnd:
+    case glslang::EOpSubgroupClusteredAnd:
+#ifdef NV_EXTENSIONS
+    case glslang::EOpSubgroupPartitionedAnd:
+    case glslang::EOpSubgroupPartitionedInclusiveAnd:
+    case glslang::EOpSubgroupPartitionedExclusiveAnd:
+#endif
+        if (isBool) {
+            opCode = spv::OpGroupNonUniformLogicalAnd;
+        } else {
+            opCode = spv::OpGroupNonUniformBitwiseAnd;
+        }
+        break;
+    case glslang::EOpSubgroupOr:
+    case glslang::EOpSubgroupInclusiveOr:
+    case glslang::EOpSubgroupExclusiveOr:
+    case glslang::EOpSubgroupClusteredOr:
+#ifdef NV_EXTENSIONS
+    case glslang::EOpSubgroupPartitionedOr:
+    case glslang::EOpSubgroupPartitionedInclusiveOr:
+    case glslang::EOpSubgroupPartitionedExclusiveOr:
+#endif
+        if (isBool) {
+            opCode = spv::OpGroupNonUniformLogicalOr;
+        } else {
+            opCode = spv::OpGroupNonUniformBitwiseOr;
+        }
+        break;
+    case glslang::EOpSubgroupXor:
+    case glslang::EOpSubgroupInclusiveXor:
+    case glslang::EOpSubgroupExclusiveXor:
+    case glslang::EOpSubgroupClusteredXor:
+#ifdef NV_EXTENSIONS
+    case glslang::EOpSubgroupPartitionedXor:
+    case glslang::EOpSubgroupPartitionedInclusiveXor:
+    case glslang::EOpSubgroupPartitionedExclusiveXor:
+#endif
+        if (isBool) {
+            opCode = spv::OpGroupNonUniformLogicalXor;
+        } else {
+            opCode = spv::OpGroupNonUniformBitwiseXor;
+        }
+        break;
+    case glslang::EOpSubgroupQuadBroadcast:      opCode = spv::OpGroupNonUniformQuadBroadcast; break;
+    case glslang::EOpSubgroupQuadSwapHorizontal:
+    case glslang::EOpSubgroupQuadSwapVertical:
+    case glslang::EOpSubgroupQuadSwapDiagonal:   opCode = spv::OpGroupNonUniformQuadSwap; break;
+    default: assert(0 && "Unhandled subgroup operation!");
+    }
+
+    // get the right Group Operation
+    spv::GroupOperation groupOperation = spv::GroupOperationMax;
+    switch (op) {
+    default:
+        break;
+    case glslang::EOpSubgroupBallotBitCount:
+    case glslang::EOpSubgroupAdd:
+    case glslang::EOpSubgroupMul:
+    case glslang::EOpSubgroupMin:
+    case glslang::EOpSubgroupMax:
+    case glslang::EOpSubgroupAnd:
+    case glslang::EOpSubgroupOr:
+    case glslang::EOpSubgroupXor:
+        groupOperation = spv::GroupOperationReduce;
+        break;
+    case glslang::EOpSubgroupBallotInclusiveBitCount:
+    case glslang::EOpSubgroupInclusiveAdd:
+    case glslang::EOpSubgroupInclusiveMul:
+    case glslang::EOpSubgroupInclusiveMin:
+    case glslang::EOpSubgroupInclusiveMax:
+    case glslang::EOpSubgroupInclusiveAnd:
+    case glslang::EOpSubgroupInclusiveOr:
+    case glslang::EOpSubgroupInclusiveXor:
+        groupOperation = spv::GroupOperationInclusiveScan;
+        break;
+    case glslang::EOpSubgroupBallotExclusiveBitCount:
+    case glslang::EOpSubgroupExclusiveAdd:
+    case glslang::EOpSubgroupExclusiveMul:
+    case glslang::EOpSubgroupExclusiveMin:
+    case glslang::EOpSubgroupExclusiveMax:
+    case glslang::EOpSubgroupExclusiveAnd:
+    case glslang::EOpSubgroupExclusiveOr:
+    case glslang::EOpSubgroupExclusiveXor:
+        groupOperation = spv::GroupOperationExclusiveScan;
+        break;
+    case glslang::EOpSubgroupClusteredAdd:
+    case glslang::EOpSubgroupClusteredMul:
+    case glslang::EOpSubgroupClusteredMin:
+    case glslang::EOpSubgroupClusteredMax:
+    case glslang::EOpSubgroupClusteredAnd:
+    case glslang::EOpSubgroupClusteredOr:
+    case glslang::EOpSubgroupClusteredXor:
+        groupOperation = spv::GroupOperationClusteredReduce;
+        break;
+#ifdef NV_EXTENSIONS
+    case glslang::EOpSubgroupPartitionedAdd:
+    case glslang::EOpSubgroupPartitionedMul:
+    case glslang::EOpSubgroupPartitionedMin:
+    case glslang::EOpSubgroupPartitionedMax:
+    case glslang::EOpSubgroupPartitionedAnd:
+    case glslang::EOpSubgroupPartitionedOr:
+    case glslang::EOpSubgroupPartitionedXor:
+        groupOperation = spv::GroupOperationPartitionedReduceNV;
+        break;
+    case glslang::EOpSubgroupPartitionedInclusiveAdd:
+    case glslang::EOpSubgroupPartitionedInclusiveMul:
+    case glslang::EOpSubgroupPartitionedInclusiveMin:
+    case glslang::EOpSubgroupPartitionedInclusiveMax:
+    case glslang::EOpSubgroupPartitionedInclusiveAnd:
+    case glslang::EOpSubgroupPartitionedInclusiveOr:
+    case glslang::EOpSubgroupPartitionedInclusiveXor:
+        groupOperation = spv::GroupOperationPartitionedInclusiveScanNV;
+        break;
+    case glslang::EOpSubgroupPartitionedExclusiveAdd:
+    case glslang::EOpSubgroupPartitionedExclusiveMul:
+    case glslang::EOpSubgroupPartitionedExclusiveMin:
+    case glslang::EOpSubgroupPartitionedExclusiveMax:
+    case glslang::EOpSubgroupPartitionedExclusiveAnd:
+    case glslang::EOpSubgroupPartitionedExclusiveOr:
+    case glslang::EOpSubgroupPartitionedExclusiveXor:
+        groupOperation = spv::GroupOperationPartitionedExclusiveScanNV;
+        break;
+#endif
+    }
+
+    // build the instruction
+    std::vector<spv::IdImmediate> spvGroupOperands;
+
+    // Every operation begins with the Execution Scope operand.
+    spv::IdImmediate executionScope = { true, builder.makeUintConstant(spv::ScopeSubgroup) };
+    spvGroupOperands.push_back(executionScope);
+
+    // Next, for all operations that use a Group Operation, push that as an operand.
+    if (groupOperation != spv::GroupOperationMax) {
+        spv::IdImmediate groupOperand = { false, (unsigned)groupOperation };
+        spvGroupOperands.push_back(groupOperand);
+    }
+
+    // Push back the operands next.
+    for (auto opIt = operands.cbegin(); opIt != operands.cend(); ++opIt) {
+        spv::IdImmediate operand = { true, *opIt };
+        spvGroupOperands.push_back(operand);
+    }
+
+    // Some opcodes have additional operands.
+    spv::Id directionId = spv::NoResult;
+    switch (op) {
+    default: break;
+    case glslang::EOpSubgroupQuadSwapHorizontal: directionId = builder.makeUintConstant(0); break;
+    case glslang::EOpSubgroupQuadSwapVertical:   directionId = builder.makeUintConstant(1); break;
+    case glslang::EOpSubgroupQuadSwapDiagonal:   directionId = builder.makeUintConstant(2); break;
+    }
+    if (directionId != spv::NoResult) {
+        spv::IdImmediate direction = { true, directionId };
+        spvGroupOperands.push_back(direction);
+    }
+
+    return builder.createOp(opCode, typeId, spvGroupOperands);
+}
+
 spv::Id TGlslangToSpvTraverser::createMiscOperation(glslang::TOperator op, spv::Decoration precision, spv::Id typeId, std::vector<spv::Id>& operands, glslang::TBasicType typeProxy)
 {
-    bool isUnsigned = typeProxy == glslang::EbtUint || typeProxy == glslang::EbtUint64;
-#ifdef AMD_EXTENSIONS
-    bool isFloat = typeProxy == glslang::EbtFloat || typeProxy == glslang::EbtDouble || typeProxy == glslang::EbtFloat16;
-#else
-    bool isFloat = typeProxy == glslang::EbtFloat || typeProxy == glslang::EbtDouble;
-#endif
+    bool isUnsigned = isTypeUnsignedInt(typeProxy);
+    bool isFloat = isTypeFloat(typeProxy);
 
     spv::Op opCode = spv::OpNop;
     int extBuiltins = -1;
@@ -4771,11 +6695,17 @@
         libCall = spv::GLSLstd450Refract;
         break;
     case glslang::EOpInterpolateAtSample:
-        builder.addCapability(spv::CapabilityInterpolationFunction);
+#ifdef AMD_EXTENSIONS
+        if (typeProxy == glslang::EbtFloat16)
+            builder.addExtension(spv::E_SPV_AMD_gpu_shader_half_float);
+#endif
         libCall = spv::GLSLstd450InterpolateAtSample;
         break;
     case glslang::EOpInterpolateAtOffset:
-        builder.addCapability(spv::CapabilityInterpolationFunction);
+#ifdef AMD_EXTENSIONS
+        if (typeProxy == glslang::EbtFloat16)
+            builder.addExtension(spv::E_SPV_AMD_gpu_shader_half_float);
+#endif
         libCall = spv::GLSLstd450InterpolateAtOffset;
         break;
     case glslang::EOpAddCarry:
@@ -4816,10 +6746,11 @@
             libCall = spv::GLSLstd450FrexpStruct;
             assert(builder.isPointerType(typeId1));
             typeId1 = builder.getContainedTypeId(typeId1);
-#ifdef AMD_EXTENSIONS
             int width = builder.getScalarTypeWidth(typeId1);
-#else
-            int width = 32;
+#ifdef AMD_EXTENSIONS
+            if (width == 16)
+                // Using 16-bit exp operand, enable extension SPV_AMD_gpu_shader_int16
+                builder.addExtension(spv::E_SPV_AMD_gpu_shader_int16);
 #endif
             if (builder.getNumComponents(operands[0]) == 1)
                 frexpIntType = builder.makeIntegerType(width, true);
@@ -4836,6 +6767,45 @@
     case glslang::EOpReadInvocation:
         return createInvocationsOperation(op, typeId, operands, typeProxy);
 
+    case glslang::EOpSubgroupBroadcast:
+    case glslang::EOpSubgroupBallotBitExtract:
+    case glslang::EOpSubgroupShuffle:
+    case glslang::EOpSubgroupShuffleXor:
+    case glslang::EOpSubgroupShuffleUp:
+    case glslang::EOpSubgroupShuffleDown:
+    case glslang::EOpSubgroupClusteredAdd:
+    case glslang::EOpSubgroupClusteredMul:
+    case glslang::EOpSubgroupClusteredMin:
+    case glslang::EOpSubgroupClusteredMax:
+    case glslang::EOpSubgroupClusteredAnd:
+    case glslang::EOpSubgroupClusteredOr:
+    case glslang::EOpSubgroupClusteredXor:
+    case glslang::EOpSubgroupQuadBroadcast:
+#ifdef NV_EXTENSIONS
+    case glslang::EOpSubgroupPartitionedAdd:
+    case glslang::EOpSubgroupPartitionedMul:
+    case glslang::EOpSubgroupPartitionedMin:
+    case glslang::EOpSubgroupPartitionedMax:
+    case glslang::EOpSubgroupPartitionedAnd:
+    case glslang::EOpSubgroupPartitionedOr:
+    case glslang::EOpSubgroupPartitionedXor:
+    case glslang::EOpSubgroupPartitionedInclusiveAdd:
+    case glslang::EOpSubgroupPartitionedInclusiveMul:
+    case glslang::EOpSubgroupPartitionedInclusiveMin:
+    case glslang::EOpSubgroupPartitionedInclusiveMax:
+    case glslang::EOpSubgroupPartitionedInclusiveAnd:
+    case glslang::EOpSubgroupPartitionedInclusiveOr:
+    case glslang::EOpSubgroupPartitionedInclusiveXor:
+    case glslang::EOpSubgroupPartitionedExclusiveAdd:
+    case glslang::EOpSubgroupPartitionedExclusiveMul:
+    case glslang::EOpSubgroupPartitionedExclusiveMin:
+    case glslang::EOpSubgroupPartitionedExclusiveMax:
+    case glslang::EOpSubgroupPartitionedExclusiveAnd:
+    case glslang::EOpSubgroupPartitionedExclusiveOr:
+    case glslang::EOpSubgroupPartitionedExclusiveXor:
+#endif
+        return createSubgroupOperation(op, typeId, operands, typeProxy);
+
 #ifdef AMD_EXTENSIONS
     case glslang::EOpSwizzleInvocations:
         extBuiltins = getExtBuiltins(spv::E_SPV_AMD_shader_ballot);
@@ -4885,11 +6855,71 @@
         break;
 
     case glslang::EOpInterpolateAtVertex:
+        if (typeProxy == glslang::EbtFloat16)
+            builder.addExtension(spv::E_SPV_AMD_gpu_shader_half_float);
         extBuiltins = getExtBuiltins(spv::E_SPV_AMD_shader_explicit_vertex_parameter);
         libCall = spv::InterpolateAtVertexAMD;
         break;
 #endif
+    case glslang::EOpBarrier:
+        {
+            // This is for the extended controlBarrier function, with four operands.
+            // The unextended barrier() goes through createNoArgOperation.
+            assert(operands.size() == 4);
+            unsigned int executionScope = builder.getConstantScalar(operands[0]);
+            unsigned int memoryScope = builder.getConstantScalar(operands[1]);
+            unsigned int semantics = builder.getConstantScalar(operands[2]) | builder.getConstantScalar(operands[3]);
+            builder.createControlBarrier((spv::Scope)executionScope, (spv::Scope)memoryScope, (spv::MemorySemanticsMask)semantics);
+            if (semantics & (spv::MemorySemanticsMakeAvailableKHRMask | spv::MemorySemanticsMakeVisibleKHRMask | spv::MemorySemanticsOutputMemoryKHRMask)) {
+                builder.addCapability(spv::CapabilityVulkanMemoryModelKHR);
+            }
+            if (glslangIntermediate->usingVulkanMemoryModel() && (executionScope == spv::ScopeDevice || memoryScope == spv::ScopeDevice)) {
+                builder.addCapability(spv::CapabilityVulkanMemoryModelDeviceScopeKHR);
+            }
+            return 0;
+        }
+        break;
+    case glslang::EOpMemoryBarrier:
+        {
+            // This is for the extended memoryBarrier function, with three operands.
+            // The unextended memoryBarrier() goes through createNoArgOperation.
+            assert(operands.size() == 3);
+            unsigned int memoryScope = builder.getConstantScalar(operands[0]);
+            unsigned int semantics = builder.getConstantScalar(operands[1]) | builder.getConstantScalar(operands[2]);
+            builder.createMemoryBarrier((spv::Scope)memoryScope, (spv::MemorySemanticsMask)semantics);
+            if (semantics & (spv::MemorySemanticsMakeAvailableKHRMask | spv::MemorySemanticsMakeVisibleKHRMask | spv::MemorySemanticsOutputMemoryKHRMask)) {
+                builder.addCapability(spv::CapabilityVulkanMemoryModelKHR);
+            }
+            if (glslangIntermediate->usingVulkanMemoryModel() && memoryScope == spv::ScopeDevice) {
+                builder.addCapability(spv::CapabilityVulkanMemoryModelDeviceScopeKHR);
+            }
+            return 0;
+        }
+        break;
 
+#ifdef NV_EXTENSIONS
+    case glslang::EOpReportIntersectionNV:
+    {
+        typeId = builder.makeBoolType();
+        opCode = spv::OpReportIntersectionNV;
+    }
+    break;
+    case glslang::EOpTraceNV:
+    {
+        builder.createNoResultOp(spv::OpTraceNV, operands);
+        return 0;
+    }
+    break;
+    case glslang::EOpExecuteCallableNV:
+    {
+        builder.createNoResultOp(spv::OpExecuteCallableNV, operands);
+        return 0;
+    }
+    break;
+    case glslang::EOpWritePackedPrimitiveIndices4x8NV:
+        builder.createNoResultOp(spv::OpWritePackedPrimitiveIndices4x8NV, operands);
+        return 0;
+#endif
     default:
         return 0;
     }
@@ -4901,6 +6931,17 @@
         // We might need the remaining arguments, e.g. in the EOpFrexp case.
         std::vector<spv::Id> callArguments(operands.begin(), operands.begin() + consumedOperands);
         id = builder.createBuiltinCall(typeId, extBuiltins >= 0 ? extBuiltins : stdBuiltins, libCall, callArguments);
+    } else if (opCode == spv::OpDot && !isFloat) {
+        // int dot(int, int)
+        // NOTE: never called for scalar/vector1, this is turned into simple mul before this can be reached
+        const int componentCount = builder.getNumComponents(operands[0]);
+        spv::Id mulOp = builder.createBinOp(spv::OpIMul, builder.getTypeId(operands[0]), operands[0], operands[1]);
+        builder.setPrecision(mulOp, precision);
+        id = builder.createCompositeExtract(mulOp, typeId, 0);
+        for (int i = 1; i < componentCount; ++i) {
+            builder.setPrecision(id, precision);
+            id = builder.createBinOp(spv::OpIAdd, typeId, id, builder.createCompositeExtract(operands[0], typeId, i));
+        }
     } else {
         switch (consumedOperands) {
         case 0:
@@ -4958,7 +6999,8 @@
 // Intrinsics with no arguments (or no return value, and no precision).
 spv::Id TGlslangToSpvTraverser::createNoArgOperation(glslang::TOperator op, spv::Decoration precision, spv::Id typeId)
 {
-    // TODO: get the barrier operands correct
+    // GLSL memory barriers use queuefamily scope in new model, device scope in old model
+    spv::Scope memoryBarrierScope = glslangIntermediate->usingVulkanMemoryModel() ? spv::ScopeQueueFamilyKHR : spv::ScopeDevice;
 
     switch (op) {
     case glslang::EOpEmitVertex:
@@ -4968,41 +7010,93 @@
         builder.createNoResultOp(spv::OpEndPrimitive);
         return 0;
     case glslang::EOpBarrier:
-        builder.createControlBarrier(spv::ScopeWorkgroup, spv::ScopeDevice, spv::MemorySemanticsMaskNone);
+        if (glslangIntermediate->getStage() == EShLangTessControl) {
+            if (glslangIntermediate->usingVulkanMemoryModel()) {
+                builder.createControlBarrier(spv::ScopeWorkgroup, spv::ScopeWorkgroup,
+                                             spv::MemorySemanticsOutputMemoryKHRMask |
+                                             spv::MemorySemanticsAcquireReleaseMask);
+                builder.addCapability(spv::CapabilityVulkanMemoryModelKHR);
+            } else {
+                builder.createControlBarrier(spv::ScopeWorkgroup, spv::ScopeInvocation, spv::MemorySemanticsMaskNone);
+            }
+        } else {
+            builder.createControlBarrier(spv::ScopeWorkgroup, spv::ScopeWorkgroup,
+                                            spv::MemorySemanticsWorkgroupMemoryMask |
+                                            spv::MemorySemanticsAcquireReleaseMask);
+        }
         return 0;
     case glslang::EOpMemoryBarrier:
-        builder.createMemoryBarrier(spv::ScopeDevice, spv::MemorySemanticsAllMemory);
+        builder.createMemoryBarrier(memoryBarrierScope, spv::MemorySemanticsAllMemory |
+                                                        spv::MemorySemanticsAcquireReleaseMask);
         return 0;
     case glslang::EOpMemoryBarrierAtomicCounter:
-        builder.createMemoryBarrier(spv::ScopeDevice, spv::MemorySemanticsAtomicCounterMemoryMask);
+        builder.createMemoryBarrier(memoryBarrierScope, spv::MemorySemanticsAtomicCounterMemoryMask |
+                                                        spv::MemorySemanticsAcquireReleaseMask);
         return 0;
     case glslang::EOpMemoryBarrierBuffer:
-        builder.createMemoryBarrier(spv::ScopeDevice, spv::MemorySemanticsUniformMemoryMask);
+        builder.createMemoryBarrier(memoryBarrierScope, spv::MemorySemanticsUniformMemoryMask |
+                                                        spv::MemorySemanticsAcquireReleaseMask);
         return 0;
     case glslang::EOpMemoryBarrierImage:
-        builder.createMemoryBarrier(spv::ScopeDevice, spv::MemorySemanticsImageMemoryMask);
+        builder.createMemoryBarrier(memoryBarrierScope, spv::MemorySemanticsImageMemoryMask |
+                                                        spv::MemorySemanticsAcquireReleaseMask);
         return 0;
     case glslang::EOpMemoryBarrierShared:
-        builder.createMemoryBarrier(spv::ScopeDevice, spv::MemorySemanticsWorkgroupMemoryMask);
+        builder.createMemoryBarrier(memoryBarrierScope, spv::MemorySemanticsWorkgroupMemoryMask |
+                                                        spv::MemorySemanticsAcquireReleaseMask);
         return 0;
     case glslang::EOpGroupMemoryBarrier:
-        builder.createMemoryBarrier(spv::ScopeDevice, spv::MemorySemanticsCrossWorkgroupMemoryMask);
+        builder.createMemoryBarrier(spv::ScopeWorkgroup, spv::MemorySemanticsAllMemory |
+                                                         spv::MemorySemanticsAcquireReleaseMask);
         return 0;
     case glslang::EOpAllMemoryBarrierWithGroupSync:
-        // Control barrier with non-"None" semantic is also a memory barrier.
-        builder.createControlBarrier(spv::ScopeDevice, spv::ScopeDevice, spv::MemorySemanticsAllMemory);
+        builder.createControlBarrier(spv::ScopeWorkgroup, spv::ScopeDevice,
+                                        spv::MemorySemanticsAllMemory |
+                                        spv::MemorySemanticsAcquireReleaseMask);
         return 0;
-    case glslang::EOpGroupMemoryBarrierWithGroupSync:
-        // Control barrier with non-"None" semantic is also a memory barrier.
-        builder.createControlBarrier(spv::ScopeDevice, spv::ScopeDevice, spv::MemorySemanticsCrossWorkgroupMemoryMask);
+    case glslang::EOpDeviceMemoryBarrier:
+        builder.createMemoryBarrier(spv::ScopeDevice, spv::MemorySemanticsUniformMemoryMask |
+                                                      spv::MemorySemanticsImageMemoryMask |
+                                                      spv::MemorySemanticsAcquireReleaseMask);
+        return 0;
+    case glslang::EOpDeviceMemoryBarrierWithGroupSync:
+        builder.createControlBarrier(spv::ScopeWorkgroup, spv::ScopeDevice, spv::MemorySemanticsUniformMemoryMask |
+                                                                            spv::MemorySemanticsImageMemoryMask |
+                                                                            spv::MemorySemanticsAcquireReleaseMask);
         return 0;
     case glslang::EOpWorkgroupMemoryBarrier:
-        builder.createMemoryBarrier(spv::ScopeWorkgroup, spv::MemorySemanticsWorkgroupMemoryMask);
+        builder.createMemoryBarrier(spv::ScopeWorkgroup, spv::MemorySemanticsWorkgroupMemoryMask |
+                                                         spv::MemorySemanticsAcquireReleaseMask);
         return 0;
     case glslang::EOpWorkgroupMemoryBarrierWithGroupSync:
-        // Control barrier with non-"None" semantic is also a memory barrier.
-        builder.createControlBarrier(spv::ScopeWorkgroup, spv::ScopeWorkgroup, spv::MemorySemanticsWorkgroupMemoryMask);
+        builder.createControlBarrier(spv::ScopeWorkgroup, spv::ScopeWorkgroup,
+                                        spv::MemorySemanticsWorkgroupMemoryMask |
+                                        spv::MemorySemanticsAcquireReleaseMask);
         return 0;
+    case glslang::EOpSubgroupBarrier:
+        builder.createControlBarrier(spv::ScopeSubgroup, spv::ScopeSubgroup, spv::MemorySemanticsAllMemory |
+                                                                             spv::MemorySemanticsAcquireReleaseMask);
+        return spv::NoResult;
+    case glslang::EOpSubgroupMemoryBarrier:
+        builder.createMemoryBarrier(spv::ScopeSubgroup, spv::MemorySemanticsAllMemory |
+                                                        spv::MemorySemanticsAcquireReleaseMask);
+        return spv::NoResult;
+    case glslang::EOpSubgroupMemoryBarrierBuffer:
+        builder.createMemoryBarrier(spv::ScopeSubgroup, spv::MemorySemanticsUniformMemoryMask |
+                                                        spv::MemorySemanticsAcquireReleaseMask);
+        return spv::NoResult;
+    case glslang::EOpSubgroupMemoryBarrierImage:
+        builder.createMemoryBarrier(spv::ScopeSubgroup, spv::MemorySemanticsImageMemoryMask |
+                                                        spv::MemorySemanticsAcquireReleaseMask);
+        return spv::NoResult;
+    case glslang::EOpSubgroupMemoryBarrierShared:
+        builder.createMemoryBarrier(spv::ScopeSubgroup, spv::MemorySemanticsWorkgroupMemoryMask |
+                                                        spv::MemorySemanticsAcquireReleaseMask);
+        return spv::NoResult;
+    case glslang::EOpSubgroupElect: {
+        std::vector<spv::Id> operands;
+        return createSubgroupOperation(op, typeId, operands, glslang::EbtVoid);
+    }
 #ifdef AMD_EXTENSIONS
     case glslang::EOpTime:
     {
@@ -5011,6 +7105,14 @@
         return builder.setPrecision(id, precision);
     }
 #endif
+#ifdef NV_EXTENSIONS
+    case glslang::EOpIgnoreIntersectionNV:
+        builder.createNoResultOp(spv::OpIgnoreIntersectionNV);
+        return 0;
+    case glslang::EOpTerminateRayNV:
+        builder.createNoResultOp(spv::OpTerminateRayNV);
+        return 0;
+#endif
     default:
         logger->missingFunctionality("unknown operation with no arguments");
         return 0;
@@ -5031,24 +7133,18 @@
     symbolValues[symbol->getId()] = id;
 
     if (symbol->getBasicType() != glslang::EbtBlock) {
-        addDecoration(id, TranslatePrecisionDecoration(symbol->getType()));
-        addDecoration(id, TranslateInterpolationDecoration(symbol->getType().getQualifier()));
-        addDecoration(id, TranslateAuxiliaryStorageDecoration(symbol->getType().getQualifier()));
+        builder.addDecoration(id, TranslatePrecisionDecoration(symbol->getType()));
+        builder.addDecoration(id, TranslateInterpolationDecoration(symbol->getType().getQualifier()));
+        builder.addDecoration(id, TranslateAuxiliaryStorageDecoration(symbol->getType().getQualifier()));
+#ifdef NV_EXTENSIONS
+        addMeshNVDecoration(id, /*member*/ -1, symbol->getType().getQualifier());
+#endif
         if (symbol->getType().getQualifier().hasSpecConstantId())
-            addDecoration(id, spv::DecorationSpecId, symbol->getType().getQualifier().layoutSpecConstantId);
+            builder.addDecoration(id, spv::DecorationSpecId, symbol->getType().getQualifier().layoutSpecConstantId);
         if (symbol->getQualifier().hasIndex())
             builder.addDecoration(id, spv::DecorationIndex, symbol->getQualifier().layoutIndex);
         if (symbol->getQualifier().hasComponent())
             builder.addDecoration(id, spv::DecorationComponent, symbol->getQualifier().layoutComponent);
-        if (glslangIntermediate->getXfbMode()) {
-            builder.addCapability(spv::CapabilityTransformFeedback);
-            if (symbol->getQualifier().hasXfbStride())
-                builder.addDecoration(id, spv::DecorationXfbStride, symbol->getQualifier().layoutXfbStride);
-            if (symbol->getQualifier().hasXfbBuffer())
-                builder.addDecoration(id, spv::DecorationXfbBuffer, symbol->getQualifier().layoutXfbBuffer);
-            if (symbol->getQualifier().hasXfbOffset())
-                builder.addDecoration(id, spv::DecorationOffset, symbol->getQualifier().layoutXfbOffset);
-        }
         // atomic counters use this:
         if (symbol->getQualifier().hasOffset())
             builder.addDecoration(id, spv::DecorationOffset, symbol->getQualifier().layoutOffset);
@@ -5056,7 +7152,7 @@
 
     if (symbol->getQualifier().hasLocation())
         builder.addDecoration(id, spv::DecorationLocation, symbol->getQualifier().layoutLocation);
-    addDecoration(id, TranslateInvariantDecoration(symbol->getType().getQualifier()));
+    builder.addDecoration(id, TranslateInvariantDecoration(symbol->getType().getQualifier()));
     if (symbol->getQualifier().hasStream() && glslangIntermediate->isMultiStream()) {
         builder.addCapability(spv::CapabilityGeometryStreams);
         builder.addDecoration(id, spv::DecorationStream, symbol->getQualifier().layoutStream);
@@ -5073,23 +7169,30 @@
         builder.addDecoration(id, spv::DecorationInputAttachmentIndex, symbol->getQualifier().layoutAttachment);
     if (glslangIntermediate->getXfbMode()) {
         builder.addCapability(spv::CapabilityTransformFeedback);
-        if (symbol->getQualifier().hasXfbStride())
-            builder.addDecoration(id, spv::DecorationXfbStride, symbol->getQualifier().layoutXfbStride);
-        if (symbol->getQualifier().hasXfbBuffer())
+        if (symbol->getQualifier().hasXfbBuffer()) {
             builder.addDecoration(id, spv::DecorationXfbBuffer, symbol->getQualifier().layoutXfbBuffer);
+            unsigned stride = glslangIntermediate->getXfbStride(symbol->getQualifier().layoutXfbBuffer);
+            if (stride != glslang::TQualifier::layoutXfbStrideEnd)
+                builder.addDecoration(id, spv::DecorationXfbStride, stride);
+        }
+        if (symbol->getQualifier().hasXfbOffset())
+            builder.addDecoration(id, spv::DecorationOffset, symbol->getQualifier().layoutXfbOffset);
     }
 
     if (symbol->getType().isImage()) {
         std::vector<spv::Decoration> memory;
-        TranslateMemoryDecoration(symbol->getType().getQualifier(), memory);
+        TranslateMemoryDecoration(symbol->getType().getQualifier(), memory, glslangIntermediate->usingVulkanMemoryModel());
         for (unsigned int i = 0; i < memory.size(); ++i)
-            addDecoration(id, memory[i]);
+            builder.addDecoration(id, memory[i]);
     }
 
     // built-in variable decorations
     spv::BuiltIn builtIn = TranslateBuiltInDecoration(symbol->getQualifier().builtIn, false);
     if (builtIn != spv::BuiltInMax)
-        addDecoration(id, spv::DecorationBuiltIn, (int)builtIn);
+        builder.addDecoration(id, spv::DecorationBuiltIn, (int)builtIn);
+
+    // nonuniform
+    builder.addDecoration(id, TranslateNonUniformDecoration(symbol->getType().getQualifier()));
 
 #ifdef NV_EXTENSIONS
     if (builtIn == spv::BuiltInSampleMask) {
@@ -5099,64 +7202,82 @@
               decoration = (spv::Decoration)spv::DecorationOverrideCoverageNV;
           else
               decoration = (spv::Decoration)spv::DecorationMax;
-        addDecoration(id, decoration);
+        builder.addDecoration(id, decoration);
         if (decoration != spv::DecorationMax) {
             builder.addExtension(spv::E_SPV_NV_sample_mask_override_coverage);
         }
     }
     else if (builtIn == spv::BuiltInLayer) {
         // SPV_NV_viewport_array2 extension
-        if (symbol->getQualifier().layoutViewportRelative)
-        {
-            addDecoration(id, (spv::Decoration)spv::DecorationViewportRelativeNV);
+        if (symbol->getQualifier().layoutViewportRelative) {
+            builder.addDecoration(id, (spv::Decoration)spv::DecorationViewportRelativeNV);
             builder.addCapability(spv::CapabilityShaderViewportMaskNV);
             builder.addExtension(spv::E_SPV_NV_viewport_array2);
         }
-        if(symbol->getQualifier().layoutSecondaryViewportRelativeOffset != -2048)
-        {
-            addDecoration(id, (spv::Decoration)spv::DecorationSecondaryViewportRelativeNV, symbol->getQualifier().layoutSecondaryViewportRelativeOffset);
+        if (symbol->getQualifier().layoutSecondaryViewportRelativeOffset != -2048) {
+            builder.addDecoration(id, (spv::Decoration)spv::DecorationSecondaryViewportRelativeNV,
+                                  symbol->getQualifier().layoutSecondaryViewportRelativeOffset);
             builder.addCapability(spv::CapabilityShaderStereoViewNV);
             builder.addExtension(spv::E_SPV_NV_stereo_view_rendering);
         }
     }
 
     if (symbol->getQualifier().layoutPassthrough) {
-        addDecoration(id, spv::DecorationPassthroughNV);
+        builder.addDecoration(id, spv::DecorationPassthroughNV);
         builder.addCapability(spv::CapabilityGeometryShaderPassthroughNV);
         builder.addExtension(spv::E_SPV_NV_geometry_shader_passthrough);
     }
+    if (symbol->getQualifier().pervertexNV) {
+        builder.addDecoration(id, spv::DecorationPerVertexNV);
+        builder.addCapability(spv::CapabilityFragmentBarycentricNV);
+        builder.addExtension(spv::E_SPV_NV_fragment_shader_barycentric);
+    }
 #endif
 
+    if (glslangIntermediate->getHlslFunctionality1() && symbol->getType().getQualifier().semanticName != nullptr) {
+        builder.addExtension("SPV_GOOGLE_hlsl_functionality1");
+        builder.addDecoration(id, (spv::Decoration)spv::DecorationHlslSemanticGOOGLE,
+                              symbol->getType().getQualifier().semanticName);
+    }
+
     return id;
 }
 
-// If 'dec' is valid, add no-operand decoration to an object
-void TGlslangToSpvTraverser::addDecoration(spv::Id id, spv::Decoration dec)
+#ifdef NV_EXTENSIONS
+// add per-primitive, per-view. per-task decorations to a struct member (member >= 0) or an object
+void TGlslangToSpvTraverser::addMeshNVDecoration(spv::Id id, int member, const glslang::TQualifier& qualifier)
 {
-    if (dec != spv::DecorationMax)
-        builder.addDecoration(id, dec);
+    if (member >= 0) {
+        if (qualifier.perPrimitiveNV) {
+            // Need to add capability/extension for fragment shader.
+            // Mesh shader already adds this by default.
+            if (glslangIntermediate->getStage() == EShLangFragment) {
+                builder.addCapability(spv::CapabilityMeshShadingNV);
+                builder.addExtension(spv::E_SPV_NV_mesh_shader);
+            }
+            builder.addMemberDecoration(id, (unsigned)member, spv::DecorationPerPrimitiveNV);
+        }
+        if (qualifier.perViewNV)
+            builder.addMemberDecoration(id, (unsigned)member, spv::DecorationPerViewNV);
+        if (qualifier.perTaskNV)
+            builder.addMemberDecoration(id, (unsigned)member, spv::DecorationPerTaskNV);
+    } else {
+        if (qualifier.perPrimitiveNV) {
+            // Need to add capability/extension for fragment shader.
+            // Mesh shader already adds this by default.
+            if (glslangIntermediate->getStage() == EShLangFragment) {
+                builder.addCapability(spv::CapabilityMeshShadingNV);
+                builder.addExtension(spv::E_SPV_NV_mesh_shader);
+            }
+            builder.addDecoration(id, spv::DecorationPerPrimitiveNV);
+        }
+        if (qualifier.perViewNV)
+            builder.addDecoration(id, spv::DecorationPerViewNV);
+        if (qualifier.perTaskNV)
+            builder.addDecoration(id, spv::DecorationPerTaskNV);
+    }
 }
-
-// If 'dec' is valid, add a one-operand decoration to an object
-void TGlslangToSpvTraverser::addDecoration(spv::Id id, spv::Decoration dec, unsigned value)
-{
-    if (dec != spv::DecorationMax)
-        builder.addDecoration(id, dec, value);
-}
-
-// If 'dec' is valid, add a no-operand decoration to a struct member
-void TGlslangToSpvTraverser::addMemberDecoration(spv::Id id, int member, spv::Decoration dec)
-{
-    if (dec != spv::DecorationMax)
-        builder.addMemberDecoration(id, (unsigned)member, dec);
-}
-
-// If 'dec' is valid, add a one-operand decoration to a struct member
-void TGlslangToSpvTraverser::addMemberDecoration(spv::Id id, int member, spv::Decoration dec, unsigned value)
-{
-    if (dec != spv::DecorationMax)
-        builder.addMemberDecoration(id, (unsigned)member, dec, value);
-}
+#endif
 
 // Make a full tree of instructions to build a SPIR-V specialization constant,
 // or regular constant if possible.
@@ -5190,8 +7311,10 @@
         for (int dim = 0; dim < 3; ++dim) {
             bool specConst = (glslangIntermediate->getLocalSizeSpecId(dim) != glslang::TQualifier::layoutNotSet);
             dimConstId.push_back(builder.makeUintConstant(glslangIntermediate->getLocalSize(dim), specConst));
-            if (specConst)
-                addDecoration(dimConstId.back(), spv::DecorationSpecId, glslangIntermediate->getLocalSizeSpecId(dim));
+            if (specConst) {
+                builder.addDecoration(dimConstId.back(), spv::DecorationSpecId,
+                                      glslangIntermediate->getLocalSizeSpecId(dim));
+            }
         }
         return builder.makeCompositeConstant(builder.makeVectorType(builder.makeUintType(32), 3), dimConstId, true);
     }
@@ -5199,24 +7322,27 @@
     // An AST node labelled as specialization constant should be a symbol node.
     // Its initializer should either be a sub tree with constant nodes, or a constant union array.
     if (auto* sn = node.getAsSymbolNode()) {
+        spv::Id result;
         if (auto* sub_tree = sn->getConstSubtree()) {
             // Traverse the constant constructor sub tree like generating normal run-time instructions.
             // During the AST traversal, if the node is marked as 'specConstant', SpecConstantOpModeGuard
             // will set the builder into spec constant op instruction generating mode.
             sub_tree->traverse(this);
-            return accessChainLoad(sub_tree->getType());
-        } else if (auto* const_union_array = &sn->getConstArray()){
+            result = accessChainLoad(sub_tree->getType());
+        } else if (auto* const_union_array = &sn->getConstArray()) {
             int nextConst = 0;
-            spv::Id id = createSpvConstantFromConstUnionArray(sn->getType(), *const_union_array, nextConst, true);
-            builder.addName(id, sn->getName().c_str());
-            return id;
+            result = createSpvConstantFromConstUnionArray(sn->getType(), *const_union_array, nextConst, true);
+        } else {
+            logger->missingFunctionality("Invalid initializer for spec onstant.");
+            return spv::NoResult;
         }
+        builder.addName(result, sn->getName().c_str());
+        return result;
     }
 
     // Neither a front-end constant node, nor a specialization constant node with constant union array or
     // constant sub tree as initializer.
     logger->missingFunctionality("Neither a front-end constant nor a spec constant.");
-    exit(1);
     return spv::NoResult;
 }
 
@@ -5250,6 +7376,18 @@
         for (unsigned int i = 0; i < (unsigned int)glslangType.getVectorSize(); ++i) {
             bool zero = nextConst >= consts.size();
             switch (glslangType.getBasicType()) {
+            case glslang::EbtInt8:
+                spvConsts.push_back(builder.makeInt8Constant(zero ? 0 : consts[nextConst].getI8Const()));
+                break;
+            case glslang::EbtUint8:
+                spvConsts.push_back(builder.makeUint8Constant(zero ? 0 : consts[nextConst].getU8Const()));
+                break;
+            case glslang::EbtInt16:
+                spvConsts.push_back(builder.makeInt16Constant(zero ? 0 : consts[nextConst].getI16Const()));
+                break;
+            case glslang::EbtUint16:
+                spvConsts.push_back(builder.makeUint16Constant(zero ? 0 : consts[nextConst].getU16Const()));
+                break;
             case glslang::EbtInt:
                 spvConsts.push_back(builder.makeIntConstant(zero ? 0 : consts[nextConst].getIConst()));
                 break;
@@ -5268,11 +7406,9 @@
             case glslang::EbtDouble:
                 spvConsts.push_back(builder.makeDoubleConstant(zero ? 0.0 : consts[nextConst].getDConst()));
                 break;
-#ifdef AMD_EXTENSIONS
             case glslang::EbtFloat16:
                 spvConsts.push_back(builder.makeFloat16Constant(zero ? 0.0F : (float)consts[nextConst].getDConst()));
                 break;
-#endif
             case glslang::EbtBool:
                 spvConsts.push_back(builder.makeBoolConstant(zero ? false : consts[nextConst].getBConst()));
                 break;
@@ -5287,6 +7423,18 @@
         bool zero = nextConst >= consts.size();
         spv::Id scalar = 0;
         switch (glslangType.getBasicType()) {
+        case glslang::EbtInt8:
+            scalar = builder.makeInt8Constant(zero ? 0 : consts[nextConst].getI8Const(), specConstant);
+            break;
+        case glslang::EbtUint8:
+            scalar = builder.makeUint8Constant(zero ? 0 : consts[nextConst].getU8Const(), specConstant);
+            break;
+        case glslang::EbtInt16:
+            scalar = builder.makeInt16Constant(zero ? 0 : consts[nextConst].getI16Const(), specConstant);
+            break;
+        case glslang::EbtUint16:
+            scalar = builder.makeUint16Constant(zero ? 0 : consts[nextConst].getU16Const(), specConstant);
+            break;
         case glslang::EbtInt:
             scalar = builder.makeIntConstant(zero ? 0 : consts[nextConst].getIConst(), specConstant);
             break;
@@ -5305,11 +7453,9 @@
         case glslang::EbtDouble:
             scalar = builder.makeDoubleConstant(zero ? 0.0 : consts[nextConst].getDConst(), specConstant);
             break;
-#ifdef AMD_EXTENSIONS
         case glslang::EbtFloat16:
             scalar = builder.makeFloat16Constant(zero ? 0.0F : (float)consts[nextConst].getDConst(), specConstant);
             break;
-#endif
         case glslang::EbtBool:
             scalar = builder.makeBoolConstant(zero ? false : consts[nextConst].getBConst(), specConstant);
             break;
@@ -5356,13 +7502,18 @@
 }
 
 // A node is trivial if it is a single operation with no side effects.
-// Error on the side of saying non-trivial.
+// HLSL (and/or vectors) are always trivial, as it does not short circuit.
+// Otherwise, error on the side of saying non-trivial.
 // Return true if trivial.
 bool TGlslangToSpvTraverser::isTrivial(const glslang::TIntermTyped* node)
 {
     if (node == nullptr)
         return false;
 
+    // count non scalars as trivial, as well as anything coming from HLSL
+    if (! node->getType().isScalarOrVec1() || glslangIntermediate->getSource() == glslang::EShSourceHlsl)
+        return true;
+
     // symbols and constants are trivial
     if (isTrivialLeaf(node))
         return true;
@@ -5433,7 +7584,7 @@
         leftId = builder.createUnaryOp(spv::OpLogicalNot, boolTypeId, leftId);
 
     // make an "if" based on the left value
-    spv::Builder::If ifBuilder(leftId, builder);
+    spv::Builder::If ifBuilder(leftId, spv::SelectionControlMaskNone, builder);
 
     // emit right operand as the "then" part of the "if"
     builder.clearAccessChain();
@@ -5451,6 +7602,7 @@
     return builder.createOp(spv::OpPhi, boolTypeId, phiOperands);
 }
 
+#ifdef AMD_EXTENSIONS
 // Return type Id of the imported set of extended instructions corresponds to the name.
 // Import this set if it has not been imported yet.
 spv::Id TGlslangToSpvTraverser::getExtBuiltins(const char* name)
@@ -5464,6 +7616,7 @@
         return extBuiltins;
     }
 }
+#endif
 
 };  // end anonymous namespace
 
@@ -5477,6 +7630,21 @@
     version = buf;
 }
 
+// For low-order part of the generator's magic number. Bump up
+// when there is a change in the style (e.g., if SSA form changes,
+// or a different instruction sequence to do something gets used).
+int GetSpirvGeneratorVersion()
+{
+    // return 1; // start
+    // return 2; // EOpAtomicCounterDecrement gets a post decrement, to map between GLSL -> SPIR-V
+    // return 3; // change/correct barrier-instruction operands, to match memory model group decisions
+    // return 4; // some deeper access chains: for dynamic vector component, and local Boolean component
+    // return 5; // make OpArrayLength result type be an int with signedness of 0
+    // return 6; // revert version 5 change, which makes a different (new) kind of incorrect code,
+                 // versions 4 and 6 each generate OpArrayLength as it has long been done
+    return 7; // GLSL volatile keyword maps to both SPIR-V decorations Volatile and Coherent
+}
+
 // Write SPIR-V out to a binary file
 void OutputSpvBin(const std::vector<unsigned int>& spirv, const char* baseName)
 {
@@ -5498,7 +7666,9 @@
     out.open(baseName, std::ios::binary | std::ios::out);
     if (out.fail())
         printf("ERROR: Failed to open file: %s\n", baseName);
-    out << "\t// " GLSLANG_REVISION " " GLSLANG_DATE << std::endl;
+    out << "\t// " << 
+        GetSpirvGeneratorVersion() << "." << GLSLANG_MINOR_VERSION << "." << GLSLANG_PATCH_LEVEL <<
+        std::endl;
     if (varName != nullptr) {
         out << "\t #pragma once" << std::endl;
         out << "const uint32_t " << varName << "[] = {" << std::endl;
@@ -5524,27 +7694,46 @@
 //
 // Set up the glslang traversal
 //
-void GlslangToSpv(const glslang::TIntermediate& intermediate, std::vector<unsigned int>& spirv)
+void GlslangToSpv(const TIntermediate& intermediate, std::vector<unsigned int>& spirv, SpvOptions* options)
 {
     spv::SpvBuildLogger logger;
-    GlslangToSpv(intermediate, spirv, &logger);
+    GlslangToSpv(intermediate, spirv, &logger, options);
 }
 
-void GlslangToSpv(const glslang::TIntermediate& intermediate, std::vector<unsigned int>& spirv, spv::SpvBuildLogger* logger)
+void GlslangToSpv(const TIntermediate& intermediate, std::vector<unsigned int>& spirv,
+                  spv::SpvBuildLogger* logger, SpvOptions* options)
 {
     TIntermNode* root = intermediate.getTreeRoot();
 
     if (root == 0)
         return;
 
-    glslang::GetThreadPoolAllocator().push();
+    SpvOptions defaultOptions;
+    if (options == nullptr)
+        options = &defaultOptions;
 
-    TGlslangToSpvTraverser it(&intermediate, logger);
+    GetThreadPoolAllocator().push();
+
+    TGlslangToSpvTraverser it(intermediate.getSpv().spv, &intermediate, logger, *options);
     root->traverse(&it);
     it.finishSpv();
     it.dumpSpv(spirv);
 
-    glslang::GetThreadPoolAllocator().pop();
+#if ENABLE_OPT
+    // If from HLSL, run spirv-opt to "legalize" the SPIR-V for Vulkan
+    // eg. forward and remove memory writes of opaque types.
+    if ((intermediate.getSource() == EShSourceHlsl || options->optimizeSize) && !options->disableOptimizer)
+        SpirvToolsLegalize(intermediate, spirv, logger, options);
+
+    if (options->validate)
+        SpirvToolsValidate(intermediate, spirv, logger);
+
+    if (options->disassemble)
+        SpirvToolsDisassemble(std::cout, spirv);
+
+#endif
+
+    GetThreadPoolAllocator().pop();
 }
 
 }; // end namespace glslang
diff --git a/SPIRV/GlslangToSpv.h b/SPIRV/GlslangToSpv.h
old mode 100644
new mode 100755
index 11e22f5..4169c12
--- a/SPIRV/GlslangToSpv.h
+++ b/SPIRV/GlslangToSpv.h
@@ -32,10 +32,13 @@
 // ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 // POSSIBILITY OF SUCH DAMAGE.
 
-#if _MSC_VER >= 1900
+#pragma once
+
+#if defined(_MSC_VER) && _MSC_VER >= 1900
     #pragma warning(disable : 4464) // relative include path contains '..'
 #endif
 
+#include "SpvTools.h"
 #include "../glslang/Include/intermediate.h"
 
 #include <string>
@@ -46,8 +49,11 @@
 namespace glslang {
 
 void GetSpirvVersion(std::string&);
-void GlslangToSpv(const glslang::TIntermediate& intermediate, std::vector<unsigned int>& spirv);
-void GlslangToSpv(const glslang::TIntermediate& intermediate, std::vector<unsigned int>& spirv, spv::SpvBuildLogger* logger);
+int GetSpirvGeneratorVersion();
+void GlslangToSpv(const glslang::TIntermediate& intermediate, std::vector<unsigned int>& spirv,
+                  SpvOptions* options = nullptr);
+void GlslangToSpv(const glslang::TIntermediate& intermediate, std::vector<unsigned int>& spirv,
+                  spv::SpvBuildLogger* logger, SpvOptions* options = nullptr);
 void OutputSpvBin(const std::vector<unsigned int>& spirv, const char* baseName);
 void OutputSpvHex(const std::vector<unsigned int>& spirv, const char* baseName, const char* varName);
 
diff --git a/SPIRV/InReadableOrder.cpp b/SPIRV/InReadableOrder.cpp
index 4bb3d77..52b2961 100644
--- a/SPIRV/InReadableOrder.cpp
+++ b/SPIRV/InReadableOrder.cpp
@@ -51,7 +51,7 @@
 #include "spvIR.h"
 
 #include <cassert>
-#include <unordered_map>
+#include <unordered_set>
 
 using spv::Block;
 using spv::Id;
@@ -69,33 +69,33 @@
     void visit(Block* block)
     {
         assert(block);
-        if (visited_[block] || delayed_[block])
+        if (visited_.count(block) || delayed_.count(block))
             return;
         callback_(block);
-        visited_[block] = true;
+        visited_.insert(block);
         Block* mergeBlock = nullptr;
         Block* continueBlock = nullptr;
         auto mergeInst = block->getMergeInstruction();
         if (mergeInst) {
             Id mergeId = mergeInst->getIdOperand(0);
             mergeBlock = block->getParent().getParent().getInstruction(mergeId)->getBlock();
-            delayed_[mergeBlock] = true;
+            delayed_.insert(mergeBlock);
             if (mergeInst->getOpCode() == spv::OpLoopMerge) {
                 Id continueId = mergeInst->getIdOperand(1);
                 continueBlock =
                     block->getParent().getParent().getInstruction(continueId)->getBlock();
-                delayed_[continueBlock] = true;
+                delayed_.insert(continueBlock);
             }
         }
         const auto successors = block->getSuccessors();
         for (auto it = successors.cbegin(); it != successors.cend(); ++it)
             visit(*it);
         if (continueBlock) {
-            delayed_[continueBlock] = false;
+            delayed_.erase(continueBlock);
             visit(continueBlock);
         }
         if (mergeBlock) {
-            delayed_[mergeBlock] = false;
+            delayed_.erase(mergeBlock);
             visit(mergeBlock);
         }
     }
@@ -103,7 +103,7 @@
 private:
     std::function<void(Block*)> callback_;
     // Whether a block has already been visited or is being delayed.
-    std::unordered_map<Block *, bool> visited_, delayed_;
+    std::unordered_set<Block *> visited_, delayed_;
 };
 }
 
diff --git a/SPIRV/SPVRemapper.cpp b/SPIRV/SPVRemapper.cpp
old mode 100755
new mode 100644
index 9b12705..fd0bb89
--- a/SPIRV/SPVRemapper.cpp
+++ b/SPIRV/SPVRemapper.cpp
@@ -135,6 +135,9 @@
         const unsigned typeStart = idPos(id);
         const spv::Op  opCode    = asOpCode(typeStart);
 
+        if (errorLatch)
+            return 0;
+
         switch (opCode) {
         case spv::OpTypeInt:   // fall through...
         case spv::OpTypeFloat: return (spv[typeStart+2]+31)/32;
@@ -148,8 +151,10 @@
     unsigned spirvbin_t::idTypeSizeInWords(spv::Id id) const
     {
         const auto tid_it = idTypeSizeMap.find(id);
-        if (tid_it == idTypeSizeMap.end())
+        if (tid_it == idTypeSizeMap.end()) {
             error("type size for ID not found");
+            return 0;
+        }
 
         return tid_it->second;
     }
@@ -215,14 +220,19 @@
     bool spirvbin_t::isConstOp(spv::Op opCode) const
     {
         switch (opCode) {
-        case spv::OpConstantNull:       error("unimplemented constant type");
-        case spv::OpConstantSampler:    error("unimplemented constant type");
+        case spv::OpConstantSampler:
+            error("unimplemented constant type");
+            return true;
 
+        case spv::OpConstantNull:
         case spv::OpConstantTrue:
         case spv::OpConstantFalse:
         case spv::OpConstantComposite:
-        case spv::OpConstant:         return true;
-        default:                      return false;
+        case spv::OpConstant:
+            return true;
+
+        default:
+            return false;
         }
     }
 
@@ -246,21 +256,33 @@
 
     spv::Id spirvbin_t::localId(spv::Id id, spv::Id newId)
     {
-        assert(id != spv::NoResult && newId != spv::NoResult);
+        //assert(id != spv::NoResult && newId != spv::NoResult);
+
+        if (id > bound()) {
+            error(std::string("ID out of range: ") + std::to_string(id));
+            return spirvbin_t::unused;
+        }
 
         if (id >= idMapL.size())
             idMapL.resize(id+1, unused);
 
         if (newId != unmapped && newId != unused) {
-            if (isOldIdUnused(id))
+            if (isOldIdUnused(id)) {
                 error(std::string("ID unused in module: ") + std::to_string(id));
+                return spirvbin_t::unused;
+            }
 
-            if (!isOldIdUnmapped(id))
+            if (!isOldIdUnmapped(id)) {
                 error(std::string("ID already mapped: ") + std::to_string(id) + " -> "
-                + std::to_string(localId(id)));
+                        + std::to_string(localId(id)));
 
-            if (isNewIdMapped(newId))
+                return spirvbin_t::unused;
+            }
+
+            if (isNewIdMapped(newId)) {
                 error(std::string("ID already used in module: ") + std::to_string(newId));
+                return spirvbin_t::unused;
+            }
 
             msg(4, 4, std::string("map: ") + std::to_string(id) + " -> " + std::to_string(newId));
             setMapped(newId);
@@ -294,6 +316,10 @@
         process(inst_fn_nop, // ignore instructions
             [this](spv::Id& id) {
                 id = localId(id);
+
+                if (errorLatch)
+                    return;
+
                 assert(id != unused && id != unmapped);
             }
         );
@@ -312,14 +338,22 @@
                 continue;
 
             // Find a new mapping for any used but unmapped IDs
-            if (isOldIdUnmapped(id))
+            if (isOldIdUnmapped(id)) {
                 localId(id, unusedId = nextUnusedId(unusedId));
+                if (errorLatch)
+                    return;
+            }
 
-            if (isOldIdUnmapped(id))
+            if (isOldIdUnmapped(id)) {
                 error(std::string("old ID not mapped: ") + std::to_string(id));
+                return;
+            }
 
             // Track max bound
             maxBound = std::max(maxBound, localId(id) + 1);
+
+            if (errorLatch)
+                return;
         }
 
         bound(maxBound); // reset header ID bound to as big as it now needs to be
@@ -401,6 +435,9 @@
                     if (typeId != spv::NoResult) {
                         const unsigned idTypeSize = typeSizeInWords(typeId);
 
+                        if (errorLatch)
+                            return false;
+
                         if (idTypeSize != 0)
                             idTypeSizeMap[resultId] = idTypeSize;
                     }
@@ -416,17 +453,26 @@
                 } else if (opCode == spv::Op::OpEntryPoint) {
                     entryPoint = asId(start + 2);
                 } else if (opCode == spv::Op::OpFunction) {
-                    if (fnStart != 0)
+                    if (fnStart != 0) {
                         error("nested function found");
+                        return false;
+                    }
+
                     fnStart = start;
                     fnRes   = asId(start + 2);
                 } else if (opCode == spv::Op::OpFunctionEnd) {
                     assert(fnRes != spv::NoResult);
-                    if (fnStart == 0)
+                    if (fnStart == 0) {
                         error("function end without function start");
+                        return false;
+                    }
+
                     fnPos[fnRes] = range_t(fnStart, start + asWordCount(start));
                     fnStart = 0;
                 } else if (isConstOp(opCode)) {
+                    if (errorLatch)
+                        return false;
+
                     assert(asId(start + 2) != spv::NoResult);
                     typeConstPos.insert(start);
                 } else if (isTypeOp(opCode)) {
@@ -446,29 +492,37 @@
     {
         msg(2, 2, std::string("validating: "));
 
-        if (spv.size() < header_size)
+        if (spv.size() < header_size) {
             error("file too short: ");
+            return;
+        }
 
-        if (magic() != spv::MagicNumber)
+        if (magic() != spv::MagicNumber) {
             error("bad magic number");
+            return;
+        }
 
         // field 1 = version
         // field 2 = generator magic
         // field 3 = result <id> bound
 
-        if (schemaNum() != 0)
+        if (schemaNum() != 0) {
             error("bad schema, must be 0");
+            return;
+        }
     }
 
     int spirvbin_t::processInstruction(unsigned word, instfn_t instFn, idfn_t idFn)
     {
         const auto     instructionStart = word;
         const unsigned wordCount = asWordCount(instructionStart);
-        const spv::Op  opCode    = asOpCode(instructionStart);
         const int      nextInst  = word++ + wordCount;
+        spv::Op  opCode    = asOpCode(instructionStart);
 
-        if (nextInst > int(spv.size()))
+        if (nextInst > int(spv.size())) {
             error("spir instruction terminated too early");
+            return -1;
+        }
 
         // Base for computing number of operands; will be updated as more is learned
         unsigned numOperands = wordCount - 1;
@@ -506,6 +560,18 @@
 
         // Store IDs from instruction in our map
         for (int op = 0; numOperands > 0; ++op, --numOperands) {
+            // SpecConstantOp is special: it includes the operands of another opcode which is
+            // given as a literal in the 3rd word.  We will switch over to pretending that the
+            // opcode being processed is the literal opcode value of the SpecConstantOp.  See the
+            // SPIRV spec for details.  This way we will handle IDs and literals as appropriate for
+            // the embedded op.
+            if (opCode == spv::OpSpecConstantOp) {
+                if (op == 0) {
+                    opCode = asOpCode(word++);  // this is the opcode embedded in the SpecConstantOp.
+                    --numOperands;
+                }
+            }
+
             switch (spv::InstructionDesc[opCode].operands.getClass(op)) {
             case spv::OperandId:
             case spv::OperandScope:
@@ -538,6 +604,9 @@
                     const unsigned literalSize = idTypeSizeInWords(idBuffer[literalSizePos]);
                     const unsigned numLiteralIdPairs = (nextInst-word) / (1+literalSize);
 
+                    if (errorLatch)
+                        return -1;
+
                     for (unsigned arg=0; arg<numLiteralIdPairs; ++arg) {
                         word += literalSize;  // literal
                         idFn(asId(word++));   // label
@@ -614,9 +683,13 @@
         // basic parsing and InstructionDesc table borrowed from SpvDisassemble.cpp...
         unsigned nextInst = unsigned(spv.size());
 
-        for (unsigned word = begin; word < end; word = nextInst)
+        for (unsigned word = begin; word < end; word = nextInst) {
             nextInst = processInstruction(word, instFn, idFn);
 
+            if (errorLatch)
+                return *this;
+        }
+
         return *this;
     }
 
@@ -631,8 +704,11 @@
             for (const char c : name.first)
                 hashval = hashval * 1009 + c;
 
-            if (isOldIdUnmapped(name.second))
+            if (isOldIdUnmapped(name.second)) {
                 localId(name.second, nextUnusedId(hashval % softTypeIdLimit + firstMappedID));
+                if (errorLatch)
+                    return;
+            }
         }
     }
 
@@ -654,6 +730,9 @@
             [&](spv::Op, unsigned start) { instPos.push_back(start); return true; },
             op_fn_nop);
 
+        if (errorLatch)
+            return;
+
         // Window size for context-sensitive canonicalization values
         // Empirical best size from a single data set.  TODO: Would be a good tunable.
         // We essentially perform a little convolution around each instruction,
@@ -689,8 +768,12 @@
                         hashval = hashval * 30103 + asOpCodeHash(instPos[i]); // 30103 = semiarbitrary prime
                     }
 
-                    if (isOldIdUnmapped(resId))
+                    if (isOldIdUnmapped(resId)) {
                         localId(resId, nextUnusedId(hashval % softTypeIdLimit + firstMappedID));
+                        if (errorLatch)
+                            return;
+                    }
+
                 }
             }
         }
@@ -783,6 +866,9 @@
             [&](spv::Id& id) { if (idMap.find(id) != idMap.end()) id = idMap[id]; }
         );
 
+        if (errorLatch)
+            return;
+
         // EXPERIMENTAL: Implicit output stores
         fnLocalVars.clear();
         idMap.clear();
@@ -803,11 +889,17 @@
             },
             op_fn_nop);
 
+        if (errorLatch)
+            return;
+
         process(
             inst_fn_nop,
             [&](spv::Id& id) { if (idMap.find(id) != idMap.end()) id = idMap[id]; }
         );
 
+        if (errorLatch)
+            return;
+
         strip();          // strip out data we decided to eliminate
     }
 
@@ -907,6 +999,9 @@
             }
         );
 
+        if (errorLatch)
+            return;
+
         process(
             [&](spv::Op opCode, unsigned start) {
                 if (opCode == spv::OpLoad && fnLocalVars.count(asId(start+3)) > 0)
@@ -915,6 +1010,9 @@
             },
             op_fn_nop);
 
+        if (errorLatch)
+            return;
+
         // Chase replacements to their origins, in case there is a chain such as:
         //   2 = store 1
         //   3 = load 2
@@ -948,6 +1046,9 @@
             }
         );
 
+        if (errorLatch)
+            return;
+
         strip();          // strip out data we decided to eliminate
     }
 
@@ -991,6 +1092,9 @@
                         fn->second.first,
                         fn->second.second);
 
+                    if (errorLatch)
+                        return;
+
                     fn = fnPos.erase(fn);
                 } else ++fn;
             }
@@ -1023,6 +1127,9 @@
             [&](spv::Id& id) { if (varUseCount[id]) ++varUseCount[id]; }
         );
 
+        if (errorLatch)
+            return;
+
         // Remove single-use function variables + associated decorations and names
         process(
             [&](spv::Op opCode, unsigned start) {
@@ -1064,6 +1171,9 @@
                     [&](spv::Id& id) { if (isType[id]) ++typeUseCount[id]; }
                     );
 
+            if (errorLatch)
+                return;
+
             // Remove single reference types
             for (const auto typeStart : typeConstPos) {
                 const spv::Id typeId = asTypeConstId(typeStart);
@@ -1073,6 +1183,9 @@
                     stripInst(typeStart);
                 }
             }
+
+            if (errorLatch)
+                return;
         }
     }
 
@@ -1151,8 +1264,10 @@
     unsigned spirvbin_t::idPos(spv::Id id) const
     {
         const auto tid_it = idPosR.find(id);
-        if (tid_it == idPosR.end())
+        if (tid_it == idPosR.end()) {
             error("ID not found");
+            return 0;
+        }
 
         return tid_it->second;
     }
@@ -1211,10 +1326,6 @@
         case spv::OpTypeReserveId:       return 300002;
         case spv::OpTypeQueue:           return 300003;
         case spv::OpTypePipe:            return 300004;
-
-        case spv::OpConstantNull:        return 300005;
-        case spv::OpConstantSampler:     return 300006;
-
         case spv::OpConstantTrue:        return 300007;
         case spv::OpConstantFalse:       return 300008;
         case spv::OpConstantComposite:
@@ -1231,6 +1342,18 @@
                     hash += w * spv[typeStart+w];
                 return hash;
             }
+        case spv::OpConstantNull:
+            {
+                std::uint32_t hash = 500009 + hashType(idPos(spv[typeStart+1]));
+                return hash;
+            }
+        case spv::OpConstantSampler:
+            {
+                std::uint32_t hash = 600011 + hashType(idPos(spv[typeStart+1]));
+                for (unsigned w=3; w < wordCount; ++w)
+                    hash += w * spv[typeStart+w];
+                return hash;
+            }
 
         default:
             error("unknown type opcode");
@@ -1251,8 +1374,14 @@
             const spv::Id       resId     = asTypeConstId(typeStart);
             const std::uint32_t hashval   = hashType(typeStart);
 
-            if (isOldIdUnmapped(resId))
+            if (errorLatch)
+                return;
+
+            if (isOldIdUnmapped(resId)) {
                 localId(resId, nextUnusedId(hashval % softTypeIdLimit + firstMappedID));
+                if (errorLatch)
+                    return;
+            }
         }
     }
 
@@ -1271,7 +1400,7 @@
 
         int strippedPos = 0;
         for (unsigned word = 0; word < unsigned(spv.size()); ++word) {
-            if (strip_it != stripRange.end() && word >= strip_it->second)
+            while (strip_it != stripRange.end() && word >= strip_it->second)
                 ++strip_it;
 
             if (strip_it == stripRange.end() || word < strip_it->first || word >= strip_it->second)
@@ -1298,24 +1427,49 @@
         msg(3, 4, std::string("ID bound: ") + std::to_string(bound()));
 
         if (options & STRIP)         stripDebug();
+        if (errorLatch) return;
+
         strip();        // strip out data we decided to eliminate
+        if (errorLatch) return;
+
         if (options & OPT_LOADSTORE) optLoadStore();
+        if (errorLatch) return;
+
         if (options & OPT_FWD_LS)    forwardLoadStores();
+        if (errorLatch) return;
+
         if (options & DCE_FUNCS)     dceFuncs();
+        if (errorLatch) return;
+
         if (options & DCE_VARS)      dceVars();
+        if (errorLatch) return;
+
         if (options & DCE_TYPES)     dceTypes();
+        if (errorLatch) return;
 
         strip();         // strip out data we decided to eliminate
+        if (errorLatch) return;
+
         stripDeadRefs(); // remove references to things we DCEed
+        if (errorLatch) return;
+
         // after the last strip, we must clean any debug info referring to now-deleted data
 
         if (options & MAP_TYPES)     mapTypeConst();
+        if (errorLatch) return;
+
         if (options & MAP_NAMES)     mapNames();
+        if (errorLatch) return;
+
         if (options & MAP_FUNCS)     mapFnBodies();
+        if (errorLatch) return;
 
         if (options & MAP_ALL) {
             mapRemainder(); // map any unmapped IDs
+            if (errorLatch) return;
+
             applyMap();     // Now remap each shader to the new IDs we've come up with
+            if (errorLatch) return;
         }
     }
 
diff --git a/SPIRV/SPVRemapper.h b/SPIRV/SPVRemapper.h
old mode 100755
new mode 100644
index f9f369a..97e3f31
--- a/SPIRV/SPVRemapper.h
+++ b/SPIRV/SPVRemapper.h
@@ -39,6 +39,7 @@
 #include <string>
 #include <vector>
 #include <cstdlib>
+#include <exception>
 
 namespace spv {
 
@@ -111,7 +112,9 @@
 class spirvbin_t : public spirvbin_base_t
 {
 public:
-   spirvbin_t(int verbose = 0) : entryPoint(spv::NoResult), largestNewId(0), verbose(verbose) { }
+   spirvbin_t(int verbose = 0) : entryPoint(spv::NoResult), largestNewId(0), verbose(verbose), errorLatch(false)
+   { }
+
    virtual ~spirvbin_t() { }
 
    // remap on an existing binary in memory
@@ -165,7 +168,7 @@
    typedef std::unordered_map<spv::Id, unsigned> typesize_map_t;
 
    // handle error
-   void error(const std::string& txt) const { errorHandler(txt); }
+   void error(const std::string& txt) const { errorLatch = true; errorHandler(txt); }
 
    bool     isConstOp(spv::Op opCode)      const;
    bool     isTypeOp(spv::Op opCode)       const;
@@ -286,6 +289,11 @@
    std::uint32_t options;
    int           verbose;     // verbosity level
 
+   // Error latch: this is set if the error handler is ever executed.  It would be better to
+   // use a try/catch block and throw, but that's not desired for certain environments, so
+   // this is the alternative.
+   mutable bool errorLatch;
+
    static errorfn_t errorHandler;
    static logfn_t   logHandler;
 };
diff --git a/SPIRV/SpvBuilder.cpp b/SPIRV/SpvBuilder.cpp
old mode 100644
new mode 100755
index 0add1db..951d104
--- a/SPIRV/SpvBuilder.cpp
+++ b/SPIRV/SpvBuilder.cpp
@@ -46,9 +46,7 @@
 
 #include "SpvBuilder.h"
 
-#ifdef AMD_EXTENSIONS
-    #include "hex_float.h"
-#endif
+#include "hex_float.h"
 
 #ifndef _WIN32
     #include <cstdio>
@@ -56,9 +54,13 @@
 
 namespace spv {
 
-Builder::Builder(unsigned int magicNumber, SpvBuildLogger* buildLogger) :
+Builder::Builder(unsigned int spvVersion, unsigned int magicNumber, SpvBuildLogger* buildLogger) :
+    spvVersion(spvVersion),
     source(SourceLanguageUnknown),
     sourceVersion(0),
+    sourceFileStringId(NoResult),
+    currentLine(0),
+    emitOpLines(false),
     addressModel(AddressingModelLogical),
     memoryModel(MemoryModelGLSL450),
     builderNumber(magicNumber),
@@ -79,11 +81,32 @@
 {
     Instruction* import = new Instruction(getUniqueId(), NoType, OpExtInstImport);
     import->addStringOperand(name);
+    module.mapInstruction(import);
 
     imports.push_back(std::unique_ptr<Instruction>(import));
     return import->getResultId();
 }
 
+// Emit an OpLine if we've been asked to emit OpLines and the line number
+// has changed since the last time, and is a valid line number.
+void Builder::setLine(int lineNum)
+{
+    if (lineNum != 0 && lineNum != currentLine) {
+        currentLine = lineNum;
+        if (emitOpLines)
+            addLine(sourceFileStringId, currentLine, 0);
+    }
+}
+
+void Builder::addLine(Id fileName, int lineNum, int column)
+{
+    Instruction* line = new Instruction(OpLine);
+    line->addIdOperand(fileName);
+    line->addImmediateOperand(lineNum);
+    line->addImmediateOperand(column);
+    buildPoint->addInstruction(std::unique_ptr<Instruction>(line));
+}
+
 // For creating new groupedTypes (will return old type if the requested one was already made).
 Id Builder::makeVoidType()
 {
@@ -170,8 +193,9 @@
 
     // deal with capabilities
     switch (width) {
+    case 8:
     case 16:
-        addCapability(CapabilityInt16);
+        // these are currently handled by storage-type declarations and post processing
         break;
     case 64:
         addCapability(CapabilityInt64);
@@ -203,7 +227,7 @@
     // deal with capabilities
     switch (width) {
     case 16:
-        addCapability(CapabilityFloat16);
+        // currently handled by storage-type declarations and post processing
         break;
     case 64:
         addCapability(CapabilityFloat64);
@@ -379,6 +403,8 @@
 
 Id Builder::makeImageType(Id sampledType, Dim dim, bool depth, bool arrayed, bool ms, unsigned sampled, ImageFormat format)
 {
+    assert(sampled == 1 || sampled == 2);
+
     // try to find it
     Instruction* type;
     for (int t = 0; t < (int)groupedTypes[OpTypeImage].size(); ++t) {
@@ -410,27 +436,27 @@
     // deal with capabilities
     switch (dim) {
     case DimBuffer:
-        if (sampled)
+        if (sampled == 1)
             addCapability(CapabilitySampledBuffer);
         else
             addCapability(CapabilityImageBuffer);
         break;
     case Dim1D:
-        if (sampled)
+        if (sampled == 1)
             addCapability(CapabilitySampled1D);
         else
             addCapability(CapabilityImage1D);
         break;
     case DimCube:
         if (arrayed) {
-            if (sampled)
+            if (sampled == 1)
                 addCapability(CapabilitySampledCubeArray);
             else
                 addCapability(CapabilityImageCubeArray);
         }
         break;
     case DimRect:
-        if (sampled)
+        if (sampled == 1)
             addCapability(CapabilitySampledRect);
         else
             addCapability(CapabilityImageRect);
@@ -443,10 +469,14 @@
     }
 
     if (ms) {
-        if (arrayed)
-            addCapability(CapabilityImageMSArray);
-        if (! sampled)
-            addCapability(CapabilityStorageImageMultisample);
+        if (sampled == 2) {
+            // Images used with subpass data are not storage
+            // images, so don't require the capability for them.
+            if (dim != Dim::DimSubpassData)
+                addCapability(CapabilityStorageImageMultisample);
+            if (arrayed)
+                addCapability(CapabilityImageMSArray);
+        }
     }
 
     return type->getResultId();
@@ -473,12 +503,27 @@
     return type->getResultId();
 }
 
+#ifdef NV_EXTENSIONS
+Id Builder::makeAccelerationStructureNVType()
+{
+    Instruction *type;
+    if (groupedTypes[OpTypeAccelerationStructureNV].size() == 0) {
+        type = new Instruction(getUniqueId(), NoType, OpTypeAccelerationStructureNV);
+        constantsTypesGlobals.push_back(std::unique_ptr<Instruction>(type));
+        module.mapInstruction(type);
+    } else {
+        type = groupedTypes[OpTypeAccelerationStructureNV].back();
+    }
+
+    return type->getResultId();
+}
+#endif
 Id Builder::getDerefTypeId(Id resultId) const
 {
     Id typeId = getTypeId(resultId);
     assert(isPointerType(typeId));
 
-    return module.getInstruction(typeId)->getImmediateOperand(1);
+    return module.getInstruction(typeId)->getIdOperand(1);
 }
 
 Op Builder::getMostBasicTypeClass(Id typeId) const
@@ -488,12 +533,6 @@
     Op typeClass = instr->getOpCode();
     switch (typeClass)
     {
-    case OpTypeVoid:
-    case OpTypeBool:
-    case OpTypeInt:
-    case OpTypeFloat:
-    case OpTypeStruct:
-        return typeClass;
     case OpTypeVector:
     case OpTypeMatrix:
     case OpTypeArray:
@@ -502,8 +541,7 @@
     case OpTypePointer:
         return getMostBasicTypeClass(instr->getIdOperand(1));
     default:
-        assert(0);
-        return OpTypeFloat;
+        return typeClass;
     }
 }
 
@@ -522,7 +560,7 @@
         return instr->getImmediateOperand(1);
     case OpTypeArray:
     {
-        Id lengthId = instr->getImmediateOperand(1);
+        Id lengthId = instr->getIdOperand(1);
         return module.getInstruction(lengthId)->getImmediateOperand(0);
     }
     case OpTypeStruct:
@@ -590,9 +628,39 @@
     return getContainedTypeId(typeId, 0);
 }
 
+// Returns true if 'typeId' is or contains a scalar type declared with 'typeOp'
+// of width 'width'. The 'width' is only consumed for int and float types.
+// Returns false otherwise.
+bool Builder::containsType(Id typeId, spv::Op typeOp, unsigned int width) const
+{
+    const Instruction& instr = *module.getInstruction(typeId);
+
+    Op typeClass = instr.getOpCode();
+    switch (typeClass)
+    {
+    case OpTypeInt:
+    case OpTypeFloat:
+        return typeClass == typeOp && instr.getImmediateOperand(0) == width;
+    case OpTypeStruct:
+        for (int m = 0; m < instr.getNumOperands(); ++m) {
+            if (containsType(instr.getIdOperand(m), typeOp, width))
+                return true;
+        }
+        return false;
+    case OpTypeVector:
+    case OpTypeMatrix:
+    case OpTypeArray:
+    case OpTypeRuntimeArray:
+    case OpTypePointer:
+        return containsType(getContainedTypeId(typeId), typeOp, width);
+    default:
+        return typeClass == typeOp;
+    }
+}
+
 // See if a scalar constant of this type has already been created, so it
 // can be reused rather than duplicated.  (Required by the specification).
-Id Builder::findScalarConstant(Op typeClass, Op opcode, Id typeId, unsigned value) const
+Id Builder::findScalarConstant(Op typeClass, Op opcode, Id typeId, unsigned value)
 {
     Instruction* constant;
     for (int i = 0; i < (int)groupedConstants[typeClass].size(); ++i) {
@@ -607,7 +675,7 @@
 }
 
 // Version of findScalarConstant (see above) for scalars that take two operands (e.g. a 'double' or 'int64').
-Id Builder::findScalarConstant(Op typeClass, Op opcode, Id typeId, unsigned v1, unsigned v2) const
+Id Builder::findScalarConstant(Op typeClass, Op opcode, Id typeId, unsigned v1, unsigned v2)
 {
     Instruction* constant;
     for (int i = 0; i < (int)groupedConstants[typeClass].size(); ++i) {
@@ -789,7 +857,6 @@
     return c->getResultId();
 }
 
-#ifdef AMD_EXTENSIONS
 Id Builder::makeFloat16Constant(float f16, bool specConstant)
 {
     Op opcode = specConstant ? OpSpecConstant : OpConstant;
@@ -817,9 +884,27 @@
 
     return c->getResultId();
 }
-#endif
 
-Id Builder::findCompositeConstant(Op typeClass, const std::vector<Id>& comps) const
+Id Builder::makeFpConstant(Id type, double d, bool specConstant)
+{
+        assert(isFloatType(type));
+
+        switch (getScalarTypeWidth(type)) {
+        case 16:
+                return makeFloat16Constant((float)d, specConstant);
+        case 32:
+                return makeFloatConstant((float)d, specConstant);
+        case 64:
+                return makeDoubleConstant(d, specConstant);
+        default:
+                break;
+        }
+
+        assert(false);
+        return NoResult;
+}
+
+Id Builder::findCompositeConstant(Op typeClass, const std::vector<Id>& comps)
 {
     Instruction* constant = 0;
     bool found = false;
@@ -847,6 +932,30 @@
     return found ? constant->getResultId() : NoResult;
 }
 
+Id Builder::findStructConstant(Id typeId, const std::vector<Id>& comps)
+{
+    Instruction* constant = 0;
+    bool found = false;
+    for (int i = 0; i < (int)groupedStructConstants[typeId].size(); ++i) {
+        constant = groupedStructConstants[typeId][i];
+
+        // same contents?
+        bool mismatch = false;
+        for (int op = 0; op < constant->getNumOperands(); ++op) {
+            if (constant->getIdOperand(op) != comps[op]) {
+                mismatch = true;
+                break;
+            }
+        }
+        if (! mismatch) {
+            found = true;
+            break;
+        }
+    }
+
+    return found ? constant->getResultId() : NoResult;
+}
+
 // Comments in header
 Id Builder::makeCompositeConstant(Id typeId, const std::vector<Id>& members, bool specConstant)
 {
@@ -857,25 +966,33 @@
     switch (typeClass) {
     case OpTypeVector:
     case OpTypeArray:
-    case OpTypeStruct:
     case OpTypeMatrix:
+        if (! specConstant) {
+            Id existing = findCompositeConstant(typeClass, members);
+            if (existing)
+                return existing;
+        }
+        break;
+    case OpTypeStruct:
+        if (! specConstant) {
+            Id existing = findStructConstant(typeId, members);
+            if (existing)
+                return existing;
+        }
         break;
     default:
         assert(0);
         return makeFloatConstant(0.0);
     }
 
-    if (! specConstant) {
-        Id existing = findCompositeConstant(typeClass, members);
-        if (existing)
-            return existing;
-    }
-
     Instruction* c = new Instruction(getUniqueId(), typeId, opcode);
     for (int op = 0; op < (int)members.size(); ++op)
         c->addIdOperand(members[op]);
     constantsTypesGlobals.push_back(std::unique_ptr<Instruction>(c));
-    groupedConstants[typeClass].push_back(c);
+    if (typeClass == OpTypeStruct)
+        groupedStructConstants[typeId].push_back(c);
+    else
+        groupedConstants[typeClass].push_back(c);
     module.mapInstruction(c);
 
     return c->getResultId();
@@ -928,21 +1045,11 @@
     names.push_back(std::unique_ptr<Instruction>(name));
 }
 
-void Builder::addLine(Id target, Id fileName, int lineNum, int column)
-{
-    Instruction* line = new Instruction(OpLine);
-    line->addIdOperand(target);
-    line->addIdOperand(fileName);
-    line->addImmediateOperand(lineNum);
-    line->addImmediateOperand(column);
-
-    lines.push_back(std::unique_ptr<Instruction>(line));
-}
-
 void Builder::addDecoration(Id id, Decoration decoration, int num)
 {
     if (decoration == spv::DecorationMax)
         return;
+
     Instruction* dec = new Instruction(OpDecorate);
     dec->addIdOperand(id);
     dec->addImmediateOperand(decoration);
@@ -952,8 +1059,37 @@
     decorations.push_back(std::unique_ptr<Instruction>(dec));
 }
 
+void Builder::addDecoration(Id id, Decoration decoration, const char* s)
+{
+    if (decoration == spv::DecorationMax)
+        return;
+
+    Instruction* dec = new Instruction(OpDecorateStringGOOGLE);
+    dec->addIdOperand(id);
+    dec->addImmediateOperand(decoration);
+    dec->addStringOperand(s);
+
+    decorations.push_back(std::unique_ptr<Instruction>(dec));
+}
+
+void Builder::addDecorationId(Id id, Decoration decoration, Id idDecoration)
+{
+    if (decoration == spv::DecorationMax)
+        return;
+
+    Instruction* dec = new Instruction(OpDecorateId);
+    dec->addIdOperand(id);
+    dec->addImmediateOperand(decoration);
+    dec->addIdOperand(idDecoration);
+
+    decorations.push_back(std::unique_ptr<Instruction>(dec));
+}
+
 void Builder::addMemberDecoration(Id id, unsigned int member, Decoration decoration, int num)
 {
+    if (decoration == spv::DecorationMax)
+        return;
+
     Instruction* dec = new Instruction(OpMemberDecorate);
     dec->addIdOperand(id);
     dec->addImmediateOperand(member);
@@ -964,6 +1100,20 @@
     decorations.push_back(std::unique_ptr<Instruction>(dec));
 }
 
+void Builder::addMemberDecoration(Id id, unsigned int member, Decoration decoration, const char *s)
+{
+    if (decoration == spv::DecorationMax)
+        return;
+
+    Instruction* dec = new Instruction(OpMemberDecorateStringGOOGLE);
+    dec->addIdOperand(id);
+    dec->addImmediateOperand(member);
+    dec->addImmediateOperand(decoration);
+    dec->addStringOperand(s);
+
+    decorations.push_back(std::unique_ptr<Instruction>(dec));
+}
+
 // Comments in header
 Function* Builder::makeEntryPoint(const char* entryPoint)
 {
@@ -971,16 +1121,16 @@
 
     Block* entry;
     std::vector<Id> params;
-    std::vector<Decoration> precisions;
+    std::vector<std::vector<Decoration>> decorations;
 
-    entryPointFunction = makeFunctionEntry(NoPrecision, makeVoidType(), entryPoint, params, precisions, &entry);
+    entryPointFunction = makeFunctionEntry(NoPrecision, makeVoidType(), entryPoint, params, decorations, &entry);
 
     return entryPointFunction;
 }
 
 // Comments in header
 Function* Builder::makeFunctionEntry(Decoration precision, Id returnType, const char* name,
-                                     const std::vector<Id>& paramTypes, const std::vector<Decoration>& precisions, Block **entry)
+                                     const std::vector<Id>& paramTypes, const std::vector<std::vector<Decoration>>& decorations, Block **entry)
 {
     // Make the function and initial instructions in it
     Id typeId = makeFunctionType(returnType, paramTypes);
@@ -989,8 +1139,10 @@
 
     // Set up the precisions
     setPrecision(function->getId(), precision);
-    for (unsigned p = 0; p < (unsigned)precisions.size(); ++p)
-        setPrecision(firstParamId + p, precisions[p]);
+    for (unsigned p = 0; p < (unsigned)decorations.size(); ++p) {
+        for (int d = 0; d < (int)decorations[p].size(); ++d)
+            addDecoration(firstParamId + p, decorations[p][d]);
+    }
 
     // CFG
     if (entry) {
@@ -1079,19 +1231,35 @@
 }
 
 // Comments in header
-void Builder::createStore(Id rValue, Id lValue)
+void Builder::createStore(Id rValue, Id lValue, spv::MemoryAccessMask memoryAccess, spv::Scope scope)
 {
     Instruction* store = new Instruction(OpStore);
     store->addIdOperand(lValue);
     store->addIdOperand(rValue);
+
+    if (memoryAccess != MemoryAccessMaskNone) {
+        store->addImmediateOperand(memoryAccess);
+        if (memoryAccess & spv::MemoryAccessMakePointerAvailableKHRMask) {
+            store->addIdOperand(makeUintConstant(scope));
+        }
+    }
+
     buildPoint->addInstruction(std::unique_ptr<Instruction>(store));
 }
 
 // Comments in header
-Id Builder::createLoad(Id lValue)
+Id Builder::createLoad(Id lValue, spv::MemoryAccessMask memoryAccess, spv::Scope scope)
 {
     Instruction* load = new Instruction(getUniqueId(), getDerefTypeId(lValue), OpLoad);
     load->addIdOperand(lValue);
+
+    if (memoryAccess != MemoryAccessMaskNone) {
+        load->addImmediateOperand(memoryAccess);
+        if (memoryAccess & spv::MemoryAccessMakePointerVisibleKHRMask) {
+            load->addIdOperand(makeUintConstant(scope));
+        }
+    }
+
     buildPoint->addInstruction(std::unique_ptr<Instruction>(load));
 
     return load->getResultId();
@@ -1125,7 +1293,7 @@
 
 Id Builder::createArrayLength(Id base, unsigned int member)
 {
-    spv::Id intType = makeIntType(32);
+    spv::Id intType = makeUintType(32);
     Instruction* length = new Instruction(getUniqueId(), intType, OpArrayLength);
     length->addIdOperand(base);
     length->addImmediateOperand(member);
@@ -1216,7 +1384,7 @@
     buildPoint->addInstruction(std::unique_ptr<Instruction>(op));
 }
 
-// An opcode that has one operand, no result id, and no type
+// An opcode that has one id operand, no result id, and no type
 void Builder::createNoResultOp(Op opCode, Id operand)
 {
     Instruction* op = new Instruction(opCode);
@@ -1224,29 +1392,43 @@
     buildPoint->addInstruction(std::unique_ptr<Instruction>(op));
 }
 
-// An opcode that has one operand, no result id, and no type
+// An opcode that has one or more operands, no result id, and no type
 void Builder::createNoResultOp(Op opCode, const std::vector<Id>& operands)
 {
     Instruction* op = new Instruction(opCode);
-    for (auto it = operands.cbegin(); it != operands.cend(); ++it)
+    for (auto it = operands.cbegin(); it != operands.cend(); ++it) {
         op->addIdOperand(*it);
+    }
+    buildPoint->addInstruction(std::unique_ptr<Instruction>(op));
+}
+
+// An opcode that has multiple operands, no result id, and no type
+void Builder::createNoResultOp(Op opCode, const std::vector<IdImmediate>& operands)
+{
+    Instruction* op = new Instruction(opCode);
+    for (auto it = operands.cbegin(); it != operands.cend(); ++it) {
+        if (it->isId)
+            op->addIdOperand(it->word);
+        else
+            op->addImmediateOperand(it->word);
+    }
     buildPoint->addInstruction(std::unique_ptr<Instruction>(op));
 }
 
 void Builder::createControlBarrier(Scope execution, Scope memory, MemorySemanticsMask semantics)
 {
     Instruction* op = new Instruction(OpControlBarrier);
-    op->addImmediateOperand(makeUintConstant(execution));
-    op->addImmediateOperand(makeUintConstant(memory));
-    op->addImmediateOperand(makeUintConstant(semantics));
+    op->addIdOperand(makeUintConstant(execution));
+    op->addIdOperand(makeUintConstant(memory));
+    op->addIdOperand(makeUintConstant(semantics));
     buildPoint->addInstruction(std::unique_ptr<Instruction>(op));
 }
 
 void Builder::createMemoryBarrier(unsigned executionScope, unsigned memorySemantics)
 {
     Instruction* op = new Instruction(OpMemoryBarrier);
-    op->addImmediateOperand(makeUintConstant(executionScope));
-    op->addImmediateOperand(makeUintConstant(memorySemantics));
+    op->addIdOperand(makeUintConstant(executionScope));
+    op->addIdOperand(makeUintConstant(memorySemantics));
     buildPoint->addInstruction(std::unique_ptr<Instruction>(op));
 }
 
@@ -1313,6 +1495,20 @@
     return op->getResultId();
 }
 
+Id Builder::createOp(Op opCode, Id typeId, const std::vector<IdImmediate>& operands)
+{
+    Instruction* op = new Instruction(getUniqueId(), typeId, opCode);
+    for (auto it = operands.cbegin(); it != operands.cend(); ++it) {
+        if (it->isId)
+            op->addIdOperand(it->word);
+        else
+            op->addImmediateOperand(it->word);
+    }
+    buildPoint->addInstruction(std::unique_ptr<Instruction>(op));
+
+    return op->getResultId();
+}
+
 Id Builder::createSpecConstantOp(Op opCode, Id typeId, const std::vector<Id>& operands, const std::vector<unsigned>& literals)
 {
     Instruction* op = new Instruction(getUniqueId(), typeId, OpSpecConstantOp);
@@ -1367,16 +1563,13 @@
         return createCompositeInsert(source, target, typeId, channels.front());
 
     Instruction* swizzle = new Instruction(getUniqueId(), typeId, OpVectorShuffle);
+
     assert(isVector(target));
     swizzle->addIdOperand(target);
-    if (accessChain.component != NoResult)
-        // For dynamic component selection, source does not involve in l-value swizzle
-        swizzle->addIdOperand(target);
-    else {
-        assert(getNumComponents(source) == (int)channels.size());
-        assert(isVector(source));
-        swizzle->addIdOperand(source);
-    }
+
+    assert(getNumComponents(source) == (int)channels.size());
+    assert(isVector(source));
+    swizzle->addIdOperand(source);
 
     // Set up an identity shuffle from the base value to the result value
     unsigned int components[4];
@@ -1385,12 +1578,8 @@
         components[i] = i;
 
     // Punch in the l-value swizzle
-    for (int i = 0; i < (int)channels.size(); ++i) {
-        if (accessChain.component != NoResult)
-            components[i] = channels[i]; // Only shuffle the base value
-        else
-            components[channels[i]] = numTargetComponents + i;
-    }
+    for (int i = 0; i < (int)channels.size(); ++i)
+        components[channels[i]] = numTargetComponents + i;
 
     // finish the instruction with these components selectors
     for (int i = 0; i < numTargetComponents; ++i)
@@ -1462,7 +1651,8 @@
 
 // Accept all parameters needed to create a texture instruction.
 // Create the correct instruction based on the inputs, and make the call.
-Id Builder::createTextureCall(Decoration precision, Id resultType, bool sparse, bool fetch, bool proj, bool gather, bool noImplicitLod, const TextureParameters& parameters)
+Id Builder::createTextureCall(Decoration precision, Id resultType, bool sparse, bool fetch, bool proj, bool gather,
+    bool noImplicitLod, const TextureParameters& parameters)
 {
     static const int maxTextureArgs = 10;
     Id texArgs[maxTextureArgs] = {};
@@ -1479,6 +1669,13 @@
     if (parameters.component != NoResult)
         texArgs[numArgs++] = parameters.component;
 
+#ifdef NV_EXTENSIONS
+    if (parameters.granularity != NoResult)
+        texArgs[numArgs++] = parameters.granularity;
+    if (parameters.coarse != NoResult)
+        texArgs[numArgs++] = parameters.coarse;
+#endif 
+
     //
     // Set up the optional arguments
     //
@@ -1515,6 +1712,7 @@
         texArgs[numArgs++] = parameters.offset;
     }
     if (parameters.offsets) {
+        addCapability(CapabilityImageGatherExtended);
         mask = (ImageOperandsMask)(mask | ImageOperandsConstOffsetsMask);
         texArgs[numArgs++] = parameters.offsets;
     }
@@ -1529,6 +1727,12 @@
         mask = (ImageOperandsMask)(mask | ImageOperandsMinLodMask);
         texArgs[numArgs++] = parameters.lodClamp;
     }
+    if (parameters.nonprivate) {
+        mask = mask | ImageOperandsNonPrivateTexelKHRMask;
+    }
+    if (parameters.volatil) {
+        mask = mask | ImageOperandsVolatileTexelKHRMask;
+    }
     if (mask == ImageOperandsMaskNone)
         --numArgs;  // undo speculative reservation for the mask argument
     else
@@ -1543,6 +1747,10 @@
             opCode = OpImageSparseFetch;
         else
             opCode = OpImageFetch;
+#ifdef NV_EXTENSIONS
+    } else if (parameters.granularity && parameters.coarse) {
+        opCode = OpImageSampleFootprintNV;
+#endif
     } else if (gather) {
         if (parameters.Dref)
             if (sparse)
@@ -1664,9 +1872,6 @@
 // Comments in header
 Id Builder::createTextureQueryCall(Op opCode, const TextureParameters& parameters, bool isUnsignedResult)
 {
-    // All these need a capability
-    addCapability(CapabilityImageQuery);
-
     // Figure out the result type
     Id resultType = 0;
     switch (opCode) {
@@ -1705,7 +1910,11 @@
         break;
     }
     case OpImageQueryLod:
+#ifdef AMD_EXTENSIONS
+        resultType = makeVectorType(getScalarTypeId(getTypeId(parameters.coords)), 2);
+#else
         resultType = makeVectorType(makeFloatType(32), 2);
+#endif
         break;
     case OpImageQueryLevels:
     case OpImageQuerySamples:
@@ -1915,9 +2124,39 @@
     int numRows = getTypeNumRows(resultTypeId);
 
     Instruction* instr = module.getInstruction(componentTypeId);
-    Id bitCount = instr->getIdOperand(0);
+    unsigned bitCount = instr->getImmediateOperand(0);
 
-    // Will use a two step process
+    // Optimize matrix constructed from a bigger matrix
+    if (isMatrix(sources[0]) && getNumColumns(sources[0]) >= numCols && getNumRows(sources[0]) >= numRows) {
+        // To truncate the matrix to a smaller number of rows/columns, we need to:
+        // 1. For each column, extract the column and truncate it to the required size using shuffle
+        // 2. Assemble the resulting matrix from all columns
+        Id matrix = sources[0];
+        Id columnTypeId = getContainedTypeId(resultTypeId);
+        Id sourceColumnTypeId = getContainedTypeId(getTypeId(matrix));
+
+        std::vector<unsigned> channels;
+        for (int row = 0; row < numRows; ++row)
+            channels.push_back(row);
+
+        std::vector<Id> matrixColumns;
+        for (int col = 0; col < numCols; ++col) {
+            std::vector<unsigned> indexes;
+            indexes.push_back(col);
+            Id colv = createCompositeExtract(matrix, sourceColumnTypeId, indexes);
+            setPrecision(colv, precision);
+
+            if (numRows != getNumRows(matrix)) {
+                matrixColumns.push_back(createRvalueSwizzle(precision, columnTypeId, colv, channels));
+            } else {
+                matrixColumns.push_back(colv);
+            }
+        }
+
+        return setPrecision(createCompositeConstruct(resultTypeId, matrixColumns), precision);
+    }
+
+    // Otherwise, will use a two step process
     // 1. make a compile-time 2D array of values
     // 2. construct a matrix from that array
 
@@ -1997,9 +2236,10 @@
 }
 
 // Comments in header
-Builder::If::If(Id cond, Builder& gb) :
+Builder::If::If(Id cond, unsigned int ctrl, Builder& gb) :
     builder(gb),
     condition(cond),
+    control(ctrl),
     elseBlock(0)
 {
     function = &builder.getBuildPoint()->getParent();
@@ -2040,7 +2280,7 @@
 
     // Go back to the headerBlock and make the flow control split
     builder.setBuildPoint(headerBlock);
-    builder.createSelectionMerge(mergeBlock, SelectionControlMaskNone);
+    builder.createSelectionMerge(mergeBlock, control);
     if (elseBlock)
         builder.createConditionalBranch(condition, thenBlock, elseBlock);
     else
@@ -2052,7 +2292,7 @@
 }
 
 // Comments in header
-void Builder::makeSwitch(Id selector, int numSegments, const std::vector<int>& caseValues,
+void Builder::makeSwitch(Id selector, unsigned int control, int numSegments, const std::vector<int>& caseValues,
                          const std::vector<int>& valueIndexToSegment, int defaultSegment,
                          std::vector<Block*>& segmentBlocks)
 {
@@ -2065,7 +2305,7 @@
     Block* mergeBlock = new Block(getUniqueId(), function);
 
     // make and insert the switch's selection-merge instruction
-    createSelectionMerge(mergeBlock, SelectionControlMaskNone);
+    createSelectionMerge(mergeBlock, control);
 
     // make the switch instruction
     Instruction* switchInst = new Instruction(NoResult, NoType, OpSwitch);
@@ -2170,6 +2410,7 @@
     accessChain.component = NoResult;
     accessChain.preSwizzleBaseType = NoType;
     accessChain.isRValue = false;
+    accessChain.coherentFlags.clear();
 }
 
 // Comments in header
@@ -2181,7 +2422,7 @@
         accessChain.preSwizzleBaseType = preSwizzleBaseType;
 
     // if needed, propagate the swizzle for the current access chain
-    if (accessChain.swizzle.size()) {
+    if (accessChain.swizzle.size() > 0) {
         std::vector<unsigned> oldSwizzle = accessChain.swizzle;
         accessChain.swizzle.resize(0);
         for (unsigned int i = 0; i < swizzle.size(); ++i) {
@@ -2196,40 +2437,34 @@
 }
 
 // Comments in header
-void Builder::accessChainStore(Id rvalue)
+void Builder::accessChainStore(Id rvalue, spv::MemoryAccessMask memoryAccess, spv::Scope scope)
 {
     assert(accessChain.isRValue == false);
 
     transferAccessChainSwizzle(true);
     Id base = collapseAccessChain();
+    Id source = rvalue;
+
+    // dynamic component should be gone
+    assert(accessChain.component == NoResult);
 
     // If swizzle still exists, it is out-of-order or not full, we must load the target vector,
     // extract and insert elements to perform writeMask and/or swizzle.
-    Id source = NoResult;
-    if (accessChain.swizzle.size()) {
+    if (accessChain.swizzle.size() > 0) {
         Id tempBaseId = createLoad(base);
-        source = createLvalueSwizzle(getTypeId(tempBaseId), tempBaseId, rvalue, accessChain.swizzle);
+        source = createLvalueSwizzle(getTypeId(tempBaseId), tempBaseId, source, accessChain.swizzle);
     }
 
-    // dynamic component selection
-    if (accessChain.component != NoResult) {
-        Id tempBaseId = (source == NoResult) ? createLoad(base) : source;
-        source = createVectorInsertDynamic(tempBaseId, getTypeId(tempBaseId), rvalue, accessChain.component);
-    }
-
-    if (source == NoResult)
-        source = rvalue;
-
-    createStore(source, base);
+    createStore(source, base, memoryAccess, scope);
 }
 
 // Comments in header
-Id Builder::accessChainLoad(Decoration precision, Id resultType)
+Id Builder::accessChainLoad(Decoration precision, Decoration nonUniform, Id resultType, spv::MemoryAccessMask memoryAccess, spv::Scope scope)
 {
     Id id;
 
     if (accessChain.isRValue) {
-        // transfer access chain, but keep it static, so we can stay in registers
+        // transfer access chain, but try to stay in registers
         transferAccessChainSwizzle(false);
         if (accessChain.indexChain.size() > 0) {
             Id swizzleBase = accessChain.preSwizzleBaseType != NoType ? accessChain.preSwizzleBaseType : resultType;
@@ -2268,8 +2503,9 @@
     } else {
         transferAccessChainSwizzle(true);
         // load through the access chain
-        id = createLoad(collapseAccessChain());
+        id = createLoad(collapseAccessChain(), memoryAccess, scope);
         setPrecision(id, precision);
+        addDecoration(id, nonUniform);
     }
 
     // Done, unless there are swizzles to do
@@ -2277,19 +2513,20 @@
         return id;
 
     // Do remaining swizzling
-    // First, static swizzling
-    if (accessChain.swizzle.size()) {
-        // static swizzle
+
+    // Do the basic swizzle
+    if (accessChain.swizzle.size() > 0) {
         Id swizzledType = getScalarTypeId(getTypeId(id));
         if (accessChain.swizzle.size() > 1)
             swizzledType = makeVectorType(swizzledType, (int)accessChain.swizzle.size());
         id = createRvalueSwizzle(precision, swizzledType, id, accessChain.swizzle);
     }
 
-    // dynamic single-component selection
+    // Do the dynamic component
     if (accessChain.component != NoResult)
         id = setPrecision(createVectorExtractDynamic(id, resultType, accessChain.component), precision);
 
+    addDecoration(id, nonUniform);
     return id;
 }
 
@@ -2342,47 +2579,11 @@
     return type;
 }
 
-// comment in header
-void Builder::eliminateDeadDecorations() {
-    std::unordered_set<const Block*> reachable_blocks;
-    std::unordered_set<Id> unreachable_definitions;
-    // Collect IDs defined in unreachable blocks. For each function, label the
-    // reachable blocks first. Then for each unreachable block, collect the
-    // result IDs of the instructions in it.
-    for (std::vector<Function*>::const_iterator fi = module.getFunctions().cbegin();
-        fi != module.getFunctions().cend(); fi++) {
-        Function* f = *fi;
-        Block* entry = f->getEntryBlock();
-        inReadableOrder(entry, [&reachable_blocks](const Block* b) {
-            reachable_blocks.insert(b);
-        });
-        for (std::vector<Block*>::const_iterator bi = f->getBlocks().cbegin();
-            bi != f->getBlocks().cend(); bi++) {
-            Block* b = *bi;
-            if (!reachable_blocks.count(b)) {
-                for (std::vector<std::unique_ptr<Instruction> >::const_iterator
-                         ii = b->getInstructions().cbegin();
-                    ii != b->getInstructions().cend(); ii++) {
-                    Instruction* i = ii->get();
-                    unreachable_definitions.insert(i->getResultId());
-                }
-            }
-        }
-    }
-    decorations.erase(std::remove_if(decorations.begin(), decorations.end(),
-        [&unreachable_definitions](std::unique_ptr<Instruction>& I) -> bool {
-            Instruction* inst = I.get();
-            Id decoration_id = inst->getIdOperand(0);
-            return unreachable_definitions.count(decoration_id) != 0;
-        }),
-        decorations.end());
-}
-
 void Builder::dump(std::vector<unsigned int>& out) const
 {
     // Header, before first instructions:
     out.push_back(MagicNumber);
-    out.push_back(Version);
+    out.push_back(spvVersion);
     out.push_back(builderNumber);
     out.push_back(uniqueId + 1);
     out.push_back(0);
@@ -2411,19 +2612,15 @@
     dumpInstructions(out, executionModes);
 
     // Debug instructions
-    if (source != SourceLanguageUnknown) {
-        Instruction sourceInst(0, 0, OpSource);
-        sourceInst.addImmediateOperand(source);
-        sourceInst.addImmediateOperand(sourceVersion);
-        sourceInst.dump(out);
-    }
+    dumpInstructions(out, strings);
+    dumpSourceInstructions(out);
     for (int e = 0; e < (int)sourceExtensions.size(); ++e) {
         Instruction sourceExtInst(0, 0, OpSourceExtension);
         sourceExtInst.addStringOperand(sourceExtensions[e]);
         sourceExtInst.dump(out);
     }
     dumpInstructions(out, names);
-    dumpInstructions(out, lines);
+    dumpModuleProcesses(out);
 
     // Annotation instructions
     dumpInstructions(out, decorations);
@@ -2439,26 +2636,66 @@
 // Protected methods.
 //
 
-// Turn the described access chain in 'accessChain' into an instruction
+// Turn the described access chain in 'accessChain' into an instruction(s)
 // computing its address.  This *cannot* include complex swizzles, which must
-// be handled after this is called, but it does include swizzles that select
-// an individual element, as a single address of a scalar type can be
-// computed by an OpAccessChain instruction.
+// be handled after this is called.
+//
+// Can generate code.
 Id Builder::collapseAccessChain()
 {
     assert(accessChain.isRValue == false);
 
-    if (accessChain.indexChain.size() > 0) {
-        if (accessChain.instr == 0) {
-            StorageClass storageClass = (StorageClass)module.getStorageClass(getTypeId(accessChain.base));
-            accessChain.instr = createAccessChain(storageClass, accessChain.base, accessChain.indexChain);
-        }
-
+    // did we already emit an access chain for this?
+    if (accessChain.instr != NoResult)
         return accessChain.instr;
-    } else
+
+    // If we have a dynamic component, we can still transfer
+    // that into a final operand to the access chain.  We need to remap the
+    // dynamic component through the swizzle to get a new dynamic component to
+    // update.
+    //
+    // This was not done in transferAccessChainSwizzle() because it might
+    // generate code.
+    remapDynamicSwizzle();
+    if (accessChain.component != NoResult) {
+        // transfer the dynamic component to the access chain
+        accessChain.indexChain.push_back(accessChain.component);
+        accessChain.component = NoResult;
+    }
+
+    // note that non-trivial swizzling is left pending
+
+    // do we have an access chain?
+    if (accessChain.indexChain.size() == 0)
         return accessChain.base;
 
-    // note that non-trivial swizzling is left pending...
+    // emit the access chain
+    StorageClass storageClass = (StorageClass)module.getStorageClass(getTypeId(accessChain.base));
+    accessChain.instr = createAccessChain(storageClass, accessChain.base, accessChain.indexChain);
+
+    return accessChain.instr;
+}
+
+// For a dynamic component selection of a swizzle.
+//
+// Turn the swizzle and dynamic component into just a dynamic component.
+//
+// Generates code.
+void Builder::remapDynamicSwizzle()
+{
+    // do we have a swizzle to remap a dynamic component through?
+    if (accessChain.component != NoResult && accessChain.swizzle.size() > 1) {
+        // build a vector of the swizzle for the component to map into
+        std::vector<Id> components;
+        for (int c = 0; c < (int)accessChain.swizzle.size(); ++c)
+            components.push_back(makeUintConstant(accessChain.swizzle[c]));
+        Id mapType = makeVectorType(makeUintType(32), (int)accessChain.swizzle.size());
+        Id map = makeCompositeConstant(mapType, components);
+
+        // use it
+        accessChain.component = createVectorExtractDynamic(map, makeUintType(32), accessChain.component);
+        accessChain.swizzle.clear();
+    }
 }
 
 // clear out swizzle if it is redundant, that is reselecting the same components
@@ -2484,38 +2721,30 @@
 
 // To the extent any swizzling can become part of the chain
 // of accesses instead of a post operation, make it so.
-// If 'dynamic' is true, include transferring a non-static component index,
-// otherwise, only transfer static indexes.
+// If 'dynamic' is true, include transferring the dynamic component,
+// otherwise, leave it pending.
 //
-// Also, Boolean vectors are likely to be special.  While
-// for external storage, they should only be integer types,
-// function-local bool vectors could use sub-word indexing,
-// so keep that as a separate Insert/Extract on a loaded vector.
+// Does not generate code. just updates the access chain.
 void Builder::transferAccessChainSwizzle(bool dynamic)
 {
-    // too complex?
-    if (accessChain.swizzle.size() > 1)
-        return;
-
     // non existent?
     if (accessChain.swizzle.size() == 0 && accessChain.component == NoResult)
         return;
 
-    // single component...
-
-    // skip doing it for Boolean vectors
-    if (isBoolType(getContainedTypeId(accessChain.preSwizzleBaseType)))
+    // too complex?
+    // (this requires either a swizzle, or generating code for a dynamic component)
+    if (accessChain.swizzle.size() > 1)
         return;
 
+    // single component, either in the swizzle and/or dynamic component
     if (accessChain.swizzle.size() == 1) {
-        // handle static component
+        assert(accessChain.component == NoResult);
+        // handle static component selection
         accessChain.indexChain.push_back(makeUintConstant(accessChain.swizzle.front()));
         accessChain.swizzle.clear();
-        // note, the only valid remaining dynamic access would be to this one
-        // component, so don't bother even looking at accessChain.component
         accessChain.preSwizzleBaseType = NoType;
-        accessChain.component = NoResult;
     } else if (dynamic && accessChain.component != NoResult) {
+        assert(accessChain.swizzle.size() == 0);
         // handle dynamic component
         accessChain.indexChain.push_back(accessChain.component);
         accessChain.preSwizzleBaseType = NoType;
@@ -2554,12 +2783,15 @@
     buildPoint->addInstruction(std::unique_ptr<Instruction>(merge));
 }
 
-void Builder::createLoopMerge(Block* mergeBlock, Block* continueBlock, unsigned int control)
+void Builder::createLoopMerge(Block* mergeBlock, Block* continueBlock, unsigned int control,
+                              unsigned int dependencyLength)
 {
     Instruction* merge = new Instruction(OpLoopMerge);
     merge->addIdOperand(mergeBlock->getId());
     merge->addIdOperand(continueBlock->getId());
     merge->addImmediateOperand(control);
+    if ((control & LoopControlDependencyLengthMask) != 0)
+        merge->addImmediateOperand(dependencyLength);
     buildPoint->addInstruction(std::unique_ptr<Instruction>(merge));
 }
 
@@ -2574,6 +2806,48 @@
     elseBlock->addPredecessor(buildPoint);
 }
 
+// OpSource
+// [OpSourceContinued]
+// ...
+void Builder::dumpSourceInstructions(std::vector<unsigned int>& out) const
+{
+    const int maxWordCount = 0xFFFF;
+    const int opSourceWordCount = 4;
+    const int nonNullBytesPerInstruction = 4 * (maxWordCount - opSourceWordCount) - 1;
+
+    if (source != SourceLanguageUnknown) {
+        // OpSource Language Version File Source
+        Instruction sourceInst(NoResult, NoType, OpSource);
+        sourceInst.addImmediateOperand(source);
+        sourceInst.addImmediateOperand(sourceVersion);
+        // File operand
+        if (sourceFileStringId != NoResult) {
+            sourceInst.addIdOperand(sourceFileStringId);
+            // Source operand
+            if (sourceText.size() > 0) {
+                int nextByte = 0;
+                std::string subString;
+                while ((int)sourceText.size() - nextByte > 0) {
+                    subString = sourceText.substr(nextByte, nonNullBytesPerInstruction);
+                    if (nextByte == 0) {
+                        // OpSource
+                        sourceInst.addStringOperand(subString.c_str());
+                        sourceInst.dump(out);
+                    } else {
+                        // OpSourcContinued
+                        Instruction sourceContinuedInst(OpSourceContinued);
+                        sourceContinuedInst.addStringOperand(subString.c_str());
+                        sourceContinuedInst.dump(out);
+                    }
+                    nextByte += nonNullBytesPerInstruction;
+                }
+            } else
+                sourceInst.dump(out);
+        } else
+            sourceInst.dump(out);
+    }
+}
+
 void Builder::dumpInstructions(std::vector<unsigned int>& out, const std::vector<std::unique_ptr<Instruction> >& instructions) const
 {
     for (int i = 0; i < (int)instructions.size(); ++i) {
@@ -2581,4 +2855,13 @@
     }
 }
 
+void Builder::dumpModuleProcesses(std::vector<unsigned int>& out) const
+{
+    for (int i = 0; i < (int)moduleProcesses.size(); ++i) {
+        Instruction moduleProcessed(OpModuleProcessed);
+        moduleProcessed.addStringOperand(moduleProcesses[i]);
+        moduleProcessed.dump(out);
+    }
+}
+
 }; // end spv namespace
diff --git a/SPIRV/SpvBuilder.h b/SPIRV/SpvBuilder.h
old mode 100755
new mode 100644
index d93174e..7c1d421
--- a/SPIRV/SpvBuilder.h
+++ b/SPIRV/SpvBuilder.h
@@ -1,6 +1,7 @@
 //
 // Copyright (C) 2014-2015 LunarG, Inc.
 // Copyright (C) 2015-2016 Google, Inc.
+// Copyright (C) 2017 ARM Limited.
 //
 // All rights reserved.
 //
@@ -55,22 +56,35 @@
 #include <set>
 #include <sstream>
 #include <stack>
+#include <unordered_map>
 
 namespace spv {
 
 class Builder {
 public:
-    Builder(unsigned int userNumber, SpvBuildLogger* logger);
+    Builder(unsigned int spvVersion, unsigned int userNumber, SpvBuildLogger* logger);
     virtual ~Builder();
 
     static const int maxMatrixSize = 4;
 
+    unsigned int getSpvVersion() const { return spvVersion; }
+
     void setSource(spv::SourceLanguage lang, int version)
     {
         source = lang;
         sourceVersion = version;
     }
+    void setSourceFile(const std::string& file)
+    {
+        Instruction* fileString = new Instruction(getUniqueId(), NoType, OpString);
+        fileString->addStringOperand(file.c_str());
+        sourceFileStringId = fileString->getResultId();
+        strings.push_back(std::unique_ptr<Instruction>(fileString));
+    }
+    void setSourceText(const std::string& text) { sourceText = text; }
     void addSourceExtension(const char* ext) { sourceExtensions.push_back(ext); }
+    void addModuleProcessed(const std::string& p) { moduleProcesses.push_back(p.c_str()); }
+    void setEmitOpLines() { emitOpLines = true; }
     void addExtension(const char* ext) { extensions.insert(ext); }
     Id import(const char*);
     void setMemoryModel(spv::AddressingModel addr, spv::MemoryModel mem)
@@ -92,6 +106,12 @@
         return id;
     }
 
+    // Log the current line, and if different than the last one,
+    // issue a new OpLine, using the current file name.
+    void setLine(int line);
+    // Low-level OpLine. See setLine() for a layered helper.
+    void addLine(Id fileName, int line, int column);
+
     // For creating new types (will return old type if the requested one was already made).
     Id makeVoidType();
     Id makeBoolType();
@@ -111,6 +131,9 @@
     Id makeSamplerType();
     Id makeSampledImageType(Id imageType);
 
+    // accelerationStructureNV type
+    Id makeAccelerationStructureNVType();
+
     // For querying about types.
     Id getTypeId(Id resultId) const { return module.getTypeId(resultId); }
     Id getDerefTypeId(Id resultId) const;
@@ -133,7 +156,7 @@
     bool isAggregate(Id resultId)    const { return isAggregateType(getTypeId(resultId)); }
     bool isSampledImage(Id resultId) const { return isSampledImageType(getTypeId(resultId)); }
 
-    bool isBoolType(Id typeId)         const { return groupedTypes[OpTypeBool].size() > 0 && typeId == groupedTypes[OpTypeBool].back()->getResultId(); }
+    bool isBoolType(Id typeId)               { return groupedTypes[OpTypeBool].size() > 0 && typeId == groupedTypes[OpTypeBool].back()->getResultId(); }
     bool isIntType(Id typeId)          const { return getTypeClass(typeId) == OpTypeInt && module.getInstruction(typeId)->getImmediateOperand(1) != 0; }
     bool isUintType(Id typeId)         const { return getTypeClass(typeId) == OpTypeInt && module.getInstruction(typeId)->getImmediateOperand(1) == 0; }
     bool isFloatType(Id typeId)        const { return getTypeClass(typeId) == OpTypeFloat; }
@@ -147,6 +170,7 @@
     bool isImageType(Id typeId)        const { return getTypeClass(typeId) == OpTypeImage; }
     bool isSamplerType(Id typeId)      const { return getTypeClass(typeId) == OpTypeSampler; }
     bool isSampledImageType(Id typeId) const { return getTypeClass(typeId) == OpTypeSampledImage; }
+    bool containsType(Id typeId, Op typeOp, unsigned int width) const;
 
     bool isConstantOpCode(Op opcode) const;
     bool isSpecConstantOpCode(Op opcode) const;
@@ -195,15 +219,18 @@
 
     // For making new constants (will return old constant if the requested one was already made).
     Id makeBoolConstant(bool b, bool specConstant = false);
+    Id makeInt8Constant(int i, bool specConstant = false)        { return makeIntConstant(makeIntType(8),  (unsigned)i, specConstant); }
+    Id makeUint8Constant(unsigned u, bool specConstant = false)  { return makeIntConstant(makeUintType(8),           u, specConstant); }
+    Id makeInt16Constant(int i, bool specConstant = false)       { return makeIntConstant(makeIntType(16),  (unsigned)i, specConstant); }
+    Id makeUint16Constant(unsigned u, bool specConstant = false) { return makeIntConstant(makeUintType(16),           u, specConstant); }
     Id makeIntConstant(int i, bool specConstant = false)         { return makeIntConstant(makeIntType(32),  (unsigned)i, specConstant); }
     Id makeUintConstant(unsigned u, bool specConstant = false)   { return makeIntConstant(makeUintType(32),           u, specConstant); }
     Id makeInt64Constant(long long i, bool specConstant = false)            { return makeInt64Constant(makeIntType(64),  (unsigned long long)i, specConstant); }
     Id makeUint64Constant(unsigned long long u, bool specConstant = false)  { return makeInt64Constant(makeUintType(64),                     u, specConstant); }
     Id makeFloatConstant(float f, bool specConstant = false);
     Id makeDoubleConstant(double d, bool specConstant = false);
-#ifdef AMD_EXTENSIONS
     Id makeFloat16Constant(float f16, bool specConstant = false);
-#endif
+    Id makeFpConstant(Id type, double d, bool specConstant = false);
 
     // Turn the array of constants into a proper spv constant of the requested type.
     Id makeCompositeConstant(Id type, const std::vector<Id>& comps, bool specConst = false);
@@ -213,9 +240,11 @@
     void addExecutionMode(Function*, ExecutionMode mode, int value1 = -1, int value2 = -1, int value3 = -1);
     void addName(Id, const char* name);
     void addMemberName(Id, int member, const char* name);
-    void addLine(Id target, Id fileName, int line, int column);
     void addDecoration(Id, Decoration, int num = -1);
+    void addDecoration(Id, Decoration, const char*);
+    void addDecorationId(Id id, Decoration, Id idDecoration);
     void addMemberDecoration(Id, unsigned int member, Decoration, int num = -1);
+    void addMemberDecoration(Id, unsigned int member, Decoration, const char*);
 
     // At the end of what block do the next create*() instructions go?
     void setBuildPoint(Block* bp) { buildPoint = bp; }
@@ -229,7 +258,7 @@
     // Return the function, pass back the entry.
     // The returned pointer is only valid for the lifetime of this builder.
     Function* makeFunctionEntry(Decoration precision, Id returnType, const char* name, const std::vector<Id>& paramTypes,
-                                const std::vector<Decoration>& precisions, Block **entry = 0);
+                                const std::vector<std::vector<Decoration>>& precisions, Block **entry = 0);
 
     // Create a return. An 'implicit' return is one not appearing in the source
     // code.  In the case of an implicit return, no post-return block is inserted.
@@ -248,10 +277,10 @@
     Id createUndefined(Id type);
 
     // Store into an Id and return the l-value
-    void createStore(Id rValue, Id lValue);
+    void createStore(Id rValue, Id lValue, spv::MemoryAccessMask memoryAccess = spv::MemoryAccessMaskNone, spv::Scope scope = spv::ScopeMax);
 
     // Load from an Id and return it
-    Id createLoad(Id lValue);
+    Id createLoad(Id lValue, spv::MemoryAccessMask memoryAccess = spv::MemoryAccessMaskNone, spv::Scope scope = spv::ScopeMax);
 
     // Create an OpAccessChain instruction
     Id createAccessChain(StorageClass, Id base, const std::vector<Id>& offsets);
@@ -271,12 +300,14 @@
     void createNoResultOp(Op);
     void createNoResultOp(Op, Id operand);
     void createNoResultOp(Op, const std::vector<Id>& operands);
+    void createNoResultOp(Op, const std::vector<IdImmediate>& operands);
     void createControlBarrier(Scope execution, Scope memory, MemorySemanticsMask);
     void createMemoryBarrier(unsigned executionScope, unsigned memorySemantics);
     Id createUnaryOp(Op, Id typeId, Id operand);
     Id createBinOp(Op, Id typeId, Id operand1, Id operand2);
     Id createTriOp(Op, Id typeId, Id operand1, Id operand2, Id operand3);
     Id createOp(Op, Id typeId, const std::vector<Id>& operands);
+    Id createOp(Op, Id typeId, const std::vector<IdImmediate>& operands);
     Id createFunctionCall(spv::Function*, const std::vector<spv::Id>&);
     Id createSpecConstantOp(Op, Id typeId, const std::vector<spv::Id>& operands, const std::vector<unsigned>& literals);
 
@@ -311,7 +342,7 @@
     // Generally, the type of 'scalar' does not need to be the same type as the components in 'vector'.
     // The type of the created vector is a vector of components of the same type as the scalar.
     //
-    // Note: One of the arguments will change, with the result coming back that way rather than 
+    // Note: One of the arguments will change, with the result coming back that way rather than
     // through the return value.
     void promoteScalar(Decoration precision, Id& left, Id& right);
 
@@ -338,6 +369,10 @@
         Id component;
         Id texelOut;
         Id lodClamp;
+        Id granularity;
+        Id coarse;
+        bool nonprivate;
+        bool volatil;
     };
 
     // Select the correct texture operation based on all inputs, and emit the correct instruction
@@ -367,7 +402,7 @@
     // Helper to use for building nested control flow with if-then-else.
     class If {
     public:
-        If(Id condition, Builder& builder);
+        If(Id condition, unsigned int ctrl, Builder& builder);
         ~If() {}
 
         void makeBeginElse();
@@ -379,6 +414,7 @@
 
         Builder& builder;
         Id condition;
+        unsigned int control;
         Function* function;
         Block* headerBlock;
         Block* thenBlock;
@@ -398,7 +434,7 @@
     // Returns the right set of basic blocks to start each code segment with, so that the caller's
     // recursion stack can hold the memory for it.
     //
-    void makeSwitch(Id condition, int numSegments, const std::vector<int>& caseValues,
+    void makeSwitch(Id condition, unsigned int control, int numSegments, const std::vector<int>& caseValues,
                     const std::vector<int>& valueToSegment, int defaultSegment, std::vector<Block*>& segmentBB); // return argument
 
     // Add a branch to the innermost switch's merge block.
@@ -476,6 +512,43 @@
         Id component;                  // a dynamic component index, can coexist with a swizzle, done after the swizzle, NoResult if not present
         Id preSwizzleBaseType;         // dereferenced type, before swizzle or component is applied; NoType unless a swizzle or component is present
         bool isRValue;                 // true if 'base' is an r-value, otherwise, base is an l-value
+
+        // Accumulate whether anything in the chain of structures has coherent decorations.
+        struct CoherentFlags {
+            unsigned coherent : 1;
+            unsigned devicecoherent : 1;
+            unsigned queuefamilycoherent : 1;
+            unsigned workgroupcoherent : 1;
+            unsigned subgroupcoherent : 1;
+            unsigned nonprivate : 1;
+            unsigned volatil : 1;
+            unsigned isImage : 1;
+
+            void clear() {
+                coherent = 0;
+                devicecoherent = 0;
+                queuefamilycoherent = 0;
+                workgroupcoherent = 0;
+                subgroupcoherent = 0;
+                nonprivate = 0;
+                volatil = 0;
+                isImage = 0;
+            }
+
+            CoherentFlags() { clear(); }
+            CoherentFlags operator |=(const CoherentFlags &other) {
+                coherent |= other.coherent;
+                devicecoherent |= other.devicecoherent;
+                queuefamilycoherent |= other.queuefamilycoherent;
+                workgroupcoherent |= other.workgroupcoherent;
+                subgroupcoherent |= other.subgroupcoherent;
+                nonprivate |= other.nonprivate;
+                volatil |= other.volatil;
+                isImage |= other.isImage;
+                return *this;
+            }
+        };
+        CoherentFlags coherentFlags;
     };
 
     //
@@ -505,27 +578,31 @@
     }
 
     // push offset onto the end of the chain
-    void accessChainPush(Id offset)
+    void accessChainPush(Id offset, AccessChain::CoherentFlags coherentFlags)
     {
         accessChain.indexChain.push_back(offset);
+        accessChain.coherentFlags |= coherentFlags;
     }
 
     // push new swizzle onto the end of any existing swizzle, merging into a single swizzle
     void accessChainPushSwizzle(std::vector<unsigned>& swizzle, Id preSwizzleBaseType);
 
-    // push a variable component selection onto the access chain; supporting only one, so unsided
+    // push a dynamic component selection onto the access chain, only applicable with a
+    // non-trivial swizzle or no swizzle
     void accessChainPushComponent(Id component, Id preSwizzleBaseType)
     {
-        accessChain.component = component;
-        if (accessChain.preSwizzleBaseType == NoType)
-            accessChain.preSwizzleBaseType = preSwizzleBaseType;
+        if (accessChain.swizzle.size() != 1) {
+            accessChain.component = component;
+            if (accessChain.preSwizzleBaseType == NoType)
+                accessChain.preSwizzleBaseType = preSwizzleBaseType;
+        }
     }
 
     // use accessChain and swizzle to store value
-    void accessChainStore(Id rvalue);
+    void accessChainStore(Id rvalue, spv::MemoryAccessMask memoryAccess = spv::MemoryAccessMaskNone, spv::Scope scope = spv::ScopeMax);
 
     // use accessChain and swizzle to load an r-value
-    Id accessChainLoad(Decoration precision, Id ResultType);
+    Id accessChainLoad(Decoration precision, Decoration nonUniform, Id ResultType, spv::MemoryAccessMask memoryAccess = spv::MemoryAccessMaskNone, spv::Scope scope = spv::ScopeMax);
 
     // get the direct pointer for an l-value
     Id accessChainGetLValue();
@@ -534,14 +611,22 @@
     // based on the type of the base and the chain of dereferences.
     Id accessChainGetInferredType();
 
-    // Remove OpDecorate instructions whose operands are defined in unreachable
-    // blocks.
-    void eliminateDeadDecorations();
+    // Add capabilities, extensions, remove unneeded decorations, etc., 
+    // based on the resulting SPIR-V.
+    void postProcess();
+
+    // Hook to visit each instruction in a block in a function
+    void postProcess(const Instruction&);
+    // Hook to visit each instruction in a reachable block in a function.
+    void postProcessReachable(const Instruction&);
+    // Hook to visit each non-32-bit sized float/int operation in a block.
+    void postProcessType(const Instruction&, spv::Id typeId);
+
     void dump(std::vector<unsigned int>&) const;
 
     void createBranch(Block* block);
     void createConditionalBranch(Id condition, Block* thenBlock, Block* elseBlock);
-    void createLoopMerge(Block* mergeBlock, Block* continueBlock, unsigned int control);
+    void createLoopMerge(Block* mergeBlock, Block* continueBlock, unsigned int control, unsigned int dependencyLength);
 
     // Sets to generate opcode for specialization constants.
     void setToSpecConstCodeGenMode() { generatingOpCodeForSpecConst = true; }
@@ -553,20 +638,30 @@
  protected:
     Id makeIntConstant(Id typeId, unsigned value, bool specConstant);
     Id makeInt64Constant(Id typeId, unsigned long long value, bool specConstant);
-    Id findScalarConstant(Op typeClass, Op opcode, Id typeId, unsigned value) const;
-    Id findScalarConstant(Op typeClass, Op opcode, Id typeId, unsigned v1, unsigned v2) const;
-    Id findCompositeConstant(Op typeClass, const std::vector<Id>& comps) const;
+    Id findScalarConstant(Op typeClass, Op opcode, Id typeId, unsigned value);
+    Id findScalarConstant(Op typeClass, Op opcode, Id typeId, unsigned v1, unsigned v2);
+    Id findCompositeConstant(Op typeClass, const std::vector<Id>& comps);
+    Id findStructConstant(Id typeId, const std::vector<Id>& comps);
     Id collapseAccessChain();
+    void remapDynamicSwizzle();
     void transferAccessChainSwizzle(bool dynamic);
     void simplifyAccessChainSwizzle();
     void createAndSetNoPredecessorBlock(const char*);
     void createSelectionMerge(Block* mergeBlock, unsigned int control);
+    void dumpSourceInstructions(std::vector<unsigned int>&) const;
     void dumpInstructions(std::vector<unsigned int>&, const std::vector<std::unique_ptr<Instruction> >&) const;
+    void dumpModuleProcesses(std::vector<unsigned int>&) const;
 
+    unsigned int spvVersion;     // the version of SPIR-V to emit in the header
     SourceLanguage source;
     int sourceVersion;
+    spv::Id sourceFileStringId;
+    std::string sourceText;
+    int currentLine;
+    bool emitOpLines;
     std::set<std::string> extensions;
     std::vector<const char*> sourceExtensions;
+    std::vector<const char*> moduleProcesses;
     AddressingModel addressModel;
     MemoryModel memoryModel;
     std::set<spv::Capability> capabilities;
@@ -579,19 +674,20 @@
     AccessChain accessChain;
 
     // special blocks of instructions for output
+    std::vector<std::unique_ptr<Instruction> > strings;
     std::vector<std::unique_ptr<Instruction> > imports;
     std::vector<std::unique_ptr<Instruction> > entryPoints;
     std::vector<std::unique_ptr<Instruction> > executionModes;
     std::vector<std::unique_ptr<Instruction> > names;
-    std::vector<std::unique_ptr<Instruction> > lines;
     std::vector<std::unique_ptr<Instruction> > decorations;
     std::vector<std::unique_ptr<Instruction> > constantsTypesGlobals;
     std::vector<std::unique_ptr<Instruction> > externals;
     std::vector<std::unique_ptr<Function> > functions;
 
      // not output, internally used for quick & dirty canonical (unique) creation
-    std::vector<Instruction*> groupedConstants[OpConstant];  // all types appear before OpConstant
-    std::vector<Instruction*> groupedTypes[OpConstant];
+    std::unordered_map<unsigned int, std::vector<Instruction*>> groupedConstants;       // map type opcodes to constant inst.
+    std::unordered_map<unsigned int, std::vector<Instruction*>> groupedStructConstants; // map struct-id to constant instructions
+    std::unordered_map<unsigned int, std::vector<Instruction*>> groupedTypes;           // map type opcodes to type instructions
 
     // stack of switches
     std::stack<Block*> switchMerges;
@@ -599,7 +695,7 @@
     // Our loop stack.
     std::stack<LoopBlocks> loops;
 
-    // The stream for outputing warnings and errors.
+    // The stream for outputting warnings and errors.
     SpvBuildLogger* logger;
 };  // end Builder class
 
diff --git a/SPIRV/SpvPostProcess.cpp b/SPIRV/SpvPostProcess.cpp
new file mode 100755
index 0000000..5eaedaf
--- /dev/null
+++ b/SPIRV/SpvPostProcess.cpp
@@ -0,0 +1,265 @@
+//
+// Copyright (C) 2016-2018 Google, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+//
+//    Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//    Redistributions in binary form must reproduce the above
+//    copyright notice, this list of conditions and the following
+//    disclaimer in the documentation and/or other materials provided
+//    with the distribution.
+//
+//    Neither the name of 3Dlabs Inc. Ltd. nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+// POSSIBILITY OF SUCH DAMAGE.
+
+//
+// Post-processing for SPIR-V IR, in internal form, not standard binary form.
+//
+
+#include <cassert>
+#include <cstdlib>
+
+#include <unordered_set>
+#include <algorithm>
+
+#include "SpvBuilder.h"
+
+#include "spirv.hpp"
+#include "GlslangToSpv.h"
+#include "SpvBuilder.h"
+namespace spv {
+    #include "GLSL.std.450.h"
+    #include "GLSL.ext.KHR.h"
+    #include "GLSL.ext.EXT.h"
+#ifdef AMD_EXTENSIONS
+    #include "GLSL.ext.AMD.h"
+#endif
+#ifdef NV_EXTENSIONS
+    #include "GLSL.ext.NV.h"
+#endif
+}
+
+namespace spv {
+
+// Hook to visit each operand type and result type of an instruction.
+// Will be called multiple times for one instruction, once for each typed
+// operand and the result.
+void Builder::postProcessType(const Instruction& inst, Id typeId)
+{
+    // Characterize the type being questioned
+    Id basicTypeOp = getMostBasicTypeClass(typeId);
+    int width = 0;
+    if (basicTypeOp == OpTypeFloat || basicTypeOp == OpTypeInt)
+        width = getScalarTypeWidth(typeId);
+
+    // Do opcode-specific checks
+    switch (inst.getOpCode()) {
+    case OpLoad:
+    case OpStore:
+        if (basicTypeOp == OpTypeStruct) {
+            if (containsType(typeId, OpTypeInt, 8))
+                addCapability(CapabilityInt8);
+            if (containsType(typeId, OpTypeInt, 16))
+                addCapability(CapabilityInt16);
+            if (containsType(typeId, OpTypeFloat, 16))
+                addCapability(CapabilityFloat16);
+        } else {
+            StorageClass storageClass = getStorageClass(inst.getIdOperand(0));
+            if (width == 8) {
+                switch (storageClass) {
+                case StorageClassUniform:
+                case StorageClassStorageBuffer:
+                case StorageClassPushConstant:
+                    break;
+                default:
+                    addCapability(CapabilityInt8);
+                    break;
+                }
+            } else if (width == 16) {
+                switch (storageClass) {
+                case StorageClassUniform:
+                case StorageClassStorageBuffer:
+                case StorageClassPushConstant:
+                case StorageClassInput:
+                case StorageClassOutput:
+                    break;
+                default:
+                    if (basicTypeOp == OpTypeInt)
+                        addCapability(CapabilityInt16);
+                    if (basicTypeOp == OpTypeFloat)
+                        addCapability(CapabilityFloat16);
+                    break;
+                }
+            }
+        }
+        break;
+    case OpAccessChain:
+    case OpPtrAccessChain:
+    case OpCopyObject:
+    case OpFConvert:
+    case OpSConvert:
+    case OpUConvert:
+        break;
+    case OpExtInst:
+#if AMD_EXTENSIONS
+        switch (inst.getImmediateOperand(1)) {
+        case GLSLstd450Frexp:
+        case GLSLstd450FrexpStruct:
+            if (getSpvVersion() < glslang::EShTargetSpv_1_3 && containsType(typeId, OpTypeInt, 16))
+                addExtension(spv::E_SPV_AMD_gpu_shader_int16);
+            break;
+        case GLSLstd450InterpolateAtCentroid:
+        case GLSLstd450InterpolateAtSample:
+        case GLSLstd450InterpolateAtOffset:
+            if (getSpvVersion() < glslang::EShTargetSpv_1_3 && containsType(typeId, OpTypeFloat, 16))
+                addExtension(spv::E_SPV_AMD_gpu_shader_half_float);
+            break;
+        default:
+            break;
+        }
+#endif
+        break;
+    default:
+        if (basicTypeOp == OpTypeFloat && width == 16)
+            addCapability(CapabilityFloat16);
+        if (basicTypeOp == OpTypeInt && width == 16)
+            addCapability(CapabilityInt16);
+        if (basicTypeOp == OpTypeInt && width == 8)
+            addCapability(CapabilityInt8);
+        break;
+    }
+}
+
+// Called for each instruction that resides in a block.
+void Builder::postProcess(const Instruction& inst)
+{
+    // Add capabilities based simply on the opcode.
+    switch (inst.getOpCode()) {
+    case OpExtInst:
+        switch (inst.getImmediateOperand(1)) {
+        case GLSLstd450InterpolateAtCentroid:
+        case GLSLstd450InterpolateAtSample:
+        case GLSLstd450InterpolateAtOffset:
+            addCapability(CapabilityInterpolationFunction);
+            break;
+        default:
+            break;
+        }
+        break;
+    case OpDPdxFine:
+    case OpDPdyFine:
+    case OpFwidthFine:
+    case OpDPdxCoarse:
+    case OpDPdyCoarse:
+    case OpFwidthCoarse:
+        addCapability(CapabilityDerivativeControl);
+        break;
+
+    case OpImageQueryLod:
+    case OpImageQuerySize:
+    case OpImageQuerySizeLod:
+    case OpImageQuerySamples:
+    case OpImageQueryLevels:
+        addCapability(CapabilityImageQuery);
+        break;
+
+#ifdef NV_EXTENSIONS
+    case OpGroupNonUniformPartitionNV:
+        addExtension(E_SPV_NV_shader_subgroup_partitioned);
+        addCapability(CapabilityGroupNonUniformPartitionedNV);
+        break;
+#endif
+
+    default:
+        break;
+    }
+
+    // Checks based on type
+    if (inst.getTypeId() != NoType)
+        postProcessType(inst, inst.getTypeId());
+    for (int op = 0; op < inst.getNumOperands(); ++op) {
+        if (inst.isIdOperand(op)) {
+            // In blocks, these are always result ids, but we are relying on
+            // getTypeId() to return NoType for things like OpLabel.
+            if (getTypeId(inst.getIdOperand(op)) != NoType)
+                postProcessType(inst, getTypeId(inst.getIdOperand(op)));
+        }
+    }
+}
+
+// Called for each instruction in a reachable block.
+void Builder::postProcessReachable(const Instruction&)
+{
+    // did have code here, but questionable to do so without deleting the instructions
+}
+
+// comment in header
+void Builder::postProcess()
+{
+    std::unordered_set<const Block*> reachableBlocks;
+    std::unordered_set<Id> unreachableDefinitions;
+    // Collect IDs defined in unreachable blocks. For each function, label the
+    // reachable blocks first. Then for each unreachable block, collect the
+    // result IDs of the instructions in it.
+    for (auto fi = module.getFunctions().cbegin(); fi != module.getFunctions().cend(); fi++) {
+        Function* f = *fi;
+        Block* entry = f->getEntryBlock();
+        inReadableOrder(entry, [&reachableBlocks](const Block* b) { reachableBlocks.insert(b); });
+        for (auto bi = f->getBlocks().cbegin(); bi != f->getBlocks().cend(); bi++) {
+            Block* b = *bi;
+            if (reachableBlocks.count(b) == 0) {
+                for (auto ii = b->getInstructions().cbegin(); ii != b->getInstructions().cend(); ii++)
+                    unreachableDefinitions.insert(ii->get()->getResultId());
+            }
+        }
+    }
+
+    // Remove unneeded decorations, for unreachable instructions
+    decorations.erase(std::remove_if(decorations.begin(), decorations.end(),
+        [&unreachableDefinitions](std::unique_ptr<Instruction>& I) -> bool {
+            Id decoration_id = I.get()->getIdOperand(0);
+            return unreachableDefinitions.count(decoration_id) != 0;
+        }),
+        decorations.end());
+
+    // Add per-instruction capabilities, extensions, etc.,
+
+    // process all reachable instructions...
+    for (auto bi = reachableBlocks.cbegin(); bi != reachableBlocks.cend(); ++bi) {
+        const Block* block = *bi;
+        const auto function = [this](const std::unique_ptr<Instruction>& inst) { postProcessReachable(*inst.get()); };
+        std::for_each(block->getInstructions().begin(), block->getInstructions().end(), function);
+    }
+
+    // process all block-contained instructions
+    for (auto fi = module.getFunctions().cbegin(); fi != module.getFunctions().cend(); fi++) {
+        Function* f = *fi;
+        for (auto bi = f->getBlocks().cbegin(); bi != f->getBlocks().cend(); bi++) {
+            Block* b = *bi;
+            for (auto ii = b->getInstructions().cbegin(); ii != b->getInstructions().cend(); ii++)
+                postProcess(*ii->get());
+        }
+    }
+}
+
+}; // end spv namespace
diff --git a/SPIRV/SpvTools.cpp b/SPIRV/SpvTools.cpp
new file mode 100755
index 0000000..a886b16
--- /dev/null
+++ b/SPIRV/SpvTools.cpp
@@ -0,0 +1,189 @@
+//
+// Copyright (C) 2014-2016 LunarG, Inc.
+// Copyright (C) 2018 Google, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+//
+//    Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//    Redistributions in binary form must reproduce the above
+//    copyright notice, this list of conditions and the following
+//    disclaimer in the documentation and/or other materials provided
+//    with the distribution.
+//
+//    Neither the name of 3Dlabs Inc. Ltd. nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+// POSSIBILITY OF SUCH DAMAGE.
+
+//
+// Call into SPIRV-Tools to disassemble, validate, and optimize.
+//
+
+#if ENABLE_OPT
+
+#include <cstdio>
+#include <iostream>
+
+#include "SpvTools.h"
+#include "spirv-tools/optimizer.hpp"
+#include "spirv-tools/libspirv.h"
+
+namespace glslang {
+
+// Translate glslang's view of target versioning to what SPIRV-Tools uses.
+spv_target_env MapToSpirvToolsEnv(const SpvVersion& spvVersion, spv::SpvBuildLogger* logger)
+{
+    switch (spvVersion.vulkan) {
+    case glslang::EShTargetVulkan_1_0: return spv_target_env::SPV_ENV_VULKAN_1_0;
+    case glslang::EShTargetVulkan_1_1: return spv_target_env::SPV_ENV_VULKAN_1_1;
+    default:
+        break;
+    }
+
+    if (spvVersion.openGl > 0)
+        return spv_target_env::SPV_ENV_OPENGL_4_5;
+
+    logger->missingFunctionality("Target version for SPIRV-Tools validator");
+    return spv_target_env::SPV_ENV_UNIVERSAL_1_0;
+}
+
+
+// Use the SPIRV-Tools disassembler to print SPIR-V.
+void SpirvToolsDisassemble(std::ostream& out, const std::vector<unsigned int>& spirv)
+{
+    // disassemble
+    spv_context context = spvContextCreate(SPV_ENV_UNIVERSAL_1_3);
+    spv_text text;
+    spv_diagnostic diagnostic = nullptr;
+    spvBinaryToText(context, spirv.data(), spirv.size(),
+        SPV_BINARY_TO_TEXT_OPTION_FRIENDLY_NAMES | SPV_BINARY_TO_TEXT_OPTION_INDENT,
+        &text, &diagnostic);
+
+    // dump
+    if (diagnostic == nullptr)
+        out << text->str;
+    else
+        spvDiagnosticPrint(diagnostic);
+
+    // teardown
+    spvDiagnosticDestroy(diagnostic);
+    spvContextDestroy(context);
+}
+
+// Apply the SPIRV-Tools validator to generated SPIR-V.
+void SpirvToolsValidate(const glslang::TIntermediate& intermediate, std::vector<unsigned int>& spirv,
+                        spv::SpvBuildLogger* logger)
+{
+    // validate
+    spv_context context = spvContextCreate(MapToSpirvToolsEnv(intermediate.getSpv(), logger));
+    spv_const_binary_t binary = { spirv.data(), spirv.size() };
+    spv_diagnostic diagnostic = nullptr;
+    spv_validator_options options = spvValidatorOptionsCreate();
+    spvValidatorOptionsSetRelaxBlockLayout(options, intermediate.usingHlslOffsets());
+    spvValidateWithOptions(context, options, &binary, &diagnostic);
+
+    // report
+    if (diagnostic != nullptr) {
+        logger->error("SPIRV-Tools Validation Errors");
+        logger->error(diagnostic->error);
+    }
+
+    // tear down
+    spvValidatorOptionsDestroy(options);
+    spvDiagnosticDestroy(diagnostic);
+    spvContextDestroy(context);
+}
+
+// Apply the SPIRV-Tools optimizer to generated SPIR-V, for the purpose of
+// legalizing HLSL SPIR-V.
+void SpirvToolsLegalize(const glslang::TIntermediate&, std::vector<unsigned int>& spirv,
+                        spv::SpvBuildLogger*, const SpvOptions* options)
+{
+    spv_target_env target_env = SPV_ENV_UNIVERSAL_1_2;
+
+    spvtools::Optimizer optimizer(target_env);
+    optimizer.SetMessageConsumer(
+        [](spv_message_level_t level, const char *source, const spv_position_t &position, const char *message) {
+            auto &out = std::cerr;
+            switch (level)
+            {
+            case SPV_MSG_FATAL:
+            case SPV_MSG_INTERNAL_ERROR:
+            case SPV_MSG_ERROR:
+                out << "error: ";
+                break;
+            case SPV_MSG_WARNING:
+                out << "warning: ";
+                break;
+            case SPV_MSG_INFO:
+            case SPV_MSG_DEBUG:
+                out << "info: ";
+                break;
+            default:
+                break;
+            }
+            if (source)
+            {
+                out << source << ":";
+            }
+            out << position.line << ":" << position.column << ":" << position.index << ":";
+            if (message)
+            {
+                out << " " << message;
+            }
+            out << std::endl;
+        });
+
+    optimizer.RegisterPass(spvtools::CreateDeadBranchElimPass());
+    optimizer.RegisterPass(spvtools::CreateMergeReturnPass());
+    optimizer.RegisterPass(spvtools::CreateInlineExhaustivePass());
+    optimizer.RegisterPass(spvtools::CreateEliminateDeadFunctionsPass());
+    optimizer.RegisterPass(spvtools::CreateScalarReplacementPass());
+    optimizer.RegisterPass(spvtools::CreateLocalAccessChainConvertPass());
+    optimizer.RegisterPass(spvtools::CreateLocalSingleBlockLoadStoreElimPass());
+    optimizer.RegisterPass(spvtools::CreateLocalSingleStoreElimPass());
+    optimizer.RegisterPass(spvtools::CreateSimplificationPass());
+    optimizer.RegisterPass(spvtools::CreateAggressiveDCEPass());
+    optimizer.RegisterPass(spvtools::CreateVectorDCEPass());
+    optimizer.RegisterPass(spvtools::CreateDeadInsertElimPass());
+    optimizer.RegisterPass(spvtools::CreateAggressiveDCEPass());
+    optimizer.RegisterPass(spvtools::CreateDeadBranchElimPass());
+    optimizer.RegisterPass(spvtools::CreateBlockMergePass());
+    optimizer.RegisterPass(spvtools::CreateLocalMultiStoreElimPass());
+    optimizer.RegisterPass(spvtools::CreateIfConversionPass());
+    optimizer.RegisterPass(spvtools::CreateSimplificationPass());
+    optimizer.RegisterPass(spvtools::CreateAggressiveDCEPass());
+    optimizer.RegisterPass(spvtools::CreateVectorDCEPass());
+    optimizer.RegisterPass(spvtools::CreateDeadInsertElimPass());
+    if (options->optimizeSize) {
+        optimizer.RegisterPass(spvtools::CreateRedundancyEliminationPass());
+        // TODO(greg-lunarg): Add this when AMD driver issues are resolved
+        // optimizer.RegisterPass(CreateCommonUniformElimPass());
+    }
+    optimizer.RegisterPass(spvtools::CreateAggressiveDCEPass());
+    optimizer.RegisterPass(spvtools::CreateCFGCleanupPass());
+
+    optimizer.Run(spirv.data(), spirv.size(), &spirv);
+}
+
+}; // end namespace glslang
+
+#endif
diff --git a/SPIRV/SpvTools.h b/SPIRV/SpvTools.h
new file mode 100755
index 0000000..08bcf3a
--- /dev/null
+++ b/SPIRV/SpvTools.h
@@ -0,0 +1,80 @@
+//
+// Copyright (C) 2014-2016 LunarG, Inc.
+// Copyright (C) 2018 Google, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+//
+//    Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//    Redistributions in binary form must reproduce the above
+//    copyright notice, this list of conditions and the following
+//    disclaimer in the documentation and/or other materials provided
+//    with the distribution.
+//
+//    Neither the name of 3Dlabs Inc. Ltd. nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+// POSSIBILITY OF SUCH DAMAGE.
+
+//
+// Call into SPIRV-Tools to disassemble, validate, and optimize.
+//
+
+#pragma once
+#ifndef GLSLANG_SPV_TOOLS_H
+#define GLSLANG_SPV_TOOLS_H
+
+#include <vector>
+#include <ostream>
+
+#include "../glslang/MachineIndependent/localintermediate.h"
+#include "Logger.h"
+
+namespace glslang {
+
+struct SpvOptions {
+    SpvOptions() : generateDebugInfo(false), disableOptimizer(true),
+        optimizeSize(false), disassemble(false), validate(false) { }
+    bool generateDebugInfo;
+    bool disableOptimizer;
+    bool optimizeSize;
+    bool disassemble;
+    bool validate;
+};
+
+#if ENABLE_OPT
+
+// Use the SPIRV-Tools disassembler to print SPIR-V.
+void SpirvToolsDisassemble(std::ostream& out, const std::vector<unsigned int>& spirv);
+
+// Apply the SPIRV-Tools validator to generated SPIR-V.
+void SpirvToolsValidate(const glslang::TIntermediate& intermediate, std::vector<unsigned int>& spirv,
+                        spv::SpvBuildLogger*);
+
+// Apply the SPIRV-Tools optimizer to generated SPIR-V, for the purpose of
+// legalizing HLSL SPIR-V.
+void SpirvToolsLegalize(const glslang::TIntermediate& intermediate, std::vector<unsigned int>& spirv,
+                        spv::SpvBuildLogger*, const SpvOptions*);
+
+#endif
+
+}; // end namespace glslang
+
+#endif // GLSLANG_SPV_TOOLS_H
\ No newline at end of file
diff --git a/SPIRV/bitutils.h b/SPIRV/bitutils.h
index 31288ab..22e44ce 100644
--- a/SPIRV/bitutils.h
+++ b/SPIRV/bitutils.h
@@ -26,7 +26,7 @@
   Dest dest;
   static_assert(sizeof(source) == sizeof(dest),
                 "BitwiseCast: Source and destination must have the same size");
-  std::memcpy(&dest, &source, sizeof(dest));
+  std::memcpy(static_cast<void*>(&dest), &source, sizeof(dest));
   return dest;
 }
 
diff --git a/SPIRV/disassemble.cpp b/SPIRV/disassemble.cpp
index c950a66..22c83ea 100644
--- a/SPIRV/disassemble.cpp
+++ b/SPIRV/disassemble.cpp
@@ -46,6 +46,7 @@
 
 #include "disassemble.h"
 #include "doc.h"
+#include "SpvTools.h"
 
 namespace spv {
     extern "C" {
@@ -54,6 +55,7 @@
 #ifdef AMD_EXTENSIONS
         #include "GLSL.ext.AMD.h"
 #endif
+
 #ifdef NV_EXTENSIONS
         #include "GLSL.ext.NV.h"
 #endif
@@ -80,12 +82,15 @@
 // used to identify the extended instruction library imported when printing
 enum ExtInstSet {
     GLSL450Inst,
+
 #ifdef AMD_EXTENSIONS
     GLSLextAMDInst,
 #endif
+
 #ifdef NV_EXTENSIONS
     GLSLextNVInst,
 #endif
+
     OpenCLExtInst,
 };
 
@@ -349,10 +354,21 @@
         if (resultId != 0 && idDescriptor[resultId].size() == 0) {
             switch (opCode) {
             case OpTypeInt:
-                idDescriptor[resultId] = "int";
+                switch (stream[word]) {
+                case 8:  idDescriptor[resultId] = "int8_t"; break;
+                case 16: idDescriptor[resultId] = "int16_t"; break;
+                default: assert(0); // fallthrough
+                case 32: idDescriptor[resultId] = "int"; break;
+                case 64: idDescriptor[resultId] = "int64_t"; break;
+                }
                 break;
             case OpTypeFloat:
-                idDescriptor[resultId] = "float";
+                switch (stream[word]) {
+                case 16: idDescriptor[resultId] = "float16_t"; break;
+                default: assert(0); // fallthrough
+                case 32: idDescriptor[resultId] = "float"; break;
+                case 64: idDescriptor[resultId] = "float64_t"; break;
+                }
                 break;
             case OpTypeBool:
                 idDescriptor[resultId] = "bool";
@@ -364,8 +380,18 @@
                 idDescriptor[resultId] = "ptr";
                 break;
             case OpTypeVector:
-                if (idDescriptor[stream[word]].size() > 0)
+                if (idDescriptor[stream[word]].size() > 0) {
                     idDescriptor[resultId].append(idDescriptor[stream[word]].begin(), idDescriptor[stream[word]].begin() + 1);
+                    if (strstr(idDescriptor[stream[word]].c_str(), "8")) {
+                        idDescriptor[resultId].append("8");
+                    }
+                    if (strstr(idDescriptor[stream[word]].c_str(), "16")) {
+                        idDescriptor[resultId].append("16");
+                    }
+                    if (strstr(idDescriptor[stream[word]].c_str(), "64")) {
+                        idDescriptor[resultId].append("64");
+                    }
+                }
                 idDescriptor[resultId].append("vec");
                 switch (stream[word + 1]) {
                 case 2:   idDescriptor[resultId].append("2");   break;
@@ -484,7 +510,9 @@
                 }else if (strcmp(spv::E_SPV_NV_sample_mask_override_coverage, name) == 0 ||
                           strcmp(spv::E_SPV_NV_geometry_shader_passthrough, name) == 0 ||
                           strcmp(spv::E_SPV_NV_viewport_array2, name) == 0 ||
-                          strcmp(spv::E_SPV_NVX_multiview_per_view_attributes, name) == 0) {
+                          strcmp(spv::E_SPV_NVX_multiview_per_view_attributes, name) == 0 || 
+                          strcmp(spv::E_SPV_NV_fragment_shader_barycentric, name) == 0 ||
+                          strcmp(spv::E_SPV_NV_mesh_shader, name) == 0) {
                     extInstSet = GLSLextNVInst;
 #endif
                 }
@@ -509,6 +537,11 @@
         case OperandLiteralString:
             numOperands -= disassembleString();
             break;
+        case OperandMemoryAccess:
+            outputMask(OperandMemoryAccess, stream[word++]);
+            --numOperands;
+            disassembleIds(numOperands);
+            return;
         default:
             assert(operandClass >= OperandSource && operandClass < OperandOpcode);
 
@@ -653,7 +686,6 @@
 }
 #endif
 
-
 #ifdef NV_EXTENSIONS
 static const char* GLSLextNVGetDebugNames(const char* name, unsigned entrypoint)
 {
@@ -661,21 +693,45 @@
         strcmp(name, spv::E_SPV_NV_geometry_shader_passthrough) == 0 ||
         strcmp(name, spv::E_ARB_shader_viewport_layer_array) == 0 ||
         strcmp(name, spv::E_SPV_NV_viewport_array2) == 0 ||
-        strcmp(spv::E_SPV_NVX_multiview_per_view_attributes, name) == 0) {
+        strcmp(spv::E_SPV_NVX_multiview_per_view_attributes, name) == 0 ||
+        strcmp(spv::E_SPV_NV_fragment_shader_barycentric, name) == 0 ||
+        strcmp(name, spv::E_SPV_NV_mesh_shader) == 0) {
         switch (entrypoint) {
-        case DecorationOverrideCoverageNV:          return "OverrideCoverageNV";
-        case DecorationPassthroughNV:               return "PassthroughNV";
-        case CapabilityGeometryShaderPassthroughNV: return "GeometryShaderPassthroughNV";
-        case DecorationViewportRelativeNV:          return "ViewportRelativeNV";
+        // NV builtins
         case BuiltInViewportMaskNV:                 return "ViewportMaskNV";
-        case CapabilityShaderViewportMaskNV:        return "ShaderViewportMaskNV";
-        case DecorationSecondaryViewportRelativeNV: return "SecondaryViewportRelativeNV";
         case BuiltInSecondaryPositionNV:            return "SecondaryPositionNV";
         case BuiltInSecondaryViewportMaskNV:        return "SecondaryViewportMaskNV";
-        case CapabilityShaderStereoViewNV:          return "ShaderStereoViewNV";
         case BuiltInPositionPerViewNV:              return "PositionPerViewNV";
         case BuiltInViewportMaskPerViewNV:          return "ViewportMaskPerViewNV";
+        case BuiltInBaryCoordNV:                    return "BaryCoordNV";
+        case BuiltInBaryCoordNoPerspNV:             return "BaryCoordNoPerspNV";
+        case BuiltInTaskCountNV:                    return "TaskCountNV";
+        case BuiltInPrimitiveCountNV:               return "PrimitiveCountNV";
+        case BuiltInPrimitiveIndicesNV:             return "PrimitiveIndicesNV";
+        case BuiltInClipDistancePerViewNV:          return "ClipDistancePerViewNV";
+        case BuiltInCullDistancePerViewNV:          return "CullDistancePerViewNV";
+        case BuiltInLayerPerViewNV:                 return "LayerPerViewNV";
+        case BuiltInMeshViewCountNV:                return "MeshViewCountNV";
+        case BuiltInMeshViewIndicesNV:              return "MeshViewIndicesNV";
+
+        // NV Capabilities
+        case CapabilityGeometryShaderPassthroughNV: return "GeometryShaderPassthroughNV";
+        case CapabilityShaderViewportMaskNV:        return "ShaderViewportMaskNV";
+        case CapabilityShaderStereoViewNV:          return "ShaderStereoViewNV";
         case CapabilityPerViewAttributesNV:         return "PerViewAttributesNV";
+        case CapabilityFragmentBarycentricNV:       return "FragmentBarycentricNV";
+        case CapabilityMeshShadingNV:               return "MeshShadingNV";
+
+        // NV Decorations
+        case DecorationOverrideCoverageNV:          return "OverrideCoverageNV";
+        case DecorationPassthroughNV:               return "PassthroughNV";
+        case DecorationViewportRelativeNV:          return "ViewportRelativeNV";
+        case DecorationSecondaryViewportRelativeNV: return "SecondaryViewportRelativeNV";
+        case DecorationPerVertexNV:                 return "PerVertexNV";
+        case DecorationPerPrimitiveNV:              return "PerPrimitiveNV";
+        case DecorationPerViewNV:                   return "PerViewNV";
+        case DecorationPerTaskNV:                   return "PerTaskNV";
+
         default:                                    return "Bad";
         }
     }
diff --git a/SPIRV/disassemble.h b/SPIRV/disassemble.h
old mode 100755
new mode 100644
index 47cef65..2a9a89b
--- a/SPIRV/disassemble.h
+++ b/SPIRV/disassemble.h
@@ -45,6 +45,7 @@
 
 namespace spv {
 
+    // disassemble with glslang custom disassembler
     void Disassemble(std::ostream& out, const std::vector<unsigned int>&);
 
 };  // end namespace spv
diff --git a/SPIRV/doc.cpp b/SPIRV/doc.cpp
old mode 100755
new mode 100644
index 49b734b..b0b01fb
--- a/SPIRV/doc.cpp
+++ b/SPIRV/doc.cpp
@@ -49,6 +49,7 @@
     extern "C" {
         // Include C-based headers that don't have a namespace
         #include "GLSL.ext.KHR.h"
+        #include "GLSL.ext.EXT.h"
 #ifdef AMD_EXTENSIONS
         #include "GLSL.ext.AMD.h"
 #endif
@@ -65,7 +66,7 @@
 // the specification (or their sanitized versions for auto-generating the
 // spirv headers.
 //
-// Also, the ceilings are declared next to these, to help keep them in sync.
+// Also, for masks the ceilings are declared next to these, to help keep them in sync.
 // Ceilings should be
 //  - one more than the maximum value an enumerant takes on, for non-mask enumerants
 //    (for non-sparse enums, this is the number of enumerants)
@@ -73,8 +74,6 @@
 //    (for non-sparse mask enums, this is the number of enumerants)
 //
 
-const int SourceLanguageCeiling = 6; // HLSL todo: need official enumerant
-
 const char* SourceString(int source)
 {
     switch (source) {
@@ -85,13 +84,10 @@
     case 4:  return "OpenCL_CPP";
     case 5:  return "HLSL";
 
-    case SourceLanguageCeiling:
     default: return "Bad";
     }
 }
 
-const int ExecutionModelCeiling = 7;
-
 const char* ExecutionModelString(int model)
 {
     switch (model) {
@@ -102,14 +98,25 @@
     case 4:  return "Fragment";
     case 5:  return "GLCompute";
     case 6:  return "Kernel";
+#ifdef NV_EXTENSIONS
+    case ExecutionModelTaskNV: return "TaskNV";
+    case ExecutionModelMeshNV: return "MeshNV";
+#endif
 
-    case ExecutionModelCeiling:
     default: return "Bad";
+
+#ifdef NV_EXTENSIONS
+    case ExecutionModelRayGenerationNV: return "RayGenerationNV";
+    case ExecutionModelIntersectionNV:  return "IntersectionNV";
+    case ExecutionModelAnyHitNV:        return "AnyHitNV";
+    case ExecutionModelClosestHitNV:    return "ClosestHitNV";
+    case ExecutionModelMissNV:          return "MissNV";
+    case ExecutionModelCallableNV:      return "CallableNV";
+#endif
+
     }
 }
 
-const int AddressingModelCeiling = 3;
-
 const char* AddressingString(int addr)
 {
     switch (addr) {
@@ -117,21 +124,18 @@
     case 1:  return "Physical32";
     case 2:  return "Physical64";
 
-    case AddressingModelCeiling:
     default: return "Bad";
     }
 }
 
-const int MemoryModelCeiling = 3;
-
 const char* MemoryString(int mem)
 {
     switch (mem) {
-    case 0:  return "Simple";
-    case 1:  return "GLSL450";
-    case 2:  return "OpenCL";
+    case MemoryModelSimple:     return "Simple";
+    case MemoryModelGLSL450:    return "GLSL450";
+    case MemoryModelOpenCL:     return "OpenCL";
+    case MemoryModelVulkanKHR:  return "VulkanKHR";
 
-    case MemoryModelCeiling:
     default: return "Bad";
     }
 }
@@ -175,13 +179,21 @@
     case 31: return "ContractionOff";
     case 32: return "Bad";
 
+    case 4446:  return "PostDepthCoverage";
+
+#ifdef NV_EXTENSIONS
+    case ExecutionModeOutputLinesNV:            return "OutputLinesNV";
+    case ExecutionModeOutputPrimitivesNV:       return "OutputPrimitivesNV";
+    case ExecutionModeOutputTrianglesNV:        return "OutputTrianglesNV";
+    case ExecutionModeDerivativeGroupQuadsNV:   return "DerivativeGroupQuadsNV";
+    case ExecutionModeDerivativeGroupLinearNV:  return "DerivativeGroupLinearNV";
+#endif
+
     case ExecutionModeCeiling:
     default: return "Bad";
     }
 }
 
-const int StorageClassCeiling = 13;
-
 const char* StorageClassString(int StorageClass)
 {
     switch (StorageClass) {
@@ -199,7 +211,15 @@
     case 11: return "Image";
     case 12: return "StorageBuffer";
 
-    case StorageClassCeiling:
+#ifdef NV_EXTENSIONS
+    case StorageClassRayPayloadNV:            return "RayPayloadNV";
+    case StorageClassHitAttributeNV:          return "HitAttributeNV";
+    case StorageClassIncomingRayPayloadNV:    return "IncomingRayPayloadNV";
+    case StorageClassShaderRecordBufferNV:    return "ShaderRecordBufferNV";
+    case StorageClassCallableDataNV:          return "CallableDataNV";
+    case StorageClassIncomingCallableDataNV:  return "IncomingCallableDataNV";
+#endif
+
     default: return "Bad";
     }
 }
@@ -259,19 +279,25 @@
     default:  return "Bad";
 
 #ifdef AMD_EXTENSIONS
-    case 4999: return "ExplicitInterpAMD";
+    case DecorationExplicitInterpAMD: return "ExplicitInterpAMD";
 #endif
 #ifdef NV_EXTENSIONS
-    case 5248: return "OverrideCoverageNV";
-    case 5250: return "PassthroughNV";
-    case 5252: return "ViewportRelativeNV";
-    case 5256: return "SecondaryViewportRelativeNV";
+    case DecorationOverrideCoverageNV:          return "OverrideCoverageNV";
+    case DecorationPassthroughNV:               return "PassthroughNV";
+    case DecorationViewportRelativeNV:          return "ViewportRelativeNV";
+    case DecorationSecondaryViewportRelativeNV: return "SecondaryViewportRelativeNV";
+    case DecorationPerPrimitiveNV:              return "PerPrimitiveNV";
+    case DecorationPerViewNV:                   return "PerViewNV";
+    case DecorationPerTaskNV:                   return "PerTaskNV";
+    case DecorationPerVertexNV:                 return "PerVertexNV";
 #endif
+
+    case DecorationNonUniformEXT:           return "DecorationNonUniformEXT";
+    case DecorationHlslCounterBufferGOOGLE: return "DecorationHlslCounterBufferGOOGLE";
+    case DecorationHlslSemanticGOOGLE:      return "DecorationHlslSemanticGOOGLE";
     }
 }
 
-const int BuiltInCeiling = 44;
-
 const char* BuiltInString(int builtIn)
 {
     switch (builtIn) {
@@ -330,6 +356,7 @@
     case 4424: return "BaseVertex";
     case 4425: return "BaseInstance";
     case 4426: return "DrawIndex";
+    case 5014: return "FragStencilRefEXT";
 
 #ifdef AMD_EXTENSIONS
     case 4992: return "BaryCoordNoPerspAMD";
@@ -342,20 +369,52 @@
 #endif
 
 #ifdef NV_EXTENSIONS
-    case 5253: return "ViewportMaskNV";
-    case 5257: return "SecondaryPositionNV";
-    case 5258: return "SecondaryViewportMaskNV";
-    case 5261: return "PositionPerViewNV";
-    case 5262: return "ViewportMaskPerViewNV";
+    case BuiltInLaunchIdNV:                 return "LaunchIdNV";
+    case BuiltInLaunchSizeNV:               return "LaunchSizeNV";
+    case BuiltInWorldRayOriginNV:           return "WorldRayOriginNV";
+    case BuiltInWorldRayDirectionNV:        return "WorldRayDirectionNV";
+    case BuiltInObjectRayOriginNV:          return "ObjectRayOriginNV";
+    case BuiltInObjectRayDirectionNV:       return "ObjectRayDirectionNV";
+    case BuiltInRayTminNV:                  return "RayTminNV";
+    case BuiltInRayTmaxNV:                  return "RayTmaxNV";
+    case BuiltInInstanceCustomIndexNV:      return "InstanceCustomIndexNV";
+    case BuiltInObjectToWorldNV:            return "ObjectToWorldNV";
+    case BuiltInWorldToObjectNV:            return "WorldToObjectNV";
+    case BuiltInHitTNV:                     return "HitTNV";
+    case BuiltInHitKindNV:                  return "HitKindNV";
+    case BuiltInIncomingRayFlagsNV:         return "IncomingRayFlagsNV";
+    case BuiltInViewportMaskNV:             return "ViewportMaskNV";
+    case BuiltInSecondaryPositionNV:        return "SecondaryPositionNV";
+    case BuiltInSecondaryViewportMaskNV:    return "SecondaryViewportMaskNV";
+    case BuiltInPositionPerViewNV:          return "PositionPerViewNV";
+    case BuiltInViewportMaskPerViewNV:      return "ViewportMaskPerViewNV";
+//    case BuiltInFragmentSizeNV:             return "FragmentSizeNV";        // superseded by BuiltInFragSizeEXT
+//    case BuiltInInvocationsPerPixelNV:      return "InvocationsPerPixelNV"; // superseded by BuiltInFragInvocationCountEXT
+    case BuiltInBaryCoordNV:                return "BaryCoordNV";
+    case BuiltInBaryCoordNoPerspNV:         return "BaryCoordNoPerspNV";
 #endif
 
-    case BuiltInCeiling:
+    case BuiltInFragSizeEXT:                return "FragSizeEXT";
+    case BuiltInFragInvocationCountEXT:     return "FragInvocationCountEXT";
+
+    case 5264: return "FullyCoveredEXT";
+
+
+#ifdef NV_EXTENSIONS
+    case BuiltInTaskCountNV:           return "TaskCountNV";
+    case BuiltInPrimitiveCountNV:      return "PrimitiveCountNV";
+    case BuiltInPrimitiveIndicesNV:    return "PrimitiveIndicesNV";
+    case BuiltInClipDistancePerViewNV: return "ClipDistancePerViewNV";
+    case BuiltInCullDistancePerViewNV: return "CullDistancePerViewNV";
+    case BuiltInLayerPerViewNV:        return "LayerPerViewNV";
+    case BuiltInMeshViewCountNV:       return "MeshViewCountNV";
+    case BuiltInMeshViewIndicesNV:     return "MeshViewIndicesNV";
+#endif
+
     default: return "Bad";
     }
 }
 
-const int DimensionCeiling = 7;
-
 const char* DimensionString(int dim)
 {
     switch (dim) {
@@ -367,13 +426,10 @@
     case 5:  return "Buffer";
     case 6:  return "SubpassData";
 
-    case DimensionCeiling:
     default: return "Bad";
     }
 }
 
-const int SamplerAddressingModeCeiling = 5;
-
 const char* SamplerAddressingModeString(int mode)
 {
     switch (mode) {
@@ -383,26 +439,20 @@
     case 3:  return "Repeat";
     case 4:  return "RepeatMirrored";
 
-    case SamplerAddressingModeCeiling:
     default: return "Bad";
     }
 }
 
-const int SamplerFilterModeCeiling = 2;
-
 const char* SamplerFilterModeString(int mode)
 {
     switch (mode) {
     case 0: return "Nearest";
     case 1: return "Linear";
 
-    case SamplerFilterModeCeiling:
     default: return "Bad";
     }
 }
 
-const int ImageFormatCeiling = 40;
-
 const char* ImageFormatString(int format)
 {
     switch (format) {
@@ -459,14 +509,11 @@
     case 38: return "R16ui";
     case 39: return "R8ui";
 
-    case ImageFormatCeiling:
     default:
         return "Bad";
     }
 }
 
-const int ImageChannelOrderCeiling = 19;
-
 const char* ImageChannelOrderString(int format)
 {
     switch (format) {
@@ -490,14 +537,11 @@
     case 17: return "sRGBA";
     case 18: return "sBGRA";
 
-    case ImageChannelOrderCeiling:
     default: 
         return "Bad";
     }
 }
 
-const int ImageChannelDataTypeCeiling = 17;
-
 const char* ImageChannelDataTypeString(int type)
 {
     switch (type)
@@ -520,25 +564,28 @@
     case 15: return "UnormInt24";
     case 16: return "UnormInt101010_2";
 
-    case ImageChannelDataTypeCeiling:
     default:
         return "Bad";
     }
 }
 
-const int ImageOperandsCeiling = 8;
+const int ImageOperandsCeiling = 12;
 
 const char* ImageOperandsString(int format)
 {
     switch (format) {
-    case 0: return "Bias";
-    case 1: return "Lod";
-    case 2: return "Grad";
-    case 3: return "ConstOffset";
-    case 4: return "Offset";
-    case 5: return "ConstOffsets";
-    case 6: return "Sample";
-    case 7: return "MinLod";
+    case ImageOperandsBiasShift:                    return "Bias";
+    case ImageOperandsLodShift:                     return "Lod";
+    case ImageOperandsGradShift:                    return "Grad";
+    case ImageOperandsConstOffsetShift:             return "ConstOffset";
+    case ImageOperandsOffsetShift:                  return "Offset";
+    case ImageOperandsConstOffsetsShift:            return "ConstOffsets";
+    case ImageOperandsSampleShift:                  return "Sample";
+    case ImageOperandsMinLodShift:                  return "MinLod";
+    case ImageOperandsMakeTexelAvailableKHRShift:   return "MakeTexelAvailableKHR";
+    case ImageOperandsMakeTexelVisibleKHRShift:     return "MakeTexelVisibleKHR";
+    case ImageOperandsNonPrivateTexelKHRShift:      return "NonPrivateTexelKHR";
+    case ImageOperandsVolatileTexelKHRShift:        return "VolatileTexelKHR";
 
     case ImageOperandsCeiling:
     default:
@@ -546,8 +593,6 @@
     }
 }
 
-const int FPFastMathCeiling = 5;
-
 const char* FPFastMathString(int mode)
 {
     switch (mode) {
@@ -557,13 +602,10 @@
     case 3: return "AllowRecip";
     case 4: return "Fast";
 
-    case FPFastMathCeiling:
     default:     return "Bad";
     }
 }
 
-const int FPRoundingModeCeiling = 4;
-
 const char* FPRoundingModeString(int mode)
 {
     switch (mode) {
@@ -572,26 +614,20 @@
     case 2:  return "RTP";
     case 3:  return "RTN";
 
-    case FPRoundingModeCeiling:
     default: return "Bad";
     }
 }
 
-const int LinkageTypeCeiling = 2;
-
 const char* LinkageTypeString(int type)
 {
     switch (type) {
     case 0:  return "Export";
     case 1:  return "Import";
 
-    case LinkageTypeCeiling:
     default: return "Bad";
     }
 }
 
-const int FuncParamAttrCeiling = 8;
-
 const char* FuncParamAttrString(int attr)
 {
     switch (attr) {
@@ -604,13 +640,10 @@
     case 6:  return "NoWrite";
     case 7:  return "NoReadWrite";
 
-    case FuncParamAttrCeiling:
     default: return "Bad";
     }
 }
 
-const int AccessQualifierCeiling = 3;
-
 const char* AccessQualifierString(int attr)
 {
     switch (attr) {
@@ -618,7 +651,6 @@
     case 1:  return "WriteOnly";
     case 2:  return "ReadWrite";
 
-    case AccessQualifierCeiling:
     default: return "Bad";
     }
 }
@@ -636,13 +668,15 @@
     }
 }
 
-const int LoopControlCeiling = 2;
+const int LoopControlCeiling = 4;
 
 const char* LoopControlString(int cont)
 {
     switch (cont) {
     case 0:  return "Unroll";
     case 1:  return "DontUnroll";
+    case 2:  return "DependencyInfinite";
+    case 3:  return "DependencyLength";
 
     case LoopControlCeiling:
     default: return "Bad";
@@ -664,8 +698,6 @@
     }
 }
 
-const int MemorySemanticsCeiling = 12;
-
 const char* MemorySemanticsString(int mem)
 {
     // Note: No bits set (None) means "Relaxed"
@@ -683,27 +715,26 @@
     case 10: return "AtomicCounterMemory";
     case 11: return "ImageMemory";
 
-    case MemorySemanticsCeiling:
     default:     return "Bad";
     }
 }
 
-const int MemoryAccessCeiling = 3;
+const int MemoryAccessCeiling = 6;
 
 const char* MemoryAccessString(int mem)
 {
     switch (mem) {
-    case 0:  return "Volatile";
-    case 1:  return "Aligned";
-    case 2:  return "Nontemporal";
+    case MemoryAccessVolatileShift:                 return "Volatile";
+    case MemoryAccessAlignedShift:                  return "Aligned";
+    case MemoryAccessNontemporalShift:              return "Nontemporal";
+    case MemoryAccessMakePointerAvailableKHRShift:  return "MakePointerAvailableKHR";
+    case MemoryAccessMakePointerVisibleKHRShift:    return "MakePointerVisibleKHR";
+    case MemoryAccessNonPrivatePointerKHRShift:     return "NonPrivatePointerKHR";
 
-    case MemoryAccessCeiling:
     default: return "Bad";
     }
 }
 
-const int ScopeCeiling = 5;
-
 const char* ScopeString(int mem)
 {
     switch (mem) {
@@ -713,29 +744,29 @@
     case 3:  return "Subgroup";
     case 4:  return "Invocation";
 
-    case ScopeCeiling:
     default: return "Bad";
     }
 }
 
-const int GroupOperationCeiling = 3;
-
 const char* GroupOperationString(int gop)
 {
 
     switch (gop)
     {
-    case 0:  return "Reduce";
-    case 1:  return "InclusiveScan";
-    case 2:  return "ExclusiveScan";
+    case GroupOperationReduce:  return "Reduce";
+    case GroupOperationInclusiveScan:  return "InclusiveScan";
+    case GroupOperationExclusiveScan:  return "ExclusiveScan";
+    case GroupOperationClusteredReduce:  return "ClusteredReduce";
+#ifdef NV_EXTENSIONS
+    case GroupOperationPartitionedReduceNV:  return "PartitionedReduceNV";
+    case GroupOperationPartitionedInclusiveScanNV:  return "PartitionedInclusiveScanNV";
+    case GroupOperationPartitionedExclusiveScanNV:  return "PartitionedExclusiveScanNV";
+#endif
 
-    case GroupOperationCeiling:
     default: return "Bad";
     }
 }
 
-const int KernelEnqueueFlagsCeiling = 3;
-
 const char* KernelEnqueueFlagsString(int flag)
 {
     switch (flag)
@@ -744,26 +775,20 @@
     case 1:  return "WaitKernel";
     case 2:  return "WaitWorkGroup";
 
-    case KernelEnqueueFlagsCeiling:
     default: return "Bad";
     }
 }
 
-const int KernelProfilingInfoCeiling = 1;
-
 const char* KernelProfilingInfoString(int info)
 {
     switch (info)
     {
     case 0:  return "CmdExecTime";
 
-    case KernelProfilingInfoCeiling:
     default: return "Bad";
     }
 }
 
-const int CapabilityCeiling = 58;
-
 const char* CapabilityString(int info)
 {
     switch (info)
@@ -826,28 +851,77 @@
     case 55: return "StorageImageReadWithoutFormat";
     case 56: return "StorageImageWriteWithoutFormat";
     case 57: return "MultiViewport";
+    case 61: return "GroupNonUniform";
+    case 62: return "GroupNonUniformVote";
+    case 63: return "GroupNonUniformArithmetic";
+    case 64: return "GroupNonUniformBallot";
+    case 65: return "GroupNonUniformShuffle";
+    case 66: return "GroupNonUniformShuffleRelative";
+    case 67: return "GroupNonUniformClustered";
+    case 68: return "GroupNonUniformQuad";
 
-    case 4423: return "SubgroupBallotKHR";
-    case 4427: return "DrawParameters";
-    case 4431: return "SubgroupVoteKHR";
+    case CapabilitySubgroupBallotKHR: return "SubgroupBallotKHR";
+    case CapabilityDrawParameters:    return "DrawParameters";
+    case CapabilitySubgroupVoteKHR:   return "SubgroupVoteKHR";
 
-    case 4433: return "StorageUniformBufferBlock16";
-    case 4434: return "StorageUniform16";
-    case 4435: return "StoragePushConstant16";
-    case 4436: return "StorageInputOutput16";
+    case CapabilityStorageUniformBufferBlock16: return "StorageUniformBufferBlock16";
+    case CapabilityStorageUniform16:            return "StorageUniform16";
+    case CapabilityStoragePushConstant16:       return "StoragePushConstant16";
+    case CapabilityStorageInputOutput16:        return "StorageInputOutput16";
 
-    case 4437: return "DeviceGroup";
-    case 4439: return "MultiView";
+    case CapabilityStorageBuffer8BitAccess:             return "CapabilityStorageBuffer8BitAccess";
+    case CapabilityUniformAndStorageBuffer8BitAccess:   return "CapabilityUniformAndStorageBuffer8BitAccess";
+    case CapabilityStoragePushConstant8:                return "CapabilityStoragePushConstant8";
 
-#ifdef NV_EXTENSIONS
-    case 5251: return "GeometryShaderPassthroughNV";
-    case 5254: return "ShaderViewportIndexLayerNV";
-    case 5255: return "ShaderViewportMaskNV";
-    case 5259: return "ShaderStereoViewNV";
-    case 5260: return "PerViewAttributesNV";
+    case CapabilityDeviceGroup: return "DeviceGroup";
+    case CapabilityMultiView:   return "MultiView";
+
+    case CapabilityStencilExportEXT: return "StencilExportEXT";
+
+#ifdef AMD_EXTENSIONS
+    case CapabilityFloat16ImageAMD:       return "Float16ImageAMD";
+    case CapabilityImageGatherBiasLodAMD: return "ImageGatherBiasLodAMD";
+    case CapabilityFragmentMaskAMD:       return "FragmentMaskAMD";
+    case CapabilityImageReadWriteLodAMD:  return "ImageReadWriteLodAMD";
 #endif
 
-    case CapabilityCeiling:
+    case CapabilityAtomicStorageOps:             return "AtomicStorageOps";
+
+    case CapabilitySampleMaskPostDepthCoverage:  return "SampleMaskPostDepthCoverage";
+#ifdef NV_EXTENSIONS
+    case CapabilityGeometryShaderPassthroughNV:     return "GeometryShaderPassthroughNV";
+    case CapabilityShaderViewportIndexLayerNV:      return "ShaderViewportIndexLayerNV";
+    case CapabilityShaderViewportMaskNV:            return "ShaderViewportMaskNV";
+    case CapabilityShaderStereoViewNV:              return "ShaderStereoViewNV";
+    case CapabilityPerViewAttributesNV:             return "PerViewAttributesNV";
+    case CapabilityGroupNonUniformPartitionedNV:    return "GroupNonUniformPartitionedNV";
+    case CapabilityRayTracingNV:                    return "RayTracingNV";
+    case CapabilityComputeDerivativeGroupQuadsNV:   return "ComputeDerivativeGroupQuadsNV";
+    case CapabilityComputeDerivativeGroupLinearNV:  return "ComputeDerivativeGroupLinearNV";
+    case CapabilityFragmentBarycentricNV:           return "FragmentBarycentricNV";
+    case CapabilityMeshShadingNV:                   return "MeshShadingNV";
+//    case CapabilityShadingRateNV:                   return "ShadingRateNV";  // superseded by CapabilityFragmentDensityEXT
+#endif
+    case CapabilityFragmentDensityEXT:              return "FragmentDensityEXT";
+
+    case CapabilityFragmentFullyCoveredEXT: return "FragmentFullyCoveredEXT";
+
+    case CapabilityShaderNonUniformEXT:                          return "CapabilityShaderNonUniformEXT";
+    case CapabilityRuntimeDescriptorArrayEXT:                    return "CapabilityRuntimeDescriptorArrayEXT";
+    case CapabilityInputAttachmentArrayDynamicIndexingEXT:       return "CapabilityInputAttachmentArrayDynamicIndexingEXT";
+    case CapabilityUniformTexelBufferArrayDynamicIndexingEXT:    return "CapabilityUniformTexelBufferArrayDynamicIndexingEXT";
+    case CapabilityStorageTexelBufferArrayDynamicIndexingEXT:    return "CapabilityStorageTexelBufferArrayDynamicIndexingEXT";
+    case CapabilityUniformBufferArrayNonUniformIndexingEXT:      return "CapabilityUniformBufferArrayNonUniformIndexingEXT";
+    case CapabilitySampledImageArrayNonUniformIndexingEXT:       return "CapabilitySampledImageArrayNonUniformIndexingEXT";
+    case CapabilityStorageBufferArrayNonUniformIndexingEXT:      return "CapabilityStorageBufferArrayNonUniformIndexingEXT";
+    case CapabilityStorageImageArrayNonUniformIndexingEXT:       return "CapabilityStorageImageArrayNonUniformIndexingEXT";
+    case CapabilityInputAttachmentArrayNonUniformIndexingEXT:    return "CapabilityInputAttachmentArrayNonUniformIndexingEXT";
+    case CapabilityUniformTexelBufferArrayNonUniformIndexingEXT: return "CapabilityUniformTexelBufferArrayNonUniformIndexingEXT";
+    case CapabilityStorageTexelBufferArrayNonUniformIndexingEXT: return "CapabilityStorageTexelBufferArrayNonUniformIndexingEXT";
+
+    case CapabilityVulkanMemoryModelKHR:                return "CapabilityVulkanMemoryModelKHR";
+    case CapabilityVulkanMemoryModelDeviceScopeKHR:     return "CapabilityVulkanMemoryModelDeviceScopeKHR";
+
     default: return "Bad";
     }
 }
@@ -1177,6 +1251,44 @@
     case 319: return "OpAtomicFlagClear";
     case 320: return "OpImageSparseRead";
 
+    case OpModuleProcessed: return "OpModuleProcessed";
+    case OpDecorateId:      return "OpDecorateId";
+
+    case 333: return "OpGroupNonUniformElect";
+    case 334: return "OpGroupNonUniformAll";
+    case 335: return "OpGroupNonUniformAny";
+    case 336: return "OpGroupNonUniformAllEqual";
+    case 337: return "OpGroupNonUniformBroadcast";
+    case 338: return "OpGroupNonUniformBroadcastFirst";
+    case 339: return "OpGroupNonUniformBallot";
+    case 340: return "OpGroupNonUniformInverseBallot";
+    case 341: return "OpGroupNonUniformBallotBitExtract";
+    case 342: return "OpGroupNonUniformBallotBitCount";
+    case 343: return "OpGroupNonUniformBallotFindLSB";
+    case 344: return "OpGroupNonUniformBallotFindMSB";
+    case 345: return "OpGroupNonUniformShuffle";
+    case 346: return "OpGroupNonUniformShuffleXor";
+    case 347: return "OpGroupNonUniformShuffleUp";
+    case 348: return "OpGroupNonUniformShuffleDown";
+    case 349: return "OpGroupNonUniformIAdd";
+    case 350: return "OpGroupNonUniformFAdd";
+    case 351: return "OpGroupNonUniformIMul";
+    case 352: return "OpGroupNonUniformFMul";
+    case 353: return "OpGroupNonUniformSMin";
+    case 354: return "OpGroupNonUniformUMin";
+    case 355: return "OpGroupNonUniformFMin";
+    case 356: return "OpGroupNonUniformSMax";
+    case 357: return "OpGroupNonUniformUMax";
+    case 358: return "OpGroupNonUniformFMax";
+    case 359: return "OpGroupNonUniformBitwiseAnd";
+    case 360: return "OpGroupNonUniformBitwiseOr";
+    case 361: return "OpGroupNonUniformBitwiseXor";
+    case 362: return "OpGroupNonUniformLogicalAnd";
+    case 363: return "OpGroupNonUniformLogicalOr";
+    case 364: return "OpGroupNonUniformLogicalXor";
+    case 365: return "OpGroupNonUniformQuadBroadcast";
+    case 366: return "OpGroupNonUniformQuadSwap";
+
     case 4421: return "OpSubgroupBallotKHR";
     case 4422: return "OpSubgroupFirstInvocationKHR";
     case 4428: return "OpSubgroupAllKHR";
@@ -1193,9 +1305,26 @@
     case 5005: return "OpGroupFMaxNonUniformAMD";
     case 5006: return "OpGroupUMaxNonUniformAMD";
     case 5007: return "OpGroupSMaxNonUniformAMD";
+
+    case 5011: return "OpFragmentMaskFetchAMD";
+    case 5012: return "OpFragmentFetchAMD";
 #endif
 
-    case OpcodeCeiling:
+    case OpDecorateStringGOOGLE:       return "OpDecorateStringGOOGLE";
+    case OpMemberDecorateStringGOOGLE: return "OpMemberDecorateStringGOOGLE";
+
+#ifdef NV_EXTENSIONS
+    case OpGroupNonUniformPartitionNV:       return "OpGroupNonUniformPartitionNV";
+    case OpReportIntersectionNV:             return "OpReportIntersectionNV";
+    case OpIgnoreIntersectionNV:             return "OpIgnoreIntersectionNV";
+    case OpTerminateRayNV:                   return "OpTerminateRayNV";
+    case OpTraceNV:                          return "OpTraceNV";
+    case OpTypeAccelerationStructureNV:      return "OpTypeAccelerationStructureNV";
+    case OpExecuteCallableNV:                return "OpExecuteCallableNV";
+    case OpImageSampleFootprintNV:           return "OpImageSampleFootprintNV";
+    case OpWritePackedPrimitiveIndices4x8NV: return "OpWritePackedPrimitiveIndices4x8NV";
+#endif
+
     default:
         return "Bad";
     }
@@ -1208,35 +1337,13 @@
 OperandParameters DecorationOperands[DecorationCeiling];
 
 EnumDefinition OperandClassParams[OperandCount];
-EnumParameters ExecutionModelParams[ExecutionModelCeiling];
-EnumParameters AddressingParams[AddressingModelCeiling];
-EnumParameters MemoryParams[MemoryModelCeiling];
 EnumParameters ExecutionModeParams[ExecutionModeCeiling];
-EnumParameters StorageParams[StorageClassCeiling];
-EnumParameters SamplerAddressingModeParams[SamplerAddressingModeCeiling];
-EnumParameters SamplerFilterModeParams[SamplerFilterModeCeiling];
-EnumParameters ImageFormatParams[ImageFormatCeiling];
-EnumParameters ImageChannelOrderParams[ImageChannelOrderCeiling];
-EnumParameters ImageChannelDataTypeParams[ImageChannelDataTypeCeiling];
 EnumParameters ImageOperandsParams[ImageOperandsCeiling];
-EnumParameters FPFastMathParams[FPFastMathCeiling];
-EnumParameters FPRoundingModeParams[FPRoundingModeCeiling];
-EnumParameters LinkageTypeParams[LinkageTypeCeiling];
 EnumParameters DecorationParams[DecorationCeiling];
-EnumParameters BuiltInParams[BuiltInCeiling];
-EnumParameters DimensionalityParams[DimensionCeiling];
-EnumParameters FuncParamAttrParams[FuncParamAttrCeiling];
-EnumParameters AccessQualifierParams[AccessQualifierCeiling];
-EnumParameters GroupOperationParams[GroupOperationCeiling];
 EnumParameters LoopControlParams[FunctionControlCeiling];
 EnumParameters SelectionControlParams[SelectControlCeiling];
 EnumParameters FunctionControlParams[FunctionControlCeiling];
-EnumParameters MemorySemanticsParams[MemorySemanticsCeiling];
 EnumParameters MemoryAccessParams[MemoryAccessCeiling];
-EnumParameters ScopeParams[ScopeCeiling];
-EnumParameters KernelEnqueueFlagsParams[KernelEnqueueFlagsCeiling];
-EnumParameters KernelProfilingInfoParams[KernelProfilingInfoCeiling];
-EnumParameters CapabilityParams[CapabilityCeiling];
 
 // Set up all the parameterizing descriptions of the opcodes, operands, etc.
 void Parameterize()
@@ -1286,7 +1393,10 @@
     InstructionDesc[OpImageWrite].setResultAndType(false, false);
     InstructionDesc[OpDecorationGroup].setResultAndType(true, false);
     InstructionDesc[OpDecorate].setResultAndType(false, false);
+    InstructionDesc[OpDecorateId].setResultAndType(false, false);
+    InstructionDesc[OpDecorateStringGOOGLE].setResultAndType(false, false);
     InstructionDesc[OpMemberDecorate].setResultAndType(false, false);
+    InstructionDesc[OpMemberDecorateStringGOOGLE].setResultAndType(false, false);
     InstructionDesc[OpGroupDecorate].setResultAndType(false, false);
     InstructionDesc[OpGroupMemberDecorate].setResultAndType(false, false);
     InstructionDesc[OpName].setResultAndType(false, false);
@@ -1325,6 +1435,7 @@
     InstructionDesc[OpReleaseEvent].setResultAndType(false, false);
     InstructionDesc[OpGroupWaitEvents].setResultAndType(false, false);
     InstructionDesc[OpAtomicFlagClear].setResultAndType(false, false);
+    InstructionDesc[OpModuleProcessed].setResultAndType(false, false);
 
     // Specific additional context-dependent operands
 
@@ -1362,354 +1473,39 @@
     DecorationOperands[DecorationInputAttachmentIndex].push(OperandLiteralNumber, "'Attachment Index'");
     DecorationOperands[DecorationAlignment].push(OperandLiteralNumber, "'Alignment'");
 
-    OperandClassParams[OperandSource].set(SourceLanguageCeiling, SourceString, 0);
-    OperandClassParams[OperandExecutionModel].set(ExecutionModelCeiling, ExecutionModelString, ExecutionModelParams);
-    OperandClassParams[OperandAddressing].set(AddressingModelCeiling, AddressingString, AddressingParams);
-    OperandClassParams[OperandMemory].set(MemoryModelCeiling, MemoryString, MemoryParams);
+    OperandClassParams[OperandSource].set(0, SourceString, 0);
+    OperandClassParams[OperandExecutionModel].set(0, ExecutionModelString, nullptr);
+    OperandClassParams[OperandAddressing].set(0, AddressingString, nullptr);
+    OperandClassParams[OperandMemory].set(0, MemoryString, nullptr);
     OperandClassParams[OperandExecutionMode].set(ExecutionModeCeiling, ExecutionModeString, ExecutionModeParams);
     OperandClassParams[OperandExecutionMode].setOperands(ExecutionModeOperands);
-    OperandClassParams[OperandStorage].set(StorageClassCeiling, StorageClassString, StorageParams);
-    OperandClassParams[OperandDimensionality].set(DimensionCeiling, DimensionString, DimensionalityParams);
-    OperandClassParams[OperandSamplerAddressingMode].set(SamplerAddressingModeCeiling, SamplerAddressingModeString, SamplerAddressingModeParams);
-    OperandClassParams[OperandSamplerFilterMode].set(SamplerFilterModeCeiling, SamplerFilterModeString, SamplerFilterModeParams);
-    OperandClassParams[OperandSamplerImageFormat].set(ImageFormatCeiling, ImageFormatString, ImageFormatParams);
-    OperandClassParams[OperandImageChannelOrder].set(ImageChannelOrderCeiling, ImageChannelOrderString, ImageChannelOrderParams);
-    OperandClassParams[OperandImageChannelDataType].set(ImageChannelDataTypeCeiling, ImageChannelDataTypeString, ImageChannelDataTypeParams);
+    OperandClassParams[OperandStorage].set(0, StorageClassString, nullptr);
+    OperandClassParams[OperandDimensionality].set(0, DimensionString, nullptr);
+    OperandClassParams[OperandSamplerAddressingMode].set(0, SamplerAddressingModeString, nullptr);
+    OperandClassParams[OperandSamplerFilterMode].set(0, SamplerFilterModeString, nullptr);
+    OperandClassParams[OperandSamplerImageFormat].set(0, ImageFormatString, nullptr);
+    OperandClassParams[OperandImageChannelOrder].set(0, ImageChannelOrderString, nullptr);
+    OperandClassParams[OperandImageChannelDataType].set(0, ImageChannelDataTypeString, nullptr);
     OperandClassParams[OperandImageOperands].set(ImageOperandsCeiling, ImageOperandsString, ImageOperandsParams, true);
-    OperandClassParams[OperandFPFastMath].set(FPFastMathCeiling, FPFastMathString, FPFastMathParams, true);
-    OperandClassParams[OperandFPRoundingMode].set(FPRoundingModeCeiling, FPRoundingModeString, FPRoundingModeParams);
-    OperandClassParams[OperandLinkageType].set(LinkageTypeCeiling, LinkageTypeString, LinkageTypeParams);
-    OperandClassParams[OperandFuncParamAttr].set(FuncParamAttrCeiling, FuncParamAttrString, FuncParamAttrParams);
-    OperandClassParams[OperandAccessQualifier].set(AccessQualifierCeiling, AccessQualifierString, AccessQualifierParams);
+    OperandClassParams[OperandFPFastMath].set(0, FPFastMathString, nullptr, true);
+    OperandClassParams[OperandFPRoundingMode].set(0, FPRoundingModeString, nullptr);
+    OperandClassParams[OperandLinkageType].set(0, LinkageTypeString, nullptr);
+    OperandClassParams[OperandFuncParamAttr].set(0, FuncParamAttrString, nullptr);
+    OperandClassParams[OperandAccessQualifier].set(0, AccessQualifierString, nullptr);
     OperandClassParams[OperandDecoration].set(DecorationCeiling, DecorationString, DecorationParams);
     OperandClassParams[OperandDecoration].setOperands(DecorationOperands);
-    OperandClassParams[OperandBuiltIn].set(BuiltInCeiling, BuiltInString, BuiltInParams);
+    OperandClassParams[OperandBuiltIn].set(0, BuiltInString, nullptr);
     OperandClassParams[OperandSelect].set(SelectControlCeiling, SelectControlString, SelectionControlParams, true);
     OperandClassParams[OperandLoop].set(LoopControlCeiling, LoopControlString, LoopControlParams, true);
     OperandClassParams[OperandFunction].set(FunctionControlCeiling, FunctionControlString, FunctionControlParams, true);
-    OperandClassParams[OperandMemorySemantics].set(MemorySemanticsCeiling, MemorySemanticsString, MemorySemanticsParams, true);
+    OperandClassParams[OperandMemorySemantics].set(0, MemorySemanticsString, nullptr, true);
     OperandClassParams[OperandMemoryAccess].set(MemoryAccessCeiling, MemoryAccessString, MemoryAccessParams, true);
-    OperandClassParams[OperandScope].set(ScopeCeiling, ScopeString, ScopeParams);
-    OperandClassParams[OperandGroupOperation].set(GroupOperationCeiling, GroupOperationString, GroupOperationParams);
-    OperandClassParams[OperandKernelEnqueueFlags].set(KernelEnqueueFlagsCeiling, KernelEnqueueFlagsString, KernelEnqueueFlagsParams);
-    OperandClassParams[OperandKernelProfilingInfo].set(KernelProfilingInfoCeiling, KernelProfilingInfoString, KernelProfilingInfoParams, true);
-    OperandClassParams[OperandCapability].set(CapabilityCeiling, CapabilityString, CapabilityParams);
-    OperandClassParams[OperandOpcode].set(OpcodeCeiling, OpcodeString, 0);
-
-    CapabilityParams[CapabilityShader].caps.push_back(CapabilityMatrix);
-    CapabilityParams[CapabilityGeometry].caps.push_back(CapabilityShader);
-    CapabilityParams[CapabilityTessellation].caps.push_back(CapabilityShader);
-    CapabilityParams[CapabilityVector16].caps.push_back(CapabilityKernel);
-    CapabilityParams[CapabilityFloat16Buffer].caps.push_back(CapabilityKernel);
-    CapabilityParams[CapabilityInt64Atomics].caps.push_back(CapabilityInt64);
-    CapabilityParams[CapabilityImageBasic].caps.push_back(CapabilityKernel);
-    CapabilityParams[CapabilityImageReadWrite].caps.push_back(CapabilityImageBasic);
-    CapabilityParams[CapabilityImageMipmap].caps.push_back(CapabilityImageBasic);
-    CapabilityParams[CapabilityPipes].caps.push_back(CapabilityKernel);
-    CapabilityParams[CapabilityDeviceEnqueue].caps.push_back(CapabilityKernel);
-    CapabilityParams[CapabilityLiteralSampler].caps.push_back(CapabilityKernel);
-    CapabilityParams[CapabilityAtomicStorage].caps.push_back(CapabilityShader);
-    CapabilityParams[CapabilitySampleRateShading].caps.push_back(CapabilityShader);
-    CapabilityParams[CapabilityTessellationPointSize].caps.push_back(CapabilityTessellation);
-    CapabilityParams[CapabilityGeometryPointSize].caps.push_back(CapabilityGeometry);
-    CapabilityParams[CapabilityImageGatherExtended].caps.push_back(CapabilityShader);
-    CapabilityParams[CapabilityStorageImageExtendedFormats].caps.push_back(CapabilityShader);
-    CapabilityParams[CapabilityStorageImageMultisample].caps.push_back(CapabilityShader);
-    CapabilityParams[CapabilityUniformBufferArrayDynamicIndexing].caps.push_back(CapabilityShader);
-    CapabilityParams[CapabilitySampledImageArrayDynamicIndexing].caps.push_back(CapabilityShader);
-    CapabilityParams[CapabilityStorageBufferArrayDynamicIndexing].caps.push_back(CapabilityShader);
-    CapabilityParams[CapabilityStorageImageArrayDynamicIndexing].caps.push_back(CapabilityShader);
-    CapabilityParams[CapabilityClipDistance].caps.push_back(CapabilityShader);
-    CapabilityParams[CapabilityCullDistance].caps.push_back(CapabilityShader);
-    CapabilityParams[CapabilityGenericPointer].caps.push_back(CapabilityAddresses);
-    CapabilityParams[CapabilityInt8].caps.push_back(CapabilityKernel);
-    CapabilityParams[CapabilityInputAttachment].caps.push_back(CapabilityShader);
-    CapabilityParams[CapabilityMinLod].caps.push_back(CapabilityShader);
-    CapabilityParams[CapabilitySparseResidency].caps.push_back(CapabilityShader);
-    CapabilityParams[CapabilitySampled1D].caps.push_back(CapabilityShader);
-    CapabilityParams[CapabilitySampledRect].caps.push_back(CapabilityShader);
-    CapabilityParams[CapabilitySampledBuffer].caps.push_back(CapabilityShader);
-    CapabilityParams[CapabilitySampledCubeArray].caps.push_back(CapabilityShader);
-    CapabilityParams[CapabilityImageMSArray].caps.push_back(CapabilityShader);
-    CapabilityParams[CapabilityImage1D].caps.push_back(CapabilitySampled1D);
-    CapabilityParams[CapabilityImageRect].caps.push_back(CapabilitySampledRect);
-    CapabilityParams[CapabilityImageBuffer].caps.push_back(CapabilitySampledBuffer);
-    CapabilityParams[CapabilityImageCubeArray].caps.push_back(CapabilitySampledCubeArray);
-    CapabilityParams[CapabilityImageQuery].caps.push_back(CapabilityShader);
-    CapabilityParams[CapabilityDerivativeControl].caps.push_back(CapabilityShader);
-    CapabilityParams[CapabilityInterpolationFunction].caps.push_back(CapabilityShader);
-    CapabilityParams[CapabilityTransformFeedback].caps.push_back(CapabilityShader);
-    CapabilityParams[CapabilityGeometryStreams].caps.push_back(CapabilityGeometry);
-    CapabilityParams[CapabilityStorageImageReadWithoutFormat].caps.push_back(CapabilityShader);
-    CapabilityParams[CapabilityStorageImageWriteWithoutFormat].caps.push_back(CapabilityShader);
-    CapabilityParams[CapabilityMultiViewport].caps.push_back(CapabilityGeometry);
-
-    AddressingParams[AddressingModelPhysical32].caps.push_back(CapabilityAddresses);
-    AddressingParams[AddressingModelPhysical64].caps.push_back(CapabilityAddresses);
-
-    MemoryParams[MemoryModelSimple].caps.push_back(CapabilityShader);
-    MemoryParams[MemoryModelGLSL450].caps.push_back(CapabilityShader);
-    MemoryParams[MemoryModelOpenCL].caps.push_back(CapabilityKernel);
-
-    MemorySemanticsParams[MemorySemanticsUniformMemoryShift].caps.push_back(CapabilityShader);
-    MemorySemanticsParams[MemorySemanticsAtomicCounterMemoryShift].caps.push_back(CapabilityAtomicStorage);
-
-    ExecutionModelParams[ExecutionModelVertex].caps.push_back(CapabilityShader);
-    ExecutionModelParams[ExecutionModelTessellationControl].caps.push_back(CapabilityTessellation);
-    ExecutionModelParams[ExecutionModelTessellationEvaluation].caps.push_back(CapabilityTessellation);
-    ExecutionModelParams[ExecutionModelGeometry].caps.push_back(CapabilityGeometry);
-    ExecutionModelParams[ExecutionModelFragment].caps.push_back(CapabilityShader);
-    ExecutionModelParams[ExecutionModelGLCompute].caps.push_back(CapabilityShader);
-    ExecutionModelParams[ExecutionModelKernel].caps.push_back(CapabilityKernel);
-
-    // Storage capabilites
-    StorageParams[StorageClassInput].caps.push_back(CapabilityShader);
-    StorageParams[StorageClassUniform].caps.push_back(CapabilityShader);
-    StorageParams[StorageClassOutput].caps.push_back(CapabilityShader);
-    StorageParams[StorageClassPrivate].caps.push_back(CapabilityShader);
-    StorageParams[StorageClassGeneric].caps.push_back(CapabilityKernel);
-    StorageParams[StorageClassAtomicCounter].caps.push_back(CapabilityAtomicStorage);
-    StorageParams[StorageClassPushConstant].caps.push_back(CapabilityShader);
-
-    // Sampler Filter & Addressing mode capabilities
-    SamplerAddressingModeParams[SamplerAddressingModeNone].caps.push_back(CapabilityKernel);
-    SamplerAddressingModeParams[SamplerAddressingModeClampToEdge].caps.push_back(CapabilityKernel);
-    SamplerAddressingModeParams[SamplerAddressingModeClamp].caps.push_back(CapabilityKernel);
-    SamplerAddressingModeParams[SamplerAddressingModeRepeat].caps.push_back(CapabilityKernel);
-    SamplerAddressingModeParams[SamplerAddressingModeRepeatMirrored].caps.push_back(CapabilityKernel);
-
-    SamplerFilterModeParams[SamplerFilterModeNearest].caps.push_back(CapabilityKernel);
-    SamplerFilterModeParams[SamplerFilterModeLinear].caps.push_back(CapabilityKernel);
-
-    // image format capabilities
-
-    // ES/Desktop float
-    ImageFormatParams[ImageFormatRgba32f].caps.push_back(CapabilityShader);
-    ImageFormatParams[ImageFormatRgba16f].caps.push_back(CapabilityShader);
-    ImageFormatParams[ImageFormatR32f].caps.push_back(CapabilityShader);
-    ImageFormatParams[ImageFormatRgba8].caps.push_back(CapabilityShader);
-    ImageFormatParams[ImageFormatRgba8Snorm].caps.push_back(CapabilityShader);
-
-    // Desktop float
-    ImageFormatParams[ImageFormatRg32f].caps.push_back(CapabilityStorageImageExtendedFormats);
-    ImageFormatParams[ImageFormatRg16f].caps.push_back(CapabilityStorageImageExtendedFormats);
-    ImageFormatParams[ImageFormatR11fG11fB10f].caps.push_back(CapabilityStorageImageExtendedFormats);
-    ImageFormatParams[ImageFormatR16f].caps.push_back(CapabilityStorageImageExtendedFormats);
-    ImageFormatParams[ImageFormatRgba16].caps.push_back(CapabilityStorageImageExtendedFormats);
-    ImageFormatParams[ImageFormatRgb10A2].caps.push_back(CapabilityStorageImageExtendedFormats);
-    ImageFormatParams[ImageFormatRg16].caps.push_back(CapabilityStorageImageExtendedFormats);
-    ImageFormatParams[ImageFormatRg8].caps.push_back(CapabilityStorageImageExtendedFormats);
-    ImageFormatParams[ImageFormatR16].caps.push_back(CapabilityStorageImageExtendedFormats);
-    ImageFormatParams[ImageFormatR8].caps.push_back(CapabilityStorageImageExtendedFormats);
-    ImageFormatParams[ImageFormatRgba16Snorm].caps.push_back(CapabilityStorageImageExtendedFormats);
-    ImageFormatParams[ImageFormatRg16Snorm].caps.push_back(CapabilityStorageImageExtendedFormats);
-    ImageFormatParams[ImageFormatRg8Snorm].caps.push_back(CapabilityStorageImageExtendedFormats);
-    ImageFormatParams[ImageFormatR16Snorm].caps.push_back(CapabilityStorageImageExtendedFormats);
-    ImageFormatParams[ImageFormatR8Snorm].caps.push_back(CapabilityStorageImageExtendedFormats);
-
-    // ES/Desktop int
-    ImageFormatParams[ImageFormatRgba32i].caps.push_back(CapabilityShader);
-    ImageFormatParams[ImageFormatRgba16i].caps.push_back(CapabilityShader);
-    ImageFormatParams[ImageFormatRgba8i].caps.push_back(CapabilityShader);
-    ImageFormatParams[ImageFormatR32i].caps.push_back(CapabilityShader);
-
-    // Desktop int
-    ImageFormatParams[ImageFormatRg32i].caps.push_back(CapabilityStorageImageExtendedFormats);
-    ImageFormatParams[ImageFormatRg16i].caps.push_back(CapabilityStorageImageExtendedFormats);
-    ImageFormatParams[ImageFormatRg8i].caps.push_back(CapabilityStorageImageExtendedFormats);
-    ImageFormatParams[ImageFormatR16i].caps.push_back(CapabilityStorageImageExtendedFormats);
-    ImageFormatParams[ImageFormatR8i].caps.push_back(CapabilityStorageImageExtendedFormats);
-
-    // ES/Desktop uint
-    ImageFormatParams[ImageFormatRgba32ui].caps.push_back(CapabilityShader);
-    ImageFormatParams[ImageFormatRgba16ui].caps.push_back(CapabilityShader);
-    ImageFormatParams[ImageFormatRgba8ui].caps.push_back(CapabilityShader);
-    ImageFormatParams[ImageFormatR32ui].caps.push_back(CapabilityShader);
-
-    // Desktop uint
-    ImageFormatParams[ImageFormatRgb10a2ui].caps.push_back(CapabilityStorageImageExtendedFormats);
-    ImageFormatParams[ImageFormatRg32ui].caps.push_back(CapabilityStorageImageExtendedFormats);
-    ImageFormatParams[ImageFormatRg16ui].caps.push_back(CapabilityStorageImageExtendedFormats);
-    ImageFormatParams[ImageFormatRg8ui].caps.push_back(CapabilityStorageImageExtendedFormats);
-    ImageFormatParams[ImageFormatR16ui].caps.push_back(CapabilityStorageImageExtendedFormats);
-    ImageFormatParams[ImageFormatR8ui].caps.push_back(CapabilityStorageImageExtendedFormats);
-
-    // image channel order capabilities
-    for (int i = 0; i < ImageChannelOrderCeiling; ++i) {
-        ImageChannelOrderParams[i].caps.push_back(CapabilityKernel);
-    }
-
-    // image channel type capabilities
-    for (int i = 0; i < ImageChannelDataTypeCeiling; ++i) {
-        ImageChannelDataTypeParams[i].caps.push_back(CapabilityKernel);
-    }
-
-    // image lookup operands
-    ImageOperandsParams[ImageOperandsBiasShift].caps.push_back(CapabilityShader);
-    ImageOperandsParams[ImageOperandsOffsetShift].caps.push_back(CapabilityImageGatherExtended);
-    ImageOperandsParams[ImageOperandsMinLodShift].caps.push_back(CapabilityMinLod);
-
-    // fast math flags capabilities
-    for (int i = 0; i < FPFastMathCeiling; ++i) {
-        FPFastMathParams[i].caps.push_back(CapabilityKernel);
-    }
-
-    // fp rounding mode capabilities
-    for (int i = 0; i < FPRoundingModeCeiling; ++i) {
-        FPRoundingModeParams[i].caps.push_back(CapabilityKernel);
-    }
-
-    // linkage types
-    for (int i = 0; i < LinkageTypeCeiling; ++i) {
-        LinkageTypeParams[i].caps.push_back(CapabilityLinkage);
-    }
-
-    // function argument types
-    for (int i = 0; i < FuncParamAttrCeiling; ++i) {
-        FuncParamAttrParams[i].caps.push_back(CapabilityKernel);
-    }
-
-    // function argument types
-    for (int i = 0; i < AccessQualifierCeiling; ++i) {
-        AccessQualifierParams[i].caps.push_back(CapabilityKernel);
-    }
-
-    ExecutionModeParams[ExecutionModeInvocations].caps.push_back(CapabilityGeometry);
-    ExecutionModeParams[ExecutionModeSpacingEqual].caps.push_back(CapabilityTessellation);
-    ExecutionModeParams[ExecutionModeSpacingFractionalEven].caps.push_back(CapabilityTessellation);
-    ExecutionModeParams[ExecutionModeSpacingFractionalOdd].caps.push_back(CapabilityTessellation);
-    ExecutionModeParams[ExecutionModeVertexOrderCw].caps.push_back(CapabilityTessellation);
-    ExecutionModeParams[ExecutionModeVertexOrderCcw].caps.push_back(CapabilityTessellation);
-    ExecutionModeParams[ExecutionModePixelCenterInteger].caps.push_back(CapabilityShader);
-    ExecutionModeParams[ExecutionModeOriginUpperLeft].caps.push_back(CapabilityShader);
-    ExecutionModeParams[ExecutionModeOriginLowerLeft].caps.push_back(CapabilityShader);
-    ExecutionModeParams[ExecutionModeEarlyFragmentTests].caps.push_back(CapabilityShader);
-    ExecutionModeParams[ExecutionModePointMode].caps.push_back(CapabilityTessellation);
-    ExecutionModeParams[ExecutionModeXfb].caps.push_back(CapabilityTransformFeedback);
-    ExecutionModeParams[ExecutionModeDepthReplacing].caps.push_back(CapabilityShader);
-    ExecutionModeParams[ExecutionModeDepthGreater].caps.push_back(CapabilityShader);
-    ExecutionModeParams[ExecutionModeDepthLess].caps.push_back(CapabilityShader);
-    ExecutionModeParams[ExecutionModeDepthUnchanged].caps.push_back(CapabilityShader);
-    ExecutionModeParams[ExecutionModeLocalSizeHint].caps.push_back(CapabilityKernel);
-    ExecutionModeParams[ExecutionModeInputPoints].caps.push_back(CapabilityGeometry);
-    ExecutionModeParams[ExecutionModeInputLines].caps.push_back(CapabilityGeometry);
-    ExecutionModeParams[ExecutionModeInputLinesAdjacency].caps.push_back(CapabilityGeometry);
-    ExecutionModeParams[ExecutionModeTriangles].caps.push_back(CapabilityGeometry);
-    ExecutionModeParams[ExecutionModeTriangles].caps.push_back(CapabilityTessellation);
-    ExecutionModeParams[ExecutionModeInputTrianglesAdjacency].caps.push_back(CapabilityGeometry);
-    ExecutionModeParams[ExecutionModeQuads].caps.push_back(CapabilityTessellation);
-    ExecutionModeParams[ExecutionModeIsolines].caps.push_back(CapabilityTessellation);
-    ExecutionModeParams[ExecutionModeOutputVertices].caps.push_back(CapabilityGeometry);
-    ExecutionModeParams[ExecutionModeOutputVertices].caps.push_back(CapabilityTessellation);
-    ExecutionModeParams[ExecutionModeOutputPoints].caps.push_back(CapabilityGeometry);
-    ExecutionModeParams[ExecutionModeOutputLineStrip].caps.push_back(CapabilityGeometry);
-    ExecutionModeParams[ExecutionModeOutputTriangleStrip].caps.push_back(CapabilityGeometry);
-    ExecutionModeParams[ExecutionModeVecTypeHint].caps.push_back(CapabilityKernel);
-    ExecutionModeParams[ExecutionModeContractionOff].caps.push_back(CapabilityKernel);
-
-    DecorationParams[DecorationRelaxedPrecision].caps.push_back(CapabilityShader);
-    DecorationParams[DecorationBlock].caps.push_back(CapabilityShader);
-    DecorationParams[DecorationBufferBlock].caps.push_back(CapabilityShader);
-    DecorationParams[DecorationRowMajor].caps.push_back(CapabilityMatrix);
-    DecorationParams[DecorationColMajor].caps.push_back(CapabilityMatrix);
-    DecorationParams[DecorationGLSLShared].caps.push_back(CapabilityShader);
-    DecorationParams[DecorationGLSLPacked].caps.push_back(CapabilityShader);
-    DecorationParams[DecorationNoPerspective].caps.push_back(CapabilityShader);
-    DecorationParams[DecorationFlat].caps.push_back(CapabilityShader);
-    DecorationParams[DecorationPatch].caps.push_back(CapabilityTessellation);
-    DecorationParams[DecorationCentroid].caps.push_back(CapabilityShader);
-    DecorationParams[DecorationSample].caps.push_back(CapabilitySampleRateShading);
-    DecorationParams[DecorationInvariant].caps.push_back(CapabilityShader);
-    DecorationParams[DecorationConstant].caps.push_back(CapabilityKernel);
-    DecorationParams[DecorationUniform].caps.push_back(CapabilityShader);
-    DecorationParams[DecorationCPacked].caps.push_back(CapabilityKernel);
-    DecorationParams[DecorationSaturatedConversion].caps.push_back(CapabilityKernel);
-    DecorationParams[DecorationStream].caps.push_back(CapabilityGeometryStreams);
-    DecorationParams[DecorationLocation].caps.push_back(CapabilityShader);
-    DecorationParams[DecorationComponent].caps.push_back(CapabilityShader);
-    DecorationParams[DecorationOffset].caps.push_back(CapabilityShader);
-    DecorationParams[DecorationIndex].caps.push_back(CapabilityShader);
-    DecorationParams[DecorationBinding].caps.push_back(CapabilityShader);
-    DecorationParams[DecorationDescriptorSet].caps.push_back(CapabilityShader);
-    DecorationParams[DecorationXfbBuffer].caps.push_back(CapabilityTransformFeedback);
-    DecorationParams[DecorationXfbStride].caps.push_back(CapabilityTransformFeedback);
-    DecorationParams[DecorationArrayStride].caps.push_back(CapabilityShader);
-    DecorationParams[DecorationMatrixStride].caps.push_back(CapabilityMatrix);
-    DecorationParams[DecorationFuncParamAttr].caps.push_back(CapabilityKernel);
-    DecorationParams[DecorationFPRoundingMode].caps.push_back(CapabilityKernel);
-    DecorationParams[DecorationFPFastMathMode].caps.push_back(CapabilityKernel);
-    DecorationParams[DecorationLinkageAttributes].caps.push_back(CapabilityLinkage);
-    DecorationParams[DecorationSpecId].caps.push_back(CapabilityShader);
-    DecorationParams[DecorationNoContraction].caps.push_back(CapabilityShader);
-    DecorationParams[DecorationInputAttachmentIndex].caps.push_back(CapabilityInputAttachment);
-    DecorationParams[DecorationAlignment].caps.push_back(CapabilityKernel);
-
-    BuiltInParams[BuiltInPosition].caps.push_back(CapabilityShader);
-    BuiltInParams[BuiltInPointSize].caps.push_back(CapabilityShader);
-    BuiltInParams[BuiltInClipDistance].caps.push_back(CapabilityClipDistance);
-    BuiltInParams[BuiltInCullDistance].caps.push_back(CapabilityCullDistance);
-
-    BuiltInParams[BuiltInVertexId].caps.push_back(CapabilityShader);
-    BuiltInParams[BuiltInVertexId].desc = "Vertex ID, which takes on values 0, 1, 2, . . . .";
-
-    BuiltInParams[BuiltInInstanceId].caps.push_back(CapabilityShader);
-    BuiltInParams[BuiltInInstanceId].desc = "Instance ID, which takes on values 0, 1, 2, . . . .";
-
-    BuiltInParams[BuiltInVertexIndex].caps.push_back(CapabilityShader);
-    BuiltInParams[BuiltInVertexIndex].desc = "Vertex index, which takes on values base, base+1, base+2, . . . .";
-
-    BuiltInParams[BuiltInInstanceIndex].caps.push_back(CapabilityShader);
-    BuiltInParams[BuiltInInstanceIndex].desc = "Instance index, which takes on values base, base+1, base+2, . . . .";
-
-    BuiltInParams[BuiltInPrimitiveId].caps.push_back(CapabilityGeometry);
-    BuiltInParams[BuiltInPrimitiveId].caps.push_back(CapabilityTessellation);
-    BuiltInParams[BuiltInInvocationId].caps.push_back(CapabilityGeometry);
-    BuiltInParams[BuiltInInvocationId].caps.push_back(CapabilityTessellation);
-    BuiltInParams[BuiltInLayer].caps.push_back(CapabilityGeometry);
-    BuiltInParams[BuiltInViewportIndex].caps.push_back(CapabilityMultiViewport);
-    BuiltInParams[BuiltInTessLevelOuter].caps.push_back(CapabilityTessellation);
-    BuiltInParams[BuiltInTessLevelInner].caps.push_back(CapabilityTessellation);
-    BuiltInParams[BuiltInTessCoord].caps.push_back(CapabilityTessellation);
-    BuiltInParams[BuiltInPatchVertices].caps.push_back(CapabilityTessellation);
-    BuiltInParams[BuiltInFragCoord].caps.push_back(CapabilityShader);
-    BuiltInParams[BuiltInPointCoord].caps.push_back(CapabilityShader);
-    BuiltInParams[BuiltInFrontFacing].caps.push_back(CapabilityShader);
-    BuiltInParams[BuiltInSampleId].caps.push_back(CapabilitySampleRateShading);
-    BuiltInParams[BuiltInSamplePosition].caps.push_back(CapabilitySampleRateShading);
-    BuiltInParams[BuiltInSampleMask].caps.push_back(CapabilitySampleRateShading);
-    BuiltInParams[BuiltInFragDepth].caps.push_back(CapabilityShader);
-    BuiltInParams[BuiltInHelperInvocation].caps.push_back(CapabilityShader);
-    BuiltInParams[BuiltInWorkDim].caps.push_back(CapabilityKernel);
-    BuiltInParams[BuiltInGlobalSize].caps.push_back(CapabilityKernel);
-    BuiltInParams[BuiltInEnqueuedWorkgroupSize].caps.push_back(CapabilityKernel);
-    BuiltInParams[BuiltInGlobalOffset].caps.push_back(CapabilityKernel);
-    BuiltInParams[BuiltInGlobalLinearId].caps.push_back(CapabilityKernel);
-
-    BuiltInParams[BuiltInSubgroupSize].caps.push_back(CapabilityKernel);
-    BuiltInParams[BuiltInSubgroupMaxSize].caps.push_back(CapabilityKernel);
-    BuiltInParams[BuiltInNumSubgroups].caps.push_back(CapabilityKernel);
-    BuiltInParams[BuiltInNumEnqueuedSubgroups].caps.push_back(CapabilityKernel);
-    BuiltInParams[BuiltInSubgroupId].caps.push_back(CapabilityKernel);
-    BuiltInParams[BuiltInSubgroupLocalInvocationId].caps.push_back(CapabilityKernel);
-
-    DimensionalityParams[Dim1D].caps.push_back(CapabilitySampled1D);
-    DimensionalityParams[DimCube].caps.push_back(CapabilityShader);
-    DimensionalityParams[DimRect].caps.push_back(CapabilitySampledRect);
-    DimensionalityParams[DimBuffer].caps.push_back(CapabilitySampledBuffer);
-    DimensionalityParams[DimSubpassData].caps.push_back(CapabilityInputAttachment);
-
-    // Group Operations
-    for (int i = 0; i < GroupOperationCeiling; ++i) {
-        GroupOperationParams[i].caps.push_back(CapabilityKernel);
-    }
-
-    // Enqueue flags
-    for (int i = 0; i < KernelEnqueueFlagsCeiling; ++i) {
-        KernelEnqueueFlagsParams[i].caps.push_back(CapabilityKernel);
-    }
-
-    // Profiling info
-    KernelProfilingInfoParams[0].caps.push_back(CapabilityKernel);
+    OperandClassParams[OperandScope].set(0, ScopeString, nullptr);
+    OperandClassParams[OperandGroupOperation].set(0, GroupOperationString, nullptr);
+    OperandClassParams[OperandKernelEnqueueFlags].set(0, KernelEnqueueFlagsString, nullptr);
+    OperandClassParams[OperandKernelProfilingInfo].set(0, KernelProfilingInfoString, nullptr, true);
+    OperandClassParams[OperandCapability].set(0, CapabilityString, nullptr);
+    OperandClassParams[OperandOpcode].set(OpCodeMask + 1, OpcodeString, 0);
 
     // set name of operator, an initial set of <id> style operands, and the description
 
@@ -1761,7 +1557,6 @@
     InstructionDesc[OpTypeVector].operands.push(OperandId, "'Component Type'");
     InstructionDesc[OpTypeVector].operands.push(OperandLiteralNumber, "'Component Count'");
 
-    InstructionDesc[OpTypeMatrix].capabilities.push_back(CapabilityMatrix);
     InstructionDesc[OpTypeMatrix].operands.push(OperandId, "'Column Type'");
     InstructionDesc[OpTypeMatrix].operands.push(OperandLiteralNumber, "'Column Count'");
 
@@ -1779,31 +1574,19 @@
     InstructionDesc[OpTypeArray].operands.push(OperandId, "'Element Type'");
     InstructionDesc[OpTypeArray].operands.push(OperandId, "'Length'");
 
-    InstructionDesc[OpTypeRuntimeArray].capabilities.push_back(CapabilityShader);
     InstructionDesc[OpTypeRuntimeArray].operands.push(OperandId, "'Element Type'");
 
     InstructionDesc[OpTypeStruct].operands.push(OperandVariableIds, "'Member 0 type', +\n'member 1 type', +\n...");
 
-    InstructionDesc[OpTypeOpaque].capabilities.push_back(CapabilityKernel);
     InstructionDesc[OpTypeOpaque].operands.push(OperandLiteralString, "The name of the opaque type.");
 
     InstructionDesc[OpTypePointer].operands.push(OperandStorage, "");
     InstructionDesc[OpTypePointer].operands.push(OperandId, "'Type'");
 
-    InstructionDesc[OpTypeForwardPointer].capabilities.push_back(CapabilityAddresses);
     InstructionDesc[OpTypeForwardPointer].operands.push(OperandId, "'Pointer Type'");
     InstructionDesc[OpTypeForwardPointer].operands.push(OperandStorage, "");
 
-    InstructionDesc[OpTypeEvent].capabilities.push_back(CapabilityKernel);
-
-    InstructionDesc[OpTypeDeviceEvent].capabilities.push_back(CapabilityDeviceEnqueue);
-
-    InstructionDesc[OpTypeReserveId].capabilities.push_back(CapabilityPipes);
-
-    InstructionDesc[OpTypeQueue].capabilities.push_back(CapabilityDeviceEnqueue);
-
     InstructionDesc[OpTypePipe].operands.push(OperandAccessQualifier, "'Qualifier'");
-    InstructionDesc[OpTypePipe].capabilities.push_back(CapabilityPipes);
 
     InstructionDesc[OpTypeFunction].operands.push(OperandId, "'Return Type'");
     InstructionDesc[OpTypeFunction].operands.push(OperandVariableIds, "'Parameter 0 Type', +\n'Parameter 1 Type', +\n...");
@@ -1812,7 +1595,6 @@
 
     InstructionDesc[OpConstantComposite].operands.push(OperandVariableIds, "'Constituents'");
 
-    InstructionDesc[OpConstantSampler].capabilities.push_back(CapabilityLiteralSampler);
     InstructionDesc[OpConstantSampler].operands.push(OperandSamplerAddressingMode, "");
     InstructionDesc[OpConstantSampler].operands.push(OperandLiteralNumber, "'Param'");
     InstructionDesc[OpConstantSampler].operands.push(OperandSamplerFilterMode, "");
@@ -1839,10 +1621,14 @@
 
     InstructionDesc[OpLoad].operands.push(OperandId, "'Pointer'");
     InstructionDesc[OpLoad].operands.push(OperandMemoryAccess, "", true);
+    InstructionDesc[OpLoad].operands.push(OperandLiteralNumber, "", true);
+    InstructionDesc[OpLoad].operands.push(OperandId, "", true);
 
     InstructionDesc[OpStore].operands.push(OperandId, "'Pointer'");
     InstructionDesc[OpStore].operands.push(OperandId, "'Object'");
     InstructionDesc[OpStore].operands.push(OperandMemoryAccess, "", true);
+    InstructionDesc[OpStore].operands.push(OperandLiteralNumber, "", true);
+    InstructionDesc[OpStore].operands.push(OperandId, "", true);
 
     InstructionDesc[OpPhi].operands.push(OperandVariableIds, "'Variable, Parent, ...'");
 
@@ -1850,11 +1636,24 @@
     InstructionDesc[OpDecorate].operands.push(OperandDecoration, "");
     InstructionDesc[OpDecorate].operands.push(OperandVariableLiterals, "See <<Decoration,'Decoration'>>.");
 
+    InstructionDesc[OpDecorateId].operands.push(OperandId, "'Target'");
+    InstructionDesc[OpDecorateId].operands.push(OperandDecoration, "");
+    InstructionDesc[OpDecorateId].operands.push(OperandVariableIds, "See <<Decoration,'Decoration'>>.");
+
+    InstructionDesc[OpDecorateStringGOOGLE].operands.push(OperandId, "'Target'");
+    InstructionDesc[OpDecorateStringGOOGLE].operands.push(OperandDecoration, "");
+    InstructionDesc[OpDecorateStringGOOGLE].operands.push(OperandLiteralString, "'Literal String'");
+
     InstructionDesc[OpMemberDecorate].operands.push(OperandId, "'Structure Type'");
     InstructionDesc[OpMemberDecorate].operands.push(OperandLiteralNumber, "'Member'");
     InstructionDesc[OpMemberDecorate].operands.push(OperandDecoration, "");
     InstructionDesc[OpMemberDecorate].operands.push(OperandVariableLiterals, "See <<Decoration,'Decoration'>>.");
 
+    InstructionDesc[OpMemberDecorateStringGOOGLE].operands.push(OperandId, "'Structure Type'");
+    InstructionDesc[OpMemberDecorateStringGOOGLE].operands.push(OperandLiteralNumber, "'Member'");
+    InstructionDesc[OpMemberDecorateStringGOOGLE].operands.push(OperandDecoration, "");
+    InstructionDesc[OpMemberDecorateStringGOOGLE].operands.push(OperandLiteralString, "'Literal String'");
+
     InstructionDesc[OpGroupDecorate].operands.push(OperandId, "'Decoration Group'");
     InstructionDesc[OpGroupDecorate].operands.push(OperandVariableIds, "'Targets'");
 
@@ -1892,8 +1691,6 @@
     InstructionDesc[OpCopyMemorySized].operands.push(OperandId, "'Size'");
     InstructionDesc[OpCopyMemorySized].operands.push(OperandMemoryAccess, "", true);
 
-    InstructionDesc[OpCopyMemorySized].capabilities.push_back(CapabilityAddresses);
-
     InstructionDesc[OpSampledImage].operands.push(OperandId, "'Image'");
     InstructionDesc[OpSampledImage].operands.push(OperandId, "'Sampler'");
 
@@ -1914,7 +1711,6 @@
     InstructionDesc[OpImageSampleImplicitLod].operands.push(OperandId, "'Coordinate'");
     InstructionDesc[OpImageSampleImplicitLod].operands.push(OperandImageOperands, "", true);
     InstructionDesc[OpImageSampleImplicitLod].operands.push(OperandVariableIds, "", true);
-    InstructionDesc[OpImageSampleImplicitLod].capabilities.push_back(CapabilityShader);
 
     InstructionDesc[OpImageSampleExplicitLod].operands.push(OperandId, "'Sampled Image'");
     InstructionDesc[OpImageSampleExplicitLod].operands.push(OperandId, "'Coordinate'");
@@ -1926,40 +1722,34 @@
     InstructionDesc[OpImageSampleDrefImplicitLod].operands.push(OperandId, "'D~ref~'");
     InstructionDesc[OpImageSampleDrefImplicitLod].operands.push(OperandImageOperands, "", true);
     InstructionDesc[OpImageSampleDrefImplicitLod].operands.push(OperandVariableIds, "", true);
-    InstructionDesc[OpImageSampleDrefImplicitLod].capabilities.push_back(CapabilityShader);
 
     InstructionDesc[OpImageSampleDrefExplicitLod].operands.push(OperandId, "'Sampled Image'");
     InstructionDesc[OpImageSampleDrefExplicitLod].operands.push(OperandId, "'Coordinate'");
     InstructionDesc[OpImageSampleDrefExplicitLod].operands.push(OperandId, "'D~ref~'");
     InstructionDesc[OpImageSampleDrefExplicitLod].operands.push(OperandImageOperands, "", true);
     InstructionDesc[OpImageSampleDrefExplicitLod].operands.push(OperandVariableIds, "", true);
-    InstructionDesc[OpImageSampleDrefExplicitLod].capabilities.push_back(CapabilityShader);
 
     InstructionDesc[OpImageSampleProjImplicitLod].operands.push(OperandId, "'Sampled Image'");
     InstructionDesc[OpImageSampleProjImplicitLod].operands.push(OperandId, "'Coordinate'");
     InstructionDesc[OpImageSampleProjImplicitLod].operands.push(OperandImageOperands, "", true);
     InstructionDesc[OpImageSampleProjImplicitLod].operands.push(OperandVariableIds, "", true);
-    InstructionDesc[OpImageSampleProjImplicitLod].capabilities.push_back(CapabilityShader);
 
     InstructionDesc[OpImageSampleProjExplicitLod].operands.push(OperandId, "'Sampled Image'");
     InstructionDesc[OpImageSampleProjExplicitLod].operands.push(OperandId, "'Coordinate'");
     InstructionDesc[OpImageSampleProjExplicitLod].operands.push(OperandImageOperands, "", true);
     InstructionDesc[OpImageSampleProjExplicitLod].operands.push(OperandVariableIds, "", true);
-    InstructionDesc[OpImageSampleProjExplicitLod].capabilities.push_back(CapabilityShader);
 
     InstructionDesc[OpImageSampleProjDrefImplicitLod].operands.push(OperandId, "'Sampled Image'");
     InstructionDesc[OpImageSampleProjDrefImplicitLod].operands.push(OperandId, "'Coordinate'");
     InstructionDesc[OpImageSampleProjDrefImplicitLod].operands.push(OperandId, "'D~ref~'");
     InstructionDesc[OpImageSampleProjDrefImplicitLod].operands.push(OperandImageOperands, "", true);
     InstructionDesc[OpImageSampleProjDrefImplicitLod].operands.push(OperandVariableIds, "", true);
-    InstructionDesc[OpImageSampleProjDrefImplicitLod].capabilities.push_back(CapabilityShader);
 
     InstructionDesc[OpImageSampleProjDrefExplicitLod].operands.push(OperandId, "'Sampled Image'");
     InstructionDesc[OpImageSampleProjDrefExplicitLod].operands.push(OperandId, "'Coordinate'");
     InstructionDesc[OpImageSampleProjDrefExplicitLod].operands.push(OperandId, "'D~ref~'");
     InstructionDesc[OpImageSampleProjDrefExplicitLod].operands.push(OperandImageOperands, "", true);
     InstructionDesc[OpImageSampleProjDrefExplicitLod].operands.push(OperandVariableIds, "", true);
-    InstructionDesc[OpImageSampleProjDrefExplicitLod].capabilities.push_back(CapabilityShader);
 
     InstructionDesc[OpImageFetch].operands.push(OperandId, "'Image'");
     InstructionDesc[OpImageFetch].operands.push(OperandId, "'Coordinate'");
@@ -1971,122 +1761,96 @@
     InstructionDesc[OpImageGather].operands.push(OperandId, "'Component'");
     InstructionDesc[OpImageGather].operands.push(OperandImageOperands, "", true);
     InstructionDesc[OpImageGather].operands.push(OperandVariableIds, "", true);
-    InstructionDesc[OpImageGather].capabilities.push_back(CapabilityShader);
 
     InstructionDesc[OpImageDrefGather].operands.push(OperandId, "'Sampled Image'");
     InstructionDesc[OpImageDrefGather].operands.push(OperandId, "'Coordinate'");
     InstructionDesc[OpImageDrefGather].operands.push(OperandId, "'D~ref~'");
     InstructionDesc[OpImageDrefGather].operands.push(OperandImageOperands, "", true);
     InstructionDesc[OpImageDrefGather].operands.push(OperandVariableIds, "", true);
-    InstructionDesc[OpImageDrefGather].capabilities.push_back(CapabilityShader);
 
     InstructionDesc[OpImageSparseSampleImplicitLod].operands.push(OperandId, "'Sampled Image'");
     InstructionDesc[OpImageSparseSampleImplicitLod].operands.push(OperandId, "'Coordinate'");
     InstructionDesc[OpImageSparseSampleImplicitLod].operands.push(OperandImageOperands, "", true);
     InstructionDesc[OpImageSparseSampleImplicitLod].operands.push(OperandVariableIds, "", true);
-    InstructionDesc[OpImageSparseSampleImplicitLod].capabilities.push_back(CapabilitySparseResidency);
 
     InstructionDesc[OpImageSparseSampleExplicitLod].operands.push(OperandId, "'Sampled Image'");
     InstructionDesc[OpImageSparseSampleExplicitLod].operands.push(OperandId, "'Coordinate'");
     InstructionDesc[OpImageSparseSampleExplicitLod].operands.push(OperandImageOperands, "", true);
     InstructionDesc[OpImageSparseSampleExplicitLod].operands.push(OperandVariableIds, "", true);
-    InstructionDesc[OpImageSparseSampleExplicitLod].capabilities.push_back(CapabilitySparseResidency);
 
     InstructionDesc[OpImageSparseSampleDrefImplicitLod].operands.push(OperandId, "'Sampled Image'");
     InstructionDesc[OpImageSparseSampleDrefImplicitLod].operands.push(OperandId, "'Coordinate'");
     InstructionDesc[OpImageSparseSampleDrefImplicitLod].operands.push(OperandId, "'D~ref~'");
     InstructionDesc[OpImageSparseSampleDrefImplicitLod].operands.push(OperandImageOperands, "", true);
     InstructionDesc[OpImageSparseSampleDrefImplicitLod].operands.push(OperandVariableIds, "", true);
-    InstructionDesc[OpImageSparseSampleDrefImplicitLod].capabilities.push_back(CapabilitySparseResidency);
 
     InstructionDesc[OpImageSparseSampleDrefExplicitLod].operands.push(OperandId, "'Sampled Image'");
     InstructionDesc[OpImageSparseSampleDrefExplicitLod].operands.push(OperandId, "'Coordinate'");
     InstructionDesc[OpImageSparseSampleDrefExplicitLod].operands.push(OperandId, "'D~ref~'");
     InstructionDesc[OpImageSparseSampleDrefExplicitLod].operands.push(OperandImageOperands, "", true);
     InstructionDesc[OpImageSparseSampleDrefExplicitLod].operands.push(OperandVariableIds, "", true);
-    InstructionDesc[OpImageSparseSampleDrefExplicitLod].capabilities.push_back(CapabilitySparseResidency);
 
     InstructionDesc[OpImageSparseSampleProjImplicitLod].operands.push(OperandId, "'Sampled Image'");
     InstructionDesc[OpImageSparseSampleProjImplicitLod].operands.push(OperandId, "'Coordinate'");
     InstructionDesc[OpImageSparseSampleProjImplicitLod].operands.push(OperandImageOperands, "", true);
     InstructionDesc[OpImageSparseSampleProjImplicitLod].operands.push(OperandVariableIds, "", true);
-    InstructionDesc[OpImageSparseSampleProjImplicitLod].capabilities.push_back(CapabilitySparseResidency);
 
     InstructionDesc[OpImageSparseSampleProjExplicitLod].operands.push(OperandId, "'Sampled Image'");
     InstructionDesc[OpImageSparseSampleProjExplicitLod].operands.push(OperandId, "'Coordinate'");
     InstructionDesc[OpImageSparseSampleProjExplicitLod].operands.push(OperandImageOperands, "", true);
     InstructionDesc[OpImageSparseSampleProjExplicitLod].operands.push(OperandVariableIds, "", true);
-    InstructionDesc[OpImageSparseSampleProjExplicitLod].capabilities.push_back(CapabilitySparseResidency);
 
     InstructionDesc[OpImageSparseSampleProjDrefImplicitLod].operands.push(OperandId, "'Sampled Image'");
     InstructionDesc[OpImageSparseSampleProjDrefImplicitLod].operands.push(OperandId, "'Coordinate'");
     InstructionDesc[OpImageSparseSampleProjDrefImplicitLod].operands.push(OperandId, "'D~ref~'");
     InstructionDesc[OpImageSparseSampleProjDrefImplicitLod].operands.push(OperandImageOperands, "", true);
     InstructionDesc[OpImageSparseSampleProjDrefImplicitLod].operands.push(OperandVariableIds, "", true);
-    InstructionDesc[OpImageSparseSampleProjDrefImplicitLod].capabilities.push_back(CapabilitySparseResidency);
 
     InstructionDesc[OpImageSparseSampleProjDrefExplicitLod].operands.push(OperandId, "'Sampled Image'");
     InstructionDesc[OpImageSparseSampleProjDrefExplicitLod].operands.push(OperandId, "'Coordinate'");
     InstructionDesc[OpImageSparseSampleProjDrefExplicitLod].operands.push(OperandId, "'D~ref~'");
     InstructionDesc[OpImageSparseSampleProjDrefExplicitLod].operands.push(OperandImageOperands, "", true);
     InstructionDesc[OpImageSparseSampleProjDrefExplicitLod].operands.push(OperandVariableIds, "", true);
-    InstructionDesc[OpImageSparseSampleProjDrefExplicitLod].capabilities.push_back(CapabilitySparseResidency);
 
     InstructionDesc[OpImageSparseFetch].operands.push(OperandId, "'Image'");
     InstructionDesc[OpImageSparseFetch].operands.push(OperandId, "'Coordinate'");
     InstructionDesc[OpImageSparseFetch].operands.push(OperandImageOperands, "", true);
     InstructionDesc[OpImageSparseFetch].operands.push(OperandVariableIds, "", true);
-    InstructionDesc[OpImageSparseFetch].capabilities.push_back(CapabilitySparseResidency);
 
     InstructionDesc[OpImageSparseGather].operands.push(OperandId, "'Sampled Image'");
     InstructionDesc[OpImageSparseGather].operands.push(OperandId, "'Coordinate'");
     InstructionDesc[OpImageSparseGather].operands.push(OperandId, "'Component'");
     InstructionDesc[OpImageSparseGather].operands.push(OperandImageOperands, "", true);
     InstructionDesc[OpImageSparseGather].operands.push(OperandVariableIds, "", true);
-    InstructionDesc[OpImageSparseGather].capabilities.push_back(CapabilitySparseResidency);
 
     InstructionDesc[OpImageSparseDrefGather].operands.push(OperandId, "'Sampled Image'");
     InstructionDesc[OpImageSparseDrefGather].operands.push(OperandId, "'Coordinate'");
     InstructionDesc[OpImageSparseDrefGather].operands.push(OperandId, "'D~ref~'");
     InstructionDesc[OpImageSparseDrefGather].operands.push(OperandImageOperands, "", true);
     InstructionDesc[OpImageSparseDrefGather].operands.push(OperandVariableIds, "", true);
-    InstructionDesc[OpImageSparseDrefGather].capabilities.push_back(CapabilitySparseResidency);
 
     InstructionDesc[OpImageSparseRead].operands.push(OperandId, "'Image'");
     InstructionDesc[OpImageSparseRead].operands.push(OperandId, "'Coordinate'");
     InstructionDesc[OpImageSparseRead].operands.push(OperandImageOperands, "", true);
     InstructionDesc[OpImageSparseRead].operands.push(OperandVariableIds, "", true);
-    InstructionDesc[OpImageSparseRead].capabilities.push_back(CapabilitySparseResidency);
 
     InstructionDesc[OpImageSparseTexelsResident].operands.push(OperandId, "'Resident Code'");
-    InstructionDesc[OpImageSparseTexelsResident].capabilities.push_back(CapabilitySparseResidency);
 
     InstructionDesc[OpImageQuerySizeLod].operands.push(OperandId, "'Image'");
     InstructionDesc[OpImageQuerySizeLod].operands.push(OperandId, "'Level of Detail'");
-    InstructionDesc[OpImageQuerySizeLod].capabilities.push_back(CapabilityKernel);
-    InstructionDesc[OpImageQuerySizeLod].capabilities.push_back(CapabilityImageQuery);
 
     InstructionDesc[OpImageQuerySize].operands.push(OperandId, "'Image'");
-    InstructionDesc[OpImageQuerySize].capabilities.push_back(CapabilityKernel);
-    InstructionDesc[OpImageQuerySize].capabilities.push_back(CapabilityImageQuery);
 
     InstructionDesc[OpImageQueryLod].operands.push(OperandId, "'Image'");
     InstructionDesc[OpImageQueryLod].operands.push(OperandId, "'Coordinate'");
-    InstructionDesc[OpImageQueryLod].capabilities.push_back(CapabilityImageQuery);
 
     InstructionDesc[OpImageQueryLevels].operands.push(OperandId, "'Image'");
-    InstructionDesc[OpImageQueryLevels].capabilities.push_back(CapabilityKernel);
-    InstructionDesc[OpImageQueryLevels].capabilities.push_back(CapabilityImageQuery);
 
     InstructionDesc[OpImageQuerySamples].operands.push(OperandId, "'Image'");
-    InstructionDesc[OpImageQuerySamples].capabilities.push_back(CapabilityKernel);
-    InstructionDesc[OpImageQuerySamples].capabilities.push_back(CapabilityImageQuery);
 
     InstructionDesc[OpImageQueryFormat].operands.push(OperandId, "'Image'");
-    InstructionDesc[OpImageQueryFormat].capabilities.push_back(CapabilityKernel);
 
     InstructionDesc[OpImageQueryOrder].operands.push(OperandId, "'Image'");
-    InstructionDesc[OpImageQueryOrder].capabilities.push_back(CapabilityKernel);
 
     InstructionDesc[OpAccessChain].operands.push(OperandId, "'Base'");
     InstructionDesc[OpAccessChain].operands.push(OperandVariableIds, "'Indexes'");
@@ -2097,12 +1861,10 @@
     InstructionDesc[OpPtrAccessChain].operands.push(OperandId, "'Base'");
     InstructionDesc[OpPtrAccessChain].operands.push(OperandId, "'Element'");
     InstructionDesc[OpPtrAccessChain].operands.push(OperandVariableIds, "'Indexes'");
-    InstructionDesc[OpPtrAccessChain].capabilities.push_back(CapabilityAddresses);
 
     InstructionDesc[OpInBoundsPtrAccessChain].operands.push(OperandId, "'Base'");
     InstructionDesc[OpInBoundsPtrAccessChain].operands.push(OperandId, "'Element'");
     InstructionDesc[OpInBoundsPtrAccessChain].operands.push(OperandVariableIds, "'Indexes'");
-    InstructionDesc[OpInBoundsPtrAccessChain].capabilities.push_back(CapabilityAddresses);
 
     InstructionDesc[OpSNegate].operands.push(OperandId, "'Operand'");
 
@@ -2129,65 +1891,49 @@
     InstructionDesc[OpFConvert].operands.push(OperandId, "'Float Value'");
 
     InstructionDesc[OpSatConvertSToU].operands.push(OperandId, "'Signed Value'");
-    InstructionDesc[OpSatConvertSToU].capabilities.push_back(CapabilityKernel);
 
     InstructionDesc[OpSatConvertUToS].operands.push(OperandId, "'Unsigned Value'");
-    InstructionDesc[OpSatConvertUToS].capabilities.push_back(CapabilityKernel);
 
     InstructionDesc[OpConvertPtrToU].operands.push(OperandId, "'Pointer'");
-    InstructionDesc[OpConvertPtrToU].capabilities.push_back(CapabilityAddresses);
 
     InstructionDesc[OpConvertUToPtr].operands.push(OperandId, "'Integer Value'");
-    InstructionDesc[OpConvertUToPtr].capabilities.push_back(CapabilityAddresses);
 
     InstructionDesc[OpPtrCastToGeneric].operands.push(OperandId, "'Pointer'");
-    InstructionDesc[OpPtrCastToGeneric].capabilities.push_back(CapabilityKernel);
 
     InstructionDesc[OpGenericCastToPtr].operands.push(OperandId, "'Pointer'");
-    InstructionDesc[OpGenericCastToPtr].capabilities.push_back(CapabilityKernel);
 
     InstructionDesc[OpGenericCastToPtrExplicit].operands.push(OperandId, "'Pointer'");
     InstructionDesc[OpGenericCastToPtrExplicit].operands.push(OperandStorage, "'Storage'");
-    InstructionDesc[OpGenericCastToPtrExplicit].capabilities.push_back(CapabilityKernel);
 
     InstructionDesc[OpGenericPtrMemSemantics].operands.push(OperandId, "'Pointer'");
-    InstructionDesc[OpGenericPtrMemSemantics].capabilities.push_back(CapabilityKernel);
 
     InstructionDesc[OpBitcast].operands.push(OperandId, "'Operand'");
 
     InstructionDesc[OpQuantizeToF16].operands.push(OperandId, "'Value'");
 
-    InstructionDesc[OpTranspose].capabilities.push_back(CapabilityMatrix);
     InstructionDesc[OpTranspose].operands.push(OperandId, "'Matrix'");
 
     InstructionDesc[OpIsNan].operands.push(OperandId, "'x'");
 
     InstructionDesc[OpIsInf].operands.push(OperandId, "'x'");
 
-    InstructionDesc[OpIsFinite].capabilities.push_back(CapabilityKernel);
     InstructionDesc[OpIsFinite].operands.push(OperandId, "'x'");
 
-    InstructionDesc[OpIsNormal].capabilities.push_back(CapabilityKernel);
     InstructionDesc[OpIsNormal].operands.push(OperandId, "'x'");
 
-    InstructionDesc[OpSignBitSet].capabilities.push_back(CapabilityKernel);
     InstructionDesc[OpSignBitSet].operands.push(OperandId, "'x'");
 
-    InstructionDesc[OpLessOrGreater].capabilities.push_back(CapabilityKernel);
     InstructionDesc[OpLessOrGreater].operands.push(OperandId, "'x'");
     InstructionDesc[OpLessOrGreater].operands.push(OperandId, "'y'");
 
-    InstructionDesc[OpOrdered].capabilities.push_back(CapabilityKernel);
     InstructionDesc[OpOrdered].operands.push(OperandId, "'x'");
     InstructionDesc[OpOrdered].operands.push(OperandId, "'y'");
 
-    InstructionDesc[OpUnordered].capabilities.push_back(CapabilityKernel);
     InstructionDesc[OpUnordered].operands.push(OperandId, "'x'");
     InstructionDesc[OpUnordered].operands.push(OperandId, "'y'");
 
     InstructionDesc[OpArrayLength].operands.push(OperandId, "'Structure'");
     InstructionDesc[OpArrayLength].operands.push(OperandLiteralNumber, "'Array member'");
-    InstructionDesc[OpArrayLength].capabilities.push_back(CapabilityShader);
 
     InstructionDesc[OpIAdd].operands.push(OperandId, "'Operand 1'");
     InstructionDesc[OpIAdd].operands.push(OperandId, "'Operand 2'");
@@ -2234,23 +1980,18 @@
     InstructionDesc[OpVectorTimesScalar].operands.push(OperandId, "'Vector'");
     InstructionDesc[OpVectorTimesScalar].operands.push(OperandId, "'Scalar'");
 
-    InstructionDesc[OpMatrixTimesScalar].capabilities.push_back(CapabilityMatrix);
     InstructionDesc[OpMatrixTimesScalar].operands.push(OperandId, "'Matrix'");
     InstructionDesc[OpMatrixTimesScalar].operands.push(OperandId, "'Scalar'");
 
-    InstructionDesc[OpVectorTimesMatrix].capabilities.push_back(CapabilityMatrix);
     InstructionDesc[OpVectorTimesMatrix].operands.push(OperandId, "'Vector'");
     InstructionDesc[OpVectorTimesMatrix].operands.push(OperandId, "'Matrix'");
 
-    InstructionDesc[OpMatrixTimesVector].capabilities.push_back(CapabilityMatrix);
     InstructionDesc[OpMatrixTimesVector].operands.push(OperandId, "'Matrix'");
     InstructionDesc[OpMatrixTimesVector].operands.push(OperandId, "'Vector'");
 
-    InstructionDesc[OpMatrixTimesMatrix].capabilities.push_back(CapabilityMatrix);
     InstructionDesc[OpMatrixTimesMatrix].operands.push(OperandId, "'LeftMatrix'");
     InstructionDesc[OpMatrixTimesMatrix].operands.push(OperandId, "'RightMatrix'");
 
-    InstructionDesc[OpOuterProduct].capabilities.push_back(CapabilityMatrix);
     InstructionDesc[OpOuterProduct].operands.push(OperandId, "'Vector 1'");
     InstructionDesc[OpOuterProduct].operands.push(OperandId, "'Vector 2'");
 
@@ -2301,23 +2042,19 @@
     InstructionDesc[OpBitwiseAnd].operands.push(OperandId, "'Operand 1'");
     InstructionDesc[OpBitwiseAnd].operands.push(OperandId, "'Operand 2'");
 
-    InstructionDesc[OpBitFieldInsert].capabilities.push_back(CapabilityShader);
     InstructionDesc[OpBitFieldInsert].operands.push(OperandId, "'Base'");
     InstructionDesc[OpBitFieldInsert].operands.push(OperandId, "'Insert'");
     InstructionDesc[OpBitFieldInsert].operands.push(OperandId, "'Offset'");
     InstructionDesc[OpBitFieldInsert].operands.push(OperandId, "'Count'");
-    
-    InstructionDesc[OpBitFieldSExtract].capabilities.push_back(CapabilityShader);
+
     InstructionDesc[OpBitFieldSExtract].operands.push(OperandId, "'Base'");
     InstructionDesc[OpBitFieldSExtract].operands.push(OperandId, "'Offset'");
     InstructionDesc[OpBitFieldSExtract].operands.push(OperandId, "'Count'");
     
-    InstructionDesc[OpBitFieldUExtract].capabilities.push_back(CapabilityShader);
     InstructionDesc[OpBitFieldUExtract].operands.push(OperandId, "'Base'");
     InstructionDesc[OpBitFieldUExtract].operands.push(OperandId, "'Offset'");
     InstructionDesc[OpBitFieldUExtract].operands.push(OperandId, "'Count'");
     
-    InstructionDesc[OpBitReverse].capabilities.push_back(CapabilityShader);
     InstructionDesc[OpBitReverse].operands.push(OperandId, "'Base'");
 
     InstructionDesc[OpBitCount].operands.push(OperandId, "'Base'");
@@ -2392,42 +2129,27 @@
     InstructionDesc[OpFUnordGreaterThanEqual].operands.push(OperandId, "'Operand 1'");
     InstructionDesc[OpFUnordGreaterThanEqual].operands.push(OperandId, "'Operand 2'");
 
-    InstructionDesc[OpDPdx].capabilities.push_back(CapabilityShader);
     InstructionDesc[OpDPdx].operands.push(OperandId, "'P'");
 
-    InstructionDesc[OpDPdy].capabilities.push_back(CapabilityShader);
     InstructionDesc[OpDPdy].operands.push(OperandId, "'P'");
 
-    InstructionDesc[OpFwidth].capabilities.push_back(CapabilityShader);
     InstructionDesc[OpFwidth].operands.push(OperandId, "'P'");
 
-    InstructionDesc[OpDPdxFine].capabilities.push_back(CapabilityDerivativeControl);
     InstructionDesc[OpDPdxFine].operands.push(OperandId, "'P'");
 
-    InstructionDesc[OpDPdyFine].capabilities.push_back(CapabilityDerivativeControl);
     InstructionDesc[OpDPdyFine].operands.push(OperandId, "'P'");
 
-    InstructionDesc[OpFwidthFine].capabilities.push_back(CapabilityDerivativeControl);
     InstructionDesc[OpFwidthFine].operands.push(OperandId, "'P'");
 
-    InstructionDesc[OpDPdxCoarse].capabilities.push_back(CapabilityDerivativeControl);
     InstructionDesc[OpDPdxCoarse].operands.push(OperandId, "'P'");
 
-    InstructionDesc[OpDPdyCoarse].capabilities.push_back(CapabilityDerivativeControl);
     InstructionDesc[OpDPdyCoarse].operands.push(OperandId, "'P'");
 
-    InstructionDesc[OpFwidthCoarse].capabilities.push_back(CapabilityDerivativeControl);
     InstructionDesc[OpFwidthCoarse].operands.push(OperandId, "'P'");
 
-    InstructionDesc[OpEmitVertex].capabilities.push_back(CapabilityGeometry);
-
-    InstructionDesc[OpEndPrimitive].capabilities.push_back(CapabilityGeometry);
-
     InstructionDesc[OpEmitStreamVertex].operands.push(OperandId, "'Stream'");
-    InstructionDesc[OpEmitStreamVertex].capabilities.push_back(CapabilityGeometryStreams);
 
     InstructionDesc[OpEndStreamPrimitive].operands.push(OperandId, "'Stream'");
-    InstructionDesc[OpEndStreamPrimitive].capabilities.push_back(CapabilityGeometryStreams);
 
     InstructionDesc[OpControlBarrier].operands.push(OperandScope, "'Execution'");
     InstructionDesc[OpControlBarrier].operands.push(OperandScope, "'Memory'");
@@ -2467,7 +2189,6 @@
     InstructionDesc[OpAtomicCompareExchangeWeak].operands.push(OperandMemorySemantics, "'Unequal'");
     InstructionDesc[OpAtomicCompareExchangeWeak].operands.push(OperandId, "'Value'");
     InstructionDesc[OpAtomicCompareExchangeWeak].operands.push(OperandId, "'Comparator'");
-    InstructionDesc[OpAtomicCompareExchangeWeak].capabilities.push_back(CapabilityKernel);
 
     InstructionDesc[OpAtomicIIncrement].operands.push(OperandId, "'Pointer'");
     InstructionDesc[OpAtomicIIncrement].operands.push(OperandScope, "'Scope'");
@@ -2525,16 +2246,15 @@
     InstructionDesc[OpAtomicFlagTestAndSet].operands.push(OperandId, "'Pointer'");
     InstructionDesc[OpAtomicFlagTestAndSet].operands.push(OperandScope, "'Scope'");
     InstructionDesc[OpAtomicFlagTestAndSet].operands.push(OperandMemorySemantics, "'Semantics'");
-    InstructionDesc[OpAtomicFlagTestAndSet].capabilities.push_back(CapabilityKernel);
 
     InstructionDesc[OpAtomicFlagClear].operands.push(OperandId, "'Pointer'");
     InstructionDesc[OpAtomicFlagClear].operands.push(OperandScope, "'Scope'");
     InstructionDesc[OpAtomicFlagClear].operands.push(OperandMemorySemantics, "'Semantics'");
-    InstructionDesc[OpAtomicFlagClear].capabilities.push_back(CapabilityKernel);
 
     InstructionDesc[OpLoopMerge].operands.push(OperandId, "'Merge Block'");
     InstructionDesc[OpLoopMerge].operands.push(OperandId, "'Continue Target'");
     InstructionDesc[OpLoopMerge].operands.push(OperandLoop, "");
+    InstructionDesc[OpLoopMerge].operands.push(OperandOptionalLiteral, "");
 
     InstructionDesc[OpSelectionMerge].operands.push(OperandId, "'Merge Block'");
     InstructionDesc[OpSelectionMerge].operands.push(OperandSelect, "");
@@ -2550,19 +2270,15 @@
     InstructionDesc[OpSwitch].operands.push(OperandId, "'Default'");
     InstructionDesc[OpSwitch].operands.push(OperandVariableLiteralId, "'Target'");
 
-    InstructionDesc[OpKill].capabilities.push_back(CapabilityShader);
 
     InstructionDesc[OpReturnValue].operands.push(OperandId, "'Value'");
 
     InstructionDesc[OpLifetimeStart].operands.push(OperandId, "'Pointer'");
     InstructionDesc[OpLifetimeStart].operands.push(OperandLiteralNumber, "'Size'");
-    InstructionDesc[OpLifetimeStart].capabilities.push_back(CapabilityKernel);
 
     InstructionDesc[OpLifetimeStop].operands.push(OperandId, "'Pointer'");
     InstructionDesc[OpLifetimeStop].operands.push(OperandLiteralNumber, "'Size'");
-    InstructionDesc[OpLifetimeStop].capabilities.push_back(CapabilityKernel);
 
-    InstructionDesc[OpGroupAsyncCopy].capabilities.push_back(CapabilityKernel);
     InstructionDesc[OpGroupAsyncCopy].operands.push(OperandScope, "'Execution'");
     InstructionDesc[OpGroupAsyncCopy].operands.push(OperandId, "'Destination'");
     InstructionDesc[OpGroupAsyncCopy].operands.push(OperandId, "'Source'");
@@ -2570,77 +2286,62 @@
     InstructionDesc[OpGroupAsyncCopy].operands.push(OperandId, "'Stride'");
     InstructionDesc[OpGroupAsyncCopy].operands.push(OperandId, "'Event'");
 
-    InstructionDesc[OpGroupWaitEvents].capabilities.push_back(CapabilityKernel);
     InstructionDesc[OpGroupWaitEvents].operands.push(OperandScope, "'Execution'");
     InstructionDesc[OpGroupWaitEvents].operands.push(OperandId, "'Num Events'");
     InstructionDesc[OpGroupWaitEvents].operands.push(OperandId, "'Events List'");
 
-    InstructionDesc[OpGroupAll].capabilities.push_back(CapabilityGroups);
     InstructionDesc[OpGroupAll].operands.push(OperandScope, "'Execution'");
     InstructionDesc[OpGroupAll].operands.push(OperandId, "'Predicate'");
 
-    InstructionDesc[OpGroupAny].capabilities.push_back(CapabilityGroups);
     InstructionDesc[OpGroupAny].operands.push(OperandScope, "'Execution'");
     InstructionDesc[OpGroupAny].operands.push(OperandId, "'Predicate'");
 
-    InstructionDesc[OpGroupBroadcast].capabilities.push_back(CapabilityGroups);
     InstructionDesc[OpGroupBroadcast].operands.push(OperandScope, "'Execution'");
     InstructionDesc[OpGroupBroadcast].operands.push(OperandId, "'Value'");
     InstructionDesc[OpGroupBroadcast].operands.push(OperandId, "'LocalId'");
 
-    InstructionDesc[OpGroupIAdd].capabilities.push_back(CapabilityGroups);
     InstructionDesc[OpGroupIAdd].operands.push(OperandScope, "'Execution'");
     InstructionDesc[OpGroupIAdd].operands.push(OperandGroupOperation, "'Operation'");
     InstructionDesc[OpGroupIAdd].operands.push(OperandId, "'X'");
 
-    InstructionDesc[OpGroupFAdd].capabilities.push_back(CapabilityGroups);
     InstructionDesc[OpGroupFAdd].operands.push(OperandScope, "'Execution'");
     InstructionDesc[OpGroupFAdd].operands.push(OperandGroupOperation, "'Operation'");
     InstructionDesc[OpGroupFAdd].operands.push(OperandId, "'X'");
 
-    InstructionDesc[OpGroupUMin].capabilities.push_back(CapabilityGroups);
     InstructionDesc[OpGroupUMin].operands.push(OperandScope, "'Execution'");
     InstructionDesc[OpGroupUMin].operands.push(OperandGroupOperation, "'Operation'");
     InstructionDesc[OpGroupUMin].operands.push(OperandId, "'X'");
 
-    InstructionDesc[OpGroupSMin].capabilities.push_back(CapabilityGroups);
     InstructionDesc[OpGroupSMin].operands.push(OperandScope, "'Execution'");
     InstructionDesc[OpGroupSMin].operands.push(OperandGroupOperation, "'Operation'");
     InstructionDesc[OpGroupSMin].operands.push(OperandId, "X");
 
-    InstructionDesc[OpGroupFMin].capabilities.push_back(CapabilityGroups);
     InstructionDesc[OpGroupFMin].operands.push(OperandScope, "'Execution'");
     InstructionDesc[OpGroupFMin].operands.push(OperandGroupOperation, "'Operation'");
     InstructionDesc[OpGroupFMin].operands.push(OperandId, "X");
 
-    InstructionDesc[OpGroupUMax].capabilities.push_back(CapabilityGroups);
     InstructionDesc[OpGroupUMax].operands.push(OperandScope, "'Execution'");
     InstructionDesc[OpGroupUMax].operands.push(OperandGroupOperation, "'Operation'");
     InstructionDesc[OpGroupUMax].operands.push(OperandId, "X");
 
-    InstructionDesc[OpGroupSMax].capabilities.push_back(CapabilityGroups);
     InstructionDesc[OpGroupSMax].operands.push(OperandScope, "'Execution'");
     InstructionDesc[OpGroupSMax].operands.push(OperandGroupOperation, "'Operation'");
     InstructionDesc[OpGroupSMax].operands.push(OperandId, "X");
 
-    InstructionDesc[OpGroupFMax].capabilities.push_back(CapabilityGroups);
     InstructionDesc[OpGroupFMax].operands.push(OperandScope, "'Execution'");
     InstructionDesc[OpGroupFMax].operands.push(OperandGroupOperation, "'Operation'");
     InstructionDesc[OpGroupFMax].operands.push(OperandId, "X");
 
-    InstructionDesc[OpReadPipe].capabilities.push_back(CapabilityPipes);
     InstructionDesc[OpReadPipe].operands.push(OperandId, "'Pipe'");
     InstructionDesc[OpReadPipe].operands.push(OperandId, "'Pointer'");
     InstructionDesc[OpReadPipe].operands.push(OperandId, "'Packet Size'");
     InstructionDesc[OpReadPipe].operands.push(OperandId, "'Packet Alignment'");
 
-    InstructionDesc[OpWritePipe].capabilities.push_back(CapabilityPipes);
     InstructionDesc[OpWritePipe].operands.push(OperandId, "'Pipe'");
     InstructionDesc[OpWritePipe].operands.push(OperandId, "'Pointer'");
     InstructionDesc[OpWritePipe].operands.push(OperandId, "'Packet Size'");
     InstructionDesc[OpWritePipe].operands.push(OperandId, "'Packet Alignment'");
 
-    InstructionDesc[OpReservedReadPipe].capabilities.push_back(CapabilityPipes);
     InstructionDesc[OpReservedReadPipe].operands.push(OperandId, "'Pipe'");
     InstructionDesc[OpReservedReadPipe].operands.push(OperandId, "'Reserve Id'");
     InstructionDesc[OpReservedReadPipe].operands.push(OperandId, "'Index'");
@@ -2648,7 +2349,6 @@
     InstructionDesc[OpReservedReadPipe].operands.push(OperandId, "'Packet Size'");
     InstructionDesc[OpReservedReadPipe].operands.push(OperandId, "'Packet Alignment'");
 
-    InstructionDesc[OpReservedWritePipe].capabilities.push_back(CapabilityPipes);
     InstructionDesc[OpReservedWritePipe].operands.push(OperandId, "'Pipe'");
     InstructionDesc[OpReservedWritePipe].operands.push(OperandId, "'Reserve Id'");
     InstructionDesc[OpReservedWritePipe].operands.push(OperandId, "'Index'");
@@ -2656,127 +2356,99 @@
     InstructionDesc[OpReservedWritePipe].operands.push(OperandId, "'Packet Size'");
     InstructionDesc[OpReservedWritePipe].operands.push(OperandId, "'Packet Alignment'");
 
-    InstructionDesc[OpReserveReadPipePackets].capabilities.push_back(CapabilityPipes);
     InstructionDesc[OpReserveReadPipePackets].operands.push(OperandId, "'Pipe'");
     InstructionDesc[OpReserveReadPipePackets].operands.push(OperandId, "'Num Packets'");
     InstructionDesc[OpReserveReadPipePackets].operands.push(OperandId, "'Packet Size'");
     InstructionDesc[OpReserveReadPipePackets].operands.push(OperandId, "'Packet Alignment'");
 
-    InstructionDesc[OpReserveWritePipePackets].capabilities.push_back(CapabilityPipes);
     InstructionDesc[OpReserveWritePipePackets].operands.push(OperandId, "'Pipe'");
     InstructionDesc[OpReserveWritePipePackets].operands.push(OperandId, "'Num Packets'");
     InstructionDesc[OpReserveWritePipePackets].operands.push(OperandId, "'Packet Size'");
     InstructionDesc[OpReserveWritePipePackets].operands.push(OperandId, "'Packet Alignment'");
 
-    InstructionDesc[OpCommitReadPipe].capabilities.push_back(CapabilityPipes);
     InstructionDesc[OpCommitReadPipe].operands.push(OperandId, "'Pipe'");
     InstructionDesc[OpCommitReadPipe].operands.push(OperandId, "'Reserve Id'");
     InstructionDesc[OpCommitReadPipe].operands.push(OperandId, "'Packet Size'");
     InstructionDesc[OpCommitReadPipe].operands.push(OperandId, "'Packet Alignment'");
 
-    InstructionDesc[OpCommitWritePipe].capabilities.push_back(CapabilityPipes);
     InstructionDesc[OpCommitWritePipe].operands.push(OperandId, "'Pipe'");
     InstructionDesc[OpCommitWritePipe].operands.push(OperandId, "'Reserve Id'");
     InstructionDesc[OpCommitWritePipe].operands.push(OperandId, "'Packet Size'");
     InstructionDesc[OpCommitWritePipe].operands.push(OperandId, "'Packet Alignment'");
 
-    InstructionDesc[OpIsValidReserveId].capabilities.push_back(CapabilityPipes);
     InstructionDesc[OpIsValidReserveId].operands.push(OperandId, "'Reserve Id'");
 
-    InstructionDesc[OpGetNumPipePackets].capabilities.push_back(CapabilityPipes);
     InstructionDesc[OpGetNumPipePackets].operands.push(OperandId, "'Pipe'");
     InstructionDesc[OpGetNumPipePackets].operands.push(OperandId, "'Packet Size'");
     InstructionDesc[OpGetNumPipePackets].operands.push(OperandId, "'Packet Alignment'");
 
-    InstructionDesc[OpGetMaxPipePackets].capabilities.push_back(CapabilityPipes);
     InstructionDesc[OpGetMaxPipePackets].operands.push(OperandId, "'Pipe'");
     InstructionDesc[OpGetMaxPipePackets].operands.push(OperandId, "'Packet Size'");
     InstructionDesc[OpGetMaxPipePackets].operands.push(OperandId, "'Packet Alignment'");
 
-    InstructionDesc[OpGroupReserveReadPipePackets].capabilities.push_back(CapabilityPipes);
     InstructionDesc[OpGroupReserveReadPipePackets].operands.push(OperandScope, "'Execution'");
     InstructionDesc[OpGroupReserveReadPipePackets].operands.push(OperandId, "'Pipe'");
     InstructionDesc[OpGroupReserveReadPipePackets].operands.push(OperandId, "'Num Packets'");
     InstructionDesc[OpGroupReserveReadPipePackets].operands.push(OperandId, "'Packet Size'");
     InstructionDesc[OpGroupReserveReadPipePackets].operands.push(OperandId, "'Packet Alignment'");
 
-    InstructionDesc[OpGroupReserveWritePipePackets].capabilities.push_back(CapabilityPipes);
     InstructionDesc[OpGroupReserveWritePipePackets].operands.push(OperandScope, "'Execution'");
     InstructionDesc[OpGroupReserveWritePipePackets].operands.push(OperandId, "'Pipe'");
     InstructionDesc[OpGroupReserveWritePipePackets].operands.push(OperandId, "'Num Packets'");
     InstructionDesc[OpGroupReserveWritePipePackets].operands.push(OperandId, "'Packet Size'");
     InstructionDesc[OpGroupReserveWritePipePackets].operands.push(OperandId, "'Packet Alignment'");
 
-    InstructionDesc[OpGroupCommitReadPipe].capabilities.push_back(CapabilityPipes);
     InstructionDesc[OpGroupCommitReadPipe].operands.push(OperandScope, "'Execution'");
     InstructionDesc[OpGroupCommitReadPipe].operands.push(OperandId, "'Pipe'");
     InstructionDesc[OpGroupCommitReadPipe].operands.push(OperandId, "'Reserve Id'");
     InstructionDesc[OpGroupCommitReadPipe].operands.push(OperandId, "'Packet Size'");
     InstructionDesc[OpGroupCommitReadPipe].operands.push(OperandId, "'Packet Alignment'");
 
-    InstructionDesc[OpGroupCommitWritePipe].capabilities.push_back(CapabilityPipes);
     InstructionDesc[OpGroupCommitWritePipe].operands.push(OperandScope, "'Execution'");
     InstructionDesc[OpGroupCommitWritePipe].operands.push(OperandId, "'Pipe'");
     InstructionDesc[OpGroupCommitWritePipe].operands.push(OperandId, "'Reserve Id'");
     InstructionDesc[OpGroupCommitWritePipe].operands.push(OperandId, "'Packet Size'");
     InstructionDesc[OpGroupCommitWritePipe].operands.push(OperandId, "'Packet Alignment'");
 
-    InstructionDesc[OpBuildNDRange].capabilities.push_back(CapabilityDeviceEnqueue);
     InstructionDesc[OpBuildNDRange].operands.push(OperandId, "'GlobalWorkSize'");
     InstructionDesc[OpBuildNDRange].operands.push(OperandId, "'LocalWorkSize'");
     InstructionDesc[OpBuildNDRange].operands.push(OperandId, "'GlobalWorkOffset'");
 
-    InstructionDesc[OpGetDefaultQueue].capabilities.push_back(CapabilityDeviceEnqueue);
-
-    InstructionDesc[OpCaptureEventProfilingInfo].capabilities.push_back(CapabilityDeviceEnqueue);
-
     InstructionDesc[OpCaptureEventProfilingInfo].operands.push(OperandId, "'Event'");
     InstructionDesc[OpCaptureEventProfilingInfo].operands.push(OperandId, "'Profiling Info'");
     InstructionDesc[OpCaptureEventProfilingInfo].operands.push(OperandId, "'Value'");
 
-    InstructionDesc[OpSetUserEventStatus].capabilities.push_back(CapabilityDeviceEnqueue);
-
     InstructionDesc[OpSetUserEventStatus].operands.push(OperandId, "'Event'");
     InstructionDesc[OpSetUserEventStatus].operands.push(OperandId, "'Status'");
 
-    InstructionDesc[OpIsValidEvent].capabilities.push_back(CapabilityDeviceEnqueue);
     InstructionDesc[OpIsValidEvent].operands.push(OperandId, "'Event'");
 
-    InstructionDesc[OpCreateUserEvent].capabilities.push_back(CapabilityDeviceEnqueue);
-
-    InstructionDesc[OpRetainEvent].capabilities.push_back(CapabilityDeviceEnqueue);
     InstructionDesc[OpRetainEvent].operands.push(OperandId, "'Event'");
 
-    InstructionDesc[OpReleaseEvent].capabilities.push_back(CapabilityDeviceEnqueue);
     InstructionDesc[OpReleaseEvent].operands.push(OperandId, "'Event'");
 
-    InstructionDesc[OpGetKernelWorkGroupSize].capabilities.push_back(CapabilityDeviceEnqueue);
     InstructionDesc[OpGetKernelWorkGroupSize].operands.push(OperandId, "'Invoke'");
     InstructionDesc[OpGetKernelWorkGroupSize].operands.push(OperandId, "'Param'");
     InstructionDesc[OpGetKernelWorkGroupSize].operands.push(OperandId, "'Param Size'");
     InstructionDesc[OpGetKernelWorkGroupSize].operands.push(OperandId, "'Param Align'");
 
-    InstructionDesc[OpGetKernelPreferredWorkGroupSizeMultiple].capabilities.push_back(CapabilityDeviceEnqueue);
     InstructionDesc[OpGetKernelPreferredWorkGroupSizeMultiple].operands.push(OperandId, "'Invoke'");
     InstructionDesc[OpGetKernelPreferredWorkGroupSizeMultiple].operands.push(OperandId, "'Param'");
     InstructionDesc[OpGetKernelPreferredWorkGroupSizeMultiple].operands.push(OperandId, "'Param Size'");
     InstructionDesc[OpGetKernelPreferredWorkGroupSizeMultiple].operands.push(OperandId, "'Param Align'");
 
-    InstructionDesc[OpGetKernelNDrangeSubGroupCount].capabilities.push_back(CapabilityDeviceEnqueue);
     InstructionDesc[OpGetKernelNDrangeSubGroupCount].operands.push(OperandId, "'ND Range'");
     InstructionDesc[OpGetKernelNDrangeSubGroupCount].operands.push(OperandId, "'Invoke'");
     InstructionDesc[OpGetKernelNDrangeSubGroupCount].operands.push(OperandId, "'Param'");
     InstructionDesc[OpGetKernelNDrangeSubGroupCount].operands.push(OperandId, "'Param Size'");
     InstructionDesc[OpGetKernelNDrangeSubGroupCount].operands.push(OperandId, "'Param Align'");
 
-    InstructionDesc[OpGetKernelNDrangeMaxSubGroupSize].capabilities.push_back(CapabilityDeviceEnqueue);
     InstructionDesc[OpGetKernelNDrangeMaxSubGroupSize].operands.push(OperandId, "'ND Range'");
     InstructionDesc[OpGetKernelNDrangeMaxSubGroupSize].operands.push(OperandId, "'Invoke'");
     InstructionDesc[OpGetKernelNDrangeMaxSubGroupSize].operands.push(OperandId, "'Param'");
     InstructionDesc[OpGetKernelNDrangeMaxSubGroupSize].operands.push(OperandId, "'Param Size'");
     InstructionDesc[OpGetKernelNDrangeMaxSubGroupSize].operands.push(OperandId, "'Param Align'");
 
-    InstructionDesc[OpEnqueueKernel].capabilities.push_back(CapabilityDeviceEnqueue);
     InstructionDesc[OpEnqueueKernel].operands.push(OperandId, "'Queue'");
     InstructionDesc[OpEnqueueKernel].operands.push(OperandId, "'Flags'");
     InstructionDesc[OpEnqueueKernel].operands.push(OperandId, "'ND Range'");
@@ -2789,72 +2461,250 @@
     InstructionDesc[OpEnqueueKernel].operands.push(OperandId, "'Param Align'");
     InstructionDesc[OpEnqueueKernel].operands.push(OperandVariableIds, "'Local Size'");
 
-    InstructionDesc[OpEnqueueMarker].capabilities.push_back(CapabilityDeviceEnqueue);
     InstructionDesc[OpEnqueueMarker].operands.push(OperandId, "'Queue'");
     InstructionDesc[OpEnqueueMarker].operands.push(OperandId, "'Num Events'");
     InstructionDesc[OpEnqueueMarker].operands.push(OperandId, "'Wait Events'");
     InstructionDesc[OpEnqueueMarker].operands.push(OperandId, "'Ret Event'");
 
+    InstructionDesc[OpGroupNonUniformElect].operands.push(OperandScope, "'Execution'");
+
+    InstructionDesc[OpGroupNonUniformAll].operands.push(OperandScope, "'Execution'");
+    InstructionDesc[OpGroupNonUniformAll].operands.push(OperandId, "X");
+
+    InstructionDesc[OpGroupNonUniformAny].operands.push(OperandScope, "'Execution'");
+    InstructionDesc[OpGroupNonUniformAny].operands.push(OperandId, "X");
+
+    InstructionDesc[OpGroupNonUniformAllEqual].operands.push(OperandScope, "'Execution'");
+    InstructionDesc[OpGroupNonUniformAllEqual].operands.push(OperandId, "X");
+
+    InstructionDesc[OpGroupNonUniformBroadcast].operands.push(OperandScope, "'Execution'");
+    InstructionDesc[OpGroupNonUniformBroadcast].operands.push(OperandId, "X");
+    InstructionDesc[OpGroupNonUniformBroadcast].operands.push(OperandId, "ID");
+
+    InstructionDesc[OpGroupNonUniformBroadcastFirst].operands.push(OperandScope, "'Execution'");
+    InstructionDesc[OpGroupNonUniformBroadcastFirst].operands.push(OperandId, "X");
+
+    InstructionDesc[OpGroupNonUniformBallot].operands.push(OperandScope, "'Execution'");
+    InstructionDesc[OpGroupNonUniformBallot].operands.push(OperandId, "X");
+
+    InstructionDesc[OpGroupNonUniformInverseBallot].operands.push(OperandScope, "'Execution'");
+    InstructionDesc[OpGroupNonUniformInverseBallot].operands.push(OperandId, "X");
+
+    InstructionDesc[OpGroupNonUniformBallotBitExtract].operands.push(OperandScope, "'Execution'");
+    InstructionDesc[OpGroupNonUniformBallotBitExtract].operands.push(OperandId, "X");
+    InstructionDesc[OpGroupNonUniformBallotBitExtract].operands.push(OperandId, "Bit");
+
+    InstructionDesc[OpGroupNonUniformBallotBitCount].operands.push(OperandScope, "'Execution'");
+    InstructionDesc[OpGroupNonUniformBallotBitCount].operands.push(OperandGroupOperation, "'Operation'");
+    InstructionDesc[OpGroupNonUniformBallotBitCount].operands.push(OperandId, "X");
+
+    InstructionDesc[OpGroupNonUniformBallotFindLSB].operands.push(OperandScope, "'Execution'");
+    InstructionDesc[OpGroupNonUniformBallotFindLSB].operands.push(OperandId, "X");
+
+    InstructionDesc[OpGroupNonUniformBallotFindMSB].operands.push(OperandScope, "'Execution'");
+    InstructionDesc[OpGroupNonUniformBallotFindMSB].operands.push(OperandId, "X");
+
+    InstructionDesc[OpGroupNonUniformShuffle].operands.push(OperandScope, "'Execution'");
+    InstructionDesc[OpGroupNonUniformShuffle].operands.push(OperandId, "X");
+    InstructionDesc[OpGroupNonUniformShuffle].operands.push(OperandId, "'Id'");
+
+    InstructionDesc[OpGroupNonUniformShuffleXor].operands.push(OperandScope, "'Execution'");
+    InstructionDesc[OpGroupNonUniformShuffleXor].operands.push(OperandId, "X");
+    InstructionDesc[OpGroupNonUniformShuffleXor].operands.push(OperandId, "Mask");
+
+    InstructionDesc[OpGroupNonUniformShuffleUp].operands.push(OperandScope, "'Execution'");
+    InstructionDesc[OpGroupNonUniformShuffleUp].operands.push(OperandId, "X");
+    InstructionDesc[OpGroupNonUniformShuffleUp].operands.push(OperandId, "Offset");
+
+    InstructionDesc[OpGroupNonUniformShuffleDown].operands.push(OperandScope, "'Execution'");
+    InstructionDesc[OpGroupNonUniformShuffleDown].operands.push(OperandId, "X");
+    InstructionDesc[OpGroupNonUniformShuffleDown].operands.push(OperandId, "Offset");
+
+    InstructionDesc[OpGroupNonUniformIAdd].operands.push(OperandScope, "'Execution'");
+    InstructionDesc[OpGroupNonUniformIAdd].operands.push(OperandGroupOperation, "'Operation'");
+    InstructionDesc[OpGroupNonUniformIAdd].operands.push(OperandId, "X");
+    InstructionDesc[OpGroupNonUniformIAdd].operands.push(OperandId, "'ClusterSize'", true);
+
+    InstructionDesc[OpGroupNonUniformFAdd].operands.push(OperandScope, "'Execution'");
+    InstructionDesc[OpGroupNonUniformFAdd].operands.push(OperandGroupOperation, "'Operation'");
+    InstructionDesc[OpGroupNonUniformFAdd].operands.push(OperandId, "X");
+    InstructionDesc[OpGroupNonUniformFAdd].operands.push(OperandId, "'ClusterSize'", true);
+
+    InstructionDesc[OpGroupNonUniformIMul].operands.push(OperandScope, "'Execution'");
+    InstructionDesc[OpGroupNonUniformIMul].operands.push(OperandGroupOperation, "'Operation'");
+    InstructionDesc[OpGroupNonUniformIMul].operands.push(OperandId, "X");
+    InstructionDesc[OpGroupNonUniformIMul].operands.push(OperandId, "'ClusterSize'", true);
+
+    InstructionDesc[OpGroupNonUniformFMul].operands.push(OperandScope, "'Execution'");
+    InstructionDesc[OpGroupNonUniformFMul].operands.push(OperandGroupOperation, "'Operation'");
+    InstructionDesc[OpGroupNonUniformFMul].operands.push(OperandId, "X");
+    InstructionDesc[OpGroupNonUniformFMul].operands.push(OperandId, "'ClusterSize'", true);
+
+    InstructionDesc[OpGroupNonUniformSMin].operands.push(OperandScope, "'Execution'");
+    InstructionDesc[OpGroupNonUniformSMin].operands.push(OperandGroupOperation, "'Operation'");
+    InstructionDesc[OpGroupNonUniformSMin].operands.push(OperandId, "X");
+    InstructionDesc[OpGroupNonUniformSMin].operands.push(OperandId, "'ClusterSize'", true);
+
+    InstructionDesc[OpGroupNonUniformUMin].operands.push(OperandScope, "'Execution'");
+    InstructionDesc[OpGroupNonUniformUMin].operands.push(OperandGroupOperation, "'Operation'");
+    InstructionDesc[OpGroupNonUniformUMin].operands.push(OperandId, "X");
+    InstructionDesc[OpGroupNonUniformUMin].operands.push(OperandId, "'ClusterSize'", true);
+
+    InstructionDesc[OpGroupNonUniformFMin].operands.push(OperandScope, "'Execution'");
+    InstructionDesc[OpGroupNonUniformFMin].operands.push(OperandGroupOperation, "'Operation'");
+    InstructionDesc[OpGroupNonUniformFMin].operands.push(OperandId, "X");
+    InstructionDesc[OpGroupNonUniformFMin].operands.push(OperandId, "'ClusterSize'", true);
+
+    InstructionDesc[OpGroupNonUniformSMax].operands.push(OperandScope, "'Execution'");
+    InstructionDesc[OpGroupNonUniformSMax].operands.push(OperandGroupOperation, "'Operation'");
+    InstructionDesc[OpGroupNonUniformSMax].operands.push(OperandId, "X");
+    InstructionDesc[OpGroupNonUniformSMax].operands.push(OperandId, "'ClusterSize'", true);
+
+    InstructionDesc[OpGroupNonUniformUMax].operands.push(OperandScope, "'Execution'");
+    InstructionDesc[OpGroupNonUniformUMax].operands.push(OperandGroupOperation, "'Operation'");
+    InstructionDesc[OpGroupNonUniformUMax].operands.push(OperandId, "X");
+    InstructionDesc[OpGroupNonUniformUMax].operands.push(OperandId, "'ClusterSize'", true);
+
+    InstructionDesc[OpGroupNonUniformFMax].operands.push(OperandScope, "'Execution'");
+    InstructionDesc[OpGroupNonUniformFMax].operands.push(OperandGroupOperation, "'Operation'");
+    InstructionDesc[OpGroupNonUniformFMax].operands.push(OperandId, "X");
+    InstructionDesc[OpGroupNonUniformFMax].operands.push(OperandId, "'ClusterSize'", true);
+
+    InstructionDesc[OpGroupNonUniformBitwiseAnd].operands.push(OperandScope, "'Execution'");
+    InstructionDesc[OpGroupNonUniformBitwiseAnd].operands.push(OperandGroupOperation, "'Operation'");
+    InstructionDesc[OpGroupNonUniformBitwiseAnd].operands.push(OperandId, "X");
+    InstructionDesc[OpGroupNonUniformBitwiseAnd].operands.push(OperandId, "'ClusterSize'", true);
+
+    InstructionDesc[OpGroupNonUniformBitwiseOr].operands.push(OperandScope, "'Execution'");
+    InstructionDesc[OpGroupNonUniformBitwiseOr].operands.push(OperandGroupOperation, "'Operation'");
+    InstructionDesc[OpGroupNonUniformBitwiseOr].operands.push(OperandId, "X");
+    InstructionDesc[OpGroupNonUniformBitwiseOr].operands.push(OperandId, "'ClusterSize'", true);
+
+    InstructionDesc[OpGroupNonUniformBitwiseXor].operands.push(OperandScope, "'Execution'");
+    InstructionDesc[OpGroupNonUniformBitwiseXor].operands.push(OperandGroupOperation, "'Operation'");
+    InstructionDesc[OpGroupNonUniformBitwiseXor].operands.push(OperandId, "X");
+    InstructionDesc[OpGroupNonUniformBitwiseXor].operands.push(OperandId, "'ClusterSize'", true);
+
+    InstructionDesc[OpGroupNonUniformLogicalAnd].operands.push(OperandScope, "'Execution'");
+    InstructionDesc[OpGroupNonUniformLogicalAnd].operands.push(OperandGroupOperation, "'Operation'");
+    InstructionDesc[OpGroupNonUniformLogicalAnd].operands.push(OperandId, "X");
+    InstructionDesc[OpGroupNonUniformLogicalAnd].operands.push(OperandId, "'ClusterSize'", true);
+
+    InstructionDesc[OpGroupNonUniformLogicalOr].operands.push(OperandScope, "'Execution'");
+    InstructionDesc[OpGroupNonUniformLogicalOr].operands.push(OperandGroupOperation, "'Operation'");
+    InstructionDesc[OpGroupNonUniformLogicalOr].operands.push(OperandId, "X");
+    InstructionDesc[OpGroupNonUniformLogicalOr].operands.push(OperandId, "'ClusterSize'", true);
+
+    InstructionDesc[OpGroupNonUniformLogicalXor].operands.push(OperandScope, "'Execution'");
+    InstructionDesc[OpGroupNonUniformLogicalXor].operands.push(OperandGroupOperation, "'Operation'");
+    InstructionDesc[OpGroupNonUniformLogicalXor].operands.push(OperandId, "X");
+    InstructionDesc[OpGroupNonUniformLogicalXor].operands.push(OperandId, "'ClusterSize'", true);
+
+    InstructionDesc[OpGroupNonUniformQuadBroadcast].operands.push(OperandScope, "'Execution'");
+    InstructionDesc[OpGroupNonUniformQuadBroadcast].operands.push(OperandId, "X");
+    InstructionDesc[OpGroupNonUniformQuadBroadcast].operands.push(OperandId, "'Id'");
+
+    InstructionDesc[OpGroupNonUniformQuadSwap].operands.push(OperandScope, "'Execution'");
+    InstructionDesc[OpGroupNonUniformQuadSwap].operands.push(OperandId, "X");
+    InstructionDesc[OpGroupNonUniformQuadSwap].operands.push(OperandLiteralNumber, "'Direction'");
+
     InstructionDesc[OpSubgroupBallotKHR].operands.push(OperandId, "'Predicate'");
 
     InstructionDesc[OpSubgroupFirstInvocationKHR].operands.push(OperandId, "'Value'");
 
-    InstructionDesc[OpSubgroupAnyKHR].capabilities.push_back(CapabilitySubgroupVoteKHR);
     InstructionDesc[OpSubgroupAnyKHR].operands.push(OperandScope, "'Execution'");
     InstructionDesc[OpSubgroupAnyKHR].operands.push(OperandId, "'Predicate'");
 
-    InstructionDesc[OpSubgroupAllKHR].capabilities.push_back(CapabilitySubgroupVoteKHR);
     InstructionDesc[OpSubgroupAllKHR].operands.push(OperandScope, "'Execution'");
     InstructionDesc[OpSubgroupAllKHR].operands.push(OperandId, "'Predicate'");
 
-    InstructionDesc[OpSubgroupAllEqualKHR].capabilities.push_back(CapabilitySubgroupVoteKHR);
     InstructionDesc[OpSubgroupAllEqualKHR].operands.push(OperandScope, "'Execution'");
     InstructionDesc[OpSubgroupAllEqualKHR].operands.push(OperandId, "'Predicate'");
 
-    InstructionDesc[OpSubgroupReadInvocationKHR].capabilities.push_back(CapabilityGroups);
     InstructionDesc[OpSubgroupReadInvocationKHR].operands.push(OperandId, "'Value'");
     InstructionDesc[OpSubgroupReadInvocationKHR].operands.push(OperandId, "'Index'");
 
+    InstructionDesc[OpModuleProcessed].operands.push(OperandLiteralString, "'process'");
+
 #ifdef AMD_EXTENSIONS
-    InstructionDesc[OpGroupIAddNonUniformAMD].capabilities.push_back(CapabilityGroups);
     InstructionDesc[OpGroupIAddNonUniformAMD].operands.push(OperandScope, "'Execution'");
     InstructionDesc[OpGroupIAddNonUniformAMD].operands.push(OperandGroupOperation, "'Operation'");
     InstructionDesc[OpGroupIAddNonUniformAMD].operands.push(OperandId, "'X'");
 
-    InstructionDesc[OpGroupFAddNonUniformAMD].capabilities.push_back(CapabilityGroups);
     InstructionDesc[OpGroupFAddNonUniformAMD].operands.push(OperandScope, "'Execution'");
     InstructionDesc[OpGroupFAddNonUniformAMD].operands.push(OperandGroupOperation, "'Operation'");
     InstructionDesc[OpGroupFAddNonUniformAMD].operands.push(OperandId, "'X'");
 
-    InstructionDesc[OpGroupUMinNonUniformAMD].capabilities.push_back(CapabilityGroups);
     InstructionDesc[OpGroupUMinNonUniformAMD].operands.push(OperandScope, "'Execution'");
     InstructionDesc[OpGroupUMinNonUniformAMD].operands.push(OperandGroupOperation, "'Operation'");
     InstructionDesc[OpGroupUMinNonUniformAMD].operands.push(OperandId, "'X'");
 
-    InstructionDesc[OpGroupSMinNonUniformAMD].capabilities.push_back(CapabilityGroups);
     InstructionDesc[OpGroupSMinNonUniformAMD].operands.push(OperandScope, "'Execution'");
     InstructionDesc[OpGroupSMinNonUniformAMD].operands.push(OperandGroupOperation, "'Operation'");
     InstructionDesc[OpGroupSMinNonUniformAMD].operands.push(OperandId, "X");
 
-    InstructionDesc[OpGroupFMinNonUniformAMD].capabilities.push_back(CapabilityGroups);
     InstructionDesc[OpGroupFMinNonUniformAMD].operands.push(OperandScope, "'Execution'");
     InstructionDesc[OpGroupFMinNonUniformAMD].operands.push(OperandGroupOperation, "'Operation'");
     InstructionDesc[OpGroupFMinNonUniformAMD].operands.push(OperandId, "X");
 
-    InstructionDesc[OpGroupUMaxNonUniformAMD].capabilities.push_back(CapabilityGroups);
     InstructionDesc[OpGroupUMaxNonUniformAMD].operands.push(OperandScope, "'Execution'");
     InstructionDesc[OpGroupUMaxNonUniformAMD].operands.push(OperandGroupOperation, "'Operation'");
     InstructionDesc[OpGroupUMaxNonUniformAMD].operands.push(OperandId, "X");
 
-    InstructionDesc[OpGroupSMaxNonUniformAMD].capabilities.push_back(CapabilityGroups);
     InstructionDesc[OpGroupSMaxNonUniformAMD].operands.push(OperandScope, "'Execution'");
     InstructionDesc[OpGroupSMaxNonUniformAMD].operands.push(OperandGroupOperation, "'Operation'");
     InstructionDesc[OpGroupSMaxNonUniformAMD].operands.push(OperandId, "X");
 
-    InstructionDesc[OpGroupFMaxNonUniformAMD].capabilities.push_back(CapabilityGroups);
     InstructionDesc[OpGroupFMaxNonUniformAMD].operands.push(OperandScope, "'Execution'");
     InstructionDesc[OpGroupFMaxNonUniformAMD].operands.push(OperandGroupOperation, "'Operation'");
     InstructionDesc[OpGroupFMaxNonUniformAMD].operands.push(OperandId, "X");
+
+    InstructionDesc[OpFragmentMaskFetchAMD].operands.push(OperandId, "'Image'");
+    InstructionDesc[OpFragmentMaskFetchAMD].operands.push(OperandId, "'Coordinate'");
+
+    InstructionDesc[OpFragmentFetchAMD].operands.push(OperandId, "'Image'");
+    InstructionDesc[OpFragmentFetchAMD].operands.push(OperandId, "'Coordinate'");
+    InstructionDesc[OpFragmentFetchAMD].operands.push(OperandId, "'Fragment Index'");
+#endif
+
+#ifdef NV_EXTENSIONS
+    InstructionDesc[OpGroupNonUniformPartitionNV].operands.push(OperandId, "X");
+
+    InstructionDesc[OpTypeAccelerationStructureNV].setResultAndType(true, false);
+
+    InstructionDesc[OpTraceNV].operands.push(OperandId, "'NV Acceleration Structure'");
+    InstructionDesc[OpTraceNV].operands.push(OperandId, "'Ray Flags'");
+    InstructionDesc[OpTraceNV].operands.push(OperandId, "'Cull Mask'");
+    InstructionDesc[OpTraceNV].operands.push(OperandId, "'SBT Record Offset'");
+    InstructionDesc[OpTraceNV].operands.push(OperandId, "'SBT Record Stride'");
+    InstructionDesc[OpTraceNV].operands.push(OperandId, "'Miss Index'");
+    InstructionDesc[OpTraceNV].operands.push(OperandId, "'Ray Origin'");
+    InstructionDesc[OpTraceNV].operands.push(OperandId, "'TMin'");
+    InstructionDesc[OpTraceNV].operands.push(OperandId, "'Ray Direction'");
+    InstructionDesc[OpTraceNV].operands.push(OperandId, "'TMax'");
+    InstructionDesc[OpTraceNV].operands.push(OperandId, "'Payload'");
+    InstructionDesc[OpTraceNV].setResultAndType(false, false);
+
+    InstructionDesc[OpReportIntersectionNV].operands.push(OperandId, "'Hit Parameter'");
+    InstructionDesc[OpReportIntersectionNV].operands.push(OperandId, "'Hit Kind'");
+
+    InstructionDesc[OpIgnoreIntersectionNV].setResultAndType(false, false);
+
+    InstructionDesc[OpTerminateRayNV].setResultAndType(false, false);
+    
+    InstructionDesc[OpExecuteCallableNV].operands.push(OperandId, "SBT Record Index");
+    InstructionDesc[OpExecuteCallableNV].operands.push(OperandId, "CallableData ID");
+    InstructionDesc[OpExecuteCallableNV].setResultAndType(false, false);
+
+    InstructionDesc[OpImageSampleFootprintNV].operands.push(OperandId, "'Sampled Image'");
+    InstructionDesc[OpImageSampleFootprintNV].operands.push(OperandId, "'Coordinate'");
+    InstructionDesc[OpImageSampleFootprintNV].operands.push(OperandId, "'Granularity'");
+    InstructionDesc[OpImageSampleFootprintNV].operands.push(OperandId, "'Coarse'");
+    InstructionDesc[OpImageSampleFootprintNV].operands.push(OperandImageOperands, "", true);
+    InstructionDesc[OpImageSampleFootprintNV].operands.push(OperandVariableIds, "", true);
+    
+    InstructionDesc[OpWritePackedPrimitiveIndices4x8NV].operands.push(OperandId, "'Index Offset'");
+    InstructionDesc[OpWritePackedPrimitiveIndices4x8NV].operands.push(OperandId, "'Packed Indices'");
 #endif
 }
 
diff --git a/SPIRV/doc.h b/SPIRV/doc.h
index 7dcc51d..7d0475d 100644
--- a/SPIRV/doc.h
+++ b/SPIRV/doc.h
@@ -36,6 +36,8 @@
 // Parameterize the SPIR-V enumerants.
 //
 
+#pragma once
+
 #include "spirv.hpp"
 
 #include <vector>
@@ -188,7 +190,6 @@
 class EnumParameters {
 public:
     EnumParameters() : desc(0) { }
-    EnumCaps caps;
     const char* desc;
 };
 
@@ -233,7 +234,6 @@
     bool hasType()   const { return typePresent != 0; }
 
     const char* opDesc;
-    EnumCaps capabilities;
     OpcodeClass opClass;
     OperandParameters operands;
 
@@ -242,8 +242,6 @@
     int resultPresent : 1;
 };
 
-const int OpcodeCeiling = 321;
-
 // The set of objects that hold all the instruction/operand
 // parameterization information.
 extern InstructionParameters InstructionDesc[];
diff --git a/SPIRV/hex_float.h b/SPIRV/hex_float.h
index 31b9f9e..905b21a 100644
--- a/SPIRV/hex_float.h
+++ b/SPIRV/hex_float.h
@@ -23,7 +23,7 @@
 #include <limits>
 #include <sstream>
 
-#if defined(_MSC_VER) && _MSC_VER < 1700
+#if defined(_MSC_VER) && _MSC_VER < 1800
 namespace std {
 bool isnan(double f)
 {
diff --git a/SPIRV/spirv.hpp b/SPIRV/spirv.hpp
old mode 100755
new mode 100644
index 91cb59e..72e577a
--- a/SPIRV/spirv.hpp
+++ b/SPIRV/spirv.hpp
@@ -1,4 +1,4 @@
-// Copyright (c) 2014-2017 The Khronos Group Inc.
+// Copyright (c) 2014-2018 The Khronos Group Inc.
 // 
 // Permission is hereby granted, free of charge, to any person obtaining a copy
 // of this software and/or associated documentation files (the "Materials"),
@@ -26,13 +26,14 @@
 // the Binary Section of the SPIR-V specification.
 
 // Enumeration tokens for SPIR-V, in various styles:
-//   C, C++, C++11, JSON, Lua, Python
+//   C, C++, C++11, JSON, Lua, Python, C#
 // 
 // - C will have tokens with a "Spv" prefix, e.g.: SpvSourceLanguageGLSL
 // - C++ will have tokens in the "spv" name space, e.g.: spv::SourceLanguageGLSL
 // - C++11 will use enum classes in the spv namespace, e.g.: spv::SourceLanguage::GLSL
 // - Lua will use tables, e.g.: spv.SourceLanguage.GLSL
 // - Python will use dictionaries, e.g.: spv['SourceLanguage']['GLSL']
+// - C# will use enum classes in the Specification class located in the "Spv" namespace, e.g.: Spv.Specification.SourceLanguage.GLSL
 // 
 // Some tokens act like mask values, which can be OR'd together,
 // while others are mutually exclusive.  The mask-like ones have
@@ -46,12 +47,12 @@
 
 typedef unsigned int Id;
 
-#define SPV_VERSION 0x10000
-#define SPV_REVISION 10
+#define SPV_VERSION 0x10300
+#define SPV_REVISION 1
 
 static const unsigned int MagicNumber = 0x07230203;
-static const unsigned int Version = 0x00010000;
-static const unsigned int Revision = 10;
+static const unsigned int Version = 0x00010300;
+static const unsigned int Revision = 1;
 static const unsigned int OpCodeMask = 0xffff;
 static const unsigned int WordCountShift = 16;
 
@@ -73,6 +74,14 @@
     ExecutionModelFragment = 4,
     ExecutionModelGLCompute = 5,
     ExecutionModelKernel = 6,
+    ExecutionModelTaskNV = 5267,
+    ExecutionModelMeshNV = 5268,
+    ExecutionModelRayGenerationNV = 5313,
+    ExecutionModelIntersectionNV = 5314,
+    ExecutionModelAnyHitNV = 5315,
+    ExecutionModelClosestHitNV = 5316,
+    ExecutionModelMissNV = 5317,
+    ExecutionModelCallableNV = 5318,
     ExecutionModelMax = 0x7fffffff,
 };
 
@@ -87,6 +96,7 @@
     MemoryModelSimple = 0,
     MemoryModelGLSL450 = 1,
     MemoryModelOpenCL = 2,
+    MemoryModelVulkanKHR = 3,
     MemoryModelMax = 0x7fffffff,
 };
 
@@ -122,6 +132,20 @@
     ExecutionModeOutputTriangleStrip = 29,
     ExecutionModeVecTypeHint = 30,
     ExecutionModeContractionOff = 31,
+    ExecutionModeInitializer = 33,
+    ExecutionModeFinalizer = 34,
+    ExecutionModeSubgroupSize = 35,
+    ExecutionModeSubgroupsPerWorkgroup = 36,
+    ExecutionModeSubgroupsPerWorkgroupId = 37,
+    ExecutionModeLocalSizeId = 38,
+    ExecutionModeLocalSizeHintId = 39,
+    ExecutionModePostDepthCoverage = 4446,
+    ExecutionModeStencilRefReplacingEXT = 5027,
+    ExecutionModeOutputLinesNV = 5269,
+    ExecutionModeOutputPrimitivesNV = 5270,
+    ExecutionModeDerivativeGroupQuadsNV = 5289,
+    ExecutionModeDerivativeGroupLinearNV = 5290,
+    ExecutionModeOutputTrianglesNV = 5298,
     ExecutionModeMax = 0x7fffffff,
 };
 
@@ -139,6 +163,12 @@
     StorageClassAtomicCounter = 10,
     StorageClassImage = 11,
     StorageClassStorageBuffer = 12,
+    StorageClassCallableDataNV = 5328,
+    StorageClassIncomingCallableDataNV = 5329,
+    StorageClassRayPayloadNV = 5338,
+    StorageClassHitAttributeNV = 5339,
+    StorageClassIncomingRayPayloadNV = 5342,
+    StorageClassShaderRecordBufferNV = 5343,
     StorageClassMax = 0x7fffffff,
 };
 
@@ -266,6 +296,10 @@
     ImageOperandsConstOffsetsShift = 5,
     ImageOperandsSampleShift = 6,
     ImageOperandsMinLodShift = 7,
+    ImageOperandsMakeTexelAvailableKHRShift = 8,
+    ImageOperandsMakeTexelVisibleKHRShift = 9,
+    ImageOperandsNonPrivateTexelKHRShift = 10,
+    ImageOperandsVolatileTexelKHRShift = 11,
     ImageOperandsMax = 0x7fffffff,
 };
 
@@ -279,6 +313,10 @@
     ImageOperandsConstOffsetsMask = 0x00000020,
     ImageOperandsSampleMask = 0x00000040,
     ImageOperandsMinLodMask = 0x00000080,
+    ImageOperandsMakeTexelAvailableKHRMask = 0x00000100,
+    ImageOperandsMakeTexelVisibleKHRMask = 0x00000200,
+    ImageOperandsNonPrivateTexelKHRMask = 0x00000400,
+    ImageOperandsVolatileTexelKHRMask = 0x00000800,
 };
 
 enum FPFastMathModeShift {
@@ -376,10 +414,21 @@
     DecorationNoContraction = 42,
     DecorationInputAttachmentIndex = 43,
     DecorationAlignment = 44,
+    DecorationMaxByteOffset = 45,
+    DecorationAlignmentId = 46,
+    DecorationMaxByteOffsetId = 47,
+    DecorationExplicitInterpAMD = 4999,
     DecorationOverrideCoverageNV = 5248,
     DecorationPassthroughNV = 5250,
     DecorationViewportRelativeNV = 5252,
     DecorationSecondaryViewportRelativeNV = 5256,
+    DecorationPerPrimitiveNV = 5271,
+    DecorationPerViewNV = 5272,
+    DecorationPerTaskNV = 5273,
+    DecorationPerVertexNV = 5285,
+    DecorationNonUniformEXT = 5300,
+    DecorationHlslCounterBufferGOOGLE = 5634,
+    DecorationHlslSemanticGOOGLE = 5635,
     DecorationMax = 0x7fffffff,
 };
 
@@ -425,21 +474,63 @@
     BuiltInSubgroupLocalInvocationId = 41,
     BuiltInVertexIndex = 42,
     BuiltInInstanceIndex = 43,
+    BuiltInSubgroupEqMask = 4416,
     BuiltInSubgroupEqMaskKHR = 4416,
+    BuiltInSubgroupGeMask = 4417,
     BuiltInSubgroupGeMaskKHR = 4417,
+    BuiltInSubgroupGtMask = 4418,
     BuiltInSubgroupGtMaskKHR = 4418,
+    BuiltInSubgroupLeMask = 4419,
     BuiltInSubgroupLeMaskKHR = 4419,
+    BuiltInSubgroupLtMask = 4420,
     BuiltInSubgroupLtMaskKHR = 4420,
     BuiltInBaseVertex = 4424,
     BuiltInBaseInstance = 4425,
     BuiltInDrawIndex = 4426,
     BuiltInDeviceIndex = 4438,
     BuiltInViewIndex = 4440,
+    BuiltInBaryCoordNoPerspAMD = 4992,
+    BuiltInBaryCoordNoPerspCentroidAMD = 4993,
+    BuiltInBaryCoordNoPerspSampleAMD = 4994,
+    BuiltInBaryCoordSmoothAMD = 4995,
+    BuiltInBaryCoordSmoothCentroidAMD = 4996,
+    BuiltInBaryCoordSmoothSampleAMD = 4997,
+    BuiltInBaryCoordPullModelAMD = 4998,
+    BuiltInFragStencilRefEXT = 5014,
     BuiltInViewportMaskNV = 5253,
     BuiltInSecondaryPositionNV = 5257,
     BuiltInSecondaryViewportMaskNV = 5258,
     BuiltInPositionPerViewNV = 5261,
     BuiltInViewportMaskPerViewNV = 5262,
+    BuiltInFullyCoveredEXT = 5264,
+    BuiltInTaskCountNV = 5274,
+    BuiltInPrimitiveCountNV = 5275,
+    BuiltInPrimitiveIndicesNV = 5276,
+    BuiltInClipDistancePerViewNV = 5277,
+    BuiltInCullDistancePerViewNV = 5278,
+    BuiltInLayerPerViewNV = 5279,
+    BuiltInMeshViewCountNV = 5280,
+    BuiltInMeshViewIndicesNV = 5281,
+    BuiltInBaryCoordNV = 5286,
+    BuiltInBaryCoordNoPerspNV = 5287,
+    BuiltInFragSizeEXT = 5292,
+    BuiltInFragmentSizeNV = 5292,
+    BuiltInFragInvocationCountEXT = 5293,
+    BuiltInInvocationsPerPixelNV = 5293,
+    BuiltInLaunchIdNV = 5319,
+    BuiltInLaunchSizeNV = 5320,
+    BuiltInWorldRayOriginNV = 5321,
+    BuiltInWorldRayDirectionNV = 5322,
+    BuiltInObjectRayOriginNV = 5323,
+    BuiltInObjectRayDirectionNV = 5324,
+    BuiltInRayTminNV = 5325,
+    BuiltInRayTmaxNV = 5326,
+    BuiltInInstanceCustomIndexNV = 5327,
+    BuiltInObjectToWorldNV = 5330,
+    BuiltInWorldToObjectNV = 5331,
+    BuiltInHitTNV = 5332,
+    BuiltInHitKindNV = 5333,
+    BuiltInIncomingRayFlagsNV = 5351,
     BuiltInMax = 0x7fffffff,
 };
 
@@ -458,6 +549,8 @@
 enum LoopControlShift {
     LoopControlUnrollShift = 0,
     LoopControlDontUnrollShift = 1,
+    LoopControlDependencyInfiniteShift = 2,
+    LoopControlDependencyLengthShift = 3,
     LoopControlMax = 0x7fffffff,
 };
 
@@ -465,6 +558,8 @@
     LoopControlMaskNone = 0,
     LoopControlUnrollMask = 0x00000001,
     LoopControlDontUnrollMask = 0x00000002,
+    LoopControlDependencyInfiniteMask = 0x00000004,
+    LoopControlDependencyLengthMask = 0x00000008,
 };
 
 enum FunctionControlShift {
@@ -494,6 +589,9 @@
     MemorySemanticsCrossWorkgroupMemoryShift = 9,
     MemorySemanticsAtomicCounterMemoryShift = 10,
     MemorySemanticsImageMemoryShift = 11,
+    MemorySemanticsOutputMemoryKHRShift = 12,
+    MemorySemanticsMakeAvailableKHRShift = 13,
+    MemorySemanticsMakeVisibleKHRShift = 14,
     MemorySemanticsMax = 0x7fffffff,
 };
 
@@ -509,12 +607,18 @@
     MemorySemanticsCrossWorkgroupMemoryMask = 0x00000200,
     MemorySemanticsAtomicCounterMemoryMask = 0x00000400,
     MemorySemanticsImageMemoryMask = 0x00000800,
+    MemorySemanticsOutputMemoryKHRMask = 0x00001000,
+    MemorySemanticsMakeAvailableKHRMask = 0x00002000,
+    MemorySemanticsMakeVisibleKHRMask = 0x00004000,
 };
 
 enum MemoryAccessShift {
     MemoryAccessVolatileShift = 0,
     MemoryAccessAlignedShift = 1,
     MemoryAccessNontemporalShift = 2,
+    MemoryAccessMakePointerAvailableKHRShift = 3,
+    MemoryAccessMakePointerVisibleKHRShift = 4,
+    MemoryAccessNonPrivatePointerKHRShift = 5,
     MemoryAccessMax = 0x7fffffff,
 };
 
@@ -523,6 +627,9 @@
     MemoryAccessVolatileMask = 0x00000001,
     MemoryAccessAlignedMask = 0x00000002,
     MemoryAccessNontemporalMask = 0x00000004,
+    MemoryAccessMakePointerAvailableKHRMask = 0x00000008,
+    MemoryAccessMakePointerVisibleKHRMask = 0x00000010,
+    MemoryAccessNonPrivatePointerKHRMask = 0x00000020,
 };
 
 enum Scope {
@@ -531,6 +638,7 @@
     ScopeWorkgroup = 2,
     ScopeSubgroup = 3,
     ScopeInvocation = 4,
+    ScopeQueueFamilyKHR = 5,
     ScopeMax = 0x7fffffff,
 };
 
@@ -538,6 +646,10 @@
     GroupOperationReduce = 0,
     GroupOperationInclusiveScan = 1,
     GroupOperationExclusiveScan = 2,
+    GroupOperationClusteredReduce = 3,
+    GroupOperationPartitionedReduceNV = 6,
+    GroupOperationPartitionedInclusiveScanNV = 7,
+    GroupOperationPartitionedExclusiveScanNV = 8,
     GroupOperationMax = 0x7fffffff,
 };
 
@@ -615,6 +727,17 @@
     CapabilityStorageImageReadWithoutFormat = 55,
     CapabilityStorageImageWriteWithoutFormat = 56,
     CapabilityMultiViewport = 57,
+    CapabilitySubgroupDispatch = 58,
+    CapabilityNamedBarrier = 59,
+    CapabilityPipeStorage = 60,
+    CapabilityGroupNonUniform = 61,
+    CapabilityGroupNonUniformVote = 62,
+    CapabilityGroupNonUniformArithmetic = 63,
+    CapabilityGroupNonUniformBallot = 64,
+    CapabilityGroupNonUniformShuffle = 65,
+    CapabilityGroupNonUniformShuffleRelative = 66,
+    CapabilityGroupNonUniformClustered = 67,
+    CapabilityGroupNonUniformQuad = 68,
     CapabilitySubgroupBallotKHR = 4423,
     CapabilityDrawParameters = 4427,
     CapabilitySubgroupVoteKHR = 4431,
@@ -628,12 +751,50 @@
     CapabilityMultiView = 4439,
     CapabilityVariablePointersStorageBuffer = 4441,
     CapabilityVariablePointers = 4442,
+    CapabilityAtomicStorageOps = 4445,
+    CapabilitySampleMaskPostDepthCoverage = 4447,
+    CapabilityStorageBuffer8BitAccess = 4448,
+    CapabilityUniformAndStorageBuffer8BitAccess = 4449,
+    CapabilityStoragePushConstant8 = 4450,
+    CapabilityFloat16ImageAMD = 5008,
+    CapabilityImageGatherBiasLodAMD = 5009,
+    CapabilityFragmentMaskAMD = 5010,
+    CapabilityStencilExportEXT = 5013,
+    CapabilityImageReadWriteLodAMD = 5015,
     CapabilitySampleMaskOverrideCoverageNV = 5249,
     CapabilityGeometryShaderPassthroughNV = 5251,
+    CapabilityShaderViewportIndexLayerEXT = 5254,
     CapabilityShaderViewportIndexLayerNV = 5254,
     CapabilityShaderViewportMaskNV = 5255,
     CapabilityShaderStereoViewNV = 5259,
     CapabilityPerViewAttributesNV = 5260,
+    CapabilityFragmentFullyCoveredEXT = 5265,
+    CapabilityMeshShadingNV = 5266,
+    CapabilityImageFootprintNV = 5282,
+    CapabilityFragmentBarycentricNV = 5284,
+    CapabilityComputeDerivativeGroupQuadsNV = 5288,
+    CapabilityFragmentDensityEXT = 5291,
+    CapabilityShadingRateNV = 5291,
+    CapabilityGroupNonUniformPartitionedNV = 5297,
+    CapabilityShaderNonUniformEXT = 5301,
+    CapabilityRuntimeDescriptorArrayEXT = 5302,
+    CapabilityInputAttachmentArrayDynamicIndexingEXT = 5303,
+    CapabilityUniformTexelBufferArrayDynamicIndexingEXT = 5304,
+    CapabilityStorageTexelBufferArrayDynamicIndexingEXT = 5305,
+    CapabilityUniformBufferArrayNonUniformIndexingEXT = 5306,
+    CapabilitySampledImageArrayNonUniformIndexingEXT = 5307,
+    CapabilityStorageBufferArrayNonUniformIndexingEXT = 5308,
+    CapabilityStorageImageArrayNonUniformIndexingEXT = 5309,
+    CapabilityInputAttachmentArrayNonUniformIndexingEXT = 5310,
+    CapabilityUniformTexelBufferArrayNonUniformIndexingEXT = 5311,
+    CapabilityStorageTexelBufferArrayNonUniformIndexingEXT = 5312,
+    CapabilityRayTracingNV = 5340,
+    CapabilityVulkanMemoryModelKHR = 5345,
+    CapabilityVulkanMemoryModelDeviceScopeKHR = 5346,
+    CapabilityComputeDerivativeGroupLinearNV = 5350,
+    CapabilitySubgroupShuffleINTEL = 5568,
+    CapabilitySubgroupBufferBlockIOINTEL = 5569,
+    CapabilitySubgroupImageBlockIOINTEL = 5570,
     CapabilityMax = 0x7fffffff,
 };
 
@@ -932,12 +1093,87 @@
     OpAtomicFlagTestAndSet = 318,
     OpAtomicFlagClear = 319,
     OpImageSparseRead = 320,
+    OpSizeOf = 321,
+    OpTypePipeStorage = 322,
+    OpConstantPipeStorage = 323,
+    OpCreatePipeFromPipeStorage = 324,
+    OpGetKernelLocalSizeForSubgroupCount = 325,
+    OpGetKernelMaxNumSubgroups = 326,
+    OpTypeNamedBarrier = 327,
+    OpNamedBarrierInitialize = 328,
+    OpMemoryNamedBarrier = 329,
+    OpModuleProcessed = 330,
+    OpExecutionModeId = 331,
+    OpDecorateId = 332,
+    OpGroupNonUniformElect = 333,
+    OpGroupNonUniformAll = 334,
+    OpGroupNonUniformAny = 335,
+    OpGroupNonUniformAllEqual = 336,
+    OpGroupNonUniformBroadcast = 337,
+    OpGroupNonUniformBroadcastFirst = 338,
+    OpGroupNonUniformBallot = 339,
+    OpGroupNonUniformInverseBallot = 340,
+    OpGroupNonUniformBallotBitExtract = 341,
+    OpGroupNonUniformBallotBitCount = 342,
+    OpGroupNonUniformBallotFindLSB = 343,
+    OpGroupNonUniformBallotFindMSB = 344,
+    OpGroupNonUniformShuffle = 345,
+    OpGroupNonUniformShuffleXor = 346,
+    OpGroupNonUniformShuffleUp = 347,
+    OpGroupNonUniformShuffleDown = 348,
+    OpGroupNonUniformIAdd = 349,
+    OpGroupNonUniformFAdd = 350,
+    OpGroupNonUniformIMul = 351,
+    OpGroupNonUniformFMul = 352,
+    OpGroupNonUniformSMin = 353,
+    OpGroupNonUniformUMin = 354,
+    OpGroupNonUniformFMin = 355,
+    OpGroupNonUniformSMax = 356,
+    OpGroupNonUniformUMax = 357,
+    OpGroupNonUniformFMax = 358,
+    OpGroupNonUniformBitwiseAnd = 359,
+    OpGroupNonUniformBitwiseOr = 360,
+    OpGroupNonUniformBitwiseXor = 361,
+    OpGroupNonUniformLogicalAnd = 362,
+    OpGroupNonUniformLogicalOr = 363,
+    OpGroupNonUniformLogicalXor = 364,
+    OpGroupNonUniformQuadBroadcast = 365,
+    OpGroupNonUniformQuadSwap = 366,
     OpSubgroupBallotKHR = 4421,
     OpSubgroupFirstInvocationKHR = 4422,
     OpSubgroupAllKHR = 4428,
     OpSubgroupAnyKHR = 4429,
     OpSubgroupAllEqualKHR = 4430,
     OpSubgroupReadInvocationKHR = 4432,
+    OpGroupIAddNonUniformAMD = 5000,
+    OpGroupFAddNonUniformAMD = 5001,
+    OpGroupFMinNonUniformAMD = 5002,
+    OpGroupUMinNonUniformAMD = 5003,
+    OpGroupSMinNonUniformAMD = 5004,
+    OpGroupFMaxNonUniformAMD = 5005,
+    OpGroupUMaxNonUniformAMD = 5006,
+    OpGroupSMaxNonUniformAMD = 5007,
+    OpFragmentMaskFetchAMD = 5011,
+    OpFragmentFetchAMD = 5012,
+    OpImageSampleFootprintNV = 5283,
+    OpGroupNonUniformPartitionNV = 5296,
+    OpWritePackedPrimitiveIndices4x8NV = 5299,
+    OpReportIntersectionNV = 5334,
+    OpIgnoreIntersectionNV = 5335,
+    OpTerminateRayNV = 5336,
+    OpTraceNV = 5337,
+    OpTypeAccelerationStructureNV = 5341,
+    OpExecuteCallableNV = 5344,
+    OpSubgroupShuffleINTEL = 5571,
+    OpSubgroupShuffleDownINTEL = 5572,
+    OpSubgroupShuffleUpINTEL = 5573,
+    OpSubgroupShuffleXorINTEL = 5574,
+    OpSubgroupBlockReadINTEL = 5575,
+    OpSubgroupBlockWriteINTEL = 5576,
+    OpSubgroupImageBlockReadINTEL = 5577,
+    OpSubgroupImageBlockWriteINTEL = 5578,
+    OpDecorateStringGOOGLE = 5632,
+    OpMemberDecorateStringGOOGLE = 5633,
     OpMax = 0x7fffffff,
 };
 
diff --git a/SPIRV/spvIR.h b/SPIRV/spvIR.h
old mode 100755
new mode 100644
index ce8b4b8..2532b17
--- a/SPIRV/spvIR.h
+++ b/SPIRV/spvIR.h
@@ -65,15 +65,25 @@
 const Id NoType = 0;
 
 const Decoration NoPrecision = DecorationMax;
+
+#ifdef __GNUC__
+#   define POTENTIALLY_UNUSED __attribute__((unused))
+#else
+#   define POTENTIALLY_UNUSED
+#endif
+
+POTENTIALLY_UNUSED
 const MemorySemanticsMask MemorySemanticsAllMemory =
-                (MemorySemanticsMask)(MemorySemanticsSequentiallyConsistentMask |
-                                      MemorySemanticsUniformMemoryMask |
-                                      MemorySemanticsSubgroupMemoryMask |
+                (MemorySemanticsMask)(MemorySemanticsUniformMemoryMask |
                                       MemorySemanticsWorkgroupMemoryMask |
-                                      MemorySemanticsCrossWorkgroupMemoryMask |
                                       MemorySemanticsAtomicCounterMemoryMask |
                                       MemorySemanticsImageMemoryMask);
 
+struct IdImmediate {
+    bool isId;      // true if word is an Id, false if word is an immediate
+    unsigned word;
+};
+
 //
 // SPIR-V IR instruction.
 //
@@ -83,11 +93,16 @@
     Instruction(Id resultId, Id typeId, Op opCode) : resultId(resultId), typeId(typeId), opCode(opCode), block(nullptr) { }
     explicit Instruction(Op opCode) : resultId(NoResult), typeId(NoType), opCode(opCode), block(nullptr) { }
     virtual ~Instruction() {}
-    void addIdOperand(Id id) { operands.push_back(id); }
-    void addImmediateOperand(unsigned int immediate) { operands.push_back(immediate); }
+    void addIdOperand(Id id) {
+        operands.push_back(id);
+        idOperand.push_back(true);
+    }
+    void addImmediateOperand(unsigned int immediate) {
+        operands.push_back(immediate);
+        idOperand.push_back(false);
+    }
     void addStringOperand(const char* str)
     {
-        originalString = str;
         unsigned int word;
         char* wordString = (char*)&word;
         char* wordPtr = wordString;
@@ -112,15 +127,25 @@
             addImmediateOperand(word);
         }
     }
+    bool isIdOperand(int op) const { return idOperand[op]; }
     void setBlock(Block* b) { block = b; }
     Block* getBlock() const { return block; }
     Op getOpCode() const { return opCode; }
-    int getNumOperands() const { return (int)operands.size(); }
+    int getNumOperands() const
+    {
+        assert(operands.size() == idOperand.size());
+        return (int)operands.size();
+    }
     Id getResultId() const { return resultId; }
     Id getTypeId() const { return typeId; }
-    Id getIdOperand(int op) const { return operands[op]; }
-    unsigned int getImmediateOperand(int op) const { return operands[op]; }
-    const char* getStringOperand() const { return originalString.c_str(); }
+    Id getIdOperand(int op) const {
+        assert(idOperand[op]);
+        return operands[op];
+    }
+    unsigned int getImmediateOperand(int op) const {
+        assert(!idOperand[op]);
+        return operands[op];
+    }
 
     // Write out the binary form.
     void dump(std::vector<unsigned int>& out) const
@@ -150,8 +175,8 @@
     Id resultId;
     Id typeId;
     Op opCode;
-    std::vector<Id> operands;
-    std::string originalString;        // could be optimized away; convenience for getting string operand
+    std::vector<Id> operands;     // operands, both <id> and immediates (both are unsigned int)
+    std::vector<bool> idOperand;  // true for operands that are <id>, false for immediates
     Block* block;
 };
 
@@ -256,7 +281,8 @@
             delete blocks[i];
     }
     Id getId() const { return functionInstruction.getResultId(); }
-    Id getParamId(int p) { return parameterInstructions[p]->getResultId(); }
+    Id getParamId(int p) const { return parameterInstructions[p]->getResultId(); }
+    Id getParamType(int p) const { return parameterInstructions[p]->getTypeId(); }
 
     void addBlock(Block* block) { blocks.push_back(block); }
     void removeBlock(Block* block)
@@ -328,7 +354,9 @@
 
     Instruction* getInstruction(Id id) const { return idToInstruction[id]; }
     const std::vector<Function*>& getFunctions() const { return functions; }
-    spv::Id getTypeId(Id resultId) const { return idToInstruction[resultId]->getTypeId(); }
+    spv::Id getTypeId(Id resultId) const {
+        return idToInstruction[resultId] == nullptr ? NoType : idToInstruction[resultId]->getTypeId();
+    }
     StorageClass getStorageClass(Id typeId) const
     {
         assert(idToInstruction[typeId]->getOpCode() == spv::OpTypePointer);
diff --git a/StandAlone/CMakeLists.txt b/StandAlone/CMakeLists.txt
index f37fb0f..5cea53d 100644
--- a/StandAlone/CMakeLists.txt
+++ b/StandAlone/CMakeLists.txt
@@ -1,12 +1,13 @@
 add_library(glslang-default-resource-limits
             ${CMAKE_CURRENT_SOURCE_DIR}/ResourceLimits.cpp)
-set_property(TARGET glslang-default-resource-limits PROPERTY FOLDER glslang POSITION_INDEPENDENT_CODE ON)
+set_property(TARGET glslang-default-resource-limits PROPERTY FOLDER glslang)
+set_property(TARGET glslang-default-resource-limits PROPERTY POSITION_INDEPENDENT_CODE ON)
 
 target_include_directories(glslang-default-resource-limits
                            PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}
                            PUBLIC ${PROJECT_SOURCE_DIR})
 
-set(SOURCES StandAlone.cpp)
+set(SOURCES StandAlone.cpp DirStackFileIncluder.h)
 set(REMAPPER_SOURCES spirv-remap.cpp)
 
 add_executable(glslangValidator ${SOURCES})
@@ -22,7 +23,6 @@
     SPVRemapper
     glslang-default-resource-limits)
 
-
 if(WIN32)
     set(LIBRARIES ${LIBRARIES} psapi)
 elseif(UNIX)
@@ -33,13 +33,21 @@
 
 target_link_libraries(glslangValidator ${LIBRARIES})
 target_link_libraries(spirv-remap ${LIBRARIES})
+target_include_directories(glslangValidator PUBLIC ../External)
 
 if(WIN32)
     source_group("Source" FILES ${SOURCES})
 endif(WIN32)
 
-install(TARGETS glslangValidator
-        RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
+if(ENABLE_GLSLANG_INSTALL)
+    install(TARGETS glslangValidator
+            RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
 
-install(TARGETS spirv-remap
-        RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
+    install(TARGETS spirv-remap
+            RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
+            
+    if(BUILD_SHARED_LIBS)
+        install(TARGETS glslang-default-resource-limits
+                LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR})
+    endif()
+endif(ENABLE_GLSLANG_INSTALL)
diff --git a/StandAlone/DirStackFileIncluder.h b/StandAlone/DirStackFileIncluder.h
new file mode 100644
index 0000000..1873413
--- /dev/null
+++ b/StandAlone/DirStackFileIncluder.h
@@ -0,0 +1,141 @@
+//
+// Copyright (C) 2002-2005  3Dlabs Inc. Ltd.
+// Copyright (C) 2017 Google, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+//
+//    Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//    Redistributions in binary form must reproduce the above
+//    copyright notice, this list of conditions and the following
+//    disclaimer in the documentation and/or other materials provided
+//    with the distribution.
+//
+//    Neither the name of 3Dlabs Inc. Ltd. nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+// POSSIBILITY OF SUCH DAMAGE.
+//
+
+#pragma once
+
+#include <vector>
+#include <string>
+#include <fstream>
+#include <algorithm>
+
+#include "./../glslang/Public/ShaderLang.h"
+
+// Default include class for normal include convention of search backward
+// through the stack of active include paths (for nested includes).
+// Can be overridden to customize.
+class DirStackFileIncluder : public glslang::TShader::Includer {
+public:
+    DirStackFileIncluder() : externalLocalDirectoryCount(0) { }
+
+    virtual IncludeResult* includeLocal(const char* headerName,
+                                        const char* includerName,
+                                        size_t inclusionDepth) override
+    {
+        return readLocalPath(headerName, includerName, (int)inclusionDepth);
+    }
+
+    virtual IncludeResult* includeSystem(const char* headerName,
+                                         const char* /*includerName*/,
+                                         size_t /*inclusionDepth*/) override
+    {
+        return readSystemPath(headerName);
+    }
+
+    // Externally set directories. E.g., from a command-line -I<dir>.
+    //  - Most-recently pushed are checked first.
+    //  - All these are checked after the parse-time stack of local directories
+    //    is checked.
+    //  - This only applies to the "local" form of #include.
+    //  - Makes its own copy of the path.
+    virtual void pushExternalLocalDirectory(const std::string& dir)
+    {
+        directoryStack.push_back(dir);
+        externalLocalDirectoryCount = (int)directoryStack.size();
+    }
+
+    virtual void releaseInclude(IncludeResult* result) override
+    {
+        if (result != nullptr) {
+            delete [] static_cast<tUserDataElement*>(result->userData);
+            delete result;
+        }
+    }
+
+    virtual ~DirStackFileIncluder() override { }
+
+protected:
+    typedef char tUserDataElement;
+    std::vector<std::string> directoryStack;
+    int externalLocalDirectoryCount;
+
+    // Search for a valid "local" path based on combining the stack of include
+    // directories and the nominal name of the header.
+    virtual IncludeResult* readLocalPath(const char* headerName, const char* includerName, int depth)
+    {
+        // Discard popped include directories, and
+        // initialize when at parse-time first level.
+        directoryStack.resize(depth + externalLocalDirectoryCount);
+        if (depth == 1)
+            directoryStack.back() = getDirectory(includerName);
+
+        // Find a directory that works, using a reverse search of the include stack.
+        for (auto it = directoryStack.rbegin(); it != directoryStack.rend(); ++it) {
+            std::string path = *it + '/' + headerName;
+            std::replace(path.begin(), path.end(), '\\', '/');
+            std::ifstream file(path, std::ios_base::binary | std::ios_base::ate);
+            if (file) {
+                directoryStack.push_back(getDirectory(path));
+                return newIncludeResult(path, file, (int)file.tellg());
+            }
+        }
+
+        return nullptr;
+    }
+
+    // Search for a valid <system> path.
+    // Not implemented yet; returning nullptr signals failure to find.
+    virtual IncludeResult* readSystemPath(const char* /*headerName*/) const
+    {
+        return nullptr;
+    }
+
+    // Do actual reading of the file, filling in a new include result.
+    virtual IncludeResult* newIncludeResult(const std::string& path, std::ifstream& file, int length) const
+    {
+        char* content = new tUserDataElement [length];
+        file.seekg(0, file.beg);
+        file.read(content, length);
+        return new IncludeResult(path, content, length, content);
+    }
+
+    // If no path markers, return current working directory.
+    // Otherwise, strip file name and return path leading up to it.
+    virtual std::string getDirectory(const std::string path) const
+    {
+        size_t last = path.find_last_of("/\\");
+        return last == std::string::npos ? "." : path.substr(0, last);
+    }
+};
diff --git a/StandAlone/ResourceLimits.cpp b/StandAlone/ResourceLimits.cpp
index e22ec80..66e79af 100644
--- a/StandAlone/ResourceLimits.cpp
+++ b/StandAlone/ResourceLimits.cpp
@@ -125,6 +125,16 @@
     /* .MaxCullDistances = */ 8,
     /* .MaxCombinedClipAndCullDistances = */ 8,
     /* .MaxSamples = */ 4,
+    /* .maxMeshOutputVerticesNV = */ 256,
+    /* .maxMeshOutputPrimitivesNV = */ 512,
+    /* .maxMeshWorkGroupSizeX_NV = */ 32,
+    /* .maxMeshWorkGroupSizeY_NV = */ 1,
+    /* .maxMeshWorkGroupSizeZ_NV = */ 1,
+    /* .maxTaskWorkGroupSizeX_NV = */ 32,
+    /* .maxTaskWorkGroupSizeY_NV = */ 1,
+    /* .maxTaskWorkGroupSizeZ_NV = */ 1,
+    /* .maxMeshViewCountNV = */ 4,
+
     /* .limits = */ {
         /* .nonInductiveForLoops = */ 1,
         /* .whileLoops = */ 1,
@@ -224,7 +234,17 @@
             << "MaxCullDistances "                          << DefaultTBuiltInResource.maxCullDistances << "\n"
             << "MaxCombinedClipAndCullDistances "           << DefaultTBuiltInResource.maxCombinedClipAndCullDistances << "\n"
             << "MaxSamples "                                << DefaultTBuiltInResource.maxSamples << "\n"
-
+#ifdef NV_EXTENSIONS
+            << "MaxMeshOutputVerticesNV "                   << DefaultTBuiltInResource.maxMeshOutputVerticesNV << "\n"
+            << "MaxMeshOutputPrimitivesNV "                 << DefaultTBuiltInResource.maxMeshOutputPrimitivesNV << "\n"
+            << "MaxMeshWorkGroupSizeX_NV "                  << DefaultTBuiltInResource.maxMeshWorkGroupSizeX_NV << "\n"
+            << "MaxMeshWorkGroupSizeY_NV "                  << DefaultTBuiltInResource.maxMeshWorkGroupSizeY_NV << "\n"
+            << "MaxMeshWorkGroupSizeZ_NV "                  << DefaultTBuiltInResource.maxMeshWorkGroupSizeZ_NV << "\n"
+            << "MaxTaskWorkGroupSizeX_NV "                  << DefaultTBuiltInResource.maxTaskWorkGroupSizeX_NV << "\n"
+            << "MaxTaskWorkGroupSizeY_NV "                  << DefaultTBuiltInResource.maxTaskWorkGroupSizeY_NV << "\n"
+            << "MaxTaskWorkGroupSizeZ_NV "                  << DefaultTBuiltInResource.maxTaskWorkGroupSizeZ_NV << "\n"
+            << "MaxMeshViewCountNV "                        << DefaultTBuiltInResource.maxMeshViewCountNV << "\n"
+#endif
             << "nonInductiveForLoops "                      << DefaultTBuiltInResource.limits.nonInductiveForLoops << "\n"
             << "whileLoops "                                << DefaultTBuiltInResource.limits.whileLoops << "\n"
             << "doWhileLoops "                              << DefaultTBuiltInResource.limits.doWhileLoops << "\n"
@@ -431,6 +451,26 @@
             resources->maxCombinedClipAndCullDistances = value;
         else if (tokenStr == "MaxSamples")
             resources->maxSamples = value;
+#ifdef NV_EXTENSIONS
+        else if (tokenStr == "MaxMeshOutputVerticesNV")
+            resources->maxMeshOutputVerticesNV = value;
+        else if (tokenStr == "MaxMeshOutputPrimitivesNV")
+            resources->maxMeshOutputPrimitivesNV = value;
+        else if (tokenStr == "MaxMeshWorkGroupSizeX_NV")
+            resources->maxMeshWorkGroupSizeX_NV = value;
+        else if (tokenStr == "MaxMeshWorkGroupSizeY_NV")
+            resources->maxMeshWorkGroupSizeY_NV = value;
+        else if (tokenStr == "MaxMeshWorkGroupSizeZ_NV")
+            resources->maxMeshWorkGroupSizeZ_NV = value;
+        else if (tokenStr == "MaxTaskWorkGroupSizeX_NV")
+            resources->maxTaskWorkGroupSizeX_NV = value;
+        else if (tokenStr == "MaxTaskWorkGroupSizeY_NV")
+            resources->maxTaskWorkGroupSizeY_NV = value;
+        else if (tokenStr == "MaxTaskWorkGroupSizeZ_NV")
+            resources->maxTaskWorkGroupSizeZ_NV = value;
+        else if (tokenStr == "MaxMeshViewCountNV")
+            resources->maxMeshViewCountNV = value;
+#endif
         else if (tokenStr == "nonInductiveForLoops")
             resources->limits.nonInductiveForLoops = (value != 0);
         else if (tokenStr == "whileLoops")
diff --git a/StandAlone/StandAlone.cpp b/StandAlone/StandAlone.cpp
old mode 100644
new mode 100755
index 3faadec..060428b
--- a/StandAlone/StandAlone.cpp
+++ b/StandAlone/StandAlone.cpp
@@ -35,10 +35,13 @@
 //
 
 // this only applies to the standalone wrapper, not the front end in general
+#ifndef _CRT_SECURE_NO_WARNINGS
 #define _CRT_SECURE_NO_WARNINGS
+#endif
 
 #include "ResourceLimits.h"
 #include "Worklist.h"
+#include "DirStackFileIncluder.h"
 #include "./../glslang/Include/ShHandle.h"
 #include "./../glslang/Include/revision.h"
 #include "./../glslang/Public/ShaderLang.h"
@@ -46,11 +49,13 @@
 #include "../SPIRV/GLSL.std.450.h"
 #include "../SPIRV/doc.h"
 #include "../SPIRV/disassemble.h"
+
 #include <cstring>
 #include <cstdlib>
 #include <cctype>
 #include <cmath>
 #include <array>
+#include <map>
 #include <memory>
 #include <thread>
 
@@ -88,7 +93,17 @@
     EOptionKeepUncalled         = (1 << 22),
     EOptionHlslOffsets          = (1 << 23),
     EOptionHlslIoMapping        = (1 << 24),
+    EOptionAutoMapLocations     = (1 << 25),
+    EOptionDebug                = (1 << 26),
+    EOptionStdin                = (1 << 27),
+    EOptionOptimizeDisable      = (1 << 28),
+    EOptionOptimizeSize         = (1 << 29),
+    EOptionInvertY              = (1 << 30),
+    EOptionDumpBareVersion      = (1 << 31),
 };
+bool targetHlslFunctionality1 = false;
+bool SpvToolsDisassembler = false;
+bool SpvToolsValidate = false;
 
 //
 // Return codes from main/exit().
@@ -109,17 +124,16 @@
 EShLanguage FindLanguage(const std::string& name, bool parseSuffix=true);
 void CompileFile(const char* fileName, ShHandle);
 void usage();
-void FreeFileData(char** data);
-char** ReadFileData(const char* fileName);
+char* ReadFileData(const char* fileName);
+void FreeFileData(char* data);
 void InfoLogMsg(const char* msg, const char* name, const int num);
 
 // Globally track if any compile or link failure.
 bool CompileFailed = false;
 bool LinkFailed = false;
 
-// Use to test breaking up a single shader file into multiple strings.
-// Set in ReadFileData().
-int NumShaderStrings;
+// array of unique places to leave the shader names and infologs for the asynchronous compiles
+std::vector<std::unique_ptr<glslang::TWorkItem>> WorkItems;
 
 TBuiltInResource Resources;
 std::string ConfigFile;
@@ -129,29 +143,13 @@
 //
 void ProcessConfigFile()
 {
-    char** configStrings = 0;
-    char* config = 0;
-    if (ConfigFile.size() > 0) {
-        configStrings = ReadFileData(ConfigFile.c_str());
-        if (configStrings)
-            config = *configStrings;
-        else {
-            printf("Error opening configuration file; will instead use the default configuration\n");
-            usage();
-        }
-    }
-
-    if (config == 0) {
+    if (ConfigFile.size() == 0)
         Resources = glslang::DefaultTBuiltInResource;
-        return;
+    else {
+        char* configString = ReadFileData(ConfigFile.c_str());
+        glslang::DecodeResourceLimits(&Resources,  configString);
+        FreeFileData(configString);
     }
-
-    glslang::DecodeResourceLimits(&Resources,  config);
-
-    if (configStrings)
-        FreeFileData(configStrings);
-    else
-        delete[] config;
 }
 
 int Options = 0;
@@ -161,13 +159,83 @@
 const char* sourceEntryPointName = nullptr;
 const char* shaderStageName = nullptr;
 const char* variableName = nullptr;
+bool HlslEnable16BitTypes = false;
+std::vector<std::string> IncludeDirectoryList;
 
-std::array<unsigned int, EShLangCount> baseSamplerBinding;
-std::array<unsigned int, EShLangCount> baseTextureBinding;
-std::array<unsigned int, EShLangCount> baseImageBinding;
-std::array<unsigned int, EShLangCount> baseUboBinding;
-std::array<unsigned int, EShLangCount> baseSsboBinding;
-std::array<unsigned int, EShLangCount> baseUavBinding;
+// Source environment
+// (source 'Client' is currently the same as target 'Client')
+int ClientInputSemanticsVersion = 100;
+
+// Target environment
+glslang::EShClient Client = glslang::EShClientNone;  // will stay EShClientNone if only validating
+glslang::EShTargetClientVersion ClientVersion;       // not valid until Client is set
+glslang::EShTargetLanguage TargetLanguage = glslang::EShTargetNone;
+glslang::EShTargetLanguageVersion TargetVersion;     // not valid until TargetLanguage is set
+
+std::vector<std::string> Processes;                     // what should be recorded by OpModuleProcessed, or equivalent
+
+// Per descriptor-set binding base data
+typedef std::map<unsigned int, unsigned int> TPerSetBaseBinding;
+
+std::vector<std::pair<std::string, int>> uniformLocationOverrides;
+int uniformBase = 0;
+
+std::array<std::array<unsigned int, EShLangCount>, glslang::EResCount> baseBinding;
+std::array<std::array<TPerSetBaseBinding, EShLangCount>, glslang::EResCount> baseBindingForSet;
+std::array<std::vector<std::string>, EShLangCount> baseResourceSetBinding;
+
+// Add things like "#define ..." to a preamble to use in the beginning of the shader.
+class TPreamble {
+public:
+    TPreamble() { }
+
+    bool isSet() const { return text.size() > 0; }
+    const char* get() const { return text.c_str(); }
+
+    // #define...
+    void addDef(std::string def)
+    {
+        text.append("#define ");
+        fixLine(def);
+
+        Processes.push_back("D");
+        Processes.back().append(def);
+
+        // The first "=" needs to turn into a space
+        const size_t equal = def.find_first_of("=");
+        if (equal != def.npos)
+            def[equal] = ' ';
+
+        text.append(def);
+        text.append("\n");
+    }
+
+    // #undef...
+    void addUndef(std::string undef)
+    {
+        text.append("#undef ");
+        fixLine(undef);
+
+        Processes.push_back("U");
+        Processes.back().append(undef);
+
+        text.append(undef);
+        text.append("\n");
+    }
+
+protected:
+    void fixLine(std::string& line)
+    {
+        // Can't go past a newline in the line
+        const size_t end = line.find_first_of("\n");
+        if (end != line.npos)
+            line = line.substr(0, end);
+    }
+
+    std::string text;  // contents of preamble
+};
+
+TPreamble UserPreamble;
 
 //
 // Create the default name for saving a binary if -o is not provided.
@@ -183,6 +251,16 @@
         case EShLangGeometry:        name = "geom.spv";    break;
         case EShLangFragment:        name = "frag.spv";    break;
         case EShLangCompute:         name = "comp.spv";    break;
+#ifdef NV_EXTENSIONS
+        case EShLangRayGenNV:        name = "rgen.spv";    break;
+        case EShLangIntersectNV:     name = "rint.spv";    break;
+        case EShLangAnyHitNV:        name = "rahit.spv";   break;
+        case EShLangClosestHitNV:    name = "rchit.spv";   break;
+        case EShLangMissNV:          name = "rmiss.spv";   break;
+        case EShLangCallableNV:      name = "rcall.spv";   break;
+        case EShLangMeshNV:          name = "mesh.spv";    break;
+        case EShLangTaskNV:          name = "task.spv";    break;
+#endif
         default:                     name = "unknown";     break;
         }
     } else
@@ -212,16 +290,63 @@
 //
 void Error(const char* message)
 {
-    printf("%s: Error %s (use -h for usage)\n", ExecutableName, message);
+    fprintf(stderr, "%s: Error %s (use -h for usage)\n", ExecutableName, message);
     exit(EFailUsage);
 }
 
 //
-// Process an optional binding base of the form:
-//   --argname [stage] base
+// Process an optional binding base of one the forms:
+//   --argname [stage] base            // base for stage (if given) or all stages (if not)
+//   --argname [stage] [base set]...   // set/base pairs: set the base for given binding set.
+
 // Where stage is one of the forms accepted by FindLanguage, and base is an integer
 //
-void ProcessBindingBase(int& argc, char**& argv, std::array<unsigned int, EShLangCount>& base)
+void ProcessBindingBase(int& argc, char**& argv, glslang::TResourceType res)
+{
+    if (argc < 2)
+        usage();
+
+    EShLanguage lang = EShLangCount;
+    int singleBase = 0;
+    TPerSetBaseBinding perSetBase;
+    int arg = 1;
+
+    // Parse stage, if given
+    if (!isdigit(argv[arg][0])) {
+        if (argc < 3) // this form needs one more argument
+            usage();
+
+        lang = FindLanguage(argv[arg++], false);
+    }
+
+    if ((argc - arg) > 2 && isdigit(argv[arg+0][0]) && isdigit(argv[arg+1][0])) {
+        // Parse a per-set binding base
+        while ((argc - arg) > 2 && isdigit(argv[arg+0][0]) && isdigit(argv[arg+1][0])) {
+            const int baseNum = atoi(argv[arg++]);
+            const int setNum = atoi(argv[arg++]);
+            perSetBase[setNum] = baseNum;
+        }
+    } else {
+        // Parse single binding base
+        singleBase = atoi(argv[arg++]);
+    }
+
+    argc -= (arg-1);
+    argv += (arg-1);
+
+    // Set one or all languages
+    const int langMin = (lang < EShLangCount) ? lang+0 : 0;
+    const int langMax = (lang < EShLangCount) ? lang+1 : EShLangCount;
+
+    for (int lang = langMin; lang < langMax; ++lang) {
+        if (!perSetBase.empty())
+            baseBindingForSet[res][lang].insert(perSetBase.begin(), perSetBase.end());
+        else
+            baseBinding[res][lang] = singleBase;
+    }
+}
+
+void ProcessResourceSetBindingBase(int& argc, char**& argv, std::array<std::vector<std::string>, EShLangCount>& base)
 {
     if (argc < 2)
         usage();
@@ -230,15 +355,28 @@
         if (argc < 3) // this form needs one more argument
             usage();
 
-        // Parse form: --argname stage base
+        // Parse form: --argname stage [regname set base...], or:
+        //             --argname stage set
         const EShLanguage lang = FindLanguage(argv[1], false);
-        base[lang] = atoi(argv[2]);
-        argc-= 2;
-        argv+= 2;
+
+        argc--;
+        argv++;
+
+        while (argc > 1 && argv[1] != nullptr && argv[1][0] != '-') {
+            base[lang].push_back(argv[1]);
+
+            argc--;
+            argv++;
+        }
+
+        // Must have one arg, or a multiple of three (for [regname set binding] triples)
+        if (base[lang].size() != 1 && (base[lang].size() % 3) != 0)
+            usage();
+
     } else {
-        // Parse form: --argname base
+        // Parse form: --argname set
         for (int lang=0; lang<EShLangCount; ++lang)
-            base[lang] = atoi(argv[1]);
+            base[lang].push_back(argv[1]);
 
         argc--;
         argv++;
@@ -253,19 +391,76 @@
 //
 void ProcessArguments(std::vector<std::unique_ptr<glslang::TWorkItem>>& workItems, int argc, char* argv[])
 {
-    baseSamplerBinding.fill(0);
-    baseTextureBinding.fill(0);
-    baseImageBinding.fill(0);
-    baseUboBinding.fill(0);
-    baseSsboBinding.fill(0);
-    baseUavBinding.fill(0);
+    for (int res = 0; res < glslang::EResCount; ++res)
+        baseBinding[res].fill(0);
 
     ExecutableName = argv[0];
     workItems.reserve(argc);
 
-    argc--;
-    argv++;
-    for (; argc >= 1; argc--, argv++) {
+    const auto bumpArg = [&]() {
+        if (argc > 0) {
+            argc--;
+            argv++;
+        }
+    };
+
+    // read a string directly attached to a single-letter option
+    const auto getStringOperand = [&](const char* desc) {
+        if (argv[0][2] == 0) {
+            printf("%s must immediately follow option (no spaces)\n", desc);
+            exit(EFailUsage);
+        }
+        return argv[0] + 2;
+    };
+
+    // read a number attached to a single-letter option
+    const auto getAttachedNumber = [&](const char* desc) {
+        int num = atoi(argv[0] + 2);
+        if (num == 0) {
+            printf("%s: expected attached non-0 number\n", desc);
+            exit(EFailUsage);
+        }
+        return num;
+    };
+
+    // minimum needed (without overriding something else) to target Vulkan SPIR-V
+    const auto setVulkanSpv = []() {
+        if (Client == glslang::EShClientNone)
+            ClientVersion = glslang::EShTargetVulkan_1_0;
+        Client = glslang::EShClientVulkan;
+        Options |= EOptionSpv;
+        Options |= EOptionVulkanRules;
+        Options |= EOptionLinkProgram;
+    };
+
+    // minimum needed (without overriding something else) to target OpenGL SPIR-V
+    const auto setOpenGlSpv = []() {
+        if (Client == glslang::EShClientNone)
+            ClientVersion = glslang::EShTargetOpenGL_450;
+        Client = glslang::EShClientOpenGL;
+        Options |= EOptionSpv;
+        Options |= EOptionLinkProgram;
+        // undo a -H default to Vulkan
+        Options &= ~EOptionVulkanRules;
+    };
+
+    const auto getUniformOverride = [getStringOperand]() {
+        const char *arg = getStringOperand("-u<name>:<location>");
+        const char *split = strchr(arg, ':');
+        if (split == NULL) {
+            printf("%s: missing location\n", arg);
+            exit(EFailUsage);
+        }
+        errno = 0;
+        int location = ::strtol(split + 1, NULL, 10);
+        if (errno) {
+            printf("%s: invalid location\n", arg);
+            exit(EFailUsage);
+        }
+        return std::make_pair(std::string(arg, split - arg), location);
+    };
+
+    for (bumpArg(); argc >= 1; bumpArg()) {
         if (argv[0][0] == '-') {
             switch (argv[0][1]) {
             case '-':
@@ -274,129 +469,230 @@
                     std::transform(lowerword.begin(), lowerword.end(), lowerword.begin(), ::tolower);
 
                     // handle --word style options
-                    if (lowerword == "shift-sampler-bindings" || // synonyms
-                        lowerword == "shift-sampler-binding"  ||
-                        lowerword == "ssb") {
-                        ProcessBindingBase(argc, argv, baseSamplerBinding);
-                    } else if (lowerword == "shift-texture-bindings" ||  // synonyms
-                               lowerword == "shift-texture-binding"  ||
-                               lowerword == "stb") {
-                        ProcessBindingBase(argc, argv, baseTextureBinding);
-                    } else if (lowerword == "shift-image-bindings" ||  // synonyms
-                               lowerword == "shift-image-binding"  ||
-                               lowerword == "sib") {
-                        ProcessBindingBase(argc, argv, baseImageBinding);
-                    } else if (lowerword == "shift-ubo-bindings" ||  // synonyms
-                               lowerword == "shift-ubo-binding"  ||
-                               lowerword == "shift-cbuffer-bindings" ||
-                               lowerword == "shift-cbuffer-binding"  ||
-                               lowerword == "sub" ||
-                               lowerword == "scb") {
-                        ProcessBindingBase(argc, argv, baseUboBinding);
-                    } else if (lowerword == "shift-ssbo-bindings" ||  // synonyms
-                               lowerword == "shift-ssbo-binding"  ||
-                               lowerword == "sbb") {
-                        ProcessBindingBase(argc, argv, baseSsboBinding);
-                    } else if (lowerword == "shift-uav-bindings" ||  // synonyms
-                               lowerword == "shift-uav-binding"  ||
-                               lowerword == "suavb") {
-                        ProcessBindingBase(argc, argv, baseUavBinding);
-                    } else if (lowerword == "auto-map-bindings" ||  // synonyms
-                               lowerword == "auto-map-binding"  ||
-                               lowerword == "amb") {
+                    if (lowerword == "auto-map-bindings" ||  // synonyms
+                        lowerword == "auto-map-binding"  ||
+                        lowerword == "amb") {
                         Options |= EOptionAutoMapBindings;
+                    } else if (lowerword == "auto-map-locations" || // synonyms
+                               lowerword == "aml") {
+                        Options |= EOptionAutoMapLocations;
+                    } else if (lowerword == "uniform-base") {
+                        if (argc <= 1)
+                            Error("no <base> provided for --uniform-base");
+                        uniformBase = ::strtol(argv[1], NULL, 10);
+                        bumpArg();
+                        break;
+                    } else if (lowerword == "client") {
+                        if (argc > 1) {
+                            if (strcmp(argv[1], "vulkan100") == 0)
+                                setVulkanSpv();
+                            else if (strcmp(argv[1], "opengl100") == 0)
+                                setOpenGlSpv();
+                            else
+                                Error("--client expects vulkan100 or opengl100");
+                        }
+                        bumpArg();
+                    } else if (lowerword == "entry-point") {
+                        entryPointName = argv[1];
+                        if (argc <= 1)
+                            Error("no <name> provided for --entry-point");
+                        bumpArg();
                     } else if (lowerword == "flatten-uniform-arrays" || // synonyms
                                lowerword == "flatten-uniform-array"  ||
                                lowerword == "fua") {
                         Options |= EOptionFlattenUniformArrays;
-                    } else if (lowerword == "no-storage-format" || // synonyms
-                               lowerword == "nsf") {
-                        Options |= EOptionNoStorageFormat;
-                    } else if (lowerword == "variable-name" || // synonyms
-                        lowerword == "vn") {
-                        Options |= EOptionOutputHexadecimal;
-                        variableName = argv[1];
-                        if (argc > 0) {
-                            argc--;
-                            argv++;
-                        } else
-                            Error("no <C-variable-name> provided for --variable-name");
-                        break;
-                    } else if (lowerword == "source-entrypoint" || // synonyms
-                               lowerword == "sep") {
-                        sourceEntryPointName = argv[1];
-                        if (argc > 0) {
-                            argc--;
-                            argv++;
-                        } else
-                            Error("no <entry-point> provided for --source-entrypoint");
-                        break;
-                    } else if (lowerword == "keep-uncalled" || // synonyms
-                               lowerword == "ku") {
-                        Options |= EOptionKeepUncalled;
                     } else if (lowerword == "hlsl-offsets") {
                         Options |= EOptionHlslOffsets;
                     } else if (lowerword == "hlsl-iomap" ||
                                lowerword == "hlsl-iomapper" ||
                                lowerword == "hlsl-iomapping") {
                         Options |= EOptionHlslIoMapping;
+                    } else if (lowerword == "hlsl-enable-16bit-types") {
+                        HlslEnable16BitTypes = true;
+                    } else if (lowerword == "invert-y" ||  // synonyms
+                               lowerword == "iy") {
+                        Options |= EOptionInvertY;
+                    } else if (lowerword == "keep-uncalled" || // synonyms
+                               lowerword == "ku") {
+                        Options |= EOptionKeepUncalled;
+                    } else if (lowerword == "no-storage-format" || // synonyms
+                               lowerword == "nsf") {
+                        Options |= EOptionNoStorageFormat;
+                    } else if (lowerword == "relaxed-errors") {
+                        Options |= EOptionRelaxedErrors;
+                    } else if (lowerword == "resource-set-bindings" ||  // synonyms
+                               lowerword == "resource-set-binding"  ||
+                               lowerword == "rsb") {
+                        ProcessResourceSetBindingBase(argc, argv, baseResourceSetBinding);
+                    } else if (lowerword == "shift-image-bindings" ||  // synonyms
+                               lowerword == "shift-image-binding"  ||
+                               lowerword == "sib") {
+                        ProcessBindingBase(argc, argv, glslang::EResImage);
+                    } else if (lowerword == "shift-sampler-bindings" || // synonyms
+                               lowerword == "shift-sampler-binding"  ||
+                               lowerword == "ssb") {
+                        ProcessBindingBase(argc, argv, glslang::EResSampler);
+                    } else if (lowerword == "shift-uav-bindings" ||  // synonyms
+                               lowerword == "shift-uav-binding"  ||
+                               lowerword == "suavb") {
+                        ProcessBindingBase(argc, argv, glslang::EResUav);
+                    } else if (lowerword == "shift-texture-bindings" ||  // synonyms
+                               lowerword == "shift-texture-binding"  ||
+                               lowerword == "stb") {
+                        ProcessBindingBase(argc, argv, glslang::EResTexture);
+                    } else if (lowerword == "shift-ubo-bindings" ||  // synonyms
+                               lowerword == "shift-ubo-binding"  ||
+                               lowerword == "shift-cbuffer-bindings" ||
+                               lowerword == "shift-cbuffer-binding"  ||
+                               lowerword == "sub" ||
+                               lowerword == "scb") {
+                        ProcessBindingBase(argc, argv, glslang::EResUbo);
+                    } else if (lowerword == "shift-ssbo-bindings" ||  // synonyms
+                               lowerword == "shift-ssbo-binding"  ||
+                               lowerword == "sbb") {
+                        ProcessBindingBase(argc, argv, glslang::EResSsbo);
+                    } else if (lowerword == "source-entrypoint" || // synonyms
+                               lowerword == "sep") {
+                        if (argc <= 1)
+                            Error("no <entry-point> provided for --source-entrypoint");
+                        sourceEntryPointName = argv[1];
+                        bumpArg();
+                        break;
+                    } else if (lowerword == "spirv-dis") {
+                        SpvToolsDisassembler = true;
+                    } else if (lowerword == "spirv-val") {
+                        SpvToolsValidate = true;
+                    } else if (lowerword == "stdin") {
+                        Options |= EOptionStdin;
+                        shaderStageName = argv[1];
+                    } else if (lowerword == "suppress-warnings") {
+                        Options |= EOptionSuppressWarnings;
+                    } else if (lowerword == "target-env") {
+                        if (argc > 1) {
+                            if (strcmp(argv[1], "vulkan1.0") == 0) {
+                                setVulkanSpv();
+                                ClientVersion = glslang::EShTargetVulkan_1_0;
+                            } else if (strcmp(argv[1], "vulkan1.1") == 0) {
+                                setVulkanSpv();
+                                ClientVersion = glslang::EShTargetVulkan_1_1;
+                            } else if (strcmp(argv[1], "opengl") == 0) {
+                                setOpenGlSpv();
+                                ClientVersion = glslang::EShTargetOpenGL_450;
+                            } else if (strcmp(argv[1], "spirv1.0") == 0) {
+                                TargetLanguage = glslang::EShTargetSpv;
+                                TargetVersion = glslang::EShTargetSpv_1_0;
+                            } else if (strcmp(argv[1], "spirv1.1") == 0) {
+                                TargetLanguage = glslang::EShTargetSpv;
+                                TargetVersion = glslang::EShTargetSpv_1_1;
+                            } else if (strcmp(argv[1], "spirv1.2") == 0) {
+                                TargetLanguage = glslang::EShTargetSpv;
+                                TargetVersion = glslang::EShTargetSpv_1_2;
+                            } else if (strcmp(argv[1], "spirv1.3") == 0) {
+                                TargetLanguage = glslang::EShTargetSpv;
+                                TargetVersion = glslang::EShTargetSpv_1_3;
+                            } else if (strcmp(argv[1], "spirv1.4") == 0) {
+                                TargetLanguage = glslang::EShTargetSpv;
+                                TargetVersion = glslang::EShTargetSpv_1_4;
+                            } else
+                                Error("--target-env expected one of: vulkan1.0, vulkan1.1, opengl, spirv1.0, spirv1.1, spirv1.2, or spirv1.3");
+                        }
+                        bumpArg();
+                    } else if (lowerword == "variable-name" || // synonyms
+                               lowerword == "vn") {
+                        Options |= EOptionOutputHexadecimal;
+                        if (argc <= 1)
+                            Error("no <C-variable-name> provided for --variable-name");
+                        variableName = argv[1];
+                        bumpArg();
+                        break;
+                    } else if (lowerword == "version") {
+                        Options |= EOptionDumpVersions;
                     } else {
                         usage();
                     }
                 }
                 break;
-            case 'H':
-                Options |= EOptionHumanReadableSpv;
-                if ((Options & EOptionSpv) == 0) {
-                    // default to Vulkan
-                    Options |= EOptionSpv;
-                    Options |= EOptionVulkanRules;
-                    Options |= EOptionLinkProgram;
-                }
+            case 'C':
+                Options |= EOptionCascadingErrors;
                 break;
-            case 'V':
-                Options |= EOptionSpv;
-                Options |= EOptionVulkanRules;
-                Options |= EOptionLinkProgram;
+            case 'D':
+                if (argv[0][2] == 0)
+                    Options |= EOptionReadHlsl;
+                else
+                    UserPreamble.addDef(getStringOperand("-D<macro> macro name"));
                 break;
-            case 'S':
-                shaderStageName = argv[1];
-                if (argc > 0) {
-                    argc--;
-                    argv++;
-                } else
-                    Error("no <stage> specified for -S");
-                break;
-            case 'G':
-                Options |= EOptionSpv;
-                Options |= EOptionLinkProgram;
-                // undo a -H default to Vulkan
-                Options &= ~EOptionVulkanRules;
+            case 'u':
+                uniformLocationOverrides.push_back(getUniformOverride());
                 break;
             case 'E':
                 Options |= EOptionOutputPreprocessed;
                 break;
+            case 'G':
+                // OpenGL client
+                setOpenGlSpv();
+                if (argv[0][2] != 0)
+                    ClientInputSemanticsVersion = getAttachedNumber("-G<num> client input semantics");
+                break;
+            case 'H':
+                Options |= EOptionHumanReadableSpv;
+                if ((Options & EOptionSpv) == 0) {
+                    // default to Vulkan
+                    setVulkanSpv();
+                }
+                break;
+            case 'I':
+                IncludeDirectoryList.push_back(getStringOperand("-I<dir> include path"));
+                break;
+            case 'O':
+                if (argv[0][2] == 'd')
+                    Options |= EOptionOptimizeDisable;
+                else if (argv[0][2] == 's')
+#if ENABLE_OPT
+                    Options |= EOptionOptimizeSize;
+#else
+                    Error("-Os not available; optimizer not linked");
+#endif
+                else
+                    Error("unknown -O option");
+                break;
+            case 'S':
+                if (argc <= 1)
+                    Error("no <stage> specified for -S");
+                shaderStageName = argv[1];
+                bumpArg();
+                break;
+            case 'U':
+                UserPreamble.addUndef(getStringOperand("-U<macro>: macro name"));
+                break;
+            case 'V':
+                setVulkanSpv();
+                if (argv[0][2] != 0)
+                    ClientInputSemanticsVersion = getAttachedNumber("-V<num> client input semantics");
+                break;
             case 'c':
                 Options |= EOptionDumpConfig;
                 break;
-            case 'C':
-                Options |= EOptionCascadingErrors;
-                break;
             case 'd':
-                Options |= EOptionDefaultDesktop;
-                break;
-            case 'D':
-                Options |= EOptionReadHlsl;
+                if (strncmp(&argv[0][1], "dumpversion", strlen(&argv[0][1]) + 1) == 0 ||
+                    strncmp(&argv[0][1], "dumpfullversion", strlen(&argv[0][1]) + 1) == 0)
+                    Options |= EOptionDumpBareVersion;
+                else
+                    Options |= EOptionDefaultDesktop;
                 break;
             case 'e':
-                // HLSL todo: entry point handle needs much more sophistication.
-                // This is okay for one compilation unit with one entry point.
                 entryPointName = argv[1];
-                if (argc > 0) {
-                    argc--;
-                    argv++;
-                } else
-                    Error("no <entry-point> provided for -e");
+                if (argc <= 1)
+                    Error("no <name> provided for -e");
+                bumpArg();
+                break;
+            case 'f':
+                if (strcmp(&argv[0][2], "hlsl_functionality1") == 0)
+                    targetHlslFunctionality1 = true;
+                else
+                    Error("-f: expected hlsl_functionality1");
+                break;
+            case 'g':
+                Options |= EOptionDebug;
                 break;
             case 'h':
                 usage();
@@ -411,12 +707,10 @@
                 Options |= EOptionMemoryLeakMode;
                 break;
             case 'o':
-                binaryFileName = argv[1];
-                if (argc > 0) {
-                    argc--;
-                    argv++;
-                } else
+                if (argc <= 1)
                     Error("no <file> provided for -o");
+                binaryFileName = argv[1];
+                bumpArg();
                 break;
             case 'q':
                 Options |= EOptionDumpReflection;
@@ -451,6 +745,10 @@
         }
     }
 
+    // Make sure that -S is always specified if --stdin is specified
+    if ((Options & EOptionStdin) && shaderStageName == nullptr)
+        Error("must provide -S when --stdin is given");
+
     // Make sure that -E is not specified alongside linking (which includes SPV generation)
     if ((Options & EOptionOutputPreprocessed) && (Options & EOptionLinkProgram))
         Error("can't use -E when linking is selected");
@@ -462,6 +760,28 @@
     if ((Options & EOptionFlattenUniformArrays) != 0 &&
         (Options & EOptionReadHlsl) == 0)
         Error("uniform array flattening only valid when compiling HLSL source.");
+
+    // rationalize client and target language
+    if (TargetLanguage == glslang::EShTargetNone) {
+        switch (ClientVersion) {
+        case glslang::EShTargetVulkan_1_0:
+            TargetLanguage = glslang::EShTargetSpv;
+            TargetVersion = glslang::EShTargetSpv_1_0;
+            break;
+        case glslang::EShTargetVulkan_1_1:
+            TargetLanguage = glslang::EShTargetSpv;
+            TargetVersion = glslang::EShTargetSpv_1_3;
+            break;
+        case glslang::EShTargetOpenGL_450:
+            TargetLanguage = glslang::EShTargetSpv;
+            TargetVersion = glslang::EShTargetSpv_1_0;
+            break;
+        default:
+            break;
+        }
+    }
+    if (TargetLanguage != glslang::EShTargetNone && Client == glslang::EShClientNone)
+        Error("To generate SPIR-V, also specify client semantics. See -G and -V.");
 }
 
 //
@@ -489,6 +809,12 @@
         messages = (EShMessages)(messages | EShMsgKeepUncalled);
     if (Options & EOptionHlslOffsets)
         messages = (EShMessages)(messages | EShMsgHlslOffsets);
+    if (Options & EOptionDebug)
+        messages = (EShMessages)(messages | EShMsgDebugInfo);
+    if (HlslEnable16BitTypes)
+        messages = (EShMessages)(messages | EShMsgHlslEnable16BitTypes);
+    if ((Options & EOptionOptimizeDisable) || !ENABLE_OPT)
+        messages = (EShMessages)(messages | EShMsgHlslLegalization);
 }
 
 //
@@ -496,18 +822,36 @@
 //
 void CompileShaders(glslang::TWorklist& worklist)
 {
+    if (Options & EOptionDebug)
+        Error("cannot generate debug information unless linking to generate code");
+
     glslang::TWorkItem* workItem;
-    while (worklist.remove(workItem)) {
-        ShHandle compiler = ShConstructCompiler(FindLanguage(workItem->name), Options);
-        if (compiler == 0)
-            return;
+    if (Options & EOptionStdin) {
+        if (worklist.remove(workItem)) {
+            ShHandle compiler = ShConstructCompiler(FindLanguage("stdin"), Options);
+            if (compiler == nullptr)
+                return;
 
-        CompileFile(workItem->name.c_str(), compiler);
+            CompileFile("stdin", compiler);
 
-        if (! (Options & EOptionSuppressInfolog))
-            workItem->results = ShGetInfoLog(compiler);
+            if (! (Options & EOptionSuppressInfolog))
+                workItem->results = ShGetInfoLog(compiler);
 
-        ShDestruct(compiler);
+            ShDestruct(compiler);
+        }
+    } else {
+        while (worklist.remove(workItem)) {
+            ShHandle compiler = ShConstructCompiler(FindLanguage(workItem->name), Options);
+            if (compiler == 0)
+                return;
+
+            CompileFile(workItem->name.c_str(), compiler);
+
+            if (! (Options & EOptionSuppressInfolog))
+                workItem->results = ShGetInfoLog(compiler);
+
+            ShDestruct(compiler);
+        }
     }
 }
 
@@ -524,36 +868,41 @@
 // This prevents erroneous newlines from appearing.
 void StderrIfNonEmpty(const char* str)
 {
-    if (str && str[0]) {
-      fprintf(stderr, "%s\n", str);
-    }
+    if (str && str[0])
+        fprintf(stderr, "%s\n", str);
 }
 
 // Simple bundling of what makes a compilation unit for ease in passing around,
 // and separation of handling file IO versus API (programmatic) compilation.
 struct ShaderCompUnit {
     EShLanguage stage;
-    std::string fileName;
-    char** text;             // memory owned/managed externally
-    const char* fileNameList[1];
+    static const int maxCount = 1;
+    int count;                          // live number of strings/names
+    const char* text[maxCount];         // memory owned/managed externally
+    std::string fileName[maxCount];     // hold's the memory, but...
+    const char* fileNameList[maxCount]; // downstream interface wants pointers
 
-    // Need to have a special constructors to adjust the fileNameList, since back end needs a list of ptrs
-    ShaderCompUnit(EShLanguage istage, std::string &ifileName, char** itext)
-    {
-        stage = istage;
-        fileName = ifileName;
-        text = itext;
-        fileNameList[0] = fileName.c_str();
-    }
+    ShaderCompUnit(EShLanguage stage) : stage(stage), count(0) { }
 
-    ShaderCompUnit(const ShaderCompUnit &rhs)
+    ShaderCompUnit(const ShaderCompUnit& rhs)
     {
         stage = rhs.stage;
-        fileName = rhs.fileName;
-        text = rhs.text;
-        fileNameList[0] = fileName.c_str();
+        count = rhs.count;
+        for (int i = 0; i < count; ++i) {
+            fileName[i] = rhs.fileName[i];
+            text[i] = rhs.text[i];
+            fileNameList[i] = rhs.fileName[i].c_str();
+        }
     }
 
+    void addString(std::string& ifileName, const char* itext)
+    {
+        assert(count < maxCount);
+        fileName[count] = ifileName;
+        text[count] = itext;
+        fileNameList[count] = fileName[count].c_str();
+        ++count;
+    }
 };
 
 //
@@ -580,20 +929,36 @@
     for (auto it = compUnits.cbegin(); it != compUnits.cend(); ++it) {
         const auto &compUnit = *it;
         glslang::TShader* shader = new glslang::TShader(compUnit.stage);
-        shader->setStringsWithLengthsAndNames(compUnit.text, NULL, compUnit.fileNameList, 1);
-        if (entryPointName) // HLSL todo: this needs to be tracked per compUnits
+        shader->setStringsWithLengthsAndNames(compUnit.text, NULL, compUnit.fileNameList, compUnit.count);
+        if (entryPointName)
             shader->setEntryPoint(entryPointName);
-        if (sourceEntryPointName)
+        if (sourceEntryPointName) {
+            if (entryPointName == nullptr)
+                printf("Warning: Changing source entry point name without setting an entry-point name.\n"
+                       "Use '-e <name>'.\n");
             shader->setSourceEntryPoint(sourceEntryPointName);
+        }
+        if (UserPreamble.isSet())
+            shader->setPreamble(UserPreamble.get());
+        shader->addProcesses(Processes);
 
-        shader->setShiftSamplerBinding(baseSamplerBinding[compUnit.stage]);
-        shader->setShiftTextureBinding(baseTextureBinding[compUnit.stage]);
-        shader->setShiftImageBinding(baseImageBinding[compUnit.stage]);
-        shader->setShiftUboBinding(baseUboBinding[compUnit.stage]);
-        shader->setShiftSsboBinding(baseSsboBinding[compUnit.stage]);
-        shader->setShiftUavBinding(baseUavBinding[compUnit.stage]);
+        // Set IO mapper binding shift values
+        for (int r = 0; r < glslang::EResCount; ++r) {
+            const glslang::TResourceType res = glslang::TResourceType(r);
+
+            // Set base bindings
+            shader->setShiftBinding(res, baseBinding[res][compUnit.stage]);
+            
+            // Set bindings for particular resource sets
+            // TODO: use a range based for loop here, when available in all environments.
+            for (auto i = baseBindingForSet[res][compUnit.stage].begin();
+                 i != baseBindingForSet[res][compUnit.stage].end(); ++i)
+                shader->setShiftBindingForSet(res, i->second, i->first);
+        }
+
         shader->setFlattenUniformArrays((Options & EOptionFlattenUniformArrays) != 0);
         shader->setNoStorageFormat((Options & EOptionNoStorageFormat) != 0);
+        shader->setResourceSetBinding(baseResourceSetBinding[compUnit.stage]);
 
         if (Options & EOptionHlslIoMapping)
             shader->setHlslIoMapping(true);
@@ -601,15 +966,41 @@
         if (Options & EOptionAutoMapBindings)
             shader->setAutoMapBindings(true);
 
+        if (Options & EOptionAutoMapLocations)
+            shader->setAutoMapLocations(true);
+
+        if (Options & EOptionInvertY)
+            shader->setInvertY(true);
+
+        for (auto& uniOverride : uniformLocationOverrides) {
+            shader->addUniformLocationOverride(uniOverride.first.c_str(),
+                                               uniOverride.second);
+        }
+
+        shader->setUniformLocationBase(uniformBase);
+
+        // Set up the environment, some subsettings take precedence over earlier
+        // ways of setting things.
+        if (Options & EOptionSpv) {
+            shader->setEnvInput((Options & EOptionReadHlsl) ? glslang::EShSourceHlsl
+                                                            : glslang::EShSourceGlsl,
+                                compUnit.stage, Client, ClientInputSemanticsVersion);
+            shader->setEnvClient(Client, ClientVersion);
+            shader->setEnvTarget(TargetLanguage, TargetVersion);
+            if (targetHlslFunctionality1)
+                shader->setEnvTargetHlslFunctionality1();
+        }
+
         shaders.push_back(shader);
 
-        const int defaultVersion = Options & EOptionDefaultDesktop? 110: 100;
+        const int defaultVersion = Options & EOptionDefaultDesktop ? 110 : 100;
 
+        DirStackFileIncluder includer;
+        std::for_each(IncludeDirectoryList.rbegin(), IncludeDirectoryList.rend(), [&includer](const std::string& dir) {
+            includer.pushExternalLocalDirectory(dir); });
         if (Options & EOptionOutputPreprocessed) {
             std::string str;
-            glslang::TShader::ForbidIncluder includer;
-            if (shader->preprocess(&Resources, defaultVersion, ENoProfile, false, false,
-                                   messages, &str, includer)) {
+            if (shader->preprocess(&Resources, defaultVersion, ENoProfile, false, false, messages, &str, includer)) {
                 PutsIfNonEmpty(str.c_str());
             } else {
                 CompileFailed = true;
@@ -618,14 +1009,15 @@
             StderrIfNonEmpty(shader->getInfoDebugLog());
             continue;
         }
-        if (! shader->parse(&Resources, defaultVersion, false, messages))
+
+        if (! shader->parse(&Resources, defaultVersion, false, messages, includer))
             CompileFailed = true;
 
         program.addShader(shader);
 
         if (! (Options & EOptionSuppressInfolog) &&
             ! (Options & EOptionMemoryLeakMode)) {
-            PutsIfNonEmpty(compUnit.fileName.c_str());
+            PutsIfNonEmpty(compUnit.fileName[0].c_str());
             PutsIfNonEmpty(shader->getInfoLog());
             PutsIfNonEmpty(shader->getInfoDebugLog());
         }
@@ -668,7 +1060,14 @@
                     std::vector<unsigned int> spirv;
                     std::string warningsErrors;
                     spv::SpvBuildLogger logger;
-                    glslang::GlslangToSpv(*program.getIntermediate((EShLanguage)stage), spirv, &logger);
+                    glslang::SpvOptions spvOptions;
+                    if (Options & EOptionDebug)
+                        spvOptions.generateDebugInfo = true;
+                    spvOptions.disableOptimizer = (Options & EOptionOptimizeDisable) != 0;
+                    spvOptions.optimizeSize = (Options & EOptionOptimizeSize) != 0;
+                    spvOptions.disassemble = SpvToolsDisassembler;
+                    spvOptions.validate = SpvToolsValidate;
+                    glslang::GlslangToSpv(*program.getIntermediate((EShLanguage)stage), spirv, &logger, &spvOptions);
 
                     // Dump the spv to a file or stdout, etc., but only if not doing
                     // memory/perf testing, as it's not internal to programmatic use.
@@ -679,9 +1078,8 @@
                         } else {
                             glslang::OutputSpvBin(spirv, GetBinaryName((EShLanguage)stage));
                         }
-                        if (Options & EOptionHumanReadableSpv) {
+                        if (!SpvToolsDisassembler && (Options & EOptionHumanReadableSpv))
                             spv::Disassemble(std::cout, spirv);
-                        }
                     }
                 }
             }
@@ -716,25 +1114,32 @@
 {
     std::vector<ShaderCompUnit> compUnits;
 
-    // Transfer all the work items from to a simple list of
-    // of compilation units.  (We don't care about the thread
-    // work-item distribution properties in this path, which
-    // is okay due to the limited number of shaders, know since
-    // they are all getting linked together.)
-    glslang::TWorkItem* workItem;
-    while (Worklist.remove(workItem)) {
-        ShaderCompUnit compUnit(
-            FindLanguage(workItem->name),
-            workItem->name,
-            ReadFileData(workItem->name.c_str())
-        );
-
-        if (! compUnit.text) {
-            usage();
-            return;
-        }
-
+    // If this is using stdin, we can't really detect multiple different file
+    // units by input type. We need to assume that we're just being given one
+    // file of a certain type.
+    if ((Options & EOptionStdin) != 0) {
+        ShaderCompUnit compUnit(FindLanguage("stdin"));
+        std::istreambuf_iterator<char> begin(std::cin), end;
+        std::string tempString(begin, end);
+        char* fileText = strdup(tempString.c_str());
+        std::string fileName = "stdin";
+        compUnit.addString(fileName, fileText);
         compUnits.push_back(compUnit);
+    } else {
+        // Transfer all the work items from to a simple list of
+        // of compilation units.  (We don't care about the thread
+        // work-item distribution properties in this path, which
+        // is okay due to the limited number of shaders, know since
+        // they are all getting linked together.)
+        glslang::TWorkItem* workItem;
+        while (Worklist.remove(workItem)) {
+            ShaderCompUnit compUnit(FindLanguage(workItem->name));
+            char* fileText = ReadFileData(workItem->name.c_str());
+            if (fileText == nullptr)
+                usage();
+            compUnit.addString(workItem->name, fileText);
+            compUnits.push_back(compUnit);
+        }
     }
 
     // Actual call to programmatic processing of compile and link,
@@ -748,18 +1153,16 @@
             glslang::OS_DumpMemoryCounters();
     }
 
+    // free memory from ReadFileData, which got stored in a const char*
+    // as the first string above
     for (auto it = compUnits.begin(); it != compUnits.end(); ++it)
-        FreeFileData(it->text);
+        FreeFileData(const_cast<char*>(it->text[0]));
 }
 
-int C_DECL main(int argc, char* argv[])
+int singleMain()
 {
-    // array of unique places to leave the shader names and infologs for the asynchronous compiles
-    std::vector<std::unique_ptr<glslang::TWorkItem>> workItems;
-    ProcessArguments(workItems, argc, argv);
-
     glslang::TWorklist workList;
-    std::for_each(workItems.begin(), workItems.end(), [&workList](std::unique_ptr<glslang::TWorkItem>& item) {
+    std::for_each(WorkItems.begin(), WorkItems.end(), [&workList](std::unique_ptr<glslang::TWorkItem>& item) {
         assert(item);
         workList.add(item.get());
     });
@@ -770,8 +1173,14 @@
             return ESuccess;
     }
 
-    if (Options & EOptionDumpVersions) {
-        printf("Glslang Version: %s %s\n", GLSLANG_REVISION, GLSLANG_DATE);
+    if (Options & EOptionDumpBareVersion) {
+        printf("%d.%d.%d\n",
+            glslang::GetSpirvGeneratorVersion(), GLSLANG_MINOR_VERSION, GLSLANG_PATCH_LEVEL);
+        if (workList.empty())
+            return ESuccess;
+    } else if (Options & EOptionDumpVersions) {
+        printf("Glslang Version: %d.%d.%d\n",
+            glslang::GetSpirvGeneratorVersion(), GLSLANG_MINOR_VERSION, GLSLANG_PATCH_LEVEL);
         printf("ESSL Version: %s\n", glslang::GetEsslVersionString());
         printf("GLSL Version: %s\n", glslang::GetGlslVersionString());
         std::string spirvVersion;
@@ -779,42 +1188,53 @@
         printf("SPIR-V Version %s\n", spirvVersion.c_str());
         printf("GLSL.std.450 Version %d, Revision %d\n", GLSLstd450Version, GLSLstd450Revision);
         printf("Khronos Tool ID %d\n", glslang::GetKhronosToolId());
+        printf("SPIR-V Generator Version %d\n", glslang::GetSpirvGeneratorVersion());
         printf("GL_KHR_vulkan_glsl version %d\n", 100);
         printf("ARB_GL_gl_spirv version %d\n", 100);
         if (workList.empty())
             return ESuccess;
     }
 
-    if (workList.empty()) {
+    if (workList.empty() && ((Options & EOptionStdin) == 0)) {
         usage();
     }
 
+    if (Options & EOptionStdin) {
+        WorkItems.push_back(std::unique_ptr<glslang::TWorkItem>{new glslang::TWorkItem("stdin")});
+        workList.add(WorkItems.back().get());
+    }
+
     ProcessConfigFile();
 
+    if ((Options & EOptionReadHlsl) && !((Options & EOptionOutputPreprocessed) || (Options & EOptionSpv)))
+        Error("ERROR: HLSL requires SPIR-V code generation (or preprocessing only)");
+
     //
     // Two modes:
     // 1) linking all arguments together, single-threaded, new C++ interface
     // 2) independent arguments, can be tackled by multiple asynchronous threads, for testing thread safety, using the old handle interface
     //
-    if (Options & EOptionLinkProgram ||
-        Options & EOptionOutputPreprocessed) {
+    if (Options & (EOptionLinkProgram | EOptionOutputPreprocessed)) {
         glslang::InitializeProcess();
+        glslang::InitializeProcess();  // also test reference counting of users
+        glslang::InitializeProcess();  // also test reference counting of users
+        glslang::FinalizeProcess();    // also test reference counting of users
+        glslang::FinalizeProcess();    // also test reference counting of users
         CompileAndLinkShaderFiles(workList);
         glslang::FinalizeProcess();
     } else {
         ShInitialize();
+        ShInitialize();  // also test reference counting of users
+        ShFinalize();    // also test reference counting of users
 
         bool printShaderNames = workList.size() > 1;
 
-        if (Options & EOptionMultiThreaded)
-        {
+        if (Options & EOptionMultiThreaded) {
             std::array<std::thread, 16> threads;
-            for (unsigned int t = 0; t < threads.size(); ++t)
-            {
+            for (unsigned int t = 0; t < threads.size(); ++t) {
                 threads[t] = std::thread(CompileShaders, std::ref(workList));
-                if (threads[t].get_id() == std::thread::id())
-                {
-                    printf("Failed to create thread\n");
+                if (threads[t].get_id() == std::thread::id()) {
+                    fprintf(stderr, "Failed to create thread\n");
                     return EFailThreadCreate;
                 }
             }
@@ -824,11 +1244,11 @@
             CompileShaders(workList);
 
         // Print out all the resulting infologs
-        for (size_t w = 0; w < workItems.size(); ++w) {
-            if (workItems[w]) {
-                if (printShaderNames || workItems[w]->results.size() > 0)
-                    PutsIfNonEmpty(workItems[w]->name.c_str());
-                PutsIfNonEmpty(workItems[w]->results.c_str());
+        for (size_t w = 0; w < WorkItems.size(); ++w) {
+            if (WorkItems[w]) {
+                if (printShaderNames || WorkItems[w]->results.size() > 0)
+                    PutsIfNonEmpty(WorkItems[w]->name.c_str());
+                PutsIfNonEmpty(WorkItems[w]->results.c_str());
             }
         }
 
@@ -843,6 +1263,25 @@
     return 0;
 }
 
+int C_DECL main(int argc, char* argv[])
+{
+    ProcessArguments(WorkItems, argc, argv);
+
+    int ret = 0;
+
+    // Loop over the entire init/finalize cycle to watch memory changes
+    const int iterations = 1;
+    if (iterations > 1)
+        glslang::OS_DumpMemoryCounters();
+    for (int i = 0; i < iterations; ++i) {
+        ret = singleMain();
+        if (iterations > 1)
+            glslang::OS_DumpMemoryCounters();
+    }
+
+    return ret;
+}
+
 //
 //   Deduce the language from the filename.  Files must end in one of the
 //   following extensions:
@@ -853,40 +1292,75 @@
 //   .geom = geometry
 //   .frag = fragment
 //   .comp = compute
+//   .rgen = ray generation
+//   .rint = ray intersection
+//   .rahit = ray any hit
+//   .rchit = ray closest hit
+//   .rmiss = ray miss
+//   .rcall = ray callable
+//   .mesh  = mesh
+//   .task  = task
+//   Additionally, the file names may end in .<stage>.glsl and .<stage>.hlsl
+//   where <stage> is one of the stages listed above.
 //
-EShLanguage FindLanguage(const std::string& name, bool parseSuffix)
+EShLanguage FindLanguage(const std::string& name, bool parseStageName)
 {
-    size_t ext = 0;
-    std::string suffix;
-
+    std::string stageName;
     if (shaderStageName)
-        suffix = shaderStageName;
-    else {
-        // Search for a suffix on a filename: e.g, "myfile.frag".  If given
-        // the suffix directly, we skip looking for the '.'
-        if (parseSuffix) {
-            ext = name.rfind('.');
-            if (ext == std::string::npos) {
-                usage();
-                return EShLangVertex;
-            }
-            ++ext;
+        stageName = shaderStageName;
+    else if (parseStageName) {
+        // Note: "first" extension means "first from the end", i.e.
+        // if the file is named foo.vert.glsl, then "glsl" is first,
+        // "vert" is second.
+        size_t firstExtStart = name.find_last_of(".");
+        bool hasFirstExt = firstExtStart != std::string::npos;
+        size_t secondExtStart = hasFirstExt ? name.find_last_of(".", firstExtStart - 1) : std::string::npos;
+        bool hasSecondExt = secondExtStart != std::string::npos;
+        std::string firstExt = name.substr(firstExtStart + 1, std::string::npos);
+        bool usesUnifiedExt = hasFirstExt && (firstExt == "glsl" || firstExt == "hlsl");
+        if (usesUnifiedExt && firstExt == "hlsl")
+            Options |= EOptionReadHlsl;
+        if (hasFirstExt && !usesUnifiedExt)
+            stageName = firstExt;
+        else if (usesUnifiedExt && hasSecondExt)
+            stageName = name.substr(secondExtStart + 1, firstExtStart - secondExtStart - 1);
+        else {
+            usage();
+            return EShLangVertex;
         }
-        suffix = name.substr(ext, std::string::npos);
-    }
+    } else
+        stageName = name;
 
-    if (suffix == "vert")
+    if (stageName == "vert")
         return EShLangVertex;
-    else if (suffix == "tesc")
+    else if (stageName == "tesc")
         return EShLangTessControl;
-    else if (suffix == "tese")
+    else if (stageName == "tese")
         return EShLangTessEvaluation;
-    else if (suffix == "geom")
+    else if (stageName == "geom")
         return EShLangGeometry;
-    else if (suffix == "frag")
+    else if (stageName == "frag")
         return EShLangFragment;
-    else if (suffix == "comp")
+    else if (stageName == "comp")
         return EShLangCompute;
+#ifdef NV_EXTENSIONS
+    else if (stageName == "rgen")
+        return EShLangRayGenNV;
+    else if (stageName == "rint")
+        return EShLangIntersectNV;
+    else if (stageName == "rahit")
+        return EShLangAnyHitNV;
+    else if (stageName == "rchit")
+        return EShLangClosestHitNV;
+    else if (stageName == "rmiss")
+        return EShLangMissNV;
+    else if (stageName == "rcall")
+        return EShLangCallableNV;
+    else if (stageName == "mesh")
+        return EShLangMeshNV;
+    else if (stageName == "task")
+        return EShLangTaskNV;
+#endif
 
     usage();
     return EShLangVertex;
@@ -899,29 +1373,29 @@
 void CompileFile(const char* fileName, ShHandle compiler)
 {
     int ret = 0;
-    char** shaderStrings = ReadFileData(fileName);
-    if (! shaderStrings) {
-        usage();
+    char* shaderString;
+    if ((Options & EOptionStdin) != 0) {
+        std::istreambuf_iterator<char> begin(std::cin), end;
+        std::string tempString(begin, end);
+        shaderString = strdup(tempString.c_str());
+    } else {
+        shaderString = ReadFileData(fileName);
     }
 
-    int* lengths = new int[NumShaderStrings];
-
     // move to length-based strings, rather than null-terminated strings
-    for (int s = 0; s < NumShaderStrings; ++s)
-        lengths[s] = (int)strlen(shaderStrings[s]);
-
-    if (! shaderStrings) {
-        CompileFailed = true;
-        return;
-    }
+    int* lengths = new int[1];
+    lengths[0] = (int)strlen(shaderString);
 
     EShMessages messages = EShMsgDefault;
     SetMessageOptions(messages);
 
+    if (UserPreamble.isSet())
+        Error("-D and -U options require -l (linking)\n");
+
     for (int i = 0; i < ((Options & EOptionMemoryLeakMode) ? 100 : 1); ++i) {
         for (int j = 0; j < ((Options & EOptionMemoryLeakMode) ? 100 : 1); ++j) {
             // ret = ShCompile(compiler, shaderStrings, NumShaderStrings, lengths, EShOptNone, &Resources, Options, (Options & EOptionDefaultDesktop) ? 110 : 100, false, messages);
-            ret = ShCompile(compiler, shaderStrings, NumShaderStrings, nullptr, EShOptNone, &Resources, Options, (Options & EOptionDefaultDesktop) ? 110 : 100, false, messages);
+            ret = ShCompile(compiler, &shaderString, 1, nullptr, EShOptNone, &Resources, Options, (Options & EOptionDefaultDesktop) ? 110 : 100, false, messages);
             // const char* multi[12] = { "# ve", "rsion", " 300 e", "s", "\n#err",
             //                         "or should be l", "ine 1", "string 5\n", "float glo", "bal",
             //                         ";\n#error should be line 2\n void main() {", "global = 2.3;}" };
@@ -934,7 +1408,7 @@
     }
 
     delete [] lengths;
-    FreeFileData(shaderStrings);
+    FreeFileData(shaderString);
 
     if (ret == 0)
         CompileFailed = true;
@@ -947,8 +1421,8 @@
 {
     printf("Usage: glslangValidator [option]... [file]...\n"
            "\n"
-           "Where: each 'file' ends in .<stage>, where <stage> is one of\n"
-           "    .conf   to provide an optional config file that replaces the default configuration\n"
+           "'file' can end in .<stage> for auto-stage classification, where <stage> is:\n"
+           "    .conf   to provide a config file that replaces the default configuration\n"
            "            (see -c option below for generating a template)\n"
            "    .vert   for a vertex shader\n"
            "    .tesc   for a tessellation control shader\n"
@@ -956,83 +1430,144 @@
            "    .geom   for a geometry shader\n"
            "    .frag   for a fragment shader\n"
            "    .comp   for a compute shader\n"
+#ifdef NV_EXTENSIONS
+           "    .mesh   for a mesh shader\n"
+           "    .task   for a task shader\n"
+           "    .rgen    for a ray generation shader\n"
+           "    .rint    for a ray intersection shader\n"
+           "    .rahit   for a ray any hit shader\n"
+           "    .rchit   for a ray closest hit shader\n"
+           "    .rmiss   for a ray miss shader\n"
+           "    .rcall   for a ray callable shader\n"
+#endif
+           "    .glsl   for .vert.glsl, .tesc.glsl, ..., .comp.glsl compound suffixes\n"
+           "    .hlsl   for .vert.hlsl, .tesc.hlsl, ..., .comp.hlsl compound suffixes\n"
            "\n"
-           "Compilation warnings and errors will be printed to stdout.\n"
-           "\n"
-           "To get other information, use one of the following options:\n"
-           "Each option must be specified separately.\n"
-           "  -V          create SPIR-V binary, under Vulkan semantics; turns on -l;\n"
-           "              default file name is <stage>.spv (-o overrides this)\n"
-           "  -G          create SPIR-V binary, under OpenGL semantics; turns on -l;\n"
-           "              default file name is <stage>.spv (-o overrides this)\n"
-           "  -H          print human readable form of SPIR-V; turns on -V\n"
+           "Options:\n"
+           "  -C          cascading errors; risk crash from accumulation of error recoveries\n"
+           "  -D          input is HLSL (this is the default when any suffix is .hlsl)\n"
+           "  -D<macro=def>\n"
+           "  -D<macro>   define a pre-processor macro\n"
            "  -E          print pre-processed GLSL; cannot be used with -l;\n"
-           "              errors will appear on stderr.\n"
+           "              errors will appear on stderr\n"
+           "  -G[ver]     create SPIR-V binary, under OpenGL semantics; turns on -l;\n"
+           "              default file name is <stage>.spv (-o overrides this);\n"
+           "              'ver', when present, is the version of the input semantics,\n"
+           "              which will appear in #define GL_SPIRV ver;\n"
+           "              '--client opengl100' is the same as -G100;\n"
+           "              a '--target-env' for OpenGL will also imply '-G'\n"
+           "  -H          print human readable form of SPIR-V; turns on -V\n"
+           "  -I<dir>     add dir to the include search path; includer's directory\n"
+           "              is searched first, followed by left-to-right order of -I\n"
+           "  -Od         disables optimization; may cause illegal SPIR-V for HLSL\n"
+           "  -Os         optimizes SPIR-V to minimize size\n"
            "  -S <stage>  uses specified stage rather than parsing the file extension\n"
-           "              valid choices for <stage> are vert, tesc, tese, geom, frag, or comp\n"
+           "              choices for <stage> are vert, tesc, tese, geom, frag, or comp\n"
+           "  -U<macro>   undefine a pre-processor macro\n"
+           "  -V[ver]     create SPIR-V binary, under Vulkan semantics; turns on -l;\n"
+           "              default file name is <stage>.spv (-o overrides this)\n"
+           "              'ver', when present, is the version of the input semantics,\n"
+           "              which will appear in #define VULKAN ver\n"
+           "              '--client vulkan100' is the same as -V100\n"
+           "              a '--target-env' for Vulkan will also imply '-V'\n"
            "  -c          configuration dump;\n"
            "              creates the default configuration file (redirect to a .conf file)\n"
-           "  -C          cascading errors; risks crashes from accumulation of error recoveries\n"
            "  -d          default to desktop (#version 110) when there is no shader #version\n"
            "              (default is ES version 100)\n"
-           "  -D          input is HLSL\n"
-           "  -e          specify entry-point name\n"
+           "  -e <name> | --entry-point <name>\n"
+           "              specify <name> as the entry-point function name\n"
+           "  -f{hlsl_functionality1}\n"
+           "              'hlsl_functionality1' enables use of the\n"
+           "              SPV_GOOGLE_hlsl_functionality1 extension\n"
+           "  -g          generate debug information\n"
            "  -h          print this usage message\n"
            "  -i          intermediate tree (glslang AST) is printed out\n"
            "  -l          link all input files together to form a single module\n"
            "  -m          memory leak mode\n"
-           "  -o  <file>  save binary to <file>, requires a binary option (e.g., -V)\n"
+           "  -o <file>   save binary to <file>, requires a binary option (e.g., -V)\n"
            "  -q          dump reflection query database\n"
-           "  -r          relaxed semantic error-checking mode\n"
-           "  -s          silent mode\n"
+           "  -r | --relaxed-errors"
+           "              relaxed GLSL semantic error-checking mode\n"
+           "  -s          silence syntax and semantic error reporting\n"
            "  -t          multi-threaded mode\n"
-           "  -v          print version strings\n"
-           "  -w          suppress warnings (except as required by #extension : warn)\n"
-           "  -x          save 32-bit hexadecimal numbers as text, requires a binary option (e.g., -V)\n"
-           "\n"
-           "  --shift-sampler-binding [stage] num     set base binding number for samplers\n"
-           "  --ssb [stage] num                       synonym for --shift-sampler-binding\n"
-           "\n"
-           "  --shift-texture-binding [stage] num     set base binding number for textures\n"
-           "  --stb [stage] num                       synonym for --shift-texture-binding\n"
-           "\n"
-           "  --shift-image-binding [stage] num       set base binding number for images (uav)\n"
-           "  --sib [stage] num                       synonym for --shift-image-binding\n"
-           "\n"
-           "  --shift-UBO-binding [stage] num         set base binding number for UBOs\n"
-           "  --shift-cbuffer-binding [stage] num     synonym for --shift-UBO-binding\n"
-           "  --sub [stage] num                       synonym for --shift-UBO-binding\n"
-           "\n"
-           "  --shift-ssbo-binding [stage] num        set base binding number for SSBOs\n"
-           "  --sbb [stage] num                       synonym for --shift-ssbo-binding\n"
-           "\n"
-           "  --shift-uav-binding [stage] num         set base binding number for UAVs\n"
-           "  --suavb [stage] num                     synonym for --shift-uav-binding\n"
-           "\n"
-           "  --auto-map-bindings                     automatically bind uniform variables without\n"
-           "                                          explicit bindings.\n"
-           "  --amb                                   synonym for --auto-map-bindings\n"
-           "\n"
-           "  --flatten-uniform-arrays                flatten uniform texture & sampler arrays to scalars\n"
-           "  --fua                                   synonym for --flatten-uniform-arrays\n"
-           "\n"
-           "  --no-storage-format                     use Unknown image format\n"
-           "  --nsf                                   synonym for --no-storage-format\n"
-           "\n"
-           "  --source-entrypoint name                the given shader source function is renamed to be the entry point given in -e\n"
-           "  --sep                                   synonym for --source-entrypoint\n"
-           "\n"
-           "  --keep-uncalled                         don't eliminate uncalled functions when linking\n"
-           "  --ku                                    synonym for --keep-uncalled\n"
-           "\n"
-           "  --variable-name <name>                  Creates a C header file that contains a uint32_t array named <name>\n"
-           "                                          initialized with the shader binary code.\n"
-           "  --vn <name>                             synonym for --variable-name <name>\n"
-           "\n"
-           "  --hlsl-offsets                          Allow block offsets to follow HLSL rules instead of GLSL rules.\n"
-           "                                          Works independently of source language.\n"
-           "\n"
-           "  --hlsl-iomap                            Perform IO mapping in HLSL register space.\n"
+           "  -v | --version\n"
+           "              print version strings\n"
+           "  -w | --suppress-warnings\n"
+           "              suppress GLSL warnings, except as required by \"#extension : warn\"\n"
+           "  -x          save binary output as text-based 32-bit hexadecimal numbers\n"
+           "  -u<name>:<loc> specify a uniform location override for --aml\n"
+           "  --uniform-base <base> set a base to use for generated uniform locations\n"
+           "  --auto-map-bindings | --amb       automatically bind uniform variables\n"
+           "                                    without explicit bindings\n"
+           "  --auto-map-locations | --aml      automatically locate input/output lacking\n"
+           "                                    'location' (fragile, not cross stage)\n"
+           "  --client {vulkan<ver>|opengl<ver>} see -V and -G\n"
+           "  -dumpfullversion | -dumpversion   print bare major.minor.patchlevel\n"
+           "  --flatten-uniform-arrays | --fua  flatten uniform texture/sampler arrays to\n"
+           "                                    scalars\n"
+           "  --hlsl-offsets                    allow block offsets to follow HLSL rules\n"
+           "                                    works independently of source language\n"
+           "  --hlsl-iomap                      perform IO mapping in HLSL register space\n"
+           "  --hlsl-enable-16bit-types         allow 16-bit types in SPIR-V for HLSL\n"
+           "  --invert-y | --iy                 invert position.Y output in vertex shader\n"
+           "  --keep-uncalled | --ku            don't eliminate uncalled functions\n"
+           "  --no-storage-format | --nsf       use Unknown image format\n"
+           "  --resource-set-binding [stage] name set binding\n"
+           "                                    set descriptor set and binding for\n"
+           "                                    individual resources\n"
+           "  --resource-set-binding [stage] set\n"
+           "                                    set descriptor set for all resources\n"
+           "  --rsb                             synonym for --resource-set-binding\n"
+           "  --shift-image-binding [stage] num\n"
+           "                                    base binding number for images (uav)\n"
+           "  --shift-image-binding [stage] [num set]...\n"
+           "                                    per-descriptor-set shift values\n"
+           "  --sib                             synonym for --shift-image-binding\n"
+           "  --shift-sampler-binding [stage] num\n"
+           "                                    base binding number for samplers\n"
+           "  --shift-sampler-binding [stage] [num set]...\n"
+           "                                    per-descriptor-set shift values\n"
+           "  --ssb                             synonym for --shift-sampler-binding\n"
+           "  --shift-ssbo-binding [stage] num  base binding number for SSBOs\n"
+           "  --shift-ssbo-binding [stage] [num set]...\n"
+           "                                    per-descriptor-set shift values\n"
+           "  --sbb                             synonym for --shift-ssbo-binding\n"
+           "  --shift-texture-binding [stage] num\n"
+           "                                    base binding number for textures\n"
+           "  --shift-texture-binding [stage] [num set]...\n"
+           "                                    per-descriptor-set shift values\n"
+           "  --stb                             synonym for --shift-texture-binding\n"
+           "  --shift-uav-binding [stage] num   base binding number for UAVs\n"
+           "  --shift-uav-binding [stage] [num set]...\n"
+           "                                    per-descriptor-set shift values\n"
+           "  --suavb                           synonym for --shift-uav-binding\n"
+           "  --shift-UBO-binding [stage] num   base binding number for UBOs\n"
+           "  --shift-UBO-binding [stage] [num set]...\n"
+           "                                    per-descriptor-set shift values\n"
+           "  --sub                             synonym for --shift-UBO-binding\n"
+           "  --shift-cbuffer-binding | --scb   synonyms for --shift-UBO-binding\n"
+           "  --spirv-dis                       output standard-form disassembly; works only\n"
+           "                                    when a SPIR-V generation option is also used\n"
+           "  --spirv-val                       execute the SPIRV-Tools validator\n"
+           "  --source-entrypoint <name>        the given shader source function is\n"
+           "                                    renamed to be the <name> given in -e\n"
+           "  --sep                             synonym for --source-entrypoint\n"
+           "  --stdin                           read from stdin instead of from a file;\n"
+           "                                    requires providing the shader stage using -S\n"
+           "  --target-env {vulkan1.0 | vulkan1.1 | opengl | \n"
+           "                spirv1.0 | spirv1.1 | spirv1.2 | spirv1.3}\n"
+           "                                    set execution environment that emitted code\n"
+           "                                    will execute in (versus source language\n"
+           "                                    semantics selected by --client) defaults:\n"
+           "                                     * 'vulkan1.0' under '--client vulkan<ver>'\n"
+           "                                     * 'opengl' under '--client opengl<ver>'\n"
+           "                                     * 'spirv1.0' under --target-env vulkan1.0\n"
+           "                                     * 'spirv1.3' under --target-env vulkan1.1\n"
+           "                                    multiple --targen-env can be specified.\n"
+           "  --variable-name <name>\n"
+           "  --vn <name>                       creates a C header file that contains a\n"
+           "                                    uint32_t array named <name>\n"
+           "                                    initialized with the shader binary code\n"
            );
 
     exit(EFailUsage);
@@ -1070,76 +1605,33 @@
 //
 //   Malloc a string of sufficient size and read a string into it.
 //
-char** ReadFileData(const char* fileName)
+char* ReadFileData(const char* fileName)
 {
     FILE *in = nullptr;
     int errorCode = fopen_s(&in, fileName, "r");
-
-    int count = 0;
-    const int maxSourceStrings = 5;  // for testing splitting shader/tokens across multiple strings
-    char** return_data = (char**)malloc(sizeof(char *) * (maxSourceStrings+1)); // freed in FreeFileData()
-
     if (errorCode || in == nullptr)
         Error("unable to open input file");
 
+    int count = 0;
     while (fgetc(in) != EOF)
         count++;
 
     fseek(in, 0, SEEK_SET);
 
-    char *fdata = (char*)malloc(count+2); // freed before return of this function
-    if (! fdata)
-        Error("can't allocate memory");
-
-    if ((int)fread(fdata, 1, count, in) != count) {
-        free(fdata);
+    char* return_data = (char*)malloc(count + 1);  // freed in FreeFileData()
+    if ((int)fread(return_data, 1, count, in) != count) {
+        free(return_data);
         Error("can't read input file");
     }
 
-    fdata[count] = '\0';
+    return_data[count] = '\0';
     fclose(in);
 
-    if (count == 0) {
-        // recover from empty file
-        return_data[0] = (char*)malloc(count+2);  // freed in FreeFileData()
-        return_data[0][0]='\0';
-        NumShaderStrings = 0;
-        free(fdata);
-
-        return return_data;
-    } else
-        NumShaderStrings = 1;  // Set to larger than 1 for testing multiple strings
-
-    // compute how to split up the file into multiple strings, for testing multiple strings
-    int len = (int)(ceil)((float)count/(float)NumShaderStrings);
-    int ptr_len = 0;
-    int i = 0;
-    while (count > 0) {
-        return_data[i] = (char*)malloc(len + 2);  // freed in FreeFileData()
-        memcpy(return_data[i], fdata + ptr_len, len);
-        return_data[i][len] = '\0';
-        count -= len;
-        ptr_len += len;
-        if (count < len) {
-            if (count == 0) {
-               NumShaderStrings = i + 1;
-               break;
-            }
-            len = count;
-        }
-        ++i;
-    }
-
-    free(fdata);
-
     return return_data;
 }
 
-void FreeFileData(char** data)
+void FreeFileData(char* data)
 {
-    for(int i = 0; i < NumShaderStrings; i++)
-        free(data[i]);
-
     free(data);
 }
 
diff --git a/Test/100samplerExternal.frag b/Test/100samplerExternal.frag
new file mode 100644
index 0000000..9f6f397
--- /dev/null
+++ b/Test/100samplerExternal.frag
@@ -0,0 +1,41 @@
+#version 100

+

+#extension GL_OES_EGL_image_external : enable

+

+uniform samplerExternalOES sExt;

+precision mediump samplerExternalOES;

+uniform samplerExternalOES mediumExt;

+uniform highp samplerExternalOES highExt;

+

+void main()

+{

+    texture2D(sExt, vec2(0.2));

+    texture2D(mediumExt, vec2(0.2));

+    texture2D(highExt, vec2(0.2));

+    texture2DProj(sExt, vec3(0.3));

+    texture2DProj(sExt, vec4(0.3));

+

+    int lod = 0;

+    highp float bias = 0.01;

+    textureSize(sExt, lod);  // ERROR

+    texture(sExt, vec2(0.2));  // ERROR

+    texture(sExt, vec2(0.2), bias);  // ERROR

+    textureProj(sExt, vec3(0.2));  // ERROR

+    textureProj(sExt, vec3(0.2), bias);  // ERROR

+    textureProj(sExt, vec4(0.2));  // ERROR

+    textureProj(sExt, vec4(0.2), bias);  // ERROR

+    texelFetch(sExt, ivec2(4), lod);  // ERROR

+

+    texture3D(sExt, vec3(0.3));  // ERROR

+    texture2DProjLod(sExt, vec3(0.3), 0.3);  // ERROR

+    texture(sExt, vec3(0.3));  // ERROR

+    textureProjLod(sExt, vec3(0.3), 0.3);  // ERROR

+}

+

+#extension GL_OES_EGL_image_external : disable

+

+#extension GL_OES_EGL_image_external_essl3 : enable

+uniform samplerExternalOES badExt;  // ERROR

+#extension GL_OES_EGL_image_external_essl3 : disable

+

+uniform samplerExternalOES badExt;  // ERROR

diff --git a/Test/110scope.vert b/Test/110scope.vert
index e28db0f..86c27a5 100644
--- a/Test/110scope.vert
+++ b/Test/110scope.vert
@@ -71,4 +71,17 @@
 

     int degrees;

     degrees(3.2);

+

+    {

+        S s;

+        s.x = 3;

+        struct S {   // okay, hides S

+            bool b;

+        };

+        S t;

+        t.b = true;

+        struct S {    // ERROR, redefinition of struct S

+            float f;

+        };

+    }

 }

diff --git a/Test/300.vert b/Test/300.vert
index 83b9bb1..daf98b8 100644
--- a/Test/300.vert
+++ b/Test/300.vert
@@ -184,4 +184,21 @@
     yp = y;
     xp = y; // ERROR, wrong size
     yp = x; // ERROR, wrong size
+}

+
+layout(num_views = 2) in; // ERROR, no extension
+
+void mwErr()
+{
+    gl_ViewID_OVR;   // ERROR, no extension
+}
+
+#extension GL_OVR_multiview : enable
+
+layout(num_views = 2) uniform float mwUniform; // ERROR, must be global
+layout(num_views = 2) in; // OK
+
+void mwOk()
+{
+    gl_ViewID_OVR;
 }
diff --git a/Test/300samplerExternal.frag b/Test/300samplerExternal.frag
new file mode 100644
index 0000000..3724f8e
--- /dev/null
+++ b/Test/300samplerExternal.frag
@@ -0,0 +1,41 @@
+#version 300 es

+

+#extension GL_OES_EGL_image_external_essl3 : enable

+

+uniform samplerExternalOES sExt;

+precision mediump samplerExternalOES;

+uniform samplerExternalOES mediumExt;

+uniform highp samplerExternalOES highExt;

+

+void main()

+{

+    texture2D(sExt, vec2(0.2));  // ERROR

+    texture2D(mediumExt, vec2(0.2));  // ERROR

+    texture2D(highExt, vec2(0.2));  // ERROR

+    texture2DProj(sExt, vec3(0.3));  // ERROR

+    texture2DProj(sExt, vec4(0.3));  // ERROR

+

+    int lod = 0;

+    highp float bias = 0.01;

+    textureSize(sExt, lod);

+    texture(sExt, vec2(0.2));

+    texture(sExt, vec2(0.2), bias);

+    textureProj(sExt, vec3(0.2));

+    textureProj(sExt, vec3(0.2), bias);

+    textureProj(sExt, vec4(0.2));

+    textureProj(sExt, vec4(0.2), bias);

+    texelFetch(sExt, ivec2(4), lod);

+

+    texture3D(sExt, vec3(0.3));  // ERROR

+    texture2DProjLod(sExt, vec3(0.3), 0.3);  // ERROR

+    texture(sExt, vec3(0.3));  // ERROR

+    textureProjLod(sExt, vec3(0.3), 0.3);  // ERROR

+}

+

+#extension GL_OES_EGL_image_external_essl3 : disable

+

+#extension GL_OES_EGL_image_external : enable

+uniform samplerExternalOES badExt;  // ERROR

+#extension GL_OES_EGL_image_external : disable

+

+uniform samplerExternalOES badExt;  // ERROR

diff --git a/Test/310.comp b/Test/310.comp
index 9575b6f..9ca8eaa 100644
--- a/Test/310.comp
+++ b/Test/310.comp
@@ -4,7 +4,7 @@
 layout(local_size_x = 16) in;     // ERROR, changing

 layout(local_size_z = 4096) in;   // ERROR, too large

 layout(local_size_x = 2) in;

-

+layout(local_size_y = 0) in;      // ERROR, 0 not allowed

 const int total = gl_MaxComputeWorkGroupCount.y 

                 + gl_MaxComputeUniformComponents

                 + gl_MaxComputeTextureImageUnits

diff --git a/Test/310.tese b/Test/310.tese
index 63b1daa..bbeaa87 100644
--- a/Test/310.tese
+++ b/Test/310.tese
@@ -55,7 +55,7 @@
 

 #extension GL_ARB_separate_shader_objects : enable

 

-in gl_PerVertex           // ERROR, no size

+in gl_PerVertex

 {

     vec4 gl_Position;

 } gl_in[];

diff --git a/Test/310AofA.vert b/Test/310AofA.vert
index a196388..fba2977 100644
--- a/Test/310AofA.vert
+++ b/Test/310AofA.vert
@@ -113,3 +113,9 @@
 uniform ubaa {

     int a;

 } ubaaname[2][3];  // ERROR

+

+vec3 func(in mat3[2] x[3])

+{

+	mat3 a0 = x[2][1];

+    return a0[2];

+}

diff --git a/Test/310implicitSizeArrayError.vert b/Test/310implicitSizeArrayError.vert
index 72c403e..7aa0ee1 100644
--- a/Test/310implicitSizeArrayError.vert
+++ b/Test/310implicitSizeArrayError.vert
@@ -1,5 +1,5 @@
 #version 310 es

-layout (location=0) uniform Block {

+layout (binding=0) uniform Block {

   highp int a[];

 } uni;

 layout (location=0) out highp int o;

diff --git a/Test/310runtimeArray.vert b/Test/310runtimeArray.vert
new file mode 100644
index 0000000..3d7b018
--- /dev/null
+++ b/Test/310runtimeArray.vert
@@ -0,0 +1,18 @@
+#version 310 es
+
+precision highp float;
+layout(location=0) out float o;
+
+struct S  { float f; };
+buffer b1 { S s[]; };
+buffer b2 { S s[]; } b2name;
+buffer b3 { S s[]; } b3name[];
+buffer b4 { S s[]; } b4name[4];
+
+void main()
+{
+  o = s[5].f;
+  o += b2name.s[6].f;
+  o += b3name[3].s[7].f;
+  o += b4name[2].s[8].f;
+}
diff --git a/Test/320.comp b/Test/320.comp
new file mode 100644
index 0000000..c31b047
--- /dev/null
+++ b/Test/320.comp
@@ -0,0 +1,5 @@
+#version 320 es

+

+void main()
+{
+}
diff --git a/Test/320.frag b/Test/320.frag
new file mode 100644
index 0000000..bed3f12
--- /dev/null
+++ b/Test/320.frag
@@ -0,0 +1,225 @@
+#version 320 es

+

+out outbname { int a; } outbinst;   // ERROR, not out block in fragment shader

+

+in inbname {

+    int a;

+    vec4 v;

+    struct { int b; } s;     // ERROR, nested struct definition

+} inbinst;

+

+in inbname2 {

+    layout(location = 12) int aAnon;

+    layout(location = 13) centroid in vec4 vAnon;

+};

+

+in layout(location = 13) vec4 aliased; // ERROR, aliased

+

+in inbname2 {                // ERROR, reuse of block name

+    int aAnon;

+    centroid in vec4 vAnon;

+};

+

+in badmember {               // ERROR, aAnon already in global scope

+    int aAnon;

+};

+

+int inbname;                 // ERROR, redefinition of block name

+

+vec4 vAnon;                  // ERROR, anon in global scope; redefinition

+

+in arrayed {

+    float f;

+} arrayedInst[4];

+uniform int i;

+void fooIO()

+{

+    vec4 v = inbinst.v + vAnon;

+    v *= arrayedInst[2].f;

+    v *= arrayedInst[i].f;

+}

+

+in vec4 gl_FragCoord;

+layout(origin_upper_left, pixel_center_integer) in vec4 gl_FragCoord;  // ERROR, non-ES

+

+layout(early_fragment_tests) in;

+out float gl_FragDepth;

+layout(depth_any) out float gl_FragDepth;  // ERROR, non-ES

+

+void main()

+{

+    gl_FragDepth = 0.2;  // ERROR, early_fragment_tests declared

+    bool f = gl_FrontFacing;

+}

+

+out float gl_FragDepth;

+

+void foo_GS()

+{

+    highp int l = gl_Layer;

+    highp int p = gl_PrimitiveID;

+}

+

+in vec2 inf, ing;

+uniform ivec2 offsets[4];

+uniform sampler2D sArray[4];

+uniform int sIndex;

+layout(binding = 0) uniform atomic_uint auArray[2];

+uniform ubName { int i; } ubInst[4];

+buffer bbName { int i; } bbInst[4];

+highp uniform writeonly image2D iArray[5];

+const ivec2 constOffsets[4] = ivec2[4](ivec2(0.1), ivec2(0.2), ivec2(0.3), ivec2(0.4));

+

+void pfoo()

+{

+    precise vec2 h;

+    h = fma(inf, ing, h);

+    textureGatherOffset(sArray[0], vec2(0.1), ivec2(inf));

+    textureGatherOffsets(sArray[0], vec2(0.1), constOffsets);

+    textureGatherOffsets(sArray[0], vec2(0.1), offsets);       // ERROR, offset not constant

+}

+

+precision highp imageCubeArray        ;

+precision highp iimageCubeArray       ;

+precision highp uimageCubeArray       ;

+

+precision highp samplerCubeArray      ;

+precision highp samplerCubeArrayShadow;

+precision highp isamplerCubeArray     ;

+precision highp usamplerCubeArray     ;

+

+uniform writeonly imageCubeArray  CA1;

+uniform writeonly iimageCubeArray CA2;

+uniform writeonly uimageCubeArray CA3;

+

+#ifdef GL_EXT_texture_cube_map_array

+uniform samplerCubeArray          CA4;

+uniform samplerCubeArrayShadow    CA5;

+uniform isamplerCubeArray         CA6;

+uniform usamplerCubeArray         CA7;

+#endif

+

+void CAT()

+{

+    highp vec4 b4 = texture(CA4, vec4(0.5), 0.24);

+    highp ivec4 b6 = texture(CA6, vec4(0.5), 0.26);

+    highp uvec4 b7 = texture(CA7, vec4(0.5), 0.27);

+}

+

+void goodSample()

+{

+    lowp     int  a1 = gl_SampleID;       

+    mediump  vec2 a2 = gl_SamplePosition; 

+    highp    int  a3 = gl_SampleMaskIn[0];

+    gl_SampleMask[0] = a3;

+    mediump int n1 = gl_MaxSamples;

+    mediump int n2 = gl_NumSamples;

+}

+

+uniform layout(r32f)  highp  image2D im2Df;

+uniform layout(r32ui) highp uimage2D im2Du;

+uniform layout(r32i)  highp iimage2D im2Di;

+uniform ivec2 P;

+

+uniform layout(rgba32f)  highp  image2D badIm2Df;  // ERROR, needs readonly or writeonly

+uniform layout(rgba8ui) highp uimage2D badIm2Du;   // ERROR, needs readonly or writeonly

+uniform layout(rgba16i)  highp iimage2D badIm2Di;  // ERROR, needs readonly or writeonly

+

+void goodImageAtom()

+{

+    float datf;

+    int dati;

+    uint datu;

+

+    imageAtomicAdd(     im2Di, P, dati);
+    imageAtomicAdd(     im2Du, P, datu);
+    imageAtomicMin(     im2Di, P, dati);
+    imageAtomicMin(     im2Du, P, datu);
+    imageAtomicMax(     im2Di, P, dati);
+    imageAtomicMax(     im2Du, P, datu);
+    imageAtomicAnd(     im2Di, P, dati);
+    imageAtomicAnd(     im2Du, P, datu);
+    imageAtomicOr(      im2Di, P, dati);
+    imageAtomicOr(      im2Du, P, datu);
+    imageAtomicXor(     im2Di, P, dati);
+    imageAtomicXor(     im2Du, P, datu);
+    imageAtomicExchange(im2Di, P, dati);
+    imageAtomicExchange(im2Du, P, datu);
+    imageAtomicExchange(im2Df, P, datf);
+    imageAtomicCompSwap(im2Di, P,  3, dati);

+    imageAtomicCompSwap(im2Du, P, 5u, datu);

+

+    imageAtomicMax(badIm2Di, P, dati);      // ERROR, not an allowed layout() on the image
+    imageAtomicMax(badIm2Du, P, datu);      // ERROR, not an allowed layout() on the image
+    imageAtomicExchange(badIm2Df, P, datf); // ERROR, not an allowed layout() on the image
+}

+

+centroid out vec4 colorCentroidBad;  // ERROR

+flat out vec4 colorBadFlat;          // ERROR

+smooth out vec4 colorBadSmooth;      // ERROR

+noperspective out vec4 colorBadNo;   // ERROR

+flat centroid in vec2 colorfc;

+in float scalarIn;

+

+sample in vec4 colorSampIn;

+sample out vec4 colorSampleBad;     // ERROR

+flat sample in vec4 colorfsi;

+sample in vec3 sampInArray[4];

+

+void interp()

+{

+    float res;

+    vec2 res2;

+    vec3 res3;

+    vec4 res4;

+

+    res2 = interpolateAtCentroid(colorfc);

+    res4 = interpolateAtCentroid(colorSampIn);

+    res4 = interpolateAtCentroid(colorfsi);

+    res  = interpolateAtCentroid(scalarIn);

+    res3 = interpolateAtCentroid(sampInArray);         // ERROR

+    res3 = interpolateAtCentroid(sampInArray[2]);

+    res2 = interpolateAtCentroid(sampInArray[2].xy);   // ERROR

+

+    res3 = interpolateAtSample(sampInArray, 1);        // ERROR

+    res3 = interpolateAtSample(sampInArray[i], 0);

+    res2 = interpolateAtSample(sampInArray[2].xy, 2);  // ERROR

+    res  = interpolateAtSample(scalarIn, 1);

+

+    res3 = interpolateAtOffset(sampInArray, vec2(0.2));         // ERROR

+    res3 = interpolateAtOffset(sampInArray[2], vec2(0.2));

+    res2 = interpolateAtOffset(sampInArray[2].xy, vec2(0.2));   // ERROR, no swizzle

+    res  = interpolateAtOffset(scalarIn + scalarIn, vec2(0.2)); // ERROR, no binary ops other than dereference

+    res  = interpolateAtOffset(scalarIn, vec2(0.2));

+

+    float f;

+    res  = interpolateAtCentroid(f);           // ERROR, not interpolant

+    res4 = interpolateAtSample(outp, 0);       // ERROR, not interpolant

+}

+

+layout(blend_support_multiply) out;
+layout(blend_support_screen) out;
+layout(blend_support_overlay) out;
+layout(blend_support_darken, blend_support_lighten) out;
+layout(blend_support_colordodge) layout(blend_support_colorburn) out;
+layout(blend_support_hardlight) out;
+layout(blend_support_softlight) out;
+layout(blend_support_difference) out;
+layout(blend_support_exclusion) out;
+layout(blend_support_hsl_hue) out;
+layout(blend_support_hsl_saturation) out;
+layout(blend_support_hsl_color) out;
+layout(blend_support_hsl_luminosity) out;
+layout(blend_support_all_equations) out;
+
+layout(blend_support_hsl_luminosity) out;              // okay to repeat
+
+layout(blend_support_hsl_luminosity) in;                       // ERROR, only on "out"
+layout(blend_support_hsl_luminosity) out vec4;                 // ERROR, only on standalone
+layout(blend_support_hsl_luminosity) out vec4 badout;          // ERROR, only on standalone
+layout(blend_support_hsl_luminosity) struct badS {int i;};     // ERROR, only on standalone
+layout(blend_support_hsl_luminosity) void blendFoo() { }       // ERROR, only on standalone
+void blendFoo(layout(blend_support_hsl_luminosity) vec3 v) { } // ERROR, only on standalone
+layout(blend_support_flizbit) out;                             // ERROR, no flizbit
+
+out vec4 outAA[2][2];  // ERROR
diff --git a/Test/320.geom b/Test/320.geom
new file mode 100644
index 0000000..38d71c3
--- /dev/null
+++ b/Test/320.geom
@@ -0,0 +1,134 @@
+#version 320 es

+

+precision mediump float;

+

+in fromVertex {

+    in vec3 color;

+} fromV[];

+

+in vec4 nonBlockUnsized[];

+

+out toFragment {

+    out vec3 color;

+} toF;

+

+out fromVertex {  // okay to reuse a block name for another block name

+    vec3 color;

+};

+

+out fooB {        // ERROR, cannot reuse block name as block instance

+    vec2 color;

+} fromVertex;

+

+int fromVertex;   // ERROR, cannot reuse a block name for something else

+

+out fooC {        // ERROR, cannot have same name for block and instance name

+    vec2 color;

+} fooC;

+

+void main()

+{

+    EmitVertex();

+    EndPrimitive();

+    EmitStreamVertex(1);    // ERROR

+    EndStreamPrimitive(0);  // ERROR

+

+    color = fromV[0].color;

+    gl_ClipDistance[3] =              // ERROR, no ClipDistance

+        gl_in[1].gl_ClipDistance[2];  // ERROR, no ClipDistance

+    gl_Position = gl_in[0].gl_Position;

+

+    gl_PrimitiveID = gl_PrimitiveIDIn;

+    gl_Layer = 2;

+}

+

+layout(stream = 4) out vec4 ov4; // ERROR, no streams

+

+layout(line_strip, points, triangle_strip, points, triangle_strip) out;  // just means triangle_strip"

+

+out ooutb { vec4 a; } ouuaa6;

+

+layout(max_vertices = 200) out;

+layout(max_vertices = 300) out;   // ERROR, too big

+void foo(layout(max_vertices = 4) int a)  // ERROR

+{

+    ouuaa6.a = vec4(1.0);

+}

+

+layout(line_strip, points, triangle_strip, points) out;  // ERROR, changing output primitive

+layout(line_strip, points) out; // ERROR, changing output primitive

+layout(triangle_strip) in; // ERROR, not an input primitive

+layout(triangle_strip) uniform; // ERROR

+layout(triangle_strip) out vec4 badv4;  // ERROR, not on a variable

+layout(triangle_strip) in vec4 bad2v4[];  // ERROR, not on a variable or input

+layout(invocations = 3) out outbn { int a; }; // 2 ERROR, not on a block, not until 4.0

+out outbn2 {

+    layout(invocations = 3)  int a; // 2 ERRORs, not on a block member, not until 4.0

+    layout(max_vertices = 3) int b; // ERROR, not on a block member

+    layout(triangle_strip)   int c; // ERROR, not on a block member

+} outbi;

+

+layout(lines) out;  // ERROR, not on output

+layout(lines_adjacency) in;

+layout(triangles) in;             // ERROR, can't change it

+layout(triangles_adjacency) in;   // ERROR, can't change it

+layout(invocations = 4) in;

+

+in sameName {

+    int a15;

+} insn[];

+

+out sameName {

+    float f15;

+};

+

+uniform sameName {

+    bool b15;

+};

+

+const int summ = gl_MaxVertexAttribs +

+             gl_MaxGeometryInputComponents +

+             gl_MaxGeometryOutputComponents +

+             gl_MaxGeometryImageUniforms +

+             gl_MaxGeometryTextureImageUnits +

+             gl_MaxGeometryOutputVertices +

+             gl_MaxGeometryTotalOutputComponents +

+             gl_MaxGeometryUniformComponents +

+             gl_MaxGeometryAtomicCounters +

+             gl_MaxGeometryAtomicCounterBuffers +

+             gl_MaxVertexTextureImageUnits +

+             gl_MaxCombinedTextureImageUnits +

+             gl_MaxTextureImageUnits +

+             gl_MaxDrawBuffers;

+

+void fooe1()

+{

+    gl_ViewportIndex;  // ERROR, not in ES

+    gl_MaxViewports;   // ERROR, not in ES

+    insn.length();     // 4: lines_adjacency

+    int inv = gl_InvocationID;

+}

+

+in vec4 explArray[4];

+in vec4 explArrayBad[5];  // ERROR, wrong size

+in vec4 nonArrayed;       // ERROR, not an array

+flat out vec3 myColor1;

+centroid out vec3 myColor2;

+centroid in vec3 centr[];

+sample out vec4 perSampleColor;  // ERROR without sample extensions

+

+layout(max_vertices = 200) out;  // matching redecl

+

+layout(location = 7, component = 2) in float comp[];  // ERROR, es has no component

+

+void notHere()

+{

+    gl_MaxGeometryVaryingComponents;  // ERROR, not in ES

+    gl_VerticesIn;                    // ERROR, not in ES

+}

+

+void pointSize2()

+{

+    highp float ps = gl_in[3].gl_PointSize;  // ERROR, need extension

+    gl_PointSize = ps;                       // ERROR, need extension

+}

diff --git a/Test/320.tesc b/Test/320.tesc
new file mode 100644
index 0000000..4fa20f6
--- /dev/null
+++ b/Test/320.tesc
@@ -0,0 +1,150 @@
+#version 320 es

+

+layout(vertices = 4) out;

+out int outa[gl_out.length()];

+

+layout(quads) in;                   // ERROR

+layout(ccw) out;                    // ERROR

+layout(fractional_even_spacing) in; // ERROR

+

+patch in vec4 patchIn;              // ERROR

+patch out vec4 patchOut;

+

+void main()

+{

+    barrier();

+

+    int a = gl_MaxTessControlInputComponents +

+            gl_MaxTessControlOutputComponents +

+            gl_MaxTessControlTextureImageUnits +

+            gl_MaxTessControlUniformComponents +

+            gl_MaxTessControlTotalOutputComponents;

+

+    vec4 p = gl_in[1].gl_Position;

+    float ps = gl_in[1].gl_PointSize;        // ERROR, need point_size extension

+    float cd = gl_in[1].gl_ClipDistance[2];  // ERROR, not in ES

+

+    int pvi = gl_PatchVerticesIn;

+    int pid = gl_PrimitiveID;

+    int iid = gl_InvocationID;

+

+    gl_out[gl_InvocationID].gl_Position = p;

+    gl_out[gl_InvocationID].gl_PointSize = ps;        // ERROR, need point_size extension

+    gl_out[gl_InvocationID].gl_ClipDistance[1] = cd;  // ERROR, not in ES

+

+    gl_TessLevelOuter[3] = 3.2;

+    gl_TessLevelInner[1] = 1.3;

+

+    if (a > 10)

+        barrier();           // ERROR

+    else

+        barrier();           // ERROR

+

+    barrier();

+

+    do {

+        barrier();           // ERROR

+    } while (a > 10);

+

+    switch (a) {

+    default:

+        barrier();           // ERROR

+        break;

+    }

+    a < 12 ? a : (barrier(), a); // ERROR

+    {

+        barrier();

+    }

+

+    return;

+

+    barrier();               // ERROR

+}

+

+layout(vertices = 4) in;    // ERROR, not on in

+layout(vertices = 5) out;   // ERROR, changing #

+

+void foo()

+{

+    gl_out[4].gl_Position;  // ERROR, out of range

+

+    barrier();              // ERROR, not in main

+}

+

+in vec2 ina;                // ERROR, not array

+in vec2 inb[];

+in vec2 inc[18];            // ERROR, wrong size

+in vec2 ind[gl_MaxPatchVertices];

+patch out float implA[];    // ERROR, not sized

+

+#extension GL_ARB_separate_shader_objects : enable

+

+layout(location = 3) in vec4 ivla[];

+layout(location = 4) in vec4 ivlb[];

+layout(location = 4) in vec4 ivlc[];  // ERROR, overlapping

+

+layout(location = 3) out vec4 ovla[];

+layout(location = 4) out vec4 ovlb[];

+layout(location = 4) out vec4 ovlc[];  // ERROR, overlapping

+

+patch out pinbn {

+    int a;

+} pinbi;

+

+centroid out vec3 myColor2[];

+centroid in vec3 centr[];

+sample out vec4 perSampleColor[];

+

+layout(vertices = 4) out float badlay[];   // ERROR, not on a variable

+out float misSized[5];              // ERROR, size doesn't match

+out float okaySize[4];

+

+void pointSize2()

+{

+    float ps = gl_in[1].gl_PointSize;  // ERROR, need point_size extension

+    gl_out[gl_InvocationID].gl_PointSize = ps;   // ERROR, need point_size extension

+}

+

+precise vec3 pv3;

+

+void goodfoop()

+{

+    precise float d;

+

+    pv3 *= pv3;

+    pv3 = fma(pv3, pv3, pv3);

+    d = fma(d, d, d);

+}

+

+void bb()

+{

+    gl_BoundingBoxOES[0] = vec4(0.0);

+    gl_BoundingBoxOES[1] = vec4(1.0);

+    gl_BoundingBoxOES[2] = vec4(2.0);  // ERROR, overflow

+}

+

+out patch badpatchBName {  // ERROR, array size required

+    float f;

+} badpatchIName[];

+

+out patch patchBName {

+    float f;

+} patchIName[4];

+

+void outputtingOutparam(out int a)

+{

+    a = 2;

+}

+

+void outputting()

+{

+    outa[gl_InvocationID] = 2;

+    outa[1] = 2;                         // ERROR, not gl_InvocationID

+    gl_out[0].gl_Position = vec4(1.0);   // ERROR, not gl_InvocationID

+    outa[1];

+    gl_out[0];

+    outputtingOutparam(outa[0]);         // ERROR, not gl_InvocationID

+    outputtingOutparam(outa[gl_InvocationID]);

+    patchIName[1].f = 3.14;

+    outa[(gl_InvocationID)] = 2;

+}

diff --git a/Test/320.tese b/Test/320.tese
new file mode 100644
index 0000000..cce2637
--- /dev/null
+++ b/Test/320.tese
@@ -0,0 +1,114 @@
+#version 320 es

+

+layout(vertices = 4) out; // ERROR

+layout(quads, cw) in;

+layout(triangles) in;     // ERROR

+layout(isolines) in;      // ERROR

+

+layout(ccw) in;           // ERROR

+layout(cw) in;

+

+layout(fractional_odd_spacing) in;    

+layout(equal_spacing) in;              // ERROR

+layout(fractional_even_spacing) in;    // ERROR

+

+layout(point_mode) in;

+

+patch in vec4 patchIn;

+patch out vec4 patchOut;  // ERROR

+

+void main()

+{

+    barrier(); // ERROR

+

+    int a = gl_MaxTessEvaluationInputComponents +

+            gl_MaxTessEvaluationOutputComponents +

+            gl_MaxTessEvaluationTextureImageUnits +

+            gl_MaxTessEvaluationUniformComponents +

+            gl_MaxTessPatchComponents +

+            gl_MaxPatchVertices +

+            gl_MaxTessGenLevel;

+

+    vec4 p = gl_in[1].gl_Position;

+    float ps = gl_in[1].gl_PointSize;        // ERROR, need point_size extension

+    float cd = gl_in[1].gl_ClipDistance[2];  // ERROR, not in ES

+

+    int pvi = gl_PatchVerticesIn;

+    int pid = gl_PrimitiveID;

+    vec3 tc = gl_TessCoord;

+    float tlo = gl_TessLevelOuter[3];

+    float tli = gl_TessLevelInner[1];

+

+    gl_Position = p;

+    gl_PointSize = ps;             // ERROR, need point_size extension

+    gl_ClipDistance[2] = cd;       // ERROR, not in ES

+}

+

+smooth patch in vec4 badp1;         // ERROR

+flat patch in vec4 badp2;           // ERROR

+noperspective patch in vec4 badp3;  // ERROR

+patch sample in vec3 badp4;         // ERROR

+

+#extension GL_ARB_separate_shader_objects : enable

+

+in gl_PerVertex

+{

+    vec4 gl_Position;

+} gl_in[];

+

+in gl_PerVertex           // ERROR, second redeclaration of gl_in

+{

+    vec4 gl_Position;

+} gl_in[];

+

+layout(quads, cw) out;     // ERROR

+layout(triangles) out;     // ERROR

+layout(isolines) out;      // ERROR

+layout(cw) out;            // ERROR

+layout(fractional_odd_spacing) out;    // ERROR

+layout(equal_spacing) out;             // ERROR

+layout(fractional_even_spacing) out;   // ERROR

+layout(point_mode) out;                // ERROR

+

+in vec2 ina;      // ERROR, not array

+in vec2 inb[];

+in vec2 inc[18];  // ERROR, wrong size

+in vec2 ind[gl_MaxPatchVertices];

+

+in testbla {      // ERROR, not array

+    int f;

+} bla;

+

+in testblb {

+    int f;

+} blb[];

+

+in testblc { // ERROR wrong size

+    int f;

+} blc[18];

+

+in testbld {

+    int f;

+} bld[gl_MaxPatchVertices];

+

+layout(location = 23) in vec4 ivla[];

+layout(location = 24) in vec4 ivlb[];

+layout(location = 24) in vec4 ivlc[];  // ERROR, overlap

+

+layout(location = 23) out vec4 ovla[2];

+layout(location = 24) out vec4 ovlb[2];  // ERROR, overlap

+

+in float gl_TessLevelOuter[4];           // ERROR, can't redeclare

+

+patch in pinbn {

+    int a;

+} pinbi;

+

+centroid out vec3 myColor2;

+centroid in vec3 centr[];

+sample out vec4 perSampleColor;

+

+void bbbad()

+{

+    gl_BoundingBoxOES; // ERROR, wrong stage

+}

diff --git a/Test/320.vert b/Test/320.vert
new file mode 100644
index 0000000..42f1515
--- /dev/null
+++ b/Test/320.vert
@@ -0,0 +1,255 @@
+#version 320 es

+

+out outbname {

+    int a;

+    out vec4 v;

+    highp sampler2D s;   // ERROR, opaque type

+} outbinst;

+

+out outbname2 {

+    layout(location = 12) int aAnon;

+    layout(location = 13) vec4 vAnon;

+};

+

+layout(location = 12) out highp int aliased;  // ERROR, aliasing location

+

+in inbname { int a; } inbinst;  // ERROR, no in block in vertex shader

+

+out gl_PerVertex {              // ERROR, has extra member

+    highp vec4 gl_Position;

+    highp vec4 t;

+};

+

+void main()

+{

+    int sum  = gl_VertexID +

+               gl_InstanceID;

+    gl_Position = vec4(1.0);

+    gl_PointSize = 2.0;         // ERROR, removed by redeclaration

+}

+

+out gl_PerVertex {              // ERROR, already used and already redeclared

+    highp vec4 gl_Position;

+    highp vec4 t;

+};

+

+smooth out smo {                // ERROR, no smooth on a block

+    int i;

+} smon;

+

+flat out fmo {                  // ERROR, no flat on a block

+    int i;

+} fmon;

+

+centroid out cmo {              // ERROR, no centroid on a block

+    int i;

+} cmon;

+

+invariant out imo {             // ERROR, no invariant on a block

+    int i;

+} imon;

+

+in vec2 inf, ing;

+uniform ivec2 offsets[4];

+uniform sampler2D sArray[4];

+uniform int sIndex;

+layout(binding = 0) uniform atomic_uint auArray[2];

+uniform ubName { int i; } ubInst[4];

+buffer bbName { int i; } bbInst[4];

+highp uniform writeonly image2D iArray[5];

+const ivec2 constOffsets[4] = ivec2[4](ivec2(0.1), ivec2(0.2), ivec2(0.3), ivec2(0.4));

+

+void pfoo()

+{

+    precise vec2 h;

+    h = fma(inf, ing, h);

+    sArray[sIndex + 1];

+    ubInst[sIndex + 1];

+    bbInst[sIndex - 2];      // ERROR, still not supported

+    iArray[2];

+    iArray[sIndex - 2];

+    textureGatherOffset(sArray[0], vec2(0.1), ivec2(inf));

+    textureGatherOffsets(sArray[0], vec2(0.1), constOffsets);

+    textureGatherOffsets(sArray[0], vec2(0.1), offsets);   // ERROR, offset not constant

+}

+

+uniform samplerBuffer  noPreSamp1;            // ERROR, no default precision

+uniform isamplerBuffer noPreSamp2;            // ERROR, no default precision

+uniform usamplerBuffer noPreSamp3;            // ERROR, no default precision

+uniform writeonly imageBuffer    noPreSamp4;  // ERROR, no default precision

+uniform writeonly iimageBuffer   noPreSamp5;  // ERROR, no default precision

+uniform writeonly uimageBuffer   noPreSamp6;  // ERROR, no default precision

+

+precision highp samplerBuffer; 

+precision highp isamplerBuffer;

+precision highp usamplerBuffer;

+precision highp imageBuffer;   

+precision highp iimageBuffer;  

+precision highp uimageBuffer;  

+

+#ifdef GL_OES_texture_buffer

+uniform samplerBuffer  bufSamp1;          

+uniform isamplerBuffer bufSamp2;          

+uniform usamplerBuffer bufSamp3;          

+#endif

+#ifdef GL_EXT_texture_buffer

+uniform writeonly imageBuffer    bufSamp4;

+uniform writeonly iimageBuffer   bufSamp5;

+uniform writeonly uimageBuffer   bufSamp6;

+#endif

+

+void bufferT()

+{

+    highp int s1 = textureSize(bufSamp1);

+    highp int s2 = textureSize(bufSamp2);

+    highp int s3 = textureSize(bufSamp3);

+

+    highp int s4 = imageSize(bufSamp4);

+    highp int s5 = imageSize(bufSamp5);

+    highp int s6 = imageSize(bufSamp6);

+    

+    highp vec4 f1 = texelFetch(bufSamp1, s1);

+    highp ivec4 f2 = texelFetch(bufSamp2, s2);

+    highp uvec4 f3 = texelFetch(bufSamp3, s3);

+}

+

+uniform writeonly imageCubeArray  noPreCA1;   // ERROR, no default precision

+uniform writeonly iimageCubeArray noPreCA2;   // ERROR, no default precision

+uniform writeonly uimageCubeArray noPreCA3;   // ERROR, no default precision

+

+uniform samplerCubeArray          noPreCA4;   // ERROR, no default precision

+uniform samplerCubeArrayShadow    noPreCA5;   // ERROR, no default precision

+uniform isamplerCubeArray         noPreCA6;   // ERROR, no default precision

+uniform usamplerCubeArray         noPreCA7;   // ERROR, no default precision

+

+precision highp imageCubeArray        ;

+precision highp iimageCubeArray       ;

+precision highp uimageCubeArray       ;

+

+precision highp samplerCubeArray      ;

+precision highp samplerCubeArrayShadow;

+precision highp isamplerCubeArray     ;

+precision highp usamplerCubeArray     ;

+

+uniform writeonly imageCubeArray  CA1;

+uniform writeonly iimageCubeArray CA2;

+uniform writeonly uimageCubeArray CA3;

+

+layout(rgba16f) uniform readonly imageCubeArray  rCA1;

+layout(rgba32i) uniform readonly iimageCubeArray rCA2;

+layout(r32ui) uniform readonly uimageCubeArray rCA3;

+

+#ifdef GL_OES_texture_cube_map_array

+uniform samplerCubeArray          CA4;

+uniform samplerCubeArrayShadow    CA5;

+uniform isamplerCubeArray         CA6;

+uniform usamplerCubeArray         CA7;

+#endif

+

+void CAT()

+{

+    highp ivec3 s4 = textureSize(CA4, 1);

+    highp ivec3 s5 = textureSize(CA5, 1);

+    highp ivec3 s6 = textureSize(CA6, 1);

+    highp ivec3 s7 = textureSize(CA7, 1);

+    

+    highp vec4 t4 = texture(CA4, vec4(0.5));

+    highp float t5 = texture(CA5, vec4(0.5), 3.0);

+    highp ivec4 t6 = texture(CA6, vec4(0.5));

+    highp uvec4 t7 = texture(CA7, vec4(0.5));

+

+    highp vec4 L4 = textureLod(CA4, vec4(0.5), 0.24);

+    highp ivec4 L6 = textureLod(CA6, vec4(0.5), 0.26);

+    highp uvec4 L7 = textureLod(CA7, vec4(0.5), 0.27);

+

+    highp vec4 g4 = textureGrad(CA4, vec4(0.5), vec3(0.1), vec3(0.2));

+    highp ivec4 g6 = textureGrad(CA6, vec4(0.5), vec3(0.1), vec3(0.2));

+    highp uvec4 g7 = textureGrad(CA7, vec4(0.5), vec3(0.1), vec3(0.2));

+

+    highp vec4 gath4 = textureGather(CA4, vec4(0.5));

+    highp vec4 gathC4 = textureGather(CA4, vec4(0.5), 2);

+    highp ivec4 gath6 = textureGather(CA6, vec4(0.5));

+    highp ivec4 gathC6 = textureGather(CA6, vec4(0.5), 1);

+    highp uvec4 gath7 = textureGather(CA7, vec4(0.5));

+    highp uvec4 gathC7 = textureGather(CA7, vec4(0.5), 0);

+

+    highp vec4 gath5 = textureGather(CA5, vec4(0.5), 2.5);

+

+    highp ivec3 s1 = imageSize(CA1);

+    highp ivec3 s2 = imageSize(CA2);

+    highp ivec3 s3 = imageSize(CA3);

+

+    imageStore(CA1, s3, vec4(1));

+    imageStore(CA2, s3, ivec4(1));

+    imageStore(CA3, s3, uvec4(1));

+

+    highp vec4 cl1 = imageLoad(rCA1, s3);

+    highp ivec4 cl2 = imageLoad(rCA2, s3);

+    highp uvec4 cl3 = imageLoad(rCA3, s3);

+}

+

+uniform sampler2DMSArray  noPrec2DMS;    // ERROR, no default

+uniform isampler2DMSArray noPrec2DMSi;   // ERROR, no default

+uniform usampler2DMSArray noPrec2DMSu;   // ERROR, no default

+

+precision highp sampler2DMSArray;

+precision highp isampler2DMSArray;

+precision highp usampler2DMSArray;

+

+uniform sampler2DMSArray  samp2DMSA;

+uniform isampler2DMSArray samp2DMSAi;

+uniform usampler2DMSArray samp2DMSAu;

+

+void MSA()

+{

+    vec4 tf = texelFetch(samp2DMSA, ivec3(5), 2);

+    ivec4 tfi = texelFetch(samp2DMSAi, ivec3(5), 2);

+    uvec4 tfu = texelFetch(samp2DMSAu, ivec3(5), 2);

+    

+    ivec3 tfs = textureSize(samp2DMSA);

+    ivec3 tfsi = textureSize(samp2DMSAi);

+    ivec3 tfsb = textureSize(samp2DMSAi, 4);  // ERROR, no lod

+    ivec3 tfsu = textureSize(samp2DMSAu);

+}

+

+uniform layout(r32f)  highp  image2D im2Df;

+uniform layout(r32ui) highp uimage2D im2Du;

+uniform layout(r32i)  highp iimage2D im2Di;

+uniform ivec2 P;

+

+void goodImageAtom()

+{

+    float datf;

+    int dati;

+    uint datu;

+

+    imageAtomicAdd(     im2Di, P, dati);
+    imageAtomicAdd(     im2Du, P, datu);
+    imageAtomicMin(     im2Di, P, dati);
+    imageAtomicMin(     im2Du, P, datu);
+    imageAtomicMax(     im2Di, P, dati);
+    imageAtomicMax(     im2Du, P, datu);
+    imageAtomicAnd(     im2Di, P, dati);
+    imageAtomicAnd(     im2Du, P, datu);
+    imageAtomicOr(      im2Di, P, dati);
+    imageAtomicOr(      im2Du, P, datu);
+    imageAtomicXor(     im2Di, P, dati);
+    imageAtomicXor(     im2Du, P, datu);
+    imageAtomicExchange(im2Di, P, dati);
+    imageAtomicExchange(im2Du, P, datu);
+    imageAtomicExchange(im2Df, P, datf);
+    imageAtomicCompSwap(im2Di, P,  3, dati);

+    imageAtomicCompSwap(im2Du, P, 5u, datu);

+}

+

+sample out vec4 colorSample;

+flat sample out vec4 colorfsi;

+sample out vec3 sampInArray[4];

+in vec4 inv4;

+

+void badInterp()

+{

+    interpolateAtCentroid(inv4);             // ERROR, wrong stage

+    interpolateAtSample(inv4, 1);            // ERROR, need extension

+    interpolateAtOffset(inv4, vec2(0.2));    // ERROR, need extension

+}

diff --git a/Test/400.frag b/Test/400.frag
index 92dcd58..039d480 100644
--- a/Test/400.frag
+++ b/Test/400.frag
@@ -194,4 +194,8 @@
     iout += i | uu;

 }

 

+subroutine(subT1, subT2);

+subroutine float subT1() { return 1.0; }

+subroutine float subT2() { return 1.0; }

+

 struct SKeyMem { int precise; } KeyMem;     // ERROR, keyword can't be a member

diff --git a/Test/400.geom b/Test/400.geom
index 0b77e12..f8e8955 100644
--- a/Test/400.geom
+++ b/Test/400.geom
@@ -300,9 +300,9 @@
     dmat3x4 dmat3x4v = outerProduct(dvec4v, dvec3v);

     dmat4x3 dmat4x3v = outerProduct(dvec3v, dvec4v);

 

-    dmat2v *= matrixCompMult(dmat2v, dmat2v);
-    dmat3v *= matrixCompMult(dmat3v, dmat3v);
-    dmat4v *= matrixCompMult(dmat4v, dmat4v);
+    dmat2v *= matrixCompMult(dmat2v, dmat2v);

+    dmat3v *= matrixCompMult(dmat3v, dmat3v);

+    dmat4v *= matrixCompMult(dmat4v, dmat4v);

     dmat2x3v = matrixCompMult(dmat2x3v, dmat2x3v);

     dmat2x4v = matrixCompMult(dmat2x4v, dmat2x4v);

     dmat3x2v = matrixCompMult(dmat3x2v, dmat3x2v);

diff --git a/Test/400.tese b/Test/400.tese
index aea4546..c110a1c 100644
--- a/Test/400.tese
+++ b/Test/400.tese
@@ -51,7 +51,7 @@
 

 #extension GL_ARB_separate_shader_objects : enable

 

-in gl_PerVertex            // ERROR, no size

+in gl_PerVertex

 {

     float gl_ClipDistance[1];

 } gl_in[];

diff --git a/Test/420.comp b/Test/420.comp
old mode 100755
new mode 100644
diff --git a/Test/435.vert b/Test/435.vert
new file mode 100644
index 0000000..bf27ce9
--- /dev/null
+++ b/Test/435.vert
@@ -0,0 +1,2 @@
+#version 435

+void main() {}
\ No newline at end of file
diff --git a/Test/440.vert b/Test/440.vert
index 2e61f79..4ab6f2e 100644
--- a/Test/440.vert
+++ b/Test/440.vert
@@ -174,6 +174,12 @@
     float f;

 } bbinst10;

 

+layout(xfb_buffer = 3) out;

+layout(xfb_offset = 32) out gl_PerVertex {

+    layout(xfb_buffer = 2) float gl_PointSize; // ERROR, change in xfb_buffer

+    vec4 gl_Position;

+};

+

 int drawParamsBad()

 {

     return gl_BaseVertexARB + gl_BaseInstanceARB + gl_DrawIDARB; // ERROR, extension not requested

diff --git a/Test/450.comp b/Test/450.comp
index 7f723ec..fb2b56a 100644
--- a/Test/450.comp
+++ b/Test/450.comp
@@ -1 +1,6 @@
 #version 450 core

+layout(local_size_x = 0) in; // ERROR, 0 not allowed

+void main()

+{

+    shared float f;   // ERROR shared must be global

+}

diff --git a/Test/450.frag b/Test/450.frag
index 04f3aa1..076d0b3 100644
--- a/Test/450.frag
+++ b/Test/450.frag
@@ -54,3 +54,15 @@
 {

     return (i >= 6) ? gl_CullDistance[5] : gl_CullDistance[i];

 }

+

+layout(location = 6) in bName1 {

+    float f;

+    layout(location = 7) float g;

+    mat4 m;

+} bInst1;

+layout(location = 12) in bName2 {

+    float f;

+    layout(location = 13) float g;  // ERROR, location on array

+} bInst2[3];

+

+layout(early_fragment_tests) in float f; // ERROR, must be standalone

diff --git a/Test/450.geom b/Test/450.geom
index 83d99aa..45cbecb 100644
--- a/Test/450.geom
+++ b/Test/450.geom
@@ -15,3 +15,5 @@
     gl_in[3].gl_Position; // ERROR, out of range

     gl_CullDistance[2] = gl_in[1].gl_CullDistance[2];

 }

+

+layout(points) in float f[3];  // ERROR, must be standalone

diff --git a/Test/450.tesc b/Test/450.tesc
index 75a9bf4..bf5c083 100644
--- a/Test/450.tesc
+++ b/Test/450.tesc
@@ -12,3 +12,12 @@
 {

     gl_out[gl_InvocationID].gl_CullDistance[2] = gl_in[1].gl_CullDistance[2];

 }

+

+layout(location = 4) out bName1 {

+    float f;

+    layout(location = 5) float g;

+} bInst1[2];

+layout(location = 6) out bName2 {

+    float f;

+    layout(location = 7) float g;  // ERROR, location on array

+} bInst2[2][3];

diff --git a/Test/450.tese b/Test/450.tese
index 6144793..8cdeb20 100644
--- a/Test/450.tese
+++ b/Test/450.tese
@@ -12,3 +12,10 @@
 {

     gl_CullDistance[2] = gl_in[1].gl_CullDistance[2];

 }

+

+layout(equal_spacing)           in float f1[];  // ERROR, must be standalone

+layout(fractional_even_spacing) in float f2[];  // ERROR, must be standalone

+layout(fractional_odd_spacing)  in float f3[];  // ERROR, must be standalone

+layout(cw)                      in float f4[];  // ERROR, must be standalone

+layout(ccw)                     in float f5[];  // ERROR, must be standalone

+layout(point_mode)              in float f6[];  // ERROR, must be standalone

diff --git a/Test/450.vert b/Test/450.vert
index 0834d16..e99a133 100644
--- a/Test/450.vert
+++ b/Test/450.vert
@@ -22,7 +22,35 @@
 struct SS { float f; S s; };

 out SS outSS;

 

+layout(binding = 0) uniform atomic_uint aui;

+uint ui;

+

 void foo()

 {

     SS::f;

+    atomicCounterAdd(aui, ui);           // ERROR, need 4.6

+    atomicCounterSubtract(aui, ui);      // ERROR, need 4.6

+    atomicCounterMin(aui, ui);           // ERROR, need 4.6

+    atomicCounterMax(aui, ui);           // ERROR, need 4.6

+    atomicCounterAnd(aui, ui);           // ERROR, need 4.6

+    atomicCounterOr(aui, ui);            // ERROR, need 4.6

+    atomicCounterXor(aui, ui);           // ERROR, need 4.6

+    atomicCounterExchange(aui, ui);      // ERROR, need 4.6

+    atomicCounterCompSwap(aui, ui, ui);  // ERROR, need 4.6

+

+    int a = gl_BaseVertex + gl_BaseInstance + gl_DrawID; // ERROR, need 4.6

+

+    bool b1;

+    anyInvocation(b1);        // ERROR, need 4.6

+    allInvocations(b1);       // ERROR, need 4.6

+    allInvocationsEqual(b1);  // ERROR, need 4.6

 }

+; // ERROR: no extraneous semicolons

+

+layout(location = 0) uniform locBlock {        // ERROR, no location uniform block

+    int a;

+};

+

+layout(location = 0) buffer locBuffBlock {     // ERROR, no location on buffer block

+    int b;

+};

diff --git a/Test/460.frag b/Test/460.frag
new file mode 100644
index 0000000..23f8eea
--- /dev/null
+++ b/Test/460.frag
@@ -0,0 +1,32 @@
+#version 460 core

+

+struct S {

+    float f;

+    vec4 v;

+};

+

+in S s;

+

+void main()

+{

+    interpolateAtCentroid(s.v);

+    bool b1;

+    b1 = anyInvocation(b1);

+    b1 = allInvocations(b1);

+    b1 = allInvocationsEqual(b1);

+}

+

+void attExtBad()

+{

+    // ERRORs, not enabled

+    [[dependency_length(1+3)]] for (int i = 0; i < 8; ++i) { }
+    [[flatten]]                if (true) { } else { }
+}
+

+#extension GL_EXT_control_flow_attributes : enable

+

+void attExt()

+{

+    [[dependency_length(-3)]] do {  } while(true); // ERROR, not positive

+    [[dependency_length(0)]] do {  } while(true);  // ERROR, not positive
+}
diff --git a/Test/460.vert b/Test/460.vert
new file mode 100644
index 0000000..fd87d8b
--- /dev/null
+++ b/Test/460.vert
@@ -0,0 +1,15 @@
+#version 460 core

+

+int i;

+; // extraneous semicolon okay

+float f;;;

+

+void main()

+{

+    bool b1;

+    b1 = anyInvocation(b1);

+    b1 = allInvocations(b1);

+    b1 = allInvocationsEqual(b1);

+}

+;

+;

diff --git a/Test/array.frag b/Test/array.frag
index 4ccb00c..a7b96a4 100644
--- a/Test/array.frag
+++ b/Test/array.frag
@@ -102,5 +102,12 @@
 }
 
 int[] i = int[]();    // ERROR, need constructor arguments
-float emptyA[];

-float b = vec4(emptyA);    // ERROR, array can't be a constructor argument

+float emptyA[];
+float b = vec4(emptyA);    // ERROR, array can't be a constructor argument
+uniform sampler2D s2d[];
+
+void foo4()
+{
+    s2d[a];                         // ERROR, can't variably index unsized array
+    float local[] = gUnusedUnsized; // ERROR, can initialize with runtime-sized array
+}
diff --git a/Test/badMacroArgs.frag b/Test/badMacroArgs.frag
old mode 100755
new mode 100644
diff --git a/Test/bar.h b/Test/bar.h
new file mode 100644
index 0000000..c206a32
--- /dev/null
+++ b/Test/bar.h
@@ -0,0 +1 @@
+float4 i1;
diff --git a/Test/baseLegalResults/hlsl.aliasOpaque.frag.out b/Test/baseLegalResults/hlsl.aliasOpaque.frag.out
new file mode 100644
index 0000000..e65ee7b
--- /dev/null
+++ b/Test/baseLegalResults/hlsl.aliasOpaque.frag.out
@@ -0,0 +1,46 @@
+hlsl.aliasOpaque.frag
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 87
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 62
+                              ExecutionMode 4 OriginUpperLeft
+                              Source HLSL 500
+                              Name 4  "main"
+                              Name 47  "gss"
+                              Name 51  "gtex"
+                              Name 62  "@entryPointOutput"
+                              Decorate 47(gss) DescriptorSet 0
+                              Decorate 51(gtex) DescriptorSet 0
+                              Decorate 62(@entryPointOutput) Location 0
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeSampler
+               7:             TypeFloat 32
+               8:             TypeImage 7(float) 2D sampled format:Unknown
+              11:             TypeVector 7(float) 4
+              32:             TypeSampledImage 8
+              34:             TypeVector 7(float) 2
+              35:    7(float) Constant 1045220557
+              36:    7(float) Constant 1050253722
+              37:   34(fvec2) ConstantComposite 35 36
+              43:             TypePointer UniformConstant 6
+         47(gss):     43(ptr) Variable UniformConstant
+              50:             TypePointer UniformConstant 8
+        51(gtex):     50(ptr) Variable UniformConstant
+              54:    7(float) Constant 1077936128
+              61:             TypePointer Output 11(fvec4)
+62(@entryPointOutput):     61(ptr) Variable Output
+         4(main):           2 Function None 3
+               5:             Label
+              70:           6 Load 47(gss)
+              72:           8 Load 51(gtex)
+              84:          32 SampledImage 72 70
+              85:   11(fvec4) ImageSampleImplicitLod 84 37
+              86:   11(fvec4) VectorTimesScalar 85 54
+                              Store 62(@entryPointOutput) 86
+                              Return
+                              FunctionEnd
diff --git a/Test/baseLegalResults/hlsl.flattenOpaque.frag.out b/Test/baseLegalResults/hlsl.flattenOpaque.frag.out
new file mode 100644
index 0000000..cf3fbab
--- /dev/null
+++ b/Test/baseLegalResults/hlsl.flattenOpaque.frag.out
@@ -0,0 +1,65 @@
+hlsl.flattenOpaque.frag
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 185
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 120
+                              ExecutionMode 4 OriginUpperLeft
+                              Source HLSL 500
+                              Name 4  "main"
+                              Name 38  "tex"
+                              Name 82  "s.s2D"
+                              Name 97  "s2.s2D"
+                              Name 100  "s2.tex"
+                              Name 120  "@entryPointOutput"
+                              Decorate 38(tex) DescriptorSet 0
+                              Decorate 82(s.s2D) DescriptorSet 0
+                              Decorate 97(s2.s2D) DescriptorSet 0
+                              Decorate 100(s2.tex) DescriptorSet 0
+                              Decorate 120(@entryPointOutput) Location 0
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeSampler
+               9:             TypeFloat 32
+              10:             TypeVector 9(float) 4
+              15:             TypeVector 9(float) 2
+              22:             TypeImage 9(float) 2D sampled format:Unknown
+              37:             TypePointer UniformConstant 22
+         38(tex):     37(ptr) Variable UniformConstant
+              45:             TypeSampledImage 22
+              47:    9(float) Constant 1045220557
+              48:    9(float) Constant 1050253722
+              49:   15(fvec2) ConstantComposite 47 48
+              81:             TypePointer UniformConstant 6
+       82(s.s2D):     81(ptr) Variable UniformConstant
+      97(s2.s2D):     81(ptr) Variable UniformConstant
+     100(s2.tex):     37(ptr) Variable UniformConstant
+             119:             TypePointer Output 10(fvec4)
+120(@entryPointOutput):    119(ptr) Variable Output
+         4(main):           2 Function None 3
+               5:             Label
+             134:           6 Load 82(s.s2D)
+             158:          22 Load 38(tex)
+             161:          45 SampledImage 158 134
+             162:   10(fvec4) ImageSampleImplicitLod 161 49
+             138:           6 Load 82(s.s2D)
+             164:          22 Load 38(tex)
+             167:          45 SampledImage 164 138
+             169:   10(fvec4) ImageSampleImplicitLod 167 49
+             142:   10(fvec4) FAdd 162 169
+             143:           6 Load 97(s2.s2D)
+             145:          22 Load 100(s2.tex)
+             175:          45 SampledImage 145 143
+             176:   10(fvec4) ImageSampleImplicitLod 175 49
+             149:   10(fvec4) FAdd 142 176
+             150:           6 Load 97(s2.s2D)
+             152:          22 Load 100(s2.tex)
+             182:          45 SampledImage 152 150
+             184:   10(fvec4) ImageSampleImplicitLod 182 49
+             156:   10(fvec4) FAdd 149 184
+                              Store 120(@entryPointOutput) 156
+                              Return
+                              FunctionEnd
diff --git a/Test/baseLegalResults/hlsl.flattenOpaqueInit.vert.out b/Test/baseLegalResults/hlsl.flattenOpaqueInit.vert.out
new file mode 100644
index 0000000..bec5aa2
--- /dev/null
+++ b/Test/baseLegalResults/hlsl.flattenOpaqueInit.vert.out
@@ -0,0 +1,52 @@
+hlsl.flattenOpaqueInit.vert
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 134
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Vertex 4  "main" 80
+                              Source HLSL 500
+                              Name 4  "main"
+                              Name 43  "g_tInputTexture_sampler"
+                              Name 47  "g_tInputTexture"
+                              Name 80  "@entryPointOutput"
+                              Decorate 43(g_tInputTexture_sampler) DescriptorSet 0
+                              Decorate 47(g_tInputTexture) DescriptorSet 0
+                              Decorate 80(@entryPointOutput) Location 0
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeSampler
+               7:             TypeFloat 32
+               8:             TypeImage 7(float) 2D sampled format:Unknown
+              11:             TypeVector 7(float) 4
+              31:             TypeSampledImage 8
+              33:             TypeVector 7(float) 2
+              34:    7(float) Constant 1050253722
+              35:    7(float) Constant 1053609165
+              36:   33(fvec2) ConstantComposite 34 35
+              37:    7(float) Constant 0
+              42:             TypePointer UniformConstant 6
+43(g_tInputTexture_sampler):     42(ptr) Variable UniformConstant
+              46:             TypePointer UniformConstant 8
+47(g_tInputTexture):     46(ptr) Variable UniformConstant
+              79:             TypePointer Output 11(fvec4)
+80(@entryPointOutput):     79(ptr) Variable Output
+         4(main):           2 Function None 3
+               5:             Label
+              90:           6 Load 43(g_tInputTexture_sampler)
+              91:           8 Load 47(g_tInputTexture)
+             111:          31 SampledImage 91 90
+             112:   11(fvec4) ImageSampleExplicitLod 111 36 Lod 37
+             115:           6 Load 43(g_tInputTexture_sampler)
+             117:           8 Load 47(g_tInputTexture)
+             125:          31 SampledImage 117 115
+             126:   11(fvec4) ImageSampleExplicitLod 125 36 Lod 37
+              99:   11(fvec4) FAdd 112 126
+             132:          31 SampledImage 91 90
+             133:   11(fvec4) ImageSampleExplicitLod 132 36 Lod 37
+             104:   11(fvec4) FAdd 99 133
+                              Store 80(@entryPointOutput) 104
+                              Return
+                              FunctionEnd
diff --git a/Test/baseLegalResults/hlsl.flattenOpaqueInitMix.vert.out b/Test/baseLegalResults/hlsl.flattenOpaqueInitMix.vert.out
new file mode 100644
index 0000000..14d0cd3
--- /dev/null
+++ b/Test/baseLegalResults/hlsl.flattenOpaqueInitMix.vert.out
@@ -0,0 +1,43 @@
+hlsl.flattenOpaqueInitMix.vert
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 97
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Vertex 4  "main" 57
+                              Source HLSL 500
+                              Name 4  "main"
+                              Name 44  "g_tInputTexture_sampler"
+                              Name 47  "g_tInputTexture"
+                              Name 57  "@entryPointOutput"
+                              Decorate 44(g_tInputTexture_sampler) DescriptorSet 0
+                              Decorate 47(g_tInputTexture) DescriptorSet 0
+                              Decorate 57(@entryPointOutput) Location 0
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeSampler
+               7:             TypeFloat 32
+               8:             TypeImage 7(float) 2D sampled format:Unknown
+              11:             TypeVector 7(float) 4
+              28:             TypeSampledImage 8
+              36:             TypeVector 7(float) 2
+              38:    7(float) Constant 0
+              43:             TypePointer UniformConstant 6
+44(g_tInputTexture_sampler):     43(ptr) Variable UniformConstant
+              46:             TypePointer UniformConstant 8
+47(g_tInputTexture):     46(ptr) Variable UniformConstant
+              49:    7(float) Constant 1056964608
+              56:             TypePointer Output 11(fvec4)
+57(@entryPointOutput):     56(ptr) Variable Output
+              96:   36(fvec2) ConstantComposite 49 49
+         4(main):           2 Function None 3
+               5:             Label
+              63:           6 Load 44(g_tInputTexture_sampler)
+              64:           8 Load 47(g_tInputTexture)
+              73:          28 SampledImage 64 63
+              79:   11(fvec4) ImageSampleExplicitLod 73 96 Lod 38
+                              Store 57(@entryPointOutput) 79
+                              Return
+                              FunctionEnd
diff --git a/Test/baseLegalResults/hlsl.flattenSubset.frag.out b/Test/baseLegalResults/hlsl.flattenSubset.frag.out
new file mode 100644
index 0000000..143c96c
--- /dev/null
+++ b/Test/baseLegalResults/hlsl.flattenSubset.frag.out
@@ -0,0 +1,47 @@
+hlsl.flattenSubset.frag
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 66
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 47 50
+                              ExecutionMode 4 OriginUpperLeft
+                              Source HLSL 500
+                              Name 4  "main"
+                              Name 21  "samp"
+                              Name 33  "tex"
+                              Name 47  "vpos"
+                              Name 50  "@entryPointOutput"
+                              Decorate 21(samp) DescriptorSet 0
+                              Decorate 33(tex) DescriptorSet 0
+                              Decorate 47(vpos) Location 0
+                              Decorate 50(@entryPointOutput) Location 0
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+              13:             TypeSampler
+              20:             TypePointer UniformConstant 13
+        21(samp):     20(ptr) Variable UniformConstant
+              31:             TypeImage 6(float) 2D sampled format:Unknown
+              32:             TypePointer UniformConstant 31
+         33(tex):     32(ptr) Variable UniformConstant
+              37:             TypeSampledImage 31
+              39:             TypeVector 6(float) 2
+              40:    6(float) Constant 1056964608
+              41:   39(fvec2) ConstantComposite 40 40
+              46:             TypePointer Input 7(fvec4)
+        47(vpos):     46(ptr) Variable Input
+              49:             TypePointer Output 7(fvec4)
+50(@entryPointOutput):     49(ptr) Variable Output
+         4(main):           2 Function None 3
+               5:             Label
+              57:          13 Load 21(samp)
+              61:          31 Load 33(tex)
+              64:          37 SampledImage 61 57
+              65:    7(fvec4) ImageSampleImplicitLod 64 41
+                              Store 50(@entryPointOutput) 65
+                              Return
+                              FunctionEnd
diff --git a/Test/baseLegalResults/hlsl.flattenSubset2.frag.out b/Test/baseLegalResults/hlsl.flattenSubset2.frag.out
new file mode 100644
index 0000000..0d7ab56
--- /dev/null
+++ b/Test/baseLegalResults/hlsl.flattenSubset2.frag.out
@@ -0,0 +1,31 @@
+hlsl.flattenSubset2.frag
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 53
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 49 52
+                              ExecutionMode 4 OriginUpperLeft
+                              Source HLSL 500
+                              Name 4  "main"
+                              Name 49  "vpos"
+                              Name 52  "@entryPointOutput"
+                              Decorate 49(vpos) Location 0
+                              Decorate 52(@entryPointOutput) Location 0
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+              43:    6(float) Constant 0
+              44:    7(fvec4) ConstantComposite 43 43 43 43
+              48:             TypePointer Input 7(fvec4)
+        49(vpos):     48(ptr) Variable Input
+              51:             TypePointer Output 7(fvec4)
+52(@entryPointOutput):     51(ptr) Variable Output
+         4(main):           2 Function None 3
+               5:             Label
+                              Store 52(@entryPointOutput) 44
+                              Return
+                              FunctionEnd
diff --git a/Test/baseLegalResults/hlsl.partialFlattenLocal.vert.out b/Test/baseLegalResults/hlsl.partialFlattenLocal.vert.out
new file mode 100644
index 0000000..27482b3
--- /dev/null
+++ b/Test/baseLegalResults/hlsl.partialFlattenLocal.vert.out
@@ -0,0 +1,81 @@
+hlsl.partialFlattenLocal.vert
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 158
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Vertex 4  "main" 83 86
+                              Source HLSL 500
+                              Name 4  "main"
+                              Name 83  "pos"
+                              Name 86  "@entryPointOutput"
+                              Decorate 83(pos) Location 0
+                              Decorate 86(@entryPointOutput) BuiltIn Position
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+              14:             TypeVector 6(float) 3
+              15:             TypeInt 32 0
+              16:     15(int) Constant 3
+              17:             TypeArray 14(fvec3) 16
+              18:             TypeVector 6(float) 2
+              19:     15(int) Constant 2
+              20:             TypeArray 18(fvec2) 19
+              21:             TypeInt 32 1
+              25:     21(int) Constant 0
+              31:     21(int) Constant 1
+              32:    6(float) Constant 0
+              33:   14(fvec3) ConstantComposite 32 32 32
+              34:             TypePointer Function 14(fvec3)
+              37:    6(float) Constant 1065353216
+              38:   18(fvec2) ConstantComposite 32 37
+              39:             TypePointer Function 18(fvec2)
+              54:             TypeBool
+              82:             TypePointer Input 7(fvec4)
+         83(pos):     82(ptr) Variable Input
+              85:             TypePointer Output 7(fvec4)
+86(@entryPointOutput):     85(ptr) Variable Output
+             130:             TypePointer Function 17
+             132:             TypePointer Function 20
+         4(main):           2 Function None 3
+               5:             Label
+             133:    132(ptr) Variable Function
+             131:    130(ptr) Variable Function
+              84:    7(fvec4) Load 83(pos)
+             136:     34(ptr) AccessChain 131 25
+                              Store 136 33
+             137:     39(ptr) AccessChain 133 25
+                              Store 137 38
+                              Branch 100
+             100:             Label
+             157:     21(int) Phi 25 5 119 106
+             105:    54(bool) SLessThan 157 31
+                              LoopMerge 101 106 None
+                              BranchConditional 105 106 101
+             106:               Label
+             138:     39(ptr)   AccessChain 133 157
+             110:   18(fvec2)   Load 138
+             139:     34(ptr)   AccessChain 131 157
+             112:   14(fvec3)   Load 139
+             113:   18(fvec2)   VectorShuffle 112 112 0 1
+             114:   18(fvec2)   FAdd 113 110
+             140:     34(ptr)   AccessChain 131 157
+             116:   14(fvec3)   Load 140
+             117:   14(fvec3)   VectorShuffle 116 114 3 4 2
+                                Store 140 117
+             119:     21(int)   IAdd 157 31
+                                Branch 100
+             101:             Label
+             142:          17 Load 131
+             156:   14(fvec3) CompositeExtract 142 0
+             124:    6(float) CompositeExtract 156 0
+             125:    6(float) CompositeExtract 156 1
+             126:    6(float) CompositeExtract 156 2
+             127:    7(fvec4) CompositeConstruct 124 125 126 32
+             128:    7(fvec4) FAdd 84 127
+                              Store 86(@entryPointOutput) 128
+                              Return
+                              FunctionEnd
diff --git a/Test/baseLegalResults/hlsl.partialFlattenMixed.vert.out b/Test/baseLegalResults/hlsl.partialFlattenMixed.vert.out
new file mode 100644
index 0000000..e54fb7e
--- /dev/null
+++ b/Test/baseLegalResults/hlsl.partialFlattenMixed.vert.out
@@ -0,0 +1,29 @@
+hlsl.partialFlattenMixed.vert
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 36
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Vertex 4  "main" 32 35
+                              Source HLSL 500
+                              Name 4  "main"
+                              Name 32  "pos"
+                              Name 35  "@entryPointOutput"
+                              Decorate 32(pos) Location 0
+                              Decorate 35(@entryPointOutput) BuiltIn Position
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+              31:             TypePointer Input 7(fvec4)
+         32(pos):     31(ptr) Variable Input
+              34:             TypePointer Output 7(fvec4)
+35(@entryPointOutput):     34(ptr) Variable Output
+         4(main):           2 Function None 3
+               5:             Label
+              33:    7(fvec4) Load 32(pos)
+                              Store 35(@entryPointOutput) 33
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/100.frag.out b/Test/baseResults/100.frag.out
index 3464dcb..5e702e8 100644
--- a/Test/baseResults/100.frag.out
+++ b/Test/baseResults/100.frag.out
@@ -395,7 +395,7 @@
 0:?     'v' ( smooth in 3-element array of mediump 4-component vector of float)
 0:?     'f' ( invariant global mediump float)
 0:?     'anon@0' (layout( column_major shared) uniform block{layout( column_major shared) uniform mediump int x})
-0:?     'fa' ( global implicitly-sized array of mediump float)
+0:?     'fa' ( global unsized 1-element array of mediump float)
 0:?     'f13' ( invariant global mediump float)
 0:?     'fi' ( invariant temp mediump float)
 0:?     'av' ( invariant smooth in mediump 4-component vector of float)
diff --git a/Test/baseResults/100samplerExternal.frag.out b/Test/baseResults/100samplerExternal.frag.out
new file mode 100644
index 0000000..8b689c7
--- /dev/null
+++ b/Test/baseResults/100samplerExternal.frag.out
@@ -0,0 +1,172 @@
+100samplerExternal.frag
+ERROR: 0:20: 'textureSize' : no matching overloaded function found 
+ERROR: 0:21: 'texture' : no matching overloaded function found 
+ERROR: 0:22: 'texture' : no matching overloaded function found 
+ERROR: 0:23: 'textureProj' : no matching overloaded function found 
+ERROR: 0:24: 'textureProj' : no matching overloaded function found 
+ERROR: 0:25: 'textureProj' : no matching overloaded function found 
+ERROR: 0:26: 'textureProj' : no matching overloaded function found 
+ERROR: 0:27: 'texelFetch' : no matching overloaded function found 
+ERROR: 0:29: 'texture3D' : no matching overloaded function found 
+ERROR: 0:30: 'texture2DProjLod' : no matching overloaded function found 
+ERROR: 0:31: 'texture' : no matching overloaded function found 
+ERROR: 0:32: 'textureProjLod' : no matching overloaded function found 
+ERROR: 0:38: 'samplerExternalOES' : required extension not requested: GL_OES_EGL_image_external
+ERROR: 0:41: '' :  syntax error, unexpected IDENTIFIER, expecting LEFT_BRACE or COMMA or SEMICOLON
+ERROR: 14 compilation errors.  No code generated.
+
+
+Shader version: 100
+Requested GL_OES_EGL_image_external
+Requested GL_OES_EGL_image_external_essl3
+ERROR: node is still EOpNull!
+0:10  Function Definition: main( ( global void)
+0:10    Function Parameters: 
+0:12    Sequence
+0:12      texture ( global lowp 4-component vector of float)
+0:12        'sExt' ( uniform lowp samplerExternalOES)
+0:12        Constant:
+0:12          0.200000
+0:12          0.200000
+0:13      texture ( global mediump 4-component vector of float)
+0:13        'mediumExt' ( uniform mediump samplerExternalOES)
+0:13        Constant:
+0:13          0.200000
+0:13          0.200000
+0:14      texture ( global highp 4-component vector of float)
+0:14        'highExt' ( uniform highp samplerExternalOES)
+0:14        Constant:
+0:14          0.200000
+0:14          0.200000
+0:15      textureProj ( global lowp 4-component vector of float)
+0:15        'sExt' ( uniform lowp samplerExternalOES)
+0:15        Constant:
+0:15          0.300000
+0:15          0.300000
+0:15          0.300000
+0:16      textureProj ( global lowp 4-component vector of float)
+0:16        'sExt' ( uniform lowp samplerExternalOES)
+0:16        Constant:
+0:16          0.300000
+0:16          0.300000
+0:16          0.300000
+0:16          0.300000
+0:18      Sequence
+0:18        move second child to first child ( temp mediump int)
+0:18          'lod' ( temp mediump int)
+0:18          Constant:
+0:18            0 (const int)
+0:19      Sequence
+0:19        move second child to first child ( temp highp float)
+0:19          'bias' ( temp highp float)
+0:19          Constant:
+0:19            0.010000
+0:20      Constant:
+0:20        0.000000
+0:21      Constant:
+0:21        0.000000
+0:22      Constant:
+0:22        0.000000
+0:23      Constant:
+0:23        0.000000
+0:24      Constant:
+0:24        0.000000
+0:25      Constant:
+0:25        0.000000
+0:26      Constant:
+0:26        0.000000
+0:27      Constant:
+0:27        0.000000
+0:29      Constant:
+0:29        0.000000
+0:30      Constant:
+0:30        0.000000
+0:31      Constant:
+0:31        0.000000
+0:32      Constant:
+0:32        0.000000
+0:?   Linker Objects
+0:?     'sExt' ( uniform lowp samplerExternalOES)
+0:?     'mediumExt' ( uniform mediump samplerExternalOES)
+0:?     'highExt' ( uniform highp samplerExternalOES)
+0:?     'badExt' ( uniform mediump samplerExternalOES)
+
+
+Linked fragment stage:
+
+
+Shader version: 100
+Requested GL_OES_EGL_image_external
+Requested GL_OES_EGL_image_external_essl3
+ERROR: node is still EOpNull!
+0:10  Function Definition: main( ( global void)
+0:10    Function Parameters: 
+0:12    Sequence
+0:12      texture ( global lowp 4-component vector of float)
+0:12        'sExt' ( uniform lowp samplerExternalOES)
+0:12        Constant:
+0:12          0.200000
+0:12          0.200000
+0:13      texture ( global mediump 4-component vector of float)
+0:13        'mediumExt' ( uniform mediump samplerExternalOES)
+0:13        Constant:
+0:13          0.200000
+0:13          0.200000
+0:14      texture ( global highp 4-component vector of float)
+0:14        'highExt' ( uniform highp samplerExternalOES)
+0:14        Constant:
+0:14          0.200000
+0:14          0.200000
+0:15      textureProj ( global lowp 4-component vector of float)
+0:15        'sExt' ( uniform lowp samplerExternalOES)
+0:15        Constant:
+0:15          0.300000
+0:15          0.300000
+0:15          0.300000
+0:16      textureProj ( global lowp 4-component vector of float)
+0:16        'sExt' ( uniform lowp samplerExternalOES)
+0:16        Constant:
+0:16          0.300000
+0:16          0.300000
+0:16          0.300000
+0:16          0.300000
+0:18      Sequence
+0:18        move second child to first child ( temp mediump int)
+0:18          'lod' ( temp mediump int)
+0:18          Constant:
+0:18            0 (const int)
+0:19      Sequence
+0:19        move second child to first child ( temp highp float)
+0:19          'bias' ( temp highp float)
+0:19          Constant:
+0:19            0.010000
+0:20      Constant:
+0:20        0.000000
+0:21      Constant:
+0:21        0.000000
+0:22      Constant:
+0:22        0.000000
+0:23      Constant:
+0:23        0.000000
+0:24      Constant:
+0:24        0.000000
+0:25      Constant:
+0:25        0.000000
+0:26      Constant:
+0:26        0.000000
+0:27      Constant:
+0:27        0.000000
+0:29      Constant:
+0:29        0.000000
+0:30      Constant:
+0:30        0.000000
+0:31      Constant:
+0:31        0.000000
+0:32      Constant:
+0:32        0.000000
+0:?   Linker Objects
+0:?     'sExt' ( uniform lowp samplerExternalOES)
+0:?     'mediumExt' ( uniform mediump samplerExternalOES)
+0:?     'highExt' ( uniform highp samplerExternalOES)
+0:?     'badExt' ( uniform mediump samplerExternalOES)
+
diff --git a/Test/baseResults/110scope.vert.out b/Test/baseResults/110scope.vert.out
index a07de4f..e23d3c0 100644
--- a/Test/baseResults/110scope.vert.out
+++ b/Test/baseResults/110scope.vert.out
@@ -2,7 +2,8 @@
 ERROR: 0:5: 'a' : redefinition 
 ERROR: 0:57: 'z' : undeclared identifier 
 ERROR: 0:57: 'z' : redefinition 
-ERROR: 3 compilation errors.  No code generated.
+ERROR: 0:83: 'S' : redefinition struct
+ERROR: 4 compilation errors.  No code generated.
 
 
 Shader version: 110
@@ -120,6 +121,21 @@
 0:69            0 (const int)
 0:73      Constant:
 0:73        183.346494
+0:?       Sequence
+0:77        move second child to first child ( temp int)
+0:77          x: direct index for structure ( temp int)
+0:77            's' ( temp structure{ temp int x})
+0:77            Constant:
+0:77              0 (const int)
+0:77          Constant:
+0:77            3 (const int)
+0:82        move second child to first child ( temp bool)
+0:82          b: direct index for structure ( temp bool)
+0:82            't' ( temp structure{ temp bool b})
+0:82            Constant:
+0:82              0 (const int)
+0:82          Constant:
+0:82            true (const bool)
 0:?   Linker Objects
 0:?     'b' ( global bool)
 0:?     'c' ( global bool)
@@ -236,6 +252,21 @@
 0:69            0 (const int)
 0:73      Constant:
 0:73        183.346494
+0:?       Sequence
+0:77        move second child to first child ( temp int)
+0:77          x: direct index for structure ( temp int)
+0:77            's' ( temp structure{ temp int x})
+0:77            Constant:
+0:77              0 (const int)
+0:77          Constant:
+0:77            3 (const int)
+0:82        move second child to first child ( temp bool)
+0:82          b: direct index for structure ( temp bool)
+0:82            't' ( temp structure{ temp bool b})
+0:82            Constant:
+0:82              0 (const int)
+0:82          Constant:
+0:82            true (const bool)
 0:?   Linker Objects
 0:?     'b' ( global bool)
 0:?     'c' ( global bool)
diff --git a/Test/baseResults/120.frag.out b/Test/baseResults/120.frag.out
index b516724..835cd9e 100644
--- a/Test/baseResults/120.frag.out
+++ b/Test/baseResults/120.frag.out
@@ -19,7 +19,7 @@
 ERROR: 0:83: 'xyxyx' : vector swizzle too long 
 ERROR: 0:84: 'z' : vector swizzle selection out of range 
 ERROR: 0:85: 'assign' :  l-value required 
-ERROR: 0:91: 'int' : overloaded functions must have the same return type 
+ERROR: 0:91: 'main' : overloaded functions must have the same return type 
 ERROR: 0:91: 'main' : function already has a body 
 ERROR: 0:91: 'int' :  entry point cannot return a value
 ERROR: 0:92: 'main' : function cannot take any parameter(s) 
@@ -52,8 +52,12 @@
 ERROR: 0:212: 'sampler2DRect' : Reserved word. 
 ERROR: 0:244: ':' :  wrong operand types: no operation ':' exists that takes a left-hand operand of type ' global void' and a right operand of type ' const int' (or there is no acceptable conversion)
 ERROR: 0:245: ':' :  wrong operand types: no operation ':' exists that takes a left-hand operand of type ' const int' and a right operand of type ' global void' (or there is no acceptable conversion)
+ERROR: 0:248: 'half floating-point suffix' : required extension not requested: Possible extensions include:
+GL_AMD_gpu_shader_half_float
+GL_EXT_shader_explicit_arithmetic_types
+GL_EXT_shader_explicit_arithmetic_types_float16
 ERROR: 0:248: '' :  syntax error, unexpected IDENTIFIER, expecting COMMA or SEMICOLON
-ERROR: 54 compilation errors.  No code generated.
+ERROR: 55 compilation errors.  No code generated.
 
 
 Shader version: 120
diff --git a/Test/baseResults/120.vert.out b/Test/baseResults/120.vert.out
index c89be98..5a91ed6 100644
--- a/Test/baseResults/120.vert.out
+++ b/Test/baseResults/120.vert.out
@@ -19,6 +19,7 @@
 ERROR: 0:35: 'arrays of arrays' : not supported with this profile: none
 ERROR: 0:36: 'arrays of arrays' : not supported with this profile: none
 ERROR: 0:37: 'arrays of arrays' : not supported with this profile: none
+ERROR: 0:37: 'arrays of arrays' : not supported with this profile: none
 ERROR: 0:38: 'arrays of arrays' : not supported with this profile: none
 ERROR: 0:39: 'arrays of arrays' : not supported with this profile: none
 ERROR: 0:40: 'arrays of arrays' : not supported with this profile: none
@@ -34,7 +35,7 @@
 ERROR: 0:52: 'arrays of arrays' : not supported with this profile: none
 ERROR: 0:53: 'arrays of arrays' : not supported with this profile: none
 ERROR: 0:56: 'out' : overloaded functions must have the same parameter storage qualifiers for argument 1
-ERROR: 0:57: 'float' : overloaded functions must have the same return type 
+ERROR: 0:57: 'overloadA' : overloaded functions must have the same return type 
 ERROR: 0:87: 'overloadC' : no matching overloaded function found 
 ERROR: 0:90: 'overloadC' : no matching overloaded function found 
 ERROR: 0:95: 'overloadD' : ambiguous function signature match: multiple signatures match under implicit type conversion 
@@ -78,7 +79,7 @@
 ERROR: 0:195: 'gl_ModelViewMatrix' : identifiers starting with "gl_" are reserved 
 ERROR: 0:200: 'token pasting (##)' : not supported for this version or the enabled extensions 
 ERROR: 0:203: 'token pasting (##)' : not supported for this version or the enabled extensions 
-ERROR: 79 compilation errors.  No code generated.
+ERROR: 80 compilation errors.  No code generated.
 
 
 Shader version: 120
diff --git a/Test/baseResults/130.frag.out b/Test/baseResults/130.frag.out
index c1c479a..81d055b 100644
--- a/Test/baseResults/130.frag.out
+++ b/Test/baseResults/130.frag.out
@@ -49,7 +49,7 @@
 0:18        move second child to first child ( temp float)
 0:18          'clip' ( temp float)
 0:18          direct index ( smooth temp float ClipDistance)
-0:18            'gl_ClipDistance' ( smooth in implicitly-sized array of float ClipDistance)
+0:18            'gl_ClipDistance' ( smooth in unsized 4-element array of float ClipDistance)
 0:18            Constant:
 0:18              3 (const int)
 0:23  Function Definition: foo( ( global void)
@@ -381,7 +381,7 @@
 0:?     'fflat' ( flat in float)
 0:?     'fsmooth' ( smooth in float)
 0:?     'fnop' ( noperspective in float)
-0:?     'gl_ClipDistance' ( smooth in implicitly-sized array of float ClipDistance)
+0:?     'gl_ClipDistance' ( smooth in unsized 4-element array of float ClipDistance)
 0:?     'sampC' ( uniform samplerCube)
 0:?     'gl_Color' ( in 4-component vector of float Color)
 0:?     'samp2D' ( uniform sampler2D)
diff --git a/Test/baseResults/130.vert.out b/Test/baseResults/130.vert.out
index 7ec82ad..e38043c 100644
--- a/Test/baseResults/130.vert.out
+++ b/Test/baseResults/130.vert.out
@@ -113,7 +113,7 @@
 0:45          'gl_VertexID' ( gl_VertexId int VertexId)
 0:46      move second child to first child ( temp float)
 0:46        direct index ( smooth temp float ClipDistance)
-0:46          'gl_ClipDistance' ( smooth out implicitly-sized array of float ClipDistance)
+0:46          'gl_ClipDistance' ( smooth out unsized 2-element array of float ClipDistance)
 0:46          Constant:
 0:46            1 (const int)
 0:46        Constant:
@@ -132,7 +132,7 @@
 0:66        'gl_DepthRange' ( uniform structure{ global float near,  global float far,  global float diff})
 0:66        Constant:
 0:66          1 (const int)
-0:67      'gl_TexCoord' ( smooth out implicitly-sized array of 4-component vector of float TexCoord)
+0:67      'gl_TexCoord' ( smooth out unsized 1-element array of 4-component vector of float TexCoord)
 0:68      'gl_FogFragCoord' ( smooth out float FogFragCoord)
 0:69      'gl_FrontColor' ( smooth out 4-component vector of float FrontColor)
 0:?   Linker Objects
@@ -145,8 +145,8 @@
 0:?     'c3D' ( in 3-component vector of float)
 0:?     'c4D' ( smooth temp 4-component vector of float)
 0:?     'v4' ( uniform 4-component vector of float)
-0:?     'gl_ClipDistance' ( smooth out implicitly-sized array of float ClipDistance)
-0:?     'gl_TexCoord' ( smooth out implicitly-sized array of 4-component vector of float TexCoord)
+0:?     'gl_ClipDistance' ( smooth out unsized 2-element array of float ClipDistance)
+0:?     'gl_TexCoord' ( smooth out unsized 1-element array of 4-component vector of float TexCoord)
 0:?     'abcdef' ( global int)
 0:?     'qrstuv' ( global int)
 0:?     'gl_VertexID' ( gl_VertexId int VertexId)
diff --git a/Test/baseResults/140.vert.out b/Test/baseResults/140.vert.out
index 975c932..020afd0 100644
--- a/Test/baseResults/140.vert.out
+++ b/Test/baseResults/140.vert.out
@@ -52,7 +52,7 @@
 0:17        'gl_DepthRange' ( uniform structure{ global float near,  global float far,  global float diff})
 0:17        Constant:
 0:17          1 (const int)
-0:18      'gl_TexCoord' ( smooth out implicitly-sized array of 4-component vector of float TexCoord)
+0:18      'gl_TexCoord' ( smooth out unsized 1-element array of 4-component vector of float TexCoord)
 0:19      'gl_FogFragCoord' ( smooth out float FogFragCoord)
 0:20      'gl_FrontColor' ( smooth out 4-component vector of float FrontColor)
 0:48  Function Definition: foo( ( global void)
@@ -133,7 +133,7 @@
 0:?   Linker Objects
 0:?     'sbuf' ( uniform isamplerBuffer)
 0:?     'anon@0' (layout( column_major std140) uniform block{layout( column_major std140 offset=0) uniform int anonMem})
-0:?     'gl_TexCoord' ( smooth out implicitly-sized array of 4-component vector of float TexCoord)
+0:?     'gl_TexCoord' ( smooth out unsized 1-element array of 4-component vector of float TexCoord)
 0:?     'gl_Position' ( smooth out 4-component vector of float)
 0:?     'locBad' (layout( location=9) in 4-component vector of float)
 0:?     'loc' (layout( location=9) in 4-component vector of float)
diff --git a/Test/baseResults/150.geom.out b/Test/baseResults/150.geom.out
index e3a78c9..92b8e1a 100644
--- a/Test/baseResults/150.geom.out
+++ b/Test/baseResults/150.geom.out
@@ -67,16 +67,16 @@
 0:32            0 (const int)
 0:33      move second child to first child ( temp float)
 0:33        direct index (layout( stream=0) temp float ClipDistance)
-0:33          gl_ClipDistance: direct index for structure (layout( stream=0) out implicitly-sized array of float ClipDistance)
-0:33            'anon@1' (layout( stream=0) out block{layout( stream=0) gl_Position 4-component vector of float Position gl_Position, layout( stream=0) gl_PointSize float PointSize gl_PointSize, layout( stream=0) out implicitly-sized array of float ClipDistance gl_ClipDistance})
+0:33          gl_ClipDistance: direct index for structure (layout( stream=0) out unsized 4-element array of float ClipDistance)
+0:33            'anon@1' (layout( stream=0) out block{layout( stream=0) gl_Position 4-component vector of float Position gl_Position, layout( stream=0) gl_PointSize float PointSize gl_PointSize, layout( stream=0) out unsized 4-element array of float ClipDistance gl_ClipDistance})
 0:33            Constant:
 0:33              2 (const uint)
 0:33          Constant:
 0:33            3 (const int)
 0:33        direct index ( temp float ClipDistance)
-0:33          gl_ClipDistance: direct index for structure ( in implicitly-sized array of float ClipDistance)
-0:33            direct index ( temp block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in implicitly-sized array of float ClipDistance gl_ClipDistance})
-0:33              'gl_in' ( in 4-element array of block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in implicitly-sized array of float ClipDistance gl_ClipDistance})
+0:33          gl_ClipDistance: direct index for structure ( in unsized 3-element array of float ClipDistance)
+0:33            direct index ( temp block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in unsized 3-element array of float ClipDistance gl_ClipDistance})
+0:33              'gl_in' ( in 4-element array of block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in unsized 3-element array of float ClipDistance gl_ClipDistance})
 0:33              Constant:
 0:33                1 (const int)
 0:33            Constant:
@@ -85,24 +85,24 @@
 0:33            2 (const int)
 0:34      move second child to first child ( temp 4-component vector of float)
 0:34        gl_Position: direct index for structure (layout( stream=0) gl_Position 4-component vector of float Position)
-0:34          'anon@1' (layout( stream=0) out block{layout( stream=0) gl_Position 4-component vector of float Position gl_Position, layout( stream=0) gl_PointSize float PointSize gl_PointSize, layout( stream=0) out implicitly-sized array of float ClipDistance gl_ClipDistance})
+0:34          'anon@1' (layout( stream=0) out block{layout( stream=0) gl_Position 4-component vector of float Position gl_Position, layout( stream=0) gl_PointSize float PointSize gl_PointSize, layout( stream=0) out unsized 4-element array of float ClipDistance gl_ClipDistance})
 0:34          Constant:
 0:34            0 (const uint)
 0:34        gl_Position: direct index for structure ( in 4-component vector of float Position)
-0:34          direct index ( temp block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in implicitly-sized array of float ClipDistance gl_ClipDistance})
-0:34            'gl_in' ( in 4-element array of block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in implicitly-sized array of float ClipDistance gl_ClipDistance})
+0:34          direct index ( temp block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in unsized 3-element array of float ClipDistance gl_ClipDistance})
+0:34            'gl_in' ( in 4-element array of block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in unsized 3-element array of float ClipDistance gl_ClipDistance})
 0:34            Constant:
 0:34              0 (const int)
 0:34          Constant:
 0:34            0 (const int)
 0:35      move second child to first child ( temp float)
 0:35        gl_PointSize: direct index for structure (layout( stream=0) gl_PointSize float PointSize)
-0:35          'anon@1' (layout( stream=0) out block{layout( stream=0) gl_Position 4-component vector of float Position gl_Position, layout( stream=0) gl_PointSize float PointSize gl_PointSize, layout( stream=0) out implicitly-sized array of float ClipDistance gl_ClipDistance})
+0:35          'anon@1' (layout( stream=0) out block{layout( stream=0) gl_Position 4-component vector of float Position gl_Position, layout( stream=0) gl_PointSize float PointSize gl_PointSize, layout( stream=0) out unsized 4-element array of float ClipDistance gl_ClipDistance})
 0:35          Constant:
 0:35            1 (const uint)
 0:35        gl_PointSize: direct index for structure ( in float PointSize)
-0:35          direct index ( temp block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in implicitly-sized array of float ClipDistance gl_ClipDistance})
-0:35            'gl_in' ( in 4-element array of block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in implicitly-sized array of float ClipDistance gl_ClipDistance})
+0:35          direct index ( temp block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in unsized 3-element array of float ClipDistance gl_ClipDistance})
+0:35            'gl_in' ( in 4-element array of block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in unsized 3-element array of float ClipDistance gl_ClipDistance})
 0:35            Constant:
 0:35              3 (const int)
 0:35          Constant:
@@ -151,8 +151,8 @@
 0:?     'fromV' ( in 4-element array of block{ in 3-component vector of float color})
 0:?     'toF' (layout( stream=0) out block{layout( stream=0) out 3-component vector of float color})
 0:?     'anon@0' (layout( stream=0) out block{layout( stream=0) out 3-component vector of float color})
-0:?     'anon@1' (layout( stream=0) out block{layout( stream=0) gl_Position 4-component vector of float Position gl_Position, layout( stream=0) gl_PointSize float PointSize gl_PointSize, layout( stream=0) out implicitly-sized array of float ClipDistance gl_ClipDistance})
-0:?     'gl_in' ( in 4-element array of block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in implicitly-sized array of float ClipDistance gl_ClipDistance})
+0:?     'anon@1' (layout( stream=0) out block{layout( stream=0) gl_Position 4-component vector of float Position gl_Position, layout( stream=0) gl_PointSize float PointSize gl_PointSize, layout( stream=0) out unsized 4-element array of float ClipDistance gl_ClipDistance})
+0:?     'gl_in' ( in 4-element array of block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in unsized 3-element array of float ClipDistance gl_ClipDistance})
 0:?     'ov0' (layout( stream=0) out 4-component vector of float)
 0:?     'ov4' (layout( stream=4) out 4-component vector of float)
 0:?     'o1v0' (layout( stream=0) out 4-component vector of float)
diff --git a/Test/baseResults/150.tesc.out b/Test/baseResults/150.tesc.out
index 526b6e7..8922026 100644
--- a/Test/baseResults/150.tesc.out
+++ b/Test/baseResults/150.tesc.out
@@ -16,8 +16,8 @@
 0:20        move second child to first child ( temp 4-component vector of float)
 0:20          'p' ( temp 4-component vector of float)
 0:20          gl_Position: direct index for structure ( in 4-component vector of float Position)
-0:20            direct index ( temp block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in implicitly-sized array of float ClipDistance gl_ClipDistance})
-0:20              'gl_in' ( in 32-element array of block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in implicitly-sized array of float ClipDistance gl_ClipDistance})
+0:20            direct index ( temp block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in unsized 3-element array of float ClipDistance gl_ClipDistance})
+0:20              'gl_in' ( in 32-element array of block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in unsized 3-element array of float ClipDistance gl_ClipDistance})
 0:20              Constant:
 0:20                1 (const int)
 0:20            Constant:
@@ -26,8 +26,8 @@
 0:21        move second child to first child ( temp float)
 0:21          'ps' ( temp float)
 0:21          gl_PointSize: direct index for structure ( in float PointSize)
-0:21            direct index ( temp block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in implicitly-sized array of float ClipDistance gl_ClipDistance})
-0:21              'gl_in' ( in 32-element array of block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in implicitly-sized array of float ClipDistance gl_ClipDistance})
+0:21            direct index ( temp block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in unsized 3-element array of float ClipDistance gl_ClipDistance})
+0:21              'gl_in' ( in 32-element array of block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in unsized 3-element array of float ClipDistance gl_ClipDistance})
 0:21              Constant:
 0:21                1 (const int)
 0:21            Constant:
@@ -36,9 +36,9 @@
 0:22        move second child to first child ( temp float)
 0:22          'cd' ( temp float)
 0:22          direct index ( temp float ClipDistance)
-0:22            gl_ClipDistance: direct index for structure ( in implicitly-sized array of float ClipDistance)
-0:22              direct index ( temp block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in implicitly-sized array of float ClipDistance gl_ClipDistance})
-0:22                'gl_in' ( in 32-element array of block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in implicitly-sized array of float ClipDistance gl_ClipDistance})
+0:22            gl_ClipDistance: direct index for structure ( in unsized 3-element array of float ClipDistance)
+0:22              direct index ( temp block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in unsized 3-element array of float ClipDistance gl_ClipDistance})
+0:22                'gl_in' ( in 32-element array of block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in unsized 3-element array of float ClipDistance gl_ClipDistance})
 0:22                Constant:
 0:22                  1 (const int)
 0:22              Constant:
@@ -59,25 +59,25 @@
 0:26          'gl_InvocationID' ( in int InvocationID)
 0:28      move second child to first child ( temp 4-component vector of float)
 0:28        gl_Position: direct index for structure ( out 4-component vector of float Position)
-0:28          indirect index ( temp block{ out 4-component vector of float Position gl_Position,  out float PointSize gl_PointSize,  out implicitly-sized array of float ClipDistance gl_ClipDistance})
-0:28            'gl_out' ( out 4-element array of block{ out 4-component vector of float Position gl_Position,  out float PointSize gl_PointSize,  out implicitly-sized array of float ClipDistance gl_ClipDistance})
+0:28          indirect index ( temp block{ out 4-component vector of float Position gl_Position,  out float PointSize gl_PointSize,  out unsized 2-element array of float ClipDistance gl_ClipDistance})
+0:28            'gl_out' ( out 4-element array of block{ out 4-component vector of float Position gl_Position,  out float PointSize gl_PointSize,  out unsized 2-element array of float ClipDistance gl_ClipDistance})
 0:28            'gl_InvocationID' ( in int InvocationID)
 0:28          Constant:
 0:28            0 (const int)
 0:28        'p' ( temp 4-component vector of float)
 0:29      move second child to first child ( temp float)
 0:29        gl_PointSize: direct index for structure ( out float PointSize)
-0:29          indirect index ( temp block{ out 4-component vector of float Position gl_Position,  out float PointSize gl_PointSize,  out implicitly-sized array of float ClipDistance gl_ClipDistance})
-0:29            'gl_out' ( out 4-element array of block{ out 4-component vector of float Position gl_Position,  out float PointSize gl_PointSize,  out implicitly-sized array of float ClipDistance gl_ClipDistance})
+0:29          indirect index ( temp block{ out 4-component vector of float Position gl_Position,  out float PointSize gl_PointSize,  out unsized 2-element array of float ClipDistance gl_ClipDistance})
+0:29            'gl_out' ( out 4-element array of block{ out 4-component vector of float Position gl_Position,  out float PointSize gl_PointSize,  out unsized 2-element array of float ClipDistance gl_ClipDistance})
 0:29            'gl_InvocationID' ( in int InvocationID)
 0:29          Constant:
 0:29            1 (const int)
 0:29        'ps' ( temp float)
 0:30      move second child to first child ( temp float)
 0:30        direct index ( temp float ClipDistance)
-0:30          gl_ClipDistance: direct index for structure ( out implicitly-sized array of float ClipDistance)
-0:30            indirect index ( temp block{ out 4-component vector of float Position gl_Position,  out float PointSize gl_PointSize,  out implicitly-sized array of float ClipDistance gl_ClipDistance})
-0:30              'gl_out' ( out 4-element array of block{ out 4-component vector of float Position gl_Position,  out float PointSize gl_PointSize,  out implicitly-sized array of float ClipDistance gl_ClipDistance})
+0:30          gl_ClipDistance: direct index for structure ( out unsized 2-element array of float ClipDistance)
+0:30            indirect index ( temp block{ out 4-component vector of float Position gl_Position,  out float PointSize gl_PointSize,  out unsized 2-element array of float ClipDistance gl_ClipDistance})
+0:30              'gl_out' ( out 4-element array of block{ out 4-component vector of float Position gl_Position,  out float PointSize gl_PointSize,  out unsized 2-element array of float ClipDistance gl_ClipDistance})
 0:30              'gl_InvocationID' ( in int InvocationID)
 0:30            Constant:
 0:30              2 (const int)
@@ -99,7 +99,7 @@
 0:33        Constant:
 0:33          1.300000
 0:?   Linker Objects
-0:?     'gl_out' ( out 4-element array of block{ out 4-component vector of float Position gl_Position,  out float PointSize gl_PointSize,  out implicitly-sized array of float ClipDistance gl_ClipDistance})
+0:?     'gl_out' ( out 4-element array of block{ out 4-component vector of float Position gl_Position,  out float PointSize gl_PointSize,  out unsized 2-element array of float ClipDistance gl_ClipDistance})
 0:?     'outa' ( global 4-element array of int)
 0:?     'patchOut' ( patch out 4-component vector of float)
 
@@ -129,8 +129,8 @@
 0:22        move second child to first child ( temp 4-component vector of float)
 0:22          'p' ( temp 4-component vector of float)
 0:22          gl_Position: direct index for structure ( in 4-component vector of float Position)
-0:22            direct index ( temp block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in implicitly-sized array of float ClipDistance gl_ClipDistance})
-0:22              'gl_in' ( in 32-element array of block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in implicitly-sized array of float ClipDistance gl_ClipDistance})
+0:22            direct index ( temp block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in unsized 3-element array of float ClipDistance gl_ClipDistance})
+0:22              'gl_in' ( in 32-element array of block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in unsized 3-element array of float ClipDistance gl_ClipDistance})
 0:22              Constant:
 0:22                1 (const int)
 0:22            Constant:
@@ -139,8 +139,8 @@
 0:23        move second child to first child ( temp float)
 0:23          'ps' ( temp float)
 0:23          gl_PointSize: direct index for structure ( in float PointSize)
-0:23            direct index ( temp block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in implicitly-sized array of float ClipDistance gl_ClipDistance})
-0:23              'gl_in' ( in 32-element array of block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in implicitly-sized array of float ClipDistance gl_ClipDistance})
+0:23            direct index ( temp block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in unsized 3-element array of float ClipDistance gl_ClipDistance})
+0:23              'gl_in' ( in 32-element array of block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in unsized 3-element array of float ClipDistance gl_ClipDistance})
 0:23              Constant:
 0:23                1 (const int)
 0:23            Constant:
@@ -149,9 +149,9 @@
 0:24        move second child to first child ( temp float)
 0:24          'cd' ( temp float)
 0:24          direct index ( temp float ClipDistance)
-0:24            gl_ClipDistance: direct index for structure ( in implicitly-sized array of float ClipDistance)
-0:24              direct index ( temp block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in implicitly-sized array of float ClipDistance gl_ClipDistance})
-0:24                'gl_in' ( in 32-element array of block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in implicitly-sized array of float ClipDistance gl_ClipDistance})
+0:24            gl_ClipDistance: direct index for structure ( in unsized 3-element array of float ClipDistance)
+0:24              direct index ( temp block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in unsized 3-element array of float ClipDistance gl_ClipDistance})
+0:24                'gl_in' ( in 32-element array of block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in unsized 3-element array of float ClipDistance gl_ClipDistance})
 0:24                Constant:
 0:24                  1 (const int)
 0:24              Constant:
@@ -186,20 +186,20 @@
 0:30              1 (const int)
 0:32      move second child to first child ( temp 4-component vector of float)
 0:32        gl_Position: direct index for structure ( gl_Position 4-component vector of float Position)
-0:32          'anon@0' ( out block{ gl_Position 4-component vector of float Position gl_Position,  gl_PointSize float PointSize gl_PointSize,  out implicitly-sized array of float ClipDistance gl_ClipDistance})
+0:32          'anon@0' ( out block{ gl_Position 4-component vector of float Position gl_Position,  gl_PointSize float PointSize gl_PointSize,  out unsized 3-element array of float ClipDistance gl_ClipDistance})
 0:32          Constant:
 0:32            0 (const uint)
 0:32        'p' ( temp 4-component vector of float)
 0:33      move second child to first child ( temp float)
 0:33        gl_PointSize: direct index for structure ( gl_PointSize float PointSize)
-0:33          'anon@0' ( out block{ gl_Position 4-component vector of float Position gl_Position,  gl_PointSize float PointSize gl_PointSize,  out implicitly-sized array of float ClipDistance gl_ClipDistance})
+0:33          'anon@0' ( out block{ gl_Position 4-component vector of float Position gl_Position,  gl_PointSize float PointSize gl_PointSize,  out unsized 3-element array of float ClipDistance gl_ClipDistance})
 0:33          Constant:
 0:33            1 (const uint)
 0:33        'ps' ( temp float)
 0:34      move second child to first child ( temp float)
 0:34        direct index ( temp float ClipDistance)
-0:34          gl_ClipDistance: direct index for structure ( out implicitly-sized array of float ClipDistance)
-0:34            'anon@0' ( out block{ gl_Position 4-component vector of float Position gl_Position,  gl_PointSize float PointSize gl_PointSize,  out implicitly-sized array of float ClipDistance gl_ClipDistance})
+0:34          gl_ClipDistance: direct index for structure ( out unsized 3-element array of float ClipDistance)
+0:34            'anon@0' ( out block{ gl_Position 4-component vector of float Position gl_Position,  gl_PointSize float PointSize gl_PointSize,  out unsized 3-element array of float ClipDistance gl_ClipDistance})
 0:34            Constant:
 0:34              2 (const uint)
 0:34          Constant:
@@ -207,10 +207,9 @@
 0:34        'cd' ( temp float)
 0:?   Linker Objects
 0:?     'patchIn' ( patch in 4-component vector of float)
-0:?     'anon@0' ( out block{ gl_Position 4-component vector of float Position gl_Position,  gl_PointSize float PointSize gl_PointSize,  out implicitly-sized array of float ClipDistance gl_ClipDistance})
+0:?     'anon@0' ( out block{ gl_Position 4-component vector of float Position gl_Position,  gl_PointSize float PointSize gl_PointSize,  out unsized 3-element array of float ClipDistance gl_ClipDistance})
 
 400.tesc
-Warning, version 400 is not yet complete; most version-specific features are present, but some are missing.
 ERROR: 0:6: 'quads' : unrecognized layout identifier, or qualifier requires assignment (e.g., binding = 4) 
 ERROR: 0:7: 'ccw' : unrecognized layout identifier, or qualifier requires assignment (e.g., binding = 4) 
 ERROR: 0:8: 'fractional_even_spacing' : unrecognized layout identifier, or qualifier requires assignment (e.g., binding = 4) 
@@ -256,8 +255,8 @@
 0:23        move second child to first child ( temp 4-component vector of float)
 0:23          'p' ( temp 4-component vector of float)
 0:23          gl_Position: direct index for structure ( in 4-component vector of float Position)
-0:23            direct index ( temp block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in implicitly-sized array of float ClipDistance gl_ClipDistance})
-0:23              'gl_in' ( in 32-element array of block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in implicitly-sized array of float ClipDistance gl_ClipDistance})
+0:23            direct index ( temp block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in unsized 3-element array of float ClipDistance gl_ClipDistance})
+0:23              'gl_in' ( in 32-element array of block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in unsized 3-element array of float ClipDistance gl_ClipDistance})
 0:23              Constant:
 0:23                1 (const int)
 0:23            Constant:
@@ -266,8 +265,8 @@
 0:24        move second child to first child ( temp float)
 0:24          'ps' ( temp float)
 0:24          gl_PointSize: direct index for structure ( in float PointSize)
-0:24            direct index ( temp block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in implicitly-sized array of float ClipDistance gl_ClipDistance})
-0:24              'gl_in' ( in 32-element array of block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in implicitly-sized array of float ClipDistance gl_ClipDistance})
+0:24            direct index ( temp block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in unsized 3-element array of float ClipDistance gl_ClipDistance})
+0:24              'gl_in' ( in 32-element array of block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in unsized 3-element array of float ClipDistance gl_ClipDistance})
 0:24              Constant:
 0:24                1 (const int)
 0:24            Constant:
@@ -276,9 +275,9 @@
 0:25        move second child to first child ( temp float)
 0:25          'cd' ( temp float)
 0:25          direct index ( temp float ClipDistance)
-0:25            gl_ClipDistance: direct index for structure ( in implicitly-sized array of float ClipDistance)
-0:25              direct index ( temp block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in implicitly-sized array of float ClipDistance gl_ClipDistance})
-0:25                'gl_in' ( in 32-element array of block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in implicitly-sized array of float ClipDistance gl_ClipDistance})
+0:25            gl_ClipDistance: direct index for structure ( in unsized 3-element array of float ClipDistance)
+0:25              direct index ( temp block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in unsized 3-element array of float ClipDistance gl_ClipDistance})
+0:25                'gl_in' ( in 32-element array of block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in unsized 3-element array of float ClipDistance gl_ClipDistance})
 0:25                Constant:
 0:25                  1 (const int)
 0:25              Constant:
@@ -299,25 +298,25 @@
 0:29          'gl_InvocationID' ( in int InvocationID)
 0:31      move second child to first child ( temp 4-component vector of float)
 0:31        gl_Position: direct index for structure ( out 4-component vector of float Position)
-0:31          indirect index ( temp block{ out 4-component vector of float Position gl_Position,  out float PointSize gl_PointSize,  out implicitly-sized array of float ClipDistance gl_ClipDistance})
-0:31            'gl_out' ( out 4-element array of block{ out 4-component vector of float Position gl_Position,  out float PointSize gl_PointSize,  out implicitly-sized array of float ClipDistance gl_ClipDistance})
+0:31          indirect index ( temp block{ out 4-component vector of float Position gl_Position,  out float PointSize gl_PointSize,  out unsized 2-element array of float ClipDistance gl_ClipDistance})
+0:31            'gl_out' ( out 4-element array of block{ out 4-component vector of float Position gl_Position,  out float PointSize gl_PointSize,  out unsized 2-element array of float ClipDistance gl_ClipDistance})
 0:31            'gl_InvocationID' ( in int InvocationID)
 0:31          Constant:
 0:31            0 (const int)
 0:31        'p' ( temp 4-component vector of float)
 0:32      move second child to first child ( temp float)
 0:32        gl_PointSize: direct index for structure ( out float PointSize)
-0:32          indirect index ( temp block{ out 4-component vector of float Position gl_Position,  out float PointSize gl_PointSize,  out implicitly-sized array of float ClipDistance gl_ClipDistance})
-0:32            'gl_out' ( out 4-element array of block{ out 4-component vector of float Position gl_Position,  out float PointSize gl_PointSize,  out implicitly-sized array of float ClipDistance gl_ClipDistance})
+0:32          indirect index ( temp block{ out 4-component vector of float Position gl_Position,  out float PointSize gl_PointSize,  out unsized 2-element array of float ClipDistance gl_ClipDistance})
+0:32            'gl_out' ( out 4-element array of block{ out 4-component vector of float Position gl_Position,  out float PointSize gl_PointSize,  out unsized 2-element array of float ClipDistance gl_ClipDistance})
 0:32            'gl_InvocationID' ( in int InvocationID)
 0:32          Constant:
 0:32            1 (const int)
 0:32        'ps' ( temp float)
 0:33      move second child to first child ( temp float)
 0:33        direct index ( temp float ClipDistance)
-0:33          gl_ClipDistance: direct index for structure ( out implicitly-sized array of float ClipDistance)
-0:33            indirect index ( temp block{ out 4-component vector of float Position gl_Position,  out float PointSize gl_PointSize,  out implicitly-sized array of float ClipDistance gl_ClipDistance})
-0:33              'gl_out' ( out 4-element array of block{ out 4-component vector of float Position gl_Position,  out float PointSize gl_PointSize,  out implicitly-sized array of float ClipDistance gl_ClipDistance})
+0:33          gl_ClipDistance: direct index for structure ( out unsized 2-element array of float ClipDistance)
+0:33            indirect index ( temp block{ out 4-component vector of float Position gl_Position,  out float PointSize gl_PointSize,  out unsized 2-element array of float ClipDistance gl_ClipDistance})
+0:33              'gl_out' ( out 4-element array of block{ out 4-component vector of float Position gl_Position,  out float PointSize gl_PointSize,  out unsized 2-element array of float ClipDistance gl_ClipDistance})
 0:33              'gl_InvocationID' ( in int InvocationID)
 0:33            Constant:
 0:33              2 (const int)
@@ -387,8 +386,8 @@
 0:67    Function Parameters: 
 0:69    Sequence
 0:69      gl_PointSize: direct index for structure ( out float PointSize)
-0:69        direct index ( temp block{ out 4-component vector of float Position gl_Position,  out float PointSize gl_PointSize,  out implicitly-sized array of float ClipDistance gl_ClipDistance})
-0:69          'gl_out' ( out 4-element array of block{ out 4-component vector of float Position gl_Position,  out float PointSize gl_PointSize,  out implicitly-sized array of float ClipDistance gl_ClipDistance})
+0:69        direct index ( temp block{ out 4-component vector of float Position gl_Position,  out float PointSize gl_PointSize,  out unsized 2-element array of float ClipDistance gl_ClipDistance})
+0:69          'gl_out' ( out 4-element array of block{ out 4-component vector of float Position gl_Position,  out float PointSize gl_PointSize,  out unsized 2-element array of float ClipDistance gl_ClipDistance})
 0:69          Constant:
 0:69            4 (const int)
 0:69        Constant:
@@ -423,7 +422,7 @@
 0:123      'gl_DeviceIndex' ( in int DeviceIndex)
 0:124      'gl_ViewIndex' ( in int ViewIndex)
 0:?   Linker Objects
-0:?     'gl_out' ( out 4-element array of block{ out 4-component vector of float Position gl_Position,  out float PointSize gl_PointSize,  out implicitly-sized array of float ClipDistance gl_ClipDistance})
+0:?     'gl_out' ( out 4-element array of block{ out 4-component vector of float Position gl_Position,  out float PointSize gl_PointSize,  out unsized 2-element array of float ClipDistance gl_ClipDistance})
 0:?     'outa' ( global 4-element array of int)
 0:?     'patchIn' ( patch in 4-component vector of float)
 0:?     'patchOut' ( patch out 4-component vector of float)
@@ -442,7 +441,6 @@
 0:?     'badOrder' ( invariant noContraction out 4-element array of 4-component vector of float)
 
 400.tese
-Warning, version 400 is not yet complete; most version-specific features are present, but some are missing.
 ERROR: 0:3: 'vertices' : there is no such layout identifier for this stage taking an assigned value 
 ERROR: 0:5: 'triangles' : cannot change previously set input primitive 
 ERROR: 0:6: 'isolines' : cannot change previously set input primitive 
@@ -455,7 +453,6 @@
 ERROR: 0:48: 'patch' : cannot use interpolation qualifiers with patch 
 ERROR: 0:49: 'patch' : cannot use interpolation qualifiers with patch 
 ERROR: 0:50: '' : can only have one auxiliary qualifier (centroid, patch, and sample) 
-ERROR: 0:54: 'gl_PerVertex' : block already declared with size, can't redeclare as implicitly-sized 
 ERROR: 0:59: 'gl_PerVertex' : can only redeclare a built-in block once, and before any use 
 ERROR: 0:64: 'quads' : cannot apply to 'out' 
 ERROR: 0:64: 'cw' : can only apply to 'in' 
@@ -475,7 +472,7 @@
 ERROR: 0:101: 'gl_TessLevelOuter' : identifiers starting with "gl_" are reserved 
 ERROR: 0:109: 'gl_DeviceIndex' : required extension not requested: GL_EXT_device_group
 ERROR: 0:110: 'gl_ViewIndex' : required extension not requested: GL_EXT_multiview
-ERROR: 32 compilation errors.  No code generated.
+ERROR: 31 compilation errors.  No code generated.
 
 
 Shader version: 400
@@ -501,8 +498,8 @@
 0:32        move second child to first child ( temp 4-component vector of float)
 0:32          'p' ( temp 4-component vector of float)
 0:32          gl_Position: direct index for structure ( in 4-component vector of float Position)
-0:32            direct index ( temp block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in implicitly-sized array of float ClipDistance gl_ClipDistance})
-0:32              'gl_in' ( in 32-element array of block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in implicitly-sized array of float ClipDistance gl_ClipDistance})
+0:32            direct index ( temp block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in unsized 3-element array of float ClipDistance gl_ClipDistance})
+0:32              'gl_in' ( in 32-element array of block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in unsized 3-element array of float ClipDistance gl_ClipDistance})
 0:32              Constant:
 0:32                1 (const int)
 0:32            Constant:
@@ -511,8 +508,8 @@
 0:33        move second child to first child ( temp float)
 0:33          'ps' ( temp float)
 0:33          gl_PointSize: direct index for structure ( in float PointSize)
-0:33            direct index ( temp block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in implicitly-sized array of float ClipDistance gl_ClipDistance})
-0:33              'gl_in' ( in 32-element array of block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in implicitly-sized array of float ClipDistance gl_ClipDistance})
+0:33            direct index ( temp block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in unsized 3-element array of float ClipDistance gl_ClipDistance})
+0:33              'gl_in' ( in 32-element array of block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in unsized 3-element array of float ClipDistance gl_ClipDistance})
 0:33              Constant:
 0:33                1 (const int)
 0:33            Constant:
@@ -521,9 +518,9 @@
 0:34        move second child to first child ( temp float)
 0:34          'cd' ( temp float)
 0:34          direct index ( temp float ClipDistance)
-0:34            gl_ClipDistance: direct index for structure ( in implicitly-sized array of float ClipDistance)
-0:34              direct index ( temp block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in implicitly-sized array of float ClipDistance gl_ClipDistance})
-0:34                'gl_in' ( in 32-element array of block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in implicitly-sized array of float ClipDistance gl_ClipDistance})
+0:34            gl_ClipDistance: direct index for structure ( in unsized 3-element array of float ClipDistance)
+0:34              direct index ( temp block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in unsized 3-element array of float ClipDistance gl_ClipDistance})
+0:34                'gl_in' ( in 32-element array of block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in unsized 3-element array of float ClipDistance gl_ClipDistance})
 0:34                Constant:
 0:34                  1 (const int)
 0:34              Constant:
@@ -558,20 +555,20 @@
 0:40              1 (const int)
 0:42      move second child to first child ( temp 4-component vector of float)
 0:42        gl_Position: direct index for structure ( gl_Position 4-component vector of float Position)
-0:42          'anon@0' ( out block{ gl_Position 4-component vector of float Position gl_Position,  gl_PointSize float PointSize gl_PointSize,  out implicitly-sized array of float ClipDistance gl_ClipDistance})
+0:42          'anon@0' ( out block{ gl_Position 4-component vector of float Position gl_Position,  gl_PointSize float PointSize gl_PointSize,  out unsized 3-element array of float ClipDistance gl_ClipDistance})
 0:42          Constant:
 0:42            0 (const uint)
 0:42        'p' ( temp 4-component vector of float)
 0:43      move second child to first child ( temp float)
 0:43        gl_PointSize: direct index for structure ( gl_PointSize float PointSize)
-0:43          'anon@0' ( out block{ gl_Position 4-component vector of float Position gl_Position,  gl_PointSize float PointSize gl_PointSize,  out implicitly-sized array of float ClipDistance gl_ClipDistance})
+0:43          'anon@0' ( out block{ gl_Position 4-component vector of float Position gl_Position,  gl_PointSize float PointSize gl_PointSize,  out unsized 3-element array of float ClipDistance gl_ClipDistance})
 0:43          Constant:
 0:43            1 (const uint)
 0:43        'ps' ( temp float)
 0:44      move second child to first child ( temp float)
 0:44        direct index ( temp float ClipDistance)
-0:44          gl_ClipDistance: direct index for structure ( out implicitly-sized array of float ClipDistance)
-0:44            'anon@0' ( out block{ gl_Position 4-component vector of float Position gl_Position,  gl_PointSize float PointSize gl_PointSize,  out implicitly-sized array of float ClipDistance gl_ClipDistance})
+0:44          gl_ClipDistance: direct index for structure ( out unsized 3-element array of float ClipDistance)
+0:44            'anon@0' ( out block{ gl_Position 4-component vector of float Position gl_Position,  gl_PointSize float PointSize gl_PointSize,  out unsized 3-element array of float ClipDistance gl_ClipDistance})
 0:44            Constant:
 0:44              2 (const uint)
 0:44          Constant:
@@ -590,7 +587,7 @@
 0:?   Linker Objects
 0:?     'patchIn' ( patch in 4-component vector of float)
 0:?     'patchOut' ( patch out 4-component vector of float)
-0:?     'anon@0' ( out block{ gl_Position 4-component vector of float Position gl_Position,  gl_PointSize float PointSize gl_PointSize,  out implicitly-sized array of float ClipDistance gl_ClipDistance})
+0:?     'anon@0' ( out block{ gl_Position 4-component vector of float Position gl_Position,  gl_PointSize float PointSize gl_PointSize,  out unsized 3-element array of float ClipDistance gl_ClipDistance})
 0:?     'badp1' ( smooth patch in 4-component vector of float)
 0:?     'badp2' ( flat patch in 4-component vector of float)
 0:?     'badp3' ( noperspective patch in 4-component vector of float)
@@ -612,7 +609,6 @@
 0:?     'pinbi' ( patch in block{ in int a})
 
 410.tesc
-Warning, version 400 is not yet complete; most version-specific features are present, but some are missing.
 ERROR: 0:4: 'length' :  array must first be sized by a redeclaration or layout qualifier
 ERROR: 1 compilation errors.  No code generated.
 
@@ -623,12 +619,11 @@
 0:8  Function Definition: main( ( global void)
 0:8    Function Parameters: 
 0:?   Linker Objects
-0:?     'gl_out' ( out implicitly-sized array of block{ out 4-component vector of float Position gl_Position,  out float PointSize gl_PointSize,  out implicitly-sized array of float ClipDistance gl_ClipDistance})
+0:?     'gl_out' ( out unsized 1-element array of block{ out 4-component vector of float Position gl_Position,  out float PointSize gl_PointSize,  out unsized 1-element array of float ClipDistance gl_ClipDistance})
 0:?     'outa' ( global 1-element array of int)
 0:?     'patchOut' ( patch out 4-component vector of float)
 
 420.tesc
-Warning, version 420 is not yet complete; most version-specific features are present, but some are missing.
 ERROR: 0:7: 'vertices' : inconsistent output number of vertices for array size of gl_out
 ERROR: 0:11: 'vertices' : inconsistent output number of vertices for array size of a
 ERROR: 0:12: 'vertices' : inconsistent output number of vertices for array size of outb
@@ -650,8 +645,8 @@
 0:17        move second child to first child ( temp 4-component vector of float)
 0:17          'p' ( temp 4-component vector of float)
 0:17          gl_Position: direct index for structure ( in 4-component vector of float Position)
-0:17            direct index ( temp block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in implicitly-sized array of float ClipDistance gl_ClipDistance})
-0:17              'gl_in' ( in 32-element array of block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in implicitly-sized array of float ClipDistance gl_ClipDistance})
+0:17            direct index ( temp block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in unsized 3-element array of float ClipDistance gl_ClipDistance})
+0:17              'gl_in' ( in 32-element array of block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in unsized 3-element array of float ClipDistance gl_ClipDistance})
 0:17              Constant:
 0:17                1 (const int)
 0:17            Constant:
@@ -660,8 +655,8 @@
 0:18        move second child to first child ( temp float)
 0:18          'ps' ( temp float)
 0:18          gl_PointSize: direct index for structure ( in float PointSize)
-0:18            direct index ( temp block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in implicitly-sized array of float ClipDistance gl_ClipDistance})
-0:18              'gl_in' ( in 32-element array of block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in implicitly-sized array of float ClipDistance gl_ClipDistance})
+0:18            direct index ( temp block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in unsized 3-element array of float ClipDistance gl_ClipDistance})
+0:18              'gl_in' ( in 32-element array of block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in unsized 3-element array of float ClipDistance gl_ClipDistance})
 0:18              Constant:
 0:18                1 (const int)
 0:18            Constant:
@@ -670,9 +665,9 @@
 0:19        move second child to first child ( temp float)
 0:19          'cd' ( temp float)
 0:19          direct index ( temp float ClipDistance)
-0:19            gl_ClipDistance: direct index for structure ( in implicitly-sized array of float ClipDistance)
-0:19              direct index ( temp block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in implicitly-sized array of float ClipDistance gl_ClipDistance})
-0:19                'gl_in' ( in 32-element array of block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in implicitly-sized array of float ClipDistance gl_ClipDistance})
+0:19            gl_ClipDistance: direct index for structure ( in unsized 3-element array of float ClipDistance)
+0:19              direct index ( temp block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in unsized 3-element array of float ClipDistance gl_ClipDistance})
+0:19                'gl_in' ( in 32-element array of block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in unsized 3-element array of float ClipDistance gl_ClipDistance})
 0:19                Constant:
 0:19                  1 (const int)
 0:19              Constant:
@@ -747,7 +742,6 @@
 0:?     'vs_tcs_last' (layout( location=12) in 32-element array of 2X4 matrix of double)
 
 420.tese
-Warning, version 420 is not yet complete; most version-specific features are present, but some are missing.
 ERROR: 0:7: '=' :  cannot convert from ' const 3-element array of float' to ' global 2-element array of float'
 ERROR: 0:8: 'initializer list' : wrong vector size (or rows in a matrix column):  temp 2-component vector of float
 ERROR: 0:9: 'initializer list' : wrong number of matrix columns:  temp 3X3 matrix of float
@@ -759,7 +753,7 @@
 ERROR: 0:29: ' const 2-element array of 4-component vector of float' : cannot construct with these arguments 
 ERROR: 0:29: '=' :  cannot convert from ' const float' to ' global 2-element array of 4-component vector of float'
 ERROR: 0:30: 'initializer list' : wrong number of matrix columns:  temp 4X2 matrix of float
-ERROR: 0:40: 'constructor' :  cannot convert parameter 1 from ' temp float' to ' temp structure{ global float s,  global float t}'
+ERROR: 0:40: 'constructor' :  cannot convert parameter 1 from ' const structure{ global 4-component vector of float a,  global 4-component vector of float b}' to ' temp structure{ global float s,  global float t}'
 ERROR: 0:70: 'initializer list' : wrong number of structure members 
 ERROR: 13 compilation errors.  No code generated.
 
@@ -888,7 +882,7 @@
 0:?     'b3' ( global 2-element array of 4-component vector of float)
 0:?     'b4' ( global 2-element array of 4-component vector of float)
 0:?     'c3' ( global 4X2 matrix of float)
-0:?     'd2' ( global implicitly-sized array of structure{ global float s,  global float t})
+0:?     'd2' ( global unsized 1-element array of structure{ global float s,  global float t})
 0:?     'b5' ( global 5-element array of float)
 0:?     'single1' ( global structure{ global int f})
 0:?     'single2' ( global structure{ global 2-component vector of uint v})
@@ -948,8 +942,6 @@
 ERROR: Linking tessellation control stage: Multiple function bodies in multiple compilation units for the same signature in the same stage:
     main(
 ERROR: Linking tessellation control stage: Types must match:
-    gl_out: " out 4-element array of block{ out 4-component vector of float Position gl_Position,  out float PointSize gl_PointSize,  out implicitly-sized array of float ClipDistance gl_ClipDistance}" versus " out implicitly-sized array of block{ out 4-component vector of float Position gl_Position,  out float PointSize gl_PointSize,  out implicitly-sized array of float ClipDistance gl_ClipDistance}"
-ERROR: Linking tessellation control stage: Types must match:
     outa: " global 4-element array of int" versus " global 1-element array of int"
 ERROR: Linking tessellation control stage: can't handle multiple entry points per stage
 ERROR: Linking tessellation control stage: Multiple function bodies in multiple compilation units for the same signature in the same stage:
@@ -961,7 +953,7 @@
 ERROR: Linking tessellation control stage: Multiple function bodies in multiple compilation units for the same signature in the same stage:
     main(
 ERROR: Linking tessellation control stage: Types must match:
-    gl_out: " out 4-element array of block{ out 4-component vector of float Position gl_Position,  out float PointSize gl_PointSize,  out implicitly-sized array of float ClipDistance gl_ClipDistance}" versus " out 3-element array of block{ out 4-component vector of float Position gl_Position}"
+    gl_out: " out 4-element array of block{ out 4-component vector of float Position gl_Position,  out float PointSize gl_PointSize,  out unsized 2-element array of float ClipDistance gl_ClipDistance}" versus " out 3-element array of block{ out 4-component vector of float Position gl_Position}"
 
 Linked tessellation evaluation stage:
 
diff --git a/Test/baseResults/150.vert.out b/Test/baseResults/150.vert.out
index 61a558a..504160d 100644
--- a/Test/baseResults/150.vert.out
+++ b/Test/baseResults/150.vert.out
@@ -11,20 +11,20 @@
 0:15    Sequence
 0:15      move second child to first child ( temp 4-component vector of float)
 0:15        gl_Position: direct index for structure ( invariant gl_Position 4-component vector of float Position)
-0:15          'anon@0' ( out block{ invariant gl_Position 4-component vector of float Position gl_Position,  gl_PointSize float PointSize gl_PointSize,  out 4-element array of float ClipDistance gl_ClipDistance,  gl_ClipVertex 4-component vector of float ClipVertex gl_ClipVertex,  out 4-component vector of float FrontColor gl_FrontColor,  out 4-component vector of float BackColor gl_BackColor,  out 4-component vector of float FrontSecondaryColor gl_FrontSecondaryColor,  out 4-component vector of float BackSecondaryColor gl_BackSecondaryColor,  out implicitly-sized array of 4-component vector of float TexCoord gl_TexCoord,  out float FogFragCoord gl_FogFragCoord})
+0:15          'anon@0' ( out block{ invariant gl_Position 4-component vector of float Position gl_Position,  gl_PointSize float PointSize gl_PointSize,  out 4-element array of float ClipDistance gl_ClipDistance,  gl_ClipVertex 4-component vector of float ClipVertex gl_ClipVertex,  out 4-component vector of float FrontColor gl_FrontColor,  out 4-component vector of float BackColor gl_BackColor,  out 4-component vector of float FrontSecondaryColor gl_FrontSecondaryColor,  out 4-component vector of float BackSecondaryColor gl_BackSecondaryColor,  out unsized 1-element array of 4-component vector of float TexCoord gl_TexCoord,  out float FogFragCoord gl_FogFragCoord})
 0:15          Constant:
 0:15            0 (const uint)
 0:15        'iv4' ( in 4-component vector of float)
 0:16      move second child to first child ( temp float)
 0:16        gl_PointSize: direct index for structure ( gl_PointSize float PointSize)
-0:16          'anon@0' ( out block{ invariant gl_Position 4-component vector of float Position gl_Position,  gl_PointSize float PointSize gl_PointSize,  out 4-element array of float ClipDistance gl_ClipDistance,  gl_ClipVertex 4-component vector of float ClipVertex gl_ClipVertex,  out 4-component vector of float FrontColor gl_FrontColor,  out 4-component vector of float BackColor gl_BackColor,  out 4-component vector of float FrontSecondaryColor gl_FrontSecondaryColor,  out 4-component vector of float BackSecondaryColor gl_BackSecondaryColor,  out implicitly-sized array of 4-component vector of float TexCoord gl_TexCoord,  out float FogFragCoord gl_FogFragCoord})
+0:16          'anon@0' ( out block{ invariant gl_Position 4-component vector of float Position gl_Position,  gl_PointSize float PointSize gl_PointSize,  out 4-element array of float ClipDistance gl_ClipDistance,  gl_ClipVertex 4-component vector of float ClipVertex gl_ClipVertex,  out 4-component vector of float FrontColor gl_FrontColor,  out 4-component vector of float BackColor gl_BackColor,  out 4-component vector of float FrontSecondaryColor gl_FrontSecondaryColor,  out 4-component vector of float BackSecondaryColor gl_BackSecondaryColor,  out unsized 1-element array of 4-component vector of float TexCoord gl_TexCoord,  out float FogFragCoord gl_FogFragCoord})
 0:16          Constant:
 0:16            1 (const uint)
 0:16        'ps' ( uniform float)
 0:17      move second child to first child ( temp float)
 0:17        direct index ( temp float ClipDistance)
 0:17          gl_ClipDistance: direct index for structure ( out 4-element array of float ClipDistance)
-0:17            'anon@0' ( out block{ invariant gl_Position 4-component vector of float Position gl_Position,  gl_PointSize float PointSize gl_PointSize,  out 4-element array of float ClipDistance gl_ClipDistance,  gl_ClipVertex 4-component vector of float ClipVertex gl_ClipVertex,  out 4-component vector of float FrontColor gl_FrontColor,  out 4-component vector of float BackColor gl_BackColor,  out 4-component vector of float FrontSecondaryColor gl_FrontSecondaryColor,  out 4-component vector of float BackSecondaryColor gl_BackSecondaryColor,  out implicitly-sized array of 4-component vector of float TexCoord gl_TexCoord,  out float FogFragCoord gl_FogFragCoord})
+0:17            'anon@0' ( out block{ invariant gl_Position 4-component vector of float Position gl_Position,  gl_PointSize float PointSize gl_PointSize,  out 4-element array of float ClipDistance gl_ClipDistance,  gl_ClipVertex 4-component vector of float ClipVertex gl_ClipVertex,  out 4-component vector of float FrontColor gl_FrontColor,  out 4-component vector of float BackColor gl_BackColor,  out 4-component vector of float FrontSecondaryColor gl_FrontSecondaryColor,  out 4-component vector of float BackSecondaryColor gl_BackSecondaryColor,  out unsized 1-element array of 4-component vector of float TexCoord gl_TexCoord,  out float FogFragCoord gl_FogFragCoord})
 0:17            Constant:
 0:17              2 (const uint)
 0:17          Constant:
@@ -35,14 +35,14 @@
 0:17            0 (const int)
 0:18      move second child to first child ( temp 4-component vector of float)
 0:18        gl_ClipVertex: direct index for structure ( gl_ClipVertex 4-component vector of float ClipVertex)
-0:18          'anon@0' ( out block{ invariant gl_Position 4-component vector of float Position gl_Position,  gl_PointSize float PointSize gl_PointSize,  out 4-element array of float ClipDistance gl_ClipDistance,  gl_ClipVertex 4-component vector of float ClipVertex gl_ClipVertex,  out 4-component vector of float FrontColor gl_FrontColor,  out 4-component vector of float BackColor gl_BackColor,  out 4-component vector of float FrontSecondaryColor gl_FrontSecondaryColor,  out 4-component vector of float BackSecondaryColor gl_BackSecondaryColor,  out implicitly-sized array of 4-component vector of float TexCoord gl_TexCoord,  out float FogFragCoord gl_FogFragCoord})
+0:18          'anon@0' ( out block{ invariant gl_Position 4-component vector of float Position gl_Position,  gl_PointSize float PointSize gl_PointSize,  out 4-element array of float ClipDistance gl_ClipDistance,  gl_ClipVertex 4-component vector of float ClipVertex gl_ClipVertex,  out 4-component vector of float FrontColor gl_FrontColor,  out 4-component vector of float BackColor gl_BackColor,  out 4-component vector of float FrontSecondaryColor gl_FrontSecondaryColor,  out 4-component vector of float BackSecondaryColor gl_BackSecondaryColor,  out unsized 1-element array of 4-component vector of float TexCoord gl_TexCoord,  out float FogFragCoord gl_FogFragCoord})
 0:18          Constant:
 0:18            3 (const uint)
 0:18        'iv4' ( in 4-component vector of float)
 0:?   Linker Objects
 0:?     'iv4' ( in 4-component vector of float)
 0:?     'ps' ( uniform float)
-0:?     'anon@1' (layout( column_major shared) uniform block{layout( column_major shared) uniform implicitly-sized array of int a})
+0:?     'anon@1' (layout( column_major shared) uniform block{layout( column_major shared) uniform unsized 1-element array of int a})
 0:?     'gl_VertexID' ( gl_VertexId int VertexId)
 0:?     'gl_InstanceID' ( gl_InstanceId int InstanceId)
 
diff --git a/Test/baseResults/300.frag.out b/Test/baseResults/300.frag.out
index 63abec1..ee1b8a5 100644
--- a/Test/baseResults/300.frag.out
+++ b/Test/baseResults/300.frag.out
@@ -1,7 +1,7 @@
 300.frag
 ERROR: 0:2: 'float' : type requires declaration of default precision qualifier 
 ERROR: 0:30: 'noperspective' : Reserved word. 
-ERROR: 0:30: 'noperspective' : not supported with this profile: es
+ERROR: 0:30: 'noperspective' : not supported for this version or the enabled extensions 
 ERROR: 0:31: 'sampler2D' : sampler/image types can only be used in uniform variables or function parameters: bads
 ERROR: 0:32: 'uint' : cannot apply precision statement to this type; use 'float', 'int' or a sampler type 
 ERROR: 0:39: 'structure' : must be qualified as flat in
@@ -26,6 +26,7 @@
 ERROR: 0:102: 'arrays of arrays' : not supported for this version or the enabled extensions 
 ERROR: 0:102: 'arrays of arrays' : not supported for this version or the enabled extensions 
 ERROR: 0:103: 'arrays of arrays' : not supported for this version or the enabled extensions 
+ERROR: 0:103: 'arrays of arrays' : not supported for this version or the enabled extensions 
 ERROR: 0:100: 'arrays of arrays' : not supported for this version or the enabled extensions 
 ERROR: 0:100: 'array-of-array of block' : not supported with this profile: es
 ERROR: 0:111: 'variable indexing fragment shader output array' : not supported with this profile: es
@@ -44,7 +45,7 @@
 ERROR: 0:158: 'invariant' : can only apply to an output 
 ERROR: 0:160: 'imageBuffer' : Reserved word. 
 ERROR: 0:160: '' :  syntax error, unexpected IMAGEBUFFER, expecting COMMA or SEMICOLON
-ERROR: 45 compilation errors.  No code generated.
+ERROR: 46 compilation errors.  No code generated.
 
 
 Shader version: 300
@@ -392,7 +393,7 @@
 0:?     'sc' ( out lowp 3-component vector of float)
 0:?     'sf' ( out lowp float)
 0:?     'arrayedSampler' ( uniform 5-element array of lowp sampler2D)
-0:?     'multiInst' (layout( column_major shared) uniform 2-element array of 3-element array of block{layout( column_major shared) uniform 2-element array of mediump int a, layout( column_major shared) uniform 2-element array of 3-element array of mediump int b, layout( column_major shared) uniform 2-element array of 3-element array of mediump int c})
+0:?     'multiInst' (layout( column_major shared) uniform 2-element array of 3-element array of block{layout( column_major shared) uniform 3-element array of 2-element array of mediump int a, layout( column_major shared) uniform 2-element array of 3-element array of mediump int b, layout( column_major shared) uniform 2-element array of 3-element array of mediump int c})
 0:?     'colors' ( out 4-element array of lowp 4-component vector of float)
 0:?     'st1' ( uniform structure{ global mediump int i,  global lowp sampler2D s})
 0:?     'st2' ( uniform structure{ global mediump int i,  global lowp sampler2D s})
@@ -623,7 +624,7 @@
 0:?     'sc' ( out lowp 3-component vector of float)
 0:?     'sf' ( out lowp float)
 0:?     'arrayedSampler' ( uniform 5-element array of lowp sampler2D)
-0:?     'multiInst' (layout( column_major shared) uniform 2-element array of 3-element array of block{layout( column_major shared) uniform 2-element array of mediump int a, layout( column_major shared) uniform 2-element array of 3-element array of mediump int b, layout( column_major shared) uniform 2-element array of 3-element array of mediump int c})
+0:?     'multiInst' (layout( column_major shared) uniform 2-element array of 3-element array of block{layout( column_major shared) uniform 3-element array of 2-element array of mediump int a, layout( column_major shared) uniform 2-element array of 3-element array of mediump int b, layout( column_major shared) uniform 2-element array of 3-element array of mediump int c})
 0:?     'colors' ( out 4-element array of lowp 4-component vector of float)
 0:?     'st1' ( uniform structure{ global mediump int i,  global lowp sampler2D s})
 0:?     'st2' ( uniform structure{ global mediump int i,  global lowp sampler2D s})
diff --git a/Test/baseResults/300.vert.out b/Test/baseResults/300.vert.out
index ec5d5d0..d8c9e16 100644
--- a/Test/baseResults/300.vert.out
+++ b/Test/baseResults/300.vert.out
@@ -39,14 +39,22 @@
 ERROR: 0:169: 'Bblock' : cannot add storage, auxiliary, memory, interpolation, layout, or precision qualifier to an existing variable 
 ERROR: 0:170: 'Bfoo' : cannot add storage, auxiliary, memory, interpolation, layout, or precision qualifier to an existing variable 
 ERROR: 0:172: 'std430' : not supported for this version or the enabled extensions 
-ERROR: 0:172: 'std430' : requires the 'buffer' storage qualifier 
+ERROR: 0:172: 'std430 requires the buffer storage qualifier' : required extension not requested: GL_EXT_scalar_block_layout
 ERROR: 0:175: '' : array size required 
 ERROR: 0:185: 'assign' :  cannot convert from ' temp 4-element array of highp float' to ' temp 3-element array of highp float'
 ERROR: 0:186: 'assign' :  cannot convert from ' temp 3-element array of highp float' to ' temp 4-element array of highp float'
-ERROR: 44 compilation errors.  No code generated.
+ERROR: 0:189: 'num_views' : required extension not requested: Possible extensions include:
+GL_OVR_multiview
+GL_OVR_multiview2
+ERROR: 0:193: 'gl_ViewID_OVR' : required extension not requested: Possible extensions include:
+GL_OVR_multiview
+GL_OVR_multiview2
+ERROR: 0:198: 'num_views' : can only apply to a standalone qualifier 
+ERROR: 47 compilation errors.  No code generated.
 
 
 Shader version: 300
+Requested GL_OVR_multiview
 ERROR: node is still EOpNull!
 0:27  Function Definition: main( ( global void)
 0:27    Function Parameters: 
@@ -289,6 +297,14 @@
 0:184        'y' ( temp 4-element array of highp float)
 0:185      'xp' ( temp 3-element array of highp float)
 0:186      'yp' ( temp 4-element array of highp float)
+0:191  Function Definition: mwErr( ( global void)
+0:191    Function Parameters: 
+0:193    Sequence
+0:193      'gl_ViewID_OVR' ( in highp uint ViewIndex)
+0:201  Function Definition: mwOk( ( global void)
+0:201    Function Parameters: 
+0:203    Sequence
+0:203      'gl_ViewID_OVR' ( in highp uint ViewIndex)
 0:?   Linker Objects
 0:?     'm43' ( uniform highp 4X3 matrix of float)
 0:?     'm33' ( uniform highp 3X3 matrix of float)
@@ -304,9 +320,9 @@
 0:?     'rep2' ( centroid smooth sample out highp 4-component vector of float)
 0:?     'rep3' ( in highp 4-component vector of float)
 0:?     's' ( smooth out structure{ global highp 3-component vector of float c,  global highp float f})
-0:?     'badsize' ( global implicitly-sized array of highp float)
-0:?     'badsize2' ( global implicitly-sized array of highp float)
-0:?     'ubInst' (layout( column_major shared) uniform implicitly-sized array of block{layout( column_major shared) uniform implicitly-sized array of highp int a})
+0:?     'badsize' ( global unsized 1-element array of highp float)
+0:?     'badsize2' ( global unsized 1-element array of highp float)
+0:?     'ubInst' (layout( column_major shared) uniform unsized 1-element array of block{layout( column_major shared) uniform unsized 1-element array of highp int a})
 0:?     'okayA' ( global 2-element array of highp float)
 0:?     'newV' ( invariant smooth out highp 3-component vector of float)
 0:?     'invIn' ( invariant in highp 4-component vector of float)
@@ -323,6 +339,7 @@
 0:?     'Binst' (layout( column_major shared) uniform block{layout( column_major shared) uniform highp int a})
 0:?     'Bfoo' ( global highp int)
 0:?     'B430i' (layout( column_major std430) uniform block{layout( column_major std430 offset=0) uniform highp int a})
+0:?     'mwUniform' ( uniform highp float)
 0:?     'gl_VertexID' ( gl_VertexId highp int VertexId)
 0:?     'gl_InstanceID' ( gl_InstanceId highp int InstanceId)
 
@@ -331,6 +348,7 @@
 
 
 Shader version: 300
+Requested GL_OVR_multiview
 ERROR: node is still EOpNull!
 0:27  Function Definition: main( ( global void)
 0:27    Function Parameters: 
@@ -481,6 +499,7 @@
 0:?     'Binst' (layout( column_major shared) uniform block{layout( column_major shared) uniform highp int a})
 0:?     'Bfoo' ( global highp int)
 0:?     'B430i' (layout( column_major std430) uniform block{layout( column_major std430 offset=0) uniform highp int a})
+0:?     'mwUniform' ( uniform highp float)
 0:?     'gl_VertexID' ( gl_VertexId highp int VertexId)
 0:?     'gl_InstanceID' ( gl_InstanceId highp int InstanceId)
 
diff --git a/Test/baseResults/300samplerExternal.frag.out b/Test/baseResults/300samplerExternal.frag.out
new file mode 100644
index 0000000..9074552
--- /dev/null
+++ b/Test/baseResults/300samplerExternal.frag.out
@@ -0,0 +1,197 @@
+300samplerExternal.frag
+ERROR: 0:12: 'texture2D' : no matching overloaded function found 
+ERROR: 0:13: 'texture2D' : no matching overloaded function found 
+ERROR: 0:14: 'texture2D' : no matching overloaded function found 
+ERROR: 0:15: 'texture2DProj' : no matching overloaded function found 
+ERROR: 0:16: 'texture2DProj' : no matching overloaded function found 
+ERROR: 0:29: 'texture3D' : no matching overloaded function found 
+ERROR: 0:30: 'texture2DProjLod' : no matching overloaded function found 
+ERROR: 0:31: 'texture' : no matching overloaded function found 
+ERROR: 0:32: 'textureProjLod' : no matching overloaded function found 
+ERROR: 0:38: 'samplerExternalOES' : required extension not requested: GL_OES_EGL_image_external_essl3
+ERROR: 0:41: '' :  syntax error, unexpected IDENTIFIER, expecting LEFT_BRACE or COMMA or SEMICOLON
+ERROR: 11 compilation errors.  No code generated.
+
+
+Shader version: 300
+Requested GL_OES_EGL_image_external
+Requested GL_OES_EGL_image_external_essl3
+ERROR: node is still EOpNull!
+0:10  Function Definition: main( ( global void)
+0:10    Function Parameters: 
+0:12    Sequence
+0:12      Constant:
+0:12        0.000000
+0:13      Constant:
+0:13        0.000000
+0:14      Constant:
+0:14        0.000000
+0:15      Constant:
+0:15        0.000000
+0:16      Constant:
+0:16        0.000000
+0:18      Sequence
+0:18        move second child to first child ( temp mediump int)
+0:18          'lod' ( temp mediump int)
+0:18          Constant:
+0:18            0 (const int)
+0:19      Sequence
+0:19        move second child to first child ( temp highp float)
+0:19          'bias' ( temp highp float)
+0:19          Constant:
+0:19            0.010000
+0:20      textureSize ( global highp 2-component vector of int, operation at mediump)
+0:20        'sExt' ( uniform lowp samplerExternalOES)
+0:20        'lod' ( temp mediump int)
+0:21      texture ( global lowp 4-component vector of float)
+0:21        'sExt' ( uniform lowp samplerExternalOES)
+0:21        Constant:
+0:21          0.200000
+0:21          0.200000
+0:22      texture ( global lowp 4-component vector of float, operation at highp)
+0:22        'sExt' ( uniform lowp samplerExternalOES)
+0:22        Constant:
+0:22          0.200000
+0:22          0.200000
+0:22        'bias' ( temp highp float)
+0:23      textureProj ( global lowp 4-component vector of float)
+0:23        'sExt' ( uniform lowp samplerExternalOES)
+0:23        Constant:
+0:23          0.200000
+0:23          0.200000
+0:23          0.200000
+0:24      textureProj ( global lowp 4-component vector of float, operation at highp)
+0:24        'sExt' ( uniform lowp samplerExternalOES)
+0:24        Constant:
+0:24          0.200000
+0:24          0.200000
+0:24          0.200000
+0:24        'bias' ( temp highp float)
+0:25      textureProj ( global lowp 4-component vector of float)
+0:25        'sExt' ( uniform lowp samplerExternalOES)
+0:25        Constant:
+0:25          0.200000
+0:25          0.200000
+0:25          0.200000
+0:25          0.200000
+0:26      textureProj ( global lowp 4-component vector of float, operation at highp)
+0:26        'sExt' ( uniform lowp samplerExternalOES)
+0:26        Constant:
+0:26          0.200000
+0:26          0.200000
+0:26          0.200000
+0:26          0.200000
+0:26        'bias' ( temp highp float)
+0:27      textureFetch ( global lowp 4-component vector of float, operation at mediump)
+0:27        'sExt' ( uniform lowp samplerExternalOES)
+0:27        Constant:
+0:27          4 (const int)
+0:27          4 (const int)
+0:27        'lod' ( temp mediump int)
+0:29      Constant:
+0:29        0.000000
+0:30      Constant:
+0:30        0.000000
+0:31      Constant:
+0:31        0.000000
+0:32      Constant:
+0:32        0.000000
+0:?   Linker Objects
+0:?     'sExt' ( uniform lowp samplerExternalOES)
+0:?     'mediumExt' ( uniform mediump samplerExternalOES)
+0:?     'highExt' ( uniform highp samplerExternalOES)
+0:?     'badExt' ( uniform mediump samplerExternalOES)
+
+
+Linked fragment stage:
+
+
+Shader version: 300
+Requested GL_OES_EGL_image_external
+Requested GL_OES_EGL_image_external_essl3
+ERROR: node is still EOpNull!
+0:10  Function Definition: main( ( global void)
+0:10    Function Parameters: 
+0:12    Sequence
+0:12      Constant:
+0:12        0.000000
+0:13      Constant:
+0:13        0.000000
+0:14      Constant:
+0:14        0.000000
+0:15      Constant:
+0:15        0.000000
+0:16      Constant:
+0:16        0.000000
+0:18      Sequence
+0:18        move second child to first child ( temp mediump int)
+0:18          'lod' ( temp mediump int)
+0:18          Constant:
+0:18            0 (const int)
+0:19      Sequence
+0:19        move second child to first child ( temp highp float)
+0:19          'bias' ( temp highp float)
+0:19          Constant:
+0:19            0.010000
+0:20      textureSize ( global highp 2-component vector of int, operation at mediump)
+0:20        'sExt' ( uniform lowp samplerExternalOES)
+0:20        'lod' ( temp mediump int)
+0:21      texture ( global lowp 4-component vector of float)
+0:21        'sExt' ( uniform lowp samplerExternalOES)
+0:21        Constant:
+0:21          0.200000
+0:21          0.200000
+0:22      texture ( global lowp 4-component vector of float, operation at highp)
+0:22        'sExt' ( uniform lowp samplerExternalOES)
+0:22        Constant:
+0:22          0.200000
+0:22          0.200000
+0:22        'bias' ( temp highp float)
+0:23      textureProj ( global lowp 4-component vector of float)
+0:23        'sExt' ( uniform lowp samplerExternalOES)
+0:23        Constant:
+0:23          0.200000
+0:23          0.200000
+0:23          0.200000
+0:24      textureProj ( global lowp 4-component vector of float, operation at highp)
+0:24        'sExt' ( uniform lowp samplerExternalOES)
+0:24        Constant:
+0:24          0.200000
+0:24          0.200000
+0:24          0.200000
+0:24        'bias' ( temp highp float)
+0:25      textureProj ( global lowp 4-component vector of float)
+0:25        'sExt' ( uniform lowp samplerExternalOES)
+0:25        Constant:
+0:25          0.200000
+0:25          0.200000
+0:25          0.200000
+0:25          0.200000
+0:26      textureProj ( global lowp 4-component vector of float, operation at highp)
+0:26        'sExt' ( uniform lowp samplerExternalOES)
+0:26        Constant:
+0:26          0.200000
+0:26          0.200000
+0:26          0.200000
+0:26          0.200000
+0:26        'bias' ( temp highp float)
+0:27      textureFetch ( global lowp 4-component vector of float, operation at mediump)
+0:27        'sExt' ( uniform lowp samplerExternalOES)
+0:27        Constant:
+0:27          4 (const int)
+0:27          4 (const int)
+0:27        'lod' ( temp mediump int)
+0:29      Constant:
+0:29        0.000000
+0:30      Constant:
+0:30        0.000000
+0:31      Constant:
+0:31        0.000000
+0:32      Constant:
+0:32        0.000000
+0:?   Linker Objects
+0:?     'sExt' ( uniform lowp samplerExternalOES)
+0:?     'mediumExt' ( uniform mediump samplerExternalOES)
+0:?     'highExt' ( uniform highp samplerExternalOES)
+0:?     'badExt' ( uniform mediump samplerExternalOES)
+
diff --git a/Test/baseResults/310.comp.out b/Test/baseResults/310.comp.out
index 3246622..5a926f6 100644
--- a/Test/baseResults/310.comp.out
+++ b/Test/baseResults/310.comp.out
@@ -1,7 +1,7 @@
 310.comp
-Warning, version 310 is not yet complete; most version-specific features are present, but some are missing.
 ERROR: 0:4: 'local_size' : cannot change previously set size 
 ERROR: 0:5: 'local_size' : too large; see gl_MaxComputeWorkGroupSize 
+ERROR: 0:7: 'local_size_y' : must be at least 1 
 ERROR: 0:23: '' : array size required 
 ERROR: 0:39: 'in' : global storage input qualifier cannot be used in a compute shader 
 ERROR: 0:39: 'location qualifier on input' : not supported in this stage: compute
@@ -16,7 +16,7 @@
 ERROR: 0:61: 'assign' :  l-value required "ro" (can't modify a readonly buffer)
 ERROR: 0:66: 'buffer' : buffers can be declared only as blocks 
 ERROR: 0:68: 'sampler/image' : type requires declaration of default precision qualifier 
-ERROR: 0:76: 'image variables declared 'writeonly' without a format layout qualifier' : not supported with this profile: es
+ERROR: 0:76: 'image variables not declared 'writeonly' and without a format layout qualifier' : not supported with this profile: es
 ERROR: 0:81: 'sampler/image' : type requires declaration of default precision qualifier 
 ERROR: 0:82: 'sampler/image' : type requires declaration of default precision qualifier 
 ERROR: 0:87: 'imageAtomicCompSwap' : required extension not requested: GL_OES_shader_image_atomic
@@ -40,7 +40,6 @@
 ERROR: 0:128: 'atomic_uint' : samplers and atomic_uints cannot be output parameters 
 ERROR: 0:130: 'return' : type does not match, or is not convertible to, the function's return type 
 ERROR: 0:136: 'atomic_uint' : atomic_uints can only be used in uniform variables or function parameters: non_uniform_counter
-ERROR: 0:136: 'atomic_uint' : layout(binding=X) is required 
 ERROR: 0:141: 'atomic_uint' : atomic counters can only be highp 
 ERROR: 0:141: 'binding' : atomic_uint binding is too large; see gl_MaxAtomicCounterBindings 
 ERROR: 0:143: 'binding' : atomic_uint binding is too large; see gl_MaxAtomicCounterBindings 
@@ -54,12 +53,12 @@
 ERROR: 0:171: 'sampler/image' : type requires declaration of default precision qualifier 
 ERROR: 0:172: 'iimage2DRect' : Reserved word. 
 ERROR: 0:172: 'sampler/image' : type requires declaration of default precision qualifier 
-ERROR: 0:172: 'image variables declared 'writeonly' without a format layout qualifier' : not supported with this profile: es
+ERROR: 0:172: 'image variables not declared 'writeonly' and without a format layout qualifier' : not supported with this profile: es
 ERROR: 0:173: 'image2DMS' : Reserved word. 
-ERROR: 0:173: 'image variables declared 'writeonly' without a format layout qualifier' : not supported with this profile: es
+ERROR: 0:173: 'image variables not declared 'writeonly' and without a format layout qualifier' : not supported with this profile: es
 ERROR: 0:174: 'uimage2DMSArray' : Reserved word. 
 ERROR: 0:174: 'sampler/image' : type requires declaration of default precision qualifier 
-ERROR: 0:174: 'image variables declared 'writeonly' without a format layout qualifier' : not supported with this profile: es
+ERROR: 0:174: 'image variables not declared 'writeonly' and without a format layout qualifier' : not supported with this profile: es
 ERROR: 0:181: 'rgba32f' : format requires readonly or writeonly memory qualifier 
 ERROR: 0:182: 'rgba8i' : format requires readonly or writeonly memory qualifier 
 ERROR: 0:183: 'rgba16ui' : format requires readonly or writeonly memory qualifier 
@@ -103,13 +102,13 @@
 0:35      GroupMemoryBarrier ( global void)
 0:36      move second child to first child ( temp highp int)
 0:36        value: direct index for structure (layout( column_major shared) buffer highp int)
-0:36          'anon@0' (layout( column_major shared) buffer block{layout( column_major shared) buffer highp int value, layout( column_major shared) buffer implicitly-sized array of highp float values})
+0:36          'anon@0' (layout( column_major shared) buffer block{layout( column_major shared) buffer highp int value, layout( column_major shared) buffer runtime-sized array of highp float values})
 0:36          Constant:
 0:36            0 (const uint)
 0:36        Convert float to int ( temp highp int)
 0:36          indirect index (layout( column_major shared) temp highp float)
-0:36            values: direct index for structure (layout( column_major shared) buffer implicitly-sized array of highp float)
-0:36              'anon@0' (layout( column_major shared) buffer block{layout( column_major shared) buffer highp int value, layout( column_major shared) buffer implicitly-sized array of highp float values})
+0:36            values: direct index for structure (layout( column_major shared) buffer runtime-sized array of highp float)
+0:36              'anon@0' (layout( column_major shared) buffer block{layout( column_major shared) buffer highp int value, layout( column_major shared) buffer runtime-sized array of highp float values})
 0:36              Constant:
 0:36                1 (const uint)
 0:36            'gl_LocalInvocationIndex' ( in highp uint LocalInvocationIndex)
@@ -118,8 +117,8 @@
 0:61    Sequence
 0:61      move second child to first child ( temp highp float)
 0:61        direct index (layout( column_major shared) temp highp float)
-0:61          values: direct index for structure (layout( column_major shared) buffer implicitly-sized array of highp float)
-0:61            'ro' (layout( column_major shared) readonly buffer block{layout( column_major shared) buffer highp int value, layout( column_major shared) buffer implicitly-sized array of highp float values})
+0:61          values: direct index for structure (layout( column_major shared) buffer unsized 3-element array of highp float)
+0:61            'ro' (layout( column_major shared) readonly buffer block{layout( column_major shared) buffer highp int value, layout( column_major shared) buffer unsized 3-element array of highp float values})
 0:61            Constant:
 0:61              1 (const int)
 0:61          Constant:
@@ -127,8 +126,8 @@
 0:61        Constant:
 0:61          4.700000
 0:62      array length ( temp int)
-0:62        values: direct index for structure (layout( column_major shared) buffer implicitly-sized array of highp float)
-0:62          'ro' (layout( column_major shared) readonly buffer block{layout( column_major shared) buffer highp int value, layout( column_major shared) buffer implicitly-sized array of highp float values})
+0:62        values: direct index for structure (layout( column_major shared) buffer unsized 3-element array of highp float)
+0:62          'ro' (layout( column_major shared) readonly buffer block{layout( column_major shared) buffer highp int value, layout( column_major shared) buffer unsized 3-element array of highp float values})
 0:62          Constant:
 0:62            1 (const int)
 0:63      Pre-Increment ( temp highp 4-component vector of float)
@@ -281,8 +280,8 @@
 0:194      move second child to first child ( temp highp float)
 0:194        'g' ( temp highp float)
 0:194        direct index (layout( column_major shared) temp highp float)
-0:194          values: direct index for structure (layout( column_major shared) buffer implicitly-sized array of highp float)
-0:194            'wo' (layout( column_major shared) writeonly buffer block{layout( column_major shared) buffer highp int value, layout( column_major shared) buffer implicitly-sized array of highp float values})
+0:194          values: direct index for structure (layout( column_major shared) buffer unsized 3-element array of highp float)
+0:194            'wo' (layout( column_major shared) writeonly buffer block{layout( column_major shared) buffer highp int value, layout( column_major shared) buffer unsized 3-element array of highp float values})
 0:194            Constant:
 0:194              1 (const int)
 0:194          Constant:
@@ -291,24 +290,24 @@
 0:195        move second child to first child ( temp highp float)
 0:195          'f' ( temp highp float)
 0:195          direct index (layout( column_major shared) temp highp float)
-0:195            values: direct index for structure (layout( column_major shared) buffer implicitly-sized array of highp float)
-0:195              'wo' (layout( column_major shared) writeonly buffer block{layout( column_major shared) buffer highp int value, layout( column_major shared) buffer implicitly-sized array of highp float values})
+0:195            values: direct index for structure (layout( column_major shared) buffer unsized 3-element array of highp float)
+0:195              'wo' (layout( column_major shared) writeonly buffer block{layout( column_major shared) buffer highp int value, layout( column_major shared) buffer unsized 3-element array of highp float values})
 0:195              Constant:
 0:195                1 (const int)
 0:195            Constant:
 0:195              2 (const int)
 0:196      Pre-Increment ( temp highp float)
 0:196        direct index (layout( column_major shared) temp highp float)
-0:196          values: direct index for structure (layout( column_major shared) buffer implicitly-sized array of highp float)
-0:196            'wo' (layout( column_major shared) writeonly buffer block{layout( column_major shared) buffer highp int value, layout( column_major shared) buffer implicitly-sized array of highp float values})
+0:196          values: direct index for structure (layout( column_major shared) buffer unsized 3-element array of highp float)
+0:196            'wo' (layout( column_major shared) writeonly buffer block{layout( column_major shared) buffer highp int value, layout( column_major shared) buffer unsized 3-element array of highp float values})
 0:196            Constant:
 0:196              1 (const int)
 0:196          Constant:
 0:196            2 (const int)
 0:197      Post-Decrement ( temp highp float)
 0:197        direct index (layout( column_major shared) temp highp float)
-0:197          values: direct index for structure (layout( column_major shared) buffer implicitly-sized array of highp float)
-0:197            'wo' (layout( column_major shared) writeonly buffer block{layout( column_major shared) buffer highp int value, layout( column_major shared) buffer implicitly-sized array of highp float values})
+0:197          values: direct index for structure (layout( column_major shared) buffer unsized 3-element array of highp float)
+0:197            'wo' (layout( column_major shared) writeonly buffer block{layout( column_major shared) buffer highp int value, layout( column_major shared) buffer unsized 3-element array of highp float values})
 0:197            Constant:
 0:197              1 (const int)
 0:197          Constant:
@@ -316,16 +315,16 @@
 0:198      add ( temp highp float)
 0:198        'f' ( temp highp float)
 0:198        direct index (layout( column_major shared) temp highp float)
-0:198          values: direct index for structure (layout( column_major shared) buffer implicitly-sized array of highp float)
-0:198            'wo' (layout( column_major shared) writeonly buffer block{layout( column_major shared) buffer highp int value, layout( column_major shared) buffer implicitly-sized array of highp float values})
+0:198          values: direct index for structure (layout( column_major shared) buffer unsized 3-element array of highp float)
+0:198            'wo' (layout( column_major shared) writeonly buffer block{layout( column_major shared) buffer highp int value, layout( column_major shared) buffer unsized 3-element array of highp float values})
 0:198            Constant:
 0:198              1 (const int)
 0:198          Constant:
 0:198            2 (const int)
 0:199      subtract ( temp highp float)
 0:199        direct index (layout( column_major shared) temp highp float)
-0:199          values: direct index for structure (layout( column_major shared) buffer implicitly-sized array of highp float)
-0:199            'wo' (layout( column_major shared) writeonly buffer block{layout( column_major shared) buffer highp int value, layout( column_major shared) buffer implicitly-sized array of highp float values})
+0:199          values: direct index for structure (layout( column_major shared) buffer unsized 3-element array of highp float)
+0:199            'wo' (layout( column_major shared) writeonly buffer block{layout( column_major shared) buffer highp int value, layout( column_major shared) buffer unsized 3-element array of highp float values})
 0:199            Constant:
 0:199              1 (const int)
 0:199          Constant:
@@ -338,8 +337,8 @@
 0:201        'f' ( temp highp float)
 0:201        false case
 0:201        direct index (layout( column_major shared) temp highp float)
-0:201          values: direct index for structure (layout( column_major shared) buffer implicitly-sized array of highp float)
-0:201            'wo' (layout( column_major shared) writeonly buffer block{layout( column_major shared) buffer highp int value, layout( column_major shared) buffer implicitly-sized array of highp float values})
+0:201          values: direct index for structure (layout( column_major shared) buffer unsized 3-element array of highp float)
+0:201            'wo' (layout( column_major shared) writeonly buffer block{layout( column_major shared) buffer highp int value, layout( column_major shared) buffer unsized 3-element array of highp float values})
 0:201            Constant:
 0:201              1 (const int)
 0:201          Constant:
@@ -349,8 +348,8 @@
 0:202        'b' ( temp bool)
 0:202        true case
 0:202        direct index (layout( column_major shared) temp highp float)
-0:202          values: direct index for structure (layout( column_major shared) buffer implicitly-sized array of highp float)
-0:202            'wo' (layout( column_major shared) writeonly buffer block{layout( column_major shared) buffer highp int value, layout( column_major shared) buffer implicitly-sized array of highp float values})
+0:202          values: direct index for structure (layout( column_major shared) buffer unsized 3-element array of highp float)
+0:202            'wo' (layout( column_major shared) writeonly buffer block{layout( column_major shared) buffer highp int value, layout( column_major shared) buffer unsized 3-element array of highp float values})
 0:202            Constant:
 0:202              1 (const int)
 0:202          Constant:
@@ -362,8 +361,8 @@
 0:203        Compare Equal ( temp bool)
 0:203          'f' ( temp highp float)
 0:203          direct index (layout( column_major shared) temp highp float)
-0:203            values: direct index for structure (layout( column_major shared) buffer implicitly-sized array of highp float)
-0:203              'wo' (layout( column_major shared) writeonly buffer block{layout( column_major shared) buffer highp int value, layout( column_major shared) buffer implicitly-sized array of highp float values})
+0:203            values: direct index for structure (layout( column_major shared) buffer unsized 3-element array of highp float)
+0:203              'wo' (layout( column_major shared) writeonly buffer block{layout( column_major shared) buffer highp int value, layout( column_major shared) buffer unsized 3-element array of highp float values})
 0:203              Constant:
 0:203                1 (const int)
 0:203            Constant:
@@ -376,8 +375,8 @@
 0:205        Compare Greater Than or Equal ( temp bool)
 0:205          'f' ( temp highp float)
 0:205          direct index (layout( column_major shared) temp highp float)
-0:205            values: direct index for structure (layout( column_major shared) buffer implicitly-sized array of highp float)
-0:205              'wo' (layout( column_major shared) writeonly buffer block{layout( column_major shared) buffer highp int value, layout( column_major shared) buffer implicitly-sized array of highp float values})
+0:205            values: direct index for structure (layout( column_major shared) buffer unsized 3-element array of highp float)
+0:205              'wo' (layout( column_major shared) writeonly buffer block{layout( column_major shared) buffer highp int value, layout( column_major shared) buffer unsized 3-element array of highp float values})
 0:205              Constant:
 0:205                1 (const int)
 0:205            Constant:
@@ -390,8 +389,8 @@
 0:207        direct index ( temp highp float)
 0:207          Construct vec3 ( temp highp 3-component vector of float)
 0:207            direct index (layout( column_major shared) temp highp float)
-0:207              values: direct index for structure (layout( column_major shared) buffer implicitly-sized array of highp float)
-0:207                'wo' (layout( column_major shared) writeonly buffer block{layout( column_major shared) buffer highp int value, layout( column_major shared) buffer implicitly-sized array of highp float values})
+0:207              values: direct index for structure (layout( column_major shared) buffer unsized 3-element array of highp float)
+0:207                'wo' (layout( column_major shared) writeonly buffer block{layout( column_major shared) buffer highp int value, layout( column_major shared) buffer unsized 3-element array of highp float values})
 0:207                Constant:
 0:207                  1 (const int)
 0:207              Constant:
@@ -400,13 +399,13 @@
 0:207            0 (const int)
 0:208      Bitwise not ( temp highp int)
 0:208        value: direct index for structure (layout( column_major shared) buffer highp int)
-0:208          'wo' (layout( column_major shared) writeonly buffer block{layout( column_major shared) buffer highp int value, layout( column_major shared) buffer implicitly-sized array of highp float values})
+0:208          'wo' (layout( column_major shared) writeonly buffer block{layout( column_major shared) buffer highp int value, layout( column_major shared) buffer unsized 3-element array of highp float values})
 0:208          Constant:
 0:208            0 (const int)
 0:209      move second child to first child ( temp highp float)
 0:209        direct index (layout( column_major shared) temp highp float)
-0:209          values: direct index for structure (layout( column_major shared) buffer implicitly-sized array of highp float)
-0:209            'wo' (layout( column_major shared) writeonly buffer block{layout( column_major shared) buffer highp int value, layout( column_major shared) buffer implicitly-sized array of highp float values})
+0:209          values: direct index for structure (layout( column_major shared) buffer unsized 3-element array of highp float)
+0:209            'wo' (layout( column_major shared) writeonly buffer block{layout( column_major shared) buffer highp int value, layout( column_major shared) buffer unsized 3-element array of highp float values})
 0:209            Constant:
 0:209              1 (const int)
 0:209          Constant:
@@ -419,21 +418,21 @@
 0:221      move second child to first child ( temp highp float)
 0:221        'g' ( temp highp float)
 0:221        direct index (layout( column_major shared) temp highp float)
-0:221          values: direct index for structure (layout( column_major shared) buffer implicitly-sized array of highp float)
-0:221            'wo' (layout( column_major shared) writeonly buffer block{layout( column_major shared) buffer highp int value, layout( column_major shared) buffer implicitly-sized array of highp float values})
+0:221          values: direct index for structure (layout( column_major shared) buffer unsized 3-element array of highp float)
+0:221            'wo' (layout( column_major shared) writeonly buffer block{layout( column_major shared) buffer highp int value, layout( column_major shared) buffer unsized 3-element array of highp float values})
 0:221            Constant:
 0:221              1 (const int)
 0:221          Constant:
 0:221            2 (const int)
 0:222      Bitwise not ( temp highp int)
 0:222        value: direct index for structure (layout( column_major shared) buffer highp int)
-0:222          'wo' (layout( column_major shared) writeonly buffer block{layout( column_major shared) buffer highp int value, layout( column_major shared) buffer implicitly-sized array of highp float values})
+0:222          'wo' (layout( column_major shared) writeonly buffer block{layout( column_major shared) buffer highp int value, layout( column_major shared) buffer unsized 3-element array of highp float values})
 0:222          Constant:
 0:222            0 (const int)
 0:223      move second child to first child ( temp highp float)
 0:223        direct index (layout( column_major shared) temp highp float)
-0:223          values: direct index for structure (layout( column_major shared) buffer implicitly-sized array of highp float)
-0:223            'wo' (layout( column_major shared) writeonly buffer block{layout( column_major shared) buffer highp int value, layout( column_major shared) buffer implicitly-sized array of highp float values})
+0:223          values: direct index for structure (layout( column_major shared) buffer unsized 3-element array of highp float)
+0:223            'wo' (layout( column_major shared) writeonly buffer block{layout( column_major shared) buffer highp int value, layout( column_major shared) buffer unsized 3-element array of highp float values})
 0:223            Constant:
 0:223              1 (const int)
 0:223          Constant:
@@ -442,7 +441,7 @@
 0:223          3.400000
 0:224      move second child to first child ( temp highp int)
 0:224        value: direct index for structure (layout( column_major shared) buffer highp int)
-0:224          'wo' (layout( column_major shared) writeonly buffer block{layout( column_major shared) buffer highp int value, layout( column_major shared) buffer implicitly-sized array of highp float values})
+0:224          'wo' (layout( column_major shared) writeonly buffer block{layout( column_major shared) buffer highp int value, layout( column_major shared) buffer unsized 3-element array of highp float values})
 0:224          Constant:
 0:224            0 (const int)
 0:224        Constant:
@@ -464,8 +463,8 @@
 0:?       4096 (const uint)
 0:?     'total' ( const highp int)
 0:?       66592 (const int)
-0:?     'anon@0' (layout( column_major shared) buffer block{layout( column_major shared) buffer highp int value, layout( column_major shared) buffer implicitly-sized array of highp float values})
-0:?     'invalid' (layout( column_major shared) buffer block{layout( column_major shared) buffer implicitly-sized array of highp float values, layout( column_major shared) buffer highp int value})
+0:?     'anon@0' (layout( column_major shared) buffer block{layout( column_major shared) buffer highp int value, layout( column_major shared) buffer runtime-sized array of highp float values})
+0:?     'invalid' (layout( column_major shared) buffer block{layout( column_major shared) buffer unsized 1-element array of highp float values, layout( column_major shared) buffer highp int value})
 0:?     'v3' (layout( location=2) in highp 3-component vector of float)
 0:?     'f' ( in highp float)
 0:?     'fo' ( out highp float)
@@ -475,7 +474,7 @@
 0:?     'arrX' ( global 2-element array of highp int)
 0:?     'arrY' ( global 1-element array of highp int)
 0:?     'arrZ' ( global 4096-element array of highp int)
-0:?     'ro' (layout( column_major shared) readonly buffer block{layout( column_major shared) buffer highp int value, layout( column_major shared) buffer implicitly-sized array of highp float values})
+0:?     'ro' (layout( column_major shared) readonly buffer block{layout( column_major shared) buffer highp int value, layout( column_major shared) buffer unsized 3-element array of highp float values})
 0:?     'v' ( buffer highp 4-component vector of float)
 0:?     'us2dbad' ( uniform mediump usampler2D)
 0:?     'us2d' ( uniform highp usampler2D)
@@ -514,8 +513,8 @@
 0:?     'badQ1' (layout( rgba32f) coherent volatile restrict uniform highp image2D)
 0:?     'badQ2' (layout( rgba8i) coherent volatile restrict uniform highp iimage2D)
 0:?     'badQ3' (layout( rgba16ui) coherent volatile restrict uniform highp uimage2D)
-0:?     'wo' (layout( column_major shared) writeonly buffer block{layout( column_major shared) buffer highp int value, layout( column_major shared) buffer implicitly-sized array of highp float values})
-0:?     'multio' (layout( column_major shared) buffer block{layout( column_major shared) readonly buffer highp int value, layout( column_major shared) writeonly buffer implicitly-sized array of highp float values})
+0:?     'wo' (layout( column_major shared) writeonly buffer block{layout( column_major shared) buffer highp int value, layout( column_major shared) buffer unsized 3-element array of highp float values})
+0:?     'multio' (layout( column_major shared) buffer block{layout( column_major shared) readonly buffer highp int value, layout( column_major shared) writeonly buffer unsized 1-element array of highp float values})
 0:?     'inbi' ( in block{ in highp int a})
 0:?     'outbi' ( out block{ out highp int a})
 0:?     't__' ( global highp float)
@@ -541,13 +540,13 @@
 0:35      GroupMemoryBarrier ( global void)
 0:36      move second child to first child ( temp highp int)
 0:36        value: direct index for structure (layout( column_major shared) buffer highp int)
-0:36          'anon@0' (layout( column_major shared) buffer block{layout( column_major shared) buffer highp int value, layout( column_major shared) buffer implicitly-sized array of highp float values})
+0:36          'anon@0' (layout( column_major shared) buffer block{layout( column_major shared) buffer highp int value, layout( column_major shared) buffer runtime-sized array of highp float values})
 0:36          Constant:
 0:36            0 (const uint)
 0:36        Convert float to int ( temp highp int)
 0:36          indirect index (layout( column_major shared) temp highp float)
-0:36            values: direct index for structure (layout( column_major shared) buffer implicitly-sized array of highp float)
-0:36              'anon@0' (layout( column_major shared) buffer block{layout( column_major shared) buffer highp int value, layout( column_major shared) buffer implicitly-sized array of highp float values})
+0:36            values: direct index for structure (layout( column_major shared) buffer runtime-sized array of highp float)
+0:36              'anon@0' (layout( column_major shared) buffer block{layout( column_major shared) buffer highp int value, layout( column_major shared) buffer runtime-sized array of highp float values})
 0:36              Constant:
 0:36                1 (const uint)
 0:36            'gl_LocalInvocationIndex' ( in highp uint LocalInvocationIndex)
@@ -558,8 +557,8 @@
 0:?       4096 (const uint)
 0:?     'total' ( const highp int)
 0:?       66592 (const int)
-0:?     'anon@0' (layout( column_major shared) buffer block{layout( column_major shared) buffer highp int value, layout( column_major shared) buffer implicitly-sized array of highp float values})
-0:?     'invalid' (layout( column_major shared) buffer block{layout( column_major shared) buffer implicitly-sized array of highp float values, layout( column_major shared) buffer highp int value})
+0:?     'anon@0' (layout( column_major shared) buffer block{layout( column_major shared) buffer highp int value, layout( column_major shared) buffer runtime-sized array of highp float values})
+0:?     'invalid' (layout( column_major shared) buffer block{layout( column_major shared) buffer 1-element array of highp float values, layout( column_major shared) buffer highp int value})
 0:?     'v3' (layout( location=2) in highp 3-component vector of float)
 0:?     'f' ( in highp float)
 0:?     'fo' ( out highp float)
@@ -569,7 +568,7 @@
 0:?     'arrX' ( global 2-element array of highp int)
 0:?     'arrY' ( global 1-element array of highp int)
 0:?     'arrZ' ( global 4096-element array of highp int)
-0:?     'ro' (layout( column_major shared) readonly buffer block{layout( column_major shared) buffer highp int value, layout( column_major shared) buffer implicitly-sized array of highp float values})
+0:?     'ro' (layout( column_major shared) readonly buffer block{layout( column_major shared) buffer highp int value, layout( column_major shared) buffer unsized 3-element array of highp float values})
 0:?     'v' ( buffer highp 4-component vector of float)
 0:?     'us2dbad' ( uniform mediump usampler2D)
 0:?     'us2d' ( uniform highp usampler2D)
@@ -608,8 +607,8 @@
 0:?     'badQ1' (layout( rgba32f) coherent volatile restrict uniform highp image2D)
 0:?     'badQ2' (layout( rgba8i) coherent volatile restrict uniform highp iimage2D)
 0:?     'badQ3' (layout( rgba16ui) coherent volatile restrict uniform highp uimage2D)
-0:?     'wo' (layout( column_major shared) writeonly buffer block{layout( column_major shared) buffer highp int value, layout( column_major shared) buffer implicitly-sized array of highp float values})
-0:?     'multio' (layout( column_major shared) buffer block{layout( column_major shared) readonly buffer highp int value, layout( column_major shared) writeonly buffer implicitly-sized array of highp float values})
+0:?     'wo' (layout( column_major shared) writeonly buffer block{layout( column_major shared) buffer highp int value, layout( column_major shared) buffer unsized 3-element array of highp float values})
+0:?     'multio' (layout( column_major shared) buffer block{layout( column_major shared) readonly buffer highp int value, layout( column_major shared) writeonly buffer unsized 1-element array of highp float values})
 0:?     'inbi' ( in block{ in highp int a})
 0:?     'outbi' ( out block{ out highp int a})
 0:?     't__' ( global highp float)
diff --git a/Test/baseResults/310.frag.out b/Test/baseResults/310.frag.out
index 3b2fdd0..6763c0a 100644
--- a/Test/baseResults/310.frag.out
+++ b/Test/baseResults/310.frag.out
@@ -1,5 +1,4 @@
 310.frag
-Warning, version 310 is not yet complete; most version-specific features are present, but some are missing.
 ERROR: 0:2: 'float' : type requires declaration of default precision qualifier 
 ERROR: 0:8: 'origin_upper_left' : not supported with this profile: es
 ERROR: 0:8: 'pixel_center_integer' : not supported with this profile: es
@@ -19,13 +18,13 @@
 ERROR: 0:45: 'texel offset' : value is out of range: [gl_MinProgramTexelOffset, gl_MaxProgramTexelOffset]
 ERROR: 0:45: 'texel offset' : value is out of range: [gl_MinProgramTexelOffset, gl_MaxProgramTexelOffset]
 ERROR: 0:66: 'sampler/image' : type requires declaration of default precision qualifier 
-ERROR: 0:66: 'image variables declared 'writeonly' without a format layout qualifier' : not supported with this profile: es
+ERROR: 0:66: 'image variables not declared 'writeonly' and without a format layout qualifier' : not supported with this profile: es
 ERROR: 0:67: 'sampler/image' : type requires declaration of default precision qualifier 
-ERROR: 0:67: 'image variables declared 'writeonly' without a format layout qualifier' : not supported with this profile: es
+ERROR: 0:67: 'image variables not declared 'writeonly' and without a format layout qualifier' : not supported with this profile: es
 ERROR: 0:68: 'sampler/image' : type requires declaration of default precision qualifier 
-ERROR: 0:68: 'image variables declared 'writeonly' without a format layout qualifier' : not supported with this profile: es
+ERROR: 0:68: 'image variables not declared 'writeonly' and without a format layout qualifier' : not supported with this profile: es
 ERROR: 0:69: 'sampler/image' : type requires declaration of default precision qualifier 
-ERROR: 0:69: 'image variables declared 'writeonly' without a format layout qualifier' : not supported with this profile: es
+ERROR: 0:69: 'image variables not declared 'writeonly' and without a format layout qualifier' : not supported with this profile: es
 ERROR: 0:73: 'binding' : requires block, or sampler/image, or atomic-counter type 
 ERROR: 0:77: 'location' : location is too large 
 ERROR: 0:81: 'location' : too large for fragment output 
@@ -36,7 +35,7 @@
 ERROR: 0:96: 'sampler/image' : type requires declaration of default precision qualifier 
 ERROR: 0:110: 'out' : cannot be bool 
 ERROR: 0:111: 'image2D' : sampler/image types can only be used in uniform variables or function parameters: imageOut
-ERROR: 0:111: 'image variables declared 'writeonly' without a format layout qualifier' : not supported with this profile: es
+ERROR: 0:111: 'image variables not declared 'writeonly' and without a format layout qualifier' : not supported with this profile: es
 ERROR: 0:112: 'out' : cannot be a matrix 
 ERROR: 0:114: 'in' : cannot be bool 
 ERROR: 0:115: 'sampler2D' : sampler/image types can only be used in uniform variables or function parameters: ino
@@ -106,7 +105,7 @@
 ERROR: 0:347: 'flat/smooth/noperspective' : can't use interpolation qualifier on a fragment output 
 ERROR: 0:348: 'flat/smooth/noperspective' : can't use interpolation qualifier on a fragment output 
 ERROR: 0:349: 'noperspective' : Reserved word. 
-ERROR: 0:349: 'noperspective' : not supported with this profile: es
+ERROR: 0:349: 'noperspective' : not supported for this version or the enabled extensions 
 ERROR: 0:349: 'flat/smooth/noperspective' : can't use interpolation qualifier on a fragment output 
 ERROR: 0:355: 'interpolateAtCentroid' : required extension not requested: GL_OES_shader_multisample_interpolation
 ERROR: 0:356: 'interpolateAtSample' : required extension not requested: GL_OES_shader_multisample_interpolation
@@ -124,7 +123,7 @@
 ERROR: 0:392: 'interpolateAtOffset' : first argument must be an interpolant, or interpolant-array element 
 ERROR: 0:396: 'interpolateAtCentroid' : first argument must be an interpolant, or interpolant-array element 
 ERROR: 0:397: 'interpolateAtSample' : first argument must be an interpolant, or interpolant-array element 
-ERROR: 0:400: 'blend equation' : required extension not requested: GL_KHR_blend_equation_advanced
+ERROR: 0:400: 'blend equation' : not supported for this version or the enabled extensions 
 ERROR: 0:423: 'blend equation' : can only apply to 'out' 
 ERROR: 0:424: 'blend equation' : can only apply to a standalone qualifier 
 ERROR: 0:425: 'blend equation' : can only apply to a standalone qualifier 
@@ -570,12 +569,12 @@
 0:259        move second child to first child ( temp highp int)
 0:259          'a3' ( temp highp int)
 0:259          direct index ( flat temp highp int SampleMaskIn)
-0:259            'gl_SampleMaskIn' ( flat in implicitly-sized array of highp int SampleMaskIn)
+0:259            'gl_SampleMaskIn' ( flat in unsized 1-element array of highp int SampleMaskIn)
 0:259            Constant:
 0:259              0 (const int)
 0:260      move second child to first child ( temp highp int)
 0:260        direct index ( temp highp int SampleMaskIn)
-0:260          'gl_SampleMask' ( out implicitly-sized array of highp int SampleMaskIn)
+0:260          'gl_SampleMask' ( out unsized 1-element array of highp int SampleMaskIn)
 0:260          Constant:
 0:260            0 (const int)
 0:260        'a3' ( temp highp int)
@@ -598,12 +597,12 @@
 0:272        move second child to first child ( temp highp int)
 0:272          'a3' ( temp highp int)
 0:272          direct index ( flat temp highp int SampleMaskIn)
-0:272            'gl_SampleMaskIn' ( flat in implicitly-sized array of highp int SampleMaskIn)
+0:272            'gl_SampleMaskIn' ( flat in unsized 1-element array of highp int SampleMaskIn)
 0:272            Constant:
 0:272              0 (const int)
 0:273      move second child to first child ( temp highp int)
 0:273        direct index ( temp highp int SampleMaskIn)
-0:273          'gl_SampleMask' ( out implicitly-sized array of highp int SampleMaskIn)
+0:273          'gl_SampleMask' ( out unsized 1-element array of highp int SampleMaskIn)
 0:273          Constant:
 0:273            0 (const int)
 0:273        'a3' ( temp highp int)
@@ -1002,8 +1001,8 @@
 0:?     'CA5' ( uniform highp samplerCubeArrayShadow)
 0:?     'CA6' ( uniform highp isamplerCubeArray)
 0:?     'CA7' ( uniform highp usamplerCubeArray)
-0:?     'gl_SampleMaskIn' ( flat in implicitly-sized array of highp int SampleMaskIn)
-0:?     'gl_SampleMask' ( out implicitly-sized array of highp int SampleMaskIn)
+0:?     'gl_SampleMaskIn' ( flat in unsized 1-element array of highp int SampleMaskIn)
+0:?     'gl_SampleMask' ( out unsized 1-element array of highp int SampleMaskIn)
 0:?     'im2Df' (layout( r32f) uniform highp image2D)
 0:?     'im2Du' (layout( r32ui) uniform highp uimage2D)
 0:?     'im2Di' (layout( r32i) uniform highp iimage2D)
diff --git a/Test/baseResults/310.geom.out b/Test/baseResults/310.geom.out
index e57c822..b0dabc3 100644
--- a/Test/baseResults/310.geom.out
+++ b/Test/baseResults/310.geom.out
@@ -1,5 +1,4 @@
 310.geom
-Warning, version 310 is not yet complete; most version-specific features are present, but some are missing.
 ERROR: 0:29: 'fromVertex' : block instance name redefinition 
 ERROR: 0:33: 'fromVertex' : redefinition 
 ERROR: 0:35: 'fooC' : block instance name redefinition 
diff --git a/Test/baseResults/310.tesc.out b/Test/baseResults/310.tesc.out
index 9c3d1d5..433a7dc 100644
--- a/Test/baseResults/310.tesc.out
+++ b/Test/baseResults/310.tesc.out
@@ -1,5 +1,4 @@
 310.tesc
-Warning, version 310 is not yet complete; most version-specific features are present, but some are missing.
 ERROR: 0:8: 'quads' : unrecognized layout identifier, or qualifier requires assignment (e.g., binding = 4) 
 ERROR: 0:9: 'ccw' : unrecognized layout identifier, or qualifier requires assignment (e.g., binding = 4) 
 ERROR: 0:10: 'fractional_even_spacing' : unrecognized layout identifier, or qualifier requires assignment (e.g., binding = 4) 
@@ -71,8 +70,8 @@
 0:25        move second child to first child ( temp highp 4-component vector of float)
 0:25          'p' ( temp highp 4-component vector of float)
 0:25          gl_Position: direct index for structure ( in highp 4-component vector of float Position)
-0:25            direct index ( temp block{ in highp 4-component vector of float Position gl_Position,  in highp float PointSize gl_PointSize,  in highp 4-component vector of float gl_SecondaryPositionNV,  in implicitly-sized array of highp 4-component vector of float gl_PositionPerViewNV})
-0:25              'gl_in' ( in 32-element array of block{ in highp 4-component vector of float Position gl_Position,  in highp float PointSize gl_PointSize,  in highp 4-component vector of float gl_SecondaryPositionNV,  in implicitly-sized array of highp 4-component vector of float gl_PositionPerViewNV})
+0:25            direct index ( temp block{ in highp 4-component vector of float Position gl_Position,  in highp float PointSize gl_PointSize,  in highp 4-component vector of float gl_SecondaryPositionNV,  in unsized 1-element array of highp 4-component vector of float gl_PositionPerViewNV})
+0:25              'gl_in' ( in 32-element array of block{ in highp 4-component vector of float Position gl_Position,  in highp float PointSize gl_PointSize,  in highp 4-component vector of float gl_SecondaryPositionNV,  in unsized 1-element array of highp 4-component vector of float gl_PositionPerViewNV})
 0:25              Constant:
 0:25                1 (const int)
 0:25            Constant:
@@ -81,8 +80,8 @@
 0:26        move second child to first child ( temp highp float)
 0:26          'ps' ( temp highp float)
 0:26          gl_PointSize: direct index for structure ( in highp float PointSize)
-0:26            direct index ( temp block{ in highp 4-component vector of float Position gl_Position,  in highp float PointSize gl_PointSize,  in highp 4-component vector of float gl_SecondaryPositionNV,  in implicitly-sized array of highp 4-component vector of float gl_PositionPerViewNV})
-0:26              'gl_in' ( in 32-element array of block{ in highp 4-component vector of float Position gl_Position,  in highp float PointSize gl_PointSize,  in highp 4-component vector of float gl_SecondaryPositionNV,  in implicitly-sized array of highp 4-component vector of float gl_PositionPerViewNV})
+0:26            direct index ( temp block{ in highp 4-component vector of float Position gl_Position,  in highp float PointSize gl_PointSize,  in highp 4-component vector of float gl_SecondaryPositionNV,  in unsized 1-element array of highp 4-component vector of float gl_PositionPerViewNV})
+0:26              'gl_in' ( in 32-element array of block{ in highp 4-component vector of float Position gl_Position,  in highp float PointSize gl_PointSize,  in highp 4-component vector of float gl_SecondaryPositionNV,  in unsized 1-element array of highp 4-component vector of float gl_PositionPerViewNV})
 0:26              Constant:
 0:26                1 (const int)
 0:26            Constant:
@@ -210,8 +209,8 @@
 0:114        move second child to first child ( temp highp float)
 0:114          'ps' ( temp highp float)
 0:114          gl_PointSize: direct index for structure ( in highp float PointSize)
-0:114            direct index ( temp block{ in highp 4-component vector of float Position gl_Position,  in highp float PointSize gl_PointSize,  in highp 4-component vector of float gl_SecondaryPositionNV,  in implicitly-sized array of highp 4-component vector of float gl_PositionPerViewNV})
-0:114              'gl_in' ( in 32-element array of block{ in highp 4-component vector of float Position gl_Position,  in highp float PointSize gl_PointSize,  in highp 4-component vector of float gl_SecondaryPositionNV,  in implicitly-sized array of highp 4-component vector of float gl_PositionPerViewNV})
+0:114            direct index ( temp block{ in highp 4-component vector of float Position gl_Position,  in highp float PointSize gl_PointSize,  in highp 4-component vector of float gl_SecondaryPositionNV,  in unsized 1-element array of highp 4-component vector of float gl_PositionPerViewNV})
+0:114              'gl_in' ( in 32-element array of block{ in highp 4-component vector of float Position gl_Position,  in highp float PointSize gl_PointSize,  in highp 4-component vector of float gl_SecondaryPositionNV,  in unsized 1-element array of highp 4-component vector of float gl_PositionPerViewNV})
 0:114              Constant:
 0:114                1 (const int)
 0:114            Constant:
@@ -358,7 +357,7 @@
 0:?     'inb' ( in 32-element array of highp 2-component vector of float)
 0:?     'inc' ( in 32-element array of highp 2-component vector of float)
 0:?     'ind' ( in 32-element array of highp 2-component vector of float)
-0:?     'implA' ( patch out implicitly-sized array of highp float)
+0:?     'implA' ( patch out unsized 1-element array of highp float)
 0:?     'ivla' (layout( location=3) in 32-element array of highp 4-component vector of float)
 0:?     'ivlb' (layout( location=4) in 32-element array of highp 4-component vector of float)
 0:?     'ivlc' (layout( location=4) in 32-element array of highp 4-component vector of float)
@@ -373,7 +372,7 @@
 0:?     'misSized' ( out 5-element array of highp float)
 0:?     'okaySize' ( out 4-element array of highp float)
 0:?     'pv3' ( noContraction temp highp 3-component vector of float)
-0:?     'badpatchIName' ( patch out implicitly-sized array of block{ out highp float f})
+0:?     'badpatchIName' ( patch out unsized 1-element array of block{ out highp float f})
 0:?     'patchIName' ( patch out 4-element array of block{ out highp float f})
 
 
diff --git a/Test/baseResults/310.tese.out b/Test/baseResults/310.tese.out
index 4550230..9c7c679 100644
--- a/Test/baseResults/310.tese.out
+++ b/Test/baseResults/310.tese.out
@@ -1,5 +1,4 @@
 310.tese
-Warning, version 310 is not yet complete; most version-specific features are present, but some are missing.
 ERROR: 0:7: 'vertices' : there is no such layout identifier for this stage taking an assigned value 
 ERROR: 0:9: 'triangles' : cannot change previously set input primitive 
 ERROR: 0:10: 'isolines' : cannot change previously set input primitive 
@@ -22,11 +21,10 @@
 ERROR: 0:51: 'patch' : cannot use interpolation qualifiers with patch 
 ERROR: 0:52: 'patch' : cannot use interpolation qualifiers with patch 
 ERROR: 0:53: 'noperspective' : Reserved word. 
-ERROR: 0:53: 'noperspective' : not supported with this profile: es
+ERROR: 0:53: 'noperspective' : not supported for this version or the enabled extensions 
 ERROR: 0:53: 'patch' : cannot use interpolation qualifiers with patch 
 ERROR: 0:54: 'sample' : Reserved word. 
 ERROR: 0:54: '' : can only have one auxiliary qualifier (centroid, patch, and sample) 
-ERROR: 0:58: 'gl_PerVertex' : block already declared with size, can't redeclare as implicitly-sized 
 ERROR: 0:63: 'gl_PerVertex' : can only redeclare a built-in block once, and before any use 
 ERROR: 0:68: 'quads' : cannot apply to 'out' 
 ERROR: 0:68: 'cw' : can only apply to 'in' 
@@ -48,7 +46,7 @@
 ERROR: 0:119: 'gl_PointSize' : no such field in structure 
 ERROR: 0:119: '=' :  cannot convert from ' temp block{ in highp 4-component vector of float Position gl_Position}' to ' temp highp float'
 ERROR: 0:127: 'gl_BoundingBoxOES' : undeclared identifier 
-ERROR: 44 compilation errors.  No code generated.
+ERROR: 43 compilation errors.  No code generated.
 
 
 Shader version: 310
@@ -78,8 +76,8 @@
 0:36        move second child to first child ( temp highp 4-component vector of float)
 0:36          'p' ( temp highp 4-component vector of float)
 0:36          gl_Position: direct index for structure ( in highp 4-component vector of float Position)
-0:36            direct index ( temp block{ in highp 4-component vector of float Position gl_Position,  in highp float PointSize gl_PointSize,  in highp 4-component vector of float gl_SecondaryPositionNV,  in implicitly-sized array of highp 4-component vector of float gl_PositionPerViewNV})
-0:36              'gl_in' ( in 32-element array of block{ in highp 4-component vector of float Position gl_Position,  in highp float PointSize gl_PointSize,  in highp 4-component vector of float gl_SecondaryPositionNV,  in implicitly-sized array of highp 4-component vector of float gl_PositionPerViewNV})
+0:36            direct index ( temp block{ in highp 4-component vector of float Position gl_Position,  in highp float PointSize gl_PointSize,  in highp 4-component vector of float gl_SecondaryPositionNV,  in unsized 1-element array of highp 4-component vector of float gl_PositionPerViewNV})
+0:36              'gl_in' ( in 32-element array of block{ in highp 4-component vector of float Position gl_Position,  in highp float PointSize gl_PointSize,  in highp 4-component vector of float gl_SecondaryPositionNV,  in unsized 1-element array of highp 4-component vector of float gl_PositionPerViewNV})
 0:36              Constant:
 0:36                1 (const int)
 0:36            Constant:
@@ -88,8 +86,8 @@
 0:37        move second child to first child ( temp highp float)
 0:37          'ps' ( temp highp float)
 0:37          gl_PointSize: direct index for structure ( in highp float PointSize)
-0:37            direct index ( temp block{ in highp 4-component vector of float Position gl_Position,  in highp float PointSize gl_PointSize,  in highp 4-component vector of float gl_SecondaryPositionNV,  in implicitly-sized array of highp 4-component vector of float gl_PositionPerViewNV})
-0:37              'gl_in' ( in 32-element array of block{ in highp 4-component vector of float Position gl_Position,  in highp float PointSize gl_PointSize,  in highp 4-component vector of float gl_SecondaryPositionNV,  in implicitly-sized array of highp 4-component vector of float gl_PositionPerViewNV})
+0:37            direct index ( temp block{ in highp 4-component vector of float Position gl_Position,  in highp float PointSize gl_PointSize,  in highp 4-component vector of float gl_SecondaryPositionNV,  in unsized 1-element array of highp 4-component vector of float gl_PositionPerViewNV})
+0:37              'gl_in' ( in 32-element array of block{ in highp 4-component vector of float Position gl_Position,  in highp float PointSize gl_PointSize,  in highp 4-component vector of float gl_SecondaryPositionNV,  in unsized 1-element array of highp 4-component vector of float gl_PositionPerViewNV})
 0:37              Constant:
 0:37                1 (const int)
 0:37            Constant:
diff --git a/Test/baseResults/310.vert.out b/Test/baseResults/310.vert.out
index 6d4599c..baf0987 100644
--- a/Test/baseResults/310.vert.out
+++ b/Test/baseResults/310.vert.out
@@ -1,5 +1,4 @@
 310.vert
-Warning, version 310 is not yet complete; most version-specific features are present, but some are missing.
 ERROR: 0:3: 'shared' : not supported in this stage: vertex
 ERROR: 0:4: 'local_size_x' : there is no such layout identifier for this stage taking an assigned value 
 ERROR: 0:5: 'buffer' : buffers can be declared only as blocks 
@@ -16,7 +15,7 @@
 ERROR: 0:79: 'vertex-shader array-of-struct output' : not supported with this profile: es
 ERROR: 0:81: 'vertex-shader struct output containing an array' : not supported with this profile: es
 ERROR: 0:83: 'vertex-shader struct output containing structure' : not supported with this profile: es
-ERROR: 0:85: 'std430' : requires the 'buffer' storage qualifier 
+ERROR: 0:85: 'std430 requires the buffer storage qualifier' : required extension not requested: GL_EXT_scalar_block_layout
 ERROR: 0:97: 's' : member of block cannot be or contain a sampler, image, or atomic_uint type 
 ERROR: 0:105: 'location' : overlapping use of location 12
 ERROR: 0:107: 'input block' : not supported in this stage: vertex
diff --git a/Test/baseResults/310AofA.vert.out b/Test/baseResults/310AofA.vert.out
index ffba25f..451cc0b 100644
--- a/Test/baseResults/310AofA.vert.out
+++ b/Test/baseResults/310AofA.vert.out
@@ -1,5 +1,4 @@
 310AofA.vert
-Warning, version 310 is not yet complete; most version-specific features are present, but some are missing.
 ERROR: 0:17: '' : array size required 
 ERROR: 0:23: '' : array size required 
 ERROR: 0:28: '[]' : only outermost dimension of an array of arrays can be implicitly sized 
@@ -8,12 +7,12 @@
 ERROR: 0:49: 'constructor' : array constructor argument not correct type to construct array element 
 ERROR: 0:62: '[' :  array index out of range '4'
 ERROR: 0:78: 'assign' :  cannot convert from ' global 4-element array of 7-element array of highp float' to ' global 5-element array of 7-element array of highp float'
-ERROR: 0:79: 'assign' :  cannot convert from ' global 4-element array of 7-element array of highp float' to ' global implicitly-sized array of 7-element array of highp float'
+ERROR: 0:79: 'assign' :  cannot convert from ' global 4-element array of 7-element array of highp float' to ' global unsized 1-element array of 7-element array of highp float'
 ERROR: 0:81: 'foo' : no matching overloaded function found 
 ERROR: 0:86: '==' :  wrong operand types: no operation '==' exists that takes a left-hand operand of type ' global 4-element array of 7-element array of highp float' and a right operand of type ' global 5-element array of 7-element array of highp float' (or there is no acceptable conversion)
 ERROR: 0:90: '[' :  array index out of range '5'
 ERROR: 0:94: '[' :  index out of range '-1'
-ERROR: 0:96: 'assign' :  cannot convert from ' temp 3-element array of highp 4-component vector of float' to 'layout( column_major shared) buffer implicitly-sized array of highp 4-component vector of float'
+ERROR: 0:96: 'assign' :  cannot convert from ' temp 3-element array of highp 4-component vector of float' to 'layout( column_major shared) buffer unsized 2-element array of highp 4-component vector of float'
 ERROR: 0:103: '' : array size required 
 ERROR: 0:104: '' : array size required 
 ERROR: 0:105: '' : array size required 
@@ -246,7 +245,7 @@
 0:77        Function Call: foo(f1[5][7]; ( global 4-element array of 7-element array of highp float)
 0:77          'g5' ( global 5-element array of 7-element array of highp float)
 0:78      'g5' ( global 5-element array of 7-element array of highp float)
-0:79      'gu' ( global implicitly-sized array of 7-element array of highp float)
+0:79      'gu' ( global unsized 1-element array of 7-element array of highp float)
 0:81      Constant:
 0:81        0.000000
 0:82      Function Call: bar(f1[5][7]; ( global void)
@@ -276,9 +275,9 @@
 0:91      Function Call: foo(f1[5][7]; ( global 4-element array of 7-element array of highp float)
 0:91        'u' ( temp 5-element array of 7-element array of highp float)
 0:94      direct index (layout( column_major shared) temp highp 4-component vector of float)
-0:94        v: direct index for structure (layout( column_major shared) buffer implicitly-sized array of highp 4-component vector of float)
-0:94          direct index (layout( column_major shared) temp block{layout( column_major shared) buffer implicitly-sized array of highp float u, layout( column_major shared) buffer implicitly-sized array of highp 4-component vector of float v})
-0:94            'name' (layout( column_major shared) buffer 3-element array of block{layout( column_major shared) buffer implicitly-sized array of highp float u, layout( column_major shared) buffer implicitly-sized array of highp 4-component vector of float v})
+0:94        v: direct index for structure (layout( column_major shared) buffer unsized 2-element array of highp 4-component vector of float)
+0:94          direct index (layout( column_major shared) temp block{layout( column_major shared) buffer unsized 1-element array of highp float u, layout( column_major shared) buffer unsized 2-element array of highp 4-component vector of float v})
+0:94            'name' (layout( column_major shared) buffer 3-element array of block{layout( column_major shared) buffer unsized 1-element array of highp float u, layout( column_major shared) buffer unsized 2-element array of highp 4-component vector of float v})
 0:94            Constant:
 0:94              1 (const int)
 0:94          Constant:
@@ -287,9 +286,9 @@
 0:94          -1 (const int)
 0:95      move second child to first child ( temp highp 4-component vector of float)
 0:95        direct index (layout( column_major shared) temp highp 4-component vector of float)
-0:95          v: direct index for structure (layout( column_major shared) buffer implicitly-sized array of highp 4-component vector of float)
-0:95            direct index (layout( column_major shared) temp block{layout( column_major shared) buffer implicitly-sized array of highp float u, layout( column_major shared) buffer implicitly-sized array of highp 4-component vector of float v})
-0:95              'name' (layout( column_major shared) buffer 3-element array of block{layout( column_major shared) buffer implicitly-sized array of highp float u, layout( column_major shared) buffer implicitly-sized array of highp 4-component vector of float v})
+0:95          v: direct index for structure (layout( column_major shared) buffer unsized 2-element array of highp 4-component vector of float)
+0:95            direct index (layout( column_major shared) temp block{layout( column_major shared) buffer unsized 1-element array of highp float u, layout( column_major shared) buffer unsized 2-element array of highp 4-component vector of float v})
+0:95              'name' (layout( column_major shared) buffer 3-element array of block{layout( column_major shared) buffer unsized 1-element array of highp float u, layout( column_major shared) buffer unsized 2-element array of highp 4-component vector of float v})
 0:95              Constant:
 0:95                1 (const int)
 0:95            Constant:
@@ -301,9 +300,9 @@
 0:95          4.300000
 0:95          4.300000
 0:95          4.300000
-0:96      v: direct index for structure (layout( column_major shared) buffer implicitly-sized array of highp 4-component vector of float)
-0:96        direct index (layout( column_major shared) temp block{layout( column_major shared) buffer implicitly-sized array of highp float u, layout( column_major shared) buffer implicitly-sized array of highp 4-component vector of float v})
-0:96          'name' (layout( column_major shared) buffer 3-element array of block{layout( column_major shared) buffer implicitly-sized array of highp float u, layout( column_major shared) buffer implicitly-sized array of highp 4-component vector of float v})
+0:96      v: direct index for structure (layout( column_major shared) buffer unsized 2-element array of highp 4-component vector of float)
+0:96        direct index (layout( column_major shared) temp block{layout( column_major shared) buffer unsized 1-element array of highp float u, layout( column_major shared) buffer unsized 2-element array of highp 4-component vector of float v})
+0:96          'name' (layout( column_major shared) buffer 3-element array of block{layout( column_major shared) buffer unsized 1-element array of highp float u, layout( column_major shared) buffer unsized 2-element array of highp 4-component vector of float v})
 0:96          Constant:
 0:96            1 (const int)
 0:96        Constant:
@@ -311,20 +310,39 @@
 0:98      Constant:
 0:98        7 (const int)
 0:99      array length ( temp int)
-0:99        v: direct index for structure (layout( column_major shared) buffer implicitly-sized array of 7-element array of highp 4-component vector of float)
-0:99          direct index (layout( column_major shared) temp block{layout( column_major shared) buffer highp float u, layout( column_major shared) buffer implicitly-sized array of 7-element array of highp 4-component vector of float v})
-0:99            'name3' (layout( column_major shared) buffer 3-element array of block{layout( column_major shared) buffer highp float u, layout( column_major shared) buffer implicitly-sized array of 7-element array of highp 4-component vector of float v})
+0:99        v: direct index for structure (layout( column_major shared) buffer unsized 2-element array of 7-element array of highp 4-component vector of float)
+0:99          direct index (layout( column_major shared) temp block{layout( column_major shared) buffer highp float u, layout( column_major shared) buffer unsized 2-element array of 7-element array of highp 4-component vector of float v})
+0:99            'name3' (layout( column_major shared) buffer 3-element array of block{layout( column_major shared) buffer highp float u, layout( column_major shared) buffer unsized 2-element array of 7-element array of highp 4-component vector of float v})
 0:99            Constant:
 0:99              0 (const int)
 0:99          Constant:
 0:99            1 (const int)
+0:117  Function Definition: func(mf33[3][2]; ( global highp 3-component vector of float)
+0:117    Function Parameters: 
+0:117      'x' ( in 3-element array of 2-element array of highp 3X3 matrix of float)
+0:119    Sequence
+0:119      Sequence
+0:119        move second child to first child ( temp highp 3X3 matrix of float)
+0:119          'a0' ( temp highp 3X3 matrix of float)
+0:119          direct index ( temp highp 3X3 matrix of float)
+0:119            direct index ( temp 2-element array of highp 3X3 matrix of float)
+0:119              'x' ( in 3-element array of 2-element array of highp 3X3 matrix of float)
+0:119              Constant:
+0:119                2 (const int)
+0:119            Constant:
+0:119              1 (const int)
+0:120      Branch: Return with expression
+0:120        direct index ( temp highp 3-component vector of float)
+0:120          'a0' ( temp highp 3X3 matrix of float)
+0:120          Constant:
+0:120            2 (const int)
 0:?   Linker Objects
-0:?     'name' (layout( column_major shared) buffer 3-element array of block{layout( column_major shared) buffer implicitly-sized array of highp float u, layout( column_major shared) buffer implicitly-sized array of highp 4-component vector of float v})
-0:?     'uname' (layout( column_major shared) uniform 3-element array of block{layout( column_major shared) uniform highp float u, layout( column_major shared) uniform implicitly-sized array of highp 4-component vector of float v})
-0:?     'name2' (layout( column_major shared) buffer 3-element array of block{layout( column_major shared) buffer highp float u, layout( column_major shared) buffer implicitly-sized array of implicitly-sized array of highp 4-component vector of float v})
-0:?     'name3' (layout( column_major shared) buffer 3-element array of block{layout( column_major shared) buffer highp float u, layout( column_major shared) buffer implicitly-sized array of 7-element array of highp 4-component vector of float v})
+0:?     'name' (layout( column_major shared) buffer 3-element array of block{layout( column_major shared) buffer unsized 1-element array of highp float u, layout( column_major shared) buffer unsized 2-element array of highp 4-component vector of float v})
+0:?     'uname' (layout( column_major shared) uniform 3-element array of block{layout( column_major shared) uniform highp float u, layout( column_major shared) uniform unsized 1-element array of highp 4-component vector of float v})
+0:?     'name2' (layout( column_major shared) buffer 3-element array of block{layout( column_major shared) buffer highp float u, layout( column_major shared) buffer unsized 1-element array of 1-element array of highp 4-component vector of float v})
+0:?     'name3' (layout( column_major shared) buffer 3-element array of block{layout( column_major shared) buffer highp float u, layout( column_major shared) buffer unsized 2-element array of 7-element array of highp 4-component vector of float v})
 0:?     'many' ( global 1-element array of 2-element array of 3-element array of 4-element array of 5-element array of 6-element array of highp float)
-0:?     'gu' ( global implicitly-sized array of 7-element array of highp float)
+0:?     'gu' ( global unsized 1-element array of 7-element array of highp float)
 0:?     'g4' ( global 4-element array of 7-element array of highp float)
 0:?     'g5' ( global 5-element array of 7-element array of highp float)
 0:?     'inArray' ( in 2-element array of 3-element array of highp float)
@@ -360,10 +378,10 @@
 0:13          2 (const uint)
 0:13        'd' ( temp 3-element array of 2-element array of highp int)
 0:?   Linker Objects
-0:?     'name' (layout( column_major shared) buffer 3-element array of block{layout( column_major shared) buffer implicitly-sized array of highp float u, layout( column_major shared) buffer implicitly-sized array of highp 4-component vector of float v})
+0:?     'name' (layout( column_major shared) buffer 3-element array of block{layout( column_major shared) buffer 1-element array of highp float u, layout( column_major shared) buffer unsized 2-element array of highp 4-component vector of float v})
 0:?     'uname' (layout( column_major shared) uniform 3-element array of block{layout( column_major shared) uniform highp float u, layout( column_major shared) uniform 1-element array of highp 4-component vector of float v})
-0:?     'name2' (layout( column_major shared) buffer 3-element array of block{layout( column_major shared) buffer highp float u, layout( column_major shared) buffer implicitly-sized array of implicitly-sized array of highp 4-component vector of float v})
-0:?     'name3' (layout( column_major shared) buffer 3-element array of block{layout( column_major shared) buffer highp float u, layout( column_major shared) buffer implicitly-sized array of 7-element array of highp 4-component vector of float v})
+0:?     'name2' (layout( column_major shared) buffer 3-element array of block{layout( column_major shared) buffer highp float u, layout( column_major shared) buffer unsized 1-element array of 1-element array of highp 4-component vector of float v})
+0:?     'name3' (layout( column_major shared) buffer 3-element array of block{layout( column_major shared) buffer highp float u, layout( column_major shared) buffer unsized 2-element array of 7-element array of highp 4-component vector of float v})
 0:?     'many' ( global 1-element array of 2-element array of 3-element array of 4-element array of 5-element array of 6-element array of highp float)
 0:?     'gu' ( global 1-element array of 7-element array of highp float)
 0:?     'g4' ( global 4-element array of 7-element array of highp float)
diff --git a/Test/baseResults/310implicitSizeArrayError.vert.out b/Test/baseResults/310implicitSizeArrayError.vert.out
index 07ac523..6975cde 100644
--- a/Test/baseResults/310implicitSizeArrayError.vert.out
+++ b/Test/baseResults/310implicitSizeArrayError.vert.out
@@ -1,5 +1,4 @@
 310implicitSizeArrayError.vert
-Warning, version 310 is not yet complete; most version-specific features are present, but some are missing.
 ERROR: 0:3: '' : array size required 
 ERROR: 1 compilation errors.  No code generated.
 
@@ -12,14 +11,14 @@
 0:7      move second child to first child ( temp highp int)
 0:7        'o' (layout( location=0) smooth out highp int)
 0:7        direct index (layout( column_major shared) temp highp int)
-0:7          a: direct index for structure (layout( column_major shared) uniform implicitly-sized array of highp int)
-0:7            'uni' (layout( location=0 column_major shared) uniform block{layout( column_major shared) uniform implicitly-sized array of highp int a})
+0:7          a: direct index for structure (layout( column_major shared) uniform unsized 3-element array of highp int)
+0:7            'uni' (layout( binding=0 column_major shared) uniform block{layout( column_major shared) uniform unsized 3-element array of highp int a})
 0:7            Constant:
 0:7              0 (const int)
 0:7          Constant:
 0:7            2 (const int)
 0:?   Linker Objects
-0:?     'uni' (layout( location=0 column_major shared) uniform block{layout( column_major shared) uniform implicitly-sized array of highp int a})
+0:?     'uni' (layout( binding=0 column_major shared) uniform block{layout( column_major shared) uniform unsized 3-element array of highp int a})
 0:?     'o' (layout( location=0) smooth out highp int)
 0:?     'gl_VertexID' ( gl_VertexId highp int VertexId)
 0:?     'gl_InstanceID' ( gl_InstanceId highp int InstanceId)
@@ -36,14 +35,14 @@
 0:7      move second child to first child ( temp highp int)
 0:7        'o' (layout( location=0) smooth out highp int)
 0:7        direct index (layout( column_major shared) temp highp int)
-0:7          a: direct index for structure (layout( column_major shared) uniform 1-element array of highp int)
-0:7            'uni' (layout( location=0 column_major shared) uniform block{layout( column_major shared) uniform 1-element array of highp int a})
+0:7          a: direct index for structure (layout( column_major shared) uniform 3-element array of highp int)
+0:7            'uni' (layout( binding=0 column_major shared) uniform block{layout( column_major shared) uniform 3-element array of highp int a})
 0:7            Constant:
 0:7              0 (const int)
 0:7          Constant:
 0:7            2 (const int)
 0:?   Linker Objects
-0:?     'uni' (layout( location=0 column_major shared) uniform block{layout( column_major shared) uniform 1-element array of highp int a})
+0:?     'uni' (layout( binding=0 column_major shared) uniform block{layout( column_major shared) uniform 3-element array of highp int a})
 0:?     'o' (layout( location=0) smooth out highp int)
 0:?     'gl_VertexID' ( gl_VertexId highp int VertexId)
 0:?     'gl_InstanceID' ( gl_InstanceId highp int InstanceId)
diff --git a/Test/baseResults/310runtimeArray.vert.out b/Test/baseResults/310runtimeArray.vert.out
new file mode 100644
index 0000000..84c731e
--- /dev/null
+++ b/Test/baseResults/310runtimeArray.vert.out
@@ -0,0 +1,145 @@
+310runtimeArray.vert
+ERROR: 0:9: '' : array size required 
+ERROR: 1 compilation errors.  No code generated.
+
+
+Shader version: 310
+ERROR: node is still EOpNull!
+0:12  Function Definition: main( ( global void)
+0:12    Function Parameters: 
+0:14    Sequence
+0:14      move second child to first child ( temp highp float)
+0:14        'o' (layout( location=0) smooth out highp float)
+0:14        f: direct index for structure ( global highp float)
+0:14          direct index (layout( column_major shared) temp structure{ global highp float f})
+0:14            s: direct index for structure (layout( column_major shared) buffer unsized 6-element array of structure{ global highp float f})
+0:14              'anon@0' (layout( column_major shared) buffer block{layout( column_major shared) buffer unsized 6-element array of structure{ global highp float f} s})
+0:14              Constant:
+0:14                0 (const uint)
+0:14            Constant:
+0:14              5 (const int)
+0:14          Constant:
+0:14            0 (const int)
+0:15      add second child into first child ( temp highp float)
+0:15        'o' (layout( location=0) smooth out highp float)
+0:15        f: direct index for structure ( global highp float)
+0:15          direct index (layout( column_major shared) temp structure{ global highp float f})
+0:15            s: direct index for structure (layout( column_major shared) buffer unsized 7-element array of structure{ global highp float f})
+0:15              'b2name' (layout( column_major shared) buffer block{layout( column_major shared) buffer unsized 7-element array of structure{ global highp float f} s})
+0:15              Constant:
+0:15                0 (const int)
+0:15            Constant:
+0:15              6 (const int)
+0:15          Constant:
+0:15            0 (const int)
+0:16      add second child into first child ( temp highp float)
+0:16        'o' (layout( location=0) smooth out highp float)
+0:16        f: direct index for structure ( global highp float)
+0:16          direct index (layout( column_major shared) temp structure{ global highp float f})
+0:16            s: direct index for structure (layout( column_major shared) buffer unsized 8-element array of structure{ global highp float f})
+0:16              direct index (layout( column_major shared) temp block{layout( column_major shared) buffer unsized 8-element array of structure{ global highp float f} s})
+0:16                'b3name' (layout( column_major shared) buffer unsized 4-element array of block{layout( column_major shared) buffer unsized 8-element array of structure{ global highp float f} s})
+0:16                Constant:
+0:16                  3 (const int)
+0:16              Constant:
+0:16                0 (const int)
+0:16            Constant:
+0:16              7 (const int)
+0:16          Constant:
+0:16            0 (const int)
+0:17      add second child into first child ( temp highp float)
+0:17        'o' (layout( location=0) smooth out highp float)
+0:17        f: direct index for structure ( global highp float)
+0:17          direct index (layout( column_major shared) temp structure{ global highp float f})
+0:17            s: direct index for structure (layout( column_major shared) buffer unsized 9-element array of structure{ global highp float f})
+0:17              direct index (layout( column_major shared) temp block{layout( column_major shared) buffer unsized 9-element array of structure{ global highp float f} s})
+0:17                'b4name' (layout( column_major shared) buffer 4-element array of block{layout( column_major shared) buffer unsized 9-element array of structure{ global highp float f} s})
+0:17                Constant:
+0:17                  2 (const int)
+0:17              Constant:
+0:17                0 (const int)
+0:17            Constant:
+0:17              8 (const int)
+0:17          Constant:
+0:17            0 (const int)
+0:?   Linker Objects
+0:?     'o' (layout( location=0) smooth out highp float)
+0:?     'anon@0' (layout( column_major shared) buffer block{layout( column_major shared) buffer unsized 6-element array of structure{ global highp float f} s})
+0:?     'b2name' (layout( column_major shared) buffer block{layout( column_major shared) buffer unsized 7-element array of structure{ global highp float f} s})
+0:?     'b3name' (layout( column_major shared) buffer unsized 4-element array of block{layout( column_major shared) buffer unsized 8-element array of structure{ global highp float f} s})
+0:?     'b4name' (layout( column_major shared) buffer 4-element array of block{layout( column_major shared) buffer unsized 9-element array of structure{ global highp float f} s})
+0:?     'gl_VertexID' ( gl_VertexId highp int VertexId)
+0:?     'gl_InstanceID' ( gl_InstanceId highp int InstanceId)
+
+
+Linked vertex stage:
+
+
+Shader version: 310
+ERROR: node is still EOpNull!
+0:12  Function Definition: main( ( global void)
+0:12    Function Parameters: 
+0:14    Sequence
+0:14      move second child to first child ( temp highp float)
+0:14        'o' (layout( location=0) smooth out highp float)
+0:14        f: direct index for structure ( global highp float)
+0:14          direct index (layout( column_major shared) temp structure{ global highp float f})
+0:14            s: direct index for structure (layout( column_major shared) buffer unsized 6-element array of structure{ global highp float f})
+0:14              'anon@0' (layout( column_major shared) buffer block{layout( column_major shared) buffer unsized 6-element array of structure{ global highp float f} s})
+0:14              Constant:
+0:14                0 (const uint)
+0:14            Constant:
+0:14              5 (const int)
+0:14          Constant:
+0:14            0 (const int)
+0:15      add second child into first child ( temp highp float)
+0:15        'o' (layout( location=0) smooth out highp float)
+0:15        f: direct index for structure ( global highp float)
+0:15          direct index (layout( column_major shared) temp structure{ global highp float f})
+0:15            s: direct index for structure (layout( column_major shared) buffer unsized 7-element array of structure{ global highp float f})
+0:15              'b2name' (layout( column_major shared) buffer block{layout( column_major shared) buffer unsized 7-element array of structure{ global highp float f} s})
+0:15              Constant:
+0:15                0 (const int)
+0:15            Constant:
+0:15              6 (const int)
+0:15          Constant:
+0:15            0 (const int)
+0:16      add second child into first child ( temp highp float)
+0:16        'o' (layout( location=0) smooth out highp float)
+0:16        f: direct index for structure ( global highp float)
+0:16          direct index (layout( column_major shared) temp structure{ global highp float f})
+0:16            s: direct index for structure (layout( column_major shared) buffer unsized 8-element array of structure{ global highp float f})
+0:16              direct index (layout( column_major shared) temp block{layout( column_major shared) buffer unsized 8-element array of structure{ global highp float f} s})
+0:16                'b3name' (layout( column_major shared) buffer 4-element array of block{layout( column_major shared) buffer unsized 8-element array of structure{ global highp float f} s})
+0:16                Constant:
+0:16                  3 (const int)
+0:16              Constant:
+0:16                0 (const int)
+0:16            Constant:
+0:16              7 (const int)
+0:16          Constant:
+0:16            0 (const int)
+0:17      add second child into first child ( temp highp float)
+0:17        'o' (layout( location=0) smooth out highp float)
+0:17        f: direct index for structure ( global highp float)
+0:17          direct index (layout( column_major shared) temp structure{ global highp float f})
+0:17            s: direct index for structure (layout( column_major shared) buffer unsized 9-element array of structure{ global highp float f})
+0:17              direct index (layout( column_major shared) temp block{layout( column_major shared) buffer unsized 9-element array of structure{ global highp float f} s})
+0:17                'b4name' (layout( column_major shared) buffer 4-element array of block{layout( column_major shared) buffer unsized 9-element array of structure{ global highp float f} s})
+0:17                Constant:
+0:17                  2 (const int)
+0:17              Constant:
+0:17                0 (const int)
+0:17            Constant:
+0:17              8 (const int)
+0:17          Constant:
+0:17            0 (const int)
+0:?   Linker Objects
+0:?     'o' (layout( location=0) smooth out highp float)
+0:?     'anon@0' (layout( column_major shared) buffer block{layout( column_major shared) buffer unsized 6-element array of structure{ global highp float f} s})
+0:?     'b2name' (layout( column_major shared) buffer block{layout( column_major shared) buffer unsized 7-element array of structure{ global highp float f} s})
+0:?     'b3name' (layout( column_major shared) buffer 4-element array of block{layout( column_major shared) buffer unsized 8-element array of structure{ global highp float f} s})
+0:?     'b4name' (layout( column_major shared) buffer 4-element array of block{layout( column_major shared) buffer unsized 9-element array of structure{ global highp float f} s})
+0:?     'gl_VertexID' ( gl_VertexId highp int VertexId)
+0:?     'gl_InstanceID' ( gl_InstanceId highp int InstanceId)
+
diff --git a/Test/baseResults/320.comp.out b/Test/baseResults/320.comp.out
new file mode 100644
index 0000000..09cedd0
--- /dev/null
+++ b/Test/baseResults/320.comp.out
@@ -0,0 +1,19 @@
+320.comp
+Shader version: 320
+local_size = (1, 1, 1)
+0:? Sequence
+0:3  Function Definition: main( ( global void)
+0:3    Function Parameters: 
+0:?   Linker Objects
+
+
+Linked compute stage:
+
+
+Shader version: 320
+local_size = (1, 1, 1)
+0:? Sequence
+0:3  Function Definition: main( ( global void)
+0:3    Function Parameters: 
+0:?   Linker Objects
+
diff --git a/Test/baseResults/320.frag.out b/Test/baseResults/320.frag.out
new file mode 100644
index 0000000..002aa7f
--- /dev/null
+++ b/Test/baseResults/320.frag.out
@@ -0,0 +1,576 @@
+320.frag
+ERROR: 0:3: 'output block' : not supported in this stage: fragment
+ERROR: 0:7: 'float' : type requires declaration of default precision qualifier 
+ERROR: 0:8: '' : cannot nest a structure definition inside a structure or block 
+ERROR: 0:16: 'location' : overlapping use of location 13
+ERROR: 0:18: 'inbname2' : Cannot reuse block name within the same interface: in
+ERROR: 0:23: 'badmember' : nameless block contains a member that already has a name at global scope 
+ERROR: 0:27: 'inbname' : redefinition 
+ERROR: 0:29: 'vAnon' : redefinition 
+ERROR: 0:43: 'origin_upper_left' : not supported with this profile: es
+ERROR: 0:43: 'pixel_center_integer' : not supported with this profile: es
+ERROR: 0:43: 'redeclaration' : cannot redeclare with different qualification: gl_FragCoord
+ERROR: 0:47: 'depth layout qualifier' : not supported with this profile: es
+ERROR: 0:51: 'assign' :  l-value required "gl_FragDepth" (can't modify gl_FragDepth if using early_fragment_tests)
+ERROR: 0:79: 'textureGatherOffsets(...)' : must be a compile-time constant: offsets argument
+ERROR: 0:124: 'rgba32f' : format requires readonly or writeonly memory qualifier 
+ERROR: 0:125: 'rgba8ui' : format requires readonly or writeonly memory qualifier 
+ERROR: 0:126: 'rgba16i' : format requires readonly or writeonly memory qualifier 
+ERROR: 0:152: 'imageAtomicMax' : only supported on image with format r32i or r32ui 
+ERROR: 0:153: 'imageAtomicMax' : only supported on image with format r32i or r32ui 
+ERROR: 0:154: 'imageAtomicExchange' : only supported on image with format r32f 
+ERROR: 0:157: 'centroid/sample/patch' : can't use auxiliary qualifier on a fragment output 
+ERROR: 0:158: 'flat/smooth/noperspective' : can't use interpolation qualifier on a fragment output 
+ERROR: 0:159: 'flat/smooth/noperspective' : can't use interpolation qualifier on a fragment output 
+ERROR: 0:160: 'noperspective' : Reserved word. 
+ERROR: 0:160: 'noperspective' : not supported for this version or the enabled extensions 
+ERROR: 0:160: 'flat/smooth/noperspective' : can't use interpolation qualifier on a fragment output 
+ERROR: 0:165: 'centroid/sample/patch' : can't use auxiliary qualifier on a fragment output 
+ERROR: 0:180: 'interpolateAtCentroid' : no matching overloaded function found 
+ERROR: 0:180: 'assign' :  cannot convert from ' const float' to ' temp mediump 3-component vector of float'
+ERROR: 0:182: 'interpolateAtCentroid' : first argument must be an interpolant, or interpolant-array element 
+ERROR: 0:184: 'interpolateAtSample' : no matching overloaded function found 
+ERROR: 0:184: 'assign' :  cannot convert from ' const float' to ' temp mediump 3-component vector of float'
+ERROR: 0:186: 'interpolateAtSample' : first argument must be an interpolant, or interpolant-array element 
+ERROR: 0:189: 'interpolateAtOffset' : no matching overloaded function found 
+ERROR: 0:189: 'assign' :  cannot convert from ' const float' to ' temp mediump 3-component vector of float'
+ERROR: 0:191: 'interpolateAtOffset' : first argument must be an interpolant, or interpolant-array element 
+ERROR: 0:192: 'interpolateAtOffset' : first argument must be an interpolant, or interpolant-array element 
+ERROR: 0:196: 'interpolateAtCentroid' : first argument must be an interpolant, or interpolant-array element 
+ERROR: 0:197: 'outp' : undeclared identifier 
+ERROR: 0:197: 'interpolateAtSample' : first argument must be an interpolant, or interpolant-array element 
+ERROR: 0:197: 'assign' :  cannot convert from ' global float' to ' temp mediump 4-component vector of float'
+ERROR: 0:217: 'blend equation' : can only apply to 'out' 
+ERROR: 0:218: 'blend equation' : can only apply to a standalone qualifier 
+ERROR: 0:219: 'blend equation' : can only apply to a standalone qualifier 
+ERROR: 0:220: 'blend equation' : can only apply to a standalone qualifier 
+ERROR: 0:221: 'blend equation' : can only apply to a standalone qualifier 
+ERROR: 0:222: 'blend equation' : can only apply to a standalone qualifier 
+ERROR: 0:223: 'blend_support' : unknown blend equation 
+ERROR: 0:225: 'fragment-shader array-of-array output' : not supported with this profile: es
+ERROR: 49 compilation errors.  No code generated.
+
+
+Shader version: 320
+gl_FragCoord pixel center is integer
+gl_FragCoord origin is upper left
+using early_fragment_tests
+using depth_any
+using blend_support_multiply blend_support_screen blend_support_overlay blend_support_darken blend_support_lighten blend_support_colordodge blend_support_colorburn blend_support_hardlight blend_support_softlight blend_support_difference blend_support_exclusion blend_support_hsl_hue blend_support_hsl_saturation blend_support_hsl_color blend_support_hsl_luminosity blend_support_all_equations
+ERROR: node is still EOpNull!
+0:35  Function Definition: fooIO( ( global void)
+0:35    Function Parameters: 
+0:37    Sequence
+0:37      Sequence
+0:37        move second child to first child ( temp mediump 4-component vector of float)
+0:37          'v' ( temp mediump 4-component vector of float)
+0:37          add ( temp mediump 4-component vector of float)
+0:37            v: direct index for structure ( in mediump 4-component vector of float)
+0:37              'inbinst' ( in block{ in mediump int a,  in mediump 4-component vector of float v,  in structure{ global mediump int b} s})
+0:37              Constant:
+0:37                1 (const int)
+0:37            vAnon: direct index for structure (layout( location=13) centroid in mediump 4-component vector of float)
+0:37              'anon@0' ( in block{layout( location=12) in mediump int aAnon, layout( location=13) centroid in mediump 4-component vector of float vAnon})
+0:37              Constant:
+0:37                1 (const uint)
+0:38      vector scale second child into first child ( temp mediump 4-component vector of float)
+0:38        'v' ( temp mediump 4-component vector of float)
+0:38        f: direct index for structure ( in mediump float)
+0:38          direct index ( temp block{ in mediump float f})
+0:38            'arrayedInst' ( in 4-element array of block{ in mediump float f})
+0:38            Constant:
+0:38              2 (const int)
+0:38          Constant:
+0:38            0 (const int)
+0:39      vector scale second child into first child ( temp mediump 4-component vector of float)
+0:39        'v' ( temp mediump 4-component vector of float)
+0:39        f: direct index for structure ( in mediump float)
+0:39          indirect index ( temp block{ in mediump float f})
+0:39            'arrayedInst' ( in 4-element array of block{ in mediump float f})
+0:39            'i' ( uniform mediump int)
+0:39          Constant:
+0:39            0 (const int)
+0:49  Function Definition: main( ( global void)
+0:49    Function Parameters: 
+0:51    Sequence
+0:51      move second child to first child ( temp highp float)
+0:51        'gl_FragDepth' ( gl_FragDepth highp float FragDepth)
+0:51        Constant:
+0:51          0.200000
+0:52      Sequence
+0:52        move second child to first child ( temp bool)
+0:52          'f' ( temp bool)
+0:52          'gl_FrontFacing' ( gl_FrontFacing bool Face)
+0:57  Function Definition: foo_GS( ( global void)
+0:57    Function Parameters: 
+0:59    Sequence
+0:59      Sequence
+0:59        move second child to first child ( temp highp int)
+0:59          'l' ( temp highp int)
+0:59          'gl_Layer' ( flat in highp int Layer)
+0:60      Sequence
+0:60        move second child to first child ( temp highp int)
+0:60          'p' ( temp highp int)
+0:60          'gl_PrimitiveID' ( flat in highp int PrimitiveID)
+0:73  Function Definition: pfoo( ( global void)
+0:73    Function Parameters: 
+0:?     Sequence
+0:76      move second child to first child ( temp mediump 2-component vector of float)
+0:76        'h' ( noContraction temp mediump 2-component vector of float)
+0:76        fma ( global mediump 2-component vector of float)
+0:76          'inf' ( smooth in mediump 2-component vector of float)
+0:76          'ing' ( smooth in mediump 2-component vector of float)
+0:76          'h' ( noContraction temp mediump 2-component vector of float)
+0:77      textureGatherOffset ( global lowp 4-component vector of float)
+0:77        direct index ( temp lowp sampler2D)
+0:77          'sArray' ( uniform 4-element array of lowp sampler2D)
+0:77          Constant:
+0:77            0 (const int)
+0:77        Constant:
+0:77          0.100000
+0:77          0.100000
+0:77        Convert float to int ( temp lowp 2-component vector of int)
+0:77          'inf' ( smooth in mediump 2-component vector of float)
+0:78      textureGatherOffsets ( global lowp 4-component vector of float, operation at mediump)
+0:78        direct index ( temp lowp sampler2D)
+0:78          'sArray' ( uniform 4-element array of lowp sampler2D)
+0:78          Constant:
+0:78            0 (const int)
+0:78        Constant:
+0:78          0.100000
+0:78          0.100000
+0:78        Constant:
+0:78          0 (const int)
+0:78          0 (const int)
+0:78          0 (const int)
+0:78          0 (const int)
+0:78          0 (const int)
+0:78          0 (const int)
+0:78          0 (const int)
+0:78          0 (const int)
+0:79      textureGatherOffsets ( global lowp 4-component vector of float, operation at mediump)
+0:79        direct index ( temp lowp sampler2D)
+0:79          'sArray' ( uniform 4-element array of lowp sampler2D)
+0:79          Constant:
+0:79            0 (const int)
+0:79        Constant:
+0:79          0.100000
+0:79          0.100000
+0:79        'offsets' ( uniform 4-element array of mediump 2-component vector of int)
+0:102  Function Definition: CAT( ( global void)
+0:102    Function Parameters: 
+0:104    Sequence
+0:104      Sequence
+0:104        move second child to first child ( temp highp 4-component vector of float)
+0:104          'b4' ( temp highp 4-component vector of float)
+0:104          texture ( global highp 4-component vector of float)
+0:104            'CA4' ( uniform highp samplerCubeArray)
+0:104            Constant:
+0:104              0.500000
+0:104              0.500000
+0:104              0.500000
+0:104              0.500000
+0:104            Constant:
+0:104              0.240000
+0:105      Sequence
+0:105        move second child to first child ( temp highp 4-component vector of int)
+0:105          'b6' ( temp highp 4-component vector of int)
+0:105          texture ( global highp 4-component vector of int)
+0:105            'CA6' ( uniform highp isamplerCubeArray)
+0:105            Constant:
+0:105              0.500000
+0:105              0.500000
+0:105              0.500000
+0:105              0.500000
+0:105            Constant:
+0:105              0.260000
+0:106      Sequence
+0:106        move second child to first child ( temp highp 4-component vector of uint)
+0:106          'b7' ( temp highp 4-component vector of uint)
+0:106          texture ( global highp 4-component vector of uint)
+0:106            'CA7' ( uniform highp usamplerCubeArray)
+0:106            Constant:
+0:106              0.500000
+0:106              0.500000
+0:106              0.500000
+0:106              0.500000
+0:106            Constant:
+0:106              0.270000
+0:109  Function Definition: goodSample( ( global void)
+0:109    Function Parameters: 
+0:111    Sequence
+0:111      Sequence
+0:111        move second child to first child ( temp lowp int)
+0:111          'a1' ( temp lowp int)
+0:111          'gl_SampleID' ( flat in lowp int SampleId)
+0:112      Sequence
+0:112        move second child to first child ( temp mediump 2-component vector of float)
+0:112          'a2' ( temp mediump 2-component vector of float)
+0:112          'gl_SamplePosition' ( smooth in mediump 2-component vector of float SamplePosition)
+0:113      Sequence
+0:113        move second child to first child ( temp highp int)
+0:113          'a3' ( temp highp int)
+0:113          direct index ( flat temp highp int SampleMaskIn)
+0:113            'gl_SampleMaskIn' ( flat in unsized 1-element array of highp int SampleMaskIn)
+0:113            Constant:
+0:113              0 (const int)
+0:114      move second child to first child ( temp highp int)
+0:114        direct index ( temp highp int SampleMaskIn)
+0:114          'gl_SampleMask' ( out unsized 1-element array of highp int SampleMaskIn)
+0:114          Constant:
+0:114            0 (const int)
+0:114        'a3' ( temp highp int)
+0:115      Sequence
+0:115        move second child to first child ( temp mediump int)
+0:115          'n1' ( temp mediump int)
+0:115          Constant:
+0:115            4 (const int)
+0:116      Sequence
+0:116        move second child to first child ( temp mediump int)
+0:116          'n2' ( temp mediump int)
+0:116          'gl_NumSamples' ( uniform lowp int)
+0:128  Function Definition: goodImageAtom( ( global void)
+0:128    Function Parameters: 
+0:?     Sequence
+0:134      imageAtomicAdd ( global highp int)
+0:134        'im2Di' (layout( r32i) uniform highp iimage2D)
+0:134        'P' ( uniform mediump 2-component vector of int)
+0:134        'dati' ( temp mediump int)
+0:135      imageAtomicAdd ( global highp uint)
+0:135        'im2Du' (layout( r32ui) uniform highp uimage2D)
+0:135        'P' ( uniform mediump 2-component vector of int)
+0:135        'datu' ( temp mediump uint)
+0:136      imageAtomicMin ( global highp int)
+0:136        'im2Di' (layout( r32i) uniform highp iimage2D)
+0:136        'P' ( uniform mediump 2-component vector of int)
+0:136        'dati' ( temp mediump int)
+0:137      imageAtomicMin ( global highp uint)
+0:137        'im2Du' (layout( r32ui) uniform highp uimage2D)
+0:137        'P' ( uniform mediump 2-component vector of int)
+0:137        'datu' ( temp mediump uint)
+0:138      imageAtomicMax ( global highp int)
+0:138        'im2Di' (layout( r32i) uniform highp iimage2D)
+0:138        'P' ( uniform mediump 2-component vector of int)
+0:138        'dati' ( temp mediump int)
+0:139      imageAtomicMax ( global highp uint)
+0:139        'im2Du' (layout( r32ui) uniform highp uimage2D)
+0:139        'P' ( uniform mediump 2-component vector of int)
+0:139        'datu' ( temp mediump uint)
+0:140      imageAtomicAnd ( global highp int)
+0:140        'im2Di' (layout( r32i) uniform highp iimage2D)
+0:140        'P' ( uniform mediump 2-component vector of int)
+0:140        'dati' ( temp mediump int)
+0:141      imageAtomicAnd ( global highp uint)
+0:141        'im2Du' (layout( r32ui) uniform highp uimage2D)
+0:141        'P' ( uniform mediump 2-component vector of int)
+0:141        'datu' ( temp mediump uint)
+0:142      imageAtomicOr ( global highp int)
+0:142        'im2Di' (layout( r32i) uniform highp iimage2D)
+0:142        'P' ( uniform mediump 2-component vector of int)
+0:142        'dati' ( temp mediump int)
+0:143      imageAtomicOr ( global highp uint)
+0:143        'im2Du' (layout( r32ui) uniform highp uimage2D)
+0:143        'P' ( uniform mediump 2-component vector of int)
+0:143        'datu' ( temp mediump uint)
+0:144      imageAtomicXor ( global highp int)
+0:144        'im2Di' (layout( r32i) uniform highp iimage2D)
+0:144        'P' ( uniform mediump 2-component vector of int)
+0:144        'dati' ( temp mediump int)
+0:145      imageAtomicXor ( global highp uint)
+0:145        'im2Du' (layout( r32ui) uniform highp uimage2D)
+0:145        'P' ( uniform mediump 2-component vector of int)
+0:145        'datu' ( temp mediump uint)
+0:146      imageAtomicExchange ( global highp int)
+0:146        'im2Di' (layout( r32i) uniform highp iimage2D)
+0:146        'P' ( uniform mediump 2-component vector of int)
+0:146        'dati' ( temp mediump int)
+0:147      imageAtomicExchange ( global highp uint)
+0:147        'im2Du' (layout( r32ui) uniform highp uimage2D)
+0:147        'P' ( uniform mediump 2-component vector of int)
+0:147        'datu' ( temp mediump uint)
+0:148      imageAtomicExchange ( global highp float)
+0:148        'im2Df' (layout( r32f) uniform highp image2D)
+0:148        'P' ( uniform mediump 2-component vector of int)
+0:148        'datf' ( temp mediump float)
+0:149      imageAtomicCompSwap ( global highp int)
+0:149        'im2Di' (layout( r32i) uniform highp iimage2D)
+0:149        'P' ( uniform mediump 2-component vector of int)
+0:149        Constant:
+0:149          3 (const int)
+0:149        'dati' ( temp mediump int)
+0:150      imageAtomicCompSwap ( global highp uint)
+0:150        'im2Du' (layout( r32ui) uniform highp uimage2D)
+0:150        'P' ( uniform mediump 2-component vector of int)
+0:150        Constant:
+0:150          5 (const uint)
+0:150        'datu' ( temp mediump uint)
+0:152      imageAtomicMax ( global highp int)
+0:152        'badIm2Di' (layout( rgba16i) uniform highp iimage2D)
+0:152        'P' ( uniform mediump 2-component vector of int)
+0:152        'dati' ( temp mediump int)
+0:153      imageAtomicMax ( global highp uint)
+0:153        'badIm2Du' (layout( rgba8ui) uniform highp uimage2D)
+0:153        'P' ( uniform mediump 2-component vector of int)
+0:153        'datu' ( temp mediump uint)
+0:154      imageAtomicExchange ( global highp float)
+0:154        'badIm2Df' (layout( rgba32f) uniform highp image2D)
+0:154        'P' ( uniform mediump 2-component vector of int)
+0:154        'datf' ( temp mediump float)
+0:169  Function Definition: interp( ( global void)
+0:169    Function Parameters: 
+0:?     Sequence
+0:176      move second child to first child ( temp mediump 2-component vector of float)
+0:176        'res2' ( temp mediump 2-component vector of float)
+0:176        interpolateAtCentroid ( global mediump 2-component vector of float)
+0:176          'colorfc' ( centroid flat in mediump 2-component vector of float)
+0:177      move second child to first child ( temp mediump 4-component vector of float)
+0:177        'res4' ( temp mediump 4-component vector of float)
+0:177        interpolateAtCentroid ( global mediump 4-component vector of float)
+0:177          'colorSampIn' ( smooth sample in mediump 4-component vector of float)
+0:178      move second child to first child ( temp mediump 4-component vector of float)
+0:178        'res4' ( temp mediump 4-component vector of float)
+0:178        interpolateAtCentroid ( global mediump 4-component vector of float)
+0:178          'colorfsi' ( flat sample in mediump 4-component vector of float)
+0:179      move second child to first child ( temp mediump float)
+0:179        'res' ( temp mediump float)
+0:179        interpolateAtCentroid ( global mediump float)
+0:179          'scalarIn' ( smooth in mediump float)
+0:180      'res3' ( temp mediump 3-component vector of float)
+0:181      move second child to first child ( temp mediump 3-component vector of float)
+0:181        'res3' ( temp mediump 3-component vector of float)
+0:181        interpolateAtCentroid ( global mediump 3-component vector of float)
+0:181          direct index ( smooth sample temp mediump 3-component vector of float)
+0:181            'sampInArray' ( smooth sample in 4-element array of mediump 3-component vector of float)
+0:181            Constant:
+0:181              2 (const int)
+0:182      move second child to first child ( temp mediump 2-component vector of float)
+0:182        'res2' ( temp mediump 2-component vector of float)
+0:182        interpolateAtCentroid ( global mediump 2-component vector of float)
+0:182          vector swizzle ( temp mediump 2-component vector of float)
+0:182            direct index ( smooth sample temp mediump 3-component vector of float)
+0:182              'sampInArray' ( smooth sample in 4-element array of mediump 3-component vector of float)
+0:182              Constant:
+0:182                2 (const int)
+0:182            Sequence
+0:182              Constant:
+0:182                0 (const int)
+0:182              Constant:
+0:182                1 (const int)
+0:184      'res3' ( temp mediump 3-component vector of float)
+0:185      move second child to first child ( temp mediump 3-component vector of float)
+0:185        'res3' ( temp mediump 3-component vector of float)
+0:185        interpolateAtSample ( global mediump 3-component vector of float)
+0:185          indirect index ( smooth sample temp mediump 3-component vector of float)
+0:185            'sampInArray' ( smooth sample in 4-element array of mediump 3-component vector of float)
+0:185            'i' ( uniform mediump int)
+0:185          Constant:
+0:185            0 (const int)
+0:186      move second child to first child ( temp mediump 2-component vector of float)
+0:186        'res2' ( temp mediump 2-component vector of float)
+0:186        interpolateAtSample ( global mediump 2-component vector of float)
+0:186          vector swizzle ( temp mediump 2-component vector of float)
+0:186            direct index ( smooth sample temp mediump 3-component vector of float)
+0:186              'sampInArray' ( smooth sample in 4-element array of mediump 3-component vector of float)
+0:186              Constant:
+0:186                2 (const int)
+0:186            Sequence
+0:186              Constant:
+0:186                0 (const int)
+0:186              Constant:
+0:186                1 (const int)
+0:186          Constant:
+0:186            2 (const int)
+0:187      move second child to first child ( temp mediump float)
+0:187        'res' ( temp mediump float)
+0:187        interpolateAtSample ( global mediump float)
+0:187          'scalarIn' ( smooth in mediump float)
+0:187          Constant:
+0:187            1 (const int)
+0:189      'res3' ( temp mediump 3-component vector of float)
+0:190      move second child to first child ( temp mediump 3-component vector of float)
+0:190        'res3' ( temp mediump 3-component vector of float)
+0:190        interpolateAtOffset ( global mediump 3-component vector of float)
+0:190          direct index ( smooth sample temp mediump 3-component vector of float)
+0:190            'sampInArray' ( smooth sample in 4-element array of mediump 3-component vector of float)
+0:190            Constant:
+0:190              2 (const int)
+0:190          Constant:
+0:190            0.200000
+0:190            0.200000
+0:191      move second child to first child ( temp mediump 2-component vector of float)
+0:191        'res2' ( temp mediump 2-component vector of float)
+0:191        interpolateAtOffset ( global mediump 2-component vector of float)
+0:191          vector swizzle ( temp mediump 2-component vector of float)
+0:191            direct index ( smooth sample temp mediump 3-component vector of float)
+0:191              'sampInArray' ( smooth sample in 4-element array of mediump 3-component vector of float)
+0:191              Constant:
+0:191                2 (const int)
+0:191            Sequence
+0:191              Constant:
+0:191                0 (const int)
+0:191              Constant:
+0:191                1 (const int)
+0:191          Constant:
+0:191            0.200000
+0:191            0.200000
+0:192      move second child to first child ( temp mediump float)
+0:192        'res' ( temp mediump float)
+0:192        interpolateAtOffset ( global mediump float)
+0:192          add ( temp mediump float)
+0:192            'scalarIn' ( smooth in mediump float)
+0:192            'scalarIn' ( smooth in mediump float)
+0:192          Constant:
+0:192            0.200000
+0:192            0.200000
+0:193      move second child to first child ( temp mediump float)
+0:193        'res' ( temp mediump float)
+0:193        interpolateAtOffset ( global mediump float)
+0:193          'scalarIn' ( smooth in mediump float)
+0:193          Constant:
+0:193            0.200000
+0:193            0.200000
+0:196      move second child to first child ( temp mediump float)
+0:196        'res' ( temp mediump float)
+0:196        interpolateAtCentroid ( global mediump float)
+0:196          'f' ( temp mediump float)
+0:197      'res4' ( temp mediump 4-component vector of float)
+0:221  Function Definition: blendFoo( ( temp void)
+0:221    Function Parameters: 
+0:222  Function Definition: blendFoo(vf3; ( global void)
+0:222    Function Parameters: 
+0:222      'v' ( in mediump 3-component vector of float)
+0:?   Linker Objects
+0:?     'outbinst' ( out block{ out mediump int a})
+0:?     'inbinst' ( in block{ in mediump int a,  in mediump 4-component vector of float v,  in structure{ global mediump int b} s})
+0:?     'anon@0' ( in block{layout( location=12) in mediump int aAnon, layout( location=13) centroid in mediump 4-component vector of float vAnon})
+0:?     'aliased' (layout( location=13) smooth in mediump 4-component vector of float)
+0:?     'arrayedInst' ( in 4-element array of block{ in mediump float f})
+0:?     'i' ( uniform mediump int)
+0:?     'gl_FragCoord' ( gl_FragCoord highp 4-component vector of float FragCoord)
+0:?     'gl_FragDepth' ( gl_FragDepth highp float FragDepth)
+0:?     'inf' ( smooth in mediump 2-component vector of float)
+0:?     'ing' ( smooth in mediump 2-component vector of float)
+0:?     'offsets' ( uniform 4-element array of mediump 2-component vector of int)
+0:?     'sArray' ( uniform 4-element array of lowp sampler2D)
+0:?     'sIndex' ( uniform mediump int)
+0:?     'auArray' (layout( binding=0 offset=0) uniform 2-element array of highp atomic_uint)
+0:?     'ubInst' (layout( column_major shared) uniform 4-element array of block{layout( column_major shared) uniform mediump int i})
+0:?     'bbInst' (layout( column_major shared) buffer 4-element array of block{layout( column_major shared) buffer mediump int i})
+0:?     'iArray' ( writeonly uniform 5-element array of highp image2D)
+0:?     'constOffsets' ( const 4-element array of mediump 2-component vector of int)
+0:?       0 (const int)
+0:?       0 (const int)
+0:?       0 (const int)
+0:?       0 (const int)
+0:?       0 (const int)
+0:?       0 (const int)
+0:?       0 (const int)
+0:?       0 (const int)
+0:?     'CA1' ( writeonly uniform highp imageCubeArray)
+0:?     'CA2' ( writeonly uniform highp iimageCubeArray)
+0:?     'CA3' ( writeonly uniform highp uimageCubeArray)
+0:?     'CA4' ( uniform highp samplerCubeArray)
+0:?     'CA5' ( uniform highp samplerCubeArrayShadow)
+0:?     'CA6' ( uniform highp isamplerCubeArray)
+0:?     'CA7' ( uniform highp usamplerCubeArray)
+0:?     'gl_SampleMaskIn' ( flat in unsized 1-element array of highp int SampleMaskIn)
+0:?     'gl_SampleMask' ( out unsized 1-element array of highp int SampleMaskIn)
+0:?     'im2Df' (layout( r32f) uniform highp image2D)
+0:?     'im2Du' (layout( r32ui) uniform highp uimage2D)
+0:?     'im2Di' (layout( r32i) uniform highp iimage2D)
+0:?     'P' ( uniform mediump 2-component vector of int)
+0:?     'badIm2Df' (layout( rgba32f) uniform highp image2D)
+0:?     'badIm2Du' (layout( rgba8ui) uniform highp uimage2D)
+0:?     'badIm2Di' (layout( rgba16i) uniform highp iimage2D)
+0:?     'colorCentroidBad' ( centroid out mediump 4-component vector of float)
+0:?     'colorBadFlat' ( flat out mediump 4-component vector of float)
+0:?     'colorBadSmooth' ( smooth out mediump 4-component vector of float)
+0:?     'colorBadNo' ( noperspective out mediump 4-component vector of float)
+0:?     'colorfc' ( centroid flat in mediump 2-component vector of float)
+0:?     'scalarIn' ( smooth in mediump float)
+0:?     'colorSampIn' ( smooth sample in mediump 4-component vector of float)
+0:?     'colorSampleBad' ( sample out mediump 4-component vector of float)
+0:?     'colorfsi' ( flat sample in mediump 4-component vector of float)
+0:?     'sampInArray' ( smooth sample in 4-element array of mediump 3-component vector of float)
+0:?     'badout' ( out mediump 4-component vector of float)
+0:?     'outAA' ( out 2-element array of 2-element array of mediump 4-component vector of float)
+
+
+Linked fragment stage:
+
+ERROR: Linking fragment stage: when more than one fragment shader output, all must have location qualifiers
+
+Shader version: 320
+gl_FragCoord pixel center is integer
+gl_FragCoord origin is upper left
+using early_fragment_tests
+using depth_any
+using blend_support_multiply blend_support_screen blend_support_overlay blend_support_darken blend_support_lighten blend_support_colordodge blend_support_colorburn blend_support_hardlight blend_support_softlight blend_support_difference blend_support_exclusion blend_support_hsl_hue blend_support_hsl_saturation blend_support_hsl_color blend_support_hsl_luminosity blend_support_all_equations
+ERROR: node is still EOpNull!
+0:49  Function Definition: main( ( global void)
+0:49    Function Parameters: 
+0:51    Sequence
+0:51      move second child to first child ( temp highp float)
+0:51        'gl_FragDepth' ( gl_FragDepth highp float FragDepth)
+0:51        Constant:
+0:51          0.200000
+0:52      Sequence
+0:52        move second child to first child ( temp bool)
+0:52          'f' ( temp bool)
+0:52          'gl_FrontFacing' ( gl_FrontFacing bool Face)
+0:?   Linker Objects
+0:?     'outbinst' ( out block{ out mediump int a})
+0:?     'inbinst' ( in block{ in mediump int a,  in mediump 4-component vector of float v,  in structure{ global mediump int b} s})
+0:?     'anon@0' ( in block{layout( location=12) in mediump int aAnon, layout( location=13) centroid in mediump 4-component vector of float vAnon})
+0:?     'aliased' (layout( location=13) smooth in mediump 4-component vector of float)
+0:?     'arrayedInst' ( in 4-element array of block{ in mediump float f})
+0:?     'i' ( uniform mediump int)
+0:?     'gl_FragCoord' ( gl_FragCoord highp 4-component vector of float FragCoord)
+0:?     'gl_FragDepth' ( gl_FragDepth highp float FragDepth)
+0:?     'inf' ( smooth in mediump 2-component vector of float)
+0:?     'ing' ( smooth in mediump 2-component vector of float)
+0:?     'offsets' ( uniform 4-element array of mediump 2-component vector of int)
+0:?     'sArray' ( uniform 4-element array of lowp sampler2D)
+0:?     'sIndex' ( uniform mediump int)
+0:?     'auArray' (layout( binding=0 offset=0) uniform 2-element array of highp atomic_uint)
+0:?     'ubInst' (layout( column_major shared) uniform 4-element array of block{layout( column_major shared) uniform mediump int i})
+0:?     'bbInst' (layout( column_major shared) buffer 4-element array of block{layout( column_major shared) buffer mediump int i})
+0:?     'iArray' ( writeonly uniform 5-element array of highp image2D)
+0:?     'constOffsets' ( const 4-element array of mediump 2-component vector of int)
+0:?       0 (const int)
+0:?       0 (const int)
+0:?       0 (const int)
+0:?       0 (const int)
+0:?       0 (const int)
+0:?       0 (const int)
+0:?       0 (const int)
+0:?       0 (const int)
+0:?     'CA1' ( writeonly uniform highp imageCubeArray)
+0:?     'CA2' ( writeonly uniform highp iimageCubeArray)
+0:?     'CA3' ( writeonly uniform highp uimageCubeArray)
+0:?     'CA4' ( uniform highp samplerCubeArray)
+0:?     'CA5' ( uniform highp samplerCubeArrayShadow)
+0:?     'CA6' ( uniform highp isamplerCubeArray)
+0:?     'CA7' ( uniform highp usamplerCubeArray)
+0:?     'gl_SampleMaskIn' ( flat in 1-element array of highp int SampleMaskIn)
+0:?     'gl_SampleMask' ( out 1-element array of highp int SampleMaskIn)
+0:?     'im2Df' (layout( r32f) uniform highp image2D)
+0:?     'im2Du' (layout( r32ui) uniform highp uimage2D)
+0:?     'im2Di' (layout( r32i) uniform highp iimage2D)
+0:?     'P' ( uniform mediump 2-component vector of int)
+0:?     'badIm2Df' (layout( rgba32f) uniform highp image2D)
+0:?     'badIm2Du' (layout( rgba8ui) uniform highp uimage2D)
+0:?     'badIm2Di' (layout( rgba16i) uniform highp iimage2D)
+0:?     'colorCentroidBad' ( centroid out mediump 4-component vector of float)
+0:?     'colorBadFlat' ( flat out mediump 4-component vector of float)
+0:?     'colorBadSmooth' ( smooth out mediump 4-component vector of float)
+0:?     'colorBadNo' ( noperspective out mediump 4-component vector of float)
+0:?     'colorfc' ( centroid flat in mediump 2-component vector of float)
+0:?     'scalarIn' ( smooth in mediump float)
+0:?     'colorSampIn' ( smooth sample in mediump 4-component vector of float)
+0:?     'colorSampleBad' ( sample out mediump 4-component vector of float)
+0:?     'colorfsi' ( flat sample in mediump 4-component vector of float)
+0:?     'sampInArray' ( smooth sample in 4-element array of mediump 3-component vector of float)
+0:?     'badout' ( out mediump 4-component vector of float)
+0:?     'outAA' ( out 2-element array of 2-element array of mediump 4-component vector of float)
+
diff --git a/Test/baseResults/320.geom.out b/Test/baseResults/320.geom.out
new file mode 100644
index 0000000..f333766
--- /dev/null
+++ b/Test/baseResults/320.geom.out
@@ -0,0 +1,251 @@
+320.geom
+ERROR: 0:19: 'fromVertex' : block instance name redefinition 
+ERROR: 0:23: 'fromVertex' : redefinition 
+ERROR: 0:25: 'fooC' : block instance name redefinition 
+ERROR: 0:33: 'EmitStreamVertex' : no matching overloaded function found 
+ERROR: 0:34: 'EndStreamPrimitive' : no matching overloaded function found 
+ERROR: 0:37: 'gl_ClipDistance' : undeclared identifier 
+ERROR: 0:37: 'gl_ClipDistance' :  left of '[' is not of type array, matrix, or vector  
+ERROR: 0:38: 'gl_ClipDistance' : no such field in structure 
+ERROR: 0:38: 'expression' :  left of '[' is not of type array, matrix, or vector  
+ERROR: 0:37: 'assign' :  l-value required (can't modify a const)
+ERROR: 0:45: 'selecting output stream' : not supported with this profile: es
+ERROR: 0:52: 'max_vertices' : too large, must be less than gl_MaxGeometryOutputVertices 
+ERROR: 0:52: 'max_vertices' : cannot change previously set layout value 
+ERROR: 0:53: 'max_vertices' : can only apply to a standalone qualifier 
+ERROR: 0:58: 'points' : cannot change previously set output primitive 
+ERROR: 0:59: 'points' : cannot change previously set output primitive 
+ERROR: 0:60: 'triangle_strip' : cannot apply to input 
+ERROR: 0:61: 'triangle_strip' : cannot apply to: uniform
+ERROR: 0:62: 'triangle_strip' : can only apply to a standalone qualifier 
+ERROR: 0:63: 'triangle_strip' : can only apply to a standalone qualifier 
+ERROR: 0:64: 'invocations' : can only apply to a standalone qualifier 
+ERROR: 0:66: 'invocations' : can only apply to a standalone qualifier 
+ERROR: 0:67: 'max_vertices' : can only apply to a standalone qualifier 
+ERROR: 0:68: 'triangle_strip' : can only apply to a standalone qualifier 
+ERROR: 0:71: 'lines' : cannot apply to 'out' 
+ERROR: 0:73: 'triangles' : cannot change previously set input primitive 
+ERROR: 0:74: 'triangles_adjacency' : cannot change previously set input primitive 
+ERROR: 0:106: 'gl_ViewportIndex' : undeclared identifier 
+ERROR: 0:107: 'gl_MaxViewports' : undeclared identifier 
+ERROR: 0:113: 'lines_adjacency' : inconsistent input primitive for array size of explArrayBad
+ERROR: 0:114: 'in' : type must be an array: nonArrayed
+ERROR: 0:122: 'component' : not supported with this profile: es
+ERROR: 0:126: 'gl_MaxGeometryVaryingComponents' : undeclared identifier 
+ERROR: 0:127: 'gl_VerticesIn' : undeclared identifier 
+ERROR: 0:132: 'gl_PointSize' : required extension not requested: Possible extensions include:
+GL_EXT_geometry_point_size
+GL_OES_geometry_point_size
+ERROR: 0:133: 'gl_PointSize' : required extension not requested: Possible extensions include:
+GL_EXT_geometry_point_size
+GL_OES_geometry_point_size
+ERROR: 36 compilation errors.  No code generated.
+
+
+Shader version: 320
+invocations = 4
+max_vertices = 200
+input primitive = lines_adjacency
+output primitive = triangle_strip
+ERROR: node is still EOpNull!
+0:29  Function Definition: main( ( global void)
+0:29    Function Parameters: 
+0:31    Sequence
+0:31      EmitVertex ( global void)
+0:32      EndPrimitive ( global void)
+0:33      Constant:
+0:33        0.000000
+0:34      Constant:
+0:34        0.000000
+0:36      move second child to first child ( temp mediump 3-component vector of float)
+0:36        color: direct index for structure (layout( stream=0) out mediump 3-component vector of float)
+0:36          'anon@0' (layout( stream=0) out block{layout( stream=0) out mediump 3-component vector of float color})
+0:36          Constant:
+0:36            0 (const uint)
+0:36        color: direct index for structure ( in mediump 3-component vector of float)
+0:36          direct index ( temp block{ in mediump 3-component vector of float color})
+0:36            'fromV' ( in 4-element array of block{ in mediump 3-component vector of float color})
+0:36            Constant:
+0:36              0 (const int)
+0:36          Constant:
+0:36            0 (const int)
+0:37      move second child to first child ( temp float)
+0:37        Constant:
+0:37          0.000000
+0:38        Constant:
+0:38          0.000000
+0:39      move second child to first child ( temp highp 4-component vector of float)
+0:39        gl_Position: direct index for structure (layout( stream=0) gl_Position highp 4-component vector of float Position)
+0:39          'anon@1' (layout( stream=0) out block{layout( stream=0) gl_Position highp 4-component vector of float Position gl_Position, layout( stream=0) gl_PointSize highp float PointSize gl_PointSize})
+0:39          Constant:
+0:39            0 (const uint)
+0:39        gl_Position: direct index for structure ( in highp 4-component vector of float Position)
+0:39          direct index ( temp block{ in highp 4-component vector of float Position gl_Position,  in highp float PointSize gl_PointSize})
+0:39            'gl_in' ( in 4-element array of block{ in highp 4-component vector of float Position gl_Position,  in highp float PointSize gl_PointSize})
+0:39            Constant:
+0:39              0 (const int)
+0:39          Constant:
+0:39            0 (const int)
+0:41      move second child to first child ( temp highp int)
+0:41        'gl_PrimitiveID' (layout( stream=0) out highp int PrimitiveID)
+0:41        'gl_PrimitiveIDIn' ( in highp int PrimitiveID)
+0:42      move second child to first child ( temp highp int)
+0:42        'gl_Layer' (layout( stream=0) out highp int Layer)
+0:42        Constant:
+0:42          2 (const int)
+0:53  Function Definition: foo(i1; ( global void)
+0:53    Function Parameters: 
+0:53      'a' ( in highp int)
+0:55    Sequence
+0:55      move second child to first child ( temp mediump 4-component vector of float)
+0:55        a: direct index for structure (layout( stream=0) out mediump 4-component vector of float)
+0:55          'ouuaa6' (layout( stream=0) out block{layout( stream=0) out mediump 4-component vector of float a})
+0:55          Constant:
+0:55            0 (const int)
+0:55        Constant:
+0:55          1.000000
+0:55          1.000000
+0:55          1.000000
+0:55          1.000000
+0:104  Function Definition: fooe1( ( global void)
+0:104    Function Parameters: 
+0:106    Sequence
+0:106      'gl_ViewportIndex' ( temp float)
+0:107      'gl_MaxViewports' ( temp float)
+0:108      Constant:
+0:108        4 (const int)
+0:109      Sequence
+0:109        move second child to first child ( temp highp int)
+0:109          'inv' ( temp highp int)
+0:109          'gl_InvocationID' ( in highp int InvocationID)
+0:124  Function Definition: notHere( ( global void)
+0:124    Function Parameters: 
+0:126    Sequence
+0:126      'gl_MaxGeometryVaryingComponents' ( temp float)
+0:127      'gl_VerticesIn' ( temp float)
+0:130  Function Definition: pointSize2( ( global void)
+0:130    Function Parameters: 
+0:132    Sequence
+0:132      Sequence
+0:132        move second child to first child ( temp highp float)
+0:132          'ps' ( temp highp float)
+0:132          gl_PointSize: direct index for structure ( in highp float PointSize)
+0:132            direct index ( temp block{ in highp 4-component vector of float Position gl_Position,  in highp float PointSize gl_PointSize})
+0:132              'gl_in' ( in 4-element array of block{ in highp 4-component vector of float Position gl_Position,  in highp float PointSize gl_PointSize})
+0:132              Constant:
+0:132                3 (const int)
+0:132            Constant:
+0:132              1 (const int)
+0:133      move second child to first child ( temp highp float)
+0:133        gl_PointSize: direct index for structure (layout( stream=0) gl_PointSize highp float PointSize)
+0:133          'anon@1' (layout( stream=0) out block{layout( stream=0) gl_Position highp 4-component vector of float Position gl_Position, layout( stream=0) gl_PointSize highp float PointSize gl_PointSize})
+0:133          Constant:
+0:133            1 (const uint)
+0:133        'ps' ( temp highp float)
+0:?   Linker Objects
+0:?     'fromV' ( in 4-element array of block{ in mediump 3-component vector of float color})
+0:?     'nonBlockUnsized' ( in 4-element array of mediump 4-component vector of float)
+0:?     'toF' (layout( stream=0) out block{layout( stream=0) out mediump 3-component vector of float color})
+0:?     'anon@0' (layout( stream=0) out block{layout( stream=0) out mediump 3-component vector of float color})
+0:?     'gl_in' ( in 4-element array of block{ in highp 4-component vector of float Position gl_Position,  in highp float PointSize gl_PointSize})
+0:?     'ov4' (layout( stream=4) out mediump 4-component vector of float)
+0:?     'ouuaa6' (layout( stream=0) out block{layout( stream=0) out mediump 4-component vector of float a})
+0:?     'badv4' (layout( stream=0) out mediump 4-component vector of float)
+0:?     'bad2v4' ( in 4-element array of mediump 4-component vector of float)
+0:?     'anon@1' (layout( stream=0) out block{layout( stream=0) out highp int a})
+0:?     'outbi' (layout( stream=0) out block{layout( stream=0) out highp int a, layout( stream=0) out highp int b, layout( stream=0) out highp int c})
+0:?     'insn' ( in 4-element array of block{ in highp int a15})
+0:?     'anon@2' (layout( stream=0) out block{layout( stream=0) out mediump float f15})
+0:?     'anon@3' (layout( column_major shared) uniform block{layout( column_major shared) uniform bool b15})
+0:?     'summ' ( const highp int)
+0:?       2752 (const int)
+0:?     'explArray' ( in 4-element array of mediump 4-component vector of float)
+0:?     'explArrayBad' ( in 5-element array of mediump 4-component vector of float)
+0:?     'nonArrayed' ( in mediump 4-component vector of float)
+0:?     'myColor1' (layout( stream=0) flat out mediump 3-component vector of float)
+0:?     'myColor2' (layout( stream=0) centroid out mediump 3-component vector of float)
+0:?     'centr' ( centroid in 4-element array of mediump 3-component vector of float)
+0:?     'perSampleColor' (layout( stream=0) sample out mediump 4-component vector of float)
+0:?     'comp' (layout( location=7 component=2) in 4-element array of mediump float)
+
+
+Linked geometry stage:
+
+
+Shader version: 320
+invocations = 4
+max_vertices = 200
+input primitive = lines_adjacency
+output primitive = triangle_strip
+ERROR: node is still EOpNull!
+0:29  Function Definition: main( ( global void)
+0:29    Function Parameters: 
+0:31    Sequence
+0:31      EmitVertex ( global void)
+0:32      EndPrimitive ( global void)
+0:33      Constant:
+0:33        0.000000
+0:34      Constant:
+0:34        0.000000
+0:36      move second child to first child ( temp mediump 3-component vector of float)
+0:36        color: direct index for structure (layout( stream=0) out mediump 3-component vector of float)
+0:36          'anon@0' (layout( stream=0) out block{layout( stream=0) out mediump 3-component vector of float color})
+0:36          Constant:
+0:36            0 (const uint)
+0:36        color: direct index for structure ( in mediump 3-component vector of float)
+0:36          direct index ( temp block{ in mediump 3-component vector of float color})
+0:36            'fromV' ( in 4-element array of block{ in mediump 3-component vector of float color})
+0:36            Constant:
+0:36              0 (const int)
+0:36          Constant:
+0:36            0 (const int)
+0:37      move second child to first child ( temp float)
+0:37        Constant:
+0:37          0.000000
+0:38        Constant:
+0:38          0.000000
+0:39      move second child to first child ( temp highp 4-component vector of float)
+0:39        gl_Position: direct index for structure (layout( stream=0) gl_Position highp 4-component vector of float Position)
+0:39          'anon@1' (layout( stream=0) out block{layout( stream=0) gl_Position highp 4-component vector of float Position gl_Position, layout( stream=0) gl_PointSize highp float PointSize gl_PointSize})
+0:39          Constant:
+0:39            0 (const uint)
+0:39        gl_Position: direct index for structure ( in highp 4-component vector of float Position)
+0:39          direct index ( temp block{ in highp 4-component vector of float Position gl_Position,  in highp float PointSize gl_PointSize})
+0:39            'gl_in' ( in 4-element array of block{ in highp 4-component vector of float Position gl_Position,  in highp float PointSize gl_PointSize})
+0:39            Constant:
+0:39              0 (const int)
+0:39          Constant:
+0:39            0 (const int)
+0:41      move second child to first child ( temp highp int)
+0:41        'gl_PrimitiveID' (layout( stream=0) out highp int PrimitiveID)
+0:41        'gl_PrimitiveIDIn' ( in highp int PrimitiveID)
+0:42      move second child to first child ( temp highp int)
+0:42        'gl_Layer' (layout( stream=0) out highp int Layer)
+0:42        Constant:
+0:42          2 (const int)
+0:?   Linker Objects
+0:?     'fromV' ( in 4-element array of block{ in mediump 3-component vector of float color})
+0:?     'nonBlockUnsized' ( in 4-element array of mediump 4-component vector of float)
+0:?     'toF' (layout( stream=0) out block{layout( stream=0) out mediump 3-component vector of float color})
+0:?     'anon@0' (layout( stream=0) out block{layout( stream=0) out mediump 3-component vector of float color})
+0:?     'gl_in' ( in 4-element array of block{ in highp 4-component vector of float Position gl_Position,  in highp float PointSize gl_PointSize})
+0:?     'ov4' (layout( stream=4) out mediump 4-component vector of float)
+0:?     'ouuaa6' (layout( stream=0) out block{layout( stream=0) out mediump 4-component vector of float a})
+0:?     'badv4' (layout( stream=0) out mediump 4-component vector of float)
+0:?     'bad2v4' ( in 4-element array of mediump 4-component vector of float)
+0:?     'anon@1' (layout( stream=0) out block{layout( stream=0) out highp int a})
+0:?     'outbi' (layout( stream=0) out block{layout( stream=0) out highp int a, layout( stream=0) out highp int b, layout( stream=0) out highp int c})
+0:?     'insn' ( in 4-element array of block{ in highp int a15})
+0:?     'anon@2' (layout( stream=0) out block{layout( stream=0) out mediump float f15})
+0:?     'anon@3' (layout( column_major shared) uniform block{layout( column_major shared) uniform bool b15})
+0:?     'summ' ( const highp int)
+0:?       2752 (const int)
+0:?     'explArray' ( in 4-element array of mediump 4-component vector of float)
+0:?     'explArrayBad' ( in 5-element array of mediump 4-component vector of float)
+0:?     'nonArrayed' ( in mediump 4-component vector of float)
+0:?     'myColor1' (layout( stream=0) flat out mediump 3-component vector of float)
+0:?     'myColor2' (layout( stream=0) centroid out mediump 3-component vector of float)
+0:?     'centr' ( centroid in 4-element array of mediump 3-component vector of float)
+0:?     'perSampleColor' (layout( stream=0) sample out mediump 4-component vector of float)
+0:?     'comp' (layout( location=7 component=2) in 4-element array of mediump float)
+
diff --git a/Test/baseResults/320.tesc.out b/Test/baseResults/320.tesc.out
new file mode 100644
index 0000000..41ee29c
--- /dev/null
+++ b/Test/baseResults/320.tesc.out
@@ -0,0 +1,516 @@
+320.tesc
+ERROR: 0:6: 'quads' : unrecognized layout identifier, or qualifier requires assignment (e.g., binding = 4) 
+ERROR: 0:7: 'ccw' : unrecognized layout identifier, or qualifier requires assignment (e.g., binding = 4) 
+ERROR: 0:8: 'fractional_even_spacing' : unrecognized layout identifier, or qualifier requires assignment (e.g., binding = 4) 
+ERROR: 0:10: 'patch' : can only use on output in tessellation-control shader 
+ERROR: 0:24: 'gl_PointSize' : required extension not requested: Possible extensions include:
+GL_EXT_tessellation_point_size
+GL_OES_tessellation_point_size
+ERROR: 0:25: 'gl_ClipDistance' : no such field in structure 
+ERROR: 0:25: 'expression' :  left of '[' is not of type array, matrix, or vector  
+ERROR: 0:32: 'gl_PointSize' : required extension not requested: Possible extensions include:
+GL_EXT_tessellation_point_size
+GL_OES_tessellation_point_size
+ERROR: 0:33: 'gl_ClipDistance' : no such field in structure 
+ERROR: 0:33: 'expression' :  left of '[' is not of type array, matrix, or vector  
+ERROR: 0:33: 'assign' :  l-value required (can't modify a const)
+ERROR: 0:39: '' : tessellation control barrier() cannot be placed within flow control 
+ERROR: 0:41: '' : tessellation control barrier() cannot be placed within flow control 
+ERROR: 0:46: '' : tessellation control barrier() cannot be placed within flow control 
+ERROR: 0:51: '' : tessellation control barrier() cannot be placed within flow control 
+ERROR: 0:54: '' : tessellation control barrier() cannot be placed within flow control 
+ERROR: 0:61: '' : tessellation control barrier() cannot be placed after a return from main() 
+ERROR: 0:64: 'vertices' : can only apply to 'out' 
+ERROR: 0:65: 'vertices' : cannot change previously set layout value 
+ERROR: 0:69: '[' :  array index out of range '4'
+ERROR: 0:71: '' : tessellation control barrier() must be in main() 
+ERROR: 0:74: 'in' : type must be an array: ina
+ERROR: 0:76: '[]' : tessellation input array size must be gl_MaxPatchVertices or implicitly sized 
+ERROR: 0:78: '' : array size required 
+ERROR: 0:84: 'location' : overlapping use of location 4
+ERROR: 0:88: 'location' : overlapping use of location 4
+ERROR: 0:98: 'vertices' : can only apply to a standalone qualifier 
+ERROR: 0:99: 'vertices' : inconsistent output number of vertices for array size of misSized
+ERROR: 0:104: 'gl_PointSize' : required extension not requested: Possible extensions include:
+GL_EXT_tessellation_point_size
+GL_OES_tessellation_point_size
+ERROR: 0:105: 'gl_PointSize' : required extension not requested: Possible extensions include:
+GL_EXT_tessellation_point_size
+GL_OES_tessellation_point_size
+ERROR: 0:123: '[' :  array index out of range '2'
+ERROR: 0:126: '' : array size required 
+ERROR: 0:142: '[]' : tessellation-control per-vertex output l-value must be indexed with gl_InvocationID 
+ERROR: 0:143: '[]' : tessellation-control per-vertex output l-value must be indexed with gl_InvocationID 
+ERROR: 0:146: '[]' : tessellation-control per-vertex output l-value must be indexed with gl_InvocationID 
+ERROR: 35 compilation errors.  No code generated.
+
+
+Shader version: 320
+Requested GL_ARB_separate_shader_objects
+vertices = 4
+ERROR: node is still EOpNull!
+0:13  Function Definition: main( ( global void)
+0:13    Function Parameters: 
+0:15    Sequence
+0:15      Barrier ( global void)
+0:17      Sequence
+0:17        move second child to first child ( temp highp int)
+0:17          'a' ( temp highp int)
+0:17          Constant:
+0:17            5392 (const int)
+0:23      Sequence
+0:23        move second child to first child ( temp highp 4-component vector of float)
+0:23          'p' ( temp highp 4-component vector of float)
+0:23          gl_Position: direct index for structure ( in highp 4-component vector of float Position)
+0:23            direct index ( temp block{ in highp 4-component vector of float Position gl_Position,  in highp float PointSize gl_PointSize,  in highp 4-component vector of float gl_SecondaryPositionNV,  in unsized 1-element array of highp 4-component vector of float gl_PositionPerViewNV})
+0:23              'gl_in' ( in 32-element array of block{ in highp 4-component vector of float Position gl_Position,  in highp float PointSize gl_PointSize,  in highp 4-component vector of float gl_SecondaryPositionNV,  in unsized 1-element array of highp 4-component vector of float gl_PositionPerViewNV})
+0:23              Constant:
+0:23                1 (const int)
+0:23            Constant:
+0:23              0 (const int)
+0:24      Sequence
+0:24        move second child to first child ( temp highp float)
+0:24          'ps' ( temp highp float)
+0:24          gl_PointSize: direct index for structure ( in highp float PointSize)
+0:24            direct index ( temp block{ in highp 4-component vector of float Position gl_Position,  in highp float PointSize gl_PointSize,  in highp 4-component vector of float gl_SecondaryPositionNV,  in unsized 1-element array of highp 4-component vector of float gl_PositionPerViewNV})
+0:24              'gl_in' ( in 32-element array of block{ in highp 4-component vector of float Position gl_Position,  in highp float PointSize gl_PointSize,  in highp 4-component vector of float gl_SecondaryPositionNV,  in unsized 1-element array of highp 4-component vector of float gl_PositionPerViewNV})
+0:24              Constant:
+0:24                1 (const int)
+0:24            Constant:
+0:24              1 (const int)
+0:25      Sequence
+0:25        move second child to first child ( temp highp float)
+0:25          'cd' ( temp highp float)
+0:25          Constant:
+0:25            0.000000
+0:27      Sequence
+0:27        move second child to first child ( temp highp int)
+0:27          'pvi' ( temp highp int)
+0:27          'gl_PatchVerticesIn' ( in highp int PatchVertices)
+0:28      Sequence
+0:28        move second child to first child ( temp highp int)
+0:28          'pid' ( temp highp int)
+0:28          'gl_PrimitiveID' ( in highp int PrimitiveID)
+0:29      Sequence
+0:29        move second child to first child ( temp highp int)
+0:29          'iid' ( temp highp int)
+0:29          'gl_InvocationID' ( in highp int InvocationID)
+0:31      move second child to first child ( temp highp 4-component vector of float)
+0:31        gl_Position: direct index for structure ( out highp 4-component vector of float Position)
+0:31          indirect index ( temp block{ out highp 4-component vector of float Position gl_Position,  out highp float PointSize gl_PointSize})
+0:31            'gl_out' ( out 4-element array of block{ out highp 4-component vector of float Position gl_Position,  out highp float PointSize gl_PointSize})
+0:31            'gl_InvocationID' ( in highp int InvocationID)
+0:31          Constant:
+0:31            0 (const int)
+0:31        'p' ( temp highp 4-component vector of float)
+0:32      move second child to first child ( temp highp float)
+0:32        gl_PointSize: direct index for structure ( out highp float PointSize)
+0:32          indirect index ( temp block{ out highp 4-component vector of float Position gl_Position,  out highp float PointSize gl_PointSize})
+0:32            'gl_out' ( out 4-element array of block{ out highp 4-component vector of float Position gl_Position,  out highp float PointSize gl_PointSize})
+0:32            'gl_InvocationID' ( in highp int InvocationID)
+0:32          Constant:
+0:32            1 (const int)
+0:32        'ps' ( temp highp float)
+0:33      move second child to first child ( temp highp float)
+0:33        Constant:
+0:33          0.000000
+0:33        'cd' ( temp highp float)
+0:35      move second child to first child ( temp highp float)
+0:35        direct index ( patch temp highp float TessLevelOuter)
+0:35          'gl_TessLevelOuter' ( patch out 4-element array of highp float TessLevelOuter)
+0:35          Constant:
+0:35            3 (const int)
+0:35        Constant:
+0:35          3.200000
+0:36      move second child to first child ( temp highp float)
+0:36        direct index ( patch temp highp float TessLevelInner)
+0:36          'gl_TessLevelInner' ( patch out 2-element array of highp float TessLevelInner)
+0:36          Constant:
+0:36            1 (const int)
+0:36        Constant:
+0:36          1.300000
+0:38      Test condition and select ( temp void)
+0:38        Condition
+0:38        Compare Greater Than ( temp bool)
+0:38          'a' ( temp highp int)
+0:38          Constant:
+0:38            10 (const int)
+0:38        true case
+0:39        Barrier ( global void)
+0:38        false case
+0:41        Barrier ( global void)
+0:43      Barrier ( global void)
+0:47      Loop with condition not tested first
+0:47        Loop Condition
+0:47        Compare Greater Than ( temp bool)
+0:47          'a' ( temp highp int)
+0:47          Constant:
+0:47            10 (const int)
+0:47        Loop Body
+0:46        Sequence
+0:46          Barrier ( global void)
+0:49      switch
+0:49      condition
+0:49        'a' ( temp highp int)
+0:49      body
+0:49        Sequence
+0:50          default: 
+0:?           Sequence
+0:51            Barrier ( global void)
+0:52            Branch: Break
+0:54      Test condition and select ( temp highp int)
+0:54        Condition
+0:54        Compare Less Than ( temp bool)
+0:54          'a' ( temp highp int)
+0:54          Constant:
+0:54            12 (const int)
+0:54        true case
+0:54        'a' ( temp highp int)
+0:54        false case
+0:54        Comma ( temp highp int)
+0:54          Barrier ( global void)
+0:54          'a' ( temp highp int)
+0:56      Sequence
+0:56        Barrier ( global void)
+0:59      Branch: Return
+0:61      Barrier ( global void)
+0:67  Function Definition: foo( ( global void)
+0:67    Function Parameters: 
+0:69    Sequence
+0:69      gl_Position: direct index for structure ( out highp 4-component vector of float Position)
+0:69        direct index ( temp block{ out highp 4-component vector of float Position gl_Position,  out highp float PointSize gl_PointSize})
+0:69          'gl_out' ( out 4-element array of block{ out highp 4-component vector of float Position gl_Position,  out highp float PointSize gl_PointSize})
+0:69          Constant:
+0:69            4 (const int)
+0:69        Constant:
+0:69          0 (const int)
+0:71      Barrier ( global void)
+0:102  Function Definition: pointSize2( ( global void)
+0:102    Function Parameters: 
+0:104    Sequence
+0:104      Sequence
+0:104        move second child to first child ( temp highp float)
+0:104          'ps' ( temp highp float)
+0:104          gl_PointSize: direct index for structure ( in highp float PointSize)
+0:104            direct index ( temp block{ in highp 4-component vector of float Position gl_Position,  in highp float PointSize gl_PointSize,  in highp 4-component vector of float gl_SecondaryPositionNV,  in unsized 1-element array of highp 4-component vector of float gl_PositionPerViewNV})
+0:104              'gl_in' ( in 32-element array of block{ in highp 4-component vector of float Position gl_Position,  in highp float PointSize gl_PointSize,  in highp 4-component vector of float gl_SecondaryPositionNV,  in unsized 1-element array of highp 4-component vector of float gl_PositionPerViewNV})
+0:104              Constant:
+0:104                1 (const int)
+0:104            Constant:
+0:104              1 (const int)
+0:105      move second child to first child ( temp highp float)
+0:105        gl_PointSize: direct index for structure ( out highp float PointSize)
+0:105          indirect index ( temp block{ out highp 4-component vector of float Position gl_Position,  out highp float PointSize gl_PointSize})
+0:105            'gl_out' ( out 4-element array of block{ out highp 4-component vector of float Position gl_Position,  out highp float PointSize gl_PointSize})
+0:105            'gl_InvocationID' ( in highp int InvocationID)
+0:105          Constant:
+0:105            1 (const int)
+0:105        'ps' ( temp highp float)
+0:110  Function Definition: goodfoop( ( global void)
+0:110    Function Parameters: 
+0:?     Sequence
+0:114      multiply second child into first child ( temp highp 3-component vector of float)
+0:114        'pv3' ( noContraction temp highp 3-component vector of float)
+0:114        'pv3' ( noContraction temp highp 3-component vector of float)
+0:115      move second child to first child ( temp highp 3-component vector of float)
+0:115        'pv3' ( noContraction temp highp 3-component vector of float)
+0:115        fma ( global highp 3-component vector of float)
+0:115          'pv3' ( noContraction temp highp 3-component vector of float)
+0:115          'pv3' ( noContraction temp highp 3-component vector of float)
+0:115          'pv3' ( noContraction temp highp 3-component vector of float)
+0:116      move second child to first child ( temp highp float)
+0:116        'd' ( noContraction temp highp float)
+0:116        fma ( global highp float)
+0:116          'd' ( noContraction temp highp float)
+0:116          'd' ( noContraction temp highp float)
+0:116          'd' ( noContraction temp highp float)
+0:119  Function Definition: bb( ( global void)
+0:119    Function Parameters: 
+0:121    Sequence
+0:121      move second child to first child ( temp highp 4-component vector of float)
+0:121        direct index ( patch temp highp 4-component vector of float BoundingBox)
+0:121          'gl_BoundingBoxOES' ( patch out 2-element array of highp 4-component vector of float BoundingBox)
+0:121          Constant:
+0:121            0 (const int)
+0:121        Constant:
+0:121          0.000000
+0:121          0.000000
+0:121          0.000000
+0:121          0.000000
+0:122      move second child to first child ( temp highp 4-component vector of float)
+0:122        direct index ( patch temp highp 4-component vector of float BoundingBox)
+0:122          'gl_BoundingBoxOES' ( patch out 2-element array of highp 4-component vector of float BoundingBox)
+0:122          Constant:
+0:122            1 (const int)
+0:122        Constant:
+0:122          1.000000
+0:122          1.000000
+0:122          1.000000
+0:122          1.000000
+0:123      move second child to first child ( temp highp 4-component vector of float)
+0:123        direct index ( patch temp highp 4-component vector of float BoundingBox)
+0:123          'gl_BoundingBoxOES' ( patch out 2-element array of highp 4-component vector of float BoundingBox)
+0:123          Constant:
+0:123            2 (const int)
+0:123        Constant:
+0:123          2.000000
+0:123          2.000000
+0:123          2.000000
+0:123          2.000000
+0:134  Function Definition: outputtingOutparam(i1; ( global void)
+0:134    Function Parameters: 
+0:134      'a' ( out highp int)
+0:136    Sequence
+0:136      move second child to first child ( temp highp int)
+0:136        'a' ( out highp int)
+0:136        Constant:
+0:136          2 (const int)
+0:139  Function Definition: outputting( ( global void)
+0:139    Function Parameters: 
+0:141    Sequence
+0:141      move second child to first child ( temp highp int)
+0:141        indirect index ( temp highp int)
+0:141          'outa' ( out 4-element array of highp int)
+0:141          'gl_InvocationID' ( in highp int InvocationID)
+0:141        Constant:
+0:141          2 (const int)
+0:142      move second child to first child ( temp highp int)
+0:142        direct index ( temp highp int)
+0:142          'outa' ( out 4-element array of highp int)
+0:142          Constant:
+0:142            1 (const int)
+0:142        Constant:
+0:142          2 (const int)
+0:143      move second child to first child ( temp highp 4-component vector of float)
+0:143        gl_Position: direct index for structure ( out highp 4-component vector of float Position)
+0:143          direct index ( temp block{ out highp 4-component vector of float Position gl_Position,  out highp float PointSize gl_PointSize})
+0:143            'gl_out' ( out 4-element array of block{ out highp 4-component vector of float Position gl_Position,  out highp float PointSize gl_PointSize})
+0:143            Constant:
+0:143              0 (const int)
+0:143          Constant:
+0:143            0 (const int)
+0:143        Constant:
+0:143          1.000000
+0:143          1.000000
+0:143          1.000000
+0:143          1.000000
+0:144      direct index ( temp highp int)
+0:144        'outa' ( out 4-element array of highp int)
+0:144        Constant:
+0:144          1 (const int)
+0:145      direct index ( temp block{ out highp 4-component vector of float Position gl_Position,  out highp float PointSize gl_PointSize})
+0:145        'gl_out' ( out 4-element array of block{ out highp 4-component vector of float Position gl_Position,  out highp float PointSize gl_PointSize})
+0:145        Constant:
+0:145          0 (const int)
+0:146      Function Call: outputtingOutparam(i1; ( global void)
+0:146        direct index ( temp highp int)
+0:146          'outa' ( out 4-element array of highp int)
+0:146          Constant:
+0:146            0 (const int)
+0:147      Function Call: outputtingOutparam(i1; ( global void)
+0:147        indirect index ( temp highp int)
+0:147          'outa' ( out 4-element array of highp int)
+0:147          'gl_InvocationID' ( in highp int InvocationID)
+0:148      move second child to first child ( temp highp float)
+0:148        f: direct index for structure ( out highp float)
+0:148          direct index ( patch temp block{ out highp float f})
+0:148            'patchIName' ( patch out 4-element array of block{ out highp float f})
+0:148            Constant:
+0:148              1 (const int)
+0:148          Constant:
+0:148            0 (const int)
+0:148        Constant:
+0:148          3.140000
+0:149      move second child to first child ( temp highp int)
+0:149        indirect index ( temp highp int)
+0:149          'outa' ( out 4-element array of highp int)
+0:149          'gl_InvocationID' ( in highp int InvocationID)
+0:149        Constant:
+0:149          2 (const int)
+0:?   Linker Objects
+0:?     'gl_out' ( out 4-element array of block{ out highp 4-component vector of float Position gl_Position,  out highp float PointSize gl_PointSize})
+0:?     'outa' ( out 4-element array of highp int)
+0:?     'patchIn' ( patch in highp 4-component vector of float)
+0:?     'patchOut' ( patch out highp 4-component vector of float)
+0:?     'ina' ( in highp 2-component vector of float)
+0:?     'inb' ( in 32-element array of highp 2-component vector of float)
+0:?     'inc' ( in 32-element array of highp 2-component vector of float)
+0:?     'ind' ( in 32-element array of highp 2-component vector of float)
+0:?     'implA' ( patch out unsized 1-element array of highp float)
+0:?     'ivla' (layout( location=3) in 32-element array of highp 4-component vector of float)
+0:?     'ivlb' (layout( location=4) in 32-element array of highp 4-component vector of float)
+0:?     'ivlc' (layout( location=4) in 32-element array of highp 4-component vector of float)
+0:?     'ovla' (layout( location=3) out 4-element array of highp 4-component vector of float)
+0:?     'ovlb' (layout( location=4) out 4-element array of highp 4-component vector of float)
+0:?     'ovlc' (layout( location=4) out 4-element array of highp 4-component vector of float)
+0:?     'pinbi' ( patch out block{ out highp int a})
+0:?     'myColor2' ( centroid out 4-element array of highp 3-component vector of float)
+0:?     'centr' ( centroid in 32-element array of highp 3-component vector of float)
+0:?     'perSampleColor' ( sample out 4-element array of highp 4-component vector of float)
+0:?     'badlay' ( out 4-element array of highp float)
+0:?     'misSized' ( out 5-element array of highp float)
+0:?     'okaySize' ( out 4-element array of highp float)
+0:?     'pv3' ( noContraction temp highp 3-component vector of float)
+0:?     'badpatchIName' ( patch out unsized 1-element array of block{ out highp float f})
+0:?     'patchIName' ( patch out 4-element array of block{ out highp float f})
+
+
+Linked tessellation control stage:
+
+
+Shader version: 320
+Requested GL_ARB_separate_shader_objects
+vertices = 4
+ERROR: node is still EOpNull!
+0:13  Function Definition: main( ( global void)
+0:13    Function Parameters: 
+0:15    Sequence
+0:15      Barrier ( global void)
+0:17      Sequence
+0:17        move second child to first child ( temp highp int)
+0:17          'a' ( temp highp int)
+0:17          Constant:
+0:17            5392 (const int)
+0:23      Sequence
+0:23        move second child to first child ( temp highp 4-component vector of float)
+0:23          'p' ( temp highp 4-component vector of float)
+0:23          gl_Position: direct index for structure ( in highp 4-component vector of float Position)
+0:23            direct index ( temp block{ in highp 4-component vector of float Position gl_Position,  in highp float PointSize gl_PointSize,  in highp 4-component vector of float gl_SecondaryPositionNV,  in 1-element array of highp 4-component vector of float gl_PositionPerViewNV})
+0:23              'gl_in' ( in 32-element array of block{ in highp 4-component vector of float Position gl_Position,  in highp float PointSize gl_PointSize,  in highp 4-component vector of float gl_SecondaryPositionNV,  in 1-element array of highp 4-component vector of float gl_PositionPerViewNV})
+0:23              Constant:
+0:23                1 (const int)
+0:23            Constant:
+0:23              0 (const int)
+0:24      Sequence
+0:24        move second child to first child ( temp highp float)
+0:24          'ps' ( temp highp float)
+0:24          gl_PointSize: direct index for structure ( in highp float PointSize)
+0:24            direct index ( temp block{ in highp 4-component vector of float Position gl_Position,  in highp float PointSize gl_PointSize,  in highp 4-component vector of float gl_SecondaryPositionNV,  in 1-element array of highp 4-component vector of float gl_PositionPerViewNV})
+0:24              'gl_in' ( in 32-element array of block{ in highp 4-component vector of float Position gl_Position,  in highp float PointSize gl_PointSize,  in highp 4-component vector of float gl_SecondaryPositionNV,  in 1-element array of highp 4-component vector of float gl_PositionPerViewNV})
+0:24              Constant:
+0:24                1 (const int)
+0:24            Constant:
+0:24              1 (const int)
+0:25      Sequence
+0:25        move second child to first child ( temp highp float)
+0:25          'cd' ( temp highp float)
+0:25          Constant:
+0:25            0.000000
+0:27      Sequence
+0:27        move second child to first child ( temp highp int)
+0:27          'pvi' ( temp highp int)
+0:27          'gl_PatchVerticesIn' ( in highp int PatchVertices)
+0:28      Sequence
+0:28        move second child to first child ( temp highp int)
+0:28          'pid' ( temp highp int)
+0:28          'gl_PrimitiveID' ( in highp int PrimitiveID)
+0:29      Sequence
+0:29        move second child to first child ( temp highp int)
+0:29          'iid' ( temp highp int)
+0:29          'gl_InvocationID' ( in highp int InvocationID)
+0:31      move second child to first child ( temp highp 4-component vector of float)
+0:31        gl_Position: direct index for structure ( out highp 4-component vector of float Position)
+0:31          indirect index ( temp block{ out highp 4-component vector of float Position gl_Position,  out highp float PointSize gl_PointSize})
+0:31            'gl_out' ( out 4-element array of block{ out highp 4-component vector of float Position gl_Position,  out highp float PointSize gl_PointSize})
+0:31            'gl_InvocationID' ( in highp int InvocationID)
+0:31          Constant:
+0:31            0 (const int)
+0:31        'p' ( temp highp 4-component vector of float)
+0:32      move second child to first child ( temp highp float)
+0:32        gl_PointSize: direct index for structure ( out highp float PointSize)
+0:32          indirect index ( temp block{ out highp 4-component vector of float Position gl_Position,  out highp float PointSize gl_PointSize})
+0:32            'gl_out' ( out 4-element array of block{ out highp 4-component vector of float Position gl_Position,  out highp float PointSize gl_PointSize})
+0:32            'gl_InvocationID' ( in highp int InvocationID)
+0:32          Constant:
+0:32            1 (const int)
+0:32        'ps' ( temp highp float)
+0:33      move second child to first child ( temp highp float)
+0:33        Constant:
+0:33          0.000000
+0:33        'cd' ( temp highp float)
+0:35      move second child to first child ( temp highp float)
+0:35        direct index ( patch temp highp float TessLevelOuter)
+0:35          'gl_TessLevelOuter' ( patch out 4-element array of highp float TessLevelOuter)
+0:35          Constant:
+0:35            3 (const int)
+0:35        Constant:
+0:35          3.200000
+0:36      move second child to first child ( temp highp float)
+0:36        direct index ( patch temp highp float TessLevelInner)
+0:36          'gl_TessLevelInner' ( patch out 2-element array of highp float TessLevelInner)
+0:36          Constant:
+0:36            1 (const int)
+0:36        Constant:
+0:36          1.300000
+0:38      Test condition and select ( temp void)
+0:38        Condition
+0:38        Compare Greater Than ( temp bool)
+0:38          'a' ( temp highp int)
+0:38          Constant:
+0:38            10 (const int)
+0:38        true case
+0:39        Barrier ( global void)
+0:38        false case
+0:41        Barrier ( global void)
+0:43      Barrier ( global void)
+0:47      Loop with condition not tested first
+0:47        Loop Condition
+0:47        Compare Greater Than ( temp bool)
+0:47          'a' ( temp highp int)
+0:47          Constant:
+0:47            10 (const int)
+0:47        Loop Body
+0:46        Sequence
+0:46          Barrier ( global void)
+0:49      switch
+0:49      condition
+0:49        'a' ( temp highp int)
+0:49      body
+0:49        Sequence
+0:50          default: 
+0:?           Sequence
+0:51            Barrier ( global void)
+0:52            Branch: Break
+0:54      Test condition and select ( temp highp int)
+0:54        Condition
+0:54        Compare Less Than ( temp bool)
+0:54          'a' ( temp highp int)
+0:54          Constant:
+0:54            12 (const int)
+0:54        true case
+0:54        'a' ( temp highp int)
+0:54        false case
+0:54        Comma ( temp highp int)
+0:54          Barrier ( global void)
+0:54          'a' ( temp highp int)
+0:56      Sequence
+0:56        Barrier ( global void)
+0:59      Branch: Return
+0:61      Barrier ( global void)
+0:?   Linker Objects
+0:?     'gl_out' ( out 4-element array of block{ out highp 4-component vector of float Position gl_Position,  out highp float PointSize gl_PointSize})
+0:?     'outa' ( out 4-element array of highp int)
+0:?     'patchIn' ( patch in highp 4-component vector of float)
+0:?     'patchOut' ( patch out highp 4-component vector of float)
+0:?     'ina' ( in highp 2-component vector of float)
+0:?     'inb' ( in 32-element array of highp 2-component vector of float)
+0:?     'inc' ( in 32-element array of highp 2-component vector of float)
+0:?     'ind' ( in 32-element array of highp 2-component vector of float)
+0:?     'implA' ( patch out 1-element array of highp float)
+0:?     'ivla' (layout( location=3) in 32-element array of highp 4-component vector of float)
+0:?     'ivlb' (layout( location=4) in 32-element array of highp 4-component vector of float)
+0:?     'ivlc' (layout( location=4) in 32-element array of highp 4-component vector of float)
+0:?     'ovla' (layout( location=3) out 4-element array of highp 4-component vector of float)
+0:?     'ovlb' (layout( location=4) out 4-element array of highp 4-component vector of float)
+0:?     'ovlc' (layout( location=4) out 4-element array of highp 4-component vector of float)
+0:?     'pinbi' ( patch out block{ out highp int a})
+0:?     'myColor2' ( centroid out 4-element array of highp 3-component vector of float)
+0:?     'centr' ( centroid in 32-element array of highp 3-component vector of float)
+0:?     'perSampleColor' ( sample out 4-element array of highp 4-component vector of float)
+0:?     'badlay' ( out 4-element array of highp float)
+0:?     'misSized' ( out 5-element array of highp float)
+0:?     'okaySize' ( out 4-element array of highp float)
+0:?     'pv3' ( noContraction temp highp 3-component vector of float)
+0:?     'badpatchIName' ( patch out 1-element array of block{ out highp float f})
+0:?     'patchIName' ( patch out 4-element array of block{ out highp float f})
+
diff --git a/Test/baseResults/320.tese.out b/Test/baseResults/320.tese.out
new file mode 100644
index 0000000..93165ae
--- /dev/null
+++ b/Test/baseResults/320.tese.out
@@ -0,0 +1,275 @@
+320.tese
+ERROR: 0:3: 'vertices' : there is no such layout identifier for this stage taking an assigned value 
+ERROR: 0:5: 'triangles' : cannot change previously set input primitive 
+ERROR: 0:6: 'isolines' : cannot change previously set input primitive 
+ERROR: 0:8: 'ccw' : cannot change previously set vertex order 
+ERROR: 0:12: 'equal_spacing' : cannot change previously set vertex spacing 
+ERROR: 0:13: 'fractional_even_spacing' : cannot change previously set vertex spacing 
+ERROR: 0:18: 'patch' : can only use on input in tessellation-evaluation shader 
+ERROR: 0:22: 'barrier' : no matching overloaded function found 
+ERROR: 0:33: 'gl_PointSize' : required extension not requested: Possible extensions include:
+GL_EXT_tessellation_point_size
+GL_OES_tessellation_point_size
+ERROR: 0:34: 'gl_ClipDistance' : no such field in structure 
+ERROR: 0:34: 'expression' :  left of '[' is not of type array, matrix, or vector  
+ERROR: 0:43: 'gl_PointSize' : required extension not requested: Possible extensions include:
+GL_EXT_tessellation_point_size
+GL_OES_tessellation_point_size
+ERROR: 0:44: 'gl_ClipDistance' : undeclared identifier 
+ERROR: 0:44: 'gl_ClipDistance' :  left of '[' is not of type array, matrix, or vector  
+ERROR: 0:44: 'assign' :  l-value required (can't modify a const)
+ERROR: 0:47: 'patch' : cannot use interpolation qualifiers with patch 
+ERROR: 0:48: 'patch' : cannot use interpolation qualifiers with patch 
+ERROR: 0:49: 'noperspective' : Reserved word. 
+ERROR: 0:49: 'noperspective' : not supported for this version or the enabled extensions 
+ERROR: 0:49: 'patch' : cannot use interpolation qualifiers with patch 
+ERROR: 0:50: '' : can only have one auxiliary qualifier (centroid, patch, and sample) 
+ERROR: 0:59: 'gl_PerVertex' : can only redeclare a built-in block once, and before any use 
+ERROR: 0:64: 'quads' : cannot apply to 'out' 
+ERROR: 0:64: 'cw' : can only apply to 'in' 
+ERROR: 0:65: 'triangles' : cannot apply to 'out' 
+ERROR: 0:66: 'isolines' : cannot apply to 'out' 
+ERROR: 0:67: 'cw' : can only apply to 'in' 
+ERROR: 0:68: 'fractional_odd_spacing' : can only apply to 'in' 
+ERROR: 0:69: 'equal_spacing' : can only apply to 'in' 
+ERROR: 0:70: 'fractional_even_spacing' : can only apply to 'in' 
+ERROR: 0:71: 'point_mode' : can only apply to 'in' 
+ERROR: 0:73: 'in' : type must be an array: ina
+ERROR: 0:75: '[]' : tessellation input array size must be gl_MaxPatchVertices or implicitly sized 
+ERROR: 0:78: 'in' : type must be an array: bla
+ERROR: 0:86: '[]' : tessellation input array size must be gl_MaxPatchVertices or implicitly sized 
+ERROR: 0:96: 'location' : overlapping use of location 24
+ERROR: 0:99: 'location' : overlapping use of location 24
+ERROR: 0:101: 'gl_TessLevelOuter' : identifiers starting with "gl_" are reserved 
+ERROR: 0:113: 'gl_BoundingBoxOES' : undeclared identifier 
+ERROR: 39 compilation errors.  No code generated.
+
+
+Shader version: 320
+Requested GL_ARB_separate_shader_objects
+input primitive = quads
+vertex spacing = fractional_odd_spacing
+triangle order = cw
+using point mode
+ERROR: node is still EOpNull!
+0:20  Function Definition: main( ( global void)
+0:20    Function Parameters: 
+0:22    Sequence
+0:22      Constant:
+0:22        0.000000
+0:24      Sequence
+0:24        move second child to first child ( temp highp int)
+0:24          'a' ( temp highp int)
+0:24          Constant:
+0:24            1512 (const int)
+0:32      Sequence
+0:32        move second child to first child ( temp highp 4-component vector of float)
+0:32          'p' ( temp highp 4-component vector of float)
+0:32          gl_Position: direct index for structure ( in highp 4-component vector of float Position)
+0:32            direct index ( temp block{ in highp 4-component vector of float Position gl_Position,  in highp float PointSize gl_PointSize,  in highp 4-component vector of float gl_SecondaryPositionNV,  in unsized 1-element array of highp 4-component vector of float gl_PositionPerViewNV})
+0:32              'gl_in' ( in 32-element array of block{ in highp 4-component vector of float Position gl_Position,  in highp float PointSize gl_PointSize,  in highp 4-component vector of float gl_SecondaryPositionNV,  in unsized 1-element array of highp 4-component vector of float gl_PositionPerViewNV})
+0:32              Constant:
+0:32                1 (const int)
+0:32            Constant:
+0:32              0 (const int)
+0:33      Sequence
+0:33        move second child to first child ( temp highp float)
+0:33          'ps' ( temp highp float)
+0:33          gl_PointSize: direct index for structure ( in highp float PointSize)
+0:33            direct index ( temp block{ in highp 4-component vector of float Position gl_Position,  in highp float PointSize gl_PointSize,  in highp 4-component vector of float gl_SecondaryPositionNV,  in unsized 1-element array of highp 4-component vector of float gl_PositionPerViewNV})
+0:33              'gl_in' ( in 32-element array of block{ in highp 4-component vector of float Position gl_Position,  in highp float PointSize gl_PointSize,  in highp 4-component vector of float gl_SecondaryPositionNV,  in unsized 1-element array of highp 4-component vector of float gl_PositionPerViewNV})
+0:33              Constant:
+0:33                1 (const int)
+0:33            Constant:
+0:33              1 (const int)
+0:34      Sequence
+0:34        move second child to first child ( temp highp float)
+0:34          'cd' ( temp highp float)
+0:34          Constant:
+0:34            0.000000
+0:36      Sequence
+0:36        move second child to first child ( temp highp int)
+0:36          'pvi' ( temp highp int)
+0:36          'gl_PatchVerticesIn' ( in highp int PatchVertices)
+0:37      Sequence
+0:37        move second child to first child ( temp highp int)
+0:37          'pid' ( temp highp int)
+0:37          'gl_PrimitiveID' ( in highp int PrimitiveID)
+0:38      Sequence
+0:38        move second child to first child ( temp highp 3-component vector of float)
+0:38          'tc' ( temp highp 3-component vector of float)
+0:38          'gl_TessCoord' ( in highp 3-component vector of float TessCoord)
+0:39      Sequence
+0:39        move second child to first child ( temp highp float)
+0:39          'tlo' ( temp highp float)
+0:39          direct index ( patch temp highp float TessLevelOuter)
+0:39            'gl_TessLevelOuter' ( patch in 4-element array of highp float TessLevelOuter)
+0:39            Constant:
+0:39              3 (const int)
+0:40      Sequence
+0:40        move second child to first child ( temp highp float)
+0:40          'tli' ( temp highp float)
+0:40          direct index ( patch temp highp float TessLevelInner)
+0:40            'gl_TessLevelInner' ( patch in 2-element array of highp float TessLevelInner)
+0:40            Constant:
+0:40              1 (const int)
+0:42      move second child to first child ( temp highp 4-component vector of float)
+0:42        gl_Position: direct index for structure ( gl_Position highp 4-component vector of float Position)
+0:42          'anon@1' ( out block{ gl_Position highp 4-component vector of float Position gl_Position,  gl_PointSize highp float PointSize gl_PointSize})
+0:42          Constant:
+0:42            0 (const uint)
+0:42        'p' ( temp highp 4-component vector of float)
+0:43      move second child to first child ( temp highp float)
+0:43        gl_PointSize: direct index for structure ( gl_PointSize highp float PointSize)
+0:43          'anon@1' ( out block{ gl_Position highp 4-component vector of float Position gl_Position,  gl_PointSize highp float PointSize gl_PointSize})
+0:43          Constant:
+0:43            1 (const uint)
+0:43        'ps' ( temp highp float)
+0:44      move second child to first child ( temp highp float)
+0:44        Constant:
+0:44          0.000000
+0:44        'cd' ( temp highp float)
+0:111  Function Definition: bbbad( ( global void)
+0:111    Function Parameters: 
+0:113    Sequence
+0:113      'gl_BoundingBoxOES' ( temp float)
+0:?   Linker Objects
+0:?     'patchIn' ( patch in highp 4-component vector of float)
+0:?     'patchOut' ( patch out highp 4-component vector of float)
+0:?     'badp1' ( smooth patch in highp 4-component vector of float)
+0:?     'badp2' ( flat patch in highp 4-component vector of float)
+0:?     'badp3' ( noperspective patch in highp 4-component vector of float)
+0:?     'badp4' ( patch sample in highp 3-component vector of float)
+0:?     'gl_in' ( in 32-element array of block{ in highp 4-component vector of float Position gl_Position})
+0:?     'ina' ( in highp 2-component vector of float)
+0:?     'inb' ( in 32-element array of highp 2-component vector of float)
+0:?     'inc' ( in 32-element array of highp 2-component vector of float)
+0:?     'ind' ( in 32-element array of highp 2-component vector of float)
+0:?     'bla' ( in block{ in highp int f})
+0:?     'blb' ( in 32-element array of block{ in highp int f})
+0:?     'blc' ( in 32-element array of block{ in highp int f})
+0:?     'bld' ( in 32-element array of block{ in highp int f})
+0:?     'ivla' (layout( location=23) in 32-element array of highp 4-component vector of float)
+0:?     'ivlb' (layout( location=24) in 32-element array of highp 4-component vector of float)
+0:?     'ivlc' (layout( location=24) in 32-element array of highp 4-component vector of float)
+0:?     'ovla' (layout( location=23) out 2-element array of highp 4-component vector of float)
+0:?     'ovlb' (layout( location=24) out 2-element array of highp 4-component vector of float)
+0:?     'pinbi' ( patch in block{ in highp int a})
+0:?     'myColor2' ( centroid out highp 3-component vector of float)
+0:?     'centr' ( centroid in 32-element array of highp 3-component vector of float)
+0:?     'perSampleColor' ( sample out highp 4-component vector of float)
+
+
+Linked tessellation evaluation stage:
+
+
+Shader version: 320
+Requested GL_ARB_separate_shader_objects
+input primitive = quads
+vertex spacing = fractional_odd_spacing
+triangle order = cw
+using point mode
+ERROR: node is still EOpNull!
+0:20  Function Definition: main( ( global void)
+0:20    Function Parameters: 
+0:22    Sequence
+0:22      Constant:
+0:22        0.000000
+0:24      Sequence
+0:24        move second child to first child ( temp highp int)
+0:24          'a' ( temp highp int)
+0:24          Constant:
+0:24            1512 (const int)
+0:32      Sequence
+0:32        move second child to first child ( temp highp 4-component vector of float)
+0:32          'p' ( temp highp 4-component vector of float)
+0:32          gl_Position: direct index for structure ( in highp 4-component vector of float Position)
+0:32            direct index ( temp block{ in highp 4-component vector of float Position gl_Position,  in highp float PointSize gl_PointSize,  in highp 4-component vector of float gl_SecondaryPositionNV,  in 1-element array of highp 4-component vector of float gl_PositionPerViewNV})
+0:32              'gl_in' ( in 32-element array of block{ in highp 4-component vector of float Position gl_Position,  in highp float PointSize gl_PointSize,  in highp 4-component vector of float gl_SecondaryPositionNV,  in 1-element array of highp 4-component vector of float gl_PositionPerViewNV})
+0:32              Constant:
+0:32                1 (const int)
+0:32            Constant:
+0:32              0 (const int)
+0:33      Sequence
+0:33        move second child to first child ( temp highp float)
+0:33          'ps' ( temp highp float)
+0:33          gl_PointSize: direct index for structure ( in highp float PointSize)
+0:33            direct index ( temp block{ in highp 4-component vector of float Position gl_Position,  in highp float PointSize gl_PointSize,  in highp 4-component vector of float gl_SecondaryPositionNV,  in 1-element array of highp 4-component vector of float gl_PositionPerViewNV})
+0:33              'gl_in' ( in 32-element array of block{ in highp 4-component vector of float Position gl_Position,  in highp float PointSize gl_PointSize,  in highp 4-component vector of float gl_SecondaryPositionNV,  in 1-element array of highp 4-component vector of float gl_PositionPerViewNV})
+0:33              Constant:
+0:33                1 (const int)
+0:33            Constant:
+0:33              1 (const int)
+0:34      Sequence
+0:34        move second child to first child ( temp highp float)
+0:34          'cd' ( temp highp float)
+0:34          Constant:
+0:34            0.000000
+0:36      Sequence
+0:36        move second child to first child ( temp highp int)
+0:36          'pvi' ( temp highp int)
+0:36          'gl_PatchVerticesIn' ( in highp int PatchVertices)
+0:37      Sequence
+0:37        move second child to first child ( temp highp int)
+0:37          'pid' ( temp highp int)
+0:37          'gl_PrimitiveID' ( in highp int PrimitiveID)
+0:38      Sequence
+0:38        move second child to first child ( temp highp 3-component vector of float)
+0:38          'tc' ( temp highp 3-component vector of float)
+0:38          'gl_TessCoord' ( in highp 3-component vector of float TessCoord)
+0:39      Sequence
+0:39        move second child to first child ( temp highp float)
+0:39          'tlo' ( temp highp float)
+0:39          direct index ( patch temp highp float TessLevelOuter)
+0:39            'gl_TessLevelOuter' ( patch in 4-element array of highp float TessLevelOuter)
+0:39            Constant:
+0:39              3 (const int)
+0:40      Sequence
+0:40        move second child to first child ( temp highp float)
+0:40          'tli' ( temp highp float)
+0:40          direct index ( patch temp highp float TessLevelInner)
+0:40            'gl_TessLevelInner' ( patch in 2-element array of highp float TessLevelInner)
+0:40            Constant:
+0:40              1 (const int)
+0:42      move second child to first child ( temp highp 4-component vector of float)
+0:42        gl_Position: direct index for structure ( gl_Position highp 4-component vector of float Position)
+0:42          'anon@1' ( out block{ gl_Position highp 4-component vector of float Position gl_Position,  gl_PointSize highp float PointSize gl_PointSize})
+0:42          Constant:
+0:42            0 (const uint)
+0:42        'p' ( temp highp 4-component vector of float)
+0:43      move second child to first child ( temp highp float)
+0:43        gl_PointSize: direct index for structure ( gl_PointSize highp float PointSize)
+0:43          'anon@1' ( out block{ gl_Position highp 4-component vector of float Position gl_Position,  gl_PointSize highp float PointSize gl_PointSize})
+0:43          Constant:
+0:43            1 (const uint)
+0:43        'ps' ( temp highp float)
+0:44      move second child to first child ( temp highp float)
+0:44        Constant:
+0:44          0.000000
+0:44        'cd' ( temp highp float)
+0:?   Linker Objects
+0:?     'patchIn' ( patch in highp 4-component vector of float)
+0:?     'patchOut' ( patch out highp 4-component vector of float)
+0:?     'badp1' ( smooth patch in highp 4-component vector of float)
+0:?     'badp2' ( flat patch in highp 4-component vector of float)
+0:?     'badp3' ( noperspective patch in highp 4-component vector of float)
+0:?     'badp4' ( patch sample in highp 3-component vector of float)
+0:?     'gl_in' ( in 32-element array of block{ in highp 4-component vector of float Position gl_Position})
+0:?     'ina' ( in highp 2-component vector of float)
+0:?     'inb' ( in 32-element array of highp 2-component vector of float)
+0:?     'inc' ( in 32-element array of highp 2-component vector of float)
+0:?     'ind' ( in 32-element array of highp 2-component vector of float)
+0:?     'bla' ( in block{ in highp int f})
+0:?     'blb' ( in 32-element array of block{ in highp int f})
+0:?     'blc' ( in 32-element array of block{ in highp int f})
+0:?     'bld' ( in 32-element array of block{ in highp int f})
+0:?     'ivla' (layout( location=23) in 32-element array of highp 4-component vector of float)
+0:?     'ivlb' (layout( location=24) in 32-element array of highp 4-component vector of float)
+0:?     'ivlc' (layout( location=24) in 32-element array of highp 4-component vector of float)
+0:?     'ovla' (layout( location=23) out 2-element array of highp 4-component vector of float)
+0:?     'ovlb' (layout( location=24) out 2-element array of highp 4-component vector of float)
+0:?     'pinbi' ( patch in block{ in highp int a})
+0:?     'myColor2' ( centroid out highp 3-component vector of float)
+0:?     'centr' ( centroid in 32-element array of highp 3-component vector of float)
+0:?     'perSampleColor' ( sample out highp 4-component vector of float)
+
diff --git a/Test/baseResults/320.vert.out b/Test/baseResults/320.vert.out
new file mode 100644
index 0000000..2838ab8
--- /dev/null
+++ b/Test/baseResults/320.vert.out
@@ -0,0 +1,797 @@
+320.vert
+ERROR: 0:6: 's' : member of block cannot be or contain a sampler, image, or atomic_uint type 
+ERROR: 0:14: 'location' : overlapping use of location 12
+ERROR: 0:16: 'input block' : not supported in this stage: vertex
+ERROR: 0:18: 'gl_PerVertex' : block redeclaration has extra members 
+ERROR: 0:28: 'gl_PointSize' : member of nameless block was not redeclared 
+ERROR: 0:28: 'assign' :  cannot convert from ' const float' to ' gl_PointSize highp void PointSize'
+ERROR: 0:31: 'gl_PerVertex' : can only redeclare a built-in block once, and before any use 
+ERROR: 0:36: 'flat/smooth/noperspective' : cannot use interpolation qualifiers on an interface block 
+ERROR: 0:40: 'flat/smooth/noperspective' : cannot use interpolation qualifiers on an interface block 
+ERROR: 0:44: 'centroid' : cannot use centroid qualifier on an interface block 
+ERROR: 0:48: 'invariant' : cannot use invariant qualifier on an interface block 
+ERROR: 0:68: 'variable indexing buffer block array' : not supported with this profile: es
+ERROR: 0:73: 'textureGatherOffsets(...)' : must be a compile-time constant: offsets argument
+ERROR: 0:76: 'sampler/image' : type requires declaration of default precision qualifier 
+ERROR: 0:77: 'sampler/image' : type requires declaration of default precision qualifier 
+ERROR: 0:78: 'sampler/image' : type requires declaration of default precision qualifier 
+ERROR: 0:79: 'sampler/image' : type requires declaration of default precision qualifier 
+ERROR: 0:80: 'sampler/image' : type requires declaration of default precision qualifier 
+ERROR: 0:81: 'sampler/image' : type requires declaration of default precision qualifier 
+ERROR: 0:116: 'sampler/image' : type requires declaration of default precision qualifier 
+ERROR: 0:117: 'sampler/image' : type requires declaration of default precision qualifier 
+ERROR: 0:118: 'sampler/image' : type requires declaration of default precision qualifier 
+ERROR: 0:120: 'sampler/image' : type requires declaration of default precision qualifier 
+ERROR: 0:121: 'sampler/image' : type requires declaration of default precision qualifier 
+ERROR: 0:122: 'sampler/image' : type requires declaration of default precision qualifier 
+ERROR: 0:123: 'sampler/image' : type requires declaration of default precision qualifier 
+ERROR: 0:191: 'sampler/image' : type requires declaration of default precision qualifier 
+ERROR: 0:192: 'sampler/image' : type requires declaration of default precision qualifier 
+ERROR: 0:193: 'sampler/image' : type requires declaration of default precision qualifier 
+ERROR: 0:211: 'textureSize' : no matching overloaded function found 
+ERROR: 0:211: '=' :  cannot convert from ' const float' to ' temp highp 3-component vector of int'
+ERROR: 0:252: 'interpolateAtCentroid' : no matching overloaded function found 
+ERROR: 0:253: 'interpolateAtSample' : no matching overloaded function found 
+ERROR: 0:254: 'interpolateAtOffset' : no matching overloaded function found 
+ERROR: 34 compilation errors.  No code generated.
+
+
+Shader version: 320
+ERROR: node is still EOpNull!
+0:23  Function Definition: main( ( global void)
+0:23    Function Parameters: 
+0:25    Sequence
+0:25      Sequence
+0:25        move second child to first child ( temp highp int)
+0:25          'sum' ( temp highp int)
+0:25          add ( temp highp int)
+0:25            'gl_VertexID' ( gl_VertexId highp int VertexId)
+0:26            'gl_InstanceID' ( gl_InstanceId highp int InstanceId)
+0:27      move second child to first child ( temp highp 4-component vector of float)
+0:27        gl_Position: direct index for structure ( gl_Position highp 4-component vector of float Position)
+0:27          'anon@1' ( out block{ gl_Position highp 4-component vector of float Position gl_Position, })
+0:27          Constant:
+0:27            0 (const uint)
+0:27        Constant:
+0:27          1.000000
+0:27          1.000000
+0:27          1.000000
+0:27          1.000000
+0:28      gl_PointSize: direct index for structure ( gl_PointSize highp void PointSize)
+0:28        'anon@1' ( out block{ gl_Position highp 4-component vector of float Position gl_Position, })
+0:28        Constant:
+0:28          1 (const uint)
+0:62  Function Definition: pfoo( ( global void)
+0:62    Function Parameters: 
+0:?     Sequence
+0:65      move second child to first child ( temp highp 2-component vector of float)
+0:65        'h' ( noContraction temp highp 2-component vector of float)
+0:65        fma ( global highp 2-component vector of float)
+0:65          'inf' ( in highp 2-component vector of float)
+0:65          'ing' ( in highp 2-component vector of float)
+0:65          'h' ( noContraction temp highp 2-component vector of float)
+0:66      indirect index ( temp lowp sampler2D)
+0:66        'sArray' ( uniform 4-element array of lowp sampler2D)
+0:66        add ( temp highp int)
+0:66          'sIndex' ( uniform highp int)
+0:66          Constant:
+0:66            1 (const int)
+0:67      indirect index (layout( column_major shared) temp block{layout( column_major shared) uniform highp int i})
+0:67        'ubInst' (layout( column_major shared) uniform 4-element array of block{layout( column_major shared) uniform highp int i})
+0:67        add ( temp highp int)
+0:67          'sIndex' ( uniform highp int)
+0:67          Constant:
+0:67            1 (const int)
+0:68      indirect index (layout( column_major shared) temp block{layout( column_major shared) buffer highp int i})
+0:68        'bbInst' (layout( column_major shared) buffer 4-element array of block{layout( column_major shared) buffer highp int i})
+0:68        subtract ( temp highp int)
+0:68          'sIndex' ( uniform highp int)
+0:68          Constant:
+0:68            2 (const int)
+0:69      direct index ( writeonly temp highp image2D)
+0:69        'iArray' ( writeonly uniform 5-element array of highp image2D)
+0:69        Constant:
+0:69          2 (const int)
+0:70      indirect index ( writeonly temp highp image2D)
+0:70        'iArray' ( writeonly uniform 5-element array of highp image2D)
+0:70        subtract ( temp highp int)
+0:70          'sIndex' ( uniform highp int)
+0:70          Constant:
+0:70            2 (const int)
+0:71      textureGatherOffset ( global lowp 4-component vector of float)
+0:71        direct index ( temp lowp sampler2D)
+0:71          'sArray' ( uniform 4-element array of lowp sampler2D)
+0:71          Constant:
+0:71            0 (const int)
+0:71        Constant:
+0:71          0.100000
+0:71          0.100000
+0:71        Convert float to int ( temp lowp 2-component vector of int)
+0:71          'inf' ( in highp 2-component vector of float)
+0:72      textureGatherOffsets ( global lowp 4-component vector of float, operation at highp)
+0:72        direct index ( temp lowp sampler2D)
+0:72          'sArray' ( uniform 4-element array of lowp sampler2D)
+0:72          Constant:
+0:72            0 (const int)
+0:72        Constant:
+0:72          0.100000
+0:72          0.100000
+0:72        Constant:
+0:72          0 (const int)
+0:72          0 (const int)
+0:72          0 (const int)
+0:72          0 (const int)
+0:72          0 (const int)
+0:72          0 (const int)
+0:72          0 (const int)
+0:72          0 (const int)
+0:73      textureGatherOffsets ( global lowp 4-component vector of float, operation at highp)
+0:73        direct index ( temp lowp sampler2D)
+0:73          'sArray' ( uniform 4-element array of lowp sampler2D)
+0:73          Constant:
+0:73            0 (const int)
+0:73        Constant:
+0:73          0.100000
+0:73          0.100000
+0:73        'offsets' ( uniform 4-element array of highp 2-component vector of int)
+0:101  Function Definition: bufferT( ( global void)
+0:101    Function Parameters: 
+0:103    Sequence
+0:103      Sequence
+0:103        move second child to first child ( temp highp int)
+0:103          's1' ( temp highp int)
+0:103          textureSize ( global highp int)
+0:103            'bufSamp1' ( uniform highp samplerBuffer)
+0:104      Sequence
+0:104        move second child to first child ( temp highp int)
+0:104          's2' ( temp highp int)
+0:104          textureSize ( global highp int)
+0:104            'bufSamp2' ( uniform highp isamplerBuffer)
+0:105      Sequence
+0:105        move second child to first child ( temp highp int)
+0:105          's3' ( temp highp int)
+0:105          textureSize ( global highp int)
+0:105            'bufSamp3' ( uniform highp usamplerBuffer)
+0:107      Sequence
+0:107        move second child to first child ( temp highp int)
+0:107          's4' ( temp highp int)
+0:107          imageQuerySize ( global highp int)
+0:107            'bufSamp4' ( writeonly uniform highp imageBuffer)
+0:108      Sequence
+0:108        move second child to first child ( temp highp int)
+0:108          's5' ( temp highp int)
+0:108          imageQuerySize ( global highp int)
+0:108            'bufSamp5' ( writeonly uniform highp iimageBuffer)
+0:109      Sequence
+0:109        move second child to first child ( temp highp int)
+0:109          's6' ( temp highp int)
+0:109          imageQuerySize ( global highp int)
+0:109            'bufSamp6' ( writeonly uniform highp uimageBuffer)
+0:111      Sequence
+0:111        move second child to first child ( temp highp 4-component vector of float)
+0:111          'f1' ( temp highp 4-component vector of float)
+0:111          textureFetch ( global highp 4-component vector of float)
+0:111            'bufSamp1' ( uniform highp samplerBuffer)
+0:111            's1' ( temp highp int)
+0:112      Sequence
+0:112        move second child to first child ( temp highp 4-component vector of int)
+0:112          'f2' ( temp highp 4-component vector of int)
+0:112          textureFetch ( global highp 4-component vector of int)
+0:112            'bufSamp2' ( uniform highp isamplerBuffer)
+0:112            's2' ( temp highp int)
+0:113      Sequence
+0:113        move second child to first child ( temp highp 4-component vector of uint)
+0:113          'f3' ( temp highp 4-component vector of uint)
+0:113          textureFetch ( global highp 4-component vector of uint)
+0:113            'bufSamp3' ( uniform highp usamplerBuffer)
+0:113            's3' ( temp highp int)
+0:149  Function Definition: CAT( ( global void)
+0:149    Function Parameters: 
+0:151    Sequence
+0:151      Sequence
+0:151        move second child to first child ( temp highp 3-component vector of int)
+0:151          's4' ( temp highp 3-component vector of int)
+0:151          textureSize ( global highp 3-component vector of int)
+0:151            'CA4' ( uniform highp samplerCubeArray)
+0:151            Constant:
+0:151              1 (const int)
+0:152      Sequence
+0:152        move second child to first child ( temp highp 3-component vector of int)
+0:152          's5' ( temp highp 3-component vector of int)
+0:152          textureSize ( global highp 3-component vector of int)
+0:152            'CA5' ( uniform highp samplerCubeArrayShadow)
+0:152            Constant:
+0:152              1 (const int)
+0:153      Sequence
+0:153        move second child to first child ( temp highp 3-component vector of int)
+0:153          's6' ( temp highp 3-component vector of int)
+0:153          textureSize ( global highp 3-component vector of int)
+0:153            'CA6' ( uniform highp isamplerCubeArray)
+0:153            Constant:
+0:153              1 (const int)
+0:154      Sequence
+0:154        move second child to first child ( temp highp 3-component vector of int)
+0:154          's7' ( temp highp 3-component vector of int)
+0:154          textureSize ( global highp 3-component vector of int)
+0:154            'CA7' ( uniform highp usamplerCubeArray)
+0:154            Constant:
+0:154              1 (const int)
+0:156      Sequence
+0:156        move second child to first child ( temp highp 4-component vector of float)
+0:156          't4' ( temp highp 4-component vector of float)
+0:156          texture ( global highp 4-component vector of float)
+0:156            'CA4' ( uniform highp samplerCubeArray)
+0:156            Constant:
+0:156              0.500000
+0:156              0.500000
+0:156              0.500000
+0:156              0.500000
+0:157      Sequence
+0:157        move second child to first child ( temp highp float)
+0:157          't5' ( temp highp float)
+0:157          texture ( global highp float)
+0:157            'CA5' ( uniform highp samplerCubeArrayShadow)
+0:157            Constant:
+0:157              0.500000
+0:157              0.500000
+0:157              0.500000
+0:157              0.500000
+0:157            Constant:
+0:157              3.000000
+0:158      Sequence
+0:158        move second child to first child ( temp highp 4-component vector of int)
+0:158          't6' ( temp highp 4-component vector of int)
+0:158          texture ( global highp 4-component vector of int)
+0:158            'CA6' ( uniform highp isamplerCubeArray)
+0:158            Constant:
+0:158              0.500000
+0:158              0.500000
+0:158              0.500000
+0:158              0.500000
+0:159      Sequence
+0:159        move second child to first child ( temp highp 4-component vector of uint)
+0:159          't7' ( temp highp 4-component vector of uint)
+0:159          texture ( global highp 4-component vector of uint)
+0:159            'CA7' ( uniform highp usamplerCubeArray)
+0:159            Constant:
+0:159              0.500000
+0:159              0.500000
+0:159              0.500000
+0:159              0.500000
+0:161      Sequence
+0:161        move second child to first child ( temp highp 4-component vector of float)
+0:161          'L4' ( temp highp 4-component vector of float)
+0:161          textureLod ( global highp 4-component vector of float)
+0:161            'CA4' ( uniform highp samplerCubeArray)
+0:161            Constant:
+0:161              0.500000
+0:161              0.500000
+0:161              0.500000
+0:161              0.500000
+0:161            Constant:
+0:161              0.240000
+0:162      Sequence
+0:162        move second child to first child ( temp highp 4-component vector of int)
+0:162          'L6' ( temp highp 4-component vector of int)
+0:162          textureLod ( global highp 4-component vector of int)
+0:162            'CA6' ( uniform highp isamplerCubeArray)
+0:162            Constant:
+0:162              0.500000
+0:162              0.500000
+0:162              0.500000
+0:162              0.500000
+0:162            Constant:
+0:162              0.260000
+0:163      Sequence
+0:163        move second child to first child ( temp highp 4-component vector of uint)
+0:163          'L7' ( temp highp 4-component vector of uint)
+0:163          textureLod ( global highp 4-component vector of uint)
+0:163            'CA7' ( uniform highp usamplerCubeArray)
+0:163            Constant:
+0:163              0.500000
+0:163              0.500000
+0:163              0.500000
+0:163              0.500000
+0:163            Constant:
+0:163              0.270000
+0:165      Sequence
+0:165        move second child to first child ( temp highp 4-component vector of float)
+0:165          'g4' ( temp highp 4-component vector of float)
+0:165          textureGrad ( global highp 4-component vector of float)
+0:165            'CA4' ( uniform highp samplerCubeArray)
+0:165            Constant:
+0:165              0.500000
+0:165              0.500000
+0:165              0.500000
+0:165              0.500000
+0:165            Constant:
+0:165              0.100000
+0:165              0.100000
+0:165              0.100000
+0:165            Constant:
+0:165              0.200000
+0:165              0.200000
+0:165              0.200000
+0:166      Sequence
+0:166        move second child to first child ( temp highp 4-component vector of int)
+0:166          'g6' ( temp highp 4-component vector of int)
+0:166          textureGrad ( global highp 4-component vector of int)
+0:166            'CA6' ( uniform highp isamplerCubeArray)
+0:166            Constant:
+0:166              0.500000
+0:166              0.500000
+0:166              0.500000
+0:166              0.500000
+0:166            Constant:
+0:166              0.100000
+0:166              0.100000
+0:166              0.100000
+0:166            Constant:
+0:166              0.200000
+0:166              0.200000
+0:166              0.200000
+0:167      Sequence
+0:167        move second child to first child ( temp highp 4-component vector of uint)
+0:167          'g7' ( temp highp 4-component vector of uint)
+0:167          textureGrad ( global highp 4-component vector of uint)
+0:167            'CA7' ( uniform highp usamplerCubeArray)
+0:167            Constant:
+0:167              0.500000
+0:167              0.500000
+0:167              0.500000
+0:167              0.500000
+0:167            Constant:
+0:167              0.100000
+0:167              0.100000
+0:167              0.100000
+0:167            Constant:
+0:167              0.200000
+0:167              0.200000
+0:167              0.200000
+0:169      Sequence
+0:169        move second child to first child ( temp highp 4-component vector of float)
+0:169          'gath4' ( temp highp 4-component vector of float)
+0:169          textureGather ( global highp 4-component vector of float)
+0:169            'CA4' ( uniform highp samplerCubeArray)
+0:169            Constant:
+0:169              0.500000
+0:169              0.500000
+0:169              0.500000
+0:169              0.500000
+0:170      Sequence
+0:170        move second child to first child ( temp highp 4-component vector of float)
+0:170          'gathC4' ( temp highp 4-component vector of float)
+0:170          textureGather ( global highp 4-component vector of float)
+0:170            'CA4' ( uniform highp samplerCubeArray)
+0:170            Constant:
+0:170              0.500000
+0:170              0.500000
+0:170              0.500000
+0:170              0.500000
+0:170            Constant:
+0:170              2 (const int)
+0:171      Sequence
+0:171        move second child to first child ( temp highp 4-component vector of int)
+0:171          'gath6' ( temp highp 4-component vector of int)
+0:171          textureGather ( global highp 4-component vector of int)
+0:171            'CA6' ( uniform highp isamplerCubeArray)
+0:171            Constant:
+0:171              0.500000
+0:171              0.500000
+0:171              0.500000
+0:171              0.500000
+0:172      Sequence
+0:172        move second child to first child ( temp highp 4-component vector of int)
+0:172          'gathC6' ( temp highp 4-component vector of int)
+0:172          textureGather ( global highp 4-component vector of int)
+0:172            'CA6' ( uniform highp isamplerCubeArray)
+0:172            Constant:
+0:172              0.500000
+0:172              0.500000
+0:172              0.500000
+0:172              0.500000
+0:172            Constant:
+0:172              1 (const int)
+0:173      Sequence
+0:173        move second child to first child ( temp highp 4-component vector of uint)
+0:173          'gath7' ( temp highp 4-component vector of uint)
+0:173          textureGather ( global highp 4-component vector of uint)
+0:173            'CA7' ( uniform highp usamplerCubeArray)
+0:173            Constant:
+0:173              0.500000
+0:173              0.500000
+0:173              0.500000
+0:173              0.500000
+0:174      Sequence
+0:174        move second child to first child ( temp highp 4-component vector of uint)
+0:174          'gathC7' ( temp highp 4-component vector of uint)
+0:174          textureGather ( global highp 4-component vector of uint)
+0:174            'CA7' ( uniform highp usamplerCubeArray)
+0:174            Constant:
+0:174              0.500000
+0:174              0.500000
+0:174              0.500000
+0:174              0.500000
+0:174            Constant:
+0:174              0 (const int)
+0:176      Sequence
+0:176        move second child to first child ( temp highp 4-component vector of float)
+0:176          'gath5' ( temp highp 4-component vector of float)
+0:176          textureGather ( global highp 4-component vector of float)
+0:176            'CA5' ( uniform highp samplerCubeArrayShadow)
+0:176            Constant:
+0:176              0.500000
+0:176              0.500000
+0:176              0.500000
+0:176              0.500000
+0:176            Constant:
+0:176              2.500000
+0:178      Sequence
+0:178        move second child to first child ( temp highp 3-component vector of int)
+0:178          's1' ( temp highp 3-component vector of int)
+0:178          imageQuerySize ( global highp 3-component vector of int)
+0:178            'CA1' ( writeonly uniform highp imageCubeArray)
+0:179      Sequence
+0:179        move second child to first child ( temp highp 3-component vector of int)
+0:179          's2' ( temp highp 3-component vector of int)
+0:179          imageQuerySize ( global highp 3-component vector of int)
+0:179            'CA2' ( writeonly uniform highp iimageCubeArray)
+0:180      Sequence
+0:180        move second child to first child ( temp highp 3-component vector of int)
+0:180          's3' ( temp highp 3-component vector of int)
+0:180          imageQuerySize ( global highp 3-component vector of int)
+0:180            'CA3' ( writeonly uniform highp uimageCubeArray)
+0:182      imageStore ( global highp void)
+0:182        'CA1' ( writeonly uniform highp imageCubeArray)
+0:182        's3' ( temp highp 3-component vector of int)
+0:182        Constant:
+0:182          1.000000
+0:182          1.000000
+0:182          1.000000
+0:182          1.000000
+0:183      imageStore ( global highp void)
+0:183        'CA2' ( writeonly uniform highp iimageCubeArray)
+0:183        's3' ( temp highp 3-component vector of int)
+0:183        Constant:
+0:183          1 (const int)
+0:183          1 (const int)
+0:183          1 (const int)
+0:183          1 (const int)
+0:184      imageStore ( global highp void)
+0:184        'CA3' ( writeonly uniform highp uimageCubeArray)
+0:184        's3' ( temp highp 3-component vector of int)
+0:184        Constant:
+0:184          1 (const uint)
+0:184          1 (const uint)
+0:184          1 (const uint)
+0:184          1 (const uint)
+0:186      Sequence
+0:186        move second child to first child ( temp highp 4-component vector of float)
+0:186          'cl1' ( temp highp 4-component vector of float)
+0:186          imageLoad ( global highp 4-component vector of float)
+0:186            'rCA1' (layout( rgba16f) readonly uniform highp imageCubeArray)
+0:186            's3' ( temp highp 3-component vector of int)
+0:187      Sequence
+0:187        move second child to first child ( temp highp 4-component vector of int)
+0:187          'cl2' ( temp highp 4-component vector of int)
+0:187          imageLoad ( global highp 4-component vector of int)
+0:187            'rCA2' (layout( rgba32i) readonly uniform highp iimageCubeArray)
+0:187            's3' ( temp highp 3-component vector of int)
+0:188      Sequence
+0:188        move second child to first child ( temp highp 4-component vector of uint)
+0:188          'cl3' ( temp highp 4-component vector of uint)
+0:188          imageLoad ( global highp 4-component vector of uint)
+0:188            'rCA3' (layout( r32ui) readonly uniform highp uimageCubeArray)
+0:188            's3' ( temp highp 3-component vector of int)
+0:203  Function Definition: MSA( ( global void)
+0:203    Function Parameters: 
+0:205    Sequence
+0:205      Sequence
+0:205        move second child to first child ( temp highp 4-component vector of float)
+0:205          'tf' ( temp highp 4-component vector of float)
+0:205          textureFetch ( global highp 4-component vector of float)
+0:205            'samp2DMSA' ( uniform highp sampler2DMSArray)
+0:205            Constant:
+0:205              5 (const int)
+0:205              5 (const int)
+0:205              5 (const int)
+0:205            Constant:
+0:205              2 (const int)
+0:206      Sequence
+0:206        move second child to first child ( temp highp 4-component vector of int)
+0:206          'tfi' ( temp highp 4-component vector of int)
+0:206          textureFetch ( global highp 4-component vector of int)
+0:206            'samp2DMSAi' ( uniform highp isampler2DMSArray)
+0:206            Constant:
+0:206              5 (const int)
+0:206              5 (const int)
+0:206              5 (const int)
+0:206            Constant:
+0:206              2 (const int)
+0:207      Sequence
+0:207        move second child to first child ( temp highp 4-component vector of uint)
+0:207          'tfu' ( temp highp 4-component vector of uint)
+0:207          textureFetch ( global highp 4-component vector of uint)
+0:207            'samp2DMSAu' ( uniform highp usampler2DMSArray)
+0:207            Constant:
+0:207              5 (const int)
+0:207              5 (const int)
+0:207              5 (const int)
+0:207            Constant:
+0:207              2 (const int)
+0:209      Sequence
+0:209        move second child to first child ( temp highp 3-component vector of int)
+0:209          'tfs' ( temp highp 3-component vector of int)
+0:209          textureSize ( global highp 3-component vector of int)
+0:209            'samp2DMSA' ( uniform highp sampler2DMSArray)
+0:210      Sequence
+0:210        move second child to first child ( temp highp 3-component vector of int)
+0:210          'tfsi' ( temp highp 3-component vector of int)
+0:210          textureSize ( global highp 3-component vector of int)
+0:210            'samp2DMSAi' ( uniform highp isampler2DMSArray)
+0:212      Sequence
+0:212        move second child to first child ( temp highp 3-component vector of int)
+0:212          'tfsu' ( temp highp 3-component vector of int)
+0:212          textureSize ( global highp 3-component vector of int)
+0:212            'samp2DMSAu' ( uniform highp usampler2DMSArray)
+0:220  Function Definition: goodImageAtom( ( global void)
+0:220    Function Parameters: 
+0:?     Sequence
+0:226      imageAtomicAdd ( global highp int)
+0:226        'im2Di' (layout( r32i) uniform highp iimage2D)
+0:226        'P' ( uniform highp 2-component vector of int)
+0:226        'dati' ( temp highp int)
+0:227      imageAtomicAdd ( global highp uint)
+0:227        'im2Du' (layout( r32ui) uniform highp uimage2D)
+0:227        'P' ( uniform highp 2-component vector of int)
+0:227        'datu' ( temp highp uint)
+0:228      imageAtomicMin ( global highp int)
+0:228        'im2Di' (layout( r32i) uniform highp iimage2D)
+0:228        'P' ( uniform highp 2-component vector of int)
+0:228        'dati' ( temp highp int)
+0:229      imageAtomicMin ( global highp uint)
+0:229        'im2Du' (layout( r32ui) uniform highp uimage2D)
+0:229        'P' ( uniform highp 2-component vector of int)
+0:229        'datu' ( temp highp uint)
+0:230      imageAtomicMax ( global highp int)
+0:230        'im2Di' (layout( r32i) uniform highp iimage2D)
+0:230        'P' ( uniform highp 2-component vector of int)
+0:230        'dati' ( temp highp int)
+0:231      imageAtomicMax ( global highp uint)
+0:231        'im2Du' (layout( r32ui) uniform highp uimage2D)
+0:231        'P' ( uniform highp 2-component vector of int)
+0:231        'datu' ( temp highp uint)
+0:232      imageAtomicAnd ( global highp int)
+0:232        'im2Di' (layout( r32i) uniform highp iimage2D)
+0:232        'P' ( uniform highp 2-component vector of int)
+0:232        'dati' ( temp highp int)
+0:233      imageAtomicAnd ( global highp uint)
+0:233        'im2Du' (layout( r32ui) uniform highp uimage2D)
+0:233        'P' ( uniform highp 2-component vector of int)
+0:233        'datu' ( temp highp uint)
+0:234      imageAtomicOr ( global highp int)
+0:234        'im2Di' (layout( r32i) uniform highp iimage2D)
+0:234        'P' ( uniform highp 2-component vector of int)
+0:234        'dati' ( temp highp int)
+0:235      imageAtomicOr ( global highp uint)
+0:235        'im2Du' (layout( r32ui) uniform highp uimage2D)
+0:235        'P' ( uniform highp 2-component vector of int)
+0:235        'datu' ( temp highp uint)
+0:236      imageAtomicXor ( global highp int)
+0:236        'im2Di' (layout( r32i) uniform highp iimage2D)
+0:236        'P' ( uniform highp 2-component vector of int)
+0:236        'dati' ( temp highp int)
+0:237      imageAtomicXor ( global highp uint)
+0:237        'im2Du' (layout( r32ui) uniform highp uimage2D)
+0:237        'P' ( uniform highp 2-component vector of int)
+0:237        'datu' ( temp highp uint)
+0:238      imageAtomicExchange ( global highp int)
+0:238        'im2Di' (layout( r32i) uniform highp iimage2D)
+0:238        'P' ( uniform highp 2-component vector of int)
+0:238        'dati' ( temp highp int)
+0:239      imageAtomicExchange ( global highp uint)
+0:239        'im2Du' (layout( r32ui) uniform highp uimage2D)
+0:239        'P' ( uniform highp 2-component vector of int)
+0:239        'datu' ( temp highp uint)
+0:240      imageAtomicExchange ( global highp float)
+0:240        'im2Df' (layout( r32f) uniform highp image2D)
+0:240        'P' ( uniform highp 2-component vector of int)
+0:240        'datf' ( temp highp float)
+0:241      imageAtomicCompSwap ( global highp int)
+0:241        'im2Di' (layout( r32i) uniform highp iimage2D)
+0:241        'P' ( uniform highp 2-component vector of int)
+0:241        Constant:
+0:241          3 (const int)
+0:241        'dati' ( temp highp int)
+0:242      imageAtomicCompSwap ( global highp uint)
+0:242        'im2Du' (layout( r32ui) uniform highp uimage2D)
+0:242        'P' ( uniform highp 2-component vector of int)
+0:242        Constant:
+0:242          5 (const uint)
+0:242        'datu' ( temp highp uint)
+0:250  Function Definition: badInterp( ( global void)
+0:250    Function Parameters: 
+0:252    Sequence
+0:252      Constant:
+0:252        0.000000
+0:253      Constant:
+0:253        0.000000
+0:254      Constant:
+0:254        0.000000
+0:?   Linker Objects
+0:?     'outbinst' ( out block{ out highp int a,  out highp 4-component vector of float v,  out highp sampler2D s})
+0:?     'anon@0' ( out block{layout( location=12) out highp int aAnon, layout( location=13) out highp 4-component vector of float vAnon})
+0:?     'aliased' (layout( location=12) smooth out highp int)
+0:?     'inbinst' ( in block{ in highp int a})
+0:?     'anon@1' ( out block{ gl_Position highp 4-component vector of float Position gl_Position, })
+0:?     'smon' ( smooth out block{ out highp int i})
+0:?     'fmon' ( flat out block{ out highp int i})
+0:?     'cmon' ( centroid out block{ out highp int i})
+0:?     'imon' ( invariant out block{ out highp int i})
+0:?     'inf' ( in highp 2-component vector of float)
+0:?     'ing' ( in highp 2-component vector of float)
+0:?     'offsets' ( uniform 4-element array of highp 2-component vector of int)
+0:?     'sArray' ( uniform 4-element array of lowp sampler2D)
+0:?     'sIndex' ( uniform highp int)
+0:?     'auArray' (layout( binding=0 offset=0) uniform 2-element array of highp atomic_uint)
+0:?     'ubInst' (layout( column_major shared) uniform 4-element array of block{layout( column_major shared) uniform highp int i})
+0:?     'bbInst' (layout( column_major shared) buffer 4-element array of block{layout( column_major shared) buffer highp int i})
+0:?     'iArray' ( writeonly uniform 5-element array of highp image2D)
+0:?     'constOffsets' ( const 4-element array of highp 2-component vector of int)
+0:?       0 (const int)
+0:?       0 (const int)
+0:?       0 (const int)
+0:?       0 (const int)
+0:?       0 (const int)
+0:?       0 (const int)
+0:?       0 (const int)
+0:?       0 (const int)
+0:?     'noPreSamp1' ( uniform mediump samplerBuffer)
+0:?     'noPreSamp2' ( uniform mediump isamplerBuffer)
+0:?     'noPreSamp3' ( uniform mediump usamplerBuffer)
+0:?     'noPreSamp4' ( writeonly uniform mediump imageBuffer)
+0:?     'noPreSamp5' ( writeonly uniform mediump iimageBuffer)
+0:?     'noPreSamp6' ( writeonly uniform mediump uimageBuffer)
+0:?     'bufSamp1' ( uniform highp samplerBuffer)
+0:?     'bufSamp2' ( uniform highp isamplerBuffer)
+0:?     'bufSamp3' ( uniform highp usamplerBuffer)
+0:?     'bufSamp4' ( writeonly uniform highp imageBuffer)
+0:?     'bufSamp5' ( writeonly uniform highp iimageBuffer)
+0:?     'bufSamp6' ( writeonly uniform highp uimageBuffer)
+0:?     'noPreCA1' ( writeonly uniform mediump imageCubeArray)
+0:?     'noPreCA2' ( writeonly uniform mediump iimageCubeArray)
+0:?     'noPreCA3' ( writeonly uniform mediump uimageCubeArray)
+0:?     'noPreCA4' ( uniform mediump samplerCubeArray)
+0:?     'noPreCA5' ( uniform mediump samplerCubeArrayShadow)
+0:?     'noPreCA6' ( uniform mediump isamplerCubeArray)
+0:?     'noPreCA7' ( uniform mediump usamplerCubeArray)
+0:?     'CA1' ( writeonly uniform highp imageCubeArray)
+0:?     'CA2' ( writeonly uniform highp iimageCubeArray)
+0:?     'CA3' ( writeonly uniform highp uimageCubeArray)
+0:?     'rCA1' (layout( rgba16f) readonly uniform highp imageCubeArray)
+0:?     'rCA2' (layout( rgba32i) readonly uniform highp iimageCubeArray)
+0:?     'rCA3' (layout( r32ui) readonly uniform highp uimageCubeArray)
+0:?     'CA4' ( uniform highp samplerCubeArray)
+0:?     'CA5' ( uniform highp samplerCubeArrayShadow)
+0:?     'CA6' ( uniform highp isamplerCubeArray)
+0:?     'CA7' ( uniform highp usamplerCubeArray)
+0:?     'noPrec2DMS' ( uniform mediump sampler2DMSArray)
+0:?     'noPrec2DMSi' ( uniform mediump isampler2DMSArray)
+0:?     'noPrec2DMSu' ( uniform mediump usampler2DMSArray)
+0:?     'samp2DMSA' ( uniform highp sampler2DMSArray)
+0:?     'samp2DMSAi' ( uniform highp isampler2DMSArray)
+0:?     'samp2DMSAu' ( uniform highp usampler2DMSArray)
+0:?     'im2Df' (layout( r32f) uniform highp image2D)
+0:?     'im2Du' (layout( r32ui) uniform highp uimage2D)
+0:?     'im2Di' (layout( r32i) uniform highp iimage2D)
+0:?     'P' ( uniform highp 2-component vector of int)
+0:?     'colorSample' ( smooth sample out highp 4-component vector of float)
+0:?     'colorfsi' ( flat sample out highp 4-component vector of float)
+0:?     'sampInArray' ( smooth sample out 4-element array of highp 3-component vector of float)
+0:?     'inv4' ( in highp 4-component vector of float)
+0:?     'gl_VertexID' ( gl_VertexId highp int VertexId)
+0:?     'gl_InstanceID' ( gl_InstanceId highp int InstanceId)
+
+
+Linked vertex stage:
+
+
+Shader version: 320
+ERROR: node is still EOpNull!
+0:23  Function Definition: main( ( global void)
+0:23    Function Parameters: 
+0:25    Sequence
+0:25      Sequence
+0:25        move second child to first child ( temp highp int)
+0:25          'sum' ( temp highp int)
+0:25          add ( temp highp int)
+0:25            'gl_VertexID' ( gl_VertexId highp int VertexId)
+0:26            'gl_InstanceID' ( gl_InstanceId highp int InstanceId)
+0:27      move second child to first child ( temp highp 4-component vector of float)
+0:27        gl_Position: direct index for structure ( gl_Position highp 4-component vector of float Position)
+0:27          'anon@1' ( out block{ gl_Position highp 4-component vector of float Position gl_Position, })
+0:27          Constant:
+0:27            0 (const uint)
+0:27        Constant:
+0:27          1.000000
+0:27          1.000000
+0:27          1.000000
+0:27          1.000000
+0:28      gl_PointSize: direct index for structure ( gl_PointSize highp void PointSize)
+0:28        'anon@1' ( out block{ gl_Position highp 4-component vector of float Position gl_Position, })
+0:28        Constant:
+0:28          1 (const uint)
+0:?   Linker Objects
+0:?     'outbinst' ( out block{ out highp int a,  out highp 4-component vector of float v,  out highp sampler2D s})
+0:?     'anon@0' ( out block{layout( location=12) out highp int aAnon, layout( location=13) out highp 4-component vector of float vAnon})
+0:?     'aliased' (layout( location=12) smooth out highp int)
+0:?     'inbinst' ( in block{ in highp int a})
+0:?     'anon@1' ( out block{ gl_Position highp 4-component vector of float Position gl_Position, })
+0:?     'smon' ( smooth out block{ out highp int i})
+0:?     'fmon' ( flat out block{ out highp int i})
+0:?     'cmon' ( centroid out block{ out highp int i})
+0:?     'imon' ( invariant out block{ out highp int i})
+0:?     'inf' ( in highp 2-component vector of float)
+0:?     'ing' ( in highp 2-component vector of float)
+0:?     'offsets' ( uniform 4-element array of highp 2-component vector of int)
+0:?     'sArray' ( uniform 4-element array of lowp sampler2D)
+0:?     'sIndex' ( uniform highp int)
+0:?     'auArray' (layout( binding=0 offset=0) uniform 2-element array of highp atomic_uint)
+0:?     'ubInst' (layout( column_major shared) uniform 4-element array of block{layout( column_major shared) uniform highp int i})
+0:?     'bbInst' (layout( column_major shared) buffer 4-element array of block{layout( column_major shared) buffer highp int i})
+0:?     'iArray' ( writeonly uniform 5-element array of highp image2D)
+0:?     'constOffsets' ( const 4-element array of highp 2-component vector of int)
+0:?       0 (const int)
+0:?       0 (const int)
+0:?       0 (const int)
+0:?       0 (const int)
+0:?       0 (const int)
+0:?       0 (const int)
+0:?       0 (const int)
+0:?       0 (const int)
+0:?     'noPreSamp1' ( uniform mediump samplerBuffer)
+0:?     'noPreSamp2' ( uniform mediump isamplerBuffer)
+0:?     'noPreSamp3' ( uniform mediump usamplerBuffer)
+0:?     'noPreSamp4' ( writeonly uniform mediump imageBuffer)
+0:?     'noPreSamp5' ( writeonly uniform mediump iimageBuffer)
+0:?     'noPreSamp6' ( writeonly uniform mediump uimageBuffer)
+0:?     'bufSamp1' ( uniform highp samplerBuffer)
+0:?     'bufSamp2' ( uniform highp isamplerBuffer)
+0:?     'bufSamp3' ( uniform highp usamplerBuffer)
+0:?     'bufSamp4' ( writeonly uniform highp imageBuffer)
+0:?     'bufSamp5' ( writeonly uniform highp iimageBuffer)
+0:?     'bufSamp6' ( writeonly uniform highp uimageBuffer)
+0:?     'noPreCA1' ( writeonly uniform mediump imageCubeArray)
+0:?     'noPreCA2' ( writeonly uniform mediump iimageCubeArray)
+0:?     'noPreCA3' ( writeonly uniform mediump uimageCubeArray)
+0:?     'noPreCA4' ( uniform mediump samplerCubeArray)
+0:?     'noPreCA5' ( uniform mediump samplerCubeArrayShadow)
+0:?     'noPreCA6' ( uniform mediump isamplerCubeArray)
+0:?     'noPreCA7' ( uniform mediump usamplerCubeArray)
+0:?     'CA1' ( writeonly uniform highp imageCubeArray)
+0:?     'CA2' ( writeonly uniform highp iimageCubeArray)
+0:?     'CA3' ( writeonly uniform highp uimageCubeArray)
+0:?     'rCA1' (layout( rgba16f) readonly uniform highp imageCubeArray)
+0:?     'rCA2' (layout( rgba32i) readonly uniform highp iimageCubeArray)
+0:?     'rCA3' (layout( r32ui) readonly uniform highp uimageCubeArray)
+0:?     'CA4' ( uniform highp samplerCubeArray)
+0:?     'CA5' ( uniform highp samplerCubeArrayShadow)
+0:?     'CA6' ( uniform highp isamplerCubeArray)
+0:?     'CA7' ( uniform highp usamplerCubeArray)
+0:?     'noPrec2DMS' ( uniform mediump sampler2DMSArray)
+0:?     'noPrec2DMSi' ( uniform mediump isampler2DMSArray)
+0:?     'noPrec2DMSu' ( uniform mediump usampler2DMSArray)
+0:?     'samp2DMSA' ( uniform highp sampler2DMSArray)
+0:?     'samp2DMSAi' ( uniform highp isampler2DMSArray)
+0:?     'samp2DMSAu' ( uniform highp usampler2DMSArray)
+0:?     'im2Df' (layout( r32f) uniform highp image2D)
+0:?     'im2Du' (layout( r32ui) uniform highp uimage2D)
+0:?     'im2Di' (layout( r32i) uniform highp iimage2D)
+0:?     'P' ( uniform highp 2-component vector of int)
+0:?     'colorSample' ( smooth sample out highp 4-component vector of float)
+0:?     'colorfsi' ( flat sample out highp 4-component vector of float)
+0:?     'sampInArray' ( smooth sample out 4-element array of highp 3-component vector of float)
+0:?     'inv4' ( in highp 4-component vector of float)
+0:?     'gl_VertexID' ( gl_VertexId highp int VertexId)
+0:?     'gl_InstanceID' ( gl_InstanceId highp int InstanceId)
+
diff --git a/Test/baseResults/330.frag.out b/Test/baseResults/330.frag.out
index 4b5a84b..7745631 100644
--- a/Test/baseResults/330.frag.out
+++ b/Test/baseResults/330.frag.out
@@ -16,6 +16,7 @@
 ERROR: 0:62: 'location on block member' : can only use in an in/out block 
 ERROR: 0:62: 'location qualifier on uniform or buffer' : not supported for this version or the enabled extensions 
 ERROR: 0:60: 'location qualifier on uniform or buffer' : not supported for this version or the enabled extensions 
+ERROR: 0:60: 'location' : cannot apply to uniform or buffer block 
 ERROR: 0:68: 'layout-id value' : cannot be negative 
 ERROR: 0:69: 'layout-id value' : cannot be negative 
 ERROR: 0:76: 'f2' : cannot use layout qualifiers on structure members 
@@ -23,6 +24,7 @@
 ERROR: 0:91: 'location qualifier on uniform or buffer' : not supported for this version or the enabled extensions 
 ERROR: 0:91: 'location' : overlapping use of location 3
 ERROR: 0:89: 'location qualifier on uniform or buffer' : not supported for this version or the enabled extensions 
+ERROR: 0:89: 'location' : cannot apply to uniform or buffer block 
 ERROR: 0:94: 'location' : either the block needs a location, or all members need a location, or no members have a location 
 ERROR: 0:108: 'A' : cannot use layout qualifiers on structure members 
 ERROR: 0:119: 'location' : overlapping use of location 44
@@ -38,7 +40,7 @@
 ERROR: 0:141: 'textureQueryLod' : no matching overloaded function found 
 ERROR: 0:141: 'assign' :  cannot convert from ' const float' to ' temp 2-component vector of float'
 ERROR: 0:152: 'index' : value must be 0 or 1 
-ERROR: 39 compilation errors.  No code generated.
+ERROR: 41 compilation errors.  No code generated.
 
 
 Shader version: 330
@@ -100,7 +102,7 @@
 0:?     'v20' ( smooth in 4-component vector of float)
 0:?     'v21' (layout( location=60) smooth in float)
 0:?     'v22' (layout( location=2) smooth in float)
-0:?     'anon@1' ( in block{layout( location=1 component=0) in float f1, layout( location=3) in float f2})
+0:?     'anon@1' ( in block{layout( location=1) in float f1, layout( location=3) in float f2})
 0:?     'uinst' (layout( location=1 column_major shared) uniform block{layout( column_major shared) uniform float f1, layout( location=3 column_major shared) uniform float f2})
 0:?     'v3' (layout( location=6) smooth in 4-component vector of float)
 0:?     'v4' ( smooth in 4-component vector of float)
@@ -108,12 +110,12 @@
 0:?     'v6' (layout( location=30) smooth in 4-component vector of float)
 0:?     'v23' (layout( location=61) smooth in float)
 0:?     'v24' (layout( location=62) smooth in float)
-0:?     'ininst2' ( in block{layout( location=28 component=0) in bool b1, layout( location=29 component=0) in float f1, layout( location=25) in float f2, layout( location=26 component=0) in 4-component vector of float f3, layout( location=21) in structure{ global float f1,  temp float f2} s2, layout( location=23 component=0) in 4-component vector of float f4, layout( location=24 component=0) in 4-component vector of float f5})
+0:?     'ininst2' ( in block{layout( location=28) in bool b1, layout( location=29) in float f1, layout( location=25) in float f2, layout( location=26) in 4-component vector of float f3, layout( location=21) in structure{ global float f1,  temp float f2} s2, layout( location=23) in 4-component vector of float f4, layout( location=24) in 4-component vector of float f5})
 0:?     'uinst2' (layout( location=13 column_major shared) uniform block{layout( column_major shared) uniform float f1, layout( location=3 column_major shared) uniform float f2})
 0:?     'in3' ( in block{ in float f1, layout( location=40) in float f2})
 0:?     'in4' ( in block{layout( location=50) in float f1, layout( location=51) in float f2})
 0:?     's' (layout( location=33) smooth in structure{ global 3-component vector of float a,  global 2X2 matrix of float b,  global 2-element array of 4-component vector of float c,  temp 2-component vector of float A})
-0:?     'anon@2' ( in block{layout( location=44 component=0) in 4-component vector of float d, layout( location=45 component=0) in 4-component vector of float e, layout( location=47) in 4-component vector of float f, layout( location=48 component=0) in 4-component vector of float g, layout( location=41) in 4-component vector of float h, layout( location=42 component=0) in 4-component vector of float i, layout( location=43 component=0) in 4-component vector of float j, layout( location=44 component=0) in 4-component vector of float k})
+0:?     'anon@2' ( in block{layout( location=44) in 4-component vector of float d, layout( location=45) in 4-component vector of float e, layout( location=47) in 4-component vector of float f, layout( location=48) in 4-component vector of float g, layout( location=41) in 4-component vector of float h, layout( location=42) in 4-component vector of float i, layout( location=43) in 4-component vector of float j, layout( location=44) in 4-component vector of float k})
 0:?     'outVar2' (layout( location=4095 index=0) out 4-component vector of float)
 0:?     'outVar3' (layout( location=0 index=1) out 4-component vector of float)
 0:?     'outVar4' (layout( location=0 index=1) out 4-component vector of float)
@@ -165,7 +167,7 @@
 0:?     'v20' ( smooth in 4-component vector of float)
 0:?     'v21' (layout( location=60) smooth in float)
 0:?     'v22' (layout( location=2) smooth in float)
-0:?     'anon@1' ( in block{layout( location=1 component=0) in float f1, layout( location=3) in float f2})
+0:?     'anon@1' ( in block{layout( location=1) in float f1, layout( location=3) in float f2})
 0:?     'uinst' (layout( location=1 column_major shared) uniform block{layout( column_major shared) uniform float f1, layout( location=3 column_major shared) uniform float f2})
 0:?     'v3' (layout( location=6) smooth in 4-component vector of float)
 0:?     'v4' ( smooth in 4-component vector of float)
@@ -173,12 +175,12 @@
 0:?     'v6' (layout( location=30) smooth in 4-component vector of float)
 0:?     'v23' (layout( location=61) smooth in float)
 0:?     'v24' (layout( location=62) smooth in float)
-0:?     'ininst2' ( in block{layout( location=28 component=0) in bool b1, layout( location=29 component=0) in float f1, layout( location=25) in float f2, layout( location=26 component=0) in 4-component vector of float f3, layout( location=21) in structure{ global float f1,  temp float f2} s2, layout( location=23 component=0) in 4-component vector of float f4, layout( location=24 component=0) in 4-component vector of float f5})
+0:?     'ininst2' ( in block{layout( location=28) in bool b1, layout( location=29) in float f1, layout( location=25) in float f2, layout( location=26) in 4-component vector of float f3, layout( location=21) in structure{ global float f1,  temp float f2} s2, layout( location=23) in 4-component vector of float f4, layout( location=24) in 4-component vector of float f5})
 0:?     'uinst2' (layout( location=13 column_major shared) uniform block{layout( column_major shared) uniform float f1, layout( location=3 column_major shared) uniform float f2})
 0:?     'in3' ( in block{ in float f1, layout( location=40) in float f2})
 0:?     'in4' ( in block{layout( location=50) in float f1, layout( location=51) in float f2})
 0:?     's' (layout( location=33) smooth in structure{ global 3-component vector of float a,  global 2X2 matrix of float b,  global 2-element array of 4-component vector of float c,  temp 2-component vector of float A})
-0:?     'anon@2' ( in block{layout( location=44 component=0) in 4-component vector of float d, layout( location=45 component=0) in 4-component vector of float e, layout( location=47) in 4-component vector of float f, layout( location=48 component=0) in 4-component vector of float g, layout( location=41) in 4-component vector of float h, layout( location=42 component=0) in 4-component vector of float i, layout( location=43 component=0) in 4-component vector of float j, layout( location=44 component=0) in 4-component vector of float k})
+0:?     'anon@2' ( in block{layout( location=44) in 4-component vector of float d, layout( location=45) in 4-component vector of float e, layout( location=47) in 4-component vector of float f, layout( location=48) in 4-component vector of float g, layout( location=41) in 4-component vector of float h, layout( location=42) in 4-component vector of float i, layout( location=43) in 4-component vector of float j, layout( location=44) in 4-component vector of float k})
 0:?     'outVar2' (layout( location=4095 index=0) out 4-component vector of float)
 0:?     'outVar3' (layout( location=0 index=1) out 4-component vector of float)
 0:?     'outVar4' (layout( location=0 index=1) out 4-component vector of float)
diff --git a/Test/baseResults/400.frag.out b/Test/baseResults/400.frag.out
index 8445659..90f73dc 100644
--- a/Test/baseResults/400.frag.out
+++ b/Test/baseResults/400.frag.out
@@ -1,5 +1,4 @@
 400.frag
-Warning, version 400 is not yet complete; most version-specific features are present, but some are missing.
 ERROR: 0:18: 'textureGatherOffsets(...)' : must be a compile-time constant: offsets argument
 ERROR: 0:22: 'textureGatherOffset(...)' : must be a compile-time constant: component argument
 ERROR: 0:23: 'textureGatherOffset(...)' : must be 0, 1, 2, or 3: component argument
@@ -34,8 +33,12 @@
 ERROR: 0:183: 'assign' :  cannot convert from ' const float' to ' temp 2-component vector of float'
 ERROR: 0:184: 'textureQueryLod' : no matching overloaded function found 
 ERROR: 0:184: 'assign' :  cannot convert from ' const float' to ' temp 2-component vector of float'
-ERROR: 0:197: '' :  syntax error, unexpected PRECISE, expecting IDENTIFIER
-ERROR: 35 compilation errors.  No code generated.
+ERROR: 0:197: 'subroutine' : feature not yet implemented 
+ERROR: 0:197: '' : default qualifier requires 'uniform', 'buffer', 'in', or 'out' storage qualification 
+ERROR: 0:198: 'subroutine' : feature not yet implemented 
+ERROR: 0:199: 'subroutine' : feature not yet implemented 
+ERROR: 0:201: '' :  syntax error, unexpected PRECISE, expecting IDENTIFIER
+ERROR: 39 compilation errors.  No code generated.
 
 
 Shader version: 400
@@ -490,6 +493,18 @@
 0:194          Convert int to uint ( temp uint)
 0:194            'i' ( flat in int)
 0:194          'uu' ( uniform uint)
+0:198  Function Definition: subT1( ( temp float)
+0:198    Function Parameters: 
+0:198    Sequence
+0:198      Branch: Return with expression
+0:198        Constant:
+0:198          1.000000
+0:199  Function Definition: subT2( ( temp float)
+0:199    Function Parameters: 
+0:199    Sequence
+0:199      Branch: Return with expression
+0:199        Constant:
+0:199          1.000000
 0:?   Linker Objects
 0:?     'c2D' ( smooth in 2-component vector of float)
 0:?     'i' ( flat in int)
@@ -501,7 +516,7 @@
 0:?     'vl' (layout( location=4) smooth in 4-component vector of float)
 0:?     'vl2' (layout( location=6) smooth in 4-component vector of float)
 0:?     'uv3' (layout( location=3) uniform 3-component vector of float)
-0:?     'anon@0' ( in block{ in float FogFragCoord gl_FogFragCoord,  in implicitly-sized array of 4-component vector of float TexCoord gl_TexCoord,  smooth in 4-component vector of float Color gl_Color,  in 4-component vector of float SecondaryColor gl_SecondaryColor})
+0:?     'anon@0' ( in block{ in float FogFragCoord gl_FogFragCoord,  in unsized 1-element array of 4-component vector of float TexCoord gl_TexCoord,  smooth in 4-component vector of float Color gl_Color,  in 4-component vector of float SecondaryColor gl_SecondaryColor})
 0:?     'gl_FragCoord' ( gl_FragCoord 4-component vector of float FragCoord)
 0:?     'u2drs' ( uniform sampler2DRectShadow)
 0:?     'patchIn' ( smooth patch in 4-component vector of float)
diff --git a/Test/baseResults/400.geom.out b/Test/baseResults/400.geom.out
index 989b439..52ebebc 100644
--- a/Test/baseResults/400.geom.out
+++ b/Test/baseResults/400.geom.out
@@ -1,8 +1,7 @@
 400.geom
-Warning, version 400 is not yet complete; most version-specific features are present, but some are missing.
 ERROR: 0:12: 'invocations' : can only apply to a standalone qualifier 
 ERROR: 0:20: 'patch' : not supported in this stage: geometry
-ERROR: 0:20: 'gl_PointSize' : cannot add layout to redeclared block member 
+ERROR: 0:20: 'gl_PointSize' : cannot add non-XFB layout to redeclared block member 
 ERROR: 0:20: 'gl_PointSize' : cannot add patch to redeclared block member 
 ERROR: 0:25: 'length' :  array must first be sized by a redeclaration or layout qualifier
 ERROR: 0:36: 'length' :  array must first be sized by a redeclaration or layout qualifier
diff --git a/Test/baseResults/400.tesc.out b/Test/baseResults/400.tesc.out
index 434079e..0475741 100644
--- a/Test/baseResults/400.tesc.out
+++ b/Test/baseResults/400.tesc.out
@@ -1,5 +1,4 @@
 400.tesc
-Warning, version 400 is not yet complete; most version-specific features are present, but some are missing.
 ERROR: 0:6: 'quads' : unrecognized layout identifier, or qualifier requires assignment (e.g., binding = 4) 
 ERROR: 0:7: 'ccw' : unrecognized layout identifier, or qualifier requires assignment (e.g., binding = 4) 
 ERROR: 0:8: 'fractional_even_spacing' : unrecognized layout identifier, or qualifier requires assignment (e.g., binding = 4) 
@@ -45,8 +44,8 @@
 0:23        move second child to first child ( temp 4-component vector of float)
 0:23          'p' ( temp 4-component vector of float)
 0:23          gl_Position: direct index for structure ( in 4-component vector of float Position)
-0:23            direct index ( temp block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in implicitly-sized array of float ClipDistance gl_ClipDistance})
-0:23              'gl_in' ( in 32-element array of block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in implicitly-sized array of float ClipDistance gl_ClipDistance})
+0:23            direct index ( temp block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in unsized 3-element array of float ClipDistance gl_ClipDistance})
+0:23              'gl_in' ( in 32-element array of block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in unsized 3-element array of float ClipDistance gl_ClipDistance})
 0:23              Constant:
 0:23                1 (const int)
 0:23            Constant:
@@ -55,8 +54,8 @@
 0:24        move second child to first child ( temp float)
 0:24          'ps' ( temp float)
 0:24          gl_PointSize: direct index for structure ( in float PointSize)
-0:24            direct index ( temp block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in implicitly-sized array of float ClipDistance gl_ClipDistance})
-0:24              'gl_in' ( in 32-element array of block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in implicitly-sized array of float ClipDistance gl_ClipDistance})
+0:24            direct index ( temp block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in unsized 3-element array of float ClipDistance gl_ClipDistance})
+0:24              'gl_in' ( in 32-element array of block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in unsized 3-element array of float ClipDistance gl_ClipDistance})
 0:24              Constant:
 0:24                1 (const int)
 0:24            Constant:
@@ -65,9 +64,9 @@
 0:25        move second child to first child ( temp float)
 0:25          'cd' ( temp float)
 0:25          direct index ( temp float ClipDistance)
-0:25            gl_ClipDistance: direct index for structure ( in implicitly-sized array of float ClipDistance)
-0:25              direct index ( temp block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in implicitly-sized array of float ClipDistance gl_ClipDistance})
-0:25                'gl_in' ( in 32-element array of block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in implicitly-sized array of float ClipDistance gl_ClipDistance})
+0:25            gl_ClipDistance: direct index for structure ( in unsized 3-element array of float ClipDistance)
+0:25              direct index ( temp block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in unsized 3-element array of float ClipDistance gl_ClipDistance})
+0:25                'gl_in' ( in 32-element array of block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in unsized 3-element array of float ClipDistance gl_ClipDistance})
 0:25                Constant:
 0:25                  1 (const int)
 0:25              Constant:
@@ -88,25 +87,25 @@
 0:29          'gl_InvocationID' ( in int InvocationID)
 0:31      move second child to first child ( temp 4-component vector of float)
 0:31        gl_Position: direct index for structure ( out 4-component vector of float Position)
-0:31          indirect index ( temp block{ out 4-component vector of float Position gl_Position,  out float PointSize gl_PointSize,  out implicitly-sized array of float ClipDistance gl_ClipDistance})
-0:31            'gl_out' ( out 4-element array of block{ out 4-component vector of float Position gl_Position,  out float PointSize gl_PointSize,  out implicitly-sized array of float ClipDistance gl_ClipDistance})
+0:31          indirect index ( temp block{ out 4-component vector of float Position gl_Position,  out float PointSize gl_PointSize,  out unsized 2-element array of float ClipDistance gl_ClipDistance})
+0:31            'gl_out' ( out 4-element array of block{ out 4-component vector of float Position gl_Position,  out float PointSize gl_PointSize,  out unsized 2-element array of float ClipDistance gl_ClipDistance})
 0:31            'gl_InvocationID' ( in int InvocationID)
 0:31          Constant:
 0:31            0 (const int)
 0:31        'p' ( temp 4-component vector of float)
 0:32      move second child to first child ( temp float)
 0:32        gl_PointSize: direct index for structure ( out float PointSize)
-0:32          indirect index ( temp block{ out 4-component vector of float Position gl_Position,  out float PointSize gl_PointSize,  out implicitly-sized array of float ClipDistance gl_ClipDistance})
-0:32            'gl_out' ( out 4-element array of block{ out 4-component vector of float Position gl_Position,  out float PointSize gl_PointSize,  out implicitly-sized array of float ClipDistance gl_ClipDistance})
+0:32          indirect index ( temp block{ out 4-component vector of float Position gl_Position,  out float PointSize gl_PointSize,  out unsized 2-element array of float ClipDistance gl_ClipDistance})
+0:32            'gl_out' ( out 4-element array of block{ out 4-component vector of float Position gl_Position,  out float PointSize gl_PointSize,  out unsized 2-element array of float ClipDistance gl_ClipDistance})
 0:32            'gl_InvocationID' ( in int InvocationID)
 0:32          Constant:
 0:32            1 (const int)
 0:32        'ps' ( temp float)
 0:33      move second child to first child ( temp float)
 0:33        direct index ( temp float ClipDistance)
-0:33          gl_ClipDistance: direct index for structure ( out implicitly-sized array of float ClipDistance)
-0:33            indirect index ( temp block{ out 4-component vector of float Position gl_Position,  out float PointSize gl_PointSize,  out implicitly-sized array of float ClipDistance gl_ClipDistance})
-0:33              'gl_out' ( out 4-element array of block{ out 4-component vector of float Position gl_Position,  out float PointSize gl_PointSize,  out implicitly-sized array of float ClipDistance gl_ClipDistance})
+0:33          gl_ClipDistance: direct index for structure ( out unsized 2-element array of float ClipDistance)
+0:33            indirect index ( temp block{ out 4-component vector of float Position gl_Position,  out float PointSize gl_PointSize,  out unsized 2-element array of float ClipDistance gl_ClipDistance})
+0:33              'gl_out' ( out 4-element array of block{ out 4-component vector of float Position gl_Position,  out float PointSize gl_PointSize,  out unsized 2-element array of float ClipDistance gl_ClipDistance})
 0:33              'gl_InvocationID' ( in int InvocationID)
 0:33            Constant:
 0:33              2 (const int)
@@ -176,8 +175,8 @@
 0:67    Function Parameters: 
 0:69    Sequence
 0:69      gl_PointSize: direct index for structure ( out float PointSize)
-0:69        direct index ( temp block{ out 4-component vector of float Position gl_Position,  out float PointSize gl_PointSize,  out implicitly-sized array of float ClipDistance gl_ClipDistance})
-0:69          'gl_out' ( out 4-element array of block{ out 4-component vector of float Position gl_Position,  out float PointSize gl_PointSize,  out implicitly-sized array of float ClipDistance gl_ClipDistance})
+0:69        direct index ( temp block{ out 4-component vector of float Position gl_Position,  out float PointSize gl_PointSize,  out unsized 2-element array of float ClipDistance gl_ClipDistance})
+0:69          'gl_out' ( out 4-element array of block{ out 4-component vector of float Position gl_Position,  out float PointSize gl_PointSize,  out unsized 2-element array of float ClipDistance gl_ClipDistance})
 0:69          Constant:
 0:69            4 (const int)
 0:69        Constant:
@@ -212,7 +211,7 @@
 0:123      'gl_DeviceIndex' ( in int DeviceIndex)
 0:124      'gl_ViewIndex' ( in int ViewIndex)
 0:?   Linker Objects
-0:?     'gl_out' ( out 4-element array of block{ out 4-component vector of float Position gl_Position,  out float PointSize gl_PointSize,  out implicitly-sized array of float ClipDistance gl_ClipDistance})
+0:?     'gl_out' ( out 4-element array of block{ out 4-component vector of float Position gl_Position,  out float PointSize gl_PointSize,  out unsized 2-element array of float ClipDistance gl_ClipDistance})
 0:?     'outa' ( global 4-element array of int)
 0:?     'patchIn' ( patch in 4-component vector of float)
 0:?     'patchOut' ( patch out 4-component vector of float)
diff --git a/Test/baseResults/400.tese.out b/Test/baseResults/400.tese.out
index 2f1c97c..9580e85 100644
--- a/Test/baseResults/400.tese.out
+++ b/Test/baseResults/400.tese.out
@@ -1,5 +1,4 @@
 400.tese
-Warning, version 400 is not yet complete; most version-specific features are present, but some are missing.
 ERROR: 0:3: 'vertices' : there is no such layout identifier for this stage taking an assigned value 
 ERROR: 0:5: 'triangles' : cannot change previously set input primitive 
 ERROR: 0:6: 'isolines' : cannot change previously set input primitive 
@@ -12,7 +11,6 @@
 ERROR: 0:48: 'patch' : cannot use interpolation qualifiers with patch 
 ERROR: 0:49: 'patch' : cannot use interpolation qualifiers with patch 
 ERROR: 0:50: '' : can only have one auxiliary qualifier (centroid, patch, and sample) 
-ERROR: 0:54: 'gl_PerVertex' : block already declared with size, can't redeclare as implicitly-sized 
 ERROR: 0:59: 'gl_PerVertex' : can only redeclare a built-in block once, and before any use 
 ERROR: 0:64: 'quads' : cannot apply to 'out' 
 ERROR: 0:64: 'cw' : can only apply to 'in' 
@@ -32,7 +30,7 @@
 ERROR: 0:101: 'gl_TessLevelOuter' : identifiers starting with "gl_" are reserved 
 ERROR: 0:109: 'gl_DeviceIndex' : required extension not requested: GL_EXT_device_group
 ERROR: 0:110: 'gl_ViewIndex' : required extension not requested: GL_EXT_multiview
-ERROR: 32 compilation errors.  No code generated.
+ERROR: 31 compilation errors.  No code generated.
 
 
 Shader version: 400
@@ -58,8 +56,8 @@
 0:32        move second child to first child ( temp 4-component vector of float)
 0:32          'p' ( temp 4-component vector of float)
 0:32          gl_Position: direct index for structure ( in 4-component vector of float Position)
-0:32            direct index ( temp block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in implicitly-sized array of float ClipDistance gl_ClipDistance})
-0:32              'gl_in' ( in 32-element array of block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in implicitly-sized array of float ClipDistance gl_ClipDistance})
+0:32            direct index ( temp block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in unsized 3-element array of float ClipDistance gl_ClipDistance})
+0:32              'gl_in' ( in 32-element array of block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in unsized 3-element array of float ClipDistance gl_ClipDistance})
 0:32              Constant:
 0:32                1 (const int)
 0:32            Constant:
@@ -68,8 +66,8 @@
 0:33        move second child to first child ( temp float)
 0:33          'ps' ( temp float)
 0:33          gl_PointSize: direct index for structure ( in float PointSize)
-0:33            direct index ( temp block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in implicitly-sized array of float ClipDistance gl_ClipDistance})
-0:33              'gl_in' ( in 32-element array of block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in implicitly-sized array of float ClipDistance gl_ClipDistance})
+0:33            direct index ( temp block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in unsized 3-element array of float ClipDistance gl_ClipDistance})
+0:33              'gl_in' ( in 32-element array of block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in unsized 3-element array of float ClipDistance gl_ClipDistance})
 0:33              Constant:
 0:33                1 (const int)
 0:33            Constant:
@@ -78,9 +76,9 @@
 0:34        move second child to first child ( temp float)
 0:34          'cd' ( temp float)
 0:34          direct index ( temp float ClipDistance)
-0:34            gl_ClipDistance: direct index for structure ( in implicitly-sized array of float ClipDistance)
-0:34              direct index ( temp block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in implicitly-sized array of float ClipDistance gl_ClipDistance})
-0:34                'gl_in' ( in 32-element array of block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in implicitly-sized array of float ClipDistance gl_ClipDistance})
+0:34            gl_ClipDistance: direct index for structure ( in unsized 3-element array of float ClipDistance)
+0:34              direct index ( temp block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in unsized 3-element array of float ClipDistance gl_ClipDistance})
+0:34                'gl_in' ( in 32-element array of block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in unsized 3-element array of float ClipDistance gl_ClipDistance})
 0:34                Constant:
 0:34                  1 (const int)
 0:34              Constant:
@@ -115,20 +113,20 @@
 0:40              1 (const int)
 0:42      move second child to first child ( temp 4-component vector of float)
 0:42        gl_Position: direct index for structure ( gl_Position 4-component vector of float Position)
-0:42          'anon@0' ( out block{ gl_Position 4-component vector of float Position gl_Position,  gl_PointSize float PointSize gl_PointSize,  out implicitly-sized array of float ClipDistance gl_ClipDistance})
+0:42          'anon@0' ( out block{ gl_Position 4-component vector of float Position gl_Position,  gl_PointSize float PointSize gl_PointSize,  out unsized 3-element array of float ClipDistance gl_ClipDistance})
 0:42          Constant:
 0:42            0 (const uint)
 0:42        'p' ( temp 4-component vector of float)
 0:43      move second child to first child ( temp float)
 0:43        gl_PointSize: direct index for structure ( gl_PointSize float PointSize)
-0:43          'anon@0' ( out block{ gl_Position 4-component vector of float Position gl_Position,  gl_PointSize float PointSize gl_PointSize,  out implicitly-sized array of float ClipDistance gl_ClipDistance})
+0:43          'anon@0' ( out block{ gl_Position 4-component vector of float Position gl_Position,  gl_PointSize float PointSize gl_PointSize,  out unsized 3-element array of float ClipDistance gl_ClipDistance})
 0:43          Constant:
 0:43            1 (const uint)
 0:43        'ps' ( temp float)
 0:44      move second child to first child ( temp float)
 0:44        direct index ( temp float ClipDistance)
-0:44          gl_ClipDistance: direct index for structure ( out implicitly-sized array of float ClipDistance)
-0:44            'anon@0' ( out block{ gl_Position 4-component vector of float Position gl_Position,  gl_PointSize float PointSize gl_PointSize,  out implicitly-sized array of float ClipDistance gl_ClipDistance})
+0:44          gl_ClipDistance: direct index for structure ( out unsized 3-element array of float ClipDistance)
+0:44            'anon@0' ( out block{ gl_Position 4-component vector of float Position gl_Position,  gl_PointSize float PointSize gl_PointSize,  out unsized 3-element array of float ClipDistance gl_ClipDistance})
 0:44            Constant:
 0:44              2 (const uint)
 0:44          Constant:
@@ -147,7 +145,7 @@
 0:?   Linker Objects
 0:?     'patchIn' ( patch in 4-component vector of float)
 0:?     'patchOut' ( patch out 4-component vector of float)
-0:?     'anon@0' ( out block{ gl_Position 4-component vector of float Position gl_Position,  gl_PointSize float PointSize gl_PointSize,  out implicitly-sized array of float ClipDistance gl_ClipDistance})
+0:?     'anon@0' ( out block{ gl_Position 4-component vector of float Position gl_Position,  gl_PointSize float PointSize gl_PointSize,  out unsized 3-element array of float ClipDistance gl_ClipDistance})
 0:?     'badp1' ( smooth patch in 4-component vector of float)
 0:?     'badp2' ( flat patch in 4-component vector of float)
 0:?     'badp3' ( noperspective patch in 4-component vector of float)
diff --git a/Test/baseResults/400.vert.out b/Test/baseResults/400.vert.out
old mode 100755
new mode 100644
index 0fd453d..05f58e2
--- a/Test/baseResults/400.vert.out
+++ b/Test/baseResults/400.vert.out
@@ -1,5 +1,4 @@
 400.vert
-Warning, version 400 is not yet complete; most version-specific features are present, but some are missing.
 ERROR: 0:3: 'vertex-shader `double` type input' : not supported for this version or the enabled extensions 
 ERROR: 0:4: 'vertex-shader `double` type input' : not supported for this version or the enabled extensions 
 ERROR: 0:5: 'vertex-shader `double` type input' : not supported for this version or the enabled extensions 
diff --git a/Test/baseResults/410.geom.out b/Test/baseResults/410.geom.out
index 7219e4d..ab5ad47 100644
--- a/Test/baseResults/410.geom.out
+++ b/Test/baseResults/410.geom.out
@@ -1,5 +1,4 @@
 410.geom
-Warning, version 410 is not yet complete; most version-specific features are present, but some are missing.
 ERROR: 0:8: 'myIn' : cannot redeclare a built-in block with a user name 
 ERROR: 0:12: 'gl_myIn' : no declaration found for redeclaration 
 ERROR: 0:20: 'gl_PerVertex' : can only redeclare a built-in block once, and before any use 
@@ -32,7 +31,7 @@
 0:30          'p' ( temp float)
 0:30          gl_PointSize: direct index for structure ( in float PointSize)
 0:30            direct index ( temp block{ in float PointSize gl_PointSize})
-0:30              'gl_in' ( in implicitly-sized array of block{ in float PointSize gl_PointSize})
+0:30              'gl_in' ( in unsized 2-element array of block{ in float PointSize gl_PointSize})
 0:30              Constant:
 0:30                1 (const int)
 0:30            Constant:
@@ -54,7 +53,7 @@
 0:38        Constant:
 0:38          4.000000
 0:?   Linker Objects
-0:?     'gl_in' ( in implicitly-sized array of block{ in float PointSize gl_PointSize})
+0:?     'gl_in' ( in unsized 2-element array of block{ in float PointSize gl_PointSize})
 0:?     'anon@0' (layout( stream=0) out block{layout( stream=0) gl_PointSize float PointSize gl_PointSize, })
 
 
diff --git a/Test/baseResults/410.tesc.out b/Test/baseResults/410.tesc.out
index 9b459b1..0a397fd 100644
--- a/Test/baseResults/410.tesc.out
+++ b/Test/baseResults/410.tesc.out
@@ -1,5 +1,4 @@
 410.tesc
-Warning, version 400 is not yet complete; most version-specific features are present, but some are missing.
 ERROR: 0:4: 'length' :  array must first be sized by a redeclaration or layout qualifier
 ERROR: 1 compilation errors.  No code generated.
 
@@ -10,7 +9,7 @@
 0:8  Function Definition: main( ( global void)
 0:8    Function Parameters: 
 0:?   Linker Objects
-0:?     'gl_out' ( out implicitly-sized array of block{ out 4-component vector of float Position gl_Position,  out float PointSize gl_PointSize,  out implicitly-sized array of float ClipDistance gl_ClipDistance})
+0:?     'gl_out' ( out unsized 1-element array of block{ out 4-component vector of float Position gl_Position,  out float PointSize gl_PointSize,  out unsized 1-element array of float ClipDistance gl_ClipDistance})
 0:?     'outa' ( global 1-element array of int)
 0:?     'patchOut' ( patch out 4-component vector of float)
 
diff --git a/Test/baseResults/410.vert.out b/Test/baseResults/410.vert.out
old mode 100755
new mode 100644
index 0e2c87e..aacdf36
--- a/Test/baseResults/410.vert.out
+++ b/Test/baseResults/410.vert.out
@@ -1,6 +1,4 @@
 410.vert
-Warning, version 410 is not yet complete; most version-specific features are present, but some are missing.
-
 Shader version: 410
 0:? Sequence
 0:7  Function Definition: main( ( global void)
diff --git a/Test/baseResults/420.comp.out b/Test/baseResults/420.comp.out
old mode 100755
new mode 100644
index 07944de..4e091ac
--- a/Test/baseResults/420.comp.out
+++ b/Test/baseResults/420.comp.out
@@ -1,5 +1,4 @@
 420.comp
-Warning, version 420 is not yet complete; most version-specific features are present, but some are missing.
 ERROR: 0:3: 'gl_WorkGroupSize' : not supported for this version or the enabled extensions 
 ERROR: 1 compilation errors.  No code generated.
 
diff --git a/Test/baseResults/420.frag.out b/Test/baseResults/420.frag.out
index 31fe7f9..ffb8f6d 100644
--- a/Test/baseResults/420.frag.out
+++ b/Test/baseResults/420.frag.out
@@ -1,10 +1,9 @@
 420.frag
-Warning, version 420 is not yet complete; most version-specific features are present, but some are missing.
 ERROR: 0:4: 'redeclaration' : all redeclarations must use the same depth layout on gl_FragDepth
 ERROR: 0:11: 'layout qualifier' : can only apply depth layout to gl_FragDepth 
 ERROR: 0:12: 'gl_FragDepth' : cannot redeclare after use 
-WARNING: 0:14: 'atomic_uint' : implicitly sized atomic_uint array treated as having one element for tracking the default offset 
-ERROR: 3 compilation errors.  No code generated.
+ERROR: 0:14: 'atomic_uint' : array must be explicitly sized 
+ERROR: 4 compilation errors.  No code generated.
 
 
 Shader version: 420
@@ -20,7 +19,7 @@
 0:?   Linker Objects
 0:?     'gl_FragDepth' ( gl_FragDepth float FragDepth)
 0:?     'depth' ( smooth in float)
-0:?     'a' (layout( binding=0 offset=0) uniform implicitly-sized array of atomic_uint)
+0:?     'a' (layout( binding=0 offset=0) uniform unsized 1-element array of atomic_uint)
 
 
 Linked fragment stage:
diff --git a/Test/baseResults/420.geom.out b/Test/baseResults/420.geom.out
index 0fccfe0..6bf6eb3 100644
--- a/Test/baseResults/420.geom.out
+++ b/Test/baseResults/420.geom.out
@@ -1,5 +1,4 @@
 420.geom
-Warning, version 420 is not yet complete; most version-specific features are present, but some are missing.
 ERROR: 0:9: 'length' :  array must first be sized by a redeclaration or layout qualifier
 ERROR: 0:11: '[' :  array must be sized by a redeclaration or layout qualifier before being indexed with a variable
 ERROR: 0:42: 'assign' :  l-value required (can't modify a const)
@@ -21,15 +20,15 @@
 0:9      Constant:
 0:9        1 (const int)
 0:10      gl_Position: direct index for structure ( in 4-component vector of float Position)
-0:10        direct index ( temp block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in implicitly-sized array of float ClipDistance gl_ClipDistance})
-0:10          'gl_in' ( in 3-element array of block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in implicitly-sized array of float ClipDistance gl_ClipDistance})
+0:10        direct index ( temp block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in unsized 1-element array of float ClipDistance gl_ClipDistance})
+0:10          'gl_in' ( in 3-element array of block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in unsized 1-element array of float ClipDistance gl_ClipDistance})
 0:10          Constant:
 0:10            1 (const int)
 0:10        Constant:
 0:10          0 (const int)
 0:11      gl_Position: direct index for structure ( in 4-component vector of float Position)
-0:11        indirect index ( temp block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in implicitly-sized array of float ClipDistance gl_ClipDistance})
-0:11          'gl_in' ( in 3-element array of block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in implicitly-sized array of float ClipDistance gl_ClipDistance})
+0:11        indirect index ( temp block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in unsized 1-element array of float ClipDistance gl_ClipDistance})
+0:11          'gl_in' ( in 3-element array of block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in unsized 1-element array of float ClipDistance gl_ClipDistance})
 0:11          'i' ( global int)
 0:11        Constant:
 0:11          0 (const int)
@@ -39,8 +38,8 @@
 0:20      Constant:
 0:20        3 (const int)
 0:21      gl_Position: direct index for structure ( in 4-component vector of float Position)
-0:21        indirect index ( temp block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in implicitly-sized array of float ClipDistance gl_ClipDistance})
-0:21          'gl_in' ( in 3-element array of block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in implicitly-sized array of float ClipDistance gl_ClipDistance})
+0:21        indirect index ( temp block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in unsized 1-element array of float ClipDistance gl_ClipDistance})
+0:21          'gl_in' ( in 3-element array of block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in unsized 1-element array of float ClipDistance gl_ClipDistance})
 0:21          'i' ( global int)
 0:21        Constant:
 0:21          0 (const int)
@@ -122,12 +121,12 @@
 0:54          'i' ( global int)
 0:?   Linker Objects
 0:?     'i' ( global int)
-0:?     'gl_in' ( in 3-element array of block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in implicitly-sized array of float ClipDistance gl_ClipDistance})
+0:?     'gl_in' ( in 3-element array of block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in unsized 1-element array of float ClipDistance gl_ClipDistance})
 0:?     'color3' ( in 3-element array of 4-component vector of float)
 0:?     's2D' ( uniform sampler2D)
 0:?     'coord' ( in 3-element array of 2-component vector of float)
 0:?     'v4' ( uniform 4-component vector of float)
-0:?     'anon@0' (layout( stream=0) out block{layout( stream=0) gl_PointSize float PointSize gl_PointSize, layout( stream=0) out implicitly-sized array of float ClipDistance gl_ClipDistance})
+0:?     'anon@0' (layout( stream=0) out block{layout( stream=0) gl_PointSize float PointSize gl_PointSize, layout( stream=0) out unsized 1-element array of float ClipDistance gl_ClipDistance})
 
 
 Linked geometry stage:
diff --git a/Test/baseResults/420.tesc.out b/Test/baseResults/420.tesc.out
index 83816f3..a1f881c 100644
--- a/Test/baseResults/420.tesc.out
+++ b/Test/baseResults/420.tesc.out
@@ -1,5 +1,4 @@
 420.tesc
-Warning, version 420 is not yet complete; most version-specific features are present, but some are missing.
 ERROR: 0:7: 'vertices' : inconsistent output number of vertices for array size of gl_out
 ERROR: 0:11: 'vertices' : inconsistent output number of vertices for array size of a
 ERROR: 0:12: 'vertices' : inconsistent output number of vertices for array size of outb
@@ -21,8 +20,8 @@
 0:17        move second child to first child ( temp 4-component vector of float)
 0:17          'p' ( temp 4-component vector of float)
 0:17          gl_Position: direct index for structure ( in 4-component vector of float Position)
-0:17            direct index ( temp block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in implicitly-sized array of float ClipDistance gl_ClipDistance})
-0:17              'gl_in' ( in 32-element array of block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in implicitly-sized array of float ClipDistance gl_ClipDistance})
+0:17            direct index ( temp block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in unsized 3-element array of float ClipDistance gl_ClipDistance})
+0:17              'gl_in' ( in 32-element array of block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in unsized 3-element array of float ClipDistance gl_ClipDistance})
 0:17              Constant:
 0:17                1 (const int)
 0:17            Constant:
@@ -31,8 +30,8 @@
 0:18        move second child to first child ( temp float)
 0:18          'ps' ( temp float)
 0:18          gl_PointSize: direct index for structure ( in float PointSize)
-0:18            direct index ( temp block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in implicitly-sized array of float ClipDistance gl_ClipDistance})
-0:18              'gl_in' ( in 32-element array of block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in implicitly-sized array of float ClipDistance gl_ClipDistance})
+0:18            direct index ( temp block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in unsized 3-element array of float ClipDistance gl_ClipDistance})
+0:18              'gl_in' ( in 32-element array of block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in unsized 3-element array of float ClipDistance gl_ClipDistance})
 0:18              Constant:
 0:18                1 (const int)
 0:18            Constant:
@@ -41,9 +40,9 @@
 0:19        move second child to first child ( temp float)
 0:19          'cd' ( temp float)
 0:19          direct index ( temp float ClipDistance)
-0:19            gl_ClipDistance: direct index for structure ( in implicitly-sized array of float ClipDistance)
-0:19              direct index ( temp block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in implicitly-sized array of float ClipDistance gl_ClipDistance})
-0:19                'gl_in' ( in 32-element array of block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in implicitly-sized array of float ClipDistance gl_ClipDistance})
+0:19            gl_ClipDistance: direct index for structure ( in unsized 3-element array of float ClipDistance)
+0:19              direct index ( temp block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in unsized 3-element array of float ClipDistance gl_ClipDistance})
+0:19                'gl_in' ( in 32-element array of block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in unsized 3-element array of float ClipDistance gl_ClipDistance})
 0:19                Constant:
 0:19                  1 (const int)
 0:19              Constant:
diff --git a/Test/baseResults/420.tese.out b/Test/baseResults/420.tese.out
index 9986c2a..71fca85 100644
--- a/Test/baseResults/420.tese.out
+++ b/Test/baseResults/420.tese.out
@@ -1,5 +1,4 @@
 420.tese
-Warning, version 420 is not yet complete; most version-specific features are present, but some are missing.
 ERROR: 0:7: '=' :  cannot convert from ' const 3-element array of float' to ' global 2-element array of float'
 ERROR: 0:8: 'initializer list' : wrong vector size (or rows in a matrix column):  temp 2-component vector of float
 ERROR: 0:9: 'initializer list' : wrong number of matrix columns:  temp 3X3 matrix of float
@@ -11,7 +10,7 @@
 ERROR: 0:29: ' const 2-element array of 4-component vector of float' : cannot construct with these arguments 
 ERROR: 0:29: '=' :  cannot convert from ' const float' to ' global 2-element array of 4-component vector of float'
 ERROR: 0:30: 'initializer list' : wrong number of matrix columns:  temp 4X2 matrix of float
-ERROR: 0:40: 'constructor' :  cannot convert parameter 1 from ' temp float' to ' temp structure{ global float s,  global float t}'
+ERROR: 0:40: 'constructor' :  cannot convert parameter 1 from ' const structure{ global 4-component vector of float a,  global 4-component vector of float b}' to ' temp structure{ global float s,  global float t}'
 ERROR: 0:70: 'initializer list' : wrong number of structure members 
 ERROR: 13 compilation errors.  No code generated.
 
@@ -140,7 +139,7 @@
 0:?     'b3' ( global 2-element array of 4-component vector of float)
 0:?     'b4' ( global 2-element array of 4-component vector of float)
 0:?     'c3' ( global 4X2 matrix of float)
-0:?     'd2' ( global implicitly-sized array of structure{ global float s,  global float t})
+0:?     'd2' ( global unsized 1-element array of structure{ global float s,  global float t})
 0:?     'b5' ( global 5-element array of float)
 0:?     'single1' ( global structure{ global int f})
 0:?     'single2' ( global structure{ global 2-component vector of uint v})
diff --git a/Test/baseResults/420.vert.out b/Test/baseResults/420.vert.out
index 8fb8546..22577ab 100644
--- a/Test/baseResults/420.vert.out
+++ b/Test/baseResults/420.vert.out
@@ -1,5 +1,4 @@
 420.vert
-Warning, version 420 is not yet complete; most version-specific features are present, but some are missing.
 ERROR: 0:2: '#version' : must occur first in shader 
 WARNING: 0:3: varying deprecated in version 130; may be removed in future release
 ERROR: 0:3: 'varying' : no longer supported in core profile; removed in version 420
@@ -33,7 +32,7 @@
 ERROR: 0:86: 'patch' : not supported in this stage: vertex
 ERROR: 0:100: '=' : global const initializers must be constant ' const int'
 ERROR: 0:101: '' : array size must be a constant integer expression 
-ERROR: 0:107: 'image variables declared 'writeonly' without a format layout qualifier' : not supported for this version or the enabled extensions 
+ERROR: 0:107: 'image variables not declared 'writeonly' and without a format layout qualifier' : not supported for this version or the enabled extensions 
 ERROR: 0:114: 'imageAtomicMin' : only supported on image with format r32i or r32ui 
 ERROR: 0:115: 'imageAtomicMax' : no matching overloaded function found 
 ERROR: 0:119: 'writeonly' : argument cannot drop memory qualifier when passed to formal parameter 
@@ -47,12 +46,12 @@
 ERROR: 0:143: 'rgba32ui' : does not apply to signed integer images 
 ERROR: 0:144: 'r8ui' : does not apply to signed integer images 
 ERROR: 0:147: 'offset on block member' : not supported for this version or the enabled extensions 
-ERROR: 0:147: 'offset/align' : can only be used with std140 or std430 layout packing 
+ERROR: 0:147: 'offset/align' : can only be used with std140, std430, or scalar layout packing 
 ERROR: 0:157: 'textureQueryLevels' : no matching overloaded function found 
 ERROR: 0:157: 'assign' :  cannot convert from ' const float' to ' temp int'
 ERROR: 0:158: 'textureQueryLevels' : no matching overloaded function found 
 ERROR: 0:158: 'assign' :  cannot convert from ' const float' to ' temp int'
-WARNING: 0:161: '[]' : assuming array size of one for compile-time checking of binding numbers for implicitly-sized array 
+WARNING: 0:161: '[]' : assuming binding count of one for compile-time checking of binding numbers for unsized array 
 ERROR: 51 compilation errors.  No code generated.
 
 
@@ -303,7 +302,7 @@
 0:?     'offcheckI' (layout( column_major shared) uniform block{layout( column_major shared offset=16) uniform int foo})
 0:?     'samp1D' ( uniform sampler1D)
 0:?     'samp1Ds' ( uniform sampler1DShadow)
-0:?     'badArray' (layout( binding=0) writeonly uniform implicitly-sized array of image1D)
+0:?     'badArray' (layout( binding=0) writeonly uniform unsized 1-element array of image1D)
 0:?     'gl_VertexID' ( gl_VertexId int VertexId)
 0:?     'gl_InstanceID' ( gl_InstanceId int InstanceId)
 
diff --git a/Test/baseResults/420_size_gl_in.geom.out b/Test/baseResults/420_size_gl_in.geom.out
index 3c3b810..9d95495 100644
--- a/Test/baseResults/420_size_gl_in.geom.out
+++ b/Test/baseResults/420_size_gl_in.geom.out
@@ -1,5 +1,4 @@
 420_size_gl_in.geom
-Warning, version 420 is not yet complete; most version-specific features are present, but some are missing.
 ERROR: 0:19: 'gl_PerVertex' : can only redeclare a built-in block once, and before any use 
 ERROR: 1 compilation errors.  No code generated.
 
@@ -16,8 +15,8 @@
 0:13      Constant:
 0:13        3 (const int)
 0:14      gl_Position: direct index for structure ( in 4-component vector of float Position)
-0:14        direct index ( temp block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in implicitly-sized array of float ClipDistance gl_ClipDistance})
-0:14          'gl_in' ( in 3-element array of block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in implicitly-sized array of float ClipDistance gl_ClipDistance})
+0:14        direct index ( temp block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in unsized 1-element array of float ClipDistance gl_ClipDistance})
+0:14          'gl_in' ( in 3-element array of block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in unsized 1-element array of float ClipDistance gl_ClipDistance})
 0:14          Constant:
 0:14            1 (const int)
 0:14        Constant:
@@ -25,8 +24,8 @@
 0:15      Constant:
 0:15        3 (const int)
 0:16      gl_Position: direct index for structure ( in 4-component vector of float Position)
-0:16        indirect index ( temp block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in implicitly-sized array of float ClipDistance gl_ClipDistance})
-0:16          'gl_in' ( in 3-element array of block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in implicitly-sized array of float ClipDistance gl_ClipDistance})
+0:16        indirect index ( temp block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in unsized 1-element array of float ClipDistance gl_ClipDistance})
+0:16          'gl_in' ( in 3-element array of block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in unsized 1-element array of float ClipDistance gl_ClipDistance})
 0:16          'i' ( global int)
 0:16        Constant:
 0:16          0 (const int)
@@ -34,7 +33,7 @@
 0:?     'i' ( global int)
 0:?     'colorun' ( in 3-element array of 4-component vector of float)
 0:?     'color3' ( in 3-element array of 4-component vector of float)
-0:?     'gl_in' ( in 3-element array of block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in implicitly-sized array of float ClipDistance gl_ClipDistance})
+0:?     'gl_in' ( in 3-element array of block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in unsized 1-element array of float ClipDistance gl_ClipDistance})
 
 
 Linked geometry stage:
diff --git a/Test/baseResults/430.comp.out b/Test/baseResults/430.comp.out
index 91aaf78..599cd8e 100644
--- a/Test/baseResults/430.comp.out
+++ b/Test/baseResults/430.comp.out
@@ -1,5 +1,4 @@
 430.comp
-Warning, version 430 is not yet complete; most version-specific features are present, but some are missing.
 ERROR: 0:4: 'local_size' : cannot change previously set size 
 ERROR: 0:5: 'local_size' : too large; see gl_MaxComputeWorkGroupSize 
 ERROR: 0:43: 'in' : global storage input qualifier cannot be used in a compute shader 
@@ -34,13 +33,13 @@
 0:35      GroupMemoryBarrier ( global void)
 0:36      move second child to first child ( temp int)
 0:36        value: direct index for structure (layout( column_major shared) buffer int)
-0:36          'anon@0' (layout( column_major shared) buffer block{layout( column_major shared) buffer int value, layout( column_major shared) buffer implicitly-sized array of float values})
+0:36          'anon@0' (layout( column_major shared) buffer block{layout( column_major shared) buffer int value, layout( column_major shared) buffer runtime-sized array of float values})
 0:36          Constant:
 0:36            0 (const uint)
 0:36        Convert float to int ( temp int)
 0:36          indirect index (layout( column_major shared) temp float)
-0:36            values: direct index for structure (layout( column_major shared) buffer implicitly-sized array of float)
-0:36              'anon@0' (layout( column_major shared) buffer block{layout( column_major shared) buffer int value, layout( column_major shared) buffer implicitly-sized array of float values})
+0:36            values: direct index for structure (layout( column_major shared) buffer runtime-sized array of float)
+0:36              'anon@0' (layout( column_major shared) buffer block{layout( column_major shared) buffer int value, layout( column_major shared) buffer runtime-sized array of float values})
 0:36              Constant:
 0:36                1 (const uint)
 0:36            'gl_LocalInvocationIndex' ( in uint LocalInvocationIndex)
@@ -57,8 +56,8 @@
 0:65    Sequence
 0:65      move second child to first child ( temp float)
 0:65        direct index (layout( column_major shared) temp float)
-0:65          values: direct index for structure (layout( column_major shared) buffer implicitly-sized array of float)
-0:65            'ro' (layout( column_major shared) readonly buffer block{layout( column_major shared) buffer int value, layout( column_major shared) buffer implicitly-sized array of float values})
+0:65          values: direct index for structure (layout( column_major shared) buffer unsized 3-element array of float)
+0:65            'ro' (layout( column_major shared) readonly buffer block{layout( column_major shared) buffer int value, layout( column_major shared) buffer unsized 3-element array of float values})
 0:65            Constant:
 0:65              1 (const int)
 0:65          Constant:
@@ -66,8 +65,8 @@
 0:65        Constant:
 0:65          4.700000
 0:66      array length ( temp int)
-0:66        values: direct index for structure (layout( column_major shared) buffer implicitly-sized array of float)
-0:66          'ro' (layout( column_major shared) readonly buffer block{layout( column_major shared) buffer int value, layout( column_major shared) buffer implicitly-sized array of float values})
+0:66        values: direct index for structure (layout( column_major shared) buffer unsized 3-element array of float)
+0:66          'ro' (layout( column_major shared) readonly buffer block{layout( column_major shared) buffer int value, layout( column_major shared) buffer unsized 3-element array of float values})
 0:66          Constant:
 0:66            1 (const int)
 0:67      Barrier ( global void)
@@ -130,8 +129,8 @@
 0:?       4096 (const uint)
 0:?     'total' ( const int)
 0:?       66592 (const int)
-0:?     'anon@0' (layout( column_major shared) buffer block{layout( column_major shared) buffer int value, layout( column_major shared) buffer implicitly-sized array of float values})
-0:?     'invalid' (layout( column_major shared) buffer block{layout( column_major shared) buffer implicitly-sized array of float values, layout( column_major shared) buffer int value})
+0:?     'anon@0' (layout( column_major shared) buffer block{layout( column_major shared) buffer int value, layout( column_major shared) buffer runtime-sized array of float values})
+0:?     'invalid' (layout( column_major shared) buffer block{layout( column_major shared) buffer unsized 1-element array of float values, layout( column_major shared) buffer int value})
 0:?     'v3' (layout( location=2) in 3-component vector of float)
 0:?     'f' ( in float)
 0:?     'fo' ( out float)
@@ -141,7 +140,7 @@
 0:?     'arrX' ( global 2-element array of int)
 0:?     'arrY' ( global 1-element array of int)
 0:?     'arrZ' ( global 4096-element array of int)
-0:?     'ro' (layout( column_major shared) readonly buffer block{layout( column_major shared) buffer int value, layout( column_major shared) buffer implicitly-sized array of float values})
+0:?     'ro' (layout( column_major shared) readonly buffer block{layout( column_major shared) buffer int value, layout( column_major shared) buffer unsized 3-element array of float values})
 0:?     'roll' ( uniform double)
 0:?     'destTex' ( writeonly uniform image2D)
 0:?     'inbi' ( in block{ in int a})
@@ -166,13 +165,13 @@
 0:35      GroupMemoryBarrier ( global void)
 0:36      move second child to first child ( temp int)
 0:36        value: direct index for structure (layout( column_major shared) buffer int)
-0:36          'anon@0' (layout( column_major shared) buffer block{layout( column_major shared) buffer int value, layout( column_major shared) buffer implicitly-sized array of float values})
+0:36          'anon@0' (layout( column_major shared) buffer block{layout( column_major shared) buffer int value, layout( column_major shared) buffer runtime-sized array of float values})
 0:36          Constant:
 0:36            0 (const uint)
 0:36        Convert float to int ( temp int)
 0:36          indirect index (layout( column_major shared) temp float)
-0:36            values: direct index for structure (layout( column_major shared) buffer implicitly-sized array of float)
-0:36              'anon@0' (layout( column_major shared) buffer block{layout( column_major shared) buffer int value, layout( column_major shared) buffer implicitly-sized array of float values})
+0:36            values: direct index for structure (layout( column_major shared) buffer runtime-sized array of float)
+0:36              'anon@0' (layout( column_major shared) buffer block{layout( column_major shared) buffer int value, layout( column_major shared) buffer runtime-sized array of float values})
 0:36              Constant:
 0:36                1 (const uint)
 0:36            'gl_LocalInvocationIndex' ( in uint LocalInvocationIndex)
@@ -191,8 +190,8 @@
 0:?       4096 (const uint)
 0:?     'total' ( const int)
 0:?       66592 (const int)
-0:?     'anon@0' (layout( column_major shared) buffer block{layout( column_major shared) buffer int value, layout( column_major shared) buffer implicitly-sized array of float values})
-0:?     'invalid' (layout( column_major shared) buffer block{layout( column_major shared) buffer implicitly-sized array of float values, layout( column_major shared) buffer int value})
+0:?     'anon@0' (layout( column_major shared) buffer block{layout( column_major shared) buffer int value, layout( column_major shared) buffer runtime-sized array of float values})
+0:?     'invalid' (layout( column_major shared) buffer block{layout( column_major shared) buffer 1-element array of float values, layout( column_major shared) buffer int value})
 0:?     'v3' (layout( location=2) in 3-component vector of float)
 0:?     'f' ( in float)
 0:?     'fo' ( out float)
@@ -202,7 +201,7 @@
 0:?     'arrX' ( global 2-element array of int)
 0:?     'arrY' ( global 1-element array of int)
 0:?     'arrZ' ( global 4096-element array of int)
-0:?     'ro' (layout( column_major shared) readonly buffer block{layout( column_major shared) buffer int value, layout( column_major shared) buffer implicitly-sized array of float values})
+0:?     'ro' (layout( column_major shared) readonly buffer block{layout( column_major shared) buffer int value, layout( column_major shared) buffer unsized 3-element array of float values})
 0:?     'roll' ( uniform double)
 0:?     'destTex' ( writeonly uniform image2D)
 0:?     'inbi' ( in block{ in int a})
diff --git a/Test/baseResults/430.vert.out b/Test/baseResults/430.vert.out
index a5898f2..f57a39c 100644
--- a/Test/baseResults/430.vert.out
+++ b/Test/baseResults/430.vert.out
@@ -1,5 +1,4 @@
 430.vert
-Warning, version 430 is not yet complete; most version-specific features are present, but some are missing.
 ERROR: 0:3: 'location' : can only apply to uniform, buffer, in, or out storage qualifiers 
 ERROR: 0:7: 'input block' : not supported in this stage: vertex
 ERROR: 0:7: 'location qualifier on in/out block' : not supported for this version or the enabled extensions 
@@ -28,9 +27,9 @@
 ERROR: 0:65: 'uniform buffer-member align' : not supported for this version or the enabled extensions 
 ERROR: 0:65: 'offset on block member' : not supported for this version or the enabled extensions 
 ERROR: 0:66: 'offset on block member' : not supported for this version or the enabled extensions 
-ERROR: 0:64: 'align' : can only be used with std140 or std430 layout packing 
-ERROR: 0:65: 'offset/align' : can only be used with std140 or std430 layout packing 
-ERROR: 0:66: 'offset/align' : can only be used with std140 or std430 layout packing 
+ERROR: 0:64: 'align' : can only be used with std140, std430, or scalar layout packing 
+ERROR: 0:65: 'offset/align' : can only be used with std140, std430, or scalar layout packing 
+ERROR: 0:66: 'offset/align' : can only be used with std140, std430, or scalar layout packing 
 ERROR: 0:71: 'offset on block member' : not supported for this version or the enabled extensions 
 ERROR: 0:74: 'gl_MaxTransformFeedbackBuffers' : required extension not requested: GL_ARB_enhanced_layouts
 ERROR: 0:75: 'gl_MaxTransformFeedbackInterleavedComponents' : required extension not requested: GL_ARB_enhanced_layouts
@@ -233,7 +232,7 @@
 0:?     'start2' ( const int)
 0:?       5 (const int)
 0:?     'v6' (layout( location=19) in 4-component vector of float)
-0:?     'ininst2' ( in block{layout( location=28 component=0) in bool b1, layout( location=29 component=0) in float f1, layout( location=25) in float f2})
+0:?     'ininst2' ( in block{layout( location=28) in bool b1, layout( location=29) in float f1, layout( location=25) in float f2})
 0:?     'in4' ( in block{layout( location=50) in float f1, layout( location=51) in float f2})
 0:?     'bbinst2g' ( out block{layout( xfb_buffer=3 xfb_offset=64) out 4-component vector of float bbv})
 0:?     'bg' (layout( xfb_buffer=1 xfb_offset=48 xfb_stride=80) smooth out 4-component vector of float)
@@ -308,7 +307,7 @@
 0:?     'start2' ( const int)
 0:?       5 (const int)
 0:?     'v6' (layout( location=19) in 4-component vector of float)
-0:?     'ininst2' ( in block{layout( location=28 component=0) in bool b1, layout( location=29 component=0) in float f1, layout( location=25) in float f2})
+0:?     'ininst2' ( in block{layout( location=28) in bool b1, layout( location=29) in float f1, layout( location=25) in float f2})
 0:?     'in4' ( in block{layout( location=50) in float f1, layout( location=51) in float f2})
 0:?     'bbinst2g' ( out block{layout( xfb_buffer=3 xfb_offset=64) out 4-component vector of float bbv})
 0:?     'bg' (layout( xfb_buffer=1 xfb_offset=48 xfb_stride=80) smooth out 4-component vector of float)
diff --git a/Test/baseResults/430AofA.frag.out b/Test/baseResults/430AofA.frag.out
index 3d53280..ac23dac 100644
--- a/Test/baseResults/430AofA.frag.out
+++ b/Test/baseResults/430AofA.frag.out
@@ -1,5 +1,4 @@
 430AofA.frag
-Warning, version 430 is not yet complete; most version-specific features are present, but some are missing.
 ERROR: 0:6: '[]' : only outermost dimension of an array of arrays can be implicitly sized 
 ERROR: 0:14: 'constructor' : constructing non-array constituent from array argument 
 ERROR: 0:15: 'constructor' : array constructor argument not correct type to construct array element 
@@ -8,7 +7,7 @@
 ERROR: 0:60: 'constructor' :  cannot convert parameter 2 from ' const 2-element array of 4-component vector of float' to ' temp 3-element array of 4-component vector of float'
 ERROR: 0:64: '=' :  cannot convert from ' const 3-element array of 2-element array of 4-component vector of float' to ' temp 4-element array of 2-element array of 4-component vector of float'
 ERROR: 0:70: 'assign' :  cannot convert from ' global 4-element array of 7-element array of float' to ' global 5-element array of 7-element array of float'
-ERROR: 0:71: 'assign' :  cannot convert from ' global 4-element array of 7-element array of float' to ' global implicitly-sized array of 7-element array of float'
+ERROR: 0:71: 'assign' :  cannot convert from ' global 4-element array of 7-element array of float' to ' global unsized 1-element array of 7-element array of float'
 ERROR: 0:73: 'foo' : no matching overloaded function found 
 ERROR: 0:78: '==' :  wrong operand types: no operation '==' exists that takes a left-hand operand of type ' global 4-element array of 7-element array of float' and a right operand of type ' global 5-element array of 7-element array of float' (or there is no acceptable conversion)
 ERROR: 0:84: '[' :  array index out of range '5'
@@ -336,7 +335,7 @@
 0:69        Function Call: foo(f1[5][7]; ( global 4-element array of 7-element array of float)
 0:69          'g5' ( global 5-element array of 7-element array of float)
 0:70      'g5' ( global 5-element array of 7-element array of float)
-0:71      'gu' ( global implicitly-sized array of 7-element array of float)
+0:71      'gu' ( global unsized 1-element array of 7-element array of float)
 0:73      Constant:
 0:73        0.000000
 0:74      Function Call: bar(f1[5][7]; ( global void)
@@ -405,8 +404,8 @@
 0:98        0.000000
 0:?   Linker Objects
 0:?     'many' ( global 1-element array of 2-element array of 3-element array of 4-element array of 5-element array of 6-element array of float)
-0:?     'gu' ( global implicitly-sized array of 7-element array of float)
-0:?     'gimp' ( global implicitly-sized array of implicitly-sized array of float)
+0:?     'gu' ( global unsized 1-element array of 7-element array of float)
+0:?     'gimp' ( global unsized 1-element array of 1-element array of float)
 0:?     'g4' ( global 4-element array of 7-element array of float)
 0:?     'g5' ( global 5-element array of 7-element array of float)
 
@@ -769,7 +768,7 @@
 0:?   Linker Objects
 0:?     'many' ( global 1-element array of 2-element array of 3-element array of 4-element array of 5-element array of 6-element array of float)
 0:?     'gu' ( global 1-element array of 7-element array of float)
-0:?     'gimp' ( global 1-element array of implicitly-sized array of float)
+0:?     'gimp' ( global 1-element array of 1-element array of float)
 0:?     'g4' ( global 4-element array of 7-element array of float)
 0:?     'g5' ( global 5-element array of 7-element array of float)
 
diff --git a/Test/baseResults/430scope.vert.out b/Test/baseResults/430scope.vert.out
index 3e71002..973c21a 100644
--- a/Test/baseResults/430scope.vert.out
+++ b/Test/baseResults/430scope.vert.out
@@ -1,5 +1,4 @@
 430scope.vert
-Warning, version 430 is not yet complete; most version-specific features are present, but some are missing.
 ERROR: 0:5: 'a' : redefinition 
 ERROR: 0:17: 'b' : function name is redeclaration of existing name 
 ERROR: 0:20: 'c' : redefinition 
@@ -64,7 +63,7 @@
 0:47          3.000000
 0:49      move second child to first child ( temp 4-component vector of float)
 0:49        gl_Position: direct index for structure ( invariant gl_Position 4-component vector of float Position)
-0:49          'anon@0' ( out block{ invariant gl_Position 4-component vector of float Position gl_Position,  gl_PointSize float PointSize gl_PointSize,  out implicitly-sized array of float ClipDistance gl_ClipDistance,  gl_ClipVertex 4-component vector of float ClipVertex gl_ClipVertex,  out 4-component vector of float FrontColor gl_FrontColor,  out 4-component vector of float BackColor gl_BackColor,  out 4-component vector of float FrontSecondaryColor gl_FrontSecondaryColor,  out 4-component vector of float BackSecondaryColor gl_BackSecondaryColor,  out implicitly-sized array of 4-component vector of float TexCoord gl_TexCoord,  out float FogFragCoord gl_FogFragCoord})
+0:49          'anon@0' ( out block{ invariant gl_Position 4-component vector of float Position gl_Position,  gl_PointSize float PointSize gl_PointSize,  out unsized 1-element array of float ClipDistance gl_ClipDistance,  gl_ClipVertex 4-component vector of float ClipVertex gl_ClipVertex,  out 4-component vector of float FrontColor gl_FrontColor,  out 4-component vector of float BackColor gl_BackColor,  out 4-component vector of float FrontSecondaryColor gl_FrontSecondaryColor,  out 4-component vector of float BackSecondaryColor gl_BackSecondaryColor,  out unsized 1-element array of 4-component vector of float TexCoord gl_TexCoord,  out float FogFragCoord gl_FogFragCoord})
 0:49          Constant:
 0:49            0 (const uint)
 0:49        Construct vec4 ( temp 4-component vector of float)
diff --git a/Test/baseResults/435.vert.out b/Test/baseResults/435.vert.out
new file mode 100644
index 0000000..188a0a4
--- /dev/null
+++ b/Test/baseResults/435.vert.out
@@ -0,0 +1,25 @@
+435.vert
+ERROR: version not supported
+ERROR: 1 compilation errors.  No code generated.
+
+
+Shader version: 450
+ERROR: node is still EOpNull!
+0:2  Function Definition: main( ( global void)
+0:2    Function Parameters: 
+0:?   Linker Objects
+0:?     'gl_VertexID' ( gl_VertexId int VertexId)
+0:?     'gl_InstanceID' ( gl_InstanceId int InstanceId)
+
+
+Linked vertex stage:
+
+
+Shader version: 450
+ERROR: node is still EOpNull!
+0:2  Function Definition: main( ( global void)
+0:2    Function Parameters: 
+0:?   Linker Objects
+0:?     'gl_VertexID' ( gl_VertexId int VertexId)
+0:?     'gl_InstanceID' ( gl_InstanceId int InstanceId)
+
diff --git a/Test/baseResults/440.frag.out b/Test/baseResults/440.frag.out
index ff27641..1ac6e7c 100644
--- a/Test/baseResults/440.frag.out
+++ b/Test/baseResults/440.frag.out
@@ -1,5 +1,4 @@
 440.frag
-Warning, version 440 is not yet complete; most version-specific features are present, but some are missing.
 ERROR: 0:11: 'location' : overlapping use of location 4
 ERROR: 0:13: 'component' : type overflows the available 4 components 
 ERROR: 0:22: 'location' : fragment outputs sharing the same location must be the same basic type 30
@@ -22,11 +21,11 @@
 ERROR: 0:39: 'output block' : not supported in this stage: fragment
 ERROR: 0:39: 'layout' : offset/align can only be used on a uniform or buffer 
 ERROR: 0:39: 'offset' : only applies to block members, not blocks 
-ERROR: 0:42: 'align' : can only be used with std140 or std430 layout packing 
-ERROR: 0:43: 'align' : can only be used with std140 or std430 layout packing 
+ERROR: 0:42: 'align' : can only be used with std140, std430, or scalar layout packing 
+ERROR: 0:43: 'align' : can only be used with std140, std430, or scalar layout packing 
 ERROR: 0:43: 'layout' : offset/align can only be used on a uniform or buffer 
 ERROR: 0:44: 'output block' : not supported in this stage: fragment
-ERROR: 0:44: 'align' : can only be used with std140 or std430 layout packing 
+ERROR: 0:44: 'align' : can only be used with std140, std430, or scalar layout packing 
 ERROR: 0:44: 'layout' : offset/align can only be used on a uniform or buffer 
 ERROR: 0:46: 'offset' : cannot specify on a variable declaration 
 ERROR: 0:47: 'layout' : offset/align can only be used on a uniform or buffer 
@@ -37,9 +36,9 @@
 ERROR: 0:54: 'layout' : matrix or packing qualifiers can only be used on a uniform or buffer 
 ERROR: 0:55: 'layout' : cannot specify packing on a variable declaration 
 ERROR: 0:57: 'align' : must be a power of 2 
-ERROR: 0:58: 'offset/align' : can only be used with std140 or std430 layout packing 
-ERROR: 0:62: 'offset/align' : can only be used with std140 or std430 layout packing 
-ERROR: 0:63: 'offset/align' : can only be used with std140 or std430 layout packing 
+ERROR: 0:58: 'offset/align' : can only be used with std140, std430, or scalar layout packing 
+ERROR: 0:62: 'offset/align' : can only be used with std140, std430, or scalar layout packing 
+ERROR: 0:63: 'offset/align' : can only be used with std140, std430, or scalar layout packing 
 ERROR: 0:62: 'layout' : offset/align can only be used on a uniform or buffer 
 ERROR: 0:63: 'layout' : offset/align can only be used on a uniform or buffer 
 ERROR: 0:84: 'align' : must be a power of 2 
diff --git a/Test/baseResults/440.vert.out b/Test/baseResults/440.vert.out
index 3448113..5a10e26 100644
--- a/Test/baseResults/440.vert.out
+++ b/Test/baseResults/440.vert.out
@@ -1,5 +1,4 @@
 440.vert
-Warning, version 440 is not yet complete; most version-specific features are present, but some are missing.
 ERROR: 0:8: 'component' : type overflows the available 4 components 
 ERROR: 0:15: 'component' : component is too large 
 ERROR: 0:23: 'location' : overlapping use of location 4
@@ -47,51 +46,54 @@
 ERROR: 0:169: 'xfb_buffer' : buffer is too large: gl_MaxTransformFeedbackBuffers is 4
 ERROR: 0:169: 'xfb_stride' : 1/4 stride is too large: gl_MaxTransformFeedbackInterleavedComponents is 64
 ERROR: 0:171: 'xfb_buffer' : buffer is too large: gl_MaxTransformFeedbackBuffers is 4
-ERROR: 0:179: 'gl_BaseVertexARB' : required extension not requested: GL_ARB_shader_draw_parameters
-ERROR: 0:179: 'gl_BaseInstanceARB' : required extension not requested: GL_ARB_shader_draw_parameters
-ERROR: 0:179: 'gl_DrawIDARB' : required extension not requested: GL_ARB_shader_draw_parameters
-ERROR: 0:187: 'assign' :  l-value required "gl_BaseVertexARB" (can't modify shader input)
-ERROR: 0:188: 'assign' :  l-value required "gl_BaseInstanceARB" (can't modify shader input)
-ERROR: 0:189: 'assign' :  l-value required "gl_DrawIDARB" (can't modify shader input)
-ERROR: 0:190: 'glBaseInstanceARB' : undeclared identifier 
-ERROR: 54 compilation errors.  No code generated.
+ERROR: 0:178: 'xfb_offset' : overlapping offsets at offset 36 in buffer 3
+ERROR: 0:179: 'xfb_buffer' : member cannot contradict block (or what block inherited from global) 
+ERROR: 0:178: 'xfb_offset' : overlapping offsets at offset 32 in buffer 3
+ERROR: 0:185: 'gl_BaseVertexARB' : required extension not requested: GL_ARB_shader_draw_parameters
+ERROR: 0:185: 'gl_BaseInstanceARB' : required extension not requested: GL_ARB_shader_draw_parameters
+ERROR: 0:185: 'gl_DrawIDARB' : required extension not requested: GL_ARB_shader_draw_parameters
+ERROR: 0:193: 'assign' :  l-value required "gl_BaseVertexARB" (can't modify shader input)
+ERROR: 0:194: 'assign' :  l-value required "gl_BaseInstanceARB" (can't modify shader input)
+ERROR: 0:195: 'assign' :  l-value required "gl_DrawIDARB" (can't modify shader input)
+ERROR: 0:196: 'glBaseInstanceARB' : undeclared identifier 
+ERROR: 57 compilation errors.  No code generated.
 
 
 Shader version: 440
 Requested GL_ARB_shader_draw_parameters
 in xfb mode
 ERROR: node is still EOpNull!
-0:177  Function Definition: drawParamsBad( ( global int)
-0:177    Function Parameters: 
-0:179    Sequence
-0:179      Branch: Return with expression
-0:179        add ( temp int)
-0:179          add ( temp int)
-0:179            'gl_BaseVertexARB' ( in int BaseVertex)
-0:179            'gl_BaseInstanceARB' ( in int BaseInstance)
-0:179          'gl_DrawIDARB' ( in int DrawId)
-0:184  Function Definition: drawParams( ( global int)
-0:184    Function Parameters: 
-0:186    Sequence
-0:186      Branch: Return with expression
-0:186        add ( temp int)
-0:186          add ( temp int)
-0:186            'gl_BaseVertexARB' ( in int BaseVertex)
-0:186            'gl_BaseInstanceARB' ( in int BaseInstance)
-0:186          'gl_DrawIDARB' ( in int DrawId)
-0:187      move second child to first child ( temp int)
-0:187        'gl_BaseVertexARB' ( in int BaseVertex)
-0:187        Constant:
-0:187          3 (const int)
-0:188      move second child to first child ( temp int)
-0:188        'gl_BaseInstanceARB' ( in int BaseInstance)
-0:188        Constant:
-0:188          3 (const int)
-0:189      move second child to first child ( temp int)
-0:189        'gl_DrawIDARB' ( in int DrawId)
-0:189        Constant:
-0:189          3 (const int)
-0:190      'glBaseInstanceARB' ( temp float)
+0:183  Function Definition: drawParamsBad( ( global int)
+0:183    Function Parameters: 
+0:185    Sequence
+0:185      Branch: Return with expression
+0:185        add ( temp int)
+0:185          add ( temp int)
+0:185            'gl_BaseVertexARB' ( in int BaseVertex)
+0:185            'gl_BaseInstanceARB' ( in int BaseInstance)
+0:185          'gl_DrawIDARB' ( in int DrawId)
+0:190  Function Definition: drawParams( ( global int)
+0:190    Function Parameters: 
+0:192    Sequence
+0:192      Branch: Return with expression
+0:192        add ( temp int)
+0:192          add ( temp int)
+0:192            'gl_BaseVertexARB' ( in int BaseVertex)
+0:192            'gl_BaseInstanceARB' ( in int BaseInstance)
+0:192          'gl_DrawIDARB' ( in int DrawId)
+0:193      move second child to first child ( temp int)
+0:193        'gl_BaseVertexARB' ( in int BaseVertex)
+0:193        Constant:
+0:193          3 (const int)
+0:194      move second child to first child ( temp int)
+0:194        'gl_BaseInstanceARB' ( in int BaseInstance)
+0:194        Constant:
+0:194          3 (const int)
+0:195      move second child to first child ( temp int)
+0:195        'gl_DrawIDARB' ( in int DrawId)
+0:195        Constant:
+0:195          3 (const int)
+0:196      'glBaseInstanceARB' ( temp float)
 0:?   Linker Objects
 0:?     'a' (layout( location=2 component=2) in 2-component vector of float)
 0:?     'b' (layout( location=2 component=1) in float)
@@ -154,6 +156,7 @@
 0:?     'bbinst9' ( out block{layout( xfb_buffer=4 xfb_offset=1) out bool b, layout( xfb_buffer=4 xfb_offset=12) out structure{ global bool b,  global structure{ global int i,  global double d,  global float f} s,  global 2-component vector of float v2} t, layout( xfb_buffer=4 xfb_offset=52) out 3X3 matrix of float m3, layout( xfb_buffer=4 xfb_offset=90) out int i, layout( xfb_buffer=4 xfb_offset=98) out double d, layout( xfb_buffer=4 xfb_offset=108) out structure{ global int a} s})
 0:?     'bm' (layout( xfb_buffer=5 xfb_offset=0) smooth out float)
 0:?     'bbinst10' ( out block{layout( xfb_buffer=7 xfb_offset=0) out 4X4 matrix of double m1, layout( xfb_buffer=7 xfb_offset=128) out 4X4 matrix of double m2, layout( xfb_buffer=7 xfb_offset=256) out float f})
+0:?     'anon@0' ( out block{layout( xfb_buffer=3 xfb_offset=36) gl_Position 4-component vector of float Position gl_Position, layout( xfb_buffer=3 xfb_offset=32) gl_PointSize float PointSize gl_PointSize, })
 0:?     'gl_VertexID' ( gl_VertexId int VertexId)
 0:?     'gl_InstanceID' ( gl_InstanceId int InstanceId)
 
@@ -168,6 +171,8 @@
 ERROR: Linking vertex stage: xfb_stride must be multiple of 4:
 ERROR:     xfb_buffer 5, xfb_stride 6
 ERROR: Linking vertex stage: xfb_stride is too large:
+ERROR:     xfb_buffer 6, components (1/4 stride) needed are 500, gl_MaxTransformFeedbackInterleavedComponents is 64
+ERROR: Linking vertex stage: xfb_stride is too large:
 ERROR:     xfb_buffer 7, components (1/4 stride) needed are 66, gl_MaxTransformFeedbackInterleavedComponents is 64
 
 Shader version: 440
@@ -236,6 +241,7 @@
 0:?     'bbinst9' ( out block{layout( xfb_buffer=4 xfb_offset=1) out bool b, layout( xfb_buffer=4 xfb_offset=12) out structure{ global bool b,  global structure{ global int i,  global double d,  global float f} s,  global 2-component vector of float v2} t, layout( xfb_buffer=4 xfb_offset=52) out 3X3 matrix of float m3, layout( xfb_buffer=4 xfb_offset=90) out int i, layout( xfb_buffer=4 xfb_offset=98) out double d, layout( xfb_buffer=4 xfb_offset=108) out structure{ global int a} s})
 0:?     'bm' (layout( xfb_buffer=5 xfb_offset=0) smooth out float)
 0:?     'bbinst10' ( out block{layout( xfb_buffer=7 xfb_offset=0) out 4X4 matrix of double m1, layout( xfb_buffer=7 xfb_offset=128) out 4X4 matrix of double m2, layout( xfb_buffer=7 xfb_offset=256) out float f})
+0:?     'anon@0' ( out block{layout( xfb_buffer=3 xfb_offset=36) gl_Position 4-component vector of float Position gl_Position, layout( xfb_buffer=3 xfb_offset=32) gl_PointSize float PointSize gl_PointSize, })
 0:?     'gl_VertexID' ( gl_VertexId int VertexId)
 0:?     'gl_InstanceID' ( gl_InstanceId int InstanceId)
 
diff --git a/Test/baseResults/450.comp.out b/Test/baseResults/450.comp.out
index 203c4b2..4ae77cc 100644
--- a/Test/baseResults/450.comp.out
+++ b/Test/baseResults/450.comp.out
@@ -1,18 +1,24 @@
 450.comp
-Warning, version 450 is not yet complete; most version-specific features are present, but some are missing.
+ERROR: 0:2: 'local_size_x' : must be at least 1 
+ERROR: 0:5: 'shared' : not allowed in nested scope 
+ERROR: 2 compilation errors.  No code generated.
+
 
 Shader version: 450
 local_size = (1, 1, 1)
-0:? Sequence
+ERROR: node is still EOpNull!
+0:3  Function Definition: main( ( global void)
+0:3    Function Parameters: 
 0:?   Linker Objects
 
 
 Linked compute stage:
 
-ERROR: Linking compute stage: Missing entry point: Each stage requires one entry point
 
 Shader version: 450
 local_size = (1, 1, 1)
-0:? Sequence
+ERROR: node is still EOpNull!
+0:3  Function Definition: main( ( global void)
+0:3    Function Parameters: 
 0:?   Linker Objects
 
diff --git a/Test/baseResults/450.frag.out b/Test/baseResults/450.frag.out
index 297ae63..9cbb4cb 100644
--- a/Test/baseResults/450.frag.out
+++ b/Test/baseResults/450.frag.out
@@ -1,8 +1,11 @@
 450.frag
-Warning, version 450 is not yet complete; most version-specific features are present, but some are missing.
+ERROR: 0:63: 'location' : cannot use in a block array where new locations are needed for each block element 
+ERROR: 0:68: 'early_fragment_tests' : can only apply to a standalone qualifier 
+ERROR: 2 compilation errors.  No code generated.
+
 
 Shader version: 450
-0:? Sequence
+ERROR: node is still EOpNull!
 0:8  Function Definition: main( ( global void)
 0:8    Function Parameters: 
 0:10    Sequence
@@ -160,13 +163,16 @@
 0:?     'us2dmsa' ( uniform usampler2DMSArray)
 0:?     'ii2dms' (layout( rgba32i) uniform iimage2DMS)
 0:?     'i2dmsa' (layout( rgba32f) uniform image2DMSArray)
+0:?     'bInst1' ( in block{layout( location=6) in float f, layout( location=7) in float g, layout( location=8) in 4X4 matrix of float m})
+0:?     'bInst2' ( in 3-element array of block{layout( location=12) in float f, layout( location=13) in float g})
+0:?     'f' ( smooth in float)
 
 
 Linked fragment stage:
 
 
 Shader version: 450
-0:? Sequence
+ERROR: node is still EOpNull!
 0:8  Function Definition: main( ( global void)
 0:8    Function Parameters: 
 0:10    Sequence
@@ -273,4 +279,7 @@
 0:?     'us2dmsa' ( uniform usampler2DMSArray)
 0:?     'ii2dms' (layout( rgba32i) uniform iimage2DMS)
 0:?     'i2dmsa' (layout( rgba32f) uniform image2DMSArray)
+0:?     'bInst1' ( in block{layout( location=6) in float f, layout( location=7) in float g, layout( location=8) in 4X4 matrix of float m})
+0:?     'bInst2' ( in 3-element array of block{layout( location=12) in float f, layout( location=13) in float g})
+0:?     'f' ( smooth in float)
 
diff --git a/Test/baseResults/450.geom.out b/Test/baseResults/450.geom.out
index 8d313c8..e75bf93 100644
--- a/Test/baseResults/450.geom.out
+++ b/Test/baseResults/450.geom.out
@@ -1,8 +1,8 @@
 450.geom
-Warning, version 450 is not yet complete; most version-specific features are present, but some are missing.
 ERROR: 0:15: '[' :  array index out of range '3'
 ERROR: 0:15: 'gl_Position' : no such field in structure 
-ERROR: 2 compilation errors.  No code generated.
+ERROR: 0:19: 'points' : can only apply to a standalone qualifier 
+ERROR: 3 compilation errors.  No code generated.
 
 
 Shader version: 450
@@ -39,6 +39,7 @@
 0:?   Linker Objects
 0:?     'gl_in' ( in 3-element array of block{ in 3-element array of float CullDistance gl_CullDistance})
 0:?     'anon@0' (layout( stream=0) out block{layout( stream=0) out 3-element array of float CullDistance gl_CullDistance})
+0:?     'f' ( in 3-element array of float)
 
 
 Linked geometry stage:
@@ -80,4 +81,5 @@
 0:?   Linker Objects
 0:?     'gl_in' ( in 3-element array of block{ in 3-element array of float CullDistance gl_CullDistance})
 0:?     'anon@0' (layout( stream=0) out block{layout( stream=0) out 3-element array of float CullDistance gl_CullDistance})
+0:?     'f' ( in 3-element array of float)
 
diff --git a/Test/baseResults/450.tesc.out b/Test/baseResults/450.tesc.out
index 29da425..b3f4e25 100644
--- a/Test/baseResults/450.tesc.out
+++ b/Test/baseResults/450.tesc.out
@@ -1,9 +1,11 @@
 450.tesc
-Warning, version 450 is not yet complete; most version-specific features are present, but some are missing.
+ERROR: 0:20: 'location' : cannot use in a block array where new locations are needed for each block element 
+ERROR: 1 compilation errors.  No code generated.
+
 
 Shader version: 450
 vertices = -1
-0:? Sequence
+ERROR: node is still EOpNull!
 0:11  Function Definition: main( ( global void)
 0:11    Function Parameters: 
 0:13    Sequence
@@ -30,6 +32,8 @@
 0:?   Linker Objects
 0:?     'gl_in' ( in 32-element array of block{ in 3-element array of float CullDistance gl_CullDistance})
 0:?     'gl_out' ( out 4-element array of block{ out 3-element array of float CullDistance gl_CullDistance})
+0:?     'bInst1' ( out 2-element array of block{layout( location=4) out float f, layout( location=5) out float g})
+0:?     'bInst2' ( out 2-element array of 3-element array of block{layout( location=6) out float f, layout( location=7) out float g})
 
 
 Linked tessellation control stage:
@@ -38,7 +42,7 @@
 
 Shader version: 450
 vertices = -1
-0:? Sequence
+ERROR: node is still EOpNull!
 0:11  Function Definition: main( ( global void)
 0:11    Function Parameters: 
 0:13    Sequence
@@ -65,4 +69,6 @@
 0:?   Linker Objects
 0:?     'gl_in' ( in 32-element array of block{ in 3-element array of float CullDistance gl_CullDistance})
 0:?     'gl_out' ( out 4-element array of block{ out 3-element array of float CullDistance gl_CullDistance})
+0:?     'bInst1' ( out 2-element array of block{layout( location=4) out float f, layout( location=5) out float g})
+0:?     'bInst2' ( out 2-element array of 3-element array of block{layout( location=6) out float f, layout( location=7) out float g})
 
diff --git a/Test/baseResults/450.tese.out b/Test/baseResults/450.tese.out
index b7735e6..796d6f1 100644
--- a/Test/baseResults/450.tese.out
+++ b/Test/baseResults/450.tese.out
@@ -1,11 +1,18 @@
 450.tese
-Warning, version 450 is not yet complete; most version-specific features are present, but some are missing.
+ERROR: 0:16: 'equal_spacing' : can only apply to a standalone qualifier 
+ERROR: 0:17: 'fractional_even_spacing' : can only apply to a standalone qualifier 
+ERROR: 0:18: 'fractional_odd_spacing' : can only apply to a standalone qualifier 
+ERROR: 0:19: 'cw' : can only apply to a standalone qualifier 
+ERROR: 0:20: 'ccw' : can only apply to a standalone qualifier 
+ERROR: 0:21: 'point_mode' : can only apply to a standalone qualifier 
+ERROR: 6 compilation errors.  No code generated.
+
 
 Shader version: 450
 input primitive = none
 vertex spacing = none
 triangle order = none
-0:? Sequence
+ERROR: node is still EOpNull!
 0:11  Function Definition: main( ( global void)
 0:11    Function Parameters: 
 0:13    Sequence
@@ -30,6 +37,12 @@
 0:?   Linker Objects
 0:?     'gl_in' ( in 32-element array of block{ in 3-element array of float CullDistance gl_CullDistance})
 0:?     'anon@0' ( out block{ out 3-element array of float CullDistance gl_CullDistance})
+0:?     'f1' ( in 32-element array of float)
+0:?     'f2' ( in 32-element array of float)
+0:?     'f3' ( in 32-element array of float)
+0:?     'f4' ( in 32-element array of float)
+0:?     'f5' ( in 32-element array of float)
+0:?     'f6' ( in 32-element array of float)
 
 
 Linked tessellation evaluation stage:
@@ -40,7 +53,7 @@
 input primitive = none
 vertex spacing = equal_spacing
 triangle order = ccw
-0:? Sequence
+ERROR: node is still EOpNull!
 0:11  Function Definition: main( ( global void)
 0:11    Function Parameters: 
 0:13    Sequence
@@ -65,4 +78,10 @@
 0:?   Linker Objects
 0:?     'gl_in' ( in 32-element array of block{ in 3-element array of float CullDistance gl_CullDistance})
 0:?     'anon@0' ( out block{ out 3-element array of float CullDistance gl_CullDistance})
+0:?     'f1' ( in 32-element array of float)
+0:?     'f2' ( in 32-element array of float)
+0:?     'f3' ( in 32-element array of float)
+0:?     'f4' ( in 32-element array of float)
+0:?     'f5' ( in 32-element array of float)
+0:?     'f6' ( in 32-element array of float)
 
diff --git a/Test/baseResults/450.vert.out b/Test/baseResults/450.vert.out
index cc300d9..0f5f231 100644
--- a/Test/baseResults/450.vert.out
+++ b/Test/baseResults/450.vert.out
@@ -1,9 +1,27 @@
 450.vert
-Warning, version 450 is not yet complete; most version-specific features are present, but some are missing.
 ERROR: 0:12: 'out' : cannot be bool 
 ERROR: 0:13: 'sampler2D' : sampler/image types can only be used in uniform variables or function parameters: outo
-ERROR: 0:27: '::' : not supported 
-ERROR: 3 compilation errors.  No code generated.
+ERROR: 0:30: '::' : not supported 
+ERROR: 0:31: 'atomicCounterAdd' : no matching overloaded function found 
+ERROR: 0:32: 'atomicCounterSubtract' : no matching overloaded function found 
+ERROR: 0:33: 'atomicCounterMin' : no matching overloaded function found 
+ERROR: 0:34: 'atomicCounterMax' : no matching overloaded function found 
+ERROR: 0:35: 'atomicCounterAnd' : no matching overloaded function found 
+ERROR: 0:36: 'atomicCounterOr' : no matching overloaded function found 
+ERROR: 0:37: 'atomicCounterXor' : no matching overloaded function found 
+ERROR: 0:38: 'atomicCounterExchange' : no matching overloaded function found 
+ERROR: 0:39: 'atomicCounterCompSwap' : no matching overloaded function found 
+ERROR: 0:41: 'gl_BaseVertex' : undeclared identifier 
+ERROR: 0:41: 'gl_BaseInstance' : undeclared identifier 
+ERROR: 0:41: 'gl_DrawID' : undeclared identifier 
+ERROR: 0:41: '=' :  cannot convert from ' temp float' to ' temp int'
+ERROR: 0:44: 'anyInvocation' : no matching overloaded function found 
+ERROR: 0:45: 'allInvocations' : no matching overloaded function found 
+ERROR: 0:46: 'allInvocationsEqual' : no matching overloaded function found 
+ERROR: 0:48: 'extraneous semicolon' : not supported for this version or the enabled extensions 
+ERROR: 0:50: 'location' : cannot apply to uniform or buffer block 
+ERROR: 0:54: 'location' : cannot apply to uniform or buffer block 
+ERROR: 22 compilation errors.  No code generated.
 
 
 Shader version: 450
@@ -21,8 +39,33 @@
 0:9            2 (const int)
 0:9        Constant:
 0:9          4.500000
-0:25  Function Definition: foo( ( global void)
-0:25    Function Parameters: 
+0:28  Function Definition: foo( ( global void)
+0:28    Function Parameters: 
+0:?     Sequence
+0:31      Constant:
+0:31        0.000000
+0:32      Constant:
+0:32        0.000000
+0:33      Constant:
+0:33        0.000000
+0:34      Constant:
+0:34        0.000000
+0:35      Constant:
+0:35        0.000000
+0:36      Constant:
+0:36        0.000000
+0:37      Constant:
+0:37        0.000000
+0:38      Constant:
+0:38        0.000000
+0:39      Constant:
+0:39        0.000000
+0:44      Constant:
+0:44        0.000000
+0:45      Constant:
+0:45        0.000000
+0:46      Constant:
+0:46        0.000000
 0:?   Linker Objects
 0:?     'anon@0' ( out block{ out 3-element array of float CullDistance gl_CullDistance})
 0:?     'outb' ( smooth out bool)
@@ -34,6 +77,10 @@
 0:?     'outsa' ( smooth out 4-element array of structure{ global float f})
 0:?     'outSA' ( smooth out structure{ global 4-element array of float f})
 0:?     'outSS' ( smooth out structure{ global float f,  global structure{ global float f} s})
+0:?     'aui' (layout( binding=0 offset=0) uniform atomic_uint)
+0:?     'ui' ( global uint)
+0:?     'anon@1' (layout( location=0 column_major shared) uniform block{layout( column_major shared) uniform int a})
+0:?     'anon@2' (layout( location=0 column_major shared) buffer block{layout( column_major shared) buffer int b})
 0:?     'gl_VertexID' ( gl_VertexId int VertexId)
 0:?     'gl_InstanceID' ( gl_InstanceId int InstanceId)
 
@@ -67,6 +114,10 @@
 0:?     'outsa' ( smooth out 4-element array of structure{ global float f})
 0:?     'outSA' ( smooth out structure{ global 4-element array of float f})
 0:?     'outSS' ( smooth out structure{ global float f,  global structure{ global float f} s})
+0:?     'aui' (layout( binding=0 offset=0) uniform atomic_uint)
+0:?     'ui' ( global uint)
+0:?     'anon@1' (layout( location=0 column_major shared) uniform block{layout( column_major shared) uniform int a})
+0:?     'anon@2' (layout( location=0 column_major shared) buffer block{layout( column_major shared) buffer int b})
 0:?     'gl_VertexID' ( gl_VertexId int VertexId)
 0:?     'gl_InstanceID' ( gl_InstanceId int InstanceId)
 
diff --git a/Test/baseResults/460.frag.out b/Test/baseResults/460.frag.out
new file mode 100644
index 0000000..90c4837
--- /dev/null
+++ b/Test/baseResults/460.frag.out
@@ -0,0 +1,101 @@
+460.frag
+ERROR: 0:22: 'attribute' : required extension not requested: GL_EXT_control_flow_attributes
+ERROR: 0:23: 'attribute' : required extension not requested: GL_EXT_control_flow_attributes
+ERROR: 0:30: 'dependency_length' : must be positive 
+ERROR: 0:31: 'dependency_length' : must be positive 
+ERROR: 4 compilation errors.  No code generated.
+
+
+Shader version: 460
+Requested GL_EXT_control_flow_attributes
+ERROR: node is still EOpNull!
+0:10  Function Definition: main( ( global void)
+0:10    Function Parameters: 
+0:12    Sequence
+0:12      interpolateAtCentroid ( global 4-component vector of float)
+0:12        v: direct index for structure ( global 4-component vector of float)
+0:12          's' ( smooth in structure{ global float f,  global 4-component vector of float v})
+0:12          Constant:
+0:12            1 (const int)
+0:14      move second child to first child ( temp bool)
+0:14        'b1' ( temp bool)
+0:14        anyInvocation ( global bool)
+0:14          'b1' ( temp bool)
+0:15      move second child to first child ( temp bool)
+0:15        'b1' ( temp bool)
+0:15        allInvocations ( global bool)
+0:15          'b1' ( temp bool)
+0:16      move second child to first child ( temp bool)
+0:16        'b1' ( temp bool)
+0:16        allInvocationsEqual ( global bool)
+0:16          'b1' ( temp bool)
+0:19  Function Definition: attExtBad( ( global void)
+0:19    Function Parameters: 
+0:22    Sequence
+0:22      Sequence
+0:22        Sequence
+0:22          move second child to first child ( temp int)
+0:22            'i' ( temp int)
+0:22            Constant:
+0:22              0 (const int)
+0:22        Loop with condition tested first: Dependency 4
+0:22          Loop Condition
+0:22          Compare Less Than ( temp bool)
+0:22            'i' ( temp int)
+0:22            Constant:
+0:22              8 (const int)
+0:22          No loop body
+0:22          Loop Terminal Expression
+0:22          Pre-Increment ( temp int)
+0:22            'i' ( temp int)
+0:23      Test condition and select ( temp void): Flatten
+0:23        Condition
+0:23        Constant:
+0:23          true (const bool)
+0:23        true case is null
+0:28  Function Definition: attExt( ( global void)
+0:28    Function Parameters: 
+0:30    Sequence
+0:30      Loop with condition not tested first: Dependency -3
+0:30        Loop Condition
+0:30        Constant:
+0:30          true (const bool)
+0:30        No loop body
+0:31      Loop with condition not tested first
+0:31        Loop Condition
+0:31        Constant:
+0:31          true (const bool)
+0:31        No loop body
+0:?   Linker Objects
+0:?     's' ( smooth in structure{ global float f,  global 4-component vector of float v})
+
+
+Linked fragment stage:
+
+
+Shader version: 460
+Requested GL_EXT_control_flow_attributes
+ERROR: node is still EOpNull!
+0:10  Function Definition: main( ( global void)
+0:10    Function Parameters: 
+0:12    Sequence
+0:12      interpolateAtCentroid ( global 4-component vector of float)
+0:12        v: direct index for structure ( global 4-component vector of float)
+0:12          's' ( smooth in structure{ global float f,  global 4-component vector of float v})
+0:12          Constant:
+0:12            1 (const int)
+0:14      move second child to first child ( temp bool)
+0:14        'b1' ( temp bool)
+0:14        anyInvocation ( global bool)
+0:14          'b1' ( temp bool)
+0:15      move second child to first child ( temp bool)
+0:15        'b1' ( temp bool)
+0:15        allInvocations ( global bool)
+0:15          'b1' ( temp bool)
+0:16      move second child to first child ( temp bool)
+0:16        'b1' ( temp bool)
+0:16        allInvocationsEqual ( global bool)
+0:16          'b1' ( temp bool)
+0:?   Linker Objects
+0:?     's' ( smooth in structure{ global float f,  global 4-component vector of float v})
+
diff --git a/Test/baseResults/460.vert.out b/Test/baseResults/460.vert.out
new file mode 100644
index 0000000..8fa659b
--- /dev/null
+++ b/Test/baseResults/460.vert.out
@@ -0,0 +1,51 @@
+460.vert
+Shader version: 460
+0:? Sequence
+0:7  Function Definition: main( ( global void)
+0:7    Function Parameters: 
+0:?     Sequence
+0:10      move second child to first child ( temp bool)
+0:10        'b1' ( temp bool)
+0:10        anyInvocation ( global bool)
+0:10          'b1' ( temp bool)
+0:11      move second child to first child ( temp bool)
+0:11        'b1' ( temp bool)
+0:11        allInvocations ( global bool)
+0:11          'b1' ( temp bool)
+0:12      move second child to first child ( temp bool)
+0:12        'b1' ( temp bool)
+0:12        allInvocationsEqual ( global bool)
+0:12          'b1' ( temp bool)
+0:?   Linker Objects
+0:?     'i' ( global int)
+0:?     'f' ( global float)
+0:?     'gl_VertexID' ( gl_VertexId int VertexId)
+0:?     'gl_InstanceID' ( gl_InstanceId int InstanceId)
+
+
+Linked vertex stage:
+
+
+Shader version: 460
+0:? Sequence
+0:7  Function Definition: main( ( global void)
+0:7    Function Parameters: 
+0:?     Sequence
+0:10      move second child to first child ( temp bool)
+0:10        'b1' ( temp bool)
+0:10        anyInvocation ( global bool)
+0:10          'b1' ( temp bool)
+0:11      move second child to first child ( temp bool)
+0:11        'b1' ( temp bool)
+0:11        allInvocations ( global bool)
+0:11          'b1' ( temp bool)
+0:12      move second child to first child ( temp bool)
+0:12        'b1' ( temp bool)
+0:12        allInvocationsEqual ( global bool)
+0:12          'b1' ( temp bool)
+0:?   Linker Objects
+0:?     'i' ( global int)
+0:?     'f' ( global float)
+0:?     'gl_VertexID' ( gl_VertexId int VertexId)
+0:?     'gl_InstanceID' ( gl_InstanceId int InstanceId)
+
diff --git a/Test/baseResults/array.frag.out b/Test/baseResults/array.frag.out
index f41f0af..2af9f27 100644
--- a/Test/baseResults/array.frag.out
+++ b/Test/baseResults/array.frag.out
@@ -2,7 +2,7 @@
 ERROR: 0:21: '[' :  array index out of range '2'
 ERROR: 0:27: '[' :  array must be redeclared with a size before being indexed with a variable
 ERROR: 0:30: 'assign' :  cannot convert from ' global 4-element array of float' to ' global 5-element array of float'
-ERROR: 0:31: 'assign' :  cannot convert from ' global 4-element array of float' to ' global implicitly-sized array of float'
+ERROR: 0:31: 'assign' :  cannot convert from ' global 4-element array of float' to ' global runtime-sized array of float'
 ERROR: 0:33: 'foo' : no matching overloaded function found 
 ERROR: 0:42: '[' :  array index out of range '5'
 ERROR: 0:45: '[' :  array index out of range '1000'
@@ -23,9 +23,12 @@
 ERROR: 0:93: 'length' :  array must be declared with a size before using this method
 ERROR: 0:101: '[' :  array index out of range '5'
 ERROR: 0:104: 'constructor' : array constructor must have at least one argument 
-ERROR: 0:104: '=' :  cannot convert from ' const float' to ' global implicitly-sized array of int'
+ERROR: 0:104: '=' :  cannot convert from ' const float' to ' global unsized 1-element array of int'
 ERROR: 0:106: 'constructor' : array argument must be sized 
-ERROR: 26 compilation errors.  No code generated.
+ERROR: 0:111: 'variable index' : required extension not requested: GL_EXT_nonuniform_qualifier
+ERROR: 0:111: 'variable indexing sampler array' : not supported with this profile: none
+ERROR: 0:112: '[]' : array initializer must be sized 
+ERROR: 29 compilation errors.  No code generated.
 
 
 Shader version: 130
@@ -68,21 +71,21 @@
 0:21            4.000000
 0:24      move second child to first child ( temp float)
 0:24        direct index ( temp float)
-0:24          'gu' ( global implicitly-sized array of float)
+0:24          'gu' ( global runtime-sized array of float)
 0:24          Constant:
 0:24            2 (const int)
 0:24        Constant:
 0:24          4.000000
 0:26      move second child to first child ( temp float)
 0:26        direct index ( temp float)
-0:26          'gu' ( global implicitly-sized array of float)
+0:26          'gu' ( global runtime-sized array of float)
 0:26          Constant:
 0:26            3 (const int)
 0:26        Constant:
 0:26          3.000000
 0:27      move second child to first child ( temp float)
 0:27        indirect index ( temp float)
-0:27          'gu' ( global implicitly-sized array of float)
+0:27          'gu' ( global runtime-sized array of float)
 0:27          'a' ( uniform int)
 0:27        Constant:
 0:27          5.000000
@@ -91,7 +94,7 @@
 0:29        Function Call: foo(f1[5]; ( global 4-element array of float)
 0:29          'g5' ( global 5-element array of float)
 0:30      'g5' ( global 5-element array of float)
-0:31      'gu' ( global implicitly-sized array of float)
+0:31      'gu' ( global runtime-sized array of float)
 0:33      Constant:
 0:33        0.000000
 0:34      Function Call: bar(f1[5]; ( global void)
@@ -108,7 +111,7 @@
 0:36        true case
 0:37        move second child to first child ( temp float)
 0:37          direct index ( temp float)
-0:37            'gu' ( global implicitly-sized array of float)
+0:37            'gu' ( global runtime-sized array of float)
 0:37            Constant:
 0:37              0 (const int)
 0:37          Constant:
@@ -199,21 +202,21 @@
 0:?     Sequence
 0:71      move second child to first child ( temp int)
 0:71        direct index ( temp int)
-0:71          'uns' ( temp implicitly-sized array of int)
+0:71          'uns' ( temp unsized 4-element array of int)
 0:71          Constant:
 0:71            3 (const int)
 0:71        Constant:
 0:71          40 (const int)
 0:72      move second child to first child ( temp int)
 0:72        direct index ( temp int)
-0:72          'uns' ( temp implicitly-sized array of int)
+0:72          'uns' ( temp unsized 4-element array of int)
 0:72          Constant:
 0:72            1 (const int)
 0:72        Constant:
 0:72          30 (const int)
 0:73      move second child to first child ( temp 3-component vector of float)
 0:73        direct index ( temp 3-component vector of float)
-0:73          'guns' ( global implicitly-sized array of 3-component vector of float)
+0:73          'guns' ( global unsized 8-element array of 3-component vector of float)
 0:73          Constant:
 0:73            2 (const int)
 0:73        Constant:
@@ -222,11 +225,11 @@
 0:73          2.400000
 0:76      Constant:
 0:76        0.000000
-0:79  Function Definition: foo2( ( global implicitly-sized array of float)
+0:79  Function Definition: foo2( ( global unsized 1-element array of float)
 0:79    Function Parameters: 
 0:?     Sequence
 0:82      Branch: Return with expression
-0:82        'f' ( temp implicitly-sized array of float)
+0:82        'f' ( temp unsized 1-element array of float)
 0:84      Branch: Return with expression
 0:84        'g' ( temp 9-element array of float)
 0:89  Function Definition: foo3( ( global void)
@@ -264,17 +267,28 @@
 0:106      'b' ( global float)
 0:106      Constant:
 0:106        0.000000
+0:109  Function Definition: foo4( ( global void)
+0:109    Function Parameters: 
+0:111    Sequence
+0:111      indirect index ( temp sampler2D)
+0:111        's2d' ( uniform runtime-sized array of sampler2D)
+0:111        'a' ( uniform int)
+0:112      Sequence
+0:112        move second child to first child ( temp unsized 1-element array of float)
+0:112          'local' ( temp unsized 1-element array of float)
+0:112          'gUnusedUnsized' ( global unsized 1-element array of float)
 0:?   Linker Objects
-0:?     'gu' ( global implicitly-sized array of float)
+0:?     'gu' ( global runtime-sized array of float)
 0:?     'g4' ( global 4-element array of float)
 0:?     'g5' ( global 5-element array of float)
 0:?     'a' ( uniform int)
-0:?     'guns' ( global implicitly-sized array of 3-component vector of float)
+0:?     'guns' ( global unsized 8-element array of 3-component vector of float)
 0:?     'f' ( global float)
-0:?     'gUnusedUnsized' ( global implicitly-sized array of float)
-0:?     'i' ( global implicitly-sized array of int)
-0:?     'emptyA' ( global implicitly-sized array of float)
+0:?     'gUnusedUnsized' ( global unsized 1-element array of float)
+0:?     'i' ( global unsized 1-element array of int)
+0:?     'emptyA' ( global unsized 1-element array of float)
 0:?     'b' ( global float)
+0:?     's2d' ( uniform runtime-sized array of sampler2D)
 
 
 Linked fragment stage:
@@ -320,21 +334,21 @@
 0:21            4.000000
 0:24      move second child to first child ( temp float)
 0:24        direct index ( temp float)
-0:24          'gu' ( global 4-element array of float)
+0:24          'gu' ( global runtime-sized array of float)
 0:24          Constant:
 0:24            2 (const int)
 0:24        Constant:
 0:24          4.000000
 0:26      move second child to first child ( temp float)
 0:26        direct index ( temp float)
-0:26          'gu' ( global 4-element array of float)
+0:26          'gu' ( global runtime-sized array of float)
 0:26          Constant:
 0:26            3 (const int)
 0:26        Constant:
 0:26          3.000000
 0:27      move second child to first child ( temp float)
 0:27        indirect index ( temp float)
-0:27          'gu' ( global 4-element array of float)
+0:27          'gu' ( global runtime-sized array of float)
 0:27          'a' ( uniform int)
 0:27        Constant:
 0:27          5.000000
@@ -343,7 +357,7 @@
 0:29        Function Call: foo(f1[5]; ( global 4-element array of float)
 0:29          'g5' ( global 5-element array of float)
 0:30      'g5' ( global 5-element array of float)
-0:31      'gu' ( global 4-element array of float)
+0:31      'gu' ( global runtime-sized array of float)
 0:33      Constant:
 0:33        0.000000
 0:34      Function Call: bar(f1[5]; ( global void)
@@ -360,7 +374,7 @@
 0:36        true case
 0:37        move second child to first child ( temp float)
 0:37          direct index ( temp float)
-0:37            'gu' ( global 4-element array of float)
+0:37            'gu' ( global runtime-sized array of float)
 0:37            Constant:
 0:37              0 (const int)
 0:37          Constant:
@@ -452,7 +466,7 @@
 0:106      Constant:
 0:106        0.000000
 0:?   Linker Objects
-0:?     'gu' ( global 4-element array of float)
+0:?     'gu' ( global runtime-sized array of float)
 0:?     'g4' ( global 4-element array of float)
 0:?     'g5' ( global 5-element array of float)
 0:?     'a' ( uniform int)
@@ -462,4 +476,5 @@
 0:?     'i' ( global 1-element array of int)
 0:?     'emptyA' ( global 1-element array of float)
 0:?     'b' ( global float)
+0:?     's2d' ( uniform runtime-sized array of sampler2D)
 
diff --git a/Test/baseResults/array100.frag.out b/Test/baseResults/array100.frag.out
index b99d817..e6f9f8d 100644
--- a/Test/baseResults/array100.frag.out
+++ b/Test/baseResults/array100.frag.out
@@ -10,7 +10,7 @@
 ERROR: 0:25: 'array assignment' : not supported for this version or the enabled extensions 
 ERROR: 0:25: 'assign' :  cannot convert from ' global 4-element array of mediump float' to ' global 5-element array of mediump float'
 ERROR: 0:26: 'array assignment' : not supported for this version or the enabled extensions 
-ERROR: 0:26: 'assign' :  cannot convert from ' global 4-element array of mediump float' to ' global implicitly-sized array of mediump float'
+ERROR: 0:26: 'assign' :  cannot convert from ' global 4-element array of mediump float' to ' global unsized 1-element array of mediump float'
 ERROR: 0:28: 'foo' : no matching overloaded function found 
 ERROR: 0:31: 'arrayed constructor' : not supported for this version or the enabled extensions 
 ERROR: 0:31: 'array comparison' : not supported for this version or the enabled extensions 
@@ -67,7 +67,7 @@
 0:24        Function Call: foo(f1[5]; ( global 4-element array of mediump float)
 0:24          'g5' ( global 5-element array of mediump float)
 0:25      'g5' ( global 5-element array of mediump float)
-0:26      'gu' ( global implicitly-sized array of mediump float)
+0:26      'gu' ( global unsized 1-element array of mediump float)
 0:28      Constant:
 0:28        0.000000
 0:29      Function Call: bar(f1[5]; ( global void)
@@ -84,7 +84,7 @@
 0:31        true case
 0:32        move second child to first child ( temp mediump float)
 0:32          direct index ( temp mediump float)
-0:32            'gu' ( global implicitly-sized array of mediump float)
+0:32            'gu' ( global unsized 1-element array of mediump float)
 0:32            Constant:
 0:32              0 (const int)
 0:32          Constant:
@@ -152,7 +152,7 @@
 0:69          'initSb' ( temp structure{ global mediump 4-component vector of float v4,  global structure{ global mediump 3-component vector of float v3,  global 4-element array of mediump 2-component vector of float v2} sa})
 0:69          's1' ( temp structure{ global mediump 4-component vector of float v4,  global structure{ global mediump 3-component vector of float v3,  global 4-element array of mediump 2-component vector of float v2} sa})
 0:?   Linker Objects
-0:?     'gu' ( global implicitly-sized array of mediump float)
+0:?     'gu' ( global unsized 1-element array of mediump float)
 0:?     'g4' ( global 4-element array of mediump float)
 0:?     'g5' ( global 5-element array of mediump float)
 0:?     'a' ( uniform mediump int)
diff --git a/Test/baseResults/atomic_uint.frag.out b/Test/baseResults/atomic_uint.frag.out
index e0ba099..c705a06 100644
--- a/Test/baseResults/atomic_uint.frag.out
+++ b/Test/baseResults/atomic_uint.frag.out
@@ -1,9 +1,7 @@
 atomic_uint.frag
-Warning, version 420 is not yet complete; most version-specific features are present, but some are missing.
 ERROR: 0:10: 'atomic_uint' : samplers and atomic_uints cannot be output parameters 
 ERROR: 0:12: 'return' : type does not match, or is not convertible to, the function's return type 
 ERROR: 0:18: 'atomic_uint' : atomic_uints can only be used in uniform variables or function parameters: non_uniform_counter
-ERROR: 0:18: 'atomic_uint' : layout(binding=X) is required 
 ERROR: 0:23: 'binding' : atomic_uint binding is too large; see gl_MaxAtomicCounterBindings 
 ERROR: 0:28: '+' :  wrong operand types: no operation '+' exists that takes a left-hand operand of type 'layout( binding=0 offset=0) uniform atomic_uint' and a right operand of type 'layout( binding=0 offset=0) uniform atomic_uint' (or there is no acceptable conversion)
 ERROR: 0:29: '-' :  wrong operand type no operation '-' exists that takes an operand of type layout( binding=0 offset=0) uniform atomic_uint (or there is no acceptable conversion)
@@ -11,14 +9,10 @@
 ERROR: 0:34: 'assign' :  l-value required "counter" (can't modify a uniform)
 ERROR: 0:34: 'assign' :  cannot convert from ' const int' to 'layout( binding=0 offset=0) uniform atomic_uint'
 ERROR: 0:37: 'atomic_uint' : atomic_uints can only be used in uniform variables or function parameters: acin
-ERROR: 0:37: 'atomic_uint' : layout(binding=X) is required 
 ERROR: 0:38: 'atomic_uint' : atomic_uints can only be used in uniform variables or function parameters: acg
-ERROR: 0:38: 'atomic_uint' : layout(binding=X) is required 
-ERROR: 0:40: 'atomic_uint' : layout(binding=X) is required 
-ERROR: 0:46: 'atomic_uint' : layout(binding=X) is required 
 ERROR: 0:47: 'offset' : atomic counters sharing the same offset: 12
 ERROR: 0:48: 'binding' : atomic_uint binding is too large; see gl_MaxAtomicCounterBindings 
-ERROR: 18 compilation errors.  No code generated.
+ERROR: 13 compilation errors.  No code generated.
 
 
 Shader version: 420
diff --git a/Test/baseResults/badMacroArgs.frag.out b/Test/baseResults/badMacroArgs.frag.out
index 95937ce..5e6233f 100644
--- a/Test/baseResults/badMacroArgs.frag.out
+++ b/Test/baseResults/badMacroArgs.frag.out
@@ -1,5 +1,4 @@
 badMacroArgs.frag
-Warning, version 400 is not yet complete; most version-specific features are present, but some are missing.
 ERROR: 0:4: 'macro expansion' : Too few args in Macro m
 ERROR: 0:4: '' : compilation terminated 
 ERROR: 2 compilation errors.  No code generated.
diff --git a/Test/baseResults/comment.frag.out b/Test/baseResults/comment.frag.out
index 57f2a1d..b1a00ff 100644
--- a/Test/baseResults/comment.frag.out
+++ b/Test/baseResults/comment.frag.out
@@ -1,5 +1,4 @@
 comment.frag
-Warning, version 430 is not yet complete; most version-specific features are present, but some are missing.
 WARNING: 0:10: 'line continuation' : used at end of comment; the following line is still part of the comment 
 WARNING: 0:12: 'line continuation' : used at end of comment; the following line is still part of the comment 
 
diff --git a/Test/baseResults/compoundsuffix.frag.hlsl b/Test/baseResults/compoundsuffix.frag.hlsl
new file mode 100644
index 0000000..f47c97d
--- /dev/null
+++ b/Test/baseResults/compoundsuffix.frag.hlsl
@@ -0,0 +1,45 @@
+compoundsuffix.frag.hlsl

+// Module Version 10000

+// Generated by (magic number): 80007

+// Id's are bound by 22

+

+                              Capability Shader

+               1:             ExtInstImport  "GLSL.std.450"

+                              MemoryModel Logical GLSL450

+                              EntryPoint Fragment 4  "main" 20

+                              ExecutionMode 4 OriginUpperLeft

+                              Source HLSL 500

+                              Name 4  "main"

+                              Name 11  "@main(vf4;"

+                              Name 10  "fragColor"

+                              Name 15  "fragColor"

+                              Name 16  "param"

+                              Name 20  "fragColor"

+                              Decorate 20(fragColor) Location 0

+               2:             TypeVoid

+               3:             TypeFunction 2

+               6:             TypeFloat 32

+               7:             TypeVector 6(float) 4

+               8:             TypePointer Function 7(fvec4)

+               9:             TypeFunction 2 8(ptr)

+              13:    6(float) Constant 1065353216

+              14:    7(fvec4) ConstantComposite 13 13 13 13

+              19:             TypePointer Output 7(fvec4)

+   20(fragColor):     19(ptr) Variable Output

+         4(main):           2 Function None 3

+               5:             Label

+   15(fragColor):      8(ptr) Variable Function

+       16(param):      8(ptr) Variable Function

+              17:           2 FunctionCall 11(@main(vf4;) 16(param)

+              18:    7(fvec4) Load 16(param)

+                              Store 15(fragColor) 18

+              21:    7(fvec4) Load 15(fragColor)

+                              Store 20(fragColor) 21

+                              Return

+                              FunctionEnd

+  11(@main(vf4;):           2 Function None 9

+   10(fragColor):      8(ptr) FunctionParameter

+              12:             Label

+                              Store 10(fragColor) 14

+                              Return

+                              FunctionEnd

diff --git a/Test/baseResults/compoundsuffix.vert.glsl b/Test/baseResults/compoundsuffix.vert.glsl
new file mode 100644
index 0000000..58354a4
--- /dev/null
+++ b/Test/baseResults/compoundsuffix.vert.glsl
@@ -0,0 +1,15 @@
+compoundsuffix.vert.glsl

+Shader version: 100

+0:? Sequence

+0:1  Function Definition: main( ( global void)

+0:1    Function Parameters: 

+0:3    Sequence

+0:3      move second child to first child ( temp highp 4-component vector of float)

+0:3        'gl_Position' ( gl_Position highp 4-component vector of float Position)

+0:3        Constant:

+0:3          1.000000

+0:3          1.000000

+0:3          1.000000

+0:3          1.000000

+0:?   Linker Objects

+

diff --git a/Test/baseResults/constFold.frag.out b/Test/baseResults/constFold.frag.out
index 965c6db..2a48c42 100644
--- a/Test/baseResults/constFold.frag.out
+++ b/Test/baseResults/constFold.frag.out
@@ -1,5 +1,4 @@
 constFold.frag
-Warning, version 430 is not yet complete; most version-specific features are present, but some are missing.
 ERROR: 0:109: '[' :  index out of range '-1'
 ERROR: 0:110: '[' :  vector index out of range '4'
 ERROR: 0:111: '[' :  index out of range '-2'
@@ -180,6 +179,10 @@
 0:83        2147483647 (const int)
 0:84      Constant:
 0:84        +1.#INF
+0:84      Constant:
+0:84        -1.#INF
+0:84      Constant:
+0:84        1.#IND
 0:88      Constant:
 0:88        2 (const uint)
 0:88        3 (const uint)
diff --git a/Test/baseResults/constFoldIntMin.frag.out b/Test/baseResults/constFoldIntMin.frag.out
new file mode 100644
index 0000000..2c45ca8
--- /dev/null
+++ b/Test/baseResults/constFoldIntMin.frag.out
@@ -0,0 +1,51 @@
+constFoldIntMin.frag
+Shader version: 460
+Requested GL_AMD_gpu_shader_int16
+Requested GL_ARB_gpu_shader_int64
+0:? Sequence
+0:5  Function Definition: a( ( global void)
+0:5    Function Parameters: 
+0:6    Sequence
+0:6      Sequence
+0:6        move second child to first child ( temp int16_t)
+0:6          'u' ( temp int16_t)
+0:6          Constant:
+0:6            -32768 (const int16_t)
+0:7      Sequence
+0:7        move second child to first child ( temp int)
+0:7          'v' ( temp int)
+0:7          Constant:
+0:7            -2147483648 (const int)
+0:8      Sequence
+0:8        move second child to first child ( temp int64_t)
+0:8          'w' ( temp int64_t)
+0:8          Constant:
+0:8            -9223372036854775808 (const int64_t)
+0:9      Sequence
+0:9        move second child to first child ( temp int16_t)
+0:9          'x' ( temp int16_t)
+0:9          Constant:
+0:9            0 (const int8_t)
+0:10      Sequence
+0:10        move second child to first child ( temp int)
+0:10          'y' ( temp int)
+0:10          Constant:
+0:10            0 (const int)
+0:11      Sequence
+0:11        move second child to first child ( temp int64_t)
+0:11          'z' ( temp int64_t)
+0:11          Constant:
+0:11            0 (const int64_t)
+0:?   Linker Objects
+
+
+Linked fragment stage:
+
+ERROR: Linking fragment stage: Missing entry point: Each stage requires one entry point
+
+Shader version: 460
+Requested GL_AMD_gpu_shader_int16
+Requested GL_ARB_gpu_shader_int64
+0:? Sequence
+0:?   Linker Objects
+
diff --git a/Test/baseResults/constantUnaryConversion.comp.out b/Test/baseResults/constantUnaryConversion.comp.out
new file mode 100644
index 0000000..4117e93
--- /dev/null
+++ b/Test/baseResults/constantUnaryConversion.comp.out
@@ -0,0 +1,645 @@
+constantUnaryConversion.comp
+Shader version: 450
+Requested GL_EXT_shader_explicit_arithmetic_types
+local_size = (1, 1, 1)
+0:? Sequence
+0:48  Function Definition: main( ( global void)
+0:48    Function Parameters: 
+0:?   Linker Objects
+0:?     'bool_init' ( const bool)
+0:?       true (const bool)
+0:?     'int8_t_init' ( const int8_t)
+0:?       -1 (const int)
+0:?     'int16_t_init' ( const int16_t)
+0:?       -2 (const int)
+0:?     'int32_t_init' ( const int)
+0:?       -3 (const int)
+0:?     'int64_t_init' ( const int64_t)
+0:?       -4 (const int64_t)
+0:?     'uint8_t_init' ( const uint8_t)
+0:?       1 (const int)
+0:?     'uint16_t_init' ( const uint16_t)
+0:?       2 (const int)
+0:?     'uint32_t_init' ( const uint)
+0:?       3 (const uint)
+0:?     'uint64_t_init' ( const uint64_t)
+0:?       4 (const uint64_t)
+0:?     'float16_t_init' ( const float16_t)
+0:?       42.000000
+0:?     'float32_t_init' ( const float)
+0:?       13.000000
+0:?     'float64_t_init' ( const double)
+0:?       -4.000000
+0:?     'bool_to_bool' ( const bool)
+0:?       true (const bool)
+0:?     'int8_t_to_bool' ( const bool)
+0:?       -1 (const int)
+0:?     'int16_t_to_bool' ( const bool)
+0:?       -2 (const int)
+0:?     'int32_t_to_bool' ( const bool)
+0:?       true (const bool)
+0:?     'int64_t_to_bool' ( const bool)
+0:?       true (const bool)
+0:?     'uint8_t_to_bool' ( const bool)
+0:?       1 (const int)
+0:?     'uint16_t_to_bool' ( const bool)
+0:?       2 (const int)
+0:?     'uint32_t_to_bool' ( const bool)
+0:?       true (const bool)
+0:?     'uint64_t_to_bool' ( const bool)
+0:?       true (const bool)
+0:?     'float16_t_to_bool' ( const bool)
+0:?       true (const bool)
+0:?     'float32_t_to_bool' ( const bool)
+0:?       true (const bool)
+0:?     'float64_t_to_bool' ( const bool)
+0:?       true (const bool)
+0:?     'bool_to_int8_t' ( const int8_t)
+0:?       true (const bool)
+0:?     'int8_t_to_int8_t' ( const int8_t)
+0:?       -1 (const int)
+0:?     'int16_t_to_int8_t' ( const int8_t)
+0:?       -2 (const int)
+0:?     'int32_t_to_int8_t' ( const int8_t)
+0:?       -3 (const int)
+0:?     'int64_t_to_int8_t' ( const int8_t)
+0:?       -4 (const int64_t)
+0:?     'uint8_t_to_int8_t' ( const int8_t)
+0:?       1 (const int)
+0:?     'uint16_t_to_int8_t' ( const int8_t)
+0:?       2 (const int)
+0:?     'uint32_t_to_int8_t' ( const int8_t)
+0:?       3 (const uint)
+0:?     'uint64_t_to_int8_t' ( const int8_t)
+0:?       4 (const uint64_t)
+0:?     'float16_t_to_int8_t' ( const int8_t)
+0:?       42.000000
+0:?     'float32_t_to_int8_t' ( const int8_t)
+0:?       13.000000
+0:?     'float64_t_to_int8_t' ( const int8_t)
+0:?       -4.000000
+0:?     'bool_to_int16_t' ( const int16_t)
+0:?       true (const bool)
+0:?     'int8_t_to_int16_t' ( const int16_t)
+0:?       -1 (const int)
+0:?     'int16_t_to_int16_t' ( const int16_t)
+0:?       -2 (const int)
+0:?     'int32_t_to_int16_t' ( const int16_t)
+0:?       -3 (const int)
+0:?     'int64_t_to_int16_t' ( const int16_t)
+0:?       -4 (const int64_t)
+0:?     'uint8_t_to_int16_t' ( const int16_t)
+0:?       1 (const int)
+0:?     'uint16_t_to_int16_t' ( const int16_t)
+0:?       2 (const int)
+0:?     'uint32_t_to_int16_t' ( const int16_t)
+0:?       3 (const uint)
+0:?     'uint64_t_to_int16_t' ( const int16_t)
+0:?       4 (const uint64_t)
+0:?     'float16_t_to_int16_t' ( const int16_t)
+0:?       42.000000
+0:?     'float32_t_to_int16_t' ( const int16_t)
+0:?       13.000000
+0:?     'float64_t_to_int16_t' ( const int16_t)
+0:?       -4.000000
+0:?     'bool_to_int32_t' ( const int)
+0:?       1 (const int)
+0:?     'int8_t_to_int32_t' ( const int)
+0:?       -1 (const int)
+0:?     'int16_t_to_int32_t' ( const int)
+0:?       -2 (const int)
+0:?     'int32_t_to_int32_t' ( const int)
+0:?       -3 (const int)
+0:?     'int64_t_to_int32_t' ( const int)
+0:?       -4 (const int)
+0:?     'uint8_t_to_int32_t' ( const int)
+0:?       1 (const int)
+0:?     'uint16_t_to_int32_t' ( const int)
+0:?       2 (const int)
+0:?     'uint32_t_to_int32_t' ( const int)
+0:?       3 (const int)
+0:?     'uint64_t_to_int32_t' ( const int)
+0:?       4 (const int)
+0:?     'float16_t_to_int32_t' ( const int)
+0:?       42 (const int)
+0:?     'float32_t_to_int32_t' ( const int)
+0:?       13 (const int)
+0:?     'float64_t_to_int32_t' ( const int)
+0:?       -4 (const int)
+0:?     'bool_to_int64_t' ( const int64_t)
+0:?       1 (const int64_t)
+0:?     'int8_t_to_int64_t' ( const int64_t)
+0:?       -1 (const int)
+0:?     'int16_t_to_int64_t' ( const int64_t)
+0:?       -2 (const int)
+0:?     'int32_t_to_int64_t' ( const int64_t)
+0:?       -3 (const int64_t)
+0:?     'int64_t_to_int64_t' ( const int64_t)
+0:?       -4 (const int64_t)
+0:?     'uint8_t_to_int64_t' ( const int64_t)
+0:?       1 (const int)
+0:?     'uint16_t_to_int64_t' ( const int64_t)
+0:?       2 (const int)
+0:?     'uint32_t_to_int64_t' ( const int64_t)
+0:?       3 (const int64_t)
+0:?     'uint64_t_to_int64_t' ( const int64_t)
+0:?       4 (const int64_t)
+0:?     'float16_t_to_int64_t' ( const int64_t)
+0:?       42 (const int64_t)
+0:?     'float32_t_to_int64_t' ( const int64_t)
+0:?       13 (const int64_t)
+0:?     'float64_t_to_int64_t' ( const int64_t)
+0:?       -4 (const int64_t)
+0:?     'bool_to_uint8_t' ( const uint8_t)
+0:?       true (const bool)
+0:?     'int8_t_to_uint8_t' ( const uint8_t)
+0:?       -1 (const int)
+0:?     'int16_t_to_uint8_t' ( const uint8_t)
+0:?       -2 (const int)
+0:?     'int32_t_to_uint8_t' ( const uint8_t)
+0:?       -3 (const int)
+0:?     'int64_t_to_uint8_t' ( const uint8_t)
+0:?       -4 (const int64_t)
+0:?     'uint8_t_to_uint8_t' ( const uint8_t)
+0:?       1 (const int)
+0:?     'uint16_t_to_uint8_t' ( const uint8_t)
+0:?       2 (const int)
+0:?     'uint32_t_to_uint8_t' ( const uint8_t)
+0:?       3 (const uint)
+0:?     'uint64_t_to_uint8_t' ( const uint8_t)
+0:?       4 (const uint64_t)
+0:?     'float16_t_to_uint8_t' ( const uint8_t)
+0:?       42.000000
+0:?     'float32_t_to_uint8_t' ( const uint8_t)
+0:?       13.000000
+0:?     'float64_t_to_uint8_t' ( const uint8_t)
+0:?       -4.000000
+0:?     'bool_to_uint16_t' ( const uint16_t)
+0:?       true (const bool)
+0:?     'int8_t_to_uint16_t' ( const uint16_t)
+0:?       -1 (const int)
+0:?     'int16_t_to_uint16_t' ( const uint16_t)
+0:?       -2 (const int)
+0:?     'int32_t_to_uint16_t' ( const uint16_t)
+0:?       -3 (const int)
+0:?     'int64_t_to_uint16_t' ( const uint16_t)
+0:?       -4 (const int64_t)
+0:?     'uint8_t_to_uint16_t' ( const uint16_t)
+0:?       1 (const int)
+0:?     'uint16_t_to_uint16_t' ( const uint16_t)
+0:?       2 (const int)
+0:?     'uint32_t_to_uint16_t' ( const uint16_t)
+0:?       3 (const uint)
+0:?     'uint64_t_to_uint16_t' ( const uint16_t)
+0:?       4 (const uint64_t)
+0:?     'float16_t_to_uint16_t' ( const uint16_t)
+0:?       42.000000
+0:?     'float32_t_to_uint16_t' ( const uint16_t)
+0:?       13.000000
+0:?     'float64_t_to_uint16_t' ( const uint16_t)
+0:?       -4.000000
+0:?     'bool_to_uint32_t' ( const uint)
+0:?       1 (const uint)
+0:?     'int8_t_to_uint32_t' ( const uint)
+0:?       -1 (const int)
+0:?     'int16_t_to_uint32_t' ( const uint)
+0:?       -2 (const int)
+0:?     'int32_t_to_uint32_t' ( const uint)
+0:?       4294967293 (const uint)
+0:?     'int64_t_to_uint32_t' ( const uint)
+0:?       4294967292 (const uint)
+0:?     'uint8_t_to_uint32_t' ( const uint)
+0:?       1 (const int)
+0:?     'uint16_t_to_uint32_t' ( const uint)
+0:?       2 (const int)
+0:?     'uint32_t_to_uint32_t' ( const uint)
+0:?       3 (const uint)
+0:?     'uint64_t_to_uint32_t' ( const uint)
+0:?       4 (const uint)
+0:?     'float16_t_to_uint32_t' ( const uint)
+0:?       42 (const uint)
+0:?     'float32_t_to_uint32_t' ( const uint)
+0:?       13 (const uint)
+0:?     'float64_t_to_uint32_t' ( const uint)
+0:?       4294967292 (const uint)
+0:?     'bool_to_uint64_t' ( const uint64_t)
+0:?       1 (const uint64_t)
+0:?     'int8_t_to_uint64_t' ( const uint64_t)
+0:?       -1 (const int)
+0:?     'int16_t_to_uint64_t' ( const uint64_t)
+0:?       -2 (const int)
+0:?     'int32_t_to_uint64_t' ( const uint64_t)
+0:?       18446744073709551613 (const uint64_t)
+0:?     'int64_t_to_uint64_t' ( const uint64_t)
+0:?       18446744073709551612 (const uint64_t)
+0:?     'uint8_t_to_uint64_t' ( const uint64_t)
+0:?       1 (const int)
+0:?     'uint16_t_to_uint64_t' ( const uint64_t)
+0:?       2 (const int)
+0:?     'uint32_t_to_uint64_t' ( const uint64_t)
+0:?       3 (const uint64_t)
+0:?     'uint64_t_to_uint64_t' ( const uint64_t)
+0:?       4 (const uint64_t)
+0:?     'float16_t_to_uint64_t' ( const uint64_t)
+0:?       42 (const uint64_t)
+0:?     'float32_t_to_uint64_t' ( const uint64_t)
+0:?       13 (const uint64_t)
+0:?     'float64_t_to_uint64_t' ( const uint64_t)
+0:?       18446744073709551612 (const uint64_t)
+0:?     'bool_to_float16_t' ( const float16_t)
+0:?       1.000000
+0:?     'int8_t_to_float16_t' ( const float16_t)
+0:?       -1 (const int)
+0:?     'int16_t_to_float16_t' ( const float16_t)
+0:?       -2 (const int)
+0:?     'int32_t_to_float16_t' ( const float16_t)
+0:?       -3.000000
+0:?     'int64_t_to_float16_t' ( const float16_t)
+0:?       -4.000000
+0:?     'uint8_t_to_float16_t' ( const float16_t)
+0:?       1 (const int)
+0:?     'uint16_t_to_float16_t' ( const float16_t)
+0:?       2 (const int)
+0:?     'uint32_t_to_float16_t' ( const float16_t)
+0:?       3.000000
+0:?     'uint64_t_to_float16_t' ( const float16_t)
+0:?       4.000000
+0:?     'float16_t_to_float16_t' ( const float16_t)
+0:?       42.000000
+0:?     'float32_t_to_float16_t' ( const float16_t)
+0:?       13.000000
+0:?     'float64_t_to_float16_t' ( const float16_t)
+0:?       -4.000000
+0:?     'bool_to_float32_t' ( const float)
+0:?       1.000000
+0:?     'int8_t_to_float32_t' ( const float)
+0:?       -1 (const int)
+0:?     'int16_t_to_float32_t' ( const float)
+0:?       -2 (const int)
+0:?     'int32_t_to_float32_t' ( const float)
+0:?       -3.000000
+0:?     'int64_t_to_float32_t' ( const float)
+0:?       -4.000000
+0:?     'uint8_t_to_float32_t' ( const float)
+0:?       1 (const int)
+0:?     'uint16_t_to_float32_t' ( const float)
+0:?       2 (const int)
+0:?     'uint32_t_to_float32_t' ( const float)
+0:?       3.000000
+0:?     'uint64_t_to_float32_t' ( const float)
+0:?       4.000000
+0:?     'float16_t_to_float32_t' ( const float)
+0:?       42.000000
+0:?     'float32_t_to_float32_t' ( const float)
+0:?       13.000000
+0:?     'float64_t_to_float32_t' ( const float)
+0:?       -4.000000
+0:?     'bool_to_float64_t' ( const double)
+0:?       1.000000
+0:?     'int8_t_to_float64_t' ( const double)
+0:?       -1 (const int)
+0:?     'int16_t_to_float64_t' ( const double)
+0:?       -2 (const int)
+0:?     'int32_t_to_float64_t' ( const double)
+0:?       -3.000000
+0:?     'int64_t_to_float64_t' ( const double)
+0:?       -4.000000
+0:?     'uint8_t_to_float64_t' ( const double)
+0:?       1 (const int)
+0:?     'uint16_t_to_float64_t' ( const double)
+0:?       2 (const int)
+0:?     'uint32_t_to_float64_t' ( const double)
+0:?       3.000000
+0:?     'uint64_t_to_float64_t' ( const double)
+0:?       4.000000
+0:?     'float16_t_to_float64_t' ( const double)
+0:?       42.000000
+0:?     'float32_t_to_float64_t' ( const double)
+0:?       13.000000
+0:?     'float64_t_to_float64_t' ( const double)
+0:?       -4.000000
+
+
+Linked compute stage:
+
+
+Shader version: 450
+Requested GL_EXT_shader_explicit_arithmetic_types
+local_size = (1, 1, 1)
+0:? Sequence
+0:48  Function Definition: main( ( global void)
+0:48    Function Parameters: 
+0:?   Linker Objects
+0:?     'bool_init' ( const bool)
+0:?       true (const bool)
+0:?     'int8_t_init' ( const int8_t)
+0:?       -1 (const int)
+0:?     'int16_t_init' ( const int16_t)
+0:?       -2 (const int)
+0:?     'int32_t_init' ( const int)
+0:?       -3 (const int)
+0:?     'int64_t_init' ( const int64_t)
+0:?       -4 (const int64_t)
+0:?     'uint8_t_init' ( const uint8_t)
+0:?       1 (const int)
+0:?     'uint16_t_init' ( const uint16_t)
+0:?       2 (const int)
+0:?     'uint32_t_init' ( const uint)
+0:?       3 (const uint)
+0:?     'uint64_t_init' ( const uint64_t)
+0:?       4 (const uint64_t)
+0:?     'float16_t_init' ( const float16_t)
+0:?       42.000000
+0:?     'float32_t_init' ( const float)
+0:?       13.000000
+0:?     'float64_t_init' ( const double)
+0:?       -4.000000
+0:?     'bool_to_bool' ( const bool)
+0:?       true (const bool)
+0:?     'int8_t_to_bool' ( const bool)
+0:?       -1 (const int)
+0:?     'int16_t_to_bool' ( const bool)
+0:?       -2 (const int)
+0:?     'int32_t_to_bool' ( const bool)
+0:?       true (const bool)
+0:?     'int64_t_to_bool' ( const bool)
+0:?       true (const bool)
+0:?     'uint8_t_to_bool' ( const bool)
+0:?       1 (const int)
+0:?     'uint16_t_to_bool' ( const bool)
+0:?       2 (const int)
+0:?     'uint32_t_to_bool' ( const bool)
+0:?       true (const bool)
+0:?     'uint64_t_to_bool' ( const bool)
+0:?       true (const bool)
+0:?     'float16_t_to_bool' ( const bool)
+0:?       true (const bool)
+0:?     'float32_t_to_bool' ( const bool)
+0:?       true (const bool)
+0:?     'float64_t_to_bool' ( const bool)
+0:?       true (const bool)
+0:?     'bool_to_int8_t' ( const int8_t)
+0:?       true (const bool)
+0:?     'int8_t_to_int8_t' ( const int8_t)
+0:?       -1 (const int)
+0:?     'int16_t_to_int8_t' ( const int8_t)
+0:?       -2 (const int)
+0:?     'int32_t_to_int8_t' ( const int8_t)
+0:?       -3 (const int)
+0:?     'int64_t_to_int8_t' ( const int8_t)
+0:?       -4 (const int64_t)
+0:?     'uint8_t_to_int8_t' ( const int8_t)
+0:?       1 (const int)
+0:?     'uint16_t_to_int8_t' ( const int8_t)
+0:?       2 (const int)
+0:?     'uint32_t_to_int8_t' ( const int8_t)
+0:?       3 (const uint)
+0:?     'uint64_t_to_int8_t' ( const int8_t)
+0:?       4 (const uint64_t)
+0:?     'float16_t_to_int8_t' ( const int8_t)
+0:?       42.000000
+0:?     'float32_t_to_int8_t' ( const int8_t)
+0:?       13.000000
+0:?     'float64_t_to_int8_t' ( const int8_t)
+0:?       -4.000000
+0:?     'bool_to_int16_t' ( const int16_t)
+0:?       true (const bool)
+0:?     'int8_t_to_int16_t' ( const int16_t)
+0:?       -1 (const int)
+0:?     'int16_t_to_int16_t' ( const int16_t)
+0:?       -2 (const int)
+0:?     'int32_t_to_int16_t' ( const int16_t)
+0:?       -3 (const int)
+0:?     'int64_t_to_int16_t' ( const int16_t)
+0:?       -4 (const int64_t)
+0:?     'uint8_t_to_int16_t' ( const int16_t)
+0:?       1 (const int)
+0:?     'uint16_t_to_int16_t' ( const int16_t)
+0:?       2 (const int)
+0:?     'uint32_t_to_int16_t' ( const int16_t)
+0:?       3 (const uint)
+0:?     'uint64_t_to_int16_t' ( const int16_t)
+0:?       4 (const uint64_t)
+0:?     'float16_t_to_int16_t' ( const int16_t)
+0:?       42.000000
+0:?     'float32_t_to_int16_t' ( const int16_t)
+0:?       13.000000
+0:?     'float64_t_to_int16_t' ( const int16_t)
+0:?       -4.000000
+0:?     'bool_to_int32_t' ( const int)
+0:?       1 (const int)
+0:?     'int8_t_to_int32_t' ( const int)
+0:?       -1 (const int)
+0:?     'int16_t_to_int32_t' ( const int)
+0:?       -2 (const int)
+0:?     'int32_t_to_int32_t' ( const int)
+0:?       -3 (const int)
+0:?     'int64_t_to_int32_t' ( const int)
+0:?       -4 (const int)
+0:?     'uint8_t_to_int32_t' ( const int)
+0:?       1 (const int)
+0:?     'uint16_t_to_int32_t' ( const int)
+0:?       2 (const int)
+0:?     'uint32_t_to_int32_t' ( const int)
+0:?       3 (const int)
+0:?     'uint64_t_to_int32_t' ( const int)
+0:?       4 (const int)
+0:?     'float16_t_to_int32_t' ( const int)
+0:?       42 (const int)
+0:?     'float32_t_to_int32_t' ( const int)
+0:?       13 (const int)
+0:?     'float64_t_to_int32_t' ( const int)
+0:?       -4 (const int)
+0:?     'bool_to_int64_t' ( const int64_t)
+0:?       1 (const int64_t)
+0:?     'int8_t_to_int64_t' ( const int64_t)
+0:?       -1 (const int)
+0:?     'int16_t_to_int64_t' ( const int64_t)
+0:?       -2 (const int)
+0:?     'int32_t_to_int64_t' ( const int64_t)
+0:?       -3 (const int64_t)
+0:?     'int64_t_to_int64_t' ( const int64_t)
+0:?       -4 (const int64_t)
+0:?     'uint8_t_to_int64_t' ( const int64_t)
+0:?       1 (const int)
+0:?     'uint16_t_to_int64_t' ( const int64_t)
+0:?       2 (const int)
+0:?     'uint32_t_to_int64_t' ( const int64_t)
+0:?       3 (const int64_t)
+0:?     'uint64_t_to_int64_t' ( const int64_t)
+0:?       4 (const int64_t)
+0:?     'float16_t_to_int64_t' ( const int64_t)
+0:?       42 (const int64_t)
+0:?     'float32_t_to_int64_t' ( const int64_t)
+0:?       13 (const int64_t)
+0:?     'float64_t_to_int64_t' ( const int64_t)
+0:?       -4 (const int64_t)
+0:?     'bool_to_uint8_t' ( const uint8_t)
+0:?       true (const bool)
+0:?     'int8_t_to_uint8_t' ( const uint8_t)
+0:?       -1 (const int)
+0:?     'int16_t_to_uint8_t' ( const uint8_t)
+0:?       -2 (const int)
+0:?     'int32_t_to_uint8_t' ( const uint8_t)
+0:?       -3 (const int)
+0:?     'int64_t_to_uint8_t' ( const uint8_t)
+0:?       -4 (const int64_t)
+0:?     'uint8_t_to_uint8_t' ( const uint8_t)
+0:?       1 (const int)
+0:?     'uint16_t_to_uint8_t' ( const uint8_t)
+0:?       2 (const int)
+0:?     'uint32_t_to_uint8_t' ( const uint8_t)
+0:?       3 (const uint)
+0:?     'uint64_t_to_uint8_t' ( const uint8_t)
+0:?       4 (const uint64_t)
+0:?     'float16_t_to_uint8_t' ( const uint8_t)
+0:?       42.000000
+0:?     'float32_t_to_uint8_t' ( const uint8_t)
+0:?       13.000000
+0:?     'float64_t_to_uint8_t' ( const uint8_t)
+0:?       -4.000000
+0:?     'bool_to_uint16_t' ( const uint16_t)
+0:?       true (const bool)
+0:?     'int8_t_to_uint16_t' ( const uint16_t)
+0:?       -1 (const int)
+0:?     'int16_t_to_uint16_t' ( const uint16_t)
+0:?       -2 (const int)
+0:?     'int32_t_to_uint16_t' ( const uint16_t)
+0:?       -3 (const int)
+0:?     'int64_t_to_uint16_t' ( const uint16_t)
+0:?       -4 (const int64_t)
+0:?     'uint8_t_to_uint16_t' ( const uint16_t)
+0:?       1 (const int)
+0:?     'uint16_t_to_uint16_t' ( const uint16_t)
+0:?       2 (const int)
+0:?     'uint32_t_to_uint16_t' ( const uint16_t)
+0:?       3 (const uint)
+0:?     'uint64_t_to_uint16_t' ( const uint16_t)
+0:?       4 (const uint64_t)
+0:?     'float16_t_to_uint16_t' ( const uint16_t)
+0:?       42.000000
+0:?     'float32_t_to_uint16_t' ( const uint16_t)
+0:?       13.000000
+0:?     'float64_t_to_uint16_t' ( const uint16_t)
+0:?       -4.000000
+0:?     'bool_to_uint32_t' ( const uint)
+0:?       1 (const uint)
+0:?     'int8_t_to_uint32_t' ( const uint)
+0:?       -1 (const int)
+0:?     'int16_t_to_uint32_t' ( const uint)
+0:?       -2 (const int)
+0:?     'int32_t_to_uint32_t' ( const uint)
+0:?       4294967293 (const uint)
+0:?     'int64_t_to_uint32_t' ( const uint)
+0:?       4294967292 (const uint)
+0:?     'uint8_t_to_uint32_t' ( const uint)
+0:?       1 (const int)
+0:?     'uint16_t_to_uint32_t' ( const uint)
+0:?       2 (const int)
+0:?     'uint32_t_to_uint32_t' ( const uint)
+0:?       3 (const uint)
+0:?     'uint64_t_to_uint32_t' ( const uint)
+0:?       4 (const uint)
+0:?     'float16_t_to_uint32_t' ( const uint)
+0:?       42 (const uint)
+0:?     'float32_t_to_uint32_t' ( const uint)
+0:?       13 (const uint)
+0:?     'float64_t_to_uint32_t' ( const uint)
+0:?       4294967292 (const uint)
+0:?     'bool_to_uint64_t' ( const uint64_t)
+0:?       1 (const uint64_t)
+0:?     'int8_t_to_uint64_t' ( const uint64_t)
+0:?       -1 (const int)
+0:?     'int16_t_to_uint64_t' ( const uint64_t)
+0:?       -2 (const int)
+0:?     'int32_t_to_uint64_t' ( const uint64_t)
+0:?       18446744073709551613 (const uint64_t)
+0:?     'int64_t_to_uint64_t' ( const uint64_t)
+0:?       18446744073709551612 (const uint64_t)
+0:?     'uint8_t_to_uint64_t' ( const uint64_t)
+0:?       1 (const int)
+0:?     'uint16_t_to_uint64_t' ( const uint64_t)
+0:?       2 (const int)
+0:?     'uint32_t_to_uint64_t' ( const uint64_t)
+0:?       3 (const uint64_t)
+0:?     'uint64_t_to_uint64_t' ( const uint64_t)
+0:?       4 (const uint64_t)
+0:?     'float16_t_to_uint64_t' ( const uint64_t)
+0:?       42 (const uint64_t)
+0:?     'float32_t_to_uint64_t' ( const uint64_t)
+0:?       13 (const uint64_t)
+0:?     'float64_t_to_uint64_t' ( const uint64_t)
+0:?       18446744073709551612 (const uint64_t)
+0:?     'bool_to_float16_t' ( const float16_t)
+0:?       1.000000
+0:?     'int8_t_to_float16_t' ( const float16_t)
+0:?       -1 (const int)
+0:?     'int16_t_to_float16_t' ( const float16_t)
+0:?       -2 (const int)
+0:?     'int32_t_to_float16_t' ( const float16_t)
+0:?       -3.000000
+0:?     'int64_t_to_float16_t' ( const float16_t)
+0:?       -4.000000
+0:?     'uint8_t_to_float16_t' ( const float16_t)
+0:?       1 (const int)
+0:?     'uint16_t_to_float16_t' ( const float16_t)
+0:?       2 (const int)
+0:?     'uint32_t_to_float16_t' ( const float16_t)
+0:?       3.000000
+0:?     'uint64_t_to_float16_t' ( const float16_t)
+0:?       4.000000
+0:?     'float16_t_to_float16_t' ( const float16_t)
+0:?       42.000000
+0:?     'float32_t_to_float16_t' ( const float16_t)
+0:?       13.000000
+0:?     'float64_t_to_float16_t' ( const float16_t)
+0:?       -4.000000
+0:?     'bool_to_float32_t' ( const float)
+0:?       1.000000
+0:?     'int8_t_to_float32_t' ( const float)
+0:?       -1 (const int)
+0:?     'int16_t_to_float32_t' ( const float)
+0:?       -2 (const int)
+0:?     'int32_t_to_float32_t' ( const float)
+0:?       -3.000000
+0:?     'int64_t_to_float32_t' ( const float)
+0:?       -4.000000
+0:?     'uint8_t_to_float32_t' ( const float)
+0:?       1 (const int)
+0:?     'uint16_t_to_float32_t' ( const float)
+0:?       2 (const int)
+0:?     'uint32_t_to_float32_t' ( const float)
+0:?       3.000000
+0:?     'uint64_t_to_float32_t' ( const float)
+0:?       4.000000
+0:?     'float16_t_to_float32_t' ( const float)
+0:?       42.000000
+0:?     'float32_t_to_float32_t' ( const float)
+0:?       13.000000
+0:?     'float64_t_to_float32_t' ( const float)
+0:?       -4.000000
+0:?     'bool_to_float64_t' ( const double)
+0:?       1.000000
+0:?     'int8_t_to_float64_t' ( const double)
+0:?       -1 (const int)
+0:?     'int16_t_to_float64_t' ( const double)
+0:?       -2 (const int)
+0:?     'int32_t_to_float64_t' ( const double)
+0:?       -3.000000
+0:?     'int64_t_to_float64_t' ( const double)
+0:?       -4.000000
+0:?     'uint8_t_to_float64_t' ( const double)
+0:?       1 (const int)
+0:?     'uint16_t_to_float64_t' ( const double)
+0:?       2 (const int)
+0:?     'uint32_t_to_float64_t' ( const double)
+0:?       3.000000
+0:?     'uint64_t_to_float64_t' ( const double)
+0:?       4.000000
+0:?     'float16_t_to_float64_t' ( const double)
+0:?       42.000000
+0:?     'float32_t_to_float64_t' ( const double)
+0:?       13.000000
+0:?     'float64_t_to_float64_t' ( const double)
+0:?       -4.000000
+
diff --git a/Test/baseResults/cppBad.vert.out b/Test/baseResults/cppBad.vert.out
old mode 100755
new mode 100644
index 205c29b..a5267ff
--- a/Test/baseResults/cppBad.vert.out
+++ b/Test/baseResults/cppBad.vert.out
@@ -2,15 +2,15 @@
 ERROR: 0:2: 'preprocessor evaluation' : bad expression 
 ERROR: 0:2: '#if' : unexpected tokens following directive 
 ERROR: 0:5: 'string' : End of line in string 
-ERROR: 0:5: 'macro expansion' : expected '(' following n
 ERROR: 0:5: '""' : string literals not supported 
 ERROR: 0:5: '' :  syntax error, unexpected INT, expecting COMMA or SEMICOLON
-ERROR: 6 compilation errors.  No code generated.
+ERROR: 5 compilation errors.  No code generated.
 
 
 Shader version: 100
 ERROR: node is still EOpNull!
 0:?   Linker Objects
+0:?     'n' ( global highp int)
 
 
 Linked vertex stage:
@@ -20,4 +20,5 @@
 Shader version: 100
 ERROR: node is still EOpNull!
 0:?   Linker Objects
+0:?     'n' ( global highp int)
 
diff --git a/Test/baseResults/cppBad2.vert.out b/Test/baseResults/cppBad2.vert.out
old mode 100755
new mode 100644
index 0398e5e..af9ff38
--- a/Test/baseResults/cppBad2.vert.out
+++ b/Test/baseResults/cppBad2.vert.out
@@ -1,7 +1,6 @@
 cppBad2.vert
 ERROR: 0:3: 'macro expansion' : End of input in macro b
-ERROR: 0:3: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
+ERROR: 1 compilation errors.  No code generated.
 
 
 Shader version: 100
diff --git a/Test/baseResults/cppDeepNest.frag.out b/Test/baseResults/cppDeepNest.frag.out
new file mode 100644
index 0000000..969a256
--- /dev/null
+++ b/Test/baseResults/cppDeepNest.frag.out
@@ -0,0 +1,20 @@
+cppDeepNest.frag
+ERROR: 0:66: '#if/#ifdef/#ifndef' : maximum nesting depth exceeded 
+ERROR: 0:66: '' : missing #endif 
+ERROR: 0:66: '' :  syntax error, unexpected $end
+ERROR: 3 compilation errors.  No code generated.
+
+
+Shader version: 100
+ERROR: node is still EOpNull!
+0:?   Linker Objects
+
+
+Linked fragment stage:
+
+ERROR: Linking fragment stage: Missing entry point: Each stage requires one entry point
+
+Shader version: 100
+ERROR: node is still EOpNull!
+0:?   Linker Objects
+
diff --git a/Test/baseResults/cppIntMinOverNegativeOne.frag.out b/Test/baseResults/cppIntMinOverNegativeOne.frag.out
new file mode 100644
index 0000000..5dce7c3
--- /dev/null
+++ b/Test/baseResults/cppIntMinOverNegativeOne.frag.out
@@ -0,0 +1,14 @@
+cppIntMinOverNegativeOne.frag
+Shader version: 100
+0:? Sequence
+0:?   Linker Objects
+
+
+Linked fragment stage:
+
+ERROR: Linking fragment stage: Missing entry point: Each stage requires one entry point
+
+Shader version: 100
+0:? Sequence
+0:?   Linker Objects
+
diff --git a/Test/baseResults/cppPassMacroName.frag.out b/Test/baseResults/cppPassMacroName.frag.out
new file mode 100644
index 0000000..e09b00d
--- /dev/null
+++ b/Test/baseResults/cppPassMacroName.frag.out
@@ -0,0 +1,77 @@
+cppPassMacroName.frag
+Shader version: 100
+0:? Sequence
+0:9  Function Definition: main( ( global void)
+0:9    Function Parameters: 
+0:11    Sequence
+0:11      Sequence
+0:11        move second child to first child ( temp mediump int)
+0:11          'f1' ( temp mediump int)
+0:11          Constant:
+0:11            4 (const int)
+0:12      Sequence
+0:12        move second child to first child ( temp mediump int)
+0:12          'f2' ( temp mediump int)
+0:12          'f1' ( temp mediump int)
+0:13      Sequence
+0:13        move second child to first child ( temp mediump int)
+0:13          'f3' ( temp mediump int)
+0:13          Constant:
+0:13            9 (const int)
+0:14      Sequence
+0:14        move second child to first child ( temp mediump int)
+0:14          'f4' ( temp mediump int)
+0:14          Constant:
+0:14            1 (const int)
+0:15      Sequence
+0:15        move second child to first child ( temp mediump int)
+0:15          'f5' ( temp mediump int)
+0:15          Constant:
+0:15            5 (const int)
+0:17      Sequence
+0:17        move second child to first child ( temp highp float)
+0:17          'fl_f5' ( temp highp float)
+0:17          Constant:
+0:17            0.460000
+0:?   Linker Objects
+
+
+Linked fragment stage:
+
+
+Shader version: 100
+0:? Sequence
+0:9  Function Definition: main( ( global void)
+0:9    Function Parameters: 
+0:11    Sequence
+0:11      Sequence
+0:11        move second child to first child ( temp mediump int)
+0:11          'f1' ( temp mediump int)
+0:11          Constant:
+0:11            4 (const int)
+0:12      Sequence
+0:12        move second child to first child ( temp mediump int)
+0:12          'f2' ( temp mediump int)
+0:12          'f1' ( temp mediump int)
+0:13      Sequence
+0:13        move second child to first child ( temp mediump int)
+0:13          'f3' ( temp mediump int)
+0:13          Constant:
+0:13            9 (const int)
+0:14      Sequence
+0:14        move second child to first child ( temp mediump int)
+0:14          'f4' ( temp mediump int)
+0:14          Constant:
+0:14            1 (const int)
+0:15      Sequence
+0:15        move second child to first child ( temp mediump int)
+0:15          'f5' ( temp mediump int)
+0:15          Constant:
+0:15            5 (const int)
+0:17      Sequence
+0:17        move second child to first child ( temp highp float)
+0:17          'fl_f5' ( temp highp float)
+0:17          Constant:
+0:17            0.460000
+0:?   Linker Objects
+
diff --git a/Test/baseResults/cppRelaxSkipTokensErrors.vert.out b/Test/baseResults/cppRelaxSkipTokensErrors.vert.out
new file mode 100644
index 0000000..e9b4b1b
--- /dev/null
+++ b/Test/baseResults/cppRelaxSkipTokensErrors.vert.out
@@ -0,0 +1,14 @@
+cppRelaxSkipTokensErrors.vert
+Shader version: 110
+0:? Sequence
+0:?   Linker Objects
+
+
+Linked vertex stage:
+
+ERROR: Linking vertex stage: Missing entry point: Each stage requires one entry point
+
+Shader version: 110
+0:? Sequence
+0:?   Linker Objects
+
diff --git a/Test/baseResults/cppSimple.vert.out b/Test/baseResults/cppSimple.vert.out
index 0696c74..85beb4e 100644
--- a/Test/baseResults/cppSimple.vert.out
+++ b/Test/baseResults/cppSimple.vert.out
@@ -1,5 +1,4 @@
 cppSimple.vert
-Warning, version 400 is not yet complete; most version-specific features are present, but some are missing.
 ERROR: 0:77: '#error' : good1  
 ERROR: 0:81: '#error' : good2  
 ERROR: 0:85: '#error' : good3  
@@ -36,9 +35,9 @@
 ERROR: 0:158: '#else' : #else after #else 
 ERROR: 0:160: '#endif' : unexpected tokens following directive 
 ERROR: 0:164: '#define' : duplicate macro parameter 
-ERROR: 0:173: '#define' : Macro redefined; different number of arguments: m4
-ERROR: 0:178: '#define' : Macro redefined; different number of arguments: m5
-ERROR: 0:182: '#define' : Macro redefined; different number of arguments: m6
+ERROR: 0:173: '#define' : Macro redefined; function-like versus object-like: m4
+ERROR: 0:177: '#define' : Macro redefined; function-like versus object-like: m5
+ERROR: 0:181: '#define' : Macro redefined; different number of arguments: m6
 ERROR: 0:185: '#define' : Macro redefined; different substitutions: m7
 ERROR: 0:192: '#define' : Macro redefined; different substitutions: m8
 ERROR: 0:196: '#define' : Macro redefined; different argument names: m9
@@ -76,11 +75,9 @@
 ERROR: 12:20055: '#error' : good evaluation 2  
 ERROR: 12:9000: 'preprocessor evaluation' : expected ')' 
 ERROR: 12:9002: '#if' : unexpected tokens following directive 
-ERROR: 12:9014: 'macro expansion' : expected '(' following FOOOM
 ERROR: 12:9014: 'FOOOM' : undeclared identifier 
 ERROR: 12:9014: '=' :  cannot convert from ' temp float' to ' global int'
-ERROR: 12:9015: 'macro expansion' : expected '(' following FOOOM
-ERROR: 12:9016: 'preprocessor evaluation' : can't evaluate expression 
+ERROR: 12:9015: 'preprocessor evaluation' : can't evaluate expression 
 ERROR: 12:9016: 'preprocessor evaluation' : bad expression 
 ERROR: 12:9500: 'preprocessor evaluation' : bad expression 
 ERROR: 12:9500: '#if' : unexpected tokens following directive 
@@ -91,6 +88,8 @@
 ERROR: 12:9506: '#error' : \ 377  
 ERROR: 12:9507: '#error' : \ 376  
 ERROR: 12:9508: '#error' : \ 377  
+ERROR: 12:9602: 'defined' : cannot use in preprocessor expression when expanded from macros 
+ERROR: 12:9603: '#error' : DEF_DEFINED then  
 ERROR: 12:10002: '' : missing #endif 
 ERROR: 88 compilation errors.  No code generated.
 
@@ -135,7 +134,7 @@
 0:65          0.050000
 0:69      move second child to first child ( temp 4-component vector of float)
 0:69        gl_Position: direct index for structure ( gl_Position 4-component vector of float Position)
-0:69          'anon@0' ( out block{ gl_Position 4-component vector of float Position gl_Position,  gl_PointSize float PointSize gl_PointSize,  out implicitly-sized array of float ClipDistance gl_ClipDistance,  gl_ClipVertex 4-component vector of float ClipVertex gl_ClipVertex,  out 4-component vector of float FrontColor gl_FrontColor,  out 4-component vector of float BackColor gl_BackColor,  out 4-component vector of float FrontSecondaryColor gl_FrontSecondaryColor,  out 4-component vector of float BackSecondaryColor gl_BackSecondaryColor,  out implicitly-sized array of 4-component vector of float TexCoord gl_TexCoord,  out float FogFragCoord gl_FogFragCoord})
+0:69          'anon@0' ( out block{ gl_Position 4-component vector of float Position gl_Position,  gl_PointSize float PointSize gl_PointSize,  out unsized 1-element array of float ClipDistance gl_ClipDistance,  gl_ClipVertex 4-component vector of float ClipVertex gl_ClipVertex,  out 4-component vector of float FrontColor gl_FrontColor,  out 4-component vector of float BackColor gl_BackColor,  out 4-component vector of float FrontSecondaryColor gl_FrontSecondaryColor,  out 4-component vector of float BackSecondaryColor gl_BackSecondaryColor,  out unsized 1-element array of 4-component vector of float TexCoord gl_TexCoord,  out float FogFragCoord gl_FogFragCoord})
 0:69          Constant:
 0:69            0 (const uint)
 0:69        Construct vec4 ( temp 4-component vector of float)
@@ -175,7 +174,7 @@
 12:20033    Sequence
 12:20033      move second child to first child ( temp 4-component vector of float)
 12:20033        gl_Position: direct index for structure ( gl_Position 4-component vector of float Position)
-12:20033          'anon@0' ( out block{ gl_Position 4-component vector of float Position gl_Position,  gl_PointSize float PointSize gl_PointSize,  out implicitly-sized array of float ClipDistance gl_ClipDistance,  gl_ClipVertex 4-component vector of float ClipVertex gl_ClipVertex,  out 4-component vector of float FrontColor gl_FrontColor,  out 4-component vector of float BackColor gl_BackColor,  out 4-component vector of float FrontSecondaryColor gl_FrontSecondaryColor,  out 4-component vector of float BackSecondaryColor gl_BackSecondaryColor,  out implicitly-sized array of 4-component vector of float TexCoord gl_TexCoord,  out float FogFragCoord gl_FogFragCoord})
+12:20033          'anon@0' ( out block{ gl_Position 4-component vector of float Position gl_Position,  gl_PointSize float PointSize gl_PointSize,  out unsized 1-element array of float ClipDistance gl_ClipDistance,  gl_ClipVertex 4-component vector of float ClipVertex gl_ClipVertex,  out 4-component vector of float FrontColor gl_FrontColor,  out 4-component vector of float BackColor gl_BackColor,  out 4-component vector of float FrontSecondaryColor gl_FrontSecondaryColor,  out 4-component vector of float BackSecondaryColor gl_BackSecondaryColor,  out unsized 1-element array of 4-component vector of float TexCoord gl_TexCoord,  out float FogFragCoord gl_FogFragCoord})
 12:20033          Constant:
 12:20033            0 (const uint)
 12:20033        Constant:
@@ -189,7 +188,7 @@
 12:9011      'RECURSE' ( global int)
 0:?   Linker Objects
 0:?     'sum' ( global float)
-0:?     'anon@0' ( out block{ gl_Position 4-component vector of float Position gl_Position,  gl_PointSize float PointSize gl_PointSize,  out implicitly-sized array of float ClipDistance gl_ClipDistance,  gl_ClipVertex 4-component vector of float ClipVertex gl_ClipVertex,  out 4-component vector of float FrontColor gl_FrontColor,  out 4-component vector of float BackColor gl_BackColor,  out 4-component vector of float FrontSecondaryColor gl_FrontSecondaryColor,  out 4-component vector of float BackSecondaryColor gl_BackSecondaryColor,  out implicitly-sized array of 4-component vector of float TexCoord gl_TexCoord,  out float FogFragCoord gl_FogFragCoord})
+0:?     'anon@0' ( out block{ gl_Position 4-component vector of float Position gl_Position,  gl_PointSize float PointSize gl_PointSize,  out unsized 1-element array of float ClipDistance gl_ClipDistance,  gl_ClipVertex 4-component vector of float ClipVertex gl_ClipVertex,  out 4-component vector of float FrontColor gl_FrontColor,  out 4-component vector of float BackColor gl_BackColor,  out 4-component vector of float FrontSecondaryColor gl_FrontSecondaryColor,  out 4-component vector of float BackSecondaryColor gl_BackSecondaryColor,  out unsized 1-element array of 4-component vector of float TexCoord gl_TexCoord,  out float FogFragCoord gl_FogFragCoord})
 0:?     'linenumber' ( global int)
 0:?     'filenumber' ( global int)
 0:?     'version' ( global int)
diff --git a/Test/baseResults/dce.frag.out b/Test/baseResults/dce.frag.out
index 63d194c..6b02eb1 100644
--- a/Test/baseResults/dce.frag.out
+++ b/Test/baseResults/dce.frag.out
@@ -1,6 +1,4 @@
 dce.frag
-Warning, version 400 is not yet complete; most version-specific features are present, but some are missing.
-
 Shader version: 400
 0:? Sequence
 0:5  Sequence
diff --git a/Test/baseResults/findFunction.frag.out b/Test/baseResults/findFunction.frag.out
new file mode 100644
index 0000000..cc9b15a
--- /dev/null
+++ b/Test/baseResults/findFunction.frag.out
@@ -0,0 +1,233 @@
+findFunction.frag
+ERROR: 0:39: 'func' : ambiguous best function under implicit type conversion 
+ERROR: 0:40: 'func' : no matching overloaded function found 
+ERROR: 0:40: '=' :  cannot convert from ' const float' to ' temp int64_t'
+ERROR: 0:41: 'func' : no matching overloaded function found 
+ERROR: 0:41: '=' :  cannot convert from ' const float' to ' temp int64_t'
+ERROR: 0:44: 'func' : no matching overloaded function found 
+ERROR: 0:44: '=' :  cannot convert from ' const float' to ' temp int64_t'
+ERROR: 0:45: 'func' : ambiguous best function under implicit type conversion 
+ERROR: 8 compilation errors.  No code generated.
+
+
+Shader version: 450
+Requested GL_EXT_shader_explicit_arithmetic_types
+ERROR: node is still EOpNull!
+0:5  Function Definition: func(i81;i161;i161; ( global int64_t)
+0:5    Function Parameters: 
+0:5      'a' ( in int8_t)
+0:5      'b' ( in int16_t)
+0:5      'c' ( in int16_t)
+0:7    Sequence
+0:7      Branch: Return with expression
+0:7        Convert int16_t to int64 ( temp int64_t)
+0:7          inclusive-or ( temp int16_t)
+0:7            Convert int8_t to int16_t ( temp int16_t)
+0:7              'a' ( in int8_t)
+0:7            add ( temp int16_t)
+0:7              'b' ( in int16_t)
+0:7              'c' ( in int16_t)
+0:10  Function Definition: func(i81;i161;i1; ( global int64_t)
+0:10    Function Parameters: 
+0:10      'a' ( in int8_t)
+0:10      'b' ( in int16_t)
+0:10      'c' ( in int)
+0:12    Sequence
+0:12      Branch: Return with expression
+0:12        Convert int to int64 ( temp int64_t)
+0:12          inclusive-or ( temp int)
+0:12            Convert int8_t to int ( temp int)
+0:12              'a' ( in int8_t)
+0:12            subtract ( temp int)
+0:12              Convert int16_t to int ( temp int)
+0:12                'b' ( in int16_t)
+0:12              'c' ( in int)
+0:15  Function Definition: func(i1;i1;i1; ( global int64_t)
+0:15    Function Parameters: 
+0:15      'a' ( in int)
+0:15      'b' ( in int)
+0:15      'c' ( in int)
+0:17    Sequence
+0:17      Branch: Return with expression
+0:17        Convert int to int64 ( temp int64_t)
+0:17          add ( temp int)
+0:17            divide ( temp int)
+0:17              'a' ( in int)
+0:17              'b' ( in int)
+0:17            'c' ( in int)
+0:20  Function Definition: func(f161;f161;f1; ( global int64_t)
+0:20    Function Parameters: 
+0:20      'a' ( in float16_t)
+0:20      'b' ( in float16_t)
+0:20      'c' ( in float)
+0:22    Sequence
+0:22      Branch: Return with expression
+0:22        Convert float to int64 ( temp int64_t)
+0:22          subtract ( temp float)
+0:22            Convert float16_t to float ( temp float)
+0:22              'a' ( in float16_t)
+0:22            component-wise multiply ( temp float)
+0:22              Convert float16_t to float ( temp float)
+0:22                'b' ( in float16_t)
+0:22              'c' ( in float)
+0:25  Function Definition: func(f161;i161;f1; ( global int64_t)
+0:25    Function Parameters: 
+0:25      'a' ( in float16_t)
+0:25      'b' ( in int16_t)
+0:25      'c' ( in float)
+0:27    Sequence
+0:27      Branch: Return with expression
+0:27        Convert float to int64 ( temp int64_t)
+0:27          subtract ( temp float)
+0:27            Convert float16_t to float ( temp float)
+0:27              'a' ( in float16_t)
+0:27            component-wise multiply ( temp float)
+0:27              Convert int16_t to float ( temp float)
+0:27                'b' ( in int16_t)
+0:27              'c' ( in float)
+0:30  Function Definition: main( ( global void)
+0:30    Function Parameters: 
+0:?     Sequence
+0:38      Sequence
+0:38        move second child to first child ( temp int64_t)
+0:38          'b1' ( temp int64_t)
+0:38          Function Call: func(i81;i161;i1; ( global int64_t)
+0:38            'x' ( temp int8_t)
+0:38            'y' ( temp int16_t)
+0:38            'z' ( temp int)
+0:39      Sequence
+0:39        move second child to first child ( temp int64_t)
+0:39          'b2' ( temp int64_t)
+0:39          Function Call: func(f161;i161;f1; ( global int64_t)
+0:39            Convert int16_t to float16_t ( temp float16_t)
+0:39              'y' ( temp int16_t)
+0:39            'y' ( temp int16_t)
+0:39            Convert int to float ( temp float)
+0:39              'z' ( temp int)
+0:42      Sequence
+0:42        move second child to first child ( temp int64_t)
+0:42          'b5' ( temp int64_t)
+0:42          Function Call: func(f161;i161;f1; ( global int64_t)
+0:42            Convert int16_t to float16_t ( temp float16_t)
+0:42              'y' ( temp int16_t)
+0:42            'y' ( temp int16_t)
+0:42            Convert float16_t to float ( temp float)
+0:42              'f16' ( temp float16_t)
+0:43      Sequence
+0:43        move second child to first child ( temp int64_t)
+0:43          'b7' ( temp int64_t)
+0:43          Function Call: func(f161;f161;f1; ( global int64_t)
+0:43            'f16' ( temp float16_t)
+0:43            'f16' ( temp float16_t)
+0:43            Convert int16_t to float ( temp float)
+0:43              'y' ( temp int16_t)
+0:45      Sequence
+0:45        move second child to first child ( temp int64_t)
+0:45          'b9' ( temp int64_t)
+0:45          Function Call: func(f161;f161;f1; ( global int64_t)
+0:45            'f16' ( temp float16_t)
+0:45            Convert int8_t to float16_t ( temp float16_t)
+0:45              'x' ( temp int8_t)
+0:45            Convert float16_t to float ( temp float)
+0:45              'f16' ( temp float16_t)
+0:?   Linker Objects
+
+
+Linked fragment stage:
+
+
+Shader version: 450
+Requested GL_EXT_shader_explicit_arithmetic_types
+ERROR: node is still EOpNull!
+0:10  Function Definition: func(i81;i161;i1; ( global int64_t)
+0:10    Function Parameters: 
+0:10      'a' ( in int8_t)
+0:10      'b' ( in int16_t)
+0:10      'c' ( in int)
+0:12    Sequence
+0:12      Branch: Return with expression
+0:12        Convert int to int64 ( temp int64_t)
+0:12          inclusive-or ( temp int)
+0:12            Convert int8_t to int ( temp int)
+0:12              'a' ( in int8_t)
+0:12            subtract ( temp int)
+0:12              Convert int16_t to int ( temp int)
+0:12                'b' ( in int16_t)
+0:12              'c' ( in int)
+0:20  Function Definition: func(f161;f161;f1; ( global int64_t)
+0:20    Function Parameters: 
+0:20      'a' ( in float16_t)
+0:20      'b' ( in float16_t)
+0:20      'c' ( in float)
+0:22    Sequence
+0:22      Branch: Return with expression
+0:22        Convert float to int64 ( temp int64_t)
+0:22          subtract ( temp float)
+0:22            Convert float16_t to float ( temp float)
+0:22              'a' ( in float16_t)
+0:22            component-wise multiply ( temp float)
+0:22              Convert float16_t to float ( temp float)
+0:22                'b' ( in float16_t)
+0:22              'c' ( in float)
+0:25  Function Definition: func(f161;i161;f1; ( global int64_t)
+0:25    Function Parameters: 
+0:25      'a' ( in float16_t)
+0:25      'b' ( in int16_t)
+0:25      'c' ( in float)
+0:27    Sequence
+0:27      Branch: Return with expression
+0:27        Convert float to int64 ( temp int64_t)
+0:27          subtract ( temp float)
+0:27            Convert float16_t to float ( temp float)
+0:27              'a' ( in float16_t)
+0:27            component-wise multiply ( temp float)
+0:27              Convert int16_t to float ( temp float)
+0:27                'b' ( in int16_t)
+0:27              'c' ( in float)
+0:30  Function Definition: main( ( global void)
+0:30    Function Parameters: 
+0:?     Sequence
+0:38      Sequence
+0:38        move second child to first child ( temp int64_t)
+0:38          'b1' ( temp int64_t)
+0:38          Function Call: func(i81;i161;i1; ( global int64_t)
+0:38            'x' ( temp int8_t)
+0:38            'y' ( temp int16_t)
+0:38            'z' ( temp int)
+0:39      Sequence
+0:39        move second child to first child ( temp int64_t)
+0:39          'b2' ( temp int64_t)
+0:39          Function Call: func(f161;i161;f1; ( global int64_t)
+0:39            Convert int16_t to float16_t ( temp float16_t)
+0:39              'y' ( temp int16_t)
+0:39            'y' ( temp int16_t)
+0:39            Convert int to float ( temp float)
+0:39              'z' ( temp int)
+0:42      Sequence
+0:42        move second child to first child ( temp int64_t)
+0:42          'b5' ( temp int64_t)
+0:42          Function Call: func(f161;i161;f1; ( global int64_t)
+0:42            Convert int16_t to float16_t ( temp float16_t)
+0:42              'y' ( temp int16_t)
+0:42            'y' ( temp int16_t)
+0:42            Convert float16_t to float ( temp float)
+0:42              'f16' ( temp float16_t)
+0:43      Sequence
+0:43        move second child to first child ( temp int64_t)
+0:43          'b7' ( temp int64_t)
+0:43          Function Call: func(f161;f161;f1; ( global int64_t)
+0:43            'f16' ( temp float16_t)
+0:43            'f16' ( temp float16_t)
+0:43            Convert int16_t to float ( temp float)
+0:43              'y' ( temp int16_t)
+0:45      Sequence
+0:45        move second child to first child ( temp int64_t)
+0:45          'b9' ( temp int64_t)
+0:45          Function Call: func(f161;f161;f1; ( global int64_t)
+0:45            'f16' ( temp float16_t)
+0:45            Convert int8_t to float16_t ( temp float16_t)
+0:45              'x' ( temp int8_t)
+0:45            Convert float16_t to float ( temp float)
+0:45              'f16' ( temp float16_t)
+0:?   Linker Objects
+
diff --git a/Test/baseResults/functionSemantics.frag.out b/Test/baseResults/functionSemantics.frag.out
index 6c5ebdc..d04e6e7 100644
--- a/Test/baseResults/functionSemantics.frag.out
+++ b/Test/baseResults/functionSemantics.frag.out
@@ -1,5 +1,4 @@
 functionSemantics.frag
-Warning, version 400 is not yet complete; most version-specific features are present, but some are missing.
 ERROR: 0:74: 'return' : cannot convert return value to function return type 
 WARNING: 0:74: 'return' : type conversion on return values was not explicitly allowed until version 420 
 ERROR: 1 compilation errors.  No code generated.
diff --git a/Test/baseResults/glsl.-D-U.frag.out b/Test/baseResults/glsl.-D-U.frag.out
new file mode 100644
index 0000000..6538e84
--- /dev/null
+++ b/Test/baseResults/glsl.-D-U.frag.out
@@ -0,0 +1,55 @@
+glsl.-D-U.frag
+Shader version: 450
+0:? Sequence
+0:7  Function Definition: main( ( global void)
+0:7    Function Parameters: 
+0:10    Sequence
+0:10      move second child to first child ( temp 4-component vector of float)
+0:10        'color' (layout( location=0) out 4-component vector of float)
+0:10        Constant:
+0:10          1.000000
+0:10          1.000000
+0:10          1.000000
+0:10          1.000000
+0:16      Post-Increment ( temp 4-component vector of float)
+0:16        'color' (layout( location=0) out 4-component vector of float)
+0:24      vector scale second child into first child ( temp 4-component vector of float)
+0:24        'color' (layout( location=0) out 4-component vector of float)
+0:24        Constant:
+0:24          3.000000
+0:28      vector scale second child into first child ( temp 4-component vector of float)
+0:28        'color' (layout( location=0) out 4-component vector of float)
+0:28        Constant:
+0:28          400.000000
+0:?   Linker Objects
+0:?     'color' (layout( location=0) out 4-component vector of float)
+
+
+Linked fragment stage:
+
+
+Shader version: 450
+0:? Sequence
+0:7  Function Definition: main( ( global void)
+0:7    Function Parameters: 
+0:10    Sequence
+0:10      move second child to first child ( temp 4-component vector of float)
+0:10        'color' (layout( location=0) out 4-component vector of float)
+0:10        Constant:
+0:10          1.000000
+0:10          1.000000
+0:10          1.000000
+0:10          1.000000
+0:16      Post-Increment ( temp 4-component vector of float)
+0:16        'color' (layout( location=0) out 4-component vector of float)
+0:24      vector scale second child into first child ( temp 4-component vector of float)
+0:24        'color' (layout( location=0) out 4-component vector of float)
+0:24        Constant:
+0:24          3.000000
+0:28      vector scale second child into first child ( temp 4-component vector of float)
+0:28        'color' (layout( location=0) out 4-component vector of float)
+0:28        Constant:
+0:28          400.000000
+0:?   Linker Objects
+0:?     'color' (layout( location=0) out 4-component vector of float)
+
diff --git a/Test/baseResults/glsl.entryPointRename.vert.bad.out b/Test/baseResults/glsl.entryPointRename.vert.bad.out
new file mode 100644
index 0000000..c7ea97e
--- /dev/null
+++ b/Test/baseResults/glsl.entryPointRename.vert.bad.out
@@ -0,0 +1,45 @@
+glsl.entryPointRename.vert
+ERROR: Source entry point must be "main"
+
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 20
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Vertex 4  "foo" 13
+                              Source GLSL 460
+                              Name 4  "foo"
+                              Name 11  "gl_PerVertex"
+                              MemberName 11(gl_PerVertex) 0  "gl_Position"
+                              MemberName 11(gl_PerVertex) 1  "gl_PointSize"
+                              MemberName 11(gl_PerVertex) 2  "gl_ClipDistance"
+                              MemberName 11(gl_PerVertex) 3  "gl_CullDistance"
+                              Name 13  ""
+                              MemberDecorate 11(gl_PerVertex) 0 BuiltIn Position
+                              MemberDecorate 11(gl_PerVertex) 1 BuiltIn PointSize
+                              MemberDecorate 11(gl_PerVertex) 2 BuiltIn ClipDistance
+                              MemberDecorate 11(gl_PerVertex) 3 BuiltIn CullDistance
+                              Decorate 11(gl_PerVertex) Block
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+               8:             TypeInt 32 0
+               9:      8(int) Constant 1
+              10:             TypeArray 6(float) 9
+11(gl_PerVertex):             TypeStruct 7(fvec4) 6(float) 10 10
+              12:             TypePointer Output 11(gl_PerVertex)
+              13:     12(ptr) Variable Output
+              14:             TypeInt 32 1
+              15:     14(int) Constant 0
+              16:    6(float) Constant 1065353216
+              17:    7(fvec4) ConstantComposite 16 16 16 16
+              18:             TypePointer Output 7(fvec4)
+          4(foo):           2 Function None 3
+               5:             Label
+              19:     18(ptr) AccessChain 13 15
+                              Store 19 17
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/glsl.entryPointRename.vert.out b/Test/baseResults/glsl.entryPointRename.vert.out
new file mode 100644
index 0000000..3dbe13b
--- /dev/null
+++ b/Test/baseResults/glsl.entryPointRename.vert.out
@@ -0,0 +1,43 @@
+glsl.entryPointRename.vert
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 20
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Vertex 4  "foo" 13
+                              Source GLSL 460
+                              Name 4  "foo"
+                              Name 11  "gl_PerVertex"
+                              MemberName 11(gl_PerVertex) 0  "gl_Position"
+                              MemberName 11(gl_PerVertex) 1  "gl_PointSize"
+                              MemberName 11(gl_PerVertex) 2  "gl_ClipDistance"
+                              MemberName 11(gl_PerVertex) 3  "gl_CullDistance"
+                              Name 13  ""
+                              MemberDecorate 11(gl_PerVertex) 0 BuiltIn Position
+                              MemberDecorate 11(gl_PerVertex) 1 BuiltIn PointSize
+                              MemberDecorate 11(gl_PerVertex) 2 BuiltIn ClipDistance
+                              MemberDecorate 11(gl_PerVertex) 3 BuiltIn CullDistance
+                              Decorate 11(gl_PerVertex) Block
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+               8:             TypeInt 32 0
+               9:      8(int) Constant 1
+              10:             TypeArray 6(float) 9
+11(gl_PerVertex):             TypeStruct 7(fvec4) 6(float) 10 10
+              12:             TypePointer Output 11(gl_PerVertex)
+              13:     12(ptr) Variable Output
+              14:             TypeInt 32 1
+              15:     14(int) Constant 0
+              16:    6(float) Constant 1065353216
+              17:    7(fvec4) ConstantComposite 16 16 16 16
+              18:             TypePointer Output 7(fvec4)
+          4(foo):           2 Function None 3
+               5:             Label
+              19:     18(ptr) AccessChain 13 15
+                              Store 19 17
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/glsl.entryPointRename2.vert.out b/Test/baseResults/glsl.entryPointRename2.vert.out
new file mode 100644
index 0000000..aebd86b
--- /dev/null
+++ b/Test/baseResults/glsl.entryPointRename2.vert.out
@@ -0,0 +1,4 @@
+glsl.entryPointRename2.vert
+ERROR: Linking vertex stage: Missing entry point: Each stage requires one entry point
+
+SPIR-V is not generated for failed compile or link
diff --git a/Test/baseResults/glspv.esversion.vert.out b/Test/baseResults/glspv.esversion.vert.out
old mode 100755
new mode 100644
index 8e4b3b8..782865a
--- a/Test/baseResults/glspv.esversion.vert.out
+++ b/Test/baseResults/glspv.esversion.vert.out
@@ -1,6 +1,5 @@
 glspv.esversion.vert
 ERROR: #version: ES shaders for OpenGL SPIR-V are not supported
-Warning, version 310 is not yet complete; most version-specific features are present, but some are missing.
 ERROR: 1 compilation errors.  No code generated.
 
 
diff --git a/Test/baseResults/glspv.frag.out b/Test/baseResults/glspv.frag.out
old mode 100755
new mode 100644
index 0ff15a8..db75213
--- a/Test/baseResults/glspv.frag.out
+++ b/Test/baseResults/glspv.frag.out
@@ -1,9 +1,15 @@
 glspv.frag
 ERROR: 0:4: '#error' : GL_SPIRV is set ( correct , not an error )  
 ERROR: 0:6: '#error' : GL_SPIR is 100  
-ERROR: 0:14: 'input_attachment_index' : only allowed when using GLSL for Vulkan 
-ERROR: 0:14: '' :  syntax error, unexpected IDENTIFIER, expecting LEFT_BRACE or COMMA or SEMICOLON
-ERROR: 4 compilation errors.  No code generated.
+ERROR: 0:14: 'f' : non-opaque uniform variables need a layout(location=L) 
+ERROR: 0:21: 'noise1' : no matching overloaded function found 
+ERROR: 0:22: 'noise2' : no matching overloaded function found 
+ERROR: 0:23: 'noise3' : no matching overloaded function found 
+ERROR: 0:24: 'noise4' : no matching overloaded function found 
+ERROR: 0:27: 'atomic_uint' : layout(binding=X) is required 
+ERROR: 0:28: 'input_attachment_index' : only allowed when using GLSL for Vulkan 
+ERROR: 0:28: '' :  syntax error, unexpected IDENTIFIER, expecting LEFT_BRACE or COMMA or SEMICOLON
+ERROR: 10 compilation errors.  No code generated.
 
 
 SPIR-V is not generated for failed compile or link
diff --git a/Test/baseResults/glspv.version.frag.out b/Test/baseResults/glspv.version.frag.out
old mode 100755
new mode 100644
index 3e8e8c4..4a45b5b
--- a/Test/baseResults/glspv.version.frag.out
+++ b/Test/baseResults/glspv.version.frag.out
@@ -2,7 +2,7 @@
 ERROR: #version: compilation for SPIR-V does not support the compatibility profile
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 6
 
                               Capability Shader
diff --git a/Test/baseResults/glspv.version.vert.out b/Test/baseResults/glspv.version.vert.out
old mode 100755
new mode 100644
diff --git a/Test/baseResults/glspv.vert.out b/Test/baseResults/glspv.vert.out
old mode 100755
new mode 100644
index fae52b7..f2fe53b
--- a/Test/baseResults/glspv.vert.out
+++ b/Test/baseResults/glspv.vert.out
@@ -1,5 +1,4 @@
 glspv.vert
-Warning, version 450 is not yet complete; most version-specific features are present, but some are missing.
 ERROR: 0:3: 'push_constant' : only allowed when using GLSL for Vulkan 
 ERROR: 0:6: 'descriptor set' : only allowed when using GLSL for Vulkan 
 ERROR: 0:8: 'shared' : not allowed when generating SPIR-V 
diff --git a/Test/baseResults/hlsl.-D-U.frag.out b/Test/baseResults/hlsl.-D-U.frag.out
new file mode 100644
index 0000000..06842e8
--- /dev/null
+++ b/Test/baseResults/hlsl.-D-U.frag.out
@@ -0,0 +1,65 @@
+hlsl.-D-U.frag
+Shader version: 500
+gl_FragCoord origin is upper left
+0:? Sequence
+0:7  Function Definition: @main( ( temp void)
+0:7    Function Parameters: 
+0:?     Sequence
+0:9      move second child to first child ( temp 4-component vector of float)
+0:9        'color' ( global 4-component vector of float)
+0:9        Constant:
+0:9          1.000000
+0:9          1.000000
+0:9          1.000000
+0:9          1.000000
+0:15      subtract second child into first child ( temp 4-component vector of float)
+0:15        'color' ( global 4-component vector of float)
+0:15        Constant:
+0:15          5.000000
+0:21      Post-Increment ( temp 4-component vector of float)
+0:21        'color' ( global 4-component vector of float)
+0:29      vector scale second child into first child ( temp 4-component vector of float)
+0:29        'color' ( global 4-component vector of float)
+0:29        Constant:
+0:29          3.000000
+0:7  Function Definition: main( ( temp void)
+0:7    Function Parameters: 
+0:?     Sequence
+0:7      Function Call: @main( ( temp void)
+0:?   Linker Objects
+0:?     'color' ( global 4-component vector of float)
+
+
+Linked fragment stage:
+
+
+Shader version: 500
+gl_FragCoord origin is upper left
+0:? Sequence
+0:7  Function Definition: @main( ( temp void)
+0:7    Function Parameters: 
+0:?     Sequence
+0:9      move second child to first child ( temp 4-component vector of float)
+0:9        'color' ( global 4-component vector of float)
+0:9        Constant:
+0:9          1.000000
+0:9          1.000000
+0:9          1.000000
+0:9          1.000000
+0:15      subtract second child into first child ( temp 4-component vector of float)
+0:15        'color' ( global 4-component vector of float)
+0:15        Constant:
+0:15          5.000000
+0:21      Post-Increment ( temp 4-component vector of float)
+0:21        'color' ( global 4-component vector of float)
+0:29      vector scale second child into first child ( temp 4-component vector of float)
+0:29        'color' ( global 4-component vector of float)
+0:29        Constant:
+0:29          3.000000
+0:7  Function Definition: main( ( temp void)
+0:7    Function Parameters: 
+0:?     Sequence
+0:7      Function Call: @main( ( temp void)
+0:?   Linker Objects
+0:?     'color' ( global 4-component vector of float)
+
diff --git a/Test/baseResults/hlsl.PointSize.geom.out b/Test/baseResults/hlsl.PointSize.geom.out
new file mode 100644
index 0000000..c21008d
--- /dev/null
+++ b/Test/baseResults/hlsl.PointSize.geom.out
@@ -0,0 +1,147 @@
+hlsl.PointSize.geom
+Shader version: 500
+invocations = -1
+max_vertices = 4
+input primitive = triangles
+output primitive = line_strip
+0:? Sequence
+0:8  Function Definition: @main(u1[3];struct-S-f11; ( temp void)
+0:8    Function Parameters: 
+0:8      'ps' ( in 3-element array of uint)
+0:8      'OutputStream' ( out structure{ temp float ps})
+0:?     Sequence
+0:10      Sequence
+0:10        Sequence
+0:10          move second child to first child ( temp float)
+0:?             'OutputStream.ps' ( out float PointSize)
+0:10            ps: direct index for structure ( temp float)
+0:10              's' ( temp structure{ temp float ps})
+0:10              Constant:
+0:10                0 (const int)
+0:10        EmitVertex ( temp void)
+0:8  Function Definition: main( ( temp void)
+0:8    Function Parameters: 
+0:?     Sequence
+0:8      move second child to first child ( temp 3-element array of uint)
+0:?         'ps' ( temp 3-element array of uint)
+0:?         'ps' ( in 3-element array of uint PointSize)
+0:8      Function Call: @main(u1[3];struct-S-f11; ( temp void)
+0:?         'ps' ( temp 3-element array of uint)
+0:?         'OutputStream' ( temp structure{ temp float ps})
+0:?   Linker Objects
+0:?     'ps' ( in 3-element array of uint PointSize)
+0:?     'OutputStream.ps' ( out float PointSize)
+
+
+Linked geometry stage:
+
+
+Shader version: 500
+invocations = 1
+max_vertices = 4
+input primitive = triangles
+output primitive = line_strip
+0:? Sequence
+0:8  Function Definition: @main(u1[3];struct-S-f11; ( temp void)
+0:8    Function Parameters: 
+0:8      'ps' ( in 3-element array of uint)
+0:8      'OutputStream' ( out structure{ temp float ps})
+0:?     Sequence
+0:10      Sequence
+0:10        Sequence
+0:10          move second child to first child ( temp float)
+0:?             'OutputStream.ps' ( out float PointSize)
+0:10            ps: direct index for structure ( temp float)
+0:10              's' ( temp structure{ temp float ps})
+0:10              Constant:
+0:10                0 (const int)
+0:10        EmitVertex ( temp void)
+0:8  Function Definition: main( ( temp void)
+0:8    Function Parameters: 
+0:?     Sequence
+0:8      move second child to first child ( temp 3-element array of uint)
+0:?         'ps' ( temp 3-element array of uint)
+0:?         'ps' ( in 3-element array of uint PointSize)
+0:8      Function Call: @main(u1[3];struct-S-f11; ( temp void)
+0:?         'ps' ( temp 3-element array of uint)
+0:?         'OutputStream' ( temp structure{ temp float ps})
+0:?   Linker Objects
+0:?     'ps' ( in 3-element array of uint PointSize)
+0:?     'OutputStream.ps' ( out float PointSize)
+
+error: SPIRV-Tools Validation Errors
+error: According to the Vulkan spec BuiltIn PointSize variable needs to be a 32-bit float scalar. ID <28> (OpVariable) is not a float scalar.
+  %29 = OpLoad %_arr_uint_uint_3 %ps_1
+
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 36
+
+                              Capability Geometry
+                              Capability GeometryPointSize
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Geometry 4  "main" 19 28
+                              ExecutionMode 4 Triangles
+                              ExecutionMode 4 Invocations 1
+                              ExecutionMode 4 OutputLineStrip
+                              ExecutionMode 4 OutputVertices 4
+                              Source HLSL 500
+                              Name 4  "main"
+                              Name 11  "S"
+                              MemberName 11(S) 0  "ps"
+                              Name 16  "@main(u1[3];struct-S-f11;"
+                              Name 14  "ps"
+                              Name 15  "OutputStream"
+                              Name 19  "OutputStream.ps"
+                              Name 20  "s"
+                              Name 26  "ps"
+                              Name 28  "ps"
+                              Name 30  "OutputStream"
+                              Name 31  "param"
+                              Name 33  "param"
+                              Decorate 19(OutputStream.ps) BuiltIn PointSize
+                              Decorate 28(ps) BuiltIn PointSize
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeInt 32 0
+               7:      6(int) Constant 3
+               8:             TypeArray 6(int) 7
+               9:             TypePointer Function 8
+              10:             TypeFloat 32
+           11(S):             TypeStruct 10(float)
+              12:             TypePointer Function 11(S)
+              13:             TypeFunction 2 9(ptr) 12(ptr)
+              18:             TypePointer Output 10(float)
+19(OutputStream.ps):     18(ptr) Variable Output
+              21:             TypeInt 32 1
+              22:     21(int) Constant 0
+              23:             TypePointer Function 10(float)
+              27:             TypePointer Input 8
+          28(ps):     27(ptr) Variable Input
+         4(main):           2 Function None 3
+               5:             Label
+          26(ps):      9(ptr) Variable Function
+30(OutputStream):     12(ptr) Variable Function
+       31(param):      9(ptr) Variable Function
+       33(param):     12(ptr) Variable Function
+              29:           8 Load 28(ps)
+                              Store 26(ps) 29
+              32:           8 Load 26(ps)
+                              Store 31(param) 32
+              34:           2 FunctionCall 16(@main(u1[3];struct-S-f11;) 31(param) 33(param)
+              35:       11(S) Load 33(param)
+                              Store 30(OutputStream) 35
+                              Return
+                              FunctionEnd
+16(@main(u1[3];struct-S-f11;):           2 Function None 13
+          14(ps):      9(ptr) FunctionParameter
+15(OutputStream):     12(ptr) FunctionParameter
+              17:             Label
+           20(s):     12(ptr) Variable Function
+              24:     23(ptr) AccessChain 20(s) 22
+              25:   10(float) Load 24
+                              Store 19(OutputStream.ps) 25
+                              EmitVertex
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/hlsl.PointSize.vert.out b/Test/baseResults/hlsl.PointSize.vert.out
new file mode 100644
index 0000000..bda0030
--- /dev/null
+++ b/Test/baseResults/hlsl.PointSize.vert.out
@@ -0,0 +1,69 @@
+hlsl.PointSize.vert
+Shader version: 500
+0:? Sequence
+0:2  Function Definition: @main( ( temp float)
+0:2    Function Parameters: 
+0:?     Sequence
+0:3      Branch: Return with expression
+0:3        Constant:
+0:3          2.300000
+0:2  Function Definition: main( ( temp void)
+0:2    Function Parameters: 
+0:?     Sequence
+0:2      move second child to first child ( temp float)
+0:?         '@entryPointOutput' ( out float PointSize)
+0:2        Function Call: @main( ( temp float)
+0:?   Linker Objects
+0:?     '@entryPointOutput' ( out float PointSize)
+
+
+Linked vertex stage:
+
+
+Shader version: 500
+0:? Sequence
+0:2  Function Definition: @main( ( temp float)
+0:2    Function Parameters: 
+0:?     Sequence
+0:3      Branch: Return with expression
+0:3        Constant:
+0:3          2.300000
+0:2  Function Definition: main( ( temp void)
+0:2    Function Parameters: 
+0:?     Sequence
+0:2      move second child to first child ( temp float)
+0:?         '@entryPointOutput' ( out float PointSize)
+0:2        Function Call: @main( ( temp float)
+0:?   Linker Objects
+0:?     '@entryPointOutput' ( out float PointSize)
+
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 16
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Vertex 4  "main" 14
+                              Source HLSL 500
+                              Name 4  "main"
+                              Name 8  "@main("
+                              Name 14  "@entryPointOutput"
+                              Decorate 14(@entryPointOutput) BuiltIn PointSize
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeFunction 6(float)
+              10:    6(float) Constant 1075000115
+              13:             TypePointer Output 6(float)
+14(@entryPointOutput):     13(ptr) Variable Output
+         4(main):           2 Function None 3
+               5:             Label
+              15:    6(float) FunctionCall 8(@main()
+                              Store 14(@entryPointOutput) 15
+                              Return
+                              FunctionEnd
+       8(@main():    6(float) Function None 7
+               9:             Label
+                              ReturnValue 10
+                              FunctionEnd
diff --git a/Test/baseResults/hlsl.aliasOpaque.frag.out b/Test/baseResults/hlsl.aliasOpaque.frag.out
new file mode 100644
index 0000000..9928278
--- /dev/null
+++ b/Test/baseResults/hlsl.aliasOpaque.frag.out
@@ -0,0 +1,242 @@
+hlsl.aliasOpaque.frag
+WARNING: AST will form illegal SPIR-V; need to transform to legalize
+Shader version: 500
+gl_FragCoord origin is upper left
+0:? Sequence
+0:12  Function Definition: osCall(struct-OS-p1-f1-t211; ( temp 4-component vector of float)
+0:12    Function Parameters: 
+0:12      's' ( in structure{ temp sampler ss,  temp float a,  temp texture2D tex})
+0:?     Sequence
+0:13      Branch: Return with expression
+0:13        vector-scale ( temp 4-component vector of float)
+0:13          a: direct index for structure ( temp float)
+0:13            's' ( in structure{ temp sampler ss,  temp float a,  temp texture2D tex})
+0:13            Constant:
+0:13              1 (const int)
+0:13          texture ( temp 4-component vector of float)
+0:13            Construct combined texture-sampler ( temp sampler2D)
+0:13              tex: direct index for structure ( temp texture2D)
+0:13                's' ( in structure{ temp sampler ss,  temp float a,  temp texture2D tex})
+0:13                Constant:
+0:13                  2 (const int)
+0:13              ss: direct index for structure ( temp sampler)
+0:13                's' ( in structure{ temp sampler ss,  temp float a,  temp texture2D tex})
+0:13                Constant:
+0:13                  0 (const int)
+0:?             Constant:
+0:?               0.200000
+0:?               0.300000
+0:17  Function Definition: @main( ( temp 4-component vector of float)
+0:17    Function Parameters: 
+0:?     Sequence
+0:19      move second child to first child ( temp sampler)
+0:19        ss: direct index for structure ( temp sampler)
+0:19          'os' ( temp structure{ temp sampler ss,  temp float a,  temp texture2D tex})
+0:19          Constant:
+0:19            0 (const int)
+0:19        'gss2' ( uniform sampler)
+0:20      move second child to first child ( temp sampler)
+0:20        ss: direct index for structure ( temp sampler)
+0:20          'os' ( temp structure{ temp sampler ss,  temp float a,  temp texture2D tex})
+0:20          Constant:
+0:20            0 (const int)
+0:20        'gss' ( uniform sampler)
+0:21      move second child to first child ( temp texture2D)
+0:21        tex: direct index for structure ( temp texture2D)
+0:21          'os' ( temp structure{ temp sampler ss,  temp float a,  temp texture2D tex})
+0:21          Constant:
+0:21            2 (const int)
+0:21        'gtex' ( uniform texture2D)
+0:22      move second child to first child ( temp float)
+0:22        a: direct index for structure ( temp float)
+0:22          'os' ( temp structure{ temp sampler ss,  temp float a,  temp texture2D tex})
+0:22          Constant:
+0:22            1 (const int)
+0:22        Constant:
+0:22          3.000000
+0:28      Branch: Return with expression
+0:28        Function Call: osCall(struct-OS-p1-f1-t211; ( temp 4-component vector of float)
+0:28          'os' ( temp structure{ temp sampler ss,  temp float a,  temp texture2D tex})
+0:17  Function Definition: main( ( temp void)
+0:17    Function Parameters: 
+0:?     Sequence
+0:17      move second child to first child ( temp 4-component vector of float)
+0:?         '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+0:17        Function Call: @main( ( temp 4-component vector of float)
+0:?   Linker Objects
+0:?     'gss' ( uniform sampler)
+0:?     'gss2' ( uniform sampler)
+0:?     'gtex' ( uniform texture2D)
+0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+
+
+Linked fragment stage:
+
+
+Shader version: 500
+gl_FragCoord origin is upper left
+0:? Sequence
+0:12  Function Definition: osCall(struct-OS-p1-f1-t211; ( temp 4-component vector of float)
+0:12    Function Parameters: 
+0:12      's' ( in structure{ temp sampler ss,  temp float a,  temp texture2D tex})
+0:?     Sequence
+0:13      Branch: Return with expression
+0:13        vector-scale ( temp 4-component vector of float)
+0:13          a: direct index for structure ( temp float)
+0:13            's' ( in structure{ temp sampler ss,  temp float a,  temp texture2D tex})
+0:13            Constant:
+0:13              1 (const int)
+0:13          texture ( temp 4-component vector of float)
+0:13            Construct combined texture-sampler ( temp sampler2D)
+0:13              tex: direct index for structure ( temp texture2D)
+0:13                's' ( in structure{ temp sampler ss,  temp float a,  temp texture2D tex})
+0:13                Constant:
+0:13                  2 (const int)
+0:13              ss: direct index for structure ( temp sampler)
+0:13                's' ( in structure{ temp sampler ss,  temp float a,  temp texture2D tex})
+0:13                Constant:
+0:13                  0 (const int)
+0:?             Constant:
+0:?               0.200000
+0:?               0.300000
+0:17  Function Definition: @main( ( temp 4-component vector of float)
+0:17    Function Parameters: 
+0:?     Sequence
+0:19      move second child to first child ( temp sampler)
+0:19        ss: direct index for structure ( temp sampler)
+0:19          'os' ( temp structure{ temp sampler ss,  temp float a,  temp texture2D tex})
+0:19          Constant:
+0:19            0 (const int)
+0:19        'gss2' ( uniform sampler)
+0:20      move second child to first child ( temp sampler)
+0:20        ss: direct index for structure ( temp sampler)
+0:20          'os' ( temp structure{ temp sampler ss,  temp float a,  temp texture2D tex})
+0:20          Constant:
+0:20            0 (const int)
+0:20        'gss' ( uniform sampler)
+0:21      move second child to first child ( temp texture2D)
+0:21        tex: direct index for structure ( temp texture2D)
+0:21          'os' ( temp structure{ temp sampler ss,  temp float a,  temp texture2D tex})
+0:21          Constant:
+0:21            2 (const int)
+0:21        'gtex' ( uniform texture2D)
+0:22      move second child to first child ( temp float)
+0:22        a: direct index for structure ( temp float)
+0:22          'os' ( temp structure{ temp sampler ss,  temp float a,  temp texture2D tex})
+0:22          Constant:
+0:22            1 (const int)
+0:22        Constant:
+0:22          3.000000
+0:28      Branch: Return with expression
+0:28        Function Call: osCall(struct-OS-p1-f1-t211; ( temp 4-component vector of float)
+0:28          'os' ( temp structure{ temp sampler ss,  temp float a,  temp texture2D tex})
+0:17  Function Definition: main( ( temp void)
+0:17    Function Parameters: 
+0:?     Sequence
+0:17      move second child to first child ( temp 4-component vector of float)
+0:?         '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+0:17        Function Call: @main( ( temp 4-component vector of float)
+0:?   Linker Objects
+0:?     'gss' ( uniform sampler)
+0:?     'gss2' ( uniform sampler)
+0:?     'gtex' ( uniform texture2D)
+0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 64
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 62
+                              ExecutionMode 4 OriginUpperLeft
+                              Source HLSL 500
+                              Name 4  "main"
+                              Name 9  "OS"
+                              MemberName 9(OS) 0  "ss"
+                              MemberName 9(OS) 1  "a"
+                              MemberName 9(OS) 2  "tex"
+                              Name 14  "osCall(struct-OS-p1-f1-t211;"
+                              Name 13  "s"
+                              Name 17  "@main("
+                              Name 42  "os"
+                              Name 44  "gss2"
+                              Name 47  "gss"
+                              Name 51  "gtex"
+                              Name 56  "param"
+                              Name 62  "@entryPointOutput"
+                              Decorate 44(gss2) DescriptorSet 0
+                              Decorate 47(gss) DescriptorSet 0
+                              Decorate 51(gtex) DescriptorSet 0
+                              Decorate 62(@entryPointOutput) Location 0
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeSampler
+               7:             TypeFloat 32
+               8:             TypeImage 7(float) 2D sampled format:Unknown
+           9(OS):             TypeStruct 6 7(float) 8
+              10:             TypePointer Function 9(OS)
+              11:             TypeVector 7(float) 4
+              12:             TypeFunction 11(fvec4) 10(ptr)
+              16:             TypeFunction 11(fvec4)
+              19:             TypeInt 32 1
+              20:     19(int) Constant 1
+              21:             TypePointer Function 7(float)
+              24:     19(int) Constant 2
+              25:             TypePointer Function 8
+              28:     19(int) Constant 0
+              29:             TypePointer Function 6
+              32:             TypeSampledImage 8
+              34:             TypeVector 7(float) 2
+              35:    7(float) Constant 1045220557
+              36:    7(float) Constant 1050253722
+              37:   34(fvec2) ConstantComposite 35 36
+              43:             TypePointer UniformConstant 6
+        44(gss2):     43(ptr) Variable UniformConstant
+         47(gss):     43(ptr) Variable UniformConstant
+              50:             TypePointer UniformConstant 8
+        51(gtex):     50(ptr) Variable UniformConstant
+              54:    7(float) Constant 1077936128
+              61:             TypePointer Output 11(fvec4)
+62(@entryPointOutput):     61(ptr) Variable Output
+         4(main):           2 Function None 3
+               5:             Label
+              63:   11(fvec4) FunctionCall 17(@main()
+                              Store 62(@entryPointOutput) 63
+                              Return
+                              FunctionEnd
+14(osCall(struct-OS-p1-f1-t211;):   11(fvec4) Function None 12
+           13(s):     10(ptr) FunctionParameter
+              15:             Label
+              22:     21(ptr) AccessChain 13(s) 20
+              23:    7(float) Load 22
+              26:     25(ptr) AccessChain 13(s) 24
+              27:           8 Load 26
+              30:     29(ptr) AccessChain 13(s) 28
+              31:           6 Load 30
+              33:          32 SampledImage 27 31
+              38:   11(fvec4) ImageSampleImplicitLod 33 37
+              39:   11(fvec4) VectorTimesScalar 38 23
+                              ReturnValue 39
+                              FunctionEnd
+      17(@main():   11(fvec4) Function None 16
+              18:             Label
+          42(os):     10(ptr) Variable Function
+       56(param):     10(ptr) Variable Function
+              45:           6 Load 44(gss2)
+              46:     29(ptr) AccessChain 42(os) 28
+                              Store 46 45
+              48:           6 Load 47(gss)
+              49:     29(ptr) AccessChain 42(os) 28
+                              Store 49 48
+              52:           8 Load 51(gtex)
+              53:     25(ptr) AccessChain 42(os) 24
+                              Store 53 52
+              55:     21(ptr) AccessChain 42(os) 20
+                              Store 55 54
+              57:       9(OS) Load 42(os)
+                              Store 56(param) 57
+              58:   11(fvec4) FunctionCall 14(osCall(struct-OS-p1-f1-t211;) 56(param)
+                              ReturnValue 58
+                              FunctionEnd
diff --git a/Test/baseResults/hlsl.amend.frag.out b/Test/baseResults/hlsl.amend.frag.out
old mode 100755
new mode 100644
index 7611af3..fa4ad03
--- a/Test/baseResults/hlsl.amend.frag.out
+++ b/Test/baseResults/hlsl.amend.frag.out
@@ -160,7 +160,7 @@
 0:?     'm' ( global 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 57
 
                               Capability Shader
@@ -184,9 +184,9 @@
                               Name 22  ""
                               MemberDecorate 20($Global) 0 Offset 0
                               MemberDecorate 20($Global) 1 Offset 16
-                              MemberDecorate 20($Global) 2 Offset 20
-                              MemberDecorate 20($Global) 3 Offset 32
-                              MemberDecorate 20($Global) 4 Offset 36
+                              MemberDecorate 20($Global) 2 Offset 32
+                              MemberDecorate 20($Global) 3 Offset 44
+                              MemberDecorate 20($Global) 4 Offset 48
                               Decorate 20($Global) Block
                               Decorate 22 DescriptorSet 0
                2:             TypeVoid
diff --git a/Test/baseResults/hlsl.array.flatten.frag.out b/Test/baseResults/hlsl.array.flatten.frag.out
index 7385cea..4c8609c 100644
--- a/Test/baseResults/hlsl.array.flatten.frag.out
+++ b/Test/baseResults/hlsl.array.flatten.frag.out
@@ -1,4 +1,5 @@
 hlsl.array.flatten.frag
+WARNING: AST will form illegal SPIR-V; need to transform to legalize
 Shader version: 500
 gl_FragCoord origin is upper left
 0:? Sequence
@@ -147,7 +148,7 @@
 0:?         'ps_output' ( temp structure{ temp 4-component vector of float color})
 0:31      Sequence
 0:31        move second child to first child ( temp 4-component vector of float)
-0:?           'color' (layout( location=0) out 4-component vector of float)
+0:?           'ps_output.color' (layout( location=0) out 4-component vector of float)
 0:31          color: direct index for structure ( temp 4-component vector of float)
 0:?             'ps_output' ( temp structure{ temp 4-component vector of float color})
 0:31            Constant:
@@ -167,7 +168,7 @@
 0:?     'g_samp_explicit[2]' (layout( binding=7) uniform sampler)
 0:?     'anon@0' (layout( row_major std140) uniform block{ uniform 4-element array of 3X3 matrix of float g_mats, layout( binding=10) uniform 4-element array of 3X3 matrix of float g_mats_explicit,  uniform 4-element array of float g_floats})
 0:?     'not_flattened_a' ( global 5-element array of int)
-0:?     'color' (layout( location=0) out 4-component vector of float)
+0:?     'ps_output.color' (layout( location=0) out 4-component vector of float)
 
 
 Linked fragment stage:
@@ -321,7 +322,7 @@
 0:?         'ps_output' ( temp structure{ temp 4-component vector of float color})
 0:31      Sequence
 0:31        move second child to first child ( temp 4-component vector of float)
-0:?           'color' (layout( location=0) out 4-component vector of float)
+0:?           'ps_output.color' (layout( location=0) out 4-component vector of float)
 0:31          color: direct index for structure ( temp 4-component vector of float)
 0:?             'ps_output' ( temp structure{ temp 4-component vector of float color})
 0:31            Constant:
@@ -341,17 +342,17 @@
 0:?     'g_samp_explicit[2]' (layout( binding=7) uniform sampler)
 0:?     'anon@0' (layout( row_major std140) uniform block{ uniform 4-element array of 3X3 matrix of float g_mats, layout( binding=10) uniform 4-element array of 3X3 matrix of float g_mats_explicit,  uniform 4-element array of float g_floats})
 0:?     'not_flattened_a' ( global 5-element array of int)
-0:?     'color' (layout( location=0) out 4-component vector of float)
+0:?     'ps_output.color' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80001
-// Id's are bound by 137
+// Generated by (magic number): 80007
+// Id's are bound by 143
 
                               Capability Shader
                               Capability Sampled1D
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "main" 128
+                              EntryPoint Fragment 4  "main" 134
                               ExecutionMode 4 OriginUpperLeft
                               Source HLSL 500
                               Name 4  "main"
@@ -366,60 +367,62 @@
                               Name 34  "not_flattened_a"
                               Name 42  "g_tex[1]"
                               Name 45  "g_samp[1]"
-                              Name 61  "local_sampler_array"
-                              Name 63  "g_samp[0]"
-                              Name 68  "g_samp[2]"
-                              Name 71  "local_texture_array"
-                              Name 72  "g_tex[0]"
-                              Name 77  "g_tex[2]"
-                              Name 83  "local_float_array"
-                              Name 89  "$Global"
-                              MemberName 89($Global) 0  "g_mats"
-                              MemberName 89($Global) 1  "g_mats_explicit"
-                              MemberName 89($Global) 2  "g_floats"
-                              Name 91  ""
-                              Name 105  "aggShadow"
-                              Name 112  "aggShadow"
-                              Name 123  "ps_output"
-                              Name 124  "param"
-                              Name 128  "color"
-                              Name 131  "g_tex_explicit[0]"
-                              Name 132  "g_tex_explicit[1]"
-                              Name 133  "g_tex_explicit[2]"
-                              Name 134  "g_samp_explicit[0]"
-                              Name 135  "g_samp_explicit[1]"
-                              Name 136  "g_samp_explicit[2]"
+                              Name 63  "local_sampler_array"
+                              Name 65  "g_samp[0]"
+                              Name 70  "g_samp[2]"
+                              Name 73  "local_texture_array"
+                              Name 74  "g_tex[0]"
+                              Name 79  "g_tex[2]"
+                              Name 85  "local_float_array"
+                              Name 91  "$Global"
+                              MemberName 91($Global) 0  "g_mats"
+                              MemberName 91($Global) 1  "g_mats_explicit"
+                              MemberName 91($Global) 2  "g_floats"
+                              Name 93  ""
+                              Name 107  "aggShadow"
+                              Name 114  "aggShadow"
+                              Name 121  "param"
+                              Name 123  "param"
+                              Name 129  "ps_output"
+                              Name 130  "param"
+                              Name 134  "ps_output.color"
+                              Name 137  "g_tex_explicit[0]"
+                              Name 138  "g_tex_explicit[1]"
+                              Name 139  "g_tex_explicit[2]"
+                              Name 140  "g_samp_explicit[0]"
+                              Name 141  "g_samp_explicit[1]"
+                              Name 142  "g_samp_explicit[2]"
                               Decorate 42(g_tex[1]) DescriptorSet 0
                               Decorate 45(g_samp[1]) DescriptorSet 0
-                              Decorate 63(g_samp[0]) DescriptorSet 0
-                              Decorate 68(g_samp[2]) DescriptorSet 0
-                              Decorate 72(g_tex[0]) DescriptorSet 0
-                              Decorate 77(g_tex[2]) DescriptorSet 0
-                              Decorate 86 ArrayStride 48
-                              Decorate 87 ArrayStride 48
-                              Decorate 88 ArrayStride 16
-                              MemberDecorate 89($Global) 0 RowMajor
-                              MemberDecorate 89($Global) 0 Offset 0
-                              MemberDecorate 89($Global) 0 MatrixStride 16
-                              MemberDecorate 89($Global) 1 RowMajor
-                              MemberDecorate 89($Global) 1 Offset 192
-                              MemberDecorate 89($Global) 1 MatrixStride 16
-                              MemberDecorate 89($Global) 2 Offset 384
-                              Decorate 89($Global) Block
-                              Decorate 91 DescriptorSet 0
-                              Decorate 128(color) Location 0
-                              Decorate 131(g_tex_explicit[0]) DescriptorSet 0
-                              Decorate 131(g_tex_explicit[0]) Binding 1
-                              Decorate 132(g_tex_explicit[1]) DescriptorSet 0
-                              Decorate 132(g_tex_explicit[1]) Binding 2
-                              Decorate 133(g_tex_explicit[2]) DescriptorSet 0
-                              Decorate 133(g_tex_explicit[2]) Binding 3
-                              Decorate 134(g_samp_explicit[0]) DescriptorSet 0
-                              Decorate 134(g_samp_explicit[0]) Binding 5
-                              Decorate 135(g_samp_explicit[1]) DescriptorSet 0
-                              Decorate 135(g_samp_explicit[1]) Binding 6
-                              Decorate 136(g_samp_explicit[2]) DescriptorSet 0
-                              Decorate 136(g_samp_explicit[2]) Binding 7
+                              Decorate 65(g_samp[0]) DescriptorSet 0
+                              Decorate 70(g_samp[2]) DescriptorSet 0
+                              Decorate 74(g_tex[0]) DescriptorSet 0
+                              Decorate 79(g_tex[2]) DescriptorSet 0
+                              Decorate 88 ArrayStride 48
+                              Decorate 89 ArrayStride 48
+                              Decorate 90 ArrayStride 16
+                              MemberDecorate 91($Global) 0 RowMajor
+                              MemberDecorate 91($Global) 0 Offset 0
+                              MemberDecorate 91($Global) 0 MatrixStride 16
+                              MemberDecorate 91($Global) 1 RowMajor
+                              MemberDecorate 91($Global) 1 Offset 192
+                              MemberDecorate 91($Global) 1 MatrixStride 16
+                              MemberDecorate 91($Global) 2 Offset 384
+                              Decorate 91($Global) Block
+                              Decorate 93 DescriptorSet 0
+                              Decorate 134(ps_output.color) Location 0
+                              Decorate 137(g_tex_explicit[0]) DescriptorSet 0
+                              Decorate 137(g_tex_explicit[0]) Binding 1
+                              Decorate 138(g_tex_explicit[1]) DescriptorSet 0
+                              Decorate 138(g_tex_explicit[1]) Binding 2
+                              Decorate 139(g_tex_explicit[2]) DescriptorSet 0
+                              Decorate 139(g_tex_explicit[2]) Binding 3
+                              Decorate 140(g_samp_explicit[0]) DescriptorSet 0
+                              Decorate 140(g_samp_explicit[0]) Binding 5
+                              Decorate 141(g_samp_explicit[1]) DescriptorSet 0
+                              Decorate 141(g_samp_explicit[1]) Binding 6
+                              Decorate 142(g_samp_explicit[2]) DescriptorSet 0
+                              Decorate 142(g_samp_explicit[2]) Binding 7
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -429,10 +432,10 @@
               12:             TypeInt 32 0
               13:     12(int) Constant 3
               14:             TypeArray 11 13
-              15:             TypePointer UniformConstant 14
+              15:             TypePointer Function 14
               16:             TypeSampler
               17:             TypeArray 16 13
-              18:             TypePointer UniformConstant 17
+              18:             TypePointer Function 17
               19:             TypeFunction 7(fvec4) 15(ptr) 18(ptr)
    24(PS_OUTPUT):             TypeStruct 7(fvec4)
               25:             TypePointer Function 24(PS_OUTPUT)
@@ -454,48 +457,46 @@
    45(g_samp[1]):     44(ptr) Variable UniformConstant
               47:             TypeSampledImage 11
               49:    6(float) Constant 1045220557
-61(local_sampler_array):     18(ptr) Variable UniformConstant
-              62:     30(int) Constant 0
-   63(g_samp[0]):     44(ptr) Variable UniformConstant
-   68(g_samp[2]):     44(ptr) Variable UniformConstant
-71(local_texture_array):     15(ptr) Variable UniformConstant
-    72(g_tex[0]):     41(ptr) Variable UniformConstant
-    77(g_tex[2]):     41(ptr) Variable UniformConstant
-              80:     12(int) Constant 4
-              81:             TypeArray 6(float) 80
-              82:             TypePointer Function 81
-              84:             TypeVector 6(float) 3
-              85:             TypeMatrix 84(fvec3) 3
-              86:             TypeArray 85 80
-              87:             TypeArray 85 80
-              88:             TypeArray 6(float) 80
-     89($Global):             TypeStruct 86 87 88
-              90:             TypePointer Uniform 89($Global)
-              91:     90(ptr) Variable Uniform
-              92:             TypePointer Uniform 88
-              96:             TypePointer Function 6(float)
-  105(aggShadow):     15(ptr) Variable UniformConstant
-  112(aggShadow):     18(ptr) Variable UniformConstant
-             121:             TypePointer Function 7(fvec4)
-             127:             TypePointer Output 7(fvec4)
-      128(color):    127(ptr) Variable Output
-131(g_tex_explicit[0]):     41(ptr) Variable UniformConstant
-132(g_tex_explicit[1]):     41(ptr) Variable UniformConstant
-133(g_tex_explicit[2]):     41(ptr) Variable UniformConstant
-134(g_samp_explicit[0]):     44(ptr) Variable UniformConstant
-135(g_samp_explicit[1]):     44(ptr) Variable UniformConstant
-136(g_samp_explicit[2]):     44(ptr) Variable UniformConstant
+              53:             TypePointer Function 11
+              56:             TypePointer Function 16
+              64:     30(int) Constant 0
+   65(g_samp[0]):     44(ptr) Variable UniformConstant
+   70(g_samp[2]):     44(ptr) Variable UniformConstant
+    74(g_tex[0]):     41(ptr) Variable UniformConstant
+    79(g_tex[2]):     41(ptr) Variable UniformConstant
+              82:     12(int) Constant 4
+              83:             TypeArray 6(float) 82
+              84:             TypePointer Function 83
+              86:             TypeVector 6(float) 3
+              87:             TypeMatrix 86(fvec3) 3
+              88:             TypeArray 87 82
+              89:             TypeArray 87 82
+              90:             TypeArray 6(float) 82
+     91($Global):             TypeStruct 88 89 90
+              92:             TypePointer Uniform 91($Global)
+              93:     92(ptr) Variable Uniform
+              94:             TypePointer Uniform 90
+              98:             TypePointer Function 6(float)
+             127:             TypePointer Function 7(fvec4)
+             133:             TypePointer Output 7(fvec4)
+134(ps_output.color):    133(ptr) Variable Output
+137(g_tex_explicit[0]):     41(ptr) Variable UniformConstant
+138(g_tex_explicit[1]):     41(ptr) Variable UniformConstant
+139(g_tex_explicit[2]):     41(ptr) Variable UniformConstant
+140(g_samp_explicit[0]):     44(ptr) Variable UniformConstant
+141(g_samp_explicit[1]):     44(ptr) Variable UniformConstant
+142(g_samp_explicit[2]):     44(ptr) Variable UniformConstant
          4(main):           2 Function None 3
                5:             Label
-  123(ps_output):     25(ptr) Variable Function
-      124(param):     25(ptr) Variable Function
+  129(ps_output):     25(ptr) Variable Function
+      130(param):     25(ptr) Variable Function
                               Store 34(not_flattened_a) 40
-             125:           2 FunctionCall 28(@main(struct-PS_OUTPUT-vf41;) 124(param)
-             126:24(PS_OUTPUT) Load 124(param)
-                              Store 123(ps_output) 126
-             129:    121(ptr) AccessChain 123(ps_output) 62
-             130:    7(fvec4) Load 129
-                              Store 128(color) 130
+             131:           2 FunctionCall 28(@main(struct-PS_OUTPUT-vf41;) 130(param)
+             132:24(PS_OUTPUT) Load 130(param)
+                              Store 129(ps_output) 132
+             135:    127(ptr) AccessChain 129(ps_output) 64
+             136:    7(fvec4) Load 135
+                              Store 134(ps_output.color) 136
                               Return
                               FunctionEnd
      9(TestFn1():    7(fvec4) Function None 8
@@ -510,72 +511,82 @@
        20(l_tex):     15(ptr) FunctionParameter
       21(l_samp):     18(ptr) FunctionParameter
               23:             Label
-              53:     41(ptr) AccessChain 20(l_tex) 36
-              54:          11 Load 53
-              55:     44(ptr) AccessChain 21(l_samp) 36
-              56:          16 Load 55
-              57:          47 SampledImage 54 56
-              58:    7(fvec4) ImageSampleImplicitLod 57 49
-                              ReturnValue 58
+              54:     53(ptr) AccessChain 20(l_tex) 36
+              55:          11 Load 54
+              57:     56(ptr) AccessChain 21(l_samp) 36
+              58:          16 Load 57
+              59:          47 SampledImage 55 58
+              60:    7(fvec4) ImageSampleImplicitLod 59 49
+                              ReturnValue 60
                               FunctionEnd
 28(@main(struct-PS_OUTPUT-vf41;):           2 Function None 26
    27(ps_output):     25(ptr) FunctionParameter
               29:             Label
-83(local_float_array):     82(ptr) Variable Function
-              64:          16 Load 63(g_samp[0])
-              65:     44(ptr) AccessChain 61(local_sampler_array) 62
-                              Store 65 64
-              66:          16 Load 45(g_samp[1])
-              67:     44(ptr) AccessChain 61(local_sampler_array) 35
+63(local_sampler_array):     18(ptr) Variable Function
+73(local_texture_array):     15(ptr) Variable Function
+85(local_float_array):     84(ptr) Variable Function
+  107(aggShadow):     15(ptr) Variable Function
+  114(aggShadow):     18(ptr) Variable Function
+      121(param):     15(ptr) Variable Function
+      123(param):     18(ptr) Variable Function
+              66:          16 Load 65(g_samp[0])
+              67:     56(ptr) AccessChain 63(local_sampler_array) 64
                               Store 67 66
-              69:          16 Load 68(g_samp[2])
-              70:     44(ptr) AccessChain 61(local_sampler_array) 36
-                              Store 70 69
-              73:          11 Load 72(g_tex[0])
-              74:     41(ptr) AccessChain 71(local_texture_array) 62
-                              Store 74 73
-              75:          11 Load 42(g_tex[1])
-              76:     41(ptr) AccessChain 71(local_texture_array) 35
+              68:          16 Load 45(g_samp[1])
+              69:     56(ptr) AccessChain 63(local_sampler_array) 35
+                              Store 69 68
+              71:          16 Load 70(g_samp[2])
+              72:     56(ptr) AccessChain 63(local_sampler_array) 36
+                              Store 72 71
+              75:          11 Load 74(g_tex[0])
+              76:     53(ptr) AccessChain 73(local_texture_array) 64
                               Store 76 75
-              78:          11 Load 77(g_tex[2])
-              79:     41(ptr) AccessChain 71(local_texture_array) 36
-                              Store 79 78
-              93:     92(ptr) AccessChain 91 36
-              94:          88 Load 93
-              95:    6(float) CompositeExtract 94 0
-              97:     96(ptr) AccessChain 83(local_float_array) 62
-                              Store 97 95
-              98:    6(float) CompositeExtract 94 1
-              99:     96(ptr) AccessChain 83(local_float_array) 35
-                              Store 99 98
-             100:    6(float) CompositeExtract 94 2
-             101:     96(ptr) AccessChain 83(local_float_array) 36
+              77:          11 Load 42(g_tex[1])
+              78:     53(ptr) AccessChain 73(local_texture_array) 35
+                              Store 78 77
+              80:          11 Load 79(g_tex[2])
+              81:     53(ptr) AccessChain 73(local_texture_array) 36
+                              Store 81 80
+              95:     94(ptr) AccessChain 93 36
+              96:          90 Load 95
+              97:    6(float) CompositeExtract 96 0
+              99:     98(ptr) AccessChain 85(local_float_array) 64
+                              Store 99 97
+             100:    6(float) CompositeExtract 96 1
+             101:     98(ptr) AccessChain 85(local_float_array) 35
                               Store 101 100
-             102:    6(float) CompositeExtract 94 3
-             103:     96(ptr) AccessChain 83(local_float_array) 37
+             102:    6(float) CompositeExtract 96 2
+             103:     98(ptr) AccessChain 85(local_float_array) 36
                               Store 103 102
-             104:    7(fvec4) FunctionCall 9(TestFn1()
-             106:          11 Load 72(g_tex[0])
-             107:     41(ptr) AccessChain 105(aggShadow) 62
-                              Store 107 106
-             108:          11 Load 42(g_tex[1])
-             109:     41(ptr) AccessChain 105(aggShadow) 35
+             104:    6(float) CompositeExtract 96 3
+             105:     98(ptr) AccessChain 85(local_float_array) 37
+                              Store 105 104
+             106:    7(fvec4) FunctionCall 9(TestFn1()
+             108:          11 Load 74(g_tex[0])
+             109:     53(ptr) AccessChain 107(aggShadow) 64
                               Store 109 108
-             110:          11 Load 77(g_tex[2])
-             111:     41(ptr) AccessChain 105(aggShadow) 36
+             110:          11 Load 42(g_tex[1])
+             111:     53(ptr) AccessChain 107(aggShadow) 35
                               Store 111 110
-             113:          16 Load 63(g_samp[0])
-             114:     44(ptr) AccessChain 112(aggShadow) 62
-                              Store 114 113
-             115:          16 Load 45(g_samp[1])
-             116:     44(ptr) AccessChain 112(aggShadow) 35
+             112:          11 Load 79(g_tex[2])
+             113:     53(ptr) AccessChain 107(aggShadow) 36
+                              Store 113 112
+             115:          16 Load 65(g_samp[0])
+             116:     56(ptr) AccessChain 114(aggShadow) 64
                               Store 116 115
-             117:          16 Load 68(g_samp[2])
-             118:     44(ptr) AccessChain 112(aggShadow) 36
+             117:          16 Load 45(g_samp[1])
+             118:     56(ptr) AccessChain 114(aggShadow) 35
                               Store 118 117
-             119:    7(fvec4) FunctionCall 22(TestFn2(t11[3];p1[3];) 105(aggShadow) 112(aggShadow)
-             120:    7(fvec4) FAdd 104 119
-             122:    121(ptr) AccessChain 27(ps_output) 62
-                              Store 122 120
+             119:          16 Load 70(g_samp[2])
+             120:     56(ptr) AccessChain 114(aggShadow) 36
+                              Store 120 119
+             122:          14 Load 107(aggShadow)
+                              Store 121(param) 122
+             124:          17 Load 114(aggShadow)
+                              Store 123(param) 124
+             125:    7(fvec4) FunctionCall 22(TestFn2(t11[3];p1[3];) 121(param) 123(param)
+             126:    7(fvec4) FAdd 106 125
+             128:    127(ptr) AccessChain 27(ps_output) 64
+                              Store 128 126
                               Return
                               FunctionEnd
diff --git a/Test/baseResults/hlsl.array.frag.out b/Test/baseResults/hlsl.array.frag.out
old mode 100755
new mode 100644
index c0c5a13..0f68e7c
--- a/Test/baseResults/hlsl.array.frag.out
+++ b/Test/baseResults/hlsl.array.frag.out
@@ -2,74 +2,144 @@
 Shader version: 500
 gl_FragCoord origin is upper left
 0:? Sequence
-0:8  Function Definition: @PixelShaderFunction(i1;vf4[3]; ( temp 4-component vector of float)
-0:8    Function Parameters: 
-0:8      'i' ( in int)
-0:8      'input' ( in 3-element array of 4-component vector of float)
+0:7  Sequence
+0:7    move second child to first child ( temp 4-component vector of float)
+0:7      'C' ( global 4-component vector of float)
+0:?       Constant:
+0:?         1.000000
+0:?         2.000000
+0:?         3.000000
+0:?         4.000000
+0:11  Sequence
+0:11    move second child to first child ( temp 2-element array of 4-component vector of float)
+0:11      'c2' ( global 2-element array of 4-component vector of float)
+0:11      Construct vec4 ( temp 2-element array of 4-component vector of float)
+0:11        'C' ( global 4-component vector of float)
+0:?         Constant:
+0:?           1.000000
+0:?           2.000000
+0:?           3.000000
+0:?           4.000000
+0:14  Function Definition: @PixelShaderFunction(i1;vf4[3]; ( temp 4-component vector of float)
+0:14    Function Parameters: 
+0:14      'i' ( in int)
+0:14      'input' ( in 3-element array of 4-component vector of float)
 0:?     Sequence
-0:10      Branch: Return with expression
-0:10        add ( temp 4-component vector of float)
-0:10          add ( temp 4-component vector of float)
-0:10            add ( temp 4-component vector of float)
-0:10              add ( temp 4-component vector of float)
-0:10                add ( temp 4-component vector of float)
-0:10                  add ( temp 4-component vector of float)
-0:10                    direct index ( temp 4-component vector of float)
-0:10                      a: direct index for structure ( uniform 4-element array of 4-component vector of float)
-0:10                        'anon@0' (layout( row_major std140) uniform block{ uniform 4-element array of 4-component vector of float a,  uniform 11-element array of structure{ temp 7-element array of 4-component vector of float m} s})
-0:10                        Constant:
-0:10                          0 (const uint)
-0:10                      Constant:
-0:10                        1 (const int)
-0:10                    indirect index ( temp 4-component vector of float)
-0:10                      a: direct index for structure ( uniform 4-element array of 4-component vector of float)
-0:10                        'anon@0' (layout( row_major std140) uniform block{ uniform 4-element array of 4-component vector of float a,  uniform 11-element array of structure{ temp 7-element array of 4-component vector of float m} s})
-0:10                        Constant:
-0:10                          0 (const uint)
-0:10                      'i' ( in int)
-0:10                  direct index ( temp 4-component vector of float)
-0:10                    'input' ( in 3-element array of 4-component vector of float)
-0:10                    Constant:
-0:10                      2 (const int)
-0:10                indirect index ( temp 4-component vector of float)
-0:10                  'input' ( in 3-element array of 4-component vector of float)
-0:10                  'i' ( in int)
-0:10              direct index ( temp 4-component vector of float)
-0:10                'b' ( temp 10-element array of 4-component vector of float)
-0:10                Constant:
-0:10                  5 (const int)
-0:10            indirect index ( temp 4-component vector of float)
-0:10              'b' ( temp 10-element array of 4-component vector of float)
-0:10              'i' ( in int)
-0:10          indirect index ( temp 4-component vector of float)
-0:10            m: direct index for structure ( temp 7-element array of 4-component vector of float)
-0:10              indirect index ( temp structure{ temp 7-element array of 4-component vector of float m})
-0:10                s: direct index for structure ( uniform 11-element array of structure{ temp 7-element array of 4-component vector of float m})
-0:10                  'anon@0' (layout( row_major std140) uniform block{ uniform 4-element array of 4-component vector of float a,  uniform 11-element array of structure{ temp 7-element array of 4-component vector of float m} s})
-0:10                  Constant:
-0:10                    1 (const uint)
-0:10                'i' ( in int)
-0:10              Constant:
-0:10                0 (const int)
-0:10            'i' ( in int)
-0:8  Function Definition: PixelShaderFunction( ( temp void)
-0:8    Function Parameters: 
+0:15      Sequence
+0:15        move second child to first child ( temp 10-element array of 4-component vector of float)
+0:15          'b' ( temp 10-element array of 4-component vector of float)
+0:15          Construct vec4 ( temp 10-element array of 4-component vector of float)
+0:15            'C' ( global 4-component vector of float)
+0:15            'C' ( global 4-component vector of float)
+0:15            'C' ( global 4-component vector of float)
+0:15            'C' ( global 4-component vector of float)
+0:15            'C' ( global 4-component vector of float)
+0:15            'C' ( global 4-component vector of float)
+0:15            'C' ( global 4-component vector of float)
+0:15            'C' ( global 4-component vector of float)
+0:15            'C' ( global 4-component vector of float)
+0:15            'C' ( global 4-component vector of float)
+0:16      Sequence
+0:16        move second child to first child ( temp 4-component vector of float)
+0:16          'tmp' ( temp 4-component vector of float)
+0:16          add ( temp 4-component vector of float)
+0:16            add ( temp 4-component vector of float)
+0:16              add ( temp 4-component vector of float)
+0:16                add ( temp 4-component vector of float)
+0:16                  'C' ( global 4-component vector of float)
+0:16                  direct index ( temp 4-component vector of float)
+0:16                    a1: direct index for structure ( uniform 1-element array of 4-component vector of float)
+0:16                      'anon@0' (layout( row_major std140) uniform block{ uniform 4-element array of 4-component vector of float a,  uniform 11-element array of structure{ temp 7-element array of 4-component vector of float m} s,  uniform 1-element array of 4-component vector of float a1,  uniform 2-element array of 4-component vector of float a2})
+0:16                      Constant:
+0:16                        2 (const uint)
+0:16                    Constant:
+0:16                      0 (const int)
+0:16                Constant:
+0:16                  1.000000
+0:16                  2.000000
+0:16                  3.000000
+0:16                  4.000000
+0:16              indirect index ( temp 4-component vector of float)
+0:16                a2: direct index for structure ( uniform 2-element array of 4-component vector of float)
+0:16                  'anon@0' (layout( row_major std140) uniform block{ uniform 4-element array of 4-component vector of float a,  uniform 11-element array of structure{ temp 7-element array of 4-component vector of float m} s,  uniform 1-element array of 4-component vector of float a1,  uniform 2-element array of 4-component vector of float a2})
+0:16                  Constant:
+0:16                    3 (const uint)
+0:16                'i' ( in int)
+0:16            indirect index ( temp 4-component vector of float)
+0:16              'c2' ( global 2-element array of 4-component vector of float)
+0:16              'i' ( in int)
+0:17      Branch: Return with expression
+0:17        add ( temp 4-component vector of float)
+0:17          add ( temp 4-component vector of float)
+0:17            add ( temp 4-component vector of float)
+0:17              add ( temp 4-component vector of float)
+0:17                add ( temp 4-component vector of float)
+0:17                  add ( temp 4-component vector of float)
+0:17                    add ( temp 4-component vector of float)
+0:17                      direct index ( temp 4-component vector of float)
+0:17                        a: direct index for structure ( uniform 4-element array of 4-component vector of float)
+0:17                          'anon@0' (layout( row_major std140) uniform block{ uniform 4-element array of 4-component vector of float a,  uniform 11-element array of structure{ temp 7-element array of 4-component vector of float m} s,  uniform 1-element array of 4-component vector of float a1,  uniform 2-element array of 4-component vector of float a2})
+0:17                          Constant:
+0:17                            0 (const uint)
+0:17                        Constant:
+0:17                          1 (const int)
+0:17                      indirect index ( temp 4-component vector of float)
+0:17                        a: direct index for structure ( uniform 4-element array of 4-component vector of float)
+0:17                          'anon@0' (layout( row_major std140) uniform block{ uniform 4-element array of 4-component vector of float a,  uniform 11-element array of structure{ temp 7-element array of 4-component vector of float m} s,  uniform 1-element array of 4-component vector of float a1,  uniform 2-element array of 4-component vector of float a2})
+0:17                          Constant:
+0:17                            0 (const uint)
+0:17                        'i' ( in int)
+0:17                    direct index ( temp 4-component vector of float)
+0:17                      'input' ( in 3-element array of 4-component vector of float)
+0:17                      Constant:
+0:17                        2 (const int)
+0:17                  indirect index ( temp 4-component vector of float)
+0:17                    'input' ( in 3-element array of 4-component vector of float)
+0:17                    'i' ( in int)
+0:17                direct index ( temp 4-component vector of float)
+0:17                  'b' ( temp 10-element array of 4-component vector of float)
+0:17                  Constant:
+0:17                    5 (const int)
+0:17              indirect index ( temp 4-component vector of float)
+0:17                'b' ( temp 10-element array of 4-component vector of float)
+0:17                'i' ( in int)
+0:17            indirect index ( temp 4-component vector of float)
+0:17              m: direct index for structure ( temp 7-element array of 4-component vector of float)
+0:17                indirect index ( temp structure{ temp 7-element array of 4-component vector of float m})
+0:17                  s: direct index for structure ( uniform 11-element array of structure{ temp 7-element array of 4-component vector of float m})
+0:17                    'anon@0' (layout( row_major std140) uniform block{ uniform 4-element array of 4-component vector of float a,  uniform 11-element array of structure{ temp 7-element array of 4-component vector of float m} s,  uniform 1-element array of 4-component vector of float a1,  uniform 2-element array of 4-component vector of float a2})
+0:17                    Constant:
+0:17                      1 (const uint)
+0:17                  'i' ( in int)
+0:17                Constant:
+0:17                  0 (const int)
+0:17              'i' ( in int)
+0:17          'tmp' ( temp 4-component vector of float)
+0:14  Function Definition: PixelShaderFunction( ( temp void)
+0:14    Function Parameters: 
 0:?     Sequence
-0:8      move second child to first child ( temp int)
+0:14      move second child to first child ( temp int)
 0:?         'i' ( temp int)
-0:?         'i' (layout( location=0) in int)
-0:8      move second child to first child ( temp 3-element array of 4-component vector of float)
+0:?         'i' (layout( location=0) flat in int)
+0:14      move second child to first child ( temp 3-element array of 4-component vector of float)
 0:?         'input' ( temp 3-element array of 4-component vector of float)
 0:?         'input' (layout( location=1) in 3-element array of 4-component vector of float)
-0:8      move second child to first child ( temp 4-component vector of float)
+0:14      move second child to first child ( temp 4-component vector of float)
 0:?         '@entryPointOutput' (layout( location=0) out 4-component vector of float)
-0:8        Function Call: @PixelShaderFunction(i1;vf4[3]; ( temp 4-component vector of float)
+0:14        Function Call: @PixelShaderFunction(i1;vf4[3]; ( temp 4-component vector of float)
 0:?           'i' ( temp int)
 0:?           'input' ( temp 3-element array of 4-component vector of float)
 0:?   Linker Objects
-0:?     'anon@0' (layout( row_major std140) uniform block{ uniform 4-element array of 4-component vector of float a,  uniform 11-element array of structure{ temp 7-element array of 4-component vector of float m} s})
+0:?     'anon@0' (layout( row_major std140) uniform block{ uniform 4-element array of 4-component vector of float a,  uniform 11-element array of structure{ temp 7-element array of 4-component vector of float m} s,  uniform 1-element array of 4-component vector of float a1,  uniform 2-element array of 4-component vector of float a2})
+0:?     'C' ( global 4-component vector of float)
+0:?     'c1' ( const 1-element array of 4-component vector of float)
+0:?       1.000000
+0:?       2.000000
+0:?       3.000000
+0:?       4.000000
+0:?     'c2' ( global 2-element array of 4-component vector of float)
 0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
-0:?     'i' (layout( location=0) in int)
+0:?     'i' (layout( location=0) flat in int)
 0:?     'input' (layout( location=1) in 3-element array of 4-component vector of float)
 
 
@@ -79,115 +149,195 @@
 Shader version: 500
 gl_FragCoord origin is upper left
 0:? Sequence
-0:8  Function Definition: @PixelShaderFunction(i1;vf4[3]; ( temp 4-component vector of float)
-0:8    Function Parameters: 
-0:8      'i' ( in int)
-0:8      'input' ( in 3-element array of 4-component vector of float)
+0:7  Sequence
+0:7    move second child to first child ( temp 4-component vector of float)
+0:7      'C' ( global 4-component vector of float)
+0:?       Constant:
+0:?         1.000000
+0:?         2.000000
+0:?         3.000000
+0:?         4.000000
+0:11  Sequence
+0:11    move second child to first child ( temp 2-element array of 4-component vector of float)
+0:11      'c2' ( global 2-element array of 4-component vector of float)
+0:11      Construct vec4 ( temp 2-element array of 4-component vector of float)
+0:11        'C' ( global 4-component vector of float)
+0:?         Constant:
+0:?           1.000000
+0:?           2.000000
+0:?           3.000000
+0:?           4.000000
+0:14  Function Definition: @PixelShaderFunction(i1;vf4[3]; ( temp 4-component vector of float)
+0:14    Function Parameters: 
+0:14      'i' ( in int)
+0:14      'input' ( in 3-element array of 4-component vector of float)
 0:?     Sequence
-0:10      Branch: Return with expression
-0:10        add ( temp 4-component vector of float)
-0:10          add ( temp 4-component vector of float)
-0:10            add ( temp 4-component vector of float)
-0:10              add ( temp 4-component vector of float)
-0:10                add ( temp 4-component vector of float)
-0:10                  add ( temp 4-component vector of float)
-0:10                    direct index ( temp 4-component vector of float)
-0:10                      a: direct index for structure ( uniform 4-element array of 4-component vector of float)
-0:10                        'anon@0' (layout( row_major std140) uniform block{ uniform 4-element array of 4-component vector of float a,  uniform 11-element array of structure{ temp 7-element array of 4-component vector of float m} s})
-0:10                        Constant:
-0:10                          0 (const uint)
-0:10                      Constant:
-0:10                        1 (const int)
-0:10                    indirect index ( temp 4-component vector of float)
-0:10                      a: direct index for structure ( uniform 4-element array of 4-component vector of float)
-0:10                        'anon@0' (layout( row_major std140) uniform block{ uniform 4-element array of 4-component vector of float a,  uniform 11-element array of structure{ temp 7-element array of 4-component vector of float m} s})
-0:10                        Constant:
-0:10                          0 (const uint)
-0:10                      'i' ( in int)
-0:10                  direct index ( temp 4-component vector of float)
-0:10                    'input' ( in 3-element array of 4-component vector of float)
-0:10                    Constant:
-0:10                      2 (const int)
-0:10                indirect index ( temp 4-component vector of float)
-0:10                  'input' ( in 3-element array of 4-component vector of float)
-0:10                  'i' ( in int)
-0:10              direct index ( temp 4-component vector of float)
-0:10                'b' ( temp 10-element array of 4-component vector of float)
-0:10                Constant:
-0:10                  5 (const int)
-0:10            indirect index ( temp 4-component vector of float)
-0:10              'b' ( temp 10-element array of 4-component vector of float)
-0:10              'i' ( in int)
-0:10          indirect index ( temp 4-component vector of float)
-0:10            m: direct index for structure ( temp 7-element array of 4-component vector of float)
-0:10              indirect index ( temp structure{ temp 7-element array of 4-component vector of float m})
-0:10                s: direct index for structure ( uniform 11-element array of structure{ temp 7-element array of 4-component vector of float m})
-0:10                  'anon@0' (layout( row_major std140) uniform block{ uniform 4-element array of 4-component vector of float a,  uniform 11-element array of structure{ temp 7-element array of 4-component vector of float m} s})
-0:10                  Constant:
-0:10                    1 (const uint)
-0:10                'i' ( in int)
-0:10              Constant:
-0:10                0 (const int)
-0:10            'i' ( in int)
-0:8  Function Definition: PixelShaderFunction( ( temp void)
-0:8    Function Parameters: 
+0:15      Sequence
+0:15        move second child to first child ( temp 10-element array of 4-component vector of float)
+0:15          'b' ( temp 10-element array of 4-component vector of float)
+0:15          Construct vec4 ( temp 10-element array of 4-component vector of float)
+0:15            'C' ( global 4-component vector of float)
+0:15            'C' ( global 4-component vector of float)
+0:15            'C' ( global 4-component vector of float)
+0:15            'C' ( global 4-component vector of float)
+0:15            'C' ( global 4-component vector of float)
+0:15            'C' ( global 4-component vector of float)
+0:15            'C' ( global 4-component vector of float)
+0:15            'C' ( global 4-component vector of float)
+0:15            'C' ( global 4-component vector of float)
+0:15            'C' ( global 4-component vector of float)
+0:16      Sequence
+0:16        move second child to first child ( temp 4-component vector of float)
+0:16          'tmp' ( temp 4-component vector of float)
+0:16          add ( temp 4-component vector of float)
+0:16            add ( temp 4-component vector of float)
+0:16              add ( temp 4-component vector of float)
+0:16                add ( temp 4-component vector of float)
+0:16                  'C' ( global 4-component vector of float)
+0:16                  direct index ( temp 4-component vector of float)
+0:16                    a1: direct index for structure ( uniform 1-element array of 4-component vector of float)
+0:16                      'anon@0' (layout( row_major std140) uniform block{ uniform 4-element array of 4-component vector of float a,  uniform 11-element array of structure{ temp 7-element array of 4-component vector of float m} s,  uniform 1-element array of 4-component vector of float a1,  uniform 2-element array of 4-component vector of float a2})
+0:16                      Constant:
+0:16                        2 (const uint)
+0:16                    Constant:
+0:16                      0 (const int)
+0:16                Constant:
+0:16                  1.000000
+0:16                  2.000000
+0:16                  3.000000
+0:16                  4.000000
+0:16              indirect index ( temp 4-component vector of float)
+0:16                a2: direct index for structure ( uniform 2-element array of 4-component vector of float)
+0:16                  'anon@0' (layout( row_major std140) uniform block{ uniform 4-element array of 4-component vector of float a,  uniform 11-element array of structure{ temp 7-element array of 4-component vector of float m} s,  uniform 1-element array of 4-component vector of float a1,  uniform 2-element array of 4-component vector of float a2})
+0:16                  Constant:
+0:16                    3 (const uint)
+0:16                'i' ( in int)
+0:16            indirect index ( temp 4-component vector of float)
+0:16              'c2' ( global 2-element array of 4-component vector of float)
+0:16              'i' ( in int)
+0:17      Branch: Return with expression
+0:17        add ( temp 4-component vector of float)
+0:17          add ( temp 4-component vector of float)
+0:17            add ( temp 4-component vector of float)
+0:17              add ( temp 4-component vector of float)
+0:17                add ( temp 4-component vector of float)
+0:17                  add ( temp 4-component vector of float)
+0:17                    add ( temp 4-component vector of float)
+0:17                      direct index ( temp 4-component vector of float)
+0:17                        a: direct index for structure ( uniform 4-element array of 4-component vector of float)
+0:17                          'anon@0' (layout( row_major std140) uniform block{ uniform 4-element array of 4-component vector of float a,  uniform 11-element array of structure{ temp 7-element array of 4-component vector of float m} s,  uniform 1-element array of 4-component vector of float a1,  uniform 2-element array of 4-component vector of float a2})
+0:17                          Constant:
+0:17                            0 (const uint)
+0:17                        Constant:
+0:17                          1 (const int)
+0:17                      indirect index ( temp 4-component vector of float)
+0:17                        a: direct index for structure ( uniform 4-element array of 4-component vector of float)
+0:17                          'anon@0' (layout( row_major std140) uniform block{ uniform 4-element array of 4-component vector of float a,  uniform 11-element array of structure{ temp 7-element array of 4-component vector of float m} s,  uniform 1-element array of 4-component vector of float a1,  uniform 2-element array of 4-component vector of float a2})
+0:17                          Constant:
+0:17                            0 (const uint)
+0:17                        'i' ( in int)
+0:17                    direct index ( temp 4-component vector of float)
+0:17                      'input' ( in 3-element array of 4-component vector of float)
+0:17                      Constant:
+0:17                        2 (const int)
+0:17                  indirect index ( temp 4-component vector of float)
+0:17                    'input' ( in 3-element array of 4-component vector of float)
+0:17                    'i' ( in int)
+0:17                direct index ( temp 4-component vector of float)
+0:17                  'b' ( temp 10-element array of 4-component vector of float)
+0:17                  Constant:
+0:17                    5 (const int)
+0:17              indirect index ( temp 4-component vector of float)
+0:17                'b' ( temp 10-element array of 4-component vector of float)
+0:17                'i' ( in int)
+0:17            indirect index ( temp 4-component vector of float)
+0:17              m: direct index for structure ( temp 7-element array of 4-component vector of float)
+0:17                indirect index ( temp structure{ temp 7-element array of 4-component vector of float m})
+0:17                  s: direct index for structure ( uniform 11-element array of structure{ temp 7-element array of 4-component vector of float m})
+0:17                    'anon@0' (layout( row_major std140) uniform block{ uniform 4-element array of 4-component vector of float a,  uniform 11-element array of structure{ temp 7-element array of 4-component vector of float m} s,  uniform 1-element array of 4-component vector of float a1,  uniform 2-element array of 4-component vector of float a2})
+0:17                    Constant:
+0:17                      1 (const uint)
+0:17                  'i' ( in int)
+0:17                Constant:
+0:17                  0 (const int)
+0:17              'i' ( in int)
+0:17          'tmp' ( temp 4-component vector of float)
+0:14  Function Definition: PixelShaderFunction( ( temp void)
+0:14    Function Parameters: 
 0:?     Sequence
-0:8      move second child to first child ( temp int)
+0:14      move second child to first child ( temp int)
 0:?         'i' ( temp int)
-0:?         'i' (layout( location=0) in int)
-0:8      move second child to first child ( temp 3-element array of 4-component vector of float)
+0:?         'i' (layout( location=0) flat in int)
+0:14      move second child to first child ( temp 3-element array of 4-component vector of float)
 0:?         'input' ( temp 3-element array of 4-component vector of float)
 0:?         'input' (layout( location=1) in 3-element array of 4-component vector of float)
-0:8      move second child to first child ( temp 4-component vector of float)
+0:14      move second child to first child ( temp 4-component vector of float)
 0:?         '@entryPointOutput' (layout( location=0) out 4-component vector of float)
-0:8        Function Call: @PixelShaderFunction(i1;vf4[3]; ( temp 4-component vector of float)
+0:14        Function Call: @PixelShaderFunction(i1;vf4[3]; ( temp 4-component vector of float)
 0:?           'i' ( temp int)
 0:?           'input' ( temp 3-element array of 4-component vector of float)
 0:?   Linker Objects
-0:?     'anon@0' (layout( row_major std140) uniform block{ uniform 4-element array of 4-component vector of float a,  uniform 11-element array of structure{ temp 7-element array of 4-component vector of float m} s})
+0:?     'anon@0' (layout( row_major std140) uniform block{ uniform 4-element array of 4-component vector of float a,  uniform 11-element array of structure{ temp 7-element array of 4-component vector of float m} s,  uniform 1-element array of 4-component vector of float a1,  uniform 2-element array of 4-component vector of float a2})
+0:?     'C' ( global 4-component vector of float)
+0:?     'c1' ( const 1-element array of 4-component vector of float)
+0:?       1.000000
+0:?       2.000000
+0:?       3.000000
+0:?       4.000000
+0:?     'c2' ( global 2-element array of 4-component vector of float)
 0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
-0:?     'i' (layout( location=0) in int)
+0:?     'i' (layout( location=0) flat in int)
 0:?     'input' (layout( location=1) in 3-element array of 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80001
-// Id's are bound by 81
+// Generated by (magic number): 80007
+// Id's are bound by 126
 
                               Capability Shader
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "PixelShaderFunction" 68 72 75
+                              EntryPoint Fragment 4  "PixelShaderFunction" 112 116 119
                               ExecutionMode 4 OriginUpperLeft
                               Source HLSL 500
                               Name 4  "PixelShaderFunction"
                               Name 17  "@PixelShaderFunction(i1;vf4[3];"
                               Name 15  "i"
                               Name 16  "input"
-                              Name 23  ""
-                              MemberName 23 0  "m"
-                              Name 26  "$Global"
-                              MemberName 26($Global) 0  "a"
-                              MemberName 26($Global) 1  "s"
-                              Name 28  ""
-                              Name 50  "b"
-                              Name 66  "i"
-                              Name 68  "i"
-                              Name 70  "input"
-                              Name 72  "input"
-                              Name 75  "@entryPointOutput"
-                              Name 76  "param"
-                              Name 78  "param"
-                              Decorate 20 ArrayStride 16
-                              Decorate 22 ArrayStride 16
-                              MemberDecorate 23 0 Offset 0
-                              Decorate 25 ArrayStride 112
-                              MemberDecorate 26($Global) 0 Offset 0
-                              MemberDecorate 26($Global) 1 Offset 64
-                              Decorate 26($Global) Block
-                              Decorate 28 DescriptorSet 0
-                              Decorate 68(i) Location 0
-                              Decorate 72(input) Location 1
-                              Decorate 75(@entryPointOutput) Location 0
+                              Name 20  "C"
+                              Name 29  "c2"
+                              Name 35  "b"
+                              Name 48  "tmp"
+                              Name 54  ""
+                              MemberName 54 0  "m"
+                              Name 60  "$Global"
+                              MemberName 60($Global) 0  "a"
+                              MemberName 60($Global) 1  "s"
+                              MemberName 60($Global) 2  "a1"
+                              MemberName 60($Global) 3  "a2"
+                              Name 62  ""
+                              Name 110  "i"
+                              Name 112  "i"
+                              Name 114  "input"
+                              Name 116  "input"
+                              Name 119  "@entryPointOutput"
+                              Name 120  "param"
+                              Name 122  "param"
+                              Decorate 51 ArrayStride 16
+                              Decorate 53 ArrayStride 16
+                              MemberDecorate 54 0 Offset 0
+                              Decorate 56 ArrayStride 112
+                              Decorate 58 ArrayStride 16
+                              Decorate 59 ArrayStride 16
+                              MemberDecorate 60($Global) 0 Offset 0
+                              MemberDecorate 60($Global) 1 Offset 64
+                              MemberDecorate 60($Global) 2 Offset 1296
+                              MemberDecorate 60($Global) 3 Offset 1312
+                              Decorate 60($Global) Block
+                              Decorate 62 DescriptorSet 0
+                              Decorate 112(i) Flat
+                              Decorate 112(i) Location 0
+                              Decorate 116(input) Location 1
+                              Decorate 119(@entryPointOutput) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 32 1
@@ -199,78 +349,127 @@
               12:             TypeArray 9(fvec4) 11
               13:             TypePointer Function 12
               14:             TypeFunction 9(fvec4) 7(ptr) 13(ptr)
-              19:     10(int) Constant 4
-              20:             TypeArray 9(fvec4) 19
-              21:     10(int) Constant 7
-              22:             TypeArray 9(fvec4) 21
-              23:             TypeStruct 22
-              24:     10(int) Constant 11
-              25:             TypeArray 23(struct) 24
-     26($Global):             TypeStruct 20 25
-              27:             TypePointer Uniform 26($Global)
-              28:     27(ptr) Variable Uniform
-              29:      6(int) Constant 0
-              30:      6(int) Constant 1
-              31:             TypePointer Uniform 9(fvec4)
-              38:      6(int) Constant 2
-              39:             TypePointer Function 9(fvec4)
-              47:     10(int) Constant 10
-              48:             TypeArray 9(fvec4) 47
-              49:             TypePointer Function 48
-              51:      6(int) Constant 5
-              67:             TypePointer Input 6(int)
-           68(i):     67(ptr) Variable Input
-              71:             TypePointer Input 12
-       72(input):     71(ptr) Variable Input
-              74:             TypePointer Output 9(fvec4)
-75(@entryPointOutput):     74(ptr) Variable Output
+              19:             TypePointer Private 9(fvec4)
+           20(C):     19(ptr) Variable Private
+              21:    8(float) Constant 1065353216
+              22:    8(float) Constant 1073741824
+              23:    8(float) Constant 1077936128
+              24:    8(float) Constant 1082130432
+              25:    9(fvec4) ConstantComposite 21 22 23 24
+              26:     10(int) Constant 2
+              27:             TypeArray 9(fvec4) 26
+              28:             TypePointer Private 27
+          29(c2):     28(ptr) Variable Private
+              32:     10(int) Constant 10
+              33:             TypeArray 9(fvec4) 32
+              34:             TypePointer Function 33
+              47:             TypePointer Function 9(fvec4)
+              50:     10(int) Constant 4
+              51:             TypeArray 9(fvec4) 50
+              52:     10(int) Constant 7
+              53:             TypeArray 9(fvec4) 52
+              54:             TypeStruct 53
+              55:     10(int) Constant 11
+              56:             TypeArray 54(struct) 55
+              57:     10(int) Constant 1
+              58:             TypeArray 9(fvec4) 57
+              59:             TypeArray 9(fvec4) 26
+     60($Global):             TypeStruct 51 56 58 59
+              61:             TypePointer Uniform 60($Global)
+              62:     61(ptr) Variable Uniform
+              63:      6(int) Constant 2
+              64:      6(int) Constant 0
+              65:             TypePointer Uniform 9(fvec4)
+              70:      6(int) Constant 3
+              79:      6(int) Constant 1
+              93:      6(int) Constant 5
+             111:             TypePointer Input 6(int)
+          112(i):    111(ptr) Variable Input
+             115:             TypePointer Input 12
+      116(input):    115(ptr) Variable Input
+             118:             TypePointer Output 9(fvec4)
+119(@entryPointOutput):    118(ptr) Variable Output
+             125:          58 ConstantComposite 25
 4(PixelShaderFunction):           2 Function None 3
                5:             Label
-           66(i):      7(ptr) Variable Function
-       70(input):     13(ptr) Variable Function
-       76(param):      7(ptr) Variable Function
-       78(param):     13(ptr) Variable Function
-              69:      6(int) Load 68(i)
-                              Store 66(i) 69
-              73:          12 Load 72(input)
-                              Store 70(input) 73
-              77:      6(int) Load 66(i)
-                              Store 76(param) 77
-              79:          12 Load 70(input)
-                              Store 78(param) 79
-              80:    9(fvec4) FunctionCall 17(@PixelShaderFunction(i1;vf4[3];) 76(param) 78(param)
-                              Store 75(@entryPointOutput) 80
+          110(i):      7(ptr) Variable Function
+      114(input):     13(ptr) Variable Function
+      120(param):      7(ptr) Variable Function
+      122(param):     13(ptr) Variable Function
+                              Store 20(C) 25
+              30:    9(fvec4) Load 20(C)
+              31:          27 CompositeConstruct 30 25
+                              Store 29(c2) 31
+             113:      6(int) Load 112(i)
+                              Store 110(i) 113
+             117:          12 Load 116(input)
+                              Store 114(input) 117
+             121:      6(int) Load 110(i)
+                              Store 120(param) 121
+             123:          12 Load 114(input)
+                              Store 122(param) 123
+             124:    9(fvec4) FunctionCall 17(@PixelShaderFunction(i1;vf4[3];) 120(param) 122(param)
+                              Store 119(@entryPointOutput) 124
                               Return
                               FunctionEnd
 17(@PixelShaderFunction(i1;vf4[3];):    9(fvec4) Function None 14
            15(i):      7(ptr) FunctionParameter
        16(input):     13(ptr) FunctionParameter
               18:             Label
-           50(b):     49(ptr) Variable Function
-              32:     31(ptr) AccessChain 28 29 30
-              33:    9(fvec4) Load 32
-              34:      6(int) Load 15(i)
-              35:     31(ptr) AccessChain 28 29 34
-              36:    9(fvec4) Load 35
-              37:    9(fvec4) FAdd 33 36
-              40:     39(ptr) AccessChain 16(input) 38
-              41:    9(fvec4) Load 40
-              42:    9(fvec4) FAdd 37 41
-              43:      6(int) Load 15(i)
-              44:     39(ptr) AccessChain 16(input) 43
-              45:    9(fvec4) Load 44
-              46:    9(fvec4) FAdd 42 45
-              52:     39(ptr) AccessChain 50(b) 51
-              53:    9(fvec4) Load 52
-              54:    9(fvec4) FAdd 46 53
-              55:      6(int) Load 15(i)
-              56:     39(ptr) AccessChain 50(b) 55
-              57:    9(fvec4) Load 56
-              58:    9(fvec4) FAdd 54 57
-              59:      6(int) Load 15(i)
-              60:      6(int) Load 15(i)
-              61:     31(ptr) AccessChain 28 30 59 29 60
-              62:    9(fvec4) Load 61
-              63:    9(fvec4) FAdd 58 62
-                              ReturnValue 63
+           35(b):     34(ptr) Variable Function
+         48(tmp):     47(ptr) Variable Function
+              36:    9(fvec4) Load 20(C)
+              37:    9(fvec4) Load 20(C)
+              38:    9(fvec4) Load 20(C)
+              39:    9(fvec4) Load 20(C)
+              40:    9(fvec4) Load 20(C)
+              41:    9(fvec4) Load 20(C)
+              42:    9(fvec4) Load 20(C)
+              43:    9(fvec4) Load 20(C)
+              44:    9(fvec4) Load 20(C)
+              45:    9(fvec4) Load 20(C)
+              46:          33 CompositeConstruct 36 37 38 39 40 41 42 43 44 45
+                              Store 35(b) 46
+              49:    9(fvec4) Load 20(C)
+              66:     65(ptr) AccessChain 62 63 64
+              67:    9(fvec4) Load 66
+              68:    9(fvec4) FAdd 49 67
+              69:    9(fvec4) FAdd 68 25
+              71:      6(int) Load 15(i)
+              72:     65(ptr) AccessChain 62 70 71
+              73:    9(fvec4) Load 72
+              74:    9(fvec4) FAdd 69 73
+              75:      6(int) Load 15(i)
+              76:     19(ptr) AccessChain 29(c2) 75
+              77:    9(fvec4) Load 76
+              78:    9(fvec4) FAdd 74 77
+                              Store 48(tmp) 78
+              80:     65(ptr) AccessChain 62 64 79
+              81:    9(fvec4) Load 80
+              82:      6(int) Load 15(i)
+              83:     65(ptr) AccessChain 62 64 82
+              84:    9(fvec4) Load 83
+              85:    9(fvec4) FAdd 81 84
+              86:     47(ptr) AccessChain 16(input) 63
+              87:    9(fvec4) Load 86
+              88:    9(fvec4) FAdd 85 87
+              89:      6(int) Load 15(i)
+              90:     47(ptr) AccessChain 16(input) 89
+              91:    9(fvec4) Load 90
+              92:    9(fvec4) FAdd 88 91
+              94:     47(ptr) AccessChain 35(b) 93
+              95:    9(fvec4) Load 94
+              96:    9(fvec4) FAdd 92 95
+              97:      6(int) Load 15(i)
+              98:     47(ptr) AccessChain 35(b) 97
+              99:    9(fvec4) Load 98
+             100:    9(fvec4) FAdd 96 99
+             101:      6(int) Load 15(i)
+             102:      6(int) Load 15(i)
+             103:     65(ptr) AccessChain 62 79 101 64 102
+             104:    9(fvec4) Load 103
+             105:    9(fvec4) FAdd 100 104
+             106:    9(fvec4) Load 48(tmp)
+             107:    9(fvec4) FAdd 105 106
+                              ReturnValue 107
                               FunctionEnd
diff --git a/Test/baseResults/hlsl.array.implicit-size.frag.out b/Test/baseResults/hlsl.array.implicit-size.frag.out
index e4854db..9af6fed 100644
--- a/Test/baseResults/hlsl.array.implicit-size.frag.out
+++ b/Test/baseResults/hlsl.array.implicit-size.frag.out
@@ -163,7 +163,7 @@
 0:?     'g_mystruct' ( global 2-element array of structure{ temp int i,  temp float f})
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 72
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.array.multidim.frag.out b/Test/baseResults/hlsl.array.multidim.frag.out
index 72fa2ec..59f64c0 100644
--- a/Test/baseResults/hlsl.array.multidim.frag.out
+++ b/Test/baseResults/hlsl.array.multidim.frag.out
@@ -55,14 +55,14 @@
 0:?     Sequence
 0:10      Sequence
 0:10        move second child to first child ( temp 4-component vector of float)
-0:?           'Color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 0:10          Color: direct index for structure ( temp 4-component vector of float)
 0:10            Function Call: @main( ( temp structure{ temp 4-component vector of float Color})
 0:10            Constant:
 0:10              0 (const int)
 0:?   Linker Objects
 0:?     'anon@0' (layout( row_major std140) uniform block{ uniform 5-element array of 4-element array of 3-element array of float float_array})
-0:?     'Color' (layout( location=0) out 4-component vector of float)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 
 Linked fragment stage:
@@ -124,17 +124,17 @@
 0:?     Sequence
 0:10      Sequence
 0:10        move second child to first child ( temp 4-component vector of float)
-0:?           'Color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 0:10          Color: direct index for structure ( temp 4-component vector of float)
 0:10            Function Call: @main( ( temp structure{ temp 4-component vector of float Color})
 0:10            Constant:
 0:10              0 (const int)
 0:?   Linker Objects
 0:?     'anon@0' (layout( row_major std140) uniform block{ uniform 5-element array of 4-element array of 3-element array of float float_array})
-0:?     'Color' (layout( location=0) out 4-component vector of float)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 57
 
                               Capability Shader
@@ -153,14 +153,14 @@
                               Name 29  ""
                               Name 40  "float4_array_2"
                               Name 46  "psout"
-                              Name 54  "Color"
+                              Name 54  "@entryPointOutput.Color"
                               Decorate 22 ArrayStride 16
                               Decorate 24 ArrayStride 48
                               Decorate 26 ArrayStride 192
                               MemberDecorate 27($Global) 0 Offset 0
                               Decorate 27($Global) Block
                               Decorate 29 DescriptorSet 0
-                              Decorate 54(Color) Location 0
+                              Decorate 54(@entryPointOutput.Color) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -193,12 +193,12 @@
               41:             TypePointer Function 14
               45:             TypePointer Function 8(PS_OUTPUT)
               53:             TypePointer Output 7(fvec4)
-       54(Color):     53(ptr) Variable Output
+54(@entryPointOutput.Color):     53(ptr) Variable Output
          4(main):           2 Function None 3
                5:             Label
               55:8(PS_OUTPUT) FunctionCall 10(@main()
               56:    7(fvec4) CompositeExtract 55 0
-                              Store 54(Color) 56
+                              Store 54(@entryPointOutput.Color) 56
                               Return
                               FunctionEnd
       10(@main():8(PS_OUTPUT) Function None 9
diff --git a/Test/baseResults/hlsl.assoc.frag.out b/Test/baseResults/hlsl.assoc.frag.out
old mode 100755
new mode 100644
index dcefa9c..562a863
--- a/Test/baseResults/hlsl.assoc.frag.out
+++ b/Test/baseResults/hlsl.assoc.frag.out
@@ -132,7 +132,7 @@
 0:?     'a5' (layout( location=4) in 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 58
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.attribute.expression.comp.out b/Test/baseResults/hlsl.attribute.expression.comp.out
index 701511e..4bef5e7 100644
--- a/Test/baseResults/hlsl.attribute.expression.comp.out
+++ b/Test/baseResults/hlsl.attribute.expression.comp.out
@@ -10,7 +10,7 @@
 0:11          'x' ( temp int)
 0:11          Constant:
 0:11            0 (const int)
-0:11        Loop with condition tested first
+0:11        Loop with condition tested first: Unroll
 0:11          Loop Condition
 0:11          Compare Less Than ( temp bool)
 0:11            'x' ( temp int)
@@ -53,7 +53,7 @@
 0:11          'x' ( temp int)
 0:11          Constant:
 0:11            0 (const int)
-0:11        Loop with condition tested first
+0:11        Loop with condition tested first: Unroll
 0:11          Loop Condition
 0:11          Compare Less Than ( temp bool)
 0:11            'x' ( temp int)
@@ -82,7 +82,7 @@
 0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 39
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.attribute.frag.out b/Test/baseResults/hlsl.attribute.frag.out
old mode 100755
new mode 100644
index ccd7693..44e963e
--- a/Test/baseResults/hlsl.attribute.frag.out
+++ b/Test/baseResults/hlsl.attribute.frag.out
@@ -6,7 +6,7 @@
 0:2    Function Parameters: 
 0:2      'input' ( in 4-component vector of float)
 0:?     Sequence
-0:11      Test condition and select ( temp void)
+0:11      Test condition and select ( temp void): DontFlatten
 0:11        Condition
 0:11        Constant:
 0:11          false (const bool)
@@ -33,7 +33,7 @@
 0:2    Function Parameters: 
 0:2      'input' ( in 4-component vector of float)
 0:?     Sequence
-0:11      Test condition and select ( temp void)
+0:11      Test condition and select ( temp void): DontFlatten
 0:11        Condition
 0:11        Constant:
 0:11          false (const bool)
@@ -50,7 +50,7 @@
 0:?     'input' (layout( location=0) in 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 24
 
                               Capability Shader
@@ -90,7 +90,7 @@
 11(@PixelShaderFunction(vf4;):           2 Function None 9
        10(input):      8(ptr) FunctionParameter
               12:             Label
-                              SelectionMerge 16 None
+                              SelectionMerge 16 DontFlatten 
                               BranchConditional 14 15 16
               15:               Label
                                 Branch 16
diff --git a/Test/baseResults/hlsl.attributeC11.frag.out b/Test/baseResults/hlsl.attributeC11.frag.out
new file mode 100644
index 0000000..afc7466
--- /dev/null
+++ b/Test/baseResults/hlsl.attributeC11.frag.out
@@ -0,0 +1,197 @@
+hlsl.attributeC11.frag
+Shader version: 500
+gl_FragCoord origin is upper left
+0:? Sequence
+0:20  Function Definition: @main(vf4; ( temp 4-component vector of float)
+0:20    Function Parameters: 
+0:20      'input' ( in 4-component vector of float)
+0:?     Sequence
+0:21      Branch: Return with expression
+0:21        add ( temp 4-component vector of float)
+0:21          'input' ( in 4-component vector of float)
+0:21          textureFetch ( temp 4-component vector of float)
+0:21            'attach' ( uniform texture2D)
+0:21            vector swizzle ( temp int)
+0:21              Constant:
+0:21                0 (const int)
+0:21                0 (const int)
+0:21              Sequence
+0:21                Constant:
+0:21                  0 (const int)
+0:21            direct index ( temp int)
+0:21              Constant:
+0:21                0 (const int)
+0:21                0 (const int)
+0:21              Constant:
+0:21                1 (const int)
+0:20  Function Definition: main( ( temp void)
+0:20    Function Parameters: 
+0:?     Sequence
+0:20      move second child to first child ( temp 4-component vector of float)
+0:?         'input' ( temp 4-component vector of float)
+0:?         'input' (layout( location=8) in 4-component vector of float)
+0:20      move second child to first child ( temp 4-component vector of float)
+0:?         '@entryPointOutput' (layout( location=7) out 4-component vector of float)
+0:20        Function Call: @main(vf4; ( temp 4-component vector of float)
+0:?           'input' ( temp 4-component vector of float)
+0:?   Linker Objects
+0:?     'buffer1' (layout( set=0 binding=1 row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 2-component vector of float f} @data})
+0:?     'buffer3' (layout( set=2 binding=3 row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 2-component vector of float f} @data})
+0:?     'attach' ( uniform texture2D)
+0:?     'ci' ( specialization-constant const int)
+0:?       11 (const int)
+0:?     'anon@0' (layout( row_major std430 push_constant) uniform block{layout( row_major std430 offset=0) uniform int a})
+0:?     '@entryPointOutput' (layout( location=7) out 4-component vector of float)
+0:?     'input' (layout( location=8) in 4-component vector of float)
+
+
+Linked fragment stage:
+
+
+Shader version: 500
+gl_FragCoord origin is upper left
+0:? Sequence
+0:20  Function Definition: @main(vf4; ( temp 4-component vector of float)
+0:20    Function Parameters: 
+0:20      'input' ( in 4-component vector of float)
+0:?     Sequence
+0:21      Branch: Return with expression
+0:21        add ( temp 4-component vector of float)
+0:21          'input' ( in 4-component vector of float)
+0:21          textureFetch ( temp 4-component vector of float)
+0:21            'attach' ( uniform texture2D)
+0:21            vector swizzle ( temp int)
+0:21              Constant:
+0:21                0 (const int)
+0:21                0 (const int)
+0:21              Sequence
+0:21                Constant:
+0:21                  0 (const int)
+0:21            direct index ( temp int)
+0:21              Constant:
+0:21                0 (const int)
+0:21                0 (const int)
+0:21              Constant:
+0:21                1 (const int)
+0:20  Function Definition: main( ( temp void)
+0:20    Function Parameters: 
+0:?     Sequence
+0:20      move second child to first child ( temp 4-component vector of float)
+0:?         'input' ( temp 4-component vector of float)
+0:?         'input' (layout( location=8) in 4-component vector of float)
+0:20      move second child to first child ( temp 4-component vector of float)
+0:?         '@entryPointOutput' (layout( location=7) out 4-component vector of float)
+0:20        Function Call: @main(vf4; ( temp 4-component vector of float)
+0:?           'input' ( temp 4-component vector of float)
+0:?   Linker Objects
+0:?     'buffer1' (layout( set=0 binding=1 row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 2-component vector of float f} @data})
+0:?     'buffer3' (layout( set=2 binding=3 row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 2-component vector of float f} @data})
+0:?     'attach' ( uniform texture2D)
+0:?     'ci' ( specialization-constant const int)
+0:?       11 (const int)
+0:?     'anon@0' (layout( row_major std430 push_constant) uniform block{layout( row_major std430 offset=0) uniform int a})
+0:?     '@entryPointOutput' (layout( location=7) out 4-component vector of float)
+0:?     'input' (layout( location=8) in 4-component vector of float)
+
+error: SPIRV-Tools Validation Errors
+error: Operand 2 of Decorate requires one of these capabilities: InputAttachment 
+  OpDecorate %attach InputAttachmentIndex 4
+
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 51
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 33 36
+                              ExecutionMode 4 OriginUpperLeft
+                              Source HLSL 500
+                              Name 4  "main"
+                              Name 11  "@main(vf4;"
+                              Name 10  "input"
+                              Name 16  "attach"
+                              Name 31  "input"
+                              Name 33  "input"
+                              Name 36  "@entryPointOutput"
+                              Name 37  "param"
+                              Name 41  "S"
+                              MemberName 41(S) 0  "f"
+                              Name 43  "buffer1"
+                              MemberName 43(buffer1) 0  "@data"
+                              Name 45  "buffer1"
+                              Name 46  "buffer3"
+                              Name 47  "ci"
+                              Name 48  "pcBuf"
+                              MemberName 48(pcBuf) 0  "a"
+                              Name 50  ""
+                              Decorate 16(attach) DescriptorSet 0
+                              Decorate 16(attach) InputAttachmentIndex 4
+                              Decorate 33(input) Location 8
+                              Decorate 36(@entryPointOutput) Location 7
+                              MemberDecorate 41(S) 0 Offset 0
+                              Decorate 42 ArrayStride 8
+                              MemberDecorate 43(buffer1) 0 NonWritable
+                              MemberDecorate 43(buffer1) 0 Offset 0
+                              Decorate 43(buffer1) BufferBlock
+                              Decorate 45(buffer1) DescriptorSet 0
+                              Decorate 45(buffer1) Binding 1
+                              Decorate 46(buffer3) DescriptorSet 2
+                              Decorate 46(buffer3) Binding 3
+                              Decorate 47(ci) SpecId 13
+                              MemberDecorate 48(pcBuf) 0 Offset 0
+                              Decorate 48(pcBuf) Block
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+               8:             TypePointer Function 7(fvec4)
+               9:             TypeFunction 7(fvec4) 8(ptr)
+              14:             TypeImage 6(float) 2D sampled format:Unknown
+              15:             TypePointer UniformConstant 14
+      16(attach):     15(ptr) Variable UniformConstant
+              18:             TypeInt 32 1
+              19:             TypeVector 18(int) 2
+              20:     18(int) Constant 0
+              21:   19(ivec2) ConstantComposite 20 20
+              22:             TypeInt 32 0
+              23:     22(int) Constant 0
+              25:     22(int) Constant 1
+              32:             TypePointer Input 7(fvec4)
+       33(input):     32(ptr) Variable Input
+              35:             TypePointer Output 7(fvec4)
+36(@entryPointOutput):     35(ptr) Variable Output
+              40:             TypeVector 6(float) 2
+           41(S):             TypeStruct 40(fvec2)
+              42:             TypeRuntimeArray 41(S)
+     43(buffer1):             TypeStruct 42
+              44:             TypePointer Uniform 43(buffer1)
+     45(buffer1):     44(ptr) Variable Uniform
+     46(buffer3):     44(ptr) Variable Uniform
+          47(ci):     18(int) SpecConstant 11
+       48(pcBuf):             TypeStruct 18(int)
+              49:             TypePointer PushConstant 48(pcBuf)
+              50:     49(ptr) Variable PushConstant
+         4(main):           2 Function None 3
+               5:             Label
+       31(input):      8(ptr) Variable Function
+       37(param):      8(ptr) Variable Function
+              34:    7(fvec4) Load 33(input)
+                              Store 31(input) 34
+              38:    7(fvec4) Load 31(input)
+                              Store 37(param) 38
+              39:    7(fvec4) FunctionCall 11(@main(vf4;) 37(param)
+                              Store 36(@entryPointOutput) 39
+                              Return
+                              FunctionEnd
+  11(@main(vf4;):    7(fvec4) Function None 9
+       10(input):      8(ptr) FunctionParameter
+              12:             Label
+              13:    7(fvec4) Load 10(input)
+              17:          14 Load 16(attach)
+              24:     18(int) CompositeExtract 21 0
+              26:     18(int) CompositeExtract 21 1
+              27:    7(fvec4) ImageFetch 17 24 Lod 26
+              28:    7(fvec4) FAdd 13 27
+                              ReturnValue 28
+                              FunctionEnd
diff --git a/Test/baseResults/hlsl.attributeGlobalBuffer.frag.out b/Test/baseResults/hlsl.attributeGlobalBuffer.frag.out
new file mode 100644
index 0000000..e378447
--- /dev/null
+++ b/Test/baseResults/hlsl.attributeGlobalBuffer.frag.out
@@ -0,0 +1,109 @@
+hlsl.attributeGlobalBuffer.frag
+Shader version: 500
+gl_FragCoord origin is upper left
+0:? Sequence
+0:6  Function Definition: @main( ( temp 4-component vector of float)
+0:6    Function Parameters: 
+0:?     Sequence
+0:7      Branch: Return with expression
+0:7        add ( temp 4-component vector of float)
+0:7          u1: direct index for structure ( uniform 4-component vector of float)
+0:7            'anon@0' (layout( set=2 binding=5 row_major std140) uniform block{ uniform 4-component vector of float u1,  uniform 4-component vector of float u2})
+0:7            Constant:
+0:7              0 (const uint)
+0:7          u2: direct index for structure ( uniform 4-component vector of float)
+0:7            'anon@0' (layout( set=2 binding=5 row_major std140) uniform block{ uniform 4-component vector of float u1,  uniform 4-component vector of float u2})
+0:7            Constant:
+0:7              1 (const uint)
+0:6  Function Definition: main( ( temp void)
+0:6    Function Parameters: 
+0:?     Sequence
+0:6      move second child to first child ( temp 4-component vector of float)
+0:?         '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+0:6        Function Call: @main( ( temp 4-component vector of float)
+0:?   Linker Objects
+0:?     'anon@0' (layout( set=2 binding=5 row_major std140) uniform block{ uniform 4-component vector of float u1,  uniform 4-component vector of float u2})
+0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+
+
+Linked fragment stage:
+
+
+Shader version: 500
+gl_FragCoord origin is upper left
+0:? Sequence
+0:6  Function Definition: @main( ( temp 4-component vector of float)
+0:6    Function Parameters: 
+0:?     Sequence
+0:7      Branch: Return with expression
+0:7        add ( temp 4-component vector of float)
+0:7          u1: direct index for structure ( uniform 4-component vector of float)
+0:7            'anon@0' (layout( set=2 binding=5 row_major std140) uniform block{ uniform 4-component vector of float u1,  uniform 4-component vector of float u2})
+0:7            Constant:
+0:7              0 (const uint)
+0:7          u2: direct index for structure ( uniform 4-component vector of float)
+0:7            'anon@0' (layout( set=2 binding=5 row_major std140) uniform block{ uniform 4-component vector of float u1,  uniform 4-component vector of float u2})
+0:7            Constant:
+0:7              1 (const uint)
+0:6  Function Definition: main( ( temp void)
+0:6    Function Parameters: 
+0:?     Sequence
+0:6      move second child to first child ( temp 4-component vector of float)
+0:?         '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+0:6        Function Call: @main( ( temp 4-component vector of float)
+0:?   Linker Objects
+0:?     'anon@0' (layout( set=2 binding=5 row_major std140) uniform block{ uniform 4-component vector of float u1,  uniform 4-component vector of float u2})
+0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 28
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 26
+                              ExecutionMode 4 OriginUpperLeft
+                              Source HLSL 500
+                              Name 4  "main"
+                              Name 9  "@main("
+                              Name 11  "$Global"
+                              MemberName 11($Global) 0  "u1"
+                              MemberName 11($Global) 1  "u2"
+                              Name 13  ""
+                              Name 26  "@entryPointOutput"
+                              MemberDecorate 11($Global) 0 Offset 0
+                              MemberDecorate 11($Global) 1 Offset 16
+                              Decorate 11($Global) Block
+                              Decorate 13 DescriptorSet 2
+                              Decorate 13 Binding 5
+                              Decorate 26(@entryPointOutput) Location 0
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+               8:             TypeFunction 7(fvec4)
+     11($Global):             TypeStruct 7(fvec4) 7(fvec4)
+              12:             TypePointer Uniform 11($Global)
+              13:     12(ptr) Variable Uniform
+              14:             TypeInt 32 1
+              15:     14(int) Constant 0
+              16:             TypePointer Uniform 7(fvec4)
+              19:     14(int) Constant 1
+              25:             TypePointer Output 7(fvec4)
+26(@entryPointOutput):     25(ptr) Variable Output
+         4(main):           2 Function None 3
+               5:             Label
+              27:    7(fvec4) FunctionCall 9(@main()
+                              Store 26(@entryPointOutput) 27
+                              Return
+                              FunctionEnd
+       9(@main():    7(fvec4) Function None 8
+              10:             Label
+              17:     16(ptr) AccessChain 13 15
+              18:    7(fvec4) Load 17
+              20:     16(ptr) AccessChain 13 19
+              21:    7(fvec4) Load 20
+              22:    7(fvec4) FAdd 18 21
+                              ReturnValue 22
+                              FunctionEnd
diff --git a/Test/baseResults/hlsl.automap.frag.out b/Test/baseResults/hlsl.automap.frag.out
index 7664bf6..b9ab49c 100644
--- a/Test/baseResults/hlsl.automap.frag.out
+++ b/Test/baseResults/hlsl.automap.frag.out
@@ -1,29 +1,29 @@
 hlsl.automap.frag
 Uniform reflection:
-t1: offset -1, type 8b5d, size 1, index -1, binding 11
-t2: offset -1, type 8b5e, size 1, index -1, binding 12
-t3: offset -1, type 8b5f, size 1, index -1, binding 13
-t4.@data: offset 0, type 8b52, size 1, index 0, binding -1
-t5.@data: offset 0, type 1405, size 0, index 1, binding -1
-t6: offset -1, type 8dc2, size 1, index -1, binding 16
-s1: offset -1, type 0, size 1, index -1, binding 31
-s2: offset -1, type 0, size 1, index -1, binding 32
-u1: offset -1, type 904c, size 1, index -1, binding 41
-u2: offset -1, type 904d, size 1, index -1, binding 42
-u3: offset -1, type 904e, size 1, index -1, binding 43
-u4: offset -1, type 9051, size 1, index -1, binding 44
-u5.@data: offset 0, type 1405, size 0, index 2, binding -1
-u6.@data: offset 0, type 1406, size 1, index 3, binding -1
-cb1: offset 0, type 1404, size 1, index 4, binding -1
-tb1: offset 0, type 1404, size 1, index 5, binding -1
+t1: offset -1, type 8b5d, size 1, index -1, binding 11, stages 16
+t2: offset -1, type 8b5e, size 1, index -1, binding 12, stages 16
+t3: offset -1, type 8b5f, size 1, index -1, binding 13, stages 16
+t4.@data: offset 0, type 8b52, size 1, index 0, binding -1, stages 16
+t5.@data: offset 0, type 1405, size 0, index 1, binding -1, stages 16
+t6: offset -1, type 8dc2, size 1, index -1, binding 16, stages 16
+s1: offset -1, type 0, size 1, index -1, binding 31, stages 16
+s2: offset -1, type 0, size 1, index -1, binding 32, stages 16
+u1: offset -1, type 904c, size 1, index -1, binding 41, stages 16
+u2: offset -1, type 904d, size 1, index -1, binding 42, stages 16
+u3: offset -1, type 904e, size 1, index -1, binding 43, stages 16
+u4: offset -1, type 9051, size 1, index -1, binding 44, stages 16
+u5.@data: offset 0, type 1405, size 0, index 2, binding -1, stages 16
+u6.@data: offset 0, type 1406, size 1, index 3, binding -1, stages 16
+cb1: offset 0, type 1404, size 1, index 4, binding -1, stages 16
+tb1: offset 0, type 1404, size 1, index 5, binding -1, stages 16
 
 Uniform block reflection:
-t4: offset -1, type ffffffff, size 0, index -1, binding 14
-t5: offset -1, type ffffffff, size 0, index -1, binding 15
-u5: offset -1, type ffffffff, size 0, index -1, binding 45
-u6: offset -1, type ffffffff, size 0, index -1, binding 46
-cb: offset -1, type ffffffff, size 4, index -1, binding 51
-tb: offset -1, type ffffffff, size 4, index -1, binding 17
+t4: offset -1, type ffffffff, size 0, index -1, binding 14, stages 0
+t5: offset -1, type ffffffff, size 0, index -1, binding 15, stages 0
+u5: offset -1, type ffffffff, size 0, index -1, binding 45, stages 0
+u6: offset -1, type ffffffff, size 0, index -1, binding 46, stages 0
+cb: offset -1, type ffffffff, size 4, index -1, binding 51, stages 0
+tb: offset -1, type ffffffff, size 4, index -1, binding 17, stages 0
 
 Vertex attribute reflection:
 
diff --git a/Test/baseResults/hlsl.basic.comp.out b/Test/baseResults/hlsl.basic.comp.out
old mode 100755
new mode 100644
index 9842506..d84642e
--- a/Test/baseResults/hlsl.basic.comp.out
+++ b/Test/baseResults/hlsl.basic.comp.out
@@ -15,17 +15,19 @@
 0:?     Sequence
 0:4      move second child to first child ( temp int)
 0:?         'dti' ( temp int)
-0:?         'dti' ( in int GlobalInvocationID)
+0:?         Construct int ( temp int)
+0:?           'dti' ( in 3-component vector of int GlobalInvocationID)
 0:4      move second child to first child ( temp int)
 0:?         'gti' ( temp int)
-0:?         'gti' ( in int LocalInvocationID)
+0:?         Construct int ( temp int)
+0:?           'gti' ( in 3-component vector of int LocalInvocationID)
 0:4      Function Call: @main(i1;i1; ( temp void)
 0:?         'dti' ( temp int)
 0:?         'gti' ( temp int)
 0:?   Linker Objects
 0:?     'a' ( shared 100-element array of 4-component vector of float)
-0:?     'dti' ( in int GlobalInvocationID)
-0:?     'gti' ( in int LocalInvocationID)
+0:?     'dti' ( in 3-component vector of int GlobalInvocationID)
+0:?     'gti' ( in 3-component vector of int LocalInvocationID)
 
 
 Linked compute stage:
@@ -47,26 +49,28 @@
 0:?     Sequence
 0:4      move second child to first child ( temp int)
 0:?         'dti' ( temp int)
-0:?         'dti' ( in int GlobalInvocationID)
+0:?         Construct int ( temp int)
+0:?           'dti' ( in 3-component vector of int GlobalInvocationID)
 0:4      move second child to first child ( temp int)
 0:?         'gti' ( temp int)
-0:?         'gti' ( in int LocalInvocationID)
+0:?         Construct int ( temp int)
+0:?           'gti' ( in 3-component vector of int LocalInvocationID)
 0:4      Function Call: @main(i1;i1; ( temp void)
 0:?         'dti' ( temp int)
 0:?         'gti' ( temp int)
 0:?   Linker Objects
 0:?     'a' ( shared 100-element array of 4-component vector of float)
-0:?     'dti' ( in int GlobalInvocationID)
-0:?     'gti' ( in int LocalInvocationID)
+0:?     'dti' ( in 3-component vector of int GlobalInvocationID)
+0:?     'gti' ( in 3-component vector of int LocalInvocationID)
 
 // Module Version 10000
-// Generated by (magic number): 80001
-// Id's are bound by 35
+// Generated by (magic number): 80007
+// Id's are bound by 38
 
                               Capability Shader
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint GLCompute 4  "main" 18 21
+                              EntryPoint GLCompute 4  "main" 19 23
                               ExecutionMode 4 LocalSize 1 1 1
                               Source HLSL 500
                               Name 4  "main"
@@ -74,44 +78,47 @@
                               Name 9  "dti"
                               Name 10  "gti"
                               Name 16  "dti"
-                              Name 18  "dti"
-                              Name 20  "gti"
-                              Name 21  "gti"
-                              Name 23  "param"
-                              Name 25  "param"
-                              Name 34  "a"
-                              Decorate 18(dti) BuiltIn GlobalInvocationId
-                              Decorate 21(gti) BuiltIn LocalInvocationId
+                              Name 19  "dti"
+                              Name 22  "gti"
+                              Name 23  "gti"
+                              Name 26  "param"
+                              Name 28  "param"
+                              Name 37  "a"
+                              Decorate 19(dti) BuiltIn GlobalInvocationId
+                              Decorate 23(gti) BuiltIn LocalInvocationId
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 32 1
                7:             TypePointer Function 6(int)
                8:             TypeFunction 2 7(ptr) 7(ptr)
-              17:             TypePointer Input 6(int)
-         18(dti):     17(ptr) Variable Input
-         21(gti):     17(ptr) Variable Input
-              28:             TypeFloat 32
-              29:             TypeVector 28(float) 4
-              30:             TypeInt 32 0
-              31:     30(int) Constant 100
-              32:             TypeArray 29(fvec4) 31
-              33:             TypePointer Workgroup 32
-           34(a):     33(ptr) Variable Workgroup
+              17:             TypeVector 6(int) 3
+              18:             TypePointer Input 17(ivec3)
+         19(dti):     18(ptr) Variable Input
+         23(gti):     18(ptr) Variable Input
+              31:             TypeFloat 32
+              32:             TypeVector 31(float) 4
+              33:             TypeInt 32 0
+              34:     33(int) Constant 100
+              35:             TypeArray 32(fvec4) 34
+              36:             TypePointer Workgroup 35
+           37(a):     36(ptr) Variable Workgroup
          4(main):           2 Function None 3
                5:             Label
          16(dti):      7(ptr) Variable Function
-         20(gti):      7(ptr) Variable Function
-       23(param):      7(ptr) Variable Function
-       25(param):      7(ptr) Variable Function
-              19:      6(int) Load 18(dti)
-                              Store 16(dti) 19
-              22:      6(int) Load 21(gti)
-                              Store 20(gti) 22
-              24:      6(int) Load 16(dti)
-                              Store 23(param) 24
-              26:      6(int) Load 20(gti)
-                              Store 25(param) 26
-              27:           2 FunctionCall 11(@main(i1;i1;) 23(param) 25(param)
+         22(gti):      7(ptr) Variable Function
+       26(param):      7(ptr) Variable Function
+       28(param):      7(ptr) Variable Function
+              20:   17(ivec3) Load 19(dti)
+              21:      6(int) CompositeExtract 20 0
+                              Store 16(dti) 21
+              24:   17(ivec3) Load 23(gti)
+              25:      6(int) CompositeExtract 24 0
+                              Store 22(gti) 25
+              27:      6(int) Load 16(dti)
+                              Store 26(param) 27
+              29:      6(int) Load 22(gti)
+                              Store 28(param) 29
+              30:           2 FunctionCall 11(@main(i1;i1;) 26(param) 28(param)
                               Return
                               FunctionEnd
 11(@main(i1;i1;):           2 Function None 8
diff --git a/Test/baseResults/hlsl.basic.geom.out b/Test/baseResults/hlsl.basic.geom.out
index 64239c5..f4116d4 100644
--- a/Test/baseResults/hlsl.basic.geom.out
+++ b/Test/baseResults/hlsl.basic.geom.out
@@ -42,14 +42,34 @@
 0:20            Constant:
 0:20              0 (const int)
 0:22      Sequence
-0:22        move second child to first child ( temp structure{ temp float myfloat,  temp int something})
-0:22          'OutputStream' (layout( location=0) out structure{ temp float myfloat,  temp int something})
-0:22          'Vert' ( temp structure{ temp float myfloat,  temp int something})
+0:22        Sequence
+0:22          move second child to first child ( temp float)
+0:?             'OutputStream.myfloat' (layout( location=0) out float)
+0:22            myfloat: direct index for structure ( temp float)
+0:22              'Vert' ( temp structure{ temp float myfloat,  temp int something})
+0:22              Constant:
+0:22                0 (const int)
+0:22          move second child to first child ( temp int)
+0:?             'OutputStream.something' (layout( location=1) out int)
+0:22            something: direct index for structure ( temp int)
+0:22              'Vert' ( temp structure{ temp float myfloat,  temp int something})
+0:22              Constant:
+0:22                1 (const int)
 0:22        EmitVertex ( temp void)
 0:23      Sequence
-0:23        move second child to first child ( temp structure{ temp float myfloat,  temp int something})
-0:23          'OutputStream' (layout( location=0) out structure{ temp float myfloat,  temp int something})
-0:23          'Vert' ( temp structure{ temp float myfloat,  temp int something})
+0:23        Sequence
+0:23          move second child to first child ( temp float)
+0:?             'OutputStream.myfloat' (layout( location=0) out float)
+0:23            myfloat: direct index for structure ( temp float)
+0:23              'Vert' ( temp structure{ temp float myfloat,  temp int something})
+0:23              Constant:
+0:23                0 (const int)
+0:23          move second child to first child ( temp int)
+0:?             'OutputStream.something' (layout( location=1) out int)
+0:23            something: direct index for structure ( temp int)
+0:23              'Vert' ( temp structure{ temp float myfloat,  temp int something})
+0:23              Constant:
+0:23                1 (const int)
 0:23        EmitVertex ( temp void)
 0:24      EndPrimitive ( temp void)
 0:16  Function Definition: main( ( temp void)
@@ -68,7 +88,8 @@
 0:?   Linker Objects
 0:?     'VertexID' (layout( location=0) in 3-element array of uint)
 0:?     'test' (layout( location=1) in 3-element array of uint)
-0:?     'OutputStream' (layout( location=0) out structure{ temp float myfloat,  temp int something})
+0:?     'OutputStream.myfloat' (layout( location=0) out float)
+0:?     'OutputStream.something' (layout( location=1) out int)
 
 
 Linked geometry stage:
@@ -117,14 +138,34 @@
 0:20            Constant:
 0:20              0 (const int)
 0:22      Sequence
-0:22        move second child to first child ( temp structure{ temp float myfloat,  temp int something})
-0:22          'OutputStream' (layout( location=0) out structure{ temp float myfloat,  temp int something})
-0:22          'Vert' ( temp structure{ temp float myfloat,  temp int something})
+0:22        Sequence
+0:22          move second child to first child ( temp float)
+0:?             'OutputStream.myfloat' (layout( location=0) out float)
+0:22            myfloat: direct index for structure ( temp float)
+0:22              'Vert' ( temp structure{ temp float myfloat,  temp int something})
+0:22              Constant:
+0:22                0 (const int)
+0:22          move second child to first child ( temp int)
+0:?             'OutputStream.something' (layout( location=1) out int)
+0:22            something: direct index for structure ( temp int)
+0:22              'Vert' ( temp structure{ temp float myfloat,  temp int something})
+0:22              Constant:
+0:22                1 (const int)
 0:22        EmitVertex ( temp void)
 0:23      Sequence
-0:23        move second child to first child ( temp structure{ temp float myfloat,  temp int something})
-0:23          'OutputStream' (layout( location=0) out structure{ temp float myfloat,  temp int something})
-0:23          'Vert' ( temp structure{ temp float myfloat,  temp int something})
+0:23        Sequence
+0:23          move second child to first child ( temp float)
+0:?             'OutputStream.myfloat' (layout( location=0) out float)
+0:23            myfloat: direct index for structure ( temp float)
+0:23              'Vert' ( temp structure{ temp float myfloat,  temp int something})
+0:23              Constant:
+0:23                0 (const int)
+0:23          move second child to first child ( temp int)
+0:?             'OutputStream.something' (layout( location=1) out int)
+0:23            something: direct index for structure ( temp int)
+0:23              'Vert' ( temp structure{ temp float myfloat,  temp int something})
+0:23              Constant:
+0:23                1 (const int)
 0:23        EmitVertex ( temp void)
 0:24      EndPrimitive ( temp void)
 0:16  Function Definition: main( ( temp void)
@@ -143,16 +184,17 @@
 0:?   Linker Objects
 0:?     'VertexID' (layout( location=0) in 3-element array of uint)
 0:?     'test' (layout( location=1) in 3-element array of uint)
-0:?     'OutputStream' (layout( location=0) out structure{ temp float myfloat,  temp int something})
+0:?     'OutputStream.myfloat' (layout( location=0) out float)
+0:?     'OutputStream.something' (layout( location=1) out int)
 
 // Module Version 10000
-// Generated by (magic number): 80001
-// Id's are bound by 60
+// Generated by (magic number): 80007
+// Id's are bound by 68
 
                               Capability Geometry
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Geometry 4  "main" 42 47 50
+                              EntryPoint Geometry 4  "main" 42 46 55 58
                               ExecutionMode 4 Triangles
                               ExecutionMode 4 Invocations 1
                               ExecutionMode 4 OutputLineStrip
@@ -167,18 +209,20 @@
                               Name 16  "test"
                               Name 17  "OutputStream"
                               Name 20  "Vert"
-                              Name 42  "OutputStream"
-                              Name 45  "VertexID"
-                              Name 47  "VertexID"
-                              Name 49  "test"
-                              Name 50  "test"
-                              Name 52  "OutputStream"
-                              Name 53  "param"
-                              Name 55  "param"
-                              Name 57  "param"
-                              Decorate 42(OutputStream) Location 0
-                              Decorate 47(VertexID) Location 0
-                              Decorate 50(test) Location 1
+                              Name 42  "OutputStream.myfloat"
+                              Name 46  "OutputStream.something"
+                              Name 53  "VertexID"
+                              Name 55  "VertexID"
+                              Name 57  "test"
+                              Name 58  "test"
+                              Name 60  "OutputStream"
+                              Name 61  "param"
+                              Name 63  "param"
+                              Name 65  "param"
+                              Decorate 42(OutputStream.myfloat) Location 0
+                              Decorate 46(OutputStream.something) Location 1
+                              Decorate 55(VertexID) Location 0
+                              Decorate 58(test) Location 1
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 32 0
@@ -196,30 +240,32 @@
               29:     11(int) Constant 2
               34:             TypePointer Function 10(float)
               39:             TypePointer Function 11(int)
-              41:             TypePointer Output 12(PSInput)
-42(OutputStream):     41(ptr) Variable Output
-              46:             TypePointer Input 8
-    47(VertexID):     46(ptr) Variable Input
-        50(test):     46(ptr) Variable Input
+              41:             TypePointer Output 10(float)
+42(OutputStream.myfloat):     41(ptr) Variable Output
+              45:             TypePointer Output 11(int)
+46(OutputStream.something):     45(ptr) Variable Output
+              54:             TypePointer Input 8
+    55(VertexID):     54(ptr) Variable Input
+        58(test):     54(ptr) Variable Input
          4(main):           2 Function None 3
                5:             Label
-    45(VertexID):      9(ptr) Variable Function
-        49(test):      9(ptr) Variable Function
-52(OutputStream):     13(ptr) Variable Function
-       53(param):      9(ptr) Variable Function
-       55(param):      9(ptr) Variable Function
-       57(param):     13(ptr) Variable Function
-              48:           8 Load 47(VertexID)
-                              Store 45(VertexID) 48
-              51:           8 Load 50(test)
-                              Store 49(test) 51
-              54:           8 Load 45(VertexID)
-                              Store 53(param) 54
-              56:           8 Load 49(test)
-                              Store 55(param) 56
-              58:           2 FunctionCall 18(@main(u1[3];u1[3];struct-PSInput-f1-i11;) 53(param) 55(param) 57(param)
-              59: 12(PSInput) Load 57(param)
-                              Store 52(OutputStream) 59
+    53(VertexID):      9(ptr) Variable Function
+        57(test):      9(ptr) Variable Function
+60(OutputStream):     13(ptr) Variable Function
+       61(param):      9(ptr) Variable Function
+       63(param):      9(ptr) Variable Function
+       65(param):     13(ptr) Variable Function
+              56:           8 Load 55(VertexID)
+                              Store 53(VertexID) 56
+              59:           8 Load 58(test)
+                              Store 57(test) 59
+              62:           8 Load 53(VertexID)
+                              Store 61(param) 62
+              64:           8 Load 57(test)
+                              Store 63(param) 64
+              66:           2 FunctionCall 18(@main(u1[3];u1[3];struct-PSInput-f1-i11;) 61(param) 63(param) 65(param)
+              67: 12(PSInput) Load 65(param)
+                              Store 60(OutputStream) 67
                               Return
                               FunctionEnd
 18(@main(u1[3];u1[3];struct-PSInput-f1-i11;):           2 Function None 14
@@ -244,11 +290,19 @@
               38:     11(int) Bitcast 37
               40:     39(ptr) AccessChain 20(Vert) 25
                               Store 40 38
-              43: 12(PSInput) Load 20(Vert)
-                              Store 42(OutputStream) 43
+              43:     34(ptr) AccessChain 20(Vert) 21
+              44:   10(float) Load 43
+                              Store 42(OutputStream.myfloat) 44
+              47:     39(ptr) AccessChain 20(Vert) 25
+              48:     11(int) Load 47
+                              Store 46(OutputStream.something) 48
                               EmitVertex
-              44: 12(PSInput) Load 20(Vert)
-                              Store 42(OutputStream) 44
+              49:     34(ptr) AccessChain 20(Vert) 21
+              50:   10(float) Load 49
+                              Store 42(OutputStream.myfloat) 50
+              51:     39(ptr) AccessChain 20(Vert) 25
+              52:     11(int) Load 51
+                              Store 46(OutputStream.something) 52
                               EmitVertex
                               EndPrimitive
                               Return
diff --git a/Test/baseResults/hlsl.boolConv.vert.out b/Test/baseResults/hlsl.boolConv.vert.out
old mode 100755
new mode 100644
index 32c6eb2..d88955f
--- a/Test/baseResults/hlsl.boolConv.vert.out
+++ b/Test/baseResults/hlsl.boolConv.vert.out
@@ -16,84 +16,74 @@
 0:4            0 (const int)
 0:6      add second child into first child ( temp int)
 0:6        'r' ( temp int)
-0:6        Convert bool to int ( temp int)
-0:6          add ( temp bool)
-0:6            Convert bool to int ( temp int)
-0:6              'a' ( global bool)
-0:6            Convert bool to int ( temp int)
-0:6              'b' ( global bool)
+0:6        add ( temp int)
+0:6          Convert bool to int ( temp int)
+0:6            'a' ( global bool)
+0:6          Convert bool to int ( temp int)
+0:6            'b' ( global bool)
 0:7      add second child into first child ( temp int)
 0:7        'r' ( temp int)
-0:7        Convert bool to int ( temp int)
-0:7          subtract ( temp bool)
-0:7            Convert bool to int ( temp int)
-0:7              'a' ( global bool)
-0:7            Convert bool to int ( temp int)
-0:7              'b' ( global bool)
+0:7        subtract ( temp int)
+0:7          Convert bool to int ( temp int)
+0:7            'a' ( global bool)
+0:7          Convert bool to int ( temp int)
+0:7            'b' ( global bool)
 0:8      add second child into first child ( temp int)
 0:8        'r' ( temp int)
-0:8        Convert bool to int ( temp int)
-0:8          component-wise multiply ( temp bool)
-0:8            Convert bool to int ( temp int)
-0:8              'a' ( global bool)
-0:8            Convert bool to int ( temp int)
-0:8              'b' ( global bool)
+0:8        component-wise multiply ( temp int)
+0:8          Convert bool to int ( temp int)
+0:8            'a' ( global bool)
+0:8          Convert bool to int ( temp int)
+0:8            'b' ( global bool)
 0:9      add second child into first child ( temp int)
 0:9        'r' ( temp int)
-0:9        Convert bool to int ( temp int)
-0:9          divide ( temp bool)
-0:9            Convert bool to int ( temp int)
-0:9              'a' ( global bool)
-0:9            Convert bool to int ( temp int)
-0:9              'b' ( global bool)
+0:9        divide ( temp int)
+0:9          Convert bool to int ( temp int)
+0:9            'a' ( global bool)
+0:9          Convert bool to int ( temp int)
+0:9            'b' ( global bool)
 0:10      add second child into first child ( temp int)
 0:10        'r' ( temp int)
-0:10        Convert bool to int ( temp int)
-0:10          mod ( temp bool)
-0:10            Convert bool to int ( temp int)
-0:10              'a' ( global bool)
-0:10            Convert bool to int ( temp int)
-0:10              'b' ( global bool)
+0:10        mod ( temp int)
+0:10          Convert bool to int ( temp int)
+0:10            'a' ( global bool)
+0:10          Convert bool to int ( temp int)
+0:10            'b' ( global bool)
 0:12      add second child into first child ( temp int)
 0:12        'r' ( temp int)
-0:12        Convert bool to int ( temp int)
-0:12          bitwise and ( temp bool)
-0:12            Convert bool to int ( temp int)
-0:12              'a' ( global bool)
-0:12            Convert bool to int ( temp int)
-0:12              'b' ( global bool)
+0:12        bitwise and ( temp int)
+0:12          Convert bool to int ( temp int)
+0:12            'a' ( global bool)
+0:12          Convert bool to int ( temp int)
+0:12            'b' ( global bool)
 0:13      add second child into first child ( temp int)
 0:13        'r' ( temp int)
-0:13        Convert bool to int ( temp int)
-0:13          inclusive-or ( temp bool)
-0:13            Convert bool to int ( temp int)
-0:13              'a' ( global bool)
-0:13            Convert bool to int ( temp int)
-0:13              'b' ( global bool)
+0:13        inclusive-or ( temp int)
+0:13          Convert bool to int ( temp int)
+0:13            'a' ( global bool)
+0:13          Convert bool to int ( temp int)
+0:13            'b' ( global bool)
 0:14      add second child into first child ( temp int)
 0:14        'r' ( temp int)
-0:14        Convert bool to int ( temp int)
-0:14          exclusive-or ( temp bool)
-0:14            Convert bool to int ( temp int)
-0:14              'a' ( global bool)
-0:14            Convert bool to int ( temp int)
-0:14              'b' ( global bool)
+0:14        exclusive-or ( temp int)
+0:14          Convert bool to int ( temp int)
+0:14            'a' ( global bool)
+0:14          Convert bool to int ( temp int)
+0:14            'b' ( global bool)
 0:16      add second child into first child ( temp int)
 0:16        'r' ( temp int)
-0:16        Convert bool to int ( temp int)
-0:16          left-shift ( temp bool)
-0:16            Convert bool to int ( temp int)
-0:16              'a' ( global bool)
-0:16            Convert bool to int ( temp int)
-0:16              'b' ( global bool)
+0:16        left-shift ( temp int)
+0:16          Convert bool to int ( temp int)
+0:16            'a' ( global bool)
+0:16          Convert bool to int ( temp int)
+0:16            'b' ( global bool)
 0:17      add second child into first child ( temp int)
 0:17        'r' ( temp int)
-0:17        Convert bool to int ( temp int)
-0:17          right-shift ( temp bool)
-0:17            Convert bool to int ( temp int)
-0:17              'a' ( global bool)
-0:17            Convert bool to int ( temp int)
-0:17              'b' ( global bool)
+0:17        right-shift ( temp int)
+0:17          Convert bool to int ( temp int)
+0:17            'a' ( global bool)
+0:17          Convert bool to int ( temp int)
+0:17            'b' ( global bool)
 0:19      Branch: Return with expression
 0:19        Construct vec4 ( temp 4-component vector of float)
 0:19          Convert int to float ( temp float)
@@ -130,84 +120,74 @@
 0:4            0 (const int)
 0:6      add second child into first child ( temp int)
 0:6        'r' ( temp int)
-0:6        Convert bool to int ( temp int)
-0:6          add ( temp bool)
-0:6            Convert bool to int ( temp int)
-0:6              'a' ( global bool)
-0:6            Convert bool to int ( temp int)
-0:6              'b' ( global bool)
+0:6        add ( temp int)
+0:6          Convert bool to int ( temp int)
+0:6            'a' ( global bool)
+0:6          Convert bool to int ( temp int)
+0:6            'b' ( global bool)
 0:7      add second child into first child ( temp int)
 0:7        'r' ( temp int)
-0:7        Convert bool to int ( temp int)
-0:7          subtract ( temp bool)
-0:7            Convert bool to int ( temp int)
-0:7              'a' ( global bool)
-0:7            Convert bool to int ( temp int)
-0:7              'b' ( global bool)
+0:7        subtract ( temp int)
+0:7          Convert bool to int ( temp int)
+0:7            'a' ( global bool)
+0:7          Convert bool to int ( temp int)
+0:7            'b' ( global bool)
 0:8      add second child into first child ( temp int)
 0:8        'r' ( temp int)
-0:8        Convert bool to int ( temp int)
-0:8          component-wise multiply ( temp bool)
-0:8            Convert bool to int ( temp int)
-0:8              'a' ( global bool)
-0:8            Convert bool to int ( temp int)
-0:8              'b' ( global bool)
+0:8        component-wise multiply ( temp int)
+0:8          Convert bool to int ( temp int)
+0:8            'a' ( global bool)
+0:8          Convert bool to int ( temp int)
+0:8            'b' ( global bool)
 0:9      add second child into first child ( temp int)
 0:9        'r' ( temp int)
-0:9        Convert bool to int ( temp int)
-0:9          divide ( temp bool)
-0:9            Convert bool to int ( temp int)
-0:9              'a' ( global bool)
-0:9            Convert bool to int ( temp int)
-0:9              'b' ( global bool)
+0:9        divide ( temp int)
+0:9          Convert bool to int ( temp int)
+0:9            'a' ( global bool)
+0:9          Convert bool to int ( temp int)
+0:9            'b' ( global bool)
 0:10      add second child into first child ( temp int)
 0:10        'r' ( temp int)
-0:10        Convert bool to int ( temp int)
-0:10          mod ( temp bool)
-0:10            Convert bool to int ( temp int)
-0:10              'a' ( global bool)
-0:10            Convert bool to int ( temp int)
-0:10              'b' ( global bool)
+0:10        mod ( temp int)
+0:10          Convert bool to int ( temp int)
+0:10            'a' ( global bool)
+0:10          Convert bool to int ( temp int)
+0:10            'b' ( global bool)
 0:12      add second child into first child ( temp int)
 0:12        'r' ( temp int)
-0:12        Convert bool to int ( temp int)
-0:12          bitwise and ( temp bool)
-0:12            Convert bool to int ( temp int)
-0:12              'a' ( global bool)
-0:12            Convert bool to int ( temp int)
-0:12              'b' ( global bool)
+0:12        bitwise and ( temp int)
+0:12          Convert bool to int ( temp int)
+0:12            'a' ( global bool)
+0:12          Convert bool to int ( temp int)
+0:12            'b' ( global bool)
 0:13      add second child into first child ( temp int)
 0:13        'r' ( temp int)
-0:13        Convert bool to int ( temp int)
-0:13          inclusive-or ( temp bool)
-0:13            Convert bool to int ( temp int)
-0:13              'a' ( global bool)
-0:13            Convert bool to int ( temp int)
-0:13              'b' ( global bool)
+0:13        inclusive-or ( temp int)
+0:13          Convert bool to int ( temp int)
+0:13            'a' ( global bool)
+0:13          Convert bool to int ( temp int)
+0:13            'b' ( global bool)
 0:14      add second child into first child ( temp int)
 0:14        'r' ( temp int)
-0:14        Convert bool to int ( temp int)
-0:14          exclusive-or ( temp bool)
-0:14            Convert bool to int ( temp int)
-0:14              'a' ( global bool)
-0:14            Convert bool to int ( temp int)
-0:14              'b' ( global bool)
+0:14        exclusive-or ( temp int)
+0:14          Convert bool to int ( temp int)
+0:14            'a' ( global bool)
+0:14          Convert bool to int ( temp int)
+0:14            'b' ( global bool)
 0:16      add second child into first child ( temp int)
 0:16        'r' ( temp int)
-0:16        Convert bool to int ( temp int)
-0:16          left-shift ( temp bool)
-0:16            Convert bool to int ( temp int)
-0:16              'a' ( global bool)
-0:16            Convert bool to int ( temp int)
-0:16              'b' ( global bool)
+0:16        left-shift ( temp int)
+0:16          Convert bool to int ( temp int)
+0:16            'a' ( global bool)
+0:16          Convert bool to int ( temp int)
+0:16            'b' ( global bool)
 0:17      add second child into first child ( temp int)
 0:17        'r' ( temp int)
-0:17        Convert bool to int ( temp int)
-0:17          right-shift ( temp bool)
-0:17            Convert bool to int ( temp int)
-0:17              'a' ( global bool)
-0:17            Convert bool to int ( temp int)
-0:17              'b' ( global bool)
+0:17        right-shift ( temp int)
+0:17          Convert bool to int ( temp int)
+0:17            'a' ( global bool)
+0:17          Convert bool to int ( temp int)
+0:17            'b' ( global bool)
 0:19      Branch: Return with expression
 0:19        Construct vec4 ( temp 4-component vector of float)
 0:19          Convert int to float ( temp float)
@@ -224,21 +204,21 @@
 0:?     '@entryPointOutput' ( out 4-component vector of float Position)
 
 // Module Version 10000
-// Generated by (magic number): 80001
-// Id's are bound by 109
+// Generated by (magic number): 80007
+// Id's are bound by 99
 
                               Capability Shader
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Vertex 4  "main" 107
+                              EntryPoint Vertex 4  "main" 97
                               Source HLSL 500
                               Name 4  "main"
                               Name 9  "@main("
                               Name 13  "b"
                               Name 17  "r"
                               Name 19  "a"
-                              Name 107  "@entryPointOutput"
-                              Decorate 107(@entryPointOutput) BuiltIn Position
+                              Name 97  "@entryPointOutput"
+                              Decorate 97(@entryPointOutput) BuiltIn Position
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -253,13 +233,13 @@
               18:     15(int) Constant 0
            19(a):     12(ptr) Variable Private
               21:     15(int) Constant 1
-             106:             TypePointer Output 7(fvec4)
-107(@entryPointOutput):    106(ptr) Variable Output
+              96:             TypePointer Output 7(fvec4)
+97(@entryPointOutput):     96(ptr) Variable Output
          4(main):           2 Function None 3
                5:             Label
                               Store 13(b) 14
-             108:    7(fvec4) FunctionCall 9(@main()
-                              Store 107(@entryPointOutput) 108
+              98:    7(fvec4) FunctionCall 9(@main()
+                              Store 97(@entryPointOutput) 98
                               Return
                               FunctionEnd
        9(@main():    7(fvec4) Function None 8
@@ -270,62 +250,63 @@
               22:     15(int) Select 20 21 18
               23:    11(bool) Load 13(b)
               24:     15(int) Select 23 21 18
-              25:    11(bool) IAdd 22 24
-              26:     15(int) Select 25 21 18
-              27:     15(int) Load 17(r)
-              28:     15(int) IAdd 27 26
-                              Store 17(r) 28
-              29:    11(bool) Load 19(a)
-              30:     15(int) Select 29 21 18
-              31:    11(bool) Load 13(b)
-              32:     15(int) Select 31 21 18
-              33:    11(bool) ISub 30 32
-              34:     15(int) Select 33 21 18
-              35:     15(int) Load 17(r)
-              36:     15(int) IAdd 35 34
-                              Store 17(r) 36
-              37:    11(bool) Load 19(a)
+              25:     15(int) IAdd 22 24
+              26:     15(int) Load 17(r)
+              27:     15(int) IAdd 26 25
+                              Store 17(r) 27
+              28:    11(bool) Load 19(a)
+              29:     15(int) Select 28 21 18
+              30:    11(bool) Load 13(b)
+              31:     15(int) Select 30 21 18
+              32:     15(int) ISub 29 31
+              33:     15(int) Load 17(r)
+              34:     15(int) IAdd 33 32
+                              Store 17(r) 34
+              35:    11(bool) Load 19(a)
+              36:     15(int) Select 35 21 18
+              37:    11(bool) Load 13(b)
               38:     15(int) Select 37 21 18
-              39:    11(bool) Load 13(b)
-              40:     15(int) Select 39 21 18
-              41:    11(bool) IMul 38 40
-              42:     15(int) Select 41 21 18
-              43:     15(int) Load 17(r)
-              44:     15(int) IAdd 43 42
-                              Store 17(r) 44
-              45:    11(bool) Load 19(a)
-              46:     15(int) Select 45 21 18
-              47:    11(bool) Load 13(b)
-              48:     15(int) Select 47 21 18
-              49:    11(bool) SDiv 46 48
+              39:     15(int) IMul 36 38
+              40:     15(int) Load 17(r)
+              41:     15(int) IAdd 40 39
+                              Store 17(r) 41
+              42:    11(bool) Load 19(a)
+              43:     15(int) Select 42 21 18
+              44:    11(bool) Load 13(b)
+              45:     15(int) Select 44 21 18
+              46:     15(int) SDiv 43 45
+              47:     15(int) Load 17(r)
+              48:     15(int) IAdd 47 46
+                              Store 17(r) 48
+              49:    11(bool) Load 19(a)
               50:     15(int) Select 49 21 18
-              51:     15(int) Load 17(r)
-              52:     15(int) IAdd 51 50
-                              Store 17(r) 52
-              53:    11(bool) Load 19(a)
-              54:     15(int) Select 53 21 18
-              55:    11(bool) Load 13(b)
-              56:     15(int) Select 55 21 18
-              57:    11(bool) SMod 54 56
-              58:     15(int) Select 57 21 18
-              59:     15(int) Load 17(r)
-              60:     15(int) IAdd 59 58
-                              Store 17(r) 60
-              61:    11(bool) Load 19(a)
-              62:     15(int) Select 61 21 18
-              63:    11(bool) Load 13(b)
+              51:    11(bool) Load 13(b)
+              52:     15(int) Select 51 21 18
+              53:     15(int) SMod 50 52
+              54:     15(int) Load 17(r)
+              55:     15(int) IAdd 54 53
+                              Store 17(r) 55
+              56:    11(bool) Load 19(a)
+              57:     15(int) Select 56 21 18
+              58:    11(bool) Load 13(b)
+              59:     15(int) Select 58 21 18
+              60:     15(int) BitwiseAnd 57 59
+              61:     15(int) Load 17(r)
+              62:     15(int) IAdd 61 60
+                              Store 17(r) 62
+              63:    11(bool) Load 19(a)
               64:     15(int) Select 63 21 18
-              65:    11(bool) BitwiseAnd 62 64
+              65:    11(bool) Load 13(b)
               66:     15(int) Select 65 21 18
-              67:     15(int) Load 17(r)
-              68:     15(int) IAdd 67 66
-                              Store 17(r) 68
-              69:    11(bool) Load 19(a)
-              70:     15(int) Select 69 21 18
-              71:    11(bool) Load 13(b)
-              72:     15(int) Select 71 21 18
-              73:    11(bool) BitwiseOr 70 72
-              74:     15(int) Select 73 21 18
+              67:     15(int) BitwiseOr 64 66
+              68:     15(int) Load 17(r)
+              69:     15(int) IAdd 68 67
+                              Store 17(r) 69
+              70:    11(bool) Load 19(a)
+              71:     15(int) Select 70 21 18
+              72:    11(bool) Load 13(b)
+              73:     15(int) Select 72 21 18
+              74:     15(int) BitwiseXor 71 73
               75:     15(int) Load 17(r)
               76:     15(int) IAdd 75 74
                               Store 17(r) 76
@@ -333,31 +314,20 @@
               78:     15(int) Select 77 21 18
               79:    11(bool) Load 13(b)
               80:     15(int) Select 79 21 18
-              81:    11(bool) BitwiseXor 78 80
-              82:     15(int) Select 81 21 18
-              83:     15(int) Load 17(r)
-              84:     15(int) IAdd 83 82
-                              Store 17(r) 84
-              85:    11(bool) Load 19(a)
-              86:     15(int) Select 85 21 18
-              87:    11(bool) Load 13(b)
-              88:     15(int) Select 87 21 18
-              89:    11(bool) ShiftLeftLogical 86 88
-              90:     15(int) Select 89 21 18
+              81:     15(int) ShiftLeftLogical 78 80
+              82:     15(int) Load 17(r)
+              83:     15(int) IAdd 82 81
+                              Store 17(r) 83
+              84:    11(bool) Load 19(a)
+              85:     15(int) Select 84 21 18
+              86:    11(bool) Load 13(b)
+              87:     15(int) Select 86 21 18
+              88:     15(int) ShiftRightArithmetic 85 87
+              89:     15(int) Load 17(r)
+              90:     15(int) IAdd 89 88
+                              Store 17(r) 90
               91:     15(int) Load 17(r)
-              92:     15(int) IAdd 91 90
-                              Store 17(r) 92
-              93:    11(bool) Load 19(a)
-              94:     15(int) Select 93 21 18
-              95:    11(bool) Load 13(b)
-              96:     15(int) Select 95 21 18
-              97:    11(bool) ShiftRightArithmetic 94 96
-              98:     15(int) Select 97 21 18
-              99:     15(int) Load 17(r)
-             100:     15(int) IAdd 99 98
-                              Store 17(r) 100
-             101:     15(int) Load 17(r)
-             102:    6(float) ConvertSToF 101
-             103:    7(fvec4) CompositeConstruct 102 102 102 102
-                              ReturnValue 103
+              92:    6(float) ConvertSToF 91
+              93:    7(fvec4) CompositeConstruct 92 92 92 92
+                              ReturnValue 93
                               FunctionEnd
diff --git a/Test/baseResults/hlsl.buffer.frag.out b/Test/baseResults/hlsl.buffer.frag.out
old mode 100755
new mode 100644
index faa2ad6..71393f0
--- a/Test/baseResults/hlsl.buffer.frag.out
+++ b/Test/baseResults/hlsl.buffer.frag.out
@@ -2,49 +2,73 @@
 Shader version: 500
 gl_FragCoord origin is upper left
 0:? Sequence
-0:30  Function Definition: @PixelShaderFunction(vf4; ( temp 4-component vector of float)
+0:30  Function Definition: foo( ( temp float)
 0:30    Function Parameters: 
-0:30      'input' ( in 4-component vector of float)
 0:?     Sequence
 0:31      Branch: Return with expression
-0:31        add ( temp 4-component vector of float)
-0:31          add ( temp 4-component vector of float)
-0:31            add ( temp 4-component vector of float)
-0:31              add ( temp 4-component vector of float)
-0:31                'input' ( in 4-component vector of float)
-0:31                v1: direct index for structure (layout( row_major std140) uniform 4-component vector of float)
-0:31                  'anon@0' (layout( row_major std140) uniform block{layout( row_major std140) uniform 4-component vector of float v1})
-0:31                  Constant:
-0:31                    0 (const uint)
-0:31              v2: direct index for structure (layout( row_major std430) buffer 4-component vector of float)
-0:31                'anon@1' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer 4-component vector of float v2})
-0:31                Constant:
-0:31                  0 (const uint)
-0:31            v3: direct index for structure (layout( row_major std140) uniform 4-component vector of float)
-0:31              'anon@2' (layout( set=10 binding=2 row_major std140) uniform block{layout( row_major std140) uniform 4-component vector of float v3, layout( row_major std140 offset=20) uniform int i3})
-0:31              Constant:
-0:31                0 (const uint)
-0:31          v4: direct index for structure (layout( row_major std430 offset=16) buffer 4-component vector of float)
-0:31            'anon@3' (layout( binding=8 row_major std430) readonly buffer block{layout( row_major std430 offset=16) buffer 4-component vector of float v4, layout( row_major std430 offset=48) buffer int i4, layout( row_major std430 offset=60) buffer float f1, layout( row_major std430 offset=64) buffer float f3, layout( row_major std430 offset=68) buffer float f4, layout( row_major std430 offset=72) buffer float f5, layout( row_major std430) buffer float f6, layout( row_major std430) buffer float f7, layout( row_major std430) buffer 3X4 matrix of float m1, layout( column_major std430) buffer 3X4 matrix of float m2, layout( row_major std430) buffer 3X4 matrix of float m3, layout( row_major std430) buffer 3X4 matrix of float m4})
-0:31            Constant:
-0:31              0 (const uint)
-0:30  Function Definition: PixelShaderFunction( ( temp void)
-0:30    Function Parameters: 
+0:31        Constant:
+0:31          1.000000
+0:43  Function Definition: @PixelShaderFunction(vf4; ( temp structure{ temp 4-component vector of float a})
+0:43    Function Parameters: 
+0:43      'input' ( in 4-component vector of float)
 0:?     Sequence
-0:30      move second child to first child ( temp 4-component vector of float)
+0:45      move second child to first child ( temp 4-component vector of float)
+0:45        a: direct index for structure ( temp 4-component vector of float)
+0:45          'ret' ( temp structure{ temp 4-component vector of float a})
+0:45          Constant:
+0:45            0 (const int)
+0:45        add ( temp 4-component vector of float)
+0:45          v24: direct index for structure (layout( row_major std140) uniform 4-component vector of float)
+0:45            'anon@4' (layout( row_major std140) uniform block{layout( row_major std140) uniform 4-component vector of float v24})
+0:45            Constant:
+0:45              0 (const uint)
+0:45          vector-scale ( temp 4-component vector of float)
+0:45            add ( temp 4-component vector of float)
+0:45              add ( temp 4-component vector of float)
+0:45                add ( temp 4-component vector of float)
+0:45                  add ( temp 4-component vector of float)
+0:45                    'input' ( in 4-component vector of float)
+0:45                    v1: direct index for structure (layout( row_major std140) uniform 4-component vector of float)
+0:45                      'anon@0' (layout( row_major std140) uniform block{layout( row_major std140) uniform 4-component vector of float v1})
+0:45                      Constant:
+0:45                        0 (const uint)
+0:45                  v2: direct index for structure (layout( row_major std430) buffer 4-component vector of float)
+0:45                    'anon@1' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer 4-component vector of float v2})
+0:45                    Constant:
+0:45                      0 (const uint)
+0:45                v3: direct index for structure (layout( row_major std140 offset=0) uniform 4-component vector of float)
+0:45                  'anon@2' (layout( row_major std140) uniform block{layout( row_major std140 offset=0) uniform 4-component vector of float v3, layout( row_major std140 offset=20) uniform int i3})
+0:45                  Constant:
+0:45                    0 (const uint)
+0:45              v4: direct index for structure (layout( row_major std430 offset=16) buffer 4-component vector of float)
+0:45                'anon@3' (layout( binding=8 row_major std430) readonly buffer block{layout( row_major std430 offset=16) buffer 4-component vector of float v4, layout( row_major std430 offset=48) buffer int i4, layout( row_major std430 offset=60) buffer float f1, layout( row_major std430 offset=64) buffer float f3, layout( row_major std430 offset=68) buffer float f4, layout( row_major std430 offset=72) buffer float f5, layout( row_major std430) buffer float f6, layout( row_major std430 offset=128) buffer float f7, layout( row_major std430 offset=112) buffer 3X4 matrix of float m1, layout( column_major std430 offset=176) buffer 3X4 matrix of float m2, layout( row_major std430 offset=240) buffer 3X4 matrix of float m3, layout( row_major std430 offset=304) buffer 3X4 matrix of float m4})
+0:45                Constant:
+0:45                  0 (const uint)
+0:45            Function Call: foo( ( temp float)
+0:46      Branch: Return with expression
+0:46        'ret' ( temp structure{ temp 4-component vector of float a})
+0:43  Function Definition: PixelShaderFunction( ( temp void)
+0:43    Function Parameters: 
+0:?     Sequence
+0:43      move second child to first child ( temp 4-component vector of float)
 0:?         'input' ( temp 4-component vector of float)
-0:?         'input' (layout( location=0) in 4-component vector of float)
-0:30      move second child to first child ( temp 4-component vector of float)
-0:?         '@entryPointOutput' (layout( location=0) out 4-component vector of float)
-0:30        Function Call: @PixelShaderFunction(vf4; ( temp 4-component vector of float)
-0:?           'input' ( temp 4-component vector of float)
+0:?         'input' ( in 4-component vector of float FragCoord)
+0:43      Sequence
+0:43        move second child to first child ( temp 4-component vector of float)
+0:?           '@entryPointOutput.a' (layout( location=0) out 4-component vector of float)
+0:43          a: direct index for structure ( temp 4-component vector of float)
+0:43            Function Call: @PixelShaderFunction(vf4; ( temp structure{ temp 4-component vector of float a})
+0:?               'input' ( temp 4-component vector of float)
+0:43            Constant:
+0:43              0 (const int)
 0:?   Linker Objects
 0:?     'anon@0' (layout( row_major std140) uniform block{layout( row_major std140) uniform 4-component vector of float v1})
 0:?     'anon@1' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer 4-component vector of float v2})
-0:?     'anon@2' (layout( set=10 binding=2 row_major std140) uniform block{layout( row_major std140) uniform 4-component vector of float v3, layout( row_major std140 offset=20) uniform int i3})
-0:?     'anon@3' (layout( binding=8 row_major std430) readonly buffer block{layout( row_major std430 offset=16) buffer 4-component vector of float v4, layout( row_major std430 offset=48) buffer int i4, layout( row_major std430 offset=60) buffer float f1, layout( row_major std430 offset=64) buffer float f3, layout( row_major std430 offset=68) buffer float f4, layout( row_major std430 offset=72) buffer float f5, layout( row_major std430) buffer float f6, layout( row_major std430) buffer float f7, layout( row_major std430) buffer 3X4 matrix of float m1, layout( column_major std430) buffer 3X4 matrix of float m2, layout( row_major std430) buffer 3X4 matrix of float m3, layout( row_major std430) buffer 3X4 matrix of float m4})
-0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
-0:?     'input' (layout( location=0) in 4-component vector of float)
+0:?     'anon@2' (layout( row_major std140) uniform block{layout( row_major std140 offset=0) uniform 4-component vector of float v3, layout( row_major std140 offset=20) uniform int i3})
+0:?     'anon@3' (layout( binding=8 row_major std430) readonly buffer block{layout( row_major std430 offset=16) buffer 4-component vector of float v4, layout( row_major std430 offset=48) buffer int i4, layout( row_major std430 offset=60) buffer float f1, layout( row_major std430 offset=64) buffer float f3, layout( row_major std430 offset=68) buffer float f4, layout( row_major std430 offset=72) buffer float f5, layout( row_major std430) buffer float f6, layout( row_major std430 offset=128) buffer float f7, layout( row_major std430 offset=112) buffer 3X4 matrix of float m1, layout( column_major std430 offset=176) buffer 3X4 matrix of float m2, layout( row_major std430 offset=240) buffer 3X4 matrix of float m3, layout( row_major std430 offset=304) buffer 3X4 matrix of float m4})
+0:?     'anon@4' (layout( row_major std140) uniform block{layout( row_major std140) uniform 4-component vector of float v24})
+0:?     '@entryPointOutput.a' (layout( location=0) out 4-component vector of float)
+0:?     'input' ( in 4-component vector of float FragCoord)
 
 
 Linked fragment stage:
@@ -53,193 +77,251 @@
 Shader version: 500
 gl_FragCoord origin is upper left
 0:? Sequence
-0:30  Function Definition: @PixelShaderFunction(vf4; ( temp 4-component vector of float)
+0:30  Function Definition: foo( ( temp float)
 0:30    Function Parameters: 
-0:30      'input' ( in 4-component vector of float)
 0:?     Sequence
 0:31      Branch: Return with expression
-0:31        add ( temp 4-component vector of float)
-0:31          add ( temp 4-component vector of float)
-0:31            add ( temp 4-component vector of float)
-0:31              add ( temp 4-component vector of float)
-0:31                'input' ( in 4-component vector of float)
-0:31                v1: direct index for structure (layout( row_major std140) uniform 4-component vector of float)
-0:31                  'anon@0' (layout( row_major std140) uniform block{layout( row_major std140) uniform 4-component vector of float v1})
-0:31                  Constant:
-0:31                    0 (const uint)
-0:31              v2: direct index for structure (layout( row_major std430) buffer 4-component vector of float)
-0:31                'anon@1' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer 4-component vector of float v2})
-0:31                Constant:
-0:31                  0 (const uint)
-0:31            v3: direct index for structure (layout( row_major std140) uniform 4-component vector of float)
-0:31              'anon@2' (layout( set=10 binding=2 row_major std140) uniform block{layout( row_major std140) uniform 4-component vector of float v3, layout( row_major std140 offset=20) uniform int i3})
-0:31              Constant:
-0:31                0 (const uint)
-0:31          v4: direct index for structure (layout( row_major std430 offset=16) buffer 4-component vector of float)
-0:31            'anon@3' (layout( binding=8 row_major std430) readonly buffer block{layout( row_major std430 offset=16) buffer 4-component vector of float v4, layout( row_major std430 offset=48) buffer int i4, layout( row_major std430 offset=60) buffer float f1, layout( row_major std430 offset=64) buffer float f3, layout( row_major std430 offset=68) buffer float f4, layout( row_major std430 offset=72) buffer float f5, layout( row_major std430) buffer float f6, layout( row_major std430) buffer float f7, layout( row_major std430) buffer 3X4 matrix of float m1, layout( column_major std430) buffer 3X4 matrix of float m2, layout( row_major std430) buffer 3X4 matrix of float m3, layout( row_major std430) buffer 3X4 matrix of float m4})
-0:31            Constant:
-0:31              0 (const uint)
-0:30  Function Definition: PixelShaderFunction( ( temp void)
-0:30    Function Parameters: 
+0:31        Constant:
+0:31          1.000000
+0:43  Function Definition: @PixelShaderFunction(vf4; ( temp structure{ temp 4-component vector of float a})
+0:43    Function Parameters: 
+0:43      'input' ( in 4-component vector of float)
 0:?     Sequence
-0:30      move second child to first child ( temp 4-component vector of float)
+0:45      move second child to first child ( temp 4-component vector of float)
+0:45        a: direct index for structure ( temp 4-component vector of float)
+0:45          'ret' ( temp structure{ temp 4-component vector of float a})
+0:45          Constant:
+0:45            0 (const int)
+0:45        add ( temp 4-component vector of float)
+0:45          v24: direct index for structure (layout( row_major std140) uniform 4-component vector of float)
+0:45            'anon@4' (layout( row_major std140) uniform block{layout( row_major std140) uniform 4-component vector of float v24})
+0:45            Constant:
+0:45              0 (const uint)
+0:45          vector-scale ( temp 4-component vector of float)
+0:45            add ( temp 4-component vector of float)
+0:45              add ( temp 4-component vector of float)
+0:45                add ( temp 4-component vector of float)
+0:45                  add ( temp 4-component vector of float)
+0:45                    'input' ( in 4-component vector of float)
+0:45                    v1: direct index for structure (layout( row_major std140) uniform 4-component vector of float)
+0:45                      'anon@0' (layout( row_major std140) uniform block{layout( row_major std140) uniform 4-component vector of float v1})
+0:45                      Constant:
+0:45                        0 (const uint)
+0:45                  v2: direct index for structure (layout( row_major std430) buffer 4-component vector of float)
+0:45                    'anon@1' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer 4-component vector of float v2})
+0:45                    Constant:
+0:45                      0 (const uint)
+0:45                v3: direct index for structure (layout( row_major std140 offset=0) uniform 4-component vector of float)
+0:45                  'anon@2' (layout( row_major std140) uniform block{layout( row_major std140 offset=0) uniform 4-component vector of float v3, layout( row_major std140 offset=20) uniform int i3})
+0:45                  Constant:
+0:45                    0 (const uint)
+0:45              v4: direct index for structure (layout( row_major std430 offset=16) buffer 4-component vector of float)
+0:45                'anon@3' (layout( binding=8 row_major std430) readonly buffer block{layout( row_major std430 offset=16) buffer 4-component vector of float v4, layout( row_major std430 offset=48) buffer int i4, layout( row_major std430 offset=60) buffer float f1, layout( row_major std430 offset=64) buffer float f3, layout( row_major std430 offset=68) buffer float f4, layout( row_major std430 offset=72) buffer float f5, layout( row_major std430) buffer float f6, layout( row_major std430 offset=128) buffer float f7, layout( row_major std430 offset=112) buffer 3X4 matrix of float m1, layout( column_major std430 offset=176) buffer 3X4 matrix of float m2, layout( row_major std430 offset=240) buffer 3X4 matrix of float m3, layout( row_major std430 offset=304) buffer 3X4 matrix of float m4})
+0:45                Constant:
+0:45                  0 (const uint)
+0:45            Function Call: foo( ( temp float)
+0:46      Branch: Return with expression
+0:46        'ret' ( temp structure{ temp 4-component vector of float a})
+0:43  Function Definition: PixelShaderFunction( ( temp void)
+0:43    Function Parameters: 
+0:?     Sequence
+0:43      move second child to first child ( temp 4-component vector of float)
 0:?         'input' ( temp 4-component vector of float)
-0:?         'input' (layout( location=0) in 4-component vector of float)
-0:30      move second child to first child ( temp 4-component vector of float)
-0:?         '@entryPointOutput' (layout( location=0) out 4-component vector of float)
-0:30        Function Call: @PixelShaderFunction(vf4; ( temp 4-component vector of float)
-0:?           'input' ( temp 4-component vector of float)
+0:?         'input' ( in 4-component vector of float FragCoord)
+0:43      Sequence
+0:43        move second child to first child ( temp 4-component vector of float)
+0:?           '@entryPointOutput.a' (layout( location=0) out 4-component vector of float)
+0:43          a: direct index for structure ( temp 4-component vector of float)
+0:43            Function Call: @PixelShaderFunction(vf4; ( temp structure{ temp 4-component vector of float a})
+0:?               'input' ( temp 4-component vector of float)
+0:43            Constant:
+0:43              0 (const int)
 0:?   Linker Objects
 0:?     'anon@0' (layout( row_major std140) uniform block{layout( row_major std140) uniform 4-component vector of float v1})
 0:?     'anon@1' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer 4-component vector of float v2})
-0:?     'anon@2' (layout( set=10 binding=2 row_major std140) uniform block{layout( row_major std140) uniform 4-component vector of float v3, layout( row_major std140 offset=20) uniform int i3})
-0:?     'anon@3' (layout( binding=8 row_major std430) readonly buffer block{layout( row_major std430 offset=16) buffer 4-component vector of float v4, layout( row_major std430 offset=48) buffer int i4, layout( row_major std430 offset=60) buffer float f1, layout( row_major std430 offset=64) buffer float f3, layout( row_major std430 offset=68) buffer float f4, layout( row_major std430 offset=72) buffer float f5, layout( row_major std430) buffer float f6, layout( row_major std430) buffer float f7, layout( row_major std430) buffer 3X4 matrix of float m1, layout( column_major std430) buffer 3X4 matrix of float m2, layout( row_major std430) buffer 3X4 matrix of float m3, layout( row_major std430) buffer 3X4 matrix of float m4})
-0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
-0:?     'input' (layout( location=0) in 4-component vector of float)
+0:?     'anon@2' (layout( row_major std140) uniform block{layout( row_major std140 offset=0) uniform 4-component vector of float v3, layout( row_major std140 offset=20) uniform int i3})
+0:?     'anon@3' (layout( binding=8 row_major std430) readonly buffer block{layout( row_major std430 offset=16) buffer 4-component vector of float v4, layout( row_major std430 offset=48) buffer int i4, layout( row_major std430 offset=60) buffer float f1, layout( row_major std430 offset=64) buffer float f3, layout( row_major std430 offset=68) buffer float f4, layout( row_major std430 offset=72) buffer float f5, layout( row_major std430) buffer float f6, layout( row_major std430 offset=128) buffer float f7, layout( row_major std430 offset=112) buffer 3X4 matrix of float m1, layout( column_major std430 offset=176) buffer 3X4 matrix of float m2, layout( row_major std430 offset=240) buffer 3X4 matrix of float m3, layout( row_major std430 offset=304) buffer 3X4 matrix of float m4})
+0:?     'anon@4' (layout( row_major std140) uniform block{layout( row_major std140) uniform 4-component vector of float v24})
+0:?     '@entryPointOutput.a' (layout( location=0) out 4-component vector of float)
+0:?     'input' ( in 4-component vector of float FragCoord)
+
+error: SPIRV-Tools Validation Errors
+error: Structure id 50 decorated as BufferBlock for variable in Uniform storage class must follow relaxed storage buffer layout rules: member 7 at offset 128 overlaps previous member ending at offset 171
+  %tbufName = OpTypeStruct %v4float %int %float %float %float %float %float %float %mat3v4float %mat3v4float %mat3v4float %mat3v4float
 
 // Module Version 10000
-// Generated by (magic number): 80001
-// Id's are bound by 53
+// Generated by (magic number): 80007
+// Id's are bound by 73
 
                               Capability Shader
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "PixelShaderFunction" 46 49
+                              EntryPoint Fragment 4  "PixelShaderFunction" 65 68
                               ExecutionMode 4 OriginUpperLeft
                               Source HLSL 500
                               Name 4  "PixelShaderFunction"
-                              Name 11  "@PixelShaderFunction(vf4;"
-                              Name 10  "input"
-                              Name 14  ""
-                              MemberName 14 0  "v1"
-                              Name 16  ""
-                              Name 23  ""
-                              MemberName 23 0  "v2"
-                              Name 25  ""
-                              Name 29  "cbufName"
-                              MemberName 29(cbufName) 0  "v3"
-                              MemberName 29(cbufName) 1  "i3"
-                              Name 31  ""
-                              Name 36  "tbufName"
-                              MemberName 36(tbufName) 0  "v4"
-                              MemberName 36(tbufName) 1  "i4"
-                              MemberName 36(tbufName) 2  "f1"
-                              MemberName 36(tbufName) 3  "f3"
-                              MemberName 36(tbufName) 4  "f4"
-                              MemberName 36(tbufName) 5  "f5"
-                              MemberName 36(tbufName) 6  "f6"
-                              MemberName 36(tbufName) 7  "f7"
-                              MemberName 36(tbufName) 8  "m1"
-                              MemberName 36(tbufName) 9  "m2"
-                              MemberName 36(tbufName) 10  "m3"
-                              MemberName 36(tbufName) 11  "m4"
-                              Name 38  ""
-                              Name 44  "input"
-                              Name 46  "input"
-                              Name 49  "@entryPointOutput"
-                              Name 50  "param"
-                              MemberDecorate 14 0 Offset 0
-                              Decorate 14 Block
-                              Decorate 16 DescriptorSet 0
-                              MemberDecorate 23 0 NonWritable
-                              MemberDecorate 23 0 Offset 0
-                              Decorate 23 BufferBlock
-                              Decorate 25 DescriptorSet 0
-                              MemberDecorate 29(cbufName) 0 Offset 0
-                              MemberDecorate 29(cbufName) 1 Offset 20
-                              Decorate 29(cbufName) Block
-                              Decorate 31 DescriptorSet 10
-                              Decorate 31 Binding 2
-                              MemberDecorate 36(tbufName) 0 NonWritable
-                              MemberDecorate 36(tbufName) 0 Offset 16
-                              MemberDecorate 36(tbufName) 1 NonWritable
-                              MemberDecorate 36(tbufName) 1 Offset 48
-                              MemberDecorate 36(tbufName) 2 NonWritable
-                              MemberDecorate 36(tbufName) 2 Offset 60
-                              MemberDecorate 36(tbufName) 3 NonWritable
-                              MemberDecorate 36(tbufName) 3 Offset 64
-                              MemberDecorate 36(tbufName) 4 NonWritable
-                              MemberDecorate 36(tbufName) 4 Offset 68
-                              MemberDecorate 36(tbufName) 5 NonWritable
-                              MemberDecorate 36(tbufName) 5 Offset 72
-                              MemberDecorate 36(tbufName) 6 NonWritable
-                              MemberDecorate 36(tbufName) 6 Offset 76
-                              MemberDecorate 36(tbufName) 7 NonWritable
-                              MemberDecorate 36(tbufName) 7 Offset 80
-                              MemberDecorate 36(tbufName) 8 RowMajor
-                              MemberDecorate 36(tbufName) 8 NonWritable
-                              MemberDecorate 36(tbufName) 8 Offset 96
-                              MemberDecorate 36(tbufName) 8 MatrixStride 16
-                              MemberDecorate 36(tbufName) 9 ColMajor
-                              MemberDecorate 36(tbufName) 9 NonWritable
-                              MemberDecorate 36(tbufName) 9 Offset 160
-                              MemberDecorate 36(tbufName) 9 MatrixStride 16
-                              MemberDecorate 36(tbufName) 10 RowMajor
-                              MemberDecorate 36(tbufName) 10 NonWritable
-                              MemberDecorate 36(tbufName) 10 Offset 208
-                              MemberDecorate 36(tbufName) 10 MatrixStride 16
-                              MemberDecorate 36(tbufName) 11 RowMajor
-                              MemberDecorate 36(tbufName) 11 NonWritable
-                              MemberDecorate 36(tbufName) 11 Offset 272
-                              MemberDecorate 36(tbufName) 11 MatrixStride 16
-                              Decorate 36(tbufName) BufferBlock
-                              Decorate 38 DescriptorSet 0
-                              Decorate 38 Binding 8
-                              Decorate 46(input) Location 0
-                              Decorate 49(@entryPointOutput) Location 0
+                              Name 8  "foo("
+                              Name 12  "id"
+                              MemberName 12(id) 0  "a"
+                              Name 15  "@PixelShaderFunction(vf4;"
+                              Name 14  "input"
+                              Name 21  "ret"
+                              Name 24  "cbufName2"
+                              MemberName 24(cbufName2) 0  "v24"
+                              Name 26  ""
+                              Name 31  "buf1"
+                              MemberName 31(buf1) 0  "v1"
+                              Name 33  ""
+                              Name 37  "buf2"
+                              MemberName 37(buf2) 0  "v2"
+                              Name 39  ""
+                              Name 43  "cbufName"
+                              MemberName 43(cbufName) 0  "v3"
+                              MemberName 43(cbufName) 1  "i3"
+                              Name 45  ""
+                              Name 50  "tbufName"
+                              MemberName 50(tbufName) 0  "v4"
+                              MemberName 50(tbufName) 1  "i4"
+                              MemberName 50(tbufName) 2  "f1"
+                              MemberName 50(tbufName) 3  "f3"
+                              MemberName 50(tbufName) 4  "f4"
+                              MemberName 50(tbufName) 5  "f5"
+                              MemberName 50(tbufName) 6  "f6"
+                              MemberName 50(tbufName) 7  "f7"
+                              MemberName 50(tbufName) 8  "m1"
+                              MemberName 50(tbufName) 9  "m2"
+                              MemberName 50(tbufName) 10  "m3"
+                              MemberName 50(tbufName) 11  "m4"
+                              Name 52  ""
+                              Name 63  "input"
+                              Name 65  "input"
+                              Name 68  "@entryPointOutput.a"
+                              Name 69  "param"
+                              MemberDecorate 24(cbufName2) 0 Offset 0
+                              Decorate 24(cbufName2) Block
+                              Decorate 26 DescriptorSet 0
+                              MemberDecorate 31(buf1) 0 Offset 0
+                              Decorate 31(buf1) Block
+                              Decorate 33 DescriptorSet 0
+                              MemberDecorate 37(buf2) 0 NonWritable
+                              MemberDecorate 37(buf2) 0 Offset 0
+                              Decorate 37(buf2) BufferBlock
+                              Decorate 39 DescriptorSet 0
+                              MemberDecorate 43(cbufName) 0 Offset 0
+                              MemberDecorate 43(cbufName) 1 Offset 20
+                              Decorate 43(cbufName) Block
+                              Decorate 45 DescriptorSet 0
+                              MemberDecorate 50(tbufName) 0 NonWritable
+                              MemberDecorate 50(tbufName) 0 Offset 16
+                              MemberDecorate 50(tbufName) 1 NonWritable
+                              MemberDecorate 50(tbufName) 1 Offset 48
+                              MemberDecorate 50(tbufName) 2 NonWritable
+                              MemberDecorate 50(tbufName) 2 Offset 60
+                              MemberDecorate 50(tbufName) 3 NonWritable
+                              MemberDecorate 50(tbufName) 3 Offset 64
+                              MemberDecorate 50(tbufName) 4 NonWritable
+                              MemberDecorate 50(tbufName) 4 Offset 68
+                              MemberDecorate 50(tbufName) 5 NonWritable
+                              MemberDecorate 50(tbufName) 5 Offset 72
+                              MemberDecorate 50(tbufName) 6 NonWritable
+                              MemberDecorate 50(tbufName) 6 Offset 76
+                              MemberDecorate 50(tbufName) 7 NonWritable
+                              MemberDecorate 50(tbufName) 7 Offset 128
+                              MemberDecorate 50(tbufName) 8 RowMajor
+                              MemberDecorate 50(tbufName) 8 NonWritable
+                              MemberDecorate 50(tbufName) 8 Offset 112
+                              MemberDecorate 50(tbufName) 8 MatrixStride 16
+                              MemberDecorate 50(tbufName) 9 ColMajor
+                              MemberDecorate 50(tbufName) 9 NonWritable
+                              MemberDecorate 50(tbufName) 9 Offset 176
+                              MemberDecorate 50(tbufName) 9 MatrixStride 16
+                              MemberDecorate 50(tbufName) 10 RowMajor
+                              MemberDecorate 50(tbufName) 10 NonWritable
+                              MemberDecorate 50(tbufName) 10 Offset 240
+                              MemberDecorate 50(tbufName) 10 MatrixStride 16
+                              MemberDecorate 50(tbufName) 11 RowMajor
+                              MemberDecorate 50(tbufName) 11 NonWritable
+                              MemberDecorate 50(tbufName) 11 Offset 304
+                              MemberDecorate 50(tbufName) 11 MatrixStride 16
+                              Decorate 50(tbufName) BufferBlock
+                              Decorate 52 DescriptorSet 0
+                              Decorate 52 Binding 8
+                              Decorate 65(input) BuiltIn FragCoord
+                              Decorate 68(@entryPointOutput.a) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
-               7:             TypeVector 6(float) 4
-               8:             TypePointer Function 7(fvec4)
-               9:             TypeFunction 7(fvec4) 8(ptr)
-              14:             TypeStruct 7(fvec4)
-              15:             TypePointer Uniform 14(struct)
-              16:     15(ptr) Variable Uniform
-              17:             TypeInt 32 1
-              18:     17(int) Constant 0
-              19:             TypePointer Uniform 7(fvec4)
-              23:             TypeStruct 7(fvec4)
-              24:             TypePointer Uniform 23(struct)
-              25:     24(ptr) Variable Uniform
-    29(cbufName):             TypeStruct 7(fvec4) 17(int)
-              30:             TypePointer Uniform 29(cbufName)
-              31:     30(ptr) Variable Uniform
-              35:             TypeMatrix 7(fvec4) 3
-    36(tbufName):             TypeStruct 7(fvec4) 17(int) 6(float) 6(float) 6(float) 6(float) 6(float) 6(float) 35 35 35 35
-              37:             TypePointer Uniform 36(tbufName)
-              38:     37(ptr) Variable Uniform
-              45:             TypePointer Input 7(fvec4)
-       46(input):     45(ptr) Variable Input
-              48:             TypePointer Output 7(fvec4)
-49(@entryPointOutput):     48(ptr) Variable Output
+               7:             TypeFunction 6(float)
+              10:             TypeVector 6(float) 4
+              11:             TypePointer Function 10(fvec4)
+          12(id):             TypeStruct 10(fvec4)
+              13:             TypeFunction 12(id) 11(ptr)
+              17:    6(float) Constant 1065353216
+              20:             TypePointer Function 12(id)
+              22:             TypeInt 32 1
+              23:     22(int) Constant 0
+   24(cbufName2):             TypeStruct 10(fvec4)
+              25:             TypePointer Uniform 24(cbufName2)
+              26:     25(ptr) Variable Uniform
+              27:             TypePointer Uniform 10(fvec4)
+        31(buf1):             TypeStruct 10(fvec4)
+              32:             TypePointer Uniform 31(buf1)
+              33:     32(ptr) Variable Uniform
+        37(buf2):             TypeStruct 10(fvec4)
+              38:             TypePointer Uniform 37(buf2)
+              39:     38(ptr) Variable Uniform
+    43(cbufName):             TypeStruct 10(fvec4) 22(int)
+              44:             TypePointer Uniform 43(cbufName)
+              45:     44(ptr) Variable Uniform
+              49:             TypeMatrix 10(fvec4) 3
+    50(tbufName):             TypeStruct 10(fvec4) 22(int) 6(float) 6(float) 6(float) 6(float) 6(float) 6(float) 49 49 49 49
+              51:             TypePointer Uniform 50(tbufName)
+              52:     51(ptr) Variable Uniform
+              64:             TypePointer Input 10(fvec4)
+       65(input):     64(ptr) Variable Input
+              67:             TypePointer Output 10(fvec4)
+68(@entryPointOutput.a):     67(ptr) Variable Output
 4(PixelShaderFunction):           2 Function None 3
                5:             Label
-       44(input):      8(ptr) Variable Function
-       50(param):      8(ptr) Variable Function
-              47:    7(fvec4) Load 46(input)
-                              Store 44(input) 47
-              51:    7(fvec4) Load 44(input)
-                              Store 50(param) 51
-              52:    7(fvec4) FunctionCall 11(@PixelShaderFunction(vf4;) 50(param)
-                              Store 49(@entryPointOutput) 52
+       63(input):     11(ptr) Variable Function
+       69(param):     11(ptr) Variable Function
+              66:   10(fvec4) Load 65(input)
+                              Store 63(input) 66
+              70:   10(fvec4) Load 63(input)
+                              Store 69(param) 70
+              71:      12(id) FunctionCall 15(@PixelShaderFunction(vf4;) 69(param)
+              72:   10(fvec4) CompositeExtract 71 0
+                              Store 68(@entryPointOutput.a) 72
                               Return
                               FunctionEnd
-11(@PixelShaderFunction(vf4;):    7(fvec4) Function None 9
-       10(input):      8(ptr) FunctionParameter
-              12:             Label
-              13:    7(fvec4) Load 10(input)
-              20:     19(ptr) AccessChain 16 18
-              21:    7(fvec4) Load 20
-              22:    7(fvec4) FAdd 13 21
-              26:     19(ptr) AccessChain 25 18
-              27:    7(fvec4) Load 26
-              28:    7(fvec4) FAdd 22 27
-              32:     19(ptr) AccessChain 31 18
-              33:    7(fvec4) Load 32
-              34:    7(fvec4) FAdd 28 33
-              39:     19(ptr) AccessChain 38 18
-              40:    7(fvec4) Load 39
-              41:    7(fvec4) FAdd 34 40
-                              ReturnValue 41
+         8(foo():    6(float) Function None 7
+               9:             Label
+                              ReturnValue 17
+                              FunctionEnd
+15(@PixelShaderFunction(vf4;):      12(id) Function None 13
+       14(input):     11(ptr) FunctionParameter
+              16:             Label
+         21(ret):     20(ptr) Variable Function
+              28:     27(ptr) AccessChain 26 23
+              29:   10(fvec4) Load 28
+              30:   10(fvec4) Load 14(input)
+              34:     27(ptr) AccessChain 33 23
+              35:   10(fvec4) Load 34
+              36:   10(fvec4) FAdd 30 35
+              40:     27(ptr) AccessChain 39 23
+              41:   10(fvec4) Load 40
+              42:   10(fvec4) FAdd 36 41
+              46:     27(ptr) AccessChain 45 23
+              47:   10(fvec4) Load 46
+              48:   10(fvec4) FAdd 42 47
+              53:     27(ptr) AccessChain 52 23
+              54:   10(fvec4) Load 53
+              55:   10(fvec4) FAdd 48 54
+              56:    6(float) FunctionCall 8(foo()
+              57:   10(fvec4) VectorTimesScalar 55 56
+              58:   10(fvec4) FAdd 29 57
+              59:     11(ptr) AccessChain 21(ret) 23
+                              Store 59 58
+              60:      12(id) Load 21(ret)
+                              ReturnValue 60
                               FunctionEnd
diff --git a/Test/baseResults/hlsl.calculatelod.dx10.frag.out b/Test/baseResults/hlsl.calculatelod.dx10.frag.out
index 535905c..46b4eea 100644
--- a/Test/baseResults/hlsl.calculatelod.dx10.frag.out
+++ b/Test/baseResults/hlsl.calculatelod.dx10.frag.out
@@ -1,6 +1,7 @@
 hlsl.calculatelod.dx10.frag
 Shader version: 500
 gl_FragCoord origin is upper left
+using depth_any
 0:? Sequence
 0:24  Function Definition: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:24    Function Parameters: 
@@ -149,13 +150,13 @@
 0:24          'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:24          Function Call: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:24        move second child to first child ( temp 4-component vector of float)
-0:?           'Color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 0:24          Color: direct index for structure ( temp 4-component vector of float)
 0:24            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:24            Constant:
 0:24              0 (const int)
 0:24        move second child to first child ( temp float)
-0:?           'Depth' ( out float FragDepth)
+0:?           '@entryPointOutput.Depth' ( out float FragDepth)
 0:24          Depth: direct index for structure ( temp float)
 0:24            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:24            Constant:
@@ -172,8 +173,8 @@
 0:?     'g_tTexcdf4a' ( uniform textureCubeArray)
 0:?     'g_tTexcdi4a' ( uniform itextureCubeArray)
 0:?     'g_tTexcdu4a' ( uniform utextureCubeArray)
-0:?     'Color' (layout( location=0) out 4-component vector of float)
-0:?     'Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 
 Linked fragment stage:
@@ -181,6 +182,7 @@
 
 Shader version: 500
 gl_FragCoord origin is upper left
+using depth_any
 0:? Sequence
 0:24  Function Definition: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:24    Function Parameters: 
@@ -329,13 +331,13 @@
 0:24          'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:24          Function Call: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:24        move second child to first child ( temp 4-component vector of float)
-0:?           'Color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 0:24          Color: direct index for structure ( temp 4-component vector of float)
 0:24            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:24            Constant:
 0:24              0 (const int)
 0:24        move second child to first child ( temp float)
-0:?           'Depth' ( out float FragDepth)
+0:?           '@entryPointOutput.Depth' ( out float FragDepth)
 0:24          Depth: direct index for structure ( temp float)
 0:24            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:24            Constant:
@@ -352,11 +354,11 @@
 0:?     'g_tTexcdf4a' ( uniform textureCubeArray)
 0:?     'g_tTexcdi4a' ( uniform itextureCubeArray)
 0:?     'g_tTexcdu4a' ( uniform utextureCubeArray)
-0:?     'Color' (layout( location=0) out 4-component vector of float)
-0:?     'Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 148
 
                               Capability Shader
@@ -367,6 +369,7 @@
                               MemoryModel Logical GLSL450
                               EntryPoint Fragment 4  "main" 140 144
                               ExecutionMode 4 OriginUpperLeft
+                              ExecutionMode 4 DepthReplacing
                               Source HLSL 500
                               Name 4  "main"
                               Name 8  "PS_OUTPUT"
@@ -394,8 +397,8 @@
                               Name 115  "g_tTexcdu4a"
                               Name 127  "psout"
                               Name 137  "flattenTemp"
-                              Name 140  "Color"
-                              Name 144  "Depth"
+                              Name 140  "@entryPointOutput.Color"
+                              Name 144  "@entryPointOutput.Depth"
                               Name 147  "g_tTex1df4"
                               Decorate 16(g_tTex1df4a) DescriptorSet 0
                               Decorate 16(g_tTex1df4a) Binding 1
@@ -409,8 +412,8 @@
                               Decorate 92(g_tTexcdf4a) DescriptorSet 0
                               Decorate 104(g_tTexcdi4a) DescriptorSet 0
                               Decorate 115(g_tTexcdu4a) DescriptorSet 0
-                              Decorate 140(Color) Location 0
-                              Decorate 144(Depth) BuiltIn FragDepth
+                              Decorate 140(@entryPointOutput.Color) Location 0
+                              Decorate 144(@entryPointOutput.Depth) BuiltIn FragDepth
                               Decorate 147(g_tTex1df4) DescriptorSet 0
                               Decorate 147(g_tTex1df4) Binding 0
                2:             TypeVoid
@@ -485,9 +488,9 @@
              130:             TypePointer Function 7(fvec4)
              132:     27(int) Constant 1
              139:             TypePointer Output 7(fvec4)
-      140(Color):    139(ptr) Variable Output
+140(@entryPointOutput.Color):    139(ptr) Variable Output
              143:             TypePointer Output 6(float)
-      144(Depth):    143(ptr) Variable Output
+144(@entryPointOutput.Depth):    143(ptr) Variable Output
  147(g_tTex1df4):     15(ptr) Variable UniformConstant
          4(main):           2 Function None 3
                5:             Label
@@ -496,10 +499,10 @@
                               Store 137(flattenTemp) 138
              141:    130(ptr) AccessChain 137(flattenTemp) 28
              142:    7(fvec4) Load 141
-                              Store 140(Color) 142
+                              Store 140(@entryPointOutput.Color) 142
              145:     12(ptr) AccessChain 137(flattenTemp) 132
              146:    6(float) Load 145
-                              Store 144(Depth) 146
+                              Store 144(@entryPointOutput.Depth) 146
                               Return
                               FunctionEnd
       10(@main():8(PS_OUTPUT) Function None 9
diff --git a/Test/baseResults/hlsl.calculatelodunclamped.dx10.frag.out b/Test/baseResults/hlsl.calculatelodunclamped.dx10.frag.out
index f19f5d0..ef5aabe 100644
--- a/Test/baseResults/hlsl.calculatelodunclamped.dx10.frag.out
+++ b/Test/baseResults/hlsl.calculatelodunclamped.dx10.frag.out
@@ -1,19 +1,8 @@
 hlsl.calculatelodunclamped.dx10.frag
-ERROR: 0:28: '' : unimplemented: CalculateLevelOfDetailUnclamped 
-ERROR: 0:29: '' : unimplemented: CalculateLevelOfDetailUnclamped 
-ERROR: 0:30: '' : unimplemented: CalculateLevelOfDetailUnclamped 
-ERROR: 0:32: '' : unimplemented: CalculateLevelOfDetailUnclamped 
-ERROR: 0:33: '' : unimplemented: CalculateLevelOfDetailUnclamped 
-ERROR: 0:34: '' : unimplemented: CalculateLevelOfDetailUnclamped 
-ERROR: 0:36: '' : unimplemented: CalculateLevelOfDetailUnclamped 
-ERROR: 0:37: '' : unimplemented: CalculateLevelOfDetailUnclamped 
-ERROR: 0:38: '' : unimplemented: CalculateLevelOfDetailUnclamped 
-ERROR: 9 compilation errors.  No code generated.
-
-
 Shader version: 500
 gl_FragCoord origin is upper left
-ERROR: node is still EOpNull!
+using depth_any
+0:? Sequence
 0:24  Function Definition: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:24    Function Parameters: 
 0:?     Sequence
@@ -28,7 +17,7 @@
 0:28              Constant:
 0:28                0.100000
 0:28            Constant:
-0:28              0 (const int)
+0:28              1 (const int)
 0:29      Sequence
 0:29        move second child to first child ( temp float)
 0:29          'txval11' ( temp float)
@@ -40,7 +29,7 @@
 0:29              Constant:
 0:29                0.200000
 0:29            Constant:
-0:29              0 (const int)
+0:29              1 (const int)
 0:30      Sequence
 0:30        move second child to first child ( temp float)
 0:30          'txval12' ( temp float)
@@ -52,7 +41,7 @@
 0:30              Constant:
 0:30                0.300000
 0:30            Constant:
-0:30              0 (const int)
+0:30              1 (const int)
 0:32      Sequence
 0:32        move second child to first child ( temp float)
 0:32          'txval20' ( temp float)
@@ -65,7 +54,7 @@
 0:?                 0.100000
 0:?                 0.200000
 0:32            Constant:
-0:32              0 (const int)
+0:32              1 (const int)
 0:33      Sequence
 0:33        move second child to first child ( temp float)
 0:33          'txval21' ( temp float)
@@ -78,7 +67,7 @@
 0:?                 0.300000
 0:?                 0.400000
 0:33            Constant:
-0:33              0 (const int)
+0:33              1 (const int)
 0:34      Sequence
 0:34        move second child to first child ( temp float)
 0:34          'txval22' ( temp float)
@@ -91,7 +80,7 @@
 0:?                 0.500000
 0:?                 0.600000
 0:34            Constant:
-0:34              0 (const int)
+0:34              1 (const int)
 0:36      Sequence
 0:36        move second child to first child ( temp float)
 0:36          'txval40' ( temp float)
@@ -105,7 +94,7 @@
 0:?                 0.200000
 0:?                 0.300000
 0:36            Constant:
-0:36              0 (const int)
+0:36              1 (const int)
 0:37      Sequence
 0:37        move second child to first child ( temp float)
 0:37          'txval41' ( temp float)
@@ -119,7 +108,7 @@
 0:?                 0.500000
 0:?                 0.600000
 0:37            Constant:
-0:37              0 (const int)
+0:37              1 (const int)
 0:38      Sequence
 0:38        move second child to first child ( temp float)
 0:38          'txval42' ( temp float)
@@ -133,7 +122,7 @@
 0:?                 0.800000
 0:?                 0.900000
 0:38            Constant:
-0:38              0 (const int)
+0:38              1 (const int)
 0:40      move second child to first child ( temp 4-component vector of float)
 0:40        Color: direct index for structure ( temp 4-component vector of float)
 0:40          'psout' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
@@ -161,13 +150,13 @@
 0:24          'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:24          Function Call: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:24        move second child to first child ( temp 4-component vector of float)
-0:?           'Color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 0:24          Color: direct index for structure ( temp 4-component vector of float)
 0:24            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:24            Constant:
 0:24              0 (const int)
 0:24        move second child to first child ( temp float)
-0:?           'Depth' ( out float FragDepth)
+0:?           '@entryPointOutput.Depth' ( out float FragDepth)
 0:24          Depth: direct index for structure ( temp float)
 0:24            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:24            Constant:
@@ -184,8 +173,8 @@
 0:?     'g_tTexcdf4a' ( uniform textureCubeArray)
 0:?     'g_tTexcdi4a' ( uniform itextureCubeArray)
 0:?     'g_tTexcdu4a' ( uniform utextureCubeArray)
-0:?     'Color' (layout( location=0) out 4-component vector of float)
-0:?     'Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 
 Linked fragment stage:
@@ -193,7 +182,8 @@
 
 Shader version: 500
 gl_FragCoord origin is upper left
-ERROR: node is still EOpNull!
+using depth_any
+0:? Sequence
 0:24  Function Definition: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:24    Function Parameters: 
 0:?     Sequence
@@ -208,7 +198,7 @@
 0:28              Constant:
 0:28                0.100000
 0:28            Constant:
-0:28              0 (const int)
+0:28              1 (const int)
 0:29      Sequence
 0:29        move second child to first child ( temp float)
 0:29          'txval11' ( temp float)
@@ -220,7 +210,7 @@
 0:29              Constant:
 0:29                0.200000
 0:29            Constant:
-0:29              0 (const int)
+0:29              1 (const int)
 0:30      Sequence
 0:30        move second child to first child ( temp float)
 0:30          'txval12' ( temp float)
@@ -232,7 +222,7 @@
 0:30              Constant:
 0:30                0.300000
 0:30            Constant:
-0:30              0 (const int)
+0:30              1 (const int)
 0:32      Sequence
 0:32        move second child to first child ( temp float)
 0:32          'txval20' ( temp float)
@@ -245,7 +235,7 @@
 0:?                 0.100000
 0:?                 0.200000
 0:32            Constant:
-0:32              0 (const int)
+0:32              1 (const int)
 0:33      Sequence
 0:33        move second child to first child ( temp float)
 0:33          'txval21' ( temp float)
@@ -258,7 +248,7 @@
 0:?                 0.300000
 0:?                 0.400000
 0:33            Constant:
-0:33              0 (const int)
+0:33              1 (const int)
 0:34      Sequence
 0:34        move second child to first child ( temp float)
 0:34          'txval22' ( temp float)
@@ -271,7 +261,7 @@
 0:?                 0.500000
 0:?                 0.600000
 0:34            Constant:
-0:34              0 (const int)
+0:34              1 (const int)
 0:36      Sequence
 0:36        move second child to first child ( temp float)
 0:36          'txval40' ( temp float)
@@ -285,7 +275,7 @@
 0:?                 0.200000
 0:?                 0.300000
 0:36            Constant:
-0:36              0 (const int)
+0:36              1 (const int)
 0:37      Sequence
 0:37        move second child to first child ( temp float)
 0:37          'txval41' ( temp float)
@@ -299,7 +289,7 @@
 0:?                 0.500000
 0:?                 0.600000
 0:37            Constant:
-0:37              0 (const int)
+0:37              1 (const int)
 0:38      Sequence
 0:38        move second child to first child ( temp float)
 0:38          'txval42' ( temp float)
@@ -313,7 +303,7 @@
 0:?                 0.800000
 0:?                 0.900000
 0:38            Constant:
-0:38              0 (const int)
+0:38              1 (const int)
 0:40      move second child to first child ( temp 4-component vector of float)
 0:40        Color: direct index for structure ( temp 4-component vector of float)
 0:40          'psout' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
@@ -341,13 +331,13 @@
 0:24          'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:24          Function Call: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:24        move second child to first child ( temp 4-component vector of float)
-0:?           'Color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 0:24          Color: direct index for structure ( temp 4-component vector of float)
 0:24            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:24            Constant:
 0:24              0 (const int)
 0:24        move second child to first child ( temp float)
-0:?           'Depth' ( out float FragDepth)
+0:?           '@entryPointOutput.Depth' ( out float FragDepth)
 0:24          Depth: direct index for structure ( temp float)
 0:24            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:24            Constant:
@@ -364,7 +354,227 @@
 0:?     'g_tTexcdf4a' ( uniform textureCubeArray)
 0:?     'g_tTexcdi4a' ( uniform itextureCubeArray)
 0:?     'g_tTexcdu4a' ( uniform utextureCubeArray)
-0:?     'Color' (layout( location=0) out 4-component vector of float)
-0:?     'Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
-SPIR-V is not generated for failed compile or link
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 148
+
+                              Capability Shader
+                              Capability Sampled1D
+                              Capability SampledCubeArray
+                              Capability ImageQuery
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 140 144
+                              ExecutionMode 4 OriginUpperLeft
+                              ExecutionMode 4 DepthReplacing
+                              Source HLSL 500
+                              Name 4  "main"
+                              Name 8  "PS_OUTPUT"
+                              MemberName 8(PS_OUTPUT) 0  "Color"
+                              MemberName 8(PS_OUTPUT) 1  "Depth"
+                              Name 10  "@main("
+                              Name 13  "txval10"
+                              Name 16  "g_tTex1df4a"
+                              Name 20  "g_sSamp"
+                              Name 30  "txval11"
+                              Name 33  "g_tTex1di4a"
+                              Name 41  "txval12"
+                              Name 45  "g_tTex1du4a"
+                              Name 53  "txval20"
+                              Name 56  "g_tTex2df4a"
+                              Name 64  "txval21"
+                              Name 67  "g_tTex2di4a"
+                              Name 76  "txval22"
+                              Name 79  "g_tTex2du4a"
+                              Name 89  "txval40"
+                              Name 92  "g_tTexcdf4a"
+                              Name 101  "txval41"
+                              Name 104  "g_tTexcdi4a"
+                              Name 112  "txval42"
+                              Name 115  "g_tTexcdu4a"
+                              Name 127  "psout"
+                              Name 137  "flattenTemp"
+                              Name 140  "@entryPointOutput.Color"
+                              Name 144  "@entryPointOutput.Depth"
+                              Name 147  "g_tTex1df4"
+                              Decorate 16(g_tTex1df4a) DescriptorSet 0
+                              Decorate 16(g_tTex1df4a) Binding 1
+                              Decorate 20(g_sSamp) DescriptorSet 0
+                              Decorate 20(g_sSamp) Binding 0
+                              Decorate 33(g_tTex1di4a) DescriptorSet 0
+                              Decorate 45(g_tTex1du4a) DescriptorSet 0
+                              Decorate 56(g_tTex2df4a) DescriptorSet 0
+                              Decorate 67(g_tTex2di4a) DescriptorSet 0
+                              Decorate 79(g_tTex2du4a) DescriptorSet 0
+                              Decorate 92(g_tTexcdf4a) DescriptorSet 0
+                              Decorate 104(g_tTexcdi4a) DescriptorSet 0
+                              Decorate 115(g_tTexcdu4a) DescriptorSet 0
+                              Decorate 140(@entryPointOutput.Color) Location 0
+                              Decorate 144(@entryPointOutput.Depth) BuiltIn FragDepth
+                              Decorate 147(g_tTex1df4) DescriptorSet 0
+                              Decorate 147(g_tTex1df4) Binding 0
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+    8(PS_OUTPUT):             TypeStruct 7(fvec4) 6(float)
+               9:             TypeFunction 8(PS_OUTPUT)
+              12:             TypePointer Function 6(float)
+              14:             TypeImage 6(float) 1D array sampled format:Unknown
+              15:             TypePointer UniformConstant 14
+ 16(g_tTex1df4a):     15(ptr) Variable UniformConstant
+              18:             TypeSampler
+              19:             TypePointer UniformConstant 18
+     20(g_sSamp):     19(ptr) Variable UniformConstant
+              22:             TypeSampledImage 14
+              24:    6(float) Constant 1036831949
+              25:             TypeVector 6(float) 2
+              27:             TypeInt 32 1
+              28:     27(int) Constant 1
+              31:             TypeImage 27(int) 1D array sampled format:Unknown
+              32:             TypePointer UniformConstant 31
+ 33(g_tTex1di4a):     32(ptr) Variable UniformConstant
+              36:             TypeSampledImage 31
+              38:    6(float) Constant 1045220557
+              42:             TypeInt 32 0
+              43:             TypeImage 42(int) 1D array sampled format:Unknown
+              44:             TypePointer UniformConstant 43
+ 45(g_tTex1du4a):     44(ptr) Variable UniformConstant
+              48:             TypeSampledImage 43
+              50:    6(float) Constant 1050253722
+              54:             TypeImage 6(float) 2D array sampled format:Unknown
+              55:             TypePointer UniformConstant 54
+ 56(g_tTex2df4a):     55(ptr) Variable UniformConstant
+              59:             TypeSampledImage 54
+              61:   25(fvec2) ConstantComposite 24 38
+              65:             TypeImage 27(int) 2D array sampled format:Unknown
+              66:             TypePointer UniformConstant 65
+ 67(g_tTex2di4a):     66(ptr) Variable UniformConstant
+              70:             TypeSampledImage 65
+              72:    6(float) Constant 1053609165
+              73:   25(fvec2) ConstantComposite 50 72
+              77:             TypeImage 42(int) 2D array sampled format:Unknown
+              78:             TypePointer UniformConstant 77
+ 79(g_tTex2du4a):     78(ptr) Variable UniformConstant
+              82:             TypeSampledImage 77
+              84:    6(float) Constant 1056964608
+              85:    6(float) Constant 1058642330
+              86:   25(fvec2) ConstantComposite 84 85
+              90:             TypeImage 6(float) Cube array sampled format:Unknown
+              91:             TypePointer UniformConstant 90
+ 92(g_tTexcdf4a):     91(ptr) Variable UniformConstant
+              95:             TypeSampledImage 90
+              97:             TypeVector 6(float) 3
+              98:   97(fvec3) ConstantComposite 24 38 50
+             102:             TypeImage 27(int) Cube array sampled format:Unknown
+             103:             TypePointer UniformConstant 102
+104(g_tTexcdi4a):    103(ptr) Variable UniformConstant
+             107:             TypeSampledImage 102
+             109:   97(fvec3) ConstantComposite 72 84 85
+             113:             TypeImage 42(int) Cube array sampled format:Unknown
+             114:             TypePointer UniformConstant 113
+115(g_tTexcdu4a):    114(ptr) Variable UniformConstant
+             118:             TypeSampledImage 113
+             120:    6(float) Constant 1060320051
+             121:    6(float) Constant 1061997773
+             122:    6(float) Constant 1063675494
+             123:   97(fvec3) ConstantComposite 120 121 122
+             126:             TypePointer Function 8(PS_OUTPUT)
+             128:     27(int) Constant 0
+             129:    6(float) Constant 1065353216
+             130:    7(fvec4) ConstantComposite 129 129 129 129
+             131:             TypePointer Function 7(fvec4)
+             139:             TypePointer Output 7(fvec4)
+140(@entryPointOutput.Color):    139(ptr) Variable Output
+             143:             TypePointer Output 6(float)
+144(@entryPointOutput.Depth):    143(ptr) Variable Output
+ 147(g_tTex1df4):     15(ptr) Variable UniformConstant
+         4(main):           2 Function None 3
+               5:             Label
+137(flattenTemp):    126(ptr) Variable Function
+             138:8(PS_OUTPUT) FunctionCall 10(@main()
+                              Store 137(flattenTemp) 138
+             141:    131(ptr) AccessChain 137(flattenTemp) 128
+             142:    7(fvec4) Load 141
+                              Store 140(@entryPointOutput.Color) 142
+             145:     12(ptr) AccessChain 137(flattenTemp) 28
+             146:    6(float) Load 145
+                              Store 144(@entryPointOutput.Depth) 146
+                              Return
+                              FunctionEnd
+      10(@main():8(PS_OUTPUT) Function None 9
+              11:             Label
+     13(txval10):     12(ptr) Variable Function
+     30(txval11):     12(ptr) Variable Function
+     41(txval12):     12(ptr) Variable Function
+     53(txval20):     12(ptr) Variable Function
+     64(txval21):     12(ptr) Variable Function
+     76(txval22):     12(ptr) Variable Function
+     89(txval40):     12(ptr) Variable Function
+    101(txval41):     12(ptr) Variable Function
+    112(txval42):     12(ptr) Variable Function
+      127(psout):    126(ptr) Variable Function
+              17:          14 Load 16(g_tTex1df4a)
+              21:          18 Load 20(g_sSamp)
+              23:          22 SampledImage 17 21
+              26:   25(fvec2) ImageQueryLod 23 24
+              29:    6(float) CompositeExtract 26 1
+                              Store 13(txval10) 29
+              34:          31 Load 33(g_tTex1di4a)
+              35:          18 Load 20(g_sSamp)
+              37:          36 SampledImage 34 35
+              39:   25(fvec2) ImageQueryLod 37 38
+              40:    6(float) CompositeExtract 39 1
+                              Store 30(txval11) 40
+              46:          43 Load 45(g_tTex1du4a)
+              47:          18 Load 20(g_sSamp)
+              49:          48 SampledImage 46 47
+              51:   25(fvec2) ImageQueryLod 49 50
+              52:    6(float) CompositeExtract 51 1
+                              Store 41(txval12) 52
+              57:          54 Load 56(g_tTex2df4a)
+              58:          18 Load 20(g_sSamp)
+              60:          59 SampledImage 57 58
+              62:   25(fvec2) ImageQueryLod 60 61
+              63:    6(float) CompositeExtract 62 1
+                              Store 53(txval20) 63
+              68:          65 Load 67(g_tTex2di4a)
+              69:          18 Load 20(g_sSamp)
+              71:          70 SampledImage 68 69
+              74:   25(fvec2) ImageQueryLod 71 73
+              75:    6(float) CompositeExtract 74 1
+                              Store 64(txval21) 75
+              80:          77 Load 79(g_tTex2du4a)
+              81:          18 Load 20(g_sSamp)
+              83:          82 SampledImage 80 81
+              87:   25(fvec2) ImageQueryLod 83 86
+              88:    6(float) CompositeExtract 87 1
+                              Store 76(txval22) 88
+              93:          90 Load 92(g_tTexcdf4a)
+              94:          18 Load 20(g_sSamp)
+              96:          95 SampledImage 93 94
+              99:   25(fvec2) ImageQueryLod 96 98
+             100:    6(float) CompositeExtract 99 1
+                              Store 89(txval40) 100
+             105:         102 Load 104(g_tTexcdi4a)
+             106:          18 Load 20(g_sSamp)
+             108:         107 SampledImage 105 106
+             110:   25(fvec2) ImageQueryLod 108 109
+             111:    6(float) CompositeExtract 110 1
+                              Store 101(txval41) 111
+             116:         113 Load 115(g_tTexcdu4a)
+             117:          18 Load 20(g_sSamp)
+             119:         118 SampledImage 116 117
+             124:   25(fvec2) ImageQueryLod 119 123
+             125:    6(float) CompositeExtract 124 1
+                              Store 112(txval42) 125
+             132:    131(ptr) AccessChain 127(psout) 128
+                              Store 132 130
+             133:     12(ptr) AccessChain 127(psout) 28
+                              Store 133 129
+             134:8(PS_OUTPUT) Load 127(psout)
+                              ReturnValue 134
+                              FunctionEnd
diff --git a/Test/baseResults/hlsl.cast.frag.out b/Test/baseResults/hlsl.cast.frag.out
old mode 100755
new mode 100644
index 854c94e..0aa11be
--- a/Test/baseResults/hlsl.cast.frag.out
+++ b/Test/baseResults/hlsl.cast.frag.out
@@ -9,8 +9,7 @@
 0:3      Branch: Return with expression
 0:3        add ( temp 4-component vector of float)
 0:3          add ( temp 4-component vector of float)
-0:3            Construct vec4 ( temp 4-component vector of float)
-0:3              'input' ( in 4-component vector of float)
+0:3            'input' ( in 4-component vector of float)
 0:3            Convert int to float ( temp 4-component vector of float)
 0:3              Convert float to int ( temp 4-component vector of int)
 0:3                'input' ( in 4-component vector of float)
@@ -47,8 +46,7 @@
 0:3      Branch: Return with expression
 0:3        add ( temp 4-component vector of float)
 0:3          add ( temp 4-component vector of float)
-0:3            Construct vec4 ( temp 4-component vector of float)
-0:3              'input' ( in 4-component vector of float)
+0:3            'input' ( in 4-component vector of float)
 0:3            Convert int to float ( temp 4-component vector of float)
 0:3              Convert float to int ( temp 4-component vector of int)
 0:3                'input' ( in 4-component vector of float)
@@ -72,63 +70,58 @@
 0:?     'input' (layout( location=0) in 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80001
-// Id's are bound by 39
+// Generated by (magic number): 80007
+// Id's are bound by 34
 
                               Capability Shader
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "PixelShaderFunction" 32 35
+                              EntryPoint Fragment 4  "PixelShaderFunction" 27 30
                               ExecutionMode 4 OriginUpperLeft
                               Source HLSL 500
                               Name 4  "PixelShaderFunction"
                               Name 11  "@PixelShaderFunction(vf4;"
                               Name 10  "input"
-                              Name 30  "input"
-                              Name 32  "input"
-                              Name 35  "@entryPointOutput"
-                              Name 36  "param"
-                              Decorate 32(input) Location 0
-                              Decorate 35(@entryPointOutput) Location 0
+                              Name 25  "input"
+                              Name 27  "input"
+                              Name 30  "@entryPointOutput"
+                              Name 31  "param"
+                              Decorate 27(input) Location 0
+                              Decorate 30(@entryPointOutput) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
                7:             TypeVector 6(float) 4
                8:             TypePointer Function 7(fvec4)
                9:             TypeFunction 7(fvec4) 8(ptr)
-              20:             TypeInt 32 1
-              21:             TypeVector 20(int) 4
-              25:    6(float) Constant 1067014160
-              26:    7(fvec4) ConstantComposite 25 25 25 25
-              31:             TypePointer Input 7(fvec4)
-       32(input):     31(ptr) Variable Input
-              34:             TypePointer Output 7(fvec4)
-35(@entryPointOutput):     34(ptr) Variable Output
+              15:             TypeInt 32 1
+              16:             TypeVector 15(int) 4
+              20:    6(float) Constant 1067014160
+              21:    7(fvec4) ConstantComposite 20 20 20 20
+              26:             TypePointer Input 7(fvec4)
+       27(input):     26(ptr) Variable Input
+              29:             TypePointer Output 7(fvec4)
+30(@entryPointOutput):     29(ptr) Variable Output
 4(PixelShaderFunction):           2 Function None 3
                5:             Label
-       30(input):      8(ptr) Variable Function
-       36(param):      8(ptr) Variable Function
-              33:    7(fvec4) Load 32(input)
-                              Store 30(input) 33
-              37:    7(fvec4) Load 30(input)
-                              Store 36(param) 37
-              38:    7(fvec4) FunctionCall 11(@PixelShaderFunction(vf4;) 36(param)
-                              Store 35(@entryPointOutput) 38
+       25(input):      8(ptr) Variable Function
+       31(param):      8(ptr) Variable Function
+              28:    7(fvec4) Load 27(input)
+                              Store 25(input) 28
+              32:    7(fvec4) Load 25(input)
+                              Store 31(param) 32
+              33:    7(fvec4) FunctionCall 11(@PixelShaderFunction(vf4;) 31(param)
+                              Store 30(@entryPointOutput) 33
                               Return
                               FunctionEnd
 11(@PixelShaderFunction(vf4;):    7(fvec4) Function None 9
        10(input):      8(ptr) FunctionParameter
               12:             Label
               13:    7(fvec4) Load 10(input)
-              14:    6(float) CompositeExtract 13 0
-              15:    6(float) CompositeExtract 13 1
-              16:    6(float) CompositeExtract 13 2
-              17:    6(float) CompositeExtract 13 3
-              18:    7(fvec4) CompositeConstruct 14 15 16 17
-              19:    7(fvec4) Load 10(input)
-              22:   21(ivec4) ConvertFToS 19
-              23:    7(fvec4) ConvertSToF 22
-              24:    7(fvec4) FAdd 18 23
-              27:    7(fvec4) FAdd 24 26
-                              ReturnValue 27
+              14:    7(fvec4) Load 10(input)
+              17:   16(ivec4) ConvertFToS 14
+              18:    7(fvec4) ConvertSToF 17
+              19:    7(fvec4) FAdd 13 18
+              22:    7(fvec4) FAdd 19 21
+                              ReturnValue 22
                               FunctionEnd
diff --git a/Test/baseResults/hlsl.cbuffer-identifier.vert.out b/Test/baseResults/hlsl.cbuffer-identifier.vert.out
new file mode 100644
index 0000000..f7225f8
--- /dev/null
+++ b/Test/baseResults/hlsl.cbuffer-identifier.vert.out
@@ -0,0 +1,404 @@
+hlsl.cbuffer-identifier.vert
+WARNING: 0:29: '' : mul() matrix size mismatch 
+
+Shader version: 500
+0:? Sequence
+0:22  Function Definition: @main(struct-VS_INPUT-vf4-vf31; ( temp structure{ temp 4-component vector of float Pos,  temp 3-component vector of float Norm})
+0:22    Function Parameters: 
+0:22      'input' ( in structure{ temp 4-component vector of float Pos,  temp 3-component vector of float Norm})
+0:?     Sequence
+0:23      Sequence
+0:23        move second child to first child ( temp int)
+0:23          'ConstantBuffer' ( temp int)
+0:23          Constant:
+0:23            42 (const int)
+0:25      Sequence
+0:25        move second child to first child ( temp structure{ temp 4-component vector of float Pos,  temp 3-component vector of float Norm})
+0:25          'output' ( temp structure{ temp 4-component vector of float Pos,  temp 3-component vector of float Norm})
+0:25          Constant:
+0:25            0.000000
+0:25            0.000000
+0:25            0.000000
+0:25            0.000000
+0:25            0.000000
+0:25            0.000000
+0:25            0.000000
+0:26      move second child to first child ( temp 4-component vector of float)
+0:26        Pos: direct index for structure ( temp 4-component vector of float)
+0:26          'output' ( temp structure{ temp 4-component vector of float Pos,  temp 3-component vector of float Norm})
+0:26          Constant:
+0:26            0 (const int)
+0:26        matrix-times-vector ( temp 4-component vector of float)
+0:26          World: direct index for structure (layout( row_major std140) uniform 4X4 matrix of float)
+0:26            'anon@0' (layout( binding=0 row_major std140) uniform block{layout( row_major std140) uniform 4X4 matrix of float World, layout( row_major std140) uniform 4X4 matrix of float View, layout( row_major std140) uniform 4X4 matrix of float Projection})
+0:26            Constant:
+0:26              0 (const uint)
+0:26          Pos: direct index for structure ( temp 4-component vector of float)
+0:26            'input' ( in structure{ temp 4-component vector of float Pos,  temp 3-component vector of float Norm})
+0:26            Constant:
+0:26              0 (const int)
+0:27      move second child to first child ( temp 4-component vector of float)
+0:27        Pos: direct index for structure ( temp 4-component vector of float)
+0:27          'output' ( temp structure{ temp 4-component vector of float Pos,  temp 3-component vector of float Norm})
+0:27          Constant:
+0:27            0 (const int)
+0:27        matrix-times-vector ( temp 4-component vector of float)
+0:27          View: direct index for structure (layout( row_major std140) uniform 4X4 matrix of float)
+0:27            'anon@0' (layout( binding=0 row_major std140) uniform block{layout( row_major std140) uniform 4X4 matrix of float World, layout( row_major std140) uniform 4X4 matrix of float View, layout( row_major std140) uniform 4X4 matrix of float Projection})
+0:27            Constant:
+0:27              1 (const uint)
+0:27          Pos: direct index for structure ( temp 4-component vector of float)
+0:27            'output' ( temp structure{ temp 4-component vector of float Pos,  temp 3-component vector of float Norm})
+0:27            Constant:
+0:27              0 (const int)
+0:28      move second child to first child ( temp 4-component vector of float)
+0:28        Pos: direct index for structure ( temp 4-component vector of float)
+0:28          'output' ( temp structure{ temp 4-component vector of float Pos,  temp 3-component vector of float Norm})
+0:28          Constant:
+0:28            0 (const int)
+0:28        matrix-times-vector ( temp 4-component vector of float)
+0:28          Projection: direct index for structure (layout( row_major std140) uniform 4X4 matrix of float)
+0:28            'anon@0' (layout( binding=0 row_major std140) uniform block{layout( row_major std140) uniform 4X4 matrix of float World, layout( row_major std140) uniform 4X4 matrix of float View, layout( row_major std140) uniform 4X4 matrix of float Projection})
+0:28            Constant:
+0:28              2 (const uint)
+0:28          Pos: direct index for structure ( temp 4-component vector of float)
+0:28            'output' ( temp structure{ temp 4-component vector of float Pos,  temp 3-component vector of float Norm})
+0:28            Constant:
+0:28              0 (const int)
+0:29      move second child to first child ( temp 3-component vector of float)
+0:29        Norm: direct index for structure ( temp 3-component vector of float)
+0:29          'output' ( temp structure{ temp 4-component vector of float Pos,  temp 3-component vector of float Norm})
+0:29          Constant:
+0:29            1 (const int)
+0:29        Construct vec3 ( temp 3-component vector of float)
+0:29          matrix-times-vector ( temp 4-component vector of float)
+0:29            Construct mat3x4 ( uniform 3X4 matrix of float)
+0:29              World: direct index for structure (layout( row_major std140) uniform 4X4 matrix of float)
+0:29                'anon@0' (layout( binding=0 row_major std140) uniform block{layout( row_major std140) uniform 4X4 matrix of float World, layout( row_major std140) uniform 4X4 matrix of float View, layout( row_major std140) uniform 4X4 matrix of float Projection})
+0:29                Constant:
+0:29                  0 (const uint)
+0:29            Norm: direct index for structure ( temp 3-component vector of float)
+0:29              'input' ( in structure{ temp 4-component vector of float Pos,  temp 3-component vector of float Norm})
+0:29              Constant:
+0:29                1 (const int)
+0:31      Branch: Return with expression
+0:31        'output' ( temp structure{ temp 4-component vector of float Pos,  temp 3-component vector of float Norm})
+0:22  Function Definition: main( ( temp void)
+0:22    Function Parameters: 
+0:?     Sequence
+0:22      Sequence
+0:22        move second child to first child ( temp 4-component vector of float)
+0:22          Pos: direct index for structure ( temp 4-component vector of float)
+0:?             'input' ( temp structure{ temp 4-component vector of float Pos,  temp 3-component vector of float Norm})
+0:22            Constant:
+0:22              0 (const int)
+0:?           'input.Pos' (layout( location=0) in 4-component vector of float)
+0:22        move second child to first child ( temp 3-component vector of float)
+0:22          Norm: direct index for structure ( temp 3-component vector of float)
+0:?             'input' ( temp structure{ temp 4-component vector of float Pos,  temp 3-component vector of float Norm})
+0:22            Constant:
+0:22              1 (const int)
+0:?           'input.Norm' (layout( location=1) in 3-component vector of float)
+0:22      Sequence
+0:22        move second child to first child ( temp structure{ temp 4-component vector of float Pos,  temp 3-component vector of float Norm})
+0:22          'flattenTemp' ( temp structure{ temp 4-component vector of float Pos,  temp 3-component vector of float Norm})
+0:22          Function Call: @main(struct-VS_INPUT-vf4-vf31; ( temp structure{ temp 4-component vector of float Pos,  temp 3-component vector of float Norm})
+0:?             'input' ( temp structure{ temp 4-component vector of float Pos,  temp 3-component vector of float Norm})
+0:22        move second child to first child ( temp 4-component vector of float)
+0:?           '@entryPointOutput.Pos' ( out 4-component vector of float Position)
+0:22          Pos: direct index for structure ( temp 4-component vector of float)
+0:22            'flattenTemp' ( temp structure{ temp 4-component vector of float Pos,  temp 3-component vector of float Norm})
+0:22            Constant:
+0:22              0 (const int)
+0:22        move second child to first child ( temp 3-component vector of float)
+0:?           '@entryPointOutput.Norm' (layout( location=0) out 3-component vector of float)
+0:22          Norm: direct index for structure ( temp 3-component vector of float)
+0:22            'flattenTemp' ( temp structure{ temp 4-component vector of float Pos,  temp 3-component vector of float Norm})
+0:22            Constant:
+0:22              1 (const int)
+0:?   Linker Objects
+0:?     'anon@0' (layout( binding=0 row_major std140) uniform block{layout( row_major std140) uniform 4X4 matrix of float World, layout( row_major std140) uniform 4X4 matrix of float View, layout( row_major std140) uniform 4X4 matrix of float Projection})
+0:?     '@entryPointOutput.Pos' ( out 4-component vector of float Position)
+0:?     '@entryPointOutput.Norm' (layout( location=0) out 3-component vector of float)
+0:?     'input.Pos' (layout( location=0) in 4-component vector of float)
+0:?     'input.Norm' (layout( location=1) in 3-component vector of float)
+
+
+Linked vertex stage:
+
+
+Shader version: 500
+0:? Sequence
+0:22  Function Definition: @main(struct-VS_INPUT-vf4-vf31; ( temp structure{ temp 4-component vector of float Pos,  temp 3-component vector of float Norm})
+0:22    Function Parameters: 
+0:22      'input' ( in structure{ temp 4-component vector of float Pos,  temp 3-component vector of float Norm})
+0:?     Sequence
+0:23      Sequence
+0:23        move second child to first child ( temp int)
+0:23          'ConstantBuffer' ( temp int)
+0:23          Constant:
+0:23            42 (const int)
+0:25      Sequence
+0:25        move second child to first child ( temp structure{ temp 4-component vector of float Pos,  temp 3-component vector of float Norm})
+0:25          'output' ( temp structure{ temp 4-component vector of float Pos,  temp 3-component vector of float Norm})
+0:25          Constant:
+0:25            0.000000
+0:25            0.000000
+0:25            0.000000
+0:25            0.000000
+0:25            0.000000
+0:25            0.000000
+0:25            0.000000
+0:26      move second child to first child ( temp 4-component vector of float)
+0:26        Pos: direct index for structure ( temp 4-component vector of float)
+0:26          'output' ( temp structure{ temp 4-component vector of float Pos,  temp 3-component vector of float Norm})
+0:26          Constant:
+0:26            0 (const int)
+0:26        matrix-times-vector ( temp 4-component vector of float)
+0:26          World: direct index for structure (layout( row_major std140) uniform 4X4 matrix of float)
+0:26            'anon@0' (layout( binding=0 row_major std140) uniform block{layout( row_major std140) uniform 4X4 matrix of float World, layout( row_major std140) uniform 4X4 matrix of float View, layout( row_major std140) uniform 4X4 matrix of float Projection})
+0:26            Constant:
+0:26              0 (const uint)
+0:26          Pos: direct index for structure ( temp 4-component vector of float)
+0:26            'input' ( in structure{ temp 4-component vector of float Pos,  temp 3-component vector of float Norm})
+0:26            Constant:
+0:26              0 (const int)
+0:27      move second child to first child ( temp 4-component vector of float)
+0:27        Pos: direct index for structure ( temp 4-component vector of float)
+0:27          'output' ( temp structure{ temp 4-component vector of float Pos,  temp 3-component vector of float Norm})
+0:27          Constant:
+0:27            0 (const int)
+0:27        matrix-times-vector ( temp 4-component vector of float)
+0:27          View: direct index for structure (layout( row_major std140) uniform 4X4 matrix of float)
+0:27            'anon@0' (layout( binding=0 row_major std140) uniform block{layout( row_major std140) uniform 4X4 matrix of float World, layout( row_major std140) uniform 4X4 matrix of float View, layout( row_major std140) uniform 4X4 matrix of float Projection})
+0:27            Constant:
+0:27              1 (const uint)
+0:27          Pos: direct index for structure ( temp 4-component vector of float)
+0:27            'output' ( temp structure{ temp 4-component vector of float Pos,  temp 3-component vector of float Norm})
+0:27            Constant:
+0:27              0 (const int)
+0:28      move second child to first child ( temp 4-component vector of float)
+0:28        Pos: direct index for structure ( temp 4-component vector of float)
+0:28          'output' ( temp structure{ temp 4-component vector of float Pos,  temp 3-component vector of float Norm})
+0:28          Constant:
+0:28            0 (const int)
+0:28        matrix-times-vector ( temp 4-component vector of float)
+0:28          Projection: direct index for structure (layout( row_major std140) uniform 4X4 matrix of float)
+0:28            'anon@0' (layout( binding=0 row_major std140) uniform block{layout( row_major std140) uniform 4X4 matrix of float World, layout( row_major std140) uniform 4X4 matrix of float View, layout( row_major std140) uniform 4X4 matrix of float Projection})
+0:28            Constant:
+0:28              2 (const uint)
+0:28          Pos: direct index for structure ( temp 4-component vector of float)
+0:28            'output' ( temp structure{ temp 4-component vector of float Pos,  temp 3-component vector of float Norm})
+0:28            Constant:
+0:28              0 (const int)
+0:29      move second child to first child ( temp 3-component vector of float)
+0:29        Norm: direct index for structure ( temp 3-component vector of float)
+0:29          'output' ( temp structure{ temp 4-component vector of float Pos,  temp 3-component vector of float Norm})
+0:29          Constant:
+0:29            1 (const int)
+0:29        Construct vec3 ( temp 3-component vector of float)
+0:29          matrix-times-vector ( temp 4-component vector of float)
+0:29            Construct mat3x4 ( uniform 3X4 matrix of float)
+0:29              World: direct index for structure (layout( row_major std140) uniform 4X4 matrix of float)
+0:29                'anon@0' (layout( binding=0 row_major std140) uniform block{layout( row_major std140) uniform 4X4 matrix of float World, layout( row_major std140) uniform 4X4 matrix of float View, layout( row_major std140) uniform 4X4 matrix of float Projection})
+0:29                Constant:
+0:29                  0 (const uint)
+0:29            Norm: direct index for structure ( temp 3-component vector of float)
+0:29              'input' ( in structure{ temp 4-component vector of float Pos,  temp 3-component vector of float Norm})
+0:29              Constant:
+0:29                1 (const int)
+0:31      Branch: Return with expression
+0:31        'output' ( temp structure{ temp 4-component vector of float Pos,  temp 3-component vector of float Norm})
+0:22  Function Definition: main( ( temp void)
+0:22    Function Parameters: 
+0:?     Sequence
+0:22      Sequence
+0:22        move second child to first child ( temp 4-component vector of float)
+0:22          Pos: direct index for structure ( temp 4-component vector of float)
+0:?             'input' ( temp structure{ temp 4-component vector of float Pos,  temp 3-component vector of float Norm})
+0:22            Constant:
+0:22              0 (const int)
+0:?           'input.Pos' (layout( location=0) in 4-component vector of float)
+0:22        move second child to first child ( temp 3-component vector of float)
+0:22          Norm: direct index for structure ( temp 3-component vector of float)
+0:?             'input' ( temp structure{ temp 4-component vector of float Pos,  temp 3-component vector of float Norm})
+0:22            Constant:
+0:22              1 (const int)
+0:?           'input.Norm' (layout( location=1) in 3-component vector of float)
+0:22      Sequence
+0:22        move second child to first child ( temp structure{ temp 4-component vector of float Pos,  temp 3-component vector of float Norm})
+0:22          'flattenTemp' ( temp structure{ temp 4-component vector of float Pos,  temp 3-component vector of float Norm})
+0:22          Function Call: @main(struct-VS_INPUT-vf4-vf31; ( temp structure{ temp 4-component vector of float Pos,  temp 3-component vector of float Norm})
+0:?             'input' ( temp structure{ temp 4-component vector of float Pos,  temp 3-component vector of float Norm})
+0:22        move second child to first child ( temp 4-component vector of float)
+0:?           '@entryPointOutput.Pos' ( out 4-component vector of float Position)
+0:22          Pos: direct index for structure ( temp 4-component vector of float)
+0:22            'flattenTemp' ( temp structure{ temp 4-component vector of float Pos,  temp 3-component vector of float Norm})
+0:22            Constant:
+0:22              0 (const int)
+0:22        move second child to first child ( temp 3-component vector of float)
+0:?           '@entryPointOutput.Norm' (layout( location=0) out 3-component vector of float)
+0:22          Norm: direct index for structure ( temp 3-component vector of float)
+0:22            'flattenTemp' ( temp structure{ temp 4-component vector of float Pos,  temp 3-component vector of float Norm})
+0:22            Constant:
+0:22              1 (const int)
+0:?   Linker Objects
+0:?     'anon@0' (layout( binding=0 row_major std140) uniform block{layout( row_major std140) uniform 4X4 matrix of float World, layout( row_major std140) uniform 4X4 matrix of float View, layout( row_major std140) uniform 4X4 matrix of float Projection})
+0:?     '@entryPointOutput.Pos' ( out 4-component vector of float Position)
+0:?     '@entryPointOutput.Norm' (layout( location=0) out 3-component vector of float)
+0:?     'input.Pos' (layout( location=0) in 4-component vector of float)
+0:?     'input.Norm' (layout( location=1) in 3-component vector of float)
+
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 93
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Vertex 4  "main" 74 78 86 90
+                              Source HLSL 500
+                              Name 4  "main"
+                              Name 9  "VS_INPUT"
+                              MemberName 9(VS_INPUT) 0  "Pos"
+                              MemberName 9(VS_INPUT) 1  "Norm"
+                              Name 11  "PS_INPUT"
+                              MemberName 11(PS_INPUT) 0  "Pos"
+                              MemberName 11(PS_INPUT) 1  "Norm"
+                              Name 14  "@main(struct-VS_INPUT-vf4-vf31;"
+                              Name 13  "input"
+                              Name 18  "ConstantBuffer"
+                              Name 21  "output"
+                              Name 28  "C"
+                              MemberName 28(C) 0  "World"
+                              MemberName 28(C) 1  "View"
+                              MemberName 28(C) 2  "Projection"
+                              Name 30  ""
+                              Name 72  "input"
+                              Name 74  "input.Pos"
+                              Name 78  "input.Norm"
+                              Name 81  "flattenTemp"
+                              Name 82  "param"
+                              Name 86  "@entryPointOutput.Pos"
+                              Name 90  "@entryPointOutput.Norm"
+                              MemberDecorate 28(C) 0 RowMajor
+                              MemberDecorate 28(C) 0 Offset 0
+                              MemberDecorate 28(C) 0 MatrixStride 16
+                              MemberDecorate 28(C) 1 RowMajor
+                              MemberDecorate 28(C) 1 Offset 64
+                              MemberDecorate 28(C) 1 MatrixStride 16
+                              MemberDecorate 28(C) 2 RowMajor
+                              MemberDecorate 28(C) 2 Offset 128
+                              MemberDecorate 28(C) 2 MatrixStride 16
+                              Decorate 28(C) Block
+                              Decorate 30 DescriptorSet 0
+                              Decorate 30 Binding 0
+                              Decorate 74(input.Pos) Location 0
+                              Decorate 78(input.Norm) Location 1
+                              Decorate 86(@entryPointOutput.Pos) BuiltIn Position
+                              Decorate 90(@entryPointOutput.Norm) Location 0
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+               8:             TypeVector 6(float) 3
+     9(VS_INPUT):             TypeStruct 7(fvec4) 8(fvec3)
+              10:             TypePointer Function 9(VS_INPUT)
+    11(PS_INPUT):             TypeStruct 7(fvec4) 8(fvec3)
+              12:             TypeFunction 11(PS_INPUT) 10(ptr)
+              16:             TypeInt 32 1
+              17:             TypePointer Function 16(int)
+              19:     16(int) Constant 42
+              20:             TypePointer Function 11(PS_INPUT)
+              22:    6(float) Constant 0
+              23:    7(fvec4) ConstantComposite 22 22 22 22
+              24:    8(fvec3) ConstantComposite 22 22 22
+              25:11(PS_INPUT) ConstantComposite 23 24
+              26:     16(int) Constant 0
+              27:             TypeMatrix 7(fvec4) 4
+           28(C):             TypeStruct 27 27 27
+              29:             TypePointer Uniform 28(C)
+              30:     29(ptr) Variable Uniform
+              31:             TypePointer Uniform 27
+              34:             TypePointer Function 7(fvec4)
+              39:     16(int) Constant 1
+              46:     16(int) Constant 2
+              55:             TypeMatrix 7(fvec4) 3
+              60:             TypePointer Function 8(fvec3)
+              73:             TypePointer Input 7(fvec4)
+   74(input.Pos):     73(ptr) Variable Input
+              77:             TypePointer Input 8(fvec3)
+  78(input.Norm):     77(ptr) Variable Input
+              85:             TypePointer Output 7(fvec4)
+86(@entryPointOutput.Pos):     85(ptr) Variable Output
+              89:             TypePointer Output 8(fvec3)
+90(@entryPointOutput.Norm):     89(ptr) Variable Output
+         4(main):           2 Function None 3
+               5:             Label
+       72(input):     10(ptr) Variable Function
+ 81(flattenTemp):     20(ptr) Variable Function
+       82(param):     10(ptr) Variable Function
+              75:    7(fvec4) Load 74(input.Pos)
+              76:     34(ptr) AccessChain 72(input) 26
+                              Store 76 75
+              79:    8(fvec3) Load 78(input.Norm)
+              80:     60(ptr) AccessChain 72(input) 39
+                              Store 80 79
+              83: 9(VS_INPUT) Load 72(input)
+                              Store 82(param) 83
+              84:11(PS_INPUT) FunctionCall 14(@main(struct-VS_INPUT-vf4-vf31;) 82(param)
+                              Store 81(flattenTemp) 84
+              87:     34(ptr) AccessChain 81(flattenTemp) 26
+              88:    7(fvec4) Load 87
+                              Store 86(@entryPointOutput.Pos) 88
+              91:     60(ptr) AccessChain 81(flattenTemp) 39
+              92:    8(fvec3) Load 91
+                              Store 90(@entryPointOutput.Norm) 92
+                              Return
+                              FunctionEnd
+14(@main(struct-VS_INPUT-vf4-vf31;):11(PS_INPUT) Function None 12
+       13(input):     10(ptr) FunctionParameter
+              15:             Label
+18(ConstantBuffer):     17(ptr) Variable Function
+      21(output):     20(ptr) Variable Function
+                              Store 18(ConstantBuffer) 19
+                              Store 21(output) 25
+              32:     31(ptr) AccessChain 30 26
+              33:          27 Load 32
+              35:     34(ptr) AccessChain 13(input) 26
+              36:    7(fvec4) Load 35
+              37:    7(fvec4) MatrixTimesVector 33 36
+              38:     34(ptr) AccessChain 21(output) 26
+                              Store 38 37
+              40:     31(ptr) AccessChain 30 39
+              41:          27 Load 40
+              42:     34(ptr) AccessChain 21(output) 26
+              43:    7(fvec4) Load 42
+              44:    7(fvec4) MatrixTimesVector 41 43
+              45:     34(ptr) AccessChain 21(output) 26
+                              Store 45 44
+              47:     31(ptr) AccessChain 30 46
+              48:          27 Load 47
+              49:     34(ptr) AccessChain 21(output) 26
+              50:    7(fvec4) Load 49
+              51:    7(fvec4) MatrixTimesVector 48 50
+              52:     34(ptr) AccessChain 21(output) 26
+                              Store 52 51
+              53:     31(ptr) AccessChain 30 26
+              54:          27 Load 53
+              56:    7(fvec4) CompositeExtract 54 0
+              57:    7(fvec4) CompositeExtract 54 1
+              58:    7(fvec4) CompositeExtract 54 2
+              59:          55 CompositeConstruct 56 57 58
+              61:     60(ptr) AccessChain 13(input) 39
+              62:    8(fvec3) Load 61
+              63:    7(fvec4) MatrixTimesVector 59 62
+              64:    6(float) CompositeExtract 63 0
+              65:    6(float) CompositeExtract 63 1
+              66:    6(float) CompositeExtract 63 2
+              67:    8(fvec3) CompositeConstruct 64 65 66
+              68:     60(ptr) AccessChain 21(output) 39
+                              Store 68 67
+              69:11(PS_INPUT) Load 21(output)
+                              ReturnValue 69
+                              FunctionEnd
diff --git a/Test/baseResults/hlsl.charLit.vert.out b/Test/baseResults/hlsl.charLit.vert.out
old mode 100755
new mode 100644
index cc8388a..b09fc81
--- a/Test/baseResults/hlsl.charLit.vert.out
+++ b/Test/baseResults/hlsl.charLit.vert.out
@@ -146,7 +146,7 @@
 0:?     '@entryPointOutput' ( out 4-component vector of float Position)
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 58
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.clip.frag.out b/Test/baseResults/hlsl.clip.frag.out
index 9b2de87..dbf99bf 100644
--- a/Test/baseResults/hlsl.clip.frag.out
+++ b/Test/baseResults/hlsl.clip.frag.out
@@ -74,7 +74,7 @@
 0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 30
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.clipdistance-1.frag.out b/Test/baseResults/hlsl.clipdistance-1.frag.out
new file mode 100644
index 0000000..f223ddc
--- /dev/null
+++ b/Test/baseResults/hlsl.clipdistance-1.frag.out
@@ -0,0 +1,190 @@
+hlsl.clipdistance-1.frag
+Shader version: 500
+gl_FragCoord origin is upper left
+0:? Sequence
+0:4  Function Definition: @main(vf4;f1;f1; ( temp 4-component vector of float)
+0:4    Function Parameters: 
+0:4      'pos' ( in 4-component vector of float)
+0:4      'clip' ( in float)
+0:4      'cull' ( in float)
+0:?     Sequence
+0:5      Branch: Return with expression
+0:5        add ( temp 4-component vector of float)
+0:5          add ( temp 4-component vector of float)
+0:5            'pos' ( in 4-component vector of float)
+0:5            'clip' ( in float)
+0:5          'cull' ( in float)
+0:4  Function Definition: main( ( temp void)
+0:4    Function Parameters: 
+0:?     Sequence
+0:4      move second child to first child ( temp 4-component vector of float)
+0:?         'pos' ( temp 4-component vector of float)
+0:?         'pos' ( in 4-component vector of float FragCoord)
+0:?       Sequence
+0:4        move second child to first child ( temp float)
+0:?           'clip' ( temp float)
+0:4          direct index ( in float ClipDistance)
+0:?             'clip' ( in 1-element array of float ClipDistance)
+0:4            Constant:
+0:4              0 (const int)
+0:?       Sequence
+0:4        move second child to first child ( temp float)
+0:?           'cull' ( temp float)
+0:4          direct index ( in float CullDistance)
+0:?             'cull' ( in 1-element array of float CullDistance)
+0:4            Constant:
+0:4              0 (const int)
+0:4      move second child to first child ( temp 4-component vector of float)
+0:?         '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+0:4        Function Call: @main(vf4;f1;f1; ( temp 4-component vector of float)
+0:?           'pos' ( temp 4-component vector of float)
+0:?           'clip' ( temp float)
+0:?           'cull' ( temp float)
+0:?   Linker Objects
+0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+0:?     'pos' ( in 4-component vector of float FragCoord)
+0:?     'clip' ( in 1-element array of float ClipDistance)
+0:?     'cull' ( in 1-element array of float CullDistance)
+
+
+Linked fragment stage:
+
+
+Shader version: 500
+gl_FragCoord origin is upper left
+0:? Sequence
+0:4  Function Definition: @main(vf4;f1;f1; ( temp 4-component vector of float)
+0:4    Function Parameters: 
+0:4      'pos' ( in 4-component vector of float)
+0:4      'clip' ( in float)
+0:4      'cull' ( in float)
+0:?     Sequence
+0:5      Branch: Return with expression
+0:5        add ( temp 4-component vector of float)
+0:5          add ( temp 4-component vector of float)
+0:5            'pos' ( in 4-component vector of float)
+0:5            'clip' ( in float)
+0:5          'cull' ( in float)
+0:4  Function Definition: main( ( temp void)
+0:4    Function Parameters: 
+0:?     Sequence
+0:4      move second child to first child ( temp 4-component vector of float)
+0:?         'pos' ( temp 4-component vector of float)
+0:?         'pos' ( in 4-component vector of float FragCoord)
+0:?       Sequence
+0:4        move second child to first child ( temp float)
+0:?           'clip' ( temp float)
+0:4          direct index ( in float ClipDistance)
+0:?             'clip' ( in 1-element array of float ClipDistance)
+0:4            Constant:
+0:4              0 (const int)
+0:?       Sequence
+0:4        move second child to first child ( temp float)
+0:?           'cull' ( temp float)
+0:4          direct index ( in float CullDistance)
+0:?             'cull' ( in 1-element array of float CullDistance)
+0:4            Constant:
+0:4              0 (const int)
+0:4      move second child to first child ( temp 4-component vector of float)
+0:?         '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+0:4        Function Call: @main(vf4;f1;f1; ( temp 4-component vector of float)
+0:?           'pos' ( temp 4-component vector of float)
+0:?           'clip' ( temp float)
+0:?           'cull' ( temp float)
+0:?   Linker Objects
+0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+0:?     'pos' ( in 4-component vector of float FragCoord)
+0:?     'clip' ( in 1-element array of float ClipDistance)
+0:?     'cull' ( in 1-element array of float CullDistance)
+
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 53
+
+                              Capability Shader
+                              Capability ClipDistance
+                              Capability CullDistance
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 27 34 41 45
+                              ExecutionMode 4 OriginUpperLeft
+                              Source HLSL 500
+                              Name 4  "main"
+                              Name 14  "@main(vf4;f1;f1;"
+                              Name 11  "pos"
+                              Name 12  "clip"
+                              Name 13  "cull"
+                              Name 25  "pos"
+                              Name 27  "pos"
+                              Name 29  "clip"
+                              Name 34  "clip"
+                              Name 40  "cull"
+                              Name 41  "cull"
+                              Name 45  "@entryPointOutput"
+                              Name 46  "param"
+                              Name 48  "param"
+                              Name 50  "param"
+                              Decorate 27(pos) BuiltIn FragCoord
+                              Decorate 34(clip) BuiltIn ClipDistance
+                              Decorate 41(cull) BuiltIn CullDistance
+                              Decorate 45(@entryPointOutput) Location 0
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+               8:             TypePointer Function 7(fvec4)
+               9:             TypePointer Function 6(float)
+              10:             TypeFunction 7(fvec4) 8(ptr) 9(ptr) 9(ptr)
+              26:             TypePointer Input 7(fvec4)
+         27(pos):     26(ptr) Variable Input
+              30:             TypeInt 32 0
+              31:     30(int) Constant 1
+              32:             TypeArray 6(float) 31
+              33:             TypePointer Input 32
+        34(clip):     33(ptr) Variable Input
+              35:             TypeInt 32 1
+              36:     35(int) Constant 0
+              37:             TypePointer Input 6(float)
+        41(cull):     33(ptr) Variable Input
+              44:             TypePointer Output 7(fvec4)
+45(@entryPointOutput):     44(ptr) Variable Output
+         4(main):           2 Function None 3
+               5:             Label
+         25(pos):      8(ptr) Variable Function
+        29(clip):      9(ptr) Variable Function
+        40(cull):      9(ptr) Variable Function
+       46(param):      8(ptr) Variable Function
+       48(param):      9(ptr) Variable Function
+       50(param):      9(ptr) Variable Function
+              28:    7(fvec4) Load 27(pos)
+                              Store 25(pos) 28
+              38:     37(ptr) AccessChain 34(clip) 36
+              39:    6(float) Load 38
+                              Store 29(clip) 39
+              42:     37(ptr) AccessChain 41(cull) 36
+              43:    6(float) Load 42
+                              Store 40(cull) 43
+              47:    7(fvec4) Load 25(pos)
+                              Store 46(param) 47
+              49:    6(float) Load 29(clip)
+                              Store 48(param) 49
+              51:    6(float) Load 40(cull)
+                              Store 50(param) 51
+              52:    7(fvec4) FunctionCall 14(@main(vf4;f1;f1;) 46(param) 48(param) 50(param)
+                              Store 45(@entryPointOutput) 52
+                              Return
+                              FunctionEnd
+14(@main(vf4;f1;f1;):    7(fvec4) Function None 10
+         11(pos):      8(ptr) FunctionParameter
+        12(clip):      9(ptr) FunctionParameter
+        13(cull):      9(ptr) FunctionParameter
+              15:             Label
+              16:    7(fvec4) Load 11(pos)
+              17:    6(float) Load 12(clip)
+              18:    7(fvec4) CompositeConstruct 17 17 17 17
+              19:    7(fvec4) FAdd 16 18
+              20:    6(float) Load 13(cull)
+              21:    7(fvec4) CompositeConstruct 20 20 20 20
+              22:    7(fvec4) FAdd 19 21
+                              ReturnValue 22
+                              FunctionEnd
diff --git a/Test/baseResults/hlsl.clipdistance-1.geom.out b/Test/baseResults/hlsl.clipdistance-1.geom.out
new file mode 100644
index 0000000..144b877
--- /dev/null
+++ b/Test/baseResults/hlsl.clipdistance-1.geom.out
@@ -0,0 +1,737 @@
+hlsl.clipdistance-1.geom
+Shader version: 500
+invocations = -1
+max_vertices = 3
+input primitive = triangles
+output primitive = line_strip
+0:? Sequence
+0:11  Function Definition: @main(vf4[3];u1[3];struct-S-vf4-vf21;vf4[3]; ( temp void)
+0:11    Function Parameters: 
+0:11      'pos' ( in 3-element array of 4-component vector of float)
+0:11      'VertexID' ( in 3-element array of uint)
+0:11      'OutputStream' ( out structure{ temp 4-component vector of float pos,  temp 2-component vector of float clip})
+0:11      'clip' ( in 3-element array of 4-component vector of float)
+0:?     Sequence
+0:14      move second child to first child ( temp 4-component vector of float)
+0:14        pos: direct index for structure ( temp 4-component vector of float)
+0:14          's' ( temp structure{ temp 4-component vector of float pos,  temp 2-component vector of float clip})
+0:14          Constant:
+0:14            0 (const int)
+0:14        direct index ( temp 4-component vector of float)
+0:14          'pos' ( in 3-element array of 4-component vector of float)
+0:14          Constant:
+0:14            0 (const int)
+0:15      move second child to first child ( temp 2-component vector of float)
+0:15        clip: direct index for structure ( temp 2-component vector of float)
+0:15          's' ( temp structure{ temp 4-component vector of float pos,  temp 2-component vector of float clip})
+0:15          Constant:
+0:15            1 (const int)
+0:15        vector swizzle ( temp 2-component vector of float)
+0:15          direct index ( temp 4-component vector of float)
+0:15            'clip' ( in 3-element array of 4-component vector of float)
+0:15            Constant:
+0:15              0 (const int)
+0:15          Sequence
+0:15            Constant:
+0:15              0 (const int)
+0:15            Constant:
+0:15              1 (const int)
+0:17      Sequence
+0:17        Sequence
+0:17          move second child to first child ( temp 4-component vector of float)
+0:?             'OutputStream.pos' ( out 4-component vector of float Position)
+0:17            pos: direct index for structure ( temp 4-component vector of float)
+0:17              's' ( temp structure{ temp 4-component vector of float pos,  temp 2-component vector of float clip})
+0:17              Constant:
+0:17                0 (const int)
+0:?           Sequence
+0:17            move second child to first child ( temp float)
+0:17              direct index ( out float ClipDistance)
+0:?                 'OutputStream.clip' ( out 2-element array of float ClipDistance)
+0:17                Constant:
+0:17                  0 (const int)
+0:17              direct index ( temp float)
+0:17                clip: direct index for structure ( temp 2-component vector of float)
+0:17                  's' ( temp structure{ temp 4-component vector of float pos,  temp 2-component vector of float clip})
+0:17                  Constant:
+0:17                    1 (const int)
+0:17                Constant:
+0:17                  0 (const int)
+0:17            move second child to first child ( temp float)
+0:17              direct index ( out float ClipDistance)
+0:?                 'OutputStream.clip' ( out 2-element array of float ClipDistance)
+0:17                Constant:
+0:17                  1 (const int)
+0:17              direct index ( temp float)
+0:17                clip: direct index for structure ( temp 2-component vector of float)
+0:17                  's' ( temp structure{ temp 4-component vector of float pos,  temp 2-component vector of float clip})
+0:17                  Constant:
+0:17                    1 (const int)
+0:17                Constant:
+0:17                  1 (const int)
+0:17        EmitVertex ( temp void)
+0:11  Function Definition: main( ( temp void)
+0:11    Function Parameters: 
+0:?     Sequence
+0:11      move second child to first child ( temp 3-element array of 4-component vector of float)
+0:?         'pos' ( temp 3-element array of 4-component vector of float)
+0:?         'pos' ( in 3-element array of 4-component vector of float Position)
+0:11      move second child to first child ( temp 3-element array of uint)
+0:?         'VertexID' ( temp 3-element array of uint)
+0:?         'VertexID' (layout( location=0) in 3-element array of uint)
+0:?       Sequence
+0:11        move second child to first child ( temp float)
+0:11          direct index ( temp float)
+0:11            direct index ( temp 4-component vector of float)
+0:?               'clip' ( temp 3-element array of 4-component vector of float)
+0:11              Constant:
+0:11                0 (const int)
+0:11            Constant:
+0:11              0 (const int)
+0:11          direct index ( in float ClipDistance)
+0:11            direct index ( in 4-element array of float ClipDistance)
+0:?               'clip' ( in 3-element array of 4-element array of float ClipDistance)
+0:11              Constant:
+0:11                0 (const int)
+0:11            Constant:
+0:11              0 (const int)
+0:11        move second child to first child ( temp float)
+0:11          direct index ( temp float)
+0:11            direct index ( temp 4-component vector of float)
+0:?               'clip' ( temp 3-element array of 4-component vector of float)
+0:11              Constant:
+0:11                0 (const int)
+0:11            Constant:
+0:11              1 (const int)
+0:11          direct index ( in float ClipDistance)
+0:11            direct index ( in 4-element array of float ClipDistance)
+0:?               'clip' ( in 3-element array of 4-element array of float ClipDistance)
+0:11              Constant:
+0:11                0 (const int)
+0:11            Constant:
+0:11              1 (const int)
+0:11        move second child to first child ( temp float)
+0:11          direct index ( temp float)
+0:11            direct index ( temp 4-component vector of float)
+0:?               'clip' ( temp 3-element array of 4-component vector of float)
+0:11              Constant:
+0:11                0 (const int)
+0:11            Constant:
+0:11              2 (const int)
+0:11          direct index ( in float ClipDistance)
+0:11            direct index ( in 4-element array of float ClipDistance)
+0:?               'clip' ( in 3-element array of 4-element array of float ClipDistance)
+0:11              Constant:
+0:11                0 (const int)
+0:11            Constant:
+0:11              2 (const int)
+0:11        move second child to first child ( temp float)
+0:11          direct index ( temp float)
+0:11            direct index ( temp 4-component vector of float)
+0:?               'clip' ( temp 3-element array of 4-component vector of float)
+0:11              Constant:
+0:11                0 (const int)
+0:11            Constant:
+0:11              3 (const int)
+0:11          direct index ( in float ClipDistance)
+0:11            direct index ( in 4-element array of float ClipDistance)
+0:?               'clip' ( in 3-element array of 4-element array of float ClipDistance)
+0:11              Constant:
+0:11                0 (const int)
+0:11            Constant:
+0:11              3 (const int)
+0:11        move second child to first child ( temp float)
+0:11          direct index ( temp float)
+0:11            direct index ( temp 4-component vector of float)
+0:?               'clip' ( temp 3-element array of 4-component vector of float)
+0:11              Constant:
+0:11                1 (const int)
+0:11            Constant:
+0:11              0 (const int)
+0:11          direct index ( in float ClipDistance)
+0:11            direct index ( in 4-element array of float ClipDistance)
+0:?               'clip' ( in 3-element array of 4-element array of float ClipDistance)
+0:11              Constant:
+0:11                1 (const int)
+0:11            Constant:
+0:11              0 (const int)
+0:11        move second child to first child ( temp float)
+0:11          direct index ( temp float)
+0:11            direct index ( temp 4-component vector of float)
+0:?               'clip' ( temp 3-element array of 4-component vector of float)
+0:11              Constant:
+0:11                1 (const int)
+0:11            Constant:
+0:11              1 (const int)
+0:11          direct index ( in float ClipDistance)
+0:11            direct index ( in 4-element array of float ClipDistance)
+0:?               'clip' ( in 3-element array of 4-element array of float ClipDistance)
+0:11              Constant:
+0:11                1 (const int)
+0:11            Constant:
+0:11              1 (const int)
+0:11        move second child to first child ( temp float)
+0:11          direct index ( temp float)
+0:11            direct index ( temp 4-component vector of float)
+0:?               'clip' ( temp 3-element array of 4-component vector of float)
+0:11              Constant:
+0:11                1 (const int)
+0:11            Constant:
+0:11              2 (const int)
+0:11          direct index ( in float ClipDistance)
+0:11            direct index ( in 4-element array of float ClipDistance)
+0:?               'clip' ( in 3-element array of 4-element array of float ClipDistance)
+0:11              Constant:
+0:11                1 (const int)
+0:11            Constant:
+0:11              2 (const int)
+0:11        move second child to first child ( temp float)
+0:11          direct index ( temp float)
+0:11            direct index ( temp 4-component vector of float)
+0:?               'clip' ( temp 3-element array of 4-component vector of float)
+0:11              Constant:
+0:11                1 (const int)
+0:11            Constant:
+0:11              3 (const int)
+0:11          direct index ( in float ClipDistance)
+0:11            direct index ( in 4-element array of float ClipDistance)
+0:?               'clip' ( in 3-element array of 4-element array of float ClipDistance)
+0:11              Constant:
+0:11                1 (const int)
+0:11            Constant:
+0:11              3 (const int)
+0:11        move second child to first child ( temp float)
+0:11          direct index ( temp float)
+0:11            direct index ( temp 4-component vector of float)
+0:?               'clip' ( temp 3-element array of 4-component vector of float)
+0:11              Constant:
+0:11                2 (const int)
+0:11            Constant:
+0:11              0 (const int)
+0:11          direct index ( in float ClipDistance)
+0:11            direct index ( in 4-element array of float ClipDistance)
+0:?               'clip' ( in 3-element array of 4-element array of float ClipDistance)
+0:11              Constant:
+0:11                2 (const int)
+0:11            Constant:
+0:11              0 (const int)
+0:11        move second child to first child ( temp float)
+0:11          direct index ( temp float)
+0:11            direct index ( temp 4-component vector of float)
+0:?               'clip' ( temp 3-element array of 4-component vector of float)
+0:11              Constant:
+0:11                2 (const int)
+0:11            Constant:
+0:11              1 (const int)
+0:11          direct index ( in float ClipDistance)
+0:11            direct index ( in 4-element array of float ClipDistance)
+0:?               'clip' ( in 3-element array of 4-element array of float ClipDistance)
+0:11              Constant:
+0:11                2 (const int)
+0:11            Constant:
+0:11              1 (const int)
+0:11        move second child to first child ( temp float)
+0:11          direct index ( temp float)
+0:11            direct index ( temp 4-component vector of float)
+0:?               'clip' ( temp 3-element array of 4-component vector of float)
+0:11              Constant:
+0:11                2 (const int)
+0:11            Constant:
+0:11              2 (const int)
+0:11          direct index ( in float ClipDistance)
+0:11            direct index ( in 4-element array of float ClipDistance)
+0:?               'clip' ( in 3-element array of 4-element array of float ClipDistance)
+0:11              Constant:
+0:11                2 (const int)
+0:11            Constant:
+0:11              2 (const int)
+0:11        move second child to first child ( temp float)
+0:11          direct index ( temp float)
+0:11            direct index ( temp 4-component vector of float)
+0:?               'clip' ( temp 3-element array of 4-component vector of float)
+0:11              Constant:
+0:11                2 (const int)
+0:11            Constant:
+0:11              3 (const int)
+0:11          direct index ( in float ClipDistance)
+0:11            direct index ( in 4-element array of float ClipDistance)
+0:?               'clip' ( in 3-element array of 4-element array of float ClipDistance)
+0:11              Constant:
+0:11                2 (const int)
+0:11            Constant:
+0:11              3 (const int)
+0:11      Function Call: @main(vf4[3];u1[3];struct-S-vf4-vf21;vf4[3]; ( temp void)
+0:?         'pos' ( temp 3-element array of 4-component vector of float)
+0:?         'VertexID' ( temp 3-element array of uint)
+0:?         'OutputStream' ( temp structure{ temp 4-component vector of float pos,  temp 2-component vector of float clip})
+0:?         'clip' ( temp 3-element array of 4-component vector of float)
+0:?   Linker Objects
+0:?     'pos' ( in 3-element array of 4-component vector of float Position)
+0:?     'VertexID' (layout( location=0) in 3-element array of uint)
+0:?     'OutputStream.pos' ( out 4-component vector of float Position)
+0:?     'clip' ( in 3-element array of 4-element array of float ClipDistance)
+0:?     'OutputStream.clip' ( out 2-element array of float ClipDistance)
+
+
+Linked geometry stage:
+
+
+Shader version: 500
+invocations = 1
+max_vertices = 3
+input primitive = triangles
+output primitive = line_strip
+0:? Sequence
+0:11  Function Definition: @main(vf4[3];u1[3];struct-S-vf4-vf21;vf4[3]; ( temp void)
+0:11    Function Parameters: 
+0:11      'pos' ( in 3-element array of 4-component vector of float)
+0:11      'VertexID' ( in 3-element array of uint)
+0:11      'OutputStream' ( out structure{ temp 4-component vector of float pos,  temp 2-component vector of float clip})
+0:11      'clip' ( in 3-element array of 4-component vector of float)
+0:?     Sequence
+0:14      move second child to first child ( temp 4-component vector of float)
+0:14        pos: direct index for structure ( temp 4-component vector of float)
+0:14          's' ( temp structure{ temp 4-component vector of float pos,  temp 2-component vector of float clip})
+0:14          Constant:
+0:14            0 (const int)
+0:14        direct index ( temp 4-component vector of float)
+0:14          'pos' ( in 3-element array of 4-component vector of float)
+0:14          Constant:
+0:14            0 (const int)
+0:15      move second child to first child ( temp 2-component vector of float)
+0:15        clip: direct index for structure ( temp 2-component vector of float)
+0:15          's' ( temp structure{ temp 4-component vector of float pos,  temp 2-component vector of float clip})
+0:15          Constant:
+0:15            1 (const int)
+0:15        vector swizzle ( temp 2-component vector of float)
+0:15          direct index ( temp 4-component vector of float)
+0:15            'clip' ( in 3-element array of 4-component vector of float)
+0:15            Constant:
+0:15              0 (const int)
+0:15          Sequence
+0:15            Constant:
+0:15              0 (const int)
+0:15            Constant:
+0:15              1 (const int)
+0:17      Sequence
+0:17        Sequence
+0:17          move second child to first child ( temp 4-component vector of float)
+0:?             'OutputStream.pos' ( out 4-component vector of float Position)
+0:17            pos: direct index for structure ( temp 4-component vector of float)
+0:17              's' ( temp structure{ temp 4-component vector of float pos,  temp 2-component vector of float clip})
+0:17              Constant:
+0:17                0 (const int)
+0:?           Sequence
+0:17            move second child to first child ( temp float)
+0:17              direct index ( out float ClipDistance)
+0:?                 'OutputStream.clip' ( out 2-element array of float ClipDistance)
+0:17                Constant:
+0:17                  0 (const int)
+0:17              direct index ( temp float)
+0:17                clip: direct index for structure ( temp 2-component vector of float)
+0:17                  's' ( temp structure{ temp 4-component vector of float pos,  temp 2-component vector of float clip})
+0:17                  Constant:
+0:17                    1 (const int)
+0:17                Constant:
+0:17                  0 (const int)
+0:17            move second child to first child ( temp float)
+0:17              direct index ( out float ClipDistance)
+0:?                 'OutputStream.clip' ( out 2-element array of float ClipDistance)
+0:17                Constant:
+0:17                  1 (const int)
+0:17              direct index ( temp float)
+0:17                clip: direct index for structure ( temp 2-component vector of float)
+0:17                  's' ( temp structure{ temp 4-component vector of float pos,  temp 2-component vector of float clip})
+0:17                  Constant:
+0:17                    1 (const int)
+0:17                Constant:
+0:17                  1 (const int)
+0:17        EmitVertex ( temp void)
+0:11  Function Definition: main( ( temp void)
+0:11    Function Parameters: 
+0:?     Sequence
+0:11      move second child to first child ( temp 3-element array of 4-component vector of float)
+0:?         'pos' ( temp 3-element array of 4-component vector of float)
+0:?         'pos' ( in 3-element array of 4-component vector of float Position)
+0:11      move second child to first child ( temp 3-element array of uint)
+0:?         'VertexID' ( temp 3-element array of uint)
+0:?         'VertexID' (layout( location=0) in 3-element array of uint)
+0:?       Sequence
+0:11        move second child to first child ( temp float)
+0:11          direct index ( temp float)
+0:11            direct index ( temp 4-component vector of float)
+0:?               'clip' ( temp 3-element array of 4-component vector of float)
+0:11              Constant:
+0:11                0 (const int)
+0:11            Constant:
+0:11              0 (const int)
+0:11          direct index ( in float ClipDistance)
+0:11            direct index ( in 4-element array of float ClipDistance)
+0:?               'clip' ( in 3-element array of 4-element array of float ClipDistance)
+0:11              Constant:
+0:11                0 (const int)
+0:11            Constant:
+0:11              0 (const int)
+0:11        move second child to first child ( temp float)
+0:11          direct index ( temp float)
+0:11            direct index ( temp 4-component vector of float)
+0:?               'clip' ( temp 3-element array of 4-component vector of float)
+0:11              Constant:
+0:11                0 (const int)
+0:11            Constant:
+0:11              1 (const int)
+0:11          direct index ( in float ClipDistance)
+0:11            direct index ( in 4-element array of float ClipDistance)
+0:?               'clip' ( in 3-element array of 4-element array of float ClipDistance)
+0:11              Constant:
+0:11                0 (const int)
+0:11            Constant:
+0:11              1 (const int)
+0:11        move second child to first child ( temp float)
+0:11          direct index ( temp float)
+0:11            direct index ( temp 4-component vector of float)
+0:?               'clip' ( temp 3-element array of 4-component vector of float)
+0:11              Constant:
+0:11                0 (const int)
+0:11            Constant:
+0:11              2 (const int)
+0:11          direct index ( in float ClipDistance)
+0:11            direct index ( in 4-element array of float ClipDistance)
+0:?               'clip' ( in 3-element array of 4-element array of float ClipDistance)
+0:11              Constant:
+0:11                0 (const int)
+0:11            Constant:
+0:11              2 (const int)
+0:11        move second child to first child ( temp float)
+0:11          direct index ( temp float)
+0:11            direct index ( temp 4-component vector of float)
+0:?               'clip' ( temp 3-element array of 4-component vector of float)
+0:11              Constant:
+0:11                0 (const int)
+0:11            Constant:
+0:11              3 (const int)
+0:11          direct index ( in float ClipDistance)
+0:11            direct index ( in 4-element array of float ClipDistance)
+0:?               'clip' ( in 3-element array of 4-element array of float ClipDistance)
+0:11              Constant:
+0:11                0 (const int)
+0:11            Constant:
+0:11              3 (const int)
+0:11        move second child to first child ( temp float)
+0:11          direct index ( temp float)
+0:11            direct index ( temp 4-component vector of float)
+0:?               'clip' ( temp 3-element array of 4-component vector of float)
+0:11              Constant:
+0:11                1 (const int)
+0:11            Constant:
+0:11              0 (const int)
+0:11          direct index ( in float ClipDistance)
+0:11            direct index ( in 4-element array of float ClipDistance)
+0:?               'clip' ( in 3-element array of 4-element array of float ClipDistance)
+0:11              Constant:
+0:11                1 (const int)
+0:11            Constant:
+0:11              0 (const int)
+0:11        move second child to first child ( temp float)
+0:11          direct index ( temp float)
+0:11            direct index ( temp 4-component vector of float)
+0:?               'clip' ( temp 3-element array of 4-component vector of float)
+0:11              Constant:
+0:11                1 (const int)
+0:11            Constant:
+0:11              1 (const int)
+0:11          direct index ( in float ClipDistance)
+0:11            direct index ( in 4-element array of float ClipDistance)
+0:?               'clip' ( in 3-element array of 4-element array of float ClipDistance)
+0:11              Constant:
+0:11                1 (const int)
+0:11            Constant:
+0:11              1 (const int)
+0:11        move second child to first child ( temp float)
+0:11          direct index ( temp float)
+0:11            direct index ( temp 4-component vector of float)
+0:?               'clip' ( temp 3-element array of 4-component vector of float)
+0:11              Constant:
+0:11                1 (const int)
+0:11            Constant:
+0:11              2 (const int)
+0:11          direct index ( in float ClipDistance)
+0:11            direct index ( in 4-element array of float ClipDistance)
+0:?               'clip' ( in 3-element array of 4-element array of float ClipDistance)
+0:11              Constant:
+0:11                1 (const int)
+0:11            Constant:
+0:11              2 (const int)
+0:11        move second child to first child ( temp float)
+0:11          direct index ( temp float)
+0:11            direct index ( temp 4-component vector of float)
+0:?               'clip' ( temp 3-element array of 4-component vector of float)
+0:11              Constant:
+0:11                1 (const int)
+0:11            Constant:
+0:11              3 (const int)
+0:11          direct index ( in float ClipDistance)
+0:11            direct index ( in 4-element array of float ClipDistance)
+0:?               'clip' ( in 3-element array of 4-element array of float ClipDistance)
+0:11              Constant:
+0:11                1 (const int)
+0:11            Constant:
+0:11              3 (const int)
+0:11        move second child to first child ( temp float)
+0:11          direct index ( temp float)
+0:11            direct index ( temp 4-component vector of float)
+0:?               'clip' ( temp 3-element array of 4-component vector of float)
+0:11              Constant:
+0:11                2 (const int)
+0:11            Constant:
+0:11              0 (const int)
+0:11          direct index ( in float ClipDistance)
+0:11            direct index ( in 4-element array of float ClipDistance)
+0:?               'clip' ( in 3-element array of 4-element array of float ClipDistance)
+0:11              Constant:
+0:11                2 (const int)
+0:11            Constant:
+0:11              0 (const int)
+0:11        move second child to first child ( temp float)
+0:11          direct index ( temp float)
+0:11            direct index ( temp 4-component vector of float)
+0:?               'clip' ( temp 3-element array of 4-component vector of float)
+0:11              Constant:
+0:11                2 (const int)
+0:11            Constant:
+0:11              1 (const int)
+0:11          direct index ( in float ClipDistance)
+0:11            direct index ( in 4-element array of float ClipDistance)
+0:?               'clip' ( in 3-element array of 4-element array of float ClipDistance)
+0:11              Constant:
+0:11                2 (const int)
+0:11            Constant:
+0:11              1 (const int)
+0:11        move second child to first child ( temp float)
+0:11          direct index ( temp float)
+0:11            direct index ( temp 4-component vector of float)
+0:?               'clip' ( temp 3-element array of 4-component vector of float)
+0:11              Constant:
+0:11                2 (const int)
+0:11            Constant:
+0:11              2 (const int)
+0:11          direct index ( in float ClipDistance)
+0:11            direct index ( in 4-element array of float ClipDistance)
+0:?               'clip' ( in 3-element array of 4-element array of float ClipDistance)
+0:11              Constant:
+0:11                2 (const int)
+0:11            Constant:
+0:11              2 (const int)
+0:11        move second child to first child ( temp float)
+0:11          direct index ( temp float)
+0:11            direct index ( temp 4-component vector of float)
+0:?               'clip' ( temp 3-element array of 4-component vector of float)
+0:11              Constant:
+0:11                2 (const int)
+0:11            Constant:
+0:11              3 (const int)
+0:11          direct index ( in float ClipDistance)
+0:11            direct index ( in 4-element array of float ClipDistance)
+0:?               'clip' ( in 3-element array of 4-element array of float ClipDistance)
+0:11              Constant:
+0:11                2 (const int)
+0:11            Constant:
+0:11              3 (const int)
+0:11      Function Call: @main(vf4[3];u1[3];struct-S-vf4-vf21;vf4[3]; ( temp void)
+0:?         'pos' ( temp 3-element array of 4-component vector of float)
+0:?         'VertexID' ( temp 3-element array of uint)
+0:?         'OutputStream' ( temp structure{ temp 4-component vector of float pos,  temp 2-component vector of float clip})
+0:?         'clip' ( temp 3-element array of 4-component vector of float)
+0:?   Linker Objects
+0:?     'pos' ( in 3-element array of 4-component vector of float Position)
+0:?     'VertexID' (layout( location=0) in 3-element array of uint)
+0:?     'OutputStream.pos' ( out 4-component vector of float Position)
+0:?     'clip' ( in 3-element array of 4-element array of float ClipDistance)
+0:?     'OutputStream.clip' ( out 2-element array of float ClipDistance)
+
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 118
+
+                              Capability Geometry
+                              Capability ClipDistance
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Geometry 4  "main" 38 44 57 61 68
+                              ExecutionMode 4 Triangles
+                              ExecutionMode 4 Invocations 1
+                              ExecutionMode 4 OutputLineStrip
+                              ExecutionMode 4 OutputVertices 3
+                              Source HLSL 500
+                              Name 4  "main"
+                              Name 15  "S"
+                              MemberName 15(S) 0  "pos"
+                              MemberName 15(S) 1  "clip"
+                              Name 22  "@main(vf4[3];u1[3];struct-S-vf4-vf21;vf4[3];"
+                              Name 18  "pos"
+                              Name 19  "VertexID"
+                              Name 20  "OutputStream"
+                              Name 21  "clip"
+                              Name 24  "s"
+                              Name 38  "OutputStream.pos"
+                              Name 44  "OutputStream.clip"
+                              Name 55  "pos"
+                              Name 57  "pos"
+                              Name 59  "VertexID"
+                              Name 61  "VertexID"
+                              Name 63  "clip"
+                              Name 68  "clip"
+                              Name 108  "OutputStream"
+                              Name 109  "param"
+                              Name 111  "param"
+                              Name 113  "param"
+                              Name 114  "param"
+                              Decorate 38(OutputStream.pos) BuiltIn Position
+                              Decorate 44(OutputStream.clip) BuiltIn ClipDistance
+                              Decorate 57(pos) BuiltIn Position
+                              Decorate 61(VertexID) Location 0
+                              Decorate 68(clip) BuiltIn ClipDistance
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+               8:             TypeInt 32 0
+               9:      8(int) Constant 3
+              10:             TypeArray 7(fvec4) 9
+              11:             TypePointer Function 10
+              12:             TypeArray 8(int) 9
+              13:             TypePointer Function 12
+              14:             TypeVector 6(float) 2
+           15(S):             TypeStruct 7(fvec4) 14(fvec2)
+              16:             TypePointer Function 15(S)
+              17:             TypeFunction 2 11(ptr) 13(ptr) 16(ptr) 11(ptr)
+              25:             TypeInt 32 1
+              26:     25(int) Constant 0
+              27:             TypePointer Function 7(fvec4)
+              31:     25(int) Constant 1
+              35:             TypePointer Function 14(fvec2)
+              37:             TypePointer Output 7(fvec4)
+38(OutputStream.pos):     37(ptr) Variable Output
+              41:      8(int) Constant 2
+              42:             TypeArray 6(float) 41
+              43:             TypePointer Output 42
+44(OutputStream.clip):     43(ptr) Variable Output
+              45:      8(int) Constant 0
+              46:             TypePointer Function 6(float)
+              49:             TypePointer Output 6(float)
+              51:      8(int) Constant 1
+              56:             TypePointer Input 10
+         57(pos):     56(ptr) Variable Input
+              60:             TypePointer Input 12
+    61(VertexID):     60(ptr) Variable Input
+              64:      8(int) Constant 4
+              65:             TypeArray 6(float) 64
+              66:             TypeArray 65 9
+              67:             TypePointer Input 66
+        68(clip):     67(ptr) Variable Input
+              69:             TypePointer Input 6(float)
+              76:     25(int) Constant 2
+              80:     25(int) Constant 3
+         4(main):           2 Function None 3
+               5:             Label
+         55(pos):     11(ptr) Variable Function
+    59(VertexID):     13(ptr) Variable Function
+        63(clip):     11(ptr) Variable Function
+108(OutputStream):     16(ptr) Variable Function
+      109(param):     11(ptr) Variable Function
+      111(param):     13(ptr) Variable Function
+      113(param):     16(ptr) Variable Function
+      114(param):     11(ptr) Variable Function
+              58:          10 Load 57(pos)
+                              Store 55(pos) 58
+              62:          12 Load 61(VertexID)
+                              Store 59(VertexID) 62
+              70:     69(ptr) AccessChain 68(clip) 26 26
+              71:    6(float) Load 70
+              72:     46(ptr) AccessChain 63(clip) 26 45
+                              Store 72 71
+              73:     69(ptr) AccessChain 68(clip) 26 31
+              74:    6(float) Load 73
+              75:     46(ptr) AccessChain 63(clip) 26 51
+                              Store 75 74
+              77:     69(ptr) AccessChain 68(clip) 26 76
+              78:    6(float) Load 77
+              79:     46(ptr) AccessChain 63(clip) 26 41
+                              Store 79 78
+              81:     69(ptr) AccessChain 68(clip) 26 80
+              82:    6(float) Load 81
+              83:     46(ptr) AccessChain 63(clip) 26 9
+                              Store 83 82
+              84:     69(ptr) AccessChain 68(clip) 31 26
+              85:    6(float) Load 84
+              86:     46(ptr) AccessChain 63(clip) 31 45
+                              Store 86 85
+              87:     69(ptr) AccessChain 68(clip) 31 31
+              88:    6(float) Load 87
+              89:     46(ptr) AccessChain 63(clip) 31 51
+                              Store 89 88
+              90:     69(ptr) AccessChain 68(clip) 31 76
+              91:    6(float) Load 90
+              92:     46(ptr) AccessChain 63(clip) 31 41
+                              Store 92 91
+              93:     69(ptr) AccessChain 68(clip) 31 80
+              94:    6(float) Load 93
+              95:     46(ptr) AccessChain 63(clip) 31 9
+                              Store 95 94
+              96:     69(ptr) AccessChain 68(clip) 76 26
+              97:    6(float) Load 96
+              98:     46(ptr) AccessChain 63(clip) 76 45
+                              Store 98 97
+              99:     69(ptr) AccessChain 68(clip) 76 31
+             100:    6(float) Load 99
+             101:     46(ptr) AccessChain 63(clip) 76 51
+                              Store 101 100
+             102:     69(ptr) AccessChain 68(clip) 76 76
+             103:    6(float) Load 102
+             104:     46(ptr) AccessChain 63(clip) 76 41
+                              Store 104 103
+             105:     69(ptr) AccessChain 68(clip) 76 80
+             106:    6(float) Load 105
+             107:     46(ptr) AccessChain 63(clip) 76 9
+                              Store 107 106
+             110:          10 Load 55(pos)
+                              Store 109(param) 110
+             112:          12 Load 59(VertexID)
+                              Store 111(param) 112
+             115:          10 Load 63(clip)
+                              Store 114(param) 115
+             116:           2 FunctionCall 22(@main(vf4[3];u1[3];struct-S-vf4-vf21;vf4[3];) 109(param) 111(param) 113(param) 114(param)
+             117:       15(S) Load 113(param)
+                              Store 108(OutputStream) 117
+                              Return
+                              FunctionEnd
+22(@main(vf4[3];u1[3];struct-S-vf4-vf21;vf4[3];):           2 Function None 17
+         18(pos):     11(ptr) FunctionParameter
+    19(VertexID):     13(ptr) FunctionParameter
+20(OutputStream):     16(ptr) FunctionParameter
+        21(clip):     11(ptr) FunctionParameter
+              23:             Label
+           24(s):     16(ptr) Variable Function
+              28:     27(ptr) AccessChain 18(pos) 26
+              29:    7(fvec4) Load 28
+              30:     27(ptr) AccessChain 24(s) 26
+                              Store 30 29
+              32:     27(ptr) AccessChain 21(clip) 26
+              33:    7(fvec4) Load 32
+              34:   14(fvec2) VectorShuffle 33 33 0 1
+              36:     35(ptr) AccessChain 24(s) 31
+                              Store 36 34
+              39:     27(ptr) AccessChain 24(s) 26
+              40:    7(fvec4) Load 39
+                              Store 38(OutputStream.pos) 40
+              47:     46(ptr) AccessChain 24(s) 31 45
+              48:    6(float) Load 47
+              50:     49(ptr) AccessChain 44(OutputStream.clip) 26
+                              Store 50 48
+              52:     46(ptr) AccessChain 24(s) 31 51
+              53:    6(float) Load 52
+              54:     49(ptr) AccessChain 44(OutputStream.clip) 31
+                              Store 54 53
+                              EmitVertex
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/hlsl.clipdistance-1.vert.out b/Test/baseResults/hlsl.clipdistance-1.vert.out
new file mode 100644
index 0000000..d1d1370
--- /dev/null
+++ b/Test/baseResults/hlsl.clipdistance-1.vert.out
@@ -0,0 +1,194 @@
+hlsl.clipdistance-1.vert
+Shader version: 500
+0:? Sequence
+0:4  Function Definition: @main(vf4;f1;f1; ( temp void)
+0:4    Function Parameters: 
+0:4      'pos' ( out 4-component vector of float)
+0:4      'clip' ( out float)
+0:4      'cull' ( out float)
+0:?     Sequence
+0:5      move second child to first child ( temp 4-component vector of float)
+0:5        'pos' ( out 4-component vector of float)
+0:5        Constant:
+0:5          1.000000
+0:5          1.000000
+0:5          1.000000
+0:5          1.000000
+0:6      move second child to first child ( temp float)
+0:6        'clip' ( out float)
+0:6        Constant:
+0:6          0.500000
+0:7      move second child to first child ( temp float)
+0:7        'cull' ( out float)
+0:7        Constant:
+0:7          0.510000
+0:4  Function Definition: main( ( temp void)
+0:4    Function Parameters: 
+0:?     Sequence
+0:4      Function Call: @main(vf4;f1;f1; ( temp void)
+0:?         'pos' ( temp 4-component vector of float)
+0:?         'clip' ( temp float)
+0:?         'cull' ( temp float)
+0:4      move second child to first child ( temp 4-component vector of float)
+0:?         'pos' ( out 4-component vector of float Position)
+0:?         'pos' ( temp 4-component vector of float)
+0:?       Sequence
+0:4        move second child to first child ( temp float)
+0:4          direct index ( out float ClipDistance)
+0:?             'clip' ( out 1-element array of float ClipDistance)
+0:4            Constant:
+0:4              0 (const int)
+0:?           'clip' ( temp float)
+0:?       Sequence
+0:4        move second child to first child ( temp float)
+0:4          direct index ( out float CullDistance)
+0:?             'cull' ( out 1-element array of float CullDistance)
+0:4            Constant:
+0:4              0 (const int)
+0:?           'cull' ( temp float)
+0:?   Linker Objects
+0:?     'pos' ( out 4-component vector of float Position)
+0:?     'clip' ( out 1-element array of float ClipDistance)
+0:?     'cull' ( out 1-element array of float CullDistance)
+
+
+Linked vertex stage:
+
+
+Shader version: 500
+0:? Sequence
+0:4  Function Definition: @main(vf4;f1;f1; ( temp void)
+0:4    Function Parameters: 
+0:4      'pos' ( out 4-component vector of float)
+0:4      'clip' ( out float)
+0:4      'cull' ( out float)
+0:?     Sequence
+0:5      move second child to first child ( temp 4-component vector of float)
+0:5        'pos' ( out 4-component vector of float)
+0:5        Constant:
+0:5          1.000000
+0:5          1.000000
+0:5          1.000000
+0:5          1.000000
+0:6      move second child to first child ( temp float)
+0:6        'clip' ( out float)
+0:6        Constant:
+0:6          0.500000
+0:7      move second child to first child ( temp float)
+0:7        'cull' ( out float)
+0:7        Constant:
+0:7          0.510000
+0:4  Function Definition: main( ( temp void)
+0:4    Function Parameters: 
+0:?     Sequence
+0:4      Function Call: @main(vf4;f1;f1; ( temp void)
+0:?         'pos' ( temp 4-component vector of float)
+0:?         'clip' ( temp float)
+0:?         'cull' ( temp float)
+0:4      move second child to first child ( temp 4-component vector of float)
+0:?         'pos' ( out 4-component vector of float Position)
+0:?         'pos' ( temp 4-component vector of float)
+0:?       Sequence
+0:4        move second child to first child ( temp float)
+0:4          direct index ( out float ClipDistance)
+0:?             'clip' ( out 1-element array of float ClipDistance)
+0:4            Constant:
+0:4              0 (const int)
+0:?           'clip' ( temp float)
+0:?       Sequence
+0:4        move second child to first child ( temp float)
+0:4          direct index ( out float CullDistance)
+0:?             'cull' ( out 1-element array of float CullDistance)
+0:4            Constant:
+0:4              0 (const int)
+0:?           'cull' ( temp float)
+0:?   Linker Objects
+0:?     'pos' ( out 4-component vector of float Position)
+0:?     'clip' ( out 1-element array of float ClipDistance)
+0:?     'cull' ( out 1-element array of float CullDistance)
+
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 46
+
+                              Capability Shader
+                              Capability ClipDistance
+                              Capability CullDistance
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Vertex 4  "main" 31 37 43
+                              Source HLSL 500
+                              Name 4  "main"
+                              Name 14  "@main(vf4;f1;f1;"
+                              Name 11  "pos"
+                              Name 12  "clip"
+                              Name 13  "cull"
+                              Name 20  "pos"
+                              Name 21  "clip"
+                              Name 22  "cull"
+                              Name 23  "param"
+                              Name 24  "param"
+                              Name 25  "param"
+                              Name 31  "pos"
+                              Name 37  "clip"
+                              Name 43  "cull"
+                              Decorate 31(pos) BuiltIn Position
+                              Decorate 37(clip) BuiltIn ClipDistance
+                              Decorate 43(cull) BuiltIn CullDistance
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+               8:             TypePointer Function 7(fvec4)
+               9:             TypePointer Function 6(float)
+              10:             TypeFunction 2 8(ptr) 9(ptr) 9(ptr)
+              16:    6(float) Constant 1065353216
+              17:    7(fvec4) ConstantComposite 16 16 16 16
+              18:    6(float) Constant 1056964608
+              19:    6(float) Constant 1057132380
+              30:             TypePointer Output 7(fvec4)
+         31(pos):     30(ptr) Variable Output
+              33:             TypeInt 32 0
+              34:     33(int) Constant 1
+              35:             TypeArray 6(float) 34
+              36:             TypePointer Output 35
+        37(clip):     36(ptr) Variable Output
+              38:             TypeInt 32 1
+              39:     38(int) Constant 0
+              41:             TypePointer Output 6(float)
+        43(cull):     36(ptr) Variable Output
+         4(main):           2 Function None 3
+               5:             Label
+         20(pos):      8(ptr) Variable Function
+        21(clip):      9(ptr) Variable Function
+        22(cull):      9(ptr) Variable Function
+       23(param):      8(ptr) Variable Function
+       24(param):      9(ptr) Variable Function
+       25(param):      9(ptr) Variable Function
+              26:           2 FunctionCall 14(@main(vf4;f1;f1;) 23(param) 24(param) 25(param)
+              27:    7(fvec4) Load 23(param)
+                              Store 20(pos) 27
+              28:    6(float) Load 24(param)
+                              Store 21(clip) 28
+              29:    6(float) Load 25(param)
+                              Store 22(cull) 29
+              32:    7(fvec4) Load 20(pos)
+                              Store 31(pos) 32
+              40:    6(float) Load 21(clip)
+              42:     41(ptr) AccessChain 37(clip) 39
+                              Store 42 40
+              44:    6(float) Load 22(cull)
+              45:     41(ptr) AccessChain 43(cull) 39
+                              Store 45 44
+                              Return
+                              FunctionEnd
+14(@main(vf4;f1;f1;):           2 Function None 10
+         11(pos):      8(ptr) FunctionParameter
+        12(clip):      9(ptr) FunctionParameter
+        13(cull):      9(ptr) FunctionParameter
+              15:             Label
+                              Store 11(pos) 17
+                              Store 12(clip) 18
+                              Store 13(cull) 19
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/hlsl.clipdistance-2.frag.out b/Test/baseResults/hlsl.clipdistance-2.frag.out
new file mode 100644
index 0000000..64604eb
--- /dev/null
+++ b/Test/baseResults/hlsl.clipdistance-2.frag.out
@@ -0,0 +1,419 @@
+hlsl.clipdistance-2.frag
+Shader version: 500
+gl_FragCoord origin is upper left
+0:? Sequence
+0:4  Function Definition: @main(vf4;vf2[2];vf2[2]; ( temp 4-component vector of float)
+0:4    Function Parameters: 
+0:4      'pos' ( in 4-component vector of float)
+0:4      'clip' ( in 2-element array of 2-component vector of float)
+0:4      'cull' ( in 2-element array of 2-component vector of float)
+0:?     Sequence
+0:6      Branch: Return with expression
+0:6        add ( temp 4-component vector of float)
+0:6          add ( temp 4-component vector of float)
+0:6            'pos' ( in 4-component vector of float)
+0:6            direct index ( temp float)
+0:6              direct index ( temp 2-component vector of float)
+0:6                'clip' ( in 2-element array of 2-component vector of float)
+0:6                Constant:
+0:6                  0 (const int)
+0:6              Constant:
+0:6                0 (const int)
+0:6          direct index ( temp float)
+0:6            direct index ( temp 2-component vector of float)
+0:6              'cull' ( in 2-element array of 2-component vector of float)
+0:6              Constant:
+0:6                0 (const int)
+0:6            Constant:
+0:6              0 (const int)
+0:4  Function Definition: main( ( temp void)
+0:4    Function Parameters: 
+0:?     Sequence
+0:4      move second child to first child ( temp 4-component vector of float)
+0:?         'pos' ( temp 4-component vector of float)
+0:?         'pos' ( in 4-component vector of float FragCoord)
+0:?       Sequence
+0:4        move second child to first child ( temp float)
+0:4          direct index ( temp float)
+0:4            direct index ( temp 2-component vector of float)
+0:?               'clip' ( temp 2-element array of 2-component vector of float)
+0:4              Constant:
+0:4                0 (const int)
+0:4            Constant:
+0:4              0 (const int)
+0:4          direct index ( in float ClipDistance)
+0:?             'clip' ( in 4-element array of float ClipDistance)
+0:4            Constant:
+0:4              0 (const int)
+0:4        move second child to first child ( temp float)
+0:4          direct index ( temp float)
+0:4            direct index ( temp 2-component vector of float)
+0:?               'clip' ( temp 2-element array of 2-component vector of float)
+0:4              Constant:
+0:4                0 (const int)
+0:4            Constant:
+0:4              1 (const int)
+0:4          direct index ( in float ClipDistance)
+0:?             'clip' ( in 4-element array of float ClipDistance)
+0:4            Constant:
+0:4              1 (const int)
+0:4        move second child to first child ( temp float)
+0:4          direct index ( temp float)
+0:4            direct index ( temp 2-component vector of float)
+0:?               'clip' ( temp 2-element array of 2-component vector of float)
+0:4              Constant:
+0:4                1 (const int)
+0:4            Constant:
+0:4              0 (const int)
+0:4          direct index ( in float ClipDistance)
+0:?             'clip' ( in 4-element array of float ClipDistance)
+0:4            Constant:
+0:4              2 (const int)
+0:4        move second child to first child ( temp float)
+0:4          direct index ( temp float)
+0:4            direct index ( temp 2-component vector of float)
+0:?               'clip' ( temp 2-element array of 2-component vector of float)
+0:4              Constant:
+0:4                1 (const int)
+0:4            Constant:
+0:4              1 (const int)
+0:4          direct index ( in float ClipDistance)
+0:?             'clip' ( in 4-element array of float ClipDistance)
+0:4            Constant:
+0:4              3 (const int)
+0:?       Sequence
+0:4        move second child to first child ( temp float)
+0:4          direct index ( temp float)
+0:4            direct index ( temp 2-component vector of float)
+0:?               'cull' ( temp 2-element array of 2-component vector of float)
+0:4              Constant:
+0:4                0 (const int)
+0:4            Constant:
+0:4              0 (const int)
+0:4          direct index ( in float CullDistance)
+0:?             'cull' ( in 4-element array of float CullDistance)
+0:4            Constant:
+0:4              0 (const int)
+0:4        move second child to first child ( temp float)
+0:4          direct index ( temp float)
+0:4            direct index ( temp 2-component vector of float)
+0:?               'cull' ( temp 2-element array of 2-component vector of float)
+0:4              Constant:
+0:4                0 (const int)
+0:4            Constant:
+0:4              1 (const int)
+0:4          direct index ( in float CullDistance)
+0:?             'cull' ( in 4-element array of float CullDistance)
+0:4            Constant:
+0:4              1 (const int)
+0:4        move second child to first child ( temp float)
+0:4          direct index ( temp float)
+0:4            direct index ( temp 2-component vector of float)
+0:?               'cull' ( temp 2-element array of 2-component vector of float)
+0:4              Constant:
+0:4                1 (const int)
+0:4            Constant:
+0:4              0 (const int)
+0:4          direct index ( in float CullDistance)
+0:?             'cull' ( in 4-element array of float CullDistance)
+0:4            Constant:
+0:4              2 (const int)
+0:4        move second child to first child ( temp float)
+0:4          direct index ( temp float)
+0:4            direct index ( temp 2-component vector of float)
+0:?               'cull' ( temp 2-element array of 2-component vector of float)
+0:4              Constant:
+0:4                1 (const int)
+0:4            Constant:
+0:4              1 (const int)
+0:4          direct index ( in float CullDistance)
+0:?             'cull' ( in 4-element array of float CullDistance)
+0:4            Constant:
+0:4              3 (const int)
+0:4      move second child to first child ( temp 4-component vector of float)
+0:?         '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+0:4        Function Call: @main(vf4;vf2[2];vf2[2]; ( temp 4-component vector of float)
+0:?           'pos' ( temp 4-component vector of float)
+0:?           'clip' ( temp 2-element array of 2-component vector of float)
+0:?           'cull' ( temp 2-element array of 2-component vector of float)
+0:?   Linker Objects
+0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+0:?     'pos' ( in 4-component vector of float FragCoord)
+0:?     'clip' ( in 4-element array of float ClipDistance)
+0:?     'cull' ( in 4-element array of float CullDistance)
+
+
+Linked fragment stage:
+
+
+Shader version: 500
+gl_FragCoord origin is upper left
+0:? Sequence
+0:4  Function Definition: @main(vf4;vf2[2];vf2[2]; ( temp 4-component vector of float)
+0:4    Function Parameters: 
+0:4      'pos' ( in 4-component vector of float)
+0:4      'clip' ( in 2-element array of 2-component vector of float)
+0:4      'cull' ( in 2-element array of 2-component vector of float)
+0:?     Sequence
+0:6      Branch: Return with expression
+0:6        add ( temp 4-component vector of float)
+0:6          add ( temp 4-component vector of float)
+0:6            'pos' ( in 4-component vector of float)
+0:6            direct index ( temp float)
+0:6              direct index ( temp 2-component vector of float)
+0:6                'clip' ( in 2-element array of 2-component vector of float)
+0:6                Constant:
+0:6                  0 (const int)
+0:6              Constant:
+0:6                0 (const int)
+0:6          direct index ( temp float)
+0:6            direct index ( temp 2-component vector of float)
+0:6              'cull' ( in 2-element array of 2-component vector of float)
+0:6              Constant:
+0:6                0 (const int)
+0:6            Constant:
+0:6              0 (const int)
+0:4  Function Definition: main( ( temp void)
+0:4    Function Parameters: 
+0:?     Sequence
+0:4      move second child to first child ( temp 4-component vector of float)
+0:?         'pos' ( temp 4-component vector of float)
+0:?         'pos' ( in 4-component vector of float FragCoord)
+0:?       Sequence
+0:4        move second child to first child ( temp float)
+0:4          direct index ( temp float)
+0:4            direct index ( temp 2-component vector of float)
+0:?               'clip' ( temp 2-element array of 2-component vector of float)
+0:4              Constant:
+0:4                0 (const int)
+0:4            Constant:
+0:4              0 (const int)
+0:4          direct index ( in float ClipDistance)
+0:?             'clip' ( in 4-element array of float ClipDistance)
+0:4            Constant:
+0:4              0 (const int)
+0:4        move second child to first child ( temp float)
+0:4          direct index ( temp float)
+0:4            direct index ( temp 2-component vector of float)
+0:?               'clip' ( temp 2-element array of 2-component vector of float)
+0:4              Constant:
+0:4                0 (const int)
+0:4            Constant:
+0:4              1 (const int)
+0:4          direct index ( in float ClipDistance)
+0:?             'clip' ( in 4-element array of float ClipDistance)
+0:4            Constant:
+0:4              1 (const int)
+0:4        move second child to first child ( temp float)
+0:4          direct index ( temp float)
+0:4            direct index ( temp 2-component vector of float)
+0:?               'clip' ( temp 2-element array of 2-component vector of float)
+0:4              Constant:
+0:4                1 (const int)
+0:4            Constant:
+0:4              0 (const int)
+0:4          direct index ( in float ClipDistance)
+0:?             'clip' ( in 4-element array of float ClipDistance)
+0:4            Constant:
+0:4              2 (const int)
+0:4        move second child to first child ( temp float)
+0:4          direct index ( temp float)
+0:4            direct index ( temp 2-component vector of float)
+0:?               'clip' ( temp 2-element array of 2-component vector of float)
+0:4              Constant:
+0:4                1 (const int)
+0:4            Constant:
+0:4              1 (const int)
+0:4          direct index ( in float ClipDistance)
+0:?             'clip' ( in 4-element array of float ClipDistance)
+0:4            Constant:
+0:4              3 (const int)
+0:?       Sequence
+0:4        move second child to first child ( temp float)
+0:4          direct index ( temp float)
+0:4            direct index ( temp 2-component vector of float)
+0:?               'cull' ( temp 2-element array of 2-component vector of float)
+0:4              Constant:
+0:4                0 (const int)
+0:4            Constant:
+0:4              0 (const int)
+0:4          direct index ( in float CullDistance)
+0:?             'cull' ( in 4-element array of float CullDistance)
+0:4            Constant:
+0:4              0 (const int)
+0:4        move second child to first child ( temp float)
+0:4          direct index ( temp float)
+0:4            direct index ( temp 2-component vector of float)
+0:?               'cull' ( temp 2-element array of 2-component vector of float)
+0:4              Constant:
+0:4                0 (const int)
+0:4            Constant:
+0:4              1 (const int)
+0:4          direct index ( in float CullDistance)
+0:?             'cull' ( in 4-element array of float CullDistance)
+0:4            Constant:
+0:4              1 (const int)
+0:4        move second child to first child ( temp float)
+0:4          direct index ( temp float)
+0:4            direct index ( temp 2-component vector of float)
+0:?               'cull' ( temp 2-element array of 2-component vector of float)
+0:4              Constant:
+0:4                1 (const int)
+0:4            Constant:
+0:4              0 (const int)
+0:4          direct index ( in float CullDistance)
+0:?             'cull' ( in 4-element array of float CullDistance)
+0:4            Constant:
+0:4              2 (const int)
+0:4        move second child to first child ( temp float)
+0:4          direct index ( temp float)
+0:4            direct index ( temp 2-component vector of float)
+0:?               'cull' ( temp 2-element array of 2-component vector of float)
+0:4              Constant:
+0:4                1 (const int)
+0:4            Constant:
+0:4              1 (const int)
+0:4          direct index ( in float CullDistance)
+0:?             'cull' ( in 4-element array of float CullDistance)
+0:4            Constant:
+0:4              3 (const int)
+0:4      move second child to first child ( temp 4-component vector of float)
+0:?         '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+0:4        Function Call: @main(vf4;vf2[2];vf2[2]; ( temp 4-component vector of float)
+0:?           'pos' ( temp 4-component vector of float)
+0:?           'clip' ( temp 2-element array of 2-component vector of float)
+0:?           'cull' ( temp 2-element array of 2-component vector of float)
+0:?   Linker Objects
+0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+0:?     'pos' ( in 4-component vector of float FragCoord)
+0:?     'clip' ( in 4-element array of float ClipDistance)
+0:?     'cull' ( in 4-element array of float CullDistance)
+
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 84
+
+                              Capability Shader
+                              Capability ClipDistance
+                              Capability CullDistance
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 37 43 62 76
+                              ExecutionMode 4 OriginUpperLeft
+                              Source HLSL 500
+                              Name 4  "main"
+                              Name 18  "@main(vf4;vf2[2];vf2[2];"
+                              Name 15  "pos"
+                              Name 16  "clip"
+                              Name 17  "cull"
+                              Name 35  "pos"
+                              Name 37  "pos"
+                              Name 39  "clip"
+                              Name 43  "clip"
+                              Name 61  "cull"
+                              Name 62  "cull"
+                              Name 76  "@entryPointOutput"
+                              Name 77  "param"
+                              Name 79  "param"
+                              Name 81  "param"
+                              Decorate 37(pos) BuiltIn FragCoord
+                              Decorate 43(clip) BuiltIn ClipDistance
+                              Decorate 62(cull) BuiltIn CullDistance
+                              Decorate 76(@entryPointOutput) Location 0
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+               8:             TypePointer Function 7(fvec4)
+               9:             TypeVector 6(float) 2
+              10:             TypeInt 32 0
+              11:     10(int) Constant 2
+              12:             TypeArray 9(fvec2) 11
+              13:             TypePointer Function 12
+              14:             TypeFunction 7(fvec4) 8(ptr) 13(ptr) 13(ptr)
+              21:             TypeInt 32 1
+              22:     21(int) Constant 0
+              23:     10(int) Constant 0
+              24:             TypePointer Function 6(float)
+              36:             TypePointer Input 7(fvec4)
+         37(pos):     36(ptr) Variable Input
+              40:     10(int) Constant 4
+              41:             TypeArray 6(float) 40
+              42:             TypePointer Input 41
+        43(clip):     42(ptr) Variable Input
+              44:             TypePointer Input 6(float)
+              48:     21(int) Constant 1
+              51:     10(int) Constant 1
+              53:     21(int) Constant 2
+              57:     21(int) Constant 3
+        62(cull):     42(ptr) Variable Input
+              75:             TypePointer Output 7(fvec4)
+76(@entryPointOutput):     75(ptr) Variable Output
+         4(main):           2 Function None 3
+               5:             Label
+         35(pos):      8(ptr) Variable Function
+        39(clip):     13(ptr) Variable Function
+        61(cull):     13(ptr) Variable Function
+       77(param):      8(ptr) Variable Function
+       79(param):     13(ptr) Variable Function
+       81(param):     13(ptr) Variable Function
+              38:    7(fvec4) Load 37(pos)
+                              Store 35(pos) 38
+              45:     44(ptr) AccessChain 43(clip) 22
+              46:    6(float) Load 45
+              47:     24(ptr) AccessChain 39(clip) 22 23
+                              Store 47 46
+              49:     44(ptr) AccessChain 43(clip) 48
+              50:    6(float) Load 49
+              52:     24(ptr) AccessChain 39(clip) 22 51
+                              Store 52 50
+              54:     44(ptr) AccessChain 43(clip) 53
+              55:    6(float) Load 54
+              56:     24(ptr) AccessChain 39(clip) 48 23
+                              Store 56 55
+              58:     44(ptr) AccessChain 43(clip) 57
+              59:    6(float) Load 58
+              60:     24(ptr) AccessChain 39(clip) 48 51
+                              Store 60 59
+              63:     44(ptr) AccessChain 62(cull) 22
+              64:    6(float) Load 63
+              65:     24(ptr) AccessChain 61(cull) 22 23
+                              Store 65 64
+              66:     44(ptr) AccessChain 62(cull) 48
+              67:    6(float) Load 66
+              68:     24(ptr) AccessChain 61(cull) 22 51
+                              Store 68 67
+              69:     44(ptr) AccessChain 62(cull) 53
+              70:    6(float) Load 69
+              71:     24(ptr) AccessChain 61(cull) 48 23
+                              Store 71 70
+              72:     44(ptr) AccessChain 62(cull) 57
+              73:    6(float) Load 72
+              74:     24(ptr) AccessChain 61(cull) 48 51
+                              Store 74 73
+              78:    7(fvec4) Load 35(pos)
+                              Store 77(param) 78
+              80:          12 Load 39(clip)
+                              Store 79(param) 80
+              82:          12 Load 61(cull)
+                              Store 81(param) 82
+              83:    7(fvec4) FunctionCall 18(@main(vf4;vf2[2];vf2[2];) 77(param) 79(param) 81(param)
+                              Store 76(@entryPointOutput) 83
+                              Return
+                              FunctionEnd
+18(@main(vf4;vf2[2];vf2[2];):    7(fvec4) Function None 14
+         15(pos):      8(ptr) FunctionParameter
+        16(clip):     13(ptr) FunctionParameter
+        17(cull):     13(ptr) FunctionParameter
+              19:             Label
+              20:    7(fvec4) Load 15(pos)
+              25:     24(ptr) AccessChain 16(clip) 22 23
+              26:    6(float) Load 25
+              27:    7(fvec4) CompositeConstruct 26 26 26 26
+              28:    7(fvec4) FAdd 20 27
+              29:     24(ptr) AccessChain 17(cull) 22 23
+              30:    6(float) Load 29
+              31:    7(fvec4) CompositeConstruct 30 30 30 30
+              32:    7(fvec4) FAdd 28 31
+                              ReturnValue 32
+                              FunctionEnd
diff --git a/Test/baseResults/hlsl.clipdistance-2.geom.out b/Test/baseResults/hlsl.clipdistance-2.geom.out
new file mode 100644
index 0000000..a8abd02
--- /dev/null
+++ b/Test/baseResults/hlsl.clipdistance-2.geom.out
@@ -0,0 +1,924 @@
+hlsl.clipdistance-2.geom
+Shader version: 500
+invocations = -1
+max_vertices = 3
+input primitive = triangles
+output primitive = line_strip
+0:? Sequence
+0:11  Function Definition: @main(vf4[3];u1[3];struct-S-vf4-vf2[2]1;vf2[3][2]; ( temp void)
+0:11    Function Parameters: 
+0:11      'pos' ( in 3-element array of 4-component vector of float)
+0:11      'VertexID' ( in 3-element array of uint)
+0:11      'OutputStream' ( out structure{ temp 4-component vector of float pos,  temp 2-element array of 2-component vector of float clip})
+0:11      'clip' ( in 3-element array of 2-element array of 2-component vector of float)
+0:?     Sequence
+0:14      move second child to first child ( temp 4-component vector of float)
+0:14        pos: direct index for structure ( temp 4-component vector of float)
+0:14          's' ( temp structure{ temp 4-component vector of float pos,  temp 2-element array of 2-component vector of float clip})
+0:14          Constant:
+0:14            0 (const int)
+0:14        direct index ( temp 4-component vector of float)
+0:14          'pos' ( in 3-element array of 4-component vector of float)
+0:14          Constant:
+0:14            0 (const int)
+0:15      move second child to first child ( temp 2-component vector of float)
+0:15        direct index ( temp 2-component vector of float)
+0:15          clip: direct index for structure ( temp 2-element array of 2-component vector of float)
+0:15            's' ( temp structure{ temp 4-component vector of float pos,  temp 2-element array of 2-component vector of float clip})
+0:15            Constant:
+0:15              1 (const int)
+0:15          Constant:
+0:15            0 (const int)
+0:15        direct index ( temp 2-component vector of float)
+0:15          direct index ( temp 2-element array of 2-component vector of float)
+0:15            'clip' ( in 3-element array of 2-element array of 2-component vector of float)
+0:15            Constant:
+0:15              0 (const int)
+0:15          Constant:
+0:15            0 (const int)
+0:16      move second child to first child ( temp 2-component vector of float)
+0:16        direct index ( temp 2-component vector of float)
+0:16          clip: direct index for structure ( temp 2-element array of 2-component vector of float)
+0:16            's' ( temp structure{ temp 4-component vector of float pos,  temp 2-element array of 2-component vector of float clip})
+0:16            Constant:
+0:16              1 (const int)
+0:16          Constant:
+0:16            1 (const int)
+0:16        direct index ( temp 2-component vector of float)
+0:16          direct index ( temp 2-element array of 2-component vector of float)
+0:16            'clip' ( in 3-element array of 2-element array of 2-component vector of float)
+0:16            Constant:
+0:16              0 (const int)
+0:16          Constant:
+0:16            1 (const int)
+0:18      Sequence
+0:18        Sequence
+0:18          move second child to first child ( temp 4-component vector of float)
+0:?             'OutputStream.pos' ( out 4-component vector of float Position)
+0:18            pos: direct index for structure ( temp 4-component vector of float)
+0:18              's' ( temp structure{ temp 4-component vector of float pos,  temp 2-element array of 2-component vector of float clip})
+0:18              Constant:
+0:18                0 (const int)
+0:?           Sequence
+0:18            move second child to first child ( temp float)
+0:18              direct index ( out float ClipDistance)
+0:?                 'OutputStream.clip' ( out 4-element array of float ClipDistance)
+0:18                Constant:
+0:18                  0 (const int)
+0:18              direct index ( temp float)
+0:18                direct index ( temp 2-component vector of float)
+0:18                  clip: direct index for structure ( temp 2-element array of 2-component vector of float)
+0:18                    's' ( temp structure{ temp 4-component vector of float pos,  temp 2-element array of 2-component vector of float clip})
+0:18                    Constant:
+0:18                      1 (const int)
+0:18                  Constant:
+0:18                    0 (const int)
+0:18                Constant:
+0:18                  0 (const int)
+0:18            move second child to first child ( temp float)
+0:18              direct index ( out float ClipDistance)
+0:?                 'OutputStream.clip' ( out 4-element array of float ClipDistance)
+0:18                Constant:
+0:18                  1 (const int)
+0:18              direct index ( temp float)
+0:18                direct index ( temp 2-component vector of float)
+0:18                  clip: direct index for structure ( temp 2-element array of 2-component vector of float)
+0:18                    's' ( temp structure{ temp 4-component vector of float pos,  temp 2-element array of 2-component vector of float clip})
+0:18                    Constant:
+0:18                      1 (const int)
+0:18                  Constant:
+0:18                    0 (const int)
+0:18                Constant:
+0:18                  1 (const int)
+0:18            move second child to first child ( temp float)
+0:18              direct index ( out float ClipDistance)
+0:?                 'OutputStream.clip' ( out 4-element array of float ClipDistance)
+0:18                Constant:
+0:18                  2 (const int)
+0:18              direct index ( temp float)
+0:18                direct index ( temp 2-component vector of float)
+0:18                  clip: direct index for structure ( temp 2-element array of 2-component vector of float)
+0:18                    's' ( temp structure{ temp 4-component vector of float pos,  temp 2-element array of 2-component vector of float clip})
+0:18                    Constant:
+0:18                      1 (const int)
+0:18                  Constant:
+0:18                    1 (const int)
+0:18                Constant:
+0:18                  0 (const int)
+0:18            move second child to first child ( temp float)
+0:18              direct index ( out float ClipDistance)
+0:?                 'OutputStream.clip' ( out 4-element array of float ClipDistance)
+0:18                Constant:
+0:18                  3 (const int)
+0:18              direct index ( temp float)
+0:18                direct index ( temp 2-component vector of float)
+0:18                  clip: direct index for structure ( temp 2-element array of 2-component vector of float)
+0:18                    's' ( temp structure{ temp 4-component vector of float pos,  temp 2-element array of 2-component vector of float clip})
+0:18                    Constant:
+0:18                      1 (const int)
+0:18                  Constant:
+0:18                    1 (const int)
+0:18                Constant:
+0:18                  1 (const int)
+0:18        EmitVertex ( temp void)
+0:11  Function Definition: main( ( temp void)
+0:11    Function Parameters: 
+0:?     Sequence
+0:11      move second child to first child ( temp 3-element array of 4-component vector of float)
+0:?         'pos' ( temp 3-element array of 4-component vector of float)
+0:?         'pos' ( in 3-element array of 4-component vector of float Position)
+0:11      move second child to first child ( temp 3-element array of uint)
+0:?         'VertexID' ( temp 3-element array of uint)
+0:?         'VertexID' (layout( location=0) in 3-element array of uint)
+0:?       Sequence
+0:11        move second child to first child ( temp float)
+0:11          direct index ( temp float)
+0:11            direct index ( temp 2-component vector of float)
+0:11              direct index ( temp 2-element array of 2-component vector of float)
+0:?                 'clip' ( temp 3-element array of 2-element array of 2-component vector of float)
+0:11                Constant:
+0:11                  0 (const int)
+0:11              Constant:
+0:11                0 (const int)
+0:11            Constant:
+0:11              0 (const int)
+0:11          direct index ( in float ClipDistance)
+0:11            direct index ( in 4-element array of float ClipDistance)
+0:?               'clip' ( in 3-element array of 4-element array of float ClipDistance)
+0:11              Constant:
+0:11                0 (const int)
+0:11            Constant:
+0:11              0 (const int)
+0:11        move second child to first child ( temp float)
+0:11          direct index ( temp float)
+0:11            direct index ( temp 2-component vector of float)
+0:11              direct index ( temp 2-element array of 2-component vector of float)
+0:?                 'clip' ( temp 3-element array of 2-element array of 2-component vector of float)
+0:11                Constant:
+0:11                  0 (const int)
+0:11              Constant:
+0:11                0 (const int)
+0:11            Constant:
+0:11              1 (const int)
+0:11          direct index ( in float ClipDistance)
+0:11            direct index ( in 4-element array of float ClipDistance)
+0:?               'clip' ( in 3-element array of 4-element array of float ClipDistance)
+0:11              Constant:
+0:11                0 (const int)
+0:11            Constant:
+0:11              1 (const int)
+0:11        move second child to first child ( temp float)
+0:11          direct index ( temp float)
+0:11            direct index ( temp 2-component vector of float)
+0:11              direct index ( temp 2-element array of 2-component vector of float)
+0:?                 'clip' ( temp 3-element array of 2-element array of 2-component vector of float)
+0:11                Constant:
+0:11                  0 (const int)
+0:11              Constant:
+0:11                1 (const int)
+0:11            Constant:
+0:11              0 (const int)
+0:11          direct index ( in float ClipDistance)
+0:11            direct index ( in 4-element array of float ClipDistance)
+0:?               'clip' ( in 3-element array of 4-element array of float ClipDistance)
+0:11              Constant:
+0:11                0 (const int)
+0:11            Constant:
+0:11              2 (const int)
+0:11        move second child to first child ( temp float)
+0:11          direct index ( temp float)
+0:11            direct index ( temp 2-component vector of float)
+0:11              direct index ( temp 2-element array of 2-component vector of float)
+0:?                 'clip' ( temp 3-element array of 2-element array of 2-component vector of float)
+0:11                Constant:
+0:11                  0 (const int)
+0:11              Constant:
+0:11                1 (const int)
+0:11            Constant:
+0:11              1 (const int)
+0:11          direct index ( in float ClipDistance)
+0:11            direct index ( in 4-element array of float ClipDistance)
+0:?               'clip' ( in 3-element array of 4-element array of float ClipDistance)
+0:11              Constant:
+0:11                0 (const int)
+0:11            Constant:
+0:11              3 (const int)
+0:11        move second child to first child ( temp float)
+0:11          direct index ( temp float)
+0:11            direct index ( temp 2-component vector of float)
+0:11              direct index ( temp 2-element array of 2-component vector of float)
+0:?                 'clip' ( temp 3-element array of 2-element array of 2-component vector of float)
+0:11                Constant:
+0:11                  1 (const int)
+0:11              Constant:
+0:11                0 (const int)
+0:11            Constant:
+0:11              0 (const int)
+0:11          direct index ( in float ClipDistance)
+0:11            direct index ( in 4-element array of float ClipDistance)
+0:?               'clip' ( in 3-element array of 4-element array of float ClipDistance)
+0:11              Constant:
+0:11                1 (const int)
+0:11            Constant:
+0:11              0 (const int)
+0:11        move second child to first child ( temp float)
+0:11          direct index ( temp float)
+0:11            direct index ( temp 2-component vector of float)
+0:11              direct index ( temp 2-element array of 2-component vector of float)
+0:?                 'clip' ( temp 3-element array of 2-element array of 2-component vector of float)
+0:11                Constant:
+0:11                  1 (const int)
+0:11              Constant:
+0:11                0 (const int)
+0:11            Constant:
+0:11              1 (const int)
+0:11          direct index ( in float ClipDistance)
+0:11            direct index ( in 4-element array of float ClipDistance)
+0:?               'clip' ( in 3-element array of 4-element array of float ClipDistance)
+0:11              Constant:
+0:11                1 (const int)
+0:11            Constant:
+0:11              1 (const int)
+0:11        move second child to first child ( temp float)
+0:11          direct index ( temp float)
+0:11            direct index ( temp 2-component vector of float)
+0:11              direct index ( temp 2-element array of 2-component vector of float)
+0:?                 'clip' ( temp 3-element array of 2-element array of 2-component vector of float)
+0:11                Constant:
+0:11                  1 (const int)
+0:11              Constant:
+0:11                1 (const int)
+0:11            Constant:
+0:11              0 (const int)
+0:11          direct index ( in float ClipDistance)
+0:11            direct index ( in 4-element array of float ClipDistance)
+0:?               'clip' ( in 3-element array of 4-element array of float ClipDistance)
+0:11              Constant:
+0:11                1 (const int)
+0:11            Constant:
+0:11              2 (const int)
+0:11        move second child to first child ( temp float)
+0:11          direct index ( temp float)
+0:11            direct index ( temp 2-component vector of float)
+0:11              direct index ( temp 2-element array of 2-component vector of float)
+0:?                 'clip' ( temp 3-element array of 2-element array of 2-component vector of float)
+0:11                Constant:
+0:11                  1 (const int)
+0:11              Constant:
+0:11                1 (const int)
+0:11            Constant:
+0:11              1 (const int)
+0:11          direct index ( in float ClipDistance)
+0:11            direct index ( in 4-element array of float ClipDistance)
+0:?               'clip' ( in 3-element array of 4-element array of float ClipDistance)
+0:11              Constant:
+0:11                1 (const int)
+0:11            Constant:
+0:11              3 (const int)
+0:11        move second child to first child ( temp float)
+0:11          direct index ( temp float)
+0:11            direct index ( temp 2-component vector of float)
+0:11              direct index ( temp 2-element array of 2-component vector of float)
+0:?                 'clip' ( temp 3-element array of 2-element array of 2-component vector of float)
+0:11                Constant:
+0:11                  2 (const int)
+0:11              Constant:
+0:11                0 (const int)
+0:11            Constant:
+0:11              0 (const int)
+0:11          direct index ( in float ClipDistance)
+0:11            direct index ( in 4-element array of float ClipDistance)
+0:?               'clip' ( in 3-element array of 4-element array of float ClipDistance)
+0:11              Constant:
+0:11                2 (const int)
+0:11            Constant:
+0:11              0 (const int)
+0:11        move second child to first child ( temp float)
+0:11          direct index ( temp float)
+0:11            direct index ( temp 2-component vector of float)
+0:11              direct index ( temp 2-element array of 2-component vector of float)
+0:?                 'clip' ( temp 3-element array of 2-element array of 2-component vector of float)
+0:11                Constant:
+0:11                  2 (const int)
+0:11              Constant:
+0:11                0 (const int)
+0:11            Constant:
+0:11              1 (const int)
+0:11          direct index ( in float ClipDistance)
+0:11            direct index ( in 4-element array of float ClipDistance)
+0:?               'clip' ( in 3-element array of 4-element array of float ClipDistance)
+0:11              Constant:
+0:11                2 (const int)
+0:11            Constant:
+0:11              1 (const int)
+0:11        move second child to first child ( temp float)
+0:11          direct index ( temp float)
+0:11            direct index ( temp 2-component vector of float)
+0:11              direct index ( temp 2-element array of 2-component vector of float)
+0:?                 'clip' ( temp 3-element array of 2-element array of 2-component vector of float)
+0:11                Constant:
+0:11                  2 (const int)
+0:11              Constant:
+0:11                1 (const int)
+0:11            Constant:
+0:11              0 (const int)
+0:11          direct index ( in float ClipDistance)
+0:11            direct index ( in 4-element array of float ClipDistance)
+0:?               'clip' ( in 3-element array of 4-element array of float ClipDistance)
+0:11              Constant:
+0:11                2 (const int)
+0:11            Constant:
+0:11              2 (const int)
+0:11        move second child to first child ( temp float)
+0:11          direct index ( temp float)
+0:11            direct index ( temp 2-component vector of float)
+0:11              direct index ( temp 2-element array of 2-component vector of float)
+0:?                 'clip' ( temp 3-element array of 2-element array of 2-component vector of float)
+0:11                Constant:
+0:11                  2 (const int)
+0:11              Constant:
+0:11                1 (const int)
+0:11            Constant:
+0:11              1 (const int)
+0:11          direct index ( in float ClipDistance)
+0:11            direct index ( in 4-element array of float ClipDistance)
+0:?               'clip' ( in 3-element array of 4-element array of float ClipDistance)
+0:11              Constant:
+0:11                2 (const int)
+0:11            Constant:
+0:11              3 (const int)
+0:11      Function Call: @main(vf4[3];u1[3];struct-S-vf4-vf2[2]1;vf2[3][2]; ( temp void)
+0:?         'pos' ( temp 3-element array of 4-component vector of float)
+0:?         'VertexID' ( temp 3-element array of uint)
+0:?         'OutputStream' ( temp structure{ temp 4-component vector of float pos,  temp 2-element array of 2-component vector of float clip})
+0:?         'clip' ( temp 3-element array of 2-element array of 2-component vector of float)
+0:?   Linker Objects
+0:?     'pos' ( in 3-element array of 4-component vector of float Position)
+0:?     'VertexID' (layout( location=0) in 3-element array of uint)
+0:?     'OutputStream.pos' ( out 4-component vector of float Position)
+0:?     'clip' ( in 3-element array of 4-element array of float ClipDistance)
+0:?     'OutputStream.clip' ( out 4-element array of float ClipDistance)
+
+
+Linked geometry stage:
+
+
+Shader version: 500
+invocations = 1
+max_vertices = 3
+input primitive = triangles
+output primitive = line_strip
+0:? Sequence
+0:11  Function Definition: @main(vf4[3];u1[3];struct-S-vf4-vf2[2]1;vf2[3][2]; ( temp void)
+0:11    Function Parameters: 
+0:11      'pos' ( in 3-element array of 4-component vector of float)
+0:11      'VertexID' ( in 3-element array of uint)
+0:11      'OutputStream' ( out structure{ temp 4-component vector of float pos,  temp 2-element array of 2-component vector of float clip})
+0:11      'clip' ( in 3-element array of 2-element array of 2-component vector of float)
+0:?     Sequence
+0:14      move second child to first child ( temp 4-component vector of float)
+0:14        pos: direct index for structure ( temp 4-component vector of float)
+0:14          's' ( temp structure{ temp 4-component vector of float pos,  temp 2-element array of 2-component vector of float clip})
+0:14          Constant:
+0:14            0 (const int)
+0:14        direct index ( temp 4-component vector of float)
+0:14          'pos' ( in 3-element array of 4-component vector of float)
+0:14          Constant:
+0:14            0 (const int)
+0:15      move second child to first child ( temp 2-component vector of float)
+0:15        direct index ( temp 2-component vector of float)
+0:15          clip: direct index for structure ( temp 2-element array of 2-component vector of float)
+0:15            's' ( temp structure{ temp 4-component vector of float pos,  temp 2-element array of 2-component vector of float clip})
+0:15            Constant:
+0:15              1 (const int)
+0:15          Constant:
+0:15            0 (const int)
+0:15        direct index ( temp 2-component vector of float)
+0:15          direct index ( temp 2-element array of 2-component vector of float)
+0:15            'clip' ( in 3-element array of 2-element array of 2-component vector of float)
+0:15            Constant:
+0:15              0 (const int)
+0:15          Constant:
+0:15            0 (const int)
+0:16      move second child to first child ( temp 2-component vector of float)
+0:16        direct index ( temp 2-component vector of float)
+0:16          clip: direct index for structure ( temp 2-element array of 2-component vector of float)
+0:16            's' ( temp structure{ temp 4-component vector of float pos,  temp 2-element array of 2-component vector of float clip})
+0:16            Constant:
+0:16              1 (const int)
+0:16          Constant:
+0:16            1 (const int)
+0:16        direct index ( temp 2-component vector of float)
+0:16          direct index ( temp 2-element array of 2-component vector of float)
+0:16            'clip' ( in 3-element array of 2-element array of 2-component vector of float)
+0:16            Constant:
+0:16              0 (const int)
+0:16          Constant:
+0:16            1 (const int)
+0:18      Sequence
+0:18        Sequence
+0:18          move second child to first child ( temp 4-component vector of float)
+0:?             'OutputStream.pos' ( out 4-component vector of float Position)
+0:18            pos: direct index for structure ( temp 4-component vector of float)
+0:18              's' ( temp structure{ temp 4-component vector of float pos,  temp 2-element array of 2-component vector of float clip})
+0:18              Constant:
+0:18                0 (const int)
+0:?           Sequence
+0:18            move second child to first child ( temp float)
+0:18              direct index ( out float ClipDistance)
+0:?                 'OutputStream.clip' ( out 4-element array of float ClipDistance)
+0:18                Constant:
+0:18                  0 (const int)
+0:18              direct index ( temp float)
+0:18                direct index ( temp 2-component vector of float)
+0:18                  clip: direct index for structure ( temp 2-element array of 2-component vector of float)
+0:18                    's' ( temp structure{ temp 4-component vector of float pos,  temp 2-element array of 2-component vector of float clip})
+0:18                    Constant:
+0:18                      1 (const int)
+0:18                  Constant:
+0:18                    0 (const int)
+0:18                Constant:
+0:18                  0 (const int)
+0:18            move second child to first child ( temp float)
+0:18              direct index ( out float ClipDistance)
+0:?                 'OutputStream.clip' ( out 4-element array of float ClipDistance)
+0:18                Constant:
+0:18                  1 (const int)
+0:18              direct index ( temp float)
+0:18                direct index ( temp 2-component vector of float)
+0:18                  clip: direct index for structure ( temp 2-element array of 2-component vector of float)
+0:18                    's' ( temp structure{ temp 4-component vector of float pos,  temp 2-element array of 2-component vector of float clip})
+0:18                    Constant:
+0:18                      1 (const int)
+0:18                  Constant:
+0:18                    0 (const int)
+0:18                Constant:
+0:18                  1 (const int)
+0:18            move second child to first child ( temp float)
+0:18              direct index ( out float ClipDistance)
+0:?                 'OutputStream.clip' ( out 4-element array of float ClipDistance)
+0:18                Constant:
+0:18                  2 (const int)
+0:18              direct index ( temp float)
+0:18                direct index ( temp 2-component vector of float)
+0:18                  clip: direct index for structure ( temp 2-element array of 2-component vector of float)
+0:18                    's' ( temp structure{ temp 4-component vector of float pos,  temp 2-element array of 2-component vector of float clip})
+0:18                    Constant:
+0:18                      1 (const int)
+0:18                  Constant:
+0:18                    1 (const int)
+0:18                Constant:
+0:18                  0 (const int)
+0:18            move second child to first child ( temp float)
+0:18              direct index ( out float ClipDistance)
+0:?                 'OutputStream.clip' ( out 4-element array of float ClipDistance)
+0:18                Constant:
+0:18                  3 (const int)
+0:18              direct index ( temp float)
+0:18                direct index ( temp 2-component vector of float)
+0:18                  clip: direct index for structure ( temp 2-element array of 2-component vector of float)
+0:18                    's' ( temp structure{ temp 4-component vector of float pos,  temp 2-element array of 2-component vector of float clip})
+0:18                    Constant:
+0:18                      1 (const int)
+0:18                  Constant:
+0:18                    1 (const int)
+0:18                Constant:
+0:18                  1 (const int)
+0:18        EmitVertex ( temp void)
+0:11  Function Definition: main( ( temp void)
+0:11    Function Parameters: 
+0:?     Sequence
+0:11      move second child to first child ( temp 3-element array of 4-component vector of float)
+0:?         'pos' ( temp 3-element array of 4-component vector of float)
+0:?         'pos' ( in 3-element array of 4-component vector of float Position)
+0:11      move second child to first child ( temp 3-element array of uint)
+0:?         'VertexID' ( temp 3-element array of uint)
+0:?         'VertexID' (layout( location=0) in 3-element array of uint)
+0:?       Sequence
+0:11        move second child to first child ( temp float)
+0:11          direct index ( temp float)
+0:11            direct index ( temp 2-component vector of float)
+0:11              direct index ( temp 2-element array of 2-component vector of float)
+0:?                 'clip' ( temp 3-element array of 2-element array of 2-component vector of float)
+0:11                Constant:
+0:11                  0 (const int)
+0:11              Constant:
+0:11                0 (const int)
+0:11            Constant:
+0:11              0 (const int)
+0:11          direct index ( in float ClipDistance)
+0:11            direct index ( in 4-element array of float ClipDistance)
+0:?               'clip' ( in 3-element array of 4-element array of float ClipDistance)
+0:11              Constant:
+0:11                0 (const int)
+0:11            Constant:
+0:11              0 (const int)
+0:11        move second child to first child ( temp float)
+0:11          direct index ( temp float)
+0:11            direct index ( temp 2-component vector of float)
+0:11              direct index ( temp 2-element array of 2-component vector of float)
+0:?                 'clip' ( temp 3-element array of 2-element array of 2-component vector of float)
+0:11                Constant:
+0:11                  0 (const int)
+0:11              Constant:
+0:11                0 (const int)
+0:11            Constant:
+0:11              1 (const int)
+0:11          direct index ( in float ClipDistance)
+0:11            direct index ( in 4-element array of float ClipDistance)
+0:?               'clip' ( in 3-element array of 4-element array of float ClipDistance)
+0:11              Constant:
+0:11                0 (const int)
+0:11            Constant:
+0:11              1 (const int)
+0:11        move second child to first child ( temp float)
+0:11          direct index ( temp float)
+0:11            direct index ( temp 2-component vector of float)
+0:11              direct index ( temp 2-element array of 2-component vector of float)
+0:?                 'clip' ( temp 3-element array of 2-element array of 2-component vector of float)
+0:11                Constant:
+0:11                  0 (const int)
+0:11              Constant:
+0:11                1 (const int)
+0:11            Constant:
+0:11              0 (const int)
+0:11          direct index ( in float ClipDistance)
+0:11            direct index ( in 4-element array of float ClipDistance)
+0:?               'clip' ( in 3-element array of 4-element array of float ClipDistance)
+0:11              Constant:
+0:11                0 (const int)
+0:11            Constant:
+0:11              2 (const int)
+0:11        move second child to first child ( temp float)
+0:11          direct index ( temp float)
+0:11            direct index ( temp 2-component vector of float)
+0:11              direct index ( temp 2-element array of 2-component vector of float)
+0:?                 'clip' ( temp 3-element array of 2-element array of 2-component vector of float)
+0:11                Constant:
+0:11                  0 (const int)
+0:11              Constant:
+0:11                1 (const int)
+0:11            Constant:
+0:11              1 (const int)
+0:11          direct index ( in float ClipDistance)
+0:11            direct index ( in 4-element array of float ClipDistance)
+0:?               'clip' ( in 3-element array of 4-element array of float ClipDistance)
+0:11              Constant:
+0:11                0 (const int)
+0:11            Constant:
+0:11              3 (const int)
+0:11        move second child to first child ( temp float)
+0:11          direct index ( temp float)
+0:11            direct index ( temp 2-component vector of float)
+0:11              direct index ( temp 2-element array of 2-component vector of float)
+0:?                 'clip' ( temp 3-element array of 2-element array of 2-component vector of float)
+0:11                Constant:
+0:11                  1 (const int)
+0:11              Constant:
+0:11                0 (const int)
+0:11            Constant:
+0:11              0 (const int)
+0:11          direct index ( in float ClipDistance)
+0:11            direct index ( in 4-element array of float ClipDistance)
+0:?               'clip' ( in 3-element array of 4-element array of float ClipDistance)
+0:11              Constant:
+0:11                1 (const int)
+0:11            Constant:
+0:11              0 (const int)
+0:11        move second child to first child ( temp float)
+0:11          direct index ( temp float)
+0:11            direct index ( temp 2-component vector of float)
+0:11              direct index ( temp 2-element array of 2-component vector of float)
+0:?                 'clip' ( temp 3-element array of 2-element array of 2-component vector of float)
+0:11                Constant:
+0:11                  1 (const int)
+0:11              Constant:
+0:11                0 (const int)
+0:11            Constant:
+0:11              1 (const int)
+0:11          direct index ( in float ClipDistance)
+0:11            direct index ( in 4-element array of float ClipDistance)
+0:?               'clip' ( in 3-element array of 4-element array of float ClipDistance)
+0:11              Constant:
+0:11                1 (const int)
+0:11            Constant:
+0:11              1 (const int)
+0:11        move second child to first child ( temp float)
+0:11          direct index ( temp float)
+0:11            direct index ( temp 2-component vector of float)
+0:11              direct index ( temp 2-element array of 2-component vector of float)
+0:?                 'clip' ( temp 3-element array of 2-element array of 2-component vector of float)
+0:11                Constant:
+0:11                  1 (const int)
+0:11              Constant:
+0:11                1 (const int)
+0:11            Constant:
+0:11              0 (const int)
+0:11          direct index ( in float ClipDistance)
+0:11            direct index ( in 4-element array of float ClipDistance)
+0:?               'clip' ( in 3-element array of 4-element array of float ClipDistance)
+0:11              Constant:
+0:11                1 (const int)
+0:11            Constant:
+0:11              2 (const int)
+0:11        move second child to first child ( temp float)
+0:11          direct index ( temp float)
+0:11            direct index ( temp 2-component vector of float)
+0:11              direct index ( temp 2-element array of 2-component vector of float)
+0:?                 'clip' ( temp 3-element array of 2-element array of 2-component vector of float)
+0:11                Constant:
+0:11                  1 (const int)
+0:11              Constant:
+0:11                1 (const int)
+0:11            Constant:
+0:11              1 (const int)
+0:11          direct index ( in float ClipDistance)
+0:11            direct index ( in 4-element array of float ClipDistance)
+0:?               'clip' ( in 3-element array of 4-element array of float ClipDistance)
+0:11              Constant:
+0:11                1 (const int)
+0:11            Constant:
+0:11              3 (const int)
+0:11        move second child to first child ( temp float)
+0:11          direct index ( temp float)
+0:11            direct index ( temp 2-component vector of float)
+0:11              direct index ( temp 2-element array of 2-component vector of float)
+0:?                 'clip' ( temp 3-element array of 2-element array of 2-component vector of float)
+0:11                Constant:
+0:11                  2 (const int)
+0:11              Constant:
+0:11                0 (const int)
+0:11            Constant:
+0:11              0 (const int)
+0:11          direct index ( in float ClipDistance)
+0:11            direct index ( in 4-element array of float ClipDistance)
+0:?               'clip' ( in 3-element array of 4-element array of float ClipDistance)
+0:11              Constant:
+0:11                2 (const int)
+0:11            Constant:
+0:11              0 (const int)
+0:11        move second child to first child ( temp float)
+0:11          direct index ( temp float)
+0:11            direct index ( temp 2-component vector of float)
+0:11              direct index ( temp 2-element array of 2-component vector of float)
+0:?                 'clip' ( temp 3-element array of 2-element array of 2-component vector of float)
+0:11                Constant:
+0:11                  2 (const int)
+0:11              Constant:
+0:11                0 (const int)
+0:11            Constant:
+0:11              1 (const int)
+0:11          direct index ( in float ClipDistance)
+0:11            direct index ( in 4-element array of float ClipDistance)
+0:?               'clip' ( in 3-element array of 4-element array of float ClipDistance)
+0:11              Constant:
+0:11                2 (const int)
+0:11            Constant:
+0:11              1 (const int)
+0:11        move second child to first child ( temp float)
+0:11          direct index ( temp float)
+0:11            direct index ( temp 2-component vector of float)
+0:11              direct index ( temp 2-element array of 2-component vector of float)
+0:?                 'clip' ( temp 3-element array of 2-element array of 2-component vector of float)
+0:11                Constant:
+0:11                  2 (const int)
+0:11              Constant:
+0:11                1 (const int)
+0:11            Constant:
+0:11              0 (const int)
+0:11          direct index ( in float ClipDistance)
+0:11            direct index ( in 4-element array of float ClipDistance)
+0:?               'clip' ( in 3-element array of 4-element array of float ClipDistance)
+0:11              Constant:
+0:11                2 (const int)
+0:11            Constant:
+0:11              2 (const int)
+0:11        move second child to first child ( temp float)
+0:11          direct index ( temp float)
+0:11            direct index ( temp 2-component vector of float)
+0:11              direct index ( temp 2-element array of 2-component vector of float)
+0:?                 'clip' ( temp 3-element array of 2-element array of 2-component vector of float)
+0:11                Constant:
+0:11                  2 (const int)
+0:11              Constant:
+0:11                1 (const int)
+0:11            Constant:
+0:11              1 (const int)
+0:11          direct index ( in float ClipDistance)
+0:11            direct index ( in 4-element array of float ClipDistance)
+0:?               'clip' ( in 3-element array of 4-element array of float ClipDistance)
+0:11              Constant:
+0:11                2 (const int)
+0:11            Constant:
+0:11              3 (const int)
+0:11      Function Call: @main(vf4[3];u1[3];struct-S-vf4-vf2[2]1;vf2[3][2]; ( temp void)
+0:?         'pos' ( temp 3-element array of 4-component vector of float)
+0:?         'VertexID' ( temp 3-element array of uint)
+0:?         'OutputStream' ( temp structure{ temp 4-component vector of float pos,  temp 2-element array of 2-component vector of float clip})
+0:?         'clip' ( temp 3-element array of 2-element array of 2-component vector of float)
+0:?   Linker Objects
+0:?     'pos' ( in 3-element array of 4-component vector of float Position)
+0:?     'VertexID' (layout( location=0) in 3-element array of uint)
+0:?     'OutputStream.pos' ( out 4-component vector of float Position)
+0:?     'clip' ( in 3-element array of 4-element array of float ClipDistance)
+0:?     'OutputStream.clip' ( out 4-element array of float ClipDistance)
+
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 128
+
+                              Capability Geometry
+                              Capability ClipDistance
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Geometry 4  "main" 44 50 71 75 80
+                              ExecutionMode 4 Triangles
+                              ExecutionMode 4 Invocations 1
+                              ExecutionMode 4 OutputLineStrip
+                              ExecutionMode 4 OutputVertices 3
+                              Source HLSL 500
+                              Name 4  "main"
+                              Name 17  "S"
+                              MemberName 17(S) 0  "pos"
+                              MemberName 17(S) 1  "clip"
+                              Name 26  "@main(vf4[3];u1[3];struct-S-vf4-vf2[2]1;vf2[3][2];"
+                              Name 22  "pos"
+                              Name 23  "VertexID"
+                              Name 24  "OutputStream"
+                              Name 25  "clip"
+                              Name 28  "s"
+                              Name 44  "OutputStream.pos"
+                              Name 50  "OutputStream.clip"
+                              Name 69  "pos"
+                              Name 71  "pos"
+                              Name 73  "VertexID"
+                              Name 75  "VertexID"
+                              Name 77  "clip"
+                              Name 80  "clip"
+                              Name 118  "OutputStream"
+                              Name 119  "param"
+                              Name 121  "param"
+                              Name 123  "param"
+                              Name 124  "param"
+                              Decorate 44(OutputStream.pos) BuiltIn Position
+                              Decorate 50(OutputStream.clip) BuiltIn ClipDistance
+                              Decorate 71(pos) BuiltIn Position
+                              Decorate 75(VertexID) Location 0
+                              Decorate 80(clip) BuiltIn ClipDistance
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+               8:             TypeInt 32 0
+               9:      8(int) Constant 3
+              10:             TypeArray 7(fvec4) 9
+              11:             TypePointer Function 10
+              12:             TypeArray 8(int) 9
+              13:             TypePointer Function 12
+              14:             TypeVector 6(float) 2
+              15:      8(int) Constant 2
+              16:             TypeArray 14(fvec2) 15
+           17(S):             TypeStruct 7(fvec4) 16
+              18:             TypePointer Function 17(S)
+              19:             TypeArray 16 9
+              20:             TypePointer Function 19
+              21:             TypeFunction 2 11(ptr) 13(ptr) 18(ptr) 20(ptr)
+              29:             TypeInt 32 1
+              30:     29(int) Constant 0
+              31:             TypePointer Function 7(fvec4)
+              35:     29(int) Constant 1
+              36:             TypePointer Function 14(fvec2)
+              43:             TypePointer Output 7(fvec4)
+44(OutputStream.pos):     43(ptr) Variable Output
+              47:      8(int) Constant 4
+              48:             TypeArray 6(float) 47
+              49:             TypePointer Output 48
+50(OutputStream.clip):     49(ptr) Variable Output
+              51:      8(int) Constant 0
+              52:             TypePointer Function 6(float)
+              55:             TypePointer Output 6(float)
+              57:      8(int) Constant 1
+              61:     29(int) Constant 2
+              65:     29(int) Constant 3
+              70:             TypePointer Input 10
+         71(pos):     70(ptr) Variable Input
+              74:             TypePointer Input 12
+    75(VertexID):     74(ptr) Variable Input
+              78:             TypeArray 48 9
+              79:             TypePointer Input 78
+        80(clip):     79(ptr) Variable Input
+              81:             TypePointer Input 6(float)
+         4(main):           2 Function None 3
+               5:             Label
+         69(pos):     11(ptr) Variable Function
+    73(VertexID):     13(ptr) Variable Function
+        77(clip):     20(ptr) Variable Function
+118(OutputStream):     18(ptr) Variable Function
+      119(param):     11(ptr) Variable Function
+      121(param):     13(ptr) Variable Function
+      123(param):     18(ptr) Variable Function
+      124(param):     20(ptr) Variable Function
+              72:          10 Load 71(pos)
+                              Store 69(pos) 72
+              76:          12 Load 75(VertexID)
+                              Store 73(VertexID) 76
+              82:     81(ptr) AccessChain 80(clip) 30 30
+              83:    6(float) Load 82
+              84:     52(ptr) AccessChain 77(clip) 30 30 51
+                              Store 84 83
+              85:     81(ptr) AccessChain 80(clip) 30 35
+              86:    6(float) Load 85
+              87:     52(ptr) AccessChain 77(clip) 30 30 57
+                              Store 87 86
+              88:     81(ptr) AccessChain 80(clip) 30 61
+              89:    6(float) Load 88
+              90:     52(ptr) AccessChain 77(clip) 30 35 51
+                              Store 90 89
+              91:     81(ptr) AccessChain 80(clip) 30 65
+              92:    6(float) Load 91
+              93:     52(ptr) AccessChain 77(clip) 30 35 57
+                              Store 93 92
+              94:     81(ptr) AccessChain 80(clip) 35 30
+              95:    6(float) Load 94
+              96:     52(ptr) AccessChain 77(clip) 35 30 51
+                              Store 96 95
+              97:     81(ptr) AccessChain 80(clip) 35 35
+              98:    6(float) Load 97
+              99:     52(ptr) AccessChain 77(clip) 35 30 57
+                              Store 99 98
+             100:     81(ptr) AccessChain 80(clip) 35 61
+             101:    6(float) Load 100
+             102:     52(ptr) AccessChain 77(clip) 35 35 51
+                              Store 102 101
+             103:     81(ptr) AccessChain 80(clip) 35 65
+             104:    6(float) Load 103
+             105:     52(ptr) AccessChain 77(clip) 35 35 57
+                              Store 105 104
+             106:     81(ptr) AccessChain 80(clip) 61 30
+             107:    6(float) Load 106
+             108:     52(ptr) AccessChain 77(clip) 61 30 51
+                              Store 108 107
+             109:     81(ptr) AccessChain 80(clip) 61 35
+             110:    6(float) Load 109
+             111:     52(ptr) AccessChain 77(clip) 61 30 57
+                              Store 111 110
+             112:     81(ptr) AccessChain 80(clip) 61 61
+             113:    6(float) Load 112
+             114:     52(ptr) AccessChain 77(clip) 61 35 51
+                              Store 114 113
+             115:     81(ptr) AccessChain 80(clip) 61 65
+             116:    6(float) Load 115
+             117:     52(ptr) AccessChain 77(clip) 61 35 57
+                              Store 117 116
+             120:          10 Load 69(pos)
+                              Store 119(param) 120
+             122:          12 Load 73(VertexID)
+                              Store 121(param) 122
+             125:          19 Load 77(clip)
+                              Store 124(param) 125
+             126:           2 FunctionCall 26(@main(vf4[3];u1[3];struct-S-vf4-vf2[2]1;vf2[3][2];) 119(param) 121(param) 123(param) 124(param)
+             127:       17(S) Load 123(param)
+                              Store 118(OutputStream) 127
+                              Return
+                              FunctionEnd
+26(@main(vf4[3];u1[3];struct-S-vf4-vf2[2]1;vf2[3][2];):           2 Function None 21
+         22(pos):     11(ptr) FunctionParameter
+    23(VertexID):     13(ptr) FunctionParameter
+24(OutputStream):     18(ptr) FunctionParameter
+        25(clip):     20(ptr) FunctionParameter
+              27:             Label
+           28(s):     18(ptr) Variable Function
+              32:     31(ptr) AccessChain 22(pos) 30
+              33:    7(fvec4) Load 32
+              34:     31(ptr) AccessChain 28(s) 30
+                              Store 34 33
+              37:     36(ptr) AccessChain 25(clip) 30 30
+              38:   14(fvec2) Load 37
+              39:     36(ptr) AccessChain 28(s) 35 30
+                              Store 39 38
+              40:     36(ptr) AccessChain 25(clip) 30 35
+              41:   14(fvec2) Load 40
+              42:     36(ptr) AccessChain 28(s) 35 35
+                              Store 42 41
+              45:     31(ptr) AccessChain 28(s) 30
+              46:    7(fvec4) Load 45
+                              Store 44(OutputStream.pos) 46
+              53:     52(ptr) AccessChain 28(s) 35 30 51
+              54:    6(float) Load 53
+              56:     55(ptr) AccessChain 50(OutputStream.clip) 30
+                              Store 56 54
+              58:     52(ptr) AccessChain 28(s) 35 30 57
+              59:    6(float) Load 58
+              60:     55(ptr) AccessChain 50(OutputStream.clip) 35
+                              Store 60 59
+              62:     52(ptr) AccessChain 28(s) 35 35 51
+              63:    6(float) Load 62
+              64:     55(ptr) AccessChain 50(OutputStream.clip) 61
+                              Store 64 63
+              66:     52(ptr) AccessChain 28(s) 35 35 57
+              67:    6(float) Load 66
+              68:     55(ptr) AccessChain 50(OutputStream.clip) 65
+                              Store 68 67
+                              EmitVertex
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/hlsl.clipdistance-2.vert.out b/Test/baseResults/hlsl.clipdistance-2.vert.out
new file mode 100644
index 0000000..397a25d
--- /dev/null
+++ b/Test/baseResults/hlsl.clipdistance-2.vert.out
@@ -0,0 +1,561 @@
+hlsl.clipdistance-2.vert
+Shader version: 500
+0:? Sequence
+0:4  Function Definition: @main(vf4;vf2[2];vf2[2]; ( temp void)
+0:4    Function Parameters: 
+0:4      'pos' ( out 4-component vector of float)
+0:4      'clip' ( out 2-element array of 2-component vector of float)
+0:4      'cull' ( out 2-element array of 2-component vector of float)
+0:?     Sequence
+0:5      move second child to first child ( temp 4-component vector of float)
+0:5        'pos' ( out 4-component vector of float)
+0:5        Constant:
+0:5          1.000000
+0:5          1.000000
+0:5          1.000000
+0:5          1.000000
+0:6      move second child to first child ( temp float)
+0:6        direct index ( temp float)
+0:6          direct index ( temp 2-component vector of float)
+0:6            'clip' ( out 2-element array of 2-component vector of float)
+0:6            Constant:
+0:6              0 (const int)
+0:6          Constant:
+0:6            0 (const int)
+0:6        Constant:
+0:6          0.500000
+0:7      move second child to first child ( temp float)
+0:7        direct index ( temp float)
+0:7          direct index ( temp 2-component vector of float)
+0:7            'clip' ( out 2-element array of 2-component vector of float)
+0:7            Constant:
+0:7              0 (const int)
+0:7          Constant:
+0:7            1 (const int)
+0:7        Constant:
+0:7          0.600000
+0:8      move second child to first child ( temp float)
+0:8        direct index ( temp float)
+0:8          direct index ( temp 2-component vector of float)
+0:8            'clip' ( out 2-element array of 2-component vector of float)
+0:8            Constant:
+0:8              1 (const int)
+0:8          Constant:
+0:8            0 (const int)
+0:8        Constant:
+0:8          0.700000
+0:9      move second child to first child ( temp float)
+0:9        direct index ( temp float)
+0:9          direct index ( temp 2-component vector of float)
+0:9            'clip' ( out 2-element array of 2-component vector of float)
+0:9            Constant:
+0:9              1 (const int)
+0:9          Constant:
+0:9            1 (const int)
+0:9        Constant:
+0:9          0.800000
+0:11      move second child to first child ( temp float)
+0:11        direct index ( temp float)
+0:11          direct index ( temp 2-component vector of float)
+0:11            'cull' ( out 2-element array of 2-component vector of float)
+0:11            Constant:
+0:11              0 (const int)
+0:11          Constant:
+0:11            0 (const int)
+0:11        Constant:
+0:11          0.525000
+0:12      move second child to first child ( temp float)
+0:12        direct index ( temp float)
+0:12          direct index ( temp 2-component vector of float)
+0:12            'cull' ( out 2-element array of 2-component vector of float)
+0:12            Constant:
+0:12              0 (const int)
+0:12          Constant:
+0:12            1 (const int)
+0:12        Constant:
+0:12          0.625000
+0:13      move second child to first child ( temp float)
+0:13        direct index ( temp float)
+0:13          direct index ( temp 2-component vector of float)
+0:13            'cull' ( out 2-element array of 2-component vector of float)
+0:13            Constant:
+0:13              1 (const int)
+0:13          Constant:
+0:13            0 (const int)
+0:13        Constant:
+0:13          0.725000
+0:14      move second child to first child ( temp float)
+0:14        direct index ( temp float)
+0:14          direct index ( temp 2-component vector of float)
+0:14            'cull' ( out 2-element array of 2-component vector of float)
+0:14            Constant:
+0:14              1 (const int)
+0:14          Constant:
+0:14            1 (const int)
+0:14        Constant:
+0:14          0.825000
+0:4  Function Definition: main( ( temp void)
+0:4    Function Parameters: 
+0:?     Sequence
+0:4      Function Call: @main(vf4;vf2[2];vf2[2]; ( temp void)
+0:?         'pos' ( temp 4-component vector of float)
+0:?         'clip' ( temp 2-element array of 2-component vector of float)
+0:?         'cull' ( temp 2-element array of 2-component vector of float)
+0:4      move second child to first child ( temp 4-component vector of float)
+0:?         'pos' ( out 4-component vector of float Position)
+0:?         'pos' ( temp 4-component vector of float)
+0:?       Sequence
+0:4        move second child to first child ( temp float)
+0:4          direct index ( out float ClipDistance)
+0:?             'clip' ( out 4-element array of float ClipDistance)
+0:4            Constant:
+0:4              0 (const int)
+0:4          direct index ( temp float)
+0:4            direct index ( temp 2-component vector of float)
+0:?               'clip' ( temp 2-element array of 2-component vector of float)
+0:4              Constant:
+0:4                0 (const int)
+0:4            Constant:
+0:4              0 (const int)
+0:4        move second child to first child ( temp float)
+0:4          direct index ( out float ClipDistance)
+0:?             'clip' ( out 4-element array of float ClipDistance)
+0:4            Constant:
+0:4              1 (const int)
+0:4          direct index ( temp float)
+0:4            direct index ( temp 2-component vector of float)
+0:?               'clip' ( temp 2-element array of 2-component vector of float)
+0:4              Constant:
+0:4                0 (const int)
+0:4            Constant:
+0:4              1 (const int)
+0:4        move second child to first child ( temp float)
+0:4          direct index ( out float ClipDistance)
+0:?             'clip' ( out 4-element array of float ClipDistance)
+0:4            Constant:
+0:4              2 (const int)
+0:4          direct index ( temp float)
+0:4            direct index ( temp 2-component vector of float)
+0:?               'clip' ( temp 2-element array of 2-component vector of float)
+0:4              Constant:
+0:4                1 (const int)
+0:4            Constant:
+0:4              0 (const int)
+0:4        move second child to first child ( temp float)
+0:4          direct index ( out float ClipDistance)
+0:?             'clip' ( out 4-element array of float ClipDistance)
+0:4            Constant:
+0:4              3 (const int)
+0:4          direct index ( temp float)
+0:4            direct index ( temp 2-component vector of float)
+0:?               'clip' ( temp 2-element array of 2-component vector of float)
+0:4              Constant:
+0:4                1 (const int)
+0:4            Constant:
+0:4              1 (const int)
+0:?       Sequence
+0:4        move second child to first child ( temp float)
+0:4          direct index ( out float CullDistance)
+0:?             'cull' ( out 4-element array of float CullDistance)
+0:4            Constant:
+0:4              0 (const int)
+0:4          direct index ( temp float)
+0:4            direct index ( temp 2-component vector of float)
+0:?               'cull' ( temp 2-element array of 2-component vector of float)
+0:4              Constant:
+0:4                0 (const int)
+0:4            Constant:
+0:4              0 (const int)
+0:4        move second child to first child ( temp float)
+0:4          direct index ( out float CullDistance)
+0:?             'cull' ( out 4-element array of float CullDistance)
+0:4            Constant:
+0:4              1 (const int)
+0:4          direct index ( temp float)
+0:4            direct index ( temp 2-component vector of float)
+0:?               'cull' ( temp 2-element array of 2-component vector of float)
+0:4              Constant:
+0:4                0 (const int)
+0:4            Constant:
+0:4              1 (const int)
+0:4        move second child to first child ( temp float)
+0:4          direct index ( out float CullDistance)
+0:?             'cull' ( out 4-element array of float CullDistance)
+0:4            Constant:
+0:4              2 (const int)
+0:4          direct index ( temp float)
+0:4            direct index ( temp 2-component vector of float)
+0:?               'cull' ( temp 2-element array of 2-component vector of float)
+0:4              Constant:
+0:4                1 (const int)
+0:4            Constant:
+0:4              0 (const int)
+0:4        move second child to first child ( temp float)
+0:4          direct index ( out float CullDistance)
+0:?             'cull' ( out 4-element array of float CullDistance)
+0:4            Constant:
+0:4              3 (const int)
+0:4          direct index ( temp float)
+0:4            direct index ( temp 2-component vector of float)
+0:?               'cull' ( temp 2-element array of 2-component vector of float)
+0:4              Constant:
+0:4                1 (const int)
+0:4            Constant:
+0:4              1 (const int)
+0:?   Linker Objects
+0:?     'pos' ( out 4-component vector of float Position)
+0:?     'clip' ( out 4-element array of float ClipDistance)
+0:?     'cull' ( out 4-element array of float CullDistance)
+
+
+Linked vertex stage:
+
+
+Shader version: 500
+0:? Sequence
+0:4  Function Definition: @main(vf4;vf2[2];vf2[2]; ( temp void)
+0:4    Function Parameters: 
+0:4      'pos' ( out 4-component vector of float)
+0:4      'clip' ( out 2-element array of 2-component vector of float)
+0:4      'cull' ( out 2-element array of 2-component vector of float)
+0:?     Sequence
+0:5      move second child to first child ( temp 4-component vector of float)
+0:5        'pos' ( out 4-component vector of float)
+0:5        Constant:
+0:5          1.000000
+0:5          1.000000
+0:5          1.000000
+0:5          1.000000
+0:6      move second child to first child ( temp float)
+0:6        direct index ( temp float)
+0:6          direct index ( temp 2-component vector of float)
+0:6            'clip' ( out 2-element array of 2-component vector of float)
+0:6            Constant:
+0:6              0 (const int)
+0:6          Constant:
+0:6            0 (const int)
+0:6        Constant:
+0:6          0.500000
+0:7      move second child to first child ( temp float)
+0:7        direct index ( temp float)
+0:7          direct index ( temp 2-component vector of float)
+0:7            'clip' ( out 2-element array of 2-component vector of float)
+0:7            Constant:
+0:7              0 (const int)
+0:7          Constant:
+0:7            1 (const int)
+0:7        Constant:
+0:7          0.600000
+0:8      move second child to first child ( temp float)
+0:8        direct index ( temp float)
+0:8          direct index ( temp 2-component vector of float)
+0:8            'clip' ( out 2-element array of 2-component vector of float)
+0:8            Constant:
+0:8              1 (const int)
+0:8          Constant:
+0:8            0 (const int)
+0:8        Constant:
+0:8          0.700000
+0:9      move second child to first child ( temp float)
+0:9        direct index ( temp float)
+0:9          direct index ( temp 2-component vector of float)
+0:9            'clip' ( out 2-element array of 2-component vector of float)
+0:9            Constant:
+0:9              1 (const int)
+0:9          Constant:
+0:9            1 (const int)
+0:9        Constant:
+0:9          0.800000
+0:11      move second child to first child ( temp float)
+0:11        direct index ( temp float)
+0:11          direct index ( temp 2-component vector of float)
+0:11            'cull' ( out 2-element array of 2-component vector of float)
+0:11            Constant:
+0:11              0 (const int)
+0:11          Constant:
+0:11            0 (const int)
+0:11        Constant:
+0:11          0.525000
+0:12      move second child to first child ( temp float)
+0:12        direct index ( temp float)
+0:12          direct index ( temp 2-component vector of float)
+0:12            'cull' ( out 2-element array of 2-component vector of float)
+0:12            Constant:
+0:12              0 (const int)
+0:12          Constant:
+0:12            1 (const int)
+0:12        Constant:
+0:12          0.625000
+0:13      move second child to first child ( temp float)
+0:13        direct index ( temp float)
+0:13          direct index ( temp 2-component vector of float)
+0:13            'cull' ( out 2-element array of 2-component vector of float)
+0:13            Constant:
+0:13              1 (const int)
+0:13          Constant:
+0:13            0 (const int)
+0:13        Constant:
+0:13          0.725000
+0:14      move second child to first child ( temp float)
+0:14        direct index ( temp float)
+0:14          direct index ( temp 2-component vector of float)
+0:14            'cull' ( out 2-element array of 2-component vector of float)
+0:14            Constant:
+0:14              1 (const int)
+0:14          Constant:
+0:14            1 (const int)
+0:14        Constant:
+0:14          0.825000
+0:4  Function Definition: main( ( temp void)
+0:4    Function Parameters: 
+0:?     Sequence
+0:4      Function Call: @main(vf4;vf2[2];vf2[2]; ( temp void)
+0:?         'pos' ( temp 4-component vector of float)
+0:?         'clip' ( temp 2-element array of 2-component vector of float)
+0:?         'cull' ( temp 2-element array of 2-component vector of float)
+0:4      move second child to first child ( temp 4-component vector of float)
+0:?         'pos' ( out 4-component vector of float Position)
+0:?         'pos' ( temp 4-component vector of float)
+0:?       Sequence
+0:4        move second child to first child ( temp float)
+0:4          direct index ( out float ClipDistance)
+0:?             'clip' ( out 4-element array of float ClipDistance)
+0:4            Constant:
+0:4              0 (const int)
+0:4          direct index ( temp float)
+0:4            direct index ( temp 2-component vector of float)
+0:?               'clip' ( temp 2-element array of 2-component vector of float)
+0:4              Constant:
+0:4                0 (const int)
+0:4            Constant:
+0:4              0 (const int)
+0:4        move second child to first child ( temp float)
+0:4          direct index ( out float ClipDistance)
+0:?             'clip' ( out 4-element array of float ClipDistance)
+0:4            Constant:
+0:4              1 (const int)
+0:4          direct index ( temp float)
+0:4            direct index ( temp 2-component vector of float)
+0:?               'clip' ( temp 2-element array of 2-component vector of float)
+0:4              Constant:
+0:4                0 (const int)
+0:4            Constant:
+0:4              1 (const int)
+0:4        move second child to first child ( temp float)
+0:4          direct index ( out float ClipDistance)
+0:?             'clip' ( out 4-element array of float ClipDistance)
+0:4            Constant:
+0:4              2 (const int)
+0:4          direct index ( temp float)
+0:4            direct index ( temp 2-component vector of float)
+0:?               'clip' ( temp 2-element array of 2-component vector of float)
+0:4              Constant:
+0:4                1 (const int)
+0:4            Constant:
+0:4              0 (const int)
+0:4        move second child to first child ( temp float)
+0:4          direct index ( out float ClipDistance)
+0:?             'clip' ( out 4-element array of float ClipDistance)
+0:4            Constant:
+0:4              3 (const int)
+0:4          direct index ( temp float)
+0:4            direct index ( temp 2-component vector of float)
+0:?               'clip' ( temp 2-element array of 2-component vector of float)
+0:4              Constant:
+0:4                1 (const int)
+0:4            Constant:
+0:4              1 (const int)
+0:?       Sequence
+0:4        move second child to first child ( temp float)
+0:4          direct index ( out float CullDistance)
+0:?             'cull' ( out 4-element array of float CullDistance)
+0:4            Constant:
+0:4              0 (const int)
+0:4          direct index ( temp float)
+0:4            direct index ( temp 2-component vector of float)
+0:?               'cull' ( temp 2-element array of 2-component vector of float)
+0:4              Constant:
+0:4                0 (const int)
+0:4            Constant:
+0:4              0 (const int)
+0:4        move second child to first child ( temp float)
+0:4          direct index ( out float CullDistance)
+0:?             'cull' ( out 4-element array of float CullDistance)
+0:4            Constant:
+0:4              1 (const int)
+0:4          direct index ( temp float)
+0:4            direct index ( temp 2-component vector of float)
+0:?               'cull' ( temp 2-element array of 2-component vector of float)
+0:4              Constant:
+0:4                0 (const int)
+0:4            Constant:
+0:4              1 (const int)
+0:4        move second child to first child ( temp float)
+0:4          direct index ( out float CullDistance)
+0:?             'cull' ( out 4-element array of float CullDistance)
+0:4            Constant:
+0:4              2 (const int)
+0:4          direct index ( temp float)
+0:4            direct index ( temp 2-component vector of float)
+0:?               'cull' ( temp 2-element array of 2-component vector of float)
+0:4              Constant:
+0:4                1 (const int)
+0:4            Constant:
+0:4              0 (const int)
+0:4        move second child to first child ( temp float)
+0:4          direct index ( out float CullDistance)
+0:?             'cull' ( out 4-element array of float CullDistance)
+0:4            Constant:
+0:4              3 (const int)
+0:4          direct index ( temp float)
+0:4            direct index ( temp 2-component vector of float)
+0:?               'cull' ( temp 2-element array of 2-component vector of float)
+0:4              Constant:
+0:4                1 (const int)
+0:4            Constant:
+0:4              1 (const int)
+0:?   Linker Objects
+0:?     'pos' ( out 4-component vector of float Position)
+0:?     'clip' ( out 4-element array of float ClipDistance)
+0:?     'cull' ( out 4-element array of float CullDistance)
+
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 89
+
+                              Capability Shader
+                              Capability ClipDistance
+                              Capability CullDistance
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Vertex 4  "main" 55 60 76
+                              Source HLSL 500
+                              Name 4  "main"
+                              Name 18  "@main(vf4;vf2[2];vf2[2];"
+                              Name 15  "pos"
+                              Name 16  "clip"
+                              Name 17  "cull"
+                              Name 44  "pos"
+                              Name 45  "clip"
+                              Name 46  "cull"
+                              Name 47  "param"
+                              Name 48  "param"
+                              Name 49  "param"
+                              Name 55  "pos"
+                              Name 60  "clip"
+                              Name 76  "cull"
+                              Decorate 55(pos) BuiltIn Position
+                              Decorate 60(clip) BuiltIn ClipDistance
+                              Decorate 76(cull) BuiltIn CullDistance
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+               8:             TypePointer Function 7(fvec4)
+               9:             TypeVector 6(float) 2
+              10:             TypeInt 32 0
+              11:     10(int) Constant 2
+              12:             TypeArray 9(fvec2) 11
+              13:             TypePointer Function 12
+              14:             TypeFunction 2 8(ptr) 13(ptr) 13(ptr)
+              20:    6(float) Constant 1065353216
+              21:    7(fvec4) ConstantComposite 20 20 20 20
+              22:             TypeInt 32 1
+              23:     22(int) Constant 0
+              24:    6(float) Constant 1056964608
+              25:     10(int) Constant 0
+              26:             TypePointer Function 6(float)
+              28:    6(float) Constant 1058642330
+              29:     10(int) Constant 1
+              31:     22(int) Constant 1
+              32:    6(float) Constant 1060320051
+              34:    6(float) Constant 1061997773
+              36:    6(float) Constant 1057384038
+              38:    6(float) Constant 1059061760
+              40:    6(float) Constant 1060739482
+              42:    6(float) Constant 1062417203
+              54:             TypePointer Output 7(fvec4)
+         55(pos):     54(ptr) Variable Output
+              57:     10(int) Constant 4
+              58:             TypeArray 6(float) 57
+              59:             TypePointer Output 58
+        60(clip):     59(ptr) Variable Output
+              63:             TypePointer Output 6(float)
+              68:     22(int) Constant 2
+              72:     22(int) Constant 3
+        76(cull):     59(ptr) Variable Output
+         4(main):           2 Function None 3
+               5:             Label
+         44(pos):      8(ptr) Variable Function
+        45(clip):     13(ptr) Variable Function
+        46(cull):     13(ptr) Variable Function
+       47(param):      8(ptr) Variable Function
+       48(param):     13(ptr) Variable Function
+       49(param):     13(ptr) Variable Function
+              50:           2 FunctionCall 18(@main(vf4;vf2[2];vf2[2];) 47(param) 48(param) 49(param)
+              51:    7(fvec4) Load 47(param)
+                              Store 44(pos) 51
+              52:          12 Load 48(param)
+                              Store 45(clip) 52
+              53:          12 Load 49(param)
+                              Store 46(cull) 53
+              56:    7(fvec4) Load 44(pos)
+                              Store 55(pos) 56
+              61:     26(ptr) AccessChain 45(clip) 23 25
+              62:    6(float) Load 61
+              64:     63(ptr) AccessChain 60(clip) 23
+                              Store 64 62
+              65:     26(ptr) AccessChain 45(clip) 23 29
+              66:    6(float) Load 65
+              67:     63(ptr) AccessChain 60(clip) 31
+                              Store 67 66
+              69:     26(ptr) AccessChain 45(clip) 31 25
+              70:    6(float) Load 69
+              71:     63(ptr) AccessChain 60(clip) 68
+                              Store 71 70
+              73:     26(ptr) AccessChain 45(clip) 31 29
+              74:    6(float) Load 73
+              75:     63(ptr) AccessChain 60(clip) 72
+                              Store 75 74
+              77:     26(ptr) AccessChain 46(cull) 23 25
+              78:    6(float) Load 77
+              79:     63(ptr) AccessChain 76(cull) 23
+                              Store 79 78
+              80:     26(ptr) AccessChain 46(cull) 23 29
+              81:    6(float) Load 80
+              82:     63(ptr) AccessChain 76(cull) 31
+                              Store 82 81
+              83:     26(ptr) AccessChain 46(cull) 31 25
+              84:    6(float) Load 83
+              85:     63(ptr) AccessChain 76(cull) 68
+                              Store 85 84
+              86:     26(ptr) AccessChain 46(cull) 31 29
+              87:    6(float) Load 86
+              88:     63(ptr) AccessChain 76(cull) 72
+                              Store 88 87
+                              Return
+                              FunctionEnd
+18(@main(vf4;vf2[2];vf2[2];):           2 Function None 14
+         15(pos):      8(ptr) FunctionParameter
+        16(clip):     13(ptr) FunctionParameter
+        17(cull):     13(ptr) FunctionParameter
+              19:             Label
+                              Store 15(pos) 21
+              27:     26(ptr) AccessChain 16(clip) 23 25
+                              Store 27 24
+              30:     26(ptr) AccessChain 16(clip) 23 29
+                              Store 30 28
+              33:     26(ptr) AccessChain 16(clip) 31 25
+                              Store 33 32
+              35:     26(ptr) AccessChain 16(clip) 31 29
+                              Store 35 34
+              37:     26(ptr) AccessChain 17(cull) 23 25
+                              Store 37 36
+              39:     26(ptr) AccessChain 17(cull) 23 29
+                              Store 39 38
+              41:     26(ptr) AccessChain 17(cull) 31 25
+                              Store 41 40
+              43:     26(ptr) AccessChain 17(cull) 31 29
+                              Store 43 42
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/hlsl.clipdistance-3.frag.out b/Test/baseResults/hlsl.clipdistance-3.frag.out
new file mode 100644
index 0000000..3b5082e
--- /dev/null
+++ b/Test/baseResults/hlsl.clipdistance-3.frag.out
@@ -0,0 +1,190 @@
+hlsl.clipdistance-3.frag
+Shader version: 500
+gl_FragCoord origin is upper left
+0:? Sequence
+0:4  Function Definition: @main(vf4;f1[2];f1[2]; ( temp 4-component vector of float)
+0:4    Function Parameters: 
+0:4      'pos' ( in 4-component vector of float)
+0:4      'clip' ( in 2-element array of float)
+0:4      'cull' ( in 2-element array of float)
+0:?     Sequence
+0:5      Branch: Return with expression
+0:5        add ( temp 4-component vector of float)
+0:5          add ( temp 4-component vector of float)
+0:5            'pos' ( in 4-component vector of float)
+0:5            direct index ( temp float)
+0:5              'clip' ( in 2-element array of float)
+0:5              Constant:
+0:5                0 (const int)
+0:5          direct index ( temp float)
+0:5            'cull' ( in 2-element array of float)
+0:5            Constant:
+0:5              0 (const int)
+0:4  Function Definition: main( ( temp void)
+0:4    Function Parameters: 
+0:?     Sequence
+0:4      move second child to first child ( temp 4-component vector of float)
+0:?         'pos' ( temp 4-component vector of float)
+0:?         'pos' ( in 4-component vector of float FragCoord)
+0:?       Sequence
+0:4        move second child to first child ( temp 2-element array of float)
+0:?           'clip' ( temp 2-element array of float)
+0:?           'clip' ( in 2-element array of float ClipDistance)
+0:?       Sequence
+0:4        move second child to first child ( temp 2-element array of float)
+0:?           'cull' ( temp 2-element array of float)
+0:?           'cull' ( in 2-element array of float CullDistance)
+0:4      move second child to first child ( temp 4-component vector of float)
+0:?         '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+0:4        Function Call: @main(vf4;f1[2];f1[2]; ( temp 4-component vector of float)
+0:?           'pos' ( temp 4-component vector of float)
+0:?           'clip' ( temp 2-element array of float)
+0:?           'cull' ( temp 2-element array of float)
+0:?   Linker Objects
+0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+0:?     'pos' ( in 4-component vector of float FragCoord)
+0:?     'clip' ( in 2-element array of float ClipDistance)
+0:?     'cull' ( in 2-element array of float CullDistance)
+
+
+Linked fragment stage:
+
+
+Shader version: 500
+gl_FragCoord origin is upper left
+0:? Sequence
+0:4  Function Definition: @main(vf4;f1[2];f1[2]; ( temp 4-component vector of float)
+0:4    Function Parameters: 
+0:4      'pos' ( in 4-component vector of float)
+0:4      'clip' ( in 2-element array of float)
+0:4      'cull' ( in 2-element array of float)
+0:?     Sequence
+0:5      Branch: Return with expression
+0:5        add ( temp 4-component vector of float)
+0:5          add ( temp 4-component vector of float)
+0:5            'pos' ( in 4-component vector of float)
+0:5            direct index ( temp float)
+0:5              'clip' ( in 2-element array of float)
+0:5              Constant:
+0:5                0 (const int)
+0:5          direct index ( temp float)
+0:5            'cull' ( in 2-element array of float)
+0:5            Constant:
+0:5              0 (const int)
+0:4  Function Definition: main( ( temp void)
+0:4    Function Parameters: 
+0:?     Sequence
+0:4      move second child to first child ( temp 4-component vector of float)
+0:?         'pos' ( temp 4-component vector of float)
+0:?         'pos' ( in 4-component vector of float FragCoord)
+0:?       Sequence
+0:4        move second child to first child ( temp 2-element array of float)
+0:?           'clip' ( temp 2-element array of float)
+0:?           'clip' ( in 2-element array of float ClipDistance)
+0:?       Sequence
+0:4        move second child to first child ( temp 2-element array of float)
+0:?           'cull' ( temp 2-element array of float)
+0:?           'cull' ( in 2-element array of float CullDistance)
+0:4      move second child to first child ( temp 4-component vector of float)
+0:?         '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+0:4        Function Call: @main(vf4;f1[2];f1[2]; ( temp 4-component vector of float)
+0:?           'pos' ( temp 4-component vector of float)
+0:?           'clip' ( temp 2-element array of float)
+0:?           'cull' ( temp 2-element array of float)
+0:?   Linker Objects
+0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+0:?     'pos' ( in 4-component vector of float FragCoord)
+0:?     'clip' ( in 2-element array of float ClipDistance)
+0:?     'cull' ( in 2-element array of float CullDistance)
+
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 53
+
+                              Capability Shader
+                              Capability ClipDistance
+                              Capability CullDistance
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 35 39 42 45
+                              ExecutionMode 4 OriginUpperLeft
+                              Source HLSL 500
+                              Name 4  "main"
+                              Name 17  "@main(vf4;f1[2];f1[2];"
+                              Name 14  "pos"
+                              Name 15  "clip"
+                              Name 16  "cull"
+                              Name 33  "pos"
+                              Name 35  "pos"
+                              Name 37  "clip"
+                              Name 39  "clip"
+                              Name 41  "cull"
+                              Name 42  "cull"
+                              Name 45  "@entryPointOutput"
+                              Name 46  "param"
+                              Name 48  "param"
+                              Name 50  "param"
+                              Decorate 35(pos) BuiltIn FragCoord
+                              Decorate 39(clip) BuiltIn ClipDistance
+                              Decorate 42(cull) BuiltIn CullDistance
+                              Decorate 45(@entryPointOutput) Location 0
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+               8:             TypePointer Function 7(fvec4)
+               9:             TypeInt 32 0
+              10:      9(int) Constant 2
+              11:             TypeArray 6(float) 10
+              12:             TypePointer Function 11
+              13:             TypeFunction 7(fvec4) 8(ptr) 12(ptr) 12(ptr)
+              20:             TypeInt 32 1
+              21:     20(int) Constant 0
+              22:             TypePointer Function 6(float)
+              34:             TypePointer Input 7(fvec4)
+         35(pos):     34(ptr) Variable Input
+              38:             TypePointer Input 11
+        39(clip):     38(ptr) Variable Input
+        42(cull):     38(ptr) Variable Input
+              44:             TypePointer Output 7(fvec4)
+45(@entryPointOutput):     44(ptr) Variable Output
+         4(main):           2 Function None 3
+               5:             Label
+         33(pos):      8(ptr) Variable Function
+        37(clip):     12(ptr) Variable Function
+        41(cull):     12(ptr) Variable Function
+       46(param):      8(ptr) Variable Function
+       48(param):     12(ptr) Variable Function
+       50(param):     12(ptr) Variable Function
+              36:    7(fvec4) Load 35(pos)
+                              Store 33(pos) 36
+              40:          11 Load 39(clip)
+                              Store 37(clip) 40
+              43:          11 Load 42(cull)
+                              Store 41(cull) 43
+              47:    7(fvec4) Load 33(pos)
+                              Store 46(param) 47
+              49:          11 Load 37(clip)
+                              Store 48(param) 49
+              51:          11 Load 41(cull)
+                              Store 50(param) 51
+              52:    7(fvec4) FunctionCall 17(@main(vf4;f1[2];f1[2];) 46(param) 48(param) 50(param)
+                              Store 45(@entryPointOutput) 52
+                              Return
+                              FunctionEnd
+17(@main(vf4;f1[2];f1[2];):    7(fvec4) Function None 13
+         14(pos):      8(ptr) FunctionParameter
+        15(clip):     12(ptr) FunctionParameter
+        16(cull):     12(ptr) FunctionParameter
+              18:             Label
+              19:    7(fvec4) Load 14(pos)
+              23:     22(ptr) AccessChain 15(clip) 21
+              24:    6(float) Load 23
+              25:    7(fvec4) CompositeConstruct 24 24 24 24
+              26:    7(fvec4) FAdd 19 25
+              27:     22(ptr) AccessChain 16(cull) 21
+              28:    6(float) Load 27
+              29:    7(fvec4) CompositeConstruct 28 28 28 28
+              30:    7(fvec4) FAdd 26 29
+                              ReturnValue 30
+                              FunctionEnd
diff --git a/Test/baseResults/hlsl.clipdistance-3.geom.out b/Test/baseResults/hlsl.clipdistance-3.geom.out
new file mode 100644
index 0000000..f8ba5c6
--- /dev/null
+++ b/Test/baseResults/hlsl.clipdistance-3.geom.out
@@ -0,0 +1,830 @@
+hlsl.clipdistance-3.geom
+Shader version: 500
+invocations = -1
+max_vertices = 3
+input primitive = triangles
+output primitive = line_strip
+0:? Sequence
+0:12  Function Definition: @main(vf4[3];u1[3];struct-S-vf4-vf2-vf21;vf4[3]; ( temp void)
+0:12    Function Parameters: 
+0:12      'pos' ( in 3-element array of 4-component vector of float)
+0:12      'VertexID' ( in 3-element array of uint)
+0:12      'OutputStream' ( out structure{ temp 4-component vector of float pos,  temp 2-component vector of float clip0,  temp 2-component vector of float clip1})
+0:12      'clip' ( in 3-element array of 4-component vector of float)
+0:?     Sequence
+0:15      move second child to first child ( temp 4-component vector of float)
+0:15        pos: direct index for structure ( temp 4-component vector of float)
+0:15          's' ( temp structure{ temp 4-component vector of float pos,  temp 2-component vector of float clip0,  temp 2-component vector of float clip1})
+0:15          Constant:
+0:15            0 (const int)
+0:15        direct index ( temp 4-component vector of float)
+0:15          'pos' ( in 3-element array of 4-component vector of float)
+0:15          Constant:
+0:15            0 (const int)
+0:16      move second child to first child ( temp 2-component vector of float)
+0:16        clip0: direct index for structure ( temp 2-component vector of float)
+0:16          's' ( temp structure{ temp 4-component vector of float pos,  temp 2-component vector of float clip0,  temp 2-component vector of float clip1})
+0:16          Constant:
+0:16            1 (const int)
+0:16        vector swizzle ( temp 2-component vector of float)
+0:16          direct index ( temp 4-component vector of float)
+0:16            'clip' ( in 3-element array of 4-component vector of float)
+0:16            Constant:
+0:16              0 (const int)
+0:16          Sequence
+0:16            Constant:
+0:16              0 (const int)
+0:16            Constant:
+0:16              1 (const int)
+0:17      move second child to first child ( temp 2-component vector of float)
+0:17        clip1: direct index for structure ( temp 2-component vector of float)
+0:17          's' ( temp structure{ temp 4-component vector of float pos,  temp 2-component vector of float clip0,  temp 2-component vector of float clip1})
+0:17          Constant:
+0:17            2 (const int)
+0:17        vector swizzle ( temp 2-component vector of float)
+0:17          direct index ( temp 4-component vector of float)
+0:17            'clip' ( in 3-element array of 4-component vector of float)
+0:17            Constant:
+0:17              0 (const int)
+0:17          Sequence
+0:17            Constant:
+0:17              2 (const int)
+0:17            Constant:
+0:17              3 (const int)
+0:19      Sequence
+0:19        Sequence
+0:19          move second child to first child ( temp 4-component vector of float)
+0:?             'OutputStream.pos' ( out 4-component vector of float Position)
+0:19            pos: direct index for structure ( temp 4-component vector of float)
+0:19              's' ( temp structure{ temp 4-component vector of float pos,  temp 2-component vector of float clip0,  temp 2-component vector of float clip1})
+0:19              Constant:
+0:19                0 (const int)
+0:?           Sequence
+0:19            move second child to first child ( temp float)
+0:19              direct index ( out float ClipDistance)
+0:?                 'OutputStream.clip1' ( out 4-element array of float ClipDistance)
+0:19                Constant:
+0:19                  0 (const int)
+0:19              direct index ( temp float)
+0:19                clip0: direct index for structure ( temp 2-component vector of float)
+0:19                  's' ( temp structure{ temp 4-component vector of float pos,  temp 2-component vector of float clip0,  temp 2-component vector of float clip1})
+0:19                  Constant:
+0:19                    1 (const int)
+0:19                Constant:
+0:19                  0 (const int)
+0:19            move second child to first child ( temp float)
+0:19              direct index ( out float ClipDistance)
+0:?                 'OutputStream.clip1' ( out 4-element array of float ClipDistance)
+0:19                Constant:
+0:19                  1 (const int)
+0:19              direct index ( temp float)
+0:19                clip0: direct index for structure ( temp 2-component vector of float)
+0:19                  's' ( temp structure{ temp 4-component vector of float pos,  temp 2-component vector of float clip0,  temp 2-component vector of float clip1})
+0:19                  Constant:
+0:19                    1 (const int)
+0:19                Constant:
+0:19                  1 (const int)
+0:?           Sequence
+0:19            move second child to first child ( temp float)
+0:19              direct index ( out float ClipDistance)
+0:?                 'OutputStream.clip1' ( out 4-element array of float ClipDistance)
+0:19                Constant:
+0:19                  2 (const int)
+0:19              direct index ( temp float)
+0:19                clip1: direct index for structure ( temp 2-component vector of float)
+0:19                  's' ( temp structure{ temp 4-component vector of float pos,  temp 2-component vector of float clip0,  temp 2-component vector of float clip1})
+0:19                  Constant:
+0:19                    2 (const int)
+0:19                Constant:
+0:19                  0 (const int)
+0:19            move second child to first child ( temp float)
+0:19              direct index ( out float ClipDistance)
+0:?                 'OutputStream.clip1' ( out 4-element array of float ClipDistance)
+0:19                Constant:
+0:19                  3 (const int)
+0:19              direct index ( temp float)
+0:19                clip1: direct index for structure ( temp 2-component vector of float)
+0:19                  's' ( temp structure{ temp 4-component vector of float pos,  temp 2-component vector of float clip0,  temp 2-component vector of float clip1})
+0:19                  Constant:
+0:19                    2 (const int)
+0:19                Constant:
+0:19                  1 (const int)
+0:19        EmitVertex ( temp void)
+0:12  Function Definition: main( ( temp void)
+0:12    Function Parameters: 
+0:?     Sequence
+0:12      move second child to first child ( temp 3-element array of 4-component vector of float)
+0:?         'pos' ( temp 3-element array of 4-component vector of float)
+0:?         'pos' ( in 3-element array of 4-component vector of float Position)
+0:12      move second child to first child ( temp 3-element array of uint)
+0:?         'VertexID' ( temp 3-element array of uint)
+0:?         'VertexID' (layout( location=0) in 3-element array of uint)
+0:?       Sequence
+0:12        move second child to first child ( temp float)
+0:12          direct index ( temp float)
+0:12            direct index ( temp 4-component vector of float)
+0:?               'clip' ( temp 3-element array of 4-component vector of float)
+0:12              Constant:
+0:12                0 (const int)
+0:12            Constant:
+0:12              0 (const int)
+0:12          direct index ( in float ClipDistance)
+0:12            direct index ( in 4-element array of float ClipDistance)
+0:?               'clip' ( in 3-element array of 4-element array of float ClipDistance)
+0:12              Constant:
+0:12                0 (const int)
+0:12            Constant:
+0:12              0 (const int)
+0:12        move second child to first child ( temp float)
+0:12          direct index ( temp float)
+0:12            direct index ( temp 4-component vector of float)
+0:?               'clip' ( temp 3-element array of 4-component vector of float)
+0:12              Constant:
+0:12                0 (const int)
+0:12            Constant:
+0:12              1 (const int)
+0:12          direct index ( in float ClipDistance)
+0:12            direct index ( in 4-element array of float ClipDistance)
+0:?               'clip' ( in 3-element array of 4-element array of float ClipDistance)
+0:12              Constant:
+0:12                0 (const int)
+0:12            Constant:
+0:12              1 (const int)
+0:12        move second child to first child ( temp float)
+0:12          direct index ( temp float)
+0:12            direct index ( temp 4-component vector of float)
+0:?               'clip' ( temp 3-element array of 4-component vector of float)
+0:12              Constant:
+0:12                0 (const int)
+0:12            Constant:
+0:12              2 (const int)
+0:12          direct index ( in float ClipDistance)
+0:12            direct index ( in 4-element array of float ClipDistance)
+0:?               'clip' ( in 3-element array of 4-element array of float ClipDistance)
+0:12              Constant:
+0:12                0 (const int)
+0:12            Constant:
+0:12              2 (const int)
+0:12        move second child to first child ( temp float)
+0:12          direct index ( temp float)
+0:12            direct index ( temp 4-component vector of float)
+0:?               'clip' ( temp 3-element array of 4-component vector of float)
+0:12              Constant:
+0:12                0 (const int)
+0:12            Constant:
+0:12              3 (const int)
+0:12          direct index ( in float ClipDistance)
+0:12            direct index ( in 4-element array of float ClipDistance)
+0:?               'clip' ( in 3-element array of 4-element array of float ClipDistance)
+0:12              Constant:
+0:12                0 (const int)
+0:12            Constant:
+0:12              3 (const int)
+0:12        move second child to first child ( temp float)
+0:12          direct index ( temp float)
+0:12            direct index ( temp 4-component vector of float)
+0:?               'clip' ( temp 3-element array of 4-component vector of float)
+0:12              Constant:
+0:12                1 (const int)
+0:12            Constant:
+0:12              0 (const int)
+0:12          direct index ( in float ClipDistance)
+0:12            direct index ( in 4-element array of float ClipDistance)
+0:?               'clip' ( in 3-element array of 4-element array of float ClipDistance)
+0:12              Constant:
+0:12                1 (const int)
+0:12            Constant:
+0:12              0 (const int)
+0:12        move second child to first child ( temp float)
+0:12          direct index ( temp float)
+0:12            direct index ( temp 4-component vector of float)
+0:?               'clip' ( temp 3-element array of 4-component vector of float)
+0:12              Constant:
+0:12                1 (const int)
+0:12            Constant:
+0:12              1 (const int)
+0:12          direct index ( in float ClipDistance)
+0:12            direct index ( in 4-element array of float ClipDistance)
+0:?               'clip' ( in 3-element array of 4-element array of float ClipDistance)
+0:12              Constant:
+0:12                1 (const int)
+0:12            Constant:
+0:12              1 (const int)
+0:12        move second child to first child ( temp float)
+0:12          direct index ( temp float)
+0:12            direct index ( temp 4-component vector of float)
+0:?               'clip' ( temp 3-element array of 4-component vector of float)
+0:12              Constant:
+0:12                1 (const int)
+0:12            Constant:
+0:12              2 (const int)
+0:12          direct index ( in float ClipDistance)
+0:12            direct index ( in 4-element array of float ClipDistance)
+0:?               'clip' ( in 3-element array of 4-element array of float ClipDistance)
+0:12              Constant:
+0:12                1 (const int)
+0:12            Constant:
+0:12              2 (const int)
+0:12        move second child to first child ( temp float)
+0:12          direct index ( temp float)
+0:12            direct index ( temp 4-component vector of float)
+0:?               'clip' ( temp 3-element array of 4-component vector of float)
+0:12              Constant:
+0:12                1 (const int)
+0:12            Constant:
+0:12              3 (const int)
+0:12          direct index ( in float ClipDistance)
+0:12            direct index ( in 4-element array of float ClipDistance)
+0:?               'clip' ( in 3-element array of 4-element array of float ClipDistance)
+0:12              Constant:
+0:12                1 (const int)
+0:12            Constant:
+0:12              3 (const int)
+0:12        move second child to first child ( temp float)
+0:12          direct index ( temp float)
+0:12            direct index ( temp 4-component vector of float)
+0:?               'clip' ( temp 3-element array of 4-component vector of float)
+0:12              Constant:
+0:12                2 (const int)
+0:12            Constant:
+0:12              0 (const int)
+0:12          direct index ( in float ClipDistance)
+0:12            direct index ( in 4-element array of float ClipDistance)
+0:?               'clip' ( in 3-element array of 4-element array of float ClipDistance)
+0:12              Constant:
+0:12                2 (const int)
+0:12            Constant:
+0:12              0 (const int)
+0:12        move second child to first child ( temp float)
+0:12          direct index ( temp float)
+0:12            direct index ( temp 4-component vector of float)
+0:?               'clip' ( temp 3-element array of 4-component vector of float)
+0:12              Constant:
+0:12                2 (const int)
+0:12            Constant:
+0:12              1 (const int)
+0:12          direct index ( in float ClipDistance)
+0:12            direct index ( in 4-element array of float ClipDistance)
+0:?               'clip' ( in 3-element array of 4-element array of float ClipDistance)
+0:12              Constant:
+0:12                2 (const int)
+0:12            Constant:
+0:12              1 (const int)
+0:12        move second child to first child ( temp float)
+0:12          direct index ( temp float)
+0:12            direct index ( temp 4-component vector of float)
+0:?               'clip' ( temp 3-element array of 4-component vector of float)
+0:12              Constant:
+0:12                2 (const int)
+0:12            Constant:
+0:12              2 (const int)
+0:12          direct index ( in float ClipDistance)
+0:12            direct index ( in 4-element array of float ClipDistance)
+0:?               'clip' ( in 3-element array of 4-element array of float ClipDistance)
+0:12              Constant:
+0:12                2 (const int)
+0:12            Constant:
+0:12              2 (const int)
+0:12        move second child to first child ( temp float)
+0:12          direct index ( temp float)
+0:12            direct index ( temp 4-component vector of float)
+0:?               'clip' ( temp 3-element array of 4-component vector of float)
+0:12              Constant:
+0:12                2 (const int)
+0:12            Constant:
+0:12              3 (const int)
+0:12          direct index ( in float ClipDistance)
+0:12            direct index ( in 4-element array of float ClipDistance)
+0:?               'clip' ( in 3-element array of 4-element array of float ClipDistance)
+0:12              Constant:
+0:12                2 (const int)
+0:12            Constant:
+0:12              3 (const int)
+0:12      Function Call: @main(vf4[3];u1[3];struct-S-vf4-vf2-vf21;vf4[3]; ( temp void)
+0:?         'pos' ( temp 3-element array of 4-component vector of float)
+0:?         'VertexID' ( temp 3-element array of uint)
+0:?         'OutputStream' ( temp structure{ temp 4-component vector of float pos,  temp 2-component vector of float clip0,  temp 2-component vector of float clip1})
+0:?         'clip' ( temp 3-element array of 4-component vector of float)
+0:?   Linker Objects
+0:?     'pos' ( in 3-element array of 4-component vector of float Position)
+0:?     'VertexID' (layout( location=0) in 3-element array of uint)
+0:?     'OutputStream.pos' ( out 4-component vector of float Position)
+0:?     'clip' ( in 3-element array of 4-element array of float ClipDistance)
+0:?     'OutputStream.clip1' ( out 4-element array of float ClipDistance)
+
+
+Linked geometry stage:
+
+
+Shader version: 500
+invocations = 1
+max_vertices = 3
+input primitive = triangles
+output primitive = line_strip
+0:? Sequence
+0:12  Function Definition: @main(vf4[3];u1[3];struct-S-vf4-vf2-vf21;vf4[3]; ( temp void)
+0:12    Function Parameters: 
+0:12      'pos' ( in 3-element array of 4-component vector of float)
+0:12      'VertexID' ( in 3-element array of uint)
+0:12      'OutputStream' ( out structure{ temp 4-component vector of float pos,  temp 2-component vector of float clip0,  temp 2-component vector of float clip1})
+0:12      'clip' ( in 3-element array of 4-component vector of float)
+0:?     Sequence
+0:15      move second child to first child ( temp 4-component vector of float)
+0:15        pos: direct index for structure ( temp 4-component vector of float)
+0:15          's' ( temp structure{ temp 4-component vector of float pos,  temp 2-component vector of float clip0,  temp 2-component vector of float clip1})
+0:15          Constant:
+0:15            0 (const int)
+0:15        direct index ( temp 4-component vector of float)
+0:15          'pos' ( in 3-element array of 4-component vector of float)
+0:15          Constant:
+0:15            0 (const int)
+0:16      move second child to first child ( temp 2-component vector of float)
+0:16        clip0: direct index for structure ( temp 2-component vector of float)
+0:16          's' ( temp structure{ temp 4-component vector of float pos,  temp 2-component vector of float clip0,  temp 2-component vector of float clip1})
+0:16          Constant:
+0:16            1 (const int)
+0:16        vector swizzle ( temp 2-component vector of float)
+0:16          direct index ( temp 4-component vector of float)
+0:16            'clip' ( in 3-element array of 4-component vector of float)
+0:16            Constant:
+0:16              0 (const int)
+0:16          Sequence
+0:16            Constant:
+0:16              0 (const int)
+0:16            Constant:
+0:16              1 (const int)
+0:17      move second child to first child ( temp 2-component vector of float)
+0:17        clip1: direct index for structure ( temp 2-component vector of float)
+0:17          's' ( temp structure{ temp 4-component vector of float pos,  temp 2-component vector of float clip0,  temp 2-component vector of float clip1})
+0:17          Constant:
+0:17            2 (const int)
+0:17        vector swizzle ( temp 2-component vector of float)
+0:17          direct index ( temp 4-component vector of float)
+0:17            'clip' ( in 3-element array of 4-component vector of float)
+0:17            Constant:
+0:17              0 (const int)
+0:17          Sequence
+0:17            Constant:
+0:17              2 (const int)
+0:17            Constant:
+0:17              3 (const int)
+0:19      Sequence
+0:19        Sequence
+0:19          move second child to first child ( temp 4-component vector of float)
+0:?             'OutputStream.pos' ( out 4-component vector of float Position)
+0:19            pos: direct index for structure ( temp 4-component vector of float)
+0:19              's' ( temp structure{ temp 4-component vector of float pos,  temp 2-component vector of float clip0,  temp 2-component vector of float clip1})
+0:19              Constant:
+0:19                0 (const int)
+0:?           Sequence
+0:19            move second child to first child ( temp float)
+0:19              direct index ( out float ClipDistance)
+0:?                 'OutputStream.clip1' ( out 4-element array of float ClipDistance)
+0:19                Constant:
+0:19                  0 (const int)
+0:19              direct index ( temp float)
+0:19                clip0: direct index for structure ( temp 2-component vector of float)
+0:19                  's' ( temp structure{ temp 4-component vector of float pos,  temp 2-component vector of float clip0,  temp 2-component vector of float clip1})
+0:19                  Constant:
+0:19                    1 (const int)
+0:19                Constant:
+0:19                  0 (const int)
+0:19            move second child to first child ( temp float)
+0:19              direct index ( out float ClipDistance)
+0:?                 'OutputStream.clip1' ( out 4-element array of float ClipDistance)
+0:19                Constant:
+0:19                  1 (const int)
+0:19              direct index ( temp float)
+0:19                clip0: direct index for structure ( temp 2-component vector of float)
+0:19                  's' ( temp structure{ temp 4-component vector of float pos,  temp 2-component vector of float clip0,  temp 2-component vector of float clip1})
+0:19                  Constant:
+0:19                    1 (const int)
+0:19                Constant:
+0:19                  1 (const int)
+0:?           Sequence
+0:19            move second child to first child ( temp float)
+0:19              direct index ( out float ClipDistance)
+0:?                 'OutputStream.clip1' ( out 4-element array of float ClipDistance)
+0:19                Constant:
+0:19                  2 (const int)
+0:19              direct index ( temp float)
+0:19                clip1: direct index for structure ( temp 2-component vector of float)
+0:19                  's' ( temp structure{ temp 4-component vector of float pos,  temp 2-component vector of float clip0,  temp 2-component vector of float clip1})
+0:19                  Constant:
+0:19                    2 (const int)
+0:19                Constant:
+0:19                  0 (const int)
+0:19            move second child to first child ( temp float)
+0:19              direct index ( out float ClipDistance)
+0:?                 'OutputStream.clip1' ( out 4-element array of float ClipDistance)
+0:19                Constant:
+0:19                  3 (const int)
+0:19              direct index ( temp float)
+0:19                clip1: direct index for structure ( temp 2-component vector of float)
+0:19                  's' ( temp structure{ temp 4-component vector of float pos,  temp 2-component vector of float clip0,  temp 2-component vector of float clip1})
+0:19                  Constant:
+0:19                    2 (const int)
+0:19                Constant:
+0:19                  1 (const int)
+0:19        EmitVertex ( temp void)
+0:12  Function Definition: main( ( temp void)
+0:12    Function Parameters: 
+0:?     Sequence
+0:12      move second child to first child ( temp 3-element array of 4-component vector of float)
+0:?         'pos' ( temp 3-element array of 4-component vector of float)
+0:?         'pos' ( in 3-element array of 4-component vector of float Position)
+0:12      move second child to first child ( temp 3-element array of uint)
+0:?         'VertexID' ( temp 3-element array of uint)
+0:?         'VertexID' (layout( location=0) in 3-element array of uint)
+0:?       Sequence
+0:12        move second child to first child ( temp float)
+0:12          direct index ( temp float)
+0:12            direct index ( temp 4-component vector of float)
+0:?               'clip' ( temp 3-element array of 4-component vector of float)
+0:12              Constant:
+0:12                0 (const int)
+0:12            Constant:
+0:12              0 (const int)
+0:12          direct index ( in float ClipDistance)
+0:12            direct index ( in 4-element array of float ClipDistance)
+0:?               'clip' ( in 3-element array of 4-element array of float ClipDistance)
+0:12              Constant:
+0:12                0 (const int)
+0:12            Constant:
+0:12              0 (const int)
+0:12        move second child to first child ( temp float)
+0:12          direct index ( temp float)
+0:12            direct index ( temp 4-component vector of float)
+0:?               'clip' ( temp 3-element array of 4-component vector of float)
+0:12              Constant:
+0:12                0 (const int)
+0:12            Constant:
+0:12              1 (const int)
+0:12          direct index ( in float ClipDistance)
+0:12            direct index ( in 4-element array of float ClipDistance)
+0:?               'clip' ( in 3-element array of 4-element array of float ClipDistance)
+0:12              Constant:
+0:12                0 (const int)
+0:12            Constant:
+0:12              1 (const int)
+0:12        move second child to first child ( temp float)
+0:12          direct index ( temp float)
+0:12            direct index ( temp 4-component vector of float)
+0:?               'clip' ( temp 3-element array of 4-component vector of float)
+0:12              Constant:
+0:12                0 (const int)
+0:12            Constant:
+0:12              2 (const int)
+0:12          direct index ( in float ClipDistance)
+0:12            direct index ( in 4-element array of float ClipDistance)
+0:?               'clip' ( in 3-element array of 4-element array of float ClipDistance)
+0:12              Constant:
+0:12                0 (const int)
+0:12            Constant:
+0:12              2 (const int)
+0:12        move second child to first child ( temp float)
+0:12          direct index ( temp float)
+0:12            direct index ( temp 4-component vector of float)
+0:?               'clip' ( temp 3-element array of 4-component vector of float)
+0:12              Constant:
+0:12                0 (const int)
+0:12            Constant:
+0:12              3 (const int)
+0:12          direct index ( in float ClipDistance)
+0:12            direct index ( in 4-element array of float ClipDistance)
+0:?               'clip' ( in 3-element array of 4-element array of float ClipDistance)
+0:12              Constant:
+0:12                0 (const int)
+0:12            Constant:
+0:12              3 (const int)
+0:12        move second child to first child ( temp float)
+0:12          direct index ( temp float)
+0:12            direct index ( temp 4-component vector of float)
+0:?               'clip' ( temp 3-element array of 4-component vector of float)
+0:12              Constant:
+0:12                1 (const int)
+0:12            Constant:
+0:12              0 (const int)
+0:12          direct index ( in float ClipDistance)
+0:12            direct index ( in 4-element array of float ClipDistance)
+0:?               'clip' ( in 3-element array of 4-element array of float ClipDistance)
+0:12              Constant:
+0:12                1 (const int)
+0:12            Constant:
+0:12              0 (const int)
+0:12        move second child to first child ( temp float)
+0:12          direct index ( temp float)
+0:12            direct index ( temp 4-component vector of float)
+0:?               'clip' ( temp 3-element array of 4-component vector of float)
+0:12              Constant:
+0:12                1 (const int)
+0:12            Constant:
+0:12              1 (const int)
+0:12          direct index ( in float ClipDistance)
+0:12            direct index ( in 4-element array of float ClipDistance)
+0:?               'clip' ( in 3-element array of 4-element array of float ClipDistance)
+0:12              Constant:
+0:12                1 (const int)
+0:12            Constant:
+0:12              1 (const int)
+0:12        move second child to first child ( temp float)
+0:12          direct index ( temp float)
+0:12            direct index ( temp 4-component vector of float)
+0:?               'clip' ( temp 3-element array of 4-component vector of float)
+0:12              Constant:
+0:12                1 (const int)
+0:12            Constant:
+0:12              2 (const int)
+0:12          direct index ( in float ClipDistance)
+0:12            direct index ( in 4-element array of float ClipDistance)
+0:?               'clip' ( in 3-element array of 4-element array of float ClipDistance)
+0:12              Constant:
+0:12                1 (const int)
+0:12            Constant:
+0:12              2 (const int)
+0:12        move second child to first child ( temp float)
+0:12          direct index ( temp float)
+0:12            direct index ( temp 4-component vector of float)
+0:?               'clip' ( temp 3-element array of 4-component vector of float)
+0:12              Constant:
+0:12                1 (const int)
+0:12            Constant:
+0:12              3 (const int)
+0:12          direct index ( in float ClipDistance)
+0:12            direct index ( in 4-element array of float ClipDistance)
+0:?               'clip' ( in 3-element array of 4-element array of float ClipDistance)
+0:12              Constant:
+0:12                1 (const int)
+0:12            Constant:
+0:12              3 (const int)
+0:12        move second child to first child ( temp float)
+0:12          direct index ( temp float)
+0:12            direct index ( temp 4-component vector of float)
+0:?               'clip' ( temp 3-element array of 4-component vector of float)
+0:12              Constant:
+0:12                2 (const int)
+0:12            Constant:
+0:12              0 (const int)
+0:12          direct index ( in float ClipDistance)
+0:12            direct index ( in 4-element array of float ClipDistance)
+0:?               'clip' ( in 3-element array of 4-element array of float ClipDistance)
+0:12              Constant:
+0:12                2 (const int)
+0:12            Constant:
+0:12              0 (const int)
+0:12        move second child to first child ( temp float)
+0:12          direct index ( temp float)
+0:12            direct index ( temp 4-component vector of float)
+0:?               'clip' ( temp 3-element array of 4-component vector of float)
+0:12              Constant:
+0:12                2 (const int)
+0:12            Constant:
+0:12              1 (const int)
+0:12          direct index ( in float ClipDistance)
+0:12            direct index ( in 4-element array of float ClipDistance)
+0:?               'clip' ( in 3-element array of 4-element array of float ClipDistance)
+0:12              Constant:
+0:12                2 (const int)
+0:12            Constant:
+0:12              1 (const int)
+0:12        move second child to first child ( temp float)
+0:12          direct index ( temp float)
+0:12            direct index ( temp 4-component vector of float)
+0:?               'clip' ( temp 3-element array of 4-component vector of float)
+0:12              Constant:
+0:12                2 (const int)
+0:12            Constant:
+0:12              2 (const int)
+0:12          direct index ( in float ClipDistance)
+0:12            direct index ( in 4-element array of float ClipDistance)
+0:?               'clip' ( in 3-element array of 4-element array of float ClipDistance)
+0:12              Constant:
+0:12                2 (const int)
+0:12            Constant:
+0:12              2 (const int)
+0:12        move second child to first child ( temp float)
+0:12          direct index ( temp float)
+0:12            direct index ( temp 4-component vector of float)
+0:?               'clip' ( temp 3-element array of 4-component vector of float)
+0:12              Constant:
+0:12                2 (const int)
+0:12            Constant:
+0:12              3 (const int)
+0:12          direct index ( in float ClipDistance)
+0:12            direct index ( in 4-element array of float ClipDistance)
+0:?               'clip' ( in 3-element array of 4-element array of float ClipDistance)
+0:12              Constant:
+0:12                2 (const int)
+0:12            Constant:
+0:12              3 (const int)
+0:12      Function Call: @main(vf4[3];u1[3];struct-S-vf4-vf2-vf21;vf4[3]; ( temp void)
+0:?         'pos' ( temp 3-element array of 4-component vector of float)
+0:?         'VertexID' ( temp 3-element array of uint)
+0:?         'OutputStream' ( temp structure{ temp 4-component vector of float pos,  temp 2-component vector of float clip0,  temp 2-component vector of float clip1})
+0:?         'clip' ( temp 3-element array of 4-component vector of float)
+0:?   Linker Objects
+0:?     'pos' ( in 3-element array of 4-component vector of float Position)
+0:?     'VertexID' (layout( location=0) in 3-element array of uint)
+0:?     'OutputStream.pos' ( out 4-component vector of float Position)
+0:?     'clip' ( in 3-element array of 4-element array of float ClipDistance)
+0:?     'OutputStream.clip1' ( out 4-element array of float ClipDistance)
+
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 127
+
+                              Capability Geometry
+                              Capability ClipDistance
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Geometry 4  "main" 43 49 69 73 78
+                              ExecutionMode 4 Triangles
+                              ExecutionMode 4 Invocations 1
+                              ExecutionMode 4 OutputLineStrip
+                              ExecutionMode 4 OutputVertices 3
+                              Source HLSL 500
+                              Name 4  "main"
+                              Name 15  "S"
+                              MemberName 15(S) 0  "pos"
+                              MemberName 15(S) 1  "clip0"
+                              MemberName 15(S) 2  "clip1"
+                              Name 22  "@main(vf4[3];u1[3];struct-S-vf4-vf2-vf21;vf4[3];"
+                              Name 18  "pos"
+                              Name 19  "VertexID"
+                              Name 20  "OutputStream"
+                              Name 21  "clip"
+                              Name 24  "s"
+                              Name 43  "OutputStream.pos"
+                              Name 49  "OutputStream.clip1"
+                              Name 67  "pos"
+                              Name 69  "pos"
+                              Name 71  "VertexID"
+                              Name 73  "VertexID"
+                              Name 75  "clip"
+                              Name 78  "clip"
+                              Name 117  "OutputStream"
+                              Name 118  "param"
+                              Name 120  "param"
+                              Name 122  "param"
+                              Name 123  "param"
+                              Decorate 43(OutputStream.pos) BuiltIn Position
+                              Decorate 49(OutputStream.clip1) BuiltIn ClipDistance
+                              Decorate 69(pos) BuiltIn Position
+                              Decorate 73(VertexID) Location 0
+                              Decorate 78(clip) BuiltIn ClipDistance
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+               8:             TypeInt 32 0
+               9:      8(int) Constant 3
+              10:             TypeArray 7(fvec4) 9
+              11:             TypePointer Function 10
+              12:             TypeArray 8(int) 9
+              13:             TypePointer Function 12
+              14:             TypeVector 6(float) 2
+           15(S):             TypeStruct 7(fvec4) 14(fvec2) 14(fvec2)
+              16:             TypePointer Function 15(S)
+              17:             TypeFunction 2 11(ptr) 13(ptr) 16(ptr) 11(ptr)
+              25:             TypeInt 32 1
+              26:     25(int) Constant 0
+              27:             TypePointer Function 7(fvec4)
+              31:     25(int) Constant 1
+              35:             TypePointer Function 14(fvec2)
+              37:     25(int) Constant 2
+              42:             TypePointer Output 7(fvec4)
+43(OutputStream.pos):     42(ptr) Variable Output
+              46:      8(int) Constant 4
+              47:             TypeArray 6(float) 46
+              48:             TypePointer Output 47
+49(OutputStream.clip1):     48(ptr) Variable Output
+              50:      8(int) Constant 0
+              51:             TypePointer Function 6(float)
+              54:             TypePointer Output 6(float)
+              56:      8(int) Constant 1
+              63:     25(int) Constant 3
+              68:             TypePointer Input 10
+         69(pos):     68(ptr) Variable Input
+              72:             TypePointer Input 12
+    73(VertexID):     72(ptr) Variable Input
+              76:             TypeArray 47 9
+              77:             TypePointer Input 76
+        78(clip):     77(ptr) Variable Input
+              79:             TypePointer Input 6(float)
+              88:      8(int) Constant 2
+         4(main):           2 Function None 3
+               5:             Label
+         67(pos):     11(ptr) Variable Function
+    71(VertexID):     13(ptr) Variable Function
+        75(clip):     11(ptr) Variable Function
+117(OutputStream):     16(ptr) Variable Function
+      118(param):     11(ptr) Variable Function
+      120(param):     13(ptr) Variable Function
+      122(param):     16(ptr) Variable Function
+      123(param):     11(ptr) Variable Function
+              70:          10 Load 69(pos)
+                              Store 67(pos) 70
+              74:          12 Load 73(VertexID)
+                              Store 71(VertexID) 74
+              80:     79(ptr) AccessChain 78(clip) 26 26
+              81:    6(float) Load 80
+              82:     51(ptr) AccessChain 75(clip) 26 50
+                              Store 82 81
+              83:     79(ptr) AccessChain 78(clip) 26 31
+              84:    6(float) Load 83
+              85:     51(ptr) AccessChain 75(clip) 26 56
+                              Store 85 84
+              86:     79(ptr) AccessChain 78(clip) 26 37
+              87:    6(float) Load 86
+              89:     51(ptr) AccessChain 75(clip) 26 88
+                              Store 89 87
+              90:     79(ptr) AccessChain 78(clip) 26 63
+              91:    6(float) Load 90
+              92:     51(ptr) AccessChain 75(clip) 26 9
+                              Store 92 91
+              93:     79(ptr) AccessChain 78(clip) 31 26
+              94:    6(float) Load 93
+              95:     51(ptr) AccessChain 75(clip) 31 50
+                              Store 95 94
+              96:     79(ptr) AccessChain 78(clip) 31 31
+              97:    6(float) Load 96
+              98:     51(ptr) AccessChain 75(clip) 31 56
+                              Store 98 97
+              99:     79(ptr) AccessChain 78(clip) 31 37
+             100:    6(float) Load 99
+             101:     51(ptr) AccessChain 75(clip) 31 88
+                              Store 101 100
+             102:     79(ptr) AccessChain 78(clip) 31 63
+             103:    6(float) Load 102
+             104:     51(ptr) AccessChain 75(clip) 31 9
+                              Store 104 103
+             105:     79(ptr) AccessChain 78(clip) 37 26
+             106:    6(float) Load 105
+             107:     51(ptr) AccessChain 75(clip) 37 50
+                              Store 107 106
+             108:     79(ptr) AccessChain 78(clip) 37 31
+             109:    6(float) Load 108
+             110:     51(ptr) AccessChain 75(clip) 37 56
+                              Store 110 109
+             111:     79(ptr) AccessChain 78(clip) 37 37
+             112:    6(float) Load 111
+             113:     51(ptr) AccessChain 75(clip) 37 88
+                              Store 113 112
+             114:     79(ptr) AccessChain 78(clip) 37 63
+             115:    6(float) Load 114
+             116:     51(ptr) AccessChain 75(clip) 37 9
+                              Store 116 115
+             119:          10 Load 67(pos)
+                              Store 118(param) 119
+             121:          12 Load 71(VertexID)
+                              Store 120(param) 121
+             124:          10 Load 75(clip)
+                              Store 123(param) 124
+             125:           2 FunctionCall 22(@main(vf4[3];u1[3];struct-S-vf4-vf2-vf21;vf4[3];) 118(param) 120(param) 122(param) 123(param)
+             126:       15(S) Load 122(param)
+                              Store 117(OutputStream) 126
+                              Return
+                              FunctionEnd
+22(@main(vf4[3];u1[3];struct-S-vf4-vf2-vf21;vf4[3];):           2 Function None 17
+         18(pos):     11(ptr) FunctionParameter
+    19(VertexID):     13(ptr) FunctionParameter
+20(OutputStream):     16(ptr) FunctionParameter
+        21(clip):     11(ptr) FunctionParameter
+              23:             Label
+           24(s):     16(ptr) Variable Function
+              28:     27(ptr) AccessChain 18(pos) 26
+              29:    7(fvec4) Load 28
+              30:     27(ptr) AccessChain 24(s) 26
+                              Store 30 29
+              32:     27(ptr) AccessChain 21(clip) 26
+              33:    7(fvec4) Load 32
+              34:   14(fvec2) VectorShuffle 33 33 0 1
+              36:     35(ptr) AccessChain 24(s) 31
+                              Store 36 34
+              38:     27(ptr) AccessChain 21(clip) 26
+              39:    7(fvec4) Load 38
+              40:   14(fvec2) VectorShuffle 39 39 2 3
+              41:     35(ptr) AccessChain 24(s) 37
+                              Store 41 40
+              44:     27(ptr) AccessChain 24(s) 26
+              45:    7(fvec4) Load 44
+                              Store 43(OutputStream.pos) 45
+              52:     51(ptr) AccessChain 24(s) 31 50
+              53:    6(float) Load 52
+              55:     54(ptr) AccessChain 49(OutputStream.clip1) 26
+                              Store 55 53
+              57:     51(ptr) AccessChain 24(s) 31 56
+              58:    6(float) Load 57
+              59:     54(ptr) AccessChain 49(OutputStream.clip1) 31
+                              Store 59 58
+              60:     51(ptr) AccessChain 24(s) 37 50
+              61:    6(float) Load 60
+              62:     54(ptr) AccessChain 49(OutputStream.clip1) 37
+                              Store 62 61
+              64:     51(ptr) AccessChain 24(s) 37 56
+              65:    6(float) Load 64
+              66:     54(ptr) AccessChain 49(OutputStream.clip1) 63
+                              Store 66 65
+                              EmitVertex
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/hlsl.clipdistance-3.vert.out b/Test/baseResults/hlsl.clipdistance-3.vert.out
new file mode 100644
index 0000000..01afd17
--- /dev/null
+++ b/Test/baseResults/hlsl.clipdistance-3.vert.out
@@ -0,0 +1,229 @@
+hlsl.clipdistance-3.vert
+Shader version: 500
+0:? Sequence
+0:4  Function Definition: @main(vf4;f1[2];f1[2]; ( temp void)
+0:4    Function Parameters: 
+0:4      'pos' ( out 4-component vector of float)
+0:4      'clip' ( out 2-element array of float)
+0:4      'cull' ( out 2-element array of float)
+0:?     Sequence
+0:5      move second child to first child ( temp 4-component vector of float)
+0:5        'pos' ( out 4-component vector of float)
+0:5        Constant:
+0:5          1.000000
+0:5          1.000000
+0:5          1.000000
+0:5          1.000000
+0:6      move second child to first child ( temp float)
+0:6        direct index ( temp float)
+0:6          'clip' ( out 2-element array of float)
+0:6          Constant:
+0:6            0 (const int)
+0:6        Constant:
+0:6          0.500000
+0:7      move second child to first child ( temp float)
+0:7        direct index ( temp float)
+0:7          'clip' ( out 2-element array of float)
+0:7          Constant:
+0:7            1 (const int)
+0:7        Constant:
+0:7          0.600000
+0:9      move second child to first child ( temp float)
+0:9        direct index ( temp float)
+0:9          'cull' ( out 2-element array of float)
+0:9          Constant:
+0:9            0 (const int)
+0:9        Constant:
+0:9          0.525000
+0:10      move second child to first child ( temp float)
+0:10        direct index ( temp float)
+0:10          'cull' ( out 2-element array of float)
+0:10          Constant:
+0:10            1 (const int)
+0:10        Constant:
+0:10          0.625000
+0:4  Function Definition: main( ( temp void)
+0:4    Function Parameters: 
+0:?     Sequence
+0:4      Function Call: @main(vf4;f1[2];f1[2]; ( temp void)
+0:?         'pos' ( temp 4-component vector of float)
+0:?         'clip' ( temp 2-element array of float)
+0:?         'cull' ( temp 2-element array of float)
+0:4      move second child to first child ( temp 4-component vector of float)
+0:?         'pos' ( out 4-component vector of float Position)
+0:?         'pos' ( temp 4-component vector of float)
+0:?       Sequence
+0:4        move second child to first child ( temp 2-element array of float)
+0:?           'clip' ( out 2-element array of float ClipDistance)
+0:?           'clip' ( temp 2-element array of float)
+0:?       Sequence
+0:4        move second child to first child ( temp 2-element array of float)
+0:?           'cull' ( out 2-element array of float CullDistance)
+0:?           'cull' ( temp 2-element array of float)
+0:?   Linker Objects
+0:?     'pos' ( out 4-component vector of float Position)
+0:?     'clip' ( out 2-element array of float ClipDistance)
+0:?     'cull' ( out 2-element array of float CullDistance)
+
+
+Linked vertex stage:
+
+
+Shader version: 500
+0:? Sequence
+0:4  Function Definition: @main(vf4;f1[2];f1[2]; ( temp void)
+0:4    Function Parameters: 
+0:4      'pos' ( out 4-component vector of float)
+0:4      'clip' ( out 2-element array of float)
+0:4      'cull' ( out 2-element array of float)
+0:?     Sequence
+0:5      move second child to first child ( temp 4-component vector of float)
+0:5        'pos' ( out 4-component vector of float)
+0:5        Constant:
+0:5          1.000000
+0:5          1.000000
+0:5          1.000000
+0:5          1.000000
+0:6      move second child to first child ( temp float)
+0:6        direct index ( temp float)
+0:6          'clip' ( out 2-element array of float)
+0:6          Constant:
+0:6            0 (const int)
+0:6        Constant:
+0:6          0.500000
+0:7      move second child to first child ( temp float)
+0:7        direct index ( temp float)
+0:7          'clip' ( out 2-element array of float)
+0:7          Constant:
+0:7            1 (const int)
+0:7        Constant:
+0:7          0.600000
+0:9      move second child to first child ( temp float)
+0:9        direct index ( temp float)
+0:9          'cull' ( out 2-element array of float)
+0:9          Constant:
+0:9            0 (const int)
+0:9        Constant:
+0:9          0.525000
+0:10      move second child to first child ( temp float)
+0:10        direct index ( temp float)
+0:10          'cull' ( out 2-element array of float)
+0:10          Constant:
+0:10            1 (const int)
+0:10        Constant:
+0:10          0.625000
+0:4  Function Definition: main( ( temp void)
+0:4    Function Parameters: 
+0:?     Sequence
+0:4      Function Call: @main(vf4;f1[2];f1[2]; ( temp void)
+0:?         'pos' ( temp 4-component vector of float)
+0:?         'clip' ( temp 2-element array of float)
+0:?         'cull' ( temp 2-element array of float)
+0:4      move second child to first child ( temp 4-component vector of float)
+0:?         'pos' ( out 4-component vector of float Position)
+0:?         'pos' ( temp 4-component vector of float)
+0:?       Sequence
+0:4        move second child to first child ( temp 2-element array of float)
+0:?           'clip' ( out 2-element array of float ClipDistance)
+0:?           'clip' ( temp 2-element array of float)
+0:?       Sequence
+0:4        move second child to first child ( temp 2-element array of float)
+0:?           'cull' ( out 2-element array of float CullDistance)
+0:?           'cull' ( temp 2-element array of float)
+0:?   Linker Objects
+0:?     'pos' ( out 4-component vector of float Position)
+0:?     'clip' ( out 2-element array of float ClipDistance)
+0:?     'cull' ( out 2-element array of float CullDistance)
+
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 51
+
+                              Capability Shader
+                              Capability ClipDistance
+                              Capability CullDistance
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Vertex 4  "main" 44 47 49
+                              Source HLSL 500
+                              Name 4  "main"
+                              Name 17  "@main(vf4;f1[2];f1[2];"
+                              Name 14  "pos"
+                              Name 15  "clip"
+                              Name 16  "cull"
+                              Name 33  "pos"
+                              Name 34  "clip"
+                              Name 35  "cull"
+                              Name 36  "param"
+                              Name 37  "param"
+                              Name 38  "param"
+                              Name 44  "pos"
+                              Name 47  "clip"
+                              Name 49  "cull"
+                              Decorate 44(pos) BuiltIn Position
+                              Decorate 47(clip) BuiltIn ClipDistance
+                              Decorate 49(cull) BuiltIn CullDistance
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+               8:             TypePointer Function 7(fvec4)
+               9:             TypeInt 32 0
+              10:      9(int) Constant 2
+              11:             TypeArray 6(float) 10
+              12:             TypePointer Function 11
+              13:             TypeFunction 2 8(ptr) 12(ptr) 12(ptr)
+              19:    6(float) Constant 1065353216
+              20:    7(fvec4) ConstantComposite 19 19 19 19
+              21:             TypeInt 32 1
+              22:     21(int) Constant 0
+              23:    6(float) Constant 1056964608
+              24:             TypePointer Function 6(float)
+              26:     21(int) Constant 1
+              27:    6(float) Constant 1058642330
+              29:    6(float) Constant 1057384038
+              31:    6(float) Constant 1059061760
+              43:             TypePointer Output 7(fvec4)
+         44(pos):     43(ptr) Variable Output
+              46:             TypePointer Output 11
+        47(clip):     46(ptr) Variable Output
+        49(cull):     46(ptr) Variable Output
+         4(main):           2 Function None 3
+               5:             Label
+         33(pos):      8(ptr) Variable Function
+        34(clip):     12(ptr) Variable Function
+        35(cull):     12(ptr) Variable Function
+       36(param):      8(ptr) Variable Function
+       37(param):     12(ptr) Variable Function
+       38(param):     12(ptr) Variable Function
+              39:           2 FunctionCall 17(@main(vf4;f1[2];f1[2];) 36(param) 37(param) 38(param)
+              40:    7(fvec4) Load 36(param)
+                              Store 33(pos) 40
+              41:          11 Load 37(param)
+                              Store 34(clip) 41
+              42:          11 Load 38(param)
+                              Store 35(cull) 42
+              45:    7(fvec4) Load 33(pos)
+                              Store 44(pos) 45
+              48:          11 Load 34(clip)
+                              Store 47(clip) 48
+              50:          11 Load 35(cull)
+                              Store 49(cull) 50
+                              Return
+                              FunctionEnd
+17(@main(vf4;f1[2];f1[2];):           2 Function None 13
+         14(pos):      8(ptr) FunctionParameter
+        15(clip):     12(ptr) FunctionParameter
+        16(cull):     12(ptr) FunctionParameter
+              18:             Label
+                              Store 14(pos) 20
+              25:     24(ptr) AccessChain 15(clip) 22
+                              Store 25 23
+              28:     24(ptr) AccessChain 15(clip) 26
+                              Store 28 27
+              30:     24(ptr) AccessChain 16(cull) 22
+                              Store 30 29
+              32:     24(ptr) AccessChain 16(cull) 26
+                              Store 32 31
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/hlsl.clipdistance-4.frag.out b/Test/baseResults/hlsl.clipdistance-4.frag.out
new file mode 100644
index 0000000..95f81c9
--- /dev/null
+++ b/Test/baseResults/hlsl.clipdistance-4.frag.out
@@ -0,0 +1,262 @@
+hlsl.clipdistance-4.frag
+Shader version: 500
+gl_FragCoord origin is upper left
+0:? Sequence
+0:7  Function Definition: @main(struct-VS_OUTPUT-vf4-vf41; ( temp 4-component vector of float)
+0:7    Function Parameters: 
+0:7      'v' ( const (read only) structure{ temp 4-component vector of float Position,  temp 4-component vector of float ClipRect})
+0:?     Sequence
+0:8      Branch: Return with expression
+0:8        add ( temp 4-component vector of float)
+0:8          Position: direct index for structure ( temp 4-component vector of float)
+0:8            'v' ( const (read only) structure{ temp 4-component vector of float Position,  temp 4-component vector of float ClipRect})
+0:8            Constant:
+0:8              0 (const int)
+0:8          ClipRect: direct index for structure ( temp 4-component vector of float)
+0:8            'v' ( const (read only) structure{ temp 4-component vector of float Position,  temp 4-component vector of float ClipRect})
+0:8            Constant:
+0:8              1 (const int)
+0:7  Function Definition: main( ( temp void)
+0:7    Function Parameters: 
+0:?     Sequence
+0:7      Sequence
+0:7        move second child to first child ( temp 4-component vector of float)
+0:7          Position: direct index for structure ( temp 4-component vector of float)
+0:?             'v' ( temp structure{ temp 4-component vector of float Position,  temp 4-component vector of float ClipRect})
+0:7            Constant:
+0:7              0 (const int)
+0:?           'v.Position' ( in 4-component vector of float FragCoord)
+0:?         Sequence
+0:7          move second child to first child ( temp float)
+0:7            direct index ( temp float)
+0:7              ClipRect: direct index for structure ( temp 4-component vector of float)
+0:?                 'v' ( temp structure{ temp 4-component vector of float Position,  temp 4-component vector of float ClipRect})
+0:7                Constant:
+0:7                  1 (const int)
+0:7              Constant:
+0:7                0 (const int)
+0:7            direct index ( in float ClipDistance)
+0:?               'v.ClipRect' ( in 4-element array of float ClipDistance)
+0:7              Constant:
+0:7                0 (const int)
+0:7          move second child to first child ( temp float)
+0:7            direct index ( temp float)
+0:7              ClipRect: direct index for structure ( temp 4-component vector of float)
+0:?                 'v' ( temp structure{ temp 4-component vector of float Position,  temp 4-component vector of float ClipRect})
+0:7                Constant:
+0:7                  1 (const int)
+0:7              Constant:
+0:7                1 (const int)
+0:7            direct index ( in float ClipDistance)
+0:?               'v.ClipRect' ( in 4-element array of float ClipDistance)
+0:7              Constant:
+0:7                1 (const int)
+0:7          move second child to first child ( temp float)
+0:7            direct index ( temp float)
+0:7              ClipRect: direct index for structure ( temp 4-component vector of float)
+0:?                 'v' ( temp structure{ temp 4-component vector of float Position,  temp 4-component vector of float ClipRect})
+0:7                Constant:
+0:7                  1 (const int)
+0:7              Constant:
+0:7                2 (const int)
+0:7            direct index ( in float ClipDistance)
+0:?               'v.ClipRect' ( in 4-element array of float ClipDistance)
+0:7              Constant:
+0:7                2 (const int)
+0:7          move second child to first child ( temp float)
+0:7            direct index ( temp float)
+0:7              ClipRect: direct index for structure ( temp 4-component vector of float)
+0:?                 'v' ( temp structure{ temp 4-component vector of float Position,  temp 4-component vector of float ClipRect})
+0:7                Constant:
+0:7                  1 (const int)
+0:7              Constant:
+0:7                3 (const int)
+0:7            direct index ( in float ClipDistance)
+0:?               'v.ClipRect' ( in 4-element array of float ClipDistance)
+0:7              Constant:
+0:7                3 (const int)
+0:7      move second child to first child ( temp 4-component vector of float)
+0:?         '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+0:7        Function Call: @main(struct-VS_OUTPUT-vf4-vf41; ( temp 4-component vector of float)
+0:?           'v' ( temp structure{ temp 4-component vector of float Position,  temp 4-component vector of float ClipRect})
+0:?   Linker Objects
+0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+0:?     'v.Position' ( in 4-component vector of float FragCoord)
+0:?     'v.ClipRect' ( in 4-element array of float ClipDistance)
+
+
+Linked fragment stage:
+
+
+Shader version: 500
+gl_FragCoord origin is upper left
+0:? Sequence
+0:7  Function Definition: @main(struct-VS_OUTPUT-vf4-vf41; ( temp 4-component vector of float)
+0:7    Function Parameters: 
+0:7      'v' ( const (read only) structure{ temp 4-component vector of float Position,  temp 4-component vector of float ClipRect})
+0:?     Sequence
+0:8      Branch: Return with expression
+0:8        add ( temp 4-component vector of float)
+0:8          Position: direct index for structure ( temp 4-component vector of float)
+0:8            'v' ( const (read only) structure{ temp 4-component vector of float Position,  temp 4-component vector of float ClipRect})
+0:8            Constant:
+0:8              0 (const int)
+0:8          ClipRect: direct index for structure ( temp 4-component vector of float)
+0:8            'v' ( const (read only) structure{ temp 4-component vector of float Position,  temp 4-component vector of float ClipRect})
+0:8            Constant:
+0:8              1 (const int)
+0:7  Function Definition: main( ( temp void)
+0:7    Function Parameters: 
+0:?     Sequence
+0:7      Sequence
+0:7        move second child to first child ( temp 4-component vector of float)
+0:7          Position: direct index for structure ( temp 4-component vector of float)
+0:?             'v' ( temp structure{ temp 4-component vector of float Position,  temp 4-component vector of float ClipRect})
+0:7            Constant:
+0:7              0 (const int)
+0:?           'v.Position' ( in 4-component vector of float FragCoord)
+0:?         Sequence
+0:7          move second child to first child ( temp float)
+0:7            direct index ( temp float)
+0:7              ClipRect: direct index for structure ( temp 4-component vector of float)
+0:?                 'v' ( temp structure{ temp 4-component vector of float Position,  temp 4-component vector of float ClipRect})
+0:7                Constant:
+0:7                  1 (const int)
+0:7              Constant:
+0:7                0 (const int)
+0:7            direct index ( in float ClipDistance)
+0:?               'v.ClipRect' ( in 4-element array of float ClipDistance)
+0:7              Constant:
+0:7                0 (const int)
+0:7          move second child to first child ( temp float)
+0:7            direct index ( temp float)
+0:7              ClipRect: direct index for structure ( temp 4-component vector of float)
+0:?                 'v' ( temp structure{ temp 4-component vector of float Position,  temp 4-component vector of float ClipRect})
+0:7                Constant:
+0:7                  1 (const int)
+0:7              Constant:
+0:7                1 (const int)
+0:7            direct index ( in float ClipDistance)
+0:?               'v.ClipRect' ( in 4-element array of float ClipDistance)
+0:7              Constant:
+0:7                1 (const int)
+0:7          move second child to first child ( temp float)
+0:7            direct index ( temp float)
+0:7              ClipRect: direct index for structure ( temp 4-component vector of float)
+0:?                 'v' ( temp structure{ temp 4-component vector of float Position,  temp 4-component vector of float ClipRect})
+0:7                Constant:
+0:7                  1 (const int)
+0:7              Constant:
+0:7                2 (const int)
+0:7            direct index ( in float ClipDistance)
+0:?               'v.ClipRect' ( in 4-element array of float ClipDistance)
+0:7              Constant:
+0:7                2 (const int)
+0:7          move second child to first child ( temp float)
+0:7            direct index ( temp float)
+0:7              ClipRect: direct index for structure ( temp 4-component vector of float)
+0:?                 'v' ( temp structure{ temp 4-component vector of float Position,  temp 4-component vector of float ClipRect})
+0:7                Constant:
+0:7                  1 (const int)
+0:7              Constant:
+0:7                3 (const int)
+0:7            direct index ( in float ClipDistance)
+0:?               'v.ClipRect' ( in 4-element array of float ClipDistance)
+0:7              Constant:
+0:7                3 (const int)
+0:7      move second child to first child ( temp 4-component vector of float)
+0:?         '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+0:7        Function Call: @main(struct-VS_OUTPUT-vf4-vf41; ( temp 4-component vector of float)
+0:?           'v' ( temp structure{ temp 4-component vector of float Position,  temp 4-component vector of float ClipRect})
+0:?   Linker Objects
+0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+0:?     'v.Position' ( in 4-component vector of float FragCoord)
+0:?     'v.ClipRect' ( in 4-element array of float ClipDistance)
+
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 57
+
+                              Capability Shader
+                              Capability ClipDistance
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 24 32 54
+                              ExecutionMode 4 OriginUpperLeft
+                              Source HLSL 500
+                              Name 4  "main"
+                              Name 8  "VS_OUTPUT"
+                              MemberName 8(VS_OUTPUT) 0  "Position"
+                              MemberName 8(VS_OUTPUT) 1  "ClipRect"
+                              Name 11  "@main(struct-VS_OUTPUT-vf4-vf41;"
+                              Name 10  "v"
+                              Name 22  "v"
+                              Name 24  "v.Position"
+                              Name 32  "v.ClipRect"
+                              Name 54  "@entryPointOutput"
+                              Decorate 24(v.Position) BuiltIn FragCoord
+                              Decorate 32(v.ClipRect) BuiltIn ClipDistance
+                              Decorate 54(@entryPointOutput) Location 0
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+    8(VS_OUTPUT):             TypeStruct 7(fvec4) 7(fvec4)
+               9:             TypeFunction 7(fvec4) 8(VS_OUTPUT)
+              13:             TypeInt 32 1
+              14:     13(int) Constant 0
+              16:     13(int) Constant 1
+              21:             TypePointer Function 8(VS_OUTPUT)
+              23:             TypePointer Input 7(fvec4)
+  24(v.Position):     23(ptr) Variable Input
+              26:             TypePointer Function 7(fvec4)
+              28:             TypeInt 32 0
+              29:     28(int) Constant 4
+              30:             TypeArray 6(float) 29
+              31:             TypePointer Input 30
+  32(v.ClipRect):     31(ptr) Variable Input
+              33:             TypePointer Input 6(float)
+              36:     28(int) Constant 0
+              37:             TypePointer Function 6(float)
+              41:     28(int) Constant 1
+              43:     13(int) Constant 2
+              46:     28(int) Constant 2
+              48:     13(int) Constant 3
+              51:     28(int) Constant 3
+              53:             TypePointer Output 7(fvec4)
+54(@entryPointOutput):     53(ptr) Variable Output
+         4(main):           2 Function None 3
+               5:             Label
+           22(v):     21(ptr) Variable Function
+              25:    7(fvec4) Load 24(v.Position)
+              27:     26(ptr) AccessChain 22(v) 14
+                              Store 27 25
+              34:     33(ptr) AccessChain 32(v.ClipRect) 14
+              35:    6(float) Load 34
+              38:     37(ptr) AccessChain 22(v) 16 36
+                              Store 38 35
+              39:     33(ptr) AccessChain 32(v.ClipRect) 16
+              40:    6(float) Load 39
+              42:     37(ptr) AccessChain 22(v) 16 41
+                              Store 42 40
+              44:     33(ptr) AccessChain 32(v.ClipRect) 43
+              45:    6(float) Load 44
+              47:     37(ptr) AccessChain 22(v) 16 46
+                              Store 47 45
+              49:     33(ptr) AccessChain 32(v.ClipRect) 48
+              50:    6(float) Load 49
+              52:     37(ptr) AccessChain 22(v) 16 51
+                              Store 52 50
+              55:8(VS_OUTPUT) Load 22(v)
+              56:    7(fvec4) FunctionCall 11(@main(struct-VS_OUTPUT-vf4-vf41;) 55
+                              Store 54(@entryPointOutput) 56
+                              Return
+                              FunctionEnd
+11(@main(struct-VS_OUTPUT-vf4-vf41;):    7(fvec4) Function None 9
+           10(v):8(VS_OUTPUT) FunctionParameter
+              12:             Label
+              15:    7(fvec4) CompositeExtract 10(v) 0
+              17:    7(fvec4) CompositeExtract 10(v) 1
+              18:    7(fvec4) FAdd 15 17
+                              ReturnValue 18
+                              FunctionEnd
diff --git a/Test/baseResults/hlsl.clipdistance-4.geom.out b/Test/baseResults/hlsl.clipdistance-4.geom.out
new file mode 100644
index 0000000..1096e02
--- /dev/null
+++ b/Test/baseResults/hlsl.clipdistance-4.geom.out
@@ -0,0 +1,819 @@
+hlsl.clipdistance-4.geom
+Shader version: 500
+invocations = -1
+max_vertices = 3
+input primitive = triangles
+output primitive = line_strip
+0:? Sequence
+0:13  Function Definition: @main(vf4[3];u1[3];struct-S-vf4-vf2-vf21;vf2[3];vf2[3]; ( temp void)
+0:13    Function Parameters: 
+0:13      'pos' ( in 3-element array of 4-component vector of float)
+0:13      'VertexID' ( in 3-element array of uint)
+0:13      'OutputStream' ( out structure{ temp 4-component vector of float pos,  temp 2-component vector of float clip0,  temp 2-component vector of float clip1})
+0:13      'clip0' ( in 3-element array of 2-component vector of float)
+0:13      'clip1' ( in 3-element array of 2-component vector of float)
+0:?     Sequence
+0:16      move second child to first child ( temp 4-component vector of float)
+0:16        pos: direct index for structure ( temp 4-component vector of float)
+0:16          's' ( temp structure{ temp 4-component vector of float pos,  temp 2-component vector of float clip0,  temp 2-component vector of float clip1})
+0:16          Constant:
+0:16            0 (const int)
+0:16        direct index ( temp 4-component vector of float)
+0:16          'pos' ( in 3-element array of 4-component vector of float)
+0:16          Constant:
+0:16            0 (const int)
+0:17      move second child to first child ( temp 2-component vector of float)
+0:17        clip0: direct index for structure ( temp 2-component vector of float)
+0:17          's' ( temp structure{ temp 4-component vector of float pos,  temp 2-component vector of float clip0,  temp 2-component vector of float clip1})
+0:17          Constant:
+0:17            1 (const int)
+0:17        direct index ( temp 2-component vector of float)
+0:17          'clip0' ( in 3-element array of 2-component vector of float)
+0:17          Constant:
+0:17            0 (const int)
+0:18      move second child to first child ( temp 2-component vector of float)
+0:18        clip1: direct index for structure ( temp 2-component vector of float)
+0:18          's' ( temp structure{ temp 4-component vector of float pos,  temp 2-component vector of float clip0,  temp 2-component vector of float clip1})
+0:18          Constant:
+0:18            2 (const int)
+0:18        direct index ( temp 2-component vector of float)
+0:18          'clip1' ( in 3-element array of 2-component vector of float)
+0:18          Constant:
+0:18            0 (const int)
+0:20      Sequence
+0:20        Sequence
+0:20          move second child to first child ( temp 4-component vector of float)
+0:?             'OutputStream.pos' ( out 4-component vector of float Position)
+0:20            pos: direct index for structure ( temp 4-component vector of float)
+0:20              's' ( temp structure{ temp 4-component vector of float pos,  temp 2-component vector of float clip0,  temp 2-component vector of float clip1})
+0:20              Constant:
+0:20                0 (const int)
+0:?           Sequence
+0:20            move second child to first child ( temp float)
+0:20              direct index ( out float ClipDistance)
+0:?                 'OutputStream.clip1' ( out 4-element array of float ClipDistance)
+0:20                Constant:
+0:20                  0 (const int)
+0:20              direct index ( temp float)
+0:20                clip0: direct index for structure ( temp 2-component vector of float)
+0:20                  's' ( temp structure{ temp 4-component vector of float pos,  temp 2-component vector of float clip0,  temp 2-component vector of float clip1})
+0:20                  Constant:
+0:20                    1 (const int)
+0:20                Constant:
+0:20                  0 (const int)
+0:20            move second child to first child ( temp float)
+0:20              direct index ( out float ClipDistance)
+0:?                 'OutputStream.clip1' ( out 4-element array of float ClipDistance)
+0:20                Constant:
+0:20                  1 (const int)
+0:20              direct index ( temp float)
+0:20                clip0: direct index for structure ( temp 2-component vector of float)
+0:20                  's' ( temp structure{ temp 4-component vector of float pos,  temp 2-component vector of float clip0,  temp 2-component vector of float clip1})
+0:20                  Constant:
+0:20                    1 (const int)
+0:20                Constant:
+0:20                  1 (const int)
+0:?           Sequence
+0:20            move second child to first child ( temp float)
+0:20              direct index ( out float ClipDistance)
+0:?                 'OutputStream.clip1' ( out 4-element array of float ClipDistance)
+0:20                Constant:
+0:20                  2 (const int)
+0:20              direct index ( temp float)
+0:20                clip1: direct index for structure ( temp 2-component vector of float)
+0:20                  's' ( temp structure{ temp 4-component vector of float pos,  temp 2-component vector of float clip0,  temp 2-component vector of float clip1})
+0:20                  Constant:
+0:20                    2 (const int)
+0:20                Constant:
+0:20                  0 (const int)
+0:20            move second child to first child ( temp float)
+0:20              direct index ( out float ClipDistance)
+0:?                 'OutputStream.clip1' ( out 4-element array of float ClipDistance)
+0:20                Constant:
+0:20                  3 (const int)
+0:20              direct index ( temp float)
+0:20                clip1: direct index for structure ( temp 2-component vector of float)
+0:20                  's' ( temp structure{ temp 4-component vector of float pos,  temp 2-component vector of float clip0,  temp 2-component vector of float clip1})
+0:20                  Constant:
+0:20                    2 (const int)
+0:20                Constant:
+0:20                  1 (const int)
+0:20        EmitVertex ( temp void)
+0:13  Function Definition: main( ( temp void)
+0:13    Function Parameters: 
+0:?     Sequence
+0:13      move second child to first child ( temp 3-element array of 4-component vector of float)
+0:?         'pos' ( temp 3-element array of 4-component vector of float)
+0:?         'pos' ( in 3-element array of 4-component vector of float Position)
+0:13      move second child to first child ( temp 3-element array of uint)
+0:?         'VertexID' ( temp 3-element array of uint)
+0:?         'VertexID' (layout( location=0) in 3-element array of uint)
+0:?       Sequence
+0:13        move second child to first child ( temp float)
+0:13          direct index ( temp float)
+0:13            direct index ( temp 2-component vector of float)
+0:?               'clip0' ( temp 3-element array of 2-component vector of float)
+0:13              Constant:
+0:13                0 (const int)
+0:13            Constant:
+0:13              0 (const int)
+0:13          direct index ( in float ClipDistance)
+0:13            direct index ( in 4-element array of float ClipDistance)
+0:?               'clip0' ( in 3-element array of 4-element array of float ClipDistance)
+0:13              Constant:
+0:13                0 (const int)
+0:13            Constant:
+0:13              0 (const int)
+0:13        move second child to first child ( temp float)
+0:13          direct index ( temp float)
+0:13            direct index ( temp 2-component vector of float)
+0:?               'clip0' ( temp 3-element array of 2-component vector of float)
+0:13              Constant:
+0:13                0 (const int)
+0:13            Constant:
+0:13              1 (const int)
+0:13          direct index ( in float ClipDistance)
+0:13            direct index ( in 4-element array of float ClipDistance)
+0:?               'clip0' ( in 3-element array of 4-element array of float ClipDistance)
+0:13              Constant:
+0:13                0 (const int)
+0:13            Constant:
+0:13              1 (const int)
+0:13        move second child to first child ( temp float)
+0:13          direct index ( temp float)
+0:13            direct index ( temp 2-component vector of float)
+0:?               'clip0' ( temp 3-element array of 2-component vector of float)
+0:13              Constant:
+0:13                1 (const int)
+0:13            Constant:
+0:13              0 (const int)
+0:13          direct index ( in float ClipDistance)
+0:13            direct index ( in 4-element array of float ClipDistance)
+0:?               'clip0' ( in 3-element array of 4-element array of float ClipDistance)
+0:13              Constant:
+0:13                0 (const int)
+0:13            Constant:
+0:13              2 (const int)
+0:13        move second child to first child ( temp float)
+0:13          direct index ( temp float)
+0:13            direct index ( temp 2-component vector of float)
+0:?               'clip0' ( temp 3-element array of 2-component vector of float)
+0:13              Constant:
+0:13                1 (const int)
+0:13            Constant:
+0:13              1 (const int)
+0:13          direct index ( in float ClipDistance)
+0:13            direct index ( in 4-element array of float ClipDistance)
+0:?               'clip0' ( in 3-element array of 4-element array of float ClipDistance)
+0:13              Constant:
+0:13                0 (const int)
+0:13            Constant:
+0:13              3 (const int)
+0:13        move second child to first child ( temp float)
+0:13          direct index ( temp float)
+0:13            direct index ( temp 2-component vector of float)
+0:?               'clip0' ( temp 3-element array of 2-component vector of float)
+0:13              Constant:
+0:13                2 (const int)
+0:13            Constant:
+0:13              0 (const int)
+0:13          direct index ( in float ClipDistance)
+0:13            direct index ( in 4-element array of float ClipDistance)
+0:?               'clip0' ( in 3-element array of 4-element array of float ClipDistance)
+0:13              Constant:
+0:13                1 (const int)
+0:13            Constant:
+0:13              0 (const int)
+0:13        move second child to first child ( temp float)
+0:13          direct index ( temp float)
+0:13            direct index ( temp 2-component vector of float)
+0:?               'clip0' ( temp 3-element array of 2-component vector of float)
+0:13              Constant:
+0:13                2 (const int)
+0:13            Constant:
+0:13              1 (const int)
+0:13          direct index ( in float ClipDistance)
+0:13            direct index ( in 4-element array of float ClipDistance)
+0:?               'clip0' ( in 3-element array of 4-element array of float ClipDistance)
+0:13              Constant:
+0:13                1 (const int)
+0:13            Constant:
+0:13              1 (const int)
+0:?       Sequence
+0:13        move second child to first child ( temp float)
+0:13          direct index ( temp float)
+0:13            direct index ( temp 2-component vector of float)
+0:?               'clip1' ( temp 3-element array of 2-component vector of float)
+0:13              Constant:
+0:13                0 (const int)
+0:13            Constant:
+0:13              0 (const int)
+0:13          direct index ( in float ClipDistance)
+0:13            direct index ( in 4-element array of float ClipDistance)
+0:?               'clip0' ( in 3-element array of 4-element array of float ClipDistance)
+0:13              Constant:
+0:13                0 (const int)
+0:13            Constant:
+0:13              2 (const int)
+0:13        move second child to first child ( temp float)
+0:13          direct index ( temp float)
+0:13            direct index ( temp 2-component vector of float)
+0:?               'clip1' ( temp 3-element array of 2-component vector of float)
+0:13              Constant:
+0:13                0 (const int)
+0:13            Constant:
+0:13              1 (const int)
+0:13          direct index ( in float ClipDistance)
+0:13            direct index ( in 4-element array of float ClipDistance)
+0:?               'clip0' ( in 3-element array of 4-element array of float ClipDistance)
+0:13              Constant:
+0:13                0 (const int)
+0:13            Constant:
+0:13              3 (const int)
+0:13        move second child to first child ( temp float)
+0:13          direct index ( temp float)
+0:13            direct index ( temp 2-component vector of float)
+0:?               'clip1' ( temp 3-element array of 2-component vector of float)
+0:13              Constant:
+0:13                1 (const int)
+0:13            Constant:
+0:13              0 (const int)
+0:13          direct index ( in float ClipDistance)
+0:13            direct index ( in 4-element array of float ClipDistance)
+0:?               'clip0' ( in 3-element array of 4-element array of float ClipDistance)
+0:13              Constant:
+0:13                1 (const int)
+0:13            Constant:
+0:13              2 (const int)
+0:13        move second child to first child ( temp float)
+0:13          direct index ( temp float)
+0:13            direct index ( temp 2-component vector of float)
+0:?               'clip1' ( temp 3-element array of 2-component vector of float)
+0:13              Constant:
+0:13                1 (const int)
+0:13            Constant:
+0:13              1 (const int)
+0:13          direct index ( in float ClipDistance)
+0:13            direct index ( in 4-element array of float ClipDistance)
+0:?               'clip0' ( in 3-element array of 4-element array of float ClipDistance)
+0:13              Constant:
+0:13                1 (const int)
+0:13            Constant:
+0:13              3 (const int)
+0:13        move second child to first child ( temp float)
+0:13          direct index ( temp float)
+0:13            direct index ( temp 2-component vector of float)
+0:?               'clip1' ( temp 3-element array of 2-component vector of float)
+0:13              Constant:
+0:13                2 (const int)
+0:13            Constant:
+0:13              0 (const int)
+0:13          direct index ( in float ClipDistance)
+0:13            direct index ( in 4-element array of float ClipDistance)
+0:?               'clip0' ( in 3-element array of 4-element array of float ClipDistance)
+0:13              Constant:
+0:13                2 (const int)
+0:13            Constant:
+0:13              2 (const int)
+0:13        move second child to first child ( temp float)
+0:13          direct index ( temp float)
+0:13            direct index ( temp 2-component vector of float)
+0:?               'clip1' ( temp 3-element array of 2-component vector of float)
+0:13              Constant:
+0:13                2 (const int)
+0:13            Constant:
+0:13              1 (const int)
+0:13          direct index ( in float ClipDistance)
+0:13            direct index ( in 4-element array of float ClipDistance)
+0:?               'clip0' ( in 3-element array of 4-element array of float ClipDistance)
+0:13              Constant:
+0:13                2 (const int)
+0:13            Constant:
+0:13              3 (const int)
+0:13      Function Call: @main(vf4[3];u1[3];struct-S-vf4-vf2-vf21;vf2[3];vf2[3]; ( temp void)
+0:?         'pos' ( temp 3-element array of 4-component vector of float)
+0:?         'VertexID' ( temp 3-element array of uint)
+0:?         'OutputStream' ( temp structure{ temp 4-component vector of float pos,  temp 2-component vector of float clip0,  temp 2-component vector of float clip1})
+0:?         'clip0' ( temp 3-element array of 2-component vector of float)
+0:?         'clip1' ( temp 3-element array of 2-component vector of float)
+0:?   Linker Objects
+0:?     'pos' ( in 3-element array of 4-component vector of float Position)
+0:?     'VertexID' (layout( location=0) in 3-element array of uint)
+0:?     'OutputStream.pos' ( out 4-component vector of float Position)
+0:?     'clip0' ( in 3-element array of 4-element array of float ClipDistance)
+0:?     'OutputStream.clip1' ( out 4-element array of float ClipDistance)
+
+
+Linked geometry stage:
+
+
+Shader version: 500
+invocations = 1
+max_vertices = 3
+input primitive = triangles
+output primitive = line_strip
+0:? Sequence
+0:13  Function Definition: @main(vf4[3];u1[3];struct-S-vf4-vf2-vf21;vf2[3];vf2[3]; ( temp void)
+0:13    Function Parameters: 
+0:13      'pos' ( in 3-element array of 4-component vector of float)
+0:13      'VertexID' ( in 3-element array of uint)
+0:13      'OutputStream' ( out structure{ temp 4-component vector of float pos,  temp 2-component vector of float clip0,  temp 2-component vector of float clip1})
+0:13      'clip0' ( in 3-element array of 2-component vector of float)
+0:13      'clip1' ( in 3-element array of 2-component vector of float)
+0:?     Sequence
+0:16      move second child to first child ( temp 4-component vector of float)
+0:16        pos: direct index for structure ( temp 4-component vector of float)
+0:16          's' ( temp structure{ temp 4-component vector of float pos,  temp 2-component vector of float clip0,  temp 2-component vector of float clip1})
+0:16          Constant:
+0:16            0 (const int)
+0:16        direct index ( temp 4-component vector of float)
+0:16          'pos' ( in 3-element array of 4-component vector of float)
+0:16          Constant:
+0:16            0 (const int)
+0:17      move second child to first child ( temp 2-component vector of float)
+0:17        clip0: direct index for structure ( temp 2-component vector of float)
+0:17          's' ( temp structure{ temp 4-component vector of float pos,  temp 2-component vector of float clip0,  temp 2-component vector of float clip1})
+0:17          Constant:
+0:17            1 (const int)
+0:17        direct index ( temp 2-component vector of float)
+0:17          'clip0' ( in 3-element array of 2-component vector of float)
+0:17          Constant:
+0:17            0 (const int)
+0:18      move second child to first child ( temp 2-component vector of float)
+0:18        clip1: direct index for structure ( temp 2-component vector of float)
+0:18          's' ( temp structure{ temp 4-component vector of float pos,  temp 2-component vector of float clip0,  temp 2-component vector of float clip1})
+0:18          Constant:
+0:18            2 (const int)
+0:18        direct index ( temp 2-component vector of float)
+0:18          'clip1' ( in 3-element array of 2-component vector of float)
+0:18          Constant:
+0:18            0 (const int)
+0:20      Sequence
+0:20        Sequence
+0:20          move second child to first child ( temp 4-component vector of float)
+0:?             'OutputStream.pos' ( out 4-component vector of float Position)
+0:20            pos: direct index for structure ( temp 4-component vector of float)
+0:20              's' ( temp structure{ temp 4-component vector of float pos,  temp 2-component vector of float clip0,  temp 2-component vector of float clip1})
+0:20              Constant:
+0:20                0 (const int)
+0:?           Sequence
+0:20            move second child to first child ( temp float)
+0:20              direct index ( out float ClipDistance)
+0:?                 'OutputStream.clip1' ( out 4-element array of float ClipDistance)
+0:20                Constant:
+0:20                  0 (const int)
+0:20              direct index ( temp float)
+0:20                clip0: direct index for structure ( temp 2-component vector of float)
+0:20                  's' ( temp structure{ temp 4-component vector of float pos,  temp 2-component vector of float clip0,  temp 2-component vector of float clip1})
+0:20                  Constant:
+0:20                    1 (const int)
+0:20                Constant:
+0:20                  0 (const int)
+0:20            move second child to first child ( temp float)
+0:20              direct index ( out float ClipDistance)
+0:?                 'OutputStream.clip1' ( out 4-element array of float ClipDistance)
+0:20                Constant:
+0:20                  1 (const int)
+0:20              direct index ( temp float)
+0:20                clip0: direct index for structure ( temp 2-component vector of float)
+0:20                  's' ( temp structure{ temp 4-component vector of float pos,  temp 2-component vector of float clip0,  temp 2-component vector of float clip1})
+0:20                  Constant:
+0:20                    1 (const int)
+0:20                Constant:
+0:20                  1 (const int)
+0:?           Sequence
+0:20            move second child to first child ( temp float)
+0:20              direct index ( out float ClipDistance)
+0:?                 'OutputStream.clip1' ( out 4-element array of float ClipDistance)
+0:20                Constant:
+0:20                  2 (const int)
+0:20              direct index ( temp float)
+0:20                clip1: direct index for structure ( temp 2-component vector of float)
+0:20                  's' ( temp structure{ temp 4-component vector of float pos,  temp 2-component vector of float clip0,  temp 2-component vector of float clip1})
+0:20                  Constant:
+0:20                    2 (const int)
+0:20                Constant:
+0:20                  0 (const int)
+0:20            move second child to first child ( temp float)
+0:20              direct index ( out float ClipDistance)
+0:?                 'OutputStream.clip1' ( out 4-element array of float ClipDistance)
+0:20                Constant:
+0:20                  3 (const int)
+0:20              direct index ( temp float)
+0:20                clip1: direct index for structure ( temp 2-component vector of float)
+0:20                  's' ( temp structure{ temp 4-component vector of float pos,  temp 2-component vector of float clip0,  temp 2-component vector of float clip1})
+0:20                  Constant:
+0:20                    2 (const int)
+0:20                Constant:
+0:20                  1 (const int)
+0:20        EmitVertex ( temp void)
+0:13  Function Definition: main( ( temp void)
+0:13    Function Parameters: 
+0:?     Sequence
+0:13      move second child to first child ( temp 3-element array of 4-component vector of float)
+0:?         'pos' ( temp 3-element array of 4-component vector of float)
+0:?         'pos' ( in 3-element array of 4-component vector of float Position)
+0:13      move second child to first child ( temp 3-element array of uint)
+0:?         'VertexID' ( temp 3-element array of uint)
+0:?         'VertexID' (layout( location=0) in 3-element array of uint)
+0:?       Sequence
+0:13        move second child to first child ( temp float)
+0:13          direct index ( temp float)
+0:13            direct index ( temp 2-component vector of float)
+0:?               'clip0' ( temp 3-element array of 2-component vector of float)
+0:13              Constant:
+0:13                0 (const int)
+0:13            Constant:
+0:13              0 (const int)
+0:13          direct index ( in float ClipDistance)
+0:13            direct index ( in 4-element array of float ClipDistance)
+0:?               'clip0' ( in 3-element array of 4-element array of float ClipDistance)
+0:13              Constant:
+0:13                0 (const int)
+0:13            Constant:
+0:13              0 (const int)
+0:13        move second child to first child ( temp float)
+0:13          direct index ( temp float)
+0:13            direct index ( temp 2-component vector of float)
+0:?               'clip0' ( temp 3-element array of 2-component vector of float)
+0:13              Constant:
+0:13                0 (const int)
+0:13            Constant:
+0:13              1 (const int)
+0:13          direct index ( in float ClipDistance)
+0:13            direct index ( in 4-element array of float ClipDistance)
+0:?               'clip0' ( in 3-element array of 4-element array of float ClipDistance)
+0:13              Constant:
+0:13                0 (const int)
+0:13            Constant:
+0:13              1 (const int)
+0:13        move second child to first child ( temp float)
+0:13          direct index ( temp float)
+0:13            direct index ( temp 2-component vector of float)
+0:?               'clip0' ( temp 3-element array of 2-component vector of float)
+0:13              Constant:
+0:13                1 (const int)
+0:13            Constant:
+0:13              0 (const int)
+0:13          direct index ( in float ClipDistance)
+0:13            direct index ( in 4-element array of float ClipDistance)
+0:?               'clip0' ( in 3-element array of 4-element array of float ClipDistance)
+0:13              Constant:
+0:13                0 (const int)
+0:13            Constant:
+0:13              2 (const int)
+0:13        move second child to first child ( temp float)
+0:13          direct index ( temp float)
+0:13            direct index ( temp 2-component vector of float)
+0:?               'clip0' ( temp 3-element array of 2-component vector of float)
+0:13              Constant:
+0:13                1 (const int)
+0:13            Constant:
+0:13              1 (const int)
+0:13          direct index ( in float ClipDistance)
+0:13            direct index ( in 4-element array of float ClipDistance)
+0:?               'clip0' ( in 3-element array of 4-element array of float ClipDistance)
+0:13              Constant:
+0:13                0 (const int)
+0:13            Constant:
+0:13              3 (const int)
+0:13        move second child to first child ( temp float)
+0:13          direct index ( temp float)
+0:13            direct index ( temp 2-component vector of float)
+0:?               'clip0' ( temp 3-element array of 2-component vector of float)
+0:13              Constant:
+0:13                2 (const int)
+0:13            Constant:
+0:13              0 (const int)
+0:13          direct index ( in float ClipDistance)
+0:13            direct index ( in 4-element array of float ClipDistance)
+0:?               'clip0' ( in 3-element array of 4-element array of float ClipDistance)
+0:13              Constant:
+0:13                1 (const int)
+0:13            Constant:
+0:13              0 (const int)
+0:13        move second child to first child ( temp float)
+0:13          direct index ( temp float)
+0:13            direct index ( temp 2-component vector of float)
+0:?               'clip0' ( temp 3-element array of 2-component vector of float)
+0:13              Constant:
+0:13                2 (const int)
+0:13            Constant:
+0:13              1 (const int)
+0:13          direct index ( in float ClipDistance)
+0:13            direct index ( in 4-element array of float ClipDistance)
+0:?               'clip0' ( in 3-element array of 4-element array of float ClipDistance)
+0:13              Constant:
+0:13                1 (const int)
+0:13            Constant:
+0:13              1 (const int)
+0:?       Sequence
+0:13        move second child to first child ( temp float)
+0:13          direct index ( temp float)
+0:13            direct index ( temp 2-component vector of float)
+0:?               'clip1' ( temp 3-element array of 2-component vector of float)
+0:13              Constant:
+0:13                0 (const int)
+0:13            Constant:
+0:13              0 (const int)
+0:13          direct index ( in float ClipDistance)
+0:13            direct index ( in 4-element array of float ClipDistance)
+0:?               'clip0' ( in 3-element array of 4-element array of float ClipDistance)
+0:13              Constant:
+0:13                0 (const int)
+0:13            Constant:
+0:13              2 (const int)
+0:13        move second child to first child ( temp float)
+0:13          direct index ( temp float)
+0:13            direct index ( temp 2-component vector of float)
+0:?               'clip1' ( temp 3-element array of 2-component vector of float)
+0:13              Constant:
+0:13                0 (const int)
+0:13            Constant:
+0:13              1 (const int)
+0:13          direct index ( in float ClipDistance)
+0:13            direct index ( in 4-element array of float ClipDistance)
+0:?               'clip0' ( in 3-element array of 4-element array of float ClipDistance)
+0:13              Constant:
+0:13                0 (const int)
+0:13            Constant:
+0:13              3 (const int)
+0:13        move second child to first child ( temp float)
+0:13          direct index ( temp float)
+0:13            direct index ( temp 2-component vector of float)
+0:?               'clip1' ( temp 3-element array of 2-component vector of float)
+0:13              Constant:
+0:13                1 (const int)
+0:13            Constant:
+0:13              0 (const int)
+0:13          direct index ( in float ClipDistance)
+0:13            direct index ( in 4-element array of float ClipDistance)
+0:?               'clip0' ( in 3-element array of 4-element array of float ClipDistance)
+0:13              Constant:
+0:13                1 (const int)
+0:13            Constant:
+0:13              2 (const int)
+0:13        move second child to first child ( temp float)
+0:13          direct index ( temp float)
+0:13            direct index ( temp 2-component vector of float)
+0:?               'clip1' ( temp 3-element array of 2-component vector of float)
+0:13              Constant:
+0:13                1 (const int)
+0:13            Constant:
+0:13              1 (const int)
+0:13          direct index ( in float ClipDistance)
+0:13            direct index ( in 4-element array of float ClipDistance)
+0:?               'clip0' ( in 3-element array of 4-element array of float ClipDistance)
+0:13              Constant:
+0:13                1 (const int)
+0:13            Constant:
+0:13              3 (const int)
+0:13        move second child to first child ( temp float)
+0:13          direct index ( temp float)
+0:13            direct index ( temp 2-component vector of float)
+0:?               'clip1' ( temp 3-element array of 2-component vector of float)
+0:13              Constant:
+0:13                2 (const int)
+0:13            Constant:
+0:13              0 (const int)
+0:13          direct index ( in float ClipDistance)
+0:13            direct index ( in 4-element array of float ClipDistance)
+0:?               'clip0' ( in 3-element array of 4-element array of float ClipDistance)
+0:13              Constant:
+0:13                2 (const int)
+0:13            Constant:
+0:13              2 (const int)
+0:13        move second child to first child ( temp float)
+0:13          direct index ( temp float)
+0:13            direct index ( temp 2-component vector of float)
+0:?               'clip1' ( temp 3-element array of 2-component vector of float)
+0:13              Constant:
+0:13                2 (const int)
+0:13            Constant:
+0:13              1 (const int)
+0:13          direct index ( in float ClipDistance)
+0:13            direct index ( in 4-element array of float ClipDistance)
+0:?               'clip0' ( in 3-element array of 4-element array of float ClipDistance)
+0:13              Constant:
+0:13                2 (const int)
+0:13            Constant:
+0:13              3 (const int)
+0:13      Function Call: @main(vf4[3];u1[3];struct-S-vf4-vf2-vf21;vf2[3];vf2[3]; ( temp void)
+0:?         'pos' ( temp 3-element array of 4-component vector of float)
+0:?         'VertexID' ( temp 3-element array of uint)
+0:?         'OutputStream' ( temp structure{ temp 4-component vector of float pos,  temp 2-component vector of float clip0,  temp 2-component vector of float clip1})
+0:?         'clip0' ( temp 3-element array of 2-component vector of float)
+0:?         'clip1' ( temp 3-element array of 2-component vector of float)
+0:?   Linker Objects
+0:?     'pos' ( in 3-element array of 4-component vector of float Position)
+0:?     'VertexID' (layout( location=0) in 3-element array of uint)
+0:?     'OutputStream.pos' ( out 4-component vector of float Position)
+0:?     'clip0' ( in 3-element array of 4-element array of float ClipDistance)
+0:?     'OutputStream.clip1' ( out 4-element array of float ClipDistance)
+
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 130
+
+                              Capability Geometry
+                              Capability ClipDistance
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Geometry 4  "main" 44 50 70 74 79
+                              ExecutionMode 4 Triangles
+                              ExecutionMode 4 Invocations 1
+                              ExecutionMode 4 OutputLineStrip
+                              ExecutionMode 4 OutputVertices 3
+                              Source HLSL 500
+                              Name 4  "main"
+                              Name 15  "S"
+                              MemberName 15(S) 0  "pos"
+                              MemberName 15(S) 1  "clip0"
+                              MemberName 15(S) 2  "clip1"
+                              Name 25  "@main(vf4[3];u1[3];struct-S-vf4-vf2-vf21;vf2[3];vf2[3];"
+                              Name 20  "pos"
+                              Name 21  "VertexID"
+                              Name 22  "OutputStream"
+                              Name 23  "clip0"
+                              Name 24  "clip1"
+                              Name 27  "s"
+                              Name 44  "OutputStream.pos"
+                              Name 50  "OutputStream.clip1"
+                              Name 68  "pos"
+                              Name 70  "pos"
+                              Name 72  "VertexID"
+                              Name 74  "VertexID"
+                              Name 76  "clip0"
+                              Name 79  "clip0"
+                              Name 99  "clip1"
+                              Name 118  "OutputStream"
+                              Name 119  "param"
+                              Name 121  "param"
+                              Name 123  "param"
+                              Name 124  "param"
+                              Name 126  "param"
+                              Decorate 44(OutputStream.pos) BuiltIn Position
+                              Decorate 50(OutputStream.clip1) BuiltIn ClipDistance
+                              Decorate 70(pos) BuiltIn Position
+                              Decorate 74(VertexID) Location 0
+                              Decorate 79(clip0) BuiltIn ClipDistance
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+               8:             TypeInt 32 0
+               9:      8(int) Constant 3
+              10:             TypeArray 7(fvec4) 9
+              11:             TypePointer Function 10
+              12:             TypeArray 8(int) 9
+              13:             TypePointer Function 12
+              14:             TypeVector 6(float) 2
+           15(S):             TypeStruct 7(fvec4) 14(fvec2) 14(fvec2)
+              16:             TypePointer Function 15(S)
+              17:             TypeArray 14(fvec2) 9
+              18:             TypePointer Function 17
+              19:             TypeFunction 2 11(ptr) 13(ptr) 16(ptr) 18(ptr) 18(ptr)
+              28:             TypeInt 32 1
+              29:     28(int) Constant 0
+              30:             TypePointer Function 7(fvec4)
+              34:     28(int) Constant 1
+              35:             TypePointer Function 14(fvec2)
+              39:     28(int) Constant 2
+              43:             TypePointer Output 7(fvec4)
+44(OutputStream.pos):     43(ptr) Variable Output
+              47:      8(int) Constant 4
+              48:             TypeArray 6(float) 47
+              49:             TypePointer Output 48
+50(OutputStream.clip1):     49(ptr) Variable Output
+              51:      8(int) Constant 0
+              52:             TypePointer Function 6(float)
+              55:             TypePointer Output 6(float)
+              57:      8(int) Constant 1
+              64:     28(int) Constant 3
+              69:             TypePointer Input 10
+         70(pos):     69(ptr) Variable Input
+              73:             TypePointer Input 12
+    74(VertexID):     73(ptr) Variable Input
+              77:             TypeArray 48 9
+              78:             TypePointer Input 77
+       79(clip0):     78(ptr) Variable Input
+              80:             TypePointer Input 6(float)
+         4(main):           2 Function None 3
+               5:             Label
+         68(pos):     11(ptr) Variable Function
+    72(VertexID):     13(ptr) Variable Function
+       76(clip0):     18(ptr) Variable Function
+       99(clip1):     18(ptr) Variable Function
+118(OutputStream):     16(ptr) Variable Function
+      119(param):     11(ptr) Variable Function
+      121(param):     13(ptr) Variable Function
+      123(param):     16(ptr) Variable Function
+      124(param):     18(ptr) Variable Function
+      126(param):     18(ptr) Variable Function
+              71:          10 Load 70(pos)
+                              Store 68(pos) 71
+              75:          12 Load 74(VertexID)
+                              Store 72(VertexID) 75
+              81:     80(ptr) AccessChain 79(clip0) 29 29
+              82:    6(float) Load 81
+              83:     52(ptr) AccessChain 76(clip0) 29 51
+                              Store 83 82
+              84:     80(ptr) AccessChain 79(clip0) 29 34
+              85:    6(float) Load 84
+              86:     52(ptr) AccessChain 76(clip0) 29 57
+                              Store 86 85
+              87:     80(ptr) AccessChain 79(clip0) 29 39
+              88:    6(float) Load 87
+              89:     52(ptr) AccessChain 76(clip0) 34 51
+                              Store 89 88
+              90:     80(ptr) AccessChain 79(clip0) 29 64
+              91:    6(float) Load 90
+              92:     52(ptr) AccessChain 76(clip0) 34 57
+                              Store 92 91
+              93:     80(ptr) AccessChain 79(clip0) 34 29
+              94:    6(float) Load 93
+              95:     52(ptr) AccessChain 76(clip0) 39 51
+                              Store 95 94
+              96:     80(ptr) AccessChain 79(clip0) 34 34
+              97:    6(float) Load 96
+              98:     52(ptr) AccessChain 76(clip0) 39 57
+                              Store 98 97
+             100:     80(ptr) AccessChain 79(clip0) 29 39
+             101:    6(float) Load 100
+             102:     52(ptr) AccessChain 99(clip1) 29 51
+                              Store 102 101
+             103:     80(ptr) AccessChain 79(clip0) 29 64
+             104:    6(float) Load 103
+             105:     52(ptr) AccessChain 99(clip1) 29 57
+                              Store 105 104
+             106:     80(ptr) AccessChain 79(clip0) 34 39
+             107:    6(float) Load 106
+             108:     52(ptr) AccessChain 99(clip1) 34 51
+                              Store 108 107
+             109:     80(ptr) AccessChain 79(clip0) 34 64
+             110:    6(float) Load 109
+             111:     52(ptr) AccessChain 99(clip1) 34 57
+                              Store 111 110
+             112:     80(ptr) AccessChain 79(clip0) 39 39
+             113:    6(float) Load 112
+             114:     52(ptr) AccessChain 99(clip1) 39 51
+                              Store 114 113
+             115:     80(ptr) AccessChain 79(clip0) 39 64
+             116:    6(float) Load 115
+             117:     52(ptr) AccessChain 99(clip1) 39 57
+                              Store 117 116
+             120:          10 Load 68(pos)
+                              Store 119(param) 120
+             122:          12 Load 72(VertexID)
+                              Store 121(param) 122
+             125:          17 Load 76(clip0)
+                              Store 124(param) 125
+             127:          17 Load 99(clip1)
+                              Store 126(param) 127
+             128:           2 FunctionCall 25(@main(vf4[3];u1[3];struct-S-vf4-vf2-vf21;vf2[3];vf2[3];) 119(param) 121(param) 123(param) 124(param) 126(param)
+             129:       15(S) Load 123(param)
+                              Store 118(OutputStream) 129
+                              Return
+                              FunctionEnd
+25(@main(vf4[3];u1[3];struct-S-vf4-vf2-vf21;vf2[3];vf2[3];):           2 Function None 19
+         20(pos):     11(ptr) FunctionParameter
+    21(VertexID):     13(ptr) FunctionParameter
+22(OutputStream):     16(ptr) FunctionParameter
+       23(clip0):     18(ptr) FunctionParameter
+       24(clip1):     18(ptr) FunctionParameter
+              26:             Label
+           27(s):     16(ptr) Variable Function
+              31:     30(ptr) AccessChain 20(pos) 29
+              32:    7(fvec4) Load 31
+              33:     30(ptr) AccessChain 27(s) 29
+                              Store 33 32
+              36:     35(ptr) AccessChain 23(clip0) 29
+              37:   14(fvec2) Load 36
+              38:     35(ptr) AccessChain 27(s) 34
+                              Store 38 37
+              40:     35(ptr) AccessChain 24(clip1) 29
+              41:   14(fvec2) Load 40
+              42:     35(ptr) AccessChain 27(s) 39
+                              Store 42 41
+              45:     30(ptr) AccessChain 27(s) 29
+              46:    7(fvec4) Load 45
+                              Store 44(OutputStream.pos) 46
+              53:     52(ptr) AccessChain 27(s) 34 51
+              54:    6(float) Load 53
+              56:     55(ptr) AccessChain 50(OutputStream.clip1) 29
+                              Store 56 54
+              58:     52(ptr) AccessChain 27(s) 34 57
+              59:    6(float) Load 58
+              60:     55(ptr) AccessChain 50(OutputStream.clip1) 34
+                              Store 60 59
+              61:     52(ptr) AccessChain 27(s) 39 51
+              62:    6(float) Load 61
+              63:     55(ptr) AccessChain 50(OutputStream.clip1) 39
+                              Store 63 62
+              65:     52(ptr) AccessChain 27(s) 39 57
+              66:    6(float) Load 65
+              67:     55(ptr) AccessChain 50(OutputStream.clip1) 64
+                              Store 67 66
+                              EmitVertex
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/hlsl.clipdistance-4.vert.out b/Test/baseResults/hlsl.clipdistance-4.vert.out
new file mode 100644
index 0000000..d05fae4
--- /dev/null
+++ b/Test/baseResults/hlsl.clipdistance-4.vert.out
@@ -0,0 +1,382 @@
+hlsl.clipdistance-4.vert
+Shader version: 500
+0:? Sequence
+0:11  Function Definition: @main(struct-VS_INPUT-vf41; ( temp structure{ temp 4-component vector of float Position,  temp 4-component vector of float ClipRect})
+0:11    Function Parameters: 
+0:11      'v' ( const (read only) structure{ temp 4-component vector of float Position})
+0:?     Sequence
+0:13      move second child to first child ( temp 4-component vector of float)
+0:13        Position: direct index for structure ( temp 4-component vector of float)
+0:13          'Output' ( temp structure{ temp 4-component vector of float Position,  temp 4-component vector of float ClipRect})
+0:13          Constant:
+0:13            0 (const int)
+0:13        Constant:
+0:13          0.000000
+0:13          0.000000
+0:13          0.000000
+0:13          0.000000
+0:15      move second child to first child ( temp float)
+0:15        direct index ( temp float)
+0:15          ClipRect: direct index for structure ( temp 4-component vector of float)
+0:15            'Output' ( temp structure{ temp 4-component vector of float Position,  temp 4-component vector of float ClipRect})
+0:15            Constant:
+0:15              1 (const int)
+0:15          Constant:
+0:15            0 (const int)
+0:15        Constant:
+0:15          1.000000
+0:16      move second child to first child ( temp float)
+0:16        direct index ( temp float)
+0:16          ClipRect: direct index for structure ( temp 4-component vector of float)
+0:16            'Output' ( temp structure{ temp 4-component vector of float Position,  temp 4-component vector of float ClipRect})
+0:16            Constant:
+0:16              1 (const int)
+0:16          Constant:
+0:16            1 (const int)
+0:16        Constant:
+0:16          2.000000
+0:17      move second child to first child ( temp float)
+0:17        direct index ( temp float)
+0:17          ClipRect: direct index for structure ( temp 4-component vector of float)
+0:17            'Output' ( temp structure{ temp 4-component vector of float Position,  temp 4-component vector of float ClipRect})
+0:17            Constant:
+0:17              1 (const int)
+0:17          Constant:
+0:17            2 (const int)
+0:17        Constant:
+0:17          3.000000
+0:18      move second child to first child ( temp float)
+0:18        direct index ( temp float)
+0:18          ClipRect: direct index for structure ( temp 4-component vector of float)
+0:18            'Output' ( temp structure{ temp 4-component vector of float Position,  temp 4-component vector of float ClipRect})
+0:18            Constant:
+0:18              1 (const int)
+0:18          Constant:
+0:18            3 (const int)
+0:18        Constant:
+0:18          4.000000
+0:20      Branch: Return with expression
+0:20        'Output' ( temp structure{ temp 4-component vector of float Position,  temp 4-component vector of float ClipRect})
+0:11  Function Definition: main( ( temp void)
+0:11    Function Parameters: 
+0:?     Sequence
+0:11      Sequence
+0:11        move second child to first child ( temp 4-component vector of float)
+0:11          Position: direct index for structure ( temp 4-component vector of float)
+0:?             'v' ( temp structure{ temp 4-component vector of float Position})
+0:11            Constant:
+0:11              0 (const int)
+0:?           'v.Position' (layout( location=0) in 4-component vector of float)
+0:11      Sequence
+0:11        move second child to first child ( temp structure{ temp 4-component vector of float Position,  temp 4-component vector of float ClipRect})
+0:11          'flattenTemp' ( temp structure{ temp 4-component vector of float Position,  temp 4-component vector of float ClipRect})
+0:11          Function Call: @main(struct-VS_INPUT-vf41; ( temp structure{ temp 4-component vector of float Position,  temp 4-component vector of float ClipRect})
+0:?             'v' ( temp structure{ temp 4-component vector of float Position})
+0:11        move second child to first child ( temp 4-component vector of float)
+0:?           '@entryPointOutput.Position' ( out 4-component vector of float Position)
+0:11          Position: direct index for structure ( temp 4-component vector of float)
+0:11            'flattenTemp' ( temp structure{ temp 4-component vector of float Position,  temp 4-component vector of float ClipRect})
+0:11            Constant:
+0:11              0 (const int)
+0:?         Sequence
+0:11          move second child to first child ( temp float)
+0:11            direct index ( out float ClipDistance)
+0:?               '@entryPointOutput.ClipRect' ( out 4-element array of float ClipDistance)
+0:11              Constant:
+0:11                0 (const int)
+0:11            direct index ( temp float)
+0:11              ClipRect: direct index for structure ( temp 4-component vector of float)
+0:11                'flattenTemp' ( temp structure{ temp 4-component vector of float Position,  temp 4-component vector of float ClipRect})
+0:11                Constant:
+0:11                  1 (const int)
+0:11              Constant:
+0:11                0 (const int)
+0:11          move second child to first child ( temp float)
+0:11            direct index ( out float ClipDistance)
+0:?               '@entryPointOutput.ClipRect' ( out 4-element array of float ClipDistance)
+0:11              Constant:
+0:11                1 (const int)
+0:11            direct index ( temp float)
+0:11              ClipRect: direct index for structure ( temp 4-component vector of float)
+0:11                'flattenTemp' ( temp structure{ temp 4-component vector of float Position,  temp 4-component vector of float ClipRect})
+0:11                Constant:
+0:11                  1 (const int)
+0:11              Constant:
+0:11                1 (const int)
+0:11          move second child to first child ( temp float)
+0:11            direct index ( out float ClipDistance)
+0:?               '@entryPointOutput.ClipRect' ( out 4-element array of float ClipDistance)
+0:11              Constant:
+0:11                2 (const int)
+0:11            direct index ( temp float)
+0:11              ClipRect: direct index for structure ( temp 4-component vector of float)
+0:11                'flattenTemp' ( temp structure{ temp 4-component vector of float Position,  temp 4-component vector of float ClipRect})
+0:11                Constant:
+0:11                  1 (const int)
+0:11              Constant:
+0:11                2 (const int)
+0:11          move second child to first child ( temp float)
+0:11            direct index ( out float ClipDistance)
+0:?               '@entryPointOutput.ClipRect' ( out 4-element array of float ClipDistance)
+0:11              Constant:
+0:11                3 (const int)
+0:11            direct index ( temp float)
+0:11              ClipRect: direct index for structure ( temp 4-component vector of float)
+0:11                'flattenTemp' ( temp structure{ temp 4-component vector of float Position,  temp 4-component vector of float ClipRect})
+0:11                Constant:
+0:11                  1 (const int)
+0:11              Constant:
+0:11                3 (const int)
+0:?   Linker Objects
+0:?     '@entryPointOutput.Position' ( out 4-component vector of float Position)
+0:?     'v.Position' (layout( location=0) in 4-component vector of float)
+0:?     '@entryPointOutput.ClipRect' ( out 4-element array of float ClipDistance)
+
+
+Linked vertex stage:
+
+
+Shader version: 500
+0:? Sequence
+0:11  Function Definition: @main(struct-VS_INPUT-vf41; ( temp structure{ temp 4-component vector of float Position,  temp 4-component vector of float ClipRect})
+0:11    Function Parameters: 
+0:11      'v' ( const (read only) structure{ temp 4-component vector of float Position})
+0:?     Sequence
+0:13      move second child to first child ( temp 4-component vector of float)
+0:13        Position: direct index for structure ( temp 4-component vector of float)
+0:13          'Output' ( temp structure{ temp 4-component vector of float Position,  temp 4-component vector of float ClipRect})
+0:13          Constant:
+0:13            0 (const int)
+0:13        Constant:
+0:13          0.000000
+0:13          0.000000
+0:13          0.000000
+0:13          0.000000
+0:15      move second child to first child ( temp float)
+0:15        direct index ( temp float)
+0:15          ClipRect: direct index for structure ( temp 4-component vector of float)
+0:15            'Output' ( temp structure{ temp 4-component vector of float Position,  temp 4-component vector of float ClipRect})
+0:15            Constant:
+0:15              1 (const int)
+0:15          Constant:
+0:15            0 (const int)
+0:15        Constant:
+0:15          1.000000
+0:16      move second child to first child ( temp float)
+0:16        direct index ( temp float)
+0:16          ClipRect: direct index for structure ( temp 4-component vector of float)
+0:16            'Output' ( temp structure{ temp 4-component vector of float Position,  temp 4-component vector of float ClipRect})
+0:16            Constant:
+0:16              1 (const int)
+0:16          Constant:
+0:16            1 (const int)
+0:16        Constant:
+0:16          2.000000
+0:17      move second child to first child ( temp float)
+0:17        direct index ( temp float)
+0:17          ClipRect: direct index for structure ( temp 4-component vector of float)
+0:17            'Output' ( temp structure{ temp 4-component vector of float Position,  temp 4-component vector of float ClipRect})
+0:17            Constant:
+0:17              1 (const int)
+0:17          Constant:
+0:17            2 (const int)
+0:17        Constant:
+0:17          3.000000
+0:18      move second child to first child ( temp float)
+0:18        direct index ( temp float)
+0:18          ClipRect: direct index for structure ( temp 4-component vector of float)
+0:18            'Output' ( temp structure{ temp 4-component vector of float Position,  temp 4-component vector of float ClipRect})
+0:18            Constant:
+0:18              1 (const int)
+0:18          Constant:
+0:18            3 (const int)
+0:18        Constant:
+0:18          4.000000
+0:20      Branch: Return with expression
+0:20        'Output' ( temp structure{ temp 4-component vector of float Position,  temp 4-component vector of float ClipRect})
+0:11  Function Definition: main( ( temp void)
+0:11    Function Parameters: 
+0:?     Sequence
+0:11      Sequence
+0:11        move second child to first child ( temp 4-component vector of float)
+0:11          Position: direct index for structure ( temp 4-component vector of float)
+0:?             'v' ( temp structure{ temp 4-component vector of float Position})
+0:11            Constant:
+0:11              0 (const int)
+0:?           'v.Position' (layout( location=0) in 4-component vector of float)
+0:11      Sequence
+0:11        move second child to first child ( temp structure{ temp 4-component vector of float Position,  temp 4-component vector of float ClipRect})
+0:11          'flattenTemp' ( temp structure{ temp 4-component vector of float Position,  temp 4-component vector of float ClipRect})
+0:11          Function Call: @main(struct-VS_INPUT-vf41; ( temp structure{ temp 4-component vector of float Position,  temp 4-component vector of float ClipRect})
+0:?             'v' ( temp structure{ temp 4-component vector of float Position})
+0:11        move second child to first child ( temp 4-component vector of float)
+0:?           '@entryPointOutput.Position' ( out 4-component vector of float Position)
+0:11          Position: direct index for structure ( temp 4-component vector of float)
+0:11            'flattenTemp' ( temp structure{ temp 4-component vector of float Position,  temp 4-component vector of float ClipRect})
+0:11            Constant:
+0:11              0 (const int)
+0:?         Sequence
+0:11          move second child to first child ( temp float)
+0:11            direct index ( out float ClipDistance)
+0:?               '@entryPointOutput.ClipRect' ( out 4-element array of float ClipDistance)
+0:11              Constant:
+0:11                0 (const int)
+0:11            direct index ( temp float)
+0:11              ClipRect: direct index for structure ( temp 4-component vector of float)
+0:11                'flattenTemp' ( temp structure{ temp 4-component vector of float Position,  temp 4-component vector of float ClipRect})
+0:11                Constant:
+0:11                  1 (const int)
+0:11              Constant:
+0:11                0 (const int)
+0:11          move second child to first child ( temp float)
+0:11            direct index ( out float ClipDistance)
+0:?               '@entryPointOutput.ClipRect' ( out 4-element array of float ClipDistance)
+0:11              Constant:
+0:11                1 (const int)
+0:11            direct index ( temp float)
+0:11              ClipRect: direct index for structure ( temp 4-component vector of float)
+0:11                'flattenTemp' ( temp structure{ temp 4-component vector of float Position,  temp 4-component vector of float ClipRect})
+0:11                Constant:
+0:11                  1 (const int)
+0:11              Constant:
+0:11                1 (const int)
+0:11          move second child to first child ( temp float)
+0:11            direct index ( out float ClipDistance)
+0:?               '@entryPointOutput.ClipRect' ( out 4-element array of float ClipDistance)
+0:11              Constant:
+0:11                2 (const int)
+0:11            direct index ( temp float)
+0:11              ClipRect: direct index for structure ( temp 4-component vector of float)
+0:11                'flattenTemp' ( temp structure{ temp 4-component vector of float Position,  temp 4-component vector of float ClipRect})
+0:11                Constant:
+0:11                  1 (const int)
+0:11              Constant:
+0:11                2 (const int)
+0:11          move second child to first child ( temp float)
+0:11            direct index ( out float ClipDistance)
+0:?               '@entryPointOutput.ClipRect' ( out 4-element array of float ClipDistance)
+0:11              Constant:
+0:11                3 (const int)
+0:11            direct index ( temp float)
+0:11              ClipRect: direct index for structure ( temp 4-component vector of float)
+0:11                'flattenTemp' ( temp structure{ temp 4-component vector of float Position,  temp 4-component vector of float ClipRect})
+0:11                Constant:
+0:11                  1 (const int)
+0:11              Constant:
+0:11                3 (const int)
+0:?   Linker Objects
+0:?     '@entryPointOutput.Position' ( out 4-component vector of float Position)
+0:?     'v.Position' (layout( location=0) in 4-component vector of float)
+0:?     '@entryPointOutput.ClipRect' ( out 4-element array of float ClipDistance)
+
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 72
+
+                              Capability Shader
+                              Capability ClipDistance
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Vertex 4  "main" 43 50 56
+                              Source HLSL 500
+                              Name 4  "main"
+                              Name 8  "VS_INPUT"
+                              MemberName 8(VS_INPUT) 0  "Position"
+                              Name 9  "VS_OUTPUT"
+                              MemberName 9(VS_OUTPUT) 0  "Position"
+                              MemberName 9(VS_OUTPUT) 1  "ClipRect"
+                              Name 12  "@main(struct-VS_INPUT-vf41;"
+                              Name 11  "v"
+                              Name 15  "Output"
+                              Name 41  "v"
+                              Name 43  "v.Position"
+                              Name 46  "flattenTemp"
+                              Name 50  "@entryPointOutput.Position"
+                              Name 56  "@entryPointOutput.ClipRect"
+                              Decorate 43(v.Position) Location 0
+                              Decorate 50(@entryPointOutput.Position) BuiltIn Position
+                              Decorate 56(@entryPointOutput.ClipRect) BuiltIn ClipDistance
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+     8(VS_INPUT):             TypeStruct 7(fvec4)
+    9(VS_OUTPUT):             TypeStruct 7(fvec4) 7(fvec4)
+              10:             TypeFunction 9(VS_OUTPUT) 8(VS_INPUT)
+              14:             TypePointer Function 9(VS_OUTPUT)
+              16:             TypeInt 32 1
+              17:     16(int) Constant 0
+              18:    6(float) Constant 0
+              19:    7(fvec4) ConstantComposite 18 18 18 18
+              20:             TypePointer Function 7(fvec4)
+              22:     16(int) Constant 1
+              23:    6(float) Constant 1065353216
+              24:             TypeInt 32 0
+              25:     24(int) Constant 0
+              26:             TypePointer Function 6(float)
+              28:    6(float) Constant 1073741824
+              29:     24(int) Constant 1
+              31:    6(float) Constant 1077936128
+              32:     24(int) Constant 2
+              34:    6(float) Constant 1082130432
+              35:     24(int) Constant 3
+              40:             TypePointer Function 8(VS_INPUT)
+              42:             TypePointer Input 7(fvec4)
+  43(v.Position):     42(ptr) Variable Input
+              49:             TypePointer Output 7(fvec4)
+50(@entryPointOutput.Position):     49(ptr) Variable Output
+              53:     24(int) Constant 4
+              54:             TypeArray 6(float) 53
+              55:             TypePointer Output 54
+56(@entryPointOutput.ClipRect):     55(ptr) Variable Output
+              59:             TypePointer Output 6(float)
+              64:     16(int) Constant 2
+              68:     16(int) Constant 3
+         4(main):           2 Function None 3
+               5:             Label
+           41(v):     40(ptr) Variable Function
+ 46(flattenTemp):     14(ptr) Variable Function
+              44:    7(fvec4) Load 43(v.Position)
+              45:     20(ptr) AccessChain 41(v) 17
+                              Store 45 44
+              47: 8(VS_INPUT) Load 41(v)
+              48:9(VS_OUTPUT) FunctionCall 12(@main(struct-VS_INPUT-vf41;) 47
+                              Store 46(flattenTemp) 48
+              51:     20(ptr) AccessChain 46(flattenTemp) 17
+              52:    7(fvec4) Load 51
+                              Store 50(@entryPointOutput.Position) 52
+              57:     26(ptr) AccessChain 46(flattenTemp) 22 25
+              58:    6(float) Load 57
+              60:     59(ptr) AccessChain 56(@entryPointOutput.ClipRect) 17
+                              Store 60 58
+              61:     26(ptr) AccessChain 46(flattenTemp) 22 29
+              62:    6(float) Load 61
+              63:     59(ptr) AccessChain 56(@entryPointOutput.ClipRect) 22
+                              Store 63 62
+              65:     26(ptr) AccessChain 46(flattenTemp) 22 32
+              66:    6(float) Load 65
+              67:     59(ptr) AccessChain 56(@entryPointOutput.ClipRect) 64
+                              Store 67 66
+              69:     26(ptr) AccessChain 46(flattenTemp) 22 35
+              70:    6(float) Load 69
+              71:     59(ptr) AccessChain 56(@entryPointOutput.ClipRect) 68
+                              Store 71 70
+                              Return
+                              FunctionEnd
+12(@main(struct-VS_INPUT-vf41;):9(VS_OUTPUT) Function None 10
+           11(v): 8(VS_INPUT) FunctionParameter
+              13:             Label
+      15(Output):     14(ptr) Variable Function
+              21:     20(ptr) AccessChain 15(Output) 17
+                              Store 21 19
+              27:     26(ptr) AccessChain 15(Output) 22 25
+                              Store 27 23
+              30:     26(ptr) AccessChain 15(Output) 22 29
+                              Store 30 28
+              33:     26(ptr) AccessChain 15(Output) 22 32
+                              Store 33 31
+              36:     26(ptr) AccessChain 15(Output) 22 35
+                              Store 36 34
+              37:9(VS_OUTPUT) Load 15(Output)
+                              ReturnValue 37
+                              FunctionEnd
diff --git a/Test/baseResults/hlsl.clipdistance-5.frag.out b/Test/baseResults/hlsl.clipdistance-5.frag.out
new file mode 100644
index 0000000..afdd4c4
--- /dev/null
+++ b/Test/baseResults/hlsl.clipdistance-5.frag.out
@@ -0,0 +1,325 @@
+hlsl.clipdistance-5.frag
+Shader version: 500
+gl_FragCoord origin is upper left
+0:? Sequence
+0:7  Function Definition: @main(struct-VS_OUTPUT-vf4-vf2[2]1; ( temp 4-component vector of float)
+0:7    Function Parameters: 
+0:7      'v' ( const (read only) structure{ temp 4-component vector of float Position,  temp 2-element array of 2-component vector of float ClipRect})
+0:?     Sequence
+0:8      Branch: Return with expression
+0:8        add ( temp 4-component vector of float)
+0:8          add ( temp 4-component vector of float)
+0:8            Position: direct index for structure ( temp 4-component vector of float)
+0:8              'v' ( const (read only) structure{ temp 4-component vector of float Position,  temp 2-element array of 2-component vector of float ClipRect})
+0:8              Constant:
+0:8                0 (const int)
+0:8            direct index ( temp float)
+0:8              direct index ( temp 2-component vector of float)
+0:8                ClipRect: direct index for structure ( temp 2-element array of 2-component vector of float)
+0:8                  'v' ( const (read only) structure{ temp 4-component vector of float Position,  temp 2-element array of 2-component vector of float ClipRect})
+0:8                  Constant:
+0:8                    1 (const int)
+0:8                Constant:
+0:8                  0 (const int)
+0:8              Constant:
+0:8                0 (const int)
+0:8          direct index ( temp float)
+0:8            direct index ( temp 2-component vector of float)
+0:8              ClipRect: direct index for structure ( temp 2-element array of 2-component vector of float)
+0:8                'v' ( const (read only) structure{ temp 4-component vector of float Position,  temp 2-element array of 2-component vector of float ClipRect})
+0:8                Constant:
+0:8                  1 (const int)
+0:8              Constant:
+0:8                1 (const int)
+0:8            Constant:
+0:8              0 (const int)
+0:7  Function Definition: main( ( temp void)
+0:7    Function Parameters: 
+0:?     Sequence
+0:7      Sequence
+0:7        move second child to first child ( temp 4-component vector of float)
+0:7          Position: direct index for structure ( temp 4-component vector of float)
+0:?             'v' ( temp structure{ temp 4-component vector of float Position,  temp 2-element array of 2-component vector of float ClipRect})
+0:7            Constant:
+0:7              0 (const int)
+0:?           'v.Position' ( in 4-component vector of float FragCoord)
+0:?         Sequence
+0:7          move second child to first child ( temp float)
+0:7            direct index ( temp float)
+0:7              direct index ( temp 2-component vector of float)
+0:7                ClipRect: direct index for structure ( temp 2-element array of 2-component vector of float)
+0:?                   'v' ( temp structure{ temp 4-component vector of float Position,  temp 2-element array of 2-component vector of float ClipRect})
+0:7                  Constant:
+0:7                    1 (const int)
+0:7                Constant:
+0:7                  0 (const int)
+0:7              Constant:
+0:7                0 (const int)
+0:7            direct index ( in float ClipDistance)
+0:?               'v.ClipRect' ( in 4-element array of float ClipDistance)
+0:7              Constant:
+0:7                0 (const int)
+0:7          move second child to first child ( temp float)
+0:7            direct index ( temp float)
+0:7              direct index ( temp 2-component vector of float)
+0:7                ClipRect: direct index for structure ( temp 2-element array of 2-component vector of float)
+0:?                   'v' ( temp structure{ temp 4-component vector of float Position,  temp 2-element array of 2-component vector of float ClipRect})
+0:7                  Constant:
+0:7                    1 (const int)
+0:7                Constant:
+0:7                  0 (const int)
+0:7              Constant:
+0:7                1 (const int)
+0:7            direct index ( in float ClipDistance)
+0:?               'v.ClipRect' ( in 4-element array of float ClipDistance)
+0:7              Constant:
+0:7                1 (const int)
+0:7          move second child to first child ( temp float)
+0:7            direct index ( temp float)
+0:7              direct index ( temp 2-component vector of float)
+0:7                ClipRect: direct index for structure ( temp 2-element array of 2-component vector of float)
+0:?                   'v' ( temp structure{ temp 4-component vector of float Position,  temp 2-element array of 2-component vector of float ClipRect})
+0:7                  Constant:
+0:7                    1 (const int)
+0:7                Constant:
+0:7                  1 (const int)
+0:7              Constant:
+0:7                0 (const int)
+0:7            direct index ( in float ClipDistance)
+0:?               'v.ClipRect' ( in 4-element array of float ClipDistance)
+0:7              Constant:
+0:7                2 (const int)
+0:7          move second child to first child ( temp float)
+0:7            direct index ( temp float)
+0:7              direct index ( temp 2-component vector of float)
+0:7                ClipRect: direct index for structure ( temp 2-element array of 2-component vector of float)
+0:?                   'v' ( temp structure{ temp 4-component vector of float Position,  temp 2-element array of 2-component vector of float ClipRect})
+0:7                  Constant:
+0:7                    1 (const int)
+0:7                Constant:
+0:7                  1 (const int)
+0:7              Constant:
+0:7                1 (const int)
+0:7            direct index ( in float ClipDistance)
+0:?               'v.ClipRect' ( in 4-element array of float ClipDistance)
+0:7              Constant:
+0:7                3 (const int)
+0:7      move second child to first child ( temp 4-component vector of float)
+0:?         '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+0:7        Function Call: @main(struct-VS_OUTPUT-vf4-vf2[2]1; ( temp 4-component vector of float)
+0:?           'v' ( temp structure{ temp 4-component vector of float Position,  temp 2-element array of 2-component vector of float ClipRect})
+0:?   Linker Objects
+0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+0:?     'v.Position' ( in 4-component vector of float FragCoord)
+0:?     'v.ClipRect' ( in 4-element array of float ClipDistance)
+
+
+Linked fragment stage:
+
+
+Shader version: 500
+gl_FragCoord origin is upper left
+0:? Sequence
+0:7  Function Definition: @main(struct-VS_OUTPUT-vf4-vf2[2]1; ( temp 4-component vector of float)
+0:7    Function Parameters: 
+0:7      'v' ( const (read only) structure{ temp 4-component vector of float Position,  temp 2-element array of 2-component vector of float ClipRect})
+0:?     Sequence
+0:8      Branch: Return with expression
+0:8        add ( temp 4-component vector of float)
+0:8          add ( temp 4-component vector of float)
+0:8            Position: direct index for structure ( temp 4-component vector of float)
+0:8              'v' ( const (read only) structure{ temp 4-component vector of float Position,  temp 2-element array of 2-component vector of float ClipRect})
+0:8              Constant:
+0:8                0 (const int)
+0:8            direct index ( temp float)
+0:8              direct index ( temp 2-component vector of float)
+0:8                ClipRect: direct index for structure ( temp 2-element array of 2-component vector of float)
+0:8                  'v' ( const (read only) structure{ temp 4-component vector of float Position,  temp 2-element array of 2-component vector of float ClipRect})
+0:8                  Constant:
+0:8                    1 (const int)
+0:8                Constant:
+0:8                  0 (const int)
+0:8              Constant:
+0:8                0 (const int)
+0:8          direct index ( temp float)
+0:8            direct index ( temp 2-component vector of float)
+0:8              ClipRect: direct index for structure ( temp 2-element array of 2-component vector of float)
+0:8                'v' ( const (read only) structure{ temp 4-component vector of float Position,  temp 2-element array of 2-component vector of float ClipRect})
+0:8                Constant:
+0:8                  1 (const int)
+0:8              Constant:
+0:8                1 (const int)
+0:8            Constant:
+0:8              0 (const int)
+0:7  Function Definition: main( ( temp void)
+0:7    Function Parameters: 
+0:?     Sequence
+0:7      Sequence
+0:7        move second child to first child ( temp 4-component vector of float)
+0:7          Position: direct index for structure ( temp 4-component vector of float)
+0:?             'v' ( temp structure{ temp 4-component vector of float Position,  temp 2-element array of 2-component vector of float ClipRect})
+0:7            Constant:
+0:7              0 (const int)
+0:?           'v.Position' ( in 4-component vector of float FragCoord)
+0:?         Sequence
+0:7          move second child to first child ( temp float)
+0:7            direct index ( temp float)
+0:7              direct index ( temp 2-component vector of float)
+0:7                ClipRect: direct index for structure ( temp 2-element array of 2-component vector of float)
+0:?                   'v' ( temp structure{ temp 4-component vector of float Position,  temp 2-element array of 2-component vector of float ClipRect})
+0:7                  Constant:
+0:7                    1 (const int)
+0:7                Constant:
+0:7                  0 (const int)
+0:7              Constant:
+0:7                0 (const int)
+0:7            direct index ( in float ClipDistance)
+0:?               'v.ClipRect' ( in 4-element array of float ClipDistance)
+0:7              Constant:
+0:7                0 (const int)
+0:7          move second child to first child ( temp float)
+0:7            direct index ( temp float)
+0:7              direct index ( temp 2-component vector of float)
+0:7                ClipRect: direct index for structure ( temp 2-element array of 2-component vector of float)
+0:?                   'v' ( temp structure{ temp 4-component vector of float Position,  temp 2-element array of 2-component vector of float ClipRect})
+0:7                  Constant:
+0:7                    1 (const int)
+0:7                Constant:
+0:7                  0 (const int)
+0:7              Constant:
+0:7                1 (const int)
+0:7            direct index ( in float ClipDistance)
+0:?               'v.ClipRect' ( in 4-element array of float ClipDistance)
+0:7              Constant:
+0:7                1 (const int)
+0:7          move second child to first child ( temp float)
+0:7            direct index ( temp float)
+0:7              direct index ( temp 2-component vector of float)
+0:7                ClipRect: direct index for structure ( temp 2-element array of 2-component vector of float)
+0:?                   'v' ( temp structure{ temp 4-component vector of float Position,  temp 2-element array of 2-component vector of float ClipRect})
+0:7                  Constant:
+0:7                    1 (const int)
+0:7                Constant:
+0:7                  1 (const int)
+0:7              Constant:
+0:7                0 (const int)
+0:7            direct index ( in float ClipDistance)
+0:?               'v.ClipRect' ( in 4-element array of float ClipDistance)
+0:7              Constant:
+0:7                2 (const int)
+0:7          move second child to first child ( temp float)
+0:7            direct index ( temp float)
+0:7              direct index ( temp 2-component vector of float)
+0:7                ClipRect: direct index for structure ( temp 2-element array of 2-component vector of float)
+0:?                   'v' ( temp structure{ temp 4-component vector of float Position,  temp 2-element array of 2-component vector of float ClipRect})
+0:7                  Constant:
+0:7                    1 (const int)
+0:7                Constant:
+0:7                  1 (const int)
+0:7              Constant:
+0:7                1 (const int)
+0:7            direct index ( in float ClipDistance)
+0:?               'v.ClipRect' ( in 4-element array of float ClipDistance)
+0:7              Constant:
+0:7                3 (const int)
+0:7      move second child to first child ( temp 4-component vector of float)
+0:?         '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+0:7        Function Call: @main(struct-VS_OUTPUT-vf4-vf2[2]1; ( temp 4-component vector of float)
+0:?           'v' ( temp structure{ temp 4-component vector of float Position,  temp 2-element array of 2-component vector of float ClipRect})
+0:?   Linker Objects
+0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+0:?     'v.Position' ( in 4-component vector of float FragCoord)
+0:?     'v.ClipRect' ( in 4-element array of float ClipDistance)
+
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 62
+
+                              Capability Shader
+                              Capability ClipDistance
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 33 40 59
+                              ExecutionMode 4 OriginUpperLeft
+                              Source HLSL 500
+                              Name 4  "main"
+                              Name 12  "VS_OUTPUT"
+                              MemberName 12(VS_OUTPUT) 0  "Position"
+                              MemberName 12(VS_OUTPUT) 1  "ClipRect"
+                              Name 15  "@main(struct-VS_OUTPUT-vf4-vf2[2]1;"
+                              Name 14  "v"
+                              Name 31  "v"
+                              Name 33  "v.Position"
+                              Name 40  "v.ClipRect"
+                              Name 59  "@entryPointOutput"
+                              Decorate 33(v.Position) BuiltIn FragCoord
+                              Decorate 40(v.ClipRect) BuiltIn ClipDistance
+                              Decorate 59(@entryPointOutput) Location 0
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+               8:             TypeVector 6(float) 2
+               9:             TypeInt 32 0
+              10:      9(int) Constant 2
+              11:             TypeArray 8(fvec2) 10
+   12(VS_OUTPUT):             TypeStruct 7(fvec4) 11
+              13:             TypeFunction 7(fvec4) 12(VS_OUTPUT)
+              17:             TypeInt 32 1
+              18:     17(int) Constant 0
+              20:     17(int) Constant 1
+              21:      9(int) Constant 0
+              30:             TypePointer Function 12(VS_OUTPUT)
+              32:             TypePointer Input 7(fvec4)
+  33(v.Position):     32(ptr) Variable Input
+              35:             TypePointer Function 7(fvec4)
+              37:      9(int) Constant 4
+              38:             TypeArray 6(float) 37
+              39:             TypePointer Input 38
+  40(v.ClipRect):     39(ptr) Variable Input
+              41:             TypePointer Input 6(float)
+              44:             TypePointer Function 6(float)
+              48:      9(int) Constant 1
+              50:     17(int) Constant 2
+              54:     17(int) Constant 3
+              58:             TypePointer Output 7(fvec4)
+59(@entryPointOutput):     58(ptr) Variable Output
+         4(main):           2 Function None 3
+               5:             Label
+           31(v):     30(ptr) Variable Function
+              34:    7(fvec4) Load 33(v.Position)
+              36:     35(ptr) AccessChain 31(v) 18
+                              Store 36 34
+              42:     41(ptr) AccessChain 40(v.ClipRect) 18
+              43:    6(float) Load 42
+              45:     44(ptr) AccessChain 31(v) 20 18 21
+                              Store 45 43
+              46:     41(ptr) AccessChain 40(v.ClipRect) 20
+              47:    6(float) Load 46
+              49:     44(ptr) AccessChain 31(v) 20 18 48
+                              Store 49 47
+              51:     41(ptr) AccessChain 40(v.ClipRect) 50
+              52:    6(float) Load 51
+              53:     44(ptr) AccessChain 31(v) 20 20 21
+                              Store 53 52
+              55:     41(ptr) AccessChain 40(v.ClipRect) 54
+              56:    6(float) Load 55
+              57:     44(ptr) AccessChain 31(v) 20 20 48
+                              Store 57 56
+              60:12(VS_OUTPUT) Load 31(v)
+              61:    7(fvec4) FunctionCall 15(@main(struct-VS_OUTPUT-vf4-vf2[2]1;) 60
+                              Store 59(@entryPointOutput) 61
+                              Return
+                              FunctionEnd
+15(@main(struct-VS_OUTPUT-vf4-vf2[2]1;):    7(fvec4) Function None 13
+           14(v):12(VS_OUTPUT) FunctionParameter
+              16:             Label
+              19:    7(fvec4) CompositeExtract 14(v) 0
+              22:    6(float) CompositeExtract 14(v) 1 0 0
+              23:    7(fvec4) CompositeConstruct 22 22 22 22
+              24:    7(fvec4) FAdd 19 23
+              25:    6(float) CompositeExtract 14(v) 1 1 0
+              26:    7(fvec4) CompositeConstruct 25 25 25 25
+              27:    7(fvec4) FAdd 24 26
+                              ReturnValue 27
+                              FunctionEnd
diff --git a/Test/baseResults/hlsl.clipdistance-5.vert.out b/Test/baseResults/hlsl.clipdistance-5.vert.out
new file mode 100644
index 0000000..3e8f1fe
--- /dev/null
+++ b/Test/baseResults/hlsl.clipdistance-5.vert.out
@@ -0,0 +1,431 @@
+hlsl.clipdistance-5.vert
+Shader version: 500
+0:? Sequence
+0:11  Function Definition: @main(struct-VS_INPUT-vf41; ( temp structure{ temp 4-component vector of float Position,  temp 2-element array of 2-component vector of float ClipRect})
+0:11    Function Parameters: 
+0:11      'v' ( const (read only) structure{ temp 4-component vector of float Position})
+0:?     Sequence
+0:13      move second child to first child ( temp 4-component vector of float)
+0:13        Position: direct index for structure ( temp 4-component vector of float)
+0:13          'Output' ( temp structure{ temp 4-component vector of float Position,  temp 2-element array of 2-component vector of float ClipRect})
+0:13          Constant:
+0:13            0 (const int)
+0:13        Constant:
+0:13          0.000000
+0:13          0.000000
+0:13          0.000000
+0:13          0.000000
+0:15      move second child to first child ( temp float)
+0:15        direct index ( temp float)
+0:15          direct index ( temp 2-component vector of float)
+0:15            ClipRect: direct index for structure ( temp 2-element array of 2-component vector of float)
+0:15              'Output' ( temp structure{ temp 4-component vector of float Position,  temp 2-element array of 2-component vector of float ClipRect})
+0:15              Constant:
+0:15                1 (const int)
+0:15            Constant:
+0:15              0 (const int)
+0:15          Constant:
+0:15            0 (const int)
+0:15        Constant:
+0:15          1.000000
+0:16      move second child to first child ( temp float)
+0:16        direct index ( temp float)
+0:16          direct index ( temp 2-component vector of float)
+0:16            ClipRect: direct index for structure ( temp 2-element array of 2-component vector of float)
+0:16              'Output' ( temp structure{ temp 4-component vector of float Position,  temp 2-element array of 2-component vector of float ClipRect})
+0:16              Constant:
+0:16                1 (const int)
+0:16            Constant:
+0:16              0 (const int)
+0:16          Constant:
+0:16            1 (const int)
+0:16        Constant:
+0:16          2.000000
+0:17      move second child to first child ( temp float)
+0:17        direct index ( temp float)
+0:17          direct index ( temp 2-component vector of float)
+0:17            ClipRect: direct index for structure ( temp 2-element array of 2-component vector of float)
+0:17              'Output' ( temp structure{ temp 4-component vector of float Position,  temp 2-element array of 2-component vector of float ClipRect})
+0:17              Constant:
+0:17                1 (const int)
+0:17            Constant:
+0:17              1 (const int)
+0:17          Constant:
+0:17            0 (const int)
+0:17        Constant:
+0:17          3.000000
+0:18      move second child to first child ( temp float)
+0:18        direct index ( temp float)
+0:18          direct index ( temp 2-component vector of float)
+0:18            ClipRect: direct index for structure ( temp 2-element array of 2-component vector of float)
+0:18              'Output' ( temp structure{ temp 4-component vector of float Position,  temp 2-element array of 2-component vector of float ClipRect})
+0:18              Constant:
+0:18                1 (const int)
+0:18            Constant:
+0:18              1 (const int)
+0:18          Constant:
+0:18            1 (const int)
+0:18        Constant:
+0:18          4.000000
+0:20      Branch: Return with expression
+0:20        'Output' ( temp structure{ temp 4-component vector of float Position,  temp 2-element array of 2-component vector of float ClipRect})
+0:11  Function Definition: main( ( temp void)
+0:11    Function Parameters: 
+0:?     Sequence
+0:11      Sequence
+0:11        move second child to first child ( temp 4-component vector of float)
+0:11          Position: direct index for structure ( temp 4-component vector of float)
+0:?             'v' ( temp structure{ temp 4-component vector of float Position})
+0:11            Constant:
+0:11              0 (const int)
+0:?           'v.Position' (layout( location=0) in 4-component vector of float)
+0:11      Sequence
+0:11        move second child to first child ( temp structure{ temp 4-component vector of float Position,  temp 2-element array of 2-component vector of float ClipRect})
+0:11          'flattenTemp' ( temp structure{ temp 4-component vector of float Position,  temp 2-element array of 2-component vector of float ClipRect})
+0:11          Function Call: @main(struct-VS_INPUT-vf41; ( temp structure{ temp 4-component vector of float Position,  temp 2-element array of 2-component vector of float ClipRect})
+0:?             'v' ( temp structure{ temp 4-component vector of float Position})
+0:11        move second child to first child ( temp 4-component vector of float)
+0:?           '@entryPointOutput.Position' ( out 4-component vector of float Position)
+0:11          Position: direct index for structure ( temp 4-component vector of float)
+0:11            'flattenTemp' ( temp structure{ temp 4-component vector of float Position,  temp 2-element array of 2-component vector of float ClipRect})
+0:11            Constant:
+0:11              0 (const int)
+0:?         Sequence
+0:11          move second child to first child ( temp float)
+0:11            direct index ( out float ClipDistance)
+0:?               '@entryPointOutput.ClipRect' ( out 4-element array of float ClipDistance)
+0:11              Constant:
+0:11                0 (const int)
+0:11            direct index ( temp float)
+0:11              direct index ( temp 2-component vector of float)
+0:11                ClipRect: direct index for structure ( temp 2-element array of 2-component vector of float)
+0:11                  'flattenTemp' ( temp structure{ temp 4-component vector of float Position,  temp 2-element array of 2-component vector of float ClipRect})
+0:11                  Constant:
+0:11                    1 (const int)
+0:11                Constant:
+0:11                  0 (const int)
+0:11              Constant:
+0:11                0 (const int)
+0:11          move second child to first child ( temp float)
+0:11            direct index ( out float ClipDistance)
+0:?               '@entryPointOutput.ClipRect' ( out 4-element array of float ClipDistance)
+0:11              Constant:
+0:11                1 (const int)
+0:11            direct index ( temp float)
+0:11              direct index ( temp 2-component vector of float)
+0:11                ClipRect: direct index for structure ( temp 2-element array of 2-component vector of float)
+0:11                  'flattenTemp' ( temp structure{ temp 4-component vector of float Position,  temp 2-element array of 2-component vector of float ClipRect})
+0:11                  Constant:
+0:11                    1 (const int)
+0:11                Constant:
+0:11                  0 (const int)
+0:11              Constant:
+0:11                1 (const int)
+0:11          move second child to first child ( temp float)
+0:11            direct index ( out float ClipDistance)
+0:?               '@entryPointOutput.ClipRect' ( out 4-element array of float ClipDistance)
+0:11              Constant:
+0:11                2 (const int)
+0:11            direct index ( temp float)
+0:11              direct index ( temp 2-component vector of float)
+0:11                ClipRect: direct index for structure ( temp 2-element array of 2-component vector of float)
+0:11                  'flattenTemp' ( temp structure{ temp 4-component vector of float Position,  temp 2-element array of 2-component vector of float ClipRect})
+0:11                  Constant:
+0:11                    1 (const int)
+0:11                Constant:
+0:11                  1 (const int)
+0:11              Constant:
+0:11                0 (const int)
+0:11          move second child to first child ( temp float)
+0:11            direct index ( out float ClipDistance)
+0:?               '@entryPointOutput.ClipRect' ( out 4-element array of float ClipDistance)
+0:11              Constant:
+0:11                3 (const int)
+0:11            direct index ( temp float)
+0:11              direct index ( temp 2-component vector of float)
+0:11                ClipRect: direct index for structure ( temp 2-element array of 2-component vector of float)
+0:11                  'flattenTemp' ( temp structure{ temp 4-component vector of float Position,  temp 2-element array of 2-component vector of float ClipRect})
+0:11                  Constant:
+0:11                    1 (const int)
+0:11                Constant:
+0:11                  1 (const int)
+0:11              Constant:
+0:11                1 (const int)
+0:?   Linker Objects
+0:?     '@entryPointOutput.Position' ( out 4-component vector of float Position)
+0:?     'v.Position' (layout( location=0) in 4-component vector of float)
+0:?     '@entryPointOutput.ClipRect' ( out 4-element array of float ClipDistance)
+
+
+Linked vertex stage:
+
+
+Shader version: 500
+0:? Sequence
+0:11  Function Definition: @main(struct-VS_INPUT-vf41; ( temp structure{ temp 4-component vector of float Position,  temp 2-element array of 2-component vector of float ClipRect})
+0:11    Function Parameters: 
+0:11      'v' ( const (read only) structure{ temp 4-component vector of float Position})
+0:?     Sequence
+0:13      move second child to first child ( temp 4-component vector of float)
+0:13        Position: direct index for structure ( temp 4-component vector of float)
+0:13          'Output' ( temp structure{ temp 4-component vector of float Position,  temp 2-element array of 2-component vector of float ClipRect})
+0:13          Constant:
+0:13            0 (const int)
+0:13        Constant:
+0:13          0.000000
+0:13          0.000000
+0:13          0.000000
+0:13          0.000000
+0:15      move second child to first child ( temp float)
+0:15        direct index ( temp float)
+0:15          direct index ( temp 2-component vector of float)
+0:15            ClipRect: direct index for structure ( temp 2-element array of 2-component vector of float)
+0:15              'Output' ( temp structure{ temp 4-component vector of float Position,  temp 2-element array of 2-component vector of float ClipRect})
+0:15              Constant:
+0:15                1 (const int)
+0:15            Constant:
+0:15              0 (const int)
+0:15          Constant:
+0:15            0 (const int)
+0:15        Constant:
+0:15          1.000000
+0:16      move second child to first child ( temp float)
+0:16        direct index ( temp float)
+0:16          direct index ( temp 2-component vector of float)
+0:16            ClipRect: direct index for structure ( temp 2-element array of 2-component vector of float)
+0:16              'Output' ( temp structure{ temp 4-component vector of float Position,  temp 2-element array of 2-component vector of float ClipRect})
+0:16              Constant:
+0:16                1 (const int)
+0:16            Constant:
+0:16              0 (const int)
+0:16          Constant:
+0:16            1 (const int)
+0:16        Constant:
+0:16          2.000000
+0:17      move second child to first child ( temp float)
+0:17        direct index ( temp float)
+0:17          direct index ( temp 2-component vector of float)
+0:17            ClipRect: direct index for structure ( temp 2-element array of 2-component vector of float)
+0:17              'Output' ( temp structure{ temp 4-component vector of float Position,  temp 2-element array of 2-component vector of float ClipRect})
+0:17              Constant:
+0:17                1 (const int)
+0:17            Constant:
+0:17              1 (const int)
+0:17          Constant:
+0:17            0 (const int)
+0:17        Constant:
+0:17          3.000000
+0:18      move second child to first child ( temp float)
+0:18        direct index ( temp float)
+0:18          direct index ( temp 2-component vector of float)
+0:18            ClipRect: direct index for structure ( temp 2-element array of 2-component vector of float)
+0:18              'Output' ( temp structure{ temp 4-component vector of float Position,  temp 2-element array of 2-component vector of float ClipRect})
+0:18              Constant:
+0:18                1 (const int)
+0:18            Constant:
+0:18              1 (const int)
+0:18          Constant:
+0:18            1 (const int)
+0:18        Constant:
+0:18          4.000000
+0:20      Branch: Return with expression
+0:20        'Output' ( temp structure{ temp 4-component vector of float Position,  temp 2-element array of 2-component vector of float ClipRect})
+0:11  Function Definition: main( ( temp void)
+0:11    Function Parameters: 
+0:?     Sequence
+0:11      Sequence
+0:11        move second child to first child ( temp 4-component vector of float)
+0:11          Position: direct index for structure ( temp 4-component vector of float)
+0:?             'v' ( temp structure{ temp 4-component vector of float Position})
+0:11            Constant:
+0:11              0 (const int)
+0:?           'v.Position' (layout( location=0) in 4-component vector of float)
+0:11      Sequence
+0:11        move second child to first child ( temp structure{ temp 4-component vector of float Position,  temp 2-element array of 2-component vector of float ClipRect})
+0:11          'flattenTemp' ( temp structure{ temp 4-component vector of float Position,  temp 2-element array of 2-component vector of float ClipRect})
+0:11          Function Call: @main(struct-VS_INPUT-vf41; ( temp structure{ temp 4-component vector of float Position,  temp 2-element array of 2-component vector of float ClipRect})
+0:?             'v' ( temp structure{ temp 4-component vector of float Position})
+0:11        move second child to first child ( temp 4-component vector of float)
+0:?           '@entryPointOutput.Position' ( out 4-component vector of float Position)
+0:11          Position: direct index for structure ( temp 4-component vector of float)
+0:11            'flattenTemp' ( temp structure{ temp 4-component vector of float Position,  temp 2-element array of 2-component vector of float ClipRect})
+0:11            Constant:
+0:11              0 (const int)
+0:?         Sequence
+0:11          move second child to first child ( temp float)
+0:11            direct index ( out float ClipDistance)
+0:?               '@entryPointOutput.ClipRect' ( out 4-element array of float ClipDistance)
+0:11              Constant:
+0:11                0 (const int)
+0:11            direct index ( temp float)
+0:11              direct index ( temp 2-component vector of float)
+0:11                ClipRect: direct index for structure ( temp 2-element array of 2-component vector of float)
+0:11                  'flattenTemp' ( temp structure{ temp 4-component vector of float Position,  temp 2-element array of 2-component vector of float ClipRect})
+0:11                  Constant:
+0:11                    1 (const int)
+0:11                Constant:
+0:11                  0 (const int)
+0:11              Constant:
+0:11                0 (const int)
+0:11          move second child to first child ( temp float)
+0:11            direct index ( out float ClipDistance)
+0:?               '@entryPointOutput.ClipRect' ( out 4-element array of float ClipDistance)
+0:11              Constant:
+0:11                1 (const int)
+0:11            direct index ( temp float)
+0:11              direct index ( temp 2-component vector of float)
+0:11                ClipRect: direct index for structure ( temp 2-element array of 2-component vector of float)
+0:11                  'flattenTemp' ( temp structure{ temp 4-component vector of float Position,  temp 2-element array of 2-component vector of float ClipRect})
+0:11                  Constant:
+0:11                    1 (const int)
+0:11                Constant:
+0:11                  0 (const int)
+0:11              Constant:
+0:11                1 (const int)
+0:11          move second child to first child ( temp float)
+0:11            direct index ( out float ClipDistance)
+0:?               '@entryPointOutput.ClipRect' ( out 4-element array of float ClipDistance)
+0:11              Constant:
+0:11                2 (const int)
+0:11            direct index ( temp float)
+0:11              direct index ( temp 2-component vector of float)
+0:11                ClipRect: direct index for structure ( temp 2-element array of 2-component vector of float)
+0:11                  'flattenTemp' ( temp structure{ temp 4-component vector of float Position,  temp 2-element array of 2-component vector of float ClipRect})
+0:11                  Constant:
+0:11                    1 (const int)
+0:11                Constant:
+0:11                  1 (const int)
+0:11              Constant:
+0:11                0 (const int)
+0:11          move second child to first child ( temp float)
+0:11            direct index ( out float ClipDistance)
+0:?               '@entryPointOutput.ClipRect' ( out 4-element array of float ClipDistance)
+0:11              Constant:
+0:11                3 (const int)
+0:11            direct index ( temp float)
+0:11              direct index ( temp 2-component vector of float)
+0:11                ClipRect: direct index for structure ( temp 2-element array of 2-component vector of float)
+0:11                  'flattenTemp' ( temp structure{ temp 4-component vector of float Position,  temp 2-element array of 2-component vector of float ClipRect})
+0:11                  Constant:
+0:11                    1 (const int)
+0:11                Constant:
+0:11                  1 (const int)
+0:11              Constant:
+0:11                1 (const int)
+0:?   Linker Objects
+0:?     '@entryPointOutput.Position' ( out 4-component vector of float Position)
+0:?     'v.Position' (layout( location=0) in 4-component vector of float)
+0:?     '@entryPointOutput.ClipRect' ( out 4-element array of float ClipDistance)
+
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 73
+
+                              Capability Shader
+                              Capability ClipDistance
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Vertex 4  "main" 44 51 57
+                              Source HLSL 500
+                              Name 4  "main"
+                              Name 8  "VS_INPUT"
+                              MemberName 8(VS_INPUT) 0  "Position"
+                              Name 13  "VS_OUTPUT"
+                              MemberName 13(VS_OUTPUT) 0  "Position"
+                              MemberName 13(VS_OUTPUT) 1  "ClipRect"
+                              Name 16  "@main(struct-VS_INPUT-vf41;"
+                              Name 15  "v"
+                              Name 19  "Output"
+                              Name 42  "v"
+                              Name 44  "v.Position"
+                              Name 47  "flattenTemp"
+                              Name 51  "@entryPointOutput.Position"
+                              Name 57  "@entryPointOutput.ClipRect"
+                              Decorate 44(v.Position) Location 0
+                              Decorate 51(@entryPointOutput.Position) BuiltIn Position
+                              Decorate 57(@entryPointOutput.ClipRect) BuiltIn ClipDistance
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+     8(VS_INPUT):             TypeStruct 7(fvec4)
+               9:             TypeVector 6(float) 2
+              10:             TypeInt 32 0
+              11:     10(int) Constant 2
+              12:             TypeArray 9(fvec2) 11
+   13(VS_OUTPUT):             TypeStruct 7(fvec4) 12
+              14:             TypeFunction 13(VS_OUTPUT) 8(VS_INPUT)
+              18:             TypePointer Function 13(VS_OUTPUT)
+              20:             TypeInt 32 1
+              21:     20(int) Constant 0
+              22:    6(float) Constant 0
+              23:    7(fvec4) ConstantComposite 22 22 22 22
+              24:             TypePointer Function 7(fvec4)
+              26:     20(int) Constant 1
+              27:    6(float) Constant 1065353216
+              28:     10(int) Constant 0
+              29:             TypePointer Function 6(float)
+              31:    6(float) Constant 1073741824
+              32:     10(int) Constant 1
+              34:    6(float) Constant 1077936128
+              36:    6(float) Constant 1082130432
+              41:             TypePointer Function 8(VS_INPUT)
+              43:             TypePointer Input 7(fvec4)
+  44(v.Position):     43(ptr) Variable Input
+              50:             TypePointer Output 7(fvec4)
+51(@entryPointOutput.Position):     50(ptr) Variable Output
+              54:     10(int) Constant 4
+              55:             TypeArray 6(float) 54
+              56:             TypePointer Output 55
+57(@entryPointOutput.ClipRect):     56(ptr) Variable Output
+              60:             TypePointer Output 6(float)
+              65:     20(int) Constant 2
+              69:     20(int) Constant 3
+         4(main):           2 Function None 3
+               5:             Label
+           42(v):     41(ptr) Variable Function
+ 47(flattenTemp):     18(ptr) Variable Function
+              45:    7(fvec4) Load 44(v.Position)
+              46:     24(ptr) AccessChain 42(v) 21
+                              Store 46 45
+              48: 8(VS_INPUT) Load 42(v)
+              49:13(VS_OUTPUT) FunctionCall 16(@main(struct-VS_INPUT-vf41;) 48
+                              Store 47(flattenTemp) 49
+              52:     24(ptr) AccessChain 47(flattenTemp) 21
+              53:    7(fvec4) Load 52
+                              Store 51(@entryPointOutput.Position) 53
+              58:     29(ptr) AccessChain 47(flattenTemp) 26 21 28
+              59:    6(float) Load 58
+              61:     60(ptr) AccessChain 57(@entryPointOutput.ClipRect) 21
+                              Store 61 59
+              62:     29(ptr) AccessChain 47(flattenTemp) 26 21 32
+              63:    6(float) Load 62
+              64:     60(ptr) AccessChain 57(@entryPointOutput.ClipRect) 26
+                              Store 64 63
+              66:     29(ptr) AccessChain 47(flattenTemp) 26 26 28
+              67:    6(float) Load 66
+              68:     60(ptr) AccessChain 57(@entryPointOutput.ClipRect) 65
+                              Store 68 67
+              70:     29(ptr) AccessChain 47(flattenTemp) 26 26 32
+              71:    6(float) Load 70
+              72:     60(ptr) AccessChain 57(@entryPointOutput.ClipRect) 69
+                              Store 72 71
+                              Return
+                              FunctionEnd
+16(@main(struct-VS_INPUT-vf41;):13(VS_OUTPUT) Function None 14
+           15(v): 8(VS_INPUT) FunctionParameter
+              17:             Label
+      19(Output):     18(ptr) Variable Function
+              25:     24(ptr) AccessChain 19(Output) 21
+                              Store 25 23
+              30:     29(ptr) AccessChain 19(Output) 26 21 28
+                              Store 30 27
+              33:     29(ptr) AccessChain 19(Output) 26 21 32
+                              Store 33 31
+              35:     29(ptr) AccessChain 19(Output) 26 26 28
+                              Store 35 34
+              37:     29(ptr) AccessChain 19(Output) 26 26 32
+                              Store 37 36
+              38:13(VS_OUTPUT) Load 19(Output)
+                              ReturnValue 38
+                              FunctionEnd
diff --git a/Test/baseResults/hlsl.clipdistance-6.frag.out b/Test/baseResults/hlsl.clipdistance-6.frag.out
new file mode 100644
index 0000000..3ee8065
--- /dev/null
+++ b/Test/baseResults/hlsl.clipdistance-6.frag.out
@@ -0,0 +1,399 @@
+hlsl.clipdistance-6.frag
+Shader version: 500
+gl_FragCoord origin is upper left
+0:? Sequence
+0:8  Function Definition: @main(struct-VS_OUTPUT-vf4-vf4-vf41; ( temp 4-component vector of float)
+0:8    Function Parameters: 
+0:8      'v' ( in structure{ temp 4-component vector of float Position,  temp 4-component vector of float clip0,  temp 4-component vector of float clip1})
+0:?     Sequence
+0:9      Branch: Return with expression
+0:9        add ( temp 4-component vector of float)
+0:9          add ( temp 4-component vector of float)
+0:9            Position: direct index for structure ( temp 4-component vector of float)
+0:9              'v' ( in structure{ temp 4-component vector of float Position,  temp 4-component vector of float clip0,  temp 4-component vector of float clip1})
+0:9              Constant:
+0:9                0 (const int)
+0:9            clip0: direct index for structure ( temp 4-component vector of float)
+0:9              'v' ( in structure{ temp 4-component vector of float Position,  temp 4-component vector of float clip0,  temp 4-component vector of float clip1})
+0:9              Constant:
+0:9                1 (const int)
+0:9          clip1: direct index for structure ( temp 4-component vector of float)
+0:9            'v' ( in structure{ temp 4-component vector of float Position,  temp 4-component vector of float clip0,  temp 4-component vector of float clip1})
+0:9            Constant:
+0:9              2 (const int)
+0:8  Function Definition: main( ( temp void)
+0:8    Function Parameters: 
+0:?     Sequence
+0:8      Sequence
+0:8        move second child to first child ( temp 4-component vector of float)
+0:8          Position: direct index for structure ( temp 4-component vector of float)
+0:?             'v' ( temp structure{ temp 4-component vector of float Position,  temp 4-component vector of float clip0,  temp 4-component vector of float clip1})
+0:8            Constant:
+0:8              0 (const int)
+0:?           'v.Position' ( in 4-component vector of float FragCoord)
+0:?         Sequence
+0:8          move second child to first child ( temp float)
+0:8            direct index ( temp float)
+0:8              clip0: direct index for structure ( temp 4-component vector of float)
+0:?                 'v' ( temp structure{ temp 4-component vector of float Position,  temp 4-component vector of float clip0,  temp 4-component vector of float clip1})
+0:8                Constant:
+0:8                  1 (const int)
+0:8              Constant:
+0:8                0 (const int)
+0:8            direct index ( in float ClipDistance)
+0:?               'v.clip1' ( in 8-element array of float ClipDistance)
+0:8              Constant:
+0:8                0 (const int)
+0:8          move second child to first child ( temp float)
+0:8            direct index ( temp float)
+0:8              clip0: direct index for structure ( temp 4-component vector of float)
+0:?                 'v' ( temp structure{ temp 4-component vector of float Position,  temp 4-component vector of float clip0,  temp 4-component vector of float clip1})
+0:8                Constant:
+0:8                  1 (const int)
+0:8              Constant:
+0:8                1 (const int)
+0:8            direct index ( in float ClipDistance)
+0:?               'v.clip1' ( in 8-element array of float ClipDistance)
+0:8              Constant:
+0:8                1 (const int)
+0:8          move second child to first child ( temp float)
+0:8            direct index ( temp float)
+0:8              clip0: direct index for structure ( temp 4-component vector of float)
+0:?                 'v' ( temp structure{ temp 4-component vector of float Position,  temp 4-component vector of float clip0,  temp 4-component vector of float clip1})
+0:8                Constant:
+0:8                  1 (const int)
+0:8              Constant:
+0:8                2 (const int)
+0:8            direct index ( in float ClipDistance)
+0:?               'v.clip1' ( in 8-element array of float ClipDistance)
+0:8              Constant:
+0:8                2 (const int)
+0:8          move second child to first child ( temp float)
+0:8            direct index ( temp float)
+0:8              clip0: direct index for structure ( temp 4-component vector of float)
+0:?                 'v' ( temp structure{ temp 4-component vector of float Position,  temp 4-component vector of float clip0,  temp 4-component vector of float clip1})
+0:8                Constant:
+0:8                  1 (const int)
+0:8              Constant:
+0:8                3 (const int)
+0:8            direct index ( in float ClipDistance)
+0:?               'v.clip1' ( in 8-element array of float ClipDistance)
+0:8              Constant:
+0:8                3 (const int)
+0:?         Sequence
+0:8          move second child to first child ( temp float)
+0:8            direct index ( temp float)
+0:8              clip1: direct index for structure ( temp 4-component vector of float)
+0:?                 'v' ( temp structure{ temp 4-component vector of float Position,  temp 4-component vector of float clip0,  temp 4-component vector of float clip1})
+0:8                Constant:
+0:8                  2 (const int)
+0:8              Constant:
+0:8                0 (const int)
+0:8            direct index ( in float ClipDistance)
+0:?               'v.clip1' ( in 8-element array of float ClipDistance)
+0:8              Constant:
+0:8                4 (const int)
+0:8          move second child to first child ( temp float)
+0:8            direct index ( temp float)
+0:8              clip1: direct index for structure ( temp 4-component vector of float)
+0:?                 'v' ( temp structure{ temp 4-component vector of float Position,  temp 4-component vector of float clip0,  temp 4-component vector of float clip1})
+0:8                Constant:
+0:8                  2 (const int)
+0:8              Constant:
+0:8                1 (const int)
+0:8            direct index ( in float ClipDistance)
+0:?               'v.clip1' ( in 8-element array of float ClipDistance)
+0:8              Constant:
+0:8                5 (const int)
+0:8          move second child to first child ( temp float)
+0:8            direct index ( temp float)
+0:8              clip1: direct index for structure ( temp 4-component vector of float)
+0:?                 'v' ( temp structure{ temp 4-component vector of float Position,  temp 4-component vector of float clip0,  temp 4-component vector of float clip1})
+0:8                Constant:
+0:8                  2 (const int)
+0:8              Constant:
+0:8                2 (const int)
+0:8            direct index ( in float ClipDistance)
+0:?               'v.clip1' ( in 8-element array of float ClipDistance)
+0:8              Constant:
+0:8                6 (const int)
+0:8          move second child to first child ( temp float)
+0:8            direct index ( temp float)
+0:8              clip1: direct index for structure ( temp 4-component vector of float)
+0:?                 'v' ( temp structure{ temp 4-component vector of float Position,  temp 4-component vector of float clip0,  temp 4-component vector of float clip1})
+0:8                Constant:
+0:8                  2 (const int)
+0:8              Constant:
+0:8                3 (const int)
+0:8            direct index ( in float ClipDistance)
+0:?               'v.clip1' ( in 8-element array of float ClipDistance)
+0:8              Constant:
+0:8                7 (const int)
+0:8      move second child to first child ( temp 4-component vector of float)
+0:?         '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+0:8        Function Call: @main(struct-VS_OUTPUT-vf4-vf4-vf41; ( temp 4-component vector of float)
+0:?           'v' ( temp structure{ temp 4-component vector of float Position,  temp 4-component vector of float clip0,  temp 4-component vector of float clip1})
+0:?   Linker Objects
+0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+0:?     'v.Position' ( in 4-component vector of float FragCoord)
+0:?     'v.clip1' ( in 8-element array of float ClipDistance)
+
+
+Linked fragment stage:
+
+
+Shader version: 500
+gl_FragCoord origin is upper left
+0:? Sequence
+0:8  Function Definition: @main(struct-VS_OUTPUT-vf4-vf4-vf41; ( temp 4-component vector of float)
+0:8    Function Parameters: 
+0:8      'v' ( in structure{ temp 4-component vector of float Position,  temp 4-component vector of float clip0,  temp 4-component vector of float clip1})
+0:?     Sequence
+0:9      Branch: Return with expression
+0:9        add ( temp 4-component vector of float)
+0:9          add ( temp 4-component vector of float)
+0:9            Position: direct index for structure ( temp 4-component vector of float)
+0:9              'v' ( in structure{ temp 4-component vector of float Position,  temp 4-component vector of float clip0,  temp 4-component vector of float clip1})
+0:9              Constant:
+0:9                0 (const int)
+0:9            clip0: direct index for structure ( temp 4-component vector of float)
+0:9              'v' ( in structure{ temp 4-component vector of float Position,  temp 4-component vector of float clip0,  temp 4-component vector of float clip1})
+0:9              Constant:
+0:9                1 (const int)
+0:9          clip1: direct index for structure ( temp 4-component vector of float)
+0:9            'v' ( in structure{ temp 4-component vector of float Position,  temp 4-component vector of float clip0,  temp 4-component vector of float clip1})
+0:9            Constant:
+0:9              2 (const int)
+0:8  Function Definition: main( ( temp void)
+0:8    Function Parameters: 
+0:?     Sequence
+0:8      Sequence
+0:8        move second child to first child ( temp 4-component vector of float)
+0:8          Position: direct index for structure ( temp 4-component vector of float)
+0:?             'v' ( temp structure{ temp 4-component vector of float Position,  temp 4-component vector of float clip0,  temp 4-component vector of float clip1})
+0:8            Constant:
+0:8              0 (const int)
+0:?           'v.Position' ( in 4-component vector of float FragCoord)
+0:?         Sequence
+0:8          move second child to first child ( temp float)
+0:8            direct index ( temp float)
+0:8              clip0: direct index for structure ( temp 4-component vector of float)
+0:?                 'v' ( temp structure{ temp 4-component vector of float Position,  temp 4-component vector of float clip0,  temp 4-component vector of float clip1})
+0:8                Constant:
+0:8                  1 (const int)
+0:8              Constant:
+0:8                0 (const int)
+0:8            direct index ( in float ClipDistance)
+0:?               'v.clip1' ( in 8-element array of float ClipDistance)
+0:8              Constant:
+0:8                0 (const int)
+0:8          move second child to first child ( temp float)
+0:8            direct index ( temp float)
+0:8              clip0: direct index for structure ( temp 4-component vector of float)
+0:?                 'v' ( temp structure{ temp 4-component vector of float Position,  temp 4-component vector of float clip0,  temp 4-component vector of float clip1})
+0:8                Constant:
+0:8                  1 (const int)
+0:8              Constant:
+0:8                1 (const int)
+0:8            direct index ( in float ClipDistance)
+0:?               'v.clip1' ( in 8-element array of float ClipDistance)
+0:8              Constant:
+0:8                1 (const int)
+0:8          move second child to first child ( temp float)
+0:8            direct index ( temp float)
+0:8              clip0: direct index for structure ( temp 4-component vector of float)
+0:?                 'v' ( temp structure{ temp 4-component vector of float Position,  temp 4-component vector of float clip0,  temp 4-component vector of float clip1})
+0:8                Constant:
+0:8                  1 (const int)
+0:8              Constant:
+0:8                2 (const int)
+0:8            direct index ( in float ClipDistance)
+0:?               'v.clip1' ( in 8-element array of float ClipDistance)
+0:8              Constant:
+0:8                2 (const int)
+0:8          move second child to first child ( temp float)
+0:8            direct index ( temp float)
+0:8              clip0: direct index for structure ( temp 4-component vector of float)
+0:?                 'v' ( temp structure{ temp 4-component vector of float Position,  temp 4-component vector of float clip0,  temp 4-component vector of float clip1})
+0:8                Constant:
+0:8                  1 (const int)
+0:8              Constant:
+0:8                3 (const int)
+0:8            direct index ( in float ClipDistance)
+0:?               'v.clip1' ( in 8-element array of float ClipDistance)
+0:8              Constant:
+0:8                3 (const int)
+0:?         Sequence
+0:8          move second child to first child ( temp float)
+0:8            direct index ( temp float)
+0:8              clip1: direct index for structure ( temp 4-component vector of float)
+0:?                 'v' ( temp structure{ temp 4-component vector of float Position,  temp 4-component vector of float clip0,  temp 4-component vector of float clip1})
+0:8                Constant:
+0:8                  2 (const int)
+0:8              Constant:
+0:8                0 (const int)
+0:8            direct index ( in float ClipDistance)
+0:?               'v.clip1' ( in 8-element array of float ClipDistance)
+0:8              Constant:
+0:8                4 (const int)
+0:8          move second child to first child ( temp float)
+0:8            direct index ( temp float)
+0:8              clip1: direct index for structure ( temp 4-component vector of float)
+0:?                 'v' ( temp structure{ temp 4-component vector of float Position,  temp 4-component vector of float clip0,  temp 4-component vector of float clip1})
+0:8                Constant:
+0:8                  2 (const int)
+0:8              Constant:
+0:8                1 (const int)
+0:8            direct index ( in float ClipDistance)
+0:?               'v.clip1' ( in 8-element array of float ClipDistance)
+0:8              Constant:
+0:8                5 (const int)
+0:8          move second child to first child ( temp float)
+0:8            direct index ( temp float)
+0:8              clip1: direct index for structure ( temp 4-component vector of float)
+0:?                 'v' ( temp structure{ temp 4-component vector of float Position,  temp 4-component vector of float clip0,  temp 4-component vector of float clip1})
+0:8                Constant:
+0:8                  2 (const int)
+0:8              Constant:
+0:8                2 (const int)
+0:8            direct index ( in float ClipDistance)
+0:?               'v.clip1' ( in 8-element array of float ClipDistance)
+0:8              Constant:
+0:8                6 (const int)
+0:8          move second child to first child ( temp float)
+0:8            direct index ( temp float)
+0:8              clip1: direct index for structure ( temp 4-component vector of float)
+0:?                 'v' ( temp structure{ temp 4-component vector of float Position,  temp 4-component vector of float clip0,  temp 4-component vector of float clip1})
+0:8                Constant:
+0:8                  2 (const int)
+0:8              Constant:
+0:8                3 (const int)
+0:8            direct index ( in float ClipDistance)
+0:?               'v.clip1' ( in 8-element array of float ClipDistance)
+0:8              Constant:
+0:8                7 (const int)
+0:8      move second child to first child ( temp 4-component vector of float)
+0:?         '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+0:8        Function Call: @main(struct-VS_OUTPUT-vf4-vf4-vf41; ( temp 4-component vector of float)
+0:?           'v' ( temp structure{ temp 4-component vector of float Position,  temp 4-component vector of float clip0,  temp 4-component vector of float clip1})
+0:?   Linker Objects
+0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+0:?     'v.Position' ( in 4-component vector of float FragCoord)
+0:?     'v.clip1' ( in 8-element array of float ClipDistance)
+
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 79
+
+                              Capability Shader
+                              Capability ClipDistance
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 31 38 75
+                              ExecutionMode 4 OriginUpperLeft
+                              Source HLSL 500
+                              Name 4  "main"
+                              Name 8  "VS_OUTPUT"
+                              MemberName 8(VS_OUTPUT) 0  "Position"
+                              MemberName 8(VS_OUTPUT) 1  "clip0"
+                              MemberName 8(VS_OUTPUT) 2  "clip1"
+                              Name 12  "@main(struct-VS_OUTPUT-vf4-vf4-vf41;"
+                              Name 11  "v"
+                              Name 29  "v"
+                              Name 31  "v.Position"
+                              Name 38  "v.clip1"
+                              Name 75  "@entryPointOutput"
+                              Name 76  "param"
+                              Decorate 31(v.Position) BuiltIn FragCoord
+                              Decorate 38(v.clip1) BuiltIn ClipDistance
+                              Decorate 75(@entryPointOutput) Location 0
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+    8(VS_OUTPUT):             TypeStruct 7(fvec4) 7(fvec4) 7(fvec4)
+               9:             TypePointer Function 8(VS_OUTPUT)
+              10:             TypeFunction 7(fvec4) 9(ptr)
+              14:             TypeInt 32 1
+              15:     14(int) Constant 0
+              16:             TypePointer Function 7(fvec4)
+              19:     14(int) Constant 1
+              23:     14(int) Constant 2
+              30:             TypePointer Input 7(fvec4)
+  31(v.Position):     30(ptr) Variable Input
+              34:             TypeInt 32 0
+              35:     34(int) Constant 8
+              36:             TypeArray 6(float) 35
+              37:             TypePointer Input 36
+     38(v.clip1):     37(ptr) Variable Input
+              39:             TypePointer Input 6(float)
+              42:     34(int) Constant 0
+              43:             TypePointer Function 6(float)
+              47:     34(int) Constant 1
+              51:     34(int) Constant 2
+              53:     14(int) Constant 3
+              56:     34(int) Constant 3
+              58:     14(int) Constant 4
+              62:     14(int) Constant 5
+              66:     14(int) Constant 6
+              70:     14(int) Constant 7
+              74:             TypePointer Output 7(fvec4)
+75(@entryPointOutput):     74(ptr) Variable Output
+         4(main):           2 Function None 3
+               5:             Label
+           29(v):      9(ptr) Variable Function
+       76(param):      9(ptr) Variable Function
+              32:    7(fvec4) Load 31(v.Position)
+              33:     16(ptr) AccessChain 29(v) 15
+                              Store 33 32
+              40:     39(ptr) AccessChain 38(v.clip1) 15
+              41:    6(float) Load 40
+              44:     43(ptr) AccessChain 29(v) 19 42
+                              Store 44 41
+              45:     39(ptr) AccessChain 38(v.clip1) 19
+              46:    6(float) Load 45
+              48:     43(ptr) AccessChain 29(v) 19 47
+                              Store 48 46
+              49:     39(ptr) AccessChain 38(v.clip1) 23
+              50:    6(float) Load 49
+              52:     43(ptr) AccessChain 29(v) 19 51
+                              Store 52 50
+              54:     39(ptr) AccessChain 38(v.clip1) 53
+              55:    6(float) Load 54
+              57:     43(ptr) AccessChain 29(v) 19 56
+                              Store 57 55
+              59:     39(ptr) AccessChain 38(v.clip1) 58
+              60:    6(float) Load 59
+              61:     43(ptr) AccessChain 29(v) 23 42
+                              Store 61 60
+              63:     39(ptr) AccessChain 38(v.clip1) 62
+              64:    6(float) Load 63
+              65:     43(ptr) AccessChain 29(v) 23 47
+                              Store 65 64
+              67:     39(ptr) AccessChain 38(v.clip1) 66
+              68:    6(float) Load 67
+              69:     43(ptr) AccessChain 29(v) 23 51
+                              Store 69 68
+              71:     39(ptr) AccessChain 38(v.clip1) 70
+              72:    6(float) Load 71
+              73:     43(ptr) AccessChain 29(v) 23 56
+                              Store 73 72
+              77:8(VS_OUTPUT) Load 29(v)
+                              Store 76(param) 77
+              78:    7(fvec4) FunctionCall 12(@main(struct-VS_OUTPUT-vf4-vf4-vf41;) 76(param)
+                              Store 75(@entryPointOutput) 78
+                              Return
+                              FunctionEnd
+12(@main(struct-VS_OUTPUT-vf4-vf4-vf41;):    7(fvec4) Function None 10
+           11(v):      9(ptr) FunctionParameter
+              13:             Label
+              17:     16(ptr) AccessChain 11(v) 15
+              18:    7(fvec4) Load 17
+              20:     16(ptr) AccessChain 11(v) 19
+              21:    7(fvec4) Load 20
+              22:    7(fvec4) FAdd 18 21
+              24:     16(ptr) AccessChain 11(v) 23
+              25:    7(fvec4) Load 24
+              26:    7(fvec4) FAdd 22 25
+                              ReturnValue 26
+                              FunctionEnd
diff --git a/Test/baseResults/hlsl.clipdistance-6.vert.out b/Test/baseResults/hlsl.clipdistance-6.vert.out
new file mode 100644
index 0000000..a386d0a
--- /dev/null
+++ b/Test/baseResults/hlsl.clipdistance-6.vert.out
@@ -0,0 +1,556 @@
+hlsl.clipdistance-6.vert
+Shader version: 500
+0:? Sequence
+0:8  Function Definition: @main( ( temp structure{ temp 4-component vector of float Position,  temp 4-component vector of float clip0,  temp 4-component vector of float clip1})
+0:8    Function Parameters: 
+0:?     Sequence
+0:10      move second child to first child ( temp 4-component vector of float)
+0:10        Position: direct index for structure ( temp 4-component vector of float)
+0:10          'Output' ( temp structure{ temp 4-component vector of float Position,  temp 4-component vector of float clip0,  temp 4-component vector of float clip1})
+0:10          Constant:
+0:10            0 (const int)
+0:10        Constant:
+0:10          0.000000
+0:10          0.000000
+0:10          0.000000
+0:10          0.000000
+0:12      move second child to first child ( temp float)
+0:12        direct index ( temp float)
+0:12          clip0: direct index for structure ( temp 4-component vector of float)
+0:12            'Output' ( temp structure{ temp 4-component vector of float Position,  temp 4-component vector of float clip0,  temp 4-component vector of float clip1})
+0:12            Constant:
+0:12              1 (const int)
+0:12          Constant:
+0:12            0 (const int)
+0:12        Constant:
+0:12          0.000000
+0:13      move second child to first child ( temp float)
+0:13        direct index ( temp float)
+0:13          clip0: direct index for structure ( temp 4-component vector of float)
+0:13            'Output' ( temp structure{ temp 4-component vector of float Position,  temp 4-component vector of float clip0,  temp 4-component vector of float clip1})
+0:13            Constant:
+0:13              1 (const int)
+0:13          Constant:
+0:13            1 (const int)
+0:13        Constant:
+0:13          1.000000
+0:14      move second child to first child ( temp float)
+0:14        direct index ( temp float)
+0:14          clip0: direct index for structure ( temp 4-component vector of float)
+0:14            'Output' ( temp structure{ temp 4-component vector of float Position,  temp 4-component vector of float clip0,  temp 4-component vector of float clip1})
+0:14            Constant:
+0:14              1 (const int)
+0:14          Constant:
+0:14            2 (const int)
+0:14        Constant:
+0:14          2.000000
+0:15      move second child to first child ( temp float)
+0:15        direct index ( temp float)
+0:15          clip0: direct index for structure ( temp 4-component vector of float)
+0:15            'Output' ( temp structure{ temp 4-component vector of float Position,  temp 4-component vector of float clip0,  temp 4-component vector of float clip1})
+0:15            Constant:
+0:15              1 (const int)
+0:15          Constant:
+0:15            3 (const int)
+0:15        Constant:
+0:15          3.000000
+0:17      move second child to first child ( temp float)
+0:17        direct index ( temp float)
+0:17          clip1: direct index for structure ( temp 4-component vector of float)
+0:17            'Output' ( temp structure{ temp 4-component vector of float Position,  temp 4-component vector of float clip0,  temp 4-component vector of float clip1})
+0:17            Constant:
+0:17              2 (const int)
+0:17          Constant:
+0:17            0 (const int)
+0:17        Constant:
+0:17          4.000000
+0:18      move second child to first child ( temp float)
+0:18        direct index ( temp float)
+0:18          clip1: direct index for structure ( temp 4-component vector of float)
+0:18            'Output' ( temp structure{ temp 4-component vector of float Position,  temp 4-component vector of float clip0,  temp 4-component vector of float clip1})
+0:18            Constant:
+0:18              2 (const int)
+0:18          Constant:
+0:18            1 (const int)
+0:18        Constant:
+0:18          5.000000
+0:19      move second child to first child ( temp float)
+0:19        direct index ( temp float)
+0:19          clip1: direct index for structure ( temp 4-component vector of float)
+0:19            'Output' ( temp structure{ temp 4-component vector of float Position,  temp 4-component vector of float clip0,  temp 4-component vector of float clip1})
+0:19            Constant:
+0:19              2 (const int)
+0:19          Constant:
+0:19            2 (const int)
+0:19        Constant:
+0:19          6.000000
+0:20      move second child to first child ( temp float)
+0:20        direct index ( temp float)
+0:20          clip1: direct index for structure ( temp 4-component vector of float)
+0:20            'Output' ( temp structure{ temp 4-component vector of float Position,  temp 4-component vector of float clip0,  temp 4-component vector of float clip1})
+0:20            Constant:
+0:20              2 (const int)
+0:20          Constant:
+0:20            3 (const int)
+0:20        Constant:
+0:20          7.000000
+0:22      Branch: Return with expression
+0:22        'Output' ( temp structure{ temp 4-component vector of float Position,  temp 4-component vector of float clip0,  temp 4-component vector of float clip1})
+0:8  Function Definition: main( ( temp void)
+0:8    Function Parameters: 
+0:?     Sequence
+0:8      Sequence
+0:8        move second child to first child ( temp structure{ temp 4-component vector of float Position,  temp 4-component vector of float clip0,  temp 4-component vector of float clip1})
+0:8          'flattenTemp' ( temp structure{ temp 4-component vector of float Position,  temp 4-component vector of float clip0,  temp 4-component vector of float clip1})
+0:8          Function Call: @main( ( temp structure{ temp 4-component vector of float Position,  temp 4-component vector of float clip0,  temp 4-component vector of float clip1})
+0:8        move second child to first child ( temp 4-component vector of float)
+0:?           '@entryPointOutput.Position' ( out 4-component vector of float Position)
+0:8          Position: direct index for structure ( temp 4-component vector of float)
+0:8            'flattenTemp' ( temp structure{ temp 4-component vector of float Position,  temp 4-component vector of float clip0,  temp 4-component vector of float clip1})
+0:8            Constant:
+0:8              0 (const int)
+0:?         Sequence
+0:8          move second child to first child ( temp float)
+0:8            direct index ( out float ClipDistance)
+0:?               '@entryPointOutput.clip1' ( out 8-element array of float ClipDistance)
+0:8              Constant:
+0:8                0 (const int)
+0:8            direct index ( temp float)
+0:8              clip0: direct index for structure ( temp 4-component vector of float)
+0:8                'flattenTemp' ( temp structure{ temp 4-component vector of float Position,  temp 4-component vector of float clip0,  temp 4-component vector of float clip1})
+0:8                Constant:
+0:8                  1 (const int)
+0:8              Constant:
+0:8                0 (const int)
+0:8          move second child to first child ( temp float)
+0:8            direct index ( out float ClipDistance)
+0:?               '@entryPointOutput.clip1' ( out 8-element array of float ClipDistance)
+0:8              Constant:
+0:8                1 (const int)
+0:8            direct index ( temp float)
+0:8              clip0: direct index for structure ( temp 4-component vector of float)
+0:8                'flattenTemp' ( temp structure{ temp 4-component vector of float Position,  temp 4-component vector of float clip0,  temp 4-component vector of float clip1})
+0:8                Constant:
+0:8                  1 (const int)
+0:8              Constant:
+0:8                1 (const int)
+0:8          move second child to first child ( temp float)
+0:8            direct index ( out float ClipDistance)
+0:?               '@entryPointOutput.clip1' ( out 8-element array of float ClipDistance)
+0:8              Constant:
+0:8                2 (const int)
+0:8            direct index ( temp float)
+0:8              clip0: direct index for structure ( temp 4-component vector of float)
+0:8                'flattenTemp' ( temp structure{ temp 4-component vector of float Position,  temp 4-component vector of float clip0,  temp 4-component vector of float clip1})
+0:8                Constant:
+0:8                  1 (const int)
+0:8              Constant:
+0:8                2 (const int)
+0:8          move second child to first child ( temp float)
+0:8            direct index ( out float ClipDistance)
+0:?               '@entryPointOutput.clip1' ( out 8-element array of float ClipDistance)
+0:8              Constant:
+0:8                3 (const int)
+0:8            direct index ( temp float)
+0:8              clip0: direct index for structure ( temp 4-component vector of float)
+0:8                'flattenTemp' ( temp structure{ temp 4-component vector of float Position,  temp 4-component vector of float clip0,  temp 4-component vector of float clip1})
+0:8                Constant:
+0:8                  1 (const int)
+0:8              Constant:
+0:8                3 (const int)
+0:?         Sequence
+0:8          move second child to first child ( temp float)
+0:8            direct index ( out float ClipDistance)
+0:?               '@entryPointOutput.clip1' ( out 8-element array of float ClipDistance)
+0:8              Constant:
+0:8                4 (const int)
+0:8            direct index ( temp float)
+0:8              clip1: direct index for structure ( temp 4-component vector of float)
+0:8                'flattenTemp' ( temp structure{ temp 4-component vector of float Position,  temp 4-component vector of float clip0,  temp 4-component vector of float clip1})
+0:8                Constant:
+0:8                  2 (const int)
+0:8              Constant:
+0:8                0 (const int)
+0:8          move second child to first child ( temp float)
+0:8            direct index ( out float ClipDistance)
+0:?               '@entryPointOutput.clip1' ( out 8-element array of float ClipDistance)
+0:8              Constant:
+0:8                5 (const int)
+0:8            direct index ( temp float)
+0:8              clip1: direct index for structure ( temp 4-component vector of float)
+0:8                'flattenTemp' ( temp structure{ temp 4-component vector of float Position,  temp 4-component vector of float clip0,  temp 4-component vector of float clip1})
+0:8                Constant:
+0:8                  2 (const int)
+0:8              Constant:
+0:8                1 (const int)
+0:8          move second child to first child ( temp float)
+0:8            direct index ( out float ClipDistance)
+0:?               '@entryPointOutput.clip1' ( out 8-element array of float ClipDistance)
+0:8              Constant:
+0:8                6 (const int)
+0:8            direct index ( temp float)
+0:8              clip1: direct index for structure ( temp 4-component vector of float)
+0:8                'flattenTemp' ( temp structure{ temp 4-component vector of float Position,  temp 4-component vector of float clip0,  temp 4-component vector of float clip1})
+0:8                Constant:
+0:8                  2 (const int)
+0:8              Constant:
+0:8                2 (const int)
+0:8          move second child to first child ( temp float)
+0:8            direct index ( out float ClipDistance)
+0:?               '@entryPointOutput.clip1' ( out 8-element array of float ClipDistance)
+0:8              Constant:
+0:8                7 (const int)
+0:8            direct index ( temp float)
+0:8              clip1: direct index for structure ( temp 4-component vector of float)
+0:8                'flattenTemp' ( temp structure{ temp 4-component vector of float Position,  temp 4-component vector of float clip0,  temp 4-component vector of float clip1})
+0:8                Constant:
+0:8                  2 (const int)
+0:8              Constant:
+0:8                3 (const int)
+0:?   Linker Objects
+0:?     '@entryPointOutput.Position' ( out 4-component vector of float Position)
+0:?     '@entryPointOutput.clip1' ( out 8-element array of float ClipDistance)
+
+
+Linked vertex stage:
+
+
+Shader version: 500
+0:? Sequence
+0:8  Function Definition: @main( ( temp structure{ temp 4-component vector of float Position,  temp 4-component vector of float clip0,  temp 4-component vector of float clip1})
+0:8    Function Parameters: 
+0:?     Sequence
+0:10      move second child to first child ( temp 4-component vector of float)
+0:10        Position: direct index for structure ( temp 4-component vector of float)
+0:10          'Output' ( temp structure{ temp 4-component vector of float Position,  temp 4-component vector of float clip0,  temp 4-component vector of float clip1})
+0:10          Constant:
+0:10            0 (const int)
+0:10        Constant:
+0:10          0.000000
+0:10          0.000000
+0:10          0.000000
+0:10          0.000000
+0:12      move second child to first child ( temp float)
+0:12        direct index ( temp float)
+0:12          clip0: direct index for structure ( temp 4-component vector of float)
+0:12            'Output' ( temp structure{ temp 4-component vector of float Position,  temp 4-component vector of float clip0,  temp 4-component vector of float clip1})
+0:12            Constant:
+0:12              1 (const int)
+0:12          Constant:
+0:12            0 (const int)
+0:12        Constant:
+0:12          0.000000
+0:13      move second child to first child ( temp float)
+0:13        direct index ( temp float)
+0:13          clip0: direct index for structure ( temp 4-component vector of float)
+0:13            'Output' ( temp structure{ temp 4-component vector of float Position,  temp 4-component vector of float clip0,  temp 4-component vector of float clip1})
+0:13            Constant:
+0:13              1 (const int)
+0:13          Constant:
+0:13            1 (const int)
+0:13        Constant:
+0:13          1.000000
+0:14      move second child to first child ( temp float)
+0:14        direct index ( temp float)
+0:14          clip0: direct index for structure ( temp 4-component vector of float)
+0:14            'Output' ( temp structure{ temp 4-component vector of float Position,  temp 4-component vector of float clip0,  temp 4-component vector of float clip1})
+0:14            Constant:
+0:14              1 (const int)
+0:14          Constant:
+0:14            2 (const int)
+0:14        Constant:
+0:14          2.000000
+0:15      move second child to first child ( temp float)
+0:15        direct index ( temp float)
+0:15          clip0: direct index for structure ( temp 4-component vector of float)
+0:15            'Output' ( temp structure{ temp 4-component vector of float Position,  temp 4-component vector of float clip0,  temp 4-component vector of float clip1})
+0:15            Constant:
+0:15              1 (const int)
+0:15          Constant:
+0:15            3 (const int)
+0:15        Constant:
+0:15          3.000000
+0:17      move second child to first child ( temp float)
+0:17        direct index ( temp float)
+0:17          clip1: direct index for structure ( temp 4-component vector of float)
+0:17            'Output' ( temp structure{ temp 4-component vector of float Position,  temp 4-component vector of float clip0,  temp 4-component vector of float clip1})
+0:17            Constant:
+0:17              2 (const int)
+0:17          Constant:
+0:17            0 (const int)
+0:17        Constant:
+0:17          4.000000
+0:18      move second child to first child ( temp float)
+0:18        direct index ( temp float)
+0:18          clip1: direct index for structure ( temp 4-component vector of float)
+0:18            'Output' ( temp structure{ temp 4-component vector of float Position,  temp 4-component vector of float clip0,  temp 4-component vector of float clip1})
+0:18            Constant:
+0:18              2 (const int)
+0:18          Constant:
+0:18            1 (const int)
+0:18        Constant:
+0:18          5.000000
+0:19      move second child to first child ( temp float)
+0:19        direct index ( temp float)
+0:19          clip1: direct index for structure ( temp 4-component vector of float)
+0:19            'Output' ( temp structure{ temp 4-component vector of float Position,  temp 4-component vector of float clip0,  temp 4-component vector of float clip1})
+0:19            Constant:
+0:19              2 (const int)
+0:19          Constant:
+0:19            2 (const int)
+0:19        Constant:
+0:19          6.000000
+0:20      move second child to first child ( temp float)
+0:20        direct index ( temp float)
+0:20          clip1: direct index for structure ( temp 4-component vector of float)
+0:20            'Output' ( temp structure{ temp 4-component vector of float Position,  temp 4-component vector of float clip0,  temp 4-component vector of float clip1})
+0:20            Constant:
+0:20              2 (const int)
+0:20          Constant:
+0:20            3 (const int)
+0:20        Constant:
+0:20          7.000000
+0:22      Branch: Return with expression
+0:22        'Output' ( temp structure{ temp 4-component vector of float Position,  temp 4-component vector of float clip0,  temp 4-component vector of float clip1})
+0:8  Function Definition: main( ( temp void)
+0:8    Function Parameters: 
+0:?     Sequence
+0:8      Sequence
+0:8        move second child to first child ( temp structure{ temp 4-component vector of float Position,  temp 4-component vector of float clip0,  temp 4-component vector of float clip1})
+0:8          'flattenTemp' ( temp structure{ temp 4-component vector of float Position,  temp 4-component vector of float clip0,  temp 4-component vector of float clip1})
+0:8          Function Call: @main( ( temp structure{ temp 4-component vector of float Position,  temp 4-component vector of float clip0,  temp 4-component vector of float clip1})
+0:8        move second child to first child ( temp 4-component vector of float)
+0:?           '@entryPointOutput.Position' ( out 4-component vector of float Position)
+0:8          Position: direct index for structure ( temp 4-component vector of float)
+0:8            'flattenTemp' ( temp structure{ temp 4-component vector of float Position,  temp 4-component vector of float clip0,  temp 4-component vector of float clip1})
+0:8            Constant:
+0:8              0 (const int)
+0:?         Sequence
+0:8          move second child to first child ( temp float)
+0:8            direct index ( out float ClipDistance)
+0:?               '@entryPointOutput.clip1' ( out 8-element array of float ClipDistance)
+0:8              Constant:
+0:8                0 (const int)
+0:8            direct index ( temp float)
+0:8              clip0: direct index for structure ( temp 4-component vector of float)
+0:8                'flattenTemp' ( temp structure{ temp 4-component vector of float Position,  temp 4-component vector of float clip0,  temp 4-component vector of float clip1})
+0:8                Constant:
+0:8                  1 (const int)
+0:8              Constant:
+0:8                0 (const int)
+0:8          move second child to first child ( temp float)
+0:8            direct index ( out float ClipDistance)
+0:?               '@entryPointOutput.clip1' ( out 8-element array of float ClipDistance)
+0:8              Constant:
+0:8                1 (const int)
+0:8            direct index ( temp float)
+0:8              clip0: direct index for structure ( temp 4-component vector of float)
+0:8                'flattenTemp' ( temp structure{ temp 4-component vector of float Position,  temp 4-component vector of float clip0,  temp 4-component vector of float clip1})
+0:8                Constant:
+0:8                  1 (const int)
+0:8              Constant:
+0:8                1 (const int)
+0:8          move second child to first child ( temp float)
+0:8            direct index ( out float ClipDistance)
+0:?               '@entryPointOutput.clip1' ( out 8-element array of float ClipDistance)
+0:8              Constant:
+0:8                2 (const int)
+0:8            direct index ( temp float)
+0:8              clip0: direct index for structure ( temp 4-component vector of float)
+0:8                'flattenTemp' ( temp structure{ temp 4-component vector of float Position,  temp 4-component vector of float clip0,  temp 4-component vector of float clip1})
+0:8                Constant:
+0:8                  1 (const int)
+0:8              Constant:
+0:8                2 (const int)
+0:8          move second child to first child ( temp float)
+0:8            direct index ( out float ClipDistance)
+0:?               '@entryPointOutput.clip1' ( out 8-element array of float ClipDistance)
+0:8              Constant:
+0:8                3 (const int)
+0:8            direct index ( temp float)
+0:8              clip0: direct index for structure ( temp 4-component vector of float)
+0:8                'flattenTemp' ( temp structure{ temp 4-component vector of float Position,  temp 4-component vector of float clip0,  temp 4-component vector of float clip1})
+0:8                Constant:
+0:8                  1 (const int)
+0:8              Constant:
+0:8                3 (const int)
+0:?         Sequence
+0:8          move second child to first child ( temp float)
+0:8            direct index ( out float ClipDistance)
+0:?               '@entryPointOutput.clip1' ( out 8-element array of float ClipDistance)
+0:8              Constant:
+0:8                4 (const int)
+0:8            direct index ( temp float)
+0:8              clip1: direct index for structure ( temp 4-component vector of float)
+0:8                'flattenTemp' ( temp structure{ temp 4-component vector of float Position,  temp 4-component vector of float clip0,  temp 4-component vector of float clip1})
+0:8                Constant:
+0:8                  2 (const int)
+0:8              Constant:
+0:8                0 (const int)
+0:8          move second child to first child ( temp float)
+0:8            direct index ( out float ClipDistance)
+0:?               '@entryPointOutput.clip1' ( out 8-element array of float ClipDistance)
+0:8              Constant:
+0:8                5 (const int)
+0:8            direct index ( temp float)
+0:8              clip1: direct index for structure ( temp 4-component vector of float)
+0:8                'flattenTemp' ( temp structure{ temp 4-component vector of float Position,  temp 4-component vector of float clip0,  temp 4-component vector of float clip1})
+0:8                Constant:
+0:8                  2 (const int)
+0:8              Constant:
+0:8                1 (const int)
+0:8          move second child to first child ( temp float)
+0:8            direct index ( out float ClipDistance)
+0:?               '@entryPointOutput.clip1' ( out 8-element array of float ClipDistance)
+0:8              Constant:
+0:8                6 (const int)
+0:8            direct index ( temp float)
+0:8              clip1: direct index for structure ( temp 4-component vector of float)
+0:8                'flattenTemp' ( temp structure{ temp 4-component vector of float Position,  temp 4-component vector of float clip0,  temp 4-component vector of float clip1})
+0:8                Constant:
+0:8                  2 (const int)
+0:8              Constant:
+0:8                2 (const int)
+0:8          move second child to first child ( temp float)
+0:8            direct index ( out float ClipDistance)
+0:?               '@entryPointOutput.clip1' ( out 8-element array of float ClipDistance)
+0:8              Constant:
+0:8                7 (const int)
+0:8            direct index ( temp float)
+0:8              clip1: direct index for structure ( temp 4-component vector of float)
+0:8                'flattenTemp' ( temp structure{ temp 4-component vector of float Position,  temp 4-component vector of float clip0,  temp 4-component vector of float clip1})
+0:8                Constant:
+0:8                  2 (const int)
+0:8              Constant:
+0:8                3 (const int)
+0:?   Linker Objects
+0:?     '@entryPointOutput.Position' ( out 4-component vector of float Position)
+0:?     '@entryPointOutput.clip1' ( out 8-element array of float ClipDistance)
+
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 86
+
+                              Capability Shader
+                              Capability ClipDistance
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Vertex 4  "main" 49 55
+                              Source HLSL 500
+                              Name 4  "main"
+                              Name 8  "VS_OUTPUT"
+                              MemberName 8(VS_OUTPUT) 0  "Position"
+                              MemberName 8(VS_OUTPUT) 1  "clip0"
+                              MemberName 8(VS_OUTPUT) 2  "clip1"
+                              Name 10  "@main("
+                              Name 13  "Output"
+                              Name 46  "flattenTemp"
+                              Name 49  "@entryPointOutput.Position"
+                              Name 55  "@entryPointOutput.clip1"
+                              Decorate 49(@entryPointOutput.Position) BuiltIn Position
+                              Decorate 55(@entryPointOutput.clip1) BuiltIn ClipDistance
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+    8(VS_OUTPUT):             TypeStruct 7(fvec4) 7(fvec4) 7(fvec4)
+               9:             TypeFunction 8(VS_OUTPUT)
+              12:             TypePointer Function 8(VS_OUTPUT)
+              14:             TypeInt 32 1
+              15:     14(int) Constant 0
+              16:    6(float) Constant 0
+              17:    7(fvec4) ConstantComposite 16 16 16 16
+              18:             TypePointer Function 7(fvec4)
+              20:     14(int) Constant 1
+              21:             TypeInt 32 0
+              22:     21(int) Constant 0
+              23:             TypePointer Function 6(float)
+              25:    6(float) Constant 1065353216
+              26:     21(int) Constant 1
+              28:    6(float) Constant 1073741824
+              29:     21(int) Constant 2
+              31:    6(float) Constant 1077936128
+              32:     21(int) Constant 3
+              34:     14(int) Constant 2
+              35:    6(float) Constant 1082130432
+              37:    6(float) Constant 1084227584
+              39:    6(float) Constant 1086324736
+              41:    6(float) Constant 1088421888
+              48:             TypePointer Output 7(fvec4)
+49(@entryPointOutput.Position):     48(ptr) Variable Output
+              52:     21(int) Constant 8
+              53:             TypeArray 6(float) 52
+              54:             TypePointer Output 53
+55(@entryPointOutput.clip1):     54(ptr) Variable Output
+              58:             TypePointer Output 6(float)
+              66:     14(int) Constant 3
+              70:     14(int) Constant 4
+              74:     14(int) Constant 5
+              78:     14(int) Constant 6
+              82:     14(int) Constant 7
+         4(main):           2 Function None 3
+               5:             Label
+ 46(flattenTemp):     12(ptr) Variable Function
+              47:8(VS_OUTPUT) FunctionCall 10(@main()
+                              Store 46(flattenTemp) 47
+              50:     18(ptr) AccessChain 46(flattenTemp) 15
+              51:    7(fvec4) Load 50
+                              Store 49(@entryPointOutput.Position) 51
+              56:     23(ptr) AccessChain 46(flattenTemp) 20 22
+              57:    6(float) Load 56
+              59:     58(ptr) AccessChain 55(@entryPointOutput.clip1) 15
+                              Store 59 57
+              60:     23(ptr) AccessChain 46(flattenTemp) 20 26
+              61:    6(float) Load 60
+              62:     58(ptr) AccessChain 55(@entryPointOutput.clip1) 20
+                              Store 62 61
+              63:     23(ptr) AccessChain 46(flattenTemp) 20 29
+              64:    6(float) Load 63
+              65:     58(ptr) AccessChain 55(@entryPointOutput.clip1) 34
+                              Store 65 64
+              67:     23(ptr) AccessChain 46(flattenTemp) 20 32
+              68:    6(float) Load 67
+              69:     58(ptr) AccessChain 55(@entryPointOutput.clip1) 66
+                              Store 69 68
+              71:     23(ptr) AccessChain 46(flattenTemp) 34 22
+              72:    6(float) Load 71
+              73:     58(ptr) AccessChain 55(@entryPointOutput.clip1) 70
+                              Store 73 72
+              75:     23(ptr) AccessChain 46(flattenTemp) 34 26
+              76:    6(float) Load 75
+              77:     58(ptr) AccessChain 55(@entryPointOutput.clip1) 74
+                              Store 77 76
+              79:     23(ptr) AccessChain 46(flattenTemp) 34 29
+              80:    6(float) Load 79
+              81:     58(ptr) AccessChain 55(@entryPointOutput.clip1) 78
+                              Store 81 80
+              83:     23(ptr) AccessChain 46(flattenTemp) 34 32
+              84:    6(float) Load 83
+              85:     58(ptr) AccessChain 55(@entryPointOutput.clip1) 82
+                              Store 85 84
+                              Return
+                              FunctionEnd
+      10(@main():8(VS_OUTPUT) Function None 9
+              11:             Label
+      13(Output):     12(ptr) Variable Function
+              19:     18(ptr) AccessChain 13(Output) 15
+                              Store 19 17
+              24:     23(ptr) AccessChain 13(Output) 20 22
+                              Store 24 16
+              27:     23(ptr) AccessChain 13(Output) 20 26
+                              Store 27 25
+              30:     23(ptr) AccessChain 13(Output) 20 29
+                              Store 30 28
+              33:     23(ptr) AccessChain 13(Output) 20 32
+                              Store 33 31
+              36:     23(ptr) AccessChain 13(Output) 34 22
+                              Store 36 35
+              38:     23(ptr) AccessChain 13(Output) 34 26
+                              Store 38 37
+              40:     23(ptr) AccessChain 13(Output) 34 29
+                              Store 40 39
+              42:     23(ptr) AccessChain 13(Output) 34 32
+                              Store 42 41
+              43:8(VS_OUTPUT) Load 13(Output)
+                              ReturnValue 43
+                              FunctionEnd
diff --git a/Test/baseResults/hlsl.clipdistance-7.frag.out b/Test/baseResults/hlsl.clipdistance-7.frag.out
new file mode 100644
index 0000000..94b6a79
--- /dev/null
+++ b/Test/baseResults/hlsl.clipdistance-7.frag.out
@@ -0,0 +1,385 @@
+hlsl.clipdistance-7.frag
+Shader version: 500
+gl_FragCoord origin is upper left
+0:? Sequence
+0:8  Function Definition: @main(struct-VS_OUTPUT-vf4-vf3-vf41; ( temp 4-component vector of float)
+0:8    Function Parameters: 
+0:8      'v' ( in structure{ temp 4-component vector of float Position,  temp 3-component vector of float clip0,  temp 4-component vector of float clip1})
+0:?     Sequence
+0:9      Branch: Return with expression
+0:9        add ( temp 4-component vector of float)
+0:9          add ( temp 4-component vector of float)
+0:9            Position: direct index for structure ( temp 4-component vector of float)
+0:9              'v' ( in structure{ temp 4-component vector of float Position,  temp 3-component vector of float clip0,  temp 4-component vector of float clip1})
+0:9              Constant:
+0:9                0 (const int)
+0:9            direct index ( temp float)
+0:9              clip0: direct index for structure ( temp 3-component vector of float)
+0:9                'v' ( in structure{ temp 4-component vector of float Position,  temp 3-component vector of float clip0,  temp 4-component vector of float clip1})
+0:9                Constant:
+0:9                  1 (const int)
+0:9              Constant:
+0:9                0 (const int)
+0:9          direct index ( temp float)
+0:9            clip1: direct index for structure ( temp 4-component vector of float)
+0:9              'v' ( in structure{ temp 4-component vector of float Position,  temp 3-component vector of float clip0,  temp 4-component vector of float clip1})
+0:9              Constant:
+0:9                2 (const int)
+0:9            Constant:
+0:9              0 (const int)
+0:8  Function Definition: main( ( temp void)
+0:8    Function Parameters: 
+0:?     Sequence
+0:8      Sequence
+0:8        move second child to first child ( temp 4-component vector of float)
+0:8          Position: direct index for structure ( temp 4-component vector of float)
+0:?             'v' ( temp structure{ temp 4-component vector of float Position,  temp 3-component vector of float clip0,  temp 4-component vector of float clip1})
+0:8            Constant:
+0:8              0 (const int)
+0:?           'v.Position' ( in 4-component vector of float FragCoord)
+0:?         Sequence
+0:8          move second child to first child ( temp float)
+0:8            direct index ( temp float)
+0:8              clip0: direct index for structure ( temp 3-component vector of float)
+0:?                 'v' ( temp structure{ temp 4-component vector of float Position,  temp 3-component vector of float clip0,  temp 4-component vector of float clip1})
+0:8                Constant:
+0:8                  1 (const int)
+0:8              Constant:
+0:8                0 (const int)
+0:8            direct index ( in float ClipDistance)
+0:?               'v.clip1' ( in 8-element array of float ClipDistance)
+0:8              Constant:
+0:8                0 (const int)
+0:8          move second child to first child ( temp float)
+0:8            direct index ( temp float)
+0:8              clip0: direct index for structure ( temp 3-component vector of float)
+0:?                 'v' ( temp structure{ temp 4-component vector of float Position,  temp 3-component vector of float clip0,  temp 4-component vector of float clip1})
+0:8                Constant:
+0:8                  1 (const int)
+0:8              Constant:
+0:8                1 (const int)
+0:8            direct index ( in float ClipDistance)
+0:?               'v.clip1' ( in 8-element array of float ClipDistance)
+0:8              Constant:
+0:8                1 (const int)
+0:8          move second child to first child ( temp float)
+0:8            direct index ( temp float)
+0:8              clip0: direct index for structure ( temp 3-component vector of float)
+0:?                 'v' ( temp structure{ temp 4-component vector of float Position,  temp 3-component vector of float clip0,  temp 4-component vector of float clip1})
+0:8                Constant:
+0:8                  1 (const int)
+0:8              Constant:
+0:8                2 (const int)
+0:8            direct index ( in float ClipDistance)
+0:?               'v.clip1' ( in 8-element array of float ClipDistance)
+0:8              Constant:
+0:8                2 (const int)
+0:?         Sequence
+0:8          move second child to first child ( temp float)
+0:8            direct index ( temp float)
+0:8              clip1: direct index for structure ( temp 4-component vector of float)
+0:?                 'v' ( temp structure{ temp 4-component vector of float Position,  temp 3-component vector of float clip0,  temp 4-component vector of float clip1})
+0:8                Constant:
+0:8                  2 (const int)
+0:8              Constant:
+0:8                0 (const int)
+0:8            direct index ( in float ClipDistance)
+0:?               'v.clip1' ( in 8-element array of float ClipDistance)
+0:8              Constant:
+0:8                4 (const int)
+0:8          move second child to first child ( temp float)
+0:8            direct index ( temp float)
+0:8              clip1: direct index for structure ( temp 4-component vector of float)
+0:?                 'v' ( temp structure{ temp 4-component vector of float Position,  temp 3-component vector of float clip0,  temp 4-component vector of float clip1})
+0:8                Constant:
+0:8                  2 (const int)
+0:8              Constant:
+0:8                1 (const int)
+0:8            direct index ( in float ClipDistance)
+0:?               'v.clip1' ( in 8-element array of float ClipDistance)
+0:8              Constant:
+0:8                5 (const int)
+0:8          move second child to first child ( temp float)
+0:8            direct index ( temp float)
+0:8              clip1: direct index for structure ( temp 4-component vector of float)
+0:?                 'v' ( temp structure{ temp 4-component vector of float Position,  temp 3-component vector of float clip0,  temp 4-component vector of float clip1})
+0:8                Constant:
+0:8                  2 (const int)
+0:8              Constant:
+0:8                2 (const int)
+0:8            direct index ( in float ClipDistance)
+0:?               'v.clip1' ( in 8-element array of float ClipDistance)
+0:8              Constant:
+0:8                6 (const int)
+0:8          move second child to first child ( temp float)
+0:8            direct index ( temp float)
+0:8              clip1: direct index for structure ( temp 4-component vector of float)
+0:?                 'v' ( temp structure{ temp 4-component vector of float Position,  temp 3-component vector of float clip0,  temp 4-component vector of float clip1})
+0:8                Constant:
+0:8                  2 (const int)
+0:8              Constant:
+0:8                3 (const int)
+0:8            direct index ( in float ClipDistance)
+0:?               'v.clip1' ( in 8-element array of float ClipDistance)
+0:8              Constant:
+0:8                7 (const int)
+0:8      move second child to first child ( temp 4-component vector of float)
+0:?         '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+0:8        Function Call: @main(struct-VS_OUTPUT-vf4-vf3-vf41; ( temp 4-component vector of float)
+0:?           'v' ( temp structure{ temp 4-component vector of float Position,  temp 3-component vector of float clip0,  temp 4-component vector of float clip1})
+0:?   Linker Objects
+0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+0:?     'v.Position' ( in 4-component vector of float FragCoord)
+0:?     'v.clip1' ( in 8-element array of float ClipDistance)
+
+
+Linked fragment stage:
+
+
+Shader version: 500
+gl_FragCoord origin is upper left
+0:? Sequence
+0:8  Function Definition: @main(struct-VS_OUTPUT-vf4-vf3-vf41; ( temp 4-component vector of float)
+0:8    Function Parameters: 
+0:8      'v' ( in structure{ temp 4-component vector of float Position,  temp 3-component vector of float clip0,  temp 4-component vector of float clip1})
+0:?     Sequence
+0:9      Branch: Return with expression
+0:9        add ( temp 4-component vector of float)
+0:9          add ( temp 4-component vector of float)
+0:9            Position: direct index for structure ( temp 4-component vector of float)
+0:9              'v' ( in structure{ temp 4-component vector of float Position,  temp 3-component vector of float clip0,  temp 4-component vector of float clip1})
+0:9              Constant:
+0:9                0 (const int)
+0:9            direct index ( temp float)
+0:9              clip0: direct index for structure ( temp 3-component vector of float)
+0:9                'v' ( in structure{ temp 4-component vector of float Position,  temp 3-component vector of float clip0,  temp 4-component vector of float clip1})
+0:9                Constant:
+0:9                  1 (const int)
+0:9              Constant:
+0:9                0 (const int)
+0:9          direct index ( temp float)
+0:9            clip1: direct index for structure ( temp 4-component vector of float)
+0:9              'v' ( in structure{ temp 4-component vector of float Position,  temp 3-component vector of float clip0,  temp 4-component vector of float clip1})
+0:9              Constant:
+0:9                2 (const int)
+0:9            Constant:
+0:9              0 (const int)
+0:8  Function Definition: main( ( temp void)
+0:8    Function Parameters: 
+0:?     Sequence
+0:8      Sequence
+0:8        move second child to first child ( temp 4-component vector of float)
+0:8          Position: direct index for structure ( temp 4-component vector of float)
+0:?             'v' ( temp structure{ temp 4-component vector of float Position,  temp 3-component vector of float clip0,  temp 4-component vector of float clip1})
+0:8            Constant:
+0:8              0 (const int)
+0:?           'v.Position' ( in 4-component vector of float FragCoord)
+0:?         Sequence
+0:8          move second child to first child ( temp float)
+0:8            direct index ( temp float)
+0:8              clip0: direct index for structure ( temp 3-component vector of float)
+0:?                 'v' ( temp structure{ temp 4-component vector of float Position,  temp 3-component vector of float clip0,  temp 4-component vector of float clip1})
+0:8                Constant:
+0:8                  1 (const int)
+0:8              Constant:
+0:8                0 (const int)
+0:8            direct index ( in float ClipDistance)
+0:?               'v.clip1' ( in 8-element array of float ClipDistance)
+0:8              Constant:
+0:8                0 (const int)
+0:8          move second child to first child ( temp float)
+0:8            direct index ( temp float)
+0:8              clip0: direct index for structure ( temp 3-component vector of float)
+0:?                 'v' ( temp structure{ temp 4-component vector of float Position,  temp 3-component vector of float clip0,  temp 4-component vector of float clip1})
+0:8                Constant:
+0:8                  1 (const int)
+0:8              Constant:
+0:8                1 (const int)
+0:8            direct index ( in float ClipDistance)
+0:?               'v.clip1' ( in 8-element array of float ClipDistance)
+0:8              Constant:
+0:8                1 (const int)
+0:8          move second child to first child ( temp float)
+0:8            direct index ( temp float)
+0:8              clip0: direct index for structure ( temp 3-component vector of float)
+0:?                 'v' ( temp structure{ temp 4-component vector of float Position,  temp 3-component vector of float clip0,  temp 4-component vector of float clip1})
+0:8                Constant:
+0:8                  1 (const int)
+0:8              Constant:
+0:8                2 (const int)
+0:8            direct index ( in float ClipDistance)
+0:?               'v.clip1' ( in 8-element array of float ClipDistance)
+0:8              Constant:
+0:8                2 (const int)
+0:?         Sequence
+0:8          move second child to first child ( temp float)
+0:8            direct index ( temp float)
+0:8              clip1: direct index for structure ( temp 4-component vector of float)
+0:?                 'v' ( temp structure{ temp 4-component vector of float Position,  temp 3-component vector of float clip0,  temp 4-component vector of float clip1})
+0:8                Constant:
+0:8                  2 (const int)
+0:8              Constant:
+0:8                0 (const int)
+0:8            direct index ( in float ClipDistance)
+0:?               'v.clip1' ( in 8-element array of float ClipDistance)
+0:8              Constant:
+0:8                4 (const int)
+0:8          move second child to first child ( temp float)
+0:8            direct index ( temp float)
+0:8              clip1: direct index for structure ( temp 4-component vector of float)
+0:?                 'v' ( temp structure{ temp 4-component vector of float Position,  temp 3-component vector of float clip0,  temp 4-component vector of float clip1})
+0:8                Constant:
+0:8                  2 (const int)
+0:8              Constant:
+0:8                1 (const int)
+0:8            direct index ( in float ClipDistance)
+0:?               'v.clip1' ( in 8-element array of float ClipDistance)
+0:8              Constant:
+0:8                5 (const int)
+0:8          move second child to first child ( temp float)
+0:8            direct index ( temp float)
+0:8              clip1: direct index for structure ( temp 4-component vector of float)
+0:?                 'v' ( temp structure{ temp 4-component vector of float Position,  temp 3-component vector of float clip0,  temp 4-component vector of float clip1})
+0:8                Constant:
+0:8                  2 (const int)
+0:8              Constant:
+0:8                2 (const int)
+0:8            direct index ( in float ClipDistance)
+0:?               'v.clip1' ( in 8-element array of float ClipDistance)
+0:8              Constant:
+0:8                6 (const int)
+0:8          move second child to first child ( temp float)
+0:8            direct index ( temp float)
+0:8              clip1: direct index for structure ( temp 4-component vector of float)
+0:?                 'v' ( temp structure{ temp 4-component vector of float Position,  temp 3-component vector of float clip0,  temp 4-component vector of float clip1})
+0:8                Constant:
+0:8                  2 (const int)
+0:8              Constant:
+0:8                3 (const int)
+0:8            direct index ( in float ClipDistance)
+0:?               'v.clip1' ( in 8-element array of float ClipDistance)
+0:8              Constant:
+0:8                7 (const int)
+0:8      move second child to first child ( temp 4-component vector of float)
+0:?         '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+0:8        Function Call: @main(struct-VS_OUTPUT-vf4-vf3-vf41; ( temp 4-component vector of float)
+0:?           'v' ( temp structure{ temp 4-component vector of float Position,  temp 3-component vector of float clip0,  temp 4-component vector of float clip1})
+0:?   Linker Objects
+0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+0:?     'v.Position' ( in 4-component vector of float FragCoord)
+0:?     'v.clip1' ( in 8-element array of float ClipDistance)
+
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 78
+
+                              Capability Shader
+                              Capability ClipDistance
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 37 43 74
+                              ExecutionMode 4 OriginUpperLeft
+                              Source HLSL 500
+                              Name 4  "main"
+                              Name 9  "VS_OUTPUT"
+                              MemberName 9(VS_OUTPUT) 0  "Position"
+                              MemberName 9(VS_OUTPUT) 1  "clip0"
+                              MemberName 9(VS_OUTPUT) 2  "clip1"
+                              Name 13  "@main(struct-VS_OUTPUT-vf4-vf3-vf41;"
+                              Name 12  "v"
+                              Name 35  "v"
+                              Name 37  "v.Position"
+                              Name 43  "v.clip1"
+                              Name 74  "@entryPointOutput"
+                              Name 75  "param"
+                              Decorate 37(v.Position) BuiltIn FragCoord
+                              Decorate 43(v.clip1) BuiltIn ClipDistance
+                              Decorate 74(@entryPointOutput) Location 0
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+               8:             TypeVector 6(float) 3
+    9(VS_OUTPUT):             TypeStruct 7(fvec4) 8(fvec3) 7(fvec4)
+              10:             TypePointer Function 9(VS_OUTPUT)
+              11:             TypeFunction 7(fvec4) 10(ptr)
+              15:             TypeInt 32 1
+              16:     15(int) Constant 0
+              17:             TypePointer Function 7(fvec4)
+              20:     15(int) Constant 1
+              21:             TypeInt 32 0
+              22:     21(int) Constant 0
+              23:             TypePointer Function 6(float)
+              28:     15(int) Constant 2
+              36:             TypePointer Input 7(fvec4)
+  37(v.Position):     36(ptr) Variable Input
+              40:     21(int) Constant 8
+              41:             TypeArray 6(float) 40
+              42:             TypePointer Input 41
+     43(v.clip1):     42(ptr) Variable Input
+              44:             TypePointer Input 6(float)
+              50:     21(int) Constant 1
+              54:     21(int) Constant 2
+              56:     15(int) Constant 4
+              60:     15(int) Constant 5
+              64:     15(int) Constant 6
+              68:     15(int) Constant 7
+              71:     21(int) Constant 3
+              73:             TypePointer Output 7(fvec4)
+74(@entryPointOutput):     73(ptr) Variable Output
+         4(main):           2 Function None 3
+               5:             Label
+           35(v):     10(ptr) Variable Function
+       75(param):     10(ptr) Variable Function
+              38:    7(fvec4) Load 37(v.Position)
+              39:     17(ptr) AccessChain 35(v) 16
+                              Store 39 38
+              45:     44(ptr) AccessChain 43(v.clip1) 16
+              46:    6(float) Load 45
+              47:     23(ptr) AccessChain 35(v) 20 22
+                              Store 47 46
+              48:     44(ptr) AccessChain 43(v.clip1) 20
+              49:    6(float) Load 48
+              51:     23(ptr) AccessChain 35(v) 20 50
+                              Store 51 49
+              52:     44(ptr) AccessChain 43(v.clip1) 28
+              53:    6(float) Load 52
+              55:     23(ptr) AccessChain 35(v) 20 54
+                              Store 55 53
+              57:     44(ptr) AccessChain 43(v.clip1) 56
+              58:    6(float) Load 57
+              59:     23(ptr) AccessChain 35(v) 28 22
+                              Store 59 58
+              61:     44(ptr) AccessChain 43(v.clip1) 60
+              62:    6(float) Load 61
+              63:     23(ptr) AccessChain 35(v) 28 50
+                              Store 63 62
+              65:     44(ptr) AccessChain 43(v.clip1) 64
+              66:    6(float) Load 65
+              67:     23(ptr) AccessChain 35(v) 28 54
+                              Store 67 66
+              69:     44(ptr) AccessChain 43(v.clip1) 68
+              70:    6(float) Load 69
+              72:     23(ptr) AccessChain 35(v) 28 71
+                              Store 72 70
+              76:9(VS_OUTPUT) Load 35(v)
+                              Store 75(param) 76
+              77:    7(fvec4) FunctionCall 13(@main(struct-VS_OUTPUT-vf4-vf3-vf41;) 75(param)
+                              Store 74(@entryPointOutput) 77
+                              Return
+                              FunctionEnd
+13(@main(struct-VS_OUTPUT-vf4-vf3-vf41;):    7(fvec4) Function None 11
+           12(v):     10(ptr) FunctionParameter
+              14:             Label
+              18:     17(ptr) AccessChain 12(v) 16
+              19:    7(fvec4) Load 18
+              24:     23(ptr) AccessChain 12(v) 20 22
+              25:    6(float) Load 24
+              26:    7(fvec4) CompositeConstruct 25 25 25 25
+              27:    7(fvec4) FAdd 19 26
+              29:     23(ptr) AccessChain 12(v) 28 22
+              30:    6(float) Load 29
+              31:    7(fvec4) CompositeConstruct 30 30 30 30
+              32:    7(fvec4) FAdd 27 31
+                              ReturnValue 32
+                              FunctionEnd
diff --git a/Test/baseResults/hlsl.clipdistance-7.vert.out b/Test/baseResults/hlsl.clipdistance-7.vert.out
new file mode 100644
index 0000000..87e34bd
--- /dev/null
+++ b/Test/baseResults/hlsl.clipdistance-7.vert.out
@@ -0,0 +1,505 @@
+hlsl.clipdistance-7.vert
+Shader version: 500
+0:? Sequence
+0:8  Function Definition: @main( ( temp structure{ temp 4-component vector of float Position,  temp 3-component vector of float clip0,  temp 4-component vector of float clip1})
+0:8    Function Parameters: 
+0:?     Sequence
+0:10      move second child to first child ( temp 4-component vector of float)
+0:10        Position: direct index for structure ( temp 4-component vector of float)
+0:10          'Output' ( temp structure{ temp 4-component vector of float Position,  temp 3-component vector of float clip0,  temp 4-component vector of float clip1})
+0:10          Constant:
+0:10            0 (const int)
+0:10        Constant:
+0:10          0.000000
+0:10          0.000000
+0:10          0.000000
+0:10          0.000000
+0:12      move second child to first child ( temp float)
+0:12        direct index ( temp float)
+0:12          clip0: direct index for structure ( temp 3-component vector of float)
+0:12            'Output' ( temp structure{ temp 4-component vector of float Position,  temp 3-component vector of float clip0,  temp 4-component vector of float clip1})
+0:12            Constant:
+0:12              1 (const int)
+0:12          Constant:
+0:12            0 (const int)
+0:12        Constant:
+0:12          0.000000
+0:13      move second child to first child ( temp float)
+0:13        direct index ( temp float)
+0:13          clip0: direct index for structure ( temp 3-component vector of float)
+0:13            'Output' ( temp structure{ temp 4-component vector of float Position,  temp 3-component vector of float clip0,  temp 4-component vector of float clip1})
+0:13            Constant:
+0:13              1 (const int)
+0:13          Constant:
+0:13            1 (const int)
+0:13        Constant:
+0:13          1.000000
+0:14      move second child to first child ( temp float)
+0:14        direct index ( temp float)
+0:14          clip0: direct index for structure ( temp 3-component vector of float)
+0:14            'Output' ( temp structure{ temp 4-component vector of float Position,  temp 3-component vector of float clip0,  temp 4-component vector of float clip1})
+0:14            Constant:
+0:14              1 (const int)
+0:14          Constant:
+0:14            2 (const int)
+0:14        Constant:
+0:14          2.000000
+0:17      move second child to first child ( temp float)
+0:17        direct index ( temp float)
+0:17          clip1: direct index for structure ( temp 4-component vector of float)
+0:17            'Output' ( temp structure{ temp 4-component vector of float Position,  temp 3-component vector of float clip0,  temp 4-component vector of float clip1})
+0:17            Constant:
+0:17              2 (const int)
+0:17          Constant:
+0:17            0 (const int)
+0:17        Constant:
+0:17          4.000000
+0:18      move second child to first child ( temp float)
+0:18        direct index ( temp float)
+0:18          clip1: direct index for structure ( temp 4-component vector of float)
+0:18            'Output' ( temp structure{ temp 4-component vector of float Position,  temp 3-component vector of float clip0,  temp 4-component vector of float clip1})
+0:18            Constant:
+0:18              2 (const int)
+0:18          Constant:
+0:18            1 (const int)
+0:18        Constant:
+0:18          5.000000
+0:19      move second child to first child ( temp float)
+0:19        direct index ( temp float)
+0:19          clip1: direct index for structure ( temp 4-component vector of float)
+0:19            'Output' ( temp structure{ temp 4-component vector of float Position,  temp 3-component vector of float clip0,  temp 4-component vector of float clip1})
+0:19            Constant:
+0:19              2 (const int)
+0:19          Constant:
+0:19            2 (const int)
+0:19        Constant:
+0:19          6.000000
+0:20      move second child to first child ( temp float)
+0:20        direct index ( temp float)
+0:20          clip1: direct index for structure ( temp 4-component vector of float)
+0:20            'Output' ( temp structure{ temp 4-component vector of float Position,  temp 3-component vector of float clip0,  temp 4-component vector of float clip1})
+0:20            Constant:
+0:20              2 (const int)
+0:20          Constant:
+0:20            3 (const int)
+0:20        Constant:
+0:20          7.000000
+0:22      Branch: Return with expression
+0:22        'Output' ( temp structure{ temp 4-component vector of float Position,  temp 3-component vector of float clip0,  temp 4-component vector of float clip1})
+0:8  Function Definition: main( ( temp void)
+0:8    Function Parameters: 
+0:?     Sequence
+0:8      Sequence
+0:8        move second child to first child ( temp structure{ temp 4-component vector of float Position,  temp 3-component vector of float clip0,  temp 4-component vector of float clip1})
+0:8          'flattenTemp' ( temp structure{ temp 4-component vector of float Position,  temp 3-component vector of float clip0,  temp 4-component vector of float clip1})
+0:8          Function Call: @main( ( temp structure{ temp 4-component vector of float Position,  temp 3-component vector of float clip0,  temp 4-component vector of float clip1})
+0:8        move second child to first child ( temp 4-component vector of float)
+0:?           '@entryPointOutput.Position' ( out 4-component vector of float Position)
+0:8          Position: direct index for structure ( temp 4-component vector of float)
+0:8            'flattenTemp' ( temp structure{ temp 4-component vector of float Position,  temp 3-component vector of float clip0,  temp 4-component vector of float clip1})
+0:8            Constant:
+0:8              0 (const int)
+0:?         Sequence
+0:8          move second child to first child ( temp float)
+0:8            direct index ( out float ClipDistance)
+0:?               '@entryPointOutput.clip1' ( out 8-element array of float ClipDistance)
+0:8              Constant:
+0:8                0 (const int)
+0:8            direct index ( temp float)
+0:8              clip0: direct index for structure ( temp 3-component vector of float)
+0:8                'flattenTemp' ( temp structure{ temp 4-component vector of float Position,  temp 3-component vector of float clip0,  temp 4-component vector of float clip1})
+0:8                Constant:
+0:8                  1 (const int)
+0:8              Constant:
+0:8                0 (const int)
+0:8          move second child to first child ( temp float)
+0:8            direct index ( out float ClipDistance)
+0:?               '@entryPointOutput.clip1' ( out 8-element array of float ClipDistance)
+0:8              Constant:
+0:8                1 (const int)
+0:8            direct index ( temp float)
+0:8              clip0: direct index for structure ( temp 3-component vector of float)
+0:8                'flattenTemp' ( temp structure{ temp 4-component vector of float Position,  temp 3-component vector of float clip0,  temp 4-component vector of float clip1})
+0:8                Constant:
+0:8                  1 (const int)
+0:8              Constant:
+0:8                1 (const int)
+0:8          move second child to first child ( temp float)
+0:8            direct index ( out float ClipDistance)
+0:?               '@entryPointOutput.clip1' ( out 8-element array of float ClipDistance)
+0:8              Constant:
+0:8                2 (const int)
+0:8            direct index ( temp float)
+0:8              clip0: direct index for structure ( temp 3-component vector of float)
+0:8                'flattenTemp' ( temp structure{ temp 4-component vector of float Position,  temp 3-component vector of float clip0,  temp 4-component vector of float clip1})
+0:8                Constant:
+0:8                  1 (const int)
+0:8              Constant:
+0:8                2 (const int)
+0:?         Sequence
+0:8          move second child to first child ( temp float)
+0:8            direct index ( out float ClipDistance)
+0:?               '@entryPointOutput.clip1' ( out 8-element array of float ClipDistance)
+0:8              Constant:
+0:8                4 (const int)
+0:8            direct index ( temp float)
+0:8              clip1: direct index for structure ( temp 4-component vector of float)
+0:8                'flattenTemp' ( temp structure{ temp 4-component vector of float Position,  temp 3-component vector of float clip0,  temp 4-component vector of float clip1})
+0:8                Constant:
+0:8                  2 (const int)
+0:8              Constant:
+0:8                0 (const int)
+0:8          move second child to first child ( temp float)
+0:8            direct index ( out float ClipDistance)
+0:?               '@entryPointOutput.clip1' ( out 8-element array of float ClipDistance)
+0:8              Constant:
+0:8                5 (const int)
+0:8            direct index ( temp float)
+0:8              clip1: direct index for structure ( temp 4-component vector of float)
+0:8                'flattenTemp' ( temp structure{ temp 4-component vector of float Position,  temp 3-component vector of float clip0,  temp 4-component vector of float clip1})
+0:8                Constant:
+0:8                  2 (const int)
+0:8              Constant:
+0:8                1 (const int)
+0:8          move second child to first child ( temp float)
+0:8            direct index ( out float ClipDistance)
+0:?               '@entryPointOutput.clip1' ( out 8-element array of float ClipDistance)
+0:8              Constant:
+0:8                6 (const int)
+0:8            direct index ( temp float)
+0:8              clip1: direct index for structure ( temp 4-component vector of float)
+0:8                'flattenTemp' ( temp structure{ temp 4-component vector of float Position,  temp 3-component vector of float clip0,  temp 4-component vector of float clip1})
+0:8                Constant:
+0:8                  2 (const int)
+0:8              Constant:
+0:8                2 (const int)
+0:8          move second child to first child ( temp float)
+0:8            direct index ( out float ClipDistance)
+0:?               '@entryPointOutput.clip1' ( out 8-element array of float ClipDistance)
+0:8              Constant:
+0:8                7 (const int)
+0:8            direct index ( temp float)
+0:8              clip1: direct index for structure ( temp 4-component vector of float)
+0:8                'flattenTemp' ( temp structure{ temp 4-component vector of float Position,  temp 3-component vector of float clip0,  temp 4-component vector of float clip1})
+0:8                Constant:
+0:8                  2 (const int)
+0:8              Constant:
+0:8                3 (const int)
+0:?   Linker Objects
+0:?     '@entryPointOutput.Position' ( out 4-component vector of float Position)
+0:?     '@entryPointOutput.clip1' ( out 8-element array of float ClipDistance)
+
+
+Linked vertex stage:
+
+
+Shader version: 500
+0:? Sequence
+0:8  Function Definition: @main( ( temp structure{ temp 4-component vector of float Position,  temp 3-component vector of float clip0,  temp 4-component vector of float clip1})
+0:8    Function Parameters: 
+0:?     Sequence
+0:10      move second child to first child ( temp 4-component vector of float)
+0:10        Position: direct index for structure ( temp 4-component vector of float)
+0:10          'Output' ( temp structure{ temp 4-component vector of float Position,  temp 3-component vector of float clip0,  temp 4-component vector of float clip1})
+0:10          Constant:
+0:10            0 (const int)
+0:10        Constant:
+0:10          0.000000
+0:10          0.000000
+0:10          0.000000
+0:10          0.000000
+0:12      move second child to first child ( temp float)
+0:12        direct index ( temp float)
+0:12          clip0: direct index for structure ( temp 3-component vector of float)
+0:12            'Output' ( temp structure{ temp 4-component vector of float Position,  temp 3-component vector of float clip0,  temp 4-component vector of float clip1})
+0:12            Constant:
+0:12              1 (const int)
+0:12          Constant:
+0:12            0 (const int)
+0:12        Constant:
+0:12          0.000000
+0:13      move second child to first child ( temp float)
+0:13        direct index ( temp float)
+0:13          clip0: direct index for structure ( temp 3-component vector of float)
+0:13            'Output' ( temp structure{ temp 4-component vector of float Position,  temp 3-component vector of float clip0,  temp 4-component vector of float clip1})
+0:13            Constant:
+0:13              1 (const int)
+0:13          Constant:
+0:13            1 (const int)
+0:13        Constant:
+0:13          1.000000
+0:14      move second child to first child ( temp float)
+0:14        direct index ( temp float)
+0:14          clip0: direct index for structure ( temp 3-component vector of float)
+0:14            'Output' ( temp structure{ temp 4-component vector of float Position,  temp 3-component vector of float clip0,  temp 4-component vector of float clip1})
+0:14            Constant:
+0:14              1 (const int)
+0:14          Constant:
+0:14            2 (const int)
+0:14        Constant:
+0:14          2.000000
+0:17      move second child to first child ( temp float)
+0:17        direct index ( temp float)
+0:17          clip1: direct index for structure ( temp 4-component vector of float)
+0:17            'Output' ( temp structure{ temp 4-component vector of float Position,  temp 3-component vector of float clip0,  temp 4-component vector of float clip1})
+0:17            Constant:
+0:17              2 (const int)
+0:17          Constant:
+0:17            0 (const int)
+0:17        Constant:
+0:17          4.000000
+0:18      move second child to first child ( temp float)
+0:18        direct index ( temp float)
+0:18          clip1: direct index for structure ( temp 4-component vector of float)
+0:18            'Output' ( temp structure{ temp 4-component vector of float Position,  temp 3-component vector of float clip0,  temp 4-component vector of float clip1})
+0:18            Constant:
+0:18              2 (const int)
+0:18          Constant:
+0:18            1 (const int)
+0:18        Constant:
+0:18          5.000000
+0:19      move second child to first child ( temp float)
+0:19        direct index ( temp float)
+0:19          clip1: direct index for structure ( temp 4-component vector of float)
+0:19            'Output' ( temp structure{ temp 4-component vector of float Position,  temp 3-component vector of float clip0,  temp 4-component vector of float clip1})
+0:19            Constant:
+0:19              2 (const int)
+0:19          Constant:
+0:19            2 (const int)
+0:19        Constant:
+0:19          6.000000
+0:20      move second child to first child ( temp float)
+0:20        direct index ( temp float)
+0:20          clip1: direct index for structure ( temp 4-component vector of float)
+0:20            'Output' ( temp structure{ temp 4-component vector of float Position,  temp 3-component vector of float clip0,  temp 4-component vector of float clip1})
+0:20            Constant:
+0:20              2 (const int)
+0:20          Constant:
+0:20            3 (const int)
+0:20        Constant:
+0:20          7.000000
+0:22      Branch: Return with expression
+0:22        'Output' ( temp structure{ temp 4-component vector of float Position,  temp 3-component vector of float clip0,  temp 4-component vector of float clip1})
+0:8  Function Definition: main( ( temp void)
+0:8    Function Parameters: 
+0:?     Sequence
+0:8      Sequence
+0:8        move second child to first child ( temp structure{ temp 4-component vector of float Position,  temp 3-component vector of float clip0,  temp 4-component vector of float clip1})
+0:8          'flattenTemp' ( temp structure{ temp 4-component vector of float Position,  temp 3-component vector of float clip0,  temp 4-component vector of float clip1})
+0:8          Function Call: @main( ( temp structure{ temp 4-component vector of float Position,  temp 3-component vector of float clip0,  temp 4-component vector of float clip1})
+0:8        move second child to first child ( temp 4-component vector of float)
+0:?           '@entryPointOutput.Position' ( out 4-component vector of float Position)
+0:8          Position: direct index for structure ( temp 4-component vector of float)
+0:8            'flattenTemp' ( temp structure{ temp 4-component vector of float Position,  temp 3-component vector of float clip0,  temp 4-component vector of float clip1})
+0:8            Constant:
+0:8              0 (const int)
+0:?         Sequence
+0:8          move second child to first child ( temp float)
+0:8            direct index ( out float ClipDistance)
+0:?               '@entryPointOutput.clip1' ( out 8-element array of float ClipDistance)
+0:8              Constant:
+0:8                0 (const int)
+0:8            direct index ( temp float)
+0:8              clip0: direct index for structure ( temp 3-component vector of float)
+0:8                'flattenTemp' ( temp structure{ temp 4-component vector of float Position,  temp 3-component vector of float clip0,  temp 4-component vector of float clip1})
+0:8                Constant:
+0:8                  1 (const int)
+0:8              Constant:
+0:8                0 (const int)
+0:8          move second child to first child ( temp float)
+0:8            direct index ( out float ClipDistance)
+0:?               '@entryPointOutput.clip1' ( out 8-element array of float ClipDistance)
+0:8              Constant:
+0:8                1 (const int)
+0:8            direct index ( temp float)
+0:8              clip0: direct index for structure ( temp 3-component vector of float)
+0:8                'flattenTemp' ( temp structure{ temp 4-component vector of float Position,  temp 3-component vector of float clip0,  temp 4-component vector of float clip1})
+0:8                Constant:
+0:8                  1 (const int)
+0:8              Constant:
+0:8                1 (const int)
+0:8          move second child to first child ( temp float)
+0:8            direct index ( out float ClipDistance)
+0:?               '@entryPointOutput.clip1' ( out 8-element array of float ClipDistance)
+0:8              Constant:
+0:8                2 (const int)
+0:8            direct index ( temp float)
+0:8              clip0: direct index for structure ( temp 3-component vector of float)
+0:8                'flattenTemp' ( temp structure{ temp 4-component vector of float Position,  temp 3-component vector of float clip0,  temp 4-component vector of float clip1})
+0:8                Constant:
+0:8                  1 (const int)
+0:8              Constant:
+0:8                2 (const int)
+0:?         Sequence
+0:8          move second child to first child ( temp float)
+0:8            direct index ( out float ClipDistance)
+0:?               '@entryPointOutput.clip1' ( out 8-element array of float ClipDistance)
+0:8              Constant:
+0:8                4 (const int)
+0:8            direct index ( temp float)
+0:8              clip1: direct index for structure ( temp 4-component vector of float)
+0:8                'flattenTemp' ( temp structure{ temp 4-component vector of float Position,  temp 3-component vector of float clip0,  temp 4-component vector of float clip1})
+0:8                Constant:
+0:8                  2 (const int)
+0:8              Constant:
+0:8                0 (const int)
+0:8          move second child to first child ( temp float)
+0:8            direct index ( out float ClipDistance)
+0:?               '@entryPointOutput.clip1' ( out 8-element array of float ClipDistance)
+0:8              Constant:
+0:8                5 (const int)
+0:8            direct index ( temp float)
+0:8              clip1: direct index for structure ( temp 4-component vector of float)
+0:8                'flattenTemp' ( temp structure{ temp 4-component vector of float Position,  temp 3-component vector of float clip0,  temp 4-component vector of float clip1})
+0:8                Constant:
+0:8                  2 (const int)
+0:8              Constant:
+0:8                1 (const int)
+0:8          move second child to first child ( temp float)
+0:8            direct index ( out float ClipDistance)
+0:?               '@entryPointOutput.clip1' ( out 8-element array of float ClipDistance)
+0:8              Constant:
+0:8                6 (const int)
+0:8            direct index ( temp float)
+0:8              clip1: direct index for structure ( temp 4-component vector of float)
+0:8                'flattenTemp' ( temp structure{ temp 4-component vector of float Position,  temp 3-component vector of float clip0,  temp 4-component vector of float clip1})
+0:8                Constant:
+0:8                  2 (const int)
+0:8              Constant:
+0:8                2 (const int)
+0:8          move second child to first child ( temp float)
+0:8            direct index ( out float ClipDistance)
+0:?               '@entryPointOutput.clip1' ( out 8-element array of float ClipDistance)
+0:8              Constant:
+0:8                7 (const int)
+0:8            direct index ( temp float)
+0:8              clip1: direct index for structure ( temp 4-component vector of float)
+0:8                'flattenTemp' ( temp structure{ temp 4-component vector of float Position,  temp 3-component vector of float clip0,  temp 4-component vector of float clip1})
+0:8                Constant:
+0:8                  2 (const int)
+0:8              Constant:
+0:8                3 (const int)
+0:?   Linker Objects
+0:?     '@entryPointOutput.Position' ( out 4-component vector of float Position)
+0:?     '@entryPointOutput.clip1' ( out 8-element array of float ClipDistance)
+
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 81
+
+                              Capability Shader
+                              Capability ClipDistance
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Vertex 4  "main" 48 54
+                              Source HLSL 500
+                              Name 4  "main"
+                              Name 9  "VS_OUTPUT"
+                              MemberName 9(VS_OUTPUT) 0  "Position"
+                              MemberName 9(VS_OUTPUT) 1  "clip0"
+                              MemberName 9(VS_OUTPUT) 2  "clip1"
+                              Name 11  "@main("
+                              Name 14  "Output"
+                              Name 45  "flattenTemp"
+                              Name 48  "@entryPointOutput.Position"
+                              Name 54  "@entryPointOutput.clip1"
+                              Decorate 48(@entryPointOutput.Position) BuiltIn Position
+                              Decorate 54(@entryPointOutput.clip1) BuiltIn ClipDistance
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+               8:             TypeVector 6(float) 3
+    9(VS_OUTPUT):             TypeStruct 7(fvec4) 8(fvec3) 7(fvec4)
+              10:             TypeFunction 9(VS_OUTPUT)
+              13:             TypePointer Function 9(VS_OUTPUT)
+              15:             TypeInt 32 1
+              16:     15(int) Constant 0
+              17:    6(float) Constant 0
+              18:    7(fvec4) ConstantComposite 17 17 17 17
+              19:             TypePointer Function 7(fvec4)
+              21:     15(int) Constant 1
+              22:             TypeInt 32 0
+              23:     22(int) Constant 0
+              24:             TypePointer Function 6(float)
+              26:    6(float) Constant 1065353216
+              27:     22(int) Constant 1
+              29:    6(float) Constant 1073741824
+              30:     22(int) Constant 2
+              32:     15(int) Constant 2
+              33:    6(float) Constant 1082130432
+              35:    6(float) Constant 1084227584
+              37:    6(float) Constant 1086324736
+              39:    6(float) Constant 1088421888
+              40:     22(int) Constant 3
+              47:             TypePointer Output 7(fvec4)
+48(@entryPointOutput.Position):     47(ptr) Variable Output
+              51:     22(int) Constant 8
+              52:             TypeArray 6(float) 51
+              53:             TypePointer Output 52
+54(@entryPointOutput.clip1):     53(ptr) Variable Output
+              57:             TypePointer Output 6(float)
+              65:     15(int) Constant 4
+              69:     15(int) Constant 5
+              73:     15(int) Constant 6
+              77:     15(int) Constant 7
+         4(main):           2 Function None 3
+               5:             Label
+ 45(flattenTemp):     13(ptr) Variable Function
+              46:9(VS_OUTPUT) FunctionCall 11(@main()
+                              Store 45(flattenTemp) 46
+              49:     19(ptr) AccessChain 45(flattenTemp) 16
+              50:    7(fvec4) Load 49
+                              Store 48(@entryPointOutput.Position) 50
+              55:     24(ptr) AccessChain 45(flattenTemp) 21 23
+              56:    6(float) Load 55
+              58:     57(ptr) AccessChain 54(@entryPointOutput.clip1) 16
+                              Store 58 56
+              59:     24(ptr) AccessChain 45(flattenTemp) 21 27
+              60:    6(float) Load 59
+              61:     57(ptr) AccessChain 54(@entryPointOutput.clip1) 21
+                              Store 61 60
+              62:     24(ptr) AccessChain 45(flattenTemp) 21 30
+              63:    6(float) Load 62
+              64:     57(ptr) AccessChain 54(@entryPointOutput.clip1) 32
+                              Store 64 63
+              66:     24(ptr) AccessChain 45(flattenTemp) 32 23
+              67:    6(float) Load 66
+              68:     57(ptr) AccessChain 54(@entryPointOutput.clip1) 65
+                              Store 68 67
+              70:     24(ptr) AccessChain 45(flattenTemp) 32 27
+              71:    6(float) Load 70
+              72:     57(ptr) AccessChain 54(@entryPointOutput.clip1) 69
+                              Store 72 71
+              74:     24(ptr) AccessChain 45(flattenTemp) 32 30
+              75:    6(float) Load 74
+              76:     57(ptr) AccessChain 54(@entryPointOutput.clip1) 73
+                              Store 76 75
+              78:     24(ptr) AccessChain 45(flattenTemp) 32 40
+              79:    6(float) Load 78
+              80:     57(ptr) AccessChain 54(@entryPointOutput.clip1) 77
+                              Store 80 79
+                              Return
+                              FunctionEnd
+      11(@main():9(VS_OUTPUT) Function None 10
+              12:             Label
+      14(Output):     13(ptr) Variable Function
+              20:     19(ptr) AccessChain 14(Output) 16
+                              Store 20 18
+              25:     24(ptr) AccessChain 14(Output) 21 23
+                              Store 25 17
+              28:     24(ptr) AccessChain 14(Output) 21 27
+                              Store 28 26
+              31:     24(ptr) AccessChain 14(Output) 21 30
+                              Store 31 29
+              34:     24(ptr) AccessChain 14(Output) 32 23
+                              Store 34 33
+              36:     24(ptr) AccessChain 14(Output) 32 27
+                              Store 36 35
+              38:     24(ptr) AccessChain 14(Output) 32 30
+                              Store 38 37
+              41:     24(ptr) AccessChain 14(Output) 32 40
+                              Store 41 39
+              42:9(VS_OUTPUT) Load 14(Output)
+                              ReturnValue 42
+                              FunctionEnd
diff --git a/Test/baseResults/hlsl.clipdistance-8.frag.out b/Test/baseResults/hlsl.clipdistance-8.frag.out
new file mode 100644
index 0000000..98c9505
--- /dev/null
+++ b/Test/baseResults/hlsl.clipdistance-8.frag.out
@@ -0,0 +1,285 @@
+hlsl.clipdistance-8.frag
+Shader version: 500
+gl_FragCoord origin is upper left
+0:? Sequence
+0:8  Function Definition: @main(struct-VS_OUTPUT-vf4-vf3-f11; ( temp 4-component vector of float)
+0:8    Function Parameters: 
+0:8      'v' ( in structure{ temp 4-component vector of float Position,  temp 3-component vector of float clip0,  temp float clip1})
+0:?     Sequence
+0:9      Branch: Return with expression
+0:9        add ( temp 4-component vector of float)
+0:9          add ( temp 4-component vector of float)
+0:9            Position: direct index for structure ( temp 4-component vector of float)
+0:9              'v' ( in structure{ temp 4-component vector of float Position,  temp 3-component vector of float clip0,  temp float clip1})
+0:9              Constant:
+0:9                0 (const int)
+0:9            direct index ( temp float)
+0:9              clip0: direct index for structure ( temp 3-component vector of float)
+0:9                'v' ( in structure{ temp 4-component vector of float Position,  temp 3-component vector of float clip0,  temp float clip1})
+0:9                Constant:
+0:9                  1 (const int)
+0:9              Constant:
+0:9                0 (const int)
+0:9          clip1: direct index for structure ( temp float)
+0:9            'v' ( in structure{ temp 4-component vector of float Position,  temp 3-component vector of float clip0,  temp float clip1})
+0:9            Constant:
+0:9              2 (const int)
+0:8  Function Definition: main( ( temp void)
+0:8    Function Parameters: 
+0:?     Sequence
+0:8      Sequence
+0:8        move second child to first child ( temp 4-component vector of float)
+0:8          Position: direct index for structure ( temp 4-component vector of float)
+0:?             'v' ( temp structure{ temp 4-component vector of float Position,  temp 3-component vector of float clip0,  temp float clip1})
+0:8            Constant:
+0:8              0 (const int)
+0:?           'v.Position' ( in 4-component vector of float FragCoord)
+0:?         Sequence
+0:8          move second child to first child ( temp float)
+0:8            direct index ( temp float)
+0:8              clip0: direct index for structure ( temp 3-component vector of float)
+0:?                 'v' ( temp structure{ temp 4-component vector of float Position,  temp 3-component vector of float clip0,  temp float clip1})
+0:8                Constant:
+0:8                  1 (const int)
+0:8              Constant:
+0:8                0 (const int)
+0:8            direct index ( in float ClipDistance)
+0:?               'v.clip1' ( in 4-element array of float ClipDistance)
+0:8              Constant:
+0:8                0 (const int)
+0:8          move second child to first child ( temp float)
+0:8            direct index ( temp float)
+0:8              clip0: direct index for structure ( temp 3-component vector of float)
+0:?                 'v' ( temp structure{ temp 4-component vector of float Position,  temp 3-component vector of float clip0,  temp float clip1})
+0:8                Constant:
+0:8                  1 (const int)
+0:8              Constant:
+0:8                1 (const int)
+0:8            direct index ( in float ClipDistance)
+0:?               'v.clip1' ( in 4-element array of float ClipDistance)
+0:8              Constant:
+0:8                1 (const int)
+0:8          move second child to first child ( temp float)
+0:8            direct index ( temp float)
+0:8              clip0: direct index for structure ( temp 3-component vector of float)
+0:?                 'v' ( temp structure{ temp 4-component vector of float Position,  temp 3-component vector of float clip0,  temp float clip1})
+0:8                Constant:
+0:8                  1 (const int)
+0:8              Constant:
+0:8                2 (const int)
+0:8            direct index ( in float ClipDistance)
+0:?               'v.clip1' ( in 4-element array of float ClipDistance)
+0:8              Constant:
+0:8                2 (const int)
+0:?         Sequence
+0:8          move second child to first child ( temp float)
+0:8            clip1: direct index for structure ( temp float)
+0:?               'v' ( temp structure{ temp 4-component vector of float Position,  temp 3-component vector of float clip0,  temp float clip1})
+0:8              Constant:
+0:8                2 (const int)
+0:8            direct index ( in float ClipDistance)
+0:?               'v.clip1' ( in 4-element array of float ClipDistance)
+0:8              Constant:
+0:8                3 (const int)
+0:8      move second child to first child ( temp 4-component vector of float)
+0:?         '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+0:8        Function Call: @main(struct-VS_OUTPUT-vf4-vf3-f11; ( temp 4-component vector of float)
+0:?           'v' ( temp structure{ temp 4-component vector of float Position,  temp 3-component vector of float clip0,  temp float clip1})
+0:?   Linker Objects
+0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+0:?     'v.Position' ( in 4-component vector of float FragCoord)
+0:?     'v.clip1' ( in 4-element array of float ClipDistance)
+
+
+Linked fragment stage:
+
+
+Shader version: 500
+gl_FragCoord origin is upper left
+0:? Sequence
+0:8  Function Definition: @main(struct-VS_OUTPUT-vf4-vf3-f11; ( temp 4-component vector of float)
+0:8    Function Parameters: 
+0:8      'v' ( in structure{ temp 4-component vector of float Position,  temp 3-component vector of float clip0,  temp float clip1})
+0:?     Sequence
+0:9      Branch: Return with expression
+0:9        add ( temp 4-component vector of float)
+0:9          add ( temp 4-component vector of float)
+0:9            Position: direct index for structure ( temp 4-component vector of float)
+0:9              'v' ( in structure{ temp 4-component vector of float Position,  temp 3-component vector of float clip0,  temp float clip1})
+0:9              Constant:
+0:9                0 (const int)
+0:9            direct index ( temp float)
+0:9              clip0: direct index for structure ( temp 3-component vector of float)
+0:9                'v' ( in structure{ temp 4-component vector of float Position,  temp 3-component vector of float clip0,  temp float clip1})
+0:9                Constant:
+0:9                  1 (const int)
+0:9              Constant:
+0:9                0 (const int)
+0:9          clip1: direct index for structure ( temp float)
+0:9            'v' ( in structure{ temp 4-component vector of float Position,  temp 3-component vector of float clip0,  temp float clip1})
+0:9            Constant:
+0:9              2 (const int)
+0:8  Function Definition: main( ( temp void)
+0:8    Function Parameters: 
+0:?     Sequence
+0:8      Sequence
+0:8        move second child to first child ( temp 4-component vector of float)
+0:8          Position: direct index for structure ( temp 4-component vector of float)
+0:?             'v' ( temp structure{ temp 4-component vector of float Position,  temp 3-component vector of float clip0,  temp float clip1})
+0:8            Constant:
+0:8              0 (const int)
+0:?           'v.Position' ( in 4-component vector of float FragCoord)
+0:?         Sequence
+0:8          move second child to first child ( temp float)
+0:8            direct index ( temp float)
+0:8              clip0: direct index for structure ( temp 3-component vector of float)
+0:?                 'v' ( temp structure{ temp 4-component vector of float Position,  temp 3-component vector of float clip0,  temp float clip1})
+0:8                Constant:
+0:8                  1 (const int)
+0:8              Constant:
+0:8                0 (const int)
+0:8            direct index ( in float ClipDistance)
+0:?               'v.clip1' ( in 4-element array of float ClipDistance)
+0:8              Constant:
+0:8                0 (const int)
+0:8          move second child to first child ( temp float)
+0:8            direct index ( temp float)
+0:8              clip0: direct index for structure ( temp 3-component vector of float)
+0:?                 'v' ( temp structure{ temp 4-component vector of float Position,  temp 3-component vector of float clip0,  temp float clip1})
+0:8                Constant:
+0:8                  1 (const int)
+0:8              Constant:
+0:8                1 (const int)
+0:8            direct index ( in float ClipDistance)
+0:?               'v.clip1' ( in 4-element array of float ClipDistance)
+0:8              Constant:
+0:8                1 (const int)
+0:8          move second child to first child ( temp float)
+0:8            direct index ( temp float)
+0:8              clip0: direct index for structure ( temp 3-component vector of float)
+0:?                 'v' ( temp structure{ temp 4-component vector of float Position,  temp 3-component vector of float clip0,  temp float clip1})
+0:8                Constant:
+0:8                  1 (const int)
+0:8              Constant:
+0:8                2 (const int)
+0:8            direct index ( in float ClipDistance)
+0:?               'v.clip1' ( in 4-element array of float ClipDistance)
+0:8              Constant:
+0:8                2 (const int)
+0:?         Sequence
+0:8          move second child to first child ( temp float)
+0:8            clip1: direct index for structure ( temp float)
+0:?               'v' ( temp structure{ temp 4-component vector of float Position,  temp 3-component vector of float clip0,  temp float clip1})
+0:8              Constant:
+0:8                2 (const int)
+0:8            direct index ( in float ClipDistance)
+0:?               'v.clip1' ( in 4-element array of float ClipDistance)
+0:8              Constant:
+0:8                3 (const int)
+0:8      move second child to first child ( temp 4-component vector of float)
+0:?         '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+0:8        Function Call: @main(struct-VS_OUTPUT-vf4-vf3-f11; ( temp 4-component vector of float)
+0:?           'v' ( temp structure{ temp 4-component vector of float Position,  temp 3-component vector of float clip0,  temp float clip1})
+0:?   Linker Objects
+0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+0:?     'v.Position' ( in 4-component vector of float FragCoord)
+0:?     'v.clip1' ( in 4-element array of float ClipDistance)
+
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 65
+
+                              Capability Shader
+                              Capability ClipDistance
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 37 43 61
+                              ExecutionMode 4 OriginUpperLeft
+                              Source HLSL 500
+                              Name 4  "main"
+                              Name 9  "VS_OUTPUT"
+                              MemberName 9(VS_OUTPUT) 0  "Position"
+                              MemberName 9(VS_OUTPUT) 1  "clip0"
+                              MemberName 9(VS_OUTPUT) 2  "clip1"
+                              Name 13  "@main(struct-VS_OUTPUT-vf4-vf3-f11;"
+                              Name 12  "v"
+                              Name 35  "v"
+                              Name 37  "v.Position"
+                              Name 43  "v.clip1"
+                              Name 61  "@entryPointOutput"
+                              Name 62  "param"
+                              Decorate 37(v.Position) BuiltIn FragCoord
+                              Decorate 43(v.clip1) BuiltIn ClipDistance
+                              Decorate 61(@entryPointOutput) Location 0
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+               8:             TypeVector 6(float) 3
+    9(VS_OUTPUT):             TypeStruct 7(fvec4) 8(fvec3) 6(float)
+              10:             TypePointer Function 9(VS_OUTPUT)
+              11:             TypeFunction 7(fvec4) 10(ptr)
+              15:             TypeInt 32 1
+              16:     15(int) Constant 0
+              17:             TypePointer Function 7(fvec4)
+              20:     15(int) Constant 1
+              21:             TypeInt 32 0
+              22:     21(int) Constant 0
+              23:             TypePointer Function 6(float)
+              28:     15(int) Constant 2
+              36:             TypePointer Input 7(fvec4)
+  37(v.Position):     36(ptr) Variable Input
+              40:     21(int) Constant 4
+              41:             TypeArray 6(float) 40
+              42:             TypePointer Input 41
+     43(v.clip1):     42(ptr) Variable Input
+              44:             TypePointer Input 6(float)
+              50:     21(int) Constant 1
+              54:     21(int) Constant 2
+              56:     15(int) Constant 3
+              60:             TypePointer Output 7(fvec4)
+61(@entryPointOutput):     60(ptr) Variable Output
+         4(main):           2 Function None 3
+               5:             Label
+           35(v):     10(ptr) Variable Function
+       62(param):     10(ptr) Variable Function
+              38:    7(fvec4) Load 37(v.Position)
+              39:     17(ptr) AccessChain 35(v) 16
+                              Store 39 38
+              45:     44(ptr) AccessChain 43(v.clip1) 16
+              46:    6(float) Load 45
+              47:     23(ptr) AccessChain 35(v) 20 22
+                              Store 47 46
+              48:     44(ptr) AccessChain 43(v.clip1) 20
+              49:    6(float) Load 48
+              51:     23(ptr) AccessChain 35(v) 20 50
+                              Store 51 49
+              52:     44(ptr) AccessChain 43(v.clip1) 28
+              53:    6(float) Load 52
+              55:     23(ptr) AccessChain 35(v) 20 54
+                              Store 55 53
+              57:     44(ptr) AccessChain 43(v.clip1) 56
+              58:    6(float) Load 57
+              59:     23(ptr) AccessChain 35(v) 28
+                              Store 59 58
+              63:9(VS_OUTPUT) Load 35(v)
+                              Store 62(param) 63
+              64:    7(fvec4) FunctionCall 13(@main(struct-VS_OUTPUT-vf4-vf3-f11;) 62(param)
+                              Store 61(@entryPointOutput) 64
+                              Return
+                              FunctionEnd
+13(@main(struct-VS_OUTPUT-vf4-vf3-f11;):    7(fvec4) Function None 11
+           12(v):     10(ptr) FunctionParameter
+              14:             Label
+              18:     17(ptr) AccessChain 12(v) 16
+              19:    7(fvec4) Load 18
+              24:     23(ptr) AccessChain 12(v) 20 22
+              25:    6(float) Load 24
+              26:    7(fvec4) CompositeConstruct 25 25 25 25
+              27:    7(fvec4) FAdd 19 26
+              29:     23(ptr) AccessChain 12(v) 28
+              30:    6(float) Load 29
+              31:    7(fvec4) CompositeConstruct 30 30 30 30
+              32:    7(fvec4) FAdd 27 31
+                              ReturnValue 32
+                              FunctionEnd
diff --git a/Test/baseResults/hlsl.clipdistance-8.vert.out b/Test/baseResults/hlsl.clipdistance-8.vert.out
new file mode 100644
index 0000000..88800e3
--- /dev/null
+++ b/Test/baseResults/hlsl.clipdistance-8.vert.out
@@ -0,0 +1,336 @@
+hlsl.clipdistance-8.vert
+Shader version: 500
+0:? Sequence
+0:8  Function Definition: @main( ( temp structure{ temp 4-component vector of float Position,  temp 3-component vector of float clip0,  temp float clip1})
+0:8    Function Parameters: 
+0:?     Sequence
+0:10      move second child to first child ( temp 4-component vector of float)
+0:10        Position: direct index for structure ( temp 4-component vector of float)
+0:10          'Output' ( temp structure{ temp 4-component vector of float Position,  temp 3-component vector of float clip0,  temp float clip1})
+0:10          Constant:
+0:10            0 (const int)
+0:10        Constant:
+0:10          0.000000
+0:10          0.000000
+0:10          0.000000
+0:10          0.000000
+0:12      move second child to first child ( temp float)
+0:12        direct index ( temp float)
+0:12          clip0: direct index for structure ( temp 3-component vector of float)
+0:12            'Output' ( temp structure{ temp 4-component vector of float Position,  temp 3-component vector of float clip0,  temp float clip1})
+0:12            Constant:
+0:12              1 (const int)
+0:12          Constant:
+0:12            0 (const int)
+0:12        Constant:
+0:12          0.000000
+0:13      move second child to first child ( temp float)
+0:13        direct index ( temp float)
+0:13          clip0: direct index for structure ( temp 3-component vector of float)
+0:13            'Output' ( temp structure{ temp 4-component vector of float Position,  temp 3-component vector of float clip0,  temp float clip1})
+0:13            Constant:
+0:13              1 (const int)
+0:13          Constant:
+0:13            1 (const int)
+0:13        Constant:
+0:13          1.000000
+0:14      move second child to first child ( temp float)
+0:14        direct index ( temp float)
+0:14          clip0: direct index for structure ( temp 3-component vector of float)
+0:14            'Output' ( temp structure{ temp 4-component vector of float Position,  temp 3-component vector of float clip0,  temp float clip1})
+0:14            Constant:
+0:14              1 (const int)
+0:14          Constant:
+0:14            2 (const int)
+0:14        Constant:
+0:14          2.000000
+0:17      move second child to first child ( temp float)
+0:17        clip1: direct index for structure ( temp float)
+0:17          'Output' ( temp structure{ temp 4-component vector of float Position,  temp 3-component vector of float clip0,  temp float clip1})
+0:17          Constant:
+0:17            2 (const int)
+0:17        Constant:
+0:17          3.000000
+0:19      Branch: Return with expression
+0:19        'Output' ( temp structure{ temp 4-component vector of float Position,  temp 3-component vector of float clip0,  temp float clip1})
+0:8  Function Definition: main( ( temp void)
+0:8    Function Parameters: 
+0:?     Sequence
+0:8      Sequence
+0:8        move second child to first child ( temp structure{ temp 4-component vector of float Position,  temp 3-component vector of float clip0,  temp float clip1})
+0:8          'flattenTemp' ( temp structure{ temp 4-component vector of float Position,  temp 3-component vector of float clip0,  temp float clip1})
+0:8          Function Call: @main( ( temp structure{ temp 4-component vector of float Position,  temp 3-component vector of float clip0,  temp float clip1})
+0:8        move second child to first child ( temp 4-component vector of float)
+0:?           '@entryPointOutput.Position' ( out 4-component vector of float Position)
+0:8          Position: direct index for structure ( temp 4-component vector of float)
+0:8            'flattenTemp' ( temp structure{ temp 4-component vector of float Position,  temp 3-component vector of float clip0,  temp float clip1})
+0:8            Constant:
+0:8              0 (const int)
+0:?         Sequence
+0:8          move second child to first child ( temp float)
+0:8            direct index ( out float ClipDistance)
+0:?               '@entryPointOutput.clip1' ( out 4-element array of float ClipDistance)
+0:8              Constant:
+0:8                0 (const int)
+0:8            direct index ( temp float)
+0:8              clip0: direct index for structure ( temp 3-component vector of float)
+0:8                'flattenTemp' ( temp structure{ temp 4-component vector of float Position,  temp 3-component vector of float clip0,  temp float clip1})
+0:8                Constant:
+0:8                  1 (const int)
+0:8              Constant:
+0:8                0 (const int)
+0:8          move second child to first child ( temp float)
+0:8            direct index ( out float ClipDistance)
+0:?               '@entryPointOutput.clip1' ( out 4-element array of float ClipDistance)
+0:8              Constant:
+0:8                1 (const int)
+0:8            direct index ( temp float)
+0:8              clip0: direct index for structure ( temp 3-component vector of float)
+0:8                'flattenTemp' ( temp structure{ temp 4-component vector of float Position,  temp 3-component vector of float clip0,  temp float clip1})
+0:8                Constant:
+0:8                  1 (const int)
+0:8              Constant:
+0:8                1 (const int)
+0:8          move second child to first child ( temp float)
+0:8            direct index ( out float ClipDistance)
+0:?               '@entryPointOutput.clip1' ( out 4-element array of float ClipDistance)
+0:8              Constant:
+0:8                2 (const int)
+0:8            direct index ( temp float)
+0:8              clip0: direct index for structure ( temp 3-component vector of float)
+0:8                'flattenTemp' ( temp structure{ temp 4-component vector of float Position,  temp 3-component vector of float clip0,  temp float clip1})
+0:8                Constant:
+0:8                  1 (const int)
+0:8              Constant:
+0:8                2 (const int)
+0:?         Sequence
+0:8          move second child to first child ( temp float)
+0:8            direct index ( out float ClipDistance)
+0:?               '@entryPointOutput.clip1' ( out 4-element array of float ClipDistance)
+0:8              Constant:
+0:8                3 (const int)
+0:8            clip1: direct index for structure ( temp float)
+0:8              'flattenTemp' ( temp structure{ temp 4-component vector of float Position,  temp 3-component vector of float clip0,  temp float clip1})
+0:8              Constant:
+0:8                2 (const int)
+0:?   Linker Objects
+0:?     '@entryPointOutput.Position' ( out 4-component vector of float Position)
+0:?     '@entryPointOutput.clip1' ( out 4-element array of float ClipDistance)
+
+
+Linked vertex stage:
+
+
+Shader version: 500
+0:? Sequence
+0:8  Function Definition: @main( ( temp structure{ temp 4-component vector of float Position,  temp 3-component vector of float clip0,  temp float clip1})
+0:8    Function Parameters: 
+0:?     Sequence
+0:10      move second child to first child ( temp 4-component vector of float)
+0:10        Position: direct index for structure ( temp 4-component vector of float)
+0:10          'Output' ( temp structure{ temp 4-component vector of float Position,  temp 3-component vector of float clip0,  temp float clip1})
+0:10          Constant:
+0:10            0 (const int)
+0:10        Constant:
+0:10          0.000000
+0:10          0.000000
+0:10          0.000000
+0:10          0.000000
+0:12      move second child to first child ( temp float)
+0:12        direct index ( temp float)
+0:12          clip0: direct index for structure ( temp 3-component vector of float)
+0:12            'Output' ( temp structure{ temp 4-component vector of float Position,  temp 3-component vector of float clip0,  temp float clip1})
+0:12            Constant:
+0:12              1 (const int)
+0:12          Constant:
+0:12            0 (const int)
+0:12        Constant:
+0:12          0.000000
+0:13      move second child to first child ( temp float)
+0:13        direct index ( temp float)
+0:13          clip0: direct index for structure ( temp 3-component vector of float)
+0:13            'Output' ( temp structure{ temp 4-component vector of float Position,  temp 3-component vector of float clip0,  temp float clip1})
+0:13            Constant:
+0:13              1 (const int)
+0:13          Constant:
+0:13            1 (const int)
+0:13        Constant:
+0:13          1.000000
+0:14      move second child to first child ( temp float)
+0:14        direct index ( temp float)
+0:14          clip0: direct index for structure ( temp 3-component vector of float)
+0:14            'Output' ( temp structure{ temp 4-component vector of float Position,  temp 3-component vector of float clip0,  temp float clip1})
+0:14            Constant:
+0:14              1 (const int)
+0:14          Constant:
+0:14            2 (const int)
+0:14        Constant:
+0:14          2.000000
+0:17      move second child to first child ( temp float)
+0:17        clip1: direct index for structure ( temp float)
+0:17          'Output' ( temp structure{ temp 4-component vector of float Position,  temp 3-component vector of float clip0,  temp float clip1})
+0:17          Constant:
+0:17            2 (const int)
+0:17        Constant:
+0:17          3.000000
+0:19      Branch: Return with expression
+0:19        'Output' ( temp structure{ temp 4-component vector of float Position,  temp 3-component vector of float clip0,  temp float clip1})
+0:8  Function Definition: main( ( temp void)
+0:8    Function Parameters: 
+0:?     Sequence
+0:8      Sequence
+0:8        move second child to first child ( temp structure{ temp 4-component vector of float Position,  temp 3-component vector of float clip0,  temp float clip1})
+0:8          'flattenTemp' ( temp structure{ temp 4-component vector of float Position,  temp 3-component vector of float clip0,  temp float clip1})
+0:8          Function Call: @main( ( temp structure{ temp 4-component vector of float Position,  temp 3-component vector of float clip0,  temp float clip1})
+0:8        move second child to first child ( temp 4-component vector of float)
+0:?           '@entryPointOutput.Position' ( out 4-component vector of float Position)
+0:8          Position: direct index for structure ( temp 4-component vector of float)
+0:8            'flattenTemp' ( temp structure{ temp 4-component vector of float Position,  temp 3-component vector of float clip0,  temp float clip1})
+0:8            Constant:
+0:8              0 (const int)
+0:?         Sequence
+0:8          move second child to first child ( temp float)
+0:8            direct index ( out float ClipDistance)
+0:?               '@entryPointOutput.clip1' ( out 4-element array of float ClipDistance)
+0:8              Constant:
+0:8                0 (const int)
+0:8            direct index ( temp float)
+0:8              clip0: direct index for structure ( temp 3-component vector of float)
+0:8                'flattenTemp' ( temp structure{ temp 4-component vector of float Position,  temp 3-component vector of float clip0,  temp float clip1})
+0:8                Constant:
+0:8                  1 (const int)
+0:8              Constant:
+0:8                0 (const int)
+0:8          move second child to first child ( temp float)
+0:8            direct index ( out float ClipDistance)
+0:?               '@entryPointOutput.clip1' ( out 4-element array of float ClipDistance)
+0:8              Constant:
+0:8                1 (const int)
+0:8            direct index ( temp float)
+0:8              clip0: direct index for structure ( temp 3-component vector of float)
+0:8                'flattenTemp' ( temp structure{ temp 4-component vector of float Position,  temp 3-component vector of float clip0,  temp float clip1})
+0:8                Constant:
+0:8                  1 (const int)
+0:8              Constant:
+0:8                1 (const int)
+0:8          move second child to first child ( temp float)
+0:8            direct index ( out float ClipDistance)
+0:?               '@entryPointOutput.clip1' ( out 4-element array of float ClipDistance)
+0:8              Constant:
+0:8                2 (const int)
+0:8            direct index ( temp float)
+0:8              clip0: direct index for structure ( temp 3-component vector of float)
+0:8                'flattenTemp' ( temp structure{ temp 4-component vector of float Position,  temp 3-component vector of float clip0,  temp float clip1})
+0:8                Constant:
+0:8                  1 (const int)
+0:8              Constant:
+0:8                2 (const int)
+0:?         Sequence
+0:8          move second child to first child ( temp float)
+0:8            direct index ( out float ClipDistance)
+0:?               '@entryPointOutput.clip1' ( out 4-element array of float ClipDistance)
+0:8              Constant:
+0:8                3 (const int)
+0:8            clip1: direct index for structure ( temp float)
+0:8              'flattenTemp' ( temp structure{ temp 4-component vector of float Position,  temp 3-component vector of float clip0,  temp float clip1})
+0:8              Constant:
+0:8                2 (const int)
+0:?   Linker Objects
+0:?     '@entryPointOutput.Position' ( out 4-component vector of float Position)
+0:?     '@entryPointOutput.clip1' ( out 4-element array of float ClipDistance)
+
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 62
+
+                              Capability Shader
+                              Capability ClipDistance
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Vertex 4  "main" 41 47
+                              Source HLSL 500
+                              Name 4  "main"
+                              Name 9  "VS_OUTPUT"
+                              MemberName 9(VS_OUTPUT) 0  "Position"
+                              MemberName 9(VS_OUTPUT) 1  "clip0"
+                              MemberName 9(VS_OUTPUT) 2  "clip1"
+                              Name 11  "@main("
+                              Name 14  "Output"
+                              Name 38  "flattenTemp"
+                              Name 41  "@entryPointOutput.Position"
+                              Name 47  "@entryPointOutput.clip1"
+                              Decorate 41(@entryPointOutput.Position) BuiltIn Position
+                              Decorate 47(@entryPointOutput.clip1) BuiltIn ClipDistance
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+               8:             TypeVector 6(float) 3
+    9(VS_OUTPUT):             TypeStruct 7(fvec4) 8(fvec3) 6(float)
+              10:             TypeFunction 9(VS_OUTPUT)
+              13:             TypePointer Function 9(VS_OUTPUT)
+              15:             TypeInt 32 1
+              16:     15(int) Constant 0
+              17:    6(float) Constant 0
+              18:    7(fvec4) ConstantComposite 17 17 17 17
+              19:             TypePointer Function 7(fvec4)
+              21:     15(int) Constant 1
+              22:             TypeInt 32 0
+              23:     22(int) Constant 0
+              24:             TypePointer Function 6(float)
+              26:    6(float) Constant 1065353216
+              27:     22(int) Constant 1
+              29:    6(float) Constant 1073741824
+              30:     22(int) Constant 2
+              32:     15(int) Constant 2
+              33:    6(float) Constant 1077936128
+              40:             TypePointer Output 7(fvec4)
+41(@entryPointOutput.Position):     40(ptr) Variable Output
+              44:     22(int) Constant 4
+              45:             TypeArray 6(float) 44
+              46:             TypePointer Output 45
+47(@entryPointOutput.clip1):     46(ptr) Variable Output
+              50:             TypePointer Output 6(float)
+              58:     15(int) Constant 3
+         4(main):           2 Function None 3
+               5:             Label
+ 38(flattenTemp):     13(ptr) Variable Function
+              39:9(VS_OUTPUT) FunctionCall 11(@main()
+                              Store 38(flattenTemp) 39
+              42:     19(ptr) AccessChain 38(flattenTemp) 16
+              43:    7(fvec4) Load 42
+                              Store 41(@entryPointOutput.Position) 43
+              48:     24(ptr) AccessChain 38(flattenTemp) 21 23
+              49:    6(float) Load 48
+              51:     50(ptr) AccessChain 47(@entryPointOutput.clip1) 16
+                              Store 51 49
+              52:     24(ptr) AccessChain 38(flattenTemp) 21 27
+              53:    6(float) Load 52
+              54:     50(ptr) AccessChain 47(@entryPointOutput.clip1) 21
+                              Store 54 53
+              55:     24(ptr) AccessChain 38(flattenTemp) 21 30
+              56:    6(float) Load 55
+              57:     50(ptr) AccessChain 47(@entryPointOutput.clip1) 32
+                              Store 57 56
+              59:     24(ptr) AccessChain 38(flattenTemp) 32
+              60:    6(float) Load 59
+              61:     50(ptr) AccessChain 47(@entryPointOutput.clip1) 58
+                              Store 61 60
+                              Return
+                              FunctionEnd
+      11(@main():9(VS_OUTPUT) Function None 10
+              12:             Label
+      14(Output):     13(ptr) Variable Function
+              20:     19(ptr) AccessChain 14(Output) 16
+                              Store 20 18
+              25:     24(ptr) AccessChain 14(Output) 21 23
+                              Store 25 17
+              28:     24(ptr) AccessChain 14(Output) 21 27
+                              Store 28 26
+              31:     24(ptr) AccessChain 14(Output) 21 30
+                              Store 31 29
+              34:     24(ptr) AccessChain 14(Output) 32
+                              Store 34 33
+              35:9(VS_OUTPUT) Load 14(Output)
+                              ReturnValue 35
+                              FunctionEnd
diff --git a/Test/baseResults/hlsl.clipdistance-9.frag.out b/Test/baseResults/hlsl.clipdistance-9.frag.out
new file mode 100644
index 0000000..ff7f261
--- /dev/null
+++ b/Test/baseResults/hlsl.clipdistance-9.frag.out
@@ -0,0 +1,250 @@
+hlsl.clipdistance-9.frag
+Shader version: 500
+gl_FragCoord origin is upper left
+0:? Sequence
+0:6  Function Definition: @main(vf4;vf3;f1; ( temp 4-component vector of float)
+0:6    Function Parameters: 
+0:6      'Position' ( in 4-component vector of float)
+0:6      'clip0' ( in 3-component vector of float)
+0:6      'clip1' ( in float)
+0:?     Sequence
+0:7      Branch: Return with expression
+0:7        add ( temp 4-component vector of float)
+0:7          add ( temp 4-component vector of float)
+0:7            'Position' ( in 4-component vector of float)
+0:7            direct index ( temp float)
+0:7              'clip0' ( in 3-component vector of float)
+0:7              Constant:
+0:7                0 (const int)
+0:7          'clip1' ( in float)
+0:6  Function Definition: main( ( temp void)
+0:6    Function Parameters: 
+0:?     Sequence
+0:6      move second child to first child ( temp 4-component vector of float)
+0:?         'Position' ( temp 4-component vector of float)
+0:?         'Position' ( in 4-component vector of float FragCoord)
+0:?       Sequence
+0:6        move second child to first child ( temp float)
+0:6          direct index ( temp float)
+0:?             'clip0' ( temp 3-component vector of float)
+0:6            Constant:
+0:6              0 (const int)
+0:6          direct index ( in float ClipDistance)
+0:?             'clip0' ( in 4-element array of float ClipDistance)
+0:6            Constant:
+0:6              0 (const int)
+0:6        move second child to first child ( temp float)
+0:6          direct index ( temp float)
+0:?             'clip0' ( temp 3-component vector of float)
+0:6            Constant:
+0:6              1 (const int)
+0:6          direct index ( in float ClipDistance)
+0:?             'clip0' ( in 4-element array of float ClipDistance)
+0:6            Constant:
+0:6              1 (const int)
+0:6        move second child to first child ( temp float)
+0:6          direct index ( temp float)
+0:?             'clip0' ( temp 3-component vector of float)
+0:6            Constant:
+0:6              2 (const int)
+0:6          direct index ( in float ClipDistance)
+0:?             'clip0' ( in 4-element array of float ClipDistance)
+0:6            Constant:
+0:6              2 (const int)
+0:?       Sequence
+0:6        move second child to first child ( temp float)
+0:?           'clip1' ( temp float)
+0:6          direct index ( in float ClipDistance)
+0:?             'clip0' ( in 4-element array of float ClipDistance)
+0:6            Constant:
+0:6              3 (const int)
+0:6      move second child to first child ( temp 4-component vector of float)
+0:?         '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+0:6        Function Call: @main(vf4;vf3;f1; ( temp 4-component vector of float)
+0:?           'Position' ( temp 4-component vector of float)
+0:?           'clip0' ( temp 3-component vector of float)
+0:?           'clip1' ( temp float)
+0:?   Linker Objects
+0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+0:?     'Position' ( in 4-component vector of float FragCoord)
+0:?     'clip0' ( in 4-element array of float ClipDistance)
+
+
+Linked fragment stage:
+
+
+Shader version: 500
+gl_FragCoord origin is upper left
+0:? Sequence
+0:6  Function Definition: @main(vf4;vf3;f1; ( temp 4-component vector of float)
+0:6    Function Parameters: 
+0:6      'Position' ( in 4-component vector of float)
+0:6      'clip0' ( in 3-component vector of float)
+0:6      'clip1' ( in float)
+0:?     Sequence
+0:7      Branch: Return with expression
+0:7        add ( temp 4-component vector of float)
+0:7          add ( temp 4-component vector of float)
+0:7            'Position' ( in 4-component vector of float)
+0:7            direct index ( temp float)
+0:7              'clip0' ( in 3-component vector of float)
+0:7              Constant:
+0:7                0 (const int)
+0:7          'clip1' ( in float)
+0:6  Function Definition: main( ( temp void)
+0:6    Function Parameters: 
+0:?     Sequence
+0:6      move second child to first child ( temp 4-component vector of float)
+0:?         'Position' ( temp 4-component vector of float)
+0:?         'Position' ( in 4-component vector of float FragCoord)
+0:?       Sequence
+0:6        move second child to first child ( temp float)
+0:6          direct index ( temp float)
+0:?             'clip0' ( temp 3-component vector of float)
+0:6            Constant:
+0:6              0 (const int)
+0:6          direct index ( in float ClipDistance)
+0:?             'clip0' ( in 4-element array of float ClipDistance)
+0:6            Constant:
+0:6              0 (const int)
+0:6        move second child to first child ( temp float)
+0:6          direct index ( temp float)
+0:?             'clip0' ( temp 3-component vector of float)
+0:6            Constant:
+0:6              1 (const int)
+0:6          direct index ( in float ClipDistance)
+0:?             'clip0' ( in 4-element array of float ClipDistance)
+0:6            Constant:
+0:6              1 (const int)
+0:6        move second child to first child ( temp float)
+0:6          direct index ( temp float)
+0:?             'clip0' ( temp 3-component vector of float)
+0:6            Constant:
+0:6              2 (const int)
+0:6          direct index ( in float ClipDistance)
+0:?             'clip0' ( in 4-element array of float ClipDistance)
+0:6            Constant:
+0:6              2 (const int)
+0:?       Sequence
+0:6        move second child to first child ( temp float)
+0:?           'clip1' ( temp float)
+0:6          direct index ( in float ClipDistance)
+0:?             'clip0' ( in 4-element array of float ClipDistance)
+0:6            Constant:
+0:6              3 (const int)
+0:6      move second child to first child ( temp 4-component vector of float)
+0:?         '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+0:6        Function Call: @main(vf4;vf3;f1; ( temp 4-component vector of float)
+0:?           'Position' ( temp 4-component vector of float)
+0:?           'clip0' ( temp 3-component vector of float)
+0:?           'clip1' ( temp float)
+0:?   Linker Objects
+0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+0:?     'Position' ( in 4-component vector of float FragCoord)
+0:?     'clip0' ( in 4-element array of float ClipDistance)
+
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 68
+
+                              Capability Shader
+                              Capability ClipDistance
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 32 38 60
+                              ExecutionMode 4 OriginUpperLeft
+                              Source HLSL 500
+                              Name 4  "main"
+                              Name 16  "@main(vf4;vf3;f1;"
+                              Name 13  "Position"
+                              Name 14  "clip0"
+                              Name 15  "clip1"
+                              Name 30  "Position"
+                              Name 32  "Position"
+                              Name 34  "clip0"
+                              Name 38  "clip0"
+                              Name 55  "clip1"
+                              Name 60  "@entryPointOutput"
+                              Name 61  "param"
+                              Name 63  "param"
+                              Name 65  "param"
+                              Decorate 32(Position) BuiltIn FragCoord
+                              Decorate 38(clip0) BuiltIn ClipDistance
+                              Decorate 60(@entryPointOutput) Location 0
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+               8:             TypePointer Function 7(fvec4)
+               9:             TypeVector 6(float) 3
+              10:             TypePointer Function 9(fvec3)
+              11:             TypePointer Function 6(float)
+              12:             TypeFunction 7(fvec4) 8(ptr) 10(ptr) 11(ptr)
+              19:             TypeInt 32 0
+              20:     19(int) Constant 0
+              31:             TypePointer Input 7(fvec4)
+    32(Position):     31(ptr) Variable Input
+              35:     19(int) Constant 4
+              36:             TypeArray 6(float) 35
+              37:             TypePointer Input 36
+       38(clip0):     37(ptr) Variable Input
+              39:             TypeInt 32 1
+              40:     39(int) Constant 0
+              41:             TypePointer Input 6(float)
+              45:     39(int) Constant 1
+              48:     19(int) Constant 1
+              50:     39(int) Constant 2
+              53:     19(int) Constant 2
+              56:     39(int) Constant 3
+              59:             TypePointer Output 7(fvec4)
+60(@entryPointOutput):     59(ptr) Variable Output
+         4(main):           2 Function None 3
+               5:             Label
+    30(Position):      8(ptr) Variable Function
+       34(clip0):     10(ptr) Variable Function
+       55(clip1):     11(ptr) Variable Function
+       61(param):      8(ptr) Variable Function
+       63(param):     10(ptr) Variable Function
+       65(param):     11(ptr) Variable Function
+              33:    7(fvec4) Load 32(Position)
+                              Store 30(Position) 33
+              42:     41(ptr) AccessChain 38(clip0) 40
+              43:    6(float) Load 42
+              44:     11(ptr) AccessChain 34(clip0) 20
+                              Store 44 43
+              46:     41(ptr) AccessChain 38(clip0) 45
+              47:    6(float) Load 46
+              49:     11(ptr) AccessChain 34(clip0) 48
+                              Store 49 47
+              51:     41(ptr) AccessChain 38(clip0) 50
+              52:    6(float) Load 51
+              54:     11(ptr) AccessChain 34(clip0) 53
+                              Store 54 52
+              57:     41(ptr) AccessChain 38(clip0) 56
+              58:    6(float) Load 57
+                              Store 55(clip1) 58
+              62:    7(fvec4) Load 30(Position)
+                              Store 61(param) 62
+              64:    9(fvec3) Load 34(clip0)
+                              Store 63(param) 64
+              66:    6(float) Load 55(clip1)
+                              Store 65(param) 66
+              67:    7(fvec4) FunctionCall 16(@main(vf4;vf3;f1;) 61(param) 63(param) 65(param)
+                              Store 60(@entryPointOutput) 67
+                              Return
+                              FunctionEnd
+16(@main(vf4;vf3;f1;):    7(fvec4) Function None 12
+    13(Position):      8(ptr) FunctionParameter
+       14(clip0):     10(ptr) FunctionParameter
+       15(clip1):     11(ptr) FunctionParameter
+              17:             Label
+              18:    7(fvec4) Load 13(Position)
+              21:     11(ptr) AccessChain 14(clip0) 20
+              22:    6(float) Load 21
+              23:    7(fvec4) CompositeConstruct 22 22 22 22
+              24:    7(fvec4) FAdd 18 23
+              25:    6(float) Load 15(clip1)
+              26:    7(fvec4) CompositeConstruct 25 25 25 25
+              27:    7(fvec4) FAdd 24 26
+                              ReturnValue 27
+                              FunctionEnd
diff --git a/Test/baseResults/hlsl.clipdistance-9.vert.out b/Test/baseResults/hlsl.clipdistance-9.vert.out
new file mode 100644
index 0000000..2d0c9b0
--- /dev/null
+++ b/Test/baseResults/hlsl.clipdistance-9.vert.out
@@ -0,0 +1,299 @@
+hlsl.clipdistance-9.vert
+Shader version: 500
+0:? Sequence
+0:7  Function Definition: @main(vf3;f1; ( temp structure{ temp 4-component vector of float Position})
+0:7    Function Parameters: 
+0:7      'clip0' ( out 3-component vector of float)
+0:7      'clip1' ( out float)
+0:?     Sequence
+0:9      move second child to first child ( temp 4-component vector of float)
+0:9        Position: direct index for structure ( temp 4-component vector of float)
+0:9          'Output' ( temp structure{ temp 4-component vector of float Position})
+0:9          Constant:
+0:9            0 (const int)
+0:9        Constant:
+0:9          0.000000
+0:9          0.000000
+0:9          0.000000
+0:9          0.000000
+0:11      move second child to first child ( temp float)
+0:11        direct index ( temp float)
+0:11          'clip0' ( out 3-component vector of float)
+0:11          Constant:
+0:11            0 (const int)
+0:11        Constant:
+0:11          0.000000
+0:12      move second child to first child ( temp float)
+0:12        direct index ( temp float)
+0:12          'clip0' ( out 3-component vector of float)
+0:12          Constant:
+0:12            1 (const int)
+0:12        Constant:
+0:12          1.000000
+0:13      move second child to first child ( temp float)
+0:13        direct index ( temp float)
+0:13          'clip0' ( out 3-component vector of float)
+0:13          Constant:
+0:13            2 (const int)
+0:13        Constant:
+0:13          2.000000
+0:16      move second child to first child ( temp float)
+0:16        'clip1' ( out float)
+0:16        Constant:
+0:16          3.000000
+0:18      Branch: Return with expression
+0:18        'Output' ( temp structure{ temp 4-component vector of float Position})
+0:7  Function Definition: main( ( temp void)
+0:7    Function Parameters: 
+0:?     Sequence
+0:7      Sequence
+0:7        move second child to first child ( temp 4-component vector of float)
+0:?           '@entryPointOutput.Position' ( out 4-component vector of float Position)
+0:7          Position: direct index for structure ( temp 4-component vector of float)
+0:7            Function Call: @main(vf3;f1; ( temp structure{ temp 4-component vector of float Position})
+0:?               'clip0' ( temp 3-component vector of float)
+0:?               'clip1' ( temp float)
+0:7            Constant:
+0:7              0 (const int)
+0:?       Sequence
+0:7        move second child to first child ( temp float)
+0:7          direct index ( out float ClipDistance)
+0:?             'clip0' ( out 4-element array of float ClipDistance)
+0:7            Constant:
+0:7              0 (const int)
+0:7          direct index ( temp float)
+0:?             'clip0' ( temp 3-component vector of float)
+0:7            Constant:
+0:7              0 (const int)
+0:7        move second child to first child ( temp float)
+0:7          direct index ( out float ClipDistance)
+0:?             'clip0' ( out 4-element array of float ClipDistance)
+0:7            Constant:
+0:7              1 (const int)
+0:7          direct index ( temp float)
+0:?             'clip0' ( temp 3-component vector of float)
+0:7            Constant:
+0:7              1 (const int)
+0:7        move second child to first child ( temp float)
+0:7          direct index ( out float ClipDistance)
+0:?             'clip0' ( out 4-element array of float ClipDistance)
+0:7            Constant:
+0:7              2 (const int)
+0:7          direct index ( temp float)
+0:?             'clip0' ( temp 3-component vector of float)
+0:7            Constant:
+0:7              2 (const int)
+0:?       Sequence
+0:7        move second child to first child ( temp float)
+0:7          direct index ( out float ClipDistance)
+0:?             'clip0' ( out 4-element array of float ClipDistance)
+0:7            Constant:
+0:7              3 (const int)
+0:?           'clip1' ( temp float)
+0:?   Linker Objects
+0:?     '@entryPointOutput.Position' ( out 4-component vector of float Position)
+0:?     'clip0' ( out 4-element array of float ClipDistance)
+
+
+Linked vertex stage:
+
+
+Shader version: 500
+0:? Sequence
+0:7  Function Definition: @main(vf3;f1; ( temp structure{ temp 4-component vector of float Position})
+0:7    Function Parameters: 
+0:7      'clip0' ( out 3-component vector of float)
+0:7      'clip1' ( out float)
+0:?     Sequence
+0:9      move second child to first child ( temp 4-component vector of float)
+0:9        Position: direct index for structure ( temp 4-component vector of float)
+0:9          'Output' ( temp structure{ temp 4-component vector of float Position})
+0:9          Constant:
+0:9            0 (const int)
+0:9        Constant:
+0:9          0.000000
+0:9          0.000000
+0:9          0.000000
+0:9          0.000000
+0:11      move second child to first child ( temp float)
+0:11        direct index ( temp float)
+0:11          'clip0' ( out 3-component vector of float)
+0:11          Constant:
+0:11            0 (const int)
+0:11        Constant:
+0:11          0.000000
+0:12      move second child to first child ( temp float)
+0:12        direct index ( temp float)
+0:12          'clip0' ( out 3-component vector of float)
+0:12          Constant:
+0:12            1 (const int)
+0:12        Constant:
+0:12          1.000000
+0:13      move second child to first child ( temp float)
+0:13        direct index ( temp float)
+0:13          'clip0' ( out 3-component vector of float)
+0:13          Constant:
+0:13            2 (const int)
+0:13        Constant:
+0:13          2.000000
+0:16      move second child to first child ( temp float)
+0:16        'clip1' ( out float)
+0:16        Constant:
+0:16          3.000000
+0:18      Branch: Return with expression
+0:18        'Output' ( temp structure{ temp 4-component vector of float Position})
+0:7  Function Definition: main( ( temp void)
+0:7    Function Parameters: 
+0:?     Sequence
+0:7      Sequence
+0:7        move second child to first child ( temp 4-component vector of float)
+0:?           '@entryPointOutput.Position' ( out 4-component vector of float Position)
+0:7          Position: direct index for structure ( temp 4-component vector of float)
+0:7            Function Call: @main(vf3;f1; ( temp structure{ temp 4-component vector of float Position})
+0:?               'clip0' ( temp 3-component vector of float)
+0:?               'clip1' ( temp float)
+0:7            Constant:
+0:7              0 (const int)
+0:?       Sequence
+0:7        move second child to first child ( temp float)
+0:7          direct index ( out float ClipDistance)
+0:?             'clip0' ( out 4-element array of float ClipDistance)
+0:7            Constant:
+0:7              0 (const int)
+0:7          direct index ( temp float)
+0:?             'clip0' ( temp 3-component vector of float)
+0:7            Constant:
+0:7              0 (const int)
+0:7        move second child to first child ( temp float)
+0:7          direct index ( out float ClipDistance)
+0:?             'clip0' ( out 4-element array of float ClipDistance)
+0:7            Constant:
+0:7              1 (const int)
+0:7          direct index ( temp float)
+0:?             'clip0' ( temp 3-component vector of float)
+0:7            Constant:
+0:7              1 (const int)
+0:7        move second child to first child ( temp float)
+0:7          direct index ( out float ClipDistance)
+0:?             'clip0' ( out 4-element array of float ClipDistance)
+0:7            Constant:
+0:7              2 (const int)
+0:7          direct index ( temp float)
+0:?             'clip0' ( temp 3-component vector of float)
+0:7            Constant:
+0:7              2 (const int)
+0:?       Sequence
+0:7        move second child to first child ( temp float)
+0:7          direct index ( out float ClipDistance)
+0:?             'clip0' ( out 4-element array of float ClipDistance)
+0:7            Constant:
+0:7              3 (const int)
+0:?           'clip1' ( temp float)
+0:?   Linker Objects
+0:?     '@entryPointOutput.Position' ( out 4-component vector of float Position)
+0:?     'clip0' ( out 4-element array of float ClipDistance)
+
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 67
+
+                              Capability Shader
+                              Capability ClipDistance
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Vertex 4  "main" 39 51
+                              Source HLSL 500
+                              Name 4  "main"
+                              Name 11  "VS_OUTPUT"
+                              MemberName 11(VS_OUTPUT) 0  "Position"
+                              Name 15  "@main(vf3;f1;"
+                              Name 13  "clip0"
+                              Name 14  "clip1"
+                              Name 18  "Output"
+                              Name 39  "@entryPointOutput.Position"
+                              Name 40  "clip0"
+                              Name 41  "clip1"
+                              Name 42  "param"
+                              Name 43  "param"
+                              Name 51  "clip0"
+                              Decorate 39(@entryPointOutput.Position) BuiltIn Position
+                              Decorate 51(clip0) BuiltIn ClipDistance
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 3
+               8:             TypePointer Function 7(fvec3)
+               9:             TypePointer Function 6(float)
+              10:             TypeVector 6(float) 4
+   11(VS_OUTPUT):             TypeStruct 10(fvec4)
+              12:             TypeFunction 11(VS_OUTPUT) 8(ptr) 9(ptr)
+              17:             TypePointer Function 11(VS_OUTPUT)
+              19:             TypeInt 32 1
+              20:     19(int) Constant 0
+              21:    6(float) Constant 0
+              22:   10(fvec4) ConstantComposite 21 21 21 21
+              23:             TypePointer Function 10(fvec4)
+              25:             TypeInt 32 0
+              26:     25(int) Constant 0
+              28:    6(float) Constant 1065353216
+              29:     25(int) Constant 1
+              31:    6(float) Constant 1073741824
+              32:     25(int) Constant 2
+              34:    6(float) Constant 1077936128
+              38:             TypePointer Output 10(fvec4)
+39(@entryPointOutput.Position):     38(ptr) Variable Output
+              48:     25(int) Constant 4
+              49:             TypeArray 6(float) 48
+              50:             TypePointer Output 49
+       51(clip0):     50(ptr) Variable Output
+              54:             TypePointer Output 6(float)
+              56:     19(int) Constant 1
+              60:     19(int) Constant 2
+              64:     19(int) Constant 3
+         4(main):           2 Function None 3
+               5:             Label
+       40(clip0):      8(ptr) Variable Function
+       41(clip1):      9(ptr) Variable Function
+       42(param):      8(ptr) Variable Function
+       43(param):      9(ptr) Variable Function
+              44:11(VS_OUTPUT) FunctionCall 15(@main(vf3;f1;) 42(param) 43(param)
+              45:    7(fvec3) Load 42(param)
+                              Store 40(clip0) 45
+              46:    6(float) Load 43(param)
+                              Store 41(clip1) 46
+              47:   10(fvec4) CompositeExtract 44 0
+                              Store 39(@entryPointOutput.Position) 47
+              52:      9(ptr) AccessChain 40(clip0) 26
+              53:    6(float) Load 52
+              55:     54(ptr) AccessChain 51(clip0) 20
+                              Store 55 53
+              57:      9(ptr) AccessChain 40(clip0) 29
+              58:    6(float) Load 57
+              59:     54(ptr) AccessChain 51(clip0) 56
+                              Store 59 58
+              61:      9(ptr) AccessChain 40(clip0) 32
+              62:    6(float) Load 61
+              63:     54(ptr) AccessChain 51(clip0) 60
+                              Store 63 62
+              65:    6(float) Load 41(clip1)
+              66:     54(ptr) AccessChain 51(clip0) 64
+                              Store 66 65
+                              Return
+                              FunctionEnd
+15(@main(vf3;f1;):11(VS_OUTPUT) Function None 12
+       13(clip0):      8(ptr) FunctionParameter
+       14(clip1):      9(ptr) FunctionParameter
+              16:             Label
+      18(Output):     17(ptr) Variable Function
+              24:     23(ptr) AccessChain 18(Output) 20
+                              Store 24 22
+              27:      9(ptr) AccessChain 13(clip0) 26
+                              Store 27 21
+              30:      9(ptr) AccessChain 13(clip0) 29
+                              Store 30 28
+              33:      9(ptr) AccessChain 13(clip0) 32
+                              Store 33 31
+                              Store 14(clip1) 34
+              35:11(VS_OUTPUT) Load 18(Output)
+                              ReturnValue 35
+                              FunctionEnd
diff --git a/Test/baseResults/hlsl.color.hull.tesc.out b/Test/baseResults/hlsl.color.hull.tesc.out
new file mode 100644
index 0000000..72e0b7e
--- /dev/null
+++ b/Test/baseResults/hlsl.color.hull.tesc.out
@@ -0,0 +1,572 @@
+hlsl.color.hull.tesc
+Shader version: 500
+vertices = 3
+vertex spacing = equal_spacing
+triangle order = cw
+0:? Sequence
+0:37  Function Definition: ColorPatchConstantFunction(struct-HullInputType-vf3-vf41[3];u1; ( temp structure{ temp 3-element array of float edges,  temp float inside})
+0:37    Function Parameters: 
+0:37      'inputPatch' ( in 3-element array of structure{ temp 3-component vector of float position,  temp 4-component vector of float color})
+0:37      'patchId' ( in uint)
+0:?     Sequence
+0:42      move second child to first child ( temp float)
+0:42        direct index ( temp float)
+0:42          edges: direct index for structure ( temp 3-element array of float)
+0:42            'output' ( temp structure{ temp 3-element array of float edges,  temp float inside})
+0:42            Constant:
+0:42              0 (const int)
+0:42          Constant:
+0:42            0 (const int)
+0:42        tessellationAmount: direct index for structure (layout( row_major std140) uniform float)
+0:42          'anon@0' (layout( binding=0 row_major std140) uniform block{layout( row_major std140) uniform float tessellationAmount, layout( row_major std140) uniform 3-component vector of float padding})
+0:42          Constant:
+0:42            0 (const uint)
+0:43      move second child to first child ( temp float)
+0:43        direct index ( temp float)
+0:43          edges: direct index for structure ( temp 3-element array of float)
+0:43            'output' ( temp structure{ temp 3-element array of float edges,  temp float inside})
+0:43            Constant:
+0:43              0 (const int)
+0:43          Constant:
+0:43            1 (const int)
+0:43        tessellationAmount: direct index for structure (layout( row_major std140) uniform float)
+0:43          'anon@0' (layout( binding=0 row_major std140) uniform block{layout( row_major std140) uniform float tessellationAmount, layout( row_major std140) uniform 3-component vector of float padding})
+0:43          Constant:
+0:43            0 (const uint)
+0:44      move second child to first child ( temp float)
+0:44        direct index ( temp float)
+0:44          edges: direct index for structure ( temp 3-element array of float)
+0:44            'output' ( temp structure{ temp 3-element array of float edges,  temp float inside})
+0:44            Constant:
+0:44              0 (const int)
+0:44          Constant:
+0:44            2 (const int)
+0:44        tessellationAmount: direct index for structure (layout( row_major std140) uniform float)
+0:44          'anon@0' (layout( binding=0 row_major std140) uniform block{layout( row_major std140) uniform float tessellationAmount, layout( row_major std140) uniform 3-component vector of float padding})
+0:44          Constant:
+0:44            0 (const uint)
+0:47      move second child to first child ( temp float)
+0:47        inside: direct index for structure ( temp float)
+0:47          'output' ( temp structure{ temp 3-element array of float edges,  temp float inside})
+0:47          Constant:
+0:47            1 (const int)
+0:47        tessellationAmount: direct index for structure (layout( row_major std140) uniform float)
+0:47          'anon@0' (layout( binding=0 row_major std140) uniform block{layout( row_major std140) uniform float tessellationAmount, layout( row_major std140) uniform 3-component vector of float padding})
+0:47          Constant:
+0:47            0 (const uint)
+0:49      Branch: Return with expression
+0:49        'output' ( temp structure{ temp 3-element array of float edges,  temp float inside})
+0:63  Function Definition: @main(struct-HullInputType-vf3-vf41[3];u1;u1; ( temp structure{ temp 3-component vector of float position,  temp 4-component vector of float color})
+0:63    Function Parameters: 
+0:63      'patch' ( in 3-element array of structure{ temp 3-component vector of float position,  temp 4-component vector of float color})
+0:63      'pointId' ( in uint)
+0:63      'patchId' ( in uint)
+0:?     Sequence
+0:67      move second child to first child ( temp 3-component vector of float)
+0:67        position: direct index for structure ( temp 3-component vector of float)
+0:67          'output' ( temp structure{ temp 3-component vector of float position,  temp 4-component vector of float color})
+0:67          Constant:
+0:67            0 (const int)
+0:67        position: direct index for structure ( temp 3-component vector of float)
+0:67          indirect index ( temp structure{ temp 3-component vector of float position,  temp 4-component vector of float color})
+0:67            'patch' ( in 3-element array of structure{ temp 3-component vector of float position,  temp 4-component vector of float color})
+0:67            'pointId' ( in uint)
+0:67          Constant:
+0:67            0 (const int)
+0:70      move second child to first child ( temp 4-component vector of float)
+0:70        color: direct index for structure ( temp 4-component vector of float)
+0:70          'output' ( temp structure{ temp 3-component vector of float position,  temp 4-component vector of float color})
+0:70          Constant:
+0:70            1 (const int)
+0:70        color: direct index for structure ( temp 4-component vector of float)
+0:70          indirect index ( temp structure{ temp 3-component vector of float position,  temp 4-component vector of float color})
+0:70            'patch' ( in 3-element array of structure{ temp 3-component vector of float position,  temp 4-component vector of float color})
+0:70            'pointId' ( in uint)
+0:70          Constant:
+0:70            1 (const int)
+0:72      Branch: Return with expression
+0:72        'output' ( temp structure{ temp 3-component vector of float position,  temp 4-component vector of float color})
+0:63  Function Definition: main( ( temp void)
+0:63    Function Parameters: 
+0:?     Sequence
+0:63      move second child to first child ( temp 3-element array of structure{ temp 3-component vector of float position,  temp 4-component vector of float color})
+0:?         'patch' ( temp 3-element array of structure{ temp 3-component vector of float position,  temp 4-component vector of float color})
+0:?         'patch' (layout( location=0) in 3-element array of structure{ temp 3-component vector of float position,  temp 4-component vector of float color})
+0:63      move second child to first child ( temp uint)
+0:?         'pointId' ( temp uint)
+0:?         'pointId' ( in uint InvocationID)
+0:63      move second child to first child ( temp uint)
+0:?         'patchId' ( temp uint)
+0:?         'patchId' ( in uint PrimitiveID)
+0:63      move second child to first child ( temp structure{ temp 3-component vector of float position,  temp 4-component vector of float color})
+0:63        indirect index (layout( location=0) out structure{ temp 3-component vector of float position,  temp 4-component vector of float color})
+0:?           '@entryPointOutput' (layout( location=0) out 3-element array of structure{ temp 3-component vector of float position,  temp 4-component vector of float color})
+0:?           'pointId' ( in uint InvocationID)
+0:63        Function Call: @main(struct-HullInputType-vf3-vf41[3];u1;u1; ( temp structure{ temp 3-component vector of float position,  temp 4-component vector of float color})
+0:?           'patch' ( temp 3-element array of structure{ temp 3-component vector of float position,  temp 4-component vector of float color})
+0:?           'pointId' ( temp uint)
+0:?           'patchId' ( temp uint)
+0:?       Barrier ( temp void)
+0:?       Test condition and select ( temp void)
+0:?         Condition
+0:?         Compare Equal ( temp bool)
+0:?           'pointId' ( in uint InvocationID)
+0:?           Constant:
+0:?             0 (const int)
+0:?         true case
+0:?         Sequence
+0:?           move second child to first child ( temp structure{ temp 3-element array of float edges,  temp float inside})
+0:?             '@patchConstantResult' ( temp structure{ temp 3-element array of float edges,  temp float inside})
+0:?             Function Call: ColorPatchConstantFunction(struct-HullInputType-vf3-vf41[3];u1; ( temp structure{ temp 3-element array of float edges,  temp float inside})
+0:?               'patch' ( temp 3-element array of structure{ temp 3-component vector of float position,  temp 4-component vector of float color})
+0:?               'patchId' ( in uint PrimitiveID)
+0:?           Sequence
+0:?             move second child to first child ( temp float)
+0:?               direct index ( patch out float TessLevelOuter)
+0:?                 '@patchConstantOutput.edges' ( patch out 4-element array of float TessLevelOuter)
+0:?                 Constant:
+0:?                   0 (const int)
+0:?               direct index ( temp float)
+0:?                 edges: direct index for structure ( temp 3-element array of float)
+0:?                   '@patchConstantResult' ( temp structure{ temp 3-element array of float edges,  temp float inside})
+0:?                   Constant:
+0:?                     0 (const int)
+0:?                 Constant:
+0:?                   0 (const int)
+0:?             move second child to first child ( temp float)
+0:?               direct index ( patch out float TessLevelOuter)
+0:?                 '@patchConstantOutput.edges' ( patch out 4-element array of float TessLevelOuter)
+0:?                 Constant:
+0:?                   1 (const int)
+0:?               direct index ( temp float)
+0:?                 edges: direct index for structure ( temp 3-element array of float)
+0:?                   '@patchConstantResult' ( temp structure{ temp 3-element array of float edges,  temp float inside})
+0:?                   Constant:
+0:?                     0 (const int)
+0:?                 Constant:
+0:?                   1 (const int)
+0:?             move second child to first child ( temp float)
+0:?               direct index ( patch out float TessLevelOuter)
+0:?                 '@patchConstantOutput.edges' ( patch out 4-element array of float TessLevelOuter)
+0:?                 Constant:
+0:?                   2 (const int)
+0:?               direct index ( temp float)
+0:?                 edges: direct index for structure ( temp 3-element array of float)
+0:?                   '@patchConstantResult' ( temp structure{ temp 3-element array of float edges,  temp float inside})
+0:?                   Constant:
+0:?                     0 (const int)
+0:?                 Constant:
+0:?                   2 (const int)
+0:?             move second child to first child ( temp float)
+0:?               direct index ( patch out float TessLevelInner)
+0:?                 '@patchConstantOutput.inside' ( patch out 2-element array of float TessLevelInner)
+0:?                 Constant:
+0:?                   0 (const int)
+0:?               inside: direct index for structure ( temp float)
+0:?                 '@patchConstantResult' ( temp structure{ temp 3-element array of float edges,  temp float inside})
+0:?                 Constant:
+0:?                   1 (const int)
+0:?   Linker Objects
+0:?     'anon@0' (layout( binding=0 row_major std140) uniform block{layout( row_major std140) uniform float tessellationAmount, layout( row_major std140) uniform 3-component vector of float padding})
+0:?     '@entryPointOutput' (layout( location=0) out 3-element array of structure{ temp 3-component vector of float position,  temp 4-component vector of float color})
+0:?     'patch' (layout( location=0) in 3-element array of structure{ temp 3-component vector of float position,  temp 4-component vector of float color})
+0:?     'pointId' ( in uint InvocationID)
+0:?     'patchId' ( in uint PrimitiveID)
+0:?     '@patchConstantOutput.edges' ( patch out 4-element array of float TessLevelOuter)
+0:?     '@patchConstantOutput.inside' ( patch out 2-element array of float TessLevelInner)
+
+
+Linked tessellation control stage:
+
+
+Shader version: 500
+vertices = 3
+vertex spacing = equal_spacing
+triangle order = cw
+0:? Sequence
+0:37  Function Definition: ColorPatchConstantFunction(struct-HullInputType-vf3-vf41[3];u1; ( temp structure{ temp 3-element array of float edges,  temp float inside})
+0:37    Function Parameters: 
+0:37      'inputPatch' ( in 3-element array of structure{ temp 3-component vector of float position,  temp 4-component vector of float color})
+0:37      'patchId' ( in uint)
+0:?     Sequence
+0:42      move second child to first child ( temp float)
+0:42        direct index ( temp float)
+0:42          edges: direct index for structure ( temp 3-element array of float)
+0:42            'output' ( temp structure{ temp 3-element array of float edges,  temp float inside})
+0:42            Constant:
+0:42              0 (const int)
+0:42          Constant:
+0:42            0 (const int)
+0:42        tessellationAmount: direct index for structure (layout( row_major std140) uniform float)
+0:42          'anon@0' (layout( binding=0 row_major std140) uniform block{layout( row_major std140) uniform float tessellationAmount, layout( row_major std140) uniform 3-component vector of float padding})
+0:42          Constant:
+0:42            0 (const uint)
+0:43      move second child to first child ( temp float)
+0:43        direct index ( temp float)
+0:43          edges: direct index for structure ( temp 3-element array of float)
+0:43            'output' ( temp structure{ temp 3-element array of float edges,  temp float inside})
+0:43            Constant:
+0:43              0 (const int)
+0:43          Constant:
+0:43            1 (const int)
+0:43        tessellationAmount: direct index for structure (layout( row_major std140) uniform float)
+0:43          'anon@0' (layout( binding=0 row_major std140) uniform block{layout( row_major std140) uniform float tessellationAmount, layout( row_major std140) uniform 3-component vector of float padding})
+0:43          Constant:
+0:43            0 (const uint)
+0:44      move second child to first child ( temp float)
+0:44        direct index ( temp float)
+0:44          edges: direct index for structure ( temp 3-element array of float)
+0:44            'output' ( temp structure{ temp 3-element array of float edges,  temp float inside})
+0:44            Constant:
+0:44              0 (const int)
+0:44          Constant:
+0:44            2 (const int)
+0:44        tessellationAmount: direct index for structure (layout( row_major std140) uniform float)
+0:44          'anon@0' (layout( binding=0 row_major std140) uniform block{layout( row_major std140) uniform float tessellationAmount, layout( row_major std140) uniform 3-component vector of float padding})
+0:44          Constant:
+0:44            0 (const uint)
+0:47      move second child to first child ( temp float)
+0:47        inside: direct index for structure ( temp float)
+0:47          'output' ( temp structure{ temp 3-element array of float edges,  temp float inside})
+0:47          Constant:
+0:47            1 (const int)
+0:47        tessellationAmount: direct index for structure (layout( row_major std140) uniform float)
+0:47          'anon@0' (layout( binding=0 row_major std140) uniform block{layout( row_major std140) uniform float tessellationAmount, layout( row_major std140) uniform 3-component vector of float padding})
+0:47          Constant:
+0:47            0 (const uint)
+0:49      Branch: Return with expression
+0:49        'output' ( temp structure{ temp 3-element array of float edges,  temp float inside})
+0:63  Function Definition: @main(struct-HullInputType-vf3-vf41[3];u1;u1; ( temp structure{ temp 3-component vector of float position,  temp 4-component vector of float color})
+0:63    Function Parameters: 
+0:63      'patch' ( in 3-element array of structure{ temp 3-component vector of float position,  temp 4-component vector of float color})
+0:63      'pointId' ( in uint)
+0:63      'patchId' ( in uint)
+0:?     Sequence
+0:67      move second child to first child ( temp 3-component vector of float)
+0:67        position: direct index for structure ( temp 3-component vector of float)
+0:67          'output' ( temp structure{ temp 3-component vector of float position,  temp 4-component vector of float color})
+0:67          Constant:
+0:67            0 (const int)
+0:67        position: direct index for structure ( temp 3-component vector of float)
+0:67          indirect index ( temp structure{ temp 3-component vector of float position,  temp 4-component vector of float color})
+0:67            'patch' ( in 3-element array of structure{ temp 3-component vector of float position,  temp 4-component vector of float color})
+0:67            'pointId' ( in uint)
+0:67          Constant:
+0:67            0 (const int)
+0:70      move second child to first child ( temp 4-component vector of float)
+0:70        color: direct index for structure ( temp 4-component vector of float)
+0:70          'output' ( temp structure{ temp 3-component vector of float position,  temp 4-component vector of float color})
+0:70          Constant:
+0:70            1 (const int)
+0:70        color: direct index for structure ( temp 4-component vector of float)
+0:70          indirect index ( temp structure{ temp 3-component vector of float position,  temp 4-component vector of float color})
+0:70            'patch' ( in 3-element array of structure{ temp 3-component vector of float position,  temp 4-component vector of float color})
+0:70            'pointId' ( in uint)
+0:70          Constant:
+0:70            1 (const int)
+0:72      Branch: Return with expression
+0:72        'output' ( temp structure{ temp 3-component vector of float position,  temp 4-component vector of float color})
+0:63  Function Definition: main( ( temp void)
+0:63    Function Parameters: 
+0:?     Sequence
+0:63      move second child to first child ( temp 3-element array of structure{ temp 3-component vector of float position,  temp 4-component vector of float color})
+0:?         'patch' ( temp 3-element array of structure{ temp 3-component vector of float position,  temp 4-component vector of float color})
+0:?         'patch' (layout( location=0) in 3-element array of structure{ temp 3-component vector of float position,  temp 4-component vector of float color})
+0:63      move second child to first child ( temp uint)
+0:?         'pointId' ( temp uint)
+0:?         'pointId' ( in uint InvocationID)
+0:63      move second child to first child ( temp uint)
+0:?         'patchId' ( temp uint)
+0:?         'patchId' ( in uint PrimitiveID)
+0:63      move second child to first child ( temp structure{ temp 3-component vector of float position,  temp 4-component vector of float color})
+0:63        indirect index (layout( location=0) out structure{ temp 3-component vector of float position,  temp 4-component vector of float color})
+0:?           '@entryPointOutput' (layout( location=0) out 3-element array of structure{ temp 3-component vector of float position,  temp 4-component vector of float color})
+0:?           'pointId' ( in uint InvocationID)
+0:63        Function Call: @main(struct-HullInputType-vf3-vf41[3];u1;u1; ( temp structure{ temp 3-component vector of float position,  temp 4-component vector of float color})
+0:?           'patch' ( temp 3-element array of structure{ temp 3-component vector of float position,  temp 4-component vector of float color})
+0:?           'pointId' ( temp uint)
+0:?           'patchId' ( temp uint)
+0:?       Barrier ( temp void)
+0:?       Test condition and select ( temp void)
+0:?         Condition
+0:?         Compare Equal ( temp bool)
+0:?           'pointId' ( in uint InvocationID)
+0:?           Constant:
+0:?             0 (const int)
+0:?         true case
+0:?         Sequence
+0:?           move second child to first child ( temp structure{ temp 3-element array of float edges,  temp float inside})
+0:?             '@patchConstantResult' ( temp structure{ temp 3-element array of float edges,  temp float inside})
+0:?             Function Call: ColorPatchConstantFunction(struct-HullInputType-vf3-vf41[3];u1; ( temp structure{ temp 3-element array of float edges,  temp float inside})
+0:?               'patch' ( temp 3-element array of structure{ temp 3-component vector of float position,  temp 4-component vector of float color})
+0:?               'patchId' ( in uint PrimitiveID)
+0:?           Sequence
+0:?             move second child to first child ( temp float)
+0:?               direct index ( patch out float TessLevelOuter)
+0:?                 '@patchConstantOutput.edges' ( patch out 4-element array of float TessLevelOuter)
+0:?                 Constant:
+0:?                   0 (const int)
+0:?               direct index ( temp float)
+0:?                 edges: direct index for structure ( temp 3-element array of float)
+0:?                   '@patchConstantResult' ( temp structure{ temp 3-element array of float edges,  temp float inside})
+0:?                   Constant:
+0:?                     0 (const int)
+0:?                 Constant:
+0:?                   0 (const int)
+0:?             move second child to first child ( temp float)
+0:?               direct index ( patch out float TessLevelOuter)
+0:?                 '@patchConstantOutput.edges' ( patch out 4-element array of float TessLevelOuter)
+0:?                 Constant:
+0:?                   1 (const int)
+0:?               direct index ( temp float)
+0:?                 edges: direct index for structure ( temp 3-element array of float)
+0:?                   '@patchConstantResult' ( temp structure{ temp 3-element array of float edges,  temp float inside})
+0:?                   Constant:
+0:?                     0 (const int)
+0:?                 Constant:
+0:?                   1 (const int)
+0:?             move second child to first child ( temp float)
+0:?               direct index ( patch out float TessLevelOuter)
+0:?                 '@patchConstantOutput.edges' ( patch out 4-element array of float TessLevelOuter)
+0:?                 Constant:
+0:?                   2 (const int)
+0:?               direct index ( temp float)
+0:?                 edges: direct index for structure ( temp 3-element array of float)
+0:?                   '@patchConstantResult' ( temp structure{ temp 3-element array of float edges,  temp float inside})
+0:?                   Constant:
+0:?                     0 (const int)
+0:?                 Constant:
+0:?                   2 (const int)
+0:?             move second child to first child ( temp float)
+0:?               direct index ( patch out float TessLevelInner)
+0:?                 '@patchConstantOutput.inside' ( patch out 2-element array of float TessLevelInner)
+0:?                 Constant:
+0:?                   0 (const int)
+0:?               inside: direct index for structure ( temp float)
+0:?                 '@patchConstantResult' ( temp structure{ temp 3-element array of float edges,  temp float inside})
+0:?                 Constant:
+0:?                   1 (const int)
+0:?   Linker Objects
+0:?     'anon@0' (layout( binding=0 row_major std140) uniform block{layout( row_major std140) uniform float tessellationAmount, layout( row_major std140) uniform 3-component vector of float padding})
+0:?     '@entryPointOutput' (layout( location=0) out 3-element array of structure{ temp 3-component vector of float position,  temp 4-component vector of float color})
+0:?     'patch' (layout( location=0) in 3-element array of structure{ temp 3-component vector of float position,  temp 4-component vector of float color})
+0:?     'pointId' ( in uint InvocationID)
+0:?     'patchId' ( in uint PrimitiveID)
+0:?     '@patchConstantOutput.edges' ( patch out 4-element array of float TessLevelOuter)
+0:?     '@patchConstantOutput.inside' ( patch out 2-element array of float TessLevelInner)
+
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 127
+
+                              Capability Tessellation
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint TessellationControl 4  "main" 72 76 79 83 110 123
+                              ExecutionMode 4 OutputVertices 3
+                              ExecutionMode 4 Triangles
+                              ExecutionMode 4 SpacingEqual
+                              ExecutionMode 4 VertexOrderCw
+                              Source HLSL 500
+                              Name 4  "main"
+                              Name 9  "HullInputType"
+                              MemberName 9(HullInputType) 0  "position"
+                              MemberName 9(HullInputType) 1  "color"
+                              Name 16  "ConstantOutputType"
+                              MemberName 16(ConstantOutputType) 0  "edges"
+                              MemberName 16(ConstantOutputType) 1  "inside"
+                              Name 20  "ColorPatchConstantFunction(struct-HullInputType-vf3-vf41[3];u1;"
+                              Name 18  "inputPatch"
+                              Name 19  "patchId"
+                              Name 22  "HullOutputType"
+                              MemberName 22(HullOutputType) 0  "position"
+                              MemberName 22(HullOutputType) 1  "color"
+                              Name 27  "@main(struct-HullInputType-vf3-vf41[3];u1;u1;"
+                              Name 24  "patch"
+                              Name 25  "pointId"
+                              Name 26  "patchId"
+                              Name 30  "output"
+                              Name 33  "TessellationBuffer"
+                              MemberName 33(TessellationBuffer) 0  "tessellationAmount"
+                              MemberName 33(TessellationBuffer) 1  "padding"
+                              Name 35  ""
+                              Name 56  "output"
+                              Name 70  "patch"
+                              Name 72  "patch"
+                              Name 74  "pointId"
+                              Name 76  "pointId"
+                              Name 78  "patchId"
+                              Name 79  "patchId"
+                              Name 83  "@entryPointOutput"
+                              Name 85  "param"
+                              Name 87  "param"
+                              Name 89  "param"
+                              Name 102  "@patchConstantResult"
+                              Name 103  "param"
+                              Name 105  "param"
+                              Name 110  "@patchConstantOutput.edges"
+                              Name 123  "@patchConstantOutput.inside"
+                              MemberDecorate 33(TessellationBuffer) 0 Offset 0
+                              MemberDecorate 33(TessellationBuffer) 1 Offset 4
+                              Decorate 33(TessellationBuffer) Block
+                              Decorate 35 DescriptorSet 0
+                              Decorate 35 Binding 0
+                              Decorate 72(patch) Location 0
+                              Decorate 76(pointId) BuiltIn InvocationId
+                              Decorate 79(patchId) BuiltIn PrimitiveId
+                              Decorate 83(@entryPointOutput) Location 0
+                              Decorate 110(@patchConstantOutput.edges) Patch
+                              Decorate 110(@patchConstantOutput.edges) BuiltIn TessLevelOuter
+                              Decorate 123(@patchConstantOutput.inside) Patch
+                              Decorate 123(@patchConstantOutput.inside) BuiltIn TessLevelInner
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 3
+               8:             TypeVector 6(float) 4
+9(HullInputType):             TypeStruct 7(fvec3) 8(fvec4)
+              10:             TypeInt 32 0
+              11:     10(int) Constant 3
+              12:             TypeArray 9(HullInputType) 11
+              13:             TypePointer Function 12
+              14:             TypePointer Function 10(int)
+              15:             TypeArray 6(float) 11
+16(ConstantOutputType):             TypeStruct 15 6(float)
+              17:             TypeFunction 16(ConstantOutputType) 13(ptr) 14(ptr)
+22(HullOutputType):             TypeStruct 7(fvec3) 8(fvec4)
+              23:             TypeFunction 22(HullOutputType) 13(ptr) 14(ptr) 14(ptr)
+              29:             TypePointer Function 16(ConstantOutputType)
+              31:             TypeInt 32 1
+              32:     31(int) Constant 0
+33(TessellationBuffer):             TypeStruct 6(float) 7(fvec3)
+              34:             TypePointer Uniform 33(TessellationBuffer)
+              35:     34(ptr) Variable Uniform
+              36:             TypePointer Uniform 6(float)
+              39:             TypePointer Function 6(float)
+              41:     31(int) Constant 1
+              45:     31(int) Constant 2
+              55:             TypePointer Function 22(HullOutputType)
+              58:             TypePointer Function 7(fvec3)
+              63:             TypePointer Function 8(fvec4)
+              71:             TypePointer Input 12
+       72(patch):     71(ptr) Variable Input
+              75:             TypePointer Input 10(int)
+     76(pointId):     75(ptr) Variable Input
+     79(patchId):     75(ptr) Variable Input
+              81:             TypeArray 22(HullOutputType) 11
+              82:             TypePointer Output 81
+83(@entryPointOutput):     82(ptr) Variable Output
+              92:             TypePointer Output 22(HullOutputType)
+              94:     10(int) Constant 2
+              95:     10(int) Constant 4
+              96:     10(int) Constant 0
+              98:             TypeBool
+             108:             TypeArray 6(float) 95
+             109:             TypePointer Output 108
+110(@patchConstantOutput.edges):    109(ptr) Variable Output
+             113:             TypePointer Output 6(float)
+             121:             TypeArray 6(float) 94
+             122:             TypePointer Output 121
+123(@patchConstantOutput.inside):    122(ptr) Variable Output
+         4(main):           2 Function None 3
+               5:             Label
+       70(patch):     13(ptr) Variable Function
+     74(pointId):     14(ptr) Variable Function
+     78(patchId):     14(ptr) Variable Function
+       85(param):     13(ptr) Variable Function
+       87(param):     14(ptr) Variable Function
+       89(param):     14(ptr) Variable Function
+102(@patchConstantResult):     29(ptr) Variable Function
+      103(param):     13(ptr) Variable Function
+      105(param):     14(ptr) Variable Function
+              73:          12 Load 72(patch)
+                              Store 70(patch) 73
+              77:     10(int) Load 76(pointId)
+                              Store 74(pointId) 77
+              80:     10(int) Load 79(patchId)
+                              Store 78(patchId) 80
+              84:     10(int) Load 76(pointId)
+              86:          12 Load 70(patch)
+                              Store 85(param) 86
+              88:     10(int) Load 74(pointId)
+                              Store 87(param) 88
+              90:     10(int) Load 78(patchId)
+                              Store 89(param) 90
+              91:22(HullOutputType) FunctionCall 27(@main(struct-HullInputType-vf3-vf41[3];u1;u1;) 85(param) 87(param) 89(param)
+              93:     92(ptr) AccessChain 83(@entryPointOutput) 84
+                              Store 93 91
+                              ControlBarrier 94 95 96
+              97:     10(int) Load 76(pointId)
+              99:    98(bool) IEqual 97 32
+                              SelectionMerge 101 None
+                              BranchConditional 99 100 101
+             100:               Label
+             104:          12   Load 70(patch)
+                                Store 103(param) 104
+             106:     10(int)   Load 79(patchId)
+                                Store 105(param) 106
+             107:16(ConstantOutputType)   FunctionCall 20(ColorPatchConstantFunction(struct-HullInputType-vf3-vf41[3];u1;) 103(param) 105(param)
+                                Store 102(@patchConstantResult) 107
+             111:     39(ptr)   AccessChain 102(@patchConstantResult) 32 32
+             112:    6(float)   Load 111
+             114:    113(ptr)   AccessChain 110(@patchConstantOutput.edges) 32
+                                Store 114 112
+             115:     39(ptr)   AccessChain 102(@patchConstantResult) 32 41
+             116:    6(float)   Load 115
+             117:    113(ptr)   AccessChain 110(@patchConstantOutput.edges) 41
+                                Store 117 116
+             118:     39(ptr)   AccessChain 102(@patchConstantResult) 32 45
+             119:    6(float)   Load 118
+             120:    113(ptr)   AccessChain 110(@patchConstantOutput.edges) 45
+                                Store 120 119
+             124:     39(ptr)   AccessChain 102(@patchConstantResult) 41
+             125:    6(float)   Load 124
+             126:    113(ptr)   AccessChain 123(@patchConstantOutput.inside) 32
+                                Store 126 125
+                                Branch 101
+             101:             Label
+                              Return
+                              FunctionEnd
+20(ColorPatchConstantFunction(struct-HullInputType-vf3-vf41[3];u1;):16(ConstantOutputType) Function None 17
+  18(inputPatch):     13(ptr) FunctionParameter
+     19(patchId):     14(ptr) FunctionParameter
+              21:             Label
+      30(output):     29(ptr) Variable Function
+              37:     36(ptr) AccessChain 35 32
+              38:    6(float) Load 37
+              40:     39(ptr) AccessChain 30(output) 32 32
+                              Store 40 38
+              42:     36(ptr) AccessChain 35 32
+              43:    6(float) Load 42
+              44:     39(ptr) AccessChain 30(output) 32 41
+                              Store 44 43
+              46:     36(ptr) AccessChain 35 32
+              47:    6(float) Load 46
+              48:     39(ptr) AccessChain 30(output) 32 45
+                              Store 48 47
+              49:     36(ptr) AccessChain 35 32
+              50:    6(float) Load 49
+              51:     39(ptr) AccessChain 30(output) 41
+                              Store 51 50
+              52:16(ConstantOutputType) Load 30(output)
+                              ReturnValue 52
+                              FunctionEnd
+27(@main(struct-HullInputType-vf3-vf41[3];u1;u1;):22(HullOutputType) Function None 23
+       24(patch):     13(ptr) FunctionParameter
+     25(pointId):     14(ptr) FunctionParameter
+     26(patchId):     14(ptr) FunctionParameter
+              28:             Label
+      56(output):     55(ptr) Variable Function
+              57:     10(int) Load 25(pointId)
+              59:     58(ptr) AccessChain 24(patch) 57 32
+              60:    7(fvec3) Load 59
+              61:     58(ptr) AccessChain 56(output) 32
+                              Store 61 60
+              62:     10(int) Load 25(pointId)
+              64:     63(ptr) AccessChain 24(patch) 62 41
+              65:    8(fvec4) Load 64
+              66:     63(ptr) AccessChain 56(output) 41
+                              Store 66 65
+              67:22(HullOutputType) Load 56(output)
+                              ReturnValue 67
+                              FunctionEnd
diff --git a/Test/baseResults/hlsl.comparison.vec.frag.out b/Test/baseResults/hlsl.comparison.vec.frag.out
index dd363c6..c7e4ed5 100644
--- a/Test/baseResults/hlsl.comparison.vec.frag.out
+++ b/Test/baseResults/hlsl.comparison.vec.frag.out
@@ -119,14 +119,14 @@
 0:?     Sequence
 0:30      Sequence
 0:30        move second child to first child ( temp 4-component vector of float)
-0:?           'Color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 0:30          Color: direct index for structure ( temp 4-component vector of float)
 0:30            Function Call: @main( ( temp structure{ temp 4-component vector of float Color})
 0:30            Constant:
 0:30              0 (const int)
 0:?   Linker Objects
 0:?     'anon@0' (layout( row_major std140) uniform block{ uniform 4-component vector of float uf4})
-0:?     'Color' (layout( location=0) out 4-component vector of float)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 
 Linked fragment stage:
@@ -252,17 +252,17 @@
 0:?     Sequence
 0:30      Sequence
 0:30        move second child to first child ( temp 4-component vector of float)
-0:?           'Color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 0:30          Color: direct index for structure ( temp 4-component vector of float)
 0:30            Function Call: @main( ( temp structure{ temp 4-component vector of float Color})
 0:30            Constant:
 0:30              0 (const int)
 0:?   Linker Objects
 0:?     'anon@0' (layout( row_major std140) uniform block{ uniform 4-component vector of float uf4})
-0:?     'Color' (layout( location=0) out 4-component vector of float)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 96
 
                               Capability Shader
@@ -292,11 +292,11 @@
                               Name 71  "r22"
                               Name 76  "r23"
                               Name 82  "psout"
-                              Name 90  "Color"
+                              Name 90  "@entryPointOutput.Color"
                               Name 93  "$Global"
                               MemberName 93($Global) 0  "uf4"
                               Name 95  ""
-                              Decorate 90(Color) Location 0
+                              Decorate 90(@entryPointOutput.Color) Location 0
                               MemberDecorate 93($Global) 0 Offset 0
                               Decorate 93($Global) Block
                               Decorate 95 DescriptorSet 0
@@ -318,7 +318,7 @@
               83:             TypeInt 32 1
               84:     83(int) Constant 0
               89:             TypePointer Output 7(fvec4)
-       90(Color):     89(ptr) Variable Output
+90(@entryPointOutput.Color):     89(ptr) Variable Output
      93($Global):             TypeStruct 7(fvec4)
               94:             TypePointer Uniform 93($Global)
               95:     94(ptr) Variable Uniform
@@ -326,7 +326,7 @@
                5:             Label
               91:13(PS_OUTPUT) FunctionCall 15(@main()
               92:    7(fvec4) CompositeExtract 91 0
-                              Store 90(Color) 92
+                              Store 90(@entryPointOutput.Color) 92
                               Return
                               FunctionEnd
    11(Bug1(vf4;):           2 Function None 9
diff --git a/Test/baseResults/hlsl.conditional.frag.out b/Test/baseResults/hlsl.conditional.frag.out
old mode 100755
new mode 100644
index 7397c6f..90d9f79
--- a/Test/baseResults/hlsl.conditional.frag.out
+++ b/Test/baseResults/hlsl.conditional.frag.out
@@ -78,7 +78,7 @@
 0:17      Sequence
 0:17        move second child to first child ( temp 4-component vector of float)
 0:17          'ret' ( temp 4-component vector of float)
-0:17          Test condition and select ( temp 4-component vector of float)
+0:17          Test condition and select ( temp 4-component vector of float): no shortcircuit
 0:17            Condition
 0:17            Compare Not Equal ( temp bool)
 0:17              t: direct index for structure ( uniform float)
@@ -169,7 +169,7 @@
 0:37          'e' ( temp int)
 0:37          move second child to first child ( temp int)
 0:37            'a' ( temp int)
-0:37            Test condition and select ( temp int)
+0:37            Test condition and select ( temp int): no shortcircuit
 0:37              Condition
 0:37              Convert int to bool ( temp bool)
 0:37                'b' ( temp int)
@@ -182,7 +182,7 @@
 0:37                10 (const int)
 0:37        move second child to first child ( temp int)
 0:37          'b' ( temp int)
-0:37          Test condition and select ( temp int)
+0:37          Test condition and select ( temp int): no shortcircuit
 0:37            Condition
 0:37            Convert int to bool ( temp bool)
 0:37              'a' ( temp int)
@@ -195,7 +195,7 @@
 0:37              11 (const int)
 0:39      move second child to first child ( temp 4-component vector of float)
 0:39        'f' ( temp 4-component vector of float)
-0:39        Test condition and select ( temp 4-component vector of float)
+0:39        Test condition and select ( temp 4-component vector of float): no shortcircuit
 0:39          Condition
 0:39          Compare Less Than ( temp bool)
 0:39            direct index ( temp float)
@@ -341,7 +341,7 @@
 0:17      Sequence
 0:17        move second child to first child ( temp 4-component vector of float)
 0:17          'ret' ( temp 4-component vector of float)
-0:17          Test condition and select ( temp 4-component vector of float)
+0:17          Test condition and select ( temp 4-component vector of float): no shortcircuit
 0:17            Condition
 0:17            Compare Not Equal ( temp bool)
 0:17              t: direct index for structure ( uniform float)
@@ -432,7 +432,7 @@
 0:37          'e' ( temp int)
 0:37          move second child to first child ( temp int)
 0:37            'a' ( temp int)
-0:37            Test condition and select ( temp int)
+0:37            Test condition and select ( temp int): no shortcircuit
 0:37              Condition
 0:37              Convert int to bool ( temp bool)
 0:37                'b' ( temp int)
@@ -445,7 +445,7 @@
 0:37                10 (const int)
 0:37        move second child to first child ( temp int)
 0:37          'b' ( temp int)
-0:37          Test condition and select ( temp int)
+0:37          Test condition and select ( temp int): no shortcircuit
 0:37            Condition
 0:37            Convert int to bool ( temp bool)
 0:37              'a' ( temp int)
@@ -458,7 +458,7 @@
 0:37              11 (const int)
 0:39      move second child to first child ( temp 4-component vector of float)
 0:39        'f' ( temp 4-component vector of float)
-0:39        Test condition and select ( temp 4-component vector of float)
+0:39        Test condition and select ( temp 4-component vector of float): no shortcircuit
 0:39          Condition
 0:39          Compare Less Than ( temp bool)
 0:39            direct index ( temp float)
@@ -522,13 +522,13 @@
 0:?     'input' (layout( location=0) in 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80001
-// Id's are bound by 220
+// Generated by (magic number): 80007
+// Id's are bound by 206
 
                               Capability Shader
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "PixelShaderFunction" 213 216
+                              EntryPoint Fragment 4  "PixelShaderFunction" 199 202
                               ExecutionMode 4 OriginUpperLeft
                               Source HLSL 500
                               Name 4  "PixelShaderFunction"
@@ -548,20 +548,20 @@
                               MemberName 29($Global) 4  "f"
                               Name 31  ""
                               Name 85  "ret"
-                              Name 113  "a"
-                              Name 115  "b"
-                              Name 117  "c"
-                              Name 119  "d"
-                              Name 120  "ret"
-                              Name 140  "e"
-                              Name 161  "f"
-                              Name 200  "param"
-                              Name 201  "param"
-                              Name 202  "param"
-                              Name 211  "input"
-                              Name 213  "input"
-                              Name 216  "@entryPointOutput"
-                              Name 217  "param"
+                              Name 110  "a"
+                              Name 112  "b"
+                              Name 114  "c"
+                              Name 116  "d"
+                              Name 117  "ret"
+                              Name 137  "e"
+                              Name 150  "f"
+                              Name 186  "param"
+                              Name 187  "param"
+                              Name 188  "param"
+                              Name 197  "input"
+                              Name 199  "input"
+                              Name 202  "@entryPointOutput"
+                              Name 203  "param"
                               MemberDecorate 29($Global) 0 Offset 0
                               MemberDecorate 29($Global) 1 Offset 16
                               MemberDecorate 29($Global) 2 Offset 32
@@ -569,8 +569,8 @@
                               MemberDecorate 29($Global) 4 Offset 52
                               Decorate 29($Global) Block
                               Decorate 31 DescriptorSet 0
-                              Decorate 213(input) Location 0
-                              Decorate 216(@entryPointOutput) Location 0
+                              Decorate 199(input) Location 0
+                              Decorate 202(@entryPointOutput) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -598,41 +598,41 @@
               48:     32(int) Constant 4
               49:             TypePointer Uniform 6(float)
               53:     32(int) Constant 3
-             100:    6(float) Constant 1065353216
-             101:    7(fvec4) ConstantComposite 100 100 100 100
-             112:             TypePointer Function 32(int)
-             114:     32(int) Constant 5
-             116:     32(int) Constant 6
-             118:     32(int) Constant 7
-             143:             TypeInt 32 0
-             144:    143(int) Constant 0
-             150:     32(int) Constant 10
-             159:     32(int) Constant 11
-             163:             TypePointer Function 6(float)
-             166:    143(int) Constant 1
-             192:    13(bool) ConstantTrue
-             193:    13(bool) ConstantFalse
-             194:   14(bvec2) ConstantComposite 192 193
-             195:    6(float) Constant 1073741824
-             196:   16(fvec2) ConstantComposite 100 195
-             197:    6(float) Constant 1077936128
-             198:    6(float) Constant 1082130432
-             199:   16(fvec2) ConstantComposite 197 198
-             204:    6(float) Constant 1092616192
-             212:             TypePointer Input 7(fvec4)
-      213(input):    212(ptr) Variable Input
-             215:             TypePointer Output 7(fvec4)
-216(@entryPointOutput):    215(ptr) Variable Output
+              96:    6(float) Constant 1065353216
+              97:    7(fvec4) ConstantComposite 96 96 96 96
+             109:             TypePointer Function 32(int)
+             111:     32(int) Constant 5
+             113:     32(int) Constant 6
+             115:     32(int) Constant 7
+             139:             TypeInt 32 0
+             140:    139(int) Constant 0
+             143:     32(int) Constant 10
+             148:     32(int) Constant 11
+             151:             TypePointer Function 6(float)
+             154:    139(int) Constant 1
+             178:    13(bool) ConstantTrue
+             179:    13(bool) ConstantFalse
+             180:   14(bvec2) ConstantComposite 178 179
+             181:    6(float) Constant 1073741824
+             182:   16(fvec2) ConstantComposite 96 181
+             183:    6(float) Constant 1077936128
+             184:    6(float) Constant 1082130432
+             185:   16(fvec2) ConstantComposite 183 184
+             190:    6(float) Constant 1092616192
+             198:             TypePointer Input 7(fvec4)
+      199(input):    198(ptr) Variable Input
+             201:             TypePointer Output 7(fvec4)
+202(@entryPointOutput):    201(ptr) Variable Output
 4(PixelShaderFunction):           2 Function None 3
                5:             Label
-      211(input):     24(ptr) Variable Function
-      217(param):     24(ptr) Variable Function
-             214:    7(fvec4) Load 213(input)
-                              Store 211(input) 214
-             218:    7(fvec4) Load 211(input)
-                              Store 217(param) 218
-             219:    7(fvec4) FunctionCall 27(@PixelShaderFunction(vf4;) 217(param)
-                              Store 216(@entryPointOutput) 219
+      197(input):     24(ptr) Variable Function
+      203(param):     24(ptr) Variable Function
+             200:    7(fvec4) Load 199(input)
+                              Store 197(input) 200
+             204:    7(fvec4) Load 197(input)
+                              Store 203(param) 204
+             205:    7(fvec4) FunctionCall 27(@PixelShaderFunction(vf4;) 203(param)
+                              Store 202(@entryPointOutput) 205
                               Return
                               FunctionEnd
   9(vectorCond():    7(fvec4) Function None 8
@@ -682,154 +682,116 @@
  11(scalarCond():    7(fvec4) Function None 8
               12:             Label
          85(ret):     24(ptr) Variable Function
-              86:     24(ptr) Variable Function
-              87:     49(ptr) AccessChain 31 53
-              88:    6(float) Load 87
-              89:     49(ptr) AccessChain 31 48
-              90:    6(float) Load 89
-              91:    13(bool) FOrdNotEqual 88 90
-                              SelectionMerge 93 None
-                              BranchConditional 91 92 99
-              92:               Label
-              94:     49(ptr)   AccessChain 31 53
-              95:    6(float)   Load 94
-              96:     34(ptr)   AccessChain 31 33
-              97:    7(fvec4)   Load 96
-              98:    7(fvec4)   VectorTimesScalar 97 95
-                                Store 86 98
-                                Branch 93
-              99:               Label
-                                Store 86 101
-                                Branch 93
-              93:             Label
-             102:    7(fvec4) Load 86
-                              Store 85(ret) 102
-             103:    7(fvec4) Load 85(ret)
-                              ReturnValue 103
+              86:     49(ptr) AccessChain 31 53
+              87:    6(float) Load 86
+              88:     49(ptr) AccessChain 31 48
+              89:    6(float) Load 88
+              90:    13(bool) FOrdNotEqual 87 89
+              91:     49(ptr) AccessChain 31 53
+              92:    6(float) Load 91
+              93:     34(ptr) AccessChain 31 33
+              94:    7(fvec4) Load 93
+              95:    7(fvec4) VectorTimesScalar 94 92
+              98:   43(bvec4) CompositeConstruct 90 90 90 90
+              99:    7(fvec4) Select 98 95 97
+                              Store 85(ret) 99
+             100:    7(fvec4) Load 85(ret)
+                              ReturnValue 100
                               FunctionEnd
 22(fbSelect(vb2;vf2;vf2;):   16(fvec2) Function None 18
          19(cnd):     15(ptr) FunctionParameter
         20(src0):     17(ptr) FunctionParameter
         21(src1):     17(ptr) FunctionParameter
               23:             Label
-             106:   16(fvec2) Load 21(src1)
-             107:   16(fvec2) Load 20(src0)
-             108:   14(bvec2) Load 19(cnd)
-             109:   16(fvec2) Select 108 107 106
-                              ReturnValue 109
+             103:   16(fvec2) Load 21(src1)
+             104:   16(fvec2) Load 20(src0)
+             105:   14(bvec2) Load 19(cnd)
+             106:   16(fvec2) Select 105 104 103
+                              ReturnValue 106
                               FunctionEnd
 27(@PixelShaderFunction(vf4;):    7(fvec4) Function None 25
        26(input):     24(ptr) FunctionParameter
               28:             Label
-          113(a):    112(ptr) Variable Function
-          115(b):    112(ptr) Variable Function
-          117(c):    112(ptr) Variable Function
-          119(d):    112(ptr) Variable Function
-        120(ret):     24(ptr) Variable Function
-          140(e):    112(ptr) Variable Function
-             141:    112(ptr) Variable Function
-             152:    112(ptr) Variable Function
-          161(f):     24(ptr) Variable Function
-             162:     24(ptr) Variable Function
-      200(param):     15(ptr) Variable Function
-      201(param):     17(ptr) Variable Function
-      202(param):     17(ptr) Variable Function
-                              Store 113(a) 114
-                              Store 115(b) 116
-                              Store 117(c) 118
-                              Store 119(d) 118
-             121:     32(int) Load 113(a)
-             122:    6(float) ConvertSToF 121
-             123:    7(fvec4) Load 26(input)
-             124:    7(fvec4) VectorTimesScalar 123 122
-             125:     32(int) Load 115(b)
-             126:    6(float) ConvertSToF 125
-             127:    7(fvec4) Load 26(input)
-             128:    7(fvec4) VectorTimesScalar 127 126
-             129:    7(fvec4) FAdd 124 128
-             130:     32(int) Load 117(c)
-             131:    6(float) ConvertSToF 130
-             132:    7(fvec4) Load 26(input)
-             133:    7(fvec4) VectorTimesScalar 132 131
-             134:    7(fvec4) FAdd 129 133
-             135:     32(int) Load 119(d)
-             136:    6(float) ConvertSToF 135
-             137:    7(fvec4) Load 26(input)
-             138:    7(fvec4) VectorTimesScalar 137 136
-             139:    7(fvec4) FAdd 134 138
-                              Store 120(ret) 139
-             142:     32(int) Load 115(b)
-             145:    13(bool) INotEqual 142 144
-                              SelectionMerge 147 None
-                              BranchConditional 145 146 149
-             146:               Label
-             148:     32(int)   Load 119(d)
-                                Store 117(c) 148
-                                Store 141 148
-                                Branch 147
-             149:               Label
-                                Store 141 150
-                                Branch 147
-             147:             Label
-             151:     32(int) Load 141
-                              Store 113(a) 151
-                              Store 140(e) 151
-             153:     32(int) Load 113(a)
-             154:    13(bool) INotEqual 153 144
-                              SelectionMerge 156 None
-                              BranchConditional 154 155 158
-             155:               Label
-             157:     32(int)   Load 117(c)
-                                Store 119(d) 157
-                                Store 152 157
-                                Branch 156
-             158:               Label
-                                Store 152 159
-                                Branch 156
-             156:             Label
-             160:     32(int) Load 152
-                              Store 115(b) 160
-             164:    163(ptr) AccessChain 120(ret) 144
-             165:    6(float) Load 164
-             167:    163(ptr) AccessChain 26(input) 166
-             168:    6(float) Load 167
-             169:    13(bool) FOrdLessThan 165 168
-                              SelectionMerge 171 None
-                              BranchConditional 169 170 176
-             170:               Label
-             172:     32(int)   Load 117(c)
-             173:    6(float)   ConvertSToF 172
-             174:    7(fvec4)   Load 26(input)
-             175:    7(fvec4)   VectorTimesScalar 174 173
-                                Store 162 175
-                                Branch 171
-             176:               Label
-             177:     32(int)   Load 119(d)
-             178:    6(float)   ConvertSToF 177
-             179:    7(fvec4)   Load 26(input)
-             180:    7(fvec4)   VectorTimesScalar 179 178
-                                Store 162 180
-                                Branch 171
-             171:             Label
-             181:    7(fvec4) Load 162
-                              Store 161(f) 181
-             182:     32(int) Load 140(e)
-             183:    6(float) ConvertSToF 182
-             184:    7(fvec4) Load 120(ret)
-             185:    7(fvec4) VectorTimesScalar 184 183
-             186:    7(fvec4) Load 161(f)
-             187:    7(fvec4) FAdd 185 186
-             188:    7(fvec4) FunctionCall 9(vectorCond()
-             189:    7(fvec4) FAdd 187 188
-             190:    7(fvec4) FunctionCall 11(scalarCond()
-             191:    7(fvec4) FAdd 189 190
-                              Store 200(param) 194
-                              Store 201(param) 196
-                              Store 202(param) 199
-             203:   16(fvec2) FunctionCall 22(fbSelect(vb2;vf2;vf2;) 200(param) 201(param) 202(param)
-             205:    6(float) CompositeExtract 203 0
-             206:    6(float) CompositeExtract 203 1
-             207:    7(fvec4) CompositeConstruct 205 206 204 204
-             208:    7(fvec4) FAdd 191 207
-                              ReturnValue 208
+          110(a):    109(ptr) Variable Function
+          112(b):    109(ptr) Variable Function
+          114(c):    109(ptr) Variable Function
+          116(d):    109(ptr) Variable Function
+        117(ret):     24(ptr) Variable Function
+          137(e):    109(ptr) Variable Function
+          150(f):     24(ptr) Variable Function
+      186(param):     15(ptr) Variable Function
+      187(param):     17(ptr) Variable Function
+      188(param):     17(ptr) Variable Function
+                              Store 110(a) 111
+                              Store 112(b) 113
+                              Store 114(c) 115
+                              Store 116(d) 115
+             118:     32(int) Load 110(a)
+             119:    6(float) ConvertSToF 118
+             120:    7(fvec4) Load 26(input)
+             121:    7(fvec4) VectorTimesScalar 120 119
+             122:     32(int) Load 112(b)
+             123:    6(float) ConvertSToF 122
+             124:    7(fvec4) Load 26(input)
+             125:    7(fvec4) VectorTimesScalar 124 123
+             126:    7(fvec4) FAdd 121 125
+             127:     32(int) Load 114(c)
+             128:    6(float) ConvertSToF 127
+             129:    7(fvec4) Load 26(input)
+             130:    7(fvec4) VectorTimesScalar 129 128
+             131:    7(fvec4) FAdd 126 130
+             132:     32(int) Load 116(d)
+             133:    6(float) ConvertSToF 132
+             134:    7(fvec4) Load 26(input)
+             135:    7(fvec4) VectorTimesScalar 134 133
+             136:    7(fvec4) FAdd 131 135
+                              Store 117(ret) 136
+             138:     32(int) Load 112(b)
+             141:    13(bool) INotEqual 138 140
+             142:     32(int) Load 116(d)
+                              Store 114(c) 142
+             144:     32(int) Select 141 142 143
+                              Store 110(a) 144
+                              Store 137(e) 144
+             145:     32(int) Load 110(a)
+             146:    13(bool) INotEqual 145 140
+             147:     32(int) Load 114(c)
+                              Store 116(d) 147
+             149:     32(int) Select 146 147 148
+                              Store 112(b) 149
+             152:    151(ptr) AccessChain 117(ret) 140
+             153:    6(float) Load 152
+             155:    151(ptr) AccessChain 26(input) 154
+             156:    6(float) Load 155
+             157:    13(bool) FOrdLessThan 153 156
+             158:     32(int) Load 114(c)
+             159:    6(float) ConvertSToF 158
+             160:    7(fvec4) Load 26(input)
+             161:    7(fvec4) VectorTimesScalar 160 159
+             162:     32(int) Load 116(d)
+             163:    6(float) ConvertSToF 162
+             164:    7(fvec4) Load 26(input)
+             165:    7(fvec4) VectorTimesScalar 164 163
+             166:   43(bvec4) CompositeConstruct 157 157 157 157
+             167:    7(fvec4) Select 166 161 165
+                              Store 150(f) 167
+             168:     32(int) Load 137(e)
+             169:    6(float) ConvertSToF 168
+             170:    7(fvec4) Load 117(ret)
+             171:    7(fvec4) VectorTimesScalar 170 169
+             172:    7(fvec4) Load 150(f)
+             173:    7(fvec4) FAdd 171 172
+             174:    7(fvec4) FunctionCall 9(vectorCond()
+             175:    7(fvec4) FAdd 173 174
+             176:    7(fvec4) FunctionCall 11(scalarCond()
+             177:    7(fvec4) FAdd 175 176
+                              Store 186(param) 180
+                              Store 187(param) 182
+                              Store 188(param) 185
+             189:   16(fvec2) FunctionCall 22(fbSelect(vb2;vf2;vf2;) 186(param) 187(param) 188(param)
+             191:    6(float) CompositeExtract 189 0
+             192:    6(float) CompositeExtract 189 1
+             193:    7(fvec4) CompositeConstruct 191 192 190 190
+             194:    7(fvec4) FAdd 177 193
+                              ReturnValue 194
                               FunctionEnd
diff --git a/Test/baseResults/hlsl.constantbuffer.frag.out b/Test/baseResults/hlsl.constantbuffer.frag.out
index 2c7dafe..052d84e 100644
--- a/Test/baseResults/hlsl.constantbuffer.frag.out
+++ b/Test/baseResults/hlsl.constantbuffer.frag.out
@@ -45,7 +45,7 @@
 0:24                direct index (layout( row_major std140) temp 4-element array of block{layout( row_major std140) uniform bool x, layout( row_major std140) uniform float y})
 0:24                  'cb3' (layout( row_major std140) uniform 2-element array of 4-element array of block{layout( row_major std140) uniform bool x, layout( row_major std140) uniform float y})
 0:24                  Constant:
-0:24                    2 (const int)
+0:24                    1 (const int)
 0:24                Constant:
 0:24                  3 (const int)
 0:24              Constant:
@@ -113,7 +113,7 @@
 0:24                direct index (layout( row_major std140) temp 4-element array of block{layout( row_major std140) uniform bool x, layout( row_major std140) uniform float y})
 0:24                  'cb3' (layout( row_major std140) uniform 2-element array of 4-element array of block{layout( row_major std140) uniform bool x, layout( row_major std140) uniform float y})
 0:24                  Constant:
-0:24                    2 (const int)
+0:24                    1 (const int)
 0:24                Constant:
 0:24                  3 (const int)
 0:24              Constant:
@@ -131,8 +131,14 @@
 0:?     'anon@0' (layout( row_major std140) uniform block{layout( row_major std140) uniform int c1})
 0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
 
+error: SPIRV-Tools Validation Errors
+error: Uniform OpVariable <id> '18[cb3] 'has illegal type.
+From Vulkan spec, section 14.5.2:
+Variables identified with the Uniform storage class are used to access transparent buffer backed resources. Such variables must be typed as OpTypeStruct, or an array of this type
+  %cb3_0 = OpVariable %_ptr_Uniform__arr__arr_cb3_uint_4_uint_2 Uniform
+
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 66
 
                               Capability Shader
@@ -231,7 +237,7 @@
               54:    7(fvec4)   FAdd 45 53
                                 ReturnValue 54
               56:               Label
-              58:     41(ptr)   AccessChain 18(cb3) 21 57 20
+              58:     41(ptr)   AccessChain 18(cb3) 20 57 20
               59:    6(float)   Load 58
               60:    7(fvec4)   CompositeConstruct 59 59 59 59
                                 ReturnValue 60
diff --git a/Test/baseResults/hlsl.constructArray.vert.out b/Test/baseResults/hlsl.constructArray.vert.out
new file mode 100644
index 0000000..6e18ad9
--- /dev/null
+++ b/Test/baseResults/hlsl.constructArray.vert.out
@@ -0,0 +1,381 @@
+hlsl.constructArray.vert
+Shader version: 500
+0:? Sequence
+0:2  Function Definition: @main( ( temp 4-component vector of float)
+0:2    Function Parameters: 
+0:?     Sequence
+0:4      Sequence
+0:4        move second child to first child ( temp 2-element array of 4-component vector of float)
+0:4          'float4_array_times' ( temp 2-element array of 4-component vector of float)
+0:4          Construct structure ( temp 2-element array of 4-component vector of float)
+0:4            Convert int to float ( temp 4-component vector of float)
+0:4              direct index ( temp 4-component vector of int)
+0:4                'int4_array' ( temp 3-element array of 4-component vector of int)
+0:4                Constant:
+0:4                  0 (const int)
+0:4            Convert int to float ( temp 4-component vector of float)
+0:4              direct index ( temp 4-component vector of int)
+0:4                'int4_array' ( temp 3-element array of 4-component vector of int)
+0:4                Constant:
+0:4                  1 (const int)
+0:5      Sequence
+0:5        move second child to first child ( temp 4-element array of 2-component vector of float)
+0:5          'float2_array_times2' ( temp 4-element array of 2-component vector of float)
+0:5          Construct structure ( temp 4-element array of 2-component vector of float)
+0:5            Convert int to float ( temp 2-component vector of float)
+0:5              Construct ivec2 ( temp 2-component vector of int)
+0:5                direct index ( temp int)
+0:5                  direct index ( temp 4-component vector of int)
+0:5                    'int4_array' ( temp 3-element array of 4-component vector of int)
+0:5                    Constant:
+0:5                      0 (const int)
+0:5                  Constant:
+0:5                    0 (const int)
+0:5                direct index ( temp int)
+0:5                  direct index ( temp 4-component vector of int)
+0:5                    'int4_array' ( temp 3-element array of 4-component vector of int)
+0:5                    Constant:
+0:5                      0 (const int)
+0:5                  Constant:
+0:5                    1 (const int)
+0:5            Convert int to float ( temp 2-component vector of float)
+0:5              Construct ivec2 ( temp 2-component vector of int)
+0:5                direct index ( temp int)
+0:5                  direct index ( temp 4-component vector of int)
+0:5                    'int4_array' ( temp 3-element array of 4-component vector of int)
+0:5                    Constant:
+0:5                      0 (const int)
+0:5                  Constant:
+0:5                    2 (const int)
+0:5                direct index ( temp int)
+0:5                  direct index ( temp 4-component vector of int)
+0:5                    'int4_array' ( temp 3-element array of 4-component vector of int)
+0:5                    Constant:
+0:5                      0 (const int)
+0:5                  Constant:
+0:5                    3 (const int)
+0:5            Convert int to float ( temp 2-component vector of float)
+0:5              Construct ivec2 ( temp 2-component vector of int)
+0:5                direct index ( temp int)
+0:5                  direct index ( temp 4-component vector of int)
+0:5                    'int4_array' ( temp 3-element array of 4-component vector of int)
+0:5                    Constant:
+0:5                      1 (const int)
+0:5                  Constant:
+0:5                    0 (const int)
+0:5                direct index ( temp int)
+0:5                  direct index ( temp 4-component vector of int)
+0:5                    'int4_array' ( temp 3-element array of 4-component vector of int)
+0:5                    Constant:
+0:5                      1 (const int)
+0:5                  Constant:
+0:5                    1 (const int)
+0:5            Convert int to float ( temp 2-component vector of float)
+0:5              Construct ivec2 ( temp 2-component vector of int)
+0:5                direct index ( temp int)
+0:5                  direct index ( temp 4-component vector of int)
+0:5                    'int4_array' ( temp 3-element array of 4-component vector of int)
+0:5                    Constant:
+0:5                      1 (const int)
+0:5                  Constant:
+0:5                    2 (const int)
+0:5                direct index ( temp int)
+0:5                  direct index ( temp 4-component vector of int)
+0:5                    'int4_array' ( temp 3-element array of 4-component vector of int)
+0:5                    Constant:
+0:5                      1 (const int)
+0:5                  Constant:
+0:5                    3 (const int)
+0:6      Sequence
+0:6        move second child to first child ( temp 2-element array of 4-component vector of int)
+0:6          'int4_array2' ( temp 2-element array of 4-component vector of int)
+0:6          Construct structure ( temp 2-element array of 4-component vector of int)
+0:6            direct index ( temp 4-component vector of int)
+0:6              'int4_array' ( temp 3-element array of 4-component vector of int)
+0:6              Constant:
+0:6                0 (const int)
+0:6            direct index ( temp 4-component vector of int)
+0:6              'int4_array' ( temp 3-element array of 4-component vector of int)
+0:6              Constant:
+0:6                1 (const int)
+0:7      Sequence
+0:7        move second child to first child ( temp 2-element array of int)
+0:7          'int1_array' ( temp 2-element array of int)
+0:7          Construct structure ( temp 2-element array of int)
+0:7            direct index ( temp int)
+0:7              direct index ( temp 4-component vector of int)
+0:7                'int4_array' ( temp 3-element array of 4-component vector of int)
+0:7                Constant:
+0:7                  0 (const int)
+0:7              Constant:
+0:7                0 (const int)
+0:7            direct index ( temp int)
+0:7              direct index ( temp 4-component vector of int)
+0:7                'int4_array' ( temp 3-element array of 4-component vector of int)
+0:7                Constant:
+0:7                  0 (const int)
+0:7              Constant:
+0:7                1 (const int)
+0:9      Branch: Return with expression
+0:9        Constant:
+0:9          0.000000
+0:9          0.000000
+0:9          0.000000
+0:9          0.000000
+0:2  Function Definition: main( ( temp void)
+0:2    Function Parameters: 
+0:?     Sequence
+0:2      move second child to first child ( temp 4-component vector of float)
+0:?         '@entryPointOutput' ( out 4-component vector of float Position)
+0:2        Function Call: @main( ( temp 4-component vector of float)
+0:?   Linker Objects
+0:?     '@entryPointOutput' ( out 4-component vector of float Position)
+
+
+Linked vertex stage:
+
+
+Shader version: 500
+0:? Sequence
+0:2  Function Definition: @main( ( temp 4-component vector of float)
+0:2    Function Parameters: 
+0:?     Sequence
+0:4      Sequence
+0:4        move second child to first child ( temp 2-element array of 4-component vector of float)
+0:4          'float4_array_times' ( temp 2-element array of 4-component vector of float)
+0:4          Construct structure ( temp 2-element array of 4-component vector of float)
+0:4            Convert int to float ( temp 4-component vector of float)
+0:4              direct index ( temp 4-component vector of int)
+0:4                'int4_array' ( temp 3-element array of 4-component vector of int)
+0:4                Constant:
+0:4                  0 (const int)
+0:4            Convert int to float ( temp 4-component vector of float)
+0:4              direct index ( temp 4-component vector of int)
+0:4                'int4_array' ( temp 3-element array of 4-component vector of int)
+0:4                Constant:
+0:4                  1 (const int)
+0:5      Sequence
+0:5        move second child to first child ( temp 4-element array of 2-component vector of float)
+0:5          'float2_array_times2' ( temp 4-element array of 2-component vector of float)
+0:5          Construct structure ( temp 4-element array of 2-component vector of float)
+0:5            Convert int to float ( temp 2-component vector of float)
+0:5              Construct ivec2 ( temp 2-component vector of int)
+0:5                direct index ( temp int)
+0:5                  direct index ( temp 4-component vector of int)
+0:5                    'int4_array' ( temp 3-element array of 4-component vector of int)
+0:5                    Constant:
+0:5                      0 (const int)
+0:5                  Constant:
+0:5                    0 (const int)
+0:5                direct index ( temp int)
+0:5                  direct index ( temp 4-component vector of int)
+0:5                    'int4_array' ( temp 3-element array of 4-component vector of int)
+0:5                    Constant:
+0:5                      0 (const int)
+0:5                  Constant:
+0:5                    1 (const int)
+0:5            Convert int to float ( temp 2-component vector of float)
+0:5              Construct ivec2 ( temp 2-component vector of int)
+0:5                direct index ( temp int)
+0:5                  direct index ( temp 4-component vector of int)
+0:5                    'int4_array' ( temp 3-element array of 4-component vector of int)
+0:5                    Constant:
+0:5                      0 (const int)
+0:5                  Constant:
+0:5                    2 (const int)
+0:5                direct index ( temp int)
+0:5                  direct index ( temp 4-component vector of int)
+0:5                    'int4_array' ( temp 3-element array of 4-component vector of int)
+0:5                    Constant:
+0:5                      0 (const int)
+0:5                  Constant:
+0:5                    3 (const int)
+0:5            Convert int to float ( temp 2-component vector of float)
+0:5              Construct ivec2 ( temp 2-component vector of int)
+0:5                direct index ( temp int)
+0:5                  direct index ( temp 4-component vector of int)
+0:5                    'int4_array' ( temp 3-element array of 4-component vector of int)
+0:5                    Constant:
+0:5                      1 (const int)
+0:5                  Constant:
+0:5                    0 (const int)
+0:5                direct index ( temp int)
+0:5                  direct index ( temp 4-component vector of int)
+0:5                    'int4_array' ( temp 3-element array of 4-component vector of int)
+0:5                    Constant:
+0:5                      1 (const int)
+0:5                  Constant:
+0:5                    1 (const int)
+0:5            Convert int to float ( temp 2-component vector of float)
+0:5              Construct ivec2 ( temp 2-component vector of int)
+0:5                direct index ( temp int)
+0:5                  direct index ( temp 4-component vector of int)
+0:5                    'int4_array' ( temp 3-element array of 4-component vector of int)
+0:5                    Constant:
+0:5                      1 (const int)
+0:5                  Constant:
+0:5                    2 (const int)
+0:5                direct index ( temp int)
+0:5                  direct index ( temp 4-component vector of int)
+0:5                    'int4_array' ( temp 3-element array of 4-component vector of int)
+0:5                    Constant:
+0:5                      1 (const int)
+0:5                  Constant:
+0:5                    3 (const int)
+0:6      Sequence
+0:6        move second child to first child ( temp 2-element array of 4-component vector of int)
+0:6          'int4_array2' ( temp 2-element array of 4-component vector of int)
+0:6          Construct structure ( temp 2-element array of 4-component vector of int)
+0:6            direct index ( temp 4-component vector of int)
+0:6              'int4_array' ( temp 3-element array of 4-component vector of int)
+0:6              Constant:
+0:6                0 (const int)
+0:6            direct index ( temp 4-component vector of int)
+0:6              'int4_array' ( temp 3-element array of 4-component vector of int)
+0:6              Constant:
+0:6                1 (const int)
+0:7      Sequence
+0:7        move second child to first child ( temp 2-element array of int)
+0:7          'int1_array' ( temp 2-element array of int)
+0:7          Construct structure ( temp 2-element array of int)
+0:7            direct index ( temp int)
+0:7              direct index ( temp 4-component vector of int)
+0:7                'int4_array' ( temp 3-element array of 4-component vector of int)
+0:7                Constant:
+0:7                  0 (const int)
+0:7              Constant:
+0:7                0 (const int)
+0:7            direct index ( temp int)
+0:7              direct index ( temp 4-component vector of int)
+0:7                'int4_array' ( temp 3-element array of 4-component vector of int)
+0:7                Constant:
+0:7                  0 (const int)
+0:7              Constant:
+0:7                1 (const int)
+0:9      Branch: Return with expression
+0:9        Constant:
+0:9          0.000000
+0:9          0.000000
+0:9          0.000000
+0:9          0.000000
+0:2  Function Definition: main( ( temp void)
+0:2    Function Parameters: 
+0:?     Sequence
+0:2      move second child to first child ( temp 4-component vector of float)
+0:?         '@entryPointOutput' ( out 4-component vector of float Position)
+0:2        Function Call: @main( ( temp 4-component vector of float)
+0:?   Linker Objects
+0:?     '@entryPointOutput' ( out 4-component vector of float Position)
+
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 89
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Vertex 4  "main" 87
+                              Source HLSL 500
+                              Name 4  "main"
+                              Name 9  "@main("
+                              Name 15  "float4_array_times"
+                              Name 21  "int4_array"
+                              Name 36  "float2_array_times2"
+                              Name 68  "int4_array2"
+                              Name 76  "int1_array"
+                              Name 87  "@entryPointOutput"
+                              Decorate 87(@entryPointOutput) BuiltIn Position
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+               8:             TypeFunction 7(fvec4)
+              11:             TypeInt 32 0
+              12:     11(int) Constant 2
+              13:             TypeArray 7(fvec4) 12
+              14:             TypePointer Function 13
+              16:             TypeInt 32 1
+              17:             TypeVector 16(int) 4
+              18:     11(int) Constant 3
+              19:             TypeArray 17(ivec4) 18
+              20:             TypePointer Function 19
+              22:     16(int) Constant 0
+              23:             TypePointer Function 17(ivec4)
+              27:     16(int) Constant 1
+              32:             TypeVector 6(float) 2
+              33:     11(int) Constant 4
+              34:             TypeArray 32(fvec2) 33
+              35:             TypePointer Function 34
+              37:     11(int) Constant 0
+              38:             TypePointer Function 16(int)
+              41:     11(int) Constant 1
+              44:             TypeVector 16(int) 2
+              66:             TypeArray 17(ivec4) 12
+              67:             TypePointer Function 66
+              74:             TypeArray 16(int) 12
+              75:             TypePointer Function 74
+              82:    6(float) Constant 0
+              83:    7(fvec4) ConstantComposite 82 82 82 82
+              86:             TypePointer Output 7(fvec4)
+87(@entryPointOutput):     86(ptr) Variable Output
+         4(main):           2 Function None 3
+               5:             Label
+              88:    7(fvec4) FunctionCall 9(@main()
+                              Store 87(@entryPointOutput) 88
+                              Return
+                              FunctionEnd
+       9(@main():    7(fvec4) Function None 8
+              10:             Label
+15(float4_array_times):     14(ptr) Variable Function
+  21(int4_array):     20(ptr) Variable Function
+36(float2_array_times2):     35(ptr) Variable Function
+ 68(int4_array2):     67(ptr) Variable Function
+  76(int1_array):     75(ptr) Variable Function
+              24:     23(ptr) AccessChain 21(int4_array) 22
+              25:   17(ivec4) Load 24
+              26:    7(fvec4) ConvertSToF 25
+              28:     23(ptr) AccessChain 21(int4_array) 27
+              29:   17(ivec4) Load 28
+              30:    7(fvec4) ConvertSToF 29
+              31:          13 CompositeConstruct 26 30
+                              Store 15(float4_array_times) 31
+              39:     38(ptr) AccessChain 21(int4_array) 22 37
+              40:     16(int) Load 39
+              42:     38(ptr) AccessChain 21(int4_array) 22 41
+              43:     16(int) Load 42
+              45:   44(ivec2) CompositeConstruct 40 43
+              46:   32(fvec2) ConvertSToF 45
+              47:     38(ptr) AccessChain 21(int4_array) 22 12
+              48:     16(int) Load 47
+              49:     38(ptr) AccessChain 21(int4_array) 22 18
+              50:     16(int) Load 49
+              51:   44(ivec2) CompositeConstruct 48 50
+              52:   32(fvec2) ConvertSToF 51
+              53:     38(ptr) AccessChain 21(int4_array) 27 37
+              54:     16(int) Load 53
+              55:     38(ptr) AccessChain 21(int4_array) 27 41
+              56:     16(int) Load 55
+              57:   44(ivec2) CompositeConstruct 54 56
+              58:   32(fvec2) ConvertSToF 57
+              59:     38(ptr) AccessChain 21(int4_array) 27 12
+              60:     16(int) Load 59
+              61:     38(ptr) AccessChain 21(int4_array) 27 18
+              62:     16(int) Load 61
+              63:   44(ivec2) CompositeConstruct 60 62
+              64:   32(fvec2) ConvertSToF 63
+              65:          34 CompositeConstruct 46 52 58 64
+                              Store 36(float2_array_times2) 65
+              69:     23(ptr) AccessChain 21(int4_array) 22
+              70:   17(ivec4) Load 69
+              71:     23(ptr) AccessChain 21(int4_array) 27
+              72:   17(ivec4) Load 71
+              73:          66 CompositeConstruct 70 72
+                              Store 68(int4_array2) 73
+              77:     38(ptr) AccessChain 21(int4_array) 22 37
+              78:     16(int) Load 77
+              79:     38(ptr) AccessChain 21(int4_array) 22 41
+              80:     16(int) Load 79
+              81:          74 CompositeConstruct 78 80
+                              Store 76(int1_array) 81
+                              ReturnValue 83
+                              FunctionEnd
diff --git a/Test/baseResults/hlsl.constructexpr.frag.out b/Test/baseResults/hlsl.constructexpr.frag.out
index 90c667a..227c7e1 100644
--- a/Test/baseResults/hlsl.constructexpr.frag.out
+++ b/Test/baseResults/hlsl.constructexpr.frag.out
@@ -41,13 +41,13 @@
 0:?     Sequence
 0:4      Sequence
 0:4        move second child to first child ( temp 4-component vector of float)
-0:?           'color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.color' (layout( location=0) out 4-component vector of float)
 0:4          color: direct index for structure ( temp 4-component vector of float)
 0:4            Function Call: @main( ( temp structure{ temp 4-component vector of float color})
 0:4            Constant:
 0:4              0 (const int)
 0:?   Linker Objects
-0:?     'color' (layout( location=0) out 4-component vector of float)
+0:?     '@entryPointOutput.color' (layout( location=0) out 4-component vector of float)
 
 
 Linked fragment stage:
@@ -95,16 +95,16 @@
 0:?     Sequence
 0:4      Sequence
 0:4        move second child to first child ( temp 4-component vector of float)
-0:?           'color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.color' (layout( location=0) out 4-component vector of float)
 0:4          color: direct index for structure ( temp 4-component vector of float)
 0:4            Function Call: @main( ( temp structure{ temp 4-component vector of float color})
 0:4            Constant:
 0:4              0 (const int)
 0:?   Linker Objects
-0:?     'color' (layout( location=0) out 4-component vector of float)
+0:?     '@entryPointOutput.color' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 40
 
                               Capability Shader
@@ -118,8 +118,8 @@
                               MemberName 8(PS_OUTPUT) 0  "color"
                               Name 10  "@main("
                               Name 27  "ps_output"
-                              Name 37  "color"
-                              Decorate 37(color) Location 0
+                              Name 37  "@entryPointOutput.color"
+                              Decorate 37(@entryPointOutput.color) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -146,12 +146,12 @@
               30:    7(fvec4) ConstantComposite 29 29 29 29
               31:             TypePointer Function 7(fvec4)
               36:             TypePointer Output 7(fvec4)
-       37(color):     36(ptr) Variable Output
+37(@entryPointOutput.color):     36(ptr) Variable Output
          4(main):           2 Function None 3
                5:             Label
               38:8(PS_OUTPUT) FunctionCall 10(@main()
               39:    7(fvec4) CompositeExtract 38 0
-                              Store 37(color) 39
+                              Store 37(@entryPointOutput.color) 39
                               Return
                               FunctionEnd
       10(@main():8(PS_OUTPUT) Function None 9
diff --git a/Test/baseResults/hlsl.constructimat.frag.out b/Test/baseResults/hlsl.constructimat.frag.out
new file mode 100644
index 0000000..e88c3d8
--- /dev/null
+++ b/Test/baseResults/hlsl.constructimat.frag.out
@@ -0,0 +1,698 @@
+hlsl.constructimat.frag
+Shader version: 500
+gl_FragCoord origin is upper left
+0:? Sequence
+0:2  Function Definition: @main( ( temp int)
+0:2    Function Parameters: 
+0:?     Sequence
+0:6      Sequence
+0:6        move second child to first child ( temp 4X4 matrix of int)
+0:6          'var443' ( temp 4X4 matrix of int)
+0:6          Constant:
+0:6            0 (const int)
+0:6            1 (const int)
+0:6            0 (const int)
+0:6            0 (const int)
+0:6            1 (const int)
+0:6            1 (const int)
+0:6            0 (const int)
+0:6            0 (const int)
+0:6            1 (const int)
+0:6            0 (const int)
+0:6            0 (const int)
+0:6            0 (const int)
+0:6            0 (const int)
+0:6            0 (const int)
+0:6            0 (const int)
+0:6            0 (const int)
+0:7      Sequence
+0:7        move second child to first child ( temp 4X4 matrix of int)
+0:7          'var444' ( temp 4X4 matrix of int)
+0:?           Constant:
+0:?             0 (const int)
+0:?             1 (const int)
+0:?             0 (const int)
+0:?             0 (const int)
+0:?             1 (const int)
+0:?             1 (const int)
+0:?             0 (const int)
+0:?             0 (const int)
+0:?             1 (const int)
+0:?             0 (const int)
+0:?             0 (const int)
+0:?             0 (const int)
+0:?             0 (const int)
+0:?             0 (const int)
+0:?             0 (const int)
+0:?             0 (const int)
+0:11      Sequence
+0:11        move second child to first child ( temp 4X2 matrix of int)
+0:11          'var423' ( temp 4X2 matrix of int)
+0:11          Constant:
+0:11            0 (const int)
+0:11            1 (const int)
+0:11            1 (const int)
+0:11            1 (const int)
+0:11            1 (const int)
+0:11            0 (const int)
+0:11            0 (const int)
+0:11            0 (const int)
+0:12      Sequence
+0:12        move second child to first child ( temp 4X2 matrix of int)
+0:12          'var424' ( temp 4X2 matrix of int)
+0:?           Constant:
+0:?             0 (const int)
+0:?             1 (const int)
+0:?             1 (const int)
+0:?             1 (const int)
+0:?             1 (const int)
+0:?             0 (const int)
+0:?             0 (const int)
+0:?             0 (const int)
+0:16      Sequence
+0:16        move second child to first child ( temp 3X2 matrix of int)
+0:16          'var323' ( temp 3X2 matrix of int)
+0:16          Constant:
+0:16            0 (const int)
+0:16            1 (const int)
+0:16            1 (const int)
+0:16            1 (const int)
+0:16            1 (const int)
+0:16            0 (const int)
+0:17      Sequence
+0:17        move second child to first child ( temp 3X2 matrix of int)
+0:17          'var234' ( temp 3X2 matrix of int)
+0:?           Constant:
+0:?             0 (const int)
+0:?             1 (const int)
+0:?             1 (const int)
+0:?             1 (const int)
+0:?             1 (const int)
+0:?             0 (const int)
+0:22      Sequence
+0:22        move second child to first child ( temp 4X4 matrix of uint)
+0:22          'uvar443' ( temp 4X4 matrix of uint)
+0:22          Constant:
+0:22            0 (const uint)
+0:22            1 (const uint)
+0:22            0 (const uint)
+0:22            0 (const uint)
+0:22            1 (const uint)
+0:22            1 (const uint)
+0:22            0 (const uint)
+0:22            0 (const uint)
+0:22            1 (const uint)
+0:22            0 (const uint)
+0:22            0 (const uint)
+0:22            0 (const uint)
+0:22            0 (const uint)
+0:22            0 (const uint)
+0:22            0 (const uint)
+0:22            0 (const uint)
+0:23      Sequence
+0:23        move second child to first child ( temp 4X4 matrix of uint)
+0:23          'uvar444' ( temp 4X4 matrix of uint)
+0:?           Constant:
+0:?             0 (const uint)
+0:?             1 (const uint)
+0:?             0 (const uint)
+0:?             0 (const uint)
+0:?             1 (const uint)
+0:?             1 (const uint)
+0:?             0 (const uint)
+0:?             0 (const uint)
+0:?             1 (const uint)
+0:?             0 (const uint)
+0:?             0 (const uint)
+0:?             0 (const uint)
+0:?             0 (const uint)
+0:?             0 (const uint)
+0:?             0 (const uint)
+0:?             0 (const uint)
+0:27      Sequence
+0:27        move second child to first child ( temp 4X2 matrix of uint)
+0:27          'uvar423' ( temp 4X2 matrix of uint)
+0:27          Constant:
+0:27            0 (const uint)
+0:27            1 (const uint)
+0:27            1 (const uint)
+0:27            1 (const uint)
+0:27            1 (const uint)
+0:27            0 (const uint)
+0:27            0 (const uint)
+0:27            0 (const uint)
+0:28      Sequence
+0:28        move second child to first child ( temp 4X2 matrix of uint)
+0:28          'uvar424' ( temp 4X2 matrix of uint)
+0:?           Constant:
+0:?             0 (const uint)
+0:?             1 (const uint)
+0:?             1 (const uint)
+0:?             1 (const uint)
+0:?             1 (const uint)
+0:?             0 (const uint)
+0:?             0 (const uint)
+0:?             0 (const uint)
+0:32      Sequence
+0:32        move second child to first child ( temp 3X2 matrix of uint)
+0:32          'uvar323' ( temp 3X2 matrix of uint)
+0:32          Constant:
+0:32            0 (const uint)
+0:32            1 (const uint)
+0:32            1 (const uint)
+0:32            1 (const uint)
+0:32            1 (const uint)
+0:32            0 (const uint)
+0:33      Sequence
+0:33        move second child to first child ( temp 3X2 matrix of uint)
+0:33          'uvar234' ( temp 3X2 matrix of uint)
+0:?           Constant:
+0:?             0 (const uint)
+0:?             1 (const uint)
+0:?             1 (const uint)
+0:?             1 (const uint)
+0:?             1 (const uint)
+0:?             0 (const uint)
+0:38      Sequence
+0:38        move second child to first child ( temp 4X4 matrix of bool)
+0:38          'bvar443' ( temp 4X4 matrix of bool)
+0:38          Constant:
+0:38            false (const bool)
+0:38            true (const bool)
+0:38            false (const bool)
+0:38            false (const bool)
+0:38            true (const bool)
+0:38            true (const bool)
+0:38            false (const bool)
+0:38            false (const bool)
+0:38            true (const bool)
+0:38            false (const bool)
+0:38            false (const bool)
+0:38            false (const bool)
+0:38            false (const bool)
+0:38            false (const bool)
+0:38            false (const bool)
+0:38            false (const bool)
+0:39      Sequence
+0:39        move second child to first child ( temp 4X4 matrix of bool)
+0:39          'bvar444' ( temp 4X4 matrix of bool)
+0:?           Constant:
+0:?             false (const bool)
+0:?             true (const bool)
+0:?             false (const bool)
+0:?             false (const bool)
+0:?             true (const bool)
+0:?             true (const bool)
+0:?             false (const bool)
+0:?             false (const bool)
+0:?             true (const bool)
+0:?             false (const bool)
+0:?             false (const bool)
+0:?             false (const bool)
+0:?             false (const bool)
+0:?             false (const bool)
+0:?             false (const bool)
+0:?             false (const bool)
+0:43      Sequence
+0:43        move second child to first child ( temp 4X2 matrix of bool)
+0:43          'bvar423' ( temp 4X2 matrix of bool)
+0:43          Constant:
+0:43            false (const bool)
+0:43            true (const bool)
+0:43            true (const bool)
+0:43            true (const bool)
+0:43            true (const bool)
+0:43            false (const bool)
+0:43            false (const bool)
+0:43            false (const bool)
+0:44      Sequence
+0:44        move second child to first child ( temp 4X2 matrix of bool)
+0:44          'bvar424' ( temp 4X2 matrix of bool)
+0:?           Constant:
+0:?             false (const bool)
+0:?             true (const bool)
+0:?             true (const bool)
+0:?             true (const bool)
+0:?             true (const bool)
+0:?             false (const bool)
+0:?             false (const bool)
+0:?             false (const bool)
+0:48      Sequence
+0:48        move second child to first child ( temp 3X2 matrix of bool)
+0:48          'bvar323' ( temp 3X2 matrix of bool)
+0:48          Constant:
+0:48            false (const bool)
+0:48            true (const bool)
+0:48            true (const bool)
+0:48            true (const bool)
+0:48            true (const bool)
+0:48            false (const bool)
+0:49      Sequence
+0:49        move second child to first child ( temp 3X2 matrix of bool)
+0:49          'bvar234' ( temp 3X2 matrix of bool)
+0:?           Constant:
+0:?             false (const bool)
+0:?             true (const bool)
+0:?             true (const bool)
+0:?             true (const bool)
+0:?             true (const bool)
+0:?             false (const bool)
+0:51      Branch: Return with expression
+0:51        Constant:
+0:51          0 (const int)
+0:2  Function Definition: main( ( temp void)
+0:2    Function Parameters: 
+0:?     Sequence
+0:2      move second child to first child ( temp int)
+0:?         '@entryPointOutput' (layout( location=0) out int)
+0:2        Function Call: @main( ( temp int)
+0:?   Linker Objects
+0:?     '@entryPointOutput' (layout( location=0) out int)
+
+
+Linked fragment stage:
+
+
+Shader version: 500
+gl_FragCoord origin is upper left
+0:? Sequence
+0:2  Function Definition: @main( ( temp int)
+0:2    Function Parameters: 
+0:?     Sequence
+0:6      Sequence
+0:6        move second child to first child ( temp 4X4 matrix of int)
+0:6          'var443' ( temp 4X4 matrix of int)
+0:6          Constant:
+0:6            0 (const int)
+0:6            1 (const int)
+0:6            0 (const int)
+0:6            0 (const int)
+0:6            1 (const int)
+0:6            1 (const int)
+0:6            0 (const int)
+0:6            0 (const int)
+0:6            1 (const int)
+0:6            0 (const int)
+0:6            0 (const int)
+0:6            0 (const int)
+0:6            0 (const int)
+0:6            0 (const int)
+0:6            0 (const int)
+0:6            0 (const int)
+0:7      Sequence
+0:7        move second child to first child ( temp 4X4 matrix of int)
+0:7          'var444' ( temp 4X4 matrix of int)
+0:?           Constant:
+0:?             0 (const int)
+0:?             1 (const int)
+0:?             0 (const int)
+0:?             0 (const int)
+0:?             1 (const int)
+0:?             1 (const int)
+0:?             0 (const int)
+0:?             0 (const int)
+0:?             1 (const int)
+0:?             0 (const int)
+0:?             0 (const int)
+0:?             0 (const int)
+0:?             0 (const int)
+0:?             0 (const int)
+0:?             0 (const int)
+0:?             0 (const int)
+0:11      Sequence
+0:11        move second child to first child ( temp 4X2 matrix of int)
+0:11          'var423' ( temp 4X2 matrix of int)
+0:11          Constant:
+0:11            0 (const int)
+0:11            1 (const int)
+0:11            1 (const int)
+0:11            1 (const int)
+0:11            1 (const int)
+0:11            0 (const int)
+0:11            0 (const int)
+0:11            0 (const int)
+0:12      Sequence
+0:12        move second child to first child ( temp 4X2 matrix of int)
+0:12          'var424' ( temp 4X2 matrix of int)
+0:?           Constant:
+0:?             0 (const int)
+0:?             1 (const int)
+0:?             1 (const int)
+0:?             1 (const int)
+0:?             1 (const int)
+0:?             0 (const int)
+0:?             0 (const int)
+0:?             0 (const int)
+0:16      Sequence
+0:16        move second child to first child ( temp 3X2 matrix of int)
+0:16          'var323' ( temp 3X2 matrix of int)
+0:16          Constant:
+0:16            0 (const int)
+0:16            1 (const int)
+0:16            1 (const int)
+0:16            1 (const int)
+0:16            1 (const int)
+0:16            0 (const int)
+0:17      Sequence
+0:17        move second child to first child ( temp 3X2 matrix of int)
+0:17          'var234' ( temp 3X2 matrix of int)
+0:?           Constant:
+0:?             0 (const int)
+0:?             1 (const int)
+0:?             1 (const int)
+0:?             1 (const int)
+0:?             1 (const int)
+0:?             0 (const int)
+0:22      Sequence
+0:22        move second child to first child ( temp 4X4 matrix of uint)
+0:22          'uvar443' ( temp 4X4 matrix of uint)
+0:22          Constant:
+0:22            0 (const uint)
+0:22            1 (const uint)
+0:22            0 (const uint)
+0:22            0 (const uint)
+0:22            1 (const uint)
+0:22            1 (const uint)
+0:22            0 (const uint)
+0:22            0 (const uint)
+0:22            1 (const uint)
+0:22            0 (const uint)
+0:22            0 (const uint)
+0:22            0 (const uint)
+0:22            0 (const uint)
+0:22            0 (const uint)
+0:22            0 (const uint)
+0:22            0 (const uint)
+0:23      Sequence
+0:23        move second child to first child ( temp 4X4 matrix of uint)
+0:23          'uvar444' ( temp 4X4 matrix of uint)
+0:?           Constant:
+0:?             0 (const uint)
+0:?             1 (const uint)
+0:?             0 (const uint)
+0:?             0 (const uint)
+0:?             1 (const uint)
+0:?             1 (const uint)
+0:?             0 (const uint)
+0:?             0 (const uint)
+0:?             1 (const uint)
+0:?             0 (const uint)
+0:?             0 (const uint)
+0:?             0 (const uint)
+0:?             0 (const uint)
+0:?             0 (const uint)
+0:?             0 (const uint)
+0:?             0 (const uint)
+0:27      Sequence
+0:27        move second child to first child ( temp 4X2 matrix of uint)
+0:27          'uvar423' ( temp 4X2 matrix of uint)
+0:27          Constant:
+0:27            0 (const uint)
+0:27            1 (const uint)
+0:27            1 (const uint)
+0:27            1 (const uint)
+0:27            1 (const uint)
+0:27            0 (const uint)
+0:27            0 (const uint)
+0:27            0 (const uint)
+0:28      Sequence
+0:28        move second child to first child ( temp 4X2 matrix of uint)
+0:28          'uvar424' ( temp 4X2 matrix of uint)
+0:?           Constant:
+0:?             0 (const uint)
+0:?             1 (const uint)
+0:?             1 (const uint)
+0:?             1 (const uint)
+0:?             1 (const uint)
+0:?             0 (const uint)
+0:?             0 (const uint)
+0:?             0 (const uint)
+0:32      Sequence
+0:32        move second child to first child ( temp 3X2 matrix of uint)
+0:32          'uvar323' ( temp 3X2 matrix of uint)
+0:32          Constant:
+0:32            0 (const uint)
+0:32            1 (const uint)
+0:32            1 (const uint)
+0:32            1 (const uint)
+0:32            1 (const uint)
+0:32            0 (const uint)
+0:33      Sequence
+0:33        move second child to first child ( temp 3X2 matrix of uint)
+0:33          'uvar234' ( temp 3X2 matrix of uint)
+0:?           Constant:
+0:?             0 (const uint)
+0:?             1 (const uint)
+0:?             1 (const uint)
+0:?             1 (const uint)
+0:?             1 (const uint)
+0:?             0 (const uint)
+0:38      Sequence
+0:38        move second child to first child ( temp 4X4 matrix of bool)
+0:38          'bvar443' ( temp 4X4 matrix of bool)
+0:38          Constant:
+0:38            false (const bool)
+0:38            true (const bool)
+0:38            false (const bool)
+0:38            false (const bool)
+0:38            true (const bool)
+0:38            true (const bool)
+0:38            false (const bool)
+0:38            false (const bool)
+0:38            true (const bool)
+0:38            false (const bool)
+0:38            false (const bool)
+0:38            false (const bool)
+0:38            false (const bool)
+0:38            false (const bool)
+0:38            false (const bool)
+0:38            false (const bool)
+0:39      Sequence
+0:39        move second child to first child ( temp 4X4 matrix of bool)
+0:39          'bvar444' ( temp 4X4 matrix of bool)
+0:?           Constant:
+0:?             false (const bool)
+0:?             true (const bool)
+0:?             false (const bool)
+0:?             false (const bool)
+0:?             true (const bool)
+0:?             true (const bool)
+0:?             false (const bool)
+0:?             false (const bool)
+0:?             true (const bool)
+0:?             false (const bool)
+0:?             false (const bool)
+0:?             false (const bool)
+0:?             false (const bool)
+0:?             false (const bool)
+0:?             false (const bool)
+0:?             false (const bool)
+0:43      Sequence
+0:43        move second child to first child ( temp 4X2 matrix of bool)
+0:43          'bvar423' ( temp 4X2 matrix of bool)
+0:43          Constant:
+0:43            false (const bool)
+0:43            true (const bool)
+0:43            true (const bool)
+0:43            true (const bool)
+0:43            true (const bool)
+0:43            false (const bool)
+0:43            false (const bool)
+0:43            false (const bool)
+0:44      Sequence
+0:44        move second child to first child ( temp 4X2 matrix of bool)
+0:44          'bvar424' ( temp 4X2 matrix of bool)
+0:?           Constant:
+0:?             false (const bool)
+0:?             true (const bool)
+0:?             true (const bool)
+0:?             true (const bool)
+0:?             true (const bool)
+0:?             false (const bool)
+0:?             false (const bool)
+0:?             false (const bool)
+0:48      Sequence
+0:48        move second child to first child ( temp 3X2 matrix of bool)
+0:48          'bvar323' ( temp 3X2 matrix of bool)
+0:48          Constant:
+0:48            false (const bool)
+0:48            true (const bool)
+0:48            true (const bool)
+0:48            true (const bool)
+0:48            true (const bool)
+0:48            false (const bool)
+0:49      Sequence
+0:49        move second child to first child ( temp 3X2 matrix of bool)
+0:49          'bvar234' ( temp 3X2 matrix of bool)
+0:?           Constant:
+0:?             false (const bool)
+0:?             true (const bool)
+0:?             true (const bool)
+0:?             true (const bool)
+0:?             true (const bool)
+0:?             false (const bool)
+0:51      Branch: Return with expression
+0:51        Constant:
+0:51          0 (const int)
+0:2  Function Definition: main( ( temp void)
+0:2    Function Parameters: 
+0:?     Sequence
+0:2      move second child to first child ( temp int)
+0:?         '@entryPointOutput' (layout( location=0) out int)
+0:2        Function Call: @main( ( temp int)
+0:?   Linker Objects
+0:?     '@entryPointOutput' (layout( location=0) out int)
+
+error: SPIRV-Tools Validation Errors
+error: Matrix types can only be parameterized with floating-point types.
+  %mat4v4int = OpTypeMatrix %v4int 4
+
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 98
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 96
+                              ExecutionMode 4 OriginUpperLeft
+                              Source HLSL 500
+                              Name 4  "main"
+                              Name 8  "@main("
+                              Name 13  "var443"
+                              Name 21  "var444"
+                              Name 25  "var423"
+                              Name 31  "var424"
+                              Name 34  "var323"
+                              Name 36  "var234"
+                              Name 41  "uvar443"
+                              Name 49  "uvar444"
+                              Name 53  "uvar423"
+                              Name 59  "uvar424"
+                              Name 62  "uvar323"
+                              Name 64  "uvar234"
+                              Name 69  "bvar443"
+                              Name 77  "bvar444"
+                              Name 81  "bvar423"
+                              Name 87  "bvar424"
+                              Name 90  "bvar323"
+                              Name 92  "bvar234"
+                              Name 96  "@entryPointOutput"
+                              Decorate 96(@entryPointOutput) Location 0
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeInt 32 1
+               7:             TypeFunction 6(int)
+              10:             TypeVector 6(int) 4
+              11:             TypeMatrix 10(ivec4) 4
+              12:             TypePointer Function 11
+              14:      6(int) Constant 0
+              15:      6(int) Constant 1
+              16:   10(ivec4) ConstantComposite 14 15 14 14
+              17:   10(ivec4) ConstantComposite 15 15 14 14
+              18:   10(ivec4) ConstantComposite 15 14 14 14
+              19:   10(ivec4) ConstantComposite 14 14 14 14
+              20:          11 ConstantComposite 16 17 18 19
+              22:             TypeVector 6(int) 2
+              23:             TypeMatrix 22(ivec2) 4
+              24:             TypePointer Function 23
+              26:   22(ivec2) ConstantComposite 14 15
+              27:   22(ivec2) ConstantComposite 15 15
+              28:   22(ivec2) ConstantComposite 15 14
+              29:   22(ivec2) ConstantComposite 14 14
+              30:          23 ConstantComposite 26 27 28 29
+              32:             TypeMatrix 22(ivec2) 3
+              33:             TypePointer Function 32
+              35:          32 ConstantComposite 26 27 28
+              37:             TypeInt 32 0
+              38:             TypeVector 37(int) 4
+              39:             TypeMatrix 38(ivec4) 4
+              40:             TypePointer Function 39
+              42:     37(int) Constant 0
+              43:     37(int) Constant 1
+              44:   38(ivec4) ConstantComposite 42 43 42 42
+              45:   38(ivec4) ConstantComposite 43 43 42 42
+              46:   38(ivec4) ConstantComposite 43 42 42 42
+              47:   38(ivec4) ConstantComposite 42 42 42 42
+              48:          39 ConstantComposite 44 45 46 47
+              50:             TypeVector 37(int) 2
+              51:             TypeMatrix 50(ivec2) 4
+              52:             TypePointer Function 51
+              54:   50(ivec2) ConstantComposite 42 43
+              55:   50(ivec2) ConstantComposite 43 43
+              56:   50(ivec2) ConstantComposite 43 42
+              57:   50(ivec2) ConstantComposite 42 42
+              58:          51 ConstantComposite 54 55 56 57
+              60:             TypeMatrix 50(ivec2) 3
+              61:             TypePointer Function 60
+              63:          60 ConstantComposite 54 55 56
+              65:             TypeBool
+              66:             TypeVector 65(bool) 4
+              67:             TypeMatrix 66(bvec4) 4
+              68:             TypePointer Function 67
+              70:    65(bool) ConstantFalse
+              71:    65(bool) ConstantTrue
+              72:   66(bvec4) ConstantComposite 70 71 70 70
+              73:   66(bvec4) ConstantComposite 71 71 70 70
+              74:   66(bvec4) ConstantComposite 71 70 70 70
+              75:   66(bvec4) ConstantComposite 70 70 70 70
+              76:          67 ConstantComposite 72 73 74 75
+              78:             TypeVector 65(bool) 2
+              79:             TypeMatrix 78(bvec2) 4
+              80:             TypePointer Function 79
+              82:   78(bvec2) ConstantComposite 70 71
+              83:   78(bvec2) ConstantComposite 71 71
+              84:   78(bvec2) ConstantComposite 71 70
+              85:   78(bvec2) ConstantComposite 70 70
+              86:          79 ConstantComposite 82 83 84 85
+              88:             TypeMatrix 78(bvec2) 3
+              89:             TypePointer Function 88
+              91:          88 ConstantComposite 82 83 84
+              95:             TypePointer Output 6(int)
+96(@entryPointOutput):     95(ptr) Variable Output
+         4(main):           2 Function None 3
+               5:             Label
+              97:      6(int) FunctionCall 8(@main()
+                              Store 96(@entryPointOutput) 97
+                              Return
+                              FunctionEnd
+       8(@main():      6(int) Function None 7
+               9:             Label
+      13(var443):     12(ptr) Variable Function
+      21(var444):     12(ptr) Variable Function
+      25(var423):     24(ptr) Variable Function
+      31(var424):     24(ptr) Variable Function
+      34(var323):     33(ptr) Variable Function
+      36(var234):     33(ptr) Variable Function
+     41(uvar443):     40(ptr) Variable Function
+     49(uvar444):     40(ptr) Variable Function
+     53(uvar423):     52(ptr) Variable Function
+     59(uvar424):     52(ptr) Variable Function
+     62(uvar323):     61(ptr) Variable Function
+     64(uvar234):     61(ptr) Variable Function
+     69(bvar443):     68(ptr) Variable Function
+     77(bvar444):     68(ptr) Variable Function
+     81(bvar423):     80(ptr) Variable Function
+     87(bvar424):     80(ptr) Variable Function
+     90(bvar323):     89(ptr) Variable Function
+     92(bvar234):     89(ptr) Variable Function
+                              Store 13(var443) 20
+                              Store 21(var444) 20
+                              Store 25(var423) 30
+                              Store 31(var424) 30
+                              Store 34(var323) 35
+                              Store 36(var234) 35
+                              Store 41(uvar443) 48
+                              Store 49(uvar444) 48
+                              Store 53(uvar423) 58
+                              Store 59(uvar424) 58
+                              Store 62(uvar323) 63
+                              Store 64(uvar234) 63
+                              Store 69(bvar443) 76
+                              Store 77(bvar444) 76
+                              Store 81(bvar423) 86
+                              Store 87(bvar424) 86
+                              Store 90(bvar323) 91
+                              Store 92(bvar234) 91
+                              ReturnValue 14
+                              FunctionEnd
diff --git a/Test/baseResults/hlsl.coverage.frag.out b/Test/baseResults/hlsl.coverage.frag.out
new file mode 100644
index 0000000..bea2fc0
--- /dev/null
+++ b/Test/baseResults/hlsl.coverage.frag.out
@@ -0,0 +1,208 @@
+hlsl.coverage.frag
+Shader version: 500
+gl_FragCoord origin is upper left
+0:? Sequence
+0:15  Function Definition: @main(struct-PS_INPUT1; ( temp structure{ temp 4-component vector of float vColor,  temp uint nCoverageMask})
+0:15    Function Parameters: 
+0:15      'i' ( in structure{})
+0:?     Sequence
+0:17      move second child to first child ( temp 4-component vector of float)
+0:17        vColor: direct index for structure ( temp 4-component vector of float)
+0:17          'o' ( temp structure{ temp 4-component vector of float vColor,  temp uint nCoverageMask})
+0:17          Constant:
+0:17            0 (const int)
+0:?         Constant:
+0:?           1.000000
+0:?           0.000000
+0:?           0.000000
+0:?           1.000000
+0:18      move second child to first child ( temp uint)
+0:18        nCoverageMask: direct index for structure ( temp uint)
+0:18          'o' ( temp structure{ temp 4-component vector of float vColor,  temp uint nCoverageMask})
+0:18          Constant:
+0:18            1 (const int)
+0:18        Constant:
+0:18          0 (const uint)
+0:19      Branch: Return with expression
+0:19        'o' ( temp structure{ temp 4-component vector of float vColor,  temp uint nCoverageMask})
+0:15  Function Definition: main( ( temp void)
+0:15    Function Parameters: 
+0:?     Sequence
+0:15      Sequence
+0:15        move second child to first child ( temp structure{})
+0:?           'i' ( temp structure{})
+0:?           'i' ( in structure{})
+0:15      Sequence
+0:15        move second child to first child ( temp structure{ temp 4-component vector of float vColor,  temp uint nCoverageMask})
+0:15          'flattenTemp' ( temp structure{ temp 4-component vector of float vColor,  temp uint nCoverageMask})
+0:15          Function Call: @main(struct-PS_INPUT1; ( temp structure{ temp 4-component vector of float vColor,  temp uint nCoverageMask})
+0:?             'i' ( temp structure{})
+0:15        move second child to first child ( temp 4-component vector of float)
+0:?           '@entryPointOutput.vColor' (layout( location=0) out 4-component vector of float)
+0:15          vColor: direct index for structure ( temp 4-component vector of float)
+0:15            'flattenTemp' ( temp structure{ temp 4-component vector of float vColor,  temp uint nCoverageMask})
+0:15            Constant:
+0:15              0 (const int)
+0:15        move second child to first child ( temp uint)
+0:15          direct index ( out uint SampleMaskIn)
+0:?             '@entryPointOutput.nCoverageMask' ( out 1-element array of uint SampleMaskIn)
+0:15            Constant:
+0:15              0 (const int)
+0:15          nCoverageMask: direct index for structure ( temp uint)
+0:15            'flattenTemp' ( temp structure{ temp 4-component vector of float vColor,  temp uint nCoverageMask})
+0:15            Constant:
+0:15              1 (const int)
+0:?   Linker Objects
+0:?     '@entryPointOutput.nCoverageMask' ( out 1-element array of uint SampleMaskIn)
+0:?     '@entryPointOutput.vColor' (layout( location=0) out 4-component vector of float)
+
+
+Linked fragment stage:
+
+
+Shader version: 500
+gl_FragCoord origin is upper left
+0:? Sequence
+0:15  Function Definition: @main(struct-PS_INPUT1; ( temp structure{ temp 4-component vector of float vColor,  temp uint nCoverageMask})
+0:15    Function Parameters: 
+0:15      'i' ( in structure{})
+0:?     Sequence
+0:17      move second child to first child ( temp 4-component vector of float)
+0:17        vColor: direct index for structure ( temp 4-component vector of float)
+0:17          'o' ( temp structure{ temp 4-component vector of float vColor,  temp uint nCoverageMask})
+0:17          Constant:
+0:17            0 (const int)
+0:?         Constant:
+0:?           1.000000
+0:?           0.000000
+0:?           0.000000
+0:?           1.000000
+0:18      move second child to first child ( temp uint)
+0:18        nCoverageMask: direct index for structure ( temp uint)
+0:18          'o' ( temp structure{ temp 4-component vector of float vColor,  temp uint nCoverageMask})
+0:18          Constant:
+0:18            1 (const int)
+0:18        Constant:
+0:18          0 (const uint)
+0:19      Branch: Return with expression
+0:19        'o' ( temp structure{ temp 4-component vector of float vColor,  temp uint nCoverageMask})
+0:15  Function Definition: main( ( temp void)
+0:15    Function Parameters: 
+0:?     Sequence
+0:15      Sequence
+0:15        move second child to first child ( temp structure{})
+0:?           'i' ( temp structure{})
+0:?           'i' ( in structure{})
+0:15      Sequence
+0:15        move second child to first child ( temp structure{ temp 4-component vector of float vColor,  temp uint nCoverageMask})
+0:15          'flattenTemp' ( temp structure{ temp 4-component vector of float vColor,  temp uint nCoverageMask})
+0:15          Function Call: @main(struct-PS_INPUT1; ( temp structure{ temp 4-component vector of float vColor,  temp uint nCoverageMask})
+0:?             'i' ( temp structure{})
+0:15        move second child to first child ( temp 4-component vector of float)
+0:?           '@entryPointOutput.vColor' (layout( location=0) out 4-component vector of float)
+0:15          vColor: direct index for structure ( temp 4-component vector of float)
+0:15            'flattenTemp' ( temp structure{ temp 4-component vector of float vColor,  temp uint nCoverageMask})
+0:15            Constant:
+0:15              0 (const int)
+0:15        move second child to first child ( temp uint)
+0:15          direct index ( out uint SampleMaskIn)
+0:?             '@entryPointOutput.nCoverageMask' ( out 1-element array of uint SampleMaskIn)
+0:15            Constant:
+0:15              0 (const int)
+0:15          nCoverageMask: direct index for structure ( temp uint)
+0:15            'flattenTemp' ( temp structure{ temp 4-component vector of float vColor,  temp uint nCoverageMask})
+0:15            Constant:
+0:15              1 (const int)
+0:?   Linker Objects
+0:?     '@entryPointOutput.nCoverageMask' ( out 1-element array of uint SampleMaskIn)
+0:?     '@entryPointOutput.vColor' (layout( location=0) out 4-component vector of float)
+
+error: SPIRV-Tools Validation Errors
+error: Input variable id <34> is used by entry point 'main' id <4>, but is not listed as an interface
+  %i_1 = OpVariable %_ptr_Input_PS_INPUT Input
+
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 52
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 41 47
+                              ExecutionMode 4 OriginUpperLeft
+                              Source HLSL 500
+                              Name 4  "main"
+                              Name 6  "PS_INPUT"
+                              Name 11  "PS_OUTPUT"
+                              MemberName 11(PS_OUTPUT) 0  "vColor"
+                              MemberName 11(PS_OUTPUT) 1  "nCoverageMask"
+                              Name 14  "@main(struct-PS_INPUT1;"
+                              Name 13  "i"
+                              Name 17  "o"
+                              Name 32  "i"
+                              Name 34  "i"
+                              Name 36  "flattenTemp"
+                              Name 37  "param"
+                              Name 41  "@entryPointOutput.vColor"
+                              Name 47  "@entryPointOutput.nCoverageMask"
+                              Decorate 41(@entryPointOutput.vColor) Location 0
+                              Decorate 47(@entryPointOutput.nCoverageMask) BuiltIn SampleMask
+               2:             TypeVoid
+               3:             TypeFunction 2
+     6(PS_INPUT):             TypeStruct
+               7:             TypePointer Function 6(PS_INPUT)
+               8:             TypeFloat 32
+               9:             TypeVector 8(float) 4
+              10:             TypeInt 32 0
+   11(PS_OUTPUT):             TypeStruct 9(fvec4) 10(int)
+              12:             TypeFunction 11(PS_OUTPUT) 7(ptr)
+              16:             TypePointer Function 11(PS_OUTPUT)
+              18:             TypeInt 32 1
+              19:     18(int) Constant 0
+              20:    8(float) Constant 1065353216
+              21:    8(float) Constant 0
+              22:    9(fvec4) ConstantComposite 20 21 21 20
+              23:             TypePointer Function 9(fvec4)
+              25:     18(int) Constant 1
+              26:     10(int) Constant 0
+              27:             TypePointer Function 10(int)
+              33:             TypePointer Input 6(PS_INPUT)
+           34(i):     33(ptr) Variable Input
+              40:             TypePointer Output 9(fvec4)
+41(@entryPointOutput.vColor):     40(ptr) Variable Output
+              44:     10(int) Constant 1
+              45:             TypeArray 10(int) 44
+              46:             TypePointer Output 45
+47(@entryPointOutput.nCoverageMask):     46(ptr) Variable Output
+              50:             TypePointer Output 10(int)
+         4(main):           2 Function None 3
+               5:             Label
+           32(i):      7(ptr) Variable Function
+ 36(flattenTemp):     16(ptr) Variable Function
+       37(param):      7(ptr) Variable Function
+              35: 6(PS_INPUT) Load 34(i)
+                              Store 32(i) 35
+              38: 6(PS_INPUT) Load 32(i)
+                              Store 37(param) 38
+              39:11(PS_OUTPUT) FunctionCall 14(@main(struct-PS_INPUT1;) 37(param)
+                              Store 36(flattenTemp) 39
+              42:     23(ptr) AccessChain 36(flattenTemp) 19
+              43:    9(fvec4) Load 42
+                              Store 41(@entryPointOutput.vColor) 43
+              48:     27(ptr) AccessChain 36(flattenTemp) 25
+              49:     10(int) Load 48
+              51:     50(ptr) AccessChain 47(@entryPointOutput.nCoverageMask) 19
+                              Store 51 49
+                              Return
+                              FunctionEnd
+14(@main(struct-PS_INPUT1;):11(PS_OUTPUT) Function None 12
+           13(i):      7(ptr) FunctionParameter
+              15:             Label
+           17(o):     16(ptr) Variable Function
+              24:     23(ptr) AccessChain 17(o) 19
+                              Store 24 22
+              28:     27(ptr) AccessChain 17(o) 25
+                              Store 28 26
+              29:11(PS_OUTPUT) Load 17(o)
+                              ReturnValue 29
+                              FunctionEnd
diff --git a/Test/baseResults/hlsl.dashI.vert.out b/Test/baseResults/hlsl.dashI.vert.out
new file mode 100644
index 0000000..400502b
--- /dev/null
+++ b/Test/baseResults/hlsl.dashI.vert.out
@@ -0,0 +1,69 @@
+hlsl.dashI.vert
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 40
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Vertex 4  "main" 38
+                              Source HLSL 500
+                              Name 4  "main"
+                              Name 9  "@main("
+                              Name 11  "$Global"
+                              MemberName 11($Global) 0  "i1"
+                              MemberName 11($Global) 1  "p1"
+                              MemberName 11($Global) 2  "p2"
+                              MemberName 11($Global) 3  "p3"
+                              MemberName 11($Global) 4  "i4"
+                              Name 13  ""
+                              Name 38  "@entryPointOutput"
+                              MemberDecorate 11($Global) 0 Offset 0
+                              MemberDecorate 11($Global) 1 Offset 16
+                              MemberDecorate 11($Global) 2 Offset 32
+                              MemberDecorate 11($Global) 3 Offset 48
+                              MemberDecorate 11($Global) 4 Offset 64
+                              Decorate 11($Global) Block
+                              Decorate 13 DescriptorSet 0
+                              Decorate 38(@entryPointOutput) BuiltIn Position
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+               8:             TypeFunction 7(fvec4)
+     11($Global):             TypeStruct 7(fvec4) 7(fvec4) 7(fvec4) 7(fvec4) 7(fvec4)
+              12:             TypePointer Uniform 11($Global)
+              13:     12(ptr) Variable Uniform
+              14:             TypeInt 32 1
+              15:     14(int) Constant 0
+              16:             TypePointer Uniform 7(fvec4)
+              19:     14(int) Constant 4
+              23:     14(int) Constant 1
+              27:     14(int) Constant 2
+              31:     14(int) Constant 3
+              37:             TypePointer Output 7(fvec4)
+38(@entryPointOutput):     37(ptr) Variable Output
+         4(main):           2 Function None 3
+               5:             Label
+              39:    7(fvec4) FunctionCall 9(@main()
+                              Store 38(@entryPointOutput) 39
+                              Return
+                              FunctionEnd
+       9(@main():    7(fvec4) Function None 8
+              10:             Label
+              17:     16(ptr) AccessChain 13 15
+              18:    7(fvec4) Load 17
+              20:     16(ptr) AccessChain 13 19
+              21:    7(fvec4) Load 20
+              22:    7(fvec4) FAdd 18 21
+              24:     16(ptr) AccessChain 13 23
+              25:    7(fvec4) Load 24
+              26:    7(fvec4) FAdd 22 25
+              28:     16(ptr) AccessChain 13 27
+              29:    7(fvec4) Load 28
+              30:    7(fvec4) FAdd 26 29
+              32:     16(ptr) AccessChain 13 31
+              33:    7(fvec4) Load 32
+              34:    7(fvec4) FAdd 30 33
+                              ReturnValue 34
+                              FunctionEnd
diff --git a/Test/baseResults/hlsl.deadFunctionMissingBody.vert.out b/Test/baseResults/hlsl.deadFunctionMissingBody.vert.out
index 3d493f7..2bc08da 100644
--- a/Test/baseResults/hlsl.deadFunctionMissingBody.vert.out
+++ b/Test/baseResults/hlsl.deadFunctionMissingBody.vert.out
@@ -1,6 +1,6 @@
 hlsl.deadFunctionMissingBody.vert
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 18
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.depthGreater.frag.out b/Test/baseResults/hlsl.depthGreater.frag.out
old mode 100755
new mode 100644
index f1bbb5b..9749371
--- a/Test/baseResults/hlsl.depthGreater.frag.out
+++ b/Test/baseResults/hlsl.depthGreater.frag.out
@@ -50,7 +50,7 @@
 0:?     'depth' ( out float FragDepth)
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 20
 
                               Capability Shader
@@ -59,6 +59,7 @@
                               EntryPoint Fragment 4  "PixelShaderFunction" 18
                               ExecutionMode 4 OriginUpperLeft
                               ExecutionMode 4 DepthGreater
+                              ExecutionMode 4 DepthReplacing
                               Source HLSL 500
                               Name 4  "PixelShaderFunction"
                               Name 10  "@PixelShaderFunction(f1;"
diff --git a/Test/baseResults/hlsl.depthLess.frag.out b/Test/baseResults/hlsl.depthLess.frag.out
old mode 100755
new mode 100644
index 7a3e926..c3af8ee
--- a/Test/baseResults/hlsl.depthLess.frag.out
+++ b/Test/baseResults/hlsl.depthLess.frag.out
@@ -42,7 +42,7 @@
 0:?     '@entryPointOutput' ( out float FragDepth)
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 16
 
                               Capability Shader
@@ -51,6 +51,7 @@
                               EntryPoint Fragment 4  "PixelShaderFunction" 14
                               ExecutionMode 4 OriginUpperLeft
                               ExecutionMode 4 DepthLess
+                              ExecutionMode 4 DepthReplacing
                               Source HLSL 500
                               Name 4  "PixelShaderFunction"
                               Name 8  "@PixelShaderFunction("
diff --git a/Test/baseResults/hlsl.discard.frag.out b/Test/baseResults/hlsl.discard.frag.out
old mode 100755
new mode 100644
index 508ac5a..cc7c866
--- a/Test/baseResults/hlsl.discard.frag.out
+++ b/Test/baseResults/hlsl.discard.frag.out
@@ -108,7 +108,7 @@
 0:?     'input' (layout( location=0) in 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 50
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.doLoop.frag.out b/Test/baseResults/hlsl.doLoop.frag.out
old mode 100755
new mode 100644
index bdd9338..bb56465
--- a/Test/baseResults/hlsl.doLoop.frag.out
+++ b/Test/baseResults/hlsl.doLoop.frag.out
@@ -6,12 +6,12 @@
 0:2    Function Parameters: 
 0:2      'input' ( in float)
 0:?     Sequence
-0:3      Loop with condition not tested first
+0:3      Loop with condition not tested first: Unroll
 0:3        Loop Condition
 0:3        Constant:
 0:3          false (const bool)
 0:3        No loop body
-0:4      Loop with condition not tested first
+0:4      Loop with condition not tested first: Unroll
 0:4        Loop Condition
 0:4        Constant:
 0:4          false (const bool)
@@ -80,12 +80,12 @@
 0:2    Function Parameters: 
 0:2      'input' ( in float)
 0:?     Sequence
-0:3      Loop with condition not tested first
+0:3      Loop with condition not tested first: Unroll
 0:3        Loop Condition
 0:3        Constant:
 0:3          false (const bool)
 0:3        No loop body
-0:4      Loop with condition not tested first
+0:4      Loop with condition not tested first: Unroll
 0:4        Loop Condition
 0:4        Constant:
 0:4          false (const bool)
@@ -144,7 +144,7 @@
 0:?     'input' (layout( location=0) in float)
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 71
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.domain.1.tese.out b/Test/baseResults/hlsl.domain.1.tese.out
index e1a414d..4bc8bac 100644
--- a/Test/baseResults/hlsl.domain.1.tese.out
+++ b/Test/baseResults/hlsl.domain.1.tese.out
@@ -4,9 +4,10 @@
 vertex spacing = none
 triangle order = none
 0:? Sequence
-0:22  Function Definition: @main(struct-ds_in_t-vf4-vf31[3];vf3;struct-pcf_in_t-f1[3]-f11; ( temp structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
+0:22  Function Definition: @main(struct-ds_in_t-vf4-vf31[3];f1;vf3;struct-pcf_in_t-f1[3]-f11; ( temp structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
 0:22    Function Parameters: 
 0:22      'i' ( const (read only) 3-element array of structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
+0:22      'f' ( in float)
 0:22      'tesscoord' ( in 3-component vector of float)
 0:22      'pcf_data' ( in structure{ temp 3-element array of float flTessFactor,  temp float flInsideTessFactor})
 0:?     Sequence
@@ -23,10 +24,12 @@
 0:25                0 (const int)
 0:25            Constant:
 0:25              0 (const int)
-0:25          direct index ( temp float)
-0:25            'tesscoord' ( in 3-component vector of float)
-0:25            Constant:
-0:25              0 (const int)
+0:25          component-wise multiply ( temp float)
+0:25            direct index ( temp float)
+0:25              'tesscoord' ( in 3-component vector of float)
+0:25              Constant:
+0:25                0 (const int)
+0:25            'f' ( in float)
 0:26      move second child to first child ( temp 3-component vector of float)
 0:26        norm: direct index for structure ( temp 3-component vector of float)
 0:26          'o' ( temp structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
@@ -56,6 +59,9 @@
 0:22      move second child to first child ( temp 3-element array of structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
 0:?         'i' ( temp 3-element array of structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
 0:?         'i' (layout( location=0) in 3-element array of structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
+0:22      move second child to first child ( temp float)
+0:?         'f' ( temp float)
+0:?         'f' (layout( location=2) patch in float)
 0:22      move second child to first child ( temp 3-component vector of float)
 0:?         'tesscoord' ( temp 3-component vector of float)
 0:?         'tesscoord' ( patch in 3-component vector of float TessCoord)
@@ -69,7 +75,7 @@
 0:22            Constant:
 0:22              0 (const int)
 0:22          direct index ( patch in float TessLevelOuter)
-0:?             'pcf_data_flTessFactor' ( patch in 4-element array of float TessLevelOuter)
+0:?             'pcf_data.flTessFactor' ( patch in 4-element array of float TessLevelOuter)
 0:22            Constant:
 0:22              0 (const int)
 0:22        move second child to first child ( temp float)
@@ -81,7 +87,7 @@
 0:22            Constant:
 0:22              1 (const int)
 0:22          direct index ( patch in float TessLevelOuter)
-0:?             'pcf_data_flTessFactor' ( patch in 4-element array of float TessLevelOuter)
+0:?             'pcf_data.flTessFactor' ( patch in 4-element array of float TessLevelOuter)
 0:22            Constant:
 0:22              1 (const int)
 0:22        move second child to first child ( temp float)
@@ -93,7 +99,7 @@
 0:22            Constant:
 0:22              2 (const int)
 0:22          direct index ( patch in float TessLevelOuter)
-0:?             'pcf_data_flTessFactor' ( patch in 4-element array of float TessLevelOuter)
+0:?             'pcf_data.flTessFactor' ( patch in 4-element array of float TessLevelOuter)
 0:22            Constant:
 0:22              2 (const int)
 0:22        move second child to first child ( temp float)
@@ -102,22 +108,37 @@
 0:22            Constant:
 0:22              1 (const int)
 0:22          direct index ( patch in float TessLevelInner)
-0:?             'pcf_data_flInsideTessFactor' ( patch in 2-element array of float TessLevelInner)
+0:?             'pcf_data.flInsideTessFactor' ( patch in 2-element array of float TessLevelInner)
 0:22            Constant:
 0:22              0 (const int)
-0:22      move second child to first child ( temp structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
-0:?         '@entryPointOutput' (layout( location=0) out structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
-0:22        Function Call: @main(struct-ds_in_t-vf4-vf31[3];vf3;struct-pcf_in_t-f1[3]-f11; ( temp structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
-0:?           'i' ( temp 3-element array of structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
-0:?           'tesscoord' ( temp 3-component vector of float)
-0:?           'pcf_data' ( temp structure{ temp 3-element array of float flTessFactor,  temp float flInsideTessFactor})
+0:22      Sequence
+0:22        move second child to first child ( temp structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
+0:22          'flattenTemp' ( temp structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
+0:22          Function Call: @main(struct-ds_in_t-vf4-vf31[3];f1;vf3;struct-pcf_in_t-f1[3]-f11; ( temp structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
+0:?             'i' ( temp 3-element array of structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
+0:?             'f' ( temp float)
+0:?             'tesscoord' ( temp 3-component vector of float)
+0:?             'pcf_data' ( temp structure{ temp 3-element array of float flTessFactor,  temp float flInsideTessFactor})
+0:22        move second child to first child ( temp 4-component vector of float)
+0:?           '@entryPointOutput.pos' (layout( location=0) out 4-component vector of float)
+0:22          pos: direct index for structure ( temp 4-component vector of float)
+0:22            'flattenTemp' ( temp structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
+0:22            Constant:
+0:22              0 (const int)
+0:22        move second child to first child ( temp 3-component vector of float)
+0:?           '@entryPointOutput.norm' (layout( location=1) out 3-component vector of float)
+0:22          norm: direct index for structure ( temp 3-component vector of float)
+0:22            'flattenTemp' ( temp structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
+0:22            Constant:
+0:22              1 (const int)
 0:?   Linker Objects
-0:?     '@entryPointOutput' (layout( location=0) out structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
+0:?     '@entryPointOutput.pos' (layout( location=0) out 4-component vector of float)
+0:?     '@entryPointOutput.norm' (layout( location=1) out 3-component vector of float)
 0:?     'i' (layout( location=0) in 3-element array of structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
+0:?     'f' (layout( location=2) patch in float)
 0:?     'tesscoord' ( patch in 3-component vector of float TessCoord)
-0:?     'pcf_data' (layout( location=2) patch in structure{})
-0:?     'pcf_data_flTessFactor' ( patch in 4-element array of float TessLevelOuter)
-0:?     'pcf_data_flInsideTessFactor' ( patch in 2-element array of float TessLevelInner)
+0:?     'pcf_data.flTessFactor' ( patch in 4-element array of float TessLevelOuter)
+0:?     'pcf_data.flInsideTessFactor' ( patch in 2-element array of float TessLevelInner)
 
 
 Linked tessellation evaluation stage:
@@ -128,9 +149,10 @@
 vertex spacing = none
 triangle order = none
 0:? Sequence
-0:22  Function Definition: @main(struct-ds_in_t-vf4-vf31[3];vf3;struct-pcf_in_t-f1[3]-f11; ( temp structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
+0:22  Function Definition: @main(struct-ds_in_t-vf4-vf31[3];f1;vf3;struct-pcf_in_t-f1[3]-f11; ( temp structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
 0:22    Function Parameters: 
 0:22      'i' ( const (read only) 3-element array of structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
+0:22      'f' ( in float)
 0:22      'tesscoord' ( in 3-component vector of float)
 0:22      'pcf_data' ( in structure{ temp 3-element array of float flTessFactor,  temp float flInsideTessFactor})
 0:?     Sequence
@@ -147,10 +169,12 @@
 0:25                0 (const int)
 0:25            Constant:
 0:25              0 (const int)
-0:25          direct index ( temp float)
-0:25            'tesscoord' ( in 3-component vector of float)
-0:25            Constant:
-0:25              0 (const int)
+0:25          component-wise multiply ( temp float)
+0:25            direct index ( temp float)
+0:25              'tesscoord' ( in 3-component vector of float)
+0:25              Constant:
+0:25                0 (const int)
+0:25            'f' ( in float)
 0:26      move second child to first child ( temp 3-component vector of float)
 0:26        norm: direct index for structure ( temp 3-component vector of float)
 0:26          'o' ( temp structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
@@ -180,6 +204,9 @@
 0:22      move second child to first child ( temp 3-element array of structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
 0:?         'i' ( temp 3-element array of structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
 0:?         'i' (layout( location=0) in 3-element array of structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
+0:22      move second child to first child ( temp float)
+0:?         'f' ( temp float)
+0:?         'f' (layout( location=2) patch in float)
 0:22      move second child to first child ( temp 3-component vector of float)
 0:?         'tesscoord' ( temp 3-component vector of float)
 0:?         'tesscoord' ( patch in 3-component vector of float TessCoord)
@@ -193,7 +220,7 @@
 0:22            Constant:
 0:22              0 (const int)
 0:22          direct index ( patch in float TessLevelOuter)
-0:?             'pcf_data_flTessFactor' ( patch in 4-element array of float TessLevelOuter)
+0:?             'pcf_data.flTessFactor' ( patch in 4-element array of float TessLevelOuter)
 0:22            Constant:
 0:22              0 (const int)
 0:22        move second child to first child ( temp float)
@@ -205,7 +232,7 @@
 0:22            Constant:
 0:22              1 (const int)
 0:22          direct index ( patch in float TessLevelOuter)
-0:?             'pcf_data_flTessFactor' ( patch in 4-element array of float TessLevelOuter)
+0:?             'pcf_data.flTessFactor' ( patch in 4-element array of float TessLevelOuter)
 0:22            Constant:
 0:22              1 (const int)
 0:22        move second child to first child ( temp float)
@@ -217,7 +244,7 @@
 0:22            Constant:
 0:22              2 (const int)
 0:22          direct index ( patch in float TessLevelOuter)
-0:?             'pcf_data_flTessFactor' ( patch in 4-element array of float TessLevelOuter)
+0:?             'pcf_data.flTessFactor' ( patch in 4-element array of float TessLevelOuter)
 0:22            Constant:
 0:22              2 (const int)
 0:22        move second child to first child ( temp float)
@@ -226,70 +253,90 @@
 0:22            Constant:
 0:22              1 (const int)
 0:22          direct index ( patch in float TessLevelInner)
-0:?             'pcf_data_flInsideTessFactor' ( patch in 2-element array of float TessLevelInner)
+0:?             'pcf_data.flInsideTessFactor' ( patch in 2-element array of float TessLevelInner)
 0:22            Constant:
 0:22              0 (const int)
-0:22      move second child to first child ( temp structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
-0:?         '@entryPointOutput' (layout( location=0) out structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
-0:22        Function Call: @main(struct-ds_in_t-vf4-vf31[3];vf3;struct-pcf_in_t-f1[3]-f11; ( temp structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
-0:?           'i' ( temp 3-element array of structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
-0:?           'tesscoord' ( temp 3-component vector of float)
-0:?           'pcf_data' ( temp structure{ temp 3-element array of float flTessFactor,  temp float flInsideTessFactor})
+0:22      Sequence
+0:22        move second child to first child ( temp structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
+0:22          'flattenTemp' ( temp structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
+0:22          Function Call: @main(struct-ds_in_t-vf4-vf31[3];f1;vf3;struct-pcf_in_t-f1[3]-f11; ( temp structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
+0:?             'i' ( temp 3-element array of structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
+0:?             'f' ( temp float)
+0:?             'tesscoord' ( temp 3-component vector of float)
+0:?             'pcf_data' ( temp structure{ temp 3-element array of float flTessFactor,  temp float flInsideTessFactor})
+0:22        move second child to first child ( temp 4-component vector of float)
+0:?           '@entryPointOutput.pos' (layout( location=0) out 4-component vector of float)
+0:22          pos: direct index for structure ( temp 4-component vector of float)
+0:22            'flattenTemp' ( temp structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
+0:22            Constant:
+0:22              0 (const int)
+0:22        move second child to first child ( temp 3-component vector of float)
+0:?           '@entryPointOutput.norm' (layout( location=1) out 3-component vector of float)
+0:22          norm: direct index for structure ( temp 3-component vector of float)
+0:22            'flattenTemp' ( temp structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
+0:22            Constant:
+0:22              1 (const int)
 0:?   Linker Objects
-0:?     '@entryPointOutput' (layout( location=0) out structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
+0:?     '@entryPointOutput.pos' (layout( location=0) out 4-component vector of float)
+0:?     '@entryPointOutput.norm' (layout( location=1) out 3-component vector of float)
 0:?     'i' (layout( location=0) in 3-element array of structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
+0:?     'f' (layout( location=2) patch in float)
 0:?     'tesscoord' ( patch in 3-component vector of float TessCoord)
-0:?     'pcf_data' (layout( location=2) patch in structure{})
-0:?     'pcf_data_flTessFactor' ( patch in 4-element array of float TessLevelOuter)
-0:?     'pcf_data_flInsideTessFactor' ( patch in 2-element array of float TessLevelInner)
+0:?     'pcf_data.flTessFactor' ( patch in 4-element array of float TessLevelOuter)
+0:?     'pcf_data.flInsideTessFactor' ( patch in 2-element array of float TessLevelInner)
 
 // Module Version 10000
-// Generated by (magic number): 80001
-// Id's are bound by 91
+// Generated by (magic number): 80007
+// Id's are bound by 103
 
                               Capability Tessellation
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint TessellationEvaluation 4  "main" 51 55 61 76 81 90
+                              EntryPoint TessellationEvaluation 4  "main" 54 58 62 68 82 96 100
                               ExecutionMode 4 Triangles
                               Source HLSL 500
                               Name 4  "main"
                               Name 9  "ds_in_t"
                               MemberName 9(ds_in_t) 0  "pos"
                               MemberName 9(ds_in_t) 1  "norm"
-                              Name 15  "pcf_in_t"
-                              MemberName 15(pcf_in_t) 0  "flTessFactor"
-                              MemberName 15(pcf_in_t) 1  "flInsideTessFactor"
-                              Name 17  "gs_in_t"
-                              MemberName 17(gs_in_t) 0  "pos"
-                              MemberName 17(gs_in_t) 1  "norm"
-                              Name 22  "@main(struct-ds_in_t-vf4-vf31[3];vf3;struct-pcf_in_t-f1[3]-f11;"
-                              Name 19  "i"
-                              Name 20  "tesscoord"
-                              Name 21  "pcf_data"
-                              Name 25  "o"
-                              Name 49  "i"
-                              Name 51  "i"
-                              Name 53  "tesscoord"
-                              Name 55  "tesscoord"
-                              Name 57  "pcf_data"
-                              Name 61  "pcf_data_flTessFactor"
-                              Name 76  "pcf_data_flInsideTessFactor"
-                              Name 81  "@entryPointOutput"
-                              Name 83  "param"
-                              Name 85  "param"
-                              Name 88  "pcf_in_t"
-                              Name 90  "pcf_data"
-                              Decorate 51(i) Location 0
-                              Decorate 55(tesscoord) Patch
-                              Decorate 55(tesscoord) BuiltIn TessCoord
-                              Decorate 61(pcf_data_flTessFactor) Patch
-                              Decorate 61(pcf_data_flTessFactor) BuiltIn TessLevelOuter
-                              Decorate 76(pcf_data_flInsideTessFactor) Patch
-                              Decorate 76(pcf_data_flInsideTessFactor) BuiltIn TessLevelInner
-                              Decorate 81(@entryPointOutput) Location 0
-                              Decorate 90(pcf_data) Patch
-                              Decorate 90(pcf_data) Location 2
+                              Name 16  "pcf_in_t"
+                              MemberName 16(pcf_in_t) 0  "flTessFactor"
+                              MemberName 16(pcf_in_t) 1  "flInsideTessFactor"
+                              Name 18  "gs_in_t"
+                              MemberName 18(gs_in_t) 0  "pos"
+                              MemberName 18(gs_in_t) 1  "norm"
+                              Name 24  "@main(struct-ds_in_t-vf4-vf31[3];f1;vf3;struct-pcf_in_t-f1[3]-f11;"
+                              Name 20  "i"
+                              Name 21  "f"
+                              Name 22  "tesscoord"
+                              Name 23  "pcf_data"
+                              Name 27  "o"
+                              Name 52  "i"
+                              Name 54  "i"
+                              Name 56  "f"
+                              Name 58  "f"
+                              Name 60  "tesscoord"
+                              Name 62  "tesscoord"
+                              Name 64  "pcf_data"
+                              Name 68  "pcf_data.flTessFactor"
+                              Name 82  "pcf_data.flInsideTessFactor"
+                              Name 86  "flattenTemp"
+                              Name 88  "param"
+                              Name 90  "param"
+                              Name 92  "param"
+                              Name 96  "@entryPointOutput.pos"
+                              Name 100  "@entryPointOutput.norm"
+                              Decorate 54(i) Location 0
+                              Decorate 58(f) Patch
+                              Decorate 58(f) Location 2
+                              Decorate 62(tesscoord) Patch
+                              Decorate 62(tesscoord) BuiltIn TessCoord
+                              Decorate 68(pcf_data.flTessFactor) Patch
+                              Decorate 68(pcf_data.flTessFactor) BuiltIn TessLevelOuter
+                              Decorate 82(pcf_data.flInsideTessFactor) Patch
+                              Decorate 82(pcf_data.flInsideTessFactor) BuiltIn TessLevelInner
+                              Decorate 96(@entryPointOutput.pos) Location 0
+                              Decorate 100(@entryPointOutput.norm) Location 1
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -299,96 +346,112 @@
               10:             TypeInt 32 0
               11:     10(int) Constant 3
               12:             TypeArray 9(ds_in_t) 11
-              13:             TypePointer Function 8(fvec3)
-              14:             TypeArray 6(float) 11
-    15(pcf_in_t):             TypeStruct 14 6(float)
-              16:             TypePointer Function 15(pcf_in_t)
-     17(gs_in_t):             TypeStruct 7(fvec4) 8(fvec3)
-              18:             TypeFunction 17(gs_in_t) 12 13(ptr) 16(ptr)
-              24:             TypePointer Function 17(gs_in_t)
-              26:             TypeInt 32 1
-              27:     26(int) Constant 0
-              29:     10(int) Constant 0
-              30:             TypePointer Function 6(float)
-              35:             TypePointer Function 7(fvec4)
-              37:     26(int) Constant 1
-              39:     10(int) Constant 1
-              48:             TypePointer Function 12
-              50:             TypePointer Input 12
-           51(i):     50(ptr) Variable Input
-              54:             TypePointer Input 8(fvec3)
-   55(tesscoord):     54(ptr) Variable Input
-              58:     10(int) Constant 4
-              59:             TypeArray 6(float) 58
-              60:             TypePointer Input 59
-61(pcf_data_flTessFactor):     60(ptr) Variable Input
-              62:             TypePointer Input 6(float)
-              69:     26(int) Constant 2
-              73:     10(int) Constant 2
-              74:             TypeArray 6(float) 73
-              75:             TypePointer Input 74
-76(pcf_data_flInsideTessFactor):     75(ptr) Variable Input
-              80:             TypePointer Output 17(gs_in_t)
-81(@entryPointOutput):     80(ptr) Variable Output
-    88(pcf_in_t):             TypeStruct
-              89:             TypePointer Input 88(pcf_in_t)
-    90(pcf_data):     89(ptr) Variable Input
+              13:             TypePointer Function 6(float)
+              14:             TypePointer Function 8(fvec3)
+              15:             TypeArray 6(float) 11
+    16(pcf_in_t):             TypeStruct 15 6(float)
+              17:             TypePointer Function 16(pcf_in_t)
+     18(gs_in_t):             TypeStruct 7(fvec4) 8(fvec3)
+              19:             TypeFunction 18(gs_in_t) 12 13(ptr) 14(ptr) 17(ptr)
+              26:             TypePointer Function 18(gs_in_t)
+              28:             TypeInt 32 1
+              29:     28(int) Constant 0
+              31:     10(int) Constant 0
+              38:             TypePointer Function 7(fvec4)
+              40:     28(int) Constant 1
+              42:     10(int) Constant 1
+              51:             TypePointer Function 12
+              53:             TypePointer Input 12
+           54(i):     53(ptr) Variable Input
+              57:             TypePointer Input 6(float)
+           58(f):     57(ptr) Variable Input
+              61:             TypePointer Input 8(fvec3)
+   62(tesscoord):     61(ptr) Variable Input
+              65:     10(int) Constant 4
+              66:             TypeArray 6(float) 65
+              67:             TypePointer Input 66
+68(pcf_data.flTessFactor):     67(ptr) Variable Input
+              75:     28(int) Constant 2
+              79:     10(int) Constant 2
+              80:             TypeArray 6(float) 79
+              81:             TypePointer Input 80
+82(pcf_data.flInsideTessFactor):     81(ptr) Variable Input
+              95:             TypePointer Output 7(fvec4)
+96(@entryPointOutput.pos):     95(ptr) Variable Output
+              99:             TypePointer Output 8(fvec3)
+100(@entryPointOutput.norm):     99(ptr) Variable Output
          4(main):           2 Function None 3
                5:             Label
-           49(i):     48(ptr) Variable Function
-   53(tesscoord):     13(ptr) Variable Function
-    57(pcf_data):     16(ptr) Variable Function
-       83(param):     13(ptr) Variable Function
-       85(param):     16(ptr) Variable Function
-              52:          12 Load 51(i)
-                              Store 49(i) 52
-              56:    8(fvec3) Load 55(tesscoord)
-                              Store 53(tesscoord) 56
-              63:     62(ptr) AccessChain 61(pcf_data_flTessFactor) 27
-              64:    6(float) Load 63
-              65:     30(ptr) AccessChain 57(pcf_data) 27 27
-                              Store 65 64
-              66:     62(ptr) AccessChain 61(pcf_data_flTessFactor) 37
-              67:    6(float) Load 66
-              68:     30(ptr) AccessChain 57(pcf_data) 27 37
-                              Store 68 67
-              70:     62(ptr) AccessChain 61(pcf_data_flTessFactor) 69
-              71:    6(float) Load 70
-              72:     30(ptr) AccessChain 57(pcf_data) 27 69
-                              Store 72 71
-              77:     62(ptr) AccessChain 76(pcf_data_flInsideTessFactor) 27
-              78:    6(float) Load 77
-              79:     30(ptr) AccessChain 57(pcf_data) 37
-                              Store 79 78
-              82:          12 Load 49(i)
-              84:    8(fvec3) Load 53(tesscoord)
-                              Store 83(param) 84
-              86:15(pcf_in_t) Load 57(pcf_data)
-                              Store 85(param) 86
-              87: 17(gs_in_t) FunctionCall 22(@main(struct-ds_in_t-vf4-vf31[3];vf3;struct-pcf_in_t-f1[3]-f11;) 82 83(param) 85(param)
-                              Store 81(@entryPointOutput) 87
+           52(i):     51(ptr) Variable Function
+           56(f):     13(ptr) Variable Function
+   60(tesscoord):     14(ptr) Variable Function
+    64(pcf_data):     17(ptr) Variable Function
+ 86(flattenTemp):     26(ptr) Variable Function
+       88(param):     13(ptr) Variable Function
+       90(param):     14(ptr) Variable Function
+       92(param):     17(ptr) Variable Function
+              55:          12 Load 54(i)
+                              Store 52(i) 55
+              59:    6(float) Load 58(f)
+                              Store 56(f) 59
+              63:    8(fvec3) Load 62(tesscoord)
+                              Store 60(tesscoord) 63
+              69:     57(ptr) AccessChain 68(pcf_data.flTessFactor) 29
+              70:    6(float) Load 69
+              71:     13(ptr) AccessChain 64(pcf_data) 29 29
+                              Store 71 70
+              72:     57(ptr) AccessChain 68(pcf_data.flTessFactor) 40
+              73:    6(float) Load 72
+              74:     13(ptr) AccessChain 64(pcf_data) 29 40
+                              Store 74 73
+              76:     57(ptr) AccessChain 68(pcf_data.flTessFactor) 75
+              77:    6(float) Load 76
+              78:     13(ptr) AccessChain 64(pcf_data) 29 75
+                              Store 78 77
+              83:     57(ptr) AccessChain 82(pcf_data.flInsideTessFactor) 29
+              84:    6(float) Load 83
+              85:     13(ptr) AccessChain 64(pcf_data) 40
+                              Store 85 84
+              87:          12 Load 52(i)
+              89:    6(float) Load 56(f)
+                              Store 88(param) 89
+              91:    8(fvec3) Load 60(tesscoord)
+                              Store 90(param) 91
+              93:16(pcf_in_t) Load 64(pcf_data)
+                              Store 92(param) 93
+              94: 18(gs_in_t) FunctionCall 24(@main(struct-ds_in_t-vf4-vf31[3];f1;vf3;struct-pcf_in_t-f1[3]-f11;) 87 88(param) 90(param) 92(param)
+                              Store 86(flattenTemp) 94
+              97:     38(ptr) AccessChain 86(flattenTemp) 29
+              98:    7(fvec4) Load 97
+                              Store 96(@entryPointOutput.pos) 98
+             101:     14(ptr) AccessChain 86(flattenTemp) 40
+             102:    8(fvec3) Load 101
+                              Store 100(@entryPointOutput.norm) 102
                               Return
                               FunctionEnd
-22(@main(struct-ds_in_t-vf4-vf31[3];vf3;struct-pcf_in_t-f1[3]-f11;): 17(gs_in_t) Function None 18
-           19(i):          12 FunctionParameter
-   20(tesscoord):     13(ptr) FunctionParameter
-    21(pcf_data):     16(ptr) FunctionParameter
-              23:             Label
-           25(o):     24(ptr) Variable Function
-              28:    7(fvec4) CompositeExtract 19(i) 0 0
-              31:     30(ptr) AccessChain 20(tesscoord) 29
-              32:    6(float) Load 31
-              33:    7(fvec4) CompositeConstruct 32 32 32 32
-              34:    7(fvec4) FAdd 28 33
-              36:     35(ptr) AccessChain 25(o) 27
-                              Store 36 34
-              38:    8(fvec3) CompositeExtract 19(i) 0 1
-              40:     30(ptr) AccessChain 20(tesscoord) 39
-              41:    6(float) Load 40
-              42:    8(fvec3) CompositeConstruct 41 41 41
-              43:    8(fvec3) FAdd 38 42
-              44:     13(ptr) AccessChain 25(o) 37
-                              Store 44 43
-              45: 17(gs_in_t) Load 25(o)
-                              ReturnValue 45
+24(@main(struct-ds_in_t-vf4-vf31[3];f1;vf3;struct-pcf_in_t-f1[3]-f11;): 18(gs_in_t) Function None 19
+           20(i):          12 FunctionParameter
+           21(f):     13(ptr) FunctionParameter
+   22(tesscoord):     14(ptr) FunctionParameter
+    23(pcf_data):     17(ptr) FunctionParameter
+              25:             Label
+           27(o):     26(ptr) Variable Function
+              30:    7(fvec4) CompositeExtract 20(i) 0 0
+              32:     13(ptr) AccessChain 22(tesscoord) 31
+              33:    6(float) Load 32
+              34:    6(float) Load 21(f)
+              35:    6(float) FMul 33 34
+              36:    7(fvec4) CompositeConstruct 35 35 35 35
+              37:    7(fvec4) FAdd 30 36
+              39:     38(ptr) AccessChain 27(o) 29
+                              Store 39 37
+              41:    8(fvec3) CompositeExtract 20(i) 0 1
+              43:     13(ptr) AccessChain 22(tesscoord) 42
+              44:    6(float) Load 43
+              45:    8(fvec3) CompositeConstruct 44 44 44
+              46:    8(fvec3) FAdd 41 45
+              47:     14(ptr) AccessChain 27(o) 40
+                              Store 47 46
+              48: 18(gs_in_t) Load 27(o)
+                              ReturnValue 48
                               FunctionEnd
diff --git a/Test/baseResults/hlsl.domain.2.tese.out b/Test/baseResults/hlsl.domain.2.tese.out
index 2336dfa..827f80f 100644
--- a/Test/baseResults/hlsl.domain.2.tese.out
+++ b/Test/baseResults/hlsl.domain.2.tese.out
@@ -63,7 +63,7 @@
 0:25            Constant:
 0:25              0 (const int)
 0:25          direct index ( patch in float TessLevelOuter)
-0:?             'pcf_data_flTessFactor' ( patch in 4-element array of float TessLevelOuter)
+0:?             'pcf_data.flTessFactor' ( patch in 4-element array of float TessLevelOuter)
 0:25            Constant:
 0:25              0 (const int)
 0:25        move second child to first child ( temp float)
@@ -75,7 +75,7 @@
 0:25            Constant:
 0:25              1 (const int)
 0:25          direct index ( patch in float TessLevelOuter)
-0:?             'pcf_data_flTessFactor' ( patch in 4-element array of float TessLevelOuter)
+0:?             'pcf_data.flTessFactor' ( patch in 4-element array of float TessLevelOuter)
 0:25            Constant:
 0:25              1 (const int)
 0:25        move second child to first child ( temp float)
@@ -87,7 +87,7 @@
 0:25            Constant:
 0:25              2 (const int)
 0:25          direct index ( patch in float TessLevelOuter)
-0:?             'pcf_data_flTessFactor' ( patch in 4-element array of float TessLevelOuter)
+0:?             'pcf_data.flTessFactor' ( patch in 4-element array of float TessLevelOuter)
 0:25            Constant:
 0:25              2 (const int)
 0:25        move second child to first child ( temp float)
@@ -96,7 +96,7 @@
 0:25            Constant:
 0:25              1 (const int)
 0:25          direct index ( patch in float TessLevelInner)
-0:?             'pcf_data_flInsideTessFactor' ( patch in 2-element array of float TessLevelInner)
+0:?             'pcf_data.flInsideTessFactor' ( patch in 2-element array of float TessLevelInner)
 0:25            Constant:
 0:25              0 (const int)
 0:25        move second child to first child ( temp float)
@@ -104,29 +104,40 @@
 0:?             'pcf_data' ( temp structure{ temp 3-element array of float flTessFactor,  temp float flInsideTessFactor,  temp float foo})
 0:25            Constant:
 0:25              2 (const int)
-0:25          foo: direct index for structure ( temp float)
-0:25            'pcf_data' (layout( location=2) patch in structure{ temp float foo})
-0:25            Constant:
-0:25              0 (const int)
+0:?           'pcf_data.foo' (layout( location=2) patch in float)
 0:25      move second child to first child ( temp 3-element array of structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
 0:?         'i' ( temp 3-element array of structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
 0:?         'i' (layout( location=0) in 3-element array of structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
 0:25      move second child to first child ( temp 3-component vector of float)
 0:?         'tesscoord' ( temp 3-component vector of float)
 0:?         'tesscoord' ( patch in 3-component vector of float TessCoord)
-0:25      move second child to first child ( temp structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
-0:?         '@entryPointOutput' (layout( location=0) out structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
-0:25        Function Call: @main(struct-pcf_in_t-f1[3]-f1-f11;struct-ds_in_t-vf4-vf31[3];vf3; ( temp structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
-0:?           'pcf_data' ( temp structure{ temp 3-element array of float flTessFactor,  temp float flInsideTessFactor,  temp float foo})
-0:?           'i' ( temp 3-element array of structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
-0:?           'tesscoord' ( temp 3-component vector of float)
+0:25      Sequence
+0:25        move second child to first child ( temp structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
+0:25          'flattenTemp' ( temp structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
+0:25          Function Call: @main(struct-pcf_in_t-f1[3]-f1-f11;struct-ds_in_t-vf4-vf31[3];vf3; ( temp structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
+0:?             'pcf_data' ( temp structure{ temp 3-element array of float flTessFactor,  temp float flInsideTessFactor,  temp float foo})
+0:?             'i' ( temp 3-element array of structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
+0:?             'tesscoord' ( temp 3-component vector of float)
+0:25        move second child to first child ( temp 4-component vector of float)
+0:?           '@entryPointOutput.pos' (layout( location=0) out 4-component vector of float)
+0:25          pos: direct index for structure ( temp 4-component vector of float)
+0:25            'flattenTemp' ( temp structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
+0:25            Constant:
+0:25              0 (const int)
+0:25        move second child to first child ( temp 3-component vector of float)
+0:?           '@entryPointOutput.norm' (layout( location=1) out 3-component vector of float)
+0:25          norm: direct index for structure ( temp 3-component vector of float)
+0:25            'flattenTemp' ( temp structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
+0:25            Constant:
+0:25              1 (const int)
 0:?   Linker Objects
-0:?     '@entryPointOutput' (layout( location=0) out structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
+0:?     '@entryPointOutput.pos' (layout( location=0) out 4-component vector of float)
+0:?     '@entryPointOutput.norm' (layout( location=1) out 3-component vector of float)
 0:?     'i' (layout( location=0) in 3-element array of structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
 0:?     'tesscoord' ( patch in 3-component vector of float TessCoord)
-0:?     'pcf_data' (layout( location=2) patch in structure{ temp float foo})
-0:?     'pcf_data_flTessFactor' ( patch in 4-element array of float TessLevelOuter)
-0:?     'pcf_data_flInsideTessFactor' ( patch in 2-element array of float TessLevelInner)
+0:?     'pcf_data.flTessFactor' ( patch in 4-element array of float TessLevelOuter)
+0:?     'pcf_data.flInsideTessFactor' ( patch in 2-element array of float TessLevelInner)
+0:?     'pcf_data.foo' (layout( location=2) patch in float)
 
 
 Linked tessellation evaluation stage:
@@ -196,7 +207,7 @@
 0:25            Constant:
 0:25              0 (const int)
 0:25          direct index ( patch in float TessLevelOuter)
-0:?             'pcf_data_flTessFactor' ( patch in 4-element array of float TessLevelOuter)
+0:?             'pcf_data.flTessFactor' ( patch in 4-element array of float TessLevelOuter)
 0:25            Constant:
 0:25              0 (const int)
 0:25        move second child to first child ( temp float)
@@ -208,7 +219,7 @@
 0:25            Constant:
 0:25              1 (const int)
 0:25          direct index ( patch in float TessLevelOuter)
-0:?             'pcf_data_flTessFactor' ( patch in 4-element array of float TessLevelOuter)
+0:?             'pcf_data.flTessFactor' ( patch in 4-element array of float TessLevelOuter)
 0:25            Constant:
 0:25              1 (const int)
 0:25        move second child to first child ( temp float)
@@ -220,7 +231,7 @@
 0:25            Constant:
 0:25              2 (const int)
 0:25          direct index ( patch in float TessLevelOuter)
-0:?             'pcf_data_flTessFactor' ( patch in 4-element array of float TessLevelOuter)
+0:?             'pcf_data.flTessFactor' ( patch in 4-element array of float TessLevelOuter)
 0:25            Constant:
 0:25              2 (const int)
 0:25        move second child to first child ( temp float)
@@ -229,7 +240,7 @@
 0:25            Constant:
 0:25              1 (const int)
 0:25          direct index ( patch in float TessLevelInner)
-0:?             'pcf_data_flInsideTessFactor' ( patch in 2-element array of float TessLevelInner)
+0:?             'pcf_data.flInsideTessFactor' ( patch in 2-element array of float TessLevelInner)
 0:25            Constant:
 0:25              0 (const int)
 0:25        move second child to first child ( temp float)
@@ -237,38 +248,49 @@
 0:?             'pcf_data' ( temp structure{ temp 3-element array of float flTessFactor,  temp float flInsideTessFactor,  temp float foo})
 0:25            Constant:
 0:25              2 (const int)
-0:25          foo: direct index for structure ( temp float)
-0:25            'pcf_data' (layout( location=2) patch in structure{ temp float foo})
-0:25            Constant:
-0:25              0 (const int)
+0:?           'pcf_data.foo' (layout( location=2) patch in float)
 0:25      move second child to first child ( temp 3-element array of structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
 0:?         'i' ( temp 3-element array of structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
 0:?         'i' (layout( location=0) in 3-element array of structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
 0:25      move second child to first child ( temp 3-component vector of float)
 0:?         'tesscoord' ( temp 3-component vector of float)
 0:?         'tesscoord' ( patch in 3-component vector of float TessCoord)
-0:25      move second child to first child ( temp structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
-0:?         '@entryPointOutput' (layout( location=0) out structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
-0:25        Function Call: @main(struct-pcf_in_t-f1[3]-f1-f11;struct-ds_in_t-vf4-vf31[3];vf3; ( temp structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
-0:?           'pcf_data' ( temp structure{ temp 3-element array of float flTessFactor,  temp float flInsideTessFactor,  temp float foo})
-0:?           'i' ( temp 3-element array of structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
-0:?           'tesscoord' ( temp 3-component vector of float)
+0:25      Sequence
+0:25        move second child to first child ( temp structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
+0:25          'flattenTemp' ( temp structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
+0:25          Function Call: @main(struct-pcf_in_t-f1[3]-f1-f11;struct-ds_in_t-vf4-vf31[3];vf3; ( temp structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
+0:?             'pcf_data' ( temp structure{ temp 3-element array of float flTessFactor,  temp float flInsideTessFactor,  temp float foo})
+0:?             'i' ( temp 3-element array of structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
+0:?             'tesscoord' ( temp 3-component vector of float)
+0:25        move second child to first child ( temp 4-component vector of float)
+0:?           '@entryPointOutput.pos' (layout( location=0) out 4-component vector of float)
+0:25          pos: direct index for structure ( temp 4-component vector of float)
+0:25            'flattenTemp' ( temp structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
+0:25            Constant:
+0:25              0 (const int)
+0:25        move second child to first child ( temp 3-component vector of float)
+0:?           '@entryPointOutput.norm' (layout( location=1) out 3-component vector of float)
+0:25          norm: direct index for structure ( temp 3-component vector of float)
+0:25            'flattenTemp' ( temp structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
+0:25            Constant:
+0:25              1 (const int)
 0:?   Linker Objects
-0:?     '@entryPointOutput' (layout( location=0) out structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
+0:?     '@entryPointOutput.pos' (layout( location=0) out 4-component vector of float)
+0:?     '@entryPointOutput.norm' (layout( location=1) out 3-component vector of float)
 0:?     'i' (layout( location=0) in 3-element array of structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
 0:?     'tesscoord' ( patch in 3-component vector of float TessCoord)
-0:?     'pcf_data' (layout( location=2) patch in structure{ temp float foo})
-0:?     'pcf_data_flTessFactor' ( patch in 4-element array of float TessLevelOuter)
-0:?     'pcf_data_flInsideTessFactor' ( patch in 2-element array of float TessLevelInner)
+0:?     'pcf_data.flTessFactor' ( patch in 4-element array of float TessLevelOuter)
+0:?     'pcf_data.flInsideTessFactor' ( patch in 2-element array of float TessLevelInner)
+0:?     'pcf_data.foo' (layout( location=2) patch in float)
 
 // Module Version 10000
-// Generated by (magic number): 80001
-// Id's are bound by 94
+// Generated by (magic number): 80007
+// Id's are bound by 98
 
                               Capability Tessellation
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint TessellationEvaluation 4  "main" 52 67 73 80 84 87
+                              EntryPoint TessellationEvaluation 4  "main" 52 67 71 77 81 91 95
                               ExecutionMode 4 Triangles
                               Source HLSL 500
                               Name 4  "main"
@@ -288,29 +310,29 @@
                               Name 21  "tesscoord"
                               Name 25  "o"
                               Name 48  "pcf_data"
-                              Name 52  "pcf_data_flTessFactor"
-                              Name 67  "pcf_data_flInsideTessFactor"
-                              Name 71  "pcf_in_t"
-                              MemberName 71(pcf_in_t) 0  "foo"
-                              Name 73  "pcf_data"
-                              Name 78  "i"
-                              Name 80  "i"
-                              Name 82  "tesscoord"
-                              Name 84  "tesscoord"
-                              Name 87  "@entryPointOutput"
-                              Name 89  "param"
-                              Name 91  "param"
-                              Decorate 52(pcf_data_flTessFactor) Patch
-                              Decorate 52(pcf_data_flTessFactor) BuiltIn TessLevelOuter
-                              Decorate 67(pcf_data_flInsideTessFactor) Patch
-                              Decorate 67(pcf_data_flInsideTessFactor) BuiltIn TessLevelInner
-                              MemberDecorate 71(pcf_in_t) 0 Patch
-                              Decorate 73(pcf_data) Patch
-                              Decorate 73(pcf_data) Location 2
-                              Decorate 80(i) Location 0
-                              Decorate 84(tesscoord) Patch
-                              Decorate 84(tesscoord) BuiltIn TessCoord
-                              Decorate 87(@entryPointOutput) Location 0
+                              Name 52  "pcf_data.flTessFactor"
+                              Name 67  "pcf_data.flInsideTessFactor"
+                              Name 71  "pcf_data.foo"
+                              Name 75  "i"
+                              Name 77  "i"
+                              Name 79  "tesscoord"
+                              Name 81  "tesscoord"
+                              Name 83  "flattenTemp"
+                              Name 85  "param"
+                              Name 87  "param"
+                              Name 91  "@entryPointOutput.pos"
+                              Name 95  "@entryPointOutput.norm"
+                              Decorate 52(pcf_data.flTessFactor) Patch
+                              Decorate 52(pcf_data.flTessFactor) BuiltIn TessLevelOuter
+                              Decorate 67(pcf_data.flInsideTessFactor) Patch
+                              Decorate 67(pcf_data.flInsideTessFactor) BuiltIn TessLevelInner
+                              Decorate 71(pcf_data.foo) Patch
+                              Decorate 71(pcf_data.foo) Location 2
+                              Decorate 77(i) Location 0
+                              Decorate 81(tesscoord) Patch
+                              Decorate 81(tesscoord) BuiltIn TessCoord
+                              Decorate 91(@entryPointOutput.pos) Location 0
+                              Decorate 95(@entryPointOutput.norm) Location 1
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -337,61 +359,67 @@
               49:      7(int) Constant 4
               50:             TypeArray 6(float) 49
               51:             TypePointer Input 50
-52(pcf_data_flTessFactor):     51(ptr) Variable Input
+52(pcf_data.flTessFactor):     51(ptr) Variable Input
               53:             TypePointer Input 6(float)
               60:     26(int) Constant 2
               64:      7(int) Constant 2
               65:             TypeArray 6(float) 64
               66:             TypePointer Input 65
-67(pcf_data_flInsideTessFactor):     66(ptr) Variable Input
-    71(pcf_in_t):             TypeStruct 6(float)
-              72:             TypePointer Input 71(pcf_in_t)
-    73(pcf_data):     72(ptr) Variable Input
-              77:             TypePointer Function 15
-              79:             TypePointer Input 15
-           80(i):     79(ptr) Variable Input
-              83:             TypePointer Input 13(fvec3)
-   84(tesscoord):     83(ptr) Variable Input
-              86:             TypePointer Output 17(gs_in_t)
-87(@entryPointOutput):     86(ptr) Variable Output
+67(pcf_data.flInsideTessFactor):     66(ptr) Variable Input
+71(pcf_data.foo):     53(ptr) Variable Input
+              74:             TypePointer Function 15
+              76:             TypePointer Input 15
+           77(i):     76(ptr) Variable Input
+              80:             TypePointer Input 13(fvec3)
+   81(tesscoord):     80(ptr) Variable Input
+              90:             TypePointer Output 12(fvec4)
+91(@entryPointOutput.pos):     90(ptr) Variable Output
+              94:             TypePointer Output 13(fvec3)
+95(@entryPointOutput.norm):     94(ptr) Variable Output
          4(main):           2 Function None 3
                5:             Label
     48(pcf_data):     11(ptr) Variable Function
-           78(i):     77(ptr) Variable Function
-   82(tesscoord):     16(ptr) Variable Function
-       89(param):     11(ptr) Variable Function
-       91(param):     16(ptr) Variable Function
-              54:     53(ptr) AccessChain 52(pcf_data_flTessFactor) 27
+           75(i):     74(ptr) Variable Function
+   79(tesscoord):     16(ptr) Variable Function
+ 83(flattenTemp):     24(ptr) Variable Function
+       85(param):     11(ptr) Variable Function
+       87(param):     16(ptr) Variable Function
+              54:     53(ptr) AccessChain 52(pcf_data.flTessFactor) 27
               55:    6(float) Load 54
               56:     30(ptr) AccessChain 48(pcf_data) 27 27
                               Store 56 55
-              57:     53(ptr) AccessChain 52(pcf_data_flTessFactor) 37
+              57:     53(ptr) AccessChain 52(pcf_data.flTessFactor) 37
               58:    6(float) Load 57
               59:     30(ptr) AccessChain 48(pcf_data) 27 37
                               Store 59 58
-              61:     53(ptr) AccessChain 52(pcf_data_flTessFactor) 60
+              61:     53(ptr) AccessChain 52(pcf_data.flTessFactor) 60
               62:    6(float) Load 61
               63:     30(ptr) AccessChain 48(pcf_data) 27 60
                               Store 63 62
-              68:     53(ptr) AccessChain 67(pcf_data_flInsideTessFactor) 27
+              68:     53(ptr) AccessChain 67(pcf_data.flInsideTessFactor) 27
               69:    6(float) Load 68
               70:     30(ptr) AccessChain 48(pcf_data) 37
                               Store 70 69
-              74:     53(ptr) AccessChain 73(pcf_data) 27
-              75:    6(float) Load 74
-              76:     30(ptr) AccessChain 48(pcf_data) 60
-                              Store 76 75
-              81:          15 Load 80(i)
-                              Store 78(i) 81
-              85:   13(fvec3) Load 84(tesscoord)
-                              Store 82(tesscoord) 85
-              88:          15 Load 78(i)
-              90:10(pcf_in_t) Load 48(pcf_data)
-                              Store 89(param) 90
-              92:   13(fvec3) Load 82(tesscoord)
-                              Store 91(param) 92
-              93: 17(gs_in_t) FunctionCall 22(@main(struct-pcf_in_t-f1[3]-f1-f11;struct-ds_in_t-vf4-vf31[3];vf3;) 89(param) 88 91(param)
-                              Store 87(@entryPointOutput) 93
+              72:    6(float) Load 71(pcf_data.foo)
+              73:     30(ptr) AccessChain 48(pcf_data) 60
+                              Store 73 72
+              78:          15 Load 77(i)
+                              Store 75(i) 78
+              82:   13(fvec3) Load 81(tesscoord)
+                              Store 79(tesscoord) 82
+              84:          15 Load 75(i)
+              86:10(pcf_in_t) Load 48(pcf_data)
+                              Store 85(param) 86
+              88:   13(fvec3) Load 79(tesscoord)
+                              Store 87(param) 88
+              89: 17(gs_in_t) FunctionCall 22(@main(struct-pcf_in_t-f1[3]-f1-f11;struct-ds_in_t-vf4-vf31[3];vf3;) 85(param) 84 87(param)
+                              Store 83(flattenTemp) 89
+              92:     35(ptr) AccessChain 83(flattenTemp) 27
+              93:   12(fvec4) Load 92
+                              Store 91(@entryPointOutput.pos) 93
+              96:     16(ptr) AccessChain 83(flattenTemp) 37
+              97:   13(fvec3) Load 96
+                              Store 95(@entryPointOutput.norm) 97
                               Return
                               FunctionEnd
 22(@main(struct-pcf_in_t-f1[3]-f1-f11;struct-ds_in_t-vf4-vf31[3];vf3;): 17(gs_in_t) Function None 18
diff --git a/Test/baseResults/hlsl.domain.3.tese.out b/Test/baseResults/hlsl.domain.3.tese.out
index d473b96..dd3d502 100644
--- a/Test/baseResults/hlsl.domain.3.tese.out
+++ b/Test/baseResults/hlsl.domain.3.tese.out
@@ -66,7 +66,7 @@
 0:24            Constant:
 0:24              0 (const int)
 0:24          direct index ( patch in float TessLevelOuter)
-0:?             'pcf_data_flTessFactor' ( patch in 4-element array of float TessLevelOuter)
+0:?             'pcf_data.flTessFactor' ( patch in 4-element array of float TessLevelOuter)
 0:24            Constant:
 0:24              0 (const int)
 0:24        move second child to first child ( temp float)
@@ -78,7 +78,7 @@
 0:24            Constant:
 0:24              1 (const int)
 0:24          direct index ( patch in float TessLevelOuter)
-0:?             'pcf_data_flTessFactor' ( patch in 4-element array of float TessLevelOuter)
+0:?             'pcf_data.flTessFactor' ( patch in 4-element array of float TessLevelOuter)
 0:24            Constant:
 0:24              1 (const int)
 0:24        move second child to first child ( temp float)
@@ -90,7 +90,7 @@
 0:24            Constant:
 0:24              2 (const int)
 0:24          direct index ( patch in float TessLevelOuter)
-0:?             'pcf_data_flTessFactor' ( patch in 4-element array of float TessLevelOuter)
+0:?             'pcf_data.flTessFactor' ( patch in 4-element array of float TessLevelOuter)
 0:24            Constant:
 0:24              2 (const int)
 0:24        move second child to first child ( temp float)
@@ -99,22 +99,35 @@
 0:24            Constant:
 0:24              1 (const int)
 0:24          direct index ( patch in float TessLevelInner)
-0:?             'pcf_data_flInsideTessFactor' ( patch in 2-element array of float TessLevelInner)
+0:?             'pcf_data.flInsideTessFactor' ( patch in 2-element array of float TessLevelInner)
 0:24            Constant:
 0:24              0 (const int)
-0:24      move second child to first child ( temp structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
-0:?         '@entryPointOutput' (layout( location=0) out structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
-0:24        Function Call: @main(struct-ds_in_t-vf4-vf31[2];vf2;struct-pcf_in_t-f1[3]-f11; ( temp structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
-0:?           'i' ( temp 2-element array of structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
-0:?           'tesscoord' ( temp 2-component vector of float)
-0:?           'pcf_data' ( temp structure{ temp 3-element array of float flTessFactor,  temp float flInsideTessFactor})
+0:24      Sequence
+0:24        move second child to first child ( temp structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
+0:24          'flattenTemp' ( temp structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
+0:24          Function Call: @main(struct-ds_in_t-vf4-vf31[2];vf2;struct-pcf_in_t-f1[3]-f11; ( temp structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
+0:?             'i' ( temp 2-element array of structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
+0:?             'tesscoord' ( temp 2-component vector of float)
+0:?             'pcf_data' ( temp structure{ temp 3-element array of float flTessFactor,  temp float flInsideTessFactor})
+0:24        move second child to first child ( temp 4-component vector of float)
+0:?           '@entryPointOutput.pos' (layout( location=0) out 4-component vector of float)
+0:24          pos: direct index for structure ( temp 4-component vector of float)
+0:24            'flattenTemp' ( temp structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
+0:24            Constant:
+0:24              0 (const int)
+0:24        move second child to first child ( temp 3-component vector of float)
+0:?           '@entryPointOutput.norm' (layout( location=1) out 3-component vector of float)
+0:24          norm: direct index for structure ( temp 3-component vector of float)
+0:24            'flattenTemp' ( temp structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
+0:24            Constant:
+0:24              1 (const int)
 0:?   Linker Objects
-0:?     '@entryPointOutput' (layout( location=0) out structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
+0:?     '@entryPointOutput.pos' (layout( location=0) out 4-component vector of float)
+0:?     '@entryPointOutput.norm' (layout( location=1) out 3-component vector of float)
 0:?     'i' (layout( location=0) in 2-element array of structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
 0:?     'tesscoord' ( patch in 3-component vector of float TessCoord)
-0:?     'pcf_data' (layout( location=2) patch in structure{})
-0:?     'pcf_data_flTessFactor' ( patch in 4-element array of float TessLevelOuter)
-0:?     'pcf_data_flInsideTessFactor' ( patch in 2-element array of float TessLevelInner)
+0:?     'pcf_data.flTessFactor' ( patch in 4-element array of float TessLevelOuter)
+0:?     'pcf_data.flInsideTessFactor' ( patch in 2-element array of float TessLevelInner)
 
 
 Linked tessellation evaluation stage:
@@ -187,7 +200,7 @@
 0:24            Constant:
 0:24              0 (const int)
 0:24          direct index ( patch in float TessLevelOuter)
-0:?             'pcf_data_flTessFactor' ( patch in 4-element array of float TessLevelOuter)
+0:?             'pcf_data.flTessFactor' ( patch in 4-element array of float TessLevelOuter)
 0:24            Constant:
 0:24              0 (const int)
 0:24        move second child to first child ( temp float)
@@ -199,7 +212,7 @@
 0:24            Constant:
 0:24              1 (const int)
 0:24          direct index ( patch in float TessLevelOuter)
-0:?             'pcf_data_flTessFactor' ( patch in 4-element array of float TessLevelOuter)
+0:?             'pcf_data.flTessFactor' ( patch in 4-element array of float TessLevelOuter)
 0:24            Constant:
 0:24              1 (const int)
 0:24        move second child to first child ( temp float)
@@ -211,7 +224,7 @@
 0:24            Constant:
 0:24              2 (const int)
 0:24          direct index ( patch in float TessLevelOuter)
-0:?             'pcf_data_flTessFactor' ( patch in 4-element array of float TessLevelOuter)
+0:?             'pcf_data.flTessFactor' ( patch in 4-element array of float TessLevelOuter)
 0:24            Constant:
 0:24              2 (const int)
 0:24        move second child to first child ( temp float)
@@ -220,31 +233,44 @@
 0:24            Constant:
 0:24              1 (const int)
 0:24          direct index ( patch in float TessLevelInner)
-0:?             'pcf_data_flInsideTessFactor' ( patch in 2-element array of float TessLevelInner)
+0:?             'pcf_data.flInsideTessFactor' ( patch in 2-element array of float TessLevelInner)
 0:24            Constant:
 0:24              0 (const int)
-0:24      move second child to first child ( temp structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
-0:?         '@entryPointOutput' (layout( location=0) out structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
-0:24        Function Call: @main(struct-ds_in_t-vf4-vf31[2];vf2;struct-pcf_in_t-f1[3]-f11; ( temp structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
-0:?           'i' ( temp 2-element array of structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
-0:?           'tesscoord' ( temp 2-component vector of float)
-0:?           'pcf_data' ( temp structure{ temp 3-element array of float flTessFactor,  temp float flInsideTessFactor})
+0:24      Sequence
+0:24        move second child to first child ( temp structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
+0:24          'flattenTemp' ( temp structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
+0:24          Function Call: @main(struct-ds_in_t-vf4-vf31[2];vf2;struct-pcf_in_t-f1[3]-f11; ( temp structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
+0:?             'i' ( temp 2-element array of structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
+0:?             'tesscoord' ( temp 2-component vector of float)
+0:?             'pcf_data' ( temp structure{ temp 3-element array of float flTessFactor,  temp float flInsideTessFactor})
+0:24        move second child to first child ( temp 4-component vector of float)
+0:?           '@entryPointOutput.pos' (layout( location=0) out 4-component vector of float)
+0:24          pos: direct index for structure ( temp 4-component vector of float)
+0:24            'flattenTemp' ( temp structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
+0:24            Constant:
+0:24              0 (const int)
+0:24        move second child to first child ( temp 3-component vector of float)
+0:?           '@entryPointOutput.norm' (layout( location=1) out 3-component vector of float)
+0:24          norm: direct index for structure ( temp 3-component vector of float)
+0:24            'flattenTemp' ( temp structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
+0:24            Constant:
+0:24              1 (const int)
 0:?   Linker Objects
-0:?     '@entryPointOutput' (layout( location=0) out structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
+0:?     '@entryPointOutput.pos' (layout( location=0) out 4-component vector of float)
+0:?     '@entryPointOutput.norm' (layout( location=1) out 3-component vector of float)
 0:?     'i' (layout( location=0) in 2-element array of structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
 0:?     'tesscoord' ( patch in 3-component vector of float TessCoord)
-0:?     'pcf_data' (layout( location=2) patch in structure{})
-0:?     'pcf_data_flTessFactor' ( patch in 4-element array of float TessLevelOuter)
-0:?     'pcf_data_flInsideTessFactor' ( patch in 2-element array of float TessLevelInner)
+0:?     'pcf_data.flTessFactor' ( patch in 4-element array of float TessLevelOuter)
+0:?     'pcf_data.flInsideTessFactor' ( patch in 2-element array of float TessLevelInner)
 
 // Module Version 10000
-// Generated by (magic number): 80001
-// Id's are bound by 96
+// Generated by (magic number): 80007
+// Id's are bound by 100
 
                               Capability Tessellation
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint TessellationEvaluation 4  "main" 54 58 67 81 86 95
+                              EntryPoint TessellationEvaluation 4  "main" 54 58 67 81 93 97
                               ExecutionMode 4 Isolines
                               Source HLSL 500
                               Name 4  "main"
@@ -267,23 +293,22 @@
                               Name 56  "tesscoord"
                               Name 58  "tesscoord"
                               Name 63  "pcf_data"
-                              Name 67  "pcf_data_flTessFactor"
-                              Name 81  "pcf_data_flInsideTessFactor"
-                              Name 86  "@entryPointOutput"
-                              Name 88  "param"
-                              Name 90  "param"
-                              Name 93  "pcf_in_t"
-                              Name 95  "pcf_data"
+                              Name 67  "pcf_data.flTessFactor"
+                              Name 81  "pcf_data.flInsideTessFactor"
+                              Name 85  "flattenTemp"
+                              Name 87  "param"
+                              Name 89  "param"
+                              Name 93  "@entryPointOutput.pos"
+                              Name 97  "@entryPointOutput.norm"
                               Decorate 54(i) Location 0
                               Decorate 58(tesscoord) Patch
                               Decorate 58(tesscoord) BuiltIn TessCoord
-                              Decorate 67(pcf_data_flTessFactor) Patch
-                              Decorate 67(pcf_data_flTessFactor) BuiltIn TessLevelOuter
-                              Decorate 81(pcf_data_flInsideTessFactor) Patch
-                              Decorate 81(pcf_data_flInsideTessFactor) BuiltIn TessLevelInner
-                              Decorate 86(@entryPointOutput) Location 0
-                              Decorate 95(pcf_data) Patch
-                              Decorate 95(pcf_data) Location 2
+                              Decorate 67(pcf_data.flTessFactor) Patch
+                              Decorate 67(pcf_data.flTessFactor) BuiltIn TessLevelOuter
+                              Decorate 81(pcf_data.flInsideTessFactor) Patch
+                              Decorate 81(pcf_data.flInsideTessFactor) BuiltIn TessLevelInner
+                              Decorate 93(@entryPointOutput.pos) Location 0
+                              Decorate 97(@entryPointOutput.norm) Location 1
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -318,24 +343,24 @@
               64:     10(int) Constant 4
               65:             TypeArray 6(float) 64
               66:             TypePointer Input 65
-67(pcf_data_flTessFactor):     66(ptr) Variable Input
+67(pcf_data.flTessFactor):     66(ptr) Variable Input
               68:             TypePointer Input 6(float)
               75:     28(int) Constant 2
               79:             TypeArray 6(float) 11
               80:             TypePointer Input 79
-81(pcf_data_flInsideTessFactor):     80(ptr) Variable Input
-              85:             TypePointer Output 19(gs_in_t)
-86(@entryPointOutput):     85(ptr) Variable Output
-    93(pcf_in_t):             TypeStruct
-              94:             TypePointer Input 93(pcf_in_t)
-    95(pcf_data):     94(ptr) Variable Input
+81(pcf_data.flInsideTessFactor):     80(ptr) Variable Input
+              92:             TypePointer Output 7(fvec4)
+93(@entryPointOutput.pos):     92(ptr) Variable Output
+              96:             TypePointer Output 8(fvec3)
+97(@entryPointOutput.norm):     96(ptr) Variable Output
          4(main):           2 Function None 3
                5:             Label
            52(i):     51(ptr) Variable Function
    56(tesscoord):     14(ptr) Variable Function
     63(pcf_data):     18(ptr) Variable Function
-       88(param):     14(ptr) Variable Function
-       90(param):     18(ptr) Variable Function
+ 85(flattenTemp):     26(ptr) Variable Function
+       87(param):     14(ptr) Variable Function
+       89(param):     18(ptr) Variable Function
               55:          12 Load 54(i)
                               Store 52(i) 55
               59:    8(fvec3) Load 58(tesscoord)
@@ -343,29 +368,35 @@
               61:    6(float) CompositeExtract 59 1
               62:   13(fvec2) CompositeConstruct 60 61
                               Store 56(tesscoord) 62
-              69:     68(ptr) AccessChain 67(pcf_data_flTessFactor) 29
+              69:     68(ptr) AccessChain 67(pcf_data.flTessFactor) 29
               70:    6(float) Load 69
               71:     32(ptr) AccessChain 63(pcf_data) 29 29
                               Store 71 70
-              72:     68(ptr) AccessChain 67(pcf_data_flTessFactor) 39
+              72:     68(ptr) AccessChain 67(pcf_data.flTessFactor) 39
               73:    6(float) Load 72
               74:     32(ptr) AccessChain 63(pcf_data) 29 39
                               Store 74 73
-              76:     68(ptr) AccessChain 67(pcf_data_flTessFactor) 75
+              76:     68(ptr) AccessChain 67(pcf_data.flTessFactor) 75
               77:    6(float) Load 76
               78:     32(ptr) AccessChain 63(pcf_data) 29 75
                               Store 78 77
-              82:     68(ptr) AccessChain 81(pcf_data_flInsideTessFactor) 29
+              82:     68(ptr) AccessChain 81(pcf_data.flInsideTessFactor) 29
               83:    6(float) Load 82
               84:     32(ptr) AccessChain 63(pcf_data) 39
                               Store 84 83
-              87:          12 Load 52(i)
-              89:   13(fvec2) Load 56(tesscoord)
-                              Store 88(param) 89
-              91:17(pcf_in_t) Load 63(pcf_data)
-                              Store 90(param) 91
-              92: 19(gs_in_t) FunctionCall 24(@main(struct-ds_in_t-vf4-vf31[2];vf2;struct-pcf_in_t-f1[3]-f11;) 87 88(param) 90(param)
-                              Store 86(@entryPointOutput) 92
+              86:          12 Load 52(i)
+              88:   13(fvec2) Load 56(tesscoord)
+                              Store 87(param) 88
+              90:17(pcf_in_t) Load 63(pcf_data)
+                              Store 89(param) 90
+              91: 19(gs_in_t) FunctionCall 24(@main(struct-ds_in_t-vf4-vf31[2];vf2;struct-pcf_in_t-f1[3]-f11;) 86 87(param) 89(param)
+                              Store 85(flattenTemp) 91
+              94:     37(ptr) AccessChain 85(flattenTemp) 29
+              95:    7(fvec4) Load 94
+                              Store 93(@entryPointOutput.pos) 95
+              98:     46(ptr) AccessChain 85(flattenTemp) 39
+              99:    8(fvec3) Load 98
+                              Store 97(@entryPointOutput.norm) 99
                               Return
                               FunctionEnd
 24(@main(struct-ds_in_t-vf4-vf31[2];vf2;struct-pcf_in_t-f1[3]-f11;): 19(gs_in_t) Function None 20
diff --git a/Test/baseResults/hlsl.emptystruct.init.vert.out b/Test/baseResults/hlsl.emptystruct.init.vert.out
index 202e2c0..410915c 100644
--- a/Test/baseResults/hlsl.emptystruct.init.vert.out
+++ b/Test/baseResults/hlsl.emptystruct.init.vert.out
@@ -60,7 +60,7 @@
 0:?     'vertexIndex' (layout( location=0) in uint)
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 29
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.emptystructreturn.frag.out b/Test/baseResults/hlsl.emptystructreturn.frag.out
index 7d11393..34a635c 100644
--- a/Test/baseResults/hlsl.emptystructreturn.frag.out
+++ b/Test/baseResults/hlsl.emptystructreturn.frag.out
@@ -11,16 +11,16 @@
 0:10  Function Definition: main( ( temp void)
 0:10    Function Parameters: 
 0:?     Sequence
-0:10      move second child to first child ( temp structure{})
-0:?         'i' ( temp structure{})
-0:?         'i' (layout( location=0) in structure{})
+0:10      Sequence
+0:10        move second child to first child ( temp structure{})
+0:?           'i' ( temp structure{})
+0:?           'i' ( in structure{})
 0:10      Sequence
 0:10        move second child to first child ( temp structure{})
 0:?           '@entryPointOutput' ( out structure{})
 0:10          Function Call: @main(struct-ps_in1; ( temp structure{})
 0:?             'i' ( temp structure{})
 0:?   Linker Objects
-0:?     'i' (layout( location=0) in structure{})
 
 
 Linked fragment stage:
@@ -38,25 +38,29 @@
 0:10  Function Definition: main( ( temp void)
 0:10    Function Parameters: 
 0:?     Sequence
-0:10      move second child to first child ( temp structure{})
-0:?         'i' ( temp structure{})
-0:?         'i' (layout( location=0) in structure{})
+0:10      Sequence
+0:10        move second child to first child ( temp structure{})
+0:?           'i' ( temp structure{})
+0:?           'i' ( in structure{})
 0:10      Sequence
 0:10        move second child to first child ( temp structure{})
 0:?           '@entryPointOutput' ( out structure{})
 0:10          Function Call: @main(struct-ps_in1; ( temp structure{})
 0:?             'i' ( temp structure{})
 0:?   Linker Objects
-0:?     'i' (layout( location=0) in structure{})
+
+error: SPIRV-Tools Validation Errors
+error: Input variable id <20> is used by entry point 'main' id <4>, but is not listed as an interface
+  %i_1 = OpVariable %_ptr_Input_ps_in Input
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 27
 
                               Capability Shader
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "main" 20 23
+                              EntryPoint Fragment 4  "main"
                               ExecutionMode 4 OriginUpperLeft
                               Source HLSL 500
                               Name 4  "main"
@@ -69,7 +73,6 @@
                               Name 20  "i"
                               Name 23  "@entryPointOutput"
                               Name 24  "param"
-                              Decorate 20(i) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
         6(ps_in):             TypeStruct
diff --git a/Test/baseResults/hlsl.emptystructreturn.vert.out b/Test/baseResults/hlsl.emptystructreturn.vert.out
index 64446bd..6170458 100644
--- a/Test/baseResults/hlsl.emptystructreturn.vert.out
+++ b/Test/baseResults/hlsl.emptystructreturn.vert.out
@@ -14,12 +14,12 @@
 0:10        move second child to first child ( temp structure{})
 0:?           'i' ( temp structure{})
 0:?           'i' ( in structure{})
-0:10      move second child to first child ( temp structure{})
-0:?         '@entryPointOutput' (layout( location=0) out structure{})
-0:10        Function Call: @main(struct-vs_in1; ( temp structure{})
-0:?           'i' ( temp structure{})
+0:10      Sequence
+0:10        move second child to first child ( temp structure{})
+0:?           '@entryPointOutput' ( out structure{})
+0:10          Function Call: @main(struct-vs_in1; ( temp structure{})
+0:?             'i' ( temp structure{})
 0:?   Linker Objects
-0:?     '@entryPointOutput' (layout( location=0) out structure{})
 
 
 Linked vertex stage:
@@ -40,21 +40,25 @@
 0:10        move second child to first child ( temp structure{})
 0:?           'i' ( temp structure{})
 0:?           'i' ( in structure{})
-0:10      move second child to first child ( temp structure{})
-0:?         '@entryPointOutput' (layout( location=0) out structure{})
-0:10        Function Call: @main(struct-vs_in1; ( temp structure{})
-0:?           'i' ( temp structure{})
+0:10      Sequence
+0:10        move second child to first child ( temp structure{})
+0:?           '@entryPointOutput' ( out structure{})
+0:10          Function Call: @main(struct-vs_in1; ( temp structure{})
+0:?             'i' ( temp structure{})
 0:?   Linker Objects
-0:?     '@entryPointOutput' (layout( location=0) out structure{})
+
+error: SPIRV-Tools Validation Errors
+error: Input variable id <20> is used by entry point 'main' id <4>, but is not listed as an interface
+  %i_1 = OpVariable %_ptr_Input_vs_in Input
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 27
 
                               Capability Shader
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Vertex 4  "main" 20 23
+                              EntryPoint Vertex 4  "main"
                               Source HLSL 500
                               Name 4  "main"
                               Name 6  "vs_in"
@@ -66,7 +70,6 @@
                               Name 20  "i"
                               Name 23  "@entryPointOutput"
                               Name 24  "param"
-                              Decorate 23(@entryPointOutput) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
         6(vs_in):             TypeStruct
diff --git a/Test/baseResults/hlsl.entry-in.frag.out b/Test/baseResults/hlsl.entry-in.frag.out
old mode 100755
new mode 100644
index 81441cb..dc9eea4
--- a/Test/baseResults/hlsl.entry-in.frag.out
+++ b/Test/baseResults/hlsl.entry-in.frag.out
@@ -57,33 +57,28 @@
 0:?             'i' ( temp structure{ temp 2-component vector of float v,  temp 4-component vector of float fragCoord,  temp 2-component vector of int i2})
 0:13            Constant:
 0:13              0 (const int)
-0:13          v: direct index for structure ( temp 2-component vector of float)
-0:13            'i' (layout( location=0) in structure{ temp 2-component vector of float v,  temp 2-component vector of int i2})
-0:13            Constant:
-0:13              0 (const int)
+0:?           'i.v' (layout( location=0) in 2-component vector of float)
 0:13        move second child to first child ( temp 4-component vector of float)
 0:13          fragCoord: direct index for structure ( temp 4-component vector of float)
 0:?             'i' ( temp structure{ temp 2-component vector of float v,  temp 4-component vector of float fragCoord,  temp 2-component vector of int i2})
 0:13            Constant:
 0:13              1 (const int)
-0:?           'i_fragCoord' ( in 4-component vector of float FragCoord)
+0:?           'i.fragCoord' ( in 4-component vector of float FragCoord)
 0:13        move second child to first child ( temp 2-component vector of int)
 0:13          i2: direct index for structure ( temp 2-component vector of int)
 0:?             'i' ( temp structure{ temp 2-component vector of float v,  temp 4-component vector of float fragCoord,  temp 2-component vector of int i2})
 0:13            Constant:
 0:13              2 (const int)
-0:13          i2: direct index for structure ( temp 2-component vector of int)
-0:13            'i' (layout( location=0) in structure{ temp 2-component vector of float v,  temp 2-component vector of int i2})
-0:13            Constant:
-0:13              1 (const int)
+0:?           'i.i2' (layout( location=1) flat in 2-component vector of int)
 0:13      move second child to first child ( temp 4-component vector of float)
 0:?         '@entryPointOutput' (layout( location=0) out 4-component vector of float)
 0:13        Function Call: @PixelShaderFunction(struct-InParam-vf2-vf4-vi21; ( temp 4-component vector of float)
 0:?           'i' ( temp structure{ temp 2-component vector of float v,  temp 4-component vector of float fragCoord,  temp 2-component vector of int i2})
 0:?   Linker Objects
 0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
-0:?     'i' (layout( location=0) in structure{ temp 2-component vector of float v,  temp 2-component vector of int i2})
-0:?     'i_fragCoord' ( in 4-component vector of float FragCoord)
+0:?     'i.fragCoord' ( in 4-component vector of float FragCoord)
+0:?     'i.v' (layout( location=0) in 2-component vector of float)
+0:?     'i.i2' (layout( location=1) flat in 2-component vector of int)
 
 
 Linked fragment stage:
@@ -147,42 +142,37 @@
 0:?             'i' ( temp structure{ temp 2-component vector of float v,  temp 4-component vector of float fragCoord,  temp 2-component vector of int i2})
 0:13            Constant:
 0:13              0 (const int)
-0:13          v: direct index for structure ( temp 2-component vector of float)
-0:13            'i' (layout( location=0) in structure{ temp 2-component vector of float v,  temp 2-component vector of int i2})
-0:13            Constant:
-0:13              0 (const int)
+0:?           'i.v' (layout( location=0) in 2-component vector of float)
 0:13        move second child to first child ( temp 4-component vector of float)
 0:13          fragCoord: direct index for structure ( temp 4-component vector of float)
 0:?             'i' ( temp structure{ temp 2-component vector of float v,  temp 4-component vector of float fragCoord,  temp 2-component vector of int i2})
 0:13            Constant:
 0:13              1 (const int)
-0:?           'i_fragCoord' ( in 4-component vector of float FragCoord)
+0:?           'i.fragCoord' ( in 4-component vector of float FragCoord)
 0:13        move second child to first child ( temp 2-component vector of int)
 0:13          i2: direct index for structure ( temp 2-component vector of int)
 0:?             'i' ( temp structure{ temp 2-component vector of float v,  temp 4-component vector of float fragCoord,  temp 2-component vector of int i2})
 0:13            Constant:
 0:13              2 (const int)
-0:13          i2: direct index for structure ( temp 2-component vector of int)
-0:13            'i' (layout( location=0) in structure{ temp 2-component vector of float v,  temp 2-component vector of int i2})
-0:13            Constant:
-0:13              1 (const int)
+0:?           'i.i2' (layout( location=1) flat in 2-component vector of int)
 0:13      move second child to first child ( temp 4-component vector of float)
 0:?         '@entryPointOutput' (layout( location=0) out 4-component vector of float)
 0:13        Function Call: @PixelShaderFunction(struct-InParam-vf2-vf4-vi21; ( temp 4-component vector of float)
 0:?           'i' ( temp structure{ temp 2-component vector of float v,  temp 4-component vector of float fragCoord,  temp 2-component vector of int i2})
 0:?   Linker Objects
 0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
-0:?     'i' (layout( location=0) in structure{ temp 2-component vector of float v,  temp 2-component vector of int i2})
-0:?     'i_fragCoord' ( in 4-component vector of float FragCoord)
+0:?     'i.fragCoord' ( in 4-component vector of float FragCoord)
+0:?     'i.v' (layout( location=0) in 2-component vector of float)
+0:?     'i.i2' (layout( location=1) flat in 2-component vector of int)
 
 // Module Version 10000
-// Generated by (magic number): 80001
-// Id's are bound by 77
+// Generated by (magic number): 80007
+// Id's are bound by 74
 
                               Capability Shader
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "PixelShaderFunction" 56 63 73
+                              EntryPoint Fragment 4  "PixelShaderFunction" 55 60 65 70
                               ExecutionMode 4 OriginUpperLeft
                               Source HLSL 500
                               Name 4  "PixelShaderFunction"
@@ -200,16 +190,16 @@
                               Name 40  "ret2"
                               Name 41  "param"
                               Name 53  "i"
-                              Name 54  "InParam"
-                              MemberName 54(InParam) 0  "v"
-                              MemberName 54(InParam) 1  "i2"
-                              Name 56  "i"
-                              Name 63  "i_fragCoord"
-                              Name 73  "@entryPointOutput"
-                              Name 74  "param"
-                              Decorate 56(i) Location 0
-                              Decorate 63(i_fragCoord) BuiltIn FragCoord
-                              Decorate 73(@entryPointOutput) Location 0
+                              Name 55  "i.v"
+                              Name 60  "i.fragCoord"
+                              Name 65  "i.i2"
+                              Name 70  "@entryPointOutput"
+                              Name 71  "param"
+                              Decorate 55(i.v) Location 0
+                              Decorate 60(i.fragCoord) BuiltIn FragCoord
+                              Decorate 65(i.i2) Flat
+                              Decorate 65(i.i2) Location 1
+                              Decorate 70(@entryPointOutput) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -228,37 +218,34 @@
               27:      9(int) Constant 1
               28:     22(int) Constant 0
               44:             TypePointer Function 8(fvec4)
-     54(InParam):             TypeStruct 7(fvec2) 10(ivec2)
-              55:             TypePointer Input 54(InParam)
-           56(i):     55(ptr) Variable Input
-              57:             TypePointer Input 7(fvec2)
-              60:             TypePointer Function 7(fvec2)
-              62:             TypePointer Input 8(fvec4)
- 63(i_fragCoord):     62(ptr) Variable Input
-              66:      9(int) Constant 2
-              67:             TypePointer Input 10(ivec2)
-              70:             TypePointer Function 10(ivec2)
-              72:             TypePointer Output 8(fvec4)
-73(@entryPointOutput):     72(ptr) Variable Output
+              54:             TypePointer Input 7(fvec2)
+         55(i.v):     54(ptr) Variable Input
+              57:             TypePointer Function 7(fvec2)
+              59:             TypePointer Input 8(fvec4)
+ 60(i.fragCoord):     59(ptr) Variable Input
+              63:      9(int) Constant 2
+              64:             TypePointer Input 10(ivec2)
+        65(i.i2):     64(ptr) Variable Input
+              67:             TypePointer Function 10(ivec2)
+              69:             TypePointer Output 8(fvec4)
+70(@entryPointOutput):     69(ptr) Variable Output
 4(PixelShaderFunction):           2 Function None 3
                5:             Label
            53(i):     12(ptr) Variable Function
-       74(param):     12(ptr) Variable Function
-              58:     57(ptr) AccessChain 56(i) 21
-              59:    7(fvec2) Load 58
-              61:     60(ptr) AccessChain 53(i) 21
-                              Store 61 59
-              64:    8(fvec4) Load 63(i_fragCoord)
-              65:     44(ptr) AccessChain 53(i) 27
-                              Store 65 64
-              68:     67(ptr) AccessChain 56(i) 27
-              69:   10(ivec2) Load 68
-              71:     70(ptr) AccessChain 53(i) 66
-                              Store 71 69
-              75: 11(InParam) Load 53(i)
-                              Store 74(param) 75
-              76:    8(fvec4) FunctionCall 19(@PixelShaderFunction(struct-InParam-vf2-vf4-vi21;) 74(param)
-                              Store 73(@entryPointOutput) 76
+       71(param):     12(ptr) Variable Function
+              56:    7(fvec2) Load 55(i.v)
+              58:     57(ptr) AccessChain 53(i) 21
+                              Store 58 56
+              61:    8(fvec4) Load 60(i.fragCoord)
+              62:     44(ptr) AccessChain 53(i) 27
+                              Store 62 61
+              66:   10(ivec2) Load 65(i.i2)
+              68:     67(ptr) AccessChain 53(i) 63
+                              Store 68 66
+              72: 11(InParam) Load 53(i)
+                              Store 71(param) 72
+              73:    8(fvec4) FunctionCall 19(@PixelShaderFunction(struct-InParam-vf2-vf4-vi21;) 71(param)
+                              Store 70(@entryPointOutput) 73
                               Return
                               FunctionEnd
 15(fun(struct-InParam-vf2-vf4-vi21;):    6(float) Function None 13
diff --git a/Test/baseResults/hlsl.entry-out.frag.out b/Test/baseResults/hlsl.entry-out.frag.out
old mode 100755
new mode 100644
index 1324112..6ca3011
--- a/Test/baseResults/hlsl.entry-out.frag.out
+++ b/Test/baseResults/hlsl.entry-out.frag.out
@@ -86,26 +86,26 @@
 0:?         'out1' ( temp 4-component vector of float)
 0:13      Sequence
 0:13        move second child to first child ( temp 2-component vector of float)
-0:?           'v' (layout( location=2) out 2-component vector of float)
+0:?           'out2.v' (layout( location=2) out 2-component vector of float)
 0:13          v: direct index for structure ( temp 2-component vector of float)
 0:?             'out2' ( temp structure{ temp 2-component vector of float v,  temp 2-component vector of int i})
 0:13            Constant:
 0:13              0 (const int)
 0:13        move second child to first child ( temp 2-component vector of int)
-0:?           'i' (layout( location=3) out 2-component vector of int)
+0:?           'out2.i' (layout( location=3) out 2-component vector of int)
 0:13          i: direct index for structure ( temp 2-component vector of int)
 0:?             'out2' ( temp structure{ temp 2-component vector of float v,  temp 2-component vector of int i})
 0:13            Constant:
 0:13              1 (const int)
 0:13      Sequence
 0:13        move second child to first child ( temp 2-component vector of float)
-0:?           'v' (layout( location=4) out 2-component vector of float)
+0:?           'out3.v' (layout( location=4) out 2-component vector of float)
 0:13          v: direct index for structure ( temp 2-component vector of float)
 0:?             'out3' ( temp structure{ temp 2-component vector of float v,  temp 2-component vector of int i})
 0:13            Constant:
 0:13              0 (const int)
 0:13        move second child to first child ( temp 2-component vector of int)
-0:?           'i' (layout( location=5) out 2-component vector of int)
+0:?           'out3.i' (layout( location=5) out 2-component vector of int)
 0:13          i: direct index for structure ( temp 2-component vector of int)
 0:?             'out3' ( temp structure{ temp 2-component vector of float v,  temp 2-component vector of int i})
 0:13            Constant:
@@ -114,10 +114,10 @@
 0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
 0:?     'input' (layout( location=0) in 4-component vector of float)
 0:?     'out1' (layout( location=1) out 4-component vector of float)
-0:?     'v' (layout( location=2) out 2-component vector of float)
-0:?     'i' (layout( location=3) out 2-component vector of int)
-0:?     'v' (layout( location=4) out 2-component vector of float)
-0:?     'i' (layout( location=5) out 2-component vector of int)
+0:?     'out2.v' (layout( location=2) out 2-component vector of float)
+0:?     'out2.i' (layout( location=3) out 2-component vector of int)
+0:?     'out3.v' (layout( location=4) out 2-component vector of float)
+0:?     'out3.i' (layout( location=5) out 2-component vector of int)
 
 
 Linked fragment stage:
@@ -210,26 +210,26 @@
 0:?         'out1' ( temp 4-component vector of float)
 0:13      Sequence
 0:13        move second child to first child ( temp 2-component vector of float)
-0:?           'v' (layout( location=2) out 2-component vector of float)
+0:?           'out2.v' (layout( location=2) out 2-component vector of float)
 0:13          v: direct index for structure ( temp 2-component vector of float)
 0:?             'out2' ( temp structure{ temp 2-component vector of float v,  temp 2-component vector of int i})
 0:13            Constant:
 0:13              0 (const int)
 0:13        move second child to first child ( temp 2-component vector of int)
-0:?           'i' (layout( location=3) out 2-component vector of int)
+0:?           'out2.i' (layout( location=3) out 2-component vector of int)
 0:13          i: direct index for structure ( temp 2-component vector of int)
 0:?             'out2' ( temp structure{ temp 2-component vector of float v,  temp 2-component vector of int i})
 0:13            Constant:
 0:13              1 (const int)
 0:13      Sequence
 0:13        move second child to first child ( temp 2-component vector of float)
-0:?           'v' (layout( location=4) out 2-component vector of float)
+0:?           'out3.v' (layout( location=4) out 2-component vector of float)
 0:13          v: direct index for structure ( temp 2-component vector of float)
 0:?             'out3' ( temp structure{ temp 2-component vector of float v,  temp 2-component vector of int i})
 0:13            Constant:
 0:13              0 (const int)
 0:13        move second child to first child ( temp 2-component vector of int)
-0:?           'i' (layout( location=5) out 2-component vector of int)
+0:?           'out3.i' (layout( location=5) out 2-component vector of int)
 0:13          i: direct index for structure ( temp 2-component vector of int)
 0:?             'out3' ( temp structure{ temp 2-component vector of float v,  temp 2-component vector of int i})
 0:13            Constant:
@@ -238,13 +238,13 @@
 0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
 0:?     'input' (layout( location=0) in 4-component vector of float)
 0:?     'out1' (layout( location=1) out 4-component vector of float)
-0:?     'v' (layout( location=2) out 2-component vector of float)
-0:?     'i' (layout( location=3) out 2-component vector of int)
-0:?     'v' (layout( location=4) out 2-component vector of float)
-0:?     'i' (layout( location=5) out 2-component vector of int)
+0:?     'out2.v' (layout( location=2) out 2-component vector of float)
+0:?     'out2.i' (layout( location=3) out 2-component vector of int)
+0:?     'out3.v' (layout( location=4) out 2-component vector of float)
+0:?     'out3.i' (layout( location=5) out 2-component vector of int)
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 89
 
                               Capability Shader
@@ -277,17 +277,17 @@
                               Name 67  "param"
                               Name 68  "param"
                               Name 73  "out1"
-                              Name 76  "v"
-                              Name 80  "i"
-                              Name 83  "v"
-                              Name 86  "i"
+                              Name 76  "out2.v"
+                              Name 80  "out2.i"
+                              Name 83  "out3.v"
+                              Name 86  "out3.i"
                               Decorate 57(input) Location 0
                               Decorate 60(@entryPointOutput) Location 0
                               Decorate 73(out1) Location 1
-                              Decorate 76(v) Location 2
-                              Decorate 80(i) Location 3
-                              Decorate 83(v) Location 4
-                              Decorate 86(i) Location 5
+                              Decorate 76(out2.v) Location 2
+                              Decorate 80(out2.i) Location 3
+                              Decorate 83(out3.v) Location 4
+                              Decorate 86(out3.i) Location 5
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -322,11 +322,11 @@
 60(@entryPointOutput):     59(ptr) Variable Output
         73(out1):     59(ptr) Variable Output
               75:             TypePointer Output 7(fvec2)
-           76(v):     75(ptr) Variable Output
+      76(out2.v):     75(ptr) Variable Output
               79:             TypePointer Output 9(ivec2)
-           80(i):     79(ptr) Variable Output
-           83(v):     75(ptr) Variable Output
-           86(i):     79(ptr) Variable Output
+      80(out2.i):     79(ptr) Variable Output
+      83(out3.v):     75(ptr) Variable Output
+      86(out3.i):     79(ptr) Variable Output
 4(PixelShaderFunction):           2 Function None 3
                5:             Label
        55(input):     17(ptr) Variable Function
@@ -353,16 +353,16 @@
                               Store 73(out1) 74
               77:     28(ptr) AccessChain 62(out2) 25
               78:    7(fvec2) Load 77
-                              Store 76(v) 78
+                              Store 76(out2.v) 78
               81:     33(ptr) AccessChain 62(out2) 30
               82:    9(ivec2) Load 81
-                              Store 80(i) 82
+                              Store 80(out2.i) 82
               84:     28(ptr) AccessChain 63(out3) 25
               85:    7(fvec2) Load 84
-                              Store 83(v) 85
+                              Store 83(out3.v) 85
               87:     33(ptr) AccessChain 63(out3) 30
               88:    9(ivec2) Load 87
-                              Store 86(i) 88
+                              Store 86(out3.i) 88
                               Return
                               FunctionEnd
 14(fun(struct-OutParam-vf2-vi21;):           2 Function None 12
diff --git a/Test/baseResults/hlsl.entry.rename.frag.out b/Test/baseResults/hlsl.entry.rename.frag.out
index c6a4335..898eb4b 100644
--- a/Test/baseResults/hlsl.entry.rename.frag.out
+++ b/Test/baseResults/hlsl.entry.rename.frag.out
@@ -24,14 +24,14 @@
 0:?     Sequence
 0:11      Sequence
 0:11        move second child to first child ( temp 4-component vector of float)
-0:?           'Color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 0:11          Color: direct index for structure ( temp 4-component vector of float)
 0:11            Function Call: @main_in_spv( ( temp structure{ temp 4-component vector of float Color})
 0:11            Constant:
 0:11              0 (const int)
 0:?   Linker Objects
 0:?     'anon@0' (layout( row_major std140) uniform block{ uniform int also_not_the_entry_point})
-0:?     'Color' (layout( location=0) out 4-component vector of float)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 
 Linked fragment stage:
@@ -62,17 +62,17 @@
 0:?     Sequence
 0:11      Sequence
 0:11        move second child to first child ( temp 4-component vector of float)
-0:?           'Color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 0:11          Color: direct index for structure ( temp 4-component vector of float)
 0:11            Function Call: @main_in_spv( ( temp structure{ temp 4-component vector of float Color})
 0:11            Constant:
 0:11              0 (const int)
 0:?   Linker Objects
 0:?     'anon@0' (layout( row_major std140) uniform block{ uniform int also_not_the_entry_point})
-0:?     'Color' (layout( location=0) out 4-component vector of float)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 32
 
                               Capability Shader
@@ -87,11 +87,11 @@
                               MemberName 10(PS_OUTPUT) 0  "Color"
                               Name 12  "@main_in_spv("
                               Name 15  "psout"
-                              Name 26  "Color"
+                              Name 26  "@entryPointOutput.Color"
                               Name 29  "$Global"
                               MemberName 29($Global) 0  "also_not_the_entry_point"
                               Name 31  ""
-                              Decorate 26(Color) Location 0
+                              Decorate 26(@entryPointOutput.Color) Location 0
                               MemberDecorate 29($Global) 0 Offset 0
                               Decorate 29($Global) Block
                               Decorate 31 DescriptorSet 0
@@ -108,7 +108,7 @@
               19:    9(fvec4) ConstantComposite 18 18 18 18
               20:             TypePointer Function 9(fvec4)
               25:             TypePointer Output 9(fvec4)
-       26(Color):     25(ptr) Variable Output
+26(@entryPointOutput.Color):     25(ptr) Variable Output
      29($Global):             TypeStruct 16(int)
               30:             TypePointer Uniform 29($Global)
               31:     30(ptr) Variable Uniform
@@ -116,7 +116,7 @@
                5:             Label
               27:10(PS_OUTPUT) FunctionCall 12(@main_in_spv()
               28:    9(fvec4) CompositeExtract 27 0
-                              Store 26(Color) 28
+                              Store 26(@entryPointOutput.Color) 28
                               Return
                               FunctionEnd
 6(not_the_entry_point():           2 Function None 3
diff --git a/Test/baseResults/hlsl.explicitDescriptorSet-2.frag.out b/Test/baseResults/hlsl.explicitDescriptorSet-2.frag.out
new file mode 100644
index 0000000..b5f3440
--- /dev/null
+++ b/Test/baseResults/hlsl.explicitDescriptorSet-2.frag.out
@@ -0,0 +1,66 @@
+hlsl.explicitDescriptorSet.frag
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 31
+
+                              Capability Shader
+                              Capability Sampled1D
+                              Capability SampledBuffer
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 19
+                              ExecutionMode 4 OriginUpperLeft
+                              Source HLSL 500
+                              Name 4  "main"
+                              Name 9  "@main("
+                              Name 13  "g_sSamp2_amb"
+                              Name 19  "@entryPointOutput"
+                              Name 21  "g_sSamp"
+                              Name 24  "g_tTex1df4"
+                              Name 25  "$Global"
+                              MemberName 25($Global) 0  "floatval_amb"
+                              Name 27  ""
+                              Name 30  "floatbuff"
+                              Decorate 13(g_sSamp2_amb) DescriptorSet 3
+                              Decorate 13(g_sSamp2_amb) Binding 10
+                              Decorate 19(@entryPointOutput) Location 0
+                              Decorate 21(g_sSamp) DescriptorSet 3
+                              Decorate 21(g_sSamp) Binding 11
+                              Decorate 24(g_tTex1df4) DescriptorSet 3
+                              Decorate 24(g_tTex1df4) Binding 20
+                              MemberDecorate 25($Global) 0 Offset 0
+                              Decorate 25($Global) Block
+                              Decorate 27 DescriptorSet 3
+                              Decorate 30(floatbuff) DescriptorSet 3
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+               8:             TypeFunction 7(fvec4)
+              11:             TypeSampler
+              12:             TypePointer UniformConstant 11
+13(g_sSamp2_amb):     12(ptr) Variable UniformConstant
+              14:    6(float) Constant 0
+              15:    7(fvec4) ConstantComposite 14 14 14 14
+              18:             TypePointer Output 7(fvec4)
+19(@entryPointOutput):     18(ptr) Variable Output
+     21(g_sSamp):     12(ptr) Variable UniformConstant
+              22:             TypeImage 6(float) 1D sampled format:Unknown
+              23:             TypePointer UniformConstant 22
+  24(g_tTex1df4):     23(ptr) Variable UniformConstant
+     25($Global):             TypeStruct 6(float)
+              26:             TypePointer Uniform 25($Global)
+              27:     26(ptr) Variable Uniform
+              28:             TypeImage 6(float) Buffer sampled format:R32f
+              29:             TypePointer UniformConstant 28
+   30(floatbuff):     29(ptr) Variable UniformConstant
+         4(main):           2 Function None 3
+               5:             Label
+              20:    7(fvec4) FunctionCall 9(@main()
+                              Store 19(@entryPointOutput) 20
+                              Return
+                              FunctionEnd
+       9(@main():    7(fvec4) Function None 8
+              10:             Label
+                              ReturnValue 15
+                              FunctionEnd
diff --git a/Test/baseResults/hlsl.explicitDescriptorSet.frag.out b/Test/baseResults/hlsl.explicitDescriptorSet.frag.out
new file mode 100644
index 0000000..8ab296f
--- /dev/null
+++ b/Test/baseResults/hlsl.explicitDescriptorSet.frag.out
@@ -0,0 +1,66 @@
+hlsl.explicitDescriptorSet.frag
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 31
+
+                              Capability Shader
+                              Capability Sampled1D
+                              Capability SampledBuffer
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 19
+                              ExecutionMode 4 OriginUpperLeft
+                              Source HLSL 500
+                              Name 4  "main"
+                              Name 9  "@main("
+                              Name 13  "g_sSamp2_amb"
+                              Name 19  "@entryPointOutput"
+                              Name 21  "g_sSamp"
+                              Name 24  "g_tTex1df4"
+                              Name 25  "$Global"
+                              MemberName 25($Global) 0  "floatval_amb"
+                              Name 27  ""
+                              Name 30  "floatbuff"
+                              Decorate 13(g_sSamp2_amb) DescriptorSet 4
+                              Decorate 13(g_sSamp2_amb) Binding 10
+                              Decorate 19(@entryPointOutput) Location 0
+                              Decorate 21(g_sSamp) DescriptorSet 4
+                              Decorate 21(g_sSamp) Binding 11
+                              Decorate 24(g_tTex1df4) DescriptorSet 4
+                              Decorate 24(g_tTex1df4) Binding 20
+                              MemberDecorate 25($Global) 0 Offset 0
+                              Decorate 25($Global) Block
+                              Decorate 27 DescriptorSet 4
+                              Decorate 30(floatbuff) DescriptorSet 4
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+               8:             TypeFunction 7(fvec4)
+              11:             TypeSampler
+              12:             TypePointer UniformConstant 11
+13(g_sSamp2_amb):     12(ptr) Variable UniformConstant
+              14:    6(float) Constant 0
+              15:    7(fvec4) ConstantComposite 14 14 14 14
+              18:             TypePointer Output 7(fvec4)
+19(@entryPointOutput):     18(ptr) Variable Output
+     21(g_sSamp):     12(ptr) Variable UniformConstant
+              22:             TypeImage 6(float) 1D sampled format:Unknown
+              23:             TypePointer UniformConstant 22
+  24(g_tTex1df4):     23(ptr) Variable UniformConstant
+     25($Global):             TypeStruct 6(float)
+              26:             TypePointer Uniform 25($Global)
+              27:     26(ptr) Variable Uniform
+              28:             TypeImage 6(float) Buffer sampled format:R32f
+              29:             TypePointer UniformConstant 28
+   30(floatbuff):     29(ptr) Variable UniformConstant
+         4(main):           2 Function None 3
+               5:             Label
+              20:    7(fvec4) FunctionCall 9(@main()
+                              Store 19(@entryPointOutput) 20
+                              Return
+                              FunctionEnd
+       9(@main():    7(fvec4) Function None 8
+              10:             Label
+                              ReturnValue 15
+                              FunctionEnd
diff --git a/Test/baseResults/hlsl.flatten.return.frag.out b/Test/baseResults/hlsl.flatten.return.frag.out
index ee2c3f0..e47fe3e 100644
--- a/Test/baseResults/hlsl.flatten.return.frag.out
+++ b/Test/baseResults/hlsl.flatten.return.frag.out
@@ -27,34 +27,34 @@
 0:16          'flattenTemp' ( temp structure{ temp 4-component vector of float color,  temp float other_struct_member1,  temp float other_struct_member2,  temp float other_struct_member3})
 0:16          Function Call: @main( ( temp structure{ temp 4-component vector of float color,  temp float other_struct_member1,  temp float other_struct_member2,  temp float other_struct_member3})
 0:16        move second child to first child ( temp 4-component vector of float)
-0:?           'color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.color' (layout( location=0) out 4-component vector of float)
 0:16          color: direct index for structure ( temp 4-component vector of float)
 0:16            'flattenTemp' ( temp structure{ temp 4-component vector of float color,  temp float other_struct_member1,  temp float other_struct_member2,  temp float other_struct_member3})
 0:16            Constant:
 0:16              0 (const int)
 0:16        move second child to first child ( temp float)
-0:?           'other_struct_member1' (layout( location=1) out float)
+0:?           '@entryPointOutput.other_struct_member1' (layout( location=1) out float)
 0:16          other_struct_member1: direct index for structure ( temp float)
 0:16            'flattenTemp' ( temp structure{ temp 4-component vector of float color,  temp float other_struct_member1,  temp float other_struct_member2,  temp float other_struct_member3})
 0:16            Constant:
 0:16              1 (const int)
 0:16        move second child to first child ( temp float)
-0:?           'other_struct_member2' (layout( location=2) out float)
+0:?           '@entryPointOutput.other_struct_member2' (layout( location=2) out float)
 0:16          other_struct_member2: direct index for structure ( temp float)
 0:16            'flattenTemp' ( temp structure{ temp 4-component vector of float color,  temp float other_struct_member1,  temp float other_struct_member2,  temp float other_struct_member3})
 0:16            Constant:
 0:16              2 (const int)
 0:16        move second child to first child ( temp float)
-0:?           'other_struct_member3' (layout( location=3) out float)
+0:?           '@entryPointOutput.other_struct_member3' (layout( location=3) out float)
 0:16          other_struct_member3: direct index for structure ( temp float)
 0:16            'flattenTemp' ( temp structure{ temp 4-component vector of float color,  temp float other_struct_member1,  temp float other_struct_member2,  temp float other_struct_member3})
 0:16            Constant:
 0:16              3 (const int)
 0:?   Linker Objects
-0:?     'color' (layout( location=0) out 4-component vector of float)
-0:?     'other_struct_member1' (layout( location=1) out float)
-0:?     'other_struct_member2' (layout( location=2) out float)
-0:?     'other_struct_member3' (layout( location=3) out float)
+0:?     '@entryPointOutput.color' (layout( location=0) out 4-component vector of float)
+0:?     '@entryPointOutput.other_struct_member1' (layout( location=1) out float)
+0:?     '@entryPointOutput.other_struct_member2' (layout( location=2) out float)
+0:?     '@entryPointOutput.other_struct_member3' (layout( location=3) out float)
 
 
 Linked fragment stage:
@@ -88,37 +88,37 @@
 0:16          'flattenTemp' ( temp structure{ temp 4-component vector of float color,  temp float other_struct_member1,  temp float other_struct_member2,  temp float other_struct_member3})
 0:16          Function Call: @main( ( temp structure{ temp 4-component vector of float color,  temp float other_struct_member1,  temp float other_struct_member2,  temp float other_struct_member3})
 0:16        move second child to first child ( temp 4-component vector of float)
-0:?           'color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.color' (layout( location=0) out 4-component vector of float)
 0:16          color: direct index for structure ( temp 4-component vector of float)
 0:16            'flattenTemp' ( temp structure{ temp 4-component vector of float color,  temp float other_struct_member1,  temp float other_struct_member2,  temp float other_struct_member3})
 0:16            Constant:
 0:16              0 (const int)
 0:16        move second child to first child ( temp float)
-0:?           'other_struct_member1' (layout( location=1) out float)
+0:?           '@entryPointOutput.other_struct_member1' (layout( location=1) out float)
 0:16          other_struct_member1: direct index for structure ( temp float)
 0:16            'flattenTemp' ( temp structure{ temp 4-component vector of float color,  temp float other_struct_member1,  temp float other_struct_member2,  temp float other_struct_member3})
 0:16            Constant:
 0:16              1 (const int)
 0:16        move second child to first child ( temp float)
-0:?           'other_struct_member2' (layout( location=2) out float)
+0:?           '@entryPointOutput.other_struct_member2' (layout( location=2) out float)
 0:16          other_struct_member2: direct index for structure ( temp float)
 0:16            'flattenTemp' ( temp structure{ temp 4-component vector of float color,  temp float other_struct_member1,  temp float other_struct_member2,  temp float other_struct_member3})
 0:16            Constant:
 0:16              2 (const int)
 0:16        move second child to first child ( temp float)
-0:?           'other_struct_member3' (layout( location=3) out float)
+0:?           '@entryPointOutput.other_struct_member3' (layout( location=3) out float)
 0:16          other_struct_member3: direct index for structure ( temp float)
 0:16            'flattenTemp' ( temp structure{ temp 4-component vector of float color,  temp float other_struct_member1,  temp float other_struct_member2,  temp float other_struct_member3})
 0:16            Constant:
 0:16              3 (const int)
 0:?   Linker Objects
-0:?     'color' (layout( location=0) out 4-component vector of float)
-0:?     'other_struct_member1' (layout( location=1) out float)
-0:?     'other_struct_member2' (layout( location=2) out float)
-0:?     'other_struct_member3' (layout( location=3) out float)
+0:?     '@entryPointOutput.color' (layout( location=0) out 4-component vector of float)
+0:?     '@entryPointOutput.other_struct_member1' (layout( location=1) out float)
+0:?     '@entryPointOutput.other_struct_member2' (layout( location=2) out float)
+0:?     '@entryPointOutput.other_struct_member3' (layout( location=3) out float)
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 49
 
                               Capability Shader
@@ -136,14 +136,14 @@
                               Name 10  "Func1("
                               Name 12  "@main("
                               Name 26  "flattenTemp"
-                              Name 29  "color"
-                              Name 36  "other_struct_member1"
-                              Name 41  "other_struct_member2"
-                              Name 45  "other_struct_member3"
-                              Decorate 29(color) Location 0
-                              Decorate 36(other_struct_member1) Location 1
-                              Decorate 41(other_struct_member2) Location 2
-                              Decorate 45(other_struct_member3) Location 3
+                              Name 29  "@entryPointOutput.color"
+                              Name 36  "@entryPointOutput.other_struct_member1"
+                              Name 41  "@entryPointOutput.other_struct_member2"
+                              Name 45  "@entryPointOutput.other_struct_member3"
+                              Decorate 29(@entryPointOutput.color) Location 0
+                              Decorate 36(@entryPointOutput.other_struct_member1) Location 1
+                              Decorate 41(@entryPointOutput.other_struct_member2) Location 2
+                              Decorate 45(@entryPointOutput.other_struct_member3) Location 3
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -158,17 +158,17 @@
               19:8(PS_OUTPUT) ConstantComposite 15 16 17 18
               25:             TypePointer Function 8(PS_OUTPUT)
               28:             TypePointer Output 7(fvec4)
-       29(color):     28(ptr) Variable Output
+29(@entryPointOutput.color):     28(ptr) Variable Output
               30:             TypeInt 32 1
               31:     30(int) Constant 0
               32:             TypePointer Function 7(fvec4)
               35:             TypePointer Output 6(float)
-36(other_struct_member1):     35(ptr) Variable Output
+36(@entryPointOutput.other_struct_member1):     35(ptr) Variable Output
               37:     30(int) Constant 1
               38:             TypePointer Function 6(float)
-41(other_struct_member2):     35(ptr) Variable Output
+41(@entryPointOutput.other_struct_member2):     35(ptr) Variable Output
               42:     30(int) Constant 2
-45(other_struct_member3):     35(ptr) Variable Output
+45(@entryPointOutput.other_struct_member3):     35(ptr) Variable Output
               46:     30(int) Constant 3
          4(main):           2 Function None 3
                5:             Label
@@ -177,16 +177,16 @@
                               Store 26(flattenTemp) 27
               33:     32(ptr) AccessChain 26(flattenTemp) 31
               34:    7(fvec4) Load 33
-                              Store 29(color) 34
+                              Store 29(@entryPointOutput.color) 34
               39:     38(ptr) AccessChain 26(flattenTemp) 37
               40:    6(float) Load 39
-                              Store 36(other_struct_member1) 40
+                              Store 36(@entryPointOutput.other_struct_member1) 40
               43:     38(ptr) AccessChain 26(flattenTemp) 42
               44:    6(float) Load 43
-                              Store 41(other_struct_member2) 44
+                              Store 41(@entryPointOutput.other_struct_member2) 44
               47:     38(ptr) AccessChain 26(flattenTemp) 46
               48:    6(float) Load 47
-                              Store 45(other_struct_member3) 48
+                              Store 45(@entryPointOutput.other_struct_member3) 48
                               Return
                               FunctionEnd
       10(Func1():8(PS_OUTPUT) Function None 9
diff --git a/Test/baseResults/hlsl.flattenOpaque.frag.out b/Test/baseResults/hlsl.flattenOpaque.frag.out
new file mode 100644
index 0000000..eb47c3f
--- /dev/null
+++ b/Test/baseResults/hlsl.flattenOpaque.frag.out
@@ -0,0 +1,478 @@
+hlsl.flattenOpaque.frag
+WARNING: AST will form illegal SPIR-V; need to transform to legalize
+Shader version: 500
+gl_FragCoord origin is upper left
+0:? Sequence
+0:15  Function Definition: osCall1(struct-os-p11; ( temp 4-component vector of float)
+0:15    Function Parameters: 
+0:15      's' ( in structure{ temp sampler s2D})
+0:?     Sequence
+0:16      Branch: Return with expression
+0:16        texture ( temp 4-component vector of float)
+0:16          Construct combined texture-sampler ( temp sampler2D)
+0:16            'tex' ( uniform texture2D)
+0:16            s2D: direct index for structure ( temp sampler)
+0:16              's' ( in structure{ temp sampler s2D})
+0:16              Constant:
+0:16                0 (const int)
+0:?           Constant:
+0:?             0.200000
+0:?             0.300000
+0:20  Function Definition: osCall2(struct-os-p11;vf2; ( temp 4-component vector of float)
+0:20    Function Parameters: 
+0:20      's' ( in structure{ temp sampler s2D})
+0:20      'f2' ( in 2-component vector of float)
+0:?     Sequence
+0:21      Branch: Return with expression
+0:21        texture ( temp 4-component vector of float)
+0:21          Construct combined texture-sampler ( temp sampler2D)
+0:21            'tex' ( uniform texture2D)
+0:21            s2D: direct index for structure ( temp sampler)
+0:21              's' ( in structure{ temp sampler s2D})
+0:21              Constant:
+0:21                0 (const int)
+0:21          'f2' ( in 2-component vector of float)
+0:25  Function Definition: os2Call1(struct-os2-p1-t211; ( temp 4-component vector of float)
+0:25    Function Parameters: 
+0:25      's' ( in structure{ temp sampler s2D,  temp texture2D tex})
+0:?     Sequence
+0:26      Branch: Return with expression
+0:26        texture ( temp 4-component vector of float)
+0:26          Construct combined texture-sampler ( temp sampler2D)
+0:26            tex: direct index for structure ( temp texture2D)
+0:26              's' ( in structure{ temp sampler s2D,  temp texture2D tex})
+0:26              Constant:
+0:26                1 (const int)
+0:26            s2D: direct index for structure ( temp sampler)
+0:26              's' ( in structure{ temp sampler s2D,  temp texture2D tex})
+0:26              Constant:
+0:26                0 (const int)
+0:?           Constant:
+0:?             0.200000
+0:?             0.300000
+0:30  Function Definition: os2Call2(struct-os2-p1-t211;vf2; ( temp 4-component vector of float)
+0:30    Function Parameters: 
+0:30      's' ( in structure{ temp sampler s2D,  temp texture2D tex})
+0:30      'f2' ( in 2-component vector of float)
+0:?     Sequence
+0:31      Branch: Return with expression
+0:31        texture ( temp 4-component vector of float)
+0:31          Construct combined texture-sampler ( temp sampler2D)
+0:31            tex: direct index for structure ( temp texture2D)
+0:31              's' ( in structure{ temp sampler s2D,  temp texture2D tex})
+0:31              Constant:
+0:31                1 (const int)
+0:31            s2D: direct index for structure ( temp sampler)
+0:31              's' ( in structure{ temp sampler s2D,  temp texture2D tex})
+0:31              Constant:
+0:31                0 (const int)
+0:31          'f2' ( in 2-component vector of float)
+0:35  Function Definition: @main( ( temp 4-component vector of float)
+0:35    Function Parameters: 
+0:?     Sequence
+0:39      Branch: Return with expression
+0:38        add ( temp 4-component vector of float)
+0:37          add ( temp 4-component vector of float)
+0:36            add ( temp 4-component vector of float)
+0:36              Function Call: osCall1(struct-os-p11; ( temp 4-component vector of float)
+0:36                Comma ( temp structure{ temp sampler s2D})
+0:36                  Sequence
+0:36                    move second child to first child ( temp sampler)
+0:36                      s2D: direct index for structure ( temp sampler)
+0:36                        'aggShadow' ( temp structure{ temp sampler s2D})
+0:36                        Constant:
+0:36                          0 (const int)
+0:?                       's.s2D' ( uniform sampler)
+0:36                  'aggShadow' ( temp structure{ temp sampler s2D})
+0:37              Function Call: osCall2(struct-os-p11;vf2; ( temp 4-component vector of float)
+0:37                Comma ( temp structure{ temp sampler s2D})
+0:37                  Sequence
+0:37                    move second child to first child ( temp sampler)
+0:37                      s2D: direct index for structure ( temp sampler)
+0:37                        'aggShadow' ( temp structure{ temp sampler s2D})
+0:37                        Constant:
+0:37                          0 (const int)
+0:?                       's.s2D' ( uniform sampler)
+0:37                  'aggShadow' ( temp structure{ temp sampler s2D})
+0:?                 Constant:
+0:?                   0.200000
+0:?                   0.300000
+0:38            Function Call: os2Call1(struct-os2-p1-t211; ( temp 4-component vector of float)
+0:38              Comma ( temp structure{ temp sampler s2D,  temp texture2D tex})
+0:38                Sequence
+0:38                  move second child to first child ( temp sampler)
+0:38                    s2D: direct index for structure ( temp sampler)
+0:38                      'aggShadow' ( temp structure{ temp sampler s2D,  temp texture2D tex})
+0:38                      Constant:
+0:38                        0 (const int)
+0:?                     's2.s2D' ( uniform sampler)
+0:38                  move second child to first child ( temp texture2D)
+0:38                    tex: direct index for structure ( temp texture2D)
+0:38                      'aggShadow' ( temp structure{ temp sampler s2D,  temp texture2D tex})
+0:38                      Constant:
+0:38                        1 (const int)
+0:?                     's2.tex' ( uniform texture2D)
+0:38                'aggShadow' ( temp structure{ temp sampler s2D,  temp texture2D tex})
+0:39          Function Call: os2Call2(struct-os2-p1-t211;vf2; ( temp 4-component vector of float)
+0:39            Comma ( temp structure{ temp sampler s2D,  temp texture2D tex})
+0:39              Sequence
+0:39                move second child to first child ( temp sampler)
+0:39                  s2D: direct index for structure ( temp sampler)
+0:39                    'aggShadow' ( temp structure{ temp sampler s2D,  temp texture2D tex})
+0:39                    Constant:
+0:39                      0 (const int)
+0:?                   's2.s2D' ( uniform sampler)
+0:39                move second child to first child ( temp texture2D)
+0:39                  tex: direct index for structure ( temp texture2D)
+0:39                    'aggShadow' ( temp structure{ temp sampler s2D,  temp texture2D tex})
+0:39                    Constant:
+0:39                      1 (const int)
+0:?                   's2.tex' ( uniform texture2D)
+0:39              'aggShadow' ( temp structure{ temp sampler s2D,  temp texture2D tex})
+0:?             Constant:
+0:?               0.200000
+0:?               0.300000
+0:35  Function Definition: main( ( temp void)
+0:35    Function Parameters: 
+0:?     Sequence
+0:35      move second child to first child ( temp 4-component vector of float)
+0:?         '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+0:35        Function Call: @main( ( temp 4-component vector of float)
+0:?   Linker Objects
+0:?     'tex' ( uniform texture2D)
+0:?     's.s2D' ( uniform sampler)
+0:?     's2.s2D' ( uniform sampler)
+0:?     's2.tex' ( uniform texture2D)
+0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+
+
+Linked fragment stage:
+
+
+Shader version: 500
+gl_FragCoord origin is upper left
+0:? Sequence
+0:15  Function Definition: osCall1(struct-os-p11; ( temp 4-component vector of float)
+0:15    Function Parameters: 
+0:15      's' ( in structure{ temp sampler s2D})
+0:?     Sequence
+0:16      Branch: Return with expression
+0:16        texture ( temp 4-component vector of float)
+0:16          Construct combined texture-sampler ( temp sampler2D)
+0:16            'tex' ( uniform texture2D)
+0:16            s2D: direct index for structure ( temp sampler)
+0:16              's' ( in structure{ temp sampler s2D})
+0:16              Constant:
+0:16                0 (const int)
+0:?           Constant:
+0:?             0.200000
+0:?             0.300000
+0:20  Function Definition: osCall2(struct-os-p11;vf2; ( temp 4-component vector of float)
+0:20    Function Parameters: 
+0:20      's' ( in structure{ temp sampler s2D})
+0:20      'f2' ( in 2-component vector of float)
+0:?     Sequence
+0:21      Branch: Return with expression
+0:21        texture ( temp 4-component vector of float)
+0:21          Construct combined texture-sampler ( temp sampler2D)
+0:21            'tex' ( uniform texture2D)
+0:21            s2D: direct index for structure ( temp sampler)
+0:21              's' ( in structure{ temp sampler s2D})
+0:21              Constant:
+0:21                0 (const int)
+0:21          'f2' ( in 2-component vector of float)
+0:25  Function Definition: os2Call1(struct-os2-p1-t211; ( temp 4-component vector of float)
+0:25    Function Parameters: 
+0:25      's' ( in structure{ temp sampler s2D,  temp texture2D tex})
+0:?     Sequence
+0:26      Branch: Return with expression
+0:26        texture ( temp 4-component vector of float)
+0:26          Construct combined texture-sampler ( temp sampler2D)
+0:26            tex: direct index for structure ( temp texture2D)
+0:26              's' ( in structure{ temp sampler s2D,  temp texture2D tex})
+0:26              Constant:
+0:26                1 (const int)
+0:26            s2D: direct index for structure ( temp sampler)
+0:26              's' ( in structure{ temp sampler s2D,  temp texture2D tex})
+0:26              Constant:
+0:26                0 (const int)
+0:?           Constant:
+0:?             0.200000
+0:?             0.300000
+0:30  Function Definition: os2Call2(struct-os2-p1-t211;vf2; ( temp 4-component vector of float)
+0:30    Function Parameters: 
+0:30      's' ( in structure{ temp sampler s2D,  temp texture2D tex})
+0:30      'f2' ( in 2-component vector of float)
+0:?     Sequence
+0:31      Branch: Return with expression
+0:31        texture ( temp 4-component vector of float)
+0:31          Construct combined texture-sampler ( temp sampler2D)
+0:31            tex: direct index for structure ( temp texture2D)
+0:31              's' ( in structure{ temp sampler s2D,  temp texture2D tex})
+0:31              Constant:
+0:31                1 (const int)
+0:31            s2D: direct index for structure ( temp sampler)
+0:31              's' ( in structure{ temp sampler s2D,  temp texture2D tex})
+0:31              Constant:
+0:31                0 (const int)
+0:31          'f2' ( in 2-component vector of float)
+0:35  Function Definition: @main( ( temp 4-component vector of float)
+0:35    Function Parameters: 
+0:?     Sequence
+0:39      Branch: Return with expression
+0:38        add ( temp 4-component vector of float)
+0:37          add ( temp 4-component vector of float)
+0:36            add ( temp 4-component vector of float)
+0:36              Function Call: osCall1(struct-os-p11; ( temp 4-component vector of float)
+0:36                Comma ( temp structure{ temp sampler s2D})
+0:36                  Sequence
+0:36                    move second child to first child ( temp sampler)
+0:36                      s2D: direct index for structure ( temp sampler)
+0:36                        'aggShadow' ( temp structure{ temp sampler s2D})
+0:36                        Constant:
+0:36                          0 (const int)
+0:?                       's.s2D' ( uniform sampler)
+0:36                  'aggShadow' ( temp structure{ temp sampler s2D})
+0:37              Function Call: osCall2(struct-os-p11;vf2; ( temp 4-component vector of float)
+0:37                Comma ( temp structure{ temp sampler s2D})
+0:37                  Sequence
+0:37                    move second child to first child ( temp sampler)
+0:37                      s2D: direct index for structure ( temp sampler)
+0:37                        'aggShadow' ( temp structure{ temp sampler s2D})
+0:37                        Constant:
+0:37                          0 (const int)
+0:?                       's.s2D' ( uniform sampler)
+0:37                  'aggShadow' ( temp structure{ temp sampler s2D})
+0:?                 Constant:
+0:?                   0.200000
+0:?                   0.300000
+0:38            Function Call: os2Call1(struct-os2-p1-t211; ( temp 4-component vector of float)
+0:38              Comma ( temp structure{ temp sampler s2D,  temp texture2D tex})
+0:38                Sequence
+0:38                  move second child to first child ( temp sampler)
+0:38                    s2D: direct index for structure ( temp sampler)
+0:38                      'aggShadow' ( temp structure{ temp sampler s2D,  temp texture2D tex})
+0:38                      Constant:
+0:38                        0 (const int)
+0:?                     's2.s2D' ( uniform sampler)
+0:38                  move second child to first child ( temp texture2D)
+0:38                    tex: direct index for structure ( temp texture2D)
+0:38                      'aggShadow' ( temp structure{ temp sampler s2D,  temp texture2D tex})
+0:38                      Constant:
+0:38                        1 (const int)
+0:?                     's2.tex' ( uniform texture2D)
+0:38                'aggShadow' ( temp structure{ temp sampler s2D,  temp texture2D tex})
+0:39          Function Call: os2Call2(struct-os2-p1-t211;vf2; ( temp 4-component vector of float)
+0:39            Comma ( temp structure{ temp sampler s2D,  temp texture2D tex})
+0:39              Sequence
+0:39                move second child to first child ( temp sampler)
+0:39                  s2D: direct index for structure ( temp sampler)
+0:39                    'aggShadow' ( temp structure{ temp sampler s2D,  temp texture2D tex})
+0:39                    Constant:
+0:39                      0 (const int)
+0:?                   's2.s2D' ( uniform sampler)
+0:39                move second child to first child ( temp texture2D)
+0:39                  tex: direct index for structure ( temp texture2D)
+0:39                    'aggShadow' ( temp structure{ temp sampler s2D,  temp texture2D tex})
+0:39                    Constant:
+0:39                      1 (const int)
+0:?                   's2.tex' ( uniform texture2D)
+0:39              'aggShadow' ( temp structure{ temp sampler s2D,  temp texture2D tex})
+0:?             Constant:
+0:?               0.200000
+0:?               0.300000
+0:35  Function Definition: main( ( temp void)
+0:35    Function Parameters: 
+0:?     Sequence
+0:35      move second child to first child ( temp 4-component vector of float)
+0:?         '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+0:35        Function Call: @main( ( temp 4-component vector of float)
+0:?   Linker Objects
+0:?     'tex' ( uniform texture2D)
+0:?     's.s2D' ( uniform sampler)
+0:?     's2.s2D' ( uniform sampler)
+0:?     's2.tex' ( uniform texture2D)
+0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 122
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 120
+                              ExecutionMode 4 OriginUpperLeft
+                              Source HLSL 500
+                              Name 4  "main"
+                              Name 7  "os"
+                              MemberName 7(os) 0  "s2D"
+                              Name 13  "osCall1(struct-os-p11;"
+                              Name 12  "s"
+                              Name 20  "osCall2(struct-os-p11;vf2;"
+                              Name 18  "s"
+                              Name 19  "f2"
+                              Name 23  "os2"
+                              MemberName 23(os2) 0  "s2D"
+                              MemberName 23(os2) 1  "tex"
+                              Name 27  "os2Call1(struct-os2-p1-t211;"
+                              Name 26  "s"
+                              Name 32  "os2Call2(struct-os2-p1-t211;vf2;"
+                              Name 30  "s"
+                              Name 31  "f2"
+                              Name 35  "@main("
+                              Name 38  "tex"
+                              Name 80  "aggShadow"
+                              Name 82  "s.s2D"
+                              Name 85  "param"
+                              Name 88  "aggShadow"
+                              Name 91  "param"
+                              Name 93  "param"
+                              Name 96  "aggShadow"
+                              Name 97  "s2.s2D"
+                              Name 100  "s2.tex"
+                              Name 103  "param"
+                              Name 107  "aggShadow"
+                              Name 112  "param"
+                              Name 114  "param"
+                              Name 120  "@entryPointOutput"
+                              Decorate 38(tex) DescriptorSet 0
+                              Decorate 82(s.s2D) DescriptorSet 0
+                              Decorate 97(s2.s2D) DescriptorSet 0
+                              Decorate 100(s2.tex) DescriptorSet 0
+                              Decorate 120(@entryPointOutput) Location 0
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeSampler
+           7(os):             TypeStruct 6
+               8:             TypePointer Function 7(os)
+               9:             TypeFloat 32
+              10:             TypeVector 9(float) 4
+              11:             TypeFunction 10(fvec4) 8(ptr)
+              15:             TypeVector 9(float) 2
+              16:             TypePointer Function 15(fvec2)
+              17:             TypeFunction 10(fvec4) 8(ptr) 16(ptr)
+              22:             TypeImage 9(float) 2D sampled format:Unknown
+         23(os2):             TypeStruct 6 22
+              24:             TypePointer Function 23(os2)
+              25:             TypeFunction 10(fvec4) 24(ptr)
+              29:             TypeFunction 10(fvec4) 24(ptr) 16(ptr)
+              34:             TypeFunction 10(fvec4)
+              37:             TypePointer UniformConstant 22
+         38(tex):     37(ptr) Variable UniformConstant
+              40:             TypeInt 32 1
+              41:     40(int) Constant 0
+              42:             TypePointer Function 6
+              45:             TypeSampledImage 22
+              47:    9(float) Constant 1045220557
+              48:    9(float) Constant 1050253722
+              49:   15(fvec2) ConstantComposite 47 48
+              61:     40(int) Constant 1
+              62:             TypePointer Function 22
+              81:             TypePointer UniformConstant 6
+       82(s.s2D):     81(ptr) Variable UniformConstant
+      97(s2.s2D):     81(ptr) Variable UniformConstant
+     100(s2.tex):     37(ptr) Variable UniformConstant
+             119:             TypePointer Output 10(fvec4)
+120(@entryPointOutput):    119(ptr) Variable Output
+         4(main):           2 Function None 3
+               5:             Label
+             121:   10(fvec4) FunctionCall 35(@main()
+                              Store 120(@entryPointOutput) 121
+                              Return
+                              FunctionEnd
+13(osCall1(struct-os-p11;):   10(fvec4) Function None 11
+           12(s):      8(ptr) FunctionParameter
+              14:             Label
+              39:          22 Load 38(tex)
+              43:     42(ptr) AccessChain 12(s) 41
+              44:           6 Load 43
+              46:          45 SampledImage 39 44
+              50:   10(fvec4) ImageSampleImplicitLod 46 49
+                              ReturnValue 50
+                              FunctionEnd
+20(osCall2(struct-os-p11;vf2;):   10(fvec4) Function None 17
+           18(s):      8(ptr) FunctionParameter
+          19(f2):     16(ptr) FunctionParameter
+              21:             Label
+              53:          22 Load 38(tex)
+              54:     42(ptr) AccessChain 18(s) 41
+              55:           6 Load 54
+              56:          45 SampledImage 53 55
+              57:   15(fvec2) Load 19(f2)
+              58:   10(fvec4) ImageSampleImplicitLod 56 57
+                              ReturnValue 58
+                              FunctionEnd
+27(os2Call1(struct-os2-p1-t211;):   10(fvec4) Function None 25
+           26(s):     24(ptr) FunctionParameter
+              28:             Label
+              63:     62(ptr) AccessChain 26(s) 61
+              64:          22 Load 63
+              65:     42(ptr) AccessChain 26(s) 41
+              66:           6 Load 65
+              67:          45 SampledImage 64 66
+              68:   10(fvec4) ImageSampleImplicitLod 67 49
+                              ReturnValue 68
+                              FunctionEnd
+32(os2Call2(struct-os2-p1-t211;vf2;):   10(fvec4) Function None 29
+           30(s):     24(ptr) FunctionParameter
+          31(f2):     16(ptr) FunctionParameter
+              33:             Label
+              71:     62(ptr) AccessChain 30(s) 61
+              72:          22 Load 71
+              73:     42(ptr) AccessChain 30(s) 41
+              74:           6 Load 73
+              75:          45 SampledImage 72 74
+              76:   15(fvec2) Load 31(f2)
+              77:   10(fvec4) ImageSampleImplicitLod 75 76
+                              ReturnValue 77
+                              FunctionEnd
+      35(@main():   10(fvec4) Function None 34
+              36:             Label
+   80(aggShadow):      8(ptr) Variable Function
+       85(param):      8(ptr) Variable Function
+   88(aggShadow):      8(ptr) Variable Function
+       91(param):      8(ptr) Variable Function
+       93(param):     16(ptr) Variable Function
+   96(aggShadow):     24(ptr) Variable Function
+      103(param):     24(ptr) Variable Function
+  107(aggShadow):     24(ptr) Variable Function
+      112(param):     24(ptr) Variable Function
+      114(param):     16(ptr) Variable Function
+              83:           6 Load 82(s.s2D)
+              84:     42(ptr) AccessChain 80(aggShadow) 41
+                              Store 84 83
+              86:       7(os) Load 80(aggShadow)
+                              Store 85(param) 86
+              87:   10(fvec4) FunctionCall 13(osCall1(struct-os-p11;) 85(param)
+              89:           6 Load 82(s.s2D)
+              90:     42(ptr) AccessChain 88(aggShadow) 41
+                              Store 90 89
+              92:       7(os) Load 88(aggShadow)
+                              Store 91(param) 92
+                              Store 93(param) 49
+              94:   10(fvec4) FunctionCall 20(osCall2(struct-os-p11;vf2;) 91(param) 93(param)
+              95:   10(fvec4) FAdd 87 94
+              98:           6 Load 97(s2.s2D)
+              99:     42(ptr) AccessChain 96(aggShadow) 41
+                              Store 99 98
+             101:          22 Load 100(s2.tex)
+             102:     62(ptr) AccessChain 96(aggShadow) 61
+                              Store 102 101
+             104:     23(os2) Load 96(aggShadow)
+                              Store 103(param) 104
+             105:   10(fvec4) FunctionCall 27(os2Call1(struct-os2-p1-t211;) 103(param)
+             106:   10(fvec4) FAdd 95 105
+             108:           6 Load 97(s2.s2D)
+             109:     42(ptr) AccessChain 107(aggShadow) 41
+                              Store 109 108
+             110:          22 Load 100(s2.tex)
+             111:     62(ptr) AccessChain 107(aggShadow) 61
+                              Store 111 110
+             113:     23(os2) Load 107(aggShadow)
+                              Store 112(param) 113
+                              Store 114(param) 49
+             115:   10(fvec4) FunctionCall 32(os2Call2(struct-os2-p1-t211;vf2;) 112(param) 114(param)
+             116:   10(fvec4) FAdd 106 115
+                              ReturnValue 116
+                              FunctionEnd
diff --git a/Test/baseResults/hlsl.flattenOpaqueInit.vert.out b/Test/baseResults/hlsl.flattenOpaqueInit.vert.out
new file mode 100644
index 0000000..29da844
--- /dev/null
+++ b/Test/baseResults/hlsl.flattenOpaqueInit.vert.out
@@ -0,0 +1,291 @@
+hlsl.flattenOpaqueInit.vert
+WARNING: AST will form illegal SPIR-V; need to transform to legalize
+Shader version: 500
+0:? Sequence
+0:5  Function Definition: lookUp(struct-FxaaTex-p1-t211; ( temp 4-component vector of float)
+0:5    Function Parameters: 
+0:5      'tex' ( in structure{ temp sampler smpl,  temp texture2D tex})
+0:?     Sequence
+0:6      Branch: Return with expression
+0:6        texture ( temp 4-component vector of float)
+0:6          Construct combined texture-sampler ( temp sampler2D)
+0:6            tex: direct index for structure ( temp texture2D)
+0:6              'tex' ( in structure{ temp sampler smpl,  temp texture2D tex})
+0:6              Constant:
+0:6                1 (const int)
+0:6            smpl: direct index for structure ( temp sampler)
+0:6              'tex' ( in structure{ temp sampler smpl,  temp texture2D tex})
+0:6              Constant:
+0:6                0 (const int)
+0:?           Constant:
+0:?             0.300000
+0:?             0.400000
+0:10  Function Definition: fillOpaque( ( temp structure{ temp sampler smpl,  temp texture2D tex})
+0:10    Function Parameters: 
+0:?     Sequence
+0:12      move second child to first child ( temp sampler)
+0:12        smpl: direct index for structure ( temp sampler)
+0:12          't' ( temp structure{ temp sampler smpl,  temp texture2D tex})
+0:12          Constant:
+0:12            0 (const int)
+0:12        'g_tInputTexture_sampler' ( uniform sampler)
+0:13      move second child to first child ( temp texture2D)
+0:13        tex: direct index for structure ( temp texture2D)
+0:13          't' ( temp structure{ temp sampler smpl,  temp texture2D tex})
+0:13          Constant:
+0:13            1 (const int)
+0:13        'g_tInputTexture' ( uniform texture2D)
+0:14      Branch: Return with expression
+0:14        't' ( temp structure{ temp sampler smpl,  temp texture2D tex})
+0:18  Function Definition: @main( ( temp 4-component vector of float)
+0:18    Function Parameters: 
+0:?     Sequence
+0:19      Sequence
+0:19        move second child to first child ( temp structure{ temp sampler smpl,  temp texture2D tex})
+0:19          'tex1' ( temp structure{ temp sampler smpl,  temp texture2D tex})
+0:19          Construct structure ( temp structure{ temp sampler smpl,  temp texture2D tex})
+0:19            'g_tInputTexture_sampler' ( uniform sampler)
+0:19            'g_tInputTexture' ( uniform texture2D)
+0:20      Sequence
+0:20        move second child to first child ( temp 4-component vector of float)
+0:20          'res' ( temp 4-component vector of float)
+0:20          Function Call: lookUp(struct-FxaaTex-p1-t211; ( temp 4-component vector of float)
+0:20            'tex1' ( temp structure{ temp sampler smpl,  temp texture2D tex})
+0:21      Sequence
+0:21        move second child to first child ( temp structure{ temp sampler smpl,  temp texture2D tex})
+0:21          'tex2' ( temp structure{ temp sampler smpl,  temp texture2D tex})
+0:21          Function Call: fillOpaque( ( temp structure{ temp sampler smpl,  temp texture2D tex})
+0:22      add second child into first child ( temp 4-component vector of float)
+0:22        'res' ( temp 4-component vector of float)
+0:22        Function Call: lookUp(struct-FxaaTex-p1-t211; ( temp 4-component vector of float)
+0:22          'tex2' ( temp structure{ temp sampler smpl,  temp texture2D tex})
+0:23      Sequence
+0:23        move second child to first child ( temp structure{ temp sampler smpl,  temp texture2D tex})
+0:23          'tex3' ( temp structure{ temp sampler smpl,  temp texture2D tex})
+0:23          'tex1' ( temp structure{ temp sampler smpl,  temp texture2D tex})
+0:24      add second child into first child ( temp 4-component vector of float)
+0:24        'res' ( temp 4-component vector of float)
+0:24        Function Call: lookUp(struct-FxaaTex-p1-t211; ( temp 4-component vector of float)
+0:24          'tex3' ( temp structure{ temp sampler smpl,  temp texture2D tex})
+0:26      Branch: Return with expression
+0:26        'res' ( temp 4-component vector of float)
+0:18  Function Definition: main( ( temp void)
+0:18    Function Parameters: 
+0:?     Sequence
+0:18      move second child to first child ( temp 4-component vector of float)
+0:?         '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+0:18        Function Call: @main( ( temp 4-component vector of float)
+0:?   Linker Objects
+0:?     'g_tInputTexture_sampler' ( uniform sampler)
+0:?     'g_tInputTexture' ( uniform texture2D)
+0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+
+
+Linked vertex stage:
+
+
+Shader version: 500
+0:? Sequence
+0:5  Function Definition: lookUp(struct-FxaaTex-p1-t211; ( temp 4-component vector of float)
+0:5    Function Parameters: 
+0:5      'tex' ( in structure{ temp sampler smpl,  temp texture2D tex})
+0:?     Sequence
+0:6      Branch: Return with expression
+0:6        texture ( temp 4-component vector of float)
+0:6          Construct combined texture-sampler ( temp sampler2D)
+0:6            tex: direct index for structure ( temp texture2D)
+0:6              'tex' ( in structure{ temp sampler smpl,  temp texture2D tex})
+0:6              Constant:
+0:6                1 (const int)
+0:6            smpl: direct index for structure ( temp sampler)
+0:6              'tex' ( in structure{ temp sampler smpl,  temp texture2D tex})
+0:6              Constant:
+0:6                0 (const int)
+0:?           Constant:
+0:?             0.300000
+0:?             0.400000
+0:10  Function Definition: fillOpaque( ( temp structure{ temp sampler smpl,  temp texture2D tex})
+0:10    Function Parameters: 
+0:?     Sequence
+0:12      move second child to first child ( temp sampler)
+0:12        smpl: direct index for structure ( temp sampler)
+0:12          't' ( temp structure{ temp sampler smpl,  temp texture2D tex})
+0:12          Constant:
+0:12            0 (const int)
+0:12        'g_tInputTexture_sampler' ( uniform sampler)
+0:13      move second child to first child ( temp texture2D)
+0:13        tex: direct index for structure ( temp texture2D)
+0:13          't' ( temp structure{ temp sampler smpl,  temp texture2D tex})
+0:13          Constant:
+0:13            1 (const int)
+0:13        'g_tInputTexture' ( uniform texture2D)
+0:14      Branch: Return with expression
+0:14        't' ( temp structure{ temp sampler smpl,  temp texture2D tex})
+0:18  Function Definition: @main( ( temp 4-component vector of float)
+0:18    Function Parameters: 
+0:?     Sequence
+0:19      Sequence
+0:19        move second child to first child ( temp structure{ temp sampler smpl,  temp texture2D tex})
+0:19          'tex1' ( temp structure{ temp sampler smpl,  temp texture2D tex})
+0:19          Construct structure ( temp structure{ temp sampler smpl,  temp texture2D tex})
+0:19            'g_tInputTexture_sampler' ( uniform sampler)
+0:19            'g_tInputTexture' ( uniform texture2D)
+0:20      Sequence
+0:20        move second child to first child ( temp 4-component vector of float)
+0:20          'res' ( temp 4-component vector of float)
+0:20          Function Call: lookUp(struct-FxaaTex-p1-t211; ( temp 4-component vector of float)
+0:20            'tex1' ( temp structure{ temp sampler smpl,  temp texture2D tex})
+0:21      Sequence
+0:21        move second child to first child ( temp structure{ temp sampler smpl,  temp texture2D tex})
+0:21          'tex2' ( temp structure{ temp sampler smpl,  temp texture2D tex})
+0:21          Function Call: fillOpaque( ( temp structure{ temp sampler smpl,  temp texture2D tex})
+0:22      add second child into first child ( temp 4-component vector of float)
+0:22        'res' ( temp 4-component vector of float)
+0:22        Function Call: lookUp(struct-FxaaTex-p1-t211; ( temp 4-component vector of float)
+0:22          'tex2' ( temp structure{ temp sampler smpl,  temp texture2D tex})
+0:23      Sequence
+0:23        move second child to first child ( temp structure{ temp sampler smpl,  temp texture2D tex})
+0:23          'tex3' ( temp structure{ temp sampler smpl,  temp texture2D tex})
+0:23          'tex1' ( temp structure{ temp sampler smpl,  temp texture2D tex})
+0:24      add second child into first child ( temp 4-component vector of float)
+0:24        'res' ( temp 4-component vector of float)
+0:24        Function Call: lookUp(struct-FxaaTex-p1-t211; ( temp 4-component vector of float)
+0:24          'tex3' ( temp structure{ temp sampler smpl,  temp texture2D tex})
+0:26      Branch: Return with expression
+0:26        'res' ( temp 4-component vector of float)
+0:18  Function Definition: main( ( temp void)
+0:18    Function Parameters: 
+0:?     Sequence
+0:18      move second child to first child ( temp 4-component vector of float)
+0:?         '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+0:18        Function Call: @main( ( temp 4-component vector of float)
+0:?   Linker Objects
+0:?     'g_tInputTexture_sampler' ( uniform sampler)
+0:?     'g_tInputTexture' ( uniform texture2D)
+0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 82
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Vertex 4  "main" 80
+                              Source HLSL 500
+                              Name 4  "main"
+                              Name 9  "FxaaTex"
+                              MemberName 9(FxaaTex) 0  "smpl"
+                              MemberName 9(FxaaTex) 1  "tex"
+                              Name 14  "lookUp(struct-FxaaTex-p1-t211;"
+                              Name 13  "tex"
+                              Name 17  "fillOpaque("
+                              Name 20  "@main("
+                              Name 41  "t"
+                              Name 43  "g_tInputTexture_sampler"
+                              Name 47  "g_tInputTexture"
+                              Name 53  "tex1"
+                              Name 58  "res"
+                              Name 59  "param"
+                              Name 62  "tex2"
+                              Name 64  "param"
+                              Name 69  "tex3"
+                              Name 71  "param"
+                              Name 80  "@entryPointOutput"
+                              Decorate 43(g_tInputTexture_sampler) DescriptorSet 0
+                              Decorate 47(g_tInputTexture) DescriptorSet 0
+                              Decorate 80(@entryPointOutput) Location 0
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeSampler
+               7:             TypeFloat 32
+               8:             TypeImage 7(float) 2D sampled format:Unknown
+      9(FxaaTex):             TypeStruct 6 8
+              10:             TypePointer Function 9(FxaaTex)
+              11:             TypeVector 7(float) 4
+              12:             TypeFunction 11(fvec4) 10(ptr)
+              16:             TypeFunction 9(FxaaTex)
+              19:             TypeFunction 11(fvec4)
+              22:             TypeInt 32 1
+              23:     22(int) Constant 1
+              24:             TypePointer Function 8
+              27:     22(int) Constant 0
+              28:             TypePointer Function 6
+              31:             TypeSampledImage 8
+              33:             TypeVector 7(float) 2
+              34:    7(float) Constant 1050253722
+              35:    7(float) Constant 1053609165
+              36:   33(fvec2) ConstantComposite 34 35
+              37:    7(float) Constant 0
+              42:             TypePointer UniformConstant 6
+43(g_tInputTexture_sampler):     42(ptr) Variable UniformConstant
+              46:             TypePointer UniformConstant 8
+47(g_tInputTexture):     46(ptr) Variable UniformConstant
+              57:             TypePointer Function 11(fvec4)
+              79:             TypePointer Output 11(fvec4)
+80(@entryPointOutput):     79(ptr) Variable Output
+         4(main):           2 Function None 3
+               5:             Label
+              81:   11(fvec4) FunctionCall 20(@main()
+                              Store 80(@entryPointOutput) 81
+                              Return
+                              FunctionEnd
+14(lookUp(struct-FxaaTex-p1-t211;):   11(fvec4) Function None 12
+         13(tex):     10(ptr) FunctionParameter
+              15:             Label
+              25:     24(ptr) AccessChain 13(tex) 23
+              26:           8 Load 25
+              29:     28(ptr) AccessChain 13(tex) 27
+              30:           6 Load 29
+              32:          31 SampledImage 26 30
+              38:   11(fvec4) ImageSampleExplicitLod 32 36 Lod 37
+                              ReturnValue 38
+                              FunctionEnd
+ 17(fillOpaque():  9(FxaaTex) Function None 16
+              18:             Label
+           41(t):     10(ptr) Variable Function
+              44:           6 Load 43(g_tInputTexture_sampler)
+              45:     28(ptr) AccessChain 41(t) 27
+                              Store 45 44
+              48:           8 Load 47(g_tInputTexture)
+              49:     24(ptr) AccessChain 41(t) 23
+                              Store 49 48
+              50:  9(FxaaTex) Load 41(t)
+                              ReturnValue 50
+                              FunctionEnd
+      20(@main():   11(fvec4) Function None 19
+              21:             Label
+        53(tex1):     10(ptr) Variable Function
+         58(res):     57(ptr) Variable Function
+       59(param):     10(ptr) Variable Function
+        62(tex2):     10(ptr) Variable Function
+       64(param):     10(ptr) Variable Function
+        69(tex3):     10(ptr) Variable Function
+       71(param):     10(ptr) Variable Function
+              54:           6 Load 43(g_tInputTexture_sampler)
+              55:           8 Load 47(g_tInputTexture)
+              56:  9(FxaaTex) CompositeConstruct 54 55
+                              Store 53(tex1) 56
+              60:  9(FxaaTex) Load 53(tex1)
+                              Store 59(param) 60
+              61:   11(fvec4) FunctionCall 14(lookUp(struct-FxaaTex-p1-t211;) 59(param)
+                              Store 58(res) 61
+              63:  9(FxaaTex) FunctionCall 17(fillOpaque()
+                              Store 62(tex2) 63
+              65:  9(FxaaTex) Load 62(tex2)
+                              Store 64(param) 65
+              66:   11(fvec4) FunctionCall 14(lookUp(struct-FxaaTex-p1-t211;) 64(param)
+              67:   11(fvec4) Load 58(res)
+              68:   11(fvec4) FAdd 67 66
+                              Store 58(res) 68
+              70:  9(FxaaTex) Load 53(tex1)
+                              Store 69(tex3) 70
+              72:  9(FxaaTex) Load 69(tex3)
+                              Store 71(param) 72
+              73:   11(fvec4) FunctionCall 14(lookUp(struct-FxaaTex-p1-t211;) 71(param)
+              74:   11(fvec4) Load 58(res)
+              75:   11(fvec4) FAdd 74 73
+                              Store 58(res) 75
+              76:   11(fvec4) Load 58(res)
+                              ReturnValue 76
+                              FunctionEnd
diff --git a/Test/baseResults/hlsl.flattenOpaqueInitMix.vert.out b/Test/baseResults/hlsl.flattenOpaqueInitMix.vert.out
new file mode 100644
index 0000000..bf95980
--- /dev/null
+++ b/Test/baseResults/hlsl.flattenOpaqueInitMix.vert.out
@@ -0,0 +1,195 @@
+hlsl.flattenOpaqueInitMix.vert
+WARNING: AST will form illegal SPIR-V; need to transform to legalize
+Shader version: 500
+0:? Sequence
+0:5  Function Definition: lookUp(struct-FxaaTex-p1-t21-f11; ( temp 4-component vector of float)
+0:5    Function Parameters: 
+0:5      'tex' ( in structure{ temp sampler smpl,  temp texture2D tex,  temp float f})
+0:?     Sequence
+0:6      Branch: Return with expression
+0:6        texture ( temp 4-component vector of float)
+0:6          Construct combined texture-sampler ( temp sampler2D)
+0:6            tex: direct index for structure ( temp texture2D)
+0:6              'tex' ( in structure{ temp sampler smpl,  temp texture2D tex,  temp float f})
+0:6              Constant:
+0:6                1 (const int)
+0:6            smpl: direct index for structure ( temp sampler)
+0:6              'tex' ( in structure{ temp sampler smpl,  temp texture2D tex,  temp float f})
+0:6              Constant:
+0:6                0 (const int)
+0:?           Construct vec2 ( temp 2-component vector of float)
+0:6            f: direct index for structure ( temp float)
+0:6              'tex' ( in structure{ temp sampler smpl,  temp texture2D tex,  temp float f})
+0:6              Constant:
+0:6                2 (const int)
+0:6            f: direct index for structure ( temp float)
+0:6              'tex' ( in structure{ temp sampler smpl,  temp texture2D tex,  temp float f})
+0:6              Constant:
+0:6                2 (const int)
+0:10  Function Definition: @main( ( temp 4-component vector of float)
+0:10    Function Parameters: 
+0:?     Sequence
+0:11      Sequence
+0:11        move second child to first child ( temp structure{ temp sampler smpl,  temp texture2D tex,  temp float f})
+0:11          'tex' ( temp structure{ temp sampler smpl,  temp texture2D tex,  temp float f})
+0:11          Construct structure ( temp structure{ temp sampler smpl,  temp texture2D tex,  temp float f})
+0:11            'g_tInputTexture_sampler' ( uniform sampler)
+0:11            'g_tInputTexture' ( uniform texture2D)
+0:11            Constant:
+0:11              0.500000
+0:12      Branch: Return with expression
+0:12        Function Call: lookUp(struct-FxaaTex-p1-t21-f11; ( temp 4-component vector of float)
+0:12          'tex' ( temp structure{ temp sampler smpl,  temp texture2D tex,  temp float f})
+0:10  Function Definition: main( ( temp void)
+0:10    Function Parameters: 
+0:?     Sequence
+0:10      move second child to first child ( temp 4-component vector of float)
+0:?         '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+0:10        Function Call: @main( ( temp 4-component vector of float)
+0:?   Linker Objects
+0:?     'g_tInputTexture_sampler' ( uniform sampler)
+0:?     'g_tInputTexture' ( uniform texture2D)
+0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+
+
+Linked vertex stage:
+
+
+Shader version: 500
+0:? Sequence
+0:5  Function Definition: lookUp(struct-FxaaTex-p1-t21-f11; ( temp 4-component vector of float)
+0:5    Function Parameters: 
+0:5      'tex' ( in structure{ temp sampler smpl,  temp texture2D tex,  temp float f})
+0:?     Sequence
+0:6      Branch: Return with expression
+0:6        texture ( temp 4-component vector of float)
+0:6          Construct combined texture-sampler ( temp sampler2D)
+0:6            tex: direct index for structure ( temp texture2D)
+0:6              'tex' ( in structure{ temp sampler smpl,  temp texture2D tex,  temp float f})
+0:6              Constant:
+0:6                1 (const int)
+0:6            smpl: direct index for structure ( temp sampler)
+0:6              'tex' ( in structure{ temp sampler smpl,  temp texture2D tex,  temp float f})
+0:6              Constant:
+0:6                0 (const int)
+0:?           Construct vec2 ( temp 2-component vector of float)
+0:6            f: direct index for structure ( temp float)
+0:6              'tex' ( in structure{ temp sampler smpl,  temp texture2D tex,  temp float f})
+0:6              Constant:
+0:6                2 (const int)
+0:6            f: direct index for structure ( temp float)
+0:6              'tex' ( in structure{ temp sampler smpl,  temp texture2D tex,  temp float f})
+0:6              Constant:
+0:6                2 (const int)
+0:10  Function Definition: @main( ( temp 4-component vector of float)
+0:10    Function Parameters: 
+0:?     Sequence
+0:11      Sequence
+0:11        move second child to first child ( temp structure{ temp sampler smpl,  temp texture2D tex,  temp float f})
+0:11          'tex' ( temp structure{ temp sampler smpl,  temp texture2D tex,  temp float f})
+0:11          Construct structure ( temp structure{ temp sampler smpl,  temp texture2D tex,  temp float f})
+0:11            'g_tInputTexture_sampler' ( uniform sampler)
+0:11            'g_tInputTexture' ( uniform texture2D)
+0:11            Constant:
+0:11              0.500000
+0:12      Branch: Return with expression
+0:12        Function Call: lookUp(struct-FxaaTex-p1-t21-f11; ( temp 4-component vector of float)
+0:12          'tex' ( temp structure{ temp sampler smpl,  temp texture2D tex,  temp float f})
+0:10  Function Definition: main( ( temp void)
+0:10    Function Parameters: 
+0:?     Sequence
+0:10      move second child to first child ( temp 4-component vector of float)
+0:?         '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+0:10        Function Call: @main( ( temp 4-component vector of float)
+0:?   Linker Objects
+0:?     'g_tInputTexture_sampler' ( uniform sampler)
+0:?     'g_tInputTexture' ( uniform texture2D)
+0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 59
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Vertex 4  "main" 57
+                              Source HLSL 500
+                              Name 4  "main"
+                              Name 9  "FxaaTex"
+                              MemberName 9(FxaaTex) 0  "smpl"
+                              MemberName 9(FxaaTex) 1  "tex"
+                              MemberName 9(FxaaTex) 2  "f"
+                              Name 14  "lookUp(struct-FxaaTex-p1-t21-f11;"
+                              Name 13  "tex"
+                              Name 17  "@main("
+                              Name 42  "tex"
+                              Name 44  "g_tInputTexture_sampler"
+                              Name 47  "g_tInputTexture"
+                              Name 51  "param"
+                              Name 57  "@entryPointOutput"
+                              Decorate 44(g_tInputTexture_sampler) DescriptorSet 0
+                              Decorate 47(g_tInputTexture) DescriptorSet 0
+                              Decorate 57(@entryPointOutput) Location 0
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeSampler
+               7:             TypeFloat 32
+               8:             TypeImage 7(float) 2D sampled format:Unknown
+      9(FxaaTex):             TypeStruct 6 8 7(float)
+              10:             TypePointer Function 9(FxaaTex)
+              11:             TypeVector 7(float) 4
+              12:             TypeFunction 11(fvec4) 10(ptr)
+              16:             TypeFunction 11(fvec4)
+              19:             TypeInt 32 1
+              20:     19(int) Constant 1
+              21:             TypePointer Function 8
+              24:     19(int) Constant 0
+              25:             TypePointer Function 6
+              28:             TypeSampledImage 8
+              30:     19(int) Constant 2
+              31:             TypePointer Function 7(float)
+              36:             TypeVector 7(float) 2
+              38:    7(float) Constant 0
+              43:             TypePointer UniformConstant 6
+44(g_tInputTexture_sampler):     43(ptr) Variable UniformConstant
+              46:             TypePointer UniformConstant 8
+47(g_tInputTexture):     46(ptr) Variable UniformConstant
+              49:    7(float) Constant 1056964608
+              56:             TypePointer Output 11(fvec4)
+57(@entryPointOutput):     56(ptr) Variable Output
+         4(main):           2 Function None 3
+               5:             Label
+              58:   11(fvec4) FunctionCall 17(@main()
+                              Store 57(@entryPointOutput) 58
+                              Return
+                              FunctionEnd
+14(lookUp(struct-FxaaTex-p1-t21-f11;):   11(fvec4) Function None 12
+         13(tex):     10(ptr) FunctionParameter
+              15:             Label
+              22:     21(ptr) AccessChain 13(tex) 20
+              23:           8 Load 22
+              26:     25(ptr) AccessChain 13(tex) 24
+              27:           6 Load 26
+              29:          28 SampledImage 23 27
+              32:     31(ptr) AccessChain 13(tex) 30
+              33:    7(float) Load 32
+              34:     31(ptr) AccessChain 13(tex) 30
+              35:    7(float) Load 34
+              37:   36(fvec2) CompositeConstruct 33 35
+              39:   11(fvec4) ImageSampleExplicitLod 29 37 Lod 38
+                              ReturnValue 39
+                              FunctionEnd
+      17(@main():   11(fvec4) Function None 16
+              18:             Label
+         42(tex):     10(ptr) Variable Function
+       51(param):     10(ptr) Variable Function
+              45:           6 Load 44(g_tInputTexture_sampler)
+              48:           8 Load 47(g_tInputTexture)
+              50:  9(FxaaTex) CompositeConstruct 45 48 49
+                              Store 42(tex) 50
+              52:  9(FxaaTex) Load 42(tex)
+                              Store 51(param) 52
+              53:   11(fvec4) FunctionCall 14(lookUp(struct-FxaaTex-p1-t21-f11;) 51(param)
+                              ReturnValue 53
+                              FunctionEnd
diff --git a/Test/baseResults/hlsl.flattenSubset.frag.out b/Test/baseResults/hlsl.flattenSubset.frag.out
new file mode 100644
index 0000000..92e2a96
--- /dev/null
+++ b/Test/baseResults/hlsl.flattenSubset.frag.out
@@ -0,0 +1,216 @@
+hlsl.flattenSubset.frag
+WARNING: AST will form illegal SPIR-V; need to transform to legalize
+Shader version: 500
+gl_FragCoord origin is upper left
+0:? Sequence
+0:30  Function Definition: @main(vf4; ( temp 4-component vector of float)
+0:30    Function Parameters: 
+0:30      'vpos' ( in 4-component vector of float)
+0:?     Sequence
+0:33      move second child to first child ( temp sampler)
+0:33        ss: direct index for structure ( temp sampler)
+0:33          s0: direct index for structure ( temp structure{ temp int x,  temp int y,  temp sampler ss})
+0:33            's1' ( temp structure{ temp float b,  temp sampler samplerState,  temp structure{ temp int x,  temp int y,  temp sampler ss} s0,  temp int a})
+0:33            Constant:
+0:33              2 (const int)
+0:33          Constant:
+0:33            2 (const int)
+0:33        'samp' ( uniform sampler)
+0:34      move second child to first child ( temp structure{ temp float b,  temp sampler samplerState,  temp structure{ temp int x,  temp int y,  temp sampler ss} s0,  temp int a})
+0:34        resources: direct index for structure ( temp structure{ temp float b,  temp sampler samplerState,  temp structure{ temp int x,  temp int y,  temp sampler ss} s0,  temp int a})
+0:34          's2' ( temp structure{ temp int a1,  temp int a2,  temp int a3,  temp int a4,  temp int a5,  temp structure{ temp float b,  temp sampler samplerState,  temp structure{ temp int x,  temp int y,  temp sampler ss} s0,  temp int a} resources})
+0:34          Constant:
+0:34            5 (const int)
+0:34        's1' ( temp structure{ temp float b,  temp sampler samplerState,  temp structure{ temp int x,  temp int y,  temp sampler ss} s0,  temp int a})
+0:35      Branch: Return with expression
+0:35        texture ( temp 4-component vector of float)
+0:35          Construct combined texture-sampler ( temp sampler2D)
+0:35            'tex' ( uniform texture2D)
+0:35            ss: direct index for structure ( temp sampler)
+0:35              s0: direct index for structure ( temp structure{ temp int x,  temp int y,  temp sampler ss})
+0:35                resources: direct index for structure ( temp structure{ temp float b,  temp sampler samplerState,  temp structure{ temp int x,  temp int y,  temp sampler ss} s0,  temp int a})
+0:35                  's2' ( temp structure{ temp int a1,  temp int a2,  temp int a3,  temp int a4,  temp int a5,  temp structure{ temp float b,  temp sampler samplerState,  temp structure{ temp int x,  temp int y,  temp sampler ss} s0,  temp int a} resources})
+0:35                  Constant:
+0:35                    5 (const int)
+0:35                Constant:
+0:35                  2 (const int)
+0:35              Constant:
+0:35                2 (const int)
+0:35          Constant:
+0:35            0.500000
+0:35            0.500000
+0:30  Function Definition: main( ( temp void)
+0:30    Function Parameters: 
+0:?     Sequence
+0:30      move second child to first child ( temp 4-component vector of float)
+0:?         'vpos' ( temp 4-component vector of float)
+0:?         'vpos' (layout( location=0) in 4-component vector of float)
+0:30      move second child to first child ( temp 4-component vector of float)
+0:?         '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+0:30        Function Call: @main(vf4; ( temp 4-component vector of float)
+0:?           'vpos' ( temp 4-component vector of float)
+0:?   Linker Objects
+0:?     'samp' ( uniform sampler)
+0:?     'tex' ( uniform texture2D)
+0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+0:?     'vpos' (layout( location=0) in 4-component vector of float)
+
+
+Linked fragment stage:
+
+
+Shader version: 500
+gl_FragCoord origin is upper left
+0:? Sequence
+0:30  Function Definition: @main(vf4; ( temp 4-component vector of float)
+0:30    Function Parameters: 
+0:30      'vpos' ( in 4-component vector of float)
+0:?     Sequence
+0:33      move second child to first child ( temp sampler)
+0:33        ss: direct index for structure ( temp sampler)
+0:33          s0: direct index for structure ( temp structure{ temp int x,  temp int y,  temp sampler ss})
+0:33            's1' ( temp structure{ temp float b,  temp sampler samplerState,  temp structure{ temp int x,  temp int y,  temp sampler ss} s0,  temp int a})
+0:33            Constant:
+0:33              2 (const int)
+0:33          Constant:
+0:33            2 (const int)
+0:33        'samp' ( uniform sampler)
+0:34      move second child to first child ( temp structure{ temp float b,  temp sampler samplerState,  temp structure{ temp int x,  temp int y,  temp sampler ss} s0,  temp int a})
+0:34        resources: direct index for structure ( temp structure{ temp float b,  temp sampler samplerState,  temp structure{ temp int x,  temp int y,  temp sampler ss} s0,  temp int a})
+0:34          's2' ( temp structure{ temp int a1,  temp int a2,  temp int a3,  temp int a4,  temp int a5,  temp structure{ temp float b,  temp sampler samplerState,  temp structure{ temp int x,  temp int y,  temp sampler ss} s0,  temp int a} resources})
+0:34          Constant:
+0:34            5 (const int)
+0:34        's1' ( temp structure{ temp float b,  temp sampler samplerState,  temp structure{ temp int x,  temp int y,  temp sampler ss} s0,  temp int a})
+0:35      Branch: Return with expression
+0:35        texture ( temp 4-component vector of float)
+0:35          Construct combined texture-sampler ( temp sampler2D)
+0:35            'tex' ( uniform texture2D)
+0:35            ss: direct index for structure ( temp sampler)
+0:35              s0: direct index for structure ( temp structure{ temp int x,  temp int y,  temp sampler ss})
+0:35                resources: direct index for structure ( temp structure{ temp float b,  temp sampler samplerState,  temp structure{ temp int x,  temp int y,  temp sampler ss} s0,  temp int a})
+0:35                  's2' ( temp structure{ temp int a1,  temp int a2,  temp int a3,  temp int a4,  temp int a5,  temp structure{ temp float b,  temp sampler samplerState,  temp structure{ temp int x,  temp int y,  temp sampler ss} s0,  temp int a} resources})
+0:35                  Constant:
+0:35                    5 (const int)
+0:35                Constant:
+0:35                  2 (const int)
+0:35              Constant:
+0:35                2 (const int)
+0:35          Constant:
+0:35            0.500000
+0:35            0.500000
+0:30  Function Definition: main( ( temp void)
+0:30    Function Parameters: 
+0:?     Sequence
+0:30      move second child to first child ( temp 4-component vector of float)
+0:?         'vpos' ( temp 4-component vector of float)
+0:?         'vpos' (layout( location=0) in 4-component vector of float)
+0:30      move second child to first child ( temp 4-component vector of float)
+0:?         '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+0:30        Function Call: @main(vf4; ( temp 4-component vector of float)
+0:?           'vpos' ( temp 4-component vector of float)
+0:?   Linker Objects
+0:?     'samp' ( uniform sampler)
+0:?     'tex' ( uniform texture2D)
+0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+0:?     'vpos' (layout( location=0) in 4-component vector of float)
+
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 54
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 47 50
+                              ExecutionMode 4 OriginUpperLeft
+                              Source HLSL 500
+                              Name 4  "main"
+                              Name 11  "@main(vf4;"
+                              Name 10  "vpos"
+                              Name 15  "S0"
+                              MemberName 15(S0) 0  "x"
+                              MemberName 15(S0) 1  "y"
+                              MemberName 15(S0) 2  "ss"
+                              Name 16  "S1"
+                              MemberName 16(S1) 0  "b"
+                              MemberName 16(S1) 1  "samplerState"
+                              MemberName 16(S1) 2  "s0"
+                              MemberName 16(S1) 3  "a"
+                              Name 18  "s1"
+                              Name 21  "samp"
+                              Name 25  "S2"
+                              MemberName 25(S2) 0  "a1"
+                              MemberName 25(S2) 1  "a2"
+                              MemberName 25(S2) 2  "a3"
+                              MemberName 25(S2) 3  "a4"
+                              MemberName 25(S2) 4  "a5"
+                              MemberName 25(S2) 5  "resources"
+                              Name 27  "s2"
+                              Name 33  "tex"
+                              Name 45  "vpos"
+                              Name 47  "vpos"
+                              Name 50  "@entryPointOutput"
+                              Name 51  "param"
+                              Decorate 21(samp) DescriptorSet 0
+                              Decorate 33(tex) DescriptorSet 0
+                              Decorate 47(vpos) Location 0
+                              Decorate 50(@entryPointOutput) Location 0
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+               8:             TypePointer Function 7(fvec4)
+               9:             TypeFunction 7(fvec4) 8(ptr)
+              13:             TypeSampler
+              14:             TypeInt 32 1
+          15(S0):             TypeStruct 14(int) 14(int) 13
+          16(S1):             TypeStruct 6(float) 13 15(S0) 14(int)
+              17:             TypePointer Function 16(S1)
+              19:     14(int) Constant 2
+              20:             TypePointer UniformConstant 13
+        21(samp):     20(ptr) Variable UniformConstant
+              23:             TypePointer Function 13
+          25(S2):             TypeStruct 14(int) 14(int) 14(int) 14(int) 14(int) 16(S1)
+              26:             TypePointer Function 25(S2)
+              28:     14(int) Constant 5
+              31:             TypeImage 6(float) 2D sampled format:Unknown
+              32:             TypePointer UniformConstant 31
+         33(tex):     32(ptr) Variable UniformConstant
+              37:             TypeSampledImage 31
+              39:             TypeVector 6(float) 2
+              40:    6(float) Constant 1056964608
+              41:   39(fvec2) ConstantComposite 40 40
+              46:             TypePointer Input 7(fvec4)
+        47(vpos):     46(ptr) Variable Input
+              49:             TypePointer Output 7(fvec4)
+50(@entryPointOutput):     49(ptr) Variable Output
+         4(main):           2 Function None 3
+               5:             Label
+        45(vpos):      8(ptr) Variable Function
+       51(param):      8(ptr) Variable Function
+              48:    7(fvec4) Load 47(vpos)
+                              Store 45(vpos) 48
+              52:    7(fvec4) Load 45(vpos)
+                              Store 51(param) 52
+              53:    7(fvec4) FunctionCall 11(@main(vf4;) 51(param)
+                              Store 50(@entryPointOutput) 53
+                              Return
+                              FunctionEnd
+  11(@main(vf4;):    7(fvec4) Function None 9
+        10(vpos):      8(ptr) FunctionParameter
+              12:             Label
+          18(s1):     17(ptr) Variable Function
+          27(s2):     26(ptr) Variable Function
+              22:          13 Load 21(samp)
+              24:     23(ptr) AccessChain 18(s1) 19 19
+                              Store 24 22
+              29:      16(S1) Load 18(s1)
+              30:     17(ptr) AccessChain 27(s2) 28
+                              Store 30 29
+              34:          31 Load 33(tex)
+              35:     23(ptr) AccessChain 27(s2) 28 19 19
+              36:          13 Load 35
+              38:          37 SampledImage 34 36
+              42:    7(fvec4) ImageSampleImplicitLod 38 41
+                              ReturnValue 42
+                              FunctionEnd
diff --git a/Test/baseResults/hlsl.flattenSubset2.frag.out b/Test/baseResults/hlsl.flattenSubset2.frag.out
new file mode 100644
index 0000000..b22734a
--- /dev/null
+++ b/Test/baseResults/hlsl.flattenSubset2.frag.out
@@ -0,0 +1,248 @@
+hlsl.flattenSubset2.frag
+WARNING: AST will form illegal SPIR-V; need to transform to legalize
+Shader version: 500
+gl_FragCoord origin is upper left
+0:? Sequence
+0:8  Function Definition: @main(vf4; ( temp 4-component vector of float)
+0:8    Function Parameters: 
+0:8      'vpos' ( in 4-component vector of float)
+0:?     Sequence
+0:13      move second child to first child ( temp structure{ temp float y,  temp texture2D texNested})
+0:13        n: direct index for structure ( temp structure{ temp float y,  temp texture2D texNested})
+0:13          'a1' ( temp structure{ temp structure{ temp float y,  temp texture2D texNested} n,  temp float x})
+0:13          Constant:
+0:13            0 (const int)
+0:13        n: direct index for structure ( temp structure{ temp float y,  temp texture2D texNested})
+0:13          'a2' ( temp structure{ temp structure{ temp float y,  temp texture2D texNested} n,  temp float x})
+0:13          Constant:
+0:13            0 (const int)
+0:14      move second child to first child ( temp structure{ temp float y,  temp texture2D texNested})
+0:14        n: direct index for structure ( temp structure{ temp float y,  temp texture2D texNested})
+0:14          'b' ( temp structure{ temp structure{ temp float y,  temp texture2D texNested} n,  temp texture2D tex})
+0:14          Constant:
+0:14            0 (const int)
+0:14        n: direct index for structure ( temp structure{ temp float y,  temp texture2D texNested})
+0:14          'a1' ( temp structure{ temp structure{ temp float y,  temp texture2D texNested} n,  temp float x})
+0:14          Constant:
+0:14            0 (const int)
+0:17      Sequence
+0:17        move second child to first child ( temp structure{ temp float y,  temp texture2D texNested})
+0:17          'n' ( temp structure{ temp float y,  temp texture2D texNested})
+0:17          n: direct index for structure ( temp structure{ temp float y,  temp texture2D texNested})
+0:17            'b' ( temp structure{ temp structure{ temp float y,  temp texture2D texNested} n,  temp texture2D tex})
+0:17            Constant:
+0:17              0 (const int)
+0:20      move second child to first child ( temp texture2D)
+0:20        texNested: direct index for structure ( temp texture2D)
+0:20          n: direct index for structure ( temp structure{ temp float y,  temp texture2D texNested})
+0:20            'a2' ( temp structure{ temp structure{ temp float y,  temp texture2D texNested} n,  temp float x})
+0:20            Constant:
+0:20              0 (const int)
+0:20          Constant:
+0:20            1 (const int)
+0:20        'someTex' ( uniform texture2D)
+0:21      move second child to first child ( temp float)
+0:21        y: direct index for structure ( temp float)
+0:21          n: direct index for structure ( temp structure{ temp float y,  temp texture2D texNested})
+0:21            'a1' ( temp structure{ temp structure{ temp float y,  temp texture2D texNested} n,  temp float x})
+0:21            Constant:
+0:21              0 (const int)
+0:21          Constant:
+0:21            0 (const int)
+0:21        Constant:
+0:21          1.000000
+0:23      Branch: Return with expression
+0:?         Constant:
+0:?           0.000000
+0:?           0.000000
+0:?           0.000000
+0:?           0.000000
+0:8  Function Definition: main( ( temp void)
+0:8    Function Parameters: 
+0:?     Sequence
+0:8      move second child to first child ( temp 4-component vector of float)
+0:?         'vpos' ( temp 4-component vector of float)
+0:?         'vpos' (layout( location=0) in 4-component vector of float)
+0:8      move second child to first child ( temp 4-component vector of float)
+0:?         '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+0:8        Function Call: @main(vf4; ( temp 4-component vector of float)
+0:?           'vpos' ( temp 4-component vector of float)
+0:?   Linker Objects
+0:?     'someTex' ( uniform texture2D)
+0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+0:?     'vpos' (layout( location=0) in 4-component vector of float)
+
+
+Linked fragment stage:
+
+
+Shader version: 500
+gl_FragCoord origin is upper left
+0:? Sequence
+0:8  Function Definition: @main(vf4; ( temp 4-component vector of float)
+0:8    Function Parameters: 
+0:8      'vpos' ( in 4-component vector of float)
+0:?     Sequence
+0:13      move second child to first child ( temp structure{ temp float y,  temp texture2D texNested})
+0:13        n: direct index for structure ( temp structure{ temp float y,  temp texture2D texNested})
+0:13          'a1' ( temp structure{ temp structure{ temp float y,  temp texture2D texNested} n,  temp float x})
+0:13          Constant:
+0:13            0 (const int)
+0:13        n: direct index for structure ( temp structure{ temp float y,  temp texture2D texNested})
+0:13          'a2' ( temp structure{ temp structure{ temp float y,  temp texture2D texNested} n,  temp float x})
+0:13          Constant:
+0:13            0 (const int)
+0:14      move second child to first child ( temp structure{ temp float y,  temp texture2D texNested})
+0:14        n: direct index for structure ( temp structure{ temp float y,  temp texture2D texNested})
+0:14          'b' ( temp structure{ temp structure{ temp float y,  temp texture2D texNested} n,  temp texture2D tex})
+0:14          Constant:
+0:14            0 (const int)
+0:14        n: direct index for structure ( temp structure{ temp float y,  temp texture2D texNested})
+0:14          'a1' ( temp structure{ temp structure{ temp float y,  temp texture2D texNested} n,  temp float x})
+0:14          Constant:
+0:14            0 (const int)
+0:17      Sequence
+0:17        move second child to first child ( temp structure{ temp float y,  temp texture2D texNested})
+0:17          'n' ( temp structure{ temp float y,  temp texture2D texNested})
+0:17          n: direct index for structure ( temp structure{ temp float y,  temp texture2D texNested})
+0:17            'b' ( temp structure{ temp structure{ temp float y,  temp texture2D texNested} n,  temp texture2D tex})
+0:17            Constant:
+0:17              0 (const int)
+0:20      move second child to first child ( temp texture2D)
+0:20        texNested: direct index for structure ( temp texture2D)
+0:20          n: direct index for structure ( temp structure{ temp float y,  temp texture2D texNested})
+0:20            'a2' ( temp structure{ temp structure{ temp float y,  temp texture2D texNested} n,  temp float x})
+0:20            Constant:
+0:20              0 (const int)
+0:20          Constant:
+0:20            1 (const int)
+0:20        'someTex' ( uniform texture2D)
+0:21      move second child to first child ( temp float)
+0:21        y: direct index for structure ( temp float)
+0:21          n: direct index for structure ( temp structure{ temp float y,  temp texture2D texNested})
+0:21            'a1' ( temp structure{ temp structure{ temp float y,  temp texture2D texNested} n,  temp float x})
+0:21            Constant:
+0:21              0 (const int)
+0:21          Constant:
+0:21            0 (const int)
+0:21        Constant:
+0:21          1.000000
+0:23      Branch: Return with expression
+0:?         Constant:
+0:?           0.000000
+0:?           0.000000
+0:?           0.000000
+0:?           0.000000
+0:8  Function Definition: main( ( temp void)
+0:8    Function Parameters: 
+0:?     Sequence
+0:8      move second child to first child ( temp 4-component vector of float)
+0:?         'vpos' ( temp 4-component vector of float)
+0:?         'vpos' (layout( location=0) in 4-component vector of float)
+0:8      move second child to first child ( temp 4-component vector of float)
+0:?         '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+0:8        Function Call: @main(vf4; ( temp 4-component vector of float)
+0:?           'vpos' ( temp 4-component vector of float)
+0:?   Linker Objects
+0:?     'someTex' ( uniform texture2D)
+0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+0:?     'vpos' (layout( location=0) in 4-component vector of float)
+
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 56
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 49 52
+                              ExecutionMode 4 OriginUpperLeft
+                              Source HLSL 500
+                              Name 4  "main"
+                              Name 11  "@main(vf4;"
+                              Name 10  "vpos"
+                              Name 14  "Nested"
+                              MemberName 14(Nested) 0  "y"
+                              MemberName 14(Nested) 1  "texNested"
+                              Name 15  "A"
+                              MemberName 15(A) 0  "n"
+                              MemberName 15(A) 1  "x"
+                              Name 17  "a1"
+                              Name 20  "a2"
+                              Name 25  "B"
+                              MemberName 25(B) 0  "n"
+                              MemberName 25(B) 1  "tex"
+                              Name 27  "b"
+                              Name 31  "n"
+                              Name 36  "someTex"
+                              Name 47  "vpos"
+                              Name 49  "vpos"
+                              Name 52  "@entryPointOutput"
+                              Name 53  "param"
+                              Decorate 36(someTex) DescriptorSet 0
+                              Decorate 49(vpos) Location 0
+                              Decorate 52(@entryPointOutput) Location 0
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+               8:             TypePointer Function 7(fvec4)
+               9:             TypeFunction 7(fvec4) 8(ptr)
+              13:             TypeImage 6(float) 2D sampled format:Unknown
+      14(Nested):             TypeStruct 6(float) 13
+           15(A):             TypeStruct 14(Nested) 6(float)
+              16:             TypePointer Function 15(A)
+              18:             TypeInt 32 1
+              19:     18(int) Constant 0
+              21:             TypePointer Function 14(Nested)
+           25(B):             TypeStruct 14(Nested) 13
+              26:             TypePointer Function 25(B)
+              34:     18(int) Constant 1
+              35:             TypePointer UniformConstant 13
+     36(someTex):     35(ptr) Variable UniformConstant
+              38:             TypePointer Function 13
+              40:    6(float) Constant 1065353216
+              41:             TypePointer Function 6(float)
+              43:    6(float) Constant 0
+              44:    7(fvec4) ConstantComposite 43 43 43 43
+              48:             TypePointer Input 7(fvec4)
+        49(vpos):     48(ptr) Variable Input
+              51:             TypePointer Output 7(fvec4)
+52(@entryPointOutput):     51(ptr) Variable Output
+         4(main):           2 Function None 3
+               5:             Label
+        47(vpos):      8(ptr) Variable Function
+       53(param):      8(ptr) Variable Function
+              50:    7(fvec4) Load 49(vpos)
+                              Store 47(vpos) 50
+              54:    7(fvec4) Load 47(vpos)
+                              Store 53(param) 54
+              55:    7(fvec4) FunctionCall 11(@main(vf4;) 53(param)
+                              Store 52(@entryPointOutput) 55
+                              Return
+                              FunctionEnd
+  11(@main(vf4;):    7(fvec4) Function None 9
+        10(vpos):      8(ptr) FunctionParameter
+              12:             Label
+          17(a1):     16(ptr) Variable Function
+          20(a2):     16(ptr) Variable Function
+           27(b):     26(ptr) Variable Function
+           31(n):     21(ptr) Variable Function
+              22:     21(ptr) AccessChain 20(a2) 19
+              23:  14(Nested) Load 22
+              24:     21(ptr) AccessChain 17(a1) 19
+                              Store 24 23
+              28:     21(ptr) AccessChain 17(a1) 19
+              29:  14(Nested) Load 28
+              30:     21(ptr) AccessChain 27(b) 19
+                              Store 30 29
+              32:     21(ptr) AccessChain 27(b) 19
+              33:  14(Nested) Load 32
+                              Store 31(n) 33
+              37:          13 Load 36(someTex)
+              39:     38(ptr) AccessChain 20(a2) 19 34
+                              Store 39 37
+              42:     41(ptr) AccessChain 17(a1) 19 19
+                              Store 42 40
+                              ReturnValue 44
+                              FunctionEnd
diff --git a/Test/baseResults/hlsl.float1.frag.out b/Test/baseResults/hlsl.float1.frag.out
old mode 100755
new mode 100644
index 21b1c19..49827dc
--- a/Test/baseResults/hlsl.float1.frag.out
+++ b/Test/baseResults/hlsl.float1.frag.out
@@ -65,7 +65,7 @@
 0:?     'scalar' ( global float)
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 27
 
                               Capability Shader
@@ -102,10 +102,10 @@
               12:             Label
               18:    6(float) Load 14(f1)
               19:    6(float) Load 16(scalar)
-              20:    6(float) IMul 18 19
+              20:    6(float) FMul 18 19
               21:    6(float) Load 9(inFloat1)
               22:    6(float) Load 10(inScalar)
-              23:    6(float) IMul 21 22
+              23:    6(float) FMul 21 22
               24:    6(float) FAdd 20 23
                               ReturnValue 24
                               FunctionEnd
diff --git a/Test/baseResults/hlsl.float4.frag.out b/Test/baseResults/hlsl.float4.frag.out
old mode 100755
new mode 100644
index 4da2a16..cd741ed
--- a/Test/baseResults/hlsl.float4.frag.out
+++ b/Test/baseResults/hlsl.float4.frag.out
@@ -42,7 +42,7 @@
 0:?     'anon@0' (layout( row_major std140) uniform block{ uniform 4-component vector of float AmbientColor,  uniform bool ff1, layout( offset=20) uniform float ff2, layout( binding=0 offset=32) uniform 4-component vector of float ff3, layout( binding=1 offset=48) uniform 4-component vector of float ff4})
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 26
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.forLoop.frag.out b/Test/baseResults/hlsl.forLoop.frag.out
old mode 100755
new mode 100644
index e9908db..3e835f8
--- a/Test/baseResults/hlsl.forLoop.frag.out
+++ b/Test/baseResults/hlsl.forLoop.frag.out
@@ -17,7 +17,7 @@
 0:4          No loop condition
 0:4          No loop body
 0:?       Sequence
-0:5        Loop with condition tested first
+0:5        Loop with condition tested first: Unroll
 0:5          Loop Condition
 0:5          any ( temp bool)
 0:5            NotEqual ( temp 4-component vector of bool)
@@ -110,6 +110,80 @@
 0:11            'ii' ( temp int)
 0:12      Pre-Decrement ( temp float)
 0:12        'ii' ( temp float)
+0:13      Sequence
+0:13        move second child to first child ( temp int)
+0:13          'first' ( temp int)
+0:13          Constant:
+0:13            0 (const int)
+0:13        move second child to first child ( temp int)
+0:13          'second' ( temp int)
+0:13          Constant:
+0:13            1 (const int)
+0:13        Loop with condition tested first
+0:13          No loop condition
+0:13          Loop Body
+0:13          add ( temp int)
+0:13            'first' ( temp int)
+0:13            'second' ( temp int)
+0:14      Sequence
+0:14        move second child to first child ( temp int)
+0:14          'i' ( temp int)
+0:14          Constant:
+0:14            0 (const int)
+0:14        move second child to first child ( temp int)
+0:14          'count' ( temp int)
+0:14          Convert float to int ( temp int)
+0:14            'ii' ( temp float)
+0:14        Loop with condition tested first
+0:14          Loop Condition
+0:14          Compare Less Than ( temp bool)
+0:14            'i' ( temp int)
+0:14            'count' ( temp int)
+0:14          No loop body
+0:14          Loop Terminal Expression
+0:14          Post-Increment ( temp int)
+0:14            'i' ( temp int)
+0:15      Sequence
+0:15        move second child to first child ( temp float)
+0:15          'first' ( temp float)
+0:15          Constant:
+0:15            0.000000
+0:15        Loop with condition tested first
+0:15          Loop Condition
+0:15          Compare Less Than ( temp bool)
+0:15            'first' ( temp float)
+0:15            direct index ( temp float)
+0:15              'second' ( temp 2-element array of float)
+0:15              Constant:
+0:15                0 (const int)
+0:15          Loop Body
+0:15          add ( temp float)
+0:15            add ( temp float)
+0:15              'first' ( temp float)
+0:15              direct index ( temp float)
+0:15                'second' ( temp 2-element array of float)
+0:15                Constant:
+0:15                  1 (const int)
+0:15            'third' ( temp float)
+0:15          Loop Terminal Expression
+0:15          Pre-Increment ( temp float)
+0:15            direct index ( temp float)
+0:15              'second' ( temp 2-element array of float)
+0:15              Constant:
+0:15                1 (const int)
+0:?       Sequence
+0:16        Comma ( temp float)
+0:16          Comma ( temp float)
+0:16            Pre-Decrement ( temp float)
+0:16              'ii' ( temp float)
+0:16            Pre-Decrement ( temp float)
+0:16              'ii' ( temp float)
+0:16          Pre-Decrement ( temp float)
+0:16            'ii' ( temp float)
+0:16        Loop with condition tested first
+0:16          No loop condition
+0:16          Loop Body
+0:16          'ii' ( temp float)
 0:2  Function Definition: PixelShaderFunction( ( temp void)
 0:2    Function Parameters: 
 0:?     Sequence
@@ -146,7 +220,7 @@
 0:4          No loop condition
 0:4          No loop body
 0:?       Sequence
-0:5        Loop with condition tested first
+0:5        Loop with condition tested first: Unroll
 0:5          Loop Condition
 0:5          any ( temp bool)
 0:5            NotEqual ( temp 4-component vector of bool)
@@ -239,6 +313,80 @@
 0:11            'ii' ( temp int)
 0:12      Pre-Decrement ( temp float)
 0:12        'ii' ( temp float)
+0:13      Sequence
+0:13        move second child to first child ( temp int)
+0:13          'first' ( temp int)
+0:13          Constant:
+0:13            0 (const int)
+0:13        move second child to first child ( temp int)
+0:13          'second' ( temp int)
+0:13          Constant:
+0:13            1 (const int)
+0:13        Loop with condition tested first
+0:13          No loop condition
+0:13          Loop Body
+0:13          add ( temp int)
+0:13            'first' ( temp int)
+0:13            'second' ( temp int)
+0:14      Sequence
+0:14        move second child to first child ( temp int)
+0:14          'i' ( temp int)
+0:14          Constant:
+0:14            0 (const int)
+0:14        move second child to first child ( temp int)
+0:14          'count' ( temp int)
+0:14          Convert float to int ( temp int)
+0:14            'ii' ( temp float)
+0:14        Loop with condition tested first
+0:14          Loop Condition
+0:14          Compare Less Than ( temp bool)
+0:14            'i' ( temp int)
+0:14            'count' ( temp int)
+0:14          No loop body
+0:14          Loop Terminal Expression
+0:14          Post-Increment ( temp int)
+0:14            'i' ( temp int)
+0:15      Sequence
+0:15        move second child to first child ( temp float)
+0:15          'first' ( temp float)
+0:15          Constant:
+0:15            0.000000
+0:15        Loop with condition tested first
+0:15          Loop Condition
+0:15          Compare Less Than ( temp bool)
+0:15            'first' ( temp float)
+0:15            direct index ( temp float)
+0:15              'second' ( temp 2-element array of float)
+0:15              Constant:
+0:15                0 (const int)
+0:15          Loop Body
+0:15          add ( temp float)
+0:15            add ( temp float)
+0:15              'first' ( temp float)
+0:15              direct index ( temp float)
+0:15                'second' ( temp 2-element array of float)
+0:15                Constant:
+0:15                  1 (const int)
+0:15            'third' ( temp float)
+0:15          Loop Terminal Expression
+0:15          Pre-Increment ( temp float)
+0:15            direct index ( temp float)
+0:15              'second' ( temp 2-element array of float)
+0:15              Constant:
+0:15                1 (const int)
+0:?       Sequence
+0:16        Comma ( temp float)
+0:16          Comma ( temp float)
+0:16            Pre-Decrement ( temp float)
+0:16              'ii' ( temp float)
+0:16            Pre-Decrement ( temp float)
+0:16              'ii' ( temp float)
+0:16          Pre-Decrement ( temp float)
+0:16            'ii' ( temp float)
+0:16        Loop with condition tested first
+0:16          No loop condition
+0:16          Loop Body
+0:16          'ii' ( temp float)
 0:2  Function Definition: PixelShaderFunction( ( temp void)
 0:2    Function Parameters: 
 0:?     Sequence
@@ -254,13 +402,13 @@
 0:?     'input' (layout( location=0) in 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80001
-// Id's are bound by 124
+// Generated by (magic number): 80007
+// Id's are bound by 183
 
                               Capability Shader
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "PixelShaderFunction" 117 120
+                              EntryPoint Fragment 4  "PixelShaderFunction" 176 179
                               ExecutionMode 4 OriginUpperLeft
                               Source HLSL 500
                               Name 4  "PixelShaderFunction"
@@ -268,12 +416,19 @@
                               Name 10  "input"
                               Name 92  "ii"
                               Name 111  "ii"
-                              Name 115  "input"
-                              Name 117  "input"
-                              Name 120  "@entryPointOutput"
-                              Name 121  "param"
-                              Decorate 117(input) Location 0
-                              Decorate 120(@entryPointOutput) Location 0
+                              Name 114  "first"
+                              Name 116  "second"
+                              Name 124  "i"
+                              Name 125  "count"
+                              Name 138  "first"
+                              Name 149  "second"
+                              Name 157  "third"
+                              Name 174  "input"
+                              Name 176  "input"
+                              Name 179  "@entryPointOutput"
+                              Name 180  "param"
+                              Decorate 176(input) Location 0
+                              Decorate 179(@entryPointOutput) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -293,20 +448,25 @@
              100:     90(int) Constant 3
              103:     90(int) Constant 2
              109:     90(int) Constant 1
-             116:             TypePointer Input 7(fvec4)
-      117(input):    116(ptr) Variable Input
-             119:             TypePointer Output 7(fvec4)
-120(@entryPointOutput):    119(ptr) Variable Output
+             115:     90(int) Constant 0
+             139:    6(float) Constant 0
+             146:     71(int) Constant 2
+             147:             TypeArray 6(float) 146
+             148:             TypePointer Function 147
+             175:             TypePointer Input 7(fvec4)
+      176(input):    175(ptr) Variable Input
+             178:             TypePointer Output 7(fvec4)
+179(@entryPointOutput):    178(ptr) Variable Output
 4(PixelShaderFunction):           2 Function None 3
                5:             Label
-      115(input):      8(ptr) Variable Function
-      121(param):      8(ptr) Variable Function
-             118:    7(fvec4) Load 117(input)
-                              Store 115(input) 118
-             122:    7(fvec4) Load 115(input)
-                              Store 121(param) 122
-             123:    7(fvec4) FunctionCall 11(@PixelShaderFunction(vf4;) 121(param)
-                              Store 120(@entryPointOutput) 123
+      174(input):      8(ptr) Variable Function
+      180(param):      8(ptr) Variable Function
+             177:    7(fvec4) Load 176(input)
+                              Store 174(input) 177
+             181:    7(fvec4) Load 174(input)
+                              Store 180(param) 181
+             182:    7(fvec4) FunctionCall 11(@PixelShaderFunction(vf4;) 180(param)
+                              Store 179(@entryPointOutput) 182
                               Return
                               FunctionEnd
 11(@PixelShaderFunction(vf4;):    7(fvec4) Function None 9
@@ -314,6 +474,13 @@
               12:             Label
           92(ii):     91(ptr) Variable Function
          111(ii):     73(ptr) Variable Function
+      114(first):     91(ptr) Variable Function
+     116(second):     91(ptr) Variable Function
+          124(i):     91(ptr) Variable Function
+      125(count):     91(ptr) Variable Function
+      138(first):     73(ptr) Variable Function
+     149(second):    148(ptr) Variable Function
+      157(third):     73(ptr) Variable Function
                               Branch 13
               13:             Label
                               LoopMerge 15 16 None
@@ -454,6 +621,85 @@
              112:    6(float) Load 111(ii)
              113:    6(float) FSub 112 18
                               Store 111(ii) 113
-             114:    7(fvec4) Undef
-                              ReturnValue 114
+                              Store 114(first) 115
+                              Store 116(second) 109
+                              Branch 117
+             117:             Label
+                              LoopMerge 119 120 None
+                              Branch 118
+             118:             Label
+             121:     90(int) Load 114(first)
+             122:     90(int) Load 116(second)
+             123:     90(int) IAdd 121 122
+                              Branch 120
+             120:             Label
+                              Branch 117
+             119:             Label
+                              Store 124(i) 115
+             126:    6(float) Load 111(ii)
+             127:     90(int) ConvertFToS 126
+                              Store 125(count) 127
+                              Branch 128
+             128:             Label
+                              LoopMerge 130 131 None
+                              Branch 132
+             132:             Label
+             133:     90(int) Load 124(i)
+             134:     90(int) Load 125(count)
+             135:    32(bool) SLessThan 133 134
+                              BranchConditional 135 129 130
+             129:               Label
+                                Branch 131
+             131:               Label
+             136:     90(int)   Load 124(i)
+             137:     90(int)   IAdd 136 109
+                                Store 124(i) 137
+                                Branch 128
+             130:             Label
+                              Store 138(first) 139
+                              Branch 140
+             140:             Label
+                              LoopMerge 142 143 None
+                              Branch 144
+             144:             Label
+             145:    6(float) Load 138(first)
+             150:     73(ptr) AccessChain 149(second) 115
+             151:    6(float) Load 150
+             152:    32(bool) FOrdLessThan 145 151
+                              BranchConditional 152 141 142
+             141:               Label
+             153:    6(float)   Load 138(first)
+             154:     73(ptr)   AccessChain 149(second) 109
+             155:    6(float)   Load 154
+             156:    6(float)   FAdd 153 155
+             158:    6(float)   Load 157(third)
+             159:    6(float)   FAdd 156 158
+                                Branch 143
+             143:               Label
+             160:     73(ptr)   AccessChain 149(second) 109
+             161:    6(float)   Load 160
+             162:    6(float)   FAdd 161 18
+                                Store 160 162
+                                Branch 140
+             142:             Label
+             163:    6(float) Load 111(ii)
+             164:    6(float) FSub 163 18
+                              Store 111(ii) 164
+             165:    6(float) Load 111(ii)
+             166:    6(float) FSub 165 18
+                              Store 111(ii) 166
+             167:    6(float) Load 111(ii)
+             168:    6(float) FSub 167 18
+                              Store 111(ii) 168
+                              Branch 169
+             169:             Label
+                              LoopMerge 171 172 None
+                              Branch 170
+             170:             Label
+                              Branch 172
+             172:             Label
+                              Branch 169
+             171:             Label
+             173:    7(fvec4) Undef
+                              ReturnValue 173
                               FunctionEnd
diff --git a/Test/baseResults/hlsl.fraggeom.frag.out b/Test/baseResults/hlsl.fraggeom.frag.out
new file mode 100644
index 0000000..af3564d
--- /dev/null
+++ b/Test/baseResults/hlsl.fraggeom.frag.out
@@ -0,0 +1,112 @@
+hlsl.fraggeom.frag
+Shader version: 500
+gl_FragCoord origin is upper left
+0:? Sequence
+0:9  Function Definition: GS_Draw(struct-myVertex-vf41;struct-myVertex-vf41; ( temp void)
+0:9    Function Parameters: 
+0:9      'IN' ( in structure{ temp 4-component vector of float pos})
+0:9      'OutputStream' ( out structure{ temp 4-component vector of float pos})
+0:?     Sequence
+0:10      Constant:
+0:10        0.000000
+0:11      Constant:
+0:11        0.000000
+0:15  Function Definition: @main( ( temp 4-component vector of float)
+0:15    Function Parameters: 
+0:?     Sequence
+0:16      Branch: Return with expression
+0:16        Constant:
+0:16          0.000000
+0:16          0.000000
+0:16          0.000000
+0:16          0.000000
+0:15  Function Definition: main( ( temp void)
+0:15    Function Parameters: 
+0:?     Sequence
+0:15      move second child to first child ( temp 4-component vector of float)
+0:?         '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+0:15        Function Call: @main( ( temp 4-component vector of float)
+0:?   Linker Objects
+0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+
+
+Linked fragment stage:
+
+
+Shader version: 500
+gl_FragCoord origin is upper left
+0:? Sequence
+0:9  Function Definition: GS_Draw(struct-myVertex-vf41;struct-myVertex-vf41; ( temp void)
+0:9    Function Parameters: 
+0:9      'IN' ( in structure{ temp 4-component vector of float pos})
+0:9      'OutputStream' ( out structure{ temp 4-component vector of float pos})
+0:?     Sequence
+0:10      Constant:
+0:10        0.000000
+0:11      Constant:
+0:11        0.000000
+0:15  Function Definition: @main( ( temp 4-component vector of float)
+0:15    Function Parameters: 
+0:?     Sequence
+0:16      Branch: Return with expression
+0:16        Constant:
+0:16          0.000000
+0:16          0.000000
+0:16          0.000000
+0:16          0.000000
+0:15  Function Definition: main( ( temp void)
+0:15    Function Parameters: 
+0:?     Sequence
+0:15      move second child to first child ( temp 4-component vector of float)
+0:?         '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+0:15        Function Call: @main( ( temp 4-component vector of float)
+0:?   Linker Objects
+0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 25
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 23
+                              ExecutionMode 4 OriginUpperLeft
+                              Source HLSL 500
+                              Name 4  "main"
+                              Name 8  "myVertex"
+                              MemberName 8(myVertex) 0  "pos"
+                              Name 13  "GS_Draw(struct-myVertex-vf41;struct-myVertex-vf41;"
+                              Name 11  "IN"
+                              Name 12  "OutputStream"
+                              Name 16  "@main("
+                              Name 23  "@entryPointOutput"
+                              Decorate 23(@entryPointOutput) Location 0
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+     8(myVertex):             TypeStruct 7(fvec4)
+               9:             TypePointer Function 8(myVertex)
+              10:             TypeFunction 2 9(ptr) 9(ptr)
+              15:             TypeFunction 7(fvec4)
+              18:    6(float) Constant 0
+              19:    7(fvec4) ConstantComposite 18 18 18 18
+              22:             TypePointer Output 7(fvec4)
+23(@entryPointOutput):     22(ptr) Variable Output
+         4(main):           2 Function None 3
+               5:             Label
+              24:    7(fvec4) FunctionCall 16(@main()
+                              Store 23(@entryPointOutput) 24
+                              Return
+                              FunctionEnd
+13(GS_Draw(struct-myVertex-vf41;struct-myVertex-vf41;):           2 Function None 10
+          11(IN):      9(ptr) FunctionParameter
+12(OutputStream):      9(ptr) FunctionParameter
+              14:             Label
+                              Return
+                              FunctionEnd
+      16(@main():    7(fvec4) Function None 15
+              17:             Label
+                              ReturnValue 19
+                              FunctionEnd
diff --git a/Test/baseResults/hlsl.function.frag.out b/Test/baseResults/hlsl.function.frag.out
new file mode 100644
index 0000000..00b882d
--- /dev/null
+++ b/Test/baseResults/hlsl.function.frag.out
@@ -0,0 +1,119 @@
+hlsl.function.frag
+ERROR: 0:24: 'fun1' : unknown variable 
+ERROR: 0:24: 'return' : type does not match, or is not convertible to, the function's return type 
+ERROR: 2 compilation errors.  No code generated.
+
+
+Shader version: 500
+gl_FragCoord origin is upper left
+ERROR: node is still EOpNull!
+0:2  Function Definition: fun0( ( temp 4-component vector of float)
+0:2    Function Parameters: 
+0:?     Sequence
+0:3      Branch: Return with expression
+0:3        Constant:
+0:3          1.000000
+0:3          1.000000
+0:3          1.000000
+0:3          1.000000
+0:7  Function Definition: fun2(vf4; ( temp uint)
+0:7    Function Parameters: 
+0:7      'col' ( in 4-component vector of float)
+0:?     Sequence
+0:8      Branch: Return with expression
+0:8        Constant:
+0:8          7 (const uint)
+0:12  Function Definition: fun4(u1;u1; ( temp 4-component vector of float)
+0:12    Function Parameters: 
+0:12      'id1' ( in uint)
+0:12      'id2' ( in uint)
+0:?     Sequence
+0:13      Branch: Return with expression
+0:13        Construct vec4 ( temp 4-component vector of float)
+0:13          Convert uint to float ( temp float)
+0:13            component-wise multiply ( temp uint)
+0:13              'id1' ( in uint)
+0:13              'id2' ( in uint)
+0:17  Function Definition: fun1(i1; ( temp 4-component vector of float)
+0:17    Function Parameters: 
+0:17      'index' ( in int)
+0:?     Sequence
+0:18      Sequence
+0:18        move second child to first child ( temp uint)
+0:18          'entityId' ( temp uint)
+0:18          Function Call: fun2(vf4; ( temp uint)
+0:18            Function Call: fun0( ( temp 4-component vector of float)
+0:19      Branch: Return with expression
+0:19        Function Call: fun4(u1;u1; ( temp 4-component vector of float)
+0:19          'entityId' ( temp uint)
+0:19          'entityId' ( temp uint)
+0:23  Function Definition: @main( ( temp int)
+0:23    Function Parameters: 
+0:23  Function Definition: main( ( temp void)
+0:23    Function Parameters: 
+0:?     Sequence
+0:23      move second child to first child ( temp int)
+0:?         '@entryPointOutput' (layout( location=0) out int)
+0:23        Function Call: @main( ( temp int)
+0:?   Linker Objects
+0:?     '@entryPointOutput' (layout( location=0) out int)
+
+
+Linked fragment stage:
+
+
+Shader version: 500
+gl_FragCoord origin is upper left
+ERROR: node is still EOpNull!
+0:2  Function Definition: fun0( ( temp 4-component vector of float)
+0:2    Function Parameters: 
+0:?     Sequence
+0:3      Branch: Return with expression
+0:3        Constant:
+0:3          1.000000
+0:3          1.000000
+0:3          1.000000
+0:3          1.000000
+0:7  Function Definition: fun2(vf4; ( temp uint)
+0:7    Function Parameters: 
+0:7      'col' ( in 4-component vector of float)
+0:?     Sequence
+0:8      Branch: Return with expression
+0:8        Constant:
+0:8          7 (const uint)
+0:12  Function Definition: fun4(u1;u1; ( temp 4-component vector of float)
+0:12    Function Parameters: 
+0:12      'id1' ( in uint)
+0:12      'id2' ( in uint)
+0:?     Sequence
+0:13      Branch: Return with expression
+0:13        Construct vec4 ( temp 4-component vector of float)
+0:13          Convert uint to float ( temp float)
+0:13            component-wise multiply ( temp uint)
+0:13              'id1' ( in uint)
+0:13              'id2' ( in uint)
+0:17  Function Definition: fun1(i1; ( temp 4-component vector of float)
+0:17    Function Parameters: 
+0:17      'index' ( in int)
+0:?     Sequence
+0:18      Sequence
+0:18        move second child to first child ( temp uint)
+0:18          'entityId' ( temp uint)
+0:18          Function Call: fun2(vf4; ( temp uint)
+0:18            Function Call: fun0( ( temp 4-component vector of float)
+0:19      Branch: Return with expression
+0:19        Function Call: fun4(u1;u1; ( temp 4-component vector of float)
+0:19          'entityId' ( temp uint)
+0:19          'entityId' ( temp uint)
+0:23  Function Definition: @main( ( temp int)
+0:23    Function Parameters: 
+0:23  Function Definition: main( ( temp void)
+0:23    Function Parameters: 
+0:?     Sequence
+0:23      move second child to first child ( temp int)
+0:?         '@entryPointOutput' (layout( location=0) out int)
+0:23        Function Call: @main( ( temp int)
+0:?   Linker Objects
+0:?     '@entryPointOutput' (layout( location=0) out int)
+
+SPIR-V is not generated for failed compile or link
diff --git a/Test/baseResults/hlsl.gather.array.dx10.frag.out b/Test/baseResults/hlsl.gather.array.dx10.frag.out
index 5f9a1ca..be4606a 100644
--- a/Test/baseResults/hlsl.gather.array.dx10.frag.out
+++ b/Test/baseResults/hlsl.gather.array.dx10.frag.out
@@ -1,6 +1,7 @@
 hlsl.gather.array.dx10.frag
 Shader version: 500
 gl_FragCoord origin is upper left
+using depth_any
 0:? Sequence
 0:24  Function Definition: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:24    Function Parameters: 
@@ -101,13 +102,13 @@
 0:24          'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:24          Function Call: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:24        move second child to first child ( temp 4-component vector of float)
-0:?           'Color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 0:24          Color: direct index for structure ( temp 4-component vector of float)
 0:24            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:24            Constant:
 0:24              0 (const int)
 0:24        move second child to first child ( temp float)
-0:?           'Depth' ( out float FragDepth)
+0:?           '@entryPointOutput.Depth' ( out float FragDepth)
 0:24          Depth: direct index for structure ( temp float)
 0:24            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:24            Constant:
@@ -124,8 +125,8 @@
 0:?     'g_tTexcdf4a' ( uniform textureCubeArray)
 0:?     'g_tTexcdi4a' ( uniform itextureCubeArray)
 0:?     'g_tTexcdu4a' ( uniform utextureCubeArray)
-0:?     'Color' (layout( location=0) out 4-component vector of float)
-0:?     'Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 
 Linked fragment stage:
@@ -133,6 +134,7 @@
 
 Shader version: 500
 gl_FragCoord origin is upper left
+using depth_any
 0:? Sequence
 0:24  Function Definition: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:24    Function Parameters: 
@@ -233,13 +235,13 @@
 0:24          'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:24          Function Call: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:24        move second child to first child ( temp 4-component vector of float)
-0:?           'Color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 0:24          Color: direct index for structure ( temp 4-component vector of float)
 0:24            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:24            Constant:
 0:24              0 (const int)
 0:24        move second child to first child ( temp float)
-0:?           'Depth' ( out float FragDepth)
+0:?           '@entryPointOutput.Depth' ( out float FragDepth)
 0:24          Depth: direct index for structure ( temp float)
 0:24            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:24            Constant:
@@ -256,11 +258,11 @@
 0:?     'g_tTexcdf4a' ( uniform textureCubeArray)
 0:?     'g_tTexcdi4a' ( uniform itextureCubeArray)
 0:?     'g_tTexcdu4a' ( uniform utextureCubeArray)
-0:?     'Color' (layout( location=0) out 4-component vector of float)
-0:?     'Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 124
 
                               Capability Shader
@@ -270,6 +272,7 @@
                               MemoryModel Logical GLSL450
                               EntryPoint Fragment 4  "main" 107 111
                               ExecutionMode 4 OriginUpperLeft
+                              ExecutionMode 4 DepthReplacing
                               Source HLSL 500
                               Name 4  "main"
                               Name 8  "PS_OUTPUT"
@@ -291,8 +294,8 @@
                               Name 84  "g_tTexcdu4a"
                               Name 95  "psout"
                               Name 104  "flattenTemp"
-                              Name 107  "Color"
-                              Name 111  "Depth"
+                              Name 107  "@entryPointOutput.Color"
+                              Name 111  "@entryPointOutput.Depth"
                               Name 116  "g_tTex1df4a"
                               Name 117  "g_tTex1df4"
                               Name 120  "g_tTex1di4a"
@@ -305,8 +308,8 @@
                               Decorate 64(g_tTexcdf4a) DescriptorSet 0
                               Decorate 74(g_tTexcdi4a) DescriptorSet 0
                               Decorate 84(g_tTexcdu4a) DescriptorSet 0
-                              Decorate 107(Color) Location 0
-                              Decorate 111(Depth) BuiltIn FragDepth
+                              Decorate 107(@entryPointOutput.Color) Location 0
+                              Decorate 111(@entryPointOutput.Depth) BuiltIn FragDepth
                               Decorate 116(g_tTex1df4a) DescriptorSet 0
                               Decorate 116(g_tTex1df4a) Binding 1
                               Decorate 117(g_tTex1df4) DescriptorSet 0
@@ -376,9 +379,9 @@
               98:     29(int) Constant 1
               99:             TypePointer Function 6(float)
              106:             TypePointer Output 7(fvec4)
-      107(Color):    106(ptr) Variable Output
+107(@entryPointOutput.Color):    106(ptr) Variable Output
              110:             TypePointer Output 6(float)
-      111(Depth):    110(ptr) Variable Output
+111(@entryPointOutput.Depth):    110(ptr) Variable Output
              114:             TypeImage 6(float) 1D array sampled format:Unknown
              115:             TypePointer UniformConstant 114
 116(g_tTex1df4a):    115(ptr) Variable UniformConstant
@@ -396,10 +399,10 @@
                               Store 104(flattenTemp) 105
              108:     12(ptr) AccessChain 104(flattenTemp) 30
              109:    7(fvec4) Load 108
-                              Store 107(Color) 109
+                              Store 107(@entryPointOutput.Color) 109
              112:     99(ptr) AccessChain 104(flattenTemp) 98
              113:    6(float) Load 112
-                              Store 111(Depth) 113
+                              Store 111(@entryPointOutput.Depth) 113
                               Return
                               FunctionEnd
       10(@main():8(PS_OUTPUT) Function None 9
diff --git a/Test/baseResults/hlsl.gather.basic.dx10.frag.out b/Test/baseResults/hlsl.gather.basic.dx10.frag.out
index c011f56..8182dde 100644
--- a/Test/baseResults/hlsl.gather.basic.dx10.frag.out
+++ b/Test/baseResults/hlsl.gather.basic.dx10.frag.out
@@ -1,6 +1,7 @@
 hlsl.gather.basic.dx10.frag
 Shader version: 500
 gl_FragCoord origin is upper left
+using depth_any
 0:? Sequence
 0:29  Function Definition: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:29    Function Parameters: 
@@ -95,13 +96,13 @@
 0:29          'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:29          Function Call: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:29        move second child to first child ( temp 4-component vector of float)
-0:?           'Color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 0:29          Color: direct index for structure ( temp 4-component vector of float)
 0:29            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:29            Constant:
 0:29              0 (const int)
 0:29        move second child to first child ( temp float)
-0:?           'Depth' ( out float FragDepth)
+0:?           '@entryPointOutput.Depth' ( out float FragDepth)
 0:29          Depth: direct index for structure ( temp float)
 0:29            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:29            Constant:
@@ -122,8 +123,8 @@
 0:?     'g_tTexcdf4' ( uniform textureCube)
 0:?     'g_tTexcdi4' ( uniform itextureCube)
 0:?     'g_tTexcdu4' ( uniform utextureCube)
-0:?     'Color' (layout( location=0) out 4-component vector of float)
-0:?     'Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 
 Linked fragment stage:
@@ -131,6 +132,7 @@
 
 Shader version: 500
 gl_FragCoord origin is upper left
+using depth_any
 0:? Sequence
 0:29  Function Definition: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:29    Function Parameters: 
@@ -225,13 +227,13 @@
 0:29          'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:29          Function Call: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:29        move second child to first child ( temp 4-component vector of float)
-0:?           'Color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 0:29          Color: direct index for structure ( temp 4-component vector of float)
 0:29            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:29            Constant:
 0:29              0 (const int)
 0:29        move second child to first child ( temp float)
-0:?           'Depth' ( out float FragDepth)
+0:?           '@entryPointOutput.Depth' ( out float FragDepth)
 0:29          Depth: direct index for structure ( temp float)
 0:29            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:29            Constant:
@@ -252,11 +254,11 @@
 0:?     'g_tTexcdf4' ( uniform textureCube)
 0:?     'g_tTexcdi4' ( uniform itextureCube)
 0:?     'g_tTexcdu4' ( uniform utextureCube)
-0:?     'Color' (layout( location=0) out 4-component vector of float)
-0:?     'Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 135
 
                               Capability Shader
@@ -265,6 +267,7 @@
                               MemoryModel Logical GLSL450
                               EntryPoint Fragment 4  "main" 108 112
                               ExecutionMode 4 OriginUpperLeft
+                              ExecutionMode 4 DepthReplacing
                               Source HLSL 500
                               Name 4  "main"
                               Name 8  "PS_OUTPUT"
@@ -286,8 +289,8 @@
                               Name 84  "g_tTexcdu4"
                               Name 95  "psout"
                               Name 105  "flattenTemp"
-                              Name 108  "Color"
-                              Name 112  "Depth"
+                              Name 108  "@entryPointOutput.Color"
+                              Name 112  "@entryPointOutput.Depth"
                               Name 115  "g_sSamp2d"
                               Name 118  "g_tTex1df4a"
                               Name 119  "g_tTex1df4"
@@ -304,8 +307,8 @@
                               Decorate 63(g_tTexcdf4) DescriptorSet 0
                               Decorate 74(g_tTexcdi4) DescriptorSet 0
                               Decorate 84(g_tTexcdu4) DescriptorSet 0
-                              Decorate 108(Color) Location 0
-                              Decorate 112(Depth) BuiltIn FragDepth
+                              Decorate 108(@entryPointOutput.Color) Location 0
+                              Decorate 112(@entryPointOutput.Depth) BuiltIn FragDepth
                               Decorate 115(g_sSamp2d) DescriptorSet 0
                               Decorate 118(g_tTex1df4a) DescriptorSet 0
                               Decorate 118(g_tTex1df4a) Binding 1
@@ -380,9 +383,9 @@
               99:     28(int) Constant 1
              100:             TypePointer Function 6(float)
              107:             TypePointer Output 7(fvec4)
-      108(Color):    107(ptr) Variable Output
+108(@entryPointOutput.Color):    107(ptr) Variable Output
              111:             TypePointer Output 6(float)
-      112(Depth):    111(ptr) Variable Output
+112(@entryPointOutput.Depth):    111(ptr) Variable Output
   115(g_sSamp2d):     19(ptr) Variable UniformConstant
              116:             TypeImage 6(float) 1D sampled format:Unknown
              117:             TypePointer UniformConstant 116
@@ -410,10 +413,10 @@
                               Store 105(flattenTemp) 106
              109:     12(ptr) AccessChain 105(flattenTemp) 29
              110:    7(fvec4) Load 109
-                              Store 108(Color) 110
+                              Store 108(@entryPointOutput.Color) 110
              113:    100(ptr) AccessChain 105(flattenTemp) 99
              114:    6(float) Load 113
-                              Store 112(Depth) 114
+                              Store 112(@entryPointOutput.Depth) 114
                               Return
                               FunctionEnd
       10(@main():8(PS_OUTPUT) Function None 9
diff --git a/Test/baseResults/hlsl.gather.basic.dx10.vert.out b/Test/baseResults/hlsl.gather.basic.dx10.vert.out
index 46fb13c..fe56114 100644
--- a/Test/baseResults/hlsl.gather.basic.dx10.vert.out
+++ b/Test/baseResults/hlsl.gather.basic.dx10.vert.out
@@ -84,7 +84,7 @@
 0:?     Sequence
 0:28      Sequence
 0:28        move second child to first child ( temp 4-component vector of float)
-0:?           '@entryPointOutput_Pos' ( out 4-component vector of float Position)
+0:?           '@entryPointOutput.Pos' ( out 4-component vector of float Position)
 0:28          Pos: direct index for structure ( temp 4-component vector of float)
 0:28            Function Call: @main( ( temp structure{ temp 4-component vector of float Pos})
 0:28            Constant:
@@ -105,7 +105,7 @@
 0:?     'g_tTexcdf4' ( uniform textureCube)
 0:?     'g_tTexcdi4' ( uniform itextureCube)
 0:?     'g_tTexcdu4' ( uniform utextureCube)
-0:?     '@entryPointOutput' (layout( location=0) out structure{})
+0:?     '@entryPointOutput.Pos' ( out 4-component vector of float Position)
 
 
 Linked vertex stage:
@@ -196,7 +196,7 @@
 0:?     Sequence
 0:28      Sequence
 0:28        move second child to first child ( temp 4-component vector of float)
-0:?           '@entryPointOutput_Pos' ( out 4-component vector of float Position)
+0:?           '@entryPointOutput.Pos' ( out 4-component vector of float Position)
 0:28          Pos: direct index for structure ( temp 4-component vector of float)
 0:28            Function Call: @main( ( temp structure{ temp 4-component vector of float Pos})
 0:28            Constant:
@@ -217,17 +217,17 @@
 0:?     'g_tTexcdf4' ( uniform textureCube)
 0:?     'g_tTexcdi4' ( uniform itextureCube)
 0:?     'g_tTexcdu4' ( uniform utextureCube)
-0:?     '@entryPointOutput' (layout( location=0) out structure{})
+0:?     '@entryPointOutput.Pos' ( out 4-component vector of float Position)
 
 // Module Version 10000
-// Generated by (magic number): 80001
-// Id's are bound by 129
+// Generated by (magic number): 80007
+// Id's are bound by 126
 
                               Capability Shader
                               Capability Sampled1D
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Vertex 4  "main" 103 128
+                              EntryPoint Vertex 4  "main" 103
                               Source HLSL 500
                               Name 4  "main"
                               Name 8  "VS_OUTPUT"
@@ -247,7 +247,7 @@
                               Name 81  "txval42"
                               Name 84  "g_tTexcdu4"
                               Name 95  "vsout"
-                              Name 103  "@entryPointOutput_Pos"
+                              Name 103  "@entryPointOutput.Pos"
                               Name 106  "g_sSamp2d"
                               Name 109  "g_tTex1df4a"
                               Name 110  "g_tTex1df4"
@@ -256,8 +256,6 @@
                               Name 119  "g_tTex3df4"
                               Name 122  "g_tTex3di4"
                               Name 125  "g_tTex3du4"
-                              Name 126  "VS_OUTPUT"
-                              Name 128  "@entryPointOutput"
                               Decorate 16(g_tTex2df4) DescriptorSet 0
                               Decorate 20(g_sSamp) DescriptorSet 0
                               Decorate 20(g_sSamp) Binding 0
@@ -266,7 +264,7 @@
                               Decorate 63(g_tTexcdf4) DescriptorSet 0
                               Decorate 74(g_tTexcdi4) DescriptorSet 0
                               Decorate 84(g_tTexcdu4) DescriptorSet 0
-                              Decorate 103(@entryPointOutput_Pos) BuiltIn Position
+                              Decorate 103(@entryPointOutput.Pos) BuiltIn Position
                               Decorate 106(g_sSamp2d) DescriptorSet 0
                               Decorate 109(g_tTex1df4a) DescriptorSet 0
                               Decorate 109(g_tTex1df4a) Binding 1
@@ -277,7 +275,6 @@
                               Decorate 119(g_tTex3df4) DescriptorSet 0
                               Decorate 122(g_tTex3di4) DescriptorSet 0
                               Decorate 125(g_tTex3du4) DescriptorSet 0
-                              Decorate 128(@entryPointOutput) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -340,7 +337,7 @@
               96:    6(float) Constant 0
               97:    7(fvec4) ConstantComposite 96 96 96 96
              102:             TypePointer Output 7(fvec4)
-103(@entryPointOutput_Pos):    102(ptr) Variable Output
+103(@entryPointOutput.Pos):    102(ptr) Variable Output
   106(g_sSamp2d):     19(ptr) Variable UniformConstant
              107:             TypeImage 6(float) 1D sampled format:Unknown
              108:             TypePointer UniformConstant 107
@@ -361,14 +358,11 @@
              123:             TypeImage 45(int) 3D sampled format:Unknown
              124:             TypePointer UniformConstant 123
  125(g_tTex3du4):    124(ptr) Variable UniformConstant
-  126(VS_OUTPUT):             TypeStruct
-             127:             TypePointer Output 126(VS_OUTPUT)
-128(@entryPointOutput):    127(ptr) Variable Output
          4(main):           2 Function None 3
                5:             Label
              104:8(VS_OUTPUT) FunctionCall 10(@main()
              105:    7(fvec4) CompositeExtract 104 0
-                              Store 103(@entryPointOutput_Pos) 105
+                              Store 103(@entryPointOutput.Pos) 105
                               Return
                               FunctionEnd
       10(@main():8(VS_OUTPUT) Function None 9
diff --git a/Test/baseResults/hlsl.gather.offset.dx10.frag.out b/Test/baseResults/hlsl.gather.offset.dx10.frag.out
index 8ed1c07..ae816dd 100644
--- a/Test/baseResults/hlsl.gather.offset.dx10.frag.out
+++ b/Test/baseResults/hlsl.gather.offset.dx10.frag.out
@@ -1,6 +1,7 @@
 hlsl.gather.offset.dx10.frag
 Shader version: 500
 gl_FragCoord origin is upper left
+using depth_any
 0:? Sequence
 0:28  Function Definition: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:28    Function Parameters: 
@@ -71,13 +72,13 @@
 0:28          'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:28          Function Call: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:28        move second child to first child ( temp 4-component vector of float)
-0:?           'Color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 0:28          Color: direct index for structure ( temp 4-component vector of float)
 0:28            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:28            Constant:
 0:28              0 (const int)
 0:28        move second child to first child ( temp float)
-0:?           'Depth' ( out float FragDepth)
+0:?           '@entryPointOutput.Depth' ( out float FragDepth)
 0:28          Depth: direct index for structure ( temp float)
 0:28            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:28            Constant:
@@ -97,8 +98,8 @@
 0:?     'g_tTexcdf4' ( uniform textureCube)
 0:?     'g_tTexcdi4' ( uniform itextureCube)
 0:?     'g_tTexcdu4' ( uniform utextureCube)
-0:?     'Color' (layout( location=0) out 4-component vector of float)
-0:?     'Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 
 Linked fragment stage:
@@ -106,6 +107,7 @@
 
 Shader version: 500
 gl_FragCoord origin is upper left
+using depth_any
 0:? Sequence
 0:28  Function Definition: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:28    Function Parameters: 
@@ -176,13 +178,13 @@
 0:28          'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:28          Function Call: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:28        move second child to first child ( temp 4-component vector of float)
-0:?           'Color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 0:28          Color: direct index for structure ( temp 4-component vector of float)
 0:28            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:28            Constant:
 0:28              0 (const int)
 0:28        move second child to first child ( temp float)
-0:?           'Depth' ( out float FragDepth)
+0:?           '@entryPointOutput.Depth' ( out float FragDepth)
 0:28          Depth: direct index for structure ( temp float)
 0:28            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:28            Constant:
@@ -202,11 +204,11 @@
 0:?     'g_tTexcdf4' ( uniform textureCube)
 0:?     'g_tTexcdi4' ( uniform itextureCube)
 0:?     'g_tTexcdu4' ( uniform utextureCube)
-0:?     'Color' (layout( location=0) out 4-component vector of float)
-0:?     'Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 114
 
                               Capability Shader
@@ -215,6 +217,7 @@
                               MemoryModel Logical GLSL450
                               EntryPoint Fragment 4  "main" 79 83
                               ExecutionMode 4 OriginUpperLeft
+                              ExecutionMode 4 DepthReplacing
                               Source HLSL 500
                               Name 4  "main"
                               Name 8  "PS_OUTPUT"
@@ -230,8 +233,8 @@
                               Name 55  "g_tTex2du4"
                               Name 67  "psout"
                               Name 76  "flattenTemp"
-                              Name 79  "Color"
-                              Name 83  "Depth"
+                              Name 79  "@entryPointOutput.Color"
+                              Name 83  "@entryPointOutput.Depth"
                               Name 88  "g_tTex1df4a"
                               Name 89  "g_tTex1df4"
                               Name 92  "g_tTex1di4"
@@ -247,8 +250,8 @@
                               Decorate 20(g_sSamp) Binding 0
                               Decorate 39(g_tTex2di4) DescriptorSet 0
                               Decorate 55(g_tTex2du4) DescriptorSet 0
-                              Decorate 79(Color) Location 0
-                              Decorate 83(Depth) BuiltIn FragDepth
+                              Decorate 79(@entryPointOutput.Color) Location 0
+                              Decorate 83(@entryPointOutput.Depth) BuiltIn FragDepth
                               Decorate 88(g_tTex1df4a) DescriptorSet 0
                               Decorate 88(g_tTex1df4a) Binding 1
                               Decorate 89(g_tTex1df4) DescriptorSet 0
@@ -311,9 +314,9 @@
               69:    7(fvec4) ConstantComposite 68 68 68 68
               71:             TypePointer Function 6(float)
               78:             TypePointer Output 7(fvec4)
-       79(Color):     78(ptr) Variable Output
+79(@entryPointOutput.Color):     78(ptr) Variable Output
               82:             TypePointer Output 6(float)
-       83(Depth):     82(ptr) Variable Output
+83(@entryPointOutput.Depth):     82(ptr) Variable Output
               86:             TypeImage 6(float) 1D sampled format:Unknown
               87:             TypePointer UniformConstant 86
  88(g_tTex1df4a):     87(ptr) Variable UniformConstant
@@ -349,10 +352,10 @@
                               Store 76(flattenTemp) 77
               80:     12(ptr) AccessChain 76(flattenTemp) 31
               81:    7(fvec4) Load 80
-                              Store 79(Color) 81
+                              Store 79(@entryPointOutput.Color) 81
               84:     71(ptr) AccessChain 76(flattenTemp) 30
               85:    6(float) Load 84
-                              Store 83(Depth) 85
+                              Store 83(@entryPointOutput.Depth) 85
                               Return
                               FunctionEnd
       10(@main():8(PS_OUTPUT) Function None 9
diff --git a/Test/baseResults/hlsl.gather.offsetarray.dx10.frag.out b/Test/baseResults/hlsl.gather.offsetarray.dx10.frag.out
index 73ecae0..8805232 100644
--- a/Test/baseResults/hlsl.gather.offsetarray.dx10.frag.out
+++ b/Test/baseResults/hlsl.gather.offsetarray.dx10.frag.out
@@ -1,6 +1,7 @@
 hlsl.gather.offsetarray.dx10.frag
 Shader version: 500
 gl_FragCoord origin is upper left
+using depth_any
 0:? Sequence
 0:20  Function Definition: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:20    Function Parameters: 
@@ -74,13 +75,13 @@
 0:20          'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:20          Function Call: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:20        move second child to first child ( temp 4-component vector of float)
-0:?           'Color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 0:20          Color: direct index for structure ( temp 4-component vector of float)
 0:20            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:20            Constant:
 0:20              0 (const int)
 0:20        move second child to first child ( temp float)
-0:?           'Depth' ( out float FragDepth)
+0:?           '@entryPointOutput.Depth' ( out float FragDepth)
 0:20          Depth: direct index for structure ( temp float)
 0:20            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:20            Constant:
@@ -94,8 +95,8 @@
 0:?     'g_tTex2df4' ( uniform texture2DArray)
 0:?     'g_tTex2di4' ( uniform itexture2DArray)
 0:?     'g_tTex2du4' ( uniform utexture2DArray)
-0:?     'Color' (layout( location=0) out 4-component vector of float)
-0:?     'Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 
 Linked fragment stage:
@@ -103,6 +104,7 @@
 
 Shader version: 500
 gl_FragCoord origin is upper left
+using depth_any
 0:? Sequence
 0:20  Function Definition: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:20    Function Parameters: 
@@ -176,13 +178,13 @@
 0:20          'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:20          Function Call: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:20        move second child to first child ( temp 4-component vector of float)
-0:?           'Color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 0:20          Color: direct index for structure ( temp 4-component vector of float)
 0:20            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:20            Constant:
 0:20              0 (const int)
 0:20        move second child to first child ( temp float)
-0:?           'Depth' ( out float FragDepth)
+0:?           '@entryPointOutput.Depth' ( out float FragDepth)
 0:20          Depth: direct index for structure ( temp float)
 0:20            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:20            Constant:
@@ -196,11 +198,11 @@
 0:?     'g_tTex2df4' ( uniform texture2DArray)
 0:?     'g_tTex2di4' ( uniform itexture2DArray)
 0:?     'g_tTex2du4' ( uniform utexture2DArray)
-0:?     'Color' (layout( location=0) out 4-component vector of float)
-0:?     'Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 97
 
                               Capability Shader
@@ -209,6 +211,7 @@
                               MemoryModel Logical GLSL450
                               EntryPoint Fragment 4  "main" 80 84
                               ExecutionMode 4 OriginUpperLeft
+                              ExecutionMode 4 DepthReplacing
                               Source HLSL 500
                               Name 4  "main"
                               Name 8  "PS_OUTPUT"
@@ -224,8 +227,8 @@
                               Name 55  "g_tTex2du4"
                               Name 68  "psout"
                               Name 77  "flattenTemp"
-                              Name 80  "Color"
-                              Name 84  "Depth"
+                              Name 80  "@entryPointOutput.Color"
+                              Name 84  "@entryPointOutput.Depth"
                               Name 89  "g_tTex1df4a"
                               Name 90  "g_tTex1df4"
                               Name 93  "g_tTex1di4"
@@ -235,8 +238,8 @@
                               Decorate 20(g_sSamp) Binding 0
                               Decorate 40(g_tTex2di4) DescriptorSet 0
                               Decorate 55(g_tTex2du4) DescriptorSet 0
-                              Decorate 80(Color) Location 0
-                              Decorate 84(Depth) BuiltIn FragDepth
+                              Decorate 80(@entryPointOutput.Color) Location 0
+                              Decorate 84(@entryPointOutput.Depth) BuiltIn FragDepth
                               Decorate 89(g_tTex1df4a) DescriptorSet 0
                               Decorate 89(g_tTex1df4a) Binding 1
                               Decorate 90(g_tTex1df4) DescriptorSet 0
@@ -294,9 +297,9 @@
               70:    7(fvec4) ConstantComposite 69 69 69 69
               72:             TypePointer Function 6(float)
               79:             TypePointer Output 7(fvec4)
-       80(Color):     79(ptr) Variable Output
+80(@entryPointOutput.Color):     79(ptr) Variable Output
               83:             TypePointer Output 6(float)
-       84(Depth):     83(ptr) Variable Output
+84(@entryPointOutput.Depth):     83(ptr) Variable Output
               87:             TypeImage 6(float) 1D array sampled format:Unknown
               88:             TypePointer UniformConstant 87
  89(g_tTex1df4a):     88(ptr) Variable UniformConstant
@@ -314,10 +317,10 @@
                               Store 77(flattenTemp) 78
               81:     12(ptr) AccessChain 77(flattenTemp) 32
               82:    7(fvec4) Load 81
-                              Store 80(Color) 82
+                              Store 80(@entryPointOutput.Color) 82
               85:     72(ptr) AccessChain 77(flattenTemp) 31
               86:    6(float) Load 85
-                              Store 84(Depth) 86
+                              Store 84(@entryPointOutput.Depth) 86
                               Return
                               FunctionEnd
       10(@main():8(PS_OUTPUT) Function None 9
diff --git a/Test/baseResults/hlsl.gatherRGBA.array.dx10.frag.out b/Test/baseResults/hlsl.gatherRGBA.array.dx10.frag.out
index 03d0325..35b0a00 100644
--- a/Test/baseResults/hlsl.gatherRGBA.array.dx10.frag.out
+++ b/Test/baseResults/hlsl.gatherRGBA.array.dx10.frag.out
@@ -1,6 +1,7 @@
 hlsl.gatherRGBA.array.dx10.frag
 Shader version: 500
 gl_FragCoord origin is upper left
+using depth_any
 0:? Sequence
 0:28  Function Definition: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:28    Function Parameters: 
@@ -344,13 +345,13 @@
 0:28          'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:28          Function Call: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:28        move second child to first child ( temp 4-component vector of float)
-0:?           'Color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 0:28          Color: direct index for structure ( temp 4-component vector of float)
 0:28            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:28            Constant:
 0:28              0 (const int)
 0:28        move second child to first child ( temp float)
-0:?           'Depth' ( out float FragDepth)
+0:?           '@entryPointOutput.Depth' ( out float FragDepth)
 0:28          Depth: direct index for structure ( temp float)
 0:28            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:28            Constant:
@@ -368,8 +369,8 @@
 0:?     'g_tTexcdi4a' ( uniform itextureCubeArray)
 0:?     'g_tTexcdu4a' ( uniform utextureCubeArray)
 0:?     'anon@0' (layout( row_major std140) uniform block{ uniform float c1,  uniform 2-component vector of float c2,  uniform 3-component vector of float c3,  uniform 4-component vector of float c4})
-0:?     'Color' (layout( location=0) out 4-component vector of float)
-0:?     'Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 
 Linked fragment stage:
@@ -377,6 +378,7 @@
 
 Shader version: 500
 gl_FragCoord origin is upper left
+using depth_any
 0:? Sequence
 0:28  Function Definition: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:28    Function Parameters: 
@@ -720,13 +722,13 @@
 0:28          'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:28          Function Call: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:28        move second child to first child ( temp 4-component vector of float)
-0:?           'Color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 0:28          Color: direct index for structure ( temp 4-component vector of float)
 0:28            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:28            Constant:
 0:28              0 (const int)
 0:28        move second child to first child ( temp float)
-0:?           'Depth' ( out float FragDepth)
+0:?           '@entryPointOutput.Depth' ( out float FragDepth)
 0:28          Depth: direct index for structure ( temp float)
 0:28            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:28            Constant:
@@ -744,11 +746,11 @@
 0:?     'g_tTexcdi4a' ( uniform itextureCubeArray)
 0:?     'g_tTexcdu4a' ( uniform utextureCubeArray)
 0:?     'anon@0' (layout( row_major std140) uniform block{ uniform float c1,  uniform 2-component vector of float c2,  uniform 3-component vector of float c3,  uniform 4-component vector of float c4})
-0:?     'Color' (layout( location=0) out 4-component vector of float)
-0:?     'Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 255
 
                               Capability Shader
@@ -758,6 +760,7 @@
                               MemoryModel Logical GLSL450
                               EntryPoint Fragment 4  "main" 238 242
                               ExecutionMode 4 OriginUpperLeft
+                              ExecutionMode 4 DepthReplacing
                               Source HLSL 500
                               Name 4  "main"
                               Name 8  "PS_OUTPUT"
@@ -803,8 +806,8 @@
                               Name 218  "txval72"
                               Name 226  "psout"
                               Name 235  "flattenTemp"
-                              Name 238  "Color"
-                              Name 242  "Depth"
+                              Name 238  "@entryPointOutput.Color"
+                              Name 242  "@entryPointOutput.Depth"
                               Name 245  "g_sSamp2d"
                               Name 248  "g_tTex1df4a"
                               Name 251  "g_tTex1di4a"
@@ -813,7 +816,7 @@
                               Decorate 20(g_sSamp) DescriptorSet 0
                               Decorate 20(g_sSamp) Binding 0
                               MemberDecorate 26($Global) 0 Offset 0
-                              MemberDecorate 26($Global) 1 Offset 4
+                              MemberDecorate 26($Global) 1 Offset 8
                               MemberDecorate 26($Global) 2 Offset 16
                               MemberDecorate 26($Global) 3 Offset 32
                               Decorate 26($Global) Block
@@ -823,8 +826,8 @@
                               Decorate 131(g_tTexcdf4a) DescriptorSet 0
                               Decorate 143(g_tTexcdi4a) DescriptorSet 0
                               Decorate 154(g_tTexcdu4a) DescriptorSet 0
-                              Decorate 238(Color) Location 0
-                              Decorate 242(Depth) BuiltIn FragDepth
+                              Decorate 238(@entryPointOutput.Color) Location 0
+                              Decorate 242(@entryPointOutput.Depth) BuiltIn FragDepth
                               Decorate 245(g_sSamp2d) DescriptorSet 0
                               Decorate 248(g_tTex1df4a) DescriptorSet 0
                               Decorate 248(g_tTex1df4a) Binding 0
@@ -886,9 +889,9 @@
              228:    7(fvec4) ConstantComposite 227 227 227 227
              230:             TypePointer Function 6(float)
              237:             TypePointer Output 7(fvec4)
-      238(Color):    237(ptr) Variable Output
+238(@entryPointOutput.Color):    237(ptr) Variable Output
              241:             TypePointer Output 6(float)
-      242(Depth):    241(ptr) Variable Output
+242(@entryPointOutput.Depth):    241(ptr) Variable Output
   245(g_sSamp2d):     19(ptr) Variable UniformConstant
              246:             TypeImage 6(float) 1D array sampled format:Unknown
              247:             TypePointer UniformConstant 246
@@ -906,10 +909,10 @@
                               Store 235(flattenTemp) 236
              239:     12(ptr) AccessChain 235(flattenTemp) 34
              240:    7(fvec4) Load 239
-                              Store 238(Color) 240
+                              Store 238(@entryPointOutput.Color) 240
              243:    230(ptr) AccessChain 235(flattenTemp) 69
              244:    6(float) Load 243
-                              Store 242(Depth) 244
+                              Store 242(@entryPointOutput.Depth) 244
                               Return
                               FunctionEnd
       10(@main():8(PS_OUTPUT) Function None 9
diff --git a/Test/baseResults/hlsl.gatherRGBA.basic.dx10.frag.out b/Test/baseResults/hlsl.gatherRGBA.basic.dx10.frag.out
index c64a4e6..d0be6d5 100644
--- a/Test/baseResults/hlsl.gatherRGBA.basic.dx10.frag.out
+++ b/Test/baseResults/hlsl.gatherRGBA.basic.dx10.frag.out
@@ -1,6 +1,7 @@
 hlsl.gatherRGBA.basic.dx10.frag
 Shader version: 500
 gl_FragCoord origin is upper left
+using depth_any
 0:? Sequence
 0:34  Function Definition: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:34    Function Parameters: 
@@ -344,13 +345,13 @@
 0:34          'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:34          Function Call: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:34        move second child to first child ( temp 4-component vector of float)
-0:?           'Color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 0:34          Color: direct index for structure ( temp 4-component vector of float)
 0:34            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:34            Constant:
 0:34              0 (const int)
 0:34        move second child to first child ( temp float)
-0:?           'Depth' ( out float FragDepth)
+0:?           '@entryPointOutput.Depth' ( out float FragDepth)
 0:34          Depth: direct index for structure ( temp float)
 0:34            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:34            Constant:
@@ -372,8 +373,8 @@
 0:?     'g_tTexcdi4' ( uniform itextureCube)
 0:?     'g_tTexcdu4' ( uniform utextureCube)
 0:?     'anon@0' (layout( row_major std140) uniform block{ uniform float c1,  uniform 2-component vector of float c2,  uniform 3-component vector of float c3,  uniform 4-component vector of float c4})
-0:?     'Color' (layout( location=0) out 4-component vector of float)
-0:?     'Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 
 Linked fragment stage:
@@ -381,6 +382,7 @@
 
 Shader version: 500
 gl_FragCoord origin is upper left
+using depth_any
 0:? Sequence
 0:34  Function Definition: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:34    Function Parameters: 
@@ -724,13 +726,13 @@
 0:34          'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:34          Function Call: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:34        move second child to first child ( temp 4-component vector of float)
-0:?           'Color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 0:34          Color: direct index for structure ( temp 4-component vector of float)
 0:34            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:34            Constant:
 0:34              0 (const int)
 0:34        move second child to first child ( temp float)
-0:?           'Depth' ( out float FragDepth)
+0:?           '@entryPointOutput.Depth' ( out float FragDepth)
 0:34          Depth: direct index for structure ( temp float)
 0:34            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:34            Constant:
@@ -752,11 +754,11 @@
 0:?     'g_tTexcdi4' ( uniform itextureCube)
 0:?     'g_tTexcdu4' ( uniform utextureCube)
 0:?     'anon@0' (layout( row_major std140) uniform block{ uniform float c1,  uniform 2-component vector of float c2,  uniform 3-component vector of float c3,  uniform 4-component vector of float c4})
-0:?     'Color' (layout( location=0) out 4-component vector of float)
-0:?     'Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 265
 
                               Capability Shader
@@ -765,6 +767,7 @@
                               MemoryModel Logical GLSL450
                               EntryPoint Fragment 4  "main" 238 242
                               ExecutionMode 4 OriginUpperLeft
+                              ExecutionMode 4 DepthReplacing
                               Source HLSL 500
                               Name 4  "main"
                               Name 8  "PS_OUTPUT"
@@ -810,8 +813,8 @@
                               Name 218  "txval72"
                               Name 226  "psout"
                               Name 235  "flattenTemp"
-                              Name 238  "Color"
-                              Name 242  "Depth"
+                              Name 238  "@entryPointOutput.Color"
+                              Name 242  "@entryPointOutput.Depth"
                               Name 245  "g_sSamp2d"
                               Name 248  "g_tTex1df4a"
                               Name 249  "g_tTex1df4"
@@ -824,7 +827,7 @@
                               Decorate 20(g_sSamp) DescriptorSet 0
                               Decorate 20(g_sSamp) Binding 0
                               MemberDecorate 26($Global) 0 Offset 0
-                              MemberDecorate 26($Global) 1 Offset 4
+                              MemberDecorate 26($Global) 1 Offset 8
                               MemberDecorate 26($Global) 2 Offset 16
                               MemberDecorate 26($Global) 3 Offset 32
                               Decorate 26($Global) Block
@@ -834,8 +837,8 @@
                               Decorate 131(g_tTexcdf4) DescriptorSet 0
                               Decorate 143(g_tTexcdi4) DescriptorSet 0
                               Decorate 154(g_tTexcdu4) DescriptorSet 0
-                              Decorate 238(Color) Location 0
-                              Decorate 242(Depth) BuiltIn FragDepth
+                              Decorate 238(@entryPointOutput.Color) Location 0
+                              Decorate 242(@entryPointOutput.Depth) BuiltIn FragDepth
                               Decorate 245(g_sSamp2d) DescriptorSet 0
                               Decorate 248(g_tTex1df4a) DescriptorSet 0
                               Decorate 248(g_tTex1df4a) Binding 1
@@ -902,9 +905,9 @@
              228:    7(fvec4) ConstantComposite 227 227 227 227
              230:             TypePointer Function 6(float)
              237:             TypePointer Output 7(fvec4)
-      238(Color):    237(ptr) Variable Output
+238(@entryPointOutput.Color):    237(ptr) Variable Output
              241:             TypePointer Output 6(float)
-      242(Depth):    241(ptr) Variable Output
+242(@entryPointOutput.Depth):    241(ptr) Variable Output
   245(g_sSamp2d):     19(ptr) Variable UniformConstant
              246:             TypeImage 6(float) 1D sampled format:Unknown
              247:             TypePointer UniformConstant 246
@@ -932,10 +935,10 @@
                               Store 235(flattenTemp) 236
              239:     12(ptr) AccessChain 235(flattenTemp) 34
              240:    7(fvec4) Load 239
-                              Store 238(Color) 240
+                              Store 238(@entryPointOutput.Color) 240
              243:    230(ptr) AccessChain 235(flattenTemp) 30
              244:    6(float) Load 243
-                              Store 242(Depth) 244
+                              Store 242(@entryPointOutput.Depth) 244
                               Return
                               FunctionEnd
       10(@main():8(PS_OUTPUT) Function None 9
diff --git a/Test/baseResults/hlsl.gatherRGBA.offset.dx10.frag.out b/Test/baseResults/hlsl.gatherRGBA.offset.dx10.frag.out
index 6f68205..33c9af4 100644
--- a/Test/baseResults/hlsl.gatherRGBA.offset.dx10.frag.out
+++ b/Test/baseResults/hlsl.gatherRGBA.offset.dx10.frag.out
@@ -1,6 +1,7 @@
 hlsl.gatherRGBA.offset.dx10.frag
 Shader version: 500
 gl_FragCoord origin is upper left
+using depth_any
 0:? Sequence
 0:39  Function Definition: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:39    Function Parameters: 
@@ -596,13 +597,13 @@
 0:39          'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:39          Function Call: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:39        move second child to first child ( temp 4-component vector of float)
-0:?           'Color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 0:39          Color: direct index for structure ( temp 4-component vector of float)
 0:39            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:39            Constant:
 0:39              0 (const int)
 0:39        move second child to first child ( temp float)
-0:?           'Depth' ( out float FragDepth)
+0:?           '@entryPointOutput.Depth' ( out float FragDepth)
 0:39          Depth: direct index for structure ( temp float)
 0:39            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:39            Constant:
@@ -624,8 +625,8 @@
 0:?     'g_tTexcdi4' ( uniform itextureCube)
 0:?     'g_tTexcdu4' ( uniform utextureCube)
 0:?     'anon@0' (layout( row_major std140) uniform block{ uniform float c1,  uniform 2-component vector of float c2,  uniform 3-component vector of float c3,  uniform 4-component vector of float c4,  uniform int o1,  uniform 2-component vector of int o2,  uniform 3-component vector of int o3,  uniform 4-component vector of int o4})
-0:?     'Color' (layout( location=0) out 4-component vector of float)
-0:?     'Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 
 Linked fragment stage:
@@ -633,6 +634,7 @@
 
 Shader version: 500
 gl_FragCoord origin is upper left
+using depth_any
 0:? Sequence
 0:39  Function Definition: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:39    Function Parameters: 
@@ -1228,13 +1230,13 @@
 0:39          'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:39          Function Call: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:39        move second child to first child ( temp 4-component vector of float)
-0:?           'Color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 0:39          Color: direct index for structure ( temp 4-component vector of float)
 0:39            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:39            Constant:
 0:39              0 (const int)
 0:39        move second child to first child ( temp float)
-0:?           'Depth' ( out float FragDepth)
+0:?           '@entryPointOutput.Depth' ( out float FragDepth)
 0:39          Depth: direct index for structure ( temp float)
 0:39            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:39            Constant:
@@ -1256,11 +1258,15 @@
 0:?     'g_tTexcdi4' ( uniform itextureCube)
 0:?     'g_tTexcdu4' ( uniform utextureCube)
 0:?     'anon@0' (layout( row_major std140) uniform block{ uniform float c1,  uniform 2-component vector of float c2,  uniform 3-component vector of float c3,  uniform 4-component vector of float c4,  uniform int o1,  uniform 2-component vector of int o2,  uniform 3-component vector of int o3,  uniform 4-component vector of int o4})
-0:?     'Color' (layout( location=0) out 4-component vector of float)
-0:?     'Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
+
+error: SPIRV-Tools Validation Errors
+error: Expected Image Operand ConstOffsets to be a const object
+  %90 = OpImageGather %v4float %76 %78 %int_0 ConstOffsets %89
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 399
 
                               Capability Shader
@@ -1270,6 +1276,7 @@
                               MemoryModel Logical GLSL450
                               EntryPoint Fragment 4  "main" 363 367
                               ExecutionMode 4 OriginUpperLeft
+                              ExecutionMode 4 DepthReplacing
                               Source HLSL 500
                               Name 4  "main"
                               Name 8  "PS_OUTPUT"
@@ -1316,8 +1323,8 @@
                               Name 334  "txval324"
                               Name 351  "psout"
                               Name 360  "flattenTemp"
-                              Name 363  "Color"
-                              Name 367  "Depth"
+                              Name 363  "@entryPointOutput.Color"
+                              Name 367  "@entryPointOutput.Depth"
                               Name 370  "g_sSamp2d"
                               Name 373  "g_tTex1df4a"
                               Name 374  "g_tTex1df4"
@@ -1333,19 +1340,19 @@
                               Decorate 20(g_sSamp) DescriptorSet 0
                               Decorate 20(g_sSamp) Binding 0
                               MemberDecorate 30($Global) 0 Offset 0
-                              MemberDecorate 30($Global) 1 Offset 4
+                              MemberDecorate 30($Global) 1 Offset 8
                               MemberDecorate 30($Global) 2 Offset 16
                               MemberDecorate 30($Global) 3 Offset 32
                               MemberDecorate 30($Global) 4 Offset 48
-                              MemberDecorate 30($Global) 5 Offset 52
+                              MemberDecorate 30($Global) 5 Offset 56
                               MemberDecorate 30($Global) 6 Offset 64
                               MemberDecorate 30($Global) 7 Offset 80
                               Decorate 30($Global) Block
                               Decorate 32 DescriptorSet 0
                               Decorate 47(g_tTex2di4) DescriptorSet 0
                               Decorate 63(g_tTex2du4) DescriptorSet 0
-                              Decorate 363(Color) Location 0
-                              Decorate 367(Depth) BuiltIn FragDepth
+                              Decorate 363(@entryPointOutput.Color) Location 0
+                              Decorate 367(@entryPointOutput.Depth) BuiltIn FragDepth
                               Decorate 370(g_sSamp2d) DescriptorSet 0
                               Decorate 373(g_tTex1df4a) DescriptorSet 0
                               Decorate 373(g_tTex1df4a) Binding 1
@@ -1408,9 +1415,9 @@
              353:    7(fvec4) ConstantComposite 352 352 352 352
              355:             TypePointer Function 6(float)
              362:             TypePointer Output 7(fvec4)
-      363(Color):    362(ptr) Variable Output
+363(@entryPointOutput.Color):    362(ptr) Variable Output
              366:             TypePointer Output 6(float)
-      367(Depth):    366(ptr) Variable Output
+367(@entryPointOutput.Depth):    366(ptr) Variable Output
   370(g_sSamp2d):     19(ptr) Variable UniformConstant
              371:             TypeImage 6(float) 1D sampled format:Unknown
              372:             TypePointer UniformConstant 371
@@ -1447,10 +1454,10 @@
                               Store 360(flattenTemp) 361
              364:     12(ptr) AccessChain 360(flattenTemp) 41
              365:    7(fvec4) Load 364
-                              Store 363(Color) 365
+                              Store 363(@entryPointOutput.Color) 365
              368:    355(ptr) AccessChain 360(flattenTemp) 33
              369:    6(float) Load 368
-                              Store 367(Depth) 369
+                              Store 367(@entryPointOutput.Depth) 369
                               Return
                               FunctionEnd
       10(@main():8(PS_OUTPUT) Function None 9
diff --git a/Test/baseResults/hlsl.gatherRGBA.offsetarray.dx10.frag.out b/Test/baseResults/hlsl.gatherRGBA.offsetarray.dx10.frag.out
index ef200d8..22b02e7 100644
--- a/Test/baseResults/hlsl.gatherRGBA.offsetarray.dx10.frag.out
+++ b/Test/baseResults/hlsl.gatherRGBA.offsetarray.dx10.frag.out
@@ -1,6 +1,7 @@
 hlsl.gatherRGBA.offsetarray.dx10.frag
 Shader version: 500
 gl_FragCoord origin is upper left
+using depth_any
 0:? Sequence
 0:33  Function Definition: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:33    Function Parameters: 
@@ -596,13 +597,13 @@
 0:33          'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:33          Function Call: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:33        move second child to first child ( temp 4-component vector of float)
-0:?           'Color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 0:33          Color: direct index for structure ( temp 4-component vector of float)
 0:33            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:33            Constant:
 0:33              0 (const int)
 0:33        move second child to first child ( temp float)
-0:?           'Depth' ( out float FragDepth)
+0:?           '@entryPointOutput.Depth' ( out float FragDepth)
 0:33          Depth: direct index for structure ( temp float)
 0:33            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:33            Constant:
@@ -620,8 +621,8 @@
 0:?     'g_tTexcdi4a' ( uniform itextureCubeArray)
 0:?     'g_tTexcdu4a' ( uniform utextureCubeArray)
 0:?     'anon@0' (layout( row_major std140) uniform block{ uniform float c1,  uniform 2-component vector of float c2,  uniform 3-component vector of float c3,  uniform 4-component vector of float c4,  uniform int o1,  uniform 2-component vector of int o2,  uniform 3-component vector of int o3,  uniform 4-component vector of int o4})
-0:?     'Color' (layout( location=0) out 4-component vector of float)
-0:?     'Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 
 Linked fragment stage:
@@ -629,6 +630,7 @@
 
 Shader version: 500
 gl_FragCoord origin is upper left
+using depth_any
 0:? Sequence
 0:33  Function Definition: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:33    Function Parameters: 
@@ -1224,13 +1226,13 @@
 0:33          'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:33          Function Call: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:33        move second child to first child ( temp 4-component vector of float)
-0:?           'Color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 0:33          Color: direct index for structure ( temp 4-component vector of float)
 0:33            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:33            Constant:
 0:33              0 (const int)
 0:33        move second child to first child ( temp float)
-0:?           'Depth' ( out float FragDepth)
+0:?           '@entryPointOutput.Depth' ( out float FragDepth)
 0:33          Depth: direct index for structure ( temp float)
 0:33            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:33            Constant:
@@ -1248,11 +1250,15 @@
 0:?     'g_tTexcdi4a' ( uniform itextureCubeArray)
 0:?     'g_tTexcdu4a' ( uniform utextureCubeArray)
 0:?     'anon@0' (layout( row_major std140) uniform block{ uniform float c1,  uniform 2-component vector of float c2,  uniform 3-component vector of float c3,  uniform 4-component vector of float c4,  uniform int o1,  uniform 2-component vector of int o2,  uniform 3-component vector of int o3,  uniform 4-component vector of int o4})
-0:?     'Color' (layout( location=0) out 4-component vector of float)
-0:?     'Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
+
+error: SPIRV-Tools Validation Errors
+error: Expected Image Operand ConstOffsets to be a const object
+  %90 = OpImageGather %v4float %76 %78 %int_0 ConstOffsets %89
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 389
 
                               Capability Shader
@@ -1263,6 +1269,7 @@
                               MemoryModel Logical GLSL450
                               EntryPoint Fragment 4  "main" 363 367
                               ExecutionMode 4 OriginUpperLeft
+                              ExecutionMode 4 DepthReplacing
                               Source HLSL 500
                               Name 4  "main"
                               Name 8  "PS_OUTPUT"
@@ -1309,8 +1316,8 @@
                               Name 334  "txval324"
                               Name 351  "psout"
                               Name 360  "flattenTemp"
-                              Name 363  "Color"
-                              Name 367  "Depth"
+                              Name 363  "@entryPointOutput.Color"
+                              Name 367  "@entryPointOutput.Depth"
                               Name 370  "g_sSamp2d"
                               Name 373  "g_tTex1df4a"
                               Name 376  "g_tTex1di4a"
@@ -1322,19 +1329,19 @@
                               Decorate 20(g_sSamp) DescriptorSet 0
                               Decorate 20(g_sSamp) Binding 0
                               MemberDecorate 30($Global) 0 Offset 0
-                              MemberDecorate 30($Global) 1 Offset 4
+                              MemberDecorate 30($Global) 1 Offset 8
                               MemberDecorate 30($Global) 2 Offset 16
                               MemberDecorate 30($Global) 3 Offset 32
                               MemberDecorate 30($Global) 4 Offset 48
-                              MemberDecorate 30($Global) 5 Offset 52
+                              MemberDecorate 30($Global) 5 Offset 56
                               MemberDecorate 30($Global) 6 Offset 64
                               MemberDecorate 30($Global) 7 Offset 80
                               Decorate 30($Global) Block
                               Decorate 32 DescriptorSet 0
                               Decorate 47(g_tTex2di4a) DescriptorSet 0
                               Decorate 63(g_tTex2du4a) DescriptorSet 0
-                              Decorate 363(Color) Location 0
-                              Decorate 367(Depth) BuiltIn FragDepth
+                              Decorate 363(@entryPointOutput.Color) Location 0
+                              Decorate 367(@entryPointOutput.Depth) BuiltIn FragDepth
                               Decorate 370(g_sSamp2d) DescriptorSet 0
                               Decorate 373(g_tTex1df4a) DescriptorSet 0
                               Decorate 373(g_tTex1df4a) Binding 0
@@ -1392,9 +1399,9 @@
              353:    7(fvec4) ConstantComposite 352 352 352 352
              355:             TypePointer Function 6(float)
              362:             TypePointer Output 7(fvec4)
-      363(Color):    362(ptr) Variable Output
+363(@entryPointOutput.Color):    362(ptr) Variable Output
              366:             TypePointer Output 6(float)
-      367(Depth):    366(ptr) Variable Output
+367(@entryPointOutput.Depth):    366(ptr) Variable Output
   370(g_sSamp2d):     19(ptr) Variable UniformConstant
              371:             TypeImage 6(float) 1D array sampled format:Unknown
              372:             TypePointer UniformConstant 371
@@ -1421,10 +1428,10 @@
                               Store 360(flattenTemp) 361
              364:     12(ptr) AccessChain 360(flattenTemp) 41
              365:    7(fvec4) Load 364
-                              Store 363(Color) 365
+                              Store 363(@entryPointOutput.Color) 365
              368:    355(ptr) AccessChain 360(flattenTemp) 131
              369:    6(float) Load 368
-                              Store 367(Depth) 369
+                              Store 367(@entryPointOutput.Depth) 369
                               Return
                               FunctionEnd
       10(@main():8(PS_OUTPUT) Function None 9
diff --git a/Test/baseResults/hlsl.gathercmpRGBA.offset.dx10.frag.out b/Test/baseResults/hlsl.gathercmpRGBA.offset.dx10.frag.out
index cbbc259..fe99df5 100644
--- a/Test/baseResults/hlsl.gathercmpRGBA.offset.dx10.frag.out
+++ b/Test/baseResults/hlsl.gathercmpRGBA.offset.dx10.frag.out
@@ -1,6 +1,7 @@
 hlsl.gathercmpRGBA.offset.dx10.frag
 Shader version: 500
 gl_FragCoord origin is upper left
+using depth_any
 0:? Sequence
 0:38  Function Definition: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:38    Function Parameters: 
@@ -10,7 +11,7 @@
 0:45          'txval001' ( temp 4-component vector of float)
 0:45          textureGatherOffset ( temp 4-component vector of float)
 0:45            Construct combined texture-sampler ( temp sampler2DShadow)
-0:45              'g_tTex2df4' ( uniform texture2D)
+0:45              'g_tTex2df4' ( uniform texture2DShadow)
 0:45              'g_sSampCmp' (layout( binding=0) uniform sampler)
 0:45            c2: direct index for structure ( uniform 2-component vector of float)
 0:45              'anon@0' (layout( row_major std140) uniform block{ uniform float c1,  uniform 2-component vector of float c2,  uniform 3-component vector of float c3,  uniform 4-component vector of float c4})
@@ -26,7 +27,7 @@
 0:46          'txval011' ( temp 4-component vector of int)
 0:46          textureGatherOffset ( temp 4-component vector of int)
 0:46            Construct combined texture-sampler ( temp isampler2DShadow)
-0:46              'g_tTex2di4' ( uniform itexture2D)
+0:46              'g_tTex2di4' ( uniform itexture2DShadow)
 0:46              'g_sSampCmp' (layout( binding=0) uniform sampler)
 0:46            c2: direct index for structure ( uniform 2-component vector of float)
 0:46              'anon@0' (layout( row_major std140) uniform block{ uniform float c1,  uniform 2-component vector of float c2,  uniform 3-component vector of float c3,  uniform 4-component vector of float c4})
@@ -42,7 +43,7 @@
 0:47          'txval021' ( temp 4-component vector of uint)
 0:47          textureGatherOffset ( temp 4-component vector of uint)
 0:47            Construct combined texture-sampler ( temp usampler2DShadow)
-0:47              'g_tTex2du4' ( uniform utexture2D)
+0:47              'g_tTex2du4' ( uniform utexture2DShadow)
 0:47              'g_sSampCmp' (layout( binding=0) uniform sampler)
 0:47            c2: direct index for structure ( uniform 2-component vector of float)
 0:47              'anon@0' (layout( row_major std140) uniform block{ uniform float c1,  uniform 2-component vector of float c2,  uniform 3-component vector of float c3,  uniform 4-component vector of float c4})
@@ -58,7 +59,7 @@
 0:49          'txval004' ( temp 4-component vector of float)
 0:49          textureGatherOffsets ( temp 4-component vector of float)
 0:49            Construct combined texture-sampler ( temp sampler2DShadow)
-0:49              'g_tTex2df4' ( uniform texture2D)
+0:49              'g_tTex2df4' ( uniform texture2DShadow)
 0:49              'g_sSampCmp' (layout( binding=0) uniform sampler)
 0:49            c2: direct index for structure ( uniform 2-component vector of float)
 0:49              'anon@0' (layout( row_major std140) uniform block{ uniform float c1,  uniform 2-component vector of float c2,  uniform 3-component vector of float c3,  uniform 4-component vector of float c4})
@@ -80,7 +81,7 @@
 0:50          'txval014' ( temp 4-component vector of int)
 0:50          textureGatherOffsets ( temp 4-component vector of int)
 0:50            Construct combined texture-sampler ( temp isampler2DShadow)
-0:50              'g_tTex2di4' ( uniform itexture2D)
+0:50              'g_tTex2di4' ( uniform itexture2DShadow)
 0:50              'g_sSampCmp' (layout( binding=0) uniform sampler)
 0:50            c2: direct index for structure ( uniform 2-component vector of float)
 0:50              'anon@0' (layout( row_major std140) uniform block{ uniform float c1,  uniform 2-component vector of float c2,  uniform 3-component vector of float c3,  uniform 4-component vector of float c4})
@@ -102,7 +103,7 @@
 0:51          'txval024' ( temp 4-component vector of uint)
 0:51          textureGatherOffsets ( temp 4-component vector of uint)
 0:51            Construct combined texture-sampler ( temp usampler2DShadow)
-0:51              'g_tTex2du4' ( uniform utexture2D)
+0:51              'g_tTex2du4' ( uniform utexture2DShadow)
 0:51              'g_sSampCmp' (layout( binding=0) uniform sampler)
 0:51            c2: direct index for structure ( uniform 2-component vector of float)
 0:51              'anon@0' (layout( row_major std140) uniform block{ uniform float c1,  uniform 2-component vector of float c2,  uniform 3-component vector of float c3,  uniform 4-component vector of float c4})
@@ -124,7 +125,7 @@
 0:53          'txval401' ( temp 4-component vector of float)
 0:53          textureGatherOffset ( temp 4-component vector of float)
 0:53            Construct combined texture-sampler ( temp sampler2DShadow)
-0:53              'g_tTex2df4' ( uniform texture2D)
+0:53              'g_tTex2df4' ( uniform texture2DShadow)
 0:53              'g_sSampCmp' (layout( binding=0) uniform sampler)
 0:53            c2: direct index for structure ( uniform 2-component vector of float)
 0:53              'anon@0' (layout( row_major std140) uniform block{ uniform float c1,  uniform 2-component vector of float c2,  uniform 3-component vector of float c3,  uniform 4-component vector of float c4})
@@ -140,7 +141,7 @@
 0:54          'txval411' ( temp 4-component vector of int)
 0:54          textureGatherOffset ( temp 4-component vector of int)
 0:54            Construct combined texture-sampler ( temp isampler2DShadow)
-0:54              'g_tTex2di4' ( uniform itexture2D)
+0:54              'g_tTex2di4' ( uniform itexture2DShadow)
 0:54              'g_sSampCmp' (layout( binding=0) uniform sampler)
 0:54            c2: direct index for structure ( uniform 2-component vector of float)
 0:54              'anon@0' (layout( row_major std140) uniform block{ uniform float c1,  uniform 2-component vector of float c2,  uniform 3-component vector of float c3,  uniform 4-component vector of float c4})
@@ -156,7 +157,7 @@
 0:55          'txval421' ( temp 4-component vector of uint)
 0:55          textureGatherOffset ( temp 4-component vector of uint)
 0:55            Construct combined texture-sampler ( temp usampler2DShadow)
-0:55              'g_tTex2du4' ( uniform utexture2D)
+0:55              'g_tTex2du4' ( uniform utexture2DShadow)
 0:55              'g_sSampCmp' (layout( binding=0) uniform sampler)
 0:55            c2: direct index for structure ( uniform 2-component vector of float)
 0:55              'anon@0' (layout( row_major std140) uniform block{ uniform float c1,  uniform 2-component vector of float c2,  uniform 3-component vector of float c3,  uniform 4-component vector of float c4})
@@ -194,13 +195,13 @@
 0:38          'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:38          Function Call: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:38        move second child to first child ( temp 4-component vector of float)
-0:?           'Color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 0:38          Color: direct index for structure ( temp 4-component vector of float)
 0:38            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:38            Constant:
 0:38              0 (const int)
 0:38        move second child to first child ( temp float)
-0:?           'Depth' ( out float FragDepth)
+0:?           '@entryPointOutput.Depth' ( out float FragDepth)
 0:38          Depth: direct index for structure ( temp float)
 0:38            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:38            Constant:
@@ -211,9 +212,9 @@
 0:?     'g_tTex1df4' (layout( binding=0) uniform texture1D)
 0:?     'g_tTex1di4' ( uniform itexture1D)
 0:?     'g_tTex1du4' ( uniform utexture1D)
-0:?     'g_tTex2df4' ( uniform texture2D)
-0:?     'g_tTex2di4' ( uniform itexture2D)
-0:?     'g_tTex2du4' ( uniform utexture2D)
+0:?     'g_tTex2df4' ( uniform texture2DShadow)
+0:?     'g_tTex2di4' ( uniform itexture2DShadow)
+0:?     'g_tTex2du4' ( uniform utexture2DShadow)
 0:?     'g_tTex3df4' ( uniform texture3D)
 0:?     'g_tTex3di4' ( uniform itexture3D)
 0:?     'g_tTex3du4' ( uniform utexture3D)
@@ -221,8 +222,8 @@
 0:?     'g_tTexcdi4' ( uniform itextureCube)
 0:?     'g_tTexcdu4' ( uniform utextureCube)
 0:?     'anon@0' (layout( row_major std140) uniform block{ uniform float c1,  uniform 2-component vector of float c2,  uniform 3-component vector of float c3,  uniform 4-component vector of float c4})
-0:?     'Color' (layout( location=0) out 4-component vector of float)
-0:?     'Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 
 Linked fragment stage:
@@ -230,6 +231,7 @@
 
 Shader version: 500
 gl_FragCoord origin is upper left
+using depth_any
 0:? Sequence
 0:38  Function Definition: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:38    Function Parameters: 
@@ -239,7 +241,7 @@
 0:45          'txval001' ( temp 4-component vector of float)
 0:45          textureGatherOffset ( temp 4-component vector of float)
 0:45            Construct combined texture-sampler ( temp sampler2DShadow)
-0:45              'g_tTex2df4' ( uniform texture2D)
+0:45              'g_tTex2df4' ( uniform texture2DShadow)
 0:45              'g_sSampCmp' (layout( binding=0) uniform sampler)
 0:45            c2: direct index for structure ( uniform 2-component vector of float)
 0:45              'anon@0' (layout( row_major std140) uniform block{ uniform float c1,  uniform 2-component vector of float c2,  uniform 3-component vector of float c3,  uniform 4-component vector of float c4})
@@ -255,7 +257,7 @@
 0:46          'txval011' ( temp 4-component vector of int)
 0:46          textureGatherOffset ( temp 4-component vector of int)
 0:46            Construct combined texture-sampler ( temp isampler2DShadow)
-0:46              'g_tTex2di4' ( uniform itexture2D)
+0:46              'g_tTex2di4' ( uniform itexture2DShadow)
 0:46              'g_sSampCmp' (layout( binding=0) uniform sampler)
 0:46            c2: direct index for structure ( uniform 2-component vector of float)
 0:46              'anon@0' (layout( row_major std140) uniform block{ uniform float c1,  uniform 2-component vector of float c2,  uniform 3-component vector of float c3,  uniform 4-component vector of float c4})
@@ -271,7 +273,7 @@
 0:47          'txval021' ( temp 4-component vector of uint)
 0:47          textureGatherOffset ( temp 4-component vector of uint)
 0:47            Construct combined texture-sampler ( temp usampler2DShadow)
-0:47              'g_tTex2du4' ( uniform utexture2D)
+0:47              'g_tTex2du4' ( uniform utexture2DShadow)
 0:47              'g_sSampCmp' (layout( binding=0) uniform sampler)
 0:47            c2: direct index for structure ( uniform 2-component vector of float)
 0:47              'anon@0' (layout( row_major std140) uniform block{ uniform float c1,  uniform 2-component vector of float c2,  uniform 3-component vector of float c3,  uniform 4-component vector of float c4})
@@ -287,7 +289,7 @@
 0:49          'txval004' ( temp 4-component vector of float)
 0:49          textureGatherOffsets ( temp 4-component vector of float)
 0:49            Construct combined texture-sampler ( temp sampler2DShadow)
-0:49              'g_tTex2df4' ( uniform texture2D)
+0:49              'g_tTex2df4' ( uniform texture2DShadow)
 0:49              'g_sSampCmp' (layout( binding=0) uniform sampler)
 0:49            c2: direct index for structure ( uniform 2-component vector of float)
 0:49              'anon@0' (layout( row_major std140) uniform block{ uniform float c1,  uniform 2-component vector of float c2,  uniform 3-component vector of float c3,  uniform 4-component vector of float c4})
@@ -309,7 +311,7 @@
 0:50          'txval014' ( temp 4-component vector of int)
 0:50          textureGatherOffsets ( temp 4-component vector of int)
 0:50            Construct combined texture-sampler ( temp isampler2DShadow)
-0:50              'g_tTex2di4' ( uniform itexture2D)
+0:50              'g_tTex2di4' ( uniform itexture2DShadow)
 0:50              'g_sSampCmp' (layout( binding=0) uniform sampler)
 0:50            c2: direct index for structure ( uniform 2-component vector of float)
 0:50              'anon@0' (layout( row_major std140) uniform block{ uniform float c1,  uniform 2-component vector of float c2,  uniform 3-component vector of float c3,  uniform 4-component vector of float c4})
@@ -331,7 +333,7 @@
 0:51          'txval024' ( temp 4-component vector of uint)
 0:51          textureGatherOffsets ( temp 4-component vector of uint)
 0:51            Construct combined texture-sampler ( temp usampler2DShadow)
-0:51              'g_tTex2du4' ( uniform utexture2D)
+0:51              'g_tTex2du4' ( uniform utexture2DShadow)
 0:51              'g_sSampCmp' (layout( binding=0) uniform sampler)
 0:51            c2: direct index for structure ( uniform 2-component vector of float)
 0:51              'anon@0' (layout( row_major std140) uniform block{ uniform float c1,  uniform 2-component vector of float c2,  uniform 3-component vector of float c3,  uniform 4-component vector of float c4})
@@ -353,7 +355,7 @@
 0:53          'txval401' ( temp 4-component vector of float)
 0:53          textureGatherOffset ( temp 4-component vector of float)
 0:53            Construct combined texture-sampler ( temp sampler2DShadow)
-0:53              'g_tTex2df4' ( uniform texture2D)
+0:53              'g_tTex2df4' ( uniform texture2DShadow)
 0:53              'g_sSampCmp' (layout( binding=0) uniform sampler)
 0:53            c2: direct index for structure ( uniform 2-component vector of float)
 0:53              'anon@0' (layout( row_major std140) uniform block{ uniform float c1,  uniform 2-component vector of float c2,  uniform 3-component vector of float c3,  uniform 4-component vector of float c4})
@@ -369,7 +371,7 @@
 0:54          'txval411' ( temp 4-component vector of int)
 0:54          textureGatherOffset ( temp 4-component vector of int)
 0:54            Construct combined texture-sampler ( temp isampler2DShadow)
-0:54              'g_tTex2di4' ( uniform itexture2D)
+0:54              'g_tTex2di4' ( uniform itexture2DShadow)
 0:54              'g_sSampCmp' (layout( binding=0) uniform sampler)
 0:54            c2: direct index for structure ( uniform 2-component vector of float)
 0:54              'anon@0' (layout( row_major std140) uniform block{ uniform float c1,  uniform 2-component vector of float c2,  uniform 3-component vector of float c3,  uniform 4-component vector of float c4})
@@ -385,7 +387,7 @@
 0:55          'txval421' ( temp 4-component vector of uint)
 0:55          textureGatherOffset ( temp 4-component vector of uint)
 0:55            Construct combined texture-sampler ( temp usampler2DShadow)
-0:55              'g_tTex2du4' ( uniform utexture2D)
+0:55              'g_tTex2du4' ( uniform utexture2DShadow)
 0:55              'g_sSampCmp' (layout( binding=0) uniform sampler)
 0:55            c2: direct index for structure ( uniform 2-component vector of float)
 0:55              'anon@0' (layout( row_major std140) uniform block{ uniform float c1,  uniform 2-component vector of float c2,  uniform 3-component vector of float c3,  uniform 4-component vector of float c4})
@@ -423,13 +425,13 @@
 0:38          'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:38          Function Call: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:38        move second child to first child ( temp 4-component vector of float)
-0:?           'Color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 0:38          Color: direct index for structure ( temp 4-component vector of float)
 0:38            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:38            Constant:
 0:38              0 (const int)
 0:38        move second child to first child ( temp float)
-0:?           'Depth' ( out float FragDepth)
+0:?           '@entryPointOutput.Depth' ( out float FragDepth)
 0:38          Depth: direct index for structure ( temp float)
 0:38            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:38            Constant:
@@ -440,9 +442,9 @@
 0:?     'g_tTex1df4' (layout( binding=0) uniform texture1D)
 0:?     'g_tTex1di4' ( uniform itexture1D)
 0:?     'g_tTex1du4' ( uniform utexture1D)
-0:?     'g_tTex2df4' ( uniform texture2D)
-0:?     'g_tTex2di4' ( uniform itexture2D)
-0:?     'g_tTex2du4' ( uniform utexture2D)
+0:?     'g_tTex2df4' ( uniform texture2DShadow)
+0:?     'g_tTex2di4' ( uniform itexture2DShadow)
+0:?     'g_tTex2du4' ( uniform utexture2DShadow)
 0:?     'g_tTex3df4' ( uniform texture3D)
 0:?     'g_tTex3di4' ( uniform itexture3D)
 0:?     'g_tTex3du4' ( uniform utexture3D)
@@ -450,19 +452,21 @@
 0:?     'g_tTexcdi4' ( uniform itextureCube)
 0:?     'g_tTexcdu4' ( uniform utextureCube)
 0:?     'anon@0' (layout( row_major std140) uniform block{ uniform float c1,  uniform 2-component vector of float c2,  uniform 3-component vector of float c3,  uniform 4-component vector of float c4})
-0:?     'Color' (layout( location=0) out 4-component vector of float)
-0:?     'Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80001
-// Id's are bound by 167
+// Generated by (magic number): 80007
+// Id's are bound by 164
 
                               Capability Shader
+                              Capability ImageGatherExtended
                               Capability Sampled1D
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "main" 132 136
+                              EntryPoint Fragment 4  "main" 129 133
                               ExecutionMode 4 OriginUpperLeft
+                              ExecutionMode 4 DepthReplacing
                               Source HLSL 500
                               Name 4  "main"
                               Name 8  "PS_OUTPUT"
@@ -472,61 +476,61 @@
                               Name 13  "txval001"
                               Name 16  "g_tTex2df4"
                               Name 20  "g_sSampCmp"
-                              Name 27  "$Global"
-                              MemberName 27($Global) 0  "c1"
-                              MemberName 27($Global) 1  "c2"
-                              MemberName 27($Global) 2  "c3"
-                              MemberName 27($Global) 3  "c4"
-                              Name 29  ""
-                              Name 42  "txval011"
-                              Name 45  "g_tTex2di4"
-                              Name 59  "txval021"
-                              Name 62  "g_tTex2du4"
-                              Name 72  "txval004"
-                              Name 82  "txval014"
-                              Name 90  "txval024"
-                              Name 98  "txval401"
-                              Name 105  "txval411"
-                              Name 112  "txval421"
-                              Name 120  "psout"
-                              Name 129  "flattenTemp"
-                              Name 132  "Color"
-                              Name 136  "Depth"
-                              Name 141  "g_tTex1df4a"
-                              Name 142  "g_tTex1df4"
-                              Name 145  "g_tTex1di4"
-                              Name 148  "g_tTex1du4"
-                              Name 151  "g_tTex3df4"
-                              Name 154  "g_tTex3di4"
-                              Name 157  "g_tTex3du4"
-                              Name 160  "g_tTexcdf4"
-                              Name 163  "g_tTexcdi4"
-                              Name 166  "g_tTexcdu4"
+                              Name 26  "$Global"
+                              MemberName 26($Global) 0  "c1"
+                              MemberName 26($Global) 1  "c2"
+                              MemberName 26($Global) 2  "c3"
+                              MemberName 26($Global) 3  "c4"
+                              Name 28  ""
+                              Name 41  "txval011"
+                              Name 44  "g_tTex2di4"
+                              Name 57  "txval021"
+                              Name 60  "g_tTex2du4"
+                              Name 69  "txval004"
+                              Name 79  "txval014"
+                              Name 87  "txval024"
+                              Name 95  "txval401"
+                              Name 102  "txval411"
+                              Name 109  "txval421"
+                              Name 117  "psout"
+                              Name 126  "flattenTemp"
+                              Name 129  "@entryPointOutput.Color"
+                              Name 133  "@entryPointOutput.Depth"
+                              Name 138  "g_tTex1df4a"
+                              Name 139  "g_tTex1df4"
+                              Name 142  "g_tTex1di4"
+                              Name 145  "g_tTex1du4"
+                              Name 148  "g_tTex3df4"
+                              Name 151  "g_tTex3di4"
+                              Name 154  "g_tTex3du4"
+                              Name 157  "g_tTexcdf4"
+                              Name 160  "g_tTexcdi4"
+                              Name 163  "g_tTexcdu4"
                               Decorate 16(g_tTex2df4) DescriptorSet 0
                               Decorate 20(g_sSampCmp) DescriptorSet 0
                               Decorate 20(g_sSampCmp) Binding 0
-                              MemberDecorate 27($Global) 0 Offset 0
-                              MemberDecorate 27($Global) 1 Offset 4
-                              MemberDecorate 27($Global) 2 Offset 16
-                              MemberDecorate 27($Global) 3 Offset 32
-                              Decorate 27($Global) Block
-                              Decorate 29 DescriptorSet 0
-                              Decorate 45(g_tTex2di4) DescriptorSet 0
-                              Decorate 62(g_tTex2du4) DescriptorSet 0
-                              Decorate 132(Color) Location 0
-                              Decorate 136(Depth) BuiltIn FragDepth
-                              Decorate 141(g_tTex1df4a) DescriptorSet 0
-                              Decorate 141(g_tTex1df4a) Binding 1
-                              Decorate 142(g_tTex1df4) DescriptorSet 0
-                              Decorate 142(g_tTex1df4) Binding 0
-                              Decorate 145(g_tTex1di4) DescriptorSet 0
-                              Decorate 148(g_tTex1du4) DescriptorSet 0
-                              Decorate 151(g_tTex3df4) DescriptorSet 0
-                              Decorate 154(g_tTex3di4) DescriptorSet 0
-                              Decorate 157(g_tTex3du4) DescriptorSet 0
-                              Decorate 160(g_tTexcdf4) DescriptorSet 0
-                              Decorate 163(g_tTexcdi4) DescriptorSet 0
-                              Decorate 166(g_tTexcdu4) DescriptorSet 0
+                              MemberDecorate 26($Global) 0 Offset 0
+                              MemberDecorate 26($Global) 1 Offset 8
+                              MemberDecorate 26($Global) 2 Offset 16
+                              MemberDecorate 26($Global) 3 Offset 32
+                              Decorate 26($Global) Block
+                              Decorate 28 DescriptorSet 0
+                              Decorate 44(g_tTex2di4) DescriptorSet 0
+                              Decorate 60(g_tTex2du4) DescriptorSet 0
+                              Decorate 129(@entryPointOutput.Color) Location 0
+                              Decorate 133(@entryPointOutput.Depth) BuiltIn FragDepth
+                              Decorate 138(g_tTex1df4a) DescriptorSet 0
+                              Decorate 138(g_tTex1df4a) Binding 1
+                              Decorate 139(g_tTex1df4) DescriptorSet 0
+                              Decorate 139(g_tTex1df4) Binding 0
+                              Decorate 142(g_tTex1di4) DescriptorSet 0
+                              Decorate 145(g_tTex1du4) DescriptorSet 0
+                              Decorate 148(g_tTex3df4) DescriptorSet 0
+                              Decorate 151(g_tTex3di4) DescriptorSet 0
+                              Decorate 154(g_tTex3du4) DescriptorSet 0
+                              Decorate 157(g_tTexcdf4) DescriptorSet 0
+                              Decorate 160(g_tTexcdi4) DescriptorSet 0
+                              Decorate 163(g_tTexcdu4) DescriptorSet 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -534,177 +538,174 @@
     8(PS_OUTPUT):             TypeStruct 7(fvec4) 6(float)
                9:             TypeFunction 8(PS_OUTPUT)
               12:             TypePointer Function 7(fvec4)
-              14:             TypeImage 6(float) 2D sampled format:Unknown
+              14:             TypeImage 6(float) 2D depth sampled format:Unknown
               15:             TypePointer UniformConstant 14
   16(g_tTex2df4):     15(ptr) Variable UniformConstant
               18:             TypeSampler
               19:             TypePointer UniformConstant 18
   20(g_sSampCmp):     19(ptr) Variable UniformConstant
-              22:             TypeImage 6(float) 2D depth sampled format:Unknown
-              23:             TypeSampledImage 22
-              25:             TypeVector 6(float) 2
-              26:             TypeVector 6(float) 3
-     27($Global):             TypeStruct 6(float) 25(fvec2) 26(fvec3) 7(fvec4)
-              28:             TypePointer Uniform 27($Global)
-              29:     28(ptr) Variable Uniform
-              30:             TypeInt 32 1
-              31:     30(int) Constant 1
-              32:             TypePointer Uniform 25(fvec2)
-              35:    6(float) Constant 1061158912
-              36:             TypeVector 30(int) 2
-              37:     30(int) Constant 0
-              38:   36(ivec2) ConstantComposite 31 37
-              40:             TypeVector 30(int) 4
-              41:             TypePointer Function 40(ivec4)
-              43:             TypeImage 30(int) 2D sampled format:Unknown
-              44:             TypePointer UniformConstant 43
-  45(g_tTex2di4):     44(ptr) Variable UniformConstant
-              48:             TypeImage 30(int) 2D depth sampled format:Unknown
-              49:             TypeSampledImage 48
-              53:     30(int) Constant 4294967295
-              54:   36(ivec2) ConstantComposite 31 53
-              56:             TypeInt 32 0
-              57:             TypeVector 56(int) 4
-              58:             TypePointer Function 57(ivec4)
-              60:             TypeImage 56(int) 2D sampled format:Unknown
-              61:             TypePointer UniformConstant 60
-  62(g_tTex2du4):     61(ptr) Variable UniformConstant
-              65:             TypeImage 56(int) 2D depth sampled format:Unknown
-              66:             TypeSampledImage 65
-              70:   36(ivec2) ConstantComposite 31 31
-              78:     56(int) Constant 4
-              79:             TypeArray 36(ivec2) 78
-              80:          79 ConstantComposite 38 38 38 38
-              88:          79 ConstantComposite 54 54 54 54
-              96:          79 ConstantComposite 70 70 70 70
-             119:             TypePointer Function 8(PS_OUTPUT)
-             121:    6(float) Constant 1065353216
-             122:    7(fvec4) ConstantComposite 121 121 121 121
-             124:             TypePointer Function 6(float)
-             131:             TypePointer Output 7(fvec4)
-      132(Color):    131(ptr) Variable Output
-             135:             TypePointer Output 6(float)
-      136(Depth):    135(ptr) Variable Output
-             139:             TypeImage 6(float) 1D sampled format:Unknown
-             140:             TypePointer UniformConstant 139
-141(g_tTex1df4a):    140(ptr) Variable UniformConstant
- 142(g_tTex1df4):    140(ptr) Variable UniformConstant
-             143:             TypeImage 30(int) 1D sampled format:Unknown
+              22:             TypeSampledImage 14
+              24:             TypeVector 6(float) 2
+              25:             TypeVector 6(float) 3
+     26($Global):             TypeStruct 6(float) 24(fvec2) 25(fvec3) 7(fvec4)
+              27:             TypePointer Uniform 26($Global)
+              28:     27(ptr) Variable Uniform
+              29:             TypeInt 32 1
+              30:     29(int) Constant 1
+              31:             TypePointer Uniform 24(fvec2)
+              34:    6(float) Constant 1061158912
+              35:             TypeVector 29(int) 2
+              36:     29(int) Constant 0
+              37:   35(ivec2) ConstantComposite 30 36
+              39:             TypeVector 29(int) 4
+              40:             TypePointer Function 39(ivec4)
+              42:             TypeImage 29(int) 2D depth sampled format:Unknown
+              43:             TypePointer UniformConstant 42
+  44(g_tTex2di4):     43(ptr) Variable UniformConstant
+              47:             TypeSampledImage 42
+              51:     29(int) Constant 4294967295
+              52:   35(ivec2) ConstantComposite 30 51
+              54:             TypeInt 32 0
+              55:             TypeVector 54(int) 4
+              56:             TypePointer Function 55(ivec4)
+              58:             TypeImage 54(int) 2D depth sampled format:Unknown
+              59:             TypePointer UniformConstant 58
+  60(g_tTex2du4):     59(ptr) Variable UniformConstant
+              63:             TypeSampledImage 58
+              67:   35(ivec2) ConstantComposite 30 30
+              75:     54(int) Constant 4
+              76:             TypeArray 35(ivec2) 75
+              77:          76 ConstantComposite 37 37 37 37
+              85:          76 ConstantComposite 52 52 52 52
+              93:          76 ConstantComposite 67 67 67 67
+             116:             TypePointer Function 8(PS_OUTPUT)
+             118:    6(float) Constant 1065353216
+             119:    7(fvec4) ConstantComposite 118 118 118 118
+             121:             TypePointer Function 6(float)
+             128:             TypePointer Output 7(fvec4)
+129(@entryPointOutput.Color):    128(ptr) Variable Output
+             132:             TypePointer Output 6(float)
+133(@entryPointOutput.Depth):    132(ptr) Variable Output
+             136:             TypeImage 6(float) 1D sampled format:Unknown
+             137:             TypePointer UniformConstant 136
+138(g_tTex1df4a):    137(ptr) Variable UniformConstant
+ 139(g_tTex1df4):    137(ptr) Variable UniformConstant
+             140:             TypeImage 29(int) 1D sampled format:Unknown
+             141:             TypePointer UniformConstant 140
+ 142(g_tTex1di4):    141(ptr) Variable UniformConstant
+             143:             TypeImage 54(int) 1D sampled format:Unknown
              144:             TypePointer UniformConstant 143
- 145(g_tTex1di4):    144(ptr) Variable UniformConstant
-             146:             TypeImage 56(int) 1D sampled format:Unknown
+ 145(g_tTex1du4):    144(ptr) Variable UniformConstant
+             146:             TypeImage 6(float) 3D sampled format:Unknown
              147:             TypePointer UniformConstant 146
- 148(g_tTex1du4):    147(ptr) Variable UniformConstant
-             149:             TypeImage 6(float) 3D sampled format:Unknown
+ 148(g_tTex3df4):    147(ptr) Variable UniformConstant
+             149:             TypeImage 29(int) 3D sampled format:Unknown
              150:             TypePointer UniformConstant 149
- 151(g_tTex3df4):    150(ptr) Variable UniformConstant
-             152:             TypeImage 30(int) 3D sampled format:Unknown
+ 151(g_tTex3di4):    150(ptr) Variable UniformConstant
+             152:             TypeImage 54(int) 3D sampled format:Unknown
              153:             TypePointer UniformConstant 152
- 154(g_tTex3di4):    153(ptr) Variable UniformConstant
-             155:             TypeImage 56(int) 3D sampled format:Unknown
+ 154(g_tTex3du4):    153(ptr) Variable UniformConstant
+             155:             TypeImage 6(float) Cube sampled format:Unknown
              156:             TypePointer UniformConstant 155
- 157(g_tTex3du4):    156(ptr) Variable UniformConstant
-             158:             TypeImage 6(float) Cube sampled format:Unknown
+ 157(g_tTexcdf4):    156(ptr) Variable UniformConstant
+             158:             TypeImage 29(int) Cube sampled format:Unknown
              159:             TypePointer UniformConstant 158
- 160(g_tTexcdf4):    159(ptr) Variable UniformConstant
-             161:             TypeImage 30(int) Cube sampled format:Unknown
+ 160(g_tTexcdi4):    159(ptr) Variable UniformConstant
+             161:             TypeImage 54(int) Cube sampled format:Unknown
              162:             TypePointer UniformConstant 161
- 163(g_tTexcdi4):    162(ptr) Variable UniformConstant
-             164:             TypeImage 56(int) Cube sampled format:Unknown
-             165:             TypePointer UniformConstant 164
- 166(g_tTexcdu4):    165(ptr) Variable UniformConstant
+ 163(g_tTexcdu4):    162(ptr) Variable UniformConstant
          4(main):           2 Function None 3
                5:             Label
-129(flattenTemp):    119(ptr) Variable Function
-             130:8(PS_OUTPUT) FunctionCall 10(@main()
-                              Store 129(flattenTemp) 130
-             133:     12(ptr) AccessChain 129(flattenTemp) 37
-             134:    7(fvec4) Load 133
-                              Store 132(Color) 134
-             137:    124(ptr) AccessChain 129(flattenTemp) 31
-             138:    6(float) Load 137
-                              Store 136(Depth) 138
+126(flattenTemp):    116(ptr) Variable Function
+             127:8(PS_OUTPUT) FunctionCall 10(@main()
+                              Store 126(flattenTemp) 127
+             130:     12(ptr) AccessChain 126(flattenTemp) 36
+             131:    7(fvec4) Load 130
+                              Store 129(@entryPointOutput.Color) 131
+             134:    121(ptr) AccessChain 126(flattenTemp) 30
+             135:    6(float) Load 134
+                              Store 133(@entryPointOutput.Depth) 135
                               Return
                               FunctionEnd
       10(@main():8(PS_OUTPUT) Function None 9
               11:             Label
     13(txval001):     12(ptr) Variable Function
-    42(txval011):     41(ptr) Variable Function
-    59(txval021):     58(ptr) Variable Function
-    72(txval004):     12(ptr) Variable Function
-    82(txval014):     41(ptr) Variable Function
-    90(txval024):     58(ptr) Variable Function
-    98(txval401):     12(ptr) Variable Function
-   105(txval411):     41(ptr) Variable Function
-   112(txval421):     58(ptr) Variable Function
-      120(psout):    119(ptr) Variable Function
+    41(txval011):     40(ptr) Variable Function
+    57(txval021):     56(ptr) Variable Function
+    69(txval004):     12(ptr) Variable Function
+    79(txval014):     40(ptr) Variable Function
+    87(txval024):     56(ptr) Variable Function
+    95(txval401):     12(ptr) Variable Function
+   102(txval411):     40(ptr) Variable Function
+   109(txval421):     56(ptr) Variable Function
+      117(psout):    116(ptr) Variable Function
               17:          14 Load 16(g_tTex2df4)
               21:          18 Load 20(g_sSampCmp)
-              24:          23 SampledImage 17 21
-              33:     32(ptr) AccessChain 29 31
-              34:   25(fvec2) Load 33
-              39:    7(fvec4) ImageDrefGather 24 34 35 ConstOffset 38
-                              Store 13(txval001) 39
-              46:          43 Load 45(g_tTex2di4)
-              47:          18 Load 20(g_sSampCmp)
-              50:          49 SampledImage 46 47
-              51:     32(ptr) AccessChain 29 31
-              52:   25(fvec2) Load 51
-              55:   40(ivec4) ImageDrefGather 50 52 35 ConstOffset 54
-                              Store 42(txval011) 55
-              63:          60 Load 62(g_tTex2du4)
-              64:          18 Load 20(g_sSampCmp)
-              67:          66 SampledImage 63 64
-              68:     32(ptr) AccessChain 29 31
-              69:   25(fvec2) Load 68
-              71:   57(ivec4) ImageDrefGather 67 69 35 ConstOffset 70
-                              Store 59(txval021) 71
-              73:          14 Load 16(g_tTex2df4)
-              74:          18 Load 20(g_sSampCmp)
-              75:          23 SampledImage 73 74
-              76:     32(ptr) AccessChain 29 31
-              77:   25(fvec2) Load 76
-              81:    7(fvec4) ImageDrefGather 75 77 35 ConstOffsets 80
-                              Store 72(txval004) 81
-              83:          43 Load 45(g_tTex2di4)
-              84:          18 Load 20(g_sSampCmp)
-              85:          49 SampledImage 83 84
-              86:     32(ptr) AccessChain 29 31
-              87:   25(fvec2) Load 86
-              89:   40(ivec4) ImageDrefGather 85 87 35 ConstOffsets 88
-                              Store 82(txval014) 89
-              91:          60 Load 62(g_tTex2du4)
-              92:          18 Load 20(g_sSampCmp)
-              93:          66 SampledImage 91 92
-              94:     32(ptr) AccessChain 29 31
-              95:   25(fvec2) Load 94
-              97:   57(ivec4) ImageDrefGather 93 95 35 ConstOffsets 96
-                              Store 90(txval024) 97
-              99:          14 Load 16(g_tTex2df4)
-             100:          18 Load 20(g_sSampCmp)
-             101:          23 SampledImage 99 100
-             102:     32(ptr) AccessChain 29 31
-             103:   25(fvec2) Load 102
-             104:    7(fvec4) ImageDrefGather 101 103 35 ConstOffset 38
-                              Store 98(txval401) 104
-             106:          43 Load 45(g_tTex2di4)
-             107:          18 Load 20(g_sSampCmp)
-             108:          49 SampledImage 106 107
-             109:     32(ptr) AccessChain 29 31
-             110:   25(fvec2) Load 109
-             111:   40(ivec4) ImageDrefGather 108 110 35 ConstOffset 54
-                              Store 105(txval411) 111
-             113:          60 Load 62(g_tTex2du4)
-             114:          18 Load 20(g_sSampCmp)
-             115:          66 SampledImage 113 114
-             116:     32(ptr) AccessChain 29 31
-             117:   25(fvec2) Load 116
-             118:   57(ivec4) ImageDrefGather 115 117 35 ConstOffset 70
-                              Store 112(txval421) 118
-             123:     12(ptr) AccessChain 120(psout) 37
-                              Store 123 122
-             125:    124(ptr) AccessChain 120(psout) 31
-                              Store 125 121
-             126:8(PS_OUTPUT) Load 120(psout)
-                              ReturnValue 126
+              23:          22 SampledImage 17 21
+              32:     31(ptr) AccessChain 28 30
+              33:   24(fvec2) Load 32
+              38:    7(fvec4) ImageDrefGather 23 33 34 ConstOffset 37
+                              Store 13(txval001) 38
+              45:          42 Load 44(g_tTex2di4)
+              46:          18 Load 20(g_sSampCmp)
+              48:          47 SampledImage 45 46
+              49:     31(ptr) AccessChain 28 30
+              50:   24(fvec2) Load 49
+              53:   39(ivec4) ImageDrefGather 48 50 34 ConstOffset 52
+                              Store 41(txval011) 53
+              61:          58 Load 60(g_tTex2du4)
+              62:          18 Load 20(g_sSampCmp)
+              64:          63 SampledImage 61 62
+              65:     31(ptr) AccessChain 28 30
+              66:   24(fvec2) Load 65
+              68:   55(ivec4) ImageDrefGather 64 66 34 ConstOffset 67
+                              Store 57(txval021) 68
+              70:          14 Load 16(g_tTex2df4)
+              71:          18 Load 20(g_sSampCmp)
+              72:          22 SampledImage 70 71
+              73:     31(ptr) AccessChain 28 30
+              74:   24(fvec2) Load 73
+              78:    7(fvec4) ImageDrefGather 72 74 34 ConstOffsets 77
+                              Store 69(txval004) 78
+              80:          42 Load 44(g_tTex2di4)
+              81:          18 Load 20(g_sSampCmp)
+              82:          47 SampledImage 80 81
+              83:     31(ptr) AccessChain 28 30
+              84:   24(fvec2) Load 83
+              86:   39(ivec4) ImageDrefGather 82 84 34 ConstOffsets 85
+                              Store 79(txval014) 86
+              88:          58 Load 60(g_tTex2du4)
+              89:          18 Load 20(g_sSampCmp)
+              90:          63 SampledImage 88 89
+              91:     31(ptr) AccessChain 28 30
+              92:   24(fvec2) Load 91
+              94:   55(ivec4) ImageDrefGather 90 92 34 ConstOffsets 93
+                              Store 87(txval024) 94
+              96:          14 Load 16(g_tTex2df4)
+              97:          18 Load 20(g_sSampCmp)
+              98:          22 SampledImage 96 97
+              99:     31(ptr) AccessChain 28 30
+             100:   24(fvec2) Load 99
+             101:    7(fvec4) ImageDrefGather 98 100 34 ConstOffset 37
+                              Store 95(txval401) 101
+             103:          42 Load 44(g_tTex2di4)
+             104:          18 Load 20(g_sSampCmp)
+             105:          47 SampledImage 103 104
+             106:     31(ptr) AccessChain 28 30
+             107:   24(fvec2) Load 106
+             108:   39(ivec4) ImageDrefGather 105 107 34 ConstOffset 52
+                              Store 102(txval411) 108
+             110:          58 Load 60(g_tTex2du4)
+             111:          18 Load 20(g_sSampCmp)
+             112:          63 SampledImage 110 111
+             113:     31(ptr) AccessChain 28 30
+             114:   24(fvec2) Load 113
+             115:   55(ivec4) ImageDrefGather 112 114 34 ConstOffset 67
+                              Store 109(txval421) 115
+             120:     12(ptr) AccessChain 117(psout) 36
+                              Store 120 119
+             122:    121(ptr) AccessChain 117(psout) 30
+                              Store 122 118
+             123:8(PS_OUTPUT) Load 117(psout)
+                              ReturnValue 123
                               FunctionEnd
diff --git a/Test/baseResults/hlsl.getdimensions.dx10.frag.out b/Test/baseResults/hlsl.getdimensions.dx10.frag.out
index c3986d7..599c659 100644
--- a/Test/baseResults/hlsl.getdimensions.dx10.frag.out
+++ b/Test/baseResults/hlsl.getdimensions.dx10.frag.out
@@ -1,6 +1,7 @@
 hlsl.getdimensions.dx10.frag
 Shader version: 500
 gl_FragCoord origin is upper left
+using depth_any
 0:? Sequence
 0:46  Function Definition: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:46    Function Parameters: 
@@ -1112,13 +1113,13 @@
 0:46          'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:46          Function Call: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:46        move second child to first child ( temp 4-component vector of float)
-0:?           'Color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 0:46          Color: direct index for structure ( temp 4-component vector of float)
 0:46            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:46            Constant:
 0:46              0 (const int)
 0:46        move second child to first child ( temp float)
-0:?           'Depth' ( out float FragDepth)
+0:?           '@entryPointOutput.Depth' ( out float FragDepth)
 0:46          Depth: direct index for structure ( temp float)
 0:46            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:46            Constant:
@@ -1152,8 +1153,8 @@
 0:?     'g_tTex2dmsf4a' ( uniform texture2DMSArray)
 0:?     'g_tTex2dmsi4a' ( uniform itexture2DMSArray)
 0:?     'g_tTex2dmsu4a' ( uniform utexture2DMSArray)
-0:?     'Color' (layout( location=0) out 4-component vector of float)
-0:?     'Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 
 Linked fragment stage:
@@ -1161,6 +1162,7 @@
 
 Shader version: 500
 gl_FragCoord origin is upper left
+using depth_any
 0:? Sequence
 0:46  Function Definition: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:46    Function Parameters: 
@@ -2272,13 +2274,13 @@
 0:46          'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:46          Function Call: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:46        move second child to first child ( temp 4-component vector of float)
-0:?           'Color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 0:46          Color: direct index for structure ( temp 4-component vector of float)
 0:46            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:46            Constant:
 0:46              0 (const int)
 0:46        move second child to first child ( temp float)
-0:?           'Depth' ( out float FragDepth)
+0:?           '@entryPointOutput.Depth' ( out float FragDepth)
 0:46          Depth: direct index for structure ( temp float)
 0:46            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:46            Constant:
@@ -2312,22 +2314,22 @@
 0:?     'g_tTex2dmsf4a' ( uniform texture2DMSArray)
 0:?     'g_tTex2dmsi4a' ( uniform itexture2DMSArray)
 0:?     'g_tTex2dmsu4a' ( uniform utexture2DMSArray)
-0:?     'Color' (layout( location=0) out 4-component vector of float)
-0:?     'Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 550
 
                               Capability Shader
                               Capability Sampled1D
                               Capability SampledCubeArray
-                              Capability ImageMSArray
                               Capability ImageQuery
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
                               EntryPoint Fragment 4  "main" 540 544
                               ExecutionMode 4 OriginUpperLeft
+                              ExecutionMode 4 DepthReplacing
                               Source HLSL 500
                               Name 4  "main"
                               Name 8  "PS_OUTPUT"
@@ -2417,8 +2419,8 @@
                               Name 514  "g_tTex2dmsu4a"
                               Name 526  "psout"
                               Name 537  "flattenTemp"
-                              Name 540  "Color"
-                              Name 544  "Depth"
+                              Name 540  "@entryPointOutput.Color"
+                              Name 544  "@entryPointOutput.Depth"
                               Name 549  "g_sSamp"
                               Decorate 17(g_tTex1df4) DescriptorSet 0
                               Decorate 17(g_tTex1df4) Binding 0
@@ -2448,8 +2450,8 @@
                               Decorate 486(g_tTex2dmsf4a) DescriptorSet 0
                               Decorate 500(g_tTex2dmsi4a) DescriptorSet 0
                               Decorate 514(g_tTex2dmsu4a) DescriptorSet 0
-                              Decorate 540(Color) Location 0
-                              Decorate 544(Depth) BuiltIn FragDepth
+                              Decorate 540(@entryPointOutput.Color) Location 0
+                              Decorate 544(@entryPointOutput.Depth) BuiltIn FragDepth
                               Decorate 549(g_sSamp) DescriptorSet 0
                               Decorate 549(g_sSamp) Binding 0
                2:             TypeVoid
@@ -2558,9 +2560,9 @@
              531:     19(int) Constant 1
              532:             TypePointer Function 6(float)
              539:             TypePointer Output 7(fvec4)
-      540(Color):    539(ptr) Variable Output
+540(@entryPointOutput.Color):    539(ptr) Variable Output
              543:             TypePointer Output 6(float)
-      544(Depth):    543(ptr) Variable Output
+544(@entryPointOutput.Depth):    543(ptr) Variable Output
              547:             TypeSampler
              548:             TypePointer UniformConstant 547
     549(g_sSamp):    548(ptr) Variable UniformConstant
@@ -2571,10 +2573,10 @@
                               Store 537(flattenTemp) 538
              541:    529(ptr) AccessChain 537(flattenTemp) 20
              542:    7(fvec4) Load 541
-                              Store 540(Color) 542
+                              Store 540(@entryPointOutput.Color) 542
              545:    532(ptr) AccessChain 537(flattenTemp) 531
              546:    6(float) Load 545
-                              Store 544(Depth) 546
+                              Store 544(@entryPointOutput.Depth) 546
                               Return
                               FunctionEnd
       10(@main():8(PS_OUTPUT) Function None 9
diff --git a/Test/baseResults/hlsl.getdimensions.dx10.vert.out b/Test/baseResults/hlsl.getdimensions.dx10.vert.out
index cb1eae6..cccdfeb 100644
--- a/Test/baseResults/hlsl.getdimensions.dx10.vert.out
+++ b/Test/baseResults/hlsl.getdimensions.dx10.vert.out
@@ -45,7 +45,7 @@
 0:?     Sequence
 0:11      Sequence
 0:11        move second child to first child ( temp 4-component vector of float)
-0:?           '@entryPointOutput_Pos' ( out 4-component vector of float Position)
+0:?           '@entryPointOutput.Pos' ( out 4-component vector of float Position)
 0:11          Pos: direct index for structure ( temp 4-component vector of float)
 0:11            Function Call: @main( ( temp structure{ temp 4-component vector of float Pos})
 0:11            Constant:
@@ -53,7 +53,7 @@
 0:?   Linker Objects
 0:?     'g_sSamp' (layout( binding=0) uniform sampler)
 0:?     'g_tTex1df4' (layout( binding=0) uniform texture1D)
-0:?     '@entryPointOutput' (layout( location=0) out structure{})
+0:?     '@entryPointOutput.Pos' ( out 4-component vector of float Position)
 
 
 Linked vertex stage:
@@ -105,7 +105,7 @@
 0:?     Sequence
 0:11      Sequence
 0:11        move second child to first child ( temp 4-component vector of float)
-0:?           '@entryPointOutput_Pos' ( out 4-component vector of float Position)
+0:?           '@entryPointOutput.Pos' ( out 4-component vector of float Position)
 0:11          Pos: direct index for structure ( temp 4-component vector of float)
 0:11            Function Call: @main( ( temp structure{ temp 4-component vector of float Pos})
 0:11            Constant:
@@ -113,18 +113,18 @@
 0:?   Linker Objects
 0:?     'g_sSamp' (layout( binding=0) uniform sampler)
 0:?     'g_tTex1df4' (layout( binding=0) uniform texture1D)
-0:?     '@entryPointOutput' (layout( location=0) out structure{})
+0:?     '@entryPointOutput.Pos' ( out 4-component vector of float Position)
 
 // Module Version 10000
-// Generated by (magic number): 80001
-// Id's are bound by 51
+// Generated by (magic number): 80007
+// Id's are bound by 48
 
                               Capability Shader
                               Capability Sampled1D
                               Capability ImageQuery
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Vertex 4  "main" 42 50
+                              EntryPoint Vertex 4  "main" 42
                               Source HLSL 500
                               Name 4  "main"
                               Name 8  "VS_OUTPUT"
@@ -136,16 +136,13 @@
                               Name 24  "sizeQueryTemp"
                               Name 29  "NumberOfLevelsU"
                               Name 33  "vsout"
-                              Name 42  "@entryPointOutput_Pos"
+                              Name 42  "@entryPointOutput.Pos"
                               Name 47  "g_sSamp"
-                              Name 48  "VS_OUTPUT"
-                              Name 50  "@entryPointOutput"
                               Decorate 17(g_tTex1df4) DescriptorSet 0
                               Decorate 17(g_tTex1df4) Binding 0
-                              Decorate 42(@entryPointOutput_Pos) BuiltIn Position
+                              Decorate 42(@entryPointOutput.Pos) BuiltIn Position
                               Decorate 47(g_sSamp) DescriptorSet 0
                               Decorate 47(g_sSamp) Binding 0
-                              Decorate 50(@entryPointOutput) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -165,18 +162,15 @@
               35:    7(fvec4) ConstantComposite 34 34 34 34
               36:             TypePointer Function 7(fvec4)
               41:             TypePointer Output 7(fvec4)
-42(@entryPointOutput_Pos):     41(ptr) Variable Output
+42(@entryPointOutput.Pos):     41(ptr) Variable Output
               45:             TypeSampler
               46:             TypePointer UniformConstant 45
      47(g_sSamp):     46(ptr) Variable UniformConstant
-   48(VS_OUTPUT):             TypeStruct
-              49:             TypePointer Output 48(VS_OUTPUT)
-50(@entryPointOutput):     49(ptr) Variable Output
          4(main):           2 Function None 3
                5:             Label
               43:8(VS_OUTPUT) FunctionCall 10(@main()
               44:    7(fvec4) CompositeExtract 43 0
-                              Store 42(@entryPointOutput_Pos) 44
+                              Store 42(@entryPointOutput.Pos) 44
                               Return
                               FunctionEnd
       10(@main():8(VS_OUTPUT) Function None 9
diff --git a/Test/baseResults/hlsl.getdimensions.rw.dx10.frag.out b/Test/baseResults/hlsl.getdimensions.rw.dx10.frag.out
index eb6a1b6..0b9a674 100644
--- a/Test/baseResults/hlsl.getdimensions.rw.dx10.frag.out
+++ b/Test/baseResults/hlsl.getdimensions.rw.dx10.frag.out
@@ -1,6 +1,7 @@
 hlsl.getdimensions.rw.dx10.frag
 Shader version: 500
 gl_FragCoord origin is upper left
+using depth_any
 0:? Sequence
 0:44  Function Definition: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:44    Function Parameters: 
@@ -320,13 +321,13 @@
 0:44          'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:44          Function Call: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:44        move second child to first child ( temp 4-component vector of float)
-0:?           'Color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 0:44          Color: direct index for structure ( temp 4-component vector of float)
 0:44            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:44            Constant:
 0:44              0 (const int)
 0:44        move second child to first child ( temp float)
-0:?           'Depth' ( out float FragDepth)
+0:?           '@entryPointOutput.Depth' ( out float FragDepth)
 0:44          Depth: direct index for structure ( temp float)
 0:44            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:44            Constant:
@@ -352,8 +353,8 @@
 0:?     'g_tBuffI' (layout( rgba32i) uniform iimageBuffer)
 0:?     'g_tBuffU' (layout( rgba32ui) uniform uimageBuffer)
 0:?     'anon@0' (layout( row_major std140) uniform block{ uniform int c1,  uniform 2-component vector of int c2,  uniform 3-component vector of int c3,  uniform 4-component vector of int c4,  uniform int o1,  uniform 2-component vector of int o2,  uniform 3-component vector of int o3,  uniform 4-component vector of int o4})
-0:?     'Color' (layout( location=0) out 4-component vector of float)
-0:?     'Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 
 Linked fragment stage:
@@ -361,6 +362,7 @@
 
 Shader version: 500
 gl_FragCoord origin is upper left
+using depth_any
 0:? Sequence
 0:44  Function Definition: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:44    Function Parameters: 
@@ -680,13 +682,13 @@
 0:44          'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:44          Function Call: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:44        move second child to first child ( temp 4-component vector of float)
-0:?           'Color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 0:44          Color: direct index for structure ( temp 4-component vector of float)
 0:44            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:44            Constant:
 0:44              0 (const int)
 0:44        move second child to first child ( temp float)
-0:?           'Depth' ( out float FragDepth)
+0:?           '@entryPointOutput.Depth' ( out float FragDepth)
 0:44          Depth: direct index for structure ( temp float)
 0:44            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:44            Constant:
@@ -712,21 +714,22 @@
 0:?     'g_tBuffI' (layout( rgba32i) uniform iimageBuffer)
 0:?     'g_tBuffU' (layout( rgba32ui) uniform uimageBuffer)
 0:?     'anon@0' (layout( row_major std140) uniform block{ uniform int c1,  uniform 2-component vector of int c2,  uniform 3-component vector of int c3,  uniform 4-component vector of int c4,  uniform int o1,  uniform 2-component vector of int o2,  uniform 3-component vector of int o3,  uniform 4-component vector of int o4})
-0:?     'Color' (layout( location=0) out 4-component vector of float)
-0:?     'Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 232
 
                               Capability Shader
-                              Capability Sampled1D
-                              Capability SampledBuffer
+                              Capability Image1D
+                              Capability ImageBuffer
                               Capability ImageQuery
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
                               EntryPoint Fragment 4  "main" 216 220
                               ExecutionMode 4 OriginUpperLeft
+                              ExecutionMode 4 DepthReplacing
                               Source HLSL 500
                               Name 4  "main"
                               Name 8  "PS_OUTPUT"
@@ -775,8 +778,8 @@
                               Name 191  "g_tTex3du4"
                               Name 201  "psout"
                               Name 213  "flattenTemp"
-                              Name 216  "Color"
-                              Name 220  "Depth"
+                              Name 216  "@entryPointOutput.Color"
+                              Name 220  "@entryPointOutput.Depth"
                               Name 225  "g_sSamp"
                               Name 229  "$Global"
                               MemberName 229($Global) 0  "c1"
@@ -807,16 +810,16 @@
                               Decorate 166(g_tTex3df4) DescriptorSet 0
                               Decorate 179(g_tTex3di4) DescriptorSet 0
                               Decorate 191(g_tTex3du4) DescriptorSet 0
-                              Decorate 216(Color) Location 0
-                              Decorate 220(Depth) BuiltIn FragDepth
+                              Decorate 216(@entryPointOutput.Color) Location 0
+                              Decorate 220(@entryPointOutput.Depth) BuiltIn FragDepth
                               Decorate 225(g_sSamp) DescriptorSet 0
                               Decorate 225(g_sSamp) Binding 0
                               MemberDecorate 229($Global) 0 Offset 0
-                              MemberDecorate 229($Global) 1 Offset 4
+                              MemberDecorate 229($Global) 1 Offset 8
                               MemberDecorate 229($Global) 2 Offset 16
                               MemberDecorate 229($Global) 3 Offset 32
                               MemberDecorate 229($Global) 4 Offset 48
-                              MemberDecorate 229($Global) 5 Offset 52
+                              MemberDecorate 229($Global) 5 Offset 56
                               MemberDecorate 229($Global) 6 Offset 64
                               MemberDecorate 229($Global) 7 Offset 80
                               Decorate 229($Global) Block
@@ -899,9 +902,9 @@
              207:     23(int) Constant 1
              208:             TypePointer Function 6(float)
              215:             TypePointer Output 7(fvec4)
-      216(Color):    215(ptr) Variable Output
+216(@entryPointOutput.Color):    215(ptr) Variable Output
              219:             TypePointer Output 6(float)
-      220(Depth):    219(ptr) Variable Output
+220(@entryPointOutput.Depth):    219(ptr) Variable Output
              223:             TypeSampler
              224:             TypePointer UniformConstant 223
     225(g_sSamp):    224(ptr) Variable UniformConstant
@@ -918,10 +921,10 @@
                               Store 213(flattenTemp) 214
              217:    205(ptr) AccessChain 213(flattenTemp) 202
              218:    7(fvec4) Load 217
-                              Store 216(Color) 218
+                              Store 216(@entryPointOutput.Color) 218
              221:    208(ptr) AccessChain 213(flattenTemp) 207
              222:    6(float) Load 221
-                              Store 220(Depth) 222
+                              Store 220(@entryPointOutput.Depth) 222
                               Return
                               FunctionEnd
       10(@main():8(PS_OUTPUT) Function None 9
diff --git a/Test/baseResults/hlsl.getsampleposition.dx10.frag.out b/Test/baseResults/hlsl.getsampleposition.dx10.frag.out
index d8274fa..51bd076 100644
--- a/Test/baseResults/hlsl.getsampleposition.dx10.frag.out
+++ b/Test/baseResults/hlsl.getsampleposition.dx10.frag.out
@@ -1,6 +1,7 @@
 hlsl.getsampleposition.dx10.frag
 Shader version: 500
 gl_FragCoord origin is upper left
+using depth_any
 0:? Sequence
 0:13  Function Definition: @main(i1; ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:13    Function Parameters: 
@@ -14,7 +15,7 @@
 0:16              '@sampleCount' ( temp uint)
 0:16              imageQuerySamples ( temp uint)
 0:16                'g_tTex2dmsf4' ( uniform texture2DMS)
-0:16            Test condition and select ( temp 2-component vector of float)
+0:16            Test condition and select ( temp 2-component vector of float): no shortcircuit
 0:16              Condition
 0:16              Compare Equal ( temp bool)
 0:16                '@sampleCount' ( temp uint)
@@ -29,7 +30,7 @@
 0:?                   -0.250000
 0:16                'sample' ( in int)
 0:16              false case
-0:16              Test condition and select ( temp 2-component vector of float)
+0:16              Test condition and select ( temp 2-component vector of float): no shortcircuit
 0:16                Condition
 0:16                Compare Equal ( temp bool)
 0:16                  '@sampleCount' ( temp uint)
@@ -48,7 +49,7 @@
 0:?                     0.375000
 0:16                  'sample' ( in int)
 0:16                false case
-0:16                Test condition and select ( temp 2-component vector of float)
+0:16                Test condition and select ( temp 2-component vector of float): no shortcircuit
 0:16                  Condition
 0:16                  Compare Equal ( temp bool)
 0:16                    '@sampleCount' ( temp uint)
@@ -75,7 +76,7 @@
 0:?                       -0.437500
 0:16                    'sample' ( in int)
 0:16                  false case
-0:16                  Test condition and select ( temp 2-component vector of float)
+0:16                  Test condition and select ( temp 2-component vector of float): no shortcircuit
 0:16                    Condition
 0:16                    Compare Equal ( temp bool)
 0:16                      '@sampleCount' ( temp uint)
@@ -129,7 +130,7 @@
 0:17              '@sampleCount' ( temp uint)
 0:17              imageQuerySamples ( temp uint)
 0:17                'g_tTex2dmsf4a' ( uniform texture2DMSArray)
-0:17            Test condition and select ( temp 2-component vector of float)
+0:17            Test condition and select ( temp 2-component vector of float): no shortcircuit
 0:17              Condition
 0:17              Compare Equal ( temp bool)
 0:17                '@sampleCount' ( temp uint)
@@ -144,7 +145,7 @@
 0:?                   -0.250000
 0:17                'sample' ( in int)
 0:17              false case
-0:17              Test condition and select ( temp 2-component vector of float)
+0:17              Test condition and select ( temp 2-component vector of float): no shortcircuit
 0:17                Condition
 0:17                Compare Equal ( temp bool)
 0:17                  '@sampleCount' ( temp uint)
@@ -163,7 +164,7 @@
 0:?                     0.375000
 0:17                  'sample' ( in int)
 0:17                false case
-0:17                Test condition and select ( temp 2-component vector of float)
+0:17                Test condition and select ( temp 2-component vector of float): no shortcircuit
 0:17                  Condition
 0:17                  Compare Equal ( temp bool)
 0:17                    '@sampleCount' ( temp uint)
@@ -190,7 +191,7 @@
 0:?                       -0.437500
 0:17                    'sample' ( in int)
 0:17                  false case
-0:17                  Test condition and select ( temp 2-component vector of float)
+0:17                  Test condition and select ( temp 2-component vector of float): no shortcircuit
 0:17                    Condition
 0:17                    Compare Equal ( temp bool)
 0:17                      '@sampleCount' ( temp uint)
@@ -260,20 +261,20 @@
 0:?     Sequence
 0:13      move second child to first child ( temp int)
 0:?         'sample' ( temp int)
-0:?         'sample' (layout( location=0) in int)
+0:?         'sample' (layout( location=0) flat in int)
 0:13      Sequence
 0:13        move second child to first child ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:13          'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:13          Function Call: @main(i1; ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:?             'sample' ( temp int)
 0:13        move second child to first child ( temp 4-component vector of float)
-0:?           'Color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 0:13          Color: direct index for structure ( temp 4-component vector of float)
 0:13            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:13            Constant:
 0:13              0 (const int)
 0:13        move second child to first child ( temp float)
-0:?           'Depth' ( out float FragDepth)
+0:?           '@entryPointOutput.Depth' ( out float FragDepth)
 0:13          Depth: direct index for structure ( temp float)
 0:13            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:13            Constant:
@@ -282,9 +283,9 @@
 0:?     'g_sSamp' (layout( binding=0) uniform sampler)
 0:?     'g_tTex2dmsf4' ( uniform texture2DMS)
 0:?     'g_tTex2dmsf4a' ( uniform texture2DMSArray)
-0:?     'Color' (layout( location=0) out 4-component vector of float)
-0:?     'Depth' ( out float FragDepth)
-0:?     'sample' (layout( location=0) in int)
+0:?     '@entryPointOutput.Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
+0:?     'sample' (layout( location=0) flat in int)
 
 
 Linked fragment stage:
@@ -292,6 +293,7 @@
 
 Shader version: 500
 gl_FragCoord origin is upper left
+using depth_any
 0:? Sequence
 0:13  Function Definition: @main(i1; ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:13    Function Parameters: 
@@ -305,7 +307,7 @@
 0:16              '@sampleCount' ( temp uint)
 0:16              imageQuerySamples ( temp uint)
 0:16                'g_tTex2dmsf4' ( uniform texture2DMS)
-0:16            Test condition and select ( temp 2-component vector of float)
+0:16            Test condition and select ( temp 2-component vector of float): no shortcircuit
 0:16              Condition
 0:16              Compare Equal ( temp bool)
 0:16                '@sampleCount' ( temp uint)
@@ -320,7 +322,7 @@
 0:?                   -0.250000
 0:16                'sample' ( in int)
 0:16              false case
-0:16              Test condition and select ( temp 2-component vector of float)
+0:16              Test condition and select ( temp 2-component vector of float): no shortcircuit
 0:16                Condition
 0:16                Compare Equal ( temp bool)
 0:16                  '@sampleCount' ( temp uint)
@@ -339,7 +341,7 @@
 0:?                     0.375000
 0:16                  'sample' ( in int)
 0:16                false case
-0:16                Test condition and select ( temp 2-component vector of float)
+0:16                Test condition and select ( temp 2-component vector of float): no shortcircuit
 0:16                  Condition
 0:16                  Compare Equal ( temp bool)
 0:16                    '@sampleCount' ( temp uint)
@@ -366,7 +368,7 @@
 0:?                       -0.437500
 0:16                    'sample' ( in int)
 0:16                  false case
-0:16                  Test condition and select ( temp 2-component vector of float)
+0:16                  Test condition and select ( temp 2-component vector of float): no shortcircuit
 0:16                    Condition
 0:16                    Compare Equal ( temp bool)
 0:16                      '@sampleCount' ( temp uint)
@@ -420,7 +422,7 @@
 0:17              '@sampleCount' ( temp uint)
 0:17              imageQuerySamples ( temp uint)
 0:17                'g_tTex2dmsf4a' ( uniform texture2DMSArray)
-0:17            Test condition and select ( temp 2-component vector of float)
+0:17            Test condition and select ( temp 2-component vector of float): no shortcircuit
 0:17              Condition
 0:17              Compare Equal ( temp bool)
 0:17                '@sampleCount' ( temp uint)
@@ -435,7 +437,7 @@
 0:?                   -0.250000
 0:17                'sample' ( in int)
 0:17              false case
-0:17              Test condition and select ( temp 2-component vector of float)
+0:17              Test condition and select ( temp 2-component vector of float): no shortcircuit
 0:17                Condition
 0:17                Compare Equal ( temp bool)
 0:17                  '@sampleCount' ( temp uint)
@@ -454,7 +456,7 @@
 0:?                     0.375000
 0:17                  'sample' ( in int)
 0:17                false case
-0:17                Test condition and select ( temp 2-component vector of float)
+0:17                Test condition and select ( temp 2-component vector of float): no shortcircuit
 0:17                  Condition
 0:17                  Compare Equal ( temp bool)
 0:17                    '@sampleCount' ( temp uint)
@@ -481,7 +483,7 @@
 0:?                       -0.437500
 0:17                    'sample' ( in int)
 0:17                  false case
-0:17                  Test condition and select ( temp 2-component vector of float)
+0:17                  Test condition and select ( temp 2-component vector of float): no shortcircuit
 0:17                    Condition
 0:17                    Compare Equal ( temp bool)
 0:17                      '@sampleCount' ( temp uint)
@@ -551,20 +553,20 @@
 0:?     Sequence
 0:13      move second child to first child ( temp int)
 0:?         'sample' ( temp int)
-0:?         'sample' (layout( location=0) in int)
+0:?         'sample' (layout( location=0) flat in int)
 0:13      Sequence
 0:13        move second child to first child ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:13          'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:13          Function Call: @main(i1; ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:?             'sample' ( temp int)
 0:13        move second child to first child ( temp 4-component vector of float)
-0:?           'Color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 0:13          Color: direct index for structure ( temp 4-component vector of float)
 0:13            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:13            Constant:
 0:13              0 (const int)
 0:13        move second child to first child ( temp float)
-0:?           'Depth' ( out float FragDepth)
+0:?           '@entryPointOutput.Depth' ( out float FragDepth)
 0:13          Depth: direct index for structure ( temp float)
 0:13            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:13            Constant:
@@ -573,21 +575,21 @@
 0:?     'g_sSamp' (layout( binding=0) uniform sampler)
 0:?     'g_tTex2dmsf4' ( uniform texture2DMS)
 0:?     'g_tTex2dmsf4a' ( uniform texture2DMSArray)
-0:?     'Color' (layout( location=0) out 4-component vector of float)
-0:?     'Depth' ( out float FragDepth)
-0:?     'sample' (layout( location=0) in int)
+0:?     '@entryPointOutput.Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
+0:?     'sample' (layout( location=0) flat in int)
 
 // Module Version 10000
-// Generated by (magic number): 80001
-// Id's are bound by 221
+// Generated by (magic number): 80007
+// Id's are bound by 198
 
                               Capability Shader
-                              Capability ImageMSArray
                               Capability ImageQuery
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "main" 204 211 215
+                              EntryPoint Fragment 4  "main" 181 188 192
                               ExecutionMode 4 OriginUpperLeft
+                              ExecutionMode 4 DepthReplacing
                               Source HLSL 500
                               Name 4  "main"
                               Name 10  "PS_OUTPUT"
@@ -598,32 +600,33 @@
                               Name 17  "r00"
                               Name 20  "@sampleCount"
                               Name 23  "g_tTex2dmsf4"
-                              Name 42  "indexable"
-                              Name 65  "indexable"
-                              Name 96  "indexable"
-                              Name 129  "indexable"
-                              Name 138  "r01"
-                              Name 139  "@sampleCount"
-                              Name 142  "g_tTex2dmsf4a"
-                              Name 151  "indexable"
-                              Name 161  "indexable"
-                              Name 171  "indexable"
-                              Name 181  "indexable"
-                              Name 190  "psout"
-                              Name 202  "sample"
-                              Name 204  "sample"
-                              Name 206  "flattenTemp"
-                              Name 207  "param"
-                              Name 211  "Color"
-                              Name 215  "Depth"
-                              Name 220  "g_sSamp"
+                              Name 39  "indexable"
+                              Name 58  "indexable"
+                              Name 85  "indexable"
+                              Name 114  "indexable"
+                              Name 127  "r01"
+                              Name 128  "@sampleCount"
+                              Name 131  "g_tTex2dmsf4a"
+                              Name 137  "indexable"
+                              Name 143  "indexable"
+                              Name 149  "indexable"
+                              Name 155  "indexable"
+                              Name 167  "psout"
+                              Name 179  "sample"
+                              Name 181  "sample"
+                              Name 183  "flattenTemp"
+                              Name 184  "param"
+                              Name 188  "@entryPointOutput.Color"
+                              Name 192  "@entryPointOutput.Depth"
+                              Name 197  "g_sSamp"
                               Decorate 23(g_tTex2dmsf4) DescriptorSet 0
-                              Decorate 142(g_tTex2dmsf4a) DescriptorSet 0
-                              Decorate 204(sample) Location 0
-                              Decorate 211(Color) Location 0
-                              Decorate 215(Depth) BuiltIn FragDepth
-                              Decorate 220(g_sSamp) DescriptorSet 0
-                              Decorate 220(g_sSamp) Binding 0
+                              Decorate 131(g_tTex2dmsf4a) DescriptorSet 0
+                              Decorate 181(sample) Flat
+                              Decorate 181(sample) Location 0
+                              Decorate 188(@entryPointOutput.Color) Location 0
+                              Decorate 192(@entryPointOutput.Depth) BuiltIn FragDepth
+                              Decorate 197(g_sSamp) DescriptorSet 0
+                              Decorate 197(g_sSamp) Binding 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 32 1
@@ -639,110 +642,111 @@
               21:             TypeImage 8(float) 2D multi-sampled sampled format:Unknown
               22:             TypePointer UniformConstant 21
 23(g_tTex2dmsf4):     22(ptr) Variable UniformConstant
-              28:      6(int) Constant 2
-              29:             TypeBool
-              33:     18(int) Constant 2
-              34:             TypeArray 15(fvec2) 33
-              35:    8(float) Constant 1048576000
-              36:   15(fvec2) ConstantComposite 35 35
-              37:    8(float) Constant 3196059648
-              38:   15(fvec2) ConstantComposite 37 37
-              39:          34 ConstantComposite 36 38
-              41:             TypePointer Function 34
-              48:      6(int) Constant 4
-              52:     18(int) Constant 4
-              53:             TypeArray 15(fvec2) 52
-              54:    8(float) Constant 3187671040
-              55:    8(float) Constant 3200253952
-              56:   15(fvec2) ConstantComposite 54 55
-              57:    8(float) Constant 1052770304
-              58:   15(fvec2) ConstantComposite 57 54
-              59:    8(float) Constant 1040187392
-              60:   15(fvec2) ConstantComposite 55 59
-              61:   15(fvec2) ConstantComposite 59 57
-              62:          53 ConstantComposite 56 58 60 61
-              64:             TypePointer Function 53
-              71:      6(int) Constant 8
-              75:     18(int) Constant 8
-              76:             TypeArray 15(fvec2) 75
-              77:    8(float) Constant 1031798784
-              78:    8(float) Constant 3191865344
-              79:   15(fvec2) ConstantComposite 77 78
-              80:    8(float) Constant 3179282432
-              81:    8(float) Constant 1044381696
-              82:   15(fvec2) ConstantComposite 80 81
-              83:    8(float) Constant 1050673152
-              84:   15(fvec2) ConstantComposite 83 77
-              85:    8(float) Constant 3198156800
-              86:   15(fvec2) ConstantComposite 78 85
-              87:   15(fvec2) ConstantComposite 85 83
-              88:    8(float) Constant 3202351104
-              89:   15(fvec2) ConstantComposite 88 80
-              90:    8(float) Constant 1054867456
-              91:   15(fvec2) ConstantComposite 81 90
-              92:   15(fvec2) ConstantComposite 90 88
-              93:          76 ConstantComposite 79 82 84 86 87 89 91 92
-              95:             TypePointer Function 76
-             102:      6(int) Constant 16
-             106:     18(int) Constant 16
-             107:             TypeArray 15(fvec2) 106
-             108:   15(fvec2) ConstantComposite 77 77
-             109:   15(fvec2) ConstantComposite 80 78
-             110:   15(fvec2) ConstantComposite 78 59
-             111:   15(fvec2) ConstantComposite 35 80
-             112:   15(fvec2) ConstantComposite 85 54
-             113:   15(fvec2) ConstantComposite 59 83
-             114:   15(fvec2) ConstantComposite 83 81
-             115:   15(fvec2) ConstantComposite 81 85
-             116:   15(fvec2) ConstantComposite 54 57
-             117:    8(float) Constant 0
-             118:   15(fvec2) ConstantComposite 117 88
-             119:   15(fvec2) ConstantComposite 37 55
-             120:   15(fvec2) ConstantComposite 55 35
-             121:    8(float) Constant 3204448256
-             122:   15(fvec2) ConstantComposite 121 117
-             123:   15(fvec2) ConstantComposite 90 37
-             124:   15(fvec2) ConstantComposite 57 90
-             125:   15(fvec2) ConstantComposite 88 121
-             126:         107 ConstantComposite 108 109 110 111 112 113 114 115 116 118 119 120 122 123 124 125
-             128:             TypePointer Function 107
-             133:   15(fvec2) ConstantComposite 117 117
-             140:             TypeImage 8(float) 2D array multi-sampled sampled format:Unknown
-             141:             TypePointer UniformConstant 140
-142(g_tTex2dmsf4a):    141(ptr) Variable UniformConstant
-             189:             TypePointer Function 10(PS_OUTPUT)
-             191:      6(int) Constant 0
-             192:    8(float) Constant 1065353216
-             193:    9(fvec4) ConstantComposite 192 192 192 192
-             194:             TypePointer Function 9(fvec4)
-             196:      6(int) Constant 1
-             197:             TypePointer Function 8(float)
-             203:             TypePointer Input 6(int)
-     204(sample):    203(ptr) Variable Input
-             210:             TypePointer Output 9(fvec4)
-      211(Color):    210(ptr) Variable Output
-             214:             TypePointer Output 8(float)
-      215(Depth):    214(ptr) Variable Output
-             218:             TypeSampler
-             219:             TypePointer UniformConstant 218
-    220(g_sSamp):    219(ptr) Variable UniformConstant
+              27:      6(int) Constant 2
+              28:             TypeBool
+              30:     18(int) Constant 2
+              31:             TypeArray 15(fvec2) 30
+              32:    8(float) Constant 1048576000
+              33:   15(fvec2) ConstantComposite 32 32
+              34:    8(float) Constant 3196059648
+              35:   15(fvec2) ConstantComposite 34 34
+              36:          31 ConstantComposite 33 35
+              38:             TypePointer Function 31
+              43:      6(int) Constant 4
+              45:     18(int) Constant 4
+              46:             TypeArray 15(fvec2) 45
+              47:    8(float) Constant 3187671040
+              48:    8(float) Constant 3200253952
+              49:   15(fvec2) ConstantComposite 47 48
+              50:    8(float) Constant 1052770304
+              51:   15(fvec2) ConstantComposite 50 47
+              52:    8(float) Constant 1040187392
+              53:   15(fvec2) ConstantComposite 48 52
+              54:   15(fvec2) ConstantComposite 52 50
+              55:          46 ConstantComposite 49 51 53 54
+              57:             TypePointer Function 46
+              62:      6(int) Constant 8
+              64:     18(int) Constant 8
+              65:             TypeArray 15(fvec2) 64
+              66:    8(float) Constant 1031798784
+              67:    8(float) Constant 3191865344
+              68:   15(fvec2) ConstantComposite 66 67
+              69:    8(float) Constant 3179282432
+              70:    8(float) Constant 1044381696
+              71:   15(fvec2) ConstantComposite 69 70
+              72:    8(float) Constant 1050673152
+              73:   15(fvec2) ConstantComposite 72 66
+              74:    8(float) Constant 3198156800
+              75:   15(fvec2) ConstantComposite 67 74
+              76:   15(fvec2) ConstantComposite 74 72
+              77:    8(float) Constant 3202351104
+              78:   15(fvec2) ConstantComposite 77 69
+              79:    8(float) Constant 1054867456
+              80:   15(fvec2) ConstantComposite 70 79
+              81:   15(fvec2) ConstantComposite 79 77
+              82:          65 ConstantComposite 68 71 73 75 76 78 80 81
+              84:             TypePointer Function 65
+              89:      6(int) Constant 16
+              91:     18(int) Constant 16
+              92:             TypeArray 15(fvec2) 91
+              93:   15(fvec2) ConstantComposite 66 66
+              94:   15(fvec2) ConstantComposite 69 67
+              95:   15(fvec2) ConstantComposite 67 52
+              96:   15(fvec2) ConstantComposite 32 69
+              97:   15(fvec2) ConstantComposite 74 47
+              98:   15(fvec2) ConstantComposite 52 72
+              99:   15(fvec2) ConstantComposite 72 70
+             100:   15(fvec2) ConstantComposite 70 74
+             101:   15(fvec2) ConstantComposite 47 50
+             102:    8(float) Constant 0
+             103:   15(fvec2) ConstantComposite 102 77
+             104:   15(fvec2) ConstantComposite 34 48
+             105:   15(fvec2) ConstantComposite 48 32
+             106:    8(float) Constant 3204448256
+             107:   15(fvec2) ConstantComposite 106 102
+             108:   15(fvec2) ConstantComposite 79 34
+             109:   15(fvec2) ConstantComposite 50 79
+             110:   15(fvec2) ConstantComposite 77 106
+             111:          92 ConstantComposite 93 94 95 96 97 98 99 100 101 103 104 105 107 108 109 110
+             113:             TypePointer Function 92
+             117:   15(fvec2) ConstantComposite 102 102
+             118:             TypeVector 28(bool) 2
+             129:             TypeImage 8(float) 2D array multi-sampled sampled format:Unknown
+             130:             TypePointer UniformConstant 129
+131(g_tTex2dmsf4a):    130(ptr) Variable UniformConstant
+             166:             TypePointer Function 10(PS_OUTPUT)
+             168:      6(int) Constant 0
+             169:    8(float) Constant 1065353216
+             170:    9(fvec4) ConstantComposite 169 169 169 169
+             171:             TypePointer Function 9(fvec4)
+             173:      6(int) Constant 1
+             174:             TypePointer Function 8(float)
+             180:             TypePointer Input 6(int)
+     181(sample):    180(ptr) Variable Input
+             187:             TypePointer Output 9(fvec4)
+188(@entryPointOutput.Color):    187(ptr) Variable Output
+             191:             TypePointer Output 8(float)
+192(@entryPointOutput.Depth):    191(ptr) Variable Output
+             195:             TypeSampler
+             196:             TypePointer UniformConstant 195
+    197(g_sSamp):    196(ptr) Variable UniformConstant
          4(main):           2 Function None 3
                5:             Label
-     202(sample):      7(ptr) Variable Function
-206(flattenTemp):    189(ptr) Variable Function
-      207(param):      7(ptr) Variable Function
-             205:      6(int) Load 204(sample)
-                              Store 202(sample) 205
-             208:      6(int) Load 202(sample)
-                              Store 207(param) 208
-             209:10(PS_OUTPUT) FunctionCall 13(@main(i1;) 207(param)
-                              Store 206(flattenTemp) 209
-             212:    194(ptr) AccessChain 206(flattenTemp) 191
-             213:    9(fvec4) Load 212
-                              Store 211(Color) 213
-             216:    197(ptr) AccessChain 206(flattenTemp) 196
-             217:    8(float) Load 216
-                              Store 215(Depth) 217
+     179(sample):      7(ptr) Variable Function
+183(flattenTemp):    166(ptr) Variable Function
+      184(param):      7(ptr) Variable Function
+             182:      6(int) Load 181(sample)
+                              Store 179(sample) 182
+             185:      6(int) Load 179(sample)
+                              Store 184(param) 185
+             186:10(PS_OUTPUT) FunctionCall 13(@main(i1;) 184(param)
+                              Store 183(flattenTemp) 186
+             189:    171(ptr) AccessChain 183(flattenTemp) 168
+             190:    9(fvec4) Load 189
+                              Store 188(@entryPointOutput.Color) 190
+             193:    174(ptr) AccessChain 183(flattenTemp) 173
+             194:    8(float) Load 193
+                              Store 192(@entryPointOutput.Depth) 194
                               Return
                               FunctionEnd
    13(@main(i1;):10(PS_OUTPUT) Function None 11
@@ -750,165 +754,93 @@
               14:             Label
          17(r00):     16(ptr) Variable Function
 20(@sampleCount):     19(ptr) Variable Function
-              26:     16(ptr) Variable Function
-   42(indexable):     41(ptr) Variable Function
-              46:     16(ptr) Variable Function
-   65(indexable):     64(ptr) Variable Function
-              69:     16(ptr) Variable Function
-   96(indexable):     95(ptr) Variable Function
-             100:     16(ptr) Variable Function
-  129(indexable):    128(ptr) Variable Function
-        138(r01):     16(ptr) Variable Function
-139(@sampleCount):     19(ptr) Variable Function
-             145:     16(ptr) Variable Function
-  151(indexable):     41(ptr) Variable Function
-             155:     16(ptr) Variable Function
-  161(indexable):     64(ptr) Variable Function
-             165:     16(ptr) Variable Function
-  171(indexable):     95(ptr) Variable Function
-             175:     16(ptr) Variable Function
-  181(indexable):    128(ptr) Variable Function
-      190(psout):    189(ptr) Variable Function
+   39(indexable):     38(ptr) Variable Function
+   58(indexable):     57(ptr) Variable Function
+   85(indexable):     84(ptr) Variable Function
+  114(indexable):    113(ptr) Variable Function
+        127(r01):     16(ptr) Variable Function
+128(@sampleCount):     19(ptr) Variable Function
+  137(indexable):     38(ptr) Variable Function
+  143(indexable):     57(ptr) Variable Function
+  149(indexable):     84(ptr) Variable Function
+  155(indexable):    113(ptr) Variable Function
+      167(psout):    166(ptr) Variable Function
               24:          21 Load 23(g_tTex2dmsf4)
               25:     18(int) ImageQuerySamples 24
                               Store 20(@sampleCount) 25
-              27:     18(int) Load 20(@sampleCount)
-              30:    29(bool) IEqual 27 28
-                              SelectionMerge 32 None
-                              BranchConditional 30 31 45
-              31:               Label
-              40:      6(int)   Load 12(sample)
-                                Store 42(indexable) 39
-              43:     16(ptr)   AccessChain 42(indexable) 40
-              44:   15(fvec2)   Load 43
-                                Store 26 44
-                                Branch 32
-              45:               Label
-              47:     18(int)   Load 20(@sampleCount)
-              49:    29(bool)   IEqual 47 48
-                                SelectionMerge 51 None
-                                BranchConditional 49 50 68
-              50:                 Label
-              63:      6(int)     Load 12(sample)
-                                  Store 65(indexable) 62
-              66:     16(ptr)     AccessChain 65(indexable) 63
-              67:   15(fvec2)     Load 66
-                                  Store 46 67
-                                  Branch 51
-              68:                 Label
-              70:     18(int)     Load 20(@sampleCount)
-              72:    29(bool)     IEqual 70 71
-                                  SelectionMerge 74 None
-                                  BranchConditional 72 73 99
-              73:                   Label
-              94:      6(int)       Load 12(sample)
-                                    Store 96(indexable) 93
-              97:     16(ptr)       AccessChain 96(indexable) 94
-              98:   15(fvec2)       Load 97
-                                    Store 69 98
-                                    Branch 74
-              99:                   Label
-             101:     18(int)       Load 20(@sampleCount)
-             103:    29(bool)       IEqual 101 102
-                                    SelectionMerge 105 None
-                                    BranchConditional 103 104 132
-             104:                     Label
-             127:      6(int)         Load 12(sample)
-                                      Store 129(indexable) 126
-             130:     16(ptr)         AccessChain 129(indexable) 127
-             131:   15(fvec2)         Load 130
-                                      Store 100 131
-                                      Branch 105
-             132:                     Label
-                                      Store 100 133
-                                      Branch 105
-             105:                   Label
-             134:   15(fvec2)       Load 100
-                                    Store 69 134
-                                    Branch 74
-              74:                 Label
-             135:   15(fvec2)     Load 69
-                                  Store 46 135
-                                  Branch 51
-              51:               Label
-             136:   15(fvec2)   Load 46
-                                Store 26 136
-                                Branch 32
-              32:             Label
-             137:   15(fvec2) Load 26
-                              Store 17(r00) 137
-             143:         140 Load 142(g_tTex2dmsf4a)
-             144:     18(int) ImageQuerySamples 143
-                              Store 139(@sampleCount) 144
-             146:     18(int) Load 139(@sampleCount)
-             147:    29(bool) IEqual 146 28
-                              SelectionMerge 149 None
-                              BranchConditional 147 148 154
-             148:               Label
-             150:      6(int)   Load 12(sample)
-                                Store 151(indexable) 39
-             152:     16(ptr)   AccessChain 151(indexable) 150
-             153:   15(fvec2)   Load 152
-                                Store 145 153
-                                Branch 149
-             154:               Label
-             156:     18(int)   Load 139(@sampleCount)
-             157:    29(bool)   IEqual 156 48
-                                SelectionMerge 159 None
-                                BranchConditional 157 158 164
-             158:                 Label
-             160:      6(int)     Load 12(sample)
-                                  Store 161(indexable) 62
-             162:     16(ptr)     AccessChain 161(indexable) 160
-             163:   15(fvec2)     Load 162
-                                  Store 155 163
-                                  Branch 159
-             164:                 Label
-             166:     18(int)     Load 139(@sampleCount)
-             167:    29(bool)     IEqual 166 71
-                                  SelectionMerge 169 None
-                                  BranchConditional 167 168 174
-             168:                   Label
-             170:      6(int)       Load 12(sample)
-                                    Store 171(indexable) 93
-             172:     16(ptr)       AccessChain 171(indexable) 170
-             173:   15(fvec2)       Load 172
-                                    Store 165 173
-                                    Branch 169
-             174:                   Label
-             176:     18(int)       Load 139(@sampleCount)
-             177:    29(bool)       IEqual 176 102
-                                    SelectionMerge 179 None
-                                    BranchConditional 177 178 184
-             178:                     Label
-             180:      6(int)         Load 12(sample)
-                                      Store 181(indexable) 126
-             182:     16(ptr)         AccessChain 181(indexable) 180
-             183:   15(fvec2)         Load 182
-                                      Store 175 183
-                                      Branch 179
-             184:                     Label
-                                      Store 175 133
-                                      Branch 179
-             179:                   Label
-             185:   15(fvec2)       Load 175
-                                    Store 165 185
-                                    Branch 169
-             169:                 Label
-             186:   15(fvec2)     Load 165
-                                  Store 155 186
-                                  Branch 159
-             159:               Label
-             187:   15(fvec2)   Load 155
-                                Store 145 187
-                                Branch 149
-             149:             Label
-             188:   15(fvec2) Load 145
-                              Store 138(r01) 188
-             195:    194(ptr) AccessChain 190(psout) 191
-                              Store 195 193
-             198:    197(ptr) AccessChain 190(psout) 196
-                              Store 198 192
-             199:10(PS_OUTPUT) Load 190(psout)
-                              ReturnValue 199
+              26:     18(int) Load 20(@sampleCount)
+              29:    28(bool) IEqual 26 27
+              37:      6(int) Load 12(sample)
+                              Store 39(indexable) 36
+              40:     16(ptr) AccessChain 39(indexable) 37
+              41:   15(fvec2) Load 40
+              42:     18(int) Load 20(@sampleCount)
+              44:    28(bool) IEqual 42 43
+              56:      6(int) Load 12(sample)
+                              Store 58(indexable) 55
+              59:     16(ptr) AccessChain 58(indexable) 56
+              60:   15(fvec2) Load 59
+              61:     18(int) Load 20(@sampleCount)
+              63:    28(bool) IEqual 61 62
+              83:      6(int) Load 12(sample)
+                              Store 85(indexable) 82
+              86:     16(ptr) AccessChain 85(indexable) 83
+              87:   15(fvec2) Load 86
+              88:     18(int) Load 20(@sampleCount)
+              90:    28(bool) IEqual 88 89
+             112:      6(int) Load 12(sample)
+                              Store 114(indexable) 111
+             115:     16(ptr) AccessChain 114(indexable) 112
+             116:   15(fvec2) Load 115
+             119:  118(bvec2) CompositeConstruct 90 90
+             120:   15(fvec2) Select 119 116 117
+             121:  118(bvec2) CompositeConstruct 63 63
+             122:   15(fvec2) Select 121 87 120
+             123:  118(bvec2) CompositeConstruct 44 44
+             124:   15(fvec2) Select 123 60 122
+             125:  118(bvec2) CompositeConstruct 29 29
+             126:   15(fvec2) Select 125 41 124
+                              Store 17(r00) 126
+             132:         129 Load 131(g_tTex2dmsf4a)
+             133:     18(int) ImageQuerySamples 132
+                              Store 128(@sampleCount) 133
+             134:     18(int) Load 128(@sampleCount)
+             135:    28(bool) IEqual 134 27
+             136:      6(int) Load 12(sample)
+                              Store 137(indexable) 36
+             138:     16(ptr) AccessChain 137(indexable) 136
+             139:   15(fvec2) Load 138
+             140:     18(int) Load 128(@sampleCount)
+             141:    28(bool) IEqual 140 43
+             142:      6(int) Load 12(sample)
+                              Store 143(indexable) 55
+             144:     16(ptr) AccessChain 143(indexable) 142
+             145:   15(fvec2) Load 144
+             146:     18(int) Load 128(@sampleCount)
+             147:    28(bool) IEqual 146 62
+             148:      6(int) Load 12(sample)
+                              Store 149(indexable) 82
+             150:     16(ptr) AccessChain 149(indexable) 148
+             151:   15(fvec2) Load 150
+             152:     18(int) Load 128(@sampleCount)
+             153:    28(bool) IEqual 152 89
+             154:      6(int) Load 12(sample)
+                              Store 155(indexable) 111
+             156:     16(ptr) AccessChain 155(indexable) 154
+             157:   15(fvec2) Load 156
+             158:  118(bvec2) CompositeConstruct 153 153
+             159:   15(fvec2) Select 158 157 117
+             160:  118(bvec2) CompositeConstruct 147 147
+             161:   15(fvec2) Select 160 151 159
+             162:  118(bvec2) CompositeConstruct 141 141
+             163:   15(fvec2) Select 162 145 161
+             164:  118(bvec2) CompositeConstruct 135 135
+             165:   15(fvec2) Select 164 139 163
+                              Store 127(r01) 165
+             172:    171(ptr) AccessChain 167(psout) 168
+                              Store 172 170
+             175:    174(ptr) AccessChain 167(psout) 173
+                              Store 175 169
+             176:10(PS_OUTPUT) Load 167(psout)
+                              ReturnValue 176
                               FunctionEnd
diff --git a/Test/baseResults/hlsl.global-const-init.frag.out b/Test/baseResults/hlsl.global-const-init.frag.out
new file mode 100644
index 0000000..940f3be
--- /dev/null
+++ b/Test/baseResults/hlsl.global-const-init.frag.out
@@ -0,0 +1,178 @@
+hlsl.global-const-init.frag
+Shader version: 500
+gl_FragCoord origin is upper left
+0:? Sequence
+0:6  Sequence
+0:6    move second child to first child ( temp 4-component vector of float)
+0:6      'bar' ( global 4-component vector of float)
+0:6      foo: direct index for structure (layout( row_major std140) uniform 4-component vector of float)
+0:6        'anon@0' (layout( row_major std140) uniform block{layout( row_major std140) uniform 4-component vector of float foo})
+0:6        Constant:
+0:6          0 (const uint)
+0:8  Sequence
+0:8    move second child to first child ( temp 2-element array of 2-component vector of float)
+0:8      'a1' ( global 2-element array of 2-component vector of float)
+0:8      Construct vec2 ( temp 2-element array of 2-component vector of float)
+0:8        Constant:
+0:8          1.000000
+0:8          2.000000
+0:8        Construct vec2 ( temp 2-component vector of float)
+0:8          direct index ( temp float)
+0:8            foo: direct index for structure (layout( row_major std140) uniform 4-component vector of float)
+0:8              'anon@0' (layout( row_major std140) uniform block{layout( row_major std140) uniform 4-component vector of float foo})
+0:8              Constant:
+0:8                0 (const uint)
+0:8            Constant:
+0:8              0 (const int)
+0:8          Constant:
+0:8            4.000000
+0:12  Function Definition: @main( ( temp 4-component vector of float)
+0:12    Function Parameters: 
+0:?     Sequence
+0:13      Branch: Return with expression
+0:13        'bar' ( global 4-component vector of float)
+0:12  Function Definition: main( ( temp void)
+0:12    Function Parameters: 
+0:?     Sequence
+0:12      move second child to first child ( temp 4-component vector of float)
+0:?         '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+0:12        Function Call: @main( ( temp 4-component vector of float)
+0:?   Linker Objects
+0:?     'anon@0' (layout( row_major std140) uniform block{layout( row_major std140) uniform 4-component vector of float foo})
+0:?     'bar' ( global 4-component vector of float)
+0:?     'a1' ( global 2-element array of 2-component vector of float)
+0:?     'a2' ( const 2-element array of 2-component vector of float)
+0:?       5.000000
+0:?       6.000000
+0:?       7.000000
+0:?       8.000000
+0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+
+
+Linked fragment stage:
+
+
+Shader version: 500
+gl_FragCoord origin is upper left
+0:? Sequence
+0:6  Sequence
+0:6    move second child to first child ( temp 4-component vector of float)
+0:6      'bar' ( global 4-component vector of float)
+0:6      foo: direct index for structure (layout( row_major std140) uniform 4-component vector of float)
+0:6        'anon@0' (layout( row_major std140) uniform block{layout( row_major std140) uniform 4-component vector of float foo})
+0:6        Constant:
+0:6          0 (const uint)
+0:8  Sequence
+0:8    move second child to first child ( temp 2-element array of 2-component vector of float)
+0:8      'a1' ( global 2-element array of 2-component vector of float)
+0:8      Construct vec2 ( temp 2-element array of 2-component vector of float)
+0:8        Constant:
+0:8          1.000000
+0:8          2.000000
+0:8        Construct vec2 ( temp 2-component vector of float)
+0:8          direct index ( temp float)
+0:8            foo: direct index for structure (layout( row_major std140) uniform 4-component vector of float)
+0:8              'anon@0' (layout( row_major std140) uniform block{layout( row_major std140) uniform 4-component vector of float foo})
+0:8              Constant:
+0:8                0 (const uint)
+0:8            Constant:
+0:8              0 (const int)
+0:8          Constant:
+0:8            4.000000
+0:12  Function Definition: @main( ( temp 4-component vector of float)
+0:12    Function Parameters: 
+0:?     Sequence
+0:13      Branch: Return with expression
+0:13        'bar' ( global 4-component vector of float)
+0:12  Function Definition: main( ( temp void)
+0:12    Function Parameters: 
+0:?     Sequence
+0:12      move second child to first child ( temp 4-component vector of float)
+0:?         '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+0:12        Function Call: @main( ( temp 4-component vector of float)
+0:?   Linker Objects
+0:?     'anon@0' (layout( row_major std140) uniform block{layout( row_major std140) uniform 4-component vector of float foo})
+0:?     'bar' ( global 4-component vector of float)
+0:?     'a1' ( global 2-element array of 2-component vector of float)
+0:?     'a2' ( const 2-element array of 2-component vector of float)
+0:?       5.000000
+0:?       6.000000
+0:?       7.000000
+0:?       8.000000
+0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 50
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 41
+                              ExecutionMode 4 OriginUpperLeft
+                              Source HLSL 500
+                              Name 4  "main"
+                              Name 9  "@main("
+                              Name 12  "bar"
+                              Name 13  "CB"
+                              MemberName 13(CB) 0  "foo"
+                              Name 15  ""
+                              Name 26  "a1"
+                              Name 41  "@entryPointOutput"
+                              MemberDecorate 13(CB) 0 Offset 0
+                              Decorate 13(CB) Block
+                              Decorate 15 DescriptorSet 0
+                              Decorate 41(@entryPointOutput) Location 0
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+               8:             TypeFunction 7(fvec4)
+              11:             TypePointer Private 7(fvec4)
+         12(bar):     11(ptr) Variable Private
+          13(CB):             TypeStruct 7(fvec4)
+              14:             TypePointer Uniform 13(CB)
+              15:     14(ptr) Variable Uniform
+              16:             TypeInt 32 1
+              17:     16(int) Constant 0
+              18:             TypePointer Uniform 7(fvec4)
+              21:             TypeVector 6(float) 2
+              22:             TypeInt 32 0
+              23:     22(int) Constant 2
+              24:             TypeArray 21(fvec2) 23
+              25:             TypePointer Private 24
+          26(a1):     25(ptr) Variable Private
+              27:    6(float) Constant 1065353216
+              28:    6(float) Constant 1073741824
+              29:   21(fvec2) ConstantComposite 27 28
+              30:     22(int) Constant 0
+              31:             TypePointer Uniform 6(float)
+              34:    6(float) Constant 1082130432
+              40:             TypePointer Output 7(fvec4)
+41(@entryPointOutput):     40(ptr) Variable Output
+              43:    6(float) Constant 1084227584
+              44:    6(float) Constant 1086324736
+              45:   21(fvec2) ConstantComposite 43 44
+              46:    6(float) Constant 1088421888
+              47:    6(float) Constant 1090519040
+              48:   21(fvec2) ConstantComposite 46 47
+              49:          24 ConstantComposite 45 48
+         4(main):           2 Function None 3
+               5:             Label
+              19:     18(ptr) AccessChain 15 17
+              20:    7(fvec4) Load 19
+                              Store 12(bar) 20
+              32:     31(ptr) AccessChain 15 17 30
+              33:    6(float) Load 32
+              35:   21(fvec2) CompositeConstruct 33 34
+              36:          24 CompositeConstruct 29 35
+                              Store 26(a1) 36
+              42:    7(fvec4) FunctionCall 9(@main()
+                              Store 41(@entryPointOutput) 42
+                              Return
+                              FunctionEnd
+       9(@main():    7(fvec4) Function None 8
+              10:             Label
+              37:    7(fvec4) Load 12(bar)
+                              ReturnValue 37
+                              FunctionEnd
diff --git a/Test/baseResults/hlsl.groupid.comp.out b/Test/baseResults/hlsl.groupid.comp.out
new file mode 100644
index 0000000..386a3e9
--- /dev/null
+++ b/Test/baseResults/hlsl.groupid.comp.out
@@ -0,0 +1,146 @@
+hlsl.groupid.comp
+Shader version: 500
+local_size = (8, 8, 1)
+0:? Sequence
+0:7  Function Definition: @main(vu2; ( temp void)
+0:7    Function Parameters: 
+0:7      'vGroupId' ( in 2-component vector of uint)
+0:?     Sequence
+0:8      Sequence
+0:8        move second child to first child ( temp 4-component vector of float)
+0:8          'storeTemp' ( temp 4-component vector of float)
+0:?           Constant:
+0:?             1.000000
+0:?             0.000000
+0:?             0.000000
+0:?             1.000000
+0:8        imageStore ( temp void)
+0:8          'OutputTexture' (layout( rgba32f) uniform image2D)
+0:8          vector swizzle ( temp 2-component vector of uint)
+0:8            'vGroupId' ( in 2-component vector of uint)
+0:8            Sequence
+0:8              Constant:
+0:8                0 (const int)
+0:8              Constant:
+0:8                1 (const int)
+0:8          'storeTemp' ( temp 4-component vector of float)
+0:8        'storeTemp' ( temp 4-component vector of float)
+0:7  Function Definition: main( ( temp void)
+0:7    Function Parameters: 
+0:?     Sequence
+0:7      move second child to first child ( temp 2-component vector of uint)
+0:?         'vGroupId' ( temp 2-component vector of uint)
+0:?         Construct uvec2 ( temp 2-component vector of uint)
+0:?           'vGroupId' ( in 3-component vector of uint WorkGroupID)
+0:7      Function Call: @main(vu2; ( temp void)
+0:?         'vGroupId' ( temp 2-component vector of uint)
+0:?   Linker Objects
+0:?     'OutputTexture' (layout( rgba32f) uniform image2D)
+0:?     'vGroupId' ( in 3-component vector of uint WorkGroupID)
+
+
+Linked compute stage:
+
+
+Shader version: 500
+local_size = (8, 8, 1)
+0:? Sequence
+0:7  Function Definition: @main(vu2; ( temp void)
+0:7    Function Parameters: 
+0:7      'vGroupId' ( in 2-component vector of uint)
+0:?     Sequence
+0:8      Sequence
+0:8        move second child to first child ( temp 4-component vector of float)
+0:8          'storeTemp' ( temp 4-component vector of float)
+0:?           Constant:
+0:?             1.000000
+0:?             0.000000
+0:?             0.000000
+0:?             1.000000
+0:8        imageStore ( temp void)
+0:8          'OutputTexture' (layout( rgba32f) uniform image2D)
+0:8          vector swizzle ( temp 2-component vector of uint)
+0:8            'vGroupId' ( in 2-component vector of uint)
+0:8            Sequence
+0:8              Constant:
+0:8                0 (const int)
+0:8              Constant:
+0:8                1 (const int)
+0:8          'storeTemp' ( temp 4-component vector of float)
+0:8        'storeTemp' ( temp 4-component vector of float)
+0:7  Function Definition: main( ( temp void)
+0:7    Function Parameters: 
+0:?     Sequence
+0:7      move second child to first child ( temp 2-component vector of uint)
+0:?         'vGroupId' ( temp 2-component vector of uint)
+0:?         Construct uvec2 ( temp 2-component vector of uint)
+0:?           'vGroupId' ( in 3-component vector of uint WorkGroupID)
+0:7      Function Call: @main(vu2; ( temp void)
+0:?         'vGroupId' ( temp 2-component vector of uint)
+0:?   Linker Objects
+0:?     'OutputTexture' (layout( rgba32f) uniform image2D)
+0:?     'vGroupId' ( in 3-component vector of uint WorkGroupID)
+
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 37
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint GLCompute 4  "main" 29
+                              ExecutionMode 4 LocalSize 8 8 1
+                              Source HLSL 500
+                              Name 4  "main"
+                              Name 11  "@main(vu2;"
+                              Name 10  "vGroupId"
+                              Name 16  "storeTemp"
+                              Name 22  "OutputTexture"
+                              Name 26  "vGroupId"
+                              Name 29  "vGroupId"
+                              Name 34  "param"
+                              Decorate 22(OutputTexture) DescriptorSet 0
+                              Decorate 29(vGroupId) BuiltIn WorkgroupId
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeInt 32 0
+               7:             TypeVector 6(int) 2
+               8:             TypePointer Function 7(ivec2)
+               9:             TypeFunction 2 8(ptr)
+              13:             TypeFloat 32
+              14:             TypeVector 13(float) 4
+              15:             TypePointer Function 14(fvec4)
+              17:   13(float) Constant 1065353216
+              18:   13(float) Constant 0
+              19:   14(fvec4) ConstantComposite 17 18 18 17
+              20:             TypeImage 13(float) 2D nonsampled format:Rgba32f
+              21:             TypePointer UniformConstant 20
+22(OutputTexture):     21(ptr) Variable UniformConstant
+              27:             TypeVector 6(int) 3
+              28:             TypePointer Input 27(ivec3)
+    29(vGroupId):     28(ptr) Variable Input
+         4(main):           2 Function None 3
+               5:             Label
+    26(vGroupId):      8(ptr) Variable Function
+       34(param):      8(ptr) Variable Function
+              30:   27(ivec3) Load 29(vGroupId)
+              31:      6(int) CompositeExtract 30 0
+              32:      6(int) CompositeExtract 30 1
+              33:    7(ivec2) CompositeConstruct 31 32
+                              Store 26(vGroupId) 33
+              35:    7(ivec2) Load 26(vGroupId)
+                              Store 34(param) 35
+              36:           2 FunctionCall 11(@main(vu2;) 34(param)
+                              Return
+                              FunctionEnd
+  11(@main(vu2;):           2 Function None 9
+    10(vGroupId):      8(ptr) FunctionParameter
+              12:             Label
+   16(storeTemp):     15(ptr) Variable Function
+                              Store 16(storeTemp) 19
+              23:          20 Load 22(OutputTexture)
+              24:    7(ivec2) Load 10(vGroupId)
+              25:   14(fvec4) Load 16(storeTemp)
+                              ImageWrite 23 24 25
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/hlsl.gs-hs-mix.tesc.out b/Test/baseResults/hlsl.gs-hs-mix.tesc.out
new file mode 100644
index 0000000..4971371
--- /dev/null
+++ b/Test/baseResults/hlsl.gs-hs-mix.tesc.out
@@ -0,0 +1,1158 @@
+hlsl.gs-hs-mix.tesc
+Shader version: 500
+vertices = 3
+input primitive = triangles
+vertex spacing = fractional_odd_spacing
+triangle order = ccw
+0:? Sequence
+0:31  Function Definition: HSPatchConstant(struct-HSInput-vf3-vf31[3]; ( temp structure{ temp 3-element array of float EdgeTessFactor,  temp float InsideTessFactor,  temp 3-element array of 3-component vector of float NormalWS})
+0:31    Function Parameters: 
+0:31      'patch' ( in 3-element array of structure{ temp 3-component vector of float PositionWS,  temp 3-component vector of float NormalWS})
+0:?     Sequence
+0:32      Sequence
+0:32        move second child to first child ( temp 3-component vector of float)
+0:32          'roundedEdgeTessFactor' ( temp 3-component vector of float)
+0:32          tess_factor: direct index for structure (layout( row_major std140) uniform 3-component vector of float)
+0:32            'anon@0' (layout( binding=0 row_major std140) uniform block{layout( row_major std140) uniform 4X4 matrix of float model_view_matrix, layout( row_major std140) uniform 4X4 matrix of float proj_matrix, layout( row_major std140) uniform 4X4 matrix of float model_view_proj_matrix, layout( row_major std140) uniform 3X3 matrix of float normal_matrix, layout( row_major std140) uniform 3-component vector of float color, layout( row_major std140) uniform 3-component vector of float view_dir, layout( row_major std140) uniform 3-component vector of float tess_factor})
+0:32            Constant:
+0:32              6 (const uint)
+0:33      Sequence
+0:33        move second child to first child ( temp float)
+0:33          'roundedInsideTessFactor' ( temp float)
+0:33          Constant:
+0:33            3.000000
+0:34      Sequence
+0:34        move second child to first child ( temp float)
+0:34          'insideTessFactor' ( temp float)
+0:34          Constant:
+0:34            1.000000
+0:39      move second child to first child ( temp float)
+0:39        direct index ( temp float)
+0:39          EdgeTessFactor: direct index for structure ( temp 3-element array of float)
+0:39            'result' ( temp structure{ temp 3-element array of float EdgeTessFactor,  temp float InsideTessFactor,  temp 3-element array of 3-component vector of float NormalWS})
+0:39            Constant:
+0:39              0 (const int)
+0:39          Constant:
+0:39            0 (const int)
+0:39        direct index ( temp float)
+0:39          'roundedEdgeTessFactor' ( temp 3-component vector of float)
+0:39          Constant:
+0:39            0 (const int)
+0:40      move second child to first child ( temp float)
+0:40        direct index ( temp float)
+0:40          EdgeTessFactor: direct index for structure ( temp 3-element array of float)
+0:40            'result' ( temp structure{ temp 3-element array of float EdgeTessFactor,  temp float InsideTessFactor,  temp 3-element array of 3-component vector of float NormalWS})
+0:40            Constant:
+0:40              0 (const int)
+0:40          Constant:
+0:40            1 (const int)
+0:40        direct index ( temp float)
+0:40          'roundedEdgeTessFactor' ( temp 3-component vector of float)
+0:40          Constant:
+0:40            1 (const int)
+0:41      move second child to first child ( temp float)
+0:41        direct index ( temp float)
+0:41          EdgeTessFactor: direct index for structure ( temp 3-element array of float)
+0:41            'result' ( temp structure{ temp 3-element array of float EdgeTessFactor,  temp float InsideTessFactor,  temp 3-element array of 3-component vector of float NormalWS})
+0:41            Constant:
+0:41              0 (const int)
+0:41          Constant:
+0:41            2 (const int)
+0:41        direct index ( temp float)
+0:41          'roundedEdgeTessFactor' ( temp 3-component vector of float)
+0:41          Constant:
+0:41            2 (const int)
+0:42      move second child to first child ( temp float)
+0:42        InsideTessFactor: direct index for structure ( temp float)
+0:42          'result' ( temp structure{ temp 3-element array of float EdgeTessFactor,  temp float InsideTessFactor,  temp 3-element array of 3-component vector of float NormalWS})
+0:42          Constant:
+0:42            1 (const int)
+0:42        'roundedInsideTessFactor' ( temp float)
+0:45      move second child to first child ( temp 3-component vector of float)
+0:45        direct index ( temp 3-component vector of float)
+0:45          NormalWS: direct index for structure ( temp 3-element array of 3-component vector of float)
+0:45            'result' ( temp structure{ temp 3-element array of float EdgeTessFactor,  temp float InsideTessFactor,  temp 3-element array of 3-component vector of float NormalWS})
+0:45            Constant:
+0:45              2 (const int)
+0:45          Constant:
+0:45            0 (const int)
+0:45        NormalWS: direct index for structure ( temp 3-component vector of float)
+0:45          direct index ( temp structure{ temp 3-component vector of float PositionWS,  temp 3-component vector of float NormalWS})
+0:45            'patch' ( in 3-element array of structure{ temp 3-component vector of float PositionWS,  temp 3-component vector of float NormalWS})
+0:45            Constant:
+0:45              0 (const int)
+0:45          Constant:
+0:45            1 (const int)
+0:46      move second child to first child ( temp 3-component vector of float)
+0:46        direct index ( temp 3-component vector of float)
+0:46          NormalWS: direct index for structure ( temp 3-element array of 3-component vector of float)
+0:46            'result' ( temp structure{ temp 3-element array of float EdgeTessFactor,  temp float InsideTessFactor,  temp 3-element array of 3-component vector of float NormalWS})
+0:46            Constant:
+0:46              2 (const int)
+0:46          Constant:
+0:46            1 (const int)
+0:46        NormalWS: direct index for structure ( temp 3-component vector of float)
+0:46          direct index ( temp structure{ temp 3-component vector of float PositionWS,  temp 3-component vector of float NormalWS})
+0:46            'patch' ( in 3-element array of structure{ temp 3-component vector of float PositionWS,  temp 3-component vector of float NormalWS})
+0:46            Constant:
+0:46              1 (const int)
+0:46          Constant:
+0:46            1 (const int)
+0:47      move second child to first child ( temp 3-component vector of float)
+0:47        direct index ( temp 3-component vector of float)
+0:47          NormalWS: direct index for structure ( temp 3-element array of 3-component vector of float)
+0:47            'result' ( temp structure{ temp 3-element array of float EdgeTessFactor,  temp float InsideTessFactor,  temp 3-element array of 3-component vector of float NormalWS})
+0:47            Constant:
+0:47              2 (const int)
+0:47          Constant:
+0:47            2 (const int)
+0:47        NormalWS: direct index for structure ( temp 3-component vector of float)
+0:47          direct index ( temp structure{ temp 3-component vector of float PositionWS,  temp 3-component vector of float NormalWS})
+0:47            'patch' ( in 3-element array of structure{ temp 3-component vector of float PositionWS,  temp 3-component vector of float NormalWS})
+0:47            Constant:
+0:47              2 (const int)
+0:47          Constant:
+0:47            1 (const int)
+0:49      Branch: Return with expression
+0:49        'result' ( temp structure{ temp 3-element array of float EdgeTessFactor,  temp float InsideTessFactor,  temp 3-element array of 3-component vector of float NormalWS})
+0:61  Function Definition: @HSMain(struct-HSInput-vf3-vf31[3];u1; ( temp structure{ temp 3-component vector of float PositionWS})
+0:61    Function Parameters: 
+0:61      'patch' ( in 3-element array of structure{ temp 3-component vector of float PositionWS,  temp 3-component vector of float NormalWS})
+0:61      'id' ( in uint)
+0:?     Sequence
+0:63      move second child to first child ( temp 3-component vector of float)
+0:63        PositionWS: direct index for structure ( temp 3-component vector of float)
+0:63          'output' ( temp structure{ temp 3-component vector of float PositionWS})
+0:63          Constant:
+0:63            0 (const int)
+0:63        PositionWS: direct index for structure ( temp 3-component vector of float)
+0:63          indirect index ( temp structure{ temp 3-component vector of float PositionWS,  temp 3-component vector of float NormalWS})
+0:63            'patch' ( in 3-element array of structure{ temp 3-component vector of float PositionWS,  temp 3-component vector of float NormalWS})
+0:63            'id' ( in uint)
+0:63          Constant:
+0:63            0 (const int)
+0:64      Branch: Return with expression
+0:64        'output' ( temp structure{ temp 3-component vector of float PositionWS})
+0:61  Function Definition: HSMain( ( temp void)
+0:61    Function Parameters: 
+0:?     Sequence
+0:61      move second child to first child ( temp 3-element array of structure{ temp 3-component vector of float PositionWS,  temp 3-component vector of float NormalWS})
+0:?         'patch' ( temp 3-element array of structure{ temp 3-component vector of float PositionWS,  temp 3-component vector of float NormalWS})
+0:?         'patch' (layout( location=0) in 3-element array of structure{ temp 3-component vector of float PositionWS,  temp 3-component vector of float NormalWS})
+0:61      move second child to first child ( temp uint)
+0:?         'id' ( temp uint)
+0:?         'id' ( in uint InvocationID)
+0:61      move second child to first child ( temp structure{ temp 3-component vector of float PositionWS})
+0:61        indirect index (layout( location=0) out structure{ temp 3-component vector of float PositionWS})
+0:?           '@entryPointOutput' (layout( location=0) out 3-element array of structure{ temp 3-component vector of float PositionWS})
+0:?           'id' ( in uint InvocationID)
+0:61        Function Call: @HSMain(struct-HSInput-vf3-vf31[3];u1; ( temp structure{ temp 3-component vector of float PositionWS})
+0:?           'patch' ( temp 3-element array of structure{ temp 3-component vector of float PositionWS,  temp 3-component vector of float NormalWS})
+0:?           'id' ( temp uint)
+0:?       Barrier ( temp void)
+0:?       Test condition and select ( temp void)
+0:?         Condition
+0:?         Compare Equal ( temp bool)
+0:?           'id' ( in uint InvocationID)
+0:?           Constant:
+0:?             0 (const int)
+0:?         true case
+0:?         Sequence
+0:?           move second child to first child ( temp structure{ temp 3-element array of float EdgeTessFactor,  temp float InsideTessFactor,  temp 3-element array of 3-component vector of float NormalWS})
+0:?             '@patchConstantResult' ( temp structure{ temp 3-element array of float EdgeTessFactor,  temp float InsideTessFactor,  temp 3-element array of 3-component vector of float NormalWS})
+0:?             Function Call: HSPatchConstant(struct-HSInput-vf3-vf31[3]; ( temp structure{ temp 3-element array of float EdgeTessFactor,  temp float InsideTessFactor,  temp 3-element array of 3-component vector of float NormalWS})
+0:?               'patch' ( temp 3-element array of structure{ temp 3-component vector of float PositionWS,  temp 3-component vector of float NormalWS})
+0:?           Sequence
+0:?             move second child to first child ( temp float)
+0:?               direct index ( patch out float TessLevelOuter)
+0:?                 '@patchConstantOutput.EdgeTessFactor' ( patch out 4-element array of float TessLevelOuter)
+0:?                 Constant:
+0:?                   0 (const int)
+0:?               direct index ( temp float)
+0:?                 EdgeTessFactor: direct index for structure ( temp 3-element array of float)
+0:?                   '@patchConstantResult' ( temp structure{ temp 3-element array of float EdgeTessFactor,  temp float InsideTessFactor,  temp 3-element array of 3-component vector of float NormalWS})
+0:?                   Constant:
+0:?                     0 (const int)
+0:?                 Constant:
+0:?                   0 (const int)
+0:?             move second child to first child ( temp float)
+0:?               direct index ( patch out float TessLevelOuter)
+0:?                 '@patchConstantOutput.EdgeTessFactor' ( patch out 4-element array of float TessLevelOuter)
+0:?                 Constant:
+0:?                   1 (const int)
+0:?               direct index ( temp float)
+0:?                 EdgeTessFactor: direct index for structure ( temp 3-element array of float)
+0:?                   '@patchConstantResult' ( temp structure{ temp 3-element array of float EdgeTessFactor,  temp float InsideTessFactor,  temp 3-element array of 3-component vector of float NormalWS})
+0:?                   Constant:
+0:?                     0 (const int)
+0:?                 Constant:
+0:?                   1 (const int)
+0:?             move second child to first child ( temp float)
+0:?               direct index ( patch out float TessLevelOuter)
+0:?                 '@patchConstantOutput.EdgeTessFactor' ( patch out 4-element array of float TessLevelOuter)
+0:?                 Constant:
+0:?                   2 (const int)
+0:?               direct index ( temp float)
+0:?                 EdgeTessFactor: direct index for structure ( temp 3-element array of float)
+0:?                   '@patchConstantResult' ( temp structure{ temp 3-element array of float EdgeTessFactor,  temp float InsideTessFactor,  temp 3-element array of 3-component vector of float NormalWS})
+0:?                   Constant:
+0:?                     0 (const int)
+0:?                 Constant:
+0:?                   2 (const int)
+0:?             move second child to first child ( temp float)
+0:?               direct index ( patch out float TessLevelInner)
+0:?                 '@patchConstantOutput.InsideTessFactor' ( patch out 2-element array of float TessLevelInner)
+0:?                 Constant:
+0:?                   0 (const int)
+0:?               InsideTessFactor: direct index for structure ( temp float)
+0:?                 '@patchConstantResult' ( temp structure{ temp 3-element array of float EdgeTessFactor,  temp float InsideTessFactor,  temp 3-element array of 3-component vector of float NormalWS})
+0:?                 Constant:
+0:?                   1 (const int)
+0:?             move second child to first child ( temp 3-element array of 3-component vector of float)
+0:?               NormalWS: direct index for structure ( temp 3-element array of 3-component vector of float)
+0:?                 '@patchConstantOutput' (layout( location=1) patch out structure{ temp 3-element array of 3-component vector of float NormalWS})
+0:?                 Constant:
+0:?                   0 (const int)
+0:?               NormalWS: direct index for structure ( temp 3-element array of 3-component vector of float)
+0:?                 '@patchConstantResult' ( temp structure{ temp 3-element array of float EdgeTessFactor,  temp float InsideTessFactor,  temp 3-element array of 3-component vector of float NormalWS})
+0:?                 Constant:
+0:?                   2 (const int)
+0:84  Function Definition: GSMain(struct-GSVertexInput-vf3-vf31[3];struct-GSVertexOutput-vf41; ( temp void)
+0:84    Function Parameters: 
+0:84      'input' ( in 3-element array of structure{ temp 3-component vector of float PositionWS,  temp 3-component vector of float NormalWS})
+0:84      'output' ( out structure{ temp 4-component vector of float PositionCS})
+0:?     Sequence
+0:86      Sequence
+0:86        move second child to first child ( temp 3-component vector of float)
+0:86          'P0' ( temp 3-component vector of float)
+0:86          vector swizzle ( temp 3-component vector of float)
+0:86            PositionWS: direct index for structure ( temp 3-component vector of float)
+0:86              direct index ( temp structure{ temp 3-component vector of float PositionWS,  temp 3-component vector of float NormalWS})
+0:86                'input' ( in 3-element array of structure{ temp 3-component vector of float PositionWS,  temp 3-component vector of float NormalWS})
+0:86                Constant:
+0:86                  0 (const int)
+0:86              Constant:
+0:86                0 (const int)
+0:86            Sequence
+0:86              Constant:
+0:86                0 (const int)
+0:86              Constant:
+0:86                1 (const int)
+0:86              Constant:
+0:86                2 (const int)
+0:87      Sequence
+0:87        move second child to first child ( temp 3-component vector of float)
+0:87          'P1' ( temp 3-component vector of float)
+0:87          vector swizzle ( temp 3-component vector of float)
+0:87            PositionWS: direct index for structure ( temp 3-component vector of float)
+0:87              direct index ( temp structure{ temp 3-component vector of float PositionWS,  temp 3-component vector of float NormalWS})
+0:87                'input' ( in 3-element array of structure{ temp 3-component vector of float PositionWS,  temp 3-component vector of float NormalWS})
+0:87                Constant:
+0:87                  1 (const int)
+0:87              Constant:
+0:87                0 (const int)
+0:87            Sequence
+0:87              Constant:
+0:87                0 (const int)
+0:87              Constant:
+0:87                1 (const int)
+0:87              Constant:
+0:87                2 (const int)
+0:88      Sequence
+0:88        move second child to first child ( temp 3-component vector of float)
+0:88          'P2' ( temp 3-component vector of float)
+0:88          vector swizzle ( temp 3-component vector of float)
+0:88            PositionWS: direct index for structure ( temp 3-component vector of float)
+0:88              direct index ( temp structure{ temp 3-component vector of float PositionWS,  temp 3-component vector of float NormalWS})
+0:88                'input' ( in 3-element array of structure{ temp 3-component vector of float PositionWS,  temp 3-component vector of float NormalWS})
+0:88                Constant:
+0:88                  2 (const int)
+0:88              Constant:
+0:88                0 (const int)
+0:88            Sequence
+0:88              Constant:
+0:88                0 (const int)
+0:88              Constant:
+0:88                1 (const int)
+0:88              Constant:
+0:88                2 (const int)
+0:92      add second child into first child ( temp float)
+0:92        direct index ( temp float)
+0:92          'P0' ( temp 3-component vector of float)
+0:92          Constant:
+0:92            2 (const int)
+0:92        Constant:
+0:92          0.001000
+0:93      add second child into first child ( temp float)
+0:93        direct index ( temp float)
+0:93          'P1' ( temp 3-component vector of float)
+0:93          Constant:
+0:93            2 (const int)
+0:93        Constant:
+0:93          0.001000
+0:94      add second child into first child ( temp float)
+0:94        direct index ( temp float)
+0:94          'P2' ( temp 3-component vector of float)
+0:94          Constant:
+0:94            2 (const int)
+0:94        Constant:
+0:94          0.001000
+0:95      Sequence
+0:95        move second child to first child ( temp 4-component vector of float)
+0:95          'Q0' ( temp 4-component vector of float)
+0:95          vector-times-matrix ( temp 4-component vector of float)
+0:?             Construct vec4 ( temp 4-component vector of float)
+0:95              'P0' ( temp 3-component vector of float)
+0:95              Constant:
+0:95                1.000000
+0:95            proj_matrix: direct index for structure (layout( row_major std140) uniform 4X4 matrix of float)
+0:95              'anon@0' (layout( binding=0 row_major std140) uniform block{layout( row_major std140) uniform 4X4 matrix of float model_view_matrix, layout( row_major std140) uniform 4X4 matrix of float proj_matrix, layout( row_major std140) uniform 4X4 matrix of float model_view_proj_matrix, layout( row_major std140) uniform 3X3 matrix of float normal_matrix, layout( row_major std140) uniform 3-component vector of float color, layout( row_major std140) uniform 3-component vector of float view_dir, layout( row_major std140) uniform 3-component vector of float tess_factor})
+0:95              Constant:
+0:95                1 (const uint)
+0:96      Sequence
+0:96        move second child to first child ( temp 4-component vector of float)
+0:96          'Q1' ( temp 4-component vector of float)
+0:96          vector-times-matrix ( temp 4-component vector of float)
+0:?             Construct vec4 ( temp 4-component vector of float)
+0:96              'P1' ( temp 3-component vector of float)
+0:96              Constant:
+0:96                1.000000
+0:96            proj_matrix: direct index for structure (layout( row_major std140) uniform 4X4 matrix of float)
+0:96              'anon@0' (layout( binding=0 row_major std140) uniform block{layout( row_major std140) uniform 4X4 matrix of float model_view_matrix, layout( row_major std140) uniform 4X4 matrix of float proj_matrix, layout( row_major std140) uniform 4X4 matrix of float model_view_proj_matrix, layout( row_major std140) uniform 3X3 matrix of float normal_matrix, layout( row_major std140) uniform 3-component vector of float color, layout( row_major std140) uniform 3-component vector of float view_dir, layout( row_major std140) uniform 3-component vector of float tess_factor})
+0:96              Constant:
+0:96                1 (const uint)
+0:97      Sequence
+0:97        move second child to first child ( temp 4-component vector of float)
+0:97          'Q2' ( temp 4-component vector of float)
+0:97          vector-times-matrix ( temp 4-component vector of float)
+0:?             Construct vec4 ( temp 4-component vector of float)
+0:97              'P2' ( temp 3-component vector of float)
+0:97              Constant:
+0:97                1.000000
+0:97            proj_matrix: direct index for structure (layout( row_major std140) uniform 4X4 matrix of float)
+0:97              'anon@0' (layout( binding=0 row_major std140) uniform block{layout( row_major std140) uniform 4X4 matrix of float model_view_matrix, layout( row_major std140) uniform 4X4 matrix of float proj_matrix, layout( row_major std140) uniform 4X4 matrix of float model_view_proj_matrix, layout( row_major std140) uniform 3X3 matrix of float normal_matrix, layout( row_major std140) uniform 3-component vector of float color, layout( row_major std140) uniform 3-component vector of float view_dir, layout( row_major std140) uniform 3-component vector of float tess_factor})
+0:97              Constant:
+0:97                1 (const uint)
+0:100      move second child to first child ( temp 4-component vector of float)
+0:100        PositionCS: direct index for structure ( temp 4-component vector of float)
+0:100          'vertex' ( temp structure{ temp 4-component vector of float PositionCS})
+0:100          Constant:
+0:100            0 (const int)
+0:100        'Q0' ( temp 4-component vector of float)
+0:101      Constant:
+0:101        0.000000
+0:102      move second child to first child ( temp 4-component vector of float)
+0:102        PositionCS: direct index for structure ( temp 4-component vector of float)
+0:102          'vertex' ( temp structure{ temp 4-component vector of float PositionCS})
+0:102          Constant:
+0:102            0 (const int)
+0:102        'Q1' ( temp 4-component vector of float)
+0:103      Constant:
+0:103        0.000000
+0:104      Constant:
+0:104        0.000000
+0:107      move second child to first child ( temp 4-component vector of float)
+0:107        PositionCS: direct index for structure ( temp 4-component vector of float)
+0:107          'vertex' ( temp structure{ temp 4-component vector of float PositionCS})
+0:107          Constant:
+0:107            0 (const int)
+0:107        'Q1' ( temp 4-component vector of float)
+0:108      Constant:
+0:108        0.000000
+0:109      move second child to first child ( temp 4-component vector of float)
+0:109        PositionCS: direct index for structure ( temp 4-component vector of float)
+0:109          'vertex' ( temp structure{ temp 4-component vector of float PositionCS})
+0:109          Constant:
+0:109            0 (const int)
+0:109        'Q2' ( temp 4-component vector of float)
+0:110      Constant:
+0:110        0.000000
+0:111      Constant:
+0:111        0.000000
+0:114      move second child to first child ( temp 4-component vector of float)
+0:114        PositionCS: direct index for structure ( temp 4-component vector of float)
+0:114          'vertex' ( temp structure{ temp 4-component vector of float PositionCS})
+0:114          Constant:
+0:114            0 (const int)
+0:114        'Q2' ( temp 4-component vector of float)
+0:115      Constant:
+0:115        0.000000
+0:116      move second child to first child ( temp 4-component vector of float)
+0:116        PositionCS: direct index for structure ( temp 4-component vector of float)
+0:116          'vertex' ( temp structure{ temp 4-component vector of float PositionCS})
+0:116          Constant:
+0:116            0 (const int)
+0:116        'Q0' ( temp 4-component vector of float)
+0:117      Constant:
+0:117        0.000000
+0:118      Constant:
+0:118        0.000000
+0:?   Linker Objects
+0:?     'anon@0' (layout( binding=0 row_major std140) uniform block{layout( row_major std140) uniform 4X4 matrix of float model_view_matrix, layout( row_major std140) uniform 4X4 matrix of float proj_matrix, layout( row_major std140) uniform 4X4 matrix of float model_view_proj_matrix, layout( row_major std140) uniform 3X3 matrix of float normal_matrix, layout( row_major std140) uniform 3-component vector of float color, layout( row_major std140) uniform 3-component vector of float view_dir, layout( row_major std140) uniform 3-component vector of float tess_factor})
+0:?     '@entryPointOutput' (layout( location=0) out 3-element array of structure{ temp 3-component vector of float PositionWS})
+0:?     'patch' (layout( location=0) in 3-element array of structure{ temp 3-component vector of float PositionWS,  temp 3-component vector of float NormalWS})
+0:?     'id' ( in uint InvocationID)
+0:?     '@patchConstantOutput.EdgeTessFactor' ( patch out 4-element array of float TessLevelOuter)
+0:?     '@patchConstantOutput.InsideTessFactor' ( patch out 2-element array of float TessLevelInner)
+0:?     '@patchConstantOutput' (layout( location=1) patch out structure{ temp 3-element array of 3-component vector of float NormalWS})
+
+
+Linked tessellation control stage:
+
+
+Shader version: 500
+vertices = 3
+input primitive = triangles
+vertex spacing = fractional_odd_spacing
+triangle order = ccw
+0:? Sequence
+0:31  Function Definition: HSPatchConstant(struct-HSInput-vf3-vf31[3]; ( temp structure{ temp 3-element array of float EdgeTessFactor,  temp float InsideTessFactor,  temp 3-element array of 3-component vector of float NormalWS})
+0:31    Function Parameters: 
+0:31      'patch' ( in 3-element array of structure{ temp 3-component vector of float PositionWS,  temp 3-component vector of float NormalWS})
+0:?     Sequence
+0:32      Sequence
+0:32        move second child to first child ( temp 3-component vector of float)
+0:32          'roundedEdgeTessFactor' ( temp 3-component vector of float)
+0:32          tess_factor: direct index for structure (layout( row_major std140) uniform 3-component vector of float)
+0:32            'anon@0' (layout( binding=0 row_major std140) uniform block{layout( row_major std140) uniform 4X4 matrix of float model_view_matrix, layout( row_major std140) uniform 4X4 matrix of float proj_matrix, layout( row_major std140) uniform 4X4 matrix of float model_view_proj_matrix, layout( row_major std140) uniform 3X3 matrix of float normal_matrix, layout( row_major std140) uniform 3-component vector of float color, layout( row_major std140) uniform 3-component vector of float view_dir, layout( row_major std140) uniform 3-component vector of float tess_factor})
+0:32            Constant:
+0:32              6 (const uint)
+0:33      Sequence
+0:33        move second child to first child ( temp float)
+0:33          'roundedInsideTessFactor' ( temp float)
+0:33          Constant:
+0:33            3.000000
+0:34      Sequence
+0:34        move second child to first child ( temp float)
+0:34          'insideTessFactor' ( temp float)
+0:34          Constant:
+0:34            1.000000
+0:39      move second child to first child ( temp float)
+0:39        direct index ( temp float)
+0:39          EdgeTessFactor: direct index for structure ( temp 3-element array of float)
+0:39            'result' ( temp structure{ temp 3-element array of float EdgeTessFactor,  temp float InsideTessFactor,  temp 3-element array of 3-component vector of float NormalWS})
+0:39            Constant:
+0:39              0 (const int)
+0:39          Constant:
+0:39            0 (const int)
+0:39        direct index ( temp float)
+0:39          'roundedEdgeTessFactor' ( temp 3-component vector of float)
+0:39          Constant:
+0:39            0 (const int)
+0:40      move second child to first child ( temp float)
+0:40        direct index ( temp float)
+0:40          EdgeTessFactor: direct index for structure ( temp 3-element array of float)
+0:40            'result' ( temp structure{ temp 3-element array of float EdgeTessFactor,  temp float InsideTessFactor,  temp 3-element array of 3-component vector of float NormalWS})
+0:40            Constant:
+0:40              0 (const int)
+0:40          Constant:
+0:40            1 (const int)
+0:40        direct index ( temp float)
+0:40          'roundedEdgeTessFactor' ( temp 3-component vector of float)
+0:40          Constant:
+0:40            1 (const int)
+0:41      move second child to first child ( temp float)
+0:41        direct index ( temp float)
+0:41          EdgeTessFactor: direct index for structure ( temp 3-element array of float)
+0:41            'result' ( temp structure{ temp 3-element array of float EdgeTessFactor,  temp float InsideTessFactor,  temp 3-element array of 3-component vector of float NormalWS})
+0:41            Constant:
+0:41              0 (const int)
+0:41          Constant:
+0:41            2 (const int)
+0:41        direct index ( temp float)
+0:41          'roundedEdgeTessFactor' ( temp 3-component vector of float)
+0:41          Constant:
+0:41            2 (const int)
+0:42      move second child to first child ( temp float)
+0:42        InsideTessFactor: direct index for structure ( temp float)
+0:42          'result' ( temp structure{ temp 3-element array of float EdgeTessFactor,  temp float InsideTessFactor,  temp 3-element array of 3-component vector of float NormalWS})
+0:42          Constant:
+0:42            1 (const int)
+0:42        'roundedInsideTessFactor' ( temp float)
+0:45      move second child to first child ( temp 3-component vector of float)
+0:45        direct index ( temp 3-component vector of float)
+0:45          NormalWS: direct index for structure ( temp 3-element array of 3-component vector of float)
+0:45            'result' ( temp structure{ temp 3-element array of float EdgeTessFactor,  temp float InsideTessFactor,  temp 3-element array of 3-component vector of float NormalWS})
+0:45            Constant:
+0:45              2 (const int)
+0:45          Constant:
+0:45            0 (const int)
+0:45        NormalWS: direct index for structure ( temp 3-component vector of float)
+0:45          direct index ( temp structure{ temp 3-component vector of float PositionWS,  temp 3-component vector of float NormalWS})
+0:45            'patch' ( in 3-element array of structure{ temp 3-component vector of float PositionWS,  temp 3-component vector of float NormalWS})
+0:45            Constant:
+0:45              0 (const int)
+0:45          Constant:
+0:45            1 (const int)
+0:46      move second child to first child ( temp 3-component vector of float)
+0:46        direct index ( temp 3-component vector of float)
+0:46          NormalWS: direct index for structure ( temp 3-element array of 3-component vector of float)
+0:46            'result' ( temp structure{ temp 3-element array of float EdgeTessFactor,  temp float InsideTessFactor,  temp 3-element array of 3-component vector of float NormalWS})
+0:46            Constant:
+0:46              2 (const int)
+0:46          Constant:
+0:46            1 (const int)
+0:46        NormalWS: direct index for structure ( temp 3-component vector of float)
+0:46          direct index ( temp structure{ temp 3-component vector of float PositionWS,  temp 3-component vector of float NormalWS})
+0:46            'patch' ( in 3-element array of structure{ temp 3-component vector of float PositionWS,  temp 3-component vector of float NormalWS})
+0:46            Constant:
+0:46              1 (const int)
+0:46          Constant:
+0:46            1 (const int)
+0:47      move second child to first child ( temp 3-component vector of float)
+0:47        direct index ( temp 3-component vector of float)
+0:47          NormalWS: direct index for structure ( temp 3-element array of 3-component vector of float)
+0:47            'result' ( temp structure{ temp 3-element array of float EdgeTessFactor,  temp float InsideTessFactor,  temp 3-element array of 3-component vector of float NormalWS})
+0:47            Constant:
+0:47              2 (const int)
+0:47          Constant:
+0:47            2 (const int)
+0:47        NormalWS: direct index for structure ( temp 3-component vector of float)
+0:47          direct index ( temp structure{ temp 3-component vector of float PositionWS,  temp 3-component vector of float NormalWS})
+0:47            'patch' ( in 3-element array of structure{ temp 3-component vector of float PositionWS,  temp 3-component vector of float NormalWS})
+0:47            Constant:
+0:47              2 (const int)
+0:47          Constant:
+0:47            1 (const int)
+0:49      Branch: Return with expression
+0:49        'result' ( temp structure{ temp 3-element array of float EdgeTessFactor,  temp float InsideTessFactor,  temp 3-element array of 3-component vector of float NormalWS})
+0:61  Function Definition: @HSMain(struct-HSInput-vf3-vf31[3];u1; ( temp structure{ temp 3-component vector of float PositionWS})
+0:61    Function Parameters: 
+0:61      'patch' ( in 3-element array of structure{ temp 3-component vector of float PositionWS,  temp 3-component vector of float NormalWS})
+0:61      'id' ( in uint)
+0:?     Sequence
+0:63      move second child to first child ( temp 3-component vector of float)
+0:63        PositionWS: direct index for structure ( temp 3-component vector of float)
+0:63          'output' ( temp structure{ temp 3-component vector of float PositionWS})
+0:63          Constant:
+0:63            0 (const int)
+0:63        PositionWS: direct index for structure ( temp 3-component vector of float)
+0:63          indirect index ( temp structure{ temp 3-component vector of float PositionWS,  temp 3-component vector of float NormalWS})
+0:63            'patch' ( in 3-element array of structure{ temp 3-component vector of float PositionWS,  temp 3-component vector of float NormalWS})
+0:63            'id' ( in uint)
+0:63          Constant:
+0:63            0 (const int)
+0:64      Branch: Return with expression
+0:64        'output' ( temp structure{ temp 3-component vector of float PositionWS})
+0:61  Function Definition: HSMain( ( temp void)
+0:61    Function Parameters: 
+0:?     Sequence
+0:61      move second child to first child ( temp 3-element array of structure{ temp 3-component vector of float PositionWS,  temp 3-component vector of float NormalWS})
+0:?         'patch' ( temp 3-element array of structure{ temp 3-component vector of float PositionWS,  temp 3-component vector of float NormalWS})
+0:?         'patch' (layout( location=0) in 3-element array of structure{ temp 3-component vector of float PositionWS,  temp 3-component vector of float NormalWS})
+0:61      move second child to first child ( temp uint)
+0:?         'id' ( temp uint)
+0:?         'id' ( in uint InvocationID)
+0:61      move second child to first child ( temp structure{ temp 3-component vector of float PositionWS})
+0:61        indirect index (layout( location=0) out structure{ temp 3-component vector of float PositionWS})
+0:?           '@entryPointOutput' (layout( location=0) out 3-element array of structure{ temp 3-component vector of float PositionWS})
+0:?           'id' ( in uint InvocationID)
+0:61        Function Call: @HSMain(struct-HSInput-vf3-vf31[3];u1; ( temp structure{ temp 3-component vector of float PositionWS})
+0:?           'patch' ( temp 3-element array of structure{ temp 3-component vector of float PositionWS,  temp 3-component vector of float NormalWS})
+0:?           'id' ( temp uint)
+0:?       Barrier ( temp void)
+0:?       Test condition and select ( temp void)
+0:?         Condition
+0:?         Compare Equal ( temp bool)
+0:?           'id' ( in uint InvocationID)
+0:?           Constant:
+0:?             0 (const int)
+0:?         true case
+0:?         Sequence
+0:?           move second child to first child ( temp structure{ temp 3-element array of float EdgeTessFactor,  temp float InsideTessFactor,  temp 3-element array of 3-component vector of float NormalWS})
+0:?             '@patchConstantResult' ( temp structure{ temp 3-element array of float EdgeTessFactor,  temp float InsideTessFactor,  temp 3-element array of 3-component vector of float NormalWS})
+0:?             Function Call: HSPatchConstant(struct-HSInput-vf3-vf31[3]; ( temp structure{ temp 3-element array of float EdgeTessFactor,  temp float InsideTessFactor,  temp 3-element array of 3-component vector of float NormalWS})
+0:?               'patch' ( temp 3-element array of structure{ temp 3-component vector of float PositionWS,  temp 3-component vector of float NormalWS})
+0:?           Sequence
+0:?             move second child to first child ( temp float)
+0:?               direct index ( patch out float TessLevelOuter)
+0:?                 '@patchConstantOutput.EdgeTessFactor' ( patch out 4-element array of float TessLevelOuter)
+0:?                 Constant:
+0:?                   0 (const int)
+0:?               direct index ( temp float)
+0:?                 EdgeTessFactor: direct index for structure ( temp 3-element array of float)
+0:?                   '@patchConstantResult' ( temp structure{ temp 3-element array of float EdgeTessFactor,  temp float InsideTessFactor,  temp 3-element array of 3-component vector of float NormalWS})
+0:?                   Constant:
+0:?                     0 (const int)
+0:?                 Constant:
+0:?                   0 (const int)
+0:?             move second child to first child ( temp float)
+0:?               direct index ( patch out float TessLevelOuter)
+0:?                 '@patchConstantOutput.EdgeTessFactor' ( patch out 4-element array of float TessLevelOuter)
+0:?                 Constant:
+0:?                   1 (const int)
+0:?               direct index ( temp float)
+0:?                 EdgeTessFactor: direct index for structure ( temp 3-element array of float)
+0:?                   '@patchConstantResult' ( temp structure{ temp 3-element array of float EdgeTessFactor,  temp float InsideTessFactor,  temp 3-element array of 3-component vector of float NormalWS})
+0:?                   Constant:
+0:?                     0 (const int)
+0:?                 Constant:
+0:?                   1 (const int)
+0:?             move second child to first child ( temp float)
+0:?               direct index ( patch out float TessLevelOuter)
+0:?                 '@patchConstantOutput.EdgeTessFactor' ( patch out 4-element array of float TessLevelOuter)
+0:?                 Constant:
+0:?                   2 (const int)
+0:?               direct index ( temp float)
+0:?                 EdgeTessFactor: direct index for structure ( temp 3-element array of float)
+0:?                   '@patchConstantResult' ( temp structure{ temp 3-element array of float EdgeTessFactor,  temp float InsideTessFactor,  temp 3-element array of 3-component vector of float NormalWS})
+0:?                   Constant:
+0:?                     0 (const int)
+0:?                 Constant:
+0:?                   2 (const int)
+0:?             move second child to first child ( temp float)
+0:?               direct index ( patch out float TessLevelInner)
+0:?                 '@patchConstantOutput.InsideTessFactor' ( patch out 2-element array of float TessLevelInner)
+0:?                 Constant:
+0:?                   0 (const int)
+0:?               InsideTessFactor: direct index for structure ( temp float)
+0:?                 '@patchConstantResult' ( temp structure{ temp 3-element array of float EdgeTessFactor,  temp float InsideTessFactor,  temp 3-element array of 3-component vector of float NormalWS})
+0:?                 Constant:
+0:?                   1 (const int)
+0:?             move second child to first child ( temp 3-element array of 3-component vector of float)
+0:?               NormalWS: direct index for structure ( temp 3-element array of 3-component vector of float)
+0:?                 '@patchConstantOutput' (layout( location=1) patch out structure{ temp 3-element array of 3-component vector of float NormalWS})
+0:?                 Constant:
+0:?                   0 (const int)
+0:?               NormalWS: direct index for structure ( temp 3-element array of 3-component vector of float)
+0:?                 '@patchConstantResult' ( temp structure{ temp 3-element array of float EdgeTessFactor,  temp float InsideTessFactor,  temp 3-element array of 3-component vector of float NormalWS})
+0:?                 Constant:
+0:?                   2 (const int)
+0:84  Function Definition: GSMain(struct-GSVertexInput-vf3-vf31[3];struct-GSVertexOutput-vf41; ( temp void)
+0:84    Function Parameters: 
+0:84      'input' ( in 3-element array of structure{ temp 3-component vector of float PositionWS,  temp 3-component vector of float NormalWS})
+0:84      'output' ( out structure{ temp 4-component vector of float PositionCS})
+0:?     Sequence
+0:86      Sequence
+0:86        move second child to first child ( temp 3-component vector of float)
+0:86          'P0' ( temp 3-component vector of float)
+0:86          vector swizzle ( temp 3-component vector of float)
+0:86            PositionWS: direct index for structure ( temp 3-component vector of float)
+0:86              direct index ( temp structure{ temp 3-component vector of float PositionWS,  temp 3-component vector of float NormalWS})
+0:86                'input' ( in 3-element array of structure{ temp 3-component vector of float PositionWS,  temp 3-component vector of float NormalWS})
+0:86                Constant:
+0:86                  0 (const int)
+0:86              Constant:
+0:86                0 (const int)
+0:86            Sequence
+0:86              Constant:
+0:86                0 (const int)
+0:86              Constant:
+0:86                1 (const int)
+0:86              Constant:
+0:86                2 (const int)
+0:87      Sequence
+0:87        move second child to first child ( temp 3-component vector of float)
+0:87          'P1' ( temp 3-component vector of float)
+0:87          vector swizzle ( temp 3-component vector of float)
+0:87            PositionWS: direct index for structure ( temp 3-component vector of float)
+0:87              direct index ( temp structure{ temp 3-component vector of float PositionWS,  temp 3-component vector of float NormalWS})
+0:87                'input' ( in 3-element array of structure{ temp 3-component vector of float PositionWS,  temp 3-component vector of float NormalWS})
+0:87                Constant:
+0:87                  1 (const int)
+0:87              Constant:
+0:87                0 (const int)
+0:87            Sequence
+0:87              Constant:
+0:87                0 (const int)
+0:87              Constant:
+0:87                1 (const int)
+0:87              Constant:
+0:87                2 (const int)
+0:88      Sequence
+0:88        move second child to first child ( temp 3-component vector of float)
+0:88          'P2' ( temp 3-component vector of float)
+0:88          vector swizzle ( temp 3-component vector of float)
+0:88            PositionWS: direct index for structure ( temp 3-component vector of float)
+0:88              direct index ( temp structure{ temp 3-component vector of float PositionWS,  temp 3-component vector of float NormalWS})
+0:88                'input' ( in 3-element array of structure{ temp 3-component vector of float PositionWS,  temp 3-component vector of float NormalWS})
+0:88                Constant:
+0:88                  2 (const int)
+0:88              Constant:
+0:88                0 (const int)
+0:88            Sequence
+0:88              Constant:
+0:88                0 (const int)
+0:88              Constant:
+0:88                1 (const int)
+0:88              Constant:
+0:88                2 (const int)
+0:92      add second child into first child ( temp float)
+0:92        direct index ( temp float)
+0:92          'P0' ( temp 3-component vector of float)
+0:92          Constant:
+0:92            2 (const int)
+0:92        Constant:
+0:92          0.001000
+0:93      add second child into first child ( temp float)
+0:93        direct index ( temp float)
+0:93          'P1' ( temp 3-component vector of float)
+0:93          Constant:
+0:93            2 (const int)
+0:93        Constant:
+0:93          0.001000
+0:94      add second child into first child ( temp float)
+0:94        direct index ( temp float)
+0:94          'P2' ( temp 3-component vector of float)
+0:94          Constant:
+0:94            2 (const int)
+0:94        Constant:
+0:94          0.001000
+0:95      Sequence
+0:95        move second child to first child ( temp 4-component vector of float)
+0:95          'Q0' ( temp 4-component vector of float)
+0:95          vector-times-matrix ( temp 4-component vector of float)
+0:?             Construct vec4 ( temp 4-component vector of float)
+0:95              'P0' ( temp 3-component vector of float)
+0:95              Constant:
+0:95                1.000000
+0:95            proj_matrix: direct index for structure (layout( row_major std140) uniform 4X4 matrix of float)
+0:95              'anon@0' (layout( binding=0 row_major std140) uniform block{layout( row_major std140) uniform 4X4 matrix of float model_view_matrix, layout( row_major std140) uniform 4X4 matrix of float proj_matrix, layout( row_major std140) uniform 4X4 matrix of float model_view_proj_matrix, layout( row_major std140) uniform 3X3 matrix of float normal_matrix, layout( row_major std140) uniform 3-component vector of float color, layout( row_major std140) uniform 3-component vector of float view_dir, layout( row_major std140) uniform 3-component vector of float tess_factor})
+0:95              Constant:
+0:95                1 (const uint)
+0:96      Sequence
+0:96        move second child to first child ( temp 4-component vector of float)
+0:96          'Q1' ( temp 4-component vector of float)
+0:96          vector-times-matrix ( temp 4-component vector of float)
+0:?             Construct vec4 ( temp 4-component vector of float)
+0:96              'P1' ( temp 3-component vector of float)
+0:96              Constant:
+0:96                1.000000
+0:96            proj_matrix: direct index for structure (layout( row_major std140) uniform 4X4 matrix of float)
+0:96              'anon@0' (layout( binding=0 row_major std140) uniform block{layout( row_major std140) uniform 4X4 matrix of float model_view_matrix, layout( row_major std140) uniform 4X4 matrix of float proj_matrix, layout( row_major std140) uniform 4X4 matrix of float model_view_proj_matrix, layout( row_major std140) uniform 3X3 matrix of float normal_matrix, layout( row_major std140) uniform 3-component vector of float color, layout( row_major std140) uniform 3-component vector of float view_dir, layout( row_major std140) uniform 3-component vector of float tess_factor})
+0:96              Constant:
+0:96                1 (const uint)
+0:97      Sequence
+0:97        move second child to first child ( temp 4-component vector of float)
+0:97          'Q2' ( temp 4-component vector of float)
+0:97          vector-times-matrix ( temp 4-component vector of float)
+0:?             Construct vec4 ( temp 4-component vector of float)
+0:97              'P2' ( temp 3-component vector of float)
+0:97              Constant:
+0:97                1.000000
+0:97            proj_matrix: direct index for structure (layout( row_major std140) uniform 4X4 matrix of float)
+0:97              'anon@0' (layout( binding=0 row_major std140) uniform block{layout( row_major std140) uniform 4X4 matrix of float model_view_matrix, layout( row_major std140) uniform 4X4 matrix of float proj_matrix, layout( row_major std140) uniform 4X4 matrix of float model_view_proj_matrix, layout( row_major std140) uniform 3X3 matrix of float normal_matrix, layout( row_major std140) uniform 3-component vector of float color, layout( row_major std140) uniform 3-component vector of float view_dir, layout( row_major std140) uniform 3-component vector of float tess_factor})
+0:97              Constant:
+0:97                1 (const uint)
+0:100      move second child to first child ( temp 4-component vector of float)
+0:100        PositionCS: direct index for structure ( temp 4-component vector of float)
+0:100          'vertex' ( temp structure{ temp 4-component vector of float PositionCS})
+0:100          Constant:
+0:100            0 (const int)
+0:100        'Q0' ( temp 4-component vector of float)
+0:101      Constant:
+0:101        0.000000
+0:102      move second child to first child ( temp 4-component vector of float)
+0:102        PositionCS: direct index for structure ( temp 4-component vector of float)
+0:102          'vertex' ( temp structure{ temp 4-component vector of float PositionCS})
+0:102          Constant:
+0:102            0 (const int)
+0:102        'Q1' ( temp 4-component vector of float)
+0:103      Constant:
+0:103        0.000000
+0:104      Constant:
+0:104        0.000000
+0:107      move second child to first child ( temp 4-component vector of float)
+0:107        PositionCS: direct index for structure ( temp 4-component vector of float)
+0:107          'vertex' ( temp structure{ temp 4-component vector of float PositionCS})
+0:107          Constant:
+0:107            0 (const int)
+0:107        'Q1' ( temp 4-component vector of float)
+0:108      Constant:
+0:108        0.000000
+0:109      move second child to first child ( temp 4-component vector of float)
+0:109        PositionCS: direct index for structure ( temp 4-component vector of float)
+0:109          'vertex' ( temp structure{ temp 4-component vector of float PositionCS})
+0:109          Constant:
+0:109            0 (const int)
+0:109        'Q2' ( temp 4-component vector of float)
+0:110      Constant:
+0:110        0.000000
+0:111      Constant:
+0:111        0.000000
+0:114      move second child to first child ( temp 4-component vector of float)
+0:114        PositionCS: direct index for structure ( temp 4-component vector of float)
+0:114          'vertex' ( temp structure{ temp 4-component vector of float PositionCS})
+0:114          Constant:
+0:114            0 (const int)
+0:114        'Q2' ( temp 4-component vector of float)
+0:115      Constant:
+0:115        0.000000
+0:116      move second child to first child ( temp 4-component vector of float)
+0:116        PositionCS: direct index for structure ( temp 4-component vector of float)
+0:116          'vertex' ( temp structure{ temp 4-component vector of float PositionCS})
+0:116          Constant:
+0:116            0 (const int)
+0:116        'Q0' ( temp 4-component vector of float)
+0:117      Constant:
+0:117        0.000000
+0:118      Constant:
+0:118        0.000000
+0:?   Linker Objects
+0:?     'anon@0' (layout( binding=0 row_major std140) uniform block{layout( row_major std140) uniform 4X4 matrix of float model_view_matrix, layout( row_major std140) uniform 4X4 matrix of float proj_matrix, layout( row_major std140) uniform 4X4 matrix of float model_view_proj_matrix, layout( row_major std140) uniform 3X3 matrix of float normal_matrix, layout( row_major std140) uniform 3-component vector of float color, layout( row_major std140) uniform 3-component vector of float view_dir, layout( row_major std140) uniform 3-component vector of float tess_factor})
+0:?     '@entryPointOutput' (layout( location=0) out 3-element array of structure{ temp 3-component vector of float PositionWS})
+0:?     'patch' (layout( location=0) in 3-element array of structure{ temp 3-component vector of float PositionWS,  temp 3-component vector of float NormalWS})
+0:?     'id' ( in uint InvocationID)
+0:?     '@patchConstantOutput.EdgeTessFactor' ( patch out 4-element array of float TessLevelOuter)
+0:?     '@patchConstantOutput.InsideTessFactor' ( patch out 2-element array of float TessLevelInner)
+0:?     '@patchConstantOutput' (layout( location=1) patch out structure{ temp 3-element array of 3-component vector of float NormalWS})
+
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 216
+
+                              Capability Tessellation
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint TessellationControl 4  "HSMain" 97 101 105 126 139 145
+                              ExecutionMode 4 OutputVertices 3
+                              ExecutionMode 4 Triangles
+                              ExecutionMode 4 SpacingFractionalOdd
+                              ExecutionMode 4 VertexOrderCcw
+                              Source HLSL 500
+                              Name 4  "HSMain"
+                              Name 8  "HSInput"
+                              MemberName 8(HSInput) 0  "PositionWS"
+                              MemberName 8(HSInput) 1  "NormalWS"
+                              Name 15  "HSTrianglePatchConstant"
+                              MemberName 15(HSTrianglePatchConstant) 0  "EdgeTessFactor"
+                              MemberName 15(HSTrianglePatchConstant) 1  "InsideTessFactor"
+                              MemberName 15(HSTrianglePatchConstant) 2  "NormalWS"
+                              Name 18  "HSPatchConstant(struct-HSInput-vf3-vf31[3];"
+                              Name 17  "patch"
+                              Name 21  "HSOutput"
+                              MemberName 21(HSOutput) 0  "PositionWS"
+                              Name 25  "@HSMain(struct-HSInput-vf3-vf31[3];u1;"
+                              Name 23  "patch"
+                              Name 24  "id"
+                              Name 27  "GSVertexInput"
+                              MemberName 27(GSVertexInput) 0  "PositionWS"
+                              MemberName 27(GSVertexInput) 1  "NormalWS"
+                              Name 31  "GSVertexOutput"
+                              MemberName 31(GSVertexOutput) 0  "PositionCS"
+                              Name 36  "GSMain(struct-GSVertexInput-vf3-vf31[3];struct-GSVertexOutput-vf41;"
+                              Name 34  "input"
+                              Name 35  "output"
+                              Name 39  "roundedEdgeTessFactor"
+                              Name 42  "UniformBlock0"
+                              MemberName 42(UniformBlock0) 0  "model_view_matrix"
+                              MemberName 42(UniformBlock0) 1  "proj_matrix"
+                              MemberName 42(UniformBlock0) 2  "model_view_proj_matrix"
+                              MemberName 42(UniformBlock0) 3  "normal_matrix"
+                              MemberName 42(UniformBlock0) 4  "color"
+                              MemberName 42(UniformBlock0) 5  "view_dir"
+                              MemberName 42(UniformBlock0) 6  "tess_factor"
+                              Name 44  ""
+                              Name 51  "roundedInsideTessFactor"
+                              Name 53  "insideTessFactor"
+                              Name 56  "result"
+                              Name 87  "output"
+                              Name 95  "patch"
+                              Name 97  "patch"
+                              Name 99  "id"
+                              Name 101  "id"
+                              Name 105  "@entryPointOutput"
+                              Name 107  "param"
+                              Name 109  "param"
+                              Name 120  "@patchConstantResult"
+                              Name 121  "param"
+                              Name 126  "@patchConstantOutput.EdgeTessFactor"
+                              Name 139  "@patchConstantOutput.InsideTessFactor"
+                              Name 143  "HSTrianglePatchConstant"
+                              MemberName 143(HSTrianglePatchConstant) 0  "NormalWS"
+                              Name 145  "@patchConstantOutput"
+                              Name 151  "P0"
+                              Name 154  "P1"
+                              Name 157  "P2"
+                              Name 174  "Q0"
+                              Name 184  "Q1"
+                              Name 193  "Q2"
+                              Name 202  "vertex"
+                              MemberDecorate 42(UniformBlock0) 0 RowMajor
+                              MemberDecorate 42(UniformBlock0) 0 Offset 0
+                              MemberDecorate 42(UniformBlock0) 0 MatrixStride 16
+                              MemberDecorate 42(UniformBlock0) 1 RowMajor
+                              MemberDecorate 42(UniformBlock0) 1 Offset 64
+                              MemberDecorate 42(UniformBlock0) 1 MatrixStride 16
+                              MemberDecorate 42(UniformBlock0) 2 RowMajor
+                              MemberDecorate 42(UniformBlock0) 2 Offset 128
+                              MemberDecorate 42(UniformBlock0) 2 MatrixStride 16
+                              MemberDecorate 42(UniformBlock0) 3 RowMajor
+                              MemberDecorate 42(UniformBlock0) 3 Offset 192
+                              MemberDecorate 42(UniformBlock0) 3 MatrixStride 16
+                              MemberDecorate 42(UniformBlock0) 4 Offset 240
+                              MemberDecorate 42(UniformBlock0) 5 Offset 256
+                              MemberDecorate 42(UniformBlock0) 6 Offset 272
+                              Decorate 42(UniformBlock0) Block
+                              Decorate 44 DescriptorSet 0
+                              Decorate 44 Binding 0
+                              Decorate 97(patch) Location 0
+                              Decorate 101(id) BuiltIn InvocationId
+                              Decorate 105(@entryPointOutput) Location 0
+                              Decorate 126(@patchConstantOutput.EdgeTessFactor) Patch
+                              Decorate 126(@patchConstantOutput.EdgeTessFactor) BuiltIn TessLevelOuter
+                              Decorate 139(@patchConstantOutput.InsideTessFactor) Patch
+                              Decorate 139(@patchConstantOutput.InsideTessFactor) BuiltIn TessLevelInner
+                              MemberDecorate 143(HSTrianglePatchConstant) 0 Patch
+                              Decorate 145(@patchConstantOutput) Patch
+                              Decorate 145(@patchConstantOutput) Location 1
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 3
+      8(HSInput):             TypeStruct 7(fvec3) 7(fvec3)
+               9:             TypeInt 32 0
+              10:      9(int) Constant 3
+              11:             TypeArray 8(HSInput) 10
+              12:             TypePointer Function 11
+              13:             TypeArray 6(float) 10
+              14:             TypeArray 7(fvec3) 10
+15(HSTrianglePatchConstant):             TypeStruct 13 6(float) 14
+              16:             TypeFunction 15(HSTrianglePatchConstant) 12(ptr)
+              20:             TypePointer Function 9(int)
+    21(HSOutput):             TypeStruct 7(fvec3)
+              22:             TypeFunction 21(HSOutput) 12(ptr) 20(ptr)
+27(GSVertexInput):             TypeStruct 7(fvec3) 7(fvec3)
+              28:             TypeArray 27(GSVertexInput) 10
+              29:             TypePointer Function 28
+              30:             TypeVector 6(float) 4
+31(GSVertexOutput):             TypeStruct 30(fvec4)
+              32:             TypePointer Function 31(GSVertexOutput)
+              33:             TypeFunction 2 29(ptr) 32(ptr)
+              38:             TypePointer Function 7(fvec3)
+              40:             TypeMatrix 30(fvec4) 4
+              41:             TypeMatrix 7(fvec3) 3
+42(UniformBlock0):             TypeStruct 40 40 40 41 7(fvec3) 7(fvec3) 7(fvec3)
+              43:             TypePointer Uniform 42(UniformBlock0)
+              44:     43(ptr) Variable Uniform
+              45:             TypeInt 32 1
+              46:     45(int) Constant 6
+              47:             TypePointer Uniform 7(fvec3)
+              50:             TypePointer Function 6(float)
+              52:    6(float) Constant 1077936128
+              54:    6(float) Constant 1065353216
+              55:             TypePointer Function 15(HSTrianglePatchConstant)
+              57:     45(int) Constant 0
+              58:      9(int) Constant 0
+              62:     45(int) Constant 1
+              63:      9(int) Constant 1
+              67:     45(int) Constant 2
+              68:      9(int) Constant 2
+              86:             TypePointer Function 21(HSOutput)
+              96:             TypePointer Input 11
+       97(patch):     96(ptr) Variable Input
+             100:             TypePointer Input 9(int)
+         101(id):    100(ptr) Variable Input
+             103:             TypeArray 21(HSOutput) 10
+             104:             TypePointer Output 103
+105(@entryPointOutput):    104(ptr) Variable Output
+             112:             TypePointer Output 21(HSOutput)
+             114:      9(int) Constant 4
+             116:             TypeBool
+             124:             TypeArray 6(float) 114
+             125:             TypePointer Output 124
+126(@patchConstantOutput.EdgeTessFactor):    125(ptr) Variable Output
+             129:             TypePointer Output 6(float)
+             137:             TypeArray 6(float) 68
+             138:             TypePointer Output 137
+139(@patchConstantOutput.InsideTessFactor):    138(ptr) Variable Output
+143(HSTrianglePatchConstant):             TypeStruct 14
+             144:             TypePointer Output 143(HSTrianglePatchConstant)
+145(@patchConstantOutput):    144(ptr) Variable Output
+             146:             TypePointer Function 14
+             149:             TypePointer Output 14
+             160:    6(float) Constant 981668463
+             173:             TypePointer Function 30(fvec4)
+             180:             TypePointer Uniform 40
+             205:    6(float) Constant 0
+       4(HSMain):           2 Function None 3
+               5:             Label
+       95(patch):     12(ptr) Variable Function
+          99(id):     20(ptr) Variable Function
+      107(param):     12(ptr) Variable Function
+      109(param):     20(ptr) Variable Function
+120(@patchConstantResult):     55(ptr) Variable Function
+      121(param):     12(ptr) Variable Function
+              98:          11 Load 97(patch)
+                              Store 95(patch) 98
+             102:      9(int) Load 101(id)
+                              Store 99(id) 102
+             106:      9(int) Load 101(id)
+             108:          11 Load 95(patch)
+                              Store 107(param) 108
+             110:      9(int) Load 99(id)
+                              Store 109(param) 110
+             111:21(HSOutput) FunctionCall 25(@HSMain(struct-HSInput-vf3-vf31[3];u1;) 107(param) 109(param)
+             113:    112(ptr) AccessChain 105(@entryPointOutput) 106
+                              Store 113 111
+                              ControlBarrier 68 114 58
+             115:      9(int) Load 101(id)
+             117:   116(bool) IEqual 115 57
+                              SelectionMerge 119 None
+                              BranchConditional 117 118 119
+             118:               Label
+             122:          11   Load 95(patch)
+                                Store 121(param) 122
+             123:15(HSTrianglePatchConstant)   FunctionCall 18(HSPatchConstant(struct-HSInput-vf3-vf31[3];) 121(param)
+                                Store 120(@patchConstantResult) 123
+             127:     50(ptr)   AccessChain 120(@patchConstantResult) 57 57
+             128:    6(float)   Load 127
+             130:    129(ptr)   AccessChain 126(@patchConstantOutput.EdgeTessFactor) 57
+                                Store 130 128
+             131:     50(ptr)   AccessChain 120(@patchConstantResult) 57 62
+             132:    6(float)   Load 131
+             133:    129(ptr)   AccessChain 126(@patchConstantOutput.EdgeTessFactor) 62
+                                Store 133 132
+             134:     50(ptr)   AccessChain 120(@patchConstantResult) 57 67
+             135:    6(float)   Load 134
+             136:    129(ptr)   AccessChain 126(@patchConstantOutput.EdgeTessFactor) 67
+                                Store 136 135
+             140:     50(ptr)   AccessChain 120(@patchConstantResult) 62
+             141:    6(float)   Load 140
+             142:    129(ptr)   AccessChain 139(@patchConstantOutput.InsideTessFactor) 57
+                                Store 142 141
+             147:    146(ptr)   AccessChain 120(@patchConstantResult) 67
+             148:          14   Load 147
+             150:    149(ptr)   AccessChain 145(@patchConstantOutput) 57
+                                Store 150 148
+                                Branch 119
+             119:             Label
+                              Return
+                              FunctionEnd
+18(HSPatchConstant(struct-HSInput-vf3-vf31[3];):15(HSTrianglePatchConstant) Function None 16
+       17(patch):     12(ptr) FunctionParameter
+              19:             Label
+39(roundedEdgeTessFactor):     38(ptr) Variable Function
+51(roundedInsideTessFactor):     50(ptr) Variable Function
+53(insideTessFactor):     50(ptr) Variable Function
+      56(result):     55(ptr) Variable Function
+              48:     47(ptr) AccessChain 44 46
+              49:    7(fvec3) Load 48
+                              Store 39(roundedEdgeTessFactor) 49
+                              Store 51(roundedInsideTessFactor) 52
+                              Store 53(insideTessFactor) 54
+              59:     50(ptr) AccessChain 39(roundedEdgeTessFactor) 58
+              60:    6(float) Load 59
+              61:     50(ptr) AccessChain 56(result) 57 57
+                              Store 61 60
+              64:     50(ptr) AccessChain 39(roundedEdgeTessFactor) 63
+              65:    6(float) Load 64
+              66:     50(ptr) AccessChain 56(result) 57 62
+                              Store 66 65
+              69:     50(ptr) AccessChain 39(roundedEdgeTessFactor) 68
+              70:    6(float) Load 69
+              71:     50(ptr) AccessChain 56(result) 57 67
+                              Store 71 70
+              72:    6(float) Load 51(roundedInsideTessFactor)
+              73:     50(ptr) AccessChain 56(result) 62
+                              Store 73 72
+              74:     38(ptr) AccessChain 17(patch) 57 62
+              75:    7(fvec3) Load 74
+              76:     38(ptr) AccessChain 56(result) 67 57
+                              Store 76 75
+              77:     38(ptr) AccessChain 17(patch) 62 62
+              78:    7(fvec3) Load 77
+              79:     38(ptr) AccessChain 56(result) 67 62
+                              Store 79 78
+              80:     38(ptr) AccessChain 17(patch) 67 62
+              81:    7(fvec3) Load 80
+              82:     38(ptr) AccessChain 56(result) 67 67
+                              Store 82 81
+              83:15(HSTrianglePatchConstant) Load 56(result)
+                              ReturnValue 83
+                              FunctionEnd
+25(@HSMain(struct-HSInput-vf3-vf31[3];u1;):21(HSOutput) Function None 22
+       23(patch):     12(ptr) FunctionParameter
+          24(id):     20(ptr) FunctionParameter
+              26:             Label
+      87(output):     86(ptr) Variable Function
+              88:      9(int) Load 24(id)
+              89:     38(ptr) AccessChain 23(patch) 88 57
+              90:    7(fvec3) Load 89
+              91:     38(ptr) AccessChain 87(output) 57
+                              Store 91 90
+              92:21(HSOutput) Load 87(output)
+                              ReturnValue 92
+                              FunctionEnd
+36(GSMain(struct-GSVertexInput-vf3-vf31[3];struct-GSVertexOutput-vf41;):           2 Function None 33
+       34(input):     29(ptr) FunctionParameter
+      35(output):     32(ptr) FunctionParameter
+              37:             Label
+         151(P0):     38(ptr) Variable Function
+         154(P1):     38(ptr) Variable Function
+         157(P2):     38(ptr) Variable Function
+         174(Q0):    173(ptr) Variable Function
+         184(Q1):    173(ptr) Variable Function
+         193(Q2):    173(ptr) Variable Function
+     202(vertex):     32(ptr) Variable Function
+             152:     38(ptr) AccessChain 34(input) 57 57
+             153:    7(fvec3) Load 152
+                              Store 151(P0) 153
+             155:     38(ptr) AccessChain 34(input) 62 57
+             156:    7(fvec3) Load 155
+                              Store 154(P1) 156
+             158:     38(ptr) AccessChain 34(input) 67 57
+             159:    7(fvec3) Load 158
+                              Store 157(P2) 159
+             161:     50(ptr) AccessChain 151(P0) 68
+             162:    6(float) Load 161
+             163:    6(float) FAdd 162 160
+             164:     50(ptr) AccessChain 151(P0) 68
+                              Store 164 163
+             165:     50(ptr) AccessChain 154(P1) 68
+             166:    6(float) Load 165
+             167:    6(float) FAdd 166 160
+             168:     50(ptr) AccessChain 154(P1) 68
+                              Store 168 167
+             169:     50(ptr) AccessChain 157(P2) 68
+             170:    6(float) Load 169
+             171:    6(float) FAdd 170 160
+             172:     50(ptr) AccessChain 157(P2) 68
+                              Store 172 171
+             175:    7(fvec3) Load 151(P0)
+             176:    6(float) CompositeExtract 175 0
+             177:    6(float) CompositeExtract 175 1
+             178:    6(float) CompositeExtract 175 2
+             179:   30(fvec4) CompositeConstruct 176 177 178 54
+             181:    180(ptr) AccessChain 44 62
+             182:          40 Load 181
+             183:   30(fvec4) VectorTimesMatrix 179 182
+                              Store 174(Q0) 183
+             185:    7(fvec3) Load 154(P1)
+             186:    6(float) CompositeExtract 185 0
+             187:    6(float) CompositeExtract 185 1
+             188:    6(float) CompositeExtract 185 2
+             189:   30(fvec4) CompositeConstruct 186 187 188 54
+             190:    180(ptr) AccessChain 44 62
+             191:          40 Load 190
+             192:   30(fvec4) VectorTimesMatrix 189 191
+                              Store 184(Q1) 192
+             194:    7(fvec3) Load 157(P2)
+             195:    6(float) CompositeExtract 194 0
+             196:    6(float) CompositeExtract 194 1
+             197:    6(float) CompositeExtract 194 2
+             198:   30(fvec4) CompositeConstruct 195 196 197 54
+             199:    180(ptr) AccessChain 44 62
+             200:          40 Load 199
+             201:   30(fvec4) VectorTimesMatrix 198 200
+                              Store 193(Q2) 201
+             203:   30(fvec4) Load 174(Q0)
+             204:    173(ptr) AccessChain 202(vertex) 57
+                              Store 204 203
+             206:   30(fvec4) Load 184(Q1)
+             207:    173(ptr) AccessChain 202(vertex) 57
+                              Store 207 206
+             208:   30(fvec4) Load 184(Q1)
+             209:    173(ptr) AccessChain 202(vertex) 57
+                              Store 209 208
+             210:   30(fvec4) Load 193(Q2)
+             211:    173(ptr) AccessChain 202(vertex) 57
+                              Store 211 210
+             212:   30(fvec4) Load 193(Q2)
+             213:    173(ptr) AccessChain 202(vertex) 57
+                              Store 213 212
+             214:   30(fvec4) Load 174(Q0)
+             215:    173(ptr) AccessChain 202(vertex) 57
+                              Store 215 214
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/hlsl.hlslOffset.vert.out b/Test/baseResults/hlsl.hlslOffset.vert.out
index dcd8027..8393d83 100644
--- a/Test/baseResults/hlsl.hlslOffset.vert.out
+++ b/Test/baseResults/hlsl.hlslOffset.vert.out
@@ -26,7 +26,7 @@
 0:?     'anon@0' (layout( row_major std140) uniform block{layout( row_major std140) uniform float m0, layout( row_major std140) uniform 3-component vector of float m4, layout( row_major std140) uniform float m16, layout( row_major std140 offset=20) uniform 3-component vector of float m20, layout( row_major std140 offset=36) uniform 3-component vector of float m36, layout( row_major std140 offset=56) uniform 2-component vector of float m56, layout( row_major std140) uniform float m64, layout( row_major std140) uniform 2-component vector of float m68, layout( row_major std140) uniform float m76, layout( row_major std140) uniform float m80, layout( row_major std140) uniform 1-element array of 2-component vector of float m96})
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 18
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.hull.1.tesc.out b/Test/baseResults/hlsl.hull.1.tesc.out
index 3e1ad58..1be1498 100644
--- a/Test/baseResults/hlsl.hull.1.tesc.out
+++ b/Test/baseResults/hlsl.hull.1.tesc.out
@@ -32,7 +32,7 @@
 0:?         'm_cpid' ( temp uint)
 0:?         'm_cpid' ( in uint InvocationID)
 0:26      move second child to first child ( temp structure{ temp 3-component vector of float cpoint})
-0:26        indirect index ( temp structure{ temp 3-component vector of float cpoint})
+0:26        indirect index (layout( location=0) out structure{ temp 3-component vector of float cpoint})
 0:?           '@entryPointOutput' (layout( location=0) out 4-element array of structure{ temp 3-component vector of float cpoint})
 0:?           'm_cpid' ( in uint InvocationID)
 0:26        Function Call: @main(struct-VS_OUT-vf31[4];u1; ( temp structure{ temp 3-component vector of float cpoint})
@@ -54,7 +54,7 @@
 0:?           Sequence
 0:?             move second child to first child ( temp float)
 0:?               direct index ( patch out float TessLevelOuter)
-0:?                 '@patchConstantOutput_edges' ( patch out 4-element array of float TessLevelOuter)
+0:?                 '@patchConstantOutput.edges' ( patch out 4-element array of float TessLevelOuter)
 0:?                 Constant:
 0:?                   0 (const int)
 0:?               direct index ( temp float)
@@ -66,7 +66,7 @@
 0:?                   0 (const int)
 0:?             move second child to first child ( temp float)
 0:?               direct index ( patch out float TessLevelOuter)
-0:?                 '@patchConstantOutput_edges' ( patch out 4-element array of float TessLevelOuter)
+0:?                 '@patchConstantOutput.edges' ( patch out 4-element array of float TessLevelOuter)
 0:?                 Constant:
 0:?                   1 (const int)
 0:?               direct index ( temp float)
@@ -107,8 +107,7 @@
 0:?     'ip' (layout( location=0) in 4-element array of structure{ temp 3-component vector of float cpoint})
 0:?     'm_cpid' ( in uint InvocationID)
 0:?     'pid' ( in uint PrimitiveID)
-0:?     '@patchConstantOutput' (layout( location=1) patch out structure{})
-0:?     '@patchConstantOutput_edges' ( patch out 4-element array of float TessLevelOuter)
+0:?     '@patchConstantOutput.edges' ( patch out 4-element array of float TessLevelOuter)
 
 
 Linked tessellation control stage:
@@ -147,7 +146,7 @@
 0:?         'm_cpid' ( temp uint)
 0:?         'm_cpid' ( in uint InvocationID)
 0:26      move second child to first child ( temp structure{ temp 3-component vector of float cpoint})
-0:26        indirect index ( temp structure{ temp 3-component vector of float cpoint})
+0:26        indirect index (layout( location=0) out structure{ temp 3-component vector of float cpoint})
 0:?           '@entryPointOutput' (layout( location=0) out 4-element array of structure{ temp 3-component vector of float cpoint})
 0:?           'm_cpid' ( in uint InvocationID)
 0:26        Function Call: @main(struct-VS_OUT-vf31[4];u1; ( temp structure{ temp 3-component vector of float cpoint})
@@ -169,7 +168,7 @@
 0:?           Sequence
 0:?             move second child to first child ( temp float)
 0:?               direct index ( patch out float TessLevelOuter)
-0:?                 '@patchConstantOutput_edges' ( patch out 4-element array of float TessLevelOuter)
+0:?                 '@patchConstantOutput.edges' ( patch out 4-element array of float TessLevelOuter)
 0:?                 Constant:
 0:?                   0 (const int)
 0:?               direct index ( temp float)
@@ -181,7 +180,7 @@
 0:?                   0 (const int)
 0:?             move second child to first child ( temp float)
 0:?               direct index ( patch out float TessLevelOuter)
-0:?                 '@patchConstantOutput_edges' ( patch out 4-element array of float TessLevelOuter)
+0:?                 '@patchConstantOutput.edges' ( patch out 4-element array of float TessLevelOuter)
 0:?                 Constant:
 0:?                   1 (const int)
 0:?               direct index ( temp float)
@@ -222,17 +221,16 @@
 0:?     'ip' (layout( location=0) in 4-element array of structure{ temp 3-component vector of float cpoint})
 0:?     'm_cpid' ( in uint InvocationID)
 0:?     'pid' ( in uint PrimitiveID)
-0:?     '@patchConstantOutput' (layout( location=1) patch out structure{})
-0:?     '@patchConstantOutput_edges' ( patch out 4-element array of float TessLevelOuter)
+0:?     '@patchConstantOutput.edges' ( patch out 4-element array of float TessLevelOuter)
 
 // Module Version 10000
-// Generated by (magic number): 80001
-// Id's are bound by 93
+// Generated by (magic number): 80007
+// Id's are bound by 89
 
                               Capability Tessellation
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint TessellationControl 4  "main" 40 44 48 66 72 92
+                              EntryPoint TessellationControl 4  "main" 40 44 48 65 71
                               ExecutionMode 4 OutputVertices 4
                               ExecutionMode 4 Isolines
                               ExecutionMode 4 SpacingEqual
@@ -257,21 +255,17 @@
                               Name 48  "@entryPointOutput"
                               Name 50  "param"
                               Name 52  "param"
-                              Name 65  "@patchConstantResult"
-                              Name 66  "pid"
-                              Name 67  "param"
-                              Name 72  "@patchConstantOutput_edges"
-                              Name 82  "output"
-                              Name 90  "HS_CONSTANT_OUT"
-                              Name 92  "@patchConstantOutput"
+                              Name 64  "@patchConstantResult"
+                              Name 65  "pid"
+                              Name 66  "param"
+                              Name 71  "@patchConstantOutput.edges"
+                              Name 81  "output"
                               Decorate 40(ip) Location 0
                               Decorate 44(m_cpid) BuiltIn InvocationId
                               Decorate 48(@entryPointOutput) Location 0
-                              Decorate 66(pid) BuiltIn PrimitiveId
-                              Decorate 72(@patchConstantOutput_edges) Patch
-                              Decorate 72(@patchConstantOutput_edges) BuiltIn TessLevelOuter
-                              Decorate 92(@patchConstantOutput) Patch
-                              Decorate 92(@patchConstantOutput) Location 1
+                              Decorate 65(pid) BuiltIn PrimitiveId
+                              Decorate 71(@patchConstantOutput.edges) Patch
+                              Decorate 71(@patchConstantOutput.edges) BuiltIn TessLevelOuter
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -300,30 +294,26 @@
               47:             TypePointer Output 46
 48(@entryPointOutput):     47(ptr) Variable Output
               55:             TypePointer Output 14(HS_OUT)
-              57:      9(int) Constant 1
-              58:      9(int) Constant 0
-              60:             TypeBool
-              64:             TypePointer Function 22(HS_CONSTANT_OUT)
-         66(pid):     43(ptr) Variable Input
-              70:             TypeArray 6(float) 10
-              71:             TypePointer Output 70
-72(@patchConstantOutput_edges):     71(ptr) Variable Output
-              73:             TypePointer Function 6(float)
-              76:             TypePointer Output 6(float)
-              78:     29(int) Constant 1
-              83:    6(float) Constant 1073741824
-              85:    6(float) Constant 1090519040
-90(HS_CONSTANT_OUT):             TypeStruct
-              91:             TypePointer Output 90(HS_CONSTANT_OUT)
-92(@patchConstantOutput):     91(ptr) Variable Output
+              57:      9(int) Constant 0
+              59:             TypeBool
+              63:             TypePointer Function 22(HS_CONSTANT_OUT)
+         65(pid):     43(ptr) Variable Input
+              69:             TypeArray 6(float) 10
+              70:             TypePointer Output 69
+71(@patchConstantOutput.edges):     70(ptr) Variable Output
+              72:             TypePointer Function 6(float)
+              75:             TypePointer Output 6(float)
+              77:     29(int) Constant 1
+              82:    6(float) Constant 1073741824
+              84:    6(float) Constant 1090519040
          4(main):           2 Function None 3
                5:             Label
           38(ip):     12(ptr) Variable Function
       42(m_cpid):     13(ptr) Variable Function
        50(param):     12(ptr) Variable Function
        52(param):     13(ptr) Variable Function
-65(@patchConstantResult):     64(ptr) Variable Function
-       67(param):     13(ptr) Variable Function
+64(@patchConstantResult):     63(ptr) Variable Function
+       66(param):     13(ptr) Variable Function
               41:          11 Load 40(ip)
                               Store 38(ip) 41
               45:      9(int) Load 44(m_cpid)
@@ -336,26 +326,26 @@
               54:  14(HS_OUT) FunctionCall 18(@main(struct-VS_OUT-vf31[4];u1;) 50(param) 52(param)
               56:     55(ptr) AccessChain 48(@entryPointOutput) 49
                               Store 56 54
-                              ControlBarrier 20 57 58
-              59:      9(int) Load 44(m_cpid)
-              61:    60(bool) IEqual 59 30
-                              SelectionMerge 63 None
-                              BranchConditional 61 62 63
-              62:               Label
-              68:      9(int)   Load 66(pid)
-                                Store 67(param) 68
-              69:22(HS_CONSTANT_OUT)   FunctionCall 25(PCF(u1;) 67(param)
-                                Store 65(@patchConstantResult) 69
-              74:     73(ptr)   AccessChain 65(@patchConstantResult) 30 30
-              75:    6(float)   Load 74
-              77:     76(ptr)   AccessChain 72(@patchConstantOutput_edges) 30
-                                Store 77 75
-              79:     73(ptr)   AccessChain 65(@patchConstantResult) 30 78
-              80:    6(float)   Load 79
-              81:     76(ptr)   AccessChain 72(@patchConstantOutput_edges) 78
-                                Store 81 80
-                                Branch 63
-              63:             Label
+                              ControlBarrier 20 10 57
+              58:      9(int) Load 44(m_cpid)
+              60:    59(bool) IEqual 58 30
+                              SelectionMerge 62 None
+                              BranchConditional 60 61 62
+              61:               Label
+              67:      9(int)   Load 65(pid)
+                                Store 66(param) 67
+              68:22(HS_CONSTANT_OUT)   FunctionCall 25(PCF(u1;) 66(param)
+                                Store 64(@patchConstantResult) 68
+              73:     72(ptr)   AccessChain 64(@patchConstantResult) 30 30
+              74:    6(float)   Load 73
+              76:     75(ptr)   AccessChain 71(@patchConstantOutput.edges) 30
+                                Store 76 74
+              78:     72(ptr)   AccessChain 64(@patchConstantResult) 30 77
+              79:    6(float)   Load 78
+              80:     75(ptr)   AccessChain 71(@patchConstantOutput.edges) 77
+                                Store 80 79
+                                Branch 62
+              62:             Label
                               Return
                               FunctionEnd
 18(@main(struct-VS_OUT-vf31[4];u1;):  14(HS_OUT) Function None 15
@@ -373,11 +363,11 @@
      25(PCF(u1;):22(HS_CONSTANT_OUT) Function None 23
          24(pid):     13(ptr) FunctionParameter
               26:             Label
-      82(output):     64(ptr) Variable Function
-              84:     73(ptr) AccessChain 82(output) 30 30
-                              Store 84 83
-              86:     73(ptr) AccessChain 82(output) 30 78
-                              Store 86 85
-              87:22(HS_CONSTANT_OUT) Load 82(output)
-                              ReturnValue 87
+      81(output):     63(ptr) Variable Function
+              83:     72(ptr) AccessChain 81(output) 30 30
+                              Store 83 82
+              85:     72(ptr) AccessChain 81(output) 30 77
+                              Store 85 84
+              86:22(HS_CONSTANT_OUT) Load 81(output)
+                              ReturnValue 86
                               FunctionEnd
diff --git a/Test/baseResults/hlsl.hull.2.tesc.out b/Test/baseResults/hlsl.hull.2.tesc.out
index d32da52..c8218d2 100644
--- a/Test/baseResults/hlsl.hull.2.tesc.out
+++ b/Test/baseResults/hlsl.hull.2.tesc.out
@@ -28,7 +28,7 @@
 0:?         'ip' ( temp 4-element array of structure{ temp 3-component vector of float cpoint})
 0:?         'ip' (layout( location=0) in 4-element array of structure{ temp 3-component vector of float cpoint})
 0:26      move second child to first child ( temp structure{ temp 3-component vector of float cpoint})
-0:26        indirect index ( temp structure{ temp 3-component vector of float cpoint})
+0:26        indirect index (layout( location=0) out structure{ temp 3-component vector of float cpoint})
 0:?           '@entryPointOutput' (layout( location=0) out 4-element array of structure{ temp 3-component vector of float cpoint})
 0:?           'InvocationId' ( in uint InvocationID)
 0:26        Function Call: @main(struct-VS_OUT-vf31[4]; ( temp structure{ temp 3-component vector of float cpoint})
@@ -50,7 +50,7 @@
 0:?           Sequence
 0:?             move second child to first child ( temp float)
 0:?               direct index ( patch out float TessLevelOuter)
-0:?                 '@patchConstantOutput_edges' ( patch out 4-element array of float TessLevelOuter)
+0:?                 '@patchConstantOutput.edges' ( patch out 4-element array of float TessLevelOuter)
 0:?                 Constant:
 0:?                   0 (const int)
 0:?               direct index ( temp float)
@@ -62,7 +62,7 @@
 0:?                   0 (const int)
 0:?             move second child to first child ( temp float)
 0:?               direct index ( patch out float TessLevelOuter)
-0:?                 '@patchConstantOutput_edges' ( patch out 4-element array of float TessLevelOuter)
+0:?                 '@patchConstantOutput.edges' ( patch out 4-element array of float TessLevelOuter)
 0:?                 Constant:
 0:?                   1 (const int)
 0:?               direct index ( temp float)
@@ -105,8 +105,7 @@
 0:?     'InvocationId' ( in uint InvocationID)
 0:?     'pid' ( in uint PrimitiveID)
 0:?     'pos' ( in 4-component vector of float Position)
-0:?     '@patchConstantOutput' (layout( location=1) patch out structure{})
-0:?     '@patchConstantOutput_edges' ( patch out 4-element array of float TessLevelOuter)
+0:?     '@patchConstantOutput.edges' ( patch out 4-element array of float TessLevelOuter)
 
 
 Linked tessellation control stage:
@@ -141,7 +140,7 @@
 0:?         'ip' ( temp 4-element array of structure{ temp 3-component vector of float cpoint})
 0:?         'ip' (layout( location=0) in 4-element array of structure{ temp 3-component vector of float cpoint})
 0:26      move second child to first child ( temp structure{ temp 3-component vector of float cpoint})
-0:26        indirect index ( temp structure{ temp 3-component vector of float cpoint})
+0:26        indirect index (layout( location=0) out structure{ temp 3-component vector of float cpoint})
 0:?           '@entryPointOutput' (layout( location=0) out 4-element array of structure{ temp 3-component vector of float cpoint})
 0:?           'InvocationId' ( in uint InvocationID)
 0:26        Function Call: @main(struct-VS_OUT-vf31[4]; ( temp structure{ temp 3-component vector of float cpoint})
@@ -163,7 +162,7 @@
 0:?           Sequence
 0:?             move second child to first child ( temp float)
 0:?               direct index ( patch out float TessLevelOuter)
-0:?                 '@patchConstantOutput_edges' ( patch out 4-element array of float TessLevelOuter)
+0:?                 '@patchConstantOutput.edges' ( patch out 4-element array of float TessLevelOuter)
 0:?                 Constant:
 0:?                   0 (const int)
 0:?               direct index ( temp float)
@@ -175,7 +174,7 @@
 0:?                   0 (const int)
 0:?             move second child to first child ( temp float)
 0:?               direct index ( patch out float TessLevelOuter)
-0:?                 '@patchConstantOutput_edges' ( patch out 4-element array of float TessLevelOuter)
+0:?                 '@patchConstantOutput.edges' ( patch out 4-element array of float TessLevelOuter)
 0:?                 Constant:
 0:?                   1 (const int)
 0:?               direct index ( temp float)
@@ -218,17 +217,16 @@
 0:?     'InvocationId' ( in uint InvocationID)
 0:?     'pid' ( in uint PrimitiveID)
 0:?     'pos' ( in 4-component vector of float Position)
-0:?     '@patchConstantOutput' (layout( location=1) patch out structure{})
-0:?     '@patchConstantOutput_edges' ( patch out 4-element array of float TessLevelOuter)
+0:?     '@patchConstantOutput.edges' ( patch out 4-element array of float TessLevelOuter)
 
 // Module Version 10000
-// Generated by (magic number): 80001
-// Id's are bound by 95
+// Generated by (magic number): 80007
+// Id's are bound by 91
 
                               Capability Tessellation
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint TessellationControl 4  "main" 42 46 48 64 66 74 94
+                              EntryPoint TessellationControl 4  "main" 42 46 48 63 65 73
                               ExecutionMode 4 OutputVertices 4
                               ExecutionMode 4 Isolines
                               ExecutionMode 4 SpacingEqual
@@ -251,24 +249,20 @@
                               Name 46  "@entryPointOutput"
                               Name 48  "InvocationId"
                               Name 50  "param"
-                              Name 63  "@patchConstantResult"
-                              Name 64  "pid"
-                              Name 66  "pos"
-                              Name 67  "param"
-                              Name 69  "param"
-                              Name 74  "@patchConstantOutput_edges"
-                              Name 84  "output"
-                              Name 92  "HS_CONSTANT_OUT"
-                              Name 94  "@patchConstantOutput"
+                              Name 62  "@patchConstantResult"
+                              Name 63  "pid"
+                              Name 65  "pos"
+                              Name 66  "param"
+                              Name 68  "param"
+                              Name 73  "@patchConstantOutput.edges"
+                              Name 83  "output"
                               Decorate 42(ip) Location 0
                               Decorate 46(@entryPointOutput) Location 0
                               Decorate 48(InvocationId) BuiltIn InvocationId
-                              Decorate 64(pid) BuiltIn PrimitiveId
-                              Decorate 66(pos) BuiltIn Position
-                              Decorate 74(@patchConstantOutput_edges) Patch
-                              Decorate 74(@patchConstantOutput_edges) BuiltIn TessLevelOuter
-                              Decorate 94(@patchConstantOutput) Patch
-                              Decorate 94(@patchConstantOutput) Location 1
+                              Decorate 63(pid) BuiltIn PrimitiveId
+                              Decorate 65(pos) BuiltIn Position
+                              Decorate 73(@patchConstantOutput.edges) Patch
+                              Decorate 73(@patchConstantOutput.edges) BuiltIn TessLevelOuter
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -299,31 +293,27 @@
               47:             TypePointer Input 9(int)
 48(InvocationId):     47(ptr) Variable Input
               53:             TypePointer Output 13(HS_OUT)
-              55:      9(int) Constant 1
-              56:      9(int) Constant 0
-              58:             TypeBool
-              62:             TypePointer Function 23(HS_CONSTANT_OUT)
-         64(pid):     47(ptr) Variable Input
-              65:             TypePointer Input 19(fvec4)
-         66(pos):     65(ptr) Variable Input
-              72:             TypeArray 6(float) 10
-              73:             TypePointer Output 72
-74(@patchConstantOutput_edges):     73(ptr) Variable Output
-              75:             TypePointer Function 6(float)
-              78:             TypePointer Output 6(float)
-              80:     31(int) Constant 1
-              85:    6(float) Constant 1073741824
-              87:    6(float) Constant 1090519040
-92(HS_CONSTANT_OUT):             TypeStruct
-              93:             TypePointer Output 92(HS_CONSTANT_OUT)
-94(@patchConstantOutput):     93(ptr) Variable Output
+              55:      9(int) Constant 0
+              57:             TypeBool
+              61:             TypePointer Function 23(HS_CONSTANT_OUT)
+         63(pid):     47(ptr) Variable Input
+              64:             TypePointer Input 19(fvec4)
+         65(pos):     64(ptr) Variable Input
+              71:             TypeArray 6(float) 10
+              72:             TypePointer Output 71
+73(@patchConstantOutput.edges):     72(ptr) Variable Output
+              74:             TypePointer Function 6(float)
+              77:             TypePointer Output 6(float)
+              79:     31(int) Constant 1
+              84:    6(float) Constant 1073741824
+              86:    6(float) Constant 1090519040
          4(main):           2 Function None 3
                5:             Label
           40(ip):     12(ptr) Variable Function
        50(param):     12(ptr) Variable Function
-63(@patchConstantResult):     62(ptr) Variable Function
-       67(param):     18(ptr) Variable Function
-       69(param):     20(ptr) Variable Function
+62(@patchConstantResult):     61(ptr) Variable Function
+       66(param):     18(ptr) Variable Function
+       68(param):     20(ptr) Variable Function
               43:          11 Load 42(ip)
                               Store 40(ip) 43
               49:      9(int) Load 48(InvocationId)
@@ -332,28 +322,28 @@
               52:  13(HS_OUT) FunctionCall 16(@main(struct-VS_OUT-vf31[4];) 50(param)
               54:     53(ptr) AccessChain 46(@entryPointOutput) 49
                               Store 54 52
-                              ControlBarrier 21 55 56
-              57:      9(int) Load 48(InvocationId)
-              59:    58(bool) IEqual 57 32
-                              SelectionMerge 61 None
-                              BranchConditional 59 60 61
-              60:               Label
-              68:      9(int)   Load 64(pid)
-                                Store 67(param) 68
-              70:   19(fvec4)   Load 66(pos)
-                                Store 69(param) 70
-              71:23(HS_CONSTANT_OUT)   FunctionCall 27(PCF(u1;vf4;) 67(param) 69(param)
-                                Store 63(@patchConstantResult) 71
-              76:     75(ptr)   AccessChain 63(@patchConstantResult) 32 32
-              77:    6(float)   Load 76
-              79:     78(ptr)   AccessChain 74(@patchConstantOutput_edges) 32
-                                Store 79 77
-              81:     75(ptr)   AccessChain 63(@patchConstantResult) 32 80
-              82:    6(float)   Load 81
-              83:     78(ptr)   AccessChain 74(@patchConstantOutput_edges) 80
-                                Store 83 82
-                                Branch 61
-              61:             Label
+                              ControlBarrier 21 10 55
+              56:      9(int) Load 48(InvocationId)
+              58:    57(bool) IEqual 56 32
+                              SelectionMerge 60 None
+                              BranchConditional 58 59 60
+              59:               Label
+              67:      9(int)   Load 63(pid)
+                                Store 66(param) 67
+              69:   19(fvec4)   Load 65(pos)
+                                Store 68(param) 69
+              70:23(HS_CONSTANT_OUT)   FunctionCall 27(PCF(u1;vf4;) 66(param) 68(param)
+                                Store 62(@patchConstantResult) 70
+              75:     74(ptr)   AccessChain 62(@patchConstantResult) 32 32
+              76:    6(float)   Load 75
+              78:     77(ptr)   AccessChain 73(@patchConstantOutput.edges) 32
+                                Store 78 76
+              80:     74(ptr)   AccessChain 62(@patchConstantResult) 32 79
+              81:    6(float)   Load 80
+              82:     77(ptr)   AccessChain 73(@patchConstantOutput.edges) 79
+                                Store 82 81
+                                Branch 60
+              60:             Label
                               Return
                               FunctionEnd
 16(@main(struct-VS_OUT-vf31[4];):  13(HS_OUT) Function None 14
@@ -371,11 +361,11 @@
          25(pid):     18(ptr) FunctionParameter
          26(pos):     20(ptr) FunctionParameter
               28:             Label
-      84(output):     62(ptr) Variable Function
-              86:     75(ptr) AccessChain 84(output) 32 32
-                              Store 86 85
-              88:     75(ptr) AccessChain 84(output) 32 80
-                              Store 88 87
-              89:23(HS_CONSTANT_OUT) Load 84(output)
-                              ReturnValue 89
+      83(output):     61(ptr) Variable Function
+              85:     74(ptr) AccessChain 83(output) 32 32
+                              Store 85 84
+              87:     74(ptr) AccessChain 83(output) 32 79
+                              Store 87 86
+              88:23(HS_CONSTANT_OUT) Load 83(output)
+                              ReturnValue 88
                               FunctionEnd
diff --git a/Test/baseResults/hlsl.hull.3.tesc.out b/Test/baseResults/hlsl.hull.3.tesc.out
new file mode 100644
index 0000000..4ff0198
--- /dev/null
+++ b/Test/baseResults/hlsl.hull.3.tesc.out
@@ -0,0 +1,372 @@
+hlsl.hull.3.tesc
+Shader version: 500
+vertices = 4
+vertex spacing = equal_spacing
+0:? Sequence
+0:26  Function Definition: @main(struct-VS_OUT-vf31[4]; ( temp structure{ temp 3-component vector of float cpoint})
+0:26    Function Parameters: 
+0:26      'ip' ( in 4-element array of structure{ temp 3-component vector of float cpoint})
+0:?     Sequence
+0:28      move second child to first child ( temp 3-component vector of float)
+0:28        cpoint: direct index for structure ( temp 3-component vector of float)
+0:28          'output' ( temp structure{ temp 3-component vector of float cpoint})
+0:28          Constant:
+0:28            0 (const int)
+0:28        cpoint: direct index for structure ( temp 3-component vector of float)
+0:28          direct index ( temp structure{ temp 3-component vector of float cpoint})
+0:28            'ip' ( in 4-element array of structure{ temp 3-component vector of float cpoint})
+0:28            Constant:
+0:28              0 (const int)
+0:28          Constant:
+0:28            0 (const int)
+0:29      Branch: Return with expression
+0:29        'output' ( temp structure{ temp 3-component vector of float cpoint})
+0:26  Function Definition: main( ( temp void)
+0:26    Function Parameters: 
+0:?     Sequence
+0:26      move second child to first child ( temp 4-element array of structure{ temp 3-component vector of float cpoint})
+0:?         'ip' ( temp 4-element array of structure{ temp 3-component vector of float cpoint})
+0:?         'ip' (layout( location=0) in 4-element array of structure{ temp 3-component vector of float cpoint})
+0:26      move second child to first child ( temp structure{ temp 3-component vector of float cpoint})
+0:26        indirect index (layout( location=0) out structure{ temp 3-component vector of float cpoint})
+0:?           '@entryPointOutput' (layout( location=0) out 4-element array of structure{ temp 3-component vector of float cpoint})
+0:?           'InvocationId' ( in uint InvocationID)
+0:26        Function Call: @main(struct-VS_OUT-vf31[4]; ( temp structure{ temp 3-component vector of float cpoint})
+0:?           'ip' ( temp 4-element array of structure{ temp 3-component vector of float cpoint})
+0:?       Barrier ( temp void)
+0:?       Test condition and select ( temp void)
+0:?         Condition
+0:?         Compare Equal ( temp bool)
+0:?           'InvocationId' ( in uint InvocationID)
+0:?           Constant:
+0:?             0 (const int)
+0:?         true case
+0:?         Sequence
+0:?           move second child to first child ( temp structure{ temp 2-element array of float edges})
+0:?             '@patchConstantResult' ( temp structure{ temp 2-element array of float edges})
+0:?             Function Call: PCF(u1;vf4; ( temp structure{ temp 2-element array of float edges})
+0:?               'pid' ( in uint PrimitiveID)
+0:?               'pos' ( in 4-component vector of float Position)
+0:?           Sequence
+0:?             move second child to first child ( temp float)
+0:?               direct index ( patch out float TessLevelOuter)
+0:?                 '@patchConstantOutput.edges' ( patch out 4-element array of float TessLevelOuter)
+0:?                 Constant:
+0:?                   0 (const int)
+0:?               direct index ( temp float)
+0:?                 edges: direct index for structure ( temp 2-element array of float)
+0:?                   '@patchConstantResult' ( temp structure{ temp 2-element array of float edges})
+0:?                   Constant:
+0:?                     0 (const int)
+0:?                 Constant:
+0:?                   0 (const int)
+0:?             move second child to first child ( temp float)
+0:?               direct index ( patch out float TessLevelOuter)
+0:?                 '@patchConstantOutput.edges' ( patch out 4-element array of float TessLevelOuter)
+0:?                 Constant:
+0:?                   1 (const int)
+0:?               direct index ( temp float)
+0:?                 edges: direct index for structure ( temp 2-element array of float)
+0:?                   '@patchConstantResult' ( temp structure{ temp 2-element array of float edges})
+0:?                   Constant:
+0:?                     0 (const int)
+0:?                 Constant:
+0:?                   1 (const int)
+0:33  Function Definition: PCF(u1;vf4; ( temp structure{ temp 2-element array of float edges})
+0:33    Function Parameters: 
+0:33      'pid' ( in uint)
+0:33      'pos' ( in 4-component vector of float)
+0:?     Sequence
+0:36      move second child to first child ( temp float)
+0:36        direct index ( temp float)
+0:36          edges: direct index for structure ( temp 2-element array of float)
+0:36            'output' ( temp structure{ temp 2-element array of float edges})
+0:36            Constant:
+0:36              0 (const int)
+0:36          Constant:
+0:36            0 (const int)
+0:36        Constant:
+0:36          2.000000
+0:37      move second child to first child ( temp float)
+0:37        direct index ( temp float)
+0:37          edges: direct index for structure ( temp 2-element array of float)
+0:37            'output' ( temp structure{ temp 2-element array of float edges})
+0:37            Constant:
+0:37              0 (const int)
+0:37          Constant:
+0:37            1 (const int)
+0:37        Constant:
+0:37          8.000000
+0:38      Branch: Return with expression
+0:38        'output' ( temp structure{ temp 2-element array of float edges})
+0:?   Linker Objects
+0:?     '@entryPointOutput' (layout( location=0) out 4-element array of structure{ temp 3-component vector of float cpoint})
+0:?     'ip' (layout( location=0) in 4-element array of structure{ temp 3-component vector of float cpoint})
+0:?     'InvocationId' ( in uint InvocationID)
+0:?     'pid' ( in uint PrimitiveID)
+0:?     'pos' ( in 4-component vector of float Position)
+0:?     '@patchConstantOutput.edges' ( patch out 4-element array of float TessLevelOuter)
+
+
+Linked tessellation control stage:
+
+
+Shader version: 500
+vertices = 4
+vertex spacing = equal_spacing
+0:? Sequence
+0:26  Function Definition: @main(struct-VS_OUT-vf31[4]; ( temp structure{ temp 3-component vector of float cpoint})
+0:26    Function Parameters: 
+0:26      'ip' ( in 4-element array of structure{ temp 3-component vector of float cpoint})
+0:?     Sequence
+0:28      move second child to first child ( temp 3-component vector of float)
+0:28        cpoint: direct index for structure ( temp 3-component vector of float)
+0:28          'output' ( temp structure{ temp 3-component vector of float cpoint})
+0:28          Constant:
+0:28            0 (const int)
+0:28        cpoint: direct index for structure ( temp 3-component vector of float)
+0:28          direct index ( temp structure{ temp 3-component vector of float cpoint})
+0:28            'ip' ( in 4-element array of structure{ temp 3-component vector of float cpoint})
+0:28            Constant:
+0:28              0 (const int)
+0:28          Constant:
+0:28            0 (const int)
+0:29      Branch: Return with expression
+0:29        'output' ( temp structure{ temp 3-component vector of float cpoint})
+0:26  Function Definition: main( ( temp void)
+0:26    Function Parameters: 
+0:?     Sequence
+0:26      move second child to first child ( temp 4-element array of structure{ temp 3-component vector of float cpoint})
+0:?         'ip' ( temp 4-element array of structure{ temp 3-component vector of float cpoint})
+0:?         'ip' (layout( location=0) in 4-element array of structure{ temp 3-component vector of float cpoint})
+0:26      move second child to first child ( temp structure{ temp 3-component vector of float cpoint})
+0:26        indirect index (layout( location=0) out structure{ temp 3-component vector of float cpoint})
+0:?           '@entryPointOutput' (layout( location=0) out 4-element array of structure{ temp 3-component vector of float cpoint})
+0:?           'InvocationId' ( in uint InvocationID)
+0:26        Function Call: @main(struct-VS_OUT-vf31[4]; ( temp structure{ temp 3-component vector of float cpoint})
+0:?           'ip' ( temp 4-element array of structure{ temp 3-component vector of float cpoint})
+0:?       Barrier ( temp void)
+0:?       Test condition and select ( temp void)
+0:?         Condition
+0:?         Compare Equal ( temp bool)
+0:?           'InvocationId' ( in uint InvocationID)
+0:?           Constant:
+0:?             0 (const int)
+0:?         true case
+0:?         Sequence
+0:?           move second child to first child ( temp structure{ temp 2-element array of float edges})
+0:?             '@patchConstantResult' ( temp structure{ temp 2-element array of float edges})
+0:?             Function Call: PCF(u1;vf4; ( temp structure{ temp 2-element array of float edges})
+0:?               'pid' ( in uint PrimitiveID)
+0:?               'pos' ( in 4-component vector of float Position)
+0:?           Sequence
+0:?             move second child to first child ( temp float)
+0:?               direct index ( patch out float TessLevelOuter)
+0:?                 '@patchConstantOutput.edges' ( patch out 4-element array of float TessLevelOuter)
+0:?                 Constant:
+0:?                   0 (const int)
+0:?               direct index ( temp float)
+0:?                 edges: direct index for structure ( temp 2-element array of float)
+0:?                   '@patchConstantResult' ( temp structure{ temp 2-element array of float edges})
+0:?                   Constant:
+0:?                     0 (const int)
+0:?                 Constant:
+0:?                   0 (const int)
+0:?             move second child to first child ( temp float)
+0:?               direct index ( patch out float TessLevelOuter)
+0:?                 '@patchConstantOutput.edges' ( patch out 4-element array of float TessLevelOuter)
+0:?                 Constant:
+0:?                   1 (const int)
+0:?               direct index ( temp float)
+0:?                 edges: direct index for structure ( temp 2-element array of float)
+0:?                   '@patchConstantResult' ( temp structure{ temp 2-element array of float edges})
+0:?                   Constant:
+0:?                     0 (const int)
+0:?                 Constant:
+0:?                   1 (const int)
+0:33  Function Definition: PCF(u1;vf4; ( temp structure{ temp 2-element array of float edges})
+0:33    Function Parameters: 
+0:33      'pid' ( in uint)
+0:33      'pos' ( in 4-component vector of float)
+0:?     Sequence
+0:36      move second child to first child ( temp float)
+0:36        direct index ( temp float)
+0:36          edges: direct index for structure ( temp 2-element array of float)
+0:36            'output' ( temp structure{ temp 2-element array of float edges})
+0:36            Constant:
+0:36              0 (const int)
+0:36          Constant:
+0:36            0 (const int)
+0:36        Constant:
+0:36          2.000000
+0:37      move second child to first child ( temp float)
+0:37        direct index ( temp float)
+0:37          edges: direct index for structure ( temp 2-element array of float)
+0:37            'output' ( temp structure{ temp 2-element array of float edges})
+0:37            Constant:
+0:37              0 (const int)
+0:37          Constant:
+0:37            1 (const int)
+0:37        Constant:
+0:37          8.000000
+0:38      Branch: Return with expression
+0:38        'output' ( temp structure{ temp 2-element array of float edges})
+0:?   Linker Objects
+0:?     '@entryPointOutput' (layout( location=0) out 4-element array of structure{ temp 3-component vector of float cpoint})
+0:?     'ip' (layout( location=0) in 4-element array of structure{ temp 3-component vector of float cpoint})
+0:?     'InvocationId' ( in uint InvocationID)
+0:?     'pid' ( in uint PrimitiveID)
+0:?     'pos' ( in 4-component vector of float Position)
+0:?     '@patchConstantOutput.edges' ( patch out 4-element array of float TessLevelOuter)
+
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 91
+
+                              Capability Tessellation
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint TessellationControl 4  "main" 42 46 48 63 65 73
+                              ExecutionMode 4 OutputVertices 4
+                              ExecutionMode 4 Triangles
+                              ExecutionMode 4 SpacingEqual
+                              ExecutionMode 4 PointMode
+                              Source HLSL 500
+                              Name 4  "main"
+                              Name 8  "VS_OUT"
+                              MemberName 8(VS_OUT) 0  "cpoint"
+                              Name 13  "HS_OUT"
+                              MemberName 13(HS_OUT) 0  "cpoint"
+                              Name 16  "@main(struct-VS_OUT-vf31[4];"
+                              Name 15  "ip"
+                              Name 23  "HS_CONSTANT_OUT"
+                              MemberName 23(HS_CONSTANT_OUT) 0  "edges"
+                              Name 27  "PCF(u1;vf4;"
+                              Name 25  "pid"
+                              Name 26  "pos"
+                              Name 30  "output"
+                              Name 40  "ip"
+                              Name 42  "ip"
+                              Name 46  "@entryPointOutput"
+                              Name 48  "InvocationId"
+                              Name 50  "param"
+                              Name 62  "@patchConstantResult"
+                              Name 63  "pid"
+                              Name 65  "pos"
+                              Name 66  "param"
+                              Name 68  "param"
+                              Name 73  "@patchConstantOutput.edges"
+                              Name 83  "output"
+                              Decorate 42(ip) Location 0
+                              Decorate 46(@entryPointOutput) Location 0
+                              Decorate 48(InvocationId) BuiltIn InvocationId
+                              Decorate 63(pid) BuiltIn PrimitiveId
+                              Decorate 65(pos) BuiltIn Position
+                              Decorate 73(@patchConstantOutput.edges) Patch
+                              Decorate 73(@patchConstantOutput.edges) BuiltIn TessLevelOuter
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 3
+       8(VS_OUT):             TypeStruct 7(fvec3)
+               9:             TypeInt 32 0
+              10:      9(int) Constant 4
+              11:             TypeArray 8(VS_OUT) 10
+              12:             TypePointer Function 11
+      13(HS_OUT):             TypeStruct 7(fvec3)
+              14:             TypeFunction 13(HS_OUT) 12(ptr)
+              18:             TypePointer Function 9(int)
+              19:             TypeVector 6(float) 4
+              20:             TypePointer Function 19(fvec4)
+              21:      9(int) Constant 2
+              22:             TypeArray 6(float) 21
+23(HS_CONSTANT_OUT):             TypeStruct 22
+              24:             TypeFunction 23(HS_CONSTANT_OUT) 18(ptr) 20(ptr)
+              29:             TypePointer Function 13(HS_OUT)
+              31:             TypeInt 32 1
+              32:     31(int) Constant 0
+              33:             TypePointer Function 7(fvec3)
+              41:             TypePointer Input 11
+          42(ip):     41(ptr) Variable Input
+              44:             TypeArray 13(HS_OUT) 10
+              45:             TypePointer Output 44
+46(@entryPointOutput):     45(ptr) Variable Output
+              47:             TypePointer Input 9(int)
+48(InvocationId):     47(ptr) Variable Input
+              53:             TypePointer Output 13(HS_OUT)
+              55:      9(int) Constant 0
+              57:             TypeBool
+              61:             TypePointer Function 23(HS_CONSTANT_OUT)
+         63(pid):     47(ptr) Variable Input
+              64:             TypePointer Input 19(fvec4)
+         65(pos):     64(ptr) Variable Input
+              71:             TypeArray 6(float) 10
+              72:             TypePointer Output 71
+73(@patchConstantOutput.edges):     72(ptr) Variable Output
+              74:             TypePointer Function 6(float)
+              77:             TypePointer Output 6(float)
+              79:     31(int) Constant 1
+              84:    6(float) Constant 1073741824
+              86:    6(float) Constant 1090519040
+         4(main):           2 Function None 3
+               5:             Label
+          40(ip):     12(ptr) Variable Function
+       50(param):     12(ptr) Variable Function
+62(@patchConstantResult):     61(ptr) Variable Function
+       66(param):     18(ptr) Variable Function
+       68(param):     20(ptr) Variable Function
+              43:          11 Load 42(ip)
+                              Store 40(ip) 43
+              49:      9(int) Load 48(InvocationId)
+              51:          11 Load 40(ip)
+                              Store 50(param) 51
+              52:  13(HS_OUT) FunctionCall 16(@main(struct-VS_OUT-vf31[4];) 50(param)
+              54:     53(ptr) AccessChain 46(@entryPointOutput) 49
+                              Store 54 52
+                              ControlBarrier 21 10 55
+              56:      9(int) Load 48(InvocationId)
+              58:    57(bool) IEqual 56 32
+                              SelectionMerge 60 None
+                              BranchConditional 58 59 60
+              59:               Label
+              67:      9(int)   Load 63(pid)
+                                Store 66(param) 67
+              69:   19(fvec4)   Load 65(pos)
+                                Store 68(param) 69
+              70:23(HS_CONSTANT_OUT)   FunctionCall 27(PCF(u1;vf4;) 66(param) 68(param)
+                                Store 62(@patchConstantResult) 70
+              75:     74(ptr)   AccessChain 62(@patchConstantResult) 32 32
+              76:    6(float)   Load 75
+              78:     77(ptr)   AccessChain 73(@patchConstantOutput.edges) 32
+                                Store 78 76
+              80:     74(ptr)   AccessChain 62(@patchConstantResult) 32 79
+              81:    6(float)   Load 80
+              82:     77(ptr)   AccessChain 73(@patchConstantOutput.edges) 79
+                                Store 82 81
+                                Branch 60
+              60:             Label
+                              Return
+                              FunctionEnd
+16(@main(struct-VS_OUT-vf31[4];):  13(HS_OUT) Function None 14
+          15(ip):     12(ptr) FunctionParameter
+              17:             Label
+      30(output):     29(ptr) Variable Function
+              34:     33(ptr) AccessChain 15(ip) 32 32
+              35:    7(fvec3) Load 34
+              36:     33(ptr) AccessChain 30(output) 32
+                              Store 36 35
+              37:  13(HS_OUT) Load 30(output)
+                              ReturnValue 37
+                              FunctionEnd
+ 27(PCF(u1;vf4;):23(HS_CONSTANT_OUT) Function None 24
+         25(pid):     18(ptr) FunctionParameter
+         26(pos):     20(ptr) FunctionParameter
+              28:             Label
+      83(output):     61(ptr) Variable Function
+              85:     74(ptr) AccessChain 83(output) 32 32
+                              Store 85 84
+              87:     74(ptr) AccessChain 83(output) 32 79
+                              Store 87 86
+              88:23(HS_CONSTANT_OUT) Load 83(output)
+                              ReturnValue 88
+                              FunctionEnd
diff --git a/Test/baseResults/hlsl.hull.4.tesc.out b/Test/baseResults/hlsl.hull.4.tesc.out
new file mode 100644
index 0000000..a99730d
--- /dev/null
+++ b/Test/baseResults/hlsl.hull.4.tesc.out
@@ -0,0 +1,679 @@
+hlsl.hull.4.tesc
+Shader version: 500
+vertices = 3
+vertex spacing = fractional_odd_spacing
+triangle order = cw
+0:? Sequence
+0:25  Function Definition: HS_ConstFunc(struct-HS_Input-vf4-vf41[3]; ( temp structure{ temp 3-element array of float fTessFactor,  temp float fInsideTessFactor})
+0:25    Function Parameters: 
+0:25      'I' ( in 3-element array of structure{ temp 4-component vector of float m_Position,  temp 4-component vector of float m_Normal})
+0:?     Sequence
+0:26      Sequence
+0:26        move second child to first child ( temp structure{ temp 3-element array of float fTessFactor,  temp float fInsideTessFactor})
+0:26          'O' ( temp structure{ temp 3-element array of float fTessFactor,  temp float fInsideTessFactor})
+0:26          Constant:
+0:26            0.000000
+0:26            0.000000
+0:26            0.000000
+0:26            0.000000
+0:28      move second child to first child ( temp float)
+0:28        fInsideTessFactor: direct index for structure ( temp float)
+0:28          'O' ( temp structure{ temp 3-element array of float fTessFactor,  temp float fInsideTessFactor})
+0:28          Constant:
+0:28            1 (const int)
+0:28        add ( temp float)
+0:28          direct index ( temp float)
+0:28            m_Position: direct index for structure ( temp 4-component vector of float)
+0:28              direct index ( temp structure{ temp 4-component vector of float m_Position,  temp 4-component vector of float m_Normal})
+0:28                'I' ( in 3-element array of structure{ temp 4-component vector of float m_Position,  temp 4-component vector of float m_Normal})
+0:28                Constant:
+0:28                  0 (const int)
+0:28              Constant:
+0:28                0 (const int)
+0:28            Constant:
+0:28              3 (const int)
+0:28          direct index ( temp float)
+0:28            m_Normal: direct index for structure ( temp 4-component vector of float)
+0:28              direct index ( temp structure{ temp 4-component vector of float m_Position,  temp 4-component vector of float m_Normal})
+0:28                'I' ( in 3-element array of structure{ temp 4-component vector of float m_Position,  temp 4-component vector of float m_Normal})
+0:28                Constant:
+0:28                  0 (const int)
+0:28              Constant:
+0:28                1 (const int)
+0:28            Constant:
+0:28              3 (const int)
+0:30      Branch: Return with expression
+0:30        'O' ( temp structure{ temp 3-element array of float fTessFactor,  temp float fInsideTessFactor})
+0:39  Function Definition: @main(struct-HS_Input-vf4-vf41[3];u1; ( temp structure{ temp 4-component vector of float m_Position})
+0:39    Function Parameters: 
+0:39      'I' ( in 3-element array of structure{ temp 4-component vector of float m_Position,  temp 4-component vector of float m_Normal})
+0:39      'cpid' ( in uint)
+0:?     Sequence
+0:40      Sequence
+0:40        move second child to first child ( temp structure{ temp 4-component vector of float m_Position})
+0:40          'output' ( temp structure{ temp 4-component vector of float m_Position})
+0:40          Constant:
+0:40            0.000000
+0:40            0.000000
+0:40            0.000000
+0:40            0.000000
+0:41      move second child to first child ( temp 4-component vector of float)
+0:41        m_Position: direct index for structure ( temp 4-component vector of float)
+0:41          'output' ( temp structure{ temp 4-component vector of float m_Position})
+0:41          Constant:
+0:41            0 (const int)
+0:41        Constant:
+0:41          0.000000
+0:41          0.000000
+0:41          0.000000
+0:41          0.000000
+0:42      Branch: Return with expression
+0:42        'output' ( temp structure{ temp 4-component vector of float m_Position})
+0:39  Function Definition: main( ( temp void)
+0:39    Function Parameters: 
+0:?     Sequence
+0:39      Sequence
+0:39        move second child to first child ( temp 4-component vector of float)
+0:39          m_Position: direct index for structure ( temp 4-component vector of float)
+0:39            direct index ( temp structure{ temp 4-component vector of float m_Position,  temp 4-component vector of float m_Normal})
+0:?               'I' ( temp 3-element array of structure{ temp 4-component vector of float m_Position,  temp 4-component vector of float m_Normal})
+0:39              Constant:
+0:39                0 (const int)
+0:39            Constant:
+0:39              0 (const int)
+0:39          direct index ( in 4-component vector of float Position)
+0:?             'I.m_Position' ( in 3-element array of 4-component vector of float Position)
+0:39            Constant:
+0:39              0 (const int)
+0:39        move second child to first child ( temp 4-component vector of float)
+0:39          m_Normal: direct index for structure ( temp 4-component vector of float)
+0:39            direct index ( temp structure{ temp 4-component vector of float m_Position,  temp 4-component vector of float m_Normal})
+0:?               'I' ( temp 3-element array of structure{ temp 4-component vector of float m_Position,  temp 4-component vector of float m_Normal})
+0:39              Constant:
+0:39                0 (const int)
+0:39            Constant:
+0:39              1 (const int)
+0:39          m_Normal: direct index for structure ( temp 4-component vector of float)
+0:39            direct index (layout( location=0) in structure{ temp 4-component vector of float m_Normal})
+0:39              'I' (layout( location=0) in 3-element array of structure{ temp 4-component vector of float m_Normal})
+0:39              Constant:
+0:39                0 (const int)
+0:39            Constant:
+0:39              0 (const int)
+0:39        move second child to first child ( temp 4-component vector of float)
+0:39          m_Position: direct index for structure ( temp 4-component vector of float)
+0:39            direct index ( temp structure{ temp 4-component vector of float m_Position,  temp 4-component vector of float m_Normal})
+0:?               'I' ( temp 3-element array of structure{ temp 4-component vector of float m_Position,  temp 4-component vector of float m_Normal})
+0:39              Constant:
+0:39                1 (const int)
+0:39            Constant:
+0:39              0 (const int)
+0:39          direct index ( in 4-component vector of float Position)
+0:?             'I.m_Position' ( in 3-element array of 4-component vector of float Position)
+0:39            Constant:
+0:39              1 (const int)
+0:39        move second child to first child ( temp 4-component vector of float)
+0:39          m_Normal: direct index for structure ( temp 4-component vector of float)
+0:39            direct index ( temp structure{ temp 4-component vector of float m_Position,  temp 4-component vector of float m_Normal})
+0:?               'I' ( temp 3-element array of structure{ temp 4-component vector of float m_Position,  temp 4-component vector of float m_Normal})
+0:39              Constant:
+0:39                1 (const int)
+0:39            Constant:
+0:39              1 (const int)
+0:39          m_Normal: direct index for structure ( temp 4-component vector of float)
+0:39            direct index (layout( location=0) in structure{ temp 4-component vector of float m_Normal})
+0:39              'I' (layout( location=0) in 3-element array of structure{ temp 4-component vector of float m_Normal})
+0:39              Constant:
+0:39                1 (const int)
+0:39            Constant:
+0:39              0 (const int)
+0:39        move second child to first child ( temp 4-component vector of float)
+0:39          m_Position: direct index for structure ( temp 4-component vector of float)
+0:39            direct index ( temp structure{ temp 4-component vector of float m_Position,  temp 4-component vector of float m_Normal})
+0:?               'I' ( temp 3-element array of structure{ temp 4-component vector of float m_Position,  temp 4-component vector of float m_Normal})
+0:39              Constant:
+0:39                2 (const int)
+0:39            Constant:
+0:39              0 (const int)
+0:39          direct index ( in 4-component vector of float Position)
+0:?             'I.m_Position' ( in 3-element array of 4-component vector of float Position)
+0:39            Constant:
+0:39              2 (const int)
+0:39        move second child to first child ( temp 4-component vector of float)
+0:39          m_Normal: direct index for structure ( temp 4-component vector of float)
+0:39            direct index ( temp structure{ temp 4-component vector of float m_Position,  temp 4-component vector of float m_Normal})
+0:?               'I' ( temp 3-element array of structure{ temp 4-component vector of float m_Position,  temp 4-component vector of float m_Normal})
+0:39              Constant:
+0:39                2 (const int)
+0:39            Constant:
+0:39              1 (const int)
+0:39          m_Normal: direct index for structure ( temp 4-component vector of float)
+0:39            direct index (layout( location=0) in structure{ temp 4-component vector of float m_Normal})
+0:39              'I' (layout( location=0) in 3-element array of structure{ temp 4-component vector of float m_Normal})
+0:39              Constant:
+0:39                2 (const int)
+0:39            Constant:
+0:39              0 (const int)
+0:39      move second child to first child ( temp uint)
+0:?         'cpid' ( temp uint)
+0:?         'cpid' ( in uint InvocationID)
+0:39      Sequence
+0:39        move second child to first child ( temp 4-component vector of float)
+0:39          indirect index ( out 4-component vector of float Position)
+0:?             '@entryPointOutput.m_Position' ( out 3-element array of 4-component vector of float Position)
+0:?             'cpid' ( in uint InvocationID)
+0:39          m_Position: direct index for structure ( temp 4-component vector of float)
+0:39            Function Call: @main(struct-HS_Input-vf4-vf41[3];u1; ( temp structure{ temp 4-component vector of float m_Position})
+0:?               'I' ( temp 3-element array of structure{ temp 4-component vector of float m_Position,  temp 4-component vector of float m_Normal})
+0:?               'cpid' ( temp uint)
+0:39            Constant:
+0:39              0 (const int)
+0:?       Barrier ( temp void)
+0:?       Test condition and select ( temp void)
+0:?         Condition
+0:?         Compare Equal ( temp bool)
+0:?           'cpid' ( in uint InvocationID)
+0:?           Constant:
+0:?             0 (const int)
+0:?         true case
+0:?         Sequence
+0:?           move second child to first child ( temp structure{ temp 3-element array of float fTessFactor,  temp float fInsideTessFactor})
+0:?             '@patchConstantResult' ( temp structure{ temp 3-element array of float fTessFactor,  temp float fInsideTessFactor})
+0:?             Function Call: HS_ConstFunc(struct-HS_Input-vf4-vf41[3]; ( temp structure{ temp 3-element array of float fTessFactor,  temp float fInsideTessFactor})
+0:?               'I' ( temp 3-element array of structure{ temp 4-component vector of float m_Position,  temp 4-component vector of float m_Normal})
+0:?           Sequence
+0:?             move second child to first child ( temp float)
+0:?               direct index ( patch out float TessLevelOuter)
+0:?                 '@patchConstantOutput.fTessFactor' ( patch out 4-element array of float TessLevelOuter)
+0:?                 Constant:
+0:?                   0 (const int)
+0:?               direct index ( temp float)
+0:?                 fTessFactor: direct index for structure ( temp 3-element array of float)
+0:?                   '@patchConstantResult' ( temp structure{ temp 3-element array of float fTessFactor,  temp float fInsideTessFactor})
+0:?                   Constant:
+0:?                     0 (const int)
+0:?                 Constant:
+0:?                   0 (const int)
+0:?             move second child to first child ( temp float)
+0:?               direct index ( patch out float TessLevelOuter)
+0:?                 '@patchConstantOutput.fTessFactor' ( patch out 4-element array of float TessLevelOuter)
+0:?                 Constant:
+0:?                   1 (const int)
+0:?               direct index ( temp float)
+0:?                 fTessFactor: direct index for structure ( temp 3-element array of float)
+0:?                   '@patchConstantResult' ( temp structure{ temp 3-element array of float fTessFactor,  temp float fInsideTessFactor})
+0:?                   Constant:
+0:?                     0 (const int)
+0:?                 Constant:
+0:?                   1 (const int)
+0:?             move second child to first child ( temp float)
+0:?               direct index ( patch out float TessLevelOuter)
+0:?                 '@patchConstantOutput.fTessFactor' ( patch out 4-element array of float TessLevelOuter)
+0:?                 Constant:
+0:?                   2 (const int)
+0:?               direct index ( temp float)
+0:?                 fTessFactor: direct index for structure ( temp 3-element array of float)
+0:?                   '@patchConstantResult' ( temp structure{ temp 3-element array of float fTessFactor,  temp float fInsideTessFactor})
+0:?                   Constant:
+0:?                     0 (const int)
+0:?                 Constant:
+0:?                   2 (const int)
+0:?             move second child to first child ( temp float)
+0:?               direct index ( patch out float TessLevelInner)
+0:?                 '@patchConstantOutput.fInsideTessFactor' ( patch out 2-element array of float TessLevelInner)
+0:?                 Constant:
+0:?                   0 (const int)
+0:?               fInsideTessFactor: direct index for structure ( temp float)
+0:?                 '@patchConstantResult' ( temp structure{ temp 3-element array of float fTessFactor,  temp float fInsideTessFactor})
+0:?                 Constant:
+0:?                   1 (const int)
+0:?   Linker Objects
+0:?     '@entryPointOutput.m_Position' ( out 3-element array of 4-component vector of float Position)
+0:?     'I.m_Position' ( in 3-element array of 4-component vector of float Position)
+0:?     'I' (layout( location=0) in 3-element array of structure{ temp 4-component vector of float m_Normal})
+0:?     'cpid' ( in uint InvocationID)
+0:?     '@patchConstantOutput.fTessFactor' ( patch out 4-element array of float TessLevelOuter)
+0:?     '@patchConstantOutput.fInsideTessFactor' ( patch out 2-element array of float TessLevelInner)
+
+
+Linked tessellation control stage:
+
+
+Shader version: 500
+vertices = 3
+vertex spacing = fractional_odd_spacing
+triangle order = cw
+0:? Sequence
+0:25  Function Definition: HS_ConstFunc(struct-HS_Input-vf4-vf41[3]; ( temp structure{ temp 3-element array of float fTessFactor,  temp float fInsideTessFactor})
+0:25    Function Parameters: 
+0:25      'I' ( in 3-element array of structure{ temp 4-component vector of float m_Position,  temp 4-component vector of float m_Normal})
+0:?     Sequence
+0:26      Sequence
+0:26        move second child to first child ( temp structure{ temp 3-element array of float fTessFactor,  temp float fInsideTessFactor})
+0:26          'O' ( temp structure{ temp 3-element array of float fTessFactor,  temp float fInsideTessFactor})
+0:26          Constant:
+0:26            0.000000
+0:26            0.000000
+0:26            0.000000
+0:26            0.000000
+0:28      move second child to first child ( temp float)
+0:28        fInsideTessFactor: direct index for structure ( temp float)
+0:28          'O' ( temp structure{ temp 3-element array of float fTessFactor,  temp float fInsideTessFactor})
+0:28          Constant:
+0:28            1 (const int)
+0:28        add ( temp float)
+0:28          direct index ( temp float)
+0:28            m_Position: direct index for structure ( temp 4-component vector of float)
+0:28              direct index ( temp structure{ temp 4-component vector of float m_Position,  temp 4-component vector of float m_Normal})
+0:28                'I' ( in 3-element array of structure{ temp 4-component vector of float m_Position,  temp 4-component vector of float m_Normal})
+0:28                Constant:
+0:28                  0 (const int)
+0:28              Constant:
+0:28                0 (const int)
+0:28            Constant:
+0:28              3 (const int)
+0:28          direct index ( temp float)
+0:28            m_Normal: direct index for structure ( temp 4-component vector of float)
+0:28              direct index ( temp structure{ temp 4-component vector of float m_Position,  temp 4-component vector of float m_Normal})
+0:28                'I' ( in 3-element array of structure{ temp 4-component vector of float m_Position,  temp 4-component vector of float m_Normal})
+0:28                Constant:
+0:28                  0 (const int)
+0:28              Constant:
+0:28                1 (const int)
+0:28            Constant:
+0:28              3 (const int)
+0:30      Branch: Return with expression
+0:30        'O' ( temp structure{ temp 3-element array of float fTessFactor,  temp float fInsideTessFactor})
+0:39  Function Definition: @main(struct-HS_Input-vf4-vf41[3];u1; ( temp structure{ temp 4-component vector of float m_Position})
+0:39    Function Parameters: 
+0:39      'I' ( in 3-element array of structure{ temp 4-component vector of float m_Position,  temp 4-component vector of float m_Normal})
+0:39      'cpid' ( in uint)
+0:?     Sequence
+0:40      Sequence
+0:40        move second child to first child ( temp structure{ temp 4-component vector of float m_Position})
+0:40          'output' ( temp structure{ temp 4-component vector of float m_Position})
+0:40          Constant:
+0:40            0.000000
+0:40            0.000000
+0:40            0.000000
+0:40            0.000000
+0:41      move second child to first child ( temp 4-component vector of float)
+0:41        m_Position: direct index for structure ( temp 4-component vector of float)
+0:41          'output' ( temp structure{ temp 4-component vector of float m_Position})
+0:41          Constant:
+0:41            0 (const int)
+0:41        Constant:
+0:41          0.000000
+0:41          0.000000
+0:41          0.000000
+0:41          0.000000
+0:42      Branch: Return with expression
+0:42        'output' ( temp structure{ temp 4-component vector of float m_Position})
+0:39  Function Definition: main( ( temp void)
+0:39    Function Parameters: 
+0:?     Sequence
+0:39      Sequence
+0:39        move second child to first child ( temp 4-component vector of float)
+0:39          m_Position: direct index for structure ( temp 4-component vector of float)
+0:39            direct index ( temp structure{ temp 4-component vector of float m_Position,  temp 4-component vector of float m_Normal})
+0:?               'I' ( temp 3-element array of structure{ temp 4-component vector of float m_Position,  temp 4-component vector of float m_Normal})
+0:39              Constant:
+0:39                0 (const int)
+0:39            Constant:
+0:39              0 (const int)
+0:39          direct index ( in 4-component vector of float Position)
+0:?             'I.m_Position' ( in 3-element array of 4-component vector of float Position)
+0:39            Constant:
+0:39              0 (const int)
+0:39        move second child to first child ( temp 4-component vector of float)
+0:39          m_Normal: direct index for structure ( temp 4-component vector of float)
+0:39            direct index ( temp structure{ temp 4-component vector of float m_Position,  temp 4-component vector of float m_Normal})
+0:?               'I' ( temp 3-element array of structure{ temp 4-component vector of float m_Position,  temp 4-component vector of float m_Normal})
+0:39              Constant:
+0:39                0 (const int)
+0:39            Constant:
+0:39              1 (const int)
+0:39          m_Normal: direct index for structure ( temp 4-component vector of float)
+0:39            direct index (layout( location=0) in structure{ temp 4-component vector of float m_Normal})
+0:39              'I' (layout( location=0) in 3-element array of structure{ temp 4-component vector of float m_Normal})
+0:39              Constant:
+0:39                0 (const int)
+0:39            Constant:
+0:39              0 (const int)
+0:39        move second child to first child ( temp 4-component vector of float)
+0:39          m_Position: direct index for structure ( temp 4-component vector of float)
+0:39            direct index ( temp structure{ temp 4-component vector of float m_Position,  temp 4-component vector of float m_Normal})
+0:?               'I' ( temp 3-element array of structure{ temp 4-component vector of float m_Position,  temp 4-component vector of float m_Normal})
+0:39              Constant:
+0:39                1 (const int)
+0:39            Constant:
+0:39              0 (const int)
+0:39          direct index ( in 4-component vector of float Position)
+0:?             'I.m_Position' ( in 3-element array of 4-component vector of float Position)
+0:39            Constant:
+0:39              1 (const int)
+0:39        move second child to first child ( temp 4-component vector of float)
+0:39          m_Normal: direct index for structure ( temp 4-component vector of float)
+0:39            direct index ( temp structure{ temp 4-component vector of float m_Position,  temp 4-component vector of float m_Normal})
+0:?               'I' ( temp 3-element array of structure{ temp 4-component vector of float m_Position,  temp 4-component vector of float m_Normal})
+0:39              Constant:
+0:39                1 (const int)
+0:39            Constant:
+0:39              1 (const int)
+0:39          m_Normal: direct index for structure ( temp 4-component vector of float)
+0:39            direct index (layout( location=0) in structure{ temp 4-component vector of float m_Normal})
+0:39              'I' (layout( location=0) in 3-element array of structure{ temp 4-component vector of float m_Normal})
+0:39              Constant:
+0:39                1 (const int)
+0:39            Constant:
+0:39              0 (const int)
+0:39        move second child to first child ( temp 4-component vector of float)
+0:39          m_Position: direct index for structure ( temp 4-component vector of float)
+0:39            direct index ( temp structure{ temp 4-component vector of float m_Position,  temp 4-component vector of float m_Normal})
+0:?               'I' ( temp 3-element array of structure{ temp 4-component vector of float m_Position,  temp 4-component vector of float m_Normal})
+0:39              Constant:
+0:39                2 (const int)
+0:39            Constant:
+0:39              0 (const int)
+0:39          direct index ( in 4-component vector of float Position)
+0:?             'I.m_Position' ( in 3-element array of 4-component vector of float Position)
+0:39            Constant:
+0:39              2 (const int)
+0:39        move second child to first child ( temp 4-component vector of float)
+0:39          m_Normal: direct index for structure ( temp 4-component vector of float)
+0:39            direct index ( temp structure{ temp 4-component vector of float m_Position,  temp 4-component vector of float m_Normal})
+0:?               'I' ( temp 3-element array of structure{ temp 4-component vector of float m_Position,  temp 4-component vector of float m_Normal})
+0:39              Constant:
+0:39                2 (const int)
+0:39            Constant:
+0:39              1 (const int)
+0:39          m_Normal: direct index for structure ( temp 4-component vector of float)
+0:39            direct index (layout( location=0) in structure{ temp 4-component vector of float m_Normal})
+0:39              'I' (layout( location=0) in 3-element array of structure{ temp 4-component vector of float m_Normal})
+0:39              Constant:
+0:39                2 (const int)
+0:39            Constant:
+0:39              0 (const int)
+0:39      move second child to first child ( temp uint)
+0:?         'cpid' ( temp uint)
+0:?         'cpid' ( in uint InvocationID)
+0:39      Sequence
+0:39        move second child to first child ( temp 4-component vector of float)
+0:39          indirect index ( out 4-component vector of float Position)
+0:?             '@entryPointOutput.m_Position' ( out 3-element array of 4-component vector of float Position)
+0:?             'cpid' ( in uint InvocationID)
+0:39          m_Position: direct index for structure ( temp 4-component vector of float)
+0:39            Function Call: @main(struct-HS_Input-vf4-vf41[3];u1; ( temp structure{ temp 4-component vector of float m_Position})
+0:?               'I' ( temp 3-element array of structure{ temp 4-component vector of float m_Position,  temp 4-component vector of float m_Normal})
+0:?               'cpid' ( temp uint)
+0:39            Constant:
+0:39              0 (const int)
+0:?       Barrier ( temp void)
+0:?       Test condition and select ( temp void)
+0:?         Condition
+0:?         Compare Equal ( temp bool)
+0:?           'cpid' ( in uint InvocationID)
+0:?           Constant:
+0:?             0 (const int)
+0:?         true case
+0:?         Sequence
+0:?           move second child to first child ( temp structure{ temp 3-element array of float fTessFactor,  temp float fInsideTessFactor})
+0:?             '@patchConstantResult' ( temp structure{ temp 3-element array of float fTessFactor,  temp float fInsideTessFactor})
+0:?             Function Call: HS_ConstFunc(struct-HS_Input-vf4-vf41[3]; ( temp structure{ temp 3-element array of float fTessFactor,  temp float fInsideTessFactor})
+0:?               'I' ( temp 3-element array of structure{ temp 4-component vector of float m_Position,  temp 4-component vector of float m_Normal})
+0:?           Sequence
+0:?             move second child to first child ( temp float)
+0:?               direct index ( patch out float TessLevelOuter)
+0:?                 '@patchConstantOutput.fTessFactor' ( patch out 4-element array of float TessLevelOuter)
+0:?                 Constant:
+0:?                   0 (const int)
+0:?               direct index ( temp float)
+0:?                 fTessFactor: direct index for structure ( temp 3-element array of float)
+0:?                   '@patchConstantResult' ( temp structure{ temp 3-element array of float fTessFactor,  temp float fInsideTessFactor})
+0:?                   Constant:
+0:?                     0 (const int)
+0:?                 Constant:
+0:?                   0 (const int)
+0:?             move second child to first child ( temp float)
+0:?               direct index ( patch out float TessLevelOuter)
+0:?                 '@patchConstantOutput.fTessFactor' ( patch out 4-element array of float TessLevelOuter)
+0:?                 Constant:
+0:?                   1 (const int)
+0:?               direct index ( temp float)
+0:?                 fTessFactor: direct index for structure ( temp 3-element array of float)
+0:?                   '@patchConstantResult' ( temp structure{ temp 3-element array of float fTessFactor,  temp float fInsideTessFactor})
+0:?                   Constant:
+0:?                     0 (const int)
+0:?                 Constant:
+0:?                   1 (const int)
+0:?             move second child to first child ( temp float)
+0:?               direct index ( patch out float TessLevelOuter)
+0:?                 '@patchConstantOutput.fTessFactor' ( patch out 4-element array of float TessLevelOuter)
+0:?                 Constant:
+0:?                   2 (const int)
+0:?               direct index ( temp float)
+0:?                 fTessFactor: direct index for structure ( temp 3-element array of float)
+0:?                   '@patchConstantResult' ( temp structure{ temp 3-element array of float fTessFactor,  temp float fInsideTessFactor})
+0:?                   Constant:
+0:?                     0 (const int)
+0:?                 Constant:
+0:?                   2 (const int)
+0:?             move second child to first child ( temp float)
+0:?               direct index ( patch out float TessLevelInner)
+0:?                 '@patchConstantOutput.fInsideTessFactor' ( patch out 2-element array of float TessLevelInner)
+0:?                 Constant:
+0:?                   0 (const int)
+0:?               fInsideTessFactor: direct index for structure ( temp float)
+0:?                 '@patchConstantResult' ( temp structure{ temp 3-element array of float fTessFactor,  temp float fInsideTessFactor})
+0:?                 Constant:
+0:?                   1 (const int)
+0:?   Linker Objects
+0:?     '@entryPointOutput.m_Position' ( out 3-element array of 4-component vector of float Position)
+0:?     'I.m_Position' ( in 3-element array of 4-component vector of float Position)
+0:?     'I' (layout( location=0) in 3-element array of structure{ temp 4-component vector of float m_Normal})
+0:?     'cpid' ( in uint InvocationID)
+0:?     '@patchConstantOutput.fTessFactor' ( patch out 4-element array of float TessLevelOuter)
+0:?     '@patchConstantOutput.fInsideTessFactor' ( patch out 2-element array of float TessLevelInner)
+
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 127
+
+                              Capability Tessellation
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint TessellationControl 4  "main" 56 64 83 86 110 123
+                              ExecutionMode 4 OutputVertices 3
+                              ExecutionMode 4 Triangles
+                              ExecutionMode 4 SpacingFractionalOdd
+                              ExecutionMode 4 VertexOrderCw
+                              Source HLSL 500
+                              Name 4  "main"
+                              Name 8  "HS_Input"
+                              MemberName 8(HS_Input) 0  "m_Position"
+                              MemberName 8(HS_Input) 1  "m_Normal"
+                              Name 14  "HS_Output"
+                              MemberName 14(HS_Output) 0  "fTessFactor"
+                              MemberName 14(HS_Output) 1  "fInsideTessFactor"
+                              Name 17  "HS_ConstFunc(struct-HS_Input-vf4-vf41[3];"
+                              Name 16  "I"
+                              Name 20  "HS_Main_Output"
+                              MemberName 20(HS_Main_Output) 0  "m_Position"
+                              Name 24  "@main(struct-HS_Input-vf4-vf41[3];u1;"
+                              Name 22  "I"
+                              Name 23  "cpid"
+                              Name 27  "O"
+                              Name 45  "output"
+                              Name 53  "I"
+                              Name 56  "I.m_Position"
+                              Name 61  "HS_Input"
+                              MemberName 61(HS_Input) 0  "m_Normal"
+                              Name 64  "I"
+                              Name 81  "cpid"
+                              Name 83  "cpid"
+                              Name 86  "@entryPointOutput.m_Position"
+                              Name 88  "param"
+                              Name 90  "param"
+                              Name 104  "@patchConstantResult"
+                              Name 105  "param"
+                              Name 110  "@patchConstantOutput.fTessFactor"
+                              Name 123  "@patchConstantOutput.fInsideTessFactor"
+                              Decorate 56(I.m_Position) BuiltIn Position
+                              Decorate 64(I) Location 0
+                              Decorate 83(cpid) BuiltIn InvocationId
+                              Decorate 86(@entryPointOutput.m_Position) BuiltIn Position
+                              Decorate 110(@patchConstantOutput.fTessFactor) Patch
+                              Decorate 110(@patchConstantOutput.fTessFactor) BuiltIn TessLevelOuter
+                              Decorate 123(@patchConstantOutput.fInsideTessFactor) Patch
+                              Decorate 123(@patchConstantOutput.fInsideTessFactor) BuiltIn TessLevelInner
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+     8(HS_Input):             TypeStruct 7(fvec4) 7(fvec4)
+               9:             TypeInt 32 0
+              10:      9(int) Constant 3
+              11:             TypeArray 8(HS_Input) 10
+              12:             TypePointer Function 11
+              13:             TypeArray 6(float) 10
+   14(HS_Output):             TypeStruct 13 6(float)
+              15:             TypeFunction 14(HS_Output) 12(ptr)
+              19:             TypePointer Function 9(int)
+20(HS_Main_Output):             TypeStruct 7(fvec4)
+              21:             TypeFunction 20(HS_Main_Output) 12(ptr) 19(ptr)
+              26:             TypePointer Function 14(HS_Output)
+              28:    6(float) Constant 0
+              29:          13 ConstantComposite 28 28 28
+              30:14(HS_Output) ConstantComposite 29 28
+              31:             TypeInt 32 1
+              32:     31(int) Constant 1
+              33:     31(int) Constant 0
+              34:             TypePointer Function 6(float)
+              44:             TypePointer Function 20(HS_Main_Output)
+              46:    7(fvec4) ConstantComposite 28 28 28 28
+              47:20(HS_Main_Output) ConstantComposite 46
+              48:             TypePointer Function 7(fvec4)
+              54:             TypeArray 7(fvec4) 10
+              55:             TypePointer Input 54
+56(I.m_Position):     55(ptr) Variable Input
+              57:             TypePointer Input 7(fvec4)
+    61(HS_Input):             TypeStruct 7(fvec4)
+              62:             TypeArray 61(HS_Input) 10
+              63:             TypePointer Input 62
+           64(I):     63(ptr) Variable Input
+              74:     31(int) Constant 2
+              82:             TypePointer Input 9(int)
+        83(cpid):     82(ptr) Variable Input
+              85:             TypePointer Output 54
+86(@entryPointOutput.m_Position):     85(ptr) Variable Output
+              94:             TypePointer Output 7(fvec4)
+              96:      9(int) Constant 2
+              97:      9(int) Constant 4
+              98:      9(int) Constant 0
+             100:             TypeBool
+             108:             TypeArray 6(float) 97
+             109:             TypePointer Output 108
+110(@patchConstantOutput.fTessFactor):    109(ptr) Variable Output
+             113:             TypePointer Output 6(float)
+             121:             TypeArray 6(float) 96
+             122:             TypePointer Output 121
+123(@patchConstantOutput.fInsideTessFactor):    122(ptr) Variable Output
+         4(main):           2 Function None 3
+               5:             Label
+           53(I):     12(ptr) Variable Function
+        81(cpid):     19(ptr) Variable Function
+       88(param):     12(ptr) Variable Function
+       90(param):     19(ptr) Variable Function
+104(@patchConstantResult):     26(ptr) Variable Function
+      105(param):     12(ptr) Variable Function
+              58:     57(ptr) AccessChain 56(I.m_Position) 33
+              59:    7(fvec4) Load 58
+              60:     48(ptr) AccessChain 53(I) 33 33
+                              Store 60 59
+              65:     57(ptr) AccessChain 64(I) 33 33
+              66:    7(fvec4) Load 65
+              67:     48(ptr) AccessChain 53(I) 33 32
+                              Store 67 66
+              68:     57(ptr) AccessChain 56(I.m_Position) 32
+              69:    7(fvec4) Load 68
+              70:     48(ptr) AccessChain 53(I) 32 33
+                              Store 70 69
+              71:     57(ptr) AccessChain 64(I) 32 33
+              72:    7(fvec4) Load 71
+              73:     48(ptr) AccessChain 53(I) 32 32
+                              Store 73 72
+              75:     57(ptr) AccessChain 56(I.m_Position) 74
+              76:    7(fvec4) Load 75
+              77:     48(ptr) AccessChain 53(I) 74 33
+                              Store 77 76
+              78:     57(ptr) AccessChain 64(I) 74 33
+              79:    7(fvec4) Load 78
+              80:     48(ptr) AccessChain 53(I) 74 32
+                              Store 80 79
+              84:      9(int) Load 83(cpid)
+                              Store 81(cpid) 84
+              87:      9(int) Load 83(cpid)
+              89:          11 Load 53(I)
+                              Store 88(param) 89
+              91:      9(int) Load 81(cpid)
+                              Store 90(param) 91
+              92:20(HS_Main_Output) FunctionCall 24(@main(struct-HS_Input-vf4-vf41[3];u1;) 88(param) 90(param)
+              93:    7(fvec4) CompositeExtract 92 0
+              95:     94(ptr) AccessChain 86(@entryPointOutput.m_Position) 87
+                              Store 95 93
+                              ControlBarrier 96 97 98
+              99:      9(int) Load 83(cpid)
+             101:   100(bool) IEqual 99 33
+                              SelectionMerge 103 None
+                              BranchConditional 101 102 103
+             102:               Label
+             106:          11   Load 53(I)
+                                Store 105(param) 106
+             107:14(HS_Output)   FunctionCall 17(HS_ConstFunc(struct-HS_Input-vf4-vf41[3];) 105(param)
+                                Store 104(@patchConstantResult) 107
+             111:     34(ptr)   AccessChain 104(@patchConstantResult) 33 33
+             112:    6(float)   Load 111
+             114:    113(ptr)   AccessChain 110(@patchConstantOutput.fTessFactor) 33
+                                Store 114 112
+             115:     34(ptr)   AccessChain 104(@patchConstantResult) 33 32
+             116:    6(float)   Load 115
+             117:    113(ptr)   AccessChain 110(@patchConstantOutput.fTessFactor) 32
+                                Store 117 116
+             118:     34(ptr)   AccessChain 104(@patchConstantResult) 33 74
+             119:    6(float)   Load 118
+             120:    113(ptr)   AccessChain 110(@patchConstantOutput.fTessFactor) 74
+                                Store 120 119
+             124:     34(ptr)   AccessChain 104(@patchConstantResult) 32
+             125:    6(float)   Load 124
+             126:    113(ptr)   AccessChain 123(@patchConstantOutput.fInsideTessFactor) 33
+                                Store 126 125
+                                Branch 103
+             103:             Label
+                              Return
+                              FunctionEnd
+17(HS_ConstFunc(struct-HS_Input-vf4-vf41[3];):14(HS_Output) Function None 15
+           16(I):     12(ptr) FunctionParameter
+              18:             Label
+           27(O):     26(ptr) Variable Function
+                              Store 27(O) 30
+              35:     34(ptr) AccessChain 16(I) 33 33 10
+              36:    6(float) Load 35
+              37:     34(ptr) AccessChain 16(I) 33 32 10
+              38:    6(float) Load 37
+              39:    6(float) FAdd 36 38
+              40:     34(ptr) AccessChain 27(O) 32
+                              Store 40 39
+              41:14(HS_Output) Load 27(O)
+                              ReturnValue 41
+                              FunctionEnd
+24(@main(struct-HS_Input-vf4-vf41[3];u1;):20(HS_Main_Output) Function None 21
+           22(I):     12(ptr) FunctionParameter
+        23(cpid):     19(ptr) FunctionParameter
+              25:             Label
+      45(output):     44(ptr) Variable Function
+                              Store 45(output) 47
+              49:     48(ptr) AccessChain 45(output) 33
+                              Store 49 46
+              50:20(HS_Main_Output) Load 45(output)
+                              ReturnValue 50
+                              FunctionEnd
diff --git a/Test/baseResults/hlsl.hull.5.tesc.out b/Test/baseResults/hlsl.hull.5.tesc.out
new file mode 100644
index 0000000..656427b
--- /dev/null
+++ b/Test/baseResults/hlsl.hull.5.tesc.out
@@ -0,0 +1,188 @@
+hlsl.hull.5.tesc
+ERROR: 0:0: '' : unimplemented: PCF input patch without entry point input patch parameter 
+ERROR: 1 compilation errors.  No code generated.
+
+
+Shader version: 500
+vertices = 3
+vertex spacing = fractional_odd_spacing
+triangle order = cw
+ERROR: node is still EOpNull!
+0:25  Function Definition: HS_ConstFunc(struct-HS_Input-vf4-vf41[3]; ( temp structure{ temp 3-element array of float fTessFactor,  temp float fInsideTessFactor})
+0:25    Function Parameters: 
+0:25      'I' ( in 3-element array of structure{ temp 4-component vector of float m_Position,  temp 4-component vector of float m_Normal})
+0:?     Sequence
+0:26      Sequence
+0:26        move second child to first child ( temp structure{ temp 3-element array of float fTessFactor,  temp float fInsideTessFactor})
+0:26          'O' ( temp structure{ temp 3-element array of float fTessFactor,  temp float fInsideTessFactor})
+0:26          Constant:
+0:26            0.000000
+0:26            0.000000
+0:26            0.000000
+0:26            0.000000
+0:28      move second child to first child ( temp float)
+0:28        fInsideTessFactor: direct index for structure ( temp float)
+0:28          'O' ( temp structure{ temp 3-element array of float fTessFactor,  temp float fInsideTessFactor})
+0:28          Constant:
+0:28            1 (const int)
+0:28        add ( temp float)
+0:28          direct index ( temp float)
+0:28            m_Position: direct index for structure ( temp 4-component vector of float)
+0:28              direct index ( temp structure{ temp 4-component vector of float m_Position,  temp 4-component vector of float m_Normal})
+0:28                'I' ( in 3-element array of structure{ temp 4-component vector of float m_Position,  temp 4-component vector of float m_Normal})
+0:28                Constant:
+0:28                  0 (const int)
+0:28              Constant:
+0:28                0 (const int)
+0:28            Constant:
+0:28              3 (const int)
+0:28          direct index ( temp float)
+0:28            m_Normal: direct index for structure ( temp 4-component vector of float)
+0:28              direct index ( temp structure{ temp 4-component vector of float m_Position,  temp 4-component vector of float m_Normal})
+0:28                'I' ( in 3-element array of structure{ temp 4-component vector of float m_Position,  temp 4-component vector of float m_Normal})
+0:28                Constant:
+0:28                  0 (const int)
+0:28              Constant:
+0:28                1 (const int)
+0:28            Constant:
+0:28              3 (const int)
+0:30      Branch: Return with expression
+0:30        'O' ( temp structure{ temp 3-element array of float fTessFactor,  temp float fInsideTessFactor})
+0:39  Function Definition: @main(u1; ( temp structure{ temp 4-component vector of float m_Position})
+0:39    Function Parameters: 
+0:39      'cpid' ( in uint)
+0:?     Sequence
+0:40      Sequence
+0:40        move second child to first child ( temp structure{ temp 4-component vector of float m_Position})
+0:40          'output' ( temp structure{ temp 4-component vector of float m_Position})
+0:40          Constant:
+0:40            0.000000
+0:40            0.000000
+0:40            0.000000
+0:40            0.000000
+0:41      move second child to first child ( temp 4-component vector of float)
+0:41        m_Position: direct index for structure ( temp 4-component vector of float)
+0:41          'output' ( temp structure{ temp 4-component vector of float m_Position})
+0:41          Constant:
+0:41            0 (const int)
+0:41        Constant:
+0:41          0.000000
+0:41          0.000000
+0:41          0.000000
+0:41          0.000000
+0:42      Branch: Return with expression
+0:42        'output' ( temp structure{ temp 4-component vector of float m_Position})
+0:39  Function Definition: main( ( temp void)
+0:39    Function Parameters: 
+0:?     Sequence
+0:39      move second child to first child ( temp uint)
+0:?         'cpid' ( temp uint)
+0:?         'cpid' ( in uint InvocationID)
+0:39      Sequence
+0:39        move second child to first child ( temp 4-component vector of float)
+0:39          indirect index ( out 4-component vector of float Position)
+0:?             '@entryPointOutput.m_Position' ( out 3-element array of 4-component vector of float Position)
+0:?             'cpid' ( in uint InvocationID)
+0:39          m_Position: direct index for structure ( temp 4-component vector of float)
+0:39            Function Call: @main(u1; ( temp structure{ temp 4-component vector of float m_Position})
+0:?               'cpid' ( temp uint)
+0:39            Constant:
+0:39              0 (const int)
+0:?   Linker Objects
+0:?     '@entryPointOutput.m_Position' ( out 3-element array of 4-component vector of float Position)
+0:?     'cpid' ( in uint InvocationID)
+
+
+Linked tessellation control stage:
+
+
+Shader version: 500
+vertices = 3
+vertex spacing = fractional_odd_spacing
+triangle order = cw
+ERROR: node is still EOpNull!
+0:25  Function Definition: HS_ConstFunc(struct-HS_Input-vf4-vf41[3]; ( temp structure{ temp 3-element array of float fTessFactor,  temp float fInsideTessFactor})
+0:25    Function Parameters: 
+0:25      'I' ( in 3-element array of structure{ temp 4-component vector of float m_Position,  temp 4-component vector of float m_Normal})
+0:?     Sequence
+0:26      Sequence
+0:26        move second child to first child ( temp structure{ temp 3-element array of float fTessFactor,  temp float fInsideTessFactor})
+0:26          'O' ( temp structure{ temp 3-element array of float fTessFactor,  temp float fInsideTessFactor})
+0:26          Constant:
+0:26            0.000000
+0:26            0.000000
+0:26            0.000000
+0:26            0.000000
+0:28      move second child to first child ( temp float)
+0:28        fInsideTessFactor: direct index for structure ( temp float)
+0:28          'O' ( temp structure{ temp 3-element array of float fTessFactor,  temp float fInsideTessFactor})
+0:28          Constant:
+0:28            1 (const int)
+0:28        add ( temp float)
+0:28          direct index ( temp float)
+0:28            m_Position: direct index for structure ( temp 4-component vector of float)
+0:28              direct index ( temp structure{ temp 4-component vector of float m_Position,  temp 4-component vector of float m_Normal})
+0:28                'I' ( in 3-element array of structure{ temp 4-component vector of float m_Position,  temp 4-component vector of float m_Normal})
+0:28                Constant:
+0:28                  0 (const int)
+0:28              Constant:
+0:28                0 (const int)
+0:28            Constant:
+0:28              3 (const int)
+0:28          direct index ( temp float)
+0:28            m_Normal: direct index for structure ( temp 4-component vector of float)
+0:28              direct index ( temp structure{ temp 4-component vector of float m_Position,  temp 4-component vector of float m_Normal})
+0:28                'I' ( in 3-element array of structure{ temp 4-component vector of float m_Position,  temp 4-component vector of float m_Normal})
+0:28                Constant:
+0:28                  0 (const int)
+0:28              Constant:
+0:28                1 (const int)
+0:28            Constant:
+0:28              3 (const int)
+0:30      Branch: Return with expression
+0:30        'O' ( temp structure{ temp 3-element array of float fTessFactor,  temp float fInsideTessFactor})
+0:39  Function Definition: @main(u1; ( temp structure{ temp 4-component vector of float m_Position})
+0:39    Function Parameters: 
+0:39      'cpid' ( in uint)
+0:?     Sequence
+0:40      Sequence
+0:40        move second child to first child ( temp structure{ temp 4-component vector of float m_Position})
+0:40          'output' ( temp structure{ temp 4-component vector of float m_Position})
+0:40          Constant:
+0:40            0.000000
+0:40            0.000000
+0:40            0.000000
+0:40            0.000000
+0:41      move second child to first child ( temp 4-component vector of float)
+0:41        m_Position: direct index for structure ( temp 4-component vector of float)
+0:41          'output' ( temp structure{ temp 4-component vector of float m_Position})
+0:41          Constant:
+0:41            0 (const int)
+0:41        Constant:
+0:41          0.000000
+0:41          0.000000
+0:41          0.000000
+0:41          0.000000
+0:42      Branch: Return with expression
+0:42        'output' ( temp structure{ temp 4-component vector of float m_Position})
+0:39  Function Definition: main( ( temp void)
+0:39    Function Parameters: 
+0:?     Sequence
+0:39      move second child to first child ( temp uint)
+0:?         'cpid' ( temp uint)
+0:?         'cpid' ( in uint InvocationID)
+0:39      Sequence
+0:39        move second child to first child ( temp 4-component vector of float)
+0:39          indirect index ( out 4-component vector of float Position)
+0:?             '@entryPointOutput.m_Position' ( out 3-element array of 4-component vector of float Position)
+0:?             'cpid' ( in uint InvocationID)
+0:39          m_Position: direct index for structure ( temp 4-component vector of float)
+0:39            Function Call: @main(u1; ( temp structure{ temp 4-component vector of float m_Position})
+0:?               'cpid' ( temp uint)
+0:39            Constant:
+0:39              0 (const int)
+0:?   Linker Objects
+0:?     '@entryPointOutput.m_Position' ( out 3-element array of 4-component vector of float Position)
+0:?     'cpid' ( in uint InvocationID)
+
+SPIR-V is not generated for failed compile or link
diff --git a/Test/baseResults/hlsl.hull.ctrlpt-1.tesc.out b/Test/baseResults/hlsl.hull.ctrlpt-1.tesc.out
index 3d2ff3d..41f3c0a 100644
--- a/Test/baseResults/hlsl.hull.ctrlpt-1.tesc.out
+++ b/Test/baseResults/hlsl.hull.ctrlpt-1.tesc.out
@@ -29,7 +29,7 @@
 0:?         'cpid' ( temp uint)
 0:?         'cpid' ( in uint InvocationID)
 0:27      move second child to first child ( temp structure{ temp 3-component vector of float val})
-0:27        indirect index ( temp structure{ temp 3-component vector of float val})
+0:27        indirect index (layout( location=0) out structure{ temp 3-component vector of float val})
 0:?           '@entryPointOutput' (layout( location=0) out 3-element array of structure{ temp 3-component vector of float val})
 0:?           'cpid' ( in uint InvocationID)
 0:27        Function Call: @main(struct-hs_in_t-vf31[3];u1; ( temp structure{ temp 3-component vector of float val})
@@ -78,7 +78,7 @@
 0:?           Sequence
 0:?             move second child to first child ( temp float)
 0:?               direct index ( patch out float TessLevelOuter)
-0:?                 '@patchConstantOutput_tfactor' ( patch out 4-element array of float TessLevelOuter)
+0:?                 '@patchConstantOutput.tfactor' ( patch out 4-element array of float TessLevelOuter)
 0:?                 Constant:
 0:?                   0 (const int)
 0:?               direct index ( temp float)
@@ -90,7 +90,7 @@
 0:?                   0 (const int)
 0:?             move second child to first child ( temp float)
 0:?               direct index ( patch out float TessLevelOuter)
-0:?                 '@patchConstantOutput_tfactor' ( patch out 4-element array of float TessLevelOuter)
+0:?                 '@patchConstantOutput.tfactor' ( patch out 4-element array of float TessLevelOuter)
 0:?                 Constant:
 0:?                   1 (const int)
 0:?               direct index ( temp float)
@@ -102,7 +102,7 @@
 0:?                   1 (const int)
 0:?             move second child to first child ( temp float)
 0:?               direct index ( patch out float TessLevelOuter)
-0:?                 '@patchConstantOutput_tfactor' ( patch out 4-element array of float TessLevelOuter)
+0:?                 '@patchConstantOutput.tfactor' ( patch out 4-element array of float TessLevelOuter)
 0:?                 Constant:
 0:?                   2 (const int)
 0:?               direct index ( temp float)
@@ -114,7 +114,7 @@
 0:?                   2 (const int)
 0:?             move second child to first child ( temp float)
 0:?               direct index ( patch out float TessLevelInner)
-0:?                 '@patchConstantOutput_flInFactor' ( patch out 2-element array of float TessLevelInner)
+0:?                 '@patchConstantOutput.flInFactor' ( patch out 2-element array of float TessLevelInner)
 0:?                 Constant:
 0:?                   0 (const int)
 0:?               flInFactor: direct index for structure ( temp float)
@@ -192,9 +192,8 @@
 0:?     '@entryPointOutput' (layout( location=0) out 3-element array of structure{ temp 3-component vector of float val})
 0:?     'i' (layout( location=0) in 3-element array of structure{ temp 3-component vector of float val})
 0:?     'cpid' ( in uint InvocationID)
-0:?     '@patchConstantOutput' (layout( location=1) patch out structure{})
-0:?     '@patchConstantOutput_tfactor' ( patch out 4-element array of float TessLevelOuter)
-0:?     '@patchConstantOutput_flInFactor' ( patch out 2-element array of float TessLevelInner)
+0:?     '@patchConstantOutput.tfactor' ( patch out 4-element array of float TessLevelOuter)
+0:?     '@patchConstantOutput.flInFactor' ( patch out 2-element array of float TessLevelInner)
 
 
 Linked tessellation control stage:
@@ -230,7 +229,7 @@
 0:?         'cpid' ( temp uint)
 0:?         'cpid' ( in uint InvocationID)
 0:27      move second child to first child ( temp structure{ temp 3-component vector of float val})
-0:27        indirect index ( temp structure{ temp 3-component vector of float val})
+0:27        indirect index (layout( location=0) out structure{ temp 3-component vector of float val})
 0:?           '@entryPointOutput' (layout( location=0) out 3-element array of structure{ temp 3-component vector of float val})
 0:?           'cpid' ( in uint InvocationID)
 0:27        Function Call: @main(struct-hs_in_t-vf31[3];u1; ( temp structure{ temp 3-component vector of float val})
@@ -279,7 +278,7 @@
 0:?           Sequence
 0:?             move second child to first child ( temp float)
 0:?               direct index ( patch out float TessLevelOuter)
-0:?                 '@patchConstantOutput_tfactor' ( patch out 4-element array of float TessLevelOuter)
+0:?                 '@patchConstantOutput.tfactor' ( patch out 4-element array of float TessLevelOuter)
 0:?                 Constant:
 0:?                   0 (const int)
 0:?               direct index ( temp float)
@@ -291,7 +290,7 @@
 0:?                   0 (const int)
 0:?             move second child to first child ( temp float)
 0:?               direct index ( patch out float TessLevelOuter)
-0:?                 '@patchConstantOutput_tfactor' ( patch out 4-element array of float TessLevelOuter)
+0:?                 '@patchConstantOutput.tfactor' ( patch out 4-element array of float TessLevelOuter)
 0:?                 Constant:
 0:?                   1 (const int)
 0:?               direct index ( temp float)
@@ -303,7 +302,7 @@
 0:?                   1 (const int)
 0:?             move second child to first child ( temp float)
 0:?               direct index ( patch out float TessLevelOuter)
-0:?                 '@patchConstantOutput_tfactor' ( patch out 4-element array of float TessLevelOuter)
+0:?                 '@patchConstantOutput.tfactor' ( patch out 4-element array of float TessLevelOuter)
 0:?                 Constant:
 0:?                   2 (const int)
 0:?               direct index ( temp float)
@@ -315,7 +314,7 @@
 0:?                   2 (const int)
 0:?             move second child to first child ( temp float)
 0:?               direct index ( patch out float TessLevelInner)
-0:?                 '@patchConstantOutput_flInFactor' ( patch out 2-element array of float TessLevelInner)
+0:?                 '@patchConstantOutput.flInFactor' ( patch out 2-element array of float TessLevelInner)
 0:?                 Constant:
 0:?                   0 (const int)
 0:?               flInFactor: direct index for structure ( temp float)
@@ -393,18 +392,17 @@
 0:?     '@entryPointOutput' (layout( location=0) out 3-element array of structure{ temp 3-component vector of float val})
 0:?     'i' (layout( location=0) in 3-element array of structure{ temp 3-component vector of float val})
 0:?     'cpid' ( in uint InvocationID)
-0:?     '@patchConstantOutput' (layout( location=1) patch out structure{})
-0:?     '@patchConstantOutput_tfactor' ( patch out 4-element array of float TessLevelOuter)
-0:?     '@patchConstantOutput_flInFactor' ( patch out 2-element array of float TessLevelInner)
+0:?     '@patchConstantOutput.tfactor' ( patch out 4-element array of float TessLevelOuter)
+0:?     '@patchConstantOutput.flInFactor' ( patch out 2-element array of float TessLevelInner)
 
 // Module Version 10000
-// Generated by (magic number): 80001
-// Id's are bound by 127
+// Generated by (magic number): 80007
+// Id's are bound by 124
 
                               Capability Tessellation
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint TessellationControl 4  "main" 41 45 48 94 108 126
+                              EntryPoint TessellationControl 4  "main" 41 45 48 94 108
                               ExecutionMode 4 OutputVertices 3
                               ExecutionMode 4 Triangles
                               ExecutionMode 4 SpacingFractionalOdd
@@ -436,26 +434,22 @@
                               Name 68  "param"
                               Name 70  "param"
                               Name 74  "i"
-                              Name 75  "param"
-                              Name 77  "param"
-                              Name 81  "i"
-                              Name 82  "param"
-                              Name 84  "param"
-                              Name 88  "@patchConstantResult"
-                              Name 94  "@patchConstantOutput_tfactor"
-                              Name 108  "@patchConstantOutput_flInFactor"
+                              Name 76  "param"
+                              Name 78  "param"
+                              Name 82  "i"
+                              Name 83  "param"
+                              Name 85  "param"
+                              Name 89  "@patchConstantResult"
+                              Name 94  "@patchConstantOutput.tfactor"
+                              Name 108  "@patchConstantOutput.flInFactor"
                               Name 112  "o"
-                              Name 124  "hs_pcf_t"
-                              Name 126  "@patchConstantOutput"
                               Decorate 41(i) Location 0
                               Decorate 45(cpid) BuiltIn InvocationId
                               Decorate 48(@entryPointOutput) Location 0
-                              Decorate 94(@patchConstantOutput_tfactor) Patch
-                              Decorate 94(@patchConstantOutput_tfactor) BuiltIn TessLevelOuter
-                              Decorate 108(@patchConstantOutput_flInFactor) Patch
-                              Decorate 108(@patchConstantOutput_flInFactor) BuiltIn TessLevelInner
-                              Decorate 126(@patchConstantOutput) Patch
-                              Decorate 126(@patchConstantOutput) Location 1
+                              Decorate 94(@patchConstantOutput.tfactor) Patch
+                              Decorate 94(@patchConstantOutput.tfactor) BuiltIn TessLevelOuter
+                              Decorate 108(@patchConstantOutput.flInFactor) Patch
+                              Decorate 108(@patchConstantOutput.flInFactor) BuiltIn TessLevelInner
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -484,26 +478,23 @@
 48(@entryPointOutput):     47(ptr) Variable Output
               55:             TypePointer Output 14(hs_out_t)
               57:      9(int) Constant 2
-              58:      9(int) Constant 1
+              58:      9(int) Constant 4
               59:      9(int) Constant 0
               61:             TypeBool
               65:             TypePointer Function 20
               73:     29(int) Constant 1
-              80:     29(int) Constant 2
-              87:             TypePointer Function 22(hs_pcf_t)
-              91:      9(int) Constant 4
-              92:             TypeArray 6(float) 91
+              75:      9(int) Constant 1
+              81:     29(int) Constant 2
+              88:             TypePointer Function 22(hs_pcf_t)
+              92:             TypeArray 6(float) 58
               93:             TypePointer Output 92
-94(@patchConstantOutput_tfactor):     93(ptr) Variable Output
+94(@patchConstantOutput.tfactor):     93(ptr) Variable Output
               95:             TypePointer Function 6(float)
               98:             TypePointer Output 6(float)
              106:             TypeArray 6(float) 57
              107:             TypePointer Output 106
-108(@patchConstantOutput_flInFactor):    107(ptr) Variable Output
+108(@patchConstantOutput.flInFactor):    107(ptr) Variable Output
              119:    6(float) Constant 1082130432
-   124(hs_pcf_t):             TypeStruct
-             125:             TypePointer Output 124(hs_pcf_t)
-126(@patchConstantOutput):    125(ptr) Variable Output
          4(main):           2 Function None 3
                5:             Label
            39(i):     12(ptr) Variable Function
@@ -515,12 +506,12 @@
        68(param):     12(ptr) Variable Function
        70(param):     13(ptr) Variable Function
            74(i):     12(ptr) Variable Function
-       75(param):     12(ptr) Variable Function
-       77(param):     13(ptr) Variable Function
-           81(i):     12(ptr) Variable Function
-       82(param):     12(ptr) Variable Function
-       84(param):     13(ptr) Variable Function
-88(@patchConstantResult):     87(ptr) Variable Function
+       76(param):     12(ptr) Variable Function
+       78(param):     13(ptr) Variable Function
+           82(i):     12(ptr) Variable Function
+       83(param):     12(ptr) Variable Function
+       85(param):     13(ptr) Variable Function
+89(@patchConstantResult):     88(ptr) Variable Function
               42:          11 Load 41(i)
                               Store 39(i) 42
               46:      9(int) Load 45(cpid)
@@ -545,36 +536,36 @@
               71:14(hs_out_t)   FunctionCall 18(@main(struct-hs_in_t-vf31[3];u1;) 68(param) 70(param)
               72:     27(ptr)   AccessChain 66(pcf_out) 30
                                 Store 72 71
-              76:          11   Load 74(i)
-                                Store 75(param) 76
-                                Store 77(param) 58
-              78:14(hs_out_t)   FunctionCall 18(@main(struct-hs_in_t-vf31[3];u1;) 75(param) 77(param)
-              79:     27(ptr)   AccessChain 66(pcf_out) 73
-                                Store 79 78
-              83:          11   Load 81(i)
-                                Store 82(param) 83
-                                Store 84(param) 57
-              85:14(hs_out_t)   FunctionCall 18(@main(struct-hs_in_t-vf31[3];u1;) 82(param) 84(param)
-              86:     27(ptr)   AccessChain 66(pcf_out) 80
-                                Store 86 85
-              89:          20   Load 66(pcf_out)
-              90:22(hs_pcf_t)   FunctionCall 25(PCF(struct-hs_out_t-vf31[3];) 89
-                                Store 88(@patchConstantResult) 90
-              96:     95(ptr)   AccessChain 88(@patchConstantResult) 30 30
+              77:          11   Load 74(i)
+                                Store 76(param) 77
+                                Store 78(param) 75
+              79:14(hs_out_t)   FunctionCall 18(@main(struct-hs_in_t-vf31[3];u1;) 76(param) 78(param)
+              80:     27(ptr)   AccessChain 66(pcf_out) 73
+                                Store 80 79
+              84:          11   Load 82(i)
+                                Store 83(param) 84
+                                Store 85(param) 57
+              86:14(hs_out_t)   FunctionCall 18(@main(struct-hs_in_t-vf31[3];u1;) 83(param) 85(param)
+              87:     27(ptr)   AccessChain 66(pcf_out) 81
+                                Store 87 86
+              90:          20   Load 66(pcf_out)
+              91:22(hs_pcf_t)   FunctionCall 25(PCF(struct-hs_out_t-vf31[3];) 90
+                                Store 89(@patchConstantResult) 91
+              96:     95(ptr)   AccessChain 89(@patchConstantResult) 30 30
               97:    6(float)   Load 96
-              99:     98(ptr)   AccessChain 94(@patchConstantOutput_tfactor) 30
+              99:     98(ptr)   AccessChain 94(@patchConstantOutput.tfactor) 30
                                 Store 99 97
-             100:     95(ptr)   AccessChain 88(@patchConstantResult) 30 73
+             100:     95(ptr)   AccessChain 89(@patchConstantResult) 30 73
              101:    6(float)   Load 100
-             102:     98(ptr)   AccessChain 94(@patchConstantOutput_tfactor) 73
+             102:     98(ptr)   AccessChain 94(@patchConstantOutput.tfactor) 73
                                 Store 102 101
-             103:     95(ptr)   AccessChain 88(@patchConstantResult) 30 80
+             103:     95(ptr)   AccessChain 89(@patchConstantResult) 30 81
              104:    6(float)   Load 103
-             105:     98(ptr)   AccessChain 94(@patchConstantOutput_tfactor) 80
+             105:     98(ptr)   AccessChain 94(@patchConstantOutput.tfactor) 81
                                 Store 105 104
-             109:     95(ptr)   AccessChain 88(@patchConstantResult) 73
+             109:     95(ptr)   AccessChain 89(@patchConstantResult) 73
              110:    6(float)   Load 109
-             111:     98(ptr)   AccessChain 108(@patchConstantOutput_flInFactor) 30
+             111:     98(ptr)   AccessChain 108(@patchConstantOutput.flInFactor) 30
                                 Store 111 110
                                 Branch 64
               64:             Label
@@ -596,7 +587,7 @@
 25(PCF(struct-hs_out_t-vf31[3];):22(hs_pcf_t) Function None 23
      24(pcf_out):          20 FunctionParameter
               26:             Label
-          112(o):     87(ptr) Variable Function
+          112(o):     88(ptr) Variable Function
              113:    6(float) CompositeExtract 24(pcf_out) 0 0 0
              114:     95(ptr) AccessChain 112(o) 30 30
                               Store 114 113
@@ -604,7 +595,7 @@
              116:     95(ptr) AccessChain 112(o) 30 73
                               Store 116 115
              117:    6(float) CompositeExtract 24(pcf_out) 2 0 0
-             118:     95(ptr) AccessChain 112(o) 30 80
+             118:     95(ptr) AccessChain 112(o) 30 81
                               Store 118 117
              120:     95(ptr) AccessChain 112(o) 73
                               Store 120 119
diff --git a/Test/baseResults/hlsl.hull.ctrlpt-2.tesc.out b/Test/baseResults/hlsl.hull.ctrlpt-2.tesc.out
index 29ab61d..986e110 100644
--- a/Test/baseResults/hlsl.hull.ctrlpt-2.tesc.out
+++ b/Test/baseResults/hlsl.hull.ctrlpt-2.tesc.out
@@ -36,7 +36,7 @@
 0:?         'cpid' ( temp uint)
 0:?         'cpid' ( in uint InvocationID)
 0:28      move second child to first child ( temp structure{ temp 3-component vector of float val})
-0:28        indirect index ( temp structure{ temp 3-component vector of float val})
+0:28        indirect index (layout( location=0) out structure{ temp 3-component vector of float val})
 0:?           '@entryPointOutput' (layout( location=0) out 3-element array of structure{ temp 3-component vector of float val})
 0:?           'cpid' ( in uint InvocationID)
 0:28        Function Call: @main(struct-hs_in_t-vf31[3];u1; ( temp structure{ temp 3-component vector of float val})
@@ -82,11 +82,11 @@
 0:?             '@patchConstantResult' ( temp structure{ temp 3-element array of float tfactor,  temp float flInFactor})
 0:?             Function Call: PCF(struct-hs_out_t-vf31[3];struct-hs_in_t-vf31[3]; ( temp structure{ temp 3-element array of float tfactor,  temp float flInFactor})
 0:?               'pcf_out' ( temp 3-element array of structure{ temp 3-component vector of float val})
-0:?               'i' (layout( location=0) in 3-element array of structure{ temp 3-component vector of float val})
+0:?               'i' ( temp 3-element array of structure{ temp 3-component vector of float val})
 0:?           Sequence
 0:?             move second child to first child ( temp float)
 0:?               direct index ( patch out float TessLevelOuter)
-0:?                 '@patchConstantOutput_tfactor' ( patch out 4-element array of float TessLevelOuter)
+0:?                 '@patchConstantOutput.tfactor' ( patch out 4-element array of float TessLevelOuter)
 0:?                 Constant:
 0:?                   0 (const int)
 0:?               direct index ( temp float)
@@ -98,7 +98,7 @@
 0:?                   0 (const int)
 0:?             move second child to first child ( temp float)
 0:?               direct index ( patch out float TessLevelOuter)
-0:?                 '@patchConstantOutput_tfactor' ( patch out 4-element array of float TessLevelOuter)
+0:?                 '@patchConstantOutput.tfactor' ( patch out 4-element array of float TessLevelOuter)
 0:?                 Constant:
 0:?                   1 (const int)
 0:?               direct index ( temp float)
@@ -110,7 +110,7 @@
 0:?                   1 (const int)
 0:?             move second child to first child ( temp float)
 0:?               direct index ( patch out float TessLevelOuter)
-0:?                 '@patchConstantOutput_tfactor' ( patch out 4-element array of float TessLevelOuter)
+0:?                 '@patchConstantOutput.tfactor' ( patch out 4-element array of float TessLevelOuter)
 0:?                 Constant:
 0:?                   2 (const int)
 0:?               direct index ( temp float)
@@ -122,7 +122,7 @@
 0:?                   2 (const int)
 0:?             move second child to first child ( temp float)
 0:?               direct index ( patch out float TessLevelInner)
-0:?                 '@patchConstantOutput_flInFactor' ( patch out 2-element array of float TessLevelInner)
+0:?                 '@patchConstantOutput.flInFactor' ( patch out 2-element array of float TessLevelInner)
 0:?                 Constant:
 0:?                   0 (const int)
 0:?               flInFactor: direct index for structure ( temp float)
@@ -201,9 +201,8 @@
 0:?     '@entryPointOutput' (layout( location=0) out 3-element array of structure{ temp 3-component vector of float val})
 0:?     'i' (layout( location=0) in 3-element array of structure{ temp 3-component vector of float val})
 0:?     'cpid' ( in uint InvocationID)
-0:?     '@patchConstantOutput' (layout( location=1) patch out structure{})
-0:?     '@patchConstantOutput_tfactor' ( patch out 4-element array of float TessLevelOuter)
-0:?     '@patchConstantOutput_flInFactor' ( patch out 2-element array of float TessLevelInner)
+0:?     '@patchConstantOutput.tfactor' ( patch out 4-element array of float TessLevelOuter)
+0:?     '@patchConstantOutput.flInFactor' ( patch out 2-element array of float TessLevelInner)
 
 
 Linked tessellation control stage:
@@ -246,7 +245,7 @@
 0:?         'cpid' ( temp uint)
 0:?         'cpid' ( in uint InvocationID)
 0:28      move second child to first child ( temp structure{ temp 3-component vector of float val})
-0:28        indirect index ( temp structure{ temp 3-component vector of float val})
+0:28        indirect index (layout( location=0) out structure{ temp 3-component vector of float val})
 0:?           '@entryPointOutput' (layout( location=0) out 3-element array of structure{ temp 3-component vector of float val})
 0:?           'cpid' ( in uint InvocationID)
 0:28        Function Call: @main(struct-hs_in_t-vf31[3];u1; ( temp structure{ temp 3-component vector of float val})
@@ -292,11 +291,11 @@
 0:?             '@patchConstantResult' ( temp structure{ temp 3-element array of float tfactor,  temp float flInFactor})
 0:?             Function Call: PCF(struct-hs_out_t-vf31[3];struct-hs_in_t-vf31[3]; ( temp structure{ temp 3-element array of float tfactor,  temp float flInFactor})
 0:?               'pcf_out' ( temp 3-element array of structure{ temp 3-component vector of float val})
-0:?               'i' (layout( location=0) in 3-element array of structure{ temp 3-component vector of float val})
+0:?               'i' ( temp 3-element array of structure{ temp 3-component vector of float val})
 0:?           Sequence
 0:?             move second child to first child ( temp float)
 0:?               direct index ( patch out float TessLevelOuter)
-0:?                 '@patchConstantOutput_tfactor' ( patch out 4-element array of float TessLevelOuter)
+0:?                 '@patchConstantOutput.tfactor' ( patch out 4-element array of float TessLevelOuter)
 0:?                 Constant:
 0:?                   0 (const int)
 0:?               direct index ( temp float)
@@ -308,7 +307,7 @@
 0:?                   0 (const int)
 0:?             move second child to first child ( temp float)
 0:?               direct index ( patch out float TessLevelOuter)
-0:?                 '@patchConstantOutput_tfactor' ( patch out 4-element array of float TessLevelOuter)
+0:?                 '@patchConstantOutput.tfactor' ( patch out 4-element array of float TessLevelOuter)
 0:?                 Constant:
 0:?                   1 (const int)
 0:?               direct index ( temp float)
@@ -320,7 +319,7 @@
 0:?                   1 (const int)
 0:?             move second child to first child ( temp float)
 0:?               direct index ( patch out float TessLevelOuter)
-0:?                 '@patchConstantOutput_tfactor' ( patch out 4-element array of float TessLevelOuter)
+0:?                 '@patchConstantOutput.tfactor' ( patch out 4-element array of float TessLevelOuter)
 0:?                 Constant:
 0:?                   2 (const int)
 0:?               direct index ( temp float)
@@ -332,7 +331,7 @@
 0:?                   2 (const int)
 0:?             move second child to first child ( temp float)
 0:?               direct index ( patch out float TessLevelInner)
-0:?                 '@patchConstantOutput_flInFactor' ( patch out 2-element array of float TessLevelInner)
+0:?                 '@patchConstantOutput.flInFactor' ( patch out 2-element array of float TessLevelInner)
 0:?                 Constant:
 0:?                   0 (const int)
 0:?               flInFactor: direct index for structure ( temp float)
@@ -411,18 +410,17 @@
 0:?     '@entryPointOutput' (layout( location=0) out 3-element array of structure{ temp 3-component vector of float val})
 0:?     'i' (layout( location=0) in 3-element array of structure{ temp 3-component vector of float val})
 0:?     'cpid' ( in uint InvocationID)
-0:?     '@patchConstantOutput' (layout( location=1) patch out structure{})
-0:?     '@patchConstantOutput_tfactor' ( patch out 4-element array of float TessLevelOuter)
-0:?     '@patchConstantOutput_flInFactor' ( patch out 2-element array of float TessLevelInner)
+0:?     '@patchConstantOutput.tfactor' ( patch out 4-element array of float TessLevelOuter)
+0:?     '@patchConstantOutput.flInFactor' ( patch out 2-element array of float TessLevelInner)
 
 // Module Version 10000
-// Generated by (magic number): 80001
-// Id's are bound by 129
+// Generated by (magic number): 80007
+// Id's are bound by 126
 
                               Capability Tessellation
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint TessellationControl 4  "main" 42 46 49 96 110 128
+                              EntryPoint TessellationControl 4  "main" 42 46 49 96 110
                               ExecutionMode 4 OutputVertices 3
                               ExecutionMode 4 Triangles
                               ExecutionMode 4 SpacingFractionalOdd
@@ -455,26 +453,22 @@
                               Name 69  "param"
                               Name 71  "param"
                               Name 75  "i"
-                              Name 76  "param"
-                              Name 78  "param"
-                              Name 82  "i"
-                              Name 83  "param"
-                              Name 85  "param"
-                              Name 89  "@patchConstantResult"
-                              Name 96  "@patchConstantOutput_tfactor"
-                              Name 110  "@patchConstantOutput_flInFactor"
+                              Name 77  "param"
+                              Name 79  "param"
+                              Name 83  "i"
+                              Name 84  "param"
+                              Name 86  "param"
+                              Name 90  "@patchConstantResult"
+                              Name 96  "@patchConstantOutput.tfactor"
+                              Name 110  "@patchConstantOutput.flInFactor"
                               Name 114  "o"
-                              Name 126  "hs_pcf_t"
-                              Name 128  "@patchConstantOutput"
                               Decorate 42(i) Location 0
                               Decorate 46(cpid) BuiltIn InvocationId
                               Decorate 49(@entryPointOutput) Location 0
-                              Decorate 96(@patchConstantOutput_tfactor) Patch
-                              Decorate 96(@patchConstantOutput_tfactor) BuiltIn TessLevelOuter
-                              Decorate 110(@patchConstantOutput_flInFactor) Patch
-                              Decorate 110(@patchConstantOutput_flInFactor) BuiltIn TessLevelInner
-                              Decorate 128(@patchConstantOutput) Patch
-                              Decorate 128(@patchConstantOutput) Location 1
+                              Decorate 96(@patchConstantOutput.tfactor) Patch
+                              Decorate 96(@patchConstantOutput.tfactor) BuiltIn TessLevelOuter
+                              Decorate 110(@patchConstantOutput.flInFactor) Patch
+                              Decorate 110(@patchConstantOutput.flInFactor) BuiltIn TessLevelInner
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -503,26 +497,23 @@
 49(@entryPointOutput):     48(ptr) Variable Output
               56:             TypePointer Output 14(hs_out_t)
               58:      9(int) Constant 2
-              59:      9(int) Constant 1
+              59:      9(int) Constant 4
               60:      9(int) Constant 0
               62:             TypeBool
               66:             TypePointer Function 20
               74:     28(int) Constant 1
-              81:     28(int) Constant 2
-              88:             TypePointer Function 22(hs_pcf_t)
-              93:      9(int) Constant 4
-              94:             TypeArray 6(float) 93
+              76:      9(int) Constant 1
+              82:     28(int) Constant 2
+              89:             TypePointer Function 22(hs_pcf_t)
+              94:             TypeArray 6(float) 59
               95:             TypePointer Output 94
-96(@patchConstantOutput_tfactor):     95(ptr) Variable Output
+96(@patchConstantOutput.tfactor):     95(ptr) Variable Output
               97:             TypePointer Function 6(float)
              100:             TypePointer Output 6(float)
              108:             TypeArray 6(float) 58
              109:             TypePointer Output 108
-110(@patchConstantOutput_flInFactor):    109(ptr) Variable Output
+110(@patchConstantOutput.flInFactor):    109(ptr) Variable Output
              121:    6(float) Constant 1082130432
-   126(hs_pcf_t):             TypeStruct
-             127:             TypePointer Output 126(hs_pcf_t)
-128(@patchConstantOutput):    127(ptr) Variable Output
          4(main):           2 Function None 3
                5:             Label
            40(i):     12(ptr) Variable Function
@@ -534,12 +525,12 @@
        69(param):     12(ptr) Variable Function
        71(param):     13(ptr) Variable Function
            75(i):     12(ptr) Variable Function
-       76(param):     12(ptr) Variable Function
-       78(param):     13(ptr) Variable Function
-           82(i):     12(ptr) Variable Function
-       83(param):     12(ptr) Variable Function
-       85(param):     13(ptr) Variable Function
-89(@patchConstantResult):     88(ptr) Variable Function
+       77(param):     12(ptr) Variable Function
+       79(param):     13(ptr) Variable Function
+           83(i):     12(ptr) Variable Function
+       84(param):     12(ptr) Variable Function
+       86(param):     13(ptr) Variable Function
+90(@patchConstantResult):     89(ptr) Variable Function
               43:          11 Load 42(i)
                               Store 40(i) 43
               47:      9(int) Load 46(cpid)
@@ -564,37 +555,37 @@
               72:14(hs_out_t)   FunctionCall 18(@main(struct-hs_in_t-vf31[3];u1;) 69(param) 71(param)
               73:     30(ptr)   AccessChain 67(pcf_out) 29
                                 Store 73 72
-              77:          11   Load 75(i)
-                                Store 76(param) 77
-                                Store 78(param) 59
-              79:14(hs_out_t)   FunctionCall 18(@main(struct-hs_in_t-vf31[3];u1;) 76(param) 78(param)
-              80:     30(ptr)   AccessChain 67(pcf_out) 74
-                                Store 80 79
-              84:          11   Load 82(i)
-                                Store 83(param) 84
-                                Store 85(param) 58
-              86:14(hs_out_t)   FunctionCall 18(@main(struct-hs_in_t-vf31[3];u1;) 83(param) 85(param)
-              87:     30(ptr)   AccessChain 67(pcf_out) 81
-                                Store 87 86
-              90:          20   Load 67(pcf_out)
-              91:          11   Load 42(i)
-              92:22(hs_pcf_t)   FunctionCall 26(PCF(struct-hs_out_t-vf31[3];struct-hs_in_t-vf31[3];) 90 91
-                                Store 89(@patchConstantResult) 92
-              98:     97(ptr)   AccessChain 89(@patchConstantResult) 29 29
+              78:          11   Load 75(i)
+                                Store 77(param) 78
+                                Store 79(param) 76
+              80:14(hs_out_t)   FunctionCall 18(@main(struct-hs_in_t-vf31[3];u1;) 77(param) 79(param)
+              81:     30(ptr)   AccessChain 67(pcf_out) 74
+                                Store 81 80
+              85:          11   Load 83(i)
+                                Store 84(param) 85
+                                Store 86(param) 58
+              87:14(hs_out_t)   FunctionCall 18(@main(struct-hs_in_t-vf31[3];u1;) 84(param) 86(param)
+              88:     30(ptr)   AccessChain 67(pcf_out) 82
+                                Store 88 87
+              91:          20   Load 67(pcf_out)
+              92:          11   Load 40(i)
+              93:22(hs_pcf_t)   FunctionCall 26(PCF(struct-hs_out_t-vf31[3];struct-hs_in_t-vf31[3];) 91 92
+                                Store 90(@patchConstantResult) 93
+              98:     97(ptr)   AccessChain 90(@patchConstantResult) 29 29
               99:    6(float)   Load 98
-             101:    100(ptr)   AccessChain 96(@patchConstantOutput_tfactor) 29
+             101:    100(ptr)   AccessChain 96(@patchConstantOutput.tfactor) 29
                                 Store 101 99
-             102:     97(ptr)   AccessChain 89(@patchConstantResult) 29 74
+             102:     97(ptr)   AccessChain 90(@patchConstantResult) 29 74
              103:    6(float)   Load 102
-             104:    100(ptr)   AccessChain 96(@patchConstantOutput_tfactor) 74
+             104:    100(ptr)   AccessChain 96(@patchConstantOutput.tfactor) 74
                                 Store 104 103
-             105:     97(ptr)   AccessChain 89(@patchConstantResult) 29 81
+             105:     97(ptr)   AccessChain 90(@patchConstantResult) 29 82
              106:    6(float)   Load 105
-             107:    100(ptr)   AccessChain 96(@patchConstantOutput_tfactor) 81
+             107:    100(ptr)   AccessChain 96(@patchConstantOutput.tfactor) 82
                                 Store 107 106
-             111:     97(ptr)   AccessChain 89(@patchConstantResult) 74
+             111:     97(ptr)   AccessChain 90(@patchConstantResult) 74
              112:    6(float)   Load 111
-             113:    100(ptr)   AccessChain 110(@patchConstantOutput_flInFactor) 29
+             113:    100(ptr)   AccessChain 110(@patchConstantOutput.flInFactor) 29
                                 Store 113 112
                                 Branch 65
               65:             Label
@@ -617,7 +608,7 @@
      24(pcf_out):          20 FunctionParameter
       25(pcf_in):          11 FunctionParameter
               27:             Label
-          114(o):     88(ptr) Variable Function
+          114(o):     89(ptr) Variable Function
              115:    6(float) CompositeExtract 24(pcf_out) 0 0 0
              116:     97(ptr) AccessChain 114(o) 29 29
                               Store 116 115
@@ -625,7 +616,7 @@
              118:     97(ptr) AccessChain 114(o) 29 74
                               Store 118 117
              119:    6(float) CompositeExtract 24(pcf_out) 2 0 0
-             120:     97(ptr) AccessChain 114(o) 29 81
+             120:     97(ptr) AccessChain 114(o) 29 82
                               Store 120 119
              122:     97(ptr) AccessChain 114(o) 74
                               Store 122 121
diff --git a/Test/baseResults/hlsl.hull.void.tesc.out b/Test/baseResults/hlsl.hull.void.tesc.out
index b6e417a..c44c7e4 100644
--- a/Test/baseResults/hlsl.hull.void.tesc.out
+++ b/Test/baseResults/hlsl.hull.void.tesc.out
@@ -2,6 +2,7 @@
 Shader version: 500
 vertices = 3
 vertex spacing = fractional_even_spacing
+triangle order = ccw
 0:? Sequence
 0:26  Function Definition: @main(struct-VS_OUT-vf31[3]; ( temp structure{ temp 3-component vector of float cpoint})
 0:26    Function Parameters: 
@@ -28,7 +29,7 @@
 0:?         'ip' ( temp 3-element array of structure{ temp 3-component vector of float cpoint})
 0:?         'ip' (layout( location=0) in 3-element array of structure{ temp 3-component vector of float cpoint})
 0:26      move second child to first child ( temp structure{ temp 3-component vector of float cpoint})
-0:26        indirect index ( temp structure{ temp 3-component vector of float cpoint})
+0:26        indirect index (layout( location=0) out structure{ temp 3-component vector of float cpoint})
 0:?           '@entryPointOutput' (layout( location=0) out 3-element array of structure{ temp 3-component vector of float cpoint})
 0:?           'InvocationId' ( in uint InvocationID)
 0:26        Function Call: @main(struct-VS_OUT-vf31[3]; ( temp structure{ temp 3-component vector of float cpoint})
@@ -57,6 +58,7 @@
 Shader version: 500
 vertices = 3
 vertex spacing = fractional_even_spacing
+triangle order = ccw
 0:? Sequence
 0:26  Function Definition: @main(struct-VS_OUT-vf31[3]; ( temp structure{ temp 3-component vector of float cpoint})
 0:26    Function Parameters: 
@@ -83,7 +85,7 @@
 0:?         'ip' ( temp 3-element array of structure{ temp 3-component vector of float cpoint})
 0:?         'ip' (layout( location=0) in 3-element array of structure{ temp 3-component vector of float cpoint})
 0:26      move second child to first child ( temp structure{ temp 3-component vector of float cpoint})
-0:26        indirect index ( temp structure{ temp 3-component vector of float cpoint})
+0:26        indirect index (layout( location=0) out structure{ temp 3-component vector of float cpoint})
 0:?           '@entryPointOutput' (layout( location=0) out 3-element array of structure{ temp 3-component vector of float cpoint})
 0:?           'InvocationId' ( in uint InvocationID)
 0:26        Function Call: @main(struct-VS_OUT-vf31[3]; ( temp structure{ temp 3-component vector of float cpoint})
@@ -106,7 +108,7 @@
 0:?     'InvocationId' ( in uint InvocationID)
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 55
 
                               Capability Tessellation
@@ -116,6 +118,7 @@
                               ExecutionMode 4 OutputVertices 3
                               ExecutionMode 4 Triangles
                               ExecutionMode 4 SpacingFractionalEven
+                              ExecutionMode 4 VertexOrderCcw
                               Source HLSL 500
                               Name 4  "main"
                               Name 8  "VS_OUT"
@@ -158,7 +161,7 @@
 39(InvocationId):     38(ptr) Variable Input
               44:             TypePointer Output 13(HS_OUT)
               46:      9(int) Constant 2
-              47:      9(int) Constant 1
+              47:      9(int) Constant 4
               48:      9(int) Constant 0
               50:             TypeBool
          4(main):           2 Function None 3
diff --git a/Test/baseResults/hlsl.identifier.sample.frag.out b/Test/baseResults/hlsl.identifier.sample.frag.out
index a8870b1..a23451e 100644
--- a/Test/baseResults/hlsl.identifier.sample.frag.out
+++ b/Test/baseResults/hlsl.identifier.sample.frag.out
@@ -86,7 +86,7 @@
 0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 33
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.if.frag.out b/Test/baseResults/hlsl.if.frag.out
old mode 100755
new mode 100644
index 89e0bb1..056b672
--- a/Test/baseResults/hlsl.if.frag.out
+++ b/Test/baseResults/hlsl.if.frag.out
@@ -42,7 +42,7 @@
 0:14            'input' ( in 4-component vector of float)
 0:14            'input' ( in 4-component vector of float)
 0:14        true case is null
-0:19      Test condition and select ( temp void)
+0:19      Test condition and select ( temp void): Flatten
 0:19        Condition
 0:19        all ( temp bool)
 0:19          Equal ( temp 4-component vector of bool)
@@ -152,7 +152,7 @@
 0:14            'input' ( in 4-component vector of float)
 0:14            'input' ( in 4-component vector of float)
 0:14        true case is null
-0:19      Test condition and select ( temp void)
+0:19      Test condition and select ( temp void): Flatten
 0:19        Condition
 0:19        all ( temp bool)
 0:19          Equal ( temp 4-component vector of bool)
@@ -216,7 +216,7 @@
 0:?     'input' (layout( location=0) in 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 103
 
                               Capability Shader
@@ -319,7 +319,7 @@
               48:    7(fvec4) Load 10(input)
               49:   16(bvec4) FOrdEqual 47 48
               50:    15(bool) All 49
-                              SelectionMerge 52 None
+                              SelectionMerge 52 Flatten 
                               BranchConditional 50 51 52
               51:               Label
               53:    7(fvec4)   Load 10(input)
diff --git a/Test/baseResults/hlsl.imagefetch-subvec4.comp.out b/Test/baseResults/hlsl.imagefetch-subvec4.comp.out
new file mode 100644
index 0000000..721aeea
--- /dev/null
+++ b/Test/baseResults/hlsl.imagefetch-subvec4.comp.out
@@ -0,0 +1,142 @@
+hlsl.imagefetch-subvec4.comp
+Shader version: 500
+local_size = (8, 8, 8)
+0:? Sequence
+0:6  Function Definition: @main(vu3; ( temp void)
+0:6    Function Parameters: 
+0:6      'tid' ( in 3-component vector of uint)
+0:?     Sequence
+0:7      Sequence
+0:7        move second child to first child ( temp uint)
+0:7          'storeTemp' ( temp uint)
+0:7          Convert int to uint ( temp uint)
+0:7            textureFetch ( temp int)
+0:7              'IN' (layout( binding=0) uniform itexture3D)
+0:7              'tid' ( in 3-component vector of uint)
+0:7              Constant:
+0:7                0 (const int)
+0:7        imageStore ( temp void)
+0:7          'OUT' (layout( binding=1 r32ui) uniform uimage3D)
+0:7          'tid' ( in 3-component vector of uint)
+0:7          'storeTemp' ( temp uint)
+0:7        'storeTemp' ( temp uint)
+0:6  Function Definition: main( ( temp void)
+0:6    Function Parameters: 
+0:?     Sequence
+0:6      move second child to first child ( temp 3-component vector of uint)
+0:?         'tid' ( temp 3-component vector of uint)
+0:?         'tid' ( in 3-component vector of uint GlobalInvocationID)
+0:6      Function Call: @main(vu3; ( temp void)
+0:?         'tid' ( temp 3-component vector of uint)
+0:?   Linker Objects
+0:?     'IN' (layout( binding=0) uniform itexture3D)
+0:?     'OUT' (layout( binding=1 r32ui) uniform uimage3D)
+0:?     'tid' ( in 3-component vector of uint GlobalInvocationID)
+
+
+Linked compute stage:
+
+
+Shader version: 500
+local_size = (8, 8, 8)
+0:? Sequence
+0:6  Function Definition: @main(vu3; ( temp void)
+0:6    Function Parameters: 
+0:6      'tid' ( in 3-component vector of uint)
+0:?     Sequence
+0:7      Sequence
+0:7        move second child to first child ( temp uint)
+0:7          'storeTemp' ( temp uint)
+0:7          Convert int to uint ( temp uint)
+0:7            textureFetch ( temp int)
+0:7              'IN' (layout( binding=0) uniform itexture3D)
+0:7              'tid' ( in 3-component vector of uint)
+0:7              Constant:
+0:7                0 (const int)
+0:7        imageStore ( temp void)
+0:7          'OUT' (layout( binding=1 r32ui) uniform uimage3D)
+0:7          'tid' ( in 3-component vector of uint)
+0:7          'storeTemp' ( temp uint)
+0:7        'storeTemp' ( temp uint)
+0:6  Function Definition: main( ( temp void)
+0:6    Function Parameters: 
+0:?     Sequence
+0:6      move second child to first child ( temp 3-component vector of uint)
+0:?         'tid' ( temp 3-component vector of uint)
+0:?         'tid' ( in 3-component vector of uint GlobalInvocationID)
+0:6      Function Call: @main(vu3; ( temp void)
+0:?         'tid' ( temp 3-component vector of uint)
+0:?   Linker Objects
+0:?     'IN' (layout( binding=0) uniform itexture3D)
+0:?     'OUT' (layout( binding=1 r32ui) uniform uimage3D)
+0:?     'tid' ( in 3-component vector of uint GlobalInvocationID)
+
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 39
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint GLCompute 4  "main" 34
+                              ExecutionMode 4 LocalSize 8 8 8
+                              Source HLSL 500
+                              Name 4  "main"
+                              Name 11  "@main(vu3;"
+                              Name 10  "tid"
+                              Name 14  "storeTemp"
+                              Name 18  "IN"
+                              Name 28  "OUT"
+                              Name 32  "tid"
+                              Name 34  "tid"
+                              Name 36  "param"
+                              Decorate 18(IN) DescriptorSet 0
+                              Decorate 18(IN) Binding 0
+                              Decorate 28(OUT) DescriptorSet 0
+                              Decorate 28(OUT) Binding 1
+                              Decorate 34(tid) BuiltIn GlobalInvocationId
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeInt 32 0
+               7:             TypeVector 6(int) 3
+               8:             TypePointer Function 7(ivec3)
+               9:             TypeFunction 2 8(ptr)
+              13:             TypePointer Function 6(int)
+              15:             TypeInt 32 1
+              16:             TypeImage 15(int) 3D sampled format:Unknown
+              17:             TypePointer UniformConstant 16
+          18(IN):     17(ptr) Variable UniformConstant
+              21:     15(int) Constant 0
+              22:             TypeVector 15(int) 4
+              26:             TypeImage 6(int) 3D nonsampled format:R32ui
+              27:             TypePointer UniformConstant 26
+         28(OUT):     27(ptr) Variable UniformConstant
+              33:             TypePointer Input 7(ivec3)
+         34(tid):     33(ptr) Variable Input
+         4(main):           2 Function None 3
+               5:             Label
+         32(tid):      8(ptr) Variable Function
+       36(param):      8(ptr) Variable Function
+              35:    7(ivec3) Load 34(tid)
+                              Store 32(tid) 35
+              37:    7(ivec3) Load 32(tid)
+                              Store 36(param) 37
+              38:           2 FunctionCall 11(@main(vu3;) 36(param)
+                              Return
+                              FunctionEnd
+  11(@main(vu3;):           2 Function None 9
+         10(tid):      8(ptr) FunctionParameter
+              12:             Label
+   14(storeTemp):     13(ptr) Variable Function
+              19:          16 Load 18(IN)
+              20:    7(ivec3) Load 10(tid)
+              23:   22(ivec4) ImageFetch 19 20 Lod 21
+              24:     15(int) CompositeExtract 23 0
+              25:      6(int) Bitcast 24
+                              Store 14(storeTemp) 25
+              29:          26 Load 28(OUT)
+              30:    7(ivec3) Load 10(tid)
+              31:      6(int) Load 14(storeTemp)
+                              ImageWrite 29 30 31
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/hlsl.implicitBool.frag.out b/Test/baseResults/hlsl.implicitBool.frag.out
old mode 100755
new mode 100644
index 01c0fe5..72894f2
--- a/Test/baseResults/hlsl.implicitBool.frag.out
+++ b/Test/baseResults/hlsl.implicitBool.frag.out
@@ -74,12 +74,11 @@
 0:17                'anon@0' (layout( row_major std140) uniform block{ uniform float condf,  uniform int condi,  uniform 1-component vector of float condf1,  uniform 1-component vector of int condi1})
 0:17                Constant:
 0:17                  1 (const uint)
-0:17            Convert int to bool ( temp bool)
-0:17              Convert float to int ( temp int)
-0:17                condf: direct index for structure ( uniform float)
-0:17                  'anon@0' (layout( row_major std140) uniform block{ uniform float condf,  uniform int condi,  uniform 1-component vector of float condf1,  uniform 1-component vector of int condi1})
-0:17                  Constant:
-0:17                    0 (const uint)
+0:17            Convert float to bool ( temp bool)
+0:17              condf: direct index for structure ( uniform float)
+0:17                'anon@0' (layout( row_major std140) uniform block{ uniform float condf,  uniform int condi,  uniform 1-component vector of float condf1,  uniform 1-component vector of int condi1})
+0:17                Constant:
+0:17                  0 (const uint)
 0:17          Convert float to bool ( temp bool)
 0:17            condf1: direct index for structure ( uniform 1-component vector of float)
 0:17              'anon@0' (layout( row_major std140) uniform block{ uniform float condf,  uniform int condi,  uniform 1-component vector of float condf1,  uniform 1-component vector of int condi1})
@@ -133,7 +132,7 @@
 0:28      Sequence
 0:28        move second child to first child ( temp float)
 0:28          'g' ( temp float)
-0:28          Test condition and select ( temp float)
+0:28          Test condition and select ( temp float): no shortcircuit
 0:28            Condition
 0:28            Convert float to bool ( temp bool)
 0:28              condf: direct index for structure ( uniform float)
@@ -243,12 +242,11 @@
 0:17                'anon@0' (layout( row_major std140) uniform block{ uniform float condf,  uniform int condi,  uniform 1-component vector of float condf1,  uniform 1-component vector of int condi1})
 0:17                Constant:
 0:17                  1 (const uint)
-0:17            Convert int to bool ( temp bool)
-0:17              Convert float to int ( temp int)
-0:17                condf: direct index for structure ( uniform float)
-0:17                  'anon@0' (layout( row_major std140) uniform block{ uniform float condf,  uniform int condi,  uniform 1-component vector of float condf1,  uniform 1-component vector of int condi1})
-0:17                  Constant:
-0:17                    0 (const uint)
+0:17            Convert float to bool ( temp bool)
+0:17              condf: direct index for structure ( uniform float)
+0:17                'anon@0' (layout( row_major std140) uniform block{ uniform float condf,  uniform int condi,  uniform 1-component vector of float condf1,  uniform 1-component vector of int condi1})
+0:17                Constant:
+0:17                  0 (const uint)
 0:17          Convert float to bool ( temp bool)
 0:17            condf1: direct index for structure ( uniform 1-component vector of float)
 0:17              'anon@0' (layout( row_major std140) uniform block{ uniform float condf,  uniform int condi,  uniform 1-component vector of float condf1,  uniform 1-component vector of int condi1})
@@ -302,7 +300,7 @@
 0:28      Sequence
 0:28        move second child to first child ( temp float)
 0:28          'g' ( temp float)
-0:28          Test condition and select ( temp float)
+0:28          Test condition and select ( temp float): no shortcircuit
 0:28            Condition
 0:28            Convert float to bool ( temp bool)
 0:28              condf: direct index for structure ( uniform float)
@@ -334,13 +332,13 @@
 0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80001
-// Id's are bound by 145
+// Generated by (magic number): 80007
+// Id's are bound by 139
 
                               Capability Shader
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "main" 143
+                              EntryPoint Fragment 4  "main" 137
                               ExecutionMode 4 OriginUpperLeft
                               Source HLSL 500
                               Name 4  "main"
@@ -352,17 +350,17 @@
                               MemberName 16($Global) 2  "condf1"
                               MemberName 16($Global) 3  "condi1"
                               Name 18  ""
-                              Name 93  "f"
-                              Name 106  "i"
-                              Name 126  "g"
-                              Name 143  "@entryPointOutput"
+                              Name 87  "f"
+                              Name 100  "i"
+                              Name 120  "g"
+                              Name 137  "@entryPointOutput"
                               MemberDecorate 16($Global) 0 Offset 0
                               MemberDecorate 16($Global) 1 Offset 4
                               MemberDecorate 16($Global) 2 Offset 8
                               MemberDecorate 16($Global) 3 Offset 12
                               Decorate 16($Global) Block
                               Decorate 18 DescriptorSet 0
-                              Decorate 143(@entryPointOutput) Location 0
+                              Decorate 137(@entryPointOutput) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -388,25 +386,25 @@
               53:    6(float) Constant 1077936128
               57:     15(int) Constant 3
               64:    6(float) Constant 1082130432
-              88:    6(float) Constant 1084227584
-              92:             TypePointer Function 6(float)
-             105:             TypePointer Function 15(int)
-             130:    6(float) Constant 1088421888
-             131:    6(float) Constant 1090519040
-             142:             TypePointer Output 7(fvec4)
-143(@entryPointOutput):    142(ptr) Variable Output
+              82:    6(float) Constant 1084227584
+              86:             TypePointer Function 6(float)
+              99:             TypePointer Function 15(int)
+             124:    6(float) Constant 1088421888
+             125:    6(float) Constant 1090519040
+             136:             TypePointer Output 7(fvec4)
+137(@entryPointOutput):    136(ptr) Variable Output
          4(main):           2 Function None 3
                5:             Label
-             144:    7(fvec4) FunctionCall 9(@main()
-                              Store 143(@entryPointOutput) 144
+             138:    7(fvec4) FunctionCall 9(@main()
+                              Store 137(@entryPointOutput) 138
                               Return
                               FunctionEnd
        9(@main():    7(fvec4) Function None 8
               10:             Label
            12(a):     11(ptr) Variable Function
-           93(f):     92(ptr) Variable Function
-          106(i):    105(ptr) Variable Function
-          126(g):     92(ptr) Variable Function
+           87(f):     86(ptr) Variable Function
+          100(i):     99(ptr) Variable Function
+          120(g):     86(ptr) Variable Function
                               Store 12(a) 14
               21:     20(ptr) AccessChain 18 19
               22:     15(int) Load 21
@@ -455,98 +453,86 @@
               68:     20(ptr) AccessChain 18 19
               69:     15(int) Load 68
               70:    23(bool) INotEqual 69 25
-                              SelectionMerge 72 None
-                              BranchConditional 70 71 72
-              71:               Label
-              73:     35(ptr)   AccessChain 18 34
-              74:    6(float)   Load 73
-              75:     15(int)   ConvertFToS 74
-              76:    23(bool)   INotEqual 75 25
-                                Branch 72
-              72:             Label
-              77:    23(bool) Phi 70 62 76 71
-              78:    23(bool) LogicalNot 77
+              71:     35(ptr) AccessChain 18 34
+              72:    6(float) Load 71
+              73:    23(bool) FOrdNotEqual 72 38
+              74:    23(bool) LogicalAnd 70 73
+              75:     35(ptr) AccessChain 18 46
+              76:    6(float) Load 75
+              77:    23(bool) FOrdNotEqual 76 38
+              78:    23(bool) LogicalOr 74 77
                               SelectionMerge 80 None
                               BranchConditional 78 79 80
               79:               Label
-              81:     35(ptr)   AccessChain 18 46
-              82:    6(float)   Load 81
-              83:    23(bool)   FOrdNotEqual 82 38
-                                Branch 80
+              81:    7(fvec4)   Load 12(a)
+              83:    7(fvec4)   CompositeConstruct 82 82 82 82
+              84:    7(fvec4)   FAdd 81 83
+                                ReturnValue 84
               80:             Label
-              84:    23(bool) Phi 77 72 83 79
-                              SelectionMerge 86 None
-                              BranchConditional 84 85 86
-              85:               Label
-              87:    7(fvec4)   Load 12(a)
-              89:    7(fvec4)   CompositeConstruct 88 88 88 88
-              90:    7(fvec4)   FAdd 87 89
-                                ReturnValue 90
-              86:             Label
-              94:     35(ptr) AccessChain 18 34
-              95:    6(float) Load 94
-                              Store 93(f) 95
-                              Branch 96
-              96:             Label
-                              LoopMerge 98 99 None
-                              Branch 100
-             100:             Label
-             101:    6(float) Load 93(f)
-             102:    23(bool) FOrdNotEqual 101 38
-                              BranchConditional 102 97 98
-              97:               Label
-             103:    6(float)   Load 93(f)
-             104:    6(float)   FSub 103 30
-                                Store 93(f) 104
-                                Branch 99
-              99:               Label
-                                Branch 96
-              98:             Label
-             107:     20(ptr) AccessChain 18 19
-             108:     15(int) Load 107
-                              Store 106(i) 108
-                              Branch 109
-             109:             Label
-                              LoopMerge 111 112 None
-                              Branch 110
-             110:             Label
-             113:     15(int) Load 106(i)
-             114:     15(int) ISub 113 19
-                              Store 106(i) 114
-                              Branch 112
-             112:             Label
-             115:     15(int) Load 106(i)
-             116:    23(bool) INotEqual 115 25
-                              BranchConditional 116 109 111
+              88:     35(ptr) AccessChain 18 34
+              89:    6(float) Load 88
+                              Store 87(f) 89
+                              Branch 90
+              90:             Label
+                              LoopMerge 92 93 None
+                              Branch 94
+              94:             Label
+              95:    6(float) Load 87(f)
+              96:    23(bool) FOrdNotEqual 95 38
+                              BranchConditional 96 91 92
+              91:               Label
+              97:    6(float)   Load 87(f)
+              98:    6(float)   FSub 97 30
+                                Store 87(f) 98
+                                Branch 93
+              93:               Label
+                                Branch 90
+              92:             Label
+             101:     20(ptr) AccessChain 18 19
+             102:     15(int) Load 101
+                              Store 100(i) 102
+                              Branch 103
+             103:             Label
+                              LoopMerge 105 106 None
+                              Branch 104
+             104:             Label
+             107:     15(int) Load 100(i)
+             108:     15(int) ISub 107 19
+                              Store 100(i) 108
+                              Branch 106
+             106:             Label
+             109:     15(int) Load 100(i)
+             110:    23(bool) INotEqual 109 25
+                              BranchConditional 110 103 105
+             105:             Label
+                              Branch 111
              111:             Label
-                              Branch 117
-             117:             Label
-                              LoopMerge 119 120 None
-                              Branch 121
-             121:             Label
-             122:     15(int) Load 106(i)
-             123:    23(bool) INotEqual 122 25
-                              BranchConditional 123 118 119
-             118:               Label
-             124:     15(int)   Load 106(i)
-             125:     15(int)   ISub 124 19
-                                Store 106(i) 125
-                                Branch 120
-             120:               Label
-                                Branch 117
-             119:             Label
-             127:     35(ptr) AccessChain 18 34
-             128:    6(float) Load 127
-             129:    23(bool) FOrdNotEqual 128 38
-             132:    6(float) Select 129 130 131
-                              Store 126(g) 132
-             133:    6(float) Load 126(g)
-             134:    7(fvec4) Load 12(a)
-             135:    7(fvec4) CompositeConstruct 133 133 133 133
-             136:    7(fvec4) FAdd 134 135
-                              Store 12(a) 136
-             137:    7(fvec4) Load 12(a)
-             138:    7(fvec4) CompositeConstruct 30 30 30 30
-             139:    7(fvec4) FSub 137 138
-                              ReturnValue 139
+                              LoopMerge 113 114 None
+                              Branch 115
+             115:             Label
+             116:     15(int) Load 100(i)
+             117:    23(bool) INotEqual 116 25
+                              BranchConditional 117 112 113
+             112:               Label
+             118:     15(int)   Load 100(i)
+             119:     15(int)   ISub 118 19
+                                Store 100(i) 119
+                                Branch 114
+             114:               Label
+                                Branch 111
+             113:             Label
+             121:     35(ptr) AccessChain 18 34
+             122:    6(float) Load 121
+             123:    23(bool) FOrdNotEqual 122 38
+             126:    6(float) Select 123 124 125
+                              Store 120(g) 126
+             127:    6(float) Load 120(g)
+             128:    7(fvec4) Load 12(a)
+             129:    7(fvec4) CompositeConstruct 127 127 127 127
+             130:    7(fvec4) FAdd 128 129
+                              Store 12(a) 130
+             131:    7(fvec4) Load 12(a)
+             132:    7(fvec4) CompositeConstruct 30 30 30 30
+             133:    7(fvec4) FSub 131 132
+                              ReturnValue 133
                               FunctionEnd
diff --git a/Test/baseResults/hlsl.include.vert.out b/Test/baseResults/hlsl.include.vert.out
new file mode 100644
index 0000000..020879d
--- /dev/null
+++ b/Test/baseResults/hlsl.include.vert.out
@@ -0,0 +1,75 @@
+../Test/hlsl.include.vert
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 44
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Vertex 4  "main" 42
+                              Source HLSL 500
+                              Name 4  "main"
+                              Name 9  "@main("
+                              Name 11  "$Global"
+                              MemberName 11($Global) 0  "i1"
+                              MemberName 11($Global) 1  "i2"
+                              MemberName 11($Global) 2  "i4"
+                              MemberName 11($Global) 3  "i3"
+                              MemberName 11($Global) 4  "i6"
+                              MemberName 11($Global) 5  "i5"
+                              Name 13  ""
+                              Name 42  "@entryPointOutput"
+                              MemberDecorate 11($Global) 0 Offset 0
+                              MemberDecorate 11($Global) 1 Offset 16
+                              MemberDecorate 11($Global) 2 Offset 32
+                              MemberDecorate 11($Global) 3 Offset 48
+                              MemberDecorate 11($Global) 4 Offset 64
+                              MemberDecorate 11($Global) 5 Offset 80
+                              Decorate 11($Global) Block
+                              Decorate 13 DescriptorSet 0
+                              Decorate 42(@entryPointOutput) BuiltIn Position
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+               8:             TypeFunction 7(fvec4)
+     11($Global):             TypeStruct 7(fvec4) 7(fvec4) 7(fvec4) 7(fvec4) 7(fvec4) 7(fvec4)
+              12:             TypePointer Uniform 11($Global)
+              13:     12(ptr) Variable Uniform
+              14:             TypeInt 32 1
+              15:     14(int) Constant 0
+              16:             TypePointer Uniform 7(fvec4)
+              19:     14(int) Constant 1
+              23:     14(int) Constant 3
+              27:     14(int) Constant 2
+              31:     14(int) Constant 5
+              35:     14(int) Constant 4
+              41:             TypePointer Output 7(fvec4)
+42(@entryPointOutput):     41(ptr) Variable Output
+         4(main):           2 Function None 3
+               5:             Label
+              43:    7(fvec4) FunctionCall 9(@main()
+                              Store 42(@entryPointOutput) 43
+                              Return
+                              FunctionEnd
+       9(@main():    7(fvec4) Function None 8
+              10:             Label
+              17:     16(ptr) AccessChain 13 15
+              18:    7(fvec4) Load 17
+              20:     16(ptr) AccessChain 13 19
+              21:    7(fvec4) Load 20
+              22:    7(fvec4) FAdd 18 21
+              24:     16(ptr) AccessChain 13 23
+              25:    7(fvec4) Load 24
+              26:    7(fvec4) FAdd 22 25
+              28:     16(ptr) AccessChain 13 27
+              29:    7(fvec4) Load 28
+              30:    7(fvec4) FAdd 26 29
+              32:     16(ptr) AccessChain 13 31
+              33:    7(fvec4) Load 32
+              34:    7(fvec4) FAdd 30 33
+              36:     16(ptr) AccessChain 13 35
+              37:    7(fvec4) Load 36
+              38:    7(fvec4) FAdd 34 37
+                              ReturnValue 38
+                              FunctionEnd
diff --git a/Test/baseResults/hlsl.includeNegative.vert.out b/Test/baseResults/hlsl.includeNegative.vert.out
new file mode 100644
index 0000000..5faa383
--- /dev/null
+++ b/Test/baseResults/hlsl.includeNegative.vert.out
@@ -0,0 +1,10 @@
+hlsl.includeNegative.vert
+ERROR: ./foo.h:1: '#error' : should not be included  
+ERROR: ./inc2/../foo.h:1: '#error' : should not be included  
+ERROR: ./parentBad:3: '#error' : bad parent  
+ERROR: hlsl.includeNegative.vert:7: '#error' : in main  
+hlsl.includeNegative.vert(8): error at column 0, HLSL parsing failed.
+ERROR: 5 compilation errors.  No code generated.
+
+
+SPIR-V is not generated for failed compile or link
diff --git a/Test/baseResults/hlsl.inf.vert.out b/Test/baseResults/hlsl.inf.vert.out
old mode 100755
new mode 100644
index ef551e7..1cedc55
--- a/Test/baseResults/hlsl.inf.vert.out
+++ b/Test/baseResults/hlsl.inf.vert.out
@@ -112,7 +112,7 @@
 0:?     '@entryPointOutput' ( out 4-component vector of float Position)
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 37
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.init.frag.out b/Test/baseResults/hlsl.init.frag.out
old mode 100755
new mode 100644
index 119d0c5..9fc816c
--- a/Test/baseResults/hlsl.init.frag.out
+++ b/Test/baseResults/hlsl.init.frag.out
@@ -331,7 +331,7 @@
 0:?     'anon@0' (layout( row_major std140) uniform block{layout( row_major std140) uniform float a, layout( row_major std140) uniform float b, layout( row_major std140) uniform float c})
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 110
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.init2.frag.out b/Test/baseResults/hlsl.init2.frag.out
index 45eca98..9e03de3 100644
--- a/Test/baseResults/hlsl.init2.frag.out
+++ b/Test/baseResults/hlsl.init2.frag.out
@@ -168,13 +168,13 @@
 0:?     Sequence
 0:45      Sequence
 0:45        move second child to first child ( temp 4-component vector of float)
-0:?           'color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.color' (layout( location=0) out 4-component vector of float)
 0:45          color: direct index for structure ( temp 4-component vector of float)
 0:45            Function Call: @main( ( temp structure{ temp 4-component vector of float color})
 0:45            Constant:
 0:45              0 (const int)
 0:?   Linker Objects
-0:?     'color' (layout( location=0) out 4-component vector of float)
+0:?     '@entryPointOutput.color' (layout( location=0) out 4-component vector of float)
 
 
 Linked fragment stage:
@@ -349,16 +349,16 @@
 0:?     Sequence
 0:45      Sequence
 0:45        move second child to first child ( temp 4-component vector of float)
-0:?           'color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.color' (layout( location=0) out 4-component vector of float)
 0:45          color: direct index for structure ( temp 4-component vector of float)
 0:45            Function Call: @main( ( temp structure{ temp 4-component vector of float color})
 0:45            Constant:
 0:45              0 (const int)
 0:?   Linker Objects
-0:?     'color' (layout( location=0) out 4-component vector of float)
+0:?     '@entryPointOutput.color' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 112
 
                               Capability Shader
@@ -392,8 +392,8 @@
                               MemberName 87(two) 1  "b"
                               Name 89  "twoNonConst"
                               Name 99  "ps_output"
-                              Name 109  "color"
-                              Decorate 109(color) Location 0
+                              Name 109  "@entryPointOutput.color"
+                              Decorate 109(@entryPointOutput.color) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                8:             TypeFloat 32
@@ -445,12 +445,12 @@
              102:    9(fvec4) ConstantComposite 18 18 18 18
              103:             TypePointer Function 9(fvec4)
              108:             TypePointer Output 9(fvec4)
-      109(color):    108(ptr) Variable Output
+109(@entryPointOutput.color):    108(ptr) Variable Output
          4(main):           2 Function None 3
                5:             Label
              110:10(PS_OUTPUT) FunctionCall 12(@main()
              111:    9(fvec4) CompositeExtract 110 0
-                              Store 109(color) 111
+                              Store 109(@entryPointOutput.color) 111
                               Return
                               FunctionEnd
        6(Test1():           2 Function None 3
diff --git a/Test/baseResults/hlsl.inoutquals.frag.out b/Test/baseResults/hlsl.inoutquals.frag.out
index d5cce21..42adb1a 100644
--- a/Test/baseResults/hlsl.inoutquals.frag.out
+++ b/Test/baseResults/hlsl.inoutquals.frag.out
@@ -1,12 +1,14 @@
 hlsl.inoutquals.frag
 Shader version: 500
 gl_FragCoord origin is upper left
+using depth_any
 0:? Sequence
-0:8  Function Definition: MyFunc(f1;f1;f1; ( temp void)
+0:8  Function Definition: MyFunc(f1;f1;f1;f1; ( temp void)
 0:8    Function Parameters: 
 0:8      'x' ( in float)
 0:8      'y' ( out float)
 0:8      'z' ( inout float)
+0:8      'w' ( inout float)
 0:?     Sequence
 0:9      move second child to first child ( temp float)
 0:9        'y' ( out float)
@@ -18,78 +20,89 @@
 0:11        'x' ( in float)
 0:11        Constant:
 0:11          -1.000000
-0:15  Function Definition: @main(vf4;i1; ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
-0:15    Function Parameters: 
-0:15      'inpos' ( in 4-component vector of float)
-0:15      'sampleMask' ( out int)
+0:12      multiply second child into first child ( temp float)
+0:12        'w' ( inout float)
+0:12        Constant:
+0:12          1.000000
+0:16  Function Definition: @main(vf4;i1; ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
+0:16    Function Parameters: 
+0:16      'inpos' ( in 4-component vector of float)
+0:16      'sampleMask' ( out int)
 0:?     Sequence
-0:18      Sequence
-0:18        move second child to first child ( temp float)
-0:18          'x' ( temp float)
-0:18          Constant:
-0:18            7.000000
-0:18        move second child to first child ( temp float)
-0:18          'z' ( temp float)
-0:18          Constant:
-0:18            3.000000
-0:19      Function Call: MyFunc(f1;f1;f1; ( temp void)
-0:19        'x' ( temp float)
-0:19        'y' ( temp float)
-0:19        'z' ( temp float)
-0:21      move second child to first child ( temp 4-component vector of float)
-0:21        Color: direct index for structure ( temp 4-component vector of float)
-0:21          'psout' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
-0:21          Constant:
-0:21            0 (const int)
-0:?         Construct vec4 ( temp 4-component vector of float)
-0:21          'x' ( temp float)
-0:21          'y' ( temp float)
-0:21          'z' ( temp float)
-0:21          Constant:
-0:21            1.000000
-0:22      move second child to first child ( temp float)
-0:22        Depth: direct index for structure ( temp float)
+0:19      Sequence
+0:19        move second child to first child ( temp float)
+0:19          'x' ( temp float)
+0:19          Constant:
+0:19            7.000000
+0:19        move second child to first child ( temp float)
+0:19          'z' ( temp float)
+0:19          Constant:
+0:19            3.000000
+0:20      Function Call: MyFunc(f1;f1;f1;f1; ( temp void)
+0:20        'x' ( temp float)
+0:20        'y' ( temp float)
+0:20        'z' ( temp float)
+0:20        direct index ( temp float)
+0:20          'inpos' ( in 4-component vector of float)
+0:20          Constant:
+0:20            3 (const int)
+0:22      move second child to first child ( temp 4-component vector of float)
+0:22        Color: direct index for structure ( temp 4-component vector of float)
 0:22          'psout' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:22          Constant:
-0:22            1 (const int)
-0:22        direct index ( temp float)
-0:22          'inpos' ( in 4-component vector of float)
+0:22            0 (const int)
+0:?         Construct vec4 ( temp 4-component vector of float)
+0:22          'x' ( temp float)
+0:22          'y' ( temp float)
+0:22          'z' ( temp float)
 0:22          Constant:
-0:22            3 (const int)
-0:24      Branch: Return with expression
-0:24        'psout' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
-0:15  Function Definition: main( ( temp void)
-0:15    Function Parameters: 
+0:22            1.000000
+0:23      move second child to first child ( temp float)
+0:23        Depth: direct index for structure ( temp float)
+0:23          'psout' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
+0:23          Constant:
+0:23            1 (const int)
+0:23        direct index ( temp float)
+0:23          'inpos' ( in 4-component vector of float)
+0:23          Constant:
+0:23            3 (const int)
+0:25      Branch: Return with expression
+0:25        'psout' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
+0:16  Function Definition: main( ( temp void)
+0:16    Function Parameters: 
 0:?     Sequence
-0:15      move second child to first child ( temp 4-component vector of float)
+0:16      move second child to first child ( temp 4-component vector of float)
 0:?         'inpos' ( temp 4-component vector of float)
 0:?         'inpos' ( noperspective in 4-component vector of float FragCoord)
-0:15      Sequence
-0:15        move second child to first child ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
-0:15          'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
-0:15          Function Call: @main(vf4;i1; ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
+0:16      Sequence
+0:16        move second child to first child ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
+0:16          'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
+0:16          Function Call: @main(vf4;i1; ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:?             'inpos' ( temp 4-component vector of float)
 0:?             'sampleMask' ( temp int)
-0:15        move second child to first child ( temp 4-component vector of float)
-0:?           'Color' (layout( location=0) out 4-component vector of float)
-0:15          Color: direct index for structure ( temp 4-component vector of float)
-0:15            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
-0:15            Constant:
-0:15              0 (const int)
-0:15        move second child to first child ( temp float)
-0:?           'Depth' ( out float FragDepth)
-0:15          Depth: direct index for structure ( temp float)
-0:15            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
-0:15            Constant:
-0:15              1 (const int)
-0:15      move second child to first child ( temp int)
-0:?         'sampleMask' ( out int SampleMaskIn)
+0:16        move second child to first child ( temp 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
+0:16          Color: direct index for structure ( temp 4-component vector of float)
+0:16            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
+0:16            Constant:
+0:16              0 (const int)
+0:16        move second child to first child ( temp float)
+0:?           '@entryPointOutput.Depth' ( out float FragDepth)
+0:16          Depth: direct index for structure ( temp float)
+0:16            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
+0:16            Constant:
+0:16              1 (const int)
+0:16      move second child to first child ( temp int)
+0:16        direct index ( out int SampleMaskIn)
+0:?           'sampleMask' ( out 1-element array of int SampleMaskIn)
+0:16          Constant:
+0:16            0 (const int)
 0:?         'sampleMask' ( temp int)
 0:?   Linker Objects
-0:?     'Color' (layout( location=0) out 4-component vector of float)
-0:?     'Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 0:?     'inpos' ( noperspective in 4-component vector of float FragCoord)
-0:?     'sampleMask' ( out int SampleMaskIn)
+0:?     'sampleMask' ( out 1-element array of int SampleMaskIn)
 
 
 Linked fragment stage:
@@ -97,12 +110,14 @@
 
 Shader version: 500
 gl_FragCoord origin is upper left
+using depth_any
 0:? Sequence
-0:8  Function Definition: MyFunc(f1;f1;f1; ( temp void)
+0:8  Function Definition: MyFunc(f1;f1;f1;f1; ( temp void)
 0:8    Function Parameters: 
 0:8      'x' ( in float)
 0:8      'y' ( out float)
 0:8      'z' ( inout float)
+0:8      'w' ( inout float)
 0:?     Sequence
 0:9      move second child to first child ( temp float)
 0:9        'y' ( out float)
@@ -114,219 +129,247 @@
 0:11        'x' ( in float)
 0:11        Constant:
 0:11          -1.000000
-0:15  Function Definition: @main(vf4;i1; ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
-0:15    Function Parameters: 
-0:15      'inpos' ( in 4-component vector of float)
-0:15      'sampleMask' ( out int)
+0:12      multiply second child into first child ( temp float)
+0:12        'w' ( inout float)
+0:12        Constant:
+0:12          1.000000
+0:16  Function Definition: @main(vf4;i1; ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
+0:16    Function Parameters: 
+0:16      'inpos' ( in 4-component vector of float)
+0:16      'sampleMask' ( out int)
 0:?     Sequence
-0:18      Sequence
-0:18        move second child to first child ( temp float)
-0:18          'x' ( temp float)
-0:18          Constant:
-0:18            7.000000
-0:18        move second child to first child ( temp float)
-0:18          'z' ( temp float)
-0:18          Constant:
-0:18            3.000000
-0:19      Function Call: MyFunc(f1;f1;f1; ( temp void)
-0:19        'x' ( temp float)
-0:19        'y' ( temp float)
-0:19        'z' ( temp float)
-0:21      move second child to first child ( temp 4-component vector of float)
-0:21        Color: direct index for structure ( temp 4-component vector of float)
-0:21          'psout' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
-0:21          Constant:
-0:21            0 (const int)
-0:?         Construct vec4 ( temp 4-component vector of float)
-0:21          'x' ( temp float)
-0:21          'y' ( temp float)
-0:21          'z' ( temp float)
-0:21          Constant:
-0:21            1.000000
-0:22      move second child to first child ( temp float)
-0:22        Depth: direct index for structure ( temp float)
+0:19      Sequence
+0:19        move second child to first child ( temp float)
+0:19          'x' ( temp float)
+0:19          Constant:
+0:19            7.000000
+0:19        move second child to first child ( temp float)
+0:19          'z' ( temp float)
+0:19          Constant:
+0:19            3.000000
+0:20      Function Call: MyFunc(f1;f1;f1;f1; ( temp void)
+0:20        'x' ( temp float)
+0:20        'y' ( temp float)
+0:20        'z' ( temp float)
+0:20        direct index ( temp float)
+0:20          'inpos' ( in 4-component vector of float)
+0:20          Constant:
+0:20            3 (const int)
+0:22      move second child to first child ( temp 4-component vector of float)
+0:22        Color: direct index for structure ( temp 4-component vector of float)
 0:22          'psout' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:22          Constant:
-0:22            1 (const int)
-0:22        direct index ( temp float)
-0:22          'inpos' ( in 4-component vector of float)
+0:22            0 (const int)
+0:?         Construct vec4 ( temp 4-component vector of float)
+0:22          'x' ( temp float)
+0:22          'y' ( temp float)
+0:22          'z' ( temp float)
 0:22          Constant:
-0:22            3 (const int)
-0:24      Branch: Return with expression
-0:24        'psout' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
-0:15  Function Definition: main( ( temp void)
-0:15    Function Parameters: 
+0:22            1.000000
+0:23      move second child to first child ( temp float)
+0:23        Depth: direct index for structure ( temp float)
+0:23          'psout' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
+0:23          Constant:
+0:23            1 (const int)
+0:23        direct index ( temp float)
+0:23          'inpos' ( in 4-component vector of float)
+0:23          Constant:
+0:23            3 (const int)
+0:25      Branch: Return with expression
+0:25        'psout' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
+0:16  Function Definition: main( ( temp void)
+0:16    Function Parameters: 
 0:?     Sequence
-0:15      move second child to first child ( temp 4-component vector of float)
+0:16      move second child to first child ( temp 4-component vector of float)
 0:?         'inpos' ( temp 4-component vector of float)
 0:?         'inpos' ( noperspective in 4-component vector of float FragCoord)
-0:15      Sequence
-0:15        move second child to first child ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
-0:15          'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
-0:15          Function Call: @main(vf4;i1; ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
+0:16      Sequence
+0:16        move second child to first child ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
+0:16          'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
+0:16          Function Call: @main(vf4;i1; ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:?             'inpos' ( temp 4-component vector of float)
 0:?             'sampleMask' ( temp int)
-0:15        move second child to first child ( temp 4-component vector of float)
-0:?           'Color' (layout( location=0) out 4-component vector of float)
-0:15          Color: direct index for structure ( temp 4-component vector of float)
-0:15            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
-0:15            Constant:
-0:15              0 (const int)
-0:15        move second child to first child ( temp float)
-0:?           'Depth' ( out float FragDepth)
-0:15          Depth: direct index for structure ( temp float)
-0:15            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
-0:15            Constant:
-0:15              1 (const int)
-0:15      move second child to first child ( temp int)
-0:?         'sampleMask' ( out int SampleMaskIn)
+0:16        move second child to first child ( temp 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
+0:16          Color: direct index for structure ( temp 4-component vector of float)
+0:16            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
+0:16            Constant:
+0:16              0 (const int)
+0:16        move second child to first child ( temp float)
+0:?           '@entryPointOutput.Depth' ( out float FragDepth)
+0:16          Depth: direct index for structure ( temp float)
+0:16            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
+0:16            Constant:
+0:16              1 (const int)
+0:16      move second child to first child ( temp int)
+0:16        direct index ( out int SampleMaskIn)
+0:?           'sampleMask' ( out 1-element array of int SampleMaskIn)
+0:16          Constant:
+0:16            0 (const int)
 0:?         'sampleMask' ( temp int)
 0:?   Linker Objects
-0:?     'Color' (layout( location=0) out 4-component vector of float)
-0:?     'Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 0:?     'inpos' ( noperspective in 4-component vector of float FragCoord)
-0:?     'sampleMask' ( out int SampleMaskIn)
+0:?     'sampleMask' ( out 1-element array of int SampleMaskIn)
 
 // Module Version 10000
-// Generated by (magic number): 80001
-// Id's are bound by 80
+// Generated by (magic number): 80007
+// Id's are bound by 92
 
                               Capability Shader
-                              Capability SampleRateShading
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "main" 60 70 74 78
+                              EntryPoint Fragment 4  "main" 68 78 82 88
                               ExecutionMode 4 OriginUpperLeft
+                              ExecutionMode 4 DepthReplacing
                               Source HLSL 500
                               Name 4  "main"
-                              Name 12  "MyFunc(f1;f1;f1;"
+                              Name 13  "MyFunc(f1;f1;f1;f1;"
                               Name 9  "x"
                               Name 10  "y"
                               Name 11  "z"
-                              Name 18  "PS_OUTPUT"
-                              MemberName 18(PS_OUTPUT) 0  "Color"
-                              MemberName 18(PS_OUTPUT) 1  "Depth"
-                              Name 22  "@main(vf4;i1;"
-                              Name 20  "inpos"
-                              Name 21  "sampleMask"
-                              Name 27  "x"
-                              Name 29  "z"
-                              Name 31  "y"
-                              Name 32  "param"
-                              Name 34  "param"
-                              Name 35  "param"
-                              Name 41  "psout"
-                              Name 58  "inpos"
-                              Name 60  "inpos"
-                              Name 62  "flattenTemp"
-                              Name 63  "sampleMask"
-                              Name 64  "param"
-                              Name 66  "param"
-                              Name 70  "Color"
-                              Name 74  "Depth"
-                              Name 78  "sampleMask"
-                              Decorate 60(inpos) NoPerspective
-                              Decorate 60(inpos) BuiltIn FragCoord
-                              Decorate 70(Color) Location 0
-                              Decorate 74(Depth) BuiltIn FragDepth
-                              Decorate 78(sampleMask) BuiltIn SampleMask
+                              Name 12  "w"
+                              Name 19  "PS_OUTPUT"
+                              MemberName 19(PS_OUTPUT) 0  "Color"
+                              MemberName 19(PS_OUTPUT) 1  "Depth"
+                              Name 23  "@main(vf4;i1;"
+                              Name 21  "inpos"
+                              Name 22  "sampleMask"
+                              Name 31  "x"
+                              Name 33  "z"
+                              Name 35  "y"
+                              Name 36  "param"
+                              Name 38  "param"
+                              Name 39  "param"
+                              Name 41  "param"
+                              Name 52  "psout"
+                              Name 66  "inpos"
+                              Name 68  "inpos"
+                              Name 70  "flattenTemp"
+                              Name 71  "sampleMask"
+                              Name 72  "param"
+                              Name 74  "param"
+                              Name 78  "@entryPointOutput.Color"
+                              Name 82  "@entryPointOutput.Depth"
+                              Name 88  "sampleMask"
+                              Decorate 68(inpos) NoPerspective
+                              Decorate 68(inpos) BuiltIn FragCoord
+                              Decorate 78(@entryPointOutput.Color) Location 0
+                              Decorate 82(@entryPointOutput.Depth) BuiltIn FragDepth
+                              Decorate 88(sampleMask) BuiltIn SampleMask
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
                7:             TypePointer Function 6(float)
-               8:             TypeFunction 2 7(ptr) 7(ptr) 7(ptr)
-              14:             TypeVector 6(float) 4
-              15:             TypePointer Function 14(fvec4)
-              16:             TypeInt 32 1
-              17:             TypePointer Function 16(int)
-   18(PS_OUTPUT):             TypeStruct 14(fvec4) 6(float)
-              19:             TypeFunction 18(PS_OUTPUT) 15(ptr) 17(ptr)
-              26:    6(float) Constant 3212836864
-              28:    6(float) Constant 1088421888
-              30:    6(float) Constant 1077936128
-              40:             TypePointer Function 18(PS_OUTPUT)
-              42:     16(int) Constant 0
-              46:    6(float) Constant 1065353216
-              49:     16(int) Constant 1
-              50:             TypeInt 32 0
-              51:     50(int) Constant 3
-              59:             TypePointer Input 14(fvec4)
-       60(inpos):     59(ptr) Variable Input
-              69:             TypePointer Output 14(fvec4)
-       70(Color):     69(ptr) Variable Output
-              73:             TypePointer Output 6(float)
-       74(Depth):     73(ptr) Variable Output
-              77:             TypePointer Output 16(int)
-  78(sampleMask):     77(ptr) Variable Output
+               8:             TypeFunction 2 7(ptr) 7(ptr) 7(ptr) 7(ptr)
+              15:             TypeVector 6(float) 4
+              16:             TypePointer Function 15(fvec4)
+              17:             TypeInt 32 1
+              18:             TypePointer Function 17(int)
+   19(PS_OUTPUT):             TypeStruct 15(fvec4) 6(float)
+              20:             TypeFunction 19(PS_OUTPUT) 16(ptr) 18(ptr)
+              27:    6(float) Constant 3212836864
+              28:    6(float) Constant 1065353216
+              32:    6(float) Constant 1088421888
+              34:    6(float) Constant 1077936128
+              42:             TypeInt 32 0
+              43:     42(int) Constant 3
+              51:             TypePointer Function 19(PS_OUTPUT)
+              53:     17(int) Constant 0
+              59:     17(int) Constant 1
+              67:             TypePointer Input 15(fvec4)
+       68(inpos):     67(ptr) Variable Input
+              77:             TypePointer Output 15(fvec4)
+78(@entryPointOutput.Color):     77(ptr) Variable Output
+              81:             TypePointer Output 6(float)
+82(@entryPointOutput.Depth):     81(ptr) Variable Output
+              85:     42(int) Constant 1
+              86:             TypeArray 17(int) 85
+              87:             TypePointer Output 86
+  88(sampleMask):     87(ptr) Variable Output
+              90:             TypePointer Output 17(int)
          4(main):           2 Function None 3
                5:             Label
-       58(inpos):     15(ptr) Variable Function
- 62(flattenTemp):     40(ptr) Variable Function
-  63(sampleMask):     17(ptr) Variable Function
-       64(param):     15(ptr) Variable Function
-       66(param):     17(ptr) Variable Function
-              61:   14(fvec4) Load 60(inpos)
-                              Store 58(inpos) 61
-              65:   14(fvec4) Load 58(inpos)
-                              Store 64(param) 65
-              67:18(PS_OUTPUT) FunctionCall 22(@main(vf4;i1;) 64(param) 66(param)
-              68:     16(int) Load 66(param)
-                              Store 63(sampleMask) 68
-                              Store 62(flattenTemp) 67
-              71:     15(ptr) AccessChain 62(flattenTemp) 42
-              72:   14(fvec4) Load 71
-                              Store 70(Color) 72
-              75:      7(ptr) AccessChain 62(flattenTemp) 49
-              76:    6(float) Load 75
-                              Store 74(Depth) 76
-              79:     16(int) Load 63(sampleMask)
-                              Store 78(sampleMask) 79
+       66(inpos):     16(ptr) Variable Function
+ 70(flattenTemp):     51(ptr) Variable Function
+  71(sampleMask):     18(ptr) Variable Function
+       72(param):     16(ptr) Variable Function
+       74(param):     18(ptr) Variable Function
+              69:   15(fvec4) Load 68(inpos)
+                              Store 66(inpos) 69
+              73:   15(fvec4) Load 66(inpos)
+                              Store 72(param) 73
+              75:19(PS_OUTPUT) FunctionCall 23(@main(vf4;i1;) 72(param) 74(param)
+              76:     17(int) Load 74(param)
+                              Store 71(sampleMask) 76
+                              Store 70(flattenTemp) 75
+              79:     16(ptr) AccessChain 70(flattenTemp) 53
+              80:   15(fvec4) Load 79
+                              Store 78(@entryPointOutput.Color) 80
+              83:      7(ptr) AccessChain 70(flattenTemp) 59
+              84:    6(float) Load 83
+                              Store 82(@entryPointOutput.Depth) 84
+              89:     17(int) Load 71(sampleMask)
+              91:     90(ptr) AccessChain 88(sampleMask) 53
+                              Store 91 89
                               Return
                               FunctionEnd
-12(MyFunc(f1;f1;f1;):           2 Function None 8
+13(MyFunc(f1;f1;f1;f1;):           2 Function None 8
             9(x):      7(ptr) FunctionParameter
            10(y):      7(ptr) FunctionParameter
            11(z):      7(ptr) FunctionParameter
-              13:             Label
-              24:    6(float) Load 9(x)
-                              Store 10(y) 24
-              25:    6(float) Load 10(y)
-                              Store 11(z) 25
-                              Store 9(x) 26
+           12(w):      7(ptr) FunctionParameter
+              14:             Label
+              25:    6(float) Load 9(x)
+                              Store 10(y) 25
+              26:    6(float) Load 10(y)
+                              Store 11(z) 26
+                              Store 9(x) 27
+              29:    6(float) Load 12(w)
+              30:    6(float) FMul 29 28
+                              Store 12(w) 30
                               Return
                               FunctionEnd
-22(@main(vf4;i1;):18(PS_OUTPUT) Function None 19
-       20(inpos):     15(ptr) FunctionParameter
-  21(sampleMask):     17(ptr) FunctionParameter
-              23:             Label
-           27(x):      7(ptr) Variable Function
-           29(z):      7(ptr) Variable Function
-           31(y):      7(ptr) Variable Function
-       32(param):      7(ptr) Variable Function
-       34(param):      7(ptr) Variable Function
-       35(param):      7(ptr) Variable Function
-       41(psout):     40(ptr) Variable Function
-                              Store 27(x) 28
-                              Store 29(z) 30
-              33:    6(float) Load 27(x)
-                              Store 32(param) 33
-              36:    6(float) Load 29(z)
-                              Store 35(param) 36
-              37:           2 FunctionCall 12(MyFunc(f1;f1;f1;) 32(param) 34(param) 35(param)
-              38:    6(float) Load 34(param)
-                              Store 31(y) 38
-              39:    6(float) Load 35(param)
-                              Store 29(z) 39
-              43:    6(float) Load 27(x)
-              44:    6(float) Load 31(y)
-              45:    6(float) Load 29(z)
-              47:   14(fvec4) CompositeConstruct 43 44 45 46
-              48:     15(ptr) AccessChain 41(psout) 42
-                              Store 48 47
-              52:      7(ptr) AccessChain 20(inpos) 51
-              53:    6(float) Load 52
-              54:      7(ptr) AccessChain 41(psout) 49
-                              Store 54 53
-              55:18(PS_OUTPUT) Load 41(psout)
-                              ReturnValue 55
+23(@main(vf4;i1;):19(PS_OUTPUT) Function None 20
+       21(inpos):     16(ptr) FunctionParameter
+  22(sampleMask):     18(ptr) FunctionParameter
+              24:             Label
+           31(x):      7(ptr) Variable Function
+           33(z):      7(ptr) Variable Function
+           35(y):      7(ptr) Variable Function
+       36(param):      7(ptr) Variable Function
+       38(param):      7(ptr) Variable Function
+       39(param):      7(ptr) Variable Function
+       41(param):      7(ptr) Variable Function
+       52(psout):     51(ptr) Variable Function
+                              Store 31(x) 32
+                              Store 33(z) 34
+              37:    6(float) Load 31(x)
+                              Store 36(param) 37
+              40:    6(float) Load 33(z)
+                              Store 39(param) 40
+              44:      7(ptr) AccessChain 21(inpos) 43
+              45:    6(float) Load 44
+                              Store 41(param) 45
+              46:           2 FunctionCall 13(MyFunc(f1;f1;f1;f1;) 36(param) 38(param) 39(param) 41(param)
+              47:    6(float) Load 38(param)
+                              Store 35(y) 47
+              48:    6(float) Load 39(param)
+                              Store 33(z) 48
+              49:    6(float) Load 41(param)
+              50:      7(ptr) AccessChain 21(inpos) 43
+                              Store 50 49
+              54:    6(float) Load 31(x)
+              55:    6(float) Load 35(y)
+              56:    6(float) Load 33(z)
+              57:   15(fvec4) CompositeConstruct 54 55 56 28
+              58:     16(ptr) AccessChain 52(psout) 53
+                              Store 58 57
+              60:      7(ptr) AccessChain 21(inpos) 43
+              61:    6(float) Load 60
+              62:      7(ptr) AccessChain 52(psout) 59
+                              Store 62 61
+              63:19(PS_OUTPUT) Load 52(psout)
+                              ReturnValue 63
                               FunctionEnd
diff --git a/Test/baseResults/hlsl.int.dot.frag.out b/Test/baseResults/hlsl.int.dot.frag.out
new file mode 100644
index 0000000..afe44c8
--- /dev/null
+++ b/Test/baseResults/hlsl.int.dot.frag.out
@@ -0,0 +1,339 @@
+hlsl.int.dot.frag
+Shader version: 500
+gl_FragCoord origin is upper left
+0:? Sequence
+0:1  Function Definition: @main( ( temp 4-component vector of float)
+0:1    Function Parameters: 
+0:?     Sequence
+0:2      Sequence
+0:2        move second child to first child ( temp int)
+0:2          'i' ( temp int)
+0:2          Constant:
+0:2            1 (const int)
+0:3      Sequence
+0:3        move second child to first child ( temp 1-component vector of int)
+0:3          'i2' ( temp 1-component vector of int)
+0:3          Constant:
+0:3            2 (const int)
+0:4      Sequence
+0:4        move second child to first child ( temp 2-component vector of int)
+0:4          'i3' ( temp 2-component vector of int)
+0:4          Constant:
+0:4            3 (const int)
+0:4            3 (const int)
+0:5      Sequence
+0:5        move second child to first child ( temp 3-component vector of int)
+0:5          'i4' ( temp 3-component vector of int)
+0:5          Constant:
+0:5            4 (const int)
+0:5            4 (const int)
+0:5            4 (const int)
+0:6      Sequence
+0:6        move second child to first child ( temp 4-component vector of int)
+0:6          'i5' ( temp 4-component vector of int)
+0:6          Constant:
+0:6            5 (const int)
+0:6            5 (const int)
+0:6            5 (const int)
+0:6            5 (const int)
+0:8      move second child to first child ( temp int)
+0:8        'i' ( temp int)
+0:8        dot-product ( temp int)
+0:8          'i' ( temp int)
+0:8          'i' ( temp int)
+0:9      move second child to first child ( temp 1-component vector of int)
+0:9        'i2' ( temp 1-component vector of int)
+0:9        Construct int ( temp 1-component vector of int)
+0:9          dot-product ( temp int)
+0:9            Construct int ( in int)
+0:9              'i2' ( temp 1-component vector of int)
+0:9            Construct int ( in int)
+0:9              'i2' ( temp 1-component vector of int)
+0:10      move second child to first child ( temp 2-component vector of int)
+0:10        'i3' ( temp 2-component vector of int)
+0:10        Construct ivec2 ( temp 2-component vector of int)
+0:10          dot-product ( temp int)
+0:10            'i3' ( temp 2-component vector of int)
+0:10            'i3' ( temp 2-component vector of int)
+0:11      move second child to first child ( temp 3-component vector of int)
+0:11        'i4' ( temp 3-component vector of int)
+0:11        Construct ivec3 ( temp 3-component vector of int)
+0:11          dot-product ( temp int)
+0:11            'i4' ( temp 3-component vector of int)
+0:11            'i4' ( temp 3-component vector of int)
+0:12      move second child to first child ( temp 4-component vector of int)
+0:12        'i5' ( temp 4-component vector of int)
+0:12        Construct ivec4 ( temp 4-component vector of int)
+0:12          dot-product ( temp int)
+0:12            'i5' ( temp 4-component vector of int)
+0:12            'i5' ( temp 4-component vector of int)
+0:13      Branch: Return with expression
+0:13        Convert int to float ( temp 4-component vector of float)
+0:13          add ( temp 4-component vector of int)
+0:13            add ( temp 4-component vector of int)
+0:13              add ( temp 4-component vector of int)
+0:13                add ( temp 4-component vector of int)
+0:13                  'i' ( temp int)
+0:13                  Construct ivec4 ( temp 4-component vector of int)
+0:13                    Construct int ( temp int)
+0:13                      'i2' ( temp 1-component vector of int)
+0:13                vector swizzle ( temp 4-component vector of int)
+0:13                  'i3' ( temp 2-component vector of int)
+0:13                  Sequence
+0:13                    Constant:
+0:13                      0 (const int)
+0:13                    Constant:
+0:13                      1 (const int)
+0:13                    Constant:
+0:13                      0 (const int)
+0:13                    Constant:
+0:13                      1 (const int)
+0:13              vector swizzle ( temp 4-component vector of int)
+0:13                'i4' ( temp 3-component vector of int)
+0:13                Sequence
+0:13                  Constant:
+0:13                    0 (const int)
+0:13                  Constant:
+0:13                    1 (const int)
+0:13                  Constant:
+0:13                    2 (const int)
+0:13                  Constant:
+0:13                    0 (const int)
+0:13            'i5' ( temp 4-component vector of int)
+0:1  Function Definition: main( ( temp void)
+0:1    Function Parameters: 
+0:?     Sequence
+0:1      move second child to first child ( temp 4-component vector of float)
+0:?         '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+0:1        Function Call: @main( ( temp 4-component vector of float)
+0:?   Linker Objects
+0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+
+
+Linked fragment stage:
+
+
+Shader version: 500
+gl_FragCoord origin is upper left
+0:? Sequence
+0:1  Function Definition: @main( ( temp 4-component vector of float)
+0:1    Function Parameters: 
+0:?     Sequence
+0:2      Sequence
+0:2        move second child to first child ( temp int)
+0:2          'i' ( temp int)
+0:2          Constant:
+0:2            1 (const int)
+0:3      Sequence
+0:3        move second child to first child ( temp 1-component vector of int)
+0:3          'i2' ( temp 1-component vector of int)
+0:3          Constant:
+0:3            2 (const int)
+0:4      Sequence
+0:4        move second child to first child ( temp 2-component vector of int)
+0:4          'i3' ( temp 2-component vector of int)
+0:4          Constant:
+0:4            3 (const int)
+0:4            3 (const int)
+0:5      Sequence
+0:5        move second child to first child ( temp 3-component vector of int)
+0:5          'i4' ( temp 3-component vector of int)
+0:5          Constant:
+0:5            4 (const int)
+0:5            4 (const int)
+0:5            4 (const int)
+0:6      Sequence
+0:6        move second child to first child ( temp 4-component vector of int)
+0:6          'i5' ( temp 4-component vector of int)
+0:6          Constant:
+0:6            5 (const int)
+0:6            5 (const int)
+0:6            5 (const int)
+0:6            5 (const int)
+0:8      move second child to first child ( temp int)
+0:8        'i' ( temp int)
+0:8        dot-product ( temp int)
+0:8          'i' ( temp int)
+0:8          'i' ( temp int)
+0:9      move second child to first child ( temp 1-component vector of int)
+0:9        'i2' ( temp 1-component vector of int)
+0:9        Construct int ( temp 1-component vector of int)
+0:9          dot-product ( temp int)
+0:9            Construct int ( in int)
+0:9              'i2' ( temp 1-component vector of int)
+0:9            Construct int ( in int)
+0:9              'i2' ( temp 1-component vector of int)
+0:10      move second child to first child ( temp 2-component vector of int)
+0:10        'i3' ( temp 2-component vector of int)
+0:10        Construct ivec2 ( temp 2-component vector of int)
+0:10          dot-product ( temp int)
+0:10            'i3' ( temp 2-component vector of int)
+0:10            'i3' ( temp 2-component vector of int)
+0:11      move second child to first child ( temp 3-component vector of int)
+0:11        'i4' ( temp 3-component vector of int)
+0:11        Construct ivec3 ( temp 3-component vector of int)
+0:11          dot-product ( temp int)
+0:11            'i4' ( temp 3-component vector of int)
+0:11            'i4' ( temp 3-component vector of int)
+0:12      move second child to first child ( temp 4-component vector of int)
+0:12        'i5' ( temp 4-component vector of int)
+0:12        Construct ivec4 ( temp 4-component vector of int)
+0:12          dot-product ( temp int)
+0:12            'i5' ( temp 4-component vector of int)
+0:12            'i5' ( temp 4-component vector of int)
+0:13      Branch: Return with expression
+0:13        Convert int to float ( temp 4-component vector of float)
+0:13          add ( temp 4-component vector of int)
+0:13            add ( temp 4-component vector of int)
+0:13              add ( temp 4-component vector of int)
+0:13                add ( temp 4-component vector of int)
+0:13                  'i' ( temp int)
+0:13                  Construct ivec4 ( temp 4-component vector of int)
+0:13                    Construct int ( temp int)
+0:13                      'i2' ( temp 1-component vector of int)
+0:13                vector swizzle ( temp 4-component vector of int)
+0:13                  'i3' ( temp 2-component vector of int)
+0:13                  Sequence
+0:13                    Constant:
+0:13                      0 (const int)
+0:13                    Constant:
+0:13                      1 (const int)
+0:13                    Constant:
+0:13                      0 (const int)
+0:13                    Constant:
+0:13                      1 (const int)
+0:13              vector swizzle ( temp 4-component vector of int)
+0:13                'i4' ( temp 3-component vector of int)
+0:13                Sequence
+0:13                  Constant:
+0:13                    0 (const int)
+0:13                  Constant:
+0:13                    1 (const int)
+0:13                  Constant:
+0:13                    2 (const int)
+0:13                  Constant:
+0:13                    0 (const int)
+0:13            'i5' ( temp 4-component vector of int)
+0:1  Function Definition: main( ( temp void)
+0:1    Function Parameters: 
+0:?     Sequence
+0:1      move second child to first child ( temp 4-component vector of float)
+0:?         '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+0:1        Function Call: @main( ( temp 4-component vector of float)
+0:?   Linker Objects
+0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+
+// Module Version 10300
+// Generated by (magic number): 80007
+// Id's are bound by 84
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 82
+                              ExecutionMode 4 OriginUpperLeft
+                              Source HLSL 500
+                              Name 4  "main"
+                              Name 9  "@main("
+                              Name 13  "i"
+                              Name 15  "i2"
+                              Name 19  "i3"
+                              Name 24  "i4"
+                              Name 29  "i5"
+                              Name 82  "@entryPointOutput"
+                              Decorate 82(@entryPointOutput) Location 0
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+               8:             TypeFunction 7(fvec4)
+              11:             TypeInt 32 1
+              12:             TypePointer Function 11(int)
+              14:     11(int) Constant 1
+              16:     11(int) Constant 2
+              17:             TypeVector 11(int) 2
+              18:             TypePointer Function 17(ivec2)
+              20:     11(int) Constant 3
+              21:   17(ivec2) ConstantComposite 20 20
+              22:             TypeVector 11(int) 3
+              23:             TypePointer Function 22(ivec3)
+              25:     11(int) Constant 4
+              26:   22(ivec3) ConstantComposite 25 25 25
+              27:             TypeVector 11(int) 4
+              28:             TypePointer Function 27(ivec4)
+              30:     11(int) Constant 5
+              31:   27(ivec4) ConstantComposite 30 30 30 30
+              81:             TypePointer Output 7(fvec4)
+82(@entryPointOutput):     81(ptr) Variable Output
+         4(main):           2 Function None 3
+               5:             Label
+              83:    7(fvec4) FunctionCall 9(@main()
+                              Store 82(@entryPointOutput) 83
+                              Return
+                              FunctionEnd
+       9(@main():    7(fvec4) Function None 8
+              10:             Label
+           13(i):     12(ptr) Variable Function
+          15(i2):     12(ptr) Variable Function
+          19(i3):     18(ptr) Variable Function
+          24(i4):     23(ptr) Variable Function
+          29(i5):     28(ptr) Variable Function
+                              Store 13(i) 14
+                              Store 15(i2) 16
+                              Store 19(i3) 21
+                              Store 24(i4) 26
+                              Store 29(i5) 31
+              32:     11(int) Load 13(i)
+              33:     11(int) Load 13(i)
+              34:     11(int) IMul 32 33
+                              Store 13(i) 34
+              35:     11(int) Load 15(i2)
+              36:     11(int) Load 15(i2)
+              37:     11(int) IMul 35 36
+                              Store 15(i2) 37
+              38:   17(ivec2) Load 19(i3)
+              39:   17(ivec2) Load 19(i3)
+              40:   17(ivec2) IMul 38 39
+              41:     11(int) CompositeExtract 40 0
+              42:     11(int) CompositeExtract 38 1
+              43:     11(int) IAdd 41 42
+              44:   17(ivec2) CompositeConstruct 43 43
+                              Store 19(i3) 44
+              45:   22(ivec3) Load 24(i4)
+              46:   22(ivec3) Load 24(i4)
+              47:   22(ivec3) IMul 45 46
+              48:     11(int) CompositeExtract 47 0
+              49:     11(int) CompositeExtract 45 1
+              50:     11(int) IAdd 48 49
+              51:     11(int) CompositeExtract 45 2
+              52:     11(int) IAdd 50 51
+              53:   22(ivec3) CompositeConstruct 52 52 52
+                              Store 24(i4) 53
+              54:   27(ivec4) Load 29(i5)
+              55:   27(ivec4) Load 29(i5)
+              56:   27(ivec4) IMul 54 55
+              57:     11(int) CompositeExtract 56 0
+              58:     11(int) CompositeExtract 54 1
+              59:     11(int) IAdd 57 58
+              60:     11(int) CompositeExtract 54 2
+              61:     11(int) IAdd 59 60
+              62:     11(int) CompositeExtract 54 3
+              63:     11(int) IAdd 61 62
+              64:   27(ivec4) CompositeConstruct 63 63 63 63
+                              Store 29(i5) 64
+              65:     11(int) Load 13(i)
+              66:     11(int) Load 15(i2)
+              67:   27(ivec4) CompositeConstruct 66 66 66 66
+              68:   27(ivec4) CompositeConstruct 65 65 65 65
+              69:   27(ivec4) IAdd 68 67
+              70:   17(ivec2) Load 19(i3)
+              71:   27(ivec4) VectorShuffle 70 70 0 1 0 1
+              72:   27(ivec4) IAdd 69 71
+              73:   22(ivec3) Load 24(i4)
+              74:   27(ivec4) VectorShuffle 73 73 0 1 2 0
+              75:   27(ivec4) IAdd 72 74
+              76:   27(ivec4) Load 29(i5)
+              77:   27(ivec4) IAdd 75 76
+              78:    7(fvec4) ConvertSToF 77
+                              ReturnValue 78
+                              FunctionEnd
diff --git a/Test/baseResults/hlsl.intrinsic.frexp.frag.out b/Test/baseResults/hlsl.intrinsic.frexp.frag.out
index e62399a..3a9d6fd 100644
--- a/Test/baseResults/hlsl.intrinsic.frexp.frag.out
+++ b/Test/baseResults/hlsl.intrinsic.frexp.frag.out
@@ -84,13 +84,13 @@
 0:?     Sequence
 0:33      Sequence
 0:33        move second child to first child ( temp 4-component vector of float)
-0:?           'color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.color' (layout( location=0) out 4-component vector of float)
 0:33          color: direct index for structure ( temp 4-component vector of float)
 0:33            Function Call: @main( ( temp structure{ temp 4-component vector of float color})
 0:33            Constant:
 0:33              0 (const int)
 0:?   Linker Objects
-0:?     'color' (layout( location=0) out 4-component vector of float)
+0:?     '@entryPointOutput.color' (layout( location=0) out 4-component vector of float)
 
 
 Linked fragment stage:
@@ -181,16 +181,16 @@
 0:?     Sequence
 0:33      Sequence
 0:33        move second child to first child ( temp 4-component vector of float)
-0:?           'color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.color' (layout( location=0) out 4-component vector of float)
 0:33          color: direct index for structure ( temp 4-component vector of float)
 0:33            Function Call: @main( ( temp structure{ temp 4-component vector of float color})
 0:33            Constant:
 0:33              0 (const int)
 0:?   Linker Objects
-0:?     'color' (layout( location=0) out 4-component vector of float)
+0:?     '@entryPointOutput.color' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 98
 
                               Capability Shader
@@ -224,8 +224,8 @@
                               Name 74  "r000"
                               Name 77  "ResType"
                               Name 87  "ps_output"
-                              Name 95  "color"
-                              Decorate 95(color) Location 0
+                              Name 95  "@entryPointOutput.color"
+                              Decorate 95(@entryPointOutput.color) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -262,12 +262,12 @@
               88:     40(int) Constant 0
               89:   27(fvec4) ConstantComposite 57 57 57 57
               94:             TypePointer Output 27(fvec4)
-       95(color):     94(ptr) Variable Output
+95(@entryPointOutput.color):     94(ptr) Variable Output
          4(main):           2 Function None 3
                5:             Label
               96:34(PS_OUTPUT) FunctionCall 36(@main()
               97:   27(fvec4) CompositeExtract 96 0
-                              Store 95(color) 97
+                              Store 95(@entryPointOutput.color) 97
                               Return
                               FunctionEnd
 11(PixelShaderFunctionS(f1;f1;):    6(float) Function None 8
diff --git a/Test/baseResults/hlsl.intrinsic.frexp.vert.out b/Test/baseResults/hlsl.intrinsic.frexp.vert.out
index 1827bd6..92bd7ef 100644
--- a/Test/baseResults/hlsl.intrinsic.frexp.vert.out
+++ b/Test/baseResults/hlsl.intrinsic.frexp.vert.out
@@ -113,7 +113,7 @@
 0:?   Linker Objects
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 78
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.intrinsics.barriers.comp.out b/Test/baseResults/hlsl.intrinsics.barriers.comp.out
index f7e3e22..13fe578 100644
--- a/Test/baseResults/hlsl.intrinsics.barriers.comp.out
+++ b/Test/baseResults/hlsl.intrinsics.barriers.comp.out
@@ -7,8 +7,8 @@
 0:?     Sequence
 0:4      MemoryBarrier ( temp void)
 0:5      AllMemoryBarrierWithGroupSync ( temp void)
-0:6      GroupMemoryBarrier ( temp void)
-0:7      GroupMemoryBarrierWithGroupSync ( temp void)
+0:6      DeviceMemoryBarrier ( temp void)
+0:7      DeviceMemoryBarrierWithGroupSync ( temp void)
 0:8      WorkgroupMemoryBarrier ( temp void)
 0:9      WorkgroupMemoryBarrierWithGroupSync ( temp void)
 0:11      Branch: Return with expression
@@ -35,8 +35,8 @@
 0:?     Sequence
 0:4      MemoryBarrier ( temp void)
 0:5      AllMemoryBarrierWithGroupSync ( temp void)
-0:6      GroupMemoryBarrier ( temp void)
-0:7      GroupMemoryBarrierWithGroupSync ( temp void)
+0:6      DeviceMemoryBarrier ( temp void)
+0:7      DeviceMemoryBarrierWithGroupSync ( temp void)
 0:8      WorkgroupMemoryBarrier ( temp void)
 0:9      WorkgroupMemoryBarrierWithGroupSync ( temp void)
 0:11      Branch: Return with expression
@@ -52,7 +52,7 @@
 0:?     '@entryPointOutput' (layout( location=0) out float)
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 22
 
                               Capability Shader
@@ -71,10 +71,10 @@
                7:             TypeFunction 6(float)
               10:             TypeInt 32 0
               11:     10(int) Constant 1
-              12:     10(int) Constant 4048
-              13:     10(int) Constant 512
-              14:     10(int) Constant 2
-              15:     10(int) Constant 256
+              12:     10(int) Constant 3400
+              13:     10(int) Constant 2
+              14:     10(int) Constant 2120
+              15:     10(int) Constant 264
               16:    6(float) Constant 0
               19:             TypePointer Output 6(float)
 20(@entryPointOutput):     19(ptr) Variable Output
@@ -87,10 +87,10 @@
 8(@ComputeShaderFunction():    6(float) Function None 7
                9:             Label
                               MemoryBarrier 11 12
-                              ControlBarrier 11 11 12
-                              MemoryBarrier 11 13
-                              ControlBarrier 11 11 13
-                              MemoryBarrier 14 15
-                              ControlBarrier 14 14 15
+                              ControlBarrier 13 11 12
+                              MemoryBarrier 11 14
+                              ControlBarrier 13 11 14
+                              MemoryBarrier 13 15
+                              ControlBarrier 13 13 15
                               ReturnValue 16
                               FunctionEnd
diff --git a/Test/baseResults/hlsl.intrinsics.comp.out b/Test/baseResults/hlsl.intrinsics.comp.out
index bff1886..5058f23 100644
--- a/Test/baseResults/hlsl.intrinsics.comp.out
+++ b/Test/baseResults/hlsl.intrinsics.comp.out
@@ -11,8 +11,9 @@
 0:17      'inU1' ( in uint)
 0:?     Sequence
 0:21      all ( temp bool)
-0:21        'inF0' ( in float)
-0:24      AtomicAdd ( temp void)
+0:21        Convert float to bool ( temp bool)
+0:21          'inF0' ( in float)
+0:24      AtomicAdd ( temp uint)
 0:24        'gs_ua' ( shared uint)
 0:24        'gs_ub' ( shared uint)
 0:25      move second child to first child ( temp uint)
@@ -20,7 +21,7 @@
 0:25        AtomicAdd ( temp uint)
 0:25          'gs_ua' ( shared uint)
 0:25          'gs_ub' ( shared uint)
-0:26      AtomicAnd ( temp void)
+0:26      AtomicAnd ( temp uint)
 0:26        'gs_ua' ( shared uint)
 0:26        'gs_ub' ( shared uint)
 0:27      move second child to first child ( temp uint)
@@ -39,7 +40,7 @@
 0:29        AtomicExchange ( temp uint)
 0:29          'gs_ua' ( shared uint)
 0:29          'gs_ub' ( shared uint)
-0:30      AtomicMax ( temp void)
+0:30      AtomicMax ( temp uint)
 0:30        'gs_ua' ( shared uint)
 0:30        'gs_ub' ( shared uint)
 0:31      move second child to first child ( temp uint)
@@ -47,7 +48,7 @@
 0:31        AtomicMax ( temp uint)
 0:31          'gs_ua' ( shared uint)
 0:31          'gs_ub' ( shared uint)
-0:32      AtomicMin ( temp void)
+0:32      AtomicMin ( temp uint)
 0:32        'gs_ua' ( shared uint)
 0:32        'gs_ub' ( shared uint)
 0:33      move second child to first child ( temp uint)
@@ -55,7 +56,7 @@
 0:33        AtomicMin ( temp uint)
 0:33          'gs_ua' ( shared uint)
 0:33          'gs_ub' ( shared uint)
-0:34      AtomicOr ( temp void)
+0:34      AtomicOr ( temp uint)
 0:34        'gs_ua' ( shared uint)
 0:34        'gs_ub' ( shared uint)
 0:35      move second child to first child ( temp uint)
@@ -63,7 +64,7 @@
 0:35        AtomicOr ( temp uint)
 0:35          'gs_ua' ( shared uint)
 0:35          'gs_ub' ( shared uint)
-0:36      AtomicXor ( temp void)
+0:36      AtomicXor ( temp uint)
 0:36        'gs_ua' ( shared uint)
 0:36        'gs_ub' ( shared uint)
 0:37      move second child to first child ( temp uint)
@@ -92,8 +93,9 @@
 0:51      'inU1' ( in 2-component vector of uint)
 0:?     Sequence
 0:55      all ( temp bool)
-0:55        'inF0' ( in 2-component vector of float)
-0:58      AtomicAdd ( temp void)
+0:55        Convert float to bool ( temp 2-component vector of bool)
+0:55          'inF0' ( in 2-component vector of float)
+0:58      AtomicAdd ( temp 2-component vector of uint)
 0:58        'gs_ua2' ( shared 2-component vector of uint)
 0:58        'gs_ub2' ( shared 2-component vector of uint)
 0:59      move second child to first child ( temp 2-component vector of uint)
@@ -101,7 +103,7 @@
 0:59        AtomicAdd ( temp 2-component vector of uint)
 0:59          'gs_ua2' ( shared 2-component vector of uint)
 0:59          'gs_ub2' ( shared 2-component vector of uint)
-0:60      AtomicAnd ( temp void)
+0:60      AtomicAnd ( temp 2-component vector of uint)
 0:60        'gs_ua2' ( shared 2-component vector of uint)
 0:60        'gs_ub2' ( shared 2-component vector of uint)
 0:61      move second child to first child ( temp 2-component vector of uint)
@@ -120,7 +122,7 @@
 0:63        AtomicExchange ( temp 2-component vector of uint)
 0:63          'gs_ua2' ( shared 2-component vector of uint)
 0:63          'gs_ub2' ( shared 2-component vector of uint)
-0:64      AtomicMax ( temp void)
+0:64      AtomicMax ( temp 2-component vector of uint)
 0:64        'gs_ua2' ( shared 2-component vector of uint)
 0:64        'gs_ub2' ( shared 2-component vector of uint)
 0:65      move second child to first child ( temp 2-component vector of uint)
@@ -128,7 +130,7 @@
 0:65        AtomicMax ( temp 2-component vector of uint)
 0:65          'gs_ua2' ( shared 2-component vector of uint)
 0:65          'gs_ub2' ( shared 2-component vector of uint)
-0:66      AtomicMin ( temp void)
+0:66      AtomicMin ( temp 2-component vector of uint)
 0:66        'gs_ua2' ( shared 2-component vector of uint)
 0:66        'gs_ub2' ( shared 2-component vector of uint)
 0:67      move second child to first child ( temp 2-component vector of uint)
@@ -136,7 +138,7 @@
 0:67        AtomicMin ( temp 2-component vector of uint)
 0:67          'gs_ua2' ( shared 2-component vector of uint)
 0:67          'gs_ub2' ( shared 2-component vector of uint)
-0:68      AtomicOr ( temp void)
+0:68      AtomicOr ( temp 2-component vector of uint)
 0:68        'gs_ua2' ( shared 2-component vector of uint)
 0:68        'gs_ub2' ( shared 2-component vector of uint)
 0:69      move second child to first child ( temp 2-component vector of uint)
@@ -144,7 +146,7 @@
 0:69        AtomicOr ( temp 2-component vector of uint)
 0:69          'gs_ua2' ( shared 2-component vector of uint)
 0:69          'gs_ub2' ( shared 2-component vector of uint)
-0:70      AtomicXor ( temp void)
+0:70      AtomicXor ( temp 2-component vector of uint)
 0:70        'gs_ua2' ( shared 2-component vector of uint)
 0:70        'gs_ub2' ( shared 2-component vector of uint)
 0:71      move second child to first child ( temp 2-component vector of uint)
@@ -165,8 +167,9 @@
 0:78      'inU1' ( in 3-component vector of uint)
 0:?     Sequence
 0:82      all ( temp bool)
-0:82        'inF0' ( in 3-component vector of float)
-0:85      AtomicAdd ( temp void)
+0:82        Convert float to bool ( temp 3-component vector of bool)
+0:82          'inF0' ( in 3-component vector of float)
+0:85      AtomicAdd ( temp 3-component vector of uint)
 0:85        'gs_ua3' ( shared 3-component vector of uint)
 0:85        'gs_ub3' ( shared 3-component vector of uint)
 0:86      move second child to first child ( temp 3-component vector of uint)
@@ -174,7 +177,7 @@
 0:86        AtomicAdd ( temp 3-component vector of uint)
 0:86          'gs_ua3' ( shared 3-component vector of uint)
 0:86          'gs_ub3' ( shared 3-component vector of uint)
-0:87      AtomicAnd ( temp void)
+0:87      AtomicAnd ( temp 3-component vector of uint)
 0:87        'gs_ua3' ( shared 3-component vector of uint)
 0:87        'gs_ub3' ( shared 3-component vector of uint)
 0:88      move second child to first child ( temp 3-component vector of uint)
@@ -193,7 +196,7 @@
 0:90        AtomicExchange ( temp 3-component vector of uint)
 0:90          'gs_ua3' ( shared 3-component vector of uint)
 0:90          'gs_ub3' ( shared 3-component vector of uint)
-0:91      AtomicMax ( temp void)
+0:91      AtomicMax ( temp 3-component vector of uint)
 0:91        'gs_ua3' ( shared 3-component vector of uint)
 0:91        'gs_ub3' ( shared 3-component vector of uint)
 0:92      move second child to first child ( temp 3-component vector of uint)
@@ -201,7 +204,7 @@
 0:92        AtomicMax ( temp 3-component vector of uint)
 0:92          'gs_ua3' ( shared 3-component vector of uint)
 0:92          'gs_ub3' ( shared 3-component vector of uint)
-0:93      AtomicMin ( temp void)
+0:93      AtomicMin ( temp 3-component vector of uint)
 0:93        'gs_ua3' ( shared 3-component vector of uint)
 0:93        'gs_ub3' ( shared 3-component vector of uint)
 0:94      move second child to first child ( temp 3-component vector of uint)
@@ -209,7 +212,7 @@
 0:94        AtomicMin ( temp 3-component vector of uint)
 0:94          'gs_ua3' ( shared 3-component vector of uint)
 0:94          'gs_ub3' ( shared 3-component vector of uint)
-0:95      AtomicOr ( temp void)
+0:95      AtomicOr ( temp 3-component vector of uint)
 0:95        'gs_ua3' ( shared 3-component vector of uint)
 0:95        'gs_ub3' ( shared 3-component vector of uint)
 0:96      move second child to first child ( temp 3-component vector of uint)
@@ -217,7 +220,7 @@
 0:96        AtomicOr ( temp 3-component vector of uint)
 0:96          'gs_ua3' ( shared 3-component vector of uint)
 0:96          'gs_ub3' ( shared 3-component vector of uint)
-0:97      AtomicXor ( temp void)
+0:97      AtomicXor ( temp 3-component vector of uint)
 0:97        'gs_ua3' ( shared 3-component vector of uint)
 0:97        'gs_ub3' ( shared 3-component vector of uint)
 0:98      move second child to first child ( temp 3-component vector of uint)
@@ -239,8 +242,9 @@
 0:105      'inU1' ( in 4-component vector of uint)
 0:?     Sequence
 0:109      all ( temp bool)
-0:109        'inF0' ( in 4-component vector of float)
-0:112      AtomicAdd ( temp void)
+0:109        Convert float to bool ( temp 4-component vector of bool)
+0:109          'inF0' ( in 4-component vector of float)
+0:112      AtomicAdd ( temp 4-component vector of uint)
 0:112        'gs_ua4' ( shared 4-component vector of uint)
 0:112        'gs_ub4' ( shared 4-component vector of uint)
 0:113      move second child to first child ( temp 4-component vector of uint)
@@ -248,7 +252,7 @@
 0:113        AtomicAdd ( temp 4-component vector of uint)
 0:113          'gs_ua4' ( shared 4-component vector of uint)
 0:113          'gs_ub4' ( shared 4-component vector of uint)
-0:114      AtomicAnd ( temp void)
+0:114      AtomicAnd ( temp 4-component vector of uint)
 0:114        'gs_ua4' ( shared 4-component vector of uint)
 0:114        'gs_ub4' ( shared 4-component vector of uint)
 0:115      move second child to first child ( temp 4-component vector of uint)
@@ -267,7 +271,7 @@
 0:117        AtomicExchange ( temp 4-component vector of uint)
 0:117          'gs_ua4' ( shared 4-component vector of uint)
 0:117          'gs_ub4' ( shared 4-component vector of uint)
-0:118      AtomicMax ( temp void)
+0:118      AtomicMax ( temp 4-component vector of uint)
 0:118        'gs_ua4' ( shared 4-component vector of uint)
 0:118        'gs_ub4' ( shared 4-component vector of uint)
 0:119      move second child to first child ( temp 4-component vector of uint)
@@ -275,7 +279,7 @@
 0:119        AtomicMax ( temp 4-component vector of uint)
 0:119          'gs_ua4' ( shared 4-component vector of uint)
 0:119          'gs_ub4' ( shared 4-component vector of uint)
-0:120      AtomicMin ( temp void)
+0:120      AtomicMin ( temp 4-component vector of uint)
 0:120        'gs_ua4' ( shared 4-component vector of uint)
 0:120        'gs_ub4' ( shared 4-component vector of uint)
 0:121      move second child to first child ( temp 4-component vector of uint)
@@ -283,7 +287,7 @@
 0:121        AtomicMin ( temp 4-component vector of uint)
 0:121          'gs_ua4' ( shared 4-component vector of uint)
 0:121          'gs_ub4' ( shared 4-component vector of uint)
-0:122      AtomicOr ( temp void)
+0:122      AtomicOr ( temp 4-component vector of uint)
 0:122        'gs_ua4' ( shared 4-component vector of uint)
 0:122        'gs_ub4' ( shared 4-component vector of uint)
 0:123      move second child to first child ( temp 4-component vector of uint)
@@ -291,7 +295,7 @@
 0:123        AtomicOr ( temp 4-component vector of uint)
 0:123          'gs_ua4' ( shared 4-component vector of uint)
 0:123          'gs_ub4' ( shared 4-component vector of uint)
-0:124      AtomicXor ( temp void)
+0:124      AtomicXor ( temp 4-component vector of uint)
 0:124        'gs_ua4' ( shared 4-component vector of uint)
 0:124        'gs_ub4' ( shared 4-component vector of uint)
 0:125      move second child to first child ( temp 4-component vector of uint)
@@ -367,8 +371,9 @@
 0:17      'inU1' ( in uint)
 0:?     Sequence
 0:21      all ( temp bool)
-0:21        'inF0' ( in float)
-0:24      AtomicAdd ( temp void)
+0:21        Convert float to bool ( temp bool)
+0:21          'inF0' ( in float)
+0:24      AtomicAdd ( temp uint)
 0:24        'gs_ua' ( shared uint)
 0:24        'gs_ub' ( shared uint)
 0:25      move second child to first child ( temp uint)
@@ -376,7 +381,7 @@
 0:25        AtomicAdd ( temp uint)
 0:25          'gs_ua' ( shared uint)
 0:25          'gs_ub' ( shared uint)
-0:26      AtomicAnd ( temp void)
+0:26      AtomicAnd ( temp uint)
 0:26        'gs_ua' ( shared uint)
 0:26        'gs_ub' ( shared uint)
 0:27      move second child to first child ( temp uint)
@@ -395,7 +400,7 @@
 0:29        AtomicExchange ( temp uint)
 0:29          'gs_ua' ( shared uint)
 0:29          'gs_ub' ( shared uint)
-0:30      AtomicMax ( temp void)
+0:30      AtomicMax ( temp uint)
 0:30        'gs_ua' ( shared uint)
 0:30        'gs_ub' ( shared uint)
 0:31      move second child to first child ( temp uint)
@@ -403,7 +408,7 @@
 0:31        AtomicMax ( temp uint)
 0:31          'gs_ua' ( shared uint)
 0:31          'gs_ub' ( shared uint)
-0:32      AtomicMin ( temp void)
+0:32      AtomicMin ( temp uint)
 0:32        'gs_ua' ( shared uint)
 0:32        'gs_ub' ( shared uint)
 0:33      move second child to first child ( temp uint)
@@ -411,7 +416,7 @@
 0:33        AtomicMin ( temp uint)
 0:33          'gs_ua' ( shared uint)
 0:33          'gs_ub' ( shared uint)
-0:34      AtomicOr ( temp void)
+0:34      AtomicOr ( temp uint)
 0:34        'gs_ua' ( shared uint)
 0:34        'gs_ub' ( shared uint)
 0:35      move second child to first child ( temp uint)
@@ -419,7 +424,7 @@
 0:35        AtomicOr ( temp uint)
 0:35          'gs_ua' ( shared uint)
 0:35          'gs_ub' ( shared uint)
-0:36      AtomicXor ( temp void)
+0:36      AtomicXor ( temp uint)
 0:36        'gs_ua' ( shared uint)
 0:36        'gs_ub' ( shared uint)
 0:37      move second child to first child ( temp uint)
@@ -448,8 +453,9 @@
 0:51      'inU1' ( in 2-component vector of uint)
 0:?     Sequence
 0:55      all ( temp bool)
-0:55        'inF0' ( in 2-component vector of float)
-0:58      AtomicAdd ( temp void)
+0:55        Convert float to bool ( temp 2-component vector of bool)
+0:55          'inF0' ( in 2-component vector of float)
+0:58      AtomicAdd ( temp 2-component vector of uint)
 0:58        'gs_ua2' ( shared 2-component vector of uint)
 0:58        'gs_ub2' ( shared 2-component vector of uint)
 0:59      move second child to first child ( temp 2-component vector of uint)
@@ -457,7 +463,7 @@
 0:59        AtomicAdd ( temp 2-component vector of uint)
 0:59          'gs_ua2' ( shared 2-component vector of uint)
 0:59          'gs_ub2' ( shared 2-component vector of uint)
-0:60      AtomicAnd ( temp void)
+0:60      AtomicAnd ( temp 2-component vector of uint)
 0:60        'gs_ua2' ( shared 2-component vector of uint)
 0:60        'gs_ub2' ( shared 2-component vector of uint)
 0:61      move second child to first child ( temp 2-component vector of uint)
@@ -476,7 +482,7 @@
 0:63        AtomicExchange ( temp 2-component vector of uint)
 0:63          'gs_ua2' ( shared 2-component vector of uint)
 0:63          'gs_ub2' ( shared 2-component vector of uint)
-0:64      AtomicMax ( temp void)
+0:64      AtomicMax ( temp 2-component vector of uint)
 0:64        'gs_ua2' ( shared 2-component vector of uint)
 0:64        'gs_ub2' ( shared 2-component vector of uint)
 0:65      move second child to first child ( temp 2-component vector of uint)
@@ -484,7 +490,7 @@
 0:65        AtomicMax ( temp 2-component vector of uint)
 0:65          'gs_ua2' ( shared 2-component vector of uint)
 0:65          'gs_ub2' ( shared 2-component vector of uint)
-0:66      AtomicMin ( temp void)
+0:66      AtomicMin ( temp 2-component vector of uint)
 0:66        'gs_ua2' ( shared 2-component vector of uint)
 0:66        'gs_ub2' ( shared 2-component vector of uint)
 0:67      move second child to first child ( temp 2-component vector of uint)
@@ -492,7 +498,7 @@
 0:67        AtomicMin ( temp 2-component vector of uint)
 0:67          'gs_ua2' ( shared 2-component vector of uint)
 0:67          'gs_ub2' ( shared 2-component vector of uint)
-0:68      AtomicOr ( temp void)
+0:68      AtomicOr ( temp 2-component vector of uint)
 0:68        'gs_ua2' ( shared 2-component vector of uint)
 0:68        'gs_ub2' ( shared 2-component vector of uint)
 0:69      move second child to first child ( temp 2-component vector of uint)
@@ -500,7 +506,7 @@
 0:69        AtomicOr ( temp 2-component vector of uint)
 0:69          'gs_ua2' ( shared 2-component vector of uint)
 0:69          'gs_ub2' ( shared 2-component vector of uint)
-0:70      AtomicXor ( temp void)
+0:70      AtomicXor ( temp 2-component vector of uint)
 0:70        'gs_ua2' ( shared 2-component vector of uint)
 0:70        'gs_ub2' ( shared 2-component vector of uint)
 0:71      move second child to first child ( temp 2-component vector of uint)
@@ -521,8 +527,9 @@
 0:78      'inU1' ( in 3-component vector of uint)
 0:?     Sequence
 0:82      all ( temp bool)
-0:82        'inF0' ( in 3-component vector of float)
-0:85      AtomicAdd ( temp void)
+0:82        Convert float to bool ( temp 3-component vector of bool)
+0:82          'inF0' ( in 3-component vector of float)
+0:85      AtomicAdd ( temp 3-component vector of uint)
 0:85        'gs_ua3' ( shared 3-component vector of uint)
 0:85        'gs_ub3' ( shared 3-component vector of uint)
 0:86      move second child to first child ( temp 3-component vector of uint)
@@ -530,7 +537,7 @@
 0:86        AtomicAdd ( temp 3-component vector of uint)
 0:86          'gs_ua3' ( shared 3-component vector of uint)
 0:86          'gs_ub3' ( shared 3-component vector of uint)
-0:87      AtomicAnd ( temp void)
+0:87      AtomicAnd ( temp 3-component vector of uint)
 0:87        'gs_ua3' ( shared 3-component vector of uint)
 0:87        'gs_ub3' ( shared 3-component vector of uint)
 0:88      move second child to first child ( temp 3-component vector of uint)
@@ -549,7 +556,7 @@
 0:90        AtomicExchange ( temp 3-component vector of uint)
 0:90          'gs_ua3' ( shared 3-component vector of uint)
 0:90          'gs_ub3' ( shared 3-component vector of uint)
-0:91      AtomicMax ( temp void)
+0:91      AtomicMax ( temp 3-component vector of uint)
 0:91        'gs_ua3' ( shared 3-component vector of uint)
 0:91        'gs_ub3' ( shared 3-component vector of uint)
 0:92      move second child to first child ( temp 3-component vector of uint)
@@ -557,7 +564,7 @@
 0:92        AtomicMax ( temp 3-component vector of uint)
 0:92          'gs_ua3' ( shared 3-component vector of uint)
 0:92          'gs_ub3' ( shared 3-component vector of uint)
-0:93      AtomicMin ( temp void)
+0:93      AtomicMin ( temp 3-component vector of uint)
 0:93        'gs_ua3' ( shared 3-component vector of uint)
 0:93        'gs_ub3' ( shared 3-component vector of uint)
 0:94      move second child to first child ( temp 3-component vector of uint)
@@ -565,7 +572,7 @@
 0:94        AtomicMin ( temp 3-component vector of uint)
 0:94          'gs_ua3' ( shared 3-component vector of uint)
 0:94          'gs_ub3' ( shared 3-component vector of uint)
-0:95      AtomicOr ( temp void)
+0:95      AtomicOr ( temp 3-component vector of uint)
 0:95        'gs_ua3' ( shared 3-component vector of uint)
 0:95        'gs_ub3' ( shared 3-component vector of uint)
 0:96      move second child to first child ( temp 3-component vector of uint)
@@ -573,7 +580,7 @@
 0:96        AtomicOr ( temp 3-component vector of uint)
 0:96          'gs_ua3' ( shared 3-component vector of uint)
 0:96          'gs_ub3' ( shared 3-component vector of uint)
-0:97      AtomicXor ( temp void)
+0:97      AtomicXor ( temp 3-component vector of uint)
 0:97        'gs_ua3' ( shared 3-component vector of uint)
 0:97        'gs_ub3' ( shared 3-component vector of uint)
 0:98      move second child to first child ( temp 3-component vector of uint)
@@ -595,8 +602,9 @@
 0:105      'inU1' ( in 4-component vector of uint)
 0:?     Sequence
 0:109      all ( temp bool)
-0:109        'inF0' ( in 4-component vector of float)
-0:112      AtomicAdd ( temp void)
+0:109        Convert float to bool ( temp 4-component vector of bool)
+0:109          'inF0' ( in 4-component vector of float)
+0:112      AtomicAdd ( temp 4-component vector of uint)
 0:112        'gs_ua4' ( shared 4-component vector of uint)
 0:112        'gs_ub4' ( shared 4-component vector of uint)
 0:113      move second child to first child ( temp 4-component vector of uint)
@@ -604,7 +612,7 @@
 0:113        AtomicAdd ( temp 4-component vector of uint)
 0:113          'gs_ua4' ( shared 4-component vector of uint)
 0:113          'gs_ub4' ( shared 4-component vector of uint)
-0:114      AtomicAnd ( temp void)
+0:114      AtomicAnd ( temp 4-component vector of uint)
 0:114        'gs_ua4' ( shared 4-component vector of uint)
 0:114        'gs_ub4' ( shared 4-component vector of uint)
 0:115      move second child to first child ( temp 4-component vector of uint)
@@ -623,7 +631,7 @@
 0:117        AtomicExchange ( temp 4-component vector of uint)
 0:117          'gs_ua4' ( shared 4-component vector of uint)
 0:117          'gs_ub4' ( shared 4-component vector of uint)
-0:118      AtomicMax ( temp void)
+0:118      AtomicMax ( temp 4-component vector of uint)
 0:118        'gs_ua4' ( shared 4-component vector of uint)
 0:118        'gs_ub4' ( shared 4-component vector of uint)
 0:119      move second child to first child ( temp 4-component vector of uint)
@@ -631,7 +639,7 @@
 0:119        AtomicMax ( temp 4-component vector of uint)
 0:119          'gs_ua4' ( shared 4-component vector of uint)
 0:119          'gs_ub4' ( shared 4-component vector of uint)
-0:120      AtomicMin ( temp void)
+0:120      AtomicMin ( temp 4-component vector of uint)
 0:120        'gs_ua4' ( shared 4-component vector of uint)
 0:120        'gs_ub4' ( shared 4-component vector of uint)
 0:121      move second child to first child ( temp 4-component vector of uint)
@@ -639,7 +647,7 @@
 0:121        AtomicMin ( temp 4-component vector of uint)
 0:121          'gs_ua4' ( shared 4-component vector of uint)
 0:121          'gs_ub4' ( shared 4-component vector of uint)
-0:122      AtomicOr ( temp void)
+0:122      AtomicOr ( temp 4-component vector of uint)
 0:122        'gs_ua4' ( shared 4-component vector of uint)
 0:122        'gs_ub4' ( shared 4-component vector of uint)
 0:123      move second child to first child ( temp 4-component vector of uint)
@@ -647,7 +655,7 @@
 0:123        AtomicOr ( temp 4-component vector of uint)
 0:123          'gs_ua4' ( shared 4-component vector of uint)
 0:123          'gs_ub4' ( shared 4-component vector of uint)
-0:124      AtomicXor ( temp void)
+0:124      AtomicXor ( temp 4-component vector of uint)
 0:124        'gs_ua4' ( shared 4-component vector of uint)
 0:124        'gs_ub4' ( shared 4-component vector of uint)
 0:125      move second child to first child ( temp 4-component vector of uint)
@@ -707,14 +715,18 @@
 0:?     'inU0' (layout( location=3) in 4-component vector of uint)
 0:?     'inU1' (layout( location=4) in 4-component vector of uint)
 
+error: SPIRV-Tools Validation Errors
+error: Expected operand to be vector bool: All
+  %64 = OpAll %bool %63
+
 // Module Version 10000
-// Generated by (magic number): 80001
-// Id's are bound by 255
+// Generated by (magic number): 80007
+// Id's are bound by 265
 
                               Capability Shader
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint GLCompute 4  "ComputeShaderFunction" 227 230 233 237 240 243
+                              EntryPoint GLCompute 4  "ComputeShaderFunction" 237 240 243 247 250 253
                               ExecutionMode 4 LocalSize 1 1 1
                               Source HLSL 500
                               Name 4  "ComputeShaderFunction"
@@ -746,44 +758,44 @@
                               Name 55  "inF2"
                               Name 56  "inU0"
                               Name 57  "inU1"
-                              Name 64  "gs_ua"
-                              Name 65  "gs_ub"
-                              Name 70  "out_u1"
-                              Name 78  "gs_uc"
-                              Name 107  "gs_ua2"
-                              Name 108  "gs_ub2"
-                              Name 111  "out_u2"
-                              Name 119  "gs_uc2"
-                              Name 148  "gs_ua3"
-                              Name 149  "gs_ub3"
-                              Name 152  "out_u3"
-                              Name 160  "gs_uc3"
-                              Name 188  "gs_ua4"
-                              Name 189  "gs_ub4"
-                              Name 192  "out_u4"
-                              Name 200  "gs_uc4"
-                              Name 225  "inF0"
-                              Name 227  "inF0"
-                              Name 229  "inF1"
-                              Name 230  "inF1"
-                              Name 232  "inF2"
-                              Name 233  "inF2"
-                              Name 235  "inU0"
-                              Name 237  "inU0"
-                              Name 239  "inU1"
-                              Name 240  "inU1"
-                              Name 243  "@entryPointOutput"
-                              Name 244  "param"
-                              Name 246  "param"
-                              Name 248  "param"
-                              Name 250  "param"
-                              Name 252  "param"
-                              Decorate 227(inF0) Location 0
-                              Decorate 230(inF1) Location 1
-                              Decorate 233(inF2) Location 2
-                              Decorate 237(inU0) Location 3
-                              Decorate 240(inU1) Location 4
-                              Decorate 243(@entryPointOutput) Location 0
+                              Name 66  "gs_ua"
+                              Name 67  "gs_ub"
+                              Name 72  "out_u1"
+                              Name 80  "gs_uc"
+                              Name 111  "gs_ua2"
+                              Name 112  "gs_ub2"
+                              Name 115  "out_u2"
+                              Name 123  "gs_uc2"
+                              Name 155  "gs_ua3"
+                              Name 156  "gs_ub3"
+                              Name 159  "out_u3"
+                              Name 167  "gs_uc3"
+                              Name 198  "gs_ua4"
+                              Name 199  "gs_ub4"
+                              Name 202  "out_u4"
+                              Name 210  "gs_uc4"
+                              Name 235  "inF0"
+                              Name 237  "inF0"
+                              Name 239  "inF1"
+                              Name 240  "inF1"
+                              Name 242  "inF2"
+                              Name 243  "inF2"
+                              Name 245  "inU0"
+                              Name 247  "inU0"
+                              Name 249  "inU1"
+                              Name 250  "inU1"
+                              Name 253  "@entryPointOutput"
+                              Name 254  "param"
+                              Name 256  "param"
+                              Name 258  "param"
+                              Name 260  "param"
+                              Name 262  "param"
+                              Decorate 237(inF0) Location 0
+                              Decorate 240(inF1) Location 1
+                              Decorate 243(inF2) Location 2
+                              Decorate 247(inU0) Location 3
+                              Decorate 250(inU1) Location 4
+                              Decorate 253(@entryPointOutput) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -808,75 +820,81 @@
               51:             TypePointer Function 50(ivec4)
               52:             TypeFunction 48(fvec4) 49(ptr) 49(ptr) 49(ptr) 51(ptr) 51(ptr)
               61:             TypeBool
-              63:             TypePointer Workgroup 8(int)
-       64(gs_ua):     63(ptr) Variable Workgroup
-       65(gs_ub):     63(ptr) Variable Workgroup
-              67:      8(int) Constant 1
-              68:      8(int) Constant 0
-       78(gs_uc):     63(ptr) Variable Workgroup
-              99:    6(float) Constant 0
-             106:             TypePointer Workgroup 26(ivec2)
-     107(gs_ua2):    106(ptr) Variable Workgroup
-     108(gs_ub2):    106(ptr) Variable Workgroup
-     119(gs_uc2):    106(ptr) Variable Workgroup
-             140:    6(float) Constant 1065353216
-             141:    6(float) Constant 1073741824
-             142:   24(fvec2) ConstantComposite 140 141
-             147:             TypePointer Workgroup 38(ivec3)
-     148(gs_ua3):    147(ptr) Variable Workgroup
-     149(gs_ub3):    147(ptr) Variable Workgroup
-     160(gs_uc3):    147(ptr) Variable Workgroup
-             181:    6(float) Constant 1077936128
-             182:   36(fvec3) ConstantComposite 140 141 181
-             187:             TypePointer Workgroup 50(ivec4)
-     188(gs_ua4):    187(ptr) Variable Workgroup
-     189(gs_ub4):    187(ptr) Variable Workgroup
-     200(gs_uc4):    187(ptr) Variable Workgroup
-             221:    6(float) Constant 1082130432
-             222:   48(fvec4) ConstantComposite 140 141 181 221
-             226:             TypePointer Input 48(fvec4)
-       227(inF0):    226(ptr) Variable Input
-       230(inF1):    226(ptr) Variable Input
-       233(inF2):    226(ptr) Variable Input
-             236:             TypePointer Input 50(ivec4)
-       237(inU0):    236(ptr) Variable Input
-       240(inU1):    236(ptr) Variable Input
-             242:             TypePointer Output 48(fvec4)
-243(@entryPointOutput):    242(ptr) Variable Output
+              62:    6(float) Constant 0
+              65:             TypePointer Workgroup 8(int)
+       66(gs_ua):     65(ptr) Variable Workgroup
+       67(gs_ub):     65(ptr) Variable Workgroup
+              69:      8(int) Constant 1
+              70:      8(int) Constant 0
+       80(gs_uc):     65(ptr) Variable Workgroup
+             106:             TypeVector 61(bool) 2
+             107:   24(fvec2) ConstantComposite 62 62
+             110:             TypePointer Workgroup 26(ivec2)
+     111(gs_ua2):    110(ptr) Variable Workgroup
+     112(gs_ub2):    110(ptr) Variable Workgroup
+     123(gs_uc2):    110(ptr) Variable Workgroup
+             144:    6(float) Constant 1065353216
+             145:    6(float) Constant 1073741824
+             146:   24(fvec2) ConstantComposite 144 145
+             150:             TypeVector 61(bool) 3
+             151:   36(fvec3) ConstantComposite 62 62 62
+             154:             TypePointer Workgroup 38(ivec3)
+     155(gs_ua3):    154(ptr) Variable Workgroup
+     156(gs_ub3):    154(ptr) Variable Workgroup
+     167(gs_uc3):    154(ptr) Variable Workgroup
+             188:    6(float) Constant 1077936128
+             189:   36(fvec3) ConstantComposite 144 145 188
+             193:             TypeVector 61(bool) 4
+             194:   48(fvec4) ConstantComposite 62 62 62 62
+             197:             TypePointer Workgroup 50(ivec4)
+     198(gs_ua4):    197(ptr) Variable Workgroup
+     199(gs_ub4):    197(ptr) Variable Workgroup
+     210(gs_uc4):    197(ptr) Variable Workgroup
+             231:    6(float) Constant 1082130432
+             232:   48(fvec4) ConstantComposite 144 145 188 231
+             236:             TypePointer Input 48(fvec4)
+       237(inF0):    236(ptr) Variable Input
+       240(inF1):    236(ptr) Variable Input
+       243(inF2):    236(ptr) Variable Input
+             246:             TypePointer Input 50(ivec4)
+       247(inU0):    246(ptr) Variable Input
+       250(inU1):    246(ptr) Variable Input
+             252:             TypePointer Output 48(fvec4)
+253(@entryPointOutput):    252(ptr) Variable Output
 4(ComputeShaderFunction):           2 Function None 3
                5:             Label
-       225(inF0):     49(ptr) Variable Function
-       229(inF1):     49(ptr) Variable Function
-       232(inF2):     49(ptr) Variable Function
-       235(inU0):     51(ptr) Variable Function
-       239(inU1):     51(ptr) Variable Function
-      244(param):     49(ptr) Variable Function
-      246(param):     49(ptr) Variable Function
-      248(param):     49(ptr) Variable Function
-      250(param):     51(ptr) Variable Function
-      252(param):     51(ptr) Variable Function
-             228:   48(fvec4) Load 227(inF0)
-                              Store 225(inF0) 228
-             231:   48(fvec4) Load 230(inF1)
-                              Store 229(inF1) 231
-             234:   48(fvec4) Load 233(inF2)
-                              Store 232(inF2) 234
-             238:   50(ivec4) Load 237(inU0)
-                              Store 235(inU0) 238
-             241:   50(ivec4) Load 240(inU1)
-                              Store 239(inU1) 241
-             245:   48(fvec4) Load 225(inF0)
-                              Store 244(param) 245
-             247:   48(fvec4) Load 229(inF1)
-                              Store 246(param) 247
-             249:   48(fvec4) Load 232(inF2)
-                              Store 248(param) 249
-             251:   50(ivec4) Load 235(inU0)
-                              Store 250(param) 251
-             253:   50(ivec4) Load 239(inU1)
-                              Store 252(param) 253
-             254:   48(fvec4) FunctionCall 58(@ComputeShaderFunction(vf4;vf4;vf4;vu4;vu4;) 244(param) 246(param) 248(param) 250(param) 252(param)
-                              Store 243(@entryPointOutput) 254
+       235(inF0):     49(ptr) Variable Function
+       239(inF1):     49(ptr) Variable Function
+       242(inF2):     49(ptr) Variable Function
+       245(inU0):     51(ptr) Variable Function
+       249(inU1):     51(ptr) Variable Function
+      254(param):     49(ptr) Variable Function
+      256(param):     49(ptr) Variable Function
+      258(param):     49(ptr) Variable Function
+      260(param):     51(ptr) Variable Function
+      262(param):     51(ptr) Variable Function
+             238:   48(fvec4) Load 237(inF0)
+                              Store 235(inF0) 238
+             241:   48(fvec4) Load 240(inF1)
+                              Store 239(inF1) 241
+             244:   48(fvec4) Load 243(inF2)
+                              Store 242(inF2) 244
+             248:   50(ivec4) Load 247(inU0)
+                              Store 245(inU0) 248
+             251:   50(ivec4) Load 250(inU1)
+                              Store 249(inU1) 251
+             255:   48(fvec4) Load 235(inF0)
+                              Store 254(param) 255
+             257:   48(fvec4) Load 239(inF1)
+                              Store 256(param) 257
+             259:   48(fvec4) Load 242(inF2)
+                              Store 258(param) 259
+             261:   50(ivec4) Load 245(inU0)
+                              Store 260(param) 261
+             263:   50(ivec4) Load 249(inU1)
+                              Store 262(param) 263
+             264:   48(fvec4) FunctionCall 58(@ComputeShaderFunction(vf4;vf4;vf4;vu4;vu4;) 254(param) 256(param) 258(param) 260(param) 262(param)
+                              Store 253(@entryPointOutput) 264
                               Return
                               FunctionEnd
 16(ComputeShaderFunctionS(f1;f1;f1;u1;u1;):    6(float) Function None 10
@@ -886,54 +904,55 @@
         14(inU0):      9(ptr) FunctionParameter
         15(inU1):      9(ptr) FunctionParameter
               17:             Label
-      70(out_u1):      9(ptr) Variable Function
+      72(out_u1):      9(ptr) Variable Function
               60:    6(float) Load 11(inF0)
-              62:    61(bool) All 60
-              66:      8(int) Load 65(gs_ub)
-              69:           2 AtomicIAdd 64(gs_ua) 67 68 66
-              71:      8(int) Load 65(gs_ub)
-              72:      8(int) AtomicIAdd 64(gs_ua) 67 68 71
-                              Store 70(out_u1) 72
-              73:      8(int) Load 65(gs_ub)
-              74:           2 AtomicAnd 64(gs_ua) 67 68 73
-              75:      8(int) Load 65(gs_ub)
-              76:      8(int) AtomicAnd 64(gs_ua) 67 68 75
-                              Store 70(out_u1) 76
-              77:      8(int) Load 65(gs_ub)
-              79:      8(int) Load 78(gs_uc)
-              80:      8(int) AtomicCompareExchange 64(gs_ua) 67 68 68 79 77
-                              Store 70(out_u1) 80
-              81:      8(int) Load 65(gs_ub)
-              82:      8(int) AtomicExchange 64(gs_ua) 67 68 81
-                              Store 70(out_u1) 82
-              83:      8(int) Load 65(gs_ub)
-              84:           2 AtomicSMax 64(gs_ua) 67 68 83
-              85:      8(int) Load 65(gs_ub)
-              86:      8(int) AtomicUMax 64(gs_ua) 67 68 85
-                              Store 70(out_u1) 86
-              87:      8(int) Load 65(gs_ub)
-              88:           2 AtomicSMin 64(gs_ua) 67 68 87
-              89:      8(int) Load 65(gs_ub)
-              90:      8(int) AtomicUMin 64(gs_ua) 67 68 89
-                              Store 70(out_u1) 90
-              91:      8(int) Load 65(gs_ub)
-              92:           2 AtomicOr 64(gs_ua) 67 68 91
-              93:      8(int) Load 65(gs_ub)
-              94:      8(int) AtomicOr 64(gs_ua) 67 68 93
-                              Store 70(out_u1) 94
-              95:      8(int) Load 65(gs_ub)
-              96:           2 AtomicXor 64(gs_ua) 67 68 95
-              97:      8(int) Load 65(gs_ub)
-              98:      8(int) AtomicXor 64(gs_ua) 67 68 97
-                              Store 70(out_u1) 98
-                              ReturnValue 99
+              63:    61(bool) FOrdNotEqual 60 62
+              64:    61(bool) All 63
+              68:      8(int) Load 67(gs_ub)
+              71:      8(int) AtomicIAdd 66(gs_ua) 69 70 68
+              73:      8(int) Load 67(gs_ub)
+              74:      8(int) AtomicIAdd 66(gs_ua) 69 70 73
+                              Store 72(out_u1) 74
+              75:      8(int) Load 67(gs_ub)
+              76:      8(int) AtomicAnd 66(gs_ua) 69 70 75
+              77:      8(int) Load 67(gs_ub)
+              78:      8(int) AtomicAnd 66(gs_ua) 69 70 77
+                              Store 72(out_u1) 78
+              79:      8(int) Load 67(gs_ub)
+              81:      8(int) Load 80(gs_uc)
+              82:      8(int) AtomicCompareExchange 66(gs_ua) 69 70 70 81 79
+                              Store 72(out_u1) 82
+              83:      8(int) Load 67(gs_ub)
+              84:      8(int) AtomicExchange 66(gs_ua) 69 70 83
+                              Store 72(out_u1) 84
+              85:      8(int) Load 67(gs_ub)
+              86:      8(int) AtomicUMax 66(gs_ua) 69 70 85
+              87:      8(int) Load 67(gs_ub)
+              88:      8(int) AtomicUMax 66(gs_ua) 69 70 87
+                              Store 72(out_u1) 88
+              89:      8(int) Load 67(gs_ub)
+              90:      8(int) AtomicUMin 66(gs_ua) 69 70 89
+              91:      8(int) Load 67(gs_ub)
+              92:      8(int) AtomicUMin 66(gs_ua) 69 70 91
+                              Store 72(out_u1) 92
+              93:      8(int) Load 67(gs_ub)
+              94:      8(int) AtomicOr 66(gs_ua) 69 70 93
+              95:      8(int) Load 67(gs_ub)
+              96:      8(int) AtomicOr 66(gs_ua) 69 70 95
+                              Store 72(out_u1) 96
+              97:      8(int) Load 67(gs_ub)
+              98:      8(int) AtomicXor 66(gs_ua) 69 70 97
+              99:      8(int) Load 67(gs_ub)
+             100:      8(int) AtomicXor 66(gs_ua) 69 70 99
+                              Store 72(out_u1) 100
+                              ReturnValue 62
                               FunctionEnd
 22(ComputeShaderFunction1(vf1;vf1;vf1;):    6(float) Function None 18
         19(inF0):      7(ptr) FunctionParameter
         20(inF1):      7(ptr) FunctionParameter
         21(inF2):      7(ptr) FunctionParameter
               23:             Label
-                              ReturnValue 99
+                              ReturnValue 62
                               FunctionEnd
 34(ComputeShaderFunction2(vf2;vf2;vf2;vu2;vu2;):   24(fvec2) Function None 28
         29(inF0):     25(ptr) FunctionParameter
@@ -942,47 +961,48 @@
         32(inU0):     27(ptr) FunctionParameter
         33(inU1):     27(ptr) FunctionParameter
               35:             Label
-     111(out_u2):     27(ptr) Variable Function
-             104:   24(fvec2) Load 29(inF0)
-             105:    61(bool) All 104
-             109:   26(ivec2) Load 108(gs_ub2)
-             110:           2 AtomicIAdd 107(gs_ua2) 67 68 109
-             112:   26(ivec2) Load 108(gs_ub2)
-             113:   26(ivec2) AtomicIAdd 107(gs_ua2) 67 68 112
-                              Store 111(out_u2) 113
-             114:   26(ivec2) Load 108(gs_ub2)
-             115:           2 AtomicAnd 107(gs_ua2) 67 68 114
-             116:   26(ivec2) Load 108(gs_ub2)
-             117:   26(ivec2) AtomicAnd 107(gs_ua2) 67 68 116
-                              Store 111(out_u2) 117
-             118:   26(ivec2) Load 108(gs_ub2)
-             120:   26(ivec2) Load 119(gs_uc2)
-             121:   26(ivec2) AtomicCompareExchange 107(gs_ua2) 67 68 68 120 118
-                              Store 111(out_u2) 121
-             122:   26(ivec2) Load 108(gs_ub2)
-             123:   26(ivec2) AtomicExchange 107(gs_ua2) 67 68 122
-                              Store 111(out_u2) 123
-             124:   26(ivec2) Load 108(gs_ub2)
-             125:           2 AtomicSMax 107(gs_ua2) 67 68 124
-             126:   26(ivec2) Load 108(gs_ub2)
-             127:   26(ivec2) AtomicUMax 107(gs_ua2) 67 68 126
-                              Store 111(out_u2) 127
-             128:   26(ivec2) Load 108(gs_ub2)
-             129:           2 AtomicSMin 107(gs_ua2) 67 68 128
-             130:   26(ivec2) Load 108(gs_ub2)
-             131:   26(ivec2) AtomicUMin 107(gs_ua2) 67 68 130
-                              Store 111(out_u2) 131
-             132:   26(ivec2) Load 108(gs_ub2)
-             133:           2 AtomicOr 107(gs_ua2) 67 68 132
-             134:   26(ivec2) Load 108(gs_ub2)
-             135:   26(ivec2) AtomicOr 107(gs_ua2) 67 68 134
-                              Store 111(out_u2) 135
-             136:   26(ivec2) Load 108(gs_ub2)
-             137:           2 AtomicXor 107(gs_ua2) 67 68 136
-             138:   26(ivec2) Load 108(gs_ub2)
-             139:   26(ivec2) AtomicXor 107(gs_ua2) 67 68 138
-                              Store 111(out_u2) 139
-                              ReturnValue 142
+     115(out_u2):     27(ptr) Variable Function
+             105:   24(fvec2) Load 29(inF0)
+             108:  106(bvec2) FOrdNotEqual 105 107
+             109:    61(bool) All 108
+             113:   26(ivec2) Load 112(gs_ub2)
+             114:   26(ivec2) AtomicIAdd 111(gs_ua2) 69 70 113
+             116:   26(ivec2) Load 112(gs_ub2)
+             117:   26(ivec2) AtomicIAdd 111(gs_ua2) 69 70 116
+                              Store 115(out_u2) 117
+             118:   26(ivec2) Load 112(gs_ub2)
+             119:   26(ivec2) AtomicAnd 111(gs_ua2) 69 70 118
+             120:   26(ivec2) Load 112(gs_ub2)
+             121:   26(ivec2) AtomicAnd 111(gs_ua2) 69 70 120
+                              Store 115(out_u2) 121
+             122:   26(ivec2) Load 112(gs_ub2)
+             124:   26(ivec2) Load 123(gs_uc2)
+             125:   26(ivec2) AtomicCompareExchange 111(gs_ua2) 69 70 70 124 122
+                              Store 115(out_u2) 125
+             126:   26(ivec2) Load 112(gs_ub2)
+             127:   26(ivec2) AtomicExchange 111(gs_ua2) 69 70 126
+                              Store 115(out_u2) 127
+             128:   26(ivec2) Load 112(gs_ub2)
+             129:   26(ivec2) AtomicUMax 111(gs_ua2) 69 70 128
+             130:   26(ivec2) Load 112(gs_ub2)
+             131:   26(ivec2) AtomicUMax 111(gs_ua2) 69 70 130
+                              Store 115(out_u2) 131
+             132:   26(ivec2) Load 112(gs_ub2)
+             133:   26(ivec2) AtomicUMin 111(gs_ua2) 69 70 132
+             134:   26(ivec2) Load 112(gs_ub2)
+             135:   26(ivec2) AtomicUMin 111(gs_ua2) 69 70 134
+                              Store 115(out_u2) 135
+             136:   26(ivec2) Load 112(gs_ub2)
+             137:   26(ivec2) AtomicOr 111(gs_ua2) 69 70 136
+             138:   26(ivec2) Load 112(gs_ub2)
+             139:   26(ivec2) AtomicOr 111(gs_ua2) 69 70 138
+                              Store 115(out_u2) 139
+             140:   26(ivec2) Load 112(gs_ub2)
+             141:   26(ivec2) AtomicXor 111(gs_ua2) 69 70 140
+             142:   26(ivec2) Load 112(gs_ub2)
+             143:   26(ivec2) AtomicXor 111(gs_ua2) 69 70 142
+                              Store 115(out_u2) 143
+                              ReturnValue 146
                               FunctionEnd
 46(ComputeShaderFunction3(vf3;vf3;vf3;vu3;vu3;):   36(fvec3) Function None 40
         41(inF0):     37(ptr) FunctionParameter
@@ -991,47 +1011,48 @@
         44(inU0):     39(ptr) FunctionParameter
         45(inU1):     39(ptr) FunctionParameter
               47:             Label
-     152(out_u3):     39(ptr) Variable Function
-             145:   36(fvec3) Load 41(inF0)
-             146:    61(bool) All 145
-             150:   38(ivec3) Load 149(gs_ub3)
-             151:           2 AtomicIAdd 148(gs_ua3) 67 68 150
-             153:   38(ivec3) Load 149(gs_ub3)
-             154:   38(ivec3) AtomicIAdd 148(gs_ua3) 67 68 153
-                              Store 152(out_u3) 154
-             155:   38(ivec3) Load 149(gs_ub3)
-             156:           2 AtomicAnd 148(gs_ua3) 67 68 155
-             157:   38(ivec3) Load 149(gs_ub3)
-             158:   38(ivec3) AtomicAnd 148(gs_ua3) 67 68 157
-                              Store 152(out_u3) 158
-             159:   38(ivec3) Load 149(gs_ub3)
-             161:   38(ivec3) Load 160(gs_uc3)
-             162:   38(ivec3) AtomicCompareExchange 148(gs_ua3) 67 68 68 161 159
-                              Store 152(out_u3) 162
-             163:   38(ivec3) Load 149(gs_ub3)
-             164:   38(ivec3) AtomicExchange 148(gs_ua3) 67 68 163
-                              Store 152(out_u3) 164
-             165:   38(ivec3) Load 149(gs_ub3)
-             166:           2 AtomicSMax 148(gs_ua3) 67 68 165
-             167:   38(ivec3) Load 149(gs_ub3)
-             168:   38(ivec3) AtomicUMax 148(gs_ua3) 67 68 167
-                              Store 152(out_u3) 168
-             169:   38(ivec3) Load 149(gs_ub3)
-             170:           2 AtomicSMin 148(gs_ua3) 67 68 169
-             171:   38(ivec3) Load 149(gs_ub3)
-             172:   38(ivec3) AtomicUMin 148(gs_ua3) 67 68 171
-                              Store 152(out_u3) 172
-             173:   38(ivec3) Load 149(gs_ub3)
-             174:           2 AtomicOr 148(gs_ua3) 67 68 173
-             175:   38(ivec3) Load 149(gs_ub3)
-             176:   38(ivec3) AtomicOr 148(gs_ua3) 67 68 175
-                              Store 152(out_u3) 176
-             177:   38(ivec3) Load 149(gs_ub3)
-             178:           2 AtomicXor 148(gs_ua3) 67 68 177
-             179:   38(ivec3) Load 149(gs_ub3)
-             180:   38(ivec3) AtomicXor 148(gs_ua3) 67 68 179
-                              Store 152(out_u3) 180
-                              ReturnValue 182
+     159(out_u3):     39(ptr) Variable Function
+             149:   36(fvec3) Load 41(inF0)
+             152:  150(bvec3) FOrdNotEqual 149 151
+             153:    61(bool) All 152
+             157:   38(ivec3) Load 156(gs_ub3)
+             158:   38(ivec3) AtomicIAdd 155(gs_ua3) 69 70 157
+             160:   38(ivec3) Load 156(gs_ub3)
+             161:   38(ivec3) AtomicIAdd 155(gs_ua3) 69 70 160
+                              Store 159(out_u3) 161
+             162:   38(ivec3) Load 156(gs_ub3)
+             163:   38(ivec3) AtomicAnd 155(gs_ua3) 69 70 162
+             164:   38(ivec3) Load 156(gs_ub3)
+             165:   38(ivec3) AtomicAnd 155(gs_ua3) 69 70 164
+                              Store 159(out_u3) 165
+             166:   38(ivec3) Load 156(gs_ub3)
+             168:   38(ivec3) Load 167(gs_uc3)
+             169:   38(ivec3) AtomicCompareExchange 155(gs_ua3) 69 70 70 168 166
+                              Store 159(out_u3) 169
+             170:   38(ivec3) Load 156(gs_ub3)
+             171:   38(ivec3) AtomicExchange 155(gs_ua3) 69 70 170
+                              Store 159(out_u3) 171
+             172:   38(ivec3) Load 156(gs_ub3)
+             173:   38(ivec3) AtomicUMax 155(gs_ua3) 69 70 172
+             174:   38(ivec3) Load 156(gs_ub3)
+             175:   38(ivec3) AtomicUMax 155(gs_ua3) 69 70 174
+                              Store 159(out_u3) 175
+             176:   38(ivec3) Load 156(gs_ub3)
+             177:   38(ivec3) AtomicUMin 155(gs_ua3) 69 70 176
+             178:   38(ivec3) Load 156(gs_ub3)
+             179:   38(ivec3) AtomicUMin 155(gs_ua3) 69 70 178
+                              Store 159(out_u3) 179
+             180:   38(ivec3) Load 156(gs_ub3)
+             181:   38(ivec3) AtomicOr 155(gs_ua3) 69 70 180
+             182:   38(ivec3) Load 156(gs_ub3)
+             183:   38(ivec3) AtomicOr 155(gs_ua3) 69 70 182
+                              Store 159(out_u3) 183
+             184:   38(ivec3) Load 156(gs_ub3)
+             185:   38(ivec3) AtomicXor 155(gs_ua3) 69 70 184
+             186:   38(ivec3) Load 156(gs_ub3)
+             187:   38(ivec3) AtomicXor 155(gs_ua3) 69 70 186
+                              Store 159(out_u3) 187
+                              ReturnValue 189
                               FunctionEnd
 58(@ComputeShaderFunction(vf4;vf4;vf4;vu4;vu4;):   48(fvec4) Function None 52
         53(inF0):     49(ptr) FunctionParameter
@@ -1040,45 +1061,46 @@
         56(inU0):     51(ptr) FunctionParameter
         57(inU1):     51(ptr) FunctionParameter
               59:             Label
-     192(out_u4):     51(ptr) Variable Function
-             185:   48(fvec4) Load 53(inF0)
-             186:    61(bool) All 185
-             190:   50(ivec4) Load 189(gs_ub4)
-             191:           2 AtomicIAdd 188(gs_ua4) 67 68 190
-             193:   50(ivec4) Load 189(gs_ub4)
-             194:   50(ivec4) AtomicIAdd 188(gs_ua4) 67 68 193
-                              Store 192(out_u4) 194
-             195:   50(ivec4) Load 189(gs_ub4)
-             196:           2 AtomicAnd 188(gs_ua4) 67 68 195
-             197:   50(ivec4) Load 189(gs_ub4)
-             198:   50(ivec4) AtomicAnd 188(gs_ua4) 67 68 197
-                              Store 192(out_u4) 198
-             199:   50(ivec4) Load 189(gs_ub4)
-             201:   50(ivec4) Load 200(gs_uc4)
-             202:   50(ivec4) AtomicCompareExchange 188(gs_ua4) 67 68 68 201 199
-                              Store 192(out_u4) 202
-             203:   50(ivec4) Load 189(gs_ub4)
-             204:   50(ivec4) AtomicExchange 188(gs_ua4) 67 68 203
-                              Store 192(out_u4) 204
-             205:   50(ivec4) Load 189(gs_ub4)
-             206:           2 AtomicSMax 188(gs_ua4) 67 68 205
-             207:   50(ivec4) Load 189(gs_ub4)
-             208:   50(ivec4) AtomicUMax 188(gs_ua4) 67 68 207
-                              Store 192(out_u4) 208
-             209:   50(ivec4) Load 189(gs_ub4)
-             210:           2 AtomicSMin 188(gs_ua4) 67 68 209
-             211:   50(ivec4) Load 189(gs_ub4)
-             212:   50(ivec4) AtomicUMin 188(gs_ua4) 67 68 211
-                              Store 192(out_u4) 212
-             213:   50(ivec4) Load 189(gs_ub4)
-             214:           2 AtomicOr 188(gs_ua4) 67 68 213
-             215:   50(ivec4) Load 189(gs_ub4)
-             216:   50(ivec4) AtomicOr 188(gs_ua4) 67 68 215
-                              Store 192(out_u4) 216
-             217:   50(ivec4) Load 189(gs_ub4)
-             218:           2 AtomicXor 188(gs_ua4) 67 68 217
-             219:   50(ivec4) Load 189(gs_ub4)
-             220:   50(ivec4) AtomicXor 188(gs_ua4) 67 68 219
-                              Store 192(out_u4) 220
-                              ReturnValue 222
+     202(out_u4):     51(ptr) Variable Function
+             192:   48(fvec4) Load 53(inF0)
+             195:  193(bvec4) FOrdNotEqual 192 194
+             196:    61(bool) All 195
+             200:   50(ivec4) Load 199(gs_ub4)
+             201:   50(ivec4) AtomicIAdd 198(gs_ua4) 69 70 200
+             203:   50(ivec4) Load 199(gs_ub4)
+             204:   50(ivec4) AtomicIAdd 198(gs_ua4) 69 70 203
+                              Store 202(out_u4) 204
+             205:   50(ivec4) Load 199(gs_ub4)
+             206:   50(ivec4) AtomicAnd 198(gs_ua4) 69 70 205
+             207:   50(ivec4) Load 199(gs_ub4)
+             208:   50(ivec4) AtomicAnd 198(gs_ua4) 69 70 207
+                              Store 202(out_u4) 208
+             209:   50(ivec4) Load 199(gs_ub4)
+             211:   50(ivec4) Load 210(gs_uc4)
+             212:   50(ivec4) AtomicCompareExchange 198(gs_ua4) 69 70 70 211 209
+                              Store 202(out_u4) 212
+             213:   50(ivec4) Load 199(gs_ub4)
+             214:   50(ivec4) AtomicExchange 198(gs_ua4) 69 70 213
+                              Store 202(out_u4) 214
+             215:   50(ivec4) Load 199(gs_ub4)
+             216:   50(ivec4) AtomicUMax 198(gs_ua4) 69 70 215
+             217:   50(ivec4) Load 199(gs_ub4)
+             218:   50(ivec4) AtomicUMax 198(gs_ua4) 69 70 217
+                              Store 202(out_u4) 218
+             219:   50(ivec4) Load 199(gs_ub4)
+             220:   50(ivec4) AtomicUMin 198(gs_ua4) 69 70 219
+             221:   50(ivec4) Load 199(gs_ub4)
+             222:   50(ivec4) AtomicUMin 198(gs_ua4) 69 70 221
+                              Store 202(out_u4) 222
+             223:   50(ivec4) Load 199(gs_ub4)
+             224:   50(ivec4) AtomicOr 198(gs_ua4) 69 70 223
+             225:   50(ivec4) Load 199(gs_ub4)
+             226:   50(ivec4) AtomicOr 198(gs_ua4) 69 70 225
+                              Store 202(out_u4) 226
+             227:   50(ivec4) Load 199(gs_ub4)
+             228:   50(ivec4) AtomicXor 198(gs_ua4) 69 70 227
+             229:   50(ivec4) Load 199(gs_ub4)
+             230:   50(ivec4) AtomicXor 198(gs_ua4) 69 70 229
+                              Store 202(out_u4) 230
+                              ReturnValue 232
                               FunctionEnd
diff --git a/Test/baseResults/hlsl.intrinsics.d3dcolortoubyte4.frag.out b/Test/baseResults/hlsl.intrinsics.d3dcolortoubyte4.frag.out
index 94b4ad7..970691c 100644
--- a/Test/baseResults/hlsl.intrinsics.d3dcolortoubyte4.frag.out
+++ b/Test/baseResults/hlsl.intrinsics.d3dcolortoubyte4.frag.out
@@ -74,7 +74,7 @@
 0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of int)
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 29
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.intrinsics.double.frag.out b/Test/baseResults/hlsl.intrinsics.double.frag.out
index f08775a..55a102f 100644
--- a/Test/baseResults/hlsl.intrinsics.double.frag.out
+++ b/Test/baseResults/hlsl.intrinsics.double.frag.out
@@ -35,28 +35,28 @@
 0:?     Sequence
 0:5      move second child to first child ( temp double)
 0:?         'inDV1a' ( temp double)
-0:?         'inDV1a' (layout( location=0) in double)
+0:?         'inDV1a' (layout( location=0) flat in double)
 0:5      move second child to first child ( temp double)
 0:?         'inDV1b' ( temp double)
-0:?         'inDV1b' (layout( location=1) in double)
+0:?         'inDV1b' (layout( location=1) flat in double)
 0:5      move second child to first child ( temp double)
 0:?         'inDV1c' ( temp double)
-0:?         'inDV1c' (layout( location=2) in double)
+0:?         'inDV1c' (layout( location=2) flat in double)
 0:5      move second child to first child ( temp 2-component vector of double)
 0:?         'inDV2' ( temp 2-component vector of double)
-0:?         'inDV2' (layout( location=3) in 2-component vector of double)
+0:?         'inDV2' (layout( location=3) flat in 2-component vector of double)
 0:5      move second child to first child ( temp 3-component vector of double)
 0:?         'inDV3' ( temp 3-component vector of double)
-0:?         'inDV3' (layout( location=4) in 3-component vector of double)
+0:?         'inDV3' (layout( location=4) flat in 3-component vector of double)
 0:5      move second child to first child ( temp 4-component vector of double)
 0:?         'inDV4' ( temp 4-component vector of double)
-0:?         'inDV4' (layout( location=6) in 4-component vector of double)
+0:?         'inDV4' (layout( location=6) flat in 4-component vector of double)
 0:5      move second child to first child ( temp uint)
 0:?         'inU1a' ( temp uint)
-0:?         'inU1a' (layout( location=8) in uint)
+0:?         'inU1a' (layout( location=8) flat in uint)
 0:5      move second child to first child ( temp uint)
 0:?         'inU1b' ( temp uint)
-0:?         'inU1b' (layout( location=9) in uint)
+0:?         'inU1b' (layout( location=9) flat in uint)
 0:5      move second child to first child ( temp float)
 0:?         '@entryPointOutput' (layout( location=0) out float)
 0:5        Function Call: @PixelShaderFunction(d1;d1;d1;vd2;vd3;vd4;u1;u1; ( temp float)
@@ -70,14 +70,14 @@
 0:?           'inU1b' ( temp uint)
 0:?   Linker Objects
 0:?     '@entryPointOutput' (layout( location=0) out float)
-0:?     'inDV1a' (layout( location=0) in double)
-0:?     'inDV1b' (layout( location=1) in double)
-0:?     'inDV1c' (layout( location=2) in double)
-0:?     'inDV2' (layout( location=3) in 2-component vector of double)
-0:?     'inDV3' (layout( location=4) in 3-component vector of double)
-0:?     'inDV4' (layout( location=6) in 4-component vector of double)
-0:?     'inU1a' (layout( location=8) in uint)
-0:?     'inU1b' (layout( location=9) in uint)
+0:?     'inDV1a' (layout( location=0) flat in double)
+0:?     'inDV1b' (layout( location=1) flat in double)
+0:?     'inDV1c' (layout( location=2) flat in double)
+0:?     'inDV2' (layout( location=3) flat in 2-component vector of double)
+0:?     'inDV3' (layout( location=4) flat in 3-component vector of double)
+0:?     'inDV4' (layout( location=6) flat in 4-component vector of double)
+0:?     'inU1a' (layout( location=8) flat in uint)
+0:?     'inU1b' (layout( location=9) flat in uint)
 
 
 Linked fragment stage:
@@ -119,28 +119,28 @@
 0:?     Sequence
 0:5      move second child to first child ( temp double)
 0:?         'inDV1a' ( temp double)
-0:?         'inDV1a' (layout( location=0) in double)
+0:?         'inDV1a' (layout( location=0) flat in double)
 0:5      move second child to first child ( temp double)
 0:?         'inDV1b' ( temp double)
-0:?         'inDV1b' (layout( location=1) in double)
+0:?         'inDV1b' (layout( location=1) flat in double)
 0:5      move second child to first child ( temp double)
 0:?         'inDV1c' ( temp double)
-0:?         'inDV1c' (layout( location=2) in double)
+0:?         'inDV1c' (layout( location=2) flat in double)
 0:5      move second child to first child ( temp 2-component vector of double)
 0:?         'inDV2' ( temp 2-component vector of double)
-0:?         'inDV2' (layout( location=3) in 2-component vector of double)
+0:?         'inDV2' (layout( location=3) flat in 2-component vector of double)
 0:5      move second child to first child ( temp 3-component vector of double)
 0:?         'inDV3' ( temp 3-component vector of double)
-0:?         'inDV3' (layout( location=4) in 3-component vector of double)
+0:?         'inDV3' (layout( location=4) flat in 3-component vector of double)
 0:5      move second child to first child ( temp 4-component vector of double)
 0:?         'inDV4' ( temp 4-component vector of double)
-0:?         'inDV4' (layout( location=6) in 4-component vector of double)
+0:?         'inDV4' (layout( location=6) flat in 4-component vector of double)
 0:5      move second child to first child ( temp uint)
 0:?         'inU1a' ( temp uint)
-0:?         'inU1a' (layout( location=8) in uint)
+0:?         'inU1a' (layout( location=8) flat in uint)
 0:5      move second child to first child ( temp uint)
 0:?         'inU1b' ( temp uint)
-0:?         'inU1b' (layout( location=9) in uint)
+0:?         'inU1b' (layout( location=9) flat in uint)
 0:5      move second child to first child ( temp float)
 0:?         '@entryPointOutput' (layout( location=0) out float)
 0:5        Function Call: @PixelShaderFunction(d1;d1;d1;vd2;vd3;vd4;u1;u1; ( temp float)
@@ -154,17 +154,17 @@
 0:?           'inU1b' ( temp uint)
 0:?   Linker Objects
 0:?     '@entryPointOutput' (layout( location=0) out float)
-0:?     'inDV1a' (layout( location=0) in double)
-0:?     'inDV1b' (layout( location=1) in double)
-0:?     'inDV1c' (layout( location=2) in double)
-0:?     'inDV2' (layout( location=3) in 2-component vector of double)
-0:?     'inDV3' (layout( location=4) in 3-component vector of double)
-0:?     'inDV4' (layout( location=6) in 4-component vector of double)
-0:?     'inU1a' (layout( location=8) in uint)
-0:?     'inU1b' (layout( location=9) in uint)
+0:?     'inDV1a' (layout( location=0) flat in double)
+0:?     'inDV1b' (layout( location=1) flat in double)
+0:?     'inDV1c' (layout( location=2) flat in double)
+0:?     'inDV2' (layout( location=3) flat in 2-component vector of double)
+0:?     'inDV3' (layout( location=4) flat in 3-component vector of double)
+0:?     'inDV4' (layout( location=6) flat in 4-component vector of double)
+0:?     'inU1a' (layout( location=8) flat in uint)
+0:?     'inU1b' (layout( location=9) flat in uint)
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 90
 
                               Capability Shader
@@ -211,40 +211,48 @@
                               Name 83  "param"
                               Name 85  "param"
                               Name 87  "param"
+                              Decorate 44(inDV1a) Flat
                               Decorate 44(inDV1a) Location 0
+                              Decorate 47(inDV1b) Flat
                               Decorate 47(inDV1b) Location 1
+                              Decorate 50(inDV1c) Flat
                               Decorate 50(inDV1c) Location 2
+                              Decorate 54(inDV2) Flat
                               Decorate 54(inDV2) Location 3
+                              Decorate 58(inDV3) Flat
                               Decorate 58(inDV3) Location 4
+                              Decorate 62(inDV4) Flat
                               Decorate 62(inDV4) Location 6
+                              Decorate 66(inU1a) Flat
                               Decorate 66(inU1a) Location 8
+                              Decorate 69(inU1b) Flat
                               Decorate 69(inU1b) Location 9
                               Decorate 72(@entryPointOutput) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 64
-               7:             TypePointer Function 6(float)
-               8:             TypeVector 6(float) 2
-               9:             TypePointer Function 8(fvec2)
-              10:             TypeVector 6(float) 3
-              11:             TypePointer Function 10(fvec3)
-              12:             TypeVector 6(float) 4
-              13:             TypePointer Function 12(fvec4)
+               7:             TypePointer Function 6(float64_t)
+               8:             TypeVector 6(float64_t) 2
+               9:             TypePointer Function 8(f64vec2)
+              10:             TypeVector 6(float64_t) 3
+              11:             TypePointer Function 10(f64vec3)
+              12:             TypeVector 6(float64_t) 4
+              13:             TypePointer Function 12(f64vec4)
               14:             TypeInt 32 0
               15:             TypePointer Function 14(int)
               16:             TypeFloat 32
               17:             TypeFunction 16(float) 7(ptr) 7(ptr) 7(ptr) 9(ptr) 11(ptr) 13(ptr) 15(ptr) 15(ptr)
               36:             TypeVector 14(int) 2
               39:   16(float) Constant 0
-              43:             TypePointer Input 6(float)
+              43:             TypePointer Input 6(float64_t)
       44(inDV1a):     43(ptr) Variable Input
       47(inDV1b):     43(ptr) Variable Input
       50(inDV1c):     43(ptr) Variable Input
-              53:             TypePointer Input 8(fvec2)
+              53:             TypePointer Input 8(f64vec2)
        54(inDV2):     53(ptr) Variable Input
-              57:             TypePointer Input 10(fvec3)
+              57:             TypePointer Input 10(f64vec3)
        58(inDV3):     57(ptr) Variable Input
-              61:             TypePointer Input 12(fvec4)
+              61:             TypePointer Input 12(f64vec4)
        62(inDV4):     61(ptr) Variable Input
               65:             TypePointer Input 14(int)
        66(inU1a):     65(ptr) Variable Input
@@ -269,33 +277,33 @@
        83(param):     13(ptr) Variable Function
        85(param):     15(ptr) Variable Function
        87(param):     15(ptr) Variable Function
-              45:    6(float) Load 44(inDV1a)
+              45:6(float64_t) Load 44(inDV1a)
                               Store 42(inDV1a) 45
-              48:    6(float) Load 47(inDV1b)
+              48:6(float64_t) Load 47(inDV1b)
                               Store 46(inDV1b) 48
-              51:    6(float) Load 50(inDV1c)
+              51:6(float64_t) Load 50(inDV1c)
                               Store 49(inDV1c) 51
-              55:    8(fvec2) Load 54(inDV2)
+              55:  8(f64vec2) Load 54(inDV2)
                               Store 52(inDV2) 55
-              59:   10(fvec3) Load 58(inDV3)
+              59: 10(f64vec3) Load 58(inDV3)
                               Store 56(inDV3) 59
-              63:   12(fvec4) Load 62(inDV4)
+              63: 12(f64vec4) Load 62(inDV4)
                               Store 60(inDV4) 63
               67:     14(int) Load 66(inU1a)
                               Store 64(inU1a) 67
               70:     14(int) Load 69(inU1b)
                               Store 68(inU1b) 70
-              74:    6(float) Load 42(inDV1a)
+              74:6(float64_t) Load 42(inDV1a)
                               Store 73(param) 74
-              76:    6(float) Load 46(inDV1b)
+              76:6(float64_t) Load 46(inDV1b)
                               Store 75(param) 76
-              78:    6(float) Load 49(inDV1c)
+              78:6(float64_t) Load 49(inDV1c)
                               Store 77(param) 78
-              80:    8(fvec2) Load 52(inDV2)
+              80:  8(f64vec2) Load 52(inDV2)
                               Store 79(param) 80
-              82:   10(fvec3) Load 56(inDV3)
+              82: 10(f64vec3) Load 56(inDV3)
                               Store 81(param) 82
-              84:   12(fvec4) Load 60(inDV4)
+              84: 12(f64vec4) Load 60(inDV4)
                               Store 83(param) 84
               86:     14(int) Load 64(inU1a)
                               Store 85(param) 86
@@ -317,15 +325,15 @@
               27:             Label
          28(r00):      7(ptr) Variable Function
          33(r01):      7(ptr) Variable Function
-              29:    6(float) Load 18(inDV1a)
-              30:    6(float) Load 19(inDV1b)
-              31:    6(float) Load 20(inDV1c)
-              32:    6(float) ExtInst 1(GLSL.std.450) 50(Fma) 29 30 31
+              29:6(float64_t) Load 18(inDV1a)
+              30:6(float64_t) Load 19(inDV1b)
+              31:6(float64_t) Load 20(inDV1c)
+              32:6(float64_t) ExtInst 1(GLSL.std.450) 50(Fma) 29 30 31
                               Store 28(r00) 32
               34:     14(int) Load 24(inU1a)
               35:     14(int) Load 25(inU1b)
               37:   36(ivec2) CompositeConstruct 34 35
-              38:    6(float) Bitcast 37
+              38:6(float64_t) Bitcast 37
                               Store 33(r01) 38
                               ReturnValue 39
                               FunctionEnd
diff --git a/Test/baseResults/hlsl.intrinsics.evalfns.frag.out b/Test/baseResults/hlsl.intrinsics.evalfns.frag.out
index 90a4db5..4fd1e7b 100644
--- a/Test/baseResults/hlsl.intrinsics.evalfns.frag.out
+++ b/Test/baseResults/hlsl.intrinsics.evalfns.frag.out
@@ -60,7 +60,7 @@
 0:?         'inF4' (layout( location=3) in 4-component vector of float)
 0:3      move second child to first child ( temp 2-component vector of int)
 0:?         'inI2' ( temp 2-component vector of int)
-0:?         'inI2' (layout( location=4) in 2-component vector of int)
+0:?         'inI2' (layout( location=4) flat in 2-component vector of int)
 0:3      Function Call: @main(f1;vf2;vf3;vf4;vi2; ( temp void)
 0:?         'inF1' ( temp float)
 0:?         'inF2' ( temp 2-component vector of float)
@@ -72,7 +72,7 @@
 0:?     'inF2' (layout( location=1) in 2-component vector of float)
 0:?     'inF3' (layout( location=2) in 3-component vector of float)
 0:?     'inF4' (layout( location=3) in 4-component vector of float)
-0:?     'inI2' (layout( location=4) in 2-component vector of int)
+0:?     'inI2' (layout( location=4) flat in 2-component vector of int)
 
 
 Linked fragment stage:
@@ -139,7 +139,7 @@
 0:?         'inF4' (layout( location=3) in 4-component vector of float)
 0:3      move second child to first child ( temp 2-component vector of int)
 0:?         'inI2' ( temp 2-component vector of int)
-0:?         'inI2' (layout( location=4) in 2-component vector of int)
+0:?         'inI2' (layout( location=4) flat in 2-component vector of int)
 0:3      Function Call: @main(f1;vf2;vf3;vf4;vi2; ( temp void)
 0:?         'inF1' ( temp float)
 0:?         'inF2' ( temp 2-component vector of float)
@@ -151,10 +151,14 @@
 0:?     'inF2' (layout( location=1) in 2-component vector of float)
 0:?     'inF3' (layout( location=2) in 3-component vector of float)
 0:?     'inF4' (layout( location=3) in 4-component vector of float)
-0:?     'inI2' (layout( location=4) in 2-component vector of int)
+0:?     'inI2' (layout( location=4) flat in 2-component vector of int)
+
+error: SPIRV-Tools Validation Errors
+error: GLSL.std.450 InterpolateAtOffset: expected Interpolant storage class to be Input
+  %28 = OpExtInst %float %1 InterpolateAtOffset %inF1 %27
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 80
 
                               Capability Shader
@@ -190,6 +194,7 @@
                               Decorate 55(inF2) Location 1
                               Decorate 59(inF3) Location 2
                               Decorate 63(inF4) Location 3
+                              Decorate 67(inI2) Flat
                               Decorate 67(inI2) Location 4
                2:             TypeVoid
                3:             TypeFunction 2
diff --git a/Test/baseResults/hlsl.intrinsics.f1632.frag.out b/Test/baseResults/hlsl.intrinsics.f1632.frag.out
index e828d96..c5619ef 100644
--- a/Test/baseResults/hlsl.intrinsics.f1632.frag.out
+++ b/Test/baseResults/hlsl.intrinsics.f1632.frag.out
@@ -260,7 +260,7 @@
 0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 103
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.intrinsics.f3216.frag.out b/Test/baseResults/hlsl.intrinsics.f3216.frag.out
index 3ff9ce7..c447efc 100644
--- a/Test/baseResults/hlsl.intrinsics.f3216.frag.out
+++ b/Test/baseResults/hlsl.intrinsics.f3216.frag.out
@@ -270,7 +270,7 @@
 0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 106
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.intrinsics.frag.out b/Test/baseResults/hlsl.intrinsics.frag.out
index 289592a..20d2bb0 100644
--- a/Test/baseResults/hlsl.intrinsics.frag.out
+++ b/Test/baseResults/hlsl.intrinsics.frag.out
@@ -2,19 +2,20 @@
 Shader version: 500
 gl_FragCoord origin is upper left
 0:? Sequence
-0:17  Function Definition: PixelShaderFunctionS(f1;f1;f1;u1;u1; ( temp float)
+0:17  Function Definition: PixelShaderFunctionS(f1;f1;f1;u1;i1; ( temp float)
 0:17    Function Parameters: 
 0:17      'inF0' ( in float)
 0:17      'inF1' ( in float)
 0:17      'inF2' ( in float)
 0:17      'inU0' ( in uint)
-0:17      'inU1' ( in uint)
+0:17      'inU1' ( in int)
 0:?     Sequence
 0:20      Sequence
 0:20        move second child to first child ( temp bool)
 0:20          'r000' ( temp bool)
 0:20          all ( temp bool)
-0:20            'inF0' ( in float)
+0:20            Convert float to bool ( temp bool)
+0:20              'inF0' ( in float)
 0:21      Sequence
 0:21        move second child to first child ( temp float)
 0:21          'r001' ( temp float)
@@ -29,7 +30,8 @@
 0:23        move second child to first child ( temp bool)
 0:23          'r003' ( temp bool)
 0:23          any ( temp bool)
-0:23            'inF0' ( in float)
+0:23            Convert float to bool ( temp bool)
+0:23              'inF0' ( in float)
 0:24      Sequence
 0:24        move second child to first child ( temp float)
 0:24          'r004' ( temp float)
@@ -44,7 +46,7 @@
 0:26        move second child to first child ( temp uint)
 0:26          'r006' ( temp uint)
 0:26          floatBitsToUint ( temp uint)
-0:26            'inF0' ( in float)
+0:26            'inU1' ( in int)
 0:27      Sequence
 0:27        move second child to first child ( temp float)
 0:27          'r007' ( temp float)
@@ -81,2024 +83,2081 @@
 0:33            0.000000
 0:33        true case
 0:33        Branch: Kill
-0:34      Sequence
-0:34        move second child to first child ( temp float)
-0:34          'r014' ( temp float)
-0:34          cosine ( temp float)
-0:34            'inF0' ( in float)
+0:34      Test condition and select ( temp void)
+0:34        Condition
+0:34        Compare Less Than ( temp bool)
+0:34          'r005' ( temp int)
+0:34          Constant:
+0:34            0 (const int)
+0:34        true case
+0:34        Branch: Kill
 0:35      Sequence
 0:35        move second child to first child ( temp float)
-0:35          'r015' ( temp float)
-0:35          hyp. cosine ( temp float)
+0:35          'r014' ( temp float)
+0:35          cosine ( temp float)
 0:35            'inF0' ( in float)
 0:36      Sequence
-0:36        move second child to first child ( temp int)
-0:36          'r016' ( temp int)
-0:36          bitCount ( temp int)
-0:36            Constant:
-0:36              7 (const int)
+0:36        move second child to first child ( temp float)
+0:36          'r015' ( temp float)
+0:36          hyp. cosine ( temp float)
+0:36            'inF0' ( in float)
 0:37      Sequence
-0:37        move second child to first child ( temp float)
-0:37          'r017' ( temp float)
-0:37          dPdx ( temp float)
-0:37            'inF0' ( in float)
+0:37        move second child to first child ( temp int)
+0:37          'r016' ( temp int)
+0:37          bitCount ( temp int)
+0:37            Constant:
+0:37              7 (const int)
 0:38      Sequence
 0:38        move second child to first child ( temp float)
-0:38          'r018' ( temp float)
-0:38          dPdxCoarse ( temp float)
+0:38          'r017' ( temp float)
+0:38          dPdx ( temp float)
 0:38            'inF0' ( in float)
 0:39      Sequence
 0:39        move second child to first child ( temp float)
-0:39          'r019' ( temp float)
-0:39          dPdxFine ( temp float)
+0:39          'r018' ( temp float)
+0:39          dPdxCoarse ( temp float)
 0:39            'inF0' ( in float)
 0:40      Sequence
 0:40        move second child to first child ( temp float)
-0:40          'r020' ( temp float)
-0:40          dPdy ( temp float)
+0:40          'r019' ( temp float)
+0:40          dPdxFine ( temp float)
 0:40            'inF0' ( in float)
 0:41      Sequence
 0:41        move second child to first child ( temp float)
-0:41          'r021' ( temp float)
-0:41          dPdyCoarse ( temp float)
+0:41          'r020' ( temp float)
+0:41          dPdy ( temp float)
 0:41            'inF0' ( in float)
 0:42      Sequence
 0:42        move second child to first child ( temp float)
-0:42          'r022' ( temp float)
-0:42          dPdyFine ( temp float)
+0:42          'r021' ( temp float)
+0:42          dPdyCoarse ( temp float)
 0:42            'inF0' ( in float)
 0:43      Sequence
 0:43        move second child to first child ( temp float)
-0:43          'r023' ( temp float)
-0:43          degrees ( temp float)
+0:43          'r022' ( temp float)
+0:43          dPdyFine ( temp float)
 0:43            'inF0' ( in float)
-0:47      Sequence
-0:47        move second child to first child ( temp float)
-0:47          'r027' ( temp float)
-0:47          exp ( temp float)
-0:47            'inF0' ( in float)
-0:48      Sequence
-0:48        move second child to first child ( temp float)
-0:48          'r028' ( temp float)
-0:48          exp2 ( temp float)
-0:48            'inF0' ( in float)
+0:44      Sequence
+0:44        move second child to first child ( temp float)
+0:44          'r023' ( temp float)
+0:44          degrees ( temp float)
+0:44            'inF0' ( in float)
+0:45      Sequence
+0:45        move second child to first child ( temp float)
+0:45          'r024' ( temp float)
+0:45          distance ( temp float)
+0:45            'inF0' ( in float)
+0:45            'inF1' ( in float)
 0:49      Sequence
-0:49        move second child to first child ( temp uint)
-0:49          'r029' ( temp uint)
-0:49          Convert int to uint ( temp uint)
-0:49            findMSB ( temp int)
-0:49              Constant:
-0:49                7 (const int)
+0:49        move second child to first child ( temp float)
+0:49          'r027' ( temp float)
+0:49          exp ( temp float)
+0:49            'inF0' ( in float)
 0:50      Sequence
-0:50        move second child to first child ( temp uint)
-0:50          'r030' ( temp uint)
-0:50          Convert int to uint ( temp uint)
-0:50            findLSB ( temp int)
-0:50              Constant:
-0:50                7 (const int)
+0:50        move second child to first child ( temp float)
+0:50          'r028' ( temp float)
+0:50          exp2 ( temp float)
+0:50            'inF0' ( in float)
 0:51      Sequence
-0:51        move second child to first child ( temp float)
-0:51          'r031' ( temp float)
-0:51          Floor ( temp float)
-0:51            'inF0' ( in float)
+0:51        move second child to first child ( temp uint)
+0:51          'r029' ( temp uint)
+0:51          Convert int to uint ( temp uint)
+0:51            findMSB ( temp int)
+0:51              Constant:
+0:51                7 (const int)
+0:52      Sequence
+0:52        move second child to first child ( temp uint)
+0:52          'r030' ( temp uint)
+0:52          Convert int to uint ( temp uint)
+0:52            findLSB ( temp int)
+0:52              Constant:
+0:52                7 (const int)
 0:53      Sequence
 0:53        move second child to first child ( temp float)
-0:53          'r033' ( temp float)
-0:53          mod ( temp float)
+0:53          'r031' ( temp float)
+0:53          Floor ( temp float)
 0:53            'inF0' ( in float)
-0:53            'inF1' ( in float)
-0:54      Sequence
-0:54        move second child to first child ( temp float)
-0:54          'r034' ( temp float)
-0:54          Fraction ( temp float)
-0:54            'inF0' ( in float)
 0:55      Sequence
 0:55        move second child to first child ( temp float)
-0:55          'r036' ( temp float)
-0:55          fwidth ( temp float)
+0:55          'r033' ( temp float)
+0:55          mod ( temp float)
 0:55            'inF0' ( in float)
+0:55            'inF1' ( in float)
 0:56      Sequence
-0:56        move second child to first child ( temp bool)
-0:56          'r037' ( temp bool)
-0:56          isinf ( temp bool)
+0:56        move second child to first child ( temp float)
+0:56          'r034' ( temp float)
+0:56          Fraction ( temp float)
 0:56            'inF0' ( in float)
 0:57      Sequence
-0:57        move second child to first child ( temp bool)
-0:57          'r038' ( temp bool)
-0:57          isnan ( temp bool)
+0:57        move second child to first child ( temp float)
+0:57          'r036' ( temp float)
+0:57          fwidth ( temp float)
 0:57            'inF0' ( in float)
 0:58      Sequence
-0:58        move second child to first child ( temp float)
-0:58          'r039' ( temp float)
-0:58          ldexp ( temp float)
+0:58        move second child to first child ( temp bool)
+0:58          'r037' ( temp bool)
+0:58          isinf ( temp bool)
 0:58            'inF0' ( in float)
-0:58            'inF1' ( in float)
 0:59      Sequence
-0:59        move second child to first child ( temp float)
-0:59          'r039a' ( temp float)
-0:59          mix ( temp float)
+0:59        move second child to first child ( temp bool)
+0:59          'r038' ( temp bool)
+0:59          isnan ( temp bool)
 0:59            'inF0' ( in float)
-0:59            'inF1' ( in float)
-0:59            'inF2' ( in float)
 0:60      Sequence
 0:60        move second child to first child ( temp float)
-0:60          'r040' ( temp float)
-0:60          log ( temp float)
+0:60          'r039' ( temp float)
+0:60          ldexp ( temp float)
 0:60            'inF0' ( in float)
+0:60            'inF1' ( in float)
 0:61      Sequence
 0:61        move second child to first child ( temp float)
-0:61          'r041' ( temp float)
-0:61          component-wise multiply ( temp float)
-0:61            log2 ( temp float)
-0:61              'inF0' ( in float)
-0:61            Constant:
-0:61              0.301030
+0:61          'r039a' ( temp float)
+0:61          mix ( temp float)
+0:61            'inF0' ( in float)
+0:61            'inF1' ( in float)
+0:61            'inF2' ( in float)
 0:62      Sequence
 0:62        move second child to first child ( temp float)
-0:62          'r042' ( temp float)
-0:62          log2 ( temp float)
+0:62          'r040' ( temp float)
+0:62          log ( temp float)
 0:62            'inF0' ( in float)
 0:63      Sequence
 0:63        move second child to first child ( temp float)
-0:63          'r043' ( temp float)
-0:63          max ( temp float)
-0:63            'inF0' ( in float)
-0:63            'inF1' ( in float)
+0:63          'r041' ( temp float)
+0:63          component-wise multiply ( temp float)
+0:63            log2 ( temp float)
+0:63              'inF0' ( in float)
+0:63            Constant:
+0:63              0.301030
 0:64      Sequence
 0:64        move second child to first child ( temp float)
-0:64          'r044' ( temp float)
-0:64          min ( temp float)
+0:64          'r042' ( temp float)
+0:64          log2 ( temp float)
 0:64            'inF0' ( in float)
-0:64            'inF1' ( in float)
 0:65      Sequence
 0:65        move second child to first child ( temp float)
-0:65          'r045' ( temp float)
-0:65          pow ( temp float)
+0:65          'r043' ( temp float)
+0:65          max ( temp float)
 0:65            'inF0' ( in float)
 0:65            'inF1' ( in float)
 0:66      Sequence
 0:66        move second child to first child ( temp float)
-0:66          'r046' ( temp float)
-0:66          radians ( temp float)
+0:66          'r044' ( temp float)
+0:66          min ( temp float)
 0:66            'inF0' ( in float)
+0:66            'inF1' ( in float)
 0:67      Sequence
 0:67        move second child to first child ( temp float)
-0:67          'r047' ( temp float)
-0:67          divide ( temp float)
-0:67            Constant:
-0:67              1.000000
+0:67          'r045' ( temp float)
+0:67          pow ( temp float)
 0:67            'inF0' ( in float)
+0:67            'inF1' ( in float)
 0:68      Sequence
-0:68        move second child to first child ( temp uint)
-0:68          'r048' ( temp uint)
-0:68          Convert int to uint ( temp uint)
-0:68            bitFieldReverse ( temp int)
-0:68              Constant:
-0:68                2 (const int)
+0:68        move second child to first child ( temp float)
+0:68          'r046' ( temp float)
+0:68          radians ( temp float)
+0:68            'inF0' ( in float)
 0:69      Sequence
 0:69        move second child to first child ( temp float)
-0:69          'r049' ( temp float)
-0:69          roundEven ( temp float)
+0:69          'r047' ( temp float)
+0:69          divide ( temp float)
+0:69            Constant:
+0:69              1.000000
 0:69            'inF0' ( in float)
 0:70      Sequence
-0:70        move second child to first child ( temp float)
-0:70          'r050' ( temp float)
-0:70          inverse sqrt ( temp float)
-0:70            'inF0' ( in float)
+0:70        move second child to first child ( temp uint)
+0:70          'r048' ( temp uint)
+0:70          Convert int to uint ( temp uint)
+0:70            bitFieldReverse ( temp int)
+0:70              Constant:
+0:70                2 (const int)
 0:71      Sequence
 0:71        move second child to first child ( temp float)
-0:71          'r051' ( temp float)
-0:71          clamp ( temp float)
+0:71          'r049' ( temp float)
+0:71          roundEven ( temp float)
 0:71            'inF0' ( in float)
-0:71            Constant:
-0:71              0.000000
-0:71            Constant:
-0:71              1.000000
 0:72      Sequence
 0:72        move second child to first child ( temp float)
-0:72          'r052' ( temp float)
-0:72          Sign ( temp float)
+0:72          'r050' ( temp float)
+0:72          inverse sqrt ( temp float)
 0:72            'inF0' ( in float)
 0:73      Sequence
 0:73        move second child to first child ( temp float)
-0:73          'r053' ( temp float)
-0:73          sine ( temp float)
+0:73          'r051' ( temp float)
+0:73          clamp ( temp float)
 0:73            'inF0' ( in float)
+0:73            Constant:
+0:73              0.000000
+0:73            Constant:
+0:73              1.000000
 0:74      Sequence
 0:74        move second child to first child ( temp float)
-0:74          'inF1' ( in float)
-0:74          sine ( temp float)
-0:74            'inF0' ( in float)
-0:74        move second child to first child ( temp float)
-0:74          'inF2' ( in float)
-0:74          cosine ( temp float)
+0:74          'r052' ( temp float)
+0:74          Sign ( temp float)
 0:74            'inF0' ( in float)
 0:75      Sequence
 0:75        move second child to first child ( temp float)
-0:75          'r055' ( temp float)
-0:75          hyp. sine ( temp float)
+0:75          'r053' ( temp float)
+0:75          sine ( temp float)
 0:75            'inF0' ( in float)
 0:76      Sequence
 0:76        move second child to first child ( temp float)
-0:76          'r056' ( temp float)
-0:76          smoothstep ( temp float)
+0:76          'inF1' ( in float)
+0:76          sine ( temp float)
 0:76            'inF0' ( in float)
-0:76            'inF1' ( in float)
-0:76            'inF2' ( in float)
+0:76        move second child to first child ( temp float)
+0:76          'inF2' ( in float)
+0:76          cosine ( temp float)
+0:76            'inF0' ( in float)
 0:77      Sequence
 0:77        move second child to first child ( temp float)
-0:77          'r057' ( temp float)
-0:77          sqrt ( temp float)
+0:77          'r055' ( temp float)
+0:77          hyp. sine ( temp float)
 0:77            'inF0' ( in float)
 0:78      Sequence
 0:78        move second child to first child ( temp float)
-0:78          'r058' ( temp float)
-0:78          step ( temp float)
+0:78          'r056' ( temp float)
+0:78          smoothstep ( temp float)
 0:78            'inF0' ( in float)
 0:78            'inF1' ( in float)
+0:78            'inF2' ( in float)
 0:79      Sequence
 0:79        move second child to first child ( temp float)
-0:79          'r059' ( temp float)
-0:79          tangent ( temp float)
+0:79          'r057' ( temp float)
+0:79          sqrt ( temp float)
 0:79            'inF0' ( in float)
 0:80      Sequence
 0:80        move second child to first child ( temp float)
-0:80          'r060' ( temp float)
-0:80          hyp. tangent ( temp float)
+0:80          'r058' ( temp float)
+0:80          step ( temp float)
 0:80            'inF0' ( in float)
+0:80            'inF1' ( in float)
+0:81      Sequence
+0:81        move second child to first child ( temp float)
+0:81          'r059' ( temp float)
+0:81          tangent ( temp float)
+0:81            'inF0' ( in float)
 0:82      Sequence
 0:82        move second child to first child ( temp float)
-0:82          'r061' ( temp float)
-0:82          trunc ( temp float)
+0:82          'r060' ( temp float)
+0:82          hyp. tangent ( temp float)
 0:82            'inF0' ( in float)
-0:84      Branch: Return with expression
-0:84        Constant:
-0:84          0.000000
-0:88  Function Definition: PixelShaderFunction1(vf1;vf1;vf1; ( temp 1-component vector of float)
-0:88    Function Parameters: 
-0:88      'inF0' ( in 1-component vector of float)
-0:88      'inF1' ( in 1-component vector of float)
-0:88      'inF2' ( in 1-component vector of float)
+0:84      Sequence
+0:84        move second child to first child ( temp float)
+0:84          'r061' ( temp float)
+0:84          trunc ( temp float)
+0:84            'inF0' ( in float)
+0:86      Branch: Return with expression
+0:86        Constant:
+0:86          0.000000
+0:90  Function Definition: PixelShaderFunction1(vf1;vf1;vf1; ( temp 1-component vector of float)
+0:90    Function Parameters: 
+0:90      'inF0' ( in 1-component vector of float)
+0:90      'inF1' ( in 1-component vector of float)
+0:90      'inF2' ( in 1-component vector of float)
 0:?     Sequence
-0:90      Branch: Return with expression
-0:90        Constant:
-0:90          0.000000
-0:94  Function Definition: PixelShaderFunction2(vf2;vf2;vf2;vu2;vu2; ( temp 2-component vector of float)
-0:94    Function Parameters: 
-0:94      'inF0' ( in 2-component vector of float)
-0:94      'inF1' ( in 2-component vector of float)
-0:94      'inF2' ( in 2-component vector of float)
-0:94      'inU0' ( in 2-component vector of uint)
-0:94      'inU1' ( in 2-component vector of uint)
+0:92      Branch: Return with expression
+0:92        Constant:
+0:92          0.000000
+0:96  Function Definition: PixelShaderFunction2(vf2;vf2;vf2;vu2;vu2; ( temp 2-component vector of float)
+0:96    Function Parameters: 
+0:96      'inF0' ( in 2-component vector of float)
+0:96      'inF1' ( in 2-component vector of float)
+0:96      'inF2' ( in 2-component vector of float)
+0:96      'inU0' ( in 2-component vector of uint)
+0:96      'inU1' ( in 2-component vector of uint)
 0:?     Sequence
-0:97      Sequence
-0:97        move second child to first child ( temp bool)
-0:97          'r000' ( temp bool)
-0:97          all ( temp bool)
-0:97            'inF0' ( in 2-component vector of float)
-0:98      Sequence
-0:98        move second child to first child ( temp 2-component vector of float)
-0:98          'r001' ( temp 2-component vector of float)
-0:98          Absolute value ( temp 2-component vector of float)
-0:98            'inF0' ( in 2-component vector of float)
 0:99      Sequence
-0:99        move second child to first child ( temp 2-component vector of float)
-0:99          'r002' ( temp 2-component vector of float)
-0:99          arc cosine ( temp 2-component vector of float)
-0:99            'inF0' ( in 2-component vector of float)
+0:99        move second child to first child ( temp bool)
+0:99          'r000' ( temp bool)
+0:99          all ( temp bool)
+0:99            Convert float to bool ( temp 2-component vector of bool)
+0:99              'inF0' ( in 2-component vector of float)
 0:100      Sequence
-0:100        move second child to first child ( temp bool)
-0:100          'r003' ( temp bool)
-0:100          any ( temp bool)
+0:100        move second child to first child ( temp 2-component vector of float)
+0:100          'r001' ( temp 2-component vector of float)
+0:100          Absolute value ( temp 2-component vector of float)
 0:100            'inF0' ( in 2-component vector of float)
 0:101      Sequence
 0:101        move second child to first child ( temp 2-component vector of float)
-0:101          'r004' ( temp 2-component vector of float)
-0:101          arc sine ( temp 2-component vector of float)
+0:101          'r002' ( temp 2-component vector of float)
+0:101          arc cosine ( temp 2-component vector of float)
 0:101            'inF0' ( in 2-component vector of float)
 0:102      Sequence
-0:102        move second child to first child ( temp 2-component vector of int)
-0:102          'r005' ( temp 2-component vector of int)
-0:102          floatBitsToInt ( temp 2-component vector of int)
-0:102            'inF0' ( in 2-component vector of float)
+0:102        move second child to first child ( temp bool)
+0:102          'r003' ( temp bool)
+0:102          any ( temp bool)
+0:102            Convert float to bool ( temp 2-component vector of bool)
+0:102              'inF0' ( in 2-component vector of float)
 0:103      Sequence
-0:103        move second child to first child ( temp 2-component vector of uint)
-0:103          'r006' ( temp 2-component vector of uint)
-0:103          floatBitsToUint ( temp 2-component vector of uint)
+0:103        move second child to first child ( temp 2-component vector of float)
+0:103          'r004' ( temp 2-component vector of float)
+0:103          arc sine ( temp 2-component vector of float)
 0:103            'inF0' ( in 2-component vector of float)
 0:104      Sequence
-0:104        move second child to first child ( temp 2-component vector of float)
-0:104          'r007' ( temp 2-component vector of float)
-0:104          intBitsToFloat ( temp 2-component vector of float)
-0:104            'inU0' ( in 2-component vector of uint)
+0:104        move second child to first child ( temp 2-component vector of int)
+0:104          'r005' ( temp 2-component vector of int)
+0:104          floatBitsToInt ( temp 2-component vector of int)
+0:104            'inF0' ( in 2-component vector of float)
+0:105      Sequence
+0:105        move second child to first child ( temp 2-component vector of uint)
+0:105          'r006' ( temp 2-component vector of uint)
+0:105          floatBitsToUint ( temp 2-component vector of uint)
+0:105            'inF0' ( in 2-component vector of float)
 0:106      Sequence
 0:106        move second child to first child ( temp 2-component vector of float)
-0:106          'r009' ( temp 2-component vector of float)
-0:106          arc tangent ( temp 2-component vector of float)
-0:106            'inF0' ( in 2-component vector of float)
-0:107      Sequence
-0:107        move second child to first child ( temp 2-component vector of float)
-0:107          'r010' ( temp 2-component vector of float)
-0:107          arc tangent ( temp 2-component vector of float)
-0:107            'inF0' ( in 2-component vector of float)
-0:107            'inF1' ( in 2-component vector of float)
+0:106          'r007' ( temp 2-component vector of float)
+0:106          intBitsToFloat ( temp 2-component vector of float)
+0:106            'inU0' ( in 2-component vector of uint)
 0:108      Sequence
 0:108        move second child to first child ( temp 2-component vector of float)
-0:108          'r011' ( temp 2-component vector of float)
-0:108          Ceiling ( temp 2-component vector of float)
+0:108          'r009' ( temp 2-component vector of float)
+0:108          arc tangent ( temp 2-component vector of float)
 0:108            'inF0' ( in 2-component vector of float)
 0:109      Sequence
 0:109        move second child to first child ( temp 2-component vector of float)
-0:109          'r012' ( temp 2-component vector of float)
-0:109          clamp ( temp 2-component vector of float)
+0:109          'r010' ( temp 2-component vector of float)
+0:109          arc tangent ( temp 2-component vector of float)
 0:109            'inF0' ( in 2-component vector of float)
 0:109            'inF1' ( in 2-component vector of float)
-0:109            'inF2' ( in 2-component vector of float)
-0:110      Test condition and select ( temp void)
-0:110        Condition
-0:110        any ( temp bool)
-0:110          Compare Less Than ( temp 2-component vector of bool)
+0:110      Sequence
+0:110        move second child to first child ( temp 2-component vector of float)
+0:110          'r011' ( temp 2-component vector of float)
+0:110          Ceiling ( temp 2-component vector of float)
 0:110            'inF0' ( in 2-component vector of float)
-0:110            Constant:
-0:110              0.000000
-0:110              0.000000
-0:110        true case
-0:110        Branch: Kill
 0:111      Sequence
 0:111        move second child to first child ( temp 2-component vector of float)
-0:111          'r013' ( temp 2-component vector of float)
-0:111          cosine ( temp 2-component vector of float)
+0:111          'r012' ( temp 2-component vector of float)
+0:111          clamp ( temp 2-component vector of float)
 0:111            'inF0' ( in 2-component vector of float)
-0:112      Sequence
-0:112        move second child to first child ( temp 2-component vector of float)
-0:112          'r015' ( temp 2-component vector of float)
-0:112          hyp. cosine ( temp 2-component vector of float)
+0:111            'inF1' ( in 2-component vector of float)
+0:111            'inF2' ( in 2-component vector of float)
+0:112      Test condition and select ( temp void)
+0:112        Condition
+0:112        any ( temp bool)
+0:112          Compare Less Than ( temp 2-component vector of bool)
 0:112            'inF0' ( in 2-component vector of float)
-0:113      Sequence
-0:113        move second child to first child ( temp 2-component vector of int)
-0:113          'r016' ( temp 2-component vector of int)
+0:112            Constant:
+0:112              0.000000
+0:112              0.000000
+0:112        true case
+0:112        Branch: Kill
+0:113      Test condition and select ( temp void)
+0:113        Condition
+0:113        any ( temp bool)
+0:113          Compare Less Than ( temp 2-component vector of bool)
+0:113            'inU0' ( in 2-component vector of uint)
+0:113            Constant:
+0:113              0.000000
+0:113              0.000000
+0:113        true case
+0:113        Branch: Kill
+0:114      Sequence
+0:114        move second child to first child ( temp 2-component vector of float)
+0:114          'r013' ( temp 2-component vector of float)
+0:114          cosine ( temp 2-component vector of float)
+0:114            'inF0' ( in 2-component vector of float)
+0:115      Sequence
+0:115        move second child to first child ( temp 2-component vector of float)
+0:115          'r015' ( temp 2-component vector of float)
+0:115          hyp. cosine ( temp 2-component vector of float)
+0:115            'inF0' ( in 2-component vector of float)
+0:116      Sequence
+0:116        move second child to first child ( temp 2-component vector of int)
+0:116          'r016' ( temp 2-component vector of int)
 0:?           bitCount ( temp 2-component vector of int)
 0:?             Constant:
 0:?               7 (const int)
 0:?               3 (const int)
-0:114      Sequence
-0:114        move second child to first child ( temp 2-component vector of float)
-0:114          'r017' ( temp 2-component vector of float)
-0:114          dPdx ( temp 2-component vector of float)
-0:114            'inF0' ( in 2-component vector of float)
-0:115      Sequence
-0:115        move second child to first child ( temp 2-component vector of float)
-0:115          'r018' ( temp 2-component vector of float)
-0:115          dPdxCoarse ( temp 2-component vector of float)
-0:115            'inF0' ( in 2-component vector of float)
-0:116      Sequence
-0:116        move second child to first child ( temp 2-component vector of float)
-0:116          'r019' ( temp 2-component vector of float)
-0:116          dPdxFine ( temp 2-component vector of float)
-0:116            'inF0' ( in 2-component vector of float)
 0:117      Sequence
 0:117        move second child to first child ( temp 2-component vector of float)
-0:117          'r020' ( temp 2-component vector of float)
-0:117          dPdy ( temp 2-component vector of float)
+0:117          'r017' ( temp 2-component vector of float)
+0:117          dPdx ( temp 2-component vector of float)
 0:117            'inF0' ( in 2-component vector of float)
 0:118      Sequence
 0:118        move second child to first child ( temp 2-component vector of float)
-0:118          'r021' ( temp 2-component vector of float)
-0:118          dPdyCoarse ( temp 2-component vector of float)
+0:118          'r018' ( temp 2-component vector of float)
+0:118          dPdxCoarse ( temp 2-component vector of float)
 0:118            'inF0' ( in 2-component vector of float)
 0:119      Sequence
 0:119        move second child to first child ( temp 2-component vector of float)
-0:119          'r022' ( temp 2-component vector of float)
-0:119          dPdyFine ( temp 2-component vector of float)
+0:119          'r019' ( temp 2-component vector of float)
+0:119          dPdxFine ( temp 2-component vector of float)
 0:119            'inF0' ( in 2-component vector of float)
 0:120      Sequence
 0:120        move second child to first child ( temp 2-component vector of float)
-0:120          'r023' ( temp 2-component vector of float)
-0:120          degrees ( temp 2-component vector of float)
+0:120          'r020' ( temp 2-component vector of float)
+0:120          dPdy ( temp 2-component vector of float)
 0:120            'inF0' ( in 2-component vector of float)
-0:124      Sequence
-0:124        move second child to first child ( temp float)
-0:124          'r026' ( temp float)
-0:124          distance ( temp float)
-0:124            'inF0' ( in 2-component vector of float)
-0:124            'inF1' ( in 2-component vector of float)
-0:125      Sequence
-0:125        move second child to first child ( temp float)
-0:125          'r027' ( temp float)
-0:125          dot-product ( temp float)
-0:125            'inF0' ( in 2-component vector of float)
-0:125            'inF1' ( in 2-component vector of float)
-0:129      Sequence
-0:129        move second child to first child ( temp 2-component vector of float)
-0:129          'r028' ( temp 2-component vector of float)
-0:129          exp ( temp 2-component vector of float)
-0:129            'inF0' ( in 2-component vector of float)
-0:130      Sequence
-0:130        move second child to first child ( temp 2-component vector of float)
-0:130          'r029' ( temp 2-component vector of float)
-0:130          exp2 ( temp 2-component vector of float)
-0:130            'inF0' ( in 2-component vector of float)
-0:131      Sequence
-0:131        move second child to first child ( temp 2-component vector of float)
-0:131          'r030' ( temp 2-component vector of float)
-0:131          face-forward ( temp 2-component vector of float)
-0:131            'inF0' ( in 2-component vector of float)
-0:131            'inF1' ( in 2-component vector of float)
-0:131            'inF2' ( in 2-component vector of float)
+0:121      Sequence
+0:121        move second child to first child ( temp 2-component vector of float)
+0:121          'r021' ( temp 2-component vector of float)
+0:121          dPdyCoarse ( temp 2-component vector of float)
+0:121            'inF0' ( in 2-component vector of float)
+0:122      Sequence
+0:122        move second child to first child ( temp 2-component vector of float)
+0:122          'r022' ( temp 2-component vector of float)
+0:122          dPdyFine ( temp 2-component vector of float)
+0:122            'inF0' ( in 2-component vector of float)
+0:123      Sequence
+0:123        move second child to first child ( temp 2-component vector of float)
+0:123          'r023' ( temp 2-component vector of float)
+0:123          degrees ( temp 2-component vector of float)
+0:123            'inF0' ( in 2-component vector of float)
+0:127      Sequence
+0:127        move second child to first child ( temp float)
+0:127          'r026' ( temp float)
+0:127          distance ( temp float)
+0:127            'inF0' ( in 2-component vector of float)
+0:127            'inF1' ( in 2-component vector of float)
+0:128      Sequence
+0:128        move second child to first child ( temp float)
+0:128          'r027' ( temp float)
+0:128          dot-product ( temp float)
+0:128            'inF0' ( in 2-component vector of float)
+0:128            'inF1' ( in 2-component vector of float)
 0:132      Sequence
-0:132        move second child to first child ( temp 2-component vector of uint)
-0:132          'r031' ( temp 2-component vector of uint)
+0:132        move second child to first child ( temp 2-component vector of float)
+0:132          'r028' ( temp 2-component vector of float)
+0:132          exp ( temp 2-component vector of float)
+0:132            'inF0' ( in 2-component vector of float)
+0:133      Sequence
+0:133        move second child to first child ( temp 2-component vector of float)
+0:133          'r029' ( temp 2-component vector of float)
+0:133          exp2 ( temp 2-component vector of float)
+0:133            'inF0' ( in 2-component vector of float)
+0:134      Sequence
+0:134        move second child to first child ( temp 2-component vector of float)
+0:134          'r030' ( temp 2-component vector of float)
+0:134          face-forward ( temp 2-component vector of float)
+0:134            'inF0' ( in 2-component vector of float)
+0:134            'inF1' ( in 2-component vector of float)
+0:134            'inF2' ( in 2-component vector of float)
+0:135      Sequence
+0:135        move second child to first child ( temp 2-component vector of uint)
+0:135          'r031' ( temp 2-component vector of uint)
 0:?           findMSB ( temp 2-component vector of uint)
 0:?             Constant:
 0:?               7 (const uint)
 0:?               8 (const uint)
-0:133      Sequence
-0:133        move second child to first child ( temp 2-component vector of uint)
-0:133          'r032' ( temp 2-component vector of uint)
+0:136      Sequence
+0:136        move second child to first child ( temp 2-component vector of uint)
+0:136          'r032' ( temp 2-component vector of uint)
 0:?           findLSB ( temp 2-component vector of uint)
 0:?             Constant:
 0:?               7 (const uint)
 0:?               8 (const uint)
-0:134      Sequence
-0:134        move second child to first child ( temp 2-component vector of float)
-0:134          'r033' ( temp 2-component vector of float)
-0:134          Floor ( temp 2-component vector of float)
-0:134            'inF0' ( in 2-component vector of float)
-0:136      Sequence
-0:136        move second child to first child ( temp 2-component vector of float)
-0:136          'r035' ( temp 2-component vector of float)
-0:136          mod ( temp 2-component vector of float)
-0:136            'inF0' ( in 2-component vector of float)
-0:136            'inF1' ( in 2-component vector of float)
 0:137      Sequence
 0:137        move second child to first child ( temp 2-component vector of float)
-0:137          'r036' ( temp 2-component vector of float)
-0:137          Fraction ( temp 2-component vector of float)
+0:137          'r033' ( temp 2-component vector of float)
+0:137          Floor ( temp 2-component vector of float)
 0:137            'inF0' ( in 2-component vector of float)
-0:138      Sequence
-0:138        move second child to first child ( temp 2-component vector of float)
-0:138          'r038' ( temp 2-component vector of float)
-0:138          fwidth ( temp 2-component vector of float)
-0:138            'inF0' ( in 2-component vector of float)
 0:139      Sequence
-0:139        move second child to first child ( temp 2-component vector of bool)
-0:139          'r039' ( temp 2-component vector of bool)
-0:139          isinf ( temp 2-component vector of bool)
+0:139        move second child to first child ( temp 2-component vector of float)
+0:139          'r035' ( temp 2-component vector of float)
+0:139          mod ( temp 2-component vector of float)
 0:139            'inF0' ( in 2-component vector of float)
+0:139            'inF1' ( in 2-component vector of float)
 0:140      Sequence
-0:140        move second child to first child ( temp 2-component vector of bool)
-0:140          'r040' ( temp 2-component vector of bool)
-0:140          isnan ( temp 2-component vector of bool)
+0:140        move second child to first child ( temp 2-component vector of float)
+0:140          'r036' ( temp 2-component vector of float)
+0:140          Fraction ( temp 2-component vector of float)
 0:140            'inF0' ( in 2-component vector of float)
 0:141      Sequence
 0:141        move second child to first child ( temp 2-component vector of float)
-0:141          'r041' ( temp 2-component vector of float)
-0:141          ldexp ( temp 2-component vector of float)
+0:141          'r038' ( temp 2-component vector of float)
+0:141          fwidth ( temp 2-component vector of float)
 0:141            'inF0' ( in 2-component vector of float)
-0:141            'inF1' ( in 2-component vector of float)
 0:142      Sequence
-0:142        move second child to first child ( temp 2-component vector of float)
-0:142          'r039a' ( temp 2-component vector of float)
-0:142          mix ( temp 2-component vector of float)
+0:142        move second child to first child ( temp 2-component vector of bool)
+0:142          'r039' ( temp 2-component vector of bool)
+0:142          isinf ( temp 2-component vector of bool)
 0:142            'inF0' ( in 2-component vector of float)
-0:142            'inF1' ( in 2-component vector of float)
-0:142            'inF2' ( in 2-component vector of float)
 0:143      Sequence
-0:143        move second child to first child ( temp float)
-0:143          'r042' ( temp float)
-0:143          length ( temp float)
+0:143        move second child to first child ( temp 2-component vector of bool)
+0:143          'r040' ( temp 2-component vector of bool)
+0:143          isnan ( temp 2-component vector of bool)
 0:143            'inF0' ( in 2-component vector of float)
 0:144      Sequence
 0:144        move second child to first child ( temp 2-component vector of float)
-0:144          'r043' ( temp 2-component vector of float)
-0:144          log ( temp 2-component vector of float)
+0:144          'r041' ( temp 2-component vector of float)
+0:144          ldexp ( temp 2-component vector of float)
 0:144            'inF0' ( in 2-component vector of float)
+0:144            'inF1' ( in 2-component vector of float)
 0:145      Sequence
 0:145        move second child to first child ( temp 2-component vector of float)
-0:145          'r044' ( temp 2-component vector of float)
-0:145          vector-scale ( temp 2-component vector of float)
-0:145            log2 ( temp 2-component vector of float)
-0:145              'inF0' ( in 2-component vector of float)
-0:145            Constant:
-0:145              0.301030
+0:145          'r039a' ( temp 2-component vector of float)
+0:145          mix ( temp 2-component vector of float)
+0:145            'inF0' ( in 2-component vector of float)
+0:145            'inF1' ( in 2-component vector of float)
+0:145            'inF2' ( in 2-component vector of float)
 0:146      Sequence
-0:146        move second child to first child ( temp 2-component vector of float)
-0:146          'r045' ( temp 2-component vector of float)
-0:146          log2 ( temp 2-component vector of float)
+0:146        move second child to first child ( temp float)
+0:146          'r042' ( temp float)
+0:146          length ( temp float)
 0:146            'inF0' ( in 2-component vector of float)
 0:147      Sequence
 0:147        move second child to first child ( temp 2-component vector of float)
-0:147          'r046' ( temp 2-component vector of float)
-0:147          max ( temp 2-component vector of float)
+0:147          'r043' ( temp 2-component vector of float)
+0:147          log ( temp 2-component vector of float)
 0:147            'inF0' ( in 2-component vector of float)
-0:147            'inF1' ( in 2-component vector of float)
 0:148      Sequence
 0:148        move second child to first child ( temp 2-component vector of float)
-0:148          'r047' ( temp 2-component vector of float)
-0:148          min ( temp 2-component vector of float)
-0:148            'inF0' ( in 2-component vector of float)
-0:148            'inF1' ( in 2-component vector of float)
+0:148          'r044' ( temp 2-component vector of float)
+0:148          vector-scale ( temp 2-component vector of float)
+0:148            log2 ( temp 2-component vector of float)
+0:148              'inF0' ( in 2-component vector of float)
+0:148            Constant:
+0:148              0.301030
 0:149      Sequence
 0:149        move second child to first child ( temp 2-component vector of float)
-0:149          'r048' ( temp 2-component vector of float)
-0:149          normalize ( temp 2-component vector of float)
+0:149          'r045' ( temp 2-component vector of float)
+0:149          log2 ( temp 2-component vector of float)
 0:149            'inF0' ( in 2-component vector of float)
 0:150      Sequence
 0:150        move second child to first child ( temp 2-component vector of float)
-0:150          'r049' ( temp 2-component vector of float)
-0:150          pow ( temp 2-component vector of float)
+0:150          'r046' ( temp 2-component vector of float)
+0:150          max ( temp 2-component vector of float)
 0:150            'inF0' ( in 2-component vector of float)
 0:150            'inF1' ( in 2-component vector of float)
 0:151      Sequence
 0:151        move second child to first child ( temp 2-component vector of float)
-0:151          'r050' ( temp 2-component vector of float)
-0:151          radians ( temp 2-component vector of float)
+0:151          'r047' ( temp 2-component vector of float)
+0:151          min ( temp 2-component vector of float)
 0:151            'inF0' ( in 2-component vector of float)
+0:151            'inF1' ( in 2-component vector of float)
 0:152      Sequence
 0:152        move second child to first child ( temp 2-component vector of float)
-0:152          'r051' ( temp 2-component vector of float)
-0:152          divide ( temp 2-component vector of float)
-0:152            Constant:
-0:152              1.000000
+0:152          'r048' ( temp 2-component vector of float)
+0:152          normalize ( temp 2-component vector of float)
 0:152            'inF0' ( in 2-component vector of float)
 0:153      Sequence
 0:153        move second child to first child ( temp 2-component vector of float)
-0:153          'r052' ( temp 2-component vector of float)
-0:153          reflect ( temp 2-component vector of float)
+0:153          'r049' ( temp 2-component vector of float)
+0:153          pow ( temp 2-component vector of float)
 0:153            'inF0' ( in 2-component vector of float)
 0:153            'inF1' ( in 2-component vector of float)
 0:154      Sequence
 0:154        move second child to first child ( temp 2-component vector of float)
-0:154          'r053' ( temp 2-component vector of float)
-0:154          refract ( temp 2-component vector of float)
+0:154          'r050' ( temp 2-component vector of float)
+0:154          radians ( temp 2-component vector of float)
 0:154            'inF0' ( in 2-component vector of float)
-0:154            'inF1' ( in 2-component vector of float)
-0:154            Constant:
-0:154              2.000000
 0:155      Sequence
-0:155        move second child to first child ( temp 2-component vector of uint)
-0:155          'r054' ( temp 2-component vector of uint)
+0:155        move second child to first child ( temp 2-component vector of float)
+0:155          'r051' ( temp 2-component vector of float)
+0:155          divide ( temp 2-component vector of float)
+0:155            Constant:
+0:155              1.000000
+0:155            'inF0' ( in 2-component vector of float)
+0:156      Sequence
+0:156        move second child to first child ( temp 2-component vector of float)
+0:156          'r052' ( temp 2-component vector of float)
+0:156          reflect ( temp 2-component vector of float)
+0:156            'inF0' ( in 2-component vector of float)
+0:156            'inF1' ( in 2-component vector of float)
+0:157      Sequence
+0:157        move second child to first child ( temp 2-component vector of float)
+0:157          'r053' ( temp 2-component vector of float)
+0:157          refract ( temp 2-component vector of float)
+0:157            'inF0' ( in 2-component vector of float)
+0:157            'inF1' ( in 2-component vector of float)
+0:157            Constant:
+0:157              2.000000
+0:158      Sequence
+0:158        move second child to first child ( temp 2-component vector of uint)
+0:158          'r054' ( temp 2-component vector of uint)
 0:?           bitFieldReverse ( temp 2-component vector of uint)
 0:?             Constant:
 0:?               1 (const uint)
 0:?               2 (const uint)
-0:156      Sequence
-0:156        move second child to first child ( temp 2-component vector of float)
-0:156          'r055' ( temp 2-component vector of float)
-0:156          roundEven ( temp 2-component vector of float)
-0:156            'inF0' ( in 2-component vector of float)
-0:157      Sequence
-0:157        move second child to first child ( temp 2-component vector of float)
-0:157          'r056' ( temp 2-component vector of float)
-0:157          inverse sqrt ( temp 2-component vector of float)
-0:157            'inF0' ( in 2-component vector of float)
-0:158      Sequence
-0:158        move second child to first child ( temp 2-component vector of float)
-0:158          'r057' ( temp 2-component vector of float)
-0:158          clamp ( temp 2-component vector of float)
-0:158            'inF0' ( in 2-component vector of float)
-0:158            Constant:
-0:158              0.000000
-0:158            Constant:
-0:158              1.000000
 0:159      Sequence
 0:159        move second child to first child ( temp 2-component vector of float)
-0:159          'r058' ( temp 2-component vector of float)
-0:159          Sign ( temp 2-component vector of float)
+0:159          'r055' ( temp 2-component vector of float)
+0:159          roundEven ( temp 2-component vector of float)
 0:159            'inF0' ( in 2-component vector of float)
 0:160      Sequence
 0:160        move second child to first child ( temp 2-component vector of float)
-0:160          'r059' ( temp 2-component vector of float)
-0:160          sine ( temp 2-component vector of float)
+0:160          'r056' ( temp 2-component vector of float)
+0:160          inverse sqrt ( temp 2-component vector of float)
 0:160            'inF0' ( in 2-component vector of float)
 0:161      Sequence
 0:161        move second child to first child ( temp 2-component vector of float)
-0:161          'inF1' ( in 2-component vector of float)
-0:161          sine ( temp 2-component vector of float)
+0:161          'r057' ( temp 2-component vector of float)
+0:161          clamp ( temp 2-component vector of float)
 0:161            'inF0' ( in 2-component vector of float)
-0:161        move second child to first child ( temp 2-component vector of float)
-0:161          'inF2' ( in 2-component vector of float)
-0:161          cosine ( temp 2-component vector of float)
-0:161            'inF0' ( in 2-component vector of float)
+0:161            Constant:
+0:161              0.000000
+0:161            Constant:
+0:161              1.000000
 0:162      Sequence
 0:162        move second child to first child ( temp 2-component vector of float)
-0:162          'r060' ( temp 2-component vector of float)
-0:162          hyp. sine ( temp 2-component vector of float)
+0:162          'r058' ( temp 2-component vector of float)
+0:162          Sign ( temp 2-component vector of float)
 0:162            'inF0' ( in 2-component vector of float)
 0:163      Sequence
 0:163        move second child to first child ( temp 2-component vector of float)
-0:163          'r061' ( temp 2-component vector of float)
-0:163          smoothstep ( temp 2-component vector of float)
+0:163          'r059' ( temp 2-component vector of float)
+0:163          sine ( temp 2-component vector of float)
 0:163            'inF0' ( in 2-component vector of float)
-0:163            'inF1' ( in 2-component vector of float)
-0:163            'inF2' ( in 2-component vector of float)
 0:164      Sequence
 0:164        move second child to first child ( temp 2-component vector of float)
-0:164          'r062' ( temp 2-component vector of float)
-0:164          sqrt ( temp 2-component vector of float)
+0:164          'inF1' ( in 2-component vector of float)
+0:164          sine ( temp 2-component vector of float)
+0:164            'inF0' ( in 2-component vector of float)
+0:164        move second child to first child ( temp 2-component vector of float)
+0:164          'inF2' ( in 2-component vector of float)
+0:164          cosine ( temp 2-component vector of float)
 0:164            'inF0' ( in 2-component vector of float)
 0:165      Sequence
 0:165        move second child to first child ( temp 2-component vector of float)
-0:165          'r063' ( temp 2-component vector of float)
-0:165          step ( temp 2-component vector of float)
+0:165          'r060' ( temp 2-component vector of float)
+0:165          hyp. sine ( temp 2-component vector of float)
 0:165            'inF0' ( in 2-component vector of float)
-0:165            'inF1' ( in 2-component vector of float)
 0:166      Sequence
 0:166        move second child to first child ( temp 2-component vector of float)
-0:166          'r064' ( temp 2-component vector of float)
-0:166          tangent ( temp 2-component vector of float)
+0:166          'r061' ( temp 2-component vector of float)
+0:166          smoothstep ( temp 2-component vector of float)
 0:166            'inF0' ( in 2-component vector of float)
+0:166            'inF1' ( in 2-component vector of float)
+0:166            'inF2' ( in 2-component vector of float)
 0:167      Sequence
 0:167        move second child to first child ( temp 2-component vector of float)
-0:167          'r065' ( temp 2-component vector of float)
-0:167          hyp. tangent ( temp 2-component vector of float)
+0:167          'r062' ( temp 2-component vector of float)
+0:167          sqrt ( temp 2-component vector of float)
 0:167            'inF0' ( in 2-component vector of float)
+0:168      Sequence
+0:168        move second child to first child ( temp 2-component vector of float)
+0:168          'r063' ( temp 2-component vector of float)
+0:168          step ( temp 2-component vector of float)
+0:168            'inF0' ( in 2-component vector of float)
+0:168            'inF1' ( in 2-component vector of float)
 0:169      Sequence
 0:169        move second child to first child ( temp 2-component vector of float)
-0:169          'r066' ( temp 2-component vector of float)
-0:169          trunc ( temp 2-component vector of float)
+0:169          'r064' ( temp 2-component vector of float)
+0:169          tangent ( temp 2-component vector of float)
 0:169            'inF0' ( in 2-component vector of float)
-0:172      Branch: Return with expression
+0:170      Sequence
+0:170        move second child to first child ( temp 2-component vector of float)
+0:170          'r065' ( temp 2-component vector of float)
+0:170          hyp. tangent ( temp 2-component vector of float)
+0:170            'inF0' ( in 2-component vector of float)
+0:172      Sequence
+0:172        move second child to first child ( temp 2-component vector of float)
+0:172          'r066' ( temp 2-component vector of float)
+0:172          trunc ( temp 2-component vector of float)
+0:172            'inF0' ( in 2-component vector of float)
+0:175      Branch: Return with expression
 0:?         Constant:
 0:?           1.000000
 0:?           2.000000
-0:176  Function Definition: PixelShaderFunction3(vf3;vf3;vf3;vu3;vu3; ( temp 3-component vector of float)
-0:176    Function Parameters: 
-0:176      'inF0' ( in 3-component vector of float)
-0:176      'inF1' ( in 3-component vector of float)
-0:176      'inF2' ( in 3-component vector of float)
-0:176      'inU0' ( in 3-component vector of uint)
-0:176      'inU1' ( in 3-component vector of uint)
+0:179  Function Definition: PixelShaderFunction3(vf3;vf3;vf3;vu3;vu3; ( temp 3-component vector of float)
+0:179    Function Parameters: 
+0:179      'inF0' ( in 3-component vector of float)
+0:179      'inF1' ( in 3-component vector of float)
+0:179      'inF2' ( in 3-component vector of float)
+0:179      'inU0' ( in 3-component vector of uint)
+0:179      'inU1' ( in 3-component vector of uint)
 0:?     Sequence
-0:179      Sequence
-0:179        move second child to first child ( temp bool)
-0:179          'r000' ( temp bool)
-0:179          all ( temp bool)
-0:179            'inF0' ( in 3-component vector of float)
-0:180      Sequence
-0:180        move second child to first child ( temp 3-component vector of float)
-0:180          'r001' ( temp 3-component vector of float)
-0:180          Absolute value ( temp 3-component vector of float)
-0:180            'inF0' ( in 3-component vector of float)
-0:181      Sequence
-0:181        move second child to first child ( temp 3-component vector of float)
-0:181          'r002' ( temp 3-component vector of float)
-0:181          arc cosine ( temp 3-component vector of float)
-0:181            'inF0' ( in 3-component vector of float)
 0:182      Sequence
 0:182        move second child to first child ( temp bool)
-0:182          'r003' ( temp bool)
-0:182          any ( temp bool)
-0:182            'inF0' ( in 3-component vector of float)
+0:182          'r000' ( temp bool)
+0:182          all ( temp bool)
+0:182            Convert float to bool ( temp 3-component vector of bool)
+0:182              'inF0' ( in 3-component vector of float)
 0:183      Sequence
 0:183        move second child to first child ( temp 3-component vector of float)
-0:183          'r004' ( temp 3-component vector of float)
-0:183          arc sine ( temp 3-component vector of float)
+0:183          'r001' ( temp 3-component vector of float)
+0:183          Absolute value ( temp 3-component vector of float)
 0:183            'inF0' ( in 3-component vector of float)
 0:184      Sequence
-0:184        move second child to first child ( temp 3-component vector of int)
-0:184          'r005' ( temp 3-component vector of int)
-0:184          floatBitsToInt ( temp 3-component vector of int)
+0:184        move second child to first child ( temp 3-component vector of float)
+0:184          'r002' ( temp 3-component vector of float)
+0:184          arc cosine ( temp 3-component vector of float)
 0:184            'inF0' ( in 3-component vector of float)
 0:185      Sequence
-0:185        move second child to first child ( temp 3-component vector of uint)
-0:185          'r006' ( temp 3-component vector of uint)
-0:185          floatBitsToUint ( temp 3-component vector of uint)
-0:185            'inF0' ( in 3-component vector of float)
+0:185        move second child to first child ( temp bool)
+0:185          'r003' ( temp bool)
+0:185          any ( temp bool)
+0:185            Convert float to bool ( temp 3-component vector of bool)
+0:185              'inF0' ( in 3-component vector of float)
 0:186      Sequence
 0:186        move second child to first child ( temp 3-component vector of float)
-0:186          'r007' ( temp 3-component vector of float)
-0:186          intBitsToFloat ( temp 3-component vector of float)
-0:186            'inU0' ( in 3-component vector of uint)
+0:186          'r004' ( temp 3-component vector of float)
+0:186          arc sine ( temp 3-component vector of float)
+0:186            'inF0' ( in 3-component vector of float)
+0:187      Sequence
+0:187        move second child to first child ( temp 3-component vector of int)
+0:187          'r005' ( temp 3-component vector of int)
+0:187          floatBitsToInt ( temp 3-component vector of int)
+0:187            'inF0' ( in 3-component vector of float)
 0:188      Sequence
-0:188        move second child to first child ( temp 3-component vector of float)
-0:188          'r009' ( temp 3-component vector of float)
-0:188          arc tangent ( temp 3-component vector of float)
+0:188        move second child to first child ( temp 3-component vector of uint)
+0:188          'r006' ( temp 3-component vector of uint)
+0:188          floatBitsToUint ( temp 3-component vector of uint)
 0:188            'inF0' ( in 3-component vector of float)
 0:189      Sequence
 0:189        move second child to first child ( temp 3-component vector of float)
-0:189          'r010' ( temp 3-component vector of float)
-0:189          arc tangent ( temp 3-component vector of float)
-0:189            'inF0' ( in 3-component vector of float)
-0:189            'inF1' ( in 3-component vector of float)
-0:190      Sequence
-0:190        move second child to first child ( temp 3-component vector of float)
-0:190          'r011' ( temp 3-component vector of float)
-0:190          Ceiling ( temp 3-component vector of float)
-0:190            'inF0' ( in 3-component vector of float)
+0:189          'r007' ( temp 3-component vector of float)
+0:189          intBitsToFloat ( temp 3-component vector of float)
+0:189            'inU0' ( in 3-component vector of uint)
 0:191      Sequence
 0:191        move second child to first child ( temp 3-component vector of float)
-0:191          'r012' ( temp 3-component vector of float)
-0:191          clamp ( temp 3-component vector of float)
+0:191          'r009' ( temp 3-component vector of float)
+0:191          arc tangent ( temp 3-component vector of float)
 0:191            'inF0' ( in 3-component vector of float)
-0:191            'inF1' ( in 3-component vector of float)
-0:191            'inF2' ( in 3-component vector of float)
-0:192      Test condition and select ( temp void)
-0:192        Condition
-0:192        any ( temp bool)
-0:192          Compare Less Than ( temp 3-component vector of bool)
+0:192      Sequence
+0:192        move second child to first child ( temp 3-component vector of float)
+0:192          'r010' ( temp 3-component vector of float)
+0:192          arc tangent ( temp 3-component vector of float)
 0:192            'inF0' ( in 3-component vector of float)
-0:192            Constant:
-0:192              0.000000
-0:192              0.000000
-0:192              0.000000
-0:192        true case
-0:192        Branch: Kill
+0:192            'inF1' ( in 3-component vector of float)
 0:193      Sequence
 0:193        move second child to first child ( temp 3-component vector of float)
-0:193          'r013' ( temp 3-component vector of float)
-0:193          cosine ( temp 3-component vector of float)
+0:193          'r011' ( temp 3-component vector of float)
+0:193          Ceiling ( temp 3-component vector of float)
 0:193            'inF0' ( in 3-component vector of float)
 0:194      Sequence
 0:194        move second child to first child ( temp 3-component vector of float)
-0:194          'r014' ( temp 3-component vector of float)
-0:194          hyp. cosine ( temp 3-component vector of float)
+0:194          'r012' ( temp 3-component vector of float)
+0:194          clamp ( temp 3-component vector of float)
 0:194            'inF0' ( in 3-component vector of float)
-0:195      Sequence
-0:195        move second child to first child ( temp 3-component vector of uint)
-0:195          'r015' ( temp 3-component vector of uint)
+0:194            'inF1' ( in 3-component vector of float)
+0:194            'inF2' ( in 3-component vector of float)
+0:195      Test condition and select ( temp void)
+0:195        Condition
+0:195        any ( temp bool)
+0:195          Compare Less Than ( temp 3-component vector of bool)
+0:195            'inF0' ( in 3-component vector of float)
+0:195            Constant:
+0:195              0.000000
+0:195              0.000000
+0:195              0.000000
+0:195        true case
+0:195        Branch: Kill
+0:196      Test condition and select ( temp void)
+0:196        Condition
+0:196        any ( temp bool)
+0:196          Compare Less Than ( temp 3-component vector of bool)
+0:196            'inU0' ( in 3-component vector of uint)
+0:196            Constant:
+0:196              0.000000
+0:196              0.000000
+0:196              0.000000
+0:196        true case
+0:196        Branch: Kill
+0:197      Sequence
+0:197        move second child to first child ( temp 3-component vector of float)
+0:197          'r013' ( temp 3-component vector of float)
+0:197          cosine ( temp 3-component vector of float)
+0:197            'inF0' ( in 3-component vector of float)
+0:198      Sequence
+0:198        move second child to first child ( temp 3-component vector of float)
+0:198          'r014' ( temp 3-component vector of float)
+0:198          hyp. cosine ( temp 3-component vector of float)
+0:198            'inF0' ( in 3-component vector of float)
+0:199      Sequence
+0:199        move second child to first child ( temp 3-component vector of uint)
+0:199          'r015' ( temp 3-component vector of uint)
 0:?           bitCount ( temp 3-component vector of uint)
 0:?             Constant:
 0:?               7 (const uint)
 0:?               3 (const uint)
 0:?               5 (const uint)
-0:196      Sequence
-0:196        move second child to first child ( temp 3-component vector of float)
-0:196          'r016' ( temp 3-component vector of float)
-0:196          cross-product ( temp 3-component vector of float)
-0:196            'inF0' ( in 3-component vector of float)
-0:196            'inF1' ( in 3-component vector of float)
-0:197      Sequence
-0:197        move second child to first child ( temp 3-component vector of float)
-0:197          'r017' ( temp 3-component vector of float)
-0:197          dPdx ( temp 3-component vector of float)
-0:197            'inF0' ( in 3-component vector of float)
-0:198      Sequence
-0:198        move second child to first child ( temp 3-component vector of float)
-0:198          'r018' ( temp 3-component vector of float)
-0:198          dPdxCoarse ( temp 3-component vector of float)
-0:198            'inF0' ( in 3-component vector of float)
-0:199      Sequence
-0:199        move second child to first child ( temp 3-component vector of float)
-0:199          'r019' ( temp 3-component vector of float)
-0:199          dPdxFine ( temp 3-component vector of float)
-0:199            'inF0' ( in 3-component vector of float)
 0:200      Sequence
 0:200        move second child to first child ( temp 3-component vector of float)
-0:200          'r020' ( temp 3-component vector of float)
-0:200          dPdy ( temp 3-component vector of float)
+0:200          'r016' ( temp 3-component vector of float)
+0:200          cross-product ( temp 3-component vector of float)
 0:200            'inF0' ( in 3-component vector of float)
+0:200            'inF1' ( in 3-component vector of float)
 0:201      Sequence
 0:201        move second child to first child ( temp 3-component vector of float)
-0:201          'r021' ( temp 3-component vector of float)
-0:201          dPdyCoarse ( temp 3-component vector of float)
+0:201          'r017' ( temp 3-component vector of float)
+0:201          dPdx ( temp 3-component vector of float)
 0:201            'inF0' ( in 3-component vector of float)
 0:202      Sequence
 0:202        move second child to first child ( temp 3-component vector of float)
-0:202          'r022' ( temp 3-component vector of float)
-0:202          dPdyFine ( temp 3-component vector of float)
+0:202          'r018' ( temp 3-component vector of float)
+0:202          dPdxCoarse ( temp 3-component vector of float)
 0:202            'inF0' ( in 3-component vector of float)
 0:203      Sequence
 0:203        move second child to first child ( temp 3-component vector of float)
-0:203          'r023' ( temp 3-component vector of float)
-0:203          degrees ( temp 3-component vector of float)
+0:203          'r019' ( temp 3-component vector of float)
+0:203          dPdxFine ( temp 3-component vector of float)
 0:203            'inF0' ( in 3-component vector of float)
 0:204      Sequence
-0:204        move second child to first child ( temp float)
-0:204          'r024' ( temp float)
-0:204          distance ( temp float)
+0:204        move second child to first child ( temp 3-component vector of float)
+0:204          'r020' ( temp 3-component vector of float)
+0:204          dPdy ( temp 3-component vector of float)
 0:204            'inF0' ( in 3-component vector of float)
-0:204            'inF1' ( in 3-component vector of float)
 0:205      Sequence
-0:205        move second child to first child ( temp float)
-0:205          'r025' ( temp float)
-0:205          dot-product ( temp float)
+0:205        move second child to first child ( temp 3-component vector of float)
+0:205          'r021' ( temp 3-component vector of float)
+0:205          dPdyCoarse ( temp 3-component vector of float)
 0:205            'inF0' ( in 3-component vector of float)
-0:205            'inF1' ( in 3-component vector of float)
+0:206      Sequence
+0:206        move second child to first child ( temp 3-component vector of float)
+0:206          'r022' ( temp 3-component vector of float)
+0:206          dPdyFine ( temp 3-component vector of float)
+0:206            'inF0' ( in 3-component vector of float)
+0:207      Sequence
+0:207        move second child to first child ( temp 3-component vector of float)
+0:207          'r023' ( temp 3-component vector of float)
+0:207          degrees ( temp 3-component vector of float)
+0:207            'inF0' ( in 3-component vector of float)
+0:208      Sequence
+0:208        move second child to first child ( temp float)
+0:208          'r024' ( temp float)
+0:208          distance ( temp float)
+0:208            'inF0' ( in 3-component vector of float)
+0:208            'inF1' ( in 3-component vector of float)
 0:209      Sequence
-0:209        move second child to first child ( temp 3-component vector of float)
-0:209          'r029' ( temp 3-component vector of float)
-0:209          exp ( temp 3-component vector of float)
+0:209        move second child to first child ( temp float)
+0:209          'r025' ( temp float)
+0:209          dot-product ( temp float)
 0:209            'inF0' ( in 3-component vector of float)
-0:210      Sequence
-0:210        move second child to first child ( temp 3-component vector of float)
-0:210          'r030' ( temp 3-component vector of float)
-0:210          exp2 ( temp 3-component vector of float)
-0:210            'inF0' ( in 3-component vector of float)
-0:211      Sequence
-0:211        move second child to first child ( temp 3-component vector of float)
-0:211          'r031' ( temp 3-component vector of float)
-0:211          face-forward ( temp 3-component vector of float)
-0:211            'inF0' ( in 3-component vector of float)
-0:211            'inF1' ( in 3-component vector of float)
-0:211            'inF2' ( in 3-component vector of float)
-0:212      Sequence
-0:212        move second child to first child ( temp 3-component vector of uint)
-0:212          'r032' ( temp 3-component vector of uint)
+0:209            'inF1' ( in 3-component vector of float)
+0:213      Sequence
+0:213        move second child to first child ( temp 3-component vector of float)
+0:213          'r029' ( temp 3-component vector of float)
+0:213          exp ( temp 3-component vector of float)
+0:213            'inF0' ( in 3-component vector of float)
+0:214      Sequence
+0:214        move second child to first child ( temp 3-component vector of float)
+0:214          'r030' ( temp 3-component vector of float)
+0:214          exp2 ( temp 3-component vector of float)
+0:214            'inF0' ( in 3-component vector of float)
+0:215      Sequence
+0:215        move second child to first child ( temp 3-component vector of float)
+0:215          'r031' ( temp 3-component vector of float)
+0:215          face-forward ( temp 3-component vector of float)
+0:215            'inF0' ( in 3-component vector of float)
+0:215            'inF1' ( in 3-component vector of float)
+0:215            'inF2' ( in 3-component vector of float)
+0:216      Sequence
+0:216        move second child to first child ( temp 3-component vector of uint)
+0:216          'r032' ( temp 3-component vector of uint)
 0:?           findMSB ( temp 3-component vector of uint)
 0:?             Constant:
 0:?               2 (const uint)
 0:?               3 (const uint)
 0:?               4 (const uint)
-0:213      Sequence
-0:213        move second child to first child ( temp 3-component vector of uint)
-0:213          'r033' ( temp 3-component vector of uint)
+0:217      Sequence
+0:217        move second child to first child ( temp 3-component vector of uint)
+0:217          'r033' ( temp 3-component vector of uint)
 0:?           findLSB ( temp 3-component vector of uint)
 0:?             Constant:
 0:?               2 (const uint)
 0:?               3 (const uint)
 0:?               4 (const uint)
-0:214      Sequence
-0:214        move second child to first child ( temp 3-component vector of float)
-0:214          'r034' ( temp 3-component vector of float)
-0:214          Floor ( temp 3-component vector of float)
-0:214            'inF0' ( in 3-component vector of float)
-0:216      Sequence
-0:216        move second child to first child ( temp 3-component vector of float)
-0:216          'r036' ( temp 3-component vector of float)
-0:216          mod ( temp 3-component vector of float)
-0:216            'inF0' ( in 3-component vector of float)
-0:216            'inF1' ( in 3-component vector of float)
-0:217      Sequence
-0:217        move second child to first child ( temp 3-component vector of float)
-0:217          'r037' ( temp 3-component vector of float)
-0:217          Fraction ( temp 3-component vector of float)
-0:217            'inF0' ( in 3-component vector of float)
 0:218      Sequence
 0:218        move second child to first child ( temp 3-component vector of float)
-0:218          'r039' ( temp 3-component vector of float)
-0:218          fwidth ( temp 3-component vector of float)
+0:218          'r034' ( temp 3-component vector of float)
+0:218          Floor ( temp 3-component vector of float)
 0:218            'inF0' ( in 3-component vector of float)
-0:219      Sequence
-0:219        move second child to first child ( temp 3-component vector of bool)
-0:219          'r040' ( temp 3-component vector of bool)
-0:219          isinf ( temp 3-component vector of bool)
-0:219            'inF0' ( in 3-component vector of float)
 0:220      Sequence
-0:220        move second child to first child ( temp 3-component vector of bool)
-0:220          'r041' ( temp 3-component vector of bool)
-0:220          isnan ( temp 3-component vector of bool)
+0:220        move second child to first child ( temp 3-component vector of float)
+0:220          'r036' ( temp 3-component vector of float)
+0:220          mod ( temp 3-component vector of float)
 0:220            'inF0' ( in 3-component vector of float)
+0:220            'inF1' ( in 3-component vector of float)
 0:221      Sequence
 0:221        move second child to first child ( temp 3-component vector of float)
-0:221          'r042' ( temp 3-component vector of float)
-0:221          ldexp ( temp 3-component vector of float)
+0:221          'r037' ( temp 3-component vector of float)
+0:221          Fraction ( temp 3-component vector of float)
 0:221            'inF0' ( in 3-component vector of float)
-0:221            'inF1' ( in 3-component vector of float)
 0:222      Sequence
 0:222        move second child to first child ( temp 3-component vector of float)
-0:222          'r039a' ( temp 3-component vector of float)
-0:222          mix ( temp 3-component vector of float)
+0:222          'r039' ( temp 3-component vector of float)
+0:222          fwidth ( temp 3-component vector of float)
 0:222            'inF0' ( in 3-component vector of float)
-0:222            'inF1' ( in 3-component vector of float)
-0:222            'inF2' ( in 3-component vector of float)
 0:223      Sequence
-0:223        move second child to first child ( temp 3-component vector of float)
-0:223          'r039b' ( temp 3-component vector of float)
-0:223          mix ( temp 3-component vector of float)
+0:223        move second child to first child ( temp 3-component vector of bool)
+0:223          'r040' ( temp 3-component vector of bool)
+0:223          isinf ( temp 3-component vector of bool)
 0:223            'inF0' ( in 3-component vector of float)
-0:223            'inF1' ( in 3-component vector of float)
-0:223            Constant:
-0:223              0.300000
 0:224      Sequence
-0:224        move second child to first child ( temp float)
-0:224          'r043' ( temp float)
-0:224          length ( temp float)
+0:224        move second child to first child ( temp 3-component vector of bool)
+0:224          'r041' ( temp 3-component vector of bool)
+0:224          isnan ( temp 3-component vector of bool)
 0:224            'inF0' ( in 3-component vector of float)
 0:225      Sequence
 0:225        move second child to first child ( temp 3-component vector of float)
-0:225          'r044' ( temp 3-component vector of float)
-0:225          log ( temp 3-component vector of float)
+0:225          'r042' ( temp 3-component vector of float)
+0:225          ldexp ( temp 3-component vector of float)
 0:225            'inF0' ( in 3-component vector of float)
+0:225            'inF1' ( in 3-component vector of float)
 0:226      Sequence
 0:226        move second child to first child ( temp 3-component vector of float)
-0:226          'r045' ( temp 3-component vector of float)
-0:226          vector-scale ( temp 3-component vector of float)
-0:226            log2 ( temp 3-component vector of float)
-0:226              'inF0' ( in 3-component vector of float)
-0:226            Constant:
-0:226              0.301030
+0:226          'r039a' ( temp 3-component vector of float)
+0:226          mix ( temp 3-component vector of float)
+0:226            'inF0' ( in 3-component vector of float)
+0:226            'inF1' ( in 3-component vector of float)
+0:226            'inF2' ( in 3-component vector of float)
 0:227      Sequence
 0:227        move second child to first child ( temp 3-component vector of float)
-0:227          'r046' ( temp 3-component vector of float)
-0:227          log2 ( temp 3-component vector of float)
+0:227          'r039b' ( temp 3-component vector of float)
+0:227          mix ( temp 3-component vector of float)
 0:227            'inF0' ( in 3-component vector of float)
+0:227            'inF1' ( in 3-component vector of float)
+0:227            Constant:
+0:227              0.300000
 0:228      Sequence
-0:228        move second child to first child ( temp 3-component vector of float)
-0:228          'r047' ( temp 3-component vector of float)
-0:228          max ( temp 3-component vector of float)
+0:228        move second child to first child ( temp float)
+0:228          'r043' ( temp float)
+0:228          length ( temp float)
 0:228            'inF0' ( in 3-component vector of float)
-0:228            'inF1' ( in 3-component vector of float)
 0:229      Sequence
 0:229        move second child to first child ( temp 3-component vector of float)
-0:229          'r048' ( temp 3-component vector of float)
-0:229          min ( temp 3-component vector of float)
+0:229          'r044' ( temp 3-component vector of float)
+0:229          log ( temp 3-component vector of float)
 0:229            'inF0' ( in 3-component vector of float)
-0:229            'inF1' ( in 3-component vector of float)
 0:230      Sequence
 0:230        move second child to first child ( temp 3-component vector of float)
-0:230          'r049' ( temp 3-component vector of float)
-0:230          normalize ( temp 3-component vector of float)
-0:230            'inF0' ( in 3-component vector of float)
+0:230          'r045' ( temp 3-component vector of float)
+0:230          vector-scale ( temp 3-component vector of float)
+0:230            log2 ( temp 3-component vector of float)
+0:230              'inF0' ( in 3-component vector of float)
+0:230            Constant:
+0:230              0.301030
 0:231      Sequence
 0:231        move second child to first child ( temp 3-component vector of float)
-0:231          'r050' ( temp 3-component vector of float)
-0:231          pow ( temp 3-component vector of float)
+0:231          'r046' ( temp 3-component vector of float)
+0:231          log2 ( temp 3-component vector of float)
 0:231            'inF0' ( in 3-component vector of float)
-0:231            'inF1' ( in 3-component vector of float)
 0:232      Sequence
 0:232        move second child to first child ( temp 3-component vector of float)
-0:232          'r051' ( temp 3-component vector of float)
-0:232          radians ( temp 3-component vector of float)
+0:232          'r047' ( temp 3-component vector of float)
+0:232          max ( temp 3-component vector of float)
 0:232            'inF0' ( in 3-component vector of float)
+0:232            'inF1' ( in 3-component vector of float)
 0:233      Sequence
 0:233        move second child to first child ( temp 3-component vector of float)
-0:233          'r052' ( temp 3-component vector of float)
-0:233          divide ( temp 3-component vector of float)
-0:233            Constant:
-0:233              1.000000
+0:233          'r048' ( temp 3-component vector of float)
+0:233          min ( temp 3-component vector of float)
 0:233            'inF0' ( in 3-component vector of float)
+0:233            'inF1' ( in 3-component vector of float)
 0:234      Sequence
 0:234        move second child to first child ( temp 3-component vector of float)
-0:234          'r053' ( temp 3-component vector of float)
-0:234          reflect ( temp 3-component vector of float)
+0:234          'r049' ( temp 3-component vector of float)
+0:234          normalize ( temp 3-component vector of float)
 0:234            'inF0' ( in 3-component vector of float)
-0:234            'inF1' ( in 3-component vector of float)
 0:235      Sequence
 0:235        move second child to first child ( temp 3-component vector of float)
-0:235          'r054' ( temp 3-component vector of float)
-0:235          refract ( temp 3-component vector of float)
+0:235          'r050' ( temp 3-component vector of float)
+0:235          pow ( temp 3-component vector of float)
 0:235            'inF0' ( in 3-component vector of float)
 0:235            'inF1' ( in 3-component vector of float)
-0:235            Constant:
-0:235              2.000000
 0:236      Sequence
-0:236        move second child to first child ( temp 3-component vector of uint)
-0:236          'r055' ( temp 3-component vector of uint)
+0:236        move second child to first child ( temp 3-component vector of float)
+0:236          'r051' ( temp 3-component vector of float)
+0:236          radians ( temp 3-component vector of float)
+0:236            'inF0' ( in 3-component vector of float)
+0:237      Sequence
+0:237        move second child to first child ( temp 3-component vector of float)
+0:237          'r052' ( temp 3-component vector of float)
+0:237          divide ( temp 3-component vector of float)
+0:237            Constant:
+0:237              1.000000
+0:237            'inF0' ( in 3-component vector of float)
+0:238      Sequence
+0:238        move second child to first child ( temp 3-component vector of float)
+0:238          'r053' ( temp 3-component vector of float)
+0:238          reflect ( temp 3-component vector of float)
+0:238            'inF0' ( in 3-component vector of float)
+0:238            'inF1' ( in 3-component vector of float)
+0:239      Sequence
+0:239        move second child to first child ( temp 3-component vector of float)
+0:239          'r054' ( temp 3-component vector of float)
+0:239          refract ( temp 3-component vector of float)
+0:239            'inF0' ( in 3-component vector of float)
+0:239            'inF1' ( in 3-component vector of float)
+0:239            Constant:
+0:239              2.000000
+0:240      Sequence
+0:240        move second child to first child ( temp 3-component vector of uint)
+0:240          'r055' ( temp 3-component vector of uint)
 0:?           bitFieldReverse ( temp 3-component vector of uint)
 0:?             Constant:
 0:?               1 (const uint)
 0:?               2 (const uint)
 0:?               3 (const uint)
-0:237      Sequence
-0:237        move second child to first child ( temp 3-component vector of float)
-0:237          'r056' ( temp 3-component vector of float)
-0:237          roundEven ( temp 3-component vector of float)
-0:237            'inF0' ( in 3-component vector of float)
-0:238      Sequence
-0:238        move second child to first child ( temp 3-component vector of float)
-0:238          'r057' ( temp 3-component vector of float)
-0:238          inverse sqrt ( temp 3-component vector of float)
-0:238            'inF0' ( in 3-component vector of float)
-0:239      Sequence
-0:239        move second child to first child ( temp 3-component vector of float)
-0:239          'r058' ( temp 3-component vector of float)
-0:239          clamp ( temp 3-component vector of float)
-0:239            'inF0' ( in 3-component vector of float)
-0:239            Constant:
-0:239              0.000000
-0:239            Constant:
-0:239              1.000000
-0:240      Sequence
-0:240        move second child to first child ( temp 3-component vector of float)
-0:240          'r059' ( temp 3-component vector of float)
-0:240          Sign ( temp 3-component vector of float)
-0:240            'inF0' ( in 3-component vector of float)
 0:241      Sequence
 0:241        move second child to first child ( temp 3-component vector of float)
-0:241          'r060' ( temp 3-component vector of float)
-0:241          sine ( temp 3-component vector of float)
+0:241          'r056' ( temp 3-component vector of float)
+0:241          roundEven ( temp 3-component vector of float)
 0:241            'inF0' ( in 3-component vector of float)
 0:242      Sequence
 0:242        move second child to first child ( temp 3-component vector of float)
-0:242          'inF1' ( in 3-component vector of float)
-0:242          sine ( temp 3-component vector of float)
-0:242            'inF0' ( in 3-component vector of float)
-0:242        move second child to first child ( temp 3-component vector of float)
-0:242          'inF2' ( in 3-component vector of float)
-0:242          cosine ( temp 3-component vector of float)
+0:242          'r057' ( temp 3-component vector of float)
+0:242          inverse sqrt ( temp 3-component vector of float)
 0:242            'inF0' ( in 3-component vector of float)
 0:243      Sequence
 0:243        move second child to first child ( temp 3-component vector of float)
-0:243          'r061' ( temp 3-component vector of float)
-0:243          hyp. sine ( temp 3-component vector of float)
+0:243          'r058' ( temp 3-component vector of float)
+0:243          clamp ( temp 3-component vector of float)
 0:243            'inF0' ( in 3-component vector of float)
+0:243            Constant:
+0:243              0.000000
+0:243            Constant:
+0:243              1.000000
 0:244      Sequence
 0:244        move second child to first child ( temp 3-component vector of float)
-0:244          'r062' ( temp 3-component vector of float)
-0:244          smoothstep ( temp 3-component vector of float)
+0:244          'r059' ( temp 3-component vector of float)
+0:244          Sign ( temp 3-component vector of float)
 0:244            'inF0' ( in 3-component vector of float)
-0:244            'inF1' ( in 3-component vector of float)
-0:244            'inF2' ( in 3-component vector of float)
 0:245      Sequence
 0:245        move second child to first child ( temp 3-component vector of float)
-0:245          'r063' ( temp 3-component vector of float)
-0:245          sqrt ( temp 3-component vector of float)
+0:245          'r060' ( temp 3-component vector of float)
+0:245          sine ( temp 3-component vector of float)
 0:245            'inF0' ( in 3-component vector of float)
 0:246      Sequence
 0:246        move second child to first child ( temp 3-component vector of float)
-0:246          'r064' ( temp 3-component vector of float)
-0:246          step ( temp 3-component vector of float)
+0:246          'inF1' ( in 3-component vector of float)
+0:246          sine ( temp 3-component vector of float)
 0:246            'inF0' ( in 3-component vector of float)
-0:246            'inF1' ( in 3-component vector of float)
+0:246        move second child to first child ( temp 3-component vector of float)
+0:246          'inF2' ( in 3-component vector of float)
+0:246          cosine ( temp 3-component vector of float)
+0:246            'inF0' ( in 3-component vector of float)
 0:247      Sequence
 0:247        move second child to first child ( temp 3-component vector of float)
-0:247          'r065' ( temp 3-component vector of float)
-0:247          tangent ( temp 3-component vector of float)
+0:247          'r061' ( temp 3-component vector of float)
+0:247          hyp. sine ( temp 3-component vector of float)
 0:247            'inF0' ( in 3-component vector of float)
 0:248      Sequence
 0:248        move second child to first child ( temp 3-component vector of float)
-0:248          'r066' ( temp 3-component vector of float)
-0:248          hyp. tangent ( temp 3-component vector of float)
+0:248          'r062' ( temp 3-component vector of float)
+0:248          smoothstep ( temp 3-component vector of float)
 0:248            'inF0' ( in 3-component vector of float)
+0:248            'inF1' ( in 3-component vector of float)
+0:248            'inF2' ( in 3-component vector of float)
+0:249      Sequence
+0:249        move second child to first child ( temp 3-component vector of float)
+0:249          'r063' ( temp 3-component vector of float)
+0:249          sqrt ( temp 3-component vector of float)
+0:249            'inF0' ( in 3-component vector of float)
 0:250      Sequence
 0:250        move second child to first child ( temp 3-component vector of float)
-0:250          'r067' ( temp 3-component vector of float)
-0:250          trunc ( temp 3-component vector of float)
+0:250          'r064' ( temp 3-component vector of float)
+0:250          step ( temp 3-component vector of float)
 0:250            'inF0' ( in 3-component vector of float)
-0:253      Branch: Return with expression
+0:250            'inF1' ( in 3-component vector of float)
+0:251      Sequence
+0:251        move second child to first child ( temp 3-component vector of float)
+0:251          'r065' ( temp 3-component vector of float)
+0:251          tangent ( temp 3-component vector of float)
+0:251            'inF0' ( in 3-component vector of float)
+0:252      Sequence
+0:252        move second child to first child ( temp 3-component vector of float)
+0:252          'r066' ( temp 3-component vector of float)
+0:252          hyp. tangent ( temp 3-component vector of float)
+0:252            'inF0' ( in 3-component vector of float)
+0:254      Sequence
+0:254        move second child to first child ( temp 3-component vector of float)
+0:254          'r067' ( temp 3-component vector of float)
+0:254          trunc ( temp 3-component vector of float)
+0:254            'inF0' ( in 3-component vector of float)
+0:257      Branch: Return with expression
 0:?         Constant:
 0:?           1.000000
 0:?           2.000000
 0:?           3.000000
-0:257  Function Definition: PixelShaderFunction(vf4;vf4;vf4;vu4;vu4; ( temp 4-component vector of float)
-0:257    Function Parameters: 
-0:257      'inF0' ( in 4-component vector of float)
-0:257      'inF1' ( in 4-component vector of float)
-0:257      'inF2' ( in 4-component vector of float)
-0:257      'inU0' ( in 4-component vector of uint)
-0:257      'inU1' ( in 4-component vector of uint)
+0:261  Function Definition: PixelShaderFunction(vf4;vf4;vf4;vu4;vu4; ( temp 4-component vector of float)
+0:261    Function Parameters: 
+0:261      'inF0' ( in 4-component vector of float)
+0:261      'inF1' ( in 4-component vector of float)
+0:261      'inF2' ( in 4-component vector of float)
+0:261      'inU0' ( in 4-component vector of uint)
+0:261      'inU1' ( in 4-component vector of uint)
 0:?     Sequence
-0:260      Sequence
-0:260        move second child to first child ( temp bool)
-0:260          'r000' ( temp bool)
-0:260          all ( temp bool)
-0:260            'inF0' ( in 4-component vector of float)
-0:261      Sequence
-0:261        move second child to first child ( temp 4-component vector of float)
-0:261          'r001' ( temp 4-component vector of float)
-0:261          Absolute value ( temp 4-component vector of float)
-0:261            'inF0' ( in 4-component vector of float)
-0:262      Sequence
-0:262        move second child to first child ( temp 4-component vector of float)
-0:262          'r002' ( temp 4-component vector of float)
-0:262          arc cosine ( temp 4-component vector of float)
-0:262            'inF0' ( in 4-component vector of float)
-0:263      Sequence
-0:263        move second child to first child ( temp bool)
-0:263          'r003' ( temp bool)
-0:263          any ( temp bool)
-0:263            'inF0' ( in 4-component vector of float)
 0:264      Sequence
-0:264        move second child to first child ( temp 4-component vector of float)
-0:264          'r004' ( temp 4-component vector of float)
-0:264          arc sine ( temp 4-component vector of float)
-0:264            'inF0' ( in 4-component vector of float)
+0:264        move second child to first child ( temp bool)
+0:264          'r000' ( temp bool)
+0:264          all ( temp bool)
+0:264            Convert float to bool ( temp 4-component vector of bool)
+0:264              'inF0' ( in 4-component vector of float)
 0:265      Sequence
-0:265        move second child to first child ( temp 4-component vector of int)
-0:265          'r005' ( temp 4-component vector of int)
-0:265          floatBitsToInt ( temp 4-component vector of int)
+0:265        move second child to first child ( temp 4-component vector of float)
+0:265          'r001' ( temp 4-component vector of float)
+0:265          Absolute value ( temp 4-component vector of float)
 0:265            'inF0' ( in 4-component vector of float)
 0:266      Sequence
-0:266        move second child to first child ( temp 4-component vector of uint)
-0:266          'r006' ( temp 4-component vector of uint)
-0:266          floatBitsToUint ( temp 4-component vector of uint)
+0:266        move second child to first child ( temp 4-component vector of float)
+0:266          'r002' ( temp 4-component vector of float)
+0:266          arc cosine ( temp 4-component vector of float)
 0:266            'inF0' ( in 4-component vector of float)
 0:267      Sequence
-0:267        move second child to first child ( temp 4-component vector of float)
-0:267          'r007' ( temp 4-component vector of float)
-0:267          intBitsToFloat ( temp 4-component vector of float)
-0:267            'inU0' ( in 4-component vector of uint)
+0:267        move second child to first child ( temp bool)
+0:267          'r003' ( temp bool)
+0:267          any ( temp bool)
+0:267            Convert float to bool ( temp 4-component vector of bool)
+0:267              'inF0' ( in 4-component vector of float)
+0:268      Sequence
+0:268        move second child to first child ( temp 4-component vector of float)
+0:268          'r004' ( temp 4-component vector of float)
+0:268          arc sine ( temp 4-component vector of float)
+0:268            'inF0' ( in 4-component vector of float)
 0:269      Sequence
-0:269        move second child to first child ( temp 4-component vector of float)
-0:269          'r009' ( temp 4-component vector of float)
-0:269          arc tangent ( temp 4-component vector of float)
+0:269        move second child to first child ( temp 4-component vector of int)
+0:269          'r005' ( temp 4-component vector of int)
+0:269          floatBitsToInt ( temp 4-component vector of int)
 0:269            'inF0' ( in 4-component vector of float)
 0:270      Sequence
-0:270        move second child to first child ( temp 4-component vector of float)
-0:270          'r010' ( temp 4-component vector of float)
-0:270          arc tangent ( temp 4-component vector of float)
+0:270        move second child to first child ( temp 4-component vector of uint)
+0:270          'r006' ( temp 4-component vector of uint)
+0:270          floatBitsToUint ( temp 4-component vector of uint)
 0:270            'inF0' ( in 4-component vector of float)
-0:270            'inF1' ( in 4-component vector of float)
 0:271      Sequence
 0:271        move second child to first child ( temp 4-component vector of float)
-0:271          'r011' ( temp 4-component vector of float)
-0:271          Ceiling ( temp 4-component vector of float)
-0:271            'inF0' ( in 4-component vector of float)
-0:272      Sequence
-0:272        move second child to first child ( temp 4-component vector of float)
-0:272          'r012' ( temp 4-component vector of float)
-0:272          clamp ( temp 4-component vector of float)
-0:272            'inF0' ( in 4-component vector of float)
-0:272            'inF1' ( in 4-component vector of float)
-0:272            'inF2' ( in 4-component vector of float)
-0:273      Test condition and select ( temp void)
-0:273        Condition
-0:273        any ( temp bool)
-0:273          Compare Less Than ( temp 4-component vector of bool)
+0:271          'r007' ( temp 4-component vector of float)
+0:271          intBitsToFloat ( temp 4-component vector of float)
+0:271            'inU0' ( in 4-component vector of uint)
+0:273      Sequence
+0:273        move second child to first child ( temp 4-component vector of float)
+0:273          'r009' ( temp 4-component vector of float)
+0:273          arc tangent ( temp 4-component vector of float)
 0:273            'inF0' ( in 4-component vector of float)
-0:273            Constant:
-0:273              0.000000
-0:273              0.000000
-0:273              0.000000
-0:273              0.000000
-0:273        true case
-0:273        Branch: Kill
 0:274      Sequence
 0:274        move second child to first child ( temp 4-component vector of float)
-0:274          'r013' ( temp 4-component vector of float)
-0:274          cosine ( temp 4-component vector of float)
+0:274          'r010' ( temp 4-component vector of float)
+0:274          arc tangent ( temp 4-component vector of float)
 0:274            'inF0' ( in 4-component vector of float)
+0:274            'inF1' ( in 4-component vector of float)
 0:275      Sequence
 0:275        move second child to first child ( temp 4-component vector of float)
-0:275          'r014' ( temp 4-component vector of float)
-0:275          hyp. cosine ( temp 4-component vector of float)
+0:275          'r011' ( temp 4-component vector of float)
+0:275          Ceiling ( temp 4-component vector of float)
 0:275            'inF0' ( in 4-component vector of float)
 0:276      Sequence
-0:276        move second child to first child ( temp 4-component vector of uint)
-0:276          'r015' ( temp 4-component vector of uint)
+0:276        move second child to first child ( temp 4-component vector of float)
+0:276          'r012' ( temp 4-component vector of float)
+0:276          clamp ( temp 4-component vector of float)
+0:276            'inF0' ( in 4-component vector of float)
+0:276            'inF1' ( in 4-component vector of float)
+0:276            'inF2' ( in 4-component vector of float)
+0:277      Test condition and select ( temp void)
+0:277        Condition
+0:277        any ( temp bool)
+0:277          Compare Less Than ( temp 4-component vector of bool)
+0:277            'inF0' ( in 4-component vector of float)
+0:277            Constant:
+0:277              0.000000
+0:277              0.000000
+0:277              0.000000
+0:277              0.000000
+0:277        true case
+0:277        Branch: Kill
+0:278      Test condition and select ( temp void)
+0:278        Condition
+0:278        any ( temp bool)
+0:278          Compare Less Than ( temp 4-component vector of bool)
+0:278            'inU0' ( in 4-component vector of uint)
+0:278            Constant:
+0:278              0.000000
+0:278              0.000000
+0:278              0.000000
+0:278              0.000000
+0:278        true case
+0:278        Branch: Kill
+0:279      Sequence
+0:279        move second child to first child ( temp 4-component vector of float)
+0:279          'r013' ( temp 4-component vector of float)
+0:279          cosine ( temp 4-component vector of float)
+0:279            'inF0' ( in 4-component vector of float)
+0:280      Sequence
+0:280        move second child to first child ( temp 4-component vector of float)
+0:280          'r014' ( temp 4-component vector of float)
+0:280          hyp. cosine ( temp 4-component vector of float)
+0:280            'inF0' ( in 4-component vector of float)
+0:281      Sequence
+0:281        move second child to first child ( temp 4-component vector of uint)
+0:281          'r015' ( temp 4-component vector of uint)
 0:?           bitCount ( temp 4-component vector of uint)
 0:?             Constant:
 0:?               7 (const uint)
 0:?               3 (const uint)
 0:?               5 (const uint)
 0:?               2 (const uint)
-0:277      Sequence
-0:277        move second child to first child ( temp 4-component vector of float)
-0:277          'r016' ( temp 4-component vector of float)
-0:277          dPdx ( temp 4-component vector of float)
-0:277            'inF0' ( in 4-component vector of float)
-0:278      Sequence
-0:278        move second child to first child ( temp 4-component vector of float)
-0:278          'r017' ( temp 4-component vector of float)
-0:278          dPdxCoarse ( temp 4-component vector of float)
-0:278            'inF0' ( in 4-component vector of float)
-0:279      Sequence
-0:279        move second child to first child ( temp 4-component vector of float)
-0:279          'r018' ( temp 4-component vector of float)
-0:279          dPdxFine ( temp 4-component vector of float)
-0:279            'inF0' ( in 4-component vector of float)
-0:280      Sequence
-0:280        move second child to first child ( temp 4-component vector of float)
-0:280          'r019' ( temp 4-component vector of float)
-0:280          dPdy ( temp 4-component vector of float)
-0:280            'inF0' ( in 4-component vector of float)
-0:281      Sequence
-0:281        move second child to first child ( temp 4-component vector of float)
-0:281          'r020' ( temp 4-component vector of float)
-0:281          dPdyCoarse ( temp 4-component vector of float)
-0:281            'inF0' ( in 4-component vector of float)
 0:282      Sequence
 0:282        move second child to first child ( temp 4-component vector of float)
-0:282          'r021' ( temp 4-component vector of float)
-0:282          dPdyFine ( temp 4-component vector of float)
+0:282          'r016' ( temp 4-component vector of float)
+0:282          dPdx ( temp 4-component vector of float)
 0:282            'inF0' ( in 4-component vector of float)
 0:283      Sequence
 0:283        move second child to first child ( temp 4-component vector of float)
-0:283          'r022' ( temp 4-component vector of float)
-0:283          degrees ( temp 4-component vector of float)
+0:283          'r017' ( temp 4-component vector of float)
+0:283          dPdxCoarse ( temp 4-component vector of float)
 0:283            'inF0' ( in 4-component vector of float)
 0:284      Sequence
-0:284        move second child to first child ( temp float)
-0:284          'r023' ( temp float)
-0:284          distance ( temp float)
+0:284        move second child to first child ( temp 4-component vector of float)
+0:284          'r018' ( temp 4-component vector of float)
+0:284          dPdxFine ( temp 4-component vector of float)
 0:284            'inF0' ( in 4-component vector of float)
-0:284            'inF1' ( in 4-component vector of float)
 0:285      Sequence
-0:285        move second child to first child ( temp float)
-0:285          'r024' ( temp float)
-0:285          dot-product ( temp float)
+0:285        move second child to first child ( temp 4-component vector of float)
+0:285          'r019' ( temp 4-component vector of float)
+0:285          dPdy ( temp 4-component vector of float)
 0:285            'inF0' ( in 4-component vector of float)
-0:285            'inF1' ( in 4-component vector of float)
 0:286      Sequence
 0:286        move second child to first child ( temp 4-component vector of float)
-0:286          'r025' ( temp 4-component vector of float)
-0:286          Construct vec4 ( temp 4-component vector of float)
-0:286            Constant:
-0:286              1.000000
-0:286            component-wise multiply ( temp float)
-0:286              direct index ( temp float)
-0:286                'inF0' ( in 4-component vector of float)
-0:286                Constant:
-0:286                  1 (const int)
-0:286              direct index ( temp float)
-0:286                'inF1' ( in 4-component vector of float)
-0:286                Constant:
-0:286                  1 (const int)
-0:286            direct index ( temp float)
-0:286              'inF0' ( in 4-component vector of float)
-0:286              Constant:
-0:286                2 (const int)
-0:286            direct index ( temp float)
-0:286              'inF1' ( in 4-component vector of float)
-0:286              Constant:
-0:286                3 (const int)
+0:286          'r020' ( temp 4-component vector of float)
+0:286          dPdyCoarse ( temp 4-component vector of float)
+0:286            'inF0' ( in 4-component vector of float)
+0:287      Sequence
+0:287        move second child to first child ( temp 4-component vector of float)
+0:287          'r021' ( temp 4-component vector of float)
+0:287          dPdyFine ( temp 4-component vector of float)
+0:287            'inF0' ( in 4-component vector of float)
+0:288      Sequence
+0:288        move second child to first child ( temp 4-component vector of float)
+0:288          'r022' ( temp 4-component vector of float)
+0:288          degrees ( temp 4-component vector of float)
+0:288            'inF0' ( in 4-component vector of float)
+0:289      Sequence
+0:289        move second child to first child ( temp float)
+0:289          'r023' ( temp float)
+0:289          distance ( temp float)
+0:289            'inF0' ( in 4-component vector of float)
+0:289            'inF1' ( in 4-component vector of float)
 0:290      Sequence
-0:290        move second child to first child ( temp 4-component vector of float)
-0:290          'r029' ( temp 4-component vector of float)
-0:290          exp ( temp 4-component vector of float)
+0:290        move second child to first child ( temp float)
+0:290          'r024' ( temp float)
+0:290          dot-product ( temp float)
 0:290            'inF0' ( in 4-component vector of float)
+0:290            'inF1' ( in 4-component vector of float)
 0:291      Sequence
 0:291        move second child to first child ( temp 4-component vector of float)
-0:291          'r030' ( temp 4-component vector of float)
-0:291          exp2 ( temp 4-component vector of float)
-0:291            'inF0' ( in 4-component vector of float)
-0:292      Sequence
-0:292        move second child to first child ( temp 4-component vector of float)
-0:292          'r031' ( temp 4-component vector of float)
-0:292          face-forward ( temp 4-component vector of float)
-0:292            'inF0' ( in 4-component vector of float)
-0:292            'inF1' ( in 4-component vector of float)
-0:292            'inF2' ( in 4-component vector of float)
-0:293      Sequence
-0:293        move second child to first child ( temp 4-component vector of uint)
-0:293          'r032' ( temp 4-component vector of uint)
+0:291          'r025' ( temp 4-component vector of float)
+0:291          Construct vec4 ( temp 4-component vector of float)
+0:291            Constant:
+0:291              1.000000
+0:291            component-wise multiply ( temp float)
+0:291              direct index ( temp float)
+0:291                'inF0' ( in 4-component vector of float)
+0:291                Constant:
+0:291                  1 (const int)
+0:291              direct index ( temp float)
+0:291                'inF1' ( in 4-component vector of float)
+0:291                Constant:
+0:291                  1 (const int)
+0:291            direct index ( temp float)
+0:291              'inF0' ( in 4-component vector of float)
+0:291              Constant:
+0:291                2 (const int)
+0:291            direct index ( temp float)
+0:291              'inF1' ( in 4-component vector of float)
+0:291              Constant:
+0:291                3 (const int)
+0:295      Sequence
+0:295        move second child to first child ( temp 4-component vector of float)
+0:295          'r029' ( temp 4-component vector of float)
+0:295          exp ( temp 4-component vector of float)
+0:295            'inF0' ( in 4-component vector of float)
+0:296      Sequence
+0:296        move second child to first child ( temp 4-component vector of float)
+0:296          'r030' ( temp 4-component vector of float)
+0:296          exp2 ( temp 4-component vector of float)
+0:296            'inF0' ( in 4-component vector of float)
+0:297      Sequence
+0:297        move second child to first child ( temp 4-component vector of float)
+0:297          'r031' ( temp 4-component vector of float)
+0:297          face-forward ( temp 4-component vector of float)
+0:297            'inF0' ( in 4-component vector of float)
+0:297            'inF1' ( in 4-component vector of float)
+0:297            'inF2' ( in 4-component vector of float)
+0:298      Sequence
+0:298        move second child to first child ( temp 4-component vector of uint)
+0:298          'r032' ( temp 4-component vector of uint)
 0:?           findMSB ( temp 4-component vector of uint)
 0:?             Constant:
 0:?               7 (const uint)
 0:?               8 (const uint)
 0:?               9 (const uint)
 0:?               10 (const uint)
-0:294      Sequence
-0:294        move second child to first child ( temp 4-component vector of uint)
-0:294          'r033' ( temp 4-component vector of uint)
+0:299      Sequence
+0:299        move second child to first child ( temp 4-component vector of uint)
+0:299          'r033' ( temp 4-component vector of uint)
 0:?           findLSB ( temp 4-component vector of uint)
 0:?             Constant:
 0:?               7 (const uint)
 0:?               8 (const uint)
 0:?               9 (const uint)
 0:?               10 (const uint)
-0:295      Sequence
-0:295        move second child to first child ( temp 4-component vector of float)
-0:295          'r034' ( temp 4-component vector of float)
-0:295          Floor ( temp 4-component vector of float)
-0:295            'inF0' ( in 4-component vector of float)
-0:297      Sequence
-0:297        move second child to first child ( temp 4-component vector of float)
-0:297          'r036' ( temp 4-component vector of float)
-0:297          mod ( temp 4-component vector of float)
-0:297            'inF0' ( in 4-component vector of float)
-0:297            'inF1' ( in 4-component vector of float)
-0:298      Sequence
-0:298        move second child to first child ( temp 4-component vector of float)
-0:298          'r037' ( temp 4-component vector of float)
-0:298          Fraction ( temp 4-component vector of float)
-0:298            'inF0' ( in 4-component vector of float)
-0:299      Sequence
-0:299        move second child to first child ( temp 4-component vector of float)
-0:299          'r039' ( temp 4-component vector of float)
-0:299          fwidth ( temp 4-component vector of float)
-0:299            'inF0' ( in 4-component vector of float)
 0:300      Sequence
-0:300        move second child to first child ( temp 4-component vector of bool)
-0:300          'r040' ( temp 4-component vector of bool)
-0:300          isinf ( temp 4-component vector of bool)
+0:300        move second child to first child ( temp 4-component vector of float)
+0:300          'r034' ( temp 4-component vector of float)
+0:300          Floor ( temp 4-component vector of float)
 0:300            'inF0' ( in 4-component vector of float)
-0:301      Sequence
-0:301        move second child to first child ( temp 4-component vector of bool)
-0:301          'r041' ( temp 4-component vector of bool)
-0:301          isnan ( temp 4-component vector of bool)
-0:301            'inF0' ( in 4-component vector of float)
 0:302      Sequence
 0:302        move second child to first child ( temp 4-component vector of float)
-0:302          'r042' ( temp 4-component vector of float)
-0:302          ldexp ( temp 4-component vector of float)
+0:302          'r036' ( temp 4-component vector of float)
+0:302          mod ( temp 4-component vector of float)
 0:302            'inF0' ( in 4-component vector of float)
 0:302            'inF1' ( in 4-component vector of float)
 0:303      Sequence
 0:303        move second child to first child ( temp 4-component vector of float)
-0:303          'r039a' ( temp 4-component vector of float)
-0:303          mix ( temp 4-component vector of float)
+0:303          'r037' ( temp 4-component vector of float)
+0:303          Fraction ( temp 4-component vector of float)
 0:303            'inF0' ( in 4-component vector of float)
-0:303            'inF1' ( in 4-component vector of float)
-0:303            'inF2' ( in 4-component vector of float)
 0:304      Sequence
-0:304        move second child to first child ( temp float)
-0:304          'r043' ( temp float)
-0:304          length ( temp float)
+0:304        move second child to first child ( temp 4-component vector of float)
+0:304          'r039' ( temp 4-component vector of float)
+0:304          fwidth ( temp 4-component vector of float)
 0:304            'inF0' ( in 4-component vector of float)
 0:305      Sequence
-0:305        move second child to first child ( temp 4-component vector of float)
-0:305          'r044' ( temp 4-component vector of float)
-0:305          log ( temp 4-component vector of float)
+0:305        move second child to first child ( temp 4-component vector of bool)
+0:305          'r040' ( temp 4-component vector of bool)
+0:305          isinf ( temp 4-component vector of bool)
 0:305            'inF0' ( in 4-component vector of float)
 0:306      Sequence
-0:306        move second child to first child ( temp 4-component vector of float)
-0:306          'r045' ( temp 4-component vector of float)
-0:306          vector-scale ( temp 4-component vector of float)
-0:306            log2 ( temp 4-component vector of float)
-0:306              'inF0' ( in 4-component vector of float)
-0:306            Constant:
-0:306              0.301030
+0:306        move second child to first child ( temp 4-component vector of bool)
+0:306          'r041' ( temp 4-component vector of bool)
+0:306          isnan ( temp 4-component vector of bool)
+0:306            'inF0' ( in 4-component vector of float)
 0:307      Sequence
 0:307        move second child to first child ( temp 4-component vector of float)
-0:307          'r046' ( temp 4-component vector of float)
-0:307          log2 ( temp 4-component vector of float)
+0:307          'r042' ( temp 4-component vector of float)
+0:307          ldexp ( temp 4-component vector of float)
 0:307            'inF0' ( in 4-component vector of float)
+0:307            'inF1' ( in 4-component vector of float)
 0:308      Sequence
 0:308        move second child to first child ( temp 4-component vector of float)
-0:308          'r047' ( temp 4-component vector of float)
-0:308          max ( temp 4-component vector of float)
+0:308          'r039a' ( temp 4-component vector of float)
+0:308          mix ( temp 4-component vector of float)
 0:308            'inF0' ( in 4-component vector of float)
 0:308            'inF1' ( in 4-component vector of float)
+0:308            'inF2' ( in 4-component vector of float)
 0:309      Sequence
-0:309        move second child to first child ( temp 4-component vector of float)
-0:309          'r048' ( temp 4-component vector of float)
-0:309          min ( temp 4-component vector of float)
+0:309        move second child to first child ( temp float)
+0:309          'r043' ( temp float)
+0:309          length ( temp float)
 0:309            'inF0' ( in 4-component vector of float)
-0:309            'inF1' ( in 4-component vector of float)
 0:310      Sequence
 0:310        move second child to first child ( temp 4-component vector of float)
-0:310          'r049' ( temp 4-component vector of float)
-0:310          normalize ( temp 4-component vector of float)
+0:310          'r044' ( temp 4-component vector of float)
+0:310          log ( temp 4-component vector of float)
 0:310            'inF0' ( in 4-component vector of float)
 0:311      Sequence
 0:311        move second child to first child ( temp 4-component vector of float)
-0:311          'r050' ( temp 4-component vector of float)
-0:311          pow ( temp 4-component vector of float)
-0:311            'inF0' ( in 4-component vector of float)
-0:311            'inF1' ( in 4-component vector of float)
+0:311          'r045' ( temp 4-component vector of float)
+0:311          vector-scale ( temp 4-component vector of float)
+0:311            log2 ( temp 4-component vector of float)
+0:311              'inF0' ( in 4-component vector of float)
+0:311            Constant:
+0:311              0.301030
 0:312      Sequence
 0:312        move second child to first child ( temp 4-component vector of float)
-0:312          'r051' ( temp 4-component vector of float)
-0:312          radians ( temp 4-component vector of float)
+0:312          'r046' ( temp 4-component vector of float)
+0:312          log2 ( temp 4-component vector of float)
 0:312            'inF0' ( in 4-component vector of float)
 0:313      Sequence
 0:313        move second child to first child ( temp 4-component vector of float)
-0:313          'r052' ( temp 4-component vector of float)
-0:313          divide ( temp 4-component vector of float)
-0:313            Constant:
-0:313              1.000000
+0:313          'r047' ( temp 4-component vector of float)
+0:313          max ( temp 4-component vector of float)
 0:313            'inF0' ( in 4-component vector of float)
+0:313            'inF1' ( in 4-component vector of float)
 0:314      Sequence
 0:314        move second child to first child ( temp 4-component vector of float)
-0:314          'r053' ( temp 4-component vector of float)
-0:314          reflect ( temp 4-component vector of float)
+0:314          'r048' ( temp 4-component vector of float)
+0:314          min ( temp 4-component vector of float)
 0:314            'inF0' ( in 4-component vector of float)
 0:314            'inF1' ( in 4-component vector of float)
 0:315      Sequence
 0:315        move second child to first child ( temp 4-component vector of float)
-0:315          'r054' ( temp 4-component vector of float)
-0:315          refract ( temp 4-component vector of float)
+0:315          'r049' ( temp 4-component vector of float)
+0:315          normalize ( temp 4-component vector of float)
 0:315            'inF0' ( in 4-component vector of float)
-0:315            'inF1' ( in 4-component vector of float)
-0:315            Constant:
-0:315              2.000000
 0:316      Sequence
-0:316        move second child to first child ( temp 4-component vector of uint)
-0:316          'r055' ( temp 4-component vector of uint)
+0:316        move second child to first child ( temp 4-component vector of float)
+0:316          'r050' ( temp 4-component vector of float)
+0:316          pow ( temp 4-component vector of float)
+0:316            'inF0' ( in 4-component vector of float)
+0:316            'inF1' ( in 4-component vector of float)
+0:317      Sequence
+0:317        move second child to first child ( temp 4-component vector of float)
+0:317          'r051' ( temp 4-component vector of float)
+0:317          radians ( temp 4-component vector of float)
+0:317            'inF0' ( in 4-component vector of float)
+0:318      Sequence
+0:318        move second child to first child ( temp 4-component vector of float)
+0:318          'r052' ( temp 4-component vector of float)
+0:318          divide ( temp 4-component vector of float)
+0:318            Constant:
+0:318              1.000000
+0:318            'inF0' ( in 4-component vector of float)
+0:319      Sequence
+0:319        move second child to first child ( temp 4-component vector of float)
+0:319          'r053' ( temp 4-component vector of float)
+0:319          reflect ( temp 4-component vector of float)
+0:319            'inF0' ( in 4-component vector of float)
+0:319            'inF1' ( in 4-component vector of float)
+0:320      Sequence
+0:320        move second child to first child ( temp 4-component vector of float)
+0:320          'r054' ( temp 4-component vector of float)
+0:320          refract ( temp 4-component vector of float)
+0:320            'inF0' ( in 4-component vector of float)
+0:320            'inF1' ( in 4-component vector of float)
+0:320            Constant:
+0:320              2.000000
+0:321      Sequence
+0:321        move second child to first child ( temp 4-component vector of uint)
+0:321          'r055' ( temp 4-component vector of uint)
 0:?           bitFieldReverse ( temp 4-component vector of uint)
 0:?             Constant:
 0:?               1 (const uint)
 0:?               2 (const uint)
 0:?               3 (const uint)
 0:?               4 (const uint)
-0:317      Sequence
-0:317        move second child to first child ( temp 4-component vector of float)
-0:317          'r056' ( temp 4-component vector of float)
-0:317          roundEven ( temp 4-component vector of float)
-0:317            'inF0' ( in 4-component vector of float)
-0:318      Sequence
-0:318        move second child to first child ( temp 4-component vector of float)
-0:318          'r057' ( temp 4-component vector of float)
-0:318          inverse sqrt ( temp 4-component vector of float)
-0:318            'inF0' ( in 4-component vector of float)
-0:319      Sequence
-0:319        move second child to first child ( temp 4-component vector of float)
-0:319          'r058' ( temp 4-component vector of float)
-0:319          clamp ( temp 4-component vector of float)
-0:319            'inF0' ( in 4-component vector of float)
-0:319            Constant:
-0:319              0.000000
-0:319            Constant:
-0:319              1.000000
-0:320      Sequence
-0:320        move second child to first child ( temp 4-component vector of float)
-0:320          'r059' ( temp 4-component vector of float)
-0:320          Sign ( temp 4-component vector of float)
-0:320            'inF0' ( in 4-component vector of float)
-0:321      Sequence
-0:321        move second child to first child ( temp 4-component vector of float)
-0:321          'r060' ( temp 4-component vector of float)
-0:321          sine ( temp 4-component vector of float)
-0:321            'inF0' ( in 4-component vector of float)
 0:322      Sequence
 0:322        move second child to first child ( temp 4-component vector of float)
-0:322          'inF1' ( in 4-component vector of float)
-0:322          sine ( temp 4-component vector of float)
-0:322            'inF0' ( in 4-component vector of float)
-0:322        move second child to first child ( temp 4-component vector of float)
-0:322          'inF2' ( in 4-component vector of float)
-0:322          cosine ( temp 4-component vector of float)
+0:322          'r056' ( temp 4-component vector of float)
+0:322          roundEven ( temp 4-component vector of float)
 0:322            'inF0' ( in 4-component vector of float)
 0:323      Sequence
 0:323        move second child to first child ( temp 4-component vector of float)
-0:323          'r061' ( temp 4-component vector of float)
-0:323          hyp. sine ( temp 4-component vector of float)
+0:323          'r057' ( temp 4-component vector of float)
+0:323          inverse sqrt ( temp 4-component vector of float)
 0:323            'inF0' ( in 4-component vector of float)
 0:324      Sequence
 0:324        move second child to first child ( temp 4-component vector of float)
-0:324          'r062' ( temp 4-component vector of float)
-0:324          smoothstep ( temp 4-component vector of float)
+0:324          'r058' ( temp 4-component vector of float)
+0:324          clamp ( temp 4-component vector of float)
 0:324            'inF0' ( in 4-component vector of float)
-0:324            'inF1' ( in 4-component vector of float)
-0:324            'inF2' ( in 4-component vector of float)
+0:324            Constant:
+0:324              0.000000
+0:324            Constant:
+0:324              1.000000
 0:325      Sequence
 0:325        move second child to first child ( temp 4-component vector of float)
-0:325          'r063' ( temp 4-component vector of float)
-0:325          sqrt ( temp 4-component vector of float)
+0:325          'r059' ( temp 4-component vector of float)
+0:325          Sign ( temp 4-component vector of float)
 0:325            'inF0' ( in 4-component vector of float)
 0:326      Sequence
 0:326        move second child to first child ( temp 4-component vector of float)
-0:326          'r064' ( temp 4-component vector of float)
-0:326          step ( temp 4-component vector of float)
+0:326          'r060' ( temp 4-component vector of float)
+0:326          sine ( temp 4-component vector of float)
 0:326            'inF0' ( in 4-component vector of float)
-0:326            'inF1' ( in 4-component vector of float)
 0:327      Sequence
 0:327        move second child to first child ( temp 4-component vector of float)
-0:327          'r065' ( temp 4-component vector of float)
-0:327          tangent ( temp 4-component vector of float)
+0:327          'inF1' ( in 4-component vector of float)
+0:327          sine ( temp 4-component vector of float)
+0:327            'inF0' ( in 4-component vector of float)
+0:327        move second child to first child ( temp 4-component vector of float)
+0:327          'inF2' ( in 4-component vector of float)
+0:327          cosine ( temp 4-component vector of float)
 0:327            'inF0' ( in 4-component vector of float)
 0:328      Sequence
 0:328        move second child to first child ( temp 4-component vector of float)
-0:328          'r066' ( temp 4-component vector of float)
-0:328          hyp. tangent ( temp 4-component vector of float)
+0:328          'r061' ( temp 4-component vector of float)
+0:328          hyp. sine ( temp 4-component vector of float)
 0:328            'inF0' ( in 4-component vector of float)
+0:329      Sequence
+0:329        move second child to first child ( temp 4-component vector of float)
+0:329          'r062' ( temp 4-component vector of float)
+0:329          smoothstep ( temp 4-component vector of float)
+0:329            'inF0' ( in 4-component vector of float)
+0:329            'inF1' ( in 4-component vector of float)
+0:329            'inF2' ( in 4-component vector of float)
 0:330      Sequence
 0:330        move second child to first child ( temp 4-component vector of float)
-0:330          'r067' ( temp 4-component vector of float)
-0:330          trunc ( temp 4-component vector of float)
+0:330          'r063' ( temp 4-component vector of float)
+0:330          sqrt ( temp 4-component vector of float)
 0:330            'inF0' ( in 4-component vector of float)
-0:333      Branch: Return with expression
+0:331      Sequence
+0:331        move second child to first child ( temp 4-component vector of float)
+0:331          'r064' ( temp 4-component vector of float)
+0:331          step ( temp 4-component vector of float)
+0:331            'inF0' ( in 4-component vector of float)
+0:331            'inF1' ( in 4-component vector of float)
+0:332      Sequence
+0:332        move second child to first child ( temp 4-component vector of float)
+0:332          'r065' ( temp 4-component vector of float)
+0:332          tangent ( temp 4-component vector of float)
+0:332            'inF0' ( in 4-component vector of float)
+0:333      Sequence
+0:333        move second child to first child ( temp 4-component vector of float)
+0:333          'r066' ( temp 4-component vector of float)
+0:333          hyp. tangent ( temp 4-component vector of float)
+0:333            'inF0' ( in 4-component vector of float)
+0:335      Sequence
+0:335        move second child to first child ( temp 4-component vector of float)
+0:335          'r067' ( temp 4-component vector of float)
+0:335          trunc ( temp 4-component vector of float)
+0:335            'inF0' ( in 4-component vector of float)
+0:338      Branch: Return with expression
 0:?         Constant:
 0:?           1.000000
 0:?           2.000000
 0:?           3.000000
 0:?           4.000000
-0:396  Function Definition: PixelShaderFunction2x2(mf22;mf22;mf22; ( temp 2X2 matrix of float)
-0:396    Function Parameters: 
-0:396      'inF0' ( in 2X2 matrix of float)
-0:396      'inF1' ( in 2X2 matrix of float)
-0:396      'inF2' ( in 2X2 matrix of float)
+0:401  Function Definition: PixelShaderFunction2x2(mf22;mf22;mf22; ( temp 2X2 matrix of float)
+0:401    Function Parameters: 
+0:401      'inF0' ( in 2X2 matrix of float)
+0:401      'inF1' ( in 2X2 matrix of float)
+0:401      'inF2' ( in 2X2 matrix of float)
 0:?     Sequence
-0:398      Sequence
-0:398        move second child to first child ( temp bool)
-0:398          'r000' ( temp bool)
-0:398          all ( temp bool)
-0:398            'inF0' ( in 2X2 matrix of float)
-0:398      Sequence
-0:398        move second child to first child ( temp 2X2 matrix of float)
-0:398          'r001' ( temp 2X2 matrix of float)
-0:398          Absolute value ( temp 2X2 matrix of float)
-0:398            'inF0' ( in 2X2 matrix of float)
-0:398      arc cosine ( temp 2X2 matrix of float)
-0:398        'inF0' ( in 2X2 matrix of float)
-0:398      Sequence
-0:398        move second child to first child ( temp bool)
-0:398          'r003' ( temp bool)
-0:398          any ( temp bool)
-0:398            'inF0' ( in 2X2 matrix of float)
-0:398      Sequence
-0:398        move second child to first child ( temp 2X2 matrix of float)
-0:398          'r004' ( temp 2X2 matrix of float)
-0:398          arc sine ( temp 2X2 matrix of float)
-0:398            'inF0' ( in 2X2 matrix of float)
-0:398      Sequence
-0:398        move second child to first child ( temp 2X2 matrix of float)
-0:398          'r005' ( temp 2X2 matrix of float)
-0:398          arc tangent ( temp 2X2 matrix of float)
-0:398            'inF0' ( in 2X2 matrix of float)
-0:398      Sequence
-0:398        move second child to first child ( temp 2X2 matrix of float)
-0:398          'r006' ( temp 2X2 matrix of float)
-0:398          arc tangent ( temp 2X2 matrix of float)
-0:398            'inF0' ( in 2X2 matrix of float)
-0:398            'inF1' ( in 2X2 matrix of float)
-0:398      Sequence
-0:398        move second child to first child ( temp 2X2 matrix of float)
-0:398          'r007' ( temp 2X2 matrix of float)
-0:398          Ceiling ( temp 2X2 matrix of float)
-0:398            'inF0' ( in 2X2 matrix of float)
-0:398      Test condition and select ( temp void)
-0:398        Condition
-0:398        any ( temp bool)
-0:398          Compare Less Than ( temp 2X2 matrix of bool)
-0:398            'inF0' ( in 2X2 matrix of float)
-0:398            Constant:
-0:398              0.000000
-0:398              0.000000
-0:398              0.000000
-0:398              0.000000
-0:398        true case
-0:398        Branch: Kill
-0:398      Sequence
-0:398        move second child to first child ( temp 2X2 matrix of float)
-0:398          'r008' ( temp 2X2 matrix of float)
-0:398          clamp ( temp 2X2 matrix of float)
-0:398            'inF0' ( in 2X2 matrix of float)
-0:398            'inF1' ( in 2X2 matrix of float)
-0:398            'inF2' ( in 2X2 matrix of float)
-0:398      Sequence
-0:398        move second child to first child ( temp 2X2 matrix of float)
-0:398          'r009' ( temp 2X2 matrix of float)
-0:398          cosine ( temp 2X2 matrix of float)
-0:398            'inF0' ( in 2X2 matrix of float)
-0:398      Sequence
-0:398        move second child to first child ( temp 2X2 matrix of float)
-0:398          'r010' ( temp 2X2 matrix of float)
-0:398          hyp. cosine ( temp 2X2 matrix of float)
-0:398            'inF0' ( in 2X2 matrix of float)
-0:398      Sequence
-0:398        move second child to first child ( temp 2X2 matrix of float)
-0:398          'r011' ( temp 2X2 matrix of float)
-0:398          dPdx ( temp 2X2 matrix of float)
-0:398            'inF0' ( in 2X2 matrix of float)
-0:398      Sequence
-0:398        move second child to first child ( temp 2X2 matrix of float)
-0:398          'r012' ( temp 2X2 matrix of float)
-0:398          dPdxCoarse ( temp 2X2 matrix of float)
-0:398            'inF0' ( in 2X2 matrix of float)
-0:398      Sequence
-0:398        move second child to first child ( temp 2X2 matrix of float)
-0:398          'r013' ( temp 2X2 matrix of float)
-0:398          dPdxFine ( temp 2X2 matrix of float)
-0:398            'inF0' ( in 2X2 matrix of float)
-0:398      Sequence
-0:398        move second child to first child ( temp 2X2 matrix of float)
-0:398          'r014' ( temp 2X2 matrix of float)
-0:398          dPdy ( temp 2X2 matrix of float)
-0:398            'inF0' ( in 2X2 matrix of float)
-0:398      Sequence
-0:398        move second child to first child ( temp 2X2 matrix of float)
-0:398          'r015' ( temp 2X2 matrix of float)
-0:398          dPdyCoarse ( temp 2X2 matrix of float)
-0:398            'inF0' ( in 2X2 matrix of float)
-0:398      Sequence
-0:398        move second child to first child ( temp 2X2 matrix of float)
-0:398          'r016' ( temp 2X2 matrix of float)
-0:398          dPdyFine ( temp 2X2 matrix of float)
-0:398            'inF0' ( in 2X2 matrix of float)
-0:398      Sequence
-0:398        move second child to first child ( temp 2X2 matrix of float)
-0:398          'r017' ( temp 2X2 matrix of float)
-0:398          degrees ( temp 2X2 matrix of float)
-0:398            'inF0' ( in 2X2 matrix of float)
-0:398      Sequence
-0:398        move second child to first child ( temp float)
-0:398          'r018' ( temp float)
-0:398          determinant ( temp float)
-0:398            'inF0' ( in 2X2 matrix of float)
-0:398      Sequence
-0:398        move second child to first child ( temp 2X2 matrix of float)
-0:398          'r019' ( temp 2X2 matrix of float)
-0:398          exp ( temp 2X2 matrix of float)
-0:398            'inF0' ( in 2X2 matrix of float)
-0:398      Sequence
-0:398        move second child to first child ( temp 2X2 matrix of float)
-0:398          'R020' ( temp 2X2 matrix of float)
-0:398          exp2 ( temp 2X2 matrix of float)
-0:398            'inF0' ( in 2X2 matrix of float)
-0:398      Sequence
-0:398        move second child to first child ( temp 2X2 matrix of float)
-0:398          'r021' ( temp 2X2 matrix of float)
-0:398          Floor ( temp 2X2 matrix of float)
-0:398            'inF0' ( in 2X2 matrix of float)
-0:398      Sequence
-0:398        move second child to first child ( temp 2X2 matrix of float)
-0:398          'r022' ( temp 2X2 matrix of float)
-0:398          mod ( temp 2X2 matrix of float)
-0:398            'inF0' ( in 2X2 matrix of float)
-0:398            'inF1' ( in 2X2 matrix of float)
-0:398      Sequence
-0:398        move second child to first child ( temp 2X2 matrix of float)
-0:398          'r023' ( temp 2X2 matrix of float)
-0:398          Fraction ( temp 2X2 matrix of float)
-0:398            'inF0' ( in 2X2 matrix of float)
-0:398      Sequence
-0:398        move second child to first child ( temp 2X2 matrix of float)
-0:398          'r025' ( temp 2X2 matrix of float)
-0:398          fwidth ( temp 2X2 matrix of float)
-0:398            'inF0' ( in 2X2 matrix of float)
-0:398      Sequence
-0:398        move second child to first child ( temp 2X2 matrix of float)
-0:398          'r026' ( temp 2X2 matrix of float)
-0:398          ldexp ( temp 2X2 matrix of float)
-0:398            'inF0' ( in 2X2 matrix of float)
-0:398            'inF1' ( in 2X2 matrix of float)
-0:398      Sequence
-0:398        move second child to first child ( temp 2X2 matrix of float)
-0:398          'r026a' ( temp 2X2 matrix of float)
-0:398          mix ( temp 2X2 matrix of float)
-0:398            'inF0' ( in 2X2 matrix of float)
-0:398            'inF1' ( in 2X2 matrix of float)
-0:398            'inF2' ( in 2X2 matrix of float)
-0:398      Sequence
-0:398        move second child to first child ( temp 2X2 matrix of float)
-0:398          'r027' ( temp 2X2 matrix of float)
-0:398          log ( temp 2X2 matrix of float)
-0:398            'inF0' ( in 2X2 matrix of float)
-0:398      Sequence
-0:398        move second child to first child ( temp 2X2 matrix of float)
-0:398          'r028' ( temp 2X2 matrix of float)
-0:398          matrix-scale ( temp 2X2 matrix of float)
-0:398            log2 ( temp 2X2 matrix of float)
-0:398              'inF0' ( in 2X2 matrix of float)
-0:398            Constant:
-0:398              0.301030
-0:398      Sequence
-0:398        move second child to first child ( temp 2X2 matrix of float)
-0:398          'r029' ( temp 2X2 matrix of float)
-0:398          log2 ( temp 2X2 matrix of float)
-0:398            'inF0' ( in 2X2 matrix of float)
-0:398      Sequence
-0:398        move second child to first child ( temp 2X2 matrix of float)
-0:398          'r030' ( temp 2X2 matrix of float)
-0:398          max ( temp 2X2 matrix of float)
-0:398            'inF0' ( in 2X2 matrix of float)
-0:398            'inF1' ( in 2X2 matrix of float)
-0:398      Sequence
-0:398        move second child to first child ( temp 2X2 matrix of float)
-0:398          'r031' ( temp 2X2 matrix of float)
-0:398          min ( temp 2X2 matrix of float)
-0:398            'inF0' ( in 2X2 matrix of float)
-0:398            'inF1' ( in 2X2 matrix of float)
-0:398      Sequence
-0:398        move second child to first child ( temp 2X2 matrix of float)
-0:398          'r032' ( temp 2X2 matrix of float)
-0:398          pow ( temp 2X2 matrix of float)
-0:398            'inF0' ( in 2X2 matrix of float)
-0:398            'inF1' ( in 2X2 matrix of float)
-0:398      Sequence
-0:398        move second child to first child ( temp 2X2 matrix of float)
-0:398          'r033' ( temp 2X2 matrix of float)
-0:398          radians ( temp 2X2 matrix of float)
-0:398            'inF0' ( in 2X2 matrix of float)
-0:398      Sequence
-0:398        move second child to first child ( temp 2X2 matrix of float)
-0:398          'r034' ( temp 2X2 matrix of float)
-0:398          roundEven ( temp 2X2 matrix of float)
-0:398            'inF0' ( in 2X2 matrix of float)
-0:398      Sequence
-0:398        move second child to first child ( temp 2X2 matrix of float)
-0:398          'r035' ( temp 2X2 matrix of float)
-0:398          inverse sqrt ( temp 2X2 matrix of float)
-0:398            'inF0' ( in 2X2 matrix of float)
-0:398      Sequence
-0:398        move second child to first child ( temp 2X2 matrix of float)
-0:398          'r036' ( temp 2X2 matrix of float)
-0:398          clamp ( temp 2X2 matrix of float)
-0:398            'inF0' ( in 2X2 matrix of float)
-0:398            Constant:
-0:398              0.000000
-0:398            Constant:
-0:398              1.000000
-0:398      Sequence
-0:398        move second child to first child ( temp 2X2 matrix of float)
-0:398          'r037' ( temp 2X2 matrix of float)
-0:398          Sign ( temp 2X2 matrix of float)
-0:398            'inF0' ( in 2X2 matrix of float)
-0:398      Sequence
-0:398        move second child to first child ( temp 2X2 matrix of float)
-0:398          'r038' ( temp 2X2 matrix of float)
-0:398          sine ( temp 2X2 matrix of float)
-0:398            'inF0' ( in 2X2 matrix of float)
-0:398      Sequence
-0:398        move second child to first child ( temp 2X2 matrix of float)
-0:398          'inF1' ( in 2X2 matrix of float)
-0:398          sine ( temp 2X2 matrix of float)
-0:398            'inF0' ( in 2X2 matrix of float)
-0:398        move second child to first child ( temp 2X2 matrix of float)
-0:398          'inF2' ( in 2X2 matrix of float)
-0:398          cosine ( temp 2X2 matrix of float)
-0:398            'inF0' ( in 2X2 matrix of float)
-0:398      Sequence
-0:398        move second child to first child ( temp 2X2 matrix of float)
-0:398          'r039' ( temp 2X2 matrix of float)
-0:398          hyp. sine ( temp 2X2 matrix of float)
-0:398            'inF0' ( in 2X2 matrix of float)
-0:398      Sequence
-0:398        move second child to first child ( temp 2X2 matrix of float)
-0:398          'r049' ( temp 2X2 matrix of float)
-0:398          smoothstep ( temp 2X2 matrix of float)
-0:398            'inF0' ( in 2X2 matrix of float)
-0:398            'inF1' ( in 2X2 matrix of float)
-0:398            'inF2' ( in 2X2 matrix of float)
-0:398      Sequence
-0:398        move second child to first child ( temp 2X2 matrix of float)
-0:398          'r041' ( temp 2X2 matrix of float)
-0:398          sqrt ( temp 2X2 matrix of float)
-0:398            'inF0' ( in 2X2 matrix of float)
-0:398      Sequence
-0:398        move second child to first child ( temp 2X2 matrix of float)
-0:398          'r042' ( temp 2X2 matrix of float)
-0:398          step ( temp 2X2 matrix of float)
-0:398            'inF0' ( in 2X2 matrix of float)
-0:398            'inF1' ( in 2X2 matrix of float)
-0:398      Sequence
-0:398        move second child to first child ( temp 2X2 matrix of float)
-0:398          'r043' ( temp 2X2 matrix of float)
-0:398          tangent ( temp 2X2 matrix of float)
-0:398            'inF0' ( in 2X2 matrix of float)
-0:398      Sequence
-0:398        move second child to first child ( temp 2X2 matrix of float)
-0:398          'r044' ( temp 2X2 matrix of float)
-0:398          hyp. tangent ( temp 2X2 matrix of float)
-0:398            'inF0' ( in 2X2 matrix of float)
-0:398      transpose ( temp 2X2 matrix of float)
-0:398        'inF0' ( in 2X2 matrix of float)
-0:398      Sequence
-0:398        move second child to first child ( temp 2X2 matrix of float)
-0:398          'r046' ( temp 2X2 matrix of float)
-0:398          trunc ( temp 2X2 matrix of float)
-0:398            'inF0' ( in 2X2 matrix of float)
-0:401      Branch: Return with expression
+0:403      Sequence
+0:403        move second child to first child ( temp bool)
+0:403          'r000' ( temp bool)
+0:403          all ( temp bool)
+0:403            Convert float to bool ( temp 2X2 matrix of bool)
+0:403              'inF0' ( in 2X2 matrix of float)
+0:403      Sequence
+0:403        move second child to first child ( temp 2X2 matrix of float)
+0:403          'r001' ( temp 2X2 matrix of float)
+0:403          Absolute value ( temp 2X2 matrix of float)
+0:403            'inF0' ( in 2X2 matrix of float)
+0:403      arc cosine ( temp 2X2 matrix of float)
+0:403        'inF0' ( in 2X2 matrix of float)
+0:403      Sequence
+0:403        move second child to first child ( temp bool)
+0:403          'r003' ( temp bool)
+0:403          any ( temp bool)
+0:403            Convert float to bool ( temp 2X2 matrix of bool)
+0:403              'inF0' ( in 2X2 matrix of float)
+0:403      Sequence
+0:403        move second child to first child ( temp 2X2 matrix of float)
+0:403          'r004' ( temp 2X2 matrix of float)
+0:403          arc sine ( temp 2X2 matrix of float)
+0:403            'inF0' ( in 2X2 matrix of float)
+0:403      Sequence
+0:403        move second child to first child ( temp 2X2 matrix of float)
+0:403          'r005' ( temp 2X2 matrix of float)
+0:403          arc tangent ( temp 2X2 matrix of float)
+0:403            'inF0' ( in 2X2 matrix of float)
+0:403      Sequence
+0:403        move second child to first child ( temp 2X2 matrix of float)
+0:403          'r006' ( temp 2X2 matrix of float)
+0:403          arc tangent ( temp 2X2 matrix of float)
+0:403            'inF0' ( in 2X2 matrix of float)
+0:403            'inF1' ( in 2X2 matrix of float)
+0:403      Sequence
+0:403        move second child to first child ( temp 2X2 matrix of float)
+0:403          'r007' ( temp 2X2 matrix of float)
+0:403          Ceiling ( temp 2X2 matrix of float)
+0:403            'inF0' ( in 2X2 matrix of float)
+0:403      Test condition and select ( temp void)
+0:403        Condition
+0:403        any ( temp bool)
+0:403          Compare Less Than ( temp 2X2 matrix of bool)
+0:403            'inF0' ( in 2X2 matrix of float)
+0:403            Constant:
+0:403              0.000000
+0:403              0.000000
+0:403              0.000000
+0:403              0.000000
+0:403        true case
+0:403        Branch: Kill
+0:403      Sequence
+0:403        move second child to first child ( temp 2X2 matrix of float)
+0:403          'r008' ( temp 2X2 matrix of float)
+0:403          clamp ( temp 2X2 matrix of float)
+0:403            'inF0' ( in 2X2 matrix of float)
+0:403            'inF1' ( in 2X2 matrix of float)
+0:403            'inF2' ( in 2X2 matrix of float)
+0:403      Sequence
+0:403        move second child to first child ( temp 2X2 matrix of float)
+0:403          'r009' ( temp 2X2 matrix of float)
+0:403          cosine ( temp 2X2 matrix of float)
+0:403            'inF0' ( in 2X2 matrix of float)
+0:403      Sequence
+0:403        move second child to first child ( temp 2X2 matrix of float)
+0:403          'r010' ( temp 2X2 matrix of float)
+0:403          hyp. cosine ( temp 2X2 matrix of float)
+0:403            'inF0' ( in 2X2 matrix of float)
+0:403      Sequence
+0:403        move second child to first child ( temp 2X2 matrix of float)
+0:403          'r011' ( temp 2X2 matrix of float)
+0:403          dPdx ( temp 2X2 matrix of float)
+0:403            'inF0' ( in 2X2 matrix of float)
+0:403      Sequence
+0:403        move second child to first child ( temp 2X2 matrix of float)
+0:403          'r012' ( temp 2X2 matrix of float)
+0:403          dPdxCoarse ( temp 2X2 matrix of float)
+0:403            'inF0' ( in 2X2 matrix of float)
+0:403      Sequence
+0:403        move second child to first child ( temp 2X2 matrix of float)
+0:403          'r013' ( temp 2X2 matrix of float)
+0:403          dPdxFine ( temp 2X2 matrix of float)
+0:403            'inF0' ( in 2X2 matrix of float)
+0:403      Sequence
+0:403        move second child to first child ( temp 2X2 matrix of float)
+0:403          'r014' ( temp 2X2 matrix of float)
+0:403          dPdy ( temp 2X2 matrix of float)
+0:403            'inF0' ( in 2X2 matrix of float)
+0:403      Sequence
+0:403        move second child to first child ( temp 2X2 matrix of float)
+0:403          'r015' ( temp 2X2 matrix of float)
+0:403          dPdyCoarse ( temp 2X2 matrix of float)
+0:403            'inF0' ( in 2X2 matrix of float)
+0:403      Sequence
+0:403        move second child to first child ( temp 2X2 matrix of float)
+0:403          'r016' ( temp 2X2 matrix of float)
+0:403          dPdyFine ( temp 2X2 matrix of float)
+0:403            'inF0' ( in 2X2 matrix of float)
+0:403      Sequence
+0:403        move second child to first child ( temp 2X2 matrix of float)
+0:403          'r017' ( temp 2X2 matrix of float)
+0:403          degrees ( temp 2X2 matrix of float)
+0:403            'inF0' ( in 2X2 matrix of float)
+0:403      Sequence
+0:403        move second child to first child ( temp float)
+0:403          'r018' ( temp float)
+0:403          determinant ( temp float)
+0:403            'inF0' ( in 2X2 matrix of float)
+0:403      Sequence
+0:403        move second child to first child ( temp 2X2 matrix of float)
+0:403          'r019' ( temp 2X2 matrix of float)
+0:403          exp ( temp 2X2 matrix of float)
+0:403            'inF0' ( in 2X2 matrix of float)
+0:403      Sequence
+0:403        move second child to first child ( temp 2X2 matrix of float)
+0:403          'R020' ( temp 2X2 matrix of float)
+0:403          exp2 ( temp 2X2 matrix of float)
+0:403            'inF0' ( in 2X2 matrix of float)
+0:403      Sequence
+0:403        move second child to first child ( temp 2X2 matrix of float)
+0:403          'r021' ( temp 2X2 matrix of float)
+0:403          Floor ( temp 2X2 matrix of float)
+0:403            'inF0' ( in 2X2 matrix of float)
+0:403      Sequence
+0:403        move second child to first child ( temp 2X2 matrix of float)
+0:403          'r022' ( temp 2X2 matrix of float)
+0:403          mod ( temp 2X2 matrix of float)
+0:403            'inF0' ( in 2X2 matrix of float)
+0:403            'inF1' ( in 2X2 matrix of float)
+0:403      Sequence
+0:403        move second child to first child ( temp 2X2 matrix of float)
+0:403          'r023' ( temp 2X2 matrix of float)
+0:403          Fraction ( temp 2X2 matrix of float)
+0:403            'inF0' ( in 2X2 matrix of float)
+0:403      Sequence
+0:403        move second child to first child ( temp 2X2 matrix of float)
+0:403          'r025' ( temp 2X2 matrix of float)
+0:403          fwidth ( temp 2X2 matrix of float)
+0:403            'inF0' ( in 2X2 matrix of float)
+0:403      Sequence
+0:403        move second child to first child ( temp 2X2 matrix of float)
+0:403          'r026' ( temp 2X2 matrix of float)
+0:403          ldexp ( temp 2X2 matrix of float)
+0:403            'inF0' ( in 2X2 matrix of float)
+0:403            'inF1' ( in 2X2 matrix of float)
+0:403      Sequence
+0:403        move second child to first child ( temp 2X2 matrix of float)
+0:403          'r026a' ( temp 2X2 matrix of float)
+0:403          mix ( temp 2X2 matrix of float)
+0:403            'inF0' ( in 2X2 matrix of float)
+0:403            'inF1' ( in 2X2 matrix of float)
+0:403            'inF2' ( in 2X2 matrix of float)
+0:403      Sequence
+0:403        move second child to first child ( temp 2X2 matrix of float)
+0:403          'r027' ( temp 2X2 matrix of float)
+0:403          log ( temp 2X2 matrix of float)
+0:403            'inF0' ( in 2X2 matrix of float)
+0:403      Sequence
+0:403        move second child to first child ( temp 2X2 matrix of float)
+0:403          'r028' ( temp 2X2 matrix of float)
+0:403          matrix-scale ( temp 2X2 matrix of float)
+0:403            log2 ( temp 2X2 matrix of float)
+0:403              'inF0' ( in 2X2 matrix of float)
+0:403            Constant:
+0:403              0.301030
+0:403      Sequence
+0:403        move second child to first child ( temp 2X2 matrix of float)
+0:403          'r029' ( temp 2X2 matrix of float)
+0:403          log2 ( temp 2X2 matrix of float)
+0:403            'inF0' ( in 2X2 matrix of float)
+0:403      Sequence
+0:403        move second child to first child ( temp 2X2 matrix of float)
+0:403          'r030' ( temp 2X2 matrix of float)
+0:403          max ( temp 2X2 matrix of float)
+0:403            'inF0' ( in 2X2 matrix of float)
+0:403            'inF1' ( in 2X2 matrix of float)
+0:403      Sequence
+0:403        move second child to first child ( temp 2X2 matrix of float)
+0:403          'r031' ( temp 2X2 matrix of float)
+0:403          min ( temp 2X2 matrix of float)
+0:403            'inF0' ( in 2X2 matrix of float)
+0:403            'inF1' ( in 2X2 matrix of float)
+0:403      Sequence
+0:403        move second child to first child ( temp 2X2 matrix of float)
+0:403          'r032' ( temp 2X2 matrix of float)
+0:403          pow ( temp 2X2 matrix of float)
+0:403            'inF0' ( in 2X2 matrix of float)
+0:403            'inF1' ( in 2X2 matrix of float)
+0:403      Sequence
+0:403        move second child to first child ( temp 2X2 matrix of float)
+0:403          'r033' ( temp 2X2 matrix of float)
+0:403          radians ( temp 2X2 matrix of float)
+0:403            'inF0' ( in 2X2 matrix of float)
+0:403      Sequence
+0:403        move second child to first child ( temp 2X2 matrix of float)
+0:403          'r034' ( temp 2X2 matrix of float)
+0:403          roundEven ( temp 2X2 matrix of float)
+0:403            'inF0' ( in 2X2 matrix of float)
+0:403      Sequence
+0:403        move second child to first child ( temp 2X2 matrix of float)
+0:403          'r035' ( temp 2X2 matrix of float)
+0:403          inverse sqrt ( temp 2X2 matrix of float)
+0:403            'inF0' ( in 2X2 matrix of float)
+0:403      Sequence
+0:403        move second child to first child ( temp 2X2 matrix of float)
+0:403          'r036' ( temp 2X2 matrix of float)
+0:403          clamp ( temp 2X2 matrix of float)
+0:403            'inF0' ( in 2X2 matrix of float)
+0:403            Constant:
+0:403              0.000000
+0:403            Constant:
+0:403              1.000000
+0:403      Sequence
+0:403        move second child to first child ( temp 2X2 matrix of float)
+0:403          'r037' ( temp 2X2 matrix of float)
+0:403          Sign ( temp 2X2 matrix of float)
+0:403            'inF0' ( in 2X2 matrix of float)
+0:403      Sequence
+0:403        move second child to first child ( temp 2X2 matrix of float)
+0:403          'r038' ( temp 2X2 matrix of float)
+0:403          sine ( temp 2X2 matrix of float)
+0:403            'inF0' ( in 2X2 matrix of float)
+0:403      Sequence
+0:403        move second child to first child ( temp 2X2 matrix of float)
+0:403          'inF1' ( in 2X2 matrix of float)
+0:403          sine ( temp 2X2 matrix of float)
+0:403            'inF0' ( in 2X2 matrix of float)
+0:403        move second child to first child ( temp 2X2 matrix of float)
+0:403          'inF2' ( in 2X2 matrix of float)
+0:403          cosine ( temp 2X2 matrix of float)
+0:403            'inF0' ( in 2X2 matrix of float)
+0:403      Sequence
+0:403        move second child to first child ( temp 2X2 matrix of float)
+0:403          'r039' ( temp 2X2 matrix of float)
+0:403          hyp. sine ( temp 2X2 matrix of float)
+0:403            'inF0' ( in 2X2 matrix of float)
+0:403      Sequence
+0:403        move second child to first child ( temp 2X2 matrix of float)
+0:403          'r049' ( temp 2X2 matrix of float)
+0:403          smoothstep ( temp 2X2 matrix of float)
+0:403            'inF0' ( in 2X2 matrix of float)
+0:403            'inF1' ( in 2X2 matrix of float)
+0:403            'inF2' ( in 2X2 matrix of float)
+0:403      Sequence
+0:403        move second child to first child ( temp 2X2 matrix of float)
+0:403          'r041' ( temp 2X2 matrix of float)
+0:403          sqrt ( temp 2X2 matrix of float)
+0:403            'inF0' ( in 2X2 matrix of float)
+0:403      Sequence
+0:403        move second child to first child ( temp 2X2 matrix of float)
+0:403          'r042' ( temp 2X2 matrix of float)
+0:403          step ( temp 2X2 matrix of float)
+0:403            'inF0' ( in 2X2 matrix of float)
+0:403            'inF1' ( in 2X2 matrix of float)
+0:403      Sequence
+0:403        move second child to first child ( temp 2X2 matrix of float)
+0:403          'r043' ( temp 2X2 matrix of float)
+0:403          tangent ( temp 2X2 matrix of float)
+0:403            'inF0' ( in 2X2 matrix of float)
+0:403      Sequence
+0:403        move second child to first child ( temp 2X2 matrix of float)
+0:403          'r044' ( temp 2X2 matrix of float)
+0:403          hyp. tangent ( temp 2X2 matrix of float)
+0:403            'inF0' ( in 2X2 matrix of float)
+0:403      transpose ( temp 2X2 matrix of float)
+0:403        'inF0' ( in 2X2 matrix of float)
+0:403      Sequence
+0:403        move second child to first child ( temp 2X2 matrix of float)
+0:403          'r046' ( temp 2X2 matrix of float)
+0:403          trunc ( temp 2X2 matrix of float)
+0:403            'inF0' ( in 2X2 matrix of float)
+0:406      Branch: Return with expression
 0:?         Constant:
 0:?           2.000000
 0:?           2.000000
 0:?           2.000000
 0:?           2.000000
-0:405  Function Definition: PixelShaderFunction3x3(mf33;mf33;mf33; ( temp 3X3 matrix of float)
-0:405    Function Parameters: 
-0:405      'inF0' ( in 3X3 matrix of float)
-0:405      'inF1' ( in 3X3 matrix of float)
-0:405      'inF2' ( in 3X3 matrix of float)
+0:410  Function Definition: PixelShaderFunction3x3(mf33;mf33;mf33; ( temp 3X3 matrix of float)
+0:410    Function Parameters: 
+0:410      'inF0' ( in 3X3 matrix of float)
+0:410      'inF1' ( in 3X3 matrix of float)
+0:410      'inF2' ( in 3X3 matrix of float)
 0:?     Sequence
-0:407      Sequence
-0:407        move second child to first child ( temp bool)
-0:407          'r000' ( temp bool)
-0:407          all ( temp bool)
-0:407            'inF0' ( in 3X3 matrix of float)
-0:407      Sequence
-0:407        move second child to first child ( temp 3X3 matrix of float)
-0:407          'r001' ( temp 3X3 matrix of float)
-0:407          Absolute value ( temp 3X3 matrix of float)
-0:407            'inF0' ( in 3X3 matrix of float)
-0:407      arc cosine ( temp 3X3 matrix of float)
-0:407        'inF0' ( in 3X3 matrix of float)
-0:407      Sequence
-0:407        move second child to first child ( temp bool)
-0:407          'r003' ( temp bool)
-0:407          any ( temp bool)
-0:407            'inF0' ( in 3X3 matrix of float)
-0:407      Sequence
-0:407        move second child to first child ( temp 3X3 matrix of float)
-0:407          'r004' ( temp 3X3 matrix of float)
-0:407          arc sine ( temp 3X3 matrix of float)
-0:407            'inF0' ( in 3X3 matrix of float)
-0:407      Sequence
-0:407        move second child to first child ( temp 3X3 matrix of float)
-0:407          'r005' ( temp 3X3 matrix of float)
-0:407          arc tangent ( temp 3X3 matrix of float)
-0:407            'inF0' ( in 3X3 matrix of float)
-0:407      Sequence
-0:407        move second child to first child ( temp 3X3 matrix of float)
-0:407          'r006' ( temp 3X3 matrix of float)
-0:407          arc tangent ( temp 3X3 matrix of float)
-0:407            'inF0' ( in 3X3 matrix of float)
-0:407            'inF1' ( in 3X3 matrix of float)
-0:407      Sequence
-0:407        move second child to first child ( temp 3X3 matrix of float)
-0:407          'r007' ( temp 3X3 matrix of float)
-0:407          Ceiling ( temp 3X3 matrix of float)
-0:407            'inF0' ( in 3X3 matrix of float)
-0:407      Test condition and select ( temp void)
-0:407        Condition
-0:407        any ( temp bool)
-0:407          Compare Less Than ( temp 3X3 matrix of bool)
-0:407            'inF0' ( in 3X3 matrix of float)
-0:407            Constant:
-0:407              0.000000
-0:407              0.000000
-0:407              0.000000
-0:407              0.000000
-0:407              0.000000
-0:407              0.000000
-0:407              0.000000
-0:407              0.000000
-0:407              0.000000
-0:407        true case
-0:407        Branch: Kill
-0:407      Sequence
-0:407        move second child to first child ( temp 3X3 matrix of float)
-0:407          'r008' ( temp 3X3 matrix of float)
-0:407          clamp ( temp 3X3 matrix of float)
-0:407            'inF0' ( in 3X3 matrix of float)
-0:407            'inF1' ( in 3X3 matrix of float)
-0:407            'inF2' ( in 3X3 matrix of float)
-0:407      Sequence
-0:407        move second child to first child ( temp 3X3 matrix of float)
-0:407          'r009' ( temp 3X3 matrix of float)
-0:407          cosine ( temp 3X3 matrix of float)
-0:407            'inF0' ( in 3X3 matrix of float)
-0:407      Sequence
-0:407        move second child to first child ( temp 3X3 matrix of float)
-0:407          'r010' ( temp 3X3 matrix of float)
-0:407          hyp. cosine ( temp 3X3 matrix of float)
-0:407            'inF0' ( in 3X3 matrix of float)
-0:407      Sequence
-0:407        move second child to first child ( temp 3X3 matrix of float)
-0:407          'r011' ( temp 3X3 matrix of float)
-0:407          dPdx ( temp 3X3 matrix of float)
-0:407            'inF0' ( in 3X3 matrix of float)
-0:407      Sequence
-0:407        move second child to first child ( temp 3X3 matrix of float)
-0:407          'r012' ( temp 3X3 matrix of float)
-0:407          dPdxCoarse ( temp 3X3 matrix of float)
-0:407            'inF0' ( in 3X3 matrix of float)
-0:407      Sequence
-0:407        move second child to first child ( temp 3X3 matrix of float)
-0:407          'r013' ( temp 3X3 matrix of float)
-0:407          dPdxFine ( temp 3X3 matrix of float)
-0:407            'inF0' ( in 3X3 matrix of float)
-0:407      Sequence
-0:407        move second child to first child ( temp 3X3 matrix of float)
-0:407          'r014' ( temp 3X3 matrix of float)
-0:407          dPdy ( temp 3X3 matrix of float)
-0:407            'inF0' ( in 3X3 matrix of float)
-0:407      Sequence
-0:407        move second child to first child ( temp 3X3 matrix of float)
-0:407          'r015' ( temp 3X3 matrix of float)
-0:407          dPdyCoarse ( temp 3X3 matrix of float)
-0:407            'inF0' ( in 3X3 matrix of float)
-0:407      Sequence
-0:407        move second child to first child ( temp 3X3 matrix of float)
-0:407          'r016' ( temp 3X3 matrix of float)
-0:407          dPdyFine ( temp 3X3 matrix of float)
-0:407            'inF0' ( in 3X3 matrix of float)
-0:407      Sequence
-0:407        move second child to first child ( temp 3X3 matrix of float)
-0:407          'r017' ( temp 3X3 matrix of float)
-0:407          degrees ( temp 3X3 matrix of float)
-0:407            'inF0' ( in 3X3 matrix of float)
-0:407      Sequence
-0:407        move second child to first child ( temp float)
-0:407          'r018' ( temp float)
-0:407          determinant ( temp float)
-0:407            'inF0' ( in 3X3 matrix of float)
-0:407      Sequence
-0:407        move second child to first child ( temp 3X3 matrix of float)
-0:407          'r019' ( temp 3X3 matrix of float)
-0:407          exp ( temp 3X3 matrix of float)
-0:407            'inF0' ( in 3X3 matrix of float)
-0:407      Sequence
-0:407        move second child to first child ( temp 3X3 matrix of float)
-0:407          'R020' ( temp 3X3 matrix of float)
-0:407          exp2 ( temp 3X3 matrix of float)
-0:407            'inF0' ( in 3X3 matrix of float)
-0:407      Sequence
-0:407        move second child to first child ( temp 3X3 matrix of float)
-0:407          'r021' ( temp 3X3 matrix of float)
-0:407          Floor ( temp 3X3 matrix of float)
-0:407            'inF0' ( in 3X3 matrix of float)
-0:407      Sequence
-0:407        move second child to first child ( temp 3X3 matrix of float)
-0:407          'r022' ( temp 3X3 matrix of float)
-0:407          mod ( temp 3X3 matrix of float)
-0:407            'inF0' ( in 3X3 matrix of float)
-0:407            'inF1' ( in 3X3 matrix of float)
-0:407      Sequence
-0:407        move second child to first child ( temp 3X3 matrix of float)
-0:407          'r023' ( temp 3X3 matrix of float)
-0:407          Fraction ( temp 3X3 matrix of float)
-0:407            'inF0' ( in 3X3 matrix of float)
-0:407      Sequence
-0:407        move second child to first child ( temp 3X3 matrix of float)
-0:407          'r025' ( temp 3X3 matrix of float)
-0:407          fwidth ( temp 3X3 matrix of float)
-0:407            'inF0' ( in 3X3 matrix of float)
-0:407      Sequence
-0:407        move second child to first child ( temp 3X3 matrix of float)
-0:407          'r026' ( temp 3X3 matrix of float)
-0:407          ldexp ( temp 3X3 matrix of float)
-0:407            'inF0' ( in 3X3 matrix of float)
-0:407            'inF1' ( in 3X3 matrix of float)
-0:407      Sequence
-0:407        move second child to first child ( temp 3X3 matrix of float)
-0:407          'r026a' ( temp 3X3 matrix of float)
-0:407          mix ( temp 3X3 matrix of float)
-0:407            'inF0' ( in 3X3 matrix of float)
-0:407            'inF1' ( in 3X3 matrix of float)
-0:407            'inF2' ( in 3X3 matrix of float)
-0:407      Sequence
-0:407        move second child to first child ( temp 3X3 matrix of float)
-0:407          'r027' ( temp 3X3 matrix of float)
-0:407          log ( temp 3X3 matrix of float)
-0:407            'inF0' ( in 3X3 matrix of float)
-0:407      Sequence
-0:407        move second child to first child ( temp 3X3 matrix of float)
-0:407          'r028' ( temp 3X3 matrix of float)
-0:407          matrix-scale ( temp 3X3 matrix of float)
-0:407            log2 ( temp 3X3 matrix of float)
-0:407              'inF0' ( in 3X3 matrix of float)
-0:407            Constant:
-0:407              0.301030
-0:407      Sequence
-0:407        move second child to first child ( temp 3X3 matrix of float)
-0:407          'r029' ( temp 3X3 matrix of float)
-0:407          log2 ( temp 3X3 matrix of float)
-0:407            'inF0' ( in 3X3 matrix of float)
-0:407      Sequence
-0:407        move second child to first child ( temp 3X3 matrix of float)
-0:407          'r030' ( temp 3X3 matrix of float)
-0:407          max ( temp 3X3 matrix of float)
-0:407            'inF0' ( in 3X3 matrix of float)
-0:407            'inF1' ( in 3X3 matrix of float)
-0:407      Sequence
-0:407        move second child to first child ( temp 3X3 matrix of float)
-0:407          'r031' ( temp 3X3 matrix of float)
-0:407          min ( temp 3X3 matrix of float)
-0:407            'inF0' ( in 3X3 matrix of float)
-0:407            'inF1' ( in 3X3 matrix of float)
-0:407      Sequence
-0:407        move second child to first child ( temp 3X3 matrix of float)
-0:407          'r032' ( temp 3X3 matrix of float)
-0:407          pow ( temp 3X3 matrix of float)
-0:407            'inF0' ( in 3X3 matrix of float)
-0:407            'inF1' ( in 3X3 matrix of float)
-0:407      Sequence
-0:407        move second child to first child ( temp 3X3 matrix of float)
-0:407          'r033' ( temp 3X3 matrix of float)
-0:407          radians ( temp 3X3 matrix of float)
-0:407            'inF0' ( in 3X3 matrix of float)
-0:407      Sequence
-0:407        move second child to first child ( temp 3X3 matrix of float)
-0:407          'r034' ( temp 3X3 matrix of float)
-0:407          roundEven ( temp 3X3 matrix of float)
-0:407            'inF0' ( in 3X3 matrix of float)
-0:407      Sequence
-0:407        move second child to first child ( temp 3X3 matrix of float)
-0:407          'r035' ( temp 3X3 matrix of float)
-0:407          inverse sqrt ( temp 3X3 matrix of float)
-0:407            'inF0' ( in 3X3 matrix of float)
-0:407      Sequence
-0:407        move second child to first child ( temp 3X3 matrix of float)
-0:407          'r036' ( temp 3X3 matrix of float)
-0:407          clamp ( temp 3X3 matrix of float)
-0:407            'inF0' ( in 3X3 matrix of float)
-0:407            Constant:
-0:407              0.000000
-0:407            Constant:
-0:407              1.000000
-0:407      Sequence
-0:407        move second child to first child ( temp 3X3 matrix of float)
-0:407          'r037' ( temp 3X3 matrix of float)
-0:407          Sign ( temp 3X3 matrix of float)
-0:407            'inF0' ( in 3X3 matrix of float)
-0:407      Sequence
-0:407        move second child to first child ( temp 3X3 matrix of float)
-0:407          'r038' ( temp 3X3 matrix of float)
-0:407          sine ( temp 3X3 matrix of float)
-0:407            'inF0' ( in 3X3 matrix of float)
-0:407      Sequence
-0:407        move second child to first child ( temp 3X3 matrix of float)
-0:407          'inF1' ( in 3X3 matrix of float)
-0:407          sine ( temp 3X3 matrix of float)
-0:407            'inF0' ( in 3X3 matrix of float)
-0:407        move second child to first child ( temp 3X3 matrix of float)
-0:407          'inF2' ( in 3X3 matrix of float)
-0:407          cosine ( temp 3X3 matrix of float)
-0:407            'inF0' ( in 3X3 matrix of float)
-0:407      Sequence
-0:407        move second child to first child ( temp 3X3 matrix of float)
-0:407          'r039' ( temp 3X3 matrix of float)
-0:407          hyp. sine ( temp 3X3 matrix of float)
-0:407            'inF0' ( in 3X3 matrix of float)
-0:407      Sequence
-0:407        move second child to first child ( temp 3X3 matrix of float)
-0:407          'r049' ( temp 3X3 matrix of float)
-0:407          smoothstep ( temp 3X3 matrix of float)
-0:407            'inF0' ( in 3X3 matrix of float)
-0:407            'inF1' ( in 3X3 matrix of float)
-0:407            'inF2' ( in 3X3 matrix of float)
-0:407      Sequence
-0:407        move second child to first child ( temp 3X3 matrix of float)
-0:407          'r041' ( temp 3X3 matrix of float)
-0:407          sqrt ( temp 3X3 matrix of float)
-0:407            'inF0' ( in 3X3 matrix of float)
-0:407      Sequence
-0:407        move second child to first child ( temp 3X3 matrix of float)
-0:407          'r042' ( temp 3X3 matrix of float)
-0:407          step ( temp 3X3 matrix of float)
-0:407            'inF0' ( in 3X3 matrix of float)
-0:407            'inF1' ( in 3X3 matrix of float)
-0:407      Sequence
-0:407        move second child to first child ( temp 3X3 matrix of float)
-0:407          'r043' ( temp 3X3 matrix of float)
-0:407          tangent ( temp 3X3 matrix of float)
-0:407            'inF0' ( in 3X3 matrix of float)
-0:407      Sequence
-0:407        move second child to first child ( temp 3X3 matrix of float)
-0:407          'r044' ( temp 3X3 matrix of float)
-0:407          hyp. tangent ( temp 3X3 matrix of float)
-0:407            'inF0' ( in 3X3 matrix of float)
-0:407      transpose ( temp 3X3 matrix of float)
-0:407        'inF0' ( in 3X3 matrix of float)
-0:407      Sequence
-0:407        move second child to first child ( temp 3X3 matrix of float)
-0:407          'r046' ( temp 3X3 matrix of float)
-0:407          trunc ( temp 3X3 matrix of float)
-0:407            'inF0' ( in 3X3 matrix of float)
-0:410      Branch: Return with expression
+0:412      Sequence
+0:412        move second child to first child ( temp bool)
+0:412          'r000' ( temp bool)
+0:412          all ( temp bool)
+0:412            Convert float to bool ( temp 3X3 matrix of bool)
+0:412              'inF0' ( in 3X3 matrix of float)
+0:412      Sequence
+0:412        move second child to first child ( temp 3X3 matrix of float)
+0:412          'r001' ( temp 3X3 matrix of float)
+0:412          Absolute value ( temp 3X3 matrix of float)
+0:412            'inF0' ( in 3X3 matrix of float)
+0:412      arc cosine ( temp 3X3 matrix of float)
+0:412        'inF0' ( in 3X3 matrix of float)
+0:412      Sequence
+0:412        move second child to first child ( temp bool)
+0:412          'r003' ( temp bool)
+0:412          any ( temp bool)
+0:412            Convert float to bool ( temp 3X3 matrix of bool)
+0:412              'inF0' ( in 3X3 matrix of float)
+0:412      Sequence
+0:412        move second child to first child ( temp 3X3 matrix of float)
+0:412          'r004' ( temp 3X3 matrix of float)
+0:412          arc sine ( temp 3X3 matrix of float)
+0:412            'inF0' ( in 3X3 matrix of float)
+0:412      Sequence
+0:412        move second child to first child ( temp 3X3 matrix of float)
+0:412          'r005' ( temp 3X3 matrix of float)
+0:412          arc tangent ( temp 3X3 matrix of float)
+0:412            'inF0' ( in 3X3 matrix of float)
+0:412      Sequence
+0:412        move second child to first child ( temp 3X3 matrix of float)
+0:412          'r006' ( temp 3X3 matrix of float)
+0:412          arc tangent ( temp 3X3 matrix of float)
+0:412            'inF0' ( in 3X3 matrix of float)
+0:412            'inF1' ( in 3X3 matrix of float)
+0:412      Sequence
+0:412        move second child to first child ( temp 3X3 matrix of float)
+0:412          'r007' ( temp 3X3 matrix of float)
+0:412          Ceiling ( temp 3X3 matrix of float)
+0:412            'inF0' ( in 3X3 matrix of float)
+0:412      Test condition and select ( temp void)
+0:412        Condition
+0:412        any ( temp bool)
+0:412          Compare Less Than ( temp 3X3 matrix of bool)
+0:412            'inF0' ( in 3X3 matrix of float)
+0:412            Constant:
+0:412              0.000000
+0:412              0.000000
+0:412              0.000000
+0:412              0.000000
+0:412              0.000000
+0:412              0.000000
+0:412              0.000000
+0:412              0.000000
+0:412              0.000000
+0:412        true case
+0:412        Branch: Kill
+0:412      Sequence
+0:412        move second child to first child ( temp 3X3 matrix of float)
+0:412          'r008' ( temp 3X3 matrix of float)
+0:412          clamp ( temp 3X3 matrix of float)
+0:412            'inF0' ( in 3X3 matrix of float)
+0:412            'inF1' ( in 3X3 matrix of float)
+0:412            'inF2' ( in 3X3 matrix of float)
+0:412      Sequence
+0:412        move second child to first child ( temp 3X3 matrix of float)
+0:412          'r009' ( temp 3X3 matrix of float)
+0:412          cosine ( temp 3X3 matrix of float)
+0:412            'inF0' ( in 3X3 matrix of float)
+0:412      Sequence
+0:412        move second child to first child ( temp 3X3 matrix of float)
+0:412          'r010' ( temp 3X3 matrix of float)
+0:412          hyp. cosine ( temp 3X3 matrix of float)
+0:412            'inF0' ( in 3X3 matrix of float)
+0:412      Sequence
+0:412        move second child to first child ( temp 3X3 matrix of float)
+0:412          'r011' ( temp 3X3 matrix of float)
+0:412          dPdx ( temp 3X3 matrix of float)
+0:412            'inF0' ( in 3X3 matrix of float)
+0:412      Sequence
+0:412        move second child to first child ( temp 3X3 matrix of float)
+0:412          'r012' ( temp 3X3 matrix of float)
+0:412          dPdxCoarse ( temp 3X3 matrix of float)
+0:412            'inF0' ( in 3X3 matrix of float)
+0:412      Sequence
+0:412        move second child to first child ( temp 3X3 matrix of float)
+0:412          'r013' ( temp 3X3 matrix of float)
+0:412          dPdxFine ( temp 3X3 matrix of float)
+0:412            'inF0' ( in 3X3 matrix of float)
+0:412      Sequence
+0:412        move second child to first child ( temp 3X3 matrix of float)
+0:412          'r014' ( temp 3X3 matrix of float)
+0:412          dPdy ( temp 3X3 matrix of float)
+0:412            'inF0' ( in 3X3 matrix of float)
+0:412      Sequence
+0:412        move second child to first child ( temp 3X3 matrix of float)
+0:412          'r015' ( temp 3X3 matrix of float)
+0:412          dPdyCoarse ( temp 3X3 matrix of float)
+0:412            'inF0' ( in 3X3 matrix of float)
+0:412      Sequence
+0:412        move second child to first child ( temp 3X3 matrix of float)
+0:412          'r016' ( temp 3X3 matrix of float)
+0:412          dPdyFine ( temp 3X3 matrix of float)
+0:412            'inF0' ( in 3X3 matrix of float)
+0:412      Sequence
+0:412        move second child to first child ( temp 3X3 matrix of float)
+0:412          'r017' ( temp 3X3 matrix of float)
+0:412          degrees ( temp 3X3 matrix of float)
+0:412            'inF0' ( in 3X3 matrix of float)
+0:412      Sequence
+0:412        move second child to first child ( temp float)
+0:412          'r018' ( temp float)
+0:412          determinant ( temp float)
+0:412            'inF0' ( in 3X3 matrix of float)
+0:412      Sequence
+0:412        move second child to first child ( temp 3X3 matrix of float)
+0:412          'r019' ( temp 3X3 matrix of float)
+0:412          exp ( temp 3X3 matrix of float)
+0:412            'inF0' ( in 3X3 matrix of float)
+0:412      Sequence
+0:412        move second child to first child ( temp 3X3 matrix of float)
+0:412          'R020' ( temp 3X3 matrix of float)
+0:412          exp2 ( temp 3X3 matrix of float)
+0:412            'inF0' ( in 3X3 matrix of float)
+0:412      Sequence
+0:412        move second child to first child ( temp 3X3 matrix of float)
+0:412          'r021' ( temp 3X3 matrix of float)
+0:412          Floor ( temp 3X3 matrix of float)
+0:412            'inF0' ( in 3X3 matrix of float)
+0:412      Sequence
+0:412        move second child to first child ( temp 3X3 matrix of float)
+0:412          'r022' ( temp 3X3 matrix of float)
+0:412          mod ( temp 3X3 matrix of float)
+0:412            'inF0' ( in 3X3 matrix of float)
+0:412            'inF1' ( in 3X3 matrix of float)
+0:412      Sequence
+0:412        move second child to first child ( temp 3X3 matrix of float)
+0:412          'r023' ( temp 3X3 matrix of float)
+0:412          Fraction ( temp 3X3 matrix of float)
+0:412            'inF0' ( in 3X3 matrix of float)
+0:412      Sequence
+0:412        move second child to first child ( temp 3X3 matrix of float)
+0:412          'r025' ( temp 3X3 matrix of float)
+0:412          fwidth ( temp 3X3 matrix of float)
+0:412            'inF0' ( in 3X3 matrix of float)
+0:412      Sequence
+0:412        move second child to first child ( temp 3X3 matrix of float)
+0:412          'r026' ( temp 3X3 matrix of float)
+0:412          ldexp ( temp 3X3 matrix of float)
+0:412            'inF0' ( in 3X3 matrix of float)
+0:412            'inF1' ( in 3X3 matrix of float)
+0:412      Sequence
+0:412        move second child to first child ( temp 3X3 matrix of float)
+0:412          'r026a' ( temp 3X3 matrix of float)
+0:412          mix ( temp 3X3 matrix of float)
+0:412            'inF0' ( in 3X3 matrix of float)
+0:412            'inF1' ( in 3X3 matrix of float)
+0:412            'inF2' ( in 3X3 matrix of float)
+0:412      Sequence
+0:412        move second child to first child ( temp 3X3 matrix of float)
+0:412          'r027' ( temp 3X3 matrix of float)
+0:412          log ( temp 3X3 matrix of float)
+0:412            'inF0' ( in 3X3 matrix of float)
+0:412      Sequence
+0:412        move second child to first child ( temp 3X3 matrix of float)
+0:412          'r028' ( temp 3X3 matrix of float)
+0:412          matrix-scale ( temp 3X3 matrix of float)
+0:412            log2 ( temp 3X3 matrix of float)
+0:412              'inF0' ( in 3X3 matrix of float)
+0:412            Constant:
+0:412              0.301030
+0:412      Sequence
+0:412        move second child to first child ( temp 3X3 matrix of float)
+0:412          'r029' ( temp 3X3 matrix of float)
+0:412          log2 ( temp 3X3 matrix of float)
+0:412            'inF0' ( in 3X3 matrix of float)
+0:412      Sequence
+0:412        move second child to first child ( temp 3X3 matrix of float)
+0:412          'r030' ( temp 3X3 matrix of float)
+0:412          max ( temp 3X3 matrix of float)
+0:412            'inF0' ( in 3X3 matrix of float)
+0:412            'inF1' ( in 3X3 matrix of float)
+0:412      Sequence
+0:412        move second child to first child ( temp 3X3 matrix of float)
+0:412          'r031' ( temp 3X3 matrix of float)
+0:412          min ( temp 3X3 matrix of float)
+0:412            'inF0' ( in 3X3 matrix of float)
+0:412            'inF1' ( in 3X3 matrix of float)
+0:412      Sequence
+0:412        move second child to first child ( temp 3X3 matrix of float)
+0:412          'r032' ( temp 3X3 matrix of float)
+0:412          pow ( temp 3X3 matrix of float)
+0:412            'inF0' ( in 3X3 matrix of float)
+0:412            'inF1' ( in 3X3 matrix of float)
+0:412      Sequence
+0:412        move second child to first child ( temp 3X3 matrix of float)
+0:412          'r033' ( temp 3X3 matrix of float)
+0:412          radians ( temp 3X3 matrix of float)
+0:412            'inF0' ( in 3X3 matrix of float)
+0:412      Sequence
+0:412        move second child to first child ( temp 3X3 matrix of float)
+0:412          'r034' ( temp 3X3 matrix of float)
+0:412          roundEven ( temp 3X3 matrix of float)
+0:412            'inF0' ( in 3X3 matrix of float)
+0:412      Sequence
+0:412        move second child to first child ( temp 3X3 matrix of float)
+0:412          'r035' ( temp 3X3 matrix of float)
+0:412          inverse sqrt ( temp 3X3 matrix of float)
+0:412            'inF0' ( in 3X3 matrix of float)
+0:412      Sequence
+0:412        move second child to first child ( temp 3X3 matrix of float)
+0:412          'r036' ( temp 3X3 matrix of float)
+0:412          clamp ( temp 3X3 matrix of float)
+0:412            'inF0' ( in 3X3 matrix of float)
+0:412            Constant:
+0:412              0.000000
+0:412            Constant:
+0:412              1.000000
+0:412      Sequence
+0:412        move second child to first child ( temp 3X3 matrix of float)
+0:412          'r037' ( temp 3X3 matrix of float)
+0:412          Sign ( temp 3X3 matrix of float)
+0:412            'inF0' ( in 3X3 matrix of float)
+0:412      Sequence
+0:412        move second child to first child ( temp 3X3 matrix of float)
+0:412          'r038' ( temp 3X3 matrix of float)
+0:412          sine ( temp 3X3 matrix of float)
+0:412            'inF0' ( in 3X3 matrix of float)
+0:412      Sequence
+0:412        move second child to first child ( temp 3X3 matrix of float)
+0:412          'inF1' ( in 3X3 matrix of float)
+0:412          sine ( temp 3X3 matrix of float)
+0:412            'inF0' ( in 3X3 matrix of float)
+0:412        move second child to first child ( temp 3X3 matrix of float)
+0:412          'inF2' ( in 3X3 matrix of float)
+0:412          cosine ( temp 3X3 matrix of float)
+0:412            'inF0' ( in 3X3 matrix of float)
+0:412      Sequence
+0:412        move second child to first child ( temp 3X3 matrix of float)
+0:412          'r039' ( temp 3X3 matrix of float)
+0:412          hyp. sine ( temp 3X3 matrix of float)
+0:412            'inF0' ( in 3X3 matrix of float)
+0:412      Sequence
+0:412        move second child to first child ( temp 3X3 matrix of float)
+0:412          'r049' ( temp 3X3 matrix of float)
+0:412          smoothstep ( temp 3X3 matrix of float)
+0:412            'inF0' ( in 3X3 matrix of float)
+0:412            'inF1' ( in 3X3 matrix of float)
+0:412            'inF2' ( in 3X3 matrix of float)
+0:412      Sequence
+0:412        move second child to first child ( temp 3X3 matrix of float)
+0:412          'r041' ( temp 3X3 matrix of float)
+0:412          sqrt ( temp 3X3 matrix of float)
+0:412            'inF0' ( in 3X3 matrix of float)
+0:412      Sequence
+0:412        move second child to first child ( temp 3X3 matrix of float)
+0:412          'r042' ( temp 3X3 matrix of float)
+0:412          step ( temp 3X3 matrix of float)
+0:412            'inF0' ( in 3X3 matrix of float)
+0:412            'inF1' ( in 3X3 matrix of float)
+0:412      Sequence
+0:412        move second child to first child ( temp 3X3 matrix of float)
+0:412          'r043' ( temp 3X3 matrix of float)
+0:412          tangent ( temp 3X3 matrix of float)
+0:412            'inF0' ( in 3X3 matrix of float)
+0:412      Sequence
+0:412        move second child to first child ( temp 3X3 matrix of float)
+0:412          'r044' ( temp 3X3 matrix of float)
+0:412          hyp. tangent ( temp 3X3 matrix of float)
+0:412            'inF0' ( in 3X3 matrix of float)
+0:412      transpose ( temp 3X3 matrix of float)
+0:412        'inF0' ( in 3X3 matrix of float)
+0:412      Sequence
+0:412        move second child to first child ( temp 3X3 matrix of float)
+0:412          'r046' ( temp 3X3 matrix of float)
+0:412          trunc ( temp 3X3 matrix of float)
+0:412            'inF0' ( in 3X3 matrix of float)
+0:415      Branch: Return with expression
 0:?         Constant:
 0:?           3.000000
 0:?           3.000000
@@ -2109,295 +2168,297 @@
 0:?           3.000000
 0:?           3.000000
 0:?           3.000000
-0:414  Function Definition: PixelShaderFunction4x4(mf44;mf44;mf44; ( temp 4X4 matrix of float)
-0:414    Function Parameters: 
-0:414      'inF0' ( in 4X4 matrix of float)
-0:414      'inF1' ( in 4X4 matrix of float)
-0:414      'inF2' ( in 4X4 matrix of float)
+0:419  Function Definition: PixelShaderFunction4x4(mf44;mf44;mf44; ( temp 4X4 matrix of float)
+0:419    Function Parameters: 
+0:419      'inF0' ( in 4X4 matrix of float)
+0:419      'inF1' ( in 4X4 matrix of float)
+0:419      'inF2' ( in 4X4 matrix of float)
 0:?     Sequence
-0:416      Sequence
-0:416        move second child to first child ( temp bool)
-0:416          'r000' ( temp bool)
-0:416          all ( temp bool)
-0:416            'inF0' ( in 4X4 matrix of float)
-0:416      Sequence
-0:416        move second child to first child ( temp 4X4 matrix of float)
-0:416          'r001' ( temp 4X4 matrix of float)
-0:416          Absolute value ( temp 4X4 matrix of float)
-0:416            'inF0' ( in 4X4 matrix of float)
-0:416      arc cosine ( temp 4X4 matrix of float)
-0:416        'inF0' ( in 4X4 matrix of float)
-0:416      Sequence
-0:416        move second child to first child ( temp bool)
-0:416          'r003' ( temp bool)
-0:416          any ( temp bool)
-0:416            'inF0' ( in 4X4 matrix of float)
-0:416      Sequence
-0:416        move second child to first child ( temp 4X4 matrix of float)
-0:416          'r004' ( temp 4X4 matrix of float)
-0:416          arc sine ( temp 4X4 matrix of float)
-0:416            'inF0' ( in 4X4 matrix of float)
-0:416      Sequence
-0:416        move second child to first child ( temp 4X4 matrix of float)
-0:416          'r005' ( temp 4X4 matrix of float)
-0:416          arc tangent ( temp 4X4 matrix of float)
-0:416            'inF0' ( in 4X4 matrix of float)
-0:416      Sequence
-0:416        move second child to first child ( temp 4X4 matrix of float)
-0:416          'r006' ( temp 4X4 matrix of float)
-0:416          arc tangent ( temp 4X4 matrix of float)
-0:416            'inF0' ( in 4X4 matrix of float)
-0:416            'inF1' ( in 4X4 matrix of float)
-0:416      Sequence
-0:416        move second child to first child ( temp 4X4 matrix of float)
-0:416          'r007' ( temp 4X4 matrix of float)
-0:416          Ceiling ( temp 4X4 matrix of float)
-0:416            'inF0' ( in 4X4 matrix of float)
-0:416      Test condition and select ( temp void)
-0:416        Condition
-0:416        any ( temp bool)
-0:416          Compare Less Than ( temp 4X4 matrix of bool)
-0:416            'inF0' ( in 4X4 matrix of float)
-0:416            Constant:
-0:416              0.000000
-0:416              0.000000
-0:416              0.000000
-0:416              0.000000
-0:416              0.000000
-0:416              0.000000
-0:416              0.000000
-0:416              0.000000
-0:416              0.000000
-0:416              0.000000
-0:416              0.000000
-0:416              0.000000
-0:416              0.000000
-0:416              0.000000
-0:416              0.000000
-0:416              0.000000
-0:416        true case
-0:416        Branch: Kill
-0:416      Sequence
-0:416        move second child to first child ( temp 4X4 matrix of float)
-0:416          'r008' ( temp 4X4 matrix of float)
-0:416          clamp ( temp 4X4 matrix of float)
-0:416            'inF0' ( in 4X4 matrix of float)
-0:416            'inF1' ( in 4X4 matrix of float)
-0:416            'inF2' ( in 4X4 matrix of float)
-0:416      Sequence
-0:416        move second child to first child ( temp 4X4 matrix of float)
-0:416          'r009' ( temp 4X4 matrix of float)
-0:416          cosine ( temp 4X4 matrix of float)
-0:416            'inF0' ( in 4X4 matrix of float)
-0:416      Sequence
-0:416        move second child to first child ( temp 4X4 matrix of float)
-0:416          'r010' ( temp 4X4 matrix of float)
-0:416          hyp. cosine ( temp 4X4 matrix of float)
-0:416            'inF0' ( in 4X4 matrix of float)
-0:416      Sequence
-0:416        move second child to first child ( temp 4X4 matrix of float)
-0:416          'r011' ( temp 4X4 matrix of float)
-0:416          dPdx ( temp 4X4 matrix of float)
-0:416            'inF0' ( in 4X4 matrix of float)
-0:416      Sequence
-0:416        move second child to first child ( temp 4X4 matrix of float)
-0:416          'r012' ( temp 4X4 matrix of float)
-0:416          dPdxCoarse ( temp 4X4 matrix of float)
-0:416            'inF0' ( in 4X4 matrix of float)
-0:416      Sequence
-0:416        move second child to first child ( temp 4X4 matrix of float)
-0:416          'r013' ( temp 4X4 matrix of float)
-0:416          dPdxFine ( temp 4X4 matrix of float)
-0:416            'inF0' ( in 4X4 matrix of float)
-0:416      Sequence
-0:416        move second child to first child ( temp 4X4 matrix of float)
-0:416          'r014' ( temp 4X4 matrix of float)
-0:416          dPdy ( temp 4X4 matrix of float)
-0:416            'inF0' ( in 4X4 matrix of float)
-0:416      Sequence
-0:416        move second child to first child ( temp 4X4 matrix of float)
-0:416          'r015' ( temp 4X4 matrix of float)
-0:416          dPdyCoarse ( temp 4X4 matrix of float)
-0:416            'inF0' ( in 4X4 matrix of float)
-0:416      Sequence
-0:416        move second child to first child ( temp 4X4 matrix of float)
-0:416          'r016' ( temp 4X4 matrix of float)
-0:416          dPdyFine ( temp 4X4 matrix of float)
-0:416            'inF0' ( in 4X4 matrix of float)
-0:416      Sequence
-0:416        move second child to first child ( temp 4X4 matrix of float)
-0:416          'r017' ( temp 4X4 matrix of float)
-0:416          degrees ( temp 4X4 matrix of float)
-0:416            'inF0' ( in 4X4 matrix of float)
-0:416      Sequence
-0:416        move second child to first child ( temp float)
-0:416          'r018' ( temp float)
-0:416          determinant ( temp float)
-0:416            'inF0' ( in 4X4 matrix of float)
-0:416      Sequence
-0:416        move second child to first child ( temp 4X4 matrix of float)
-0:416          'r019' ( temp 4X4 matrix of float)
-0:416          exp ( temp 4X4 matrix of float)
-0:416            'inF0' ( in 4X4 matrix of float)
-0:416      Sequence
-0:416        move second child to first child ( temp 4X4 matrix of float)
-0:416          'R020' ( temp 4X4 matrix of float)
-0:416          exp2 ( temp 4X4 matrix of float)
-0:416            'inF0' ( in 4X4 matrix of float)
-0:416      Sequence
-0:416        move second child to first child ( temp 4X4 matrix of float)
-0:416          'r021' ( temp 4X4 matrix of float)
-0:416          Floor ( temp 4X4 matrix of float)
-0:416            'inF0' ( in 4X4 matrix of float)
-0:416      Sequence
-0:416        move second child to first child ( temp 4X4 matrix of float)
-0:416          'r022' ( temp 4X4 matrix of float)
-0:416          mod ( temp 4X4 matrix of float)
-0:416            'inF0' ( in 4X4 matrix of float)
-0:416            'inF1' ( in 4X4 matrix of float)
-0:416      Sequence
-0:416        move second child to first child ( temp 4X4 matrix of float)
-0:416          'r023' ( temp 4X4 matrix of float)
-0:416          Fraction ( temp 4X4 matrix of float)
-0:416            'inF0' ( in 4X4 matrix of float)
-0:416      Sequence
-0:416        move second child to first child ( temp 4X4 matrix of float)
-0:416          'r025' ( temp 4X4 matrix of float)
-0:416          fwidth ( temp 4X4 matrix of float)
-0:416            'inF0' ( in 4X4 matrix of float)
-0:416      Sequence
-0:416        move second child to first child ( temp 4X4 matrix of float)
-0:416          'r026' ( temp 4X4 matrix of float)
-0:416          ldexp ( temp 4X4 matrix of float)
-0:416            'inF0' ( in 4X4 matrix of float)
-0:416            'inF1' ( in 4X4 matrix of float)
-0:416      Sequence
-0:416        move second child to first child ( temp 4X4 matrix of float)
-0:416          'r026a' ( temp 4X4 matrix of float)
-0:416          mix ( temp 4X4 matrix of float)
-0:416            'inF0' ( in 4X4 matrix of float)
-0:416            'inF1' ( in 4X4 matrix of float)
-0:416            'inF2' ( in 4X4 matrix of float)
-0:416      Sequence
-0:416        move second child to first child ( temp 4X4 matrix of float)
-0:416          'r027' ( temp 4X4 matrix of float)
-0:416          log ( temp 4X4 matrix of float)
-0:416            'inF0' ( in 4X4 matrix of float)
-0:416      Sequence
-0:416        move second child to first child ( temp 4X4 matrix of float)
-0:416          'r028' ( temp 4X4 matrix of float)
-0:416          matrix-scale ( temp 4X4 matrix of float)
-0:416            log2 ( temp 4X4 matrix of float)
-0:416              'inF0' ( in 4X4 matrix of float)
-0:416            Constant:
-0:416              0.301030
-0:416      Sequence
-0:416        move second child to first child ( temp 4X4 matrix of float)
-0:416          'r029' ( temp 4X4 matrix of float)
-0:416          log2 ( temp 4X4 matrix of float)
-0:416            'inF0' ( in 4X4 matrix of float)
-0:416      Sequence
-0:416        move second child to first child ( temp 4X4 matrix of float)
-0:416          'r030' ( temp 4X4 matrix of float)
-0:416          max ( temp 4X4 matrix of float)
-0:416            'inF0' ( in 4X4 matrix of float)
-0:416            'inF1' ( in 4X4 matrix of float)
-0:416      Sequence
-0:416        move second child to first child ( temp 4X4 matrix of float)
-0:416          'r031' ( temp 4X4 matrix of float)
-0:416          min ( temp 4X4 matrix of float)
-0:416            'inF0' ( in 4X4 matrix of float)
-0:416            'inF1' ( in 4X4 matrix of float)
-0:416      Sequence
-0:416        move second child to first child ( temp 4X4 matrix of float)
-0:416          'r032' ( temp 4X4 matrix of float)
-0:416          pow ( temp 4X4 matrix of float)
-0:416            'inF0' ( in 4X4 matrix of float)
-0:416            'inF1' ( in 4X4 matrix of float)
-0:416      Sequence
-0:416        move second child to first child ( temp 4X4 matrix of float)
-0:416          'r033' ( temp 4X4 matrix of float)
-0:416          radians ( temp 4X4 matrix of float)
-0:416            'inF0' ( in 4X4 matrix of float)
-0:416      Sequence
-0:416        move second child to first child ( temp 4X4 matrix of float)
-0:416          'r034' ( temp 4X4 matrix of float)
-0:416          roundEven ( temp 4X4 matrix of float)
-0:416            'inF0' ( in 4X4 matrix of float)
-0:416      Sequence
-0:416        move second child to first child ( temp 4X4 matrix of float)
-0:416          'r035' ( temp 4X4 matrix of float)
-0:416          inverse sqrt ( temp 4X4 matrix of float)
-0:416            'inF0' ( in 4X4 matrix of float)
-0:416      Sequence
-0:416        move second child to first child ( temp 4X4 matrix of float)
-0:416          'r036' ( temp 4X4 matrix of float)
-0:416          clamp ( temp 4X4 matrix of float)
-0:416            'inF0' ( in 4X4 matrix of float)
-0:416            Constant:
-0:416              0.000000
-0:416            Constant:
-0:416              1.000000
-0:416      Sequence
-0:416        move second child to first child ( temp 4X4 matrix of float)
-0:416          'r037' ( temp 4X4 matrix of float)
-0:416          Sign ( temp 4X4 matrix of float)
-0:416            'inF0' ( in 4X4 matrix of float)
-0:416      Sequence
-0:416        move second child to first child ( temp 4X4 matrix of float)
-0:416          'r038' ( temp 4X4 matrix of float)
-0:416          sine ( temp 4X4 matrix of float)
-0:416            'inF0' ( in 4X4 matrix of float)
-0:416      Sequence
-0:416        move second child to first child ( temp 4X4 matrix of float)
-0:416          'inF1' ( in 4X4 matrix of float)
-0:416          sine ( temp 4X4 matrix of float)
-0:416            'inF0' ( in 4X4 matrix of float)
-0:416        move second child to first child ( temp 4X4 matrix of float)
-0:416          'inF2' ( in 4X4 matrix of float)
-0:416          cosine ( temp 4X4 matrix of float)
-0:416            'inF0' ( in 4X4 matrix of float)
-0:416      Sequence
-0:416        move second child to first child ( temp 4X4 matrix of float)
-0:416          'r039' ( temp 4X4 matrix of float)
-0:416          hyp. sine ( temp 4X4 matrix of float)
-0:416            'inF0' ( in 4X4 matrix of float)
-0:416      Sequence
-0:416        move second child to first child ( temp 4X4 matrix of float)
-0:416          'r049' ( temp 4X4 matrix of float)
-0:416          smoothstep ( temp 4X4 matrix of float)
-0:416            'inF0' ( in 4X4 matrix of float)
-0:416            'inF1' ( in 4X4 matrix of float)
-0:416            'inF2' ( in 4X4 matrix of float)
-0:416      Sequence
-0:416        move second child to first child ( temp 4X4 matrix of float)
-0:416          'r041' ( temp 4X4 matrix of float)
-0:416          sqrt ( temp 4X4 matrix of float)
-0:416            'inF0' ( in 4X4 matrix of float)
-0:416      Sequence
-0:416        move second child to first child ( temp 4X4 matrix of float)
-0:416          'r042' ( temp 4X4 matrix of float)
-0:416          step ( temp 4X4 matrix of float)
-0:416            'inF0' ( in 4X4 matrix of float)
-0:416            'inF1' ( in 4X4 matrix of float)
-0:416      Sequence
-0:416        move second child to first child ( temp 4X4 matrix of float)
-0:416          'r043' ( temp 4X4 matrix of float)
-0:416          tangent ( temp 4X4 matrix of float)
-0:416            'inF0' ( in 4X4 matrix of float)
-0:416      Sequence
-0:416        move second child to first child ( temp 4X4 matrix of float)
-0:416          'r044' ( temp 4X4 matrix of float)
-0:416          hyp. tangent ( temp 4X4 matrix of float)
-0:416            'inF0' ( in 4X4 matrix of float)
-0:416      transpose ( temp 4X4 matrix of float)
-0:416        'inF0' ( in 4X4 matrix of float)
-0:416      Sequence
-0:416        move second child to first child ( temp 4X4 matrix of float)
-0:416          'r046' ( temp 4X4 matrix of float)
-0:416          trunc ( temp 4X4 matrix of float)
-0:416            'inF0' ( in 4X4 matrix of float)
-0:419      Branch: Return with expression
+0:421      Sequence
+0:421        move second child to first child ( temp bool)
+0:421          'r000' ( temp bool)
+0:421          all ( temp bool)
+0:421            Convert float to bool ( temp 4X4 matrix of bool)
+0:421              'inF0' ( in 4X4 matrix of float)
+0:421      Sequence
+0:421        move second child to first child ( temp 4X4 matrix of float)
+0:421          'r001' ( temp 4X4 matrix of float)
+0:421          Absolute value ( temp 4X4 matrix of float)
+0:421            'inF0' ( in 4X4 matrix of float)
+0:421      arc cosine ( temp 4X4 matrix of float)
+0:421        'inF0' ( in 4X4 matrix of float)
+0:421      Sequence
+0:421        move second child to first child ( temp bool)
+0:421          'r003' ( temp bool)
+0:421          any ( temp bool)
+0:421            Convert float to bool ( temp 4X4 matrix of bool)
+0:421              'inF0' ( in 4X4 matrix of float)
+0:421      Sequence
+0:421        move second child to first child ( temp 4X4 matrix of float)
+0:421          'r004' ( temp 4X4 matrix of float)
+0:421          arc sine ( temp 4X4 matrix of float)
+0:421            'inF0' ( in 4X4 matrix of float)
+0:421      Sequence
+0:421        move second child to first child ( temp 4X4 matrix of float)
+0:421          'r005' ( temp 4X4 matrix of float)
+0:421          arc tangent ( temp 4X4 matrix of float)
+0:421            'inF0' ( in 4X4 matrix of float)
+0:421      Sequence
+0:421        move second child to first child ( temp 4X4 matrix of float)
+0:421          'r006' ( temp 4X4 matrix of float)
+0:421          arc tangent ( temp 4X4 matrix of float)
+0:421            'inF0' ( in 4X4 matrix of float)
+0:421            'inF1' ( in 4X4 matrix of float)
+0:421      Sequence
+0:421        move second child to first child ( temp 4X4 matrix of float)
+0:421          'r007' ( temp 4X4 matrix of float)
+0:421          Ceiling ( temp 4X4 matrix of float)
+0:421            'inF0' ( in 4X4 matrix of float)
+0:421      Test condition and select ( temp void)
+0:421        Condition
+0:421        any ( temp bool)
+0:421          Compare Less Than ( temp 4X4 matrix of bool)
+0:421            'inF0' ( in 4X4 matrix of float)
+0:421            Constant:
+0:421              0.000000
+0:421              0.000000
+0:421              0.000000
+0:421              0.000000
+0:421              0.000000
+0:421              0.000000
+0:421              0.000000
+0:421              0.000000
+0:421              0.000000
+0:421              0.000000
+0:421              0.000000
+0:421              0.000000
+0:421              0.000000
+0:421              0.000000
+0:421              0.000000
+0:421              0.000000
+0:421        true case
+0:421        Branch: Kill
+0:421      Sequence
+0:421        move second child to first child ( temp 4X4 matrix of float)
+0:421          'r008' ( temp 4X4 matrix of float)
+0:421          clamp ( temp 4X4 matrix of float)
+0:421            'inF0' ( in 4X4 matrix of float)
+0:421            'inF1' ( in 4X4 matrix of float)
+0:421            'inF2' ( in 4X4 matrix of float)
+0:421      Sequence
+0:421        move second child to first child ( temp 4X4 matrix of float)
+0:421          'r009' ( temp 4X4 matrix of float)
+0:421          cosine ( temp 4X4 matrix of float)
+0:421            'inF0' ( in 4X4 matrix of float)
+0:421      Sequence
+0:421        move second child to first child ( temp 4X4 matrix of float)
+0:421          'r010' ( temp 4X4 matrix of float)
+0:421          hyp. cosine ( temp 4X4 matrix of float)
+0:421            'inF0' ( in 4X4 matrix of float)
+0:421      Sequence
+0:421        move second child to first child ( temp 4X4 matrix of float)
+0:421          'r011' ( temp 4X4 matrix of float)
+0:421          dPdx ( temp 4X4 matrix of float)
+0:421            'inF0' ( in 4X4 matrix of float)
+0:421      Sequence
+0:421        move second child to first child ( temp 4X4 matrix of float)
+0:421          'r012' ( temp 4X4 matrix of float)
+0:421          dPdxCoarse ( temp 4X4 matrix of float)
+0:421            'inF0' ( in 4X4 matrix of float)
+0:421      Sequence
+0:421        move second child to first child ( temp 4X4 matrix of float)
+0:421          'r013' ( temp 4X4 matrix of float)
+0:421          dPdxFine ( temp 4X4 matrix of float)
+0:421            'inF0' ( in 4X4 matrix of float)
+0:421      Sequence
+0:421        move second child to first child ( temp 4X4 matrix of float)
+0:421          'r014' ( temp 4X4 matrix of float)
+0:421          dPdy ( temp 4X4 matrix of float)
+0:421            'inF0' ( in 4X4 matrix of float)
+0:421      Sequence
+0:421        move second child to first child ( temp 4X4 matrix of float)
+0:421          'r015' ( temp 4X4 matrix of float)
+0:421          dPdyCoarse ( temp 4X4 matrix of float)
+0:421            'inF0' ( in 4X4 matrix of float)
+0:421      Sequence
+0:421        move second child to first child ( temp 4X4 matrix of float)
+0:421          'r016' ( temp 4X4 matrix of float)
+0:421          dPdyFine ( temp 4X4 matrix of float)
+0:421            'inF0' ( in 4X4 matrix of float)
+0:421      Sequence
+0:421        move second child to first child ( temp 4X4 matrix of float)
+0:421          'r017' ( temp 4X4 matrix of float)
+0:421          degrees ( temp 4X4 matrix of float)
+0:421            'inF0' ( in 4X4 matrix of float)
+0:421      Sequence
+0:421        move second child to first child ( temp float)
+0:421          'r018' ( temp float)
+0:421          determinant ( temp float)
+0:421            'inF0' ( in 4X4 matrix of float)
+0:421      Sequence
+0:421        move second child to first child ( temp 4X4 matrix of float)
+0:421          'r019' ( temp 4X4 matrix of float)
+0:421          exp ( temp 4X4 matrix of float)
+0:421            'inF0' ( in 4X4 matrix of float)
+0:421      Sequence
+0:421        move second child to first child ( temp 4X4 matrix of float)
+0:421          'R020' ( temp 4X4 matrix of float)
+0:421          exp2 ( temp 4X4 matrix of float)
+0:421            'inF0' ( in 4X4 matrix of float)
+0:421      Sequence
+0:421        move second child to first child ( temp 4X4 matrix of float)
+0:421          'r021' ( temp 4X4 matrix of float)
+0:421          Floor ( temp 4X4 matrix of float)
+0:421            'inF0' ( in 4X4 matrix of float)
+0:421      Sequence
+0:421        move second child to first child ( temp 4X4 matrix of float)
+0:421          'r022' ( temp 4X4 matrix of float)
+0:421          mod ( temp 4X4 matrix of float)
+0:421            'inF0' ( in 4X4 matrix of float)
+0:421            'inF1' ( in 4X4 matrix of float)
+0:421      Sequence
+0:421        move second child to first child ( temp 4X4 matrix of float)
+0:421          'r023' ( temp 4X4 matrix of float)
+0:421          Fraction ( temp 4X4 matrix of float)
+0:421            'inF0' ( in 4X4 matrix of float)
+0:421      Sequence
+0:421        move second child to first child ( temp 4X4 matrix of float)
+0:421          'r025' ( temp 4X4 matrix of float)
+0:421          fwidth ( temp 4X4 matrix of float)
+0:421            'inF0' ( in 4X4 matrix of float)
+0:421      Sequence
+0:421        move second child to first child ( temp 4X4 matrix of float)
+0:421          'r026' ( temp 4X4 matrix of float)
+0:421          ldexp ( temp 4X4 matrix of float)
+0:421            'inF0' ( in 4X4 matrix of float)
+0:421            'inF1' ( in 4X4 matrix of float)
+0:421      Sequence
+0:421        move second child to first child ( temp 4X4 matrix of float)
+0:421          'r026a' ( temp 4X4 matrix of float)
+0:421          mix ( temp 4X4 matrix of float)
+0:421            'inF0' ( in 4X4 matrix of float)
+0:421            'inF1' ( in 4X4 matrix of float)
+0:421            'inF2' ( in 4X4 matrix of float)
+0:421      Sequence
+0:421        move second child to first child ( temp 4X4 matrix of float)
+0:421          'r027' ( temp 4X4 matrix of float)
+0:421          log ( temp 4X4 matrix of float)
+0:421            'inF0' ( in 4X4 matrix of float)
+0:421      Sequence
+0:421        move second child to first child ( temp 4X4 matrix of float)
+0:421          'r028' ( temp 4X4 matrix of float)
+0:421          matrix-scale ( temp 4X4 matrix of float)
+0:421            log2 ( temp 4X4 matrix of float)
+0:421              'inF0' ( in 4X4 matrix of float)
+0:421            Constant:
+0:421              0.301030
+0:421      Sequence
+0:421        move second child to first child ( temp 4X4 matrix of float)
+0:421          'r029' ( temp 4X4 matrix of float)
+0:421          log2 ( temp 4X4 matrix of float)
+0:421            'inF0' ( in 4X4 matrix of float)
+0:421      Sequence
+0:421        move second child to first child ( temp 4X4 matrix of float)
+0:421          'r030' ( temp 4X4 matrix of float)
+0:421          max ( temp 4X4 matrix of float)
+0:421            'inF0' ( in 4X4 matrix of float)
+0:421            'inF1' ( in 4X4 matrix of float)
+0:421      Sequence
+0:421        move second child to first child ( temp 4X4 matrix of float)
+0:421          'r031' ( temp 4X4 matrix of float)
+0:421          min ( temp 4X4 matrix of float)
+0:421            'inF0' ( in 4X4 matrix of float)
+0:421            'inF1' ( in 4X4 matrix of float)
+0:421      Sequence
+0:421        move second child to first child ( temp 4X4 matrix of float)
+0:421          'r032' ( temp 4X4 matrix of float)
+0:421          pow ( temp 4X4 matrix of float)
+0:421            'inF0' ( in 4X4 matrix of float)
+0:421            'inF1' ( in 4X4 matrix of float)
+0:421      Sequence
+0:421        move second child to first child ( temp 4X4 matrix of float)
+0:421          'r033' ( temp 4X4 matrix of float)
+0:421          radians ( temp 4X4 matrix of float)
+0:421            'inF0' ( in 4X4 matrix of float)
+0:421      Sequence
+0:421        move second child to first child ( temp 4X4 matrix of float)
+0:421          'r034' ( temp 4X4 matrix of float)
+0:421          roundEven ( temp 4X4 matrix of float)
+0:421            'inF0' ( in 4X4 matrix of float)
+0:421      Sequence
+0:421        move second child to first child ( temp 4X4 matrix of float)
+0:421          'r035' ( temp 4X4 matrix of float)
+0:421          inverse sqrt ( temp 4X4 matrix of float)
+0:421            'inF0' ( in 4X4 matrix of float)
+0:421      Sequence
+0:421        move second child to first child ( temp 4X4 matrix of float)
+0:421          'r036' ( temp 4X4 matrix of float)
+0:421          clamp ( temp 4X4 matrix of float)
+0:421            'inF0' ( in 4X4 matrix of float)
+0:421            Constant:
+0:421              0.000000
+0:421            Constant:
+0:421              1.000000
+0:421      Sequence
+0:421        move second child to first child ( temp 4X4 matrix of float)
+0:421          'r037' ( temp 4X4 matrix of float)
+0:421          Sign ( temp 4X4 matrix of float)
+0:421            'inF0' ( in 4X4 matrix of float)
+0:421      Sequence
+0:421        move second child to first child ( temp 4X4 matrix of float)
+0:421          'r038' ( temp 4X4 matrix of float)
+0:421          sine ( temp 4X4 matrix of float)
+0:421            'inF0' ( in 4X4 matrix of float)
+0:421      Sequence
+0:421        move second child to first child ( temp 4X4 matrix of float)
+0:421          'inF1' ( in 4X4 matrix of float)
+0:421          sine ( temp 4X4 matrix of float)
+0:421            'inF0' ( in 4X4 matrix of float)
+0:421        move second child to first child ( temp 4X4 matrix of float)
+0:421          'inF2' ( in 4X4 matrix of float)
+0:421          cosine ( temp 4X4 matrix of float)
+0:421            'inF0' ( in 4X4 matrix of float)
+0:421      Sequence
+0:421        move second child to first child ( temp 4X4 matrix of float)
+0:421          'r039' ( temp 4X4 matrix of float)
+0:421          hyp. sine ( temp 4X4 matrix of float)
+0:421            'inF0' ( in 4X4 matrix of float)
+0:421      Sequence
+0:421        move second child to first child ( temp 4X4 matrix of float)
+0:421          'r049' ( temp 4X4 matrix of float)
+0:421          smoothstep ( temp 4X4 matrix of float)
+0:421            'inF0' ( in 4X4 matrix of float)
+0:421            'inF1' ( in 4X4 matrix of float)
+0:421            'inF2' ( in 4X4 matrix of float)
+0:421      Sequence
+0:421        move second child to first child ( temp 4X4 matrix of float)
+0:421          'r041' ( temp 4X4 matrix of float)
+0:421          sqrt ( temp 4X4 matrix of float)
+0:421            'inF0' ( in 4X4 matrix of float)
+0:421      Sequence
+0:421        move second child to first child ( temp 4X4 matrix of float)
+0:421          'r042' ( temp 4X4 matrix of float)
+0:421          step ( temp 4X4 matrix of float)
+0:421            'inF0' ( in 4X4 matrix of float)
+0:421            'inF1' ( in 4X4 matrix of float)
+0:421      Sequence
+0:421        move second child to first child ( temp 4X4 matrix of float)
+0:421          'r043' ( temp 4X4 matrix of float)
+0:421          tangent ( temp 4X4 matrix of float)
+0:421            'inF0' ( in 4X4 matrix of float)
+0:421      Sequence
+0:421        move second child to first child ( temp 4X4 matrix of float)
+0:421          'r044' ( temp 4X4 matrix of float)
+0:421          hyp. tangent ( temp 4X4 matrix of float)
+0:421            'inF0' ( in 4X4 matrix of float)
+0:421      transpose ( temp 4X4 matrix of float)
+0:421        'inF0' ( in 4X4 matrix of float)
+0:421      Sequence
+0:421        move second child to first child ( temp 4X4 matrix of float)
+0:421          'r046' ( temp 4X4 matrix of float)
+0:421          trunc ( temp 4X4 matrix of float)
+0:421            'inF0' ( in 4X4 matrix of float)
+0:424      Branch: Return with expression
 0:?         Constant:
 0:?           4.000000
 0:?           4.000000
@@ -2415,334 +2476,334 @@
 0:?           4.000000
 0:?           4.000000
 0:?           4.000000
-0:437  Function Definition: TestGenMul2(f1;f1;vf2;vf2;mf22;mf22; ( temp void)
-0:437    Function Parameters: 
-0:437      'inF0' ( in float)
-0:437      'inF1' ( in float)
-0:437      'inFV0' ( in 2-component vector of float)
-0:437      'inFV1' ( in 2-component vector of float)
-0:437      'inFM0' ( in 2X2 matrix of float)
-0:437      'inFM1' ( in 2X2 matrix of float)
+0:442  Function Definition: TestGenMul2(f1;f1;vf2;vf2;mf22;mf22; ( temp void)
+0:442    Function Parameters: 
+0:442      'inF0' ( in float)
+0:442      'inF1' ( in float)
+0:442      'inFV0' ( in 2-component vector of float)
+0:442      'inFV1' ( in 2-component vector of float)
+0:442      'inFM0' ( in 2X2 matrix of float)
+0:442      'inFM1' ( in 2X2 matrix of float)
 0:?     Sequence
-0:438      Sequence
-0:438        move second child to first child ( temp float)
-0:438          'r0' ( temp float)
-0:438          component-wise multiply ( temp float)
-0:438            'inF1' ( in float)
-0:438            'inF0' ( in float)
-0:438      Sequence
-0:438        move second child to first child ( temp 2-component vector of float)
-0:438          'r1' ( temp 2-component vector of float)
-0:438          vector-scale ( temp 2-component vector of float)
-0:438            'inF0' ( in float)
-0:438            'inFV0' ( in 2-component vector of float)
-0:438      Sequence
-0:438        move second child to first child ( temp 2-component vector of float)
-0:438          'r2' ( temp 2-component vector of float)
-0:438          vector-scale ( temp 2-component vector of float)
-0:438            'inFV0' ( in 2-component vector of float)
-0:438            'inF0' ( in float)
-0:438      Sequence
-0:438        move second child to first child ( temp float)
-0:438          'r3' ( temp float)
-0:438          dot-product ( temp float)
-0:438            'inFV0' ( in 2-component vector of float)
-0:438            'inFV1' ( in 2-component vector of float)
-0:438      Sequence
-0:438        move second child to first child ( temp 2-component vector of float)
-0:438          'r4' ( temp 2-component vector of float)
-0:438          vector-times-matrix ( temp 2-component vector of float)
-0:438            'inFV0' ( in 2-component vector of float)
-0:438            'inFM0' ( in 2X2 matrix of float)
-0:438      Sequence
-0:438        move second child to first child ( temp 2-component vector of float)
-0:438          'r5' ( temp 2-component vector of float)
-0:438          matrix-times-vector ( temp 2-component vector of float)
-0:438            'inFM0' ( in 2X2 matrix of float)
-0:438            'inFV0' ( in 2-component vector of float)
-0:438      Sequence
-0:438        move second child to first child ( temp 2X2 matrix of float)
-0:438          'r6' ( temp 2X2 matrix of float)
-0:438          matrix-scale ( temp 2X2 matrix of float)
-0:438            'inF0' ( in float)
-0:438            'inFM0' ( in 2X2 matrix of float)
-0:438      Sequence
-0:438        move second child to first child ( temp 2X2 matrix of float)
-0:438          'r7' ( temp 2X2 matrix of float)
-0:438          matrix-scale ( temp 2X2 matrix of float)
-0:438            'inFM0' ( in 2X2 matrix of float)
-0:438            'inF0' ( in float)
-0:438      Sequence
-0:438        move second child to first child ( temp 2X2 matrix of float)
-0:438          'r8' ( temp 2X2 matrix of float)
-0:438          matrix-multiply ( temp 2X2 matrix of float)
-0:438            'inFM1' ( in 2X2 matrix of float)
-0:438            'inFM0' ( in 2X2 matrix of float)
-0:444  Function Definition: TestGenMul3(f1;f1;vf3;vf3;mf33;mf33; ( temp void)
-0:444    Function Parameters: 
-0:444      'inF0' ( in float)
-0:444      'inF1' ( in float)
-0:444      'inFV0' ( in 3-component vector of float)
-0:444      'inFV1' ( in 3-component vector of float)
-0:444      'inFM0' ( in 3X3 matrix of float)
-0:444      'inFM1' ( in 3X3 matrix of float)
+0:443      Sequence
+0:443        move second child to first child ( temp float)
+0:443          'r0' ( temp float)
+0:443          component-wise multiply ( temp float)
+0:443            'inF1' ( in float)
+0:443            'inF0' ( in float)
+0:443      Sequence
+0:443        move second child to first child ( temp 2-component vector of float)
+0:443          'r1' ( temp 2-component vector of float)
+0:443          vector-scale ( temp 2-component vector of float)
+0:443            'inF0' ( in float)
+0:443            'inFV0' ( in 2-component vector of float)
+0:443      Sequence
+0:443        move second child to first child ( temp 2-component vector of float)
+0:443          'r2' ( temp 2-component vector of float)
+0:443          vector-scale ( temp 2-component vector of float)
+0:443            'inFV0' ( in 2-component vector of float)
+0:443            'inF0' ( in float)
+0:443      Sequence
+0:443        move second child to first child ( temp float)
+0:443          'r3' ( temp float)
+0:443          dot-product ( temp float)
+0:443            'inFV0' ( in 2-component vector of float)
+0:443            'inFV1' ( in 2-component vector of float)
+0:443      Sequence
+0:443        move second child to first child ( temp 2-component vector of float)
+0:443          'r4' ( temp 2-component vector of float)
+0:443          vector-times-matrix ( temp 2-component vector of float)
+0:443            'inFV0' ( in 2-component vector of float)
+0:443            'inFM0' ( in 2X2 matrix of float)
+0:443      Sequence
+0:443        move second child to first child ( temp 2-component vector of float)
+0:443          'r5' ( temp 2-component vector of float)
+0:443          matrix-times-vector ( temp 2-component vector of float)
+0:443            'inFM0' ( in 2X2 matrix of float)
+0:443            'inFV0' ( in 2-component vector of float)
+0:443      Sequence
+0:443        move second child to first child ( temp 2X2 matrix of float)
+0:443          'r6' ( temp 2X2 matrix of float)
+0:443          matrix-scale ( temp 2X2 matrix of float)
+0:443            'inF0' ( in float)
+0:443            'inFM0' ( in 2X2 matrix of float)
+0:443      Sequence
+0:443        move second child to first child ( temp 2X2 matrix of float)
+0:443          'r7' ( temp 2X2 matrix of float)
+0:443          matrix-scale ( temp 2X2 matrix of float)
+0:443            'inFM0' ( in 2X2 matrix of float)
+0:443            'inF0' ( in float)
+0:443      Sequence
+0:443        move second child to first child ( temp 2X2 matrix of float)
+0:443          'r8' ( temp 2X2 matrix of float)
+0:443          matrix-multiply ( temp 2X2 matrix of float)
+0:443            'inFM1' ( in 2X2 matrix of float)
+0:443            'inFM0' ( in 2X2 matrix of float)
+0:449  Function Definition: TestGenMul3(f1;f1;vf3;vf3;mf33;mf33; ( temp void)
+0:449    Function Parameters: 
+0:449      'inF0' ( in float)
+0:449      'inF1' ( in float)
+0:449      'inFV0' ( in 3-component vector of float)
+0:449      'inFV1' ( in 3-component vector of float)
+0:449      'inFM0' ( in 3X3 matrix of float)
+0:449      'inFM1' ( in 3X3 matrix of float)
 0:?     Sequence
-0:445      Sequence
-0:445        move second child to first child ( temp float)
-0:445          'r0' ( temp float)
-0:445          component-wise multiply ( temp float)
-0:445            'inF1' ( in float)
-0:445            'inF0' ( in float)
-0:445      Sequence
-0:445        move second child to first child ( temp 3-component vector of float)
-0:445          'r1' ( temp 3-component vector of float)
-0:445          vector-scale ( temp 3-component vector of float)
-0:445            'inF0' ( in float)
-0:445            'inFV0' ( in 3-component vector of float)
-0:445      Sequence
-0:445        move second child to first child ( temp 3-component vector of float)
-0:445          'r2' ( temp 3-component vector of float)
-0:445          vector-scale ( temp 3-component vector of float)
-0:445            'inFV0' ( in 3-component vector of float)
-0:445            'inF0' ( in float)
-0:445      Sequence
-0:445        move second child to first child ( temp float)
-0:445          'r3' ( temp float)
-0:445          dot-product ( temp float)
-0:445            'inFV0' ( in 3-component vector of float)
-0:445            'inFV1' ( in 3-component vector of float)
-0:445      Sequence
-0:445        move second child to first child ( temp 3-component vector of float)
-0:445          'r4' ( temp 3-component vector of float)
-0:445          vector-times-matrix ( temp 3-component vector of float)
-0:445            'inFV0' ( in 3-component vector of float)
-0:445            'inFM0' ( in 3X3 matrix of float)
-0:445      Sequence
-0:445        move second child to first child ( temp 3-component vector of float)
-0:445          'r5' ( temp 3-component vector of float)
-0:445          matrix-times-vector ( temp 3-component vector of float)
-0:445            'inFM0' ( in 3X3 matrix of float)
-0:445            'inFV0' ( in 3-component vector of float)
-0:445      Sequence
-0:445        move second child to first child ( temp 3X3 matrix of float)
-0:445          'r6' ( temp 3X3 matrix of float)
-0:445          matrix-scale ( temp 3X3 matrix of float)
-0:445            'inF0' ( in float)
-0:445            'inFM0' ( in 3X3 matrix of float)
-0:445      Sequence
-0:445        move second child to first child ( temp 3X3 matrix of float)
-0:445          'r7' ( temp 3X3 matrix of float)
-0:445          matrix-scale ( temp 3X3 matrix of float)
-0:445            'inFM0' ( in 3X3 matrix of float)
-0:445            'inF0' ( in float)
-0:445      Sequence
-0:445        move second child to first child ( temp 3X3 matrix of float)
-0:445          'r8' ( temp 3X3 matrix of float)
-0:445          matrix-multiply ( temp 3X3 matrix of float)
-0:445            'inFM1' ( in 3X3 matrix of float)
-0:445            'inFM0' ( in 3X3 matrix of float)
-0:451  Function Definition: TestGenMul4(f1;f1;vf4;vf4;mf44;mf44; ( temp void)
-0:451    Function Parameters: 
-0:451      'inF0' ( in float)
-0:451      'inF1' ( in float)
-0:451      'inFV0' ( in 4-component vector of float)
-0:451      'inFV1' ( in 4-component vector of float)
-0:451      'inFM0' ( in 4X4 matrix of float)
-0:451      'inFM1' ( in 4X4 matrix of float)
+0:450      Sequence
+0:450        move second child to first child ( temp float)
+0:450          'r0' ( temp float)
+0:450          component-wise multiply ( temp float)
+0:450            'inF1' ( in float)
+0:450            'inF0' ( in float)
+0:450      Sequence
+0:450        move second child to first child ( temp 3-component vector of float)
+0:450          'r1' ( temp 3-component vector of float)
+0:450          vector-scale ( temp 3-component vector of float)
+0:450            'inF0' ( in float)
+0:450            'inFV0' ( in 3-component vector of float)
+0:450      Sequence
+0:450        move second child to first child ( temp 3-component vector of float)
+0:450          'r2' ( temp 3-component vector of float)
+0:450          vector-scale ( temp 3-component vector of float)
+0:450            'inFV0' ( in 3-component vector of float)
+0:450            'inF0' ( in float)
+0:450      Sequence
+0:450        move second child to first child ( temp float)
+0:450          'r3' ( temp float)
+0:450          dot-product ( temp float)
+0:450            'inFV0' ( in 3-component vector of float)
+0:450            'inFV1' ( in 3-component vector of float)
+0:450      Sequence
+0:450        move second child to first child ( temp 3-component vector of float)
+0:450          'r4' ( temp 3-component vector of float)
+0:450          vector-times-matrix ( temp 3-component vector of float)
+0:450            'inFV0' ( in 3-component vector of float)
+0:450            'inFM0' ( in 3X3 matrix of float)
+0:450      Sequence
+0:450        move second child to first child ( temp 3-component vector of float)
+0:450          'r5' ( temp 3-component vector of float)
+0:450          matrix-times-vector ( temp 3-component vector of float)
+0:450            'inFM0' ( in 3X3 matrix of float)
+0:450            'inFV0' ( in 3-component vector of float)
+0:450      Sequence
+0:450        move second child to first child ( temp 3X3 matrix of float)
+0:450          'r6' ( temp 3X3 matrix of float)
+0:450          matrix-scale ( temp 3X3 matrix of float)
+0:450            'inF0' ( in float)
+0:450            'inFM0' ( in 3X3 matrix of float)
+0:450      Sequence
+0:450        move second child to first child ( temp 3X3 matrix of float)
+0:450          'r7' ( temp 3X3 matrix of float)
+0:450          matrix-scale ( temp 3X3 matrix of float)
+0:450            'inFM0' ( in 3X3 matrix of float)
+0:450            'inF0' ( in float)
+0:450      Sequence
+0:450        move second child to first child ( temp 3X3 matrix of float)
+0:450          'r8' ( temp 3X3 matrix of float)
+0:450          matrix-multiply ( temp 3X3 matrix of float)
+0:450            'inFM1' ( in 3X3 matrix of float)
+0:450            'inFM0' ( in 3X3 matrix of float)
+0:456  Function Definition: TestGenMul4(f1;f1;vf4;vf4;mf44;mf44; ( temp void)
+0:456    Function Parameters: 
+0:456      'inF0' ( in float)
+0:456      'inF1' ( in float)
+0:456      'inFV0' ( in 4-component vector of float)
+0:456      'inFV1' ( in 4-component vector of float)
+0:456      'inFM0' ( in 4X4 matrix of float)
+0:456      'inFM1' ( in 4X4 matrix of float)
 0:?     Sequence
-0:452      Sequence
-0:452        move second child to first child ( temp float)
-0:452          'r0' ( temp float)
-0:452          component-wise multiply ( temp float)
-0:452            'inF1' ( in float)
-0:452            'inF0' ( in float)
-0:452      Sequence
-0:452        move second child to first child ( temp 4-component vector of float)
-0:452          'r1' ( temp 4-component vector of float)
-0:452          vector-scale ( temp 4-component vector of float)
-0:452            'inF0' ( in float)
-0:452            'inFV0' ( in 4-component vector of float)
-0:452      Sequence
-0:452        move second child to first child ( temp 4-component vector of float)
-0:452          'r2' ( temp 4-component vector of float)
-0:452          vector-scale ( temp 4-component vector of float)
-0:452            'inFV0' ( in 4-component vector of float)
-0:452            'inF0' ( in float)
-0:452      Sequence
-0:452        move second child to first child ( temp float)
-0:452          'r3' ( temp float)
-0:452          dot-product ( temp float)
-0:452            'inFV0' ( in 4-component vector of float)
-0:452            'inFV1' ( in 4-component vector of float)
-0:452      Sequence
-0:452        move second child to first child ( temp 4-component vector of float)
-0:452          'r4' ( temp 4-component vector of float)
-0:452          vector-times-matrix ( temp 4-component vector of float)
-0:452            'inFV0' ( in 4-component vector of float)
-0:452            'inFM0' ( in 4X4 matrix of float)
-0:452      Sequence
-0:452        move second child to first child ( temp 4-component vector of float)
-0:452          'r5' ( temp 4-component vector of float)
-0:452          matrix-times-vector ( temp 4-component vector of float)
-0:452            'inFM0' ( in 4X4 matrix of float)
-0:452            'inFV0' ( in 4-component vector of float)
-0:452      Sequence
-0:452        move second child to first child ( temp 4X4 matrix of float)
-0:452          'r6' ( temp 4X4 matrix of float)
-0:452          matrix-scale ( temp 4X4 matrix of float)
-0:452            'inF0' ( in float)
-0:452            'inFM0' ( in 4X4 matrix of float)
-0:452      Sequence
-0:452        move second child to first child ( temp 4X4 matrix of float)
-0:452          'r7' ( temp 4X4 matrix of float)
-0:452          matrix-scale ( temp 4X4 matrix of float)
-0:452            'inFM0' ( in 4X4 matrix of float)
-0:452            'inF0' ( in float)
-0:452      Sequence
-0:452        move second child to first child ( temp 4X4 matrix of float)
-0:452          'r8' ( temp 4X4 matrix of float)
-0:452          matrix-multiply ( temp 4X4 matrix of float)
-0:452            'inFM1' ( in 4X4 matrix of float)
-0:452            'inFM0' ( in 4X4 matrix of float)
-0:461  Function Definition: TestGenMulNxM(f1;f1;vf2;vf3;mf23;mf32;mf33;mf34;mf24; ( temp void)
-0:461    Function Parameters: 
-0:461      'inF0' ( in float)
-0:461      'inF1' ( in float)
-0:461      'inFV2' ( in 2-component vector of float)
-0:461      'inFV3' ( in 3-component vector of float)
-0:461      'inFM2x3' ( in 2X3 matrix of float)
-0:461      'inFM3x2' ( in 3X2 matrix of float)
-0:461      'inFM3x3' ( in 3X3 matrix of float)
-0:461      'inFM3x4' ( in 3X4 matrix of float)
-0:461      'inFM2x4' ( in 2X4 matrix of float)
+0:457      Sequence
+0:457        move second child to first child ( temp float)
+0:457          'r0' ( temp float)
+0:457          component-wise multiply ( temp float)
+0:457            'inF1' ( in float)
+0:457            'inF0' ( in float)
+0:457      Sequence
+0:457        move second child to first child ( temp 4-component vector of float)
+0:457          'r1' ( temp 4-component vector of float)
+0:457          vector-scale ( temp 4-component vector of float)
+0:457            'inF0' ( in float)
+0:457            'inFV0' ( in 4-component vector of float)
+0:457      Sequence
+0:457        move second child to first child ( temp 4-component vector of float)
+0:457          'r2' ( temp 4-component vector of float)
+0:457          vector-scale ( temp 4-component vector of float)
+0:457            'inFV0' ( in 4-component vector of float)
+0:457            'inF0' ( in float)
+0:457      Sequence
+0:457        move second child to first child ( temp float)
+0:457          'r3' ( temp float)
+0:457          dot-product ( temp float)
+0:457            'inFV0' ( in 4-component vector of float)
+0:457            'inFV1' ( in 4-component vector of float)
+0:457      Sequence
+0:457        move second child to first child ( temp 4-component vector of float)
+0:457          'r4' ( temp 4-component vector of float)
+0:457          vector-times-matrix ( temp 4-component vector of float)
+0:457            'inFV0' ( in 4-component vector of float)
+0:457            'inFM0' ( in 4X4 matrix of float)
+0:457      Sequence
+0:457        move second child to first child ( temp 4-component vector of float)
+0:457          'r5' ( temp 4-component vector of float)
+0:457          matrix-times-vector ( temp 4-component vector of float)
+0:457            'inFM0' ( in 4X4 matrix of float)
+0:457            'inFV0' ( in 4-component vector of float)
+0:457      Sequence
+0:457        move second child to first child ( temp 4X4 matrix of float)
+0:457          'r6' ( temp 4X4 matrix of float)
+0:457          matrix-scale ( temp 4X4 matrix of float)
+0:457            'inF0' ( in float)
+0:457            'inFM0' ( in 4X4 matrix of float)
+0:457      Sequence
+0:457        move second child to first child ( temp 4X4 matrix of float)
+0:457          'r7' ( temp 4X4 matrix of float)
+0:457          matrix-scale ( temp 4X4 matrix of float)
+0:457            'inFM0' ( in 4X4 matrix of float)
+0:457            'inF0' ( in float)
+0:457      Sequence
+0:457        move second child to first child ( temp 4X4 matrix of float)
+0:457          'r8' ( temp 4X4 matrix of float)
+0:457          matrix-multiply ( temp 4X4 matrix of float)
+0:457            'inFM1' ( in 4X4 matrix of float)
+0:457            'inFM0' ( in 4X4 matrix of float)
+0:466  Function Definition: TestGenMulNxM(f1;f1;vf2;vf3;mf23;mf32;mf33;mf34;mf24; ( temp void)
+0:466    Function Parameters: 
+0:466      'inF0' ( in float)
+0:466      'inF1' ( in float)
+0:466      'inFV2' ( in 2-component vector of float)
+0:466      'inFV3' ( in 3-component vector of float)
+0:466      'inFM2x3' ( in 2X3 matrix of float)
+0:466      'inFM3x2' ( in 3X2 matrix of float)
+0:466      'inFM3x3' ( in 3X3 matrix of float)
+0:466      'inFM3x4' ( in 3X4 matrix of float)
+0:466      'inFM2x4' ( in 2X4 matrix of float)
 0:?     Sequence
-0:462      Sequence
-0:462        move second child to first child ( temp float)
-0:462          'r00' ( temp float)
-0:462          component-wise multiply ( temp float)
-0:462            'inF1' ( in float)
-0:462            'inF0' ( in float)
-0:463      Sequence
-0:463        move second child to first child ( temp 2-component vector of float)
-0:463          'r01' ( temp 2-component vector of float)
-0:463          vector-scale ( temp 2-component vector of float)
-0:463            'inF0' ( in float)
-0:463            'inFV2' ( in 2-component vector of float)
-0:464      Sequence
-0:464        move second child to first child ( temp 3-component vector of float)
-0:464          'r02' ( temp 3-component vector of float)
-0:464          vector-scale ( temp 3-component vector of float)
-0:464            'inF0' ( in float)
-0:464            'inFV3' ( in 3-component vector of float)
-0:465      Sequence
-0:465        move second child to first child ( temp 2-component vector of float)
-0:465          'r03' ( temp 2-component vector of float)
-0:465          vector-scale ( temp 2-component vector of float)
-0:465            'inFV2' ( in 2-component vector of float)
-0:465            'inF0' ( in float)
-0:466      Sequence
-0:466        move second child to first child ( temp 3-component vector of float)
-0:466          'r04' ( temp 3-component vector of float)
-0:466          vector-scale ( temp 3-component vector of float)
-0:466            'inFV3' ( in 3-component vector of float)
-0:466            'inF0' ( in float)
 0:467      Sequence
 0:467        move second child to first child ( temp float)
-0:467          'r05' ( temp float)
-0:467          dot-product ( temp float)
-0:467            'inFV2' ( in 2-component vector of float)
-0:467            'inFV2' ( in 2-component vector of float)
+0:467          'r00' ( temp float)
+0:467          component-wise multiply ( temp float)
+0:467            'inF1' ( in float)
+0:467            'inF0' ( in float)
 0:468      Sequence
-0:468        move second child to first child ( temp float)
-0:468          'r06' ( temp float)
-0:468          dot-product ( temp float)
-0:468            'inFV3' ( in 3-component vector of float)
-0:468            'inFV3' ( in 3-component vector of float)
+0:468        move second child to first child ( temp 2-component vector of float)
+0:468          'r01' ( temp 2-component vector of float)
+0:468          vector-scale ( temp 2-component vector of float)
+0:468            'inF0' ( in float)
+0:468            'inFV2' ( in 2-component vector of float)
 0:469      Sequence
 0:469        move second child to first child ( temp 3-component vector of float)
-0:469          'r07' ( temp 3-component vector of float)
-0:469          matrix-times-vector ( temp 3-component vector of float)
-0:469            'inFM2x3' ( in 2X3 matrix of float)
-0:469            'inFV2' ( in 2-component vector of float)
+0:469          'r02' ( temp 3-component vector of float)
+0:469          vector-scale ( temp 3-component vector of float)
+0:469            'inF0' ( in float)
+0:469            'inFV3' ( in 3-component vector of float)
 0:470      Sequence
 0:470        move second child to first child ( temp 2-component vector of float)
-0:470          'r08' ( temp 2-component vector of float)
-0:470          matrix-times-vector ( temp 2-component vector of float)
-0:470            'inFM3x2' ( in 3X2 matrix of float)
-0:470            'inFV3' ( in 3-component vector of float)
+0:470          'r03' ( temp 2-component vector of float)
+0:470          vector-scale ( temp 2-component vector of float)
+0:470            'inFV2' ( in 2-component vector of float)
+0:470            'inF0' ( in float)
 0:471      Sequence
-0:471        move second child to first child ( temp 2-component vector of float)
-0:471          'r09' ( temp 2-component vector of float)
-0:471          vector-times-matrix ( temp 2-component vector of float)
+0:471        move second child to first child ( temp 3-component vector of float)
+0:471          'r04' ( temp 3-component vector of float)
+0:471          vector-scale ( temp 3-component vector of float)
 0:471            'inFV3' ( in 3-component vector of float)
-0:471            'inFM2x3' ( in 2X3 matrix of float)
+0:471            'inF0' ( in float)
 0:472      Sequence
-0:472        move second child to first child ( temp 3-component vector of float)
-0:472          'r10' ( temp 3-component vector of float)
-0:472          vector-times-matrix ( temp 3-component vector of float)
+0:472        move second child to first child ( temp float)
+0:472          'r05' ( temp float)
+0:472          dot-product ( temp float)
 0:472            'inFV2' ( in 2-component vector of float)
-0:472            'inFM3x2' ( in 3X2 matrix of float)
+0:472            'inFV2' ( in 2-component vector of float)
 0:473      Sequence
-0:473        move second child to first child ( temp 2X3 matrix of float)
-0:473          'r11' ( temp 2X3 matrix of float)
-0:473          matrix-scale ( temp 2X3 matrix of float)
-0:473            'inF0' ( in float)
-0:473            'inFM2x3' ( in 2X3 matrix of float)
+0:473        move second child to first child ( temp float)
+0:473          'r06' ( temp float)
+0:473          dot-product ( temp float)
+0:473            'inFV3' ( in 3-component vector of float)
+0:473            'inFV3' ( in 3-component vector of float)
 0:474      Sequence
-0:474        move second child to first child ( temp 3X2 matrix of float)
-0:474          'r12' ( temp 3X2 matrix of float)
-0:474          matrix-scale ( temp 3X2 matrix of float)
-0:474            'inF0' ( in float)
-0:474            'inFM3x2' ( in 3X2 matrix of float)
+0:474        move second child to first child ( temp 3-component vector of float)
+0:474          'r07' ( temp 3-component vector of float)
+0:474          matrix-times-vector ( temp 3-component vector of float)
+0:474            'inFM2x3' ( in 2X3 matrix of float)
+0:474            'inFV2' ( in 2-component vector of float)
 0:475      Sequence
-0:475        move second child to first child ( temp 2X2 matrix of float)
-0:475          'r13' ( temp 2X2 matrix of float)
-0:475          matrix-multiply ( temp 2X2 matrix of float)
+0:475        move second child to first child ( temp 2-component vector of float)
+0:475          'r08' ( temp 2-component vector of float)
+0:475          matrix-times-vector ( temp 2-component vector of float)
 0:475            'inFM3x2' ( in 3X2 matrix of float)
-0:475            'inFM2x3' ( in 2X3 matrix of float)
+0:475            'inFV3' ( in 3-component vector of float)
 0:476      Sequence
-0:476        move second child to first child ( temp 2X3 matrix of float)
-0:476          'r14' ( temp 2X3 matrix of float)
-0:476          matrix-multiply ( temp 2X3 matrix of float)
-0:476            'inFM3x3' ( in 3X3 matrix of float)
+0:476        move second child to first child ( temp 2-component vector of float)
+0:476          'r09' ( temp 2-component vector of float)
+0:476          vector-times-matrix ( temp 2-component vector of float)
+0:476            'inFV3' ( in 3-component vector of float)
 0:476            'inFM2x3' ( in 2X3 matrix of float)
 0:477      Sequence
-0:477        move second child to first child ( temp 2X4 matrix of float)
-0:477          'r15' ( temp 2X4 matrix of float)
-0:477          matrix-multiply ( temp 2X4 matrix of float)
-0:477            'inFM3x4' ( in 3X4 matrix of float)
-0:477            'inFM2x3' ( in 2X3 matrix of float)
+0:477        move second child to first child ( temp 3-component vector of float)
+0:477          'r10' ( temp 3-component vector of float)
+0:477          vector-times-matrix ( temp 3-component vector of float)
+0:477            'inFV2' ( in 2-component vector of float)
+0:477            'inFM3x2' ( in 3X2 matrix of float)
 0:478      Sequence
-0:478        move second child to first child ( temp 3X4 matrix of float)
-0:478          'r16' ( temp 3X4 matrix of float)
-0:478          matrix-multiply ( temp 3X4 matrix of float)
-0:478            'inFM2x4' ( in 2X4 matrix of float)
-0:478            'inFM3x2' ( in 3X2 matrix of float)
-0:484  Function Definition: @main( ( temp structure{ temp 4-component vector of float color})
-0:484    Function Parameters: 
+0:478        move second child to first child ( temp 2X3 matrix of float)
+0:478          'r11' ( temp 2X3 matrix of float)
+0:478          matrix-scale ( temp 2X3 matrix of float)
+0:478            'inF0' ( in float)
+0:478            'inFM2x3' ( in 2X3 matrix of float)
+0:479      Sequence
+0:479        move second child to first child ( temp 3X2 matrix of float)
+0:479          'r12' ( temp 3X2 matrix of float)
+0:479          matrix-scale ( temp 3X2 matrix of float)
+0:479            'inF0' ( in float)
+0:479            'inFM3x2' ( in 3X2 matrix of float)
+0:480      Sequence
+0:480        move second child to first child ( temp 2X2 matrix of float)
+0:480          'r13' ( temp 2X2 matrix of float)
+0:480          matrix-multiply ( temp 2X2 matrix of float)
+0:480            'inFM3x2' ( in 3X2 matrix of float)
+0:480            'inFM2x3' ( in 2X3 matrix of float)
+0:481      Sequence
+0:481        move second child to first child ( temp 2X3 matrix of float)
+0:481          'r14' ( temp 2X3 matrix of float)
+0:481          matrix-multiply ( temp 2X3 matrix of float)
+0:481            'inFM3x3' ( in 3X3 matrix of float)
+0:481            'inFM2x3' ( in 2X3 matrix of float)
+0:482      Sequence
+0:482        move second child to first child ( temp 2X4 matrix of float)
+0:482          'r15' ( temp 2X4 matrix of float)
+0:482          matrix-multiply ( temp 2X4 matrix of float)
+0:482            'inFM3x4' ( in 3X4 matrix of float)
+0:482            'inFM2x3' ( in 2X3 matrix of float)
+0:483      Sequence
+0:483        move second child to first child ( temp 3X4 matrix of float)
+0:483          'r16' ( temp 3X4 matrix of float)
+0:483          matrix-multiply ( temp 3X4 matrix of float)
+0:483            'inFM2x4' ( in 2X4 matrix of float)
+0:483            'inFM3x2' ( in 3X2 matrix of float)
+0:489  Function Definition: @main( ( temp structure{ temp 4-component vector of float color})
+0:489    Function Parameters: 
 0:?     Sequence
-0:486      move second child to first child ( temp 4-component vector of float)
-0:486        color: direct index for structure ( temp 4-component vector of float)
-0:486          'ps_output' ( temp structure{ temp 4-component vector of float color})
-0:486          Constant:
-0:486            0 (const int)
-0:486        Constant:
-0:486          1.000000
-0:486          1.000000
-0:486          1.000000
-0:486          1.000000
-0:487      Branch: Return with expression
-0:487        'ps_output' ( temp structure{ temp 4-component vector of float color})
-0:484  Function Definition: main( ( temp void)
-0:484    Function Parameters: 
+0:491      move second child to first child ( temp 4-component vector of float)
+0:491        color: direct index for structure ( temp 4-component vector of float)
+0:491          'ps_output' ( temp structure{ temp 4-component vector of float color})
+0:491          Constant:
+0:491            0 (const int)
+0:491        Constant:
+0:491          1.000000
+0:491          1.000000
+0:491          1.000000
+0:491          1.000000
+0:492      Branch: Return with expression
+0:492        'ps_output' ( temp structure{ temp 4-component vector of float color})
+0:489  Function Definition: main( ( temp void)
+0:489    Function Parameters: 
 0:?     Sequence
-0:484      Sequence
-0:484        move second child to first child ( temp 4-component vector of float)
-0:?           'color' (layout( location=0) out 4-component vector of float)
-0:484          color: direct index for structure ( temp 4-component vector of float)
-0:484            Function Call: @main( ( temp structure{ temp 4-component vector of float color})
-0:484            Constant:
-0:484              0 (const int)
+0:489      Sequence
+0:489        move second child to first child ( temp 4-component vector of float)
+0:?           '@entryPointOutput.color' (layout( location=0) out 4-component vector of float)
+0:489          color: direct index for structure ( temp 4-component vector of float)
+0:489            Function Call: @main( ( temp structure{ temp 4-component vector of float color})
+0:489            Constant:
+0:489              0 (const int)
 0:?   Linker Objects
 0:?     'gs_ua' ( shared uint)
 0:?     'gs_ub' ( shared uint)
@@ -2756,7 +2817,7 @@
 0:?     'gs_ua4' ( shared 4-component vector of uint)
 0:?     'gs_ub4' ( shared 4-component vector of uint)
 0:?     'gs_uc4' ( shared 4-component vector of uint)
-0:?     'color' (layout( location=0) out 4-component vector of float)
+0:?     '@entryPointOutput.color' (layout( location=0) out 4-component vector of float)
 
 
 Linked fragment stage:
@@ -2765,19 +2826,20 @@
 Shader version: 500
 gl_FragCoord origin is upper left
 0:? Sequence
-0:17  Function Definition: PixelShaderFunctionS(f1;f1;f1;u1;u1; ( temp float)
+0:17  Function Definition: PixelShaderFunctionS(f1;f1;f1;u1;i1; ( temp float)
 0:17    Function Parameters: 
 0:17      'inF0' ( in float)
 0:17      'inF1' ( in float)
 0:17      'inF2' ( in float)
 0:17      'inU0' ( in uint)
-0:17      'inU1' ( in uint)
+0:17      'inU1' ( in int)
 0:?     Sequence
 0:20      Sequence
 0:20        move second child to first child ( temp bool)
 0:20          'r000' ( temp bool)
 0:20          all ( temp bool)
-0:20            'inF0' ( in float)
+0:20            Convert float to bool ( temp bool)
+0:20              'inF0' ( in float)
 0:21      Sequence
 0:21        move second child to first child ( temp float)
 0:21          'r001' ( temp float)
@@ -2792,7 +2854,8 @@
 0:23        move second child to first child ( temp bool)
 0:23          'r003' ( temp bool)
 0:23          any ( temp bool)
-0:23            'inF0' ( in float)
+0:23            Convert float to bool ( temp bool)
+0:23              'inF0' ( in float)
 0:24      Sequence
 0:24        move second child to first child ( temp float)
 0:24          'r004' ( temp float)
@@ -2807,7 +2870,7 @@
 0:26        move second child to first child ( temp uint)
 0:26          'r006' ( temp uint)
 0:26          floatBitsToUint ( temp uint)
-0:26            'inF0' ( in float)
+0:26            'inU1' ( in int)
 0:27      Sequence
 0:27        move second child to first child ( temp float)
 0:27          'r007' ( temp float)
@@ -2844,2024 +2907,2081 @@
 0:33            0.000000
 0:33        true case
 0:33        Branch: Kill
-0:34      Sequence
-0:34        move second child to first child ( temp float)
-0:34          'r014' ( temp float)
-0:34          cosine ( temp float)
-0:34            'inF0' ( in float)
+0:34      Test condition and select ( temp void)
+0:34        Condition
+0:34        Compare Less Than ( temp bool)
+0:34          'r005' ( temp int)
+0:34          Constant:
+0:34            0 (const int)
+0:34        true case
+0:34        Branch: Kill
 0:35      Sequence
 0:35        move second child to first child ( temp float)
-0:35          'r015' ( temp float)
-0:35          hyp. cosine ( temp float)
+0:35          'r014' ( temp float)
+0:35          cosine ( temp float)
 0:35            'inF0' ( in float)
 0:36      Sequence
-0:36        move second child to first child ( temp int)
-0:36          'r016' ( temp int)
-0:36          bitCount ( temp int)
-0:36            Constant:
-0:36              7 (const int)
+0:36        move second child to first child ( temp float)
+0:36          'r015' ( temp float)
+0:36          hyp. cosine ( temp float)
+0:36            'inF0' ( in float)
 0:37      Sequence
-0:37        move second child to first child ( temp float)
-0:37          'r017' ( temp float)
-0:37          dPdx ( temp float)
-0:37            'inF0' ( in float)
+0:37        move second child to first child ( temp int)
+0:37          'r016' ( temp int)
+0:37          bitCount ( temp int)
+0:37            Constant:
+0:37              7 (const int)
 0:38      Sequence
 0:38        move second child to first child ( temp float)
-0:38          'r018' ( temp float)
-0:38          dPdxCoarse ( temp float)
+0:38          'r017' ( temp float)
+0:38          dPdx ( temp float)
 0:38            'inF0' ( in float)
 0:39      Sequence
 0:39        move second child to first child ( temp float)
-0:39          'r019' ( temp float)
-0:39          dPdxFine ( temp float)
+0:39          'r018' ( temp float)
+0:39          dPdxCoarse ( temp float)
 0:39            'inF0' ( in float)
 0:40      Sequence
 0:40        move second child to first child ( temp float)
-0:40          'r020' ( temp float)
-0:40          dPdy ( temp float)
+0:40          'r019' ( temp float)
+0:40          dPdxFine ( temp float)
 0:40            'inF0' ( in float)
 0:41      Sequence
 0:41        move second child to first child ( temp float)
-0:41          'r021' ( temp float)
-0:41          dPdyCoarse ( temp float)
+0:41          'r020' ( temp float)
+0:41          dPdy ( temp float)
 0:41            'inF0' ( in float)
 0:42      Sequence
 0:42        move second child to first child ( temp float)
-0:42          'r022' ( temp float)
-0:42          dPdyFine ( temp float)
+0:42          'r021' ( temp float)
+0:42          dPdyCoarse ( temp float)
 0:42            'inF0' ( in float)
 0:43      Sequence
 0:43        move second child to first child ( temp float)
-0:43          'r023' ( temp float)
-0:43          degrees ( temp float)
+0:43          'r022' ( temp float)
+0:43          dPdyFine ( temp float)
 0:43            'inF0' ( in float)
-0:47      Sequence
-0:47        move second child to first child ( temp float)
-0:47          'r027' ( temp float)
-0:47          exp ( temp float)
-0:47            'inF0' ( in float)
-0:48      Sequence
-0:48        move second child to first child ( temp float)
-0:48          'r028' ( temp float)
-0:48          exp2 ( temp float)
-0:48            'inF0' ( in float)
+0:44      Sequence
+0:44        move second child to first child ( temp float)
+0:44          'r023' ( temp float)
+0:44          degrees ( temp float)
+0:44            'inF0' ( in float)
+0:45      Sequence
+0:45        move second child to first child ( temp float)
+0:45          'r024' ( temp float)
+0:45          distance ( temp float)
+0:45            'inF0' ( in float)
+0:45            'inF1' ( in float)
 0:49      Sequence
-0:49        move second child to first child ( temp uint)
-0:49          'r029' ( temp uint)
-0:49          Convert int to uint ( temp uint)
-0:49            findMSB ( temp int)
-0:49              Constant:
-0:49                7 (const int)
+0:49        move second child to first child ( temp float)
+0:49          'r027' ( temp float)
+0:49          exp ( temp float)
+0:49            'inF0' ( in float)
 0:50      Sequence
-0:50        move second child to first child ( temp uint)
-0:50          'r030' ( temp uint)
-0:50          Convert int to uint ( temp uint)
-0:50            findLSB ( temp int)
-0:50              Constant:
-0:50                7 (const int)
+0:50        move second child to first child ( temp float)
+0:50          'r028' ( temp float)
+0:50          exp2 ( temp float)
+0:50            'inF0' ( in float)
 0:51      Sequence
-0:51        move second child to first child ( temp float)
-0:51          'r031' ( temp float)
-0:51          Floor ( temp float)
-0:51            'inF0' ( in float)
+0:51        move second child to first child ( temp uint)
+0:51          'r029' ( temp uint)
+0:51          Convert int to uint ( temp uint)
+0:51            findMSB ( temp int)
+0:51              Constant:
+0:51                7 (const int)
+0:52      Sequence
+0:52        move second child to first child ( temp uint)
+0:52          'r030' ( temp uint)
+0:52          Convert int to uint ( temp uint)
+0:52            findLSB ( temp int)
+0:52              Constant:
+0:52                7 (const int)
 0:53      Sequence
 0:53        move second child to first child ( temp float)
-0:53          'r033' ( temp float)
-0:53          mod ( temp float)
+0:53          'r031' ( temp float)
+0:53          Floor ( temp float)
 0:53            'inF0' ( in float)
-0:53            'inF1' ( in float)
-0:54      Sequence
-0:54        move second child to first child ( temp float)
-0:54          'r034' ( temp float)
-0:54          Fraction ( temp float)
-0:54            'inF0' ( in float)
 0:55      Sequence
 0:55        move second child to first child ( temp float)
-0:55          'r036' ( temp float)
-0:55          fwidth ( temp float)
+0:55          'r033' ( temp float)
+0:55          mod ( temp float)
 0:55            'inF0' ( in float)
+0:55            'inF1' ( in float)
 0:56      Sequence
-0:56        move second child to first child ( temp bool)
-0:56          'r037' ( temp bool)
-0:56          isinf ( temp bool)
+0:56        move second child to first child ( temp float)
+0:56          'r034' ( temp float)
+0:56          Fraction ( temp float)
 0:56            'inF0' ( in float)
 0:57      Sequence
-0:57        move second child to first child ( temp bool)
-0:57          'r038' ( temp bool)
-0:57          isnan ( temp bool)
+0:57        move second child to first child ( temp float)
+0:57          'r036' ( temp float)
+0:57          fwidth ( temp float)
 0:57            'inF0' ( in float)
 0:58      Sequence
-0:58        move second child to first child ( temp float)
-0:58          'r039' ( temp float)
-0:58          ldexp ( temp float)
+0:58        move second child to first child ( temp bool)
+0:58          'r037' ( temp bool)
+0:58          isinf ( temp bool)
 0:58            'inF0' ( in float)
-0:58            'inF1' ( in float)
 0:59      Sequence
-0:59        move second child to first child ( temp float)
-0:59          'r039a' ( temp float)
-0:59          mix ( temp float)
+0:59        move second child to first child ( temp bool)
+0:59          'r038' ( temp bool)
+0:59          isnan ( temp bool)
 0:59            'inF0' ( in float)
-0:59            'inF1' ( in float)
-0:59            'inF2' ( in float)
 0:60      Sequence
 0:60        move second child to first child ( temp float)
-0:60          'r040' ( temp float)
-0:60          log ( temp float)
+0:60          'r039' ( temp float)
+0:60          ldexp ( temp float)
 0:60            'inF0' ( in float)
+0:60            'inF1' ( in float)
 0:61      Sequence
 0:61        move second child to first child ( temp float)
-0:61          'r041' ( temp float)
-0:61          component-wise multiply ( temp float)
-0:61            log2 ( temp float)
-0:61              'inF0' ( in float)
-0:61            Constant:
-0:61              0.301030
+0:61          'r039a' ( temp float)
+0:61          mix ( temp float)
+0:61            'inF0' ( in float)
+0:61            'inF1' ( in float)
+0:61            'inF2' ( in float)
 0:62      Sequence
 0:62        move second child to first child ( temp float)
-0:62          'r042' ( temp float)
-0:62          log2 ( temp float)
+0:62          'r040' ( temp float)
+0:62          log ( temp float)
 0:62            'inF0' ( in float)
 0:63      Sequence
 0:63        move second child to first child ( temp float)
-0:63          'r043' ( temp float)
-0:63          max ( temp float)
-0:63            'inF0' ( in float)
-0:63            'inF1' ( in float)
+0:63          'r041' ( temp float)
+0:63          component-wise multiply ( temp float)
+0:63            log2 ( temp float)
+0:63              'inF0' ( in float)
+0:63            Constant:
+0:63              0.301030
 0:64      Sequence
 0:64        move second child to first child ( temp float)
-0:64          'r044' ( temp float)
-0:64          min ( temp float)
+0:64          'r042' ( temp float)
+0:64          log2 ( temp float)
 0:64            'inF0' ( in float)
-0:64            'inF1' ( in float)
 0:65      Sequence
 0:65        move second child to first child ( temp float)
-0:65          'r045' ( temp float)
-0:65          pow ( temp float)
+0:65          'r043' ( temp float)
+0:65          max ( temp float)
 0:65            'inF0' ( in float)
 0:65            'inF1' ( in float)
 0:66      Sequence
 0:66        move second child to first child ( temp float)
-0:66          'r046' ( temp float)
-0:66          radians ( temp float)
+0:66          'r044' ( temp float)
+0:66          min ( temp float)
 0:66            'inF0' ( in float)
+0:66            'inF1' ( in float)
 0:67      Sequence
 0:67        move second child to first child ( temp float)
-0:67          'r047' ( temp float)
-0:67          divide ( temp float)
-0:67            Constant:
-0:67              1.000000
+0:67          'r045' ( temp float)
+0:67          pow ( temp float)
 0:67            'inF0' ( in float)
+0:67            'inF1' ( in float)
 0:68      Sequence
-0:68        move second child to first child ( temp uint)
-0:68          'r048' ( temp uint)
-0:68          Convert int to uint ( temp uint)
-0:68            bitFieldReverse ( temp int)
-0:68              Constant:
-0:68                2 (const int)
+0:68        move second child to first child ( temp float)
+0:68          'r046' ( temp float)
+0:68          radians ( temp float)
+0:68            'inF0' ( in float)
 0:69      Sequence
 0:69        move second child to first child ( temp float)
-0:69          'r049' ( temp float)
-0:69          roundEven ( temp float)
+0:69          'r047' ( temp float)
+0:69          divide ( temp float)
+0:69            Constant:
+0:69              1.000000
 0:69            'inF0' ( in float)
 0:70      Sequence
-0:70        move second child to first child ( temp float)
-0:70          'r050' ( temp float)
-0:70          inverse sqrt ( temp float)
-0:70            'inF0' ( in float)
+0:70        move second child to first child ( temp uint)
+0:70          'r048' ( temp uint)
+0:70          Convert int to uint ( temp uint)
+0:70            bitFieldReverse ( temp int)
+0:70              Constant:
+0:70                2 (const int)
 0:71      Sequence
 0:71        move second child to first child ( temp float)
-0:71          'r051' ( temp float)
-0:71          clamp ( temp float)
+0:71          'r049' ( temp float)
+0:71          roundEven ( temp float)
 0:71            'inF0' ( in float)
-0:71            Constant:
-0:71              0.000000
-0:71            Constant:
-0:71              1.000000
 0:72      Sequence
 0:72        move second child to first child ( temp float)
-0:72          'r052' ( temp float)
-0:72          Sign ( temp float)
+0:72          'r050' ( temp float)
+0:72          inverse sqrt ( temp float)
 0:72            'inF0' ( in float)
 0:73      Sequence
 0:73        move second child to first child ( temp float)
-0:73          'r053' ( temp float)
-0:73          sine ( temp float)
+0:73          'r051' ( temp float)
+0:73          clamp ( temp float)
 0:73            'inF0' ( in float)
+0:73            Constant:
+0:73              0.000000
+0:73            Constant:
+0:73              1.000000
 0:74      Sequence
 0:74        move second child to first child ( temp float)
-0:74          'inF1' ( in float)
-0:74          sine ( temp float)
-0:74            'inF0' ( in float)
-0:74        move second child to first child ( temp float)
-0:74          'inF2' ( in float)
-0:74          cosine ( temp float)
+0:74          'r052' ( temp float)
+0:74          Sign ( temp float)
 0:74            'inF0' ( in float)
 0:75      Sequence
 0:75        move second child to first child ( temp float)
-0:75          'r055' ( temp float)
-0:75          hyp. sine ( temp float)
+0:75          'r053' ( temp float)
+0:75          sine ( temp float)
 0:75            'inF0' ( in float)
 0:76      Sequence
 0:76        move second child to first child ( temp float)
-0:76          'r056' ( temp float)
-0:76          smoothstep ( temp float)
+0:76          'inF1' ( in float)
+0:76          sine ( temp float)
 0:76            'inF0' ( in float)
-0:76            'inF1' ( in float)
-0:76            'inF2' ( in float)
+0:76        move second child to first child ( temp float)
+0:76          'inF2' ( in float)
+0:76          cosine ( temp float)
+0:76            'inF0' ( in float)
 0:77      Sequence
 0:77        move second child to first child ( temp float)
-0:77          'r057' ( temp float)
-0:77          sqrt ( temp float)
+0:77          'r055' ( temp float)
+0:77          hyp. sine ( temp float)
 0:77            'inF0' ( in float)
 0:78      Sequence
 0:78        move second child to first child ( temp float)
-0:78          'r058' ( temp float)
-0:78          step ( temp float)
+0:78          'r056' ( temp float)
+0:78          smoothstep ( temp float)
 0:78            'inF0' ( in float)
 0:78            'inF1' ( in float)
+0:78            'inF2' ( in float)
 0:79      Sequence
 0:79        move second child to first child ( temp float)
-0:79          'r059' ( temp float)
-0:79          tangent ( temp float)
+0:79          'r057' ( temp float)
+0:79          sqrt ( temp float)
 0:79            'inF0' ( in float)
 0:80      Sequence
 0:80        move second child to first child ( temp float)
-0:80          'r060' ( temp float)
-0:80          hyp. tangent ( temp float)
+0:80          'r058' ( temp float)
+0:80          step ( temp float)
 0:80            'inF0' ( in float)
+0:80            'inF1' ( in float)
+0:81      Sequence
+0:81        move second child to first child ( temp float)
+0:81          'r059' ( temp float)
+0:81          tangent ( temp float)
+0:81            'inF0' ( in float)
 0:82      Sequence
 0:82        move second child to first child ( temp float)
-0:82          'r061' ( temp float)
-0:82          trunc ( temp float)
+0:82          'r060' ( temp float)
+0:82          hyp. tangent ( temp float)
 0:82            'inF0' ( in float)
-0:84      Branch: Return with expression
-0:84        Constant:
-0:84          0.000000
-0:88  Function Definition: PixelShaderFunction1(vf1;vf1;vf1; ( temp 1-component vector of float)
-0:88    Function Parameters: 
-0:88      'inF0' ( in 1-component vector of float)
-0:88      'inF1' ( in 1-component vector of float)
-0:88      'inF2' ( in 1-component vector of float)
+0:84      Sequence
+0:84        move second child to first child ( temp float)
+0:84          'r061' ( temp float)
+0:84          trunc ( temp float)
+0:84            'inF0' ( in float)
+0:86      Branch: Return with expression
+0:86        Constant:
+0:86          0.000000
+0:90  Function Definition: PixelShaderFunction1(vf1;vf1;vf1; ( temp 1-component vector of float)
+0:90    Function Parameters: 
+0:90      'inF0' ( in 1-component vector of float)
+0:90      'inF1' ( in 1-component vector of float)
+0:90      'inF2' ( in 1-component vector of float)
 0:?     Sequence
-0:90      Branch: Return with expression
-0:90        Constant:
-0:90          0.000000
-0:94  Function Definition: PixelShaderFunction2(vf2;vf2;vf2;vu2;vu2; ( temp 2-component vector of float)
-0:94    Function Parameters: 
-0:94      'inF0' ( in 2-component vector of float)
-0:94      'inF1' ( in 2-component vector of float)
-0:94      'inF2' ( in 2-component vector of float)
-0:94      'inU0' ( in 2-component vector of uint)
-0:94      'inU1' ( in 2-component vector of uint)
+0:92      Branch: Return with expression
+0:92        Constant:
+0:92          0.000000
+0:96  Function Definition: PixelShaderFunction2(vf2;vf2;vf2;vu2;vu2; ( temp 2-component vector of float)
+0:96    Function Parameters: 
+0:96      'inF0' ( in 2-component vector of float)
+0:96      'inF1' ( in 2-component vector of float)
+0:96      'inF2' ( in 2-component vector of float)
+0:96      'inU0' ( in 2-component vector of uint)
+0:96      'inU1' ( in 2-component vector of uint)
 0:?     Sequence
-0:97      Sequence
-0:97        move second child to first child ( temp bool)
-0:97          'r000' ( temp bool)
-0:97          all ( temp bool)
-0:97            'inF0' ( in 2-component vector of float)
-0:98      Sequence
-0:98        move second child to first child ( temp 2-component vector of float)
-0:98          'r001' ( temp 2-component vector of float)
-0:98          Absolute value ( temp 2-component vector of float)
-0:98            'inF0' ( in 2-component vector of float)
 0:99      Sequence
-0:99        move second child to first child ( temp 2-component vector of float)
-0:99          'r002' ( temp 2-component vector of float)
-0:99          arc cosine ( temp 2-component vector of float)
-0:99            'inF0' ( in 2-component vector of float)
+0:99        move second child to first child ( temp bool)
+0:99          'r000' ( temp bool)
+0:99          all ( temp bool)
+0:99            Convert float to bool ( temp 2-component vector of bool)
+0:99              'inF0' ( in 2-component vector of float)
 0:100      Sequence
-0:100        move second child to first child ( temp bool)
-0:100          'r003' ( temp bool)
-0:100          any ( temp bool)
+0:100        move second child to first child ( temp 2-component vector of float)
+0:100          'r001' ( temp 2-component vector of float)
+0:100          Absolute value ( temp 2-component vector of float)
 0:100            'inF0' ( in 2-component vector of float)
 0:101      Sequence
 0:101        move second child to first child ( temp 2-component vector of float)
-0:101          'r004' ( temp 2-component vector of float)
-0:101          arc sine ( temp 2-component vector of float)
+0:101          'r002' ( temp 2-component vector of float)
+0:101          arc cosine ( temp 2-component vector of float)
 0:101            'inF0' ( in 2-component vector of float)
 0:102      Sequence
-0:102        move second child to first child ( temp 2-component vector of int)
-0:102          'r005' ( temp 2-component vector of int)
-0:102          floatBitsToInt ( temp 2-component vector of int)
-0:102            'inF0' ( in 2-component vector of float)
+0:102        move second child to first child ( temp bool)
+0:102          'r003' ( temp bool)
+0:102          any ( temp bool)
+0:102            Convert float to bool ( temp 2-component vector of bool)
+0:102              'inF0' ( in 2-component vector of float)
 0:103      Sequence
-0:103        move second child to first child ( temp 2-component vector of uint)
-0:103          'r006' ( temp 2-component vector of uint)
-0:103          floatBitsToUint ( temp 2-component vector of uint)
+0:103        move second child to first child ( temp 2-component vector of float)
+0:103          'r004' ( temp 2-component vector of float)
+0:103          arc sine ( temp 2-component vector of float)
 0:103            'inF0' ( in 2-component vector of float)
 0:104      Sequence
-0:104        move second child to first child ( temp 2-component vector of float)
-0:104          'r007' ( temp 2-component vector of float)
-0:104          intBitsToFloat ( temp 2-component vector of float)
-0:104            'inU0' ( in 2-component vector of uint)
+0:104        move second child to first child ( temp 2-component vector of int)
+0:104          'r005' ( temp 2-component vector of int)
+0:104          floatBitsToInt ( temp 2-component vector of int)
+0:104            'inF0' ( in 2-component vector of float)
+0:105      Sequence
+0:105        move second child to first child ( temp 2-component vector of uint)
+0:105          'r006' ( temp 2-component vector of uint)
+0:105          floatBitsToUint ( temp 2-component vector of uint)
+0:105            'inF0' ( in 2-component vector of float)
 0:106      Sequence
 0:106        move second child to first child ( temp 2-component vector of float)
-0:106          'r009' ( temp 2-component vector of float)
-0:106          arc tangent ( temp 2-component vector of float)
-0:106            'inF0' ( in 2-component vector of float)
-0:107      Sequence
-0:107        move second child to first child ( temp 2-component vector of float)
-0:107          'r010' ( temp 2-component vector of float)
-0:107          arc tangent ( temp 2-component vector of float)
-0:107            'inF0' ( in 2-component vector of float)
-0:107            'inF1' ( in 2-component vector of float)
+0:106          'r007' ( temp 2-component vector of float)
+0:106          intBitsToFloat ( temp 2-component vector of float)
+0:106            'inU0' ( in 2-component vector of uint)
 0:108      Sequence
 0:108        move second child to first child ( temp 2-component vector of float)
-0:108          'r011' ( temp 2-component vector of float)
-0:108          Ceiling ( temp 2-component vector of float)
+0:108          'r009' ( temp 2-component vector of float)
+0:108          arc tangent ( temp 2-component vector of float)
 0:108            'inF0' ( in 2-component vector of float)
 0:109      Sequence
 0:109        move second child to first child ( temp 2-component vector of float)
-0:109          'r012' ( temp 2-component vector of float)
-0:109          clamp ( temp 2-component vector of float)
+0:109          'r010' ( temp 2-component vector of float)
+0:109          arc tangent ( temp 2-component vector of float)
 0:109            'inF0' ( in 2-component vector of float)
 0:109            'inF1' ( in 2-component vector of float)
-0:109            'inF2' ( in 2-component vector of float)
-0:110      Test condition and select ( temp void)
-0:110        Condition
-0:110        any ( temp bool)
-0:110          Compare Less Than ( temp 2-component vector of bool)
+0:110      Sequence
+0:110        move second child to first child ( temp 2-component vector of float)
+0:110          'r011' ( temp 2-component vector of float)
+0:110          Ceiling ( temp 2-component vector of float)
 0:110            'inF0' ( in 2-component vector of float)
-0:110            Constant:
-0:110              0.000000
-0:110              0.000000
-0:110        true case
-0:110        Branch: Kill
 0:111      Sequence
 0:111        move second child to first child ( temp 2-component vector of float)
-0:111          'r013' ( temp 2-component vector of float)
-0:111          cosine ( temp 2-component vector of float)
+0:111          'r012' ( temp 2-component vector of float)
+0:111          clamp ( temp 2-component vector of float)
 0:111            'inF0' ( in 2-component vector of float)
-0:112      Sequence
-0:112        move second child to first child ( temp 2-component vector of float)
-0:112          'r015' ( temp 2-component vector of float)
-0:112          hyp. cosine ( temp 2-component vector of float)
+0:111            'inF1' ( in 2-component vector of float)
+0:111            'inF2' ( in 2-component vector of float)
+0:112      Test condition and select ( temp void)
+0:112        Condition
+0:112        any ( temp bool)
+0:112          Compare Less Than ( temp 2-component vector of bool)
 0:112            'inF0' ( in 2-component vector of float)
-0:113      Sequence
-0:113        move second child to first child ( temp 2-component vector of int)
-0:113          'r016' ( temp 2-component vector of int)
+0:112            Constant:
+0:112              0.000000
+0:112              0.000000
+0:112        true case
+0:112        Branch: Kill
+0:113      Test condition and select ( temp void)
+0:113        Condition
+0:113        any ( temp bool)
+0:113          Compare Less Than ( temp 2-component vector of bool)
+0:113            'inU0' ( in 2-component vector of uint)
+0:113            Constant:
+0:113              0.000000
+0:113              0.000000
+0:113        true case
+0:113        Branch: Kill
+0:114      Sequence
+0:114        move second child to first child ( temp 2-component vector of float)
+0:114          'r013' ( temp 2-component vector of float)
+0:114          cosine ( temp 2-component vector of float)
+0:114            'inF0' ( in 2-component vector of float)
+0:115      Sequence
+0:115        move second child to first child ( temp 2-component vector of float)
+0:115          'r015' ( temp 2-component vector of float)
+0:115          hyp. cosine ( temp 2-component vector of float)
+0:115            'inF0' ( in 2-component vector of float)
+0:116      Sequence
+0:116        move second child to first child ( temp 2-component vector of int)
+0:116          'r016' ( temp 2-component vector of int)
 0:?           bitCount ( temp 2-component vector of int)
 0:?             Constant:
 0:?               7 (const int)
 0:?               3 (const int)
-0:114      Sequence
-0:114        move second child to first child ( temp 2-component vector of float)
-0:114          'r017' ( temp 2-component vector of float)
-0:114          dPdx ( temp 2-component vector of float)
-0:114            'inF0' ( in 2-component vector of float)
-0:115      Sequence
-0:115        move second child to first child ( temp 2-component vector of float)
-0:115          'r018' ( temp 2-component vector of float)
-0:115          dPdxCoarse ( temp 2-component vector of float)
-0:115            'inF0' ( in 2-component vector of float)
-0:116      Sequence
-0:116        move second child to first child ( temp 2-component vector of float)
-0:116          'r019' ( temp 2-component vector of float)
-0:116          dPdxFine ( temp 2-component vector of float)
-0:116            'inF0' ( in 2-component vector of float)
 0:117      Sequence
 0:117        move second child to first child ( temp 2-component vector of float)
-0:117          'r020' ( temp 2-component vector of float)
-0:117          dPdy ( temp 2-component vector of float)
+0:117          'r017' ( temp 2-component vector of float)
+0:117          dPdx ( temp 2-component vector of float)
 0:117            'inF0' ( in 2-component vector of float)
 0:118      Sequence
 0:118        move second child to first child ( temp 2-component vector of float)
-0:118          'r021' ( temp 2-component vector of float)
-0:118          dPdyCoarse ( temp 2-component vector of float)
+0:118          'r018' ( temp 2-component vector of float)
+0:118          dPdxCoarse ( temp 2-component vector of float)
 0:118            'inF0' ( in 2-component vector of float)
 0:119      Sequence
 0:119        move second child to first child ( temp 2-component vector of float)
-0:119          'r022' ( temp 2-component vector of float)
-0:119          dPdyFine ( temp 2-component vector of float)
+0:119          'r019' ( temp 2-component vector of float)
+0:119          dPdxFine ( temp 2-component vector of float)
 0:119            'inF0' ( in 2-component vector of float)
 0:120      Sequence
 0:120        move second child to first child ( temp 2-component vector of float)
-0:120          'r023' ( temp 2-component vector of float)
-0:120          degrees ( temp 2-component vector of float)
+0:120          'r020' ( temp 2-component vector of float)
+0:120          dPdy ( temp 2-component vector of float)
 0:120            'inF0' ( in 2-component vector of float)
-0:124      Sequence
-0:124        move second child to first child ( temp float)
-0:124          'r026' ( temp float)
-0:124          distance ( temp float)
-0:124            'inF0' ( in 2-component vector of float)
-0:124            'inF1' ( in 2-component vector of float)
-0:125      Sequence
-0:125        move second child to first child ( temp float)
-0:125          'r027' ( temp float)
-0:125          dot-product ( temp float)
-0:125            'inF0' ( in 2-component vector of float)
-0:125            'inF1' ( in 2-component vector of float)
-0:129      Sequence
-0:129        move second child to first child ( temp 2-component vector of float)
-0:129          'r028' ( temp 2-component vector of float)
-0:129          exp ( temp 2-component vector of float)
-0:129            'inF0' ( in 2-component vector of float)
-0:130      Sequence
-0:130        move second child to first child ( temp 2-component vector of float)
-0:130          'r029' ( temp 2-component vector of float)
-0:130          exp2 ( temp 2-component vector of float)
-0:130            'inF0' ( in 2-component vector of float)
-0:131      Sequence
-0:131        move second child to first child ( temp 2-component vector of float)
-0:131          'r030' ( temp 2-component vector of float)
-0:131          face-forward ( temp 2-component vector of float)
-0:131            'inF0' ( in 2-component vector of float)
-0:131            'inF1' ( in 2-component vector of float)
-0:131            'inF2' ( in 2-component vector of float)
+0:121      Sequence
+0:121        move second child to first child ( temp 2-component vector of float)
+0:121          'r021' ( temp 2-component vector of float)
+0:121          dPdyCoarse ( temp 2-component vector of float)
+0:121            'inF0' ( in 2-component vector of float)
+0:122      Sequence
+0:122        move second child to first child ( temp 2-component vector of float)
+0:122          'r022' ( temp 2-component vector of float)
+0:122          dPdyFine ( temp 2-component vector of float)
+0:122            'inF0' ( in 2-component vector of float)
+0:123      Sequence
+0:123        move second child to first child ( temp 2-component vector of float)
+0:123          'r023' ( temp 2-component vector of float)
+0:123          degrees ( temp 2-component vector of float)
+0:123            'inF0' ( in 2-component vector of float)
+0:127      Sequence
+0:127        move second child to first child ( temp float)
+0:127          'r026' ( temp float)
+0:127          distance ( temp float)
+0:127            'inF0' ( in 2-component vector of float)
+0:127            'inF1' ( in 2-component vector of float)
+0:128      Sequence
+0:128        move second child to first child ( temp float)
+0:128          'r027' ( temp float)
+0:128          dot-product ( temp float)
+0:128            'inF0' ( in 2-component vector of float)
+0:128            'inF1' ( in 2-component vector of float)
 0:132      Sequence
-0:132        move second child to first child ( temp 2-component vector of uint)
-0:132          'r031' ( temp 2-component vector of uint)
+0:132        move second child to first child ( temp 2-component vector of float)
+0:132          'r028' ( temp 2-component vector of float)
+0:132          exp ( temp 2-component vector of float)
+0:132            'inF0' ( in 2-component vector of float)
+0:133      Sequence
+0:133        move second child to first child ( temp 2-component vector of float)
+0:133          'r029' ( temp 2-component vector of float)
+0:133          exp2 ( temp 2-component vector of float)
+0:133            'inF0' ( in 2-component vector of float)
+0:134      Sequence
+0:134        move second child to first child ( temp 2-component vector of float)
+0:134          'r030' ( temp 2-component vector of float)
+0:134          face-forward ( temp 2-component vector of float)
+0:134            'inF0' ( in 2-component vector of float)
+0:134            'inF1' ( in 2-component vector of float)
+0:134            'inF2' ( in 2-component vector of float)
+0:135      Sequence
+0:135        move second child to first child ( temp 2-component vector of uint)
+0:135          'r031' ( temp 2-component vector of uint)
 0:?           findMSB ( temp 2-component vector of uint)
 0:?             Constant:
 0:?               7 (const uint)
 0:?               8 (const uint)
-0:133      Sequence
-0:133        move second child to first child ( temp 2-component vector of uint)
-0:133          'r032' ( temp 2-component vector of uint)
+0:136      Sequence
+0:136        move second child to first child ( temp 2-component vector of uint)
+0:136          'r032' ( temp 2-component vector of uint)
 0:?           findLSB ( temp 2-component vector of uint)
 0:?             Constant:
 0:?               7 (const uint)
 0:?               8 (const uint)
-0:134      Sequence
-0:134        move second child to first child ( temp 2-component vector of float)
-0:134          'r033' ( temp 2-component vector of float)
-0:134          Floor ( temp 2-component vector of float)
-0:134            'inF0' ( in 2-component vector of float)
-0:136      Sequence
-0:136        move second child to first child ( temp 2-component vector of float)
-0:136          'r035' ( temp 2-component vector of float)
-0:136          mod ( temp 2-component vector of float)
-0:136            'inF0' ( in 2-component vector of float)
-0:136            'inF1' ( in 2-component vector of float)
 0:137      Sequence
 0:137        move second child to first child ( temp 2-component vector of float)
-0:137          'r036' ( temp 2-component vector of float)
-0:137          Fraction ( temp 2-component vector of float)
+0:137          'r033' ( temp 2-component vector of float)
+0:137          Floor ( temp 2-component vector of float)
 0:137            'inF0' ( in 2-component vector of float)
-0:138      Sequence
-0:138        move second child to first child ( temp 2-component vector of float)
-0:138          'r038' ( temp 2-component vector of float)
-0:138          fwidth ( temp 2-component vector of float)
-0:138            'inF0' ( in 2-component vector of float)
 0:139      Sequence
-0:139        move second child to first child ( temp 2-component vector of bool)
-0:139          'r039' ( temp 2-component vector of bool)
-0:139          isinf ( temp 2-component vector of bool)
+0:139        move second child to first child ( temp 2-component vector of float)
+0:139          'r035' ( temp 2-component vector of float)
+0:139          mod ( temp 2-component vector of float)
 0:139            'inF0' ( in 2-component vector of float)
+0:139            'inF1' ( in 2-component vector of float)
 0:140      Sequence
-0:140        move second child to first child ( temp 2-component vector of bool)
-0:140          'r040' ( temp 2-component vector of bool)
-0:140          isnan ( temp 2-component vector of bool)
+0:140        move second child to first child ( temp 2-component vector of float)
+0:140          'r036' ( temp 2-component vector of float)
+0:140          Fraction ( temp 2-component vector of float)
 0:140            'inF0' ( in 2-component vector of float)
 0:141      Sequence
 0:141        move second child to first child ( temp 2-component vector of float)
-0:141          'r041' ( temp 2-component vector of float)
-0:141          ldexp ( temp 2-component vector of float)
+0:141          'r038' ( temp 2-component vector of float)
+0:141          fwidth ( temp 2-component vector of float)
 0:141            'inF0' ( in 2-component vector of float)
-0:141            'inF1' ( in 2-component vector of float)
 0:142      Sequence
-0:142        move second child to first child ( temp 2-component vector of float)
-0:142          'r039a' ( temp 2-component vector of float)
-0:142          mix ( temp 2-component vector of float)
+0:142        move second child to first child ( temp 2-component vector of bool)
+0:142          'r039' ( temp 2-component vector of bool)
+0:142          isinf ( temp 2-component vector of bool)
 0:142            'inF0' ( in 2-component vector of float)
-0:142            'inF1' ( in 2-component vector of float)
-0:142            'inF2' ( in 2-component vector of float)
 0:143      Sequence
-0:143        move second child to first child ( temp float)
-0:143          'r042' ( temp float)
-0:143          length ( temp float)
+0:143        move second child to first child ( temp 2-component vector of bool)
+0:143          'r040' ( temp 2-component vector of bool)
+0:143          isnan ( temp 2-component vector of bool)
 0:143            'inF0' ( in 2-component vector of float)
 0:144      Sequence
 0:144        move second child to first child ( temp 2-component vector of float)
-0:144          'r043' ( temp 2-component vector of float)
-0:144          log ( temp 2-component vector of float)
+0:144          'r041' ( temp 2-component vector of float)
+0:144          ldexp ( temp 2-component vector of float)
 0:144            'inF0' ( in 2-component vector of float)
+0:144            'inF1' ( in 2-component vector of float)
 0:145      Sequence
 0:145        move second child to first child ( temp 2-component vector of float)
-0:145          'r044' ( temp 2-component vector of float)
-0:145          vector-scale ( temp 2-component vector of float)
-0:145            log2 ( temp 2-component vector of float)
-0:145              'inF0' ( in 2-component vector of float)
-0:145            Constant:
-0:145              0.301030
+0:145          'r039a' ( temp 2-component vector of float)
+0:145          mix ( temp 2-component vector of float)
+0:145            'inF0' ( in 2-component vector of float)
+0:145            'inF1' ( in 2-component vector of float)
+0:145            'inF2' ( in 2-component vector of float)
 0:146      Sequence
-0:146        move second child to first child ( temp 2-component vector of float)
-0:146          'r045' ( temp 2-component vector of float)
-0:146          log2 ( temp 2-component vector of float)
+0:146        move second child to first child ( temp float)
+0:146          'r042' ( temp float)
+0:146          length ( temp float)
 0:146            'inF0' ( in 2-component vector of float)
 0:147      Sequence
 0:147        move second child to first child ( temp 2-component vector of float)
-0:147          'r046' ( temp 2-component vector of float)
-0:147          max ( temp 2-component vector of float)
+0:147          'r043' ( temp 2-component vector of float)
+0:147          log ( temp 2-component vector of float)
 0:147            'inF0' ( in 2-component vector of float)
-0:147            'inF1' ( in 2-component vector of float)
 0:148      Sequence
 0:148        move second child to first child ( temp 2-component vector of float)
-0:148          'r047' ( temp 2-component vector of float)
-0:148          min ( temp 2-component vector of float)
-0:148            'inF0' ( in 2-component vector of float)
-0:148            'inF1' ( in 2-component vector of float)
+0:148          'r044' ( temp 2-component vector of float)
+0:148          vector-scale ( temp 2-component vector of float)
+0:148            log2 ( temp 2-component vector of float)
+0:148              'inF0' ( in 2-component vector of float)
+0:148            Constant:
+0:148              0.301030
 0:149      Sequence
 0:149        move second child to first child ( temp 2-component vector of float)
-0:149          'r048' ( temp 2-component vector of float)
-0:149          normalize ( temp 2-component vector of float)
+0:149          'r045' ( temp 2-component vector of float)
+0:149          log2 ( temp 2-component vector of float)
 0:149            'inF0' ( in 2-component vector of float)
 0:150      Sequence
 0:150        move second child to first child ( temp 2-component vector of float)
-0:150          'r049' ( temp 2-component vector of float)
-0:150          pow ( temp 2-component vector of float)
+0:150          'r046' ( temp 2-component vector of float)
+0:150          max ( temp 2-component vector of float)
 0:150            'inF0' ( in 2-component vector of float)
 0:150            'inF1' ( in 2-component vector of float)
 0:151      Sequence
 0:151        move second child to first child ( temp 2-component vector of float)
-0:151          'r050' ( temp 2-component vector of float)
-0:151          radians ( temp 2-component vector of float)
+0:151          'r047' ( temp 2-component vector of float)
+0:151          min ( temp 2-component vector of float)
 0:151            'inF0' ( in 2-component vector of float)
+0:151            'inF1' ( in 2-component vector of float)
 0:152      Sequence
 0:152        move second child to first child ( temp 2-component vector of float)
-0:152          'r051' ( temp 2-component vector of float)
-0:152          divide ( temp 2-component vector of float)
-0:152            Constant:
-0:152              1.000000
+0:152          'r048' ( temp 2-component vector of float)
+0:152          normalize ( temp 2-component vector of float)
 0:152            'inF0' ( in 2-component vector of float)
 0:153      Sequence
 0:153        move second child to first child ( temp 2-component vector of float)
-0:153          'r052' ( temp 2-component vector of float)
-0:153          reflect ( temp 2-component vector of float)
+0:153          'r049' ( temp 2-component vector of float)
+0:153          pow ( temp 2-component vector of float)
 0:153            'inF0' ( in 2-component vector of float)
 0:153            'inF1' ( in 2-component vector of float)
 0:154      Sequence
 0:154        move second child to first child ( temp 2-component vector of float)
-0:154          'r053' ( temp 2-component vector of float)
-0:154          refract ( temp 2-component vector of float)
+0:154          'r050' ( temp 2-component vector of float)
+0:154          radians ( temp 2-component vector of float)
 0:154            'inF0' ( in 2-component vector of float)
-0:154            'inF1' ( in 2-component vector of float)
-0:154            Constant:
-0:154              2.000000
 0:155      Sequence
-0:155        move second child to first child ( temp 2-component vector of uint)
-0:155          'r054' ( temp 2-component vector of uint)
+0:155        move second child to first child ( temp 2-component vector of float)
+0:155          'r051' ( temp 2-component vector of float)
+0:155          divide ( temp 2-component vector of float)
+0:155            Constant:
+0:155              1.000000
+0:155            'inF0' ( in 2-component vector of float)
+0:156      Sequence
+0:156        move second child to first child ( temp 2-component vector of float)
+0:156          'r052' ( temp 2-component vector of float)
+0:156          reflect ( temp 2-component vector of float)
+0:156            'inF0' ( in 2-component vector of float)
+0:156            'inF1' ( in 2-component vector of float)
+0:157      Sequence
+0:157        move second child to first child ( temp 2-component vector of float)
+0:157          'r053' ( temp 2-component vector of float)
+0:157          refract ( temp 2-component vector of float)
+0:157            'inF0' ( in 2-component vector of float)
+0:157            'inF1' ( in 2-component vector of float)
+0:157            Constant:
+0:157              2.000000
+0:158      Sequence
+0:158        move second child to first child ( temp 2-component vector of uint)
+0:158          'r054' ( temp 2-component vector of uint)
 0:?           bitFieldReverse ( temp 2-component vector of uint)
 0:?             Constant:
 0:?               1 (const uint)
 0:?               2 (const uint)
-0:156      Sequence
-0:156        move second child to first child ( temp 2-component vector of float)
-0:156          'r055' ( temp 2-component vector of float)
-0:156          roundEven ( temp 2-component vector of float)
-0:156            'inF0' ( in 2-component vector of float)
-0:157      Sequence
-0:157        move second child to first child ( temp 2-component vector of float)
-0:157          'r056' ( temp 2-component vector of float)
-0:157          inverse sqrt ( temp 2-component vector of float)
-0:157            'inF0' ( in 2-component vector of float)
-0:158      Sequence
-0:158        move second child to first child ( temp 2-component vector of float)
-0:158          'r057' ( temp 2-component vector of float)
-0:158          clamp ( temp 2-component vector of float)
-0:158            'inF0' ( in 2-component vector of float)
-0:158            Constant:
-0:158              0.000000
-0:158            Constant:
-0:158              1.000000
 0:159      Sequence
 0:159        move second child to first child ( temp 2-component vector of float)
-0:159          'r058' ( temp 2-component vector of float)
-0:159          Sign ( temp 2-component vector of float)
+0:159          'r055' ( temp 2-component vector of float)
+0:159          roundEven ( temp 2-component vector of float)
 0:159            'inF0' ( in 2-component vector of float)
 0:160      Sequence
 0:160        move second child to first child ( temp 2-component vector of float)
-0:160          'r059' ( temp 2-component vector of float)
-0:160          sine ( temp 2-component vector of float)
+0:160          'r056' ( temp 2-component vector of float)
+0:160          inverse sqrt ( temp 2-component vector of float)
 0:160            'inF0' ( in 2-component vector of float)
 0:161      Sequence
 0:161        move second child to first child ( temp 2-component vector of float)
-0:161          'inF1' ( in 2-component vector of float)
-0:161          sine ( temp 2-component vector of float)
+0:161          'r057' ( temp 2-component vector of float)
+0:161          clamp ( temp 2-component vector of float)
 0:161            'inF0' ( in 2-component vector of float)
-0:161        move second child to first child ( temp 2-component vector of float)
-0:161          'inF2' ( in 2-component vector of float)
-0:161          cosine ( temp 2-component vector of float)
-0:161            'inF0' ( in 2-component vector of float)
+0:161            Constant:
+0:161              0.000000
+0:161            Constant:
+0:161              1.000000
 0:162      Sequence
 0:162        move second child to first child ( temp 2-component vector of float)
-0:162          'r060' ( temp 2-component vector of float)
-0:162          hyp. sine ( temp 2-component vector of float)
+0:162          'r058' ( temp 2-component vector of float)
+0:162          Sign ( temp 2-component vector of float)
 0:162            'inF0' ( in 2-component vector of float)
 0:163      Sequence
 0:163        move second child to first child ( temp 2-component vector of float)
-0:163          'r061' ( temp 2-component vector of float)
-0:163          smoothstep ( temp 2-component vector of float)
+0:163          'r059' ( temp 2-component vector of float)
+0:163          sine ( temp 2-component vector of float)
 0:163            'inF0' ( in 2-component vector of float)
-0:163            'inF1' ( in 2-component vector of float)
-0:163            'inF2' ( in 2-component vector of float)
 0:164      Sequence
 0:164        move second child to first child ( temp 2-component vector of float)
-0:164          'r062' ( temp 2-component vector of float)
-0:164          sqrt ( temp 2-component vector of float)
+0:164          'inF1' ( in 2-component vector of float)
+0:164          sine ( temp 2-component vector of float)
+0:164            'inF0' ( in 2-component vector of float)
+0:164        move second child to first child ( temp 2-component vector of float)
+0:164          'inF2' ( in 2-component vector of float)
+0:164          cosine ( temp 2-component vector of float)
 0:164            'inF0' ( in 2-component vector of float)
 0:165      Sequence
 0:165        move second child to first child ( temp 2-component vector of float)
-0:165          'r063' ( temp 2-component vector of float)
-0:165          step ( temp 2-component vector of float)
+0:165          'r060' ( temp 2-component vector of float)
+0:165          hyp. sine ( temp 2-component vector of float)
 0:165            'inF0' ( in 2-component vector of float)
-0:165            'inF1' ( in 2-component vector of float)
 0:166      Sequence
 0:166        move second child to first child ( temp 2-component vector of float)
-0:166          'r064' ( temp 2-component vector of float)
-0:166          tangent ( temp 2-component vector of float)
+0:166          'r061' ( temp 2-component vector of float)
+0:166          smoothstep ( temp 2-component vector of float)
 0:166            'inF0' ( in 2-component vector of float)
+0:166            'inF1' ( in 2-component vector of float)
+0:166            'inF2' ( in 2-component vector of float)
 0:167      Sequence
 0:167        move second child to first child ( temp 2-component vector of float)
-0:167          'r065' ( temp 2-component vector of float)
-0:167          hyp. tangent ( temp 2-component vector of float)
+0:167          'r062' ( temp 2-component vector of float)
+0:167          sqrt ( temp 2-component vector of float)
 0:167            'inF0' ( in 2-component vector of float)
+0:168      Sequence
+0:168        move second child to first child ( temp 2-component vector of float)
+0:168          'r063' ( temp 2-component vector of float)
+0:168          step ( temp 2-component vector of float)
+0:168            'inF0' ( in 2-component vector of float)
+0:168            'inF1' ( in 2-component vector of float)
 0:169      Sequence
 0:169        move second child to first child ( temp 2-component vector of float)
-0:169          'r066' ( temp 2-component vector of float)
-0:169          trunc ( temp 2-component vector of float)
+0:169          'r064' ( temp 2-component vector of float)
+0:169          tangent ( temp 2-component vector of float)
 0:169            'inF0' ( in 2-component vector of float)
-0:172      Branch: Return with expression
+0:170      Sequence
+0:170        move second child to first child ( temp 2-component vector of float)
+0:170          'r065' ( temp 2-component vector of float)
+0:170          hyp. tangent ( temp 2-component vector of float)
+0:170            'inF0' ( in 2-component vector of float)
+0:172      Sequence
+0:172        move second child to first child ( temp 2-component vector of float)
+0:172          'r066' ( temp 2-component vector of float)
+0:172          trunc ( temp 2-component vector of float)
+0:172            'inF0' ( in 2-component vector of float)
+0:175      Branch: Return with expression
 0:?         Constant:
 0:?           1.000000
 0:?           2.000000
-0:176  Function Definition: PixelShaderFunction3(vf3;vf3;vf3;vu3;vu3; ( temp 3-component vector of float)
-0:176    Function Parameters: 
-0:176      'inF0' ( in 3-component vector of float)
-0:176      'inF1' ( in 3-component vector of float)
-0:176      'inF2' ( in 3-component vector of float)
-0:176      'inU0' ( in 3-component vector of uint)
-0:176      'inU1' ( in 3-component vector of uint)
+0:179  Function Definition: PixelShaderFunction3(vf3;vf3;vf3;vu3;vu3; ( temp 3-component vector of float)
+0:179    Function Parameters: 
+0:179      'inF0' ( in 3-component vector of float)
+0:179      'inF1' ( in 3-component vector of float)
+0:179      'inF2' ( in 3-component vector of float)
+0:179      'inU0' ( in 3-component vector of uint)
+0:179      'inU1' ( in 3-component vector of uint)
 0:?     Sequence
-0:179      Sequence
-0:179        move second child to first child ( temp bool)
-0:179          'r000' ( temp bool)
-0:179          all ( temp bool)
-0:179            'inF0' ( in 3-component vector of float)
-0:180      Sequence
-0:180        move second child to first child ( temp 3-component vector of float)
-0:180          'r001' ( temp 3-component vector of float)
-0:180          Absolute value ( temp 3-component vector of float)
-0:180            'inF0' ( in 3-component vector of float)
-0:181      Sequence
-0:181        move second child to first child ( temp 3-component vector of float)
-0:181          'r002' ( temp 3-component vector of float)
-0:181          arc cosine ( temp 3-component vector of float)
-0:181            'inF0' ( in 3-component vector of float)
 0:182      Sequence
 0:182        move second child to first child ( temp bool)
-0:182          'r003' ( temp bool)
-0:182          any ( temp bool)
-0:182            'inF0' ( in 3-component vector of float)
+0:182          'r000' ( temp bool)
+0:182          all ( temp bool)
+0:182            Convert float to bool ( temp 3-component vector of bool)
+0:182              'inF0' ( in 3-component vector of float)
 0:183      Sequence
 0:183        move second child to first child ( temp 3-component vector of float)
-0:183          'r004' ( temp 3-component vector of float)
-0:183          arc sine ( temp 3-component vector of float)
+0:183          'r001' ( temp 3-component vector of float)
+0:183          Absolute value ( temp 3-component vector of float)
 0:183            'inF0' ( in 3-component vector of float)
 0:184      Sequence
-0:184        move second child to first child ( temp 3-component vector of int)
-0:184          'r005' ( temp 3-component vector of int)
-0:184          floatBitsToInt ( temp 3-component vector of int)
+0:184        move second child to first child ( temp 3-component vector of float)
+0:184          'r002' ( temp 3-component vector of float)
+0:184          arc cosine ( temp 3-component vector of float)
 0:184            'inF0' ( in 3-component vector of float)
 0:185      Sequence
-0:185        move second child to first child ( temp 3-component vector of uint)
-0:185          'r006' ( temp 3-component vector of uint)
-0:185          floatBitsToUint ( temp 3-component vector of uint)
-0:185            'inF0' ( in 3-component vector of float)
+0:185        move second child to first child ( temp bool)
+0:185          'r003' ( temp bool)
+0:185          any ( temp bool)
+0:185            Convert float to bool ( temp 3-component vector of bool)
+0:185              'inF0' ( in 3-component vector of float)
 0:186      Sequence
 0:186        move second child to first child ( temp 3-component vector of float)
-0:186          'r007' ( temp 3-component vector of float)
-0:186          intBitsToFloat ( temp 3-component vector of float)
-0:186            'inU0' ( in 3-component vector of uint)
+0:186          'r004' ( temp 3-component vector of float)
+0:186          arc sine ( temp 3-component vector of float)
+0:186            'inF0' ( in 3-component vector of float)
+0:187      Sequence
+0:187        move second child to first child ( temp 3-component vector of int)
+0:187          'r005' ( temp 3-component vector of int)
+0:187          floatBitsToInt ( temp 3-component vector of int)
+0:187            'inF0' ( in 3-component vector of float)
 0:188      Sequence
-0:188        move second child to first child ( temp 3-component vector of float)
-0:188          'r009' ( temp 3-component vector of float)
-0:188          arc tangent ( temp 3-component vector of float)
+0:188        move second child to first child ( temp 3-component vector of uint)
+0:188          'r006' ( temp 3-component vector of uint)
+0:188          floatBitsToUint ( temp 3-component vector of uint)
 0:188            'inF0' ( in 3-component vector of float)
 0:189      Sequence
 0:189        move second child to first child ( temp 3-component vector of float)
-0:189          'r010' ( temp 3-component vector of float)
-0:189          arc tangent ( temp 3-component vector of float)
-0:189            'inF0' ( in 3-component vector of float)
-0:189            'inF1' ( in 3-component vector of float)
-0:190      Sequence
-0:190        move second child to first child ( temp 3-component vector of float)
-0:190          'r011' ( temp 3-component vector of float)
-0:190          Ceiling ( temp 3-component vector of float)
-0:190            'inF0' ( in 3-component vector of float)
+0:189          'r007' ( temp 3-component vector of float)
+0:189          intBitsToFloat ( temp 3-component vector of float)
+0:189            'inU0' ( in 3-component vector of uint)
 0:191      Sequence
 0:191        move second child to first child ( temp 3-component vector of float)
-0:191          'r012' ( temp 3-component vector of float)
-0:191          clamp ( temp 3-component vector of float)
+0:191          'r009' ( temp 3-component vector of float)
+0:191          arc tangent ( temp 3-component vector of float)
 0:191            'inF0' ( in 3-component vector of float)
-0:191            'inF1' ( in 3-component vector of float)
-0:191            'inF2' ( in 3-component vector of float)
-0:192      Test condition and select ( temp void)
-0:192        Condition
-0:192        any ( temp bool)
-0:192          Compare Less Than ( temp 3-component vector of bool)
+0:192      Sequence
+0:192        move second child to first child ( temp 3-component vector of float)
+0:192          'r010' ( temp 3-component vector of float)
+0:192          arc tangent ( temp 3-component vector of float)
 0:192            'inF0' ( in 3-component vector of float)
-0:192            Constant:
-0:192              0.000000
-0:192              0.000000
-0:192              0.000000
-0:192        true case
-0:192        Branch: Kill
+0:192            'inF1' ( in 3-component vector of float)
 0:193      Sequence
 0:193        move second child to first child ( temp 3-component vector of float)
-0:193          'r013' ( temp 3-component vector of float)
-0:193          cosine ( temp 3-component vector of float)
+0:193          'r011' ( temp 3-component vector of float)
+0:193          Ceiling ( temp 3-component vector of float)
 0:193            'inF0' ( in 3-component vector of float)
 0:194      Sequence
 0:194        move second child to first child ( temp 3-component vector of float)
-0:194          'r014' ( temp 3-component vector of float)
-0:194          hyp. cosine ( temp 3-component vector of float)
+0:194          'r012' ( temp 3-component vector of float)
+0:194          clamp ( temp 3-component vector of float)
 0:194            'inF0' ( in 3-component vector of float)
-0:195      Sequence
-0:195        move second child to first child ( temp 3-component vector of uint)
-0:195          'r015' ( temp 3-component vector of uint)
+0:194            'inF1' ( in 3-component vector of float)
+0:194            'inF2' ( in 3-component vector of float)
+0:195      Test condition and select ( temp void)
+0:195        Condition
+0:195        any ( temp bool)
+0:195          Compare Less Than ( temp 3-component vector of bool)
+0:195            'inF0' ( in 3-component vector of float)
+0:195            Constant:
+0:195              0.000000
+0:195              0.000000
+0:195              0.000000
+0:195        true case
+0:195        Branch: Kill
+0:196      Test condition and select ( temp void)
+0:196        Condition
+0:196        any ( temp bool)
+0:196          Compare Less Than ( temp 3-component vector of bool)
+0:196            'inU0' ( in 3-component vector of uint)
+0:196            Constant:
+0:196              0.000000
+0:196              0.000000
+0:196              0.000000
+0:196        true case
+0:196        Branch: Kill
+0:197      Sequence
+0:197        move second child to first child ( temp 3-component vector of float)
+0:197          'r013' ( temp 3-component vector of float)
+0:197          cosine ( temp 3-component vector of float)
+0:197            'inF0' ( in 3-component vector of float)
+0:198      Sequence
+0:198        move second child to first child ( temp 3-component vector of float)
+0:198          'r014' ( temp 3-component vector of float)
+0:198          hyp. cosine ( temp 3-component vector of float)
+0:198            'inF0' ( in 3-component vector of float)
+0:199      Sequence
+0:199        move second child to first child ( temp 3-component vector of uint)
+0:199          'r015' ( temp 3-component vector of uint)
 0:?           bitCount ( temp 3-component vector of uint)
 0:?             Constant:
 0:?               7 (const uint)
 0:?               3 (const uint)
 0:?               5 (const uint)
-0:196      Sequence
-0:196        move second child to first child ( temp 3-component vector of float)
-0:196          'r016' ( temp 3-component vector of float)
-0:196          cross-product ( temp 3-component vector of float)
-0:196            'inF0' ( in 3-component vector of float)
-0:196            'inF1' ( in 3-component vector of float)
-0:197      Sequence
-0:197        move second child to first child ( temp 3-component vector of float)
-0:197          'r017' ( temp 3-component vector of float)
-0:197          dPdx ( temp 3-component vector of float)
-0:197            'inF0' ( in 3-component vector of float)
-0:198      Sequence
-0:198        move second child to first child ( temp 3-component vector of float)
-0:198          'r018' ( temp 3-component vector of float)
-0:198          dPdxCoarse ( temp 3-component vector of float)
-0:198            'inF0' ( in 3-component vector of float)
-0:199      Sequence
-0:199        move second child to first child ( temp 3-component vector of float)
-0:199          'r019' ( temp 3-component vector of float)
-0:199          dPdxFine ( temp 3-component vector of float)
-0:199            'inF0' ( in 3-component vector of float)
 0:200      Sequence
 0:200        move second child to first child ( temp 3-component vector of float)
-0:200          'r020' ( temp 3-component vector of float)
-0:200          dPdy ( temp 3-component vector of float)
+0:200          'r016' ( temp 3-component vector of float)
+0:200          cross-product ( temp 3-component vector of float)
 0:200            'inF0' ( in 3-component vector of float)
+0:200            'inF1' ( in 3-component vector of float)
 0:201      Sequence
 0:201        move second child to first child ( temp 3-component vector of float)
-0:201          'r021' ( temp 3-component vector of float)
-0:201          dPdyCoarse ( temp 3-component vector of float)
+0:201          'r017' ( temp 3-component vector of float)
+0:201          dPdx ( temp 3-component vector of float)
 0:201            'inF0' ( in 3-component vector of float)
 0:202      Sequence
 0:202        move second child to first child ( temp 3-component vector of float)
-0:202          'r022' ( temp 3-component vector of float)
-0:202          dPdyFine ( temp 3-component vector of float)
+0:202          'r018' ( temp 3-component vector of float)
+0:202          dPdxCoarse ( temp 3-component vector of float)
 0:202            'inF0' ( in 3-component vector of float)
 0:203      Sequence
 0:203        move second child to first child ( temp 3-component vector of float)
-0:203          'r023' ( temp 3-component vector of float)
-0:203          degrees ( temp 3-component vector of float)
+0:203          'r019' ( temp 3-component vector of float)
+0:203          dPdxFine ( temp 3-component vector of float)
 0:203            'inF0' ( in 3-component vector of float)
 0:204      Sequence
-0:204        move second child to first child ( temp float)
-0:204          'r024' ( temp float)
-0:204          distance ( temp float)
+0:204        move second child to first child ( temp 3-component vector of float)
+0:204          'r020' ( temp 3-component vector of float)
+0:204          dPdy ( temp 3-component vector of float)
 0:204            'inF0' ( in 3-component vector of float)
-0:204            'inF1' ( in 3-component vector of float)
 0:205      Sequence
-0:205        move second child to first child ( temp float)
-0:205          'r025' ( temp float)
-0:205          dot-product ( temp float)
+0:205        move second child to first child ( temp 3-component vector of float)
+0:205          'r021' ( temp 3-component vector of float)
+0:205          dPdyCoarse ( temp 3-component vector of float)
 0:205            'inF0' ( in 3-component vector of float)
-0:205            'inF1' ( in 3-component vector of float)
+0:206      Sequence
+0:206        move second child to first child ( temp 3-component vector of float)
+0:206          'r022' ( temp 3-component vector of float)
+0:206          dPdyFine ( temp 3-component vector of float)
+0:206            'inF0' ( in 3-component vector of float)
+0:207      Sequence
+0:207        move second child to first child ( temp 3-component vector of float)
+0:207          'r023' ( temp 3-component vector of float)
+0:207          degrees ( temp 3-component vector of float)
+0:207            'inF0' ( in 3-component vector of float)
+0:208      Sequence
+0:208        move second child to first child ( temp float)
+0:208          'r024' ( temp float)
+0:208          distance ( temp float)
+0:208            'inF0' ( in 3-component vector of float)
+0:208            'inF1' ( in 3-component vector of float)
 0:209      Sequence
-0:209        move second child to first child ( temp 3-component vector of float)
-0:209          'r029' ( temp 3-component vector of float)
-0:209          exp ( temp 3-component vector of float)
+0:209        move second child to first child ( temp float)
+0:209          'r025' ( temp float)
+0:209          dot-product ( temp float)
 0:209            'inF0' ( in 3-component vector of float)
-0:210      Sequence
-0:210        move second child to first child ( temp 3-component vector of float)
-0:210          'r030' ( temp 3-component vector of float)
-0:210          exp2 ( temp 3-component vector of float)
-0:210            'inF0' ( in 3-component vector of float)
-0:211      Sequence
-0:211        move second child to first child ( temp 3-component vector of float)
-0:211          'r031' ( temp 3-component vector of float)
-0:211          face-forward ( temp 3-component vector of float)
-0:211            'inF0' ( in 3-component vector of float)
-0:211            'inF1' ( in 3-component vector of float)
-0:211            'inF2' ( in 3-component vector of float)
-0:212      Sequence
-0:212        move second child to first child ( temp 3-component vector of uint)
-0:212          'r032' ( temp 3-component vector of uint)
+0:209            'inF1' ( in 3-component vector of float)
+0:213      Sequence
+0:213        move second child to first child ( temp 3-component vector of float)
+0:213          'r029' ( temp 3-component vector of float)
+0:213          exp ( temp 3-component vector of float)
+0:213            'inF0' ( in 3-component vector of float)
+0:214      Sequence
+0:214        move second child to first child ( temp 3-component vector of float)
+0:214          'r030' ( temp 3-component vector of float)
+0:214          exp2 ( temp 3-component vector of float)
+0:214            'inF0' ( in 3-component vector of float)
+0:215      Sequence
+0:215        move second child to first child ( temp 3-component vector of float)
+0:215          'r031' ( temp 3-component vector of float)
+0:215          face-forward ( temp 3-component vector of float)
+0:215            'inF0' ( in 3-component vector of float)
+0:215            'inF1' ( in 3-component vector of float)
+0:215            'inF2' ( in 3-component vector of float)
+0:216      Sequence
+0:216        move second child to first child ( temp 3-component vector of uint)
+0:216          'r032' ( temp 3-component vector of uint)
 0:?           findMSB ( temp 3-component vector of uint)
 0:?             Constant:
 0:?               2 (const uint)
 0:?               3 (const uint)
 0:?               4 (const uint)
-0:213      Sequence
-0:213        move second child to first child ( temp 3-component vector of uint)
-0:213          'r033' ( temp 3-component vector of uint)
+0:217      Sequence
+0:217        move second child to first child ( temp 3-component vector of uint)
+0:217          'r033' ( temp 3-component vector of uint)
 0:?           findLSB ( temp 3-component vector of uint)
 0:?             Constant:
 0:?               2 (const uint)
 0:?               3 (const uint)
 0:?               4 (const uint)
-0:214      Sequence
-0:214        move second child to first child ( temp 3-component vector of float)
-0:214          'r034' ( temp 3-component vector of float)
-0:214          Floor ( temp 3-component vector of float)
-0:214            'inF0' ( in 3-component vector of float)
-0:216      Sequence
-0:216        move second child to first child ( temp 3-component vector of float)
-0:216          'r036' ( temp 3-component vector of float)
-0:216          mod ( temp 3-component vector of float)
-0:216            'inF0' ( in 3-component vector of float)
-0:216            'inF1' ( in 3-component vector of float)
-0:217      Sequence
-0:217        move second child to first child ( temp 3-component vector of float)
-0:217          'r037' ( temp 3-component vector of float)
-0:217          Fraction ( temp 3-component vector of float)
-0:217            'inF0' ( in 3-component vector of float)
 0:218      Sequence
 0:218        move second child to first child ( temp 3-component vector of float)
-0:218          'r039' ( temp 3-component vector of float)
-0:218          fwidth ( temp 3-component vector of float)
+0:218          'r034' ( temp 3-component vector of float)
+0:218          Floor ( temp 3-component vector of float)
 0:218            'inF0' ( in 3-component vector of float)
-0:219      Sequence
-0:219        move second child to first child ( temp 3-component vector of bool)
-0:219          'r040' ( temp 3-component vector of bool)
-0:219          isinf ( temp 3-component vector of bool)
-0:219            'inF0' ( in 3-component vector of float)
 0:220      Sequence
-0:220        move second child to first child ( temp 3-component vector of bool)
-0:220          'r041' ( temp 3-component vector of bool)
-0:220          isnan ( temp 3-component vector of bool)
+0:220        move second child to first child ( temp 3-component vector of float)
+0:220          'r036' ( temp 3-component vector of float)
+0:220          mod ( temp 3-component vector of float)
 0:220            'inF0' ( in 3-component vector of float)
+0:220            'inF1' ( in 3-component vector of float)
 0:221      Sequence
 0:221        move second child to first child ( temp 3-component vector of float)
-0:221          'r042' ( temp 3-component vector of float)
-0:221          ldexp ( temp 3-component vector of float)
+0:221          'r037' ( temp 3-component vector of float)
+0:221          Fraction ( temp 3-component vector of float)
 0:221            'inF0' ( in 3-component vector of float)
-0:221            'inF1' ( in 3-component vector of float)
 0:222      Sequence
 0:222        move second child to first child ( temp 3-component vector of float)
-0:222          'r039a' ( temp 3-component vector of float)
-0:222          mix ( temp 3-component vector of float)
+0:222          'r039' ( temp 3-component vector of float)
+0:222          fwidth ( temp 3-component vector of float)
 0:222            'inF0' ( in 3-component vector of float)
-0:222            'inF1' ( in 3-component vector of float)
-0:222            'inF2' ( in 3-component vector of float)
 0:223      Sequence
-0:223        move second child to first child ( temp 3-component vector of float)
-0:223          'r039b' ( temp 3-component vector of float)
-0:223          mix ( temp 3-component vector of float)
+0:223        move second child to first child ( temp 3-component vector of bool)
+0:223          'r040' ( temp 3-component vector of bool)
+0:223          isinf ( temp 3-component vector of bool)
 0:223            'inF0' ( in 3-component vector of float)
-0:223            'inF1' ( in 3-component vector of float)
-0:223            Constant:
-0:223              0.300000
 0:224      Sequence
-0:224        move second child to first child ( temp float)
-0:224          'r043' ( temp float)
-0:224          length ( temp float)
+0:224        move second child to first child ( temp 3-component vector of bool)
+0:224          'r041' ( temp 3-component vector of bool)
+0:224          isnan ( temp 3-component vector of bool)
 0:224            'inF0' ( in 3-component vector of float)
 0:225      Sequence
 0:225        move second child to first child ( temp 3-component vector of float)
-0:225          'r044' ( temp 3-component vector of float)
-0:225          log ( temp 3-component vector of float)
+0:225          'r042' ( temp 3-component vector of float)
+0:225          ldexp ( temp 3-component vector of float)
 0:225            'inF0' ( in 3-component vector of float)
+0:225            'inF1' ( in 3-component vector of float)
 0:226      Sequence
 0:226        move second child to first child ( temp 3-component vector of float)
-0:226          'r045' ( temp 3-component vector of float)
-0:226          vector-scale ( temp 3-component vector of float)
-0:226            log2 ( temp 3-component vector of float)
-0:226              'inF0' ( in 3-component vector of float)
-0:226            Constant:
-0:226              0.301030
+0:226          'r039a' ( temp 3-component vector of float)
+0:226          mix ( temp 3-component vector of float)
+0:226            'inF0' ( in 3-component vector of float)
+0:226            'inF1' ( in 3-component vector of float)
+0:226            'inF2' ( in 3-component vector of float)
 0:227      Sequence
 0:227        move second child to first child ( temp 3-component vector of float)
-0:227          'r046' ( temp 3-component vector of float)
-0:227          log2 ( temp 3-component vector of float)
+0:227          'r039b' ( temp 3-component vector of float)
+0:227          mix ( temp 3-component vector of float)
 0:227            'inF0' ( in 3-component vector of float)
+0:227            'inF1' ( in 3-component vector of float)
+0:227            Constant:
+0:227              0.300000
 0:228      Sequence
-0:228        move second child to first child ( temp 3-component vector of float)
-0:228          'r047' ( temp 3-component vector of float)
-0:228          max ( temp 3-component vector of float)
+0:228        move second child to first child ( temp float)
+0:228          'r043' ( temp float)
+0:228          length ( temp float)
 0:228            'inF0' ( in 3-component vector of float)
-0:228            'inF1' ( in 3-component vector of float)
 0:229      Sequence
 0:229        move second child to first child ( temp 3-component vector of float)
-0:229          'r048' ( temp 3-component vector of float)
-0:229          min ( temp 3-component vector of float)
+0:229          'r044' ( temp 3-component vector of float)
+0:229          log ( temp 3-component vector of float)
 0:229            'inF0' ( in 3-component vector of float)
-0:229            'inF1' ( in 3-component vector of float)
 0:230      Sequence
 0:230        move second child to first child ( temp 3-component vector of float)
-0:230          'r049' ( temp 3-component vector of float)
-0:230          normalize ( temp 3-component vector of float)
-0:230            'inF0' ( in 3-component vector of float)
+0:230          'r045' ( temp 3-component vector of float)
+0:230          vector-scale ( temp 3-component vector of float)
+0:230            log2 ( temp 3-component vector of float)
+0:230              'inF0' ( in 3-component vector of float)
+0:230            Constant:
+0:230              0.301030
 0:231      Sequence
 0:231        move second child to first child ( temp 3-component vector of float)
-0:231          'r050' ( temp 3-component vector of float)
-0:231          pow ( temp 3-component vector of float)
+0:231          'r046' ( temp 3-component vector of float)
+0:231          log2 ( temp 3-component vector of float)
 0:231            'inF0' ( in 3-component vector of float)
-0:231            'inF1' ( in 3-component vector of float)
 0:232      Sequence
 0:232        move second child to first child ( temp 3-component vector of float)
-0:232          'r051' ( temp 3-component vector of float)
-0:232          radians ( temp 3-component vector of float)
+0:232          'r047' ( temp 3-component vector of float)
+0:232          max ( temp 3-component vector of float)
 0:232            'inF0' ( in 3-component vector of float)
+0:232            'inF1' ( in 3-component vector of float)
 0:233      Sequence
 0:233        move second child to first child ( temp 3-component vector of float)
-0:233          'r052' ( temp 3-component vector of float)
-0:233          divide ( temp 3-component vector of float)
-0:233            Constant:
-0:233              1.000000
+0:233          'r048' ( temp 3-component vector of float)
+0:233          min ( temp 3-component vector of float)
 0:233            'inF0' ( in 3-component vector of float)
+0:233            'inF1' ( in 3-component vector of float)
 0:234      Sequence
 0:234        move second child to first child ( temp 3-component vector of float)
-0:234          'r053' ( temp 3-component vector of float)
-0:234          reflect ( temp 3-component vector of float)
+0:234          'r049' ( temp 3-component vector of float)
+0:234          normalize ( temp 3-component vector of float)
 0:234            'inF0' ( in 3-component vector of float)
-0:234            'inF1' ( in 3-component vector of float)
 0:235      Sequence
 0:235        move second child to first child ( temp 3-component vector of float)
-0:235          'r054' ( temp 3-component vector of float)
-0:235          refract ( temp 3-component vector of float)
+0:235          'r050' ( temp 3-component vector of float)
+0:235          pow ( temp 3-component vector of float)
 0:235            'inF0' ( in 3-component vector of float)
 0:235            'inF1' ( in 3-component vector of float)
-0:235            Constant:
-0:235              2.000000
 0:236      Sequence
-0:236        move second child to first child ( temp 3-component vector of uint)
-0:236          'r055' ( temp 3-component vector of uint)
+0:236        move second child to first child ( temp 3-component vector of float)
+0:236          'r051' ( temp 3-component vector of float)
+0:236          radians ( temp 3-component vector of float)
+0:236            'inF0' ( in 3-component vector of float)
+0:237      Sequence
+0:237        move second child to first child ( temp 3-component vector of float)
+0:237          'r052' ( temp 3-component vector of float)
+0:237          divide ( temp 3-component vector of float)
+0:237            Constant:
+0:237              1.000000
+0:237            'inF0' ( in 3-component vector of float)
+0:238      Sequence
+0:238        move second child to first child ( temp 3-component vector of float)
+0:238          'r053' ( temp 3-component vector of float)
+0:238          reflect ( temp 3-component vector of float)
+0:238            'inF0' ( in 3-component vector of float)
+0:238            'inF1' ( in 3-component vector of float)
+0:239      Sequence
+0:239        move second child to first child ( temp 3-component vector of float)
+0:239          'r054' ( temp 3-component vector of float)
+0:239          refract ( temp 3-component vector of float)
+0:239            'inF0' ( in 3-component vector of float)
+0:239            'inF1' ( in 3-component vector of float)
+0:239            Constant:
+0:239              2.000000
+0:240      Sequence
+0:240        move second child to first child ( temp 3-component vector of uint)
+0:240          'r055' ( temp 3-component vector of uint)
 0:?           bitFieldReverse ( temp 3-component vector of uint)
 0:?             Constant:
 0:?               1 (const uint)
 0:?               2 (const uint)
 0:?               3 (const uint)
-0:237      Sequence
-0:237        move second child to first child ( temp 3-component vector of float)
-0:237          'r056' ( temp 3-component vector of float)
-0:237          roundEven ( temp 3-component vector of float)
-0:237            'inF0' ( in 3-component vector of float)
-0:238      Sequence
-0:238        move second child to first child ( temp 3-component vector of float)
-0:238          'r057' ( temp 3-component vector of float)
-0:238          inverse sqrt ( temp 3-component vector of float)
-0:238            'inF0' ( in 3-component vector of float)
-0:239      Sequence
-0:239        move second child to first child ( temp 3-component vector of float)
-0:239          'r058' ( temp 3-component vector of float)
-0:239          clamp ( temp 3-component vector of float)
-0:239            'inF0' ( in 3-component vector of float)
-0:239            Constant:
-0:239              0.000000
-0:239            Constant:
-0:239              1.000000
-0:240      Sequence
-0:240        move second child to first child ( temp 3-component vector of float)
-0:240          'r059' ( temp 3-component vector of float)
-0:240          Sign ( temp 3-component vector of float)
-0:240            'inF0' ( in 3-component vector of float)
 0:241      Sequence
 0:241        move second child to first child ( temp 3-component vector of float)
-0:241          'r060' ( temp 3-component vector of float)
-0:241          sine ( temp 3-component vector of float)
+0:241          'r056' ( temp 3-component vector of float)
+0:241          roundEven ( temp 3-component vector of float)
 0:241            'inF0' ( in 3-component vector of float)
 0:242      Sequence
 0:242        move second child to first child ( temp 3-component vector of float)
-0:242          'inF1' ( in 3-component vector of float)
-0:242          sine ( temp 3-component vector of float)
-0:242            'inF0' ( in 3-component vector of float)
-0:242        move second child to first child ( temp 3-component vector of float)
-0:242          'inF2' ( in 3-component vector of float)
-0:242          cosine ( temp 3-component vector of float)
+0:242          'r057' ( temp 3-component vector of float)
+0:242          inverse sqrt ( temp 3-component vector of float)
 0:242            'inF0' ( in 3-component vector of float)
 0:243      Sequence
 0:243        move second child to first child ( temp 3-component vector of float)
-0:243          'r061' ( temp 3-component vector of float)
-0:243          hyp. sine ( temp 3-component vector of float)
+0:243          'r058' ( temp 3-component vector of float)
+0:243          clamp ( temp 3-component vector of float)
 0:243            'inF0' ( in 3-component vector of float)
+0:243            Constant:
+0:243              0.000000
+0:243            Constant:
+0:243              1.000000
 0:244      Sequence
 0:244        move second child to first child ( temp 3-component vector of float)
-0:244          'r062' ( temp 3-component vector of float)
-0:244          smoothstep ( temp 3-component vector of float)
+0:244          'r059' ( temp 3-component vector of float)
+0:244          Sign ( temp 3-component vector of float)
 0:244            'inF0' ( in 3-component vector of float)
-0:244            'inF1' ( in 3-component vector of float)
-0:244            'inF2' ( in 3-component vector of float)
 0:245      Sequence
 0:245        move second child to first child ( temp 3-component vector of float)
-0:245          'r063' ( temp 3-component vector of float)
-0:245          sqrt ( temp 3-component vector of float)
+0:245          'r060' ( temp 3-component vector of float)
+0:245          sine ( temp 3-component vector of float)
 0:245            'inF0' ( in 3-component vector of float)
 0:246      Sequence
 0:246        move second child to first child ( temp 3-component vector of float)
-0:246          'r064' ( temp 3-component vector of float)
-0:246          step ( temp 3-component vector of float)
+0:246          'inF1' ( in 3-component vector of float)
+0:246          sine ( temp 3-component vector of float)
 0:246            'inF0' ( in 3-component vector of float)
-0:246            'inF1' ( in 3-component vector of float)
+0:246        move second child to first child ( temp 3-component vector of float)
+0:246          'inF2' ( in 3-component vector of float)
+0:246          cosine ( temp 3-component vector of float)
+0:246            'inF0' ( in 3-component vector of float)
 0:247      Sequence
 0:247        move second child to first child ( temp 3-component vector of float)
-0:247          'r065' ( temp 3-component vector of float)
-0:247          tangent ( temp 3-component vector of float)
+0:247          'r061' ( temp 3-component vector of float)
+0:247          hyp. sine ( temp 3-component vector of float)
 0:247            'inF0' ( in 3-component vector of float)
 0:248      Sequence
 0:248        move second child to first child ( temp 3-component vector of float)
-0:248          'r066' ( temp 3-component vector of float)
-0:248          hyp. tangent ( temp 3-component vector of float)
+0:248          'r062' ( temp 3-component vector of float)
+0:248          smoothstep ( temp 3-component vector of float)
 0:248            'inF0' ( in 3-component vector of float)
+0:248            'inF1' ( in 3-component vector of float)
+0:248            'inF2' ( in 3-component vector of float)
+0:249      Sequence
+0:249        move second child to first child ( temp 3-component vector of float)
+0:249          'r063' ( temp 3-component vector of float)
+0:249          sqrt ( temp 3-component vector of float)
+0:249            'inF0' ( in 3-component vector of float)
 0:250      Sequence
 0:250        move second child to first child ( temp 3-component vector of float)
-0:250          'r067' ( temp 3-component vector of float)
-0:250          trunc ( temp 3-component vector of float)
+0:250          'r064' ( temp 3-component vector of float)
+0:250          step ( temp 3-component vector of float)
 0:250            'inF0' ( in 3-component vector of float)
-0:253      Branch: Return with expression
+0:250            'inF1' ( in 3-component vector of float)
+0:251      Sequence
+0:251        move second child to first child ( temp 3-component vector of float)
+0:251          'r065' ( temp 3-component vector of float)
+0:251          tangent ( temp 3-component vector of float)
+0:251            'inF0' ( in 3-component vector of float)
+0:252      Sequence
+0:252        move second child to first child ( temp 3-component vector of float)
+0:252          'r066' ( temp 3-component vector of float)
+0:252          hyp. tangent ( temp 3-component vector of float)
+0:252            'inF0' ( in 3-component vector of float)
+0:254      Sequence
+0:254        move second child to first child ( temp 3-component vector of float)
+0:254          'r067' ( temp 3-component vector of float)
+0:254          trunc ( temp 3-component vector of float)
+0:254            'inF0' ( in 3-component vector of float)
+0:257      Branch: Return with expression
 0:?         Constant:
 0:?           1.000000
 0:?           2.000000
 0:?           3.000000
-0:257  Function Definition: PixelShaderFunction(vf4;vf4;vf4;vu4;vu4; ( temp 4-component vector of float)
-0:257    Function Parameters: 
-0:257      'inF0' ( in 4-component vector of float)
-0:257      'inF1' ( in 4-component vector of float)
-0:257      'inF2' ( in 4-component vector of float)
-0:257      'inU0' ( in 4-component vector of uint)
-0:257      'inU1' ( in 4-component vector of uint)
+0:261  Function Definition: PixelShaderFunction(vf4;vf4;vf4;vu4;vu4; ( temp 4-component vector of float)
+0:261    Function Parameters: 
+0:261      'inF0' ( in 4-component vector of float)
+0:261      'inF1' ( in 4-component vector of float)
+0:261      'inF2' ( in 4-component vector of float)
+0:261      'inU0' ( in 4-component vector of uint)
+0:261      'inU1' ( in 4-component vector of uint)
 0:?     Sequence
-0:260      Sequence
-0:260        move second child to first child ( temp bool)
-0:260          'r000' ( temp bool)
-0:260          all ( temp bool)
-0:260            'inF0' ( in 4-component vector of float)
-0:261      Sequence
-0:261        move second child to first child ( temp 4-component vector of float)
-0:261          'r001' ( temp 4-component vector of float)
-0:261          Absolute value ( temp 4-component vector of float)
-0:261            'inF0' ( in 4-component vector of float)
-0:262      Sequence
-0:262        move second child to first child ( temp 4-component vector of float)
-0:262          'r002' ( temp 4-component vector of float)
-0:262          arc cosine ( temp 4-component vector of float)
-0:262            'inF0' ( in 4-component vector of float)
-0:263      Sequence
-0:263        move second child to first child ( temp bool)
-0:263          'r003' ( temp bool)
-0:263          any ( temp bool)
-0:263            'inF0' ( in 4-component vector of float)
 0:264      Sequence
-0:264        move second child to first child ( temp 4-component vector of float)
-0:264          'r004' ( temp 4-component vector of float)
-0:264          arc sine ( temp 4-component vector of float)
-0:264            'inF0' ( in 4-component vector of float)
+0:264        move second child to first child ( temp bool)
+0:264          'r000' ( temp bool)
+0:264          all ( temp bool)
+0:264            Convert float to bool ( temp 4-component vector of bool)
+0:264              'inF0' ( in 4-component vector of float)
 0:265      Sequence
-0:265        move second child to first child ( temp 4-component vector of int)
-0:265          'r005' ( temp 4-component vector of int)
-0:265          floatBitsToInt ( temp 4-component vector of int)
+0:265        move second child to first child ( temp 4-component vector of float)
+0:265          'r001' ( temp 4-component vector of float)
+0:265          Absolute value ( temp 4-component vector of float)
 0:265            'inF0' ( in 4-component vector of float)
 0:266      Sequence
-0:266        move second child to first child ( temp 4-component vector of uint)
-0:266          'r006' ( temp 4-component vector of uint)
-0:266          floatBitsToUint ( temp 4-component vector of uint)
+0:266        move second child to first child ( temp 4-component vector of float)
+0:266          'r002' ( temp 4-component vector of float)
+0:266          arc cosine ( temp 4-component vector of float)
 0:266            'inF0' ( in 4-component vector of float)
 0:267      Sequence
-0:267        move second child to first child ( temp 4-component vector of float)
-0:267          'r007' ( temp 4-component vector of float)
-0:267          intBitsToFloat ( temp 4-component vector of float)
-0:267            'inU0' ( in 4-component vector of uint)
+0:267        move second child to first child ( temp bool)
+0:267          'r003' ( temp bool)
+0:267          any ( temp bool)
+0:267            Convert float to bool ( temp 4-component vector of bool)
+0:267              'inF0' ( in 4-component vector of float)
+0:268      Sequence
+0:268        move second child to first child ( temp 4-component vector of float)
+0:268          'r004' ( temp 4-component vector of float)
+0:268          arc sine ( temp 4-component vector of float)
+0:268            'inF0' ( in 4-component vector of float)
 0:269      Sequence
-0:269        move second child to first child ( temp 4-component vector of float)
-0:269          'r009' ( temp 4-component vector of float)
-0:269          arc tangent ( temp 4-component vector of float)
+0:269        move second child to first child ( temp 4-component vector of int)
+0:269          'r005' ( temp 4-component vector of int)
+0:269          floatBitsToInt ( temp 4-component vector of int)
 0:269            'inF0' ( in 4-component vector of float)
 0:270      Sequence
-0:270        move second child to first child ( temp 4-component vector of float)
-0:270          'r010' ( temp 4-component vector of float)
-0:270          arc tangent ( temp 4-component vector of float)
+0:270        move second child to first child ( temp 4-component vector of uint)
+0:270          'r006' ( temp 4-component vector of uint)
+0:270          floatBitsToUint ( temp 4-component vector of uint)
 0:270            'inF0' ( in 4-component vector of float)
-0:270            'inF1' ( in 4-component vector of float)
 0:271      Sequence
 0:271        move second child to first child ( temp 4-component vector of float)
-0:271          'r011' ( temp 4-component vector of float)
-0:271          Ceiling ( temp 4-component vector of float)
-0:271            'inF0' ( in 4-component vector of float)
-0:272      Sequence
-0:272        move second child to first child ( temp 4-component vector of float)
-0:272          'r012' ( temp 4-component vector of float)
-0:272          clamp ( temp 4-component vector of float)
-0:272            'inF0' ( in 4-component vector of float)
-0:272            'inF1' ( in 4-component vector of float)
-0:272            'inF2' ( in 4-component vector of float)
-0:273      Test condition and select ( temp void)
-0:273        Condition
-0:273        any ( temp bool)
-0:273          Compare Less Than ( temp 4-component vector of bool)
+0:271          'r007' ( temp 4-component vector of float)
+0:271          intBitsToFloat ( temp 4-component vector of float)
+0:271            'inU0' ( in 4-component vector of uint)
+0:273      Sequence
+0:273        move second child to first child ( temp 4-component vector of float)
+0:273          'r009' ( temp 4-component vector of float)
+0:273          arc tangent ( temp 4-component vector of float)
 0:273            'inF0' ( in 4-component vector of float)
-0:273            Constant:
-0:273              0.000000
-0:273              0.000000
-0:273              0.000000
-0:273              0.000000
-0:273        true case
-0:273        Branch: Kill
 0:274      Sequence
 0:274        move second child to first child ( temp 4-component vector of float)
-0:274          'r013' ( temp 4-component vector of float)
-0:274          cosine ( temp 4-component vector of float)
+0:274          'r010' ( temp 4-component vector of float)
+0:274          arc tangent ( temp 4-component vector of float)
 0:274            'inF0' ( in 4-component vector of float)
+0:274            'inF1' ( in 4-component vector of float)
 0:275      Sequence
 0:275        move second child to first child ( temp 4-component vector of float)
-0:275          'r014' ( temp 4-component vector of float)
-0:275          hyp. cosine ( temp 4-component vector of float)
+0:275          'r011' ( temp 4-component vector of float)
+0:275          Ceiling ( temp 4-component vector of float)
 0:275            'inF0' ( in 4-component vector of float)
 0:276      Sequence
-0:276        move second child to first child ( temp 4-component vector of uint)
-0:276          'r015' ( temp 4-component vector of uint)
+0:276        move second child to first child ( temp 4-component vector of float)
+0:276          'r012' ( temp 4-component vector of float)
+0:276          clamp ( temp 4-component vector of float)
+0:276            'inF0' ( in 4-component vector of float)
+0:276            'inF1' ( in 4-component vector of float)
+0:276            'inF2' ( in 4-component vector of float)
+0:277      Test condition and select ( temp void)
+0:277        Condition
+0:277        any ( temp bool)
+0:277          Compare Less Than ( temp 4-component vector of bool)
+0:277            'inF0' ( in 4-component vector of float)
+0:277            Constant:
+0:277              0.000000
+0:277              0.000000
+0:277              0.000000
+0:277              0.000000
+0:277        true case
+0:277        Branch: Kill
+0:278      Test condition and select ( temp void)
+0:278        Condition
+0:278        any ( temp bool)
+0:278          Compare Less Than ( temp 4-component vector of bool)
+0:278            'inU0' ( in 4-component vector of uint)
+0:278            Constant:
+0:278              0.000000
+0:278              0.000000
+0:278              0.000000
+0:278              0.000000
+0:278        true case
+0:278        Branch: Kill
+0:279      Sequence
+0:279        move second child to first child ( temp 4-component vector of float)
+0:279          'r013' ( temp 4-component vector of float)
+0:279          cosine ( temp 4-component vector of float)
+0:279            'inF0' ( in 4-component vector of float)
+0:280      Sequence
+0:280        move second child to first child ( temp 4-component vector of float)
+0:280          'r014' ( temp 4-component vector of float)
+0:280          hyp. cosine ( temp 4-component vector of float)
+0:280            'inF0' ( in 4-component vector of float)
+0:281      Sequence
+0:281        move second child to first child ( temp 4-component vector of uint)
+0:281          'r015' ( temp 4-component vector of uint)
 0:?           bitCount ( temp 4-component vector of uint)
 0:?             Constant:
 0:?               7 (const uint)
 0:?               3 (const uint)
 0:?               5 (const uint)
 0:?               2 (const uint)
-0:277      Sequence
-0:277        move second child to first child ( temp 4-component vector of float)
-0:277          'r016' ( temp 4-component vector of float)
-0:277          dPdx ( temp 4-component vector of float)
-0:277            'inF0' ( in 4-component vector of float)
-0:278      Sequence
-0:278        move second child to first child ( temp 4-component vector of float)
-0:278          'r017' ( temp 4-component vector of float)
-0:278          dPdxCoarse ( temp 4-component vector of float)
-0:278            'inF0' ( in 4-component vector of float)
-0:279      Sequence
-0:279        move second child to first child ( temp 4-component vector of float)
-0:279          'r018' ( temp 4-component vector of float)
-0:279          dPdxFine ( temp 4-component vector of float)
-0:279            'inF0' ( in 4-component vector of float)
-0:280      Sequence
-0:280        move second child to first child ( temp 4-component vector of float)
-0:280          'r019' ( temp 4-component vector of float)
-0:280          dPdy ( temp 4-component vector of float)
-0:280            'inF0' ( in 4-component vector of float)
-0:281      Sequence
-0:281        move second child to first child ( temp 4-component vector of float)
-0:281          'r020' ( temp 4-component vector of float)
-0:281          dPdyCoarse ( temp 4-component vector of float)
-0:281            'inF0' ( in 4-component vector of float)
 0:282      Sequence
 0:282        move second child to first child ( temp 4-component vector of float)
-0:282          'r021' ( temp 4-component vector of float)
-0:282          dPdyFine ( temp 4-component vector of float)
+0:282          'r016' ( temp 4-component vector of float)
+0:282          dPdx ( temp 4-component vector of float)
 0:282            'inF0' ( in 4-component vector of float)
 0:283      Sequence
 0:283        move second child to first child ( temp 4-component vector of float)
-0:283          'r022' ( temp 4-component vector of float)
-0:283          degrees ( temp 4-component vector of float)
+0:283          'r017' ( temp 4-component vector of float)
+0:283          dPdxCoarse ( temp 4-component vector of float)
 0:283            'inF0' ( in 4-component vector of float)
 0:284      Sequence
-0:284        move second child to first child ( temp float)
-0:284          'r023' ( temp float)
-0:284          distance ( temp float)
+0:284        move second child to first child ( temp 4-component vector of float)
+0:284          'r018' ( temp 4-component vector of float)
+0:284          dPdxFine ( temp 4-component vector of float)
 0:284            'inF0' ( in 4-component vector of float)
-0:284            'inF1' ( in 4-component vector of float)
 0:285      Sequence
-0:285        move second child to first child ( temp float)
-0:285          'r024' ( temp float)
-0:285          dot-product ( temp float)
+0:285        move second child to first child ( temp 4-component vector of float)
+0:285          'r019' ( temp 4-component vector of float)
+0:285          dPdy ( temp 4-component vector of float)
 0:285            'inF0' ( in 4-component vector of float)
-0:285            'inF1' ( in 4-component vector of float)
 0:286      Sequence
 0:286        move second child to first child ( temp 4-component vector of float)
-0:286          'r025' ( temp 4-component vector of float)
-0:286          Construct vec4 ( temp 4-component vector of float)
-0:286            Constant:
-0:286              1.000000
-0:286            component-wise multiply ( temp float)
-0:286              direct index ( temp float)
-0:286                'inF0' ( in 4-component vector of float)
-0:286                Constant:
-0:286                  1 (const int)
-0:286              direct index ( temp float)
-0:286                'inF1' ( in 4-component vector of float)
-0:286                Constant:
-0:286                  1 (const int)
-0:286            direct index ( temp float)
-0:286              'inF0' ( in 4-component vector of float)
-0:286              Constant:
-0:286                2 (const int)
-0:286            direct index ( temp float)
-0:286              'inF1' ( in 4-component vector of float)
-0:286              Constant:
-0:286                3 (const int)
+0:286          'r020' ( temp 4-component vector of float)
+0:286          dPdyCoarse ( temp 4-component vector of float)
+0:286            'inF0' ( in 4-component vector of float)
+0:287      Sequence
+0:287        move second child to first child ( temp 4-component vector of float)
+0:287          'r021' ( temp 4-component vector of float)
+0:287          dPdyFine ( temp 4-component vector of float)
+0:287            'inF0' ( in 4-component vector of float)
+0:288      Sequence
+0:288        move second child to first child ( temp 4-component vector of float)
+0:288          'r022' ( temp 4-component vector of float)
+0:288          degrees ( temp 4-component vector of float)
+0:288            'inF0' ( in 4-component vector of float)
+0:289      Sequence
+0:289        move second child to first child ( temp float)
+0:289          'r023' ( temp float)
+0:289          distance ( temp float)
+0:289            'inF0' ( in 4-component vector of float)
+0:289            'inF1' ( in 4-component vector of float)
 0:290      Sequence
-0:290        move second child to first child ( temp 4-component vector of float)
-0:290          'r029' ( temp 4-component vector of float)
-0:290          exp ( temp 4-component vector of float)
+0:290        move second child to first child ( temp float)
+0:290          'r024' ( temp float)
+0:290          dot-product ( temp float)
 0:290            'inF0' ( in 4-component vector of float)
+0:290            'inF1' ( in 4-component vector of float)
 0:291      Sequence
 0:291        move second child to first child ( temp 4-component vector of float)
-0:291          'r030' ( temp 4-component vector of float)
-0:291          exp2 ( temp 4-component vector of float)
-0:291            'inF0' ( in 4-component vector of float)
-0:292      Sequence
-0:292        move second child to first child ( temp 4-component vector of float)
-0:292          'r031' ( temp 4-component vector of float)
-0:292          face-forward ( temp 4-component vector of float)
-0:292            'inF0' ( in 4-component vector of float)
-0:292            'inF1' ( in 4-component vector of float)
-0:292            'inF2' ( in 4-component vector of float)
-0:293      Sequence
-0:293        move second child to first child ( temp 4-component vector of uint)
-0:293          'r032' ( temp 4-component vector of uint)
+0:291          'r025' ( temp 4-component vector of float)
+0:291          Construct vec4 ( temp 4-component vector of float)
+0:291            Constant:
+0:291              1.000000
+0:291            component-wise multiply ( temp float)
+0:291              direct index ( temp float)
+0:291                'inF0' ( in 4-component vector of float)
+0:291                Constant:
+0:291                  1 (const int)
+0:291              direct index ( temp float)
+0:291                'inF1' ( in 4-component vector of float)
+0:291                Constant:
+0:291                  1 (const int)
+0:291            direct index ( temp float)
+0:291              'inF0' ( in 4-component vector of float)
+0:291              Constant:
+0:291                2 (const int)
+0:291            direct index ( temp float)
+0:291              'inF1' ( in 4-component vector of float)
+0:291              Constant:
+0:291                3 (const int)
+0:295      Sequence
+0:295        move second child to first child ( temp 4-component vector of float)
+0:295          'r029' ( temp 4-component vector of float)
+0:295          exp ( temp 4-component vector of float)
+0:295            'inF0' ( in 4-component vector of float)
+0:296      Sequence
+0:296        move second child to first child ( temp 4-component vector of float)
+0:296          'r030' ( temp 4-component vector of float)
+0:296          exp2 ( temp 4-component vector of float)
+0:296            'inF0' ( in 4-component vector of float)
+0:297      Sequence
+0:297        move second child to first child ( temp 4-component vector of float)
+0:297          'r031' ( temp 4-component vector of float)
+0:297          face-forward ( temp 4-component vector of float)
+0:297            'inF0' ( in 4-component vector of float)
+0:297            'inF1' ( in 4-component vector of float)
+0:297            'inF2' ( in 4-component vector of float)
+0:298      Sequence
+0:298        move second child to first child ( temp 4-component vector of uint)
+0:298          'r032' ( temp 4-component vector of uint)
 0:?           findMSB ( temp 4-component vector of uint)
 0:?             Constant:
 0:?               7 (const uint)
 0:?               8 (const uint)
 0:?               9 (const uint)
 0:?               10 (const uint)
-0:294      Sequence
-0:294        move second child to first child ( temp 4-component vector of uint)
-0:294          'r033' ( temp 4-component vector of uint)
+0:299      Sequence
+0:299        move second child to first child ( temp 4-component vector of uint)
+0:299          'r033' ( temp 4-component vector of uint)
 0:?           findLSB ( temp 4-component vector of uint)
 0:?             Constant:
 0:?               7 (const uint)
 0:?               8 (const uint)
 0:?               9 (const uint)
 0:?               10 (const uint)
-0:295      Sequence
-0:295        move second child to first child ( temp 4-component vector of float)
-0:295          'r034' ( temp 4-component vector of float)
-0:295          Floor ( temp 4-component vector of float)
-0:295            'inF0' ( in 4-component vector of float)
-0:297      Sequence
-0:297        move second child to first child ( temp 4-component vector of float)
-0:297          'r036' ( temp 4-component vector of float)
-0:297          mod ( temp 4-component vector of float)
-0:297            'inF0' ( in 4-component vector of float)
-0:297            'inF1' ( in 4-component vector of float)
-0:298      Sequence
-0:298        move second child to first child ( temp 4-component vector of float)
-0:298          'r037' ( temp 4-component vector of float)
-0:298          Fraction ( temp 4-component vector of float)
-0:298            'inF0' ( in 4-component vector of float)
-0:299      Sequence
-0:299        move second child to first child ( temp 4-component vector of float)
-0:299          'r039' ( temp 4-component vector of float)
-0:299          fwidth ( temp 4-component vector of float)
-0:299            'inF0' ( in 4-component vector of float)
 0:300      Sequence
-0:300        move second child to first child ( temp 4-component vector of bool)
-0:300          'r040' ( temp 4-component vector of bool)
-0:300          isinf ( temp 4-component vector of bool)
+0:300        move second child to first child ( temp 4-component vector of float)
+0:300          'r034' ( temp 4-component vector of float)
+0:300          Floor ( temp 4-component vector of float)
 0:300            'inF0' ( in 4-component vector of float)
-0:301      Sequence
-0:301        move second child to first child ( temp 4-component vector of bool)
-0:301          'r041' ( temp 4-component vector of bool)
-0:301          isnan ( temp 4-component vector of bool)
-0:301            'inF0' ( in 4-component vector of float)
 0:302      Sequence
 0:302        move second child to first child ( temp 4-component vector of float)
-0:302          'r042' ( temp 4-component vector of float)
-0:302          ldexp ( temp 4-component vector of float)
+0:302          'r036' ( temp 4-component vector of float)
+0:302          mod ( temp 4-component vector of float)
 0:302            'inF0' ( in 4-component vector of float)
 0:302            'inF1' ( in 4-component vector of float)
 0:303      Sequence
 0:303        move second child to first child ( temp 4-component vector of float)
-0:303          'r039a' ( temp 4-component vector of float)
-0:303          mix ( temp 4-component vector of float)
+0:303          'r037' ( temp 4-component vector of float)
+0:303          Fraction ( temp 4-component vector of float)
 0:303            'inF0' ( in 4-component vector of float)
-0:303            'inF1' ( in 4-component vector of float)
-0:303            'inF2' ( in 4-component vector of float)
 0:304      Sequence
-0:304        move second child to first child ( temp float)
-0:304          'r043' ( temp float)
-0:304          length ( temp float)
+0:304        move second child to first child ( temp 4-component vector of float)
+0:304          'r039' ( temp 4-component vector of float)
+0:304          fwidth ( temp 4-component vector of float)
 0:304            'inF0' ( in 4-component vector of float)
 0:305      Sequence
-0:305        move second child to first child ( temp 4-component vector of float)
-0:305          'r044' ( temp 4-component vector of float)
-0:305          log ( temp 4-component vector of float)
+0:305        move second child to first child ( temp 4-component vector of bool)
+0:305          'r040' ( temp 4-component vector of bool)
+0:305          isinf ( temp 4-component vector of bool)
 0:305            'inF0' ( in 4-component vector of float)
 0:306      Sequence
-0:306        move second child to first child ( temp 4-component vector of float)
-0:306          'r045' ( temp 4-component vector of float)
-0:306          vector-scale ( temp 4-component vector of float)
-0:306            log2 ( temp 4-component vector of float)
-0:306              'inF0' ( in 4-component vector of float)
-0:306            Constant:
-0:306              0.301030
+0:306        move second child to first child ( temp 4-component vector of bool)
+0:306          'r041' ( temp 4-component vector of bool)
+0:306          isnan ( temp 4-component vector of bool)
+0:306            'inF0' ( in 4-component vector of float)
 0:307      Sequence
 0:307        move second child to first child ( temp 4-component vector of float)
-0:307          'r046' ( temp 4-component vector of float)
-0:307          log2 ( temp 4-component vector of float)
+0:307          'r042' ( temp 4-component vector of float)
+0:307          ldexp ( temp 4-component vector of float)
 0:307            'inF0' ( in 4-component vector of float)
+0:307            'inF1' ( in 4-component vector of float)
 0:308      Sequence
 0:308        move second child to first child ( temp 4-component vector of float)
-0:308          'r047' ( temp 4-component vector of float)
-0:308          max ( temp 4-component vector of float)
+0:308          'r039a' ( temp 4-component vector of float)
+0:308          mix ( temp 4-component vector of float)
 0:308            'inF0' ( in 4-component vector of float)
 0:308            'inF1' ( in 4-component vector of float)
+0:308            'inF2' ( in 4-component vector of float)
 0:309      Sequence
-0:309        move second child to first child ( temp 4-component vector of float)
-0:309          'r048' ( temp 4-component vector of float)
-0:309          min ( temp 4-component vector of float)
+0:309        move second child to first child ( temp float)
+0:309          'r043' ( temp float)
+0:309          length ( temp float)
 0:309            'inF0' ( in 4-component vector of float)
-0:309            'inF1' ( in 4-component vector of float)
 0:310      Sequence
 0:310        move second child to first child ( temp 4-component vector of float)
-0:310          'r049' ( temp 4-component vector of float)
-0:310          normalize ( temp 4-component vector of float)
+0:310          'r044' ( temp 4-component vector of float)
+0:310          log ( temp 4-component vector of float)
 0:310            'inF0' ( in 4-component vector of float)
 0:311      Sequence
 0:311        move second child to first child ( temp 4-component vector of float)
-0:311          'r050' ( temp 4-component vector of float)
-0:311          pow ( temp 4-component vector of float)
-0:311            'inF0' ( in 4-component vector of float)
-0:311            'inF1' ( in 4-component vector of float)
+0:311          'r045' ( temp 4-component vector of float)
+0:311          vector-scale ( temp 4-component vector of float)
+0:311            log2 ( temp 4-component vector of float)
+0:311              'inF0' ( in 4-component vector of float)
+0:311            Constant:
+0:311              0.301030
 0:312      Sequence
 0:312        move second child to first child ( temp 4-component vector of float)
-0:312          'r051' ( temp 4-component vector of float)
-0:312          radians ( temp 4-component vector of float)
+0:312          'r046' ( temp 4-component vector of float)
+0:312          log2 ( temp 4-component vector of float)
 0:312            'inF0' ( in 4-component vector of float)
 0:313      Sequence
 0:313        move second child to first child ( temp 4-component vector of float)
-0:313          'r052' ( temp 4-component vector of float)
-0:313          divide ( temp 4-component vector of float)
-0:313            Constant:
-0:313              1.000000
+0:313          'r047' ( temp 4-component vector of float)
+0:313          max ( temp 4-component vector of float)
 0:313            'inF0' ( in 4-component vector of float)
+0:313            'inF1' ( in 4-component vector of float)
 0:314      Sequence
 0:314        move second child to first child ( temp 4-component vector of float)
-0:314          'r053' ( temp 4-component vector of float)
-0:314          reflect ( temp 4-component vector of float)
+0:314          'r048' ( temp 4-component vector of float)
+0:314          min ( temp 4-component vector of float)
 0:314            'inF0' ( in 4-component vector of float)
 0:314            'inF1' ( in 4-component vector of float)
 0:315      Sequence
 0:315        move second child to first child ( temp 4-component vector of float)
-0:315          'r054' ( temp 4-component vector of float)
-0:315          refract ( temp 4-component vector of float)
+0:315          'r049' ( temp 4-component vector of float)
+0:315          normalize ( temp 4-component vector of float)
 0:315            'inF0' ( in 4-component vector of float)
-0:315            'inF1' ( in 4-component vector of float)
-0:315            Constant:
-0:315              2.000000
 0:316      Sequence
-0:316        move second child to first child ( temp 4-component vector of uint)
-0:316          'r055' ( temp 4-component vector of uint)
+0:316        move second child to first child ( temp 4-component vector of float)
+0:316          'r050' ( temp 4-component vector of float)
+0:316          pow ( temp 4-component vector of float)
+0:316            'inF0' ( in 4-component vector of float)
+0:316            'inF1' ( in 4-component vector of float)
+0:317      Sequence
+0:317        move second child to first child ( temp 4-component vector of float)
+0:317          'r051' ( temp 4-component vector of float)
+0:317          radians ( temp 4-component vector of float)
+0:317            'inF0' ( in 4-component vector of float)
+0:318      Sequence
+0:318        move second child to first child ( temp 4-component vector of float)
+0:318          'r052' ( temp 4-component vector of float)
+0:318          divide ( temp 4-component vector of float)
+0:318            Constant:
+0:318              1.000000
+0:318            'inF0' ( in 4-component vector of float)
+0:319      Sequence
+0:319        move second child to first child ( temp 4-component vector of float)
+0:319          'r053' ( temp 4-component vector of float)
+0:319          reflect ( temp 4-component vector of float)
+0:319            'inF0' ( in 4-component vector of float)
+0:319            'inF1' ( in 4-component vector of float)
+0:320      Sequence
+0:320        move second child to first child ( temp 4-component vector of float)
+0:320          'r054' ( temp 4-component vector of float)
+0:320          refract ( temp 4-component vector of float)
+0:320            'inF0' ( in 4-component vector of float)
+0:320            'inF1' ( in 4-component vector of float)
+0:320            Constant:
+0:320              2.000000
+0:321      Sequence
+0:321        move second child to first child ( temp 4-component vector of uint)
+0:321          'r055' ( temp 4-component vector of uint)
 0:?           bitFieldReverse ( temp 4-component vector of uint)
 0:?             Constant:
 0:?               1 (const uint)
 0:?               2 (const uint)
 0:?               3 (const uint)
 0:?               4 (const uint)
-0:317      Sequence
-0:317        move second child to first child ( temp 4-component vector of float)
-0:317          'r056' ( temp 4-component vector of float)
-0:317          roundEven ( temp 4-component vector of float)
-0:317            'inF0' ( in 4-component vector of float)
-0:318      Sequence
-0:318        move second child to first child ( temp 4-component vector of float)
-0:318          'r057' ( temp 4-component vector of float)
-0:318          inverse sqrt ( temp 4-component vector of float)
-0:318            'inF0' ( in 4-component vector of float)
-0:319      Sequence
-0:319        move second child to first child ( temp 4-component vector of float)
-0:319          'r058' ( temp 4-component vector of float)
-0:319          clamp ( temp 4-component vector of float)
-0:319            'inF0' ( in 4-component vector of float)
-0:319            Constant:
-0:319              0.000000
-0:319            Constant:
-0:319              1.000000
-0:320      Sequence
-0:320        move second child to first child ( temp 4-component vector of float)
-0:320          'r059' ( temp 4-component vector of float)
-0:320          Sign ( temp 4-component vector of float)
-0:320            'inF0' ( in 4-component vector of float)
-0:321      Sequence
-0:321        move second child to first child ( temp 4-component vector of float)
-0:321          'r060' ( temp 4-component vector of float)
-0:321          sine ( temp 4-component vector of float)
-0:321            'inF0' ( in 4-component vector of float)
 0:322      Sequence
 0:322        move second child to first child ( temp 4-component vector of float)
-0:322          'inF1' ( in 4-component vector of float)
-0:322          sine ( temp 4-component vector of float)
-0:322            'inF0' ( in 4-component vector of float)
-0:322        move second child to first child ( temp 4-component vector of float)
-0:322          'inF2' ( in 4-component vector of float)
-0:322          cosine ( temp 4-component vector of float)
+0:322          'r056' ( temp 4-component vector of float)
+0:322          roundEven ( temp 4-component vector of float)
 0:322            'inF0' ( in 4-component vector of float)
 0:323      Sequence
 0:323        move second child to first child ( temp 4-component vector of float)
-0:323          'r061' ( temp 4-component vector of float)
-0:323          hyp. sine ( temp 4-component vector of float)
+0:323          'r057' ( temp 4-component vector of float)
+0:323          inverse sqrt ( temp 4-component vector of float)
 0:323            'inF0' ( in 4-component vector of float)
 0:324      Sequence
 0:324        move second child to first child ( temp 4-component vector of float)
-0:324          'r062' ( temp 4-component vector of float)
-0:324          smoothstep ( temp 4-component vector of float)
+0:324          'r058' ( temp 4-component vector of float)
+0:324          clamp ( temp 4-component vector of float)
 0:324            'inF0' ( in 4-component vector of float)
-0:324            'inF1' ( in 4-component vector of float)
-0:324            'inF2' ( in 4-component vector of float)
+0:324            Constant:
+0:324              0.000000
+0:324            Constant:
+0:324              1.000000
 0:325      Sequence
 0:325        move second child to first child ( temp 4-component vector of float)
-0:325          'r063' ( temp 4-component vector of float)
-0:325          sqrt ( temp 4-component vector of float)
+0:325          'r059' ( temp 4-component vector of float)
+0:325          Sign ( temp 4-component vector of float)
 0:325            'inF0' ( in 4-component vector of float)
 0:326      Sequence
 0:326        move second child to first child ( temp 4-component vector of float)
-0:326          'r064' ( temp 4-component vector of float)
-0:326          step ( temp 4-component vector of float)
+0:326          'r060' ( temp 4-component vector of float)
+0:326          sine ( temp 4-component vector of float)
 0:326            'inF0' ( in 4-component vector of float)
-0:326            'inF1' ( in 4-component vector of float)
 0:327      Sequence
 0:327        move second child to first child ( temp 4-component vector of float)
-0:327          'r065' ( temp 4-component vector of float)
-0:327          tangent ( temp 4-component vector of float)
+0:327          'inF1' ( in 4-component vector of float)
+0:327          sine ( temp 4-component vector of float)
+0:327            'inF0' ( in 4-component vector of float)
+0:327        move second child to first child ( temp 4-component vector of float)
+0:327          'inF2' ( in 4-component vector of float)
+0:327          cosine ( temp 4-component vector of float)
 0:327            'inF0' ( in 4-component vector of float)
 0:328      Sequence
 0:328        move second child to first child ( temp 4-component vector of float)
-0:328          'r066' ( temp 4-component vector of float)
-0:328          hyp. tangent ( temp 4-component vector of float)
+0:328          'r061' ( temp 4-component vector of float)
+0:328          hyp. sine ( temp 4-component vector of float)
 0:328            'inF0' ( in 4-component vector of float)
+0:329      Sequence
+0:329        move second child to first child ( temp 4-component vector of float)
+0:329          'r062' ( temp 4-component vector of float)
+0:329          smoothstep ( temp 4-component vector of float)
+0:329            'inF0' ( in 4-component vector of float)
+0:329            'inF1' ( in 4-component vector of float)
+0:329            'inF2' ( in 4-component vector of float)
 0:330      Sequence
 0:330        move second child to first child ( temp 4-component vector of float)
-0:330          'r067' ( temp 4-component vector of float)
-0:330          trunc ( temp 4-component vector of float)
+0:330          'r063' ( temp 4-component vector of float)
+0:330          sqrt ( temp 4-component vector of float)
 0:330            'inF0' ( in 4-component vector of float)
-0:333      Branch: Return with expression
+0:331      Sequence
+0:331        move second child to first child ( temp 4-component vector of float)
+0:331          'r064' ( temp 4-component vector of float)
+0:331          step ( temp 4-component vector of float)
+0:331            'inF0' ( in 4-component vector of float)
+0:331            'inF1' ( in 4-component vector of float)
+0:332      Sequence
+0:332        move second child to first child ( temp 4-component vector of float)
+0:332          'r065' ( temp 4-component vector of float)
+0:332          tangent ( temp 4-component vector of float)
+0:332            'inF0' ( in 4-component vector of float)
+0:333      Sequence
+0:333        move second child to first child ( temp 4-component vector of float)
+0:333          'r066' ( temp 4-component vector of float)
+0:333          hyp. tangent ( temp 4-component vector of float)
+0:333            'inF0' ( in 4-component vector of float)
+0:335      Sequence
+0:335        move second child to first child ( temp 4-component vector of float)
+0:335          'r067' ( temp 4-component vector of float)
+0:335          trunc ( temp 4-component vector of float)
+0:335            'inF0' ( in 4-component vector of float)
+0:338      Branch: Return with expression
 0:?         Constant:
 0:?           1.000000
 0:?           2.000000
 0:?           3.000000
 0:?           4.000000
-0:396  Function Definition: PixelShaderFunction2x2(mf22;mf22;mf22; ( temp 2X2 matrix of float)
-0:396    Function Parameters: 
-0:396      'inF0' ( in 2X2 matrix of float)
-0:396      'inF1' ( in 2X2 matrix of float)
-0:396      'inF2' ( in 2X2 matrix of float)
+0:401  Function Definition: PixelShaderFunction2x2(mf22;mf22;mf22; ( temp 2X2 matrix of float)
+0:401    Function Parameters: 
+0:401      'inF0' ( in 2X2 matrix of float)
+0:401      'inF1' ( in 2X2 matrix of float)
+0:401      'inF2' ( in 2X2 matrix of float)
 0:?     Sequence
-0:398      Sequence
-0:398        move second child to first child ( temp bool)
-0:398          'r000' ( temp bool)
-0:398          all ( temp bool)
-0:398            'inF0' ( in 2X2 matrix of float)
-0:398      Sequence
-0:398        move second child to first child ( temp 2X2 matrix of float)
-0:398          'r001' ( temp 2X2 matrix of float)
-0:398          Absolute value ( temp 2X2 matrix of float)
-0:398            'inF0' ( in 2X2 matrix of float)
-0:398      arc cosine ( temp 2X2 matrix of float)
-0:398        'inF0' ( in 2X2 matrix of float)
-0:398      Sequence
-0:398        move second child to first child ( temp bool)
-0:398          'r003' ( temp bool)
-0:398          any ( temp bool)
-0:398            'inF0' ( in 2X2 matrix of float)
-0:398      Sequence
-0:398        move second child to first child ( temp 2X2 matrix of float)
-0:398          'r004' ( temp 2X2 matrix of float)
-0:398          arc sine ( temp 2X2 matrix of float)
-0:398            'inF0' ( in 2X2 matrix of float)
-0:398      Sequence
-0:398        move second child to first child ( temp 2X2 matrix of float)
-0:398          'r005' ( temp 2X2 matrix of float)
-0:398          arc tangent ( temp 2X2 matrix of float)
-0:398            'inF0' ( in 2X2 matrix of float)
-0:398      Sequence
-0:398        move second child to first child ( temp 2X2 matrix of float)
-0:398          'r006' ( temp 2X2 matrix of float)
-0:398          arc tangent ( temp 2X2 matrix of float)
-0:398            'inF0' ( in 2X2 matrix of float)
-0:398            'inF1' ( in 2X2 matrix of float)
-0:398      Sequence
-0:398        move second child to first child ( temp 2X2 matrix of float)
-0:398          'r007' ( temp 2X2 matrix of float)
-0:398          Ceiling ( temp 2X2 matrix of float)
-0:398            'inF0' ( in 2X2 matrix of float)
-0:398      Test condition and select ( temp void)
-0:398        Condition
-0:398        any ( temp bool)
-0:398          Compare Less Than ( temp 2X2 matrix of bool)
-0:398            'inF0' ( in 2X2 matrix of float)
-0:398            Constant:
-0:398              0.000000
-0:398              0.000000
-0:398              0.000000
-0:398              0.000000
-0:398        true case
-0:398        Branch: Kill
-0:398      Sequence
-0:398        move second child to first child ( temp 2X2 matrix of float)
-0:398          'r008' ( temp 2X2 matrix of float)
-0:398          clamp ( temp 2X2 matrix of float)
-0:398            'inF0' ( in 2X2 matrix of float)
-0:398            'inF1' ( in 2X2 matrix of float)
-0:398            'inF2' ( in 2X2 matrix of float)
-0:398      Sequence
-0:398        move second child to first child ( temp 2X2 matrix of float)
-0:398          'r009' ( temp 2X2 matrix of float)
-0:398          cosine ( temp 2X2 matrix of float)
-0:398            'inF0' ( in 2X2 matrix of float)
-0:398      Sequence
-0:398        move second child to first child ( temp 2X2 matrix of float)
-0:398          'r010' ( temp 2X2 matrix of float)
-0:398          hyp. cosine ( temp 2X2 matrix of float)
-0:398            'inF0' ( in 2X2 matrix of float)
-0:398      Sequence
-0:398        move second child to first child ( temp 2X2 matrix of float)
-0:398          'r011' ( temp 2X2 matrix of float)
-0:398          dPdx ( temp 2X2 matrix of float)
-0:398            'inF0' ( in 2X2 matrix of float)
-0:398      Sequence
-0:398        move second child to first child ( temp 2X2 matrix of float)
-0:398          'r012' ( temp 2X2 matrix of float)
-0:398          dPdxCoarse ( temp 2X2 matrix of float)
-0:398            'inF0' ( in 2X2 matrix of float)
-0:398      Sequence
-0:398        move second child to first child ( temp 2X2 matrix of float)
-0:398          'r013' ( temp 2X2 matrix of float)
-0:398          dPdxFine ( temp 2X2 matrix of float)
-0:398            'inF0' ( in 2X2 matrix of float)
-0:398      Sequence
-0:398        move second child to first child ( temp 2X2 matrix of float)
-0:398          'r014' ( temp 2X2 matrix of float)
-0:398          dPdy ( temp 2X2 matrix of float)
-0:398            'inF0' ( in 2X2 matrix of float)
-0:398      Sequence
-0:398        move second child to first child ( temp 2X2 matrix of float)
-0:398          'r015' ( temp 2X2 matrix of float)
-0:398          dPdyCoarse ( temp 2X2 matrix of float)
-0:398            'inF0' ( in 2X2 matrix of float)
-0:398      Sequence
-0:398        move second child to first child ( temp 2X2 matrix of float)
-0:398          'r016' ( temp 2X2 matrix of float)
-0:398          dPdyFine ( temp 2X2 matrix of float)
-0:398            'inF0' ( in 2X2 matrix of float)
-0:398      Sequence
-0:398        move second child to first child ( temp 2X2 matrix of float)
-0:398          'r017' ( temp 2X2 matrix of float)
-0:398          degrees ( temp 2X2 matrix of float)
-0:398            'inF0' ( in 2X2 matrix of float)
-0:398      Sequence
-0:398        move second child to first child ( temp float)
-0:398          'r018' ( temp float)
-0:398          determinant ( temp float)
-0:398            'inF0' ( in 2X2 matrix of float)
-0:398      Sequence
-0:398        move second child to first child ( temp 2X2 matrix of float)
-0:398          'r019' ( temp 2X2 matrix of float)
-0:398          exp ( temp 2X2 matrix of float)
-0:398            'inF0' ( in 2X2 matrix of float)
-0:398      Sequence
-0:398        move second child to first child ( temp 2X2 matrix of float)
-0:398          'R020' ( temp 2X2 matrix of float)
-0:398          exp2 ( temp 2X2 matrix of float)
-0:398            'inF0' ( in 2X2 matrix of float)
-0:398      Sequence
-0:398        move second child to first child ( temp 2X2 matrix of float)
-0:398          'r021' ( temp 2X2 matrix of float)
-0:398          Floor ( temp 2X2 matrix of float)
-0:398            'inF0' ( in 2X2 matrix of float)
-0:398      Sequence
-0:398        move second child to first child ( temp 2X2 matrix of float)
-0:398          'r022' ( temp 2X2 matrix of float)
-0:398          mod ( temp 2X2 matrix of float)
-0:398            'inF0' ( in 2X2 matrix of float)
-0:398            'inF1' ( in 2X2 matrix of float)
-0:398      Sequence
-0:398        move second child to first child ( temp 2X2 matrix of float)
-0:398          'r023' ( temp 2X2 matrix of float)
-0:398          Fraction ( temp 2X2 matrix of float)
-0:398            'inF0' ( in 2X2 matrix of float)
-0:398      Sequence
-0:398        move second child to first child ( temp 2X2 matrix of float)
-0:398          'r025' ( temp 2X2 matrix of float)
-0:398          fwidth ( temp 2X2 matrix of float)
-0:398            'inF0' ( in 2X2 matrix of float)
-0:398      Sequence
-0:398        move second child to first child ( temp 2X2 matrix of float)
-0:398          'r026' ( temp 2X2 matrix of float)
-0:398          ldexp ( temp 2X2 matrix of float)
-0:398            'inF0' ( in 2X2 matrix of float)
-0:398            'inF1' ( in 2X2 matrix of float)
-0:398      Sequence
-0:398        move second child to first child ( temp 2X2 matrix of float)
-0:398          'r026a' ( temp 2X2 matrix of float)
-0:398          mix ( temp 2X2 matrix of float)
-0:398            'inF0' ( in 2X2 matrix of float)
-0:398            'inF1' ( in 2X2 matrix of float)
-0:398            'inF2' ( in 2X2 matrix of float)
-0:398      Sequence
-0:398        move second child to first child ( temp 2X2 matrix of float)
-0:398          'r027' ( temp 2X2 matrix of float)
-0:398          log ( temp 2X2 matrix of float)
-0:398            'inF0' ( in 2X2 matrix of float)
-0:398      Sequence
-0:398        move second child to first child ( temp 2X2 matrix of float)
-0:398          'r028' ( temp 2X2 matrix of float)
-0:398          matrix-scale ( temp 2X2 matrix of float)
-0:398            log2 ( temp 2X2 matrix of float)
-0:398              'inF0' ( in 2X2 matrix of float)
-0:398            Constant:
-0:398              0.301030
-0:398      Sequence
-0:398        move second child to first child ( temp 2X2 matrix of float)
-0:398          'r029' ( temp 2X2 matrix of float)
-0:398          log2 ( temp 2X2 matrix of float)
-0:398            'inF0' ( in 2X2 matrix of float)
-0:398      Sequence
-0:398        move second child to first child ( temp 2X2 matrix of float)
-0:398          'r030' ( temp 2X2 matrix of float)
-0:398          max ( temp 2X2 matrix of float)
-0:398            'inF0' ( in 2X2 matrix of float)
-0:398            'inF1' ( in 2X2 matrix of float)
-0:398      Sequence
-0:398        move second child to first child ( temp 2X2 matrix of float)
-0:398          'r031' ( temp 2X2 matrix of float)
-0:398          min ( temp 2X2 matrix of float)
-0:398            'inF0' ( in 2X2 matrix of float)
-0:398            'inF1' ( in 2X2 matrix of float)
-0:398      Sequence
-0:398        move second child to first child ( temp 2X2 matrix of float)
-0:398          'r032' ( temp 2X2 matrix of float)
-0:398          pow ( temp 2X2 matrix of float)
-0:398            'inF0' ( in 2X2 matrix of float)
-0:398            'inF1' ( in 2X2 matrix of float)
-0:398      Sequence
-0:398        move second child to first child ( temp 2X2 matrix of float)
-0:398          'r033' ( temp 2X2 matrix of float)
-0:398          radians ( temp 2X2 matrix of float)
-0:398            'inF0' ( in 2X2 matrix of float)
-0:398      Sequence
-0:398        move second child to first child ( temp 2X2 matrix of float)
-0:398          'r034' ( temp 2X2 matrix of float)
-0:398          roundEven ( temp 2X2 matrix of float)
-0:398            'inF0' ( in 2X2 matrix of float)
-0:398      Sequence
-0:398        move second child to first child ( temp 2X2 matrix of float)
-0:398          'r035' ( temp 2X2 matrix of float)
-0:398          inverse sqrt ( temp 2X2 matrix of float)
-0:398            'inF0' ( in 2X2 matrix of float)
-0:398      Sequence
-0:398        move second child to first child ( temp 2X2 matrix of float)
-0:398          'r036' ( temp 2X2 matrix of float)
-0:398          clamp ( temp 2X2 matrix of float)
-0:398            'inF0' ( in 2X2 matrix of float)
-0:398            Constant:
-0:398              0.000000
-0:398            Constant:
-0:398              1.000000
-0:398      Sequence
-0:398        move second child to first child ( temp 2X2 matrix of float)
-0:398          'r037' ( temp 2X2 matrix of float)
-0:398          Sign ( temp 2X2 matrix of float)
-0:398            'inF0' ( in 2X2 matrix of float)
-0:398      Sequence
-0:398        move second child to first child ( temp 2X2 matrix of float)
-0:398          'r038' ( temp 2X2 matrix of float)
-0:398          sine ( temp 2X2 matrix of float)
-0:398            'inF0' ( in 2X2 matrix of float)
-0:398      Sequence
-0:398        move second child to first child ( temp 2X2 matrix of float)
-0:398          'inF1' ( in 2X2 matrix of float)
-0:398          sine ( temp 2X2 matrix of float)
-0:398            'inF0' ( in 2X2 matrix of float)
-0:398        move second child to first child ( temp 2X2 matrix of float)
-0:398          'inF2' ( in 2X2 matrix of float)
-0:398          cosine ( temp 2X2 matrix of float)
-0:398            'inF0' ( in 2X2 matrix of float)
-0:398      Sequence
-0:398        move second child to first child ( temp 2X2 matrix of float)
-0:398          'r039' ( temp 2X2 matrix of float)
-0:398          hyp. sine ( temp 2X2 matrix of float)
-0:398            'inF0' ( in 2X2 matrix of float)
-0:398      Sequence
-0:398        move second child to first child ( temp 2X2 matrix of float)
-0:398          'r049' ( temp 2X2 matrix of float)
-0:398          smoothstep ( temp 2X2 matrix of float)
-0:398            'inF0' ( in 2X2 matrix of float)
-0:398            'inF1' ( in 2X2 matrix of float)
-0:398            'inF2' ( in 2X2 matrix of float)
-0:398      Sequence
-0:398        move second child to first child ( temp 2X2 matrix of float)
-0:398          'r041' ( temp 2X2 matrix of float)
-0:398          sqrt ( temp 2X2 matrix of float)
-0:398            'inF0' ( in 2X2 matrix of float)
-0:398      Sequence
-0:398        move second child to first child ( temp 2X2 matrix of float)
-0:398          'r042' ( temp 2X2 matrix of float)
-0:398          step ( temp 2X2 matrix of float)
-0:398            'inF0' ( in 2X2 matrix of float)
-0:398            'inF1' ( in 2X2 matrix of float)
-0:398      Sequence
-0:398        move second child to first child ( temp 2X2 matrix of float)
-0:398          'r043' ( temp 2X2 matrix of float)
-0:398          tangent ( temp 2X2 matrix of float)
-0:398            'inF0' ( in 2X2 matrix of float)
-0:398      Sequence
-0:398        move second child to first child ( temp 2X2 matrix of float)
-0:398          'r044' ( temp 2X2 matrix of float)
-0:398          hyp. tangent ( temp 2X2 matrix of float)
-0:398            'inF0' ( in 2X2 matrix of float)
-0:398      transpose ( temp 2X2 matrix of float)
-0:398        'inF0' ( in 2X2 matrix of float)
-0:398      Sequence
-0:398        move second child to first child ( temp 2X2 matrix of float)
-0:398          'r046' ( temp 2X2 matrix of float)
-0:398          trunc ( temp 2X2 matrix of float)
-0:398            'inF0' ( in 2X2 matrix of float)
-0:401      Branch: Return with expression
+0:403      Sequence
+0:403        move second child to first child ( temp bool)
+0:403          'r000' ( temp bool)
+0:403          all ( temp bool)
+0:403            Convert float to bool ( temp 2X2 matrix of bool)
+0:403              'inF0' ( in 2X2 matrix of float)
+0:403      Sequence
+0:403        move second child to first child ( temp 2X2 matrix of float)
+0:403          'r001' ( temp 2X2 matrix of float)
+0:403          Absolute value ( temp 2X2 matrix of float)
+0:403            'inF0' ( in 2X2 matrix of float)
+0:403      arc cosine ( temp 2X2 matrix of float)
+0:403        'inF0' ( in 2X2 matrix of float)
+0:403      Sequence
+0:403        move second child to first child ( temp bool)
+0:403          'r003' ( temp bool)
+0:403          any ( temp bool)
+0:403            Convert float to bool ( temp 2X2 matrix of bool)
+0:403              'inF0' ( in 2X2 matrix of float)
+0:403      Sequence
+0:403        move second child to first child ( temp 2X2 matrix of float)
+0:403          'r004' ( temp 2X2 matrix of float)
+0:403          arc sine ( temp 2X2 matrix of float)
+0:403            'inF0' ( in 2X2 matrix of float)
+0:403      Sequence
+0:403        move second child to first child ( temp 2X2 matrix of float)
+0:403          'r005' ( temp 2X2 matrix of float)
+0:403          arc tangent ( temp 2X2 matrix of float)
+0:403            'inF0' ( in 2X2 matrix of float)
+0:403      Sequence
+0:403        move second child to first child ( temp 2X2 matrix of float)
+0:403          'r006' ( temp 2X2 matrix of float)
+0:403          arc tangent ( temp 2X2 matrix of float)
+0:403            'inF0' ( in 2X2 matrix of float)
+0:403            'inF1' ( in 2X2 matrix of float)
+0:403      Sequence
+0:403        move second child to first child ( temp 2X2 matrix of float)
+0:403          'r007' ( temp 2X2 matrix of float)
+0:403          Ceiling ( temp 2X2 matrix of float)
+0:403            'inF0' ( in 2X2 matrix of float)
+0:403      Test condition and select ( temp void)
+0:403        Condition
+0:403        any ( temp bool)
+0:403          Compare Less Than ( temp 2X2 matrix of bool)
+0:403            'inF0' ( in 2X2 matrix of float)
+0:403            Constant:
+0:403              0.000000
+0:403              0.000000
+0:403              0.000000
+0:403              0.000000
+0:403        true case
+0:403        Branch: Kill
+0:403      Sequence
+0:403        move second child to first child ( temp 2X2 matrix of float)
+0:403          'r008' ( temp 2X2 matrix of float)
+0:403          clamp ( temp 2X2 matrix of float)
+0:403            'inF0' ( in 2X2 matrix of float)
+0:403            'inF1' ( in 2X2 matrix of float)
+0:403            'inF2' ( in 2X2 matrix of float)
+0:403      Sequence
+0:403        move second child to first child ( temp 2X2 matrix of float)
+0:403          'r009' ( temp 2X2 matrix of float)
+0:403          cosine ( temp 2X2 matrix of float)
+0:403            'inF0' ( in 2X2 matrix of float)
+0:403      Sequence
+0:403        move second child to first child ( temp 2X2 matrix of float)
+0:403          'r010' ( temp 2X2 matrix of float)
+0:403          hyp. cosine ( temp 2X2 matrix of float)
+0:403            'inF0' ( in 2X2 matrix of float)
+0:403      Sequence
+0:403        move second child to first child ( temp 2X2 matrix of float)
+0:403          'r011' ( temp 2X2 matrix of float)
+0:403          dPdx ( temp 2X2 matrix of float)
+0:403            'inF0' ( in 2X2 matrix of float)
+0:403      Sequence
+0:403        move second child to first child ( temp 2X2 matrix of float)
+0:403          'r012' ( temp 2X2 matrix of float)
+0:403          dPdxCoarse ( temp 2X2 matrix of float)
+0:403            'inF0' ( in 2X2 matrix of float)
+0:403      Sequence
+0:403        move second child to first child ( temp 2X2 matrix of float)
+0:403          'r013' ( temp 2X2 matrix of float)
+0:403          dPdxFine ( temp 2X2 matrix of float)
+0:403            'inF0' ( in 2X2 matrix of float)
+0:403      Sequence
+0:403        move second child to first child ( temp 2X2 matrix of float)
+0:403          'r014' ( temp 2X2 matrix of float)
+0:403          dPdy ( temp 2X2 matrix of float)
+0:403            'inF0' ( in 2X2 matrix of float)
+0:403      Sequence
+0:403        move second child to first child ( temp 2X2 matrix of float)
+0:403          'r015' ( temp 2X2 matrix of float)
+0:403          dPdyCoarse ( temp 2X2 matrix of float)
+0:403            'inF0' ( in 2X2 matrix of float)
+0:403      Sequence
+0:403        move second child to first child ( temp 2X2 matrix of float)
+0:403          'r016' ( temp 2X2 matrix of float)
+0:403          dPdyFine ( temp 2X2 matrix of float)
+0:403            'inF0' ( in 2X2 matrix of float)
+0:403      Sequence
+0:403        move second child to first child ( temp 2X2 matrix of float)
+0:403          'r017' ( temp 2X2 matrix of float)
+0:403          degrees ( temp 2X2 matrix of float)
+0:403            'inF0' ( in 2X2 matrix of float)
+0:403      Sequence
+0:403        move second child to first child ( temp float)
+0:403          'r018' ( temp float)
+0:403          determinant ( temp float)
+0:403            'inF0' ( in 2X2 matrix of float)
+0:403      Sequence
+0:403        move second child to first child ( temp 2X2 matrix of float)
+0:403          'r019' ( temp 2X2 matrix of float)
+0:403          exp ( temp 2X2 matrix of float)
+0:403            'inF0' ( in 2X2 matrix of float)
+0:403      Sequence
+0:403        move second child to first child ( temp 2X2 matrix of float)
+0:403          'R020' ( temp 2X2 matrix of float)
+0:403          exp2 ( temp 2X2 matrix of float)
+0:403            'inF0' ( in 2X2 matrix of float)
+0:403      Sequence
+0:403        move second child to first child ( temp 2X2 matrix of float)
+0:403          'r021' ( temp 2X2 matrix of float)
+0:403          Floor ( temp 2X2 matrix of float)
+0:403            'inF0' ( in 2X2 matrix of float)
+0:403      Sequence
+0:403        move second child to first child ( temp 2X2 matrix of float)
+0:403          'r022' ( temp 2X2 matrix of float)
+0:403          mod ( temp 2X2 matrix of float)
+0:403            'inF0' ( in 2X2 matrix of float)
+0:403            'inF1' ( in 2X2 matrix of float)
+0:403      Sequence
+0:403        move second child to first child ( temp 2X2 matrix of float)
+0:403          'r023' ( temp 2X2 matrix of float)
+0:403          Fraction ( temp 2X2 matrix of float)
+0:403            'inF0' ( in 2X2 matrix of float)
+0:403      Sequence
+0:403        move second child to first child ( temp 2X2 matrix of float)
+0:403          'r025' ( temp 2X2 matrix of float)
+0:403          fwidth ( temp 2X2 matrix of float)
+0:403            'inF0' ( in 2X2 matrix of float)
+0:403      Sequence
+0:403        move second child to first child ( temp 2X2 matrix of float)
+0:403          'r026' ( temp 2X2 matrix of float)
+0:403          ldexp ( temp 2X2 matrix of float)
+0:403            'inF0' ( in 2X2 matrix of float)
+0:403            'inF1' ( in 2X2 matrix of float)
+0:403      Sequence
+0:403        move second child to first child ( temp 2X2 matrix of float)
+0:403          'r026a' ( temp 2X2 matrix of float)
+0:403          mix ( temp 2X2 matrix of float)
+0:403            'inF0' ( in 2X2 matrix of float)
+0:403            'inF1' ( in 2X2 matrix of float)
+0:403            'inF2' ( in 2X2 matrix of float)
+0:403      Sequence
+0:403        move second child to first child ( temp 2X2 matrix of float)
+0:403          'r027' ( temp 2X2 matrix of float)
+0:403          log ( temp 2X2 matrix of float)
+0:403            'inF0' ( in 2X2 matrix of float)
+0:403      Sequence
+0:403        move second child to first child ( temp 2X2 matrix of float)
+0:403          'r028' ( temp 2X2 matrix of float)
+0:403          matrix-scale ( temp 2X2 matrix of float)
+0:403            log2 ( temp 2X2 matrix of float)
+0:403              'inF0' ( in 2X2 matrix of float)
+0:403            Constant:
+0:403              0.301030
+0:403      Sequence
+0:403        move second child to first child ( temp 2X2 matrix of float)
+0:403          'r029' ( temp 2X2 matrix of float)
+0:403          log2 ( temp 2X2 matrix of float)
+0:403            'inF0' ( in 2X2 matrix of float)
+0:403      Sequence
+0:403        move second child to first child ( temp 2X2 matrix of float)
+0:403          'r030' ( temp 2X2 matrix of float)
+0:403          max ( temp 2X2 matrix of float)
+0:403            'inF0' ( in 2X2 matrix of float)
+0:403            'inF1' ( in 2X2 matrix of float)
+0:403      Sequence
+0:403        move second child to first child ( temp 2X2 matrix of float)
+0:403          'r031' ( temp 2X2 matrix of float)
+0:403          min ( temp 2X2 matrix of float)
+0:403            'inF0' ( in 2X2 matrix of float)
+0:403            'inF1' ( in 2X2 matrix of float)
+0:403      Sequence
+0:403        move second child to first child ( temp 2X2 matrix of float)
+0:403          'r032' ( temp 2X2 matrix of float)
+0:403          pow ( temp 2X2 matrix of float)
+0:403            'inF0' ( in 2X2 matrix of float)
+0:403            'inF1' ( in 2X2 matrix of float)
+0:403      Sequence
+0:403        move second child to first child ( temp 2X2 matrix of float)
+0:403          'r033' ( temp 2X2 matrix of float)
+0:403          radians ( temp 2X2 matrix of float)
+0:403            'inF0' ( in 2X2 matrix of float)
+0:403      Sequence
+0:403        move second child to first child ( temp 2X2 matrix of float)
+0:403          'r034' ( temp 2X2 matrix of float)
+0:403          roundEven ( temp 2X2 matrix of float)
+0:403            'inF0' ( in 2X2 matrix of float)
+0:403      Sequence
+0:403        move second child to first child ( temp 2X2 matrix of float)
+0:403          'r035' ( temp 2X2 matrix of float)
+0:403          inverse sqrt ( temp 2X2 matrix of float)
+0:403            'inF0' ( in 2X2 matrix of float)
+0:403      Sequence
+0:403        move second child to first child ( temp 2X2 matrix of float)
+0:403          'r036' ( temp 2X2 matrix of float)
+0:403          clamp ( temp 2X2 matrix of float)
+0:403            'inF0' ( in 2X2 matrix of float)
+0:403            Constant:
+0:403              0.000000
+0:403            Constant:
+0:403              1.000000
+0:403      Sequence
+0:403        move second child to first child ( temp 2X2 matrix of float)
+0:403          'r037' ( temp 2X2 matrix of float)
+0:403          Sign ( temp 2X2 matrix of float)
+0:403            'inF0' ( in 2X2 matrix of float)
+0:403      Sequence
+0:403        move second child to first child ( temp 2X2 matrix of float)
+0:403          'r038' ( temp 2X2 matrix of float)
+0:403          sine ( temp 2X2 matrix of float)
+0:403            'inF0' ( in 2X2 matrix of float)
+0:403      Sequence
+0:403        move second child to first child ( temp 2X2 matrix of float)
+0:403          'inF1' ( in 2X2 matrix of float)
+0:403          sine ( temp 2X2 matrix of float)
+0:403            'inF0' ( in 2X2 matrix of float)
+0:403        move second child to first child ( temp 2X2 matrix of float)
+0:403          'inF2' ( in 2X2 matrix of float)
+0:403          cosine ( temp 2X2 matrix of float)
+0:403            'inF0' ( in 2X2 matrix of float)
+0:403      Sequence
+0:403        move second child to first child ( temp 2X2 matrix of float)
+0:403          'r039' ( temp 2X2 matrix of float)
+0:403          hyp. sine ( temp 2X2 matrix of float)
+0:403            'inF0' ( in 2X2 matrix of float)
+0:403      Sequence
+0:403        move second child to first child ( temp 2X2 matrix of float)
+0:403          'r049' ( temp 2X2 matrix of float)
+0:403          smoothstep ( temp 2X2 matrix of float)
+0:403            'inF0' ( in 2X2 matrix of float)
+0:403            'inF1' ( in 2X2 matrix of float)
+0:403            'inF2' ( in 2X2 matrix of float)
+0:403      Sequence
+0:403        move second child to first child ( temp 2X2 matrix of float)
+0:403          'r041' ( temp 2X2 matrix of float)
+0:403          sqrt ( temp 2X2 matrix of float)
+0:403            'inF0' ( in 2X2 matrix of float)
+0:403      Sequence
+0:403        move second child to first child ( temp 2X2 matrix of float)
+0:403          'r042' ( temp 2X2 matrix of float)
+0:403          step ( temp 2X2 matrix of float)
+0:403            'inF0' ( in 2X2 matrix of float)
+0:403            'inF1' ( in 2X2 matrix of float)
+0:403      Sequence
+0:403        move second child to first child ( temp 2X2 matrix of float)
+0:403          'r043' ( temp 2X2 matrix of float)
+0:403          tangent ( temp 2X2 matrix of float)
+0:403            'inF0' ( in 2X2 matrix of float)
+0:403      Sequence
+0:403        move second child to first child ( temp 2X2 matrix of float)
+0:403          'r044' ( temp 2X2 matrix of float)
+0:403          hyp. tangent ( temp 2X2 matrix of float)
+0:403            'inF0' ( in 2X2 matrix of float)
+0:403      transpose ( temp 2X2 matrix of float)
+0:403        'inF0' ( in 2X2 matrix of float)
+0:403      Sequence
+0:403        move second child to first child ( temp 2X2 matrix of float)
+0:403          'r046' ( temp 2X2 matrix of float)
+0:403          trunc ( temp 2X2 matrix of float)
+0:403            'inF0' ( in 2X2 matrix of float)
+0:406      Branch: Return with expression
 0:?         Constant:
 0:?           2.000000
 0:?           2.000000
 0:?           2.000000
 0:?           2.000000
-0:405  Function Definition: PixelShaderFunction3x3(mf33;mf33;mf33; ( temp 3X3 matrix of float)
-0:405    Function Parameters: 
-0:405      'inF0' ( in 3X3 matrix of float)
-0:405      'inF1' ( in 3X3 matrix of float)
-0:405      'inF2' ( in 3X3 matrix of float)
+0:410  Function Definition: PixelShaderFunction3x3(mf33;mf33;mf33; ( temp 3X3 matrix of float)
+0:410    Function Parameters: 
+0:410      'inF0' ( in 3X3 matrix of float)
+0:410      'inF1' ( in 3X3 matrix of float)
+0:410      'inF2' ( in 3X3 matrix of float)
 0:?     Sequence
-0:407      Sequence
-0:407        move second child to first child ( temp bool)
-0:407          'r000' ( temp bool)
-0:407          all ( temp bool)
-0:407            'inF0' ( in 3X3 matrix of float)
-0:407      Sequence
-0:407        move second child to first child ( temp 3X3 matrix of float)
-0:407          'r001' ( temp 3X3 matrix of float)
-0:407          Absolute value ( temp 3X3 matrix of float)
-0:407            'inF0' ( in 3X3 matrix of float)
-0:407      arc cosine ( temp 3X3 matrix of float)
-0:407        'inF0' ( in 3X3 matrix of float)
-0:407      Sequence
-0:407        move second child to first child ( temp bool)
-0:407          'r003' ( temp bool)
-0:407          any ( temp bool)
-0:407            'inF0' ( in 3X3 matrix of float)
-0:407      Sequence
-0:407        move second child to first child ( temp 3X3 matrix of float)
-0:407          'r004' ( temp 3X3 matrix of float)
-0:407          arc sine ( temp 3X3 matrix of float)
-0:407            'inF0' ( in 3X3 matrix of float)
-0:407      Sequence
-0:407        move second child to first child ( temp 3X3 matrix of float)
-0:407          'r005' ( temp 3X3 matrix of float)
-0:407          arc tangent ( temp 3X3 matrix of float)
-0:407            'inF0' ( in 3X3 matrix of float)
-0:407      Sequence
-0:407        move second child to first child ( temp 3X3 matrix of float)
-0:407          'r006' ( temp 3X3 matrix of float)
-0:407          arc tangent ( temp 3X3 matrix of float)
-0:407            'inF0' ( in 3X3 matrix of float)
-0:407            'inF1' ( in 3X3 matrix of float)
-0:407      Sequence
-0:407        move second child to first child ( temp 3X3 matrix of float)
-0:407          'r007' ( temp 3X3 matrix of float)
-0:407          Ceiling ( temp 3X3 matrix of float)
-0:407            'inF0' ( in 3X3 matrix of float)
-0:407      Test condition and select ( temp void)
-0:407        Condition
-0:407        any ( temp bool)
-0:407          Compare Less Than ( temp 3X3 matrix of bool)
-0:407            'inF0' ( in 3X3 matrix of float)
-0:407            Constant:
-0:407              0.000000
-0:407              0.000000
-0:407              0.000000
-0:407              0.000000
-0:407              0.000000
-0:407              0.000000
-0:407              0.000000
-0:407              0.000000
-0:407              0.000000
-0:407        true case
-0:407        Branch: Kill
-0:407      Sequence
-0:407        move second child to first child ( temp 3X3 matrix of float)
-0:407          'r008' ( temp 3X3 matrix of float)
-0:407          clamp ( temp 3X3 matrix of float)
-0:407            'inF0' ( in 3X3 matrix of float)
-0:407            'inF1' ( in 3X3 matrix of float)
-0:407            'inF2' ( in 3X3 matrix of float)
-0:407      Sequence
-0:407        move second child to first child ( temp 3X3 matrix of float)
-0:407          'r009' ( temp 3X3 matrix of float)
-0:407          cosine ( temp 3X3 matrix of float)
-0:407            'inF0' ( in 3X3 matrix of float)
-0:407      Sequence
-0:407        move second child to first child ( temp 3X3 matrix of float)
-0:407          'r010' ( temp 3X3 matrix of float)
-0:407          hyp. cosine ( temp 3X3 matrix of float)
-0:407            'inF0' ( in 3X3 matrix of float)
-0:407      Sequence
-0:407        move second child to first child ( temp 3X3 matrix of float)
-0:407          'r011' ( temp 3X3 matrix of float)
-0:407          dPdx ( temp 3X3 matrix of float)
-0:407            'inF0' ( in 3X3 matrix of float)
-0:407      Sequence
-0:407        move second child to first child ( temp 3X3 matrix of float)
-0:407          'r012' ( temp 3X3 matrix of float)
-0:407          dPdxCoarse ( temp 3X3 matrix of float)
-0:407            'inF0' ( in 3X3 matrix of float)
-0:407      Sequence
-0:407        move second child to first child ( temp 3X3 matrix of float)
-0:407          'r013' ( temp 3X3 matrix of float)
-0:407          dPdxFine ( temp 3X3 matrix of float)
-0:407            'inF0' ( in 3X3 matrix of float)
-0:407      Sequence
-0:407        move second child to first child ( temp 3X3 matrix of float)
-0:407          'r014' ( temp 3X3 matrix of float)
-0:407          dPdy ( temp 3X3 matrix of float)
-0:407            'inF0' ( in 3X3 matrix of float)
-0:407      Sequence
-0:407        move second child to first child ( temp 3X3 matrix of float)
-0:407          'r015' ( temp 3X3 matrix of float)
-0:407          dPdyCoarse ( temp 3X3 matrix of float)
-0:407            'inF0' ( in 3X3 matrix of float)
-0:407      Sequence
-0:407        move second child to first child ( temp 3X3 matrix of float)
-0:407          'r016' ( temp 3X3 matrix of float)
-0:407          dPdyFine ( temp 3X3 matrix of float)
-0:407            'inF0' ( in 3X3 matrix of float)
-0:407      Sequence
-0:407        move second child to first child ( temp 3X3 matrix of float)
-0:407          'r017' ( temp 3X3 matrix of float)
-0:407          degrees ( temp 3X3 matrix of float)
-0:407            'inF0' ( in 3X3 matrix of float)
-0:407      Sequence
-0:407        move second child to first child ( temp float)
-0:407          'r018' ( temp float)
-0:407          determinant ( temp float)
-0:407            'inF0' ( in 3X3 matrix of float)
-0:407      Sequence
-0:407        move second child to first child ( temp 3X3 matrix of float)
-0:407          'r019' ( temp 3X3 matrix of float)
-0:407          exp ( temp 3X3 matrix of float)
-0:407            'inF0' ( in 3X3 matrix of float)
-0:407      Sequence
-0:407        move second child to first child ( temp 3X3 matrix of float)
-0:407          'R020' ( temp 3X3 matrix of float)
-0:407          exp2 ( temp 3X3 matrix of float)
-0:407            'inF0' ( in 3X3 matrix of float)
-0:407      Sequence
-0:407        move second child to first child ( temp 3X3 matrix of float)
-0:407          'r021' ( temp 3X3 matrix of float)
-0:407          Floor ( temp 3X3 matrix of float)
-0:407            'inF0' ( in 3X3 matrix of float)
-0:407      Sequence
-0:407        move second child to first child ( temp 3X3 matrix of float)
-0:407          'r022' ( temp 3X3 matrix of float)
-0:407          mod ( temp 3X3 matrix of float)
-0:407            'inF0' ( in 3X3 matrix of float)
-0:407            'inF1' ( in 3X3 matrix of float)
-0:407      Sequence
-0:407        move second child to first child ( temp 3X3 matrix of float)
-0:407          'r023' ( temp 3X3 matrix of float)
-0:407          Fraction ( temp 3X3 matrix of float)
-0:407            'inF0' ( in 3X3 matrix of float)
-0:407      Sequence
-0:407        move second child to first child ( temp 3X3 matrix of float)
-0:407          'r025' ( temp 3X3 matrix of float)
-0:407          fwidth ( temp 3X3 matrix of float)
-0:407            'inF0' ( in 3X3 matrix of float)
-0:407      Sequence
-0:407        move second child to first child ( temp 3X3 matrix of float)
-0:407          'r026' ( temp 3X3 matrix of float)
-0:407          ldexp ( temp 3X3 matrix of float)
-0:407            'inF0' ( in 3X3 matrix of float)
-0:407            'inF1' ( in 3X3 matrix of float)
-0:407      Sequence
-0:407        move second child to first child ( temp 3X3 matrix of float)
-0:407          'r026a' ( temp 3X3 matrix of float)
-0:407          mix ( temp 3X3 matrix of float)
-0:407            'inF0' ( in 3X3 matrix of float)
-0:407            'inF1' ( in 3X3 matrix of float)
-0:407            'inF2' ( in 3X3 matrix of float)
-0:407      Sequence
-0:407        move second child to first child ( temp 3X3 matrix of float)
-0:407          'r027' ( temp 3X3 matrix of float)
-0:407          log ( temp 3X3 matrix of float)
-0:407            'inF0' ( in 3X3 matrix of float)
-0:407      Sequence
-0:407        move second child to first child ( temp 3X3 matrix of float)
-0:407          'r028' ( temp 3X3 matrix of float)
-0:407          matrix-scale ( temp 3X3 matrix of float)
-0:407            log2 ( temp 3X3 matrix of float)
-0:407              'inF0' ( in 3X3 matrix of float)
-0:407            Constant:
-0:407              0.301030
-0:407      Sequence
-0:407        move second child to first child ( temp 3X3 matrix of float)
-0:407          'r029' ( temp 3X3 matrix of float)
-0:407          log2 ( temp 3X3 matrix of float)
-0:407            'inF0' ( in 3X3 matrix of float)
-0:407      Sequence
-0:407        move second child to first child ( temp 3X3 matrix of float)
-0:407          'r030' ( temp 3X3 matrix of float)
-0:407          max ( temp 3X3 matrix of float)
-0:407            'inF0' ( in 3X3 matrix of float)
-0:407            'inF1' ( in 3X3 matrix of float)
-0:407      Sequence
-0:407        move second child to first child ( temp 3X3 matrix of float)
-0:407          'r031' ( temp 3X3 matrix of float)
-0:407          min ( temp 3X3 matrix of float)
-0:407            'inF0' ( in 3X3 matrix of float)
-0:407            'inF1' ( in 3X3 matrix of float)
-0:407      Sequence
-0:407        move second child to first child ( temp 3X3 matrix of float)
-0:407          'r032' ( temp 3X3 matrix of float)
-0:407          pow ( temp 3X3 matrix of float)
-0:407            'inF0' ( in 3X3 matrix of float)
-0:407            'inF1' ( in 3X3 matrix of float)
-0:407      Sequence
-0:407        move second child to first child ( temp 3X3 matrix of float)
-0:407          'r033' ( temp 3X3 matrix of float)
-0:407          radians ( temp 3X3 matrix of float)
-0:407            'inF0' ( in 3X3 matrix of float)
-0:407      Sequence
-0:407        move second child to first child ( temp 3X3 matrix of float)
-0:407          'r034' ( temp 3X3 matrix of float)
-0:407          roundEven ( temp 3X3 matrix of float)
-0:407            'inF0' ( in 3X3 matrix of float)
-0:407      Sequence
-0:407        move second child to first child ( temp 3X3 matrix of float)
-0:407          'r035' ( temp 3X3 matrix of float)
-0:407          inverse sqrt ( temp 3X3 matrix of float)
-0:407            'inF0' ( in 3X3 matrix of float)
-0:407      Sequence
-0:407        move second child to first child ( temp 3X3 matrix of float)
-0:407          'r036' ( temp 3X3 matrix of float)
-0:407          clamp ( temp 3X3 matrix of float)
-0:407            'inF0' ( in 3X3 matrix of float)
-0:407            Constant:
-0:407              0.000000
-0:407            Constant:
-0:407              1.000000
-0:407      Sequence
-0:407        move second child to first child ( temp 3X3 matrix of float)
-0:407          'r037' ( temp 3X3 matrix of float)
-0:407          Sign ( temp 3X3 matrix of float)
-0:407            'inF0' ( in 3X3 matrix of float)
-0:407      Sequence
-0:407        move second child to first child ( temp 3X3 matrix of float)
-0:407          'r038' ( temp 3X3 matrix of float)
-0:407          sine ( temp 3X3 matrix of float)
-0:407            'inF0' ( in 3X3 matrix of float)
-0:407      Sequence
-0:407        move second child to first child ( temp 3X3 matrix of float)
-0:407          'inF1' ( in 3X3 matrix of float)
-0:407          sine ( temp 3X3 matrix of float)
-0:407            'inF0' ( in 3X3 matrix of float)
-0:407        move second child to first child ( temp 3X3 matrix of float)
-0:407          'inF2' ( in 3X3 matrix of float)
-0:407          cosine ( temp 3X3 matrix of float)
-0:407            'inF0' ( in 3X3 matrix of float)
-0:407      Sequence
-0:407        move second child to first child ( temp 3X3 matrix of float)
-0:407          'r039' ( temp 3X3 matrix of float)
-0:407          hyp. sine ( temp 3X3 matrix of float)
-0:407            'inF0' ( in 3X3 matrix of float)
-0:407      Sequence
-0:407        move second child to first child ( temp 3X3 matrix of float)
-0:407          'r049' ( temp 3X3 matrix of float)
-0:407          smoothstep ( temp 3X3 matrix of float)
-0:407            'inF0' ( in 3X3 matrix of float)
-0:407            'inF1' ( in 3X3 matrix of float)
-0:407            'inF2' ( in 3X3 matrix of float)
-0:407      Sequence
-0:407        move second child to first child ( temp 3X3 matrix of float)
-0:407          'r041' ( temp 3X3 matrix of float)
-0:407          sqrt ( temp 3X3 matrix of float)
-0:407            'inF0' ( in 3X3 matrix of float)
-0:407      Sequence
-0:407        move second child to first child ( temp 3X3 matrix of float)
-0:407          'r042' ( temp 3X3 matrix of float)
-0:407          step ( temp 3X3 matrix of float)
-0:407            'inF0' ( in 3X3 matrix of float)
-0:407            'inF1' ( in 3X3 matrix of float)
-0:407      Sequence
-0:407        move second child to first child ( temp 3X3 matrix of float)
-0:407          'r043' ( temp 3X3 matrix of float)
-0:407          tangent ( temp 3X3 matrix of float)
-0:407            'inF0' ( in 3X3 matrix of float)
-0:407      Sequence
-0:407        move second child to first child ( temp 3X3 matrix of float)
-0:407          'r044' ( temp 3X3 matrix of float)
-0:407          hyp. tangent ( temp 3X3 matrix of float)
-0:407            'inF0' ( in 3X3 matrix of float)
-0:407      transpose ( temp 3X3 matrix of float)
-0:407        'inF0' ( in 3X3 matrix of float)
-0:407      Sequence
-0:407        move second child to first child ( temp 3X3 matrix of float)
-0:407          'r046' ( temp 3X3 matrix of float)
-0:407          trunc ( temp 3X3 matrix of float)
-0:407            'inF0' ( in 3X3 matrix of float)
-0:410      Branch: Return with expression
+0:412      Sequence
+0:412        move second child to first child ( temp bool)
+0:412          'r000' ( temp bool)
+0:412          all ( temp bool)
+0:412            Convert float to bool ( temp 3X3 matrix of bool)
+0:412              'inF0' ( in 3X3 matrix of float)
+0:412      Sequence
+0:412        move second child to first child ( temp 3X3 matrix of float)
+0:412          'r001' ( temp 3X3 matrix of float)
+0:412          Absolute value ( temp 3X3 matrix of float)
+0:412            'inF0' ( in 3X3 matrix of float)
+0:412      arc cosine ( temp 3X3 matrix of float)
+0:412        'inF0' ( in 3X3 matrix of float)
+0:412      Sequence
+0:412        move second child to first child ( temp bool)
+0:412          'r003' ( temp bool)
+0:412          any ( temp bool)
+0:412            Convert float to bool ( temp 3X3 matrix of bool)
+0:412              'inF0' ( in 3X3 matrix of float)
+0:412      Sequence
+0:412        move second child to first child ( temp 3X3 matrix of float)
+0:412          'r004' ( temp 3X3 matrix of float)
+0:412          arc sine ( temp 3X3 matrix of float)
+0:412            'inF0' ( in 3X3 matrix of float)
+0:412      Sequence
+0:412        move second child to first child ( temp 3X3 matrix of float)
+0:412          'r005' ( temp 3X3 matrix of float)
+0:412          arc tangent ( temp 3X3 matrix of float)
+0:412            'inF0' ( in 3X3 matrix of float)
+0:412      Sequence
+0:412        move second child to first child ( temp 3X3 matrix of float)
+0:412          'r006' ( temp 3X3 matrix of float)
+0:412          arc tangent ( temp 3X3 matrix of float)
+0:412            'inF0' ( in 3X3 matrix of float)
+0:412            'inF1' ( in 3X3 matrix of float)
+0:412      Sequence
+0:412        move second child to first child ( temp 3X3 matrix of float)
+0:412          'r007' ( temp 3X3 matrix of float)
+0:412          Ceiling ( temp 3X3 matrix of float)
+0:412            'inF0' ( in 3X3 matrix of float)
+0:412      Test condition and select ( temp void)
+0:412        Condition
+0:412        any ( temp bool)
+0:412          Compare Less Than ( temp 3X3 matrix of bool)
+0:412            'inF0' ( in 3X3 matrix of float)
+0:412            Constant:
+0:412              0.000000
+0:412              0.000000
+0:412              0.000000
+0:412              0.000000
+0:412              0.000000
+0:412              0.000000
+0:412              0.000000
+0:412              0.000000
+0:412              0.000000
+0:412        true case
+0:412        Branch: Kill
+0:412      Sequence
+0:412        move second child to first child ( temp 3X3 matrix of float)
+0:412          'r008' ( temp 3X3 matrix of float)
+0:412          clamp ( temp 3X3 matrix of float)
+0:412            'inF0' ( in 3X3 matrix of float)
+0:412            'inF1' ( in 3X3 matrix of float)
+0:412            'inF2' ( in 3X3 matrix of float)
+0:412      Sequence
+0:412        move second child to first child ( temp 3X3 matrix of float)
+0:412          'r009' ( temp 3X3 matrix of float)
+0:412          cosine ( temp 3X3 matrix of float)
+0:412            'inF0' ( in 3X3 matrix of float)
+0:412      Sequence
+0:412        move second child to first child ( temp 3X3 matrix of float)
+0:412          'r010' ( temp 3X3 matrix of float)
+0:412          hyp. cosine ( temp 3X3 matrix of float)
+0:412            'inF0' ( in 3X3 matrix of float)
+0:412      Sequence
+0:412        move second child to first child ( temp 3X3 matrix of float)
+0:412          'r011' ( temp 3X3 matrix of float)
+0:412          dPdx ( temp 3X3 matrix of float)
+0:412            'inF0' ( in 3X3 matrix of float)
+0:412      Sequence
+0:412        move second child to first child ( temp 3X3 matrix of float)
+0:412          'r012' ( temp 3X3 matrix of float)
+0:412          dPdxCoarse ( temp 3X3 matrix of float)
+0:412            'inF0' ( in 3X3 matrix of float)
+0:412      Sequence
+0:412        move second child to first child ( temp 3X3 matrix of float)
+0:412          'r013' ( temp 3X3 matrix of float)
+0:412          dPdxFine ( temp 3X3 matrix of float)
+0:412            'inF0' ( in 3X3 matrix of float)
+0:412      Sequence
+0:412        move second child to first child ( temp 3X3 matrix of float)
+0:412          'r014' ( temp 3X3 matrix of float)
+0:412          dPdy ( temp 3X3 matrix of float)
+0:412            'inF0' ( in 3X3 matrix of float)
+0:412      Sequence
+0:412        move second child to first child ( temp 3X3 matrix of float)
+0:412          'r015' ( temp 3X3 matrix of float)
+0:412          dPdyCoarse ( temp 3X3 matrix of float)
+0:412            'inF0' ( in 3X3 matrix of float)
+0:412      Sequence
+0:412        move second child to first child ( temp 3X3 matrix of float)
+0:412          'r016' ( temp 3X3 matrix of float)
+0:412          dPdyFine ( temp 3X3 matrix of float)
+0:412            'inF0' ( in 3X3 matrix of float)
+0:412      Sequence
+0:412        move second child to first child ( temp 3X3 matrix of float)
+0:412          'r017' ( temp 3X3 matrix of float)
+0:412          degrees ( temp 3X3 matrix of float)
+0:412            'inF0' ( in 3X3 matrix of float)
+0:412      Sequence
+0:412        move second child to first child ( temp float)
+0:412          'r018' ( temp float)
+0:412          determinant ( temp float)
+0:412            'inF0' ( in 3X3 matrix of float)
+0:412      Sequence
+0:412        move second child to first child ( temp 3X3 matrix of float)
+0:412          'r019' ( temp 3X3 matrix of float)
+0:412          exp ( temp 3X3 matrix of float)
+0:412            'inF0' ( in 3X3 matrix of float)
+0:412      Sequence
+0:412        move second child to first child ( temp 3X3 matrix of float)
+0:412          'R020' ( temp 3X3 matrix of float)
+0:412          exp2 ( temp 3X3 matrix of float)
+0:412            'inF0' ( in 3X3 matrix of float)
+0:412      Sequence
+0:412        move second child to first child ( temp 3X3 matrix of float)
+0:412          'r021' ( temp 3X3 matrix of float)
+0:412          Floor ( temp 3X3 matrix of float)
+0:412            'inF0' ( in 3X3 matrix of float)
+0:412      Sequence
+0:412        move second child to first child ( temp 3X3 matrix of float)
+0:412          'r022' ( temp 3X3 matrix of float)
+0:412          mod ( temp 3X3 matrix of float)
+0:412            'inF0' ( in 3X3 matrix of float)
+0:412            'inF1' ( in 3X3 matrix of float)
+0:412      Sequence
+0:412        move second child to first child ( temp 3X3 matrix of float)
+0:412          'r023' ( temp 3X3 matrix of float)
+0:412          Fraction ( temp 3X3 matrix of float)
+0:412            'inF0' ( in 3X3 matrix of float)
+0:412      Sequence
+0:412        move second child to first child ( temp 3X3 matrix of float)
+0:412          'r025' ( temp 3X3 matrix of float)
+0:412          fwidth ( temp 3X3 matrix of float)
+0:412            'inF0' ( in 3X3 matrix of float)
+0:412      Sequence
+0:412        move second child to first child ( temp 3X3 matrix of float)
+0:412          'r026' ( temp 3X3 matrix of float)
+0:412          ldexp ( temp 3X3 matrix of float)
+0:412            'inF0' ( in 3X3 matrix of float)
+0:412            'inF1' ( in 3X3 matrix of float)
+0:412      Sequence
+0:412        move second child to first child ( temp 3X3 matrix of float)
+0:412          'r026a' ( temp 3X3 matrix of float)
+0:412          mix ( temp 3X3 matrix of float)
+0:412            'inF0' ( in 3X3 matrix of float)
+0:412            'inF1' ( in 3X3 matrix of float)
+0:412            'inF2' ( in 3X3 matrix of float)
+0:412      Sequence
+0:412        move second child to first child ( temp 3X3 matrix of float)
+0:412          'r027' ( temp 3X3 matrix of float)
+0:412          log ( temp 3X3 matrix of float)
+0:412            'inF0' ( in 3X3 matrix of float)
+0:412      Sequence
+0:412        move second child to first child ( temp 3X3 matrix of float)
+0:412          'r028' ( temp 3X3 matrix of float)
+0:412          matrix-scale ( temp 3X3 matrix of float)
+0:412            log2 ( temp 3X3 matrix of float)
+0:412              'inF0' ( in 3X3 matrix of float)
+0:412            Constant:
+0:412              0.301030
+0:412      Sequence
+0:412        move second child to first child ( temp 3X3 matrix of float)
+0:412          'r029' ( temp 3X3 matrix of float)
+0:412          log2 ( temp 3X3 matrix of float)
+0:412            'inF0' ( in 3X3 matrix of float)
+0:412      Sequence
+0:412        move second child to first child ( temp 3X3 matrix of float)
+0:412          'r030' ( temp 3X3 matrix of float)
+0:412          max ( temp 3X3 matrix of float)
+0:412            'inF0' ( in 3X3 matrix of float)
+0:412            'inF1' ( in 3X3 matrix of float)
+0:412      Sequence
+0:412        move second child to first child ( temp 3X3 matrix of float)
+0:412          'r031' ( temp 3X3 matrix of float)
+0:412          min ( temp 3X3 matrix of float)
+0:412            'inF0' ( in 3X3 matrix of float)
+0:412            'inF1' ( in 3X3 matrix of float)
+0:412      Sequence
+0:412        move second child to first child ( temp 3X3 matrix of float)
+0:412          'r032' ( temp 3X3 matrix of float)
+0:412          pow ( temp 3X3 matrix of float)
+0:412            'inF0' ( in 3X3 matrix of float)
+0:412            'inF1' ( in 3X3 matrix of float)
+0:412      Sequence
+0:412        move second child to first child ( temp 3X3 matrix of float)
+0:412          'r033' ( temp 3X3 matrix of float)
+0:412          radians ( temp 3X3 matrix of float)
+0:412            'inF0' ( in 3X3 matrix of float)
+0:412      Sequence
+0:412        move second child to first child ( temp 3X3 matrix of float)
+0:412          'r034' ( temp 3X3 matrix of float)
+0:412          roundEven ( temp 3X3 matrix of float)
+0:412            'inF0' ( in 3X3 matrix of float)
+0:412      Sequence
+0:412        move second child to first child ( temp 3X3 matrix of float)
+0:412          'r035' ( temp 3X3 matrix of float)
+0:412          inverse sqrt ( temp 3X3 matrix of float)
+0:412            'inF0' ( in 3X3 matrix of float)
+0:412      Sequence
+0:412        move second child to first child ( temp 3X3 matrix of float)
+0:412          'r036' ( temp 3X3 matrix of float)
+0:412          clamp ( temp 3X3 matrix of float)
+0:412            'inF0' ( in 3X3 matrix of float)
+0:412            Constant:
+0:412              0.000000
+0:412            Constant:
+0:412              1.000000
+0:412      Sequence
+0:412        move second child to first child ( temp 3X3 matrix of float)
+0:412          'r037' ( temp 3X3 matrix of float)
+0:412          Sign ( temp 3X3 matrix of float)
+0:412            'inF0' ( in 3X3 matrix of float)
+0:412      Sequence
+0:412        move second child to first child ( temp 3X3 matrix of float)
+0:412          'r038' ( temp 3X3 matrix of float)
+0:412          sine ( temp 3X3 matrix of float)
+0:412            'inF0' ( in 3X3 matrix of float)
+0:412      Sequence
+0:412        move second child to first child ( temp 3X3 matrix of float)
+0:412          'inF1' ( in 3X3 matrix of float)
+0:412          sine ( temp 3X3 matrix of float)
+0:412            'inF0' ( in 3X3 matrix of float)
+0:412        move second child to first child ( temp 3X3 matrix of float)
+0:412          'inF2' ( in 3X3 matrix of float)
+0:412          cosine ( temp 3X3 matrix of float)
+0:412            'inF0' ( in 3X3 matrix of float)
+0:412      Sequence
+0:412        move second child to first child ( temp 3X3 matrix of float)
+0:412          'r039' ( temp 3X3 matrix of float)
+0:412          hyp. sine ( temp 3X3 matrix of float)
+0:412            'inF0' ( in 3X3 matrix of float)
+0:412      Sequence
+0:412        move second child to first child ( temp 3X3 matrix of float)
+0:412          'r049' ( temp 3X3 matrix of float)
+0:412          smoothstep ( temp 3X3 matrix of float)
+0:412            'inF0' ( in 3X3 matrix of float)
+0:412            'inF1' ( in 3X3 matrix of float)
+0:412            'inF2' ( in 3X3 matrix of float)
+0:412      Sequence
+0:412        move second child to first child ( temp 3X3 matrix of float)
+0:412          'r041' ( temp 3X3 matrix of float)
+0:412          sqrt ( temp 3X3 matrix of float)
+0:412            'inF0' ( in 3X3 matrix of float)
+0:412      Sequence
+0:412        move second child to first child ( temp 3X3 matrix of float)
+0:412          'r042' ( temp 3X3 matrix of float)
+0:412          step ( temp 3X3 matrix of float)
+0:412            'inF0' ( in 3X3 matrix of float)
+0:412            'inF1' ( in 3X3 matrix of float)
+0:412      Sequence
+0:412        move second child to first child ( temp 3X3 matrix of float)
+0:412          'r043' ( temp 3X3 matrix of float)
+0:412          tangent ( temp 3X3 matrix of float)
+0:412            'inF0' ( in 3X3 matrix of float)
+0:412      Sequence
+0:412        move second child to first child ( temp 3X3 matrix of float)
+0:412          'r044' ( temp 3X3 matrix of float)
+0:412          hyp. tangent ( temp 3X3 matrix of float)
+0:412            'inF0' ( in 3X3 matrix of float)
+0:412      transpose ( temp 3X3 matrix of float)
+0:412        'inF0' ( in 3X3 matrix of float)
+0:412      Sequence
+0:412        move second child to first child ( temp 3X3 matrix of float)
+0:412          'r046' ( temp 3X3 matrix of float)
+0:412          trunc ( temp 3X3 matrix of float)
+0:412            'inF0' ( in 3X3 matrix of float)
+0:415      Branch: Return with expression
 0:?         Constant:
 0:?           3.000000
 0:?           3.000000
@@ -4872,295 +4992,297 @@
 0:?           3.000000
 0:?           3.000000
 0:?           3.000000
-0:414  Function Definition: PixelShaderFunction4x4(mf44;mf44;mf44; ( temp 4X4 matrix of float)
-0:414    Function Parameters: 
-0:414      'inF0' ( in 4X4 matrix of float)
-0:414      'inF1' ( in 4X4 matrix of float)
-0:414      'inF2' ( in 4X4 matrix of float)
+0:419  Function Definition: PixelShaderFunction4x4(mf44;mf44;mf44; ( temp 4X4 matrix of float)
+0:419    Function Parameters: 
+0:419      'inF0' ( in 4X4 matrix of float)
+0:419      'inF1' ( in 4X4 matrix of float)
+0:419      'inF2' ( in 4X4 matrix of float)
 0:?     Sequence
-0:416      Sequence
-0:416        move second child to first child ( temp bool)
-0:416          'r000' ( temp bool)
-0:416          all ( temp bool)
-0:416            'inF0' ( in 4X4 matrix of float)
-0:416      Sequence
-0:416        move second child to first child ( temp 4X4 matrix of float)
-0:416          'r001' ( temp 4X4 matrix of float)
-0:416          Absolute value ( temp 4X4 matrix of float)
-0:416            'inF0' ( in 4X4 matrix of float)
-0:416      arc cosine ( temp 4X4 matrix of float)
-0:416        'inF0' ( in 4X4 matrix of float)
-0:416      Sequence
-0:416        move second child to first child ( temp bool)
-0:416          'r003' ( temp bool)
-0:416          any ( temp bool)
-0:416            'inF0' ( in 4X4 matrix of float)
-0:416      Sequence
-0:416        move second child to first child ( temp 4X4 matrix of float)
-0:416          'r004' ( temp 4X4 matrix of float)
-0:416          arc sine ( temp 4X4 matrix of float)
-0:416            'inF0' ( in 4X4 matrix of float)
-0:416      Sequence
-0:416        move second child to first child ( temp 4X4 matrix of float)
-0:416          'r005' ( temp 4X4 matrix of float)
-0:416          arc tangent ( temp 4X4 matrix of float)
-0:416            'inF0' ( in 4X4 matrix of float)
-0:416      Sequence
-0:416        move second child to first child ( temp 4X4 matrix of float)
-0:416          'r006' ( temp 4X4 matrix of float)
-0:416          arc tangent ( temp 4X4 matrix of float)
-0:416            'inF0' ( in 4X4 matrix of float)
-0:416            'inF1' ( in 4X4 matrix of float)
-0:416      Sequence
-0:416        move second child to first child ( temp 4X4 matrix of float)
-0:416          'r007' ( temp 4X4 matrix of float)
-0:416          Ceiling ( temp 4X4 matrix of float)
-0:416            'inF0' ( in 4X4 matrix of float)
-0:416      Test condition and select ( temp void)
-0:416        Condition
-0:416        any ( temp bool)
-0:416          Compare Less Than ( temp 4X4 matrix of bool)
-0:416            'inF0' ( in 4X4 matrix of float)
-0:416            Constant:
-0:416              0.000000
-0:416              0.000000
-0:416              0.000000
-0:416              0.000000
-0:416              0.000000
-0:416              0.000000
-0:416              0.000000
-0:416              0.000000
-0:416              0.000000
-0:416              0.000000
-0:416              0.000000
-0:416              0.000000
-0:416              0.000000
-0:416              0.000000
-0:416              0.000000
-0:416              0.000000
-0:416        true case
-0:416        Branch: Kill
-0:416      Sequence
-0:416        move second child to first child ( temp 4X4 matrix of float)
-0:416          'r008' ( temp 4X4 matrix of float)
-0:416          clamp ( temp 4X4 matrix of float)
-0:416            'inF0' ( in 4X4 matrix of float)
-0:416            'inF1' ( in 4X4 matrix of float)
-0:416            'inF2' ( in 4X4 matrix of float)
-0:416      Sequence
-0:416        move second child to first child ( temp 4X4 matrix of float)
-0:416          'r009' ( temp 4X4 matrix of float)
-0:416          cosine ( temp 4X4 matrix of float)
-0:416            'inF0' ( in 4X4 matrix of float)
-0:416      Sequence
-0:416        move second child to first child ( temp 4X4 matrix of float)
-0:416          'r010' ( temp 4X4 matrix of float)
-0:416          hyp. cosine ( temp 4X4 matrix of float)
-0:416            'inF0' ( in 4X4 matrix of float)
-0:416      Sequence
-0:416        move second child to first child ( temp 4X4 matrix of float)
-0:416          'r011' ( temp 4X4 matrix of float)
-0:416          dPdx ( temp 4X4 matrix of float)
-0:416            'inF0' ( in 4X4 matrix of float)
-0:416      Sequence
-0:416        move second child to first child ( temp 4X4 matrix of float)
-0:416          'r012' ( temp 4X4 matrix of float)
-0:416          dPdxCoarse ( temp 4X4 matrix of float)
-0:416            'inF0' ( in 4X4 matrix of float)
-0:416      Sequence
-0:416        move second child to first child ( temp 4X4 matrix of float)
-0:416          'r013' ( temp 4X4 matrix of float)
-0:416          dPdxFine ( temp 4X4 matrix of float)
-0:416            'inF0' ( in 4X4 matrix of float)
-0:416      Sequence
-0:416        move second child to first child ( temp 4X4 matrix of float)
-0:416          'r014' ( temp 4X4 matrix of float)
-0:416          dPdy ( temp 4X4 matrix of float)
-0:416            'inF0' ( in 4X4 matrix of float)
-0:416      Sequence
-0:416        move second child to first child ( temp 4X4 matrix of float)
-0:416          'r015' ( temp 4X4 matrix of float)
-0:416          dPdyCoarse ( temp 4X4 matrix of float)
-0:416            'inF0' ( in 4X4 matrix of float)
-0:416      Sequence
-0:416        move second child to first child ( temp 4X4 matrix of float)
-0:416          'r016' ( temp 4X4 matrix of float)
-0:416          dPdyFine ( temp 4X4 matrix of float)
-0:416            'inF0' ( in 4X4 matrix of float)
-0:416      Sequence
-0:416        move second child to first child ( temp 4X4 matrix of float)
-0:416          'r017' ( temp 4X4 matrix of float)
-0:416          degrees ( temp 4X4 matrix of float)
-0:416            'inF0' ( in 4X4 matrix of float)
-0:416      Sequence
-0:416        move second child to first child ( temp float)
-0:416          'r018' ( temp float)
-0:416          determinant ( temp float)
-0:416            'inF0' ( in 4X4 matrix of float)
-0:416      Sequence
-0:416        move second child to first child ( temp 4X4 matrix of float)
-0:416          'r019' ( temp 4X4 matrix of float)
-0:416          exp ( temp 4X4 matrix of float)
-0:416            'inF0' ( in 4X4 matrix of float)
-0:416      Sequence
-0:416        move second child to first child ( temp 4X4 matrix of float)
-0:416          'R020' ( temp 4X4 matrix of float)
-0:416          exp2 ( temp 4X4 matrix of float)
-0:416            'inF0' ( in 4X4 matrix of float)
-0:416      Sequence
-0:416        move second child to first child ( temp 4X4 matrix of float)
-0:416          'r021' ( temp 4X4 matrix of float)
-0:416          Floor ( temp 4X4 matrix of float)
-0:416            'inF0' ( in 4X4 matrix of float)
-0:416      Sequence
-0:416        move second child to first child ( temp 4X4 matrix of float)
-0:416          'r022' ( temp 4X4 matrix of float)
-0:416          mod ( temp 4X4 matrix of float)
-0:416            'inF0' ( in 4X4 matrix of float)
-0:416            'inF1' ( in 4X4 matrix of float)
-0:416      Sequence
-0:416        move second child to first child ( temp 4X4 matrix of float)
-0:416          'r023' ( temp 4X4 matrix of float)
-0:416          Fraction ( temp 4X4 matrix of float)
-0:416            'inF0' ( in 4X4 matrix of float)
-0:416      Sequence
-0:416        move second child to first child ( temp 4X4 matrix of float)
-0:416          'r025' ( temp 4X4 matrix of float)
-0:416          fwidth ( temp 4X4 matrix of float)
-0:416            'inF0' ( in 4X4 matrix of float)
-0:416      Sequence
-0:416        move second child to first child ( temp 4X4 matrix of float)
-0:416          'r026' ( temp 4X4 matrix of float)
-0:416          ldexp ( temp 4X4 matrix of float)
-0:416            'inF0' ( in 4X4 matrix of float)
-0:416            'inF1' ( in 4X4 matrix of float)
-0:416      Sequence
-0:416        move second child to first child ( temp 4X4 matrix of float)
-0:416          'r026a' ( temp 4X4 matrix of float)
-0:416          mix ( temp 4X4 matrix of float)
-0:416            'inF0' ( in 4X4 matrix of float)
-0:416            'inF1' ( in 4X4 matrix of float)
-0:416            'inF2' ( in 4X4 matrix of float)
-0:416      Sequence
-0:416        move second child to first child ( temp 4X4 matrix of float)
-0:416          'r027' ( temp 4X4 matrix of float)
-0:416          log ( temp 4X4 matrix of float)
-0:416            'inF0' ( in 4X4 matrix of float)
-0:416      Sequence
-0:416        move second child to first child ( temp 4X4 matrix of float)
-0:416          'r028' ( temp 4X4 matrix of float)
-0:416          matrix-scale ( temp 4X4 matrix of float)
-0:416            log2 ( temp 4X4 matrix of float)
-0:416              'inF0' ( in 4X4 matrix of float)
-0:416            Constant:
-0:416              0.301030
-0:416      Sequence
-0:416        move second child to first child ( temp 4X4 matrix of float)
-0:416          'r029' ( temp 4X4 matrix of float)
-0:416          log2 ( temp 4X4 matrix of float)
-0:416            'inF0' ( in 4X4 matrix of float)
-0:416      Sequence
-0:416        move second child to first child ( temp 4X4 matrix of float)
-0:416          'r030' ( temp 4X4 matrix of float)
-0:416          max ( temp 4X4 matrix of float)
-0:416            'inF0' ( in 4X4 matrix of float)
-0:416            'inF1' ( in 4X4 matrix of float)
-0:416      Sequence
-0:416        move second child to first child ( temp 4X4 matrix of float)
-0:416          'r031' ( temp 4X4 matrix of float)
-0:416          min ( temp 4X4 matrix of float)
-0:416            'inF0' ( in 4X4 matrix of float)
-0:416            'inF1' ( in 4X4 matrix of float)
-0:416      Sequence
-0:416        move second child to first child ( temp 4X4 matrix of float)
-0:416          'r032' ( temp 4X4 matrix of float)
-0:416          pow ( temp 4X4 matrix of float)
-0:416            'inF0' ( in 4X4 matrix of float)
-0:416            'inF1' ( in 4X4 matrix of float)
-0:416      Sequence
-0:416        move second child to first child ( temp 4X4 matrix of float)
-0:416          'r033' ( temp 4X4 matrix of float)
-0:416          radians ( temp 4X4 matrix of float)
-0:416            'inF0' ( in 4X4 matrix of float)
-0:416      Sequence
-0:416        move second child to first child ( temp 4X4 matrix of float)
-0:416          'r034' ( temp 4X4 matrix of float)
-0:416          roundEven ( temp 4X4 matrix of float)
-0:416            'inF0' ( in 4X4 matrix of float)
-0:416      Sequence
-0:416        move second child to first child ( temp 4X4 matrix of float)
-0:416          'r035' ( temp 4X4 matrix of float)
-0:416          inverse sqrt ( temp 4X4 matrix of float)
-0:416            'inF0' ( in 4X4 matrix of float)
-0:416      Sequence
-0:416        move second child to first child ( temp 4X4 matrix of float)
-0:416          'r036' ( temp 4X4 matrix of float)
-0:416          clamp ( temp 4X4 matrix of float)
-0:416            'inF0' ( in 4X4 matrix of float)
-0:416            Constant:
-0:416              0.000000
-0:416            Constant:
-0:416              1.000000
-0:416      Sequence
-0:416        move second child to first child ( temp 4X4 matrix of float)
-0:416          'r037' ( temp 4X4 matrix of float)
-0:416          Sign ( temp 4X4 matrix of float)
-0:416            'inF0' ( in 4X4 matrix of float)
-0:416      Sequence
-0:416        move second child to first child ( temp 4X4 matrix of float)
-0:416          'r038' ( temp 4X4 matrix of float)
-0:416          sine ( temp 4X4 matrix of float)
-0:416            'inF0' ( in 4X4 matrix of float)
-0:416      Sequence
-0:416        move second child to first child ( temp 4X4 matrix of float)
-0:416          'inF1' ( in 4X4 matrix of float)
-0:416          sine ( temp 4X4 matrix of float)
-0:416            'inF0' ( in 4X4 matrix of float)
-0:416        move second child to first child ( temp 4X4 matrix of float)
-0:416          'inF2' ( in 4X4 matrix of float)
-0:416          cosine ( temp 4X4 matrix of float)
-0:416            'inF0' ( in 4X4 matrix of float)
-0:416      Sequence
-0:416        move second child to first child ( temp 4X4 matrix of float)
-0:416          'r039' ( temp 4X4 matrix of float)
-0:416          hyp. sine ( temp 4X4 matrix of float)
-0:416            'inF0' ( in 4X4 matrix of float)
-0:416      Sequence
-0:416        move second child to first child ( temp 4X4 matrix of float)
-0:416          'r049' ( temp 4X4 matrix of float)
-0:416          smoothstep ( temp 4X4 matrix of float)
-0:416            'inF0' ( in 4X4 matrix of float)
-0:416            'inF1' ( in 4X4 matrix of float)
-0:416            'inF2' ( in 4X4 matrix of float)
-0:416      Sequence
-0:416        move second child to first child ( temp 4X4 matrix of float)
-0:416          'r041' ( temp 4X4 matrix of float)
-0:416          sqrt ( temp 4X4 matrix of float)
-0:416            'inF0' ( in 4X4 matrix of float)
-0:416      Sequence
-0:416        move second child to first child ( temp 4X4 matrix of float)
-0:416          'r042' ( temp 4X4 matrix of float)
-0:416          step ( temp 4X4 matrix of float)
-0:416            'inF0' ( in 4X4 matrix of float)
-0:416            'inF1' ( in 4X4 matrix of float)
-0:416      Sequence
-0:416        move second child to first child ( temp 4X4 matrix of float)
-0:416          'r043' ( temp 4X4 matrix of float)
-0:416          tangent ( temp 4X4 matrix of float)
-0:416            'inF0' ( in 4X4 matrix of float)
-0:416      Sequence
-0:416        move second child to first child ( temp 4X4 matrix of float)
-0:416          'r044' ( temp 4X4 matrix of float)
-0:416          hyp. tangent ( temp 4X4 matrix of float)
-0:416            'inF0' ( in 4X4 matrix of float)
-0:416      transpose ( temp 4X4 matrix of float)
-0:416        'inF0' ( in 4X4 matrix of float)
-0:416      Sequence
-0:416        move second child to first child ( temp 4X4 matrix of float)
-0:416          'r046' ( temp 4X4 matrix of float)
-0:416          trunc ( temp 4X4 matrix of float)
-0:416            'inF0' ( in 4X4 matrix of float)
-0:419      Branch: Return with expression
+0:421      Sequence
+0:421        move second child to first child ( temp bool)
+0:421          'r000' ( temp bool)
+0:421          all ( temp bool)
+0:421            Convert float to bool ( temp 4X4 matrix of bool)
+0:421              'inF0' ( in 4X4 matrix of float)
+0:421      Sequence
+0:421        move second child to first child ( temp 4X4 matrix of float)
+0:421          'r001' ( temp 4X4 matrix of float)
+0:421          Absolute value ( temp 4X4 matrix of float)
+0:421            'inF0' ( in 4X4 matrix of float)
+0:421      arc cosine ( temp 4X4 matrix of float)
+0:421        'inF0' ( in 4X4 matrix of float)
+0:421      Sequence
+0:421        move second child to first child ( temp bool)
+0:421          'r003' ( temp bool)
+0:421          any ( temp bool)
+0:421            Convert float to bool ( temp 4X4 matrix of bool)
+0:421              'inF0' ( in 4X4 matrix of float)
+0:421      Sequence
+0:421        move second child to first child ( temp 4X4 matrix of float)
+0:421          'r004' ( temp 4X4 matrix of float)
+0:421          arc sine ( temp 4X4 matrix of float)
+0:421            'inF0' ( in 4X4 matrix of float)
+0:421      Sequence
+0:421        move second child to first child ( temp 4X4 matrix of float)
+0:421          'r005' ( temp 4X4 matrix of float)
+0:421          arc tangent ( temp 4X4 matrix of float)
+0:421            'inF0' ( in 4X4 matrix of float)
+0:421      Sequence
+0:421        move second child to first child ( temp 4X4 matrix of float)
+0:421          'r006' ( temp 4X4 matrix of float)
+0:421          arc tangent ( temp 4X4 matrix of float)
+0:421            'inF0' ( in 4X4 matrix of float)
+0:421            'inF1' ( in 4X4 matrix of float)
+0:421      Sequence
+0:421        move second child to first child ( temp 4X4 matrix of float)
+0:421          'r007' ( temp 4X4 matrix of float)
+0:421          Ceiling ( temp 4X4 matrix of float)
+0:421            'inF0' ( in 4X4 matrix of float)
+0:421      Test condition and select ( temp void)
+0:421        Condition
+0:421        any ( temp bool)
+0:421          Compare Less Than ( temp 4X4 matrix of bool)
+0:421            'inF0' ( in 4X4 matrix of float)
+0:421            Constant:
+0:421              0.000000
+0:421              0.000000
+0:421              0.000000
+0:421              0.000000
+0:421              0.000000
+0:421              0.000000
+0:421              0.000000
+0:421              0.000000
+0:421              0.000000
+0:421              0.000000
+0:421              0.000000
+0:421              0.000000
+0:421              0.000000
+0:421              0.000000
+0:421              0.000000
+0:421              0.000000
+0:421        true case
+0:421        Branch: Kill
+0:421      Sequence
+0:421        move second child to first child ( temp 4X4 matrix of float)
+0:421          'r008' ( temp 4X4 matrix of float)
+0:421          clamp ( temp 4X4 matrix of float)
+0:421            'inF0' ( in 4X4 matrix of float)
+0:421            'inF1' ( in 4X4 matrix of float)
+0:421            'inF2' ( in 4X4 matrix of float)
+0:421      Sequence
+0:421        move second child to first child ( temp 4X4 matrix of float)
+0:421          'r009' ( temp 4X4 matrix of float)
+0:421          cosine ( temp 4X4 matrix of float)
+0:421            'inF0' ( in 4X4 matrix of float)
+0:421      Sequence
+0:421        move second child to first child ( temp 4X4 matrix of float)
+0:421          'r010' ( temp 4X4 matrix of float)
+0:421          hyp. cosine ( temp 4X4 matrix of float)
+0:421            'inF0' ( in 4X4 matrix of float)
+0:421      Sequence
+0:421        move second child to first child ( temp 4X4 matrix of float)
+0:421          'r011' ( temp 4X4 matrix of float)
+0:421          dPdx ( temp 4X4 matrix of float)
+0:421            'inF0' ( in 4X4 matrix of float)
+0:421      Sequence
+0:421        move second child to first child ( temp 4X4 matrix of float)
+0:421          'r012' ( temp 4X4 matrix of float)
+0:421          dPdxCoarse ( temp 4X4 matrix of float)
+0:421            'inF0' ( in 4X4 matrix of float)
+0:421      Sequence
+0:421        move second child to first child ( temp 4X4 matrix of float)
+0:421          'r013' ( temp 4X4 matrix of float)
+0:421          dPdxFine ( temp 4X4 matrix of float)
+0:421            'inF0' ( in 4X4 matrix of float)
+0:421      Sequence
+0:421        move second child to first child ( temp 4X4 matrix of float)
+0:421          'r014' ( temp 4X4 matrix of float)
+0:421          dPdy ( temp 4X4 matrix of float)
+0:421            'inF0' ( in 4X4 matrix of float)
+0:421      Sequence
+0:421        move second child to first child ( temp 4X4 matrix of float)
+0:421          'r015' ( temp 4X4 matrix of float)
+0:421          dPdyCoarse ( temp 4X4 matrix of float)
+0:421            'inF0' ( in 4X4 matrix of float)
+0:421      Sequence
+0:421        move second child to first child ( temp 4X4 matrix of float)
+0:421          'r016' ( temp 4X4 matrix of float)
+0:421          dPdyFine ( temp 4X4 matrix of float)
+0:421            'inF0' ( in 4X4 matrix of float)
+0:421      Sequence
+0:421        move second child to first child ( temp 4X4 matrix of float)
+0:421          'r017' ( temp 4X4 matrix of float)
+0:421          degrees ( temp 4X4 matrix of float)
+0:421            'inF0' ( in 4X4 matrix of float)
+0:421      Sequence
+0:421        move second child to first child ( temp float)
+0:421          'r018' ( temp float)
+0:421          determinant ( temp float)
+0:421            'inF0' ( in 4X4 matrix of float)
+0:421      Sequence
+0:421        move second child to first child ( temp 4X4 matrix of float)
+0:421          'r019' ( temp 4X4 matrix of float)
+0:421          exp ( temp 4X4 matrix of float)
+0:421            'inF0' ( in 4X4 matrix of float)
+0:421      Sequence
+0:421        move second child to first child ( temp 4X4 matrix of float)
+0:421          'R020' ( temp 4X4 matrix of float)
+0:421          exp2 ( temp 4X4 matrix of float)
+0:421            'inF0' ( in 4X4 matrix of float)
+0:421      Sequence
+0:421        move second child to first child ( temp 4X4 matrix of float)
+0:421          'r021' ( temp 4X4 matrix of float)
+0:421          Floor ( temp 4X4 matrix of float)
+0:421            'inF0' ( in 4X4 matrix of float)
+0:421      Sequence
+0:421        move second child to first child ( temp 4X4 matrix of float)
+0:421          'r022' ( temp 4X4 matrix of float)
+0:421          mod ( temp 4X4 matrix of float)
+0:421            'inF0' ( in 4X4 matrix of float)
+0:421            'inF1' ( in 4X4 matrix of float)
+0:421      Sequence
+0:421        move second child to first child ( temp 4X4 matrix of float)
+0:421          'r023' ( temp 4X4 matrix of float)
+0:421          Fraction ( temp 4X4 matrix of float)
+0:421            'inF0' ( in 4X4 matrix of float)
+0:421      Sequence
+0:421        move second child to first child ( temp 4X4 matrix of float)
+0:421          'r025' ( temp 4X4 matrix of float)
+0:421          fwidth ( temp 4X4 matrix of float)
+0:421            'inF0' ( in 4X4 matrix of float)
+0:421      Sequence
+0:421        move second child to first child ( temp 4X4 matrix of float)
+0:421          'r026' ( temp 4X4 matrix of float)
+0:421          ldexp ( temp 4X4 matrix of float)
+0:421            'inF0' ( in 4X4 matrix of float)
+0:421            'inF1' ( in 4X4 matrix of float)
+0:421      Sequence
+0:421        move second child to first child ( temp 4X4 matrix of float)
+0:421          'r026a' ( temp 4X4 matrix of float)
+0:421          mix ( temp 4X4 matrix of float)
+0:421            'inF0' ( in 4X4 matrix of float)
+0:421            'inF1' ( in 4X4 matrix of float)
+0:421            'inF2' ( in 4X4 matrix of float)
+0:421      Sequence
+0:421        move second child to first child ( temp 4X4 matrix of float)
+0:421          'r027' ( temp 4X4 matrix of float)
+0:421          log ( temp 4X4 matrix of float)
+0:421            'inF0' ( in 4X4 matrix of float)
+0:421      Sequence
+0:421        move second child to first child ( temp 4X4 matrix of float)
+0:421          'r028' ( temp 4X4 matrix of float)
+0:421          matrix-scale ( temp 4X4 matrix of float)
+0:421            log2 ( temp 4X4 matrix of float)
+0:421              'inF0' ( in 4X4 matrix of float)
+0:421            Constant:
+0:421              0.301030
+0:421      Sequence
+0:421        move second child to first child ( temp 4X4 matrix of float)
+0:421          'r029' ( temp 4X4 matrix of float)
+0:421          log2 ( temp 4X4 matrix of float)
+0:421            'inF0' ( in 4X4 matrix of float)
+0:421      Sequence
+0:421        move second child to first child ( temp 4X4 matrix of float)
+0:421          'r030' ( temp 4X4 matrix of float)
+0:421          max ( temp 4X4 matrix of float)
+0:421            'inF0' ( in 4X4 matrix of float)
+0:421            'inF1' ( in 4X4 matrix of float)
+0:421      Sequence
+0:421        move second child to first child ( temp 4X4 matrix of float)
+0:421          'r031' ( temp 4X4 matrix of float)
+0:421          min ( temp 4X4 matrix of float)
+0:421            'inF0' ( in 4X4 matrix of float)
+0:421            'inF1' ( in 4X4 matrix of float)
+0:421      Sequence
+0:421        move second child to first child ( temp 4X4 matrix of float)
+0:421          'r032' ( temp 4X4 matrix of float)
+0:421          pow ( temp 4X4 matrix of float)
+0:421            'inF0' ( in 4X4 matrix of float)
+0:421            'inF1' ( in 4X4 matrix of float)
+0:421      Sequence
+0:421        move second child to first child ( temp 4X4 matrix of float)
+0:421          'r033' ( temp 4X4 matrix of float)
+0:421          radians ( temp 4X4 matrix of float)
+0:421            'inF0' ( in 4X4 matrix of float)
+0:421      Sequence
+0:421        move second child to first child ( temp 4X4 matrix of float)
+0:421          'r034' ( temp 4X4 matrix of float)
+0:421          roundEven ( temp 4X4 matrix of float)
+0:421            'inF0' ( in 4X4 matrix of float)
+0:421      Sequence
+0:421        move second child to first child ( temp 4X4 matrix of float)
+0:421          'r035' ( temp 4X4 matrix of float)
+0:421          inverse sqrt ( temp 4X4 matrix of float)
+0:421            'inF0' ( in 4X4 matrix of float)
+0:421      Sequence
+0:421        move second child to first child ( temp 4X4 matrix of float)
+0:421          'r036' ( temp 4X4 matrix of float)
+0:421          clamp ( temp 4X4 matrix of float)
+0:421            'inF0' ( in 4X4 matrix of float)
+0:421            Constant:
+0:421              0.000000
+0:421            Constant:
+0:421              1.000000
+0:421      Sequence
+0:421        move second child to first child ( temp 4X4 matrix of float)
+0:421          'r037' ( temp 4X4 matrix of float)
+0:421          Sign ( temp 4X4 matrix of float)
+0:421            'inF0' ( in 4X4 matrix of float)
+0:421      Sequence
+0:421        move second child to first child ( temp 4X4 matrix of float)
+0:421          'r038' ( temp 4X4 matrix of float)
+0:421          sine ( temp 4X4 matrix of float)
+0:421            'inF0' ( in 4X4 matrix of float)
+0:421      Sequence
+0:421        move second child to first child ( temp 4X4 matrix of float)
+0:421          'inF1' ( in 4X4 matrix of float)
+0:421          sine ( temp 4X4 matrix of float)
+0:421            'inF0' ( in 4X4 matrix of float)
+0:421        move second child to first child ( temp 4X4 matrix of float)
+0:421          'inF2' ( in 4X4 matrix of float)
+0:421          cosine ( temp 4X4 matrix of float)
+0:421            'inF0' ( in 4X4 matrix of float)
+0:421      Sequence
+0:421        move second child to first child ( temp 4X4 matrix of float)
+0:421          'r039' ( temp 4X4 matrix of float)
+0:421          hyp. sine ( temp 4X4 matrix of float)
+0:421            'inF0' ( in 4X4 matrix of float)
+0:421      Sequence
+0:421        move second child to first child ( temp 4X4 matrix of float)
+0:421          'r049' ( temp 4X4 matrix of float)
+0:421          smoothstep ( temp 4X4 matrix of float)
+0:421            'inF0' ( in 4X4 matrix of float)
+0:421            'inF1' ( in 4X4 matrix of float)
+0:421            'inF2' ( in 4X4 matrix of float)
+0:421      Sequence
+0:421        move second child to first child ( temp 4X4 matrix of float)
+0:421          'r041' ( temp 4X4 matrix of float)
+0:421          sqrt ( temp 4X4 matrix of float)
+0:421            'inF0' ( in 4X4 matrix of float)
+0:421      Sequence
+0:421        move second child to first child ( temp 4X4 matrix of float)
+0:421          'r042' ( temp 4X4 matrix of float)
+0:421          step ( temp 4X4 matrix of float)
+0:421            'inF0' ( in 4X4 matrix of float)
+0:421            'inF1' ( in 4X4 matrix of float)
+0:421      Sequence
+0:421        move second child to first child ( temp 4X4 matrix of float)
+0:421          'r043' ( temp 4X4 matrix of float)
+0:421          tangent ( temp 4X4 matrix of float)
+0:421            'inF0' ( in 4X4 matrix of float)
+0:421      Sequence
+0:421        move second child to first child ( temp 4X4 matrix of float)
+0:421          'r044' ( temp 4X4 matrix of float)
+0:421          hyp. tangent ( temp 4X4 matrix of float)
+0:421            'inF0' ( in 4X4 matrix of float)
+0:421      transpose ( temp 4X4 matrix of float)
+0:421        'inF0' ( in 4X4 matrix of float)
+0:421      Sequence
+0:421        move second child to first child ( temp 4X4 matrix of float)
+0:421          'r046' ( temp 4X4 matrix of float)
+0:421          trunc ( temp 4X4 matrix of float)
+0:421            'inF0' ( in 4X4 matrix of float)
+0:424      Branch: Return with expression
 0:?         Constant:
 0:?           4.000000
 0:?           4.000000
@@ -5178,334 +5300,334 @@
 0:?           4.000000
 0:?           4.000000
 0:?           4.000000
-0:437  Function Definition: TestGenMul2(f1;f1;vf2;vf2;mf22;mf22; ( temp void)
-0:437    Function Parameters: 
-0:437      'inF0' ( in float)
-0:437      'inF1' ( in float)
-0:437      'inFV0' ( in 2-component vector of float)
-0:437      'inFV1' ( in 2-component vector of float)
-0:437      'inFM0' ( in 2X2 matrix of float)
-0:437      'inFM1' ( in 2X2 matrix of float)
+0:442  Function Definition: TestGenMul2(f1;f1;vf2;vf2;mf22;mf22; ( temp void)
+0:442    Function Parameters: 
+0:442      'inF0' ( in float)
+0:442      'inF1' ( in float)
+0:442      'inFV0' ( in 2-component vector of float)
+0:442      'inFV1' ( in 2-component vector of float)
+0:442      'inFM0' ( in 2X2 matrix of float)
+0:442      'inFM1' ( in 2X2 matrix of float)
 0:?     Sequence
-0:438      Sequence
-0:438        move second child to first child ( temp float)
-0:438          'r0' ( temp float)
-0:438          component-wise multiply ( temp float)
-0:438            'inF1' ( in float)
-0:438            'inF0' ( in float)
-0:438      Sequence
-0:438        move second child to first child ( temp 2-component vector of float)
-0:438          'r1' ( temp 2-component vector of float)
-0:438          vector-scale ( temp 2-component vector of float)
-0:438            'inF0' ( in float)
-0:438            'inFV0' ( in 2-component vector of float)
-0:438      Sequence
-0:438        move second child to first child ( temp 2-component vector of float)
-0:438          'r2' ( temp 2-component vector of float)
-0:438          vector-scale ( temp 2-component vector of float)
-0:438            'inFV0' ( in 2-component vector of float)
-0:438            'inF0' ( in float)
-0:438      Sequence
-0:438        move second child to first child ( temp float)
-0:438          'r3' ( temp float)
-0:438          dot-product ( temp float)
-0:438            'inFV0' ( in 2-component vector of float)
-0:438            'inFV1' ( in 2-component vector of float)
-0:438      Sequence
-0:438        move second child to first child ( temp 2-component vector of float)
-0:438          'r4' ( temp 2-component vector of float)
-0:438          vector-times-matrix ( temp 2-component vector of float)
-0:438            'inFV0' ( in 2-component vector of float)
-0:438            'inFM0' ( in 2X2 matrix of float)
-0:438      Sequence
-0:438        move second child to first child ( temp 2-component vector of float)
-0:438          'r5' ( temp 2-component vector of float)
-0:438          matrix-times-vector ( temp 2-component vector of float)
-0:438            'inFM0' ( in 2X2 matrix of float)
-0:438            'inFV0' ( in 2-component vector of float)
-0:438      Sequence
-0:438        move second child to first child ( temp 2X2 matrix of float)
-0:438          'r6' ( temp 2X2 matrix of float)
-0:438          matrix-scale ( temp 2X2 matrix of float)
-0:438            'inF0' ( in float)
-0:438            'inFM0' ( in 2X2 matrix of float)
-0:438      Sequence
-0:438        move second child to first child ( temp 2X2 matrix of float)
-0:438          'r7' ( temp 2X2 matrix of float)
-0:438          matrix-scale ( temp 2X2 matrix of float)
-0:438            'inFM0' ( in 2X2 matrix of float)
-0:438            'inF0' ( in float)
-0:438      Sequence
-0:438        move second child to first child ( temp 2X2 matrix of float)
-0:438          'r8' ( temp 2X2 matrix of float)
-0:438          matrix-multiply ( temp 2X2 matrix of float)
-0:438            'inFM1' ( in 2X2 matrix of float)
-0:438            'inFM0' ( in 2X2 matrix of float)
-0:444  Function Definition: TestGenMul3(f1;f1;vf3;vf3;mf33;mf33; ( temp void)
-0:444    Function Parameters: 
-0:444      'inF0' ( in float)
-0:444      'inF1' ( in float)
-0:444      'inFV0' ( in 3-component vector of float)
-0:444      'inFV1' ( in 3-component vector of float)
-0:444      'inFM0' ( in 3X3 matrix of float)
-0:444      'inFM1' ( in 3X3 matrix of float)
+0:443      Sequence
+0:443        move second child to first child ( temp float)
+0:443          'r0' ( temp float)
+0:443          component-wise multiply ( temp float)
+0:443            'inF1' ( in float)
+0:443            'inF0' ( in float)
+0:443      Sequence
+0:443        move second child to first child ( temp 2-component vector of float)
+0:443          'r1' ( temp 2-component vector of float)
+0:443          vector-scale ( temp 2-component vector of float)
+0:443            'inF0' ( in float)
+0:443            'inFV0' ( in 2-component vector of float)
+0:443      Sequence
+0:443        move second child to first child ( temp 2-component vector of float)
+0:443          'r2' ( temp 2-component vector of float)
+0:443          vector-scale ( temp 2-component vector of float)
+0:443            'inFV0' ( in 2-component vector of float)
+0:443            'inF0' ( in float)
+0:443      Sequence
+0:443        move second child to first child ( temp float)
+0:443          'r3' ( temp float)
+0:443          dot-product ( temp float)
+0:443            'inFV0' ( in 2-component vector of float)
+0:443            'inFV1' ( in 2-component vector of float)
+0:443      Sequence
+0:443        move second child to first child ( temp 2-component vector of float)
+0:443          'r4' ( temp 2-component vector of float)
+0:443          vector-times-matrix ( temp 2-component vector of float)
+0:443            'inFV0' ( in 2-component vector of float)
+0:443            'inFM0' ( in 2X2 matrix of float)
+0:443      Sequence
+0:443        move second child to first child ( temp 2-component vector of float)
+0:443          'r5' ( temp 2-component vector of float)
+0:443          matrix-times-vector ( temp 2-component vector of float)
+0:443            'inFM0' ( in 2X2 matrix of float)
+0:443            'inFV0' ( in 2-component vector of float)
+0:443      Sequence
+0:443        move second child to first child ( temp 2X2 matrix of float)
+0:443          'r6' ( temp 2X2 matrix of float)
+0:443          matrix-scale ( temp 2X2 matrix of float)
+0:443            'inF0' ( in float)
+0:443            'inFM0' ( in 2X2 matrix of float)
+0:443      Sequence
+0:443        move second child to first child ( temp 2X2 matrix of float)
+0:443          'r7' ( temp 2X2 matrix of float)
+0:443          matrix-scale ( temp 2X2 matrix of float)
+0:443            'inFM0' ( in 2X2 matrix of float)
+0:443            'inF0' ( in float)
+0:443      Sequence
+0:443        move second child to first child ( temp 2X2 matrix of float)
+0:443          'r8' ( temp 2X2 matrix of float)
+0:443          matrix-multiply ( temp 2X2 matrix of float)
+0:443            'inFM1' ( in 2X2 matrix of float)
+0:443            'inFM0' ( in 2X2 matrix of float)
+0:449  Function Definition: TestGenMul3(f1;f1;vf3;vf3;mf33;mf33; ( temp void)
+0:449    Function Parameters: 
+0:449      'inF0' ( in float)
+0:449      'inF1' ( in float)
+0:449      'inFV0' ( in 3-component vector of float)
+0:449      'inFV1' ( in 3-component vector of float)
+0:449      'inFM0' ( in 3X3 matrix of float)
+0:449      'inFM1' ( in 3X3 matrix of float)
 0:?     Sequence
-0:445      Sequence
-0:445        move second child to first child ( temp float)
-0:445          'r0' ( temp float)
-0:445          component-wise multiply ( temp float)
-0:445            'inF1' ( in float)
-0:445            'inF0' ( in float)
-0:445      Sequence
-0:445        move second child to first child ( temp 3-component vector of float)
-0:445          'r1' ( temp 3-component vector of float)
-0:445          vector-scale ( temp 3-component vector of float)
-0:445            'inF0' ( in float)
-0:445            'inFV0' ( in 3-component vector of float)
-0:445      Sequence
-0:445        move second child to first child ( temp 3-component vector of float)
-0:445          'r2' ( temp 3-component vector of float)
-0:445          vector-scale ( temp 3-component vector of float)
-0:445            'inFV0' ( in 3-component vector of float)
-0:445            'inF0' ( in float)
-0:445      Sequence
-0:445        move second child to first child ( temp float)
-0:445          'r3' ( temp float)
-0:445          dot-product ( temp float)
-0:445            'inFV0' ( in 3-component vector of float)
-0:445            'inFV1' ( in 3-component vector of float)
-0:445      Sequence
-0:445        move second child to first child ( temp 3-component vector of float)
-0:445          'r4' ( temp 3-component vector of float)
-0:445          vector-times-matrix ( temp 3-component vector of float)
-0:445            'inFV0' ( in 3-component vector of float)
-0:445            'inFM0' ( in 3X3 matrix of float)
-0:445      Sequence
-0:445        move second child to first child ( temp 3-component vector of float)
-0:445          'r5' ( temp 3-component vector of float)
-0:445          matrix-times-vector ( temp 3-component vector of float)
-0:445            'inFM0' ( in 3X3 matrix of float)
-0:445            'inFV0' ( in 3-component vector of float)
-0:445      Sequence
-0:445        move second child to first child ( temp 3X3 matrix of float)
-0:445          'r6' ( temp 3X3 matrix of float)
-0:445          matrix-scale ( temp 3X3 matrix of float)
-0:445            'inF0' ( in float)
-0:445            'inFM0' ( in 3X3 matrix of float)
-0:445      Sequence
-0:445        move second child to first child ( temp 3X3 matrix of float)
-0:445          'r7' ( temp 3X3 matrix of float)
-0:445          matrix-scale ( temp 3X3 matrix of float)
-0:445            'inFM0' ( in 3X3 matrix of float)
-0:445            'inF0' ( in float)
-0:445      Sequence
-0:445        move second child to first child ( temp 3X3 matrix of float)
-0:445          'r8' ( temp 3X3 matrix of float)
-0:445          matrix-multiply ( temp 3X3 matrix of float)
-0:445            'inFM1' ( in 3X3 matrix of float)
-0:445            'inFM0' ( in 3X3 matrix of float)
-0:451  Function Definition: TestGenMul4(f1;f1;vf4;vf4;mf44;mf44; ( temp void)
-0:451    Function Parameters: 
-0:451      'inF0' ( in float)
-0:451      'inF1' ( in float)
-0:451      'inFV0' ( in 4-component vector of float)
-0:451      'inFV1' ( in 4-component vector of float)
-0:451      'inFM0' ( in 4X4 matrix of float)
-0:451      'inFM1' ( in 4X4 matrix of float)
+0:450      Sequence
+0:450        move second child to first child ( temp float)
+0:450          'r0' ( temp float)
+0:450          component-wise multiply ( temp float)
+0:450            'inF1' ( in float)
+0:450            'inF0' ( in float)
+0:450      Sequence
+0:450        move second child to first child ( temp 3-component vector of float)
+0:450          'r1' ( temp 3-component vector of float)
+0:450          vector-scale ( temp 3-component vector of float)
+0:450            'inF0' ( in float)
+0:450            'inFV0' ( in 3-component vector of float)
+0:450      Sequence
+0:450        move second child to first child ( temp 3-component vector of float)
+0:450          'r2' ( temp 3-component vector of float)
+0:450          vector-scale ( temp 3-component vector of float)
+0:450            'inFV0' ( in 3-component vector of float)
+0:450            'inF0' ( in float)
+0:450      Sequence
+0:450        move second child to first child ( temp float)
+0:450          'r3' ( temp float)
+0:450          dot-product ( temp float)
+0:450            'inFV0' ( in 3-component vector of float)
+0:450            'inFV1' ( in 3-component vector of float)
+0:450      Sequence
+0:450        move second child to first child ( temp 3-component vector of float)
+0:450          'r4' ( temp 3-component vector of float)
+0:450          vector-times-matrix ( temp 3-component vector of float)
+0:450            'inFV0' ( in 3-component vector of float)
+0:450            'inFM0' ( in 3X3 matrix of float)
+0:450      Sequence
+0:450        move second child to first child ( temp 3-component vector of float)
+0:450          'r5' ( temp 3-component vector of float)
+0:450          matrix-times-vector ( temp 3-component vector of float)
+0:450            'inFM0' ( in 3X3 matrix of float)
+0:450            'inFV0' ( in 3-component vector of float)
+0:450      Sequence
+0:450        move second child to first child ( temp 3X3 matrix of float)
+0:450          'r6' ( temp 3X3 matrix of float)
+0:450          matrix-scale ( temp 3X3 matrix of float)
+0:450            'inF0' ( in float)
+0:450            'inFM0' ( in 3X3 matrix of float)
+0:450      Sequence
+0:450        move second child to first child ( temp 3X3 matrix of float)
+0:450          'r7' ( temp 3X3 matrix of float)
+0:450          matrix-scale ( temp 3X3 matrix of float)
+0:450            'inFM0' ( in 3X3 matrix of float)
+0:450            'inF0' ( in float)
+0:450      Sequence
+0:450        move second child to first child ( temp 3X3 matrix of float)
+0:450          'r8' ( temp 3X3 matrix of float)
+0:450          matrix-multiply ( temp 3X3 matrix of float)
+0:450            'inFM1' ( in 3X3 matrix of float)
+0:450            'inFM0' ( in 3X3 matrix of float)
+0:456  Function Definition: TestGenMul4(f1;f1;vf4;vf4;mf44;mf44; ( temp void)
+0:456    Function Parameters: 
+0:456      'inF0' ( in float)
+0:456      'inF1' ( in float)
+0:456      'inFV0' ( in 4-component vector of float)
+0:456      'inFV1' ( in 4-component vector of float)
+0:456      'inFM0' ( in 4X4 matrix of float)
+0:456      'inFM1' ( in 4X4 matrix of float)
 0:?     Sequence
-0:452      Sequence
-0:452        move second child to first child ( temp float)
-0:452          'r0' ( temp float)
-0:452          component-wise multiply ( temp float)
-0:452            'inF1' ( in float)
-0:452            'inF0' ( in float)
-0:452      Sequence
-0:452        move second child to first child ( temp 4-component vector of float)
-0:452          'r1' ( temp 4-component vector of float)
-0:452          vector-scale ( temp 4-component vector of float)
-0:452            'inF0' ( in float)
-0:452            'inFV0' ( in 4-component vector of float)
-0:452      Sequence
-0:452        move second child to first child ( temp 4-component vector of float)
-0:452          'r2' ( temp 4-component vector of float)
-0:452          vector-scale ( temp 4-component vector of float)
-0:452            'inFV0' ( in 4-component vector of float)
-0:452            'inF0' ( in float)
-0:452      Sequence
-0:452        move second child to first child ( temp float)
-0:452          'r3' ( temp float)
-0:452          dot-product ( temp float)
-0:452            'inFV0' ( in 4-component vector of float)
-0:452            'inFV1' ( in 4-component vector of float)
-0:452      Sequence
-0:452        move second child to first child ( temp 4-component vector of float)
-0:452          'r4' ( temp 4-component vector of float)
-0:452          vector-times-matrix ( temp 4-component vector of float)
-0:452            'inFV0' ( in 4-component vector of float)
-0:452            'inFM0' ( in 4X4 matrix of float)
-0:452      Sequence
-0:452        move second child to first child ( temp 4-component vector of float)
-0:452          'r5' ( temp 4-component vector of float)
-0:452          matrix-times-vector ( temp 4-component vector of float)
-0:452            'inFM0' ( in 4X4 matrix of float)
-0:452            'inFV0' ( in 4-component vector of float)
-0:452      Sequence
-0:452        move second child to first child ( temp 4X4 matrix of float)
-0:452          'r6' ( temp 4X4 matrix of float)
-0:452          matrix-scale ( temp 4X4 matrix of float)
-0:452            'inF0' ( in float)
-0:452            'inFM0' ( in 4X4 matrix of float)
-0:452      Sequence
-0:452        move second child to first child ( temp 4X4 matrix of float)
-0:452          'r7' ( temp 4X4 matrix of float)
-0:452          matrix-scale ( temp 4X4 matrix of float)
-0:452            'inFM0' ( in 4X4 matrix of float)
-0:452            'inF0' ( in float)
-0:452      Sequence
-0:452        move second child to first child ( temp 4X4 matrix of float)
-0:452          'r8' ( temp 4X4 matrix of float)
-0:452          matrix-multiply ( temp 4X4 matrix of float)
-0:452            'inFM1' ( in 4X4 matrix of float)
-0:452            'inFM0' ( in 4X4 matrix of float)
-0:461  Function Definition: TestGenMulNxM(f1;f1;vf2;vf3;mf23;mf32;mf33;mf34;mf24; ( temp void)
-0:461    Function Parameters: 
-0:461      'inF0' ( in float)
-0:461      'inF1' ( in float)
-0:461      'inFV2' ( in 2-component vector of float)
-0:461      'inFV3' ( in 3-component vector of float)
-0:461      'inFM2x3' ( in 2X3 matrix of float)
-0:461      'inFM3x2' ( in 3X2 matrix of float)
-0:461      'inFM3x3' ( in 3X3 matrix of float)
-0:461      'inFM3x4' ( in 3X4 matrix of float)
-0:461      'inFM2x4' ( in 2X4 matrix of float)
+0:457      Sequence
+0:457        move second child to first child ( temp float)
+0:457          'r0' ( temp float)
+0:457          component-wise multiply ( temp float)
+0:457            'inF1' ( in float)
+0:457            'inF0' ( in float)
+0:457      Sequence
+0:457        move second child to first child ( temp 4-component vector of float)
+0:457          'r1' ( temp 4-component vector of float)
+0:457          vector-scale ( temp 4-component vector of float)
+0:457            'inF0' ( in float)
+0:457            'inFV0' ( in 4-component vector of float)
+0:457      Sequence
+0:457        move second child to first child ( temp 4-component vector of float)
+0:457          'r2' ( temp 4-component vector of float)
+0:457          vector-scale ( temp 4-component vector of float)
+0:457            'inFV0' ( in 4-component vector of float)
+0:457            'inF0' ( in float)
+0:457      Sequence
+0:457        move second child to first child ( temp float)
+0:457          'r3' ( temp float)
+0:457          dot-product ( temp float)
+0:457            'inFV0' ( in 4-component vector of float)
+0:457            'inFV1' ( in 4-component vector of float)
+0:457      Sequence
+0:457        move second child to first child ( temp 4-component vector of float)
+0:457          'r4' ( temp 4-component vector of float)
+0:457          vector-times-matrix ( temp 4-component vector of float)
+0:457            'inFV0' ( in 4-component vector of float)
+0:457            'inFM0' ( in 4X4 matrix of float)
+0:457      Sequence
+0:457        move second child to first child ( temp 4-component vector of float)
+0:457          'r5' ( temp 4-component vector of float)
+0:457          matrix-times-vector ( temp 4-component vector of float)
+0:457            'inFM0' ( in 4X4 matrix of float)
+0:457            'inFV0' ( in 4-component vector of float)
+0:457      Sequence
+0:457        move second child to first child ( temp 4X4 matrix of float)
+0:457          'r6' ( temp 4X4 matrix of float)
+0:457          matrix-scale ( temp 4X4 matrix of float)
+0:457            'inF0' ( in float)
+0:457            'inFM0' ( in 4X4 matrix of float)
+0:457      Sequence
+0:457        move second child to first child ( temp 4X4 matrix of float)
+0:457          'r7' ( temp 4X4 matrix of float)
+0:457          matrix-scale ( temp 4X4 matrix of float)
+0:457            'inFM0' ( in 4X4 matrix of float)
+0:457            'inF0' ( in float)
+0:457      Sequence
+0:457        move second child to first child ( temp 4X4 matrix of float)
+0:457          'r8' ( temp 4X4 matrix of float)
+0:457          matrix-multiply ( temp 4X4 matrix of float)
+0:457            'inFM1' ( in 4X4 matrix of float)
+0:457            'inFM0' ( in 4X4 matrix of float)
+0:466  Function Definition: TestGenMulNxM(f1;f1;vf2;vf3;mf23;mf32;mf33;mf34;mf24; ( temp void)
+0:466    Function Parameters: 
+0:466      'inF0' ( in float)
+0:466      'inF1' ( in float)
+0:466      'inFV2' ( in 2-component vector of float)
+0:466      'inFV3' ( in 3-component vector of float)
+0:466      'inFM2x3' ( in 2X3 matrix of float)
+0:466      'inFM3x2' ( in 3X2 matrix of float)
+0:466      'inFM3x3' ( in 3X3 matrix of float)
+0:466      'inFM3x4' ( in 3X4 matrix of float)
+0:466      'inFM2x4' ( in 2X4 matrix of float)
 0:?     Sequence
-0:462      Sequence
-0:462        move second child to first child ( temp float)
-0:462          'r00' ( temp float)
-0:462          component-wise multiply ( temp float)
-0:462            'inF1' ( in float)
-0:462            'inF0' ( in float)
-0:463      Sequence
-0:463        move second child to first child ( temp 2-component vector of float)
-0:463          'r01' ( temp 2-component vector of float)
-0:463          vector-scale ( temp 2-component vector of float)
-0:463            'inF0' ( in float)
-0:463            'inFV2' ( in 2-component vector of float)
-0:464      Sequence
-0:464        move second child to first child ( temp 3-component vector of float)
-0:464          'r02' ( temp 3-component vector of float)
-0:464          vector-scale ( temp 3-component vector of float)
-0:464            'inF0' ( in float)
-0:464            'inFV3' ( in 3-component vector of float)
-0:465      Sequence
-0:465        move second child to first child ( temp 2-component vector of float)
-0:465          'r03' ( temp 2-component vector of float)
-0:465          vector-scale ( temp 2-component vector of float)
-0:465            'inFV2' ( in 2-component vector of float)
-0:465            'inF0' ( in float)
-0:466      Sequence
-0:466        move second child to first child ( temp 3-component vector of float)
-0:466          'r04' ( temp 3-component vector of float)
-0:466          vector-scale ( temp 3-component vector of float)
-0:466            'inFV3' ( in 3-component vector of float)
-0:466            'inF0' ( in float)
 0:467      Sequence
 0:467        move second child to first child ( temp float)
-0:467          'r05' ( temp float)
-0:467          dot-product ( temp float)
-0:467            'inFV2' ( in 2-component vector of float)
-0:467            'inFV2' ( in 2-component vector of float)
+0:467          'r00' ( temp float)
+0:467          component-wise multiply ( temp float)
+0:467            'inF1' ( in float)
+0:467            'inF0' ( in float)
 0:468      Sequence
-0:468        move second child to first child ( temp float)
-0:468          'r06' ( temp float)
-0:468          dot-product ( temp float)
-0:468            'inFV3' ( in 3-component vector of float)
-0:468            'inFV3' ( in 3-component vector of float)
+0:468        move second child to first child ( temp 2-component vector of float)
+0:468          'r01' ( temp 2-component vector of float)
+0:468          vector-scale ( temp 2-component vector of float)
+0:468            'inF0' ( in float)
+0:468            'inFV2' ( in 2-component vector of float)
 0:469      Sequence
 0:469        move second child to first child ( temp 3-component vector of float)
-0:469          'r07' ( temp 3-component vector of float)
-0:469          matrix-times-vector ( temp 3-component vector of float)
-0:469            'inFM2x3' ( in 2X3 matrix of float)
-0:469            'inFV2' ( in 2-component vector of float)
+0:469          'r02' ( temp 3-component vector of float)
+0:469          vector-scale ( temp 3-component vector of float)
+0:469            'inF0' ( in float)
+0:469            'inFV3' ( in 3-component vector of float)
 0:470      Sequence
 0:470        move second child to first child ( temp 2-component vector of float)
-0:470          'r08' ( temp 2-component vector of float)
-0:470          matrix-times-vector ( temp 2-component vector of float)
-0:470            'inFM3x2' ( in 3X2 matrix of float)
-0:470            'inFV3' ( in 3-component vector of float)
+0:470          'r03' ( temp 2-component vector of float)
+0:470          vector-scale ( temp 2-component vector of float)
+0:470            'inFV2' ( in 2-component vector of float)
+0:470            'inF0' ( in float)
 0:471      Sequence
-0:471        move second child to first child ( temp 2-component vector of float)
-0:471          'r09' ( temp 2-component vector of float)
-0:471          vector-times-matrix ( temp 2-component vector of float)
+0:471        move second child to first child ( temp 3-component vector of float)
+0:471          'r04' ( temp 3-component vector of float)
+0:471          vector-scale ( temp 3-component vector of float)
 0:471            'inFV3' ( in 3-component vector of float)
-0:471            'inFM2x3' ( in 2X3 matrix of float)
+0:471            'inF0' ( in float)
 0:472      Sequence
-0:472        move second child to first child ( temp 3-component vector of float)
-0:472          'r10' ( temp 3-component vector of float)
-0:472          vector-times-matrix ( temp 3-component vector of float)
+0:472        move second child to first child ( temp float)
+0:472          'r05' ( temp float)
+0:472          dot-product ( temp float)
 0:472            'inFV2' ( in 2-component vector of float)
-0:472            'inFM3x2' ( in 3X2 matrix of float)
+0:472            'inFV2' ( in 2-component vector of float)
 0:473      Sequence
-0:473        move second child to first child ( temp 2X3 matrix of float)
-0:473          'r11' ( temp 2X3 matrix of float)
-0:473          matrix-scale ( temp 2X3 matrix of float)
-0:473            'inF0' ( in float)
-0:473            'inFM2x3' ( in 2X3 matrix of float)
+0:473        move second child to first child ( temp float)
+0:473          'r06' ( temp float)
+0:473          dot-product ( temp float)
+0:473            'inFV3' ( in 3-component vector of float)
+0:473            'inFV3' ( in 3-component vector of float)
 0:474      Sequence
-0:474        move second child to first child ( temp 3X2 matrix of float)
-0:474          'r12' ( temp 3X2 matrix of float)
-0:474          matrix-scale ( temp 3X2 matrix of float)
-0:474            'inF0' ( in float)
-0:474            'inFM3x2' ( in 3X2 matrix of float)
+0:474        move second child to first child ( temp 3-component vector of float)
+0:474          'r07' ( temp 3-component vector of float)
+0:474          matrix-times-vector ( temp 3-component vector of float)
+0:474            'inFM2x3' ( in 2X3 matrix of float)
+0:474            'inFV2' ( in 2-component vector of float)
 0:475      Sequence
-0:475        move second child to first child ( temp 2X2 matrix of float)
-0:475          'r13' ( temp 2X2 matrix of float)
-0:475          matrix-multiply ( temp 2X2 matrix of float)
+0:475        move second child to first child ( temp 2-component vector of float)
+0:475          'r08' ( temp 2-component vector of float)
+0:475          matrix-times-vector ( temp 2-component vector of float)
 0:475            'inFM3x2' ( in 3X2 matrix of float)
-0:475            'inFM2x3' ( in 2X3 matrix of float)
+0:475            'inFV3' ( in 3-component vector of float)
 0:476      Sequence
-0:476        move second child to first child ( temp 2X3 matrix of float)
-0:476          'r14' ( temp 2X3 matrix of float)
-0:476          matrix-multiply ( temp 2X3 matrix of float)
-0:476            'inFM3x3' ( in 3X3 matrix of float)
+0:476        move second child to first child ( temp 2-component vector of float)
+0:476          'r09' ( temp 2-component vector of float)
+0:476          vector-times-matrix ( temp 2-component vector of float)
+0:476            'inFV3' ( in 3-component vector of float)
 0:476            'inFM2x3' ( in 2X3 matrix of float)
 0:477      Sequence
-0:477        move second child to first child ( temp 2X4 matrix of float)
-0:477          'r15' ( temp 2X4 matrix of float)
-0:477          matrix-multiply ( temp 2X4 matrix of float)
-0:477            'inFM3x4' ( in 3X4 matrix of float)
-0:477            'inFM2x3' ( in 2X3 matrix of float)
+0:477        move second child to first child ( temp 3-component vector of float)
+0:477          'r10' ( temp 3-component vector of float)
+0:477          vector-times-matrix ( temp 3-component vector of float)
+0:477            'inFV2' ( in 2-component vector of float)
+0:477            'inFM3x2' ( in 3X2 matrix of float)
 0:478      Sequence
-0:478        move second child to first child ( temp 3X4 matrix of float)
-0:478          'r16' ( temp 3X4 matrix of float)
-0:478          matrix-multiply ( temp 3X4 matrix of float)
-0:478            'inFM2x4' ( in 2X4 matrix of float)
-0:478            'inFM3x2' ( in 3X2 matrix of float)
-0:484  Function Definition: @main( ( temp structure{ temp 4-component vector of float color})
-0:484    Function Parameters: 
+0:478        move second child to first child ( temp 2X3 matrix of float)
+0:478          'r11' ( temp 2X3 matrix of float)
+0:478          matrix-scale ( temp 2X3 matrix of float)
+0:478            'inF0' ( in float)
+0:478            'inFM2x3' ( in 2X3 matrix of float)
+0:479      Sequence
+0:479        move second child to first child ( temp 3X2 matrix of float)
+0:479          'r12' ( temp 3X2 matrix of float)
+0:479          matrix-scale ( temp 3X2 matrix of float)
+0:479            'inF0' ( in float)
+0:479            'inFM3x2' ( in 3X2 matrix of float)
+0:480      Sequence
+0:480        move second child to first child ( temp 2X2 matrix of float)
+0:480          'r13' ( temp 2X2 matrix of float)
+0:480          matrix-multiply ( temp 2X2 matrix of float)
+0:480            'inFM3x2' ( in 3X2 matrix of float)
+0:480            'inFM2x3' ( in 2X3 matrix of float)
+0:481      Sequence
+0:481        move second child to first child ( temp 2X3 matrix of float)
+0:481          'r14' ( temp 2X3 matrix of float)
+0:481          matrix-multiply ( temp 2X3 matrix of float)
+0:481            'inFM3x3' ( in 3X3 matrix of float)
+0:481            'inFM2x3' ( in 2X3 matrix of float)
+0:482      Sequence
+0:482        move second child to first child ( temp 2X4 matrix of float)
+0:482          'r15' ( temp 2X4 matrix of float)
+0:482          matrix-multiply ( temp 2X4 matrix of float)
+0:482            'inFM3x4' ( in 3X4 matrix of float)
+0:482            'inFM2x3' ( in 2X3 matrix of float)
+0:483      Sequence
+0:483        move second child to first child ( temp 3X4 matrix of float)
+0:483          'r16' ( temp 3X4 matrix of float)
+0:483          matrix-multiply ( temp 3X4 matrix of float)
+0:483            'inFM2x4' ( in 2X4 matrix of float)
+0:483            'inFM3x2' ( in 3X2 matrix of float)
+0:489  Function Definition: @main( ( temp structure{ temp 4-component vector of float color})
+0:489    Function Parameters: 
 0:?     Sequence
-0:486      move second child to first child ( temp 4-component vector of float)
-0:486        color: direct index for structure ( temp 4-component vector of float)
-0:486          'ps_output' ( temp structure{ temp 4-component vector of float color})
-0:486          Constant:
-0:486            0 (const int)
-0:486        Constant:
-0:486          1.000000
-0:486          1.000000
-0:486          1.000000
-0:486          1.000000
-0:487      Branch: Return with expression
-0:487        'ps_output' ( temp structure{ temp 4-component vector of float color})
-0:484  Function Definition: main( ( temp void)
-0:484    Function Parameters: 
+0:491      move second child to first child ( temp 4-component vector of float)
+0:491        color: direct index for structure ( temp 4-component vector of float)
+0:491          'ps_output' ( temp structure{ temp 4-component vector of float color})
+0:491          Constant:
+0:491            0 (const int)
+0:491        Constant:
+0:491          1.000000
+0:491          1.000000
+0:491          1.000000
+0:491          1.000000
+0:492      Branch: Return with expression
+0:492        'ps_output' ( temp structure{ temp 4-component vector of float color})
+0:489  Function Definition: main( ( temp void)
+0:489    Function Parameters: 
 0:?     Sequence
-0:484      Sequence
-0:484        move second child to first child ( temp 4-component vector of float)
-0:?           'color' (layout( location=0) out 4-component vector of float)
-0:484          color: direct index for structure ( temp 4-component vector of float)
-0:484            Function Call: @main( ( temp structure{ temp 4-component vector of float color})
-0:484            Constant:
-0:484              0 (const int)
+0:489      Sequence
+0:489        move second child to first child ( temp 4-component vector of float)
+0:?           '@entryPointOutput.color' (layout( location=0) out 4-component vector of float)
+0:489          color: direct index for structure ( temp 4-component vector of float)
+0:489            Function Call: @main( ( temp structure{ temp 4-component vector of float color})
+0:489            Constant:
+0:489              0 (const int)
 0:?   Linker Objects
 0:?     'gs_ua' ( shared uint)
 0:?     'gs_ub' ( shared uint)
@@ -5519,2781 +5641,2840 @@
 0:?     'gs_ua4' ( shared 4-component vector of uint)
 0:?     'gs_ub4' ( shared 4-component vector of uint)
 0:?     'gs_uc4' ( shared 4-component vector of uint)
-0:?     'color' (layout( location=0) out 4-component vector of float)
+0:?     '@entryPointOutput.color' (layout( location=0) out 4-component vector of float)
+
+error: SPIRV-Tools Validation Errors
+error: Matrix types can only be parameterized with floating-point types.
+  %mat2v2bool = OpTypeMatrix %v2bool 2
 
 // Module Version 10000
-// Generated by (magic number): 80001
-// Id's are bound by 1791
+// Generated by (magic number): 80007
+// Id's are bound by 1836
 
                               Capability Shader
                               Capability DerivativeControl
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "main" 1772
+                              EntryPoint Fragment 4  "main" 1817
                               ExecutionMode 4 OriginUpperLeft
                               Source HLSL 500
                               Name 4  "main"
-                              Name 16  "PixelShaderFunctionS(f1;f1;f1;u1;u1;"
-                              Name 11  "inF0"
-                              Name 12  "inF1"
-                              Name 13  "inF2"
-                              Name 14  "inU0"
-                              Name 15  "inU1"
-                              Name 22  "PixelShaderFunction1(vf1;vf1;vf1;"
-                              Name 19  "inF0"
-                              Name 20  "inF1"
-                              Name 21  "inF2"
-                              Name 34  "PixelShaderFunction2(vf2;vf2;vf2;vu2;vu2;"
-                              Name 29  "inF0"
-                              Name 30  "inF1"
-                              Name 31  "inF2"
-                              Name 32  "inU0"
-                              Name 33  "inU1"
-                              Name 46  "PixelShaderFunction3(vf3;vf3;vf3;vu3;vu3;"
-                              Name 41  "inF0"
-                              Name 42  "inF1"
-                              Name 43  "inF2"
-                              Name 44  "inU0"
-                              Name 45  "inU1"
-                              Name 58  "PixelShaderFunction(vf4;vf4;vf4;vu4;vu4;"
-                              Name 53  "inF0"
-                              Name 54  "inF1"
-                              Name 55  "inF2"
-                              Name 56  "inU0"
-                              Name 57  "inU1"
-                              Name 66  "PixelShaderFunction2x2(mf22;mf22;mf22;"
-                              Name 63  "inF0"
-                              Name 64  "inF1"
-                              Name 65  "inF2"
-                              Name 74  "PixelShaderFunction3x3(mf33;mf33;mf33;"
-                              Name 71  "inF0"
-                              Name 72  "inF1"
-                              Name 73  "inF2"
-                              Name 82  "PixelShaderFunction4x4(mf44;mf44;mf44;"
-                              Name 79  "inF0"
-                              Name 80  "inF1"
-                              Name 81  "inF2"
-                              Name 91  "TestGenMul2(f1;f1;vf2;vf2;mf22;mf22;"
-                              Name 85  "inF0"
-                              Name 86  "inF1"
-                              Name 87  "inFV0"
-                              Name 88  "inFV1"
-                              Name 89  "inFM0"
-                              Name 90  "inFM1"
-                              Name 100  "TestGenMul3(f1;f1;vf3;vf3;mf33;mf33;"
-                              Name 94  "inF0"
-                              Name 95  "inF1"
-                              Name 96  "inFV0"
-                              Name 97  "inFV1"
-                              Name 98  "inFM0"
-                              Name 99  "inFM1"
-                              Name 109  "TestGenMul4(f1;f1;vf4;vf4;mf44;mf44;"
-                              Name 103  "inF0"
-                              Name 104  "inF1"
-                              Name 105  "inFV0"
-                              Name 106  "inFV1"
-                              Name 107  "inFM0"
-                              Name 108  "inFM1"
-                              Name 129  "TestGenMulNxM(f1;f1;vf2;vf3;mf23;mf32;mf33;mf34;mf24;"
-                              Name 120  "inF0"
-                              Name 121  "inF1"
-                              Name 122  "inFV2"
-                              Name 123  "inFV3"
-                              Name 124  "inFM2x3"
-                              Name 125  "inFM3x2"
-                              Name 126  "inFM3x3"
-                              Name 127  "inFM3x4"
-                              Name 128  "inFM2x4"
-                              Name 131  "PS_OUTPUT"
-                              MemberName 131(PS_OUTPUT) 0  "color"
-                              Name 133  "@main("
-                              Name 137  "r000"
-                              Name 140  "r001"
-                              Name 143  "r002"
-                              Name 146  "r003"
-                              Name 149  "r004"
-                              Name 154  "r005"
-                              Name 157  "r006"
-                              Name 160  "r007"
-                              Name 163  "r009"
-                              Name 166  "r010"
-                              Name 170  "r011"
-                              Name 173  "r012"
-                              Name 184  "r014"
-                              Name 187  "r015"
-                              Name 190  "r016"
-                              Name 193  "r017"
-                              Name 196  "r018"
-                              Name 199  "r019"
-                              Name 202  "r020"
-                              Name 205  "r021"
-                              Name 208  "r022"
-                              Name 211  "r023"
-                              Name 214  "r027"
-                              Name 217  "r028"
-                              Name 220  "r029"
-                              Name 223  "r030"
-                              Name 226  "r031"
-                              Name 229  "r033"
-                              Name 233  "r034"
-                              Name 236  "r036"
-                              Name 239  "r037"
-                              Name 242  "r038"
-                              Name 245  "r039"
-                              Name 249  "r039a"
-                              Name 254  "r040"
-                              Name 257  "r041"
-                              Name 262  "r042"
-                              Name 265  "r043"
-                              Name 269  "r044"
-                              Name 273  "r045"
-                              Name 277  "r046"
-                              Name 280  "r047"
-                              Name 284  "r048"
-                              Name 288  "r049"
-                              Name 291  "r050"
-                              Name 294  "r051"
-                              Name 297  "r052"
-                              Name 300  "r053"
-                              Name 307  "r055"
-                              Name 310  "r056"
-                              Name 315  "r057"
-                              Name 318  "r058"
-                              Name 322  "r059"
-                              Name 325  "r060"
-                              Name 328  "r061"
-                              Name 335  "r000"
-                              Name 338  "r001"
-                              Name 341  "r002"
-                              Name 344  "r003"
-                              Name 347  "r004"
-                              Name 352  "r005"
-                              Name 355  "r006"
-                              Name 358  "r007"
-                              Name 361  "r009"
-                              Name 364  "r010"
-                              Name 368  "r011"
-                              Name 371  "r012"
-                              Name 384  "r013"
-                              Name 387  "r015"
-                              Name 390  "r016"
-                              Name 394  "r017"
-                              Name 397  "r018"
-                              Name 400  "r019"
-                              Name 403  "r020"
-                              Name 406  "r021"
-                              Name 409  "r022"
-                              Name 412  "r023"
-                              Name 415  "r026"
-                              Name 419  "r027"
-                              Name 423  "r028"
-                              Name 426  "r029"
-                              Name 429  "r030"
-                              Name 434  "r031"
-                              Name 439  "r032"
-                              Name 441  "r033"
-                              Name 444  "r035"
-                              Name 448  "r036"
-                              Name 451  "r038"
-                              Name 455  "r039"
-                              Name 458  "r040"
-                              Name 461  "r041"
-                              Name 465  "r039a"
-                              Name 470  "r042"
-                              Name 473  "r043"
-                              Name 476  "r044"
-                              Name 480  "r045"
-                              Name 483  "r046"
-                              Name 487  "r047"
-                              Name 491  "r048"
-                              Name 494  "r049"
-                              Name 498  "r050"
-                              Name 501  "r051"
-                              Name 505  "r052"
-                              Name 509  "r053"
-                              Name 514  "r054"
-                              Name 519  "r055"
-                              Name 522  "r056"
-                              Name 525  "r057"
-                              Name 530  "r058"
-                              Name 533  "r059"
-                              Name 540  "r060"
-                              Name 543  "r061"
-                              Name 548  "r062"
-                              Name 551  "r063"
-                              Name 555  "r064"
-                              Name 558  "r065"
-                              Name 561  "r066"
-                              Name 567  "r000"
-                              Name 570  "r001"
-                              Name 573  "r002"
-                              Name 576  "r003"
-                              Name 579  "r004"
-                              Name 584  "r005"
-                              Name 587  "r006"
-                              Name 590  "r007"
-                              Name 593  "r009"
-                              Name 596  "r010"
-                              Name 600  "r011"
-                              Name 603  "r012"
-                              Name 616  "r013"
-                              Name 619  "r014"
-                              Name 622  "r015"
-                              Name 627  "r016"
-                              Name 631  "r017"
-                              Name 634  "r018"
-                              Name 637  "r019"
-                              Name 640  "r020"
-                              Name 643  "r021"
-                              Name 646  "r022"
-                              Name 649  "r023"
-                              Name 652  "r024"
-                              Name 656  "r025"
-                              Name 660  "r029"
-                              Name 663  "r030"
-                              Name 666  "r031"
-                              Name 671  "r032"
-                              Name 675  "r033"
-                              Name 677  "r034"
-                              Name 680  "r036"
-                              Name 684  "r037"
-                              Name 687  "r039"
-                              Name 691  "r040"
-                              Name 694  "r041"
-                              Name 697  "r042"
-                              Name 701  "r039a"
-                              Name 706  "r039b"
-                              Name 712  "r043"
-                              Name 715  "r044"
-                              Name 718  "r045"
-                              Name 722  "r046"
-                              Name 725  "r047"
-                              Name 729  "r048"
-                              Name 733  "r049"
-                              Name 736  "r050"
-                              Name 740  "r051"
-                              Name 743  "r052"
-                              Name 747  "r053"
-                              Name 751  "r054"
-                              Name 755  "r055"
-                              Name 758  "r056"
-                              Name 761  "r057"
-                              Name 764  "r058"
-                              Name 769  "r059"
-                              Name 772  "r060"
-                              Name 779  "r061"
-                              Name 782  "r062"
-                              Name 787  "r063"
-                              Name 790  "r064"
-                              Name 794  "r065"
-                              Name 797  "r066"
-                              Name 800  "r067"
-                              Name 807  "r000"
-                              Name 810  "r001"
-                              Name 813  "r002"
-                              Name 816  "r003"
-                              Name 819  "r004"
-                              Name 824  "r005"
-                              Name 827  "r006"
-                              Name 830  "r007"
-                              Name 833  "r009"
-                              Name 836  "r010"
-                              Name 840  "r011"
-                              Name 843  "r012"
-                              Name 856  "r013"
-                              Name 859  "r014"
-                              Name 862  "r015"
-                              Name 865  "r016"
-                              Name 868  "r017"
-                              Name 871  "r018"
-                              Name 874  "r019"
-                              Name 877  "r020"
-                              Name 880  "r021"
-                              Name 883  "r022"
-                              Name 886  "r023"
-                              Name 890  "r024"
-                              Name 894  "r025"
-                              Name 905  "r029"
-                              Name 908  "r030"
-                              Name 911  "r031"
-                              Name 916  "r032"
-                              Name 921  "r033"
-                              Name 923  "r034"
-                              Name 926  "r036"
-                              Name 930  "r037"
-                              Name 933  "r039"
-                              Name 937  "r040"
-                              Name 940  "r041"
-                              Name 943  "r042"
-                              Name 947  "r039a"
-                              Name 952  "r043"
-                              Name 955  "r044"
-                              Name 958  "r045"
-                              Name 962  "r046"
-                              Name 965  "r047"
-                              Name 969  "r048"
-                              Name 973  "r049"
-                              Name 976  "r050"
-                              Name 980  "r051"
-                              Name 983  "r052"
-                              Name 987  "r053"
-                              Name 991  "r054"
-                              Name 995  "r055"
-                              Name 998  "r056"
-                              Name 1001  "r057"
-                              Name 1004  "r058"
-                              Name 1009  "r059"
-                              Name 1012  "r060"
-                              Name 1019  "r061"
-                              Name 1022  "r062"
-                              Name 1027  "r063"
-                              Name 1030  "r064"
-                              Name 1034  "r065"
-                              Name 1037  "r066"
-                              Name 1040  "r067"
-                              Name 1047  "r000"
-                              Name 1050  "r001"
-                              Name 1055  "r003"
-                              Name 1058  "r004"
-                              Name 1061  "r005"
-                              Name 1064  "r006"
-                              Name 1068  "r007"
-                              Name 1079  "r008"
-                              Name 1084  "r009"
-                              Name 1087  "r010"
-                              Name 1090  "r011"
-                              Name 1093  "r012"
-                              Name 1096  "r013"
-                              Name 1099  "r014"
-                              Name 1102  "r015"
-                              Name 1105  "r016"
-                              Name 1108  "r017"
-                              Name 1111  "r018"
-                              Name 1114  "r019"
-                              Name 1117  "R020"
-                              Name 1120  "r021"
-                              Name 1123  "r022"
-                              Name 1133  "r023"
-                              Name 1136  "r025"
-                              Name 1139  "r026"
-                              Name 1143  "r026a"
-                              Name 1148  "r027"
-                              Name 1151  "r028"
-                              Name 1155  "r029"
-                              Name 1158  "r030"
-                              Name 1162  "r031"
-                              Name 1166  "r032"
-                              Name 1170  "r033"
-                              Name 1173  "r034"
-                              Name 1176  "r035"
-                              Name 1179  "r036"
-                              Name 1184  "r037"
-                              Name 1187  "r038"
-                              Name 1194  "r039"
-                              Name 1197  "r049"
-                              Name 1202  "r041"
-                              Name 1205  "r042"
-                              Name 1209  "r043"
-                              Name 1212  "r044"
-                              Name 1217  "r046"
-                              Name 1224  "r000"
-                              Name 1227  "r001"
-                              Name 1232  "r003"
-                              Name 1235  "r004"
-                              Name 1238  "r005"
-                              Name 1241  "r006"
-                              Name 1245  "r007"
-                              Name 1256  "r008"
-                              Name 1261  "r009"
-                              Name 1264  "r010"
-                              Name 1267  "r011"
-                              Name 1270  "r012"
-                              Name 1273  "r013"
-                              Name 1276  "r014"
-                              Name 1279  "r015"
-                              Name 1282  "r016"
-                              Name 1285  "r017"
-                              Name 1288  "r018"
-                              Name 1291  "r019"
-                              Name 1294  "R020"
-                              Name 1297  "r021"
-                              Name 1300  "r022"
-                              Name 1313  "r023"
-                              Name 1316  "r025"
-                              Name 1319  "r026"
-                              Name 1323  "r026a"
-                              Name 1328  "r027"
-                              Name 1331  "r028"
-                              Name 1335  "r029"
-                              Name 1338  "r030"
-                              Name 1342  "r031"
-                              Name 1346  "r032"
-                              Name 1350  "r033"
-                              Name 1353  "r034"
-                              Name 1356  "r035"
-                              Name 1359  "r036"
-                              Name 1364  "r037"
-                              Name 1367  "r038"
-                              Name 1374  "r039"
-                              Name 1377  "r049"
-                              Name 1382  "r041"
-                              Name 1385  "r042"
-                              Name 1389  "r043"
-                              Name 1392  "r044"
-                              Name 1397  "r046"
-                              Name 1404  "r000"
-                              Name 1407  "r001"
-                              Name 1412  "r003"
-                              Name 1415  "r004"
-                              Name 1418  "r005"
-                              Name 1421  "r006"
-                              Name 1425  "r007"
-                              Name 1436  "r008"
-                              Name 1441  "r009"
-                              Name 1444  "r010"
-                              Name 1447  "r011"
-                              Name 1450  "r012"
-                              Name 1453  "r013"
-                              Name 1456  "r014"
-                              Name 1459  "r015"
-                              Name 1462  "r016"
-                              Name 1465  "r017"
-                              Name 1468  "r018"
-                              Name 1471  "r019"
-                              Name 1474  "R020"
-                              Name 1477  "r021"
-                              Name 1480  "r022"
-                              Name 1496  "r023"
-                              Name 1499  "r025"
-                              Name 1502  "r026"
-                              Name 1506  "r026a"
-                              Name 1511  "r027"
-                              Name 1514  "r028"
-                              Name 1518  "r029"
-                              Name 1521  "r030"
-                              Name 1525  "r031"
-                              Name 1529  "r032"
-                              Name 1533  "r033"
-                              Name 1536  "r034"
-                              Name 1539  "r035"
-                              Name 1542  "r036"
-                              Name 1547  "r037"
-                              Name 1550  "r038"
-                              Name 1557  "r039"
-                              Name 1560  "r049"
-                              Name 1565  "r041"
-                              Name 1568  "r042"
-                              Name 1572  "r043"
-                              Name 1575  "r044"
-                              Name 1580  "r046"
-                              Name 1587  "r0"
-                              Name 1591  "r1"
-                              Name 1595  "r2"
-                              Name 1599  "r3"
-                              Name 1603  "r4"
-                              Name 1607  "r5"
-                              Name 1611  "r6"
-                              Name 1615  "r7"
-                              Name 1619  "r8"
-                              Name 1623  "r0"
-                              Name 1627  "r1"
-                              Name 1631  "r2"
-                              Name 1635  "r3"
-                              Name 1639  "r4"
-                              Name 1643  "r5"
-                              Name 1647  "r6"
-                              Name 1651  "r7"
-                              Name 1655  "r8"
-                              Name 1659  "r0"
-                              Name 1663  "r1"
-                              Name 1667  "r2"
-                              Name 1671  "r3"
-                              Name 1675  "r4"
-                              Name 1679  "r5"
-                              Name 1683  "r6"
-                              Name 1687  "r7"
-                              Name 1691  "r8"
-                              Name 1695  "r00"
-                              Name 1699  "r01"
-                              Name 1703  "r02"
-                              Name 1707  "r03"
-                              Name 1711  "r04"
-                              Name 1715  "r05"
-                              Name 1719  "r06"
-                              Name 1723  "r07"
-                              Name 1727  "r08"
-                              Name 1731  "r09"
-                              Name 1735  "r10"
-                              Name 1739  "r11"
-                              Name 1743  "r12"
-                              Name 1747  "r13"
-                              Name 1751  "r14"
-                              Name 1755  "r15"
-                              Name 1759  "r16"
-                              Name 1764  "ps_output"
-                              Name 1772  "color"
-                              Name 1776  "gs_ua"
-                              Name 1777  "gs_ub"
-                              Name 1778  "gs_uc"
-                              Name 1780  "gs_ua2"
-                              Name 1781  "gs_ub2"
-                              Name 1782  "gs_uc2"
-                              Name 1784  "gs_ua3"
-                              Name 1785  "gs_ub3"
-                              Name 1786  "gs_uc3"
-                              Name 1788  "gs_ua4"
-                              Name 1789  "gs_ub4"
-                              Name 1790  "gs_uc4"
-                              Decorate 1772(color) Location 0
+                              Name 18  "PixelShaderFunctionS(f1;f1;f1;u1;i1;"
+                              Name 13  "inF0"
+                              Name 14  "inF1"
+                              Name 15  "inF2"
+                              Name 16  "inU0"
+                              Name 17  "inU1"
+                              Name 24  "PixelShaderFunction1(vf1;vf1;vf1;"
+                              Name 21  "inF0"
+                              Name 22  "inF1"
+                              Name 23  "inF2"
+                              Name 36  "PixelShaderFunction2(vf2;vf2;vf2;vu2;vu2;"
+                              Name 31  "inF0"
+                              Name 32  "inF1"
+                              Name 33  "inF2"
+                              Name 34  "inU0"
+                              Name 35  "inU1"
+                              Name 48  "PixelShaderFunction3(vf3;vf3;vf3;vu3;vu3;"
+                              Name 43  "inF0"
+                              Name 44  "inF1"
+                              Name 45  "inF2"
+                              Name 46  "inU0"
+                              Name 47  "inU1"
+                              Name 60  "PixelShaderFunction(vf4;vf4;vf4;vu4;vu4;"
+                              Name 55  "inF0"
+                              Name 56  "inF1"
+                              Name 57  "inF2"
+                              Name 58  "inU0"
+                              Name 59  "inU1"
+                              Name 68  "PixelShaderFunction2x2(mf22;mf22;mf22;"
+                              Name 65  "inF0"
+                              Name 66  "inF1"
+                              Name 67  "inF2"
+                              Name 76  "PixelShaderFunction3x3(mf33;mf33;mf33;"
+                              Name 73  "inF0"
+                              Name 74  "inF1"
+                              Name 75  "inF2"
+                              Name 84  "PixelShaderFunction4x4(mf44;mf44;mf44;"
+                              Name 81  "inF0"
+                              Name 82  "inF1"
+                              Name 83  "inF2"
+                              Name 93  "TestGenMul2(f1;f1;vf2;vf2;mf22;mf22;"
+                              Name 87  "inF0"
+                              Name 88  "inF1"
+                              Name 89  "inFV0"
+                              Name 90  "inFV1"
+                              Name 91  "inFM0"
+                              Name 92  "inFM1"
+                              Name 102  "TestGenMul3(f1;f1;vf3;vf3;mf33;mf33;"
+                              Name 96  "inF0"
+                              Name 97  "inF1"
+                              Name 98  "inFV0"
+                              Name 99  "inFV1"
+                              Name 100  "inFM0"
+                              Name 101  "inFM1"
+                              Name 111  "TestGenMul4(f1;f1;vf4;vf4;mf44;mf44;"
+                              Name 105  "inF0"
+                              Name 106  "inF1"
+                              Name 107  "inFV0"
+                              Name 108  "inFV1"
+                              Name 109  "inFM0"
+                              Name 110  "inFM1"
+                              Name 131  "TestGenMulNxM(f1;f1;vf2;vf3;mf23;mf32;mf33;mf34;mf24;"
+                              Name 122  "inF0"
+                              Name 123  "inF1"
+                              Name 124  "inFV2"
+                              Name 125  "inFV3"
+                              Name 126  "inFM2x3"
+                              Name 127  "inFM3x2"
+                              Name 128  "inFM3x3"
+                              Name 129  "inFM3x4"
+                              Name 130  "inFM2x4"
+                              Name 133  "PS_OUTPUT"
+                              MemberName 133(PS_OUTPUT) 0  "color"
+                              Name 135  "@main("
+                              Name 139  "r000"
+                              Name 144  "r001"
+                              Name 147  "r002"
+                              Name 150  "r003"
+                              Name 154  "r004"
+                              Name 157  "r005"
+                              Name 160  "r006"
+                              Name 163  "r007"
+                              Name 166  "r009"
+                              Name 169  "r010"
+                              Name 173  "r011"
+                              Name 176  "r012"
+                              Name 192  "r014"
+                              Name 195  "r015"
+                              Name 198  "r016"
+                              Name 201  "r017"
+                              Name 204  "r018"
+                              Name 207  "r019"
+                              Name 210  "r020"
+                              Name 213  "r021"
+                              Name 216  "r022"
+                              Name 219  "r023"
+                              Name 222  "r024"
+                              Name 226  "r027"
+                              Name 229  "r028"
+                              Name 232  "r029"
+                              Name 235  "r030"
+                              Name 238  "r031"
+                              Name 241  "r033"
+                              Name 245  "r034"
+                              Name 248  "r036"
+                              Name 251  "r037"
+                              Name 254  "r038"
+                              Name 257  "r039"
+                              Name 261  "r039a"
+                              Name 266  "r040"
+                              Name 269  "r041"
+                              Name 274  "r042"
+                              Name 277  "r043"
+                              Name 281  "r044"
+                              Name 285  "r045"
+                              Name 289  "r046"
+                              Name 292  "r047"
+                              Name 296  "r048"
+                              Name 300  "r049"
+                              Name 303  "r050"
+                              Name 306  "r051"
+                              Name 309  "r052"
+                              Name 312  "r053"
+                              Name 319  "r055"
+                              Name 322  "r056"
+                              Name 327  "r057"
+                              Name 330  "r058"
+                              Name 334  "r059"
+                              Name 337  "r060"
+                              Name 340  "r061"
+                              Name 347  "r000"
+                              Name 353  "r001"
+                              Name 356  "r002"
+                              Name 359  "r003"
+                              Name 363  "r004"
+                              Name 368  "r005"
+                              Name 371  "r006"
+                              Name 374  "r007"
+                              Name 377  "r009"
+                              Name 380  "r010"
+                              Name 384  "r011"
+                              Name 387  "r012"
+                              Name 406  "r013"
+                              Name 409  "r015"
+                              Name 412  "r016"
+                              Name 416  "r017"
+                              Name 419  "r018"
+                              Name 422  "r019"
+                              Name 425  "r020"
+                              Name 428  "r021"
+                              Name 431  "r022"
+                              Name 434  "r023"
+                              Name 437  "r026"
+                              Name 441  "r027"
+                              Name 445  "r028"
+                              Name 448  "r029"
+                              Name 451  "r030"
+                              Name 456  "r031"
+                              Name 461  "r032"
+                              Name 463  "r033"
+                              Name 466  "r035"
+                              Name 470  "r036"
+                              Name 473  "r038"
+                              Name 477  "r039"
+                              Name 480  "r040"
+                              Name 483  "r041"
+                              Name 487  "r039a"
+                              Name 492  "r042"
+                              Name 495  "r043"
+                              Name 498  "r044"
+                              Name 502  "r045"
+                              Name 505  "r046"
+                              Name 509  "r047"
+                              Name 513  "r048"
+                              Name 516  "r049"
+                              Name 520  "r050"
+                              Name 523  "r051"
+                              Name 527  "r052"
+                              Name 531  "r053"
+                              Name 536  "r054"
+                              Name 541  "r055"
+                              Name 544  "r056"
+                              Name 547  "r057"
+                              Name 552  "r058"
+                              Name 555  "r059"
+                              Name 562  "r060"
+                              Name 565  "r061"
+                              Name 570  "r062"
+                              Name 573  "r063"
+                              Name 577  "r064"
+                              Name 580  "r065"
+                              Name 583  "r066"
+                              Name 589  "r000"
+                              Name 595  "r001"
+                              Name 598  "r002"
+                              Name 601  "r003"
+                              Name 605  "r004"
+                              Name 610  "r005"
+                              Name 613  "r006"
+                              Name 616  "r007"
+                              Name 619  "r009"
+                              Name 622  "r010"
+                              Name 626  "r011"
+                              Name 629  "r012"
+                              Name 647  "r013"
+                              Name 650  "r014"
+                              Name 653  "r015"
+                              Name 658  "r016"
+                              Name 662  "r017"
+                              Name 665  "r018"
+                              Name 668  "r019"
+                              Name 671  "r020"
+                              Name 674  "r021"
+                              Name 677  "r022"
+                              Name 680  "r023"
+                              Name 683  "r024"
+                              Name 687  "r025"
+                              Name 691  "r029"
+                              Name 694  "r030"
+                              Name 697  "r031"
+                              Name 702  "r032"
+                              Name 706  "r033"
+                              Name 708  "r034"
+                              Name 711  "r036"
+                              Name 715  "r037"
+                              Name 718  "r039"
+                              Name 722  "r040"
+                              Name 725  "r041"
+                              Name 728  "r042"
+                              Name 732  "r039a"
+                              Name 737  "r039b"
+                              Name 743  "r043"
+                              Name 746  "r044"
+                              Name 749  "r045"
+                              Name 753  "r046"
+                              Name 756  "r047"
+                              Name 760  "r048"
+                              Name 764  "r049"
+                              Name 767  "r050"
+                              Name 771  "r051"
+                              Name 774  "r052"
+                              Name 778  "r053"
+                              Name 782  "r054"
+                              Name 786  "r055"
+                              Name 789  "r056"
+                              Name 792  "r057"
+                              Name 795  "r058"
+                              Name 800  "r059"
+                              Name 803  "r060"
+                              Name 810  "r061"
+                              Name 813  "r062"
+                              Name 818  "r063"
+                              Name 821  "r064"
+                              Name 825  "r065"
+                              Name 828  "r066"
+                              Name 831  "r067"
+                              Name 838  "r000"
+                              Name 844  "r001"
+                              Name 847  "r002"
+                              Name 850  "r003"
+                              Name 854  "r004"
+                              Name 859  "r005"
+                              Name 862  "r006"
+                              Name 865  "r007"
+                              Name 868  "r009"
+                              Name 871  "r010"
+                              Name 875  "r011"
+                              Name 878  "r012"
+                              Name 896  "r013"
+                              Name 899  "r014"
+                              Name 902  "r015"
+                              Name 905  "r016"
+                              Name 908  "r017"
+                              Name 911  "r018"
+                              Name 914  "r019"
+                              Name 917  "r020"
+                              Name 920  "r021"
+                              Name 923  "r022"
+                              Name 926  "r023"
+                              Name 930  "r024"
+                              Name 934  "r025"
+                              Name 945  "r029"
+                              Name 948  "r030"
+                              Name 951  "r031"
+                              Name 956  "r032"
+                              Name 961  "r033"
+                              Name 963  "r034"
+                              Name 966  "r036"
+                              Name 970  "r037"
+                              Name 973  "r039"
+                              Name 977  "r040"
+                              Name 980  "r041"
+                              Name 983  "r042"
+                              Name 987  "r039a"
+                              Name 992  "r043"
+                              Name 995  "r044"
+                              Name 998  "r045"
+                              Name 1002  "r046"
+                              Name 1005  "r047"
+                              Name 1009  "r048"
+                              Name 1013  "r049"
+                              Name 1016  "r050"
+                              Name 1020  "r051"
+                              Name 1023  "r052"
+                              Name 1027  "r053"
+                              Name 1031  "r054"
+                              Name 1035  "r055"
+                              Name 1038  "r056"
+                              Name 1041  "r057"
+                              Name 1044  "r058"
+                              Name 1049  "r059"
+                              Name 1052  "r060"
+                              Name 1059  "r061"
+                              Name 1062  "r062"
+                              Name 1067  "r063"
+                              Name 1070  "r064"
+                              Name 1074  "r065"
+                              Name 1077  "r066"
+                              Name 1080  "r067"
+                              Name 1087  "r000"
+                              Name 1092  "r001"
+                              Name 1097  "r003"
+                              Name 1101  "r004"
+                              Name 1104  "r005"
+                              Name 1107  "r006"
+                              Name 1111  "r007"
+                              Name 1121  "r008"
+                              Name 1126  "r009"
+                              Name 1129  "r010"
+                              Name 1132  "r011"
+                              Name 1135  "r012"
+                              Name 1138  "r013"
+                              Name 1141  "r014"
+                              Name 1144  "r015"
+                              Name 1147  "r016"
+                              Name 1150  "r017"
+                              Name 1153  "r018"
+                              Name 1156  "r019"
+                              Name 1159  "R020"
+                              Name 1162  "r021"
+                              Name 1165  "r022"
+                              Name 1175  "r023"
+                              Name 1178  "r025"
+                              Name 1181  "r026"
+                              Name 1185  "r026a"
+                              Name 1190  "r027"
+                              Name 1193  "r028"
+                              Name 1197  "r029"
+                              Name 1200  "r030"
+                              Name 1204  "r031"
+                              Name 1208  "r032"
+                              Name 1212  "r033"
+                              Name 1215  "r034"
+                              Name 1218  "r035"
+                              Name 1221  "r036"
+                              Name 1226  "r037"
+                              Name 1229  "r038"
+                              Name 1236  "r039"
+                              Name 1239  "r049"
+                              Name 1244  "r041"
+                              Name 1247  "r042"
+                              Name 1251  "r043"
+                              Name 1254  "r044"
+                              Name 1259  "r046"
+                              Name 1266  "r000"
+                              Name 1271  "r001"
+                              Name 1276  "r003"
+                              Name 1280  "r004"
+                              Name 1283  "r005"
+                              Name 1286  "r006"
+                              Name 1290  "r007"
+                              Name 1300  "r008"
+                              Name 1305  "r009"
+                              Name 1308  "r010"
+                              Name 1311  "r011"
+                              Name 1314  "r012"
+                              Name 1317  "r013"
+                              Name 1320  "r014"
+                              Name 1323  "r015"
+                              Name 1326  "r016"
+                              Name 1329  "r017"
+                              Name 1332  "r018"
+                              Name 1335  "r019"
+                              Name 1338  "R020"
+                              Name 1341  "r021"
+                              Name 1344  "r022"
+                              Name 1357  "r023"
+                              Name 1360  "r025"
+                              Name 1363  "r026"
+                              Name 1367  "r026a"
+                              Name 1372  "r027"
+                              Name 1375  "r028"
+                              Name 1379  "r029"
+                              Name 1382  "r030"
+                              Name 1386  "r031"
+                              Name 1390  "r032"
+                              Name 1394  "r033"
+                              Name 1397  "r034"
+                              Name 1400  "r035"
+                              Name 1403  "r036"
+                              Name 1408  "r037"
+                              Name 1411  "r038"
+                              Name 1418  "r039"
+                              Name 1421  "r049"
+                              Name 1426  "r041"
+                              Name 1429  "r042"
+                              Name 1433  "r043"
+                              Name 1436  "r044"
+                              Name 1441  "r046"
+                              Name 1448  "r000"
+                              Name 1453  "r001"
+                              Name 1458  "r003"
+                              Name 1462  "r004"
+                              Name 1465  "r005"
+                              Name 1468  "r006"
+                              Name 1472  "r007"
+                              Name 1482  "r008"
+                              Name 1487  "r009"
+                              Name 1490  "r010"
+                              Name 1493  "r011"
+                              Name 1496  "r012"
+                              Name 1499  "r013"
+                              Name 1502  "r014"
+                              Name 1505  "r015"
+                              Name 1508  "r016"
+                              Name 1511  "r017"
+                              Name 1514  "r018"
+                              Name 1517  "r019"
+                              Name 1520  "R020"
+                              Name 1523  "r021"
+                              Name 1526  "r022"
+                              Name 1542  "r023"
+                              Name 1545  "r025"
+                              Name 1548  "r026"
+                              Name 1552  "r026a"
+                              Name 1557  "r027"
+                              Name 1560  "r028"
+                              Name 1564  "r029"
+                              Name 1567  "r030"
+                              Name 1571  "r031"
+                              Name 1575  "r032"
+                              Name 1579  "r033"
+                              Name 1582  "r034"
+                              Name 1585  "r035"
+                              Name 1588  "r036"
+                              Name 1593  "r037"
+                              Name 1596  "r038"
+                              Name 1603  "r039"
+                              Name 1606  "r049"
+                              Name 1611  "r041"
+                              Name 1614  "r042"
+                              Name 1618  "r043"
+                              Name 1621  "r044"
+                              Name 1626  "r046"
+                              Name 1633  "r0"
+                              Name 1637  "r1"
+                              Name 1641  "r2"
+                              Name 1645  "r3"
+                              Name 1649  "r4"
+                              Name 1653  "r5"
+                              Name 1657  "r6"
+                              Name 1661  "r7"
+                              Name 1665  "r8"
+                              Name 1669  "r0"
+                              Name 1673  "r1"
+                              Name 1677  "r2"
+                              Name 1681  "r3"
+                              Name 1685  "r4"
+                              Name 1689  "r5"
+                              Name 1693  "r6"
+                              Name 1697  "r7"
+                              Name 1701  "r8"
+                              Name 1705  "r0"
+                              Name 1709  "r1"
+                              Name 1713  "r2"
+                              Name 1717  "r3"
+                              Name 1721  "r4"
+                              Name 1725  "r5"
+                              Name 1729  "r6"
+                              Name 1733  "r7"
+                              Name 1737  "r8"
+                              Name 1741  "r00"
+                              Name 1745  "r01"
+                              Name 1749  "r02"
+                              Name 1753  "r03"
+                              Name 1757  "r04"
+                              Name 1761  "r05"
+                              Name 1765  "r06"
+                              Name 1769  "r07"
+                              Name 1773  "r08"
+                              Name 1777  "r09"
+                              Name 1781  "r10"
+                              Name 1785  "r11"
+                              Name 1789  "r12"
+                              Name 1793  "r13"
+                              Name 1797  "r14"
+                              Name 1801  "r15"
+                              Name 1805  "r16"
+                              Name 1810  "ps_output"
+                              Name 1817  "@entryPointOutput.color"
+                              Name 1821  "gs_ua"
+                              Name 1822  "gs_ub"
+                              Name 1823  "gs_uc"
+                              Name 1825  "gs_ua2"
+                              Name 1826  "gs_ub2"
+                              Name 1827  "gs_uc2"
+                              Name 1829  "gs_ua3"
+                              Name 1830  "gs_ub3"
+                              Name 1831  "gs_uc3"
+                              Name 1833  "gs_ua4"
+                              Name 1834  "gs_ub4"
+                              Name 1835  "gs_uc4"
+                              Decorate 1817(@entryPointOutput.color) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
                7:             TypePointer Function 6(float)
                8:             TypeInt 32 0
                9:             TypePointer Function 8(int)
-              10:             TypeFunction 6(float) 7(ptr) 7(ptr) 7(ptr) 9(ptr) 9(ptr)
-              18:             TypeFunction 6(float) 7(ptr) 7(ptr) 7(ptr)
-              24:             TypeVector 6(float) 2
-              25:             TypePointer Function 24(fvec2)
-              26:             TypeVector 8(int) 2
-              27:             TypePointer Function 26(ivec2)
-              28:             TypeFunction 24(fvec2) 25(ptr) 25(ptr) 25(ptr) 27(ptr) 27(ptr)
-              36:             TypeVector 6(float) 3
-              37:             TypePointer Function 36(fvec3)
-              38:             TypeVector 8(int) 3
-              39:             TypePointer Function 38(ivec3)
-              40:             TypeFunction 36(fvec3) 37(ptr) 37(ptr) 37(ptr) 39(ptr) 39(ptr)
-              48:             TypeVector 6(float) 4
-              49:             TypePointer Function 48(fvec4)
-              50:             TypeVector 8(int) 4
-              51:             TypePointer Function 50(ivec4)
-              52:             TypeFunction 48(fvec4) 49(ptr) 49(ptr) 49(ptr) 51(ptr) 51(ptr)
-              60:             TypeMatrix 24(fvec2) 2
-              61:             TypePointer Function 60
-              62:             TypeFunction 60 61(ptr) 61(ptr) 61(ptr)
-              68:             TypeMatrix 36(fvec3) 3
-              69:             TypePointer Function 68
-              70:             TypeFunction 68 69(ptr) 69(ptr) 69(ptr)
-              76:             TypeMatrix 48(fvec4) 4
-              77:             TypePointer Function 76
-              78:             TypeFunction 76 77(ptr) 77(ptr) 77(ptr)
-              84:             TypeFunction 2 7(ptr) 7(ptr) 25(ptr) 25(ptr) 61(ptr) 61(ptr)
-              93:             TypeFunction 2 7(ptr) 7(ptr) 37(ptr) 37(ptr) 69(ptr) 69(ptr)
-             102:             TypeFunction 2 7(ptr) 7(ptr) 49(ptr) 49(ptr) 77(ptr) 77(ptr)
-             111:             TypeMatrix 36(fvec3) 2
-             112:             TypePointer Function 111
-             113:             TypeMatrix 24(fvec2) 3
+              10:             TypeInt 32 1
+              11:             TypePointer Function 10(int)
+              12:             TypeFunction 6(float) 7(ptr) 7(ptr) 7(ptr) 9(ptr) 11(ptr)
+              20:             TypeFunction 6(float) 7(ptr) 7(ptr) 7(ptr)
+              26:             TypeVector 6(float) 2
+              27:             TypePointer Function 26(fvec2)
+              28:             TypeVector 8(int) 2
+              29:             TypePointer Function 28(ivec2)
+              30:             TypeFunction 26(fvec2) 27(ptr) 27(ptr) 27(ptr) 29(ptr) 29(ptr)
+              38:             TypeVector 6(float) 3
+              39:             TypePointer Function 38(fvec3)
+              40:             TypeVector 8(int) 3
+              41:             TypePointer Function 40(ivec3)
+              42:             TypeFunction 38(fvec3) 39(ptr) 39(ptr) 39(ptr) 41(ptr) 41(ptr)
+              50:             TypeVector 6(float) 4
+              51:             TypePointer Function 50(fvec4)
+              52:             TypeVector 8(int) 4
+              53:             TypePointer Function 52(ivec4)
+              54:             TypeFunction 50(fvec4) 51(ptr) 51(ptr) 51(ptr) 53(ptr) 53(ptr)
+              62:             TypeMatrix 26(fvec2) 2
+              63:             TypePointer Function 62
+              64:             TypeFunction 62 63(ptr) 63(ptr) 63(ptr)
+              70:             TypeMatrix 38(fvec3) 3
+              71:             TypePointer Function 70
+              72:             TypeFunction 70 71(ptr) 71(ptr) 71(ptr)
+              78:             TypeMatrix 50(fvec4) 4
+              79:             TypePointer Function 78
+              80:             TypeFunction 78 79(ptr) 79(ptr) 79(ptr)
+              86:             TypeFunction 2 7(ptr) 7(ptr) 27(ptr) 27(ptr) 63(ptr) 63(ptr)
+              95:             TypeFunction 2 7(ptr) 7(ptr) 39(ptr) 39(ptr) 71(ptr) 71(ptr)
+             104:             TypeFunction 2 7(ptr) 7(ptr) 51(ptr) 51(ptr) 79(ptr) 79(ptr)
+             113:             TypeMatrix 38(fvec3) 2
              114:             TypePointer Function 113
-             115:             TypeMatrix 48(fvec4) 3
+             115:             TypeMatrix 26(fvec2) 3
              116:             TypePointer Function 115
-             117:             TypeMatrix 48(fvec4) 2
+             117:             TypeMatrix 50(fvec4) 3
              118:             TypePointer Function 117
-             119:             TypeFunction 2 7(ptr) 7(ptr) 25(ptr) 37(ptr) 112(ptr) 114(ptr) 69(ptr) 116(ptr) 118(ptr)
-  131(PS_OUTPUT):             TypeStruct 48(fvec4)
-             132:             TypeFunction 131(PS_OUTPUT)
-             135:             TypeBool
-             136:             TypePointer Function 135(bool)
-             152:             TypeInt 32 1
-             153:             TypePointer Function 152(int)
-             179:    6(float) Constant 0
-             191:    152(int) Constant 7
-             260:    6(float) Constant 1050288283
-             281:    6(float) Constant 1065353216
-             285:    152(int) Constant 2
-             350:             TypeVector 152(int) 2
-             351:             TypePointer Function 350(ivec2)
-             377:   24(fvec2) ConstantComposite 179 179
-             378:             TypeVector 135(bool) 2
-             391:    152(int) Constant 3
-             392:  350(ivec2) ConstantComposite 191 391
-             435:      8(int) Constant 7
-             436:      8(int) Constant 8
-             437:   26(ivec2) ConstantComposite 435 436
-             454:             TypePointer Function 378(bvec2)
-             512:    6(float) Constant 1073741824
-             515:      8(int) Constant 1
-             516:      8(int) Constant 2
-             517:   26(ivec2) ConstantComposite 515 516
-             564:   24(fvec2) ConstantComposite 281 512
-             582:             TypeVector 152(int) 3
-             583:             TypePointer Function 582(ivec3)
-             609:   36(fvec3) ConstantComposite 179 179 179
-             610:             TypeVector 135(bool) 3
-             623:      8(int) Constant 3
-             624:      8(int) Constant 5
-             625:   38(ivec3) ConstantComposite 435 623 624
-             672:      8(int) Constant 4
-             673:   38(ivec3) ConstantComposite 516 623 672
-             690:             TypePointer Function 610(bvec3)
-             709:    6(float) Constant 1050253722
-             756:   38(ivec3) ConstantComposite 515 516 623
-             803:    6(float) Constant 1077936128
-             804:   36(fvec3) ConstantComposite 281 512 803
-             822:             TypeVector 152(int) 4
-             823:             TypePointer Function 822(ivec4)
-             849:   48(fvec4) ConstantComposite 179 179 179 179
-             850:             TypeVector 135(bool) 4
-             863:   50(ivec4) ConstantComposite 435 623 624 516
-             917:      8(int) Constant 9
-             918:      8(int) Constant 10
-             919:   50(ivec4) ConstantComposite 435 436 917 918
-             936:             TypePointer Function 850(bvec4)
-             996:   50(ivec4) ConstantComposite 515 516 623 672
-            1043:    6(float) Constant 1082130432
-            1044:   48(fvec4) ConstantComposite 281 512 803 1043
-            1072:          60 ConstantComposite 377 377
-            1073:             TypeMatrix 378(bvec2) 2
-            1220:   24(fvec2) ConstantComposite 512 512
-            1221:          60 ConstantComposite 1220 1220
-            1249:          68 ConstantComposite 609 609 609
-            1250:             TypeMatrix 610(bvec3) 3
-            1400:   36(fvec3) ConstantComposite 803 803 803
-            1401:          68 ConstantComposite 1400 1400 1400
-            1429:          76 ConstantComposite 849 849 849 849
-            1430:             TypeMatrix 850(bvec4) 4
-            1583:   48(fvec4) ConstantComposite 1043 1043 1043 1043
-            1584:          76 ConstantComposite 1583 1583 1583 1583
-            1763:             TypePointer Function 131(PS_OUTPUT)
-            1765:    152(int) Constant 0
-            1766:   48(fvec4) ConstantComposite 281 281 281 281
-            1771:             TypePointer Output 48(fvec4)
-     1772(color):   1771(ptr) Variable Output
-            1775:             TypePointer Workgroup 8(int)
-     1776(gs_ua):   1775(ptr) Variable Workgroup
-     1777(gs_ub):   1775(ptr) Variable Workgroup
-     1778(gs_uc):   1775(ptr) Variable Workgroup
-            1779:             TypePointer Workgroup 26(ivec2)
-    1780(gs_ua2):   1779(ptr) Variable Workgroup
-    1781(gs_ub2):   1779(ptr) Variable Workgroup
-    1782(gs_uc2):   1779(ptr) Variable Workgroup
-            1783:             TypePointer Workgroup 38(ivec3)
-    1784(gs_ua3):   1783(ptr) Variable Workgroup
-    1785(gs_ub3):   1783(ptr) Variable Workgroup
-    1786(gs_uc3):   1783(ptr) Variable Workgroup
-            1787:             TypePointer Workgroup 50(ivec4)
-    1788(gs_ua4):   1787(ptr) Variable Workgroup
-    1789(gs_ub4):   1787(ptr) Variable Workgroup
-    1790(gs_uc4):   1787(ptr) Variable Workgroup
+             119:             TypeMatrix 50(fvec4) 2
+             120:             TypePointer Function 119
+             121:             TypeFunction 2 7(ptr) 7(ptr) 27(ptr) 39(ptr) 114(ptr) 116(ptr) 71(ptr) 118(ptr) 120(ptr)
+  133(PS_OUTPUT):             TypeStruct 50(fvec4)
+             134:             TypeFunction 133(PS_OUTPUT)
+             137:             TypeBool
+             138:             TypePointer Function 137(bool)
+             141:    6(float) Constant 0
+             187:     10(int) Constant 0
+             199:     10(int) Constant 7
+             272:    6(float) Constant 1050288283
+             293:    6(float) Constant 1065353216
+             297:     10(int) Constant 2
+             349:             TypeVector 137(bool) 2
+             350:   26(fvec2) ConstantComposite 141 141
+             366:             TypeVector 10(int) 2
+             367:             TypePointer Function 366(ivec2)
+             399:      8(int) Constant 0
+             400:   28(ivec2) ConstantComposite 399 399
+             413:     10(int) Constant 3
+             414:  366(ivec2) ConstantComposite 199 413
+             457:      8(int) Constant 7
+             458:      8(int) Constant 8
+             459:   28(ivec2) ConstantComposite 457 458
+             476:             TypePointer Function 349(bvec2)
+             534:    6(float) Constant 1073741824
+             537:      8(int) Constant 1
+             538:      8(int) Constant 2
+             539:   28(ivec2) ConstantComposite 537 538
+             586:   26(fvec2) ConstantComposite 293 534
+             591:             TypeVector 137(bool) 3
+             592:   38(fvec3) ConstantComposite 141 141 141
+             608:             TypeVector 10(int) 3
+             609:             TypePointer Function 608(ivec3)
+             641:   40(ivec3) ConstantComposite 399 399 399
+             654:      8(int) Constant 3
+             655:      8(int) Constant 5
+             656:   40(ivec3) ConstantComposite 457 654 655
+             703:      8(int) Constant 4
+             704:   40(ivec3) ConstantComposite 538 654 703
+             721:             TypePointer Function 591(bvec3)
+             740:    6(float) Constant 1050253722
+             787:   40(ivec3) ConstantComposite 537 538 654
+             834:    6(float) Constant 1077936128
+             835:   38(fvec3) ConstantComposite 293 534 834
+             840:             TypeVector 137(bool) 4
+             841:   50(fvec4) ConstantComposite 141 141 141 141
+             857:             TypeVector 10(int) 4
+             858:             TypePointer Function 857(ivec4)
+             890:   52(ivec4) ConstantComposite 399 399 399 399
+             903:   52(ivec4) ConstantComposite 457 654 655 538
+             957:      8(int) Constant 9
+             958:      8(int) Constant 10
+             959:   52(ivec4) ConstantComposite 457 458 957 958
+             976:             TypePointer Function 840(bvec4)
+            1036:   52(ivec4) ConstantComposite 537 538 654 703
+            1083:    6(float) Constant 1082130432
+            1084:   50(fvec4) ConstantComposite 293 534 834 1083
+            1089:             TypeMatrix 349(bvec2) 2
+            1115:          62 ConstantComposite 350 350
+            1262:   26(fvec2) ConstantComposite 534 534
+            1263:          62 ConstantComposite 1262 1262
+            1268:             TypeMatrix 591(bvec3) 3
+            1294:          70 ConstantComposite 592 592 592
+            1444:   38(fvec3) ConstantComposite 834 834 834
+            1445:          70 ConstantComposite 1444 1444 1444
+            1450:             TypeMatrix 840(bvec4) 4
+            1476:          78 ConstantComposite 841 841 841 841
+            1629:   50(fvec4) ConstantComposite 1083 1083 1083 1083
+            1630:          78 ConstantComposite 1629 1629 1629 1629
+            1809:             TypePointer Function 133(PS_OUTPUT)
+            1811:   50(fvec4) ConstantComposite 293 293 293 293
+            1816:             TypePointer Output 50(fvec4)
+1817(@entryPointOutput.color):   1816(ptr) Variable Output
+            1820:             TypePointer Workgroup 8(int)
+     1821(gs_ua):   1820(ptr) Variable Workgroup
+     1822(gs_ub):   1820(ptr) Variable Workgroup
+     1823(gs_uc):   1820(ptr) Variable Workgroup
+            1824:             TypePointer Workgroup 28(ivec2)
+    1825(gs_ua2):   1824(ptr) Variable Workgroup
+    1826(gs_ub2):   1824(ptr) Variable Workgroup
+    1827(gs_uc2):   1824(ptr) Variable Workgroup
+            1828:             TypePointer Workgroup 40(ivec3)
+    1829(gs_ua3):   1828(ptr) Variable Workgroup
+    1830(gs_ub3):   1828(ptr) Variable Workgroup
+    1831(gs_uc3):   1828(ptr) Variable Workgroup
+            1832:             TypePointer Workgroup 52(ivec4)
+    1833(gs_ua4):   1832(ptr) Variable Workgroup
+    1834(gs_ub4):   1832(ptr) Variable Workgroup
+    1835(gs_uc4):   1832(ptr) Variable Workgroup
          4(main):           2 Function None 3
                5:             Label
-            1773:131(PS_OUTPUT) FunctionCall 133(@main()
-            1774:   48(fvec4) CompositeExtract 1773 0
-                              Store 1772(color) 1774
+            1818:133(PS_OUTPUT) FunctionCall 135(@main()
+            1819:   50(fvec4) CompositeExtract 1818 0
+                              Store 1817(@entryPointOutput.color) 1819
                               Return
                               FunctionEnd
-16(PixelShaderFunctionS(f1;f1;f1;u1;u1;):    6(float) Function None 10
-        11(inF0):      7(ptr) FunctionParameter
-        12(inF1):      7(ptr) FunctionParameter
-        13(inF2):      7(ptr) FunctionParameter
-        14(inU0):      9(ptr) FunctionParameter
-        15(inU1):      9(ptr) FunctionParameter
-              17:             Label
-       137(r000):    136(ptr) Variable Function
-       140(r001):      7(ptr) Variable Function
-       143(r002):      7(ptr) Variable Function
-       146(r003):    136(ptr) Variable Function
-       149(r004):      7(ptr) Variable Function
-       154(r005):    153(ptr) Variable Function
-       157(r006):      9(ptr) Variable Function
-       160(r007):      7(ptr) Variable Function
-       163(r009):      7(ptr) Variable Function
-       166(r010):      7(ptr) Variable Function
-       170(r011):      7(ptr) Variable Function
-       173(r012):      7(ptr) Variable Function
-       184(r014):      7(ptr) Variable Function
-       187(r015):      7(ptr) Variable Function
-       190(r016):    153(ptr) Variable Function
-       193(r017):      7(ptr) Variable Function
-       196(r018):      7(ptr) Variable Function
-       199(r019):      7(ptr) Variable Function
-       202(r020):      7(ptr) Variable Function
-       205(r021):      7(ptr) Variable Function
-       208(r022):      7(ptr) Variable Function
-       211(r023):      7(ptr) Variable Function
-       214(r027):      7(ptr) Variable Function
-       217(r028):      7(ptr) Variable Function
-       220(r029):      9(ptr) Variable Function
-       223(r030):      9(ptr) Variable Function
-       226(r031):      7(ptr) Variable Function
-       229(r033):      7(ptr) Variable Function
-       233(r034):      7(ptr) Variable Function
-       236(r036):      7(ptr) Variable Function
-       239(r037):    136(ptr) Variable Function
-       242(r038):    136(ptr) Variable Function
-       245(r039):      7(ptr) Variable Function
-      249(r039a):      7(ptr) Variable Function
-       254(r040):      7(ptr) Variable Function
-       257(r041):      7(ptr) Variable Function
-       262(r042):      7(ptr) Variable Function
-       265(r043):      7(ptr) Variable Function
-       269(r044):      7(ptr) Variable Function
-       273(r045):      7(ptr) Variable Function
-       277(r046):      7(ptr) Variable Function
-       280(r047):      7(ptr) Variable Function
-       284(r048):      9(ptr) Variable Function
-       288(r049):      7(ptr) Variable Function
-       291(r050):      7(ptr) Variable Function
-       294(r051):      7(ptr) Variable Function
-       297(r052):      7(ptr) Variable Function
-       300(r053):      7(ptr) Variable Function
-       307(r055):      7(ptr) Variable Function
-       310(r056):      7(ptr) Variable Function
-       315(r057):      7(ptr) Variable Function
-       318(r058):      7(ptr) Variable Function
-       322(r059):      7(ptr) Variable Function
-       325(r060):      7(ptr) Variable Function
-       328(r061):      7(ptr) Variable Function
-             138:    6(float) Load 11(inF0)
-             139:   135(bool) All 138
-                              Store 137(r000) 139
-             141:    6(float) Load 11(inF0)
-             142:    6(float) ExtInst 1(GLSL.std.450) 4(FAbs) 141
-                              Store 140(r001) 142
-             144:    6(float) Load 11(inF0)
-             145:    6(float) ExtInst 1(GLSL.std.450) 17(Acos) 144
-                              Store 143(r002) 145
-             147:    6(float) Load 11(inF0)
-             148:   135(bool) Any 147
-                              Store 146(r003) 148
-             150:    6(float) Load 11(inF0)
-             151:    6(float) ExtInst 1(GLSL.std.450) 16(Asin) 150
-                              Store 149(r004) 151
-             155:    6(float) Load 11(inF0)
-             156:    152(int) Bitcast 155
-                              Store 154(r005) 156
-             158:    6(float) Load 11(inF0)
-             159:      8(int) Bitcast 158
-                              Store 157(r006) 159
-             161:      8(int) Load 14(inU0)
-             162:    6(float) Bitcast 161
-                              Store 160(r007) 162
-             164:    6(float) Load 11(inF0)
-             165:    6(float) ExtInst 1(GLSL.std.450) 18(Atan) 164
-                              Store 163(r009) 165
-             167:    6(float) Load 11(inF0)
-             168:    6(float) Load 12(inF1)
-             169:    6(float) ExtInst 1(GLSL.std.450) 25(Atan2) 167 168
-                              Store 166(r010) 169
-             171:    6(float) Load 11(inF0)
-             172:    6(float) ExtInst 1(GLSL.std.450) 9(Ceil) 171
-                              Store 170(r011) 172
-             174:    6(float) Load 11(inF0)
-             175:    6(float) Load 12(inF1)
-             176:    6(float) Load 13(inF2)
-             177:    6(float) ExtInst 1(GLSL.std.450) 43(FClamp) 174 175 176
-                              Store 173(r012) 177
-             178:    6(float) Load 11(inF0)
-             180:   135(bool) FOrdLessThan 178 179
-                              SelectionMerge 182 None
-                              BranchConditional 180 181 182
-             181:               Label
+18(PixelShaderFunctionS(f1;f1;f1;u1;i1;):    6(float) Function None 12
+        13(inF0):      7(ptr) FunctionParameter
+        14(inF1):      7(ptr) FunctionParameter
+        15(inF2):      7(ptr) FunctionParameter
+        16(inU0):      9(ptr) FunctionParameter
+        17(inU1):     11(ptr) FunctionParameter
+              19:             Label
+       139(r000):    138(ptr) Variable Function
+       144(r001):      7(ptr) Variable Function
+       147(r002):      7(ptr) Variable Function
+       150(r003):    138(ptr) Variable Function
+       154(r004):      7(ptr) Variable Function
+       157(r005):     11(ptr) Variable Function
+       160(r006):      9(ptr) Variable Function
+       163(r007):      7(ptr) Variable Function
+       166(r009):      7(ptr) Variable Function
+       169(r010):      7(ptr) Variable Function
+       173(r011):      7(ptr) Variable Function
+       176(r012):      7(ptr) Variable Function
+       192(r014):      7(ptr) Variable Function
+       195(r015):      7(ptr) Variable Function
+       198(r016):     11(ptr) Variable Function
+       201(r017):      7(ptr) Variable Function
+       204(r018):      7(ptr) Variable Function
+       207(r019):      7(ptr) Variable Function
+       210(r020):      7(ptr) Variable Function
+       213(r021):      7(ptr) Variable Function
+       216(r022):      7(ptr) Variable Function
+       219(r023):      7(ptr) Variable Function
+       222(r024):      7(ptr) Variable Function
+       226(r027):      7(ptr) Variable Function
+       229(r028):      7(ptr) Variable Function
+       232(r029):      9(ptr) Variable Function
+       235(r030):      9(ptr) Variable Function
+       238(r031):      7(ptr) Variable Function
+       241(r033):      7(ptr) Variable Function
+       245(r034):      7(ptr) Variable Function
+       248(r036):      7(ptr) Variable Function
+       251(r037):    138(ptr) Variable Function
+       254(r038):    138(ptr) Variable Function
+       257(r039):      7(ptr) Variable Function
+      261(r039a):      7(ptr) Variable Function
+       266(r040):      7(ptr) Variable Function
+       269(r041):      7(ptr) Variable Function
+       274(r042):      7(ptr) Variable Function
+       277(r043):      7(ptr) Variable Function
+       281(r044):      7(ptr) Variable Function
+       285(r045):      7(ptr) Variable Function
+       289(r046):      7(ptr) Variable Function
+       292(r047):      7(ptr) Variable Function
+       296(r048):      9(ptr) Variable Function
+       300(r049):      7(ptr) Variable Function
+       303(r050):      7(ptr) Variable Function
+       306(r051):      7(ptr) Variable Function
+       309(r052):      7(ptr) Variable Function
+       312(r053):      7(ptr) Variable Function
+       319(r055):      7(ptr) Variable Function
+       322(r056):      7(ptr) Variable Function
+       327(r057):      7(ptr) Variable Function
+       330(r058):      7(ptr) Variable Function
+       334(r059):      7(ptr) Variable Function
+       337(r060):      7(ptr) Variable Function
+       340(r061):      7(ptr) Variable Function
+             140:    6(float) Load 13(inF0)
+             142:   137(bool) FOrdNotEqual 140 141
+             143:   137(bool) All 142
+                              Store 139(r000) 143
+             145:    6(float) Load 13(inF0)
+             146:    6(float) ExtInst 1(GLSL.std.450) 4(FAbs) 145
+                              Store 144(r001) 146
+             148:    6(float) Load 13(inF0)
+             149:    6(float) ExtInst 1(GLSL.std.450) 17(Acos) 148
+                              Store 147(r002) 149
+             151:    6(float) Load 13(inF0)
+             152:   137(bool) FOrdNotEqual 151 141
+             153:   137(bool) Any 152
+                              Store 150(r003) 153
+             155:    6(float) Load 13(inF0)
+             156:    6(float) ExtInst 1(GLSL.std.450) 16(Asin) 155
+                              Store 154(r004) 156
+             158:    6(float) Load 13(inF0)
+             159:     10(int) Bitcast 158
+                              Store 157(r005) 159
+             161:     10(int) Load 17(inU1)
+             162:      8(int) Bitcast 161
+                              Store 160(r006) 162
+             164:      8(int) Load 16(inU0)
+             165:    6(float) Bitcast 164
+                              Store 163(r007) 165
+             167:    6(float) Load 13(inF0)
+             168:    6(float) ExtInst 1(GLSL.std.450) 18(Atan) 167
+                              Store 166(r009) 168
+             170:    6(float) Load 13(inF0)
+             171:    6(float) Load 14(inF1)
+             172:    6(float) ExtInst 1(GLSL.std.450) 25(Atan2) 170 171
+                              Store 169(r010) 172
+             174:    6(float) Load 13(inF0)
+             175:    6(float) ExtInst 1(GLSL.std.450) 9(Ceil) 174
+                              Store 173(r011) 175
+             177:    6(float) Load 13(inF0)
+             178:    6(float) Load 14(inF1)
+             179:    6(float) Load 15(inF2)
+             180:    6(float) ExtInst 1(GLSL.std.450) 43(FClamp) 177 178 179
+                              Store 176(r012) 180
+             181:    6(float) Load 13(inF0)
+             182:   137(bool) FOrdLessThan 181 141
+                              SelectionMerge 184 None
+                              BranchConditional 182 183 184
+             183:               Label
                                 Kill
-             182:             Label
-             185:    6(float) Load 11(inF0)
-             186:    6(float) ExtInst 1(GLSL.std.450) 14(Cos) 185
-                              Store 184(r014) 186
-             188:    6(float) Load 11(inF0)
-             189:    6(float) ExtInst 1(GLSL.std.450) 20(Cosh) 188
-                              Store 187(r015) 189
-             192:    152(int) BitCount 191
-                              Store 190(r016) 192
-             194:    6(float) Load 11(inF0)
-             195:    6(float) DPdx 194
-                              Store 193(r017) 195
-             197:    6(float) Load 11(inF0)
-             198:    6(float) DPdxCoarse 197
-                              Store 196(r018) 198
-             200:    6(float) Load 11(inF0)
-             201:    6(float) DPdxFine 200
-                              Store 199(r019) 201
-             203:    6(float) Load 11(inF0)
-             204:    6(float) DPdy 203
-                              Store 202(r020) 204
-             206:    6(float) Load 11(inF0)
-             207:    6(float) DPdyCoarse 206
-                              Store 205(r021) 207
-             209:    6(float) Load 11(inF0)
-             210:    6(float) DPdyFine 209
-                              Store 208(r022) 210
-             212:    6(float) Load 11(inF0)
-             213:    6(float) ExtInst 1(GLSL.std.450) 12(Degrees) 212
-                              Store 211(r023) 213
-             215:    6(float) Load 11(inF0)
-             216:    6(float) ExtInst 1(GLSL.std.450) 27(Exp) 215
-                              Store 214(r027) 216
-             218:    6(float) Load 11(inF0)
-             219:    6(float) ExtInst 1(GLSL.std.450) 29(Exp2) 218
-                              Store 217(r028) 219
-             221:    152(int) ExtInst 1(GLSL.std.450) 74(FindSMsb) 191
-             222:      8(int) Bitcast 221
-                              Store 220(r029) 222
-             224:    152(int) ExtInst 1(GLSL.std.450) 73(FindILsb) 191
-             225:      8(int) Bitcast 224
-                              Store 223(r030) 225
-             227:    6(float) Load 11(inF0)
-             228:    6(float) ExtInst 1(GLSL.std.450) 8(Floor) 227
-                              Store 226(r031) 228
-             230:    6(float) Load 11(inF0)
-             231:    6(float) Load 12(inF1)
-             232:    6(float) FMod 230 231
-                              Store 229(r033) 232
-             234:    6(float) Load 11(inF0)
-             235:    6(float) ExtInst 1(GLSL.std.450) 10(Fract) 234
-                              Store 233(r034) 235
-             237:    6(float) Load 11(inF0)
-             238:    6(float) Fwidth 237
-                              Store 236(r036) 238
-             240:    6(float) Load 11(inF0)
-             241:   135(bool) IsInf 240
-                              Store 239(r037) 241
-             243:    6(float) Load 11(inF0)
-             244:   135(bool) IsNan 243
-                              Store 242(r038) 244
-             246:    6(float) Load 11(inF0)
-             247:    6(float) Load 12(inF1)
-             248:    6(float) ExtInst 1(GLSL.std.450) 53(Ldexp) 246 247
-                              Store 245(r039) 248
-             250:    6(float) Load 11(inF0)
-             251:    6(float) Load 12(inF1)
-             252:    6(float) Load 13(inF2)
-             253:    6(float) ExtInst 1(GLSL.std.450) 46(FMix) 250 251 252
-                              Store 249(r039a) 253
-             255:    6(float) Load 11(inF0)
-             256:    6(float) ExtInst 1(GLSL.std.450) 28(Log) 255
-                              Store 254(r040) 256
-             258:    6(float) Load 11(inF0)
-             259:    6(float) ExtInst 1(GLSL.std.450) 30(Log2) 258
-             261:    6(float) FMul 259 260
-                              Store 257(r041) 261
-             263:    6(float) Load 11(inF0)
-             264:    6(float) ExtInst 1(GLSL.std.450) 30(Log2) 263
-                              Store 262(r042) 264
-             266:    6(float) Load 11(inF0)
-             267:    6(float) Load 12(inF1)
-             268:    6(float) ExtInst 1(GLSL.std.450) 40(FMax) 266 267
-                              Store 265(r043) 268
-             270:    6(float) Load 11(inF0)
-             271:    6(float) Load 12(inF1)
-             272:    6(float) ExtInst 1(GLSL.std.450) 37(FMin) 270 271
-                              Store 269(r044) 272
-             274:    6(float) Load 11(inF0)
-             275:    6(float) Load 12(inF1)
-             276:    6(float) ExtInst 1(GLSL.std.450) 26(Pow) 274 275
-                              Store 273(r045) 276
-             278:    6(float) Load 11(inF0)
-             279:    6(float) ExtInst 1(GLSL.std.450) 11(Radians) 278
-                              Store 277(r046) 279
-             282:    6(float) Load 11(inF0)
-             283:    6(float) FDiv 281 282
-                              Store 280(r047) 283
-             286:    152(int) BitReverse 285
-             287:      8(int) Bitcast 286
-                              Store 284(r048) 287
-             289:    6(float) Load 11(inF0)
-             290:    6(float) ExtInst 1(GLSL.std.450) 2(RoundEven) 289
-                              Store 288(r049) 290
-             292:    6(float) Load 11(inF0)
-             293:    6(float) ExtInst 1(GLSL.std.450) 32(InverseSqrt) 292
-                              Store 291(r050) 293
-             295:    6(float) Load 11(inF0)
-             296:    6(float) ExtInst 1(GLSL.std.450) 43(FClamp) 295 179 281
-                              Store 294(r051) 296
-             298:    6(float) Load 11(inF0)
-             299:    6(float) ExtInst 1(GLSL.std.450) 6(FSign) 298
-                              Store 297(r052) 299
-             301:    6(float) Load 11(inF0)
-             302:    6(float) ExtInst 1(GLSL.std.450) 13(Sin) 301
-                              Store 300(r053) 302
-             303:    6(float) Load 11(inF0)
-             304:    6(float) ExtInst 1(GLSL.std.450) 13(Sin) 303
-                              Store 12(inF1) 304
-             305:    6(float) Load 11(inF0)
-             306:    6(float) ExtInst 1(GLSL.std.450) 14(Cos) 305
-                              Store 13(inF2) 306
-             308:    6(float) Load 11(inF0)
-             309:    6(float) ExtInst 1(GLSL.std.450) 19(Sinh) 308
-                              Store 307(r055) 309
-             311:    6(float) Load 11(inF0)
-             312:    6(float) Load 12(inF1)
-             313:    6(float) Load 13(inF2)
-             314:    6(float) ExtInst 1(GLSL.std.450) 49(SmoothStep) 311 312 313
-                              Store 310(r056) 314
-             316:    6(float) Load 11(inF0)
-             317:    6(float) ExtInst 1(GLSL.std.450) 31(Sqrt) 316
-                              Store 315(r057) 317
-             319:    6(float) Load 11(inF0)
-             320:    6(float) Load 12(inF1)
-             321:    6(float) ExtInst 1(GLSL.std.450) 48(Step) 319 320
-                              Store 318(r058) 321
-             323:    6(float) Load 11(inF0)
-             324:    6(float) ExtInst 1(GLSL.std.450) 15(Tan) 323
-                              Store 322(r059) 324
-             326:    6(float) Load 11(inF0)
-             327:    6(float) ExtInst 1(GLSL.std.450) 21(Tanh) 326
-                              Store 325(r060) 327
-             329:    6(float) Load 11(inF0)
-             330:    6(float) ExtInst 1(GLSL.std.450) 3(Trunc) 329
-                              Store 328(r061) 330
-                              ReturnValue 179
-                              FunctionEnd
-22(PixelShaderFunction1(vf1;vf1;vf1;):    6(float) Function None 18
-        19(inF0):      7(ptr) FunctionParameter
-        20(inF1):      7(ptr) FunctionParameter
-        21(inF2):      7(ptr) FunctionParameter
-              23:             Label
-                              ReturnValue 179
-                              FunctionEnd
-34(PixelShaderFunction2(vf2;vf2;vf2;vu2;vu2;):   24(fvec2) Function None 28
-        29(inF0):     25(ptr) FunctionParameter
-        30(inF1):     25(ptr) FunctionParameter
-        31(inF2):     25(ptr) FunctionParameter
-        32(inU0):     27(ptr) FunctionParameter
-        33(inU1):     27(ptr) FunctionParameter
-              35:             Label
-       335(r000):    136(ptr) Variable Function
-       338(r001):     25(ptr) Variable Function
-       341(r002):     25(ptr) Variable Function
-       344(r003):    136(ptr) Variable Function
-       347(r004):     25(ptr) Variable Function
-       352(r005):    351(ptr) Variable Function
-       355(r006):     27(ptr) Variable Function
-       358(r007):     25(ptr) Variable Function
-       361(r009):     25(ptr) Variable Function
-       364(r010):     25(ptr) Variable Function
-       368(r011):     25(ptr) Variable Function
-       371(r012):     25(ptr) Variable Function
-       384(r013):     25(ptr) Variable Function
-       387(r015):     25(ptr) Variable Function
-       390(r016):    351(ptr) Variable Function
-       394(r017):     25(ptr) Variable Function
-       397(r018):     25(ptr) Variable Function
-       400(r019):     25(ptr) Variable Function
-       403(r020):     25(ptr) Variable Function
-       406(r021):     25(ptr) Variable Function
-       409(r022):     25(ptr) Variable Function
-       412(r023):     25(ptr) Variable Function
-       415(r026):      7(ptr) Variable Function
-       419(r027):      7(ptr) Variable Function
-       423(r028):     25(ptr) Variable Function
-       426(r029):     25(ptr) Variable Function
-       429(r030):     25(ptr) Variable Function
-       434(r031):     27(ptr) Variable Function
-       439(r032):     27(ptr) Variable Function
-       441(r033):     25(ptr) Variable Function
-       444(r035):     25(ptr) Variable Function
-       448(r036):     25(ptr) Variable Function
-       451(r038):     25(ptr) Variable Function
-       455(r039):    454(ptr) Variable Function
-       458(r040):    454(ptr) Variable Function
-       461(r041):     25(ptr) Variable Function
-      465(r039a):     25(ptr) Variable Function
-       470(r042):      7(ptr) Variable Function
-       473(r043):     25(ptr) Variable Function
-       476(r044):     25(ptr) Variable Function
-       480(r045):     25(ptr) Variable Function
-       483(r046):     25(ptr) Variable Function
-       487(r047):     25(ptr) Variable Function
-       491(r048):     25(ptr) Variable Function
-       494(r049):     25(ptr) Variable Function
-       498(r050):     25(ptr) Variable Function
-       501(r051):     25(ptr) Variable Function
-       505(r052):     25(ptr) Variable Function
-       509(r053):     25(ptr) Variable Function
-       514(r054):     27(ptr) Variable Function
-       519(r055):     25(ptr) Variable Function
-       522(r056):     25(ptr) Variable Function
-       525(r057):     25(ptr) Variable Function
-       530(r058):     25(ptr) Variable Function
-       533(r059):     25(ptr) Variable Function
-       540(r060):     25(ptr) Variable Function
-       543(r061):     25(ptr) Variable Function
-       548(r062):     25(ptr) Variable Function
-       551(r063):     25(ptr) Variable Function
-       555(r064):     25(ptr) Variable Function
-       558(r065):     25(ptr) Variable Function
-       561(r066):     25(ptr) Variable Function
-             336:   24(fvec2) Load 29(inF0)
-             337:   135(bool) All 336
-                              Store 335(r000) 337
-             339:   24(fvec2) Load 29(inF0)
-             340:   24(fvec2) ExtInst 1(GLSL.std.450) 4(FAbs) 339
-                              Store 338(r001) 340
-             342:   24(fvec2) Load 29(inF0)
-             343:   24(fvec2) ExtInst 1(GLSL.std.450) 17(Acos) 342
-                              Store 341(r002) 343
-             345:   24(fvec2) Load 29(inF0)
-             346:   135(bool) Any 345
-                              Store 344(r003) 346
-             348:   24(fvec2) Load 29(inF0)
-             349:   24(fvec2) ExtInst 1(GLSL.std.450) 16(Asin) 348
-                              Store 347(r004) 349
-             353:   24(fvec2) Load 29(inF0)
-             354:  350(ivec2) Bitcast 353
-                              Store 352(r005) 354
-             356:   24(fvec2) Load 29(inF0)
-             357:   26(ivec2) Bitcast 356
-                              Store 355(r006) 357
-             359:   26(ivec2) Load 32(inU0)
-             360:   24(fvec2) Bitcast 359
-                              Store 358(r007) 360
-             362:   24(fvec2) Load 29(inF0)
-             363:   24(fvec2) ExtInst 1(GLSL.std.450) 18(Atan) 362
-                              Store 361(r009) 363
-             365:   24(fvec2) Load 29(inF0)
-             366:   24(fvec2) Load 30(inF1)
-             367:   24(fvec2) ExtInst 1(GLSL.std.450) 25(Atan2) 365 366
-                              Store 364(r010) 367
-             369:   24(fvec2) Load 29(inF0)
-             370:   24(fvec2) ExtInst 1(GLSL.std.450) 9(Ceil) 369
-                              Store 368(r011) 370
-             372:   24(fvec2) Load 29(inF0)
-             373:   24(fvec2) Load 30(inF1)
-             374:   24(fvec2) Load 31(inF2)
-             375:   24(fvec2) ExtInst 1(GLSL.std.450) 43(FClamp) 372 373 374
-                              Store 371(r012) 375
-             376:   24(fvec2) Load 29(inF0)
-             379:  378(bvec2) FOrdLessThan 376 377
-             380:   135(bool) Any 379
-                              SelectionMerge 382 None
-                              BranchConditional 380 381 382
-             381:               Label
+             184:             Label
+             186:     10(int) Load 157(r005)
+             188:   137(bool) SLessThan 186 187
+                              SelectionMerge 190 None
+                              BranchConditional 188 189 190
+             189:               Label
                                 Kill
-             382:             Label
-             385:   24(fvec2) Load 29(inF0)
-             386:   24(fvec2) ExtInst 1(GLSL.std.450) 14(Cos) 385
-                              Store 384(r013) 386
-             388:   24(fvec2) Load 29(inF0)
-             389:   24(fvec2) ExtInst 1(GLSL.std.450) 20(Cosh) 388
-                              Store 387(r015) 389
-             393:  350(ivec2) BitCount 392
-                              Store 390(r016) 393
-             395:   24(fvec2) Load 29(inF0)
-             396:   24(fvec2) DPdx 395
-                              Store 394(r017) 396
-             398:   24(fvec2) Load 29(inF0)
-             399:   24(fvec2) DPdxCoarse 398
-                              Store 397(r018) 399
-             401:   24(fvec2) Load 29(inF0)
-             402:   24(fvec2) DPdxFine 401
-                              Store 400(r019) 402
-             404:   24(fvec2) Load 29(inF0)
-             405:   24(fvec2) DPdy 404
-                              Store 403(r020) 405
-             407:   24(fvec2) Load 29(inF0)
-             408:   24(fvec2) DPdyCoarse 407
-                              Store 406(r021) 408
-             410:   24(fvec2) Load 29(inF0)
-             411:   24(fvec2) DPdyFine 410
-                              Store 409(r022) 411
-             413:   24(fvec2) Load 29(inF0)
-             414:   24(fvec2) ExtInst 1(GLSL.std.450) 12(Degrees) 413
-                              Store 412(r023) 414
-             416:   24(fvec2) Load 29(inF0)
-             417:   24(fvec2) Load 30(inF1)
-             418:    6(float) ExtInst 1(GLSL.std.450) 67(Distance) 416 417
-                              Store 415(r026) 418
-             420:   24(fvec2) Load 29(inF0)
-             421:   24(fvec2) Load 30(inF1)
-             422:    6(float) Dot 420 421
-                              Store 419(r027) 422
-             424:   24(fvec2) Load 29(inF0)
-             425:   24(fvec2) ExtInst 1(GLSL.std.450) 27(Exp) 424
-                              Store 423(r028) 425
-             427:   24(fvec2) Load 29(inF0)
-             428:   24(fvec2) ExtInst 1(GLSL.std.450) 29(Exp2) 427
-                              Store 426(r029) 428
-             430:   24(fvec2) Load 29(inF0)
-             431:   24(fvec2) Load 30(inF1)
-             432:   24(fvec2) Load 31(inF2)
-             433:   24(fvec2) ExtInst 1(GLSL.std.450) 70(FaceForward) 430 431 432
-                              Store 429(r030) 433
-             438:   26(ivec2) ExtInst 1(GLSL.std.450) 75(FindUMsb) 437
-                              Store 434(r031) 438
-             440:   26(ivec2) ExtInst 1(GLSL.std.450) 73(FindILsb) 437
-                              Store 439(r032) 440
-             442:   24(fvec2) Load 29(inF0)
-             443:   24(fvec2) ExtInst 1(GLSL.std.450) 8(Floor) 442
-                              Store 441(r033) 443
-             445:   24(fvec2) Load 29(inF0)
-             446:   24(fvec2) Load 30(inF1)
-             447:   24(fvec2) FMod 445 446
-                              Store 444(r035) 447
-             449:   24(fvec2) Load 29(inF0)
-             450:   24(fvec2) ExtInst 1(GLSL.std.450) 10(Fract) 449
-                              Store 448(r036) 450
-             452:   24(fvec2) Load 29(inF0)
-             453:   24(fvec2) Fwidth 452
-                              Store 451(r038) 453
-             456:   24(fvec2) Load 29(inF0)
-             457:  378(bvec2) IsInf 456
-                              Store 455(r039) 457
-             459:   24(fvec2) Load 29(inF0)
-             460:  378(bvec2) IsNan 459
-                              Store 458(r040) 460
-             462:   24(fvec2) Load 29(inF0)
-             463:   24(fvec2) Load 30(inF1)
-             464:   24(fvec2) ExtInst 1(GLSL.std.450) 53(Ldexp) 462 463
-                              Store 461(r041) 464
-             466:   24(fvec2) Load 29(inF0)
-             467:   24(fvec2) Load 30(inF1)
-             468:   24(fvec2) Load 31(inF2)
-             469:   24(fvec2) ExtInst 1(GLSL.std.450) 46(FMix) 466 467 468
-                              Store 465(r039a) 469
-             471:   24(fvec2) Load 29(inF0)
-             472:    6(float) ExtInst 1(GLSL.std.450) 66(Length) 471
-                              Store 470(r042) 472
-             474:   24(fvec2) Load 29(inF0)
-             475:   24(fvec2) ExtInst 1(GLSL.std.450) 28(Log) 474
-                              Store 473(r043) 475
-             477:   24(fvec2) Load 29(inF0)
-             478:   24(fvec2) ExtInst 1(GLSL.std.450) 30(Log2) 477
-             479:   24(fvec2) VectorTimesScalar 478 260
-                              Store 476(r044) 479
-             481:   24(fvec2) Load 29(inF0)
-             482:   24(fvec2) ExtInst 1(GLSL.std.450) 30(Log2) 481
-                              Store 480(r045) 482
-             484:   24(fvec2) Load 29(inF0)
-             485:   24(fvec2) Load 30(inF1)
-             486:   24(fvec2) ExtInst 1(GLSL.std.450) 40(FMax) 484 485
-                              Store 483(r046) 486
-             488:   24(fvec2) Load 29(inF0)
-             489:   24(fvec2) Load 30(inF1)
-             490:   24(fvec2) ExtInst 1(GLSL.std.450) 37(FMin) 488 489
-                              Store 487(r047) 490
-             492:   24(fvec2) Load 29(inF0)
-             493:   24(fvec2) ExtInst 1(GLSL.std.450) 69(Normalize) 492
-                              Store 491(r048) 493
-             495:   24(fvec2) Load 29(inF0)
-             496:   24(fvec2) Load 30(inF1)
-             497:   24(fvec2) ExtInst 1(GLSL.std.450) 26(Pow) 495 496
-                              Store 494(r049) 497
-             499:   24(fvec2) Load 29(inF0)
-             500:   24(fvec2) ExtInst 1(GLSL.std.450) 11(Radians) 499
-                              Store 498(r050) 500
-             502:   24(fvec2) Load 29(inF0)
-             503:   24(fvec2) CompositeConstruct 281 281
-             504:   24(fvec2) FDiv 503 502
-                              Store 501(r051) 504
-             506:   24(fvec2) Load 29(inF0)
-             507:   24(fvec2) Load 30(inF1)
-             508:   24(fvec2) ExtInst 1(GLSL.std.450) 71(Reflect) 506 507
-                              Store 505(r052) 508
-             510:   24(fvec2) Load 29(inF0)
-             511:   24(fvec2) Load 30(inF1)
-             513:   24(fvec2) ExtInst 1(GLSL.std.450) 72(Refract) 510 511 512
-                              Store 509(r053) 513
-             518:   26(ivec2) BitReverse 517
-                              Store 514(r054) 518
-             520:   24(fvec2) Load 29(inF0)
-             521:   24(fvec2) ExtInst 1(GLSL.std.450) 2(RoundEven) 520
-                              Store 519(r055) 521
-             523:   24(fvec2) Load 29(inF0)
-             524:   24(fvec2) ExtInst 1(GLSL.std.450) 32(InverseSqrt) 523
-                              Store 522(r056) 524
-             526:   24(fvec2) Load 29(inF0)
-             527:   24(fvec2) CompositeConstruct 179 179
-             528:   24(fvec2) CompositeConstruct 281 281
-             529:   24(fvec2) ExtInst 1(GLSL.std.450) 43(FClamp) 526 527 528
-                              Store 525(r057) 529
-             531:   24(fvec2) Load 29(inF0)
-             532:   24(fvec2) ExtInst 1(GLSL.std.450) 6(FSign) 531
-                              Store 530(r058) 532
-             534:   24(fvec2) Load 29(inF0)
-             535:   24(fvec2) ExtInst 1(GLSL.std.450) 13(Sin) 534
-                              Store 533(r059) 535
-             536:   24(fvec2) Load 29(inF0)
-             537:   24(fvec2) ExtInst 1(GLSL.std.450) 13(Sin) 536
-                              Store 30(inF1) 537
-             538:   24(fvec2) Load 29(inF0)
-             539:   24(fvec2) ExtInst 1(GLSL.std.450) 14(Cos) 538
-                              Store 31(inF2) 539
-             541:   24(fvec2) Load 29(inF0)
-             542:   24(fvec2) ExtInst 1(GLSL.std.450) 19(Sinh) 541
-                              Store 540(r060) 542
-             544:   24(fvec2) Load 29(inF0)
-             545:   24(fvec2) Load 30(inF1)
-             546:   24(fvec2) Load 31(inF2)
-             547:   24(fvec2) ExtInst 1(GLSL.std.450) 49(SmoothStep) 544 545 546
-                              Store 543(r061) 547
-             549:   24(fvec2) Load 29(inF0)
-             550:   24(fvec2) ExtInst 1(GLSL.std.450) 31(Sqrt) 549
-                              Store 548(r062) 550
-             552:   24(fvec2) Load 29(inF0)
-             553:   24(fvec2) Load 30(inF1)
-             554:   24(fvec2) ExtInst 1(GLSL.std.450) 48(Step) 552 553
-                              Store 551(r063) 554
-             556:   24(fvec2) Load 29(inF0)
-             557:   24(fvec2) ExtInst 1(GLSL.std.450) 15(Tan) 556
-                              Store 555(r064) 557
-             559:   24(fvec2) Load 29(inF0)
-             560:   24(fvec2) ExtInst 1(GLSL.std.450) 21(Tanh) 559
-                              Store 558(r065) 560
-             562:   24(fvec2) Load 29(inF0)
-             563:   24(fvec2) ExtInst 1(GLSL.std.450) 3(Trunc) 562
-                              Store 561(r066) 563
-                              ReturnValue 564
+             190:             Label
+             193:    6(float) Load 13(inF0)
+             194:    6(float) ExtInst 1(GLSL.std.450) 14(Cos) 193
+                              Store 192(r014) 194
+             196:    6(float) Load 13(inF0)
+             197:    6(float) ExtInst 1(GLSL.std.450) 20(Cosh) 196
+                              Store 195(r015) 197
+             200:     10(int) BitCount 199
+                              Store 198(r016) 200
+             202:    6(float) Load 13(inF0)
+             203:    6(float) DPdx 202
+                              Store 201(r017) 203
+             205:    6(float) Load 13(inF0)
+             206:    6(float) DPdxCoarse 205
+                              Store 204(r018) 206
+             208:    6(float) Load 13(inF0)
+             209:    6(float) DPdxFine 208
+                              Store 207(r019) 209
+             211:    6(float) Load 13(inF0)
+             212:    6(float) DPdy 211
+                              Store 210(r020) 212
+             214:    6(float) Load 13(inF0)
+             215:    6(float) DPdyCoarse 214
+                              Store 213(r021) 215
+             217:    6(float) Load 13(inF0)
+             218:    6(float) DPdyFine 217
+                              Store 216(r022) 218
+             220:    6(float) Load 13(inF0)
+             221:    6(float) ExtInst 1(GLSL.std.450) 12(Degrees) 220
+                              Store 219(r023) 221
+             223:    6(float) Load 13(inF0)
+             224:    6(float) Load 14(inF1)
+             225:    6(float) ExtInst 1(GLSL.std.450) 67(Distance) 223 224
+                              Store 222(r024) 225
+             227:    6(float) Load 13(inF0)
+             228:    6(float) ExtInst 1(GLSL.std.450) 27(Exp) 227
+                              Store 226(r027) 228
+             230:    6(float) Load 13(inF0)
+             231:    6(float) ExtInst 1(GLSL.std.450) 29(Exp2) 230
+                              Store 229(r028) 231
+             233:     10(int) ExtInst 1(GLSL.std.450) 74(FindSMsb) 199
+             234:      8(int) Bitcast 233
+                              Store 232(r029) 234
+             236:     10(int) ExtInst 1(GLSL.std.450) 73(FindILsb) 199
+             237:      8(int) Bitcast 236
+                              Store 235(r030) 237
+             239:    6(float) Load 13(inF0)
+             240:    6(float) ExtInst 1(GLSL.std.450) 8(Floor) 239
+                              Store 238(r031) 240
+             242:    6(float) Load 13(inF0)
+             243:    6(float) Load 14(inF1)
+             244:    6(float) FMod 242 243
+                              Store 241(r033) 244
+             246:    6(float) Load 13(inF0)
+             247:    6(float) ExtInst 1(GLSL.std.450) 10(Fract) 246
+                              Store 245(r034) 247
+             249:    6(float) Load 13(inF0)
+             250:    6(float) Fwidth 249
+                              Store 248(r036) 250
+             252:    6(float) Load 13(inF0)
+             253:   137(bool) IsInf 252
+                              Store 251(r037) 253
+             255:    6(float) Load 13(inF0)
+             256:   137(bool) IsNan 255
+                              Store 254(r038) 256
+             258:    6(float) Load 13(inF0)
+             259:    6(float) Load 14(inF1)
+             260:    6(float) ExtInst 1(GLSL.std.450) 53(Ldexp) 258 259
+                              Store 257(r039) 260
+             262:    6(float) Load 13(inF0)
+             263:    6(float) Load 14(inF1)
+             264:    6(float) Load 15(inF2)
+             265:    6(float) ExtInst 1(GLSL.std.450) 46(FMix) 262 263 264
+                              Store 261(r039a) 265
+             267:    6(float) Load 13(inF0)
+             268:    6(float) ExtInst 1(GLSL.std.450) 28(Log) 267
+                              Store 266(r040) 268
+             270:    6(float) Load 13(inF0)
+             271:    6(float) ExtInst 1(GLSL.std.450) 30(Log2) 270
+             273:    6(float) FMul 271 272
+                              Store 269(r041) 273
+             275:    6(float) Load 13(inF0)
+             276:    6(float) ExtInst 1(GLSL.std.450) 30(Log2) 275
+                              Store 274(r042) 276
+             278:    6(float) Load 13(inF0)
+             279:    6(float) Load 14(inF1)
+             280:    6(float) ExtInst 1(GLSL.std.450) 40(FMax) 278 279
+                              Store 277(r043) 280
+             282:    6(float) Load 13(inF0)
+             283:    6(float) Load 14(inF1)
+             284:    6(float) ExtInst 1(GLSL.std.450) 37(FMin) 282 283
+                              Store 281(r044) 284
+             286:    6(float) Load 13(inF0)
+             287:    6(float) Load 14(inF1)
+             288:    6(float) ExtInst 1(GLSL.std.450) 26(Pow) 286 287
+                              Store 285(r045) 288
+             290:    6(float) Load 13(inF0)
+             291:    6(float) ExtInst 1(GLSL.std.450) 11(Radians) 290
+                              Store 289(r046) 291
+             294:    6(float) Load 13(inF0)
+             295:    6(float) FDiv 293 294
+                              Store 292(r047) 295
+             298:     10(int) BitReverse 297
+             299:      8(int) Bitcast 298
+                              Store 296(r048) 299
+             301:    6(float) Load 13(inF0)
+             302:    6(float) ExtInst 1(GLSL.std.450) 2(RoundEven) 301
+                              Store 300(r049) 302
+             304:    6(float) Load 13(inF0)
+             305:    6(float) ExtInst 1(GLSL.std.450) 32(InverseSqrt) 304
+                              Store 303(r050) 305
+             307:    6(float) Load 13(inF0)
+             308:    6(float) ExtInst 1(GLSL.std.450) 43(FClamp) 307 141 293
+                              Store 306(r051) 308
+             310:    6(float) Load 13(inF0)
+             311:    6(float) ExtInst 1(GLSL.std.450) 6(FSign) 310
+                              Store 309(r052) 311
+             313:    6(float) Load 13(inF0)
+             314:    6(float) ExtInst 1(GLSL.std.450) 13(Sin) 313
+                              Store 312(r053) 314
+             315:    6(float) Load 13(inF0)
+             316:    6(float) ExtInst 1(GLSL.std.450) 13(Sin) 315
+                              Store 14(inF1) 316
+             317:    6(float) Load 13(inF0)
+             318:    6(float) ExtInst 1(GLSL.std.450) 14(Cos) 317
+                              Store 15(inF2) 318
+             320:    6(float) Load 13(inF0)
+             321:    6(float) ExtInst 1(GLSL.std.450) 19(Sinh) 320
+                              Store 319(r055) 321
+             323:    6(float) Load 13(inF0)
+             324:    6(float) Load 14(inF1)
+             325:    6(float) Load 15(inF2)
+             326:    6(float) ExtInst 1(GLSL.std.450) 49(SmoothStep) 323 324 325
+                              Store 322(r056) 326
+             328:    6(float) Load 13(inF0)
+             329:    6(float) ExtInst 1(GLSL.std.450) 31(Sqrt) 328
+                              Store 327(r057) 329
+             331:    6(float) Load 13(inF0)
+             332:    6(float) Load 14(inF1)
+             333:    6(float) ExtInst 1(GLSL.std.450) 48(Step) 331 332
+                              Store 330(r058) 333
+             335:    6(float) Load 13(inF0)
+             336:    6(float) ExtInst 1(GLSL.std.450) 15(Tan) 335
+                              Store 334(r059) 336
+             338:    6(float) Load 13(inF0)
+             339:    6(float) ExtInst 1(GLSL.std.450) 21(Tanh) 338
+                              Store 337(r060) 339
+             341:    6(float) Load 13(inF0)
+             342:    6(float) ExtInst 1(GLSL.std.450) 3(Trunc) 341
+                              Store 340(r061) 342
+                              ReturnValue 141
                               FunctionEnd
-46(PixelShaderFunction3(vf3;vf3;vf3;vu3;vu3;):   36(fvec3) Function None 40
-        41(inF0):     37(ptr) FunctionParameter
-        42(inF1):     37(ptr) FunctionParameter
-        43(inF2):     37(ptr) FunctionParameter
-        44(inU0):     39(ptr) FunctionParameter
-        45(inU1):     39(ptr) FunctionParameter
-              47:             Label
-       567(r000):    136(ptr) Variable Function
-       570(r001):     37(ptr) Variable Function
-       573(r002):     37(ptr) Variable Function
-       576(r003):    136(ptr) Variable Function
-       579(r004):     37(ptr) Variable Function
-       584(r005):    583(ptr) Variable Function
-       587(r006):     39(ptr) Variable Function
-       590(r007):     37(ptr) Variable Function
-       593(r009):     37(ptr) Variable Function
-       596(r010):     37(ptr) Variable Function
-       600(r011):     37(ptr) Variable Function
-       603(r012):     37(ptr) Variable Function
-       616(r013):     37(ptr) Variable Function
-       619(r014):     37(ptr) Variable Function
-       622(r015):     39(ptr) Variable Function
-       627(r016):     37(ptr) Variable Function
-       631(r017):     37(ptr) Variable Function
-       634(r018):     37(ptr) Variable Function
-       637(r019):     37(ptr) Variable Function
-       640(r020):     37(ptr) Variable Function
-       643(r021):     37(ptr) Variable Function
-       646(r022):     37(ptr) Variable Function
-       649(r023):     37(ptr) Variable Function
-       652(r024):      7(ptr) Variable Function
-       656(r025):      7(ptr) Variable Function
-       660(r029):     37(ptr) Variable Function
-       663(r030):     37(ptr) Variable Function
-       666(r031):     37(ptr) Variable Function
-       671(r032):     39(ptr) Variable Function
-       675(r033):     39(ptr) Variable Function
-       677(r034):     37(ptr) Variable Function
-       680(r036):     37(ptr) Variable Function
-       684(r037):     37(ptr) Variable Function
-       687(r039):     37(ptr) Variable Function
-       691(r040):    690(ptr) Variable Function
-       694(r041):    690(ptr) Variable Function
-       697(r042):     37(ptr) Variable Function
-      701(r039a):     37(ptr) Variable Function
-      706(r039b):     37(ptr) Variable Function
-       712(r043):      7(ptr) Variable Function
-       715(r044):     37(ptr) Variable Function
-       718(r045):     37(ptr) Variable Function
-       722(r046):     37(ptr) Variable Function
-       725(r047):     37(ptr) Variable Function
-       729(r048):     37(ptr) Variable Function
-       733(r049):     37(ptr) Variable Function
-       736(r050):     37(ptr) Variable Function
-       740(r051):     37(ptr) Variable Function
-       743(r052):     37(ptr) Variable Function
-       747(r053):     37(ptr) Variable Function
-       751(r054):     37(ptr) Variable Function
-       755(r055):     39(ptr) Variable Function
-       758(r056):     37(ptr) Variable Function
-       761(r057):     37(ptr) Variable Function
-       764(r058):     37(ptr) Variable Function
-       769(r059):     37(ptr) Variable Function
-       772(r060):     37(ptr) Variable Function
-       779(r061):     37(ptr) Variable Function
-       782(r062):     37(ptr) Variable Function
-       787(r063):     37(ptr) Variable Function
-       790(r064):     37(ptr) Variable Function
-       794(r065):     37(ptr) Variable Function
-       797(r066):     37(ptr) Variable Function
-       800(r067):     37(ptr) Variable Function
-             568:   36(fvec3) Load 41(inF0)
-             569:   135(bool) All 568
-                              Store 567(r000) 569
-             571:   36(fvec3) Load 41(inF0)
-             572:   36(fvec3) ExtInst 1(GLSL.std.450) 4(FAbs) 571
-                              Store 570(r001) 572
-             574:   36(fvec3) Load 41(inF0)
-             575:   36(fvec3) ExtInst 1(GLSL.std.450) 17(Acos) 574
-                              Store 573(r002) 575
-             577:   36(fvec3) Load 41(inF0)
-             578:   135(bool) Any 577
-                              Store 576(r003) 578
-             580:   36(fvec3) Load 41(inF0)
-             581:   36(fvec3) ExtInst 1(GLSL.std.450) 16(Asin) 580
-                              Store 579(r004) 581
-             585:   36(fvec3) Load 41(inF0)
-             586:  582(ivec3) Bitcast 585
-                              Store 584(r005) 586
-             588:   36(fvec3) Load 41(inF0)
-             589:   38(ivec3) Bitcast 588
-                              Store 587(r006) 589
-             591:   38(ivec3) Load 44(inU0)
-             592:   36(fvec3) Bitcast 591
-                              Store 590(r007) 592
-             594:   36(fvec3) Load 41(inF0)
-             595:   36(fvec3) ExtInst 1(GLSL.std.450) 18(Atan) 594
-                              Store 593(r009) 595
-             597:   36(fvec3) Load 41(inF0)
-             598:   36(fvec3) Load 42(inF1)
-             599:   36(fvec3) ExtInst 1(GLSL.std.450) 25(Atan2) 597 598
-                              Store 596(r010) 599
-             601:   36(fvec3) Load 41(inF0)
-             602:   36(fvec3) ExtInst 1(GLSL.std.450) 9(Ceil) 601
-                              Store 600(r011) 602
-             604:   36(fvec3) Load 41(inF0)
-             605:   36(fvec3) Load 42(inF1)
-             606:   36(fvec3) Load 43(inF2)
-             607:   36(fvec3) ExtInst 1(GLSL.std.450) 43(FClamp) 604 605 606
-                              Store 603(r012) 607
-             608:   36(fvec3) Load 41(inF0)
-             611:  610(bvec3) FOrdLessThan 608 609
-             612:   135(bool) Any 611
-                              SelectionMerge 614 None
-                              BranchConditional 612 613 614
-             613:               Label
+24(PixelShaderFunction1(vf1;vf1;vf1;):    6(float) Function None 20
+        21(inF0):      7(ptr) FunctionParameter
+        22(inF1):      7(ptr) FunctionParameter
+        23(inF2):      7(ptr) FunctionParameter
+              25:             Label
+                              ReturnValue 141
+                              FunctionEnd
+36(PixelShaderFunction2(vf2;vf2;vf2;vu2;vu2;):   26(fvec2) Function None 30
+        31(inF0):     27(ptr) FunctionParameter
+        32(inF1):     27(ptr) FunctionParameter
+        33(inF2):     27(ptr) FunctionParameter
+        34(inU0):     29(ptr) FunctionParameter
+        35(inU1):     29(ptr) FunctionParameter
+              37:             Label
+       347(r000):    138(ptr) Variable Function
+       353(r001):     27(ptr) Variable Function
+       356(r002):     27(ptr) Variable Function
+       359(r003):    138(ptr) Variable Function
+       363(r004):     27(ptr) Variable Function
+       368(r005):    367(ptr) Variable Function
+       371(r006):     29(ptr) Variable Function
+       374(r007):     27(ptr) Variable Function
+       377(r009):     27(ptr) Variable Function
+       380(r010):     27(ptr) Variable Function
+       384(r011):     27(ptr) Variable Function
+       387(r012):     27(ptr) Variable Function
+       406(r013):     27(ptr) Variable Function
+       409(r015):     27(ptr) Variable Function
+       412(r016):    367(ptr) Variable Function
+       416(r017):     27(ptr) Variable Function
+       419(r018):     27(ptr) Variable Function
+       422(r019):     27(ptr) Variable Function
+       425(r020):     27(ptr) Variable Function
+       428(r021):     27(ptr) Variable Function
+       431(r022):     27(ptr) Variable Function
+       434(r023):     27(ptr) Variable Function
+       437(r026):      7(ptr) Variable Function
+       441(r027):      7(ptr) Variable Function
+       445(r028):     27(ptr) Variable Function
+       448(r029):     27(ptr) Variable Function
+       451(r030):     27(ptr) Variable Function
+       456(r031):     29(ptr) Variable Function
+       461(r032):     29(ptr) Variable Function
+       463(r033):     27(ptr) Variable Function
+       466(r035):     27(ptr) Variable Function
+       470(r036):     27(ptr) Variable Function
+       473(r038):     27(ptr) Variable Function
+       477(r039):    476(ptr) Variable Function
+       480(r040):    476(ptr) Variable Function
+       483(r041):     27(ptr) Variable Function
+      487(r039a):     27(ptr) Variable Function
+       492(r042):      7(ptr) Variable Function
+       495(r043):     27(ptr) Variable Function
+       498(r044):     27(ptr) Variable Function
+       502(r045):     27(ptr) Variable Function
+       505(r046):     27(ptr) Variable Function
+       509(r047):     27(ptr) Variable Function
+       513(r048):     27(ptr) Variable Function
+       516(r049):     27(ptr) Variable Function
+       520(r050):     27(ptr) Variable Function
+       523(r051):     27(ptr) Variable Function
+       527(r052):     27(ptr) Variable Function
+       531(r053):     27(ptr) Variable Function
+       536(r054):     29(ptr) Variable Function
+       541(r055):     27(ptr) Variable Function
+       544(r056):     27(ptr) Variable Function
+       547(r057):     27(ptr) Variable Function
+       552(r058):     27(ptr) Variable Function
+       555(r059):     27(ptr) Variable Function
+       562(r060):     27(ptr) Variable Function
+       565(r061):     27(ptr) Variable Function
+       570(r062):     27(ptr) Variable Function
+       573(r063):     27(ptr) Variable Function
+       577(r064):     27(ptr) Variable Function
+       580(r065):     27(ptr) Variable Function
+       583(r066):     27(ptr) Variable Function
+             348:   26(fvec2) Load 31(inF0)
+             351:  349(bvec2) FOrdNotEqual 348 350
+             352:   137(bool) All 351
+                              Store 347(r000) 352
+             354:   26(fvec2) Load 31(inF0)
+             355:   26(fvec2) ExtInst 1(GLSL.std.450) 4(FAbs) 354
+                              Store 353(r001) 355
+             357:   26(fvec2) Load 31(inF0)
+             358:   26(fvec2) ExtInst 1(GLSL.std.450) 17(Acos) 357
+                              Store 356(r002) 358
+             360:   26(fvec2) Load 31(inF0)
+             361:  349(bvec2) FOrdNotEqual 360 350
+             362:   137(bool) Any 361
+                              Store 359(r003) 362
+             364:   26(fvec2) Load 31(inF0)
+             365:   26(fvec2) ExtInst 1(GLSL.std.450) 16(Asin) 364
+                              Store 363(r004) 365
+             369:   26(fvec2) Load 31(inF0)
+             370:  366(ivec2) Bitcast 369
+                              Store 368(r005) 370
+             372:   26(fvec2) Load 31(inF0)
+             373:   28(ivec2) Bitcast 372
+                              Store 371(r006) 373
+             375:   28(ivec2) Load 34(inU0)
+             376:   26(fvec2) Bitcast 375
+                              Store 374(r007) 376
+             378:   26(fvec2) Load 31(inF0)
+             379:   26(fvec2) ExtInst 1(GLSL.std.450) 18(Atan) 378
+                              Store 377(r009) 379
+             381:   26(fvec2) Load 31(inF0)
+             382:   26(fvec2) Load 32(inF1)
+             383:   26(fvec2) ExtInst 1(GLSL.std.450) 25(Atan2) 381 382
+                              Store 380(r010) 383
+             385:   26(fvec2) Load 31(inF0)
+             386:   26(fvec2) ExtInst 1(GLSL.std.450) 9(Ceil) 385
+                              Store 384(r011) 386
+             388:   26(fvec2) Load 31(inF0)
+             389:   26(fvec2) Load 32(inF1)
+             390:   26(fvec2) Load 33(inF2)
+             391:   26(fvec2) ExtInst 1(GLSL.std.450) 43(FClamp) 388 389 390
+                              Store 387(r012) 391
+             392:   26(fvec2) Load 31(inF0)
+             393:  349(bvec2) FOrdLessThan 392 350
+             394:   137(bool) Any 393
+                              SelectionMerge 396 None
+                              BranchConditional 394 395 396
+             395:               Label
                                 Kill
-             614:             Label
-             617:   36(fvec3) Load 41(inF0)
-             618:   36(fvec3) ExtInst 1(GLSL.std.450) 14(Cos) 617
-                              Store 616(r013) 618
-             620:   36(fvec3) Load 41(inF0)
-             621:   36(fvec3) ExtInst 1(GLSL.std.450) 20(Cosh) 620
-                              Store 619(r014) 621
-             626:   38(ivec3) BitCount 625
-                              Store 622(r015) 626
-             628:   36(fvec3) Load 41(inF0)
-             629:   36(fvec3) Load 42(inF1)
-             630:   36(fvec3) ExtInst 1(GLSL.std.450) 68(Cross) 628 629
-                              Store 627(r016) 630
-             632:   36(fvec3) Load 41(inF0)
-             633:   36(fvec3) DPdx 632
-                              Store 631(r017) 633
-             635:   36(fvec3) Load 41(inF0)
-             636:   36(fvec3) DPdxCoarse 635
-                              Store 634(r018) 636
-             638:   36(fvec3) Load 41(inF0)
-             639:   36(fvec3) DPdxFine 638
-                              Store 637(r019) 639
-             641:   36(fvec3) Load 41(inF0)
-             642:   36(fvec3) DPdy 641
-                              Store 640(r020) 642
-             644:   36(fvec3) Load 41(inF0)
-             645:   36(fvec3) DPdyCoarse 644
-                              Store 643(r021) 645
-             647:   36(fvec3) Load 41(inF0)
-             648:   36(fvec3) DPdyFine 647
-                              Store 646(r022) 648
-             650:   36(fvec3) Load 41(inF0)
-             651:   36(fvec3) ExtInst 1(GLSL.std.450) 12(Degrees) 650
-                              Store 649(r023) 651
-             653:   36(fvec3) Load 41(inF0)
-             654:   36(fvec3) Load 42(inF1)
-             655:    6(float) ExtInst 1(GLSL.std.450) 67(Distance) 653 654
-                              Store 652(r024) 655
-             657:   36(fvec3) Load 41(inF0)
-             658:   36(fvec3) Load 42(inF1)
-             659:    6(float) Dot 657 658
-                              Store 656(r025) 659
-             661:   36(fvec3) Load 41(inF0)
-             662:   36(fvec3) ExtInst 1(GLSL.std.450) 27(Exp) 661
-                              Store 660(r029) 662
-             664:   36(fvec3) Load 41(inF0)
-             665:   36(fvec3) ExtInst 1(GLSL.std.450) 29(Exp2) 664
-                              Store 663(r030) 665
-             667:   36(fvec3) Load 41(inF0)
-             668:   36(fvec3) Load 42(inF1)
-             669:   36(fvec3) Load 43(inF2)
-             670:   36(fvec3) ExtInst 1(GLSL.std.450) 70(FaceForward) 667 668 669
-                              Store 666(r031) 670
-             674:   38(ivec3) ExtInst 1(GLSL.std.450) 75(FindUMsb) 673
-                              Store 671(r032) 674
-             676:   38(ivec3) ExtInst 1(GLSL.std.450) 73(FindILsb) 673
-                              Store 675(r033) 676
-             678:   36(fvec3) Load 41(inF0)
-             679:   36(fvec3) ExtInst 1(GLSL.std.450) 8(Floor) 678
-                              Store 677(r034) 679
-             681:   36(fvec3) Load 41(inF0)
-             682:   36(fvec3) Load 42(inF1)
-             683:   36(fvec3) FMod 681 682
-                              Store 680(r036) 683
-             685:   36(fvec3) Load 41(inF0)
-             686:   36(fvec3) ExtInst 1(GLSL.std.450) 10(Fract) 685
-                              Store 684(r037) 686
-             688:   36(fvec3) Load 41(inF0)
-             689:   36(fvec3) Fwidth 688
-                              Store 687(r039) 689
-             692:   36(fvec3) Load 41(inF0)
-             693:  610(bvec3) IsInf 692
-                              Store 691(r040) 693
-             695:   36(fvec3) Load 41(inF0)
-             696:  610(bvec3) IsNan 695
-                              Store 694(r041) 696
-             698:   36(fvec3) Load 41(inF0)
-             699:   36(fvec3) Load 42(inF1)
-             700:   36(fvec3) ExtInst 1(GLSL.std.450) 53(Ldexp) 698 699
-                              Store 697(r042) 700
-             702:   36(fvec3) Load 41(inF0)
-             703:   36(fvec3) Load 42(inF1)
-             704:   36(fvec3) Load 43(inF2)
-             705:   36(fvec3) ExtInst 1(GLSL.std.450) 46(FMix) 702 703 704
-                              Store 701(r039a) 705
-             707:   36(fvec3) Load 41(inF0)
-             708:   36(fvec3) Load 42(inF1)
-             710:   36(fvec3) CompositeConstruct 709 709 709
-             711:   36(fvec3) ExtInst 1(GLSL.std.450) 46(FMix) 707 708 710
-                              Store 706(r039b) 711
-             713:   36(fvec3) Load 41(inF0)
-             714:    6(float) ExtInst 1(GLSL.std.450) 66(Length) 713
-                              Store 712(r043) 714
-             716:   36(fvec3) Load 41(inF0)
-             717:   36(fvec3) ExtInst 1(GLSL.std.450) 28(Log) 716
-                              Store 715(r044) 717
-             719:   36(fvec3) Load 41(inF0)
-             720:   36(fvec3) ExtInst 1(GLSL.std.450) 30(Log2) 719
-             721:   36(fvec3) VectorTimesScalar 720 260
-                              Store 718(r045) 721
-             723:   36(fvec3) Load 41(inF0)
-             724:   36(fvec3) ExtInst 1(GLSL.std.450) 30(Log2) 723
-                              Store 722(r046) 724
-             726:   36(fvec3) Load 41(inF0)
-             727:   36(fvec3) Load 42(inF1)
-             728:   36(fvec3) ExtInst 1(GLSL.std.450) 40(FMax) 726 727
-                              Store 725(r047) 728
-             730:   36(fvec3) Load 41(inF0)
-             731:   36(fvec3) Load 42(inF1)
-             732:   36(fvec3) ExtInst 1(GLSL.std.450) 37(FMin) 730 731
-                              Store 729(r048) 732
-             734:   36(fvec3) Load 41(inF0)
-             735:   36(fvec3) ExtInst 1(GLSL.std.450) 69(Normalize) 734
-                              Store 733(r049) 735
-             737:   36(fvec3) Load 41(inF0)
-             738:   36(fvec3) Load 42(inF1)
-             739:   36(fvec3) ExtInst 1(GLSL.std.450) 26(Pow) 737 738
-                              Store 736(r050) 739
-             741:   36(fvec3) Load 41(inF0)
-             742:   36(fvec3) ExtInst 1(GLSL.std.450) 11(Radians) 741
-                              Store 740(r051) 742
-             744:   36(fvec3) Load 41(inF0)
-             745:   36(fvec3) CompositeConstruct 281 281 281
-             746:   36(fvec3) FDiv 745 744
-                              Store 743(r052) 746
-             748:   36(fvec3) Load 41(inF0)
-             749:   36(fvec3) Load 42(inF1)
-             750:   36(fvec3) ExtInst 1(GLSL.std.450) 71(Reflect) 748 749
-                              Store 747(r053) 750
-             752:   36(fvec3) Load 41(inF0)
-             753:   36(fvec3) Load 42(inF1)
-             754:   36(fvec3) ExtInst 1(GLSL.std.450) 72(Refract) 752 753 512
-                              Store 751(r054) 754
-             757:   38(ivec3) BitReverse 756
-                              Store 755(r055) 757
-             759:   36(fvec3) Load 41(inF0)
-             760:   36(fvec3) ExtInst 1(GLSL.std.450) 2(RoundEven) 759
-                              Store 758(r056) 760
-             762:   36(fvec3) Load 41(inF0)
-             763:   36(fvec3) ExtInst 1(GLSL.std.450) 32(InverseSqrt) 762
-                              Store 761(r057) 763
-             765:   36(fvec3) Load 41(inF0)
-             766:   36(fvec3) CompositeConstruct 179 179 179
-             767:   36(fvec3) CompositeConstruct 281 281 281
-             768:   36(fvec3) ExtInst 1(GLSL.std.450) 43(FClamp) 765 766 767
-                              Store 764(r058) 768
-             770:   36(fvec3) Load 41(inF0)
-             771:   36(fvec3) ExtInst 1(GLSL.std.450) 6(FSign) 770
-                              Store 769(r059) 771
-             773:   36(fvec3) Load 41(inF0)
-             774:   36(fvec3) ExtInst 1(GLSL.std.450) 13(Sin) 773
-                              Store 772(r060) 774
-             775:   36(fvec3) Load 41(inF0)
-             776:   36(fvec3) ExtInst 1(GLSL.std.450) 13(Sin) 775
-                              Store 42(inF1) 776
-             777:   36(fvec3) Load 41(inF0)
-             778:   36(fvec3) ExtInst 1(GLSL.std.450) 14(Cos) 777
-                              Store 43(inF2) 778
-             780:   36(fvec3) Load 41(inF0)
-             781:   36(fvec3) ExtInst 1(GLSL.std.450) 19(Sinh) 780
-                              Store 779(r061) 781
-             783:   36(fvec3) Load 41(inF0)
-             784:   36(fvec3) Load 42(inF1)
-             785:   36(fvec3) Load 43(inF2)
-             786:   36(fvec3) ExtInst 1(GLSL.std.450) 49(SmoothStep) 783 784 785
-                              Store 782(r062) 786
-             788:   36(fvec3) Load 41(inF0)
-             789:   36(fvec3) ExtInst 1(GLSL.std.450) 31(Sqrt) 788
-                              Store 787(r063) 789
-             791:   36(fvec3) Load 41(inF0)
-             792:   36(fvec3) Load 42(inF1)
-             793:   36(fvec3) ExtInst 1(GLSL.std.450) 48(Step) 791 792
-                              Store 790(r064) 793
-             795:   36(fvec3) Load 41(inF0)
-             796:   36(fvec3) ExtInst 1(GLSL.std.450) 15(Tan) 795
-                              Store 794(r065) 796
-             798:   36(fvec3) Load 41(inF0)
-             799:   36(fvec3) ExtInst 1(GLSL.std.450) 21(Tanh) 798
-                              Store 797(r066) 799
-             801:   36(fvec3) Load 41(inF0)
-             802:   36(fvec3) ExtInst 1(GLSL.std.450) 3(Trunc) 801
-                              Store 800(r067) 802
-                              ReturnValue 804
-                              FunctionEnd
-58(PixelShaderFunction(vf4;vf4;vf4;vu4;vu4;):   48(fvec4) Function None 52
-        53(inF0):     49(ptr) FunctionParameter
-        54(inF1):     49(ptr) FunctionParameter
-        55(inF2):     49(ptr) FunctionParameter
-        56(inU0):     51(ptr) FunctionParameter
-        57(inU1):     51(ptr) FunctionParameter
-              59:             Label
-       807(r000):    136(ptr) Variable Function
-       810(r001):     49(ptr) Variable Function
-       813(r002):     49(ptr) Variable Function
-       816(r003):    136(ptr) Variable Function
-       819(r004):     49(ptr) Variable Function
-       824(r005):    823(ptr) Variable Function
-       827(r006):     51(ptr) Variable Function
-       830(r007):     49(ptr) Variable Function
-       833(r009):     49(ptr) Variable Function
-       836(r010):     49(ptr) Variable Function
-       840(r011):     49(ptr) Variable Function
-       843(r012):     49(ptr) Variable Function
-       856(r013):     49(ptr) Variable Function
-       859(r014):     49(ptr) Variable Function
-       862(r015):     51(ptr) Variable Function
-       865(r016):     49(ptr) Variable Function
-       868(r017):     49(ptr) Variable Function
-       871(r018):     49(ptr) Variable Function
-       874(r019):     49(ptr) Variable Function
-       877(r020):     49(ptr) Variable Function
-       880(r021):     49(ptr) Variable Function
-       883(r022):     49(ptr) Variable Function
-       886(r023):      7(ptr) Variable Function
-       890(r024):      7(ptr) Variable Function
-       894(r025):     49(ptr) Variable Function
-       905(r029):     49(ptr) Variable Function
-       908(r030):     49(ptr) Variable Function
-       911(r031):     49(ptr) Variable Function
-       916(r032):     51(ptr) Variable Function
-       921(r033):     51(ptr) Variable Function
-       923(r034):     49(ptr) Variable Function
-       926(r036):     49(ptr) Variable Function
-       930(r037):     49(ptr) Variable Function
-       933(r039):     49(ptr) Variable Function
-       937(r040):    936(ptr) Variable Function
-       940(r041):    936(ptr) Variable Function
-       943(r042):     49(ptr) Variable Function
-      947(r039a):     49(ptr) Variable Function
-       952(r043):      7(ptr) Variable Function
-       955(r044):     49(ptr) Variable Function
-       958(r045):     49(ptr) Variable Function
-       962(r046):     49(ptr) Variable Function
-       965(r047):     49(ptr) Variable Function
-       969(r048):     49(ptr) Variable Function
-       973(r049):     49(ptr) Variable Function
-       976(r050):     49(ptr) Variable Function
-       980(r051):     49(ptr) Variable Function
-       983(r052):     49(ptr) Variable Function
-       987(r053):     49(ptr) Variable Function
-       991(r054):     49(ptr) Variable Function
-       995(r055):     51(ptr) Variable Function
-       998(r056):     49(ptr) Variable Function
-      1001(r057):     49(ptr) Variable Function
-      1004(r058):     49(ptr) Variable Function
-      1009(r059):     49(ptr) Variable Function
-      1012(r060):     49(ptr) Variable Function
-      1019(r061):     49(ptr) Variable Function
-      1022(r062):     49(ptr) Variable Function
-      1027(r063):     49(ptr) Variable Function
-      1030(r064):     49(ptr) Variable Function
-      1034(r065):     49(ptr) Variable Function
-      1037(r066):     49(ptr) Variable Function
-      1040(r067):     49(ptr) Variable Function
-             808:   48(fvec4) Load 53(inF0)
-             809:   135(bool) All 808
-                              Store 807(r000) 809
-             811:   48(fvec4) Load 53(inF0)
-             812:   48(fvec4) ExtInst 1(GLSL.std.450) 4(FAbs) 811
-                              Store 810(r001) 812
-             814:   48(fvec4) Load 53(inF0)
-             815:   48(fvec4) ExtInst 1(GLSL.std.450) 17(Acos) 814
-                              Store 813(r002) 815
-             817:   48(fvec4) Load 53(inF0)
-             818:   135(bool) Any 817
-                              Store 816(r003) 818
-             820:   48(fvec4) Load 53(inF0)
-             821:   48(fvec4) ExtInst 1(GLSL.std.450) 16(Asin) 820
-                              Store 819(r004) 821
-             825:   48(fvec4) Load 53(inF0)
-             826:  822(ivec4) Bitcast 825
-                              Store 824(r005) 826
-             828:   48(fvec4) Load 53(inF0)
-             829:   50(ivec4) Bitcast 828
-                              Store 827(r006) 829
-             831:   50(ivec4) Load 56(inU0)
-             832:   48(fvec4) Bitcast 831
-                              Store 830(r007) 832
-             834:   48(fvec4) Load 53(inF0)
-             835:   48(fvec4) ExtInst 1(GLSL.std.450) 18(Atan) 834
-                              Store 833(r009) 835
-             837:   48(fvec4) Load 53(inF0)
-             838:   48(fvec4) Load 54(inF1)
-             839:   48(fvec4) ExtInst 1(GLSL.std.450) 25(Atan2) 837 838
-                              Store 836(r010) 839
-             841:   48(fvec4) Load 53(inF0)
-             842:   48(fvec4) ExtInst 1(GLSL.std.450) 9(Ceil) 841
-                              Store 840(r011) 842
-             844:   48(fvec4) Load 53(inF0)
-             845:   48(fvec4) Load 54(inF1)
-             846:   48(fvec4) Load 55(inF2)
-             847:   48(fvec4) ExtInst 1(GLSL.std.450) 43(FClamp) 844 845 846
-                              Store 843(r012) 847
-             848:   48(fvec4) Load 53(inF0)
-             851:  850(bvec4) FOrdLessThan 848 849
-             852:   135(bool) Any 851
-                              SelectionMerge 854 None
-                              BranchConditional 852 853 854
-             853:               Label
+             396:             Label
+             398:   28(ivec2) Load 34(inU0)
+             401:  349(bvec2) ULessThan 398 400
+             402:   137(bool) Any 401
+                              SelectionMerge 404 None
+                              BranchConditional 402 403 404
+             403:               Label
                                 Kill
-             854:             Label
-             857:   48(fvec4) Load 53(inF0)
-             858:   48(fvec4) ExtInst 1(GLSL.std.450) 14(Cos) 857
-                              Store 856(r013) 858
-             860:   48(fvec4) Load 53(inF0)
-             861:   48(fvec4) ExtInst 1(GLSL.std.450) 20(Cosh) 860
-                              Store 859(r014) 861
-             864:   50(ivec4) BitCount 863
-                              Store 862(r015) 864
-             866:   48(fvec4) Load 53(inF0)
-             867:   48(fvec4) DPdx 866
-                              Store 865(r016) 867
-             869:   48(fvec4) Load 53(inF0)
-             870:   48(fvec4) DPdxCoarse 869
-                              Store 868(r017) 870
-             872:   48(fvec4) Load 53(inF0)
-             873:   48(fvec4) DPdxFine 872
-                              Store 871(r018) 873
-             875:   48(fvec4) Load 53(inF0)
-             876:   48(fvec4) DPdy 875
-                              Store 874(r019) 876
-             878:   48(fvec4) Load 53(inF0)
-             879:   48(fvec4) DPdyCoarse 878
-                              Store 877(r020) 879
-             881:   48(fvec4) Load 53(inF0)
-             882:   48(fvec4) DPdyFine 881
-                              Store 880(r021) 882
-             884:   48(fvec4) Load 53(inF0)
-             885:   48(fvec4) ExtInst 1(GLSL.std.450) 12(Degrees) 884
-                              Store 883(r022) 885
-             887:   48(fvec4) Load 53(inF0)
-             888:   48(fvec4) Load 54(inF1)
-             889:    6(float) ExtInst 1(GLSL.std.450) 67(Distance) 887 888
-                              Store 886(r023) 889
-             891:   48(fvec4) Load 53(inF0)
-             892:   48(fvec4) Load 54(inF1)
-             893:    6(float) Dot 891 892
-                              Store 890(r024) 893
-             895:      7(ptr) AccessChain 53(inF0) 515
-             896:    6(float) Load 895
-             897:      7(ptr) AccessChain 54(inF1) 515
-             898:    6(float) Load 897
-             899:    6(float) FMul 896 898
-             900:      7(ptr) AccessChain 53(inF0) 516
-             901:    6(float) Load 900
-             902:      7(ptr) AccessChain 54(inF1) 623
-             903:    6(float) Load 902
-             904:   48(fvec4) CompositeConstruct 281 899 901 903
-                              Store 894(r025) 904
-             906:   48(fvec4) Load 53(inF0)
-             907:   48(fvec4) ExtInst 1(GLSL.std.450) 27(Exp) 906
-                              Store 905(r029) 907
-             909:   48(fvec4) Load 53(inF0)
-             910:   48(fvec4) ExtInst 1(GLSL.std.450) 29(Exp2) 909
-                              Store 908(r030) 910
-             912:   48(fvec4) Load 53(inF0)
-             913:   48(fvec4) Load 54(inF1)
-             914:   48(fvec4) Load 55(inF2)
-             915:   48(fvec4) ExtInst 1(GLSL.std.450) 70(FaceForward) 912 913 914
-                              Store 911(r031) 915
-             920:   50(ivec4) ExtInst 1(GLSL.std.450) 75(FindUMsb) 919
-                              Store 916(r032) 920
-             922:   50(ivec4) ExtInst 1(GLSL.std.450) 73(FindILsb) 919
-                              Store 921(r033) 922
-             924:   48(fvec4) Load 53(inF0)
-             925:   48(fvec4) ExtInst 1(GLSL.std.450) 8(Floor) 924
-                              Store 923(r034) 925
-             927:   48(fvec4) Load 53(inF0)
-             928:   48(fvec4) Load 54(inF1)
-             929:   48(fvec4) FMod 927 928
-                              Store 926(r036) 929
-             931:   48(fvec4) Load 53(inF0)
-             932:   48(fvec4) ExtInst 1(GLSL.std.450) 10(Fract) 931
-                              Store 930(r037) 932
-             934:   48(fvec4) Load 53(inF0)
-             935:   48(fvec4) Fwidth 934
-                              Store 933(r039) 935
-             938:   48(fvec4) Load 53(inF0)
-             939:  850(bvec4) IsInf 938
-                              Store 937(r040) 939
-             941:   48(fvec4) Load 53(inF0)
-             942:  850(bvec4) IsNan 941
-                              Store 940(r041) 942
-             944:   48(fvec4) Load 53(inF0)
-             945:   48(fvec4) Load 54(inF1)
-             946:   48(fvec4) ExtInst 1(GLSL.std.450) 53(Ldexp) 944 945
-                              Store 943(r042) 946
-             948:   48(fvec4) Load 53(inF0)
-             949:   48(fvec4) Load 54(inF1)
-             950:   48(fvec4) Load 55(inF2)
-             951:   48(fvec4) ExtInst 1(GLSL.std.450) 46(FMix) 948 949 950
-                              Store 947(r039a) 951
-             953:   48(fvec4) Load 53(inF0)
-             954:    6(float) ExtInst 1(GLSL.std.450) 66(Length) 953
-                              Store 952(r043) 954
-             956:   48(fvec4) Load 53(inF0)
-             957:   48(fvec4) ExtInst 1(GLSL.std.450) 28(Log) 956
-                              Store 955(r044) 957
-             959:   48(fvec4) Load 53(inF0)
-             960:   48(fvec4) ExtInst 1(GLSL.std.450) 30(Log2) 959
-             961:   48(fvec4) VectorTimesScalar 960 260
-                              Store 958(r045) 961
-             963:   48(fvec4) Load 53(inF0)
-             964:   48(fvec4) ExtInst 1(GLSL.std.450) 30(Log2) 963
-                              Store 962(r046) 964
-             966:   48(fvec4) Load 53(inF0)
-             967:   48(fvec4) Load 54(inF1)
-             968:   48(fvec4) ExtInst 1(GLSL.std.450) 40(FMax) 966 967
-                              Store 965(r047) 968
-             970:   48(fvec4) Load 53(inF0)
-             971:   48(fvec4) Load 54(inF1)
-             972:   48(fvec4) ExtInst 1(GLSL.std.450) 37(FMin) 970 971
-                              Store 969(r048) 972
-             974:   48(fvec4) Load 53(inF0)
-             975:   48(fvec4) ExtInst 1(GLSL.std.450) 69(Normalize) 974
-                              Store 973(r049) 975
-             977:   48(fvec4) Load 53(inF0)
-             978:   48(fvec4) Load 54(inF1)
-             979:   48(fvec4) ExtInst 1(GLSL.std.450) 26(Pow) 977 978
-                              Store 976(r050) 979
-             981:   48(fvec4) Load 53(inF0)
-             982:   48(fvec4) ExtInst 1(GLSL.std.450) 11(Radians) 981
-                              Store 980(r051) 982
-             984:   48(fvec4) Load 53(inF0)
-             985:   48(fvec4) CompositeConstruct 281 281 281 281
-             986:   48(fvec4) FDiv 985 984
-                              Store 983(r052) 986
-             988:   48(fvec4) Load 53(inF0)
-             989:   48(fvec4) Load 54(inF1)
-             990:   48(fvec4) ExtInst 1(GLSL.std.450) 71(Reflect) 988 989
-                              Store 987(r053) 990
-             992:   48(fvec4) Load 53(inF0)
-             993:   48(fvec4) Load 54(inF1)
-             994:   48(fvec4) ExtInst 1(GLSL.std.450) 72(Refract) 992 993 512
-                              Store 991(r054) 994
-             997:   50(ivec4) BitReverse 996
-                              Store 995(r055) 997
-             999:   48(fvec4) Load 53(inF0)
-            1000:   48(fvec4) ExtInst 1(GLSL.std.450) 2(RoundEven) 999
-                              Store 998(r056) 1000
-            1002:   48(fvec4) Load 53(inF0)
-            1003:   48(fvec4) ExtInst 1(GLSL.std.450) 32(InverseSqrt) 1002
-                              Store 1001(r057) 1003
-            1005:   48(fvec4) Load 53(inF0)
-            1006:   48(fvec4) CompositeConstruct 179 179 179 179
-            1007:   48(fvec4) CompositeConstruct 281 281 281 281
-            1008:   48(fvec4) ExtInst 1(GLSL.std.450) 43(FClamp) 1005 1006 1007
-                              Store 1004(r058) 1008
-            1010:   48(fvec4) Load 53(inF0)
-            1011:   48(fvec4) ExtInst 1(GLSL.std.450) 6(FSign) 1010
-                              Store 1009(r059) 1011
-            1013:   48(fvec4) Load 53(inF0)
-            1014:   48(fvec4) ExtInst 1(GLSL.std.450) 13(Sin) 1013
-                              Store 1012(r060) 1014
-            1015:   48(fvec4) Load 53(inF0)
-            1016:   48(fvec4) ExtInst 1(GLSL.std.450) 13(Sin) 1015
-                              Store 54(inF1) 1016
-            1017:   48(fvec4) Load 53(inF0)
-            1018:   48(fvec4) ExtInst 1(GLSL.std.450) 14(Cos) 1017
-                              Store 55(inF2) 1018
-            1020:   48(fvec4) Load 53(inF0)
-            1021:   48(fvec4) ExtInst 1(GLSL.std.450) 19(Sinh) 1020
-                              Store 1019(r061) 1021
-            1023:   48(fvec4) Load 53(inF0)
-            1024:   48(fvec4) Load 54(inF1)
-            1025:   48(fvec4) Load 55(inF2)
-            1026:   48(fvec4) ExtInst 1(GLSL.std.450) 49(SmoothStep) 1023 1024 1025
-                              Store 1022(r062) 1026
-            1028:   48(fvec4) Load 53(inF0)
-            1029:   48(fvec4) ExtInst 1(GLSL.std.450) 31(Sqrt) 1028
-                              Store 1027(r063) 1029
-            1031:   48(fvec4) Load 53(inF0)
-            1032:   48(fvec4) Load 54(inF1)
-            1033:   48(fvec4) ExtInst 1(GLSL.std.450) 48(Step) 1031 1032
-                              Store 1030(r064) 1033
-            1035:   48(fvec4) Load 53(inF0)
-            1036:   48(fvec4) ExtInst 1(GLSL.std.450) 15(Tan) 1035
-                              Store 1034(r065) 1036
-            1038:   48(fvec4) Load 53(inF0)
-            1039:   48(fvec4) ExtInst 1(GLSL.std.450) 21(Tanh) 1038
-                              Store 1037(r066) 1039
-            1041:   48(fvec4) Load 53(inF0)
-            1042:   48(fvec4) ExtInst 1(GLSL.std.450) 3(Trunc) 1041
-                              Store 1040(r067) 1042
-                              ReturnValue 1044
+             404:             Label
+             407:   26(fvec2) Load 31(inF0)
+             408:   26(fvec2) ExtInst 1(GLSL.std.450) 14(Cos) 407
+                              Store 406(r013) 408
+             410:   26(fvec2) Load 31(inF0)
+             411:   26(fvec2) ExtInst 1(GLSL.std.450) 20(Cosh) 410
+                              Store 409(r015) 411
+             415:  366(ivec2) BitCount 414
+                              Store 412(r016) 415
+             417:   26(fvec2) Load 31(inF0)
+             418:   26(fvec2) DPdx 417
+                              Store 416(r017) 418
+             420:   26(fvec2) Load 31(inF0)
+             421:   26(fvec2) DPdxCoarse 420
+                              Store 419(r018) 421
+             423:   26(fvec2) Load 31(inF0)
+             424:   26(fvec2) DPdxFine 423
+                              Store 422(r019) 424
+             426:   26(fvec2) Load 31(inF0)
+             427:   26(fvec2) DPdy 426
+                              Store 425(r020) 427
+             429:   26(fvec2) Load 31(inF0)
+             430:   26(fvec2) DPdyCoarse 429
+                              Store 428(r021) 430
+             432:   26(fvec2) Load 31(inF0)
+             433:   26(fvec2) DPdyFine 432
+                              Store 431(r022) 433
+             435:   26(fvec2) Load 31(inF0)
+             436:   26(fvec2) ExtInst 1(GLSL.std.450) 12(Degrees) 435
+                              Store 434(r023) 436
+             438:   26(fvec2) Load 31(inF0)
+             439:   26(fvec2) Load 32(inF1)
+             440:    6(float) ExtInst 1(GLSL.std.450) 67(Distance) 438 439
+                              Store 437(r026) 440
+             442:   26(fvec2) Load 31(inF0)
+             443:   26(fvec2) Load 32(inF1)
+             444:    6(float) Dot 442 443
+                              Store 441(r027) 444
+             446:   26(fvec2) Load 31(inF0)
+             447:   26(fvec2) ExtInst 1(GLSL.std.450) 27(Exp) 446
+                              Store 445(r028) 447
+             449:   26(fvec2) Load 31(inF0)
+             450:   26(fvec2) ExtInst 1(GLSL.std.450) 29(Exp2) 449
+                              Store 448(r029) 450
+             452:   26(fvec2) Load 31(inF0)
+             453:   26(fvec2) Load 32(inF1)
+             454:   26(fvec2) Load 33(inF2)
+             455:   26(fvec2) ExtInst 1(GLSL.std.450) 70(FaceForward) 452 453 454
+                              Store 451(r030) 455
+             460:   28(ivec2) ExtInst 1(GLSL.std.450) 75(FindUMsb) 459
+                              Store 456(r031) 460
+             462:   28(ivec2) ExtInst 1(GLSL.std.450) 73(FindILsb) 459
+                              Store 461(r032) 462
+             464:   26(fvec2) Load 31(inF0)
+             465:   26(fvec2) ExtInst 1(GLSL.std.450) 8(Floor) 464
+                              Store 463(r033) 465
+             467:   26(fvec2) Load 31(inF0)
+             468:   26(fvec2) Load 32(inF1)
+             469:   26(fvec2) FMod 467 468
+                              Store 466(r035) 469
+             471:   26(fvec2) Load 31(inF0)
+             472:   26(fvec2) ExtInst 1(GLSL.std.450) 10(Fract) 471
+                              Store 470(r036) 472
+             474:   26(fvec2) Load 31(inF0)
+             475:   26(fvec2) Fwidth 474
+                              Store 473(r038) 475
+             478:   26(fvec2) Load 31(inF0)
+             479:  349(bvec2) IsInf 478
+                              Store 477(r039) 479
+             481:   26(fvec2) Load 31(inF0)
+             482:  349(bvec2) IsNan 481
+                              Store 480(r040) 482
+             484:   26(fvec2) Load 31(inF0)
+             485:   26(fvec2) Load 32(inF1)
+             486:   26(fvec2) ExtInst 1(GLSL.std.450) 53(Ldexp) 484 485
+                              Store 483(r041) 486
+             488:   26(fvec2) Load 31(inF0)
+             489:   26(fvec2) Load 32(inF1)
+             490:   26(fvec2) Load 33(inF2)
+             491:   26(fvec2) ExtInst 1(GLSL.std.450) 46(FMix) 488 489 490
+                              Store 487(r039a) 491
+             493:   26(fvec2) Load 31(inF0)
+             494:    6(float) ExtInst 1(GLSL.std.450) 66(Length) 493
+                              Store 492(r042) 494
+             496:   26(fvec2) Load 31(inF0)
+             497:   26(fvec2) ExtInst 1(GLSL.std.450) 28(Log) 496
+                              Store 495(r043) 497
+             499:   26(fvec2) Load 31(inF0)
+             500:   26(fvec2) ExtInst 1(GLSL.std.450) 30(Log2) 499
+             501:   26(fvec2) VectorTimesScalar 500 272
+                              Store 498(r044) 501
+             503:   26(fvec2) Load 31(inF0)
+             504:   26(fvec2) ExtInst 1(GLSL.std.450) 30(Log2) 503
+                              Store 502(r045) 504
+             506:   26(fvec2) Load 31(inF0)
+             507:   26(fvec2) Load 32(inF1)
+             508:   26(fvec2) ExtInst 1(GLSL.std.450) 40(FMax) 506 507
+                              Store 505(r046) 508
+             510:   26(fvec2) Load 31(inF0)
+             511:   26(fvec2) Load 32(inF1)
+             512:   26(fvec2) ExtInst 1(GLSL.std.450) 37(FMin) 510 511
+                              Store 509(r047) 512
+             514:   26(fvec2) Load 31(inF0)
+             515:   26(fvec2) ExtInst 1(GLSL.std.450) 69(Normalize) 514
+                              Store 513(r048) 515
+             517:   26(fvec2) Load 31(inF0)
+             518:   26(fvec2) Load 32(inF1)
+             519:   26(fvec2) ExtInst 1(GLSL.std.450) 26(Pow) 517 518
+                              Store 516(r049) 519
+             521:   26(fvec2) Load 31(inF0)
+             522:   26(fvec2) ExtInst 1(GLSL.std.450) 11(Radians) 521
+                              Store 520(r050) 522
+             524:   26(fvec2) Load 31(inF0)
+             525:   26(fvec2) CompositeConstruct 293 293
+             526:   26(fvec2) FDiv 525 524
+                              Store 523(r051) 526
+             528:   26(fvec2) Load 31(inF0)
+             529:   26(fvec2) Load 32(inF1)
+             530:   26(fvec2) ExtInst 1(GLSL.std.450) 71(Reflect) 528 529
+                              Store 527(r052) 530
+             532:   26(fvec2) Load 31(inF0)
+             533:   26(fvec2) Load 32(inF1)
+             535:   26(fvec2) ExtInst 1(GLSL.std.450) 72(Refract) 532 533 534
+                              Store 531(r053) 535
+             540:   28(ivec2) BitReverse 539
+                              Store 536(r054) 540
+             542:   26(fvec2) Load 31(inF0)
+             543:   26(fvec2) ExtInst 1(GLSL.std.450) 2(RoundEven) 542
+                              Store 541(r055) 543
+             545:   26(fvec2) Load 31(inF0)
+             546:   26(fvec2) ExtInst 1(GLSL.std.450) 32(InverseSqrt) 545
+                              Store 544(r056) 546
+             548:   26(fvec2) Load 31(inF0)
+             549:   26(fvec2) CompositeConstruct 141 141
+             550:   26(fvec2) CompositeConstruct 293 293
+             551:   26(fvec2) ExtInst 1(GLSL.std.450) 43(FClamp) 548 549 550
+                              Store 547(r057) 551
+             553:   26(fvec2) Load 31(inF0)
+             554:   26(fvec2) ExtInst 1(GLSL.std.450) 6(FSign) 553
+                              Store 552(r058) 554
+             556:   26(fvec2) Load 31(inF0)
+             557:   26(fvec2) ExtInst 1(GLSL.std.450) 13(Sin) 556
+                              Store 555(r059) 557
+             558:   26(fvec2) Load 31(inF0)
+             559:   26(fvec2) ExtInst 1(GLSL.std.450) 13(Sin) 558
+                              Store 32(inF1) 559
+             560:   26(fvec2) Load 31(inF0)
+             561:   26(fvec2) ExtInst 1(GLSL.std.450) 14(Cos) 560
+                              Store 33(inF2) 561
+             563:   26(fvec2) Load 31(inF0)
+             564:   26(fvec2) ExtInst 1(GLSL.std.450) 19(Sinh) 563
+                              Store 562(r060) 564
+             566:   26(fvec2) Load 31(inF0)
+             567:   26(fvec2) Load 32(inF1)
+             568:   26(fvec2) Load 33(inF2)
+             569:   26(fvec2) ExtInst 1(GLSL.std.450) 49(SmoothStep) 566 567 568
+                              Store 565(r061) 569
+             571:   26(fvec2) Load 31(inF0)
+             572:   26(fvec2) ExtInst 1(GLSL.std.450) 31(Sqrt) 571
+                              Store 570(r062) 572
+             574:   26(fvec2) Load 31(inF0)
+             575:   26(fvec2) Load 32(inF1)
+             576:   26(fvec2) ExtInst 1(GLSL.std.450) 48(Step) 574 575
+                              Store 573(r063) 576
+             578:   26(fvec2) Load 31(inF0)
+             579:   26(fvec2) ExtInst 1(GLSL.std.450) 15(Tan) 578
+                              Store 577(r064) 579
+             581:   26(fvec2) Load 31(inF0)
+             582:   26(fvec2) ExtInst 1(GLSL.std.450) 21(Tanh) 581
+                              Store 580(r065) 582
+             584:   26(fvec2) Load 31(inF0)
+             585:   26(fvec2) ExtInst 1(GLSL.std.450) 3(Trunc) 584
+                              Store 583(r066) 585
+                              ReturnValue 586
                               FunctionEnd
-66(PixelShaderFunction2x2(mf22;mf22;mf22;):          60 Function None 62
-        63(inF0):     61(ptr) FunctionParameter
-        64(inF1):     61(ptr) FunctionParameter
-        65(inF2):     61(ptr) FunctionParameter
-              67:             Label
-      1047(r000):    136(ptr) Variable Function
-      1050(r001):     61(ptr) Variable Function
-      1055(r003):    136(ptr) Variable Function
-      1058(r004):     61(ptr) Variable Function
-      1061(r005):     61(ptr) Variable Function
-      1064(r006):     61(ptr) Variable Function
-      1068(r007):     61(ptr) Variable Function
-      1079(r008):     61(ptr) Variable Function
-      1084(r009):     61(ptr) Variable Function
-      1087(r010):     61(ptr) Variable Function
-      1090(r011):     61(ptr) Variable Function
-      1093(r012):     61(ptr) Variable Function
-      1096(r013):     61(ptr) Variable Function
-      1099(r014):     61(ptr) Variable Function
-      1102(r015):     61(ptr) Variable Function
-      1105(r016):     61(ptr) Variable Function
-      1108(r017):     61(ptr) Variable Function
-      1111(r018):      7(ptr) Variable Function
-      1114(r019):     61(ptr) Variable Function
-      1117(R020):     61(ptr) Variable Function
-      1120(r021):     61(ptr) Variable Function
-      1123(r022):     61(ptr) Variable Function
-      1133(r023):     61(ptr) Variable Function
-      1136(r025):     61(ptr) Variable Function
-      1139(r026):     61(ptr) Variable Function
-     1143(r026a):     61(ptr) Variable Function
-      1148(r027):     61(ptr) Variable Function
-      1151(r028):     61(ptr) Variable Function
-      1155(r029):     61(ptr) Variable Function
-      1158(r030):     61(ptr) Variable Function
-      1162(r031):     61(ptr) Variable Function
-      1166(r032):     61(ptr) Variable Function
-      1170(r033):     61(ptr) Variable Function
-      1173(r034):     61(ptr) Variable Function
-      1176(r035):     61(ptr) Variable Function
-      1179(r036):     61(ptr) Variable Function
-      1184(r037):     61(ptr) Variable Function
-      1187(r038):     61(ptr) Variable Function
-      1194(r039):     61(ptr) Variable Function
-      1197(r049):     61(ptr) Variable Function
-      1202(r041):     61(ptr) Variable Function
-      1205(r042):     61(ptr) Variable Function
-      1209(r043):     61(ptr) Variable Function
-      1212(r044):     61(ptr) Variable Function
-      1217(r046):     61(ptr) Variable Function
-            1048:          60 Load 63(inF0)
-            1049:   135(bool) All 1048
-                              Store 1047(r000) 1049
-            1051:          60 Load 63(inF0)
-            1052:          60 ExtInst 1(GLSL.std.450) 4(FAbs) 1051
-                              Store 1050(r001) 1052
-            1053:          60 Load 63(inF0)
-            1054:          60 ExtInst 1(GLSL.std.450) 17(Acos) 1053
-            1056:          60 Load 63(inF0)
-            1057:   135(bool) Any 1056
-                              Store 1055(r003) 1057
-            1059:          60 Load 63(inF0)
-            1060:          60 ExtInst 1(GLSL.std.450) 16(Asin) 1059
-                              Store 1058(r004) 1060
-            1062:          60 Load 63(inF0)
-            1063:          60 ExtInst 1(GLSL.std.450) 18(Atan) 1062
-                              Store 1061(r005) 1063
-            1065:          60 Load 63(inF0)
-            1066:          60 Load 64(inF1)
-            1067:          60 ExtInst 1(GLSL.std.450) 25(Atan2) 1065 1066
-                              Store 1064(r006) 1067
-            1069:          60 Load 63(inF0)
-            1070:          60 ExtInst 1(GLSL.std.450) 9(Ceil) 1069
-                              Store 1068(r007) 1070
-            1071:          60 Load 63(inF0)
-            1074:        1073 FOrdLessThan 1071 1072
-            1075:   135(bool) Any 1074
-                              SelectionMerge 1077 None
-                              BranchConditional 1075 1076 1077
-            1076:               Label
+48(PixelShaderFunction3(vf3;vf3;vf3;vu3;vu3;):   38(fvec3) Function None 42
+        43(inF0):     39(ptr) FunctionParameter
+        44(inF1):     39(ptr) FunctionParameter
+        45(inF2):     39(ptr) FunctionParameter
+        46(inU0):     41(ptr) FunctionParameter
+        47(inU1):     41(ptr) FunctionParameter
+              49:             Label
+       589(r000):    138(ptr) Variable Function
+       595(r001):     39(ptr) Variable Function
+       598(r002):     39(ptr) Variable Function
+       601(r003):    138(ptr) Variable Function
+       605(r004):     39(ptr) Variable Function
+       610(r005):    609(ptr) Variable Function
+       613(r006):     41(ptr) Variable Function
+       616(r007):     39(ptr) Variable Function
+       619(r009):     39(ptr) Variable Function
+       622(r010):     39(ptr) Variable Function
+       626(r011):     39(ptr) Variable Function
+       629(r012):     39(ptr) Variable Function
+       647(r013):     39(ptr) Variable Function
+       650(r014):     39(ptr) Variable Function
+       653(r015):     41(ptr) Variable Function
+       658(r016):     39(ptr) Variable Function
+       662(r017):     39(ptr) Variable Function
+       665(r018):     39(ptr) Variable Function
+       668(r019):     39(ptr) Variable Function
+       671(r020):     39(ptr) Variable Function
+       674(r021):     39(ptr) Variable Function
+       677(r022):     39(ptr) Variable Function
+       680(r023):     39(ptr) Variable Function
+       683(r024):      7(ptr) Variable Function
+       687(r025):      7(ptr) Variable Function
+       691(r029):     39(ptr) Variable Function
+       694(r030):     39(ptr) Variable Function
+       697(r031):     39(ptr) Variable Function
+       702(r032):     41(ptr) Variable Function
+       706(r033):     41(ptr) Variable Function
+       708(r034):     39(ptr) Variable Function
+       711(r036):     39(ptr) Variable Function
+       715(r037):     39(ptr) Variable Function
+       718(r039):     39(ptr) Variable Function
+       722(r040):    721(ptr) Variable Function
+       725(r041):    721(ptr) Variable Function
+       728(r042):     39(ptr) Variable Function
+      732(r039a):     39(ptr) Variable Function
+      737(r039b):     39(ptr) Variable Function
+       743(r043):      7(ptr) Variable Function
+       746(r044):     39(ptr) Variable Function
+       749(r045):     39(ptr) Variable Function
+       753(r046):     39(ptr) Variable Function
+       756(r047):     39(ptr) Variable Function
+       760(r048):     39(ptr) Variable Function
+       764(r049):     39(ptr) Variable Function
+       767(r050):     39(ptr) Variable Function
+       771(r051):     39(ptr) Variable Function
+       774(r052):     39(ptr) Variable Function
+       778(r053):     39(ptr) Variable Function
+       782(r054):     39(ptr) Variable Function
+       786(r055):     41(ptr) Variable Function
+       789(r056):     39(ptr) Variable Function
+       792(r057):     39(ptr) Variable Function
+       795(r058):     39(ptr) Variable Function
+       800(r059):     39(ptr) Variable Function
+       803(r060):     39(ptr) Variable Function
+       810(r061):     39(ptr) Variable Function
+       813(r062):     39(ptr) Variable Function
+       818(r063):     39(ptr) Variable Function
+       821(r064):     39(ptr) Variable Function
+       825(r065):     39(ptr) Variable Function
+       828(r066):     39(ptr) Variable Function
+       831(r067):     39(ptr) Variable Function
+             590:   38(fvec3) Load 43(inF0)
+             593:  591(bvec3) FOrdNotEqual 590 592
+             594:   137(bool) All 593
+                              Store 589(r000) 594
+             596:   38(fvec3) Load 43(inF0)
+             597:   38(fvec3) ExtInst 1(GLSL.std.450) 4(FAbs) 596
+                              Store 595(r001) 597
+             599:   38(fvec3) Load 43(inF0)
+             600:   38(fvec3) ExtInst 1(GLSL.std.450) 17(Acos) 599
+                              Store 598(r002) 600
+             602:   38(fvec3) Load 43(inF0)
+             603:  591(bvec3) FOrdNotEqual 602 592
+             604:   137(bool) Any 603
+                              Store 601(r003) 604
+             606:   38(fvec3) Load 43(inF0)
+             607:   38(fvec3) ExtInst 1(GLSL.std.450) 16(Asin) 606
+                              Store 605(r004) 607
+             611:   38(fvec3) Load 43(inF0)
+             612:  608(ivec3) Bitcast 611
+                              Store 610(r005) 612
+             614:   38(fvec3) Load 43(inF0)
+             615:   40(ivec3) Bitcast 614
+                              Store 613(r006) 615
+             617:   40(ivec3) Load 46(inU0)
+             618:   38(fvec3) Bitcast 617
+                              Store 616(r007) 618
+             620:   38(fvec3) Load 43(inF0)
+             621:   38(fvec3) ExtInst 1(GLSL.std.450) 18(Atan) 620
+                              Store 619(r009) 621
+             623:   38(fvec3) Load 43(inF0)
+             624:   38(fvec3) Load 44(inF1)
+             625:   38(fvec3) ExtInst 1(GLSL.std.450) 25(Atan2) 623 624
+                              Store 622(r010) 625
+             627:   38(fvec3) Load 43(inF0)
+             628:   38(fvec3) ExtInst 1(GLSL.std.450) 9(Ceil) 627
+                              Store 626(r011) 628
+             630:   38(fvec3) Load 43(inF0)
+             631:   38(fvec3) Load 44(inF1)
+             632:   38(fvec3) Load 45(inF2)
+             633:   38(fvec3) ExtInst 1(GLSL.std.450) 43(FClamp) 630 631 632
+                              Store 629(r012) 633
+             634:   38(fvec3) Load 43(inF0)
+             635:  591(bvec3) FOrdLessThan 634 592
+             636:   137(bool) Any 635
+                              SelectionMerge 638 None
+                              BranchConditional 636 637 638
+             637:               Label
                                 Kill
-            1077:             Label
-            1080:          60 Load 63(inF0)
-            1081:          60 Load 64(inF1)
-            1082:          60 Load 65(inF2)
-            1083:          60 ExtInst 1(GLSL.std.450) 43(FClamp) 1080 1081 1082
-                              Store 1079(r008) 1083
-            1085:          60 Load 63(inF0)
-            1086:          60 ExtInst 1(GLSL.std.450) 14(Cos) 1085
-                              Store 1084(r009) 1086
-            1088:          60 Load 63(inF0)
-            1089:          60 ExtInst 1(GLSL.std.450) 20(Cosh) 1088
-                              Store 1087(r010) 1089
-            1091:          60 Load 63(inF0)
-            1092:          60 DPdx 1091
-                              Store 1090(r011) 1092
-            1094:          60 Load 63(inF0)
-            1095:          60 DPdxCoarse 1094
-                              Store 1093(r012) 1095
-            1097:          60 Load 63(inF0)
-            1098:          60 DPdxFine 1097
-                              Store 1096(r013) 1098
-            1100:          60 Load 63(inF0)
-            1101:          60 DPdy 1100
-                              Store 1099(r014) 1101
-            1103:          60 Load 63(inF0)
-            1104:          60 DPdyCoarse 1103
-                              Store 1102(r015) 1104
-            1106:          60 Load 63(inF0)
-            1107:          60 DPdyFine 1106
-                              Store 1105(r016) 1107
-            1109:          60 Load 63(inF0)
-            1110:          60 ExtInst 1(GLSL.std.450) 12(Degrees) 1109
-                              Store 1108(r017) 1110
-            1112:          60 Load 63(inF0)
-            1113:    6(float) ExtInst 1(GLSL.std.450) 33(Determinant) 1112
-                              Store 1111(r018) 1113
-            1115:          60 Load 63(inF0)
-            1116:          60 ExtInst 1(GLSL.std.450) 27(Exp) 1115
-                              Store 1114(r019) 1116
-            1118:          60 Load 63(inF0)
-            1119:          60 ExtInst 1(GLSL.std.450) 29(Exp2) 1118
-                              Store 1117(R020) 1119
-            1121:          60 Load 63(inF0)
-            1122:          60 ExtInst 1(GLSL.std.450) 8(Floor) 1121
-                              Store 1120(r021) 1122
-            1124:          60 Load 63(inF0)
-            1125:          60 Load 64(inF1)
-            1126:   24(fvec2) CompositeExtract 1124 0
-            1127:   24(fvec2) CompositeExtract 1125 0
-            1128:   24(fvec2) FMod 1126 1127
-            1129:   24(fvec2) CompositeExtract 1124 1
-            1130:   24(fvec2) CompositeExtract 1125 1
-            1131:   24(fvec2) FMod 1129 1130
-            1132:          60 CompositeConstruct 1128 1131
-                              Store 1123(r022) 1132
-            1134:          60 Load 63(inF0)
-            1135:          60 ExtInst 1(GLSL.std.450) 10(Fract) 1134
-                              Store 1133(r023) 1135
-            1137:          60 Load 63(inF0)
-            1138:          60 Fwidth 1137
-                              Store 1136(r025) 1138
-            1140:          60 Load 63(inF0)
-            1141:          60 Load 64(inF1)
-            1142:          60 ExtInst 1(GLSL.std.450) 53(Ldexp) 1140 1141
-                              Store 1139(r026) 1142
-            1144:          60 Load 63(inF0)
-            1145:          60 Load 64(inF1)
-            1146:          60 Load 65(inF2)
-            1147:          60 ExtInst 1(GLSL.std.450) 46(FMix) 1144 1145 1146
-                              Store 1143(r026a) 1147
-            1149:          60 Load 63(inF0)
-            1150:          60 ExtInst 1(GLSL.std.450) 28(Log) 1149
-                              Store 1148(r027) 1150
-            1152:          60 Load 63(inF0)
-            1153:          60 ExtInst 1(GLSL.std.450) 30(Log2) 1152
-            1154:          60 MatrixTimesScalar 1153 260
-                              Store 1151(r028) 1154
-            1156:          60 Load 63(inF0)
-            1157:          60 ExtInst 1(GLSL.std.450) 30(Log2) 1156
-                              Store 1155(r029) 1157
-            1159:          60 Load 63(inF0)
-            1160:          60 Load 64(inF1)
-            1161:          60 ExtInst 1(GLSL.std.450) 40(FMax) 1159 1160
-                              Store 1158(r030) 1161
-            1163:          60 Load 63(inF0)
-            1164:          60 Load 64(inF1)
-            1165:          60 ExtInst 1(GLSL.std.450) 37(FMin) 1163 1164
-                              Store 1162(r031) 1165
-            1167:          60 Load 63(inF0)
-            1168:          60 Load 64(inF1)
-            1169:          60 ExtInst 1(GLSL.std.450) 26(Pow) 1167 1168
-                              Store 1166(r032) 1169
-            1171:          60 Load 63(inF0)
-            1172:          60 ExtInst 1(GLSL.std.450) 11(Radians) 1171
-                              Store 1170(r033) 1172
-            1174:          60 Load 63(inF0)
-            1175:          60 ExtInst 1(GLSL.std.450) 2(RoundEven) 1174
-                              Store 1173(r034) 1175
-            1177:          60 Load 63(inF0)
-            1178:          60 ExtInst 1(GLSL.std.450) 32(InverseSqrt) 1177
-                              Store 1176(r035) 1178
-            1180:          60 Load 63(inF0)
-            1181:   24(fvec2) CompositeConstruct 179 179
-            1182:   24(fvec2) CompositeConstruct 281 281
-            1183:          60 ExtInst 1(GLSL.std.450) 43(FClamp) 1180 1181 1182
-                              Store 1179(r036) 1183
-            1185:          60 Load 63(inF0)
-            1186:          60 ExtInst 1(GLSL.std.450) 6(FSign) 1185
-                              Store 1184(r037) 1186
-            1188:          60 Load 63(inF0)
-            1189:          60 ExtInst 1(GLSL.std.450) 13(Sin) 1188
-                              Store 1187(r038) 1189
-            1190:          60 Load 63(inF0)
-            1191:          60 ExtInst 1(GLSL.std.450) 13(Sin) 1190
-                              Store 64(inF1) 1191
-            1192:          60 Load 63(inF0)
-            1193:          60 ExtInst 1(GLSL.std.450) 14(Cos) 1192
-                              Store 65(inF2) 1193
-            1195:          60 Load 63(inF0)
-            1196:          60 ExtInst 1(GLSL.std.450) 19(Sinh) 1195
-                              Store 1194(r039) 1196
-            1198:          60 Load 63(inF0)
-            1199:          60 Load 64(inF1)
-            1200:          60 Load 65(inF2)
-            1201:          60 ExtInst 1(GLSL.std.450) 49(SmoothStep) 1198 1199 1200
-                              Store 1197(r049) 1201
-            1203:          60 Load 63(inF0)
-            1204:          60 ExtInst 1(GLSL.std.450) 31(Sqrt) 1203
-                              Store 1202(r041) 1204
-            1206:          60 Load 63(inF0)
-            1207:          60 Load 64(inF1)
-            1208:          60 ExtInst 1(GLSL.std.450) 48(Step) 1206 1207
-                              Store 1205(r042) 1208
-            1210:          60 Load 63(inF0)
-            1211:          60 ExtInst 1(GLSL.std.450) 15(Tan) 1210
-                              Store 1209(r043) 1211
-            1213:          60 Load 63(inF0)
-            1214:          60 ExtInst 1(GLSL.std.450) 21(Tanh) 1213
-                              Store 1212(r044) 1214
-            1215:          60 Load 63(inF0)
-            1216:          60 Transpose 1215
-            1218:          60 Load 63(inF0)
-            1219:          60 ExtInst 1(GLSL.std.450) 3(Trunc) 1218
-                              Store 1217(r046) 1219
-                              ReturnValue 1221
-                              FunctionEnd
-74(PixelShaderFunction3x3(mf33;mf33;mf33;):          68 Function None 70
-        71(inF0):     69(ptr) FunctionParameter
-        72(inF1):     69(ptr) FunctionParameter
-        73(inF2):     69(ptr) FunctionParameter
-              75:             Label
-      1224(r000):    136(ptr) Variable Function
-      1227(r001):     69(ptr) Variable Function
-      1232(r003):    136(ptr) Variable Function
-      1235(r004):     69(ptr) Variable Function
-      1238(r005):     69(ptr) Variable Function
-      1241(r006):     69(ptr) Variable Function
-      1245(r007):     69(ptr) Variable Function
-      1256(r008):     69(ptr) Variable Function
-      1261(r009):     69(ptr) Variable Function
-      1264(r010):     69(ptr) Variable Function
-      1267(r011):     69(ptr) Variable Function
-      1270(r012):     69(ptr) Variable Function
-      1273(r013):     69(ptr) Variable Function
-      1276(r014):     69(ptr) Variable Function
-      1279(r015):     69(ptr) Variable Function
-      1282(r016):     69(ptr) Variable Function
-      1285(r017):     69(ptr) Variable Function
-      1288(r018):      7(ptr) Variable Function
-      1291(r019):     69(ptr) Variable Function
-      1294(R020):     69(ptr) Variable Function
-      1297(r021):     69(ptr) Variable Function
-      1300(r022):     69(ptr) Variable Function
-      1313(r023):     69(ptr) Variable Function
-      1316(r025):     69(ptr) Variable Function
-      1319(r026):     69(ptr) Variable Function
-     1323(r026a):     69(ptr) Variable Function
-      1328(r027):     69(ptr) Variable Function
-      1331(r028):     69(ptr) Variable Function
-      1335(r029):     69(ptr) Variable Function
-      1338(r030):     69(ptr) Variable Function
-      1342(r031):     69(ptr) Variable Function
-      1346(r032):     69(ptr) Variable Function
-      1350(r033):     69(ptr) Variable Function
-      1353(r034):     69(ptr) Variable Function
-      1356(r035):     69(ptr) Variable Function
-      1359(r036):     69(ptr) Variable Function
-      1364(r037):     69(ptr) Variable Function
-      1367(r038):     69(ptr) Variable Function
-      1374(r039):     69(ptr) Variable Function
-      1377(r049):     69(ptr) Variable Function
-      1382(r041):     69(ptr) Variable Function
-      1385(r042):     69(ptr) Variable Function
-      1389(r043):     69(ptr) Variable Function
-      1392(r044):     69(ptr) Variable Function
-      1397(r046):     69(ptr) Variable Function
-            1225:          68 Load 71(inF0)
-            1226:   135(bool) All 1225
-                              Store 1224(r000) 1226
-            1228:          68 Load 71(inF0)
-            1229:          68 ExtInst 1(GLSL.std.450) 4(FAbs) 1228
-                              Store 1227(r001) 1229
-            1230:          68 Load 71(inF0)
-            1231:          68 ExtInst 1(GLSL.std.450) 17(Acos) 1230
-            1233:          68 Load 71(inF0)
-            1234:   135(bool) Any 1233
-                              Store 1232(r003) 1234
-            1236:          68 Load 71(inF0)
-            1237:          68 ExtInst 1(GLSL.std.450) 16(Asin) 1236
-                              Store 1235(r004) 1237
-            1239:          68 Load 71(inF0)
-            1240:          68 ExtInst 1(GLSL.std.450) 18(Atan) 1239
-                              Store 1238(r005) 1240
-            1242:          68 Load 71(inF0)
-            1243:          68 Load 72(inF1)
-            1244:          68 ExtInst 1(GLSL.std.450) 25(Atan2) 1242 1243
-                              Store 1241(r006) 1244
-            1246:          68 Load 71(inF0)
-            1247:          68 ExtInst 1(GLSL.std.450) 9(Ceil) 1246
-                              Store 1245(r007) 1247
-            1248:          68 Load 71(inF0)
-            1251:        1250 FOrdLessThan 1248 1249
-            1252:   135(bool) Any 1251
-                              SelectionMerge 1254 None
-                              BranchConditional 1252 1253 1254
-            1253:               Label
+             638:             Label
+             640:   40(ivec3) Load 46(inU0)
+             642:  591(bvec3) ULessThan 640 641
+             643:   137(bool) Any 642
+                              SelectionMerge 645 None
+                              BranchConditional 643 644 645
+             644:               Label
                                 Kill
-            1254:             Label
-            1257:          68 Load 71(inF0)
-            1258:          68 Load 72(inF1)
-            1259:          68 Load 73(inF2)
-            1260:          68 ExtInst 1(GLSL.std.450) 43(FClamp) 1257 1258 1259
-                              Store 1256(r008) 1260
-            1262:          68 Load 71(inF0)
-            1263:          68 ExtInst 1(GLSL.std.450) 14(Cos) 1262
-                              Store 1261(r009) 1263
-            1265:          68 Load 71(inF0)
-            1266:          68 ExtInst 1(GLSL.std.450) 20(Cosh) 1265
-                              Store 1264(r010) 1266
-            1268:          68 Load 71(inF0)
-            1269:          68 DPdx 1268
-                              Store 1267(r011) 1269
-            1271:          68 Load 71(inF0)
-            1272:          68 DPdxCoarse 1271
-                              Store 1270(r012) 1272
-            1274:          68 Load 71(inF0)
-            1275:          68 DPdxFine 1274
-                              Store 1273(r013) 1275
-            1277:          68 Load 71(inF0)
-            1278:          68 DPdy 1277
-                              Store 1276(r014) 1278
-            1280:          68 Load 71(inF0)
-            1281:          68 DPdyCoarse 1280
-                              Store 1279(r015) 1281
-            1283:          68 Load 71(inF0)
-            1284:          68 DPdyFine 1283
-                              Store 1282(r016) 1284
-            1286:          68 Load 71(inF0)
-            1287:          68 ExtInst 1(GLSL.std.450) 12(Degrees) 1286
-                              Store 1285(r017) 1287
-            1289:          68 Load 71(inF0)
-            1290:    6(float) ExtInst 1(GLSL.std.450) 33(Determinant) 1289
-                              Store 1288(r018) 1290
-            1292:          68 Load 71(inF0)
-            1293:          68 ExtInst 1(GLSL.std.450) 27(Exp) 1292
-                              Store 1291(r019) 1293
-            1295:          68 Load 71(inF0)
-            1296:          68 ExtInst 1(GLSL.std.450) 29(Exp2) 1295
-                              Store 1294(R020) 1296
-            1298:          68 Load 71(inF0)
-            1299:          68 ExtInst 1(GLSL.std.450) 8(Floor) 1298
-                              Store 1297(r021) 1299
-            1301:          68 Load 71(inF0)
-            1302:          68 Load 72(inF1)
-            1303:   36(fvec3) CompositeExtract 1301 0
-            1304:   36(fvec3) CompositeExtract 1302 0
-            1305:   36(fvec3) FMod 1303 1304
-            1306:   36(fvec3) CompositeExtract 1301 1
-            1307:   36(fvec3) CompositeExtract 1302 1
-            1308:   36(fvec3) FMod 1306 1307
-            1309:   36(fvec3) CompositeExtract 1301 2
-            1310:   36(fvec3) CompositeExtract 1302 2
-            1311:   36(fvec3) FMod 1309 1310
-            1312:          68 CompositeConstruct 1305 1308 1311
-                              Store 1300(r022) 1312
-            1314:          68 Load 71(inF0)
-            1315:          68 ExtInst 1(GLSL.std.450) 10(Fract) 1314
-                              Store 1313(r023) 1315
-            1317:          68 Load 71(inF0)
-            1318:          68 Fwidth 1317
-                              Store 1316(r025) 1318
-            1320:          68 Load 71(inF0)
-            1321:          68 Load 72(inF1)
-            1322:          68 ExtInst 1(GLSL.std.450) 53(Ldexp) 1320 1321
-                              Store 1319(r026) 1322
-            1324:          68 Load 71(inF0)
-            1325:          68 Load 72(inF1)
-            1326:          68 Load 73(inF2)
-            1327:          68 ExtInst 1(GLSL.std.450) 46(FMix) 1324 1325 1326
-                              Store 1323(r026a) 1327
-            1329:          68 Load 71(inF0)
-            1330:          68 ExtInst 1(GLSL.std.450) 28(Log) 1329
-                              Store 1328(r027) 1330
-            1332:          68 Load 71(inF0)
-            1333:          68 ExtInst 1(GLSL.std.450) 30(Log2) 1332
-            1334:          68 MatrixTimesScalar 1333 260
-                              Store 1331(r028) 1334
-            1336:          68 Load 71(inF0)
-            1337:          68 ExtInst 1(GLSL.std.450) 30(Log2) 1336
-                              Store 1335(r029) 1337
-            1339:          68 Load 71(inF0)
-            1340:          68 Load 72(inF1)
-            1341:          68 ExtInst 1(GLSL.std.450) 40(FMax) 1339 1340
-                              Store 1338(r030) 1341
-            1343:          68 Load 71(inF0)
-            1344:          68 Load 72(inF1)
-            1345:          68 ExtInst 1(GLSL.std.450) 37(FMin) 1343 1344
-                              Store 1342(r031) 1345
-            1347:          68 Load 71(inF0)
-            1348:          68 Load 72(inF1)
-            1349:          68 ExtInst 1(GLSL.std.450) 26(Pow) 1347 1348
-                              Store 1346(r032) 1349
-            1351:          68 Load 71(inF0)
-            1352:          68 ExtInst 1(GLSL.std.450) 11(Radians) 1351
-                              Store 1350(r033) 1352
-            1354:          68 Load 71(inF0)
-            1355:          68 ExtInst 1(GLSL.std.450) 2(RoundEven) 1354
-                              Store 1353(r034) 1355
-            1357:          68 Load 71(inF0)
-            1358:          68 ExtInst 1(GLSL.std.450) 32(InverseSqrt) 1357
-                              Store 1356(r035) 1358
-            1360:          68 Load 71(inF0)
-            1361:   36(fvec3) CompositeConstruct 179 179 179
-            1362:   36(fvec3) CompositeConstruct 281 281 281
-            1363:          68 ExtInst 1(GLSL.std.450) 43(FClamp) 1360 1361 1362
-                              Store 1359(r036) 1363
-            1365:          68 Load 71(inF0)
-            1366:          68 ExtInst 1(GLSL.std.450) 6(FSign) 1365
-                              Store 1364(r037) 1366
-            1368:          68 Load 71(inF0)
-            1369:          68 ExtInst 1(GLSL.std.450) 13(Sin) 1368
-                              Store 1367(r038) 1369
-            1370:          68 Load 71(inF0)
-            1371:          68 ExtInst 1(GLSL.std.450) 13(Sin) 1370
-                              Store 72(inF1) 1371
-            1372:          68 Load 71(inF0)
-            1373:          68 ExtInst 1(GLSL.std.450) 14(Cos) 1372
-                              Store 73(inF2) 1373
-            1375:          68 Load 71(inF0)
-            1376:          68 ExtInst 1(GLSL.std.450) 19(Sinh) 1375
-                              Store 1374(r039) 1376
-            1378:          68 Load 71(inF0)
-            1379:          68 Load 72(inF1)
-            1380:          68 Load 73(inF2)
-            1381:          68 ExtInst 1(GLSL.std.450) 49(SmoothStep) 1378 1379 1380
-                              Store 1377(r049) 1381
-            1383:          68 Load 71(inF0)
-            1384:          68 ExtInst 1(GLSL.std.450) 31(Sqrt) 1383
-                              Store 1382(r041) 1384
-            1386:          68 Load 71(inF0)
-            1387:          68 Load 72(inF1)
-            1388:          68 ExtInst 1(GLSL.std.450) 48(Step) 1386 1387
-                              Store 1385(r042) 1388
-            1390:          68 Load 71(inF0)
-            1391:          68 ExtInst 1(GLSL.std.450) 15(Tan) 1390
-                              Store 1389(r043) 1391
-            1393:          68 Load 71(inF0)
-            1394:          68 ExtInst 1(GLSL.std.450) 21(Tanh) 1393
-                              Store 1392(r044) 1394
-            1395:          68 Load 71(inF0)
-            1396:          68 Transpose 1395
-            1398:          68 Load 71(inF0)
-            1399:          68 ExtInst 1(GLSL.std.450) 3(Trunc) 1398
-                              Store 1397(r046) 1399
-                              ReturnValue 1401
+             645:             Label
+             648:   38(fvec3) Load 43(inF0)
+             649:   38(fvec3) ExtInst 1(GLSL.std.450) 14(Cos) 648
+                              Store 647(r013) 649
+             651:   38(fvec3) Load 43(inF0)
+             652:   38(fvec3) ExtInst 1(GLSL.std.450) 20(Cosh) 651
+                              Store 650(r014) 652
+             657:   40(ivec3) BitCount 656
+                              Store 653(r015) 657
+             659:   38(fvec3) Load 43(inF0)
+             660:   38(fvec3) Load 44(inF1)
+             661:   38(fvec3) ExtInst 1(GLSL.std.450) 68(Cross) 659 660
+                              Store 658(r016) 661
+             663:   38(fvec3) Load 43(inF0)
+             664:   38(fvec3) DPdx 663
+                              Store 662(r017) 664
+             666:   38(fvec3) Load 43(inF0)
+             667:   38(fvec3) DPdxCoarse 666
+                              Store 665(r018) 667
+             669:   38(fvec3) Load 43(inF0)
+             670:   38(fvec3) DPdxFine 669
+                              Store 668(r019) 670
+             672:   38(fvec3) Load 43(inF0)
+             673:   38(fvec3) DPdy 672
+                              Store 671(r020) 673
+             675:   38(fvec3) Load 43(inF0)
+             676:   38(fvec3) DPdyCoarse 675
+                              Store 674(r021) 676
+             678:   38(fvec3) Load 43(inF0)
+             679:   38(fvec3) DPdyFine 678
+                              Store 677(r022) 679
+             681:   38(fvec3) Load 43(inF0)
+             682:   38(fvec3) ExtInst 1(GLSL.std.450) 12(Degrees) 681
+                              Store 680(r023) 682
+             684:   38(fvec3) Load 43(inF0)
+             685:   38(fvec3) Load 44(inF1)
+             686:    6(float) ExtInst 1(GLSL.std.450) 67(Distance) 684 685
+                              Store 683(r024) 686
+             688:   38(fvec3) Load 43(inF0)
+             689:   38(fvec3) Load 44(inF1)
+             690:    6(float) Dot 688 689
+                              Store 687(r025) 690
+             692:   38(fvec3) Load 43(inF0)
+             693:   38(fvec3) ExtInst 1(GLSL.std.450) 27(Exp) 692
+                              Store 691(r029) 693
+             695:   38(fvec3) Load 43(inF0)
+             696:   38(fvec3) ExtInst 1(GLSL.std.450) 29(Exp2) 695
+                              Store 694(r030) 696
+             698:   38(fvec3) Load 43(inF0)
+             699:   38(fvec3) Load 44(inF1)
+             700:   38(fvec3) Load 45(inF2)
+             701:   38(fvec3) ExtInst 1(GLSL.std.450) 70(FaceForward) 698 699 700
+                              Store 697(r031) 701
+             705:   40(ivec3) ExtInst 1(GLSL.std.450) 75(FindUMsb) 704
+                              Store 702(r032) 705
+             707:   40(ivec3) ExtInst 1(GLSL.std.450) 73(FindILsb) 704
+                              Store 706(r033) 707
+             709:   38(fvec3) Load 43(inF0)
+             710:   38(fvec3) ExtInst 1(GLSL.std.450) 8(Floor) 709
+                              Store 708(r034) 710
+             712:   38(fvec3) Load 43(inF0)
+             713:   38(fvec3) Load 44(inF1)
+             714:   38(fvec3) FMod 712 713
+                              Store 711(r036) 714
+             716:   38(fvec3) Load 43(inF0)
+             717:   38(fvec3) ExtInst 1(GLSL.std.450) 10(Fract) 716
+                              Store 715(r037) 717
+             719:   38(fvec3) Load 43(inF0)
+             720:   38(fvec3) Fwidth 719
+                              Store 718(r039) 720
+             723:   38(fvec3) Load 43(inF0)
+             724:  591(bvec3) IsInf 723
+                              Store 722(r040) 724
+             726:   38(fvec3) Load 43(inF0)
+             727:  591(bvec3) IsNan 726
+                              Store 725(r041) 727
+             729:   38(fvec3) Load 43(inF0)
+             730:   38(fvec3) Load 44(inF1)
+             731:   38(fvec3) ExtInst 1(GLSL.std.450) 53(Ldexp) 729 730
+                              Store 728(r042) 731
+             733:   38(fvec3) Load 43(inF0)
+             734:   38(fvec3) Load 44(inF1)
+             735:   38(fvec3) Load 45(inF2)
+             736:   38(fvec3) ExtInst 1(GLSL.std.450) 46(FMix) 733 734 735
+                              Store 732(r039a) 736
+             738:   38(fvec3) Load 43(inF0)
+             739:   38(fvec3) Load 44(inF1)
+             741:   38(fvec3) CompositeConstruct 740 740 740
+             742:   38(fvec3) ExtInst 1(GLSL.std.450) 46(FMix) 738 739 741
+                              Store 737(r039b) 742
+             744:   38(fvec3) Load 43(inF0)
+             745:    6(float) ExtInst 1(GLSL.std.450) 66(Length) 744
+                              Store 743(r043) 745
+             747:   38(fvec3) Load 43(inF0)
+             748:   38(fvec3) ExtInst 1(GLSL.std.450) 28(Log) 747
+                              Store 746(r044) 748
+             750:   38(fvec3) Load 43(inF0)
+             751:   38(fvec3) ExtInst 1(GLSL.std.450) 30(Log2) 750
+             752:   38(fvec3) VectorTimesScalar 751 272
+                              Store 749(r045) 752
+             754:   38(fvec3) Load 43(inF0)
+             755:   38(fvec3) ExtInst 1(GLSL.std.450) 30(Log2) 754
+                              Store 753(r046) 755
+             757:   38(fvec3) Load 43(inF0)
+             758:   38(fvec3) Load 44(inF1)
+             759:   38(fvec3) ExtInst 1(GLSL.std.450) 40(FMax) 757 758
+                              Store 756(r047) 759
+             761:   38(fvec3) Load 43(inF0)
+             762:   38(fvec3) Load 44(inF1)
+             763:   38(fvec3) ExtInst 1(GLSL.std.450) 37(FMin) 761 762
+                              Store 760(r048) 763
+             765:   38(fvec3) Load 43(inF0)
+             766:   38(fvec3) ExtInst 1(GLSL.std.450) 69(Normalize) 765
+                              Store 764(r049) 766
+             768:   38(fvec3) Load 43(inF0)
+             769:   38(fvec3) Load 44(inF1)
+             770:   38(fvec3) ExtInst 1(GLSL.std.450) 26(Pow) 768 769
+                              Store 767(r050) 770
+             772:   38(fvec3) Load 43(inF0)
+             773:   38(fvec3) ExtInst 1(GLSL.std.450) 11(Radians) 772
+                              Store 771(r051) 773
+             775:   38(fvec3) Load 43(inF0)
+             776:   38(fvec3) CompositeConstruct 293 293 293
+             777:   38(fvec3) FDiv 776 775
+                              Store 774(r052) 777
+             779:   38(fvec3) Load 43(inF0)
+             780:   38(fvec3) Load 44(inF1)
+             781:   38(fvec3) ExtInst 1(GLSL.std.450) 71(Reflect) 779 780
+                              Store 778(r053) 781
+             783:   38(fvec3) Load 43(inF0)
+             784:   38(fvec3) Load 44(inF1)
+             785:   38(fvec3) ExtInst 1(GLSL.std.450) 72(Refract) 783 784 534
+                              Store 782(r054) 785
+             788:   40(ivec3) BitReverse 787
+                              Store 786(r055) 788
+             790:   38(fvec3) Load 43(inF0)
+             791:   38(fvec3) ExtInst 1(GLSL.std.450) 2(RoundEven) 790
+                              Store 789(r056) 791
+             793:   38(fvec3) Load 43(inF0)
+             794:   38(fvec3) ExtInst 1(GLSL.std.450) 32(InverseSqrt) 793
+                              Store 792(r057) 794
+             796:   38(fvec3) Load 43(inF0)
+             797:   38(fvec3) CompositeConstruct 141 141 141
+             798:   38(fvec3) CompositeConstruct 293 293 293
+             799:   38(fvec3) ExtInst 1(GLSL.std.450) 43(FClamp) 796 797 798
+                              Store 795(r058) 799
+             801:   38(fvec3) Load 43(inF0)
+             802:   38(fvec3) ExtInst 1(GLSL.std.450) 6(FSign) 801
+                              Store 800(r059) 802
+             804:   38(fvec3) Load 43(inF0)
+             805:   38(fvec3) ExtInst 1(GLSL.std.450) 13(Sin) 804
+                              Store 803(r060) 805
+             806:   38(fvec3) Load 43(inF0)
+             807:   38(fvec3) ExtInst 1(GLSL.std.450) 13(Sin) 806
+                              Store 44(inF1) 807
+             808:   38(fvec3) Load 43(inF0)
+             809:   38(fvec3) ExtInst 1(GLSL.std.450) 14(Cos) 808
+                              Store 45(inF2) 809
+             811:   38(fvec3) Load 43(inF0)
+             812:   38(fvec3) ExtInst 1(GLSL.std.450) 19(Sinh) 811
+                              Store 810(r061) 812
+             814:   38(fvec3) Load 43(inF0)
+             815:   38(fvec3) Load 44(inF1)
+             816:   38(fvec3) Load 45(inF2)
+             817:   38(fvec3) ExtInst 1(GLSL.std.450) 49(SmoothStep) 814 815 816
+                              Store 813(r062) 817
+             819:   38(fvec3) Load 43(inF0)
+             820:   38(fvec3) ExtInst 1(GLSL.std.450) 31(Sqrt) 819
+                              Store 818(r063) 820
+             822:   38(fvec3) Load 43(inF0)
+             823:   38(fvec3) Load 44(inF1)
+             824:   38(fvec3) ExtInst 1(GLSL.std.450) 48(Step) 822 823
+                              Store 821(r064) 824
+             826:   38(fvec3) Load 43(inF0)
+             827:   38(fvec3) ExtInst 1(GLSL.std.450) 15(Tan) 826
+                              Store 825(r065) 827
+             829:   38(fvec3) Load 43(inF0)
+             830:   38(fvec3) ExtInst 1(GLSL.std.450) 21(Tanh) 829
+                              Store 828(r066) 830
+             832:   38(fvec3) Load 43(inF0)
+             833:   38(fvec3) ExtInst 1(GLSL.std.450) 3(Trunc) 832
+                              Store 831(r067) 833
+                              ReturnValue 835
                               FunctionEnd
-82(PixelShaderFunction4x4(mf44;mf44;mf44;):          76 Function None 78
-        79(inF0):     77(ptr) FunctionParameter
-        80(inF1):     77(ptr) FunctionParameter
-        81(inF2):     77(ptr) FunctionParameter
-              83:             Label
-      1404(r000):    136(ptr) Variable Function
-      1407(r001):     77(ptr) Variable Function
-      1412(r003):    136(ptr) Variable Function
-      1415(r004):     77(ptr) Variable Function
-      1418(r005):     77(ptr) Variable Function
-      1421(r006):     77(ptr) Variable Function
-      1425(r007):     77(ptr) Variable Function
-      1436(r008):     77(ptr) Variable Function
-      1441(r009):     77(ptr) Variable Function
-      1444(r010):     77(ptr) Variable Function
-      1447(r011):     77(ptr) Variable Function
-      1450(r012):     77(ptr) Variable Function
-      1453(r013):     77(ptr) Variable Function
-      1456(r014):     77(ptr) Variable Function
-      1459(r015):     77(ptr) Variable Function
-      1462(r016):     77(ptr) Variable Function
-      1465(r017):     77(ptr) Variable Function
-      1468(r018):      7(ptr) Variable Function
-      1471(r019):     77(ptr) Variable Function
-      1474(R020):     77(ptr) Variable Function
-      1477(r021):     77(ptr) Variable Function
-      1480(r022):     77(ptr) Variable Function
-      1496(r023):     77(ptr) Variable Function
-      1499(r025):     77(ptr) Variable Function
-      1502(r026):     77(ptr) Variable Function
-     1506(r026a):     77(ptr) Variable Function
-      1511(r027):     77(ptr) Variable Function
-      1514(r028):     77(ptr) Variable Function
-      1518(r029):     77(ptr) Variable Function
-      1521(r030):     77(ptr) Variable Function
-      1525(r031):     77(ptr) Variable Function
-      1529(r032):     77(ptr) Variable Function
-      1533(r033):     77(ptr) Variable Function
-      1536(r034):     77(ptr) Variable Function
-      1539(r035):     77(ptr) Variable Function
-      1542(r036):     77(ptr) Variable Function
-      1547(r037):     77(ptr) Variable Function
-      1550(r038):     77(ptr) Variable Function
-      1557(r039):     77(ptr) Variable Function
-      1560(r049):     77(ptr) Variable Function
-      1565(r041):     77(ptr) Variable Function
-      1568(r042):     77(ptr) Variable Function
-      1572(r043):     77(ptr) Variable Function
-      1575(r044):     77(ptr) Variable Function
-      1580(r046):     77(ptr) Variable Function
-            1405:          76 Load 79(inF0)
-            1406:   135(bool) All 1405
-                              Store 1404(r000) 1406
-            1408:          76 Load 79(inF0)
-            1409:          76 ExtInst 1(GLSL.std.450) 4(FAbs) 1408
-                              Store 1407(r001) 1409
-            1410:          76 Load 79(inF0)
-            1411:          76 ExtInst 1(GLSL.std.450) 17(Acos) 1410
-            1413:          76 Load 79(inF0)
-            1414:   135(bool) Any 1413
-                              Store 1412(r003) 1414
-            1416:          76 Load 79(inF0)
-            1417:          76 ExtInst 1(GLSL.std.450) 16(Asin) 1416
-                              Store 1415(r004) 1417
-            1419:          76 Load 79(inF0)
-            1420:          76 ExtInst 1(GLSL.std.450) 18(Atan) 1419
-                              Store 1418(r005) 1420
-            1422:          76 Load 79(inF0)
-            1423:          76 Load 80(inF1)
-            1424:          76 ExtInst 1(GLSL.std.450) 25(Atan2) 1422 1423
-                              Store 1421(r006) 1424
-            1426:          76 Load 79(inF0)
-            1427:          76 ExtInst 1(GLSL.std.450) 9(Ceil) 1426
-                              Store 1425(r007) 1427
-            1428:          76 Load 79(inF0)
-            1431:        1430 FOrdLessThan 1428 1429
-            1432:   135(bool) Any 1431
-                              SelectionMerge 1434 None
-                              BranchConditional 1432 1433 1434
-            1433:               Label
+60(PixelShaderFunction(vf4;vf4;vf4;vu4;vu4;):   50(fvec4) Function None 54
+        55(inF0):     51(ptr) FunctionParameter
+        56(inF1):     51(ptr) FunctionParameter
+        57(inF2):     51(ptr) FunctionParameter
+        58(inU0):     53(ptr) FunctionParameter
+        59(inU1):     53(ptr) FunctionParameter
+              61:             Label
+       838(r000):    138(ptr) Variable Function
+       844(r001):     51(ptr) Variable Function
+       847(r002):     51(ptr) Variable Function
+       850(r003):    138(ptr) Variable Function
+       854(r004):     51(ptr) Variable Function
+       859(r005):    858(ptr) Variable Function
+       862(r006):     53(ptr) Variable Function
+       865(r007):     51(ptr) Variable Function
+       868(r009):     51(ptr) Variable Function
+       871(r010):     51(ptr) Variable Function
+       875(r011):     51(ptr) Variable Function
+       878(r012):     51(ptr) Variable Function
+       896(r013):     51(ptr) Variable Function
+       899(r014):     51(ptr) Variable Function
+       902(r015):     53(ptr) Variable Function
+       905(r016):     51(ptr) Variable Function
+       908(r017):     51(ptr) Variable Function
+       911(r018):     51(ptr) Variable Function
+       914(r019):     51(ptr) Variable Function
+       917(r020):     51(ptr) Variable Function
+       920(r021):     51(ptr) Variable Function
+       923(r022):     51(ptr) Variable Function
+       926(r023):      7(ptr) Variable Function
+       930(r024):      7(ptr) Variable Function
+       934(r025):     51(ptr) Variable Function
+       945(r029):     51(ptr) Variable Function
+       948(r030):     51(ptr) Variable Function
+       951(r031):     51(ptr) Variable Function
+       956(r032):     53(ptr) Variable Function
+       961(r033):     53(ptr) Variable Function
+       963(r034):     51(ptr) Variable Function
+       966(r036):     51(ptr) Variable Function
+       970(r037):     51(ptr) Variable Function
+       973(r039):     51(ptr) Variable Function
+       977(r040):    976(ptr) Variable Function
+       980(r041):    976(ptr) Variable Function
+       983(r042):     51(ptr) Variable Function
+      987(r039a):     51(ptr) Variable Function
+       992(r043):      7(ptr) Variable Function
+       995(r044):     51(ptr) Variable Function
+       998(r045):     51(ptr) Variable Function
+      1002(r046):     51(ptr) Variable Function
+      1005(r047):     51(ptr) Variable Function
+      1009(r048):     51(ptr) Variable Function
+      1013(r049):     51(ptr) Variable Function
+      1016(r050):     51(ptr) Variable Function
+      1020(r051):     51(ptr) Variable Function
+      1023(r052):     51(ptr) Variable Function
+      1027(r053):     51(ptr) Variable Function
+      1031(r054):     51(ptr) Variable Function
+      1035(r055):     53(ptr) Variable Function
+      1038(r056):     51(ptr) Variable Function
+      1041(r057):     51(ptr) Variable Function
+      1044(r058):     51(ptr) Variable Function
+      1049(r059):     51(ptr) Variable Function
+      1052(r060):     51(ptr) Variable Function
+      1059(r061):     51(ptr) Variable Function
+      1062(r062):     51(ptr) Variable Function
+      1067(r063):     51(ptr) Variable Function
+      1070(r064):     51(ptr) Variable Function
+      1074(r065):     51(ptr) Variable Function
+      1077(r066):     51(ptr) Variable Function
+      1080(r067):     51(ptr) Variable Function
+             839:   50(fvec4) Load 55(inF0)
+             842:  840(bvec4) FOrdNotEqual 839 841
+             843:   137(bool) All 842
+                              Store 838(r000) 843
+             845:   50(fvec4) Load 55(inF0)
+             846:   50(fvec4) ExtInst 1(GLSL.std.450) 4(FAbs) 845
+                              Store 844(r001) 846
+             848:   50(fvec4) Load 55(inF0)
+             849:   50(fvec4) ExtInst 1(GLSL.std.450) 17(Acos) 848
+                              Store 847(r002) 849
+             851:   50(fvec4) Load 55(inF0)
+             852:  840(bvec4) FOrdNotEqual 851 841
+             853:   137(bool) Any 852
+                              Store 850(r003) 853
+             855:   50(fvec4) Load 55(inF0)
+             856:   50(fvec4) ExtInst 1(GLSL.std.450) 16(Asin) 855
+                              Store 854(r004) 856
+             860:   50(fvec4) Load 55(inF0)
+             861:  857(ivec4) Bitcast 860
+                              Store 859(r005) 861
+             863:   50(fvec4) Load 55(inF0)
+             864:   52(ivec4) Bitcast 863
+                              Store 862(r006) 864
+             866:   52(ivec4) Load 58(inU0)
+             867:   50(fvec4) Bitcast 866
+                              Store 865(r007) 867
+             869:   50(fvec4) Load 55(inF0)
+             870:   50(fvec4) ExtInst 1(GLSL.std.450) 18(Atan) 869
+                              Store 868(r009) 870
+             872:   50(fvec4) Load 55(inF0)
+             873:   50(fvec4) Load 56(inF1)
+             874:   50(fvec4) ExtInst 1(GLSL.std.450) 25(Atan2) 872 873
+                              Store 871(r010) 874
+             876:   50(fvec4) Load 55(inF0)
+             877:   50(fvec4) ExtInst 1(GLSL.std.450) 9(Ceil) 876
+                              Store 875(r011) 877
+             879:   50(fvec4) Load 55(inF0)
+             880:   50(fvec4) Load 56(inF1)
+             881:   50(fvec4) Load 57(inF2)
+             882:   50(fvec4) ExtInst 1(GLSL.std.450) 43(FClamp) 879 880 881
+                              Store 878(r012) 882
+             883:   50(fvec4) Load 55(inF0)
+             884:  840(bvec4) FOrdLessThan 883 841
+             885:   137(bool) Any 884
+                              SelectionMerge 887 None
+                              BranchConditional 885 886 887
+             886:               Label
                                 Kill
-            1434:             Label
-            1437:          76 Load 79(inF0)
-            1438:          76 Load 80(inF1)
-            1439:          76 Load 81(inF2)
-            1440:          76 ExtInst 1(GLSL.std.450) 43(FClamp) 1437 1438 1439
-                              Store 1436(r008) 1440
-            1442:          76 Load 79(inF0)
-            1443:          76 ExtInst 1(GLSL.std.450) 14(Cos) 1442
-                              Store 1441(r009) 1443
-            1445:          76 Load 79(inF0)
-            1446:          76 ExtInst 1(GLSL.std.450) 20(Cosh) 1445
-                              Store 1444(r010) 1446
-            1448:          76 Load 79(inF0)
-            1449:          76 DPdx 1448
-                              Store 1447(r011) 1449
-            1451:          76 Load 79(inF0)
-            1452:          76 DPdxCoarse 1451
-                              Store 1450(r012) 1452
-            1454:          76 Load 79(inF0)
-            1455:          76 DPdxFine 1454
-                              Store 1453(r013) 1455
-            1457:          76 Load 79(inF0)
-            1458:          76 DPdy 1457
-                              Store 1456(r014) 1458
-            1460:          76 Load 79(inF0)
-            1461:          76 DPdyCoarse 1460
-                              Store 1459(r015) 1461
-            1463:          76 Load 79(inF0)
-            1464:          76 DPdyFine 1463
-                              Store 1462(r016) 1464
-            1466:          76 Load 79(inF0)
-            1467:          76 ExtInst 1(GLSL.std.450) 12(Degrees) 1466
-                              Store 1465(r017) 1467
-            1469:          76 Load 79(inF0)
-            1470:    6(float) ExtInst 1(GLSL.std.450) 33(Determinant) 1469
-                              Store 1468(r018) 1470
-            1472:          76 Load 79(inF0)
-            1473:          76 ExtInst 1(GLSL.std.450) 27(Exp) 1472
-                              Store 1471(r019) 1473
-            1475:          76 Load 79(inF0)
-            1476:          76 ExtInst 1(GLSL.std.450) 29(Exp2) 1475
-                              Store 1474(R020) 1476
-            1478:          76 Load 79(inF0)
-            1479:          76 ExtInst 1(GLSL.std.450) 8(Floor) 1478
-                              Store 1477(r021) 1479
-            1481:          76 Load 79(inF0)
-            1482:          76 Load 80(inF1)
-            1483:   48(fvec4) CompositeExtract 1481 0
-            1484:   48(fvec4) CompositeExtract 1482 0
-            1485:   48(fvec4) FMod 1483 1484
-            1486:   48(fvec4) CompositeExtract 1481 1
-            1487:   48(fvec4) CompositeExtract 1482 1
-            1488:   48(fvec4) FMod 1486 1487
-            1489:   48(fvec4) CompositeExtract 1481 2
-            1490:   48(fvec4) CompositeExtract 1482 2
-            1491:   48(fvec4) FMod 1489 1490
-            1492:   48(fvec4) CompositeExtract 1481 3
-            1493:   48(fvec4) CompositeExtract 1482 3
-            1494:   48(fvec4) FMod 1492 1493
-            1495:          76 CompositeConstruct 1485 1488 1491 1494
-                              Store 1480(r022) 1495
-            1497:          76 Load 79(inF0)
-            1498:          76 ExtInst 1(GLSL.std.450) 10(Fract) 1497
-                              Store 1496(r023) 1498
-            1500:          76 Load 79(inF0)
-            1501:          76 Fwidth 1500
-                              Store 1499(r025) 1501
-            1503:          76 Load 79(inF0)
-            1504:          76 Load 80(inF1)
-            1505:          76 ExtInst 1(GLSL.std.450) 53(Ldexp) 1503 1504
-                              Store 1502(r026) 1505
-            1507:          76 Load 79(inF0)
-            1508:          76 Load 80(inF1)
-            1509:          76 Load 81(inF2)
-            1510:          76 ExtInst 1(GLSL.std.450) 46(FMix) 1507 1508 1509
-                              Store 1506(r026a) 1510
-            1512:          76 Load 79(inF0)
-            1513:          76 ExtInst 1(GLSL.std.450) 28(Log) 1512
-                              Store 1511(r027) 1513
-            1515:          76 Load 79(inF0)
-            1516:          76 ExtInst 1(GLSL.std.450) 30(Log2) 1515
-            1517:          76 MatrixTimesScalar 1516 260
-                              Store 1514(r028) 1517
-            1519:          76 Load 79(inF0)
-            1520:          76 ExtInst 1(GLSL.std.450) 30(Log2) 1519
-                              Store 1518(r029) 1520
-            1522:          76 Load 79(inF0)
-            1523:          76 Load 80(inF1)
-            1524:          76 ExtInst 1(GLSL.std.450) 40(FMax) 1522 1523
-                              Store 1521(r030) 1524
-            1526:          76 Load 79(inF0)
-            1527:          76 Load 80(inF1)
-            1528:          76 ExtInst 1(GLSL.std.450) 37(FMin) 1526 1527
-                              Store 1525(r031) 1528
-            1530:          76 Load 79(inF0)
-            1531:          76 Load 80(inF1)
-            1532:          76 ExtInst 1(GLSL.std.450) 26(Pow) 1530 1531
-                              Store 1529(r032) 1532
-            1534:          76 Load 79(inF0)
-            1535:          76 ExtInst 1(GLSL.std.450) 11(Radians) 1534
-                              Store 1533(r033) 1535
-            1537:          76 Load 79(inF0)
-            1538:          76 ExtInst 1(GLSL.std.450) 2(RoundEven) 1537
-                              Store 1536(r034) 1538
-            1540:          76 Load 79(inF0)
-            1541:          76 ExtInst 1(GLSL.std.450) 32(InverseSqrt) 1540
-                              Store 1539(r035) 1541
-            1543:          76 Load 79(inF0)
-            1544:   48(fvec4) CompositeConstruct 179 179 179 179
-            1545:   48(fvec4) CompositeConstruct 281 281 281 281
-            1546:          76 ExtInst 1(GLSL.std.450) 43(FClamp) 1543 1544 1545
-                              Store 1542(r036) 1546
-            1548:          76 Load 79(inF0)
-            1549:          76 ExtInst 1(GLSL.std.450) 6(FSign) 1548
-                              Store 1547(r037) 1549
-            1551:          76 Load 79(inF0)
-            1552:          76 ExtInst 1(GLSL.std.450) 13(Sin) 1551
-                              Store 1550(r038) 1552
-            1553:          76 Load 79(inF0)
-            1554:          76 ExtInst 1(GLSL.std.450) 13(Sin) 1553
-                              Store 80(inF1) 1554
-            1555:          76 Load 79(inF0)
-            1556:          76 ExtInst 1(GLSL.std.450) 14(Cos) 1555
-                              Store 81(inF2) 1556
-            1558:          76 Load 79(inF0)
-            1559:          76 ExtInst 1(GLSL.std.450) 19(Sinh) 1558
-                              Store 1557(r039) 1559
-            1561:          76 Load 79(inF0)
-            1562:          76 Load 80(inF1)
-            1563:          76 Load 81(inF2)
-            1564:          76 ExtInst 1(GLSL.std.450) 49(SmoothStep) 1561 1562 1563
-                              Store 1560(r049) 1564
-            1566:          76 Load 79(inF0)
-            1567:          76 ExtInst 1(GLSL.std.450) 31(Sqrt) 1566
-                              Store 1565(r041) 1567
-            1569:          76 Load 79(inF0)
-            1570:          76 Load 80(inF1)
-            1571:          76 ExtInst 1(GLSL.std.450) 48(Step) 1569 1570
-                              Store 1568(r042) 1571
-            1573:          76 Load 79(inF0)
-            1574:          76 ExtInst 1(GLSL.std.450) 15(Tan) 1573
-                              Store 1572(r043) 1574
-            1576:          76 Load 79(inF0)
-            1577:          76 ExtInst 1(GLSL.std.450) 21(Tanh) 1576
-                              Store 1575(r044) 1577
-            1578:          76 Load 79(inF0)
-            1579:          76 Transpose 1578
-            1581:          76 Load 79(inF0)
-            1582:          76 ExtInst 1(GLSL.std.450) 3(Trunc) 1581
-                              Store 1580(r046) 1582
-                              ReturnValue 1584
+             887:             Label
+             889:   52(ivec4) Load 58(inU0)
+             891:  840(bvec4) ULessThan 889 890
+             892:   137(bool) Any 891
+                              SelectionMerge 894 None
+                              BranchConditional 892 893 894
+             893:               Label
+                                Kill
+             894:             Label
+             897:   50(fvec4) Load 55(inF0)
+             898:   50(fvec4) ExtInst 1(GLSL.std.450) 14(Cos) 897
+                              Store 896(r013) 898
+             900:   50(fvec4) Load 55(inF0)
+             901:   50(fvec4) ExtInst 1(GLSL.std.450) 20(Cosh) 900
+                              Store 899(r014) 901
+             904:   52(ivec4) BitCount 903
+                              Store 902(r015) 904
+             906:   50(fvec4) Load 55(inF0)
+             907:   50(fvec4) DPdx 906
+                              Store 905(r016) 907
+             909:   50(fvec4) Load 55(inF0)
+             910:   50(fvec4) DPdxCoarse 909
+                              Store 908(r017) 910
+             912:   50(fvec4) Load 55(inF0)
+             913:   50(fvec4) DPdxFine 912
+                              Store 911(r018) 913
+             915:   50(fvec4) Load 55(inF0)
+             916:   50(fvec4) DPdy 915
+                              Store 914(r019) 916
+             918:   50(fvec4) Load 55(inF0)
+             919:   50(fvec4) DPdyCoarse 918
+                              Store 917(r020) 919
+             921:   50(fvec4) Load 55(inF0)
+             922:   50(fvec4) DPdyFine 921
+                              Store 920(r021) 922
+             924:   50(fvec4) Load 55(inF0)
+             925:   50(fvec4) ExtInst 1(GLSL.std.450) 12(Degrees) 924
+                              Store 923(r022) 925
+             927:   50(fvec4) Load 55(inF0)
+             928:   50(fvec4) Load 56(inF1)
+             929:    6(float) ExtInst 1(GLSL.std.450) 67(Distance) 927 928
+                              Store 926(r023) 929
+             931:   50(fvec4) Load 55(inF0)
+             932:   50(fvec4) Load 56(inF1)
+             933:    6(float) Dot 931 932
+                              Store 930(r024) 933
+             935:      7(ptr) AccessChain 55(inF0) 537
+             936:    6(float) Load 935
+             937:      7(ptr) AccessChain 56(inF1) 537
+             938:    6(float) Load 937
+             939:    6(float) FMul 936 938
+             940:      7(ptr) AccessChain 55(inF0) 538
+             941:    6(float) Load 940
+             942:      7(ptr) AccessChain 56(inF1) 654
+             943:    6(float) Load 942
+             944:   50(fvec4) CompositeConstruct 293 939 941 943
+                              Store 934(r025) 944
+             946:   50(fvec4) Load 55(inF0)
+             947:   50(fvec4) ExtInst 1(GLSL.std.450) 27(Exp) 946
+                              Store 945(r029) 947
+             949:   50(fvec4) Load 55(inF0)
+             950:   50(fvec4) ExtInst 1(GLSL.std.450) 29(Exp2) 949
+                              Store 948(r030) 950
+             952:   50(fvec4) Load 55(inF0)
+             953:   50(fvec4) Load 56(inF1)
+             954:   50(fvec4) Load 57(inF2)
+             955:   50(fvec4) ExtInst 1(GLSL.std.450) 70(FaceForward) 952 953 954
+                              Store 951(r031) 955
+             960:   52(ivec4) ExtInst 1(GLSL.std.450) 75(FindUMsb) 959
+                              Store 956(r032) 960
+             962:   52(ivec4) ExtInst 1(GLSL.std.450) 73(FindILsb) 959
+                              Store 961(r033) 962
+             964:   50(fvec4) Load 55(inF0)
+             965:   50(fvec4) ExtInst 1(GLSL.std.450) 8(Floor) 964
+                              Store 963(r034) 965
+             967:   50(fvec4) Load 55(inF0)
+             968:   50(fvec4) Load 56(inF1)
+             969:   50(fvec4) FMod 967 968
+                              Store 966(r036) 969
+             971:   50(fvec4) Load 55(inF0)
+             972:   50(fvec4) ExtInst 1(GLSL.std.450) 10(Fract) 971
+                              Store 970(r037) 972
+             974:   50(fvec4) Load 55(inF0)
+             975:   50(fvec4) Fwidth 974
+                              Store 973(r039) 975
+             978:   50(fvec4) Load 55(inF0)
+             979:  840(bvec4) IsInf 978
+                              Store 977(r040) 979
+             981:   50(fvec4) Load 55(inF0)
+             982:  840(bvec4) IsNan 981
+                              Store 980(r041) 982
+             984:   50(fvec4) Load 55(inF0)
+             985:   50(fvec4) Load 56(inF1)
+             986:   50(fvec4) ExtInst 1(GLSL.std.450) 53(Ldexp) 984 985
+                              Store 983(r042) 986
+             988:   50(fvec4) Load 55(inF0)
+             989:   50(fvec4) Load 56(inF1)
+             990:   50(fvec4) Load 57(inF2)
+             991:   50(fvec4) ExtInst 1(GLSL.std.450) 46(FMix) 988 989 990
+                              Store 987(r039a) 991
+             993:   50(fvec4) Load 55(inF0)
+             994:    6(float) ExtInst 1(GLSL.std.450) 66(Length) 993
+                              Store 992(r043) 994
+             996:   50(fvec4) Load 55(inF0)
+             997:   50(fvec4) ExtInst 1(GLSL.std.450) 28(Log) 996
+                              Store 995(r044) 997
+             999:   50(fvec4) Load 55(inF0)
+            1000:   50(fvec4) ExtInst 1(GLSL.std.450) 30(Log2) 999
+            1001:   50(fvec4) VectorTimesScalar 1000 272
+                              Store 998(r045) 1001
+            1003:   50(fvec4) Load 55(inF0)
+            1004:   50(fvec4) ExtInst 1(GLSL.std.450) 30(Log2) 1003
+                              Store 1002(r046) 1004
+            1006:   50(fvec4) Load 55(inF0)
+            1007:   50(fvec4) Load 56(inF1)
+            1008:   50(fvec4) ExtInst 1(GLSL.std.450) 40(FMax) 1006 1007
+                              Store 1005(r047) 1008
+            1010:   50(fvec4) Load 55(inF0)
+            1011:   50(fvec4) Load 56(inF1)
+            1012:   50(fvec4) ExtInst 1(GLSL.std.450) 37(FMin) 1010 1011
+                              Store 1009(r048) 1012
+            1014:   50(fvec4) Load 55(inF0)
+            1015:   50(fvec4) ExtInst 1(GLSL.std.450) 69(Normalize) 1014
+                              Store 1013(r049) 1015
+            1017:   50(fvec4) Load 55(inF0)
+            1018:   50(fvec4) Load 56(inF1)
+            1019:   50(fvec4) ExtInst 1(GLSL.std.450) 26(Pow) 1017 1018
+                              Store 1016(r050) 1019
+            1021:   50(fvec4) Load 55(inF0)
+            1022:   50(fvec4) ExtInst 1(GLSL.std.450) 11(Radians) 1021
+                              Store 1020(r051) 1022
+            1024:   50(fvec4) Load 55(inF0)
+            1025:   50(fvec4) CompositeConstruct 293 293 293 293
+            1026:   50(fvec4) FDiv 1025 1024
+                              Store 1023(r052) 1026
+            1028:   50(fvec4) Load 55(inF0)
+            1029:   50(fvec4) Load 56(inF1)
+            1030:   50(fvec4) ExtInst 1(GLSL.std.450) 71(Reflect) 1028 1029
+                              Store 1027(r053) 1030
+            1032:   50(fvec4) Load 55(inF0)
+            1033:   50(fvec4) Load 56(inF1)
+            1034:   50(fvec4) ExtInst 1(GLSL.std.450) 72(Refract) 1032 1033 534
+                              Store 1031(r054) 1034
+            1037:   52(ivec4) BitReverse 1036
+                              Store 1035(r055) 1037
+            1039:   50(fvec4) Load 55(inF0)
+            1040:   50(fvec4) ExtInst 1(GLSL.std.450) 2(RoundEven) 1039
+                              Store 1038(r056) 1040
+            1042:   50(fvec4) Load 55(inF0)
+            1043:   50(fvec4) ExtInst 1(GLSL.std.450) 32(InverseSqrt) 1042
+                              Store 1041(r057) 1043
+            1045:   50(fvec4) Load 55(inF0)
+            1046:   50(fvec4) CompositeConstruct 141 141 141 141
+            1047:   50(fvec4) CompositeConstruct 293 293 293 293
+            1048:   50(fvec4) ExtInst 1(GLSL.std.450) 43(FClamp) 1045 1046 1047
+                              Store 1044(r058) 1048
+            1050:   50(fvec4) Load 55(inF0)
+            1051:   50(fvec4) ExtInst 1(GLSL.std.450) 6(FSign) 1050
+                              Store 1049(r059) 1051
+            1053:   50(fvec4) Load 55(inF0)
+            1054:   50(fvec4) ExtInst 1(GLSL.std.450) 13(Sin) 1053
+                              Store 1052(r060) 1054
+            1055:   50(fvec4) Load 55(inF0)
+            1056:   50(fvec4) ExtInst 1(GLSL.std.450) 13(Sin) 1055
+                              Store 56(inF1) 1056
+            1057:   50(fvec4) Load 55(inF0)
+            1058:   50(fvec4) ExtInst 1(GLSL.std.450) 14(Cos) 1057
+                              Store 57(inF2) 1058
+            1060:   50(fvec4) Load 55(inF0)
+            1061:   50(fvec4) ExtInst 1(GLSL.std.450) 19(Sinh) 1060
+                              Store 1059(r061) 1061
+            1063:   50(fvec4) Load 55(inF0)
+            1064:   50(fvec4) Load 56(inF1)
+            1065:   50(fvec4) Load 57(inF2)
+            1066:   50(fvec4) ExtInst 1(GLSL.std.450) 49(SmoothStep) 1063 1064 1065
+                              Store 1062(r062) 1066
+            1068:   50(fvec4) Load 55(inF0)
+            1069:   50(fvec4) ExtInst 1(GLSL.std.450) 31(Sqrt) 1068
+                              Store 1067(r063) 1069
+            1071:   50(fvec4) Load 55(inF0)
+            1072:   50(fvec4) Load 56(inF1)
+            1073:   50(fvec4) ExtInst 1(GLSL.std.450) 48(Step) 1071 1072
+                              Store 1070(r064) 1073
+            1075:   50(fvec4) Load 55(inF0)
+            1076:   50(fvec4) ExtInst 1(GLSL.std.450) 15(Tan) 1075
+                              Store 1074(r065) 1076
+            1078:   50(fvec4) Load 55(inF0)
+            1079:   50(fvec4) ExtInst 1(GLSL.std.450) 21(Tanh) 1078
+                              Store 1077(r066) 1079
+            1081:   50(fvec4) Load 55(inF0)
+            1082:   50(fvec4) ExtInst 1(GLSL.std.450) 3(Trunc) 1081
+                              Store 1080(r067) 1082
+                              ReturnValue 1084
                               FunctionEnd
-91(TestGenMul2(f1;f1;vf2;vf2;mf22;mf22;):           2 Function None 84
-        85(inF0):      7(ptr) FunctionParameter
-        86(inF1):      7(ptr) FunctionParameter
-       87(inFV0):     25(ptr) FunctionParameter
-       88(inFV1):     25(ptr) FunctionParameter
-       89(inFM0):     61(ptr) FunctionParameter
-       90(inFM1):     61(ptr) FunctionParameter
-              92:             Label
-        1587(r0):      7(ptr) Variable Function
-        1591(r1):     25(ptr) Variable Function
-        1595(r2):     25(ptr) Variable Function
-        1599(r3):      7(ptr) Variable Function
-        1603(r4):     25(ptr) Variable Function
-        1607(r5):     25(ptr) Variable Function
-        1611(r6):     61(ptr) Variable Function
-        1615(r7):     61(ptr) Variable Function
-        1619(r8):     61(ptr) Variable Function
-            1588:    6(float) Load 86(inF1)
-            1589:    6(float) Load 85(inF0)
-            1590:    6(float) FMul 1588 1589
-                              Store 1587(r0) 1590
-            1592:    6(float) Load 85(inF0)
-            1593:   24(fvec2) Load 87(inFV0)
-            1594:   24(fvec2) VectorTimesScalar 1593 1592
-                              Store 1591(r1) 1594
-            1596:   24(fvec2) Load 87(inFV0)
-            1597:    6(float) Load 85(inF0)
-            1598:   24(fvec2) VectorTimesScalar 1596 1597
-                              Store 1595(r2) 1598
-            1600:   24(fvec2) Load 87(inFV0)
-            1601:   24(fvec2) Load 88(inFV1)
-            1602:    6(float) Dot 1600 1601
-                              Store 1599(r3) 1602
-            1604:   24(fvec2) Load 87(inFV0)
-            1605:          60 Load 89(inFM0)
-            1606:   24(fvec2) VectorTimesMatrix 1604 1605
-                              Store 1603(r4) 1606
-            1608:          60 Load 89(inFM0)
-            1609:   24(fvec2) Load 87(inFV0)
-            1610:   24(fvec2) MatrixTimesVector 1608 1609
-                              Store 1607(r5) 1610
-            1612:    6(float) Load 85(inF0)
-            1613:          60 Load 89(inFM0)
-            1614:          60 MatrixTimesScalar 1613 1612
-                              Store 1611(r6) 1614
-            1616:          60 Load 89(inFM0)
-            1617:    6(float) Load 85(inF0)
-            1618:          60 MatrixTimesScalar 1616 1617
-                              Store 1615(r7) 1618
-            1620:          60 Load 90(inFM1)
-            1621:          60 Load 89(inFM0)
-            1622:          60 MatrixTimesMatrix 1620 1621
-                              Store 1619(r8) 1622
+68(PixelShaderFunction2x2(mf22;mf22;mf22;):          62 Function None 64
+        65(inF0):     63(ptr) FunctionParameter
+        66(inF1):     63(ptr) FunctionParameter
+        67(inF2):     63(ptr) FunctionParameter
+              69:             Label
+      1087(r000):    138(ptr) Variable Function
+      1092(r001):     63(ptr) Variable Function
+      1097(r003):    138(ptr) Variable Function
+      1101(r004):     63(ptr) Variable Function
+      1104(r005):     63(ptr) Variable Function
+      1107(r006):     63(ptr) Variable Function
+      1111(r007):     63(ptr) Variable Function
+      1121(r008):     63(ptr) Variable Function
+      1126(r009):     63(ptr) Variable Function
+      1129(r010):     63(ptr) Variable Function
+      1132(r011):     63(ptr) Variable Function
+      1135(r012):     63(ptr) Variable Function
+      1138(r013):     63(ptr) Variable Function
+      1141(r014):     63(ptr) Variable Function
+      1144(r015):     63(ptr) Variable Function
+      1147(r016):     63(ptr) Variable Function
+      1150(r017):     63(ptr) Variable Function
+      1153(r018):      7(ptr) Variable Function
+      1156(r019):     63(ptr) Variable Function
+      1159(R020):     63(ptr) Variable Function
+      1162(r021):     63(ptr) Variable Function
+      1165(r022):     63(ptr) Variable Function
+      1175(r023):     63(ptr) Variable Function
+      1178(r025):     63(ptr) Variable Function
+      1181(r026):     63(ptr) Variable Function
+     1185(r026a):     63(ptr) Variable Function
+      1190(r027):     63(ptr) Variable Function
+      1193(r028):     63(ptr) Variable Function
+      1197(r029):     63(ptr) Variable Function
+      1200(r030):     63(ptr) Variable Function
+      1204(r031):     63(ptr) Variable Function
+      1208(r032):     63(ptr) Variable Function
+      1212(r033):     63(ptr) Variable Function
+      1215(r034):     63(ptr) Variable Function
+      1218(r035):     63(ptr) Variable Function
+      1221(r036):     63(ptr) Variable Function
+      1226(r037):     63(ptr) Variable Function
+      1229(r038):     63(ptr) Variable Function
+      1236(r039):     63(ptr) Variable Function
+      1239(r049):     63(ptr) Variable Function
+      1244(r041):     63(ptr) Variable Function
+      1247(r042):     63(ptr) Variable Function
+      1251(r043):     63(ptr) Variable Function
+      1254(r044):     63(ptr) Variable Function
+      1259(r046):     63(ptr) Variable Function
+            1088:          62 Load 65(inF0)
+            1090:        1089 FOrdNotEqual 1088 141
+            1091:   137(bool) All 1090
+                              Store 1087(r000) 1091
+            1093:          62 Load 65(inF0)
+            1094:          62 ExtInst 1(GLSL.std.450) 4(FAbs) 1093
+                              Store 1092(r001) 1094
+            1095:          62 Load 65(inF0)
+            1096:          62 ExtInst 1(GLSL.std.450) 17(Acos) 1095
+            1098:          62 Load 65(inF0)
+            1099:        1089 FOrdNotEqual 1098 141
+            1100:   137(bool) Any 1099
+                              Store 1097(r003) 1100
+            1102:          62 Load 65(inF0)
+            1103:          62 ExtInst 1(GLSL.std.450) 16(Asin) 1102
+                              Store 1101(r004) 1103
+            1105:          62 Load 65(inF0)
+            1106:          62 ExtInst 1(GLSL.std.450) 18(Atan) 1105
+                              Store 1104(r005) 1106
+            1108:          62 Load 65(inF0)
+            1109:          62 Load 66(inF1)
+            1110:          62 ExtInst 1(GLSL.std.450) 25(Atan2) 1108 1109
+                              Store 1107(r006) 1110
+            1112:          62 Load 65(inF0)
+            1113:          62 ExtInst 1(GLSL.std.450) 9(Ceil) 1112
+                              Store 1111(r007) 1113
+            1114:          62 Load 65(inF0)
+            1116:        1089 FOrdLessThan 1114 1115
+            1117:   137(bool) Any 1116
+                              SelectionMerge 1119 None
+                              BranchConditional 1117 1118 1119
+            1118:               Label
+                                Kill
+            1119:             Label
+            1122:          62 Load 65(inF0)
+            1123:          62 Load 66(inF1)
+            1124:          62 Load 67(inF2)
+            1125:          62 ExtInst 1(GLSL.std.450) 43(FClamp) 1122 1123 1124
+                              Store 1121(r008) 1125
+            1127:          62 Load 65(inF0)
+            1128:          62 ExtInst 1(GLSL.std.450) 14(Cos) 1127
+                              Store 1126(r009) 1128
+            1130:          62 Load 65(inF0)
+            1131:          62 ExtInst 1(GLSL.std.450) 20(Cosh) 1130
+                              Store 1129(r010) 1131
+            1133:          62 Load 65(inF0)
+            1134:          62 DPdx 1133
+                              Store 1132(r011) 1134
+            1136:          62 Load 65(inF0)
+            1137:          62 DPdxCoarse 1136
+                              Store 1135(r012) 1137
+            1139:          62 Load 65(inF0)
+            1140:          62 DPdxFine 1139
+                              Store 1138(r013) 1140
+            1142:          62 Load 65(inF0)
+            1143:          62 DPdy 1142
+                              Store 1141(r014) 1143
+            1145:          62 Load 65(inF0)
+            1146:          62 DPdyCoarse 1145
+                              Store 1144(r015) 1146
+            1148:          62 Load 65(inF0)
+            1149:          62 DPdyFine 1148
+                              Store 1147(r016) 1149
+            1151:          62 Load 65(inF0)
+            1152:          62 ExtInst 1(GLSL.std.450) 12(Degrees) 1151
+                              Store 1150(r017) 1152
+            1154:          62 Load 65(inF0)
+            1155:    6(float) ExtInst 1(GLSL.std.450) 33(Determinant) 1154
+                              Store 1153(r018) 1155
+            1157:          62 Load 65(inF0)
+            1158:          62 ExtInst 1(GLSL.std.450) 27(Exp) 1157
+                              Store 1156(r019) 1158
+            1160:          62 Load 65(inF0)
+            1161:          62 ExtInst 1(GLSL.std.450) 29(Exp2) 1160
+                              Store 1159(R020) 1161
+            1163:          62 Load 65(inF0)
+            1164:          62 ExtInst 1(GLSL.std.450) 8(Floor) 1163
+                              Store 1162(r021) 1164
+            1166:          62 Load 65(inF0)
+            1167:          62 Load 66(inF1)
+            1168:   26(fvec2) CompositeExtract 1166 0
+            1169:   26(fvec2) CompositeExtract 1167 0
+            1170:   26(fvec2) FMod 1168 1169
+            1171:   26(fvec2) CompositeExtract 1166 1
+            1172:   26(fvec2) CompositeExtract 1167 1
+            1173:   26(fvec2) FMod 1171 1172
+            1174:          62 CompositeConstruct 1170 1173
+                              Store 1165(r022) 1174
+            1176:          62 Load 65(inF0)
+            1177:          62 ExtInst 1(GLSL.std.450) 10(Fract) 1176
+                              Store 1175(r023) 1177
+            1179:          62 Load 65(inF0)
+            1180:          62 Fwidth 1179
+                              Store 1178(r025) 1180
+            1182:          62 Load 65(inF0)
+            1183:          62 Load 66(inF1)
+            1184:          62 ExtInst 1(GLSL.std.450) 53(Ldexp) 1182 1183
+                              Store 1181(r026) 1184
+            1186:          62 Load 65(inF0)
+            1187:          62 Load 66(inF1)
+            1188:          62 Load 67(inF2)
+            1189:          62 ExtInst 1(GLSL.std.450) 46(FMix) 1186 1187 1188
+                              Store 1185(r026a) 1189
+            1191:          62 Load 65(inF0)
+            1192:          62 ExtInst 1(GLSL.std.450) 28(Log) 1191
+                              Store 1190(r027) 1192
+            1194:          62 Load 65(inF0)
+            1195:          62 ExtInst 1(GLSL.std.450) 30(Log2) 1194
+            1196:          62 MatrixTimesScalar 1195 272
+                              Store 1193(r028) 1196
+            1198:          62 Load 65(inF0)
+            1199:          62 ExtInst 1(GLSL.std.450) 30(Log2) 1198
+                              Store 1197(r029) 1199
+            1201:          62 Load 65(inF0)
+            1202:          62 Load 66(inF1)
+            1203:          62 ExtInst 1(GLSL.std.450) 40(FMax) 1201 1202
+                              Store 1200(r030) 1203
+            1205:          62 Load 65(inF0)
+            1206:          62 Load 66(inF1)
+            1207:          62 ExtInst 1(GLSL.std.450) 37(FMin) 1205 1206
+                              Store 1204(r031) 1207
+            1209:          62 Load 65(inF0)
+            1210:          62 Load 66(inF1)
+            1211:          62 ExtInst 1(GLSL.std.450) 26(Pow) 1209 1210
+                              Store 1208(r032) 1211
+            1213:          62 Load 65(inF0)
+            1214:          62 ExtInst 1(GLSL.std.450) 11(Radians) 1213
+                              Store 1212(r033) 1214
+            1216:          62 Load 65(inF0)
+            1217:          62 ExtInst 1(GLSL.std.450) 2(RoundEven) 1216
+                              Store 1215(r034) 1217
+            1219:          62 Load 65(inF0)
+            1220:          62 ExtInst 1(GLSL.std.450) 32(InverseSqrt) 1219
+                              Store 1218(r035) 1220
+            1222:          62 Load 65(inF0)
+            1223:   26(fvec2) CompositeConstruct 141 141
+            1224:   26(fvec2) CompositeConstruct 293 293
+            1225:          62 ExtInst 1(GLSL.std.450) 43(FClamp) 1222 1223 1224
+                              Store 1221(r036) 1225
+            1227:          62 Load 65(inF0)
+            1228:          62 ExtInst 1(GLSL.std.450) 6(FSign) 1227
+                              Store 1226(r037) 1228
+            1230:          62 Load 65(inF0)
+            1231:          62 ExtInst 1(GLSL.std.450) 13(Sin) 1230
+                              Store 1229(r038) 1231
+            1232:          62 Load 65(inF0)
+            1233:          62 ExtInst 1(GLSL.std.450) 13(Sin) 1232
+                              Store 66(inF1) 1233
+            1234:          62 Load 65(inF0)
+            1235:          62 ExtInst 1(GLSL.std.450) 14(Cos) 1234
+                              Store 67(inF2) 1235
+            1237:          62 Load 65(inF0)
+            1238:          62 ExtInst 1(GLSL.std.450) 19(Sinh) 1237
+                              Store 1236(r039) 1238
+            1240:          62 Load 65(inF0)
+            1241:          62 Load 66(inF1)
+            1242:          62 Load 67(inF2)
+            1243:          62 ExtInst 1(GLSL.std.450) 49(SmoothStep) 1240 1241 1242
+                              Store 1239(r049) 1243
+            1245:          62 Load 65(inF0)
+            1246:          62 ExtInst 1(GLSL.std.450) 31(Sqrt) 1245
+                              Store 1244(r041) 1246
+            1248:          62 Load 65(inF0)
+            1249:          62 Load 66(inF1)
+            1250:          62 ExtInst 1(GLSL.std.450) 48(Step) 1248 1249
+                              Store 1247(r042) 1250
+            1252:          62 Load 65(inF0)
+            1253:          62 ExtInst 1(GLSL.std.450) 15(Tan) 1252
+                              Store 1251(r043) 1253
+            1255:          62 Load 65(inF0)
+            1256:          62 ExtInst 1(GLSL.std.450) 21(Tanh) 1255
+                              Store 1254(r044) 1256
+            1257:          62 Load 65(inF0)
+            1258:          62 Transpose 1257
+            1260:          62 Load 65(inF0)
+            1261:          62 ExtInst 1(GLSL.std.450) 3(Trunc) 1260
+                              Store 1259(r046) 1261
+                              ReturnValue 1263
+                              FunctionEnd
+76(PixelShaderFunction3x3(mf33;mf33;mf33;):          70 Function None 72
+        73(inF0):     71(ptr) FunctionParameter
+        74(inF1):     71(ptr) FunctionParameter
+        75(inF2):     71(ptr) FunctionParameter
+              77:             Label
+      1266(r000):    138(ptr) Variable Function
+      1271(r001):     71(ptr) Variable Function
+      1276(r003):    138(ptr) Variable Function
+      1280(r004):     71(ptr) Variable Function
+      1283(r005):     71(ptr) Variable Function
+      1286(r006):     71(ptr) Variable Function
+      1290(r007):     71(ptr) Variable Function
+      1300(r008):     71(ptr) Variable Function
+      1305(r009):     71(ptr) Variable Function
+      1308(r010):     71(ptr) Variable Function
+      1311(r011):     71(ptr) Variable Function
+      1314(r012):     71(ptr) Variable Function
+      1317(r013):     71(ptr) Variable Function
+      1320(r014):     71(ptr) Variable Function
+      1323(r015):     71(ptr) Variable Function
+      1326(r016):     71(ptr) Variable Function
+      1329(r017):     71(ptr) Variable Function
+      1332(r018):      7(ptr) Variable Function
+      1335(r019):     71(ptr) Variable Function
+      1338(R020):     71(ptr) Variable Function
+      1341(r021):     71(ptr) Variable Function
+      1344(r022):     71(ptr) Variable Function
+      1357(r023):     71(ptr) Variable Function
+      1360(r025):     71(ptr) Variable Function
+      1363(r026):     71(ptr) Variable Function
+     1367(r026a):     71(ptr) Variable Function
+      1372(r027):     71(ptr) Variable Function
+      1375(r028):     71(ptr) Variable Function
+      1379(r029):     71(ptr) Variable Function
+      1382(r030):     71(ptr) Variable Function
+      1386(r031):     71(ptr) Variable Function
+      1390(r032):     71(ptr) Variable Function
+      1394(r033):     71(ptr) Variable Function
+      1397(r034):     71(ptr) Variable Function
+      1400(r035):     71(ptr) Variable Function
+      1403(r036):     71(ptr) Variable Function
+      1408(r037):     71(ptr) Variable Function
+      1411(r038):     71(ptr) Variable Function
+      1418(r039):     71(ptr) Variable Function
+      1421(r049):     71(ptr) Variable Function
+      1426(r041):     71(ptr) Variable Function
+      1429(r042):     71(ptr) Variable Function
+      1433(r043):     71(ptr) Variable Function
+      1436(r044):     71(ptr) Variable Function
+      1441(r046):     71(ptr) Variable Function
+            1267:          70 Load 73(inF0)
+            1269:        1268 FOrdNotEqual 1267 141
+            1270:   137(bool) All 1269
+                              Store 1266(r000) 1270
+            1272:          70 Load 73(inF0)
+            1273:          70 ExtInst 1(GLSL.std.450) 4(FAbs) 1272
+                              Store 1271(r001) 1273
+            1274:          70 Load 73(inF0)
+            1275:          70 ExtInst 1(GLSL.std.450) 17(Acos) 1274
+            1277:          70 Load 73(inF0)
+            1278:        1268 FOrdNotEqual 1277 141
+            1279:   137(bool) Any 1278
+                              Store 1276(r003) 1279
+            1281:          70 Load 73(inF0)
+            1282:          70 ExtInst 1(GLSL.std.450) 16(Asin) 1281
+                              Store 1280(r004) 1282
+            1284:          70 Load 73(inF0)
+            1285:          70 ExtInst 1(GLSL.std.450) 18(Atan) 1284
+                              Store 1283(r005) 1285
+            1287:          70 Load 73(inF0)
+            1288:          70 Load 74(inF1)
+            1289:          70 ExtInst 1(GLSL.std.450) 25(Atan2) 1287 1288
+                              Store 1286(r006) 1289
+            1291:          70 Load 73(inF0)
+            1292:          70 ExtInst 1(GLSL.std.450) 9(Ceil) 1291
+                              Store 1290(r007) 1292
+            1293:          70 Load 73(inF0)
+            1295:        1268 FOrdLessThan 1293 1294
+            1296:   137(bool) Any 1295
+                              SelectionMerge 1298 None
+                              BranchConditional 1296 1297 1298
+            1297:               Label
+                                Kill
+            1298:             Label
+            1301:          70 Load 73(inF0)
+            1302:          70 Load 74(inF1)
+            1303:          70 Load 75(inF2)
+            1304:          70 ExtInst 1(GLSL.std.450) 43(FClamp) 1301 1302 1303
+                              Store 1300(r008) 1304
+            1306:          70 Load 73(inF0)
+            1307:          70 ExtInst 1(GLSL.std.450) 14(Cos) 1306
+                              Store 1305(r009) 1307
+            1309:          70 Load 73(inF0)
+            1310:          70 ExtInst 1(GLSL.std.450) 20(Cosh) 1309
+                              Store 1308(r010) 1310
+            1312:          70 Load 73(inF0)
+            1313:          70 DPdx 1312
+                              Store 1311(r011) 1313
+            1315:          70 Load 73(inF0)
+            1316:          70 DPdxCoarse 1315
+                              Store 1314(r012) 1316
+            1318:          70 Load 73(inF0)
+            1319:          70 DPdxFine 1318
+                              Store 1317(r013) 1319
+            1321:          70 Load 73(inF0)
+            1322:          70 DPdy 1321
+                              Store 1320(r014) 1322
+            1324:          70 Load 73(inF0)
+            1325:          70 DPdyCoarse 1324
+                              Store 1323(r015) 1325
+            1327:          70 Load 73(inF0)
+            1328:          70 DPdyFine 1327
+                              Store 1326(r016) 1328
+            1330:          70 Load 73(inF0)
+            1331:          70 ExtInst 1(GLSL.std.450) 12(Degrees) 1330
+                              Store 1329(r017) 1331
+            1333:          70 Load 73(inF0)
+            1334:    6(float) ExtInst 1(GLSL.std.450) 33(Determinant) 1333
+                              Store 1332(r018) 1334
+            1336:          70 Load 73(inF0)
+            1337:          70 ExtInst 1(GLSL.std.450) 27(Exp) 1336
+                              Store 1335(r019) 1337
+            1339:          70 Load 73(inF0)
+            1340:          70 ExtInst 1(GLSL.std.450) 29(Exp2) 1339
+                              Store 1338(R020) 1340
+            1342:          70 Load 73(inF0)
+            1343:          70 ExtInst 1(GLSL.std.450) 8(Floor) 1342
+                              Store 1341(r021) 1343
+            1345:          70 Load 73(inF0)
+            1346:          70 Load 74(inF1)
+            1347:   38(fvec3) CompositeExtract 1345 0
+            1348:   38(fvec3) CompositeExtract 1346 0
+            1349:   38(fvec3) FMod 1347 1348
+            1350:   38(fvec3) CompositeExtract 1345 1
+            1351:   38(fvec3) CompositeExtract 1346 1
+            1352:   38(fvec3) FMod 1350 1351
+            1353:   38(fvec3) CompositeExtract 1345 2
+            1354:   38(fvec3) CompositeExtract 1346 2
+            1355:   38(fvec3) FMod 1353 1354
+            1356:          70 CompositeConstruct 1349 1352 1355
+                              Store 1344(r022) 1356
+            1358:          70 Load 73(inF0)
+            1359:          70 ExtInst 1(GLSL.std.450) 10(Fract) 1358
+                              Store 1357(r023) 1359
+            1361:          70 Load 73(inF0)
+            1362:          70 Fwidth 1361
+                              Store 1360(r025) 1362
+            1364:          70 Load 73(inF0)
+            1365:          70 Load 74(inF1)
+            1366:          70 ExtInst 1(GLSL.std.450) 53(Ldexp) 1364 1365
+                              Store 1363(r026) 1366
+            1368:          70 Load 73(inF0)
+            1369:          70 Load 74(inF1)
+            1370:          70 Load 75(inF2)
+            1371:          70 ExtInst 1(GLSL.std.450) 46(FMix) 1368 1369 1370
+                              Store 1367(r026a) 1371
+            1373:          70 Load 73(inF0)
+            1374:          70 ExtInst 1(GLSL.std.450) 28(Log) 1373
+                              Store 1372(r027) 1374
+            1376:          70 Load 73(inF0)
+            1377:          70 ExtInst 1(GLSL.std.450) 30(Log2) 1376
+            1378:          70 MatrixTimesScalar 1377 272
+                              Store 1375(r028) 1378
+            1380:          70 Load 73(inF0)
+            1381:          70 ExtInst 1(GLSL.std.450) 30(Log2) 1380
+                              Store 1379(r029) 1381
+            1383:          70 Load 73(inF0)
+            1384:          70 Load 74(inF1)
+            1385:          70 ExtInst 1(GLSL.std.450) 40(FMax) 1383 1384
+                              Store 1382(r030) 1385
+            1387:          70 Load 73(inF0)
+            1388:          70 Load 74(inF1)
+            1389:          70 ExtInst 1(GLSL.std.450) 37(FMin) 1387 1388
+                              Store 1386(r031) 1389
+            1391:          70 Load 73(inF0)
+            1392:          70 Load 74(inF1)
+            1393:          70 ExtInst 1(GLSL.std.450) 26(Pow) 1391 1392
+                              Store 1390(r032) 1393
+            1395:          70 Load 73(inF0)
+            1396:          70 ExtInst 1(GLSL.std.450) 11(Radians) 1395
+                              Store 1394(r033) 1396
+            1398:          70 Load 73(inF0)
+            1399:          70 ExtInst 1(GLSL.std.450) 2(RoundEven) 1398
+                              Store 1397(r034) 1399
+            1401:          70 Load 73(inF0)
+            1402:          70 ExtInst 1(GLSL.std.450) 32(InverseSqrt) 1401
+                              Store 1400(r035) 1402
+            1404:          70 Load 73(inF0)
+            1405:   38(fvec3) CompositeConstruct 141 141 141
+            1406:   38(fvec3) CompositeConstruct 293 293 293
+            1407:          70 ExtInst 1(GLSL.std.450) 43(FClamp) 1404 1405 1406
+                              Store 1403(r036) 1407
+            1409:          70 Load 73(inF0)
+            1410:          70 ExtInst 1(GLSL.std.450) 6(FSign) 1409
+                              Store 1408(r037) 1410
+            1412:          70 Load 73(inF0)
+            1413:          70 ExtInst 1(GLSL.std.450) 13(Sin) 1412
+                              Store 1411(r038) 1413
+            1414:          70 Load 73(inF0)
+            1415:          70 ExtInst 1(GLSL.std.450) 13(Sin) 1414
+                              Store 74(inF1) 1415
+            1416:          70 Load 73(inF0)
+            1417:          70 ExtInst 1(GLSL.std.450) 14(Cos) 1416
+                              Store 75(inF2) 1417
+            1419:          70 Load 73(inF0)
+            1420:          70 ExtInst 1(GLSL.std.450) 19(Sinh) 1419
+                              Store 1418(r039) 1420
+            1422:          70 Load 73(inF0)
+            1423:          70 Load 74(inF1)
+            1424:          70 Load 75(inF2)
+            1425:          70 ExtInst 1(GLSL.std.450) 49(SmoothStep) 1422 1423 1424
+                              Store 1421(r049) 1425
+            1427:          70 Load 73(inF0)
+            1428:          70 ExtInst 1(GLSL.std.450) 31(Sqrt) 1427
+                              Store 1426(r041) 1428
+            1430:          70 Load 73(inF0)
+            1431:          70 Load 74(inF1)
+            1432:          70 ExtInst 1(GLSL.std.450) 48(Step) 1430 1431
+                              Store 1429(r042) 1432
+            1434:          70 Load 73(inF0)
+            1435:          70 ExtInst 1(GLSL.std.450) 15(Tan) 1434
+                              Store 1433(r043) 1435
+            1437:          70 Load 73(inF0)
+            1438:          70 ExtInst 1(GLSL.std.450) 21(Tanh) 1437
+                              Store 1436(r044) 1438
+            1439:          70 Load 73(inF0)
+            1440:          70 Transpose 1439
+            1442:          70 Load 73(inF0)
+            1443:          70 ExtInst 1(GLSL.std.450) 3(Trunc) 1442
+                              Store 1441(r046) 1443
+                              ReturnValue 1445
+                              FunctionEnd
+84(PixelShaderFunction4x4(mf44;mf44;mf44;):          78 Function None 80
+        81(inF0):     79(ptr) FunctionParameter
+        82(inF1):     79(ptr) FunctionParameter
+        83(inF2):     79(ptr) FunctionParameter
+              85:             Label
+      1448(r000):    138(ptr) Variable Function
+      1453(r001):     79(ptr) Variable Function
+      1458(r003):    138(ptr) Variable Function
+      1462(r004):     79(ptr) Variable Function
+      1465(r005):     79(ptr) Variable Function
+      1468(r006):     79(ptr) Variable Function
+      1472(r007):     79(ptr) Variable Function
+      1482(r008):     79(ptr) Variable Function
+      1487(r009):     79(ptr) Variable Function
+      1490(r010):     79(ptr) Variable Function
+      1493(r011):     79(ptr) Variable Function
+      1496(r012):     79(ptr) Variable Function
+      1499(r013):     79(ptr) Variable Function
+      1502(r014):     79(ptr) Variable Function
+      1505(r015):     79(ptr) Variable Function
+      1508(r016):     79(ptr) Variable Function
+      1511(r017):     79(ptr) Variable Function
+      1514(r018):      7(ptr) Variable Function
+      1517(r019):     79(ptr) Variable Function
+      1520(R020):     79(ptr) Variable Function
+      1523(r021):     79(ptr) Variable Function
+      1526(r022):     79(ptr) Variable Function
+      1542(r023):     79(ptr) Variable Function
+      1545(r025):     79(ptr) Variable Function
+      1548(r026):     79(ptr) Variable Function
+     1552(r026a):     79(ptr) Variable Function
+      1557(r027):     79(ptr) Variable Function
+      1560(r028):     79(ptr) Variable Function
+      1564(r029):     79(ptr) Variable Function
+      1567(r030):     79(ptr) Variable Function
+      1571(r031):     79(ptr) Variable Function
+      1575(r032):     79(ptr) Variable Function
+      1579(r033):     79(ptr) Variable Function
+      1582(r034):     79(ptr) Variable Function
+      1585(r035):     79(ptr) Variable Function
+      1588(r036):     79(ptr) Variable Function
+      1593(r037):     79(ptr) Variable Function
+      1596(r038):     79(ptr) Variable Function
+      1603(r039):     79(ptr) Variable Function
+      1606(r049):     79(ptr) Variable Function
+      1611(r041):     79(ptr) Variable Function
+      1614(r042):     79(ptr) Variable Function
+      1618(r043):     79(ptr) Variable Function
+      1621(r044):     79(ptr) Variable Function
+      1626(r046):     79(ptr) Variable Function
+            1449:          78 Load 81(inF0)
+            1451:        1450 FOrdNotEqual 1449 141
+            1452:   137(bool) All 1451
+                              Store 1448(r000) 1452
+            1454:          78 Load 81(inF0)
+            1455:          78 ExtInst 1(GLSL.std.450) 4(FAbs) 1454
+                              Store 1453(r001) 1455
+            1456:          78 Load 81(inF0)
+            1457:          78 ExtInst 1(GLSL.std.450) 17(Acos) 1456
+            1459:          78 Load 81(inF0)
+            1460:        1450 FOrdNotEqual 1459 141
+            1461:   137(bool) Any 1460
+                              Store 1458(r003) 1461
+            1463:          78 Load 81(inF0)
+            1464:          78 ExtInst 1(GLSL.std.450) 16(Asin) 1463
+                              Store 1462(r004) 1464
+            1466:          78 Load 81(inF0)
+            1467:          78 ExtInst 1(GLSL.std.450) 18(Atan) 1466
+                              Store 1465(r005) 1467
+            1469:          78 Load 81(inF0)
+            1470:          78 Load 82(inF1)
+            1471:          78 ExtInst 1(GLSL.std.450) 25(Atan2) 1469 1470
+                              Store 1468(r006) 1471
+            1473:          78 Load 81(inF0)
+            1474:          78 ExtInst 1(GLSL.std.450) 9(Ceil) 1473
+                              Store 1472(r007) 1474
+            1475:          78 Load 81(inF0)
+            1477:        1450 FOrdLessThan 1475 1476
+            1478:   137(bool) Any 1477
+                              SelectionMerge 1480 None
+                              BranchConditional 1478 1479 1480
+            1479:               Label
+                                Kill
+            1480:             Label
+            1483:          78 Load 81(inF0)
+            1484:          78 Load 82(inF1)
+            1485:          78 Load 83(inF2)
+            1486:          78 ExtInst 1(GLSL.std.450) 43(FClamp) 1483 1484 1485
+                              Store 1482(r008) 1486
+            1488:          78 Load 81(inF0)
+            1489:          78 ExtInst 1(GLSL.std.450) 14(Cos) 1488
+                              Store 1487(r009) 1489
+            1491:          78 Load 81(inF0)
+            1492:          78 ExtInst 1(GLSL.std.450) 20(Cosh) 1491
+                              Store 1490(r010) 1492
+            1494:          78 Load 81(inF0)
+            1495:          78 DPdx 1494
+                              Store 1493(r011) 1495
+            1497:          78 Load 81(inF0)
+            1498:          78 DPdxCoarse 1497
+                              Store 1496(r012) 1498
+            1500:          78 Load 81(inF0)
+            1501:          78 DPdxFine 1500
+                              Store 1499(r013) 1501
+            1503:          78 Load 81(inF0)
+            1504:          78 DPdy 1503
+                              Store 1502(r014) 1504
+            1506:          78 Load 81(inF0)
+            1507:          78 DPdyCoarse 1506
+                              Store 1505(r015) 1507
+            1509:          78 Load 81(inF0)
+            1510:          78 DPdyFine 1509
+                              Store 1508(r016) 1510
+            1512:          78 Load 81(inF0)
+            1513:          78 ExtInst 1(GLSL.std.450) 12(Degrees) 1512
+                              Store 1511(r017) 1513
+            1515:          78 Load 81(inF0)
+            1516:    6(float) ExtInst 1(GLSL.std.450) 33(Determinant) 1515
+                              Store 1514(r018) 1516
+            1518:          78 Load 81(inF0)
+            1519:          78 ExtInst 1(GLSL.std.450) 27(Exp) 1518
+                              Store 1517(r019) 1519
+            1521:          78 Load 81(inF0)
+            1522:          78 ExtInst 1(GLSL.std.450) 29(Exp2) 1521
+                              Store 1520(R020) 1522
+            1524:          78 Load 81(inF0)
+            1525:          78 ExtInst 1(GLSL.std.450) 8(Floor) 1524
+                              Store 1523(r021) 1525
+            1527:          78 Load 81(inF0)
+            1528:          78 Load 82(inF1)
+            1529:   50(fvec4) CompositeExtract 1527 0
+            1530:   50(fvec4) CompositeExtract 1528 0
+            1531:   50(fvec4) FMod 1529 1530
+            1532:   50(fvec4) CompositeExtract 1527 1
+            1533:   50(fvec4) CompositeExtract 1528 1
+            1534:   50(fvec4) FMod 1532 1533
+            1535:   50(fvec4) CompositeExtract 1527 2
+            1536:   50(fvec4) CompositeExtract 1528 2
+            1537:   50(fvec4) FMod 1535 1536
+            1538:   50(fvec4) CompositeExtract 1527 3
+            1539:   50(fvec4) CompositeExtract 1528 3
+            1540:   50(fvec4) FMod 1538 1539
+            1541:          78 CompositeConstruct 1531 1534 1537 1540
+                              Store 1526(r022) 1541
+            1543:          78 Load 81(inF0)
+            1544:          78 ExtInst 1(GLSL.std.450) 10(Fract) 1543
+                              Store 1542(r023) 1544
+            1546:          78 Load 81(inF0)
+            1547:          78 Fwidth 1546
+                              Store 1545(r025) 1547
+            1549:          78 Load 81(inF0)
+            1550:          78 Load 82(inF1)
+            1551:          78 ExtInst 1(GLSL.std.450) 53(Ldexp) 1549 1550
+                              Store 1548(r026) 1551
+            1553:          78 Load 81(inF0)
+            1554:          78 Load 82(inF1)
+            1555:          78 Load 83(inF2)
+            1556:          78 ExtInst 1(GLSL.std.450) 46(FMix) 1553 1554 1555
+                              Store 1552(r026a) 1556
+            1558:          78 Load 81(inF0)
+            1559:          78 ExtInst 1(GLSL.std.450) 28(Log) 1558
+                              Store 1557(r027) 1559
+            1561:          78 Load 81(inF0)
+            1562:          78 ExtInst 1(GLSL.std.450) 30(Log2) 1561
+            1563:          78 MatrixTimesScalar 1562 272
+                              Store 1560(r028) 1563
+            1565:          78 Load 81(inF0)
+            1566:          78 ExtInst 1(GLSL.std.450) 30(Log2) 1565
+                              Store 1564(r029) 1566
+            1568:          78 Load 81(inF0)
+            1569:          78 Load 82(inF1)
+            1570:          78 ExtInst 1(GLSL.std.450) 40(FMax) 1568 1569
+                              Store 1567(r030) 1570
+            1572:          78 Load 81(inF0)
+            1573:          78 Load 82(inF1)
+            1574:          78 ExtInst 1(GLSL.std.450) 37(FMin) 1572 1573
+                              Store 1571(r031) 1574
+            1576:          78 Load 81(inF0)
+            1577:          78 Load 82(inF1)
+            1578:          78 ExtInst 1(GLSL.std.450) 26(Pow) 1576 1577
+                              Store 1575(r032) 1578
+            1580:          78 Load 81(inF0)
+            1581:          78 ExtInst 1(GLSL.std.450) 11(Radians) 1580
+                              Store 1579(r033) 1581
+            1583:          78 Load 81(inF0)
+            1584:          78 ExtInst 1(GLSL.std.450) 2(RoundEven) 1583
+                              Store 1582(r034) 1584
+            1586:          78 Load 81(inF0)
+            1587:          78 ExtInst 1(GLSL.std.450) 32(InverseSqrt) 1586
+                              Store 1585(r035) 1587
+            1589:          78 Load 81(inF0)
+            1590:   50(fvec4) CompositeConstruct 141 141 141 141
+            1591:   50(fvec4) CompositeConstruct 293 293 293 293
+            1592:          78 ExtInst 1(GLSL.std.450) 43(FClamp) 1589 1590 1591
+                              Store 1588(r036) 1592
+            1594:          78 Load 81(inF0)
+            1595:          78 ExtInst 1(GLSL.std.450) 6(FSign) 1594
+                              Store 1593(r037) 1595
+            1597:          78 Load 81(inF0)
+            1598:          78 ExtInst 1(GLSL.std.450) 13(Sin) 1597
+                              Store 1596(r038) 1598
+            1599:          78 Load 81(inF0)
+            1600:          78 ExtInst 1(GLSL.std.450) 13(Sin) 1599
+                              Store 82(inF1) 1600
+            1601:          78 Load 81(inF0)
+            1602:          78 ExtInst 1(GLSL.std.450) 14(Cos) 1601
+                              Store 83(inF2) 1602
+            1604:          78 Load 81(inF0)
+            1605:          78 ExtInst 1(GLSL.std.450) 19(Sinh) 1604
+                              Store 1603(r039) 1605
+            1607:          78 Load 81(inF0)
+            1608:          78 Load 82(inF1)
+            1609:          78 Load 83(inF2)
+            1610:          78 ExtInst 1(GLSL.std.450) 49(SmoothStep) 1607 1608 1609
+                              Store 1606(r049) 1610
+            1612:          78 Load 81(inF0)
+            1613:          78 ExtInst 1(GLSL.std.450) 31(Sqrt) 1612
+                              Store 1611(r041) 1613
+            1615:          78 Load 81(inF0)
+            1616:          78 Load 82(inF1)
+            1617:          78 ExtInst 1(GLSL.std.450) 48(Step) 1615 1616
+                              Store 1614(r042) 1617
+            1619:          78 Load 81(inF0)
+            1620:          78 ExtInst 1(GLSL.std.450) 15(Tan) 1619
+                              Store 1618(r043) 1620
+            1622:          78 Load 81(inF0)
+            1623:          78 ExtInst 1(GLSL.std.450) 21(Tanh) 1622
+                              Store 1621(r044) 1623
+            1624:          78 Load 81(inF0)
+            1625:          78 Transpose 1624
+            1627:          78 Load 81(inF0)
+            1628:          78 ExtInst 1(GLSL.std.450) 3(Trunc) 1627
+                              Store 1626(r046) 1628
+                              ReturnValue 1630
+                              FunctionEnd
+93(TestGenMul2(f1;f1;vf2;vf2;mf22;mf22;):           2 Function None 86
+        87(inF0):      7(ptr) FunctionParameter
+        88(inF1):      7(ptr) FunctionParameter
+       89(inFV0):     27(ptr) FunctionParameter
+       90(inFV1):     27(ptr) FunctionParameter
+       91(inFM0):     63(ptr) FunctionParameter
+       92(inFM1):     63(ptr) FunctionParameter
+              94:             Label
+        1633(r0):      7(ptr) Variable Function
+        1637(r1):     27(ptr) Variable Function
+        1641(r2):     27(ptr) Variable Function
+        1645(r3):      7(ptr) Variable Function
+        1649(r4):     27(ptr) Variable Function
+        1653(r5):     27(ptr) Variable Function
+        1657(r6):     63(ptr) Variable Function
+        1661(r7):     63(ptr) Variable Function
+        1665(r8):     63(ptr) Variable Function
+            1634:    6(float) Load 88(inF1)
+            1635:    6(float) Load 87(inF0)
+            1636:    6(float) FMul 1634 1635
+                              Store 1633(r0) 1636
+            1638:    6(float) Load 87(inF0)
+            1639:   26(fvec2) Load 89(inFV0)
+            1640:   26(fvec2) VectorTimesScalar 1639 1638
+                              Store 1637(r1) 1640
+            1642:   26(fvec2) Load 89(inFV0)
+            1643:    6(float) Load 87(inF0)
+            1644:   26(fvec2) VectorTimesScalar 1642 1643
+                              Store 1641(r2) 1644
+            1646:   26(fvec2) Load 89(inFV0)
+            1647:   26(fvec2) Load 90(inFV1)
+            1648:    6(float) Dot 1646 1647
+                              Store 1645(r3) 1648
+            1650:   26(fvec2) Load 89(inFV0)
+            1651:          62 Load 91(inFM0)
+            1652:   26(fvec2) VectorTimesMatrix 1650 1651
+                              Store 1649(r4) 1652
+            1654:          62 Load 91(inFM0)
+            1655:   26(fvec2) Load 89(inFV0)
+            1656:   26(fvec2) MatrixTimesVector 1654 1655
+                              Store 1653(r5) 1656
+            1658:    6(float) Load 87(inF0)
+            1659:          62 Load 91(inFM0)
+            1660:          62 MatrixTimesScalar 1659 1658
+                              Store 1657(r6) 1660
+            1662:          62 Load 91(inFM0)
+            1663:    6(float) Load 87(inF0)
+            1664:          62 MatrixTimesScalar 1662 1663
+                              Store 1661(r7) 1664
+            1666:          62 Load 92(inFM1)
+            1667:          62 Load 91(inFM0)
+            1668:          62 MatrixTimesMatrix 1666 1667
+                              Store 1665(r8) 1668
                               Return
                               FunctionEnd
-100(TestGenMul3(f1;f1;vf3;vf3;mf33;mf33;):           2 Function None 93
-        94(inF0):      7(ptr) FunctionParameter
-        95(inF1):      7(ptr) FunctionParameter
-       96(inFV0):     37(ptr) FunctionParameter
-       97(inFV1):     37(ptr) FunctionParameter
-       98(inFM0):     69(ptr) FunctionParameter
-       99(inFM1):     69(ptr) FunctionParameter
-             101:             Label
-        1623(r0):      7(ptr) Variable Function
-        1627(r1):     37(ptr) Variable Function
-        1631(r2):     37(ptr) Variable Function
-        1635(r3):      7(ptr) Variable Function
-        1639(r4):     37(ptr) Variable Function
-        1643(r5):     37(ptr) Variable Function
-        1647(r6):     69(ptr) Variable Function
-        1651(r7):     69(ptr) Variable Function
-        1655(r8):     69(ptr) Variable Function
-            1624:    6(float) Load 95(inF1)
-            1625:    6(float) Load 94(inF0)
-            1626:    6(float) FMul 1624 1625
-                              Store 1623(r0) 1626
-            1628:    6(float) Load 94(inF0)
-            1629:   36(fvec3) Load 96(inFV0)
-            1630:   36(fvec3) VectorTimesScalar 1629 1628
-                              Store 1627(r1) 1630
-            1632:   36(fvec3) Load 96(inFV0)
-            1633:    6(float) Load 94(inF0)
-            1634:   36(fvec3) VectorTimesScalar 1632 1633
-                              Store 1631(r2) 1634
-            1636:   36(fvec3) Load 96(inFV0)
-            1637:   36(fvec3) Load 97(inFV1)
-            1638:    6(float) Dot 1636 1637
-                              Store 1635(r3) 1638
-            1640:   36(fvec3) Load 96(inFV0)
-            1641:          68 Load 98(inFM0)
-            1642:   36(fvec3) VectorTimesMatrix 1640 1641
-                              Store 1639(r4) 1642
-            1644:          68 Load 98(inFM0)
-            1645:   36(fvec3) Load 96(inFV0)
-            1646:   36(fvec3) MatrixTimesVector 1644 1645
-                              Store 1643(r5) 1646
-            1648:    6(float) Load 94(inF0)
-            1649:          68 Load 98(inFM0)
-            1650:          68 MatrixTimesScalar 1649 1648
-                              Store 1647(r6) 1650
-            1652:          68 Load 98(inFM0)
-            1653:    6(float) Load 94(inF0)
-            1654:          68 MatrixTimesScalar 1652 1653
-                              Store 1651(r7) 1654
-            1656:          68 Load 99(inFM1)
-            1657:          68 Load 98(inFM0)
-            1658:          68 MatrixTimesMatrix 1656 1657
-                              Store 1655(r8) 1658
+102(TestGenMul3(f1;f1;vf3;vf3;mf33;mf33;):           2 Function None 95
+        96(inF0):      7(ptr) FunctionParameter
+        97(inF1):      7(ptr) FunctionParameter
+       98(inFV0):     39(ptr) FunctionParameter
+       99(inFV1):     39(ptr) FunctionParameter
+      100(inFM0):     71(ptr) FunctionParameter
+      101(inFM1):     71(ptr) FunctionParameter
+             103:             Label
+        1669(r0):      7(ptr) Variable Function
+        1673(r1):     39(ptr) Variable Function
+        1677(r2):     39(ptr) Variable Function
+        1681(r3):      7(ptr) Variable Function
+        1685(r4):     39(ptr) Variable Function
+        1689(r5):     39(ptr) Variable Function
+        1693(r6):     71(ptr) Variable Function
+        1697(r7):     71(ptr) Variable Function
+        1701(r8):     71(ptr) Variable Function
+            1670:    6(float) Load 97(inF1)
+            1671:    6(float) Load 96(inF0)
+            1672:    6(float) FMul 1670 1671
+                              Store 1669(r0) 1672
+            1674:    6(float) Load 96(inF0)
+            1675:   38(fvec3) Load 98(inFV0)
+            1676:   38(fvec3) VectorTimesScalar 1675 1674
+                              Store 1673(r1) 1676
+            1678:   38(fvec3) Load 98(inFV0)
+            1679:    6(float) Load 96(inF0)
+            1680:   38(fvec3) VectorTimesScalar 1678 1679
+                              Store 1677(r2) 1680
+            1682:   38(fvec3) Load 98(inFV0)
+            1683:   38(fvec3) Load 99(inFV1)
+            1684:    6(float) Dot 1682 1683
+                              Store 1681(r3) 1684
+            1686:   38(fvec3) Load 98(inFV0)
+            1687:          70 Load 100(inFM0)
+            1688:   38(fvec3) VectorTimesMatrix 1686 1687
+                              Store 1685(r4) 1688
+            1690:          70 Load 100(inFM0)
+            1691:   38(fvec3) Load 98(inFV0)
+            1692:   38(fvec3) MatrixTimesVector 1690 1691
+                              Store 1689(r5) 1692
+            1694:    6(float) Load 96(inF0)
+            1695:          70 Load 100(inFM0)
+            1696:          70 MatrixTimesScalar 1695 1694
+                              Store 1693(r6) 1696
+            1698:          70 Load 100(inFM0)
+            1699:    6(float) Load 96(inF0)
+            1700:          70 MatrixTimesScalar 1698 1699
+                              Store 1697(r7) 1700
+            1702:          70 Load 101(inFM1)
+            1703:          70 Load 100(inFM0)
+            1704:          70 MatrixTimesMatrix 1702 1703
+                              Store 1701(r8) 1704
                               Return
                               FunctionEnd
-109(TestGenMul4(f1;f1;vf4;vf4;mf44;mf44;):           2 Function None 102
-       103(inF0):      7(ptr) FunctionParameter
-       104(inF1):      7(ptr) FunctionParameter
-      105(inFV0):     49(ptr) FunctionParameter
-      106(inFV1):     49(ptr) FunctionParameter
-      107(inFM0):     77(ptr) FunctionParameter
-      108(inFM1):     77(ptr) FunctionParameter
-             110:             Label
-        1659(r0):      7(ptr) Variable Function
-        1663(r1):     49(ptr) Variable Function
-        1667(r2):     49(ptr) Variable Function
-        1671(r3):      7(ptr) Variable Function
-        1675(r4):     49(ptr) Variable Function
-        1679(r5):     49(ptr) Variable Function
-        1683(r6):     77(ptr) Variable Function
-        1687(r7):     77(ptr) Variable Function
-        1691(r8):     77(ptr) Variable Function
-            1660:    6(float) Load 104(inF1)
-            1661:    6(float) Load 103(inF0)
-            1662:    6(float) FMul 1660 1661
-                              Store 1659(r0) 1662
-            1664:    6(float) Load 103(inF0)
-            1665:   48(fvec4) Load 105(inFV0)
-            1666:   48(fvec4) VectorTimesScalar 1665 1664
-                              Store 1663(r1) 1666
-            1668:   48(fvec4) Load 105(inFV0)
-            1669:    6(float) Load 103(inF0)
-            1670:   48(fvec4) VectorTimesScalar 1668 1669
-                              Store 1667(r2) 1670
-            1672:   48(fvec4) Load 105(inFV0)
-            1673:   48(fvec4) Load 106(inFV1)
-            1674:    6(float) Dot 1672 1673
-                              Store 1671(r3) 1674
-            1676:   48(fvec4) Load 105(inFV0)
-            1677:          76 Load 107(inFM0)
-            1678:   48(fvec4) VectorTimesMatrix 1676 1677
-                              Store 1675(r4) 1678
-            1680:          76 Load 107(inFM0)
-            1681:   48(fvec4) Load 105(inFV0)
-            1682:   48(fvec4) MatrixTimesVector 1680 1681
-                              Store 1679(r5) 1682
-            1684:    6(float) Load 103(inF0)
-            1685:          76 Load 107(inFM0)
-            1686:          76 MatrixTimesScalar 1685 1684
-                              Store 1683(r6) 1686
-            1688:          76 Load 107(inFM0)
-            1689:    6(float) Load 103(inF0)
-            1690:          76 MatrixTimesScalar 1688 1689
-                              Store 1687(r7) 1690
-            1692:          76 Load 108(inFM1)
-            1693:          76 Load 107(inFM0)
-            1694:          76 MatrixTimesMatrix 1692 1693
-                              Store 1691(r8) 1694
+111(TestGenMul4(f1;f1;vf4;vf4;mf44;mf44;):           2 Function None 104
+       105(inF0):      7(ptr) FunctionParameter
+       106(inF1):      7(ptr) FunctionParameter
+      107(inFV0):     51(ptr) FunctionParameter
+      108(inFV1):     51(ptr) FunctionParameter
+      109(inFM0):     79(ptr) FunctionParameter
+      110(inFM1):     79(ptr) FunctionParameter
+             112:             Label
+        1705(r0):      7(ptr) Variable Function
+        1709(r1):     51(ptr) Variable Function
+        1713(r2):     51(ptr) Variable Function
+        1717(r3):      7(ptr) Variable Function
+        1721(r4):     51(ptr) Variable Function
+        1725(r5):     51(ptr) Variable Function
+        1729(r6):     79(ptr) Variable Function
+        1733(r7):     79(ptr) Variable Function
+        1737(r8):     79(ptr) Variable Function
+            1706:    6(float) Load 106(inF1)
+            1707:    6(float) Load 105(inF0)
+            1708:    6(float) FMul 1706 1707
+                              Store 1705(r0) 1708
+            1710:    6(float) Load 105(inF0)
+            1711:   50(fvec4) Load 107(inFV0)
+            1712:   50(fvec4) VectorTimesScalar 1711 1710
+                              Store 1709(r1) 1712
+            1714:   50(fvec4) Load 107(inFV0)
+            1715:    6(float) Load 105(inF0)
+            1716:   50(fvec4) VectorTimesScalar 1714 1715
+                              Store 1713(r2) 1716
+            1718:   50(fvec4) Load 107(inFV0)
+            1719:   50(fvec4) Load 108(inFV1)
+            1720:    6(float) Dot 1718 1719
+                              Store 1717(r3) 1720
+            1722:   50(fvec4) Load 107(inFV0)
+            1723:          78 Load 109(inFM0)
+            1724:   50(fvec4) VectorTimesMatrix 1722 1723
+                              Store 1721(r4) 1724
+            1726:          78 Load 109(inFM0)
+            1727:   50(fvec4) Load 107(inFV0)
+            1728:   50(fvec4) MatrixTimesVector 1726 1727
+                              Store 1725(r5) 1728
+            1730:    6(float) Load 105(inF0)
+            1731:          78 Load 109(inFM0)
+            1732:          78 MatrixTimesScalar 1731 1730
+                              Store 1729(r6) 1732
+            1734:          78 Load 109(inFM0)
+            1735:    6(float) Load 105(inF0)
+            1736:          78 MatrixTimesScalar 1734 1735
+                              Store 1733(r7) 1736
+            1738:          78 Load 110(inFM1)
+            1739:          78 Load 109(inFM0)
+            1740:          78 MatrixTimesMatrix 1738 1739
+                              Store 1737(r8) 1740
                               Return
                               FunctionEnd
-129(TestGenMulNxM(f1;f1;vf2;vf3;mf23;mf32;mf33;mf34;mf24;):           2 Function None 119
-       120(inF0):      7(ptr) FunctionParameter
-       121(inF1):      7(ptr) FunctionParameter
-      122(inFV2):     25(ptr) FunctionParameter
-      123(inFV3):     37(ptr) FunctionParameter
-    124(inFM2x3):    112(ptr) FunctionParameter
-    125(inFM3x2):    114(ptr) FunctionParameter
-    126(inFM3x3):     69(ptr) FunctionParameter
-    127(inFM3x4):    116(ptr) FunctionParameter
-    128(inFM2x4):    118(ptr) FunctionParameter
-             130:             Label
-       1695(r00):      7(ptr) Variable Function
-       1699(r01):     25(ptr) Variable Function
-       1703(r02):     37(ptr) Variable Function
-       1707(r03):     25(ptr) Variable Function
-       1711(r04):     37(ptr) Variable Function
-       1715(r05):      7(ptr) Variable Function
-       1719(r06):      7(ptr) Variable Function
-       1723(r07):     37(ptr) Variable Function
-       1727(r08):     25(ptr) Variable Function
-       1731(r09):     25(ptr) Variable Function
-       1735(r10):     37(ptr) Variable Function
-       1739(r11):    112(ptr) Variable Function
-       1743(r12):    114(ptr) Variable Function
-       1747(r13):     61(ptr) Variable Function
-       1751(r14):    112(ptr) Variable Function
-       1755(r15):    118(ptr) Variable Function
-       1759(r16):    116(ptr) Variable Function
-            1696:    6(float) Load 121(inF1)
-            1697:    6(float) Load 120(inF0)
-            1698:    6(float) FMul 1696 1697
-                              Store 1695(r00) 1698
-            1700:    6(float) Load 120(inF0)
-            1701:   24(fvec2) Load 122(inFV2)
-            1702:   24(fvec2) VectorTimesScalar 1701 1700
-                              Store 1699(r01) 1702
-            1704:    6(float) Load 120(inF0)
-            1705:   36(fvec3) Load 123(inFV3)
-            1706:   36(fvec3) VectorTimesScalar 1705 1704
-                              Store 1703(r02) 1706
-            1708:   24(fvec2) Load 122(inFV2)
-            1709:    6(float) Load 120(inF0)
-            1710:   24(fvec2) VectorTimesScalar 1708 1709
-                              Store 1707(r03) 1710
-            1712:   36(fvec3) Load 123(inFV3)
-            1713:    6(float) Load 120(inF0)
-            1714:   36(fvec3) VectorTimesScalar 1712 1713
-                              Store 1711(r04) 1714
-            1716:   24(fvec2) Load 122(inFV2)
-            1717:   24(fvec2) Load 122(inFV2)
-            1718:    6(float) Dot 1716 1717
-                              Store 1715(r05) 1718
-            1720:   36(fvec3) Load 123(inFV3)
-            1721:   36(fvec3) Load 123(inFV3)
-            1722:    6(float) Dot 1720 1721
-                              Store 1719(r06) 1722
-            1724:         111 Load 124(inFM2x3)
-            1725:   24(fvec2) Load 122(inFV2)
-            1726:   36(fvec3) MatrixTimesVector 1724 1725
-                              Store 1723(r07) 1726
-            1728:         113 Load 125(inFM3x2)
-            1729:   36(fvec3) Load 123(inFV3)
-            1730:   24(fvec2) MatrixTimesVector 1728 1729
-                              Store 1727(r08) 1730
-            1732:   36(fvec3) Load 123(inFV3)
-            1733:         111 Load 124(inFM2x3)
-            1734:   24(fvec2) VectorTimesMatrix 1732 1733
-                              Store 1731(r09) 1734
-            1736:   24(fvec2) Load 122(inFV2)
-            1737:         113 Load 125(inFM3x2)
-            1738:   36(fvec3) VectorTimesMatrix 1736 1737
-                              Store 1735(r10) 1738
-            1740:    6(float) Load 120(inF0)
-            1741:         111 Load 124(inFM2x3)
-            1742:         111 MatrixTimesScalar 1741 1740
-                              Store 1739(r11) 1742
-            1744:    6(float) Load 120(inF0)
-            1745:         113 Load 125(inFM3x2)
-            1746:         113 MatrixTimesScalar 1745 1744
-                              Store 1743(r12) 1746
-            1748:         113 Load 125(inFM3x2)
-            1749:         111 Load 124(inFM2x3)
-            1750:          60 MatrixTimesMatrix 1748 1749
-                              Store 1747(r13) 1750
-            1752:          68 Load 126(inFM3x3)
-            1753:         111 Load 124(inFM2x3)
-            1754:         111 MatrixTimesMatrix 1752 1753
-                              Store 1751(r14) 1754
-            1756:         115 Load 127(inFM3x4)
-            1757:         111 Load 124(inFM2x3)
-            1758:         117 MatrixTimesMatrix 1756 1757
-                              Store 1755(r15) 1758
-            1760:         117 Load 128(inFM2x4)
-            1761:         113 Load 125(inFM3x2)
-            1762:         115 MatrixTimesMatrix 1760 1761
-                              Store 1759(r16) 1762
+131(TestGenMulNxM(f1;f1;vf2;vf3;mf23;mf32;mf33;mf34;mf24;):           2 Function None 121
+       122(inF0):      7(ptr) FunctionParameter
+       123(inF1):      7(ptr) FunctionParameter
+      124(inFV2):     27(ptr) FunctionParameter
+      125(inFV3):     39(ptr) FunctionParameter
+    126(inFM2x3):    114(ptr) FunctionParameter
+    127(inFM3x2):    116(ptr) FunctionParameter
+    128(inFM3x3):     71(ptr) FunctionParameter
+    129(inFM3x4):    118(ptr) FunctionParameter
+    130(inFM2x4):    120(ptr) FunctionParameter
+             132:             Label
+       1741(r00):      7(ptr) Variable Function
+       1745(r01):     27(ptr) Variable Function
+       1749(r02):     39(ptr) Variable Function
+       1753(r03):     27(ptr) Variable Function
+       1757(r04):     39(ptr) Variable Function
+       1761(r05):      7(ptr) Variable Function
+       1765(r06):      7(ptr) Variable Function
+       1769(r07):     39(ptr) Variable Function
+       1773(r08):     27(ptr) Variable Function
+       1777(r09):     27(ptr) Variable Function
+       1781(r10):     39(ptr) Variable Function
+       1785(r11):    114(ptr) Variable Function
+       1789(r12):    116(ptr) Variable Function
+       1793(r13):     63(ptr) Variable Function
+       1797(r14):    114(ptr) Variable Function
+       1801(r15):    120(ptr) Variable Function
+       1805(r16):    118(ptr) Variable Function
+            1742:    6(float) Load 123(inF1)
+            1743:    6(float) Load 122(inF0)
+            1744:    6(float) FMul 1742 1743
+                              Store 1741(r00) 1744
+            1746:    6(float) Load 122(inF0)
+            1747:   26(fvec2) Load 124(inFV2)
+            1748:   26(fvec2) VectorTimesScalar 1747 1746
+                              Store 1745(r01) 1748
+            1750:    6(float) Load 122(inF0)
+            1751:   38(fvec3) Load 125(inFV3)
+            1752:   38(fvec3) VectorTimesScalar 1751 1750
+                              Store 1749(r02) 1752
+            1754:   26(fvec2) Load 124(inFV2)
+            1755:    6(float) Load 122(inF0)
+            1756:   26(fvec2) VectorTimesScalar 1754 1755
+                              Store 1753(r03) 1756
+            1758:   38(fvec3) Load 125(inFV3)
+            1759:    6(float) Load 122(inF0)
+            1760:   38(fvec3) VectorTimesScalar 1758 1759
+                              Store 1757(r04) 1760
+            1762:   26(fvec2) Load 124(inFV2)
+            1763:   26(fvec2) Load 124(inFV2)
+            1764:    6(float) Dot 1762 1763
+                              Store 1761(r05) 1764
+            1766:   38(fvec3) Load 125(inFV3)
+            1767:   38(fvec3) Load 125(inFV3)
+            1768:    6(float) Dot 1766 1767
+                              Store 1765(r06) 1768
+            1770:         113 Load 126(inFM2x3)
+            1771:   26(fvec2) Load 124(inFV2)
+            1772:   38(fvec3) MatrixTimesVector 1770 1771
+                              Store 1769(r07) 1772
+            1774:         115 Load 127(inFM3x2)
+            1775:   38(fvec3) Load 125(inFV3)
+            1776:   26(fvec2) MatrixTimesVector 1774 1775
+                              Store 1773(r08) 1776
+            1778:   38(fvec3) Load 125(inFV3)
+            1779:         113 Load 126(inFM2x3)
+            1780:   26(fvec2) VectorTimesMatrix 1778 1779
+                              Store 1777(r09) 1780
+            1782:   26(fvec2) Load 124(inFV2)
+            1783:         115 Load 127(inFM3x2)
+            1784:   38(fvec3) VectorTimesMatrix 1782 1783
+                              Store 1781(r10) 1784
+            1786:    6(float) Load 122(inF0)
+            1787:         113 Load 126(inFM2x3)
+            1788:         113 MatrixTimesScalar 1787 1786
+                              Store 1785(r11) 1788
+            1790:    6(float) Load 122(inF0)
+            1791:         115 Load 127(inFM3x2)
+            1792:         115 MatrixTimesScalar 1791 1790
+                              Store 1789(r12) 1792
+            1794:         115 Load 127(inFM3x2)
+            1795:         113 Load 126(inFM2x3)
+            1796:          62 MatrixTimesMatrix 1794 1795
+                              Store 1793(r13) 1796
+            1798:          70 Load 128(inFM3x3)
+            1799:         113 Load 126(inFM2x3)
+            1800:         113 MatrixTimesMatrix 1798 1799
+                              Store 1797(r14) 1800
+            1802:         117 Load 129(inFM3x4)
+            1803:         113 Load 126(inFM2x3)
+            1804:         119 MatrixTimesMatrix 1802 1803
+                              Store 1801(r15) 1804
+            1806:         119 Load 130(inFM2x4)
+            1807:         115 Load 127(inFM3x2)
+            1808:         117 MatrixTimesMatrix 1806 1807
+                              Store 1805(r16) 1808
                               Return
                               FunctionEnd
-     133(@main():131(PS_OUTPUT) Function None 132
-             134:             Label
- 1764(ps_output):   1763(ptr) Variable Function
-            1767:     49(ptr) AccessChain 1764(ps_output) 1765
-                              Store 1767 1766
-            1768:131(PS_OUTPUT) Load 1764(ps_output)
-                              ReturnValue 1768
+     135(@main():133(PS_OUTPUT) Function None 134
+             136:             Label
+ 1810(ps_output):   1809(ptr) Variable Function
+            1812:     51(ptr) AccessChain 1810(ps_output) 187
+                              Store 1812 1811
+            1813:133(PS_OUTPUT) Load 1810(ps_output)
+                              ReturnValue 1813
                               FunctionEnd
diff --git a/Test/baseResults/hlsl.intrinsics.lit.frag.out b/Test/baseResults/hlsl.intrinsics.lit.frag.out
index 61024f4..8b1454b 100644
--- a/Test/baseResults/hlsl.intrinsics.lit.frag.out
+++ b/Test/baseResults/hlsl.intrinsics.lit.frag.out
@@ -18,7 +18,7 @@
 0:3              'n_dot_l' ( in float)
 0:3              Constant:
 0:3                0.000000
-0:3            Test condition and select ( temp float)
+0:3            Test condition and select ( temp float): no shortcircuit
 0:3              Condition
 0:3              Compare Less Than ( temp bool)
 0:3                min ( temp float)
@@ -79,7 +79,7 @@
 0:3              'n_dot_l' ( in float)
 0:3              Constant:
 0:3                0.000000
-0:3            Test condition and select ( temp float)
+0:3            Test condition and select ( temp float): no shortcircuit
 0:3              Condition
 0:3              Compare Less Than ( temp bool)
 0:3                min ( temp float)
@@ -118,13 +118,13 @@
 0:?     'm' (layout( location=2) in float)
 
 // Module Version 10000
-// Generated by (magic number): 80001
-// Id's are bound by 52
+// Generated by (magic number): 80007
+// Id's are bound by 48
 
                               Capability Shader
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "PixelShaderFunction" 37 40 43
+                              EntryPoint Fragment 4  "PixelShaderFunction" 33 36 39
                               ExecutionMode 4 OriginUpperLeft
                               Source HLSL 500
                               Name 4  "PixelShaderFunction"
@@ -133,18 +133,18 @@
                               Name 10  "n_dot_h"
                               Name 11  "m"
                               Name 16  "r0"
-                              Name 35  "n_dot_l"
-                              Name 37  "n_dot_l"
-                              Name 39  "n_dot_h"
-                              Name 40  "n_dot_h"
-                              Name 42  "m"
-                              Name 43  "m"
+                              Name 31  "n_dot_l"
+                              Name 33  "n_dot_l"
+                              Name 35  "n_dot_h"
+                              Name 36  "n_dot_h"
+                              Name 38  "m"
+                              Name 39  "m"
+                              Name 41  "param"
+                              Name 43  "param"
                               Name 45  "param"
-                              Name 47  "param"
-                              Name 49  "param"
-                              Decorate 37(n_dot_l) Location 0
-                              Decorate 40(n_dot_h) Location 1
-                              Decorate 43(m) Location 2
+                              Decorate 33(n_dot_l) Location 0
+                              Decorate 36(n_dot_h) Location 1
+                              Decorate 39(m) Location 2
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -154,32 +154,32 @@
               15:             TypePointer Function 14(fvec4)
               17:    6(float) Constant 1065353216
               19:    6(float) Constant 0
-              25:             TypeBool
-              36:             TypePointer Input 6(float)
-     37(n_dot_l):     36(ptr) Variable Input
-     40(n_dot_h):     36(ptr) Variable Input
-           43(m):     36(ptr) Variable Input
+              24:             TypeBool
+              32:             TypePointer Input 6(float)
+     33(n_dot_l):     32(ptr) Variable Input
+     36(n_dot_h):     32(ptr) Variable Input
+           39(m):     32(ptr) Variable Input
 4(PixelShaderFunction):           2 Function None 3
                5:             Label
-     35(n_dot_l):      7(ptr) Variable Function
-     39(n_dot_h):      7(ptr) Variable Function
-           42(m):      7(ptr) Variable Function
+     31(n_dot_l):      7(ptr) Variable Function
+     35(n_dot_h):      7(ptr) Variable Function
+           38(m):      7(ptr) Variable Function
+       41(param):      7(ptr) Variable Function
+       43(param):      7(ptr) Variable Function
        45(param):      7(ptr) Variable Function
-       47(param):      7(ptr) Variable Function
-       49(param):      7(ptr) Variable Function
-              38:    6(float) Load 37(n_dot_l)
-                              Store 35(n_dot_l) 38
-              41:    6(float) Load 40(n_dot_h)
-                              Store 39(n_dot_h) 41
-              44:    6(float) Load 43(m)
-                              Store 42(m) 44
-              46:    6(float) Load 35(n_dot_l)
+              34:    6(float) Load 33(n_dot_l)
+                              Store 31(n_dot_l) 34
+              37:    6(float) Load 36(n_dot_h)
+                              Store 35(n_dot_h) 37
+              40:    6(float) Load 39(m)
+                              Store 38(m) 40
+              42:    6(float) Load 31(n_dot_l)
+                              Store 41(param) 42
+              44:    6(float) Load 35(n_dot_h)
+                              Store 43(param) 44
+              46:    6(float) Load 38(m)
                               Store 45(param) 46
-              48:    6(float) Load 39(n_dot_h)
-                              Store 47(param) 48
-              50:    6(float) Load 42(m)
-                              Store 49(param) 50
-              51:           2 FunctionCall 12(@PixelShaderFunction(f1;f1;f1;) 45(param) 47(param) 49(param)
+              47:           2 FunctionCall 12(@PixelShaderFunction(f1;f1;f1;) 41(param) 43(param) 45(param)
                               Return
                               FunctionEnd
 12(@PixelShaderFunction(f1;f1;f1;):           2 Function None 8
@@ -188,27 +188,17 @@
            11(m):      7(ptr) FunctionParameter
               13:             Label
           16(r0):     15(ptr) Variable Function
-              21:      7(ptr) Variable Function
               18:    6(float) Load 9(n_dot_l)
               20:    6(float) ExtInst 1(GLSL.std.450) 40(FMax) 18 19
-              22:    6(float) Load 9(n_dot_l)
-              23:    6(float) Load 10(n_dot_h)
-              24:    6(float) ExtInst 1(GLSL.std.450) 37(FMin) 22 23
-              26:    25(bool) FOrdLessThan 24 19
-                              SelectionMerge 28 None
-                              BranchConditional 26 27 29
-              27:               Label
-                                Store 21 19
-                                Branch 28
-              29:               Label
-              30:    6(float)   Load 10(n_dot_h)
-              31:    6(float)   Load 11(m)
-              32:    6(float)   FMul 30 31
-                                Store 21 32
-                                Branch 28
-              28:             Label
-              33:    6(float) Load 21
-              34:   14(fvec4) CompositeConstruct 17 20 33 17
-                              Store 16(r0) 34
+              21:    6(float) Load 9(n_dot_l)
+              22:    6(float) Load 10(n_dot_h)
+              23:    6(float) ExtInst 1(GLSL.std.450) 37(FMin) 21 22
+              25:    24(bool) FOrdLessThan 23 19
+              26:    6(float) Load 10(n_dot_h)
+              27:    6(float) Load 11(m)
+              28:    6(float) FMul 26 27
+              29:    6(float) Select 25 19 28
+              30:   14(fvec4) CompositeConstruct 17 20 29 17
+                              Store 16(r0) 30
                               Return
                               FunctionEnd
diff --git a/Test/baseResults/hlsl.intrinsics.negative.comp.out b/Test/baseResults/hlsl.intrinsics.negative.comp.out
index 176cf23..97d6719 100644
--- a/Test/baseResults/hlsl.intrinsics.negative.comp.out
+++ b/Test/baseResults/hlsl.intrinsics.negative.comp.out
@@ -180,7 +180,7 @@
 0:?     'inI0' (layout( location=3) in 4-component vector of int)
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 99
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.intrinsics.negative.frag.out b/Test/baseResults/hlsl.intrinsics.negative.frag.out
index 591ad13..980cc96 100644
--- a/Test/baseResults/hlsl.intrinsics.negative.frag.out
+++ b/Test/baseResults/hlsl.intrinsics.negative.frag.out
@@ -1,10 +1,10 @@
 hlsl.intrinsics.negative.frag
-ERROR: 0:10: 'determinant' : no matching overloaded function found 
+ERROR: 0:10: 'determinant' : ambiguous best function under implicit type conversion 
 ERROR: 0:25: 'normalize' : ambiguous best function under implicit type conversion 
 ERROR: 0:26: 'reflect' : ambiguous best function under implicit type conversion 
 ERROR: 0:27: 'refract' : ambiguous best function under implicit type conversion 
 ERROR: 0:28: 'refract' : no matching overloaded function found 
-ERROR: 0:30: 'transpose' : no matching overloaded function found 
+ERROR: 0:30: 'transpose' : ambiguous best function under implicit type conversion 
 ERROR: 0:39: 'GetRenderTargetSamplePosition' : no matching overloaded function found 
 ERROR: 0:46: 'asdouble' : double2 conversion not implemented 
 ERROR: 0:47: 'CheckAccessFullyMapped' : no matching overloaded function found 
@@ -104,8 +104,9 @@
 0:9                0 (const int)
 0:9              Constant:
 0:9                3 (const int)
-0:10      Constant:
-0:10        0.000000
+0:10      determinant ( temp float)
+ERROR: node is still EOpNull!
+0:10          'inF0' ( in float)
 0:12      direct index ( temp float)
 0:12        unpackHalf2x16 ( temp 2-component vector of float)
 0:12          Convert float to uint ( temp uint)
@@ -150,8 +151,9 @@
 0:29      bitFieldReverse ( temp uint)
 0:29        Convert float to uint ( temp uint)
 0:29          'inF0' ( in float)
-0:30      Constant:
-0:30        0.000000
+0:30      transpose ( temp 1X1 matrix of float)
+ERROR: node is still EOpNull!
+0:30          'inF0' ( in float)
 0:32      Branch: Return with expression
 0:32        Constant:
 0:32          0.000000
@@ -372,7 +374,7 @@
 0:?         'inF2' (layout( location=2) in 4-component vector of float)
 0:80      move second child to first child ( temp 4-component vector of int)
 0:?         'inI0' ( temp 4-component vector of int)
-0:?         'inI0' (layout( location=3) in 4-component vector of int)
+0:?         'inI0' (layout( location=3) flat in 4-component vector of int)
 0:80      move second child to first child ( temp 4-component vector of float)
 0:?         '@entryPointOutput' (layout( location=0) out 4-component vector of float)
 0:80        Function Call: @PixelShaderFunction(vf4;vf4;vf4;vi4; ( temp 4-component vector of float)
@@ -516,7 +518,7 @@
 0:?     'inF0' (layout( location=0) in 4-component vector of float)
 0:?     'inF1' (layout( location=1) in 4-component vector of float)
 0:?     'inF2' (layout( location=2) in 4-component vector of float)
-0:?     'inI0' (layout( location=3) in 4-component vector of int)
+0:?     'inI0' (layout( location=3) flat in 4-component vector of int)
 
 
 Linked fragment stage:
@@ -565,8 +567,9 @@
 0:9                0 (const int)
 0:9              Constant:
 0:9                3 (const int)
-0:10      Constant:
-0:10        0.000000
+0:10      determinant ( temp float)
+ERROR: node is still EOpNull!
+0:10          'inF0' ( in float)
 0:12      direct index ( temp float)
 0:12        unpackHalf2x16 ( temp 2-component vector of float)
 0:12          Convert float to uint ( temp uint)
@@ -611,8 +614,9 @@
 0:29      bitFieldReverse ( temp uint)
 0:29        Convert float to uint ( temp uint)
 0:29          'inF0' ( in float)
-0:30      Constant:
-0:30        0.000000
+0:30      transpose ( temp 1X1 matrix of float)
+ERROR: node is still EOpNull!
+0:30          'inF0' ( in float)
 0:32      Branch: Return with expression
 0:32        Constant:
 0:32          0.000000
@@ -833,7 +837,7 @@
 0:?         'inF2' (layout( location=2) in 4-component vector of float)
 0:80      move second child to first child ( temp 4-component vector of int)
 0:?         'inI0' ( temp 4-component vector of int)
-0:?         'inI0' (layout( location=3) in 4-component vector of int)
+0:?         'inI0' (layout( location=3) flat in 4-component vector of int)
 0:80      move second child to first child ( temp 4-component vector of float)
 0:?         '@entryPointOutput' (layout( location=0) out 4-component vector of float)
 0:80        Function Call: @PixelShaderFunction(vf4;vf4;vf4;vi4; ( temp 4-component vector of float)
@@ -977,6 +981,6 @@
 0:?     'inF0' (layout( location=0) in 4-component vector of float)
 0:?     'inF1' (layout( location=1) in 4-component vector of float)
 0:?     'inF2' (layout( location=2) in 4-component vector of float)
-0:?     'inI0' (layout( location=3) in 4-component vector of int)
+0:?     'inI0' (layout( location=3) flat in 4-component vector of int)
 
 SPIR-V is not generated for failed compile or link
diff --git a/Test/baseResults/hlsl.intrinsics.negative.vert.out b/Test/baseResults/hlsl.intrinsics.negative.vert.out
index aabcda8..c2711c6 100644
--- a/Test/baseResults/hlsl.intrinsics.negative.vert.out
+++ b/Test/baseResults/hlsl.intrinsics.negative.vert.out
@@ -308,7 +308,7 @@
 0:?     'inI0' (layout( location=3) in 4-component vector of int)
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 155
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.intrinsics.promote.down.frag.out b/Test/baseResults/hlsl.intrinsics.promote.down.frag.out
index d67b2e8..a561dfe 100644
--- a/Test/baseResults/hlsl.intrinsics.promote.down.frag.out
+++ b/Test/baseResults/hlsl.intrinsics.promote.down.frag.out
@@ -40,14 +40,14 @@
 0:?     Sequence
 0:15      Sequence
 0:15        move second child to first child ( temp 4-component vector of float)
-0:?           'color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.color' (layout( location=0) out 4-component vector of float)
 0:15          color: direct index for structure ( temp 4-component vector of float)
 0:15            Function Call: @main( ( temp structure{ temp 4-component vector of float color})
 0:15            Constant:
 0:15              0 (const int)
 0:?   Linker Objects
 0:?     'anon@0' (layout( row_major std140) uniform block{ uniform int i,  uniform uint u,  uniform float f,  uniform bool b,  uniform 2-component vector of int i2,  uniform 2-component vector of uint u2,  uniform 2-component vector of float f2,  uniform 2-component vector of bool b2})
-0:?     'color' (layout( location=0) out 4-component vector of float)
+0:?     '@entryPointOutput.color' (layout( location=0) out 4-component vector of float)
 
 
 Linked fragment stage:
@@ -94,17 +94,17 @@
 0:?     Sequence
 0:15      Sequence
 0:15        move second child to first child ( temp 4-component vector of float)
-0:?           'color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.color' (layout( location=0) out 4-component vector of float)
 0:15          color: direct index for structure ( temp 4-component vector of float)
 0:15            Function Call: @main( ( temp structure{ temp 4-component vector of float color})
 0:15            Constant:
 0:15              0 (const int)
 0:?   Linker Objects
 0:?     'anon@0' (layout( row_major std140) uniform block{ uniform int i,  uniform uint u,  uniform float f,  uniform bool b,  uniform 2-component vector of int i2,  uniform 2-component vector of uint u2,  uniform 2-component vector of float f2,  uniform 2-component vector of bool b2})
-0:?     'color' (layout( location=0) out 4-component vector of float)
+0:?     '@entryPointOutput.color' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 50
 
                               Capability Shader
@@ -130,7 +130,7 @@
                               Name 21  ""
                               Name 29  "r01"
                               Name 37  "ps_output"
-                              Name 47  "color"
+                              Name 47  "@entryPointOutput.color"
                               MemberDecorate 19($Global) 0 Offset 0
                               MemberDecorate 19($Global) 1 Offset 4
                               MemberDecorate 19($Global) 2 Offset 8
@@ -141,7 +141,7 @@
                               MemberDecorate 19($Global) 7 Offset 40
                               Decorate 19($Global) Block
                               Decorate 21 DescriptorSet 0
-                              Decorate 47(color) Location 0
+                              Decorate 47(@entryPointOutput.color) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -168,12 +168,12 @@
               40:    7(fvec4) ConstantComposite 39 39 39 39
               41:             TypePointer Function 7(fvec4)
               46:             TypePointer Output 7(fvec4)
-       47(color):     46(ptr) Variable Output
+47(@entryPointOutput.color):     46(ptr) Variable Output
          4(main):           2 Function None 3
                5:             Label
               48:8(PS_OUTPUT) FunctionCall 10(@main()
               49:    7(fvec4) CompositeExtract 48 0
-                              Store 47(color) 49
+                              Store 47(@entryPointOutput.color) 49
                               Return
                               FunctionEnd
       10(@main():8(PS_OUTPUT) Function None 9
diff --git a/Test/baseResults/hlsl.intrinsics.promote.frag.out b/Test/baseResults/hlsl.intrinsics.promote.frag.out
index b62d30d..b064295 100644
--- a/Test/baseResults/hlsl.intrinsics.promote.frag.out
+++ b/Test/baseResults/hlsl.intrinsics.promote.frag.out
@@ -430,7 +430,7 @@
 0:?     Sequence
 0:20      Sequence
 0:20        move second child to first child ( temp 4-component vector of float)
-0:?           'color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.color' (layout( location=0) out 4-component vector of float)
 0:20          color: direct index for structure ( temp 4-component vector of float)
 0:20            Function Call: @main( ( temp structure{ temp 4-component vector of float color})
 0:20            Constant:
@@ -439,7 +439,7 @@
 0:?     'anon@0' (layout( row_major std140) uniform block{ uniform int i,  uniform uint u,  uniform float f,  uniform bool b,  uniform 2-component vector of int i2,  uniform 2-component vector of uint u2,  uniform 2-component vector of float f2,  uniform 2-component vector of bool b2,  uniform uint upos,  uniform float fpos})
 0:?     'g_tTexbfs' (layout( r32f) uniform textureBuffer)
 0:?     'g_tTex1df4' ( uniform texture1D)
-0:?     'color' (layout( location=0) out 4-component vector of float)
+0:?     '@entryPointOutput.color' (layout( location=0) out 4-component vector of float)
 
 
 Linked fragment stage:
@@ -876,7 +876,7 @@
 0:?     Sequence
 0:20      Sequence
 0:20        move second child to first child ( temp 4-component vector of float)
-0:?           'color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.color' (layout( location=0) out 4-component vector of float)
 0:20          color: direct index for structure ( temp 4-component vector of float)
 0:20            Function Call: @main( ( temp structure{ temp 4-component vector of float color})
 0:20            Constant:
@@ -885,10 +885,10 @@
 0:?     'anon@0' (layout( row_major std140) uniform block{ uniform int i,  uniform uint u,  uniform float f,  uniform bool b,  uniform 2-component vector of int i2,  uniform 2-component vector of uint u2,  uniform 2-component vector of float f2,  uniform 2-component vector of bool b2,  uniform uint upos,  uniform float fpos})
 0:?     'g_tTexbfs' (layout( r32f) uniform textureBuffer)
 0:?     'g_tTex1df4' ( uniform texture1D)
-0:?     'color' (layout( location=0) out 4-component vector of float)
+0:?     '@entryPointOutput.color' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 322
 
                               Capability Shader
@@ -951,7 +951,7 @@
                               Name 297  "NumberOfLevelsI"
                               Name 301  "sizeQueryTemp"
                               Name 310  "ps_output"
-                              Name 319  "color"
+                              Name 319  "@entryPointOutput.color"
                               MemberDecorate 19($Global) 0 Offset 0
                               MemberDecorate 19($Global) 1 Offset 4
                               MemberDecorate 19($Global) 2 Offset 8
@@ -966,7 +966,7 @@
                               Decorate 21 DescriptorSet 0
                               Decorate 258(g_tTexbfs) DescriptorSet 0
                               Decorate 277(g_tTex1df4) DescriptorSet 0
-                              Decorate 319(color) Location 0
+                              Decorate 319(@entryPointOutput.color) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -1025,12 +1025,12 @@
              309:             TypePointer Function 8(PS_OUTPUT)
              313:             TypePointer Function 7(fvec4)
              318:             TypePointer Output 7(fvec4)
-      319(color):    318(ptr) Variable Output
+319(@entryPointOutput.color):    318(ptr) Variable Output
          4(main):           2 Function None 3
                5:             Label
              320:8(PS_OUTPUT) FunctionCall 10(@main()
              321:    7(fvec4) CompositeExtract 320 0
-                              Store 319(color) 321
+                              Store 319(@entryPointOutput.color) 321
                               Return
                               FunctionEnd
       10(@main():8(PS_OUTPUT) Function None 9
diff --git a/Test/baseResults/hlsl.intrinsics.promote.outputs.frag.out b/Test/baseResults/hlsl.intrinsics.promote.outputs.frag.out
index 87b425f..57dfafc 100644
--- a/Test/baseResults/hlsl.intrinsics.promote.outputs.frag.out
+++ b/Test/baseResults/hlsl.intrinsics.promote.outputs.frag.out
@@ -88,7 +88,7 @@
 0:?     Sequence
 0:20      Sequence
 0:20        move second child to first child ( temp 4-component vector of float)
-0:?           'color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.color' (layout( location=0) out 4-component vector of float)
 0:20          color: direct index for structure ( temp 4-component vector of float)
 0:20            Function Call: @main( ( temp structure{ temp 4-component vector of float color})
 0:20            Constant:
@@ -97,7 +97,7 @@
 0:?     'anon@0' (layout( row_major std140) uniform block{ uniform int i,  uniform uint u,  uniform float f,  uniform bool b,  uniform 2-component vector of int i2,  uniform 2-component vector of uint u2,  uniform 2-component vector of float f2,  uniform 2-component vector of bool b2,  uniform uint upos,  uniform float fpos})
 0:?     'g_tTexbfs' (layout( r32f) uniform textureBuffer)
 0:?     'g_tTex1df4' ( uniform texture1D)
-0:?     'color' (layout( location=0) out 4-component vector of float)
+0:?     '@entryPointOutput.color' (layout( location=0) out 4-component vector of float)
 
 
 Linked fragment stage:
@@ -192,7 +192,7 @@
 0:?     Sequence
 0:20      Sequence
 0:20        move second child to first child ( temp 4-component vector of float)
-0:?           'color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.color' (layout( location=0) out 4-component vector of float)
 0:20          color: direct index for structure ( temp 4-component vector of float)
 0:20            Function Call: @main( ( temp structure{ temp 4-component vector of float color})
 0:20            Constant:
@@ -201,10 +201,10 @@
 0:?     'anon@0' (layout( row_major std140) uniform block{ uniform int i,  uniform uint u,  uniform float f,  uniform bool b,  uniform 2-component vector of int i2,  uniform 2-component vector of uint u2,  uniform 2-component vector of float f2,  uniform 2-component vector of bool b2,  uniform uint upos,  uniform float fpos})
 0:?     'g_tTexbfs' (layout( r32f) uniform textureBuffer)
 0:?     'g_tTex1df4' ( uniform texture1D)
-0:?     'color' (layout( location=0) out 4-component vector of float)
+0:?     '@entryPointOutput.color' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 80
 
                               Capability Shader
@@ -242,7 +242,7 @@
                               Name 53  "NumberOfLevelsI"
                               Name 57  "sizeQueryTemp"
                               Name 66  "ps_output"
-                              Name 74  "color"
+                              Name 74  "@entryPointOutput.color"
                               Name 79  "g_tTexbfs"
                               MemberDecorate 17($Global) 0 Offset 0
                               MemberDecorate 17($Global) 1 Offset 4
@@ -257,7 +257,7 @@
                               Decorate 17($Global) Block
                               Decorate 19 DescriptorSet 0
                               Decorate 31(g_tTex1df4) DescriptorSet 0
-                              Decorate 74(color) Location 0
+                              Decorate 74(@entryPointOutput.color) Location 0
                               Decorate 79(g_tTexbfs) DescriptorSet 0
                2:             TypeVoid
                3:             TypeFunction 2
@@ -288,7 +288,7 @@
               67:    7(fvec4) ConstantComposite 24 24 24 24
               68:             TypePointer Function 7(fvec4)
               73:             TypePointer Output 7(fvec4)
-       74(color):     73(ptr) Variable Output
+74(@entryPointOutput.color):     73(ptr) Variable Output
               77:             TypeImage 6(float) Buffer sampled format:R32f
               78:             TypePointer UniformConstant 77
    79(g_tTexbfs):     78(ptr) Variable UniformConstant
@@ -296,7 +296,7 @@
                5:             Label
               75:8(PS_OUTPUT) FunctionCall 10(@main()
               76:    7(fvec4) CompositeExtract 75 0
-                              Store 74(color) 76
+                              Store 74(@entryPointOutput.color) 76
                               Return
                               FunctionEnd
       10(@main():8(PS_OUTPUT) Function None 9
diff --git a/Test/baseResults/hlsl.intrinsics.vert.out b/Test/baseResults/hlsl.intrinsics.vert.out
index 82bb18e..195e11d 100644
--- a/Test/baseResults/hlsl.intrinsics.vert.out
+++ b/Test/baseResults/hlsl.intrinsics.vert.out
@@ -10,13 +10,15 @@
 0:2      'inU1' ( in uint)
 0:?     Sequence
 0:3      all ( temp bool)
-0:3        'inF0' ( in float)
+0:3        Convert float to bool ( temp bool)
+0:3          'inF0' ( in float)
 0:4      Absolute value ( temp float)
 0:4        'inF0' ( in float)
 0:5      arc cosine ( temp float)
 0:5        'inF0' ( in float)
 0:6      any ( temp bool)
-0:6        'inF0' ( in float)
+0:6        Convert float to bool ( temp bool)
+0:6          'inF0' ( in float)
 0:7      arc sine ( temp float)
 0:7        'inF0' ( in float)
 0:8      floatBitsToInt ( temp int)
@@ -157,13 +159,15 @@
 0:69      'inU1' ( in 2-component vector of uint)
 0:?     Sequence
 0:70      all ( temp bool)
-0:70        'inF0' ( in 2-component vector of float)
+0:70        Convert float to bool ( temp 2-component vector of bool)
+0:70          'inF0' ( in 2-component vector of float)
 0:71      Absolute value ( temp 2-component vector of float)
 0:71        'inF0' ( in 2-component vector of float)
 0:72      arc cosine ( temp 2-component vector of float)
 0:72        'inF0' ( in 2-component vector of float)
 0:73      any ( temp bool)
-0:73        'inF0' ( in 2-component vector of float)
+0:73        Convert float to bool ( temp 2-component vector of bool)
+0:73          'inF0' ( in 2-component vector of float)
 0:74      arc sine ( temp 2-component vector of float)
 0:74        'inF0' ( in 2-component vector of float)
 0:75      floatBitsToInt ( temp 2-component vector of int)
@@ -320,13 +324,15 @@
 0:138      'inU1' ( in 3-component vector of uint)
 0:?     Sequence
 0:139      all ( temp bool)
-0:139        'inF0' ( in 3-component vector of float)
+0:139        Convert float to bool ( temp 3-component vector of bool)
+0:139          'inF0' ( in 3-component vector of float)
 0:140      Absolute value ( temp 3-component vector of float)
 0:140        'inF0' ( in 3-component vector of float)
 0:141      arc cosine ( temp 3-component vector of float)
 0:141        'inF0' ( in 3-component vector of float)
 0:142      any ( temp bool)
-0:142        'inF0' ( in 3-component vector of float)
+0:142        Convert float to bool ( temp 3-component vector of bool)
+0:142          'inF0' ( in 3-component vector of float)
 0:143      arc sine ( temp 3-component vector of float)
 0:143        'inF0' ( in 3-component vector of float)
 0:144      floatBitsToInt ( temp 3-component vector of int)
@@ -489,13 +495,15 @@
 0:208      'inU1' ( in 4-component vector of uint)
 0:?     Sequence
 0:209      all ( temp bool)
-0:209        'inF0' ( in 4-component vector of float)
+0:209        Convert float to bool ( temp 4-component vector of bool)
+0:209          'inF0' ( in 4-component vector of float)
 0:210      Absolute value ( temp 4-component vector of float)
 0:210        'inF0' ( in 4-component vector of float)
 0:211      arc cosine ( temp 4-component vector of float)
 0:211        'inF0' ( in 4-component vector of float)
 0:212      any ( temp bool)
-0:212        'inF0' ( in 4-component vector of float)
+0:212        Convert float to bool ( temp 4-component vector of bool)
+0:212          'inF0' ( in 4-component vector of float)
 0:213      arc sine ( temp 4-component vector of float)
 0:213        'inF0' ( in 4-component vector of float)
 0:214      floatBitsToInt ( temp 4-component vector of int)
@@ -676,13 +684,15 @@
 0:331      'inF2' ( in 2X2 matrix of float)
 0:?     Sequence
 0:333      all ( temp bool)
-0:333        'inF0' ( in 2X2 matrix of float)
+0:333        Convert float to bool ( temp 2X2 matrix of bool)
+0:333          'inF0' ( in 2X2 matrix of float)
 0:333      Absolute value ( temp 2X2 matrix of float)
 0:333        'inF0' ( in 2X2 matrix of float)
 0:333      arc cosine ( temp 2X2 matrix of float)
 0:333        'inF0' ( in 2X2 matrix of float)
 0:333      any ( temp bool)
-0:333        'inF0' ( in 2X2 matrix of float)
+0:333        Convert float to bool ( temp 2X2 matrix of bool)
+0:333          'inF0' ( in 2X2 matrix of float)
 0:333      arc sine ( temp 2X2 matrix of float)
 0:333        'inF0' ( in 2X2 matrix of float)
 0:333      arc tangent ( temp 2X2 matrix of float)
@@ -803,13 +813,15 @@
 0:340      'inF2' ( in 3X3 matrix of float)
 0:?     Sequence
 0:342      all ( temp bool)
-0:342        'inF0' ( in 3X3 matrix of float)
+0:342        Convert float to bool ( temp 3X3 matrix of bool)
+0:342          'inF0' ( in 3X3 matrix of float)
 0:342      Absolute value ( temp 3X3 matrix of float)
 0:342        'inF0' ( in 3X3 matrix of float)
 0:342      arc cosine ( temp 3X3 matrix of float)
 0:342        'inF0' ( in 3X3 matrix of float)
 0:342      any ( temp bool)
-0:342        'inF0' ( in 3X3 matrix of float)
+0:342        Convert float to bool ( temp 3X3 matrix of bool)
+0:342          'inF0' ( in 3X3 matrix of float)
 0:342      arc sine ( temp 3X3 matrix of float)
 0:342        'inF0' ( in 3X3 matrix of float)
 0:342      arc tangent ( temp 3X3 matrix of float)
@@ -935,13 +947,15 @@
 0:349      'inF2' ( in 4X4 matrix of float)
 0:?     Sequence
 0:351      all ( temp bool)
-0:351        'inF0' ( in 4X4 matrix of float)
+0:351        Convert float to bool ( temp 4X4 matrix of bool)
+0:351          'inF0' ( in 4X4 matrix of float)
 0:351      Absolute value ( temp 4X4 matrix of float)
 0:351        'inF0' ( in 4X4 matrix of float)
 0:351      arc cosine ( temp 4X4 matrix of float)
 0:351        'inF0' ( in 4X4 matrix of float)
 0:351      any ( temp bool)
-0:351        'inF0' ( in 4X4 matrix of float)
+0:351        Convert float to bool ( temp 4X4 matrix of bool)
+0:351          'inF0' ( in 4X4 matrix of float)
 0:351      arc sine ( temp 4X4 matrix of float)
 0:351        'inF0' ( in 4X4 matrix of float)
 0:351      arc tangent ( temp 4X4 matrix of float)
@@ -1388,13 +1402,15 @@
 0:2      'inU1' ( in uint)
 0:?     Sequence
 0:3      all ( temp bool)
-0:3        'inF0' ( in float)
+0:3        Convert float to bool ( temp bool)
+0:3          'inF0' ( in float)
 0:4      Absolute value ( temp float)
 0:4        'inF0' ( in float)
 0:5      arc cosine ( temp float)
 0:5        'inF0' ( in float)
 0:6      any ( temp bool)
-0:6        'inF0' ( in float)
+0:6        Convert float to bool ( temp bool)
+0:6          'inF0' ( in float)
 0:7      arc sine ( temp float)
 0:7        'inF0' ( in float)
 0:8      floatBitsToInt ( temp int)
@@ -1535,13 +1551,15 @@
 0:69      'inU1' ( in 2-component vector of uint)
 0:?     Sequence
 0:70      all ( temp bool)
-0:70        'inF0' ( in 2-component vector of float)
+0:70        Convert float to bool ( temp 2-component vector of bool)
+0:70          'inF0' ( in 2-component vector of float)
 0:71      Absolute value ( temp 2-component vector of float)
 0:71        'inF0' ( in 2-component vector of float)
 0:72      arc cosine ( temp 2-component vector of float)
 0:72        'inF0' ( in 2-component vector of float)
 0:73      any ( temp bool)
-0:73        'inF0' ( in 2-component vector of float)
+0:73        Convert float to bool ( temp 2-component vector of bool)
+0:73          'inF0' ( in 2-component vector of float)
 0:74      arc sine ( temp 2-component vector of float)
 0:74        'inF0' ( in 2-component vector of float)
 0:75      floatBitsToInt ( temp 2-component vector of int)
@@ -1698,13 +1716,15 @@
 0:138      'inU1' ( in 3-component vector of uint)
 0:?     Sequence
 0:139      all ( temp bool)
-0:139        'inF0' ( in 3-component vector of float)
+0:139        Convert float to bool ( temp 3-component vector of bool)
+0:139          'inF0' ( in 3-component vector of float)
 0:140      Absolute value ( temp 3-component vector of float)
 0:140        'inF0' ( in 3-component vector of float)
 0:141      arc cosine ( temp 3-component vector of float)
 0:141        'inF0' ( in 3-component vector of float)
 0:142      any ( temp bool)
-0:142        'inF0' ( in 3-component vector of float)
+0:142        Convert float to bool ( temp 3-component vector of bool)
+0:142          'inF0' ( in 3-component vector of float)
 0:143      arc sine ( temp 3-component vector of float)
 0:143        'inF0' ( in 3-component vector of float)
 0:144      floatBitsToInt ( temp 3-component vector of int)
@@ -1867,13 +1887,15 @@
 0:208      'inU1' ( in 4-component vector of uint)
 0:?     Sequence
 0:209      all ( temp bool)
-0:209        'inF0' ( in 4-component vector of float)
+0:209        Convert float to bool ( temp 4-component vector of bool)
+0:209          'inF0' ( in 4-component vector of float)
 0:210      Absolute value ( temp 4-component vector of float)
 0:210        'inF0' ( in 4-component vector of float)
 0:211      arc cosine ( temp 4-component vector of float)
 0:211        'inF0' ( in 4-component vector of float)
 0:212      any ( temp bool)
-0:212        'inF0' ( in 4-component vector of float)
+0:212        Convert float to bool ( temp 4-component vector of bool)
+0:212          'inF0' ( in 4-component vector of float)
 0:213      arc sine ( temp 4-component vector of float)
 0:213        'inF0' ( in 4-component vector of float)
 0:214      floatBitsToInt ( temp 4-component vector of int)
@@ -2054,13 +2076,15 @@
 0:331      'inF2' ( in 2X2 matrix of float)
 0:?     Sequence
 0:333      all ( temp bool)
-0:333        'inF0' ( in 2X2 matrix of float)
+0:333        Convert float to bool ( temp 2X2 matrix of bool)
+0:333          'inF0' ( in 2X2 matrix of float)
 0:333      Absolute value ( temp 2X2 matrix of float)
 0:333        'inF0' ( in 2X2 matrix of float)
 0:333      arc cosine ( temp 2X2 matrix of float)
 0:333        'inF0' ( in 2X2 matrix of float)
 0:333      any ( temp bool)
-0:333        'inF0' ( in 2X2 matrix of float)
+0:333        Convert float to bool ( temp 2X2 matrix of bool)
+0:333          'inF0' ( in 2X2 matrix of float)
 0:333      arc sine ( temp 2X2 matrix of float)
 0:333        'inF0' ( in 2X2 matrix of float)
 0:333      arc tangent ( temp 2X2 matrix of float)
@@ -2181,13 +2205,15 @@
 0:340      'inF2' ( in 3X3 matrix of float)
 0:?     Sequence
 0:342      all ( temp bool)
-0:342        'inF0' ( in 3X3 matrix of float)
+0:342        Convert float to bool ( temp 3X3 matrix of bool)
+0:342          'inF0' ( in 3X3 matrix of float)
 0:342      Absolute value ( temp 3X3 matrix of float)
 0:342        'inF0' ( in 3X3 matrix of float)
 0:342      arc cosine ( temp 3X3 matrix of float)
 0:342        'inF0' ( in 3X3 matrix of float)
 0:342      any ( temp bool)
-0:342        'inF0' ( in 3X3 matrix of float)
+0:342        Convert float to bool ( temp 3X3 matrix of bool)
+0:342          'inF0' ( in 3X3 matrix of float)
 0:342      arc sine ( temp 3X3 matrix of float)
 0:342        'inF0' ( in 3X3 matrix of float)
 0:342      arc tangent ( temp 3X3 matrix of float)
@@ -2313,13 +2339,15 @@
 0:349      'inF2' ( in 4X4 matrix of float)
 0:?     Sequence
 0:351      all ( temp bool)
-0:351        'inF0' ( in 4X4 matrix of float)
+0:351        Convert float to bool ( temp 4X4 matrix of bool)
+0:351          'inF0' ( in 4X4 matrix of float)
 0:351      Absolute value ( temp 4X4 matrix of float)
 0:351        'inF0' ( in 4X4 matrix of float)
 0:351      arc cosine ( temp 4X4 matrix of float)
 0:351        'inF0' ( in 4X4 matrix of float)
 0:351      any ( temp bool)
-0:351        'inF0' ( in 4X4 matrix of float)
+0:351        Convert float to bool ( temp 4X4 matrix of bool)
+0:351          'inF0' ( in 4X4 matrix of float)
 0:351      arc sine ( temp 4X4 matrix of float)
 0:351        'inF0' ( in 4X4 matrix of float)
 0:351      arc tangent ( temp 4X4 matrix of float)
@@ -2750,9 +2778,13 @@
 0:413            'inFM3x2' ( in 3X2 matrix of float)
 0:?   Linker Objects
 
+error: SPIRV-Tools Validation Errors
+error: Matrix types can only be parameterized with floating-point types.
+  %mat2v2bool = OpTypeMatrix %v2bool 2
+
 // Module Version 10000
-// Generated by (magic number): 80001
-// Id's are bound by 1205
+// Generated by (magic number): 80007
+// Id's are bound by 1225
 
                               Capability Shader
                1:             ExtInstImport  "GLSL.std.450"
@@ -2831,50 +2863,50 @@
                               Name 126  "inFM3x3"
                               Name 127  "inFM3x4"
                               Name 128  "inFM2x4"
-                              Name 1029  "r0"
-                              Name 1033  "r1"
-                              Name 1037  "r2"
-                              Name 1041  "r3"
-                              Name 1045  "r4"
-                              Name 1049  "r5"
-                              Name 1053  "r6"
-                              Name 1057  "r7"
-                              Name 1061  "r8"
-                              Name 1065  "r0"
-                              Name 1069  "r1"
-                              Name 1073  "r2"
-                              Name 1077  "r3"
-                              Name 1081  "r4"
-                              Name 1085  "r5"
-                              Name 1089  "r6"
-                              Name 1093  "r7"
-                              Name 1097  "r8"
-                              Name 1101  "r0"
-                              Name 1105  "r1"
-                              Name 1109  "r2"
-                              Name 1113  "r3"
-                              Name 1117  "r4"
-                              Name 1121  "r5"
-                              Name 1125  "r6"
-                              Name 1129  "r7"
-                              Name 1133  "r8"
-                              Name 1137  "r00"
-                              Name 1141  "r01"
-                              Name 1145  "r02"
-                              Name 1149  "r03"
-                              Name 1153  "r04"
-                              Name 1157  "r05"
-                              Name 1161  "r06"
-                              Name 1165  "r07"
-                              Name 1169  "r08"
-                              Name 1173  "r09"
-                              Name 1177  "r10"
-                              Name 1181  "r11"
-                              Name 1185  "r12"
-                              Name 1189  "r13"
-                              Name 1193  "r14"
-                              Name 1197  "r15"
-                              Name 1201  "r16"
+                              Name 1049  "r0"
+                              Name 1053  "r1"
+                              Name 1057  "r2"
+                              Name 1061  "r3"
+                              Name 1065  "r4"
+                              Name 1069  "r5"
+                              Name 1073  "r6"
+                              Name 1077  "r7"
+                              Name 1081  "r8"
+                              Name 1085  "r0"
+                              Name 1089  "r1"
+                              Name 1093  "r2"
+                              Name 1097  "r3"
+                              Name 1101  "r4"
+                              Name 1105  "r5"
+                              Name 1109  "r6"
+                              Name 1113  "r7"
+                              Name 1117  "r8"
+                              Name 1121  "r0"
+                              Name 1125  "r1"
+                              Name 1129  "r2"
+                              Name 1133  "r3"
+                              Name 1137  "r4"
+                              Name 1141  "r5"
+                              Name 1145  "r6"
+                              Name 1149  "r7"
+                              Name 1153  "r8"
+                              Name 1157  "r00"
+                              Name 1161  "r01"
+                              Name 1165  "r02"
+                              Name 1169  "r03"
+                              Name 1173  "r04"
+                              Name 1177  "r05"
+                              Name 1181  "r06"
+                              Name 1185  "r07"
+                              Name 1189  "r08"
+                              Name 1193  "r09"
+                              Name 1197  "r10"
+                              Name 1201  "r11"
+                              Name 1205  "r12"
+                              Name 1209  "r13"
+                              Name 1213  "r14"
+                              Name 1217  "r15"
+                              Name 1221  "r16"
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -2920,43 +2952,49 @@
              118:             TypePointer Function 117
              119:             TypeFunction 2 7(ptr) 7(ptr) 25(ptr) 37(ptr) 112(ptr) 114(ptr) 69(ptr) 116(ptr) 118(ptr)
              132:             TypeBool
-             143:             TypeInt 32 1
-             164:    143(int) Constant 7
-             196:    6(float) Constant 1050288283
-             211:    143(int) Constant 2
-             218:    6(float) Constant 0
-             219:    6(float) Constant 1065353216
-             261:             TypeVector 143(int) 2
-             282:    143(int) Constant 3
-             283:  261(ivec2) ConstantComposite 164 282
-             311:             TypeVector 132(bool) 2
-             349:    6(float) Constant 1073741824
-             351:    143(int) Constant 1
-             352:  261(ivec2) ConstantComposite 351 211
-             387:   24(fvec2) ConstantComposite 219 349
-             401:             TypeVector 143(int) 3
-             422:    143(int) Constant 5
-             423:  401(ivec3) ConstantComposite 164 282 422
-             454:             TypeVector 132(bool) 3
-             493:  401(ivec3) ConstantComposite 351 211 282
-             528:    6(float) Constant 1077936128
-             529:   36(fvec3) ConstantComposite 219 349 528
-             543:             TypeVector 143(int) 4
-             564:  543(ivec4) ConstantComposite 164 282 422 211
-             574:      8(int) Constant 1
-             580:      8(int) Constant 2
-             583:      8(int) Constant 3
-             605:             TypeVector 132(bool) 4
-             644:    143(int) Constant 4
-             645:  543(ivec4) ConstantComposite 351 211 282 644
-             680:    6(float) Constant 1082130432
-             681:   48(fvec4) ConstantComposite 219 349 528 680
-             792:   24(fvec2) ConstantComposite 349 349
-             793:          60 ConstantComposite 792 792
-             907:   36(fvec3) ConstantComposite 528 528 528
-             908:          68 ConstantComposite 907 907 907
-            1025:   48(fvec4) ConstantComposite 680 680 680 680
-            1026:          76 ConstantComposite 1025 1025 1025 1025
+             133:    6(float) Constant 0
+             146:             TypeInt 32 1
+             167:    146(int) Constant 7
+             199:    6(float) Constant 1050288283
+             214:    146(int) Constant 2
+             221:    6(float) Constant 1065353216
+             253:             TypeVector 132(bool) 2
+             254:   24(fvec2) ConstantComposite 133 133
+             267:             TypeVector 146(int) 2
+             288:    146(int) Constant 3
+             289:  267(ivec2) ConstantComposite 167 288
+             354:    6(float) Constant 1073741824
+             356:    146(int) Constant 1
+             357:  267(ivec2) ConstantComposite 356 214
+             392:   24(fvec2) ConstantComposite 221 354
+             396:             TypeVector 132(bool) 3
+             397:   36(fvec3) ConstantComposite 133 133 133
+             410:             TypeVector 146(int) 3
+             431:    146(int) Constant 5
+             432:  410(ivec3) ConstantComposite 167 288 431
+             501:  410(ivec3) ConstantComposite 356 214 288
+             536:    6(float) Constant 1077936128
+             537:   36(fvec3) ConstantComposite 221 354 536
+             541:             TypeVector 132(bool) 4
+             542:   48(fvec4) ConstantComposite 133 133 133 133
+             555:             TypeVector 146(int) 4
+             576:  555(ivec4) ConstantComposite 167 288 431 214
+             586:      8(int) Constant 1
+             592:      8(int) Constant 2
+             595:      8(int) Constant 3
+             655:    146(int) Constant 4
+             656:  555(ivec4) ConstantComposite 356 214 288 655
+             691:    6(float) Constant 1082130432
+             692:   48(fvec4) ConstantComposite 221 354 536 691
+             696:             TypeMatrix 253(bvec2) 2
+             806:   24(fvec2) ConstantComposite 354 354
+             807:          60 ConstantComposite 806 806
+             811:             TypeMatrix 396(bvec3) 3
+             924:   36(fvec3) ConstantComposite 536 536 536
+             925:          68 ConstantComposite 924 924 924
+             929:             TypeMatrix 541(bvec4) 4
+            1045:   48(fvec4) ConstantComposite 691 691 691 691
+            1046:          76 ConstantComposite 1045 1045 1045 1045
 4(VertexShaderFunction):           2 Function None 3
                5:             Label
                               Return
@@ -2969,123 +3007,125 @@
         15(inU1):      9(ptr) FunctionParameter
               17:             Label
              131:    6(float) Load 11(inF0)
-             133:   132(bool) All 131
-             134:    6(float) Load 11(inF0)
-             135:    6(float) ExtInst 1(GLSL.std.450) 4(FAbs) 134
+             134:   132(bool) FOrdNotEqual 131 133
+             135:   132(bool) All 134
              136:    6(float) Load 11(inF0)
-             137:    6(float) ExtInst 1(GLSL.std.450) 17(Acos) 136
+             137:    6(float) ExtInst 1(GLSL.std.450) 4(FAbs) 136
              138:    6(float) Load 11(inF0)
-             139:   132(bool) Any 138
+             139:    6(float) ExtInst 1(GLSL.std.450) 17(Acos) 138
              140:    6(float) Load 11(inF0)
-             141:    6(float) ExtInst 1(GLSL.std.450) 16(Asin) 140
-             142:    6(float) Load 11(inF0)
-             144:    143(int) Bitcast 142
+             141:   132(bool) FOrdNotEqual 140 133
+             142:   132(bool) Any 141
+             143:    6(float) Load 11(inF0)
+             144:    6(float) ExtInst 1(GLSL.std.450) 16(Asin) 143
              145:    6(float) Load 11(inF0)
-             146:      8(int) Bitcast 145
-             147:      8(int) Load 14(inU0)
-             148:    6(float) Bitcast 147
-             149:    6(float) Load 11(inF0)
-             150:    6(float) ExtInst 1(GLSL.std.450) 18(Atan) 149
-             151:    6(float) Load 11(inF0)
-             152:    6(float) Load 12(inF1)
-             153:    6(float) ExtInst 1(GLSL.std.450) 25(Atan2) 151 152
+             147:    146(int) Bitcast 145
+             148:    6(float) Load 11(inF0)
+             149:      8(int) Bitcast 148
+             150:      8(int) Load 14(inU0)
+             151:    6(float) Bitcast 150
+             152:    6(float) Load 11(inF0)
+             153:    6(float) ExtInst 1(GLSL.std.450) 18(Atan) 152
              154:    6(float) Load 11(inF0)
-             155:    6(float) ExtInst 1(GLSL.std.450) 9(Ceil) 154
-             156:    6(float) Load 11(inF0)
-             157:    6(float) Load 12(inF1)
-             158:    6(float) Load 13(inF2)
-             159:    6(float) ExtInst 1(GLSL.std.450) 43(FClamp) 156 157 158
-             160:    6(float) Load 11(inF0)
-             161:    6(float) ExtInst 1(GLSL.std.450) 14(Cos) 160
-             162:    6(float) Load 11(inF0)
-             163:    6(float) ExtInst 1(GLSL.std.450) 20(Cosh) 162
-             165:    143(int) BitCount 164
-             166:    6(float) Load 11(inF0)
-             167:    6(float) ExtInst 1(GLSL.std.450) 12(Degrees) 166
-             168:    6(float) Load 11(inF0)
-             169:    6(float) ExtInst 1(GLSL.std.450) 27(Exp) 168
-             170:    6(float) Load 11(inF0)
-             171:    6(float) ExtInst 1(GLSL.std.450) 29(Exp2) 170
-             172:    143(int) ExtInst 1(GLSL.std.450) 74(FindSMsb) 164
-             173:    143(int) ExtInst 1(GLSL.std.450) 73(FindILsb) 164
-             174:    6(float) Load 11(inF0)
-             175:    6(float) ExtInst 1(GLSL.std.450) 8(Floor) 174
-             176:    6(float) Load 11(inF0)
-             177:    6(float) Load 12(inF1)
-             178:    6(float) FMod 176 177
+             155:    6(float) Load 12(inF1)
+             156:    6(float) ExtInst 1(GLSL.std.450) 25(Atan2) 154 155
+             157:    6(float) Load 11(inF0)
+             158:    6(float) ExtInst 1(GLSL.std.450) 9(Ceil) 157
+             159:    6(float) Load 11(inF0)
+             160:    6(float) Load 12(inF1)
+             161:    6(float) Load 13(inF2)
+             162:    6(float) ExtInst 1(GLSL.std.450) 43(FClamp) 159 160 161
+             163:    6(float) Load 11(inF0)
+             164:    6(float) ExtInst 1(GLSL.std.450) 14(Cos) 163
+             165:    6(float) Load 11(inF0)
+             166:    6(float) ExtInst 1(GLSL.std.450) 20(Cosh) 165
+             168:    146(int) BitCount 167
+             169:    6(float) Load 11(inF0)
+             170:    6(float) ExtInst 1(GLSL.std.450) 12(Degrees) 169
+             171:    6(float) Load 11(inF0)
+             172:    6(float) ExtInst 1(GLSL.std.450) 27(Exp) 171
+             173:    6(float) Load 11(inF0)
+             174:    6(float) ExtInst 1(GLSL.std.450) 29(Exp2) 173
+             175:    146(int) ExtInst 1(GLSL.std.450) 74(FindSMsb) 167
+             176:    146(int) ExtInst 1(GLSL.std.450) 73(FindILsb) 167
+             177:    6(float) Load 11(inF0)
+             178:    6(float) ExtInst 1(GLSL.std.450) 8(Floor) 177
              179:    6(float) Load 11(inF0)
-             180:    6(float) ExtInst 1(GLSL.std.450) 10(Fract) 179
-             181:    6(float) Load 11(inF0)
-             182:   132(bool) IsInf 181
-             183:    6(float) Load 11(inF0)
-             184:   132(bool) IsNan 183
-             185:    6(float) Load 11(inF0)
-             186:    6(float) Load 12(inF1)
-             187:    6(float) ExtInst 1(GLSL.std.450) 53(Ldexp) 185 186
+             180:    6(float) Load 12(inF1)
+             181:    6(float) FMod 179 180
+             182:    6(float) Load 11(inF0)
+             183:    6(float) ExtInst 1(GLSL.std.450) 10(Fract) 182
+             184:    6(float) Load 11(inF0)
+             185:   132(bool) IsInf 184
+             186:    6(float) Load 11(inF0)
+             187:   132(bool) IsNan 186
              188:    6(float) Load 11(inF0)
              189:    6(float) Load 12(inF1)
-             190:    6(float) Load 13(inF2)
-             191:    6(float) ExtInst 1(GLSL.std.450) 46(FMix) 188 189 190
-             192:    6(float) Load 11(inF0)
-             193:    6(float) ExtInst 1(GLSL.std.450) 28(Log) 192
-             194:    6(float) Load 11(inF0)
-             195:    6(float) ExtInst 1(GLSL.std.450) 30(Log2) 194
-             197:    6(float) FMul 195 196
-             198:    6(float) Load 11(inF0)
-             199:    6(float) ExtInst 1(GLSL.std.450) 30(Log2) 198
-             200:    6(float) Load 11(inF0)
-             201:    6(float) Load 12(inF1)
-             202:    6(float) ExtInst 1(GLSL.std.450) 40(FMax) 200 201
+             190:    6(float) ExtInst 1(GLSL.std.450) 53(Ldexp) 188 189
+             191:    6(float) Load 11(inF0)
+             192:    6(float) Load 12(inF1)
+             193:    6(float) Load 13(inF2)
+             194:    6(float) ExtInst 1(GLSL.std.450) 46(FMix) 191 192 193
+             195:    6(float) Load 11(inF0)
+             196:    6(float) ExtInst 1(GLSL.std.450) 28(Log) 195
+             197:    6(float) Load 11(inF0)
+             198:    6(float) ExtInst 1(GLSL.std.450) 30(Log2) 197
+             200:    6(float) FMul 198 199
+             201:    6(float) Load 11(inF0)
+             202:    6(float) ExtInst 1(GLSL.std.450) 30(Log2) 201
              203:    6(float) Load 11(inF0)
              204:    6(float) Load 12(inF1)
-             205:    6(float) ExtInst 1(GLSL.std.450) 37(FMin) 203 204
+             205:    6(float) ExtInst 1(GLSL.std.450) 40(FMax) 203 204
              206:    6(float) Load 11(inF0)
              207:    6(float) Load 12(inF1)
-             208:    6(float) ExtInst 1(GLSL.std.450) 26(Pow) 206 207
+             208:    6(float) ExtInst 1(GLSL.std.450) 37(FMin) 206 207
              209:    6(float) Load 11(inF0)
-             210:    6(float) ExtInst 1(GLSL.std.450) 11(Radians) 209
-             212:    143(int) BitReverse 211
-             213:    6(float) Load 11(inF0)
-             214:    6(float) ExtInst 1(GLSL.std.450) 2(RoundEven) 213
-             215:    6(float) Load 11(inF0)
-             216:    6(float) ExtInst 1(GLSL.std.450) 32(InverseSqrt) 215
-             217:    6(float) Load 11(inF0)
-             220:    6(float) ExtInst 1(GLSL.std.450) 43(FClamp) 217 218 219
-             221:    6(float) Load 11(inF0)
-             222:    6(float) ExtInst 1(GLSL.std.450) 6(FSign) 221
+             210:    6(float) Load 12(inF1)
+             211:    6(float) ExtInst 1(GLSL.std.450) 26(Pow) 209 210
+             212:    6(float) Load 11(inF0)
+             213:    6(float) ExtInst 1(GLSL.std.450) 11(Radians) 212
+             215:    146(int) BitReverse 214
+             216:    6(float) Load 11(inF0)
+             217:    6(float) ExtInst 1(GLSL.std.450) 2(RoundEven) 216
+             218:    6(float) Load 11(inF0)
+             219:    6(float) ExtInst 1(GLSL.std.450) 32(InverseSqrt) 218
+             220:    6(float) Load 11(inF0)
+             222:    6(float) ExtInst 1(GLSL.std.450) 43(FClamp) 220 133 221
              223:    6(float) Load 11(inF0)
-             224:    6(float) ExtInst 1(GLSL.std.450) 13(Sin) 223
+             224:    6(float) ExtInst 1(GLSL.std.450) 6(FSign) 223
              225:    6(float) Load 11(inF0)
              226:    6(float) ExtInst 1(GLSL.std.450) 13(Sin) 225
-                              Store 12(inF1) 226
              227:    6(float) Load 11(inF0)
-             228:    6(float) ExtInst 1(GLSL.std.450) 14(Cos) 227
-                              Store 13(inF2) 228
+             228:    6(float) ExtInst 1(GLSL.std.450) 13(Sin) 227
+                              Store 12(inF1) 228
              229:    6(float) Load 11(inF0)
-             230:    6(float) ExtInst 1(GLSL.std.450) 19(Sinh) 229
+             230:    6(float) ExtInst 1(GLSL.std.450) 14(Cos) 229
+                              Store 13(inF2) 230
              231:    6(float) Load 11(inF0)
-             232:    6(float) Load 12(inF1)
-             233:    6(float) Load 13(inF2)
-             234:    6(float) ExtInst 1(GLSL.std.450) 49(SmoothStep) 231 232 233
-             235:    6(float) Load 11(inF0)
-             236:    6(float) ExtInst 1(GLSL.std.450) 31(Sqrt) 235
+             232:    6(float) ExtInst 1(GLSL.std.450) 19(Sinh) 231
+             233:    6(float) Load 11(inF0)
+             234:    6(float) Load 12(inF1)
+             235:    6(float) Load 13(inF2)
+             236:    6(float) ExtInst 1(GLSL.std.450) 49(SmoothStep) 233 234 235
              237:    6(float) Load 11(inF0)
-             238:    6(float) Load 12(inF1)
-             239:    6(float) ExtInst 1(GLSL.std.450) 48(Step) 237 238
-             240:    6(float) Load 11(inF0)
-             241:    6(float) ExtInst 1(GLSL.std.450) 15(Tan) 240
+             238:    6(float) ExtInst 1(GLSL.std.450) 31(Sqrt) 237
+             239:    6(float) Load 11(inF0)
+             240:    6(float) Load 12(inF1)
+             241:    6(float) ExtInst 1(GLSL.std.450) 48(Step) 239 240
              242:    6(float) Load 11(inF0)
-             243:    6(float) ExtInst 1(GLSL.std.450) 21(Tanh) 242
+             243:    6(float) ExtInst 1(GLSL.std.450) 15(Tan) 242
              244:    6(float) Load 11(inF0)
-             245:    6(float) ExtInst 1(GLSL.std.450) 3(Trunc) 244
-                              ReturnValue 218
+             245:    6(float) ExtInst 1(GLSL.std.450) 21(Tanh) 244
+             246:    6(float) Load 11(inF0)
+             247:    6(float) ExtInst 1(GLSL.std.450) 3(Trunc) 246
+                              ReturnValue 133
                               FunctionEnd
 22(VertexShaderFunction1(vf1;vf1;vf1;):    6(float) Function None 18
         19(inF0):      7(ptr) FunctionParameter
         20(inF1):      7(ptr) FunctionParameter
         21(inF2):      7(ptr) FunctionParameter
               23:             Label
-                              ReturnValue 218
+                              ReturnValue 133
                               FunctionEnd
 34(VertexShaderFunction2(vf2;vf2;vf2;vu2;vu2;):   24(fvec2) Function None 28
         29(inF0):     25(ptr) FunctionParameter
@@ -3094,139 +3134,141 @@
         32(inU0):     27(ptr) FunctionParameter
         33(inU1):     27(ptr) FunctionParameter
               35:             Label
-             250:   24(fvec2) Load 29(inF0)
-             251:   132(bool) All 250
              252:   24(fvec2) Load 29(inF0)
-             253:   24(fvec2) ExtInst 1(GLSL.std.450) 4(FAbs) 252
-             254:   24(fvec2) Load 29(inF0)
-             255:   24(fvec2) ExtInst 1(GLSL.std.450) 17(Acos) 254
-             256:   24(fvec2) Load 29(inF0)
-             257:   132(bool) Any 256
-             258:   24(fvec2) Load 29(inF0)
-             259:   24(fvec2) ExtInst 1(GLSL.std.450) 16(Asin) 258
-             260:   24(fvec2) Load 29(inF0)
-             262:  261(ivec2) Bitcast 260
-             263:   24(fvec2) Load 29(inF0)
-             264:   26(ivec2) Bitcast 263
-             265:   26(ivec2) Load 32(inU0)
-             266:   24(fvec2) Bitcast 265
-             267:   24(fvec2) Load 29(inF0)
-             268:   24(fvec2) ExtInst 1(GLSL.std.450) 18(Atan) 267
+             255:  253(bvec2) FOrdNotEqual 252 254
+             256:   132(bool) All 255
+             257:   24(fvec2) Load 29(inF0)
+             258:   24(fvec2) ExtInst 1(GLSL.std.450) 4(FAbs) 257
+             259:   24(fvec2) Load 29(inF0)
+             260:   24(fvec2) ExtInst 1(GLSL.std.450) 17(Acos) 259
+             261:   24(fvec2) Load 29(inF0)
+             262:  253(bvec2) FOrdNotEqual 261 254
+             263:   132(bool) Any 262
+             264:   24(fvec2) Load 29(inF0)
+             265:   24(fvec2) ExtInst 1(GLSL.std.450) 16(Asin) 264
+             266:   24(fvec2) Load 29(inF0)
+             268:  267(ivec2) Bitcast 266
              269:   24(fvec2) Load 29(inF0)
-             270:   24(fvec2) Load 30(inF1)
-             271:   24(fvec2) ExtInst 1(GLSL.std.450) 25(Atan2) 269 270
-             272:   24(fvec2) Load 29(inF0)
-             273:   24(fvec2) ExtInst 1(GLSL.std.450) 9(Ceil) 272
-             274:   24(fvec2) Load 29(inF0)
-             275:   24(fvec2) Load 30(inF1)
-             276:   24(fvec2) Load 31(inF2)
-             277:   24(fvec2) ExtInst 1(GLSL.std.450) 43(FClamp) 274 275 276
+             270:   26(ivec2) Bitcast 269
+             271:   26(ivec2) Load 32(inU0)
+             272:   24(fvec2) Bitcast 271
+             273:   24(fvec2) Load 29(inF0)
+             274:   24(fvec2) ExtInst 1(GLSL.std.450) 18(Atan) 273
+             275:   24(fvec2) Load 29(inF0)
+             276:   24(fvec2) Load 30(inF1)
+             277:   24(fvec2) ExtInst 1(GLSL.std.450) 25(Atan2) 275 276
              278:   24(fvec2) Load 29(inF0)
-             279:   24(fvec2) ExtInst 1(GLSL.std.450) 14(Cos) 278
+             279:   24(fvec2) ExtInst 1(GLSL.std.450) 9(Ceil) 278
              280:   24(fvec2) Load 29(inF0)
-             281:   24(fvec2) ExtInst 1(GLSL.std.450) 20(Cosh) 280
-             284:  261(ivec2) BitCount 283
-             285:   24(fvec2) Load 29(inF0)
-             286:   24(fvec2) ExtInst 1(GLSL.std.450) 12(Degrees) 285
-             287:   24(fvec2) Load 29(inF0)
-             288:   24(fvec2) Load 30(inF1)
-             289:    6(float) ExtInst 1(GLSL.std.450) 67(Distance) 287 288
-             290:   24(fvec2) Load 29(inF0)
-             291:   24(fvec2) Load 30(inF1)
-             292:    6(float) Dot 290 291
+             281:   24(fvec2) Load 30(inF1)
+             282:   24(fvec2) Load 31(inF2)
+             283:   24(fvec2) ExtInst 1(GLSL.std.450) 43(FClamp) 280 281 282
+             284:   24(fvec2) Load 29(inF0)
+             285:   24(fvec2) ExtInst 1(GLSL.std.450) 14(Cos) 284
+             286:   24(fvec2) Load 29(inF0)
+             287:   24(fvec2) ExtInst 1(GLSL.std.450) 20(Cosh) 286
+             290:  267(ivec2) BitCount 289
+             291:   24(fvec2) Load 29(inF0)
+             292:   24(fvec2) ExtInst 1(GLSL.std.450) 12(Degrees) 291
              293:   24(fvec2) Load 29(inF0)
-             294:   24(fvec2) ExtInst 1(GLSL.std.450) 27(Exp) 293
-             295:   24(fvec2) Load 29(inF0)
-             296:   24(fvec2) ExtInst 1(GLSL.std.450) 29(Exp2) 295
-             297:   24(fvec2) Load 29(inF0)
-             298:   24(fvec2) Load 30(inF1)
-             299:   24(fvec2) Load 31(inF2)
-             300:   24(fvec2) ExtInst 1(GLSL.std.450) 70(FaceForward) 297 298 299
-             301:    143(int) ExtInst 1(GLSL.std.450) 74(FindSMsb) 164
-             302:    143(int) ExtInst 1(GLSL.std.450) 73(FindILsb) 164
+             294:   24(fvec2) Load 30(inF1)
+             295:    6(float) ExtInst 1(GLSL.std.450) 67(Distance) 293 294
+             296:   24(fvec2) Load 29(inF0)
+             297:   24(fvec2) Load 30(inF1)
+             298:    6(float) Dot 296 297
+             299:   24(fvec2) Load 29(inF0)
+             300:   24(fvec2) ExtInst 1(GLSL.std.450) 27(Exp) 299
+             301:   24(fvec2) Load 29(inF0)
+             302:   24(fvec2) ExtInst 1(GLSL.std.450) 29(Exp2) 301
              303:   24(fvec2) Load 29(inF0)
-             304:   24(fvec2) ExtInst 1(GLSL.std.450) 8(Floor) 303
-             305:   24(fvec2) Load 29(inF0)
-             306:   24(fvec2) Load 30(inF1)
-             307:   24(fvec2) FMod 305 306
-             308:   24(fvec2) Load 29(inF0)
-             309:   24(fvec2) ExtInst 1(GLSL.std.450) 10(Fract) 308
-             310:   24(fvec2) Load 29(inF0)
-             312:  311(bvec2) IsInf 310
-             313:   24(fvec2) Load 29(inF0)
-             314:  311(bvec2) IsNan 313
-             315:   24(fvec2) Load 29(inF0)
-             316:   24(fvec2) Load 30(inF1)
-             317:   24(fvec2) ExtInst 1(GLSL.std.450) 53(Ldexp) 315 316
+             304:   24(fvec2) Load 30(inF1)
+             305:   24(fvec2) Load 31(inF2)
+             306:   24(fvec2) ExtInst 1(GLSL.std.450) 70(FaceForward) 303 304 305
+             307:    146(int) ExtInst 1(GLSL.std.450) 74(FindSMsb) 167
+             308:    146(int) ExtInst 1(GLSL.std.450) 73(FindILsb) 167
+             309:   24(fvec2) Load 29(inF0)
+             310:   24(fvec2) ExtInst 1(GLSL.std.450) 8(Floor) 309
+             311:   24(fvec2) Load 29(inF0)
+             312:   24(fvec2) Load 30(inF1)
+             313:   24(fvec2) FMod 311 312
+             314:   24(fvec2) Load 29(inF0)
+             315:   24(fvec2) ExtInst 1(GLSL.std.450) 10(Fract) 314
+             316:   24(fvec2) Load 29(inF0)
+             317:  253(bvec2) IsInf 316
              318:   24(fvec2) Load 29(inF0)
-             319:   24(fvec2) Load 30(inF1)
-             320:   24(fvec2) Load 31(inF2)
-             321:   24(fvec2) ExtInst 1(GLSL.std.450) 46(FMix) 318 319 320
-             322:   24(fvec2) Load 29(inF0)
-             323:    6(float) ExtInst 1(GLSL.std.450) 66(Length) 322
-             324:   24(fvec2) Load 29(inF0)
-             325:   24(fvec2) ExtInst 1(GLSL.std.450) 28(Log) 324
-             326:   24(fvec2) Load 29(inF0)
-             327:   24(fvec2) ExtInst 1(GLSL.std.450) 30(Log2) 326
-             328:   24(fvec2) VectorTimesScalar 327 196
+             319:  253(bvec2) IsNan 318
+             320:   24(fvec2) Load 29(inF0)
+             321:   24(fvec2) Load 30(inF1)
+             322:   24(fvec2) ExtInst 1(GLSL.std.450) 53(Ldexp) 320 321
+             323:   24(fvec2) Load 29(inF0)
+             324:   24(fvec2) Load 30(inF1)
+             325:   24(fvec2) Load 31(inF2)
+             326:   24(fvec2) ExtInst 1(GLSL.std.450) 46(FMix) 323 324 325
+             327:   24(fvec2) Load 29(inF0)
+             328:    6(float) ExtInst 1(GLSL.std.450) 66(Length) 327
              329:   24(fvec2) Load 29(inF0)
-             330:   24(fvec2) ExtInst 1(GLSL.std.450) 30(Log2) 329
+             330:   24(fvec2) ExtInst 1(GLSL.std.450) 28(Log) 329
              331:   24(fvec2) Load 29(inF0)
-             332:   24(fvec2) Load 30(inF1)
-             333:   24(fvec2) ExtInst 1(GLSL.std.450) 40(FMax) 331 332
+             332:   24(fvec2) ExtInst 1(GLSL.std.450) 30(Log2) 331
+             333:   24(fvec2) VectorTimesScalar 332 199
              334:   24(fvec2) Load 29(inF0)
-             335:   24(fvec2) Load 30(inF1)
-             336:   24(fvec2) ExtInst 1(GLSL.std.450) 37(FMin) 334 335
-             337:   24(fvec2) Load 29(inF0)
-             338:   24(fvec2) ExtInst 1(GLSL.std.450) 69(Normalize) 337
+             335:   24(fvec2) ExtInst 1(GLSL.std.450) 30(Log2) 334
+             336:   24(fvec2) Load 29(inF0)
+             337:   24(fvec2) Load 30(inF1)
+             338:   24(fvec2) ExtInst 1(GLSL.std.450) 40(FMax) 336 337
              339:   24(fvec2) Load 29(inF0)
              340:   24(fvec2) Load 30(inF1)
-             341:   24(fvec2) ExtInst 1(GLSL.std.450) 26(Pow) 339 340
+             341:   24(fvec2) ExtInst 1(GLSL.std.450) 37(FMin) 339 340
              342:   24(fvec2) Load 29(inF0)
-             343:   24(fvec2) ExtInst 1(GLSL.std.450) 11(Radians) 342
+             343:   24(fvec2) ExtInst 1(GLSL.std.450) 69(Normalize) 342
              344:   24(fvec2) Load 29(inF0)
              345:   24(fvec2) Load 30(inF1)
-             346:   24(fvec2) ExtInst 1(GLSL.std.450) 71(Reflect) 344 345
+             346:   24(fvec2) ExtInst 1(GLSL.std.450) 26(Pow) 344 345
              347:   24(fvec2) Load 29(inF0)
-             348:   24(fvec2) Load 30(inF1)
-             350:   24(fvec2) ExtInst 1(GLSL.std.450) 72(Refract) 347 348 349
-             353:  261(ivec2) BitReverse 352
-             354:   24(fvec2) Load 29(inF0)
-             355:   24(fvec2) ExtInst 1(GLSL.std.450) 2(RoundEven) 354
-             356:   24(fvec2) Load 29(inF0)
-             357:   24(fvec2) ExtInst 1(GLSL.std.450) 32(InverseSqrt) 356
-             358:   24(fvec2) Load 29(inF0)
-             359:   24(fvec2) CompositeConstruct 218 218
-             360:   24(fvec2) CompositeConstruct 219 219
-             361:   24(fvec2) ExtInst 1(GLSL.std.450) 43(FClamp) 358 359 360
-             362:   24(fvec2) Load 29(inF0)
-             363:   24(fvec2) ExtInst 1(GLSL.std.450) 6(FSign) 362
-             364:   24(fvec2) Load 29(inF0)
-             365:   24(fvec2) ExtInst 1(GLSL.std.450) 13(Sin) 364
-             366:   24(fvec2) Load 29(inF0)
-             367:   24(fvec2) ExtInst 1(GLSL.std.450) 13(Sin) 366
-                              Store 30(inF1) 367
-             368:   24(fvec2) Load 29(inF0)
-             369:   24(fvec2) ExtInst 1(GLSL.std.450) 14(Cos) 368
-                              Store 31(inF2) 369
-             370:   24(fvec2) Load 29(inF0)
-             371:   24(fvec2) ExtInst 1(GLSL.std.450) 19(Sinh) 370
-             372:   24(fvec2) Load 29(inF0)
-             373:   24(fvec2) Load 30(inF1)
-             374:   24(fvec2) Load 31(inF2)
-             375:   24(fvec2) ExtInst 1(GLSL.std.450) 49(SmoothStep) 372 373 374
-             376:   24(fvec2) Load 29(inF0)
-             377:   24(fvec2) ExtInst 1(GLSL.std.450) 31(Sqrt) 376
-             378:   24(fvec2) Load 29(inF0)
-             379:   24(fvec2) Load 30(inF1)
-             380:   24(fvec2) ExtInst 1(GLSL.std.450) 48(Step) 378 379
+             348:   24(fvec2) ExtInst 1(GLSL.std.450) 11(Radians) 347
+             349:   24(fvec2) Load 29(inF0)
+             350:   24(fvec2) Load 30(inF1)
+             351:   24(fvec2) ExtInst 1(GLSL.std.450) 71(Reflect) 349 350
+             352:   24(fvec2) Load 29(inF0)
+             353:   24(fvec2) Load 30(inF1)
+             355:   24(fvec2) ExtInst 1(GLSL.std.450) 72(Refract) 352 353 354
+             358:  267(ivec2) BitReverse 357
+             359:   24(fvec2) Load 29(inF0)
+             360:   24(fvec2) ExtInst 1(GLSL.std.450) 2(RoundEven) 359
+             361:   24(fvec2) Load 29(inF0)
+             362:   24(fvec2) ExtInst 1(GLSL.std.450) 32(InverseSqrt) 361
+             363:   24(fvec2) Load 29(inF0)
+             364:   24(fvec2) CompositeConstruct 133 133
+             365:   24(fvec2) CompositeConstruct 221 221
+             366:   24(fvec2) ExtInst 1(GLSL.std.450) 43(FClamp) 363 364 365
+             367:   24(fvec2) Load 29(inF0)
+             368:   24(fvec2) ExtInst 1(GLSL.std.450) 6(FSign) 367
+             369:   24(fvec2) Load 29(inF0)
+             370:   24(fvec2) ExtInst 1(GLSL.std.450) 13(Sin) 369
+             371:   24(fvec2) Load 29(inF0)
+             372:   24(fvec2) ExtInst 1(GLSL.std.450) 13(Sin) 371
+                              Store 30(inF1) 372
+             373:   24(fvec2) Load 29(inF0)
+             374:   24(fvec2) ExtInst 1(GLSL.std.450) 14(Cos) 373
+                              Store 31(inF2) 374
+             375:   24(fvec2) Load 29(inF0)
+             376:   24(fvec2) ExtInst 1(GLSL.std.450) 19(Sinh) 375
+             377:   24(fvec2) Load 29(inF0)
+             378:   24(fvec2) Load 30(inF1)
+             379:   24(fvec2) Load 31(inF2)
+             380:   24(fvec2) ExtInst 1(GLSL.std.450) 49(SmoothStep) 377 378 379
              381:   24(fvec2) Load 29(inF0)
-             382:   24(fvec2) ExtInst 1(GLSL.std.450) 15(Tan) 381
+             382:   24(fvec2) ExtInst 1(GLSL.std.450) 31(Sqrt) 381
              383:   24(fvec2) Load 29(inF0)
-             384:   24(fvec2) ExtInst 1(GLSL.std.450) 21(Tanh) 383
-             385:   24(fvec2) Load 29(inF0)
-             386:   24(fvec2) ExtInst 1(GLSL.std.450) 3(Trunc) 385
-                              ReturnValue 387
+             384:   24(fvec2) Load 30(inF1)
+             385:   24(fvec2) ExtInst 1(GLSL.std.450) 48(Step) 383 384
+             386:   24(fvec2) Load 29(inF0)
+             387:   24(fvec2) ExtInst 1(GLSL.std.450) 15(Tan) 386
+             388:   24(fvec2) Load 29(inF0)
+             389:   24(fvec2) ExtInst 1(GLSL.std.450) 21(Tanh) 388
+             390:   24(fvec2) Load 29(inF0)
+             391:   24(fvec2) ExtInst 1(GLSL.std.450) 3(Trunc) 390
+                              ReturnValue 392
                               FunctionEnd
 46(VertexShaderFunction3(vf3;vf3;vf3;vu3;vu3;):   36(fvec3) Function None 40
         41(inF0):     37(ptr) FunctionParameter
@@ -3235,142 +3277,144 @@
         44(inU0):     39(ptr) FunctionParameter
         45(inU1):     39(ptr) FunctionParameter
               47:             Label
-             390:   36(fvec3) Load 41(inF0)
-             391:   132(bool) All 390
-             392:   36(fvec3) Load 41(inF0)
-             393:   36(fvec3) ExtInst 1(GLSL.std.450) 4(FAbs) 392
-             394:   36(fvec3) Load 41(inF0)
-             395:   36(fvec3) ExtInst 1(GLSL.std.450) 17(Acos) 394
-             396:   36(fvec3) Load 41(inF0)
-             397:   132(bool) Any 396
-             398:   36(fvec3) Load 41(inF0)
-             399:   36(fvec3) ExtInst 1(GLSL.std.450) 16(Asin) 398
+             395:   36(fvec3) Load 41(inF0)
+             398:  396(bvec3) FOrdNotEqual 395 397
+             399:   132(bool) All 398
              400:   36(fvec3) Load 41(inF0)
-             402:  401(ivec3) Bitcast 400
-             403:   36(fvec3) Load 41(inF0)
-             404:   38(ivec3) Bitcast 403
-             405:   38(ivec3) Load 44(inU0)
-             406:   36(fvec3) Bitcast 405
+             401:   36(fvec3) ExtInst 1(GLSL.std.450) 4(FAbs) 400
+             402:   36(fvec3) Load 41(inF0)
+             403:   36(fvec3) ExtInst 1(GLSL.std.450) 17(Acos) 402
+             404:   36(fvec3) Load 41(inF0)
+             405:  396(bvec3) FOrdNotEqual 404 397
+             406:   132(bool) Any 405
              407:   36(fvec3) Load 41(inF0)
-             408:   36(fvec3) ExtInst 1(GLSL.std.450) 18(Atan) 407
+             408:   36(fvec3) ExtInst 1(GLSL.std.450) 16(Asin) 407
              409:   36(fvec3) Load 41(inF0)
-             410:   36(fvec3) Load 42(inF1)
-             411:   36(fvec3) ExtInst 1(GLSL.std.450) 25(Atan2) 409 410
+             411:  410(ivec3) Bitcast 409
              412:   36(fvec3) Load 41(inF0)
-             413:   36(fvec3) ExtInst 1(GLSL.std.450) 9(Ceil) 412
-             414:   36(fvec3) Load 41(inF0)
-             415:   36(fvec3) Load 42(inF1)
-             416:   36(fvec3) Load 43(inF2)
-             417:   36(fvec3) ExtInst 1(GLSL.std.450) 43(FClamp) 414 415 416
+             413:   38(ivec3) Bitcast 412
+             414:   38(ivec3) Load 44(inU0)
+             415:   36(fvec3) Bitcast 414
+             416:   36(fvec3) Load 41(inF0)
+             417:   36(fvec3) ExtInst 1(GLSL.std.450) 18(Atan) 416
              418:   36(fvec3) Load 41(inF0)
-             419:   36(fvec3) ExtInst 1(GLSL.std.450) 14(Cos) 418
-             420:   36(fvec3) Load 41(inF0)
-             421:   36(fvec3) ExtInst 1(GLSL.std.450) 20(Cosh) 420
-             424:  401(ivec3) BitCount 423
-             425:   36(fvec3) Load 41(inF0)
-             426:   36(fvec3) Load 42(inF1)
-             427:   36(fvec3) ExtInst 1(GLSL.std.450) 68(Cross) 425 426
-             428:   36(fvec3) Load 41(inF0)
-             429:   36(fvec3) ExtInst 1(GLSL.std.450) 12(Degrees) 428
-             430:   36(fvec3) Load 41(inF0)
-             431:   36(fvec3) Load 42(inF1)
-             432:    6(float) ExtInst 1(GLSL.std.450) 67(Distance) 430 431
-             433:   36(fvec3) Load 41(inF0)
-             434:   36(fvec3) Load 42(inF1)
-             435:    6(float) Dot 433 434
-             436:   36(fvec3) Load 41(inF0)
-             437:   36(fvec3) ExtInst 1(GLSL.std.450) 27(Exp) 436
-             438:   36(fvec3) Load 41(inF0)
-             439:   36(fvec3) ExtInst 1(GLSL.std.450) 29(Exp2) 438
-             440:   36(fvec3) Load 41(inF0)
-             441:   36(fvec3) Load 42(inF1)
-             442:   36(fvec3) Load 43(inF2)
-             443:   36(fvec3) ExtInst 1(GLSL.std.450) 70(FaceForward) 440 441 442
-             444:    143(int) ExtInst 1(GLSL.std.450) 74(FindSMsb) 164
-             445:    143(int) ExtInst 1(GLSL.std.450) 73(FindILsb) 164
-             446:   36(fvec3) Load 41(inF0)
-             447:   36(fvec3) ExtInst 1(GLSL.std.450) 8(Floor) 446
-             448:   36(fvec3) Load 41(inF0)
-             449:   36(fvec3) Load 42(inF1)
-             450:   36(fvec3) FMod 448 449
-             451:   36(fvec3) Load 41(inF0)
-             452:   36(fvec3) ExtInst 1(GLSL.std.450) 10(Fract) 451
-             453:   36(fvec3) Load 41(inF0)
-             455:  454(bvec3) IsInf 453
-             456:   36(fvec3) Load 41(inF0)
-             457:  454(bvec3) IsNan 456
-             458:   36(fvec3) Load 41(inF0)
-             459:   36(fvec3) Load 42(inF1)
-             460:   36(fvec3) ExtInst 1(GLSL.std.450) 53(Ldexp) 458 459
-             461:   36(fvec3) Load 41(inF0)
-             462:   36(fvec3) Load 42(inF1)
-             463:   36(fvec3) Load 43(inF2)
-             464:   36(fvec3) ExtInst 1(GLSL.std.450) 46(FMix) 461 462 463
-             465:   36(fvec3) Load 41(inF0)
-             466:    6(float) ExtInst 1(GLSL.std.450) 66(Length) 465
-             467:   36(fvec3) Load 41(inF0)
-             468:   36(fvec3) ExtInst 1(GLSL.std.450) 28(Log) 467
+             419:   36(fvec3) Load 42(inF1)
+             420:   36(fvec3) ExtInst 1(GLSL.std.450) 25(Atan2) 418 419
+             421:   36(fvec3) Load 41(inF0)
+             422:   36(fvec3) ExtInst 1(GLSL.std.450) 9(Ceil) 421
+             423:   36(fvec3) Load 41(inF0)
+             424:   36(fvec3) Load 42(inF1)
+             425:   36(fvec3) Load 43(inF2)
+             426:   36(fvec3) ExtInst 1(GLSL.std.450) 43(FClamp) 423 424 425
+             427:   36(fvec3) Load 41(inF0)
+             428:   36(fvec3) ExtInst 1(GLSL.std.450) 14(Cos) 427
+             429:   36(fvec3) Load 41(inF0)
+             430:   36(fvec3) ExtInst 1(GLSL.std.450) 20(Cosh) 429
+             433:  410(ivec3) BitCount 432
+             434:   36(fvec3) Load 41(inF0)
+             435:   36(fvec3) Load 42(inF1)
+             436:   36(fvec3) ExtInst 1(GLSL.std.450) 68(Cross) 434 435
+             437:   36(fvec3) Load 41(inF0)
+             438:   36(fvec3) ExtInst 1(GLSL.std.450) 12(Degrees) 437
+             439:   36(fvec3) Load 41(inF0)
+             440:   36(fvec3) Load 42(inF1)
+             441:    6(float) ExtInst 1(GLSL.std.450) 67(Distance) 439 440
+             442:   36(fvec3) Load 41(inF0)
+             443:   36(fvec3) Load 42(inF1)
+             444:    6(float) Dot 442 443
+             445:   36(fvec3) Load 41(inF0)
+             446:   36(fvec3) ExtInst 1(GLSL.std.450) 27(Exp) 445
+             447:   36(fvec3) Load 41(inF0)
+             448:   36(fvec3) ExtInst 1(GLSL.std.450) 29(Exp2) 447
+             449:   36(fvec3) Load 41(inF0)
+             450:   36(fvec3) Load 42(inF1)
+             451:   36(fvec3) Load 43(inF2)
+             452:   36(fvec3) ExtInst 1(GLSL.std.450) 70(FaceForward) 449 450 451
+             453:    146(int) ExtInst 1(GLSL.std.450) 74(FindSMsb) 167
+             454:    146(int) ExtInst 1(GLSL.std.450) 73(FindILsb) 167
+             455:   36(fvec3) Load 41(inF0)
+             456:   36(fvec3) ExtInst 1(GLSL.std.450) 8(Floor) 455
+             457:   36(fvec3) Load 41(inF0)
+             458:   36(fvec3) Load 42(inF1)
+             459:   36(fvec3) FMod 457 458
+             460:   36(fvec3) Load 41(inF0)
+             461:   36(fvec3) ExtInst 1(GLSL.std.450) 10(Fract) 460
+             462:   36(fvec3) Load 41(inF0)
+             463:  396(bvec3) IsInf 462
+             464:   36(fvec3) Load 41(inF0)
+             465:  396(bvec3) IsNan 464
+             466:   36(fvec3) Load 41(inF0)
+             467:   36(fvec3) Load 42(inF1)
+             468:   36(fvec3) ExtInst 1(GLSL.std.450) 53(Ldexp) 466 467
              469:   36(fvec3) Load 41(inF0)
-             470:   36(fvec3) ExtInst 1(GLSL.std.450) 30(Log2) 469
-             471:   36(fvec3) VectorTimesScalar 470 196
-             472:   36(fvec3) Load 41(inF0)
-             473:   36(fvec3) ExtInst 1(GLSL.std.450) 30(Log2) 472
-             474:   36(fvec3) Load 41(inF0)
-             475:   36(fvec3) Load 42(inF1)
-             476:   36(fvec3) ExtInst 1(GLSL.std.450) 40(FMax) 474 475
+             470:   36(fvec3) Load 42(inF1)
+             471:   36(fvec3) Load 43(inF2)
+             472:   36(fvec3) ExtInst 1(GLSL.std.450) 46(FMix) 469 470 471
+             473:   36(fvec3) Load 41(inF0)
+             474:    6(float) ExtInst 1(GLSL.std.450) 66(Length) 473
+             475:   36(fvec3) Load 41(inF0)
+             476:   36(fvec3) ExtInst 1(GLSL.std.450) 28(Log) 475
              477:   36(fvec3) Load 41(inF0)
-             478:   36(fvec3) Load 42(inF1)
-             479:   36(fvec3) ExtInst 1(GLSL.std.450) 37(FMin) 477 478
+             478:   36(fvec3) ExtInst 1(GLSL.std.450) 30(Log2) 477
+             479:   36(fvec3) VectorTimesScalar 478 199
              480:   36(fvec3) Load 41(inF0)
-             481:   36(fvec3) ExtInst 1(GLSL.std.450) 69(Normalize) 480
+             481:   36(fvec3) ExtInst 1(GLSL.std.450) 30(Log2) 480
              482:   36(fvec3) Load 41(inF0)
              483:   36(fvec3) Load 42(inF1)
-             484:   36(fvec3) ExtInst 1(GLSL.std.450) 26(Pow) 482 483
+             484:   36(fvec3) ExtInst 1(GLSL.std.450) 40(FMax) 482 483
              485:   36(fvec3) Load 41(inF0)
-             486:   36(fvec3) ExtInst 1(GLSL.std.450) 11(Radians) 485
-             487:   36(fvec3) Load 41(inF0)
-             488:   36(fvec3) Load 42(inF1)
-             489:   36(fvec3) ExtInst 1(GLSL.std.450) 71(Reflect) 487 488
+             486:   36(fvec3) Load 42(inF1)
+             487:   36(fvec3) ExtInst 1(GLSL.std.450) 37(FMin) 485 486
+             488:   36(fvec3) Load 41(inF0)
+             489:   36(fvec3) ExtInst 1(GLSL.std.450) 69(Normalize) 488
              490:   36(fvec3) Load 41(inF0)
              491:   36(fvec3) Load 42(inF1)
-             492:   36(fvec3) ExtInst 1(GLSL.std.450) 72(Refract) 490 491 349
-             494:  401(ivec3) BitReverse 493
+             492:   36(fvec3) ExtInst 1(GLSL.std.450) 26(Pow) 490 491
+             493:   36(fvec3) Load 41(inF0)
+             494:   36(fvec3) ExtInst 1(GLSL.std.450) 11(Radians) 493
              495:   36(fvec3) Load 41(inF0)
-             496:   36(fvec3) ExtInst 1(GLSL.std.450) 2(RoundEven) 495
-             497:   36(fvec3) Load 41(inF0)
-             498:   36(fvec3) ExtInst 1(GLSL.std.450) 32(InverseSqrt) 497
-             499:   36(fvec3) Load 41(inF0)
-             500:   36(fvec3) CompositeConstruct 218 218 218
-             501:   36(fvec3) CompositeConstruct 219 219 219
-             502:   36(fvec3) ExtInst 1(GLSL.std.450) 43(FClamp) 499 500 501
+             496:   36(fvec3) Load 42(inF1)
+             497:   36(fvec3) ExtInst 1(GLSL.std.450) 71(Reflect) 495 496
+             498:   36(fvec3) Load 41(inF0)
+             499:   36(fvec3) Load 42(inF1)
+             500:   36(fvec3) ExtInst 1(GLSL.std.450) 72(Refract) 498 499 354
+             502:  410(ivec3) BitReverse 501
              503:   36(fvec3) Load 41(inF0)
-             504:   36(fvec3) ExtInst 1(GLSL.std.450) 6(FSign) 503
+             504:   36(fvec3) ExtInst 1(GLSL.std.450) 2(RoundEven) 503
              505:   36(fvec3) Load 41(inF0)
-             506:   36(fvec3) ExtInst 1(GLSL.std.450) 13(Sin) 505
+             506:   36(fvec3) ExtInst 1(GLSL.std.450) 32(InverseSqrt) 505
              507:   36(fvec3) Load 41(inF0)
-             508:   36(fvec3) ExtInst 1(GLSL.std.450) 13(Sin) 507
-                              Store 42(inF1) 508
-             509:   36(fvec3) Load 41(inF0)
-             510:   36(fvec3) ExtInst 1(GLSL.std.450) 14(Cos) 509
-                              Store 43(inF2) 510
+             508:   36(fvec3) CompositeConstruct 133 133 133
+             509:   36(fvec3) CompositeConstruct 221 221 221
+             510:   36(fvec3) ExtInst 1(GLSL.std.450) 43(FClamp) 507 508 509
              511:   36(fvec3) Load 41(inF0)
-             512:   36(fvec3) ExtInst 1(GLSL.std.450) 19(Sinh) 511
+             512:   36(fvec3) ExtInst 1(GLSL.std.450) 6(FSign) 511
              513:   36(fvec3) Load 41(inF0)
-             514:   36(fvec3) Load 42(inF1)
-             515:   36(fvec3) Load 43(inF2)
-             516:   36(fvec3) ExtInst 1(GLSL.std.450) 49(SmoothStep) 513 514 515
+             514:   36(fvec3) ExtInst 1(GLSL.std.450) 13(Sin) 513
+             515:   36(fvec3) Load 41(inF0)
+             516:   36(fvec3) ExtInst 1(GLSL.std.450) 13(Sin) 515
+                              Store 42(inF1) 516
              517:   36(fvec3) Load 41(inF0)
-             518:   36(fvec3) ExtInst 1(GLSL.std.450) 31(Sqrt) 517
+             518:   36(fvec3) ExtInst 1(GLSL.std.450) 14(Cos) 517
+                              Store 43(inF2) 518
              519:   36(fvec3) Load 41(inF0)
-             520:   36(fvec3) Load 42(inF1)
-             521:   36(fvec3) ExtInst 1(GLSL.std.450) 48(Step) 519 520
-             522:   36(fvec3) Load 41(inF0)
-             523:   36(fvec3) ExtInst 1(GLSL.std.450) 15(Tan) 522
-             524:   36(fvec3) Load 41(inF0)
-             525:   36(fvec3) ExtInst 1(GLSL.std.450) 21(Tanh) 524
-             526:   36(fvec3) Load 41(inF0)
-             527:   36(fvec3) ExtInst 1(GLSL.std.450) 3(Trunc) 526
-                              ReturnValue 529
+             520:   36(fvec3) ExtInst 1(GLSL.std.450) 19(Sinh) 519
+             521:   36(fvec3) Load 41(inF0)
+             522:   36(fvec3) Load 42(inF1)
+             523:   36(fvec3) Load 43(inF2)
+             524:   36(fvec3) ExtInst 1(GLSL.std.450) 49(SmoothStep) 521 522 523
+             525:   36(fvec3) Load 41(inF0)
+             526:   36(fvec3) ExtInst 1(GLSL.std.450) 31(Sqrt) 525
+             527:   36(fvec3) Load 41(inF0)
+             528:   36(fvec3) Load 42(inF1)
+             529:   36(fvec3) ExtInst 1(GLSL.std.450) 48(Step) 527 528
+             530:   36(fvec3) Load 41(inF0)
+             531:   36(fvec3) ExtInst 1(GLSL.std.450) 15(Tan) 530
+             532:   36(fvec3) Load 41(inF0)
+             533:   36(fvec3) ExtInst 1(GLSL.std.450) 21(Tanh) 532
+             534:   36(fvec3) Load 41(inF0)
+             535:   36(fvec3) ExtInst 1(GLSL.std.450) 3(Trunc) 534
+                              ReturnValue 537
                               FunctionEnd
 58(VertexShaderFunction4(vf4;vf4;vf4;vu4;vu4;):   48(fvec4) Function None 52
         53(inF0):     49(ptr) FunctionParameter
@@ -3379,509 +3423,517 @@
         56(inU0):     51(ptr) FunctionParameter
         57(inU1):     51(ptr) FunctionParameter
               59:             Label
-             532:   48(fvec4) Load 53(inF0)
-             533:   132(bool) All 532
-             534:   48(fvec4) Load 53(inF0)
-             535:   48(fvec4) ExtInst 1(GLSL.std.450) 4(FAbs) 534
-             536:   48(fvec4) Load 53(inF0)
-             537:   48(fvec4) ExtInst 1(GLSL.std.450) 17(Acos) 536
-             538:   48(fvec4) Load 53(inF0)
-             539:   132(bool) Any 538
              540:   48(fvec4) Load 53(inF0)
-             541:   48(fvec4) ExtInst 1(GLSL.std.450) 16(Asin) 540
-             542:   48(fvec4) Load 53(inF0)
-             544:  543(ivec4) Bitcast 542
+             543:  541(bvec4) FOrdNotEqual 540 542
+             544:   132(bool) All 543
              545:   48(fvec4) Load 53(inF0)
-             546:   50(ivec4) Bitcast 545
-             547:   50(ivec4) Load 56(inU0)
-             548:   48(fvec4) Bitcast 547
+             546:   48(fvec4) ExtInst 1(GLSL.std.450) 4(FAbs) 545
+             547:   48(fvec4) Load 53(inF0)
+             548:   48(fvec4) ExtInst 1(GLSL.std.450) 17(Acos) 547
              549:   48(fvec4) Load 53(inF0)
-             550:   48(fvec4) ExtInst 1(GLSL.std.450) 18(Atan) 549
-             551:   48(fvec4) Load 53(inF0)
-             552:   48(fvec4) Load 54(inF1)
-             553:   48(fvec4) ExtInst 1(GLSL.std.450) 25(Atan2) 551 552
+             550:  541(bvec4) FOrdNotEqual 549 542
+             551:   132(bool) Any 550
+             552:   48(fvec4) Load 53(inF0)
+             553:   48(fvec4) ExtInst 1(GLSL.std.450) 16(Asin) 552
              554:   48(fvec4) Load 53(inF0)
-             555:   48(fvec4) ExtInst 1(GLSL.std.450) 9(Ceil) 554
-             556:   48(fvec4) Load 53(inF0)
-             557:   48(fvec4) Load 54(inF1)
-             558:   48(fvec4) Load 55(inF2)
-             559:   48(fvec4) ExtInst 1(GLSL.std.450) 43(FClamp) 556 557 558
-             560:   48(fvec4) Load 53(inF0)
-             561:   48(fvec4) ExtInst 1(GLSL.std.450) 14(Cos) 560
-             562:   48(fvec4) Load 53(inF0)
-             563:   48(fvec4) ExtInst 1(GLSL.std.450) 20(Cosh) 562
-             565:  543(ivec4) BitCount 564
+             556:  555(ivec4) Bitcast 554
+             557:   48(fvec4) Load 53(inF0)
+             558:   50(ivec4) Bitcast 557
+             559:   50(ivec4) Load 56(inU0)
+             560:   48(fvec4) Bitcast 559
+             561:   48(fvec4) Load 53(inF0)
+             562:   48(fvec4) ExtInst 1(GLSL.std.450) 18(Atan) 561
+             563:   48(fvec4) Load 53(inF0)
+             564:   48(fvec4) Load 54(inF1)
+             565:   48(fvec4) ExtInst 1(GLSL.std.450) 25(Atan2) 563 564
              566:   48(fvec4) Load 53(inF0)
-             567:   48(fvec4) ExtInst 1(GLSL.std.450) 12(Degrees) 566
+             567:   48(fvec4) ExtInst 1(GLSL.std.450) 9(Ceil) 566
              568:   48(fvec4) Load 53(inF0)
              569:   48(fvec4) Load 54(inF1)
-             570:    6(float) ExtInst 1(GLSL.std.450) 67(Distance) 568 569
-             571:   48(fvec4) Load 53(inF0)
-             572:   48(fvec4) Load 54(inF1)
-             573:    6(float) Dot 571 572
-             575:      7(ptr) AccessChain 53(inF0) 574
-             576:    6(float) Load 575
-             577:      7(ptr) AccessChain 54(inF1) 574
-             578:    6(float) Load 577
-             579:    6(float) FMul 576 578
-             581:      7(ptr) AccessChain 53(inF0) 580
-             582:    6(float) Load 581
-             584:      7(ptr) AccessChain 54(inF1) 583
-             585:    6(float) Load 584
-             586:   48(fvec4) CompositeConstruct 219 579 582 585
-             587:   48(fvec4) Load 53(inF0)
-             588:   48(fvec4) ExtInst 1(GLSL.std.450) 27(Exp) 587
-             589:   48(fvec4) Load 53(inF0)
-             590:   48(fvec4) ExtInst 1(GLSL.std.450) 29(Exp2) 589
-             591:   48(fvec4) Load 53(inF0)
-             592:   48(fvec4) Load 54(inF1)
-             593:   48(fvec4) Load 55(inF2)
-             594:   48(fvec4) ExtInst 1(GLSL.std.450) 70(FaceForward) 591 592 593
-             595:    143(int) ExtInst 1(GLSL.std.450) 74(FindSMsb) 164
-             596:    143(int) ExtInst 1(GLSL.std.450) 73(FindILsb) 164
-             597:   48(fvec4) Load 53(inF0)
-             598:   48(fvec4) ExtInst 1(GLSL.std.450) 8(Floor) 597
+             570:   48(fvec4) Load 55(inF2)
+             571:   48(fvec4) ExtInst 1(GLSL.std.450) 43(FClamp) 568 569 570
+             572:   48(fvec4) Load 53(inF0)
+             573:   48(fvec4) ExtInst 1(GLSL.std.450) 14(Cos) 572
+             574:   48(fvec4) Load 53(inF0)
+             575:   48(fvec4) ExtInst 1(GLSL.std.450) 20(Cosh) 574
+             577:  555(ivec4) BitCount 576
+             578:   48(fvec4) Load 53(inF0)
+             579:   48(fvec4) ExtInst 1(GLSL.std.450) 12(Degrees) 578
+             580:   48(fvec4) Load 53(inF0)
+             581:   48(fvec4) Load 54(inF1)
+             582:    6(float) ExtInst 1(GLSL.std.450) 67(Distance) 580 581
+             583:   48(fvec4) Load 53(inF0)
+             584:   48(fvec4) Load 54(inF1)
+             585:    6(float) Dot 583 584
+             587:      7(ptr) AccessChain 53(inF0) 586
+             588:    6(float) Load 587
+             589:      7(ptr) AccessChain 54(inF1) 586
+             590:    6(float) Load 589
+             591:    6(float) FMul 588 590
+             593:      7(ptr) AccessChain 53(inF0) 592
+             594:    6(float) Load 593
+             596:      7(ptr) AccessChain 54(inF1) 595
+             597:    6(float) Load 596
+             598:   48(fvec4) CompositeConstruct 221 591 594 597
              599:   48(fvec4) Load 53(inF0)
-             600:   48(fvec4) Load 54(inF1)
-             601:   48(fvec4) FMod 599 600
-             602:   48(fvec4) Load 53(inF0)
-             603:   48(fvec4) ExtInst 1(GLSL.std.450) 10(Fract) 602
-             604:   48(fvec4) Load 53(inF0)
-             606:  605(bvec4) IsInf 604
-             607:   48(fvec4) Load 53(inF0)
-             608:  605(bvec4) IsNan 607
+             600:   48(fvec4) ExtInst 1(GLSL.std.450) 27(Exp) 599
+             601:   48(fvec4) Load 53(inF0)
+             602:   48(fvec4) ExtInst 1(GLSL.std.450) 29(Exp2) 601
+             603:   48(fvec4) Load 53(inF0)
+             604:   48(fvec4) Load 54(inF1)
+             605:   48(fvec4) Load 55(inF2)
+             606:   48(fvec4) ExtInst 1(GLSL.std.450) 70(FaceForward) 603 604 605
+             607:    146(int) ExtInst 1(GLSL.std.450) 74(FindSMsb) 167
+             608:    146(int) ExtInst 1(GLSL.std.450) 73(FindILsb) 167
              609:   48(fvec4) Load 53(inF0)
-             610:   48(fvec4) Load 54(inF1)
-             611:   48(fvec4) ExtInst 1(GLSL.std.450) 53(Ldexp) 609 610
-             612:   48(fvec4) Load 53(inF0)
-             613:   48(fvec4) Load 54(inF1)
-             614:   48(fvec4) Load 55(inF2)
-             615:   48(fvec4) ExtInst 1(GLSL.std.450) 46(FMix) 612 613 614
+             610:   48(fvec4) ExtInst 1(GLSL.std.450) 8(Floor) 609
+             611:   48(fvec4) Load 53(inF0)
+             612:   48(fvec4) Load 54(inF1)
+             613:   48(fvec4) FMod 611 612
+             614:   48(fvec4) Load 53(inF0)
+             615:   48(fvec4) ExtInst 1(GLSL.std.450) 10(Fract) 614
              616:   48(fvec4) Load 53(inF0)
-             617:    6(float) ExtInst 1(GLSL.std.450) 66(Length) 616
+             617:  541(bvec4) IsInf 616
              618:   48(fvec4) Load 53(inF0)
-             619:   48(fvec4) ExtInst 1(GLSL.std.450) 28(Log) 618
+             619:  541(bvec4) IsNan 618
              620:   48(fvec4) Load 53(inF0)
-             621:   48(fvec4) ExtInst 1(GLSL.std.450) 30(Log2) 620
-             622:   48(fvec4) VectorTimesScalar 621 196
+             621:   48(fvec4) Load 54(inF1)
+             622:   48(fvec4) ExtInst 1(GLSL.std.450) 53(Ldexp) 620 621
              623:   48(fvec4) Load 53(inF0)
-             624:   48(fvec4) ExtInst 1(GLSL.std.450) 30(Log2) 623
-             625:   48(fvec4) Load 53(inF0)
-             626:   48(fvec4) Load 54(inF1)
-             627:   48(fvec4) ExtInst 1(GLSL.std.450) 40(FMax) 625 626
-             628:   48(fvec4) Load 53(inF0)
-             629:   48(fvec4) Load 54(inF1)
-             630:   48(fvec4) ExtInst 1(GLSL.std.450) 37(FMin) 628 629
+             624:   48(fvec4) Load 54(inF1)
+             625:   48(fvec4) Load 55(inF2)
+             626:   48(fvec4) ExtInst 1(GLSL.std.450) 46(FMix) 623 624 625
+             627:   48(fvec4) Load 53(inF0)
+             628:    6(float) ExtInst 1(GLSL.std.450) 66(Length) 627
+             629:   48(fvec4) Load 53(inF0)
+             630:   48(fvec4) ExtInst 1(GLSL.std.450) 28(Log) 629
              631:   48(fvec4) Load 53(inF0)
-             632:   48(fvec4) ExtInst 1(GLSL.std.450) 69(Normalize) 631
-             633:   48(fvec4) Load 53(inF0)
-             634:   48(fvec4) Load 54(inF1)
-             635:   48(fvec4) ExtInst 1(GLSL.std.450) 26(Pow) 633 634
+             632:   48(fvec4) ExtInst 1(GLSL.std.450) 30(Log2) 631
+             633:   48(fvec4) VectorTimesScalar 632 199
+             634:   48(fvec4) Load 53(inF0)
+             635:   48(fvec4) ExtInst 1(GLSL.std.450) 30(Log2) 634
              636:   48(fvec4) Load 53(inF0)
-             637:   48(fvec4) ExtInst 1(GLSL.std.450) 11(Radians) 636
-             638:   48(fvec4) Load 53(inF0)
-             639:   48(fvec4) Load 54(inF1)
-             640:   48(fvec4) ExtInst 1(GLSL.std.450) 71(Reflect) 638 639
-             641:   48(fvec4) Load 53(inF0)
-             642:   48(fvec4) Load 54(inF1)
-             643:   48(fvec4) ExtInst 1(GLSL.std.450) 72(Refract) 641 642 349
-             646:  543(ivec4) BitReverse 645
+             637:   48(fvec4) Load 54(inF1)
+             638:   48(fvec4) ExtInst 1(GLSL.std.450) 40(FMax) 636 637
+             639:   48(fvec4) Load 53(inF0)
+             640:   48(fvec4) Load 54(inF1)
+             641:   48(fvec4) ExtInst 1(GLSL.std.450) 37(FMin) 639 640
+             642:   48(fvec4) Load 53(inF0)
+             643:   48(fvec4) ExtInst 1(GLSL.std.450) 69(Normalize) 642
+             644:   48(fvec4) Load 53(inF0)
+             645:   48(fvec4) Load 54(inF1)
+             646:   48(fvec4) ExtInst 1(GLSL.std.450) 26(Pow) 644 645
              647:   48(fvec4) Load 53(inF0)
-             648:   48(fvec4) ExtInst 1(GLSL.std.450) 2(RoundEven) 647
+             648:   48(fvec4) ExtInst 1(GLSL.std.450) 11(Radians) 647
              649:   48(fvec4) Load 53(inF0)
-             650:   48(fvec4) ExtInst 1(GLSL.std.450) 32(InverseSqrt) 649
-             651:   48(fvec4) Load 53(inF0)
-             652:   48(fvec4) CompositeConstruct 218 218 218 218
-             653:   48(fvec4) CompositeConstruct 219 219 219 219
-             654:   48(fvec4) ExtInst 1(GLSL.std.450) 43(FClamp) 651 652 653
-             655:   48(fvec4) Load 53(inF0)
-             656:   48(fvec4) ExtInst 1(GLSL.std.450) 6(FSign) 655
-             657:   48(fvec4) Load 53(inF0)
-             658:   48(fvec4) ExtInst 1(GLSL.std.450) 13(Sin) 657
-             659:   48(fvec4) Load 53(inF0)
-             660:   48(fvec4) ExtInst 1(GLSL.std.450) 13(Sin) 659
-                              Store 54(inF1) 660
-             661:   48(fvec4) Load 53(inF0)
-             662:   48(fvec4) ExtInst 1(GLSL.std.450) 14(Cos) 661
-                              Store 55(inF2) 662
-             663:   48(fvec4) Load 53(inF0)
-             664:   48(fvec4) ExtInst 1(GLSL.std.450) 19(Sinh) 663
-             665:   48(fvec4) Load 53(inF0)
-             666:   48(fvec4) Load 54(inF1)
-             667:   48(fvec4) Load 55(inF2)
-             668:   48(fvec4) ExtInst 1(GLSL.std.450) 49(SmoothStep) 665 666 667
-             669:   48(fvec4) Load 53(inF0)
-             670:   48(fvec4) ExtInst 1(GLSL.std.450) 31(Sqrt) 669
-             671:   48(fvec4) Load 53(inF0)
-             672:   48(fvec4) Load 54(inF1)
-             673:   48(fvec4) ExtInst 1(GLSL.std.450) 48(Step) 671 672
+             650:   48(fvec4) Load 54(inF1)
+             651:   48(fvec4) ExtInst 1(GLSL.std.450) 71(Reflect) 649 650
+             652:   48(fvec4) Load 53(inF0)
+             653:   48(fvec4) Load 54(inF1)
+             654:   48(fvec4) ExtInst 1(GLSL.std.450) 72(Refract) 652 653 354
+             657:  555(ivec4) BitReverse 656
+             658:   48(fvec4) Load 53(inF0)
+             659:   48(fvec4) ExtInst 1(GLSL.std.450) 2(RoundEven) 658
+             660:   48(fvec4) Load 53(inF0)
+             661:   48(fvec4) ExtInst 1(GLSL.std.450) 32(InverseSqrt) 660
+             662:   48(fvec4) Load 53(inF0)
+             663:   48(fvec4) CompositeConstruct 133 133 133 133
+             664:   48(fvec4) CompositeConstruct 221 221 221 221
+             665:   48(fvec4) ExtInst 1(GLSL.std.450) 43(FClamp) 662 663 664
+             666:   48(fvec4) Load 53(inF0)
+             667:   48(fvec4) ExtInst 1(GLSL.std.450) 6(FSign) 666
+             668:   48(fvec4) Load 53(inF0)
+             669:   48(fvec4) ExtInst 1(GLSL.std.450) 13(Sin) 668
+             670:   48(fvec4) Load 53(inF0)
+             671:   48(fvec4) ExtInst 1(GLSL.std.450) 13(Sin) 670
+                              Store 54(inF1) 671
+             672:   48(fvec4) Load 53(inF0)
+             673:   48(fvec4) ExtInst 1(GLSL.std.450) 14(Cos) 672
+                              Store 55(inF2) 673
              674:   48(fvec4) Load 53(inF0)
-             675:   48(fvec4) ExtInst 1(GLSL.std.450) 15(Tan) 674
+             675:   48(fvec4) ExtInst 1(GLSL.std.450) 19(Sinh) 674
              676:   48(fvec4) Load 53(inF0)
-             677:   48(fvec4) ExtInst 1(GLSL.std.450) 21(Tanh) 676
-             678:   48(fvec4) Load 53(inF0)
-             679:   48(fvec4) ExtInst 1(GLSL.std.450) 3(Trunc) 678
-                              ReturnValue 681
+             677:   48(fvec4) Load 54(inF1)
+             678:   48(fvec4) Load 55(inF2)
+             679:   48(fvec4) ExtInst 1(GLSL.std.450) 49(SmoothStep) 676 677 678
+             680:   48(fvec4) Load 53(inF0)
+             681:   48(fvec4) ExtInst 1(GLSL.std.450) 31(Sqrt) 680
+             682:   48(fvec4) Load 53(inF0)
+             683:   48(fvec4) Load 54(inF1)
+             684:   48(fvec4) ExtInst 1(GLSL.std.450) 48(Step) 682 683
+             685:   48(fvec4) Load 53(inF0)
+             686:   48(fvec4) ExtInst 1(GLSL.std.450) 15(Tan) 685
+             687:   48(fvec4) Load 53(inF0)
+             688:   48(fvec4) ExtInst 1(GLSL.std.450) 21(Tanh) 687
+             689:   48(fvec4) Load 53(inF0)
+             690:   48(fvec4) ExtInst 1(GLSL.std.450) 3(Trunc) 689
+                              ReturnValue 692
                               FunctionEnd
 66(VertexShaderFunction2x2(mf22;mf22;mf22;):          60 Function None 62
         63(inF0):     61(ptr) FunctionParameter
         64(inF1):     61(ptr) FunctionParameter
         65(inF2):     61(ptr) FunctionParameter
               67:             Label
-             684:          60 Load 63(inF0)
-             685:   132(bool) All 684
-             686:          60 Load 63(inF0)
-             687:          60 ExtInst 1(GLSL.std.450) 4(FAbs) 686
-             688:          60 Load 63(inF0)
-             689:          60 ExtInst 1(GLSL.std.450) 17(Acos) 688
-             690:          60 Load 63(inF0)
-             691:   132(bool) Any 690
-             692:          60 Load 63(inF0)
-             693:          60 ExtInst 1(GLSL.std.450) 16(Asin) 692
-             694:          60 Load 63(inF0)
-             695:          60 ExtInst 1(GLSL.std.450) 18(Atan) 694
-             696:          60 Load 63(inF0)
-             697:          60 Load 64(inF1)
-             698:          60 ExtInst 1(GLSL.std.450) 25(Atan2) 696 697
+             695:          60 Load 63(inF0)
+             697:         696 FOrdNotEqual 695 133
+             698:   132(bool) All 697
              699:          60 Load 63(inF0)
-             700:          60 ExtInst 1(GLSL.std.450) 9(Ceil) 699
+             700:          60 ExtInst 1(GLSL.std.450) 4(FAbs) 699
              701:          60 Load 63(inF0)
-             702:          60 Load 64(inF1)
-             703:          60 Load 65(inF2)
-             704:          60 ExtInst 1(GLSL.std.450) 43(FClamp) 701 702 703
-             705:          60 Load 63(inF0)
-             706:          60 ExtInst 1(GLSL.std.450) 14(Cos) 705
-             707:          60 Load 63(inF0)
-             708:          60 ExtInst 1(GLSL.std.450) 20(Cosh) 707
-             709:          60 Load 63(inF0)
-             710:          60 ExtInst 1(GLSL.std.450) 12(Degrees) 709
-             711:          60 Load 63(inF0)
-             712:    6(float) ExtInst 1(GLSL.std.450) 33(Determinant) 711
+             702:          60 ExtInst 1(GLSL.std.450) 17(Acos) 701
+             703:          60 Load 63(inF0)
+             704:         696 FOrdNotEqual 703 133
+             705:   132(bool) Any 704
+             706:          60 Load 63(inF0)
+             707:          60 ExtInst 1(GLSL.std.450) 16(Asin) 706
+             708:          60 Load 63(inF0)
+             709:          60 ExtInst 1(GLSL.std.450) 18(Atan) 708
+             710:          60 Load 63(inF0)
+             711:          60 Load 64(inF1)
+             712:          60 ExtInst 1(GLSL.std.450) 25(Atan2) 710 711
              713:          60 Load 63(inF0)
-             714:          60 ExtInst 1(GLSL.std.450) 27(Exp) 713
+             714:          60 ExtInst 1(GLSL.std.450) 9(Ceil) 713
              715:          60 Load 63(inF0)
-             716:          60 ExtInst 1(GLSL.std.450) 29(Exp2) 715
-             717:    143(int) ExtInst 1(GLSL.std.450) 74(FindSMsb) 164
-             718:    143(int) ExtInst 1(GLSL.std.450) 73(FindILsb) 164
+             716:          60 Load 64(inF1)
+             717:          60 Load 65(inF2)
+             718:          60 ExtInst 1(GLSL.std.450) 43(FClamp) 715 716 717
              719:          60 Load 63(inF0)
-             720:          60 ExtInst 1(GLSL.std.450) 8(Floor) 719
+             720:          60 ExtInst 1(GLSL.std.450) 14(Cos) 719
              721:          60 Load 63(inF0)
-             722:          60 Load 64(inF1)
-             723:   24(fvec2) CompositeExtract 721 0
-             724:   24(fvec2) CompositeExtract 722 0
-             725:   24(fvec2) FMod 723 724
-             726:   24(fvec2) CompositeExtract 721 1
-             727:   24(fvec2) CompositeExtract 722 1
-             728:   24(fvec2) FMod 726 727
-             729:          60 CompositeConstruct 725 728
-             730:          60 Load 63(inF0)
-             731:          60 ExtInst 1(GLSL.std.450) 10(Fract) 730
-             732:          60 Load 63(inF0)
-             733:          60 Load 64(inF1)
-             734:          60 ExtInst 1(GLSL.std.450) 53(Ldexp) 732 733
+             722:          60 ExtInst 1(GLSL.std.450) 20(Cosh) 721
+             723:          60 Load 63(inF0)
+             724:          60 ExtInst 1(GLSL.std.450) 12(Degrees) 723
+             725:          60 Load 63(inF0)
+             726:    6(float) ExtInst 1(GLSL.std.450) 33(Determinant) 725
+             727:          60 Load 63(inF0)
+             728:          60 ExtInst 1(GLSL.std.450) 27(Exp) 727
+             729:          60 Load 63(inF0)
+             730:          60 ExtInst 1(GLSL.std.450) 29(Exp2) 729
+             731:    146(int) ExtInst 1(GLSL.std.450) 74(FindSMsb) 167
+             732:    146(int) ExtInst 1(GLSL.std.450) 73(FindILsb) 167
+             733:          60 Load 63(inF0)
+             734:          60 ExtInst 1(GLSL.std.450) 8(Floor) 733
              735:          60 Load 63(inF0)
              736:          60 Load 64(inF1)
-             737:          60 Load 65(inF2)
-             738:          60 ExtInst 1(GLSL.std.450) 46(FMix) 735 736 737
-             739:          60 Load 63(inF0)
-             740:          60 ExtInst 1(GLSL.std.450) 28(Log) 739
-             741:          60 Load 63(inF0)
-             742:          60 ExtInst 1(GLSL.std.450) 30(Log2) 741
-             743:          60 MatrixTimesScalar 742 196
+             737:   24(fvec2) CompositeExtract 735 0
+             738:   24(fvec2) CompositeExtract 736 0
+             739:   24(fvec2) FMod 737 738
+             740:   24(fvec2) CompositeExtract 735 1
+             741:   24(fvec2) CompositeExtract 736 1
+             742:   24(fvec2) FMod 740 741
+             743:          60 CompositeConstruct 739 742
              744:          60 Load 63(inF0)
-             745:          60 ExtInst 1(GLSL.std.450) 30(Log2) 744
+             745:          60 ExtInst 1(GLSL.std.450) 10(Fract) 744
              746:          60 Load 63(inF0)
              747:          60 Load 64(inF1)
-             748:          60 ExtInst 1(GLSL.std.450) 40(FMax) 746 747
+             748:          60 ExtInst 1(GLSL.std.450) 53(Ldexp) 746 747
              749:          60 Load 63(inF0)
              750:          60 Load 64(inF1)
-             751:          60 ExtInst 1(GLSL.std.450) 37(FMin) 749 750
-             752:          60 Load 63(inF0)
-             753:          60 Load 64(inF1)
-             754:          60 ExtInst 1(GLSL.std.450) 26(Pow) 752 753
+             751:          60 Load 65(inF2)
+             752:          60 ExtInst 1(GLSL.std.450) 46(FMix) 749 750 751
+             753:          60 Load 63(inF0)
+             754:          60 ExtInst 1(GLSL.std.450) 28(Log) 753
              755:          60 Load 63(inF0)
-             756:          60 ExtInst 1(GLSL.std.450) 11(Radians) 755
-             757:          60 Load 63(inF0)
-             758:          60 ExtInst 1(GLSL.std.450) 2(RoundEven) 757
-             759:          60 Load 63(inF0)
-             760:          60 ExtInst 1(GLSL.std.450) 32(InverseSqrt) 759
-             761:          60 Load 63(inF0)
-             762:   24(fvec2) CompositeConstruct 218 218
-             763:   24(fvec2) CompositeConstruct 219 219
-             764:          60 ExtInst 1(GLSL.std.450) 43(FClamp) 761 762 763
-             765:          60 Load 63(inF0)
-             766:          60 ExtInst 1(GLSL.std.450) 6(FSign) 765
-             767:          60 Load 63(inF0)
-             768:          60 ExtInst 1(GLSL.std.450) 13(Sin) 767
+             756:          60 ExtInst 1(GLSL.std.450) 30(Log2) 755
+             757:          60 MatrixTimesScalar 756 199
+             758:          60 Load 63(inF0)
+             759:          60 ExtInst 1(GLSL.std.450) 30(Log2) 758
+             760:          60 Load 63(inF0)
+             761:          60 Load 64(inF1)
+             762:          60 ExtInst 1(GLSL.std.450) 40(FMax) 760 761
+             763:          60 Load 63(inF0)
+             764:          60 Load 64(inF1)
+             765:          60 ExtInst 1(GLSL.std.450) 37(FMin) 763 764
+             766:          60 Load 63(inF0)
+             767:          60 Load 64(inF1)
+             768:          60 ExtInst 1(GLSL.std.450) 26(Pow) 766 767
              769:          60 Load 63(inF0)
-             770:          60 ExtInst 1(GLSL.std.450) 13(Sin) 769
-                              Store 64(inF1) 770
+             770:          60 ExtInst 1(GLSL.std.450) 11(Radians) 769
              771:          60 Load 63(inF0)
-             772:          60 ExtInst 1(GLSL.std.450) 14(Cos) 771
-                              Store 65(inF2) 772
+             772:          60 ExtInst 1(GLSL.std.450) 2(RoundEven) 771
              773:          60 Load 63(inF0)
-             774:          60 ExtInst 1(GLSL.std.450) 19(Sinh) 773
+             774:          60 ExtInst 1(GLSL.std.450) 32(InverseSqrt) 773
              775:          60 Load 63(inF0)
-             776:          60 Load 64(inF1)
-             777:          60 Load 65(inF2)
-             778:          60 ExtInst 1(GLSL.std.450) 49(SmoothStep) 775 776 777
+             776:   24(fvec2) CompositeConstruct 133 133
+             777:   24(fvec2) CompositeConstruct 221 221
+             778:          60 ExtInst 1(GLSL.std.450) 43(FClamp) 775 776 777
              779:          60 Load 63(inF0)
-             780:          60 ExtInst 1(GLSL.std.450) 31(Sqrt) 779
+             780:          60 ExtInst 1(GLSL.std.450) 6(FSign) 779
              781:          60 Load 63(inF0)
-             782:          60 Load 64(inF1)
-             783:          60 ExtInst 1(GLSL.std.450) 48(Step) 781 782
-             784:          60 Load 63(inF0)
-             785:          60 ExtInst 1(GLSL.std.450) 15(Tan) 784
-             786:          60 Load 63(inF0)
-             787:          60 ExtInst 1(GLSL.std.450) 21(Tanh) 786
-             788:          60 Load 63(inF0)
-             789:          60 Transpose 788
-             790:          60 Load 63(inF0)
-             791:          60 ExtInst 1(GLSL.std.450) 3(Trunc) 790
-                              ReturnValue 793
+             782:          60 ExtInst 1(GLSL.std.450) 13(Sin) 781
+             783:          60 Load 63(inF0)
+             784:          60 ExtInst 1(GLSL.std.450) 13(Sin) 783
+                              Store 64(inF1) 784
+             785:          60 Load 63(inF0)
+             786:          60 ExtInst 1(GLSL.std.450) 14(Cos) 785
+                              Store 65(inF2) 786
+             787:          60 Load 63(inF0)
+             788:          60 ExtInst 1(GLSL.std.450) 19(Sinh) 787
+             789:          60 Load 63(inF0)
+             790:          60 Load 64(inF1)
+             791:          60 Load 65(inF2)
+             792:          60 ExtInst 1(GLSL.std.450) 49(SmoothStep) 789 790 791
+             793:          60 Load 63(inF0)
+             794:          60 ExtInst 1(GLSL.std.450) 31(Sqrt) 793
+             795:          60 Load 63(inF0)
+             796:          60 Load 64(inF1)
+             797:          60 ExtInst 1(GLSL.std.450) 48(Step) 795 796
+             798:          60 Load 63(inF0)
+             799:          60 ExtInst 1(GLSL.std.450) 15(Tan) 798
+             800:          60 Load 63(inF0)
+             801:          60 ExtInst 1(GLSL.std.450) 21(Tanh) 800
+             802:          60 Load 63(inF0)
+             803:          60 Transpose 802
+             804:          60 Load 63(inF0)
+             805:          60 ExtInst 1(GLSL.std.450) 3(Trunc) 804
+                              ReturnValue 807
                               FunctionEnd
 74(VertexShaderFunction3x3(mf33;mf33;mf33;):          68 Function None 70
         71(inF0):     69(ptr) FunctionParameter
         72(inF1):     69(ptr) FunctionParameter
         73(inF2):     69(ptr) FunctionParameter
               75:             Label
-             796:          68 Load 71(inF0)
-             797:   132(bool) All 796
-             798:          68 Load 71(inF0)
-             799:          68 ExtInst 1(GLSL.std.450) 4(FAbs) 798
-             800:          68 Load 71(inF0)
-             801:          68 ExtInst 1(GLSL.std.450) 17(Acos) 800
-             802:          68 Load 71(inF0)
-             803:   132(bool) Any 802
-             804:          68 Load 71(inF0)
-             805:          68 ExtInst 1(GLSL.std.450) 16(Asin) 804
-             806:          68 Load 71(inF0)
-             807:          68 ExtInst 1(GLSL.std.450) 18(Atan) 806
-             808:          68 Load 71(inF0)
-             809:          68 Load 72(inF1)
-             810:          68 ExtInst 1(GLSL.std.450) 25(Atan2) 808 809
-             811:          68 Load 71(inF0)
-             812:          68 ExtInst 1(GLSL.std.450) 9(Ceil) 811
-             813:          68 Load 71(inF0)
-             814:          68 Load 72(inF1)
-             815:          68 Load 73(inF2)
-             816:          68 ExtInst 1(GLSL.std.450) 43(FClamp) 813 814 815
-             817:          68 Load 71(inF0)
-             818:          68 ExtInst 1(GLSL.std.450) 14(Cos) 817
-             819:          68 Load 71(inF0)
-             820:          68 ExtInst 1(GLSL.std.450) 20(Cosh) 819
+             810:          68 Load 71(inF0)
+             812:         811 FOrdNotEqual 810 133
+             813:   132(bool) All 812
+             814:          68 Load 71(inF0)
+             815:          68 ExtInst 1(GLSL.std.450) 4(FAbs) 814
+             816:          68 Load 71(inF0)
+             817:          68 ExtInst 1(GLSL.std.450) 17(Acos) 816
+             818:          68 Load 71(inF0)
+             819:         811 FOrdNotEqual 818 133
+             820:   132(bool) Any 819
              821:          68 Load 71(inF0)
-             822:          68 ExtInst 1(GLSL.std.450) 12(Degrees) 821
+             822:          68 ExtInst 1(GLSL.std.450) 16(Asin) 821
              823:          68 Load 71(inF0)
-             824:    6(float) ExtInst 1(GLSL.std.450) 33(Determinant) 823
+             824:          68 ExtInst 1(GLSL.std.450) 18(Atan) 823
              825:          68 Load 71(inF0)
-             826:          68 ExtInst 1(GLSL.std.450) 27(Exp) 825
-             827:          68 Load 71(inF0)
-             828:          68 ExtInst 1(GLSL.std.450) 29(Exp2) 827
-             829:    143(int) ExtInst 1(GLSL.std.450) 74(FindSMsb) 164
-             830:    143(int) ExtInst 1(GLSL.std.450) 73(FindILsb) 164
-             831:          68 Load 71(inF0)
-             832:          68 ExtInst 1(GLSL.std.450) 8(Floor) 831
-             833:          68 Load 71(inF0)
-             834:          68 Load 72(inF1)
-             835:   36(fvec3) CompositeExtract 833 0
-             836:   36(fvec3) CompositeExtract 834 0
-             837:   36(fvec3) FMod 835 836
-             838:   36(fvec3) CompositeExtract 833 1
-             839:   36(fvec3) CompositeExtract 834 1
-             840:   36(fvec3) FMod 838 839
-             841:   36(fvec3) CompositeExtract 833 2
-             842:   36(fvec3) CompositeExtract 834 2
-             843:   36(fvec3) FMod 841 842
-             844:          68 CompositeConstruct 837 840 843
-             845:          68 Load 71(inF0)
-             846:          68 ExtInst 1(GLSL.std.450) 10(Fract) 845
-             847:          68 Load 71(inF0)
-             848:          68 Load 72(inF1)
-             849:          68 ExtInst 1(GLSL.std.450) 53(Ldexp) 847 848
+             826:          68 Load 72(inF1)
+             827:          68 ExtInst 1(GLSL.std.450) 25(Atan2) 825 826
+             828:          68 Load 71(inF0)
+             829:          68 ExtInst 1(GLSL.std.450) 9(Ceil) 828
+             830:          68 Load 71(inF0)
+             831:          68 Load 72(inF1)
+             832:          68 Load 73(inF2)
+             833:          68 ExtInst 1(GLSL.std.450) 43(FClamp) 830 831 832
+             834:          68 Load 71(inF0)
+             835:          68 ExtInst 1(GLSL.std.450) 14(Cos) 834
+             836:          68 Load 71(inF0)
+             837:          68 ExtInst 1(GLSL.std.450) 20(Cosh) 836
+             838:          68 Load 71(inF0)
+             839:          68 ExtInst 1(GLSL.std.450) 12(Degrees) 838
+             840:          68 Load 71(inF0)
+             841:    6(float) ExtInst 1(GLSL.std.450) 33(Determinant) 840
+             842:          68 Load 71(inF0)
+             843:          68 ExtInst 1(GLSL.std.450) 27(Exp) 842
+             844:          68 Load 71(inF0)
+             845:          68 ExtInst 1(GLSL.std.450) 29(Exp2) 844
+             846:    146(int) ExtInst 1(GLSL.std.450) 74(FindSMsb) 167
+             847:    146(int) ExtInst 1(GLSL.std.450) 73(FindILsb) 167
+             848:          68 Load 71(inF0)
+             849:          68 ExtInst 1(GLSL.std.450) 8(Floor) 848
              850:          68 Load 71(inF0)
              851:          68 Load 72(inF1)
-             852:          68 Load 73(inF2)
-             853:          68 ExtInst 1(GLSL.std.450) 46(FMix) 850 851 852
-             854:          68 Load 71(inF0)
-             855:          68 ExtInst 1(GLSL.std.450) 28(Log) 854
-             856:          68 Load 71(inF0)
-             857:          68 ExtInst 1(GLSL.std.450) 30(Log2) 856
-             858:          68 MatrixTimesScalar 857 196
-             859:          68 Load 71(inF0)
-             860:          68 ExtInst 1(GLSL.std.450) 30(Log2) 859
-             861:          68 Load 71(inF0)
-             862:          68 Load 72(inF1)
-             863:          68 ExtInst 1(GLSL.std.450) 40(FMax) 861 862
+             852:   36(fvec3) CompositeExtract 850 0
+             853:   36(fvec3) CompositeExtract 851 0
+             854:   36(fvec3) FMod 852 853
+             855:   36(fvec3) CompositeExtract 850 1
+             856:   36(fvec3) CompositeExtract 851 1
+             857:   36(fvec3) FMod 855 856
+             858:   36(fvec3) CompositeExtract 850 2
+             859:   36(fvec3) CompositeExtract 851 2
+             860:   36(fvec3) FMod 858 859
+             861:          68 CompositeConstruct 854 857 860
+             862:          68 Load 71(inF0)
+             863:          68 ExtInst 1(GLSL.std.450) 10(Fract) 862
              864:          68 Load 71(inF0)
              865:          68 Load 72(inF1)
-             866:          68 ExtInst 1(GLSL.std.450) 37(FMin) 864 865
+             866:          68 ExtInst 1(GLSL.std.450) 53(Ldexp) 864 865
              867:          68 Load 71(inF0)
              868:          68 Load 72(inF1)
-             869:          68 ExtInst 1(GLSL.std.450) 26(Pow) 867 868
-             870:          68 Load 71(inF0)
-             871:          68 ExtInst 1(GLSL.std.450) 11(Radians) 870
-             872:          68 Load 71(inF0)
-             873:          68 ExtInst 1(GLSL.std.450) 2(RoundEven) 872
-             874:          68 Load 71(inF0)
-             875:          68 ExtInst 1(GLSL.std.450) 32(InverseSqrt) 874
+             869:          68 Load 73(inF2)
+             870:          68 ExtInst 1(GLSL.std.450) 46(FMix) 867 868 869
+             871:          68 Load 71(inF0)
+             872:          68 ExtInst 1(GLSL.std.450) 28(Log) 871
+             873:          68 Load 71(inF0)
+             874:          68 ExtInst 1(GLSL.std.450) 30(Log2) 873
+             875:          68 MatrixTimesScalar 874 199
              876:          68 Load 71(inF0)
-             877:   36(fvec3) CompositeConstruct 218 218 218
-             878:   36(fvec3) CompositeConstruct 219 219 219
-             879:          68 ExtInst 1(GLSL.std.450) 43(FClamp) 876 877 878
-             880:          68 Load 71(inF0)
-             881:          68 ExtInst 1(GLSL.std.450) 6(FSign) 880
-             882:          68 Load 71(inF0)
-             883:          68 ExtInst 1(GLSL.std.450) 13(Sin) 882
+             877:          68 ExtInst 1(GLSL.std.450) 30(Log2) 876
+             878:          68 Load 71(inF0)
+             879:          68 Load 72(inF1)
+             880:          68 ExtInst 1(GLSL.std.450) 40(FMax) 878 879
+             881:          68 Load 71(inF0)
+             882:          68 Load 72(inF1)
+             883:          68 ExtInst 1(GLSL.std.450) 37(FMin) 881 882
              884:          68 Load 71(inF0)
-             885:          68 ExtInst 1(GLSL.std.450) 13(Sin) 884
-                              Store 72(inF1) 885
-             886:          68 Load 71(inF0)
-             887:          68 ExtInst 1(GLSL.std.450) 14(Cos) 886
-                              Store 73(inF2) 887
-             888:          68 Load 71(inF0)
-             889:          68 ExtInst 1(GLSL.std.450) 19(Sinh) 888
-             890:          68 Load 71(inF0)
-             891:          68 Load 72(inF1)
-             892:          68 Load 73(inF2)
-             893:          68 ExtInst 1(GLSL.std.450) 49(SmoothStep) 890 891 892
-             894:          68 Load 71(inF0)
-             895:          68 ExtInst 1(GLSL.std.450) 31(Sqrt) 894
-             896:          68 Load 71(inF0)
-             897:          68 Load 72(inF1)
-             898:          68 ExtInst 1(GLSL.std.450) 48(Step) 896 897
+             885:          68 Load 72(inF1)
+             886:          68 ExtInst 1(GLSL.std.450) 26(Pow) 884 885
+             887:          68 Load 71(inF0)
+             888:          68 ExtInst 1(GLSL.std.450) 11(Radians) 887
+             889:          68 Load 71(inF0)
+             890:          68 ExtInst 1(GLSL.std.450) 2(RoundEven) 889
+             891:          68 Load 71(inF0)
+             892:          68 ExtInst 1(GLSL.std.450) 32(InverseSqrt) 891
+             893:          68 Load 71(inF0)
+             894:   36(fvec3) CompositeConstruct 133 133 133
+             895:   36(fvec3) CompositeConstruct 221 221 221
+             896:          68 ExtInst 1(GLSL.std.450) 43(FClamp) 893 894 895
+             897:          68 Load 71(inF0)
+             898:          68 ExtInst 1(GLSL.std.450) 6(FSign) 897
              899:          68 Load 71(inF0)
-             900:          68 ExtInst 1(GLSL.std.450) 15(Tan) 899
+             900:          68 ExtInst 1(GLSL.std.450) 13(Sin) 899
              901:          68 Load 71(inF0)
-             902:          68 ExtInst 1(GLSL.std.450) 21(Tanh) 901
+             902:          68 ExtInst 1(GLSL.std.450) 13(Sin) 901
+                              Store 72(inF1) 902
              903:          68 Load 71(inF0)
-             904:          68 Transpose 903
+             904:          68 ExtInst 1(GLSL.std.450) 14(Cos) 903
+                              Store 73(inF2) 904
              905:          68 Load 71(inF0)
-             906:          68 ExtInst 1(GLSL.std.450) 3(Trunc) 905
-                              ReturnValue 908
+             906:          68 ExtInst 1(GLSL.std.450) 19(Sinh) 905
+             907:          68 Load 71(inF0)
+             908:          68 Load 72(inF1)
+             909:          68 Load 73(inF2)
+             910:          68 ExtInst 1(GLSL.std.450) 49(SmoothStep) 907 908 909
+             911:          68 Load 71(inF0)
+             912:          68 ExtInst 1(GLSL.std.450) 31(Sqrt) 911
+             913:          68 Load 71(inF0)
+             914:          68 Load 72(inF1)
+             915:          68 ExtInst 1(GLSL.std.450) 48(Step) 913 914
+             916:          68 Load 71(inF0)
+             917:          68 ExtInst 1(GLSL.std.450) 15(Tan) 916
+             918:          68 Load 71(inF0)
+             919:          68 ExtInst 1(GLSL.std.450) 21(Tanh) 918
+             920:          68 Load 71(inF0)
+             921:          68 Transpose 920
+             922:          68 Load 71(inF0)
+             923:          68 ExtInst 1(GLSL.std.450) 3(Trunc) 922
+                              ReturnValue 925
                               FunctionEnd
 82(VertexShaderFunction4x4(mf44;mf44;mf44;):          76 Function None 78
         79(inF0):     77(ptr) FunctionParameter
         80(inF1):     77(ptr) FunctionParameter
         81(inF2):     77(ptr) FunctionParameter
               83:             Label
-             911:          76 Load 79(inF0)
-             912:   132(bool) All 911
-             913:          76 Load 79(inF0)
-             914:          76 ExtInst 1(GLSL.std.450) 4(FAbs) 913
-             915:          76 Load 79(inF0)
-             916:          76 ExtInst 1(GLSL.std.450) 17(Acos) 915
-             917:          76 Load 79(inF0)
-             918:   132(bool) Any 917
-             919:          76 Load 79(inF0)
-             920:          76 ExtInst 1(GLSL.std.450) 16(Asin) 919
-             921:          76 Load 79(inF0)
-             922:          76 ExtInst 1(GLSL.std.450) 18(Atan) 921
-             923:          76 Load 79(inF0)
-             924:          76 Load 80(inF1)
-             925:          76 ExtInst 1(GLSL.std.450) 25(Atan2) 923 924
-             926:          76 Load 79(inF0)
-             927:          76 ExtInst 1(GLSL.std.450) 9(Ceil) 926
              928:          76 Load 79(inF0)
-             929:          76 Load 80(inF1)
-             930:          76 Load 81(inF2)
-             931:          76 ExtInst 1(GLSL.std.450) 43(FClamp) 928 929 930
+             930:         929 FOrdNotEqual 928 133
+             931:   132(bool) All 930
              932:          76 Load 79(inF0)
-             933:          76 ExtInst 1(GLSL.std.450) 14(Cos) 932
+             933:          76 ExtInst 1(GLSL.std.450) 4(FAbs) 932
              934:          76 Load 79(inF0)
-             935:          76 ExtInst 1(GLSL.std.450) 20(Cosh) 934
+             935:          76 ExtInst 1(GLSL.std.450) 17(Acos) 934
              936:          76 Load 79(inF0)
-             937:          76 ExtInst 1(GLSL.std.450) 12(Degrees) 936
-             938:          76 Load 79(inF0)
-             939:    6(float) ExtInst 1(GLSL.std.450) 33(Determinant) 938
-             940:          76 Load 79(inF0)
-             941:          76 ExtInst 1(GLSL.std.450) 27(Exp) 940
-             942:          76 Load 79(inF0)
-             943:          76 ExtInst 1(GLSL.std.450) 29(Exp2) 942
-             944:    143(int) ExtInst 1(GLSL.std.450) 74(FindSMsb) 164
-             945:    143(int) ExtInst 1(GLSL.std.450) 73(FindILsb) 164
+             937:         929 FOrdNotEqual 936 133
+             938:   132(bool) Any 937
+             939:          76 Load 79(inF0)
+             940:          76 ExtInst 1(GLSL.std.450) 16(Asin) 939
+             941:          76 Load 79(inF0)
+             942:          76 ExtInst 1(GLSL.std.450) 18(Atan) 941
+             943:          76 Load 79(inF0)
+             944:          76 Load 80(inF1)
+             945:          76 ExtInst 1(GLSL.std.450) 25(Atan2) 943 944
              946:          76 Load 79(inF0)
-             947:          76 ExtInst 1(GLSL.std.450) 8(Floor) 946
+             947:          76 ExtInst 1(GLSL.std.450) 9(Ceil) 946
              948:          76 Load 79(inF0)
              949:          76 Load 80(inF1)
-             950:   48(fvec4) CompositeExtract 948 0
-             951:   48(fvec4) CompositeExtract 949 0
-             952:   48(fvec4) FMod 950 951
-             953:   48(fvec4) CompositeExtract 948 1
-             954:   48(fvec4) CompositeExtract 949 1
-             955:   48(fvec4) FMod 953 954
-             956:   48(fvec4) CompositeExtract 948 2
-             957:   48(fvec4) CompositeExtract 949 2
-             958:   48(fvec4) FMod 956 957
-             959:   48(fvec4) CompositeExtract 948 3
-             960:   48(fvec4) CompositeExtract 949 3
-             961:   48(fvec4) FMod 959 960
-             962:          76 CompositeConstruct 952 955 958 961
-             963:          76 Load 79(inF0)
-             964:          76 ExtInst 1(GLSL.std.450) 10(Fract) 963
-             965:          76 Load 79(inF0)
-             966:          76 Load 80(inF1)
-             967:          76 ExtInst 1(GLSL.std.450) 53(Ldexp) 965 966
+             950:          76 Load 81(inF2)
+             951:          76 ExtInst 1(GLSL.std.450) 43(FClamp) 948 949 950
+             952:          76 Load 79(inF0)
+             953:          76 ExtInst 1(GLSL.std.450) 14(Cos) 952
+             954:          76 Load 79(inF0)
+             955:          76 ExtInst 1(GLSL.std.450) 20(Cosh) 954
+             956:          76 Load 79(inF0)
+             957:          76 ExtInst 1(GLSL.std.450) 12(Degrees) 956
+             958:          76 Load 79(inF0)
+             959:    6(float) ExtInst 1(GLSL.std.450) 33(Determinant) 958
+             960:          76 Load 79(inF0)
+             961:          76 ExtInst 1(GLSL.std.450) 27(Exp) 960
+             962:          76 Load 79(inF0)
+             963:          76 ExtInst 1(GLSL.std.450) 29(Exp2) 962
+             964:    146(int) ExtInst 1(GLSL.std.450) 74(FindSMsb) 167
+             965:    146(int) ExtInst 1(GLSL.std.450) 73(FindILsb) 167
+             966:          76 Load 79(inF0)
+             967:          76 ExtInst 1(GLSL.std.450) 8(Floor) 966
              968:          76 Load 79(inF0)
              969:          76 Load 80(inF1)
-             970:          76 Load 81(inF2)
-             971:          76 ExtInst 1(GLSL.std.450) 46(FMix) 968 969 970
-             972:          76 Load 79(inF0)
-             973:          76 ExtInst 1(GLSL.std.450) 28(Log) 972
-             974:          76 Load 79(inF0)
-             975:          76 ExtInst 1(GLSL.std.450) 30(Log2) 974
-             976:          76 MatrixTimesScalar 975 196
-             977:          76 Load 79(inF0)
-             978:          76 ExtInst 1(GLSL.std.450) 30(Log2) 977
-             979:          76 Load 79(inF0)
-             980:          76 Load 80(inF1)
-             981:          76 ExtInst 1(GLSL.std.450) 40(FMax) 979 980
-             982:          76 Load 79(inF0)
-             983:          76 Load 80(inF1)
-             984:          76 ExtInst 1(GLSL.std.450) 37(FMin) 982 983
+             970:   48(fvec4) CompositeExtract 968 0
+             971:   48(fvec4) CompositeExtract 969 0
+             972:   48(fvec4) FMod 970 971
+             973:   48(fvec4) CompositeExtract 968 1
+             974:   48(fvec4) CompositeExtract 969 1
+             975:   48(fvec4) FMod 973 974
+             976:   48(fvec4) CompositeExtract 968 2
+             977:   48(fvec4) CompositeExtract 969 2
+             978:   48(fvec4) FMod 976 977
+             979:   48(fvec4) CompositeExtract 968 3
+             980:   48(fvec4) CompositeExtract 969 3
+             981:   48(fvec4) FMod 979 980
+             982:          76 CompositeConstruct 972 975 978 981
+             983:          76 Load 79(inF0)
+             984:          76 ExtInst 1(GLSL.std.450) 10(Fract) 983
              985:          76 Load 79(inF0)
              986:          76 Load 80(inF1)
-             987:          76 ExtInst 1(GLSL.std.450) 26(Pow) 985 986
+             987:          76 ExtInst 1(GLSL.std.450) 53(Ldexp) 985 986
              988:          76 Load 79(inF0)
-             989:          76 ExtInst 1(GLSL.std.450) 11(Radians) 988
-             990:          76 Load 79(inF0)
-             991:          76 ExtInst 1(GLSL.std.450) 2(RoundEven) 990
+             989:          76 Load 80(inF1)
+             990:          76 Load 81(inF2)
+             991:          76 ExtInst 1(GLSL.std.450) 46(FMix) 988 989 990
              992:          76 Load 79(inF0)
-             993:          76 ExtInst 1(GLSL.std.450) 32(InverseSqrt) 992
+             993:          76 ExtInst 1(GLSL.std.450) 28(Log) 992
              994:          76 Load 79(inF0)
-             995:   48(fvec4) CompositeConstruct 218 218 218 218
-             996:   48(fvec4) CompositeConstruct 219 219 219 219
-             997:          76 ExtInst 1(GLSL.std.450) 43(FClamp) 994 995 996
-             998:          76 Load 79(inF0)
-             999:          76 ExtInst 1(GLSL.std.450) 6(FSign) 998
-            1000:          76 Load 79(inF0)
-            1001:          76 ExtInst 1(GLSL.std.450) 13(Sin) 1000
+             995:          76 ExtInst 1(GLSL.std.450) 30(Log2) 994
+             996:          76 MatrixTimesScalar 995 199
+             997:          76 Load 79(inF0)
+             998:          76 ExtInst 1(GLSL.std.450) 30(Log2) 997
+             999:          76 Load 79(inF0)
+            1000:          76 Load 80(inF1)
+            1001:          76 ExtInst 1(GLSL.std.450) 40(FMax) 999 1000
             1002:          76 Load 79(inF0)
-            1003:          76 ExtInst 1(GLSL.std.450) 13(Sin) 1002
-                              Store 80(inF1) 1003
-            1004:          76 Load 79(inF0)
-            1005:          76 ExtInst 1(GLSL.std.450) 14(Cos) 1004
-                              Store 81(inF2) 1005
-            1006:          76 Load 79(inF0)
-            1007:          76 ExtInst 1(GLSL.std.450) 19(Sinh) 1006
+            1003:          76 Load 80(inF1)
+            1004:          76 ExtInst 1(GLSL.std.450) 37(FMin) 1002 1003
+            1005:          76 Load 79(inF0)
+            1006:          76 Load 80(inF1)
+            1007:          76 ExtInst 1(GLSL.std.450) 26(Pow) 1005 1006
             1008:          76 Load 79(inF0)
-            1009:          76 Load 80(inF1)
-            1010:          76 Load 81(inF2)
-            1011:          76 ExtInst 1(GLSL.std.450) 49(SmoothStep) 1008 1009 1010
+            1009:          76 ExtInst 1(GLSL.std.450) 11(Radians) 1008
+            1010:          76 Load 79(inF0)
+            1011:          76 ExtInst 1(GLSL.std.450) 2(RoundEven) 1010
             1012:          76 Load 79(inF0)
-            1013:          76 ExtInst 1(GLSL.std.450) 31(Sqrt) 1012
+            1013:          76 ExtInst 1(GLSL.std.450) 32(InverseSqrt) 1012
             1014:          76 Load 79(inF0)
-            1015:          76 Load 80(inF1)
-            1016:          76 ExtInst 1(GLSL.std.450) 48(Step) 1014 1015
-            1017:          76 Load 79(inF0)
-            1018:          76 ExtInst 1(GLSL.std.450) 15(Tan) 1017
-            1019:          76 Load 79(inF0)
-            1020:          76 ExtInst 1(GLSL.std.450) 21(Tanh) 1019
-            1021:          76 Load 79(inF0)
-            1022:          76 Transpose 1021
-            1023:          76 Load 79(inF0)
-            1024:          76 ExtInst 1(GLSL.std.450) 3(Trunc) 1023
-                              ReturnValue 1026
+            1015:   48(fvec4) CompositeConstruct 133 133 133 133
+            1016:   48(fvec4) CompositeConstruct 221 221 221 221
+            1017:          76 ExtInst 1(GLSL.std.450) 43(FClamp) 1014 1015 1016
+            1018:          76 Load 79(inF0)
+            1019:          76 ExtInst 1(GLSL.std.450) 6(FSign) 1018
+            1020:          76 Load 79(inF0)
+            1021:          76 ExtInst 1(GLSL.std.450) 13(Sin) 1020
+            1022:          76 Load 79(inF0)
+            1023:          76 ExtInst 1(GLSL.std.450) 13(Sin) 1022
+                              Store 80(inF1) 1023
+            1024:          76 Load 79(inF0)
+            1025:          76 ExtInst 1(GLSL.std.450) 14(Cos) 1024
+                              Store 81(inF2) 1025
+            1026:          76 Load 79(inF0)
+            1027:          76 ExtInst 1(GLSL.std.450) 19(Sinh) 1026
+            1028:          76 Load 79(inF0)
+            1029:          76 Load 80(inF1)
+            1030:          76 Load 81(inF2)
+            1031:          76 ExtInst 1(GLSL.std.450) 49(SmoothStep) 1028 1029 1030
+            1032:          76 Load 79(inF0)
+            1033:          76 ExtInst 1(GLSL.std.450) 31(Sqrt) 1032
+            1034:          76 Load 79(inF0)
+            1035:          76 Load 80(inF1)
+            1036:          76 ExtInst 1(GLSL.std.450) 48(Step) 1034 1035
+            1037:          76 Load 79(inF0)
+            1038:          76 ExtInst 1(GLSL.std.450) 15(Tan) 1037
+            1039:          76 Load 79(inF0)
+            1040:          76 ExtInst 1(GLSL.std.450) 21(Tanh) 1039
+            1041:          76 Load 79(inF0)
+            1042:          76 Transpose 1041
+            1043:          76 Load 79(inF0)
+            1044:          76 ExtInst 1(GLSL.std.450) 3(Trunc) 1043
+                              ReturnValue 1046
                               FunctionEnd
 91(TestGenMul2(f1;f1;vf2;vf2;mf22;mf22;):           2 Function None 84
         85(inF0):      7(ptr) FunctionParameter
@@ -3891,51 +3943,51 @@
        89(inFM0):     61(ptr) FunctionParameter
        90(inFM1):     61(ptr) FunctionParameter
               92:             Label
-        1029(r0):      7(ptr) Variable Function
-        1033(r1):     25(ptr) Variable Function
-        1037(r2):     25(ptr) Variable Function
-        1041(r3):      7(ptr) Variable Function
-        1045(r4):     25(ptr) Variable Function
-        1049(r5):     25(ptr) Variable Function
-        1053(r6):     61(ptr) Variable Function
-        1057(r7):     61(ptr) Variable Function
-        1061(r8):     61(ptr) Variable Function
-            1030:    6(float) Load 86(inF1)
-            1031:    6(float) Load 85(inF0)
-            1032:    6(float) FMul 1030 1031
-                              Store 1029(r0) 1032
-            1034:    6(float) Load 85(inF0)
-            1035:   24(fvec2) Load 87(inFV0)
-            1036:   24(fvec2) VectorTimesScalar 1035 1034
-                              Store 1033(r1) 1036
-            1038:   24(fvec2) Load 87(inFV0)
-            1039:    6(float) Load 85(inF0)
-            1040:   24(fvec2) VectorTimesScalar 1038 1039
-                              Store 1037(r2) 1040
-            1042:   24(fvec2) Load 87(inFV0)
-            1043:   24(fvec2) Load 88(inFV1)
-            1044:    6(float) Dot 1042 1043
-                              Store 1041(r3) 1044
-            1046:   24(fvec2) Load 87(inFV0)
-            1047:          60 Load 89(inFM0)
-            1048:   24(fvec2) VectorTimesMatrix 1046 1047
-                              Store 1045(r4) 1048
-            1050:          60 Load 89(inFM0)
-            1051:   24(fvec2) Load 87(inFV0)
-            1052:   24(fvec2) MatrixTimesVector 1050 1051
-                              Store 1049(r5) 1052
+        1049(r0):      7(ptr) Variable Function
+        1053(r1):     25(ptr) Variable Function
+        1057(r2):     25(ptr) Variable Function
+        1061(r3):      7(ptr) Variable Function
+        1065(r4):     25(ptr) Variable Function
+        1069(r5):     25(ptr) Variable Function
+        1073(r6):     61(ptr) Variable Function
+        1077(r7):     61(ptr) Variable Function
+        1081(r8):     61(ptr) Variable Function
+            1050:    6(float) Load 86(inF1)
+            1051:    6(float) Load 85(inF0)
+            1052:    6(float) FMul 1050 1051
+                              Store 1049(r0) 1052
             1054:    6(float) Load 85(inF0)
-            1055:          60 Load 89(inFM0)
-            1056:          60 MatrixTimesScalar 1055 1054
-                              Store 1053(r6) 1056
-            1058:          60 Load 89(inFM0)
+            1055:   24(fvec2) Load 87(inFV0)
+            1056:   24(fvec2) VectorTimesScalar 1055 1054
+                              Store 1053(r1) 1056
+            1058:   24(fvec2) Load 87(inFV0)
             1059:    6(float) Load 85(inF0)
-            1060:          60 MatrixTimesScalar 1058 1059
-                              Store 1057(r7) 1060
-            1062:          60 Load 90(inFM1)
-            1063:          60 Load 89(inFM0)
-            1064:          60 MatrixTimesMatrix 1062 1063
-                              Store 1061(r8) 1064
+            1060:   24(fvec2) VectorTimesScalar 1058 1059
+                              Store 1057(r2) 1060
+            1062:   24(fvec2) Load 87(inFV0)
+            1063:   24(fvec2) Load 88(inFV1)
+            1064:    6(float) Dot 1062 1063
+                              Store 1061(r3) 1064
+            1066:   24(fvec2) Load 87(inFV0)
+            1067:          60 Load 89(inFM0)
+            1068:   24(fvec2) VectorTimesMatrix 1066 1067
+                              Store 1065(r4) 1068
+            1070:          60 Load 89(inFM0)
+            1071:   24(fvec2) Load 87(inFV0)
+            1072:   24(fvec2) MatrixTimesVector 1070 1071
+                              Store 1069(r5) 1072
+            1074:    6(float) Load 85(inF0)
+            1075:          60 Load 89(inFM0)
+            1076:          60 MatrixTimesScalar 1075 1074
+                              Store 1073(r6) 1076
+            1078:          60 Load 89(inFM0)
+            1079:    6(float) Load 85(inF0)
+            1080:          60 MatrixTimesScalar 1078 1079
+                              Store 1077(r7) 1080
+            1082:          60 Load 90(inFM1)
+            1083:          60 Load 89(inFM0)
+            1084:          60 MatrixTimesMatrix 1082 1083
+                              Store 1081(r8) 1084
                               Return
                               FunctionEnd
 100(TestGenMul3(f1;f1;vf3;vf3;mf33;mf33;):           2 Function None 93
@@ -3946,51 +3998,51 @@
        98(inFM0):     69(ptr) FunctionParameter
        99(inFM1):     69(ptr) FunctionParameter
              101:             Label
-        1065(r0):      7(ptr) Variable Function
-        1069(r1):     37(ptr) Variable Function
-        1073(r2):     37(ptr) Variable Function
-        1077(r3):      7(ptr) Variable Function
-        1081(r4):     37(ptr) Variable Function
-        1085(r5):     37(ptr) Variable Function
-        1089(r6):     69(ptr) Variable Function
-        1093(r7):     69(ptr) Variable Function
-        1097(r8):     69(ptr) Variable Function
-            1066:    6(float) Load 95(inF1)
-            1067:    6(float) Load 94(inF0)
-            1068:    6(float) FMul 1066 1067
-                              Store 1065(r0) 1068
-            1070:    6(float) Load 94(inF0)
-            1071:   36(fvec3) Load 96(inFV0)
-            1072:   36(fvec3) VectorTimesScalar 1071 1070
-                              Store 1069(r1) 1072
-            1074:   36(fvec3) Load 96(inFV0)
-            1075:    6(float) Load 94(inF0)
-            1076:   36(fvec3) VectorTimesScalar 1074 1075
-                              Store 1073(r2) 1076
-            1078:   36(fvec3) Load 96(inFV0)
-            1079:   36(fvec3) Load 97(inFV1)
-            1080:    6(float) Dot 1078 1079
-                              Store 1077(r3) 1080
-            1082:   36(fvec3) Load 96(inFV0)
-            1083:          68 Load 98(inFM0)
-            1084:   36(fvec3) VectorTimesMatrix 1082 1083
-                              Store 1081(r4) 1084
-            1086:          68 Load 98(inFM0)
-            1087:   36(fvec3) Load 96(inFV0)
-            1088:   36(fvec3) MatrixTimesVector 1086 1087
-                              Store 1085(r5) 1088
+        1085(r0):      7(ptr) Variable Function
+        1089(r1):     37(ptr) Variable Function
+        1093(r2):     37(ptr) Variable Function
+        1097(r3):      7(ptr) Variable Function
+        1101(r4):     37(ptr) Variable Function
+        1105(r5):     37(ptr) Variable Function
+        1109(r6):     69(ptr) Variable Function
+        1113(r7):     69(ptr) Variable Function
+        1117(r8):     69(ptr) Variable Function
+            1086:    6(float) Load 95(inF1)
+            1087:    6(float) Load 94(inF0)
+            1088:    6(float) FMul 1086 1087
+                              Store 1085(r0) 1088
             1090:    6(float) Load 94(inF0)
-            1091:          68 Load 98(inFM0)
-            1092:          68 MatrixTimesScalar 1091 1090
-                              Store 1089(r6) 1092
-            1094:          68 Load 98(inFM0)
+            1091:   36(fvec3) Load 96(inFV0)
+            1092:   36(fvec3) VectorTimesScalar 1091 1090
+                              Store 1089(r1) 1092
+            1094:   36(fvec3) Load 96(inFV0)
             1095:    6(float) Load 94(inF0)
-            1096:          68 MatrixTimesScalar 1094 1095
-                              Store 1093(r7) 1096
-            1098:          68 Load 99(inFM1)
-            1099:          68 Load 98(inFM0)
-            1100:          68 MatrixTimesMatrix 1098 1099
-                              Store 1097(r8) 1100
+            1096:   36(fvec3) VectorTimesScalar 1094 1095
+                              Store 1093(r2) 1096
+            1098:   36(fvec3) Load 96(inFV0)
+            1099:   36(fvec3) Load 97(inFV1)
+            1100:    6(float) Dot 1098 1099
+                              Store 1097(r3) 1100
+            1102:   36(fvec3) Load 96(inFV0)
+            1103:          68 Load 98(inFM0)
+            1104:   36(fvec3) VectorTimesMatrix 1102 1103
+                              Store 1101(r4) 1104
+            1106:          68 Load 98(inFM0)
+            1107:   36(fvec3) Load 96(inFV0)
+            1108:   36(fvec3) MatrixTimesVector 1106 1107
+                              Store 1105(r5) 1108
+            1110:    6(float) Load 94(inF0)
+            1111:          68 Load 98(inFM0)
+            1112:          68 MatrixTimesScalar 1111 1110
+                              Store 1109(r6) 1112
+            1114:          68 Load 98(inFM0)
+            1115:    6(float) Load 94(inF0)
+            1116:          68 MatrixTimesScalar 1114 1115
+                              Store 1113(r7) 1116
+            1118:          68 Load 99(inFM1)
+            1119:          68 Load 98(inFM0)
+            1120:          68 MatrixTimesMatrix 1118 1119
+                              Store 1117(r8) 1120
                               Return
                               FunctionEnd
 109(TestGenMul4(f1;f1;vf4;vf4;mf44;mf44;):           2 Function None 102
@@ -4001,51 +4053,51 @@
       107(inFM0):     77(ptr) FunctionParameter
       108(inFM1):     77(ptr) FunctionParameter
              110:             Label
-        1101(r0):      7(ptr) Variable Function
-        1105(r1):     49(ptr) Variable Function
-        1109(r2):     49(ptr) Variable Function
-        1113(r3):      7(ptr) Variable Function
-        1117(r4):     49(ptr) Variable Function
-        1121(r5):     49(ptr) Variable Function
-        1125(r6):     77(ptr) Variable Function
-        1129(r7):     77(ptr) Variable Function
-        1133(r8):     77(ptr) Variable Function
-            1102:    6(float) Load 104(inF1)
-            1103:    6(float) Load 103(inF0)
-            1104:    6(float) FMul 1102 1103
-                              Store 1101(r0) 1104
-            1106:    6(float) Load 103(inF0)
-            1107:   48(fvec4) Load 105(inFV0)
-            1108:   48(fvec4) VectorTimesScalar 1107 1106
-                              Store 1105(r1) 1108
-            1110:   48(fvec4) Load 105(inFV0)
-            1111:    6(float) Load 103(inF0)
-            1112:   48(fvec4) VectorTimesScalar 1110 1111
-                              Store 1109(r2) 1112
-            1114:   48(fvec4) Load 105(inFV0)
-            1115:   48(fvec4) Load 106(inFV1)
-            1116:    6(float) Dot 1114 1115
-                              Store 1113(r3) 1116
-            1118:   48(fvec4) Load 105(inFV0)
-            1119:          76 Load 107(inFM0)
-            1120:   48(fvec4) VectorTimesMatrix 1118 1119
-                              Store 1117(r4) 1120
-            1122:          76 Load 107(inFM0)
-            1123:   48(fvec4) Load 105(inFV0)
-            1124:   48(fvec4) MatrixTimesVector 1122 1123
-                              Store 1121(r5) 1124
+        1121(r0):      7(ptr) Variable Function
+        1125(r1):     49(ptr) Variable Function
+        1129(r2):     49(ptr) Variable Function
+        1133(r3):      7(ptr) Variable Function
+        1137(r4):     49(ptr) Variable Function
+        1141(r5):     49(ptr) Variable Function
+        1145(r6):     77(ptr) Variable Function
+        1149(r7):     77(ptr) Variable Function
+        1153(r8):     77(ptr) Variable Function
+            1122:    6(float) Load 104(inF1)
+            1123:    6(float) Load 103(inF0)
+            1124:    6(float) FMul 1122 1123
+                              Store 1121(r0) 1124
             1126:    6(float) Load 103(inF0)
-            1127:          76 Load 107(inFM0)
-            1128:          76 MatrixTimesScalar 1127 1126
-                              Store 1125(r6) 1128
-            1130:          76 Load 107(inFM0)
+            1127:   48(fvec4) Load 105(inFV0)
+            1128:   48(fvec4) VectorTimesScalar 1127 1126
+                              Store 1125(r1) 1128
+            1130:   48(fvec4) Load 105(inFV0)
             1131:    6(float) Load 103(inF0)
-            1132:          76 MatrixTimesScalar 1130 1131
-                              Store 1129(r7) 1132
-            1134:          76 Load 108(inFM1)
-            1135:          76 Load 107(inFM0)
-            1136:          76 MatrixTimesMatrix 1134 1135
-                              Store 1133(r8) 1136
+            1132:   48(fvec4) VectorTimesScalar 1130 1131
+                              Store 1129(r2) 1132
+            1134:   48(fvec4) Load 105(inFV0)
+            1135:   48(fvec4) Load 106(inFV1)
+            1136:    6(float) Dot 1134 1135
+                              Store 1133(r3) 1136
+            1138:   48(fvec4) Load 105(inFV0)
+            1139:          76 Load 107(inFM0)
+            1140:   48(fvec4) VectorTimesMatrix 1138 1139
+                              Store 1137(r4) 1140
+            1142:          76 Load 107(inFM0)
+            1143:   48(fvec4) Load 105(inFV0)
+            1144:   48(fvec4) MatrixTimesVector 1142 1143
+                              Store 1141(r5) 1144
+            1146:    6(float) Load 103(inF0)
+            1147:          76 Load 107(inFM0)
+            1148:          76 MatrixTimesScalar 1147 1146
+                              Store 1145(r6) 1148
+            1150:          76 Load 107(inFM0)
+            1151:    6(float) Load 103(inF0)
+            1152:          76 MatrixTimesScalar 1150 1151
+                              Store 1149(r7) 1152
+            1154:          76 Load 108(inFM1)
+            1155:          76 Load 107(inFM0)
+            1156:          76 MatrixTimesMatrix 1154 1155
+                              Store 1153(r8) 1156
                               Return
                               FunctionEnd
 129(TestGenMulNxM(f1;f1;vf2;vf3;mf23;mf32;mf33;mf34;mf24;):           2 Function None 119
@@ -4059,90 +4111,90 @@
     127(inFM3x4):    116(ptr) FunctionParameter
     128(inFM2x4):    118(ptr) FunctionParameter
              130:             Label
-       1137(r00):      7(ptr) Variable Function
-       1141(r01):     25(ptr) Variable Function
-       1145(r02):     37(ptr) Variable Function
-       1149(r03):     25(ptr) Variable Function
-       1153(r04):     37(ptr) Variable Function
-       1157(r05):      7(ptr) Variable Function
-       1161(r06):      7(ptr) Variable Function
-       1165(r07):     37(ptr) Variable Function
-       1169(r08):     25(ptr) Variable Function
-       1173(r09):     25(ptr) Variable Function
-       1177(r10):     37(ptr) Variable Function
-       1181(r11):    112(ptr) Variable Function
-       1185(r12):    114(ptr) Variable Function
-       1189(r13):     61(ptr) Variable Function
-       1193(r14):    112(ptr) Variable Function
-       1197(r15):    118(ptr) Variable Function
-       1201(r16):    116(ptr) Variable Function
-            1138:    6(float) Load 121(inF1)
-            1139:    6(float) Load 120(inF0)
-            1140:    6(float) FMul 1138 1139
-                              Store 1137(r00) 1140
-            1142:    6(float) Load 120(inF0)
-            1143:   24(fvec2) Load 122(inFV2)
-            1144:   24(fvec2) VectorTimesScalar 1143 1142
-                              Store 1141(r01) 1144
-            1146:    6(float) Load 120(inF0)
-            1147:   36(fvec3) Load 123(inFV3)
-            1148:   36(fvec3) VectorTimesScalar 1147 1146
-                              Store 1145(r02) 1148
-            1150:   24(fvec2) Load 122(inFV2)
-            1151:    6(float) Load 120(inF0)
-            1152:   24(fvec2) VectorTimesScalar 1150 1151
-                              Store 1149(r03) 1152
-            1154:   36(fvec3) Load 123(inFV3)
-            1155:    6(float) Load 120(inF0)
-            1156:   36(fvec3) VectorTimesScalar 1154 1155
-                              Store 1153(r04) 1156
-            1158:   24(fvec2) Load 122(inFV2)
-            1159:   24(fvec2) Load 122(inFV2)
-            1160:    6(float) Dot 1158 1159
-                              Store 1157(r05) 1160
-            1162:   36(fvec3) Load 123(inFV3)
-            1163:   36(fvec3) Load 123(inFV3)
-            1164:    6(float) Dot 1162 1163
-                              Store 1161(r06) 1164
-            1166:         111 Load 124(inFM2x3)
-            1167:   24(fvec2) Load 122(inFV2)
-            1168:   36(fvec3) MatrixTimesVector 1166 1167
-                              Store 1165(r07) 1168
-            1170:         113 Load 125(inFM3x2)
-            1171:   36(fvec3) Load 123(inFV3)
-            1172:   24(fvec2) MatrixTimesVector 1170 1171
-                              Store 1169(r08) 1172
+       1157(r00):      7(ptr) Variable Function
+       1161(r01):     25(ptr) Variable Function
+       1165(r02):     37(ptr) Variable Function
+       1169(r03):     25(ptr) Variable Function
+       1173(r04):     37(ptr) Variable Function
+       1177(r05):      7(ptr) Variable Function
+       1181(r06):      7(ptr) Variable Function
+       1185(r07):     37(ptr) Variable Function
+       1189(r08):     25(ptr) Variable Function
+       1193(r09):     25(ptr) Variable Function
+       1197(r10):     37(ptr) Variable Function
+       1201(r11):    112(ptr) Variable Function
+       1205(r12):    114(ptr) Variable Function
+       1209(r13):     61(ptr) Variable Function
+       1213(r14):    112(ptr) Variable Function
+       1217(r15):    118(ptr) Variable Function
+       1221(r16):    116(ptr) Variable Function
+            1158:    6(float) Load 121(inF1)
+            1159:    6(float) Load 120(inF0)
+            1160:    6(float) FMul 1158 1159
+                              Store 1157(r00) 1160
+            1162:    6(float) Load 120(inF0)
+            1163:   24(fvec2) Load 122(inFV2)
+            1164:   24(fvec2) VectorTimesScalar 1163 1162
+                              Store 1161(r01) 1164
+            1166:    6(float) Load 120(inF0)
+            1167:   36(fvec3) Load 123(inFV3)
+            1168:   36(fvec3) VectorTimesScalar 1167 1166
+                              Store 1165(r02) 1168
+            1170:   24(fvec2) Load 122(inFV2)
+            1171:    6(float) Load 120(inF0)
+            1172:   24(fvec2) VectorTimesScalar 1170 1171
+                              Store 1169(r03) 1172
             1174:   36(fvec3) Load 123(inFV3)
-            1175:         111 Load 124(inFM2x3)
-            1176:   24(fvec2) VectorTimesMatrix 1174 1175
-                              Store 1173(r09) 1176
+            1175:    6(float) Load 120(inF0)
+            1176:   36(fvec3) VectorTimesScalar 1174 1175
+                              Store 1173(r04) 1176
             1178:   24(fvec2) Load 122(inFV2)
-            1179:         113 Load 125(inFM3x2)
-            1180:   36(fvec3) VectorTimesMatrix 1178 1179
-                              Store 1177(r10) 1180
-            1182:    6(float) Load 120(inF0)
-            1183:         111 Load 124(inFM2x3)
-            1184:         111 MatrixTimesScalar 1183 1182
-                              Store 1181(r11) 1184
-            1186:    6(float) Load 120(inF0)
-            1187:         113 Load 125(inFM3x2)
-            1188:         113 MatrixTimesScalar 1187 1186
-                              Store 1185(r12) 1188
+            1179:   24(fvec2) Load 122(inFV2)
+            1180:    6(float) Dot 1178 1179
+                              Store 1177(r05) 1180
+            1182:   36(fvec3) Load 123(inFV3)
+            1183:   36(fvec3) Load 123(inFV3)
+            1184:    6(float) Dot 1182 1183
+                              Store 1181(r06) 1184
+            1186:         111 Load 124(inFM2x3)
+            1187:   24(fvec2) Load 122(inFV2)
+            1188:   36(fvec3) MatrixTimesVector 1186 1187
+                              Store 1185(r07) 1188
             1190:         113 Load 125(inFM3x2)
-            1191:         111 Load 124(inFM2x3)
-            1192:          60 MatrixTimesMatrix 1190 1191
-                              Store 1189(r13) 1192
-            1194:          68 Load 126(inFM3x3)
+            1191:   36(fvec3) Load 123(inFV3)
+            1192:   24(fvec2) MatrixTimesVector 1190 1191
+                              Store 1189(r08) 1192
+            1194:   36(fvec3) Load 123(inFV3)
             1195:         111 Load 124(inFM2x3)
-            1196:         111 MatrixTimesMatrix 1194 1195
-                              Store 1193(r14) 1196
-            1198:         115 Load 127(inFM3x4)
-            1199:         111 Load 124(inFM2x3)
-            1200:         117 MatrixTimesMatrix 1198 1199
-                              Store 1197(r15) 1200
-            1202:         117 Load 128(inFM2x4)
-            1203:         113 Load 125(inFM3x2)
-            1204:         115 MatrixTimesMatrix 1202 1203
-                              Store 1201(r16) 1204
+            1196:   24(fvec2) VectorTimesMatrix 1194 1195
+                              Store 1193(r09) 1196
+            1198:   24(fvec2) Load 122(inFV2)
+            1199:         113 Load 125(inFM3x2)
+            1200:   36(fvec3) VectorTimesMatrix 1198 1199
+                              Store 1197(r10) 1200
+            1202:    6(float) Load 120(inF0)
+            1203:         111 Load 124(inFM2x3)
+            1204:         111 MatrixTimesScalar 1203 1202
+                              Store 1201(r11) 1204
+            1206:    6(float) Load 120(inF0)
+            1207:         113 Load 125(inFM3x2)
+            1208:         113 MatrixTimesScalar 1207 1206
+                              Store 1205(r12) 1208
+            1210:         113 Load 125(inFM3x2)
+            1211:         111 Load 124(inFM2x3)
+            1212:          60 MatrixTimesMatrix 1210 1211
+                              Store 1209(r13) 1212
+            1214:          68 Load 126(inFM3x3)
+            1215:         111 Load 124(inFM2x3)
+            1216:         111 MatrixTimesMatrix 1214 1215
+                              Store 1213(r14) 1216
+            1218:         115 Load 127(inFM3x4)
+            1219:         111 Load 124(inFM2x3)
+            1220:         117 MatrixTimesMatrix 1218 1219
+                              Store 1217(r15) 1220
+            1222:         117 Load 128(inFM2x4)
+            1223:         113 Load 125(inFM3x2)
+            1224:         115 MatrixTimesMatrix 1222 1223
+                              Store 1221(r16) 1224
                               Return
                               FunctionEnd
diff --git a/Test/baseResults/hlsl.isfinite.frag.out b/Test/baseResults/hlsl.isfinite.frag.out
index 0d6d8d2..6fee951 100644
--- a/Test/baseResults/hlsl.isfinite.frag.out
+++ b/Test/baseResults/hlsl.isfinite.frag.out
@@ -172,35 +172,35 @@
 0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80001
-// Id's are bound by 95
+// Generated by (magic number): 80007
+// Id's are bound by 85
 
                               Capability Shader
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "main" 93
+                              EntryPoint Fragment 4  "main" 83
                               ExecutionMode 4 OriginUpperLeft
                               Source HLSL 500
                               Name 4  "main"
                               Name 11  "test1(f1;"
                               Name 10  "v"
                               Name 15  "@main("
-                              Name 22  "@finitetmp"
-                              Name 36  "@finitetmp"
-                              Name 39  "$Global"
-                              MemberName 39($Global) 0  "f"
-                              MemberName 39($Global) 1  "f2"
-                              MemberName 39($Global) 2  "f3"
-                              Name 41  ""
-                              Name 57  "@finitetmp"
-                              Name 73  "@finitetmp"
-                              Name 93  "@entryPointOutput"
-                              MemberDecorate 39($Global) 0 Offset 0
-                              MemberDecorate 39($Global) 1 Offset 4
-                              MemberDecorate 39($Global) 2 Offset 16
-                              Decorate 39($Global) Block
-                              Decorate 41 DescriptorSet 0
-                              Decorate 93(@entryPointOutput) Location 0
+                              Name 20  "@finitetmp"
+                              Name 32  "@finitetmp"
+                              Name 35  "$Global"
+                              MemberName 35($Global) 0  "f"
+                              MemberName 35($Global) 1  "f2"
+                              MemberName 35($Global) 2  "f3"
+                              Name 37  ""
+                              Name 51  "@finitetmp"
+                              Name 65  "@finitetmp"
+                              Name 83  "@entryPointOutput"
+                              MemberDecorate 35($Global) 0 Offset 0
+                              MemberDecorate 35($Global) 1 Offset 8
+                              MemberDecorate 35($Global) 2 Offset 16
+                              Decorate 35($Global) Block
+                              Decorate 37 DescriptorSet 0
+                              Decorate 83(@entryPointOutput) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -209,110 +209,85 @@
                9:             TypeFunction 8(bool) 7(ptr)
               13:             TypeVector 6(float) 4
               14:             TypeFunction 13(fvec4)
-              37:             TypeVector 6(float) 2
-              38:             TypeVector 6(float) 3
-     39($Global):             TypeStruct 6(float) 37(fvec2) 38(fvec3)
-              40:             TypePointer Uniform 39($Global)
-              41:     40(ptr) Variable Uniform
-              42:             TypeInt 32 1
-              43:     42(int) Constant 0
-              44:             TypePointer Uniform 6(float)
-              56:             TypePointer Function 37(fvec2)
-              58:     42(int) Constant 1
-              59:             TypePointer Uniform 37(fvec2)
-              63:             TypeVector 8(bool) 2
-              72:             TypePointer Function 38(fvec3)
-              74:     42(int) Constant 2
-              75:             TypePointer Uniform 38(fvec3)
-              79:             TypeVector 8(bool) 3
-              88:    6(float) Constant 0
-              89:   13(fvec4) ConstantComposite 88 88 88 88
-              92:             TypePointer Output 13(fvec4)
-93(@entryPointOutput):     92(ptr) Variable Output
+              33:             TypeVector 6(float) 2
+              34:             TypeVector 6(float) 3
+     35($Global):             TypeStruct 6(float) 33(fvec2) 34(fvec3)
+              36:             TypePointer Uniform 35($Global)
+              37:     36(ptr) Variable Uniform
+              38:             TypeInt 32 1
+              39:     38(int) Constant 0
+              40:             TypePointer Uniform 6(float)
+              50:             TypePointer Function 33(fvec2)
+              52:     38(int) Constant 1
+              53:             TypePointer Uniform 33(fvec2)
+              57:             TypeVector 8(bool) 2
+              64:             TypePointer Function 34(fvec3)
+              66:     38(int) Constant 2
+              67:             TypePointer Uniform 34(fvec3)
+              71:             TypeVector 8(bool) 3
+              78:    6(float) Constant 0
+              79:   13(fvec4) ConstantComposite 78 78 78 78
+              82:             TypePointer Output 13(fvec4)
+83(@entryPointOutput):     82(ptr) Variable Output
          4(main):           2 Function None 3
                5:             Label
-              94:   13(fvec4) FunctionCall 15(@main()
-                              Store 93(@entryPointOutput) 94
+              84:   13(fvec4) FunctionCall 15(@main()
+                              Store 83(@entryPointOutput) 84
                               Return
                               FunctionEnd
    11(test1(f1;):     8(bool) Function None 9
            10(v):      7(ptr) FunctionParameter
               12:             Label
-  22(@finitetmp):      7(ptr) Variable Function
+  20(@finitetmp):      7(ptr) Variable Function
               17:    6(float) Load 10(v)
               18:     8(bool) IsNan 17
               19:     8(bool) LogicalNot 18
-                              SelectionMerge 21 None
-                              BranchConditional 19 20 21
-              20:               Label
-              23:    6(float)   Load 10(v)
-                                Store 22(@finitetmp) 23
-              24:    6(float)   Load 22(@finitetmp)
-              25:     8(bool)   IsNan 24
-              26:     8(bool)   LogicalNot 25
-                                SelectionMerge 28 None
-                                BranchConditional 26 27 28
-              27:                 Label
-              29:    6(float)     Load 22(@finitetmp)
-              30:     8(bool)     IsInf 29
-              31:     8(bool)     LogicalNot 30
-                                  Branch 28
-              28:               Label
-              32:     8(bool)   Phi 26 20 31 27
-                                Branch 21
-              21:             Label
-              33:     8(bool) Phi 19 12 32 28
-                              ReturnValue 33
+              21:    6(float) Load 10(v)
+                              Store 20(@finitetmp) 21
+              22:    6(float) Load 20(@finitetmp)
+              23:     8(bool) IsNan 22
+              24:     8(bool) LogicalNot 23
+              25:    6(float) Load 20(@finitetmp)
+              26:     8(bool) IsInf 25
+              27:     8(bool) LogicalNot 26
+              28:     8(bool) LogicalAnd 24 27
+              29:     8(bool) LogicalAnd 19 28
+                              ReturnValue 29
                               FunctionEnd
       15(@main():   13(fvec4) Function None 14
               16:             Label
-  36(@finitetmp):      7(ptr) Variable Function
-  57(@finitetmp):     56(ptr) Variable Function
-  73(@finitetmp):     72(ptr) Variable Function
-              45:     44(ptr) AccessChain 41 43
-              46:    6(float) Load 45
-                              Store 36(@finitetmp) 46
-              47:    6(float) Load 36(@finitetmp)
-              48:     8(bool) IsNan 47
-              49:     8(bool) LogicalNot 48
-                              SelectionMerge 51 None
-                              BranchConditional 49 50 51
-              50:               Label
-              52:    6(float)   Load 36(@finitetmp)
-              53:     8(bool)   IsInf 52
-              54:     8(bool)   LogicalNot 53
-                                Branch 51
-              51:             Label
-              55:     8(bool) Phi 49 16 54 50
-              60:     59(ptr) AccessChain 41 58
-              61:   37(fvec2) Load 60
-                              Store 57(@finitetmp) 61
-              62:   37(fvec2) Load 57(@finitetmp)
-              64:   63(bvec2) IsNan 62
-              65:   63(bvec2) LogicalNot 64
-                              SelectionMerge 67 None
-                              BranchConditional 65 66 67
-              66:               Label
-              68:   37(fvec2)   Load 57(@finitetmp)
-              69:   63(bvec2)   IsInf 68
-              70:   63(bvec2)   LogicalNot 69
-                                Branch 67
-              67:             Label
-              71:     8(bool) Phi 65 51 70 66
-              76:     75(ptr) AccessChain 41 74
-              77:   38(fvec3) Load 76
-                              Store 73(@finitetmp) 77
-              78:   38(fvec3) Load 73(@finitetmp)
-              80:   79(bvec3) IsNan 78
-              81:   79(bvec3) LogicalNot 80
-                              SelectionMerge 83 None
-                              BranchConditional 81 82 83
-              82:               Label
-              84:   38(fvec3)   Load 73(@finitetmp)
-              85:   79(bvec3)   IsInf 84
-              86:   79(bvec3)   LogicalNot 85
-                                Branch 83
-              83:             Label
-              87:     8(bool) Phi 81 67 86 82
-                              ReturnValue 89
+  32(@finitetmp):      7(ptr) Variable Function
+  51(@finitetmp):     50(ptr) Variable Function
+  65(@finitetmp):     64(ptr) Variable Function
+              41:     40(ptr) AccessChain 37 39
+              42:    6(float) Load 41
+                              Store 32(@finitetmp) 42
+              43:    6(float) Load 32(@finitetmp)
+              44:     8(bool) IsNan 43
+              45:     8(bool) LogicalNot 44
+              46:    6(float) Load 32(@finitetmp)
+              47:     8(bool) IsInf 46
+              48:     8(bool) LogicalNot 47
+              49:     8(bool) LogicalAnd 45 48
+              54:     53(ptr) AccessChain 37 52
+              55:   33(fvec2) Load 54
+                              Store 51(@finitetmp) 55
+              56:   33(fvec2) Load 51(@finitetmp)
+              58:   57(bvec2) IsNan 56
+              59:   57(bvec2) LogicalNot 58
+              60:   33(fvec2) Load 51(@finitetmp)
+              61:   57(bvec2) IsInf 60
+              62:   57(bvec2) LogicalNot 61
+              63:   57(bvec2) LogicalAnd 59 62
+              68:     67(ptr) AccessChain 37 66
+              69:   34(fvec3) Load 68
+                              Store 65(@finitetmp) 69
+              70:   34(fvec3) Load 65(@finitetmp)
+              72:   71(bvec3) IsNan 70
+              73:   71(bvec3) LogicalNot 72
+              74:   34(fvec3) Load 65(@finitetmp)
+              75:   71(bvec3) IsInf 74
+              76:   71(bvec3) LogicalNot 75
+              77:   71(bvec3) LogicalAnd 73 76
+                              ReturnValue 79
                               FunctionEnd
diff --git a/Test/baseResults/hlsl.layout.frag.out b/Test/baseResults/hlsl.layout.frag.out
old mode 100755
new mode 100644
index bfbfaaf..010c2ec
--- a/Test/baseResults/hlsl.layout.frag.out
+++ b/Test/baseResults/hlsl.layout.frag.out
@@ -6,23 +6,33 @@
 0:16    Function Parameters: 
 0:16      'input' ( in 4-component vector of float)
 0:?     Sequence
-0:17      Branch: Return with expression
-0:17        add ( temp 4-component vector of float)
-0:17          add ( temp 4-component vector of float)
-0:17            add ( temp 4-component vector of float)
-0:17              'input' ( in 4-component vector of float)
-0:17              v1: direct index for structure (layout( row_major std430 offset=16) buffer 4-component vector of float)
-0:17                'anon@0' (layout( set=3 binding=5 row_major std430) readonly buffer block{layout( row_major std430 offset=16) buffer 4-component vector of float v1})
-0:17                Constant:
-0:17                  0 (const uint)
-0:17            v5: direct index for structure (layout( row_major std430 offset=0) buffer 4-component vector of float)
-0:17              'anon@1' (layout( row_major std430 push_constant) readonly buffer block{layout( row_major std430 offset=0) buffer 4-component vector of float v5})
-0:17              Constant:
-0:17                0 (const uint)
-0:17          v1PostLayout: direct index for structure (layout( row_major std430 offset=16) buffer 4-component vector of float)
-0:17            'anon@2' (layout( set=4 binding=7 row_major std430) readonly buffer block{layout( row_major std430 offset=16) buffer 4-component vector of float v1PostLayout})
-0:17            Constant:
-0:17              0 (const uint)
+0:17      Sequence
+0:17        move second child to first child ( temp 4-component vector of float)
+0:17          'layout' ( temp 4-component vector of float)
+0:17          Constant:
+0:17            2.000000
+0:17            2.000000
+0:17            2.000000
+0:17            2.000000
+0:18      Branch: Return with expression
+0:18        add ( temp 4-component vector of float)
+0:18          add ( temp 4-component vector of float)
+0:18            add ( temp 4-component vector of float)
+0:18              'input' ( in 4-component vector of float)
+0:18              v1: direct index for structure (layout( row_major std430 offset=16) buffer 4-component vector of float)
+0:18                'anon@0' (layout( set=3 binding=5 row_major std430) readonly buffer block{layout( row_major std430 offset=16) buffer 4-component vector of float v1})
+0:18                Constant:
+0:18                  0 (const uint)
+0:18            v5: direct index for structure (layout( row_major std430 offset=0) buffer 4-component vector of float)
+0:18              'anon@1' (layout( row_major std430 push_constant) readonly buffer block{layout( row_major std430 offset=0) buffer 4-component vector of float v5})
+0:18              Constant:
+0:18                0 (const uint)
+0:18          component-wise multiply ( temp 4-component vector of float)
+0:18            v1PostLayout: direct index for structure (layout( row_major std430 offset=16) buffer 4-component vector of float)
+0:18              'anon@2' (layout( set=4 binding=7 row_major std430) readonly buffer block{layout( row_major std430 offset=16) buffer 4-component vector of float v1PostLayout})
+0:18              Constant:
+0:18                0 (const uint)
+0:18            'layout' ( temp 4-component vector of float)
 0:?   Linker Objects
 0:?     'anon@0' (layout( set=3 binding=5 row_major std430) readonly buffer block{layout( row_major std430 offset=16) buffer 4-component vector of float v1})
 0:?     'anon@1' (layout( row_major std430 push_constant) readonly buffer block{layout( row_major std430 offset=0) buffer 4-component vector of float v5})
@@ -42,23 +52,33 @@
 0:16    Function Parameters: 
 0:16      'input' ( in 4-component vector of float)
 0:?     Sequence
-0:17      Branch: Return with expression
-0:17        add ( temp 4-component vector of float)
-0:17          add ( temp 4-component vector of float)
-0:17            add ( temp 4-component vector of float)
-0:17              'input' ( in 4-component vector of float)
-0:17              v1: direct index for structure (layout( row_major std430 offset=16) buffer 4-component vector of float)
-0:17                'anon@0' (layout( set=3 binding=5 row_major std430) readonly buffer block{layout( row_major std430 offset=16) buffer 4-component vector of float v1})
-0:17                Constant:
-0:17                  0 (const uint)
-0:17            v5: direct index for structure (layout( row_major std430 offset=0) buffer 4-component vector of float)
-0:17              'anon@1' (layout( row_major std430 push_constant) readonly buffer block{layout( row_major std430 offset=0) buffer 4-component vector of float v5})
-0:17              Constant:
-0:17                0 (const uint)
-0:17          v1PostLayout: direct index for structure (layout( row_major std430 offset=16) buffer 4-component vector of float)
-0:17            'anon@2' (layout( set=4 binding=7 row_major std430) readonly buffer block{layout( row_major std430 offset=16) buffer 4-component vector of float v1PostLayout})
-0:17            Constant:
-0:17              0 (const uint)
+0:17      Sequence
+0:17        move second child to first child ( temp 4-component vector of float)
+0:17          'layout' ( temp 4-component vector of float)
+0:17          Constant:
+0:17            2.000000
+0:17            2.000000
+0:17            2.000000
+0:17            2.000000
+0:18      Branch: Return with expression
+0:18        add ( temp 4-component vector of float)
+0:18          add ( temp 4-component vector of float)
+0:18            add ( temp 4-component vector of float)
+0:18              'input' ( in 4-component vector of float)
+0:18              v1: direct index for structure (layout( row_major std430 offset=16) buffer 4-component vector of float)
+0:18                'anon@0' (layout( set=3 binding=5 row_major std430) readonly buffer block{layout( row_major std430 offset=16) buffer 4-component vector of float v1})
+0:18                Constant:
+0:18                  0 (const uint)
+0:18            v5: direct index for structure (layout( row_major std430 offset=0) buffer 4-component vector of float)
+0:18              'anon@1' (layout( row_major std430 push_constant) readonly buffer block{layout( row_major std430 offset=0) buffer 4-component vector of float v5})
+0:18              Constant:
+0:18                0 (const uint)
+0:18          component-wise multiply ( temp 4-component vector of float)
+0:18            v1PostLayout: direct index for structure (layout( row_major std430 offset=16) buffer 4-component vector of float)
+0:18              'anon@2' (layout( set=4 binding=7 row_major std430) readonly buffer block{layout( row_major std430 offset=16) buffer 4-component vector of float v1PostLayout})
+0:18              Constant:
+0:18                0 (const uint)
+0:18            'layout' ( temp 4-component vector of float)
 0:?   Linker Objects
 0:?     'anon@0' (layout( set=3 binding=5 row_major std430) readonly buffer block{layout( row_major std430 offset=16) buffer 4-component vector of float v1})
 0:?     'anon@1' (layout( row_major std430 push_constant) readonly buffer block{layout( row_major std430 offset=0) buffer 4-component vector of float v5})
@@ -67,8 +87,8 @@
 0:?     'anon@2' (layout( set=4 binding=7 row_major std430) readonly buffer block{layout( row_major std430 offset=16) buffer 4-component vector of float v1PostLayout})
 
 // Module Version 10000
-// Generated by (magic number): 80001
-// Id's are bound by 39
+// Generated by (magic number): 80007
+// Id's are bound by 44
 
                               Capability Shader
                1:             ExtInstImport  "GLSL.std.450"
@@ -79,50 +99,53 @@
                               Name 4  "main"
                               Name 11  "PixelShaderFunction(vf4;"
                               Name 10  "input"
-                              Name 14  "tbufName"
-                              MemberName 14(tbufName) 0  "v1"
-                              Name 16  ""
-                              Name 23  "tbufName2"
-                              MemberName 23(tbufName2) 0  "v5"
-                              Name 25  ""
-                              Name 30  "tbufName2"
-                              MemberName 30(tbufName2) 0  "v1PostLayout"
-                              Name 32  ""
-                              Name 38  "specConst"
-                              MemberDecorate 14(tbufName) 0 NonWritable
-                              MemberDecorate 14(tbufName) 0 Offset 16
-                              Decorate 14(tbufName) BufferBlock
-                              Decorate 16 DescriptorSet 3
-                              Decorate 16 Binding 5
-                              MemberDecorate 23(tbufName2) 0 NonWritable
-                              MemberDecorate 23(tbufName2) 0 Offset 0
-                              Decorate 23(tbufName2) BufferBlock
-                              MemberDecorate 30(tbufName2) 0 NonWritable
-                              MemberDecorate 30(tbufName2) 0 Offset 16
-                              Decorate 30(tbufName2) BufferBlock
-                              Decorate 32 DescriptorSet 4
-                              Decorate 32 Binding 7
-                              Decorate 38(specConst) SpecId 17
+                              Name 13  "layout"
+                              Name 17  "tbufName"
+                              MemberName 17(tbufName) 0  "v1"
+                              Name 19  ""
+                              Name 26  "tbufName2"
+                              MemberName 26(tbufName2) 0  "v5"
+                              Name 28  ""
+                              Name 33  "tbufName2"
+                              MemberName 33(tbufName2) 0  "v1PostLayout"
+                              Name 35  ""
+                              Name 43  "specConst"
+                              MemberDecorate 17(tbufName) 0 NonWritable
+                              MemberDecorate 17(tbufName) 0 Offset 16
+                              Decorate 17(tbufName) BufferBlock
+                              Decorate 19 DescriptorSet 3
+                              Decorate 19 Binding 5
+                              MemberDecorate 26(tbufName2) 0 NonWritable
+                              MemberDecorate 26(tbufName2) 0 Offset 0
+                              Decorate 26(tbufName2) BufferBlock
+                              MemberDecorate 33(tbufName2) 0 NonWritable
+                              MemberDecorate 33(tbufName2) 0 Offset 16
+                              Decorate 33(tbufName2) BufferBlock
+                              Decorate 35 DescriptorSet 4
+                              Decorate 35 Binding 7
+                              Decorate 43(specConst) SpecId 17
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
                7:             TypeVector 6(float) 4
                8:             TypePointer Function 7(fvec4)
                9:             TypeFunction 7(fvec4) 8(ptr)
-    14(tbufName):             TypeStruct 7(fvec4)
-              15:             TypePointer Uniform 14(tbufName)
-              16:     15(ptr) Variable Uniform
-              17:             TypeInt 32 1
-              18:     17(int) Constant 0
-              19:             TypePointer Uniform 7(fvec4)
-   23(tbufName2):             TypeStruct 7(fvec4)
-              24:             TypePointer PushConstant 23(tbufName2)
-              25:     24(ptr) Variable PushConstant
-              26:             TypePointer PushConstant 7(fvec4)
-   30(tbufName2):             TypeStruct 7(fvec4)
-              31:             TypePointer Uniform 30(tbufName2)
-              32:     31(ptr) Variable Uniform
-   38(specConst):     17(int) SpecConstant 10
+              14:    6(float) Constant 1073741824
+              15:    7(fvec4) ConstantComposite 14 14 14 14
+    17(tbufName):             TypeStruct 7(fvec4)
+              18:             TypePointer Uniform 17(tbufName)
+              19:     18(ptr) Variable Uniform
+              20:             TypeInt 32 1
+              21:     20(int) Constant 0
+              22:             TypePointer Uniform 7(fvec4)
+   26(tbufName2):             TypeStruct 7(fvec4)
+              27:             TypePointer PushConstant 26(tbufName2)
+              28:     27(ptr) Variable PushConstant
+              29:             TypePointer PushConstant 7(fvec4)
+   33(tbufName2):             TypeStruct 7(fvec4)
+              34:             TypePointer Uniform 33(tbufName2)
+              35:     34(ptr) Variable Uniform
+   43(specConst):     20(int) SpecConstant 10
          4(main):           2 Function None 3
                5:             Label
                               Return
@@ -130,15 +153,19 @@
 11(PixelShaderFunction(vf4;):    7(fvec4) Function None 9
        10(input):      8(ptr) FunctionParameter
               12:             Label
-              13:    7(fvec4) Load 10(input)
-              20:     19(ptr) AccessChain 16 18
-              21:    7(fvec4) Load 20
-              22:    7(fvec4) FAdd 13 21
-              27:     26(ptr) AccessChain 25 18
-              28:    7(fvec4) Load 27
-              29:    7(fvec4) FAdd 22 28
-              33:     19(ptr) AccessChain 32 18
-              34:    7(fvec4) Load 33
-              35:    7(fvec4) FAdd 29 34
-                              ReturnValue 35
+      13(layout):      8(ptr) Variable Function
+                              Store 13(layout) 15
+              16:    7(fvec4) Load 10(input)
+              23:     22(ptr) AccessChain 19 21
+              24:    7(fvec4) Load 23
+              25:    7(fvec4) FAdd 16 24
+              30:     29(ptr) AccessChain 28 21
+              31:    7(fvec4) Load 30
+              32:    7(fvec4) FAdd 25 31
+              36:     22(ptr) AccessChain 35 21
+              37:    7(fvec4) Load 36
+              38:    7(fvec4) Load 13(layout)
+              39:    7(fvec4) FMul 37 38
+              40:    7(fvec4) FAdd 32 39
+                              ReturnValue 40
                               FunctionEnd
diff --git a/Test/baseResults/hlsl.layoutOverride.vert.out b/Test/baseResults/hlsl.layoutOverride.vert.out
new file mode 100644
index 0000000..0db2011
--- /dev/null
+++ b/Test/baseResults/hlsl.layoutOverride.vert.out
@@ -0,0 +1,104 @@
+hlsl.layoutOverride.vert
+Shader version: 500
+0:? Sequence
+0:5  Function Definition: @main( ( temp 4-component vector of float)
+0:5    Function Parameters: 
+0:?     Sequence
+0:6      Branch: Return with expression
+0:6        texture ( temp 4-component vector of float)
+0:6          Construct combined texture-sampler ( temp sampler2D)
+0:6            'tex' (layout( set=2 binding=0) uniform texture2D)
+0:6            'samp' ( uniform sampler)
+0:?           Constant:
+0:?             0.200000
+0:?             0.300000
+0:5  Function Definition: main( ( temp void)
+0:5    Function Parameters: 
+0:?     Sequence
+0:5      move second child to first child ( temp 4-component vector of float)
+0:?         '@entryPointOutput' ( out 4-component vector of float Position)
+0:5        Function Call: @main( ( temp 4-component vector of float)
+0:?   Linker Objects
+0:?     'tex' (layout( set=2 binding=0) uniform texture2D)
+0:?     'samp' ( uniform sampler)
+0:?     '@entryPointOutput' ( out 4-component vector of float Position)
+
+
+Linked vertex stage:
+
+
+Shader version: 500
+0:? Sequence
+0:5  Function Definition: @main( ( temp 4-component vector of float)
+0:5    Function Parameters: 
+0:?     Sequence
+0:6      Branch: Return with expression
+0:6        texture ( temp 4-component vector of float)
+0:6          Construct combined texture-sampler ( temp sampler2D)
+0:6            'tex' (layout( set=2 binding=0) uniform texture2D)
+0:6            'samp' ( uniform sampler)
+0:?           Constant:
+0:?             0.200000
+0:?             0.300000
+0:5  Function Definition: main( ( temp void)
+0:5    Function Parameters: 
+0:?     Sequence
+0:5      move second child to first child ( temp 4-component vector of float)
+0:?         '@entryPointOutput' ( out 4-component vector of float Position)
+0:5        Function Call: @main( ( temp 4-component vector of float)
+0:?   Linker Objects
+0:?     'tex' (layout( set=2 binding=0) uniform texture2D)
+0:?     'samp' ( uniform sampler)
+0:?     '@entryPointOutput' ( out 4-component vector of float Position)
+
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 32
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Vertex 4  "main" 30
+                              Source HLSL 500
+                              Name 4  "main"
+                              Name 9  "@main("
+                              Name 13  "tex"
+                              Name 17  "samp"
+                              Name 30  "@entryPointOutput"
+                              Decorate 13(tex) DescriptorSet 2
+                              Decorate 13(tex) Binding 0
+                              Decorate 17(samp) DescriptorSet 0
+                              Decorate 30(@entryPointOutput) BuiltIn Position
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+               8:             TypeFunction 7(fvec4)
+              11:             TypeImage 6(float) 2D sampled format:Unknown
+              12:             TypePointer UniformConstant 11
+         13(tex):     12(ptr) Variable UniformConstant
+              15:             TypeSampler
+              16:             TypePointer UniformConstant 15
+        17(samp):     16(ptr) Variable UniformConstant
+              19:             TypeSampledImage 11
+              21:             TypeVector 6(float) 2
+              22:    6(float) Constant 1045220557
+              23:    6(float) Constant 1050253722
+              24:   21(fvec2) ConstantComposite 22 23
+              25:    6(float) Constant 0
+              29:             TypePointer Output 7(fvec4)
+30(@entryPointOutput):     29(ptr) Variable Output
+         4(main):           2 Function None 3
+               5:             Label
+              31:    7(fvec4) FunctionCall 9(@main()
+                              Store 30(@entryPointOutput) 31
+                              Return
+                              FunctionEnd
+       9(@main():    7(fvec4) Function None 8
+              10:             Label
+              14:          11 Load 13(tex)
+              18:          15 Load 17(samp)
+              20:          19 SampledImage 14 18
+              26:    7(fvec4) ImageSampleExplicitLod 20 24 Lod 25
+                              ReturnValue 26
+                              FunctionEnd
diff --git a/Test/baseResults/hlsl.load.2dms.dx10.frag.out b/Test/baseResults/hlsl.load.2dms.dx10.frag.out
index 712541a..2acf3d4 100644
--- a/Test/baseResults/hlsl.load.2dms.dx10.frag.out
+++ b/Test/baseResults/hlsl.load.2dms.dx10.frag.out
@@ -1,6 +1,7 @@
 hlsl.load.2dms.dx10.frag
 Shader version: 500
 gl_FragCoord origin is upper left
+using depth_any
 0:? Sequence
 0:28  Function Definition: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:28    Function Parameters: 
@@ -152,13 +153,13 @@
 0:28          'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:28          Function Call: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:28        move second child to first child ( temp 4-component vector of float)
-0:?           'Color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 0:28          Color: direct index for structure ( temp 4-component vector of float)
 0:28            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:28            Constant:
 0:28              0 (const int)
 0:28        move second child to first child ( temp float)
-0:?           'Depth' ( out float FragDepth)
+0:?           '@entryPointOutput.Depth' ( out float FragDepth)
 0:28          Depth: direct index for structure ( temp float)
 0:28            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:28            Constant:
@@ -172,8 +173,8 @@
 0:?     'g_tTex2dmsi4a' ( uniform itexture2DMSArray)
 0:?     'g_tTex2dmsu4a' ( uniform utexture2DMSArray)
 0:?     'anon@0' (layout( row_major std140) uniform block{ uniform int c1,  uniform 2-component vector of int c2,  uniform 3-component vector of int c3,  uniform 4-component vector of int c4,  uniform int o1,  uniform 2-component vector of int o2,  uniform 3-component vector of int o3,  uniform 4-component vector of int o4})
-0:?     'Color' (layout( location=0) out 4-component vector of float)
-0:?     'Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 
 Linked fragment stage:
@@ -181,6 +182,7 @@
 
 Shader version: 500
 gl_FragCoord origin is upper left
+using depth_any
 0:? Sequence
 0:28  Function Definition: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:28    Function Parameters: 
@@ -332,13 +334,13 @@
 0:28          'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:28          Function Call: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:28        move second child to first child ( temp 4-component vector of float)
-0:?           'Color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 0:28          Color: direct index for structure ( temp 4-component vector of float)
 0:28            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:28            Constant:
 0:28              0 (const int)
 0:28        move second child to first child ( temp float)
-0:?           'Depth' ( out float FragDepth)
+0:?           '@entryPointOutput.Depth' ( out float FragDepth)
 0:28          Depth: direct index for structure ( temp float)
 0:28            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:28            Constant:
@@ -352,20 +354,20 @@
 0:?     'g_tTex2dmsi4a' ( uniform itexture2DMSArray)
 0:?     'g_tTex2dmsu4a' ( uniform utexture2DMSArray)
 0:?     'anon@0' (layout( row_major std140) uniform block{ uniform int c1,  uniform 2-component vector of int c2,  uniform 3-component vector of int c3,  uniform 4-component vector of int c4,  uniform int o1,  uniform 2-component vector of int o2,  uniform 3-component vector of int o3,  uniform 4-component vector of int o4})
-0:?     'Color' (layout( location=0) out 4-component vector of float)
-0:?     'Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 130
 
                               Capability Shader
                               Capability ImageGatherExtended
-                              Capability ImageMSArray
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
                               EntryPoint Fragment 4  "main" 120 124
                               ExecutionMode 4 OriginUpperLeft
+                              ExecutionMode 4 DepthReplacing
                               Source HLSL 500
                               Name 4  "main"
                               Name 8  "PS_OUTPUT"
@@ -390,16 +392,16 @@
                               Name 82  "g_tTex2dmsu4a"
                               Name 106  "psout"
                               Name 117  "flattenTemp"
-                              Name 120  "Color"
-                              Name 124  "Depth"
+                              Name 120  "@entryPointOutput.Color"
+                              Name 124  "@entryPointOutput.Depth"
                               Name 129  "g_sSamp"
                               Decorate 14(g_tTex2dmsf4) DescriptorSet 0
                               MemberDecorate 20($Global) 0 Offset 0
-                              MemberDecorate 20($Global) 1 Offset 4
+                              MemberDecorate 20($Global) 1 Offset 8
                               MemberDecorate 20($Global) 2 Offset 16
                               MemberDecorate 20($Global) 3 Offset 32
                               MemberDecorate 20($Global) 4 Offset 48
-                              MemberDecorate 20($Global) 5 Offset 52
+                              MemberDecorate 20($Global) 5 Offset 56
                               MemberDecorate 20($Global) 6 Offset 64
                               MemberDecorate 20($Global) 7 Offset 80
                               Decorate 20($Global) Block
@@ -409,8 +411,8 @@
                               Decorate 66(g_tTex2dmsf4a) DescriptorSet 0
                               Decorate 75(g_tTex2dmsi4a) DescriptorSet 0
                               Decorate 82(g_tTex2dmsu4a) DescriptorSet 0
-                              Decorate 120(Color) Location 0
-                              Decorate 124(Depth) BuiltIn FragDepth
+                              Decorate 120(@entryPointOutput.Color) Location 0
+                              Decorate 124(@entryPointOutput.Depth) BuiltIn FragDepth
                               Decorate 129(g_sSamp) DescriptorSet 0
                               Decorate 129(g_sSamp) Binding 0
                2:             TypeVoid
@@ -459,9 +461,9 @@
              110:             TypePointer Function 7(fvec4)
              112:             TypePointer Function 6(float)
              119:             TypePointer Output 7(fvec4)
-      120(Color):    119(ptr) Variable Output
+120(@entryPointOutput.Color):    119(ptr) Variable Output
              123:             TypePointer Output 6(float)
-      124(Depth):    123(ptr) Variable Output
+124(@entryPointOutput.Depth):    123(ptr) Variable Output
              127:             TypeSampler
              128:             TypePointer UniformConstant 127
     129(g_sSamp):    128(ptr) Variable UniformConstant
@@ -472,10 +474,10 @@
                               Store 117(flattenTemp) 118
              121:    110(ptr) AccessChain 117(flattenTemp) 107
              122:    7(fvec4) Load 121
-                              Store 120(Color) 122
+                              Store 120(@entryPointOutput.Color) 122
              125:    112(ptr) AccessChain 117(flattenTemp) 23
              126:    6(float) Load 125
-                              Store 124(Depth) 126
+                              Store 124(@entryPointOutput.Depth) 126
                               Return
                               FunctionEnd
       10(@main():8(PS_OUTPUT) Function None 9
diff --git a/Test/baseResults/hlsl.load.array.dx10.frag.out b/Test/baseResults/hlsl.load.array.dx10.frag.out
index dfd9a15..dd665ed 100644
--- a/Test/baseResults/hlsl.load.array.dx10.frag.out
+++ b/Test/baseResults/hlsl.load.array.dx10.frag.out
@@ -1,6 +1,7 @@
 hlsl.load.array.dx10.frag
 Shader version: 500
 gl_FragCoord origin is upper left
+using depth_any
 0:? Sequence
 0:48  Function Definition: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:48    Function Parameters: 
@@ -152,13 +153,13 @@
 0:48          'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:48          Function Call: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:48        move second child to first child ( temp 4-component vector of float)
-0:?           'Color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 0:48          Color: direct index for structure ( temp 4-component vector of float)
 0:48            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:48            Constant:
 0:48              0 (const int)
 0:48        move second child to first child ( temp float)
-0:?           'Depth' ( out float FragDepth)
+0:?           '@entryPointOutput.Depth' ( out float FragDepth)
 0:48          Depth: direct index for structure ( temp float)
 0:48            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:48            Constant:
@@ -187,8 +188,8 @@
 0:?     'g_tTexcdi4a' ( uniform itextureCubeArray)
 0:?     'g_tTexcdu4a' ( uniform utextureCubeArray)
 0:?     'anon@0' (layout( row_major std140) uniform block{ uniform int c1,  uniform 2-component vector of int c2,  uniform 3-component vector of int c3,  uniform 4-component vector of int c4,  uniform int o1,  uniform 2-component vector of int o2,  uniform 3-component vector of int o3,  uniform 4-component vector of int o4})
-0:?     'Color' (layout( location=0) out 4-component vector of float)
-0:?     'Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 
 Linked fragment stage:
@@ -196,6 +197,7 @@
 
 Shader version: 500
 gl_FragCoord origin is upper left
+using depth_any
 0:? Sequence
 0:48  Function Definition: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:48    Function Parameters: 
@@ -347,13 +349,13 @@
 0:48          'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:48          Function Call: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:48        move second child to first child ( temp 4-component vector of float)
-0:?           'Color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 0:48          Color: direct index for structure ( temp 4-component vector of float)
 0:48            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:48            Constant:
 0:48              0 (const int)
 0:48        move second child to first child ( temp float)
-0:?           'Depth' ( out float FragDepth)
+0:?           '@entryPointOutput.Depth' ( out float FragDepth)
 0:48          Depth: direct index for structure ( temp float)
 0:48            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:48            Constant:
@@ -382,11 +384,11 @@
 0:?     'g_tTexcdi4a' ( uniform itextureCubeArray)
 0:?     'g_tTexcdu4a' ( uniform utextureCubeArray)
 0:?     'anon@0' (layout( row_major std140) uniform block{ uniform int c1,  uniform 2-component vector of int c2,  uniform 3-component vector of int c3,  uniform 4-component vector of int c4,  uniform int o1,  uniform 2-component vector of int o2,  uniform 3-component vector of int o3,  uniform 4-component vector of int o4})
-0:?     'Color' (layout( location=0) out 4-component vector of float)
-0:?     'Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 159
 
                               Capability Shader
@@ -396,6 +398,7 @@
                               MemoryModel Logical GLSL450
                               EntryPoint Fragment 4  "main" 104 108
                               ExecutionMode 4 OriginUpperLeft
+                              ExecutionMode 4 DepthReplacing
                               Source HLSL 500
                               Name 4  "main"
                               Name 8  "PS_OUTPUT"
@@ -420,8 +423,8 @@
                               Name 80  "g_tTex2du4a"
                               Name 89  "psout"
                               Name 101  "flattenTemp"
-                              Name 104  "Color"
-                              Name 108  "Depth"
+                              Name 104  "@entryPointOutput.Color"
+                              Name 108  "@entryPointOutput.Depth"
                               Name 113  "g_sSamp"
                               Name 116  "g_tTex1df4"
                               Name 119  "g_tTex1di4"
@@ -440,11 +443,11 @@
                               Name 158  "g_tTexcdu4a"
                               Decorate 14(g_tTex1df4a) DescriptorSet 0
                               MemberDecorate 20($Global) 0 Offset 0
-                              MemberDecorate 20($Global) 1 Offset 4
+                              MemberDecorate 20($Global) 1 Offset 8
                               MemberDecorate 20($Global) 2 Offset 16
                               MemberDecorate 20($Global) 3 Offset 32
                               MemberDecorate 20($Global) 4 Offset 48
-                              MemberDecorate 20($Global) 5 Offset 52
+                              MemberDecorate 20($Global) 5 Offset 56
                               MemberDecorate 20($Global) 6 Offset 64
                               MemberDecorate 20($Global) 7 Offset 80
                               Decorate 20($Global) Block
@@ -454,8 +457,8 @@
                               Decorate 57(g_tTex2df4a) DescriptorSet 0
                               Decorate 70(g_tTex2di4a) DescriptorSet 0
                               Decorate 80(g_tTex2du4a) DescriptorSet 0
-                              Decorate 104(Color) Location 0
-                              Decorate 108(Depth) BuiltIn FragDepth
+                              Decorate 104(@entryPointOutput.Color) Location 0
+                              Decorate 108(@entryPointOutput.Depth) BuiltIn FragDepth
                               Decorate 113(g_sSamp) DescriptorSet 0
                               Decorate 113(g_sSamp) Binding 0
                               Decorate 116(g_tTex1df4) DescriptorSet 0
@@ -522,9 +525,9 @@
               95:     16(int) Constant 1
               96:             TypePointer Function 6(float)
              103:             TypePointer Output 7(fvec4)
-      104(Color):    103(ptr) Variable Output
+104(@entryPointOutput.Color):    103(ptr) Variable Output
              107:             TypePointer Output 6(float)
-      108(Depth):    107(ptr) Variable Output
+108(@entryPointOutput.Depth):    107(ptr) Variable Output
              111:             TypeSampler
              112:             TypePointer UniformConstant 111
     113(g_sSamp):    112(ptr) Variable UniformConstant
@@ -580,10 +583,10 @@
                               Store 101(flattenTemp) 102
              105:     93(ptr) AccessChain 101(flattenTemp) 90
              106:    7(fvec4) Load 105
-                              Store 104(Color) 106
+                              Store 104(@entryPointOutput.Color) 106
              109:     96(ptr) AccessChain 101(flattenTemp) 95
              110:    6(float) Load 109
-                              Store 108(Depth) 110
+                              Store 108(@entryPointOutput.Depth) 110
                               Return
                               FunctionEnd
       10(@main():8(PS_OUTPUT) Function None 9
diff --git a/Test/baseResults/hlsl.load.basic.dx10.frag.out b/Test/baseResults/hlsl.load.basic.dx10.frag.out
index 53b94c1..bcfb977 100644
--- a/Test/baseResults/hlsl.load.basic.dx10.frag.out
+++ b/Test/baseResults/hlsl.load.basic.dx10.frag.out
@@ -1,6 +1,7 @@
 hlsl.load.basic.dx10.frag
 Shader version: 500
 gl_FragCoord origin is upper left
+using depth_any
 0:? Sequence
 0:48  Function Definition: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:48    Function Parameters: 
@@ -203,13 +204,13 @@
 0:48          'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:48          Function Call: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:48        move second child to first child ( temp 4-component vector of float)
-0:?           'Color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 0:48          Color: direct index for structure ( temp 4-component vector of float)
 0:48            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:48            Constant:
 0:48              0 (const int)
 0:48        move second child to first child ( temp float)
-0:?           'Depth' ( out float FragDepth)
+0:?           '@entryPointOutput.Depth' ( out float FragDepth)
 0:48          Depth: direct index for structure ( temp float)
 0:48            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:48            Constant:
@@ -238,8 +239,8 @@
 0:?     'g_tTexcdi4a' ( uniform itextureCubeArray)
 0:?     'g_tTexcdu4a' ( uniform utextureCubeArray)
 0:?     'anon@0' (layout( row_major std140) uniform block{ uniform int c1,  uniform 2-component vector of int c2,  uniform 3-component vector of int c3,  uniform 4-component vector of int c4,  uniform int o1,  uniform 2-component vector of int o2,  uniform 3-component vector of int o3,  uniform 4-component vector of int o4})
-0:?     'Color' (layout( location=0) out 4-component vector of float)
-0:?     'Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 
 Linked fragment stage:
@@ -247,6 +248,7 @@
 
 Shader version: 500
 gl_FragCoord origin is upper left
+using depth_any
 0:? Sequence
 0:48  Function Definition: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:48    Function Parameters: 
@@ -449,13 +451,13 @@
 0:48          'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:48          Function Call: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:48        move second child to first child ( temp 4-component vector of float)
-0:?           'Color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 0:48          Color: direct index for structure ( temp 4-component vector of float)
 0:48            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:48            Constant:
 0:48              0 (const int)
 0:48        move second child to first child ( temp float)
-0:?           'Depth' ( out float FragDepth)
+0:?           '@entryPointOutput.Depth' ( out float FragDepth)
 0:48          Depth: direct index for structure ( temp float)
 0:48            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:48            Constant:
@@ -484,11 +486,11 @@
 0:?     'g_tTexcdi4a' ( uniform itextureCubeArray)
 0:?     'g_tTexcdu4a' ( uniform utextureCubeArray)
 0:?     'anon@0' (layout( row_major std140) uniform block{ uniform int c1,  uniform 2-component vector of int c2,  uniform 3-component vector of int c3,  uniform 4-component vector of int c4,  uniform int o1,  uniform 2-component vector of int o2,  uniform 3-component vector of int o3,  uniform 4-component vector of int o4})
-0:?     'Color' (layout( location=0) out 4-component vector of float)
-0:?     'Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 179
 
                               Capability Shader
@@ -498,6 +500,7 @@
                               MemoryModel Logical GLSL450
                               EntryPoint Fragment 4  "main" 133 137
                               ExecutionMode 4 OriginUpperLeft
+                              ExecutionMode 4 DepthReplacing
                               Source HLSL 500
                               Name 4  "main"
                               Name 8  "PS_OUTPUT"
@@ -525,8 +528,8 @@
                               Name 110  "g_tTex3du4"
                               Name 119  "psout"
                               Name 130  "flattenTemp"
-                              Name 133  "Color"
-                              Name 137  "Depth"
+                              Name 133  "@entryPointOutput.Color"
+                              Name 137  "@entryPointOutput.Depth"
                               Name 142  "g_sSamp"
                               Name 145  "g_tTexcdf4"
                               Name 148  "g_tTexcdi4"
@@ -543,11 +546,11 @@
                               Decorate 14(g_tTex1df4) DescriptorSet 0
                               Decorate 14(g_tTex1df4) Binding 0
                               MemberDecorate 20($Global) 0 Offset 0
-                              MemberDecorate 20($Global) 1 Offset 4
+                              MemberDecorate 20($Global) 1 Offset 8
                               MemberDecorate 20($Global) 2 Offset 16
                               MemberDecorate 20($Global) 3 Offset 32
                               MemberDecorate 20($Global) 4 Offset 48
-                              MemberDecorate 20($Global) 5 Offset 52
+                              MemberDecorate 20($Global) 5 Offset 56
                               MemberDecorate 20($Global) 6 Offset 64
                               MemberDecorate 20($Global) 7 Offset 80
                               Decorate 20($Global) Block
@@ -560,8 +563,8 @@
                               Decorate 87(g_tTex3df4) DescriptorSet 0
                               Decorate 100(g_tTex3di4) DescriptorSet 0
                               Decorate 110(g_tTex3du4) DescriptorSet 0
-                              Decorate 133(Color) Location 0
-                              Decorate 137(Depth) BuiltIn FragDepth
+                              Decorate 133(@entryPointOutput.Color) Location 0
+                              Decorate 137(@entryPointOutput.Depth) BuiltIn FragDepth
                               Decorate 142(g_sSamp) DescriptorSet 0
                               Decorate 142(g_sSamp) Binding 0
                               Decorate 145(g_tTexcdf4) DescriptorSet 0
@@ -635,9 +638,9 @@
              123:             TypePointer Function 7(fvec4)
              125:             TypePointer Function 6(float)
              132:             TypePointer Output 7(fvec4)
-      133(Color):    132(ptr) Variable Output
+133(@entryPointOutput.Color):    132(ptr) Variable Output
              136:             TypePointer Output 6(float)
-      137(Depth):    136(ptr) Variable Output
+137(@entryPointOutput.Depth):    136(ptr) Variable Output
              140:             TypeSampler
              141:             TypePointer UniformConstant 140
     142(g_sSamp):    141(ptr) Variable UniformConstant
@@ -684,10 +687,10 @@
                               Store 130(flattenTemp) 131
              134:    123(ptr) AccessChain 130(flattenTemp) 120
              135:    7(fvec4) Load 134
-                              Store 133(Color) 135
+                              Store 133(@entryPointOutput.Color) 135
              138:    125(ptr) AccessChain 130(flattenTemp) 23
              139:    6(float) Load 138
-                              Store 137(Depth) 139
+                              Store 137(@entryPointOutput.Depth) 139
                               Return
                               FunctionEnd
       10(@main():8(PS_OUTPUT) Function None 9
diff --git a/Test/baseResults/hlsl.load.basic.dx10.vert.out b/Test/baseResults/hlsl.load.basic.dx10.vert.out
index 3893232..1638991 100644
--- a/Test/baseResults/hlsl.load.basic.dx10.vert.out
+++ b/Test/baseResults/hlsl.load.basic.dx10.vert.out
@@ -192,7 +192,7 @@
 0:?     Sequence
 0:47      Sequence
 0:47        move second child to first child ( temp 4-component vector of float)
-0:?           '@entryPointOutput_Pos' ( out 4-component vector of float Position)
+0:?           '@entryPointOutput.Pos' ( out 4-component vector of float Position)
 0:47          Pos: direct index for structure ( temp 4-component vector of float)
 0:47            Function Call: @main( ( temp structure{ temp 4-component vector of float Pos})
 0:47            Constant:
@@ -221,7 +221,7 @@
 0:?     'g_tTexcdi4a' ( uniform itextureCubeArray)
 0:?     'g_tTexcdu4a' ( uniform utextureCubeArray)
 0:?     'anon@0' (layout( row_major std140) uniform block{ uniform int c1,  uniform 2-component vector of int c2,  uniform 3-component vector of int c3,  uniform 4-component vector of int c4,  uniform int o1,  uniform 2-component vector of int o2,  uniform 3-component vector of int o3,  uniform 4-component vector of int o4})
-0:?     '@entryPointOutput' (layout( location=0) out structure{})
+0:?     '@entryPointOutput.Pos' ( out 4-component vector of float Position)
 
 
 Linked vertex stage:
@@ -420,7 +420,7 @@
 0:?     Sequence
 0:47      Sequence
 0:47        move second child to first child ( temp 4-component vector of float)
-0:?           '@entryPointOutput_Pos' ( out 4-component vector of float Position)
+0:?           '@entryPointOutput.Pos' ( out 4-component vector of float Position)
 0:47          Pos: direct index for structure ( temp 4-component vector of float)
 0:47            Function Call: @main( ( temp structure{ temp 4-component vector of float Pos})
 0:47            Constant:
@@ -449,18 +449,18 @@
 0:?     'g_tTexcdi4a' ( uniform itextureCubeArray)
 0:?     'g_tTexcdu4a' ( uniform utextureCubeArray)
 0:?     'anon@0' (layout( row_major std140) uniform block{ uniform int c1,  uniform 2-component vector of int c2,  uniform 3-component vector of int c3,  uniform 4-component vector of int c4,  uniform int o1,  uniform 2-component vector of int o2,  uniform 3-component vector of int o3,  uniform 4-component vector of int o4})
-0:?     '@entryPointOutput' (layout( location=0) out structure{})
+0:?     '@entryPointOutput.Pos' ( out 4-component vector of float Position)
 
 // Module Version 10000
-// Generated by (magic number): 80001
-// Id's are bound by 174
+// Generated by (magic number): 80007
+// Id's are bound by 171
 
                               Capability Shader
                               Capability Sampled1D
                               Capability SampledCubeArray
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Vertex 4  "main" 129 173
+                              EntryPoint Vertex 4  "main" 129
                               Source HLSL 500
                               Name 4  "main"
                               Name 8  "VS_OUTPUT"
@@ -486,7 +486,7 @@
                               Name 100  "g_tTex3di4"
                               Name 110  "g_tTex3du4"
                               Name 119  "vsout"
-                              Name 129  "@entryPointOutput_Pos"
+                              Name 129  "@entryPointOutput.Pos"
                               Name 134  "g_sSamp"
                               Name 137  "g_tTexcdf4"
                               Name 140  "g_tTexcdi4"
@@ -500,16 +500,14 @@
                               Name 164  "g_tTexcdf4a"
                               Name 167  "g_tTexcdi4a"
                               Name 170  "g_tTexcdu4a"
-                              Name 171  "VS_OUTPUT"
-                              Name 173  "@entryPointOutput"
                               Decorate 14(g_tTex1df4) DescriptorSet 0
                               Decorate 14(g_tTex1df4) Binding 0
                               MemberDecorate 20($Global) 0 Offset 0
-                              MemberDecorate 20($Global) 1 Offset 4
+                              MemberDecorate 20($Global) 1 Offset 8
                               MemberDecorate 20($Global) 2 Offset 16
                               MemberDecorate 20($Global) 3 Offset 32
                               MemberDecorate 20($Global) 4 Offset 48
-                              MemberDecorate 20($Global) 5 Offset 52
+                              MemberDecorate 20($Global) 5 Offset 56
                               MemberDecorate 20($Global) 6 Offset 64
                               MemberDecorate 20($Global) 7 Offset 80
                               Decorate 20($Global) Block
@@ -522,7 +520,7 @@
                               Decorate 87(g_tTex3df4) DescriptorSet 0
                               Decorate 100(g_tTex3di4) DescriptorSet 0
                               Decorate 110(g_tTex3du4) DescriptorSet 0
-                              Decorate 129(@entryPointOutput_Pos) BuiltIn Position
+                              Decorate 129(@entryPointOutput.Pos) BuiltIn Position
                               Decorate 134(g_sSamp) DescriptorSet 0
                               Decorate 134(g_sSamp) Binding 0
                               Decorate 137(g_tTexcdf4) DescriptorSet 0
@@ -537,7 +535,6 @@
                               Decorate 164(g_tTexcdf4a) DescriptorSet 0
                               Decorate 167(g_tTexcdi4a) DescriptorSet 0
                               Decorate 170(g_tTexcdu4a) DescriptorSet 0
-                              Decorate 173(@entryPointOutput) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -596,7 +593,7 @@
              122:    7(fvec4) ConstantComposite 121 121 121 121
              123:             TypePointer Function 7(fvec4)
              128:             TypePointer Output 7(fvec4)
-129(@entryPointOutput_Pos):    128(ptr) Variable Output
+129(@entryPointOutput.Pos):    128(ptr) Variable Output
              132:             TypeSampler
              133:             TypePointer UniformConstant 132
     134(g_sSamp):    133(ptr) Variable UniformConstant
@@ -636,14 +633,11 @@
              168:             TypeImage 24(int) Cube array sampled format:Unknown
              169:             TypePointer UniformConstant 168
 170(g_tTexcdu4a):    169(ptr) Variable UniformConstant
-  171(VS_OUTPUT):             TypeStruct
-             172:             TypePointer Output 171(VS_OUTPUT)
-173(@entryPointOutput):    172(ptr) Variable Output
          4(main):           2 Function None 3
                5:             Label
              130:8(VS_OUTPUT) FunctionCall 10(@main()
              131:    7(fvec4) CompositeExtract 130 0
-                              Store 129(@entryPointOutput_Pos) 131
+                              Store 129(@entryPointOutput.Pos) 131
                               Return
                               FunctionEnd
       10(@main():8(VS_OUTPUT) Function None 9
diff --git a/Test/baseResults/hlsl.load.buffer.dx10.frag.out b/Test/baseResults/hlsl.load.buffer.dx10.frag.out
index 3512a99..21e5d30 100644
--- a/Test/baseResults/hlsl.load.buffer.dx10.frag.out
+++ b/Test/baseResults/hlsl.load.buffer.dx10.frag.out
@@ -1,6 +1,7 @@
 hlsl.load.buffer.dx10.frag
 Shader version: 500
 gl_FragCoord origin is upper left
+using depth_any
 0:? Sequence
 0:24  Function Definition: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:24    Function Parameters: 
@@ -59,13 +60,13 @@
 0:24          'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:24          Function Call: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:24        move second child to first child ( temp 4-component vector of float)
-0:?           'Color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 0:24          Color: direct index for structure ( temp 4-component vector of float)
 0:24            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:24            Constant:
 0:24              0 (const int)
 0:24        move second child to first child ( temp float)
-0:?           'Depth' ( out float FragDepth)
+0:?           '@entryPointOutput.Depth' ( out float FragDepth)
 0:24          Depth: direct index for structure ( temp float)
 0:24            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:24            Constant:
@@ -76,8 +77,8 @@
 0:?     'g_tTexbi4' (layout( rgba32i) uniform itextureBuffer)
 0:?     'g_tTexbu4' (layout( rgba32ui) uniform utextureBuffer)
 0:?     'anon@0' (layout( row_major std140) uniform block{ uniform int c1,  uniform 2-component vector of int c2,  uniform 3-component vector of int c3,  uniform 4-component vector of int c4,  uniform int o1,  uniform 2-component vector of int o2,  uniform 3-component vector of int o3,  uniform 4-component vector of int o4})
-0:?     'Color' (layout( location=0) out 4-component vector of float)
-0:?     'Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 
 Linked fragment stage:
@@ -85,6 +86,7 @@
 
 Shader version: 500
 gl_FragCoord origin is upper left
+using depth_any
 0:? Sequence
 0:24  Function Definition: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:24    Function Parameters: 
@@ -143,13 +145,13 @@
 0:24          'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:24          Function Call: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:24        move second child to first child ( temp 4-component vector of float)
-0:?           'Color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 0:24          Color: direct index for structure ( temp 4-component vector of float)
 0:24            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:24            Constant:
 0:24              0 (const int)
 0:24        move second child to first child ( temp float)
-0:?           'Depth' ( out float FragDepth)
+0:?           '@entryPointOutput.Depth' ( out float FragDepth)
 0:24          Depth: direct index for structure ( temp float)
 0:24            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:24            Constant:
@@ -160,11 +162,11 @@
 0:?     'g_tTexbi4' (layout( rgba32i) uniform itextureBuffer)
 0:?     'g_tTexbu4' (layout( rgba32ui) uniform utextureBuffer)
 0:?     'anon@0' (layout( row_major std140) uniform block{ uniform int c1,  uniform 2-component vector of int c2,  uniform 3-component vector of int c3,  uniform 4-component vector of int c4,  uniform int o1,  uniform 2-component vector of int o2,  uniform 3-component vector of int o3,  uniform 4-component vector of int o4})
-0:?     'Color' (layout( location=0) out 4-component vector of float)
-0:?     'Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 72
 
                               Capability Shader
@@ -173,6 +175,7 @@
                               MemoryModel Logical GLSL450
                               EntryPoint Fragment 4  "main" 64 68
                               ExecutionMode 4 OriginUpperLeft
+                              ExecutionMode 4 DepthReplacing
                               Source HLSL 500
                               Name 4  "main"
                               Name 8  "PS_OUTPUT"
@@ -197,24 +200,24 @@
                               Name 45  "g_tTexbu4"
                               Name 51  "psout"
                               Name 61  "flattenTemp"
-                              Name 64  "Color"
-                              Name 68  "Depth"
+                              Name 64  "@entryPointOutput.Color"
+                              Name 68  "@entryPointOutput.Depth"
                               Name 71  "g_tTexbf4_test"
                               Decorate 16(g_tTexbf4) DescriptorSet 0
                               MemberDecorate 22($Global) 0 Offset 0
-                              MemberDecorate 22($Global) 1 Offset 4
+                              MemberDecorate 22($Global) 1 Offset 8
                               MemberDecorate 22($Global) 2 Offset 16
                               MemberDecorate 22($Global) 3 Offset 32
                               MemberDecorate 22($Global) 4 Offset 48
-                              MemberDecorate 22($Global) 5 Offset 52
+                              MemberDecorate 22($Global) 5 Offset 56
                               MemberDecorate 22($Global) 6 Offset 64
                               MemberDecorate 22($Global) 7 Offset 80
                               Decorate 22($Global) Block
                               Decorate 24 DescriptorSet 0
                               Decorate 34(g_tTexbi4) DescriptorSet 0
                               Decorate 45(g_tTexbu4) DescriptorSet 0
-                              Decorate 64(Color) Location 0
-                              Decorate 68(Depth) BuiltIn FragDepth
+                              Decorate 64(@entryPointOutput.Color) Location 0
+                              Decorate 68(@entryPointOutput.Depth) BuiltIn FragDepth
                               Decorate 71(g_tTexbf4_test) DescriptorSet 0
                               Decorate 71(g_tTexbf4_test) Binding 0
                2:             TypeVoid
@@ -252,9 +255,9 @@
               55:     18(int) Constant 1
               56:             TypePointer Function 6(float)
               63:             TypePointer Output 7(fvec4)
-       64(Color):     63(ptr) Variable Output
+64(@entryPointOutput.Color):     63(ptr) Variable Output
               67:             TypePointer Output 6(float)
-       68(Depth):     67(ptr) Variable Output
+68(@entryPointOutput.Depth):     67(ptr) Variable Output
 71(g_tTexbf4_test):     15(ptr) Variable UniformConstant
          4(main):           2 Function None 3
                5:             Label
@@ -263,10 +266,10 @@
                               Store 61(flattenTemp) 62
               65:     12(ptr) AccessChain 61(flattenTemp) 25
               66:    7(fvec4) Load 65
-                              Store 64(Color) 66
+                              Store 64(@entryPointOutput.Color) 66
               69:     56(ptr) AccessChain 61(flattenTemp) 55
               70:    6(float) Load 69
-                              Store 68(Depth) 70
+                              Store 68(@entryPointOutput.Depth) 70
                               Return
                               FunctionEnd
       10(@main():8(PS_OUTPUT) Function None 9
diff --git a/Test/baseResults/hlsl.load.buffer.float.dx10.frag.out b/Test/baseResults/hlsl.load.buffer.float.dx10.frag.out
index 5718b81..d951d09 100644
--- a/Test/baseResults/hlsl.load.buffer.float.dx10.frag.out
+++ b/Test/baseResults/hlsl.load.buffer.float.dx10.frag.out
@@ -1,6 +1,7 @@
 hlsl.load.buffer.float.dx10.frag
 Shader version: 500
 gl_FragCoord origin is upper left
+using depth_any
 0:? Sequence
 0:24  Function Definition: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:24    Function Parameters: 
@@ -62,13 +63,13 @@
 0:24          'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:24          Function Call: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:24        move second child to first child ( temp 4-component vector of float)
-0:?           'Color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 0:24          Color: direct index for structure ( temp 4-component vector of float)
 0:24            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:24            Constant:
 0:24              0 (const int)
 0:24        move second child to first child ( temp float)
-0:?           'Depth' ( out float FragDepth)
+0:?           '@entryPointOutput.Depth' ( out float FragDepth)
 0:24          Depth: direct index for structure ( temp float)
 0:24            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:24            Constant:
@@ -79,8 +80,8 @@
 0:?     'g_tTexbis' (layout( r32i) uniform itextureBuffer)
 0:?     'g_tTexbus' (layout( r32ui) uniform utextureBuffer)
 0:?     'anon@0' (layout( row_major std140) uniform block{ uniform int c1,  uniform 2-component vector of int c2,  uniform 3-component vector of int c3,  uniform 4-component vector of int c4,  uniform int o1,  uniform 2-component vector of int o2,  uniform 3-component vector of int o3,  uniform 4-component vector of int o4})
-0:?     'Color' (layout( location=0) out 4-component vector of float)
-0:?     'Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 
 Linked fragment stage:
@@ -88,6 +89,7 @@
 
 Shader version: 500
 gl_FragCoord origin is upper left
+using depth_any
 0:? Sequence
 0:24  Function Definition: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:24    Function Parameters: 
@@ -149,13 +151,13 @@
 0:24          'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:24          Function Call: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:24        move second child to first child ( temp 4-component vector of float)
-0:?           'Color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 0:24          Color: direct index for structure ( temp 4-component vector of float)
 0:24            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:24            Constant:
 0:24              0 (const int)
 0:24        move second child to first child ( temp float)
-0:?           'Depth' ( out float FragDepth)
+0:?           '@entryPointOutput.Depth' ( out float FragDepth)
 0:24          Depth: direct index for structure ( temp float)
 0:24            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:24            Constant:
@@ -166,11 +168,11 @@
 0:?     'g_tTexbis' (layout( r32i) uniform itextureBuffer)
 0:?     'g_tTexbus' (layout( r32ui) uniform utextureBuffer)
 0:?     'anon@0' (layout( row_major std140) uniform block{ uniform int c1,  uniform 2-component vector of int c2,  uniform 3-component vector of int c3,  uniform 4-component vector of int c4,  uniform int o1,  uniform 2-component vector of int o2,  uniform 3-component vector of int o3,  uniform 4-component vector of int o4})
-0:?     'Color' (layout( location=0) out 4-component vector of float)
-0:?     'Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 75
 
                               Capability Shader
@@ -179,6 +181,7 @@
                               MemoryModel Logical GLSL450
                               EntryPoint Fragment 4  "main" 67 71
                               ExecutionMode 4 OriginUpperLeft
+                              ExecutionMode 4 DepthReplacing
                               Source HLSL 500
                               Name 4  "main"
                               Name 8  "PS_OUTPUT"
@@ -203,24 +206,24 @@
                               Name 46  "g_tTexbus"
                               Name 54  "psout"
                               Name 64  "flattenTemp"
-                              Name 67  "Color"
-                              Name 71  "Depth"
+                              Name 67  "@entryPointOutput.Color"
+                              Name 71  "@entryPointOutput.Depth"
                               Name 74  "g_tTexbfs_test"
                               Decorate 16(g_tTexbfs) DescriptorSet 0
                               MemberDecorate 22($Global) 0 Offset 0
-                              MemberDecorate 22($Global) 1 Offset 4
+                              MemberDecorate 22($Global) 1 Offset 8
                               MemberDecorate 22($Global) 2 Offset 16
                               MemberDecorate 22($Global) 3 Offset 32
                               MemberDecorate 22($Global) 4 Offset 48
-                              MemberDecorate 22($Global) 5 Offset 52
+                              MemberDecorate 22($Global) 5 Offset 56
                               MemberDecorate 22($Global) 6 Offset 64
                               MemberDecorate 22($Global) 7 Offset 80
                               Decorate 22($Global) Block
                               Decorate 24 DescriptorSet 0
                               Decorate 35(g_tTexbis) DescriptorSet 0
                               Decorate 46(g_tTexbus) DescriptorSet 0
-                              Decorate 67(Color) Location 0
-                              Decorate 71(Depth) BuiltIn FragDepth
+                              Decorate 67(@entryPointOutput.Color) Location 0
+                              Decorate 71(@entryPointOutput.Depth) BuiltIn FragDepth
                               Decorate 74(g_tTexbfs_test) DescriptorSet 0
                               Decorate 74(g_tTexbfs_test) Binding 0
                2:             TypeVoid
@@ -258,9 +261,9 @@
               57:             TypePointer Function 7(fvec4)
               59:     18(int) Constant 1
               66:             TypePointer Output 7(fvec4)
-       67(Color):     66(ptr) Variable Output
+67(@entryPointOutput.Color):     66(ptr) Variable Output
               70:             TypePointer Output 6(float)
-       71(Depth):     70(ptr) Variable Output
+71(@entryPointOutput.Depth):     70(ptr) Variable Output
 74(g_tTexbfs_test):     15(ptr) Variable UniformConstant
          4(main):           2 Function None 3
                5:             Label
@@ -269,10 +272,10 @@
                               Store 64(flattenTemp) 65
               68:     57(ptr) AccessChain 64(flattenTemp) 25
               69:    7(fvec4) Load 68
-                              Store 67(Color) 69
+                              Store 67(@entryPointOutput.Color) 69
               72:     12(ptr) AccessChain 64(flattenTemp) 59
               73:    6(float) Load 72
-                              Store 71(Depth) 73
+                              Store 71(@entryPointOutput.Depth) 73
                               Return
                               FunctionEnd
       10(@main():8(PS_OUTPUT) Function None 9
diff --git a/Test/baseResults/hlsl.load.offset.dx10.frag.out b/Test/baseResults/hlsl.load.offset.dx10.frag.out
index 54b03de..d59ff6f 100644
--- a/Test/baseResults/hlsl.load.offset.dx10.frag.out
+++ b/Test/baseResults/hlsl.load.offset.dx10.frag.out
@@ -1,6 +1,7 @@
 hlsl.load.offset.dx10.frag
 Shader version: 500
 gl_FragCoord origin is upper left
+using depth_any
 0:? Sequence
 0:48  Function Definition: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:48    Function Parameters: 
@@ -239,13 +240,13 @@
 0:48          'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:48          Function Call: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:48        move second child to first child ( temp 4-component vector of float)
-0:?           'Color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 0:48          Color: direct index for structure ( temp 4-component vector of float)
 0:48            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:48            Constant:
 0:48              0 (const int)
 0:48        move second child to first child ( temp float)
-0:?           'Depth' ( out float FragDepth)
+0:?           '@entryPointOutput.Depth' ( out float FragDepth)
 0:48          Depth: direct index for structure ( temp float)
 0:48            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:48            Constant:
@@ -274,8 +275,8 @@
 0:?     'g_tTexcdi4a' ( uniform itextureCubeArray)
 0:?     'g_tTexcdu4a' ( uniform utextureCubeArray)
 0:?     'anon@0' (layout( row_major std140) uniform block{ uniform int c1,  uniform 2-component vector of int c2,  uniform 3-component vector of int c3,  uniform 4-component vector of int c4,  uniform int o1,  uniform 2-component vector of int o2,  uniform 3-component vector of int o3,  uniform 4-component vector of int o4})
-0:?     'Color' (layout( location=0) out 4-component vector of float)
-0:?     'Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 
 Linked fragment stage:
@@ -283,6 +284,7 @@
 
 Shader version: 500
 gl_FragCoord origin is upper left
+using depth_any
 0:? Sequence
 0:48  Function Definition: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:48    Function Parameters: 
@@ -521,13 +523,13 @@
 0:48          'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:48          Function Call: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:48        move second child to first child ( temp 4-component vector of float)
-0:?           'Color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 0:48          Color: direct index for structure ( temp 4-component vector of float)
 0:48            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:48            Constant:
 0:48              0 (const int)
 0:48        move second child to first child ( temp float)
-0:?           'Depth' ( out float FragDepth)
+0:?           '@entryPointOutput.Depth' ( out float FragDepth)
 0:48          Depth: direct index for structure ( temp float)
 0:48            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:48            Constant:
@@ -556,11 +558,11 @@
 0:?     'g_tTexcdi4a' ( uniform itextureCubeArray)
 0:?     'g_tTexcdu4a' ( uniform utextureCubeArray)
 0:?     'anon@0' (layout( row_major std140) uniform block{ uniform int c1,  uniform 2-component vector of int c2,  uniform 3-component vector of int c3,  uniform 4-component vector of int c4,  uniform int o1,  uniform 2-component vector of int o2,  uniform 3-component vector of int o3,  uniform 4-component vector of int o4})
-0:?     'Color' (layout( location=0) out 4-component vector of float)
-0:?     'Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 201
 
                               Capability Shader
@@ -571,6 +573,7 @@
                               MemoryModel Logical GLSL450
                               EntryPoint Fragment 4  "main" 155 159
                               ExecutionMode 4 OriginUpperLeft
+                              ExecutionMode 4 DepthReplacing
                               Source HLSL 500
                               Name 4  "main"
                               Name 8  "PS_OUTPUT"
@@ -598,8 +601,8 @@
                               Name 130  "g_tTex3du4"
                               Name 141  "psout"
                               Name 152  "flattenTemp"
-                              Name 155  "Color"
-                              Name 159  "Depth"
+                              Name 155  "@entryPointOutput.Color"
+                              Name 159  "@entryPointOutput.Depth"
                               Name 164  "g_sSamp"
                               Name 167  "g_tTexcdf4"
                               Name 170  "g_tTexcdi4"
@@ -616,11 +619,11 @@
                               Decorate 14(g_tTex1df4) DescriptorSet 0
                               Decorate 14(g_tTex1df4) Binding 0
                               MemberDecorate 20($Global) 0 Offset 0
-                              MemberDecorate 20($Global) 1 Offset 4
+                              MemberDecorate 20($Global) 1 Offset 8
                               MemberDecorate 20($Global) 2 Offset 16
                               MemberDecorate 20($Global) 3 Offset 32
                               MemberDecorate 20($Global) 4 Offset 48
-                              MemberDecorate 20($Global) 5 Offset 52
+                              MemberDecorate 20($Global) 5 Offset 56
                               MemberDecorate 20($Global) 6 Offset 64
                               MemberDecorate 20($Global) 7 Offset 80
                               Decorate 20($Global) Block
@@ -633,8 +636,8 @@
                               Decorate 102(g_tTex3df4) DescriptorSet 0
                               Decorate 118(g_tTex3di4) DescriptorSet 0
                               Decorate 130(g_tTex3du4) DescriptorSet 0
-                              Decorate 155(Color) Location 0
-                              Decorate 159(Depth) BuiltIn FragDepth
+                              Decorate 155(@entryPointOutput.Color) Location 0
+                              Decorate 159(@entryPointOutput.Depth) BuiltIn FragDepth
                               Decorate 164(g_sSamp) DescriptorSet 0
                               Decorate 164(g_sSamp) Binding 0
                               Decorate 167(g_tTexcdf4) DescriptorSet 0
@@ -712,9 +715,9 @@
              145:             TypePointer Function 7(fvec4)
              147:             TypePointer Function 6(float)
              154:             TypePointer Output 7(fvec4)
-      155(Color):    154(ptr) Variable Output
+155(@entryPointOutput.Color):    154(ptr) Variable Output
              158:             TypePointer Output 6(float)
-      159(Depth):    158(ptr) Variable Output
+159(@entryPointOutput.Depth):    158(ptr) Variable Output
              162:             TypeSampler
              163:             TypePointer UniformConstant 162
     164(g_sSamp):    163(ptr) Variable UniformConstant
@@ -761,10 +764,10 @@
                               Store 152(flattenTemp) 153
              156:    145(ptr) AccessChain 152(flattenTemp) 142
              157:    7(fvec4) Load 156
-                              Store 155(Color) 157
+                              Store 155(@entryPointOutput.Color) 157
              160:    147(ptr) AccessChain 152(flattenTemp) 23
              161:    6(float) Load 160
-                              Store 159(Depth) 161
+                              Store 159(@entryPointOutput.Depth) 161
                               Return
                               FunctionEnd
       10(@main():8(PS_OUTPUT) Function None 9
diff --git a/Test/baseResults/hlsl.load.offsetarray.dx10.frag.out b/Test/baseResults/hlsl.load.offsetarray.dx10.frag.out
index fc2f09c..b472462 100644
--- a/Test/baseResults/hlsl.load.offsetarray.dx10.frag.out
+++ b/Test/baseResults/hlsl.load.offsetarray.dx10.frag.out
@@ -1,6 +1,7 @@
 hlsl.load.offsetarray.dx10.frag
 Shader version: 500
 gl_FragCoord origin is upper left
+using depth_any
 0:? Sequence
 0:48  Function Definition: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:48    Function Parameters: 
@@ -176,13 +177,13 @@
 0:48          'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:48          Function Call: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:48        move second child to first child ( temp 4-component vector of float)
-0:?           'Color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 0:48          Color: direct index for structure ( temp 4-component vector of float)
 0:48            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:48            Constant:
 0:48              0 (const int)
 0:48        move second child to first child ( temp float)
-0:?           'Depth' ( out float FragDepth)
+0:?           '@entryPointOutput.Depth' ( out float FragDepth)
 0:48          Depth: direct index for structure ( temp float)
 0:48            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:48            Constant:
@@ -211,8 +212,8 @@
 0:?     'g_tTexcdi4a' ( uniform itextureCubeArray)
 0:?     'g_tTexcdu4a' ( uniform utextureCubeArray)
 0:?     'anon@0' (layout( row_major std140) uniform block{ uniform int c1,  uniform 2-component vector of int c2,  uniform 3-component vector of int c3,  uniform 4-component vector of int c4,  uniform int o1,  uniform 2-component vector of int o2,  uniform 3-component vector of int o3,  uniform 4-component vector of int o4})
-0:?     'Color' (layout( location=0) out 4-component vector of float)
-0:?     'Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 
 Linked fragment stage:
@@ -220,6 +221,7 @@
 
 Shader version: 500
 gl_FragCoord origin is upper left
+using depth_any
 0:? Sequence
 0:48  Function Definition: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:48    Function Parameters: 
@@ -395,13 +397,13 @@
 0:48          'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:48          Function Call: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:48        move second child to first child ( temp 4-component vector of float)
-0:?           'Color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 0:48          Color: direct index for structure ( temp 4-component vector of float)
 0:48            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:48            Constant:
 0:48              0 (const int)
 0:48        move second child to first child ( temp float)
-0:?           'Depth' ( out float FragDepth)
+0:?           '@entryPointOutput.Depth' ( out float FragDepth)
 0:48          Depth: direct index for structure ( temp float)
 0:48            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:48            Constant:
@@ -430,11 +432,11 @@
 0:?     'g_tTexcdi4a' ( uniform itextureCubeArray)
 0:?     'g_tTexcdu4a' ( uniform utextureCubeArray)
 0:?     'anon@0' (layout( row_major std140) uniform block{ uniform int c1,  uniform 2-component vector of int c2,  uniform 3-component vector of int c3,  uniform 4-component vector of int c4,  uniform int o1,  uniform 2-component vector of int o2,  uniform 3-component vector of int o3,  uniform 4-component vector of int o4})
-0:?     'Color' (layout( location=0) out 4-component vector of float)
-0:?     'Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 174
 
                               Capability Shader
@@ -445,6 +447,7 @@
                               MemoryModel Logical GLSL450
                               EntryPoint Fragment 4  "main" 119 123
                               ExecutionMode 4 OriginUpperLeft
+                              ExecutionMode 4 DepthReplacing
                               Source HLSL 500
                               Name 4  "main"
                               Name 8  "PS_OUTPUT"
@@ -469,8 +472,8 @@
                               Name 93  "g_tTex2du4a"
                               Name 104  "psout"
                               Name 116  "flattenTemp"
-                              Name 119  "Color"
-                              Name 123  "Depth"
+                              Name 119  "@entryPointOutput.Color"
+                              Name 123  "@entryPointOutput.Depth"
                               Name 128  "g_sSamp"
                               Name 131  "g_tTex1df4"
                               Name 134  "g_tTex1di4"
@@ -489,11 +492,11 @@
                               Name 173  "g_tTexcdu4a"
                               Decorate 14(g_tTex1df4a) DescriptorSet 0
                               MemberDecorate 20($Global) 0 Offset 0
-                              MemberDecorate 20($Global) 1 Offset 4
+                              MemberDecorate 20($Global) 1 Offset 8
                               MemberDecorate 20($Global) 2 Offset 16
                               MemberDecorate 20($Global) 3 Offset 32
                               MemberDecorate 20($Global) 4 Offset 48
-                              MemberDecorate 20($Global) 5 Offset 52
+                              MemberDecorate 20($Global) 5 Offset 56
                               MemberDecorate 20($Global) 6 Offset 64
                               MemberDecorate 20($Global) 7 Offset 80
                               Decorate 20($Global) Block
@@ -503,8 +506,8 @@
                               Decorate 64(g_tTex2df4a) DescriptorSet 0
                               Decorate 81(g_tTex2di4a) DescriptorSet 0
                               Decorate 93(g_tTex2du4a) DescriptorSet 0
-                              Decorate 119(Color) Location 0
-                              Decorate 123(Depth) BuiltIn FragDepth
+                              Decorate 119(@entryPointOutput.Color) Location 0
+                              Decorate 123(@entryPointOutput.Depth) BuiltIn FragDepth
                               Decorate 128(g_sSamp) DescriptorSet 0
                               Decorate 128(g_sSamp) Binding 0
                               Decorate 131(g_tTex1df4) DescriptorSet 0
@@ -574,9 +577,9 @@
              110:     16(int) Constant 1
              111:             TypePointer Function 6(float)
              118:             TypePointer Output 7(fvec4)
-      119(Color):    118(ptr) Variable Output
+119(@entryPointOutput.Color):    118(ptr) Variable Output
              122:             TypePointer Output 6(float)
-      123(Depth):    122(ptr) Variable Output
+123(@entryPointOutput.Depth):    122(ptr) Variable Output
              126:             TypeSampler
              127:             TypePointer UniformConstant 126
     128(g_sSamp):    127(ptr) Variable UniformConstant
@@ -632,10 +635,10 @@
                               Store 116(flattenTemp) 117
              120:    108(ptr) AccessChain 116(flattenTemp) 105
              121:    7(fvec4) Load 120
-                              Store 119(Color) 121
+                              Store 119(@entryPointOutput.Color) 121
              124:    111(ptr) AccessChain 116(flattenTemp) 110
              125:    6(float) Load 124
-                              Store 123(Depth) 125
+                              Store 123(@entryPointOutput.Depth) 125
                               Return
                               FunctionEnd
       10(@main():8(PS_OUTPUT) Function None 9
diff --git a/Test/baseResults/hlsl.load.rwbuffer.dx10.frag.out b/Test/baseResults/hlsl.load.rwbuffer.dx10.frag.out
index 048b5e6..f134901 100644
--- a/Test/baseResults/hlsl.load.rwbuffer.dx10.frag.out
+++ b/Test/baseResults/hlsl.load.rwbuffer.dx10.frag.out
@@ -40,7 +40,7 @@
 0:?     Sequence
 0:22      Sequence
 0:22        move second child to first child ( temp 4-component vector of float)
-0:?           'Color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 0:22          Color: direct index for structure ( temp 4-component vector of float)
 0:22            Function Call: @main( ( temp structure{ temp 4-component vector of float Color})
 0:22            Constant:
@@ -50,7 +50,7 @@
 0:?     'g_tBuffI' (layout( rgba32i) uniform iimageBuffer)
 0:?     'g_tBuffU' (layout( rgba32ui) uniform uimageBuffer)
 0:?     'anon@0' (layout( row_major std140) uniform block{ uniform int c1,  uniform 2-component vector of int c2,  uniform 3-component vector of int c3,  uniform 4-component vector of int c4,  uniform int o1,  uniform 2-component vector of int o2,  uniform 3-component vector of int o3,  uniform 4-component vector of int o4})
-0:?     'Color' (layout( location=0) out 4-component vector of float)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 
 Linked fragment stage:
@@ -97,7 +97,7 @@
 0:?     Sequence
 0:22      Sequence
 0:22        move second child to first child ( temp 4-component vector of float)
-0:?           'Color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 0:22          Color: direct index for structure ( temp 4-component vector of float)
 0:22            Function Call: @main( ( temp structure{ temp 4-component vector of float Color})
 0:22            Constant:
@@ -107,14 +107,14 @@
 0:?     'g_tBuffI' (layout( rgba32i) uniform iimageBuffer)
 0:?     'g_tBuffU' (layout( rgba32ui) uniform uimageBuffer)
 0:?     'anon@0' (layout( row_major std140) uniform block{ uniform int c1,  uniform 2-component vector of int c2,  uniform 3-component vector of int c3,  uniform 4-component vector of int c4,  uniform int o1,  uniform 2-component vector of int o2,  uniform 3-component vector of int o3,  uniform 4-component vector of int o4})
-0:?     'Color' (layout( location=0) out 4-component vector of float)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 57
 
                               Capability Shader
-                              Capability SampledBuffer
+                              Capability ImageBuffer
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
                               EntryPoint Fragment 4  "main" 54
@@ -138,21 +138,21 @@
                               Name 31  "g_tBuffU"
                               Name 39  "g_tBuffI"
                               Name 45  "psout"
-                              Name 54  "Color"
+                              Name 54  "@entryPointOutput.Color"
                               Decorate 14(g_tBuffF) DescriptorSet 0
                               MemberDecorate 20($Global) 0 Offset 0
-                              MemberDecorate 20($Global) 1 Offset 4
+                              MemberDecorate 20($Global) 1 Offset 8
                               MemberDecorate 20($Global) 2 Offset 16
                               MemberDecorate 20($Global) 3 Offset 32
                               MemberDecorate 20($Global) 4 Offset 48
-                              MemberDecorate 20($Global) 5 Offset 52
+                              MemberDecorate 20($Global) 5 Offset 56
                               MemberDecorate 20($Global) 6 Offset 64
                               MemberDecorate 20($Global) 7 Offset 80
                               Decorate 20($Global) Block
                               Decorate 22 DescriptorSet 0
                               Decorate 31(g_tBuffU) DescriptorSet 0
                               Decorate 39(g_tBuffI) DescriptorSet 0
-                              Decorate 54(Color) Location 0
+                              Decorate 54(@entryPointOutput.Color) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -184,12 +184,12 @@
               47:    7(fvec4) ConstantComposite 46 46 46 46
               48:             TypePointer Function 7(fvec4)
               53:             TypePointer Output 7(fvec4)
-       54(Color):     53(ptr) Variable Output
+54(@entryPointOutput.Color):     53(ptr) Variable Output
          4(main):           2 Function None 3
                5:             Label
               55:8(PS_OUTPUT) FunctionCall 10(@main()
               56:    7(fvec4) CompositeExtract 55 0
-                              Store 54(Color) 56
+                              Store 54(@entryPointOutput.Color) 56
                               Return
                               FunctionEnd
       10(@main():8(PS_OUTPUT) Function None 9
diff --git a/Test/baseResults/hlsl.load.rwtexture.array.dx10.frag.out b/Test/baseResults/hlsl.load.rwtexture.array.dx10.frag.out
index a5c818d..de31ee0 100644
--- a/Test/baseResults/hlsl.load.rwtexture.array.dx10.frag.out
+++ b/Test/baseResults/hlsl.load.rwtexture.array.dx10.frag.out
@@ -1,6 +1,7 @@
 hlsl.load.rwtexture.array.dx10.frag
 Shader version: 500
 gl_FragCoord origin is upper left
+using depth_any
 0:? Sequence
 0:40  Function Definition: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:40    Function Parameters: 
@@ -68,13 +69,13 @@
 0:40          'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:40          Function Call: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:40        move second child to first child ( temp 4-component vector of float)
-0:?           'Color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 0:40          Color: direct index for structure ( temp 4-component vector of float)
 0:40            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:40            Constant:
 0:40              0 (const int)
 0:40        move second child to first child ( temp float)
-0:?           'Depth' ( out float FragDepth)
+0:?           '@entryPointOutput.Depth' ( out float FragDepth)
 0:40          Depth: direct index for structure ( temp float)
 0:40            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:40            Constant:
@@ -97,8 +98,8 @@
 0:?     'g_tTex2di4a' (layout( rgba32i) uniform iimage2DArray)
 0:?     'g_tTex2du4a' (layout( rgba32ui) uniform uimage2DArray)
 0:?     'anon@0' (layout( row_major std140) uniform block{ uniform int c1,  uniform 2-component vector of int c2,  uniform 3-component vector of int c3,  uniform 4-component vector of int c4,  uniform int o1,  uniform 2-component vector of int o2,  uniform 3-component vector of int o3,  uniform 4-component vector of int o4})
-0:?     'Color' (layout( location=0) out 4-component vector of float)
-0:?     'Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 
 Linked fragment stage:
@@ -106,6 +107,7 @@
 
 Shader version: 500
 gl_FragCoord origin is upper left
+using depth_any
 0:? Sequence
 0:40  Function Definition: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:40    Function Parameters: 
@@ -173,13 +175,13 @@
 0:40          'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:40          Function Call: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:40        move second child to first child ( temp 4-component vector of float)
-0:?           'Color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 0:40          Color: direct index for structure ( temp 4-component vector of float)
 0:40            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:40            Constant:
 0:40              0 (const int)
 0:40        move second child to first child ( temp float)
-0:?           'Depth' ( out float FragDepth)
+0:?           '@entryPointOutput.Depth' ( out float FragDepth)
 0:40          Depth: direct index for structure ( temp float)
 0:40            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:40            Constant:
@@ -202,19 +204,20 @@
 0:?     'g_tTex2di4a' (layout( rgba32i) uniform iimage2DArray)
 0:?     'g_tTex2du4a' (layout( rgba32ui) uniform uimage2DArray)
 0:?     'anon@0' (layout( row_major std140) uniform block{ uniform int c1,  uniform 2-component vector of int c2,  uniform 3-component vector of int c3,  uniform 4-component vector of int c4,  uniform int o1,  uniform 2-component vector of int o2,  uniform 3-component vector of int o3,  uniform 4-component vector of int o4})
-0:?     'Color' (layout( location=0) out 4-component vector of float)
-0:?     'Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 119
 
                               Capability Shader
-                              Capability Sampled1D
+                              Capability Image1D
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
                               EntryPoint Fragment 4  "main" 82 86
                               ExecutionMode 4 OriginUpperLeft
+                              ExecutionMode 4 DepthReplacing
                               Source HLSL 500
                               Name 4  "main"
                               Name 8  "PS_OUTPUT"
@@ -239,8 +242,8 @@
                               Name 62  "g_tTex2du4a"
                               Name 68  "psout"
                               Name 79  "flattenTemp"
-                              Name 82  "Color"
-                              Name 86  "Depth"
+                              Name 82  "@entryPointOutput.Color"
+                              Name 86  "@entryPointOutput.Depth"
                               Name 91  "g_sSamp"
                               Name 94  "g_tTex1df4"
                               Name 97  "g_tTex1di4"
@@ -253,11 +256,11 @@
                               Name 118  "g_tTex3du4"
                               Decorate 14(g_tTex1df4a) DescriptorSet 0
                               MemberDecorate 20($Global) 0 Offset 0
-                              MemberDecorate 20($Global) 1 Offset 4
+                              MemberDecorate 20($Global) 1 Offset 8
                               MemberDecorate 20($Global) 2 Offset 16
                               MemberDecorate 20($Global) 3 Offset 32
                               MemberDecorate 20($Global) 4 Offset 48
-                              MemberDecorate 20($Global) 5 Offset 52
+                              MemberDecorate 20($Global) 5 Offset 56
                               MemberDecorate 20($Global) 6 Offset 64
                               MemberDecorate 20($Global) 7 Offset 80
                               Decorate 20($Global) Block
@@ -267,8 +270,8 @@
                               Decorate 46(g_tTex2df4a) DescriptorSet 0
                               Decorate 55(g_tTex2di4a) DescriptorSet 0
                               Decorate 62(g_tTex2du4a) DescriptorSet 0
-                              Decorate 82(Color) Location 0
-                              Decorate 86(Depth) BuiltIn FragDepth
+                              Decorate 82(@entryPointOutput.Color) Location 0
+                              Decorate 86(@entryPointOutput.Depth) BuiltIn FragDepth
                               Decorate 91(g_sSamp) DescriptorSet 0
                               Decorate 91(g_sSamp) Binding 0
                               Decorate 94(g_tTex1df4) DescriptorSet 0
@@ -325,9 +328,9 @@
               72:             TypePointer Function 7(fvec4)
               74:             TypePointer Function 6(float)
               81:             TypePointer Output 7(fvec4)
-       82(Color):     81(ptr) Variable Output
+82(@entryPointOutput.Color):     81(ptr) Variable Output
               85:             TypePointer Output 6(float)
-       86(Depth):     85(ptr) Variable Output
+86(@entryPointOutput.Depth):     85(ptr) Variable Output
               89:             TypeSampler
               90:             TypePointer UniformConstant 89
      91(g_sSamp):     90(ptr) Variable UniformConstant
@@ -365,10 +368,10 @@
                               Store 79(flattenTemp) 80
               83:     72(ptr) AccessChain 79(flattenTemp) 69
               84:    7(fvec4) Load 83
-                              Store 82(Color) 84
+                              Store 82(@entryPointOutput.Color) 84
               87:     74(ptr) AccessChain 79(flattenTemp) 23
               88:    6(float) Load 87
-                              Store 86(Depth) 88
+                              Store 86(@entryPointOutput.Depth) 88
                               Return
                               FunctionEnd
       10(@main():8(PS_OUTPUT) Function None 9
diff --git a/Test/baseResults/hlsl.load.rwtexture.dx10.frag.out b/Test/baseResults/hlsl.load.rwtexture.dx10.frag.out
index 6e3e5ce..68044aa 100644
--- a/Test/baseResults/hlsl.load.rwtexture.dx10.frag.out
+++ b/Test/baseResults/hlsl.load.rwtexture.dx10.frag.out
@@ -1,6 +1,7 @@
 hlsl.load.rwtexture.dx10.frag
 Shader version: 500
 gl_FragCoord origin is upper left
+using depth_any
 0:? Sequence
 0:40  Function Definition: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:40    Function Parameters: 
@@ -86,13 +87,13 @@
 0:40          'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:40          Function Call: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:40        move second child to first child ( temp 4-component vector of float)
-0:?           'Color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 0:40          Color: direct index for structure ( temp 4-component vector of float)
 0:40            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:40            Constant:
 0:40              0 (const int)
 0:40        move second child to first child ( temp float)
-0:?           'Depth' ( out float FragDepth)
+0:?           '@entryPointOutput.Depth' ( out float FragDepth)
 0:40          Depth: direct index for structure ( temp float)
 0:40            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:40            Constant:
@@ -115,8 +116,8 @@
 0:?     'g_tTex2di4a' (layout( rgba32i) uniform iimage2DArray)
 0:?     'g_tTex2du4a' (layout( rgba32ui) uniform uimage2DArray)
 0:?     'anon@0' (layout( row_major std140) uniform block{ uniform int c1,  uniform 2-component vector of int c2,  uniform 3-component vector of int c3,  uniform 4-component vector of int c4,  uniform int o1,  uniform 2-component vector of int o2,  uniform 3-component vector of int o3,  uniform 4-component vector of int o4})
-0:?     'Color' (layout( location=0) out 4-component vector of float)
-0:?     'Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 
 Linked fragment stage:
@@ -124,6 +125,7 @@
 
 Shader version: 500
 gl_FragCoord origin is upper left
+using depth_any
 0:? Sequence
 0:40  Function Definition: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:40    Function Parameters: 
@@ -209,13 +211,13 @@
 0:40          'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:40          Function Call: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:40        move second child to first child ( temp 4-component vector of float)
-0:?           'Color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 0:40          Color: direct index for structure ( temp 4-component vector of float)
 0:40            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:40            Constant:
 0:40              0 (const int)
 0:40        move second child to first child ( temp float)
-0:?           'Depth' ( out float FragDepth)
+0:?           '@entryPointOutput.Depth' ( out float FragDepth)
 0:40          Depth: direct index for structure ( temp float)
 0:40            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:40            Constant:
@@ -238,19 +240,20 @@
 0:?     'g_tTex2di4a' (layout( rgba32i) uniform iimage2DArray)
 0:?     'g_tTex2du4a' (layout( rgba32ui) uniform uimage2DArray)
 0:?     'anon@0' (layout( row_major std140) uniform block{ uniform int c1,  uniform 2-component vector of int c2,  uniform 3-component vector of int c3,  uniform 4-component vector of int c4,  uniform int o1,  uniform 2-component vector of int o2,  uniform 3-component vector of int o3,  uniform 4-component vector of int o4})
-0:?     'Color' (layout( location=0) out 4-component vector of float)
-0:?     'Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 132
 
                               Capability Shader
-                              Capability Sampled1D
+                              Capability Image1D
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
                               EntryPoint Fragment 4  "main" 104 108
                               ExecutionMode 4 OriginUpperLeft
+                              ExecutionMode 4 DepthReplacing
                               Source HLSL 500
                               Name 4  "main"
                               Name 8  "PS_OUTPUT"
@@ -278,8 +281,8 @@
                               Name 85  "g_tTex3du4"
                               Name 91  "psout"
                               Name 101  "flattenTemp"
-                              Name 104  "Color"
-                              Name 108  "Depth"
+                              Name 104  "@entryPointOutput.Color"
+                              Name 108  "@entryPointOutput.Depth"
                               Name 113  "g_sSamp"
                               Name 116  "g_tTex1df4a"
                               Name 119  "g_tTex1di4a"
@@ -290,11 +293,11 @@
                               Decorate 14(g_tTex1df4) DescriptorSet 0
                               Decorate 14(g_tTex1df4) Binding 0
                               MemberDecorate 20($Global) 0 Offset 0
-                              MemberDecorate 20($Global) 1 Offset 4
+                              MemberDecorate 20($Global) 1 Offset 8
                               MemberDecorate 20($Global) 2 Offset 16
                               MemberDecorate 20($Global) 3 Offset 32
                               MemberDecorate 20($Global) 4 Offset 48
-                              MemberDecorate 20($Global) 5 Offset 52
+                              MemberDecorate 20($Global) 5 Offset 56
                               MemberDecorate 20($Global) 6 Offset 64
                               MemberDecorate 20($Global) 7 Offset 80
                               Decorate 20($Global) Block
@@ -307,8 +310,8 @@
                               Decorate 69(g_tTex3df4) DescriptorSet 0
                               Decorate 78(g_tTex3di4) DescriptorSet 0
                               Decorate 85(g_tTex3du4) DescriptorSet 0
-                              Decorate 104(Color) Location 0
-                              Decorate 108(Depth) BuiltIn FragDepth
+                              Decorate 104(@entryPointOutput.Color) Location 0
+                              Decorate 108(@entryPointOutput.Depth) BuiltIn FragDepth
                               Decorate 113(g_sSamp) DescriptorSet 0
                               Decorate 113(g_sSamp) Binding 0
                               Decorate 116(g_tTex1df4a) DescriptorSet 0
@@ -371,9 +374,9 @@
               94:             TypePointer Function 7(fvec4)
               96:             TypePointer Function 6(float)
              103:             TypePointer Output 7(fvec4)
-      104(Color):    103(ptr) Variable Output
+104(@entryPointOutput.Color):    103(ptr) Variable Output
              107:             TypePointer Output 6(float)
-      108(Depth):    107(ptr) Variable Output
+108(@entryPointOutput.Depth):    107(ptr) Variable Output
              111:             TypeSampler
              112:             TypePointer UniformConstant 111
     113(g_sSamp):    112(ptr) Variable UniformConstant
@@ -402,10 +405,10 @@
                               Store 101(flattenTemp) 102
              105:     94(ptr) AccessChain 101(flattenTemp) 23
              106:    7(fvec4) Load 105
-                              Store 104(Color) 106
+                              Store 104(@entryPointOutput.Color) 106
              109:     96(ptr) AccessChain 101(flattenTemp) 48
              110:    6(float) Load 109
-                              Store 108(Depth) 110
+                              Store 108(@entryPointOutput.Depth) 110
                               Return
                               FunctionEnd
       10(@main():8(PS_OUTPUT) Function None 9
diff --git a/Test/baseResults/hlsl.localStructuredBuffer.comp.out b/Test/baseResults/hlsl.localStructuredBuffer.comp.out
new file mode 100644
index 0000000..a2b4db0
--- /dev/null
+++ b/Test/baseResults/hlsl.localStructuredBuffer.comp.out
@@ -0,0 +1,34 @@
+hlsl.localStructuredBuffer.comp
+ERROR: 0:3: 'block initializer' : buffer aliasing not yet supported 
+ERROR: 1 compilation errors.  No code generated.
+
+
+Shader version: 500
+local_size = (1, 1, 1)
+ERROR: node is still EOpNull!
+0:2  Function Definition: @main( ( temp void)
+0:2    Function Parameters: 
+0:2  Function Definition: main( ( temp void)
+0:2    Function Parameters: 
+0:?     Sequence
+0:2      Function Call: @main( ( temp void)
+0:?   Linker Objects
+0:?     'srt0' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
+
+
+Linked compute stage:
+
+
+Shader version: 500
+local_size = (1, 1, 1)
+ERROR: node is still EOpNull!
+0:2  Function Definition: @main( ( temp void)
+0:2    Function Parameters: 
+0:2  Function Definition: main( ( temp void)
+0:2    Function Parameters: 
+0:?     Sequence
+0:2      Function Call: @main( ( temp void)
+0:?   Linker Objects
+0:?     'srt0' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
+
+SPIR-V is not generated for failed compile or link
diff --git a/Test/baseResults/hlsl.logical.binary.frag.out b/Test/baseResults/hlsl.logical.binary.frag.out
index 587e3d5..b90811b 100644
--- a/Test/baseResults/hlsl.logical.binary.frag.out
+++ b/Test/baseResults/hlsl.logical.binary.frag.out
@@ -13,12 +13,11 @@
 0:13              'anon@0' (layout( row_major std140) uniform block{ uniform int ival,  uniform 4-component vector of int ival4,  uniform float fval,  uniform 4-component vector of float fval4})
 0:13              Constant:
 0:13                0 (const uint)
-0:13          Convert int to bool ( temp bool)
-0:13            Convert float to int ( temp int)
-0:13              fval: direct index for structure ( uniform float)
-0:13                'anon@0' (layout( row_major std140) uniform block{ uniform int ival,  uniform 4-component vector of int ival4,  uniform float fval,  uniform 4-component vector of float fval4})
-0:13                Constant:
-0:13                  2 (const uint)
+0:13          Convert float to bool ( temp bool)
+0:13            fval: direct index for structure ( uniform float)
+0:13              'anon@0' (layout( row_major std140) uniform block{ uniform int ival,  uniform 4-component vector of int ival4,  uniform float fval,  uniform 4-component vector of float fval4})
+0:13              Constant:
+0:13                2 (const uint)
 0:13        true case is null
 0:14      Test condition and select ( temp void)
 0:14        Condition
@@ -28,12 +27,11 @@
 0:14              'anon@0' (layout( row_major std140) uniform block{ uniform int ival,  uniform 4-component vector of int ival4,  uniform float fval,  uniform 4-component vector of float fval4})
 0:14              Constant:
 0:14                0 (const uint)
-0:14          Convert int to bool ( temp bool)
-0:14            Convert float to int ( temp int)
-0:14              fval: direct index for structure ( uniform float)
-0:14                'anon@0' (layout( row_major std140) uniform block{ uniform int ival,  uniform 4-component vector of int ival4,  uniform float fval,  uniform 4-component vector of float fval4})
-0:14                Constant:
-0:14                  2 (const uint)
+0:14          Convert float to bool ( temp bool)
+0:14            fval: direct index for structure ( uniform float)
+0:14              'anon@0' (layout( row_major std140) uniform block{ uniform int ival,  uniform 4-component vector of int ival4,  uniform float fval,  uniform 4-component vector of float fval4})
+0:14              Constant:
+0:14                2 (const uint)
 0:14        true case is null
 0:17      move second child to first child ( temp 4-component vector of float)
 0:17        Color: direct index for structure ( temp 4-component vector of float)
@@ -52,14 +50,14 @@
 0:?     Sequence
 0:12      Sequence
 0:12        move second child to first child ( temp 4-component vector of float)
-0:?           'Color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 0:12          Color: direct index for structure ( temp 4-component vector of float)
 0:12            Function Call: @main( ( temp structure{ temp 4-component vector of float Color})
 0:12            Constant:
 0:12              0 (const int)
 0:?   Linker Objects
 0:?     'anon@0' (layout( row_major std140) uniform block{ uniform int ival,  uniform 4-component vector of int ival4,  uniform float fval,  uniform 4-component vector of float fval4})
-0:?     'Color' (layout( location=0) out 4-component vector of float)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 
 Linked fragment stage:
@@ -79,12 +77,11 @@
 0:13              'anon@0' (layout( row_major std140) uniform block{ uniform int ival,  uniform 4-component vector of int ival4,  uniform float fval,  uniform 4-component vector of float fval4})
 0:13              Constant:
 0:13                0 (const uint)
-0:13          Convert int to bool ( temp bool)
-0:13            Convert float to int ( temp int)
-0:13              fval: direct index for structure ( uniform float)
-0:13                'anon@0' (layout( row_major std140) uniform block{ uniform int ival,  uniform 4-component vector of int ival4,  uniform float fval,  uniform 4-component vector of float fval4})
-0:13                Constant:
-0:13                  2 (const uint)
+0:13          Convert float to bool ( temp bool)
+0:13            fval: direct index for structure ( uniform float)
+0:13              'anon@0' (layout( row_major std140) uniform block{ uniform int ival,  uniform 4-component vector of int ival4,  uniform float fval,  uniform 4-component vector of float fval4})
+0:13              Constant:
+0:13                2 (const uint)
 0:13        true case is null
 0:14      Test condition and select ( temp void)
 0:14        Condition
@@ -94,12 +91,11 @@
 0:14              'anon@0' (layout( row_major std140) uniform block{ uniform int ival,  uniform 4-component vector of int ival4,  uniform float fval,  uniform 4-component vector of float fval4})
 0:14              Constant:
 0:14                0 (const uint)
-0:14          Convert int to bool ( temp bool)
-0:14            Convert float to int ( temp int)
-0:14              fval: direct index for structure ( uniform float)
-0:14                'anon@0' (layout( row_major std140) uniform block{ uniform int ival,  uniform 4-component vector of int ival4,  uniform float fval,  uniform 4-component vector of float fval4})
-0:14                Constant:
-0:14                  2 (const uint)
+0:14          Convert float to bool ( temp bool)
+0:14            fval: direct index for structure ( uniform float)
+0:14              'anon@0' (layout( row_major std140) uniform block{ uniform int ival,  uniform 4-component vector of int ival4,  uniform float fval,  uniform 4-component vector of float fval4})
+0:14              Constant:
+0:14                2 (const uint)
 0:14        true case is null
 0:17      move second child to first child ( temp 4-component vector of float)
 0:17        Color: direct index for structure ( temp 4-component vector of float)
@@ -118,117 +114,105 @@
 0:?     Sequence
 0:12      Sequence
 0:12        move second child to first child ( temp 4-component vector of float)
-0:?           'Color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 0:12          Color: direct index for structure ( temp 4-component vector of float)
 0:12            Function Call: @main( ( temp structure{ temp 4-component vector of float Color})
 0:12            Constant:
 0:12              0 (const int)
 0:?   Linker Objects
 0:?     'anon@0' (layout( row_major std140) uniform block{ uniform int ival,  uniform 4-component vector of int ival4,  uniform float fval,  uniform 4-component vector of float fval4})
-0:?     'Color' (layout( location=0) out 4-component vector of float)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80001
-// Id's are bound by 62
+// Generated by (magic number): 80007
+// Id's are bound by 56
 
                               Capability Shader
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "main" 59
+                              EntryPoint Fragment 4  "main" 53
                               ExecutionMode 4 OriginUpperLeft
                               Source HLSL 500
                               Name 4  "main"
                               Name 8  "PS_OUTPUT"
                               MemberName 8(PS_OUTPUT) 0  "Color"
                               Name 10  "@main("
-                              Name 15  "$Global"
-                              MemberName 15($Global) 0  "ival"
-                              MemberName 15($Global) 1  "ival4"
-                              MemberName 15($Global) 2  "fval"
-                              MemberName 15($Global) 3  "fval4"
-                              Name 17  ""
-                              Name 50  "psout"
-                              Name 59  "Color"
-                              MemberDecorate 15($Global) 0 Offset 0
-                              MemberDecorate 15($Global) 1 Offset 16
-                              MemberDecorate 15($Global) 2 Offset 32
-                              MemberDecorate 15($Global) 3 Offset 48
-                              Decorate 15($Global) Block
-                              Decorate 17 DescriptorSet 0
-                              Decorate 59(Color) Location 0
+                              Name 14  "$Global"
+                              MemberName 14($Global) 0  "ival"
+                              MemberName 14($Global) 1  "ival4"
+                              MemberName 14($Global) 2  "fval"
+                              MemberName 14($Global) 3  "fval4"
+                              Name 16  ""
+                              Name 44  "psout"
+                              Name 53  "@entryPointOutput.Color"
+                              MemberDecorate 14($Global) 0 Offset 0
+                              MemberDecorate 14($Global) 1 Offset 16
+                              MemberDecorate 14($Global) 2 Offset 32
+                              MemberDecorate 14($Global) 3 Offset 48
+                              Decorate 14($Global) Block
+                              Decorate 16 DescriptorSet 0
+                              Decorate 53(@entryPointOutput.Color) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
                7:             TypeVector 6(float) 4
     8(PS_OUTPUT):             TypeStruct 7(fvec4)
                9:             TypeFunction 8(PS_OUTPUT)
-              12:             TypeBool
-              13:             TypeInt 32 1
-              14:             TypeVector 13(int) 4
-     15($Global):             TypeStruct 13(int) 14(ivec4) 6(float) 7(fvec4)
-              16:             TypePointer Uniform 15($Global)
-              17:     16(ptr) Variable Uniform
-              18:     13(int) Constant 0
-              19:             TypePointer Uniform 13(int)
+              12:             TypeInt 32 1
+              13:             TypeVector 12(int) 4
+     14($Global):             TypeStruct 12(int) 13(ivec4) 6(float) 7(fvec4)
+              15:             TypePointer Uniform 14($Global)
+              16:     15(ptr) Variable Uniform
+              17:     12(int) Constant 0
+              18:             TypePointer Uniform 12(int)
+              21:             TypeBool
               22:             TypeInt 32 0
               23:     22(int) Constant 0
-              27:     13(int) Constant 2
-              28:             TypePointer Uniform 6(float)
-              49:             TypePointer Function 8(PS_OUTPUT)
-              51:    6(float) Constant 1065353216
-              52:    7(fvec4) ConstantComposite 51 51 51 51
-              53:             TypePointer Function 7(fvec4)
-              58:             TypePointer Output 7(fvec4)
-       59(Color):     58(ptr) Variable Output
+              25:     12(int) Constant 2
+              26:             TypePointer Uniform 6(float)
+              29:    6(float) Constant 0
+              43:             TypePointer Function 8(PS_OUTPUT)
+              45:    6(float) Constant 1065353216
+              46:    7(fvec4) ConstantComposite 45 45 45 45
+              47:             TypePointer Function 7(fvec4)
+              52:             TypePointer Output 7(fvec4)
+53(@entryPointOutput.Color):     52(ptr) Variable Output
          4(main):           2 Function None 3
                5:             Label
-              60:8(PS_OUTPUT) FunctionCall 10(@main()
-              61:    7(fvec4) CompositeExtract 60 0
-                              Store 59(Color) 61
+              54:8(PS_OUTPUT) FunctionCall 10(@main()
+              55:    7(fvec4) CompositeExtract 54 0
+                              Store 53(@entryPointOutput.Color) 55
                               Return
                               FunctionEnd
       10(@main():8(PS_OUTPUT) Function None 9
               11:             Label
-       50(psout):     49(ptr) Variable Function
-              20:     19(ptr) AccessChain 17 18
-              21:     13(int) Load 20
-              24:    12(bool) INotEqual 21 23
-                              SelectionMerge 26 None
-                              BranchConditional 24 25 26
-              25:               Label
-              29:     28(ptr)   AccessChain 17 27
-              30:    6(float)   Load 29
-              31:     13(int)   ConvertFToS 30
-              32:    12(bool)   INotEqual 31 23
-                                Branch 26
-              26:             Label
-              33:    12(bool) Phi 24 11 32 25
-                              SelectionMerge 35 None
-                              BranchConditional 33 34 35
-              34:               Label
-                                Branch 35
-              35:             Label
-              36:     19(ptr) AccessChain 17 18
-              37:     13(int) Load 36
-              38:    12(bool) INotEqual 37 23
-              39:    12(bool) LogicalNot 38
-                              SelectionMerge 41 None
-                              BranchConditional 39 40 41
-              40:               Label
-              42:     28(ptr)   AccessChain 17 27
-              43:    6(float)   Load 42
-              44:     13(int)   ConvertFToS 43
-              45:    12(bool)   INotEqual 44 23
-                                Branch 41
-              41:             Label
-              46:    12(bool) Phi 38 35 45 40
-                              SelectionMerge 48 None
-                              BranchConditional 46 47 48
-              47:               Label
-                                Branch 48
-              48:             Label
-              54:     53(ptr) AccessChain 50(psout) 18
-                              Store 54 52
-              55:8(PS_OUTPUT) Load 50(psout)
-                              ReturnValue 55
+       44(psout):     43(ptr) Variable Function
+              19:     18(ptr) AccessChain 16 17
+              20:     12(int) Load 19
+              24:    21(bool) INotEqual 20 23
+              27:     26(ptr) AccessChain 16 25
+              28:    6(float) Load 27
+              30:    21(bool) FOrdNotEqual 28 29
+              31:    21(bool) LogicalAnd 24 30
+                              SelectionMerge 33 None
+                              BranchConditional 31 32 33
+              32:               Label
+                                Branch 33
+              33:             Label
+              34:     18(ptr) AccessChain 16 17
+              35:     12(int) Load 34
+              36:    21(bool) INotEqual 35 23
+              37:     26(ptr) AccessChain 16 25
+              38:    6(float) Load 37
+              39:    21(bool) FOrdNotEqual 38 29
+              40:    21(bool) LogicalOr 36 39
+                              SelectionMerge 42 None
+                              BranchConditional 40 41 42
+              41:               Label
+                                Branch 42
+              42:             Label
+              48:     47(ptr) AccessChain 44(psout) 17
+                              Store 48 46
+              49:8(PS_OUTPUT) Load 44(psout)
+                              ReturnValue 49
                               FunctionEnd
diff --git a/Test/baseResults/hlsl.logical.binary.vec.frag.out b/Test/baseResults/hlsl.logical.binary.vec.frag.out
index a03890c..32753e5 100644
--- a/Test/baseResults/hlsl.logical.binary.vec.frag.out
+++ b/Test/baseResults/hlsl.logical.binary.vec.frag.out
@@ -115,14 +115,14 @@
 0:?     Sequence
 0:10      Sequence
 0:10        move second child to first child ( temp 4-component vector of float)
-0:?           'Color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 0:10          Color: direct index for structure ( temp 4-component vector of float)
 0:10            Function Call: @main( ( temp structure{ temp 4-component vector of float Color})
 0:10            Constant:
 0:10              0 (const int)
 0:?   Linker Objects
 0:?     'anon@0' (layout( row_major std140) uniform block{ uniform 4-component vector of bool b4a,  uniform 4-component vector of bool b4b,  uniform bool b1a,  uniform bool b1b})
-0:?     'Color' (layout( location=0) out 4-component vector of float)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 
 Linked fragment stage:
@@ -244,23 +244,23 @@
 0:?     Sequence
 0:10      Sequence
 0:10        move second child to first child ( temp 4-component vector of float)
-0:?           'Color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 0:10          Color: direct index for structure ( temp 4-component vector of float)
 0:10            Function Call: @main( ( temp structure{ temp 4-component vector of float Color})
 0:10            Constant:
 0:10              0 (const int)
 0:?   Linker Objects
 0:?     'anon@0' (layout( row_major std140) uniform block{ uniform 4-component vector of bool b4a,  uniform 4-component vector of bool b4b,  uniform bool b1a,  uniform bool b1b})
-0:?     'Color' (layout( location=0) out 4-component vector of float)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80001
-// Id's are bound by 120
+// Generated by (magic number): 80007
+// Id's are bound by 115
 
                               Capability Shader
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "main" 117
+                              EntryPoint Fragment 4  "main" 112
                               ExecutionMode 4 OriginUpperLeft
                               Source HLSL 500
                               Name 4  "main"
@@ -279,16 +279,16 @@
                               Name 47  "r10"
                               Name 58  "r11"
                               Name 67  "r20"
-                              Name 79  "r21"
-                              Name 92  "psout"
-                              Name 117  "Color"
+                              Name 77  "r21"
+                              Name 87  "psout"
+                              Name 112  "@entryPointOutput.Color"
                               MemberDecorate 18($Global) 0 Offset 0
                               MemberDecorate 18($Global) 1 Offset 16
                               MemberDecorate 18($Global) 2 Offset 32
                               MemberDecorate 18($Global) 3 Offset 36
                               Decorate 18($Global) Block
                               Decorate 20 DescriptorSet 0
-                              Decorate 117(Color) Location 0
+                              Decorate 112(@entryPointOutput.Color) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -311,20 +311,20 @@
               34:     21(int) Constant 1
               48:     21(int) Constant 2
               49:             TypePointer Uniform 16(int)
-              73:     21(int) Constant 3
-              91:             TypePointer Function 8(PS_OUTPUT)
-             106:    6(float) Constant 0
-             107:    6(float) Constant 1065353216
-             108:    7(fvec4) ConstantComposite 106 106 106 106
-             109:    7(fvec4) ConstantComposite 107 107 107 107
-             111:             TypePointer Function 7(fvec4)
-             116:             TypePointer Output 7(fvec4)
-      117(Color):    116(ptr) Variable Output
+              71:     21(int) Constant 3
+              86:             TypePointer Function 8(PS_OUTPUT)
+             101:    6(float) Constant 0
+             102:    6(float) Constant 1065353216
+             103:    7(fvec4) ConstantComposite 101 101 101 101
+             104:    7(fvec4) ConstantComposite 102 102 102 102
+             106:             TypePointer Function 7(fvec4)
+             111:             TypePointer Output 7(fvec4)
+112(@entryPointOutput.Color):    111(ptr) Variable Output
          4(main):           2 Function None 3
                5:             Label
-             118:8(PS_OUTPUT) FunctionCall 10(@main()
-             119:    7(fvec4) CompositeExtract 118 0
-                              Store 117(Color) 119
+             113:8(PS_OUTPUT) FunctionCall 10(@main()
+             114:    7(fvec4) CompositeExtract 113 0
+                              Store 112(@entryPointOutput.Color) 114
                               Return
                               FunctionEnd
       10(@main():8(PS_OUTPUT) Function None 9
@@ -335,8 +335,8 @@
          47(r10):     14(ptr) Variable Function
          58(r11):     14(ptr) Variable Function
          67(r20):     14(ptr) Variable Function
-         79(r21):     14(ptr) Variable Function
-       92(psout):     91(ptr) Variable Function
+         77(r21):     14(ptr) Variable Function
+       87(psout):     86(ptr) Variable Function
               24:     23(ptr) AccessChain 20 22
               25:   17(ivec4) Load 24
               28:   13(bvec4) INotEqual 25 27
@@ -379,48 +379,37 @@
               68:     23(ptr) AccessChain 20 22
               69:   17(ivec4) Load 68
               70:   13(bvec4) INotEqual 69 27
-                              SelectionMerge 72 None
-                              BranchConditional 70 71 72
-              71:               Label
-              74:     49(ptr)   AccessChain 20 73
-              75:     16(int)   Load 74
-              76:    12(bool)   INotEqual 75 26
-              77:   13(bvec4)   CompositeConstruct 76 76 76 76
-                                Branch 72
-              72:             Label
-              78:    12(bool) Phi 70 11 77 71
-                              Store 67(r20) 78
-              80:     23(ptr) AccessChain 20 22
-              81:   17(ivec4) Load 80
-              82:   13(bvec4) INotEqual 81 27
-              83:    12(bool) LogicalNot 82
-                              SelectionMerge 85 None
-                              BranchConditional 83 84 85
-              84:               Label
-              86:     49(ptr)   AccessChain 20 73
-              87:     16(int)   Load 86
-              88:    12(bool)   INotEqual 87 26
-              89:   13(bvec4)   CompositeConstruct 88 88 88 88
-                                Branch 85
-              85:             Label
-              90:    12(bool) Phi 82 72 89 84
-                              Store 79(r21) 90
-              93:   13(bvec4) Load 15(r00)
-              94:   13(bvec4) Load 30(r01)
-              95:   13(bvec4) LogicalOr 93 94
-              96:   13(bvec4) Load 39(r02)
-              97:   13(bvec4) LogicalOr 95 96
-              98:   13(bvec4) Load 47(r10)
-              99:   13(bvec4) LogicalOr 97 98
-             100:   13(bvec4) Load 58(r11)
-             101:   13(bvec4) LogicalOr 99 100
-             102:   13(bvec4) Load 67(r20)
-             103:   13(bvec4) LogicalOr 101 102
-             104:   13(bvec4) Load 79(r21)
-             105:   13(bvec4) LogicalOr 103 104
-             110:    7(fvec4) Select 105 109 108
-             112:    111(ptr) AccessChain 92(psout) 22
-                              Store 112 110
-             113:8(PS_OUTPUT) Load 92(psout)
-                              ReturnValue 113
+              72:     49(ptr) AccessChain 20 71
+              73:     16(int) Load 72
+              74:    12(bool) INotEqual 73 26
+              75:   13(bvec4) CompositeConstruct 74 74 74 74
+              76:   13(bvec4) LogicalAnd 70 75
+                              Store 67(r20) 76
+              78:     23(ptr) AccessChain 20 22
+              79:   17(ivec4) Load 78
+              80:   13(bvec4) INotEqual 79 27
+              81:     49(ptr) AccessChain 20 71
+              82:     16(int) Load 81
+              83:    12(bool) INotEqual 82 26
+              84:   13(bvec4) CompositeConstruct 83 83 83 83
+              85:   13(bvec4) LogicalOr 80 84
+                              Store 77(r21) 85
+              88:   13(bvec4) Load 15(r00)
+              89:   13(bvec4) Load 30(r01)
+              90:   13(bvec4) LogicalOr 88 89
+              91:   13(bvec4) Load 39(r02)
+              92:   13(bvec4) LogicalOr 90 91
+              93:   13(bvec4) Load 47(r10)
+              94:   13(bvec4) LogicalOr 92 93
+              95:   13(bvec4) Load 58(r11)
+              96:   13(bvec4) LogicalOr 94 95
+              97:   13(bvec4) Load 67(r20)
+              98:   13(bvec4) LogicalOr 96 97
+              99:   13(bvec4) Load 77(r21)
+             100:   13(bvec4) LogicalOr 98 99
+             105:    7(fvec4) Select 100 104 103
+             107:    106(ptr) AccessChain 87(psout) 22
+                              Store 107 105
+             108:8(PS_OUTPUT) Load 87(psout)
+                              ReturnValue 108
                               FunctionEnd
diff --git a/Test/baseResults/hlsl.logical.unary.frag.out b/Test/baseResults/hlsl.logical.unary.frag.out
index 7121d92..25dbc2a 100644
--- a/Test/baseResults/hlsl.logical.unary.frag.out
+++ b/Test/baseResults/hlsl.logical.unary.frag.out
@@ -80,14 +80,14 @@
 0:?     Sequence
 0:12      Sequence
 0:12        move second child to first child ( temp 4-component vector of float)
-0:?           'Color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 0:12          Color: direct index for structure ( temp 4-component vector of float)
 0:12            Function Call: @main( ( temp structure{ temp 4-component vector of float Color})
 0:12            Constant:
 0:12              0 (const int)
 0:?   Linker Objects
 0:?     'anon@0' (layout( row_major std140) uniform block{ uniform int ival,  uniform 4-component vector of int ival4,  uniform float fval,  uniform 4-component vector of float fval4})
-0:?     'Color' (layout( location=0) out 4-component vector of float)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 
 Linked fragment stage:
@@ -174,17 +174,17 @@
 0:?     Sequence
 0:12      Sequence
 0:12        move second child to first child ( temp 4-component vector of float)
-0:?           'Color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 0:12          Color: direct index for structure ( temp 4-component vector of float)
 0:12            Function Call: @main( ( temp structure{ temp 4-component vector of float Color})
 0:12            Constant:
 0:12              0 (const int)
 0:?   Linker Objects
 0:?     'anon@0' (layout( row_major std140) uniform block{ uniform int ival,  uniform 4-component vector of int ival4,  uniform float fval,  uniform 4-component vector of float fval4})
-0:?     'Color' (layout( location=0) out 4-component vector of float)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 84
 
                               Capability Shader
@@ -204,14 +204,14 @@
                               MemberName 14($Global) 3  "fval4"
                               Name 16  ""
                               Name 72  "psout"
-                              Name 81  "Color"
+                              Name 81  "@entryPointOutput.Color"
                               MemberDecorate 14($Global) 0 Offset 0
                               MemberDecorate 14($Global) 1 Offset 16
                               MemberDecorate 14($Global) 2 Offset 32
                               MemberDecorate 14($Global) 3 Offset 48
                               Decorate 14($Global) Block
                               Decorate 16 DescriptorSet 0
-                              Decorate 81(Color) Location 0
+                              Decorate 81(@entryPointOutput.Color) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -244,12 +244,12 @@
               74:    7(fvec4) ConstantComposite 73 73 73 73
               75:             TypePointer Function 7(fvec4)
               80:             TypePointer Output 7(fvec4)
-       81(Color):     80(ptr) Variable Output
+81(@entryPointOutput.Color):     80(ptr) Variable Output
          4(main):           2 Function None 3
                5:             Label
               82:8(PS_OUTPUT) FunctionCall 10(@main()
               83:    7(fvec4) CompositeExtract 82 0
-                              Store 81(Color) 83
+                              Store 81(@entryPointOutput.Color) 83
                               Return
                               FunctionEnd
       10(@main():8(PS_OUTPUT) Function None 9
diff --git a/Test/baseResults/hlsl.logicalConvert.frag.out b/Test/baseResults/hlsl.logicalConvert.frag.out
old mode 100755
new mode 100644
index a49a718..6c595f8
--- a/Test/baseResults/hlsl.logicalConvert.frag.out
+++ b/Test/baseResults/hlsl.logicalConvert.frag.out
@@ -71,6 +71,50 @@
 0:14            0.000000
 0:14            0.000000
 0:14            0.000000
+0:15      Test condition and select ( temp void)
+0:15        Condition
+0:15        Constant:
+0:15          true (const bool)
+0:15        true case
+0:16        Branch: Return with expression
+0:16          Constant:
+0:16            0.000000
+0:16            0.000000
+0:16            0.000000
+0:16            0.000000
+0:17      Test condition and select ( temp void)
+0:17        Condition
+0:17        Constant:
+0:17          false (const bool)
+0:17        true case
+0:18        Branch: Return with expression
+0:18          Constant:
+0:18            0.000000
+0:18            0.000000
+0:18            0.000000
+0:18            0.000000
+0:19      Test condition and select ( temp void)
+0:19        Condition
+0:19        Constant:
+0:19          true (const bool)
+0:19        true case
+0:20        Branch: Return with expression
+0:20          Constant:
+0:20            0.000000
+0:20            0.000000
+0:20            0.000000
+0:20            0.000000
+0:21      Test condition and select ( temp void)
+0:21        Condition
+0:21        Constant:
+0:21          true (const bool)
+0:21        true case
+0:22        Branch: Return with expression
+0:22          Constant:
+0:22            0.000000
+0:22            0.000000
+0:22            0.000000
+0:22            0.000000
 0:2  Function Definition: main( ( temp void)
 0:2    Function Parameters: 
 0:?     Sequence
@@ -156,6 +200,50 @@
 0:14            0.000000
 0:14            0.000000
 0:14            0.000000
+0:15      Test condition and select ( temp void)
+0:15        Condition
+0:15        Constant:
+0:15          true (const bool)
+0:15        true case
+0:16        Branch: Return with expression
+0:16          Constant:
+0:16            0.000000
+0:16            0.000000
+0:16            0.000000
+0:16            0.000000
+0:17      Test condition and select ( temp void)
+0:17        Condition
+0:17        Constant:
+0:17          false (const bool)
+0:17        true case
+0:18        Branch: Return with expression
+0:18          Constant:
+0:18            0.000000
+0:18            0.000000
+0:18            0.000000
+0:18            0.000000
+0:19      Test condition and select ( temp void)
+0:19        Condition
+0:19        Constant:
+0:19          true (const bool)
+0:19        true case
+0:20        Branch: Return with expression
+0:20          Constant:
+0:20            0.000000
+0:20            0.000000
+0:20            0.000000
+0:20            0.000000
+0:21      Test condition and select ( temp void)
+0:21        Condition
+0:21        Constant:
+0:21          true (const bool)
+0:21        true case
+0:22        Branch: Return with expression
+0:22          Constant:
+0:22            0.000000
+0:22            0.000000
+0:22            0.000000
+0:22            0.000000
 0:2  Function Definition: main( ( temp void)
 0:2    Function Parameters: 
 0:?     Sequence
@@ -166,19 +254,19 @@
 0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80001
-// Id's are bound by 38
+// Generated by (magic number): 80007
+// Id's are bound by 50
 
                               Capability Shader
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "main" 36
+                              EntryPoint Fragment 4  "main" 48
                               ExecutionMode 4 OriginUpperLeft
                               Source HLSL 500
                               Name 4  "main"
                               Name 9  "@main("
-                              Name 36  "@entryPointOutput"
-                              Decorate 36(@entryPointOutput) Location 0
+                              Name 48  "@entryPointOutput"
+                              Decorate 48(@entryPointOutput) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -189,12 +277,12 @@
               15:    6(float) Constant 0
               16:    7(fvec4) ConstantComposite 15 15 15 15
               21:    11(bool) ConstantTrue
-              35:             TypePointer Output 7(fvec4)
-36(@entryPointOutput):     35(ptr) Variable Output
+              47:             TypePointer Output 7(fvec4)
+48(@entryPointOutput):     47(ptr) Variable Output
          4(main):           2 Function None 3
                5:             Label
-              37:    7(fvec4) FunctionCall 9(@main()
-                              Store 36(@entryPointOutput) 37
+              49:    7(fvec4) FunctionCall 9(@main()
+                              Store 48(@entryPointOutput) 49
                               Return
                               FunctionEnd
        9(@main():    7(fvec4) Function None 8
@@ -229,6 +317,26 @@
               31:               Label
                                 ReturnValue 16
               32:             Label
-              34:    7(fvec4) Undef
-                              ReturnValue 34
+                              SelectionMerge 35 None
+                              BranchConditional 21 34 35
+              34:               Label
+                                ReturnValue 16
+              35:             Label
+                              SelectionMerge 38 None
+                              BranchConditional 12 37 38
+              37:               Label
+                                ReturnValue 16
+              38:             Label
+                              SelectionMerge 41 None
+                              BranchConditional 21 40 41
+              40:               Label
+                                ReturnValue 16
+              41:             Label
+                              SelectionMerge 44 None
+                              BranchConditional 21 43 44
+              43:               Label
+                                ReturnValue 16
+              44:             Label
+              46:    7(fvec4) Undef
+                              ReturnValue 46
                               FunctionEnd
diff --git a/Test/baseResults/hlsl.loopattr.frag.out b/Test/baseResults/hlsl.loopattr.frag.out
index 81b6c29..cc0073a 100644
--- a/Test/baseResults/hlsl.loopattr.frag.out
+++ b/Test/baseResults/hlsl.loopattr.frag.out
@@ -10,7 +10,7 @@
 0:5          'x' ( temp int)
 0:5          Constant:
 0:5            0 (const int)
-0:5        Loop with condition tested first
+0:5        Loop with condition tested first: Unroll
 0:5          Loop Condition
 0:5          Compare Less Than ( temp bool)
 0:5            'x' ( temp int)
@@ -25,7 +25,7 @@
 0:8          'y' ( temp int)
 0:8          Constant:
 0:8            0 (const int)
-0:8        Loop with condition tested first
+0:8        Loop with condition tested first: DontUnroll
 0:8          Loop Condition
 0:8          Compare Less Than ( temp bool)
 0:8            'y' ( temp int)
@@ -80,7 +80,7 @@
 0:5          'x' ( temp int)
 0:5          Constant:
 0:5            0 (const int)
-0:5        Loop with condition tested first
+0:5        Loop with condition tested first: Unroll
 0:5          Loop Condition
 0:5          Compare Less Than ( temp bool)
 0:5            'x' ( temp int)
@@ -95,7 +95,7 @@
 0:8          'y' ( temp int)
 0:8          Constant:
 0:8            0 (const int)
-0:8        Loop with condition tested first
+0:8        Loop with condition tested first: DontUnroll
 0:8          Loop Condition
 0:8          Compare Less Than ( temp bool)
 0:8            'y' ( temp int)
@@ -136,7 +136,7 @@
 0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 54
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.matNx1.frag.out b/Test/baseResults/hlsl.matNx1.frag.out
index 0360db4..276d4c2 100644
--- a/Test/baseResults/hlsl.matNx1.frag.out
+++ b/Test/baseResults/hlsl.matNx1.frag.out
@@ -65,13 +65,13 @@
 0:?     Sequence
 0:27      Sequence
 0:27        move second child to first child ( temp 4-component vector of float)
-0:?           'color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.color' (layout( location=0) out 4-component vector of float)
 0:27          color: direct index for structure ( temp 4-component vector of float)
 0:27            Function Call: @main( ( temp structure{ temp 4-component vector of float color})
 0:27            Constant:
 0:27              0 (const int)
 0:?   Linker Objects
-0:?     'color' (layout( location=0) out 4-component vector of float)
+0:?     '@entryPointOutput.color' (layout( location=0) out 4-component vector of float)
 
 
 Linked fragment stage:
@@ -143,16 +143,20 @@
 0:?     Sequence
 0:27      Sequence
 0:27        move second child to first child ( temp 4-component vector of float)
-0:?           'color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.color' (layout( location=0) out 4-component vector of float)
 0:27          color: direct index for structure ( temp 4-component vector of float)
 0:27            Function Call: @main( ( temp structure{ temp 4-component vector of float color})
 0:27            Constant:
 0:27              0 (const int)
 0:?   Linker Objects
-0:?     'color' (layout( location=0) out 4-component vector of float)
+0:?     '@entryPointOutput.color' (layout( location=0) out 4-component vector of float)
+
+error: SPIRV-Tools Validation Errors
+error: Illegal number of components (1) for TypeVector
+  %v1float = OpTypeVector %float 1
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 77
 
                               Capability Shader
@@ -182,8 +186,8 @@
                               Name 58  "r13"
                               Name 59  "f1x4"
                               Name 63  "ps_output"
-                              Name 74  "color"
-                              Decorate 74(color) Location 0
+                              Name 74  "@entryPointOutput.color"
+                              Decorate 74(@entryPointOutput.color) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                8:             TypeFloat 32
@@ -214,12 +218,12 @@
               67:    9(fvec4) ConstantComposite 66 66 66 66
               68:             TypePointer Function 9(fvec4)
               73:             TypePointer Output 9(fvec4)
-       74(color):     73(ptr) Variable Output
+74(@entryPointOutput.color):     73(ptr) Variable Output
          4(main):           2 Function None 3
                5:             Label
               75:10(PS_OUTPUT) FunctionCall 12(@main()
               76:    9(fvec4) CompositeExtract 75 0
-                              Store 74(color) 76
+                              Store 74(@entryPointOutput.color) 76
                               Return
                               FunctionEnd
   6(TestMatNx1():           2 Function None 3
diff --git a/Test/baseResults/hlsl.matType.bool.frag.out b/Test/baseResults/hlsl.matType.bool.frag.out
index 3f261a3..900c60f 100644
--- a/Test/baseResults/hlsl.matType.bool.frag.out
+++ b/Test/baseResults/hlsl.matType.bool.frag.out
@@ -105,13 +105,13 @@
 0:?     Sequence
 0:49      Sequence
 0:49        move second child to first child ( temp 4-component vector of float)
-0:?           'color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.color' (layout( location=0) out 4-component vector of float)
 0:49          color: direct index for structure ( temp 4-component vector of float)
 0:49            Function Call: @main( ( temp structure{ temp 4-component vector of float color})
 0:49            Constant:
 0:49              0 (const int)
 0:?   Linker Objects
-0:?     'color' (layout( location=0) out 4-component vector of float)
+0:?     '@entryPointOutput.color' (layout( location=0) out 4-component vector of float)
 
 
 Linked fragment stage:
@@ -223,16 +223,20 @@
 0:?     Sequence
 0:49      Sequence
 0:49        move second child to first child ( temp 4-component vector of float)
-0:?           'color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.color' (layout( location=0) out 4-component vector of float)
 0:49          color: direct index for structure ( temp 4-component vector of float)
 0:49            Function Call: @main( ( temp structure{ temp 4-component vector of float color})
 0:49            Constant:
 0:49              0 (const int)
 0:?   Linker Objects
-0:?     'color' (layout( location=0) out 4-component vector of float)
+0:?     '@entryPointOutput.color' (layout( location=0) out 4-component vector of float)
+
+error: SPIRV-Tools Validation Errors
+error: Illegal number of components (1) for TypeVector
+  %v1bool = OpTypeVector %bool 1
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 130
 
                               Capability Shader
@@ -279,8 +283,8 @@
                               Name 111  "r33"
                               Name 112  "b4x4"
                               Name 116  "ps_output"
-                              Name 127  "color"
-                              Decorate 127(color) Location 0
+                              Name 127  "@entryPointOutput.color"
+                              Decorate 127(@entryPointOutput.color) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                8:             TypeFloat 32
@@ -331,12 +335,12 @@
              120:    9(fvec4) ConstantComposite 119 119 119 119
              121:             TypePointer Function 9(fvec4)
              126:             TypePointer Output 9(fvec4)
-      127(color):    126(ptr) Variable Output
+127(@entryPointOutput.color):    126(ptr) Variable Output
          4(main):           2 Function None 3
                5:             Label
              128:10(PS_OUTPUT) FunctionCall 12(@main()
              129:    9(fvec4) CompositeExtract 128 0
-                              Store 127(color) 129
+                              Store 127(@entryPointOutput.color) 129
                               Return
                               FunctionEnd
 6(TestBoolMatTypes():           2 Function None 3
diff --git a/Test/baseResults/hlsl.matType.frag.out b/Test/baseResults/hlsl.matType.frag.out
old mode 100755
new mode 100644
index d76d55c..c0d2e4b
--- a/Test/baseResults/hlsl.matType.frag.out
+++ b/Test/baseResults/hlsl.matType.frag.out
@@ -30,8 +30,12 @@
 0:?   Linker Objects
 0:?     'anon@0' (layout( row_major std140) uniform block{ uniform 1-component vector of float f1,  uniform 1X1 matrix of float fmat11,  uniform 4X1 matrix of float fmat41,  uniform 1X2 matrix of float fmat12,  uniform 2X3 matrix of double dmat23,  uniform 4X4 matrix of int int44})
 
+error: SPIRV-Tools Validation Errors
+error: Illegal number of components (1) for TypeVector
+  %v1float = OpTypeVector %float 1
+
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 30
 
                               Capability Shader
@@ -82,8 +86,8 @@
               19:             TypeVector 6(float) 2
               20:             TypeMatrix 19(fvec2) 1
               21:             TypeFloat 64
-              22:             TypeVector 21(float) 3
-              23:             TypeMatrix 22(fvec3) 2
+              22:             TypeVector 21(float64_t) 3
+              23:             TypeMatrix 22(f64vec3) 2
               24:             TypeInt 32 1
               25:             TypeVector 24(int) 4
               26:             TypeMatrix 25(ivec4) 4
diff --git a/Test/baseResults/hlsl.matType.int.frag.out b/Test/baseResults/hlsl.matType.int.frag.out
index 602f068..2039dfd 100644
--- a/Test/baseResults/hlsl.matType.int.frag.out
+++ b/Test/baseResults/hlsl.matType.int.frag.out
@@ -188,13 +188,13 @@
 0:?     Sequence
 0:93      Sequence
 0:93        move second child to first child ( temp 4-component vector of float)
-0:?           'color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.color' (layout( location=0) out 4-component vector of float)
 0:93          color: direct index for structure ( temp 4-component vector of float)
 0:93            Function Call: @main( ( temp structure{ temp 4-component vector of float color})
 0:93            Constant:
 0:93              0 (const int)
 0:?   Linker Objects
-0:?     'color' (layout( location=0) out 4-component vector of float)
+0:?     '@entryPointOutput.color' (layout( location=0) out 4-component vector of float)
 
 
 Linked fragment stage:
@@ -389,16 +389,20 @@
 0:?     Sequence
 0:93      Sequence
 0:93        move second child to first child ( temp 4-component vector of float)
-0:?           'color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.color' (layout( location=0) out 4-component vector of float)
 0:93          color: direct index for structure ( temp 4-component vector of float)
 0:93            Function Call: @main( ( temp structure{ temp 4-component vector of float color})
 0:93            Constant:
 0:93              0 (const int)
 0:?   Linker Objects
-0:?     'color' (layout( location=0) out 4-component vector of float)
+0:?     '@entryPointOutput.color' (layout( location=0) out 4-component vector of float)
+
+error: SPIRV-Tools Validation Errors
+error: Illegal number of components (1) for TypeVector
+  %v1int = OpTypeVector %int 1
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 232
 
                               Capability Shader
@@ -478,8 +482,8 @@
                               Name 214  "r33"
                               Name 215  "u4x4"
                               Name 219  "ps_output"
-                              Name 229  "color"
-                              Decorate 229(color) Location 0
+                              Name 229  "@entryPointOutput.color"
+                              Decorate 229(@entryPointOutput.color) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
               10:             TypeFloat 32
@@ -566,12 +570,12 @@
              222:   11(fvec4) ConstantComposite 221 221 221 221
              223:             TypePointer Function 11(fvec4)
              228:             TypePointer Output 11(fvec4)
-      229(color):    228(ptr) Variable Output
+229(@entryPointOutput.color):    228(ptr) Variable Output
          4(main):           2 Function None 3
                5:             Label
              230:12(PS_OUTPUT) FunctionCall 14(@main()
              231:   11(fvec4) CompositeExtract 230 0
-                              Store 229(color) 231
+                              Store 229(@entryPointOutput.color) 231
                               Return
                               FunctionEnd
 6(TestIntMatTypes():           2 Function None 3
diff --git a/Test/baseResults/hlsl.matpack-1.frag.out b/Test/baseResults/hlsl.matpack-1.frag.out
new file mode 100644
index 0000000..b92f79d
--- /dev/null
+++ b/Test/baseResults/hlsl.matpack-1.frag.out
@@ -0,0 +1,187 @@
+hlsl.matpack-1.frag
+Shader version: 500
+gl_FragCoord origin is upper left
+0:? Sequence
+0:23  Function Definition: @main( ( temp 4-component vector of float)
+0:23    Function Parameters: 
+0:?     Sequence
+0:25      Branch: Return with expression
+0:24        add ( temp 4-component vector of float)
+0:24          vector-times-matrix ( temp 4-component vector of float)
+0:24            vec1: direct index for structure ( temp 4-component vector of float)
+0:24              g_MyBuffer1: direct index for structure (layout( row_major std140) uniform structure{layout( row_major) temp 4X4 matrix of float mat1, layout( column_major) temp 4X4 matrix of float mat2,  temp 4-component vector of float vec1,  temp float foo})
+0:24                'anon@0' (layout( row_major std140) uniform block{layout( row_major std140) uniform structure{layout( row_major) temp 4X4 matrix of float mat1, layout( column_major) temp 4X4 matrix of float mat2,  temp 4-component vector of float vec1,  temp float foo} g_MyBuffer1, layout( row_major std140) uniform structure{layout( column_major) temp 4X4 matrix of float mat1,  temp 4-component vector of float vec1} g_MyBuffer2, layout( row_major std140) uniform 4X4 matrix of float mat1a})
+0:24                Constant:
+0:24                  0 (const uint)
+0:24              Constant:
+0:24                2 (const int)
+0:24            mat1: direct index for structure (layout( row_major) temp 4X4 matrix of float)
+0:24              g_MyBuffer1: direct index for structure (layout( row_major std140) uniform structure{layout( row_major) temp 4X4 matrix of float mat1, layout( column_major) temp 4X4 matrix of float mat2,  temp 4-component vector of float vec1,  temp float foo})
+0:24                'anon@0' (layout( row_major std140) uniform block{layout( row_major std140) uniform structure{layout( row_major) temp 4X4 matrix of float mat1, layout( column_major) temp 4X4 matrix of float mat2,  temp 4-component vector of float vec1,  temp float foo} g_MyBuffer1, layout( row_major std140) uniform structure{layout( column_major) temp 4X4 matrix of float mat1,  temp 4-component vector of float vec1} g_MyBuffer2, layout( row_major std140) uniform 4X4 matrix of float mat1a})
+0:24                Constant:
+0:24                  0 (const uint)
+0:24              Constant:
+0:24                0 (const int)
+0:25          vector-times-matrix ( temp 4-component vector of float)
+0:25            vec1: direct index for structure ( temp 4-component vector of float)
+0:25              g_MyBuffer2: direct index for structure (layout( row_major std140) uniform structure{layout( column_major) temp 4X4 matrix of float mat1,  temp 4-component vector of float vec1})
+0:25                'anon@0' (layout( row_major std140) uniform block{layout( row_major std140) uniform structure{layout( row_major) temp 4X4 matrix of float mat1, layout( column_major) temp 4X4 matrix of float mat2,  temp 4-component vector of float vec1,  temp float foo} g_MyBuffer1, layout( row_major std140) uniform structure{layout( column_major) temp 4X4 matrix of float mat1,  temp 4-component vector of float vec1} g_MyBuffer2, layout( row_major std140) uniform 4X4 matrix of float mat1a})
+0:25                Constant:
+0:25                  1 (const uint)
+0:25              Constant:
+0:25                1 (const int)
+0:25            mat1: direct index for structure (layout( column_major) temp 4X4 matrix of float)
+0:25              g_MyBuffer2: direct index for structure (layout( row_major std140) uniform structure{layout( column_major) temp 4X4 matrix of float mat1,  temp 4-component vector of float vec1})
+0:25                'anon@0' (layout( row_major std140) uniform block{layout( row_major std140) uniform structure{layout( row_major) temp 4X4 matrix of float mat1, layout( column_major) temp 4X4 matrix of float mat2,  temp 4-component vector of float vec1,  temp float foo} g_MyBuffer1, layout( row_major std140) uniform structure{layout( column_major) temp 4X4 matrix of float mat1,  temp 4-component vector of float vec1} g_MyBuffer2, layout( row_major std140) uniform 4X4 matrix of float mat1a})
+0:25                Constant:
+0:25                  1 (const uint)
+0:25              Constant:
+0:25                0 (const int)
+0:23  Function Definition: main( ( temp void)
+0:23    Function Parameters: 
+0:?     Sequence
+0:23      move second child to first child ( temp 4-component vector of float)
+0:?         '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+0:23        Function Call: @main( ( temp 4-component vector of float)
+0:?   Linker Objects
+0:?     'anon@0' (layout( row_major std140) uniform block{layout( row_major std140) uniform structure{layout( row_major) temp 4X4 matrix of float mat1, layout( column_major) temp 4X4 matrix of float mat2,  temp 4-component vector of float vec1,  temp float foo} g_MyBuffer1, layout( row_major std140) uniform structure{layout( column_major) temp 4X4 matrix of float mat1,  temp 4-component vector of float vec1} g_MyBuffer2, layout( row_major std140) uniform 4X4 matrix of float mat1a})
+0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+
+
+Linked fragment stage:
+
+
+Shader version: 500
+gl_FragCoord origin is upper left
+0:? Sequence
+0:23  Function Definition: @main( ( temp 4-component vector of float)
+0:23    Function Parameters: 
+0:?     Sequence
+0:25      Branch: Return with expression
+0:24        add ( temp 4-component vector of float)
+0:24          vector-times-matrix ( temp 4-component vector of float)
+0:24            vec1: direct index for structure ( temp 4-component vector of float)
+0:24              g_MyBuffer1: direct index for structure (layout( row_major std140) uniform structure{layout( row_major) temp 4X4 matrix of float mat1, layout( column_major) temp 4X4 matrix of float mat2,  temp 4-component vector of float vec1,  temp float foo})
+0:24                'anon@0' (layout( row_major std140) uniform block{layout( row_major std140) uniform structure{layout( row_major) temp 4X4 matrix of float mat1, layout( column_major) temp 4X4 matrix of float mat2,  temp 4-component vector of float vec1,  temp float foo} g_MyBuffer1, layout( row_major std140) uniform structure{layout( column_major) temp 4X4 matrix of float mat1,  temp 4-component vector of float vec1} g_MyBuffer2, layout( row_major std140) uniform 4X4 matrix of float mat1a})
+0:24                Constant:
+0:24                  0 (const uint)
+0:24              Constant:
+0:24                2 (const int)
+0:24            mat1: direct index for structure (layout( row_major) temp 4X4 matrix of float)
+0:24              g_MyBuffer1: direct index for structure (layout( row_major std140) uniform structure{layout( row_major) temp 4X4 matrix of float mat1, layout( column_major) temp 4X4 matrix of float mat2,  temp 4-component vector of float vec1,  temp float foo})
+0:24                'anon@0' (layout( row_major std140) uniform block{layout( row_major std140) uniform structure{layout( row_major) temp 4X4 matrix of float mat1, layout( column_major) temp 4X4 matrix of float mat2,  temp 4-component vector of float vec1,  temp float foo} g_MyBuffer1, layout( row_major std140) uniform structure{layout( column_major) temp 4X4 matrix of float mat1,  temp 4-component vector of float vec1} g_MyBuffer2, layout( row_major std140) uniform 4X4 matrix of float mat1a})
+0:24                Constant:
+0:24                  0 (const uint)
+0:24              Constant:
+0:24                0 (const int)
+0:25          vector-times-matrix ( temp 4-component vector of float)
+0:25            vec1: direct index for structure ( temp 4-component vector of float)
+0:25              g_MyBuffer2: direct index for structure (layout( row_major std140) uniform structure{layout( column_major) temp 4X4 matrix of float mat1,  temp 4-component vector of float vec1})
+0:25                'anon@0' (layout( row_major std140) uniform block{layout( row_major std140) uniform structure{layout( row_major) temp 4X4 matrix of float mat1, layout( column_major) temp 4X4 matrix of float mat2,  temp 4-component vector of float vec1,  temp float foo} g_MyBuffer1, layout( row_major std140) uniform structure{layout( column_major) temp 4X4 matrix of float mat1,  temp 4-component vector of float vec1} g_MyBuffer2, layout( row_major std140) uniform 4X4 matrix of float mat1a})
+0:25                Constant:
+0:25                  1 (const uint)
+0:25              Constant:
+0:25                1 (const int)
+0:25            mat1: direct index for structure (layout( column_major) temp 4X4 matrix of float)
+0:25              g_MyBuffer2: direct index for structure (layout( row_major std140) uniform structure{layout( column_major) temp 4X4 matrix of float mat1,  temp 4-component vector of float vec1})
+0:25                'anon@0' (layout( row_major std140) uniform block{layout( row_major std140) uniform structure{layout( row_major) temp 4X4 matrix of float mat1, layout( column_major) temp 4X4 matrix of float mat2,  temp 4-component vector of float vec1,  temp float foo} g_MyBuffer1, layout( row_major std140) uniform structure{layout( column_major) temp 4X4 matrix of float mat1,  temp 4-component vector of float vec1} g_MyBuffer2, layout( row_major std140) uniform 4X4 matrix of float mat1a})
+0:25                Constant:
+0:25                  1 (const uint)
+0:25              Constant:
+0:25                0 (const int)
+0:23  Function Definition: main( ( temp void)
+0:23    Function Parameters: 
+0:?     Sequence
+0:23      move second child to first child ( temp 4-component vector of float)
+0:?         '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+0:23        Function Call: @main( ( temp 4-component vector of float)
+0:?   Linker Objects
+0:?     'anon@0' (layout( row_major std140) uniform block{layout( row_major std140) uniform structure{layout( row_major) temp 4X4 matrix of float mat1, layout( column_major) temp 4X4 matrix of float mat2,  temp 4-component vector of float vec1,  temp float foo} g_MyBuffer1, layout( row_major std140) uniform structure{layout( column_major) temp 4X4 matrix of float mat1,  temp 4-component vector of float vec1} g_MyBuffer2, layout( row_major std140) uniform 4X4 matrix of float mat1a})
+0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 39
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 37
+                              ExecutionMode 4 OriginUpperLeft
+                              Source HLSL 500
+                              Name 4  "main"
+                              Name 9  "@main("
+                              Name 12  "MyBuffer1"
+                              MemberName 12(MyBuffer1) 0  "mat1"
+                              MemberName 12(MyBuffer1) 1  "mat2"
+                              MemberName 12(MyBuffer1) 2  "vec1"
+                              MemberName 12(MyBuffer1) 3  "foo"
+                              Name 13  "MyBuffer2"
+                              MemberName 13(MyBuffer2) 0  "mat1"
+                              MemberName 13(MyBuffer2) 1  "vec1"
+                              Name 14  "Example"
+                              MemberName 14(Example) 0  "g_MyBuffer1"
+                              MemberName 14(Example) 1  "g_MyBuffer2"
+                              MemberName 14(Example) 2  "mat1a"
+                              Name 16  ""
+                              Name 37  "@entryPointOutput"
+                              MemberDecorate 12(MyBuffer1) 0 RowMajor
+                              MemberDecorate 12(MyBuffer1) 0 Offset 0
+                              MemberDecorate 12(MyBuffer1) 0 MatrixStride 16
+                              MemberDecorate 12(MyBuffer1) 1 ColMajor
+                              MemberDecorate 12(MyBuffer1) 1 Offset 64
+                              MemberDecorate 12(MyBuffer1) 1 MatrixStride 16
+                              MemberDecorate 12(MyBuffer1) 2 Offset 128
+                              MemberDecorate 12(MyBuffer1) 3 Offset 144
+                              MemberDecorate 13(MyBuffer2) 0 ColMajor
+                              MemberDecorate 13(MyBuffer2) 0 Offset 0
+                              MemberDecorate 13(MyBuffer2) 0 MatrixStride 16
+                              MemberDecorate 13(MyBuffer2) 1 Offset 64
+                              MemberDecorate 14(Example) 0 Offset 0
+                              MemberDecorate 14(Example) 1 Offset 160
+                              MemberDecorate 14(Example) 2 RowMajor
+                              MemberDecorate 14(Example) 2 Offset 240
+                              MemberDecorate 14(Example) 2 MatrixStride 16
+                              Decorate 14(Example) Block
+                              Decorate 16 DescriptorSet 0
+                              Decorate 37(@entryPointOutput) Location 0
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+               8:             TypeFunction 7(fvec4)
+              11:             TypeMatrix 7(fvec4) 4
+   12(MyBuffer1):             TypeStruct 11 11 7(fvec4) 6(float)
+   13(MyBuffer2):             TypeStruct 11 7(fvec4)
+     14(Example):             TypeStruct 12(MyBuffer1) 13(MyBuffer2) 11
+              15:             TypePointer Uniform 14(Example)
+              16:     15(ptr) Variable Uniform
+              17:             TypeInt 32 1
+              18:     17(int) Constant 0
+              19:     17(int) Constant 2
+              20:             TypePointer Uniform 7(fvec4)
+              23:             TypePointer Uniform 11
+              27:     17(int) Constant 1
+              36:             TypePointer Output 7(fvec4)
+37(@entryPointOutput):     36(ptr) Variable Output
+         4(main):           2 Function None 3
+               5:             Label
+              38:    7(fvec4) FunctionCall 9(@main()
+                              Store 37(@entryPointOutput) 38
+                              Return
+                              FunctionEnd
+       9(@main():    7(fvec4) Function None 8
+              10:             Label
+              21:     20(ptr) AccessChain 16 18 19
+              22:    7(fvec4) Load 21
+              24:     23(ptr) AccessChain 16 18 18
+              25:          11 Load 24
+              26:    7(fvec4) VectorTimesMatrix 22 25
+              28:     20(ptr) AccessChain 16 27 27
+              29:    7(fvec4) Load 28
+              30:     23(ptr) AccessChain 16 27 18
+              31:          11 Load 30
+              32:    7(fvec4) VectorTimesMatrix 29 31
+              33:    7(fvec4) FAdd 26 32
+                              ReturnValue 33
+                              FunctionEnd
diff --git a/Test/baseResults/hlsl.matpack-pragma.frag.out b/Test/baseResults/hlsl.matpack-pragma.frag.out
new file mode 100644
index 0000000..2750d76
--- /dev/null
+++ b/Test/baseResults/hlsl.matpack-pragma.frag.out
@@ -0,0 +1,268 @@
+hlsl.matpack-pragma.frag
+WARNING: 0:19: 'random_string_foo' : unknown pack_matrix pragma value 
+
+Shader version: 500
+gl_FragCoord origin is upper left
+0:? Sequence
+0:29  Function Definition: @main( ( temp 4-component vector of float)
+0:29    Function Parameters: 
+0:?     Sequence
+0:32      Branch: Return with expression
+0:32        add ( temp 4-component vector of float)
+0:32          add ( temp 4-component vector of float)
+0:31            add ( temp 4-component vector of float)
+0:31              add ( temp 4-component vector of float)
+0:31                add ( temp 4-component vector of float)
+0:31                  direct index (layout( row_major) temp 4-component vector of float)
+0:31                    mat1: direct index for structure (layout( row_major) temp 4X4 matrix of float)
+0:31                      g_MyBuffer1: direct index for structure (layout( row_major std140) uniform structure{layout( row_major) temp 4X4 matrix of float mat1, layout( column_major) temp 4X4 matrix of float mat2, layout( column_major) temp 4X4 matrix of float mat3})
+0:31                        'anon@0' (layout( row_major std140) uniform block{layout( row_major std140) uniform structure{layout( row_major) temp 4X4 matrix of float mat1, layout( column_major) temp 4X4 matrix of float mat2, layout( column_major) temp 4X4 matrix of float mat3} g_MyBuffer1, layout( row_major std140) uniform structure{layout( row_major) temp 4X4 matrix of float mat1, layout( column_major) temp 4X4 matrix of float mat2, layout( row_major) temp 4X4 matrix of float mat3} g_MyBuffer2, layout( row_major std140) uniform 4X4 matrix of float mat1a})
+0:31                        Constant:
+0:31                          0 (const uint)
+0:31                      Constant:
+0:31                        0 (const int)
+0:31                    Constant:
+0:31                      0 (const int)
+0:31                  direct index (layout( column_major) temp 4-component vector of float)
+0:31                    mat2: direct index for structure (layout( column_major) temp 4X4 matrix of float)
+0:31                      g_MyBuffer1: direct index for structure (layout( row_major std140) uniform structure{layout( row_major) temp 4X4 matrix of float mat1, layout( column_major) temp 4X4 matrix of float mat2, layout( column_major) temp 4X4 matrix of float mat3})
+0:31                        'anon@0' (layout( row_major std140) uniform block{layout( row_major std140) uniform structure{layout( row_major) temp 4X4 matrix of float mat1, layout( column_major) temp 4X4 matrix of float mat2, layout( column_major) temp 4X4 matrix of float mat3} g_MyBuffer1, layout( row_major std140) uniform structure{layout( row_major) temp 4X4 matrix of float mat1, layout( column_major) temp 4X4 matrix of float mat2, layout( row_major) temp 4X4 matrix of float mat3} g_MyBuffer2, layout( row_major std140) uniform 4X4 matrix of float mat1a})
+0:31                        Constant:
+0:31                          0 (const uint)
+0:31                      Constant:
+0:31                        1 (const int)
+0:31                    Constant:
+0:31                      0 (const int)
+0:31                direct index (layout( column_major) temp 4-component vector of float)
+0:31                  mat3: direct index for structure (layout( column_major) temp 4X4 matrix of float)
+0:31                    g_MyBuffer1: direct index for structure (layout( row_major std140) uniform structure{layout( row_major) temp 4X4 matrix of float mat1, layout( column_major) temp 4X4 matrix of float mat2, layout( column_major) temp 4X4 matrix of float mat3})
+0:31                      'anon@0' (layout( row_major std140) uniform block{layout( row_major std140) uniform structure{layout( row_major) temp 4X4 matrix of float mat1, layout( column_major) temp 4X4 matrix of float mat2, layout( column_major) temp 4X4 matrix of float mat3} g_MyBuffer1, layout( row_major std140) uniform structure{layout( row_major) temp 4X4 matrix of float mat1, layout( column_major) temp 4X4 matrix of float mat2, layout( row_major) temp 4X4 matrix of float mat3} g_MyBuffer2, layout( row_major std140) uniform 4X4 matrix of float mat1a})
+0:31                      Constant:
+0:31                        0 (const uint)
+0:31                    Constant:
+0:31                      2 (const int)
+0:31                  Constant:
+0:31                    0 (const int)
+0:32              direct index (layout( row_major) temp 4-component vector of float)
+0:32                mat1: direct index for structure (layout( row_major) temp 4X4 matrix of float)
+0:32                  g_MyBuffer2: direct index for structure (layout( row_major std140) uniform structure{layout( row_major) temp 4X4 matrix of float mat1, layout( column_major) temp 4X4 matrix of float mat2, layout( row_major) temp 4X4 matrix of float mat3})
+0:32                    'anon@0' (layout( row_major std140) uniform block{layout( row_major std140) uniform structure{layout( row_major) temp 4X4 matrix of float mat1, layout( column_major) temp 4X4 matrix of float mat2, layout( column_major) temp 4X4 matrix of float mat3} g_MyBuffer1, layout( row_major std140) uniform structure{layout( row_major) temp 4X4 matrix of float mat1, layout( column_major) temp 4X4 matrix of float mat2, layout( row_major) temp 4X4 matrix of float mat3} g_MyBuffer2, layout( row_major std140) uniform 4X4 matrix of float mat1a})
+0:32                    Constant:
+0:32                      1 (const uint)
+0:32                  Constant:
+0:32                    0 (const int)
+0:32                Constant:
+0:32                  0 (const int)
+0:32            direct index (layout( column_major) temp 4-component vector of float)
+0:32              mat2: direct index for structure (layout( column_major) temp 4X4 matrix of float)
+0:32                g_MyBuffer2: direct index for structure (layout( row_major std140) uniform structure{layout( row_major) temp 4X4 matrix of float mat1, layout( column_major) temp 4X4 matrix of float mat2, layout( row_major) temp 4X4 matrix of float mat3})
+0:32                  'anon@0' (layout( row_major std140) uniform block{layout( row_major std140) uniform structure{layout( row_major) temp 4X4 matrix of float mat1, layout( column_major) temp 4X4 matrix of float mat2, layout( column_major) temp 4X4 matrix of float mat3} g_MyBuffer1, layout( row_major std140) uniform structure{layout( row_major) temp 4X4 matrix of float mat1, layout( column_major) temp 4X4 matrix of float mat2, layout( row_major) temp 4X4 matrix of float mat3} g_MyBuffer2, layout( row_major std140) uniform 4X4 matrix of float mat1a})
+0:32                  Constant:
+0:32                    1 (const uint)
+0:32                Constant:
+0:32                  1 (const int)
+0:32              Constant:
+0:32                0 (const int)
+0:32          direct index (layout( row_major) temp 4-component vector of float)
+0:32            mat3: direct index for structure (layout( row_major) temp 4X4 matrix of float)
+0:32              g_MyBuffer2: direct index for structure (layout( row_major std140) uniform structure{layout( row_major) temp 4X4 matrix of float mat1, layout( column_major) temp 4X4 matrix of float mat2, layout( row_major) temp 4X4 matrix of float mat3})
+0:32                'anon@0' (layout( row_major std140) uniform block{layout( row_major std140) uniform structure{layout( row_major) temp 4X4 matrix of float mat1, layout( column_major) temp 4X4 matrix of float mat2, layout( column_major) temp 4X4 matrix of float mat3} g_MyBuffer1, layout( row_major std140) uniform structure{layout( row_major) temp 4X4 matrix of float mat1, layout( column_major) temp 4X4 matrix of float mat2, layout( row_major) temp 4X4 matrix of float mat3} g_MyBuffer2, layout( row_major std140) uniform 4X4 matrix of float mat1a})
+0:32                Constant:
+0:32                  1 (const uint)
+0:32              Constant:
+0:32                2 (const int)
+0:32            Constant:
+0:32              0 (const int)
+0:29  Function Definition: main( ( temp void)
+0:29    Function Parameters: 
+0:?     Sequence
+0:29      move second child to first child ( temp 4-component vector of float)
+0:?         '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+0:29        Function Call: @main( ( temp 4-component vector of float)
+0:?   Linker Objects
+0:?     'anon@0' (layout( row_major std140) uniform block{layout( row_major std140) uniform structure{layout( row_major) temp 4X4 matrix of float mat1, layout( column_major) temp 4X4 matrix of float mat2, layout( column_major) temp 4X4 matrix of float mat3} g_MyBuffer1, layout( row_major std140) uniform structure{layout( row_major) temp 4X4 matrix of float mat1, layout( column_major) temp 4X4 matrix of float mat2, layout( row_major) temp 4X4 matrix of float mat3} g_MyBuffer2, layout( row_major std140) uniform 4X4 matrix of float mat1a})
+0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+
+
+Linked fragment stage:
+
+
+Shader version: 500
+gl_FragCoord origin is upper left
+0:? Sequence
+0:29  Function Definition: @main( ( temp 4-component vector of float)
+0:29    Function Parameters: 
+0:?     Sequence
+0:32      Branch: Return with expression
+0:32        add ( temp 4-component vector of float)
+0:32          add ( temp 4-component vector of float)
+0:31            add ( temp 4-component vector of float)
+0:31              add ( temp 4-component vector of float)
+0:31                add ( temp 4-component vector of float)
+0:31                  direct index (layout( row_major) temp 4-component vector of float)
+0:31                    mat1: direct index for structure (layout( row_major) temp 4X4 matrix of float)
+0:31                      g_MyBuffer1: direct index for structure (layout( row_major std140) uniform structure{layout( row_major) temp 4X4 matrix of float mat1, layout( column_major) temp 4X4 matrix of float mat2, layout( column_major) temp 4X4 matrix of float mat3})
+0:31                        'anon@0' (layout( row_major std140) uniform block{layout( row_major std140) uniform structure{layout( row_major) temp 4X4 matrix of float mat1, layout( column_major) temp 4X4 matrix of float mat2, layout( column_major) temp 4X4 matrix of float mat3} g_MyBuffer1, layout( row_major std140) uniform structure{layout( row_major) temp 4X4 matrix of float mat1, layout( column_major) temp 4X4 matrix of float mat2, layout( row_major) temp 4X4 matrix of float mat3} g_MyBuffer2, layout( row_major std140) uniform 4X4 matrix of float mat1a})
+0:31                        Constant:
+0:31                          0 (const uint)
+0:31                      Constant:
+0:31                        0 (const int)
+0:31                    Constant:
+0:31                      0 (const int)
+0:31                  direct index (layout( column_major) temp 4-component vector of float)
+0:31                    mat2: direct index for structure (layout( column_major) temp 4X4 matrix of float)
+0:31                      g_MyBuffer1: direct index for structure (layout( row_major std140) uniform structure{layout( row_major) temp 4X4 matrix of float mat1, layout( column_major) temp 4X4 matrix of float mat2, layout( column_major) temp 4X4 matrix of float mat3})
+0:31                        'anon@0' (layout( row_major std140) uniform block{layout( row_major std140) uniform structure{layout( row_major) temp 4X4 matrix of float mat1, layout( column_major) temp 4X4 matrix of float mat2, layout( column_major) temp 4X4 matrix of float mat3} g_MyBuffer1, layout( row_major std140) uniform structure{layout( row_major) temp 4X4 matrix of float mat1, layout( column_major) temp 4X4 matrix of float mat2, layout( row_major) temp 4X4 matrix of float mat3} g_MyBuffer2, layout( row_major std140) uniform 4X4 matrix of float mat1a})
+0:31                        Constant:
+0:31                          0 (const uint)
+0:31                      Constant:
+0:31                        1 (const int)
+0:31                    Constant:
+0:31                      0 (const int)
+0:31                direct index (layout( column_major) temp 4-component vector of float)
+0:31                  mat3: direct index for structure (layout( column_major) temp 4X4 matrix of float)
+0:31                    g_MyBuffer1: direct index for structure (layout( row_major std140) uniform structure{layout( row_major) temp 4X4 matrix of float mat1, layout( column_major) temp 4X4 matrix of float mat2, layout( column_major) temp 4X4 matrix of float mat3})
+0:31                      'anon@0' (layout( row_major std140) uniform block{layout( row_major std140) uniform structure{layout( row_major) temp 4X4 matrix of float mat1, layout( column_major) temp 4X4 matrix of float mat2, layout( column_major) temp 4X4 matrix of float mat3} g_MyBuffer1, layout( row_major std140) uniform structure{layout( row_major) temp 4X4 matrix of float mat1, layout( column_major) temp 4X4 matrix of float mat2, layout( row_major) temp 4X4 matrix of float mat3} g_MyBuffer2, layout( row_major std140) uniform 4X4 matrix of float mat1a})
+0:31                      Constant:
+0:31                        0 (const uint)
+0:31                    Constant:
+0:31                      2 (const int)
+0:31                  Constant:
+0:31                    0 (const int)
+0:32              direct index (layout( row_major) temp 4-component vector of float)
+0:32                mat1: direct index for structure (layout( row_major) temp 4X4 matrix of float)
+0:32                  g_MyBuffer2: direct index for structure (layout( row_major std140) uniform structure{layout( row_major) temp 4X4 matrix of float mat1, layout( column_major) temp 4X4 matrix of float mat2, layout( row_major) temp 4X4 matrix of float mat3})
+0:32                    'anon@0' (layout( row_major std140) uniform block{layout( row_major std140) uniform structure{layout( row_major) temp 4X4 matrix of float mat1, layout( column_major) temp 4X4 matrix of float mat2, layout( column_major) temp 4X4 matrix of float mat3} g_MyBuffer1, layout( row_major std140) uniform structure{layout( row_major) temp 4X4 matrix of float mat1, layout( column_major) temp 4X4 matrix of float mat2, layout( row_major) temp 4X4 matrix of float mat3} g_MyBuffer2, layout( row_major std140) uniform 4X4 matrix of float mat1a})
+0:32                    Constant:
+0:32                      1 (const uint)
+0:32                  Constant:
+0:32                    0 (const int)
+0:32                Constant:
+0:32                  0 (const int)
+0:32            direct index (layout( column_major) temp 4-component vector of float)
+0:32              mat2: direct index for structure (layout( column_major) temp 4X4 matrix of float)
+0:32                g_MyBuffer2: direct index for structure (layout( row_major std140) uniform structure{layout( row_major) temp 4X4 matrix of float mat1, layout( column_major) temp 4X4 matrix of float mat2, layout( row_major) temp 4X4 matrix of float mat3})
+0:32                  'anon@0' (layout( row_major std140) uniform block{layout( row_major std140) uniform structure{layout( row_major) temp 4X4 matrix of float mat1, layout( column_major) temp 4X4 matrix of float mat2, layout( column_major) temp 4X4 matrix of float mat3} g_MyBuffer1, layout( row_major std140) uniform structure{layout( row_major) temp 4X4 matrix of float mat1, layout( column_major) temp 4X4 matrix of float mat2, layout( row_major) temp 4X4 matrix of float mat3} g_MyBuffer2, layout( row_major std140) uniform 4X4 matrix of float mat1a})
+0:32                  Constant:
+0:32                    1 (const uint)
+0:32                Constant:
+0:32                  1 (const int)
+0:32              Constant:
+0:32                0 (const int)
+0:32          direct index (layout( row_major) temp 4-component vector of float)
+0:32            mat3: direct index for structure (layout( row_major) temp 4X4 matrix of float)
+0:32              g_MyBuffer2: direct index for structure (layout( row_major std140) uniform structure{layout( row_major) temp 4X4 matrix of float mat1, layout( column_major) temp 4X4 matrix of float mat2, layout( row_major) temp 4X4 matrix of float mat3})
+0:32                'anon@0' (layout( row_major std140) uniform block{layout( row_major std140) uniform structure{layout( row_major) temp 4X4 matrix of float mat1, layout( column_major) temp 4X4 matrix of float mat2, layout( column_major) temp 4X4 matrix of float mat3} g_MyBuffer1, layout( row_major std140) uniform structure{layout( row_major) temp 4X4 matrix of float mat1, layout( column_major) temp 4X4 matrix of float mat2, layout( row_major) temp 4X4 matrix of float mat3} g_MyBuffer2, layout( row_major std140) uniform 4X4 matrix of float mat1a})
+0:32                Constant:
+0:32                  1 (const uint)
+0:32              Constant:
+0:32                2 (const int)
+0:32            Constant:
+0:32              0 (const int)
+0:29  Function Definition: main( ( temp void)
+0:29    Function Parameters: 
+0:?     Sequence
+0:29      move second child to first child ( temp 4-component vector of float)
+0:?         '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+0:29        Function Call: @main( ( temp 4-component vector of float)
+0:?   Linker Objects
+0:?     'anon@0' (layout( row_major std140) uniform block{layout( row_major std140) uniform structure{layout( row_major) temp 4X4 matrix of float mat1, layout( column_major) temp 4X4 matrix of float mat2, layout( column_major) temp 4X4 matrix of float mat3} g_MyBuffer1, layout( row_major std140) uniform structure{layout( row_major) temp 4X4 matrix of float mat1, layout( column_major) temp 4X4 matrix of float mat2, layout( row_major) temp 4X4 matrix of float mat3} g_MyBuffer2, layout( row_major std140) uniform 4X4 matrix of float mat1a})
+0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 44
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 42
+                              ExecutionMode 4 OriginUpperLeft
+                              Source HLSL 500
+                              Name 4  "main"
+                              Name 9  "@main("
+                              Name 12  "MyBuffer1"
+                              MemberName 12(MyBuffer1) 0  "mat1"
+                              MemberName 12(MyBuffer1) 1  "mat2"
+                              MemberName 12(MyBuffer1) 2  "mat3"
+                              Name 13  "MyBuffer2"
+                              MemberName 13(MyBuffer2) 0  "mat1"
+                              MemberName 13(MyBuffer2) 1  "mat2"
+                              MemberName 13(MyBuffer2) 2  "mat3"
+                              Name 14  "Example"
+                              MemberName 14(Example) 0  "g_MyBuffer1"
+                              MemberName 14(Example) 1  "g_MyBuffer2"
+                              MemberName 14(Example) 2  "mat1a"
+                              Name 16  ""
+                              Name 42  "@entryPointOutput"
+                              MemberDecorate 12(MyBuffer1) 0 RowMajor
+                              MemberDecorate 12(MyBuffer1) 0 Offset 0
+                              MemberDecorate 12(MyBuffer1) 0 MatrixStride 16
+                              MemberDecorate 12(MyBuffer1) 1 ColMajor
+                              MemberDecorate 12(MyBuffer1) 1 Offset 64
+                              MemberDecorate 12(MyBuffer1) 1 MatrixStride 16
+                              MemberDecorate 12(MyBuffer1) 2 ColMajor
+                              MemberDecorate 12(MyBuffer1) 2 Offset 128
+                              MemberDecorate 12(MyBuffer1) 2 MatrixStride 16
+                              MemberDecorate 13(MyBuffer2) 0 RowMajor
+                              MemberDecorate 13(MyBuffer2) 0 Offset 0
+                              MemberDecorate 13(MyBuffer2) 0 MatrixStride 16
+                              MemberDecorate 13(MyBuffer2) 1 ColMajor
+                              MemberDecorate 13(MyBuffer2) 1 Offset 64
+                              MemberDecorate 13(MyBuffer2) 1 MatrixStride 16
+                              MemberDecorate 13(MyBuffer2) 2 RowMajor
+                              MemberDecorate 13(MyBuffer2) 2 Offset 128
+                              MemberDecorate 13(MyBuffer2) 2 MatrixStride 16
+                              MemberDecorate 14(Example) 0 Offset 0
+                              MemberDecorate 14(Example) 1 Offset 192
+                              MemberDecorate 14(Example) 2 RowMajor
+                              MemberDecorate 14(Example) 2 Offset 384
+                              MemberDecorate 14(Example) 2 MatrixStride 16
+                              Decorate 14(Example) Block
+                              Decorate 16 DescriptorSet 0
+                              Decorate 42(@entryPointOutput) Location 0
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+               8:             TypeFunction 7(fvec4)
+              11:             TypeMatrix 7(fvec4) 4
+   12(MyBuffer1):             TypeStruct 11 11 11
+   13(MyBuffer2):             TypeStruct 11 11 11
+     14(Example):             TypeStruct 12(MyBuffer1) 13(MyBuffer2) 11
+              15:             TypePointer Uniform 14(Example)
+              16:     15(ptr) Variable Uniform
+              17:             TypeInt 32 1
+              18:     17(int) Constant 0
+              19:             TypePointer Uniform 7(fvec4)
+              22:     17(int) Constant 1
+              26:     17(int) Constant 2
+              41:             TypePointer Output 7(fvec4)
+42(@entryPointOutput):     41(ptr) Variable Output
+         4(main):           2 Function None 3
+               5:             Label
+              43:    7(fvec4) FunctionCall 9(@main()
+                              Store 42(@entryPointOutput) 43
+                              Return
+                              FunctionEnd
+       9(@main():    7(fvec4) Function None 8
+              10:             Label
+              20:     19(ptr) AccessChain 16 18 18 18
+              21:    7(fvec4) Load 20
+              23:     19(ptr) AccessChain 16 18 22 18
+              24:    7(fvec4) Load 23
+              25:    7(fvec4) FAdd 21 24
+              27:     19(ptr) AccessChain 16 18 26 18
+              28:    7(fvec4) Load 27
+              29:    7(fvec4) FAdd 25 28
+              30:     19(ptr) AccessChain 16 22 18 18
+              31:    7(fvec4) Load 30
+              32:    7(fvec4) FAdd 29 31
+              33:     19(ptr) AccessChain 16 22 22 18
+              34:    7(fvec4) Load 33
+              35:    7(fvec4) FAdd 32 34
+              36:     19(ptr) AccessChain 16 22 26 18
+              37:    7(fvec4) Load 36
+              38:    7(fvec4) FAdd 35 37
+                              ReturnValue 38
+                              FunctionEnd
diff --git a/Test/baseResults/hlsl.matrixSwizzle.vert.out b/Test/baseResults/hlsl.matrixSwizzle.vert.out
old mode 100755
new mode 100644
index 7e792b4..abb3e49
--- a/Test/baseResults/hlsl.matrixSwizzle.vert.out
+++ b/Test/baseResults/hlsl.matrixSwizzle.vert.out
@@ -676,8 +676,12 @@
 0:?     'inf' (layout( location=0) in float)
 
 Missing functionality: matrix swizzle
+error: SPIRV-Tools Validation Errors
+error: OpStore Pointer <id> '42[f3]'s type does not match Object <id> '34's type.
+  OpStore %f3 %int_0
+
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 118
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.matrixindex.frag.out b/Test/baseResults/hlsl.matrixindex.frag.out
index 9741c5d..63e5614 100644
--- a/Test/baseResults/hlsl.matrixindex.frag.out
+++ b/Test/baseResults/hlsl.matrixindex.frag.out
@@ -124,14 +124,14 @@
 0:?     Sequence
 0:10      Sequence
 0:10        move second child to first child ( temp 4-component vector of float)
-0:?           'Color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 0:10          Color: direct index for structure ( temp 4-component vector of float)
 0:10            Function Call: @main( ( temp structure{ temp 4-component vector of float Color})
 0:10            Constant:
 0:10              0 (const int)
 0:?   Linker Objects
 0:?     'anon@0' (layout( row_major std140) uniform block{ uniform int idx,  uniform 3X2 matrix of float um})
-0:?     'Color' (layout( location=0) out 4-component vector of float)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 
 Linked fragment stage:
@@ -262,17 +262,17 @@
 0:?     Sequence
 0:10      Sequence
 0:10        move second child to first child ( temp 4-component vector of float)
-0:?           'Color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 0:10          Color: direct index for structure ( temp 4-component vector of float)
 0:10            Function Call: @main( ( temp structure{ temp 4-component vector of float Color})
 0:10            Constant:
 0:10              0 (const int)
 0:?   Linker Objects
 0:?     'anon@0' (layout( row_major std140) uniform block{ uniform int idx,  uniform 3X2 matrix of float um})
-0:?     'Color' (layout( location=0) out 4-component vector of float)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 83
 
                               Capability Shader
@@ -308,14 +308,14 @@
                               Name 60  "indexable"
                               Name 63  "r0c"
                               Name 71  "psout"
-                              Name 80  "Color"
+                              Name 80  "@entryPointOutput.Color"
                               MemberDecorate 52($Global) 0 Offset 0
                               MemberDecorate 52($Global) 1 RowMajor
                               MemberDecorate 52($Global) 1 Offset 16
                               MemberDecorate 52($Global) 1 MatrixStride 16
                               Decorate 52($Global) Block
                               Decorate 54 DescriptorSet 0
-                              Decorate 80(Color) Location 0
+                              Decorate 80(@entryPointOutput.Color) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -357,12 +357,12 @@
               70:             TypePointer Function 8(PS_OUTPUT)
               74:             TypePointer Function 7(fvec4)
               79:             TypePointer Output 7(fvec4)
-       80(Color):     79(ptr) Variable Output
+80(@entryPointOutput.Color):     79(ptr) Variable Output
          4(main):           2 Function None 3
                5:             Label
               81:8(PS_OUTPUT) FunctionCall 10(@main()
               82:    7(fvec4) CompositeExtract 81 0
-                              Store 80(Color) 82
+                              Store 80(@entryPointOutput.Color) 82
                               Return
                               FunctionEnd
       10(@main():8(PS_OUTPUT) Function None 9
diff --git a/Test/baseResults/hlsl.max.frag.out b/Test/baseResults/hlsl.max.frag.out
old mode 100755
new mode 100644
index 2c74d72..db215a2
--- a/Test/baseResults/hlsl.max.frag.out
+++ b/Test/baseResults/hlsl.max.frag.out
@@ -66,7 +66,7 @@
 0:?     'input2' (layout( location=1) in 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 33
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.memberFunCall.frag.out b/Test/baseResults/hlsl.memberFunCall.frag.out
new file mode 100644
index 0000000..01cb99a
--- /dev/null
+++ b/Test/baseResults/hlsl.memberFunCall.frag.out
@@ -0,0 +1,264 @@
+hlsl.memberFunCall.frag
+Shader version: 500
+gl_FragCoord origin is upper left
+0:? Sequence
+0:1  Function Definition: method3(f1; ( temp float)
+0:1    Function Parameters: 
+0:1      'a' ( in float)
+0:?     Sequence
+0:1      Branch: Return with expression
+0:1        Constant:
+0:1          1.000000
+0:4  Function Definition: myContext::method1( ( temp float)
+0:4    Function Parameters: 
+0:4      '@this' ( temp structure{ temp float f})
+0:?     Sequence
+0:4      Branch: Return with expression
+0:4        Function Call: myContext::method2( ( temp float)
+0:?           '@this' ( temp structure{ temp float f})
+0:5  Function Definition: myContext::method2( ( temp float)
+0:5    Function Parameters: 
+0:5      '@this' ( temp structure{ temp float f})
+0:?     Sequence
+0:5      Branch: Return with expression
+0:5        Function Call: myContext::method3(f1; ( temp float)
+0:?           '@this' ( temp structure{ temp float f})
+0:5          Constant:
+0:5            1.000000
+0:6  Function Definition: myContext::method3(f1; ( temp float)
+0:6    Function Parameters: 
+0:6      '@this' ( temp structure{ temp float f})
+0:6      'a' ( in float)
+0:?     Sequence
+0:6      Branch: Return with expression
+0:6        Function Call: myContext::method4(f1;f1; ( temp float)
+0:?           '@this' ( temp structure{ temp float f})
+0:6          'a' ( in float)
+0:6          'a' ( in float)
+0:7  Function Definition: myContext::method4(f1;f1; ( temp float)
+0:7    Function Parameters: 
+0:7      '@this' ( temp structure{ temp float f})
+0:7      'a' ( in float)
+0:7      'b' ( in float)
+0:?     Sequence
+0:7      Branch: Return with expression
+0:7        add ( temp float)
+0:7          add ( temp float)
+0:7            'a' ( in float)
+0:7            'b' ( in float)
+0:7          f: direct index for structure ( temp float)
+0:7            '@this' ( temp structure{ temp float f})
+0:7            Constant:
+0:7              0 (const uint)
+0:12  Function Definition: @main( ( temp 4-component vector of float)
+0:12    Function Parameters: 
+0:?     Sequence
+0:14      move second child to first child ( temp float)
+0:14        f: direct index for structure ( temp float)
+0:14          'context' ( temp structure{ temp float f})
+0:14          Constant:
+0:14            0 (const int)
+0:14        Constant:
+0:14          3.000000
+0:15      Branch: Return with expression
+0:15        Construct vec4 ( temp 4-component vector of float)
+0:15          Function Call: myContext::method1( ( temp float)
+0:15            'context' ( temp structure{ temp float f})
+0:12  Function Definition: main( ( temp void)
+0:12    Function Parameters: 
+0:?     Sequence
+0:12      move second child to first child ( temp 4-component vector of float)
+0:?         '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+0:12        Function Call: @main( ( temp 4-component vector of float)
+0:?   Linker Objects
+0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+
+
+Linked fragment stage:
+
+
+Shader version: 500
+gl_FragCoord origin is upper left
+0:? Sequence
+0:1  Function Definition: method3(f1; ( temp float)
+0:1    Function Parameters: 
+0:1      'a' ( in float)
+0:?     Sequence
+0:1      Branch: Return with expression
+0:1        Constant:
+0:1          1.000000
+0:4  Function Definition: myContext::method1( ( temp float)
+0:4    Function Parameters: 
+0:4      '@this' ( temp structure{ temp float f})
+0:?     Sequence
+0:4      Branch: Return with expression
+0:4        Function Call: myContext::method2( ( temp float)
+0:?           '@this' ( temp structure{ temp float f})
+0:5  Function Definition: myContext::method2( ( temp float)
+0:5    Function Parameters: 
+0:5      '@this' ( temp structure{ temp float f})
+0:?     Sequence
+0:5      Branch: Return with expression
+0:5        Function Call: myContext::method3(f1; ( temp float)
+0:?           '@this' ( temp structure{ temp float f})
+0:5          Constant:
+0:5            1.000000
+0:6  Function Definition: myContext::method3(f1; ( temp float)
+0:6    Function Parameters: 
+0:6      '@this' ( temp structure{ temp float f})
+0:6      'a' ( in float)
+0:?     Sequence
+0:6      Branch: Return with expression
+0:6        Function Call: myContext::method4(f1;f1; ( temp float)
+0:?           '@this' ( temp structure{ temp float f})
+0:6          'a' ( in float)
+0:6          'a' ( in float)
+0:7  Function Definition: myContext::method4(f1;f1; ( temp float)
+0:7    Function Parameters: 
+0:7      '@this' ( temp structure{ temp float f})
+0:7      'a' ( in float)
+0:7      'b' ( in float)
+0:?     Sequence
+0:7      Branch: Return with expression
+0:7        add ( temp float)
+0:7          add ( temp float)
+0:7            'a' ( in float)
+0:7            'b' ( in float)
+0:7          f: direct index for structure ( temp float)
+0:7            '@this' ( temp structure{ temp float f})
+0:7            Constant:
+0:7              0 (const uint)
+0:12  Function Definition: @main( ( temp 4-component vector of float)
+0:12    Function Parameters: 
+0:?     Sequence
+0:14      move second child to first child ( temp float)
+0:14        f: direct index for structure ( temp float)
+0:14          'context' ( temp structure{ temp float f})
+0:14          Constant:
+0:14            0 (const int)
+0:14        Constant:
+0:14          3.000000
+0:15      Branch: Return with expression
+0:15        Construct vec4 ( temp 4-component vector of float)
+0:15          Function Call: myContext::method1( ( temp float)
+0:15            'context' ( temp structure{ temp float f})
+0:12  Function Definition: main( ( temp void)
+0:12    Function Parameters: 
+0:?     Sequence
+0:12      move second child to first child ( temp 4-component vector of float)
+0:?         '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+0:12        Function Call: @main( ( temp 4-component vector of float)
+0:?   Linker Objects
+0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 73
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 71
+                              ExecutionMode 4 OriginUpperLeft
+                              Source HLSL 500
+                              Name 4  "main"
+                              Name 10  "method3(f1;"
+                              Name 9  "a"
+                              Name 12  "myContext"
+                              MemberName 12(myContext) 0  "f"
+                              Name 16  "myContext::method1("
+                              Name 15  "@this"
+                              Name 19  "myContext::method2("
+                              Name 18  "@this"
+                              Name 24  "myContext::method3(f1;"
+                              Name 22  "@this"
+                              Name 23  "a"
+                              Name 30  "myContext::method4(f1;f1;"
+                              Name 27  "@this"
+                              Name 28  "a"
+                              Name 29  "b"
+                              Name 34  "@main("
+                              Name 42  "param"
+                              Name 46  "param"
+                              Name 48  "param"
+                              Name 63  "context"
+                              Name 71  "@entryPointOutput"
+                              Decorate 71(@entryPointOutput) Location 0
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypePointer Function 6(float)
+               8:             TypeFunction 6(float) 7(ptr)
+   12(myContext):             TypeStruct 6(float)
+              13:             TypePointer Function 12(myContext)
+              14:             TypeFunction 6(float) 13(ptr)
+              21:             TypeFunction 6(float) 13(ptr) 7(ptr)
+              26:             TypeFunction 6(float) 13(ptr) 7(ptr) 7(ptr)
+              32:             TypeVector 6(float) 4
+              33:             TypeFunction 32(fvec4)
+              36:    6(float) Constant 1065353216
+              56:             TypeInt 32 1
+              57:     56(int) Constant 0
+              64:    6(float) Constant 1077936128
+              70:             TypePointer Output 32(fvec4)
+71(@entryPointOutput):     70(ptr) Variable Output
+         4(main):           2 Function None 3
+               5:             Label
+              72:   32(fvec4) FunctionCall 34(@main()
+                              Store 71(@entryPointOutput) 72
+                              Return
+                              FunctionEnd
+ 10(method3(f1;):    6(float) Function None 8
+            9(a):      7(ptr) FunctionParameter
+              11:             Label
+                              ReturnValue 36
+                              FunctionEnd
+16(myContext::method1():    6(float) Function None 14
+       15(@this):     13(ptr) FunctionParameter
+              17:             Label
+              39:    6(float) FunctionCall 19(myContext::method2() 15(@this)
+                              ReturnValue 39
+                              FunctionEnd
+19(myContext::method2():    6(float) Function None 14
+       18(@this):     13(ptr) FunctionParameter
+              20:             Label
+       42(param):      7(ptr) Variable Function
+                              Store 42(param) 36
+              43:    6(float) FunctionCall 24(myContext::method3(f1;) 18(@this) 42(param)
+                              ReturnValue 43
+                              FunctionEnd
+24(myContext::method3(f1;):    6(float) Function None 21
+       22(@this):     13(ptr) FunctionParameter
+           23(a):      7(ptr) FunctionParameter
+              25:             Label
+       46(param):      7(ptr) Variable Function
+       48(param):      7(ptr) Variable Function
+              47:    6(float) Load 23(a)
+                              Store 46(param) 47
+              49:    6(float) Load 23(a)
+                              Store 48(param) 49
+              50:    6(float) FunctionCall 30(myContext::method4(f1;f1;) 22(@this) 46(param) 48(param)
+                              ReturnValue 50
+                              FunctionEnd
+30(myContext::method4(f1;f1;):    6(float) Function None 26
+       27(@this):     13(ptr) FunctionParameter
+           28(a):      7(ptr) FunctionParameter
+           29(b):      7(ptr) FunctionParameter
+              31:             Label
+              53:    6(float) Load 28(a)
+              54:    6(float) Load 29(b)
+              55:    6(float) FAdd 53 54
+              58:      7(ptr) AccessChain 27(@this) 57
+              59:    6(float) Load 58
+              60:    6(float) FAdd 55 59
+                              ReturnValue 60
+                              FunctionEnd
+      34(@main():   32(fvec4) Function None 33
+              35:             Label
+     63(context):     13(ptr) Variable Function
+              65:      7(ptr) AccessChain 63(context) 57
+                              Store 65 64
+              66:    6(float) FunctionCall 16(myContext::method1() 63(context)
+              67:   32(fvec4) CompositeConstruct 66 66 66 66
+                              ReturnValue 67
+                              FunctionEnd
diff --git a/Test/baseResults/hlsl.mintypes.frag.out b/Test/baseResults/hlsl.mintypes.frag.out
index 1cbd477..8722cf2 100644
--- a/Test/baseResults/hlsl.mintypes.frag.out
+++ b/Test/baseResults/hlsl.mintypes.frag.out
@@ -37,14 +37,14 @@
 0:?     Sequence
 0:9      Sequence
 0:9        move second child to first child ( temp 4-component vector of float)
-0:?           'Color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 0:9          Color: direct index for structure ( temp 4-component vector of float)
 0:9            Function Call: @main( ( temp structure{ temp 4-component vector of float Color})
 0:9            Constant:
 0:9              0 (const int)
 0:?   Linker Objects
 0:?     'anon@0' (layout( row_major std140) uniform block{ uniform mediump float b1a,  uniform mediump float b1b})
-0:?     'Color' (layout( location=0) out 4-component vector of float)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 
 Linked fragment stage:
@@ -88,17 +88,17 @@
 0:?     Sequence
 0:9      Sequence
 0:9        move second child to first child ( temp 4-component vector of float)
-0:?           'Color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 0:9          Color: direct index for structure ( temp 4-component vector of float)
 0:9            Function Call: @main( ( temp structure{ temp 4-component vector of float Color})
 0:9            Constant:
 0:9              0 (const int)
 0:?   Linker Objects
 0:?     'anon@0' (layout( row_major std140) uniform block{ uniform mediump float b1a,  uniform mediump float b1b})
-0:?     'Color' (layout( location=0) out 4-component vector of float)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 70
 
                               Capability Shader
@@ -122,7 +122,7 @@
                               Name 46  "mu16_2"
                               Name 49  "mu16"
                               Name 54  "psout"
-                              Name 64  "Color"
+                              Name 64  "@entryPointOutput.Color"
                               Name 67  "$Global"
                               MemberName 67($Global) 0  "b1a"
                               MemberName 67($Global) 1  "b1b"
@@ -157,7 +157,7 @@
                               Decorate 50 RelaxedPrecision
                               Decorate 51 RelaxedPrecision
                               Decorate 52 RelaxedPrecision
-                              Decorate 64(Color) Location 0
+                              Decorate 64(@entryPointOutput.Color) Location 0
                               MemberDecorate 67($Global) 0 RelaxedPrecision
                               MemberDecorate 67($Global) 0 Offset 0
                               MemberDecorate 67($Global) 1 RelaxedPrecision
@@ -187,7 +187,7 @@
               57:    7(fvec4) ConstantComposite 56 56 56 56
               58:             TypePointer Function 7(fvec4)
               63:             TypePointer Output 7(fvec4)
-       64(Color):     63(ptr) Variable Output
+64(@entryPointOutput.Color):     63(ptr) Variable Output
      67($Global):             TypeStruct 6(float) 6(float)
               68:             TypePointer Uniform 67($Global)
               69:     68(ptr) Variable Uniform
@@ -195,7 +195,7 @@
                5:             Label
               65:8(PS_OUTPUT) FunctionCall 10(@main()
               66:    7(fvec4) CompositeExtract 65 0
-                              Store 64(Color) 66
+                              Store 64(@entryPointOutput.Color) 66
                               Return
                               FunctionEnd
       10(@main():8(PS_OUTPUT) Function None 9
diff --git a/Test/baseResults/hlsl.mip.negative.frag.out b/Test/baseResults/hlsl.mip.negative.frag.out
new file mode 100644
index 0000000..36f4137
--- /dev/null
+++ b/Test/baseResults/hlsl.mip.negative.frag.out
@@ -0,0 +1,68 @@
+hlsl.mip.negative.frag
+ERROR: 0:5: '' : unterminated mips operator: 
+ERROR: 1 compilation errors.  No code generated.
+
+
+Shader version: 500
+gl_FragCoord origin is upper left
+ERROR: node is still EOpNull!
+0:4  Function Definition: @main( ( temp 4-component vector of float)
+0:4    Function Parameters: 
+0:?     Sequence
+0:?       textureFetch ( temp 4-component vector of float)
+0:5        'g_tTex2df4' ( uniform texture2D)
+0:?         Constant:
+0:?           3 (const uint)
+0:?           4 (const uint)
+0:5        Constant:
+0:5          2 (const int)
+0:7      Branch: Return with expression
+0:7        Constant:
+0:7          0.000000
+0:7          0.000000
+0:7          0.000000
+0:7          0.000000
+0:4  Function Definition: main( ( temp void)
+0:4    Function Parameters: 
+0:?     Sequence
+0:4      move second child to first child ( temp 4-component vector of float)
+0:?         '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+0:4        Function Call: @main( ( temp 4-component vector of float)
+0:?   Linker Objects
+0:?     'g_tTex2df4' ( uniform texture2D)
+0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+
+
+Linked fragment stage:
+
+
+Shader version: 500
+gl_FragCoord origin is upper left
+ERROR: node is still EOpNull!
+0:4  Function Definition: @main( ( temp 4-component vector of float)
+0:4    Function Parameters: 
+0:?     Sequence
+0:?       textureFetch ( temp 4-component vector of float)
+0:5        'g_tTex2df4' ( uniform texture2D)
+0:?         Constant:
+0:?           3 (const uint)
+0:?           4 (const uint)
+0:5        Constant:
+0:5          2 (const int)
+0:7      Branch: Return with expression
+0:7        Constant:
+0:7          0.000000
+0:7          0.000000
+0:7          0.000000
+0:7          0.000000
+0:4  Function Definition: main( ( temp void)
+0:4    Function Parameters: 
+0:?     Sequence
+0:4      move second child to first child ( temp 4-component vector of float)
+0:?         '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+0:4        Function Call: @main( ( temp 4-component vector of float)
+0:?   Linker Objects
+0:?     'g_tTex2df4' ( uniform texture2D)
+0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+
+SPIR-V is not generated for failed compile or link
diff --git a/Test/baseResults/hlsl.mip.negative2.frag.out b/Test/baseResults/hlsl.mip.negative2.frag.out
new file mode 100644
index 0000000..75cf95f
--- /dev/null
+++ b/Test/baseResults/hlsl.mip.negative2.frag.out
@@ -0,0 +1,74 @@
+hlsl.mip.negative2.frag
+ERROR: 0:5: 'r' : unexpected operator on texture type:  uniform texture2D
+ERROR: 1 compilation errors.  No code generated.
+
+
+Shader version: 500
+gl_FragCoord origin is upper left
+ERROR: node is still EOpNull!
+0:4  Function Definition: @main( ( temp 4-component vector of float)
+0:4    Function Parameters: 
+0:?     Sequence
+0:5      direct index ( temp float)
+0:5        textureFetch ( temp 4-component vector of float)
+0:5          'g_tTex2df4' ( uniform texture2D)
+0:5          Constant:
+0:5            2 (const int)
+0:5          Constant:
+0:5            0 (const int)
+0:?         Constant:
+0:?           3 (const uint)
+0:?           4 (const uint)
+0:7      Branch: Return with expression
+0:7        Constant:
+0:7          0.000000
+0:7          0.000000
+0:7          0.000000
+0:7          0.000000
+0:4  Function Definition: main( ( temp void)
+0:4    Function Parameters: 
+0:?     Sequence
+0:4      move second child to first child ( temp 4-component vector of float)
+0:?         '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+0:4        Function Call: @main( ( temp 4-component vector of float)
+0:?   Linker Objects
+0:?     'g_tTex2df4' ( uniform texture2D)
+0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+
+
+Linked fragment stage:
+
+
+Shader version: 500
+gl_FragCoord origin is upper left
+ERROR: node is still EOpNull!
+0:4  Function Definition: @main( ( temp 4-component vector of float)
+0:4    Function Parameters: 
+0:?     Sequence
+0:5      direct index ( temp float)
+0:5        textureFetch ( temp 4-component vector of float)
+0:5          'g_tTex2df4' ( uniform texture2D)
+0:5          Constant:
+0:5            2 (const int)
+0:5          Constant:
+0:5            0 (const int)
+0:?         Constant:
+0:?           3 (const uint)
+0:?           4 (const uint)
+0:7      Branch: Return with expression
+0:7        Constant:
+0:7          0.000000
+0:7          0.000000
+0:7          0.000000
+0:7          0.000000
+0:4  Function Definition: main( ( temp void)
+0:4    Function Parameters: 
+0:?     Sequence
+0:4      move second child to first child ( temp 4-component vector of float)
+0:?         '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+0:4        Function Call: @main( ( temp 4-component vector of float)
+0:?   Linker Objects
+0:?     'g_tTex2df4' ( uniform texture2D)
+0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+
+SPIR-V is not generated for failed compile or link
diff --git a/Test/baseResults/hlsl.mip.operator.frag.out b/Test/baseResults/hlsl.mip.operator.frag.out
new file mode 100644
index 0000000..eb884da
--- /dev/null
+++ b/Test/baseResults/hlsl.mip.operator.frag.out
@@ -0,0 +1,209 @@
+hlsl.mip.operator.frag
+Shader version: 500
+gl_FragCoord origin is upper left
+0:? Sequence
+0:5  Function Definition: @main( ( temp 4-component vector of float)
+0:5    Function Parameters: 
+0:?     Sequence
+0:13      Branch: Return with expression
+0:9        add ( temp 4-component vector of float)
+0:6          add ( temp 4-component vector of float)
+0:?             textureFetch ( temp 4-component vector of float)
+0:6              'g_tTex2df4' ( uniform texture2D)
+0:?               Constant:
+0:?                 3 (const uint)
+0:?                 4 (const uint)
+0:6              Constant:
+0:6                2 (const int)
+0:?             textureFetch ( temp 4-component vector of float)
+0:9              'g_tTex2df4a' ( uniform texture2DArray)
+0:?               Constant:
+0:?                 6 (const uint)
+0:?                 7 (const uint)
+0:?                 8 (const uint)
+0:9              Constant:
+0:9                5 (const uint)
+0:13          textureFetch ( temp 4-component vector of float)
+0:13            'g_tTex2df4' ( uniform texture2D)
+0:13            Convert float to uint ( temp 2-component vector of uint)
+0:13              vector swizzle ( temp 2-component vector of float)
+0:?                 textureFetch ( temp 4-component vector of float)
+0:13                  'g_tTex2df4' ( uniform texture2D)
+0:?                   Constant:
+0:?                     14 (const uint)
+0:?                     15 (const uint)
+0:13                  Constant:
+0:13                    13 (const int)
+0:13                Sequence
+0:13                  Constant:
+0:13                    0 (const int)
+0:13                  Constant:
+0:13                    1 (const int)
+0:13            Convert float to uint ( temp uint)
+0:13              direct index ( temp float)
+0:?                 textureFetch ( temp 4-component vector of float)
+0:13                  'g_tTex2df4' ( uniform texture2D)
+0:?                   Constant:
+0:?                     10 (const uint)
+0:?                     11 (const uint)
+0:13                  Constant:
+0:13                    9 (const int)
+0:13                Constant:
+0:13                  0 (const int)
+0:5  Function Definition: main( ( temp void)
+0:5    Function Parameters: 
+0:?     Sequence
+0:5      move second child to first child ( temp 4-component vector of float)
+0:?         '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+0:5        Function Call: @main( ( temp 4-component vector of float)
+0:?   Linker Objects
+0:?     'g_tTex2df4a' ( uniform texture2DArray)
+0:?     'g_tTex2df4' ( uniform texture2D)
+0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+
+
+Linked fragment stage:
+
+
+Shader version: 500
+gl_FragCoord origin is upper left
+0:? Sequence
+0:5  Function Definition: @main( ( temp 4-component vector of float)
+0:5    Function Parameters: 
+0:?     Sequence
+0:13      Branch: Return with expression
+0:9        add ( temp 4-component vector of float)
+0:6          add ( temp 4-component vector of float)
+0:?             textureFetch ( temp 4-component vector of float)
+0:6              'g_tTex2df4' ( uniform texture2D)
+0:?               Constant:
+0:?                 3 (const uint)
+0:?                 4 (const uint)
+0:6              Constant:
+0:6                2 (const int)
+0:?             textureFetch ( temp 4-component vector of float)
+0:9              'g_tTex2df4a' ( uniform texture2DArray)
+0:?               Constant:
+0:?                 6 (const uint)
+0:?                 7 (const uint)
+0:?                 8 (const uint)
+0:9              Constant:
+0:9                5 (const uint)
+0:13          textureFetch ( temp 4-component vector of float)
+0:13            'g_tTex2df4' ( uniform texture2D)
+0:13            Convert float to uint ( temp 2-component vector of uint)
+0:13              vector swizzle ( temp 2-component vector of float)
+0:?                 textureFetch ( temp 4-component vector of float)
+0:13                  'g_tTex2df4' ( uniform texture2D)
+0:?                   Constant:
+0:?                     14 (const uint)
+0:?                     15 (const uint)
+0:13                  Constant:
+0:13                    13 (const int)
+0:13                Sequence
+0:13                  Constant:
+0:13                    0 (const int)
+0:13                  Constant:
+0:13                    1 (const int)
+0:13            Convert float to uint ( temp uint)
+0:13              direct index ( temp float)
+0:?                 textureFetch ( temp 4-component vector of float)
+0:13                  'g_tTex2df4' ( uniform texture2D)
+0:?                   Constant:
+0:?                     10 (const uint)
+0:?                     11 (const uint)
+0:13                  Constant:
+0:13                    9 (const int)
+0:13                Constant:
+0:13                  0 (const int)
+0:5  Function Definition: main( ( temp void)
+0:5    Function Parameters: 
+0:?     Sequence
+0:5      move second child to first child ( temp 4-component vector of float)
+0:?         '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+0:5        Function Call: @main( ( temp 4-component vector of float)
+0:?   Linker Objects
+0:?     'g_tTex2df4a' ( uniform texture2DArray)
+0:?     'g_tTex2df4' ( uniform texture2D)
+0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 61
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 59
+                              ExecutionMode 4 OriginUpperLeft
+                              Source HLSL 500
+                              Name 4  "main"
+                              Name 9  "@main("
+                              Name 13  "g_tTex2df4"
+                              Name 25  "g_tTex2df4a"
+                              Name 59  "@entryPointOutput"
+                              Decorate 13(g_tTex2df4) DescriptorSet 0
+                              Decorate 25(g_tTex2df4a) DescriptorSet 0
+                              Decorate 59(@entryPointOutput) Location 0
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+               8:             TypeFunction 7(fvec4)
+              11:             TypeImage 6(float) 2D sampled format:Unknown
+              12:             TypePointer UniformConstant 11
+  13(g_tTex2df4):     12(ptr) Variable UniformConstant
+              15:             TypeInt 32 0
+              16:             TypeVector 15(int) 2
+              17:     15(int) Constant 3
+              18:     15(int) Constant 4
+              19:   16(ivec2) ConstantComposite 17 18
+              20:             TypeInt 32 1
+              21:     20(int) Constant 2
+              23:             TypeImage 6(float) 2D array sampled format:Unknown
+              24:             TypePointer UniformConstant 23
+ 25(g_tTex2df4a):     24(ptr) Variable UniformConstant
+              27:             TypeVector 15(int) 3
+              28:     15(int) Constant 6
+              29:     15(int) Constant 7
+              30:     15(int) Constant 8
+              31:   27(ivec3) ConstantComposite 28 29 30
+              32:     15(int) Constant 5
+              37:     15(int) Constant 14
+              38:     15(int) Constant 15
+              39:   16(ivec2) ConstantComposite 37 38
+              40:     20(int) Constant 13
+              42:             TypeVector 6(float) 2
+              46:     15(int) Constant 10
+              47:     15(int) Constant 11
+              48:   16(ivec2) ConstantComposite 46 47
+              49:     20(int) Constant 9
+              51:     15(int) Constant 0
+              58:             TypePointer Output 7(fvec4)
+59(@entryPointOutput):     58(ptr) Variable Output
+         4(main):           2 Function None 3
+               5:             Label
+              60:    7(fvec4) FunctionCall 9(@main()
+                              Store 59(@entryPointOutput) 60
+                              Return
+                              FunctionEnd
+       9(@main():    7(fvec4) Function None 8
+              10:             Label
+              14:          11 Load 13(g_tTex2df4)
+              22:    7(fvec4) ImageFetch 14 19 Lod 21
+              26:          23 Load 25(g_tTex2df4a)
+              33:    7(fvec4) ImageFetch 26 31 Lod 32
+              34:    7(fvec4) FAdd 22 33
+              35:          11 Load 13(g_tTex2df4)
+              36:          11 Load 13(g_tTex2df4)
+              41:    7(fvec4) ImageFetch 36 39 Lod 40
+              43:   42(fvec2) VectorShuffle 41 41 0 1
+              44:   16(ivec2) ConvertFToU 43
+              45:          11 Load 13(g_tTex2df4)
+              50:    7(fvec4) ImageFetch 45 48 Lod 49
+              52:    6(float) CompositeExtract 50 0
+              53:     15(int) ConvertFToU 52
+              54:    7(fvec4) ImageFetch 35 44 Lod 53
+              55:    7(fvec4) FAdd 34 54
+                              ReturnValue 55
+                              FunctionEnd
diff --git a/Test/baseResults/hlsl.mul-truncate.frag.out b/Test/baseResults/hlsl.mul-truncate.frag.out
new file mode 100644
index 0000000..1973fad
--- /dev/null
+++ b/Test/baseResults/hlsl.mul-truncate.frag.out
@@ -0,0 +1,643 @@
+hlsl.mul-truncate.frag
+WARNING: 0:24: '' : mul() matrix size mismatch 
+WARNING: 0:25: '' : mul() matrix size mismatch 
+WARNING: 0:28: '' : mul() matrix size mismatch 
+WARNING: 0:29: '' : mul() matrix size mismatch 
+WARNING: 0:32: '' : mul() matrix size mismatch 
+WARNING: 0:33: '' : mul() matrix size mismatch 
+WARNING: 0:34: '' : mul() matrix size mismatch 
+WARNING: 0:35: '' : mul() matrix size mismatch 
+
+Shader version: 500
+gl_FragCoord origin is upper left
+0:? Sequence
+0:18  Function Definition: @main( ( temp 4-component vector of float)
+0:18    Function Parameters: 
+0:?     Sequence
+0:20      Sequence
+0:20        move second child to first child ( temp float)
+0:20          'r00' ( temp float)
+0:20          dot-product ( temp float)
+0:20            v2: direct index for structure (layout( row_major std140) uniform 2-component vector of float)
+0:20              'anon@0' (layout( row_major std140) uniform block{layout( row_major std140) uniform 4X4 matrix of float m44, layout( row_major std140) uniform 4X3 matrix of float m43, layout( row_major std140) uniform 3X4 matrix of float m34, layout( row_major std140) uniform 3X3 matrix of float m33, layout( row_major std140) uniform 2X4 matrix of float m24, layout( row_major std140) uniform 4X2 matrix of float m42, layout( row_major std140) uniform 4-component vector of float v4, layout( row_major std140) uniform 3-component vector of float v3, layout( row_major std140) uniform 2-component vector of float v2})
+0:20              Constant:
+0:20                8 (const uint)
+0:20            Construct vec2 ( in 2-component vector of float)
+0:20              v3: direct index for structure (layout( row_major std140) uniform 3-component vector of float)
+0:20                'anon@0' (layout( row_major std140) uniform block{layout( row_major std140) uniform 4X4 matrix of float m44, layout( row_major std140) uniform 4X3 matrix of float m43, layout( row_major std140) uniform 3X4 matrix of float m34, layout( row_major std140) uniform 3X3 matrix of float m33, layout( row_major std140) uniform 2X4 matrix of float m24, layout( row_major std140) uniform 4X2 matrix of float m42, layout( row_major std140) uniform 4-component vector of float v4, layout( row_major std140) uniform 3-component vector of float v3, layout( row_major std140) uniform 2-component vector of float v2})
+0:20                Constant:
+0:20                  7 (const uint)
+0:21      Sequence
+0:21        move second child to first child ( temp float)
+0:21          'r01' ( temp float)
+0:21          dot-product ( temp float)
+0:21            Construct vec2 ( in 2-component vector of float)
+0:21              v4: direct index for structure (layout( row_major std140) uniform 4-component vector of float)
+0:21                'anon@0' (layout( row_major std140) uniform block{layout( row_major std140) uniform 4X4 matrix of float m44, layout( row_major std140) uniform 4X3 matrix of float m43, layout( row_major std140) uniform 3X4 matrix of float m34, layout( row_major std140) uniform 3X3 matrix of float m33, layout( row_major std140) uniform 2X4 matrix of float m24, layout( row_major std140) uniform 4X2 matrix of float m42, layout( row_major std140) uniform 4-component vector of float v4, layout( row_major std140) uniform 3-component vector of float v3, layout( row_major std140) uniform 2-component vector of float v2})
+0:21                Constant:
+0:21                  6 (const uint)
+0:21            v2: direct index for structure (layout( row_major std140) uniform 2-component vector of float)
+0:21              'anon@0' (layout( row_major std140) uniform block{layout( row_major std140) uniform 4X4 matrix of float m44, layout( row_major std140) uniform 4X3 matrix of float m43, layout( row_major std140) uniform 3X4 matrix of float m34, layout( row_major std140) uniform 3X3 matrix of float m33, layout( row_major std140) uniform 2X4 matrix of float m24, layout( row_major std140) uniform 4X2 matrix of float m42, layout( row_major std140) uniform 4-component vector of float v4, layout( row_major std140) uniform 3-component vector of float v3, layout( row_major std140) uniform 2-component vector of float v2})
+0:21              Constant:
+0:21                8 (const uint)
+0:24      Sequence
+0:24        move second child to first child ( temp 4-component vector of float)
+0:24          'r10' ( temp 4-component vector of float)
+0:24          matrix-times-vector ( temp 4-component vector of float)
+0:24            Construct mat3x4 ( uniform 3X4 matrix of float)
+0:24              m44: direct index for structure (layout( row_major std140) uniform 4X4 matrix of float)
+0:24                'anon@0' (layout( row_major std140) uniform block{layout( row_major std140) uniform 4X4 matrix of float m44, layout( row_major std140) uniform 4X3 matrix of float m43, layout( row_major std140) uniform 3X4 matrix of float m34, layout( row_major std140) uniform 3X3 matrix of float m33, layout( row_major std140) uniform 2X4 matrix of float m24, layout( row_major std140) uniform 4X2 matrix of float m42, layout( row_major std140) uniform 4-component vector of float v4, layout( row_major std140) uniform 3-component vector of float v3, layout( row_major std140) uniform 2-component vector of float v2})
+0:24                Constant:
+0:24                  0 (const uint)
+0:24            v3: direct index for structure (layout( row_major std140) uniform 3-component vector of float)
+0:24              'anon@0' (layout( row_major std140) uniform block{layout( row_major std140) uniform 4X4 matrix of float m44, layout( row_major std140) uniform 4X3 matrix of float m43, layout( row_major std140) uniform 3X4 matrix of float m34, layout( row_major std140) uniform 3X3 matrix of float m33, layout( row_major std140) uniform 2X4 matrix of float m24, layout( row_major std140) uniform 4X2 matrix of float m42, layout( row_major std140) uniform 4-component vector of float v4, layout( row_major std140) uniform 3-component vector of float v3, layout( row_major std140) uniform 2-component vector of float v2})
+0:24              Constant:
+0:24                7 (const uint)
+0:25      Sequence
+0:25        move second child to first child ( temp 4-component vector of float)
+0:25          'r11' ( temp 4-component vector of float)
+0:25          matrix-times-vector ( temp 4-component vector of float)
+0:25            m34: direct index for structure (layout( row_major std140) uniform 3X4 matrix of float)
+0:25              'anon@0' (layout( row_major std140) uniform block{layout( row_major std140) uniform 4X4 matrix of float m44, layout( row_major std140) uniform 4X3 matrix of float m43, layout( row_major std140) uniform 3X4 matrix of float m34, layout( row_major std140) uniform 3X3 matrix of float m33, layout( row_major std140) uniform 2X4 matrix of float m24, layout( row_major std140) uniform 4X2 matrix of float m42, layout( row_major std140) uniform 4-component vector of float v4, layout( row_major std140) uniform 3-component vector of float v3, layout( row_major std140) uniform 2-component vector of float v2})
+0:25              Constant:
+0:25                2 (const uint)
+0:25            Construct vec3 ( uniform 3-component vector of float)
+0:25              v4: direct index for structure (layout( row_major std140) uniform 4-component vector of float)
+0:25                'anon@0' (layout( row_major std140) uniform block{layout( row_major std140) uniform 4X4 matrix of float m44, layout( row_major std140) uniform 4X3 matrix of float m43, layout( row_major std140) uniform 3X4 matrix of float m34, layout( row_major std140) uniform 3X3 matrix of float m33, layout( row_major std140) uniform 2X4 matrix of float m24, layout( row_major std140) uniform 4X2 matrix of float m42, layout( row_major std140) uniform 4-component vector of float v4, layout( row_major std140) uniform 3-component vector of float v3, layout( row_major std140) uniform 2-component vector of float v2})
+0:25                Constant:
+0:25                  6 (const uint)
+0:28      Sequence
+0:28        move second child to first child ( temp 4-component vector of float)
+0:28          'r20' ( temp 4-component vector of float)
+0:28          vector-times-matrix ( temp 4-component vector of float)
+0:28            v3: direct index for structure (layout( row_major std140) uniform 3-component vector of float)
+0:28              'anon@0' (layout( row_major std140) uniform block{layout( row_major std140) uniform 4X4 matrix of float m44, layout( row_major std140) uniform 4X3 matrix of float m43, layout( row_major std140) uniform 3X4 matrix of float m34, layout( row_major std140) uniform 3X3 matrix of float m33, layout( row_major std140) uniform 2X4 matrix of float m24, layout( row_major std140) uniform 4X2 matrix of float m42, layout( row_major std140) uniform 4-component vector of float v4, layout( row_major std140) uniform 3-component vector of float v3, layout( row_major std140) uniform 2-component vector of float v2})
+0:28              Constant:
+0:28                7 (const uint)
+0:28            Construct mat4x3 ( uniform 4X3 matrix of float)
+0:28              m44: direct index for structure (layout( row_major std140) uniform 4X4 matrix of float)
+0:28                'anon@0' (layout( row_major std140) uniform block{layout( row_major std140) uniform 4X4 matrix of float m44, layout( row_major std140) uniform 4X3 matrix of float m43, layout( row_major std140) uniform 3X4 matrix of float m34, layout( row_major std140) uniform 3X3 matrix of float m33, layout( row_major std140) uniform 2X4 matrix of float m24, layout( row_major std140) uniform 4X2 matrix of float m42, layout( row_major std140) uniform 4-component vector of float v4, layout( row_major std140) uniform 3-component vector of float v3, layout( row_major std140) uniform 2-component vector of float v2})
+0:28                Constant:
+0:28                  0 (const uint)
+0:29      Sequence
+0:29        move second child to first child ( temp 4-component vector of float)
+0:29          'r21' ( temp 4-component vector of float)
+0:29          vector-times-matrix ( temp 4-component vector of float)
+0:29            Construct vec3 ( uniform 3-component vector of float)
+0:29              v4: direct index for structure (layout( row_major std140) uniform 4-component vector of float)
+0:29                'anon@0' (layout( row_major std140) uniform block{layout( row_major std140) uniform 4X4 matrix of float m44, layout( row_major std140) uniform 4X3 matrix of float m43, layout( row_major std140) uniform 3X4 matrix of float m34, layout( row_major std140) uniform 3X3 matrix of float m33, layout( row_major std140) uniform 2X4 matrix of float m24, layout( row_major std140) uniform 4X2 matrix of float m42, layout( row_major std140) uniform 4-component vector of float v4, layout( row_major std140) uniform 3-component vector of float v3, layout( row_major std140) uniform 2-component vector of float v2})
+0:29                Constant:
+0:29                  6 (const uint)
+0:29            m43: direct index for structure (layout( row_major std140) uniform 4X3 matrix of float)
+0:29              'anon@0' (layout( row_major std140) uniform block{layout( row_major std140) uniform 4X4 matrix of float m44, layout( row_major std140) uniform 4X3 matrix of float m43, layout( row_major std140) uniform 3X4 matrix of float m34, layout( row_major std140) uniform 3X3 matrix of float m33, layout( row_major std140) uniform 2X4 matrix of float m24, layout( row_major std140) uniform 4X2 matrix of float m42, layout( row_major std140) uniform 4-component vector of float v4, layout( row_major std140) uniform 3-component vector of float v3, layout( row_major std140) uniform 2-component vector of float v2})
+0:29              Constant:
+0:29                1 (const uint)
+0:32      Sequence
+0:32        move second child to first child ( temp 2X3 matrix of float)
+0:32          'r30' ( temp 2X3 matrix of float)
+0:32          matrix-multiply ( temp 2X3 matrix of float)
+0:32            m33: direct index for structure (layout( row_major std140) uniform 3X3 matrix of float)
+0:32              'anon@0' (layout( row_major std140) uniform block{layout( row_major std140) uniform 4X4 matrix of float m44, layout( row_major std140) uniform 4X3 matrix of float m43, layout( row_major std140) uniform 3X4 matrix of float m34, layout( row_major std140) uniform 3X3 matrix of float m33, layout( row_major std140) uniform 2X4 matrix of float m24, layout( row_major std140) uniform 4X2 matrix of float m42, layout( row_major std140) uniform 4-component vector of float v4, layout( row_major std140) uniform 3-component vector of float v3, layout( row_major std140) uniform 2-component vector of float v2})
+0:32              Constant:
+0:32                3 (const uint)
+0:32            Construct mat2x3 ( uniform 2X3 matrix of float)
+0:32              m24: direct index for structure (layout( row_major std140) uniform 2X4 matrix of float)
+0:32                'anon@0' (layout( row_major std140) uniform block{layout( row_major std140) uniform 4X4 matrix of float m44, layout( row_major std140) uniform 4X3 matrix of float m43, layout( row_major std140) uniform 3X4 matrix of float m34, layout( row_major std140) uniform 3X3 matrix of float m33, layout( row_major std140) uniform 2X4 matrix of float m24, layout( row_major std140) uniform 4X2 matrix of float m42, layout( row_major std140) uniform 4-component vector of float v4, layout( row_major std140) uniform 3-component vector of float v3, layout( row_major std140) uniform 2-component vector of float v2})
+0:32                Constant:
+0:32                  4 (const uint)
+0:33      Sequence
+0:33        move second child to first child ( temp 3X4 matrix of float)
+0:33          'r31' ( temp 3X4 matrix of float)
+0:33          matrix-multiply ( temp 3X4 matrix of float)
+0:33            m24: direct index for structure (layout( row_major std140) uniform 2X4 matrix of float)
+0:33              'anon@0' (layout( row_major std140) uniform block{layout( row_major std140) uniform 4X4 matrix of float m44, layout( row_major std140) uniform 4X3 matrix of float m43, layout( row_major std140) uniform 3X4 matrix of float m34, layout( row_major std140) uniform 3X3 matrix of float m33, layout( row_major std140) uniform 2X4 matrix of float m24, layout( row_major std140) uniform 4X2 matrix of float m42, layout( row_major std140) uniform 4-component vector of float v4, layout( row_major std140) uniform 3-component vector of float v3, layout( row_major std140) uniform 2-component vector of float v2})
+0:33              Constant:
+0:33                4 (const uint)
+0:33            Construct mat3x2 ( uniform 3X2 matrix of float)
+0:33              m33: direct index for structure (layout( row_major std140) uniform 3X3 matrix of float)
+0:33                'anon@0' (layout( row_major std140) uniform block{layout( row_major std140) uniform 4X4 matrix of float m44, layout( row_major std140) uniform 4X3 matrix of float m43, layout( row_major std140) uniform 3X4 matrix of float m34, layout( row_major std140) uniform 3X3 matrix of float m33, layout( row_major std140) uniform 2X4 matrix of float m24, layout( row_major std140) uniform 4X2 matrix of float m42, layout( row_major std140) uniform 4-component vector of float v4, layout( row_major std140) uniform 3-component vector of float v3, layout( row_major std140) uniform 2-component vector of float v2})
+0:33                Constant:
+0:33                  3 (const uint)
+0:34      Sequence
+0:34        move second child to first child ( temp 3X2 matrix of float)
+0:34          'r32' ( temp 3X2 matrix of float)
+0:34          matrix-multiply ( temp 3X2 matrix of float)
+0:34            Construct mat3x2 ( uniform 3X2 matrix of float)
+0:34              m42: direct index for structure (layout( row_major std140) uniform 4X2 matrix of float)
+0:34                'anon@0' (layout( row_major std140) uniform block{layout( row_major std140) uniform 4X4 matrix of float m44, layout( row_major std140) uniform 4X3 matrix of float m43, layout( row_major std140) uniform 3X4 matrix of float m34, layout( row_major std140) uniform 3X3 matrix of float m33, layout( row_major std140) uniform 2X4 matrix of float m24, layout( row_major std140) uniform 4X2 matrix of float m42, layout( row_major std140) uniform 4-component vector of float v4, layout( row_major std140) uniform 3-component vector of float v3, layout( row_major std140) uniform 2-component vector of float v2})
+0:34                Constant:
+0:34                  5 (const uint)
+0:34            m33: direct index for structure (layout( row_major std140) uniform 3X3 matrix of float)
+0:34              'anon@0' (layout( row_major std140) uniform block{layout( row_major std140) uniform 4X4 matrix of float m44, layout( row_major std140) uniform 4X3 matrix of float m43, layout( row_major std140) uniform 3X4 matrix of float m34, layout( row_major std140) uniform 3X3 matrix of float m33, layout( row_major std140) uniform 2X4 matrix of float m24, layout( row_major std140) uniform 4X2 matrix of float m42, layout( row_major std140) uniform 4-component vector of float v4, layout( row_major std140) uniform 3-component vector of float v3, layout( row_major std140) uniform 2-component vector of float v2})
+0:34              Constant:
+0:34                3 (const uint)
+0:35      Sequence
+0:35        move second child to first child ( temp 4X3 matrix of float)
+0:35          'r33' ( temp 4X3 matrix of float)
+0:35          matrix-multiply ( temp 4X3 matrix of float)
+0:35            Construct mat2x3 ( uniform 2X3 matrix of float)
+0:35              m33: direct index for structure (layout( row_major std140) uniform 3X3 matrix of float)
+0:35                'anon@0' (layout( row_major std140) uniform block{layout( row_major std140) uniform 4X4 matrix of float m44, layout( row_major std140) uniform 4X3 matrix of float m43, layout( row_major std140) uniform 3X4 matrix of float m34, layout( row_major std140) uniform 3X3 matrix of float m33, layout( row_major std140) uniform 2X4 matrix of float m24, layout( row_major std140) uniform 4X2 matrix of float m42, layout( row_major std140) uniform 4-component vector of float v4, layout( row_major std140) uniform 3-component vector of float v3, layout( row_major std140) uniform 2-component vector of float v2})
+0:35                Constant:
+0:35                  3 (const uint)
+0:35            m42: direct index for structure (layout( row_major std140) uniform 4X2 matrix of float)
+0:35              'anon@0' (layout( row_major std140) uniform block{layout( row_major std140) uniform 4X4 matrix of float m44, layout( row_major std140) uniform 4X3 matrix of float m43, layout( row_major std140) uniform 3X4 matrix of float m34, layout( row_major std140) uniform 3X3 matrix of float m33, layout( row_major std140) uniform 2X4 matrix of float m24, layout( row_major std140) uniform 4X2 matrix of float m42, layout( row_major std140) uniform 4-component vector of float v4, layout( row_major std140) uniform 3-component vector of float v3, layout( row_major std140) uniform 2-component vector of float v2})
+0:35              Constant:
+0:35                5 (const uint)
+0:37      Branch: Return with expression
+0:37        add ( temp 4-component vector of float)
+0:37          add ( temp 4-component vector of float)
+0:37            add ( temp 4-component vector of float)
+0:37              add ( temp 4-component vector of float)
+0:37                add ( temp 4-component vector of float)
+0:37                  add ( temp 4-component vector of float)
+0:37                    add ( temp 4-component vector of float)
+0:37                      add ( temp 4-component vector of float)
+0:37                        add ( temp 4-component vector of float)
+0:37                          'r10' ( temp 4-component vector of float)
+0:37                          'r11' ( temp 4-component vector of float)
+0:37                        'r20' ( temp 4-component vector of float)
+0:37                      'r21' ( temp 4-component vector of float)
+0:37                    'r00' ( temp float)
+0:37                  'r01' ( temp float)
+0:37                direct index ( temp float)
+0:37                  direct index ( temp 3-component vector of float)
+0:37                    'r30' ( temp 2X3 matrix of float)
+0:37                    Constant:
+0:37                      0 (const int)
+0:37                  Constant:
+0:37                    0 (const int)
+0:37              direct index ( temp 4-component vector of float)
+0:37                'r31' ( temp 3X4 matrix of float)
+0:37                Constant:
+0:37                  0 (const int)
+0:37            direct index ( temp float)
+0:37              direct index ( temp 2-component vector of float)
+0:37                'r32' ( temp 3X2 matrix of float)
+0:37                Constant:
+0:37                  0 (const int)
+0:37              Constant:
+0:37                0 (const int)
+0:37          direct index ( temp 4-component vector of float)
+0:37            transpose ( temp 3X4 matrix of float)
+0:37              'r33' ( temp 4X3 matrix of float)
+0:37            Constant:
+0:37              0 (const int)
+0:18  Function Definition: main( ( temp void)
+0:18    Function Parameters: 
+0:?     Sequence
+0:18      move second child to first child ( temp 4-component vector of float)
+0:?         '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+0:18        Function Call: @main( ( temp 4-component vector of float)
+0:?   Linker Objects
+0:?     'anon@0' (layout( row_major std140) uniform block{layout( row_major std140) uniform 4X4 matrix of float m44, layout( row_major std140) uniform 4X3 matrix of float m43, layout( row_major std140) uniform 3X4 matrix of float m34, layout( row_major std140) uniform 3X3 matrix of float m33, layout( row_major std140) uniform 2X4 matrix of float m24, layout( row_major std140) uniform 4X2 matrix of float m42, layout( row_major std140) uniform 4-component vector of float v4, layout( row_major std140) uniform 3-component vector of float v3, layout( row_major std140) uniform 2-component vector of float v2})
+0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+
+
+Linked fragment stage:
+
+
+Shader version: 500
+gl_FragCoord origin is upper left
+0:? Sequence
+0:18  Function Definition: @main( ( temp 4-component vector of float)
+0:18    Function Parameters: 
+0:?     Sequence
+0:20      Sequence
+0:20        move second child to first child ( temp float)
+0:20          'r00' ( temp float)
+0:20          dot-product ( temp float)
+0:20            v2: direct index for structure (layout( row_major std140) uniform 2-component vector of float)
+0:20              'anon@0' (layout( row_major std140) uniform block{layout( row_major std140) uniform 4X4 matrix of float m44, layout( row_major std140) uniform 4X3 matrix of float m43, layout( row_major std140) uniform 3X4 matrix of float m34, layout( row_major std140) uniform 3X3 matrix of float m33, layout( row_major std140) uniform 2X4 matrix of float m24, layout( row_major std140) uniform 4X2 matrix of float m42, layout( row_major std140) uniform 4-component vector of float v4, layout( row_major std140) uniform 3-component vector of float v3, layout( row_major std140) uniform 2-component vector of float v2})
+0:20              Constant:
+0:20                8 (const uint)
+0:20            Construct vec2 ( in 2-component vector of float)
+0:20              v3: direct index for structure (layout( row_major std140) uniform 3-component vector of float)
+0:20                'anon@0' (layout( row_major std140) uniform block{layout( row_major std140) uniform 4X4 matrix of float m44, layout( row_major std140) uniform 4X3 matrix of float m43, layout( row_major std140) uniform 3X4 matrix of float m34, layout( row_major std140) uniform 3X3 matrix of float m33, layout( row_major std140) uniform 2X4 matrix of float m24, layout( row_major std140) uniform 4X2 matrix of float m42, layout( row_major std140) uniform 4-component vector of float v4, layout( row_major std140) uniform 3-component vector of float v3, layout( row_major std140) uniform 2-component vector of float v2})
+0:20                Constant:
+0:20                  7 (const uint)
+0:21      Sequence
+0:21        move second child to first child ( temp float)
+0:21          'r01' ( temp float)
+0:21          dot-product ( temp float)
+0:21            Construct vec2 ( in 2-component vector of float)
+0:21              v4: direct index for structure (layout( row_major std140) uniform 4-component vector of float)
+0:21                'anon@0' (layout( row_major std140) uniform block{layout( row_major std140) uniform 4X4 matrix of float m44, layout( row_major std140) uniform 4X3 matrix of float m43, layout( row_major std140) uniform 3X4 matrix of float m34, layout( row_major std140) uniform 3X3 matrix of float m33, layout( row_major std140) uniform 2X4 matrix of float m24, layout( row_major std140) uniform 4X2 matrix of float m42, layout( row_major std140) uniform 4-component vector of float v4, layout( row_major std140) uniform 3-component vector of float v3, layout( row_major std140) uniform 2-component vector of float v2})
+0:21                Constant:
+0:21                  6 (const uint)
+0:21            v2: direct index for structure (layout( row_major std140) uniform 2-component vector of float)
+0:21              'anon@0' (layout( row_major std140) uniform block{layout( row_major std140) uniform 4X4 matrix of float m44, layout( row_major std140) uniform 4X3 matrix of float m43, layout( row_major std140) uniform 3X4 matrix of float m34, layout( row_major std140) uniform 3X3 matrix of float m33, layout( row_major std140) uniform 2X4 matrix of float m24, layout( row_major std140) uniform 4X2 matrix of float m42, layout( row_major std140) uniform 4-component vector of float v4, layout( row_major std140) uniform 3-component vector of float v3, layout( row_major std140) uniform 2-component vector of float v2})
+0:21              Constant:
+0:21                8 (const uint)
+0:24      Sequence
+0:24        move second child to first child ( temp 4-component vector of float)
+0:24          'r10' ( temp 4-component vector of float)
+0:24          matrix-times-vector ( temp 4-component vector of float)
+0:24            Construct mat3x4 ( uniform 3X4 matrix of float)
+0:24              m44: direct index for structure (layout( row_major std140) uniform 4X4 matrix of float)
+0:24                'anon@0' (layout( row_major std140) uniform block{layout( row_major std140) uniform 4X4 matrix of float m44, layout( row_major std140) uniform 4X3 matrix of float m43, layout( row_major std140) uniform 3X4 matrix of float m34, layout( row_major std140) uniform 3X3 matrix of float m33, layout( row_major std140) uniform 2X4 matrix of float m24, layout( row_major std140) uniform 4X2 matrix of float m42, layout( row_major std140) uniform 4-component vector of float v4, layout( row_major std140) uniform 3-component vector of float v3, layout( row_major std140) uniform 2-component vector of float v2})
+0:24                Constant:
+0:24                  0 (const uint)
+0:24            v3: direct index for structure (layout( row_major std140) uniform 3-component vector of float)
+0:24              'anon@0' (layout( row_major std140) uniform block{layout( row_major std140) uniform 4X4 matrix of float m44, layout( row_major std140) uniform 4X3 matrix of float m43, layout( row_major std140) uniform 3X4 matrix of float m34, layout( row_major std140) uniform 3X3 matrix of float m33, layout( row_major std140) uniform 2X4 matrix of float m24, layout( row_major std140) uniform 4X2 matrix of float m42, layout( row_major std140) uniform 4-component vector of float v4, layout( row_major std140) uniform 3-component vector of float v3, layout( row_major std140) uniform 2-component vector of float v2})
+0:24              Constant:
+0:24                7 (const uint)
+0:25      Sequence
+0:25        move second child to first child ( temp 4-component vector of float)
+0:25          'r11' ( temp 4-component vector of float)
+0:25          matrix-times-vector ( temp 4-component vector of float)
+0:25            m34: direct index for structure (layout( row_major std140) uniform 3X4 matrix of float)
+0:25              'anon@0' (layout( row_major std140) uniform block{layout( row_major std140) uniform 4X4 matrix of float m44, layout( row_major std140) uniform 4X3 matrix of float m43, layout( row_major std140) uniform 3X4 matrix of float m34, layout( row_major std140) uniform 3X3 matrix of float m33, layout( row_major std140) uniform 2X4 matrix of float m24, layout( row_major std140) uniform 4X2 matrix of float m42, layout( row_major std140) uniform 4-component vector of float v4, layout( row_major std140) uniform 3-component vector of float v3, layout( row_major std140) uniform 2-component vector of float v2})
+0:25              Constant:
+0:25                2 (const uint)
+0:25            Construct vec3 ( uniform 3-component vector of float)
+0:25              v4: direct index for structure (layout( row_major std140) uniform 4-component vector of float)
+0:25                'anon@0' (layout( row_major std140) uniform block{layout( row_major std140) uniform 4X4 matrix of float m44, layout( row_major std140) uniform 4X3 matrix of float m43, layout( row_major std140) uniform 3X4 matrix of float m34, layout( row_major std140) uniform 3X3 matrix of float m33, layout( row_major std140) uniform 2X4 matrix of float m24, layout( row_major std140) uniform 4X2 matrix of float m42, layout( row_major std140) uniform 4-component vector of float v4, layout( row_major std140) uniform 3-component vector of float v3, layout( row_major std140) uniform 2-component vector of float v2})
+0:25                Constant:
+0:25                  6 (const uint)
+0:28      Sequence
+0:28        move second child to first child ( temp 4-component vector of float)
+0:28          'r20' ( temp 4-component vector of float)
+0:28          vector-times-matrix ( temp 4-component vector of float)
+0:28            v3: direct index for structure (layout( row_major std140) uniform 3-component vector of float)
+0:28              'anon@0' (layout( row_major std140) uniform block{layout( row_major std140) uniform 4X4 matrix of float m44, layout( row_major std140) uniform 4X3 matrix of float m43, layout( row_major std140) uniform 3X4 matrix of float m34, layout( row_major std140) uniform 3X3 matrix of float m33, layout( row_major std140) uniform 2X4 matrix of float m24, layout( row_major std140) uniform 4X2 matrix of float m42, layout( row_major std140) uniform 4-component vector of float v4, layout( row_major std140) uniform 3-component vector of float v3, layout( row_major std140) uniform 2-component vector of float v2})
+0:28              Constant:
+0:28                7 (const uint)
+0:28            Construct mat4x3 ( uniform 4X3 matrix of float)
+0:28              m44: direct index for structure (layout( row_major std140) uniform 4X4 matrix of float)
+0:28                'anon@0' (layout( row_major std140) uniform block{layout( row_major std140) uniform 4X4 matrix of float m44, layout( row_major std140) uniform 4X3 matrix of float m43, layout( row_major std140) uniform 3X4 matrix of float m34, layout( row_major std140) uniform 3X3 matrix of float m33, layout( row_major std140) uniform 2X4 matrix of float m24, layout( row_major std140) uniform 4X2 matrix of float m42, layout( row_major std140) uniform 4-component vector of float v4, layout( row_major std140) uniform 3-component vector of float v3, layout( row_major std140) uniform 2-component vector of float v2})
+0:28                Constant:
+0:28                  0 (const uint)
+0:29      Sequence
+0:29        move second child to first child ( temp 4-component vector of float)
+0:29          'r21' ( temp 4-component vector of float)
+0:29          vector-times-matrix ( temp 4-component vector of float)
+0:29            Construct vec3 ( uniform 3-component vector of float)
+0:29              v4: direct index for structure (layout( row_major std140) uniform 4-component vector of float)
+0:29                'anon@0' (layout( row_major std140) uniform block{layout( row_major std140) uniform 4X4 matrix of float m44, layout( row_major std140) uniform 4X3 matrix of float m43, layout( row_major std140) uniform 3X4 matrix of float m34, layout( row_major std140) uniform 3X3 matrix of float m33, layout( row_major std140) uniform 2X4 matrix of float m24, layout( row_major std140) uniform 4X2 matrix of float m42, layout( row_major std140) uniform 4-component vector of float v4, layout( row_major std140) uniform 3-component vector of float v3, layout( row_major std140) uniform 2-component vector of float v2})
+0:29                Constant:
+0:29                  6 (const uint)
+0:29            m43: direct index for structure (layout( row_major std140) uniform 4X3 matrix of float)
+0:29              'anon@0' (layout( row_major std140) uniform block{layout( row_major std140) uniform 4X4 matrix of float m44, layout( row_major std140) uniform 4X3 matrix of float m43, layout( row_major std140) uniform 3X4 matrix of float m34, layout( row_major std140) uniform 3X3 matrix of float m33, layout( row_major std140) uniform 2X4 matrix of float m24, layout( row_major std140) uniform 4X2 matrix of float m42, layout( row_major std140) uniform 4-component vector of float v4, layout( row_major std140) uniform 3-component vector of float v3, layout( row_major std140) uniform 2-component vector of float v2})
+0:29              Constant:
+0:29                1 (const uint)
+0:32      Sequence
+0:32        move second child to first child ( temp 2X3 matrix of float)
+0:32          'r30' ( temp 2X3 matrix of float)
+0:32          matrix-multiply ( temp 2X3 matrix of float)
+0:32            m33: direct index for structure (layout( row_major std140) uniform 3X3 matrix of float)
+0:32              'anon@0' (layout( row_major std140) uniform block{layout( row_major std140) uniform 4X4 matrix of float m44, layout( row_major std140) uniform 4X3 matrix of float m43, layout( row_major std140) uniform 3X4 matrix of float m34, layout( row_major std140) uniform 3X3 matrix of float m33, layout( row_major std140) uniform 2X4 matrix of float m24, layout( row_major std140) uniform 4X2 matrix of float m42, layout( row_major std140) uniform 4-component vector of float v4, layout( row_major std140) uniform 3-component vector of float v3, layout( row_major std140) uniform 2-component vector of float v2})
+0:32              Constant:
+0:32                3 (const uint)
+0:32            Construct mat2x3 ( uniform 2X3 matrix of float)
+0:32              m24: direct index for structure (layout( row_major std140) uniform 2X4 matrix of float)
+0:32                'anon@0' (layout( row_major std140) uniform block{layout( row_major std140) uniform 4X4 matrix of float m44, layout( row_major std140) uniform 4X3 matrix of float m43, layout( row_major std140) uniform 3X4 matrix of float m34, layout( row_major std140) uniform 3X3 matrix of float m33, layout( row_major std140) uniform 2X4 matrix of float m24, layout( row_major std140) uniform 4X2 matrix of float m42, layout( row_major std140) uniform 4-component vector of float v4, layout( row_major std140) uniform 3-component vector of float v3, layout( row_major std140) uniform 2-component vector of float v2})
+0:32                Constant:
+0:32                  4 (const uint)
+0:33      Sequence
+0:33        move second child to first child ( temp 3X4 matrix of float)
+0:33          'r31' ( temp 3X4 matrix of float)
+0:33          matrix-multiply ( temp 3X4 matrix of float)
+0:33            m24: direct index for structure (layout( row_major std140) uniform 2X4 matrix of float)
+0:33              'anon@0' (layout( row_major std140) uniform block{layout( row_major std140) uniform 4X4 matrix of float m44, layout( row_major std140) uniform 4X3 matrix of float m43, layout( row_major std140) uniform 3X4 matrix of float m34, layout( row_major std140) uniform 3X3 matrix of float m33, layout( row_major std140) uniform 2X4 matrix of float m24, layout( row_major std140) uniform 4X2 matrix of float m42, layout( row_major std140) uniform 4-component vector of float v4, layout( row_major std140) uniform 3-component vector of float v3, layout( row_major std140) uniform 2-component vector of float v2})
+0:33              Constant:
+0:33                4 (const uint)
+0:33            Construct mat3x2 ( uniform 3X2 matrix of float)
+0:33              m33: direct index for structure (layout( row_major std140) uniform 3X3 matrix of float)
+0:33                'anon@0' (layout( row_major std140) uniform block{layout( row_major std140) uniform 4X4 matrix of float m44, layout( row_major std140) uniform 4X3 matrix of float m43, layout( row_major std140) uniform 3X4 matrix of float m34, layout( row_major std140) uniform 3X3 matrix of float m33, layout( row_major std140) uniform 2X4 matrix of float m24, layout( row_major std140) uniform 4X2 matrix of float m42, layout( row_major std140) uniform 4-component vector of float v4, layout( row_major std140) uniform 3-component vector of float v3, layout( row_major std140) uniform 2-component vector of float v2})
+0:33                Constant:
+0:33                  3 (const uint)
+0:34      Sequence
+0:34        move second child to first child ( temp 3X2 matrix of float)
+0:34          'r32' ( temp 3X2 matrix of float)
+0:34          matrix-multiply ( temp 3X2 matrix of float)
+0:34            Construct mat3x2 ( uniform 3X2 matrix of float)
+0:34              m42: direct index for structure (layout( row_major std140) uniform 4X2 matrix of float)
+0:34                'anon@0' (layout( row_major std140) uniform block{layout( row_major std140) uniform 4X4 matrix of float m44, layout( row_major std140) uniform 4X3 matrix of float m43, layout( row_major std140) uniform 3X4 matrix of float m34, layout( row_major std140) uniform 3X3 matrix of float m33, layout( row_major std140) uniform 2X4 matrix of float m24, layout( row_major std140) uniform 4X2 matrix of float m42, layout( row_major std140) uniform 4-component vector of float v4, layout( row_major std140) uniform 3-component vector of float v3, layout( row_major std140) uniform 2-component vector of float v2})
+0:34                Constant:
+0:34                  5 (const uint)
+0:34            m33: direct index for structure (layout( row_major std140) uniform 3X3 matrix of float)
+0:34              'anon@0' (layout( row_major std140) uniform block{layout( row_major std140) uniform 4X4 matrix of float m44, layout( row_major std140) uniform 4X3 matrix of float m43, layout( row_major std140) uniform 3X4 matrix of float m34, layout( row_major std140) uniform 3X3 matrix of float m33, layout( row_major std140) uniform 2X4 matrix of float m24, layout( row_major std140) uniform 4X2 matrix of float m42, layout( row_major std140) uniform 4-component vector of float v4, layout( row_major std140) uniform 3-component vector of float v3, layout( row_major std140) uniform 2-component vector of float v2})
+0:34              Constant:
+0:34                3 (const uint)
+0:35      Sequence
+0:35        move second child to first child ( temp 4X3 matrix of float)
+0:35          'r33' ( temp 4X3 matrix of float)
+0:35          matrix-multiply ( temp 4X3 matrix of float)
+0:35            Construct mat2x3 ( uniform 2X3 matrix of float)
+0:35              m33: direct index for structure (layout( row_major std140) uniform 3X3 matrix of float)
+0:35                'anon@0' (layout( row_major std140) uniform block{layout( row_major std140) uniform 4X4 matrix of float m44, layout( row_major std140) uniform 4X3 matrix of float m43, layout( row_major std140) uniform 3X4 matrix of float m34, layout( row_major std140) uniform 3X3 matrix of float m33, layout( row_major std140) uniform 2X4 matrix of float m24, layout( row_major std140) uniform 4X2 matrix of float m42, layout( row_major std140) uniform 4-component vector of float v4, layout( row_major std140) uniform 3-component vector of float v3, layout( row_major std140) uniform 2-component vector of float v2})
+0:35                Constant:
+0:35                  3 (const uint)
+0:35            m42: direct index for structure (layout( row_major std140) uniform 4X2 matrix of float)
+0:35              'anon@0' (layout( row_major std140) uniform block{layout( row_major std140) uniform 4X4 matrix of float m44, layout( row_major std140) uniform 4X3 matrix of float m43, layout( row_major std140) uniform 3X4 matrix of float m34, layout( row_major std140) uniform 3X3 matrix of float m33, layout( row_major std140) uniform 2X4 matrix of float m24, layout( row_major std140) uniform 4X2 matrix of float m42, layout( row_major std140) uniform 4-component vector of float v4, layout( row_major std140) uniform 3-component vector of float v3, layout( row_major std140) uniform 2-component vector of float v2})
+0:35              Constant:
+0:35                5 (const uint)
+0:37      Branch: Return with expression
+0:37        add ( temp 4-component vector of float)
+0:37          add ( temp 4-component vector of float)
+0:37            add ( temp 4-component vector of float)
+0:37              add ( temp 4-component vector of float)
+0:37                add ( temp 4-component vector of float)
+0:37                  add ( temp 4-component vector of float)
+0:37                    add ( temp 4-component vector of float)
+0:37                      add ( temp 4-component vector of float)
+0:37                        add ( temp 4-component vector of float)
+0:37                          'r10' ( temp 4-component vector of float)
+0:37                          'r11' ( temp 4-component vector of float)
+0:37                        'r20' ( temp 4-component vector of float)
+0:37                      'r21' ( temp 4-component vector of float)
+0:37                    'r00' ( temp float)
+0:37                  'r01' ( temp float)
+0:37                direct index ( temp float)
+0:37                  direct index ( temp 3-component vector of float)
+0:37                    'r30' ( temp 2X3 matrix of float)
+0:37                    Constant:
+0:37                      0 (const int)
+0:37                  Constant:
+0:37                    0 (const int)
+0:37              direct index ( temp 4-component vector of float)
+0:37                'r31' ( temp 3X4 matrix of float)
+0:37                Constant:
+0:37                  0 (const int)
+0:37            direct index ( temp float)
+0:37              direct index ( temp 2-component vector of float)
+0:37                'r32' ( temp 3X2 matrix of float)
+0:37                Constant:
+0:37                  0 (const int)
+0:37              Constant:
+0:37                0 (const int)
+0:37          direct index ( temp 4-component vector of float)
+0:37            transpose ( temp 3X4 matrix of float)
+0:37              'r33' ( temp 4X3 matrix of float)
+0:37            Constant:
+0:37              0 (const int)
+0:18  Function Definition: main( ( temp void)
+0:18    Function Parameters: 
+0:?     Sequence
+0:18      move second child to first child ( temp 4-component vector of float)
+0:?         '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+0:18        Function Call: @main( ( temp 4-component vector of float)
+0:?   Linker Objects
+0:?     'anon@0' (layout( row_major std140) uniform block{layout( row_major std140) uniform 4X4 matrix of float m44, layout( row_major std140) uniform 4X3 matrix of float m43, layout( row_major std140) uniform 3X4 matrix of float m34, layout( row_major std140) uniform 3X3 matrix of float m33, layout( row_major std140) uniform 2X4 matrix of float m24, layout( row_major std140) uniform 4X2 matrix of float m42, layout( row_major std140) uniform 4-component vector of float v4, layout( row_major std140) uniform 3-component vector of float v3, layout( row_major std140) uniform 2-component vector of float v2})
+0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 190
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 188
+                              ExecutionMode 4 OriginUpperLeft
+                              Source HLSL 500
+                              Name 4  "main"
+                              Name 9  "@main("
+                              Name 12  "r00"
+                              Name 21  "Matrix"
+                              MemberName 21(Matrix) 0  "m44"
+                              MemberName 21(Matrix) 1  "m43"
+                              MemberName 21(Matrix) 2  "m34"
+                              MemberName 21(Matrix) 3  "m33"
+                              MemberName 21(Matrix) 4  "m24"
+                              MemberName 21(Matrix) 5  "m42"
+                              MemberName 21(Matrix) 6  "v4"
+                              MemberName 21(Matrix) 7  "v3"
+                              MemberName 21(Matrix) 8  "v2"
+                              Name 23  ""
+                              Name 37  "r01"
+                              Name 49  "r10"
+                              Name 61  "r11"
+                              Name 73  "r20"
+                              Name 88  "r21"
+                              Name 102  "r30"
+                              Name 118  "r31"
+                              Name 133  "r32"
+                              Name 146  "r33"
+                              Name 188  "@entryPointOutput"
+                              MemberDecorate 21(Matrix) 0 RowMajor
+                              MemberDecorate 21(Matrix) 0 Offset 0
+                              MemberDecorate 21(Matrix) 0 MatrixStride 16
+                              MemberDecorate 21(Matrix) 1 RowMajor
+                              MemberDecorate 21(Matrix) 1 Offset 64
+                              MemberDecorate 21(Matrix) 1 MatrixStride 16
+                              MemberDecorate 21(Matrix) 2 RowMajor
+                              MemberDecorate 21(Matrix) 2 Offset 112
+                              MemberDecorate 21(Matrix) 2 MatrixStride 16
+                              MemberDecorate 21(Matrix) 3 RowMajor
+                              MemberDecorate 21(Matrix) 3 Offset 176
+                              MemberDecorate 21(Matrix) 3 MatrixStride 16
+                              MemberDecorate 21(Matrix) 4 RowMajor
+                              MemberDecorate 21(Matrix) 4 Offset 224
+                              MemberDecorate 21(Matrix) 4 MatrixStride 16
+                              MemberDecorate 21(Matrix) 5 RowMajor
+                              MemberDecorate 21(Matrix) 5 Offset 288
+                              MemberDecorate 21(Matrix) 5 MatrixStride 16
+                              MemberDecorate 21(Matrix) 6 Offset 320
+                              MemberDecorate 21(Matrix) 7 Offset 336
+                              MemberDecorate 21(Matrix) 8 Offset 352
+                              Decorate 21(Matrix) Block
+                              Decorate 23 DescriptorSet 0
+                              Decorate 188(@entryPointOutput) Location 0
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+               8:             TypeFunction 7(fvec4)
+              11:             TypePointer Function 6(float)
+              13:             TypeMatrix 7(fvec4) 4
+              14:             TypeVector 6(float) 3
+              15:             TypeMatrix 14(fvec3) 4
+              16:             TypeMatrix 7(fvec4) 3
+              17:             TypeMatrix 14(fvec3) 3
+              18:             TypeMatrix 7(fvec4) 2
+              19:             TypeVector 6(float) 2
+              20:             TypeMatrix 19(fvec2) 4
+      21(Matrix):             TypeStruct 13 15 16 17 18 20 7(fvec4) 14(fvec3) 19(fvec2)
+              22:             TypePointer Uniform 21(Matrix)
+              23:     22(ptr) Variable Uniform
+              24:             TypeInt 32 1
+              25:     24(int) Constant 8
+              26:             TypePointer Uniform 19(fvec2)
+              29:     24(int) Constant 7
+              30:             TypePointer Uniform 14(fvec3)
+              38:     24(int) Constant 6
+              39:             TypePointer Uniform 7(fvec4)
+              48:             TypePointer Function 7(fvec4)
+              50:     24(int) Constant 0
+              51:             TypePointer Uniform 13
+              62:     24(int) Constant 2
+              63:             TypePointer Uniform 16
+              95:     24(int) Constant 1
+              96:             TypePointer Uniform 15
+             100:             TypeMatrix 14(fvec3) 2
+             101:             TypePointer Function 100
+             103:     24(int) Constant 3
+             104:             TypePointer Uniform 17
+             107:     24(int) Constant 4
+             108:             TypePointer Uniform 18
+             117:             TypePointer Function 16
+             123:             TypeMatrix 19(fvec2) 3
+             132:             TypePointer Function 123
+             134:     24(int) Constant 5
+             135:             TypePointer Uniform 20
+             145:             TypePointer Function 15
+             168:             TypeInt 32 0
+             169:    168(int) Constant 0
+             187:             TypePointer Output 7(fvec4)
+188(@entryPointOutput):    187(ptr) Variable Output
+         4(main):           2 Function None 3
+               5:             Label
+             189:    7(fvec4) FunctionCall 9(@main()
+                              Store 188(@entryPointOutput) 189
+                              Return
+                              FunctionEnd
+       9(@main():    7(fvec4) Function None 8
+              10:             Label
+         12(r00):     11(ptr) Variable Function
+         37(r01):     11(ptr) Variable Function
+         49(r10):     48(ptr) Variable Function
+         61(r11):     48(ptr) Variable Function
+         73(r20):     48(ptr) Variable Function
+         88(r21):     48(ptr) Variable Function
+        102(r30):    101(ptr) Variable Function
+        118(r31):    117(ptr) Variable Function
+        133(r32):    132(ptr) Variable Function
+        146(r33):    145(ptr) Variable Function
+              27:     26(ptr) AccessChain 23 25
+              28:   19(fvec2) Load 27
+              31:     30(ptr) AccessChain 23 29
+              32:   14(fvec3) Load 31
+              33:    6(float) CompositeExtract 32 0
+              34:    6(float) CompositeExtract 32 1
+              35:   19(fvec2) CompositeConstruct 33 34
+              36:    6(float) Dot 28 35
+                              Store 12(r00) 36
+              40:     39(ptr) AccessChain 23 38
+              41:    7(fvec4) Load 40
+              42:    6(float) CompositeExtract 41 0
+              43:    6(float) CompositeExtract 41 1
+              44:   19(fvec2) CompositeConstruct 42 43
+              45:     26(ptr) AccessChain 23 25
+              46:   19(fvec2) Load 45
+              47:    6(float) Dot 44 46
+                              Store 37(r01) 47
+              52:     51(ptr) AccessChain 23 50
+              53:          13 Load 52
+              54:    7(fvec4) CompositeExtract 53 0
+              55:    7(fvec4) CompositeExtract 53 1
+              56:    7(fvec4) CompositeExtract 53 2
+              57:          16 CompositeConstruct 54 55 56
+              58:     30(ptr) AccessChain 23 29
+              59:   14(fvec3) Load 58
+              60:    7(fvec4) MatrixTimesVector 57 59
+                              Store 49(r10) 60
+              64:     63(ptr) AccessChain 23 62
+              65:          16 Load 64
+              66:     39(ptr) AccessChain 23 38
+              67:    7(fvec4) Load 66
+              68:    6(float) CompositeExtract 67 0
+              69:    6(float) CompositeExtract 67 1
+              70:    6(float) CompositeExtract 67 2
+              71:   14(fvec3) CompositeConstruct 68 69 70
+              72:    7(fvec4) MatrixTimesVector 65 71
+                              Store 61(r11) 72
+              74:     30(ptr) AccessChain 23 29
+              75:   14(fvec3) Load 74
+              76:     51(ptr) AccessChain 23 50
+              77:          13 Load 76
+              78:    7(fvec4) CompositeExtract 77 0
+              79:   14(fvec3) VectorShuffle 78 78 0 1 2
+              80:    7(fvec4) CompositeExtract 77 1
+              81:   14(fvec3) VectorShuffle 80 80 0 1 2
+              82:    7(fvec4) CompositeExtract 77 2
+              83:   14(fvec3) VectorShuffle 82 82 0 1 2
+              84:    7(fvec4) CompositeExtract 77 3
+              85:   14(fvec3) VectorShuffle 84 84 0 1 2
+              86:          15 CompositeConstruct 79 81 83 85
+              87:    7(fvec4) VectorTimesMatrix 75 86
+                              Store 73(r20) 87
+              89:     39(ptr) AccessChain 23 38
+              90:    7(fvec4) Load 89
+              91:    6(float) CompositeExtract 90 0
+              92:    6(float) CompositeExtract 90 1
+              93:    6(float) CompositeExtract 90 2
+              94:   14(fvec3) CompositeConstruct 91 92 93
+              97:     96(ptr) AccessChain 23 95
+              98:          15 Load 97
+              99:    7(fvec4) VectorTimesMatrix 94 98
+                              Store 88(r21) 99
+             105:    104(ptr) AccessChain 23 103
+             106:          17 Load 105
+             109:    108(ptr) AccessChain 23 107
+             110:          18 Load 109
+             111:    7(fvec4) CompositeExtract 110 0
+             112:   14(fvec3) VectorShuffle 111 111 0 1 2
+             113:    7(fvec4) CompositeExtract 110 1
+             114:   14(fvec3) VectorShuffle 113 113 0 1 2
+             115:         100 CompositeConstruct 112 114
+             116:         100 MatrixTimesMatrix 106 115
+                              Store 102(r30) 116
+             119:    108(ptr) AccessChain 23 107
+             120:          18 Load 119
+             121:    104(ptr) AccessChain 23 103
+             122:          17 Load 121
+             124:   14(fvec3) CompositeExtract 122 0
+             125:   19(fvec2) VectorShuffle 124 124 0 1
+             126:   14(fvec3) CompositeExtract 122 1
+             127:   19(fvec2) VectorShuffle 126 126 0 1
+             128:   14(fvec3) CompositeExtract 122 2
+             129:   19(fvec2) VectorShuffle 128 128 0 1
+             130:         123 CompositeConstruct 125 127 129
+             131:          16 MatrixTimesMatrix 120 130
+                              Store 118(r31) 131
+             136:    135(ptr) AccessChain 23 134
+             137:          20 Load 136
+             138:   19(fvec2) CompositeExtract 137 0
+             139:   19(fvec2) CompositeExtract 137 1
+             140:   19(fvec2) CompositeExtract 137 2
+             141:         123 CompositeConstruct 138 139 140
+             142:    104(ptr) AccessChain 23 103
+             143:          17 Load 142
+             144:         123 MatrixTimesMatrix 141 143
+                              Store 133(r32) 144
+             147:    104(ptr) AccessChain 23 103
+             148:          17 Load 147
+             149:   14(fvec3) CompositeExtract 148 0
+             150:   14(fvec3) CompositeExtract 148 1
+             151:         100 CompositeConstruct 149 150
+             152:    135(ptr) AccessChain 23 134
+             153:          20 Load 152
+             154:          15 MatrixTimesMatrix 151 153
+                              Store 146(r33) 154
+             155:    7(fvec4) Load 49(r10)
+             156:    7(fvec4) Load 61(r11)
+             157:    7(fvec4) FAdd 155 156
+             158:    7(fvec4) Load 73(r20)
+             159:    7(fvec4) FAdd 157 158
+             160:    7(fvec4) Load 88(r21)
+             161:    7(fvec4) FAdd 159 160
+             162:    6(float) Load 12(r00)
+             163:    7(fvec4) CompositeConstruct 162 162 162 162
+             164:    7(fvec4) FAdd 161 163
+             165:    6(float) Load 37(r01)
+             166:    7(fvec4) CompositeConstruct 165 165 165 165
+             167:    7(fvec4) FAdd 164 166
+             170:     11(ptr) AccessChain 102(r30) 50 169
+             171:    6(float) Load 170
+             172:    7(fvec4) CompositeConstruct 171 171 171 171
+             173:    7(fvec4) FAdd 167 172
+             174:     48(ptr) AccessChain 118(r31) 50
+             175:    7(fvec4) Load 174
+             176:    7(fvec4) FAdd 173 175
+             177:     11(ptr) AccessChain 133(r32) 50 169
+             178:    6(float) Load 177
+             179:    7(fvec4) CompositeConstruct 178 178 178 178
+             180:    7(fvec4) FAdd 176 179
+             181:          15 Load 146(r33)
+             182:          16 Transpose 181
+             183:    7(fvec4) CompositeExtract 182 0
+             184:    7(fvec4) FAdd 180 183
+                              ReturnValue 184
+                              FunctionEnd
diff --git a/Test/baseResults/hlsl.multiDescriptorSet.frag.out b/Test/baseResults/hlsl.multiDescriptorSet.frag.out
new file mode 100644
index 0000000..8bd1ad8
--- /dev/null
+++ b/Test/baseResults/hlsl.multiDescriptorSet.frag.out
@@ -0,0 +1,168 @@
+hlsl.multiDescriptorSet.frag
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 92
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 78 82 86
+                              ExecutionMode 4 OriginUpperLeft
+                              Source HLSL 500
+                              Name 4  "main"
+                              Name 9  "PS_INPUT"
+                              MemberName 9(PS_INPUT) 0  "Pos"
+                              MemberName 9(PS_INPUT) 1  "Tex"
+                              Name 13  "@main(struct-PS_INPUT-vf4-vf21;"
+                              Name 12  "input"
+                              Name 15  "output"
+                              Name 23  "cbChangesEveryFrame"
+                              MemberName 23(cbChangesEveryFrame) 0  "World"
+                              MemberName 23(cbChangesEveryFrame) 1  "vMeshColor"
+                              Name 25  ""
+                              Name 34  "cbNeverChanges"
+                              MemberName 34(cbNeverChanges) 0  "View"
+                              Name 36  ""
+                              Name 43  "cbChangeOnResize"
+                              MemberName 43(cbChangeOnResize) 0  "Projection"
+                              Name 45  ""
+                              Name 59  "txDiffuseA"
+                              Name 63  "samLinearA"
+                              Name 76  "input"
+                              Name 78  "input.Pos"
+                              Name 82  "input.Tex"
+                              Name 86  "@entryPointOutput"
+                              Name 87  "param"
+                              Name 90  "txDiffuseB"
+                              Name 91  "samLinearB"
+                              MemberDecorate 23(cbChangesEveryFrame) 0 RowMajor
+                              MemberDecorate 23(cbChangesEveryFrame) 0 Offset 0
+                              MemberDecorate 23(cbChangesEveryFrame) 0 MatrixStride 16
+                              MemberDecorate 23(cbChangesEveryFrame) 1 Offset 64
+                              Decorate 23(cbChangesEveryFrame) Block
+                              Decorate 25 DescriptorSet 2
+                              Decorate 25 Binding 2
+                              MemberDecorate 34(cbNeverChanges) 0 RowMajor
+                              MemberDecorate 34(cbNeverChanges) 0 Offset 0
+                              MemberDecorate 34(cbNeverChanges) 0 MatrixStride 16
+                              Decorate 34(cbNeverChanges) Block
+                              Decorate 36 DescriptorSet 2
+                              Decorate 36 Binding 0
+                              MemberDecorate 43(cbChangeOnResize) 0 RowMajor
+                              MemberDecorate 43(cbChangeOnResize) 0 Offset 0
+                              MemberDecorate 43(cbChangeOnResize) 0 MatrixStride 16
+                              Decorate 43(cbChangeOnResize) Block
+                              Decorate 45 DescriptorSet 2
+                              Decorate 45 Binding 1
+                              Decorate 59(txDiffuseA) DescriptorSet 0
+                              Decorate 59(txDiffuseA) Binding 0
+                              Decorate 63(samLinearA) DescriptorSet 0
+                              Decorate 63(samLinearA) Binding 1
+                              Decorate 78(input.Pos) BuiltIn FragCoord
+                              Decorate 82(input.Tex) Location 0
+                              Decorate 86(@entryPointOutput) Location 0
+                              Decorate 90(txDiffuseB) DescriptorSet 1
+                              Decorate 90(txDiffuseB) Binding 0
+                              Decorate 91(samLinearB) DescriptorSet 1
+                              Decorate 91(samLinearB) Binding 1
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+               8:             TypeVector 6(float) 2
+     9(PS_INPUT):             TypeStruct 7(fvec4) 8(fvec2)
+              10:             TypePointer Function 9(PS_INPUT)
+              11:             TypeFunction 7(fvec4) 10(ptr)
+              16:    6(float) Constant 0
+              17:    7(fvec4) ConstantComposite 16 16 16 16
+              18:    8(fvec2) ConstantComposite 16 16
+              19: 9(PS_INPUT) ConstantComposite 17 18
+              20:             TypeInt 32 1
+              21:     20(int) Constant 0
+              22:             TypeMatrix 7(fvec4) 4
+23(cbChangesEveryFrame):             TypeStruct 22 7(fvec4)
+              24:             TypePointer Uniform 23(cbChangesEveryFrame)
+              25:     24(ptr) Variable Uniform
+              26:             TypePointer Uniform 22
+              29:             TypePointer Function 7(fvec4)
+34(cbNeverChanges):             TypeStruct 22
+              35:             TypePointer Uniform 34(cbNeverChanges)
+              36:     35(ptr) Variable Uniform
+43(cbChangeOnResize):             TypeStruct 22
+              44:             TypePointer Uniform 43(cbChangeOnResize)
+              45:     44(ptr) Variable Uniform
+              52:     20(int) Constant 1
+              53:             TypePointer Function 8(fvec2)
+              57:             TypeImage 6(float) 2D sampled format:Unknown
+              58:             TypePointer UniformConstant 57
+  59(txDiffuseA):     58(ptr) Variable UniformConstant
+              61:             TypeSampler
+              62:             TypePointer UniformConstant 61
+  63(samLinearA):     62(ptr) Variable UniformConstant
+              65:             TypeSampledImage 57
+              70:             TypePointer Uniform 7(fvec4)
+              77:             TypePointer Input 7(fvec4)
+   78(input.Pos):     77(ptr) Variable Input
+              81:             TypePointer Input 8(fvec2)
+   82(input.Tex):     81(ptr) Variable Input
+              85:             TypePointer Output 7(fvec4)
+86(@entryPointOutput):     85(ptr) Variable Output
+  90(txDiffuseB):     58(ptr) Variable UniformConstant
+  91(samLinearB):     62(ptr) Variable UniformConstant
+         4(main):           2 Function None 3
+               5:             Label
+       76(input):     10(ptr) Variable Function
+       87(param):     10(ptr) Variable Function
+              79:    7(fvec4) Load 78(input.Pos)
+              80:     29(ptr) AccessChain 76(input) 21
+                              Store 80 79
+              83:    8(fvec2) Load 82(input.Tex)
+              84:     53(ptr) AccessChain 76(input) 52
+                              Store 84 83
+              88: 9(PS_INPUT) Load 76(input)
+                              Store 87(param) 88
+              89:    7(fvec4) FunctionCall 13(@main(struct-PS_INPUT-vf4-vf21;) 87(param)
+                              Store 86(@entryPointOutput) 89
+                              Return
+                              FunctionEnd
+13(@main(struct-PS_INPUT-vf4-vf21;):    7(fvec4) Function None 11
+       12(input):     10(ptr) FunctionParameter
+              14:             Label
+      15(output):     10(ptr) Variable Function
+                              Store 15(output) 19
+              27:     26(ptr) AccessChain 25 21
+              28:          22 Load 27
+              30:     29(ptr) AccessChain 12(input) 21
+              31:    7(fvec4) Load 30
+              32:    7(fvec4) MatrixTimesVector 28 31
+              33:     29(ptr) AccessChain 15(output) 21
+                              Store 33 32
+              37:     26(ptr) AccessChain 36 21
+              38:          22 Load 37
+              39:     29(ptr) AccessChain 15(output) 21
+              40:    7(fvec4) Load 39
+              41:    7(fvec4) MatrixTimesVector 38 40
+              42:     29(ptr) AccessChain 15(output) 21
+                              Store 42 41
+              46:     26(ptr) AccessChain 45 21
+              47:          22 Load 46
+              48:     29(ptr) AccessChain 15(output) 21
+              49:    7(fvec4) Load 48
+              50:    7(fvec4) MatrixTimesVector 47 49
+              51:     29(ptr) AccessChain 15(output) 21
+                              Store 51 50
+              54:     53(ptr) AccessChain 12(input) 52
+              55:    8(fvec2) Load 54
+              56:     53(ptr) AccessChain 15(output) 52
+                              Store 56 55
+              60:          57 Load 59(txDiffuseA)
+              64:          61 Load 63(samLinearA)
+              66:          65 SampledImage 60 64
+              67:     53(ptr) AccessChain 15(output) 52
+              68:    8(fvec2) Load 67
+              69:    7(fvec4) ImageSampleImplicitLod 66 68
+              71:     70(ptr) AccessChain 25 52
+              72:    7(fvec4) Load 71
+              73:    7(fvec4) FMul 69 72
+                              ReturnValue 73
+                              FunctionEnd
diff --git a/Test/baseResults/hlsl.multiEntry.vert.out b/Test/baseResults/hlsl.multiEntry.vert.out
old mode 100755
new mode 100644
index 8a309da..1c77118
--- a/Test/baseResults/hlsl.multiEntry.vert.out
+++ b/Test/baseResults/hlsl.multiEntry.vert.out
@@ -70,7 +70,7 @@
 0:?     'Index' ( in uint VertexIndex)
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 41
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.multiReturn.frag.out b/Test/baseResults/hlsl.multiReturn.frag.out
old mode 100755
new mode 100644
index 588645c..695a52c
--- a/Test/baseResults/hlsl.multiReturn.frag.out
+++ b/Test/baseResults/hlsl.multiReturn.frag.out
@@ -48,7 +48,7 @@
 0:?     'anon@0' (layout( row_major std140) uniform block{layout( row_major std140) uniform structure{ temp float f,  temp 3-component vector of float v,  temp 3X3 matrix of float m} s})
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 42
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.namespace.frag.out b/Test/baseResults/hlsl.namespace.frag.out
old mode 100755
new mode 100644
index 82fbb6e..08d959b
--- a/Test/baseResults/hlsl.namespace.frag.out
+++ b/Test/baseResults/hlsl.namespace.frag.out
@@ -101,8 +101,12 @@
 0:?     'N2::gf' ( global float)
 0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
 
+error: SPIRV-Tools Validation Errors
+error: OpFunctionCall Function <id>'s parameter count does not match the argument count.
+  %43 = OpFunctionCall %v4float %N2__N3__C1__getVec_
+
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 54
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.noSemantic.functionality1.comp.out b/Test/baseResults/hlsl.noSemantic.functionality1.comp.out
new file mode 100644
index 0000000..f00fe74
--- /dev/null
+++ b/Test/baseResults/hlsl.noSemantic.functionality1.comp.out
@@ -0,0 +1,62 @@
+hlsl.noSemantic.functionality1.comp
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 30
+
+                              Capability Shader
+                              Extension  "SPV_GOOGLE_hlsl_functionality1"
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint GLCompute 4  "main"
+                              ExecutionMode 4 LocalSize 1 1 1
+                              Source HLSL 500
+                              Name 4  "main"
+                              Name 6  "@main("
+                              Name 11  "Buf"
+                              MemberName 11(Buf) 0  "@data"
+                              Name 13  "Buf"
+                              Name 17  "Buf@count"
+                              MemberName 17(Buf@count) 0  "@count"
+                              Name 19  "Buf@count"
+                              Decorate 10 ArrayStride 16
+                              MemberDecorate 11(Buf) 0 Offset 0
+                              Decorate 11(Buf) BufferBlock
+                              Decorate 13(Buf) DescriptorSet 0
+                              Decorate 13(Buf) Binding 0
+                              MemberDecorate 17(Buf@count) 0 Offset 0
+                              Decorate 17(Buf@count) BufferBlock
+                              Decorate 19(Buf@count) DescriptorSet 0
+                              DecorateId 13(Buf) DecorationHlslCounterBufferGOOGLE 19(Buf@count)
+               2:             TypeVoid
+               3:             TypeFunction 2
+               8:             TypeFloat 32
+               9:             TypeVector 8(float) 4
+              10:             TypeRuntimeArray 9(fvec4)
+         11(Buf):             TypeStruct 10
+              12:             TypePointer Uniform 11(Buf)
+         13(Buf):     12(ptr) Variable Uniform
+              14:             TypeInt 32 1
+              15:     14(int) Constant 0
+              16:             TypeInt 32 0
+   17(Buf@count):             TypeStruct 16(int)
+              18:             TypePointer Uniform 17(Buf@count)
+   19(Buf@count):     18(ptr) Variable Uniform
+              20:             TypePointer Uniform 16(int)
+              22:     16(int) Constant 1
+              23:     16(int) Constant 0
+              25:    8(float) Constant 1065353216
+              26:    9(fvec4) ConstantComposite 25 25 25 25
+              27:             TypePointer Uniform 9(fvec4)
+         4(main):           2 Function None 3
+               5:             Label
+              29:           2 FunctionCall 6(@main()
+                              Return
+                              FunctionEnd
+       6(@main():           2 Function None 3
+               7:             Label
+              21:     20(ptr) AccessChain 19(Buf@count) 15
+              24:     16(int) AtomicIAdd 21 22 23 22
+              28:     27(ptr) AccessChain 13(Buf) 15 24
+                              Store 28 26
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/hlsl.nonint-index.frag.out b/Test/baseResults/hlsl.nonint-index.frag.out
index 3684cf3..131c1ec 100644
--- a/Test/baseResults/hlsl.nonint-index.frag.out
+++ b/Test/baseResults/hlsl.nonint-index.frag.out
@@ -88,7 +88,7 @@
 0:?     'input' (layout( location=0) in float)
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 39
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.nonstaticMemberFunction.frag.out b/Test/baseResults/hlsl.nonstaticMemberFunction.frag.out
old mode 100755
new mode 100644
index 27326c6..1927a4c
--- a/Test/baseResults/hlsl.nonstaticMemberFunction.frag.out
+++ b/Test/baseResults/hlsl.nonstaticMemberFunction.frag.out
@@ -268,7 +268,7 @@
 0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 111
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.numericsuffixes.frag.out b/Test/baseResults/hlsl.numericsuffixes.frag.out
index ee25cb3..b1fa856 100644
--- a/Test/baseResults/hlsl.numericsuffixes.frag.out
+++ b/Test/baseResults/hlsl.numericsuffixes.frag.out
@@ -85,13 +85,13 @@
 0:?     Sequence
 0:5      Sequence
 0:5        move second child to first child ( temp 4-component vector of float)
-0:?           'color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.color' (layout( location=0) out 4-component vector of float)
 0:5          color: direct index for structure ( temp 4-component vector of float)
 0:5            Function Call: @main( ( temp structure{ temp 4-component vector of float color})
 0:5            Constant:
 0:5              0 (const int)
 0:?   Linker Objects
-0:?     'color' (layout( location=0) out 4-component vector of float)
+0:?     '@entryPointOutput.color' (layout( location=0) out 4-component vector of float)
 
 
 Linked fragment stage:
@@ -183,16 +183,16 @@
 0:?     Sequence
 0:5      Sequence
 0:5        move second child to first child ( temp 4-component vector of float)
-0:?           'color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.color' (layout( location=0) out 4-component vector of float)
 0:5          color: direct index for structure ( temp 4-component vector of float)
 0:5            Function Call: @main( ( temp structure{ temp 4-component vector of float color})
 0:5            Constant:
 0:5              0 (const int)
 0:?   Linker Objects
-0:?     'color' (layout( location=0) out 4-component vector of float)
+0:?     '@entryPointOutput.color' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 54
 
                               Capability Shader
@@ -219,8 +219,8 @@
                               Name 36  "r11"
                               Name 38  "r12"
                               Name 40  "ps_output"
-                              Name 51  "color"
-                              Decorate 51(color) Location 0
+                              Name 51  "@entryPointOutput.color"
+                              Decorate 51(@entryPointOutput.color) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -245,12 +245,12 @@
               41:     24(int) Constant 0
               45:             TypePointer Function 7(fvec4)
               50:             TypePointer Output 7(fvec4)
-       51(color):     50(ptr) Variable Output
+51(@entryPointOutput.color):     50(ptr) Variable Output
          4(main):           2 Function None 3
                5:             Label
               52:8(PS_OUTPUT) FunctionCall 10(@main()
               53:    7(fvec4) CompositeExtract 52 0
-                              Store 51(color) 53
+                              Store 51(@entryPointOutput.color) 53
                               Return
                               FunctionEnd
       10(@main():8(PS_OUTPUT) Function None 9
diff --git a/Test/baseResults/hlsl.numthreads.comp.out b/Test/baseResults/hlsl.numthreads.comp.out
index fc1345f..fd7de34 100644
--- a/Test/baseResults/hlsl.numthreads.comp.out
+++ b/Test/baseResults/hlsl.numthreads.comp.out
@@ -1,20 +1,20 @@
 hlsl.numthreads.comp
 Shader version: 500
-local_size = (4, 4, 2)
+local_size = (1, 4, 8)
 0:? Sequence
 0:4  Function Definition: main(vu3; ( temp void)
 0:4    Function Parameters: 
 0:4      'tid' ( in 3-component vector of uint)
-0:9  Function Definition: @main_aux1(vu3; ( temp void)
+0:9  Function Definition: @main_aux2(vu3; ( temp void)
 0:9    Function Parameters: 
 0:9      'tid' ( in 3-component vector of uint)
-0:9  Function Definition: main_aux1( ( temp void)
+0:9  Function Definition: main_aux2( ( temp void)
 0:9    Function Parameters: 
 0:?     Sequence
 0:9      move second child to first child ( temp 3-component vector of uint)
 0:?         'tid' ( temp 3-component vector of uint)
 0:?         'tid' ( in 3-component vector of uint GlobalInvocationID)
-0:9      Function Call: @main_aux1(vu3; ( temp void)
+0:9      Function Call: @main_aux2(vu3; ( temp void)
 0:?         'tid' ( temp 3-component vector of uint)
 0:?   Linker Objects
 0:?     'tid' ( in 3-component vector of uint GlobalInvocationID)
@@ -24,39 +24,39 @@
 
 
 Shader version: 500
-local_size = (4, 4, 2)
+local_size = (1, 4, 8)
 0:? Sequence
 0:4  Function Definition: main(vu3; ( temp void)
 0:4    Function Parameters: 
 0:4      'tid' ( in 3-component vector of uint)
-0:9  Function Definition: @main_aux1(vu3; ( temp void)
+0:9  Function Definition: @main_aux2(vu3; ( temp void)
 0:9    Function Parameters: 
 0:9      'tid' ( in 3-component vector of uint)
-0:9  Function Definition: main_aux1( ( temp void)
+0:9  Function Definition: main_aux2( ( temp void)
 0:9    Function Parameters: 
 0:?     Sequence
 0:9      move second child to first child ( temp 3-component vector of uint)
 0:?         'tid' ( temp 3-component vector of uint)
 0:?         'tid' ( in 3-component vector of uint GlobalInvocationID)
-0:9      Function Call: @main_aux1(vu3; ( temp void)
+0:9      Function Call: @main_aux2(vu3; ( temp void)
 0:?         'tid' ( temp 3-component vector of uint)
 0:?   Linker Objects
 0:?     'tid' ( in 3-component vector of uint GlobalInvocationID)
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 23
 
                               Capability Shader
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint GLCompute 4  "main_aux1" 18
-                              ExecutionMode 4 LocalSize 4 4 2
+                              EntryPoint GLCompute 4  "main_aux2" 18
+                              ExecutionMode 4 LocalSize 1 4 8
                               Source HLSL 500
-                              Name 4  "main_aux1"
+                              Name 4  "main_aux2"
                               Name 11  "main(vu3;"
                               Name 10  "tid"
-                              Name 14  "@main_aux1(vu3;"
+                              Name 14  "@main_aux2(vu3;"
                               Name 13  "tid"
                               Name 16  "tid"
                               Name 18  "tid"
@@ -70,7 +70,7 @@
                9:             TypeFunction 2 8(ptr)
               17:             TypePointer Input 7(ivec3)
          18(tid):     17(ptr) Variable Input
-    4(main_aux1):           2 Function None 3
+    4(main_aux2):           2 Function None 3
                5:             Label
          16(tid):      8(ptr) Variable Function
        20(param):      8(ptr) Variable Function
@@ -78,7 +78,7 @@
                               Store 16(tid) 19
               21:    7(ivec3) Load 16(tid)
                               Store 20(param) 21
-              22:           2 FunctionCall 14(@main_aux1(vu3;) 20(param)
+              22:           2 FunctionCall 14(@main_aux2(vu3;) 20(param)
                               Return
                               FunctionEnd
    11(main(vu3;):           2 Function None 9
@@ -86,7 +86,7 @@
               12:             Label
                               Return
                               FunctionEnd
-14(@main_aux1(vu3;):           2 Function None 9
+14(@main_aux2(vu3;):           2 Function None 9
          13(tid):      8(ptr) FunctionParameter
               15:             Label
                               Return
diff --git a/Test/baseResults/hlsl.opaque-type-bug.frag.out b/Test/baseResults/hlsl.opaque-type-bug.frag.out
new file mode 100644
index 0000000..918b462
--- /dev/null
+++ b/Test/baseResults/hlsl.opaque-type-bug.frag.out
@@ -0,0 +1,112 @@
+hlsl.opaque-type-bug.frag
+Shader version: 500
+gl_FragCoord origin is upper left
+0:? Sequence
+0:6  Function Definition: TexFunc(t21;vf3; ( temp void)
+0:6    Function Parameters: 
+0:6      't2D' ( const (read only) texture2D)
+0:6      'RGB' ( out 3-component vector of float)
+0:?     Sequence
+0:7      move second child to first child ( temp 3-component vector of float)
+0:7        'RGB' ( out 3-component vector of float)
+0:7        Constant:
+0:7          0.000000
+0:7          0.000000
+0:7          0.000000
+0:12  Function Definition: @main( ( temp void)
+0:12    Function Parameters: 
+0:?     Sequence
+0:15      Function Call: TexFunc(t21;vf3; ( temp void)
+0:15        'MyTexture' (layout( binding=0) uniform texture2D)
+0:15        'final_RGB' ( temp 3-component vector of float)
+0:12  Function Definition: main( ( temp void)
+0:12    Function Parameters: 
+0:?     Sequence
+0:12      Function Call: @main( ( temp void)
+0:?   Linker Objects
+0:?     'MyTexture' (layout( binding=0) uniform texture2D)
+
+
+Linked fragment stage:
+
+
+Shader version: 500
+gl_FragCoord origin is upper left
+0:? Sequence
+0:6  Function Definition: TexFunc(t21;vf3; ( temp void)
+0:6    Function Parameters: 
+0:6      't2D' ( const (read only) texture2D)
+0:6      'RGB' ( out 3-component vector of float)
+0:?     Sequence
+0:7      move second child to first child ( temp 3-component vector of float)
+0:7        'RGB' ( out 3-component vector of float)
+0:7        Constant:
+0:7          0.000000
+0:7          0.000000
+0:7          0.000000
+0:12  Function Definition: @main( ( temp void)
+0:12    Function Parameters: 
+0:?     Sequence
+0:15      Function Call: TexFunc(t21;vf3; ( temp void)
+0:15        'MyTexture' (layout( binding=0) uniform texture2D)
+0:15        'final_RGB' ( temp 3-component vector of float)
+0:12  Function Definition: main( ( temp void)
+0:12    Function Parameters: 
+0:?     Sequence
+0:12      Function Call: @main( ( temp void)
+0:?   Linker Objects
+0:?     'MyTexture' (layout( binding=0) uniform texture2D)
+
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 27
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main"
+                              ExecutionMode 4 OriginUpperLeft
+                              Source HLSL 500
+                              Name 4  "main"
+                              Name 13  "TexFunc(t21;vf3;"
+                              Name 11  "t2D"
+                              Name 12  "RGB"
+                              Name 15  "@main("
+                              Name 20  "MyTexture"
+                              Name 22  "final_RGB"
+                              Name 23  "param"
+                              Decorate 20(MyTexture) DescriptorSet 0
+                              Decorate 20(MyTexture) Binding 0
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeImage 6(float) 2D sampled format:Unknown
+               8:             TypeVector 6(float) 3
+               9:             TypePointer Function 8(fvec3)
+              10:             TypeFunction 2 7 9(ptr)
+              17:    6(float) Constant 0
+              18:    8(fvec3) ConstantComposite 17 17 17
+              19:             TypePointer UniformConstant 7
+   20(MyTexture):     19(ptr) Variable UniformConstant
+         4(main):           2 Function None 3
+               5:             Label
+              26:           2 FunctionCall 15(@main()
+                              Return
+                              FunctionEnd
+13(TexFunc(t21;vf3;):           2 Function None 10
+         11(t2D):           7 FunctionParameter
+         12(RGB):      9(ptr) FunctionParameter
+              14:             Label
+                              Store 12(RGB) 18
+                              Return
+                              FunctionEnd
+      15(@main():           2 Function None 3
+              16:             Label
+   22(final_RGB):      9(ptr) Variable Function
+       23(param):      9(ptr) Variable Function
+              21:           7 Load 20(MyTexture)
+              24:           2 FunctionCall 13(TexFunc(t21;vf3;) 21 23(param)
+              25:    8(fvec3) Load 23(param)
+                              Store 22(final_RGB) 25
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/hlsl.overload.frag.out b/Test/baseResults/hlsl.overload.frag.out
old mode 100755
new mode 100644
index b390526..5960d3d
--- a/Test/baseResults/hlsl.overload.frag.out
+++ b/Test/baseResults/hlsl.overload.frag.out
@@ -734,7 +734,7 @@
 0:?     'input' (layout( location=0) in 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 520
 
                               Capability Shader
@@ -937,7 +937,7 @@
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 64
-               7:             TypePointer Function 6(float)
+               7:             TypePointer Function 6(float64_t)
                8:             TypeBool
                9:             TypePointer Function 8(bool)
               10:             TypeFunction 2 7(ptr) 9(ptr)
@@ -967,8 +967,8 @@
              113:             TypeVector 22(int) 3
              114:             TypePointer Function 113(ivec3)
              115:             TypeFunction 2 114(ptr)
-             125:             TypeVector 6(float) 3
-             126:             TypePointer Function 125(fvec3)
+             125:             TypeVector 6(float64_t) 3
+             126:             TypePointer Function 125(f64vec3)
              127:             TypeFunction 2 126(ptr)
              134:             TypeVector 15(int) 2
              135:             TypePointer Function 134(ivec2)
@@ -976,14 +976,14 @@
              149:             TypeVector 29(float) 4
              150:             TypePointer Function 149(fvec4)
              151:             TypeFunction 149(fvec4) 150(ptr)
-             334:    6(float) Constant 0 0
+             334:6(float64_t) Constant 0 0
              339:     15(int) Constant 0
              348:   29(float) Constant 0
              353:     15(int) Constant 1
              373:     22(int) Constant 0
              374:     22(int) Constant 1
              394:   29(float) Constant 1065353216
-             414:    6(float) Constant 0 1072693248
+             414:6(float64_t) Constant 0 1072693248
              484:             TypeVector 22(int) 2
              494:             TypeVector 22(int) 4
              503:             TypeVector 8(bool) 3
@@ -1283,117 +1283,117 @@
       497(param):     23(ptr) Variable Function
       500(param):      9(ptr) Variable Function
       506(param):      9(ptr) Variable Function
-             158:    6(float) Load 155(d)
+             158:6(float64_t) Load 155(d)
                               Store 157(param) 158
              160:     8(bool) Load 156(b)
                               Store 159(param) 160
              161:           2 FunctionCall 13(foo1(d1;b1;) 157(param) 159(param)
-             163:    6(float) Load 155(d)
+             163:6(float64_t) Load 155(d)
                               Store 162(param) 163
-             165:    6(float) Load 155(d)
+             165:6(float64_t) Load 155(d)
                               Store 164(param) 165
              166:           2 FunctionCall 39(foo1(d1;d1;) 162(param) 164(param)
-             169:    6(float) Load 155(d)
+             169:6(float64_t) Load 155(d)
                               Store 168(param) 169
              171:     15(int) Load 167(u)
                               Store 170(param) 171
              172:           2 FunctionCall 20(foo1(d1;u1;) 168(param) 170(param)
-             175:    6(float) Load 155(d)
+             175:6(float64_t) Load 155(d)
                               Store 174(param) 175
              177:     22(int) Load 173(i)
                               Store 176(param) 177
              178:           2 FunctionCall 27(foo1(d1;i1;) 174(param) 176(param)
-             181:    6(float) Load 155(d)
+             181:6(float64_t) Load 155(d)
                               Store 180(param) 181
              183:   29(float) Load 179(f)
                               Store 182(param) 183
              184:           2 FunctionCall 34(foo1(d1;f1;) 180(param) 182(param)
              185:   29(float) Load 179(f)
-             186:    6(float) FConvert 185
+             186:6(float64_t) FConvert 185
                               Store 187(param) 186
              189:     8(bool) Load 156(b)
                               Store 188(param) 189
              190:           2 FunctionCall 13(foo1(d1;b1;) 187(param) 188(param)
              191:   29(float) Load 179(f)
-             192:    6(float) FConvert 191
+             192:6(float64_t) FConvert 191
                               Store 193(param) 192
-             195:    6(float) Load 155(d)
+             195:6(float64_t) Load 155(d)
                               Store 194(param) 195
              196:           2 FunctionCall 39(foo1(d1;d1;) 193(param) 194(param)
              197:   29(float) Load 179(f)
-             198:    6(float) FConvert 197
+             198:6(float64_t) FConvert 197
                               Store 199(param) 198
              201:     15(int) Load 167(u)
                               Store 200(param) 201
              202:           2 FunctionCall 20(foo1(d1;u1;) 199(param) 200(param)
              203:   29(float) Load 179(f)
-             204:    6(float) FConvert 203
+             204:6(float64_t) FConvert 203
                               Store 205(param) 204
              207:     22(int) Load 173(i)
                               Store 206(param) 207
              208:           2 FunctionCall 27(foo1(d1;i1;) 205(param) 206(param)
              209:   29(float) Load 179(f)
-             210:    6(float) FConvert 209
+             210:6(float64_t) FConvert 209
                               Store 211(param) 210
              213:   29(float) Load 179(f)
                               Store 212(param) 213
              214:           2 FunctionCall 34(foo1(d1;f1;) 211(param) 212(param)
              215:     15(int) Load 167(u)
-             216:    6(float) ConvertUToF 215
+             216:6(float64_t) ConvertUToF 215
                               Store 217(param) 216
              219:     8(bool) Load 156(b)
                               Store 218(param) 219
              220:           2 FunctionCall 13(foo1(d1;b1;) 217(param) 218(param)
              221:     15(int) Load 167(u)
-             222:    6(float) ConvertUToF 221
+             222:6(float64_t) ConvertUToF 221
                               Store 223(param) 222
-             225:    6(float) Load 155(d)
+             225:6(float64_t) Load 155(d)
                               Store 224(param) 225
              226:           2 FunctionCall 39(foo1(d1;d1;) 223(param) 224(param)
              227:     15(int) Load 167(u)
-             228:    6(float) ConvertUToF 227
+             228:6(float64_t) ConvertUToF 227
                               Store 229(param) 228
              231:     15(int) Load 167(u)
                               Store 230(param) 231
              232:           2 FunctionCall 20(foo1(d1;u1;) 229(param) 230(param)
              233:     15(int) Load 167(u)
-             234:    6(float) ConvertUToF 233
+             234:6(float64_t) ConvertUToF 233
                               Store 235(param) 234
              237:     22(int) Load 173(i)
                               Store 236(param) 237
              238:           2 FunctionCall 27(foo1(d1;i1;) 235(param) 236(param)
              239:     15(int) Load 167(u)
-             240:    6(float) ConvertUToF 239
+             240:6(float64_t) ConvertUToF 239
                               Store 241(param) 240
              243:   29(float) Load 179(f)
                               Store 242(param) 243
              244:           2 FunctionCall 34(foo1(d1;f1;) 241(param) 242(param)
              245:     22(int) Load 173(i)
-             246:    6(float) ConvertSToF 245
+             246:6(float64_t) ConvertSToF 245
                               Store 247(param) 246
              249:     8(bool) Load 156(b)
                               Store 248(param) 249
              250:           2 FunctionCall 13(foo1(d1;b1;) 247(param) 248(param)
              251:     22(int) Load 173(i)
-             252:    6(float) ConvertSToF 251
+             252:6(float64_t) ConvertSToF 251
                               Store 253(param) 252
-             255:    6(float) Load 155(d)
+             255:6(float64_t) Load 155(d)
                               Store 254(param) 255
              256:           2 FunctionCall 39(foo1(d1;d1;) 253(param) 254(param)
              257:     22(int) Load 173(i)
-             258:    6(float) ConvertSToF 257
+             258:6(float64_t) ConvertSToF 257
                               Store 259(param) 258
              261:     15(int) Load 167(u)
                               Store 260(param) 261
              262:           2 FunctionCall 20(foo1(d1;u1;) 259(param) 260(param)
              263:     22(int) Load 173(i)
-             264:    6(float) ConvertSToF 263
+             264:6(float64_t) ConvertSToF 263
                               Store 265(param) 264
              267:     22(int) Load 173(i)
                               Store 266(param) 267
              268:           2 FunctionCall 27(foo1(d1;i1;) 265(param) 266(param)
              269:     22(int) Load 173(i)
-             270:    6(float) ConvertSToF 269
+             270:6(float64_t) ConvertSToF 269
                               Store 271(param) 270
              273:   29(float) Load 179(f)
                               Store 272(param) 273
@@ -1407,7 +1407,7 @@
              281:     15(int) Load 167(u)
              282:     22(int) Bitcast 281
                               Store 283(param) 282
-             285:    6(float) Load 155(d)
+             285:6(float64_t) Load 155(d)
                               Store 284(param) 285
              286:           2 FunctionCall 64(foo2(i1;d1;) 283(param) 284(param)
              287:     15(int) Load 167(u)
@@ -1435,7 +1435,7 @@
              309:           2 FunctionCall 44(foo2(i1;b1;) 305(param) 307(param)
              311:     22(int) Load 173(i)
                               Store 310(param) 311
-             313:    6(float) Load 155(d)
+             313:6(float64_t) Load 155(d)
                               Store 312(param) 313
              314:           2 FunctionCall 64(foo2(i1;d1;) 310(param) 312(param)
              316:     22(int) Load 173(i)
@@ -1456,7 +1456,7 @@
              331:     8(bool) Load 156(b)
                               Store 330(param) 331
              332:           2 FunctionCall 68(foo3(b1;) 330(param)
-             333:    6(float) Load 155(d)
+             333:6(float64_t) Load 155(d)
              335:     8(bool) FOrdNotEqual 333 334
                               Store 336(param) 335
              337:           2 FunctionCall 68(foo3(b1;) 336(param)
@@ -1476,7 +1476,7 @@
              354:     15(int) Select 352 353 339
                               Store 355(param) 354
              356:           2 FunctionCall 72(foo4(u1;) 355(param)
-             357:    6(float) Load 155(d)
+             357:6(float64_t) Load 155(d)
              358:     15(int) ConvertFToU 357
                               Store 359(param) 358
              360:           2 FunctionCall 72(foo4(u1;) 359(param)
@@ -1495,7 +1495,7 @@
              375:     22(int) Select 372 374 373
                               Store 376(param) 375
              377:           2 FunctionCall 76(foo5(i1;) 376(param)
-             378:    6(float) Load 155(d)
+             378:6(float64_t) Load 155(d)
              379:     22(int) ConvertFToS 378
                               Store 380(param) 379
              381:           2 FunctionCall 76(foo5(i1;) 380(param)
@@ -1514,7 +1514,7 @@
              395:   29(float) Select 393 394 348
                               Store 396(param) 395
              397:           2 FunctionCall 80(foo6(f1;) 396(param)
-             398:    6(float) Load 155(d)
+             398:6(float64_t) Load 155(d)
              399:   29(float) FConvert 398
                               Store 400(param) 399
              401:           2 FunctionCall 80(foo6(f1;) 400(param)
@@ -1530,22 +1530,22 @@
                               Store 410(param) 411
              412:           2 FunctionCall 80(foo6(f1;) 410(param)
              413:     8(bool) Load 156(b)
-             415:    6(float) Select 413 414 334
+             415:6(float64_t) Select 413 414 334
                               Store 416(param) 415
              417:           2 FunctionCall 84(foo7(d1;) 416(param)
-             419:    6(float) Load 155(d)
+             419:6(float64_t) Load 155(d)
                               Store 418(param) 419
              420:           2 FunctionCall 84(foo7(d1;) 418(param)
              421:     15(int) Load 167(u)
-             422:    6(float) ConvertUToF 421
+             422:6(float64_t) ConvertUToF 421
                               Store 423(param) 422
              424:           2 FunctionCall 84(foo7(d1;) 423(param)
              425:     22(int) Load 173(i)
-             426:    6(float) ConvertSToF 425
+             426:6(float64_t) ConvertSToF 425
                               Store 427(param) 426
              428:           2 FunctionCall 84(foo7(d1;) 427(param)
              429:   29(float) Load 179(f)
-             430:    6(float) FConvert 429
+             430:6(float64_t) FConvert 429
                               Store 431(param) 430
              432:           2 FunctionCall 84(foo7(d1;) 431(param)
              433:     8(bool) Load 156(b)
@@ -1568,7 +1568,7 @@
              450:     15(int) ConvertFToU 449
                               Store 451(param) 450
              452:           2 FunctionCall 96(foo9(u1;) 451(param)
-             453:    6(float) Load 155(d)
+             453:6(float64_t) Load 155(d)
              454:     15(int) ConvertFToU 453
                               Store 455(param) 454
              456:           2 FunctionCall 96(foo9(u1;) 455(param)
@@ -1580,7 +1580,7 @@
              462:     22(int) ConvertFToS 461
                               Store 463(param) 462
              464:           2 FunctionCall 102(foo10(i1;) 463(param)
-             465:    6(float) Load 155(d)
+             465:6(float64_t) Load 155(d)
              466:     22(int) ConvertFToS 465
                               Store 467(param) 466
              468:           2 FunctionCall 102(foo10(i1;) 467(param)
@@ -1589,12 +1589,12 @@
                               Store 471(param) 470
              472:           2 FunctionCall 120(foo11(u1;) 471(param)
              473:   29(float) Load 179(f)
-             474:    6(float) FConvert 473
+             474:6(float64_t) FConvert 473
                               Store 475(param) 474
              476:           2 FunctionCall 111(foo11(d1;) 475(param)
              477:   29(float) Load 179(f)
              478:  104(fvec3) CompositeConstruct 477 477 477
-             479:  125(fvec3) FConvert 478
+             479:125(f64vec3) FConvert 478
                               Store 480(param) 479
              481:           2 FunctionCall 129(foo12(vd3;) 480(param)
              482:     22(int) Load 173(i)
diff --git a/Test/baseResults/hlsl.params.default.frag.out b/Test/baseResults/hlsl.params.default.frag.out
index 3643c23..c98e0c6 100644
--- a/Test/baseResults/hlsl.params.default.frag.out
+++ b/Test/baseResults/hlsl.params.default.frag.out
@@ -376,7 +376,7 @@
 0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of int)
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 178
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.partialFlattenLocal.vert.out b/Test/baseResults/hlsl.partialFlattenLocal.vert.out
new file mode 100644
index 0000000..9524118
--- /dev/null
+++ b/Test/baseResults/hlsl.partialFlattenLocal.vert.out
@@ -0,0 +1,375 @@
+hlsl.partialFlattenLocal.vert
+WARNING: AST will form illegal SPIR-V; need to transform to legalize
+Shader version: 500
+0:? Sequence
+0:12  Function Definition: @main(vf4; ( temp 4-component vector of float)
+0:12    Function Parameters: 
+0:12      'pos' ( in 4-component vector of float)
+0:?     Sequence
+0:14      move second child to first child ( temp texture2D)
+0:14        tex: direct index for structure ( temp texture2D)
+0:14          'packed' ( temp structure{ temp texture2D tex,  temp 3-element array of 3-component vector of float pos,  temp 2-element array of 2-component vector of float uv,  temp float x,  temp int n})
+0:14          Constant:
+0:14            0 (const int)
+0:14        'tex' ( uniform texture2D)
+0:15      move second child to first child ( temp 3-component vector of float)
+0:15        direct index ( temp 3-component vector of float)
+0:15          pos: direct index for structure ( temp 3-element array of 3-component vector of float)
+0:15            'packed' ( temp structure{ temp texture2D tex,  temp 3-element array of 3-component vector of float pos,  temp 2-element array of 2-component vector of float uv,  temp float x,  temp int n})
+0:15            Constant:
+0:15              1 (const int)
+0:15          Constant:
+0:15            0 (const int)
+0:?         Constant:
+0:?           0.000000
+0:?           0.000000
+0:?           0.000000
+0:16      move second child to first child ( temp 2-component vector of float)
+0:16        direct index ( temp 2-component vector of float)
+0:16          uv: direct index for structure ( temp 2-element array of 2-component vector of float)
+0:16            'packed' ( temp structure{ temp texture2D tex,  temp 3-element array of 3-component vector of float pos,  temp 2-element array of 2-component vector of float uv,  temp float x,  temp int n})
+0:16            Constant:
+0:16              2 (const int)
+0:16          Constant:
+0:16            0 (const int)
+0:?         Constant:
+0:?           0.000000
+0:?           1.000000
+0:17      move second child to first child ( temp float)
+0:17        x: direct index for structure ( temp float)
+0:17          'packed' ( temp structure{ temp texture2D tex,  temp 3-element array of 3-component vector of float pos,  temp 2-element array of 2-component vector of float uv,  temp float x,  temp int n})
+0:17          Constant:
+0:17            3 (const int)
+0:17        Constant:
+0:17          1.000000
+0:18      move second child to first child ( temp int)
+0:18        n: direct index for structure ( temp int)
+0:18          'packed' ( temp structure{ temp texture2D tex,  temp 3-element array of 3-component vector of float pos,  temp 2-element array of 2-component vector of float uv,  temp float x,  temp int n})
+0:18          Constant:
+0:18            4 (const int)
+0:18        Constant:
+0:18          3 (const int)
+0:20      Sequence
+0:20        move second child to first child ( temp int)
+0:20          'i' ( temp int)
+0:20          Constant:
+0:20            0 (const int)
+0:20        Loop with condition tested first
+0:20          Loop Condition
+0:20          Compare Less Than ( temp bool)
+0:20            'i' ( temp int)
+0:20            Constant:
+0:20              1 (const int)
+0:20          Loop Body
+0:?           Sequence
+0:21            add second child into first child ( temp 2-component vector of float)
+0:21              vector swizzle ( temp 2-component vector of float)
+0:21                indirect index ( temp 3-component vector of float)
+0:21                  pos: direct index for structure ( temp 3-element array of 3-component vector of float)
+0:21                    'packed' ( temp structure{ temp texture2D tex,  temp 3-element array of 3-component vector of float pos,  temp 2-element array of 2-component vector of float uv,  temp float x,  temp int n})
+0:21                    Constant:
+0:21                      1 (const int)
+0:21                  'i' ( temp int)
+0:21                Sequence
+0:21                  Constant:
+0:21                    0 (const int)
+0:21                  Constant:
+0:21                    1 (const int)
+0:21              indirect index ( temp 2-component vector of float)
+0:21                uv: direct index for structure ( temp 2-element array of 2-component vector of float)
+0:21                  'packed' ( temp structure{ temp texture2D tex,  temp 3-element array of 3-component vector of float pos,  temp 2-element array of 2-component vector of float uv,  temp float x,  temp int n})
+0:21                  Constant:
+0:21                    2 (const int)
+0:21                'i' ( temp int)
+0:20          Loop Terminal Expression
+0:20          Pre-Increment ( temp int)
+0:20            'i' ( temp int)
+0:24      Sequence
+0:24        move second child to first child ( temp structure{ temp texture2D tex,  temp 3-element array of 3-component vector of float pos,  temp 2-element array of 2-component vector of float uv,  temp float x,  temp int n})
+0:24          'packed2' ( temp structure{ temp texture2D tex,  temp 3-element array of 3-component vector of float pos,  temp 2-element array of 2-component vector of float uv,  temp float x,  temp int n})
+0:24          'packed' ( temp structure{ temp texture2D tex,  temp 3-element array of 3-component vector of float pos,  temp 2-element array of 2-component vector of float uv,  temp float x,  temp int n})
+0:26      Branch: Return with expression
+0:26        add ( temp 4-component vector of float)
+0:26          'pos' ( in 4-component vector of float)
+0:?           Construct vec4 ( temp 4-component vector of float)
+0:26            direct index ( temp 3-component vector of float)
+0:26              pos: direct index for structure ( temp 3-element array of 3-component vector of float)
+0:26                'packed2' ( temp structure{ temp texture2D tex,  temp 3-element array of 3-component vector of float pos,  temp 2-element array of 2-component vector of float uv,  temp float x,  temp int n})
+0:26                Constant:
+0:26                  1 (const int)
+0:26              Constant:
+0:26                0 (const int)
+0:26            Constant:
+0:26              0.000000
+0:12  Function Definition: main( ( temp void)
+0:12    Function Parameters: 
+0:?     Sequence
+0:12      move second child to first child ( temp 4-component vector of float)
+0:?         'pos' ( temp 4-component vector of float)
+0:?         'pos' (layout( location=0) in 4-component vector of float)
+0:12      move second child to first child ( temp 4-component vector of float)
+0:?         '@entryPointOutput' ( out 4-component vector of float Position)
+0:12        Function Call: @main(vf4; ( temp 4-component vector of float)
+0:?           'pos' ( temp 4-component vector of float)
+0:?   Linker Objects
+0:?     'tex' ( uniform texture2D)
+0:?     '@entryPointOutput' ( out 4-component vector of float Position)
+0:?     'pos' (layout( location=0) in 4-component vector of float)
+
+
+Linked vertex stage:
+
+
+Shader version: 500
+0:? Sequence
+0:12  Function Definition: @main(vf4; ( temp 4-component vector of float)
+0:12    Function Parameters: 
+0:12      'pos' ( in 4-component vector of float)
+0:?     Sequence
+0:14      move second child to first child ( temp texture2D)
+0:14        tex: direct index for structure ( temp texture2D)
+0:14          'packed' ( temp structure{ temp texture2D tex,  temp 3-element array of 3-component vector of float pos,  temp 2-element array of 2-component vector of float uv,  temp float x,  temp int n})
+0:14          Constant:
+0:14            0 (const int)
+0:14        'tex' ( uniform texture2D)
+0:15      move second child to first child ( temp 3-component vector of float)
+0:15        direct index ( temp 3-component vector of float)
+0:15          pos: direct index for structure ( temp 3-element array of 3-component vector of float)
+0:15            'packed' ( temp structure{ temp texture2D tex,  temp 3-element array of 3-component vector of float pos,  temp 2-element array of 2-component vector of float uv,  temp float x,  temp int n})
+0:15            Constant:
+0:15              1 (const int)
+0:15          Constant:
+0:15            0 (const int)
+0:?         Constant:
+0:?           0.000000
+0:?           0.000000
+0:?           0.000000
+0:16      move second child to first child ( temp 2-component vector of float)
+0:16        direct index ( temp 2-component vector of float)
+0:16          uv: direct index for structure ( temp 2-element array of 2-component vector of float)
+0:16            'packed' ( temp structure{ temp texture2D tex,  temp 3-element array of 3-component vector of float pos,  temp 2-element array of 2-component vector of float uv,  temp float x,  temp int n})
+0:16            Constant:
+0:16              2 (const int)
+0:16          Constant:
+0:16            0 (const int)
+0:?         Constant:
+0:?           0.000000
+0:?           1.000000
+0:17      move second child to first child ( temp float)
+0:17        x: direct index for structure ( temp float)
+0:17          'packed' ( temp structure{ temp texture2D tex,  temp 3-element array of 3-component vector of float pos,  temp 2-element array of 2-component vector of float uv,  temp float x,  temp int n})
+0:17          Constant:
+0:17            3 (const int)
+0:17        Constant:
+0:17          1.000000
+0:18      move second child to first child ( temp int)
+0:18        n: direct index for structure ( temp int)
+0:18          'packed' ( temp structure{ temp texture2D tex,  temp 3-element array of 3-component vector of float pos,  temp 2-element array of 2-component vector of float uv,  temp float x,  temp int n})
+0:18          Constant:
+0:18            4 (const int)
+0:18        Constant:
+0:18          3 (const int)
+0:20      Sequence
+0:20        move second child to first child ( temp int)
+0:20          'i' ( temp int)
+0:20          Constant:
+0:20            0 (const int)
+0:20        Loop with condition tested first
+0:20          Loop Condition
+0:20          Compare Less Than ( temp bool)
+0:20            'i' ( temp int)
+0:20            Constant:
+0:20              1 (const int)
+0:20          Loop Body
+0:?           Sequence
+0:21            add second child into first child ( temp 2-component vector of float)
+0:21              vector swizzle ( temp 2-component vector of float)
+0:21                indirect index ( temp 3-component vector of float)
+0:21                  pos: direct index for structure ( temp 3-element array of 3-component vector of float)
+0:21                    'packed' ( temp structure{ temp texture2D tex,  temp 3-element array of 3-component vector of float pos,  temp 2-element array of 2-component vector of float uv,  temp float x,  temp int n})
+0:21                    Constant:
+0:21                      1 (const int)
+0:21                  'i' ( temp int)
+0:21                Sequence
+0:21                  Constant:
+0:21                    0 (const int)
+0:21                  Constant:
+0:21                    1 (const int)
+0:21              indirect index ( temp 2-component vector of float)
+0:21                uv: direct index for structure ( temp 2-element array of 2-component vector of float)
+0:21                  'packed' ( temp structure{ temp texture2D tex,  temp 3-element array of 3-component vector of float pos,  temp 2-element array of 2-component vector of float uv,  temp float x,  temp int n})
+0:21                  Constant:
+0:21                    2 (const int)
+0:21                'i' ( temp int)
+0:20          Loop Terminal Expression
+0:20          Pre-Increment ( temp int)
+0:20            'i' ( temp int)
+0:24      Sequence
+0:24        move second child to first child ( temp structure{ temp texture2D tex,  temp 3-element array of 3-component vector of float pos,  temp 2-element array of 2-component vector of float uv,  temp float x,  temp int n})
+0:24          'packed2' ( temp structure{ temp texture2D tex,  temp 3-element array of 3-component vector of float pos,  temp 2-element array of 2-component vector of float uv,  temp float x,  temp int n})
+0:24          'packed' ( temp structure{ temp texture2D tex,  temp 3-element array of 3-component vector of float pos,  temp 2-element array of 2-component vector of float uv,  temp float x,  temp int n})
+0:26      Branch: Return with expression
+0:26        add ( temp 4-component vector of float)
+0:26          'pos' ( in 4-component vector of float)
+0:?           Construct vec4 ( temp 4-component vector of float)
+0:26            direct index ( temp 3-component vector of float)
+0:26              pos: direct index for structure ( temp 3-element array of 3-component vector of float)
+0:26                'packed2' ( temp structure{ temp texture2D tex,  temp 3-element array of 3-component vector of float pos,  temp 2-element array of 2-component vector of float uv,  temp float x,  temp int n})
+0:26                Constant:
+0:26                  1 (const int)
+0:26              Constant:
+0:26                0 (const int)
+0:26            Constant:
+0:26              0.000000
+0:12  Function Definition: main( ( temp void)
+0:12    Function Parameters: 
+0:?     Sequence
+0:12      move second child to first child ( temp 4-component vector of float)
+0:?         'pos' ( temp 4-component vector of float)
+0:?         'pos' (layout( location=0) in 4-component vector of float)
+0:12      move second child to first child ( temp 4-component vector of float)
+0:?         '@entryPointOutput' ( out 4-component vector of float Position)
+0:12        Function Call: @main(vf4; ( temp 4-component vector of float)
+0:?           'pos' ( temp 4-component vector of float)
+0:?   Linker Objects
+0:?     'tex' ( uniform texture2D)
+0:?     '@entryPointOutput' ( out 4-component vector of float Position)
+0:?     'pos' (layout( location=0) in 4-component vector of float)
+
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 90
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Vertex 4  "main" 83 86
+                              Source HLSL 500
+                              Name 4  "main"
+                              Name 11  "@main(vf4;"
+                              Name 10  "pos"
+                              Name 22  "Packed"
+                              MemberName 22(Packed) 0  "tex"
+                              MemberName 22(Packed) 1  "pos"
+                              MemberName 22(Packed) 2  "uv"
+                              MemberName 22(Packed) 3  "x"
+                              MemberName 22(Packed) 4  "n"
+                              Name 24  "packed"
+                              Name 27  "tex"
+                              Name 47  "i"
+                              Name 69  "packed2"
+                              Name 81  "pos"
+                              Name 83  "pos"
+                              Name 86  "@entryPointOutput"
+                              Name 87  "param"
+                              Decorate 27(tex) DescriptorSet 0
+                              Decorate 83(pos) Location 0
+                              Decorate 86(@entryPointOutput) BuiltIn Position
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+               8:             TypePointer Function 7(fvec4)
+               9:             TypeFunction 7(fvec4) 8(ptr)
+              13:             TypeImage 6(float) 2D sampled format:Unknown
+              14:             TypeVector 6(float) 3
+              15:             TypeInt 32 0
+              16:     15(int) Constant 3
+              17:             TypeArray 14(fvec3) 16
+              18:             TypeVector 6(float) 2
+              19:     15(int) Constant 2
+              20:             TypeArray 18(fvec2) 19
+              21:             TypeInt 32 1
+      22(Packed):             TypeStruct 13 17 20 6(float) 21(int)
+              23:             TypePointer Function 22(Packed)
+              25:     21(int) Constant 0
+              26:             TypePointer UniformConstant 13
+         27(tex):     26(ptr) Variable UniformConstant
+              29:             TypePointer Function 13
+              31:     21(int) Constant 1
+              32:    6(float) Constant 0
+              33:   14(fvec3) ConstantComposite 32 32 32
+              34:             TypePointer Function 14(fvec3)
+              36:     21(int) Constant 2
+              37:    6(float) Constant 1065353216
+              38:   18(fvec2) ConstantComposite 32 37
+              39:             TypePointer Function 18(fvec2)
+              41:     21(int) Constant 3
+              42:             TypePointer Function 6(float)
+              44:     21(int) Constant 4
+              45:             TypePointer Function 21(int)
+              54:             TypeBool
+              82:             TypePointer Input 7(fvec4)
+         83(pos):     82(ptr) Variable Input
+              85:             TypePointer Output 7(fvec4)
+86(@entryPointOutput):     85(ptr) Variable Output
+         4(main):           2 Function None 3
+               5:             Label
+         81(pos):      8(ptr) Variable Function
+       87(param):      8(ptr) Variable Function
+              84:    7(fvec4) Load 83(pos)
+                              Store 81(pos) 84
+              88:    7(fvec4) Load 81(pos)
+                              Store 87(param) 88
+              89:    7(fvec4) FunctionCall 11(@main(vf4;) 87(param)
+                              Store 86(@entryPointOutput) 89
+                              Return
+                              FunctionEnd
+  11(@main(vf4;):    7(fvec4) Function None 9
+         10(pos):      8(ptr) FunctionParameter
+              12:             Label
+      24(packed):     23(ptr) Variable Function
+           47(i):     45(ptr) Variable Function
+     69(packed2):     23(ptr) Variable Function
+              28:          13 Load 27(tex)
+              30:     29(ptr) AccessChain 24(packed) 25
+                              Store 30 28
+              35:     34(ptr) AccessChain 24(packed) 31 25
+                              Store 35 33
+              40:     39(ptr) AccessChain 24(packed) 36 25
+                              Store 40 38
+              43:     42(ptr) AccessChain 24(packed) 41
+                              Store 43 37
+              46:     45(ptr) AccessChain 24(packed) 44
+                              Store 46 41
+                              Store 47(i) 25
+                              Branch 48
+              48:             Label
+                              LoopMerge 50 51 None
+                              Branch 52
+              52:             Label
+              53:     21(int) Load 47(i)
+              55:    54(bool) SLessThan 53 31
+                              BranchConditional 55 49 50
+              49:               Label
+              56:     21(int)   Load 47(i)
+              57:     21(int)   Load 47(i)
+              58:     39(ptr)   AccessChain 24(packed) 36 57
+              59:   18(fvec2)   Load 58
+              60:     34(ptr)   AccessChain 24(packed) 31 56
+              61:   14(fvec3)   Load 60
+              62:   18(fvec2)   VectorShuffle 61 61 0 1
+              63:   18(fvec2)   FAdd 62 59
+              64:     34(ptr)   AccessChain 24(packed) 31 56
+              65:   14(fvec3)   Load 64
+              66:   14(fvec3)   VectorShuffle 65 63 3 4 2
+                                Store 64 66
+                                Branch 51
+              51:               Label
+              67:     21(int)   Load 47(i)
+              68:     21(int)   IAdd 67 31
+                                Store 47(i) 68
+                                Branch 48
+              50:             Label
+              70:  22(Packed) Load 24(packed)
+                              Store 69(packed2) 70
+              71:    7(fvec4) Load 10(pos)
+              72:     34(ptr) AccessChain 69(packed2) 31 25
+              73:   14(fvec3) Load 72
+              74:    6(float) CompositeExtract 73 0
+              75:    6(float) CompositeExtract 73 1
+              76:    6(float) CompositeExtract 73 2
+              77:    7(fvec4) CompositeConstruct 74 75 76 32
+              78:    7(fvec4) FAdd 71 77
+                              ReturnValue 78
+                              FunctionEnd
diff --git a/Test/baseResults/hlsl.partialFlattenMixed.vert.out b/Test/baseResults/hlsl.partialFlattenMixed.vert.out
new file mode 100644
index 0000000..51e4c93
--- /dev/null
+++ b/Test/baseResults/hlsl.partialFlattenMixed.vert.out
@@ -0,0 +1,167 @@
+hlsl.partialFlattenMixed.vert
+WARNING: AST will form illegal SPIR-V; need to transform to legalize
+Shader version: 500
+0:? Sequence
+0:10  Function Definition: @main(vf4; ( temp 4-component vector of float)
+0:10    Function Parameters: 
+0:10      'pos' ( in 4-component vector of float)
+0:?     Sequence
+0:13      Sequence
+0:13        move second child to first child ( temp texture2D)
+0:13          direct index ( temp texture2D)
+0:13            membTex: direct index for structure ( temp 2-element array of texture2D)
+0:13              'packed' ( temp structure{ temp int a,  temp 2-element array of texture2D membTex,  temp int b})
+0:13              Constant:
+0:13                1 (const int)
+0:13            Constant:
+0:13              0 (const int)
+0:?           'tex[0]' ( uniform texture2D)
+0:13        move second child to first child ( temp texture2D)
+0:13          direct index ( temp texture2D)
+0:13            membTex: direct index for structure ( temp 2-element array of texture2D)
+0:13              'packed' ( temp structure{ temp int a,  temp 2-element array of texture2D membTex,  temp int b})
+0:13              Constant:
+0:13                1 (const int)
+0:13            Constant:
+0:13              1 (const int)
+0:?           'tex[1]' ( uniform texture2D)
+0:15      Branch: Return with expression
+0:15        'pos' ( in 4-component vector of float)
+0:10  Function Definition: main( ( temp void)
+0:10    Function Parameters: 
+0:?     Sequence
+0:10      move second child to first child ( temp 4-component vector of float)
+0:?         'pos' ( temp 4-component vector of float)
+0:?         'pos' (layout( location=0) in 4-component vector of float)
+0:10      move second child to first child ( temp 4-component vector of float)
+0:?         '@entryPointOutput' ( out 4-component vector of float Position)
+0:10        Function Call: @main(vf4; ( temp 4-component vector of float)
+0:?           'pos' ( temp 4-component vector of float)
+0:?   Linker Objects
+0:?     'tex[0]' ( uniform texture2D)
+0:?     'tex[1]' ( uniform texture2D)
+0:?     '@entryPointOutput' ( out 4-component vector of float Position)
+0:?     'pos' (layout( location=0) in 4-component vector of float)
+
+
+Linked vertex stage:
+
+
+Shader version: 500
+0:? Sequence
+0:10  Function Definition: @main(vf4; ( temp 4-component vector of float)
+0:10    Function Parameters: 
+0:10      'pos' ( in 4-component vector of float)
+0:?     Sequence
+0:13      Sequence
+0:13        move second child to first child ( temp texture2D)
+0:13          direct index ( temp texture2D)
+0:13            membTex: direct index for structure ( temp 2-element array of texture2D)
+0:13              'packed' ( temp structure{ temp int a,  temp 2-element array of texture2D membTex,  temp int b})
+0:13              Constant:
+0:13                1 (const int)
+0:13            Constant:
+0:13              0 (const int)
+0:?           'tex[0]' ( uniform texture2D)
+0:13        move second child to first child ( temp texture2D)
+0:13          direct index ( temp texture2D)
+0:13            membTex: direct index for structure ( temp 2-element array of texture2D)
+0:13              'packed' ( temp structure{ temp int a,  temp 2-element array of texture2D membTex,  temp int b})
+0:13              Constant:
+0:13                1 (const int)
+0:13            Constant:
+0:13              1 (const int)
+0:?           'tex[1]' ( uniform texture2D)
+0:15      Branch: Return with expression
+0:15        'pos' ( in 4-component vector of float)
+0:10  Function Definition: main( ( temp void)
+0:10    Function Parameters: 
+0:?     Sequence
+0:10      move second child to first child ( temp 4-component vector of float)
+0:?         'pos' ( temp 4-component vector of float)
+0:?         'pos' (layout( location=0) in 4-component vector of float)
+0:10      move second child to first child ( temp 4-component vector of float)
+0:?         '@entryPointOutput' ( out 4-component vector of float Position)
+0:10        Function Call: @main(vf4; ( temp 4-component vector of float)
+0:?           'pos' ( temp 4-component vector of float)
+0:?   Linker Objects
+0:?     'tex[0]' ( uniform texture2D)
+0:?     'tex[1]' ( uniform texture2D)
+0:?     '@entryPointOutput' ( out 4-component vector of float Position)
+0:?     'pos' (layout( location=0) in 4-component vector of float)
+
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 43
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Vertex 4  "main" 36 39
+                              Source HLSL 500
+                              Name 4  "main"
+                              Name 11  "@main(vf4;"
+                              Name 10  "pos"
+                              Name 18  "Packed"
+                              MemberName 18(Packed) 0  "a"
+                              MemberName 18(Packed) 1  "membTex"
+                              MemberName 18(Packed) 2  "b"
+                              Name 20  "packed"
+                              Name 24  "tex[0]"
+                              Name 28  "tex[1]"
+                              Name 34  "pos"
+                              Name 36  "pos"
+                              Name 39  "@entryPointOutput"
+                              Name 40  "param"
+                              Decorate 24(tex[0]) DescriptorSet 0
+                              Decorate 28(tex[1]) DescriptorSet 0
+                              Decorate 36(pos) Location 0
+                              Decorate 39(@entryPointOutput) BuiltIn Position
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+               8:             TypePointer Function 7(fvec4)
+               9:             TypeFunction 7(fvec4) 8(ptr)
+              13:             TypeInt 32 1
+              14:             TypeImage 6(float) 2D sampled format:Unknown
+              15:             TypeInt 32 0
+              16:     15(int) Constant 2
+              17:             TypeArray 14 16
+      18(Packed):             TypeStruct 13(int) 17 13(int)
+              19:             TypePointer Function 18(Packed)
+              21:     13(int) Constant 1
+              22:     13(int) Constant 0
+              23:             TypePointer UniformConstant 14
+      24(tex[0]):     23(ptr) Variable UniformConstant
+              26:             TypePointer Function 14
+      28(tex[1]):     23(ptr) Variable UniformConstant
+              35:             TypePointer Input 7(fvec4)
+         36(pos):     35(ptr) Variable Input
+              38:             TypePointer Output 7(fvec4)
+39(@entryPointOutput):     38(ptr) Variable Output
+         4(main):           2 Function None 3
+               5:             Label
+         34(pos):      8(ptr) Variable Function
+       40(param):      8(ptr) Variable Function
+              37:    7(fvec4) Load 36(pos)
+                              Store 34(pos) 37
+              41:    7(fvec4) Load 34(pos)
+                              Store 40(param) 41
+              42:    7(fvec4) FunctionCall 11(@main(vf4;) 40(param)
+                              Store 39(@entryPointOutput) 42
+                              Return
+                              FunctionEnd
+  11(@main(vf4;):    7(fvec4) Function None 9
+         10(pos):      8(ptr) FunctionParameter
+              12:             Label
+      20(packed):     19(ptr) Variable Function
+              25:          14 Load 24(tex[0])
+              27:     26(ptr) AccessChain 20(packed) 21 22
+                              Store 27 25
+              29:          14 Load 28(tex[1])
+              30:     26(ptr) AccessChain 20(packed) 21 21
+                              Store 30 29
+              31:    7(fvec4) Load 10(pos)
+                              ReturnValue 31
+                              FunctionEnd
diff --git a/Test/baseResults/hlsl.partialInit.frag.out b/Test/baseResults/hlsl.partialInit.frag.out
old mode 100755
new mode 100644
index b326799..2cdbb0f
--- a/Test/baseResults/hlsl.partialInit.frag.out
+++ b/Test/baseResults/hlsl.partialInit.frag.out
@@ -157,25 +157,25 @@
 0:18          Function Call: @PixelShaderFunction(vf4; ( temp structure{ temp int a,  temp float b,  temp bool c,  temp 4-component vector of float v})
 0:?             'input' ( temp 4-component vector of float)
 0:18        move second child to first child ( temp int)
-0:?           'a' (layout( location=0) out int)
+0:?           '@entryPointOutput.a' (layout( location=0) out int)
 0:18          a: direct index for structure ( temp int)
 0:18            'flattenTemp' ( temp structure{ temp int a,  temp float b,  temp bool c,  temp 4-component vector of float v})
 0:18            Constant:
 0:18              0 (const int)
 0:18        move second child to first child ( temp float)
-0:?           'b' (layout( location=1) out float)
+0:?           '@entryPointOutput.b' (layout( location=1) out float)
 0:18          b: direct index for structure ( temp float)
 0:18            'flattenTemp' ( temp structure{ temp int a,  temp float b,  temp bool c,  temp 4-component vector of float v})
 0:18            Constant:
 0:18              1 (const int)
 0:18        move second child to first child ( temp bool)
-0:?           'c' (layout( location=2) out bool)
+0:?           '@entryPointOutput.c' (layout( location=2) out bool)
 0:18          c: direct index for structure ( temp bool)
 0:18            'flattenTemp' ( temp structure{ temp int a,  temp float b,  temp bool c,  temp 4-component vector of float v})
 0:18            Constant:
 0:18              2 (const int)
 0:18        move second child to first child ( temp 4-component vector of float)
-0:?           'v' (layout( location=3) out 4-component vector of float)
+0:?           '@entryPointOutput.v' (layout( location=3) out 4-component vector of float)
 0:18          v: direct index for structure ( temp 4-component vector of float)
 0:18            'flattenTemp' ( temp structure{ temp int a,  temp float b,  temp bool c,  temp 4-component vector of float v})
 0:18            Constant:
@@ -183,10 +183,10 @@
 0:?   Linker Objects
 0:?     'gv' ( global 4-component vector of float)
 0:?     'gfa' ( global 3-element array of float)
-0:?     'a' (layout( location=0) out int)
-0:?     'b' (layout( location=1) out float)
-0:?     'c' (layout( location=2) out bool)
-0:?     'v' (layout( location=3) out 4-component vector of float)
+0:?     '@entryPointOutput.a' (layout( location=0) out int)
+0:?     '@entryPointOutput.b' (layout( location=1) out float)
+0:?     '@entryPointOutput.c' (layout( location=2) out bool)
+0:?     '@entryPointOutput.v' (layout( location=3) out 4-component vector of float)
 0:?     'input' (layout( location=0) in 4-component vector of float)
 0:?     'cgf2a' ( const 3-element array of 2-component vector of float)
 0:?       0.000000
@@ -357,25 +357,25 @@
 0:18          Function Call: @PixelShaderFunction(vf4; ( temp structure{ temp int a,  temp float b,  temp bool c,  temp 4-component vector of float v})
 0:?             'input' ( temp 4-component vector of float)
 0:18        move second child to first child ( temp int)
-0:?           'a' (layout( location=0) out int)
+0:?           '@entryPointOutput.a' (layout( location=0) out int)
 0:18          a: direct index for structure ( temp int)
 0:18            'flattenTemp' ( temp structure{ temp int a,  temp float b,  temp bool c,  temp 4-component vector of float v})
 0:18            Constant:
 0:18              0 (const int)
 0:18        move second child to first child ( temp float)
-0:?           'b' (layout( location=1) out float)
+0:?           '@entryPointOutput.b' (layout( location=1) out float)
 0:18          b: direct index for structure ( temp float)
 0:18            'flattenTemp' ( temp structure{ temp int a,  temp float b,  temp bool c,  temp 4-component vector of float v})
 0:18            Constant:
 0:18              1 (const int)
 0:18        move second child to first child ( temp bool)
-0:?           'c' (layout( location=2) out bool)
+0:?           '@entryPointOutput.c' (layout( location=2) out bool)
 0:18          c: direct index for structure ( temp bool)
 0:18            'flattenTemp' ( temp structure{ temp int a,  temp float b,  temp bool c,  temp 4-component vector of float v})
 0:18            Constant:
 0:18              2 (const int)
 0:18        move second child to first child ( temp 4-component vector of float)
-0:?           'v' (layout( location=3) out 4-component vector of float)
+0:?           '@entryPointOutput.v' (layout( location=3) out 4-component vector of float)
 0:18          v: direct index for structure ( temp 4-component vector of float)
 0:18            'flattenTemp' ( temp structure{ temp int a,  temp float b,  temp bool c,  temp 4-component vector of float v})
 0:18            Constant:
@@ -383,10 +383,10 @@
 0:?   Linker Objects
 0:?     'gv' ( global 4-component vector of float)
 0:?     'gfa' ( global 3-element array of float)
-0:?     'a' (layout( location=0) out int)
-0:?     'b' (layout( location=1) out float)
-0:?     'c' (layout( location=2) out bool)
-0:?     'v' (layout( location=3) out 4-component vector of float)
+0:?     '@entryPointOutput.a' (layout( location=0) out int)
+0:?     '@entryPointOutput.b' (layout( location=1) out float)
+0:?     '@entryPointOutput.c' (layout( location=2) out bool)
+0:?     '@entryPointOutput.v' (layout( location=3) out 4-component vector of float)
 0:?     'input' (layout( location=0) in 4-component vector of float)
 0:?     'cgf2a' ( const 3-element array of 2-component vector of float)
 0:?       0.000000
@@ -398,8 +398,12 @@
 0:?     'ci' ( const int)
 0:?       0 (const int)
 
+error: SPIRV-Tools Validation Errors
+error: If OpTypeBool is stored in conjunction with OpVariable, it can only be used with non-externally visible shader Storage Classes: Workgroup, CrossWorkgroup, Private, and Function
+  %_entryPointOutput_c = OpVariable %_ptr_Output_bool Output
+
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 104
 
                               Capability Shader
@@ -433,15 +437,15 @@
                               Name 80  "input"
                               Name 82  "flattenTemp"
                               Name 83  "param"
-                              Name 87  "a"
-                              Name 91  "b"
-                              Name 95  "c"
-                              Name 99  "v"
+                              Name 87  "@entryPointOutput.a"
+                              Name 91  "@entryPointOutput.b"
+                              Name 95  "@entryPointOutput.c"
+                              Name 99  "@entryPointOutput.v"
                               Decorate 80(input) Location 0
-                              Decorate 87(a) Location 0
-                              Decorate 91(b) Location 1
-                              Decorate 95(c) Location 2
-                              Decorate 99(v) Location 3
+                              Decorate 87(@entryPointOutput.a) Location 0
+                              Decorate 91(@entryPointOutput.b) Location 1
+                              Decorate 95(@entryPointOutput.c) Location 2
+                              Decorate 99(@entryPointOutput.v) Location 3
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -492,13 +496,13 @@
               79:             TypePointer Input 7(fvec4)
        80(input):     79(ptr) Variable Input
               86:             TypePointer Output 9(int)
-           87(a):     86(ptr) Variable Output
+87(@entryPointOutput.a):     86(ptr) Variable Output
               90:             TypePointer Output 6(float)
-           91(b):     90(ptr) Variable Output
+91(@entryPointOutput.b):     90(ptr) Variable Output
               94:             TypePointer Output 10(bool)
-           95(c):     94(ptr) Variable Output
+95(@entryPointOutput.c):     94(ptr) Variable Output
               98:             TypePointer Output 7(fvec4)
-           99(v):     98(ptr) Variable Output
+99(@entryPointOutput.v):     98(ptr) Variable Output
              102:             TypeArray 57(fvec2) 22
              103:         102 ConstantComposite 62 62 62
 4(PixelShaderFunction):           2 Function None 3
@@ -516,16 +520,16 @@
                               Store 82(flattenTemp) 85
               88:     64(ptr) AccessChain 82(flattenTemp) 42
               89:      9(int) Load 88
-                              Store 87(a) 89
+                              Store 87(@entryPointOutput.a) 89
               92:     68(ptr) AccessChain 82(flattenTemp) 66
               93:    6(float) Load 92
-                              Store 91(b) 93
+                              Store 91(@entryPointOutput.b) 93
               96:     45(ptr) AccessChain 82(flattenTemp) 35
               97:    10(bool) Load 96
-                              Store 95(c) 97
+                              Store 95(@entryPointOutput.c) 97
              100:      8(ptr) AccessChain 82(flattenTemp) 29
              101:    7(fvec4) Load 100
-                              Store 99(v) 101
+                              Store 99(@entryPointOutput.v) 101
                               Return
                               FunctionEnd
 14(@PixelShaderFunction(vf4;):    11(outs) Function None 12
diff --git a/Test/baseResults/hlsl.pp.expand.frag.err b/Test/baseResults/hlsl.pp.expand.frag.err
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/Test/baseResults/hlsl.pp.expand.frag.err
diff --git a/Test/baseResults/hlsl.pp.expand.frag.out b/Test/baseResults/hlsl.pp.expand.frag.out
new file mode 100644
index 0000000..adfe02c
--- /dev/null
+++ b/Test/baseResults/hlsl.pp.expand.frag.out
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+struct A
+{
+    float4 a;
+    float4 b;
+    float4 c = { 1, 2, 3, 4 };
+    float4 d = {({ {(({ 1, 2, 3, 4 }))} })}, { { 1, 2, 3, 4 } };
+};
+
+void main()
+{
+    "a string"
+}
+
diff --git a/Test/baseResults/hlsl.pp.line.frag.out b/Test/baseResults/hlsl.pp.line.frag.out
index 727fdd0..2c06fe9 100644
--- a/Test/baseResults/hlsl.pp.line.frag.out
+++ b/Test/baseResults/hlsl.pp.line.frag.out
@@ -1,6 +1,7 @@
 hlsl.pp.line.frag
 Shader version: 500
 gl_FragCoord origin is upper left
+using depth_any
 0:? Sequence
 0:4  Function Definition: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:4    Function Parameters: 
@@ -41,20 +42,20 @@
 0:4          'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:4          Function Call: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:4        move second child to first child ( temp 4-component vector of float)
-0:?           'Color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 0:4          Color: direct index for structure ( temp 4-component vector of float)
 0:4            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:4            Constant:
 0:4              0 (const int)
 0:4        move second child to first child ( temp float)
-0:?           'Depth' ( out float FragDepth)
+0:?           '@entryPointOutput.Depth' ( out float FragDepth)
 0:4          Depth: direct index for structure ( temp float)
 0:4            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:4            Constant:
 0:4              1 (const int)
 0:?   Linker Objects
-0:?     'Color' (layout( location=0) out 4-component vector of float)
-0:?     'Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 
 Linked fragment stage:
@@ -62,6 +63,7 @@
 
 Shader version: 500
 gl_FragCoord origin is upper left
+using depth_any
 0:? Sequence
 0:4  Function Definition: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:4    Function Parameters: 
@@ -102,23 +104,23 @@
 0:4          'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:4          Function Call: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:4        move second child to first child ( temp 4-component vector of float)
-0:?           'Color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 0:4          Color: direct index for structure ( temp 4-component vector of float)
 0:4            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:4            Constant:
 0:4              0 (const int)
 0:4        move second child to first child ( temp float)
-0:?           'Depth' ( out float FragDepth)
+0:?           '@entryPointOutput.Depth' ( out float FragDepth)
 0:4          Depth: direct index for structure ( temp float)
 0:4            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:4            Constant:
 0:4              1 (const int)
 0:?   Linker Objects
-0:?     'Color' (layout( location=0) out 4-component vector of float)
-0:?     'Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 42
 
                               Capability Shader
@@ -126,6 +128,7 @@
                               MemoryModel Logical GLSL450
                               EntryPoint Fragment 4  "main" 35 39
                               ExecutionMode 4 OriginUpperLeft
+                              ExecutionMode 4 DepthReplacing
                               Source HLSL 500
                               Name 4  "main"
                               Name 8  "PS_OUTPUT"
@@ -135,10 +138,10 @@
                               Name 14  "thisLineIs"
                               Name 17  "psout"
                               Name 32  "flattenTemp"
-                              Name 35  "Color"
-                              Name 39  "Depth"
-                              Decorate 35(Color) Location 0
-                              Decorate 39(Depth) BuiltIn FragDepth
+                              Name 35  "@entryPointOutput.Color"
+                              Name 39  "@entryPointOutput.Depth"
+                              Decorate 35(@entryPointOutput.Color) Location 0
+                              Decorate 39(@entryPointOutput.Depth) BuiltIn FragDepth
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -156,9 +159,9 @@
               26:     12(int) Constant 1
               27:             TypePointer Function 6(float)
               34:             TypePointer Output 7(fvec4)
-       35(Color):     34(ptr) Variable Output
+35(@entryPointOutput.Color):     34(ptr) Variable Output
               38:             TypePointer Output 6(float)
-       39(Depth):     38(ptr) Variable Output
+39(@entryPointOutput.Depth):     38(ptr) Variable Output
          4(main):           2 Function None 3
                5:             Label
  32(flattenTemp):     16(ptr) Variable Function
@@ -166,10 +169,10 @@
                               Store 32(flattenTemp) 33
               36:     24(ptr) AccessChain 32(flattenTemp) 18
               37:    7(fvec4) Load 36
-                              Store 35(Color) 37
+                              Store 35(@entryPointOutput.Color) 37
               40:     27(ptr) AccessChain 32(flattenTemp) 26
               41:    6(float) Load 40
-                              Store 39(Depth) 41
+                              Store 39(@entryPointOutput.Depth) 41
                               Return
                               FunctionEnd
       10(@main():8(PS_OUTPUT) Function None 9
diff --git a/Test/baseResults/hlsl.pp.vert.out b/Test/baseResults/hlsl.pp.vert.out
new file mode 100644
index 0000000..817b647
--- /dev/null
+++ b/Test/baseResults/hlsl.pp.vert.out
@@ -0,0 +1,61 @@
+hlsl.pp.vert
+Shader version: 500
+0:? Sequence
+0:17  Function Definition: @main( ( temp void)
+0:17    Function Parameters: 
+0:17  Function Definition: main( ( temp void)
+0:17    Function Parameters: 
+0:?     Sequence
+0:17      Function Call: @main( ( temp void)
+0:?   Linker Objects
+0:?     'anon@0' (layout( row_major std140) uniform block{ uniform int goodGlobal1,  uniform int goodGlobal2})
+
+
+Linked vertex stage:
+
+
+Shader version: 500
+0:? Sequence
+0:17  Function Definition: @main( ( temp void)
+0:17    Function Parameters: 
+0:17  Function Definition: main( ( temp void)
+0:17    Function Parameters: 
+0:?     Sequence
+0:17      Function Call: @main( ( temp void)
+0:?   Linker Objects
+0:?     'anon@0' (layout( row_major std140) uniform block{ uniform int goodGlobal1,  uniform int goodGlobal2})
+
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 13
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Vertex 4  "main"
+                              Source HLSL 500
+                              Name 4  "main"
+                              Name 6  "@main("
+                              Name 10  "$Global"
+                              MemberName 10($Global) 0  "goodGlobal1"
+                              MemberName 10($Global) 1  "goodGlobal2"
+                              Name 12  ""
+                              MemberDecorate 10($Global) 0 Offset 0
+                              MemberDecorate 10($Global) 1 Offset 4
+                              Decorate 10($Global) Block
+                              Decorate 12 DescriptorSet 0
+               2:             TypeVoid
+               3:             TypeFunction 2
+               9:             TypeInt 32 1
+     10($Global):             TypeStruct 9(int) 9(int)
+              11:             TypePointer Uniform 10($Global)
+              12:     11(ptr) Variable Uniform
+         4(main):           2 Function None 3
+               5:             Label
+               8:           2 FunctionCall 6(@main()
+                              Return
+                              FunctionEnd
+       6(@main():           2 Function None 3
+               7:             Label
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/hlsl.precedence.frag.out b/Test/baseResults/hlsl.precedence.frag.out
old mode 100755
new mode 100644
index a46c6fb..f4c5338
--- a/Test/baseResults/hlsl.precedence.frag.out
+++ b/Test/baseResults/hlsl.precedence.frag.out
@@ -148,7 +148,7 @@
 0:?     'a4' (layout( location=3) in 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 65
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.precedence2.frag.out b/Test/baseResults/hlsl.precedence2.frag.out
old mode 100755
new mode 100644
index 31e76c3..9ce674d
--- a/Test/baseResults/hlsl.precedence2.frag.out
+++ b/Test/baseResults/hlsl.precedence2.frag.out
@@ -30,16 +30,16 @@
 0:?     Sequence
 0:7      move second child to first child ( temp int)
 0:?         'a1' ( temp int)
-0:?         'a1' (layout( location=0) in int)
+0:?         'a1' (layout( location=0) flat in int)
 0:7      move second child to first child ( temp int)
 0:?         'a2' ( temp int)
-0:?         'a2' (layout( location=1) in int)
+0:?         'a2' (layout( location=1) flat in int)
 0:7      move second child to first child ( temp int)
 0:?         'a3' ( temp int)
-0:?         'a3' (layout( location=2) in int)
+0:?         'a3' (layout( location=2) flat in int)
 0:7      move second child to first child ( temp int)
 0:?         'a4' ( temp int)
-0:?         'a4' (layout( location=3) in int)
+0:?         'a4' (layout( location=3) flat in int)
 0:7      move second child to first child ( temp int)
 0:?         '@entryPointOutput' (layout( location=0) out int)
 0:7        Function Call: @PixelShaderFunction(i1;i1;i1;i1; ( temp int)
@@ -49,10 +49,10 @@
 0:?           'a4' ( temp int)
 0:?   Linker Objects
 0:?     '@entryPointOutput' (layout( location=0) out int)
-0:?     'a1' (layout( location=0) in int)
-0:?     'a2' (layout( location=1) in int)
-0:?     'a3' (layout( location=2) in int)
-0:?     'a4' (layout( location=3) in int)
+0:?     'a1' (layout( location=0) flat in int)
+0:?     'a2' (layout( location=1) flat in int)
+0:?     'a3' (layout( location=2) flat in int)
+0:?     'a4' (layout( location=3) flat in int)
 
 
 Linked fragment stage:
@@ -89,16 +89,16 @@
 0:?     Sequence
 0:7      move second child to first child ( temp int)
 0:?         'a1' ( temp int)
-0:?         'a1' (layout( location=0) in int)
+0:?         'a1' (layout( location=0) flat in int)
 0:7      move second child to first child ( temp int)
 0:?         'a2' ( temp int)
-0:?         'a2' (layout( location=1) in int)
+0:?         'a2' (layout( location=1) flat in int)
 0:7      move second child to first child ( temp int)
 0:?         'a3' ( temp int)
-0:?         'a3' (layout( location=2) in int)
+0:?         'a3' (layout( location=2) flat in int)
 0:7      move second child to first child ( temp int)
 0:?         'a4' ( temp int)
-0:?         'a4' (layout( location=3) in int)
+0:?         'a4' (layout( location=3) flat in int)
 0:7      move second child to first child ( temp int)
 0:?         '@entryPointOutput' (layout( location=0) out int)
 0:7        Function Call: @PixelShaderFunction(i1;i1;i1;i1; ( temp int)
@@ -108,13 +108,13 @@
 0:?           'a4' ( temp int)
 0:?   Linker Objects
 0:?     '@entryPointOutput' (layout( location=0) out int)
-0:?     'a1' (layout( location=0) in int)
-0:?     'a2' (layout( location=1) in int)
-0:?     'a3' (layout( location=2) in int)
-0:?     'a4' (layout( location=3) in int)
+0:?     'a1' (layout( location=0) flat in int)
+0:?     'a2' (layout( location=1) flat in int)
+0:?     'a3' (layout( location=2) flat in int)
+0:?     'a4' (layout( location=3) flat in int)
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 56
 
                               Capability Shader
@@ -142,9 +142,13 @@
                               Name 49  "param"
                               Name 51  "param"
                               Name 53  "param"
+                              Decorate 34(a1) Flat
                               Decorate 34(a1) Location 0
+                              Decorate 37(a2) Flat
                               Decorate 37(a2) Location 1
+                              Decorate 40(a3) Flat
                               Decorate 40(a3) Location 2
+                              Decorate 43(a4) Flat
                               Decorate 43(a4) Location 3
                               Decorate 46(@entryPointOutput) Location 0
                2:             TypeVoid
diff --git a/Test/baseResults/hlsl.precise.frag.out b/Test/baseResults/hlsl.precise.frag.out
index 442f6c2..dd45069 100644
--- a/Test/baseResults/hlsl.precise.frag.out
+++ b/Test/baseResults/hlsl.precise.frag.out
@@ -26,14 +26,14 @@
 0:?     Sequence
 0:9      Sequence
 0:9        move second child to first child ( noContraction temp 4-component vector of float)
-0:?           'color' (layout( location=0) noContraction out 4-component vector of float)
+0:?           '@entryPointOutput.color' (layout( location=0) noContraction out 4-component vector of float)
 0:9          color: direct index for structure ( noContraction temp 4-component vector of float)
 0:9            Function Call: @main( ( temp structure{ noContraction temp 4-component vector of float color})
 0:9            Constant:
 0:9              0 (const int)
 0:?   Linker Objects
 0:?     'precisefloat' ( noContraction global float)
-0:?     'color' (layout( location=0) noContraction out 4-component vector of float)
+0:?     '@entryPointOutput.color' (layout( location=0) noContraction out 4-component vector of float)
 
 
 Linked fragment stage:
@@ -66,17 +66,17 @@
 0:?     Sequence
 0:9      Sequence
 0:9        move second child to first child ( noContraction temp 4-component vector of float)
-0:?           'color' (layout( location=0) noContraction out 4-component vector of float)
+0:?           '@entryPointOutput.color' (layout( location=0) noContraction out 4-component vector of float)
 0:9          color: direct index for structure ( noContraction temp 4-component vector of float)
 0:9            Function Call: @main( ( temp structure{ noContraction temp 4-component vector of float color})
 0:9            Constant:
 0:9              0 (const int)
 0:?   Linker Objects
 0:?     'precisefloat' ( noContraction global float)
-0:?     'color' (layout( location=0) noContraction out 4-component vector of float)
+0:?     '@entryPointOutput.color' (layout( location=0) noContraction out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 37
 
                               Capability Shader
@@ -93,9 +93,9 @@
                               MemberName 16(PS_OUTPUT) 0  "color"
                               Name 18  "@main("
                               Name 21  "ps_output"
-                              Name 32  "color"
+                              Name 32  "@entryPointOutput.color"
                               Name 36  "precisefloat"
-                              Decorate 32(color) Location 0
+                              Decorate 32(@entryPointOutput.color) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -113,14 +113,14 @@
               25:   15(fvec4) ConstantComposite 24 24 24 24
               26:             TypePointer Function 15(fvec4)
               31:             TypePointer Output 15(fvec4)
-       32(color):     31(ptr) Variable Output
+32(@entryPointOutput.color):     31(ptr) Variable Output
               35:             TypePointer Private 6(float)
 36(precisefloat):     35(ptr) Variable Private
          4(main):           2 Function None 3
                5:             Label
               33:16(PS_OUTPUT) FunctionCall 18(@main()
               34:   15(fvec4) CompositeExtract 33 0
-                              Store 32(color) 34
+                              Store 32(@entryPointOutput.color) 34
                               Return
                               FunctionEnd
 13(MyFunction(f1;vf3;):           2 Function None 10
diff --git a/Test/baseResults/hlsl.preprocessor.frag.out b/Test/baseResults/hlsl.preprocessor.frag.out
new file mode 100644
index 0000000..c78de3d
--- /dev/null
+++ b/Test/baseResults/hlsl.preprocessor.frag.out
@@ -0,0 +1,163 @@
+hlsl.preprocessor.frag
+Shader version: 500
+gl_FragCoord origin is upper left
+0:? Sequence
+0:9  Function Definition: @main(vf4; ( temp 4-component vector of float)
+0:9    Function Parameters: 
+0:9      'input' ( in 4-component vector of float)
+0:?     Sequence
+0:10      Sequence
+0:10        move second child to first child ( temp 4-component vector of float)
+0:10          'tex' ( temp 4-component vector of float)
+0:10          texture ( temp 4-component vector of float)
+0:10            Construct combined texture-sampler ( temp sampler2D)
+0:10              'test_texture' ( uniform texture2D)
+0:10              'test_texture_ss' ( uniform sampler)
+0:10            vector swizzle ( temp 2-component vector of float)
+0:10              vector swizzle ( temp 2-component vector of float)
+0:10                'input' ( in 4-component vector of float)
+0:10                Sequence
+0:10                  Constant:
+0:10                    0 (const int)
+0:10                  Constant:
+0:10                    1 (const int)
+0:10              Sequence
+0:10                Constant:
+0:10                  0 (const int)
+0:10                Constant:
+0:10                  1 (const int)
+0:11      Branch: Return with expression
+0:11        'tex' ( temp 4-component vector of float)
+0:9  Function Definition: main( ( temp void)
+0:9    Function Parameters: 
+0:?     Sequence
+0:9      move second child to first child ( temp 4-component vector of float)
+0:?         'input' ( temp 4-component vector of float)
+0:?         'input' (layout( location=0) in 4-component vector of float)
+0:9      move second child to first child ( temp 4-component vector of float)
+0:?         '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+0:9        Function Call: @main(vf4; ( temp 4-component vector of float)
+0:?           'input' ( temp 4-component vector of float)
+0:?   Linker Objects
+0:?     'test_texture' ( uniform texture2D)
+0:?     'test_texture_ss' ( uniform sampler)
+0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+0:?     'input' (layout( location=0) in 4-component vector of float)
+
+
+Linked fragment stage:
+
+
+Shader version: 500
+gl_FragCoord origin is upper left
+0:? Sequence
+0:9  Function Definition: @main(vf4; ( temp 4-component vector of float)
+0:9    Function Parameters: 
+0:9      'input' ( in 4-component vector of float)
+0:?     Sequence
+0:10      Sequence
+0:10        move second child to first child ( temp 4-component vector of float)
+0:10          'tex' ( temp 4-component vector of float)
+0:10          texture ( temp 4-component vector of float)
+0:10            Construct combined texture-sampler ( temp sampler2D)
+0:10              'test_texture' ( uniform texture2D)
+0:10              'test_texture_ss' ( uniform sampler)
+0:10            vector swizzle ( temp 2-component vector of float)
+0:10              vector swizzle ( temp 2-component vector of float)
+0:10                'input' ( in 4-component vector of float)
+0:10                Sequence
+0:10                  Constant:
+0:10                    0 (const int)
+0:10                  Constant:
+0:10                    1 (const int)
+0:10              Sequence
+0:10                Constant:
+0:10                  0 (const int)
+0:10                Constant:
+0:10                  1 (const int)
+0:11      Branch: Return with expression
+0:11        'tex' ( temp 4-component vector of float)
+0:9  Function Definition: main( ( temp void)
+0:9    Function Parameters: 
+0:?     Sequence
+0:9      move second child to first child ( temp 4-component vector of float)
+0:?         'input' ( temp 4-component vector of float)
+0:?         'input' (layout( location=0) in 4-component vector of float)
+0:9      move second child to first child ( temp 4-component vector of float)
+0:?         '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+0:9        Function Call: @main(vf4; ( temp 4-component vector of float)
+0:?           'input' ( temp 4-component vector of float)
+0:?   Linker Objects
+0:?     'test_texture' ( uniform texture2D)
+0:?     'test_texture_ss' ( uniform sampler)
+0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+0:?     'input' (layout( location=0) in 4-component vector of float)
+
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 40
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 33 36
+                              ExecutionMode 4 OriginUpperLeft
+                              Source HLSL 500
+                              Name 4  "main"
+                              Name 11  "@main(vf4;"
+                              Name 10  "input"
+                              Name 13  "tex"
+                              Name 16  "test_texture"
+                              Name 20  "test_texture_ss"
+                              Name 31  "input"
+                              Name 33  "input"
+                              Name 36  "@entryPointOutput"
+                              Name 37  "param"
+                              Decorate 16(test_texture) DescriptorSet 0
+                              Decorate 20(test_texture_ss) DescriptorSet 0
+                              Decorate 33(input) Location 0
+                              Decorate 36(@entryPointOutput) Location 0
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+               8:             TypePointer Function 7(fvec4)
+               9:             TypeFunction 7(fvec4) 8(ptr)
+              14:             TypeImage 6(float) 2D sampled format:Unknown
+              15:             TypePointer UniformConstant 14
+16(test_texture):     15(ptr) Variable UniformConstant
+              18:             TypeSampler
+              19:             TypePointer UniformConstant 18
+20(test_texture_ss):     19(ptr) Variable UniformConstant
+              22:             TypeSampledImage 14
+              24:             TypeVector 6(float) 2
+              32:             TypePointer Input 7(fvec4)
+       33(input):     32(ptr) Variable Input
+              35:             TypePointer Output 7(fvec4)
+36(@entryPointOutput):     35(ptr) Variable Output
+         4(main):           2 Function None 3
+               5:             Label
+       31(input):      8(ptr) Variable Function
+       37(param):      8(ptr) Variable Function
+              34:    7(fvec4) Load 33(input)
+                              Store 31(input) 34
+              38:    7(fvec4) Load 31(input)
+                              Store 37(param) 38
+              39:    7(fvec4) FunctionCall 11(@main(vf4;) 37(param)
+                              Store 36(@entryPointOutput) 39
+                              Return
+                              FunctionEnd
+  11(@main(vf4;):    7(fvec4) Function None 9
+       10(input):      8(ptr) FunctionParameter
+              12:             Label
+         13(tex):      8(ptr) Variable Function
+              17:          14 Load 16(test_texture)
+              21:          18 Load 20(test_texture_ss)
+              23:          22 SampledImage 17 21
+              25:    7(fvec4) Load 10(input)
+              26:   24(fvec2) VectorShuffle 25 25 0 1
+              27:    7(fvec4) ImageSampleImplicitLod 23 26
+                              Store 13(tex) 27
+              28:    7(fvec4) Load 13(tex)
+                              ReturnValue 28
+                              FunctionEnd
diff --git a/Test/baseResults/hlsl.promote.atomic.frag.out b/Test/baseResults/hlsl.promote.atomic.frag.out
index b31ac61..ecc188b 100644
--- a/Test/baseResults/hlsl.promote.atomic.frag.out
+++ b/Test/baseResults/hlsl.promote.atomic.frag.out
@@ -64,11 +64,11 @@
 0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 36
 
                               Capability Shader
-                              Capability SampledBuffer
+                              Capability ImageBuffer
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
                               EntryPoint Fragment 4  "main" 34
diff --git a/Test/baseResults/hlsl.promote.binary.frag.out b/Test/baseResults/hlsl.promote.binary.frag.out
index 09c1f93..e1931af 100644
--- a/Test/baseResults/hlsl.promote.binary.frag.out
+++ b/Test/baseResults/hlsl.promote.binary.frag.out
@@ -74,14 +74,14 @@
 0:?     Sequence
 0:14      Sequence
 0:14        move second child to first child ( temp 4-component vector of float)
-0:?           'Color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 0:14          Color: direct index for structure ( temp 4-component vector of float)
 0:14            Function Call: @main( ( temp structure{ temp 4-component vector of float Color})
 0:14            Constant:
 0:14              0 (const int)
 0:?   Linker Objects
 0:?     'anon@0' (layout( row_major std140) uniform block{ uniform bool bval,  uniform 4-component vector of bool bval4,  uniform int ival,  uniform 4-component vector of int ival4,  uniform float fval,  uniform 4-component vector of float fval4})
-0:?     'Color' (layout( location=0) out 4-component vector of float)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 
 Linked fragment stage:
@@ -162,17 +162,17 @@
 0:?     Sequence
 0:14      Sequence
 0:14        move second child to first child ( temp 4-component vector of float)
-0:?           'Color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 0:14          Color: direct index for structure ( temp 4-component vector of float)
 0:14            Function Call: @main( ( temp structure{ temp 4-component vector of float Color})
 0:14            Constant:
 0:14              0 (const int)
 0:?   Linker Objects
 0:?     'anon@0' (layout( row_major std140) uniform block{ uniform bool bval,  uniform 4-component vector of bool bval4,  uniform int ival,  uniform 4-component vector of int ival4,  uniform float fval,  uniform 4-component vector of float fval4})
-0:?     'Color' (layout( location=0) out 4-component vector of float)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 83
 
                               Capability Shader
@@ -195,7 +195,7 @@
                               Name 18  ""
                               Name 66  "l_int"
                               Name 73  "psout"
-                              Name 80  "Color"
+                              Name 80  "@entryPointOutput.Color"
                               MemberDecorate 16($Global) 0 Offset 0
                               MemberDecorate 16($Global) 1 Offset 16
                               MemberDecorate 16($Global) 2 Offset 32
@@ -204,7 +204,7 @@
                               MemberDecorate 16($Global) 5 Offset 80
                               Decorate 16($Global) Block
                               Decorate 18 DescriptorSet 0
-                              Decorate 80(Color) Location 0
+                              Decorate 80(@entryPointOutput.Color) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -242,12 +242,12 @@
               72:             TypePointer Function 8(PS_OUTPUT)
               74:             TypePointer Function 7(fvec4)
               79:             TypePointer Output 7(fvec4)
-       80(Color):     79(ptr) Variable Output
+80(@entryPointOutput.Color):     79(ptr) Variable Output
          4(main):           2 Function None 3
                5:             Label
               81:8(PS_OUTPUT) FunctionCall 10(@main()
               82:    7(fvec4) CompositeExtract 81 0
-                              Store 80(Color) 82
+                              Store 80(@entryPointOutput.Color) 82
                               Return
                               FunctionEnd
       10(@main():8(PS_OUTPUT) Function None 9
diff --git a/Test/baseResults/hlsl.promote.vec1.frag.out b/Test/baseResults/hlsl.promote.vec1.frag.out
index b0536bd..b92d740 100644
--- a/Test/baseResults/hlsl.promote.vec1.frag.out
+++ b/Test/baseResults/hlsl.promote.vec1.frag.out
@@ -80,7 +80,7 @@
 0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 31
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.promotions.frag.out b/Test/baseResults/hlsl.promotions.frag.out
index e1953e0..9c08948 100644
--- a/Test/baseResults/hlsl.promotions.frag.out
+++ b/Test/baseResults/hlsl.promotions.frag.out
@@ -779,14 +779,14 @@
 0:?     Sequence
 0:52      Sequence
 0:52        move second child to first child ( temp 4-component vector of float)
-0:?           'Color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 0:52          Color: direct index for structure ( temp 4-component vector of float)
 0:52            Function Call: @main( ( temp structure{ temp 4-component vector of float Color})
 0:52            Constant:
 0:52              0 (const int)
 0:?   Linker Objects
 0:?     'anon@0' (layout( row_major std140) uniform block{ uniform 3-component vector of int i3,  uniform 3-component vector of bool b3,  uniform 3-component vector of float f3,  uniform 3-component vector of uint u3,  uniform 3-component vector of double d3,  uniform int is,  uniform bool bs,  uniform float fs,  uniform uint us,  uniform double ds})
-0:?     'Color' (layout( location=0) out 4-component vector of float)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 
 Linked fragment stage:
@@ -1572,17 +1572,17 @@
 0:?     Sequence
 0:52      Sequence
 0:52        move second child to first child ( temp 4-component vector of float)
-0:?           'Color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 0:52          Color: direct index for structure ( temp 4-component vector of float)
 0:52            Function Call: @main( ( temp structure{ temp 4-component vector of float Color})
 0:52            Constant:
 0:52              0 (const int)
 0:?   Linker Objects
 0:?     'anon@0' (layout( row_major std140) uniform block{ uniform 3-component vector of int i3,  uniform 3-component vector of bool b3,  uniform 3-component vector of float f3,  uniform 3-component vector of uint u3,  uniform 3-component vector of double d3,  uniform int is,  uniform bool bs,  uniform float fs,  uniform uint us,  uniform double ds})
-0:?     'Color' (layout( location=0) out 4-component vector of float)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 596
 
                               Capability Shader
@@ -1682,7 +1682,7 @@
                               Name 576  "c2"
                               Name 578  "outval"
                               Name 586  "psout"
-                              Name 593  "Color"
+                              Name 593  "@entryPointOutput.Color"
                               MemberDecorate 111($Global) 0 Offset 0
                               MemberDecorate 111($Global) 1 Offset 16
                               MemberDecorate 111($Global) 2 Offset 32
@@ -1695,7 +1695,7 @@
                               MemberDecorate 111($Global) 9 Offset 104
                               Decorate 111($Global) Block
                               Decorate 113 DescriptorSet 0
-                              Decorate 593(Color) Location 0
+                              Decorate 593(@entryPointOutput.Color) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -1715,18 +1715,18 @@
               29:             TypePointer Function 28(bvec3)
               30:             TypeFunction 2 29(ptr)
               34:             TypeFloat 64
-              35:             TypeVector 34(float) 3
-              36:             TypePointer Function 35(fvec3)
+              35:             TypeVector 34(float64_t) 3
+              36:             TypePointer Function 35(f64vec3)
               37:             TypeFunction 2 36(ptr)
               41:             TypeFunction 7(fvec3) 8(ptr)
               54:             TypeFunction 14(ivec3) 15(ptr)
               67:             TypeFunction 21(ivec3) 22(ptr)
               80:             TypeFunction 28(bvec3) 29(ptr)
-              93:             TypeFunction 35(fvec3) 36(ptr)
+              93:             TypeFunction 35(f64vec3) 36(ptr)
              106:             TypeVector 6(float) 4
   107(PS_OUTPUT):             TypeStruct 106(fvec4)
              108:             TypeFunction 107(PS_OUTPUT)
-    111($Global):             TypeStruct 14(ivec3) 21(ivec3) 7(fvec3) 21(ivec3) 35(fvec3) 13(int) 20(int) 6(float) 20(int) 34(float)
+    111($Global):             TypeStruct 14(ivec3) 21(ivec3) 7(fvec3) 21(ivec3) 35(f64vec3) 13(int) 20(int) 6(float) 20(int) 34(float64_t)
              112:             TypePointer Uniform 111($Global)
              113:    112(ptr) Variable Uniform
              114:     13(int) Constant 0
@@ -1741,24 +1741,24 @@
              142:    7(fvec3) ConstantComposite 140 140 140
              143:    7(fvec3) ConstantComposite 141 141 141
              151:     13(int) Constant 4
-             152:             TypePointer Uniform 35(fvec3)
+             152:             TypePointer Uniform 35(f64vec3)
              172:   14(ivec3) ConstantComposite 114 114 114
              173:   14(ivec3) ConstantComposite 134 134 134
              181:     13(int) Constant 2
              182:             TypePointer Uniform 7(fvec3)
              218:     20(int) Constant 1
              219:   21(ivec3) ConstantComposite 218 218 218
-             261:   34(float) Constant 0 0
-             262:   35(fvec3) ConstantComposite 261 261 261
-             288:   34(float) Constant 0 1072693248
-             289:   35(fvec3) ConstantComposite 288 288 288
+             261:34(float64_t) Constant 0 0
+             262: 35(f64vec3) ConstantComposite 261 261 261
+             288:34(float64_t) Constant 0 1072693248
+             289: 35(f64vec3) ConstantComposite 288 288 288
              473:     13(int) Constant 5
              474:             TypePointer Uniform 13(int)
              480:     13(int) Constant 6
              481:             TypePointer Uniform 20(int)
              488:     13(int) Constant 8
              494:     13(int) Constant 9
-             495:             TypePointer Uniform 34(float)
+             495:             TypePointer Uniform 34(float64_t)
              514:     13(int) Constant 7
              515:             TypePointer Uniform 6(float)
              574:             TypePointer Function 13(int)
@@ -1766,12 +1766,12 @@
              579:    6(float) Constant 1080452710
              585:             TypePointer Function 107(PS_OUTPUT)
              592:             TypePointer Output 106(fvec4)
-      593(Color):    592(ptr) Variable Output
+593(@entryPointOutput.Color):    592(ptr) Variable Output
          4(main):           2 Function None 3
                5:             Label
              594:107(PS_OUTPUT) FunctionCall 109(@main()
              595:  106(fvec4) CompositeExtract 594 0
-                              Store 593(Color) 595
+                              Store 593(@entryPointOutput.Color) 595
                               Return
                               FunctionEnd
   11(Fn_F3(vf3;):           2 Function None 9
@@ -1841,11 +1841,11 @@
            51(p):      8(ptr) FunctionParameter
               53:             Label
              153:    152(ptr) AccessChain 113 151
-             154:   35(fvec3) Load 153
+             154: 35(f64vec3) Load 153
              155:    7(fvec3) FConvert 154
                               Store 51(p) 155
              156:    152(ptr) AccessChain 113 151
-             157:   35(fvec3) Load 156
+             157: 35(f64vec3) Load 156
              158:    7(fvec3) FConvert 157
                               ReturnValue 158
                               FunctionEnd
@@ -1891,11 +1891,11 @@
            64(p):     15(ptr) FunctionParameter
               66:             Label
              191:    152(ptr) AccessChain 113 151
-             192:   35(fvec3) Load 191
+             192: 35(f64vec3) Load 191
              193:   14(ivec3) ConvertFToS 192
                               Store 64(p) 193
              194:    152(ptr) AccessChain 113 151
-             195:   35(fvec3) Load 194
+             195: 35(f64vec3) Load 194
              196:   14(ivec3) ConvertFToS 195
                               ReturnValue 196
                               FunctionEnd
@@ -1941,11 +1941,11 @@
            77(p):     22(ptr) FunctionParameter
               79:             Label
              227:    152(ptr) AccessChain 113 151
-             228:   35(fvec3) Load 227
+             228: 35(f64vec3) Load 227
              229:   21(ivec3) ConvertFToU 228
                               Store 77(p) 229
              230:    152(ptr) AccessChain 113 151
-             231:   35(fvec3) Load 230
+             231: 35(f64vec3) Load 230
              232:   21(ivec3) ConvertFToU 231
                               ReturnValue 232
                               FunctionEnd
@@ -1989,62 +1989,62 @@
            90(p):     29(ptr) FunctionParameter
               92:             Label
              259:    152(ptr) AccessChain 113 151
-             260:   35(fvec3) Load 259
+             260: 35(f64vec3) Load 259
              263:   28(bvec3) FOrdNotEqual 260 262
                               Store 90(p) 263
              264:    152(ptr) AccessChain 113 151
-             265:   35(fvec3) Load 264
+             265: 35(f64vec3) Load 264
              266:   28(bvec3) FOrdNotEqual 265 262
                               ReturnValue 266
                               FunctionEnd
-95(Fn_R_D3I(vd3;):   35(fvec3) Function None 93
+95(Fn_R_D3I(vd3;): 35(f64vec3) Function None 93
            94(p):     36(ptr) FunctionParameter
               96:             Label
              269:    115(ptr) AccessChain 113 114
              270:   14(ivec3) Load 269
-             271:   35(fvec3) ConvertSToF 270
+             271: 35(f64vec3) ConvertSToF 270
                               Store 94(p) 271
              272:    115(ptr) AccessChain 113 114
              273:   14(ivec3) Load 272
-             274:   35(fvec3) ConvertSToF 273
+             274: 35(f64vec3) ConvertSToF 273
                               ReturnValue 274
                               FunctionEnd
-98(Fn_R_D3U(vd3;):   35(fvec3) Function None 93
+98(Fn_R_D3U(vd3;): 35(f64vec3) Function None 93
            97(p):     36(ptr) FunctionParameter
               99:             Label
              277:    125(ptr) AccessChain 113 124
              278:   21(ivec3) Load 277
-             279:   35(fvec3) ConvertUToF 278
+             279: 35(f64vec3) ConvertUToF 278
                               Store 97(p) 279
              280:    125(ptr) AccessChain 113 124
              281:   21(ivec3) Load 280
-             282:   35(fvec3) ConvertUToF 281
+             282: 35(f64vec3) ConvertUToF 281
                               ReturnValue 282
                               FunctionEnd
-101(Fn_R_D3B(vd3;):   35(fvec3) Function None 93
+101(Fn_R_D3B(vd3;): 35(f64vec3) Function None 93
           100(p):     36(ptr) FunctionParameter
              102:             Label
              285:    125(ptr) AccessChain 113 134
              286:   21(ivec3) Load 285
              287:   28(bvec3) INotEqual 286 138
-             290:   35(fvec3) Select 287 289 262
+             290: 35(f64vec3) Select 287 289 262
                               Store 100(p) 290
              291:    125(ptr) AccessChain 113 134
              292:   21(ivec3) Load 291
              293:   28(bvec3) INotEqual 292 138
-             294:   35(fvec3) Select 293 289 262
+             294: 35(f64vec3) Select 293 289 262
                               ReturnValue 294
                               FunctionEnd
-104(Fn_R_D3F(vd3;):   35(fvec3) Function None 93
+104(Fn_R_D3F(vd3;): 35(f64vec3) Function None 93
           103(p):     36(ptr) FunctionParameter
              105:             Label
              297:    182(ptr) AccessChain 113 181
              298:    7(fvec3) Load 297
-             299:   35(fvec3) FConvert 298
+             299: 35(f64vec3) FConvert 298
                               Store 103(p) 299
              300:    182(ptr) AccessChain 113 181
              301:    7(fvec3) Load 300
-             302:   35(fvec3) FConvert 301
+             302: 35(f64vec3) FConvert 301
                               ReturnValue 302
                               FunctionEnd
      109(@main():107(PS_OUTPUT) Function None 108
@@ -2087,7 +2087,7 @@
              317:    7(fvec3) ConvertUToF 316
                               Store 314(r02) 317
              319:    152(ptr) AccessChain 113 151
-             320:   35(fvec3) Load 319
+             320: 35(f64vec3) Load 319
              321:    7(fvec3) FConvert 320
                               Store 318(r03) 321
              323:    125(ptr) AccessChain 113 134
@@ -2104,7 +2104,7 @@
              334:   14(ivec3) ConvertFToS 333
                               Store 331(r12) 334
              336:    152(ptr) AccessChain 113 151
-             337:   35(fvec3) Load 336
+             337: 35(f64vec3) Load 336
              338:   14(ivec3) ConvertFToS 337
                               Store 335(r13) 338
              340:    125(ptr) AccessChain 113 134
@@ -2121,7 +2121,7 @@
              351:   21(ivec3) ConvertFToU 350
                               Store 348(r22) 351
              353:    152(ptr) AccessChain 113 151
-             354:   35(fvec3) Load 353
+             354: 35(f64vec3) Load 353
              355:   21(ivec3) ConvertFToU 354
                               Store 352(r23) 355
              357:    115(ptr) AccessChain 113 114
@@ -2137,25 +2137,25 @@
              367:   28(bvec3) FOrdNotEqual 366 142
                               Store 364(r32) 367
              369:    152(ptr) AccessChain 113 151
-             370:   35(fvec3) Load 369
+             370: 35(f64vec3) Load 369
              371:   28(bvec3) FOrdNotEqual 370 262
                               Store 368(r33) 371
              373:    115(ptr) AccessChain 113 114
              374:   14(ivec3) Load 373
-             375:   35(fvec3) ConvertSToF 374
+             375: 35(f64vec3) ConvertSToF 374
                               Store 372(r40) 375
              377:    125(ptr) AccessChain 113 124
              378:   21(ivec3) Load 377
-             379:   35(fvec3) ConvertUToF 378
+             379: 35(f64vec3) ConvertUToF 378
                               Store 376(r41) 379
              381:    182(ptr) AccessChain 113 181
              382:    7(fvec3) Load 381
-             383:   35(fvec3) FConvert 382
+             383: 35(f64vec3) FConvert 382
                               Store 380(r42) 383
              385:    125(ptr) AccessChain 113 134
              386:   21(ivec3) Load 385
              387:   28(bvec3) INotEqual 386 138
-             388:   35(fvec3) Select 387 289 262
+             388: 35(f64vec3) Select 387 289 262
                               Store 384(r43) 388
              389:    115(ptr) AccessChain 113 114
              390:   14(ivec3) Load 389
@@ -2177,7 +2177,7 @@
              404:    7(fvec3) FMul 403 402
                               Store 314(r02) 404
              405:    152(ptr) AccessChain 113 151
-             406:   35(fvec3) Load 405
+             406: 35(f64vec3) Load 405
              407:    7(fvec3) FConvert 406
              408:    7(fvec3) Load 318(r03)
              409:    7(fvec3) FMul 408 407
@@ -2202,7 +2202,7 @@
              425:   14(ivec3) IMul 424 423
                               Store 331(r12) 425
              426:    152(ptr) AccessChain 113 151
-             427:   35(fvec3) Load 426
+             427: 35(f64vec3) Load 426
              428:   14(ivec3) ConvertFToS 427
              429:   14(ivec3) Load 335(r13)
              430:   14(ivec3) IMul 429 428
@@ -2227,35 +2227,35 @@
              446:   21(ivec3) IMul 445 444
                               Store 348(r22) 446
              447:    152(ptr) AccessChain 113 151
-             448:   35(fvec3) Load 447
+             448: 35(f64vec3) Load 447
              449:   21(ivec3) ConvertFToU 448
              450:   21(ivec3) Load 352(r23)
              451:   21(ivec3) IMul 450 449
                               Store 352(r23) 451
              452:    115(ptr) AccessChain 113 114
              453:   14(ivec3) Load 452
-             454:   35(fvec3) ConvertSToF 453
-             455:   35(fvec3) Load 372(r40)
-             456:   35(fvec3) FMul 455 454
+             454: 35(f64vec3) ConvertSToF 453
+             455: 35(f64vec3) Load 372(r40)
+             456: 35(f64vec3) FMul 455 454
                               Store 372(r40) 456
              457:    125(ptr) AccessChain 113 124
              458:   21(ivec3) Load 457
-             459:   35(fvec3) ConvertUToF 458
-             460:   35(fvec3) Load 376(r41)
-             461:   35(fvec3) FMul 460 459
+             459: 35(f64vec3) ConvertUToF 458
+             460: 35(f64vec3) Load 376(r41)
+             461: 35(f64vec3) FMul 460 459
                               Store 376(r41) 461
              462:    182(ptr) AccessChain 113 181
              463:    7(fvec3) Load 462
-             464:   35(fvec3) FConvert 463
-             465:   35(fvec3) Load 380(r42)
-             466:   35(fvec3) FMul 465 464
+             464: 35(f64vec3) FConvert 463
+             465: 35(f64vec3) Load 380(r42)
+             466: 35(f64vec3) FMul 465 464
                               Store 380(r42) 466
              467:    125(ptr) AccessChain 113 134
              468:   21(ivec3) Load 467
              469:   28(bvec3) INotEqual 468 138
-             470:   35(fvec3) Select 469 289 262
-             471:   35(fvec3) Load 384(r43)
-             472:   35(fvec3) FMul 471 470
+             470: 35(f64vec3) Select 469 289 262
+             471: 35(f64vec3) Load 384(r43)
+             472: 35(f64vec3) FMul 471 470
                               Store 384(r43) 472
              475:    474(ptr) AccessChain 113 473
              476:     13(int) Load 475
@@ -2277,7 +2277,7 @@
              493:    7(fvec3) VectorTimesScalar 492 491
                               Store 314(r02) 493
              496:    495(ptr) AccessChain 113 494
-             497:   34(float) Load 496
+             497:34(float64_t) Load 496
              498:    6(float) FConvert 497
              499:    7(fvec3) Load 318(r03)
              500:    7(fvec3) VectorTimesScalar 499 498
@@ -2305,7 +2305,7 @@
              521:   14(ivec3) IMul 519 520
                               Store 331(r12) 521
              522:    495(ptr) AccessChain 113 494
-             523:   34(float) Load 522
+             523:34(float64_t) Load 522
              524:     13(int) ConvertFToS 523
              525:   14(ivec3) Load 335(r13)
              526:   14(ivec3) CompositeConstruct 524 524 524
@@ -2334,7 +2334,7 @@
              546:   21(ivec3) IMul 544 545
                               Store 348(r22) 546
              547:    495(ptr) AccessChain 113 494
-             548:   34(float) Load 547
+             548:34(float64_t) Load 547
              549:     20(int) ConvertFToU 548
              550:   21(ivec3) Load 352(r23)
              551:   21(ivec3) CompositeConstruct 549 549 549
@@ -2342,28 +2342,28 @@
                               Store 352(r23) 552
              553:    474(ptr) AccessChain 113 473
              554:     13(int) Load 553
-             555:   34(float) ConvertSToF 554
-             556:   35(fvec3) Load 372(r40)
-             557:   35(fvec3) VectorTimesScalar 556 555
+             555:34(float64_t) ConvertSToF 554
+             556: 35(f64vec3) Load 372(r40)
+             557: 35(f64vec3) VectorTimesScalar 556 555
                               Store 372(r40) 557
              558:    481(ptr) AccessChain 113 488
              559:     20(int) Load 558
-             560:   34(float) ConvertUToF 559
-             561:   35(fvec3) Load 376(r41)
-             562:   35(fvec3) VectorTimesScalar 561 560
+             560:34(float64_t) ConvertUToF 559
+             561: 35(f64vec3) Load 376(r41)
+             562: 35(f64vec3) VectorTimesScalar 561 560
                               Store 376(r41) 562
              563:    515(ptr) AccessChain 113 514
              564:    6(float) Load 563
-             565:   34(float) FConvert 564
-             566:   35(fvec3) Load 380(r42)
-             567:   35(fvec3) VectorTimesScalar 566 565
+             565:34(float64_t) FConvert 564
+             566: 35(f64vec3) Load 380(r42)
+             567: 35(f64vec3) VectorTimesScalar 566 565
                               Store 380(r42) 567
              568:    481(ptr) AccessChain 113 480
              569:     20(int) Load 568
              570:    27(bool) INotEqual 569 137
-             571:   34(float) Select 570 288 261
-             572:   35(fvec3) Load 384(r43)
-             573:   35(fvec3) VectorTimesScalar 572 571
+             571:34(float64_t) Select 570 288 261
+             572: 35(f64vec3) Load 384(r43)
+             573: 35(f64vec3) VectorTimesScalar 572 571
                               Store 384(r43) 573
                               Store 575(c1) 124
                               Store 576(c2) 124
diff --git a/Test/baseResults/hlsl.reflection.binding.frag.out b/Test/baseResults/hlsl.reflection.binding.frag.out
index dd19621..464ce0f 100644
--- a/Test/baseResults/hlsl.reflection.binding.frag.out
+++ b/Test/baseResults/hlsl.reflection.binding.frag.out
@@ -1,19 +1,19 @@
 hlsl.reflection.binding.frag
 Uniform reflection:
-t1: offset -1, type 8b5d, size 1, index -1, binding 15
-s1: offset -1, type 0, size 1, index -1, binding 5
-t1a: offset -1, type 8b5d, size 1, index -1, binding 16
-s1a: offset -1, type 0, size 1, index -1, binding 6
-c1_a: offset 0, type 8b52, size 1, index 0, binding -1
-c1_b: offset 16, type 1404, size 1, index 0, binding -1
-c1_c: offset 20, type 1406, size 1, index 0, binding -1
-c2_a: offset 0, type 8b52, size 1, index 1, binding -1
-c2_b: offset 16, type 1404, size 1, index 1, binding -1
-c2_c: offset 20, type 1406, size 1, index 1, binding -1
+t1: offset -1, type 8b5d, size 1, index -1, binding 15, stages 16
+s1: offset -1, type 0, size 1, index -1, binding 5, stages 16
+t1a: offset -1, type 8b5d, size 1, index -1, binding 16, stages 16
+s1a: offset -1, type 0, size 1, index -1, binding 6, stages 16
+c1_a: offset 0, type 8b52, size 1, index 0, binding -1, stages 16
+c1_b: offset 16, type 1404, size 1, index 0, binding -1, stages 16
+c1_c: offset 20, type 1406, size 1, index 0, binding -1, stages 16
+c2_a: offset 0, type 8b52, size 1, index 1, binding -1, stages 16
+c2_b: offset 16, type 1404, size 1, index 1, binding -1, stages 16
+c2_c: offset 20, type 1406, size 1, index 1, binding -1, stages 16
 
 Uniform block reflection:
-cbuff1: offset -1, type ffffffff, size 24, index -1, binding 2
-cbuff2: offset -1, type ffffffff, size 24, index -1, binding 3
+cbuff1: offset -1, type ffffffff, size 24, index -1, binding 2, stages 0
+cbuff2: offset -1, type ffffffff, size 24, index -1, binding 3, stages 0
 
 Vertex attribute reflection:
 
diff --git a/Test/baseResults/hlsl.reflection.vert.out b/Test/baseResults/hlsl.reflection.vert.out
index 8ecfde6..ea8d869 100644
--- a/Test/baseResults/hlsl.reflection.vert.out
+++ b/Test/baseResults/hlsl.reflection.vert.out
@@ -1,84 +1,76 @@
 hlsl.reflection.vert
 Uniform reflection:
-anonMember3: offset 80, type 8b52, size 1, index 0, binding -1
-s.a: offset 0, type 1404, size 1, index 1, binding -1
-ablock.scalar: offset 12, type 1404, size 1, index 2, binding -1
-m23: offset 16, type 8b67, size 1, index 0, binding -1
-scalarAfterm23: offset 48, type 1404, size 1, index 0, binding -1
-c_m23: offset 16, type 8b67, size 1, index 3, binding -1
-c_scalarAfterm23: offset 48, type 1404, size 1, index 3, binding -1
-scalarBeforeArray: offset 96, type 1404, size 1, index 0, binding -1
-floatArray: offset 112, type 1406, size 5, index 0, binding -1
-scalarAfterArray: offset 192, type 1404, size 1, index 0, binding -1
-ablock.memfloat2: offset 48, type 8b50, size 1, index 2, binding -1
-ablock.memf1: offset 56, type 1406, size 1, index 2, binding -1
-ablock.memf2: offset 60, type 8b56, size 1, index 2, binding -1
-ablock.memf3: offset 64, type 1404, size 1, index 2, binding -1
-ablock.memfloat2a: offset 72, type 8b50, size 1, index 2, binding -1
-ablock.m22: offset 80, type 8b5a, size 7, index 2, binding -1
-dm22: offset 32, type 8b5a, size 4, index 1, binding -1
-m22: offset 208, type 8b5a, size 3, index 0, binding -1
-nest.foo.n1.a: offset 0, type 1406, size 1, index 4, binding -1
-nest.foo.n2.b: offset 16, type 1406, size 1, index 4, binding -1
-nest.foo.n2.c: offset 20, type 1406, size 1, index 4, binding -1
-nest.foo.n2.d: offset 24, type 1406, size 1, index 4, binding -1
-deepA.d2.d1[2].va: offset 376, type 8b50, size 2, index 1, binding -1
-deepB.d2.d1.va: offset 984, type 8b50, size 2, index 1, binding -1
-deepB.d2.d1[0].va: offset 984, type 8b50, size 2, index 1, binding -1
-deepB.d2.d1[1].va: offset 984, type 8b50, size 2, index 1, binding -1
-deepB.d2.d1[2].va: offset 984, type 8b50, size 2, index 1, binding -1
-deepB.d2.d1[3].va: offset 984, type 8b50, size 2, index 1, binding -1
-deepC.iv4: offset 1568, type 8b52, size 1, index 1, binding -1
-deepC.d2.i: offset 1568, type 1404, size 1, index 1, binding -1
-deepC.d2.d1[0].va: offset 1568, type 8b50, size 3, index 1, binding -1
-deepC.d2.d1[0].b: offset 1568, type 8b56, size 1, index 1, binding -1
-deepC.d2.d1[1].va: offset 1568, type 8b50, size 3, index 1, binding -1
-deepC.d2.d1[1].b: offset 1568, type 8b56, size 1, index 1, binding -1
-deepC.d2.d1[2].va: offset 1568, type 8b50, size 3, index 1, binding -1
-deepC.d2.d1[2].b: offset 1568, type 8b56, size 1, index 1, binding -1
-deepC.d2.d1[3].va: offset 1568, type 8b50, size 3, index 1, binding -1
-deepC.d2.d1[3].b: offset 1568, type 8b56, size 1, index 1, binding -1
-deepC.v3: offset 1568, type 8b54, size 1, index 1, binding -1
-deepD[0].iv4: offset 2480, type 8b52, size 1, index 1, binding -1
-deepD[0].d2.i: offset 2480, type 1404, size 1, index 1, binding -1
-deepD[0].d2.d1[0].va: offset 2480, type 8b50, size 3, index 1, binding -1
-deepD[0].d2.d1[0].b: offset 2480, type 8b56, size 1, index 1, binding -1
-deepD[0].d2.d1[1].va: offset 2480, type 8b50, size 3, index 1, binding -1
-deepD[0].d2.d1[1].b: offset 2480, type 8b56, size 1, index 1, binding -1
-deepD[0].d2.d1[2].va: offset 2480, type 8b50, size 3, index 1, binding -1
-deepD[0].d2.d1[2].b: offset 2480, type 8b56, size 1, index 1, binding -1
-deepD[0].d2.d1[3].va: offset 2480, type 8b50, size 3, index 1, binding -1
-deepD[0].d2.d1[3].b: offset 2480, type 8b56, size 1, index 1, binding -1
-deepD[0].v3: offset 2480, type 8b54, size 1, index 1, binding -1
-deepD[1].iv4: offset 2480, type 8b52, size 1, index 1, binding -1
-deepD[1].d2.i: offset 2480, type 1404, size 1, index 1, binding -1
-deepD[1].d2.d1[0].va: offset 2480, type 8b50, size 3, index 1, binding -1
-deepD[1].d2.d1[0].b: offset 2480, type 8b56, size 1, index 1, binding -1
-deepD[1].d2.d1[1].va: offset 2480, type 8b50, size 3, index 1, binding -1
-deepD[1].d2.d1[1].b: offset 2480, type 8b56, size 1, index 1, binding -1
-deepD[1].d2.d1[2].va: offset 2480, type 8b50, size 3, index 1, binding -1
-deepD[1].d2.d1[2].b: offset 2480, type 8b56, size 1, index 1, binding -1
-deepD[1].d2.d1[3].va: offset 2480, type 8b50, size 3, index 1, binding -1
-deepD[1].d2.d1[3].b: offset 2480, type 8b56, size 1, index 1, binding -1
-deepD[1].v3: offset 2480, type 8b54, size 1, index 1, binding -1
-arrBl.foo: offset 0, type 1406, size 1, index 5, binding -1
-arrBl2.foo: offset 0, type 1406, size 1, index 6, binding -1
-anonMember1: offset 0, type 8b51, size 1, index 0, binding -1
-uf1: offset 16, type 1406, size 1, index 1, binding -1
+anonMember3: offset 80, type 8b52, size 1, index 0, binding -1, stages 1
+s.a: offset 0, type 1404, size 1, index 1, binding -1, stages 1
+m23: offset 16, type 8b67, size 1, index 0, binding -1, stages 1
+scalarAfterm23: offset 48, type 1404, size 1, index 0, binding -1, stages 1
+c_m23: offset 16, type 8b67, size 1, index 2, binding -1, stages 1
+c_scalarAfterm23: offset 48, type 1404, size 1, index 2, binding -1, stages 1
+scalarBeforeArray: offset 96, type 1404, size 1, index 0, binding -1, stages 1
+floatArray: offset 112, type 1406, size 5, index 0, binding -1, stages 1
+scalarAfterArray: offset 192, type 1404, size 1, index 0, binding -1, stages 1
+m22: offset 208, type 8b5a, size 9, index 0, binding -1, stages 1
+dm22: offset 32, type 8b5a, size 4, index 1, binding -1, stages 1
+foo.n1.a: offset 0, type 1406, size 1, index 3, binding -1, stages 1
+foo.n2.b: offset 16, type 1406, size 1, index 3, binding -1, stages 1
+foo.n2.c: offset 20, type 1406, size 1, index 3, binding -1, stages 1
+foo.n2.d: offset 24, type 1406, size 1, index 3, binding -1, stages 1
+deepA.d2.d1[2].va: offset 376, type 8b50, size 2, index 1, binding -1, stages 1
+deepB.d2.d1.va: offset 984, type 8b50, size 2, index 1, binding -1, stages 1
+deepB.d2.d1[0].va: offset 984, type 8b50, size 2, index 1, binding -1, stages 1
+deepB.d2.d1[1].va: offset 984, type 8b50, size 2, index 1, binding -1, stages 1
+deepB.d2.d1[2].va: offset 984, type 8b50, size 2, index 1, binding -1, stages 1
+deepB.d2.d1[3].va: offset 984, type 8b50, size 2, index 1, binding -1, stages 1
+deepC.iv4: offset 1568, type 8b52, size 1, index 1, binding -1, stages 1
+deepC.d2.i: offset 1568, type 1404, size 1, index 1, binding -1, stages 1
+deepC.d2.d1[0].va: offset 1568, type 8b50, size 3, index 1, binding -1, stages 1
+deepC.d2.d1[0].b: offset 1568, type 8b56, size 1, index 1, binding -1, stages 1
+deepC.d2.d1[1].va: offset 1568, type 8b50, size 3, index 1, binding -1, stages 1
+deepC.d2.d1[1].b: offset 1568, type 8b56, size 1, index 1, binding -1, stages 1
+deepC.d2.d1[2].va: offset 1568, type 8b50, size 3, index 1, binding -1, stages 1
+deepC.d2.d1[2].b: offset 1568, type 8b56, size 1, index 1, binding -1, stages 1
+deepC.d2.d1[3].va: offset 1568, type 8b50, size 3, index 1, binding -1, stages 1
+deepC.d2.d1[3].b: offset 1568, type 8b56, size 1, index 1, binding -1, stages 1
+deepC.v3: offset 1568, type 8b54, size 1, index 1, binding -1, stages 1
+deepD[0].iv4: offset 2480, type 8b52, size 1, index 1, binding -1, stages 1
+deepD[0].d2.i: offset 2480, type 1404, size 1, index 1, binding -1, stages 1
+deepD[0].d2.d1[0].va: offset 2480, type 8b50, size 3, index 1, binding -1, stages 1
+deepD[0].d2.d1[0].b: offset 2480, type 8b56, size 1, index 1, binding -1, stages 1
+deepD[0].d2.d1[1].va: offset 2480, type 8b50, size 3, index 1, binding -1, stages 1
+deepD[0].d2.d1[1].b: offset 2480, type 8b56, size 1, index 1, binding -1, stages 1
+deepD[0].d2.d1[2].va: offset 2480, type 8b50, size 3, index 1, binding -1, stages 1
+deepD[0].d2.d1[2].b: offset 2480, type 8b56, size 1, index 1, binding -1, stages 1
+deepD[0].d2.d1[3].va: offset 2480, type 8b50, size 3, index 1, binding -1, stages 1
+deepD[0].d2.d1[3].b: offset 2480, type 8b56, size 1, index 1, binding -1, stages 1
+deepD[0].v3: offset 2480, type 8b54, size 1, index 1, binding -1, stages 1
+deepD[1].iv4: offset 2480, type 8b52, size 1, index 1, binding -1, stages 1
+deepD[1].d2.i: offset 2480, type 1404, size 1, index 1, binding -1, stages 1
+deepD[1].d2.d1[0].va: offset 2480, type 8b50, size 3, index 1, binding -1, stages 1
+deepD[1].d2.d1[0].b: offset 2480, type 8b56, size 1, index 1, binding -1, stages 1
+deepD[1].d2.d1[1].va: offset 2480, type 8b50, size 3, index 1, binding -1, stages 1
+deepD[1].d2.d1[1].b: offset 2480, type 8b56, size 1, index 1, binding -1, stages 1
+deepD[1].d2.d1[2].va: offset 2480, type 8b50, size 3, index 1, binding -1, stages 1
+deepD[1].d2.d1[2].b: offset 2480, type 8b56, size 1, index 1, binding -1, stages 1
+deepD[1].d2.d1[3].va: offset 2480, type 8b50, size 3, index 1, binding -1, stages 1
+deepD[1].d2.d1[3].b: offset 2480, type 8b56, size 1, index 1, binding -1, stages 1
+deepD[1].v3: offset 2480, type 8b54, size 1, index 1, binding -1, stages 1
+foo1: offset 0, type 1406, size 1, index 4, binding -1, stages 1
+foo2: offset 0, type 1406, size 1, index 5, binding -1, stages 1
+anonMember1: offset 0, type 8b51, size 1, index 0, binding -1, stages 1
+uf1: offset 16, type 1406, size 1, index 1, binding -1, stages 1
 
 Uniform block reflection:
-nameless: offset -1, type ffffffff, size 496, index -1, binding -1
-$Global: offset -1, type ffffffff, size 3088, index -1, binding -1
-ablock: offset -1, type ffffffff, size 304, index -1, binding -1
-c_nameless: offset -1, type ffffffff, size 96, index -1, binding -1
-nest: offset -1, type ffffffff, size 32, index -1, binding -1
-arrBl: offset -1, type ffffffff, size 4, index -1, binding -1
-arrBl2: offset -1, type ffffffff, size 4, index -1, binding -1
+nameless: offset -1, type ffffffff, size 496, index -1, binding -1, stages 0
+$Global: offset -1, type ffffffff, size 3088, index -1, binding -1, stages 0
+c_nameless: offset -1, type ffffffff, size 96, index -1, binding -1, stages 0
+nested: offset -1, type ffffffff, size 32, index -1, binding -1, stages 0
+abl: offset -1, type ffffffff, size 4, index -1, binding -1, stages 0
+abl2: offset -1, type ffffffff, size 4, index -1, binding -1, stages 0
 
 Vertex attribute reflection:
-attributeFloat: offset 0, type 1406, size 0, index 0, binding -1
-attributeFloat2: offset 0, type 8b50, size 0, index 0, binding -1
-attributeFloat3: offset 0, type 8b51, size 0, index 0, binding -1
-attributeFloat4: offset 0, type 8b52, size 0, index 0, binding -1
-attributeMat4: offset 0, type 8b5c, size 0, index 0, binding -1
+attributeFloat: offset 0, type 1406, size 0, index 0, binding -1, stages 0
+attributeFloat2: offset 0, type 8b50, size 0, index 0, binding -1, stages 0
+attributeFloat3: offset 0, type 8b51, size 0, index 0, binding -1, stages 0
+attributeFloat4: offset 0, type 8b52, size 0, index 0, binding -1, stages 0
+attributeMat4: offset 0, type 8b5c, size 0, index 0, binding -1, stages 0
 
diff --git a/Test/baseResults/hlsl.rw.atomics.frag.out b/Test/baseResults/hlsl.rw.atomics.frag.out
index 00301be..c874cd2 100644
--- a/Test/baseResults/hlsl.rw.atomics.frag.out
+++ b/Test/baseResults/hlsl.rw.atomics.frag.out
@@ -1942,7 +1942,7 @@
 0:?     Sequence
 0:45      Sequence
 0:45        move second child to first child ( temp 4-component vector of float)
-0:?           'Color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 0:45          Color: direct index for structure ( temp 4-component vector of float)
 0:45            Function Call: @main( ( temp structure{ temp 4-component vector of float Color})
 0:45            Constant:
@@ -1968,7 +1968,7 @@
 0:?     'g_tBuffI' (layout( r32i) uniform iimageBuffer)
 0:?     'g_tBuffU' (layout( r32ui) uniform uimageBuffer)
 0:?     'anon@0' (layout( row_major std140) uniform block{ uniform uint u1,  uniform 2-component vector of uint u2,  uniform 3-component vector of uint u3,  uniform uint u1b,  uniform uint u1c,  uniform int i1,  uniform 2-component vector of int i2,  uniform 3-component vector of int i3,  uniform int i1b,  uniform int i1c})
-0:?     'Color' (layout( location=0) out 4-component vector of float)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 
 Linked fragment stage:
@@ -3917,7 +3917,7 @@
 0:?     Sequence
 0:45      Sequence
 0:45        move second child to first child ( temp 4-component vector of float)
-0:?           'Color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 0:45          Color: direct index for structure ( temp 4-component vector of float)
 0:45            Function Call: @main( ( temp structure{ temp 4-component vector of float Color})
 0:45            Constant:
@@ -3943,15 +3943,15 @@
 0:?     'g_tBuffI' (layout( r32i) uniform iimageBuffer)
 0:?     'g_tBuffU' (layout( r32ui) uniform uimageBuffer)
 0:?     'anon@0' (layout( row_major std140) uniform block{ uniform uint u1,  uniform 2-component vector of uint u2,  uniform 3-component vector of uint u3,  uniform uint u1b,  uniform uint u1c,  uniform int i1,  uniform 2-component vector of int i2,  uniform 3-component vector of int i3,  uniform int i1b,  uniform int i1c})
-0:?     'Color' (layout( location=0) out 4-component vector of float)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 1147
 
                               Capability Shader
-                              Capability Sampled1D
-                              Capability SampledBuffer
+                              Capability Image1D
+                              Capability ImageBuffer
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
                               EntryPoint Fragment 4  "main" 1117
@@ -3986,7 +3986,7 @@
                               Name 931  "g_tBuffI"
                               Name 1020  "g_tBuffU"
                               Name 1108  "psout"
-                              Name 1117  "Color"
+                              Name 1117  "@entryPointOutput.Color"
                               Name 1122  "g_sSamp"
                               Name 1125  "g_tTex1df1"
                               Name 1128  "g_tTex2df1"
@@ -3998,7 +3998,7 @@
                               Name 1146  "g_tBuffF"
                               Decorate 15(g_tTex1di1) DescriptorSet 0
                               MemberDecorate 21($Global) 0 Offset 0
-                              MemberDecorate 21($Global) 1 Offset 4
+                              MemberDecorate 21($Global) 1 Offset 8
                               MemberDecorate 21($Global) 2 Offset 16
                               MemberDecorate 21($Global) 3 Offset 28
                               MemberDecorate 21($Global) 4 Offset 32
@@ -4018,7 +4018,7 @@
                               Decorate 670(g_tTex1du1a) DescriptorSet 0
                               Decorate 931(g_tBuffI) DescriptorSet 0
                               Decorate 1020(g_tBuffU) DescriptorSet 0
-                              Decorate 1117(Color) Location 0
+                              Decorate 1117(@entryPointOutput.Color) Location 0
                               Decorate 1122(g_sSamp) DescriptorSet 0
                               Decorate 1125(g_tTex1df1) DescriptorSet 0
                               Decorate 1128(g_tTex2df1) DescriptorSet 0
@@ -4100,7 +4100,7 @@
             1110:    7(fvec4) ConstantComposite 1109 1109 1109 1109
             1111:             TypePointer Function 7(fvec4)
             1116:             TypePointer Output 7(fvec4)
-     1117(Color):   1116(ptr) Variable Output
+1117(@entryPointOutput.Color):   1116(ptr) Variable Output
             1120:             TypeSampler
             1121:             TypePointer UniformConstant 1120
    1122(g_sSamp):   1121(ptr) Variable UniformConstant
@@ -4132,7 +4132,7 @@
                5:             Label
             1118:8(PS_OUTPUT) FunctionCall 10(@main()
             1119:    7(fvec4) CompositeExtract 1118 0
-                              Store 1117(Color) 1119
+                              Store 1117(@entryPointOutput.Color) 1119
                               Return
                               FunctionEnd
       10(@main():8(PS_OUTPUT) Function None 9
diff --git a/Test/baseResults/hlsl.rw.bracket.frag.out b/Test/baseResults/hlsl.rw.bracket.frag.out
index fdb906a..d829a7b 100644
--- a/Test/baseResults/hlsl.rw.bracket.frag.out
+++ b/Test/baseResults/hlsl.rw.bracket.frag.out
@@ -844,7 +844,7 @@
 0:?     Sequence
 0:53      Sequence
 0:53        move second child to first child ( temp 4-component vector of float)
-0:?           'Color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 0:53          Color: direct index for structure ( temp 4-component vector of float)
 0:53            Function Call: @main( ( temp structure{ temp 4-component vector of float Color})
 0:53            Constant:
@@ -867,7 +867,7 @@
 0:?     'g_tTex2di4a' (layout( rgba32i) uniform iimage2DArray)
 0:?     'g_tTex2du4a' (layout( rgba32ui) uniform uimage2DArray)
 0:?     'anon@0' (layout( row_major std140) uniform block{ uniform int c1,  uniform 2-component vector of int c2,  uniform 3-component vector of int c3,  uniform 4-component vector of int c4,  uniform int o1,  uniform 2-component vector of int o2,  uniform 3-component vector of int o3,  uniform 4-component vector of int o4,  uniform 4-component vector of float uf4,  uniform 4-component vector of int ui4,  uniform 4-component vector of uint uu4})
-0:?     'Color' (layout( location=0) out 4-component vector of float)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 
 Linked fragment stage:
@@ -1718,7 +1718,7 @@
 0:?     Sequence
 0:53      Sequence
 0:53        move second child to first child ( temp 4-component vector of float)
-0:?           'Color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 0:53          Color: direct index for structure ( temp 4-component vector of float)
 0:53            Function Call: @main( ( temp structure{ temp 4-component vector of float Color})
 0:53            Constant:
@@ -1741,14 +1741,14 @@
 0:?     'g_tTex2di4a' (layout( rgba32i) uniform iimage2DArray)
 0:?     'g_tTex2du4a' (layout( rgba32ui) uniform uimage2DArray)
 0:?     'anon@0' (layout( row_major std140) uniform block{ uniform int c1,  uniform 2-component vector of int c2,  uniform 3-component vector of int c3,  uniform 4-component vector of int c4,  uniform int o1,  uniform 2-component vector of int o2,  uniform 3-component vector of int o3,  uniform 4-component vector of int o4,  uniform 4-component vector of float uf4,  uniform 4-component vector of int ui4,  uniform 4-component vector of uint uu4})
-0:?     'Color' (layout( location=0) out 4-component vector of float)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 607
 
                               Capability Shader
-                              Capability Sampled1D
+                              Capability Image1D
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
                               EntryPoint Fragment 4  "main" 583
@@ -1872,7 +1872,7 @@
                               Name 561  "storeTempPost"
                               Name 569  "storeTemp"
                               Name 576  "psout"
-                              Name 583  "Color"
+                              Name 583  "@entryPointOutput.Color"
                               Name 588  "g_sSamp"
                               Name 591  "g_tTex1df4a"
                               Name 594  "g_tTex1di4a"
@@ -1881,11 +1881,11 @@
                               Name 603  "g_tTex2di4a"
                               Name 606  "g_tTex2du4a"
                               MemberDecorate 63($Global) 0 Offset 0
-                              MemberDecorate 63($Global) 1 Offset 4
+                              MemberDecorate 63($Global) 1 Offset 8
                               MemberDecorate 63($Global) 2 Offset 16
                               MemberDecorate 63($Global) 3 Offset 32
                               MemberDecorate 63($Global) 4 Offset 48
-                              MemberDecorate 63($Global) 5 Offset 52
+                              MemberDecorate 63($Global) 5 Offset 56
                               MemberDecorate 63($Global) 6 Offset 64
                               MemberDecorate 63($Global) 7 Offset 80
                               MemberDecorate 63($Global) 8 Offset 96
@@ -1903,7 +1903,7 @@
                               Decorate 131(g_tTex3df4) DescriptorSet 0
                               Decorate 141(g_tTex3di4) DescriptorSet 0
                               Decorate 149(g_tTex3du4) DescriptorSet 0
-                              Decorate 583(Color) Location 0
+                              Decorate 583(@entryPointOutput.Color) Location 0
                               Decorate 588(g_sSamp) DescriptorSet 0
                               Decorate 588(g_sSamp) Binding 0
                               Decorate 591(g_tTex1df4a) DescriptorSet 0
@@ -2005,7 +2005,7 @@
              575:             TypePointer Function 42(PS_OUTPUT)
              577:   21(fvec4) ConstantComposite 408 408 408 408
              582:             TypePointer Output 21(fvec4)
-      583(Color):    582(ptr) Variable Output
+583(@entryPointOutput.Color):    582(ptr) Variable Output
              586:             TypeSampler
              587:             TypePointer UniformConstant 586
     588(g_sSamp):    587(ptr) Variable UniformConstant
@@ -2031,7 +2031,7 @@
                5:             Label
              584:42(PS_OUTPUT) FunctionCall 44(@main()
              585:   21(fvec4) CompositeExtract 584 0
-                              Store 583(Color) 585
+                              Store 583(@entryPointOutput.Color) 585
                               Return
                               FunctionEnd
     11(Fn1(vi4;):    7(ivec4) Function None 9
diff --git a/Test/baseResults/hlsl.rw.register.frag.out b/Test/baseResults/hlsl.rw.register.frag.out
index 525c6aa..01f6c89 100644
--- a/Test/baseResults/hlsl.rw.register.frag.out
+++ b/Test/baseResults/hlsl.rw.register.frag.out
@@ -36,7 +36,7 @@
 0:?     Sequence
 0:11      Sequence
 0:11        move second child to first child ( temp 4-component vector of float)
-0:?           'Color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 0:11          Color: direct index for structure ( temp 4-component vector of float)
 0:11            Function Call: @main( ( temp structure{ temp 4-component vector of float Color})
 0:11            Constant:
@@ -44,7 +44,7 @@
 0:?   Linker Objects
 0:?     'g_tTex1df1' (layout( binding=2 r32f) uniform image1D)
 0:?     'g_tBuf1du1' (layout( binding=3 r32ui) uniform uimageBuffer)
-0:?     'Color' (layout( location=0) out 4-component vector of float)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 
 Linked fragment stage:
@@ -87,7 +87,7 @@
 0:?     Sequence
 0:11      Sequence
 0:11        move second child to first child ( temp 4-component vector of float)
-0:?           'Color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 0:11          Color: direct index for structure ( temp 4-component vector of float)
 0:11            Function Call: @main( ( temp structure{ temp 4-component vector of float Color})
 0:11            Constant:
@@ -95,15 +95,15 @@
 0:?   Linker Objects
 0:?     'g_tTex1df1' (layout( binding=2 r32f) uniform image1D)
 0:?     'g_tBuf1du1' (layout( binding=3 r32ui) uniform uimageBuffer)
-0:?     'Color' (layout( location=0) out 4-component vector of float)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 42
 
                               Capability Shader
-                              Capability Sampled1D
-                              Capability SampledBuffer
+                              Capability Image1D
+                              Capability ImageBuffer
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
                               EntryPoint Fragment 4  "main" 39
@@ -118,12 +118,12 @@
                               Name 23  "r01"
                               Name 26  "g_tBuf1du1"
                               Name 30  "psout"
-                              Name 39  "Color"
+                              Name 39  "@entryPointOutput.Color"
                               Decorate 16(g_tTex1df1) DescriptorSet 0
                               Decorate 16(g_tTex1df1) Binding 2
                               Decorate 26(g_tBuf1du1) DescriptorSet 0
                               Decorate 26(g_tBuf1du1) Binding 3
-                              Decorate 39(Color) Location 0
+                              Decorate 39(@entryPointOutput.Color) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -146,12 +146,12 @@
               32:    7(fvec4) ConstantComposite 31 31 31 31
               33:             TypePointer Function 7(fvec4)
               38:             TypePointer Output 7(fvec4)
-       39(Color):     38(ptr) Variable Output
+39(@entryPointOutput.Color):     38(ptr) Variable Output
          4(main):           2 Function None 3
                5:             Label
               40:8(PS_OUTPUT) FunctionCall 10(@main()
               41:    7(fvec4) CompositeExtract 40 0
-                              Store 39(Color) 41
+                              Store 39(@entryPointOutput.Color) 41
                               Return
                               FunctionEnd
       10(@main():8(PS_OUTPUT) Function None 9
diff --git a/Test/baseResults/hlsl.rw.scalar.bracket.frag.out b/Test/baseResults/hlsl.rw.scalar.bracket.frag.out
index 38cfa8f..7fc26cc 100644
--- a/Test/baseResults/hlsl.rw.scalar.bracket.frag.out
+++ b/Test/baseResults/hlsl.rw.scalar.bracket.frag.out
@@ -817,7 +817,7 @@
 0:?     Sequence
 0:53      Sequence
 0:53        move second child to first child ( temp 4-component vector of float)
-0:?           'Color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 0:53          Color: direct index for structure ( temp 4-component vector of float)
 0:53            Function Call: @main( ( temp structure{ temp 4-component vector of float Color})
 0:53            Constant:
@@ -840,7 +840,7 @@
 0:?     'g_tTex2di1a' (layout( r32i) uniform iimage2DArray)
 0:?     'g_tTex2du1a' (layout( r32ui) uniform uimage2DArray)
 0:?     'anon@0' (layout( row_major std140) uniform block{ uniform int c1,  uniform 2-component vector of int c2,  uniform 3-component vector of int c3,  uniform 4-component vector of int c4,  uniform int o1,  uniform 2-component vector of int o2,  uniform 3-component vector of int o3,  uniform 4-component vector of int o4,  uniform float uf1,  uniform int ui1,  uniform uint uu1})
-0:?     'Color' (layout( location=0) out 4-component vector of float)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 
 Linked fragment stage:
@@ -1664,7 +1664,7 @@
 0:?     Sequence
 0:53      Sequence
 0:53        move second child to first child ( temp 4-component vector of float)
-0:?           'Color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 0:53          Color: direct index for structure ( temp 4-component vector of float)
 0:53            Function Call: @main( ( temp structure{ temp 4-component vector of float Color})
 0:53            Constant:
@@ -1687,14 +1687,14 @@
 0:?     'g_tTex2di1a' (layout( r32i) uniform iimage2DArray)
 0:?     'g_tTex2du1a' (layout( r32ui) uniform uimage2DArray)
 0:?     'anon@0' (layout( row_major std140) uniform block{ uniform int c1,  uniform 2-component vector of int c2,  uniform 3-component vector of int c3,  uniform 4-component vector of int c4,  uniform int o1,  uniform 2-component vector of int o2,  uniform 3-component vector of int o3,  uniform 4-component vector of int o4,  uniform float uf1,  uniform int ui1,  uniform uint uu1})
-0:?     'Color' (layout( location=0) out 4-component vector of float)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 571
 
                               Capability Shader
-                              Capability Sampled1D
+                              Capability Image1D
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
                               EntryPoint Fragment 4  "main" 547
@@ -1818,7 +1818,7 @@
                               Name 524  "storeTempPost"
                               Name 531  "storeTemp"
                               Name 539  "psout"
-                              Name 547  "Color"
+                              Name 547  "@entryPointOutput.Color"
                               Name 552  "g_sSamp"
                               Name 555  "g_tTex1df1a"
                               Name 558  "g_tTex1di1a"
@@ -1827,11 +1827,11 @@
                               Name 567  "g_tTex2di1a"
                               Name 570  "g_tTex2du1a"
                               MemberDecorate 59($Global) 0 Offset 0
-                              MemberDecorate 59($Global) 1 Offset 4
+                              MemberDecorate 59($Global) 1 Offset 8
                               MemberDecorate 59($Global) 2 Offset 16
                               MemberDecorate 59($Global) 3 Offset 32
                               MemberDecorate 59($Global) 4 Offset 48
-                              MemberDecorate 59($Global) 5 Offset 52
+                              MemberDecorate 59($Global) 5 Offset 56
                               MemberDecorate 59($Global) 6 Offset 64
                               MemberDecorate 59($Global) 7 Offset 80
                               MemberDecorate 59($Global) 8 Offset 96
@@ -1848,7 +1848,7 @@
                               Decorate 125(g_tTex3df1) DescriptorSet 0
                               Decorate 135(g_tTex3di1) DescriptorSet 0
                               Decorate 143(g_tTex3du1) DescriptorSet 0
-                              Decorate 547(Color) Location 0
+                              Decorate 547(@entryPointOutput.Color) Location 0
                               Decorate 552(g_sSamp) DescriptorSet 0
                               Decorate 552(g_sSamp) Binding 0
                               Decorate 555(g_tTex1df1a) DescriptorSet 0
@@ -1934,7 +1934,7 @@
              540:   39(fvec4) ConstantComposite 382 382 382 382
              541:             TypePointer Function 39(fvec4)
              546:             TypePointer Output 39(fvec4)
-      547(Color):    546(ptr) Variable Output
+547(@entryPointOutput.Color):    546(ptr) Variable Output
              550:             TypeSampler
              551:             TypePointer UniformConstant 550
     552(g_sSamp):    551(ptr) Variable UniformConstant
@@ -1960,7 +1960,7 @@
                5:             Label
              548:40(PS_OUTPUT) FunctionCall 42(@main()
              549:   39(fvec4) CompositeExtract 548 0
-                              Store 547(Color) 549
+                              Store 547(@entryPointOutput.Color) 549
                               Return
                               FunctionEnd
      10(Fn1(i1;):      6(int) Function None 8
diff --git a/Test/baseResults/hlsl.rw.swizzle.frag.out b/Test/baseResults/hlsl.rw.swizzle.frag.out
index 60a6b99..8fcbb4b 100644
--- a/Test/baseResults/hlsl.rw.swizzle.frag.out
+++ b/Test/baseResults/hlsl.rw.swizzle.frag.out
@@ -202,11 +202,11 @@
 0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 63
 
                               Capability Shader
-                              Capability SampledBuffer
+                              Capability ImageBuffer
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
                               EntryPoint Fragment 4  "main" 58
diff --git a/Test/baseResults/hlsl.rw.vec2.bracket.frag.out b/Test/baseResults/hlsl.rw.vec2.bracket.frag.out
index 151380a..bf1fe08 100644
--- a/Test/baseResults/hlsl.rw.vec2.bracket.frag.out
+++ b/Test/baseResults/hlsl.rw.vec2.bracket.frag.out
@@ -826,7 +826,7 @@
 0:?     Sequence
 0:53      Sequence
 0:53        move second child to first child ( temp 4-component vector of float)
-0:?           'Color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 0:53          Color: direct index for structure ( temp 4-component vector of float)
 0:53            Function Call: @main( ( temp structure{ temp 4-component vector of float Color})
 0:53            Constant:
@@ -849,7 +849,7 @@
 0:?     'g_tTex2di2a' (layout( rg32i) uniform iimage2DArray)
 0:?     'g_tTex2du2a' (layout( rg32ui) uniform uimage2DArray)
 0:?     'anon@0' (layout( row_major std140) uniform block{ uniform int c1,  uniform 2-component vector of int c2,  uniform 3-component vector of int c3,  uniform 4-component vector of int c4,  uniform int o1,  uniform 2-component vector of int o2,  uniform 3-component vector of int o3,  uniform 4-component vector of int o4,  uniform 2-component vector of float uf2,  uniform 2-component vector of int ui2,  uniform 2-component vector of uint uu2})
-0:?     'Color' (layout( location=0) out 4-component vector of float)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 
 Linked fragment stage:
@@ -1682,7 +1682,7 @@
 0:?     Sequence
 0:53      Sequence
 0:53        move second child to first child ( temp 4-component vector of float)
-0:?           'Color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 0:53          Color: direct index for structure ( temp 4-component vector of float)
 0:53            Function Call: @main( ( temp structure{ temp 4-component vector of float Color})
 0:53            Constant:
@@ -1705,14 +1705,14 @@
 0:?     'g_tTex2di2a' (layout( rg32i) uniform iimage2DArray)
 0:?     'g_tTex2du2a' (layout( rg32ui) uniform uimage2DArray)
 0:?     'anon@0' (layout( row_major std140) uniform block{ uniform int c1,  uniform 2-component vector of int c2,  uniform 3-component vector of int c3,  uniform 4-component vector of int c4,  uniform int o1,  uniform 2-component vector of int o2,  uniform 3-component vector of int o3,  uniform 4-component vector of int o4,  uniform 2-component vector of float uf2,  uniform 2-component vector of int ui2,  uniform 2-component vector of uint uu2})
-0:?     'Color' (layout( location=0) out 4-component vector of float)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 605
 
                               Capability Shader
-                              Capability Sampled1D
+                              Capability Image1D
                               Capability StorageImageExtendedFormats
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
@@ -1837,7 +1837,7 @@
                               Name 557  "storeTempPost"
                               Name 565  "storeTemp"
                               Name 573  "psout"
-                              Name 581  "Color"
+                              Name 581  "@entryPointOutput.Color"
                               Name 586  "g_sSamp"
                               Name 589  "g_tTex1df2a"
                               Name 592  "g_tTex1di2a"
@@ -1846,11 +1846,11 @@
                               Name 601  "g_tTex2di2a"
                               Name 604  "g_tTex2du2a"
                               MemberDecorate 64($Global) 0 Offset 0
-                              MemberDecorate 64($Global) 1 Offset 4
+                              MemberDecorate 64($Global) 1 Offset 8
                               MemberDecorate 64($Global) 2 Offset 16
                               MemberDecorate 64($Global) 3 Offset 32
                               MemberDecorate 64($Global) 4 Offset 48
-                              MemberDecorate 64($Global) 5 Offset 52
+                              MemberDecorate 64($Global) 5 Offset 56
                               MemberDecorate 64($Global) 6 Offset 64
                               MemberDecorate 64($Global) 7 Offset 80
                               MemberDecorate 64($Global) 8 Offset 96
@@ -1867,7 +1867,7 @@
                               Decorate 130(g_tTex3df2) DescriptorSet 0
                               Decorate 140(g_tTex3di2) DescriptorSet 0
                               Decorate 148(g_tTex3du2) DescriptorSet 0
-                              Decorate 581(Color) Location 0
+                              Decorate 581(@entryPointOutput.Color) Location 0
                               Decorate 586(g_sSamp) DescriptorSet 0
                               Decorate 586(g_sSamp) Binding 0
                               Decorate 589(g_tTex1df2a) DescriptorSet 0
@@ -1967,7 +1967,7 @@
              574:   42(fvec4) ConstantComposite 404 404 404 404
              575:             TypePointer Function 42(fvec4)
              580:             TypePointer Output 42(fvec4)
-      581(Color):    580(ptr) Variable Output
+581(@entryPointOutput.Color):    580(ptr) Variable Output
              584:             TypeSampler
              585:             TypePointer UniformConstant 584
     586(g_sSamp):    585(ptr) Variable UniformConstant
@@ -1993,7 +1993,7 @@
                5:             Label
              582:43(PS_OUTPUT) FunctionCall 45(@main()
              583:   42(fvec4) CompositeExtract 582 0
-                              Store 581(Color) 583
+                              Store 581(@entryPointOutput.Color) 583
                               Return
                               FunctionEnd
     11(Fn1(vi2;):    7(ivec2) Function None 9
diff --git a/Test/baseResults/hlsl.sample.array.dx10.frag.out b/Test/baseResults/hlsl.sample.array.dx10.frag.out
index 1ac123e..92e3dd8 100644
--- a/Test/baseResults/hlsl.sample.array.dx10.frag.out
+++ b/Test/baseResults/hlsl.sample.array.dx10.frag.out
@@ -1,6 +1,7 @@
 hlsl.sample.array.dx10.frag
 Shader version: 500
 gl_FragCoord origin is upper left
+using depth_any
 0:? Sequence
 0:24  Function Definition: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:24    Function Parameters: 
@@ -131,13 +132,13 @@
 0:24          'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:24          Function Call: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:24        move second child to first child ( temp 4-component vector of float)
-0:?           'Color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 0:24          Color: direct index for structure ( temp 4-component vector of float)
 0:24            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:24            Constant:
 0:24              0 (const int)
 0:24        move second child to first child ( temp float)
-0:?           'Depth' ( out float FragDepth)
+0:?           '@entryPointOutput.Depth' ( out float FragDepth)
 0:24          Depth: direct index for structure ( temp float)
 0:24            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:24            Constant:
@@ -154,8 +155,8 @@
 0:?     'g_tTexcdf4' ( uniform textureCubeArray)
 0:?     'g_tTexcdi4' ( uniform itextureCubeArray)
 0:?     'g_tTexcdu4' ( uniform utextureCubeArray)
-0:?     'Color' (layout( location=0) out 4-component vector of float)
-0:?     'Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 
 Linked fragment stage:
@@ -163,6 +164,7 @@
 
 Shader version: 500
 gl_FragCoord origin is upper left
+using depth_any
 0:? Sequence
 0:24  Function Definition: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:24    Function Parameters: 
@@ -293,13 +295,13 @@
 0:24          'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:24          Function Call: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:24        move second child to first child ( temp 4-component vector of float)
-0:?           'Color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 0:24          Color: direct index for structure ( temp 4-component vector of float)
 0:24            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:24            Constant:
 0:24              0 (const int)
 0:24        move second child to first child ( temp float)
-0:?           'Depth' ( out float FragDepth)
+0:?           '@entryPointOutput.Depth' ( out float FragDepth)
 0:24          Depth: direct index for structure ( temp float)
 0:24            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:24            Constant:
@@ -316,11 +318,11 @@
 0:?     'g_tTexcdf4' ( uniform textureCubeArray)
 0:?     'g_tTexcdi4' ( uniform itextureCubeArray)
 0:?     'g_tTexcdu4' ( uniform utextureCubeArray)
-0:?     'Color' (layout( location=0) out 4-component vector of float)
-0:?     'Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 146
 
                               Capability Shader
@@ -330,6 +332,7 @@
                               MemoryModel Logical GLSL450
                               EntryPoint Fragment 4  "main" 138 142
                               ExecutionMode 4 OriginUpperLeft
+                              ExecutionMode 4 DepthReplacing
                               Source HLSL 500
                               Name 4  "main"
                               Name 8  "PS_OUTPUT"
@@ -357,8 +360,8 @@
                               Name 114  "g_tTexcdu4"
                               Name 125  "psout"
                               Name 135  "flattenTemp"
-                              Name 138  "Color"
-                              Name 142  "Depth"
+                              Name 138  "@entryPointOutput.Color"
+                              Name 142  "@entryPointOutput.Depth"
                               Name 145  "g_tTex1df4a"
                               Decorate 16(g_tTex1df4) DescriptorSet 0
                               Decorate 16(g_tTex1df4) Binding 0
@@ -372,8 +375,8 @@
                               Decorate 94(g_tTexcdf4) DescriptorSet 0
                               Decorate 104(g_tTexcdi4) DescriptorSet 0
                               Decorate 114(g_tTexcdu4) DescriptorSet 0
-                              Decorate 138(Color) Location 0
-                              Decorate 142(Depth) BuiltIn FragDepth
+                              Decorate 138(@entryPointOutput.Color) Location 0
+                              Decorate 142(@entryPointOutput.Depth) BuiltIn FragDepth
                               Decorate 145(g_tTex1df4a) DescriptorSet 0
                               Decorate 145(g_tTex1df4a) Binding 1
                2:             TypeVoid
@@ -455,9 +458,9 @@
              129:     29(int) Constant 1
              130:             TypePointer Function 6(float)
              137:             TypePointer Output 7(fvec4)
-      138(Color):    137(ptr) Variable Output
+138(@entryPointOutput.Color):    137(ptr) Variable Output
              141:             TypePointer Output 6(float)
-      142(Depth):    141(ptr) Variable Output
+142(@entryPointOutput.Depth):    141(ptr) Variable Output
 145(g_tTex1df4a):     15(ptr) Variable UniformConstant
          4(main):           2 Function None 3
                5:             Label
@@ -466,10 +469,10 @@
                               Store 135(flattenTemp) 136
              139:     12(ptr) AccessChain 135(flattenTemp) 126
              140:    7(fvec4) Load 139
-                              Store 138(Color) 140
+                              Store 138(@entryPointOutput.Color) 140
              143:    130(ptr) AccessChain 135(flattenTemp) 129
              144:    6(float) Load 143
-                              Store 142(Depth) 144
+                              Store 142(@entryPointOutput.Depth) 144
                               Return
                               FunctionEnd
       10(@main():8(PS_OUTPUT) Function None 9
diff --git a/Test/baseResults/hlsl.sample.basic.dx10.frag.out b/Test/baseResults/hlsl.sample.basic.dx10.frag.out
index 61abf2a..b6915b6 100644
--- a/Test/baseResults/hlsl.sample.basic.dx10.frag.out
+++ b/Test/baseResults/hlsl.sample.basic.dx10.frag.out
@@ -3,6 +3,7 @@
 
 Shader version: 500
 gl_FragCoord origin is upper left
+using depth_any
 0:? Sequence
 0:53  Function Definition: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:53    Function Parameters: 
@@ -241,13 +242,13 @@
 0:53          'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:53          Function Call: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:53        move second child to first child ( temp 4-component vector of float)
-0:?           'Color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 0:53          Color: direct index for structure ( temp 4-component vector of float)
 0:53            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:53            Constant:
 0:53              0 (const int)
 0:53        move second child to first child ( temp float)
-0:?           'Depth' ( out float FragDepth)
+0:?           '@entryPointOutput.Depth' ( out float FragDepth)
 0:53          Depth: direct index for structure ( temp float)
 0:53            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:53            Constant:
@@ -269,8 +270,8 @@
 0:?     'g_tTexcdf4' ( uniform textureCube)
 0:?     'g_tTexcdi4' ( uniform itextureCube)
 0:?     'g_tTexcdu4' ( uniform utextureCube)
-0:?     'Color' (layout( location=0) out 4-component vector of float)
-0:?     'Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 
 Linked fragment stage:
@@ -278,6 +279,7 @@
 
 Shader version: 500
 gl_FragCoord origin is upper left
+using depth_any
 0:? Sequence
 0:53  Function Definition: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:53    Function Parameters: 
@@ -516,13 +518,13 @@
 0:53          'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:53          Function Call: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:53        move second child to first child ( temp 4-component vector of float)
-0:?           'Color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 0:53          Color: direct index for structure ( temp 4-component vector of float)
 0:53            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:53            Constant:
 0:53              0 (const int)
 0:53        move second child to first child ( temp float)
-0:?           'Depth' ( out float FragDepth)
+0:?           '@entryPointOutput.Depth' ( out float FragDepth)
 0:53          Depth: direct index for structure ( temp float)
 0:53            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:53            Constant:
@@ -544,11 +546,11 @@
 0:?     'g_tTexcdf4' ( uniform textureCube)
 0:?     'g_tTexcdi4' ( uniform itextureCube)
 0:?     'g_tTexcdu4' ( uniform utextureCube)
-0:?     'Color' (layout( location=0) out 4-component vector of float)
-0:?     'Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 198
 
                               Capability Shader
@@ -557,6 +559,7 @@
                               MemoryModel Logical GLSL450
                               EntryPoint Fragment 4  "main" 188 192
                               ExecutionMode 4 OriginUpperLeft
+                              ExecutionMode 4 DepthReplacing
                               Source HLSL 500
                               Name 4  "main"
                               Name 8  "PS_OUTPUT"
@@ -604,8 +607,8 @@
                               Name 169  "g_tTexcdu4"
                               Name 176  "psout"
                               Name 185  "flattenTemp"
-                              Name 188  "Color"
-                              Name 192  "Depth"
+                              Name 188  "@entryPointOutput.Color"
+                              Name 192  "@entryPointOutput.Depth"
                               Name 195  "g_sSamp2d"
                               Name 196  "g_sSamp2D_b"
                               Name 197  "g_tTex1df4a"
@@ -624,8 +627,8 @@
                               Decorate 151(g_tTexcdf4) DescriptorSet 0
                               Decorate 160(g_tTexcdi4) DescriptorSet 0
                               Decorate 169(g_tTexcdu4) DescriptorSet 0
-                              Decorate 188(Color) Location 0
-                              Decorate 192(Depth) BuiltIn FragDepth
+                              Decorate 188(@entryPointOutput.Color) Location 0
+                              Decorate 192(@entryPointOutput.Depth) BuiltIn FragDepth
                               Decorate 195(g_sSamp2d) DescriptorSet 0
                               Decorate 196(g_sSamp2D_b) DescriptorSet 0
                               Decorate 197(g_tTex1df4a) DescriptorSet 0
@@ -731,9 +734,9 @@
              178:    7(fvec4) ConstantComposite 177 177 177 177
              180:             TypePointer Function 6(float)
              187:             TypePointer Output 7(fvec4)
-      188(Color):    187(ptr) Variable Output
+188(@entryPointOutput.Color):    187(ptr) Variable Output
              191:             TypePointer Output 6(float)
-      192(Depth):    191(ptr) Variable Output
+192(@entryPointOutput.Depth):    191(ptr) Variable Output
   195(g_sSamp2d):     48(ptr) Variable UniformConstant
 196(g_sSamp2D_b):     48(ptr) Variable UniformConstant
 197(g_tTex1df4a):     44(ptr) Variable UniformConstant
@@ -744,10 +747,10 @@
                               Store 185(flattenTemp) 186
              189:     41(ptr) AccessChain 185(flattenTemp) 29
              190:    7(fvec4) Load 189
-                              Store 188(Color) 190
+                              Store 188(@entryPointOutput.Color) 190
              193:    180(ptr) AccessChain 185(flattenTemp) 16
              194:    6(float) Load 193
-                              Store 192(Depth) 194
+                              Store 192(@entryPointOutput.Depth) 194
                               Return
                               FunctionEnd
       10(@main():8(PS_OUTPUT) Function None 9
diff --git a/Test/baseResults/hlsl.sample.offset.dx10.frag.out b/Test/baseResults/hlsl.sample.offset.dx10.frag.out
index f6bfb8d..bd199a3 100644
--- a/Test/baseResults/hlsl.sample.offset.dx10.frag.out
+++ b/Test/baseResults/hlsl.sample.offset.dx10.frag.out
@@ -1,6 +1,7 @@
 hlsl.sample.offset.dx10.frag
 Shader version: 500
 gl_FragCoord origin is upper left
+using depth_any
 0:? Sequence
 0:28  Function Definition: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:28    Function Parameters: 
@@ -149,13 +150,13 @@
 0:28          'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:28          Function Call: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:28        move second child to first child ( temp 4-component vector of float)
-0:?           'Color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 0:28          Color: direct index for structure ( temp 4-component vector of float)
 0:28            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:28            Constant:
 0:28              0 (const int)
 0:28        move second child to first child ( temp float)
-0:?           'Depth' ( out float FragDepth)
+0:?           '@entryPointOutput.Depth' ( out float FragDepth)
 0:28          Depth: direct index for structure ( temp float)
 0:28            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:28            Constant:
@@ -175,8 +176,8 @@
 0:?     'g_tTexcdf4' ( uniform textureCube)
 0:?     'g_tTexcdi4' ( uniform itextureCube)
 0:?     'g_tTexcdu4' ( uniform utextureCube)
-0:?     'Color' (layout( location=0) out 4-component vector of float)
-0:?     'Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 
 Linked fragment stage:
@@ -184,6 +185,7 @@
 
 Shader version: 500
 gl_FragCoord origin is upper left
+using depth_any
 0:? Sequence
 0:28  Function Definition: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:28    Function Parameters: 
@@ -332,13 +334,13 @@
 0:28          'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:28          Function Call: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:28        move second child to first child ( temp 4-component vector of float)
-0:?           'Color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 0:28          Color: direct index for structure ( temp 4-component vector of float)
 0:28            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:28            Constant:
 0:28              0 (const int)
 0:28        move second child to first child ( temp float)
-0:?           'Depth' ( out float FragDepth)
+0:?           '@entryPointOutput.Depth' ( out float FragDepth)
 0:28          Depth: direct index for structure ( temp float)
 0:28            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:28            Constant:
@@ -358,11 +360,11 @@
 0:?     'g_tTexcdf4' ( uniform textureCube)
 0:?     'g_tTexcdi4' ( uniform itextureCube)
 0:?     'g_tTexcdu4' ( uniform utextureCube)
-0:?     'Color' (layout( location=0) out 4-component vector of float)
-0:?     'Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 161
 
                               Capability Shader
@@ -371,6 +373,7 @@
                               MemoryModel Logical GLSL450
                               EntryPoint Fragment 4  "main" 144 148
                               ExecutionMode 4 OriginUpperLeft
+                              ExecutionMode 4 DepthReplacing
                               Source HLSL 500
                               Name 4  "main"
                               Name 8  "PS_OUTPUT"
@@ -398,8 +401,8 @@
                               Name 120  "g_tTex3du4"
                               Name 132  "psout"
                               Name 141  "flattenTemp"
-                              Name 144  "Color"
-                              Name 148  "Depth"
+                              Name 144  "@entryPointOutput.Color"
+                              Name 148  "@entryPointOutput.Depth"
                               Name 151  "g_tTex1df4a"
                               Name 154  "g_tTexcdf4"
                               Name 157  "g_tTexcdi4"
@@ -416,8 +419,8 @@
                               Decorate 96(g_tTex3df4) DescriptorSet 0
                               Decorate 109(g_tTex3di4) DescriptorSet 0
                               Decorate 120(g_tTex3du4) DescriptorSet 0
-                              Decorate 144(Color) Location 0
-                              Decorate 148(Depth) BuiltIn FragDepth
+                              Decorate 144(@entryPointOutput.Color) Location 0
+                              Decorate 148(@entryPointOutput.Depth) BuiltIn FragDepth
                               Decorate 151(g_tTex1df4a) DescriptorSet 0
                               Decorate 151(g_tTex1df4a) Binding 1
                               Decorate 154(g_tTexcdf4) DescriptorSet 0
@@ -508,9 +511,9 @@
              134:    7(fvec4) ConstantComposite 133 133 133 133
              136:             TypePointer Function 6(float)
              143:             TypePointer Output 7(fvec4)
-      144(Color):    143(ptr) Variable Output
+144(@entryPointOutput.Color):    143(ptr) Variable Output
              147:             TypePointer Output 6(float)
-      148(Depth):    147(ptr) Variable Output
+148(@entryPointOutput.Depth):    147(ptr) Variable Output
 151(g_tTex1df4a):     15(ptr) Variable UniformConstant
              152:             TypeImage 6(float) Cube sampled format:Unknown
              153:             TypePointer UniformConstant 152
@@ -528,10 +531,10 @@
                               Store 141(flattenTemp) 142
              145:     12(ptr) AccessChain 141(flattenTemp) 64
              146:    7(fvec4) Load 145
-                              Store 144(Color) 146
+                              Store 144(@entryPointOutput.Color) 146
              149:    136(ptr) AccessChain 141(flattenTemp) 26
              150:    6(float) Load 149
-                              Store 148(Depth) 150
+                              Store 148(@entryPointOutput.Depth) 150
                               Return
                               FunctionEnd
       10(@main():8(PS_OUTPUT) Function None 9
diff --git a/Test/baseResults/hlsl.sample.offsetarray.dx10.frag.out b/Test/baseResults/hlsl.sample.offsetarray.dx10.frag.out
index c08ec5c..065cef0 100644
--- a/Test/baseResults/hlsl.sample.offsetarray.dx10.frag.out
+++ b/Test/baseResults/hlsl.sample.offsetarray.dx10.frag.out
@@ -1,6 +1,7 @@
 hlsl.sample.offsetarray.dx10.frag
 Shader version: 500
 gl_FragCoord origin is upper left
+using depth_any
 0:? Sequence
 0:20  Function Definition: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:20    Function Parameters: 
@@ -110,13 +111,13 @@
 0:20          'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:20          Function Call: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:20        move second child to first child ( temp 4-component vector of float)
-0:?           'Color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 0:20          Color: direct index for structure ( temp 4-component vector of float)
 0:20            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:20            Constant:
 0:20              0 (const int)
 0:20        move second child to first child ( temp float)
-0:?           'Depth' ( out float FragDepth)
+0:?           '@entryPointOutput.Depth' ( out float FragDepth)
 0:20          Depth: direct index for structure ( temp float)
 0:20            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:20            Constant:
@@ -130,8 +131,8 @@
 0:?     'g_tTex2df4' ( uniform texture2DArray)
 0:?     'g_tTex2di4' ( uniform itexture2DArray)
 0:?     'g_tTex2du4' ( uniform utexture2DArray)
-0:?     'Color' (layout( location=0) out 4-component vector of float)
-0:?     'Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 
 Linked fragment stage:
@@ -139,6 +140,7 @@
 
 Shader version: 500
 gl_FragCoord origin is upper left
+using depth_any
 0:? Sequence
 0:20  Function Definition: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:20    Function Parameters: 
@@ -248,13 +250,13 @@
 0:20          'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:20          Function Call: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:20        move second child to first child ( temp 4-component vector of float)
-0:?           'Color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 0:20          Color: direct index for structure ( temp 4-component vector of float)
 0:20            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:20            Constant:
 0:20              0 (const int)
 0:20        move second child to first child ( temp float)
-0:?           'Depth' ( out float FragDepth)
+0:?           '@entryPointOutput.Depth' ( out float FragDepth)
 0:20          Depth: direct index for structure ( temp float)
 0:20            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:20            Constant:
@@ -268,11 +270,11 @@
 0:?     'g_tTex2df4' ( uniform texture2DArray)
 0:?     'g_tTex2di4' ( uniform itexture2DArray)
 0:?     'g_tTex2du4' ( uniform utexture2DArray)
-0:?     'Color' (layout( location=0) out 4-component vector of float)
-0:?     'Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 118
 
                               Capability Shader
@@ -281,6 +283,7 @@
                               MemoryModel Logical GLSL450
                               EntryPoint Fragment 4  "main" 110 114
                               ExecutionMode 4 OriginUpperLeft
+                              ExecutionMode 4 DepthReplacing
                               Source HLSL 500
                               Name 4  "main"
                               Name 8  "PS_OUTPUT"
@@ -302,8 +305,8 @@
                               Name 87  "g_tTex2du4"
                               Name 98  "psout"
                               Name 107  "flattenTemp"
-                              Name 110  "Color"
-                              Name 114  "Depth"
+                              Name 110  "@entryPointOutput.Color"
+                              Name 114  "@entryPointOutput.Depth"
                               Name 117  "g_tTex1df4a"
                               Decorate 16(g_tTex1df4) DescriptorSet 0
                               Decorate 16(g_tTex1df4) Binding 0
@@ -314,8 +317,8 @@
                               Decorate 63(g_tTex2df4) DescriptorSet 0
                               Decorate 76(g_tTex2di4) DescriptorSet 0
                               Decorate 87(g_tTex2du4) DescriptorSet 0
-                              Decorate 110(Color) Location 0
-                              Decorate 114(Depth) BuiltIn FragDepth
+                              Decorate 110(@entryPointOutput.Color) Location 0
+                              Decorate 114(@entryPointOutput.Depth) BuiltIn FragDepth
                               Decorate 117(g_tTex1df4a) DescriptorSet 0
                               Decorate 117(g_tTex1df4a) Binding 1
                2:             TypeVoid
@@ -384,9 +387,9 @@
              100:    7(fvec4) ConstantComposite 99 99 99 99
              102:             TypePointer Function 6(float)
              109:             TypePointer Output 7(fvec4)
-      110(Color):    109(ptr) Variable Output
+110(@entryPointOutput.Color):    109(ptr) Variable Output
              113:             TypePointer Output 6(float)
-      114(Depth):    113(ptr) Variable Output
+114(@entryPointOutput.Depth):    113(ptr) Variable Output
 117(g_tTex1df4a):     15(ptr) Variable UniformConstant
          4(main):           2 Function None 3
                5:             Label
@@ -395,10 +398,10 @@
                               Store 107(flattenTemp) 108
              111:     12(ptr) AccessChain 107(flattenTemp) 29
              112:    7(fvec4) Load 111
-                              Store 110(Color) 112
+                              Store 110(@entryPointOutput.Color) 112
              115:    102(ptr) AccessChain 107(flattenTemp) 43
              116:    6(float) Load 115
-                              Store 114(Depth) 116
+                              Store 114(@entryPointOutput.Depth) 116
                               Return
                               FunctionEnd
       10(@main():8(PS_OUTPUT) Function None 9
diff --git a/Test/baseResults/hlsl.sample.sub-vec4.dx10.frag.out b/Test/baseResults/hlsl.sample.sub-vec4.dx10.frag.out
index 2829c02..f24415a 100644
--- a/Test/baseResults/hlsl.sample.sub-vec4.dx10.frag.out
+++ b/Test/baseResults/hlsl.sample.sub-vec4.dx10.frag.out
@@ -61,7 +61,7 @@
 0:?     Sequence
 0:14      Sequence
 0:14        move second child to first child ( temp 4-component vector of float)
-0:?           'Color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 0:14          Color: direct index for structure ( temp 4-component vector of float)
 0:14            Function Call: @main( ( temp structure{ temp 4-component vector of float Color})
 0:14            Constant:
@@ -72,7 +72,7 @@
 0:?     'g_tTex1df2' ( uniform texture1D)
 0:?     'g_tTex1df3' ( uniform texture1D)
 0:?     'g_tTex1df4' ( uniform texture1D)
-0:?     'Color' (layout( location=0) out 4-component vector of float)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 
 Linked fragment stage:
@@ -140,7 +140,7 @@
 0:?     Sequence
 0:14      Sequence
 0:14        move second child to first child ( temp 4-component vector of float)
-0:?           'Color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 0:14          Color: direct index for structure ( temp 4-component vector of float)
 0:14            Function Call: @main( ( temp structure{ temp 4-component vector of float Color})
 0:14            Constant:
@@ -151,10 +151,10 @@
 0:?     'g_tTex1df2' ( uniform texture1D)
 0:?     'g_tTex1df3' ( uniform texture1D)
 0:?     'g_tTex1df4' ( uniform texture1D)
-0:?     'Color' (layout( location=0) out 4-component vector of float)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 72
 
                               Capability Shader
@@ -178,14 +178,14 @@
                               Name 52  "txval13"
                               Name 53  "g_tTex1df4"
                               Name 59  "psout"
-                              Name 69  "Color"
+                              Name 69  "@entryPointOutput.Color"
                               Decorate 16(g_tTex1df1) DescriptorSet 0
                               Decorate 20(g_sSamp) DescriptorSet 0
                               Decorate 20(g_sSamp) Binding 0
                               Decorate 30(g_tTex1df2) DescriptorSet 0
                               Decorate 42(g_tTex1df3) DescriptorSet 0
                               Decorate 53(g_tTex1df4) DescriptorSet 0
-                              Decorate 69(Color) Location 0
+                              Decorate 69(@entryPointOutput.Color) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -216,12 +216,12 @@
               62:    6(float) Constant 1065353216
               63:    7(fvec4) ConstantComposite 62 62 62 62
               68:             TypePointer Output 7(fvec4)
-       69(Color):     68(ptr) Variable Output
+69(@entryPointOutput.Color):     68(ptr) Variable Output
          4(main):           2 Function None 3
                5:             Label
               70:8(PS_OUTPUT) FunctionCall 10(@main()
               71:    7(fvec4) CompositeExtract 70 0
-                              Store 69(Color) 71
+                              Store 69(@entryPointOutput.Color) 71
                               Return
                               FunctionEnd
       10(@main():8(PS_OUTPUT) Function None 9
diff --git a/Test/baseResults/hlsl.samplebias.array.dx10.frag.out b/Test/baseResults/hlsl.samplebias.array.dx10.frag.out
index afed0a4..a6fc0a5 100644
--- a/Test/baseResults/hlsl.samplebias.array.dx10.frag.out
+++ b/Test/baseResults/hlsl.samplebias.array.dx10.frag.out
@@ -1,6 +1,7 @@
 hlsl.samplebias.array.dx10.frag
 Shader version: 500
 gl_FragCoord origin is upper left
+using depth_any
 0:? Sequence
 0:24  Function Definition: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:24    Function Parameters: 
@@ -149,13 +150,13 @@
 0:24          'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:24          Function Call: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:24        move second child to first child ( temp 4-component vector of float)
-0:?           'Color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 0:24          Color: direct index for structure ( temp 4-component vector of float)
 0:24            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:24            Constant:
 0:24              0 (const int)
 0:24        move second child to first child ( temp float)
-0:?           'Depth' ( out float FragDepth)
+0:?           '@entryPointOutput.Depth' ( out float FragDepth)
 0:24          Depth: direct index for structure ( temp float)
 0:24            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:24            Constant:
@@ -172,8 +173,8 @@
 0:?     'g_tTexcdf4' ( uniform textureCubeArray)
 0:?     'g_tTexcdi4' ( uniform itextureCubeArray)
 0:?     'g_tTexcdu4' ( uniform utextureCubeArray)
-0:?     'Color' (layout( location=0) out 4-component vector of float)
-0:?     'Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 
 Linked fragment stage:
@@ -181,6 +182,7 @@
 
 Shader version: 500
 gl_FragCoord origin is upper left
+using depth_any
 0:? Sequence
 0:24  Function Definition: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:24    Function Parameters: 
@@ -329,13 +331,13 @@
 0:24          'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:24          Function Call: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:24        move second child to first child ( temp 4-component vector of float)
-0:?           'Color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 0:24          Color: direct index for structure ( temp 4-component vector of float)
 0:24            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:24            Constant:
 0:24              0 (const int)
 0:24        move second child to first child ( temp float)
-0:?           'Depth' ( out float FragDepth)
+0:?           '@entryPointOutput.Depth' ( out float FragDepth)
 0:24          Depth: direct index for structure ( temp float)
 0:24            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:24            Constant:
@@ -352,11 +354,11 @@
 0:?     'g_tTexcdf4' ( uniform textureCubeArray)
 0:?     'g_tTexcdi4' ( uniform itextureCubeArray)
 0:?     'g_tTexcdu4' ( uniform utextureCubeArray)
-0:?     'Color' (layout( location=0) out 4-component vector of float)
-0:?     'Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 146
 
                               Capability Shader
@@ -366,6 +368,7 @@
                               MemoryModel Logical GLSL450
                               EntryPoint Fragment 4  "main" 138 142
                               ExecutionMode 4 OriginUpperLeft
+                              ExecutionMode 4 DepthReplacing
                               Source HLSL 500
                               Name 4  "main"
                               Name 8  "PS_OUTPUT"
@@ -393,8 +396,8 @@
                               Name 114  "g_tTexcdu4"
                               Name 125  "psout"
                               Name 135  "flattenTemp"
-                              Name 138  "Color"
-                              Name 142  "Depth"
+                              Name 138  "@entryPointOutput.Color"
+                              Name 142  "@entryPointOutput.Depth"
                               Name 145  "g_tTex1df4a"
                               Decorate 16(g_tTex1df4) DescriptorSet 0
                               Decorate 16(g_tTex1df4) Binding 0
@@ -408,8 +411,8 @@
                               Decorate 94(g_tTexcdf4) DescriptorSet 0
                               Decorate 104(g_tTexcdi4) DescriptorSet 0
                               Decorate 114(g_tTexcdu4) DescriptorSet 0
-                              Decorate 138(Color) Location 0
-                              Decorate 142(Depth) BuiltIn FragDepth
+                              Decorate 138(@entryPointOutput.Color) Location 0
+                              Decorate 142(@entryPointOutput.Depth) BuiltIn FragDepth
                               Decorate 145(g_tTex1df4a) DescriptorSet 0
                               Decorate 145(g_tTex1df4a) Binding 1
                2:             TypeVoid
@@ -491,9 +494,9 @@
              129:     30(int) Constant 1
              130:             TypePointer Function 6(float)
              137:             TypePointer Output 7(fvec4)
-      138(Color):    137(ptr) Variable Output
+138(@entryPointOutput.Color):    137(ptr) Variable Output
              141:             TypePointer Output 6(float)
-      142(Depth):    141(ptr) Variable Output
+142(@entryPointOutput.Depth):    141(ptr) Variable Output
 145(g_tTex1df4a):     15(ptr) Variable UniformConstant
          4(main):           2 Function None 3
                5:             Label
@@ -502,10 +505,10 @@
                               Store 135(flattenTemp) 136
              139:     12(ptr) AccessChain 135(flattenTemp) 126
              140:    7(fvec4) Load 139
-                              Store 138(Color) 140
+                              Store 138(@entryPointOutput.Color) 140
              143:    130(ptr) AccessChain 135(flattenTemp) 129
              144:    6(float) Load 143
-                              Store 142(Depth) 144
+                              Store 142(@entryPointOutput.Depth) 144
                               Return
                               FunctionEnd
       10(@main():8(PS_OUTPUT) Function None 9
diff --git a/Test/baseResults/hlsl.samplebias.basic.dx10.frag.out b/Test/baseResults/hlsl.samplebias.basic.dx10.frag.out
index cff271f..21794f9 100644
--- a/Test/baseResults/hlsl.samplebias.basic.dx10.frag.out
+++ b/Test/baseResults/hlsl.samplebias.basic.dx10.frag.out
@@ -1,6 +1,7 @@
 hlsl.samplebias.basic.dx10.frag
 Shader version: 500
 gl_FragCoord origin is upper left
+using depth_any
 0:? Sequence
 0:28  Function Definition: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:28    Function Parameters: 
@@ -179,13 +180,13 @@
 0:28          'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:28          Function Call: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:28        move second child to first child ( temp 4-component vector of float)
-0:?           'Color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 0:28          Color: direct index for structure ( temp 4-component vector of float)
 0:28            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:28            Constant:
 0:28              0 (const int)
 0:28        move second child to first child ( temp float)
-0:?           'Depth' ( out float FragDepth)
+0:?           '@entryPointOutput.Depth' ( out float FragDepth)
 0:28          Depth: direct index for structure ( temp float)
 0:28            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:28            Constant:
@@ -205,8 +206,8 @@
 0:?     'g_tTexcdf4' ( uniform textureCube)
 0:?     'g_tTexcdi4' ( uniform itextureCube)
 0:?     'g_tTexcdu4' ( uniform utextureCube)
-0:?     'Color' (layout( location=0) out 4-component vector of float)
-0:?     'Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 
 Linked fragment stage:
@@ -214,6 +215,7 @@
 
 Shader version: 500
 gl_FragCoord origin is upper left
+using depth_any
 0:? Sequence
 0:28  Function Definition: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:28    Function Parameters: 
@@ -392,13 +394,13 @@
 0:28          'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:28          Function Call: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:28        move second child to first child ( temp 4-component vector of float)
-0:?           'Color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 0:28          Color: direct index for structure ( temp 4-component vector of float)
 0:28            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:28            Constant:
 0:28              0 (const int)
 0:28        move second child to first child ( temp float)
-0:?           'Depth' ( out float FragDepth)
+0:?           '@entryPointOutput.Depth' ( out float FragDepth)
 0:28          Depth: direct index for structure ( temp float)
 0:28            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:28            Constant:
@@ -418,11 +420,11 @@
 0:?     'g_tTexcdf4' ( uniform textureCube)
 0:?     'g_tTexcdi4' ( uniform itextureCube)
 0:?     'g_tTexcdu4' ( uniform utextureCube)
-0:?     'Color' (layout( location=0) out 4-component vector of float)
-0:?     'Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 170
 
                               Capability Shader
@@ -431,6 +433,7 @@
                               MemoryModel Logical GLSL450
                               EntryPoint Fragment 4  "main" 162 166
                               ExecutionMode 4 OriginUpperLeft
+                              ExecutionMode 4 DepthReplacing
                               Source HLSL 500
                               Name 4  "main"
                               Name 8  "PS_OUTPUT"
@@ -464,8 +467,8 @@
                               Name 141  "g_tTexcdu4"
                               Name 148  "psout"
                               Name 159  "flattenTemp"
-                              Name 162  "Color"
-                              Name 166  "Depth"
+                              Name 162  "@entryPointOutput.Color"
+                              Name 166  "@entryPointOutput.Depth"
                               Name 169  "g_tTex1df4a"
                               Decorate 16(g_tTex1df4) DescriptorSet 0
                               Decorate 16(g_tTex1df4) Binding 0
@@ -482,8 +485,8 @@
                               Decorate 123(g_tTexcdf4) DescriptorSet 0
                               Decorate 132(g_tTexcdi4) DescriptorSet 0
                               Decorate 141(g_tTexcdu4) DescriptorSet 0
-                              Decorate 162(Color) Location 0
-                              Decorate 166(Depth) BuiltIn FragDepth
+                              Decorate 162(@entryPointOutput.Color) Location 0
+                              Decorate 166(@entryPointOutput.Depth) BuiltIn FragDepth
                               Decorate 169(g_tTex1df4a) DescriptorSet 0
                               Decorate 169(g_tTex1df4a) Binding 1
                2:             TypeVoid
@@ -574,9 +577,9 @@
              153:     27(int) Constant 1
              154:             TypePointer Function 6(float)
              161:             TypePointer Output 7(fvec4)
-      162(Color):    161(ptr) Variable Output
+162(@entryPointOutput.Color):    161(ptr) Variable Output
              165:             TypePointer Output 6(float)
-      166(Depth):    165(ptr) Variable Output
+166(@entryPointOutput.Depth):    165(ptr) Variable Output
 169(g_tTex1df4a):     15(ptr) Variable UniformConstant
          4(main):           2 Function None 3
                5:             Label
@@ -585,10 +588,10 @@
                               Store 159(flattenTemp) 160
              163:     12(ptr) AccessChain 159(flattenTemp) 149
              164:    7(fvec4) Load 163
-                              Store 162(Color) 164
+                              Store 162(@entryPointOutput.Color) 164
              167:    154(ptr) AccessChain 159(flattenTemp) 153
              168:    6(float) Load 167
-                              Store 166(Depth) 168
+                              Store 166(@entryPointOutput.Depth) 168
                               Return
                               FunctionEnd
       10(@main():8(PS_OUTPUT) Function None 9
diff --git a/Test/baseResults/hlsl.samplebias.offset.dx10.frag.out b/Test/baseResults/hlsl.samplebias.offset.dx10.frag.out
index b05d1d7..ae492e4 100644
--- a/Test/baseResults/hlsl.samplebias.offset.dx10.frag.out
+++ b/Test/baseResults/hlsl.samplebias.offset.dx10.frag.out
@@ -1,6 +1,7 @@
 hlsl.samplebias.offset.dx10.frag
 Shader version: 500
 gl_FragCoord origin is upper left
+using depth_any
 0:? Sequence
 0:28  Function Definition: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:28    Function Parameters: 
@@ -167,13 +168,13 @@
 0:28          'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:28          Function Call: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:28        move second child to first child ( temp 4-component vector of float)
-0:?           'Color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 0:28          Color: direct index for structure ( temp 4-component vector of float)
 0:28            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:28            Constant:
 0:28              0 (const int)
 0:28        move second child to first child ( temp float)
-0:?           'Depth' ( out float FragDepth)
+0:?           '@entryPointOutput.Depth' ( out float FragDepth)
 0:28          Depth: direct index for structure ( temp float)
 0:28            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:28            Constant:
@@ -193,8 +194,8 @@
 0:?     'g_tTexcdf4' ( uniform textureCube)
 0:?     'g_tTexcdi4' ( uniform itextureCube)
 0:?     'g_tTexcdu4' ( uniform utextureCube)
-0:?     'Color' (layout( location=0) out 4-component vector of float)
-0:?     'Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 
 Linked fragment stage:
@@ -202,6 +203,7 @@
 
 Shader version: 500
 gl_FragCoord origin is upper left
+using depth_any
 0:? Sequence
 0:28  Function Definition: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:28    Function Parameters: 
@@ -368,13 +370,13 @@
 0:28          'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:28          Function Call: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:28        move second child to first child ( temp 4-component vector of float)
-0:?           'Color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 0:28          Color: direct index for structure ( temp 4-component vector of float)
 0:28            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:28            Constant:
 0:28              0 (const int)
 0:28        move second child to first child ( temp float)
-0:?           'Depth' ( out float FragDepth)
+0:?           '@entryPointOutput.Depth' ( out float FragDepth)
 0:28          Depth: direct index for structure ( temp float)
 0:28            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:28            Constant:
@@ -394,11 +396,15 @@
 0:?     'g_tTexcdf4' ( uniform textureCube)
 0:?     'g_tTexcdi4' ( uniform itextureCube)
 0:?     'g_tTexcdu4' ( uniform utextureCube)
-0:?     'Color' (layout( location=0) out 4-component vector of float)
-0:?     'Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
+
+error: SPIRV-Tools Validation Errors
+error: Expected Image Operand Bias to be float scalar
+  %28 = OpImageSampleImplicitLod %v4float %23 %float_0_100000001 Bias|ConstOffset %int_1 %float_0_5
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 161
 
                               Capability Shader
@@ -407,6 +413,7 @@
                               MemoryModel Logical GLSL450
                               EntryPoint Fragment 4  "main" 144 148
                               ExecutionMode 4 OriginUpperLeft
+                              ExecutionMode 4 DepthReplacing
                               Source HLSL 500
                               Name 4  "main"
                               Name 8  "PS_OUTPUT"
@@ -434,8 +441,8 @@
                               Name 120  "g_tTex3du4"
                               Name 132  "psout"
                               Name 141  "flattenTemp"
-                              Name 144  "Color"
-                              Name 148  "Depth"
+                              Name 144  "@entryPointOutput.Color"
+                              Name 148  "@entryPointOutput.Depth"
                               Name 151  "g_tTex1df4a"
                               Name 154  "g_tTexcdf4"
                               Name 157  "g_tTexcdi4"
@@ -452,8 +459,8 @@
                               Decorate 96(g_tTex3df4) DescriptorSet 0
                               Decorate 109(g_tTex3di4) DescriptorSet 0
                               Decorate 120(g_tTex3du4) DescriptorSet 0
-                              Decorate 144(Color) Location 0
-                              Decorate 148(Depth) BuiltIn FragDepth
+                              Decorate 144(@entryPointOutput.Color) Location 0
+                              Decorate 148(@entryPointOutput.Depth) BuiltIn FragDepth
                               Decorate 151(g_tTex1df4a) DescriptorSet 0
                               Decorate 151(g_tTex1df4a) Binding 1
                               Decorate 154(g_tTexcdf4) DescriptorSet 0
@@ -544,9 +551,9 @@
              134:    7(fvec4) ConstantComposite 133 133 133 133
              136:             TypePointer Function 6(float)
              143:             TypePointer Output 7(fvec4)
-      144(Color):    143(ptr) Variable Output
+144(@entryPointOutput.Color):    143(ptr) Variable Output
              147:             TypePointer Output 6(float)
-      148(Depth):    147(ptr) Variable Output
+148(@entryPointOutput.Depth):    147(ptr) Variable Output
 151(g_tTex1df4a):     15(ptr) Variable UniformConstant
              152:             TypeImage 6(float) Cube sampled format:Unknown
              153:             TypePointer UniformConstant 152
@@ -564,10 +571,10 @@
                               Store 141(flattenTemp) 142
              145:     12(ptr) AccessChain 141(flattenTemp) 65
              146:    7(fvec4) Load 145
-                              Store 144(Color) 146
+                              Store 144(@entryPointOutput.Color) 146
              149:    136(ptr) AccessChain 141(flattenTemp) 27
              150:    6(float) Load 149
-                              Store 148(Depth) 150
+                              Store 148(@entryPointOutput.Depth) 150
                               Return
                               FunctionEnd
       10(@main():8(PS_OUTPUT) Function None 9
diff --git a/Test/baseResults/hlsl.samplebias.offsetarray.dx10.frag.out b/Test/baseResults/hlsl.samplebias.offsetarray.dx10.frag.out
index e718743..0cea767 100644
--- a/Test/baseResults/hlsl.samplebias.offsetarray.dx10.frag.out
+++ b/Test/baseResults/hlsl.samplebias.offsetarray.dx10.frag.out
@@ -1,6 +1,7 @@
 hlsl.samplebias.offsetarray.dx10.frag
 Shader version: 500
 gl_FragCoord origin is upper left
+using depth_any
 0:? Sequence
 0:20  Function Definition: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:20    Function Parameters: 
@@ -122,13 +123,13 @@
 0:20          'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:20          Function Call: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:20        move second child to first child ( temp 4-component vector of float)
-0:?           'Color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 0:20          Color: direct index for structure ( temp 4-component vector of float)
 0:20            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:20            Constant:
 0:20              0 (const int)
 0:20        move second child to first child ( temp float)
-0:?           'Depth' ( out float FragDepth)
+0:?           '@entryPointOutput.Depth' ( out float FragDepth)
 0:20          Depth: direct index for structure ( temp float)
 0:20            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:20            Constant:
@@ -142,8 +143,8 @@
 0:?     'g_tTex2df4' ( uniform texture2DArray)
 0:?     'g_tTex2di4' ( uniform itexture2DArray)
 0:?     'g_tTex2du4' ( uniform utexture2DArray)
-0:?     'Color' (layout( location=0) out 4-component vector of float)
-0:?     'Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 
 Linked fragment stage:
@@ -151,6 +152,7 @@
 
 Shader version: 500
 gl_FragCoord origin is upper left
+using depth_any
 0:? Sequence
 0:20  Function Definition: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:20    Function Parameters: 
@@ -272,13 +274,13 @@
 0:20          'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:20          Function Call: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:20        move second child to first child ( temp 4-component vector of float)
-0:?           'Color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 0:20          Color: direct index for structure ( temp 4-component vector of float)
 0:20            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:20            Constant:
 0:20              0 (const int)
 0:20        move second child to first child ( temp float)
-0:?           'Depth' ( out float FragDepth)
+0:?           '@entryPointOutput.Depth' ( out float FragDepth)
 0:20          Depth: direct index for structure ( temp float)
 0:20            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:20            Constant:
@@ -292,11 +294,15 @@
 0:?     'g_tTex2df4' ( uniform texture2DArray)
 0:?     'g_tTex2di4' ( uniform itexture2DArray)
 0:?     'g_tTex2du4' ( uniform utexture2DArray)
-0:?     'Color' (layout( location=0) out 4-component vector of float)
-0:?     'Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
+
+error: SPIRV-Tools Validation Errors
+error: Expected Image Operand Bias to be float scalar
+  %31 = OpImageSampleImplicitLod %v4float %23 %27 Bias|ConstOffset %int_0 %float_0_5
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 118
 
                               Capability Shader
@@ -305,6 +311,7 @@
                               MemoryModel Logical GLSL450
                               EntryPoint Fragment 4  "main" 110 114
                               ExecutionMode 4 OriginUpperLeft
+                              ExecutionMode 4 DepthReplacing
                               Source HLSL 500
                               Name 4  "main"
                               Name 8  "PS_OUTPUT"
@@ -326,8 +333,8 @@
                               Name 87  "g_tTex2du4"
                               Name 98  "psout"
                               Name 107  "flattenTemp"
-                              Name 110  "Color"
-                              Name 114  "Depth"
+                              Name 110  "@entryPointOutput.Color"
+                              Name 114  "@entryPointOutput.Depth"
                               Name 117  "g_tTex1df4a"
                               Decorate 16(g_tTex1df4) DescriptorSet 0
                               Decorate 16(g_tTex1df4) Binding 0
@@ -338,8 +345,8 @@
                               Decorate 64(g_tTex2df4) DescriptorSet 0
                               Decorate 77(g_tTex2di4) DescriptorSet 0
                               Decorate 87(g_tTex2du4) DescriptorSet 0
-                              Decorate 110(Color) Location 0
-                              Decorate 114(Depth) BuiltIn FragDepth
+                              Decorate 110(@entryPointOutput.Color) Location 0
+                              Decorate 114(@entryPointOutput.Depth) BuiltIn FragDepth
                               Decorate 117(g_tTex1df4a) DescriptorSet 0
                               Decorate 117(g_tTex1df4a) Binding 1
                2:             TypeVoid
@@ -408,9 +415,9 @@
              100:    7(fvec4) ConstantComposite 99 99 99 99
              102:             TypePointer Function 6(float)
              109:             TypePointer Output 7(fvec4)
-      110(Color):    109(ptr) Variable Output
+110(@entryPointOutput.Color):    109(ptr) Variable Output
              113:             TypePointer Output 6(float)
-      114(Depth):    113(ptr) Variable Output
+114(@entryPointOutput.Depth):    113(ptr) Variable Output
 117(g_tTex1df4a):     15(ptr) Variable UniformConstant
          4(main):           2 Function None 3
                5:             Label
@@ -419,10 +426,10 @@
                               Store 107(flattenTemp) 108
              111:     12(ptr) AccessChain 107(flattenTemp) 30
              112:    7(fvec4) Load 111
-                              Store 110(Color) 112
+                              Store 110(@entryPointOutput.Color) 112
              115:    102(ptr) AccessChain 107(flattenTemp) 44
              116:    6(float) Load 115
-                              Store 114(Depth) 116
+                              Store 114(@entryPointOutput.Depth) 116
                               Return
                               FunctionEnd
       10(@main():8(PS_OUTPUT) Function None 9
diff --git a/Test/baseResults/hlsl.samplecmp.array.dx10.frag.out b/Test/baseResults/hlsl.samplecmp.array.dx10.frag.out
index 1ddff1a..a41481d 100644
--- a/Test/baseResults/hlsl.samplecmp.array.dx10.frag.out
+++ b/Test/baseResults/hlsl.samplecmp.array.dx10.frag.out
@@ -1,6 +1,7 @@
 hlsl.samplecmp.array.dx10.frag
 Shader version: 500
 gl_FragCoord origin is upper left
+using depth_any
 0:? Sequence
 0:38  Function Definition: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:38    Function Parameters: 
@@ -10,7 +11,7 @@
 0:42          'r10' ( temp float)
 0:42          texture ( temp float)
 0:42            Construct combined texture-sampler ( temp sampler1DArrayShadow)
-0:42              'g_tTex1df4a' ( uniform texture1DArray)
+0:42              'g_tTex1df4a' ( uniform texture1DArrayShadow)
 0:42              'g_sSamp' (layout( binding=0) uniform sampler)
 0:42            Construct vec3 ( temp 3-component vector of float)
 0:?               Constant:
@@ -23,7 +24,7 @@
 0:43          'r12' ( temp float)
 0:43          texture ( temp float)
 0:43            Construct combined texture-sampler ( temp isampler1DArrayShadow)
-0:43              'g_tTex1di4a' ( uniform itexture1DArray)
+0:43              'g_tTex1di4a' ( uniform itexture1DArrayShadow)
 0:43              'g_sSamp' (layout( binding=0) uniform sampler)
 0:43            Construct vec3 ( temp 3-component vector of float)
 0:?               Constant:
@@ -36,7 +37,7 @@
 0:44          'r14' ( temp float)
 0:44          texture ( temp float)
 0:44            Construct combined texture-sampler ( temp usampler1DArrayShadow)
-0:44              'g_tTex1du4a' ( uniform utexture1DArray)
+0:44              'g_tTex1du4a' ( uniform utexture1DArrayShadow)
 0:44              'g_sSamp' (layout( binding=0) uniform sampler)
 0:44            Construct vec3 ( temp 3-component vector of float)
 0:?               Constant:
@@ -49,7 +50,7 @@
 0:47          'r30' ( temp float)
 0:47          texture ( temp float)
 0:47            Construct combined texture-sampler ( temp sampler2DArrayShadow)
-0:47              'g_tTex2df4a' ( uniform texture2DArray)
+0:47              'g_tTex2df4a' ( uniform texture2DArrayShadow)
 0:47              'g_sSamp' (layout( binding=0) uniform sampler)
 0:47            Construct vec4 ( temp 4-component vector of float)
 0:?               Constant:
@@ -63,7 +64,7 @@
 0:48          'r32' ( temp float)
 0:48          texture ( temp float)
 0:48            Construct combined texture-sampler ( temp isampler2DArrayShadow)
-0:48              'g_tTex2di4a' ( uniform itexture2DArray)
+0:48              'g_tTex2di4a' ( uniform itexture2DArrayShadow)
 0:48              'g_sSamp' (layout( binding=0) uniform sampler)
 0:48            Construct vec4 ( temp 4-component vector of float)
 0:?               Constant:
@@ -77,7 +78,7 @@
 0:49          'r34' ( temp float)
 0:49          texture ( temp float)
 0:49            Construct combined texture-sampler ( temp usampler2DArrayShadow)
-0:49              'g_tTex2du4a' ( uniform utexture2DArray)
+0:49              'g_tTex2du4a' ( uniform utexture2DArrayShadow)
 0:49              'g_sSamp' (layout( binding=0) uniform sampler)
 0:49            Construct vec4 ( temp 4-component vector of float)
 0:?               Constant:
@@ -91,7 +92,7 @@
 0:52          'r60' ( temp float)
 0:52          texture ( temp float)
 0:52            Construct combined texture-sampler ( temp samplerCubeArrayShadow)
-0:52              'g_tTexcdf4a' ( uniform textureCubeArray)
+0:52              'g_tTexcdf4a' ( uniform textureCubeArrayShadow)
 0:52              'g_sSamp' (layout( binding=0) uniform sampler)
 0:52            Construct vec4 ( temp 4-component vector of float)
 0:?               Constant:
@@ -106,7 +107,7 @@
 0:53          'r62' ( temp float)
 0:53          texture ( temp float)
 0:53            Construct combined texture-sampler ( temp isamplerCubeArrayShadow)
-0:53              'g_tTexcdi4a' ( uniform itextureCubeArray)
+0:53              'g_tTexcdi4a' ( uniform itextureCubeArrayShadow)
 0:53              'g_sSamp' (layout( binding=0) uniform sampler)
 0:53            Construct vec4 ( temp 4-component vector of float)
 0:?               Constant:
@@ -121,7 +122,7 @@
 0:54          'r64' ( temp float)
 0:54          texture ( temp float)
 0:54            Construct combined texture-sampler ( temp usamplerCubeArrayShadow)
-0:54              'g_tTexcdu4a' ( uniform utextureCubeArray)
+0:54              'g_tTexcdu4a' ( uniform utextureCubeArrayShadow)
 0:54              'g_sSamp' (layout( binding=0) uniform sampler)
 0:54            Construct vec4 ( temp 4-component vector of float)
 0:?               Constant:
@@ -158,13 +159,13 @@
 0:38          'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:38          Function Call: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:38        move second child to first child ( temp 4-component vector of float)
-0:?           'Color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 0:38          Color: direct index for structure ( temp 4-component vector of float)
 0:38            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:38            Constant:
 0:38              0 (const int)
 0:38        move second child to first child ( temp float)
-0:?           'Depth' ( out float FragDepth)
+0:?           '@entryPointOutput.Depth' ( out float FragDepth)
 0:38          Depth: direct index for structure ( temp float)
 0:38            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:38            Constant:
@@ -183,17 +184,17 @@
 0:?     'g_tTexcdf4' ( uniform textureCube)
 0:?     'g_tTexcdi4' ( uniform itextureCube)
 0:?     'g_tTexcdu4' ( uniform utextureCube)
-0:?     'g_tTex1df4a' ( uniform texture1DArray)
-0:?     'g_tTex1di4a' ( uniform itexture1DArray)
-0:?     'g_tTex1du4a' ( uniform utexture1DArray)
-0:?     'g_tTex2df4a' ( uniform texture2DArray)
-0:?     'g_tTex2di4a' ( uniform itexture2DArray)
-0:?     'g_tTex2du4a' ( uniform utexture2DArray)
-0:?     'g_tTexcdf4a' ( uniform textureCubeArray)
-0:?     'g_tTexcdi4a' ( uniform itextureCubeArray)
-0:?     'g_tTexcdu4a' ( uniform utextureCubeArray)
-0:?     'Color' (layout( location=0) out 4-component vector of float)
-0:?     'Depth' ( out float FragDepth)
+0:?     'g_tTex1df4a' ( uniform texture1DArrayShadow)
+0:?     'g_tTex1di4a' ( uniform itexture1DArrayShadow)
+0:?     'g_tTex1du4a' ( uniform utexture1DArrayShadow)
+0:?     'g_tTex2df4a' ( uniform texture2DArrayShadow)
+0:?     'g_tTex2di4a' ( uniform itexture2DArrayShadow)
+0:?     'g_tTex2du4a' ( uniform utexture2DArrayShadow)
+0:?     'g_tTexcdf4a' ( uniform textureCubeArrayShadow)
+0:?     'g_tTexcdi4a' ( uniform itextureCubeArrayShadow)
+0:?     'g_tTexcdu4a' ( uniform utextureCubeArrayShadow)
+0:?     '@entryPointOutput.Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 
 Linked fragment stage:
@@ -201,6 +202,7 @@
 
 Shader version: 500
 gl_FragCoord origin is upper left
+using depth_any
 0:? Sequence
 0:38  Function Definition: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:38    Function Parameters: 
@@ -210,7 +212,7 @@
 0:42          'r10' ( temp float)
 0:42          texture ( temp float)
 0:42            Construct combined texture-sampler ( temp sampler1DArrayShadow)
-0:42              'g_tTex1df4a' ( uniform texture1DArray)
+0:42              'g_tTex1df4a' ( uniform texture1DArrayShadow)
 0:42              'g_sSamp' (layout( binding=0) uniform sampler)
 0:42            Construct vec3 ( temp 3-component vector of float)
 0:?               Constant:
@@ -223,7 +225,7 @@
 0:43          'r12' ( temp float)
 0:43          texture ( temp float)
 0:43            Construct combined texture-sampler ( temp isampler1DArrayShadow)
-0:43              'g_tTex1di4a' ( uniform itexture1DArray)
+0:43              'g_tTex1di4a' ( uniform itexture1DArrayShadow)
 0:43              'g_sSamp' (layout( binding=0) uniform sampler)
 0:43            Construct vec3 ( temp 3-component vector of float)
 0:?               Constant:
@@ -236,7 +238,7 @@
 0:44          'r14' ( temp float)
 0:44          texture ( temp float)
 0:44            Construct combined texture-sampler ( temp usampler1DArrayShadow)
-0:44              'g_tTex1du4a' ( uniform utexture1DArray)
+0:44              'g_tTex1du4a' ( uniform utexture1DArrayShadow)
 0:44              'g_sSamp' (layout( binding=0) uniform sampler)
 0:44            Construct vec3 ( temp 3-component vector of float)
 0:?               Constant:
@@ -249,7 +251,7 @@
 0:47          'r30' ( temp float)
 0:47          texture ( temp float)
 0:47            Construct combined texture-sampler ( temp sampler2DArrayShadow)
-0:47              'g_tTex2df4a' ( uniform texture2DArray)
+0:47              'g_tTex2df4a' ( uniform texture2DArrayShadow)
 0:47              'g_sSamp' (layout( binding=0) uniform sampler)
 0:47            Construct vec4 ( temp 4-component vector of float)
 0:?               Constant:
@@ -263,7 +265,7 @@
 0:48          'r32' ( temp float)
 0:48          texture ( temp float)
 0:48            Construct combined texture-sampler ( temp isampler2DArrayShadow)
-0:48              'g_tTex2di4a' ( uniform itexture2DArray)
+0:48              'g_tTex2di4a' ( uniform itexture2DArrayShadow)
 0:48              'g_sSamp' (layout( binding=0) uniform sampler)
 0:48            Construct vec4 ( temp 4-component vector of float)
 0:?               Constant:
@@ -277,7 +279,7 @@
 0:49          'r34' ( temp float)
 0:49          texture ( temp float)
 0:49            Construct combined texture-sampler ( temp usampler2DArrayShadow)
-0:49              'g_tTex2du4a' ( uniform utexture2DArray)
+0:49              'g_tTex2du4a' ( uniform utexture2DArrayShadow)
 0:49              'g_sSamp' (layout( binding=0) uniform sampler)
 0:49            Construct vec4 ( temp 4-component vector of float)
 0:?               Constant:
@@ -291,7 +293,7 @@
 0:52          'r60' ( temp float)
 0:52          texture ( temp float)
 0:52            Construct combined texture-sampler ( temp samplerCubeArrayShadow)
-0:52              'g_tTexcdf4a' ( uniform textureCubeArray)
+0:52              'g_tTexcdf4a' ( uniform textureCubeArrayShadow)
 0:52              'g_sSamp' (layout( binding=0) uniform sampler)
 0:52            Construct vec4 ( temp 4-component vector of float)
 0:?               Constant:
@@ -306,7 +308,7 @@
 0:53          'r62' ( temp float)
 0:53          texture ( temp float)
 0:53            Construct combined texture-sampler ( temp isamplerCubeArrayShadow)
-0:53              'g_tTexcdi4a' ( uniform itextureCubeArray)
+0:53              'g_tTexcdi4a' ( uniform itextureCubeArrayShadow)
 0:53              'g_sSamp' (layout( binding=0) uniform sampler)
 0:53            Construct vec4 ( temp 4-component vector of float)
 0:?               Constant:
@@ -321,7 +323,7 @@
 0:54          'r64' ( temp float)
 0:54          texture ( temp float)
 0:54            Construct combined texture-sampler ( temp usamplerCubeArrayShadow)
-0:54              'g_tTexcdu4a' ( uniform utextureCubeArray)
+0:54              'g_tTexcdu4a' ( uniform utextureCubeArrayShadow)
 0:54              'g_sSamp' (layout( binding=0) uniform sampler)
 0:54            Construct vec4 ( temp 4-component vector of float)
 0:?               Constant:
@@ -358,13 +360,13 @@
 0:38          'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:38          Function Call: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:38        move second child to first child ( temp 4-component vector of float)
-0:?           'Color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 0:38          Color: direct index for structure ( temp 4-component vector of float)
 0:38            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:38            Constant:
 0:38              0 (const int)
 0:38        move second child to first child ( temp float)
-0:?           'Depth' ( out float FragDepth)
+0:?           '@entryPointOutput.Depth' ( out float FragDepth)
 0:38          Depth: direct index for structure ( temp float)
 0:38            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:38            Constant:
@@ -383,29 +385,34 @@
 0:?     'g_tTexcdf4' ( uniform textureCube)
 0:?     'g_tTexcdi4' ( uniform itextureCube)
 0:?     'g_tTexcdu4' ( uniform utextureCube)
-0:?     'g_tTex1df4a' ( uniform texture1DArray)
-0:?     'g_tTex1di4a' ( uniform itexture1DArray)
-0:?     'g_tTex1du4a' ( uniform utexture1DArray)
-0:?     'g_tTex2df4a' ( uniform texture2DArray)
-0:?     'g_tTex2di4a' ( uniform itexture2DArray)
-0:?     'g_tTex2du4a' ( uniform utexture2DArray)
-0:?     'g_tTexcdf4a' ( uniform textureCubeArray)
-0:?     'g_tTexcdi4a' ( uniform itextureCubeArray)
-0:?     'g_tTexcdu4a' ( uniform utextureCubeArray)
-0:?     'Color' (layout( location=0) out 4-component vector of float)
-0:?     'Depth' ( out float FragDepth)
+0:?     'g_tTex1df4a' ( uniform texture1DArrayShadow)
+0:?     'g_tTex1di4a' ( uniform itexture1DArrayShadow)
+0:?     'g_tTex1du4a' ( uniform utexture1DArrayShadow)
+0:?     'g_tTex2df4a' ( uniform texture2DArrayShadow)
+0:?     'g_tTex2di4a' ( uniform itexture2DArrayShadow)
+0:?     'g_tTex2du4a' ( uniform utexture2DArrayShadow)
+0:?     'g_tTexcdf4a' ( uniform textureCubeArrayShadow)
+0:?     'g_tTexcdi4a' ( uniform itextureCubeArrayShadow)
+0:?     'g_tTexcdu4a' ( uniform utextureCubeArrayShadow)
+0:?     '@entryPointOutput.Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
+
+error: SPIRV-Tools Validation Errors
+error: Expected Image 'Sampled Type' to be the same as Result Type
+  %48 = OpImageSampleDrefImplicitLod %float %43 %46 %47
 
 // Module Version 10000
-// Generated by (magic number): 80001
-// Id's are bound by 218
+// Generated by (magic number): 80007
+// Id's are bound by 209
 
                               Capability Shader
                               Capability Sampled1D
                               Capability SampledCubeArray
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "main" 175 179
+                              EntryPoint Fragment 4  "main" 166 170
                               ExecutionMode 4 OriginUpperLeft
+                              ExecutionMode 4 DepthReplacing
                               Source HLSL 500
                               Name 4  "main"
                               Name 8  "PS_OUTPUT"
@@ -415,64 +422,64 @@
                               Name 13  "r10"
                               Name 16  "g_tTex1df4a"
                               Name 20  "g_sSamp"
-                              Name 36  "r12"
-                              Name 40  "g_tTex1di4a"
-                              Name 51  "r14"
-                              Name 55  "g_tTex1du4a"
-                              Name 66  "r30"
-                              Name 69  "g_tTex2df4a"
-                              Name 83  "r32"
-                              Name 86  "g_tTex2di4a"
-                              Name 98  "r34"
-                              Name 101  "g_tTex2du4a"
-                              Name 113  "r60"
-                              Name 116  "g_tTexcdf4a"
-                              Name 130  "r62"
-                              Name 133  "g_tTexcdi4a"
-                              Name 145  "r64"
-                              Name 148  "g_tTexcdu4a"
-                              Name 161  "psout"
-                              Name 172  "flattenTemp"
-                              Name 175  "Color"
-                              Name 179  "Depth"
-                              Name 184  "g_tTex1df4"
-                              Name 187  "g_tTex1di4"
-                              Name 190  "g_tTex1du4"
-                              Name 193  "g_tTex2df4"
-                              Name 196  "g_tTex2di4"
-                              Name 199  "g_tTex2du4"
-                              Name 202  "g_tTex3df4"
-                              Name 205  "g_tTex3di4"
-                              Name 208  "g_tTex3du4"
-                              Name 211  "g_tTexcdf4"
-                              Name 214  "g_tTexcdi4"
-                              Name 217  "g_tTexcdu4"
+                              Name 35  "r12"
+                              Name 39  "g_tTex1di4a"
+                              Name 49  "r14"
+                              Name 53  "g_tTex1du4a"
+                              Name 63  "r30"
+                              Name 66  "g_tTex2df4a"
+                              Name 79  "r32"
+                              Name 82  "g_tTex2di4a"
+                              Name 93  "r34"
+                              Name 96  "g_tTex2du4a"
+                              Name 107  "r60"
+                              Name 110  "g_tTexcdf4a"
+                              Name 123  "r62"
+                              Name 126  "g_tTexcdi4a"
+                              Name 137  "r64"
+                              Name 140  "g_tTexcdu4a"
+                              Name 152  "psout"
+                              Name 163  "flattenTemp"
+                              Name 166  "@entryPointOutput.Color"
+                              Name 170  "@entryPointOutput.Depth"
+                              Name 175  "g_tTex1df4"
+                              Name 178  "g_tTex1di4"
+                              Name 181  "g_tTex1du4"
+                              Name 184  "g_tTex2df4"
+                              Name 187  "g_tTex2di4"
+                              Name 190  "g_tTex2du4"
+                              Name 193  "g_tTex3df4"
+                              Name 196  "g_tTex3di4"
+                              Name 199  "g_tTex3du4"
+                              Name 202  "g_tTexcdf4"
+                              Name 205  "g_tTexcdi4"
+                              Name 208  "g_tTexcdu4"
                               Decorate 16(g_tTex1df4a) DescriptorSet 0
                               Decorate 20(g_sSamp) DescriptorSet 0
                               Decorate 20(g_sSamp) Binding 0
-                              Decorate 40(g_tTex1di4a) DescriptorSet 0
-                              Decorate 55(g_tTex1du4a) DescriptorSet 0
-                              Decorate 69(g_tTex2df4a) DescriptorSet 0
-                              Decorate 86(g_tTex2di4a) DescriptorSet 0
-                              Decorate 101(g_tTex2du4a) DescriptorSet 0
-                              Decorate 116(g_tTexcdf4a) DescriptorSet 0
-                              Decorate 133(g_tTexcdi4a) DescriptorSet 0
-                              Decorate 148(g_tTexcdu4a) DescriptorSet 0
-                              Decorate 175(Color) Location 0
-                              Decorate 179(Depth) BuiltIn FragDepth
-                              Decorate 184(g_tTex1df4) DescriptorSet 0
-                              Decorate 184(g_tTex1df4) Binding 0
-                              Decorate 187(g_tTex1di4) DescriptorSet 0
-                              Decorate 190(g_tTex1du4) DescriptorSet 0
-                              Decorate 193(g_tTex2df4) DescriptorSet 0
-                              Decorate 196(g_tTex2di4) DescriptorSet 0
-                              Decorate 199(g_tTex2du4) DescriptorSet 0
-                              Decorate 202(g_tTex3df4) DescriptorSet 0
-                              Decorate 205(g_tTex3di4) DescriptorSet 0
-                              Decorate 208(g_tTex3du4) DescriptorSet 0
-                              Decorate 211(g_tTexcdf4) DescriptorSet 0
-                              Decorate 214(g_tTexcdi4) DescriptorSet 0
-                              Decorate 217(g_tTexcdu4) DescriptorSet 0
+                              Decorate 39(g_tTex1di4a) DescriptorSet 0
+                              Decorate 53(g_tTex1du4a) DescriptorSet 0
+                              Decorate 66(g_tTex2df4a) DescriptorSet 0
+                              Decorate 82(g_tTex2di4a) DescriptorSet 0
+                              Decorate 96(g_tTex2du4a) DescriptorSet 0
+                              Decorate 110(g_tTexcdf4a) DescriptorSet 0
+                              Decorate 126(g_tTexcdi4a) DescriptorSet 0
+                              Decorate 140(g_tTexcdu4a) DescriptorSet 0
+                              Decorate 166(@entryPointOutput.Color) Location 0
+                              Decorate 170(@entryPointOutput.Depth) BuiltIn FragDepth
+                              Decorate 175(g_tTex1df4) DescriptorSet 0
+                              Decorate 175(g_tTex1df4) Binding 0
+                              Decorate 178(g_tTex1di4) DescriptorSet 0
+                              Decorate 181(g_tTex1du4) DescriptorSet 0
+                              Decorate 184(g_tTex2df4) DescriptorSet 0
+                              Decorate 187(g_tTex2di4) DescriptorSet 0
+                              Decorate 190(g_tTex2du4) DescriptorSet 0
+                              Decorate 193(g_tTex3df4) DescriptorSet 0
+                              Decorate 196(g_tTex3di4) DescriptorSet 0
+                              Decorate 199(g_tTex3du4) DescriptorSet 0
+                              Decorate 202(g_tTexcdf4) DescriptorSet 0
+                              Decorate 205(g_tTexcdi4) DescriptorSet 0
+                              Decorate 208(g_tTexcdu4) DescriptorSet 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -480,228 +487,219 @@
     8(PS_OUTPUT):             TypeStruct 7(fvec4) 6(float)
                9:             TypeFunction 8(PS_OUTPUT)
               12:             TypePointer Function 6(float)
-              14:             TypeImage 6(float) 1D array sampled format:Unknown
+              14:             TypeImage 6(float) 1D depth array sampled format:Unknown
               15:             TypePointer UniformConstant 14
  16(g_tTex1df4a):     15(ptr) Variable UniformConstant
               18:             TypeSampler
               19:             TypePointer UniformConstant 18
      20(g_sSamp):     19(ptr) Variable UniformConstant
-              22:             TypeImage 6(float) 1D depth array sampled format:Unknown
-              23:             TypeSampledImage 22
-              25:             TypeVector 6(float) 2
-              26:    6(float) Constant 1036831949
-              27:    6(float) Constant 1045220557
-              28:   25(fvec2) ConstantComposite 26 27
-              29:    6(float) Constant 1061158912
-              30:             TypeVector 6(float) 3
-              37:             TypeInt 32 1
-              38:             TypeImage 37(int) 1D array sampled format:Unknown
-              39:             TypePointer UniformConstant 38
- 40(g_tTex1di4a):     39(ptr) Variable UniformConstant
-              43:             TypeImage 37(int) 1D depth array sampled format:Unknown
-              44:             TypeSampledImage 43
-              52:             TypeInt 32 0
-              53:             TypeImage 52(int) 1D array sampled format:Unknown
-              54:             TypePointer UniformConstant 53
- 55(g_tTex1du4a):     54(ptr) Variable UniformConstant
-              58:             TypeImage 52(int) 1D depth array sampled format:Unknown
-              59:             TypeSampledImage 58
-              67:             TypeImage 6(float) 2D array sampled format:Unknown
-              68:             TypePointer UniformConstant 67
- 69(g_tTex2df4a):     68(ptr) Variable UniformConstant
-              72:             TypeImage 6(float) 2D depth array sampled format:Unknown
-              73:             TypeSampledImage 72
-              75:    6(float) Constant 1050253722
-              76:   30(fvec3) ConstantComposite 26 27 75
-              84:             TypeImage 37(int) 2D array sampled format:Unknown
-              85:             TypePointer UniformConstant 84
- 86(g_tTex2di4a):     85(ptr) Variable UniformConstant
-              89:             TypeImage 37(int) 2D depth array sampled format:Unknown
-              90:             TypeSampledImage 89
-              99:             TypeImage 52(int) 2D array sampled format:Unknown
-             100:             TypePointer UniformConstant 99
-101(g_tTex2du4a):    100(ptr) Variable UniformConstant
-             104:             TypeImage 52(int) 2D depth array sampled format:Unknown
-             105:             TypeSampledImage 104
-             114:             TypeImage 6(float) Cube array sampled format:Unknown
-             115:             TypePointer UniformConstant 114
-116(g_tTexcdf4a):    115(ptr) Variable UniformConstant
-             119:             TypeImage 6(float) Cube depth array sampled format:Unknown
-             120:             TypeSampledImage 119
-             122:    6(float) Constant 1053609165
-             123:    7(fvec4) ConstantComposite 26 27 75 122
-             131:             TypeImage 37(int) Cube array sampled format:Unknown
-             132:             TypePointer UniformConstant 131
-133(g_tTexcdi4a):    132(ptr) Variable UniformConstant
-             136:             TypeImage 37(int) Cube depth array sampled format:Unknown
-             137:             TypeSampledImage 136
-             146:             TypeImage 52(int) Cube array sampled format:Unknown
-             147:             TypePointer UniformConstant 146
-148(g_tTexcdu4a):    147(ptr) Variable UniformConstant
-             151:             TypeImage 52(int) Cube depth array sampled format:Unknown
-             152:             TypeSampledImage 151
-             160:             TypePointer Function 8(PS_OUTPUT)
-             162:     37(int) Constant 0
-             163:    6(float) Constant 1065353216
-             164:    7(fvec4) ConstantComposite 163 163 163 163
-             165:             TypePointer Function 7(fvec4)
-             167:     37(int) Constant 1
-             174:             TypePointer Output 7(fvec4)
-      175(Color):    174(ptr) Variable Output
-             178:             TypePointer Output 6(float)
-      179(Depth):    178(ptr) Variable Output
-             182:             TypeImage 6(float) 1D sampled format:Unknown
+              22:             TypeSampledImage 14
+              24:             TypeVector 6(float) 2
+              25:    6(float) Constant 1036831949
+              26:    6(float) Constant 1045220557
+              27:   24(fvec2) ConstantComposite 25 26
+              28:    6(float) Constant 1061158912
+              29:             TypeVector 6(float) 3
+              36:             TypeInt 32 1
+              37:             TypeImage 36(int) 1D depth array sampled format:Unknown
+              38:             TypePointer UniformConstant 37
+ 39(g_tTex1di4a):     38(ptr) Variable UniformConstant
+              42:             TypeSampledImage 37
+              50:             TypeInt 32 0
+              51:             TypeImage 50(int) 1D depth array sampled format:Unknown
+              52:             TypePointer UniformConstant 51
+ 53(g_tTex1du4a):     52(ptr) Variable UniformConstant
+              56:             TypeSampledImage 51
+              64:             TypeImage 6(float) 2D depth array sampled format:Unknown
+              65:             TypePointer UniformConstant 64
+ 66(g_tTex2df4a):     65(ptr) Variable UniformConstant
+              69:             TypeSampledImage 64
+              71:    6(float) Constant 1050253722
+              72:   29(fvec3) ConstantComposite 25 26 71
+              80:             TypeImage 36(int) 2D depth array sampled format:Unknown
+              81:             TypePointer UniformConstant 80
+ 82(g_tTex2di4a):     81(ptr) Variable UniformConstant
+              85:             TypeSampledImage 80
+              94:             TypeImage 50(int) 2D depth array sampled format:Unknown
+              95:             TypePointer UniformConstant 94
+ 96(g_tTex2du4a):     95(ptr) Variable UniformConstant
+              99:             TypeSampledImage 94
+             108:             TypeImage 6(float) Cube depth array sampled format:Unknown
+             109:             TypePointer UniformConstant 108
+110(g_tTexcdf4a):    109(ptr) Variable UniformConstant
+             113:             TypeSampledImage 108
+             115:    6(float) Constant 1053609165
+             116:    7(fvec4) ConstantComposite 25 26 71 115
+             124:             TypeImage 36(int) Cube depth array sampled format:Unknown
+             125:             TypePointer UniformConstant 124
+126(g_tTexcdi4a):    125(ptr) Variable UniformConstant
+             129:             TypeSampledImage 124
+             138:             TypeImage 50(int) Cube depth array sampled format:Unknown
+             139:             TypePointer UniformConstant 138
+140(g_tTexcdu4a):    139(ptr) Variable UniformConstant
+             143:             TypeSampledImage 138
+             151:             TypePointer Function 8(PS_OUTPUT)
+             153:     36(int) Constant 0
+             154:    6(float) Constant 1065353216
+             155:    7(fvec4) ConstantComposite 154 154 154 154
+             156:             TypePointer Function 7(fvec4)
+             158:     36(int) Constant 1
+             165:             TypePointer Output 7(fvec4)
+166(@entryPointOutput.Color):    165(ptr) Variable Output
+             169:             TypePointer Output 6(float)
+170(@entryPointOutput.Depth):    169(ptr) Variable Output
+             173:             TypeImage 6(float) 1D sampled format:Unknown
+             174:             TypePointer UniformConstant 173
+ 175(g_tTex1df4):    174(ptr) Variable UniformConstant
+             176:             TypeImage 36(int) 1D sampled format:Unknown
+             177:             TypePointer UniformConstant 176
+ 178(g_tTex1di4):    177(ptr) Variable UniformConstant
+             179:             TypeImage 50(int) 1D sampled format:Unknown
+             180:             TypePointer UniformConstant 179
+ 181(g_tTex1du4):    180(ptr) Variable UniformConstant
+             182:             TypeImage 6(float) 2D sampled format:Unknown
              183:             TypePointer UniformConstant 182
- 184(g_tTex1df4):    183(ptr) Variable UniformConstant
-             185:             TypeImage 37(int) 1D sampled format:Unknown
+ 184(g_tTex2df4):    183(ptr) Variable UniformConstant
+             185:             TypeImage 36(int) 2D sampled format:Unknown
              186:             TypePointer UniformConstant 185
- 187(g_tTex1di4):    186(ptr) Variable UniformConstant
-             188:             TypeImage 52(int) 1D sampled format:Unknown
+ 187(g_tTex2di4):    186(ptr) Variable UniformConstant
+             188:             TypeImage 50(int) 2D sampled format:Unknown
              189:             TypePointer UniformConstant 188
- 190(g_tTex1du4):    189(ptr) Variable UniformConstant
-             191:             TypeImage 6(float) 2D sampled format:Unknown
+ 190(g_tTex2du4):    189(ptr) Variable UniformConstant
+             191:             TypeImage 6(float) 3D sampled format:Unknown
              192:             TypePointer UniformConstant 191
- 193(g_tTex2df4):    192(ptr) Variable UniformConstant
-             194:             TypeImage 37(int) 2D sampled format:Unknown
+ 193(g_tTex3df4):    192(ptr) Variable UniformConstant
+             194:             TypeImage 36(int) 3D sampled format:Unknown
              195:             TypePointer UniformConstant 194
- 196(g_tTex2di4):    195(ptr) Variable UniformConstant
-             197:             TypeImage 52(int) 2D sampled format:Unknown
+ 196(g_tTex3di4):    195(ptr) Variable UniformConstant
+             197:             TypeImage 50(int) 3D sampled format:Unknown
              198:             TypePointer UniformConstant 197
- 199(g_tTex2du4):    198(ptr) Variable UniformConstant
-             200:             TypeImage 6(float) 3D sampled format:Unknown
+ 199(g_tTex3du4):    198(ptr) Variable UniformConstant
+             200:             TypeImage 6(float) Cube sampled format:Unknown
              201:             TypePointer UniformConstant 200
- 202(g_tTex3df4):    201(ptr) Variable UniformConstant
-             203:             TypeImage 37(int) 3D sampled format:Unknown
+ 202(g_tTexcdf4):    201(ptr) Variable UniformConstant
+             203:             TypeImage 36(int) Cube sampled format:Unknown
              204:             TypePointer UniformConstant 203
- 205(g_tTex3di4):    204(ptr) Variable UniformConstant
-             206:             TypeImage 52(int) 3D sampled format:Unknown
+ 205(g_tTexcdi4):    204(ptr) Variable UniformConstant
+             206:             TypeImage 50(int) Cube sampled format:Unknown
              207:             TypePointer UniformConstant 206
- 208(g_tTex3du4):    207(ptr) Variable UniformConstant
-             209:             TypeImage 6(float) Cube sampled format:Unknown
-             210:             TypePointer UniformConstant 209
- 211(g_tTexcdf4):    210(ptr) Variable UniformConstant
-             212:             TypeImage 37(int) Cube sampled format:Unknown
-             213:             TypePointer UniformConstant 212
- 214(g_tTexcdi4):    213(ptr) Variable UniformConstant
-             215:             TypeImage 52(int) Cube sampled format:Unknown
-             216:             TypePointer UniformConstant 215
- 217(g_tTexcdu4):    216(ptr) Variable UniformConstant
+ 208(g_tTexcdu4):    207(ptr) Variable UniformConstant
          4(main):           2 Function None 3
                5:             Label
-172(flattenTemp):    160(ptr) Variable Function
-             173:8(PS_OUTPUT) FunctionCall 10(@main()
-                              Store 172(flattenTemp) 173
-             176:    165(ptr) AccessChain 172(flattenTemp) 162
-             177:    7(fvec4) Load 176
-                              Store 175(Color) 177
-             180:     12(ptr) AccessChain 172(flattenTemp) 167
-             181:    6(float) Load 180
-                              Store 179(Depth) 181
+163(flattenTemp):    151(ptr) Variable Function
+             164:8(PS_OUTPUT) FunctionCall 10(@main()
+                              Store 163(flattenTemp) 164
+             167:    156(ptr) AccessChain 163(flattenTemp) 153
+             168:    7(fvec4) Load 167
+                              Store 166(@entryPointOutput.Color) 168
+             171:     12(ptr) AccessChain 163(flattenTemp) 158
+             172:    6(float) Load 171
+                              Store 170(@entryPointOutput.Depth) 172
                               Return
                               FunctionEnd
       10(@main():8(PS_OUTPUT) Function None 9
               11:             Label
          13(r10):     12(ptr) Variable Function
-         36(r12):     12(ptr) Variable Function
-         51(r14):     12(ptr) Variable Function
-         66(r30):     12(ptr) Variable Function
-         83(r32):     12(ptr) Variable Function
-         98(r34):     12(ptr) Variable Function
-        113(r60):     12(ptr) Variable Function
-        130(r62):     12(ptr) Variable Function
-        145(r64):     12(ptr) Variable Function
-      161(psout):    160(ptr) Variable Function
+         35(r12):     12(ptr) Variable Function
+         49(r14):     12(ptr) Variable Function
+         63(r30):     12(ptr) Variable Function
+         79(r32):     12(ptr) Variable Function
+         93(r34):     12(ptr) Variable Function
+        107(r60):     12(ptr) Variable Function
+        123(r62):     12(ptr) Variable Function
+        137(r64):     12(ptr) Variable Function
+      152(psout):    151(ptr) Variable Function
               17:          14 Load 16(g_tTex1df4a)
               21:          18 Load 20(g_sSamp)
-              24:          23 SampledImage 17 21
-              31:    6(float) CompositeExtract 28 0
-              32:    6(float) CompositeExtract 28 1
-              33:   30(fvec3) CompositeConstruct 31 32 29
-              34:    6(float) CompositeExtract 33 2
-              35:    6(float) ImageSampleDrefImplicitLod 24 33 34
-                              Store 13(r10) 35
-              41:          38 Load 40(g_tTex1di4a)
-              42:          18 Load 20(g_sSamp)
-              45:          44 SampledImage 41 42
-              46:    6(float) CompositeExtract 28 0
-              47:    6(float) CompositeExtract 28 1
-              48:   30(fvec3) CompositeConstruct 46 47 29
-              49:    6(float) CompositeExtract 48 2
-              50:    6(float) ImageSampleDrefImplicitLod 45 48 49
-                              Store 36(r12) 50
-              56:          53 Load 55(g_tTex1du4a)
-              57:          18 Load 20(g_sSamp)
-              60:          59 SampledImage 56 57
-              61:    6(float) CompositeExtract 28 0
-              62:    6(float) CompositeExtract 28 1
-              63:   30(fvec3) CompositeConstruct 61 62 29
-              64:    6(float) CompositeExtract 63 2
-              65:    6(float) ImageSampleDrefImplicitLod 60 63 64
-                              Store 51(r14) 65
-              70:          67 Load 69(g_tTex2df4a)
-              71:          18 Load 20(g_sSamp)
-              74:          73 SampledImage 70 71
-              77:    6(float) CompositeExtract 76 0
-              78:    6(float) CompositeExtract 76 1
-              79:    6(float) CompositeExtract 76 2
-              80:    7(fvec4) CompositeConstruct 77 78 79 29
-              81:    6(float) CompositeExtract 80 3
-              82:    6(float) ImageSampleDrefImplicitLod 74 80 81
-                              Store 66(r30) 82
-              87:          84 Load 86(g_tTex2di4a)
-              88:          18 Load 20(g_sSamp)
-              91:          90 SampledImage 87 88
-              92:    6(float) CompositeExtract 76 0
-              93:    6(float) CompositeExtract 76 1
-              94:    6(float) CompositeExtract 76 2
-              95:    7(fvec4) CompositeConstruct 92 93 94 29
-              96:    6(float) CompositeExtract 95 3
-              97:    6(float) ImageSampleDrefImplicitLod 91 95 96
-                              Store 83(r32) 97
-             102:          99 Load 101(g_tTex2du4a)
-             103:          18 Load 20(g_sSamp)
-             106:         105 SampledImage 102 103
-             107:    6(float) CompositeExtract 76 0
-             108:    6(float) CompositeExtract 76 1
-             109:    6(float) CompositeExtract 76 2
-             110:    7(fvec4) CompositeConstruct 107 108 109 29
-             111:    6(float) CompositeExtract 110 3
-             112:    6(float) ImageSampleDrefImplicitLod 106 110 111
-                              Store 98(r34) 112
-             117:         114 Load 116(g_tTexcdf4a)
-             118:          18 Load 20(g_sSamp)
-             121:         120 SampledImage 117 118
-             124:    6(float) CompositeExtract 123 0
-             125:    6(float) CompositeExtract 123 1
-             126:    6(float) CompositeExtract 123 2
-             127:    6(float) CompositeExtract 123 3
-             128:    7(fvec4) CompositeConstruct 124 125 126 127
-             129:    6(float) ImageSampleDrefImplicitLod 121 128 29
-                              Store 113(r60) 129
-             134:         131 Load 133(g_tTexcdi4a)
-             135:          18 Load 20(g_sSamp)
-             138:         137 SampledImage 134 135
-             139:    6(float) CompositeExtract 123 0
-             140:    6(float) CompositeExtract 123 1
-             141:    6(float) CompositeExtract 123 2
-             142:    6(float) CompositeExtract 123 3
-             143:    7(fvec4) CompositeConstruct 139 140 141 142
-             144:    6(float) ImageSampleDrefImplicitLod 138 143 29
-                              Store 130(r62) 144
-             149:         146 Load 148(g_tTexcdu4a)
-             150:          18 Load 20(g_sSamp)
-             153:         152 SampledImage 149 150
-             154:    6(float) CompositeExtract 123 0
-             155:    6(float) CompositeExtract 123 1
-             156:    6(float) CompositeExtract 123 2
-             157:    6(float) CompositeExtract 123 3
-             158:    7(fvec4) CompositeConstruct 154 155 156 157
-             159:    6(float) ImageSampleDrefImplicitLod 153 158 29
-                              Store 145(r64) 159
-             166:    165(ptr) AccessChain 161(psout) 162
-                              Store 166 164
-             168:     12(ptr) AccessChain 161(psout) 167
-                              Store 168 163
-             169:8(PS_OUTPUT) Load 161(psout)
-                              ReturnValue 169
+              23:          22 SampledImage 17 21
+              30:    6(float) CompositeExtract 27 0
+              31:    6(float) CompositeExtract 27 1
+              32:   29(fvec3) CompositeConstruct 30 31 28
+              33:    6(float) CompositeExtract 32 2
+              34:    6(float) ImageSampleDrefImplicitLod 23 32 33
+                              Store 13(r10) 34
+              40:          37 Load 39(g_tTex1di4a)
+              41:          18 Load 20(g_sSamp)
+              43:          42 SampledImage 40 41
+              44:    6(float) CompositeExtract 27 0
+              45:    6(float) CompositeExtract 27 1
+              46:   29(fvec3) CompositeConstruct 44 45 28
+              47:    6(float) CompositeExtract 46 2
+              48:    6(float) ImageSampleDrefImplicitLod 43 46 47
+                              Store 35(r12) 48
+              54:          51 Load 53(g_tTex1du4a)
+              55:          18 Load 20(g_sSamp)
+              57:          56 SampledImage 54 55
+              58:    6(float) CompositeExtract 27 0
+              59:    6(float) CompositeExtract 27 1
+              60:   29(fvec3) CompositeConstruct 58 59 28
+              61:    6(float) CompositeExtract 60 2
+              62:    6(float) ImageSampleDrefImplicitLod 57 60 61
+                              Store 49(r14) 62
+              67:          64 Load 66(g_tTex2df4a)
+              68:          18 Load 20(g_sSamp)
+              70:          69 SampledImage 67 68
+              73:    6(float) CompositeExtract 72 0
+              74:    6(float) CompositeExtract 72 1
+              75:    6(float) CompositeExtract 72 2
+              76:    7(fvec4) CompositeConstruct 73 74 75 28
+              77:    6(float) CompositeExtract 76 3
+              78:    6(float) ImageSampleDrefImplicitLod 70 76 77
+                              Store 63(r30) 78
+              83:          80 Load 82(g_tTex2di4a)
+              84:          18 Load 20(g_sSamp)
+              86:          85 SampledImage 83 84
+              87:    6(float) CompositeExtract 72 0
+              88:    6(float) CompositeExtract 72 1
+              89:    6(float) CompositeExtract 72 2
+              90:    7(fvec4) CompositeConstruct 87 88 89 28
+              91:    6(float) CompositeExtract 90 3
+              92:    6(float) ImageSampleDrefImplicitLod 86 90 91
+                              Store 79(r32) 92
+              97:          94 Load 96(g_tTex2du4a)
+              98:          18 Load 20(g_sSamp)
+             100:          99 SampledImage 97 98
+             101:    6(float) CompositeExtract 72 0
+             102:    6(float) CompositeExtract 72 1
+             103:    6(float) CompositeExtract 72 2
+             104:    7(fvec4) CompositeConstruct 101 102 103 28
+             105:    6(float) CompositeExtract 104 3
+             106:    6(float) ImageSampleDrefImplicitLod 100 104 105
+                              Store 93(r34) 106
+             111:         108 Load 110(g_tTexcdf4a)
+             112:          18 Load 20(g_sSamp)
+             114:         113 SampledImage 111 112
+             117:    6(float) CompositeExtract 116 0
+             118:    6(float) CompositeExtract 116 1
+             119:    6(float) CompositeExtract 116 2
+             120:    6(float) CompositeExtract 116 3
+             121:    7(fvec4) CompositeConstruct 117 118 119 120
+             122:    6(float) ImageSampleDrefImplicitLod 114 121 28
+                              Store 107(r60) 122
+             127:         124 Load 126(g_tTexcdi4a)
+             128:          18 Load 20(g_sSamp)
+             130:         129 SampledImage 127 128
+             131:    6(float) CompositeExtract 116 0
+             132:    6(float) CompositeExtract 116 1
+             133:    6(float) CompositeExtract 116 2
+             134:    6(float) CompositeExtract 116 3
+             135:    7(fvec4) CompositeConstruct 131 132 133 134
+             136:    6(float) ImageSampleDrefImplicitLod 130 135 28
+                              Store 123(r62) 136
+             141:         138 Load 140(g_tTexcdu4a)
+             142:          18 Load 20(g_sSamp)
+             144:         143 SampledImage 141 142
+             145:    6(float) CompositeExtract 116 0
+             146:    6(float) CompositeExtract 116 1
+             147:    6(float) CompositeExtract 116 2
+             148:    6(float) CompositeExtract 116 3
+             149:    7(fvec4) CompositeConstruct 145 146 147 148
+             150:    6(float) ImageSampleDrefImplicitLod 144 149 28
+                              Store 137(r64) 150
+             157:    156(ptr) AccessChain 152(psout) 153
+                              Store 157 155
+             159:     12(ptr) AccessChain 152(psout) 158
+                              Store 159 154
+             160:8(PS_OUTPUT) Load 152(psout)
+                              ReturnValue 160
                               FunctionEnd
diff --git a/Test/baseResults/hlsl.samplecmp.basic.dx10.frag.out b/Test/baseResults/hlsl.samplecmp.basic.dx10.frag.out
index 373423a..e8252d3 100644
--- a/Test/baseResults/hlsl.samplecmp.basic.dx10.frag.out
+++ b/Test/baseResults/hlsl.samplecmp.basic.dx10.frag.out
@@ -1,6 +1,7 @@
 hlsl.samplecmp.basic.dx10.frag
 Shader version: 500
 gl_FragCoord origin is upper left
+using depth_any
 0:? Sequence
 0:38  Function Definition: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:38    Function Parameters: 
@@ -10,7 +11,7 @@
 0:42          'r00' ( temp float)
 0:42          texture ( temp float)
 0:42            Construct combined texture-sampler ( temp sampler1DShadow)
-0:42              'g_tTex1df4' (layout( binding=0) uniform texture1D)
+0:42              'g_tTex1df4' (layout( binding=0) uniform texture1DShadow)
 0:42              'g_sSamp' (layout( binding=0) uniform sampler)
 0:42            Construct vec2 ( temp 2-component vector of float)
 0:42              Constant:
@@ -22,7 +23,7 @@
 0:43          'r02' ( temp float)
 0:43          texture ( temp float)
 0:43            Construct combined texture-sampler ( temp isampler1DShadow)
-0:43              'g_tTex1di4' ( uniform itexture1D)
+0:43              'g_tTex1di4' ( uniform itexture1DShadow)
 0:43              'g_sSamp' (layout( binding=0) uniform sampler)
 0:43            Construct vec2 ( temp 2-component vector of float)
 0:43              Constant:
@@ -34,7 +35,7 @@
 0:44          'r04' ( temp float)
 0:44          texture ( temp float)
 0:44            Construct combined texture-sampler ( temp usampler1DShadow)
-0:44              'g_tTex1du4' ( uniform utexture1D)
+0:44              'g_tTex1du4' ( uniform utexture1DShadow)
 0:44              'g_sSamp' (layout( binding=0) uniform sampler)
 0:44            Construct vec2 ( temp 2-component vector of float)
 0:44              Constant:
@@ -46,7 +47,7 @@
 0:47          'r20' ( temp float)
 0:47          texture ( temp float)
 0:47            Construct combined texture-sampler ( temp sampler2DShadow)
-0:47              'g_tTex2df4' ( uniform texture2D)
+0:47              'g_tTex2df4' ( uniform texture2DShadow)
 0:47              'g_sSamp' (layout( binding=0) uniform sampler)
 0:47            Construct vec3 ( temp 3-component vector of float)
 0:?               Constant:
@@ -59,7 +60,7 @@
 0:48          'r22' ( temp float)
 0:48          texture ( temp float)
 0:48            Construct combined texture-sampler ( temp isampler2DShadow)
-0:48              'g_tTex2di4' ( uniform itexture2D)
+0:48              'g_tTex2di4' ( uniform itexture2DShadow)
 0:48              'g_sSamp' (layout( binding=0) uniform sampler)
 0:48            Construct vec3 ( temp 3-component vector of float)
 0:?               Constant:
@@ -72,7 +73,7 @@
 0:49          'r24' ( temp float)
 0:49          texture ( temp float)
 0:49            Construct combined texture-sampler ( temp usampler2DShadow)
-0:49              'g_tTex2du4' ( uniform utexture2D)
+0:49              'g_tTex2du4' ( uniform utexture2DShadow)
 0:49              'g_sSamp' (layout( binding=0) uniform sampler)
 0:49            Construct vec3 ( temp 3-component vector of float)
 0:?               Constant:
@@ -85,7 +86,7 @@
 0:53          'r50' ( temp float)
 0:53          texture ( temp float)
 0:53            Construct combined texture-sampler ( temp samplerCubeShadow)
-0:53              'g_tTexcdf4' ( uniform textureCube)
+0:53              'g_tTexcdf4' ( uniform textureCubeShadow)
 0:53              'g_sSamp' (layout( binding=0) uniform sampler)
 0:53            Construct vec4 ( temp 4-component vector of float)
 0:?               Constant:
@@ -99,7 +100,7 @@
 0:54          'r52' ( temp float)
 0:54          texture ( temp float)
 0:54            Construct combined texture-sampler ( temp isamplerCubeShadow)
-0:54              'g_tTexcdi4' ( uniform itextureCube)
+0:54              'g_tTexcdi4' ( uniform itextureCubeShadow)
 0:54              'g_sSamp' (layout( binding=0) uniform sampler)
 0:54            Construct vec4 ( temp 4-component vector of float)
 0:?               Constant:
@@ -113,7 +114,7 @@
 0:55          'r54' ( temp float)
 0:55          texture ( temp float)
 0:55            Construct combined texture-sampler ( temp usamplerCubeShadow)
-0:55              'g_tTexcdu4' ( uniform utextureCube)
+0:55              'g_tTexcdu4' ( uniform utextureCubeShadow)
 0:55              'g_sSamp' (layout( binding=0) uniform sampler)
 0:55            Construct vec4 ( temp 4-component vector of float)
 0:?               Constant:
@@ -149,31 +150,31 @@
 0:38          'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:38          Function Call: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:38        move second child to first child ( temp 4-component vector of float)
-0:?           'Color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 0:38          Color: direct index for structure ( temp 4-component vector of float)
 0:38            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:38            Constant:
 0:38              0 (const int)
 0:38        move second child to first child ( temp float)
-0:?           'Depth' ( out float FragDepth)
+0:?           '@entryPointOutput.Depth' ( out float FragDepth)
 0:38          Depth: direct index for structure ( temp float)
 0:38            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:38            Constant:
 0:38              1 (const int)
 0:?   Linker Objects
 0:?     'g_sSamp' (layout( binding=0) uniform sampler)
-0:?     'g_tTex1df4' (layout( binding=0) uniform texture1D)
-0:?     'g_tTex1di4' ( uniform itexture1D)
-0:?     'g_tTex1du4' ( uniform utexture1D)
-0:?     'g_tTex2df4' ( uniform texture2D)
-0:?     'g_tTex2di4' ( uniform itexture2D)
-0:?     'g_tTex2du4' ( uniform utexture2D)
+0:?     'g_tTex1df4' (layout( binding=0) uniform texture1DShadow)
+0:?     'g_tTex1di4' ( uniform itexture1DShadow)
+0:?     'g_tTex1du4' ( uniform utexture1DShadow)
+0:?     'g_tTex2df4' ( uniform texture2DShadow)
+0:?     'g_tTex2di4' ( uniform itexture2DShadow)
+0:?     'g_tTex2du4' ( uniform utexture2DShadow)
 0:?     'g_tTex3df4' ( uniform texture3D)
 0:?     'g_tTex3di4' ( uniform itexture3D)
 0:?     'g_tTex3du4' ( uniform utexture3D)
-0:?     'g_tTexcdf4' ( uniform textureCube)
-0:?     'g_tTexcdi4' ( uniform itextureCube)
-0:?     'g_tTexcdu4' ( uniform utextureCube)
+0:?     'g_tTexcdf4' ( uniform textureCubeShadow)
+0:?     'g_tTexcdi4' ( uniform itextureCubeShadow)
+0:?     'g_tTexcdu4' ( uniform utextureCubeShadow)
 0:?     'g_tTex1df4a' ( uniform texture1DArray)
 0:?     'g_tTex1di4a' ( uniform itexture1DArray)
 0:?     'g_tTex1du4a' ( uniform utexture1DArray)
@@ -183,8 +184,8 @@
 0:?     'g_tTexcdf4a' ( uniform textureCubeArray)
 0:?     'g_tTexcdi4a' ( uniform itextureCubeArray)
 0:?     'g_tTexcdu4a' ( uniform utextureCubeArray)
-0:?     'Color' (layout( location=0) out 4-component vector of float)
-0:?     'Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 
 Linked fragment stage:
@@ -192,6 +193,7 @@
 
 Shader version: 500
 gl_FragCoord origin is upper left
+using depth_any
 0:? Sequence
 0:38  Function Definition: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:38    Function Parameters: 
@@ -201,7 +203,7 @@
 0:42          'r00' ( temp float)
 0:42          texture ( temp float)
 0:42            Construct combined texture-sampler ( temp sampler1DShadow)
-0:42              'g_tTex1df4' (layout( binding=0) uniform texture1D)
+0:42              'g_tTex1df4' (layout( binding=0) uniform texture1DShadow)
 0:42              'g_sSamp' (layout( binding=0) uniform sampler)
 0:42            Construct vec2 ( temp 2-component vector of float)
 0:42              Constant:
@@ -213,7 +215,7 @@
 0:43          'r02' ( temp float)
 0:43          texture ( temp float)
 0:43            Construct combined texture-sampler ( temp isampler1DShadow)
-0:43              'g_tTex1di4' ( uniform itexture1D)
+0:43              'g_tTex1di4' ( uniform itexture1DShadow)
 0:43              'g_sSamp' (layout( binding=0) uniform sampler)
 0:43            Construct vec2 ( temp 2-component vector of float)
 0:43              Constant:
@@ -225,7 +227,7 @@
 0:44          'r04' ( temp float)
 0:44          texture ( temp float)
 0:44            Construct combined texture-sampler ( temp usampler1DShadow)
-0:44              'g_tTex1du4' ( uniform utexture1D)
+0:44              'g_tTex1du4' ( uniform utexture1DShadow)
 0:44              'g_sSamp' (layout( binding=0) uniform sampler)
 0:44            Construct vec2 ( temp 2-component vector of float)
 0:44              Constant:
@@ -237,7 +239,7 @@
 0:47          'r20' ( temp float)
 0:47          texture ( temp float)
 0:47            Construct combined texture-sampler ( temp sampler2DShadow)
-0:47              'g_tTex2df4' ( uniform texture2D)
+0:47              'g_tTex2df4' ( uniform texture2DShadow)
 0:47              'g_sSamp' (layout( binding=0) uniform sampler)
 0:47            Construct vec3 ( temp 3-component vector of float)
 0:?               Constant:
@@ -250,7 +252,7 @@
 0:48          'r22' ( temp float)
 0:48          texture ( temp float)
 0:48            Construct combined texture-sampler ( temp isampler2DShadow)
-0:48              'g_tTex2di4' ( uniform itexture2D)
+0:48              'g_tTex2di4' ( uniform itexture2DShadow)
 0:48              'g_sSamp' (layout( binding=0) uniform sampler)
 0:48            Construct vec3 ( temp 3-component vector of float)
 0:?               Constant:
@@ -263,7 +265,7 @@
 0:49          'r24' ( temp float)
 0:49          texture ( temp float)
 0:49            Construct combined texture-sampler ( temp usampler2DShadow)
-0:49              'g_tTex2du4' ( uniform utexture2D)
+0:49              'g_tTex2du4' ( uniform utexture2DShadow)
 0:49              'g_sSamp' (layout( binding=0) uniform sampler)
 0:49            Construct vec3 ( temp 3-component vector of float)
 0:?               Constant:
@@ -276,7 +278,7 @@
 0:53          'r50' ( temp float)
 0:53          texture ( temp float)
 0:53            Construct combined texture-sampler ( temp samplerCubeShadow)
-0:53              'g_tTexcdf4' ( uniform textureCube)
+0:53              'g_tTexcdf4' ( uniform textureCubeShadow)
 0:53              'g_sSamp' (layout( binding=0) uniform sampler)
 0:53            Construct vec4 ( temp 4-component vector of float)
 0:?               Constant:
@@ -290,7 +292,7 @@
 0:54          'r52' ( temp float)
 0:54          texture ( temp float)
 0:54            Construct combined texture-sampler ( temp isamplerCubeShadow)
-0:54              'g_tTexcdi4' ( uniform itextureCube)
+0:54              'g_tTexcdi4' ( uniform itextureCubeShadow)
 0:54              'g_sSamp' (layout( binding=0) uniform sampler)
 0:54            Construct vec4 ( temp 4-component vector of float)
 0:?               Constant:
@@ -304,7 +306,7 @@
 0:55          'r54' ( temp float)
 0:55          texture ( temp float)
 0:55            Construct combined texture-sampler ( temp usamplerCubeShadow)
-0:55              'g_tTexcdu4' ( uniform utextureCube)
+0:55              'g_tTexcdu4' ( uniform utextureCubeShadow)
 0:55              'g_sSamp' (layout( binding=0) uniform sampler)
 0:55            Construct vec4 ( temp 4-component vector of float)
 0:?               Constant:
@@ -340,31 +342,31 @@
 0:38          'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:38          Function Call: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:38        move second child to first child ( temp 4-component vector of float)
-0:?           'Color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 0:38          Color: direct index for structure ( temp 4-component vector of float)
 0:38            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:38            Constant:
 0:38              0 (const int)
 0:38        move second child to first child ( temp float)
-0:?           'Depth' ( out float FragDepth)
+0:?           '@entryPointOutput.Depth' ( out float FragDepth)
 0:38          Depth: direct index for structure ( temp float)
 0:38            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:38            Constant:
 0:38              1 (const int)
 0:?   Linker Objects
 0:?     'g_sSamp' (layout( binding=0) uniform sampler)
-0:?     'g_tTex1df4' (layout( binding=0) uniform texture1D)
-0:?     'g_tTex1di4' ( uniform itexture1D)
-0:?     'g_tTex1du4' ( uniform utexture1D)
-0:?     'g_tTex2df4' ( uniform texture2D)
-0:?     'g_tTex2di4' ( uniform itexture2D)
-0:?     'g_tTex2du4' ( uniform utexture2D)
+0:?     'g_tTex1df4' (layout( binding=0) uniform texture1DShadow)
+0:?     'g_tTex1di4' ( uniform itexture1DShadow)
+0:?     'g_tTex1du4' ( uniform utexture1DShadow)
+0:?     'g_tTex2df4' ( uniform texture2DShadow)
+0:?     'g_tTex2di4' ( uniform itexture2DShadow)
+0:?     'g_tTex2du4' ( uniform utexture2DShadow)
 0:?     'g_tTex3df4' ( uniform texture3D)
 0:?     'g_tTex3di4' ( uniform itexture3D)
 0:?     'g_tTex3du4' ( uniform utexture3D)
-0:?     'g_tTexcdf4' ( uniform textureCube)
-0:?     'g_tTexcdi4' ( uniform itextureCube)
-0:?     'g_tTexcdu4' ( uniform utextureCube)
+0:?     'g_tTexcdf4' ( uniform textureCubeShadow)
+0:?     'g_tTexcdi4' ( uniform itextureCubeShadow)
+0:?     'g_tTexcdu4' ( uniform utextureCubeShadow)
 0:?     'g_tTex1df4a' ( uniform texture1DArray)
 0:?     'g_tTex1di4a' ( uniform itexture1DArray)
 0:?     'g_tTex1du4a' ( uniform utexture1DArray)
@@ -374,20 +376,25 @@
 0:?     'g_tTexcdf4a' ( uniform textureCubeArray)
 0:?     'g_tTexcdi4a' ( uniform itextureCubeArray)
 0:?     'g_tTexcdu4a' ( uniform utextureCubeArray)
-0:?     'Color' (layout( location=0) out 4-component vector of float)
-0:?     'Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
+
+error: SPIRV-Tools Validation Errors
+error: Expected Image 'Sampled Type' to be the same as Result Type
+  %41 = OpImageSampleDrefImplicitLod %float %38 %39 %40
 
 // Module Version 10000
-// Generated by (magic number): 80001
-// Id's are bound by 207
+// Generated by (magic number): 80007
+// Id's are bound by 198
 
                               Capability Shader
                               Capability Sampled1D
                               Capability SampledCubeArray
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "main" 164 168
+                              EntryPoint Fragment 4  "main" 155 159
                               ExecutionMode 4 OriginUpperLeft
+                              ExecutionMode 4 DepthReplacing
                               Source HLSL 500
                               Name 4  "main"
                               Name 8  "PS_OUTPUT"
@@ -397,64 +404,64 @@
                               Name 13  "r00"
                               Name 16  "g_tTex1df4"
                               Name 20  "g_sSamp"
-                              Name 31  "r02"
-                              Name 35  "g_tTex1di4"
-                              Name 44  "r04"
-                              Name 48  "g_tTex1du4"
-                              Name 57  "r20"
-                              Name 60  "g_tTex2df4"
-                              Name 74  "r22"
-                              Name 77  "g_tTex2di4"
-                              Name 88  "r24"
-                              Name 91  "g_tTex2du4"
-                              Name 102  "r50"
-                              Name 105  "g_tTexcdf4"
-                              Name 119  "r52"
-                              Name 122  "g_tTexcdi4"
-                              Name 134  "r54"
-                              Name 137  "g_tTexcdu4"
-                              Name 150  "psout"
-                              Name 161  "flattenTemp"
-                              Name 164  "Color"
-                              Name 168  "Depth"
-                              Name 173  "g_tTex3df4"
-                              Name 176  "g_tTex3di4"
-                              Name 179  "g_tTex3du4"
-                              Name 182  "g_tTex1df4a"
-                              Name 185  "g_tTex1di4a"
-                              Name 188  "g_tTex1du4a"
-                              Name 191  "g_tTex2df4a"
-                              Name 194  "g_tTex2di4a"
-                              Name 197  "g_tTex2du4a"
-                              Name 200  "g_tTexcdf4a"
-                              Name 203  "g_tTexcdi4a"
-                              Name 206  "g_tTexcdu4a"
+                              Name 30  "r02"
+                              Name 34  "g_tTex1di4"
+                              Name 42  "r04"
+                              Name 46  "g_tTex1du4"
+                              Name 54  "r20"
+                              Name 57  "g_tTex2df4"
+                              Name 70  "r22"
+                              Name 73  "g_tTex2di4"
+                              Name 83  "r24"
+                              Name 86  "g_tTex2du4"
+                              Name 96  "r50"
+                              Name 99  "g_tTexcdf4"
+                              Name 112  "r52"
+                              Name 115  "g_tTexcdi4"
+                              Name 126  "r54"
+                              Name 129  "g_tTexcdu4"
+                              Name 141  "psout"
+                              Name 152  "flattenTemp"
+                              Name 155  "@entryPointOutput.Color"
+                              Name 159  "@entryPointOutput.Depth"
+                              Name 164  "g_tTex3df4"
+                              Name 167  "g_tTex3di4"
+                              Name 170  "g_tTex3du4"
+                              Name 173  "g_tTex1df4a"
+                              Name 176  "g_tTex1di4a"
+                              Name 179  "g_tTex1du4a"
+                              Name 182  "g_tTex2df4a"
+                              Name 185  "g_tTex2di4a"
+                              Name 188  "g_tTex2du4a"
+                              Name 191  "g_tTexcdf4a"
+                              Name 194  "g_tTexcdi4a"
+                              Name 197  "g_tTexcdu4a"
                               Decorate 16(g_tTex1df4) DescriptorSet 0
                               Decorate 16(g_tTex1df4) Binding 0
                               Decorate 20(g_sSamp) DescriptorSet 0
                               Decorate 20(g_sSamp) Binding 0
-                              Decorate 35(g_tTex1di4) DescriptorSet 0
-                              Decorate 48(g_tTex1du4) DescriptorSet 0
-                              Decorate 60(g_tTex2df4) DescriptorSet 0
-                              Decorate 77(g_tTex2di4) DescriptorSet 0
-                              Decorate 91(g_tTex2du4) DescriptorSet 0
-                              Decorate 105(g_tTexcdf4) DescriptorSet 0
-                              Decorate 122(g_tTexcdi4) DescriptorSet 0
-                              Decorate 137(g_tTexcdu4) DescriptorSet 0
-                              Decorate 164(Color) Location 0
-                              Decorate 168(Depth) BuiltIn FragDepth
-                              Decorate 173(g_tTex3df4) DescriptorSet 0
-                              Decorate 176(g_tTex3di4) DescriptorSet 0
-                              Decorate 179(g_tTex3du4) DescriptorSet 0
-                              Decorate 182(g_tTex1df4a) DescriptorSet 0
-                              Decorate 185(g_tTex1di4a) DescriptorSet 0
-                              Decorate 188(g_tTex1du4a) DescriptorSet 0
-                              Decorate 191(g_tTex2df4a) DescriptorSet 0
-                              Decorate 194(g_tTex2di4a) DescriptorSet 0
-                              Decorate 197(g_tTex2du4a) DescriptorSet 0
-                              Decorate 200(g_tTexcdf4a) DescriptorSet 0
-                              Decorate 203(g_tTexcdi4a) DescriptorSet 0
-                              Decorate 206(g_tTexcdu4a) DescriptorSet 0
+                              Decorate 34(g_tTex1di4) DescriptorSet 0
+                              Decorate 46(g_tTex1du4) DescriptorSet 0
+                              Decorate 57(g_tTex2df4) DescriptorSet 0
+                              Decorate 73(g_tTex2di4) DescriptorSet 0
+                              Decorate 86(g_tTex2du4) DescriptorSet 0
+                              Decorate 99(g_tTexcdf4) DescriptorSet 0
+                              Decorate 115(g_tTexcdi4) DescriptorSet 0
+                              Decorate 129(g_tTexcdu4) DescriptorSet 0
+                              Decorate 155(@entryPointOutput.Color) Location 0
+                              Decorate 159(@entryPointOutput.Depth) BuiltIn FragDepth
+                              Decorate 164(g_tTex3df4) DescriptorSet 0
+                              Decorate 167(g_tTex3di4) DescriptorSet 0
+                              Decorate 170(g_tTex3du4) DescriptorSet 0
+                              Decorate 173(g_tTex1df4a) DescriptorSet 0
+                              Decorate 176(g_tTex1di4a) DescriptorSet 0
+                              Decorate 179(g_tTex1du4a) DescriptorSet 0
+                              Decorate 182(g_tTex2df4a) DescriptorSet 0
+                              Decorate 185(g_tTex2di4a) DescriptorSet 0
+                              Decorate 188(g_tTex2du4a) DescriptorSet 0
+                              Decorate 191(g_tTexcdf4a) DescriptorSet 0
+                              Decorate 194(g_tTexcdi4a) DescriptorSet 0
+                              Decorate 197(g_tTexcdu4a) DescriptorSet 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -462,217 +469,208 @@
     8(PS_OUTPUT):             TypeStruct 7(fvec4) 6(float)
                9:             TypeFunction 8(PS_OUTPUT)
               12:             TypePointer Function 6(float)
-              14:             TypeImage 6(float) 1D sampled format:Unknown
+              14:             TypeImage 6(float) 1D depth sampled format:Unknown
               15:             TypePointer UniformConstant 14
   16(g_tTex1df4):     15(ptr) Variable UniformConstant
               18:             TypeSampler
               19:             TypePointer UniformConstant 18
      20(g_sSamp):     19(ptr) Variable UniformConstant
-              22:             TypeImage 6(float) 1D depth sampled format:Unknown
-              23:             TypeSampledImage 22
-              25:    6(float) Constant 1036831949
-              26:    6(float) Constant 1061158912
-              27:             TypeVector 6(float) 2
-              32:             TypeInt 32 1
-              33:             TypeImage 32(int) 1D sampled format:Unknown
-              34:             TypePointer UniformConstant 33
-  35(g_tTex1di4):     34(ptr) Variable UniformConstant
-              38:             TypeImage 32(int) 1D depth sampled format:Unknown
-              39:             TypeSampledImage 38
-              45:             TypeInt 32 0
-              46:             TypeImage 45(int) 1D sampled format:Unknown
-              47:             TypePointer UniformConstant 46
-  48(g_tTex1du4):     47(ptr) Variable UniformConstant
-              51:             TypeImage 45(int) 1D depth sampled format:Unknown
-              52:             TypeSampledImage 51
-              58:             TypeImage 6(float) 2D sampled format:Unknown
-              59:             TypePointer UniformConstant 58
-  60(g_tTex2df4):     59(ptr) Variable UniformConstant
-              63:             TypeImage 6(float) 2D depth sampled format:Unknown
-              64:             TypeSampledImage 63
-              66:    6(float) Constant 1045220557
-              67:   27(fvec2) ConstantComposite 25 66
-              68:             TypeVector 6(float) 3
-              75:             TypeImage 32(int) 2D sampled format:Unknown
-              76:             TypePointer UniformConstant 75
-  77(g_tTex2di4):     76(ptr) Variable UniformConstant
-              80:             TypeImage 32(int) 2D depth sampled format:Unknown
-              81:             TypeSampledImage 80
-              89:             TypeImage 45(int) 2D sampled format:Unknown
-              90:             TypePointer UniformConstant 89
-  91(g_tTex2du4):     90(ptr) Variable UniformConstant
-              94:             TypeImage 45(int) 2D depth sampled format:Unknown
-              95:             TypeSampledImage 94
-             103:             TypeImage 6(float) Cube sampled format:Unknown
-             104:             TypePointer UniformConstant 103
- 105(g_tTexcdf4):    104(ptr) Variable UniformConstant
-             108:             TypeImage 6(float) Cube depth sampled format:Unknown
-             109:             TypeSampledImage 108
-             111:    6(float) Constant 1050253722
-             112:   68(fvec3) ConstantComposite 25 66 111
-             120:             TypeImage 32(int) Cube sampled format:Unknown
-             121:             TypePointer UniformConstant 120
- 122(g_tTexcdi4):    121(ptr) Variable UniformConstant
-             125:             TypeImage 32(int) Cube depth sampled format:Unknown
-             126:             TypeSampledImage 125
-             135:             TypeImage 45(int) Cube sampled format:Unknown
-             136:             TypePointer UniformConstant 135
- 137(g_tTexcdu4):    136(ptr) Variable UniformConstant
-             140:             TypeImage 45(int) Cube depth sampled format:Unknown
-             141:             TypeSampledImage 140
-             149:             TypePointer Function 8(PS_OUTPUT)
-             151:     32(int) Constant 0
-             152:    6(float) Constant 1065353216
-             153:    7(fvec4) ConstantComposite 152 152 152 152
-             154:             TypePointer Function 7(fvec4)
-             156:     32(int) Constant 1
-             163:             TypePointer Output 7(fvec4)
-      164(Color):    163(ptr) Variable Output
-             167:             TypePointer Output 6(float)
-      168(Depth):    167(ptr) Variable Output
-             171:             TypeImage 6(float) 3D sampled format:Unknown
+              22:             TypeSampledImage 14
+              24:    6(float) Constant 1036831949
+              25:    6(float) Constant 1061158912
+              26:             TypeVector 6(float) 2
+              31:             TypeInt 32 1
+              32:             TypeImage 31(int) 1D depth sampled format:Unknown
+              33:             TypePointer UniformConstant 32
+  34(g_tTex1di4):     33(ptr) Variable UniformConstant
+              37:             TypeSampledImage 32
+              43:             TypeInt 32 0
+              44:             TypeImage 43(int) 1D depth sampled format:Unknown
+              45:             TypePointer UniformConstant 44
+  46(g_tTex1du4):     45(ptr) Variable UniformConstant
+              49:             TypeSampledImage 44
+              55:             TypeImage 6(float) 2D depth sampled format:Unknown
+              56:             TypePointer UniformConstant 55
+  57(g_tTex2df4):     56(ptr) Variable UniformConstant
+              60:             TypeSampledImage 55
+              62:    6(float) Constant 1045220557
+              63:   26(fvec2) ConstantComposite 24 62
+              64:             TypeVector 6(float) 3
+              71:             TypeImage 31(int) 2D depth sampled format:Unknown
+              72:             TypePointer UniformConstant 71
+  73(g_tTex2di4):     72(ptr) Variable UniformConstant
+              76:             TypeSampledImage 71
+              84:             TypeImage 43(int) 2D depth sampled format:Unknown
+              85:             TypePointer UniformConstant 84
+  86(g_tTex2du4):     85(ptr) Variable UniformConstant
+              89:             TypeSampledImage 84
+              97:             TypeImage 6(float) Cube depth sampled format:Unknown
+              98:             TypePointer UniformConstant 97
+  99(g_tTexcdf4):     98(ptr) Variable UniformConstant
+             102:             TypeSampledImage 97
+             104:    6(float) Constant 1050253722
+             105:   64(fvec3) ConstantComposite 24 62 104
+             113:             TypeImage 31(int) Cube depth sampled format:Unknown
+             114:             TypePointer UniformConstant 113
+ 115(g_tTexcdi4):    114(ptr) Variable UniformConstant
+             118:             TypeSampledImage 113
+             127:             TypeImage 43(int) Cube depth sampled format:Unknown
+             128:             TypePointer UniformConstant 127
+ 129(g_tTexcdu4):    128(ptr) Variable UniformConstant
+             132:             TypeSampledImage 127
+             140:             TypePointer Function 8(PS_OUTPUT)
+             142:     31(int) Constant 0
+             143:    6(float) Constant 1065353216
+             144:    7(fvec4) ConstantComposite 143 143 143 143
+             145:             TypePointer Function 7(fvec4)
+             147:     31(int) Constant 1
+             154:             TypePointer Output 7(fvec4)
+155(@entryPointOutput.Color):    154(ptr) Variable Output
+             158:             TypePointer Output 6(float)
+159(@entryPointOutput.Depth):    158(ptr) Variable Output
+             162:             TypeImage 6(float) 3D sampled format:Unknown
+             163:             TypePointer UniformConstant 162
+ 164(g_tTex3df4):    163(ptr) Variable UniformConstant
+             165:             TypeImage 31(int) 3D sampled format:Unknown
+             166:             TypePointer UniformConstant 165
+ 167(g_tTex3di4):    166(ptr) Variable UniformConstant
+             168:             TypeImage 43(int) 3D sampled format:Unknown
+             169:             TypePointer UniformConstant 168
+ 170(g_tTex3du4):    169(ptr) Variable UniformConstant
+             171:             TypeImage 6(float) 1D array sampled format:Unknown
              172:             TypePointer UniformConstant 171
- 173(g_tTex3df4):    172(ptr) Variable UniformConstant
-             174:             TypeImage 32(int) 3D sampled format:Unknown
+173(g_tTex1df4a):    172(ptr) Variable UniformConstant
+             174:             TypeImage 31(int) 1D array sampled format:Unknown
              175:             TypePointer UniformConstant 174
- 176(g_tTex3di4):    175(ptr) Variable UniformConstant
-             177:             TypeImage 45(int) 3D sampled format:Unknown
+176(g_tTex1di4a):    175(ptr) Variable UniformConstant
+             177:             TypeImage 43(int) 1D array sampled format:Unknown
              178:             TypePointer UniformConstant 177
- 179(g_tTex3du4):    178(ptr) Variable UniformConstant
-             180:             TypeImage 6(float) 1D array sampled format:Unknown
+179(g_tTex1du4a):    178(ptr) Variable UniformConstant
+             180:             TypeImage 6(float) 2D array sampled format:Unknown
              181:             TypePointer UniformConstant 180
-182(g_tTex1df4a):    181(ptr) Variable UniformConstant
-             183:             TypeImage 32(int) 1D array sampled format:Unknown
+182(g_tTex2df4a):    181(ptr) Variable UniformConstant
+             183:             TypeImage 31(int) 2D array sampled format:Unknown
              184:             TypePointer UniformConstant 183
-185(g_tTex1di4a):    184(ptr) Variable UniformConstant
-             186:             TypeImage 45(int) 1D array sampled format:Unknown
+185(g_tTex2di4a):    184(ptr) Variable UniformConstant
+             186:             TypeImage 43(int) 2D array sampled format:Unknown
              187:             TypePointer UniformConstant 186
-188(g_tTex1du4a):    187(ptr) Variable UniformConstant
-             189:             TypeImage 6(float) 2D array sampled format:Unknown
+188(g_tTex2du4a):    187(ptr) Variable UniformConstant
+             189:             TypeImage 6(float) Cube array sampled format:Unknown
              190:             TypePointer UniformConstant 189
-191(g_tTex2df4a):    190(ptr) Variable UniformConstant
-             192:             TypeImage 32(int) 2D array sampled format:Unknown
+191(g_tTexcdf4a):    190(ptr) Variable UniformConstant
+             192:             TypeImage 31(int) Cube array sampled format:Unknown
              193:             TypePointer UniformConstant 192
-194(g_tTex2di4a):    193(ptr) Variable UniformConstant
-             195:             TypeImage 45(int) 2D array sampled format:Unknown
+194(g_tTexcdi4a):    193(ptr) Variable UniformConstant
+             195:             TypeImage 43(int) Cube array sampled format:Unknown
              196:             TypePointer UniformConstant 195
-197(g_tTex2du4a):    196(ptr) Variable UniformConstant
-             198:             TypeImage 6(float) Cube array sampled format:Unknown
-             199:             TypePointer UniformConstant 198
-200(g_tTexcdf4a):    199(ptr) Variable UniformConstant
-             201:             TypeImage 32(int) Cube array sampled format:Unknown
-             202:             TypePointer UniformConstant 201
-203(g_tTexcdi4a):    202(ptr) Variable UniformConstant
-             204:             TypeImage 45(int) Cube array sampled format:Unknown
-             205:             TypePointer UniformConstant 204
-206(g_tTexcdu4a):    205(ptr) Variable UniformConstant
+197(g_tTexcdu4a):    196(ptr) Variable UniformConstant
          4(main):           2 Function None 3
                5:             Label
-161(flattenTemp):    149(ptr) Variable Function
-             162:8(PS_OUTPUT) FunctionCall 10(@main()
-                              Store 161(flattenTemp) 162
-             165:    154(ptr) AccessChain 161(flattenTemp) 151
-             166:    7(fvec4) Load 165
-                              Store 164(Color) 166
-             169:     12(ptr) AccessChain 161(flattenTemp) 156
-             170:    6(float) Load 169
-                              Store 168(Depth) 170
+152(flattenTemp):    140(ptr) Variable Function
+             153:8(PS_OUTPUT) FunctionCall 10(@main()
+                              Store 152(flattenTemp) 153
+             156:    145(ptr) AccessChain 152(flattenTemp) 142
+             157:    7(fvec4) Load 156
+                              Store 155(@entryPointOutput.Color) 157
+             160:     12(ptr) AccessChain 152(flattenTemp) 147
+             161:    6(float) Load 160
+                              Store 159(@entryPointOutput.Depth) 161
                               Return
                               FunctionEnd
       10(@main():8(PS_OUTPUT) Function None 9
               11:             Label
          13(r00):     12(ptr) Variable Function
-         31(r02):     12(ptr) Variable Function
-         44(r04):     12(ptr) Variable Function
-         57(r20):     12(ptr) Variable Function
-         74(r22):     12(ptr) Variable Function
-         88(r24):     12(ptr) Variable Function
-        102(r50):     12(ptr) Variable Function
-        119(r52):     12(ptr) Variable Function
-        134(r54):     12(ptr) Variable Function
-      150(psout):    149(ptr) Variable Function
+         30(r02):     12(ptr) Variable Function
+         42(r04):     12(ptr) Variable Function
+         54(r20):     12(ptr) Variable Function
+         70(r22):     12(ptr) Variable Function
+         83(r24):     12(ptr) Variable Function
+         96(r50):     12(ptr) Variable Function
+        112(r52):     12(ptr) Variable Function
+        126(r54):     12(ptr) Variable Function
+      141(psout):    140(ptr) Variable Function
               17:          14 Load 16(g_tTex1df4)
               21:          18 Load 20(g_sSamp)
-              24:          23 SampledImage 17 21
-              28:   27(fvec2) CompositeConstruct 25 26
-              29:    6(float) CompositeExtract 28 1
-              30:    6(float) ImageSampleDrefImplicitLod 24 28 29
-                              Store 13(r00) 30
-              36:          33 Load 35(g_tTex1di4)
-              37:          18 Load 20(g_sSamp)
-              40:          39 SampledImage 36 37
-              41:   27(fvec2) CompositeConstruct 25 26
-              42:    6(float) CompositeExtract 41 1
-              43:    6(float) ImageSampleDrefImplicitLod 40 41 42
-                              Store 31(r02) 43
-              49:          46 Load 48(g_tTex1du4)
-              50:          18 Load 20(g_sSamp)
-              53:          52 SampledImage 49 50
-              54:   27(fvec2) CompositeConstruct 25 26
-              55:    6(float) CompositeExtract 54 1
-              56:    6(float) ImageSampleDrefImplicitLod 53 54 55
-                              Store 44(r04) 56
-              61:          58 Load 60(g_tTex2df4)
-              62:          18 Load 20(g_sSamp)
-              65:          64 SampledImage 61 62
-              69:    6(float) CompositeExtract 67 0
-              70:    6(float) CompositeExtract 67 1
-              71:   68(fvec3) CompositeConstruct 69 70 26
-              72:    6(float) CompositeExtract 71 2
-              73:    6(float) ImageSampleDrefImplicitLod 65 71 72
-                              Store 57(r20) 73
-              78:          75 Load 77(g_tTex2di4)
-              79:          18 Load 20(g_sSamp)
-              82:          81 SampledImage 78 79
-              83:    6(float) CompositeExtract 67 0
-              84:    6(float) CompositeExtract 67 1
-              85:   68(fvec3) CompositeConstruct 83 84 26
-              86:    6(float) CompositeExtract 85 2
-              87:    6(float) ImageSampleDrefImplicitLod 82 85 86
-                              Store 74(r22) 87
-              92:          89 Load 91(g_tTex2du4)
-              93:          18 Load 20(g_sSamp)
-              96:          95 SampledImage 92 93
-              97:    6(float) CompositeExtract 67 0
-              98:    6(float) CompositeExtract 67 1
-              99:   68(fvec3) CompositeConstruct 97 98 26
-             100:    6(float) CompositeExtract 99 2
-             101:    6(float) ImageSampleDrefImplicitLod 96 99 100
-                              Store 88(r24) 101
-             106:         103 Load 105(g_tTexcdf4)
-             107:          18 Load 20(g_sSamp)
-             110:         109 SampledImage 106 107
-             113:    6(float) CompositeExtract 112 0
-             114:    6(float) CompositeExtract 112 1
-             115:    6(float) CompositeExtract 112 2
-             116:    7(fvec4) CompositeConstruct 113 114 115 26
-             117:    6(float) CompositeExtract 116 3
-             118:    6(float) ImageSampleDrefImplicitLod 110 116 117
-                              Store 102(r50) 118
-             123:         120 Load 122(g_tTexcdi4)
-             124:          18 Load 20(g_sSamp)
-             127:         126 SampledImage 123 124
-             128:    6(float) CompositeExtract 112 0
-             129:    6(float) CompositeExtract 112 1
-             130:    6(float) CompositeExtract 112 2
-             131:    7(fvec4) CompositeConstruct 128 129 130 26
-             132:    6(float) CompositeExtract 131 3
-             133:    6(float) ImageSampleDrefImplicitLod 127 131 132
-                              Store 119(r52) 133
-             138:         135 Load 137(g_tTexcdu4)
-             139:          18 Load 20(g_sSamp)
-             142:         141 SampledImage 138 139
-             143:    6(float) CompositeExtract 112 0
-             144:    6(float) CompositeExtract 112 1
-             145:    6(float) CompositeExtract 112 2
-             146:    7(fvec4) CompositeConstruct 143 144 145 26
-             147:    6(float) CompositeExtract 146 3
-             148:    6(float) ImageSampleDrefImplicitLod 142 146 147
-                              Store 134(r54) 148
-             155:    154(ptr) AccessChain 150(psout) 151
-                              Store 155 153
-             157:     12(ptr) AccessChain 150(psout) 156
-                              Store 157 152
-             158:8(PS_OUTPUT) Load 150(psout)
-                              ReturnValue 158
+              23:          22 SampledImage 17 21
+              27:   26(fvec2) CompositeConstruct 24 25
+              28:    6(float) CompositeExtract 27 1
+              29:    6(float) ImageSampleDrefImplicitLod 23 27 28
+                              Store 13(r00) 29
+              35:          32 Load 34(g_tTex1di4)
+              36:          18 Load 20(g_sSamp)
+              38:          37 SampledImage 35 36
+              39:   26(fvec2) CompositeConstruct 24 25
+              40:    6(float) CompositeExtract 39 1
+              41:    6(float) ImageSampleDrefImplicitLod 38 39 40
+                              Store 30(r02) 41
+              47:          44 Load 46(g_tTex1du4)
+              48:          18 Load 20(g_sSamp)
+              50:          49 SampledImage 47 48
+              51:   26(fvec2) CompositeConstruct 24 25
+              52:    6(float) CompositeExtract 51 1
+              53:    6(float) ImageSampleDrefImplicitLod 50 51 52
+                              Store 42(r04) 53
+              58:          55 Load 57(g_tTex2df4)
+              59:          18 Load 20(g_sSamp)
+              61:          60 SampledImage 58 59
+              65:    6(float) CompositeExtract 63 0
+              66:    6(float) CompositeExtract 63 1
+              67:   64(fvec3) CompositeConstruct 65 66 25
+              68:    6(float) CompositeExtract 67 2
+              69:    6(float) ImageSampleDrefImplicitLod 61 67 68
+                              Store 54(r20) 69
+              74:          71 Load 73(g_tTex2di4)
+              75:          18 Load 20(g_sSamp)
+              77:          76 SampledImage 74 75
+              78:    6(float) CompositeExtract 63 0
+              79:    6(float) CompositeExtract 63 1
+              80:   64(fvec3) CompositeConstruct 78 79 25
+              81:    6(float) CompositeExtract 80 2
+              82:    6(float) ImageSampleDrefImplicitLod 77 80 81
+                              Store 70(r22) 82
+              87:          84 Load 86(g_tTex2du4)
+              88:          18 Load 20(g_sSamp)
+              90:          89 SampledImage 87 88
+              91:    6(float) CompositeExtract 63 0
+              92:    6(float) CompositeExtract 63 1
+              93:   64(fvec3) CompositeConstruct 91 92 25
+              94:    6(float) CompositeExtract 93 2
+              95:    6(float) ImageSampleDrefImplicitLod 90 93 94
+                              Store 83(r24) 95
+             100:          97 Load 99(g_tTexcdf4)
+             101:          18 Load 20(g_sSamp)
+             103:         102 SampledImage 100 101
+             106:    6(float) CompositeExtract 105 0
+             107:    6(float) CompositeExtract 105 1
+             108:    6(float) CompositeExtract 105 2
+             109:    7(fvec4) CompositeConstruct 106 107 108 25
+             110:    6(float) CompositeExtract 109 3
+             111:    6(float) ImageSampleDrefImplicitLod 103 109 110
+                              Store 96(r50) 111
+             116:         113 Load 115(g_tTexcdi4)
+             117:          18 Load 20(g_sSamp)
+             119:         118 SampledImage 116 117
+             120:    6(float) CompositeExtract 105 0
+             121:    6(float) CompositeExtract 105 1
+             122:    6(float) CompositeExtract 105 2
+             123:    7(fvec4) CompositeConstruct 120 121 122 25
+             124:    6(float) CompositeExtract 123 3
+             125:    6(float) ImageSampleDrefImplicitLod 119 123 124
+                              Store 112(r52) 125
+             130:         127 Load 129(g_tTexcdu4)
+             131:          18 Load 20(g_sSamp)
+             133:         132 SampledImage 130 131
+             134:    6(float) CompositeExtract 105 0
+             135:    6(float) CompositeExtract 105 1
+             136:    6(float) CompositeExtract 105 2
+             137:    7(fvec4) CompositeConstruct 134 135 136 25
+             138:    6(float) CompositeExtract 137 3
+             139:    6(float) ImageSampleDrefImplicitLod 133 137 138
+                              Store 126(r54) 139
+             146:    145(ptr) AccessChain 141(psout) 142
+                              Store 146 144
+             148:     12(ptr) AccessChain 141(psout) 147
+                              Store 148 143
+             149:8(PS_OUTPUT) Load 141(psout)
+                              ReturnValue 149
                               FunctionEnd
diff --git a/Test/baseResults/hlsl.samplecmp.dualmode.frag.out b/Test/baseResults/hlsl.samplecmp.dualmode.frag.out
new file mode 100644
index 0000000..7bcf085
--- /dev/null
+++ b/Test/baseResults/hlsl.samplecmp.dualmode.frag.out
@@ -0,0 +1,157 @@
+hlsl.samplecmp.dualmode.frag
+WARNING: AST will form illegal SPIR-V; need to transform to legalize
+Shader version: 500
+gl_FragCoord origin is upper left
+0:? Sequence
+0:7  Function Definition: @main( ( temp 4-component vector of float)
+0:7    Function Parameters: 
+0:?     Sequence
+0:10      texture ( temp float)
+0:10        Construct combined texture-sampler ( temp sampler1DShadow)
+0:10          'g_tTex' (layout( binding=3) uniform texture1DShadow)
+0:10          'g_sSampCmp' (layout( binding=1) uniform sampler)
+0:10        Construct vec2 ( temp 2-component vector of float)
+0:10          Constant:
+0:10            0.100000
+0:10          Constant:
+0:10            0.750000
+0:11      texture ( temp 4-component vector of float)
+0:11        Construct combined texture-sampler ( temp sampler1D)
+0:11          'g_tTex' (layout( binding=3) uniform texture1D)
+0:11          'g_sSamp' (layout( binding=0) uniform sampler)
+0:11        Constant:
+0:11          0.100000
+0:13      Branch: Return with expression
+0:13        Constant:
+0:13          0.000000
+0:13          0.000000
+0:13          0.000000
+0:13          0.000000
+0:7  Function Definition: main( ( temp void)
+0:7    Function Parameters: 
+0:?     Sequence
+0:7      move second child to first child ( temp 4-component vector of float)
+0:?         '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+0:7        Function Call: @main( ( temp 4-component vector of float)
+0:?   Linker Objects
+0:?     'g_sSamp' (layout( binding=0) uniform sampler)
+0:?     'g_sSampCmp' (layout( binding=1) uniform sampler)
+0:?     'g_tTex' (layout( binding=3) uniform texture1DShadow)
+0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+0:?     'g_tTex' (layout( binding=3) uniform texture1D)
+
+
+Linked fragment stage:
+
+
+Shader version: 500
+gl_FragCoord origin is upper left
+0:? Sequence
+0:7  Function Definition: @main( ( temp 4-component vector of float)
+0:7    Function Parameters: 
+0:?     Sequence
+0:10      texture ( temp float)
+0:10        Construct combined texture-sampler ( temp sampler1DShadow)
+0:10          'g_tTex' (layout( binding=3) uniform texture1DShadow)
+0:10          'g_sSampCmp' (layout( binding=1) uniform sampler)
+0:10        Construct vec2 ( temp 2-component vector of float)
+0:10          Constant:
+0:10            0.100000
+0:10          Constant:
+0:10            0.750000
+0:11      texture ( temp 4-component vector of float)
+0:11        Construct combined texture-sampler ( temp sampler1D)
+0:11          'g_tTex' (layout( binding=3) uniform texture1D)
+0:11          'g_sSamp' (layout( binding=0) uniform sampler)
+0:11        Constant:
+0:11          0.100000
+0:13      Branch: Return with expression
+0:13        Constant:
+0:13          0.000000
+0:13          0.000000
+0:13          0.000000
+0:13          0.000000
+0:7  Function Definition: main( ( temp void)
+0:7    Function Parameters: 
+0:?     Sequence
+0:7      move second child to first child ( temp 4-component vector of float)
+0:?         '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+0:7        Function Call: @main( ( temp 4-component vector of float)
+0:?   Linker Objects
+0:?     'g_sSamp' (layout( binding=0) uniform sampler)
+0:?     'g_sSampCmp' (layout( binding=1) uniform sampler)
+0:?     'g_tTex' (layout( binding=3) uniform texture1DShadow)
+0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+0:?     'g_tTex' (layout( binding=3) uniform texture1D)
+
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 43
+
+                              Capability Shader
+                              Capability Sampled1D
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 41
+                              ExecutionMode 4 OriginUpperLeft
+                              Source HLSL 500
+                              Name 4  "main"
+                              Name 9  "@main("
+                              Name 13  "g_tTex"
+                              Name 17  "g_sSampCmp"
+                              Name 29  "g_tTex"
+                              Name 31  "g_sSamp"
+                              Name 41  "@entryPointOutput"
+                              Decorate 13(g_tTex) DescriptorSet 0
+                              Decorate 13(g_tTex) Binding 3
+                              Decorate 17(g_sSampCmp) DescriptorSet 0
+                              Decorate 17(g_sSampCmp) Binding 1
+                              Decorate 29(g_tTex) DescriptorSet 0
+                              Decorate 29(g_tTex) Binding 3
+                              Decorate 31(g_sSamp) DescriptorSet 0
+                              Decorate 31(g_sSamp) Binding 0
+                              Decorate 41(@entryPointOutput) Location 0
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+               8:             TypeFunction 7(fvec4)
+              11:             TypeImage 6(float) 1D depth sampled format:Unknown
+              12:             TypePointer UniformConstant 11
+      13(g_tTex):     12(ptr) Variable UniformConstant
+              15:             TypeSampler
+              16:             TypePointer UniformConstant 15
+  17(g_sSampCmp):     16(ptr) Variable UniformConstant
+              19:             TypeSampledImage 11
+              21:    6(float) Constant 1036831949
+              22:    6(float) Constant 1061158912
+              23:             TypeVector 6(float) 2
+              27:             TypeImage 6(float) 1D sampled format:Unknown
+              28:             TypePointer UniformConstant 27
+      29(g_tTex):     28(ptr) Variable UniformConstant
+     31(g_sSamp):     16(ptr) Variable UniformConstant
+              33:             TypeSampledImage 27
+              36:    6(float) Constant 0
+              37:    7(fvec4) ConstantComposite 36 36 36 36
+              40:             TypePointer Output 7(fvec4)
+41(@entryPointOutput):     40(ptr) Variable Output
+         4(main):           2 Function None 3
+               5:             Label
+              42:    7(fvec4) FunctionCall 9(@main()
+                              Store 41(@entryPointOutput) 42
+                              Return
+                              FunctionEnd
+       9(@main():    7(fvec4) Function None 8
+              10:             Label
+              14:          11 Load 13(g_tTex)
+              18:          15 Load 17(g_sSampCmp)
+              20:          19 SampledImage 14 18
+              24:   23(fvec2) CompositeConstruct 21 22
+              25:    6(float) CompositeExtract 24 1
+              26:    6(float) ImageSampleDrefImplicitLod 20 24 25
+              30:          27 Load 29(g_tTex)
+              32:          15 Load 31(g_sSamp)
+              34:          33 SampledImage 30 32
+              35:    7(fvec4) ImageSampleImplicitLod 34 21
+                              ReturnValue 37
+                              FunctionEnd
diff --git a/Test/baseResults/hlsl.samplecmp.negative.frag.out b/Test/baseResults/hlsl.samplecmp.negative.frag.out
index 99cfdbf..65a69e8 100644
--- a/Test/baseResults/hlsl.samplecmp.negative.frag.out
+++ b/Test/baseResults/hlsl.samplecmp.negative.frag.out
@@ -1,47 +1,48 @@
 hlsl.samplecmp.negative.frag
-ERROR: 0:9: '' : expected: SamplerComparisonState 
+ERROR: 0:10: '' : expected: SamplerComparisonState 
 ERROR: 1 compilation errors.  No code generated.
 
 
 Shader version: 500
 gl_FragCoord origin is upper left
 ERROR: node is still EOpNull!
-0:7  Function Definition: @main( ( temp 4-component vector of float)
-0:7    Function Parameters: 
+0:8  Function Definition: @main( ( temp 4-component vector of float)
+0:8    Function Parameters: 
 0:?     Sequence
-0:8      texture ( temp float)
-0:8        Construct combined texture-sampler ( temp sampler2DShadow)
-0:8          'g_shadowTex' ( uniform texture2D)
-0:8          'g_shadowSamplerComp' ( uniform sampler)
-0:8        Construct vec3 ( temp 3-component vector of float)
+0:9      texture ( temp float)
+0:9        Construct combined texture-sampler ( temp sampler2DShadow)
+0:9          'g_shadowTex' ( uniform texture2DShadow)
+0:9          'g_shadowSamplerComp' ( uniform sampler)
+0:9        Construct vec3 ( temp 3-component vector of float)
 0:?           Constant:
 0:?             0.000000
 0:?             0.000000
-0:8          Constant:
-0:8            0.000000
-0:9      ERROR: Bad aggregation op
+0:9          Constant:
+0:9            0.000000
+0:10      ERROR: Bad aggregation op
  ( temp float)
-0:9        'g_shadowTex' ( uniform texture2D)
-0:9        'g_shadowSampler' ( uniform sampler)
+0:10        'g_nonShadowTex' ( uniform texture2D)
+0:10        'g_shadowSampler' ( uniform sampler)
 0:?         Constant:
 0:?           0.000000
 0:?           0.000000
-0:9        Constant:
-0:9          0.000000
-0:11      Branch: Return with expression
-0:11        Constant:
-0:11          0.000000
-0:11          0.000000
-0:11          0.000000
-0:11          0.000000
-0:7  Function Definition: main( ( temp void)
-0:7    Function Parameters: 
+0:10        Constant:
+0:10          0.000000
+0:12      Branch: Return with expression
+0:12        Constant:
+0:12          0.000000
+0:12          0.000000
+0:12          0.000000
+0:12          0.000000
+0:8  Function Definition: main( ( temp void)
+0:8    Function Parameters: 
 0:?     Sequence
-0:7      move second child to first child ( temp 4-component vector of float)
+0:8      move second child to first child ( temp 4-component vector of float)
 0:?         '@entryPointOutput' (layout( location=0) out 4-component vector of float)
-0:7        Function Call: @main( ( temp 4-component vector of float)
+0:8        Function Call: @main( ( temp 4-component vector of float)
 0:?   Linker Objects
-0:?     'g_shadowTex' ( uniform texture2D)
+0:?     'g_nonShadowTex' ( uniform texture2D)
+0:?     'g_shadowTex' ( uniform texture2DShadow)
 0:?     'g_shadowSampler' ( uniform sampler)
 0:?     'g_shadowSamplerComp' ( uniform sampler)
 0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
@@ -53,42 +54,43 @@
 Shader version: 500
 gl_FragCoord origin is upper left
 ERROR: node is still EOpNull!
-0:7  Function Definition: @main( ( temp 4-component vector of float)
-0:7    Function Parameters: 
+0:8  Function Definition: @main( ( temp 4-component vector of float)
+0:8    Function Parameters: 
 0:?     Sequence
-0:8      texture ( temp float)
-0:8        Construct combined texture-sampler ( temp sampler2DShadow)
-0:8          'g_shadowTex' ( uniform texture2D)
-0:8          'g_shadowSamplerComp' ( uniform sampler)
-0:8        Construct vec3 ( temp 3-component vector of float)
+0:9      texture ( temp float)
+0:9        Construct combined texture-sampler ( temp sampler2DShadow)
+0:9          'g_shadowTex' ( uniform texture2DShadow)
+0:9          'g_shadowSamplerComp' ( uniform sampler)
+0:9        Construct vec3 ( temp 3-component vector of float)
 0:?           Constant:
 0:?             0.000000
 0:?             0.000000
-0:8          Constant:
-0:8            0.000000
-0:9      ERROR: Bad aggregation op
+0:9          Constant:
+0:9            0.000000
+0:10      ERROR: Bad aggregation op
  ( temp float)
-0:9        'g_shadowTex' ( uniform texture2D)
-0:9        'g_shadowSampler' ( uniform sampler)
+0:10        'g_nonShadowTex' ( uniform texture2D)
+0:10        'g_shadowSampler' ( uniform sampler)
 0:?         Constant:
 0:?           0.000000
 0:?           0.000000
-0:9        Constant:
-0:9          0.000000
-0:11      Branch: Return with expression
-0:11        Constant:
-0:11          0.000000
-0:11          0.000000
-0:11          0.000000
-0:11          0.000000
-0:7  Function Definition: main( ( temp void)
-0:7    Function Parameters: 
+0:10        Constant:
+0:10          0.000000
+0:12      Branch: Return with expression
+0:12        Constant:
+0:12          0.000000
+0:12          0.000000
+0:12          0.000000
+0:12          0.000000
+0:8  Function Definition: main( ( temp void)
+0:8    Function Parameters: 
 0:?     Sequence
-0:7      move second child to first child ( temp 4-component vector of float)
+0:8      move second child to first child ( temp 4-component vector of float)
 0:?         '@entryPointOutput' (layout( location=0) out 4-component vector of float)
-0:7        Function Call: @main( ( temp 4-component vector of float)
+0:8        Function Call: @main( ( temp 4-component vector of float)
 0:?   Linker Objects
-0:?     'g_shadowTex' ( uniform texture2D)
+0:?     'g_nonShadowTex' ( uniform texture2D)
+0:?     'g_shadowTex' ( uniform texture2DShadow)
 0:?     'g_shadowSampler' ( uniform sampler)
 0:?     'g_shadowSamplerComp' ( uniform sampler)
 0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
diff --git a/Test/baseResults/hlsl.samplecmp.offset.dx10.frag.out b/Test/baseResults/hlsl.samplecmp.offset.dx10.frag.out
index 290c8b4..cb4ce39 100644
--- a/Test/baseResults/hlsl.samplecmp.offset.dx10.frag.out
+++ b/Test/baseResults/hlsl.samplecmp.offset.dx10.frag.out
@@ -1,6 +1,7 @@
 hlsl.samplecmp.offset.dx10.frag
 Shader version: 500
 gl_FragCoord origin is upper left
+using depth_any
 0:? Sequence
 0:38  Function Definition: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:38    Function Parameters: 
@@ -10,7 +11,7 @@
 0:42          'r01' ( temp float)
 0:42          textureOffset ( temp float)
 0:42            Construct combined texture-sampler ( temp sampler1DShadow)
-0:42              'g_tTex1df4' (layout( binding=0) uniform texture1D)
+0:42              'g_tTex1df4' (layout( binding=0) uniform texture1DShadow)
 0:42              'g_sSamp' (layout( binding=0) uniform sampler)
 0:42            Construct vec2 ( temp 2-component vector of float)
 0:42              Constant:
@@ -24,7 +25,7 @@
 0:43          'r03' ( temp float)
 0:43          textureOffset ( temp float)
 0:43            Construct combined texture-sampler ( temp isampler1DShadow)
-0:43              'g_tTex1di4' ( uniform itexture1D)
+0:43              'g_tTex1di4' ( uniform itexture1DShadow)
 0:43              'g_sSamp' (layout( binding=0) uniform sampler)
 0:43            Construct vec2 ( temp 2-component vector of float)
 0:43              Constant:
@@ -38,7 +39,7 @@
 0:44          'r05' ( temp float)
 0:44          textureOffset ( temp float)
 0:44            Construct combined texture-sampler ( temp usampler1DShadow)
-0:44              'g_tTex1du4' ( uniform utexture1D)
+0:44              'g_tTex1du4' ( uniform utexture1DShadow)
 0:44              'g_sSamp' (layout( binding=0) uniform sampler)
 0:44            Construct vec2 ( temp 2-component vector of float)
 0:44              Constant:
@@ -52,7 +53,7 @@
 0:47          'r21' ( temp float)
 0:47          textureOffset ( temp float)
 0:47            Construct combined texture-sampler ( temp sampler2DShadow)
-0:47              'g_tTex2df4' ( uniform texture2D)
+0:47              'g_tTex2df4' ( uniform texture2DShadow)
 0:47              'g_sSamp' (layout( binding=0) uniform sampler)
 0:47            Construct vec3 ( temp 3-component vector of float)
 0:?               Constant:
@@ -68,7 +69,7 @@
 0:48          'r23' ( temp float)
 0:48          textureOffset ( temp float)
 0:48            Construct combined texture-sampler ( temp isampler2DShadow)
-0:48              'g_tTex2di4' ( uniform itexture2D)
+0:48              'g_tTex2di4' ( uniform itexture2DShadow)
 0:48              'g_sSamp' (layout( binding=0) uniform sampler)
 0:48            Construct vec3 ( temp 3-component vector of float)
 0:?               Constant:
@@ -84,7 +85,7 @@
 0:49          'r25' ( temp float)
 0:49          textureOffset ( temp float)
 0:49            Construct combined texture-sampler ( temp usampler2DShadow)
-0:49              'g_tTex2du4' ( uniform utexture2D)
+0:49              'g_tTex2du4' ( uniform utexture2DShadow)
 0:49              'g_sSamp' (layout( binding=0) uniform sampler)
 0:49            Construct vec3 ( temp 3-component vector of float)
 0:?               Constant:
@@ -122,25 +123,25 @@
 0:38          'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:38          Function Call: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:38        move second child to first child ( temp 4-component vector of float)
-0:?           'Color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 0:38          Color: direct index for structure ( temp 4-component vector of float)
 0:38            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:38            Constant:
 0:38              0 (const int)
 0:38        move second child to first child ( temp float)
-0:?           'Depth' ( out float FragDepth)
+0:?           '@entryPointOutput.Depth' ( out float FragDepth)
 0:38          Depth: direct index for structure ( temp float)
 0:38            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:38            Constant:
 0:38              1 (const int)
 0:?   Linker Objects
 0:?     'g_sSamp' (layout( binding=0) uniform sampler)
-0:?     'g_tTex1df4' (layout( binding=0) uniform texture1D)
-0:?     'g_tTex1di4' ( uniform itexture1D)
-0:?     'g_tTex1du4' ( uniform utexture1D)
-0:?     'g_tTex2df4' ( uniform texture2D)
-0:?     'g_tTex2di4' ( uniform itexture2D)
-0:?     'g_tTex2du4' ( uniform utexture2D)
+0:?     'g_tTex1df4' (layout( binding=0) uniform texture1DShadow)
+0:?     'g_tTex1di4' ( uniform itexture1DShadow)
+0:?     'g_tTex1du4' ( uniform utexture1DShadow)
+0:?     'g_tTex2df4' ( uniform texture2DShadow)
+0:?     'g_tTex2di4' ( uniform itexture2DShadow)
+0:?     'g_tTex2du4' ( uniform utexture2DShadow)
 0:?     'g_tTex3df4' ( uniform texture3D)
 0:?     'g_tTex3di4' ( uniform itexture3D)
 0:?     'g_tTex3du4' ( uniform utexture3D)
@@ -156,8 +157,8 @@
 0:?     'g_tTexcdf4a' ( uniform textureCubeArray)
 0:?     'g_tTexcdi4a' ( uniform itextureCubeArray)
 0:?     'g_tTexcdu4a' ( uniform utextureCubeArray)
-0:?     'Color' (layout( location=0) out 4-component vector of float)
-0:?     'Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 
 Linked fragment stage:
@@ -165,6 +166,7 @@
 
 Shader version: 500
 gl_FragCoord origin is upper left
+using depth_any
 0:? Sequence
 0:38  Function Definition: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:38    Function Parameters: 
@@ -174,7 +176,7 @@
 0:42          'r01' ( temp float)
 0:42          textureOffset ( temp float)
 0:42            Construct combined texture-sampler ( temp sampler1DShadow)
-0:42              'g_tTex1df4' (layout( binding=0) uniform texture1D)
+0:42              'g_tTex1df4' (layout( binding=0) uniform texture1DShadow)
 0:42              'g_sSamp' (layout( binding=0) uniform sampler)
 0:42            Construct vec2 ( temp 2-component vector of float)
 0:42              Constant:
@@ -188,7 +190,7 @@
 0:43          'r03' ( temp float)
 0:43          textureOffset ( temp float)
 0:43            Construct combined texture-sampler ( temp isampler1DShadow)
-0:43              'g_tTex1di4' ( uniform itexture1D)
+0:43              'g_tTex1di4' ( uniform itexture1DShadow)
 0:43              'g_sSamp' (layout( binding=0) uniform sampler)
 0:43            Construct vec2 ( temp 2-component vector of float)
 0:43              Constant:
@@ -202,7 +204,7 @@
 0:44          'r05' ( temp float)
 0:44          textureOffset ( temp float)
 0:44            Construct combined texture-sampler ( temp usampler1DShadow)
-0:44              'g_tTex1du4' ( uniform utexture1D)
+0:44              'g_tTex1du4' ( uniform utexture1DShadow)
 0:44              'g_sSamp' (layout( binding=0) uniform sampler)
 0:44            Construct vec2 ( temp 2-component vector of float)
 0:44              Constant:
@@ -216,7 +218,7 @@
 0:47          'r21' ( temp float)
 0:47          textureOffset ( temp float)
 0:47            Construct combined texture-sampler ( temp sampler2DShadow)
-0:47              'g_tTex2df4' ( uniform texture2D)
+0:47              'g_tTex2df4' ( uniform texture2DShadow)
 0:47              'g_sSamp' (layout( binding=0) uniform sampler)
 0:47            Construct vec3 ( temp 3-component vector of float)
 0:?               Constant:
@@ -232,7 +234,7 @@
 0:48          'r23' ( temp float)
 0:48          textureOffset ( temp float)
 0:48            Construct combined texture-sampler ( temp isampler2DShadow)
-0:48              'g_tTex2di4' ( uniform itexture2D)
+0:48              'g_tTex2di4' ( uniform itexture2DShadow)
 0:48              'g_sSamp' (layout( binding=0) uniform sampler)
 0:48            Construct vec3 ( temp 3-component vector of float)
 0:?               Constant:
@@ -248,7 +250,7 @@
 0:49          'r25' ( temp float)
 0:49          textureOffset ( temp float)
 0:49            Construct combined texture-sampler ( temp usampler2DShadow)
-0:49              'g_tTex2du4' ( uniform utexture2D)
+0:49              'g_tTex2du4' ( uniform utexture2DShadow)
 0:49              'g_sSamp' (layout( binding=0) uniform sampler)
 0:49            Construct vec3 ( temp 3-component vector of float)
 0:?               Constant:
@@ -286,25 +288,25 @@
 0:38          'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:38          Function Call: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:38        move second child to first child ( temp 4-component vector of float)
-0:?           'Color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 0:38          Color: direct index for structure ( temp 4-component vector of float)
 0:38            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:38            Constant:
 0:38              0 (const int)
 0:38        move second child to first child ( temp float)
-0:?           'Depth' ( out float FragDepth)
+0:?           '@entryPointOutput.Depth' ( out float FragDepth)
 0:38          Depth: direct index for structure ( temp float)
 0:38            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:38            Constant:
 0:38              1 (const int)
 0:?   Linker Objects
 0:?     'g_sSamp' (layout( binding=0) uniform sampler)
-0:?     'g_tTex1df4' (layout( binding=0) uniform texture1D)
-0:?     'g_tTex1di4' ( uniform itexture1D)
-0:?     'g_tTex1du4' ( uniform utexture1D)
-0:?     'g_tTex2df4' ( uniform texture2D)
-0:?     'g_tTex2di4' ( uniform itexture2D)
-0:?     'g_tTex2du4' ( uniform utexture2D)
+0:?     'g_tTex1df4' (layout( binding=0) uniform texture1DShadow)
+0:?     'g_tTex1di4' ( uniform itexture1DShadow)
+0:?     'g_tTex1du4' ( uniform utexture1DShadow)
+0:?     'g_tTex2df4' ( uniform texture2DShadow)
+0:?     'g_tTex2di4' ( uniform itexture2DShadow)
+0:?     'g_tTex2du4' ( uniform utexture2DShadow)
 0:?     'g_tTex3df4' ( uniform texture3D)
 0:?     'g_tTex3di4' ( uniform itexture3D)
 0:?     'g_tTex3du4' ( uniform utexture3D)
@@ -320,20 +322,25 @@
 0:?     'g_tTexcdf4a' ( uniform textureCubeArray)
 0:?     'g_tTexcdi4a' ( uniform itextureCubeArray)
 0:?     'g_tTexcdu4a' ( uniform utextureCubeArray)
-0:?     'Color' (layout( location=0) out 4-component vector of float)
-0:?     'Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
+
+error: SPIRV-Tools Validation Errors
+error: Expected Image 'Sampled Type' to be the same as Result Type
+  %42 = OpImageSampleDrefImplicitLod %float %39 %40 %41 ConstOffset %int_2
 
 // Module Version 10000
-// Generated by (magic number): 80001
-// Id's are bound by 173
+// Generated by (magic number): 80007
+// Id's are bound by 167
 
                               Capability Shader
                               Capability Sampled1D
                               Capability SampledCubeArray
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "main" 121 125
+                              EntryPoint Fragment 4  "main" 115 119
                               ExecutionMode 4 OriginUpperLeft
+                              ExecutionMode 4 DepthReplacing
                               Source HLSL 500
                               Name 4  "main"
                               Name 8  "PS_OUTPUT"
@@ -343,61 +350,61 @@
                               Name 13  "r01"
                               Name 16  "g_tTex1df4"
                               Name 20  "g_sSamp"
-                              Name 33  "r03"
-                              Name 36  "g_tTex1di4"
-                              Name 45  "r05"
-                              Name 49  "g_tTex1du4"
-                              Name 58  "r21"
-                              Name 61  "g_tTex2df4"
-                              Name 78  "r23"
-                              Name 81  "g_tTex2di4"
-                              Name 92  "r25"
-                              Name 95  "g_tTex2du4"
-                              Name 107  "psout"
-                              Name 118  "flattenTemp"
-                              Name 121  "Color"
-                              Name 125  "Depth"
-                              Name 130  "g_tTex3df4"
-                              Name 133  "g_tTex3di4"
-                              Name 136  "g_tTex3du4"
-                              Name 139  "g_tTexcdf4"
-                              Name 142  "g_tTexcdi4"
-                              Name 145  "g_tTexcdu4"
-                              Name 148  "g_tTex1df4a"
-                              Name 151  "g_tTex1di4a"
-                              Name 154  "g_tTex1du4a"
-                              Name 157  "g_tTex2df4a"
-                              Name 160  "g_tTex2di4a"
-                              Name 163  "g_tTex2du4a"
-                              Name 166  "g_tTexcdf4a"
-                              Name 169  "g_tTexcdi4a"
-                              Name 172  "g_tTexcdu4a"
+                              Name 32  "r03"
+                              Name 35  "g_tTex1di4"
+                              Name 43  "r05"
+                              Name 47  "g_tTex1du4"
+                              Name 55  "r21"
+                              Name 58  "g_tTex2df4"
+                              Name 74  "r23"
+                              Name 77  "g_tTex2di4"
+                              Name 87  "r25"
+                              Name 90  "g_tTex2du4"
+                              Name 101  "psout"
+                              Name 112  "flattenTemp"
+                              Name 115  "@entryPointOutput.Color"
+                              Name 119  "@entryPointOutput.Depth"
+                              Name 124  "g_tTex3df4"
+                              Name 127  "g_tTex3di4"
+                              Name 130  "g_tTex3du4"
+                              Name 133  "g_tTexcdf4"
+                              Name 136  "g_tTexcdi4"
+                              Name 139  "g_tTexcdu4"
+                              Name 142  "g_tTex1df4a"
+                              Name 145  "g_tTex1di4a"
+                              Name 148  "g_tTex1du4a"
+                              Name 151  "g_tTex2df4a"
+                              Name 154  "g_tTex2di4a"
+                              Name 157  "g_tTex2du4a"
+                              Name 160  "g_tTexcdf4a"
+                              Name 163  "g_tTexcdi4a"
+                              Name 166  "g_tTexcdu4a"
                               Decorate 16(g_tTex1df4) DescriptorSet 0
                               Decorate 16(g_tTex1df4) Binding 0
                               Decorate 20(g_sSamp) DescriptorSet 0
                               Decorate 20(g_sSamp) Binding 0
-                              Decorate 36(g_tTex1di4) DescriptorSet 0
-                              Decorate 49(g_tTex1du4) DescriptorSet 0
-                              Decorate 61(g_tTex2df4) DescriptorSet 0
-                              Decorate 81(g_tTex2di4) DescriptorSet 0
-                              Decorate 95(g_tTex2du4) DescriptorSet 0
-                              Decorate 121(Color) Location 0
-                              Decorate 125(Depth) BuiltIn FragDepth
-                              Decorate 130(g_tTex3df4) DescriptorSet 0
-                              Decorate 133(g_tTex3di4) DescriptorSet 0
-                              Decorate 136(g_tTex3du4) DescriptorSet 0
-                              Decorate 139(g_tTexcdf4) DescriptorSet 0
-                              Decorate 142(g_tTexcdi4) DescriptorSet 0
-                              Decorate 145(g_tTexcdu4) DescriptorSet 0
-                              Decorate 148(g_tTex1df4a) DescriptorSet 0
-                              Decorate 151(g_tTex1di4a) DescriptorSet 0
-                              Decorate 154(g_tTex1du4a) DescriptorSet 0
-                              Decorate 157(g_tTex2df4a) DescriptorSet 0
-                              Decorate 160(g_tTex2di4a) DescriptorSet 0
-                              Decorate 163(g_tTex2du4a) DescriptorSet 0
-                              Decorate 166(g_tTexcdf4a) DescriptorSet 0
-                              Decorate 169(g_tTexcdi4a) DescriptorSet 0
-                              Decorate 172(g_tTexcdu4a) DescriptorSet 0
+                              Decorate 35(g_tTex1di4) DescriptorSet 0
+                              Decorate 47(g_tTex1du4) DescriptorSet 0
+                              Decorate 58(g_tTex2df4) DescriptorSet 0
+                              Decorate 77(g_tTex2di4) DescriptorSet 0
+                              Decorate 90(g_tTex2du4) DescriptorSet 0
+                              Decorate 115(@entryPointOutput.Color) Location 0
+                              Decorate 119(@entryPointOutput.Depth) BuiltIn FragDepth
+                              Decorate 124(g_tTex3df4) DescriptorSet 0
+                              Decorate 127(g_tTex3di4) DescriptorSet 0
+                              Decorate 130(g_tTex3du4) DescriptorSet 0
+                              Decorate 133(g_tTexcdf4) DescriptorSet 0
+                              Decorate 136(g_tTexcdi4) DescriptorSet 0
+                              Decorate 139(g_tTexcdu4) DescriptorSet 0
+                              Decorate 142(g_tTex1df4a) DescriptorSet 0
+                              Decorate 145(g_tTex1di4a) DescriptorSet 0
+                              Decorate 148(g_tTex1du4a) DescriptorSet 0
+                              Decorate 151(g_tTex2df4a) DescriptorSet 0
+                              Decorate 154(g_tTex2di4a) DescriptorSet 0
+                              Decorate 157(g_tTex2du4a) DescriptorSet 0
+                              Decorate 160(g_tTexcdf4a) DescriptorSet 0
+                              Decorate 163(g_tTexcdi4a) DescriptorSet 0
+                              Decorate 166(g_tTexcdu4a) DescriptorSet 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -405,180 +412,174 @@
     8(PS_OUTPUT):             TypeStruct 7(fvec4) 6(float)
                9:             TypeFunction 8(PS_OUTPUT)
               12:             TypePointer Function 6(float)
-              14:             TypeImage 6(float) 1D sampled format:Unknown
+              14:             TypeImage 6(float) 1D depth sampled format:Unknown
               15:             TypePointer UniformConstant 14
   16(g_tTex1df4):     15(ptr) Variable UniformConstant
               18:             TypeSampler
               19:             TypePointer UniformConstant 18
      20(g_sSamp):     19(ptr) Variable UniformConstant
-              22:             TypeImage 6(float) 1D depth sampled format:Unknown
-              23:             TypeSampledImage 22
-              25:    6(float) Constant 1036831949
-              26:    6(float) Constant 1061158912
-              27:             TypeVector 6(float) 2
-              29:             TypeInt 32 1
-              30:     29(int) Constant 2
-              34:             TypeImage 29(int) 1D sampled format:Unknown
-              35:             TypePointer UniformConstant 34
-  36(g_tTex1di4):     35(ptr) Variable UniformConstant
-              39:             TypeImage 29(int) 1D depth sampled format:Unknown
-              40:             TypeSampledImage 39
-              46:             TypeInt 32 0
-              47:             TypeImage 46(int) 1D sampled format:Unknown
-              48:             TypePointer UniformConstant 47
-  49(g_tTex1du4):     48(ptr) Variable UniformConstant
-              52:             TypeImage 46(int) 1D depth sampled format:Unknown
-              53:             TypeSampledImage 52
-              59:             TypeImage 6(float) 2D sampled format:Unknown
-              60:             TypePointer UniformConstant 59
-  61(g_tTex2df4):     60(ptr) Variable UniformConstant
-              64:             TypeImage 6(float) 2D depth sampled format:Unknown
-              65:             TypeSampledImage 64
-              67:    6(float) Constant 1045220557
-              68:   27(fvec2) ConstantComposite 25 67
-              69:             TypeVector 6(float) 3
-              73:             TypeVector 29(int) 2
-              74:     29(int) Constant 3
-              75:   73(ivec2) ConstantComposite 30 74
-              79:             TypeImage 29(int) 2D sampled format:Unknown
-              80:             TypePointer UniformConstant 79
-  81(g_tTex2di4):     80(ptr) Variable UniformConstant
-              84:             TypeImage 29(int) 2D depth sampled format:Unknown
-              85:             TypeSampledImage 84
-              93:             TypeImage 46(int) 2D sampled format:Unknown
-              94:             TypePointer UniformConstant 93
-  95(g_tTex2du4):     94(ptr) Variable UniformConstant
-              98:             TypeImage 46(int) 2D depth sampled format:Unknown
-              99:             TypeSampledImage 98
-             106:             TypePointer Function 8(PS_OUTPUT)
-             108:     29(int) Constant 0
-             109:    6(float) Constant 1065353216
-             110:    7(fvec4) ConstantComposite 109 109 109 109
-             111:             TypePointer Function 7(fvec4)
-             113:     29(int) Constant 1
-             120:             TypePointer Output 7(fvec4)
-      121(Color):    120(ptr) Variable Output
-             124:             TypePointer Output 6(float)
-      125(Depth):    124(ptr) Variable Output
-             128:             TypeImage 6(float) 3D sampled format:Unknown
+              22:             TypeSampledImage 14
+              24:    6(float) Constant 1036831949
+              25:    6(float) Constant 1061158912
+              26:             TypeVector 6(float) 2
+              28:             TypeInt 32 1
+              29:     28(int) Constant 2
+              33:             TypeImage 28(int) 1D depth sampled format:Unknown
+              34:             TypePointer UniformConstant 33
+  35(g_tTex1di4):     34(ptr) Variable UniformConstant
+              38:             TypeSampledImage 33
+              44:             TypeInt 32 0
+              45:             TypeImage 44(int) 1D depth sampled format:Unknown
+              46:             TypePointer UniformConstant 45
+  47(g_tTex1du4):     46(ptr) Variable UniformConstant
+              50:             TypeSampledImage 45
+              56:             TypeImage 6(float) 2D depth sampled format:Unknown
+              57:             TypePointer UniformConstant 56
+  58(g_tTex2df4):     57(ptr) Variable UniformConstant
+              61:             TypeSampledImage 56
+              63:    6(float) Constant 1045220557
+              64:   26(fvec2) ConstantComposite 24 63
+              65:             TypeVector 6(float) 3
+              69:             TypeVector 28(int) 2
+              70:     28(int) Constant 3
+              71:   69(ivec2) ConstantComposite 29 70
+              75:             TypeImage 28(int) 2D depth sampled format:Unknown
+              76:             TypePointer UniformConstant 75
+  77(g_tTex2di4):     76(ptr) Variable UniformConstant
+              80:             TypeSampledImage 75
+              88:             TypeImage 44(int) 2D depth sampled format:Unknown
+              89:             TypePointer UniformConstant 88
+  90(g_tTex2du4):     89(ptr) Variable UniformConstant
+              93:             TypeSampledImage 88
+             100:             TypePointer Function 8(PS_OUTPUT)
+             102:     28(int) Constant 0
+             103:    6(float) Constant 1065353216
+             104:    7(fvec4) ConstantComposite 103 103 103 103
+             105:             TypePointer Function 7(fvec4)
+             107:     28(int) Constant 1
+             114:             TypePointer Output 7(fvec4)
+115(@entryPointOutput.Color):    114(ptr) Variable Output
+             118:             TypePointer Output 6(float)
+119(@entryPointOutput.Depth):    118(ptr) Variable Output
+             122:             TypeImage 6(float) 3D sampled format:Unknown
+             123:             TypePointer UniformConstant 122
+ 124(g_tTex3df4):    123(ptr) Variable UniformConstant
+             125:             TypeImage 28(int) 3D sampled format:Unknown
+             126:             TypePointer UniformConstant 125
+ 127(g_tTex3di4):    126(ptr) Variable UniformConstant
+             128:             TypeImage 44(int) 3D sampled format:Unknown
              129:             TypePointer UniformConstant 128
- 130(g_tTex3df4):    129(ptr) Variable UniformConstant
-             131:             TypeImage 29(int) 3D sampled format:Unknown
+ 130(g_tTex3du4):    129(ptr) Variable UniformConstant
+             131:             TypeImage 6(float) Cube sampled format:Unknown
              132:             TypePointer UniformConstant 131
- 133(g_tTex3di4):    132(ptr) Variable UniformConstant
-             134:             TypeImage 46(int) 3D sampled format:Unknown
+ 133(g_tTexcdf4):    132(ptr) Variable UniformConstant
+             134:             TypeImage 28(int) Cube sampled format:Unknown
              135:             TypePointer UniformConstant 134
- 136(g_tTex3du4):    135(ptr) Variable UniformConstant
-             137:             TypeImage 6(float) Cube sampled format:Unknown
+ 136(g_tTexcdi4):    135(ptr) Variable UniformConstant
+             137:             TypeImage 44(int) Cube sampled format:Unknown
              138:             TypePointer UniformConstant 137
- 139(g_tTexcdf4):    138(ptr) Variable UniformConstant
-             140:             TypeImage 29(int) Cube sampled format:Unknown
+ 139(g_tTexcdu4):    138(ptr) Variable UniformConstant
+             140:             TypeImage 6(float) 1D array sampled format:Unknown
              141:             TypePointer UniformConstant 140
- 142(g_tTexcdi4):    141(ptr) Variable UniformConstant
-             143:             TypeImage 46(int) Cube sampled format:Unknown
+142(g_tTex1df4a):    141(ptr) Variable UniformConstant
+             143:             TypeImage 28(int) 1D array sampled format:Unknown
              144:             TypePointer UniformConstant 143
- 145(g_tTexcdu4):    144(ptr) Variable UniformConstant
-             146:             TypeImage 6(float) 1D array sampled format:Unknown
+145(g_tTex1di4a):    144(ptr) Variable UniformConstant
+             146:             TypeImage 44(int) 1D array sampled format:Unknown
              147:             TypePointer UniformConstant 146
-148(g_tTex1df4a):    147(ptr) Variable UniformConstant
-             149:             TypeImage 29(int) 1D array sampled format:Unknown
+148(g_tTex1du4a):    147(ptr) Variable UniformConstant
+             149:             TypeImage 6(float) 2D array sampled format:Unknown
              150:             TypePointer UniformConstant 149
-151(g_tTex1di4a):    150(ptr) Variable UniformConstant
-             152:             TypeImage 46(int) 1D array sampled format:Unknown
+151(g_tTex2df4a):    150(ptr) Variable UniformConstant
+             152:             TypeImage 28(int) 2D array sampled format:Unknown
              153:             TypePointer UniformConstant 152
-154(g_tTex1du4a):    153(ptr) Variable UniformConstant
-             155:             TypeImage 6(float) 2D array sampled format:Unknown
+154(g_tTex2di4a):    153(ptr) Variable UniformConstant
+             155:             TypeImage 44(int) 2D array sampled format:Unknown
              156:             TypePointer UniformConstant 155
-157(g_tTex2df4a):    156(ptr) Variable UniformConstant
-             158:             TypeImage 29(int) 2D array sampled format:Unknown
+157(g_tTex2du4a):    156(ptr) Variable UniformConstant
+             158:             TypeImage 6(float) Cube array sampled format:Unknown
              159:             TypePointer UniformConstant 158
-160(g_tTex2di4a):    159(ptr) Variable UniformConstant
-             161:             TypeImage 46(int) 2D array sampled format:Unknown
+160(g_tTexcdf4a):    159(ptr) Variable UniformConstant
+             161:             TypeImage 28(int) Cube array sampled format:Unknown
              162:             TypePointer UniformConstant 161
-163(g_tTex2du4a):    162(ptr) Variable UniformConstant
-             164:             TypeImage 6(float) Cube array sampled format:Unknown
+163(g_tTexcdi4a):    162(ptr) Variable UniformConstant
+             164:             TypeImage 44(int) Cube array sampled format:Unknown
              165:             TypePointer UniformConstant 164
-166(g_tTexcdf4a):    165(ptr) Variable UniformConstant
-             167:             TypeImage 29(int) Cube array sampled format:Unknown
-             168:             TypePointer UniformConstant 167
-169(g_tTexcdi4a):    168(ptr) Variable UniformConstant
-             170:             TypeImage 46(int) Cube array sampled format:Unknown
-             171:             TypePointer UniformConstant 170
-172(g_tTexcdu4a):    171(ptr) Variable UniformConstant
+166(g_tTexcdu4a):    165(ptr) Variable UniformConstant
          4(main):           2 Function None 3
                5:             Label
-118(flattenTemp):    106(ptr) Variable Function
-             119:8(PS_OUTPUT) FunctionCall 10(@main()
-                              Store 118(flattenTemp) 119
-             122:    111(ptr) AccessChain 118(flattenTemp) 108
-             123:    7(fvec4) Load 122
-                              Store 121(Color) 123
-             126:     12(ptr) AccessChain 118(flattenTemp) 113
-             127:    6(float) Load 126
-                              Store 125(Depth) 127
+112(flattenTemp):    100(ptr) Variable Function
+             113:8(PS_OUTPUT) FunctionCall 10(@main()
+                              Store 112(flattenTemp) 113
+             116:    105(ptr) AccessChain 112(flattenTemp) 102
+             117:    7(fvec4) Load 116
+                              Store 115(@entryPointOutput.Color) 117
+             120:     12(ptr) AccessChain 112(flattenTemp) 107
+             121:    6(float) Load 120
+                              Store 119(@entryPointOutput.Depth) 121
                               Return
                               FunctionEnd
       10(@main():8(PS_OUTPUT) Function None 9
               11:             Label
          13(r01):     12(ptr) Variable Function
-         33(r03):     12(ptr) Variable Function
-         45(r05):     12(ptr) Variable Function
-         58(r21):     12(ptr) Variable Function
-         78(r23):     12(ptr) Variable Function
-         92(r25):     12(ptr) Variable Function
-      107(psout):    106(ptr) Variable Function
+         32(r03):     12(ptr) Variable Function
+         43(r05):     12(ptr) Variable Function
+         55(r21):     12(ptr) Variable Function
+         74(r23):     12(ptr) Variable Function
+         87(r25):     12(ptr) Variable Function
+      101(psout):    100(ptr) Variable Function
               17:          14 Load 16(g_tTex1df4)
               21:          18 Load 20(g_sSamp)
-              24:          23 SampledImage 17 21
-              28:   27(fvec2) CompositeConstruct 25 26
-              31:    6(float) CompositeExtract 28 1
-              32:    6(float) ImageSampleDrefImplicitLod 24 28 31 ConstOffset 30
-                              Store 13(r01) 32
-              37:          34 Load 36(g_tTex1di4)
-              38:          18 Load 20(g_sSamp)
-              41:          40 SampledImage 37 38
-              42:   27(fvec2) CompositeConstruct 25 26
-              43:    6(float) CompositeExtract 42 1
-              44:    6(float) ImageSampleDrefImplicitLod 41 42 43 ConstOffset 30
-                              Store 33(r03) 44
-              50:          47 Load 49(g_tTex1du4)
-              51:          18 Load 20(g_sSamp)
-              54:          53 SampledImage 50 51
-              55:   27(fvec2) CompositeConstruct 25 26
-              56:    6(float) CompositeExtract 55 1
-              57:    6(float) ImageSampleDrefImplicitLod 54 55 56 ConstOffset 30
-                              Store 45(r05) 57
-              62:          59 Load 61(g_tTex2df4)
-              63:          18 Load 20(g_sSamp)
-              66:          65 SampledImage 62 63
-              70:    6(float) CompositeExtract 68 0
-              71:    6(float) CompositeExtract 68 1
-              72:   69(fvec3) CompositeConstruct 70 71 26
-              76:    6(float) CompositeExtract 72 2
-              77:    6(float) ImageSampleDrefImplicitLod 66 72 76 ConstOffset 75
-                              Store 58(r21) 77
-              82:          79 Load 81(g_tTex2di4)
-              83:          18 Load 20(g_sSamp)
-              86:          85 SampledImage 82 83
-              87:    6(float) CompositeExtract 68 0
-              88:    6(float) CompositeExtract 68 1
-              89:   69(fvec3) CompositeConstruct 87 88 26
-              90:    6(float) CompositeExtract 89 2
-              91:    6(float) ImageSampleDrefImplicitLod 86 89 90 ConstOffset 75
-                              Store 78(r23) 91
-              96:          93 Load 95(g_tTex2du4)
-              97:          18 Load 20(g_sSamp)
-             100:          99 SampledImage 96 97
-             101:    6(float) CompositeExtract 68 0
-             102:    6(float) CompositeExtract 68 1
-             103:   69(fvec3) CompositeConstruct 101 102 26
-             104:    6(float) CompositeExtract 103 2
-             105:    6(float) ImageSampleDrefImplicitLod 100 103 104 ConstOffset 75
-                              Store 92(r25) 105
-             112:    111(ptr) AccessChain 107(psout) 108
-                              Store 112 110
-             114:     12(ptr) AccessChain 107(psout) 113
-                              Store 114 109
-             115:8(PS_OUTPUT) Load 107(psout)
-                              ReturnValue 115
+              23:          22 SampledImage 17 21
+              27:   26(fvec2) CompositeConstruct 24 25
+              30:    6(float) CompositeExtract 27 1
+              31:    6(float) ImageSampleDrefImplicitLod 23 27 30 ConstOffset 29
+                              Store 13(r01) 31
+              36:          33 Load 35(g_tTex1di4)
+              37:          18 Load 20(g_sSamp)
+              39:          38 SampledImage 36 37
+              40:   26(fvec2) CompositeConstruct 24 25
+              41:    6(float) CompositeExtract 40 1
+              42:    6(float) ImageSampleDrefImplicitLod 39 40 41 ConstOffset 29
+                              Store 32(r03) 42
+              48:          45 Load 47(g_tTex1du4)
+              49:          18 Load 20(g_sSamp)
+              51:          50 SampledImage 48 49
+              52:   26(fvec2) CompositeConstruct 24 25
+              53:    6(float) CompositeExtract 52 1
+              54:    6(float) ImageSampleDrefImplicitLod 51 52 53 ConstOffset 29
+                              Store 43(r05) 54
+              59:          56 Load 58(g_tTex2df4)
+              60:          18 Load 20(g_sSamp)
+              62:          61 SampledImage 59 60
+              66:    6(float) CompositeExtract 64 0
+              67:    6(float) CompositeExtract 64 1
+              68:   65(fvec3) CompositeConstruct 66 67 25
+              72:    6(float) CompositeExtract 68 2
+              73:    6(float) ImageSampleDrefImplicitLod 62 68 72 ConstOffset 71
+                              Store 55(r21) 73
+              78:          75 Load 77(g_tTex2di4)
+              79:          18 Load 20(g_sSamp)
+              81:          80 SampledImage 78 79
+              82:    6(float) CompositeExtract 64 0
+              83:    6(float) CompositeExtract 64 1
+              84:   65(fvec3) CompositeConstruct 82 83 25
+              85:    6(float) CompositeExtract 84 2
+              86:    6(float) ImageSampleDrefImplicitLod 81 84 85 ConstOffset 71
+                              Store 74(r23) 86
+              91:          88 Load 90(g_tTex2du4)
+              92:          18 Load 20(g_sSamp)
+              94:          93 SampledImage 91 92
+              95:    6(float) CompositeExtract 64 0
+              96:    6(float) CompositeExtract 64 1
+              97:   65(fvec3) CompositeConstruct 95 96 25
+              98:    6(float) CompositeExtract 97 2
+              99:    6(float) ImageSampleDrefImplicitLod 94 97 98 ConstOffset 71
+                              Store 87(r25) 99
+             106:    105(ptr) AccessChain 101(psout) 102
+                              Store 106 104
+             108:     12(ptr) AccessChain 101(psout) 107
+                              Store 108 103
+             109:8(PS_OUTPUT) Load 101(psout)
+                              ReturnValue 109
                               FunctionEnd
diff --git a/Test/baseResults/hlsl.samplecmp.offsetarray.dx10.frag.out b/Test/baseResults/hlsl.samplecmp.offsetarray.dx10.frag.out
index ed40102..af2af3f 100644
--- a/Test/baseResults/hlsl.samplecmp.offsetarray.dx10.frag.out
+++ b/Test/baseResults/hlsl.samplecmp.offsetarray.dx10.frag.out
@@ -1,6 +1,7 @@
 hlsl.samplecmp.offsetarray.dx10.frag
 Shader version: 500
 gl_FragCoord origin is upper left
+using depth_any
 0:? Sequence
 0:38  Function Definition: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:38    Function Parameters: 
@@ -10,7 +11,7 @@
 0:42          'r11' ( temp float)
 0:42          textureOffset ( temp float)
 0:42            Construct combined texture-sampler ( temp sampler1DArrayShadow)
-0:42              'g_tTex1df4a' ( uniform texture1DArray)
+0:42              'g_tTex1df4a' ( uniform texture1DArrayShadow)
 0:42              'g_sSamp' (layout( binding=0) uniform sampler)
 0:42            Construct vec3 ( temp 3-component vector of float)
 0:?               Constant:
@@ -25,7 +26,7 @@
 0:43          'r13' ( temp float)
 0:43          textureOffset ( temp float)
 0:43            Construct combined texture-sampler ( temp isampler1DArrayShadow)
-0:43              'g_tTex1di4a' ( uniform itexture1DArray)
+0:43              'g_tTex1di4a' ( uniform itexture1DArrayShadow)
 0:43              'g_sSamp' (layout( binding=0) uniform sampler)
 0:43            Construct vec3 ( temp 3-component vector of float)
 0:?               Constant:
@@ -40,7 +41,7 @@
 0:44          'r15' ( temp float)
 0:44          textureOffset ( temp float)
 0:44            Construct combined texture-sampler ( temp usampler1DArrayShadow)
-0:44              'g_tTex1du4a' ( uniform utexture1DArray)
+0:44              'g_tTex1du4a' ( uniform utexture1DArrayShadow)
 0:44              'g_sSamp' (layout( binding=0) uniform sampler)
 0:44            Construct vec3 ( temp 3-component vector of float)
 0:?               Constant:
@@ -55,7 +56,7 @@
 0:47          'r31' ( temp float)
 0:47          textureOffset ( temp float)
 0:47            Construct combined texture-sampler ( temp sampler2DArrayShadow)
-0:47              'g_tTex2df4a' ( uniform texture2DArray)
+0:47              'g_tTex2df4a' ( uniform texture2DArrayShadow)
 0:47              'g_sSamp' (layout( binding=0) uniform sampler)
 0:47            Construct vec4 ( temp 4-component vector of float)
 0:?               Constant:
@@ -72,7 +73,7 @@
 0:48          'r33' ( temp float)
 0:48          textureOffset ( temp float)
 0:48            Construct combined texture-sampler ( temp isampler2DArrayShadow)
-0:48              'g_tTex2di4a' ( uniform itexture2DArray)
+0:48              'g_tTex2di4a' ( uniform itexture2DArrayShadow)
 0:48              'g_sSamp' (layout( binding=0) uniform sampler)
 0:48            Construct vec4 ( temp 4-component vector of float)
 0:?               Constant:
@@ -89,7 +90,7 @@
 0:49          'r35' ( temp float)
 0:49          textureOffset ( temp float)
 0:49            Construct combined texture-sampler ( temp usampler2DArrayShadow)
-0:49              'g_tTex2du4a' ( uniform utexture2DArray)
+0:49              'g_tTex2du4a' ( uniform utexture2DArrayShadow)
 0:49              'g_sSamp' (layout( binding=0) uniform sampler)
 0:49            Construct vec4 ( temp 4-component vector of float)
 0:?               Constant:
@@ -128,13 +129,13 @@
 0:38          'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:38          Function Call: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:38        move second child to first child ( temp 4-component vector of float)
-0:?           'Color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 0:38          Color: direct index for structure ( temp 4-component vector of float)
 0:38            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:38            Constant:
 0:38              0 (const int)
 0:38        move second child to first child ( temp float)
-0:?           'Depth' ( out float FragDepth)
+0:?           '@entryPointOutput.Depth' ( out float FragDepth)
 0:38          Depth: direct index for structure ( temp float)
 0:38            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:38            Constant:
@@ -153,17 +154,17 @@
 0:?     'g_tTexcdf4' ( uniform textureCube)
 0:?     'g_tTexcdi4' ( uniform itextureCube)
 0:?     'g_tTexcdu4' ( uniform utextureCube)
-0:?     'g_tTex1df4a' ( uniform texture1DArray)
-0:?     'g_tTex1di4a' ( uniform itexture1DArray)
-0:?     'g_tTex1du4a' ( uniform utexture1DArray)
-0:?     'g_tTex2df4a' ( uniform texture2DArray)
-0:?     'g_tTex2di4a' ( uniform itexture2DArray)
-0:?     'g_tTex2du4a' ( uniform utexture2DArray)
+0:?     'g_tTex1df4a' ( uniform texture1DArrayShadow)
+0:?     'g_tTex1di4a' ( uniform itexture1DArrayShadow)
+0:?     'g_tTex1du4a' ( uniform utexture1DArrayShadow)
+0:?     'g_tTex2df4a' ( uniform texture2DArrayShadow)
+0:?     'g_tTex2di4a' ( uniform itexture2DArrayShadow)
+0:?     'g_tTex2du4a' ( uniform utexture2DArrayShadow)
 0:?     'g_tTexcdf4a' ( uniform textureCubeArray)
 0:?     'g_tTexcdi4a' ( uniform itextureCubeArray)
 0:?     'g_tTexcdu4a' ( uniform utextureCubeArray)
-0:?     'Color' (layout( location=0) out 4-component vector of float)
-0:?     'Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 
 Linked fragment stage:
@@ -171,6 +172,7 @@
 
 Shader version: 500
 gl_FragCoord origin is upper left
+using depth_any
 0:? Sequence
 0:38  Function Definition: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:38    Function Parameters: 
@@ -180,7 +182,7 @@
 0:42          'r11' ( temp float)
 0:42          textureOffset ( temp float)
 0:42            Construct combined texture-sampler ( temp sampler1DArrayShadow)
-0:42              'g_tTex1df4a' ( uniform texture1DArray)
+0:42              'g_tTex1df4a' ( uniform texture1DArrayShadow)
 0:42              'g_sSamp' (layout( binding=0) uniform sampler)
 0:42            Construct vec3 ( temp 3-component vector of float)
 0:?               Constant:
@@ -195,7 +197,7 @@
 0:43          'r13' ( temp float)
 0:43          textureOffset ( temp float)
 0:43            Construct combined texture-sampler ( temp isampler1DArrayShadow)
-0:43              'g_tTex1di4a' ( uniform itexture1DArray)
+0:43              'g_tTex1di4a' ( uniform itexture1DArrayShadow)
 0:43              'g_sSamp' (layout( binding=0) uniform sampler)
 0:43            Construct vec3 ( temp 3-component vector of float)
 0:?               Constant:
@@ -210,7 +212,7 @@
 0:44          'r15' ( temp float)
 0:44          textureOffset ( temp float)
 0:44            Construct combined texture-sampler ( temp usampler1DArrayShadow)
-0:44              'g_tTex1du4a' ( uniform utexture1DArray)
+0:44              'g_tTex1du4a' ( uniform utexture1DArrayShadow)
 0:44              'g_sSamp' (layout( binding=0) uniform sampler)
 0:44            Construct vec3 ( temp 3-component vector of float)
 0:?               Constant:
@@ -225,7 +227,7 @@
 0:47          'r31' ( temp float)
 0:47          textureOffset ( temp float)
 0:47            Construct combined texture-sampler ( temp sampler2DArrayShadow)
-0:47              'g_tTex2df4a' ( uniform texture2DArray)
+0:47              'g_tTex2df4a' ( uniform texture2DArrayShadow)
 0:47              'g_sSamp' (layout( binding=0) uniform sampler)
 0:47            Construct vec4 ( temp 4-component vector of float)
 0:?               Constant:
@@ -242,7 +244,7 @@
 0:48          'r33' ( temp float)
 0:48          textureOffset ( temp float)
 0:48            Construct combined texture-sampler ( temp isampler2DArrayShadow)
-0:48              'g_tTex2di4a' ( uniform itexture2DArray)
+0:48              'g_tTex2di4a' ( uniform itexture2DArrayShadow)
 0:48              'g_sSamp' (layout( binding=0) uniform sampler)
 0:48            Construct vec4 ( temp 4-component vector of float)
 0:?               Constant:
@@ -259,7 +261,7 @@
 0:49          'r35' ( temp float)
 0:49          textureOffset ( temp float)
 0:49            Construct combined texture-sampler ( temp usampler2DArrayShadow)
-0:49              'g_tTex2du4a' ( uniform utexture2DArray)
+0:49              'g_tTex2du4a' ( uniform utexture2DArrayShadow)
 0:49              'g_sSamp' (layout( binding=0) uniform sampler)
 0:49            Construct vec4 ( temp 4-component vector of float)
 0:?               Constant:
@@ -298,13 +300,13 @@
 0:38          'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:38          Function Call: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:38        move second child to first child ( temp 4-component vector of float)
-0:?           'Color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 0:38          Color: direct index for structure ( temp 4-component vector of float)
 0:38            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:38            Constant:
 0:38              0 (const int)
 0:38        move second child to first child ( temp float)
-0:?           'Depth' ( out float FragDepth)
+0:?           '@entryPointOutput.Depth' ( out float FragDepth)
 0:38          Depth: direct index for structure ( temp float)
 0:38            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:38            Constant:
@@ -323,29 +325,34 @@
 0:?     'g_tTexcdf4' ( uniform textureCube)
 0:?     'g_tTexcdi4' ( uniform itextureCube)
 0:?     'g_tTexcdu4' ( uniform utextureCube)
-0:?     'g_tTex1df4a' ( uniform texture1DArray)
-0:?     'g_tTex1di4a' ( uniform itexture1DArray)
-0:?     'g_tTex1du4a' ( uniform utexture1DArray)
-0:?     'g_tTex2df4a' ( uniform texture2DArray)
-0:?     'g_tTex2di4a' ( uniform itexture2DArray)
-0:?     'g_tTex2du4a' ( uniform utexture2DArray)
+0:?     'g_tTex1df4a' ( uniform texture1DArrayShadow)
+0:?     'g_tTex1di4a' ( uniform itexture1DArrayShadow)
+0:?     'g_tTex1du4a' ( uniform utexture1DArrayShadow)
+0:?     'g_tTex2df4a' ( uniform texture2DArrayShadow)
+0:?     'g_tTex2di4a' ( uniform itexture2DArrayShadow)
+0:?     'g_tTex2du4a' ( uniform utexture2DArrayShadow)
 0:?     'g_tTexcdf4a' ( uniform textureCubeArray)
 0:?     'g_tTexcdi4a' ( uniform itextureCubeArray)
 0:?     'g_tTexcdu4a' ( uniform utextureCubeArray)
-0:?     'Color' (layout( location=0) out 4-component vector of float)
-0:?     'Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
+
+error: SPIRV-Tools Validation Errors
+error: Expected Image 'Sampled Type' to be the same as Result Type
+  %49 = OpImageSampleDrefImplicitLod %float %44 %47 %48 ConstOffset %int_2
 
 // Module Version 10000
-// Generated by (magic number): 80001
-// Id's are bound by 184
+// Generated by (magic number): 80007
+// Id's are bound by 178
 
                               Capability Shader
                               Capability Sampled1D
                               Capability SampledCubeArray
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "main" 132 136
+                              EntryPoint Fragment 4  "main" 126 130
                               ExecutionMode 4 OriginUpperLeft
+                              ExecutionMode 4 DepthReplacing
                               Source HLSL 500
                               Name 4  "main"
                               Name 8  "PS_OUTPUT"
@@ -355,61 +362,61 @@
                               Name 13  "r11"
                               Name 16  "g_tTex1df4a"
                               Name 20  "g_sSamp"
-                              Name 38  "r13"
-                              Name 41  "g_tTex1di4a"
-                              Name 52  "r15"
-                              Name 56  "g_tTex1du4a"
-                              Name 67  "r31"
-                              Name 70  "g_tTex2df4a"
-                              Name 87  "r33"
-                              Name 90  "g_tTex2di4a"
-                              Name 102  "r35"
-                              Name 105  "g_tTex2du4a"
-                              Name 118  "psout"
-                              Name 129  "flattenTemp"
-                              Name 132  "Color"
-                              Name 136  "Depth"
-                              Name 141  "g_tTex1df4"
-                              Name 144  "g_tTex1di4"
-                              Name 147  "g_tTex1du4"
-                              Name 150  "g_tTex2df4"
-                              Name 153  "g_tTex2di4"
-                              Name 156  "g_tTex2du4"
-                              Name 159  "g_tTex3df4"
-                              Name 162  "g_tTex3di4"
-                              Name 165  "g_tTex3du4"
-                              Name 168  "g_tTexcdf4"
-                              Name 171  "g_tTexcdi4"
-                              Name 174  "g_tTexcdu4"
-                              Name 177  "g_tTexcdf4a"
-                              Name 180  "g_tTexcdi4a"
-                              Name 183  "g_tTexcdu4a"
+                              Name 37  "r13"
+                              Name 40  "g_tTex1di4a"
+                              Name 50  "r15"
+                              Name 54  "g_tTex1du4a"
+                              Name 64  "r31"
+                              Name 67  "g_tTex2df4a"
+                              Name 83  "r33"
+                              Name 86  "g_tTex2di4a"
+                              Name 97  "r35"
+                              Name 100  "g_tTex2du4a"
+                              Name 112  "psout"
+                              Name 123  "flattenTemp"
+                              Name 126  "@entryPointOutput.Color"
+                              Name 130  "@entryPointOutput.Depth"
+                              Name 135  "g_tTex1df4"
+                              Name 138  "g_tTex1di4"
+                              Name 141  "g_tTex1du4"
+                              Name 144  "g_tTex2df4"
+                              Name 147  "g_tTex2di4"
+                              Name 150  "g_tTex2du4"
+                              Name 153  "g_tTex3df4"
+                              Name 156  "g_tTex3di4"
+                              Name 159  "g_tTex3du4"
+                              Name 162  "g_tTexcdf4"
+                              Name 165  "g_tTexcdi4"
+                              Name 168  "g_tTexcdu4"
+                              Name 171  "g_tTexcdf4a"
+                              Name 174  "g_tTexcdi4a"
+                              Name 177  "g_tTexcdu4a"
                               Decorate 16(g_tTex1df4a) DescriptorSet 0
                               Decorate 20(g_sSamp) DescriptorSet 0
                               Decorate 20(g_sSamp) Binding 0
-                              Decorate 41(g_tTex1di4a) DescriptorSet 0
-                              Decorate 56(g_tTex1du4a) DescriptorSet 0
-                              Decorate 70(g_tTex2df4a) DescriptorSet 0
-                              Decorate 90(g_tTex2di4a) DescriptorSet 0
-                              Decorate 105(g_tTex2du4a) DescriptorSet 0
-                              Decorate 132(Color) Location 0
-                              Decorate 136(Depth) BuiltIn FragDepth
-                              Decorate 141(g_tTex1df4) DescriptorSet 0
-                              Decorate 141(g_tTex1df4) Binding 0
-                              Decorate 144(g_tTex1di4) DescriptorSet 0
-                              Decorate 147(g_tTex1du4) DescriptorSet 0
-                              Decorate 150(g_tTex2df4) DescriptorSet 0
-                              Decorate 153(g_tTex2di4) DescriptorSet 0
-                              Decorate 156(g_tTex2du4) DescriptorSet 0
-                              Decorate 159(g_tTex3df4) DescriptorSet 0
-                              Decorate 162(g_tTex3di4) DescriptorSet 0
-                              Decorate 165(g_tTex3du4) DescriptorSet 0
-                              Decorate 168(g_tTexcdf4) DescriptorSet 0
-                              Decorate 171(g_tTexcdi4) DescriptorSet 0
-                              Decorate 174(g_tTexcdu4) DescriptorSet 0
-                              Decorate 177(g_tTexcdf4a) DescriptorSet 0
-                              Decorate 180(g_tTexcdi4a) DescriptorSet 0
-                              Decorate 183(g_tTexcdu4a) DescriptorSet 0
+                              Decorate 40(g_tTex1di4a) DescriptorSet 0
+                              Decorate 54(g_tTex1du4a) DescriptorSet 0
+                              Decorate 67(g_tTex2df4a) DescriptorSet 0
+                              Decorate 86(g_tTex2di4a) DescriptorSet 0
+                              Decorate 100(g_tTex2du4a) DescriptorSet 0
+                              Decorate 126(@entryPointOutput.Color) Location 0
+                              Decorate 130(@entryPointOutput.Depth) BuiltIn FragDepth
+                              Decorate 135(g_tTex1df4) DescriptorSet 0
+                              Decorate 135(g_tTex1df4) Binding 0
+                              Decorate 138(g_tTex1di4) DescriptorSet 0
+                              Decorate 141(g_tTex1du4) DescriptorSet 0
+                              Decorate 144(g_tTex2df4) DescriptorSet 0
+                              Decorate 147(g_tTex2di4) DescriptorSet 0
+                              Decorate 150(g_tTex2du4) DescriptorSet 0
+                              Decorate 153(g_tTex3df4) DescriptorSet 0
+                              Decorate 156(g_tTex3di4) DescriptorSet 0
+                              Decorate 159(g_tTex3du4) DescriptorSet 0
+                              Decorate 162(g_tTexcdf4) DescriptorSet 0
+                              Decorate 165(g_tTexcdi4) DescriptorSet 0
+                              Decorate 168(g_tTexcdu4) DescriptorSet 0
+                              Decorate 171(g_tTexcdf4a) DescriptorSet 0
+                              Decorate 174(g_tTexcdi4a) DescriptorSet 0
+                              Decorate 177(g_tTexcdu4a) DescriptorSet 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -417,191 +424,185 @@
     8(PS_OUTPUT):             TypeStruct 7(fvec4) 6(float)
                9:             TypeFunction 8(PS_OUTPUT)
               12:             TypePointer Function 6(float)
-              14:             TypeImage 6(float) 1D array sampled format:Unknown
+              14:             TypeImage 6(float) 1D depth array sampled format:Unknown
               15:             TypePointer UniformConstant 14
  16(g_tTex1df4a):     15(ptr) Variable UniformConstant
               18:             TypeSampler
               19:             TypePointer UniformConstant 18
      20(g_sSamp):     19(ptr) Variable UniformConstant
-              22:             TypeImage 6(float) 1D depth array sampled format:Unknown
-              23:             TypeSampledImage 22
-              25:             TypeVector 6(float) 2
-              26:    6(float) Constant 1036831949
-              27:    6(float) Constant 1045220557
-              28:   25(fvec2) ConstantComposite 26 27
-              29:    6(float) Constant 1061158912
-              30:             TypeVector 6(float) 3
-              34:             TypeInt 32 1
-              35:     34(int) Constant 2
-              39:             TypeImage 34(int) 1D array sampled format:Unknown
-              40:             TypePointer UniformConstant 39
- 41(g_tTex1di4a):     40(ptr) Variable UniformConstant
-              44:             TypeImage 34(int) 1D depth array sampled format:Unknown
-              45:             TypeSampledImage 44
-              53:             TypeInt 32 0
-              54:             TypeImage 53(int) 1D array sampled format:Unknown
-              55:             TypePointer UniformConstant 54
- 56(g_tTex1du4a):     55(ptr) Variable UniformConstant
-              59:             TypeImage 53(int) 1D depth array sampled format:Unknown
-              60:             TypeSampledImage 59
-              68:             TypeImage 6(float) 2D array sampled format:Unknown
-              69:             TypePointer UniformConstant 68
- 70(g_tTex2df4a):     69(ptr) Variable UniformConstant
-              73:             TypeImage 6(float) 2D depth array sampled format:Unknown
-              74:             TypeSampledImage 73
-              76:    6(float) Constant 1050253722
-              77:   30(fvec3) ConstantComposite 26 27 76
-              82:             TypeVector 34(int) 2
-              83:     34(int) Constant 3
-              84:   82(ivec2) ConstantComposite 35 83
-              88:             TypeImage 34(int) 2D array sampled format:Unknown
-              89:             TypePointer UniformConstant 88
- 90(g_tTex2di4a):     89(ptr) Variable UniformConstant
-              93:             TypeImage 34(int) 2D depth array sampled format:Unknown
-              94:             TypeSampledImage 93
-             103:             TypeImage 53(int) 2D array sampled format:Unknown
-             104:             TypePointer UniformConstant 103
-105(g_tTex2du4a):    104(ptr) Variable UniformConstant
-             108:             TypeImage 53(int) 2D depth array sampled format:Unknown
-             109:             TypeSampledImage 108
-             117:             TypePointer Function 8(PS_OUTPUT)
-             119:     34(int) Constant 0
-             120:    6(float) Constant 1065353216
-             121:    7(fvec4) ConstantComposite 120 120 120 120
-             122:             TypePointer Function 7(fvec4)
-             124:     34(int) Constant 1
-             131:             TypePointer Output 7(fvec4)
-      132(Color):    131(ptr) Variable Output
-             135:             TypePointer Output 6(float)
-      136(Depth):    135(ptr) Variable Output
-             139:             TypeImage 6(float) 1D sampled format:Unknown
+              22:             TypeSampledImage 14
+              24:             TypeVector 6(float) 2
+              25:    6(float) Constant 1036831949
+              26:    6(float) Constant 1045220557
+              27:   24(fvec2) ConstantComposite 25 26
+              28:    6(float) Constant 1061158912
+              29:             TypeVector 6(float) 3
+              33:             TypeInt 32 1
+              34:     33(int) Constant 2
+              38:             TypeImage 33(int) 1D depth array sampled format:Unknown
+              39:             TypePointer UniformConstant 38
+ 40(g_tTex1di4a):     39(ptr) Variable UniformConstant
+              43:             TypeSampledImage 38
+              51:             TypeInt 32 0
+              52:             TypeImage 51(int) 1D depth array sampled format:Unknown
+              53:             TypePointer UniformConstant 52
+ 54(g_tTex1du4a):     53(ptr) Variable UniformConstant
+              57:             TypeSampledImage 52
+              65:             TypeImage 6(float) 2D depth array sampled format:Unknown
+              66:             TypePointer UniformConstant 65
+ 67(g_tTex2df4a):     66(ptr) Variable UniformConstant
+              70:             TypeSampledImage 65
+              72:    6(float) Constant 1050253722
+              73:   29(fvec3) ConstantComposite 25 26 72
+              78:             TypeVector 33(int) 2
+              79:     33(int) Constant 3
+              80:   78(ivec2) ConstantComposite 34 79
+              84:             TypeImage 33(int) 2D depth array sampled format:Unknown
+              85:             TypePointer UniformConstant 84
+ 86(g_tTex2di4a):     85(ptr) Variable UniformConstant
+              89:             TypeSampledImage 84
+              98:             TypeImage 51(int) 2D depth array sampled format:Unknown
+              99:             TypePointer UniformConstant 98
+100(g_tTex2du4a):     99(ptr) Variable UniformConstant
+             103:             TypeSampledImage 98
+             111:             TypePointer Function 8(PS_OUTPUT)
+             113:     33(int) Constant 0
+             114:    6(float) Constant 1065353216
+             115:    7(fvec4) ConstantComposite 114 114 114 114
+             116:             TypePointer Function 7(fvec4)
+             118:     33(int) Constant 1
+             125:             TypePointer Output 7(fvec4)
+126(@entryPointOutput.Color):    125(ptr) Variable Output
+             129:             TypePointer Output 6(float)
+130(@entryPointOutput.Depth):    129(ptr) Variable Output
+             133:             TypeImage 6(float) 1D sampled format:Unknown
+             134:             TypePointer UniformConstant 133
+ 135(g_tTex1df4):    134(ptr) Variable UniformConstant
+             136:             TypeImage 33(int) 1D sampled format:Unknown
+             137:             TypePointer UniformConstant 136
+ 138(g_tTex1di4):    137(ptr) Variable UniformConstant
+             139:             TypeImage 51(int) 1D sampled format:Unknown
              140:             TypePointer UniformConstant 139
- 141(g_tTex1df4):    140(ptr) Variable UniformConstant
-             142:             TypeImage 34(int) 1D sampled format:Unknown
+ 141(g_tTex1du4):    140(ptr) Variable UniformConstant
+             142:             TypeImage 6(float) 2D sampled format:Unknown
              143:             TypePointer UniformConstant 142
- 144(g_tTex1di4):    143(ptr) Variable UniformConstant
-             145:             TypeImage 53(int) 1D sampled format:Unknown
+ 144(g_tTex2df4):    143(ptr) Variable UniformConstant
+             145:             TypeImage 33(int) 2D sampled format:Unknown
              146:             TypePointer UniformConstant 145
- 147(g_tTex1du4):    146(ptr) Variable UniformConstant
-             148:             TypeImage 6(float) 2D sampled format:Unknown
+ 147(g_tTex2di4):    146(ptr) Variable UniformConstant
+             148:             TypeImage 51(int) 2D sampled format:Unknown
              149:             TypePointer UniformConstant 148
- 150(g_tTex2df4):    149(ptr) Variable UniformConstant
-             151:             TypeImage 34(int) 2D sampled format:Unknown
+ 150(g_tTex2du4):    149(ptr) Variable UniformConstant
+             151:             TypeImage 6(float) 3D sampled format:Unknown
              152:             TypePointer UniformConstant 151
- 153(g_tTex2di4):    152(ptr) Variable UniformConstant
-             154:             TypeImage 53(int) 2D sampled format:Unknown
+ 153(g_tTex3df4):    152(ptr) Variable UniformConstant
+             154:             TypeImage 33(int) 3D sampled format:Unknown
              155:             TypePointer UniformConstant 154
- 156(g_tTex2du4):    155(ptr) Variable UniformConstant
-             157:             TypeImage 6(float) 3D sampled format:Unknown
+ 156(g_tTex3di4):    155(ptr) Variable UniformConstant
+             157:             TypeImage 51(int) 3D sampled format:Unknown
              158:             TypePointer UniformConstant 157
- 159(g_tTex3df4):    158(ptr) Variable UniformConstant
-             160:             TypeImage 34(int) 3D sampled format:Unknown
+ 159(g_tTex3du4):    158(ptr) Variable UniformConstant
+             160:             TypeImage 6(float) Cube sampled format:Unknown
              161:             TypePointer UniformConstant 160
- 162(g_tTex3di4):    161(ptr) Variable UniformConstant
-             163:             TypeImage 53(int) 3D sampled format:Unknown
+ 162(g_tTexcdf4):    161(ptr) Variable UniformConstant
+             163:             TypeImage 33(int) Cube sampled format:Unknown
              164:             TypePointer UniformConstant 163
- 165(g_tTex3du4):    164(ptr) Variable UniformConstant
-             166:             TypeImage 6(float) Cube sampled format:Unknown
+ 165(g_tTexcdi4):    164(ptr) Variable UniformConstant
+             166:             TypeImage 51(int) Cube sampled format:Unknown
              167:             TypePointer UniformConstant 166
- 168(g_tTexcdf4):    167(ptr) Variable UniformConstant
-             169:             TypeImage 34(int) Cube sampled format:Unknown
+ 168(g_tTexcdu4):    167(ptr) Variable UniformConstant
+             169:             TypeImage 6(float) Cube array sampled format:Unknown
              170:             TypePointer UniformConstant 169
- 171(g_tTexcdi4):    170(ptr) Variable UniformConstant
-             172:             TypeImage 53(int) Cube sampled format:Unknown
+171(g_tTexcdf4a):    170(ptr) Variable UniformConstant
+             172:             TypeImage 33(int) Cube array sampled format:Unknown
              173:             TypePointer UniformConstant 172
- 174(g_tTexcdu4):    173(ptr) Variable UniformConstant
-             175:             TypeImage 6(float) Cube array sampled format:Unknown
+174(g_tTexcdi4a):    173(ptr) Variable UniformConstant
+             175:             TypeImage 51(int) Cube array sampled format:Unknown
              176:             TypePointer UniformConstant 175
-177(g_tTexcdf4a):    176(ptr) Variable UniformConstant
-             178:             TypeImage 34(int) Cube array sampled format:Unknown
-             179:             TypePointer UniformConstant 178
-180(g_tTexcdi4a):    179(ptr) Variable UniformConstant
-             181:             TypeImage 53(int) Cube array sampled format:Unknown
-             182:             TypePointer UniformConstant 181
-183(g_tTexcdu4a):    182(ptr) Variable UniformConstant
+177(g_tTexcdu4a):    176(ptr) Variable UniformConstant
          4(main):           2 Function None 3
                5:             Label
-129(flattenTemp):    117(ptr) Variable Function
-             130:8(PS_OUTPUT) FunctionCall 10(@main()
-                              Store 129(flattenTemp) 130
-             133:    122(ptr) AccessChain 129(flattenTemp) 119
-             134:    7(fvec4) Load 133
-                              Store 132(Color) 134
-             137:     12(ptr) AccessChain 129(flattenTemp) 124
-             138:    6(float) Load 137
-                              Store 136(Depth) 138
+123(flattenTemp):    111(ptr) Variable Function
+             124:8(PS_OUTPUT) FunctionCall 10(@main()
+                              Store 123(flattenTemp) 124
+             127:    116(ptr) AccessChain 123(flattenTemp) 113
+             128:    7(fvec4) Load 127
+                              Store 126(@entryPointOutput.Color) 128
+             131:     12(ptr) AccessChain 123(flattenTemp) 118
+             132:    6(float) Load 131
+                              Store 130(@entryPointOutput.Depth) 132
                               Return
                               FunctionEnd
       10(@main():8(PS_OUTPUT) Function None 9
               11:             Label
          13(r11):     12(ptr) Variable Function
-         38(r13):     12(ptr) Variable Function
-         52(r15):     12(ptr) Variable Function
-         67(r31):     12(ptr) Variable Function
-         87(r33):     12(ptr) Variable Function
-        102(r35):     12(ptr) Variable Function
-      118(psout):    117(ptr) Variable Function
+         37(r13):     12(ptr) Variable Function
+         50(r15):     12(ptr) Variable Function
+         64(r31):     12(ptr) Variable Function
+         83(r33):     12(ptr) Variable Function
+         97(r35):     12(ptr) Variable Function
+      112(psout):    111(ptr) Variable Function
               17:          14 Load 16(g_tTex1df4a)
               21:          18 Load 20(g_sSamp)
-              24:          23 SampledImage 17 21
-              31:    6(float) CompositeExtract 28 0
-              32:    6(float) CompositeExtract 28 1
-              33:   30(fvec3) CompositeConstruct 31 32 29
-              36:    6(float) CompositeExtract 33 2
-              37:    6(float) ImageSampleDrefImplicitLod 24 33 36 ConstOffset 35
-                              Store 13(r11) 37
-              42:          39 Load 41(g_tTex1di4a)
-              43:          18 Load 20(g_sSamp)
-              46:          45 SampledImage 42 43
-              47:    6(float) CompositeExtract 28 0
-              48:    6(float) CompositeExtract 28 1
-              49:   30(fvec3) CompositeConstruct 47 48 29
-              50:    6(float) CompositeExtract 49 2
-              51:    6(float) ImageSampleDrefImplicitLod 46 49 50 ConstOffset 35
-                              Store 38(r13) 51
-              57:          54 Load 56(g_tTex1du4a)
-              58:          18 Load 20(g_sSamp)
-              61:          60 SampledImage 57 58
-              62:    6(float) CompositeExtract 28 0
-              63:    6(float) CompositeExtract 28 1
-              64:   30(fvec3) CompositeConstruct 62 63 29
-              65:    6(float) CompositeExtract 64 2
-              66:    6(float) ImageSampleDrefImplicitLod 61 64 65 ConstOffset 35
-                              Store 52(r15) 66
-              71:          68 Load 70(g_tTex2df4a)
-              72:          18 Load 20(g_sSamp)
-              75:          74 SampledImage 71 72
-              78:    6(float) CompositeExtract 77 0
-              79:    6(float) CompositeExtract 77 1
-              80:    6(float) CompositeExtract 77 2
-              81:    7(fvec4) CompositeConstruct 78 79 80 29
-              85:    6(float) CompositeExtract 81 3
-              86:    6(float) ImageSampleDrefImplicitLod 75 81 85 ConstOffset 84
-                              Store 67(r31) 86
-              91:          88 Load 90(g_tTex2di4a)
-              92:          18 Load 20(g_sSamp)
-              95:          94 SampledImage 91 92
-              96:    6(float) CompositeExtract 77 0
-              97:    6(float) CompositeExtract 77 1
-              98:    6(float) CompositeExtract 77 2
-              99:    7(fvec4) CompositeConstruct 96 97 98 29
-             100:    6(float) CompositeExtract 99 3
-             101:    6(float) ImageSampleDrefImplicitLod 95 99 100 ConstOffset 84
-                              Store 87(r33) 101
-             106:         103 Load 105(g_tTex2du4a)
-             107:          18 Load 20(g_sSamp)
-             110:         109 SampledImage 106 107
-             111:    6(float) CompositeExtract 77 0
-             112:    6(float) CompositeExtract 77 1
-             113:    6(float) CompositeExtract 77 2
-             114:    7(fvec4) CompositeConstruct 111 112 113 29
-             115:    6(float) CompositeExtract 114 3
-             116:    6(float) ImageSampleDrefImplicitLod 110 114 115 ConstOffset 84
-                              Store 102(r35) 116
-             123:    122(ptr) AccessChain 118(psout) 119
-                              Store 123 121
-             125:     12(ptr) AccessChain 118(psout) 124
-                              Store 125 120
-             126:8(PS_OUTPUT) Load 118(psout)
-                              ReturnValue 126
+              23:          22 SampledImage 17 21
+              30:    6(float) CompositeExtract 27 0
+              31:    6(float) CompositeExtract 27 1
+              32:   29(fvec3) CompositeConstruct 30 31 28
+              35:    6(float) CompositeExtract 32 2
+              36:    6(float) ImageSampleDrefImplicitLod 23 32 35 ConstOffset 34
+                              Store 13(r11) 36
+              41:          38 Load 40(g_tTex1di4a)
+              42:          18 Load 20(g_sSamp)
+              44:          43 SampledImage 41 42
+              45:    6(float) CompositeExtract 27 0
+              46:    6(float) CompositeExtract 27 1
+              47:   29(fvec3) CompositeConstruct 45 46 28
+              48:    6(float) CompositeExtract 47 2
+              49:    6(float) ImageSampleDrefImplicitLod 44 47 48 ConstOffset 34
+                              Store 37(r13) 49
+              55:          52 Load 54(g_tTex1du4a)
+              56:          18 Load 20(g_sSamp)
+              58:          57 SampledImage 55 56
+              59:    6(float) CompositeExtract 27 0
+              60:    6(float) CompositeExtract 27 1
+              61:   29(fvec3) CompositeConstruct 59 60 28
+              62:    6(float) CompositeExtract 61 2
+              63:    6(float) ImageSampleDrefImplicitLod 58 61 62 ConstOffset 34
+                              Store 50(r15) 63
+              68:          65 Load 67(g_tTex2df4a)
+              69:          18 Load 20(g_sSamp)
+              71:          70 SampledImage 68 69
+              74:    6(float) CompositeExtract 73 0
+              75:    6(float) CompositeExtract 73 1
+              76:    6(float) CompositeExtract 73 2
+              77:    7(fvec4) CompositeConstruct 74 75 76 28
+              81:    6(float) CompositeExtract 77 3
+              82:    6(float) ImageSampleDrefImplicitLod 71 77 81 ConstOffset 80
+                              Store 64(r31) 82
+              87:          84 Load 86(g_tTex2di4a)
+              88:          18 Load 20(g_sSamp)
+              90:          89 SampledImage 87 88
+              91:    6(float) CompositeExtract 73 0
+              92:    6(float) CompositeExtract 73 1
+              93:    6(float) CompositeExtract 73 2
+              94:    7(fvec4) CompositeConstruct 91 92 93 28
+              95:    6(float) CompositeExtract 94 3
+              96:    6(float) ImageSampleDrefImplicitLod 90 94 95 ConstOffset 80
+                              Store 83(r33) 96
+             101:          98 Load 100(g_tTex2du4a)
+             102:          18 Load 20(g_sSamp)
+             104:         103 SampledImage 101 102
+             105:    6(float) CompositeExtract 73 0
+             106:    6(float) CompositeExtract 73 1
+             107:    6(float) CompositeExtract 73 2
+             108:    7(fvec4) CompositeConstruct 105 106 107 28
+             109:    6(float) CompositeExtract 108 3
+             110:    6(float) ImageSampleDrefImplicitLod 104 108 109 ConstOffset 80
+                              Store 97(r35) 110
+             117:    116(ptr) AccessChain 112(psout) 113
+                              Store 117 115
+             119:     12(ptr) AccessChain 112(psout) 118
+                              Store 119 114
+             120:8(PS_OUTPUT) Load 112(psout)
+                              ReturnValue 120
                               FunctionEnd
diff --git a/Test/baseResults/hlsl.samplecmplevelzero.array.dx10.frag.out b/Test/baseResults/hlsl.samplecmplevelzero.array.dx10.frag.out
index 875d593..a0e5a48 100644
--- a/Test/baseResults/hlsl.samplecmplevelzero.array.dx10.frag.out
+++ b/Test/baseResults/hlsl.samplecmplevelzero.array.dx10.frag.out
@@ -1,6 +1,7 @@
 hlsl.samplecmplevelzero.array.dx10.frag
 Shader version: 500
 gl_FragCoord origin is upper left
+using depth_any
 0:? Sequence
 0:38  Function Definition: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:38    Function Parameters: 
@@ -10,7 +11,7 @@
 0:42          'r10' ( temp float)
 0:42          textureLod ( temp float)
 0:42            Construct combined texture-sampler ( temp sampler1DArrayShadow)
-0:42              'g_tTex1df4a' ( uniform texture1DArray)
+0:42              'g_tTex1df4a' ( uniform texture1DArrayShadow)
 0:42              'g_sSamp' (layout( binding=0) uniform sampler)
 0:42            Construct vec3 ( temp 3-component vector of float)
 0:?               Constant:
@@ -25,7 +26,7 @@
 0:43          'r12' ( temp float)
 0:43          textureLod ( temp float)
 0:43            Construct combined texture-sampler ( temp isampler1DArrayShadow)
-0:43              'g_tTex1di4a' ( uniform itexture1DArray)
+0:43              'g_tTex1di4a' ( uniform itexture1DArrayShadow)
 0:43              'g_sSamp' (layout( binding=0) uniform sampler)
 0:43            Construct vec3 ( temp 3-component vector of float)
 0:?               Constant:
@@ -40,7 +41,7 @@
 0:44          'r14' ( temp float)
 0:44          textureLod ( temp float)
 0:44            Construct combined texture-sampler ( temp usampler1DArrayShadow)
-0:44              'g_tTex1du4a' ( uniform utexture1DArray)
+0:44              'g_tTex1du4a' ( uniform utexture1DArrayShadow)
 0:44              'g_sSamp' (layout( binding=0) uniform sampler)
 0:44            Construct vec3 ( temp 3-component vector of float)
 0:?               Constant:
@@ -55,7 +56,7 @@
 0:47          'r30' ( temp float)
 0:47          textureLod ( temp float)
 0:47            Construct combined texture-sampler ( temp sampler2DArrayShadow)
-0:47              'g_tTex2df4a' ( uniform texture2DArray)
+0:47              'g_tTex2df4a' ( uniform texture2DArrayShadow)
 0:47              'g_sSamp' (layout( binding=0) uniform sampler)
 0:47            Construct vec4 ( temp 4-component vector of float)
 0:?               Constant:
@@ -71,7 +72,7 @@
 0:48          'r32' ( temp float)
 0:48          textureLod ( temp float)
 0:48            Construct combined texture-sampler ( temp isampler2DArrayShadow)
-0:48              'g_tTex2di4a' ( uniform itexture2DArray)
+0:48              'g_tTex2di4a' ( uniform itexture2DArrayShadow)
 0:48              'g_sSamp' (layout( binding=0) uniform sampler)
 0:48            Construct vec4 ( temp 4-component vector of float)
 0:?               Constant:
@@ -87,7 +88,7 @@
 0:49          'r34' ( temp float)
 0:49          textureLod ( temp float)
 0:49            Construct combined texture-sampler ( temp usampler2DArrayShadow)
-0:49              'g_tTex2du4a' ( uniform utexture2DArray)
+0:49              'g_tTex2du4a' ( uniform utexture2DArrayShadow)
 0:49              'g_sSamp' (layout( binding=0) uniform sampler)
 0:49            Construct vec4 ( temp 4-component vector of float)
 0:?               Constant:
@@ -103,7 +104,7 @@
 0:52          'r60' ( temp float)
 0:52          textureLod ( temp float)
 0:52            Construct combined texture-sampler ( temp samplerCubeArrayShadow)
-0:52              'g_tTexcdf4a' ( uniform textureCubeArray)
+0:52              'g_tTexcdf4a' ( uniform textureCubeArrayShadow)
 0:52              'g_sSamp' (layout( binding=0) uniform sampler)
 0:52            Construct vec4 ( temp 4-component vector of float)
 0:?               Constant:
@@ -120,7 +121,7 @@
 0:53          'r62' ( temp float)
 0:53          textureLod ( temp float)
 0:53            Construct combined texture-sampler ( temp isamplerCubeArrayShadow)
-0:53              'g_tTexcdi4a' ( uniform itextureCubeArray)
+0:53              'g_tTexcdi4a' ( uniform itextureCubeArrayShadow)
 0:53              'g_sSamp' (layout( binding=0) uniform sampler)
 0:53            Construct vec4 ( temp 4-component vector of float)
 0:?               Constant:
@@ -137,7 +138,7 @@
 0:54          'r64' ( temp float)
 0:54          textureLod ( temp float)
 0:54            Construct combined texture-sampler ( temp usamplerCubeArrayShadow)
-0:54              'g_tTexcdu4a' ( uniform utextureCubeArray)
+0:54              'g_tTexcdu4a' ( uniform utextureCubeArrayShadow)
 0:54              'g_sSamp' (layout( binding=0) uniform sampler)
 0:54            Construct vec4 ( temp 4-component vector of float)
 0:?               Constant:
@@ -176,13 +177,13 @@
 0:38          'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:38          Function Call: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:38        move second child to first child ( temp 4-component vector of float)
-0:?           'Color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 0:38          Color: direct index for structure ( temp 4-component vector of float)
 0:38            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:38            Constant:
 0:38              0 (const int)
 0:38        move second child to first child ( temp float)
-0:?           'Depth' ( out float FragDepth)
+0:?           '@entryPointOutput.Depth' ( out float FragDepth)
 0:38          Depth: direct index for structure ( temp float)
 0:38            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:38            Constant:
@@ -201,17 +202,17 @@
 0:?     'g_tTexcdf4' ( uniform textureCube)
 0:?     'g_tTexcdi4' ( uniform itextureCube)
 0:?     'g_tTexcdu4' ( uniform utextureCube)
-0:?     'g_tTex1df4a' ( uniform texture1DArray)
-0:?     'g_tTex1di4a' ( uniform itexture1DArray)
-0:?     'g_tTex1du4a' ( uniform utexture1DArray)
-0:?     'g_tTex2df4a' ( uniform texture2DArray)
-0:?     'g_tTex2di4a' ( uniform itexture2DArray)
-0:?     'g_tTex2du4a' ( uniform utexture2DArray)
-0:?     'g_tTexcdf4a' ( uniform textureCubeArray)
-0:?     'g_tTexcdi4a' ( uniform itextureCubeArray)
-0:?     'g_tTexcdu4a' ( uniform utextureCubeArray)
-0:?     'Color' (layout( location=0) out 4-component vector of float)
-0:?     'Depth' ( out float FragDepth)
+0:?     'g_tTex1df4a' ( uniform texture1DArrayShadow)
+0:?     'g_tTex1di4a' ( uniform itexture1DArrayShadow)
+0:?     'g_tTex1du4a' ( uniform utexture1DArrayShadow)
+0:?     'g_tTex2df4a' ( uniform texture2DArrayShadow)
+0:?     'g_tTex2di4a' ( uniform itexture2DArrayShadow)
+0:?     'g_tTex2du4a' ( uniform utexture2DArrayShadow)
+0:?     'g_tTexcdf4a' ( uniform textureCubeArrayShadow)
+0:?     'g_tTexcdi4a' ( uniform itextureCubeArrayShadow)
+0:?     'g_tTexcdu4a' ( uniform utextureCubeArrayShadow)
+0:?     '@entryPointOutput.Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 
 Linked fragment stage:
@@ -219,6 +220,7 @@
 
 Shader version: 500
 gl_FragCoord origin is upper left
+using depth_any
 0:? Sequence
 0:38  Function Definition: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:38    Function Parameters: 
@@ -228,7 +230,7 @@
 0:42          'r10' ( temp float)
 0:42          textureLod ( temp float)
 0:42            Construct combined texture-sampler ( temp sampler1DArrayShadow)
-0:42              'g_tTex1df4a' ( uniform texture1DArray)
+0:42              'g_tTex1df4a' ( uniform texture1DArrayShadow)
 0:42              'g_sSamp' (layout( binding=0) uniform sampler)
 0:42            Construct vec3 ( temp 3-component vector of float)
 0:?               Constant:
@@ -243,7 +245,7 @@
 0:43          'r12' ( temp float)
 0:43          textureLod ( temp float)
 0:43            Construct combined texture-sampler ( temp isampler1DArrayShadow)
-0:43              'g_tTex1di4a' ( uniform itexture1DArray)
+0:43              'g_tTex1di4a' ( uniform itexture1DArrayShadow)
 0:43              'g_sSamp' (layout( binding=0) uniform sampler)
 0:43            Construct vec3 ( temp 3-component vector of float)
 0:?               Constant:
@@ -258,7 +260,7 @@
 0:44          'r14' ( temp float)
 0:44          textureLod ( temp float)
 0:44            Construct combined texture-sampler ( temp usampler1DArrayShadow)
-0:44              'g_tTex1du4a' ( uniform utexture1DArray)
+0:44              'g_tTex1du4a' ( uniform utexture1DArrayShadow)
 0:44              'g_sSamp' (layout( binding=0) uniform sampler)
 0:44            Construct vec3 ( temp 3-component vector of float)
 0:?               Constant:
@@ -273,7 +275,7 @@
 0:47          'r30' ( temp float)
 0:47          textureLod ( temp float)
 0:47            Construct combined texture-sampler ( temp sampler2DArrayShadow)
-0:47              'g_tTex2df4a' ( uniform texture2DArray)
+0:47              'g_tTex2df4a' ( uniform texture2DArrayShadow)
 0:47              'g_sSamp' (layout( binding=0) uniform sampler)
 0:47            Construct vec4 ( temp 4-component vector of float)
 0:?               Constant:
@@ -289,7 +291,7 @@
 0:48          'r32' ( temp float)
 0:48          textureLod ( temp float)
 0:48            Construct combined texture-sampler ( temp isampler2DArrayShadow)
-0:48              'g_tTex2di4a' ( uniform itexture2DArray)
+0:48              'g_tTex2di4a' ( uniform itexture2DArrayShadow)
 0:48              'g_sSamp' (layout( binding=0) uniform sampler)
 0:48            Construct vec4 ( temp 4-component vector of float)
 0:?               Constant:
@@ -305,7 +307,7 @@
 0:49          'r34' ( temp float)
 0:49          textureLod ( temp float)
 0:49            Construct combined texture-sampler ( temp usampler2DArrayShadow)
-0:49              'g_tTex2du4a' ( uniform utexture2DArray)
+0:49              'g_tTex2du4a' ( uniform utexture2DArrayShadow)
 0:49              'g_sSamp' (layout( binding=0) uniform sampler)
 0:49            Construct vec4 ( temp 4-component vector of float)
 0:?               Constant:
@@ -321,7 +323,7 @@
 0:52          'r60' ( temp float)
 0:52          textureLod ( temp float)
 0:52            Construct combined texture-sampler ( temp samplerCubeArrayShadow)
-0:52              'g_tTexcdf4a' ( uniform textureCubeArray)
+0:52              'g_tTexcdf4a' ( uniform textureCubeArrayShadow)
 0:52              'g_sSamp' (layout( binding=0) uniform sampler)
 0:52            Construct vec4 ( temp 4-component vector of float)
 0:?               Constant:
@@ -338,7 +340,7 @@
 0:53          'r62' ( temp float)
 0:53          textureLod ( temp float)
 0:53            Construct combined texture-sampler ( temp isamplerCubeArrayShadow)
-0:53              'g_tTexcdi4a' ( uniform itextureCubeArray)
+0:53              'g_tTexcdi4a' ( uniform itextureCubeArrayShadow)
 0:53              'g_sSamp' (layout( binding=0) uniform sampler)
 0:53            Construct vec4 ( temp 4-component vector of float)
 0:?               Constant:
@@ -355,7 +357,7 @@
 0:54          'r64' ( temp float)
 0:54          textureLod ( temp float)
 0:54            Construct combined texture-sampler ( temp usamplerCubeArrayShadow)
-0:54              'g_tTexcdu4a' ( uniform utextureCubeArray)
+0:54              'g_tTexcdu4a' ( uniform utextureCubeArrayShadow)
 0:54              'g_sSamp' (layout( binding=0) uniform sampler)
 0:54            Construct vec4 ( temp 4-component vector of float)
 0:?               Constant:
@@ -394,13 +396,13 @@
 0:38          'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:38          Function Call: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:38        move second child to first child ( temp 4-component vector of float)
-0:?           'Color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 0:38          Color: direct index for structure ( temp 4-component vector of float)
 0:38            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:38            Constant:
 0:38              0 (const int)
 0:38        move second child to first child ( temp float)
-0:?           'Depth' ( out float FragDepth)
+0:?           '@entryPointOutput.Depth' ( out float FragDepth)
 0:38          Depth: direct index for structure ( temp float)
 0:38            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:38            Constant:
@@ -419,29 +421,34 @@
 0:?     'g_tTexcdf4' ( uniform textureCube)
 0:?     'g_tTexcdi4' ( uniform itextureCube)
 0:?     'g_tTexcdu4' ( uniform utextureCube)
-0:?     'g_tTex1df4a' ( uniform texture1DArray)
-0:?     'g_tTex1di4a' ( uniform itexture1DArray)
-0:?     'g_tTex1du4a' ( uniform utexture1DArray)
-0:?     'g_tTex2df4a' ( uniform texture2DArray)
-0:?     'g_tTex2di4a' ( uniform itexture2DArray)
-0:?     'g_tTex2du4a' ( uniform utexture2DArray)
-0:?     'g_tTexcdf4a' ( uniform textureCubeArray)
-0:?     'g_tTexcdi4a' ( uniform itextureCubeArray)
-0:?     'g_tTexcdu4a' ( uniform utextureCubeArray)
-0:?     'Color' (layout( location=0) out 4-component vector of float)
-0:?     'Depth' ( out float FragDepth)
+0:?     'g_tTex1df4a' ( uniform texture1DArrayShadow)
+0:?     'g_tTex1di4a' ( uniform itexture1DArrayShadow)
+0:?     'g_tTex1du4a' ( uniform utexture1DArrayShadow)
+0:?     'g_tTex2df4a' ( uniform texture2DArrayShadow)
+0:?     'g_tTex2di4a' ( uniform itexture2DArrayShadow)
+0:?     'g_tTex2du4a' ( uniform utexture2DArrayShadow)
+0:?     'g_tTexcdf4a' ( uniform textureCubeArrayShadow)
+0:?     'g_tTexcdi4a' ( uniform itextureCubeArrayShadow)
+0:?     'g_tTexcdu4a' ( uniform utextureCubeArrayShadow)
+0:?     '@entryPointOutput.Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
+
+error: SPIRV-Tools Validation Errors
+error: Expected Image 'Sampled Type' to be the same as Result Type
+  %49 = OpImageSampleDrefExplicitLod %float %44 %47 %48 Lod %float_0
 
 // Module Version 10000
-// Generated by (magic number): 80001
-// Id's are bound by 219
+// Generated by (magic number): 80007
+// Id's are bound by 210
 
                               Capability Shader
                               Capability Sampled1D
                               Capability SampledCubeArray
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "main" 176 180
+                              EntryPoint Fragment 4  "main" 167 171
                               ExecutionMode 4 OriginUpperLeft
+                              ExecutionMode 4 DepthReplacing
                               Source HLSL 500
                               Name 4  "main"
                               Name 8  "PS_OUTPUT"
@@ -451,64 +458,64 @@
                               Name 13  "r10"
                               Name 16  "g_tTex1df4a"
                               Name 20  "g_sSamp"
-                              Name 37  "r12"
-                              Name 41  "g_tTex1di4a"
-                              Name 52  "r14"
-                              Name 56  "g_tTex1du4a"
-                              Name 67  "r30"
-                              Name 70  "g_tTex2df4a"
-                              Name 84  "r32"
-                              Name 87  "g_tTex2di4a"
-                              Name 99  "r34"
-                              Name 102  "g_tTex2du4a"
-                              Name 114  "r60"
-                              Name 117  "g_tTexcdf4a"
-                              Name 131  "r62"
-                              Name 134  "g_tTexcdi4a"
-                              Name 146  "r64"
-                              Name 149  "g_tTexcdu4a"
-                              Name 162  "psout"
-                              Name 173  "flattenTemp"
-                              Name 176  "Color"
-                              Name 180  "Depth"
-                              Name 185  "g_tTex1df4"
-                              Name 188  "g_tTex1di4"
-                              Name 191  "g_tTex1du4"
-                              Name 194  "g_tTex2df4"
-                              Name 197  "g_tTex2di4"
-                              Name 200  "g_tTex2du4"
-                              Name 203  "g_tTex3df4"
-                              Name 206  "g_tTex3di4"
-                              Name 209  "g_tTex3du4"
-                              Name 212  "g_tTexcdf4"
-                              Name 215  "g_tTexcdi4"
-                              Name 218  "g_tTexcdu4"
+                              Name 36  "r12"
+                              Name 40  "g_tTex1di4a"
+                              Name 50  "r14"
+                              Name 54  "g_tTex1du4a"
+                              Name 64  "r30"
+                              Name 67  "g_tTex2df4a"
+                              Name 80  "r32"
+                              Name 83  "g_tTex2di4a"
+                              Name 94  "r34"
+                              Name 97  "g_tTex2du4a"
+                              Name 108  "r60"
+                              Name 111  "g_tTexcdf4a"
+                              Name 124  "r62"
+                              Name 127  "g_tTexcdi4a"
+                              Name 138  "r64"
+                              Name 141  "g_tTexcdu4a"
+                              Name 153  "psout"
+                              Name 164  "flattenTemp"
+                              Name 167  "@entryPointOutput.Color"
+                              Name 171  "@entryPointOutput.Depth"
+                              Name 176  "g_tTex1df4"
+                              Name 179  "g_tTex1di4"
+                              Name 182  "g_tTex1du4"
+                              Name 185  "g_tTex2df4"
+                              Name 188  "g_tTex2di4"
+                              Name 191  "g_tTex2du4"
+                              Name 194  "g_tTex3df4"
+                              Name 197  "g_tTex3di4"
+                              Name 200  "g_tTex3du4"
+                              Name 203  "g_tTexcdf4"
+                              Name 206  "g_tTexcdi4"
+                              Name 209  "g_tTexcdu4"
                               Decorate 16(g_tTex1df4a) DescriptorSet 0
                               Decorate 20(g_sSamp) DescriptorSet 0
                               Decorate 20(g_sSamp) Binding 0
-                              Decorate 41(g_tTex1di4a) DescriptorSet 0
-                              Decorate 56(g_tTex1du4a) DescriptorSet 0
-                              Decorate 70(g_tTex2df4a) DescriptorSet 0
-                              Decorate 87(g_tTex2di4a) DescriptorSet 0
-                              Decorate 102(g_tTex2du4a) DescriptorSet 0
-                              Decorate 117(g_tTexcdf4a) DescriptorSet 0
-                              Decorate 134(g_tTexcdi4a) DescriptorSet 0
-                              Decorate 149(g_tTexcdu4a) DescriptorSet 0
-                              Decorate 176(Color) Location 0
-                              Decorate 180(Depth) BuiltIn FragDepth
-                              Decorate 185(g_tTex1df4) DescriptorSet 0
-                              Decorate 185(g_tTex1df4) Binding 0
-                              Decorate 188(g_tTex1di4) DescriptorSet 0
-                              Decorate 191(g_tTex1du4) DescriptorSet 0
-                              Decorate 194(g_tTex2df4) DescriptorSet 0
-                              Decorate 197(g_tTex2di4) DescriptorSet 0
-                              Decorate 200(g_tTex2du4) DescriptorSet 0
-                              Decorate 203(g_tTex3df4) DescriptorSet 0
-                              Decorate 206(g_tTex3di4) DescriptorSet 0
-                              Decorate 209(g_tTex3du4) DescriptorSet 0
-                              Decorate 212(g_tTexcdf4) DescriptorSet 0
-                              Decorate 215(g_tTexcdi4) DescriptorSet 0
-                              Decorate 218(g_tTexcdu4) DescriptorSet 0
+                              Decorate 40(g_tTex1di4a) DescriptorSet 0
+                              Decorate 54(g_tTex1du4a) DescriptorSet 0
+                              Decorate 67(g_tTex2df4a) DescriptorSet 0
+                              Decorate 83(g_tTex2di4a) DescriptorSet 0
+                              Decorate 97(g_tTex2du4a) DescriptorSet 0
+                              Decorate 111(g_tTexcdf4a) DescriptorSet 0
+                              Decorate 127(g_tTexcdi4a) DescriptorSet 0
+                              Decorate 141(g_tTexcdu4a) DescriptorSet 0
+                              Decorate 167(@entryPointOutput.Color) Location 0
+                              Decorate 171(@entryPointOutput.Depth) BuiltIn FragDepth
+                              Decorate 176(g_tTex1df4) DescriptorSet 0
+                              Decorate 176(g_tTex1df4) Binding 0
+                              Decorate 179(g_tTex1di4) DescriptorSet 0
+                              Decorate 182(g_tTex1du4) DescriptorSet 0
+                              Decorate 185(g_tTex2df4) DescriptorSet 0
+                              Decorate 188(g_tTex2di4) DescriptorSet 0
+                              Decorate 191(g_tTex2du4) DescriptorSet 0
+                              Decorate 194(g_tTex3df4) DescriptorSet 0
+                              Decorate 197(g_tTex3di4) DescriptorSet 0
+                              Decorate 200(g_tTex3du4) DescriptorSet 0
+                              Decorate 203(g_tTexcdf4) DescriptorSet 0
+                              Decorate 206(g_tTexcdi4) DescriptorSet 0
+                              Decorate 209(g_tTexcdu4) DescriptorSet 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -516,229 +523,220 @@
     8(PS_OUTPUT):             TypeStruct 7(fvec4) 6(float)
                9:             TypeFunction 8(PS_OUTPUT)
               12:             TypePointer Function 6(float)
-              14:             TypeImage 6(float) 1D array sampled format:Unknown
+              14:             TypeImage 6(float) 1D depth array sampled format:Unknown
               15:             TypePointer UniformConstant 14
  16(g_tTex1df4a):     15(ptr) Variable UniformConstant
               18:             TypeSampler
               19:             TypePointer UniformConstant 18
      20(g_sSamp):     19(ptr) Variable UniformConstant
-              22:             TypeImage 6(float) 1D depth array sampled format:Unknown
-              23:             TypeSampledImage 22
-              25:             TypeVector 6(float) 2
-              26:    6(float) Constant 1036831949
-              27:    6(float) Constant 1045220557
-              28:   25(fvec2) ConstantComposite 26 27
-              29:    6(float) Constant 1061158912
-              30:             TypeVector 6(float) 3
-              34:    6(float) Constant 0
-              38:             TypeInt 32 1
-              39:             TypeImage 38(int) 1D array sampled format:Unknown
-              40:             TypePointer UniformConstant 39
- 41(g_tTex1di4a):     40(ptr) Variable UniformConstant
-              44:             TypeImage 38(int) 1D depth array sampled format:Unknown
-              45:             TypeSampledImage 44
-              53:             TypeInt 32 0
-              54:             TypeImage 53(int) 1D array sampled format:Unknown
-              55:             TypePointer UniformConstant 54
- 56(g_tTex1du4a):     55(ptr) Variable UniformConstant
-              59:             TypeImage 53(int) 1D depth array sampled format:Unknown
-              60:             TypeSampledImage 59
-              68:             TypeImage 6(float) 2D array sampled format:Unknown
-              69:             TypePointer UniformConstant 68
- 70(g_tTex2df4a):     69(ptr) Variable UniformConstant
-              73:             TypeImage 6(float) 2D depth array sampled format:Unknown
-              74:             TypeSampledImage 73
-              76:    6(float) Constant 1050253722
-              77:   30(fvec3) ConstantComposite 26 27 76
-              85:             TypeImage 38(int) 2D array sampled format:Unknown
-              86:             TypePointer UniformConstant 85
- 87(g_tTex2di4a):     86(ptr) Variable UniformConstant
-              90:             TypeImage 38(int) 2D depth array sampled format:Unknown
-              91:             TypeSampledImage 90
-             100:             TypeImage 53(int) 2D array sampled format:Unknown
-             101:             TypePointer UniformConstant 100
-102(g_tTex2du4a):    101(ptr) Variable UniformConstant
-             105:             TypeImage 53(int) 2D depth array sampled format:Unknown
-             106:             TypeSampledImage 105
-             115:             TypeImage 6(float) Cube array sampled format:Unknown
-             116:             TypePointer UniformConstant 115
-117(g_tTexcdf4a):    116(ptr) Variable UniformConstant
-             120:             TypeImage 6(float) Cube depth array sampled format:Unknown
-             121:             TypeSampledImage 120
-             123:    6(float) Constant 1053609165
-             124:    7(fvec4) ConstantComposite 26 27 76 123
-             132:             TypeImage 38(int) Cube array sampled format:Unknown
-             133:             TypePointer UniformConstant 132
-134(g_tTexcdi4a):    133(ptr) Variable UniformConstant
-             137:             TypeImage 38(int) Cube depth array sampled format:Unknown
-             138:             TypeSampledImage 137
-             147:             TypeImage 53(int) Cube array sampled format:Unknown
-             148:             TypePointer UniformConstant 147
-149(g_tTexcdu4a):    148(ptr) Variable UniformConstant
-             152:             TypeImage 53(int) Cube depth array sampled format:Unknown
-             153:             TypeSampledImage 152
-             161:             TypePointer Function 8(PS_OUTPUT)
-             163:     38(int) Constant 0
-             164:    6(float) Constant 1065353216
-             165:    7(fvec4) ConstantComposite 164 164 164 164
-             166:             TypePointer Function 7(fvec4)
-             168:     38(int) Constant 1
-             175:             TypePointer Output 7(fvec4)
-      176(Color):    175(ptr) Variable Output
-             179:             TypePointer Output 6(float)
-      180(Depth):    179(ptr) Variable Output
-             183:             TypeImage 6(float) 1D sampled format:Unknown
+              22:             TypeSampledImage 14
+              24:             TypeVector 6(float) 2
+              25:    6(float) Constant 1036831949
+              26:    6(float) Constant 1045220557
+              27:   24(fvec2) ConstantComposite 25 26
+              28:    6(float) Constant 1061158912
+              29:             TypeVector 6(float) 3
+              33:    6(float) Constant 0
+              37:             TypeInt 32 1
+              38:             TypeImage 37(int) 1D depth array sampled format:Unknown
+              39:             TypePointer UniformConstant 38
+ 40(g_tTex1di4a):     39(ptr) Variable UniformConstant
+              43:             TypeSampledImage 38
+              51:             TypeInt 32 0
+              52:             TypeImage 51(int) 1D depth array sampled format:Unknown
+              53:             TypePointer UniformConstant 52
+ 54(g_tTex1du4a):     53(ptr) Variable UniformConstant
+              57:             TypeSampledImage 52
+              65:             TypeImage 6(float) 2D depth array sampled format:Unknown
+              66:             TypePointer UniformConstant 65
+ 67(g_tTex2df4a):     66(ptr) Variable UniformConstant
+              70:             TypeSampledImage 65
+              72:    6(float) Constant 1050253722
+              73:   29(fvec3) ConstantComposite 25 26 72
+              81:             TypeImage 37(int) 2D depth array sampled format:Unknown
+              82:             TypePointer UniformConstant 81
+ 83(g_tTex2di4a):     82(ptr) Variable UniformConstant
+              86:             TypeSampledImage 81
+              95:             TypeImage 51(int) 2D depth array sampled format:Unknown
+              96:             TypePointer UniformConstant 95
+ 97(g_tTex2du4a):     96(ptr) Variable UniformConstant
+             100:             TypeSampledImage 95
+             109:             TypeImage 6(float) Cube depth array sampled format:Unknown
+             110:             TypePointer UniformConstant 109
+111(g_tTexcdf4a):    110(ptr) Variable UniformConstant
+             114:             TypeSampledImage 109
+             116:    6(float) Constant 1053609165
+             117:    7(fvec4) ConstantComposite 25 26 72 116
+             125:             TypeImage 37(int) Cube depth array sampled format:Unknown
+             126:             TypePointer UniformConstant 125
+127(g_tTexcdi4a):    126(ptr) Variable UniformConstant
+             130:             TypeSampledImage 125
+             139:             TypeImage 51(int) Cube depth array sampled format:Unknown
+             140:             TypePointer UniformConstant 139
+141(g_tTexcdu4a):    140(ptr) Variable UniformConstant
+             144:             TypeSampledImage 139
+             152:             TypePointer Function 8(PS_OUTPUT)
+             154:     37(int) Constant 0
+             155:    6(float) Constant 1065353216
+             156:    7(fvec4) ConstantComposite 155 155 155 155
+             157:             TypePointer Function 7(fvec4)
+             159:     37(int) Constant 1
+             166:             TypePointer Output 7(fvec4)
+167(@entryPointOutput.Color):    166(ptr) Variable Output
+             170:             TypePointer Output 6(float)
+171(@entryPointOutput.Depth):    170(ptr) Variable Output
+             174:             TypeImage 6(float) 1D sampled format:Unknown
+             175:             TypePointer UniformConstant 174
+ 176(g_tTex1df4):    175(ptr) Variable UniformConstant
+             177:             TypeImage 37(int) 1D sampled format:Unknown
+             178:             TypePointer UniformConstant 177
+ 179(g_tTex1di4):    178(ptr) Variable UniformConstant
+             180:             TypeImage 51(int) 1D sampled format:Unknown
+             181:             TypePointer UniformConstant 180
+ 182(g_tTex1du4):    181(ptr) Variable UniformConstant
+             183:             TypeImage 6(float) 2D sampled format:Unknown
              184:             TypePointer UniformConstant 183
- 185(g_tTex1df4):    184(ptr) Variable UniformConstant
-             186:             TypeImage 38(int) 1D sampled format:Unknown
+ 185(g_tTex2df4):    184(ptr) Variable UniformConstant
+             186:             TypeImage 37(int) 2D sampled format:Unknown
              187:             TypePointer UniformConstant 186
- 188(g_tTex1di4):    187(ptr) Variable UniformConstant
-             189:             TypeImage 53(int) 1D sampled format:Unknown
+ 188(g_tTex2di4):    187(ptr) Variable UniformConstant
+             189:             TypeImage 51(int) 2D sampled format:Unknown
              190:             TypePointer UniformConstant 189
- 191(g_tTex1du4):    190(ptr) Variable UniformConstant
-             192:             TypeImage 6(float) 2D sampled format:Unknown
+ 191(g_tTex2du4):    190(ptr) Variable UniformConstant
+             192:             TypeImage 6(float) 3D sampled format:Unknown
              193:             TypePointer UniformConstant 192
- 194(g_tTex2df4):    193(ptr) Variable UniformConstant
-             195:             TypeImage 38(int) 2D sampled format:Unknown
+ 194(g_tTex3df4):    193(ptr) Variable UniformConstant
+             195:             TypeImage 37(int) 3D sampled format:Unknown
              196:             TypePointer UniformConstant 195
- 197(g_tTex2di4):    196(ptr) Variable UniformConstant
-             198:             TypeImage 53(int) 2D sampled format:Unknown
+ 197(g_tTex3di4):    196(ptr) Variable UniformConstant
+             198:             TypeImage 51(int) 3D sampled format:Unknown
              199:             TypePointer UniformConstant 198
- 200(g_tTex2du4):    199(ptr) Variable UniformConstant
-             201:             TypeImage 6(float) 3D sampled format:Unknown
+ 200(g_tTex3du4):    199(ptr) Variable UniformConstant
+             201:             TypeImage 6(float) Cube sampled format:Unknown
              202:             TypePointer UniformConstant 201
- 203(g_tTex3df4):    202(ptr) Variable UniformConstant
-             204:             TypeImage 38(int) 3D sampled format:Unknown
+ 203(g_tTexcdf4):    202(ptr) Variable UniformConstant
+             204:             TypeImage 37(int) Cube sampled format:Unknown
              205:             TypePointer UniformConstant 204
- 206(g_tTex3di4):    205(ptr) Variable UniformConstant
-             207:             TypeImage 53(int) 3D sampled format:Unknown
+ 206(g_tTexcdi4):    205(ptr) Variable UniformConstant
+             207:             TypeImage 51(int) Cube sampled format:Unknown
              208:             TypePointer UniformConstant 207
- 209(g_tTex3du4):    208(ptr) Variable UniformConstant
-             210:             TypeImage 6(float) Cube sampled format:Unknown
-             211:             TypePointer UniformConstant 210
- 212(g_tTexcdf4):    211(ptr) Variable UniformConstant
-             213:             TypeImage 38(int) Cube sampled format:Unknown
-             214:             TypePointer UniformConstant 213
- 215(g_tTexcdi4):    214(ptr) Variable UniformConstant
-             216:             TypeImage 53(int) Cube sampled format:Unknown
-             217:             TypePointer UniformConstant 216
- 218(g_tTexcdu4):    217(ptr) Variable UniformConstant
+ 209(g_tTexcdu4):    208(ptr) Variable UniformConstant
          4(main):           2 Function None 3
                5:             Label
-173(flattenTemp):    161(ptr) Variable Function
-             174:8(PS_OUTPUT) FunctionCall 10(@main()
-                              Store 173(flattenTemp) 174
-             177:    166(ptr) AccessChain 173(flattenTemp) 163
-             178:    7(fvec4) Load 177
-                              Store 176(Color) 178
-             181:     12(ptr) AccessChain 173(flattenTemp) 168
-             182:    6(float) Load 181
-                              Store 180(Depth) 182
+164(flattenTemp):    152(ptr) Variable Function
+             165:8(PS_OUTPUT) FunctionCall 10(@main()
+                              Store 164(flattenTemp) 165
+             168:    157(ptr) AccessChain 164(flattenTemp) 154
+             169:    7(fvec4) Load 168
+                              Store 167(@entryPointOutput.Color) 169
+             172:     12(ptr) AccessChain 164(flattenTemp) 159
+             173:    6(float) Load 172
+                              Store 171(@entryPointOutput.Depth) 173
                               Return
                               FunctionEnd
       10(@main():8(PS_OUTPUT) Function None 9
               11:             Label
          13(r10):     12(ptr) Variable Function
-         37(r12):     12(ptr) Variable Function
-         52(r14):     12(ptr) Variable Function
-         67(r30):     12(ptr) Variable Function
-         84(r32):     12(ptr) Variable Function
-         99(r34):     12(ptr) Variable Function
-        114(r60):     12(ptr) Variable Function
-        131(r62):     12(ptr) Variable Function
-        146(r64):     12(ptr) Variable Function
-      162(psout):    161(ptr) Variable Function
+         36(r12):     12(ptr) Variable Function
+         50(r14):     12(ptr) Variable Function
+         64(r30):     12(ptr) Variable Function
+         80(r32):     12(ptr) Variable Function
+         94(r34):     12(ptr) Variable Function
+        108(r60):     12(ptr) Variable Function
+        124(r62):     12(ptr) Variable Function
+        138(r64):     12(ptr) Variable Function
+      153(psout):    152(ptr) Variable Function
               17:          14 Load 16(g_tTex1df4a)
               21:          18 Load 20(g_sSamp)
-              24:          23 SampledImage 17 21
-              31:    6(float) CompositeExtract 28 0
-              32:    6(float) CompositeExtract 28 1
-              33:   30(fvec3) CompositeConstruct 31 32 29
-              35:    6(float) CompositeExtract 33 2
-              36:    6(float) ImageSampleDrefExplicitLod 24 33 35 Lod 34
-                              Store 13(r10) 36
-              42:          39 Load 41(g_tTex1di4a)
-              43:          18 Load 20(g_sSamp)
-              46:          45 SampledImage 42 43
-              47:    6(float) CompositeExtract 28 0
-              48:    6(float) CompositeExtract 28 1
-              49:   30(fvec3) CompositeConstruct 47 48 29
-              50:    6(float) CompositeExtract 49 2
-              51:    6(float) ImageSampleDrefExplicitLod 46 49 50 Lod 34
-                              Store 37(r12) 51
-              57:          54 Load 56(g_tTex1du4a)
-              58:          18 Load 20(g_sSamp)
-              61:          60 SampledImage 57 58
-              62:    6(float) CompositeExtract 28 0
-              63:    6(float) CompositeExtract 28 1
-              64:   30(fvec3) CompositeConstruct 62 63 29
-              65:    6(float) CompositeExtract 64 2
-              66:    6(float) ImageSampleDrefExplicitLod 61 64 65 Lod 34
-                              Store 52(r14) 66
-              71:          68 Load 70(g_tTex2df4a)
-              72:          18 Load 20(g_sSamp)
-              75:          74 SampledImage 71 72
-              78:    6(float) CompositeExtract 77 0
-              79:    6(float) CompositeExtract 77 1
-              80:    6(float) CompositeExtract 77 2
-              81:    7(fvec4) CompositeConstruct 78 79 80 29
-              82:    6(float) CompositeExtract 81 3
-              83:    6(float) ImageSampleDrefExplicitLod 75 81 82 Lod 34
-                              Store 67(r30) 83
-              88:          85 Load 87(g_tTex2di4a)
-              89:          18 Load 20(g_sSamp)
-              92:          91 SampledImage 88 89
-              93:    6(float) CompositeExtract 77 0
-              94:    6(float) CompositeExtract 77 1
-              95:    6(float) CompositeExtract 77 2
-              96:    7(fvec4) CompositeConstruct 93 94 95 29
-              97:    6(float) CompositeExtract 96 3
-              98:    6(float) ImageSampleDrefExplicitLod 92 96 97 Lod 34
-                              Store 84(r32) 98
-             103:         100 Load 102(g_tTex2du4a)
-             104:          18 Load 20(g_sSamp)
-             107:         106 SampledImage 103 104
-             108:    6(float) CompositeExtract 77 0
-             109:    6(float) CompositeExtract 77 1
-             110:    6(float) CompositeExtract 77 2
-             111:    7(fvec4) CompositeConstruct 108 109 110 29
-             112:    6(float) CompositeExtract 111 3
-             113:    6(float) ImageSampleDrefExplicitLod 107 111 112 Lod 34
-                              Store 99(r34) 113
-             118:         115 Load 117(g_tTexcdf4a)
-             119:          18 Load 20(g_sSamp)
-             122:         121 SampledImage 118 119
-             125:    6(float) CompositeExtract 124 0
-             126:    6(float) CompositeExtract 124 1
-             127:    6(float) CompositeExtract 124 2
-             128:    6(float) CompositeExtract 124 3
-             129:    7(fvec4) CompositeConstruct 125 126 127 128
-             130:    6(float) ImageSampleDrefExplicitLod 122 129 29 Lod 29
-                              Store 114(r60) 130
-             135:         132 Load 134(g_tTexcdi4a)
-             136:          18 Load 20(g_sSamp)
-             139:         138 SampledImage 135 136
-             140:    6(float) CompositeExtract 124 0
-             141:    6(float) CompositeExtract 124 1
-             142:    6(float) CompositeExtract 124 2
-             143:    6(float) CompositeExtract 124 3
-             144:    7(fvec4) CompositeConstruct 140 141 142 143
-             145:    6(float) ImageSampleDrefExplicitLod 139 144 29 Lod 29
-                              Store 131(r62) 145
-             150:         147 Load 149(g_tTexcdu4a)
-             151:          18 Load 20(g_sSamp)
-             154:         153 SampledImage 150 151
-             155:    6(float) CompositeExtract 124 0
-             156:    6(float) CompositeExtract 124 1
-             157:    6(float) CompositeExtract 124 2
-             158:    6(float) CompositeExtract 124 3
-             159:    7(fvec4) CompositeConstruct 155 156 157 158
-             160:    6(float) ImageSampleDrefExplicitLod 154 159 29 Lod 29
-                              Store 146(r64) 160
-             167:    166(ptr) AccessChain 162(psout) 163
-                              Store 167 165
-             169:     12(ptr) AccessChain 162(psout) 168
-                              Store 169 164
-             170:8(PS_OUTPUT) Load 162(psout)
-                              ReturnValue 170
+              23:          22 SampledImage 17 21
+              30:    6(float) CompositeExtract 27 0
+              31:    6(float) CompositeExtract 27 1
+              32:   29(fvec3) CompositeConstruct 30 31 28
+              34:    6(float) CompositeExtract 32 2
+              35:    6(float) ImageSampleDrefExplicitLod 23 32 34 Lod 33
+                              Store 13(r10) 35
+              41:          38 Load 40(g_tTex1di4a)
+              42:          18 Load 20(g_sSamp)
+              44:          43 SampledImage 41 42
+              45:    6(float) CompositeExtract 27 0
+              46:    6(float) CompositeExtract 27 1
+              47:   29(fvec3) CompositeConstruct 45 46 28
+              48:    6(float) CompositeExtract 47 2
+              49:    6(float) ImageSampleDrefExplicitLod 44 47 48 Lod 33
+                              Store 36(r12) 49
+              55:          52 Load 54(g_tTex1du4a)
+              56:          18 Load 20(g_sSamp)
+              58:          57 SampledImage 55 56
+              59:    6(float) CompositeExtract 27 0
+              60:    6(float) CompositeExtract 27 1
+              61:   29(fvec3) CompositeConstruct 59 60 28
+              62:    6(float) CompositeExtract 61 2
+              63:    6(float) ImageSampleDrefExplicitLod 58 61 62 Lod 33
+                              Store 50(r14) 63
+              68:          65 Load 67(g_tTex2df4a)
+              69:          18 Load 20(g_sSamp)
+              71:          70 SampledImage 68 69
+              74:    6(float) CompositeExtract 73 0
+              75:    6(float) CompositeExtract 73 1
+              76:    6(float) CompositeExtract 73 2
+              77:    7(fvec4) CompositeConstruct 74 75 76 28
+              78:    6(float) CompositeExtract 77 3
+              79:    6(float) ImageSampleDrefExplicitLod 71 77 78 Lod 33
+                              Store 64(r30) 79
+              84:          81 Load 83(g_tTex2di4a)
+              85:          18 Load 20(g_sSamp)
+              87:          86 SampledImage 84 85
+              88:    6(float) CompositeExtract 73 0
+              89:    6(float) CompositeExtract 73 1
+              90:    6(float) CompositeExtract 73 2
+              91:    7(fvec4) CompositeConstruct 88 89 90 28
+              92:    6(float) CompositeExtract 91 3
+              93:    6(float) ImageSampleDrefExplicitLod 87 91 92 Lod 33
+                              Store 80(r32) 93
+              98:          95 Load 97(g_tTex2du4a)
+              99:          18 Load 20(g_sSamp)
+             101:         100 SampledImage 98 99
+             102:    6(float) CompositeExtract 73 0
+             103:    6(float) CompositeExtract 73 1
+             104:    6(float) CompositeExtract 73 2
+             105:    7(fvec4) CompositeConstruct 102 103 104 28
+             106:    6(float) CompositeExtract 105 3
+             107:    6(float) ImageSampleDrefExplicitLod 101 105 106 Lod 33
+                              Store 94(r34) 107
+             112:         109 Load 111(g_tTexcdf4a)
+             113:          18 Load 20(g_sSamp)
+             115:         114 SampledImage 112 113
+             118:    6(float) CompositeExtract 117 0
+             119:    6(float) CompositeExtract 117 1
+             120:    6(float) CompositeExtract 117 2
+             121:    6(float) CompositeExtract 117 3
+             122:    7(fvec4) CompositeConstruct 118 119 120 121
+             123:    6(float) ImageSampleDrefExplicitLod 115 122 28 Lod 33
+                              Store 108(r60) 123
+             128:         125 Load 127(g_tTexcdi4a)
+             129:          18 Load 20(g_sSamp)
+             131:         130 SampledImage 128 129
+             132:    6(float) CompositeExtract 117 0
+             133:    6(float) CompositeExtract 117 1
+             134:    6(float) CompositeExtract 117 2
+             135:    6(float) CompositeExtract 117 3
+             136:    7(fvec4) CompositeConstruct 132 133 134 135
+             137:    6(float) ImageSampleDrefExplicitLod 131 136 28 Lod 33
+                              Store 124(r62) 137
+             142:         139 Load 141(g_tTexcdu4a)
+             143:          18 Load 20(g_sSamp)
+             145:         144 SampledImage 142 143
+             146:    6(float) CompositeExtract 117 0
+             147:    6(float) CompositeExtract 117 1
+             148:    6(float) CompositeExtract 117 2
+             149:    6(float) CompositeExtract 117 3
+             150:    7(fvec4) CompositeConstruct 146 147 148 149
+             151:    6(float) ImageSampleDrefExplicitLod 145 150 28 Lod 33
+                              Store 138(r64) 151
+             158:    157(ptr) AccessChain 153(psout) 154
+                              Store 158 156
+             160:     12(ptr) AccessChain 153(psout) 159
+                              Store 160 155
+             161:8(PS_OUTPUT) Load 153(psout)
+                              ReturnValue 161
                               FunctionEnd
diff --git a/Test/baseResults/hlsl.samplecmplevelzero.basic.dx10.frag.out b/Test/baseResults/hlsl.samplecmplevelzero.basic.dx10.frag.out
index 9d2802d..ffe2298 100644
--- a/Test/baseResults/hlsl.samplecmplevelzero.basic.dx10.frag.out
+++ b/Test/baseResults/hlsl.samplecmplevelzero.basic.dx10.frag.out
@@ -1,6 +1,7 @@
 hlsl.samplecmplevelzero.basic.dx10.frag
 Shader version: 500
 gl_FragCoord origin is upper left
+using depth_any
 0:? Sequence
 0:38  Function Definition: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:38    Function Parameters: 
@@ -10,7 +11,7 @@
 0:42          'r00' ( temp float)
 0:42          textureLod ( temp float)
 0:42            Construct combined texture-sampler ( temp sampler1DShadow)
-0:42              'g_tTex1df4' (layout( binding=0) uniform texture1D)
+0:42              'g_tTex1df4' (layout( binding=0) uniform texture1DShadow)
 0:42              'g_sSamp' (layout( binding=0) uniform sampler)
 0:42            Construct vec2 ( temp 2-component vector of float)
 0:42              Constant:
@@ -24,7 +25,7 @@
 0:43          'r02' ( temp float)
 0:43          textureLod ( temp float)
 0:43            Construct combined texture-sampler ( temp isampler1DShadow)
-0:43              'g_tTex1di4' ( uniform itexture1D)
+0:43              'g_tTex1di4' ( uniform itexture1DShadow)
 0:43              'g_sSamp' (layout( binding=0) uniform sampler)
 0:43            Construct vec2 ( temp 2-component vector of float)
 0:43              Constant:
@@ -38,7 +39,7 @@
 0:44          'r04' ( temp float)
 0:44          textureLod ( temp float)
 0:44            Construct combined texture-sampler ( temp usampler1DShadow)
-0:44              'g_tTex1du4' ( uniform utexture1D)
+0:44              'g_tTex1du4' ( uniform utexture1DShadow)
 0:44              'g_sSamp' (layout( binding=0) uniform sampler)
 0:44            Construct vec2 ( temp 2-component vector of float)
 0:44              Constant:
@@ -52,7 +53,7 @@
 0:47          'r20' ( temp float)
 0:47          textureLod ( temp float)
 0:47            Construct combined texture-sampler ( temp sampler2DShadow)
-0:47              'g_tTex2df4' ( uniform texture2D)
+0:47              'g_tTex2df4' ( uniform texture2DShadow)
 0:47              'g_sSamp' (layout( binding=0) uniform sampler)
 0:47            Construct vec3 ( temp 3-component vector of float)
 0:?               Constant:
@@ -67,7 +68,7 @@
 0:48          'r22' ( temp float)
 0:48          textureLod ( temp float)
 0:48            Construct combined texture-sampler ( temp isampler2DShadow)
-0:48              'g_tTex2di4' ( uniform itexture2D)
+0:48              'g_tTex2di4' ( uniform itexture2DShadow)
 0:48              'g_sSamp' (layout( binding=0) uniform sampler)
 0:48            Construct vec3 ( temp 3-component vector of float)
 0:?               Constant:
@@ -82,7 +83,7 @@
 0:49          'r24' ( temp float)
 0:49          textureLod ( temp float)
 0:49            Construct combined texture-sampler ( temp usampler2DShadow)
-0:49              'g_tTex2du4' ( uniform utexture2D)
+0:49              'g_tTex2du4' ( uniform utexture2DShadow)
 0:49              'g_sSamp' (layout( binding=0) uniform sampler)
 0:49            Construct vec3 ( temp 3-component vector of float)
 0:?               Constant:
@@ -97,7 +98,7 @@
 0:53          'r50' ( temp float)
 0:53          textureLod ( temp float)
 0:53            Construct combined texture-sampler ( temp samplerCubeShadow)
-0:53              'g_tTexcdf4' ( uniform textureCube)
+0:53              'g_tTexcdf4' ( uniform textureCubeShadow)
 0:53              'g_sSamp' (layout( binding=0) uniform sampler)
 0:53            Construct vec4 ( temp 4-component vector of float)
 0:?               Constant:
@@ -113,7 +114,7 @@
 0:54          'r52' ( temp float)
 0:54          textureLod ( temp float)
 0:54            Construct combined texture-sampler ( temp isamplerCubeShadow)
-0:54              'g_tTexcdi4' ( uniform itextureCube)
+0:54              'g_tTexcdi4' ( uniform itextureCubeShadow)
 0:54              'g_sSamp' (layout( binding=0) uniform sampler)
 0:54            Construct vec4 ( temp 4-component vector of float)
 0:?               Constant:
@@ -129,7 +130,7 @@
 0:55          'r54' ( temp float)
 0:55          textureLod ( temp float)
 0:55            Construct combined texture-sampler ( temp usamplerCubeShadow)
-0:55              'g_tTexcdu4' ( uniform utextureCube)
+0:55              'g_tTexcdu4' ( uniform utextureCubeShadow)
 0:55              'g_sSamp' (layout( binding=0) uniform sampler)
 0:55            Construct vec4 ( temp 4-component vector of float)
 0:?               Constant:
@@ -167,31 +168,31 @@
 0:38          'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:38          Function Call: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:38        move second child to first child ( temp 4-component vector of float)
-0:?           'Color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 0:38          Color: direct index for structure ( temp 4-component vector of float)
 0:38            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:38            Constant:
 0:38              0 (const int)
 0:38        move second child to first child ( temp float)
-0:?           'Depth' ( out float FragDepth)
+0:?           '@entryPointOutput.Depth' ( out float FragDepth)
 0:38          Depth: direct index for structure ( temp float)
 0:38            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:38            Constant:
 0:38              1 (const int)
 0:?   Linker Objects
 0:?     'g_sSamp' (layout( binding=0) uniform sampler)
-0:?     'g_tTex1df4' (layout( binding=0) uniform texture1D)
-0:?     'g_tTex1di4' ( uniform itexture1D)
-0:?     'g_tTex1du4' ( uniform utexture1D)
-0:?     'g_tTex2df4' ( uniform texture2D)
-0:?     'g_tTex2di4' ( uniform itexture2D)
-0:?     'g_tTex2du4' ( uniform utexture2D)
+0:?     'g_tTex1df4' (layout( binding=0) uniform texture1DShadow)
+0:?     'g_tTex1di4' ( uniform itexture1DShadow)
+0:?     'g_tTex1du4' ( uniform utexture1DShadow)
+0:?     'g_tTex2df4' ( uniform texture2DShadow)
+0:?     'g_tTex2di4' ( uniform itexture2DShadow)
+0:?     'g_tTex2du4' ( uniform utexture2DShadow)
 0:?     'g_tTex3df4' ( uniform texture3D)
 0:?     'g_tTex3di4' ( uniform itexture3D)
 0:?     'g_tTex3du4' ( uniform utexture3D)
-0:?     'g_tTexcdf4' ( uniform textureCube)
-0:?     'g_tTexcdi4' ( uniform itextureCube)
-0:?     'g_tTexcdu4' ( uniform utextureCube)
+0:?     'g_tTexcdf4' ( uniform textureCubeShadow)
+0:?     'g_tTexcdi4' ( uniform itextureCubeShadow)
+0:?     'g_tTexcdu4' ( uniform utextureCubeShadow)
 0:?     'g_tTex1df4a' ( uniform texture1DArray)
 0:?     'g_tTex1di4a' ( uniform itexture1DArray)
 0:?     'g_tTex1du4a' ( uniform utexture1DArray)
@@ -201,8 +202,8 @@
 0:?     'g_tTexcdf4a' ( uniform textureCubeArray)
 0:?     'g_tTexcdi4a' ( uniform itextureCubeArray)
 0:?     'g_tTexcdu4a' ( uniform utextureCubeArray)
-0:?     'Color' (layout( location=0) out 4-component vector of float)
-0:?     'Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 
 Linked fragment stage:
@@ -210,6 +211,7 @@
 
 Shader version: 500
 gl_FragCoord origin is upper left
+using depth_any
 0:? Sequence
 0:38  Function Definition: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:38    Function Parameters: 
@@ -219,7 +221,7 @@
 0:42          'r00' ( temp float)
 0:42          textureLod ( temp float)
 0:42            Construct combined texture-sampler ( temp sampler1DShadow)
-0:42              'g_tTex1df4' (layout( binding=0) uniform texture1D)
+0:42              'g_tTex1df4' (layout( binding=0) uniform texture1DShadow)
 0:42              'g_sSamp' (layout( binding=0) uniform sampler)
 0:42            Construct vec2 ( temp 2-component vector of float)
 0:42              Constant:
@@ -233,7 +235,7 @@
 0:43          'r02' ( temp float)
 0:43          textureLod ( temp float)
 0:43            Construct combined texture-sampler ( temp isampler1DShadow)
-0:43              'g_tTex1di4' ( uniform itexture1D)
+0:43              'g_tTex1di4' ( uniform itexture1DShadow)
 0:43              'g_sSamp' (layout( binding=0) uniform sampler)
 0:43            Construct vec2 ( temp 2-component vector of float)
 0:43              Constant:
@@ -247,7 +249,7 @@
 0:44          'r04' ( temp float)
 0:44          textureLod ( temp float)
 0:44            Construct combined texture-sampler ( temp usampler1DShadow)
-0:44              'g_tTex1du4' ( uniform utexture1D)
+0:44              'g_tTex1du4' ( uniform utexture1DShadow)
 0:44              'g_sSamp' (layout( binding=0) uniform sampler)
 0:44            Construct vec2 ( temp 2-component vector of float)
 0:44              Constant:
@@ -261,7 +263,7 @@
 0:47          'r20' ( temp float)
 0:47          textureLod ( temp float)
 0:47            Construct combined texture-sampler ( temp sampler2DShadow)
-0:47              'g_tTex2df4' ( uniform texture2D)
+0:47              'g_tTex2df4' ( uniform texture2DShadow)
 0:47              'g_sSamp' (layout( binding=0) uniform sampler)
 0:47            Construct vec3 ( temp 3-component vector of float)
 0:?               Constant:
@@ -276,7 +278,7 @@
 0:48          'r22' ( temp float)
 0:48          textureLod ( temp float)
 0:48            Construct combined texture-sampler ( temp isampler2DShadow)
-0:48              'g_tTex2di4' ( uniform itexture2D)
+0:48              'g_tTex2di4' ( uniform itexture2DShadow)
 0:48              'g_sSamp' (layout( binding=0) uniform sampler)
 0:48            Construct vec3 ( temp 3-component vector of float)
 0:?               Constant:
@@ -291,7 +293,7 @@
 0:49          'r24' ( temp float)
 0:49          textureLod ( temp float)
 0:49            Construct combined texture-sampler ( temp usampler2DShadow)
-0:49              'g_tTex2du4' ( uniform utexture2D)
+0:49              'g_tTex2du4' ( uniform utexture2DShadow)
 0:49              'g_sSamp' (layout( binding=0) uniform sampler)
 0:49            Construct vec3 ( temp 3-component vector of float)
 0:?               Constant:
@@ -306,7 +308,7 @@
 0:53          'r50' ( temp float)
 0:53          textureLod ( temp float)
 0:53            Construct combined texture-sampler ( temp samplerCubeShadow)
-0:53              'g_tTexcdf4' ( uniform textureCube)
+0:53              'g_tTexcdf4' ( uniform textureCubeShadow)
 0:53              'g_sSamp' (layout( binding=0) uniform sampler)
 0:53            Construct vec4 ( temp 4-component vector of float)
 0:?               Constant:
@@ -322,7 +324,7 @@
 0:54          'r52' ( temp float)
 0:54          textureLod ( temp float)
 0:54            Construct combined texture-sampler ( temp isamplerCubeShadow)
-0:54              'g_tTexcdi4' ( uniform itextureCube)
+0:54              'g_tTexcdi4' ( uniform itextureCubeShadow)
 0:54              'g_sSamp' (layout( binding=0) uniform sampler)
 0:54            Construct vec4 ( temp 4-component vector of float)
 0:?               Constant:
@@ -338,7 +340,7 @@
 0:55          'r54' ( temp float)
 0:55          textureLod ( temp float)
 0:55            Construct combined texture-sampler ( temp usamplerCubeShadow)
-0:55              'g_tTexcdu4' ( uniform utextureCube)
+0:55              'g_tTexcdu4' ( uniform utextureCubeShadow)
 0:55              'g_sSamp' (layout( binding=0) uniform sampler)
 0:55            Construct vec4 ( temp 4-component vector of float)
 0:?               Constant:
@@ -376,31 +378,31 @@
 0:38          'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:38          Function Call: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:38        move second child to first child ( temp 4-component vector of float)
-0:?           'Color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 0:38          Color: direct index for structure ( temp 4-component vector of float)
 0:38            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:38            Constant:
 0:38              0 (const int)
 0:38        move second child to first child ( temp float)
-0:?           'Depth' ( out float FragDepth)
+0:?           '@entryPointOutput.Depth' ( out float FragDepth)
 0:38          Depth: direct index for structure ( temp float)
 0:38            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:38            Constant:
 0:38              1 (const int)
 0:?   Linker Objects
 0:?     'g_sSamp' (layout( binding=0) uniform sampler)
-0:?     'g_tTex1df4' (layout( binding=0) uniform texture1D)
-0:?     'g_tTex1di4' ( uniform itexture1D)
-0:?     'g_tTex1du4' ( uniform utexture1D)
-0:?     'g_tTex2df4' ( uniform texture2D)
-0:?     'g_tTex2di4' ( uniform itexture2D)
-0:?     'g_tTex2du4' ( uniform utexture2D)
+0:?     'g_tTex1df4' (layout( binding=0) uniform texture1DShadow)
+0:?     'g_tTex1di4' ( uniform itexture1DShadow)
+0:?     'g_tTex1du4' ( uniform utexture1DShadow)
+0:?     'g_tTex2df4' ( uniform texture2DShadow)
+0:?     'g_tTex2di4' ( uniform itexture2DShadow)
+0:?     'g_tTex2du4' ( uniform utexture2DShadow)
 0:?     'g_tTex3df4' ( uniform texture3D)
 0:?     'g_tTex3di4' ( uniform itexture3D)
 0:?     'g_tTex3du4' ( uniform utexture3D)
-0:?     'g_tTexcdf4' ( uniform textureCube)
-0:?     'g_tTexcdi4' ( uniform itextureCube)
-0:?     'g_tTexcdu4' ( uniform utextureCube)
+0:?     'g_tTexcdf4' ( uniform textureCubeShadow)
+0:?     'g_tTexcdi4' ( uniform itextureCubeShadow)
+0:?     'g_tTexcdu4' ( uniform utextureCubeShadow)
 0:?     'g_tTex1df4a' ( uniform texture1DArray)
 0:?     'g_tTex1di4a' ( uniform itexture1DArray)
 0:?     'g_tTex1du4a' ( uniform utexture1DArray)
@@ -410,20 +412,25 @@
 0:?     'g_tTexcdf4a' ( uniform textureCubeArray)
 0:?     'g_tTexcdi4a' ( uniform itextureCubeArray)
 0:?     'g_tTexcdu4a' ( uniform utextureCubeArray)
-0:?     'Color' (layout( location=0) out 4-component vector of float)
-0:?     'Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
+
+error: SPIRV-Tools Validation Errors
+error: Expected Image 'Sampled Type' to be the same as Result Type
+  %42 = OpImageSampleDrefExplicitLod %float %39 %40 %41 Lod %float_0
 
 // Module Version 10000
-// Generated by (magic number): 80001
-// Id's are bound by 208
+// Generated by (magic number): 80007
+// Id's are bound by 199
 
                               Capability Shader
                               Capability Sampled1D
                               Capability SampledCubeArray
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "main" 165 169
+                              EntryPoint Fragment 4  "main" 156 160
                               ExecutionMode 4 OriginUpperLeft
+                              ExecutionMode 4 DepthReplacing
                               Source HLSL 500
                               Name 4  "main"
                               Name 8  "PS_OUTPUT"
@@ -433,64 +440,64 @@
                               Name 13  "r00"
                               Name 16  "g_tTex1df4"
                               Name 20  "g_sSamp"
-                              Name 32  "r02"
-                              Name 36  "g_tTex1di4"
-                              Name 45  "r04"
-                              Name 49  "g_tTex1du4"
-                              Name 58  "r20"
-                              Name 61  "g_tTex2df4"
-                              Name 75  "r22"
-                              Name 78  "g_tTex2di4"
-                              Name 89  "r24"
-                              Name 92  "g_tTex2du4"
-                              Name 103  "r50"
-                              Name 106  "g_tTexcdf4"
-                              Name 120  "r52"
-                              Name 123  "g_tTexcdi4"
-                              Name 135  "r54"
-                              Name 138  "g_tTexcdu4"
-                              Name 151  "psout"
-                              Name 162  "flattenTemp"
-                              Name 165  "Color"
-                              Name 169  "Depth"
-                              Name 174  "g_tTex3df4"
-                              Name 177  "g_tTex3di4"
-                              Name 180  "g_tTex3du4"
-                              Name 183  "g_tTex1df4a"
-                              Name 186  "g_tTex1di4a"
-                              Name 189  "g_tTex1du4a"
-                              Name 192  "g_tTex2df4a"
-                              Name 195  "g_tTex2di4a"
-                              Name 198  "g_tTex2du4a"
-                              Name 201  "g_tTexcdf4a"
-                              Name 204  "g_tTexcdi4a"
-                              Name 207  "g_tTexcdu4a"
+                              Name 31  "r02"
+                              Name 35  "g_tTex1di4"
+                              Name 43  "r04"
+                              Name 47  "g_tTex1du4"
+                              Name 55  "r20"
+                              Name 58  "g_tTex2df4"
+                              Name 71  "r22"
+                              Name 74  "g_tTex2di4"
+                              Name 84  "r24"
+                              Name 87  "g_tTex2du4"
+                              Name 97  "r50"
+                              Name 100  "g_tTexcdf4"
+                              Name 113  "r52"
+                              Name 116  "g_tTexcdi4"
+                              Name 127  "r54"
+                              Name 130  "g_tTexcdu4"
+                              Name 142  "psout"
+                              Name 153  "flattenTemp"
+                              Name 156  "@entryPointOutput.Color"
+                              Name 160  "@entryPointOutput.Depth"
+                              Name 165  "g_tTex3df4"
+                              Name 168  "g_tTex3di4"
+                              Name 171  "g_tTex3du4"
+                              Name 174  "g_tTex1df4a"
+                              Name 177  "g_tTex1di4a"
+                              Name 180  "g_tTex1du4a"
+                              Name 183  "g_tTex2df4a"
+                              Name 186  "g_tTex2di4a"
+                              Name 189  "g_tTex2du4a"
+                              Name 192  "g_tTexcdf4a"
+                              Name 195  "g_tTexcdi4a"
+                              Name 198  "g_tTexcdu4a"
                               Decorate 16(g_tTex1df4) DescriptorSet 0
                               Decorate 16(g_tTex1df4) Binding 0
                               Decorate 20(g_sSamp) DescriptorSet 0
                               Decorate 20(g_sSamp) Binding 0
-                              Decorate 36(g_tTex1di4) DescriptorSet 0
-                              Decorate 49(g_tTex1du4) DescriptorSet 0
-                              Decorate 61(g_tTex2df4) DescriptorSet 0
-                              Decorate 78(g_tTex2di4) DescriptorSet 0
-                              Decorate 92(g_tTex2du4) DescriptorSet 0
-                              Decorate 106(g_tTexcdf4) DescriptorSet 0
-                              Decorate 123(g_tTexcdi4) DescriptorSet 0
-                              Decorate 138(g_tTexcdu4) DescriptorSet 0
-                              Decorate 165(Color) Location 0
-                              Decorate 169(Depth) BuiltIn FragDepth
-                              Decorate 174(g_tTex3df4) DescriptorSet 0
-                              Decorate 177(g_tTex3di4) DescriptorSet 0
-                              Decorate 180(g_tTex3du4) DescriptorSet 0
-                              Decorate 183(g_tTex1df4a) DescriptorSet 0
-                              Decorate 186(g_tTex1di4a) DescriptorSet 0
-                              Decorate 189(g_tTex1du4a) DescriptorSet 0
-                              Decorate 192(g_tTex2df4a) DescriptorSet 0
-                              Decorate 195(g_tTex2di4a) DescriptorSet 0
-                              Decorate 198(g_tTex2du4a) DescriptorSet 0
-                              Decorate 201(g_tTexcdf4a) DescriptorSet 0
-                              Decorate 204(g_tTexcdi4a) DescriptorSet 0
-                              Decorate 207(g_tTexcdu4a) DescriptorSet 0
+                              Decorate 35(g_tTex1di4) DescriptorSet 0
+                              Decorate 47(g_tTex1du4) DescriptorSet 0
+                              Decorate 58(g_tTex2df4) DescriptorSet 0
+                              Decorate 74(g_tTex2di4) DescriptorSet 0
+                              Decorate 87(g_tTex2du4) DescriptorSet 0
+                              Decorate 100(g_tTexcdf4) DescriptorSet 0
+                              Decorate 116(g_tTexcdi4) DescriptorSet 0
+                              Decorate 130(g_tTexcdu4) DescriptorSet 0
+                              Decorate 156(@entryPointOutput.Color) Location 0
+                              Decorate 160(@entryPointOutput.Depth) BuiltIn FragDepth
+                              Decorate 165(g_tTex3df4) DescriptorSet 0
+                              Decorate 168(g_tTex3di4) DescriptorSet 0
+                              Decorate 171(g_tTex3du4) DescriptorSet 0
+                              Decorate 174(g_tTex1df4a) DescriptorSet 0
+                              Decorate 177(g_tTex1di4a) DescriptorSet 0
+                              Decorate 180(g_tTex1du4a) DescriptorSet 0
+                              Decorate 183(g_tTex2df4a) DescriptorSet 0
+                              Decorate 186(g_tTex2di4a) DescriptorSet 0
+                              Decorate 189(g_tTex2du4a) DescriptorSet 0
+                              Decorate 192(g_tTexcdf4a) DescriptorSet 0
+                              Decorate 195(g_tTexcdi4a) DescriptorSet 0
+                              Decorate 198(g_tTexcdu4a) DescriptorSet 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -498,218 +505,209 @@
     8(PS_OUTPUT):             TypeStruct 7(fvec4) 6(float)
                9:             TypeFunction 8(PS_OUTPUT)
               12:             TypePointer Function 6(float)
-              14:             TypeImage 6(float) 1D sampled format:Unknown
+              14:             TypeImage 6(float) 1D depth sampled format:Unknown
               15:             TypePointer UniformConstant 14
   16(g_tTex1df4):     15(ptr) Variable UniformConstant
               18:             TypeSampler
               19:             TypePointer UniformConstant 18
      20(g_sSamp):     19(ptr) Variable UniformConstant
-              22:             TypeImage 6(float) 1D depth sampled format:Unknown
-              23:             TypeSampledImage 22
-              25:    6(float) Constant 1036831949
-              26:    6(float) Constant 1061158912
-              27:             TypeVector 6(float) 2
-              29:    6(float) Constant 0
-              33:             TypeInt 32 1
-              34:             TypeImage 33(int) 1D sampled format:Unknown
-              35:             TypePointer UniformConstant 34
-  36(g_tTex1di4):     35(ptr) Variable UniformConstant
-              39:             TypeImage 33(int) 1D depth sampled format:Unknown
-              40:             TypeSampledImage 39
-              46:             TypeInt 32 0
-              47:             TypeImage 46(int) 1D sampled format:Unknown
-              48:             TypePointer UniformConstant 47
-  49(g_tTex1du4):     48(ptr) Variable UniformConstant
-              52:             TypeImage 46(int) 1D depth sampled format:Unknown
-              53:             TypeSampledImage 52
-              59:             TypeImage 6(float) 2D sampled format:Unknown
-              60:             TypePointer UniformConstant 59
-  61(g_tTex2df4):     60(ptr) Variable UniformConstant
-              64:             TypeImage 6(float) 2D depth sampled format:Unknown
-              65:             TypeSampledImage 64
-              67:    6(float) Constant 1045220557
-              68:   27(fvec2) ConstantComposite 25 67
-              69:             TypeVector 6(float) 3
-              76:             TypeImage 33(int) 2D sampled format:Unknown
-              77:             TypePointer UniformConstant 76
-  78(g_tTex2di4):     77(ptr) Variable UniformConstant
-              81:             TypeImage 33(int) 2D depth sampled format:Unknown
-              82:             TypeSampledImage 81
-              90:             TypeImage 46(int) 2D sampled format:Unknown
-              91:             TypePointer UniformConstant 90
-  92(g_tTex2du4):     91(ptr) Variable UniformConstant
-              95:             TypeImage 46(int) 2D depth sampled format:Unknown
-              96:             TypeSampledImage 95
-             104:             TypeImage 6(float) Cube sampled format:Unknown
-             105:             TypePointer UniformConstant 104
- 106(g_tTexcdf4):    105(ptr) Variable UniformConstant
-             109:             TypeImage 6(float) Cube depth sampled format:Unknown
-             110:             TypeSampledImage 109
-             112:    6(float) Constant 1050253722
-             113:   69(fvec3) ConstantComposite 25 67 112
-             121:             TypeImage 33(int) Cube sampled format:Unknown
-             122:             TypePointer UniformConstant 121
- 123(g_tTexcdi4):    122(ptr) Variable UniformConstant
-             126:             TypeImage 33(int) Cube depth sampled format:Unknown
-             127:             TypeSampledImage 126
-             136:             TypeImage 46(int) Cube sampled format:Unknown
-             137:             TypePointer UniformConstant 136
- 138(g_tTexcdu4):    137(ptr) Variable UniformConstant
-             141:             TypeImage 46(int) Cube depth sampled format:Unknown
-             142:             TypeSampledImage 141
-             150:             TypePointer Function 8(PS_OUTPUT)
-             152:     33(int) Constant 0
-             153:    6(float) Constant 1065353216
-             154:    7(fvec4) ConstantComposite 153 153 153 153
-             155:             TypePointer Function 7(fvec4)
-             157:     33(int) Constant 1
-             164:             TypePointer Output 7(fvec4)
-      165(Color):    164(ptr) Variable Output
-             168:             TypePointer Output 6(float)
-      169(Depth):    168(ptr) Variable Output
-             172:             TypeImage 6(float) 3D sampled format:Unknown
+              22:             TypeSampledImage 14
+              24:    6(float) Constant 1036831949
+              25:    6(float) Constant 1061158912
+              26:             TypeVector 6(float) 2
+              28:    6(float) Constant 0
+              32:             TypeInt 32 1
+              33:             TypeImage 32(int) 1D depth sampled format:Unknown
+              34:             TypePointer UniformConstant 33
+  35(g_tTex1di4):     34(ptr) Variable UniformConstant
+              38:             TypeSampledImage 33
+              44:             TypeInt 32 0
+              45:             TypeImage 44(int) 1D depth sampled format:Unknown
+              46:             TypePointer UniformConstant 45
+  47(g_tTex1du4):     46(ptr) Variable UniformConstant
+              50:             TypeSampledImage 45
+              56:             TypeImage 6(float) 2D depth sampled format:Unknown
+              57:             TypePointer UniformConstant 56
+  58(g_tTex2df4):     57(ptr) Variable UniformConstant
+              61:             TypeSampledImage 56
+              63:    6(float) Constant 1045220557
+              64:   26(fvec2) ConstantComposite 24 63
+              65:             TypeVector 6(float) 3
+              72:             TypeImage 32(int) 2D depth sampled format:Unknown
+              73:             TypePointer UniformConstant 72
+  74(g_tTex2di4):     73(ptr) Variable UniformConstant
+              77:             TypeSampledImage 72
+              85:             TypeImage 44(int) 2D depth sampled format:Unknown
+              86:             TypePointer UniformConstant 85
+  87(g_tTex2du4):     86(ptr) Variable UniformConstant
+              90:             TypeSampledImage 85
+              98:             TypeImage 6(float) Cube depth sampled format:Unknown
+              99:             TypePointer UniformConstant 98
+ 100(g_tTexcdf4):     99(ptr) Variable UniformConstant
+             103:             TypeSampledImage 98
+             105:    6(float) Constant 1050253722
+             106:   65(fvec3) ConstantComposite 24 63 105
+             114:             TypeImage 32(int) Cube depth sampled format:Unknown
+             115:             TypePointer UniformConstant 114
+ 116(g_tTexcdi4):    115(ptr) Variable UniformConstant
+             119:             TypeSampledImage 114
+             128:             TypeImage 44(int) Cube depth sampled format:Unknown
+             129:             TypePointer UniformConstant 128
+ 130(g_tTexcdu4):    129(ptr) Variable UniformConstant
+             133:             TypeSampledImage 128
+             141:             TypePointer Function 8(PS_OUTPUT)
+             143:     32(int) Constant 0
+             144:    6(float) Constant 1065353216
+             145:    7(fvec4) ConstantComposite 144 144 144 144
+             146:             TypePointer Function 7(fvec4)
+             148:     32(int) Constant 1
+             155:             TypePointer Output 7(fvec4)
+156(@entryPointOutput.Color):    155(ptr) Variable Output
+             159:             TypePointer Output 6(float)
+160(@entryPointOutput.Depth):    159(ptr) Variable Output
+             163:             TypeImage 6(float) 3D sampled format:Unknown
+             164:             TypePointer UniformConstant 163
+ 165(g_tTex3df4):    164(ptr) Variable UniformConstant
+             166:             TypeImage 32(int) 3D sampled format:Unknown
+             167:             TypePointer UniformConstant 166
+ 168(g_tTex3di4):    167(ptr) Variable UniformConstant
+             169:             TypeImage 44(int) 3D sampled format:Unknown
+             170:             TypePointer UniformConstant 169
+ 171(g_tTex3du4):    170(ptr) Variable UniformConstant
+             172:             TypeImage 6(float) 1D array sampled format:Unknown
              173:             TypePointer UniformConstant 172
- 174(g_tTex3df4):    173(ptr) Variable UniformConstant
-             175:             TypeImage 33(int) 3D sampled format:Unknown
+174(g_tTex1df4a):    173(ptr) Variable UniformConstant
+             175:             TypeImage 32(int) 1D array sampled format:Unknown
              176:             TypePointer UniformConstant 175
- 177(g_tTex3di4):    176(ptr) Variable UniformConstant
-             178:             TypeImage 46(int) 3D sampled format:Unknown
+177(g_tTex1di4a):    176(ptr) Variable UniformConstant
+             178:             TypeImage 44(int) 1D array sampled format:Unknown
              179:             TypePointer UniformConstant 178
- 180(g_tTex3du4):    179(ptr) Variable UniformConstant
-             181:             TypeImage 6(float) 1D array sampled format:Unknown
+180(g_tTex1du4a):    179(ptr) Variable UniformConstant
+             181:             TypeImage 6(float) 2D array sampled format:Unknown
              182:             TypePointer UniformConstant 181
-183(g_tTex1df4a):    182(ptr) Variable UniformConstant
-             184:             TypeImage 33(int) 1D array sampled format:Unknown
+183(g_tTex2df4a):    182(ptr) Variable UniformConstant
+             184:             TypeImage 32(int) 2D array sampled format:Unknown
              185:             TypePointer UniformConstant 184
-186(g_tTex1di4a):    185(ptr) Variable UniformConstant
-             187:             TypeImage 46(int) 1D array sampled format:Unknown
+186(g_tTex2di4a):    185(ptr) Variable UniformConstant
+             187:             TypeImage 44(int) 2D array sampled format:Unknown
              188:             TypePointer UniformConstant 187
-189(g_tTex1du4a):    188(ptr) Variable UniformConstant
-             190:             TypeImage 6(float) 2D array sampled format:Unknown
+189(g_tTex2du4a):    188(ptr) Variable UniformConstant
+             190:             TypeImage 6(float) Cube array sampled format:Unknown
              191:             TypePointer UniformConstant 190
-192(g_tTex2df4a):    191(ptr) Variable UniformConstant
-             193:             TypeImage 33(int) 2D array sampled format:Unknown
+192(g_tTexcdf4a):    191(ptr) Variable UniformConstant
+             193:             TypeImage 32(int) Cube array sampled format:Unknown
              194:             TypePointer UniformConstant 193
-195(g_tTex2di4a):    194(ptr) Variable UniformConstant
-             196:             TypeImage 46(int) 2D array sampled format:Unknown
+195(g_tTexcdi4a):    194(ptr) Variable UniformConstant
+             196:             TypeImage 44(int) Cube array sampled format:Unknown
              197:             TypePointer UniformConstant 196
-198(g_tTex2du4a):    197(ptr) Variable UniformConstant
-             199:             TypeImage 6(float) Cube array sampled format:Unknown
-             200:             TypePointer UniformConstant 199
-201(g_tTexcdf4a):    200(ptr) Variable UniformConstant
-             202:             TypeImage 33(int) Cube array sampled format:Unknown
-             203:             TypePointer UniformConstant 202
-204(g_tTexcdi4a):    203(ptr) Variable UniformConstant
-             205:             TypeImage 46(int) Cube array sampled format:Unknown
-             206:             TypePointer UniformConstant 205
-207(g_tTexcdu4a):    206(ptr) Variable UniformConstant
+198(g_tTexcdu4a):    197(ptr) Variable UniformConstant
          4(main):           2 Function None 3
                5:             Label
-162(flattenTemp):    150(ptr) Variable Function
-             163:8(PS_OUTPUT) FunctionCall 10(@main()
-                              Store 162(flattenTemp) 163
-             166:    155(ptr) AccessChain 162(flattenTemp) 152
-             167:    7(fvec4) Load 166
-                              Store 165(Color) 167
-             170:     12(ptr) AccessChain 162(flattenTemp) 157
-             171:    6(float) Load 170
-                              Store 169(Depth) 171
+153(flattenTemp):    141(ptr) Variable Function
+             154:8(PS_OUTPUT) FunctionCall 10(@main()
+                              Store 153(flattenTemp) 154
+             157:    146(ptr) AccessChain 153(flattenTemp) 143
+             158:    7(fvec4) Load 157
+                              Store 156(@entryPointOutput.Color) 158
+             161:     12(ptr) AccessChain 153(flattenTemp) 148
+             162:    6(float) Load 161
+                              Store 160(@entryPointOutput.Depth) 162
                               Return
                               FunctionEnd
       10(@main():8(PS_OUTPUT) Function None 9
               11:             Label
          13(r00):     12(ptr) Variable Function
-         32(r02):     12(ptr) Variable Function
-         45(r04):     12(ptr) Variable Function
-         58(r20):     12(ptr) Variable Function
-         75(r22):     12(ptr) Variable Function
-         89(r24):     12(ptr) Variable Function
-        103(r50):     12(ptr) Variable Function
-        120(r52):     12(ptr) Variable Function
-        135(r54):     12(ptr) Variable Function
-      151(psout):    150(ptr) Variable Function
+         31(r02):     12(ptr) Variable Function
+         43(r04):     12(ptr) Variable Function
+         55(r20):     12(ptr) Variable Function
+         71(r22):     12(ptr) Variable Function
+         84(r24):     12(ptr) Variable Function
+         97(r50):     12(ptr) Variable Function
+        113(r52):     12(ptr) Variable Function
+        127(r54):     12(ptr) Variable Function
+      142(psout):    141(ptr) Variable Function
               17:          14 Load 16(g_tTex1df4)
               21:          18 Load 20(g_sSamp)
-              24:          23 SampledImage 17 21
-              28:   27(fvec2) CompositeConstruct 25 26
-              30:    6(float) CompositeExtract 28 1
-              31:    6(float) ImageSampleDrefExplicitLod 24 28 30 Lod 29
-                              Store 13(r00) 31
-              37:          34 Load 36(g_tTex1di4)
-              38:          18 Load 20(g_sSamp)
-              41:          40 SampledImage 37 38
-              42:   27(fvec2) CompositeConstruct 25 26
-              43:    6(float) CompositeExtract 42 1
-              44:    6(float) ImageSampleDrefExplicitLod 41 42 43 Lod 29
-                              Store 32(r02) 44
-              50:          47 Load 49(g_tTex1du4)
-              51:          18 Load 20(g_sSamp)
-              54:          53 SampledImage 50 51
-              55:   27(fvec2) CompositeConstruct 25 26
-              56:    6(float) CompositeExtract 55 1
-              57:    6(float) ImageSampleDrefExplicitLod 54 55 56 Lod 29
-                              Store 45(r04) 57
-              62:          59 Load 61(g_tTex2df4)
-              63:          18 Load 20(g_sSamp)
-              66:          65 SampledImage 62 63
-              70:    6(float) CompositeExtract 68 0
-              71:    6(float) CompositeExtract 68 1
-              72:   69(fvec3) CompositeConstruct 70 71 26
-              73:    6(float) CompositeExtract 72 2
-              74:    6(float) ImageSampleDrefExplicitLod 66 72 73 Lod 29
-                              Store 58(r20) 74
-              79:          76 Load 78(g_tTex2di4)
-              80:          18 Load 20(g_sSamp)
-              83:          82 SampledImage 79 80
-              84:    6(float) CompositeExtract 68 0
-              85:    6(float) CompositeExtract 68 1
-              86:   69(fvec3) CompositeConstruct 84 85 26
-              87:    6(float) CompositeExtract 86 2
-              88:    6(float) ImageSampleDrefExplicitLod 83 86 87 Lod 29
-                              Store 75(r22) 88
-              93:          90 Load 92(g_tTex2du4)
-              94:          18 Load 20(g_sSamp)
-              97:          96 SampledImage 93 94
-              98:    6(float) CompositeExtract 68 0
-              99:    6(float) CompositeExtract 68 1
-             100:   69(fvec3) CompositeConstruct 98 99 26
-             101:    6(float) CompositeExtract 100 2
-             102:    6(float) ImageSampleDrefExplicitLod 97 100 101 Lod 29
-                              Store 89(r24) 102
-             107:         104 Load 106(g_tTexcdf4)
-             108:          18 Load 20(g_sSamp)
-             111:         110 SampledImage 107 108
-             114:    6(float) CompositeExtract 113 0
-             115:    6(float) CompositeExtract 113 1
-             116:    6(float) CompositeExtract 113 2
-             117:    7(fvec4) CompositeConstruct 114 115 116 26
-             118:    6(float) CompositeExtract 117 3
-             119:    6(float) ImageSampleDrefExplicitLod 111 117 118 Lod 29
-                              Store 103(r50) 119
-             124:         121 Load 123(g_tTexcdi4)
-             125:          18 Load 20(g_sSamp)
-             128:         127 SampledImage 124 125
-             129:    6(float) CompositeExtract 113 0
-             130:    6(float) CompositeExtract 113 1
-             131:    6(float) CompositeExtract 113 2
-             132:    7(fvec4) CompositeConstruct 129 130 131 26
-             133:    6(float) CompositeExtract 132 3
-             134:    6(float) ImageSampleDrefExplicitLod 128 132 133 Lod 29
-                              Store 120(r52) 134
-             139:         136 Load 138(g_tTexcdu4)
-             140:          18 Load 20(g_sSamp)
-             143:         142 SampledImage 139 140
-             144:    6(float) CompositeExtract 113 0
-             145:    6(float) CompositeExtract 113 1
-             146:    6(float) CompositeExtract 113 2
-             147:    7(fvec4) CompositeConstruct 144 145 146 26
-             148:    6(float) CompositeExtract 147 3
-             149:    6(float) ImageSampleDrefExplicitLod 143 147 148 Lod 29
-                              Store 135(r54) 149
-             156:    155(ptr) AccessChain 151(psout) 152
-                              Store 156 154
-             158:     12(ptr) AccessChain 151(psout) 157
-                              Store 158 153
-             159:8(PS_OUTPUT) Load 151(psout)
-                              ReturnValue 159
+              23:          22 SampledImage 17 21
+              27:   26(fvec2) CompositeConstruct 24 25
+              29:    6(float) CompositeExtract 27 1
+              30:    6(float) ImageSampleDrefExplicitLod 23 27 29 Lod 28
+                              Store 13(r00) 30
+              36:          33 Load 35(g_tTex1di4)
+              37:          18 Load 20(g_sSamp)
+              39:          38 SampledImage 36 37
+              40:   26(fvec2) CompositeConstruct 24 25
+              41:    6(float) CompositeExtract 40 1
+              42:    6(float) ImageSampleDrefExplicitLod 39 40 41 Lod 28
+                              Store 31(r02) 42
+              48:          45 Load 47(g_tTex1du4)
+              49:          18 Load 20(g_sSamp)
+              51:          50 SampledImage 48 49
+              52:   26(fvec2) CompositeConstruct 24 25
+              53:    6(float) CompositeExtract 52 1
+              54:    6(float) ImageSampleDrefExplicitLod 51 52 53 Lod 28
+                              Store 43(r04) 54
+              59:          56 Load 58(g_tTex2df4)
+              60:          18 Load 20(g_sSamp)
+              62:          61 SampledImage 59 60
+              66:    6(float) CompositeExtract 64 0
+              67:    6(float) CompositeExtract 64 1
+              68:   65(fvec3) CompositeConstruct 66 67 25
+              69:    6(float) CompositeExtract 68 2
+              70:    6(float) ImageSampleDrefExplicitLod 62 68 69 Lod 28
+                              Store 55(r20) 70
+              75:          72 Load 74(g_tTex2di4)
+              76:          18 Load 20(g_sSamp)
+              78:          77 SampledImage 75 76
+              79:    6(float) CompositeExtract 64 0
+              80:    6(float) CompositeExtract 64 1
+              81:   65(fvec3) CompositeConstruct 79 80 25
+              82:    6(float) CompositeExtract 81 2
+              83:    6(float) ImageSampleDrefExplicitLod 78 81 82 Lod 28
+                              Store 71(r22) 83
+              88:          85 Load 87(g_tTex2du4)
+              89:          18 Load 20(g_sSamp)
+              91:          90 SampledImage 88 89
+              92:    6(float) CompositeExtract 64 0
+              93:    6(float) CompositeExtract 64 1
+              94:   65(fvec3) CompositeConstruct 92 93 25
+              95:    6(float) CompositeExtract 94 2
+              96:    6(float) ImageSampleDrefExplicitLod 91 94 95 Lod 28
+                              Store 84(r24) 96
+             101:          98 Load 100(g_tTexcdf4)
+             102:          18 Load 20(g_sSamp)
+             104:         103 SampledImage 101 102
+             107:    6(float) CompositeExtract 106 0
+             108:    6(float) CompositeExtract 106 1
+             109:    6(float) CompositeExtract 106 2
+             110:    7(fvec4) CompositeConstruct 107 108 109 25
+             111:    6(float) CompositeExtract 110 3
+             112:    6(float) ImageSampleDrefExplicitLod 104 110 111 Lod 28
+                              Store 97(r50) 112
+             117:         114 Load 116(g_tTexcdi4)
+             118:          18 Load 20(g_sSamp)
+             120:         119 SampledImage 117 118
+             121:    6(float) CompositeExtract 106 0
+             122:    6(float) CompositeExtract 106 1
+             123:    6(float) CompositeExtract 106 2
+             124:    7(fvec4) CompositeConstruct 121 122 123 25
+             125:    6(float) CompositeExtract 124 3
+             126:    6(float) ImageSampleDrefExplicitLod 120 124 125 Lod 28
+                              Store 113(r52) 126
+             131:         128 Load 130(g_tTexcdu4)
+             132:          18 Load 20(g_sSamp)
+             134:         133 SampledImage 131 132
+             135:    6(float) CompositeExtract 106 0
+             136:    6(float) CompositeExtract 106 1
+             137:    6(float) CompositeExtract 106 2
+             138:    7(fvec4) CompositeConstruct 135 136 137 25
+             139:    6(float) CompositeExtract 138 3
+             140:    6(float) ImageSampleDrefExplicitLod 134 138 139 Lod 28
+                              Store 127(r54) 140
+             147:    146(ptr) AccessChain 142(psout) 143
+                              Store 147 145
+             149:     12(ptr) AccessChain 142(psout) 148
+                              Store 149 144
+             150:8(PS_OUTPUT) Load 142(psout)
+                              ReturnValue 150
                               FunctionEnd
diff --git a/Test/baseResults/hlsl.samplecmplevelzero.offset.dx10.frag.out b/Test/baseResults/hlsl.samplecmplevelzero.offset.dx10.frag.out
index 2e30e7c..08e8749 100644
--- a/Test/baseResults/hlsl.samplecmplevelzero.offset.dx10.frag.out
+++ b/Test/baseResults/hlsl.samplecmplevelzero.offset.dx10.frag.out
@@ -1,6 +1,7 @@
 hlsl.samplecmplevelzero.offset.dx10.frag
 Shader version: 500
 gl_FragCoord origin is upper left
+using depth_any
 0:? Sequence
 0:38  Function Definition: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:38    Function Parameters: 
@@ -10,7 +11,7 @@
 0:42          'r01' ( temp float)
 0:42          textureLodOffset ( temp float)
 0:42            Construct combined texture-sampler ( temp sampler1DShadow)
-0:42              'g_tTex1df4' (layout( binding=0) uniform texture1D)
+0:42              'g_tTex1df4' (layout( binding=0) uniform texture1DShadow)
 0:42              'g_sSamp' (layout( binding=0) uniform sampler)
 0:42            Construct vec2 ( temp 2-component vector of float)
 0:42              Constant:
@@ -26,7 +27,7 @@
 0:43          'r03' ( temp float)
 0:43          textureLodOffset ( temp float)
 0:43            Construct combined texture-sampler ( temp isampler1DShadow)
-0:43              'g_tTex1di4' ( uniform itexture1D)
+0:43              'g_tTex1di4' ( uniform itexture1DShadow)
 0:43              'g_sSamp' (layout( binding=0) uniform sampler)
 0:43            Construct vec2 ( temp 2-component vector of float)
 0:43              Constant:
@@ -42,7 +43,7 @@
 0:44          'r05' ( temp float)
 0:44          textureLodOffset ( temp float)
 0:44            Construct combined texture-sampler ( temp usampler1DShadow)
-0:44              'g_tTex1du4' ( uniform utexture1D)
+0:44              'g_tTex1du4' ( uniform utexture1DShadow)
 0:44              'g_sSamp' (layout( binding=0) uniform sampler)
 0:44            Construct vec2 ( temp 2-component vector of float)
 0:44              Constant:
@@ -58,7 +59,7 @@
 0:47          'r21' ( temp float)
 0:47          textureLodOffset ( temp float)
 0:47            Construct combined texture-sampler ( temp sampler2DShadow)
-0:47              'g_tTex2df4' ( uniform texture2D)
+0:47              'g_tTex2df4' ( uniform texture2DShadow)
 0:47              'g_sSamp' (layout( binding=0) uniform sampler)
 0:47            Construct vec3 ( temp 3-component vector of float)
 0:?               Constant:
@@ -76,7 +77,7 @@
 0:48          'r23' ( temp float)
 0:48          textureLodOffset ( temp float)
 0:48            Construct combined texture-sampler ( temp isampler2DShadow)
-0:48              'g_tTex2di4' ( uniform itexture2D)
+0:48              'g_tTex2di4' ( uniform itexture2DShadow)
 0:48              'g_sSamp' (layout( binding=0) uniform sampler)
 0:48            Construct vec3 ( temp 3-component vector of float)
 0:?               Constant:
@@ -94,7 +95,7 @@
 0:49          'r25' ( temp float)
 0:49          textureLodOffset ( temp float)
 0:49            Construct combined texture-sampler ( temp usampler2DShadow)
-0:49              'g_tTex2du4' ( uniform utexture2D)
+0:49              'g_tTex2du4' ( uniform utexture2DShadow)
 0:49              'g_sSamp' (layout( binding=0) uniform sampler)
 0:49            Construct vec3 ( temp 3-component vector of float)
 0:?               Constant:
@@ -134,25 +135,25 @@
 0:38          'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:38          Function Call: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:38        move second child to first child ( temp 4-component vector of float)
-0:?           'Color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 0:38          Color: direct index for structure ( temp 4-component vector of float)
 0:38            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:38            Constant:
 0:38              0 (const int)
 0:38        move second child to first child ( temp float)
-0:?           'Depth' ( out float FragDepth)
+0:?           '@entryPointOutput.Depth' ( out float FragDepth)
 0:38          Depth: direct index for structure ( temp float)
 0:38            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:38            Constant:
 0:38              1 (const int)
 0:?   Linker Objects
 0:?     'g_sSamp' (layout( binding=0) uniform sampler)
-0:?     'g_tTex1df4' (layout( binding=0) uniform texture1D)
-0:?     'g_tTex1di4' ( uniform itexture1D)
-0:?     'g_tTex1du4' ( uniform utexture1D)
-0:?     'g_tTex2df4' ( uniform texture2D)
-0:?     'g_tTex2di4' ( uniform itexture2D)
-0:?     'g_tTex2du4' ( uniform utexture2D)
+0:?     'g_tTex1df4' (layout( binding=0) uniform texture1DShadow)
+0:?     'g_tTex1di4' ( uniform itexture1DShadow)
+0:?     'g_tTex1du4' ( uniform utexture1DShadow)
+0:?     'g_tTex2df4' ( uniform texture2DShadow)
+0:?     'g_tTex2di4' ( uniform itexture2DShadow)
+0:?     'g_tTex2du4' ( uniform utexture2DShadow)
 0:?     'g_tTex3df4' ( uniform texture3D)
 0:?     'g_tTex3di4' ( uniform itexture3D)
 0:?     'g_tTex3du4' ( uniform utexture3D)
@@ -168,8 +169,8 @@
 0:?     'g_tTexcdf4a' ( uniform textureCubeArray)
 0:?     'g_tTexcdi4a' ( uniform itextureCubeArray)
 0:?     'g_tTexcdu4a' ( uniform utextureCubeArray)
-0:?     'Color' (layout( location=0) out 4-component vector of float)
-0:?     'Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 
 Linked fragment stage:
@@ -177,6 +178,7 @@
 
 Shader version: 500
 gl_FragCoord origin is upper left
+using depth_any
 0:? Sequence
 0:38  Function Definition: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:38    Function Parameters: 
@@ -186,7 +188,7 @@
 0:42          'r01' ( temp float)
 0:42          textureLodOffset ( temp float)
 0:42            Construct combined texture-sampler ( temp sampler1DShadow)
-0:42              'g_tTex1df4' (layout( binding=0) uniform texture1D)
+0:42              'g_tTex1df4' (layout( binding=0) uniform texture1DShadow)
 0:42              'g_sSamp' (layout( binding=0) uniform sampler)
 0:42            Construct vec2 ( temp 2-component vector of float)
 0:42              Constant:
@@ -202,7 +204,7 @@
 0:43          'r03' ( temp float)
 0:43          textureLodOffset ( temp float)
 0:43            Construct combined texture-sampler ( temp isampler1DShadow)
-0:43              'g_tTex1di4' ( uniform itexture1D)
+0:43              'g_tTex1di4' ( uniform itexture1DShadow)
 0:43              'g_sSamp' (layout( binding=0) uniform sampler)
 0:43            Construct vec2 ( temp 2-component vector of float)
 0:43              Constant:
@@ -218,7 +220,7 @@
 0:44          'r05' ( temp float)
 0:44          textureLodOffset ( temp float)
 0:44            Construct combined texture-sampler ( temp usampler1DShadow)
-0:44              'g_tTex1du4' ( uniform utexture1D)
+0:44              'g_tTex1du4' ( uniform utexture1DShadow)
 0:44              'g_sSamp' (layout( binding=0) uniform sampler)
 0:44            Construct vec2 ( temp 2-component vector of float)
 0:44              Constant:
@@ -234,7 +236,7 @@
 0:47          'r21' ( temp float)
 0:47          textureLodOffset ( temp float)
 0:47            Construct combined texture-sampler ( temp sampler2DShadow)
-0:47              'g_tTex2df4' ( uniform texture2D)
+0:47              'g_tTex2df4' ( uniform texture2DShadow)
 0:47              'g_sSamp' (layout( binding=0) uniform sampler)
 0:47            Construct vec3 ( temp 3-component vector of float)
 0:?               Constant:
@@ -252,7 +254,7 @@
 0:48          'r23' ( temp float)
 0:48          textureLodOffset ( temp float)
 0:48            Construct combined texture-sampler ( temp isampler2DShadow)
-0:48              'g_tTex2di4' ( uniform itexture2D)
+0:48              'g_tTex2di4' ( uniform itexture2DShadow)
 0:48              'g_sSamp' (layout( binding=0) uniform sampler)
 0:48            Construct vec3 ( temp 3-component vector of float)
 0:?               Constant:
@@ -270,7 +272,7 @@
 0:49          'r25' ( temp float)
 0:49          textureLodOffset ( temp float)
 0:49            Construct combined texture-sampler ( temp usampler2DShadow)
-0:49              'g_tTex2du4' ( uniform utexture2D)
+0:49              'g_tTex2du4' ( uniform utexture2DShadow)
 0:49              'g_sSamp' (layout( binding=0) uniform sampler)
 0:49            Construct vec3 ( temp 3-component vector of float)
 0:?               Constant:
@@ -310,25 +312,25 @@
 0:38          'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:38          Function Call: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:38        move second child to first child ( temp 4-component vector of float)
-0:?           'Color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 0:38          Color: direct index for structure ( temp 4-component vector of float)
 0:38            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:38            Constant:
 0:38              0 (const int)
 0:38        move second child to first child ( temp float)
-0:?           'Depth' ( out float FragDepth)
+0:?           '@entryPointOutput.Depth' ( out float FragDepth)
 0:38          Depth: direct index for structure ( temp float)
 0:38            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:38            Constant:
 0:38              1 (const int)
 0:?   Linker Objects
 0:?     'g_sSamp' (layout( binding=0) uniform sampler)
-0:?     'g_tTex1df4' (layout( binding=0) uniform texture1D)
-0:?     'g_tTex1di4' ( uniform itexture1D)
-0:?     'g_tTex1du4' ( uniform utexture1D)
-0:?     'g_tTex2df4' ( uniform texture2D)
-0:?     'g_tTex2di4' ( uniform itexture2D)
-0:?     'g_tTex2du4' ( uniform utexture2D)
+0:?     'g_tTex1df4' (layout( binding=0) uniform texture1DShadow)
+0:?     'g_tTex1di4' ( uniform itexture1DShadow)
+0:?     'g_tTex1du4' ( uniform utexture1DShadow)
+0:?     'g_tTex2df4' ( uniform texture2DShadow)
+0:?     'g_tTex2di4' ( uniform itexture2DShadow)
+0:?     'g_tTex2du4' ( uniform utexture2DShadow)
 0:?     'g_tTex3df4' ( uniform texture3D)
 0:?     'g_tTex3di4' ( uniform itexture3D)
 0:?     'g_tTex3du4' ( uniform utexture3D)
@@ -344,20 +346,25 @@
 0:?     'g_tTexcdf4a' ( uniform textureCubeArray)
 0:?     'g_tTexcdi4a' ( uniform itextureCubeArray)
 0:?     'g_tTexcdu4a' ( uniform utextureCubeArray)
-0:?     'Color' (layout( location=0) out 4-component vector of float)
-0:?     'Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
+
+error: SPIRV-Tools Validation Errors
+error: Expected Image 'Sampled Type' to be the same as Result Type
+  %43 = OpImageSampleDrefExplicitLod %float %40 %41 %42 Lod|ConstOffset %float_0 %int_2
 
 // Module Version 10000
-// Generated by (magic number): 80001
-// Id's are bound by 174
+// Generated by (magic number): 80007
+// Id's are bound by 168
 
                               Capability Shader
                               Capability Sampled1D
                               Capability SampledCubeArray
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "main" 122 126
+                              EntryPoint Fragment 4  "main" 116 120
                               ExecutionMode 4 OriginUpperLeft
+                              ExecutionMode 4 DepthReplacing
                               Source HLSL 500
                               Name 4  "main"
                               Name 8  "PS_OUTPUT"
@@ -367,61 +374,61 @@
                               Name 13  "r01"
                               Name 16  "g_tTex1df4"
                               Name 20  "g_sSamp"
-                              Name 34  "r03"
-                              Name 37  "g_tTex1di4"
-                              Name 46  "r05"
-                              Name 50  "g_tTex1du4"
-                              Name 59  "r21"
-                              Name 62  "g_tTex2df4"
-                              Name 79  "r23"
-                              Name 82  "g_tTex2di4"
-                              Name 93  "r25"
-                              Name 96  "g_tTex2du4"
-                              Name 108  "psout"
-                              Name 119  "flattenTemp"
-                              Name 122  "Color"
-                              Name 126  "Depth"
-                              Name 131  "g_tTex3df4"
-                              Name 134  "g_tTex3di4"
-                              Name 137  "g_tTex3du4"
-                              Name 140  "g_tTexcdf4"
-                              Name 143  "g_tTexcdi4"
-                              Name 146  "g_tTexcdu4"
-                              Name 149  "g_tTex1df4a"
-                              Name 152  "g_tTex1di4a"
-                              Name 155  "g_tTex1du4a"
-                              Name 158  "g_tTex2df4a"
-                              Name 161  "g_tTex2di4a"
-                              Name 164  "g_tTex2du4a"
-                              Name 167  "g_tTexcdf4a"
-                              Name 170  "g_tTexcdi4a"
-                              Name 173  "g_tTexcdu4a"
+                              Name 33  "r03"
+                              Name 36  "g_tTex1di4"
+                              Name 44  "r05"
+                              Name 48  "g_tTex1du4"
+                              Name 56  "r21"
+                              Name 59  "g_tTex2df4"
+                              Name 75  "r23"
+                              Name 78  "g_tTex2di4"
+                              Name 88  "r25"
+                              Name 91  "g_tTex2du4"
+                              Name 102  "psout"
+                              Name 113  "flattenTemp"
+                              Name 116  "@entryPointOutput.Color"
+                              Name 120  "@entryPointOutput.Depth"
+                              Name 125  "g_tTex3df4"
+                              Name 128  "g_tTex3di4"
+                              Name 131  "g_tTex3du4"
+                              Name 134  "g_tTexcdf4"
+                              Name 137  "g_tTexcdi4"
+                              Name 140  "g_tTexcdu4"
+                              Name 143  "g_tTex1df4a"
+                              Name 146  "g_tTex1di4a"
+                              Name 149  "g_tTex1du4a"
+                              Name 152  "g_tTex2df4a"
+                              Name 155  "g_tTex2di4a"
+                              Name 158  "g_tTex2du4a"
+                              Name 161  "g_tTexcdf4a"
+                              Name 164  "g_tTexcdi4a"
+                              Name 167  "g_tTexcdu4a"
                               Decorate 16(g_tTex1df4) DescriptorSet 0
                               Decorate 16(g_tTex1df4) Binding 0
                               Decorate 20(g_sSamp) DescriptorSet 0
                               Decorate 20(g_sSamp) Binding 0
-                              Decorate 37(g_tTex1di4) DescriptorSet 0
-                              Decorate 50(g_tTex1du4) DescriptorSet 0
-                              Decorate 62(g_tTex2df4) DescriptorSet 0
-                              Decorate 82(g_tTex2di4) DescriptorSet 0
-                              Decorate 96(g_tTex2du4) DescriptorSet 0
-                              Decorate 122(Color) Location 0
-                              Decorate 126(Depth) BuiltIn FragDepth
-                              Decorate 131(g_tTex3df4) DescriptorSet 0
-                              Decorate 134(g_tTex3di4) DescriptorSet 0
-                              Decorate 137(g_tTex3du4) DescriptorSet 0
-                              Decorate 140(g_tTexcdf4) DescriptorSet 0
-                              Decorate 143(g_tTexcdi4) DescriptorSet 0
-                              Decorate 146(g_tTexcdu4) DescriptorSet 0
-                              Decorate 149(g_tTex1df4a) DescriptorSet 0
-                              Decorate 152(g_tTex1di4a) DescriptorSet 0
-                              Decorate 155(g_tTex1du4a) DescriptorSet 0
-                              Decorate 158(g_tTex2df4a) DescriptorSet 0
-                              Decorate 161(g_tTex2di4a) DescriptorSet 0
-                              Decorate 164(g_tTex2du4a) DescriptorSet 0
-                              Decorate 167(g_tTexcdf4a) DescriptorSet 0
-                              Decorate 170(g_tTexcdi4a) DescriptorSet 0
-                              Decorate 173(g_tTexcdu4a) DescriptorSet 0
+                              Decorate 36(g_tTex1di4) DescriptorSet 0
+                              Decorate 48(g_tTex1du4) DescriptorSet 0
+                              Decorate 59(g_tTex2df4) DescriptorSet 0
+                              Decorate 78(g_tTex2di4) DescriptorSet 0
+                              Decorate 91(g_tTex2du4) DescriptorSet 0
+                              Decorate 116(@entryPointOutput.Color) Location 0
+                              Decorate 120(@entryPointOutput.Depth) BuiltIn FragDepth
+                              Decorate 125(g_tTex3df4) DescriptorSet 0
+                              Decorate 128(g_tTex3di4) DescriptorSet 0
+                              Decorate 131(g_tTex3du4) DescriptorSet 0
+                              Decorate 134(g_tTexcdf4) DescriptorSet 0
+                              Decorate 137(g_tTexcdi4) DescriptorSet 0
+                              Decorate 140(g_tTexcdu4) DescriptorSet 0
+                              Decorate 143(g_tTex1df4a) DescriptorSet 0
+                              Decorate 146(g_tTex1di4a) DescriptorSet 0
+                              Decorate 149(g_tTex1du4a) DescriptorSet 0
+                              Decorate 152(g_tTex2df4a) DescriptorSet 0
+                              Decorate 155(g_tTex2di4a) DescriptorSet 0
+                              Decorate 158(g_tTex2du4a) DescriptorSet 0
+                              Decorate 161(g_tTexcdf4a) DescriptorSet 0
+                              Decorate 164(g_tTexcdi4a) DescriptorSet 0
+                              Decorate 167(g_tTexcdu4a) DescriptorSet 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -429,181 +436,175 @@
     8(PS_OUTPUT):             TypeStruct 7(fvec4) 6(float)
                9:             TypeFunction 8(PS_OUTPUT)
               12:             TypePointer Function 6(float)
-              14:             TypeImage 6(float) 1D sampled format:Unknown
+              14:             TypeImage 6(float) 1D depth sampled format:Unknown
               15:             TypePointer UniformConstant 14
   16(g_tTex1df4):     15(ptr) Variable UniformConstant
               18:             TypeSampler
               19:             TypePointer UniformConstant 18
      20(g_sSamp):     19(ptr) Variable UniformConstant
-              22:             TypeImage 6(float) 1D depth sampled format:Unknown
-              23:             TypeSampledImage 22
-              25:    6(float) Constant 1036831949
-              26:    6(float) Constant 1061158912
-              27:             TypeVector 6(float) 2
-              29:    6(float) Constant 0
-              30:             TypeInt 32 1
-              31:     30(int) Constant 2
-              35:             TypeImage 30(int) 1D sampled format:Unknown
-              36:             TypePointer UniformConstant 35
-  37(g_tTex1di4):     36(ptr) Variable UniformConstant
-              40:             TypeImage 30(int) 1D depth sampled format:Unknown
-              41:             TypeSampledImage 40
-              47:             TypeInt 32 0
-              48:             TypeImage 47(int) 1D sampled format:Unknown
-              49:             TypePointer UniformConstant 48
-  50(g_tTex1du4):     49(ptr) Variable UniformConstant
-              53:             TypeImage 47(int) 1D depth sampled format:Unknown
-              54:             TypeSampledImage 53
-              60:             TypeImage 6(float) 2D sampled format:Unknown
-              61:             TypePointer UniformConstant 60
-  62(g_tTex2df4):     61(ptr) Variable UniformConstant
-              65:             TypeImage 6(float) 2D depth sampled format:Unknown
-              66:             TypeSampledImage 65
-              68:    6(float) Constant 1045220557
-              69:   27(fvec2) ConstantComposite 25 68
-              70:             TypeVector 6(float) 3
-              74:             TypeVector 30(int) 2
-              75:     30(int) Constant 3
-              76:   74(ivec2) ConstantComposite 31 75
-              80:             TypeImage 30(int) 2D sampled format:Unknown
-              81:             TypePointer UniformConstant 80
-  82(g_tTex2di4):     81(ptr) Variable UniformConstant
-              85:             TypeImage 30(int) 2D depth sampled format:Unknown
-              86:             TypeSampledImage 85
-              94:             TypeImage 47(int) 2D sampled format:Unknown
-              95:             TypePointer UniformConstant 94
-  96(g_tTex2du4):     95(ptr) Variable UniformConstant
-              99:             TypeImage 47(int) 2D depth sampled format:Unknown
-             100:             TypeSampledImage 99
-             107:             TypePointer Function 8(PS_OUTPUT)
-             109:     30(int) Constant 0
-             110:    6(float) Constant 1065353216
-             111:    7(fvec4) ConstantComposite 110 110 110 110
-             112:             TypePointer Function 7(fvec4)
-             114:     30(int) Constant 1
-             121:             TypePointer Output 7(fvec4)
-      122(Color):    121(ptr) Variable Output
-             125:             TypePointer Output 6(float)
-      126(Depth):    125(ptr) Variable Output
-             129:             TypeImage 6(float) 3D sampled format:Unknown
+              22:             TypeSampledImage 14
+              24:    6(float) Constant 1036831949
+              25:    6(float) Constant 1061158912
+              26:             TypeVector 6(float) 2
+              28:    6(float) Constant 0
+              29:             TypeInt 32 1
+              30:     29(int) Constant 2
+              34:             TypeImage 29(int) 1D depth sampled format:Unknown
+              35:             TypePointer UniformConstant 34
+  36(g_tTex1di4):     35(ptr) Variable UniformConstant
+              39:             TypeSampledImage 34
+              45:             TypeInt 32 0
+              46:             TypeImage 45(int) 1D depth sampled format:Unknown
+              47:             TypePointer UniformConstant 46
+  48(g_tTex1du4):     47(ptr) Variable UniformConstant
+              51:             TypeSampledImage 46
+              57:             TypeImage 6(float) 2D depth sampled format:Unknown
+              58:             TypePointer UniformConstant 57
+  59(g_tTex2df4):     58(ptr) Variable UniformConstant
+              62:             TypeSampledImage 57
+              64:    6(float) Constant 1045220557
+              65:   26(fvec2) ConstantComposite 24 64
+              66:             TypeVector 6(float) 3
+              70:             TypeVector 29(int) 2
+              71:     29(int) Constant 3
+              72:   70(ivec2) ConstantComposite 30 71
+              76:             TypeImage 29(int) 2D depth sampled format:Unknown
+              77:             TypePointer UniformConstant 76
+  78(g_tTex2di4):     77(ptr) Variable UniformConstant
+              81:             TypeSampledImage 76
+              89:             TypeImage 45(int) 2D depth sampled format:Unknown
+              90:             TypePointer UniformConstant 89
+  91(g_tTex2du4):     90(ptr) Variable UniformConstant
+              94:             TypeSampledImage 89
+             101:             TypePointer Function 8(PS_OUTPUT)
+             103:     29(int) Constant 0
+             104:    6(float) Constant 1065353216
+             105:    7(fvec4) ConstantComposite 104 104 104 104
+             106:             TypePointer Function 7(fvec4)
+             108:     29(int) Constant 1
+             115:             TypePointer Output 7(fvec4)
+116(@entryPointOutput.Color):    115(ptr) Variable Output
+             119:             TypePointer Output 6(float)
+120(@entryPointOutput.Depth):    119(ptr) Variable Output
+             123:             TypeImage 6(float) 3D sampled format:Unknown
+             124:             TypePointer UniformConstant 123
+ 125(g_tTex3df4):    124(ptr) Variable UniformConstant
+             126:             TypeImage 29(int) 3D sampled format:Unknown
+             127:             TypePointer UniformConstant 126
+ 128(g_tTex3di4):    127(ptr) Variable UniformConstant
+             129:             TypeImage 45(int) 3D sampled format:Unknown
              130:             TypePointer UniformConstant 129
- 131(g_tTex3df4):    130(ptr) Variable UniformConstant
-             132:             TypeImage 30(int) 3D sampled format:Unknown
+ 131(g_tTex3du4):    130(ptr) Variable UniformConstant
+             132:             TypeImage 6(float) Cube sampled format:Unknown
              133:             TypePointer UniformConstant 132
- 134(g_tTex3di4):    133(ptr) Variable UniformConstant
-             135:             TypeImage 47(int) 3D sampled format:Unknown
+ 134(g_tTexcdf4):    133(ptr) Variable UniformConstant
+             135:             TypeImage 29(int) Cube sampled format:Unknown
              136:             TypePointer UniformConstant 135
- 137(g_tTex3du4):    136(ptr) Variable UniformConstant
-             138:             TypeImage 6(float) Cube sampled format:Unknown
+ 137(g_tTexcdi4):    136(ptr) Variable UniformConstant
+             138:             TypeImage 45(int) Cube sampled format:Unknown
              139:             TypePointer UniformConstant 138
- 140(g_tTexcdf4):    139(ptr) Variable UniformConstant
-             141:             TypeImage 30(int) Cube sampled format:Unknown
+ 140(g_tTexcdu4):    139(ptr) Variable UniformConstant
+             141:             TypeImage 6(float) 1D array sampled format:Unknown
              142:             TypePointer UniformConstant 141
- 143(g_tTexcdi4):    142(ptr) Variable UniformConstant
-             144:             TypeImage 47(int) Cube sampled format:Unknown
+143(g_tTex1df4a):    142(ptr) Variable UniformConstant
+             144:             TypeImage 29(int) 1D array sampled format:Unknown
              145:             TypePointer UniformConstant 144
- 146(g_tTexcdu4):    145(ptr) Variable UniformConstant
-             147:             TypeImage 6(float) 1D array sampled format:Unknown
+146(g_tTex1di4a):    145(ptr) Variable UniformConstant
+             147:             TypeImage 45(int) 1D array sampled format:Unknown
              148:             TypePointer UniformConstant 147
-149(g_tTex1df4a):    148(ptr) Variable UniformConstant
-             150:             TypeImage 30(int) 1D array sampled format:Unknown
+149(g_tTex1du4a):    148(ptr) Variable UniformConstant
+             150:             TypeImage 6(float) 2D array sampled format:Unknown
              151:             TypePointer UniformConstant 150
-152(g_tTex1di4a):    151(ptr) Variable UniformConstant
-             153:             TypeImage 47(int) 1D array sampled format:Unknown
+152(g_tTex2df4a):    151(ptr) Variable UniformConstant
+             153:             TypeImage 29(int) 2D array sampled format:Unknown
              154:             TypePointer UniformConstant 153
-155(g_tTex1du4a):    154(ptr) Variable UniformConstant
-             156:             TypeImage 6(float) 2D array sampled format:Unknown
+155(g_tTex2di4a):    154(ptr) Variable UniformConstant
+             156:             TypeImage 45(int) 2D array sampled format:Unknown
              157:             TypePointer UniformConstant 156
-158(g_tTex2df4a):    157(ptr) Variable UniformConstant
-             159:             TypeImage 30(int) 2D array sampled format:Unknown
+158(g_tTex2du4a):    157(ptr) Variable UniformConstant
+             159:             TypeImage 6(float) Cube array sampled format:Unknown
              160:             TypePointer UniformConstant 159
-161(g_tTex2di4a):    160(ptr) Variable UniformConstant
-             162:             TypeImage 47(int) 2D array sampled format:Unknown
+161(g_tTexcdf4a):    160(ptr) Variable UniformConstant
+             162:             TypeImage 29(int) Cube array sampled format:Unknown
              163:             TypePointer UniformConstant 162
-164(g_tTex2du4a):    163(ptr) Variable UniformConstant
-             165:             TypeImage 6(float) Cube array sampled format:Unknown
+164(g_tTexcdi4a):    163(ptr) Variable UniformConstant
+             165:             TypeImage 45(int) Cube array sampled format:Unknown
              166:             TypePointer UniformConstant 165
-167(g_tTexcdf4a):    166(ptr) Variable UniformConstant
-             168:             TypeImage 30(int) Cube array sampled format:Unknown
-             169:             TypePointer UniformConstant 168
-170(g_tTexcdi4a):    169(ptr) Variable UniformConstant
-             171:             TypeImage 47(int) Cube array sampled format:Unknown
-             172:             TypePointer UniformConstant 171
-173(g_tTexcdu4a):    172(ptr) Variable UniformConstant
+167(g_tTexcdu4a):    166(ptr) Variable UniformConstant
          4(main):           2 Function None 3
                5:             Label
-119(flattenTemp):    107(ptr) Variable Function
-             120:8(PS_OUTPUT) FunctionCall 10(@main()
-                              Store 119(flattenTemp) 120
-             123:    112(ptr) AccessChain 119(flattenTemp) 109
-             124:    7(fvec4) Load 123
-                              Store 122(Color) 124
-             127:     12(ptr) AccessChain 119(flattenTemp) 114
-             128:    6(float) Load 127
-                              Store 126(Depth) 128
+113(flattenTemp):    101(ptr) Variable Function
+             114:8(PS_OUTPUT) FunctionCall 10(@main()
+                              Store 113(flattenTemp) 114
+             117:    106(ptr) AccessChain 113(flattenTemp) 103
+             118:    7(fvec4) Load 117
+                              Store 116(@entryPointOutput.Color) 118
+             121:     12(ptr) AccessChain 113(flattenTemp) 108
+             122:    6(float) Load 121
+                              Store 120(@entryPointOutput.Depth) 122
                               Return
                               FunctionEnd
       10(@main():8(PS_OUTPUT) Function None 9
               11:             Label
          13(r01):     12(ptr) Variable Function
-         34(r03):     12(ptr) Variable Function
-         46(r05):     12(ptr) Variable Function
-         59(r21):     12(ptr) Variable Function
-         79(r23):     12(ptr) Variable Function
-         93(r25):     12(ptr) Variable Function
-      108(psout):    107(ptr) Variable Function
+         33(r03):     12(ptr) Variable Function
+         44(r05):     12(ptr) Variable Function
+         56(r21):     12(ptr) Variable Function
+         75(r23):     12(ptr) Variable Function
+         88(r25):     12(ptr) Variable Function
+      102(psout):    101(ptr) Variable Function
               17:          14 Load 16(g_tTex1df4)
               21:          18 Load 20(g_sSamp)
-              24:          23 SampledImage 17 21
-              28:   27(fvec2) CompositeConstruct 25 26
-              32:    6(float) CompositeExtract 28 1
-              33:    6(float) ImageSampleDrefExplicitLod 24 28 32 Lod ConstOffset 29 31
-                              Store 13(r01) 33
-              38:          35 Load 37(g_tTex1di4)
-              39:          18 Load 20(g_sSamp)
-              42:          41 SampledImage 38 39
-              43:   27(fvec2) CompositeConstruct 25 26
-              44:    6(float) CompositeExtract 43 1
-              45:    6(float) ImageSampleDrefExplicitLod 42 43 44 Lod ConstOffset 29 31
-                              Store 34(r03) 45
-              51:          48 Load 50(g_tTex1du4)
-              52:          18 Load 20(g_sSamp)
-              55:          54 SampledImage 51 52
-              56:   27(fvec2) CompositeConstruct 25 26
-              57:    6(float) CompositeExtract 56 1
-              58:    6(float) ImageSampleDrefExplicitLod 55 56 57 Lod ConstOffset 29 31
-                              Store 46(r05) 58
-              63:          60 Load 62(g_tTex2df4)
-              64:          18 Load 20(g_sSamp)
-              67:          66 SampledImage 63 64
-              71:    6(float) CompositeExtract 69 0
-              72:    6(float) CompositeExtract 69 1
-              73:   70(fvec3) CompositeConstruct 71 72 26
-              77:    6(float) CompositeExtract 73 2
-              78:    6(float) ImageSampleDrefExplicitLod 67 73 77 Lod ConstOffset 29 76
-                              Store 59(r21) 78
-              83:          80 Load 82(g_tTex2di4)
-              84:          18 Load 20(g_sSamp)
-              87:          86 SampledImage 83 84
-              88:    6(float) CompositeExtract 69 0
-              89:    6(float) CompositeExtract 69 1
-              90:   70(fvec3) CompositeConstruct 88 89 26
-              91:    6(float) CompositeExtract 90 2
-              92:    6(float) ImageSampleDrefExplicitLod 87 90 91 Lod ConstOffset 29 76
-                              Store 79(r23) 92
-              97:          94 Load 96(g_tTex2du4)
-              98:          18 Load 20(g_sSamp)
-             101:         100 SampledImage 97 98
-             102:    6(float) CompositeExtract 69 0
-             103:    6(float) CompositeExtract 69 1
-             104:   70(fvec3) CompositeConstruct 102 103 26
-             105:    6(float) CompositeExtract 104 2
-             106:    6(float) ImageSampleDrefExplicitLod 101 104 105 Lod ConstOffset 29 76
-                              Store 93(r25) 106
-             113:    112(ptr) AccessChain 108(psout) 109
-                              Store 113 111
-             115:     12(ptr) AccessChain 108(psout) 114
-                              Store 115 110
-             116:8(PS_OUTPUT) Load 108(psout)
-                              ReturnValue 116
+              23:          22 SampledImage 17 21
+              27:   26(fvec2) CompositeConstruct 24 25
+              31:    6(float) CompositeExtract 27 1
+              32:    6(float) ImageSampleDrefExplicitLod 23 27 31 Lod ConstOffset 28 30
+                              Store 13(r01) 32
+              37:          34 Load 36(g_tTex1di4)
+              38:          18 Load 20(g_sSamp)
+              40:          39 SampledImage 37 38
+              41:   26(fvec2) CompositeConstruct 24 25
+              42:    6(float) CompositeExtract 41 1
+              43:    6(float) ImageSampleDrefExplicitLod 40 41 42 Lod ConstOffset 28 30
+                              Store 33(r03) 43
+              49:          46 Load 48(g_tTex1du4)
+              50:          18 Load 20(g_sSamp)
+              52:          51 SampledImage 49 50
+              53:   26(fvec2) CompositeConstruct 24 25
+              54:    6(float) CompositeExtract 53 1
+              55:    6(float) ImageSampleDrefExplicitLod 52 53 54 Lod ConstOffset 28 30
+                              Store 44(r05) 55
+              60:          57 Load 59(g_tTex2df4)
+              61:          18 Load 20(g_sSamp)
+              63:          62 SampledImage 60 61
+              67:    6(float) CompositeExtract 65 0
+              68:    6(float) CompositeExtract 65 1
+              69:   66(fvec3) CompositeConstruct 67 68 25
+              73:    6(float) CompositeExtract 69 2
+              74:    6(float) ImageSampleDrefExplicitLod 63 69 73 Lod ConstOffset 28 72
+                              Store 56(r21) 74
+              79:          76 Load 78(g_tTex2di4)
+              80:          18 Load 20(g_sSamp)
+              82:          81 SampledImage 79 80
+              83:    6(float) CompositeExtract 65 0
+              84:    6(float) CompositeExtract 65 1
+              85:   66(fvec3) CompositeConstruct 83 84 25
+              86:    6(float) CompositeExtract 85 2
+              87:    6(float) ImageSampleDrefExplicitLod 82 85 86 Lod ConstOffset 28 72
+                              Store 75(r23) 87
+              92:          89 Load 91(g_tTex2du4)
+              93:          18 Load 20(g_sSamp)
+              95:          94 SampledImage 92 93
+              96:    6(float) CompositeExtract 65 0
+              97:    6(float) CompositeExtract 65 1
+              98:   66(fvec3) CompositeConstruct 96 97 25
+              99:    6(float) CompositeExtract 98 2
+             100:    6(float) ImageSampleDrefExplicitLod 95 98 99 Lod ConstOffset 28 72
+                              Store 88(r25) 100
+             107:    106(ptr) AccessChain 102(psout) 103
+                              Store 107 105
+             109:     12(ptr) AccessChain 102(psout) 108
+                              Store 109 104
+             110:8(PS_OUTPUT) Load 102(psout)
+                              ReturnValue 110
                               FunctionEnd
diff --git a/Test/baseResults/hlsl.samplecmplevelzero.offsetarray.dx10.frag.out b/Test/baseResults/hlsl.samplecmplevelzero.offsetarray.dx10.frag.out
index eda17f2..b5c0fc0 100644
--- a/Test/baseResults/hlsl.samplecmplevelzero.offsetarray.dx10.frag.out
+++ b/Test/baseResults/hlsl.samplecmplevelzero.offsetarray.dx10.frag.out
@@ -1,6 +1,7 @@
 hlsl.samplecmplevelzero.offsetarray.dx10.frag
 Shader version: 500
 gl_FragCoord origin is upper left
+using depth_any
 0:? Sequence
 0:38  Function Definition: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:38    Function Parameters: 
@@ -10,7 +11,7 @@
 0:42          'r11' ( temp float)
 0:42          textureLodOffset ( temp float)
 0:42            Construct combined texture-sampler ( temp sampler1DArrayShadow)
-0:42              'g_tTex1df4a' ( uniform texture1DArray)
+0:42              'g_tTex1df4a' ( uniform texture1DArrayShadow)
 0:42              'g_sSamp' (layout( binding=0) uniform sampler)
 0:42            Construct vec3 ( temp 3-component vector of float)
 0:?               Constant:
@@ -27,7 +28,7 @@
 0:43          'r13' ( temp float)
 0:43          textureLodOffset ( temp float)
 0:43            Construct combined texture-sampler ( temp isampler1DArrayShadow)
-0:43              'g_tTex1di4a' ( uniform itexture1DArray)
+0:43              'g_tTex1di4a' ( uniform itexture1DArrayShadow)
 0:43              'g_sSamp' (layout( binding=0) uniform sampler)
 0:43            Construct vec3 ( temp 3-component vector of float)
 0:?               Constant:
@@ -44,7 +45,7 @@
 0:44          'r15' ( temp float)
 0:44          textureLodOffset ( temp float)
 0:44            Construct combined texture-sampler ( temp usampler1DArrayShadow)
-0:44              'g_tTex1du4a' ( uniform utexture1DArray)
+0:44              'g_tTex1du4a' ( uniform utexture1DArrayShadow)
 0:44              'g_sSamp' (layout( binding=0) uniform sampler)
 0:44            Construct vec3 ( temp 3-component vector of float)
 0:?               Constant:
@@ -61,7 +62,7 @@
 0:47          'r31' ( temp float)
 0:47          textureLodOffset ( temp float)
 0:47            Construct combined texture-sampler ( temp sampler2DArrayShadow)
-0:47              'g_tTex2df4a' ( uniform texture2DArray)
+0:47              'g_tTex2df4a' ( uniform texture2DArrayShadow)
 0:47              'g_sSamp' (layout( binding=0) uniform sampler)
 0:47            Construct vec4 ( temp 4-component vector of float)
 0:?               Constant:
@@ -80,7 +81,7 @@
 0:48          'r33' ( temp float)
 0:48          textureLodOffset ( temp float)
 0:48            Construct combined texture-sampler ( temp isampler2DArrayShadow)
-0:48              'g_tTex2di4a' ( uniform itexture2DArray)
+0:48              'g_tTex2di4a' ( uniform itexture2DArrayShadow)
 0:48              'g_sSamp' (layout( binding=0) uniform sampler)
 0:48            Construct vec4 ( temp 4-component vector of float)
 0:?               Constant:
@@ -99,7 +100,7 @@
 0:49          'r35' ( temp float)
 0:49          textureLodOffset ( temp float)
 0:49            Construct combined texture-sampler ( temp usampler2DArrayShadow)
-0:49              'g_tTex2du4a' ( uniform utexture2DArray)
+0:49              'g_tTex2du4a' ( uniform utexture2DArrayShadow)
 0:49              'g_sSamp' (layout( binding=0) uniform sampler)
 0:49            Construct vec4 ( temp 4-component vector of float)
 0:?               Constant:
@@ -140,13 +141,13 @@
 0:38          'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:38          Function Call: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:38        move second child to first child ( temp 4-component vector of float)
-0:?           'Color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 0:38          Color: direct index for structure ( temp 4-component vector of float)
 0:38            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:38            Constant:
 0:38              0 (const int)
 0:38        move second child to first child ( temp float)
-0:?           'Depth' ( out float FragDepth)
+0:?           '@entryPointOutput.Depth' ( out float FragDepth)
 0:38          Depth: direct index for structure ( temp float)
 0:38            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:38            Constant:
@@ -165,17 +166,17 @@
 0:?     'g_tTexcdf4' ( uniform textureCube)
 0:?     'g_tTexcdi4' ( uniform itextureCube)
 0:?     'g_tTexcdu4' ( uniform utextureCube)
-0:?     'g_tTex1df4a' ( uniform texture1DArray)
-0:?     'g_tTex1di4a' ( uniform itexture1DArray)
-0:?     'g_tTex1du4a' ( uniform utexture1DArray)
-0:?     'g_tTex2df4a' ( uniform texture2DArray)
-0:?     'g_tTex2di4a' ( uniform itexture2DArray)
-0:?     'g_tTex2du4a' ( uniform utexture2DArray)
+0:?     'g_tTex1df4a' ( uniform texture1DArrayShadow)
+0:?     'g_tTex1di4a' ( uniform itexture1DArrayShadow)
+0:?     'g_tTex1du4a' ( uniform utexture1DArrayShadow)
+0:?     'g_tTex2df4a' ( uniform texture2DArrayShadow)
+0:?     'g_tTex2di4a' ( uniform itexture2DArrayShadow)
+0:?     'g_tTex2du4a' ( uniform utexture2DArrayShadow)
 0:?     'g_tTexcdf4a' ( uniform textureCubeArray)
 0:?     'g_tTexcdi4a' ( uniform itextureCubeArray)
 0:?     'g_tTexcdu4a' ( uniform utextureCubeArray)
-0:?     'Color' (layout( location=0) out 4-component vector of float)
-0:?     'Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 
 Linked fragment stage:
@@ -183,6 +184,7 @@
 
 Shader version: 500
 gl_FragCoord origin is upper left
+using depth_any
 0:? Sequence
 0:38  Function Definition: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:38    Function Parameters: 
@@ -192,7 +194,7 @@
 0:42          'r11' ( temp float)
 0:42          textureLodOffset ( temp float)
 0:42            Construct combined texture-sampler ( temp sampler1DArrayShadow)
-0:42              'g_tTex1df4a' ( uniform texture1DArray)
+0:42              'g_tTex1df4a' ( uniform texture1DArrayShadow)
 0:42              'g_sSamp' (layout( binding=0) uniform sampler)
 0:42            Construct vec3 ( temp 3-component vector of float)
 0:?               Constant:
@@ -209,7 +211,7 @@
 0:43          'r13' ( temp float)
 0:43          textureLodOffset ( temp float)
 0:43            Construct combined texture-sampler ( temp isampler1DArrayShadow)
-0:43              'g_tTex1di4a' ( uniform itexture1DArray)
+0:43              'g_tTex1di4a' ( uniform itexture1DArrayShadow)
 0:43              'g_sSamp' (layout( binding=0) uniform sampler)
 0:43            Construct vec3 ( temp 3-component vector of float)
 0:?               Constant:
@@ -226,7 +228,7 @@
 0:44          'r15' ( temp float)
 0:44          textureLodOffset ( temp float)
 0:44            Construct combined texture-sampler ( temp usampler1DArrayShadow)
-0:44              'g_tTex1du4a' ( uniform utexture1DArray)
+0:44              'g_tTex1du4a' ( uniform utexture1DArrayShadow)
 0:44              'g_sSamp' (layout( binding=0) uniform sampler)
 0:44            Construct vec3 ( temp 3-component vector of float)
 0:?               Constant:
@@ -243,7 +245,7 @@
 0:47          'r31' ( temp float)
 0:47          textureLodOffset ( temp float)
 0:47            Construct combined texture-sampler ( temp sampler2DArrayShadow)
-0:47              'g_tTex2df4a' ( uniform texture2DArray)
+0:47              'g_tTex2df4a' ( uniform texture2DArrayShadow)
 0:47              'g_sSamp' (layout( binding=0) uniform sampler)
 0:47            Construct vec4 ( temp 4-component vector of float)
 0:?               Constant:
@@ -262,7 +264,7 @@
 0:48          'r33' ( temp float)
 0:48          textureLodOffset ( temp float)
 0:48            Construct combined texture-sampler ( temp isampler2DArrayShadow)
-0:48              'g_tTex2di4a' ( uniform itexture2DArray)
+0:48              'g_tTex2di4a' ( uniform itexture2DArrayShadow)
 0:48              'g_sSamp' (layout( binding=0) uniform sampler)
 0:48            Construct vec4 ( temp 4-component vector of float)
 0:?               Constant:
@@ -281,7 +283,7 @@
 0:49          'r35' ( temp float)
 0:49          textureLodOffset ( temp float)
 0:49            Construct combined texture-sampler ( temp usampler2DArrayShadow)
-0:49              'g_tTex2du4a' ( uniform utexture2DArray)
+0:49              'g_tTex2du4a' ( uniform utexture2DArrayShadow)
 0:49              'g_sSamp' (layout( binding=0) uniform sampler)
 0:49            Construct vec4 ( temp 4-component vector of float)
 0:?               Constant:
@@ -322,13 +324,13 @@
 0:38          'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:38          Function Call: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:38        move second child to first child ( temp 4-component vector of float)
-0:?           'Color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 0:38          Color: direct index for structure ( temp 4-component vector of float)
 0:38            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:38            Constant:
 0:38              0 (const int)
 0:38        move second child to first child ( temp float)
-0:?           'Depth' ( out float FragDepth)
+0:?           '@entryPointOutput.Depth' ( out float FragDepth)
 0:38          Depth: direct index for structure ( temp float)
 0:38            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:38            Constant:
@@ -347,29 +349,34 @@
 0:?     'g_tTexcdf4' ( uniform textureCube)
 0:?     'g_tTexcdi4' ( uniform itextureCube)
 0:?     'g_tTexcdu4' ( uniform utextureCube)
-0:?     'g_tTex1df4a' ( uniform texture1DArray)
-0:?     'g_tTex1di4a' ( uniform itexture1DArray)
-0:?     'g_tTex1du4a' ( uniform utexture1DArray)
-0:?     'g_tTex2df4a' ( uniform texture2DArray)
-0:?     'g_tTex2di4a' ( uniform itexture2DArray)
-0:?     'g_tTex2du4a' ( uniform utexture2DArray)
+0:?     'g_tTex1df4a' ( uniform texture1DArrayShadow)
+0:?     'g_tTex1di4a' ( uniform itexture1DArrayShadow)
+0:?     'g_tTex1du4a' ( uniform utexture1DArrayShadow)
+0:?     'g_tTex2df4a' ( uniform texture2DArrayShadow)
+0:?     'g_tTex2di4a' ( uniform itexture2DArrayShadow)
+0:?     'g_tTex2du4a' ( uniform utexture2DArrayShadow)
 0:?     'g_tTexcdf4a' ( uniform textureCubeArray)
 0:?     'g_tTexcdi4a' ( uniform itextureCubeArray)
 0:?     'g_tTexcdu4a' ( uniform utextureCubeArray)
-0:?     'Color' (layout( location=0) out 4-component vector of float)
-0:?     'Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
+
+error: SPIRV-Tools Validation Errors
+error: Expected Image 'Sampled Type' to be the same as Result Type
+  %50 = OpImageSampleDrefExplicitLod %float %45 %48 %49 Lod|ConstOffset %float_0 %int_2
 
 // Module Version 10000
-// Generated by (magic number): 80001
-// Id's are bound by 185
+// Generated by (magic number): 80007
+// Id's are bound by 179
 
                               Capability Shader
                               Capability Sampled1D
                               Capability SampledCubeArray
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "main" 133 137
+                              EntryPoint Fragment 4  "main" 127 131
                               ExecutionMode 4 OriginUpperLeft
+                              ExecutionMode 4 DepthReplacing
                               Source HLSL 500
                               Name 4  "main"
                               Name 8  "PS_OUTPUT"
@@ -379,61 +386,61 @@
                               Name 13  "r11"
                               Name 16  "g_tTex1df4a"
                               Name 20  "g_sSamp"
-                              Name 39  "r13"
-                              Name 42  "g_tTex1di4a"
-                              Name 53  "r15"
-                              Name 57  "g_tTex1du4a"
-                              Name 68  "r31"
-                              Name 71  "g_tTex2df4a"
-                              Name 88  "r33"
-                              Name 91  "g_tTex2di4a"
-                              Name 103  "r35"
-                              Name 106  "g_tTex2du4a"
-                              Name 119  "psout"
-                              Name 130  "flattenTemp"
-                              Name 133  "Color"
-                              Name 137  "Depth"
-                              Name 142  "g_tTex1df4"
-                              Name 145  "g_tTex1di4"
-                              Name 148  "g_tTex1du4"
-                              Name 151  "g_tTex2df4"
-                              Name 154  "g_tTex2di4"
-                              Name 157  "g_tTex2du4"
-                              Name 160  "g_tTex3df4"
-                              Name 163  "g_tTex3di4"
-                              Name 166  "g_tTex3du4"
-                              Name 169  "g_tTexcdf4"
-                              Name 172  "g_tTexcdi4"
-                              Name 175  "g_tTexcdu4"
-                              Name 178  "g_tTexcdf4a"
-                              Name 181  "g_tTexcdi4a"
-                              Name 184  "g_tTexcdu4a"
+                              Name 38  "r13"
+                              Name 41  "g_tTex1di4a"
+                              Name 51  "r15"
+                              Name 55  "g_tTex1du4a"
+                              Name 65  "r31"
+                              Name 68  "g_tTex2df4a"
+                              Name 84  "r33"
+                              Name 87  "g_tTex2di4a"
+                              Name 98  "r35"
+                              Name 101  "g_tTex2du4a"
+                              Name 113  "psout"
+                              Name 124  "flattenTemp"
+                              Name 127  "@entryPointOutput.Color"
+                              Name 131  "@entryPointOutput.Depth"
+                              Name 136  "g_tTex1df4"
+                              Name 139  "g_tTex1di4"
+                              Name 142  "g_tTex1du4"
+                              Name 145  "g_tTex2df4"
+                              Name 148  "g_tTex2di4"
+                              Name 151  "g_tTex2du4"
+                              Name 154  "g_tTex3df4"
+                              Name 157  "g_tTex3di4"
+                              Name 160  "g_tTex3du4"
+                              Name 163  "g_tTexcdf4"
+                              Name 166  "g_tTexcdi4"
+                              Name 169  "g_tTexcdu4"
+                              Name 172  "g_tTexcdf4a"
+                              Name 175  "g_tTexcdi4a"
+                              Name 178  "g_tTexcdu4a"
                               Decorate 16(g_tTex1df4a) DescriptorSet 0
                               Decorate 20(g_sSamp) DescriptorSet 0
                               Decorate 20(g_sSamp) Binding 0
-                              Decorate 42(g_tTex1di4a) DescriptorSet 0
-                              Decorate 57(g_tTex1du4a) DescriptorSet 0
-                              Decorate 71(g_tTex2df4a) DescriptorSet 0
-                              Decorate 91(g_tTex2di4a) DescriptorSet 0
-                              Decorate 106(g_tTex2du4a) DescriptorSet 0
-                              Decorate 133(Color) Location 0
-                              Decorate 137(Depth) BuiltIn FragDepth
-                              Decorate 142(g_tTex1df4) DescriptorSet 0
-                              Decorate 142(g_tTex1df4) Binding 0
-                              Decorate 145(g_tTex1di4) DescriptorSet 0
-                              Decorate 148(g_tTex1du4) DescriptorSet 0
-                              Decorate 151(g_tTex2df4) DescriptorSet 0
-                              Decorate 154(g_tTex2di4) DescriptorSet 0
-                              Decorate 157(g_tTex2du4) DescriptorSet 0
-                              Decorate 160(g_tTex3df4) DescriptorSet 0
-                              Decorate 163(g_tTex3di4) DescriptorSet 0
-                              Decorate 166(g_tTex3du4) DescriptorSet 0
-                              Decorate 169(g_tTexcdf4) DescriptorSet 0
-                              Decorate 172(g_tTexcdi4) DescriptorSet 0
-                              Decorate 175(g_tTexcdu4) DescriptorSet 0
-                              Decorate 178(g_tTexcdf4a) DescriptorSet 0
-                              Decorate 181(g_tTexcdi4a) DescriptorSet 0
-                              Decorate 184(g_tTexcdu4a) DescriptorSet 0
+                              Decorate 41(g_tTex1di4a) DescriptorSet 0
+                              Decorate 55(g_tTex1du4a) DescriptorSet 0
+                              Decorate 68(g_tTex2df4a) DescriptorSet 0
+                              Decorate 87(g_tTex2di4a) DescriptorSet 0
+                              Decorate 101(g_tTex2du4a) DescriptorSet 0
+                              Decorate 127(@entryPointOutput.Color) Location 0
+                              Decorate 131(@entryPointOutput.Depth) BuiltIn FragDepth
+                              Decorate 136(g_tTex1df4) DescriptorSet 0
+                              Decorate 136(g_tTex1df4) Binding 0
+                              Decorate 139(g_tTex1di4) DescriptorSet 0
+                              Decorate 142(g_tTex1du4) DescriptorSet 0
+                              Decorate 145(g_tTex2df4) DescriptorSet 0
+                              Decorate 148(g_tTex2di4) DescriptorSet 0
+                              Decorate 151(g_tTex2du4) DescriptorSet 0
+                              Decorate 154(g_tTex3df4) DescriptorSet 0
+                              Decorate 157(g_tTex3di4) DescriptorSet 0
+                              Decorate 160(g_tTex3du4) DescriptorSet 0
+                              Decorate 163(g_tTexcdf4) DescriptorSet 0
+                              Decorate 166(g_tTexcdi4) DescriptorSet 0
+                              Decorate 169(g_tTexcdu4) DescriptorSet 0
+                              Decorate 172(g_tTexcdf4a) DescriptorSet 0
+                              Decorate 175(g_tTexcdi4a) DescriptorSet 0
+                              Decorate 178(g_tTexcdu4a) DescriptorSet 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -441,192 +448,186 @@
     8(PS_OUTPUT):             TypeStruct 7(fvec4) 6(float)
                9:             TypeFunction 8(PS_OUTPUT)
               12:             TypePointer Function 6(float)
-              14:             TypeImage 6(float) 1D array sampled format:Unknown
+              14:             TypeImage 6(float) 1D depth array sampled format:Unknown
               15:             TypePointer UniformConstant 14
  16(g_tTex1df4a):     15(ptr) Variable UniformConstant
               18:             TypeSampler
               19:             TypePointer UniformConstant 18
      20(g_sSamp):     19(ptr) Variable UniformConstant
-              22:             TypeImage 6(float) 1D depth array sampled format:Unknown
-              23:             TypeSampledImage 22
-              25:             TypeVector 6(float) 2
-              26:    6(float) Constant 1036831949
-              27:    6(float) Constant 1045220557
-              28:   25(fvec2) ConstantComposite 26 27
-              29:    6(float) Constant 1061158912
-              30:             TypeVector 6(float) 3
-              34:    6(float) Constant 0
-              35:             TypeInt 32 1
-              36:     35(int) Constant 2
-              40:             TypeImage 35(int) 1D array sampled format:Unknown
-              41:             TypePointer UniformConstant 40
- 42(g_tTex1di4a):     41(ptr) Variable UniformConstant
-              45:             TypeImage 35(int) 1D depth array sampled format:Unknown
-              46:             TypeSampledImage 45
-              54:             TypeInt 32 0
-              55:             TypeImage 54(int) 1D array sampled format:Unknown
-              56:             TypePointer UniformConstant 55
- 57(g_tTex1du4a):     56(ptr) Variable UniformConstant
-              60:             TypeImage 54(int) 1D depth array sampled format:Unknown
-              61:             TypeSampledImage 60
-              69:             TypeImage 6(float) 2D array sampled format:Unknown
-              70:             TypePointer UniformConstant 69
- 71(g_tTex2df4a):     70(ptr) Variable UniformConstant
-              74:             TypeImage 6(float) 2D depth array sampled format:Unknown
-              75:             TypeSampledImage 74
-              77:    6(float) Constant 1050253722
-              78:   30(fvec3) ConstantComposite 26 27 77
-              83:             TypeVector 35(int) 2
-              84:     35(int) Constant 3
-              85:   83(ivec2) ConstantComposite 36 84
-              89:             TypeImage 35(int) 2D array sampled format:Unknown
-              90:             TypePointer UniformConstant 89
- 91(g_tTex2di4a):     90(ptr) Variable UniformConstant
-              94:             TypeImage 35(int) 2D depth array sampled format:Unknown
-              95:             TypeSampledImage 94
-             104:             TypeImage 54(int) 2D array sampled format:Unknown
-             105:             TypePointer UniformConstant 104
-106(g_tTex2du4a):    105(ptr) Variable UniformConstant
-             109:             TypeImage 54(int) 2D depth array sampled format:Unknown
-             110:             TypeSampledImage 109
-             118:             TypePointer Function 8(PS_OUTPUT)
-             120:     35(int) Constant 0
-             121:    6(float) Constant 1065353216
-             122:    7(fvec4) ConstantComposite 121 121 121 121
-             123:             TypePointer Function 7(fvec4)
-             125:     35(int) Constant 1
-             132:             TypePointer Output 7(fvec4)
-      133(Color):    132(ptr) Variable Output
-             136:             TypePointer Output 6(float)
-      137(Depth):    136(ptr) Variable Output
-             140:             TypeImage 6(float) 1D sampled format:Unknown
+              22:             TypeSampledImage 14
+              24:             TypeVector 6(float) 2
+              25:    6(float) Constant 1036831949
+              26:    6(float) Constant 1045220557
+              27:   24(fvec2) ConstantComposite 25 26
+              28:    6(float) Constant 1061158912
+              29:             TypeVector 6(float) 3
+              33:    6(float) Constant 0
+              34:             TypeInt 32 1
+              35:     34(int) Constant 2
+              39:             TypeImage 34(int) 1D depth array sampled format:Unknown
+              40:             TypePointer UniformConstant 39
+ 41(g_tTex1di4a):     40(ptr) Variable UniformConstant
+              44:             TypeSampledImage 39
+              52:             TypeInt 32 0
+              53:             TypeImage 52(int) 1D depth array sampled format:Unknown
+              54:             TypePointer UniformConstant 53
+ 55(g_tTex1du4a):     54(ptr) Variable UniformConstant
+              58:             TypeSampledImage 53
+              66:             TypeImage 6(float) 2D depth array sampled format:Unknown
+              67:             TypePointer UniformConstant 66
+ 68(g_tTex2df4a):     67(ptr) Variable UniformConstant
+              71:             TypeSampledImage 66
+              73:    6(float) Constant 1050253722
+              74:   29(fvec3) ConstantComposite 25 26 73
+              79:             TypeVector 34(int) 2
+              80:     34(int) Constant 3
+              81:   79(ivec2) ConstantComposite 35 80
+              85:             TypeImage 34(int) 2D depth array sampled format:Unknown
+              86:             TypePointer UniformConstant 85
+ 87(g_tTex2di4a):     86(ptr) Variable UniformConstant
+              90:             TypeSampledImage 85
+              99:             TypeImage 52(int) 2D depth array sampled format:Unknown
+             100:             TypePointer UniformConstant 99
+101(g_tTex2du4a):    100(ptr) Variable UniformConstant
+             104:             TypeSampledImage 99
+             112:             TypePointer Function 8(PS_OUTPUT)
+             114:     34(int) Constant 0
+             115:    6(float) Constant 1065353216
+             116:    7(fvec4) ConstantComposite 115 115 115 115
+             117:             TypePointer Function 7(fvec4)
+             119:     34(int) Constant 1
+             126:             TypePointer Output 7(fvec4)
+127(@entryPointOutput.Color):    126(ptr) Variable Output
+             130:             TypePointer Output 6(float)
+131(@entryPointOutput.Depth):    130(ptr) Variable Output
+             134:             TypeImage 6(float) 1D sampled format:Unknown
+             135:             TypePointer UniformConstant 134
+ 136(g_tTex1df4):    135(ptr) Variable UniformConstant
+             137:             TypeImage 34(int) 1D sampled format:Unknown
+             138:             TypePointer UniformConstant 137
+ 139(g_tTex1di4):    138(ptr) Variable UniformConstant
+             140:             TypeImage 52(int) 1D sampled format:Unknown
              141:             TypePointer UniformConstant 140
- 142(g_tTex1df4):    141(ptr) Variable UniformConstant
-             143:             TypeImage 35(int) 1D sampled format:Unknown
+ 142(g_tTex1du4):    141(ptr) Variable UniformConstant
+             143:             TypeImage 6(float) 2D sampled format:Unknown
              144:             TypePointer UniformConstant 143
- 145(g_tTex1di4):    144(ptr) Variable UniformConstant
-             146:             TypeImage 54(int) 1D sampled format:Unknown
+ 145(g_tTex2df4):    144(ptr) Variable UniformConstant
+             146:             TypeImage 34(int) 2D sampled format:Unknown
              147:             TypePointer UniformConstant 146
- 148(g_tTex1du4):    147(ptr) Variable UniformConstant
-             149:             TypeImage 6(float) 2D sampled format:Unknown
+ 148(g_tTex2di4):    147(ptr) Variable UniformConstant
+             149:             TypeImage 52(int) 2D sampled format:Unknown
              150:             TypePointer UniformConstant 149
- 151(g_tTex2df4):    150(ptr) Variable UniformConstant
-             152:             TypeImage 35(int) 2D sampled format:Unknown
+ 151(g_tTex2du4):    150(ptr) Variable UniformConstant
+             152:             TypeImage 6(float) 3D sampled format:Unknown
              153:             TypePointer UniformConstant 152
- 154(g_tTex2di4):    153(ptr) Variable UniformConstant
-             155:             TypeImage 54(int) 2D sampled format:Unknown
+ 154(g_tTex3df4):    153(ptr) Variable UniformConstant
+             155:             TypeImage 34(int) 3D sampled format:Unknown
              156:             TypePointer UniformConstant 155
- 157(g_tTex2du4):    156(ptr) Variable UniformConstant
-             158:             TypeImage 6(float) 3D sampled format:Unknown
+ 157(g_tTex3di4):    156(ptr) Variable UniformConstant
+             158:             TypeImage 52(int) 3D sampled format:Unknown
              159:             TypePointer UniformConstant 158
- 160(g_tTex3df4):    159(ptr) Variable UniformConstant
-             161:             TypeImage 35(int) 3D sampled format:Unknown
+ 160(g_tTex3du4):    159(ptr) Variable UniformConstant
+             161:             TypeImage 6(float) Cube sampled format:Unknown
              162:             TypePointer UniformConstant 161
- 163(g_tTex3di4):    162(ptr) Variable UniformConstant
-             164:             TypeImage 54(int) 3D sampled format:Unknown
+ 163(g_tTexcdf4):    162(ptr) Variable UniformConstant
+             164:             TypeImage 34(int) Cube sampled format:Unknown
              165:             TypePointer UniformConstant 164
- 166(g_tTex3du4):    165(ptr) Variable UniformConstant
-             167:             TypeImage 6(float) Cube sampled format:Unknown
+ 166(g_tTexcdi4):    165(ptr) Variable UniformConstant
+             167:             TypeImage 52(int) Cube sampled format:Unknown
              168:             TypePointer UniformConstant 167
- 169(g_tTexcdf4):    168(ptr) Variable UniformConstant
-             170:             TypeImage 35(int) Cube sampled format:Unknown
+ 169(g_tTexcdu4):    168(ptr) Variable UniformConstant
+             170:             TypeImage 6(float) Cube array sampled format:Unknown
              171:             TypePointer UniformConstant 170
- 172(g_tTexcdi4):    171(ptr) Variable UniformConstant
-             173:             TypeImage 54(int) Cube sampled format:Unknown
+172(g_tTexcdf4a):    171(ptr) Variable UniformConstant
+             173:             TypeImage 34(int) Cube array sampled format:Unknown
              174:             TypePointer UniformConstant 173
- 175(g_tTexcdu4):    174(ptr) Variable UniformConstant
-             176:             TypeImage 6(float) Cube array sampled format:Unknown
+175(g_tTexcdi4a):    174(ptr) Variable UniformConstant
+             176:             TypeImage 52(int) Cube array sampled format:Unknown
              177:             TypePointer UniformConstant 176
-178(g_tTexcdf4a):    177(ptr) Variable UniformConstant
-             179:             TypeImage 35(int) Cube array sampled format:Unknown
-             180:             TypePointer UniformConstant 179
-181(g_tTexcdi4a):    180(ptr) Variable UniformConstant
-             182:             TypeImage 54(int) Cube array sampled format:Unknown
-             183:             TypePointer UniformConstant 182
-184(g_tTexcdu4a):    183(ptr) Variable UniformConstant
+178(g_tTexcdu4a):    177(ptr) Variable UniformConstant
          4(main):           2 Function None 3
                5:             Label
-130(flattenTemp):    118(ptr) Variable Function
-             131:8(PS_OUTPUT) FunctionCall 10(@main()
-                              Store 130(flattenTemp) 131
-             134:    123(ptr) AccessChain 130(flattenTemp) 120
-             135:    7(fvec4) Load 134
-                              Store 133(Color) 135
-             138:     12(ptr) AccessChain 130(flattenTemp) 125
-             139:    6(float) Load 138
-                              Store 137(Depth) 139
+124(flattenTemp):    112(ptr) Variable Function
+             125:8(PS_OUTPUT) FunctionCall 10(@main()
+                              Store 124(flattenTemp) 125
+             128:    117(ptr) AccessChain 124(flattenTemp) 114
+             129:    7(fvec4) Load 128
+                              Store 127(@entryPointOutput.Color) 129
+             132:     12(ptr) AccessChain 124(flattenTemp) 119
+             133:    6(float) Load 132
+                              Store 131(@entryPointOutput.Depth) 133
                               Return
                               FunctionEnd
       10(@main():8(PS_OUTPUT) Function None 9
               11:             Label
          13(r11):     12(ptr) Variable Function
-         39(r13):     12(ptr) Variable Function
-         53(r15):     12(ptr) Variable Function
-         68(r31):     12(ptr) Variable Function
-         88(r33):     12(ptr) Variable Function
-        103(r35):     12(ptr) Variable Function
-      119(psout):    118(ptr) Variable Function
+         38(r13):     12(ptr) Variable Function
+         51(r15):     12(ptr) Variable Function
+         65(r31):     12(ptr) Variable Function
+         84(r33):     12(ptr) Variable Function
+         98(r35):     12(ptr) Variable Function
+      113(psout):    112(ptr) Variable Function
               17:          14 Load 16(g_tTex1df4a)
               21:          18 Load 20(g_sSamp)
-              24:          23 SampledImage 17 21
-              31:    6(float) CompositeExtract 28 0
-              32:    6(float) CompositeExtract 28 1
-              33:   30(fvec3) CompositeConstruct 31 32 29
-              37:    6(float) CompositeExtract 33 2
-              38:    6(float) ImageSampleDrefExplicitLod 24 33 37 Lod ConstOffset 34 36
-                              Store 13(r11) 38
-              43:          40 Load 42(g_tTex1di4a)
-              44:          18 Load 20(g_sSamp)
-              47:          46 SampledImage 43 44
-              48:    6(float) CompositeExtract 28 0
-              49:    6(float) CompositeExtract 28 1
-              50:   30(fvec3) CompositeConstruct 48 49 29
-              51:    6(float) CompositeExtract 50 2
-              52:    6(float) ImageSampleDrefExplicitLod 47 50 51 Lod ConstOffset 34 36
-                              Store 39(r13) 52
-              58:          55 Load 57(g_tTex1du4a)
-              59:          18 Load 20(g_sSamp)
-              62:          61 SampledImage 58 59
-              63:    6(float) CompositeExtract 28 0
-              64:    6(float) CompositeExtract 28 1
-              65:   30(fvec3) CompositeConstruct 63 64 29
-              66:    6(float) CompositeExtract 65 2
-              67:    6(float) ImageSampleDrefExplicitLod 62 65 66 Lod ConstOffset 34 36
-                              Store 53(r15) 67
-              72:          69 Load 71(g_tTex2df4a)
-              73:          18 Load 20(g_sSamp)
-              76:          75 SampledImage 72 73
-              79:    6(float) CompositeExtract 78 0
-              80:    6(float) CompositeExtract 78 1
-              81:    6(float) CompositeExtract 78 2
-              82:    7(fvec4) CompositeConstruct 79 80 81 29
-              86:    6(float) CompositeExtract 82 3
-              87:    6(float) ImageSampleDrefExplicitLod 76 82 86 Lod ConstOffset 34 85
-                              Store 68(r31) 87
-              92:          89 Load 91(g_tTex2di4a)
-              93:          18 Load 20(g_sSamp)
-              96:          95 SampledImage 92 93
-              97:    6(float) CompositeExtract 78 0
-              98:    6(float) CompositeExtract 78 1
-              99:    6(float) CompositeExtract 78 2
-             100:    7(fvec4) CompositeConstruct 97 98 99 29
-             101:    6(float) CompositeExtract 100 3
-             102:    6(float) ImageSampleDrefExplicitLod 96 100 101 Lod ConstOffset 34 85
-                              Store 88(r33) 102
-             107:         104 Load 106(g_tTex2du4a)
-             108:          18 Load 20(g_sSamp)
-             111:         110 SampledImage 107 108
-             112:    6(float) CompositeExtract 78 0
-             113:    6(float) CompositeExtract 78 1
-             114:    6(float) CompositeExtract 78 2
-             115:    7(fvec4) CompositeConstruct 112 113 114 29
-             116:    6(float) CompositeExtract 115 3
-             117:    6(float) ImageSampleDrefExplicitLod 111 115 116 Lod ConstOffset 34 85
-                              Store 103(r35) 117
-             124:    123(ptr) AccessChain 119(psout) 120
-                              Store 124 122
-             126:     12(ptr) AccessChain 119(psout) 125
-                              Store 126 121
-             127:8(PS_OUTPUT) Load 119(psout)
-                              ReturnValue 127
+              23:          22 SampledImage 17 21
+              30:    6(float) CompositeExtract 27 0
+              31:    6(float) CompositeExtract 27 1
+              32:   29(fvec3) CompositeConstruct 30 31 28
+              36:    6(float) CompositeExtract 32 2
+              37:    6(float) ImageSampleDrefExplicitLod 23 32 36 Lod ConstOffset 33 35
+                              Store 13(r11) 37
+              42:          39 Load 41(g_tTex1di4a)
+              43:          18 Load 20(g_sSamp)
+              45:          44 SampledImage 42 43
+              46:    6(float) CompositeExtract 27 0
+              47:    6(float) CompositeExtract 27 1
+              48:   29(fvec3) CompositeConstruct 46 47 28
+              49:    6(float) CompositeExtract 48 2
+              50:    6(float) ImageSampleDrefExplicitLod 45 48 49 Lod ConstOffset 33 35
+                              Store 38(r13) 50
+              56:          53 Load 55(g_tTex1du4a)
+              57:          18 Load 20(g_sSamp)
+              59:          58 SampledImage 56 57
+              60:    6(float) CompositeExtract 27 0
+              61:    6(float) CompositeExtract 27 1
+              62:   29(fvec3) CompositeConstruct 60 61 28
+              63:    6(float) CompositeExtract 62 2
+              64:    6(float) ImageSampleDrefExplicitLod 59 62 63 Lod ConstOffset 33 35
+                              Store 51(r15) 64
+              69:          66 Load 68(g_tTex2df4a)
+              70:          18 Load 20(g_sSamp)
+              72:          71 SampledImage 69 70
+              75:    6(float) CompositeExtract 74 0
+              76:    6(float) CompositeExtract 74 1
+              77:    6(float) CompositeExtract 74 2
+              78:    7(fvec4) CompositeConstruct 75 76 77 28
+              82:    6(float) CompositeExtract 78 3
+              83:    6(float) ImageSampleDrefExplicitLod 72 78 82 Lod ConstOffset 33 81
+                              Store 65(r31) 83
+              88:          85 Load 87(g_tTex2di4a)
+              89:          18 Load 20(g_sSamp)
+              91:          90 SampledImage 88 89
+              92:    6(float) CompositeExtract 74 0
+              93:    6(float) CompositeExtract 74 1
+              94:    6(float) CompositeExtract 74 2
+              95:    7(fvec4) CompositeConstruct 92 93 94 28
+              96:    6(float) CompositeExtract 95 3
+              97:    6(float) ImageSampleDrefExplicitLod 91 95 96 Lod ConstOffset 33 81
+                              Store 84(r33) 97
+             102:          99 Load 101(g_tTex2du4a)
+             103:          18 Load 20(g_sSamp)
+             105:         104 SampledImage 102 103
+             106:    6(float) CompositeExtract 74 0
+             107:    6(float) CompositeExtract 74 1
+             108:    6(float) CompositeExtract 74 2
+             109:    7(fvec4) CompositeConstruct 106 107 108 28
+             110:    6(float) CompositeExtract 109 3
+             111:    6(float) ImageSampleDrefExplicitLod 105 109 110 Lod ConstOffset 33 81
+                              Store 98(r35) 111
+             118:    117(ptr) AccessChain 113(psout) 114
+                              Store 118 116
+             120:     12(ptr) AccessChain 113(psout) 119
+                              Store 120 115
+             121:8(PS_OUTPUT) Load 113(psout)
+                              ReturnValue 121
                               FunctionEnd
diff --git a/Test/baseResults/hlsl.samplegrad.array.dx10.frag.out b/Test/baseResults/hlsl.samplegrad.array.dx10.frag.out
index 03449f8..81a92a2 100644
--- a/Test/baseResults/hlsl.samplegrad.array.dx10.frag.out
+++ b/Test/baseResults/hlsl.samplegrad.array.dx10.frag.out
@@ -1,6 +1,7 @@
 hlsl.samplegrad.array.dx10.frag
 Shader version: 500
 gl_FragCoord origin is upper left
+using depth_any
 0:? Sequence
 0:24  Function Definition: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:24    Function Parameters: 
@@ -185,13 +186,13 @@
 0:24          'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:24          Function Call: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:24        move second child to first child ( temp 4-component vector of float)
-0:?           'Color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 0:24          Color: direct index for structure ( temp 4-component vector of float)
 0:24            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:24            Constant:
 0:24              0 (const int)
 0:24        move second child to first child ( temp float)
-0:?           'Depth' ( out float FragDepth)
+0:?           '@entryPointOutput.Depth' ( out float FragDepth)
 0:24          Depth: direct index for structure ( temp float)
 0:24            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:24            Constant:
@@ -208,8 +209,8 @@
 0:?     'g_tTexcdf4' ( uniform textureCubeArray)
 0:?     'g_tTexcdi4' ( uniform itextureCubeArray)
 0:?     'g_tTexcdu4' ( uniform utextureCubeArray)
-0:?     'Color' (layout( location=0) out 4-component vector of float)
-0:?     'Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 
 Linked fragment stage:
@@ -217,6 +218,7 @@
 
 Shader version: 500
 gl_FragCoord origin is upper left
+using depth_any
 0:? Sequence
 0:24  Function Definition: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:24    Function Parameters: 
@@ -401,13 +403,13 @@
 0:24          'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:24          Function Call: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:24        move second child to first child ( temp 4-component vector of float)
-0:?           'Color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 0:24          Color: direct index for structure ( temp 4-component vector of float)
 0:24            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:24            Constant:
 0:24              0 (const int)
 0:24        move second child to first child ( temp float)
-0:?           'Depth' ( out float FragDepth)
+0:?           '@entryPointOutput.Depth' ( out float FragDepth)
 0:24          Depth: direct index for structure ( temp float)
 0:24            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:24            Constant:
@@ -424,11 +426,11 @@
 0:?     'g_tTexcdf4' ( uniform textureCubeArray)
 0:?     'g_tTexcdi4' ( uniform itextureCubeArray)
 0:?     'g_tTexcdu4' ( uniform utextureCubeArray)
-0:?     'Color' (layout( location=0) out 4-component vector of float)
-0:?     'Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 140
 
                               Capability Shader
@@ -438,6 +440,7 @@
                               MemoryModel Logical GLSL450
                               EntryPoint Fragment 4  "main" 132 136
                               ExecutionMode 4 OriginUpperLeft
+                              ExecutionMode 4 DepthReplacing
                               Source HLSL 500
                               Name 4  "main"
                               Name 8  "PS_OUTPUT"
@@ -465,8 +468,8 @@
                               Name 111  "g_tTexcdu4"
                               Name 118  "psout"
                               Name 129  "flattenTemp"
-                              Name 132  "Color"
-                              Name 136  "Depth"
+                              Name 132  "@entryPointOutput.Color"
+                              Name 136  "@entryPointOutput.Depth"
                               Name 139  "g_tTex1df4a"
                               Decorate 16(g_tTex1df4) DescriptorSet 0
                               Decorate 16(g_tTex1df4) Binding 0
@@ -480,8 +483,8 @@
                               Decorate 89(g_tTexcdf4) DescriptorSet 0
                               Decorate 102(g_tTexcdi4) DescriptorSet 0
                               Decorate 111(g_tTexcdu4) DescriptorSet 0
-                              Decorate 132(Color) Location 0
-                              Decorate 136(Depth) BuiltIn FragDepth
+                              Decorate 132(@entryPointOutput.Color) Location 0
+                              Decorate 136(@entryPointOutput.Depth) BuiltIn FragDepth
                               Decorate 139(g_tTex1df4a) DescriptorSet 0
                               Decorate 139(g_tTex1df4a) Binding 1
                2:             TypeVoid
@@ -557,9 +560,9 @@
              123:     31(int) Constant 1
              124:             TypePointer Function 6(float)
              131:             TypePointer Output 7(fvec4)
-      132(Color):    131(ptr) Variable Output
+132(@entryPointOutput.Color):    131(ptr) Variable Output
              135:             TypePointer Output 6(float)
-      136(Depth):    135(ptr) Variable Output
+136(@entryPointOutput.Depth):    135(ptr) Variable Output
 139(g_tTex1df4a):     15(ptr) Variable UniformConstant
          4(main):           2 Function None 3
                5:             Label
@@ -568,10 +571,10 @@
                               Store 129(flattenTemp) 130
              133:     12(ptr) AccessChain 129(flattenTemp) 119
              134:    7(fvec4) Load 133
-                              Store 132(Color) 134
+                              Store 132(@entryPointOutput.Color) 134
              137:    124(ptr) AccessChain 129(flattenTemp) 123
              138:    6(float) Load 137
-                              Store 136(Depth) 138
+                              Store 136(@entryPointOutput.Depth) 138
                               Return
                               FunctionEnd
       10(@main():8(PS_OUTPUT) Function None 9
diff --git a/Test/baseResults/hlsl.samplegrad.basic.dx10.frag.out b/Test/baseResults/hlsl.samplegrad.basic.dx10.frag.out
index 42a27bf..3acd9af 100644
--- a/Test/baseResults/hlsl.samplegrad.basic.dx10.frag.out
+++ b/Test/baseResults/hlsl.samplegrad.basic.dx10.frag.out
@@ -1,6 +1,7 @@
 hlsl.samplegrad.basic.dx10.frag
 Shader version: 500
 gl_FragCoord origin is upper left
+using depth_any
 0:? Sequence
 0:28  Function Definition: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:28    Function Parameters: 
@@ -233,13 +234,13 @@
 0:28          'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:28          Function Call: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:28        move second child to first child ( temp 4-component vector of float)
-0:?           'Color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 0:28          Color: direct index for structure ( temp 4-component vector of float)
 0:28            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:28            Constant:
 0:28              0 (const int)
 0:28        move second child to first child ( temp float)
-0:?           'Depth' ( out float FragDepth)
+0:?           '@entryPointOutput.Depth' ( out float FragDepth)
 0:28          Depth: direct index for structure ( temp float)
 0:28            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:28            Constant:
@@ -259,8 +260,8 @@
 0:?     'g_tTexcdf4' ( uniform textureCube)
 0:?     'g_tTexcdi4' ( uniform itextureCube)
 0:?     'g_tTexcdu4' ( uniform utextureCube)
-0:?     'Color' (layout( location=0) out 4-component vector of float)
-0:?     'Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 
 Linked fragment stage:
@@ -268,6 +269,7 @@
 
 Shader version: 500
 gl_FragCoord origin is upper left
+using depth_any
 0:? Sequence
 0:28  Function Definition: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:28    Function Parameters: 
@@ -500,13 +502,13 @@
 0:28          'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:28          Function Call: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:28        move second child to first child ( temp 4-component vector of float)
-0:?           'Color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 0:28          Color: direct index for structure ( temp 4-component vector of float)
 0:28            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:28            Constant:
 0:28              0 (const int)
 0:28        move second child to first child ( temp float)
-0:?           'Depth' ( out float FragDepth)
+0:?           '@entryPointOutput.Depth' ( out float FragDepth)
 0:28          Depth: direct index for structure ( temp float)
 0:28            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:28            Constant:
@@ -526,11 +528,11 @@
 0:?     'g_tTexcdf4' ( uniform textureCube)
 0:?     'g_tTexcdi4' ( uniform itextureCube)
 0:?     'g_tTexcdu4' ( uniform utextureCube)
-0:?     'Color' (layout( location=0) out 4-component vector of float)
-0:?     'Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 175
 
                               Capability Shader
@@ -539,6 +541,7 @@
                               MemoryModel Logical GLSL450
                               EntryPoint Fragment 4  "main" 167 171
                               ExecutionMode 4 OriginUpperLeft
+                              ExecutionMode 4 DepthReplacing
                               Source HLSL 500
                               Name 4  "main"
                               Name 8  "PS_OUTPUT"
@@ -572,8 +575,8 @@
                               Name 146  "g_tTexcdu4"
                               Name 153  "psout"
                               Name 164  "flattenTemp"
-                              Name 167  "Color"
-                              Name 171  "Depth"
+                              Name 167  "@entryPointOutput.Color"
+                              Name 171  "@entryPointOutput.Depth"
                               Name 174  "g_tTex1df4a"
                               Decorate 16(g_tTex1df4) DescriptorSet 0
                               Decorate 16(g_tTex1df4) Binding 0
@@ -590,8 +593,8 @@
                               Decorate 128(g_tTexcdf4) DescriptorSet 0
                               Decorate 137(g_tTexcdi4) DescriptorSet 0
                               Decorate 146(g_tTexcdu4) DescriptorSet 0
-                              Decorate 167(Color) Location 0
-                              Decorate 171(Depth) BuiltIn FragDepth
+                              Decorate 167(@entryPointOutput.Color) Location 0
+                              Decorate 171(@entryPointOutput.Depth) BuiltIn FragDepth
                               Decorate 174(g_tTex1df4a) DescriptorSet 0
                               Decorate 174(g_tTex1df4a) Binding 1
                2:             TypeVoid
@@ -687,9 +690,9 @@
              158:     28(int) Constant 1
              159:             TypePointer Function 6(float)
              166:             TypePointer Output 7(fvec4)
-      167(Color):    166(ptr) Variable Output
+167(@entryPointOutput.Color):    166(ptr) Variable Output
              170:             TypePointer Output 6(float)
-      171(Depth):    170(ptr) Variable Output
+171(@entryPointOutput.Depth):    170(ptr) Variable Output
 174(g_tTex1df4a):     15(ptr) Variable UniformConstant
          4(main):           2 Function None 3
                5:             Label
@@ -698,10 +701,10 @@
                               Store 164(flattenTemp) 165
              168:     12(ptr) AccessChain 164(flattenTemp) 154
              169:    7(fvec4) Load 168
-                              Store 167(Color) 169
+                              Store 167(@entryPointOutput.Color) 169
              172:    159(ptr) AccessChain 164(flattenTemp) 158
              173:    6(float) Load 172
-                              Store 171(Depth) 173
+                              Store 171(@entryPointOutput.Depth) 173
                               Return
                               FunctionEnd
       10(@main():8(PS_OUTPUT) Function None 9
diff --git a/Test/baseResults/hlsl.samplegrad.basic.dx10.vert.out b/Test/baseResults/hlsl.samplegrad.basic.dx10.vert.out
index a93cbdf..d787939 100644
--- a/Test/baseResults/hlsl.samplegrad.basic.dx10.vert.out
+++ b/Test/baseResults/hlsl.samplegrad.basic.dx10.vert.out
@@ -222,7 +222,7 @@
 0:?     Sequence
 0:27      Sequence
 0:27        move second child to first child ( temp 4-component vector of float)
-0:?           '@entryPointOutput_Pos' ( out 4-component vector of float Position)
+0:?           '@entryPointOutput.Pos' ( out 4-component vector of float Position)
 0:27          Pos: direct index for structure ( temp 4-component vector of float)
 0:27            Function Call: @main( ( temp structure{ temp 4-component vector of float Pos})
 0:27            Constant:
@@ -242,7 +242,7 @@
 0:?     'g_tTexcdf4' ( uniform textureCube)
 0:?     'g_tTexcdi4' ( uniform itextureCube)
 0:?     'g_tTexcdu4' ( uniform utextureCube)
-0:?     '@entryPointOutput' (layout( location=0) out structure{})
+0:?     '@entryPointOutput.Pos' ( out 4-component vector of float Position)
 
 
 Linked vertex stage:
@@ -471,7 +471,7 @@
 0:?     Sequence
 0:27      Sequence
 0:27        move second child to first child ( temp 4-component vector of float)
-0:?           '@entryPointOutput_Pos' ( out 4-component vector of float Position)
+0:?           '@entryPointOutput.Pos' ( out 4-component vector of float Position)
 0:27          Pos: direct index for structure ( temp 4-component vector of float)
 0:27            Function Call: @main( ( temp structure{ temp 4-component vector of float Pos})
 0:27            Constant:
@@ -491,17 +491,17 @@
 0:?     'g_tTexcdf4' ( uniform textureCube)
 0:?     'g_tTexcdi4' ( uniform itextureCube)
 0:?     'g_tTexcdu4' ( uniform utextureCube)
-0:?     '@entryPointOutput' (layout( location=0) out structure{})
+0:?     '@entryPointOutput.Pos' ( out 4-component vector of float Position)
 
 // Module Version 10000
-// Generated by (magic number): 80001
-// Id's are bound by 169
+// Generated by (magic number): 80007
+// Id's are bound by 166
 
                               Capability Shader
                               Capability Sampled1D
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Vertex 4  "main" 162 168
+                              EntryPoint Vertex 4  "main" 162
                               Source HLSL 500
                               Name 4  "main"
                               Name 8  "VS_OUTPUT"
@@ -533,10 +533,8 @@
                               Name 143  "txval42"
                               Name 146  "g_tTexcdu4"
                               Name 153  "vsout"
-                              Name 162  "@entryPointOutput_Pos"
+                              Name 162  "@entryPointOutput.Pos"
                               Name 165  "g_tTex1df4a"
-                              Name 166  "VS_OUTPUT"
-                              Name 168  "@entryPointOutput"
                               Decorate 16(g_tTex1df4) DescriptorSet 0
                               Decorate 16(g_tTex1df4) Binding 0
                               Decorate 20(g_sSamp) DescriptorSet 0
@@ -552,10 +550,9 @@
                               Decorate 128(g_tTexcdf4) DescriptorSet 0
                               Decorate 137(g_tTexcdi4) DescriptorSet 0
                               Decorate 146(g_tTexcdu4) DescriptorSet 0
-                              Decorate 162(@entryPointOutput_Pos) BuiltIn Position
+                              Decorate 162(@entryPointOutput.Pos) BuiltIn Position
                               Decorate 165(g_tTex1df4a) DescriptorSet 0
                               Decorate 165(g_tTex1df4a) Binding 1
-                              Decorate 168(@entryPointOutput) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -647,16 +644,13 @@
              155:    6(float) Constant 0
              156:    7(fvec4) ConstantComposite 155 155 155 155
              161:             TypePointer Output 7(fvec4)
-162(@entryPointOutput_Pos):    161(ptr) Variable Output
+162(@entryPointOutput.Pos):    161(ptr) Variable Output
 165(g_tTex1df4a):     15(ptr) Variable UniformConstant
-  166(VS_OUTPUT):             TypeStruct
-             167:             TypePointer Output 166(VS_OUTPUT)
-168(@entryPointOutput):    167(ptr) Variable Output
          4(main):           2 Function None 3
                5:             Label
              163:8(VS_OUTPUT) FunctionCall 10(@main()
              164:    7(fvec4) CompositeExtract 163 0
-                              Store 162(@entryPointOutput_Pos) 164
+                              Store 162(@entryPointOutput.Pos) 164
                               Return
                               FunctionEnd
       10(@main():8(VS_OUTPUT) Function None 9
diff --git a/Test/baseResults/hlsl.samplegrad.offset.dx10.frag.out b/Test/baseResults/hlsl.samplegrad.offset.dx10.frag.out
index 4b4e718..b5a8549 100644
--- a/Test/baseResults/hlsl.samplegrad.offset.dx10.frag.out
+++ b/Test/baseResults/hlsl.samplegrad.offset.dx10.frag.out
@@ -1,6 +1,7 @@
 hlsl.samplegrad.offset.dx10.frag
 Shader version: 500
 gl_FragCoord origin is upper left
+using depth_any
 0:? Sequence
 0:28  Function Definition: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:28    Function Parameters: 
@@ -203,13 +204,13 @@
 0:28          'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:28          Function Call: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:28        move second child to first child ( temp 4-component vector of float)
-0:?           'Color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 0:28          Color: direct index for structure ( temp 4-component vector of float)
 0:28            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:28            Constant:
 0:28              0 (const int)
 0:28        move second child to first child ( temp float)
-0:?           'Depth' ( out float FragDepth)
+0:?           '@entryPointOutput.Depth' ( out float FragDepth)
 0:28          Depth: direct index for structure ( temp float)
 0:28            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:28            Constant:
@@ -229,8 +230,8 @@
 0:?     'g_tTexcdf4' ( uniform textureCube)
 0:?     'g_tTexcdi4' ( uniform itextureCube)
 0:?     'g_tTexcdu4' ( uniform utextureCube)
-0:?     'Color' (layout( location=0) out 4-component vector of float)
-0:?     'Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 
 Linked fragment stage:
@@ -238,6 +239,7 @@
 
 Shader version: 500
 gl_FragCoord origin is upper left
+using depth_any
 0:? Sequence
 0:28  Function Definition: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:28    Function Parameters: 
@@ -440,13 +442,13 @@
 0:28          'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:28          Function Call: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:28        move second child to first child ( temp 4-component vector of float)
-0:?           'Color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 0:28          Color: direct index for structure ( temp 4-component vector of float)
 0:28            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:28            Constant:
 0:28              0 (const int)
 0:28        move second child to first child ( temp float)
-0:?           'Depth' ( out float FragDepth)
+0:?           '@entryPointOutput.Depth' ( out float FragDepth)
 0:28          Depth: direct index for structure ( temp float)
 0:28            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:28            Constant:
@@ -466,11 +468,11 @@
 0:?     'g_tTexcdf4' ( uniform textureCube)
 0:?     'g_tTexcdi4' ( uniform itextureCube)
 0:?     'g_tTexcdu4' ( uniform utextureCube)
-0:?     'Color' (layout( location=0) out 4-component vector of float)
-0:?     'Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 166
 
                               Capability Shader
@@ -479,6 +481,7 @@
                               MemoryModel Logical GLSL450
                               EntryPoint Fragment 4  "main" 149 153
                               ExecutionMode 4 OriginUpperLeft
+                              ExecutionMode 4 DepthReplacing
                               Source HLSL 500
                               Name 4  "main"
                               Name 8  "PS_OUTPUT"
@@ -506,8 +509,8 @@
                               Name 125  "g_tTex3du4"
                               Name 137  "psout"
                               Name 146  "flattenTemp"
-                              Name 149  "Color"
-                              Name 153  "Depth"
+                              Name 149  "@entryPointOutput.Color"
+                              Name 153  "@entryPointOutput.Depth"
                               Name 156  "g_tTex1df4a"
                               Name 159  "g_tTexcdf4"
                               Name 162  "g_tTexcdi4"
@@ -524,8 +527,8 @@
                               Decorate 99(g_tTex3df4) DescriptorSet 0
                               Decorate 114(g_tTex3di4) DescriptorSet 0
                               Decorate 125(g_tTex3du4) DescriptorSet 0
-                              Decorate 149(Color) Location 0
-                              Decorate 153(Depth) BuiltIn FragDepth
+                              Decorate 149(@entryPointOutput.Color) Location 0
+                              Decorate 153(@entryPointOutput.Depth) BuiltIn FragDepth
                               Decorate 156(g_tTex1df4a) DescriptorSet 0
                               Decorate 156(g_tTex1df4a) Binding 1
                               Decorate 159(g_tTexcdf4) DescriptorSet 0
@@ -621,9 +624,9 @@
              139:    7(fvec4) ConstantComposite 138 138 138 138
              141:             TypePointer Function 6(float)
              148:             TypePointer Output 7(fvec4)
-      149(Color):    148(ptr) Variable Output
+149(@entryPointOutput.Color):    148(ptr) Variable Output
              152:             TypePointer Output 6(float)
-      153(Depth):    152(ptr) Variable Output
+153(@entryPointOutput.Depth):    152(ptr) Variable Output
 156(g_tTex1df4a):     15(ptr) Variable UniformConstant
              157:             TypeImage 6(float) Cube sampled format:Unknown
              158:             TypePointer UniformConstant 157
@@ -641,10 +644,10 @@
                               Store 146(flattenTemp) 147
              150:     12(ptr) AccessChain 146(flattenTemp) 67
              151:    7(fvec4) Load 150
-                              Store 149(Color) 151
+                              Store 149(@entryPointOutput.Color) 151
              154:    141(ptr) AccessChain 146(flattenTemp) 28
              155:    6(float) Load 154
-                              Store 153(Depth) 155
+                              Store 153(@entryPointOutput.Depth) 155
                               Return
                               FunctionEnd
       10(@main():8(PS_OUTPUT) Function None 9
diff --git a/Test/baseResults/hlsl.samplegrad.offsetarray.dx10.frag.out b/Test/baseResults/hlsl.samplegrad.offsetarray.dx10.frag.out
index 1f714e6..39a2838 100644
--- a/Test/baseResults/hlsl.samplegrad.offsetarray.dx10.frag.out
+++ b/Test/baseResults/hlsl.samplegrad.offsetarray.dx10.frag.out
@@ -1,6 +1,7 @@
 hlsl.samplegrad.offsetarray.dx10.frag
 Shader version: 500
 gl_FragCoord origin is upper left
+using depth_any
 0:? Sequence
 0:24  Function Definition: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:24    Function Parameters: 
@@ -140,13 +141,13 @@
 0:24          'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:24          Function Call: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:24        move second child to first child ( temp 4-component vector of float)
-0:?           'Color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 0:24          Color: direct index for structure ( temp 4-component vector of float)
 0:24            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:24            Constant:
 0:24              0 (const int)
 0:24        move second child to first child ( temp float)
-0:?           'Depth' ( out float FragDepth)
+0:?           '@entryPointOutput.Depth' ( out float FragDepth)
 0:24          Depth: direct index for structure ( temp float)
 0:24            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:24            Constant:
@@ -163,8 +164,8 @@
 0:?     'g_tTexcdf4' ( uniform textureCubeArray)
 0:?     'g_tTexcdi4' ( uniform itextureCubeArray)
 0:?     'g_tTexcdu4' ( uniform utextureCubeArray)
-0:?     'Color' (layout( location=0) out 4-component vector of float)
-0:?     'Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 
 Linked fragment stage:
@@ -172,6 +173,7 @@
 
 Shader version: 500
 gl_FragCoord origin is upper left
+using depth_any
 0:? Sequence
 0:24  Function Definition: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:24    Function Parameters: 
@@ -311,13 +313,13 @@
 0:24          'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:24          Function Call: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:24        move second child to first child ( temp 4-component vector of float)
-0:?           'Color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 0:24          Color: direct index for structure ( temp 4-component vector of float)
 0:24            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:24            Constant:
 0:24              0 (const int)
 0:24        move second child to first child ( temp float)
-0:?           'Depth' ( out float FragDepth)
+0:?           '@entryPointOutput.Depth' ( out float FragDepth)
 0:24          Depth: direct index for structure ( temp float)
 0:24            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:24            Constant:
@@ -334,11 +336,11 @@
 0:?     'g_tTexcdf4' ( uniform textureCubeArray)
 0:?     'g_tTexcdi4' ( uniform itextureCubeArray)
 0:?     'g_tTexcdu4' ( uniform utextureCubeArray)
-0:?     'Color' (layout( location=0) out 4-component vector of float)
-0:?     'Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 120
 
                               Capability Shader
@@ -348,6 +350,7 @@
                               MemoryModel Logical GLSL450
                               EntryPoint Fragment 4  "main" 103 107
                               ExecutionMode 4 OriginUpperLeft
+                              ExecutionMode 4 DepthReplacing
                               Source HLSL 500
                               Name 4  "main"
                               Name 8  "PS_OUTPUT"
@@ -369,8 +372,8 @@
                               Name 84  "g_tTex2du4"
                               Name 91  "psout"
                               Name 100  "flattenTemp"
-                              Name 103  "Color"
-                              Name 107  "Depth"
+                              Name 103  "@entryPointOutput.Color"
+                              Name 107  "@entryPointOutput.Depth"
                               Name 110  "g_tTex1df4a"
                               Name 113  "g_tTexcdf4"
                               Name 116  "g_tTexcdi4"
@@ -384,8 +387,8 @@
                               Decorate 59(g_tTex2df4) DescriptorSet 0
                               Decorate 75(g_tTex2di4) DescriptorSet 0
                               Decorate 84(g_tTex2du4) DescriptorSet 0
-                              Decorate 103(Color) Location 0
-                              Decorate 107(Depth) BuiltIn FragDepth
+                              Decorate 103(@entryPointOutput.Color) Location 0
+                              Decorate 107(@entryPointOutput.Depth) BuiltIn FragDepth
                               Decorate 110(g_tTex1df4a) DescriptorSet 0
                               Decorate 110(g_tTex1df4a) Binding 1
                               Decorate 113(g_tTexcdf4) DescriptorSet 0
@@ -450,9 +453,9 @@
               93:    7(fvec4) ConstantComposite 92 92 92 92
               95:             TypePointer Function 6(float)
              102:             TypePointer Output 7(fvec4)
-      103(Color):    102(ptr) Variable Output
+103(@entryPointOutput.Color):    102(ptr) Variable Output
              106:             TypePointer Output 6(float)
-      107(Depth):    106(ptr) Variable Output
+107(@entryPointOutput.Depth):    106(ptr) Variable Output
 110(g_tTex1df4a):     15(ptr) Variable UniformConstant
              111:             TypeImage 6(float) Cube array sampled format:Unknown
              112:             TypePointer UniformConstant 111
@@ -470,10 +473,10 @@
                               Store 100(flattenTemp) 101
              104:     12(ptr) AccessChain 100(flattenTemp) 69
              105:    7(fvec4) Load 104
-                              Store 103(Color) 105
+                              Store 103(@entryPointOutput.Color) 105
              108:     95(ptr) AccessChain 100(flattenTemp) 31
              109:    6(float) Load 108
-                              Store 107(Depth) 109
+                              Store 107(@entryPointOutput.Depth) 109
                               Return
                               FunctionEnd
       10(@main():8(PS_OUTPUT) Function None 9
diff --git a/Test/baseResults/hlsl.samplelevel.array.dx10.frag.out b/Test/baseResults/hlsl.samplelevel.array.dx10.frag.out
index 0a3e7fd..0151cdd 100644
--- a/Test/baseResults/hlsl.samplelevel.array.dx10.frag.out
+++ b/Test/baseResults/hlsl.samplelevel.array.dx10.frag.out
@@ -1,6 +1,7 @@
 hlsl.samplelevel.array.dx10.frag
 Shader version: 500
 gl_FragCoord origin is upper left
+using depth_any
 0:? Sequence
 0:24  Function Definition: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:24    Function Parameters: 
@@ -149,13 +150,13 @@
 0:24          'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:24          Function Call: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:24        move second child to first child ( temp 4-component vector of float)
-0:?           'Color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 0:24          Color: direct index for structure ( temp 4-component vector of float)
 0:24            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:24            Constant:
 0:24              0 (const int)
 0:24        move second child to first child ( temp float)
-0:?           'Depth' ( out float FragDepth)
+0:?           '@entryPointOutput.Depth' ( out float FragDepth)
 0:24          Depth: direct index for structure ( temp float)
 0:24            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:24            Constant:
@@ -172,8 +173,8 @@
 0:?     'g_tTexcdf4a' ( uniform textureCubeArray)
 0:?     'g_tTexcdi4a' ( uniform itextureCubeArray)
 0:?     'g_tTexcdu4a' ( uniform utextureCubeArray)
-0:?     'Color' (layout( location=0) out 4-component vector of float)
-0:?     'Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 
 Linked fragment stage:
@@ -181,6 +182,7 @@
 
 Shader version: 500
 gl_FragCoord origin is upper left
+using depth_any
 0:? Sequence
 0:24  Function Definition: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:24    Function Parameters: 
@@ -329,13 +331,13 @@
 0:24          'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:24          Function Call: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:24        move second child to first child ( temp 4-component vector of float)
-0:?           'Color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 0:24          Color: direct index for structure ( temp 4-component vector of float)
 0:24            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:24            Constant:
 0:24              0 (const int)
 0:24        move second child to first child ( temp float)
-0:?           'Depth' ( out float FragDepth)
+0:?           '@entryPointOutput.Depth' ( out float FragDepth)
 0:24          Depth: direct index for structure ( temp float)
 0:24            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:24            Constant:
@@ -352,11 +354,11 @@
 0:?     'g_tTexcdf4a' ( uniform textureCubeArray)
 0:?     'g_tTexcdi4a' ( uniform itextureCubeArray)
 0:?     'g_tTexcdu4a' ( uniform utextureCubeArray)
-0:?     'Color' (layout( location=0) out 4-component vector of float)
-0:?     'Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 147
 
                               Capability Shader
@@ -366,6 +368,7 @@
                               MemoryModel Logical GLSL450
                               EntryPoint Fragment 4  "main" 139 143
                               ExecutionMode 4 OriginUpperLeft
+                              ExecutionMode 4 DepthReplacing
                               Source HLSL 500
                               Name 4  "main"
                               Name 8  "PS_OUTPUT"
@@ -393,8 +396,8 @@
                               Name 115  "g_tTexcdu4a"
                               Name 126  "psout"
                               Name 136  "flattenTemp"
-                              Name 139  "Color"
-                              Name 143  "Depth"
+                              Name 139  "@entryPointOutput.Color"
+                              Name 143  "@entryPointOutput.Depth"
                               Name 146  "g_tTex1df4"
                               Decorate 16(g_tTex1df4a) DescriptorSet 0
                               Decorate 16(g_tTex1df4a) Binding 1
@@ -408,8 +411,8 @@
                               Decorate 95(g_tTexcdf4a) DescriptorSet 0
                               Decorate 105(g_tTexcdi4a) DescriptorSet 0
                               Decorate 115(g_tTexcdu4a) DescriptorSet 0
-                              Decorate 139(Color) Location 0
-                              Decorate 143(Depth) BuiltIn FragDepth
+                              Decorate 139(@entryPointOutput.Color) Location 0
+                              Decorate 143(@entryPointOutput.Depth) BuiltIn FragDepth
                               Decorate 146(g_tTex1df4) DescriptorSet 0
                               Decorate 146(g_tTex1df4) Binding 0
                2:             TypeVoid
@@ -492,9 +495,9 @@
              130:     30(int) Constant 1
              131:             TypePointer Function 6(float)
              138:             TypePointer Output 7(fvec4)
-      139(Color):    138(ptr) Variable Output
+139(@entryPointOutput.Color):    138(ptr) Variable Output
              142:             TypePointer Output 6(float)
-      143(Depth):    142(ptr) Variable Output
+143(@entryPointOutput.Depth):    142(ptr) Variable Output
  146(g_tTex1df4):     15(ptr) Variable UniformConstant
          4(main):           2 Function None 3
                5:             Label
@@ -503,10 +506,10 @@
                               Store 136(flattenTemp) 137
              140:     12(ptr) AccessChain 136(flattenTemp) 127
              141:    7(fvec4) Load 140
-                              Store 139(Color) 141
+                              Store 139(@entryPointOutput.Color) 141
              144:    131(ptr) AccessChain 136(flattenTemp) 130
              145:    6(float) Load 144
-                              Store 143(Depth) 145
+                              Store 143(@entryPointOutput.Depth) 145
                               Return
                               FunctionEnd
       10(@main():8(PS_OUTPUT) Function None 9
diff --git a/Test/baseResults/hlsl.samplelevel.basic.dx10.frag.out b/Test/baseResults/hlsl.samplelevel.basic.dx10.frag.out
index 6ff36be..9327b84 100644
--- a/Test/baseResults/hlsl.samplelevel.basic.dx10.frag.out
+++ b/Test/baseResults/hlsl.samplelevel.basic.dx10.frag.out
@@ -1,6 +1,7 @@
 hlsl.samplelevel.basic.dx10.frag
 Shader version: 500
 gl_FragCoord origin is upper left
+using depth_any
 0:? Sequence
 0:29  Function Definition: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:29    Function Parameters: 
@@ -179,13 +180,13 @@
 0:29          'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:29          Function Call: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:29        move second child to first child ( temp 4-component vector of float)
-0:?           'Color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 0:29          Color: direct index for structure ( temp 4-component vector of float)
 0:29            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:29            Constant:
 0:29              0 (const int)
 0:29        move second child to first child ( temp float)
-0:?           'Depth' ( out float FragDepth)
+0:?           '@entryPointOutput.Depth' ( out float FragDepth)
 0:29          Depth: direct index for structure ( temp float)
 0:29            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:29            Constant:
@@ -206,8 +207,8 @@
 0:?     'g_tTexcdf4' ( uniform textureCube)
 0:?     'g_tTexcdi4' ( uniform itextureCube)
 0:?     'g_tTexcdu4' ( uniform utextureCube)
-0:?     'Color' (layout( location=0) out 4-component vector of float)
-0:?     'Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 
 Linked fragment stage:
@@ -215,6 +216,7 @@
 
 Shader version: 500
 gl_FragCoord origin is upper left
+using depth_any
 0:? Sequence
 0:29  Function Definition: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:29    Function Parameters: 
@@ -393,13 +395,13 @@
 0:29          'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:29          Function Call: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:29        move second child to first child ( temp 4-component vector of float)
-0:?           'Color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 0:29          Color: direct index for structure ( temp 4-component vector of float)
 0:29            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:29            Constant:
 0:29              0 (const int)
 0:29        move second child to first child ( temp float)
-0:?           'Depth' ( out float FragDepth)
+0:?           '@entryPointOutput.Depth' ( out float FragDepth)
 0:29          Depth: direct index for structure ( temp float)
 0:29            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:29            Constant:
@@ -420,11 +422,11 @@
 0:?     'g_tTexcdf4' ( uniform textureCube)
 0:?     'g_tTexcdi4' ( uniform itextureCube)
 0:?     'g_tTexcdu4' ( uniform utextureCube)
-0:?     'Color' (layout( location=0) out 4-component vector of float)
-0:?     'Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 172
 
                               Capability Shader
@@ -433,6 +435,7 @@
                               MemoryModel Logical GLSL450
                               EntryPoint Fragment 4  "main" 163 167
                               ExecutionMode 4 OriginUpperLeft
+                              ExecutionMode 4 DepthReplacing
                               Source HLSL 500
                               Name 4  "main"
                               Name 8  "PS_OUTPUT"
@@ -466,8 +469,8 @@
                               Name 142  "g_tTexcdu4"
                               Name 149  "psout"
                               Name 160  "flattenTemp"
-                              Name 163  "Color"
-                              Name 167  "Depth"
+                              Name 163  "@entryPointOutput.Color"
+                              Name 167  "@entryPointOutput.Depth"
                               Name 170  "g_sSamp2d"
                               Name 171  "g_tTex1df4a"
                               Decorate 16(g_tTex1df4) DescriptorSet 0
@@ -485,8 +488,8 @@
                               Decorate 124(g_tTexcdf4) DescriptorSet 0
                               Decorate 133(g_tTexcdi4) DescriptorSet 0
                               Decorate 142(g_tTexcdu4) DescriptorSet 0
-                              Decorate 163(Color) Location 0
-                              Decorate 167(Depth) BuiltIn FragDepth
+                              Decorate 163(@entryPointOutput.Color) Location 0
+                              Decorate 167(@entryPointOutput.Depth) BuiltIn FragDepth
                               Decorate 170(g_sSamp2d) DescriptorSet 0
                               Decorate 171(g_tTex1df4a) DescriptorSet 0
                               Decorate 171(g_tTex1df4a) Binding 1
@@ -579,9 +582,9 @@
              154:     27(int) Constant 1
              155:             TypePointer Function 6(float)
              162:             TypePointer Output 7(fvec4)
-      163(Color):    162(ptr) Variable Output
+163(@entryPointOutput.Color):    162(ptr) Variable Output
              166:             TypePointer Output 6(float)
-      167(Depth):    166(ptr) Variable Output
+167(@entryPointOutput.Depth):    166(ptr) Variable Output
   170(g_sSamp2d):     19(ptr) Variable UniformConstant
 171(g_tTex1df4a):     15(ptr) Variable UniformConstant
          4(main):           2 Function None 3
@@ -591,10 +594,10 @@
                               Store 160(flattenTemp) 161
              164:     12(ptr) AccessChain 160(flattenTemp) 150
              165:    7(fvec4) Load 164
-                              Store 163(Color) 165
+                              Store 163(@entryPointOutput.Color) 165
              168:    155(ptr) AccessChain 160(flattenTemp) 154
              169:    6(float) Load 168
-                              Store 167(Depth) 169
+                              Store 167(@entryPointOutput.Depth) 169
                               Return
                               FunctionEnd
       10(@main():8(PS_OUTPUT) Function None 9
diff --git a/Test/baseResults/hlsl.samplelevel.basic.dx10.vert.out b/Test/baseResults/hlsl.samplelevel.basic.dx10.vert.out
index 5b2f950..d2bd1b8 100644
--- a/Test/baseResults/hlsl.samplelevel.basic.dx10.vert.out
+++ b/Test/baseResults/hlsl.samplelevel.basic.dx10.vert.out
@@ -168,7 +168,7 @@
 0:?     Sequence
 0:27      Sequence
 0:27        move second child to first child ( temp 4-component vector of float)
-0:?           '@entryPointOutput_Pos' ( out 4-component vector of float Position)
+0:?           '@entryPointOutput.Pos' ( out 4-component vector of float Position)
 0:27          Pos: direct index for structure ( temp 4-component vector of float)
 0:27            Function Call: @main( ( temp structure{ temp 4-component vector of float Pos})
 0:27            Constant:
@@ -188,7 +188,7 @@
 0:?     'g_tTexcdf4' ( uniform textureCube)
 0:?     'g_tTexcdi4' ( uniform itextureCube)
 0:?     'g_tTexcdu4' ( uniform utextureCube)
-0:?     '@entryPointOutput' (layout( location=0) out structure{})
+0:?     '@entryPointOutput.Pos' ( out 4-component vector of float Position)
 
 
 Linked vertex stage:
@@ -363,7 +363,7 @@
 0:?     Sequence
 0:27      Sequence
 0:27        move second child to first child ( temp 4-component vector of float)
-0:?           '@entryPointOutput_Pos' ( out 4-component vector of float Position)
+0:?           '@entryPointOutput.Pos' ( out 4-component vector of float Position)
 0:27          Pos: direct index for structure ( temp 4-component vector of float)
 0:27            Function Call: @main( ( temp structure{ temp 4-component vector of float Pos})
 0:27            Constant:
@@ -383,17 +383,17 @@
 0:?     'g_tTexcdf4' ( uniform textureCube)
 0:?     'g_tTexcdi4' ( uniform itextureCube)
 0:?     'g_tTexcdu4' ( uniform utextureCube)
-0:?     '@entryPointOutput' (layout( location=0) out structure{})
+0:?     '@entryPointOutput.Pos' ( out 4-component vector of float Position)
 
 // Module Version 10000
-// Generated by (magic number): 80001
-// Id's are bound by 165
+// Generated by (magic number): 80007
+// Id's are bound by 162
 
                               Capability Shader
                               Capability Sampled1D
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Vertex 4  "main" 158 164
+                              EntryPoint Vertex 4  "main" 158
                               Source HLSL 500
                               Name 4  "main"
                               Name 8  "VS_OUTPUT"
@@ -425,10 +425,8 @@
                               Name 139  "txval42"
                               Name 142  "g_tTexcdu4"
                               Name 149  "vsout"
-                              Name 158  "@entryPointOutput_Pos"
+                              Name 158  "@entryPointOutput.Pos"
                               Name 161  "g_tTex1df4a"
-                              Name 162  "VS_OUTPUT"
-                              Name 164  "@entryPointOutput"
                               Decorate 16(g_tTex1df4) DescriptorSet 0
                               Decorate 16(g_tTex1df4) Binding 0
                               Decorate 20(g_sSamp) DescriptorSet 0
@@ -444,10 +442,9 @@
                               Decorate 124(g_tTexcdf4) DescriptorSet 0
                               Decorate 133(g_tTexcdi4) DescriptorSet 0
                               Decorate 142(g_tTexcdu4) DescriptorSet 0
-                              Decorate 158(@entryPointOutput_Pos) BuiltIn Position
+                              Decorate 158(@entryPointOutput.Pos) BuiltIn Position
                               Decorate 161(g_tTex1df4a) DescriptorSet 0
                               Decorate 161(g_tTex1df4a) Binding 1
-                              Decorate 164(@entryPointOutput) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -535,16 +532,13 @@
              151:    6(float) Constant 0
              152:    7(fvec4) ConstantComposite 151 151 151 151
              157:             TypePointer Output 7(fvec4)
-158(@entryPointOutput_Pos):    157(ptr) Variable Output
+158(@entryPointOutput.Pos):    157(ptr) Variable Output
 161(g_tTex1df4a):     15(ptr) Variable UniformConstant
-  162(VS_OUTPUT):             TypeStruct
-             163:             TypePointer Output 162(VS_OUTPUT)
-164(@entryPointOutput):    163(ptr) Variable Output
          4(main):           2 Function None 3
                5:             Label
              159:8(VS_OUTPUT) FunctionCall 10(@main()
              160:    7(fvec4) CompositeExtract 159 0
-                              Store 158(@entryPointOutput_Pos) 160
+                              Store 158(@entryPointOutput.Pos) 160
                               Return
                               FunctionEnd
       10(@main():8(VS_OUTPUT) Function None 9
diff --git a/Test/baseResults/hlsl.samplelevel.offset.dx10.frag.out b/Test/baseResults/hlsl.samplelevel.offset.dx10.frag.out
index 7311ae4..36c932c 100644
--- a/Test/baseResults/hlsl.samplelevel.offset.dx10.frag.out
+++ b/Test/baseResults/hlsl.samplelevel.offset.dx10.frag.out
@@ -1,6 +1,7 @@
 hlsl.samplelevel.offset.dx10.frag
 Shader version: 500
 gl_FragCoord origin is upper left
+using depth_any
 0:? Sequence
 0:28  Function Definition: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:28    Function Parameters: 
@@ -167,13 +168,13 @@
 0:28          'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:28          Function Call: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:28        move second child to first child ( temp 4-component vector of float)
-0:?           'Color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 0:28          Color: direct index for structure ( temp 4-component vector of float)
 0:28            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:28            Constant:
 0:28              0 (const int)
 0:28        move second child to first child ( temp float)
-0:?           'Depth' ( out float FragDepth)
+0:?           '@entryPointOutput.Depth' ( out float FragDepth)
 0:28          Depth: direct index for structure ( temp float)
 0:28            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:28            Constant:
@@ -193,8 +194,8 @@
 0:?     'g_tTexcdf4' ( uniform textureCube)
 0:?     'g_tTexcdi4' ( uniform itextureCube)
 0:?     'g_tTexcdu4' ( uniform utextureCube)
-0:?     'Color' (layout( location=0) out 4-component vector of float)
-0:?     'Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 
 Linked fragment stage:
@@ -202,6 +203,7 @@
 
 Shader version: 500
 gl_FragCoord origin is upper left
+using depth_any
 0:? Sequence
 0:28  Function Definition: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:28    Function Parameters: 
@@ -368,13 +370,13 @@
 0:28          'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:28          Function Call: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:28        move second child to first child ( temp 4-component vector of float)
-0:?           'Color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 0:28          Color: direct index for structure ( temp 4-component vector of float)
 0:28            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:28            Constant:
 0:28              0 (const int)
 0:28        move second child to first child ( temp float)
-0:?           'Depth' ( out float FragDepth)
+0:?           '@entryPointOutput.Depth' ( out float FragDepth)
 0:28          Depth: direct index for structure ( temp float)
 0:28            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:28            Constant:
@@ -394,11 +396,11 @@
 0:?     'g_tTexcdf4' ( uniform textureCube)
 0:?     'g_tTexcdi4' ( uniform itextureCube)
 0:?     'g_tTexcdu4' ( uniform utextureCube)
-0:?     'Color' (layout( location=0) out 4-component vector of float)
-0:?     'Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 162
 
                               Capability Shader
@@ -407,6 +409,7 @@
                               MemoryModel Logical GLSL450
                               EntryPoint Fragment 4  "main" 145 149
                               ExecutionMode 4 OriginUpperLeft
+                              ExecutionMode 4 DepthReplacing
                               Source HLSL 500
                               Name 4  "main"
                               Name 8  "PS_OUTPUT"
@@ -434,8 +437,8 @@
                               Name 121  "g_tTex3du4"
                               Name 133  "psout"
                               Name 142  "flattenTemp"
-                              Name 145  "Color"
-                              Name 149  "Depth"
+                              Name 145  "@entryPointOutput.Color"
+                              Name 149  "@entryPointOutput.Depth"
                               Name 152  "g_tTex1df4a"
                               Name 155  "g_tTexcdf4"
                               Name 158  "g_tTexcdi4"
@@ -452,8 +455,8 @@
                               Decorate 97(g_tTex3df4) DescriptorSet 0
                               Decorate 110(g_tTex3di4) DescriptorSet 0
                               Decorate 121(g_tTex3du4) DescriptorSet 0
-                              Decorate 145(Color) Location 0
-                              Decorate 149(Depth) BuiltIn FragDepth
+                              Decorate 145(@entryPointOutput.Color) Location 0
+                              Decorate 149(@entryPointOutput.Depth) BuiltIn FragDepth
                               Decorate 152(g_tTex1df4a) DescriptorSet 0
                               Decorate 152(g_tTex1df4a) Binding 1
                               Decorate 155(g_tTexcdf4) DescriptorSet 0
@@ -545,9 +548,9 @@
              135:    7(fvec4) ConstantComposite 134 134 134 134
              137:             TypePointer Function 6(float)
              144:             TypePointer Output 7(fvec4)
-      145(Color):    144(ptr) Variable Output
+145(@entryPointOutput.Color):    144(ptr) Variable Output
              148:             TypePointer Output 6(float)
-      149(Depth):    148(ptr) Variable Output
+149(@entryPointOutput.Depth):    148(ptr) Variable Output
 152(g_tTex1df4a):     15(ptr) Variable UniformConstant
              153:             TypeImage 6(float) Cube sampled format:Unknown
              154:             TypePointer UniformConstant 153
@@ -565,10 +568,10 @@
                               Store 142(flattenTemp) 143
              146:     12(ptr) AccessChain 142(flattenTemp) 65
              147:    7(fvec4) Load 146
-                              Store 145(Color) 147
+                              Store 145(@entryPointOutput.Color) 147
              150:    137(ptr) AccessChain 142(flattenTemp) 27
              151:    6(float) Load 150
-                              Store 149(Depth) 151
+                              Store 149(@entryPointOutput.Depth) 151
                               Return
                               FunctionEnd
       10(@main():8(PS_OUTPUT) Function None 9
diff --git a/Test/baseResults/hlsl.samplelevel.offsetarray.dx10.frag.out b/Test/baseResults/hlsl.samplelevel.offsetarray.dx10.frag.out
index 223bfaf..bc6fd6b 100644
--- a/Test/baseResults/hlsl.samplelevel.offsetarray.dx10.frag.out
+++ b/Test/baseResults/hlsl.samplelevel.offsetarray.dx10.frag.out
@@ -1,6 +1,7 @@
 hlsl.samplelevel.offsetarray.dx10.frag
 Shader version: 500
 gl_FragCoord origin is upper left
+using depth_any
 0:? Sequence
 0:20  Function Definition: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:20    Function Parameters: 
@@ -122,13 +123,13 @@
 0:20          'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:20          Function Call: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:20        move second child to first child ( temp 4-component vector of float)
-0:?           'Color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 0:20          Color: direct index for structure ( temp 4-component vector of float)
 0:20            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:20            Constant:
 0:20              0 (const int)
 0:20        move second child to first child ( temp float)
-0:?           'Depth' ( out float FragDepth)
+0:?           '@entryPointOutput.Depth' ( out float FragDepth)
 0:20          Depth: direct index for structure ( temp float)
 0:20            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:20            Constant:
@@ -142,8 +143,8 @@
 0:?     'g_tTex2df4' ( uniform texture2DArray)
 0:?     'g_tTex2di4' ( uniform itexture2DArray)
 0:?     'g_tTex2du4' ( uniform utexture2DArray)
-0:?     'Color' (layout( location=0) out 4-component vector of float)
-0:?     'Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 
 Linked fragment stage:
@@ -151,6 +152,7 @@
 
 Shader version: 500
 gl_FragCoord origin is upper left
+using depth_any
 0:? Sequence
 0:20  Function Definition: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:20    Function Parameters: 
@@ -272,13 +274,13 @@
 0:20          'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:20          Function Call: @main( ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:20        move second child to first child ( temp 4-component vector of float)
-0:?           'Color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 0:20          Color: direct index for structure ( temp 4-component vector of float)
 0:20            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:20            Constant:
 0:20              0 (const int)
 0:20        move second child to first child ( temp float)
-0:?           'Depth' ( out float FragDepth)
+0:?           '@entryPointOutput.Depth' ( out float FragDepth)
 0:20          Depth: direct index for structure ( temp float)
 0:20            'flattenTemp' ( temp structure{ temp 4-component vector of float Color,  temp float Depth})
 0:20            Constant:
@@ -292,11 +294,11 @@
 0:?     'g_tTex2df4' ( uniform texture2DArray)
 0:?     'g_tTex2di4' ( uniform itexture2DArray)
 0:?     'g_tTex2du4' ( uniform utexture2DArray)
-0:?     'Color' (layout( location=0) out 4-component vector of float)
-0:?     'Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Depth' ( out float FragDepth)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 119
 
                               Capability Shader
@@ -305,6 +307,7 @@
                               MemoryModel Logical GLSL450
                               EntryPoint Fragment 4  "main" 111 115
                               ExecutionMode 4 OriginUpperLeft
+                              ExecutionMode 4 DepthReplacing
                               Source HLSL 500
                               Name 4  "main"
                               Name 8  "PS_OUTPUT"
@@ -326,8 +329,8 @@
                               Name 88  "g_tTex2du4"
                               Name 99  "psout"
                               Name 108  "flattenTemp"
-                              Name 111  "Color"
-                              Name 115  "Depth"
+                              Name 111  "@entryPointOutput.Color"
+                              Name 115  "@entryPointOutput.Depth"
                               Name 118  "g_tTex1df4a"
                               Decorate 16(g_tTex1df4) DescriptorSet 0
                               Decorate 16(g_tTex1df4) Binding 0
@@ -338,8 +341,8 @@
                               Decorate 64(g_tTex2df4) DescriptorSet 0
                               Decorate 77(g_tTex2di4) DescriptorSet 0
                               Decorate 88(g_tTex2du4) DescriptorSet 0
-                              Decorate 111(Color) Location 0
-                              Decorate 115(Depth) BuiltIn FragDepth
+                              Decorate 111(@entryPointOutput.Color) Location 0
+                              Decorate 115(@entryPointOutput.Depth) BuiltIn FragDepth
                               Decorate 118(g_tTex1df4a) DescriptorSet 0
                               Decorate 118(g_tTex1df4a) Binding 1
                2:             TypeVoid
@@ -409,9 +412,9 @@
              101:    7(fvec4) ConstantComposite 100 100 100 100
              103:             TypePointer Function 6(float)
              110:             TypePointer Output 7(fvec4)
-      111(Color):    110(ptr) Variable Output
+111(@entryPointOutput.Color):    110(ptr) Variable Output
              114:             TypePointer Output 6(float)
-      115(Depth):    114(ptr) Variable Output
+115(@entryPointOutput.Depth):    114(ptr) Variable Output
 118(g_tTex1df4a):     15(ptr) Variable UniformConstant
          4(main):           2 Function None 3
                5:             Label
@@ -420,10 +423,10 @@
                               Store 108(flattenTemp) 109
              112:     12(ptr) AccessChain 108(flattenTemp) 30
              113:    7(fvec4) Load 112
-                              Store 111(Color) 113
+                              Store 111(@entryPointOutput.Color) 113
              116:    103(ptr) AccessChain 108(flattenTemp) 44
              117:    6(float) Load 116
-                              Store 115(Depth) 117
+                              Store 115(@entryPointOutput.Depth) 117
                               Return
                               FunctionEnd
       10(@main():8(PS_OUTPUT) Function None 9
diff --git a/Test/baseResults/hlsl.scalar-length.frag.out b/Test/baseResults/hlsl.scalar-length.frag.out
index 2854835..aa11af5 100644
--- a/Test/baseResults/hlsl.scalar-length.frag.out
+++ b/Test/baseResults/hlsl.scalar-length.frag.out
@@ -64,7 +64,7 @@
 0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 30
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.scalar2matrix.frag.out b/Test/baseResults/hlsl.scalar2matrix.frag.out
new file mode 100644
index 0000000..57d250e
--- /dev/null
+++ b/Test/baseResults/hlsl.scalar2matrix.frag.out
@@ -0,0 +1,506 @@
+hlsl.scalar2matrix.frag
+Shader version: 500
+gl_FragCoord origin is upper left
+0:? Sequence
+0:2  Function Definition: Fn1(mf44; ( temp void)
+0:2    Function Parameters: 
+0:2      'p' ( in 4X4 matrix of float)
+0:5  Function Definition: @main( ( temp 4-component vector of float)
+0:5    Function Parameters: 
+0:?     Sequence
+0:10      Sequence
+0:10        move second child to first child ( temp 4X4 matrix of float)
+0:10          'mat1' ( temp 4X4 matrix of float)
+0:10          Constant:
+0:10            0.250000
+0:10            0.250000
+0:10            0.250000
+0:10            0.250000
+0:10            0.250000
+0:10            0.250000
+0:10            0.250000
+0:10            0.250000
+0:10            0.250000
+0:10            0.250000
+0:10            0.250000
+0:10            0.250000
+0:10            0.250000
+0:10            0.250000
+0:10            0.250000
+0:10            0.250000
+0:11      Sequence
+0:11        move second child to first child ( temp 4X4 matrix of float)
+0:11          'mat2' ( temp 4X4 matrix of float)
+0:11          Constant:
+0:11            3.000000
+0:11            3.100000
+0:11            3.200000
+0:11            0.000000
+0:11            0.000000
+0:11            0.000000
+0:11            0.000000
+0:11            0.000000
+0:11            0.000000
+0:11            0.000000
+0:11            0.000000
+0:11            0.000000
+0:11            0.000000
+0:11            0.000000
+0:11            0.000000
+0:11            0.000000
+0:12      Sequence
+0:12        move second child to first child ( temp 4X4 matrix of float)
+0:12          'mat3' ( temp 4X4 matrix of float)
+0:12          Constant:
+0:12            0.375000
+0:12            0.375000
+0:12            0.375000
+0:12            0.375000
+0:12            0.375000
+0:12            0.375000
+0:12            0.375000
+0:12            0.375000
+0:12            0.375000
+0:12            0.375000
+0:12            0.375000
+0:12            0.375000
+0:12            0.375000
+0:12            0.375000
+0:12            0.375000
+0:12            0.375000
+0:16      move second child to first child ( temp 4X4 matrix of float)
+0:16        'mat4' ( temp 4X4 matrix of float)
+0:16        Constant:
+0:16          0.750000
+0:16          0.750000
+0:16          0.750000
+0:16          0.750000
+0:16          0.750000
+0:16          0.750000
+0:16          0.750000
+0:16          0.750000
+0:16          0.750000
+0:16          0.750000
+0:16          0.750000
+0:16          0.750000
+0:16          0.750000
+0:16          0.750000
+0:16          0.750000
+0:16          0.750000
+0:17      move second child to first child ( temp 4X4 matrix of float)
+0:17        'mat4' ( temp 4X4 matrix of float)
+0:?         Constant:
+0:?           4.000000
+0:?           4.100000
+0:?           4.200000
+0:?           0.000000
+0:?           0.000000
+0:?           0.000000
+0:?           0.000000
+0:?           0.000000
+0:?           0.000000
+0:?           0.000000
+0:?           0.000000
+0:?           0.000000
+0:?           0.000000
+0:?           0.000000
+0:?           0.000000
+0:?           0.000000
+0:18      move second child to first child ( temp 4X4 matrix of float)
+0:18        'mat4' ( temp 4X4 matrix of float)
+0:18        Constant:
+0:18          0.500000
+0:18          0.500000
+0:18          0.500000
+0:18          0.500000
+0:18          0.500000
+0:18          0.500000
+0:18          0.500000
+0:18          0.500000
+0:18          0.500000
+0:18          0.500000
+0:18          0.500000
+0:18          0.500000
+0:18          0.500000
+0:18          0.500000
+0:18          0.500000
+0:18          0.500000
+0:20      matrix scale second child into first child ( temp 4X4 matrix of float)
+0:20        'mat4' ( temp 4X4 matrix of float)
+0:20        Constant:
+0:20          0.750000
+0:21      add second child into first child ( temp 4X4 matrix of float)
+0:21        'mat4' ( temp 4X4 matrix of float)
+0:21        Constant:
+0:21          0.750000
+0:22      subtract second child into first child ( temp 4X4 matrix of float)
+0:22        'mat4' ( temp 4X4 matrix of float)
+0:22        Constant:
+0:22          0.500000
+0:23      divide second child into first child ( temp 4X4 matrix of float)
+0:23        'mat4' ( temp 4X4 matrix of float)
+0:23        Constant:
+0:23          2.000000
+0:25      Function Call: Fn1(mf44; ( temp void)
+0:25        Constant:
+0:25          5.000000
+0:25          5.000000
+0:25          5.000000
+0:25          5.000000
+0:25          5.000000
+0:25          5.000000
+0:25          5.000000
+0:25          5.000000
+0:25          5.000000
+0:25          5.000000
+0:25          5.000000
+0:25          5.000000
+0:25          5.000000
+0:25          5.000000
+0:25          5.000000
+0:25          5.000000
+0:27      Branch: Return with expression
+0:27        add ( temp 4-component vector of float)
+0:27          add ( temp 4-component vector of float)
+0:27            Constant:
+0:27              0.300000
+0:27              0.300000
+0:27              0.300000
+0:27              0.300000
+0:27            direct index ( temp 4-component vector of float)
+0:27              'mat1' ( temp 4X4 matrix of float)
+0:27              Constant:
+0:27                1 (const int)
+0:27          direct index ( temp 4-component vector of float)
+0:27            'mat4' ( temp 4X4 matrix of float)
+0:27            Constant:
+0:27              2 (const int)
+0:5  Function Definition: main( ( temp void)
+0:5    Function Parameters: 
+0:?     Sequence
+0:5      move second child to first child ( temp 4-component vector of float)
+0:?         '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+0:5        Function Call: @main( ( temp 4-component vector of float)
+0:?   Linker Objects
+0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+
+
+Linked fragment stage:
+
+
+Shader version: 500
+gl_FragCoord origin is upper left
+0:? Sequence
+0:2  Function Definition: Fn1(mf44; ( temp void)
+0:2    Function Parameters: 
+0:2      'p' ( in 4X4 matrix of float)
+0:5  Function Definition: @main( ( temp 4-component vector of float)
+0:5    Function Parameters: 
+0:?     Sequence
+0:10      Sequence
+0:10        move second child to first child ( temp 4X4 matrix of float)
+0:10          'mat1' ( temp 4X4 matrix of float)
+0:10          Constant:
+0:10            0.250000
+0:10            0.250000
+0:10            0.250000
+0:10            0.250000
+0:10            0.250000
+0:10            0.250000
+0:10            0.250000
+0:10            0.250000
+0:10            0.250000
+0:10            0.250000
+0:10            0.250000
+0:10            0.250000
+0:10            0.250000
+0:10            0.250000
+0:10            0.250000
+0:10            0.250000
+0:11      Sequence
+0:11        move second child to first child ( temp 4X4 matrix of float)
+0:11          'mat2' ( temp 4X4 matrix of float)
+0:11          Constant:
+0:11            3.000000
+0:11            3.100000
+0:11            3.200000
+0:11            0.000000
+0:11            0.000000
+0:11            0.000000
+0:11            0.000000
+0:11            0.000000
+0:11            0.000000
+0:11            0.000000
+0:11            0.000000
+0:11            0.000000
+0:11            0.000000
+0:11            0.000000
+0:11            0.000000
+0:11            0.000000
+0:12      Sequence
+0:12        move second child to first child ( temp 4X4 matrix of float)
+0:12          'mat3' ( temp 4X4 matrix of float)
+0:12          Constant:
+0:12            0.375000
+0:12            0.375000
+0:12            0.375000
+0:12            0.375000
+0:12            0.375000
+0:12            0.375000
+0:12            0.375000
+0:12            0.375000
+0:12            0.375000
+0:12            0.375000
+0:12            0.375000
+0:12            0.375000
+0:12            0.375000
+0:12            0.375000
+0:12            0.375000
+0:12            0.375000
+0:16      move second child to first child ( temp 4X4 matrix of float)
+0:16        'mat4' ( temp 4X4 matrix of float)
+0:16        Constant:
+0:16          0.750000
+0:16          0.750000
+0:16          0.750000
+0:16          0.750000
+0:16          0.750000
+0:16          0.750000
+0:16          0.750000
+0:16          0.750000
+0:16          0.750000
+0:16          0.750000
+0:16          0.750000
+0:16          0.750000
+0:16          0.750000
+0:16          0.750000
+0:16          0.750000
+0:16          0.750000
+0:17      move second child to first child ( temp 4X4 matrix of float)
+0:17        'mat4' ( temp 4X4 matrix of float)
+0:?         Constant:
+0:?           4.000000
+0:?           4.100000
+0:?           4.200000
+0:?           0.000000
+0:?           0.000000
+0:?           0.000000
+0:?           0.000000
+0:?           0.000000
+0:?           0.000000
+0:?           0.000000
+0:?           0.000000
+0:?           0.000000
+0:?           0.000000
+0:?           0.000000
+0:?           0.000000
+0:?           0.000000
+0:18      move second child to first child ( temp 4X4 matrix of float)
+0:18        'mat4' ( temp 4X4 matrix of float)
+0:18        Constant:
+0:18          0.500000
+0:18          0.500000
+0:18          0.500000
+0:18          0.500000
+0:18          0.500000
+0:18          0.500000
+0:18          0.500000
+0:18          0.500000
+0:18          0.500000
+0:18          0.500000
+0:18          0.500000
+0:18          0.500000
+0:18          0.500000
+0:18          0.500000
+0:18          0.500000
+0:18          0.500000
+0:20      matrix scale second child into first child ( temp 4X4 matrix of float)
+0:20        'mat4' ( temp 4X4 matrix of float)
+0:20        Constant:
+0:20          0.750000
+0:21      add second child into first child ( temp 4X4 matrix of float)
+0:21        'mat4' ( temp 4X4 matrix of float)
+0:21        Constant:
+0:21          0.750000
+0:22      subtract second child into first child ( temp 4X4 matrix of float)
+0:22        'mat4' ( temp 4X4 matrix of float)
+0:22        Constant:
+0:22          0.500000
+0:23      divide second child into first child ( temp 4X4 matrix of float)
+0:23        'mat4' ( temp 4X4 matrix of float)
+0:23        Constant:
+0:23          2.000000
+0:25      Function Call: Fn1(mf44; ( temp void)
+0:25        Constant:
+0:25          5.000000
+0:25          5.000000
+0:25          5.000000
+0:25          5.000000
+0:25          5.000000
+0:25          5.000000
+0:25          5.000000
+0:25          5.000000
+0:25          5.000000
+0:25          5.000000
+0:25          5.000000
+0:25          5.000000
+0:25          5.000000
+0:25          5.000000
+0:25          5.000000
+0:25          5.000000
+0:27      Branch: Return with expression
+0:27        add ( temp 4-component vector of float)
+0:27          add ( temp 4-component vector of float)
+0:27            Constant:
+0:27              0.300000
+0:27              0.300000
+0:27              0.300000
+0:27              0.300000
+0:27            direct index ( temp 4-component vector of float)
+0:27              'mat1' ( temp 4X4 matrix of float)
+0:27              Constant:
+0:27                1 (const int)
+0:27          direct index ( temp 4-component vector of float)
+0:27            'mat4' ( temp 4X4 matrix of float)
+0:27            Constant:
+0:27              2 (const int)
+0:5  Function Definition: main( ( temp void)
+0:5    Function Parameters: 
+0:?     Sequence
+0:5      move second child to first child ( temp 4-component vector of float)
+0:?         '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+0:5        Function Call: @main( ( temp 4-component vector of float)
+0:?   Linker Objects
+0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 96
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 94
+                              ExecutionMode 4 OriginUpperLeft
+                              Source HLSL 500
+                              Name 4  "main"
+                              Name 12  "Fn1(mf44;"
+                              Name 11  "p"
+                              Name 15  "@main("
+                              Name 17  "mat1"
+                              Name 21  "mat2"
+                              Name 29  "mat3"
+                              Name 33  "mat4"
+                              Name 77  "param"
+                              Name 94  "@entryPointOutput"
+                              Decorate 94(@entryPointOutput) Location 0
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+               8:             TypeMatrix 7(fvec4) 4
+               9:             TypePointer Function 8
+              10:             TypeFunction 2 9(ptr)
+              14:             TypeFunction 7(fvec4)
+              18:    6(float) Constant 1048576000
+              19:    7(fvec4) ConstantComposite 18 18 18 18
+              20:           8 ConstantComposite 19 19 19 19
+              22:    6(float) Constant 1077936128
+              23:    6(float) Constant 1078355558
+              24:    6(float) Constant 1078774989
+              25:    6(float) Constant 0
+              26:    7(fvec4) ConstantComposite 22 23 24 25
+              27:    7(fvec4) ConstantComposite 25 25 25 25
+              28:           8 ConstantComposite 26 27 27 27
+              30:    6(float) Constant 1052770304
+              31:    7(fvec4) ConstantComposite 30 30 30 30
+              32:           8 ConstantComposite 31 31 31 31
+              34:    6(float) Constant 1061158912
+              35:    7(fvec4) ConstantComposite 34 34 34 34
+              36:           8 ConstantComposite 35 35 35 35
+              37:    6(float) Constant 1082130432
+              38:    6(float) Constant 1082340147
+              39:    6(float) Constant 1082549862
+              40:    7(fvec4) ConstantComposite 37 38 39 25
+              41:           8 ConstantComposite 40 27 27 27
+              42:    6(float) Constant 1056964608
+              43:    7(fvec4) ConstantComposite 42 42 42 42
+              44:           8 ConstantComposite 43 43 43 43
+              69:    6(float) Constant 1073741824
+              71:    6(float) Constant 1065353216
+              74:    6(float) Constant 1084227584
+              75:    7(fvec4) ConstantComposite 74 74 74 74
+              76:           8 ConstantComposite 75 75 75 75
+              79:    6(float) Constant 1050253722
+              80:    7(fvec4) ConstantComposite 79 79 79 79
+              81:             TypeInt 32 1
+              82:     81(int) Constant 1
+              83:             TypePointer Function 7(fvec4)
+              87:     81(int) Constant 2
+              93:             TypePointer Output 7(fvec4)
+94(@entryPointOutput):     93(ptr) Variable Output
+         4(main):           2 Function None 3
+               5:             Label
+              95:    7(fvec4) FunctionCall 15(@main()
+                              Store 94(@entryPointOutput) 95
+                              Return
+                              FunctionEnd
+   12(Fn1(mf44;):           2 Function None 10
+           11(p):      9(ptr) FunctionParameter
+              13:             Label
+                              Return
+                              FunctionEnd
+      15(@main():    7(fvec4) Function None 14
+              16:             Label
+        17(mat1):      9(ptr) Variable Function
+        21(mat2):      9(ptr) Variable Function
+        29(mat3):      9(ptr) Variable Function
+        33(mat4):      9(ptr) Variable Function
+       77(param):      9(ptr) Variable Function
+                              Store 17(mat1) 20
+                              Store 21(mat2) 28
+                              Store 29(mat3) 32
+                              Store 33(mat4) 36
+                              Store 33(mat4) 41
+                              Store 33(mat4) 44
+              45:           8 Load 33(mat4)
+              46:           8 MatrixTimesScalar 45 34
+                              Store 33(mat4) 46
+              47:           8 Load 33(mat4)
+              48:    7(fvec4) CompositeConstruct 34 34 34 34
+              49:    7(fvec4) CompositeExtract 47 0
+              50:    7(fvec4) FAdd 49 48
+              51:    7(fvec4) CompositeExtract 47 1
+              52:    7(fvec4) FAdd 51 48
+              53:    7(fvec4) CompositeExtract 47 2
+              54:    7(fvec4) FAdd 53 48
+              55:    7(fvec4) CompositeExtract 47 3
+              56:    7(fvec4) FAdd 55 48
+              57:           8 CompositeConstruct 50 52 54 56
+                              Store 33(mat4) 57
+              58:           8 Load 33(mat4)
+              59:    7(fvec4) CompositeConstruct 42 42 42 42
+              60:    7(fvec4) CompositeExtract 58 0
+              61:    7(fvec4) FSub 60 59
+              62:    7(fvec4) CompositeExtract 58 1
+              63:    7(fvec4) FSub 62 59
+              64:    7(fvec4) CompositeExtract 58 2
+              65:    7(fvec4) FSub 64 59
+              66:    7(fvec4) CompositeExtract 58 3
+              67:    7(fvec4) FSub 66 59
+              68:           8 CompositeConstruct 61 63 65 67
+                              Store 33(mat4) 68
+              70:           8 Load 33(mat4)
+              72:    6(float) FDiv 71 69
+              73:           8 MatrixTimesScalar 70 72
+                              Store 33(mat4) 73
+                              Store 77(param) 76
+              78:           2 FunctionCall 12(Fn1(mf44;) 77(param)
+              84:     83(ptr) AccessChain 17(mat1) 82
+              85:    7(fvec4) Load 84
+              86:    7(fvec4) FAdd 80 85
+              88:     83(ptr) AccessChain 33(mat4) 87
+              89:    7(fvec4) Load 88
+              90:    7(fvec4) FAdd 86 89
+                              ReturnValue 90
+                              FunctionEnd
diff --git a/Test/baseResults/hlsl.scalarCast.vert.out b/Test/baseResults/hlsl.scalarCast.vert.out
old mode 100755
new mode 100644
index c7ac142..0e07c9f
--- a/Test/baseResults/hlsl.scalarCast.vert.out
+++ b/Test/baseResults/hlsl.scalarCast.vert.out
@@ -143,22 +143,20 @@
 0:29          'flattenTemp' ( temp structure{ temp 4-component vector of float position,  temp 2-component vector of float texCoord})
 0:29          Function Call: @main( ( temp structure{ temp 4-component vector of float position,  temp 2-component vector of float texCoord})
 0:29        move second child to first child ( temp 4-component vector of float)
-0:?           '@entryPointOutput_position' ( out 4-component vector of float Position)
+0:?           '@entryPointOutput.position' ( out 4-component vector of float Position)
 0:29          position: direct index for structure ( temp 4-component vector of float)
 0:29            'flattenTemp' ( temp structure{ temp 4-component vector of float position,  temp 2-component vector of float texCoord})
 0:29            Constant:
 0:29              0 (const int)
 0:29        move second child to first child ( temp 2-component vector of float)
-0:29          texCoord: direct index for structure ( temp 2-component vector of float)
-0:29            '@entryPointOutput' (layout( location=0) out structure{ temp 2-component vector of float texCoord})
-0:29            Constant:
-0:29              0 (const int)
+0:?           '@entryPointOutput.texCoord' (layout( location=0) out 2-component vector of float)
 0:29          texCoord: direct index for structure ( temp 2-component vector of float)
 0:29            'flattenTemp' ( temp structure{ temp 4-component vector of float position,  temp 2-component vector of float texCoord})
 0:29            Constant:
 0:29              1 (const int)
 0:?   Linker Objects
-0:?     '@entryPointOutput' (layout( location=0) out structure{ temp 2-component vector of float texCoord})
+0:?     '@entryPointOutput.position' ( out 4-component vector of float Position)
+0:?     '@entryPointOutput.texCoord' (layout( location=0) out 2-component vector of float)
 
 
 Linked vertex stage:
@@ -308,31 +306,29 @@
 0:29          'flattenTemp' ( temp structure{ temp 4-component vector of float position,  temp 2-component vector of float texCoord})
 0:29          Function Call: @main( ( temp structure{ temp 4-component vector of float position,  temp 2-component vector of float texCoord})
 0:29        move second child to first child ( temp 4-component vector of float)
-0:?           '@entryPointOutput_position' ( out 4-component vector of float Position)
+0:?           '@entryPointOutput.position' ( out 4-component vector of float Position)
 0:29          position: direct index for structure ( temp 4-component vector of float)
 0:29            'flattenTemp' ( temp structure{ temp 4-component vector of float position,  temp 2-component vector of float texCoord})
 0:29            Constant:
 0:29              0 (const int)
 0:29        move second child to first child ( temp 2-component vector of float)
-0:29          texCoord: direct index for structure ( temp 2-component vector of float)
-0:29            '@entryPointOutput' (layout( location=0) out structure{ temp 2-component vector of float texCoord})
-0:29            Constant:
-0:29              0 (const int)
+0:?           '@entryPointOutput.texCoord' (layout( location=0) out 2-component vector of float)
 0:29          texCoord: direct index for structure ( temp 2-component vector of float)
 0:29            'flattenTemp' ( temp structure{ temp 4-component vector of float position,  temp 2-component vector of float texCoord})
 0:29            Constant:
 0:29              1 (const int)
 0:?   Linker Objects
-0:?     '@entryPointOutput' (layout( location=0) out structure{ temp 2-component vector of float texCoord})
+0:?     '@entryPointOutput.position' ( out 4-component vector of float Position)
+0:?     '@entryPointOutput.texCoord' (layout( location=0) out 2-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80001
-// Id's are bound by 123
+// Generated by (magic number): 80007
+// Id's are bound by 120
 
                               Capability Shader
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Vertex 4  "main" 108 116
+                              EntryPoint Vertex 4  "main" 108 115
                               Source HLSL 500
                               Name 4  "main"
                               Name 9  "VertexOut"
@@ -357,12 +353,10 @@
                               Name 96  "v4"
                               Name 98  "v5"
                               Name 105  "flattenTemp"
-                              Name 108  "@entryPointOutput_position"
-                              Name 114  "VertexOut"
-                              MemberName 114(VertexOut) 0  "texCoord"
-                              Name 116  "@entryPointOutput"
-                              Decorate 108(@entryPointOutput_position) BuiltIn Position
-                              Decorate 116(@entryPointOutput) Location 0
+                              Name 108  "@entryPointOutput.position"
+                              Name 115  "@entryPointOutput.texCoord"
+                              Decorate 108(@entryPointOutput.position) BuiltIn Position
+                              Decorate 115(@entryPointOutput.texCoord) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -389,16 +383,14 @@
              101:    8(fvec2) ConstantComposite 59 59
              102:9(VertexOut) ConstantComposite 100 101
              107:             TypePointer Output 7(fvec4)
-108(@entryPointOutput_position):    107(ptr) Variable Output
+108(@entryPointOutput.position):    107(ptr) Variable Output
              109:             TypeInt 32 1
              110:    109(int) Constant 0
              111:             TypePointer Function 7(fvec4)
-  114(VertexOut):             TypeStruct 8(fvec2)
-             115:             TypePointer Output 114(VertexOut)
-116(@entryPointOutput):    115(ptr) Variable Output
-             117:    109(int) Constant 1
-             118:             TypePointer Function 8(fvec2)
-             121:             TypePointer Output 8(fvec2)
+             114:             TypePointer Output 8(fvec2)
+115(@entryPointOutput.texCoord):    114(ptr) Variable Output
+             116:    109(int) Constant 1
+             117:             TypePointer Function 8(fvec2)
          4(main):           2 Function None 3
                5:             Label
 105(flattenTemp):     87(ptr) Variable Function
@@ -406,11 +398,10 @@
                               Store 105(flattenTemp) 106
              112:    111(ptr) AccessChain 105(flattenTemp) 110
              113:    7(fvec4) Load 112
-                              Store 108(@entryPointOutput_position) 113
-             119:    118(ptr) AccessChain 105(flattenTemp) 117
-             120:    8(fvec2) Load 119
-             122:    121(ptr) AccessChain 116(@entryPointOutput) 110
-                              Store 122 120
+                              Store 108(@entryPointOutput.position) 113
+             118:    117(ptr) AccessChain 105(flattenTemp) 116
+             119:    8(fvec2) Load 118
+                              Store 115(@entryPointOutput.texCoord) 119
                               Return
                               FunctionEnd
          11(r0():9(VertexOut) Function None 10
diff --git a/Test/baseResults/hlsl.scope.frag.out b/Test/baseResults/hlsl.scope.frag.out
old mode 100755
new mode 100644
index 32eeeef..b563380
--- a/Test/baseResults/hlsl.scope.frag.out
+++ b/Test/baseResults/hlsl.scope.frag.out
@@ -102,7 +102,7 @@
 0:?     'input' (layout( location=0) in 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 49
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.self_cast.frag.out b/Test/baseResults/hlsl.self_cast.frag.out
new file mode 100644
index 0000000..9d398ed
--- /dev/null
+++ b/Test/baseResults/hlsl.self_cast.frag.out
@@ -0,0 +1,130 @@
+hlsl.self_cast.frag
+Shader version: 500
+gl_FragCoord origin is upper left
+0:? Sequence
+0:5  Function Definition: @main( ( temp void)
+0:5    Function Parameters: 
+0:?     Sequence
+0:?       Sequence
+0:8        Sequence
+0:8          move second child to first child ( temp structure{})
+0:8            'b' ( temp structure{})
+0:8            'a' ( temp structure{})
+0:?       Sequence
+0:13        Sequence
+0:13          move second child to first child ( temp structure{ temp float f})
+0:13            'b' ( temp structure{ temp float f})
+0:13            'a' ( temp structure{ temp float f})
+0:?       Sequence
+0:18        Sequence
+0:18          move second child to first child ( temp 2-element array of structure{})
+0:18            'b' ( temp 2-element array of structure{})
+0:18            'a' ( temp 2-element array of structure{})
+0:?       Sequence
+0:23        Sequence
+0:23          move second child to first child ( temp 2-element array of structure{ temp float f})
+0:23            'b' ( temp 2-element array of structure{ temp float f})
+0:23            'a' ( temp 2-element array of structure{ temp float f})
+0:5  Function Definition: main( ( temp void)
+0:5    Function Parameters: 
+0:?     Sequence
+0:5      Function Call: @main( ( temp void)
+0:?   Linker Objects
+
+
+Linked fragment stage:
+
+
+Shader version: 500
+gl_FragCoord origin is upper left
+0:? Sequence
+0:5  Function Definition: @main( ( temp void)
+0:5    Function Parameters: 
+0:?     Sequence
+0:?       Sequence
+0:8        Sequence
+0:8          move second child to first child ( temp structure{})
+0:8            'b' ( temp structure{})
+0:8            'a' ( temp structure{})
+0:?       Sequence
+0:13        Sequence
+0:13          move second child to first child ( temp structure{ temp float f})
+0:13            'b' ( temp structure{ temp float f})
+0:13            'a' ( temp structure{ temp float f})
+0:?       Sequence
+0:18        Sequence
+0:18          move second child to first child ( temp 2-element array of structure{})
+0:18            'b' ( temp 2-element array of structure{})
+0:18            'a' ( temp 2-element array of structure{})
+0:?       Sequence
+0:23        Sequence
+0:23          move second child to first child ( temp 2-element array of structure{ temp float f})
+0:23            'b' ( temp 2-element array of structure{ temp float f})
+0:23            'a' ( temp 2-element array of structure{ temp float f})
+0:5  Function Definition: main( ( temp void)
+0:5    Function Parameters: 
+0:?     Sequence
+0:5      Function Call: @main( ( temp void)
+0:?   Linker Objects
+
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 32
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main"
+                              ExecutionMode 4 OriginUpperLeft
+                              Source HLSL 500
+                              Name 4  "main"
+                              Name 6  "@main("
+                              Name 8  "Test0"
+                              Name 10  "b"
+                              Name 11  "a"
+                              Name 14  "Test1"
+                              MemberName 14(Test1) 0  "f"
+                              Name 16  "b"
+                              Name 17  "a"
+                              Name 23  "b"
+                              Name 24  "a"
+                              Name 28  "b"
+                              Name 29  "a"
+               2:             TypeVoid
+               3:             TypeFunction 2
+        8(Test0):             TypeStruct
+               9:             TypePointer Function 8(Test0)
+              13:             TypeFloat 32
+       14(Test1):             TypeStruct 13(float)
+              15:             TypePointer Function 14(Test1)
+              19:             TypeInt 32 0
+              20:     19(int) Constant 2
+              21:             TypeArray 8(Test0) 20
+              22:             TypePointer Function 21
+              26:             TypeArray 14(Test1) 20
+              27:             TypePointer Function 26
+         4(main):           2 Function None 3
+               5:             Label
+              31:           2 FunctionCall 6(@main()
+                              Return
+                              FunctionEnd
+       6(@main():           2 Function None 3
+               7:             Label
+           10(b):      9(ptr) Variable Function
+           11(a):      9(ptr) Variable Function
+           16(b):     15(ptr) Variable Function
+           17(a):     15(ptr) Variable Function
+           23(b):     22(ptr) Variable Function
+           24(a):     22(ptr) Variable Function
+           28(b):     27(ptr) Variable Function
+           29(a):     27(ptr) Variable Function
+              12:    8(Test0) Load 11(a)
+                              Store 10(b) 12
+              18:   14(Test1) Load 17(a)
+                              Store 16(b) 18
+              25:          21 Load 24(a)
+                              Store 23(b) 25
+              30:          26 Load 29(a)
+                              Store 28(b) 30
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/hlsl.semantic-1.vert.out b/Test/baseResults/hlsl.semantic-1.vert.out
new file mode 100644
index 0000000..b5e4091
--- /dev/null
+++ b/Test/baseResults/hlsl.semantic-1.vert.out
@@ -0,0 +1,374 @@
+hlsl.semantic-1.vert
+Shader version: 500
+0:? Sequence
+0:16  Function Definition: @main(vf4; ( temp structure{ temp 4-component vector of float pos,  temp 2-component vector of float UV0,  temp 2-component vector of float UV1,  temp 2-component vector of float UV2,  temp 2-component vector of float UV3})
+0:16    Function Parameters: 
+0:16      'v' ( in 4-component vector of float)
+0:?     Sequence
+0:18      move second child to first child ( temp 4-component vector of float)
+0:18        pos: direct index for structure ( temp 4-component vector of float)
+0:18          's' ( temp structure{ temp 4-component vector of float pos,  temp 2-component vector of float UV0,  temp 2-component vector of float UV1,  temp 2-component vector of float UV2,  temp 2-component vector of float UV3})
+0:18          Constant:
+0:18            0 (const int)
+0:18        'v' ( in 4-component vector of float)
+0:19      move second child to first child ( temp 2-component vector of float)
+0:19        UV0: direct index for structure ( temp 2-component vector of float)
+0:19          's' ( temp structure{ temp 4-component vector of float pos,  temp 2-component vector of float UV0,  temp 2-component vector of float UV1,  temp 2-component vector of float UV2,  temp 2-component vector of float UV3})
+0:19          Constant:
+0:19            1 (const int)
+0:?         Construct vec2 ( temp 2-component vector of float)
+0:19          direct index ( temp float)
+0:19            'v' ( in 4-component vector of float)
+0:19            Constant:
+0:19              0 (const int)
+0:19          direct index ( temp float)
+0:19            'v' ( in 4-component vector of float)
+0:19            Constant:
+0:19              0 (const int)
+0:20      move second child to first child ( temp 2-component vector of float)
+0:20        UV1: direct index for structure ( temp 2-component vector of float)
+0:20          's' ( temp structure{ temp 4-component vector of float pos,  temp 2-component vector of float UV0,  temp 2-component vector of float UV1,  temp 2-component vector of float UV2,  temp 2-component vector of float UV3})
+0:20          Constant:
+0:20            2 (const int)
+0:?         Construct vec2 ( temp 2-component vector of float)
+0:20          direct index ( temp float)
+0:20            'v' ( in 4-component vector of float)
+0:20            Constant:
+0:20              1 (const int)
+0:20          direct index ( temp float)
+0:20            'v' ( in 4-component vector of float)
+0:20            Constant:
+0:20              1 (const int)
+0:21      move second child to first child ( temp 2-component vector of float)
+0:21        UV2: direct index for structure ( temp 2-component vector of float)
+0:21          's' ( temp structure{ temp 4-component vector of float pos,  temp 2-component vector of float UV0,  temp 2-component vector of float UV1,  temp 2-component vector of float UV2,  temp 2-component vector of float UV3})
+0:21          Constant:
+0:21            3 (const int)
+0:?         Construct vec2 ( temp 2-component vector of float)
+0:21          direct index ( temp float)
+0:21            'v' ( in 4-component vector of float)
+0:21            Constant:
+0:21              2 (const int)
+0:21          direct index ( temp float)
+0:21            'v' ( in 4-component vector of float)
+0:21            Constant:
+0:21              2 (const int)
+0:22      move second child to first child ( temp 2-component vector of float)
+0:22        UV3: direct index for structure ( temp 2-component vector of float)
+0:22          's' ( temp structure{ temp 4-component vector of float pos,  temp 2-component vector of float UV0,  temp 2-component vector of float UV1,  temp 2-component vector of float UV2,  temp 2-component vector of float UV3})
+0:22          Constant:
+0:22            4 (const int)
+0:?         Construct vec2 ( temp 2-component vector of float)
+0:22          direct index ( temp float)
+0:22            'v' ( in 4-component vector of float)
+0:22            Constant:
+0:22              3 (const int)
+0:22          direct index ( temp float)
+0:22            'v' ( in 4-component vector of float)
+0:22            Constant:
+0:22              3 (const int)
+0:23      Branch: Return with expression
+0:23        's' ( temp structure{ temp 4-component vector of float pos,  temp 2-component vector of float UV0,  temp 2-component vector of float UV1,  temp 2-component vector of float UV2,  temp 2-component vector of float UV3})
+0:16  Function Definition: main( ( temp void)
+0:16    Function Parameters: 
+0:?     Sequence
+0:16      move second child to first child ( temp 4-component vector of float)
+0:?         'v' ( temp 4-component vector of float)
+0:?         'v' (layout( location=0) in 4-component vector of float)
+0:16      Sequence
+0:16        move second child to first child ( temp structure{ temp 4-component vector of float pos,  temp 2-component vector of float UV0,  temp 2-component vector of float UV1,  temp 2-component vector of float UV2,  temp 2-component vector of float UV3})
+0:16          'flattenTemp' ( temp structure{ temp 4-component vector of float pos,  temp 2-component vector of float UV0,  temp 2-component vector of float UV1,  temp 2-component vector of float UV2,  temp 2-component vector of float UV3})
+0:16          Function Call: @main(vf4; ( temp structure{ temp 4-component vector of float pos,  temp 2-component vector of float UV0,  temp 2-component vector of float UV1,  temp 2-component vector of float UV2,  temp 2-component vector of float UV3})
+0:?             'v' ( temp 4-component vector of float)
+0:16        move second child to first child ( temp 4-component vector of float)
+0:?           '@entryPointOutput.pos' (layout( location=0) out 4-component vector of float)
+0:16          pos: direct index for structure ( temp 4-component vector of float)
+0:16            'flattenTemp' ( temp structure{ temp 4-component vector of float pos,  temp 2-component vector of float UV0,  temp 2-component vector of float UV1,  temp 2-component vector of float UV2,  temp 2-component vector of float UV3})
+0:16            Constant:
+0:16              0 (const int)
+0:16        move second child to first child ( temp 2-component vector of float)
+0:?           '@entryPointOutput.UV0' (layout( location=1) out 2-component vector of float)
+0:16          UV0: direct index for structure ( temp 2-component vector of float)
+0:16            'flattenTemp' ( temp structure{ temp 4-component vector of float pos,  temp 2-component vector of float UV0,  temp 2-component vector of float UV1,  temp 2-component vector of float UV2,  temp 2-component vector of float UV3})
+0:16            Constant:
+0:16              1 (const int)
+0:16        move second child to first child ( temp 2-component vector of float)
+0:?           '@entryPointOutput.UV1' (layout( location=2) out 2-component vector of float)
+0:16          UV1: direct index for structure ( temp 2-component vector of float)
+0:16            'flattenTemp' ( temp structure{ temp 4-component vector of float pos,  temp 2-component vector of float UV0,  temp 2-component vector of float UV1,  temp 2-component vector of float UV2,  temp 2-component vector of float UV3})
+0:16            Constant:
+0:16              2 (const int)
+0:16        move second child to first child ( temp 2-component vector of float)
+0:?           '@entryPointOutput.UV2' (layout( location=3) out 2-component vector of float)
+0:16          UV2: direct index for structure ( temp 2-component vector of float)
+0:16            'flattenTemp' ( temp structure{ temp 4-component vector of float pos,  temp 2-component vector of float UV0,  temp 2-component vector of float UV1,  temp 2-component vector of float UV2,  temp 2-component vector of float UV3})
+0:16            Constant:
+0:16              3 (const int)
+0:16        move second child to first child ( temp 2-component vector of float)
+0:?           '@entryPointOutput.UV3' (layout( location=4) out 2-component vector of float)
+0:16          UV3: direct index for structure ( temp 2-component vector of float)
+0:16            'flattenTemp' ( temp structure{ temp 4-component vector of float pos,  temp 2-component vector of float UV0,  temp 2-component vector of float UV1,  temp 2-component vector of float UV2,  temp 2-component vector of float UV3})
+0:16            Constant:
+0:16              4 (const int)
+0:?   Linker Objects
+0:?     '@entryPointOutput.pos' (layout( location=0) out 4-component vector of float)
+0:?     '@entryPointOutput.UV0' (layout( location=1) out 2-component vector of float)
+0:?     '@entryPointOutput.UV1' (layout( location=2) out 2-component vector of float)
+0:?     '@entryPointOutput.UV2' (layout( location=3) out 2-component vector of float)
+0:?     '@entryPointOutput.UV3' (layout( location=4) out 2-component vector of float)
+0:?     'v' (layout( location=0) in 4-component vector of float)
+
+
+Linked vertex stage:
+
+
+Shader version: 500
+0:? Sequence
+0:16  Function Definition: @main(vf4; ( temp structure{ temp 4-component vector of float pos,  temp 2-component vector of float UV0,  temp 2-component vector of float UV1,  temp 2-component vector of float UV2,  temp 2-component vector of float UV3})
+0:16    Function Parameters: 
+0:16      'v' ( in 4-component vector of float)
+0:?     Sequence
+0:18      move second child to first child ( temp 4-component vector of float)
+0:18        pos: direct index for structure ( temp 4-component vector of float)
+0:18          's' ( temp structure{ temp 4-component vector of float pos,  temp 2-component vector of float UV0,  temp 2-component vector of float UV1,  temp 2-component vector of float UV2,  temp 2-component vector of float UV3})
+0:18          Constant:
+0:18            0 (const int)
+0:18        'v' ( in 4-component vector of float)
+0:19      move second child to first child ( temp 2-component vector of float)
+0:19        UV0: direct index for structure ( temp 2-component vector of float)
+0:19          's' ( temp structure{ temp 4-component vector of float pos,  temp 2-component vector of float UV0,  temp 2-component vector of float UV1,  temp 2-component vector of float UV2,  temp 2-component vector of float UV3})
+0:19          Constant:
+0:19            1 (const int)
+0:?         Construct vec2 ( temp 2-component vector of float)
+0:19          direct index ( temp float)
+0:19            'v' ( in 4-component vector of float)
+0:19            Constant:
+0:19              0 (const int)
+0:19          direct index ( temp float)
+0:19            'v' ( in 4-component vector of float)
+0:19            Constant:
+0:19              0 (const int)
+0:20      move second child to first child ( temp 2-component vector of float)
+0:20        UV1: direct index for structure ( temp 2-component vector of float)
+0:20          's' ( temp structure{ temp 4-component vector of float pos,  temp 2-component vector of float UV0,  temp 2-component vector of float UV1,  temp 2-component vector of float UV2,  temp 2-component vector of float UV3})
+0:20          Constant:
+0:20            2 (const int)
+0:?         Construct vec2 ( temp 2-component vector of float)
+0:20          direct index ( temp float)
+0:20            'v' ( in 4-component vector of float)
+0:20            Constant:
+0:20              1 (const int)
+0:20          direct index ( temp float)
+0:20            'v' ( in 4-component vector of float)
+0:20            Constant:
+0:20              1 (const int)
+0:21      move second child to first child ( temp 2-component vector of float)
+0:21        UV2: direct index for structure ( temp 2-component vector of float)
+0:21          's' ( temp structure{ temp 4-component vector of float pos,  temp 2-component vector of float UV0,  temp 2-component vector of float UV1,  temp 2-component vector of float UV2,  temp 2-component vector of float UV3})
+0:21          Constant:
+0:21            3 (const int)
+0:?         Construct vec2 ( temp 2-component vector of float)
+0:21          direct index ( temp float)
+0:21            'v' ( in 4-component vector of float)
+0:21            Constant:
+0:21              2 (const int)
+0:21          direct index ( temp float)
+0:21            'v' ( in 4-component vector of float)
+0:21            Constant:
+0:21              2 (const int)
+0:22      move second child to first child ( temp 2-component vector of float)
+0:22        UV3: direct index for structure ( temp 2-component vector of float)
+0:22          's' ( temp structure{ temp 4-component vector of float pos,  temp 2-component vector of float UV0,  temp 2-component vector of float UV1,  temp 2-component vector of float UV2,  temp 2-component vector of float UV3})
+0:22          Constant:
+0:22            4 (const int)
+0:?         Construct vec2 ( temp 2-component vector of float)
+0:22          direct index ( temp float)
+0:22            'v' ( in 4-component vector of float)
+0:22            Constant:
+0:22              3 (const int)
+0:22          direct index ( temp float)
+0:22            'v' ( in 4-component vector of float)
+0:22            Constant:
+0:22              3 (const int)
+0:23      Branch: Return with expression
+0:23        's' ( temp structure{ temp 4-component vector of float pos,  temp 2-component vector of float UV0,  temp 2-component vector of float UV1,  temp 2-component vector of float UV2,  temp 2-component vector of float UV3})
+0:16  Function Definition: main( ( temp void)
+0:16    Function Parameters: 
+0:?     Sequence
+0:16      move second child to first child ( temp 4-component vector of float)
+0:?         'v' ( temp 4-component vector of float)
+0:?         'v' (layout( location=0) in 4-component vector of float)
+0:16      Sequence
+0:16        move second child to first child ( temp structure{ temp 4-component vector of float pos,  temp 2-component vector of float UV0,  temp 2-component vector of float UV1,  temp 2-component vector of float UV2,  temp 2-component vector of float UV3})
+0:16          'flattenTemp' ( temp structure{ temp 4-component vector of float pos,  temp 2-component vector of float UV0,  temp 2-component vector of float UV1,  temp 2-component vector of float UV2,  temp 2-component vector of float UV3})
+0:16          Function Call: @main(vf4; ( temp structure{ temp 4-component vector of float pos,  temp 2-component vector of float UV0,  temp 2-component vector of float UV1,  temp 2-component vector of float UV2,  temp 2-component vector of float UV3})
+0:?             'v' ( temp 4-component vector of float)
+0:16        move second child to first child ( temp 4-component vector of float)
+0:?           '@entryPointOutput.pos' (layout( location=0) out 4-component vector of float)
+0:16          pos: direct index for structure ( temp 4-component vector of float)
+0:16            'flattenTemp' ( temp structure{ temp 4-component vector of float pos,  temp 2-component vector of float UV0,  temp 2-component vector of float UV1,  temp 2-component vector of float UV2,  temp 2-component vector of float UV3})
+0:16            Constant:
+0:16              0 (const int)
+0:16        move second child to first child ( temp 2-component vector of float)
+0:?           '@entryPointOutput.UV0' (layout( location=1) out 2-component vector of float)
+0:16          UV0: direct index for structure ( temp 2-component vector of float)
+0:16            'flattenTemp' ( temp structure{ temp 4-component vector of float pos,  temp 2-component vector of float UV0,  temp 2-component vector of float UV1,  temp 2-component vector of float UV2,  temp 2-component vector of float UV3})
+0:16            Constant:
+0:16              1 (const int)
+0:16        move second child to first child ( temp 2-component vector of float)
+0:?           '@entryPointOutput.UV1' (layout( location=2) out 2-component vector of float)
+0:16          UV1: direct index for structure ( temp 2-component vector of float)
+0:16            'flattenTemp' ( temp structure{ temp 4-component vector of float pos,  temp 2-component vector of float UV0,  temp 2-component vector of float UV1,  temp 2-component vector of float UV2,  temp 2-component vector of float UV3})
+0:16            Constant:
+0:16              2 (const int)
+0:16        move second child to first child ( temp 2-component vector of float)
+0:?           '@entryPointOutput.UV2' (layout( location=3) out 2-component vector of float)
+0:16          UV2: direct index for structure ( temp 2-component vector of float)
+0:16            'flattenTemp' ( temp structure{ temp 4-component vector of float pos,  temp 2-component vector of float UV0,  temp 2-component vector of float UV1,  temp 2-component vector of float UV2,  temp 2-component vector of float UV3})
+0:16            Constant:
+0:16              3 (const int)
+0:16        move second child to first child ( temp 2-component vector of float)
+0:?           '@entryPointOutput.UV3' (layout( location=4) out 2-component vector of float)
+0:16          UV3: direct index for structure ( temp 2-component vector of float)
+0:16            'flattenTemp' ( temp structure{ temp 4-component vector of float pos,  temp 2-component vector of float UV0,  temp 2-component vector of float UV1,  temp 2-component vector of float UV2,  temp 2-component vector of float UV3})
+0:16            Constant:
+0:16              4 (const int)
+0:?   Linker Objects
+0:?     '@entryPointOutput.pos' (layout( location=0) out 4-component vector of float)
+0:?     '@entryPointOutput.UV0' (layout( location=1) out 2-component vector of float)
+0:?     '@entryPointOutput.UV1' (layout( location=2) out 2-component vector of float)
+0:?     '@entryPointOutput.UV2' (layout( location=3) out 2-component vector of float)
+0:?     '@entryPointOutput.UV3' (layout( location=4) out 2-component vector of float)
+0:?     'v' (layout( location=0) in 4-component vector of float)
+
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 84
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Vertex 4  "main" 61 68 72 75 78 81
+                              Source HLSL 500
+                              Name 4  "main"
+                              Name 10  "S"
+                              MemberName 10(S) 0  "pos"
+                              MemberName 10(S) 1  "UV0"
+                              MemberName 10(S) 2  "UV1"
+                              MemberName 10(S) 3  "UV2"
+                              MemberName 10(S) 4  "UV3"
+                              Name 13  "@main(vf4;"
+                              Name 12  "v"
+                              Name 16  "s"
+                              Name 59  "v"
+                              Name 61  "v"
+                              Name 63  "flattenTemp"
+                              Name 64  "param"
+                              Name 68  "@entryPointOutput.pos"
+                              Name 72  "@entryPointOutput.UV0"
+                              Name 75  "@entryPointOutput.UV1"
+                              Name 78  "@entryPointOutput.UV2"
+                              Name 81  "@entryPointOutput.UV3"
+                              Decorate 61(v) Location 0
+                              Decorate 68(@entryPointOutput.pos) Location 0
+                              Decorate 72(@entryPointOutput.UV0) Location 1
+                              Decorate 75(@entryPointOutput.UV1) Location 2
+                              Decorate 78(@entryPointOutput.UV2) Location 3
+                              Decorate 81(@entryPointOutput.UV3) Location 4
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+               8:             TypePointer Function 7(fvec4)
+               9:             TypeVector 6(float) 2
+           10(S):             TypeStruct 7(fvec4) 9(fvec2) 9(fvec2) 9(fvec2) 9(fvec2)
+              11:             TypeFunction 10(S) 8(ptr)
+              15:             TypePointer Function 10(S)
+              17:             TypeInt 32 1
+              18:     17(int) Constant 0
+              21:     17(int) Constant 1
+              22:             TypeInt 32 0
+              23:     22(int) Constant 0
+              24:             TypePointer Function 6(float)
+              30:             TypePointer Function 9(fvec2)
+              32:     17(int) Constant 2
+              33:     22(int) Constant 1
+              40:     17(int) Constant 3
+              41:     22(int) Constant 2
+              48:     17(int) Constant 4
+              49:     22(int) Constant 3
+              60:             TypePointer Input 7(fvec4)
+           61(v):     60(ptr) Variable Input
+              67:             TypePointer Output 7(fvec4)
+68(@entryPointOutput.pos):     67(ptr) Variable Output
+              71:             TypePointer Output 9(fvec2)
+72(@entryPointOutput.UV0):     71(ptr) Variable Output
+75(@entryPointOutput.UV1):     71(ptr) Variable Output
+78(@entryPointOutput.UV2):     71(ptr) Variable Output
+81(@entryPointOutput.UV3):     71(ptr) Variable Output
+         4(main):           2 Function None 3
+               5:             Label
+           59(v):      8(ptr) Variable Function
+ 63(flattenTemp):     15(ptr) Variable Function
+       64(param):      8(ptr) Variable Function
+              62:    7(fvec4) Load 61(v)
+                              Store 59(v) 62
+              65:    7(fvec4) Load 59(v)
+                              Store 64(param) 65
+              66:       10(S) FunctionCall 13(@main(vf4;) 64(param)
+                              Store 63(flattenTemp) 66
+              69:      8(ptr) AccessChain 63(flattenTemp) 18
+              70:    7(fvec4) Load 69
+                              Store 68(@entryPointOutput.pos) 70
+              73:     30(ptr) AccessChain 63(flattenTemp) 21
+              74:    9(fvec2) Load 73
+                              Store 72(@entryPointOutput.UV0) 74
+              76:     30(ptr) AccessChain 63(flattenTemp) 32
+              77:    9(fvec2) Load 76
+                              Store 75(@entryPointOutput.UV1) 77
+              79:     30(ptr) AccessChain 63(flattenTemp) 40
+              80:    9(fvec2) Load 79
+                              Store 78(@entryPointOutput.UV2) 80
+              82:     30(ptr) AccessChain 63(flattenTemp) 48
+              83:    9(fvec2) Load 82
+                              Store 81(@entryPointOutput.UV3) 83
+                              Return
+                              FunctionEnd
+  13(@main(vf4;):       10(S) Function None 11
+           12(v):      8(ptr) FunctionParameter
+              14:             Label
+           16(s):     15(ptr) Variable Function
+              19:    7(fvec4) Load 12(v)
+              20:      8(ptr) AccessChain 16(s) 18
+                              Store 20 19
+              25:     24(ptr) AccessChain 12(v) 23
+              26:    6(float) Load 25
+              27:     24(ptr) AccessChain 12(v) 23
+              28:    6(float) Load 27
+              29:    9(fvec2) CompositeConstruct 26 28
+              31:     30(ptr) AccessChain 16(s) 21
+                              Store 31 29
+              34:     24(ptr) AccessChain 12(v) 33
+              35:    6(float) Load 34
+              36:     24(ptr) AccessChain 12(v) 33
+              37:    6(float) Load 36
+              38:    9(fvec2) CompositeConstruct 35 37
+              39:     30(ptr) AccessChain 16(s) 32
+                              Store 39 38
+              42:     24(ptr) AccessChain 12(v) 41
+              43:    6(float) Load 42
+              44:     24(ptr) AccessChain 12(v) 41
+              45:    6(float) Load 44
+              46:    9(fvec2) CompositeConstruct 43 45
+              47:     30(ptr) AccessChain 16(s) 40
+                              Store 47 46
+              50:     24(ptr) AccessChain 12(v) 49
+              51:    6(float) Load 50
+              52:     24(ptr) AccessChain 12(v) 49
+              53:    6(float) Load 52
+              54:    9(fvec2) CompositeConstruct 51 53
+              55:     30(ptr) AccessChain 16(s) 48
+                              Store 55 54
+              56:       10(S) Load 16(s)
+                              ReturnValue 56
+                              FunctionEnd
diff --git a/Test/baseResults/hlsl.semantic.geom.out b/Test/baseResults/hlsl.semantic.geom.out
old mode 100755
new mode 100644
index e5d67b9..e73940b
--- a/Test/baseResults/hlsl.semantic.geom.out
+++ b/Test/baseResults/hlsl.semantic.geom.out
@@ -5,63 +5,75 @@
 input primitive = triangles
 output primitive = line_strip
 0:? Sequence
-0:12  Function Definition: @main(u1[3];struct-S-f1-f1-u1-u1-i11; ( temp structure{ temp float clip0,  temp float cull0,  temp uint vpai,  temp uint rtai,  temp int ii})
-0:12    Function Parameters: 
-0:12      'VertexID' ( in 3-element array of uint)
-0:12      'OutputStream' ( out structure{ temp float clip0,  temp float cull0,  temp uint vpai,  temp uint rtai,  temp int ii})
+0:13  Function Definition: @main(u1[3];struct-S-f1-f1-f1-u1-u1-i11; ( temp void)
+0:13    Function Parameters: 
+0:13      'VertexID' ( in 3-element array of uint)
+0:13      'OutputStream' ( out structure{ temp float clip0,  temp float clip0,  temp float cull0,  temp uint vpai,  temp uint rtai,  temp int ii})
 0:?     Sequence
-0:14      Branch: Return with expression
-0:14        's' ( temp structure{ temp float clip0,  temp float cull0,  temp uint vpai,  temp uint rtai,  temp int ii})
-0:12  Function Definition: main( ( temp void)
-0:12    Function Parameters: 
+0:15      Sequence
+0:15        Sequence
+0:15          move second child to first child ( temp float)
+0:?             'OutputStream.clip0' ( out float Position)
+0:15            clip0: direct index for structure ( temp float)
+0:15              's' ( temp structure{ temp float clip0,  temp float clip0,  temp float cull0,  temp uint vpai,  temp uint rtai,  temp int ii})
+0:15              Constant:
+0:15                0 (const int)
+0:?           Sequence
+0:15            move second child to first child ( temp float)
+0:15              direct index ( out float ClipDistance)
+0:?                 'OutputStream.clip0' ( out 1-element array of float ClipDistance)
+0:15                Constant:
+0:15                  0 (const int)
+0:15              clip0: direct index for structure ( temp float)
+0:15                's' ( temp structure{ temp float clip0,  temp float clip0,  temp float cull0,  temp uint vpai,  temp uint rtai,  temp int ii})
+0:15                Constant:
+0:15                  1 (const int)
+0:?           Sequence
+0:15            move second child to first child ( temp float)
+0:15              direct index ( out float CullDistance)
+0:?                 'OutputStream.cull0' ( out 1-element array of float CullDistance)
+0:15                Constant:
+0:15                  0 (const int)
+0:15              cull0: direct index for structure ( temp float)
+0:15                's' ( temp structure{ temp float clip0,  temp float clip0,  temp float cull0,  temp uint vpai,  temp uint rtai,  temp int ii})
+0:15                Constant:
+0:15                  2 (const int)
+0:15          move second child to first child ( temp uint)
+0:?             'OutputStream.vpai' ( out uint ViewportIndex)
+0:15            vpai: direct index for structure ( temp uint)
+0:15              's' ( temp structure{ temp float clip0,  temp float clip0,  temp float cull0,  temp uint vpai,  temp uint rtai,  temp int ii})
+0:15              Constant:
+0:15                3 (const int)
+0:15          move second child to first child ( temp uint)
+0:?             'OutputStream.rtai' ( out uint Layer)
+0:15            rtai: direct index for structure ( temp uint)
+0:15              's' ( temp structure{ temp float clip0,  temp float clip0,  temp float cull0,  temp uint vpai,  temp uint rtai,  temp int ii})
+0:15              Constant:
+0:15                4 (const int)
+0:15          move second child to first child ( temp int)
+0:?             'OutputStream.ii' (layout( location=0) out int)
+0:15            ii: direct index for structure ( temp int)
+0:15              's' ( temp structure{ temp float clip0,  temp float clip0,  temp float cull0,  temp uint vpai,  temp uint rtai,  temp int ii})
+0:15              Constant:
+0:15                5 (const int)
+0:15        EmitVertex ( temp void)
+0:13  Function Definition: main( ( temp void)
+0:13    Function Parameters: 
 0:?     Sequence
-0:12      move second child to first child ( temp 3-element array of uint)
+0:13      move second child to first child ( temp 3-element array of uint)
 0:?         'VertexID' ( temp 3-element array of uint)
 0:?         'VertexID' (layout( location=0) in 3-element array of uint)
-0:12      Sequence
-0:12        move second child to first child ( temp structure{ temp float clip0,  temp float cull0,  temp uint vpai,  temp uint rtai,  temp int ii})
-0:12          'flattenTemp' ( temp structure{ temp float clip0,  temp float cull0,  temp uint vpai,  temp uint rtai,  temp int ii})
-0:12          Function Call: @main(u1[3];struct-S-f1-f1-u1-u1-i11; ( temp structure{ temp float clip0,  temp float cull0,  temp uint vpai,  temp uint rtai,  temp int ii})
-0:?             'VertexID' ( temp 3-element array of uint)
-0:?             'OutputStream' ( temp structure{ temp float clip0,  temp float cull0,  temp uint vpai,  temp uint rtai,  temp int ii})
-0:12        move second child to first child ( temp float)
-0:?           'OutputStream_clip0' ( out float ClipDistance)
-0:12          clip0: direct index for structure ( temp float)
-0:12            'flattenTemp' ( temp structure{ temp float clip0,  temp float cull0,  temp uint vpai,  temp uint rtai,  temp int ii})
-0:12            Constant:
-0:12              0 (const int)
-0:12        move second child to first child ( temp float)
-0:?           'OutputStream_cull0' ( out float CullDistance)
-0:12          cull0: direct index for structure ( temp float)
-0:12            'flattenTemp' ( temp structure{ temp float clip0,  temp float cull0,  temp uint vpai,  temp uint rtai,  temp int ii})
-0:12            Constant:
-0:12              1 (const int)
-0:12        move second child to first child ( temp uint)
-0:?           'OutputStream_vpai' ( out uint ViewportIndex)
-0:12          vpai: direct index for structure ( temp uint)
-0:12            'flattenTemp' ( temp structure{ temp float clip0,  temp float cull0,  temp uint vpai,  temp uint rtai,  temp int ii})
-0:12            Constant:
-0:12              2 (const int)
-0:12        move second child to first child ( temp uint)
-0:?           'OutputStream_rtai' ( out uint Layer)
-0:12          rtai: direct index for structure ( temp uint)
-0:12            'flattenTemp' ( temp structure{ temp float clip0,  temp float cull0,  temp uint vpai,  temp uint rtai,  temp int ii})
-0:12            Constant:
-0:12              3 (const int)
-0:12        move second child to first child ( temp int)
-0:12          ii: direct index for structure ( temp int)
-0:12            '@entryPointOutput' (layout( location=0) out structure{ temp int ii})
-0:12            Constant:
-0:12              0 (const int)
-0:12          ii: direct index for structure ( temp int)
-0:12            'flattenTemp' ( temp structure{ temp float clip0,  temp float cull0,  temp uint vpai,  temp uint rtai,  temp int ii})
-0:12            Constant:
-0:12              4 (const int)
+0:13      Function Call: @main(u1[3];struct-S-f1-f1-f1-u1-u1-i11; ( temp void)
+0:?         'VertexID' ( temp 3-element array of uint)
+0:?         'OutputStream' ( temp structure{ temp float clip0,  temp float clip0,  temp float cull0,  temp uint vpai,  temp uint rtai,  temp int ii})
 0:?   Linker Objects
-0:?     '@entryPointOutput' (layout( location=0) out structure{ temp int ii})
 0:?     'VertexID' (layout( location=0) in 3-element array of uint)
-0:?     'OutputStream' (layout( location=1) out structure{ temp int ii})
-0:?     'OutputStream_vpai' ( out uint ViewportIndex)
+0:?     'OutputStream.clip0' ( out float Position)
+0:?     'OutputStream.vpai' ( out uint ViewportIndex)
+0:?     'OutputStream.rtai' ( out uint Layer)
+0:?     'OutputStream.ii' (layout( location=0) out int)
+0:?     'OutputStream.clip0' ( out 1-element array of float ClipDistance)
+0:?     'OutputStream.cull0' ( out 1-element array of float CullDistance)
 
 
 Linked geometry stage:
@@ -73,67 +85,83 @@
 input primitive = triangles
 output primitive = line_strip
 0:? Sequence
-0:12  Function Definition: @main(u1[3];struct-S-f1-f1-u1-u1-i11; ( temp structure{ temp float clip0,  temp float cull0,  temp uint vpai,  temp uint rtai,  temp int ii})
-0:12    Function Parameters: 
-0:12      'VertexID' ( in 3-element array of uint)
-0:12      'OutputStream' ( out structure{ temp float clip0,  temp float cull0,  temp uint vpai,  temp uint rtai,  temp int ii})
+0:13  Function Definition: @main(u1[3];struct-S-f1-f1-f1-u1-u1-i11; ( temp void)
+0:13    Function Parameters: 
+0:13      'VertexID' ( in 3-element array of uint)
+0:13      'OutputStream' ( out structure{ temp float clip0,  temp float clip0,  temp float cull0,  temp uint vpai,  temp uint rtai,  temp int ii})
 0:?     Sequence
-0:14      Branch: Return with expression
-0:14        's' ( temp structure{ temp float clip0,  temp float cull0,  temp uint vpai,  temp uint rtai,  temp int ii})
-0:12  Function Definition: main( ( temp void)
-0:12    Function Parameters: 
+0:15      Sequence
+0:15        Sequence
+0:15          move second child to first child ( temp float)
+0:?             'OutputStream.clip0' ( out float Position)
+0:15            clip0: direct index for structure ( temp float)
+0:15              's' ( temp structure{ temp float clip0,  temp float clip0,  temp float cull0,  temp uint vpai,  temp uint rtai,  temp int ii})
+0:15              Constant:
+0:15                0 (const int)
+0:?           Sequence
+0:15            move second child to first child ( temp float)
+0:15              direct index ( out float ClipDistance)
+0:?                 'OutputStream.clip0' ( out 1-element array of float ClipDistance)
+0:15                Constant:
+0:15                  0 (const int)
+0:15              clip0: direct index for structure ( temp float)
+0:15                's' ( temp structure{ temp float clip0,  temp float clip0,  temp float cull0,  temp uint vpai,  temp uint rtai,  temp int ii})
+0:15                Constant:
+0:15                  1 (const int)
+0:?           Sequence
+0:15            move second child to first child ( temp float)
+0:15              direct index ( out float CullDistance)
+0:?                 'OutputStream.cull0' ( out 1-element array of float CullDistance)
+0:15                Constant:
+0:15                  0 (const int)
+0:15              cull0: direct index for structure ( temp float)
+0:15                's' ( temp structure{ temp float clip0,  temp float clip0,  temp float cull0,  temp uint vpai,  temp uint rtai,  temp int ii})
+0:15                Constant:
+0:15                  2 (const int)
+0:15          move second child to first child ( temp uint)
+0:?             'OutputStream.vpai' ( out uint ViewportIndex)
+0:15            vpai: direct index for structure ( temp uint)
+0:15              's' ( temp structure{ temp float clip0,  temp float clip0,  temp float cull0,  temp uint vpai,  temp uint rtai,  temp int ii})
+0:15              Constant:
+0:15                3 (const int)
+0:15          move second child to first child ( temp uint)
+0:?             'OutputStream.rtai' ( out uint Layer)
+0:15            rtai: direct index for structure ( temp uint)
+0:15              's' ( temp structure{ temp float clip0,  temp float clip0,  temp float cull0,  temp uint vpai,  temp uint rtai,  temp int ii})
+0:15              Constant:
+0:15                4 (const int)
+0:15          move second child to first child ( temp int)
+0:?             'OutputStream.ii' (layout( location=0) out int)
+0:15            ii: direct index for structure ( temp int)
+0:15              's' ( temp structure{ temp float clip0,  temp float clip0,  temp float cull0,  temp uint vpai,  temp uint rtai,  temp int ii})
+0:15              Constant:
+0:15                5 (const int)
+0:15        EmitVertex ( temp void)
+0:13  Function Definition: main( ( temp void)
+0:13    Function Parameters: 
 0:?     Sequence
-0:12      move second child to first child ( temp 3-element array of uint)
+0:13      move second child to first child ( temp 3-element array of uint)
 0:?         'VertexID' ( temp 3-element array of uint)
 0:?         'VertexID' (layout( location=0) in 3-element array of uint)
-0:12      Sequence
-0:12        move second child to first child ( temp structure{ temp float clip0,  temp float cull0,  temp uint vpai,  temp uint rtai,  temp int ii})
-0:12          'flattenTemp' ( temp structure{ temp float clip0,  temp float cull0,  temp uint vpai,  temp uint rtai,  temp int ii})
-0:12          Function Call: @main(u1[3];struct-S-f1-f1-u1-u1-i11; ( temp structure{ temp float clip0,  temp float cull0,  temp uint vpai,  temp uint rtai,  temp int ii})
-0:?             'VertexID' ( temp 3-element array of uint)
-0:?             'OutputStream' ( temp structure{ temp float clip0,  temp float cull0,  temp uint vpai,  temp uint rtai,  temp int ii})
-0:12        move second child to first child ( temp float)
-0:?           'OutputStream_clip0' ( out float ClipDistance)
-0:12          clip0: direct index for structure ( temp float)
-0:12            'flattenTemp' ( temp structure{ temp float clip0,  temp float cull0,  temp uint vpai,  temp uint rtai,  temp int ii})
-0:12            Constant:
-0:12              0 (const int)
-0:12        move second child to first child ( temp float)
-0:?           'OutputStream_cull0' ( out float CullDistance)
-0:12          cull0: direct index for structure ( temp float)
-0:12            'flattenTemp' ( temp structure{ temp float clip0,  temp float cull0,  temp uint vpai,  temp uint rtai,  temp int ii})
-0:12            Constant:
-0:12              1 (const int)
-0:12        move second child to first child ( temp uint)
-0:?           'OutputStream_vpai' ( out uint ViewportIndex)
-0:12          vpai: direct index for structure ( temp uint)
-0:12            'flattenTemp' ( temp structure{ temp float clip0,  temp float cull0,  temp uint vpai,  temp uint rtai,  temp int ii})
-0:12            Constant:
-0:12              2 (const int)
-0:12        move second child to first child ( temp uint)
-0:?           'OutputStream_rtai' ( out uint Layer)
-0:12          rtai: direct index for structure ( temp uint)
-0:12            'flattenTemp' ( temp structure{ temp float clip0,  temp float cull0,  temp uint vpai,  temp uint rtai,  temp int ii})
-0:12            Constant:
-0:12              3 (const int)
-0:12        move second child to first child ( temp int)
-0:12          ii: direct index for structure ( temp int)
-0:12            '@entryPointOutput' (layout( location=0) out structure{ temp int ii})
-0:12            Constant:
-0:12              0 (const int)
-0:12          ii: direct index for structure ( temp int)
-0:12            'flattenTemp' ( temp structure{ temp float clip0,  temp float cull0,  temp uint vpai,  temp uint rtai,  temp int ii})
-0:12            Constant:
-0:12              4 (const int)
+0:13      Function Call: @main(u1[3];struct-S-f1-f1-f1-u1-u1-i11; ( temp void)
+0:?         'VertexID' ( temp 3-element array of uint)
+0:?         'OutputStream' ( temp structure{ temp float clip0,  temp float clip0,  temp float cull0,  temp uint vpai,  temp uint rtai,  temp int ii})
 0:?   Linker Objects
-0:?     '@entryPointOutput' (layout( location=0) out structure{ temp int ii})
 0:?     'VertexID' (layout( location=0) in 3-element array of uint)
-0:?     'OutputStream' (layout( location=1) out structure{ temp int ii})
-0:?     'OutputStream_vpai' ( out uint ViewportIndex)
+0:?     'OutputStream.clip0' ( out float Position)
+0:?     'OutputStream.vpai' ( out uint ViewportIndex)
+0:?     'OutputStream.rtai' ( out uint Layer)
+0:?     'OutputStream.ii' (layout( location=0) out int)
+0:?     'OutputStream.clip0' ( out 1-element array of float ClipDistance)
+0:?     'OutputStream.cull0' ( out 1-element array of float CullDistance)
+
+error: SPIRV-Tools Validation Errors
+error: According to the Vulkan spec BuiltIn Position variable needs to be a 4-component 32-bit float vector. ID <20> (OpVariable) is not a float vector.
+  OpStore %OutputStream_clip0 %25
 
 // Module Version 10000
-// Generated by (magic number): 80001
-// Id's are bound by 66
+// Generated by (magic number): 80007
+// Id's are bound by 65
 
                               Capability Geometry
                               Capability ClipDistance
@@ -141,7 +169,7 @@
                               Capability MultiViewport
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Geometry 4  "main" 25 35 40 45 50 56 65
+                              EntryPoint Geometry 4  "main" 20 29 34 40 45 50 57
                               ExecutionMode 4 Triangles
                               ExecutionMode 4 Invocations 1
                               ExecutionMode 4 OutputLineStrip
@@ -150,37 +178,33 @@
                               Name 4  "main"
                               Name 12  "S"
                               MemberName 12(S) 0  "clip0"
-                              MemberName 12(S) 1  "cull0"
-                              MemberName 12(S) 2  "vpai"
-                              MemberName 12(S) 3  "rtai"
-                              MemberName 12(S) 4  "ii"
-                              Name 17  "@main(u1[3];struct-S-f1-f1-u1-u1-i11;"
+                              MemberName 12(S) 1  "clip0"
+                              MemberName 12(S) 2  "cull0"
+                              MemberName 12(S) 3  "vpai"
+                              MemberName 12(S) 4  "rtai"
+                              MemberName 12(S) 5  "ii"
+                              Name 17  "@main(u1[3];struct-S-f1-f1-f1-u1-u1-i11;"
                               Name 15  "VertexID"
                               Name 16  "OutputStream"
-                              Name 19  "s"
-                              Name 23  "VertexID"
-                              Name 25  "VertexID"
-                              Name 27  "flattenTemp"
-                              Name 28  "OutputStream"
-                              Name 29  "param"
-                              Name 31  "param"
-                              Name 35  "OutputStream_clip0"
-                              Name 40  "OutputStream_cull0"
-                              Name 45  "OutputStream_vpai"
-                              Name 50  "OutputStream_rtai"
-                              Name 54  "S"
-                              MemberName 54(S) 0  "ii"
-                              Name 56  "@entryPointOutput"
-                              Name 63  "S"
-                              MemberName 63(S) 0  "ii"
-                              Name 65  "OutputStream"
-                              Decorate 25(VertexID) Location 0
-                              Decorate 35(OutputStream_clip0) BuiltIn ClipDistance
-                              Decorate 40(OutputStream_cull0) BuiltIn CullDistance
-                              Decorate 45(OutputStream_vpai) BuiltIn ViewportIndex
-                              Decorate 50(OutputStream_rtai) BuiltIn Layer
-                              Decorate 56(@entryPointOutput) Location 0
-                              Decorate 65(OutputStream) Location 1
+                              Name 20  "OutputStream.clip0"
+                              Name 21  "s"
+                              Name 29  "OutputStream.clip0"
+                              Name 34  "OutputStream.cull0"
+                              Name 40  "OutputStream.vpai"
+                              Name 45  "OutputStream.rtai"
+                              Name 50  "OutputStream.ii"
+                              Name 55  "VertexID"
+                              Name 57  "VertexID"
+                              Name 59  "OutputStream"
+                              Name 60  "param"
+                              Name 62  "param"
+                              Decorate 20(OutputStream.clip0) BuiltIn Position
+                              Decorate 29(OutputStream.clip0) BuiltIn ClipDistance
+                              Decorate 34(OutputStream.cull0) BuiltIn CullDistance
+                              Decorate 40(OutputStream.vpai) BuiltIn ViewportIndex
+                              Decorate 45(OutputStream.rtai) BuiltIn Layer
+                              Decorate 50(OutputStream.ii) Location 0
+                              Decorate 57(VertexID) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 32 0
@@ -189,70 +213,72 @@
                9:             TypePointer Function 8
               10:             TypeFloat 32
               11:             TypeInt 32 1
-           12(S):             TypeStruct 10(float) 10(float) 6(int) 6(int) 11(int)
+           12(S):             TypeStruct 10(float) 10(float) 10(float) 6(int) 6(int) 11(int)
               13:             TypePointer Function 12(S)
-              14:             TypeFunction 12(S) 9(ptr) 13(ptr)
-              24:             TypePointer Input 8
-    25(VertexID):     24(ptr) Variable Input
-              34:             TypePointer Output 10(float)
-35(OutputStream_clip0):     34(ptr) Variable Output
-              36:     11(int) Constant 0
-              37:             TypePointer Function 10(float)
-40(OutputStream_cull0):     34(ptr) Variable Output
-              41:     11(int) Constant 1
-              44:             TypePointer Output 6(int)
-45(OutputStream_vpai):     44(ptr) Variable Output
-              46:     11(int) Constant 2
-              47:             TypePointer Function 6(int)
-50(OutputStream_rtai):     44(ptr) Variable Output
-              51:     11(int) Constant 3
-           54(S):             TypeStruct 11(int)
-              55:             TypePointer Output 54(S)
-56(@entryPointOutput):     55(ptr) Variable Output
-              57:     11(int) Constant 4
-              58:             TypePointer Function 11(int)
-              61:             TypePointer Output 11(int)
-           63(S):             TypeStruct 11(int)
-              64:             TypePointer Output 63(S)
-65(OutputStream):     64(ptr) Variable Output
+              14:             TypeFunction 2 9(ptr) 13(ptr)
+              19:             TypePointer Output 10(float)
+20(OutputStream.clip0):     19(ptr) Variable Output
+              22:     11(int) Constant 0
+              23:             TypePointer Function 10(float)
+              26:      6(int) Constant 1
+              27:             TypeArray 10(float) 26
+              28:             TypePointer Output 27
+29(OutputStream.clip0):     28(ptr) Variable Output
+              30:     11(int) Constant 1
+34(OutputStream.cull0):     28(ptr) Variable Output
+              35:     11(int) Constant 2
+              39:             TypePointer Output 6(int)
+40(OutputStream.vpai):     39(ptr) Variable Output
+              41:     11(int) Constant 3
+              42:             TypePointer Function 6(int)
+45(OutputStream.rtai):     39(ptr) Variable Output
+              46:     11(int) Constant 4
+              49:             TypePointer Output 11(int)
+50(OutputStream.ii):     49(ptr) Variable Output
+              51:     11(int) Constant 5
+              52:             TypePointer Function 11(int)
+              56:             TypePointer Input 8
+    57(VertexID):     56(ptr) Variable Input
          4(main):           2 Function None 3
                5:             Label
-    23(VertexID):      9(ptr) Variable Function
- 27(flattenTemp):     13(ptr) Variable Function
-28(OutputStream):     13(ptr) Variable Function
-       29(param):      9(ptr) Variable Function
-       31(param):     13(ptr) Variable Function
-              26:           8 Load 25(VertexID)
-                              Store 23(VertexID) 26
-              30:           8 Load 23(VertexID)
-                              Store 29(param) 30
-              32:       12(S) FunctionCall 17(@main(u1[3];struct-S-f1-f1-u1-u1-i11;) 29(param) 31(param)
-              33:       12(S) Load 31(param)
-                              Store 28(OutputStream) 33
-                              Store 27(flattenTemp) 32
-              38:     37(ptr) AccessChain 27(flattenTemp) 36
-              39:   10(float) Load 38
-                              Store 35(OutputStream_clip0) 39
-              42:     37(ptr) AccessChain 27(flattenTemp) 41
-              43:   10(float) Load 42
-                              Store 40(OutputStream_cull0) 43
-              48:     47(ptr) AccessChain 27(flattenTemp) 46
-              49:      6(int) Load 48
-                              Store 45(OutputStream_vpai) 49
-              52:     47(ptr) AccessChain 27(flattenTemp) 51
-              53:      6(int) Load 52
-                              Store 50(OutputStream_rtai) 53
-              59:     58(ptr) AccessChain 27(flattenTemp) 57
-              60:     11(int) Load 59
-              62:     61(ptr) AccessChain 56(@entryPointOutput) 36
-                              Store 62 60
+    55(VertexID):      9(ptr) Variable Function
+59(OutputStream):     13(ptr) Variable Function
+       60(param):      9(ptr) Variable Function
+       62(param):     13(ptr) Variable Function
+              58:           8 Load 57(VertexID)
+                              Store 55(VertexID) 58
+              61:           8 Load 55(VertexID)
+                              Store 60(param) 61
+              63:           2 FunctionCall 17(@main(u1[3];struct-S-f1-f1-f1-u1-u1-i11;) 60(param) 62(param)
+              64:       12(S) Load 62(param)
+                              Store 59(OutputStream) 64
                               Return
                               FunctionEnd
-17(@main(u1[3];struct-S-f1-f1-u1-u1-i11;):       12(S) Function None 14
+17(@main(u1[3];struct-S-f1-f1-f1-u1-u1-i11;):           2 Function None 14
     15(VertexID):      9(ptr) FunctionParameter
 16(OutputStream):     13(ptr) FunctionParameter
               18:             Label
-           19(s):     13(ptr) Variable Function
-              20:       12(S) Load 19(s)
-                              ReturnValue 20
+           21(s):     13(ptr) Variable Function
+              24:     23(ptr) AccessChain 21(s) 22
+              25:   10(float) Load 24
+                              Store 20(OutputStream.clip0) 25
+              31:     23(ptr) AccessChain 21(s) 30
+              32:   10(float) Load 31
+              33:     19(ptr) AccessChain 29(OutputStream.clip0) 22
+                              Store 33 32
+              36:     23(ptr) AccessChain 21(s) 35
+              37:   10(float) Load 36
+              38:     19(ptr) AccessChain 34(OutputStream.cull0) 22
+                              Store 38 37
+              43:     42(ptr) AccessChain 21(s) 41
+              44:      6(int) Load 43
+                              Store 40(OutputStream.vpai) 44
+              47:     42(ptr) AccessChain 21(s) 46
+              48:      6(int) Load 47
+                              Store 45(OutputStream.rtai) 48
+              53:     52(ptr) AccessChain 21(s) 51
+              54:     11(int) Load 53
+                              Store 50(OutputStream.ii) 54
+                              EmitVertex
+                              Return
                               FunctionEnd
diff --git a/Test/baseResults/hlsl.semantic.vert.out b/Test/baseResults/hlsl.semantic.vert.out
old mode 100755
new mode 100644
index 3618fee..2dbcd57
--- a/Test/baseResults/hlsl.semantic.vert.out
+++ b/Test/baseResults/hlsl.semantic.vert.out
@@ -1,117 +1,106 @@
 hlsl.semantic.vert
 Shader version: 500
 0:? Sequence
-0:12  Function Definition: @main(struct-S-f1-f1-f1-f1-f1-f1-i11; ( temp structure{ temp float clip,  temp float clip0,  temp float clip7,  temp float cull,  temp float cull2,  temp float cull5,  temp int ii})
-0:12    Function Parameters: 
-0:12      'ins' ( in structure{ temp float clip,  temp float clip0,  temp float clip7,  temp float cull,  temp float cull2,  temp float cull5,  temp int ii})
+0:10  Function Definition: @main(struct-S-f1-f1-f1-f1-i11; ( temp structure{ temp float clip0,  temp float clip1,  temp float cull0,  temp float cull1,  temp int ii})
+0:10    Function Parameters: 
+0:10      'ins' ( in structure{ temp float clip0,  temp float clip1,  temp float cull0,  temp float cull1,  temp int ii})
 0:?     Sequence
-0:14      Branch: Return with expression
-0:14        's' ( temp structure{ temp float clip,  temp float clip0,  temp float clip7,  temp float cull,  temp float cull2,  temp float cull5,  temp int ii})
-0:12  Function Definition: main( ( temp void)
-0:12    Function Parameters: 
+0:12      Branch: Return with expression
+0:12        's' ( temp structure{ temp float clip0,  temp float clip1,  temp float cull0,  temp float cull1,  temp int ii})
+0:10  Function Definition: main( ( temp void)
+0:10    Function Parameters: 
 0:?     Sequence
-0:12      Sequence
-0:12        move second child to first child ( temp float)
-0:12          clip: direct index for structure ( temp float)
-0:?             'ins' ( temp structure{ temp float clip,  temp float clip0,  temp float clip7,  temp float cull,  temp float cull2,  temp float cull5,  temp int ii})
-0:12            Constant:
-0:12              0 (const int)
-0:?           'clip' (layout( location=0) in float)
-0:12        move second child to first child ( temp float)
-0:12          clip0: direct index for structure ( temp float)
-0:?             'ins' ( temp structure{ temp float clip,  temp float clip0,  temp float clip7,  temp float cull,  temp float cull2,  temp float cull5,  temp int ii})
-0:12            Constant:
-0:12              1 (const int)
-0:?           'clip0' (layout( location=1) in float)
-0:12        move second child to first child ( temp float)
-0:12          clip7: direct index for structure ( temp float)
-0:?             'ins' ( temp structure{ temp float clip,  temp float clip0,  temp float clip7,  temp float cull,  temp float cull2,  temp float cull5,  temp int ii})
-0:12            Constant:
-0:12              2 (const int)
-0:?           'clip7' (layout( location=2) in float)
-0:12        move second child to first child ( temp float)
-0:12          cull: direct index for structure ( temp float)
-0:?             'ins' ( temp structure{ temp float clip,  temp float clip0,  temp float clip7,  temp float cull,  temp float cull2,  temp float cull5,  temp int ii})
-0:12            Constant:
-0:12              3 (const int)
-0:?           'cull' (layout( location=3) in float)
-0:12        move second child to first child ( temp float)
-0:12          cull2: direct index for structure ( temp float)
-0:?             'ins' ( temp structure{ temp float clip,  temp float clip0,  temp float clip7,  temp float cull,  temp float cull2,  temp float cull5,  temp int ii})
-0:12            Constant:
-0:12              4 (const int)
-0:?           'cull2' (layout( location=4) in float)
-0:12        move second child to first child ( temp float)
-0:12          cull5: direct index for structure ( temp float)
-0:?             'ins' ( temp structure{ temp float clip,  temp float clip0,  temp float clip7,  temp float cull,  temp float cull2,  temp float cull5,  temp int ii})
-0:12            Constant:
-0:12              5 (const int)
-0:?           'cull5' (layout( location=5) in float)
-0:12        move second child to first child ( temp int)
-0:12          ii: direct index for structure ( temp int)
-0:?             'ins' ( temp structure{ temp float clip,  temp float clip0,  temp float clip7,  temp float cull,  temp float cull2,  temp float cull5,  temp int ii})
-0:12            Constant:
-0:12              6 (const int)
-0:?           'ii' ( in int InstanceIndex)
-0:12      Sequence
-0:12        move second child to first child ( temp structure{ temp float clip,  temp float clip0,  temp float clip7,  temp float cull,  temp float cull2,  temp float cull5,  temp int ii})
-0:12          'flattenTemp' ( temp structure{ temp float clip,  temp float clip0,  temp float clip7,  temp float cull,  temp float cull2,  temp float cull5,  temp int ii})
-0:12          Function Call: @main(struct-S-f1-f1-f1-f1-f1-f1-i11; ( temp structure{ temp float clip,  temp float clip0,  temp float clip7,  temp float cull,  temp float cull2,  temp float cull5,  temp int ii})
-0:?             'ins' ( temp structure{ temp float clip,  temp float clip0,  temp float clip7,  temp float cull,  temp float cull2,  temp float cull5,  temp int ii})
-0:12        move second child to first child ( temp float)
-0:?           '@entryPointOutput_clip7' ( out float ClipDistance)
-0:12          clip: direct index for structure ( temp float)
-0:12            'flattenTemp' ( temp structure{ temp float clip,  temp float clip0,  temp float clip7,  temp float cull,  temp float cull2,  temp float cull5,  temp int ii})
-0:12            Constant:
-0:12              0 (const int)
-0:12        move second child to first child ( temp float)
-0:?           '@entryPointOutput_clip7' ( out float ClipDistance)
-0:12          clip0: direct index for structure ( temp float)
-0:12            'flattenTemp' ( temp structure{ temp float clip,  temp float clip0,  temp float clip7,  temp float cull,  temp float cull2,  temp float cull5,  temp int ii})
-0:12            Constant:
-0:12              1 (const int)
-0:12        move second child to first child ( temp float)
-0:?           '@entryPointOutput_clip7' ( out float ClipDistance)
-0:12          clip7: direct index for structure ( temp float)
-0:12            'flattenTemp' ( temp structure{ temp float clip,  temp float clip0,  temp float clip7,  temp float cull,  temp float cull2,  temp float cull5,  temp int ii})
-0:12            Constant:
-0:12              2 (const int)
-0:12        move second child to first child ( temp float)
-0:?           '@entryPointOutput_cull5' ( out float CullDistance)
-0:12          cull: direct index for structure ( temp float)
-0:12            'flattenTemp' ( temp structure{ temp float clip,  temp float clip0,  temp float clip7,  temp float cull,  temp float cull2,  temp float cull5,  temp int ii})
-0:12            Constant:
-0:12              3 (const int)
-0:12        move second child to first child ( temp float)
-0:?           '@entryPointOutput_cull5' ( out float CullDistance)
-0:12          cull2: direct index for structure ( temp float)
-0:12            'flattenTemp' ( temp structure{ temp float clip,  temp float clip0,  temp float clip7,  temp float cull,  temp float cull2,  temp float cull5,  temp int ii})
-0:12            Constant:
-0:12              4 (const int)
-0:12        move second child to first child ( temp float)
-0:?           '@entryPointOutput_cull5' ( out float CullDistance)
-0:12          cull5: direct index for structure ( temp float)
-0:12            'flattenTemp' ( temp structure{ temp float clip,  temp float clip0,  temp float clip7,  temp float cull,  temp float cull2,  temp float cull5,  temp int ii})
-0:12            Constant:
-0:12              5 (const int)
-0:12        move second child to first child ( temp int)
-0:12          ii: direct index for structure ( temp int)
-0:12            '@entryPointOutput' (layout( location=0) out structure{ temp int ii})
-0:12            Constant:
-0:12              0 (const int)
-0:12          ii: direct index for structure ( temp int)
-0:12            'flattenTemp' ( temp structure{ temp float clip,  temp float clip0,  temp float clip7,  temp float cull,  temp float cull2,  temp float cull5,  temp int ii})
-0:12            Constant:
-0:12              6 (const int)
+0:10      Sequence
+0:10        move second child to first child ( temp float)
+0:10          clip0: direct index for structure ( temp float)
+0:?             'ins' ( temp structure{ temp float clip0,  temp float clip1,  temp float cull0,  temp float cull1,  temp int ii})
+0:10            Constant:
+0:10              0 (const int)
+0:?           'ins.clip0' (layout( location=0) in float)
+0:10        move second child to first child ( temp float)
+0:10          clip1: direct index for structure ( temp float)
+0:?             'ins' ( temp structure{ temp float clip0,  temp float clip1,  temp float cull0,  temp float cull1,  temp int ii})
+0:10            Constant:
+0:10              1 (const int)
+0:?           'ins.clip1' (layout( location=1) in float)
+0:10        move second child to first child ( temp float)
+0:10          cull0: direct index for structure ( temp float)
+0:?             'ins' ( temp structure{ temp float clip0,  temp float clip1,  temp float cull0,  temp float cull1,  temp int ii})
+0:10            Constant:
+0:10              2 (const int)
+0:?           'ins.cull0' (layout( location=0) in float)
+0:10        move second child to first child ( temp float)
+0:10          cull1: direct index for structure ( temp float)
+0:?             'ins' ( temp structure{ temp float clip0,  temp float clip1,  temp float cull0,  temp float cull1,  temp int ii})
+0:10            Constant:
+0:10              3 (const int)
+0:?           'ins.cull1' (layout( location=1) in float)
+0:10        move second child to first child ( temp int)
+0:10          ii: direct index for structure ( temp int)
+0:?             'ins' ( temp structure{ temp float clip0,  temp float clip1,  temp float cull0,  temp float cull1,  temp int ii})
+0:10            Constant:
+0:10              4 (const int)
+0:?           'ins.ii' ( in int InstanceIndex)
+0:10      Sequence
+0:10        move second child to first child ( temp structure{ temp float clip0,  temp float clip1,  temp float cull0,  temp float cull1,  temp int ii})
+0:10          'flattenTemp' ( temp structure{ temp float clip0,  temp float clip1,  temp float cull0,  temp float cull1,  temp int ii})
+0:10          Function Call: @main(struct-S-f1-f1-f1-f1-i11; ( temp structure{ temp float clip0,  temp float clip1,  temp float cull0,  temp float cull1,  temp int ii})
+0:?             'ins' ( temp structure{ temp float clip0,  temp float clip1,  temp float cull0,  temp float cull1,  temp int ii})
+0:?         Sequence
+0:10          move second child to first child ( temp float)
+0:10            direct index ( out float ClipDistance)
+0:?               '@entryPointOutput.clip1' ( out 2-element array of float ClipDistance)
+0:10              Constant:
+0:10                0 (const int)
+0:10            clip0: direct index for structure ( temp float)
+0:10              'flattenTemp' ( temp structure{ temp float clip0,  temp float clip1,  temp float cull0,  temp float cull1,  temp int ii})
+0:10              Constant:
+0:10                0 (const int)
+0:?         Sequence
+0:10          move second child to first child ( temp float)
+0:10            direct index ( out float ClipDistance)
+0:?               '@entryPointOutput.clip1' ( out 2-element array of float ClipDistance)
+0:10              Constant:
+0:10                1 (const int)
+0:10            clip1: direct index for structure ( temp float)
+0:10              'flattenTemp' ( temp structure{ temp float clip0,  temp float clip1,  temp float cull0,  temp float cull1,  temp int ii})
+0:10              Constant:
+0:10                1 (const int)
+0:?         Sequence
+0:10          move second child to first child ( temp float)
+0:10            direct index ( out float CullDistance)
+0:?               '@entryPointOutput.cull1' ( out 2-element array of float CullDistance)
+0:10              Constant:
+0:10                0 (const int)
+0:10            cull0: direct index for structure ( temp float)
+0:10              'flattenTemp' ( temp structure{ temp float clip0,  temp float clip1,  temp float cull0,  temp float cull1,  temp int ii})
+0:10              Constant:
+0:10                2 (const int)
+0:?         Sequence
+0:10          move second child to first child ( temp float)
+0:10            direct index ( out float CullDistance)
+0:?               '@entryPointOutput.cull1' ( out 2-element array of float CullDistance)
+0:10              Constant:
+0:10                1 (const int)
+0:10            cull1: direct index for structure ( temp float)
+0:10              'flattenTemp' ( temp structure{ temp float clip0,  temp float clip1,  temp float cull0,  temp float cull1,  temp int ii})
+0:10              Constant:
+0:10                3 (const int)
+0:10        move second child to first child ( temp int)
+0:?           '@entryPointOutput.ii' (layout( location=0) out int)
+0:10          ii: direct index for structure ( temp int)
+0:10            'flattenTemp' ( temp structure{ temp float clip0,  temp float clip1,  temp float cull0,  temp float cull1,  temp int ii})
+0:10            Constant:
+0:10              4 (const int)
 0:?   Linker Objects
-0:?     '@entryPointOutput' (layout( location=0) out structure{ temp int ii})
-0:?     'clip' (layout( location=0) in float)
-0:?     'clip0' (layout( location=1) in float)
-0:?     'clip7' (layout( location=2) in float)
-0:?     'cull' (layout( location=3) in float)
-0:?     'cull2' (layout( location=4) in float)
-0:?     'cull5' (layout( location=5) in float)
-0:?     'ii' ( in int InstanceIndex)
+0:?     '@entryPointOutput.ii' (layout( location=0) out int)
+0:?     'ins.ii' ( in int InstanceIndex)
+0:?     'ins.clip0' (layout( location=0) in float)
+0:?     'ins.clip1' (layout( location=1) in float)
+0:?     'ins.cull0' (layout( location=0) in float)
+0:?     'ins.cull1' (layout( location=1) in float)
+0:?     '@entryPointOutput.clip1' ( out 2-element array of float ClipDistance)
+0:?     '@entryPointOutput.cull1' ( out 2-element array of float CullDistance)
 
 
 Linked vertex stage:
@@ -119,253 +108,223 @@
 
 Shader version: 500
 0:? Sequence
-0:12  Function Definition: @main(struct-S-f1-f1-f1-f1-f1-f1-i11; ( temp structure{ temp float clip,  temp float clip0,  temp float clip7,  temp float cull,  temp float cull2,  temp float cull5,  temp int ii})
-0:12    Function Parameters: 
-0:12      'ins' ( in structure{ temp float clip,  temp float clip0,  temp float clip7,  temp float cull,  temp float cull2,  temp float cull5,  temp int ii})
+0:10  Function Definition: @main(struct-S-f1-f1-f1-f1-i11; ( temp structure{ temp float clip0,  temp float clip1,  temp float cull0,  temp float cull1,  temp int ii})
+0:10    Function Parameters: 
+0:10      'ins' ( in structure{ temp float clip0,  temp float clip1,  temp float cull0,  temp float cull1,  temp int ii})
 0:?     Sequence
-0:14      Branch: Return with expression
-0:14        's' ( temp structure{ temp float clip,  temp float clip0,  temp float clip7,  temp float cull,  temp float cull2,  temp float cull5,  temp int ii})
-0:12  Function Definition: main( ( temp void)
-0:12    Function Parameters: 
+0:12      Branch: Return with expression
+0:12        's' ( temp structure{ temp float clip0,  temp float clip1,  temp float cull0,  temp float cull1,  temp int ii})
+0:10  Function Definition: main( ( temp void)
+0:10    Function Parameters: 
 0:?     Sequence
-0:12      Sequence
-0:12        move second child to first child ( temp float)
-0:12          clip: direct index for structure ( temp float)
-0:?             'ins' ( temp structure{ temp float clip,  temp float clip0,  temp float clip7,  temp float cull,  temp float cull2,  temp float cull5,  temp int ii})
-0:12            Constant:
-0:12              0 (const int)
-0:?           'clip' (layout( location=0) in float)
-0:12        move second child to first child ( temp float)
-0:12          clip0: direct index for structure ( temp float)
-0:?             'ins' ( temp structure{ temp float clip,  temp float clip0,  temp float clip7,  temp float cull,  temp float cull2,  temp float cull5,  temp int ii})
-0:12            Constant:
-0:12              1 (const int)
-0:?           'clip0' (layout( location=1) in float)
-0:12        move second child to first child ( temp float)
-0:12          clip7: direct index for structure ( temp float)
-0:?             'ins' ( temp structure{ temp float clip,  temp float clip0,  temp float clip7,  temp float cull,  temp float cull2,  temp float cull5,  temp int ii})
-0:12            Constant:
-0:12              2 (const int)
-0:?           'clip7' (layout( location=2) in float)
-0:12        move second child to first child ( temp float)
-0:12          cull: direct index for structure ( temp float)
-0:?             'ins' ( temp structure{ temp float clip,  temp float clip0,  temp float clip7,  temp float cull,  temp float cull2,  temp float cull5,  temp int ii})
-0:12            Constant:
-0:12              3 (const int)
-0:?           'cull' (layout( location=3) in float)
-0:12        move second child to first child ( temp float)
-0:12          cull2: direct index for structure ( temp float)
-0:?             'ins' ( temp structure{ temp float clip,  temp float clip0,  temp float clip7,  temp float cull,  temp float cull2,  temp float cull5,  temp int ii})
-0:12            Constant:
-0:12              4 (const int)
-0:?           'cull2' (layout( location=4) in float)
-0:12        move second child to first child ( temp float)
-0:12          cull5: direct index for structure ( temp float)
-0:?             'ins' ( temp structure{ temp float clip,  temp float clip0,  temp float clip7,  temp float cull,  temp float cull2,  temp float cull5,  temp int ii})
-0:12            Constant:
-0:12              5 (const int)
-0:?           'cull5' (layout( location=5) in float)
-0:12        move second child to first child ( temp int)
-0:12          ii: direct index for structure ( temp int)
-0:?             'ins' ( temp structure{ temp float clip,  temp float clip0,  temp float clip7,  temp float cull,  temp float cull2,  temp float cull5,  temp int ii})
-0:12            Constant:
-0:12              6 (const int)
-0:?           'ii' ( in int InstanceIndex)
-0:12      Sequence
-0:12        move second child to first child ( temp structure{ temp float clip,  temp float clip0,  temp float clip7,  temp float cull,  temp float cull2,  temp float cull5,  temp int ii})
-0:12          'flattenTemp' ( temp structure{ temp float clip,  temp float clip0,  temp float clip7,  temp float cull,  temp float cull2,  temp float cull5,  temp int ii})
-0:12          Function Call: @main(struct-S-f1-f1-f1-f1-f1-f1-i11; ( temp structure{ temp float clip,  temp float clip0,  temp float clip7,  temp float cull,  temp float cull2,  temp float cull5,  temp int ii})
-0:?             'ins' ( temp structure{ temp float clip,  temp float clip0,  temp float clip7,  temp float cull,  temp float cull2,  temp float cull5,  temp int ii})
-0:12        move second child to first child ( temp float)
-0:?           '@entryPointOutput_clip7' ( out float ClipDistance)
-0:12          clip: direct index for structure ( temp float)
-0:12            'flattenTemp' ( temp structure{ temp float clip,  temp float clip0,  temp float clip7,  temp float cull,  temp float cull2,  temp float cull5,  temp int ii})
-0:12            Constant:
-0:12              0 (const int)
-0:12        move second child to first child ( temp float)
-0:?           '@entryPointOutput_clip7' ( out float ClipDistance)
-0:12          clip0: direct index for structure ( temp float)
-0:12            'flattenTemp' ( temp structure{ temp float clip,  temp float clip0,  temp float clip7,  temp float cull,  temp float cull2,  temp float cull5,  temp int ii})
-0:12            Constant:
-0:12              1 (const int)
-0:12        move second child to first child ( temp float)
-0:?           '@entryPointOutput_clip7' ( out float ClipDistance)
-0:12          clip7: direct index for structure ( temp float)
-0:12            'flattenTemp' ( temp structure{ temp float clip,  temp float clip0,  temp float clip7,  temp float cull,  temp float cull2,  temp float cull5,  temp int ii})
-0:12            Constant:
-0:12              2 (const int)
-0:12        move second child to first child ( temp float)
-0:?           '@entryPointOutput_cull5' ( out float CullDistance)
-0:12          cull: direct index for structure ( temp float)
-0:12            'flattenTemp' ( temp structure{ temp float clip,  temp float clip0,  temp float clip7,  temp float cull,  temp float cull2,  temp float cull5,  temp int ii})
-0:12            Constant:
-0:12              3 (const int)
-0:12        move second child to first child ( temp float)
-0:?           '@entryPointOutput_cull5' ( out float CullDistance)
-0:12          cull2: direct index for structure ( temp float)
-0:12            'flattenTemp' ( temp structure{ temp float clip,  temp float clip0,  temp float clip7,  temp float cull,  temp float cull2,  temp float cull5,  temp int ii})
-0:12            Constant:
-0:12              4 (const int)
-0:12        move second child to first child ( temp float)
-0:?           '@entryPointOutput_cull5' ( out float CullDistance)
-0:12          cull5: direct index for structure ( temp float)
-0:12            'flattenTemp' ( temp structure{ temp float clip,  temp float clip0,  temp float clip7,  temp float cull,  temp float cull2,  temp float cull5,  temp int ii})
-0:12            Constant:
-0:12              5 (const int)
-0:12        move second child to first child ( temp int)
-0:12          ii: direct index for structure ( temp int)
-0:12            '@entryPointOutput' (layout( location=0) out structure{ temp int ii})
-0:12            Constant:
-0:12              0 (const int)
-0:12          ii: direct index for structure ( temp int)
-0:12            'flattenTemp' ( temp structure{ temp float clip,  temp float clip0,  temp float clip7,  temp float cull,  temp float cull2,  temp float cull5,  temp int ii})
-0:12            Constant:
-0:12              6 (const int)
+0:10      Sequence
+0:10        move second child to first child ( temp float)
+0:10          clip0: direct index for structure ( temp float)
+0:?             'ins' ( temp structure{ temp float clip0,  temp float clip1,  temp float cull0,  temp float cull1,  temp int ii})
+0:10            Constant:
+0:10              0 (const int)
+0:?           'ins.clip0' (layout( location=0) in float)
+0:10        move second child to first child ( temp float)
+0:10          clip1: direct index for structure ( temp float)
+0:?             'ins' ( temp structure{ temp float clip0,  temp float clip1,  temp float cull0,  temp float cull1,  temp int ii})
+0:10            Constant:
+0:10              1 (const int)
+0:?           'ins.clip1' (layout( location=1) in float)
+0:10        move second child to first child ( temp float)
+0:10          cull0: direct index for structure ( temp float)
+0:?             'ins' ( temp structure{ temp float clip0,  temp float clip1,  temp float cull0,  temp float cull1,  temp int ii})
+0:10            Constant:
+0:10              2 (const int)
+0:?           'ins.cull0' (layout( location=0) in float)
+0:10        move second child to first child ( temp float)
+0:10          cull1: direct index for structure ( temp float)
+0:?             'ins' ( temp structure{ temp float clip0,  temp float clip1,  temp float cull0,  temp float cull1,  temp int ii})
+0:10            Constant:
+0:10              3 (const int)
+0:?           'ins.cull1' (layout( location=1) in float)
+0:10        move second child to first child ( temp int)
+0:10          ii: direct index for structure ( temp int)
+0:?             'ins' ( temp structure{ temp float clip0,  temp float clip1,  temp float cull0,  temp float cull1,  temp int ii})
+0:10            Constant:
+0:10              4 (const int)
+0:?           'ins.ii' ( in int InstanceIndex)
+0:10      Sequence
+0:10        move second child to first child ( temp structure{ temp float clip0,  temp float clip1,  temp float cull0,  temp float cull1,  temp int ii})
+0:10          'flattenTemp' ( temp structure{ temp float clip0,  temp float clip1,  temp float cull0,  temp float cull1,  temp int ii})
+0:10          Function Call: @main(struct-S-f1-f1-f1-f1-i11; ( temp structure{ temp float clip0,  temp float clip1,  temp float cull0,  temp float cull1,  temp int ii})
+0:?             'ins' ( temp structure{ temp float clip0,  temp float clip1,  temp float cull0,  temp float cull1,  temp int ii})
+0:?         Sequence
+0:10          move second child to first child ( temp float)
+0:10            direct index ( out float ClipDistance)
+0:?               '@entryPointOutput.clip1' ( out 2-element array of float ClipDistance)
+0:10              Constant:
+0:10                0 (const int)
+0:10            clip0: direct index for structure ( temp float)
+0:10              'flattenTemp' ( temp structure{ temp float clip0,  temp float clip1,  temp float cull0,  temp float cull1,  temp int ii})
+0:10              Constant:
+0:10                0 (const int)
+0:?         Sequence
+0:10          move second child to first child ( temp float)
+0:10            direct index ( out float ClipDistance)
+0:?               '@entryPointOutput.clip1' ( out 2-element array of float ClipDistance)
+0:10              Constant:
+0:10                1 (const int)
+0:10            clip1: direct index for structure ( temp float)
+0:10              'flattenTemp' ( temp structure{ temp float clip0,  temp float clip1,  temp float cull0,  temp float cull1,  temp int ii})
+0:10              Constant:
+0:10                1 (const int)
+0:?         Sequence
+0:10          move second child to first child ( temp float)
+0:10            direct index ( out float CullDistance)
+0:?               '@entryPointOutput.cull1' ( out 2-element array of float CullDistance)
+0:10              Constant:
+0:10                0 (const int)
+0:10            cull0: direct index for structure ( temp float)
+0:10              'flattenTemp' ( temp structure{ temp float clip0,  temp float clip1,  temp float cull0,  temp float cull1,  temp int ii})
+0:10              Constant:
+0:10                2 (const int)
+0:?         Sequence
+0:10          move second child to first child ( temp float)
+0:10            direct index ( out float CullDistance)
+0:?               '@entryPointOutput.cull1' ( out 2-element array of float CullDistance)
+0:10              Constant:
+0:10                1 (const int)
+0:10            cull1: direct index for structure ( temp float)
+0:10              'flattenTemp' ( temp structure{ temp float clip0,  temp float clip1,  temp float cull0,  temp float cull1,  temp int ii})
+0:10              Constant:
+0:10                3 (const int)
+0:10        move second child to first child ( temp int)
+0:?           '@entryPointOutput.ii' (layout( location=0) out int)
+0:10          ii: direct index for structure ( temp int)
+0:10            'flattenTemp' ( temp structure{ temp float clip0,  temp float clip1,  temp float cull0,  temp float cull1,  temp int ii})
+0:10            Constant:
+0:10              4 (const int)
 0:?   Linker Objects
-0:?     '@entryPointOutput' (layout( location=0) out structure{ temp int ii})
-0:?     'clip' (layout( location=0) in float)
-0:?     'clip0' (layout( location=1) in float)
-0:?     'clip7' (layout( location=2) in float)
-0:?     'cull' (layout( location=3) in float)
-0:?     'cull2' (layout( location=4) in float)
-0:?     'cull5' (layout( location=5) in float)
-0:?     'ii' ( in int InstanceIndex)
+0:?     '@entryPointOutput.ii' (layout( location=0) out int)
+0:?     'ins.ii' ( in int InstanceIndex)
+0:?     'ins.clip0' (layout( location=0) in float)
+0:?     'ins.clip1' (layout( location=1) in float)
+0:?     'ins.cull0' (layout( location=0) in float)
+0:?     'ins.cull1' (layout( location=1) in float)
+0:?     '@entryPointOutput.clip1' ( out 2-element array of float ClipDistance)
+0:?     '@entryPointOutput.cull1' ( out 2-element array of float CullDistance)
 
 // Module Version 10000
-// Generated by (magic number): 80001
-// Id's are bound by 77
+// Generated by (magic number): 80007
+// Id's are bound by 70
 
                               Capability Shader
                               Capability ClipDistance
                               Capability CullDistance
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Vertex 4  "main" 21 26 30 34 38 42 47 56 63 72
+                              EntryPoint Vertex 4  "main" 21 26 30 34 39 51 59 67
                               Source HLSL 500
                               Name 4  "main"
                               Name 8  "S"
-                              MemberName 8(S) 0  "clip"
-                              MemberName 8(S) 1  "clip0"
-                              MemberName 8(S) 2  "clip7"
-                              MemberName 8(S) 3  "cull"
-                              MemberName 8(S) 4  "cull2"
-                              MemberName 8(S) 5  "cull5"
-                              MemberName 8(S) 6  "ii"
-                              Name 12  "@main(struct-S-f1-f1-f1-f1-f1-f1-i11;"
+                              MemberName 8(S) 0  "clip0"
+                              MemberName 8(S) 1  "clip1"
+                              MemberName 8(S) 2  "cull0"
+                              MemberName 8(S) 3  "cull1"
+                              MemberName 8(S) 4  "ii"
+                              Name 12  "@main(struct-S-f1-f1-f1-f1-i11;"
                               Name 11  "ins"
                               Name 14  "s"
                               Name 18  "ins"
-                              Name 21  "clip"
-                              Name 26  "clip0"
-                              Name 30  "clip7"
-                              Name 34  "cull"
-                              Name 38  "cull2"
-                              Name 42  "cull5"
-                              Name 47  "ii"
-                              Name 51  "flattenTemp"
-                              Name 52  "param"
-                              Name 56  "@entryPointOutput_clip7"
-                              Name 63  "@entryPointOutput_cull5"
-                              Name 70  "S"
-                              MemberName 70(S) 0  "ii"
-                              Name 72  "@entryPointOutput"
-                              Decorate 21(clip) Location 0
-                              Decorate 26(clip0) Location 1
-                              Decorate 30(clip7) Location 2
-                              Decorate 34(cull) Location 3
-                              Decorate 38(cull2) Location 4
-                              Decorate 42(cull5) Location 5
-                              Decorate 47(ii) BuiltIn InstanceIndex
-                              Decorate 56(@entryPointOutput_clip7) BuiltIn ClipDistance
-                              Decorate 63(@entryPointOutput_cull5) BuiltIn CullDistance
-                              Decorate 72(@entryPointOutput) Location 0
+                              Name 21  "ins.clip0"
+                              Name 26  "ins.clip1"
+                              Name 30  "ins.cull0"
+                              Name 34  "ins.cull1"
+                              Name 39  "ins.ii"
+                              Name 43  "flattenTemp"
+                              Name 44  "param"
+                              Name 51  "@entryPointOutput.clip1"
+                              Name 59  "@entryPointOutput.cull1"
+                              Name 67  "@entryPointOutput.ii"
+                              Decorate 21(ins.clip0) Location 0
+                              Decorate 26(ins.clip1) Location 1
+                              Decorate 30(ins.cull0) Location 0
+                              Decorate 34(ins.cull1) Location 1
+                              Decorate 39(ins.ii) BuiltIn InstanceIndex
+                              Decorate 51(@entryPointOutput.clip1) BuiltIn ClipDistance
+                              Decorate 59(@entryPointOutput.cull1) BuiltIn CullDistance
+                              Decorate 67(@entryPointOutput.ii) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
                7:             TypeInt 32 1
-            8(S):             TypeStruct 6(float) 6(float) 6(float) 6(float) 6(float) 6(float) 7(int)
+            8(S):             TypeStruct 6(float) 6(float) 6(float) 6(float) 7(int)
                9:             TypePointer Function 8(S)
               10:             TypeFunction 8(S) 9(ptr)
               19:      7(int) Constant 0
               20:             TypePointer Input 6(float)
-        21(clip):     20(ptr) Variable Input
+   21(ins.clip0):     20(ptr) Variable Input
               23:             TypePointer Function 6(float)
               25:      7(int) Constant 1
-       26(clip0):     20(ptr) Variable Input
+   26(ins.clip1):     20(ptr) Variable Input
               29:      7(int) Constant 2
-       30(clip7):     20(ptr) Variable Input
+   30(ins.cull0):     20(ptr) Variable Input
               33:      7(int) Constant 3
-        34(cull):     20(ptr) Variable Input
+   34(ins.cull1):     20(ptr) Variable Input
               37:      7(int) Constant 4
-       38(cull2):     20(ptr) Variable Input
-              41:      7(int) Constant 5
-       42(cull5):     20(ptr) Variable Input
-              45:      7(int) Constant 6
-              46:             TypePointer Input 7(int)
-          47(ii):     46(ptr) Variable Input
-              49:             TypePointer Function 7(int)
-              55:             TypePointer Output 6(float)
-56(@entryPointOutput_clip7):     55(ptr) Variable Output
-63(@entryPointOutput_cull5):     55(ptr) Variable Output
-           70(S):             TypeStruct 7(int)
-              71:             TypePointer Output 70(S)
-72(@entryPointOutput):     71(ptr) Variable Output
-              75:             TypePointer Output 7(int)
+              38:             TypePointer Input 7(int)
+      39(ins.ii):     38(ptr) Variable Input
+              41:             TypePointer Function 7(int)
+              47:             TypeInt 32 0
+              48:     47(int) Constant 2
+              49:             TypeArray 6(float) 48
+              50:             TypePointer Output 49
+51(@entryPointOutput.clip1):     50(ptr) Variable Output
+              54:             TypePointer Output 6(float)
+59(@entryPointOutput.cull1):     50(ptr) Variable Output
+              66:             TypePointer Output 7(int)
+67(@entryPointOutput.ii):     66(ptr) Variable Output
          4(main):           2 Function None 3
                5:             Label
          18(ins):      9(ptr) Variable Function
- 51(flattenTemp):      9(ptr) Variable Function
-       52(param):      9(ptr) Variable Function
-              22:    6(float) Load 21(clip)
+ 43(flattenTemp):      9(ptr) Variable Function
+       44(param):      9(ptr) Variable Function
+              22:    6(float) Load 21(ins.clip0)
               24:     23(ptr) AccessChain 18(ins) 19
                               Store 24 22
-              27:    6(float) Load 26(clip0)
+              27:    6(float) Load 26(ins.clip1)
               28:     23(ptr) AccessChain 18(ins) 25
                               Store 28 27
-              31:    6(float) Load 30(clip7)
+              31:    6(float) Load 30(ins.cull0)
               32:     23(ptr) AccessChain 18(ins) 29
                               Store 32 31
-              35:    6(float) Load 34(cull)
+              35:    6(float) Load 34(ins.cull1)
               36:     23(ptr) AccessChain 18(ins) 33
                               Store 36 35
-              39:    6(float) Load 38(cull2)
-              40:     23(ptr) AccessChain 18(ins) 37
-                              Store 40 39
-              43:    6(float) Load 42(cull5)
-              44:     23(ptr) AccessChain 18(ins) 41
-                              Store 44 43
-              48:      7(int) Load 47(ii)
-              50:     49(ptr) AccessChain 18(ins) 45
-                              Store 50 48
-              53:        8(S) Load 18(ins)
-                              Store 52(param) 53
-              54:        8(S) FunctionCall 12(@main(struct-S-f1-f1-f1-f1-f1-f1-i11;) 52(param)
-                              Store 51(flattenTemp) 54
-              57:     23(ptr) AccessChain 51(flattenTemp) 19
-              58:    6(float) Load 57
-                              Store 56(@entryPointOutput_clip7) 58
-              59:     23(ptr) AccessChain 51(flattenTemp) 25
-              60:    6(float) Load 59
-                              Store 56(@entryPointOutput_clip7) 60
-              61:     23(ptr) AccessChain 51(flattenTemp) 29
-              62:    6(float) Load 61
-                              Store 56(@entryPointOutput_clip7) 62
-              64:     23(ptr) AccessChain 51(flattenTemp) 33
-              65:    6(float) Load 64
-                              Store 63(@entryPointOutput_cull5) 65
-              66:     23(ptr) AccessChain 51(flattenTemp) 37
-              67:    6(float) Load 66
-                              Store 63(@entryPointOutput_cull5) 67
-              68:     23(ptr) AccessChain 51(flattenTemp) 41
-              69:    6(float) Load 68
-                              Store 63(@entryPointOutput_cull5) 69
-              73:     49(ptr) AccessChain 51(flattenTemp) 45
-              74:      7(int) Load 73
-              76:     75(ptr) AccessChain 72(@entryPointOutput) 19
-                              Store 76 74
+              40:      7(int) Load 39(ins.ii)
+              42:     41(ptr) AccessChain 18(ins) 37
+                              Store 42 40
+              45:        8(S) Load 18(ins)
+                              Store 44(param) 45
+              46:        8(S) FunctionCall 12(@main(struct-S-f1-f1-f1-f1-i11;) 44(param)
+                              Store 43(flattenTemp) 46
+              52:     23(ptr) AccessChain 43(flattenTemp) 19
+              53:    6(float) Load 52
+              55:     54(ptr) AccessChain 51(@entryPointOutput.clip1) 19
+                              Store 55 53
+              56:     23(ptr) AccessChain 43(flattenTemp) 25
+              57:    6(float) Load 56
+              58:     54(ptr) AccessChain 51(@entryPointOutput.clip1) 25
+                              Store 58 57
+              60:     23(ptr) AccessChain 43(flattenTemp) 29
+              61:    6(float) Load 60
+              62:     54(ptr) AccessChain 59(@entryPointOutput.cull1) 19
+                              Store 62 61
+              63:     23(ptr) AccessChain 43(flattenTemp) 33
+              64:    6(float) Load 63
+              65:     54(ptr) AccessChain 59(@entryPointOutput.cull1) 25
+                              Store 65 64
+              68:     41(ptr) AccessChain 43(flattenTemp) 37
+              69:      7(int) Load 68
+                              Store 67(@entryPointOutput.ii) 69
                               Return
                               FunctionEnd
-12(@main(struct-S-f1-f1-f1-f1-f1-f1-i11;):        8(S) Function None 10
+12(@main(struct-S-f1-f1-f1-f1-i11;):        8(S) Function None 10
          11(ins):      9(ptr) FunctionParameter
               13:             Label
            14(s):      9(ptr) Variable Function
diff --git a/Test/baseResults/hlsl.semicolons.frag.out b/Test/baseResults/hlsl.semicolons.frag.out
index 2c26daa..94307a6 100644
--- a/Test/baseResults/hlsl.semicolons.frag.out
+++ b/Test/baseResults/hlsl.semicolons.frag.out
@@ -26,13 +26,13 @@
 0:?     Sequence
 0:13      Sequence
 0:13        move second child to first child ( temp 4-component vector of float)
-0:?           'color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.color' (layout( location=0) out 4-component vector of float)
 0:13          color: direct index for structure ( temp 4-component vector of float)
 0:13            Function Call: @main( ( temp structure{ temp 4-component vector of float color})
 0:13            Constant:
 0:13              0 (const int)
 0:?   Linker Objects
-0:?     'color' (layout( location=0) out 4-component vector of float)
+0:?     '@entryPointOutput.color' (layout( location=0) out 4-component vector of float)
 
 
 Linked fragment stage:
@@ -65,16 +65,16 @@
 0:?     Sequence
 0:13      Sequence
 0:13        move second child to first child ( temp 4-component vector of float)
-0:?           'color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.color' (layout( location=0) out 4-component vector of float)
 0:13          color: direct index for structure ( temp 4-component vector of float)
 0:13            Function Call: @main( ( temp structure{ temp 4-component vector of float color})
 0:13            Constant:
 0:13              0 (const int)
 0:?   Linker Objects
-0:?     'color' (layout( location=0) out 4-component vector of float)
+0:?     '@entryPointOutput.color' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 31
 
                               Capability Shader
@@ -90,8 +90,8 @@
                               MemberName 12(PS_OUTPUT) 0  "color"
                               Name 14  "@main("
                               Name 17  "ps_output"
-                              Name 28  "color"
-                              Decorate 28(color) Location 0
+                              Name 28  "@entryPointOutput.color"
+                              Decorate 28(@entryPointOutput.color) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
               10:             TypeFloat 32
@@ -105,12 +105,12 @@
               21:   11(fvec4) ConstantComposite 20 20 20 20
               22:             TypePointer Function 11(fvec4)
               27:             TypePointer Output 11(fvec4)
-       28(color):     27(ptr) Variable Output
+28(@entryPointOutput.color):     27(ptr) Variable Output
          4(main):           2 Function None 3
                5:             Label
               29:12(PS_OUTPUT) FunctionCall 14(@main()
               30:   11(fvec4) CompositeExtract 29 0
-                              Store 28(color) 30
+                              Store 28(@entryPointOutput.color) 30
                               Return
                               FunctionEnd
       6(MyFunc():           2 Function None 3
diff --git a/Test/baseResults/hlsl.shapeConv.frag.out b/Test/baseResults/hlsl.shapeConv.frag.out
old mode 100755
new mode 100644
index 773134c..d283809
--- a/Test/baseResults/hlsl.shapeConv.frag.out
+++ b/Test/baseResults/hlsl.shapeConv.frag.out
@@ -40,8 +40,7 @@
 0:10      move second child to first child ( temp 3-component vector of float)
 0:10        'u' ( temp 3-component vector of float)
 0:10        Construct vec3 ( temp 3-component vector of float)
-0:10          Construct float ( temp float)
-0:10            'f' ( in float)
+0:10          'f' ( in float)
 0:11      Sequence
 0:11        move second child to first child ( temp 2-component vector of float)
 0:11          'w' ( temp 2-component vector of float)
@@ -203,8 +202,7 @@
 0:10      move second child to first child ( temp 3-component vector of float)
 0:10        'u' ( temp 3-component vector of float)
 0:10        Construct vec3 ( temp 3-component vector of float)
-0:10          Construct float ( temp float)
-0:10            'f' ( in float)
+0:10          'f' ( in float)
 0:11      Sequence
 0:11        move second child to first child ( temp 2-component vector of float)
 0:11          'w' ( temp 2-component vector of float)
@@ -321,7 +319,7 @@
 0:?   Linker Objects
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 127
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.shapeConvRet.frag.out b/Test/baseResults/hlsl.shapeConvRet.frag.out
old mode 100755
new mode 100644
index e9dba22..fc12f7f
--- a/Test/baseResults/hlsl.shapeConvRet.frag.out
+++ b/Test/baseResults/hlsl.shapeConvRet.frag.out
@@ -68,7 +68,7 @@
 0:?     'f' (layout( location=0) in float)
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 35
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.shift.per-set.frag.out b/Test/baseResults/hlsl.shift.per-set.frag.out
new file mode 100644
index 0000000..7c7d383
--- /dev/null
+++ b/Test/baseResults/hlsl.shift.per-set.frag.out
@@ -0,0 +1,230 @@
+hlsl.shift.per-set.frag
+Shader version: 500
+gl_FragCoord origin is upper left
+0:? Sequence
+0:34  Function Definition: @main( ( temp 4-component vector of float)
+0:34    Function Parameters: 
+0:?     Sequence
+0:35      't1' (layout( set=1 binding=1) uniform texture1D)
+0:36      't2' (layout( set=1 binding=2) uniform texture2D)
+0:37      't3' (layout( set=2 binding=1) uniform texture3D)
+0:38      direct index (layout( row_major std430) buffer 4-component vector of float)
+0:38        @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of 4-component vector of float)
+0:38          't4' (layout( set=3 binding=1 row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of 4-component vector of float @data})
+0:38          Constant:
+0:38            0 (const uint)
+0:38        Constant:
+0:38          0 (const int)
+0:39      indirect index (layout( row_major std430) buffer uint)
+0:39        @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:39          't5' (layout( set=3 binding=2 row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
+0:39          Constant:
+0:39            0 (const uint)
+0:39        right-shift ( temp int)
+0:39          Constant:
+0:39            0 (const int)
+0:39          Constant:
+0:39            2 (const int)
+0:40      't6' (layout( set=3 binding=3 rgba32f) uniform textureBuffer)
+0:42      's1' (layout( set=1 binding=1) uniform sampler)
+0:43      's2' (layout( set=2 binding=2) uniform sampler)
+0:45      'u1' (layout( set=1 binding=1 rgba32f) uniform image1D)
+0:46      'u2' (layout( set=2 binding=2 rgba32f) uniform image2D)
+0:47      'u3' (layout( set=2 binding=3 rgba32f) uniform image3D)
+0:49      imageLoad ( temp float)
+0:49        'u4' (layout( set=1 binding=4 r32f) uniform imageBuffer)
+0:49        Constant:
+0:49          0 (const int)
+0:50      indirect index (layout( row_major std430) buffer uint)
+0:50        @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:50          'u5' (layout( set=2 binding=4 row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
+0:50          Constant:
+0:50            0 (const uint)
+0:50        right-shift ( temp int)
+0:50          Constant:
+0:50            0 (const int)
+0:50          Constant:
+0:50            2 (const int)
+0:51      direct index (layout( row_major std430) buffer float)
+0:51        @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of float)
+0:51          'u6' (layout( set=3 binding=4 row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of float @data})
+0:51          Constant:
+0:51            0 (const uint)
+0:51        Constant:
+0:51          0 (const int)
+0:52      'u7' (layout( set=4 binding=4 row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of float @data})
+0:53      'u8' (layout( set=5 binding=4 row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of float @data})
+0:55      cb1: direct index for structure (layout( row_major std140) uniform int)
+0:55        'anon@0' (layout( set=6 binding=1 row_major std140) uniform block{layout( row_major std140) uniform int cb1})
+0:55        Constant:
+0:55          0 (const uint)
+0:56      tb1: direct index for structure (layout( row_major std430) buffer int)
+0:56        'anon@1' (layout( binding=7 row_major std430) readonly buffer block{layout( row_major std430) buffer int tb1})
+0:56        Constant:
+0:56          0 (const uint)
+0:57      'ts6' (layout( set=6 binding=1) uniform texture3D)
+0:59      Branch: Return with expression
+0:59        Constant:
+0:59          0.000000
+0:59          0.000000
+0:59          0.000000
+0:59          0.000000
+0:34  Function Definition: main( ( temp void)
+0:34    Function Parameters: 
+0:?     Sequence
+0:34      move second child to first child ( temp 4-component vector of float)
+0:?         '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+0:34        Function Call: @main( ( temp 4-component vector of float)
+0:?   Linker Objects
+0:?     's1' (layout( set=1 binding=1) uniform sampler)
+0:?     's2' (layout( set=2 binding=2) uniform sampler)
+0:?     't1' (layout( set=1 binding=1) uniform texture1D)
+0:?     't2' (layout( set=1 binding=2) uniform texture2D)
+0:?     't3' (layout( set=2 binding=1) uniform texture3D)
+0:?     'ts6' (layout( set=6 binding=1) uniform texture3D)
+0:?     't4' (layout( set=3 binding=1 row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of 4-component vector of float @data})
+0:?     't5' (layout( set=3 binding=2 row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
+0:?     't6' (layout( set=3 binding=3 rgba32f) uniform textureBuffer)
+0:?     'u1' (layout( set=1 binding=1 rgba32f) uniform image1D)
+0:?     'u2' (layout( set=2 binding=2 rgba32f) uniform image2D)
+0:?     'u3' (layout( set=2 binding=3 rgba32f) uniform image3D)
+0:?     'u4' (layout( set=1 binding=4 r32f) uniform imageBuffer)
+0:?     'u5' (layout( set=2 binding=4 row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
+0:?     'u6' (layout( set=3 binding=4 row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of float @data})
+0:?     'u7' (layout( set=4 binding=4 row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of float @data})
+0:?     'u8' (layout( set=5 binding=4 row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of float @data})
+0:?     'anon@0' (layout( set=6 binding=1 row_major std140) uniform block{layout( row_major std140) uniform int cb1})
+0:?     'anon@1' (layout( binding=7 row_major std430) readonly buffer block{layout( row_major std430) buffer int tb1})
+0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+
+
+Linked fragment stage:
+
+
+Shader version: 500
+gl_FragCoord origin is upper left
+0:? Sequence
+0:34  Function Definition: @main( ( temp 4-component vector of float)
+0:34    Function Parameters: 
+0:?     Sequence
+0:35      't1' (layout( set=1 binding=1) uniform texture1D)
+0:36      't2' (layout( set=1 binding=2) uniform texture2D)
+0:37      't3' (layout( set=2 binding=1) uniform texture3D)
+0:38      direct index (layout( row_major std430) buffer 4-component vector of float)
+0:38        @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of 4-component vector of float)
+0:38          't4' (layout( set=3 binding=1 row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of 4-component vector of float @data})
+0:38          Constant:
+0:38            0 (const uint)
+0:38        Constant:
+0:38          0 (const int)
+0:39      indirect index (layout( row_major std430) buffer uint)
+0:39        @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:39          't5' (layout( set=3 binding=2 row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
+0:39          Constant:
+0:39            0 (const uint)
+0:39        right-shift ( temp int)
+0:39          Constant:
+0:39            0 (const int)
+0:39          Constant:
+0:39            2 (const int)
+0:40      't6' (layout( set=3 binding=3 rgba32f) uniform textureBuffer)
+0:42      's1' (layout( set=1 binding=1) uniform sampler)
+0:43      's2' (layout( set=2 binding=2) uniform sampler)
+0:45      'u1' (layout( set=1 binding=1 rgba32f) uniform image1D)
+0:46      'u2' (layout( set=2 binding=2 rgba32f) uniform image2D)
+0:47      'u3' (layout( set=2 binding=3 rgba32f) uniform image3D)
+0:49      imageLoad ( temp float)
+0:49        'u4' (layout( set=1 binding=4 r32f) uniform imageBuffer)
+0:49        Constant:
+0:49          0 (const int)
+0:50      indirect index (layout( row_major std430) buffer uint)
+0:50        @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:50          'u5' (layout( set=2 binding=4 row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
+0:50          Constant:
+0:50            0 (const uint)
+0:50        right-shift ( temp int)
+0:50          Constant:
+0:50            0 (const int)
+0:50          Constant:
+0:50            2 (const int)
+0:51      direct index (layout( row_major std430) buffer float)
+0:51        @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of float)
+0:51          'u6' (layout( set=3 binding=4 row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of float @data})
+0:51          Constant:
+0:51            0 (const uint)
+0:51        Constant:
+0:51          0 (const int)
+0:52      'u7' (layout( set=4 binding=4 row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of float @data})
+0:53      'u8' (layout( set=5 binding=4 row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of float @data})
+0:55      cb1: direct index for structure (layout( row_major std140) uniform int)
+0:55        'anon@0' (layout( set=6 binding=1 row_major std140) uniform block{layout( row_major std140) uniform int cb1})
+0:55        Constant:
+0:55          0 (const uint)
+0:56      tb1: direct index for structure (layout( row_major std430) buffer int)
+0:56        'anon@1' (layout( binding=7 row_major std430) readonly buffer block{layout( row_major std430) buffer int tb1})
+0:56        Constant:
+0:56          0 (const uint)
+0:57      'ts6' (layout( set=6 binding=1) uniform texture3D)
+0:59      Branch: Return with expression
+0:59        Constant:
+0:59          0.000000
+0:59          0.000000
+0:59          0.000000
+0:59          0.000000
+0:34  Function Definition: main( ( temp void)
+0:34    Function Parameters: 
+0:?     Sequence
+0:34      move second child to first child ( temp 4-component vector of float)
+0:?         '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+0:34        Function Call: @main( ( temp 4-component vector of float)
+0:?   Linker Objects
+0:?     's1' (layout( set=1 binding=1) uniform sampler)
+0:?     's2' (layout( set=2 binding=2) uniform sampler)
+0:?     't1' (layout( set=1 binding=1) uniform texture1D)
+0:?     't2' (layout( set=1 binding=2) uniform texture2D)
+0:?     't3' (layout( set=2 binding=1) uniform texture3D)
+0:?     'ts6' (layout( set=6 binding=1) uniform texture3D)
+0:?     't4' (layout( set=3 binding=1 row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of 4-component vector of float @data})
+0:?     't5' (layout( set=3 binding=2 row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
+0:?     't6' (layout( set=3 binding=3 rgba32f) uniform textureBuffer)
+0:?     'u1' (layout( set=1 binding=1 rgba32f) uniform image1D)
+0:?     'u2' (layout( set=2 binding=2 rgba32f) uniform image2D)
+0:?     'u3' (layout( set=2 binding=3 rgba32f) uniform image3D)
+0:?     'u4' (layout( set=1 binding=4 r32f) uniform imageBuffer)
+0:?     'u5' (layout( set=2 binding=4 row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
+0:?     'u6' (layout( set=3 binding=4 row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of float @data})
+0:?     'u7' (layout( set=4 binding=4 row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of float @data})
+0:?     'u8' (layout( set=5 binding=4 row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of float @data})
+0:?     'anon@0' (layout( set=6 binding=1 row_major std140) uniform block{layout( row_major std140) uniform int cb1})
+0:?     'anon@1' (layout( binding=7 row_major std430) readonly buffer block{layout( row_major std430) buffer int tb1})
+0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+
+Uniform reflection:
+t1: offset -1, type 8b5d, size 1, index -1, binding 21, stages 16
+t2: offset -1, type 8b5e, size 1, index -1, binding 22, stages 16
+t3: offset -1, type 8b5f, size 1, index -1, binding 26, stages 16
+t4.@data: offset 0, type 8b52, size 1, index 0, binding -1, stages 16
+t5.@data: offset 0, type 1405, size 0, index 1, binding -1, stages 16
+t6: offset -1, type 8dc2, size 1, index -1, binding 23, stages 16
+s1: offset -1, type 0, size 1, index -1, binding 11, stages 16
+s2: offset -1, type 0, size 1, index -1, binding 17, stages 16
+u1: offset -1, type 904c, size 1, index -1, binding 31, stages 16
+u2: offset -1, type 904d, size 1, index -1, binding 42, stages 16
+u3: offset -1, type 904e, size 1, index -1, binding 43, stages 16
+u4: offset -1, type 9051, size 1, index -1, binding 34, stages 16
+u5.@data: offset 0, type 1405, size 0, index 2, binding -1, stages 16
+u6.@data: offset 0, type 1406, size 1, index 3, binding -1, stages 16
+cb1: offset 0, type 1404, size 1, index 4, binding -1, stages 16
+tb1: offset 0, type 1404, size 1, index 5, binding -1, stages 16
+ts6: offset -1, type 8b5f, size 1, index -1, binding 71, stages 16
+
+Uniform block reflection:
+t4: offset -1, type ffffffff, size 0, index -1, binding 21, stages 0
+t5: offset -1, type ffffffff, size 0, index -1, binding 22, stages 0
+u5: offset -1, type ffffffff, size 0, index -1, binding 44, stages 0
+u6: offset -1, type ffffffff, size 0, index -1, binding 34, stages 0
+cb: offset -1, type ffffffff, size 4, index -1, binding 51, stages 0
+tb: offset -1, type ffffffff, size 4, index -1, binding 27, stages 0
+
+Vertex attribute reflection:
+
diff --git a/Test/baseResults/hlsl.sin.frag.out b/Test/baseResults/hlsl.sin.frag.out
old mode 100755
new mode 100644
index 37baab0..b92085e
--- a/Test/baseResults/hlsl.sin.frag.out
+++ b/Test/baseResults/hlsl.sin.frag.out
@@ -52,7 +52,7 @@
 0:?     'input' (layout( location=0) in 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 26
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.snorm.uav.comp.out b/Test/baseResults/hlsl.snorm.uav.comp.out
new file mode 100644
index 0000000..2d6dae7
--- /dev/null
+++ b/Test/baseResults/hlsl.snorm.uav.comp.out
@@ -0,0 +1,212 @@
+hlsl.snorm.uav.comp
+Shader version: 500
+local_size = (16, 16, 1)
+0:? Sequence
+0:12  Function Definition: @main(vu3; ( temp void)
+0:12    Function Parameters: 
+0:12      'tid' ( in 3-component vector of uint)
+0:?     Sequence
+0:13      Sequence
+0:13        move second child to first child ( temp 4-component vector of float)
+0:13          'storeTemp' ( temp 4-component vector of float)
+0:13          add ( temp 4-component vector of float)
+0:13            textureFetch ( temp 4-component vector of float)
+0:13              'ResultInS' (layout( binding=1) uniform texture3D)
+0:13              'tid' ( in 3-component vector of uint)
+0:13              Constant:
+0:13                0 (const int)
+0:13            uf4: direct index for structure ( uniform 4-component vector of float)
+0:13              'anon@0' (layout( row_major std140) uniform block{ uniform 4-component vector of float uf4})
+0:13              Constant:
+0:13                0 (const uint)
+0:13        imageStore ( temp void)
+0:13          'ResultOutS' (layout( binding=1 rgba32f) uniform image3D)
+0:13          'tid' ( in 3-component vector of uint)
+0:13          'storeTemp' ( temp 4-component vector of float)
+0:13        'storeTemp' ( temp 4-component vector of float)
+0:14      Sequence
+0:14        move second child to first child ( temp 4-component vector of float)
+0:14          'storeTemp' ( temp 4-component vector of float)
+0:14          textureFetch ( temp 4-component vector of float)
+0:14            'ResultInU' (layout( binding=0) uniform texture3D)
+0:14            'tid' ( in 3-component vector of uint)
+0:14            Constant:
+0:14              0 (const int)
+0:14        imageStore ( temp void)
+0:14          'ResultOutU' (layout( binding=0 rgba32f) uniform image3D)
+0:14          'tid' ( in 3-component vector of uint)
+0:14          'storeTemp' ( temp 4-component vector of float)
+0:14        'storeTemp' ( temp 4-component vector of float)
+0:12  Function Definition: main( ( temp void)
+0:12    Function Parameters: 
+0:?     Sequence
+0:12      move second child to first child ( temp 3-component vector of uint)
+0:?         'tid' ( temp 3-component vector of uint)
+0:?         'tid' ( in 3-component vector of uint GlobalInvocationID)
+0:12      Function Call: @main(vu3; ( temp void)
+0:?         'tid' ( temp 3-component vector of uint)
+0:?   Linker Objects
+0:?     'anon@0' (layout( row_major std140) uniform block{ uniform 4-component vector of float uf4})
+0:?     'ResultInU' (layout( binding=0) uniform texture3D)
+0:?     'ResultOutU' (layout( binding=0 rgba32f) uniform image3D)
+0:?     'ResultInS' (layout( binding=1) uniform texture3D)
+0:?     'ResultOutS' (layout( binding=1 rgba32f) uniform image3D)
+0:?     'tid' ( in 3-component vector of uint GlobalInvocationID)
+
+
+Linked compute stage:
+
+
+Shader version: 500
+local_size = (16, 16, 1)
+0:? Sequence
+0:12  Function Definition: @main(vu3; ( temp void)
+0:12    Function Parameters: 
+0:12      'tid' ( in 3-component vector of uint)
+0:?     Sequence
+0:13      Sequence
+0:13        move second child to first child ( temp 4-component vector of float)
+0:13          'storeTemp' ( temp 4-component vector of float)
+0:13          add ( temp 4-component vector of float)
+0:13            textureFetch ( temp 4-component vector of float)
+0:13              'ResultInS' (layout( binding=1) uniform texture3D)
+0:13              'tid' ( in 3-component vector of uint)
+0:13              Constant:
+0:13                0 (const int)
+0:13            uf4: direct index for structure ( uniform 4-component vector of float)
+0:13              'anon@0' (layout( row_major std140) uniform block{ uniform 4-component vector of float uf4})
+0:13              Constant:
+0:13                0 (const uint)
+0:13        imageStore ( temp void)
+0:13          'ResultOutS' (layout( binding=1 rgba32f) uniform image3D)
+0:13          'tid' ( in 3-component vector of uint)
+0:13          'storeTemp' ( temp 4-component vector of float)
+0:13        'storeTemp' ( temp 4-component vector of float)
+0:14      Sequence
+0:14        move second child to first child ( temp 4-component vector of float)
+0:14          'storeTemp' ( temp 4-component vector of float)
+0:14          textureFetch ( temp 4-component vector of float)
+0:14            'ResultInU' (layout( binding=0) uniform texture3D)
+0:14            'tid' ( in 3-component vector of uint)
+0:14            Constant:
+0:14              0 (const int)
+0:14        imageStore ( temp void)
+0:14          'ResultOutU' (layout( binding=0 rgba32f) uniform image3D)
+0:14          'tid' ( in 3-component vector of uint)
+0:14          'storeTemp' ( temp 4-component vector of float)
+0:14        'storeTemp' ( temp 4-component vector of float)
+0:12  Function Definition: main( ( temp void)
+0:12    Function Parameters: 
+0:?     Sequence
+0:12      move second child to first child ( temp 3-component vector of uint)
+0:?         'tid' ( temp 3-component vector of uint)
+0:?         'tid' ( in 3-component vector of uint GlobalInvocationID)
+0:12      Function Call: @main(vu3; ( temp void)
+0:?         'tid' ( temp 3-component vector of uint)
+0:?   Linker Objects
+0:?     'anon@0' (layout( row_major std140) uniform block{ uniform 4-component vector of float uf4})
+0:?     'ResultInU' (layout( binding=0) uniform texture3D)
+0:?     'ResultOutU' (layout( binding=0 rgba32f) uniform image3D)
+0:?     'ResultInS' (layout( binding=1) uniform texture3D)
+0:?     'ResultOutS' (layout( binding=1 rgba32f) uniform image3D)
+0:?     'tid' ( in 3-component vector of uint GlobalInvocationID)
+
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 54
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint GLCompute 4  "main" 49
+                              ExecutionMode 4 LocalSize 16 16 1
+                              Source HLSL 500
+                              Name 4  "main"
+                              Name 11  "@main(vu3;"
+                              Name 10  "tid"
+                              Name 16  "storeTemp"
+                              Name 19  "ResultInS"
+                              Name 25  "$Global"
+                              MemberName 25($Global) 0  "uf4"
+                              Name 27  ""
+                              Name 34  "ResultOutS"
+                              Name 38  "storeTemp"
+                              Name 39  "ResultInU"
+                              Name 43  "ResultOutU"
+                              Name 47  "tid"
+                              Name 49  "tid"
+                              Name 51  "param"
+                              Decorate 19(ResultInS) DescriptorSet 0
+                              Decorate 19(ResultInS) Binding 1
+                              MemberDecorate 25($Global) 0 Offset 0
+                              Decorate 25($Global) Block
+                              Decorate 27 DescriptorSet 0
+                              Decorate 34(ResultOutS) DescriptorSet 0
+                              Decorate 34(ResultOutS) Binding 1
+                              Decorate 39(ResultInU) DescriptorSet 0
+                              Decorate 39(ResultInU) Binding 0
+                              Decorate 43(ResultOutU) DescriptorSet 0
+                              Decorate 43(ResultOutU) Binding 0
+                              Decorate 49(tid) BuiltIn GlobalInvocationId
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeInt 32 0
+               7:             TypeVector 6(int) 3
+               8:             TypePointer Function 7(ivec3)
+               9:             TypeFunction 2 8(ptr)
+              13:             TypeFloat 32
+              14:             TypeVector 13(float) 4
+              15:             TypePointer Function 14(fvec4)
+              17:             TypeImage 13(float) 3D sampled format:Unknown
+              18:             TypePointer UniformConstant 17
+   19(ResultInS):     18(ptr) Variable UniformConstant
+              22:             TypeInt 32 1
+              23:     22(int) Constant 0
+     25($Global):             TypeStruct 14(fvec4)
+              26:             TypePointer Uniform 25($Global)
+              27:     26(ptr) Variable Uniform
+              28:             TypePointer Uniform 14(fvec4)
+              32:             TypeImage 13(float) 3D nonsampled format:Rgba32f
+              33:             TypePointer UniformConstant 32
+  34(ResultOutS):     33(ptr) Variable UniformConstant
+   39(ResultInU):     18(ptr) Variable UniformConstant
+  43(ResultOutU):     33(ptr) Variable UniformConstant
+              48:             TypePointer Input 7(ivec3)
+         49(tid):     48(ptr) Variable Input
+         4(main):           2 Function None 3
+               5:             Label
+         47(tid):      8(ptr) Variable Function
+       51(param):      8(ptr) Variable Function
+              50:    7(ivec3) Load 49(tid)
+                              Store 47(tid) 50
+              52:    7(ivec3) Load 47(tid)
+                              Store 51(param) 52
+              53:           2 FunctionCall 11(@main(vu3;) 51(param)
+                              Return
+                              FunctionEnd
+  11(@main(vu3;):           2 Function None 9
+         10(tid):      8(ptr) FunctionParameter
+              12:             Label
+   16(storeTemp):     15(ptr) Variable Function
+   38(storeTemp):     15(ptr) Variable Function
+              20:          17 Load 19(ResultInS)
+              21:    7(ivec3) Load 10(tid)
+              24:   14(fvec4) ImageFetch 20 21 Lod 23
+              29:     28(ptr) AccessChain 27 23
+              30:   14(fvec4) Load 29
+              31:   14(fvec4) FAdd 24 30
+                              Store 16(storeTemp) 31
+              35:          32 Load 34(ResultOutS)
+              36:    7(ivec3) Load 10(tid)
+              37:   14(fvec4) Load 16(storeTemp)
+                              ImageWrite 35 36 37
+              40:          17 Load 39(ResultInU)
+              41:    7(ivec3) Load 10(tid)
+              42:   14(fvec4) ImageFetch 40 41 Lod 23
+                              Store 38(storeTemp) 42
+              44:          32 Load 43(ResultOutU)
+              45:    7(ivec3) Load 10(tid)
+              46:   14(fvec4) Load 38(storeTemp)
+                              ImageWrite 44 45 46
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/hlsl.staticFuncInit.frag.out b/Test/baseResults/hlsl.staticFuncInit.frag.out
new file mode 100644
index 0000000..d468cec
--- /dev/null
+++ b/Test/baseResults/hlsl.staticFuncInit.frag.out
@@ -0,0 +1,218 @@
+hlsl.staticFuncInit.frag
+Shader version: 500
+gl_FragCoord origin is upper left
+0:12Sequence
+0:1  Sequence
+0:1    move second child to first child ( temp float)
+0:1      'x' ( global float)
+0:1      Constant:
+0:1        1.000000
+0:5  Sequence
+0:5    move second child to first child ( temp float)
+0:5      'x' ( global float)
+0:5      Constant:
+0:5        2.000000
+0:4  Function Definition: f1( ( temp float)
+0:4    Function Parameters: 
+0:?     Sequence
+0:6      add second child into first child ( temp float)
+0:6        'x' ( global float)
+0:6        Constant:
+0:6          10.000000
+0:7      Branch: Return with expression
+0:7        'x' ( global float)
+0:12  Sequence
+0:12    move second child to first child ( temp float)
+0:12      'x' ( global float)
+0:12      Constant:
+0:12        7.000000
+0:11  Function Definition: f2(f1; ( temp float)
+0:11    Function Parameters: 
+0:11      'p' ( in float)
+0:?     Sequence
+0:13      add second child into first child ( temp float)
+0:13        'x' ( global float)
+0:13        'p' ( in float)
+0:14      Branch: Return with expression
+0:14        'x' ( global float)
+0:18  Function Definition: @main( ( temp 4-component vector of float)
+0:18    Function Parameters: 
+0:?     Sequence
+0:19      Branch: Return with expression
+0:19        Construct vec4 ( temp 4-component vector of float)
+0:19          add ( temp float)
+0:19            add ( temp float)
+0:19              add ( temp float)
+0:19                add ( temp float)
+0:19                  'x' ( global float)
+0:19                  Function Call: f1( ( temp float)
+0:19                Function Call: f1( ( temp float)
+0:19              Function Call: f2(f1; ( temp float)
+0:19                Constant:
+0:19                  5.000000
+0:19            Function Call: f2(f1; ( temp float)
+0:19              'x' ( global float)
+0:18  Function Definition: main( ( temp void)
+0:18    Function Parameters: 
+0:?     Sequence
+0:18      move second child to first child ( temp 4-component vector of float)
+0:?         '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+0:18        Function Call: @main( ( temp 4-component vector of float)
+0:?   Linker Objects
+0:?     'x' ( global float)
+0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+
+
+Linked fragment stage:
+
+
+Shader version: 500
+gl_FragCoord origin is upper left
+0:12Sequence
+0:1  Sequence
+0:1    move second child to first child ( temp float)
+0:1      'x' ( global float)
+0:1      Constant:
+0:1        1.000000
+0:5  Sequence
+0:5    move second child to first child ( temp float)
+0:5      'x' ( global float)
+0:5      Constant:
+0:5        2.000000
+0:4  Function Definition: f1( ( temp float)
+0:4    Function Parameters: 
+0:?     Sequence
+0:6      add second child into first child ( temp float)
+0:6        'x' ( global float)
+0:6        Constant:
+0:6          10.000000
+0:7      Branch: Return with expression
+0:7        'x' ( global float)
+0:12  Sequence
+0:12    move second child to first child ( temp float)
+0:12      'x' ( global float)
+0:12      Constant:
+0:12        7.000000
+0:11  Function Definition: f2(f1; ( temp float)
+0:11    Function Parameters: 
+0:11      'p' ( in float)
+0:?     Sequence
+0:13      add second child into first child ( temp float)
+0:13        'x' ( global float)
+0:13        'p' ( in float)
+0:14      Branch: Return with expression
+0:14        'x' ( global float)
+0:18  Function Definition: @main( ( temp 4-component vector of float)
+0:18    Function Parameters: 
+0:?     Sequence
+0:19      Branch: Return with expression
+0:19        Construct vec4 ( temp 4-component vector of float)
+0:19          add ( temp float)
+0:19            add ( temp float)
+0:19              add ( temp float)
+0:19                add ( temp float)
+0:19                  'x' ( global float)
+0:19                  Function Call: f1( ( temp float)
+0:19                Function Call: f1( ( temp float)
+0:19              Function Call: f2(f1; ( temp float)
+0:19                Constant:
+0:19                  5.000000
+0:19            Function Call: f2(f1; ( temp float)
+0:19              'x' ( global float)
+0:18  Function Definition: main( ( temp void)
+0:18    Function Parameters: 
+0:?     Sequence
+0:18      move second child to first child ( temp 4-component vector of float)
+0:?         '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+0:18        Function Call: @main( ( temp 4-component vector of float)
+0:?   Linker Objects
+0:?     'x' ( global float)
+0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 57
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 55
+                              ExecutionMode 4 OriginUpperLeft
+                              Source HLSL 500
+                              Name 4  "main"
+                              Name 8  "f1("
+                              Name 13  "f2(f1;"
+                              Name 12  "p"
+                              Name 17  "@main("
+                              Name 20  "x"
+                              Name 22  "x"
+                              Name 24  "x"
+                              Name 44  "param"
+                              Name 47  "param"
+                              Name 55  "@entryPointOutput"
+                              Decorate 55(@entryPointOutput) Location 0
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeFunction 6(float)
+              10:             TypePointer Function 6(float)
+              11:             TypeFunction 6(float) 10(ptr)
+              15:             TypeVector 6(float) 4
+              16:             TypeFunction 15(fvec4)
+              19:             TypePointer Private 6(float)
+           20(x):     19(ptr) Variable Private
+              21:    6(float) Constant 1065353216
+           22(x):     19(ptr) Variable Private
+              23:    6(float) Constant 1073741824
+           24(x):     19(ptr) Variable Private
+              25:    6(float) Constant 1088421888
+              26:    6(float) Constant 1092616192
+              43:    6(float) Constant 1084227584
+              54:             TypePointer Output 15(fvec4)
+55(@entryPointOutput):     54(ptr) Variable Output
+         4(main):           2 Function None 3
+               5:             Label
+                              Store 20(x) 21
+                              Store 22(x) 23
+                              Store 24(x) 25
+              56:   15(fvec4) FunctionCall 17(@main()
+                              Store 55(@entryPointOutput) 56
+                              Return
+                              FunctionEnd
+          8(f1():    6(float) Function None 7
+               9:             Label
+              27:    6(float) Load 22(x)
+              28:    6(float) FAdd 27 26
+                              Store 22(x) 28
+              29:    6(float) Load 22(x)
+                              ReturnValue 29
+                              FunctionEnd
+      13(f2(f1;):    6(float) Function None 11
+           12(p):     10(ptr) FunctionParameter
+              14:             Label
+              32:    6(float) Load 12(p)
+              33:    6(float) Load 24(x)
+              34:    6(float) FAdd 33 32
+                              Store 24(x) 34
+              35:    6(float) Load 24(x)
+                              ReturnValue 35
+                              FunctionEnd
+      17(@main():   15(fvec4) Function None 16
+              18:             Label
+       44(param):     10(ptr) Variable Function
+       47(param):     10(ptr) Variable Function
+              38:    6(float) Load 20(x)
+              39:    6(float) FunctionCall 8(f1()
+              40:    6(float) FAdd 38 39
+              41:    6(float) FunctionCall 8(f1()
+              42:    6(float) FAdd 40 41
+                              Store 44(param) 43
+              45:    6(float) FunctionCall 13(f2(f1;) 44(param)
+              46:    6(float) FAdd 42 45
+              48:    6(float) Load 20(x)
+                              Store 47(param) 48
+              49:    6(float) FunctionCall 13(f2(f1;) 47(param)
+              50:    6(float) FAdd 46 49
+              51:   15(fvec4) CompositeConstruct 50 50 50 50
+                              ReturnValue 51
+                              FunctionEnd
diff --git a/Test/baseResults/hlsl.staticMemberFunction.frag.out b/Test/baseResults/hlsl.staticMemberFunction.frag.out
old mode 100755
new mode 100644
index e313cbc..2c7e418
--- a/Test/baseResults/hlsl.staticMemberFunction.frag.out
+++ b/Test/baseResults/hlsl.staticMemberFunction.frag.out
@@ -118,7 +118,7 @@
 0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 54
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.store.rwbyteaddressbuffer.type.comp.out b/Test/baseResults/hlsl.store.rwbyteaddressbuffer.type.comp.out
new file mode 100644
index 0000000..6436db7
--- /dev/null
+++ b/Test/baseResults/hlsl.store.rwbyteaddressbuffer.type.comp.out
@@ -0,0 +1,173 @@
+hlsl.store.rwbyteaddressbuffer.type.comp
+Shader version: 500
+local_size = (64, 1, 1)
+0:? Sequence
+0:5  Function Definition: @main(vu3; ( temp void)
+0:5    Function Parameters: 
+0:5      'dispatchThreadID' ( in 3-component vector of uint)
+0:?     Sequence
+0:6      Test condition and select ( temp void)
+0:6        Condition
+0:6        Compare Equal ( temp bool)
+0:6          direct index ( temp uint)
+0:6            'dispatchThreadID' ( in 3-component vector of uint)
+0:6            Constant:
+0:6              0 (const int)
+0:6          Constant:
+0:6            0 (const uint)
+0:6        true case
+0:?         Sequence
+0:7          move second child to first child ( temp int)
+0:7            'byteAddrTemp' ( temp int)
+0:7            right-shift ( temp int)
+0:7              Constant:
+0:7                0 (const int)
+0:7              Constant:
+0:7                2 (const int)
+0:7          move second child to first child ( temp uint)
+0:7            indirect index (layout( row_major std430) buffer uint)
+0:7              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:7                'buffer' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
+0:7                Constant:
+0:7                  0 (const uint)
+0:7              'byteAddrTemp' ( temp int)
+0:7            Constant:
+0:7              2 (const uint)
+0:5  Function Definition: main( ( temp void)
+0:5    Function Parameters: 
+0:?     Sequence
+0:5      move second child to first child ( temp 3-component vector of uint)
+0:?         'dispatchThreadID' ( temp 3-component vector of uint)
+0:?         'dispatchThreadID' ( in 3-component vector of uint GlobalInvocationID)
+0:5      Function Call: @main(vu3; ( temp void)
+0:?         'dispatchThreadID' ( temp 3-component vector of uint)
+0:?   Linker Objects
+0:?     'buffer' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
+0:?     'dispatchThreadID' ( in 3-component vector of uint GlobalInvocationID)
+
+
+Linked compute stage:
+
+
+Shader version: 500
+local_size = (64, 1, 1)
+0:? Sequence
+0:5  Function Definition: @main(vu3; ( temp void)
+0:5    Function Parameters: 
+0:5      'dispatchThreadID' ( in 3-component vector of uint)
+0:?     Sequence
+0:6      Test condition and select ( temp void)
+0:6        Condition
+0:6        Compare Equal ( temp bool)
+0:6          direct index ( temp uint)
+0:6            'dispatchThreadID' ( in 3-component vector of uint)
+0:6            Constant:
+0:6              0 (const int)
+0:6          Constant:
+0:6            0 (const uint)
+0:6        true case
+0:?         Sequence
+0:7          move second child to first child ( temp int)
+0:7            'byteAddrTemp' ( temp int)
+0:7            right-shift ( temp int)
+0:7              Constant:
+0:7                0 (const int)
+0:7              Constant:
+0:7                2 (const int)
+0:7          move second child to first child ( temp uint)
+0:7            indirect index (layout( row_major std430) buffer uint)
+0:7              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:7                'buffer' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
+0:7                Constant:
+0:7                  0 (const uint)
+0:7              'byteAddrTemp' ( temp int)
+0:7            Constant:
+0:7              2 (const uint)
+0:5  Function Definition: main( ( temp void)
+0:5    Function Parameters: 
+0:?     Sequence
+0:5      move second child to first child ( temp 3-component vector of uint)
+0:?         'dispatchThreadID' ( temp 3-component vector of uint)
+0:?         'dispatchThreadID' ( in 3-component vector of uint GlobalInvocationID)
+0:5      Function Call: @main(vu3; ( temp void)
+0:?         'dispatchThreadID' ( temp 3-component vector of uint)
+0:?   Linker Objects
+0:?     'buffer' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
+0:?     'dispatchThreadID' ( in 3-component vector of uint GlobalInvocationID)
+
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 42
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint GLCompute 4  "main" 37
+                              ExecutionMode 4 LocalSize 64 1 1
+                              Source HLSL 500
+                              Name 4  "main"
+                              Name 11  "@main(vu3;"
+                              Name 10  "dispatchThreadID"
+                              Name 23  "byteAddrTemp"
+                              Name 28  "buffer"
+                              MemberName 28(buffer) 0  "@data"
+                              Name 30  "buffer"
+                              Name 35  "dispatchThreadID"
+                              Name 37  "dispatchThreadID"
+                              Name 39  "param"
+                              Decorate 27 ArrayStride 4
+                              MemberDecorate 28(buffer) 0 Offset 0
+                              Decorate 28(buffer) BufferBlock
+                              Decorate 30(buffer) DescriptorSet 0
+                              Decorate 37(dispatchThreadID) BuiltIn GlobalInvocationId
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeInt 32 0
+               7:             TypeVector 6(int) 3
+               8:             TypePointer Function 7(ivec3)
+               9:             TypeFunction 2 8(ptr)
+              13:      6(int) Constant 0
+              14:             TypePointer Function 6(int)
+              17:             TypeBool
+              21:             TypeInt 32 1
+              22:             TypePointer Function 21(int)
+              24:     21(int) Constant 0
+              25:     21(int) Constant 2
+              27:             TypeRuntimeArray 6(int)
+      28(buffer):             TypeStruct 27
+              29:             TypePointer Uniform 28(buffer)
+      30(buffer):     29(ptr) Variable Uniform
+              32:      6(int) Constant 2
+              33:             TypePointer Uniform 6(int)
+              36:             TypePointer Input 7(ivec3)
+37(dispatchThreadID):     36(ptr) Variable Input
+         4(main):           2 Function None 3
+               5:             Label
+35(dispatchThreadID):      8(ptr) Variable Function
+       39(param):      8(ptr) Variable Function
+              38:    7(ivec3) Load 37(dispatchThreadID)
+                              Store 35(dispatchThreadID) 38
+              40:    7(ivec3) Load 35(dispatchThreadID)
+                              Store 39(param) 40
+              41:           2 FunctionCall 11(@main(vu3;) 39(param)
+                              Return
+                              FunctionEnd
+  11(@main(vu3;):           2 Function None 9
+10(dispatchThreadID):      8(ptr) FunctionParameter
+              12:             Label
+23(byteAddrTemp):     22(ptr) Variable Function
+              15:     14(ptr) AccessChain 10(dispatchThreadID) 13
+              16:      6(int) Load 15
+              18:    17(bool) IEqual 16 13
+                              SelectionMerge 20 None
+                              BranchConditional 18 19 20
+              19:               Label
+              26:     21(int)   ShiftRightArithmetic 24 25
+                                Store 23(byteAddrTemp) 26
+              31:     21(int)   Load 23(byteAddrTemp)
+              34:     33(ptr)   AccessChain 30(buffer) 24 31
+                                Store 34 32
+                                Branch 20
+              20:             Label
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/hlsl.string.frag.out b/Test/baseResults/hlsl.string.frag.out
old mode 100755
new mode 100644
index 1c6c542..9181b93
--- a/Test/baseResults/hlsl.string.frag.out
+++ b/Test/baseResults/hlsl.string.frag.out
@@ -50,7 +50,7 @@
 0:?     'f' (layout( location=0) in float)
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 24
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.stringtoken.frag.out b/Test/baseResults/hlsl.stringtoken.frag.out
index 045b8fe..82033cf 100644
--- a/Test/baseResults/hlsl.stringtoken.frag.out
+++ b/Test/baseResults/hlsl.stringtoken.frag.out
@@ -22,7 +22,7 @@
 0:?     Sequence
 0:16      Sequence
 0:16        move second child to first child ( temp 4-component vector of float)
-0:?           'Color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 0:16          Color: direct index for structure ( temp 4-component vector of float)
 0:16            Function Call: @main( ( temp structure{ temp 4-component vector of float Color})
 0:16            Constant:
@@ -30,7 +30,7 @@
 0:?   Linker Objects
 0:?     'TestTexture' ( uniform texture2D)
 0:?     'anon@0' (layout( row_major std140) uniform block{ uniform 4-component vector of float TestUF})
-0:?     'Color' (layout( location=0) out 4-component vector of float)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 
 Linked fragment stage:
@@ -59,7 +59,7 @@
 0:?     Sequence
 0:16      Sequence
 0:16        move second child to first child ( temp 4-component vector of float)
-0:?           'Color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 0:16          Color: direct index for structure ( temp 4-component vector of float)
 0:16            Function Call: @main( ( temp structure{ temp 4-component vector of float Color})
 0:16            Constant:
@@ -67,10 +67,10 @@
 0:?   Linker Objects
 0:?     'TestTexture' ( uniform texture2D)
 0:?     'anon@0' (layout( row_major std140) uniform block{ uniform 4-component vector of float TestUF})
-0:?     'Color' (layout( location=0) out 4-component vector of float)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 34
 
                               Capability Shader
@@ -84,12 +84,12 @@
                               MemberName 8(PS_OUTPUT) 0  "Color"
                               Name 10  "@main("
                               Name 13  "psout"
-                              Name 25  "Color"
+                              Name 25  "@entryPointOutput.Color"
                               Name 30  "TestTexture"
                               Name 31  "$Global"
                               MemberName 31($Global) 0  "TestUF"
                               Name 33  ""
-                              Decorate 25(Color) Location 0
+                              Decorate 25(@entryPointOutput.Color) Location 0
                               Decorate 30(TestTexture) DescriptorSet 0
                               MemberDecorate 31($Global) 0 Offset 0
                               Decorate 31($Global) Block
@@ -108,7 +108,7 @@
               18:    7(fvec4) ConstantComposite 16 16 16 17
               19:             TypePointer Function 7(fvec4)
               24:             TypePointer Output 7(fvec4)
-       25(Color):     24(ptr) Variable Output
+25(@entryPointOutput.Color):     24(ptr) Variable Output
               28:             TypeImage 6(float) 2D sampled format:Unknown
               29:             TypePointer UniformConstant 28
  30(TestTexture):     29(ptr) Variable UniformConstant
@@ -119,7 +119,7 @@
                5:             Label
               26:8(PS_OUTPUT) FunctionCall 10(@main()
               27:    7(fvec4) CompositeExtract 26 0
-                              Store 25(Color) 27
+                              Store 25(@entryPointOutput.Color) 27
                               Return
                               FunctionEnd
       10(@main():8(PS_OUTPUT) Function None 9
diff --git a/Test/baseResults/hlsl.struct.frag.out b/Test/baseResults/hlsl.struct.frag.out
old mode 100755
new mode 100644
index 6798bae..4ea7bbb
--- a/Test/baseResults/hlsl.struct.frag.out
+++ b/Test/baseResults/hlsl.struct.frag.out
@@ -43,70 +43,49 @@
 0:?             's' ( temp structure{ temp 4-component vector of float a,  temp bool b,  temp 1-component vector of float c,  temp 2-component vector of float d,  temp bool ff1,  temp bool ff2,  temp bool ff3,  temp 4-component vector of float ff4})
 0:40            Constant:
 0:40              0 (const int)
-0:40          a: direct index for structure ( smooth temp 4-component vector of float)
-0:40            's' (layout( location=1) in structure{ smooth temp 4-component vector of float a,  flat temp bool b,  centroid noperspective temp 1-component vector of float c,  centroid sample temp 2-component vector of float d,  temp bool ff2,  temp bool ff3,  temp 4-component vector of float ff4})
-0:40            Constant:
-0:40              0 (const int)
+0:?           's.a' (layout( location=1) smooth in 4-component vector of float)
 0:40        move second child to first child ( temp bool)
 0:40          b: direct index for structure ( temp bool)
 0:?             's' ( temp structure{ temp 4-component vector of float a,  temp bool b,  temp 1-component vector of float c,  temp 2-component vector of float d,  temp bool ff1,  temp bool ff2,  temp bool ff3,  temp 4-component vector of float ff4})
 0:40            Constant:
 0:40              1 (const int)
-0:40          b: direct index for structure ( flat temp bool)
-0:40            's' (layout( location=1) in structure{ smooth temp 4-component vector of float a,  flat temp bool b,  centroid noperspective temp 1-component vector of float c,  centroid sample temp 2-component vector of float d,  temp bool ff2,  temp bool ff3,  temp 4-component vector of float ff4})
-0:40            Constant:
-0:40              1 (const int)
+0:?           's.b' (layout( location=2) flat in bool)
 0:40        move second child to first child ( temp 1-component vector of float)
 0:40          c: direct index for structure ( temp 1-component vector of float)
 0:?             's' ( temp structure{ temp 4-component vector of float a,  temp bool b,  temp 1-component vector of float c,  temp 2-component vector of float d,  temp bool ff1,  temp bool ff2,  temp bool ff3,  temp 4-component vector of float ff4})
 0:40            Constant:
 0:40              2 (const int)
-0:40          c: direct index for structure ( centroid noperspective temp 1-component vector of float)
-0:40            's' (layout( location=1) in structure{ smooth temp 4-component vector of float a,  flat temp bool b,  centroid noperspective temp 1-component vector of float c,  centroid sample temp 2-component vector of float d,  temp bool ff2,  temp bool ff3,  temp 4-component vector of float ff4})
-0:40            Constant:
-0:40              2 (const int)
+0:?           's.c' (layout( location=3) centroid noperspective in 1-component vector of float)
 0:40        move second child to first child ( temp 2-component vector of float)
 0:40          d: direct index for structure ( temp 2-component vector of float)
 0:?             's' ( temp structure{ temp 4-component vector of float a,  temp bool b,  temp 1-component vector of float c,  temp 2-component vector of float d,  temp bool ff1,  temp bool ff2,  temp bool ff3,  temp 4-component vector of float ff4})
 0:40            Constant:
 0:40              3 (const int)
-0:40          d: direct index for structure ( centroid sample temp 2-component vector of float)
-0:40            's' (layout( location=1) in structure{ smooth temp 4-component vector of float a,  flat temp bool b,  centroid noperspective temp 1-component vector of float c,  centroid sample temp 2-component vector of float d,  temp bool ff2,  temp bool ff3,  temp 4-component vector of float ff4})
-0:40            Constant:
-0:40              3 (const int)
+0:?           's.d' (layout( location=4) centroid sample in 2-component vector of float)
 0:40        move second child to first child ( temp bool)
 0:40          ff1: direct index for structure ( temp bool)
 0:?             's' ( temp structure{ temp 4-component vector of float a,  temp bool b,  temp 1-component vector of float c,  temp 2-component vector of float d,  temp bool ff1,  temp bool ff2,  temp bool ff3,  temp 4-component vector of float ff4})
 0:40            Constant:
 0:40              4 (const int)
-0:?           's_ff1' ( in bool Face)
+0:?           's.ff1' ( flat in bool Face)
 0:40        move second child to first child ( temp bool)
 0:40          ff2: direct index for structure ( temp bool)
 0:?             's' ( temp structure{ temp 4-component vector of float a,  temp bool b,  temp 1-component vector of float c,  temp 2-component vector of float d,  temp bool ff1,  temp bool ff2,  temp bool ff3,  temp 4-component vector of float ff4})
 0:40            Constant:
 0:40              5 (const int)
-0:40          ff2: direct index for structure ( temp bool)
-0:40            's' (layout( location=1) in structure{ smooth temp 4-component vector of float a,  flat temp bool b,  centroid noperspective temp 1-component vector of float c,  centroid sample temp 2-component vector of float d,  temp bool ff2,  temp bool ff3,  temp 4-component vector of float ff4})
-0:40            Constant:
-0:40              4 (const int)
+0:?           's.ff2' (layout( location=5) flat in bool)
 0:40        move second child to first child ( temp bool)
 0:40          ff3: direct index for structure ( temp bool)
 0:?             's' ( temp structure{ temp 4-component vector of float a,  temp bool b,  temp 1-component vector of float c,  temp 2-component vector of float d,  temp bool ff1,  temp bool ff2,  temp bool ff3,  temp 4-component vector of float ff4})
 0:40            Constant:
 0:40              6 (const int)
-0:40          ff3: direct index for structure ( temp bool)
-0:40            's' (layout( location=1) in structure{ smooth temp 4-component vector of float a,  flat temp bool b,  centroid noperspective temp 1-component vector of float c,  centroid sample temp 2-component vector of float d,  temp bool ff2,  temp bool ff3,  temp 4-component vector of float ff4})
-0:40            Constant:
-0:40              5 (const int)
+0:?           's.ff3' (layout( location=6) flat in bool)
 0:40        move second child to first child ( temp 4-component vector of float)
 0:40          ff4: direct index for structure ( temp 4-component vector of float)
 0:?             's' ( temp structure{ temp 4-component vector of float a,  temp bool b,  temp 1-component vector of float c,  temp 2-component vector of float d,  temp bool ff1,  temp bool ff2,  temp bool ff3,  temp 4-component vector of float ff4})
 0:40            Constant:
 0:40              7 (const int)
-0:40          ff4: direct index for structure ( temp 4-component vector of float)
-0:40            's' (layout( location=1) in structure{ smooth temp 4-component vector of float a,  flat temp bool b,  centroid noperspective temp 1-component vector of float c,  centroid sample temp 2-component vector of float d,  temp bool ff2,  temp bool ff3,  temp 4-component vector of float ff4})
-0:40            Constant:
-0:40              6 (const int)
+0:?           's.ff4' (layout( location=7) in 4-component vector of float)
 0:40      move second child to first child ( temp 4-component vector of float)
 0:?         '@entryPointOutput' (layout( location=0) out 4-component vector of float)
 0:40        Function Call: @PixelShaderFunction(vf4;struct-IN_S-vf4-b1-vf1-vf2-b1-b1-b1-vf41; ( temp 4-component vector of float)
@@ -117,8 +96,14 @@
 0:?     's2' ( global structure{ temp 4-component vector of float i})
 0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
 0:?     'input' (layout( location=0) in 4-component vector of float)
-0:?     's' (layout( location=1) in structure{ smooth temp 4-component vector of float a,  flat temp bool b,  centroid noperspective temp 1-component vector of float c,  centroid sample temp 2-component vector of float d,  temp bool ff2,  temp bool ff3,  temp 4-component vector of float ff4})
-0:?     's_ff1' ( in bool Face)
+0:?     's.ff1' ( flat in bool Face)
+0:?     's.a' (layout( location=1) smooth in 4-component vector of float)
+0:?     's.b' (layout( location=2) flat in bool)
+0:?     's.c' (layout( location=3) centroid noperspective in 1-component vector of float)
+0:?     's.d' (layout( location=4) centroid sample in 2-component vector of float)
+0:?     's.ff2' (layout( location=5) flat in bool)
+0:?     's.ff3' (layout( location=6) flat in bool)
+0:?     's.ff4' (layout( location=7) in 4-component vector of float)
 
 
 Linked fragment stage:
@@ -164,70 +149,49 @@
 0:?             's' ( temp structure{ temp 4-component vector of float a,  temp bool b,  temp 1-component vector of float c,  temp 2-component vector of float d,  temp bool ff1,  temp bool ff2,  temp bool ff3,  temp 4-component vector of float ff4})
 0:40            Constant:
 0:40              0 (const int)
-0:40          a: direct index for structure ( smooth temp 4-component vector of float)
-0:40            's' (layout( location=1) in structure{ smooth temp 4-component vector of float a,  flat temp bool b,  centroid noperspective temp 1-component vector of float c,  centroid sample temp 2-component vector of float d,  temp bool ff2,  temp bool ff3,  temp 4-component vector of float ff4})
-0:40            Constant:
-0:40              0 (const int)
+0:?           's.a' (layout( location=1) smooth in 4-component vector of float)
 0:40        move second child to first child ( temp bool)
 0:40          b: direct index for structure ( temp bool)
 0:?             's' ( temp structure{ temp 4-component vector of float a,  temp bool b,  temp 1-component vector of float c,  temp 2-component vector of float d,  temp bool ff1,  temp bool ff2,  temp bool ff3,  temp 4-component vector of float ff4})
 0:40            Constant:
 0:40              1 (const int)
-0:40          b: direct index for structure ( flat temp bool)
-0:40            's' (layout( location=1) in structure{ smooth temp 4-component vector of float a,  flat temp bool b,  centroid noperspective temp 1-component vector of float c,  centroid sample temp 2-component vector of float d,  temp bool ff2,  temp bool ff3,  temp 4-component vector of float ff4})
-0:40            Constant:
-0:40              1 (const int)
+0:?           's.b' (layout( location=2) flat in bool)
 0:40        move second child to first child ( temp 1-component vector of float)
 0:40          c: direct index for structure ( temp 1-component vector of float)
 0:?             's' ( temp structure{ temp 4-component vector of float a,  temp bool b,  temp 1-component vector of float c,  temp 2-component vector of float d,  temp bool ff1,  temp bool ff2,  temp bool ff3,  temp 4-component vector of float ff4})
 0:40            Constant:
 0:40              2 (const int)
-0:40          c: direct index for structure ( centroid noperspective temp 1-component vector of float)
-0:40            's' (layout( location=1) in structure{ smooth temp 4-component vector of float a,  flat temp bool b,  centroid noperspective temp 1-component vector of float c,  centroid sample temp 2-component vector of float d,  temp bool ff2,  temp bool ff3,  temp 4-component vector of float ff4})
-0:40            Constant:
-0:40              2 (const int)
+0:?           's.c' (layout( location=3) centroid noperspective in 1-component vector of float)
 0:40        move second child to first child ( temp 2-component vector of float)
 0:40          d: direct index for structure ( temp 2-component vector of float)
 0:?             's' ( temp structure{ temp 4-component vector of float a,  temp bool b,  temp 1-component vector of float c,  temp 2-component vector of float d,  temp bool ff1,  temp bool ff2,  temp bool ff3,  temp 4-component vector of float ff4})
 0:40            Constant:
 0:40              3 (const int)
-0:40          d: direct index for structure ( centroid sample temp 2-component vector of float)
-0:40            's' (layout( location=1) in structure{ smooth temp 4-component vector of float a,  flat temp bool b,  centroid noperspective temp 1-component vector of float c,  centroid sample temp 2-component vector of float d,  temp bool ff2,  temp bool ff3,  temp 4-component vector of float ff4})
-0:40            Constant:
-0:40              3 (const int)
+0:?           's.d' (layout( location=4) centroid sample in 2-component vector of float)
 0:40        move second child to first child ( temp bool)
 0:40          ff1: direct index for structure ( temp bool)
 0:?             's' ( temp structure{ temp 4-component vector of float a,  temp bool b,  temp 1-component vector of float c,  temp 2-component vector of float d,  temp bool ff1,  temp bool ff2,  temp bool ff3,  temp 4-component vector of float ff4})
 0:40            Constant:
 0:40              4 (const int)
-0:?           's_ff1' ( in bool Face)
+0:?           's.ff1' ( flat in bool Face)
 0:40        move second child to first child ( temp bool)
 0:40          ff2: direct index for structure ( temp bool)
 0:?             's' ( temp structure{ temp 4-component vector of float a,  temp bool b,  temp 1-component vector of float c,  temp 2-component vector of float d,  temp bool ff1,  temp bool ff2,  temp bool ff3,  temp 4-component vector of float ff4})
 0:40            Constant:
 0:40              5 (const int)
-0:40          ff2: direct index for structure ( temp bool)
-0:40            's' (layout( location=1) in structure{ smooth temp 4-component vector of float a,  flat temp bool b,  centroid noperspective temp 1-component vector of float c,  centroid sample temp 2-component vector of float d,  temp bool ff2,  temp bool ff3,  temp 4-component vector of float ff4})
-0:40            Constant:
-0:40              4 (const int)
+0:?           's.ff2' (layout( location=5) flat in bool)
 0:40        move second child to first child ( temp bool)
 0:40          ff3: direct index for structure ( temp bool)
 0:?             's' ( temp structure{ temp 4-component vector of float a,  temp bool b,  temp 1-component vector of float c,  temp 2-component vector of float d,  temp bool ff1,  temp bool ff2,  temp bool ff3,  temp 4-component vector of float ff4})
 0:40            Constant:
 0:40              6 (const int)
-0:40          ff3: direct index for structure ( temp bool)
-0:40            's' (layout( location=1) in structure{ smooth temp 4-component vector of float a,  flat temp bool b,  centroid noperspective temp 1-component vector of float c,  centroid sample temp 2-component vector of float d,  temp bool ff2,  temp bool ff3,  temp 4-component vector of float ff4})
-0:40            Constant:
-0:40              5 (const int)
+0:?           's.ff3' (layout( location=6) flat in bool)
 0:40        move second child to first child ( temp 4-component vector of float)
 0:40          ff4: direct index for structure ( temp 4-component vector of float)
 0:?             's' ( temp structure{ temp 4-component vector of float a,  temp bool b,  temp 1-component vector of float c,  temp 2-component vector of float d,  temp bool ff1,  temp bool ff2,  temp bool ff3,  temp 4-component vector of float ff4})
 0:40            Constant:
 0:40              7 (const int)
-0:40          ff4: direct index for structure ( temp 4-component vector of float)
-0:40            's' (layout( location=1) in structure{ smooth temp 4-component vector of float a,  flat temp bool b,  centroid noperspective temp 1-component vector of float c,  centroid sample temp 2-component vector of float d,  temp bool ff2,  temp bool ff3,  temp 4-component vector of float ff4})
-0:40            Constant:
-0:40              6 (const int)
+0:?           's.ff4' (layout( location=7) in 4-component vector of float)
 0:40      move second child to first child ( temp 4-component vector of float)
 0:?         '@entryPointOutput' (layout( location=0) out 4-component vector of float)
 0:40        Function Call: @PixelShaderFunction(vf4;struct-IN_S-vf4-b1-vf1-vf2-b1-b1-b1-vf41; ( temp 4-component vector of float)
@@ -238,17 +202,27 @@
 0:?     's2' ( global structure{ temp 4-component vector of float i})
 0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
 0:?     'input' (layout( location=0) in 4-component vector of float)
-0:?     's' (layout( location=1) in structure{ smooth temp 4-component vector of float a,  flat temp bool b,  centroid noperspective temp 1-component vector of float c,  centroid sample temp 2-component vector of float d,  temp bool ff2,  temp bool ff3,  temp 4-component vector of float ff4})
-0:?     's_ff1' ( in bool Face)
+0:?     's.ff1' ( flat in bool Face)
+0:?     's.a' (layout( location=1) smooth in 4-component vector of float)
+0:?     's.b' (layout( location=2) flat in bool)
+0:?     's.c' (layout( location=3) centroid noperspective in 1-component vector of float)
+0:?     's.d' (layout( location=4) centroid sample in 2-component vector of float)
+0:?     's.ff2' (layout( location=5) flat in bool)
+0:?     's.ff3' (layout( location=6) flat in bool)
+0:?     's.ff4' (layout( location=7) in 4-component vector of float)
+
+error: SPIRV-Tools Validation Errors
+error: If OpTypeBool is stored in conjunction with OpVariable, it can only be used with non-externally visible shader Storage Classes: Workgroup, CrossWorkgroup, Private, and Function
+  %s_b = OpVariable %_ptr_Input_bool Input
 
 // Module Version 10000
-// Generated by (magic number): 80001
-// Id's are bound by 105
+// Generated by (magic number): 80007
+// Id's are bound by 102
 
                               Capability Shader
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "PixelShaderFunction" 51 56 79 94
+                              EntryPoint Fragment 4  "PixelShaderFunction" 51 54 59 65 71 76 80 84 87 91
                               ExecutionMode 4 OriginUpperLeft
                               Source HLSL 500
                               Name 4  "PixelShaderFunction"
@@ -278,46 +252,53 @@
                               Name 49  "input"
                               Name 51  "input"
                               Name 53  "s"
-                              Name 54  "IN_S"
-                              MemberName 54(IN_S) 0  "a"
-                              MemberName 54(IN_S) 1  "b"
-                              MemberName 54(IN_S) 2  "c"
-                              MemberName 54(IN_S) 3  "d"
-                              MemberName 54(IN_S) 4  "ff2"
-                              MemberName 54(IN_S) 5  "ff3"
-                              MemberName 54(IN_S) 6  "ff4"
-                              Name 56  "s"
-                              Name 79  "s_ff1"
-                              Name 94  "@entryPointOutput"
-                              Name 95  "param"
-                              Name 97  "param"
-                              Name 101  "myS"
-                              MemberName 101(myS) 0  "b"
-                              MemberName 101(myS) 1  "c"
-                              MemberName 101(myS) 2  "a"
-                              MemberName 101(myS) 3  "d"
-                              Name 102  "$Global"
-                              MemberName 102($Global) 0  "s1"
-                              MemberName 102($Global) 1  "ff5"
-                              MemberName 102($Global) 2  "ff6"
-                              Name 104  ""
+                              Name 54  "s.a"
+                              Name 59  "s.b"
+                              Name 65  "s.c"
+                              Name 71  "s.d"
+                              Name 76  "s.ff1"
+                              Name 80  "s.ff2"
+                              Name 84  "s.ff3"
+                              Name 87  "s.ff4"
+                              Name 91  "@entryPointOutput"
+                              Name 92  "param"
+                              Name 94  "param"
+                              Name 98  "myS"
+                              MemberName 98(myS) 0  "b"
+                              MemberName 98(myS) 1  "c"
+                              MemberName 98(myS) 2  "a"
+                              MemberName 98(myS) 3  "d"
+                              Name 99  "$Global"
+                              MemberName 99($Global) 0  "s1"
+                              MemberName 99($Global) 1  "ff5"
+                              MemberName 99($Global) 2  "ff6"
+                              Name 101  ""
                               Decorate 51(input) Location 0
-                              MemberDecorate 54(IN_S) 1 Flat
-                              MemberDecorate 54(IN_S) 2 NoPerspective
-                              MemberDecorate 54(IN_S) 2 Centroid
-                              MemberDecorate 54(IN_S) 3 Centroid
-                              Decorate 56(s) Location 1
-                              Decorate 79(s_ff1) BuiltIn FrontFacing
-                              Decorate 94(@entryPointOutput) Location 0
-                              MemberDecorate 101(myS) 0 Offset 0
-                              MemberDecorate 101(myS) 1 Offset 4
-                              MemberDecorate 101(myS) 2 Offset 16
-                              MemberDecorate 101(myS) 3 Offset 32
-                              MemberDecorate 102($Global) 0 Offset 0
-                              MemberDecorate 102($Global) 1 Offset 1620
-                              MemberDecorate 102($Global) 2 Offset 1636
-                              Decorate 102($Global) Block
-                              Decorate 104 DescriptorSet 0
+                              Decorate 54(s.a) Location 1
+                              Decorate 59(s.b) Flat
+                              Decorate 59(s.b) Location 2
+                              Decorate 65(s.c) NoPerspective
+                              Decorate 65(s.c) Centroid
+                              Decorate 65(s.c) Location 3
+                              Decorate 71(s.d) Centroid
+                              Decorate 71(s.d) Location 4
+                              Decorate 76(s.ff1) Flat
+                              Decorate 76(s.ff1) BuiltIn FrontFacing
+                              Decorate 80(s.ff2) Flat
+                              Decorate 80(s.ff2) Location 5
+                              Decorate 84(s.ff3) Flat
+                              Decorate 84(s.ff3) Location 6
+                              Decorate 87(s.ff4) Location 7
+                              Decorate 91(@entryPointOutput) Location 0
+                              MemberDecorate 98(myS) 0 Offset 0
+                              MemberDecorate 98(myS) 1 Offset 4
+                              MemberDecorate 98(myS) 2 Offset 16
+                              MemberDecorate 98(myS) 3 Offset 32
+                              MemberDecorate 99($Global) 0 Offset 0
+                              MemberDecorate 99($Global) 1 Offset 1620
+                              MemberDecorate 99($Global) 2 Offset 1636
+                              Decorate 99($Global) Block
+                              Decorate 101 DescriptorSet 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -344,74 +325,71 @@
               42:             TypePointer Function 41(containEmpty)
               50:             TypePointer Input 7(fvec4)
        51(input):     50(ptr) Variable Input
-        54(IN_S):             TypeStruct 7(fvec4) 9(bool) 6(float) 10(fvec2) 9(bool) 9(bool) 7(fvec4)
-              55:             TypePointer Input 54(IN_S)
-           56(s):     55(ptr) Variable Input
-              60:     31(int) Constant 1
-              61:             TypePointer Input 9(bool)
-              64:             TypePointer Function 9(bool)
-              66:     31(int) Constant 2
-              67:             TypePointer Input 6(float)
-              70:             TypePointer Function 6(float)
-              72:     31(int) Constant 3
-              73:             TypePointer Input 10(fvec2)
-              76:             TypePointer Function 10(fvec2)
-              78:     31(int) Constant 4
-       79(s_ff1):     61(ptr) Variable Input
-              82:     31(int) Constant 5
-              86:     31(int) Constant 6
-              93:             TypePointer Output 7(fvec4)
-94(@entryPointOutput):     93(ptr) Variable Output
-             100:             TypeInt 32 0
-        101(myS):             TypeStruct 100(int) 100(int) 7(fvec4) 7(fvec4)
-    102($Global):             TypeStruct 101(myS) 6(float) 6(float)
-             103:             TypePointer Uniform 102($Global)
-             104:    103(ptr) Variable Uniform
+         54(s.a):     50(ptr) Variable Input
+              57:     31(int) Constant 1
+              58:             TypePointer Input 9(bool)
+         59(s.b):     58(ptr) Variable Input
+              61:             TypePointer Function 9(bool)
+              63:     31(int) Constant 2
+              64:             TypePointer Input 6(float)
+         65(s.c):     64(ptr) Variable Input
+              67:             TypePointer Function 6(float)
+              69:     31(int) Constant 3
+              70:             TypePointer Input 10(fvec2)
+         71(s.d):     70(ptr) Variable Input
+              73:             TypePointer Function 10(fvec2)
+              75:     31(int) Constant 4
+       76(s.ff1):     58(ptr) Variable Input
+              79:     31(int) Constant 5
+       80(s.ff2):     58(ptr) Variable Input
+              83:     31(int) Constant 6
+       84(s.ff3):     58(ptr) Variable Input
+       87(s.ff4):     50(ptr) Variable Input
+              90:             TypePointer Output 7(fvec4)
+91(@entryPointOutput):     90(ptr) Variable Output
+              97:             TypeInt 32 0
+         98(myS):             TypeStruct 97(int) 97(int) 7(fvec4) 7(fvec4)
+     99($Global):             TypeStruct 98(myS) 6(float) 6(float)
+             100:             TypePointer Uniform 99($Global)
+             101:    100(ptr) Variable Uniform
 4(PixelShaderFunction):           2 Function None 3
                5:             Label
        49(input):      8(ptr) Variable Function
            53(s):     12(ptr) Variable Function
-       95(param):      8(ptr) Variable Function
-       97(param):     12(ptr) Variable Function
+       92(param):      8(ptr) Variable Function
+       94(param):     12(ptr) Variable Function
               52:    7(fvec4) Load 51(input)
                               Store 49(input) 52
-              57:     50(ptr) AccessChain 56(s) 32
-              58:    7(fvec4) Load 57
-              59:      8(ptr) AccessChain 53(s) 32
-                              Store 59 58
-              62:     61(ptr) AccessChain 56(s) 60
-              63:     9(bool) Load 62
-              65:     64(ptr) AccessChain 53(s) 60
-                              Store 65 63
-              68:     67(ptr) AccessChain 56(s) 66
-              69:    6(float) Load 68
-              71:     70(ptr) AccessChain 53(s) 66
-                              Store 71 69
-              74:     73(ptr) AccessChain 56(s) 72
-              75:   10(fvec2) Load 74
-              77:     76(ptr) AccessChain 53(s) 72
-                              Store 77 75
-              80:     9(bool) Load 79(s_ff1)
-              81:     64(ptr) AccessChain 53(s) 78
-                              Store 81 80
-              83:     61(ptr) AccessChain 56(s) 78
-              84:     9(bool) Load 83
-              85:     64(ptr) AccessChain 53(s) 82
-                              Store 85 84
-              87:     61(ptr) AccessChain 56(s) 82
-              88:     9(bool) Load 87
-              89:     64(ptr) AccessChain 53(s) 86
+              55:    7(fvec4) Load 54(s.a)
+              56:      8(ptr) AccessChain 53(s) 32
+                              Store 56 55
+              60:     9(bool) Load 59(s.b)
+              62:     61(ptr) AccessChain 53(s) 57
+                              Store 62 60
+              66:    6(float) Load 65(s.c)
+              68:     67(ptr) AccessChain 53(s) 63
+                              Store 68 66
+              72:   10(fvec2) Load 71(s.d)
+              74:     73(ptr) AccessChain 53(s) 69
+                              Store 74 72
+              77:     9(bool) Load 76(s.ff1)
+              78:     61(ptr) AccessChain 53(s) 75
+                              Store 78 77
+              81:     9(bool) Load 80(s.ff2)
+              82:     61(ptr) AccessChain 53(s) 79
+                              Store 82 81
+              85:     9(bool) Load 84(s.ff3)
+              86:     61(ptr) AccessChain 53(s) 83
+                              Store 86 85
+              88:    7(fvec4) Load 87(s.ff4)
+              89:      8(ptr) AccessChain 53(s) 33
                               Store 89 88
-              90:     50(ptr) AccessChain 56(s) 86
-              91:    7(fvec4) Load 90
-              92:      8(ptr) AccessChain 53(s) 33
-                              Store 92 91
-              96:    7(fvec4) Load 49(input)
-                              Store 95(param) 96
-              98:    11(IN_S) Load 53(s)
-                              Store 97(param) 98
-              99:    7(fvec4) FunctionCall 16(@PixelShaderFunction(vf4;struct-IN_S-vf4-b1-vf1-vf2-b1-b1-b1-vf41;) 95(param) 97(param)
-                              Store 94(@entryPointOutput) 99
+              93:    7(fvec4) Load 49(input)
+                              Store 92(param) 93
+              95:    11(IN_S) Load 53(s)
+                              Store 94(param) 95
+              96:    7(fvec4) FunctionCall 16(@PixelShaderFunction(vf4;struct-IN_S-vf4-b1-vf1-vf2-b1-b1-b1-vf41;) 92(param) 94(param)
+                              Store 91(@entryPointOutput) 96
                               Return
                               FunctionEnd
 16(@PixelShaderFunction(vf4;struct-IN_S-vf4-b1-vf1-vf2-b1-b1-b1-vf41;):    7(fvec4) Function None 13
diff --git a/Test/baseResults/hlsl.struct.split-1.vert.out b/Test/baseResults/hlsl.struct.split-1.vert.out
index db40682..d7d6e92 100644
--- a/Test/baseResults/hlsl.struct.split-1.vert.out
+++ b/Test/baseResults/hlsl.struct.split-1.vert.out
@@ -46,19 +46,19 @@
 0:?             'vsin' ( temp structure{ temp int x0_in,  temp 4-component vector of float Pos_in,  temp int x1_in})
 0:17            Constant:
 0:17              0 (const int)
-0:?           'x0_in' (layout( location=0) in int)
+0:?           'vsin.x0_in' (layout( location=0) in int)
 0:17        move second child to first child ( temp 4-component vector of float)
 0:17          Pos_in: direct index for structure ( temp 4-component vector of float)
 0:?             'vsin' ( temp structure{ temp int x0_in,  temp 4-component vector of float Pos_in,  temp int x1_in})
 0:17            Constant:
 0:17              1 (const int)
-0:?           'Pos_in' (layout( location=1) in 4-component vector of float)
+0:?           'vsin.Pos_in' (layout( location=1) in 4-component vector of float)
 0:17        move second child to first child ( temp int)
 0:17          x1_in: direct index for structure ( temp int)
 0:?             'vsin' ( temp structure{ temp int x0_in,  temp 4-component vector of float Pos_in,  temp int x1_in})
 0:17            Constant:
 0:17              2 (const int)
-0:?           'x1_in' (layout( location=2) in int)
+0:?           'vsin.x1_in' (layout( location=2) in int)
 0:17      move second child to first child ( temp 4-component vector of float)
 0:?         'Pos_loose' ( temp 4-component vector of float)
 0:?         'Pos_loose' (layout( location=3) in 4-component vector of float)
@@ -69,34 +69,30 @@
 0:?             'vsin' ( temp structure{ temp int x0_in,  temp 4-component vector of float Pos_in,  temp int x1_in})
 0:?             'Pos_loose' ( temp 4-component vector of float)
 0:17        move second child to first child ( temp int)
-0:17          x0_out: direct index for structure ( temp int)
-0:17            '@entryPointOutput' (layout( location=0) out structure{ temp int x0_out,  temp int x1_out})
-0:17            Constant:
-0:17              0 (const int)
+0:?           '@entryPointOutput.x0_out' (layout( location=0) out int)
 0:17          x0_out: direct index for structure ( temp int)
 0:17            'flattenTemp' ( temp structure{ temp int x0_out,  temp 4-component vector of float Pos_out,  temp int x1_out})
 0:17            Constant:
 0:17              0 (const int)
 0:17        move second child to first child ( temp 4-component vector of float)
-0:?           '@entryPointOutput_Pos_out' ( out 4-component vector of float Position)
+0:?           '@entryPointOutput.Pos_out' ( out 4-component vector of float Position)
 0:17          Pos_out: direct index for structure ( temp 4-component vector of float)
 0:17            'flattenTemp' ( temp structure{ temp int x0_out,  temp 4-component vector of float Pos_out,  temp int x1_out})
 0:17            Constant:
 0:17              1 (const int)
 0:17        move second child to first child ( temp int)
-0:17          x1_out: direct index for structure ( temp int)
-0:17            '@entryPointOutput' (layout( location=0) out structure{ temp int x0_out,  temp int x1_out})
-0:17            Constant:
-0:17              1 (const int)
+0:?           '@entryPointOutput.x1_out' (layout( location=1) out int)
 0:17          x1_out: direct index for structure ( temp int)
 0:17            'flattenTemp' ( temp structure{ temp int x0_out,  temp 4-component vector of float Pos_out,  temp int x1_out})
 0:17            Constant:
 0:17              2 (const int)
 0:?   Linker Objects
-0:?     '@entryPointOutput' (layout( location=0) out structure{ temp int x0_out,  temp int x1_out})
-0:?     'x0_in' (layout( location=0) in int)
-0:?     'Pos_in' (layout( location=1) in 4-component vector of float)
-0:?     'x1_in' (layout( location=2) in int)
+0:?     '@entryPointOutput.Pos_out' ( out 4-component vector of float Position)
+0:?     '@entryPointOutput.x0_out' (layout( location=0) out int)
+0:?     '@entryPointOutput.x1_out' (layout( location=1) out int)
+0:?     'vsin.x0_in' (layout( location=0) in int)
+0:?     'vsin.Pos_in' (layout( location=1) in 4-component vector of float)
+0:?     'vsin.x1_in' (layout( location=2) in int)
 0:?     'Pos_loose' (layout( location=3) in 4-component vector of float)
 
 
@@ -150,19 +146,19 @@
 0:?             'vsin' ( temp structure{ temp int x0_in,  temp 4-component vector of float Pos_in,  temp int x1_in})
 0:17            Constant:
 0:17              0 (const int)
-0:?           'x0_in' (layout( location=0) in int)
+0:?           'vsin.x0_in' (layout( location=0) in int)
 0:17        move second child to first child ( temp 4-component vector of float)
 0:17          Pos_in: direct index for structure ( temp 4-component vector of float)
 0:?             'vsin' ( temp structure{ temp int x0_in,  temp 4-component vector of float Pos_in,  temp int x1_in})
 0:17            Constant:
 0:17              1 (const int)
-0:?           'Pos_in' (layout( location=1) in 4-component vector of float)
+0:?           'vsin.Pos_in' (layout( location=1) in 4-component vector of float)
 0:17        move second child to first child ( temp int)
 0:17          x1_in: direct index for structure ( temp int)
 0:?             'vsin' ( temp structure{ temp int x0_in,  temp 4-component vector of float Pos_in,  temp int x1_in})
 0:17            Constant:
 0:17              2 (const int)
-0:?           'x1_in' (layout( location=2) in int)
+0:?           'vsin.x1_in' (layout( location=2) in int)
 0:17      move second child to first child ( temp 4-component vector of float)
 0:?         'Pos_loose' ( temp 4-component vector of float)
 0:?         'Pos_loose' (layout( location=3) in 4-component vector of float)
@@ -173,44 +169,40 @@
 0:?             'vsin' ( temp structure{ temp int x0_in,  temp 4-component vector of float Pos_in,  temp int x1_in})
 0:?             'Pos_loose' ( temp 4-component vector of float)
 0:17        move second child to first child ( temp int)
-0:17          x0_out: direct index for structure ( temp int)
-0:17            '@entryPointOutput' (layout( location=0) out structure{ temp int x0_out,  temp int x1_out})
-0:17            Constant:
-0:17              0 (const int)
+0:?           '@entryPointOutput.x0_out' (layout( location=0) out int)
 0:17          x0_out: direct index for structure ( temp int)
 0:17            'flattenTemp' ( temp structure{ temp int x0_out,  temp 4-component vector of float Pos_out,  temp int x1_out})
 0:17            Constant:
 0:17              0 (const int)
 0:17        move second child to first child ( temp 4-component vector of float)
-0:?           '@entryPointOutput_Pos_out' ( out 4-component vector of float Position)
+0:?           '@entryPointOutput.Pos_out' ( out 4-component vector of float Position)
 0:17          Pos_out: direct index for structure ( temp 4-component vector of float)
 0:17            'flattenTemp' ( temp structure{ temp int x0_out,  temp 4-component vector of float Pos_out,  temp int x1_out})
 0:17            Constant:
 0:17              1 (const int)
 0:17        move second child to first child ( temp int)
-0:17          x1_out: direct index for structure ( temp int)
-0:17            '@entryPointOutput' (layout( location=0) out structure{ temp int x0_out,  temp int x1_out})
-0:17            Constant:
-0:17              1 (const int)
+0:?           '@entryPointOutput.x1_out' (layout( location=1) out int)
 0:17          x1_out: direct index for structure ( temp int)
 0:17            'flattenTemp' ( temp structure{ temp int x0_out,  temp 4-component vector of float Pos_out,  temp int x1_out})
 0:17            Constant:
 0:17              2 (const int)
 0:?   Linker Objects
-0:?     '@entryPointOutput' (layout( location=0) out structure{ temp int x0_out,  temp int x1_out})
-0:?     'x0_in' (layout( location=0) in int)
-0:?     'Pos_in' (layout( location=1) in 4-component vector of float)
-0:?     'x1_in' (layout( location=2) in int)
+0:?     '@entryPointOutput.Pos_out' ( out 4-component vector of float Position)
+0:?     '@entryPointOutput.x0_out' (layout( location=0) out int)
+0:?     '@entryPointOutput.x1_out' (layout( location=1) out int)
+0:?     'vsin.x0_in' (layout( location=0) in int)
+0:?     'vsin.Pos_in' (layout( location=1) in 4-component vector of float)
+0:?     'vsin.x1_in' (layout( location=2) in int)
 0:?     'Pos_loose' (layout( location=3) in 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80001
-// Id's are bound by 73
+// Generated by (magic number): 80007
+// Id's are bound by 70
 
                               Capability Shader
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Vertex 4  "main" 40 44 47 51 61 67
+                              EntryPoint Vertex 4  "main" 40 44 47 51 60 64 67
                               Source HLSL 500
                               Name 4  "main"
                               Name 9  "VS_INPUT"
@@ -226,25 +218,24 @@
                               Name 15  "Pos_loose"
                               Name 19  "vsout"
                               Name 38  "vsin"
-                              Name 40  "x0_in"
-                              Name 44  "Pos_in"
-                              Name 47  "x1_in"
+                              Name 40  "vsin.x0_in"
+                              Name 44  "vsin.Pos_in"
+                              Name 47  "vsin.x1_in"
                               Name 50  "Pos_loose"
                               Name 51  "Pos_loose"
                               Name 53  "flattenTemp"
                               Name 54  "param"
                               Name 56  "param"
-                              Name 59  "VS_OUTPUT"
-                              MemberName 59(VS_OUTPUT) 0  "x0_out"
-                              MemberName 59(VS_OUTPUT) 1  "x1_out"
-                              Name 61  "@entryPointOutput"
-                              Name 67  "@entryPointOutput_Pos_out"
-                              Decorate 40(x0_in) Location 0
-                              Decorate 44(Pos_in) Location 1
-                              Decorate 47(x1_in) Location 2
+                              Name 60  "@entryPointOutput.x0_out"
+                              Name 64  "@entryPointOutput.Pos_out"
+                              Name 67  "@entryPointOutput.x1_out"
+                              Decorate 40(vsin.x0_in) Location 0
+                              Decorate 44(vsin.Pos_in) Location 1
+                              Decorate 47(vsin.x1_in) Location 2
                               Decorate 51(Pos_loose) Location 3
-                              Decorate 61(@entryPointOutput) Location 0
-                              Decorate 67(@entryPointOutput_Pos_out) BuiltIn Position
+                              Decorate 60(@entryPointOutput.x0_out) Location 0
+                              Decorate 64(@entryPointOutput.Pos_out) BuiltIn Position
+                              Decorate 67(@entryPointOutput.x1_out) Location 1
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 32 1
@@ -261,17 +252,16 @@
               25:      6(int) Constant 1
               31:      6(int) Constant 2
               39:             TypePointer Input 6(int)
-       40(x0_in):     39(ptr) Variable Input
+  40(vsin.x0_in):     39(ptr) Variable Input
               43:             TypePointer Input 8(fvec4)
-      44(Pos_in):     43(ptr) Variable Input
-       47(x1_in):     39(ptr) Variable Input
+ 44(vsin.Pos_in):     43(ptr) Variable Input
+  47(vsin.x1_in):     39(ptr) Variable Input
    51(Pos_loose):     43(ptr) Variable Input
-   59(VS_OUTPUT):             TypeStruct 6(int) 6(int)
-              60:             TypePointer Output 59(VS_OUTPUT)
-61(@entryPointOutput):     60(ptr) Variable Output
-              64:             TypePointer Output 6(int)
-              66:             TypePointer Output 8(fvec4)
-67(@entryPointOutput_Pos_out):     66(ptr) Variable Output
+              59:             TypePointer Output 6(int)
+60(@entryPointOutput.x0_out):     59(ptr) Variable Output
+              63:             TypePointer Output 8(fvec4)
+64(@entryPointOutput.Pos_out):     63(ptr) Variable Output
+67(@entryPointOutput.x1_out):     59(ptr) Variable Output
          4(main):           2 Function None 3
                5:             Label
         38(vsin):     10(ptr) Variable Function
@@ -279,13 +269,13 @@
  53(flattenTemp):     18(ptr) Variable Function
        54(param):     10(ptr) Variable Function
        56(param):     11(ptr) Variable Function
-              41:      6(int) Load 40(x0_in)
+              41:      6(int) Load 40(vsin.x0_in)
               42:     21(ptr) AccessChain 38(vsin) 20
                               Store 42 41
-              45:    8(fvec4) Load 44(Pos_in)
+              45:    8(fvec4) Load 44(vsin.Pos_in)
               46:     11(ptr) AccessChain 38(vsin) 25
                               Store 46 45
-              48:      6(int) Load 47(x1_in)
+              48:      6(int) Load 47(vsin.x1_in)
               49:     21(ptr) AccessChain 38(vsin) 31
                               Store 49 48
               52:    8(fvec4) Load 51(Pos_loose)
@@ -296,17 +286,15 @@
                               Store 56(param) 57
               58:12(VS_OUTPUT) FunctionCall 16(@main(struct-VS_INPUT-i1-vf4-i11;vf4;) 54(param) 56(param)
                               Store 53(flattenTemp) 58
-              62:     21(ptr) AccessChain 53(flattenTemp) 20
-              63:      6(int) Load 62
-              65:     64(ptr) AccessChain 61(@entryPointOutput) 20
-                              Store 65 63
-              68:     11(ptr) AccessChain 53(flattenTemp) 25
-              69:    8(fvec4) Load 68
-                              Store 67(@entryPointOutput_Pos_out) 69
-              70:     21(ptr) AccessChain 53(flattenTemp) 31
-              71:      6(int) Load 70
-              72:     64(ptr) AccessChain 61(@entryPointOutput) 25
-                              Store 72 71
+              61:     21(ptr) AccessChain 53(flattenTemp) 20
+              62:      6(int) Load 61
+                              Store 60(@entryPointOutput.x0_out) 62
+              65:     11(ptr) AccessChain 53(flattenTemp) 25
+              66:    8(fvec4) Load 65
+                              Store 64(@entryPointOutput.Pos_out) 66
+              68:     21(ptr) AccessChain 53(flattenTemp) 31
+              69:      6(int) Load 68
+                              Store 67(@entryPointOutput.x1_out) 69
                               Return
                               FunctionEnd
 16(@main(struct-VS_INPUT-i1-vf4-i11;vf4;):12(VS_OUTPUT) Function None 13
diff --git a/Test/baseResults/hlsl.struct.split.array.geom.out b/Test/baseResults/hlsl.struct.split.array.geom.out
index 5c36e2b..081b05c 100644
--- a/Test/baseResults/hlsl.struct.split.array.geom.out
+++ b/Test/baseResults/hlsl.struct.split.array.geom.out
@@ -72,7 +72,10 @@
 0:?         'OutputStream' ( temp structure{ temp 4-component vector of float Pos,  temp 2-component vector of float TexCoord,  temp 3-component vector of float TerrainPos,  temp uint VertexID})
 0:?   Linker Objects
 0:?     'v' (layout( location=0) in 1-element array of uint)
-0:?     'OutputStream' (layout( location=0) out structure{ temp 2-component vector of float TexCoord,  temp 3-component vector of float TerrainPos,  temp uint VertexID})
+0:?     'OutputStream.Pos' ( out 4-component vector of float Position)
+0:?     'OutputStream.TexCoord' (layout( location=0) out 2-component vector of float)
+0:?     'OutputStream.TerrainPos' (layout( location=1) out 3-component vector of float)
+0:?     'OutputStream.VertexID' (layout( location=2) out uint)
 
 
 Linked geometry stage:
@@ -151,16 +154,19 @@
 0:?         'OutputStream' ( temp structure{ temp 4-component vector of float Pos,  temp 2-component vector of float TexCoord,  temp 3-component vector of float TerrainPos,  temp uint VertexID})
 0:?   Linker Objects
 0:?     'v' (layout( location=0) in 1-element array of uint)
-0:?     'OutputStream' (layout( location=0) out structure{ temp 2-component vector of float TexCoord,  temp 3-component vector of float TerrainPos,  temp uint VertexID})
+0:?     'OutputStream.Pos' ( out 4-component vector of float Position)
+0:?     'OutputStream.TexCoord' (layout( location=0) out 2-component vector of float)
+0:?     'OutputStream.TerrainPos' (layout( location=1) out 3-component vector of float)
+0:?     'OutputStream.VertexID' (layout( location=2) out uint)
 
 // Module Version 10000
-// Generated by (magic number): 80001
-// Id's are bound by 77
+// Generated by (magic number): 80007
+// Id's are bound by 82
 
                               Capability Geometry
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Geometry 4  "main" 66 76
+                              EntryPoint Geometry 4  "main" 66 75 77 79 81
                               ExecutionMode 4 InputPoints
                               ExecutionMode 4 Invocations 1
                               ExecutionMode 4 OutputTriangleStrip
@@ -184,13 +190,15 @@
                               Name 68  "OutputStream"
                               Name 69  "param"
                               Name 71  "param"
-                              Name 74  "PSInput"
-                              MemberName 74(PSInput) 0  "TexCoord"
-                              MemberName 74(PSInput) 1  "TerrainPos"
-                              MemberName 74(PSInput) 2  "VertexID"
-                              Name 76  "OutputStream"
+                              Name 75  "OutputStream.Pos"
+                              Name 77  "OutputStream.TexCoord"
+                              Name 79  "OutputStream.TerrainPos"
+                              Name 81  "OutputStream.VertexID"
                               Decorate 66(v) Location 0
-                              Decorate 76(OutputStream) Location 0
+                              Decorate 75(OutputStream.Pos) BuiltIn Position
+                              Decorate 77(OutputStream.TexCoord) Location 0
+                              Decorate 79(OutputStream.TerrainPos) Location 1
+                              Decorate 81(OutputStream.VertexID) Location 2
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 32 0
@@ -223,9 +231,14 @@
               60:     28(int) Constant 1
               65:             TypePointer Input 8
            66(v):     65(ptr) Variable Input
-     74(PSInput):             TypeStruct 12(fvec2) 13(fvec3) 6(int)
-              75:             TypePointer Output 74(PSInput)
-76(OutputStream):     75(ptr) Variable Output
+              74:             TypePointer Output 11(fvec4)
+75(OutputStream.Pos):     74(ptr) Variable Output
+              76:             TypePointer Output 12(fvec2)
+77(OutputStream.TexCoord):     76(ptr) Variable Output
+              78:             TypePointer Output 13(fvec3)
+79(OutputStream.TerrainPos):     78(ptr) Variable Output
+              80:             TypePointer Output 6(int)
+81(OutputStream.VertexID):     80(ptr) Variable Output
          4(main):           2 Function None 3
                5:             Label
            64(v):      9(ptr) Variable Function
diff --git a/Test/baseResults/hlsl.struct.split.assign.frag.out b/Test/baseResults/hlsl.struct.split.assign.frag.out
index 2228a8a..0598ac9 100644
--- a/Test/baseResults/hlsl.struct.split.assign.frag.out
+++ b/Test/baseResults/hlsl.struct.split.assign.frag.out
@@ -11,16 +11,19 @@
 0:9        'input' ( in 3-element array of structure{ temp float f,  temp 4-component vector of float pos})
 0:9        'a' ( temp 3-element array of structure{ temp float f,  temp 4-component vector of float pos})
 0:11      Branch: Return with expression
-0:11        Constant:
-0:11          1.000000
-0:11          1.000000
-0:11          1.000000
+0:11        pos: direct index for structure ( temp 4-component vector of float)
+0:11          direct index ( temp structure{ temp float f,  temp 4-component vector of float pos})
+0:11            'a' ( temp 3-element array of structure{ temp float f,  temp 4-component vector of float pos})
+0:11            Constant:
+0:11              1 (const int)
+0:11          Constant:
+0:11            1 (const int)
 0:7  Function Definition: main( ( temp void)
 0:7    Function Parameters: 
 0:?     Sequence
 0:7      move second child to first child ( temp int)
 0:?         'i' ( temp int)
-0:?         'i' (layout( location=0) in int)
+0:?         'i' (layout( location=0) flat in int)
 0:7      Sequence
 0:7        move second child to first child ( temp float)
 0:7          f: direct index for structure ( temp float)
@@ -30,13 +33,7 @@
 0:7                0 (const int)
 0:7            Constant:
 0:7              0 (const int)
-0:7          f: direct index for structure ( temp float)
-0:7            direct index (layout( location=1) in structure{ temp float f})
-0:7              'input' (layout( location=1) in 3-element array of structure{ temp float f})
-0:7              Constant:
-0:7                0 (const int)
-0:7            Constant:
-0:7              0 (const int)
+0:?           'input[0].f' (layout( location=1) in float)
 0:7        move second child to first child ( temp 4-component vector of float)
 0:7          pos: direct index for structure ( temp 4-component vector of float)
 0:7            direct index ( temp structure{ temp float f,  temp 4-component vector of float pos})
@@ -46,7 +43,7 @@
 0:7            Constant:
 0:7              1 (const int)
 0:7          direct index ( in 4-component vector of float FragCoord)
-0:?             'input_pos' ( in 3-element array of 4-component vector of float FragCoord)
+0:?             'input.pos' ( in 3-element array of 4-component vector of float FragCoord)
 0:7            Constant:
 0:7              0 (const int)
 0:7        move second child to first child ( temp float)
@@ -57,13 +54,7 @@
 0:7                1 (const int)
 0:7            Constant:
 0:7              0 (const int)
-0:7          f: direct index for structure ( temp float)
-0:7            direct index (layout( location=1) in structure{ temp float f})
-0:7              'input' (layout( location=1) in 3-element array of structure{ temp float f})
-0:7              Constant:
-0:7                1 (const int)
-0:7            Constant:
-0:7              0 (const int)
+0:?           'input[1].f' (layout( location=2) in float)
 0:7        move second child to first child ( temp 4-component vector of float)
 0:7          pos: direct index for structure ( temp 4-component vector of float)
 0:7            direct index ( temp structure{ temp float f,  temp 4-component vector of float pos})
@@ -73,7 +64,7 @@
 0:7            Constant:
 0:7              1 (const int)
 0:7          direct index ( in 4-component vector of float FragCoord)
-0:?             'input_pos' ( in 3-element array of 4-component vector of float FragCoord)
+0:?             'input.pos' ( in 3-element array of 4-component vector of float FragCoord)
 0:7            Constant:
 0:7              1 (const int)
 0:7        move second child to first child ( temp float)
@@ -84,13 +75,7 @@
 0:7                2 (const int)
 0:7            Constant:
 0:7              0 (const int)
-0:7          f: direct index for structure ( temp float)
-0:7            direct index (layout( location=1) in structure{ temp float f})
-0:7              'input' (layout( location=1) in 3-element array of structure{ temp float f})
-0:7              Constant:
-0:7                2 (const int)
-0:7            Constant:
-0:7              0 (const int)
+0:?           'input[2].f' (layout( location=3) in float)
 0:7        move second child to first child ( temp 4-component vector of float)
 0:7          pos: direct index for structure ( temp 4-component vector of float)
 0:7            direct index ( temp structure{ temp float f,  temp 4-component vector of float pos})
@@ -100,7 +85,7 @@
 0:7            Constant:
 0:7              1 (const int)
 0:7          direct index ( in 4-component vector of float FragCoord)
-0:?             'input_pos' ( in 3-element array of 4-component vector of float FragCoord)
+0:?             'input.pos' ( in 3-element array of 4-component vector of float FragCoord)
 0:7            Constant:
 0:7              2 (const int)
 0:7      move second child to first child ( temp 4-component vector of float)
@@ -110,9 +95,11 @@
 0:?           'input' ( temp 3-element array of structure{ temp float f,  temp 4-component vector of float pos})
 0:?   Linker Objects
 0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
-0:?     'i' (layout( location=0) in int)
-0:?     'input' (layout( location=1) in 3-element array of structure{ temp float f})
-0:?     'input_pos' ( in 3-element array of 4-component vector of float FragCoord)
+0:?     'i' (layout( location=0) flat in int)
+0:?     'input.pos' ( in 3-element array of 4-component vector of float FragCoord)
+0:?     'input[0].f' (layout( location=1) in float)
+0:?     'input[1].f' (layout( location=2) in float)
+0:?     'input[2].f' (layout( location=3) in float)
 
 
 Linked fragment stage:
@@ -130,16 +117,19 @@
 0:9        'input' ( in 3-element array of structure{ temp float f,  temp 4-component vector of float pos})
 0:9        'a' ( temp 3-element array of structure{ temp float f,  temp 4-component vector of float pos})
 0:11      Branch: Return with expression
-0:11        Constant:
-0:11          1.000000
-0:11          1.000000
-0:11          1.000000
+0:11        pos: direct index for structure ( temp 4-component vector of float)
+0:11          direct index ( temp structure{ temp float f,  temp 4-component vector of float pos})
+0:11            'a' ( temp 3-element array of structure{ temp float f,  temp 4-component vector of float pos})
+0:11            Constant:
+0:11              1 (const int)
+0:11          Constant:
+0:11            1 (const int)
 0:7  Function Definition: main( ( temp void)
 0:7    Function Parameters: 
 0:?     Sequence
 0:7      move second child to first child ( temp int)
 0:?         'i' ( temp int)
-0:?         'i' (layout( location=0) in int)
+0:?         'i' (layout( location=0) flat in int)
 0:7      Sequence
 0:7        move second child to first child ( temp float)
 0:7          f: direct index for structure ( temp float)
@@ -149,13 +139,7 @@
 0:7                0 (const int)
 0:7            Constant:
 0:7              0 (const int)
-0:7          f: direct index for structure ( temp float)
-0:7            direct index (layout( location=1) in structure{ temp float f})
-0:7              'input' (layout( location=1) in 3-element array of structure{ temp float f})
-0:7              Constant:
-0:7                0 (const int)
-0:7            Constant:
-0:7              0 (const int)
+0:?           'input[0].f' (layout( location=1) in float)
 0:7        move second child to first child ( temp 4-component vector of float)
 0:7          pos: direct index for structure ( temp 4-component vector of float)
 0:7            direct index ( temp structure{ temp float f,  temp 4-component vector of float pos})
@@ -165,7 +149,7 @@
 0:7            Constant:
 0:7              1 (const int)
 0:7          direct index ( in 4-component vector of float FragCoord)
-0:?             'input_pos' ( in 3-element array of 4-component vector of float FragCoord)
+0:?             'input.pos' ( in 3-element array of 4-component vector of float FragCoord)
 0:7            Constant:
 0:7              0 (const int)
 0:7        move second child to first child ( temp float)
@@ -176,13 +160,7 @@
 0:7                1 (const int)
 0:7            Constant:
 0:7              0 (const int)
-0:7          f: direct index for structure ( temp float)
-0:7            direct index (layout( location=1) in structure{ temp float f})
-0:7              'input' (layout( location=1) in 3-element array of structure{ temp float f})
-0:7              Constant:
-0:7                1 (const int)
-0:7            Constant:
-0:7              0 (const int)
+0:?           'input[1].f' (layout( location=2) in float)
 0:7        move second child to first child ( temp 4-component vector of float)
 0:7          pos: direct index for structure ( temp 4-component vector of float)
 0:7            direct index ( temp structure{ temp float f,  temp 4-component vector of float pos})
@@ -192,7 +170,7 @@
 0:7            Constant:
 0:7              1 (const int)
 0:7          direct index ( in 4-component vector of float FragCoord)
-0:?             'input_pos' ( in 3-element array of 4-component vector of float FragCoord)
+0:?             'input.pos' ( in 3-element array of 4-component vector of float FragCoord)
 0:7            Constant:
 0:7              1 (const int)
 0:7        move second child to first child ( temp float)
@@ -203,13 +181,7 @@
 0:7                2 (const int)
 0:7            Constant:
 0:7              0 (const int)
-0:7          f: direct index for structure ( temp float)
-0:7            direct index (layout( location=1) in structure{ temp float f})
-0:7              'input' (layout( location=1) in 3-element array of structure{ temp float f})
-0:7              Constant:
-0:7                2 (const int)
-0:7            Constant:
-0:7              0 (const int)
+0:?           'input[2].f' (layout( location=3) in float)
 0:7        move second child to first child ( temp 4-component vector of float)
 0:7          pos: direct index for structure ( temp 4-component vector of float)
 0:7            direct index ( temp structure{ temp float f,  temp 4-component vector of float pos})
@@ -219,7 +191,7 @@
 0:7            Constant:
 0:7              1 (const int)
 0:7          direct index ( in 4-component vector of float FragCoord)
-0:?             'input_pos' ( in 3-element array of 4-component vector of float FragCoord)
+0:?             'input.pos' ( in 3-element array of 4-component vector of float FragCoord)
 0:7            Constant:
 0:7              2 (const int)
 0:7      move second child to first child ( temp 4-component vector of float)
@@ -229,18 +201,24 @@
 0:?           'input' ( temp 3-element array of structure{ temp float f,  temp 4-component vector of float pos})
 0:?   Linker Objects
 0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
-0:?     'i' (layout( location=0) in int)
-0:?     'input' (layout( location=1) in 3-element array of structure{ temp float f})
-0:?     'input_pos' ( in 3-element array of 4-component vector of float FragCoord)
+0:?     'i' (layout( location=0) flat in int)
+0:?     'input.pos' ( in 3-element array of 4-component vector of float FragCoord)
+0:?     'input[0].f' (layout( location=1) in float)
+0:?     'input[1].f' (layout( location=2) in float)
+0:?     'input[2].f' (layout( location=3) in float)
+
+error: SPIRV-Tools Validation Errors
+error: According to the Vulkan spec BuiltIn FragCoord variable needs to be a 4-component 32-bit float vector. ID <41> (OpVariable) is not a float vector.
+  %input_pos = OpVariable %_ptr_Input__arr_v4float_uint_3 Input
 
 // Module Version 10000
-// Generated by (magic number): 80001
-// Id's are bound by 73
+// Generated by (magic number): 80007
+// Id's are bound by 66
 
                               Capability Shader
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "main" 32 39 48 67
+                              EntryPoint Fragment 4  "main" 30 35 41 46 53 60
                               ExecutionMode 4 OriginUpperLeft
                               Source HLSL 500
                               Name 4  "main"
@@ -251,20 +229,23 @@
                               Name 16  "i"
                               Name 17  "input"
                               Name 20  "a"
+                              Name 28  "i"
                               Name 30  "i"
-                              Name 32  "i"
-                              Name 34  "input"
-                              Name 36  "S"
-                              MemberName 36(S) 0  "f"
-                              Name 39  "input"
-                              Name 48  "input_pos"
-                              Name 67  "@entryPointOutput"
-                              Name 68  "param"
-                              Name 70  "param"
-                              Decorate 32(i) Location 0
-                              Decorate 39(input) Location 1
-                              Decorate 48(input_pos) BuiltIn FragCoord
-                              Decorate 67(@entryPointOutput) Location 0
+                              Name 32  "input"
+                              Name 35  "input[0].f"
+                              Name 41  "input.pos"
+                              Name 46  "input[1].f"
+                              Name 53  "input[2].f"
+                              Name 60  "@entryPointOutput"
+                              Name 61  "param"
+                              Name 63  "param"
+                              Decorate 30(i) Flat
+                              Decorate 30(i) Location 0
+                              Decorate 35(input[0].f) Location 1
+                              Decorate 41(input.pos) BuiltIn FragCoord
+                              Decorate 46(input[1].f) Location 2
+                              Decorate 53(input[2].f) Location 3
+                              Decorate 60(@entryPointOutput) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 32 1
@@ -277,65 +258,58 @@
               13:             TypeArray 10(S) 12
               14:             TypePointer Function 13
               15:             TypeFunction 9(fvec4) 7(ptr) 14(ptr)
-              22:             TypeVector 8(float) 3
-              23:    8(float) Constant 1065353216
-              24:   22(fvec3) ConstantComposite 23 23 23
-              25:             TypePointer Function 9(fvec4)
-              31:             TypePointer Input 6(int)
-           32(i):     31(ptr) Variable Input
-              35:      6(int) Constant 0
-           36(S):             TypeStruct 8(float)
-              37:             TypeArray 36(S) 12
-              38:             TypePointer Input 37
-       39(input):     38(ptr) Variable Input
-              40:             TypePointer Input 8(float)
-              43:             TypePointer Function 8(float)
-              45:      6(int) Constant 1
-              46:             TypeArray 9(fvec4) 12
-              47:             TypePointer Input 46
-   48(input_pos):     47(ptr) Variable Input
-              49:             TypePointer Input 9(fvec4)
-              59:      6(int) Constant 2
-              66:             TypePointer Output 9(fvec4)
-67(@entryPointOutput):     66(ptr) Variable Output
+              22:      6(int) Constant 1
+              23:             TypePointer Function 9(fvec4)
+              29:             TypePointer Input 6(int)
+           30(i):     29(ptr) Variable Input
+              33:      6(int) Constant 0
+              34:             TypePointer Input 8(float)
+  35(input[0].f):     34(ptr) Variable Input
+              37:             TypePointer Function 8(float)
+              39:             TypeArray 9(fvec4) 12
+              40:             TypePointer Input 39
+   41(input.pos):     40(ptr) Variable Input
+              42:             TypePointer Input 9(fvec4)
+  46(input[1].f):     34(ptr) Variable Input
+              52:      6(int) Constant 2
+  53(input[2].f):     34(ptr) Variable Input
+              59:             TypePointer Output 9(fvec4)
+60(@entryPointOutput):     59(ptr) Variable Output
          4(main):           2 Function None 3
                5:             Label
-           30(i):      7(ptr) Variable Function
-       34(input):     14(ptr) Variable Function
-       68(param):      7(ptr) Variable Function
-       70(param):     14(ptr) Variable Function
-              33:      6(int) Load 32(i)
-                              Store 30(i) 33
-              41:     40(ptr) AccessChain 39(input) 35 35
-              42:    8(float) Load 41
-              44:     43(ptr) AccessChain 34(input) 35 35
-                              Store 44 42
-              50:     49(ptr) AccessChain 48(input_pos) 35
-              51:    9(fvec4) Load 50
-              52:     25(ptr) AccessChain 34(input) 35 45
-                              Store 52 51
-              53:     40(ptr) AccessChain 39(input) 45 35
-              54:    8(float) Load 53
-              55:     43(ptr) AccessChain 34(input) 45 35
+           28(i):      7(ptr) Variable Function
+       32(input):     14(ptr) Variable Function
+       61(param):      7(ptr) Variable Function
+       63(param):     14(ptr) Variable Function
+              31:      6(int) Load 30(i)
+                              Store 28(i) 31
+              36:    8(float) Load 35(input[0].f)
+              38:     37(ptr) AccessChain 32(input) 33 33
+                              Store 38 36
+              43:     42(ptr) AccessChain 41(input.pos) 33
+              44:    9(fvec4) Load 43
+              45:     23(ptr) AccessChain 32(input) 33 22
+                              Store 45 44
+              47:    8(float) Load 46(input[1].f)
+              48:     37(ptr) AccessChain 32(input) 22 33
+                              Store 48 47
+              49:     42(ptr) AccessChain 41(input.pos) 22
+              50:    9(fvec4) Load 49
+              51:     23(ptr) AccessChain 32(input) 22 22
+                              Store 51 50
+              54:    8(float) Load 53(input[2].f)
+              55:     37(ptr) AccessChain 32(input) 52 33
                               Store 55 54
-              56:     49(ptr) AccessChain 48(input_pos) 45
+              56:     42(ptr) AccessChain 41(input.pos) 52
               57:    9(fvec4) Load 56
-              58:     25(ptr) AccessChain 34(input) 45 45
+              58:     23(ptr) AccessChain 32(input) 52 22
                               Store 58 57
-              60:     40(ptr) AccessChain 39(input) 59 35
-              61:    8(float) Load 60
-              62:     43(ptr) AccessChain 34(input) 59 35
-                              Store 62 61
-              63:     49(ptr) AccessChain 48(input_pos) 59
-              64:    9(fvec4) Load 63
-              65:     25(ptr) AccessChain 34(input) 59 45
-                              Store 65 64
-              69:      6(int) Load 30(i)
-                              Store 68(param) 69
-              71:          13 Load 34(input)
-                              Store 70(param) 71
-              72:    9(fvec4) FunctionCall 18(@main(i1;struct-S-f1-vf41[3];) 68(param) 70(param)
-                              Store 67(@entryPointOutput) 72
+              62:      6(int) Load 28(i)
+                              Store 61(param) 62
+              64:          13 Load 32(input)
+                              Store 63(param) 64
+              65:    9(fvec4) FunctionCall 18(@main(i1;struct-S-f1-vf41[3];) 61(param) 63(param)
+                              Store 60(@entryPointOutput) 65
                               Return
                               FunctionEnd
 18(@main(i1;struct-S-f1-vf41[3];):    9(fvec4) Function None 15
@@ -343,10 +317,9 @@
        17(input):     14(ptr) FunctionParameter
               19:             Label
            20(a):     14(ptr) Variable Function
-              26:     25(ptr) Variable Function
               21:          13 Load 20(a)
                               Store 17(input) 21
-                              Store 26 24
-              27:    9(fvec4) Load 26
-                              ReturnValue 27
+              24:     23(ptr) AccessChain 20(a) 22 22
+              25:    9(fvec4) Load 24
+                              ReturnValue 25
                               FunctionEnd
diff --git a/Test/baseResults/hlsl.struct.split.call.vert.out b/Test/baseResults/hlsl.struct.split.call.vert.out
index 647f9b4..50d1d2b 100644
--- a/Test/baseResults/hlsl.struct.split.call.vert.out
+++ b/Test/baseResults/hlsl.struct.split.call.vert.out
@@ -60,53 +60,49 @@
 0:?             'vsin' ( temp structure{ temp int x0_in,  temp 4-component vector of float Pos_in,  temp int x1_in})
 0:22            Constant:
 0:22              0 (const int)
-0:?           'x0_in' (layout( location=0) in int)
+0:?           'vsin.x0_in' (layout( location=0) in int)
 0:22        move second child to first child ( temp 4-component vector of float)
 0:22          Pos_in: direct index for structure ( temp 4-component vector of float)
 0:?             'vsin' ( temp structure{ temp int x0_in,  temp 4-component vector of float Pos_in,  temp int x1_in})
 0:22            Constant:
 0:22              1 (const int)
-0:?           'Pos_in' (layout( location=1) in 4-component vector of float)
+0:?           'vsin.Pos_in' (layout( location=1) in 4-component vector of float)
 0:22        move second child to first child ( temp int)
 0:22          x1_in: direct index for structure ( temp int)
 0:?             'vsin' ( temp structure{ temp int x0_in,  temp 4-component vector of float Pos_in,  temp int x1_in})
 0:22            Constant:
 0:22              2 (const int)
-0:?           'x1_in' (layout( location=2) in int)
+0:?           'vsin.x1_in' (layout( location=2) in int)
 0:22      Sequence
 0:22        move second child to first child ( temp structure{ temp int x0_out,  temp 4-component vector of float Pos_out,  temp int x1_out})
 0:22          'flattenTemp' ( temp structure{ temp int x0_out,  temp 4-component vector of float Pos_out,  temp int x1_out})
 0:22          Function Call: @main(struct-VS_INPUT-i1-vf4-i11; ( temp structure{ temp int x0_out,  temp 4-component vector of float Pos_out,  temp int x1_out})
 0:?             'vsin' ( temp structure{ temp int x0_in,  temp 4-component vector of float Pos_in,  temp int x1_in})
 0:22        move second child to first child ( temp int)
-0:22          x0_out: direct index for structure ( temp int)
-0:22            '@entryPointOutput' (layout( location=0) out structure{ temp int x0_out,  temp int x1_out})
-0:22            Constant:
-0:22              0 (const int)
+0:?           '@entryPointOutput.x0_out' (layout( location=0) out int)
 0:22          x0_out: direct index for structure ( temp int)
 0:22            'flattenTemp' ( temp structure{ temp int x0_out,  temp 4-component vector of float Pos_out,  temp int x1_out})
 0:22            Constant:
 0:22              0 (const int)
 0:22        move second child to first child ( temp 4-component vector of float)
-0:?           '@entryPointOutput_Pos_out' ( out 4-component vector of float Position)
+0:?           '@entryPointOutput.Pos_out' ( out 4-component vector of float Position)
 0:22          Pos_out: direct index for structure ( temp 4-component vector of float)
 0:22            'flattenTemp' ( temp structure{ temp int x0_out,  temp 4-component vector of float Pos_out,  temp int x1_out})
 0:22            Constant:
 0:22              1 (const int)
 0:22        move second child to first child ( temp int)
-0:22          x1_out: direct index for structure ( temp int)
-0:22            '@entryPointOutput' (layout( location=0) out structure{ temp int x0_out,  temp int x1_out})
-0:22            Constant:
-0:22              1 (const int)
+0:?           '@entryPointOutput.x1_out' (layout( location=1) out int)
 0:22          x1_out: direct index for structure ( temp int)
 0:22            'flattenTemp' ( temp structure{ temp int x0_out,  temp 4-component vector of float Pos_out,  temp int x1_out})
 0:22            Constant:
 0:22              2 (const int)
 0:?   Linker Objects
-0:?     '@entryPointOutput' (layout( location=0) out structure{ temp int x0_out,  temp int x1_out})
-0:?     'x0_in' (layout( location=0) in int)
-0:?     'Pos_in' (layout( location=1) in 4-component vector of float)
-0:?     'x1_in' (layout( location=2) in int)
+0:?     '@entryPointOutput.Pos_out' ( out 4-component vector of float Position)
+0:?     '@entryPointOutput.x0_out' (layout( location=0) out int)
+0:?     '@entryPointOutput.x1_out' (layout( location=1) out int)
+0:?     'vsin.x0_in' (layout( location=0) in int)
+0:?     'vsin.Pos_in' (layout( location=1) in 4-component vector of float)
+0:?     'vsin.x1_in' (layout( location=2) in int)
 
 
 Linked vertex stage:
@@ -173,62 +169,58 @@
 0:?             'vsin' ( temp structure{ temp int x0_in,  temp 4-component vector of float Pos_in,  temp int x1_in})
 0:22            Constant:
 0:22              0 (const int)
-0:?           'x0_in' (layout( location=0) in int)
+0:?           'vsin.x0_in' (layout( location=0) in int)
 0:22        move second child to first child ( temp 4-component vector of float)
 0:22          Pos_in: direct index for structure ( temp 4-component vector of float)
 0:?             'vsin' ( temp structure{ temp int x0_in,  temp 4-component vector of float Pos_in,  temp int x1_in})
 0:22            Constant:
 0:22              1 (const int)
-0:?           'Pos_in' (layout( location=1) in 4-component vector of float)
+0:?           'vsin.Pos_in' (layout( location=1) in 4-component vector of float)
 0:22        move second child to first child ( temp int)
 0:22          x1_in: direct index for structure ( temp int)
 0:?             'vsin' ( temp structure{ temp int x0_in,  temp 4-component vector of float Pos_in,  temp int x1_in})
 0:22            Constant:
 0:22              2 (const int)
-0:?           'x1_in' (layout( location=2) in int)
+0:?           'vsin.x1_in' (layout( location=2) in int)
 0:22      Sequence
 0:22        move second child to first child ( temp structure{ temp int x0_out,  temp 4-component vector of float Pos_out,  temp int x1_out})
 0:22          'flattenTemp' ( temp structure{ temp int x0_out,  temp 4-component vector of float Pos_out,  temp int x1_out})
 0:22          Function Call: @main(struct-VS_INPUT-i1-vf4-i11; ( temp structure{ temp int x0_out,  temp 4-component vector of float Pos_out,  temp int x1_out})
 0:?             'vsin' ( temp structure{ temp int x0_in,  temp 4-component vector of float Pos_in,  temp int x1_in})
 0:22        move second child to first child ( temp int)
-0:22          x0_out: direct index for structure ( temp int)
-0:22            '@entryPointOutput' (layout( location=0) out structure{ temp int x0_out,  temp int x1_out})
-0:22            Constant:
-0:22              0 (const int)
+0:?           '@entryPointOutput.x0_out' (layout( location=0) out int)
 0:22          x0_out: direct index for structure ( temp int)
 0:22            'flattenTemp' ( temp structure{ temp int x0_out,  temp 4-component vector of float Pos_out,  temp int x1_out})
 0:22            Constant:
 0:22              0 (const int)
 0:22        move second child to first child ( temp 4-component vector of float)
-0:?           '@entryPointOutput_Pos_out' ( out 4-component vector of float Position)
+0:?           '@entryPointOutput.Pos_out' ( out 4-component vector of float Position)
 0:22          Pos_out: direct index for structure ( temp 4-component vector of float)
 0:22            'flattenTemp' ( temp structure{ temp int x0_out,  temp 4-component vector of float Pos_out,  temp int x1_out})
 0:22            Constant:
 0:22              1 (const int)
 0:22        move second child to first child ( temp int)
-0:22          x1_out: direct index for structure ( temp int)
-0:22            '@entryPointOutput' (layout( location=0) out structure{ temp int x0_out,  temp int x1_out})
-0:22            Constant:
-0:22              1 (const int)
+0:?           '@entryPointOutput.x1_out' (layout( location=1) out int)
 0:22          x1_out: direct index for structure ( temp int)
 0:22            'flattenTemp' ( temp structure{ temp int x0_out,  temp 4-component vector of float Pos_out,  temp int x1_out})
 0:22            Constant:
 0:22              2 (const int)
 0:?   Linker Objects
-0:?     '@entryPointOutput' (layout( location=0) out structure{ temp int x0_out,  temp int x1_out})
-0:?     'x0_in' (layout( location=0) in int)
-0:?     'Pos_in' (layout( location=1) in 4-component vector of float)
-0:?     'x1_in' (layout( location=2) in int)
+0:?     '@entryPointOutput.Pos_out' ( out 4-component vector of float Position)
+0:?     '@entryPointOutput.x0_out' (layout( location=0) out int)
+0:?     '@entryPointOutput.x1_out' (layout( location=1) out int)
+0:?     'vsin.x0_in' (layout( location=0) in int)
+0:?     'vsin.Pos_in' (layout( location=1) in 4-component vector of float)
+0:?     'vsin.x1_in' (layout( location=2) in int)
 
 // Module Version 10000
-// Generated by (magic number): 80001
-// Id's are bound by 80
+// Generated by (magic number): 80007
+// Id's are bound by 77
 
                               Capability Shader
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Vertex 4  "main" 52 56 59 68 74
+                              EntryPoint Vertex 4  "main" 52 56 59 67 71 74
                               Source HLSL 500
                               Name 4  "main"
                               Name 9  "VS_INPUT"
@@ -248,21 +240,20 @@
                               Name 42  "param"
                               Name 44  "param"
                               Name 50  "vsin"
-                              Name 52  "x0_in"
-                              Name 56  "Pos_in"
-                              Name 59  "x1_in"
+                              Name 52  "vsin.x0_in"
+                              Name 56  "vsin.Pos_in"
+                              Name 59  "vsin.x1_in"
                               Name 62  "flattenTemp"
                               Name 63  "param"
-                              Name 66  "VS_OUTPUT"
-                              MemberName 66(VS_OUTPUT) 0  "x0_out"
-                              MemberName 66(VS_OUTPUT) 1  "x1_out"
-                              Name 68  "@entryPointOutput"
-                              Name 74  "@entryPointOutput_Pos_out"
-                              Decorate 52(x0_in) Location 0
-                              Decorate 56(Pos_in) Location 1
-                              Decorate 59(x1_in) Location 2
-                              Decorate 68(@entryPointOutput) Location 0
-                              Decorate 74(@entryPointOutput_Pos_out) BuiltIn Position
+                              Name 67  "@entryPointOutput.x0_out"
+                              Name 71  "@entryPointOutput.Pos_out"
+                              Name 74  "@entryPointOutput.x1_out"
+                              Decorate 52(vsin.x0_in) Location 0
+                              Decorate 56(vsin.Pos_in) Location 1
+                              Decorate 59(vsin.x1_in) Location 2
+                              Decorate 67(@entryPointOutput.x0_out) Location 0
+                              Decorate 71(@entryPointOutput.Pos_out) BuiltIn Position
+                              Decorate 74(@entryPointOutput.x1_out) Location 1
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 32 1
@@ -280,45 +271,42 @@
               31:             TypePointer Function 6(int)
               38:      6(int) Constant 2
               51:             TypePointer Input 6(int)
-       52(x0_in):     51(ptr) Variable Input
+  52(vsin.x0_in):     51(ptr) Variable Input
               55:             TypePointer Input 8(fvec4)
-      56(Pos_in):     55(ptr) Variable Input
-       59(x1_in):     51(ptr) Variable Input
-   66(VS_OUTPUT):             TypeStruct 6(int) 6(int)
-              67:             TypePointer Output 66(VS_OUTPUT)
-68(@entryPointOutput):     67(ptr) Variable Output
-              71:             TypePointer Output 6(int)
-              73:             TypePointer Output 8(fvec4)
-74(@entryPointOutput_Pos_out):     73(ptr) Variable Output
+ 56(vsin.Pos_in):     55(ptr) Variable Input
+  59(vsin.x1_in):     51(ptr) Variable Input
+              66:             TypePointer Output 6(int)
+67(@entryPointOutput.x0_out):     66(ptr) Variable Output
+              70:             TypePointer Output 8(fvec4)
+71(@entryPointOutput.Pos_out):     70(ptr) Variable Output
+74(@entryPointOutput.x1_out):     66(ptr) Variable Output
          4(main):           2 Function None 3
                5:             Label
         50(vsin):     10(ptr) Variable Function
  62(flattenTemp):     12(ptr) Variable Function
        63(param):     10(ptr) Variable Function
-              53:      6(int) Load 52(x0_in)
+              53:      6(int) Load 52(vsin.x0_in)
               54:     31(ptr) AccessChain 50(vsin) 30
                               Store 54 53
-              57:    8(fvec4) Load 56(Pos_in)
+              57:    8(fvec4) Load 56(vsin.Pos_in)
               58:     23(ptr) AccessChain 50(vsin) 22
                               Store 58 57
-              60:      6(int) Load 59(x1_in)
+              60:      6(int) Load 59(vsin.x1_in)
               61:     31(ptr) AccessChain 50(vsin) 38
                               Store 61 60
               64: 9(VS_INPUT) Load 50(vsin)
                               Store 63(param) 64
               65:11(VS_OUTPUT) FunctionCall 20(@main(struct-VS_INPUT-i1-vf4-i11;) 63(param)
                               Store 62(flattenTemp) 65
-              69:     31(ptr) AccessChain 62(flattenTemp) 30
-              70:      6(int) Load 69
-              72:     71(ptr) AccessChain 68(@entryPointOutput) 30
-                              Store 72 70
-              75:     23(ptr) AccessChain 62(flattenTemp) 22
-              76:    8(fvec4) Load 75
-                              Store 74(@entryPointOutput_Pos_out) 76
-              77:     31(ptr) AccessChain 62(flattenTemp) 38
-              78:      6(int) Load 77
-              79:     71(ptr) AccessChain 68(@entryPointOutput) 22
-                              Store 79 78
+              68:     31(ptr) AccessChain 62(flattenTemp) 30
+              69:      6(int) Load 68
+                              Store 67(@entryPointOutput.x0_out) 69
+              72:     23(ptr) AccessChain 62(flattenTemp) 22
+              73:    8(fvec4) Load 72
+                              Store 71(@entryPointOutput.Pos_out) 73
+              75:     31(ptr) AccessChain 62(flattenTemp) 38
+              76:      6(int) Load 75
+                              Store 74(@entryPointOutput.x1_out) 76
                               Return
                               FunctionEnd
 16(Fn1(struct-VS_INPUT-i1-vf4-i11;struct-VS_OUTPUT-i1-vf4-i11;):           2 Function None 13
diff --git a/Test/baseResults/hlsl.struct.split.nested.geom.out b/Test/baseResults/hlsl.struct.split.nested.geom.out
index 2f010f5..7a72a3f 100644
--- a/Test/baseResults/hlsl.struct.split.nested.geom.out
+++ b/Test/baseResults/hlsl.struct.split.nested.geom.out
@@ -34,42 +34,96 @@
 0:?         Constant:
 0:?           5.000000
 0:?           6.000000
-0:30      Sequence
-0:30        Sequence
-0:30          move second child to first child ( temp 4-component vector of float)
-0:?             'ts_psIn_pos' ( out 4-component vector of float Position)
-0:30            pos: direct index for structure ( temp 4-component vector of float)
-0:30              psIn: direct index for structure ( temp structure{ temp 4-component vector of float pos,  temp 2-component vector of float tc})
-0:30                'o' ( temp structure{ temp structure{ temp 4-component vector of float pos,  temp 2-component vector of float tc} psIn,  temp structure{ temp 2-element array of float m0_array,  temp int m1} contains_no_builtin_io})
-0:30                Constant:
-0:30                  0 (const int)
-0:30              Constant:
-0:30                0 (const int)
-0:30          move second child to first child ( temp 2-component vector of float)
-0:30            tc: direct index for structure ( temp 2-component vector of float)
-0:30              psIn: direct index for structure ( temp structure{ temp 2-component vector of float tc})
-0:30                'ts' (layout( location=0) out structure{ temp structure{ temp 2-component vector of float tc} psIn,  temp structure{ temp 2-element array of float m0_array,  temp int m1} contains_no_builtin_io})
-0:30                Constant:
-0:30                  0 (const int)
-0:30              Constant:
-0:30                0 (const int)
-0:30            tc: direct index for structure ( temp 2-component vector of float)
-0:30              psIn: direct index for structure ( temp structure{ temp 4-component vector of float pos,  temp 2-component vector of float tc})
-0:30                'o' ( temp structure{ temp structure{ temp 4-component vector of float pos,  temp 2-component vector of float tc} psIn,  temp structure{ temp 2-element array of float m0_array,  temp int m1} contains_no_builtin_io})
-0:30                Constant:
-0:30                  0 (const int)
-0:30              Constant:
-0:30                1 (const int)
-0:30          move second child to first child ( temp structure{ temp 2-element array of float m0_array,  temp int m1})
-0:30            contains_no_builtin_io: direct index for structure ( temp structure{ temp 2-element array of float m0_array,  temp int m1})
-0:30              'ts' (layout( location=0) out structure{ temp structure{ temp 2-component vector of float tc} psIn,  temp structure{ temp 2-element array of float m0_array,  temp int m1} contains_no_builtin_io})
-0:30              Constant:
-0:30                1 (const int)
+0:29      move second child to first child ( temp float)
+0:29        direct index ( temp float)
+0:29          m0_array: direct index for structure ( temp 2-element array of float)
+0:29            contains_no_builtin_io: direct index for structure ( temp structure{ temp 2-element array of float m0_array,  temp int m1})
+0:29              'o' ( temp structure{ temp structure{ temp 4-component vector of float pos,  temp 2-component vector of float tc} psIn,  temp structure{ temp 2-element array of float m0_array,  temp int m1} contains_no_builtin_io})
+0:29              Constant:
+0:29                1 (const int)
+0:29            Constant:
+0:29              0 (const int)
+0:29          Constant:
+0:29            0 (const int)
+0:29        Constant:
+0:29          2.300000
+0:30      move second child to first child ( temp float)
+0:30        direct index ( temp float)
+0:30          m0_array: direct index for structure ( temp 2-element array of float)
 0:30            contains_no_builtin_io: direct index for structure ( temp structure{ temp 2-element array of float m0_array,  temp int m1})
 0:30              'o' ( temp structure{ temp structure{ temp 4-component vector of float pos,  temp 2-component vector of float tc} psIn,  temp structure{ temp 2-element array of float m0_array,  temp int m1} contains_no_builtin_io})
 0:30              Constant:
 0:30                1 (const int)
-0:30        EmitVertex ( temp void)
+0:30            Constant:
+0:30              0 (const int)
+0:30          Constant:
+0:30            1 (const int)
+0:30        Constant:
+0:30          2.300000
+0:31      move second child to first child ( temp int)
+0:31        m1: direct index for structure ( temp int)
+0:31          contains_no_builtin_io: direct index for structure ( temp structure{ temp 2-element array of float m0_array,  temp int m1})
+0:31            'o' ( temp structure{ temp structure{ temp 4-component vector of float pos,  temp 2-component vector of float tc} psIn,  temp structure{ temp 2-element array of float m0_array,  temp int m1} contains_no_builtin_io})
+0:31            Constant:
+0:31              1 (const int)
+0:31          Constant:
+0:31            1 (const int)
+0:31        Constant:
+0:31          2 (const int)
+0:33      Sequence
+0:33        Sequence
+0:33          move second child to first child ( temp 4-component vector of float)
+0:?             'ts.pos' ( out 4-component vector of float Position)
+0:33            pos: direct index for structure ( temp 4-component vector of float)
+0:33              psIn: direct index for structure ( temp structure{ temp 4-component vector of float pos,  temp 2-component vector of float tc})
+0:33                'o' ( temp structure{ temp structure{ temp 4-component vector of float pos,  temp 2-component vector of float tc} psIn,  temp structure{ temp 2-element array of float m0_array,  temp int m1} contains_no_builtin_io})
+0:33                Constant:
+0:33                  0 (const int)
+0:33              Constant:
+0:33                0 (const int)
+0:33          move second child to first child ( temp 2-component vector of float)
+0:?             'ts.psIn.tc' (layout( location=0) out 2-component vector of float)
+0:33            tc: direct index for structure ( temp 2-component vector of float)
+0:33              psIn: direct index for structure ( temp structure{ temp 4-component vector of float pos,  temp 2-component vector of float tc})
+0:33                'o' ( temp structure{ temp structure{ temp 4-component vector of float pos,  temp 2-component vector of float tc} psIn,  temp structure{ temp 2-element array of float m0_array,  temp int m1} contains_no_builtin_io})
+0:33                Constant:
+0:33                  0 (const int)
+0:33              Constant:
+0:33                1 (const int)
+0:33          move second child to first child ( temp float)
+0:?             'ts.contains_no_builtin_io.m0_array[0]' (layout( location=1) out float)
+0:33            direct index ( temp float)
+0:33              m0_array: direct index for structure ( temp 2-element array of float)
+0:33                contains_no_builtin_io: direct index for structure ( temp structure{ temp 2-element array of float m0_array,  temp int m1})
+0:33                  'o' ( temp structure{ temp structure{ temp 4-component vector of float pos,  temp 2-component vector of float tc} psIn,  temp structure{ temp 2-element array of float m0_array,  temp int m1} contains_no_builtin_io})
+0:33                  Constant:
+0:33                    1 (const int)
+0:33                Constant:
+0:33                  0 (const int)
+0:33              Constant:
+0:33                0 (const int)
+0:33          move second child to first child ( temp float)
+0:?             'ts.contains_no_builtin_io.m0_array[1]' (layout( location=2) out float)
+0:33            direct index ( temp float)
+0:33              m0_array: direct index for structure ( temp 2-element array of float)
+0:33                contains_no_builtin_io: direct index for structure ( temp structure{ temp 2-element array of float m0_array,  temp int m1})
+0:33                  'o' ( temp structure{ temp structure{ temp 4-component vector of float pos,  temp 2-component vector of float tc} psIn,  temp structure{ temp 2-element array of float m0_array,  temp int m1} contains_no_builtin_io})
+0:33                  Constant:
+0:33                    1 (const int)
+0:33                Constant:
+0:33                  0 (const int)
+0:33              Constant:
+0:33                1 (const int)
+0:33          move second child to first child ( temp int)
+0:?             'ts.contains_no_builtin_io.m1' (layout( location=3) out int)
+0:33            m1: direct index for structure ( temp int)
+0:33              contains_no_builtin_io: direct index for structure ( temp structure{ temp 2-element array of float m0_array,  temp int m1})
+0:33                'o' ( temp structure{ temp structure{ temp 4-component vector of float pos,  temp 2-component vector of float tc} psIn,  temp structure{ temp 2-element array of float m0_array,  temp int m1} contains_no_builtin_io})
+0:33                Constant:
+0:33                  1 (const int)
+0:33              Constant:
+0:33                1 (const int)
+0:33        EmitVertex ( temp void)
 0:24  Function Definition: main( ( temp void)
 0:24    Function Parameters: 
 0:?     Sequence
@@ -83,7 +137,7 @@
 0:24            Constant:
 0:24              0 (const int)
 0:24          direct index ( in 4-component vector of float Position)
-0:?             'tin_pos' ( in 3-element array of 4-component vector of float Position)
+0:?             'tin.pos' ( in 3-element array of 4-component vector of float Position)
 0:24            Constant:
 0:24              0 (const int)
 0:24        move second child to first child ( temp 2-component vector of float)
@@ -110,7 +164,7 @@
 0:24            Constant:
 0:24              0 (const int)
 0:24          direct index ( in 4-component vector of float Position)
-0:?             'tin_pos' ( in 3-element array of 4-component vector of float Position)
+0:?             'tin.pos' ( in 3-element array of 4-component vector of float Position)
 0:24            Constant:
 0:24              1 (const int)
 0:24        move second child to first child ( temp 2-component vector of float)
@@ -137,7 +191,7 @@
 0:24            Constant:
 0:24              0 (const int)
 0:24          direct index ( in 4-component vector of float Position)
-0:?             'tin_pos' ( in 3-element array of 4-component vector of float Position)
+0:?             'tin.pos' ( in 3-element array of 4-component vector of float Position)
 0:24            Constant:
 0:24              2 (const int)
 0:24        move second child to first child ( temp 2-component vector of float)
@@ -159,8 +213,13 @@
 0:?         'tin' ( temp 3-element array of structure{ temp 4-component vector of float pos,  temp 2-component vector of float tc})
 0:?         'ts' ( temp structure{ temp structure{ temp 4-component vector of float pos,  temp 2-component vector of float tc} psIn,  temp structure{ temp 2-element array of float m0_array,  temp int m1} contains_no_builtin_io})
 0:?   Linker Objects
+0:?     'tin.pos' ( in 3-element array of 4-component vector of float Position)
 0:?     'tin' (layout( location=0) in 3-element array of structure{ temp 2-component vector of float tc})
-0:?     'ts' (layout( location=0) out structure{ temp structure{ temp 2-component vector of float tc} psIn,  temp structure{ temp 2-element array of float m0_array,  temp int m1} contains_no_builtin_io})
+0:?     'ts.pos' ( out 4-component vector of float Position)
+0:?     'ts.psIn.tc' (layout( location=0) out 2-component vector of float)
+0:?     'ts.contains_no_builtin_io.m0_array[0]' (layout( location=1) out float)
+0:?     'ts.contains_no_builtin_io.m0_array[1]' (layout( location=2) out float)
+0:?     'ts.contains_no_builtin_io.m1' (layout( location=3) out int)
 
 
 Linked geometry stage:
@@ -201,42 +260,96 @@
 0:?         Constant:
 0:?           5.000000
 0:?           6.000000
-0:30      Sequence
-0:30        Sequence
-0:30          move second child to first child ( temp 4-component vector of float)
-0:?             'ts_psIn_pos' ( out 4-component vector of float Position)
-0:30            pos: direct index for structure ( temp 4-component vector of float)
-0:30              psIn: direct index for structure ( temp structure{ temp 4-component vector of float pos,  temp 2-component vector of float tc})
-0:30                'o' ( temp structure{ temp structure{ temp 4-component vector of float pos,  temp 2-component vector of float tc} psIn,  temp structure{ temp 2-element array of float m0_array,  temp int m1} contains_no_builtin_io})
-0:30                Constant:
-0:30                  0 (const int)
-0:30              Constant:
-0:30                0 (const int)
-0:30          move second child to first child ( temp 2-component vector of float)
-0:30            tc: direct index for structure ( temp 2-component vector of float)
-0:30              psIn: direct index for structure ( temp structure{ temp 2-component vector of float tc})
-0:30                'ts' (layout( location=0) out structure{ temp structure{ temp 2-component vector of float tc} psIn,  temp structure{ temp 2-element array of float m0_array,  temp int m1} contains_no_builtin_io})
-0:30                Constant:
-0:30                  0 (const int)
-0:30              Constant:
-0:30                0 (const int)
-0:30            tc: direct index for structure ( temp 2-component vector of float)
-0:30              psIn: direct index for structure ( temp structure{ temp 4-component vector of float pos,  temp 2-component vector of float tc})
-0:30                'o' ( temp structure{ temp structure{ temp 4-component vector of float pos,  temp 2-component vector of float tc} psIn,  temp structure{ temp 2-element array of float m0_array,  temp int m1} contains_no_builtin_io})
-0:30                Constant:
-0:30                  0 (const int)
-0:30              Constant:
-0:30                1 (const int)
-0:30          move second child to first child ( temp structure{ temp 2-element array of float m0_array,  temp int m1})
-0:30            contains_no_builtin_io: direct index for structure ( temp structure{ temp 2-element array of float m0_array,  temp int m1})
-0:30              'ts' (layout( location=0) out structure{ temp structure{ temp 2-component vector of float tc} psIn,  temp structure{ temp 2-element array of float m0_array,  temp int m1} contains_no_builtin_io})
-0:30              Constant:
-0:30                1 (const int)
+0:29      move second child to first child ( temp float)
+0:29        direct index ( temp float)
+0:29          m0_array: direct index for structure ( temp 2-element array of float)
+0:29            contains_no_builtin_io: direct index for structure ( temp structure{ temp 2-element array of float m0_array,  temp int m1})
+0:29              'o' ( temp structure{ temp structure{ temp 4-component vector of float pos,  temp 2-component vector of float tc} psIn,  temp structure{ temp 2-element array of float m0_array,  temp int m1} contains_no_builtin_io})
+0:29              Constant:
+0:29                1 (const int)
+0:29            Constant:
+0:29              0 (const int)
+0:29          Constant:
+0:29            0 (const int)
+0:29        Constant:
+0:29          2.300000
+0:30      move second child to first child ( temp float)
+0:30        direct index ( temp float)
+0:30          m0_array: direct index for structure ( temp 2-element array of float)
 0:30            contains_no_builtin_io: direct index for structure ( temp structure{ temp 2-element array of float m0_array,  temp int m1})
 0:30              'o' ( temp structure{ temp structure{ temp 4-component vector of float pos,  temp 2-component vector of float tc} psIn,  temp structure{ temp 2-element array of float m0_array,  temp int m1} contains_no_builtin_io})
 0:30              Constant:
 0:30                1 (const int)
-0:30        EmitVertex ( temp void)
+0:30            Constant:
+0:30              0 (const int)
+0:30          Constant:
+0:30            1 (const int)
+0:30        Constant:
+0:30          2.300000
+0:31      move second child to first child ( temp int)
+0:31        m1: direct index for structure ( temp int)
+0:31          contains_no_builtin_io: direct index for structure ( temp structure{ temp 2-element array of float m0_array,  temp int m1})
+0:31            'o' ( temp structure{ temp structure{ temp 4-component vector of float pos,  temp 2-component vector of float tc} psIn,  temp structure{ temp 2-element array of float m0_array,  temp int m1} contains_no_builtin_io})
+0:31            Constant:
+0:31              1 (const int)
+0:31          Constant:
+0:31            1 (const int)
+0:31        Constant:
+0:31          2 (const int)
+0:33      Sequence
+0:33        Sequence
+0:33          move second child to first child ( temp 4-component vector of float)
+0:?             'ts.pos' ( out 4-component vector of float Position)
+0:33            pos: direct index for structure ( temp 4-component vector of float)
+0:33              psIn: direct index for structure ( temp structure{ temp 4-component vector of float pos,  temp 2-component vector of float tc})
+0:33                'o' ( temp structure{ temp structure{ temp 4-component vector of float pos,  temp 2-component vector of float tc} psIn,  temp structure{ temp 2-element array of float m0_array,  temp int m1} contains_no_builtin_io})
+0:33                Constant:
+0:33                  0 (const int)
+0:33              Constant:
+0:33                0 (const int)
+0:33          move second child to first child ( temp 2-component vector of float)
+0:?             'ts.psIn.tc' (layout( location=0) out 2-component vector of float)
+0:33            tc: direct index for structure ( temp 2-component vector of float)
+0:33              psIn: direct index for structure ( temp structure{ temp 4-component vector of float pos,  temp 2-component vector of float tc})
+0:33                'o' ( temp structure{ temp structure{ temp 4-component vector of float pos,  temp 2-component vector of float tc} psIn,  temp structure{ temp 2-element array of float m0_array,  temp int m1} contains_no_builtin_io})
+0:33                Constant:
+0:33                  0 (const int)
+0:33              Constant:
+0:33                1 (const int)
+0:33          move second child to first child ( temp float)
+0:?             'ts.contains_no_builtin_io.m0_array[0]' (layout( location=1) out float)
+0:33            direct index ( temp float)
+0:33              m0_array: direct index for structure ( temp 2-element array of float)
+0:33                contains_no_builtin_io: direct index for structure ( temp structure{ temp 2-element array of float m0_array,  temp int m1})
+0:33                  'o' ( temp structure{ temp structure{ temp 4-component vector of float pos,  temp 2-component vector of float tc} psIn,  temp structure{ temp 2-element array of float m0_array,  temp int m1} contains_no_builtin_io})
+0:33                  Constant:
+0:33                    1 (const int)
+0:33                Constant:
+0:33                  0 (const int)
+0:33              Constant:
+0:33                0 (const int)
+0:33          move second child to first child ( temp float)
+0:?             'ts.contains_no_builtin_io.m0_array[1]' (layout( location=2) out float)
+0:33            direct index ( temp float)
+0:33              m0_array: direct index for structure ( temp 2-element array of float)
+0:33                contains_no_builtin_io: direct index for structure ( temp structure{ temp 2-element array of float m0_array,  temp int m1})
+0:33                  'o' ( temp structure{ temp structure{ temp 4-component vector of float pos,  temp 2-component vector of float tc} psIn,  temp structure{ temp 2-element array of float m0_array,  temp int m1} contains_no_builtin_io})
+0:33                  Constant:
+0:33                    1 (const int)
+0:33                Constant:
+0:33                  0 (const int)
+0:33              Constant:
+0:33                1 (const int)
+0:33          move second child to first child ( temp int)
+0:?             'ts.contains_no_builtin_io.m1' (layout( location=3) out int)
+0:33            m1: direct index for structure ( temp int)
+0:33              contains_no_builtin_io: direct index for structure ( temp structure{ temp 2-element array of float m0_array,  temp int m1})
+0:33                'o' ( temp structure{ temp structure{ temp 4-component vector of float pos,  temp 2-component vector of float tc} psIn,  temp structure{ temp 2-element array of float m0_array,  temp int m1} contains_no_builtin_io})
+0:33                Constant:
+0:33                  1 (const int)
+0:33              Constant:
+0:33                1 (const int)
+0:33        EmitVertex ( temp void)
 0:24  Function Definition: main( ( temp void)
 0:24    Function Parameters: 
 0:?     Sequence
@@ -250,7 +363,7 @@
 0:24            Constant:
 0:24              0 (const int)
 0:24          direct index ( in 4-component vector of float Position)
-0:?             'tin_pos' ( in 3-element array of 4-component vector of float Position)
+0:?             'tin.pos' ( in 3-element array of 4-component vector of float Position)
 0:24            Constant:
 0:24              0 (const int)
 0:24        move second child to first child ( temp 2-component vector of float)
@@ -277,7 +390,7 @@
 0:24            Constant:
 0:24              0 (const int)
 0:24          direct index ( in 4-component vector of float Position)
-0:?             'tin_pos' ( in 3-element array of 4-component vector of float Position)
+0:?             'tin.pos' ( in 3-element array of 4-component vector of float Position)
 0:24            Constant:
 0:24              1 (const int)
 0:24        move second child to first child ( temp 2-component vector of float)
@@ -304,7 +417,7 @@
 0:24            Constant:
 0:24              0 (const int)
 0:24          direct index ( in 4-component vector of float Position)
-0:?             'tin_pos' ( in 3-element array of 4-component vector of float Position)
+0:?             'tin.pos' ( in 3-element array of 4-component vector of float Position)
 0:24            Constant:
 0:24              2 (const int)
 0:24        move second child to first child ( temp 2-component vector of float)
@@ -326,17 +439,22 @@
 0:?         'tin' ( temp 3-element array of structure{ temp 4-component vector of float pos,  temp 2-component vector of float tc})
 0:?         'ts' ( temp structure{ temp structure{ temp 4-component vector of float pos,  temp 2-component vector of float tc} psIn,  temp structure{ temp 2-element array of float m0_array,  temp int m1} contains_no_builtin_io})
 0:?   Linker Objects
+0:?     'tin.pos' ( in 3-element array of 4-component vector of float Position)
 0:?     'tin' (layout( location=0) in 3-element array of structure{ temp 2-component vector of float tc})
-0:?     'ts' (layout( location=0) out structure{ temp structure{ temp 2-component vector of float tc} psIn,  temp structure{ temp 2-element array of float m0_array,  temp int m1} contains_no_builtin_io})
+0:?     'ts.pos' ( out 4-component vector of float Position)
+0:?     'ts.psIn.tc' (layout( location=0) out 2-component vector of float)
+0:?     'ts.contains_no_builtin_io.m0_array[0]' (layout( location=1) out float)
+0:?     'ts.contains_no_builtin_io.m0_array[1]' (layout( location=2) out float)
+0:?     'ts.contains_no_builtin_io.m1' (layout( location=3) out int)
 
 // Module Version 10000
-// Generated by (magic number): 80001
-// Id's are bound by 99
+// Generated by (magic number): 80007
+// Id's are bound by 100
 
                               Capability Geometry
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Geometry 4  "main" 41 48 67 75
+                              EntryPoint Geometry 4  "main" 48 52 56 59 63 69 77
                               ExecutionMode 4 Triangles
                               ExecutionMode 4 Invocations 1
                               ExecutionMode 4 OutputTriangleStrip
@@ -356,28 +474,26 @@
                               Name 21  "tin"
                               Name 22  "ts"
                               Name 25  "o"
-                              Name 41  "ts_psIn_pos"
-                              Name 44  "PS_IN"
-                              MemberName 44(PS_IN) 0  "tc"
-                              Name 45  "STRUCT_WITH_NO_BUILTIN_INTERSTAGE_IO"
-                              MemberName 45(STRUCT_WITH_NO_BUILTIN_INTERSTAGE_IO) 0  "m0_array"
-                              MemberName 45(STRUCT_WITH_NO_BUILTIN_INTERSTAGE_IO) 1  "m1"
-                              Name 46  "GS_OUT"
-                              MemberName 46(GS_OUT) 0  "psIn"
-                              MemberName 46(GS_OUT) 1  "contains_no_builtin_io"
-                              Name 48  "ts"
-                              Name 64  "tin"
-                              Name 67  "tin_pos"
-                              Name 72  "PS_IN"
-                              MemberName 72(PS_IN) 0  "tc"
-                              Name 75  "tin"
-                              Name 93  "ts"
-                              Name 94  "param"
-                              Name 96  "param"
-                              Decorate 41(ts_psIn_pos) BuiltIn Position
-                              Decorate 48(ts) Location 0
-                              Decorate 67(tin_pos) BuiltIn Position
-                              Decorate 75(tin) Location 0
+                              Name 48  "ts.pos"
+                              Name 52  "ts.psIn.tc"
+                              Name 56  "ts.contains_no_builtin_io.m0_array[0]"
+                              Name 59  "ts.contains_no_builtin_io.m0_array[1]"
+                              Name 63  "ts.contains_no_builtin_io.m1"
+                              Name 66  "tin"
+                              Name 69  "tin.pos"
+                              Name 74  "PS_IN"
+                              MemberName 74(PS_IN) 0  "tc"
+                              Name 77  "tin"
+                              Name 94  "ts"
+                              Name 95  "param"
+                              Name 97  "param"
+                              Decorate 48(ts.pos) BuiltIn Position
+                              Decorate 52(ts.psIn.tc) Location 0
+                              Decorate 56(ts.contains_no_builtin_io.m0_array[0]) Location 1
+                              Decorate 59(ts.contains_no_builtin_io.m0_array[1]) Location 2
+                              Decorate 63(ts.contains_no_builtin_io.m1) Location 3
+                              Decorate 69(tin.pos) BuiltIn Position
+                              Decorate 77(tin) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -407,63 +523,63 @@
               36:    6(float) Constant 1086324736
               37:    8(fvec2) ConstantComposite 35 36
               38:             TypePointer Function 8(fvec2)
-              40:             TypePointer Output 7(fvec4)
- 41(ts_psIn_pos):     40(ptr) Variable Output
-       44(PS_IN):             TypeStruct 8(fvec2)
-45(STRUCT_WITH_NO_BUILTIN_INTERSTAGE_IO):             TypeStruct 15 16(int)
-      46(GS_OUT):             TypeStruct 44(PS_IN) 45(STRUCT_WITH_NO_BUILTIN_INTERSTAGE_IO)
-              47:             TypePointer Output 46(GS_OUT)
-          48(ts):     47(ptr) Variable Output
+              40:    6(float) Constant 1075000115
+              41:             TypePointer Function 6(float)
+              44:     16(int) Constant 2
+              45:             TypePointer Function 16(int)
+              47:             TypePointer Output 7(fvec4)
+      48(ts.pos):     47(ptr) Variable Output
               51:             TypePointer Output 8(fvec2)
-              53:             TypePointer Function 17(STRUCT_WITH_NO_BUILTIN_INTERSTAGE_IO)
-              56:             TypePointer Output 45(STRUCT_WITH_NO_BUILTIN_INTERSTAGE_IO)
-              59:             TypePointer Output 15
+  52(ts.psIn.tc):     51(ptr) Variable Output
+              55:             TypePointer Output 6(float)
+56(ts.contains_no_builtin_io.m0_array[0]):     55(ptr) Variable Output
+59(ts.contains_no_builtin_io.m0_array[1]):     55(ptr) Variable Output
               62:             TypePointer Output 16(int)
-              65:             TypeArray 7(fvec4) 11
-              66:             TypePointer Input 65
-     67(tin_pos):     66(ptr) Variable Input
-              68:             TypePointer Input 7(fvec4)
-       72(PS_IN):             TypeStruct 8(fvec2)
-              73:             TypeArray 72(PS_IN) 11
-              74:             TypePointer Input 73
-         75(tin):     74(ptr) Variable Input
-              76:             TypePointer Input 8(fvec2)
-              86:     16(int) Constant 2
+63(ts.contains_no_builtin_io.m1):     62(ptr) Variable Output
+              67:             TypeArray 7(fvec4) 11
+              68:             TypePointer Input 67
+     69(tin.pos):     68(ptr) Variable Input
+              70:             TypePointer Input 7(fvec4)
+       74(PS_IN):             TypeStruct 8(fvec2)
+              75:             TypeArray 74(PS_IN) 11
+              76:             TypePointer Input 75
+         77(tin):     76(ptr) Variable Input
+              78:             TypePointer Input 8(fvec2)
          4(main):           2 Function None 3
                5:             Label
-         64(tin):     13(ptr) Variable Function
-          93(ts):     19(ptr) Variable Function
-       94(param):     13(ptr) Variable Function
-       96(param):     19(ptr) Variable Function
-              69:     68(ptr) AccessChain 67(tin_pos) 26
-              70:    7(fvec4) Load 69
-              71:     32(ptr) AccessChain 64(tin) 26 26
-                              Store 71 70
-              77:     76(ptr) AccessChain 75(tin) 26 26
-              78:    8(fvec2) Load 77
-              79:     38(ptr) AccessChain 64(tin) 26 34
-                              Store 79 78
-              80:     68(ptr) AccessChain 67(tin_pos) 34
-              81:    7(fvec4) Load 80
-              82:     32(ptr) AccessChain 64(tin) 34 26
-                              Store 82 81
-              83:     76(ptr) AccessChain 75(tin) 34 26
-              84:    8(fvec2) Load 83
-              85:     38(ptr) AccessChain 64(tin) 34 34
-                              Store 85 84
-              87:     68(ptr) AccessChain 67(tin_pos) 86
-              88:    7(fvec4) Load 87
-              89:     32(ptr) AccessChain 64(tin) 86 26
-                              Store 89 88
-              90:     76(ptr) AccessChain 75(tin) 86 26
-              91:    8(fvec2) Load 90
-              92:     38(ptr) AccessChain 64(tin) 86 34
-                              Store 92 91
-              95:          12 Load 64(tin)
-                              Store 94(param) 95
-              97:           2 FunctionCall 23(@main(struct-PS_IN-vf4-vf21[3];struct-GS_OUT-struct-PS_IN-vf4-vf21-struct-STRUCT_WITH_NO_BUILTIN_INTERSTAGE_IO-f1[2]-i111;) 94(param) 96(param)
-              98:  18(GS_OUT) Load 96(param)
-                              Store 93(ts) 98
+         66(tin):     13(ptr) Variable Function
+          94(ts):     19(ptr) Variable Function
+       95(param):     13(ptr) Variable Function
+       97(param):     19(ptr) Variable Function
+              71:     70(ptr) AccessChain 69(tin.pos) 26
+              72:    7(fvec4) Load 71
+              73:     32(ptr) AccessChain 66(tin) 26 26
+                              Store 73 72
+              79:     78(ptr) AccessChain 77(tin) 26 26
+              80:    8(fvec2) Load 79
+              81:     38(ptr) AccessChain 66(tin) 26 34
+                              Store 81 80
+              82:     70(ptr) AccessChain 69(tin.pos) 34
+              83:    7(fvec4) Load 82
+              84:     32(ptr) AccessChain 66(tin) 34 26
+                              Store 84 83
+              85:     78(ptr) AccessChain 77(tin) 34 26
+              86:    8(fvec2) Load 85
+              87:     38(ptr) AccessChain 66(tin) 34 34
+                              Store 87 86
+              88:     70(ptr) AccessChain 69(tin.pos) 44
+              89:    7(fvec4) Load 88
+              90:     32(ptr) AccessChain 66(tin) 44 26
+                              Store 90 89
+              91:     78(ptr) AccessChain 77(tin) 44 26
+              92:    8(fvec2) Load 91
+              93:     38(ptr) AccessChain 66(tin) 44 34
+                              Store 93 92
+              96:          12 Load 66(tin)
+                              Store 95(param) 96
+              98:           2 FunctionCall 23(@main(struct-PS_IN-vf4-vf21[3];struct-GS_OUT-struct-PS_IN-vf4-vf21-struct-STRUCT_WITH_NO_BUILTIN_INTERSTAGE_IO-f1[2]-i111;) 95(param) 97(param)
+              99:  18(GS_OUT) Load 97(param)
+                              Store 94(ts) 99
                               Return
                               FunctionEnd
 23(@main(struct-PS_IN-vf4-vf21[3];struct-GS_OUT-struct-PS_IN-vf4-vf21-struct-STRUCT_WITH_NO_BUILTIN_INTERSTAGE_IO-f1[2]-i111;):           2 Function None 20
@@ -475,22 +591,27 @@
                               Store 33 31
               39:     38(ptr) AccessChain 25(o) 26 34
                               Store 39 37
-              42:     32(ptr) AccessChain 25(o) 26 26
-              43:    7(fvec4) Load 42
-                              Store 41(ts_psIn_pos) 43
-              49:     38(ptr) AccessChain 25(o) 26 34
-              50:    8(fvec2) Load 49
-              52:     51(ptr) AccessChain 48(ts) 26 26
-                              Store 52 50
-              54:     53(ptr) AccessChain 25(o) 34
-              55:17(STRUCT_WITH_NO_BUILTIN_INTERSTAGE_IO) Load 54
-              57:     56(ptr) AccessChain 48(ts) 34
-              58:          15 CompositeExtract 55 0
-              60:     59(ptr) AccessChain 57 26
-                              Store 60 58
-              61:     16(int) CompositeExtract 55 1
-              63:     62(ptr) AccessChain 57 34
-                              Store 63 61
+              42:     41(ptr) AccessChain 25(o) 34 26 26
+                              Store 42 40
+              43:     41(ptr) AccessChain 25(o) 34 26 34
+                              Store 43 40
+              46:     45(ptr) AccessChain 25(o) 34 34
+                              Store 46 44
+              49:     32(ptr) AccessChain 25(o) 26 26
+              50:    7(fvec4) Load 49
+                              Store 48(ts.pos) 50
+              53:     38(ptr) AccessChain 25(o) 26 34
+              54:    8(fvec2) Load 53
+                              Store 52(ts.psIn.tc) 54
+              57:     41(ptr) AccessChain 25(o) 34 26 26
+              58:    6(float) Load 57
+                              Store 56(ts.contains_no_builtin_io.m0_array[0]) 58
+              60:     41(ptr) AccessChain 25(o) 34 26 34
+              61:    6(float) Load 60
+                              Store 59(ts.contains_no_builtin_io.m0_array[1]) 61
+              64:     45(ptr) AccessChain 25(o) 34 34
+              65:     16(int) Load 64
+                              Store 63(ts.contains_no_builtin_io.m1) 65
                               EmitVertex
                               Return
                               FunctionEnd
diff --git a/Test/baseResults/hlsl.struct.split.trivial.geom.out b/Test/baseResults/hlsl.struct.split.trivial.geom.out
index c552675..477fbd2 100644
--- a/Test/baseResults/hlsl.struct.split.trivial.geom.out
+++ b/Test/baseResults/hlsl.struct.split.trivial.geom.out
@@ -37,7 +37,7 @@
 0:19            Sequence
 0:19              Sequence
 0:19                move second child to first child ( temp 4-component vector of float)
-0:?                   'ts_pos' ( out 4-component vector of float Position)
+0:?                   'ts.pos' ( out 4-component vector of float Position)
 0:19                  pos: direct index for structure ( temp 4-component vector of float)
 0:19                    'o' ( temp structure{ temp 4-component vector of float pos})
 0:19                    Constant:
@@ -59,7 +59,7 @@
 0:14            Constant:
 0:14              0 (const int)
 0:14          direct index ( in 4-component vector of float Position)
-0:?             'i_pos' ( in 3-element array of 4-component vector of float Position)
+0:?             'i.pos' ( in 3-element array of 4-component vector of float Position)
 0:14            Constant:
 0:14              0 (const int)
 0:14        move second child to first child ( temp 4-component vector of float)
@@ -71,7 +71,7 @@
 0:14            Constant:
 0:14              0 (const int)
 0:14          direct index ( in 4-component vector of float Position)
-0:?             'i_pos' ( in 3-element array of 4-component vector of float Position)
+0:?             'i.pos' ( in 3-element array of 4-component vector of float Position)
 0:14            Constant:
 0:14              1 (const int)
 0:14        move second child to first child ( temp 4-component vector of float)
@@ -83,15 +83,15 @@
 0:14            Constant:
 0:14              0 (const int)
 0:14          direct index ( in 4-component vector of float Position)
-0:?             'i_pos' ( in 3-element array of 4-component vector of float Position)
+0:?             'i.pos' ( in 3-element array of 4-component vector of float Position)
 0:14            Constant:
 0:14              2 (const int)
 0:14      Function Call: @main(struct-PS_IN-vf41[3];struct-GS_OUT-vf41; ( temp void)
 0:?         'i' ( temp 3-element array of structure{ temp 4-component vector of float pos})
 0:?         'ts' ( temp structure{ temp 4-component vector of float pos})
 0:?   Linker Objects
-0:?     'i' (layout( location=0) in 3-element array of structure{})
-0:?     'ts' (layout( location=0) out structure{})
+0:?     'i.pos' ( in 3-element array of 4-component vector of float Position)
+0:?     'ts.pos' ( out 4-component vector of float Position)
 
 
 Linked geometry stage:
@@ -135,7 +135,7 @@
 0:19            Sequence
 0:19              Sequence
 0:19                move second child to first child ( temp 4-component vector of float)
-0:?                   'ts_pos' ( out 4-component vector of float Position)
+0:?                   'ts.pos' ( out 4-component vector of float Position)
 0:19                  pos: direct index for structure ( temp 4-component vector of float)
 0:19                    'o' ( temp structure{ temp 4-component vector of float pos})
 0:19                    Constant:
@@ -157,7 +157,7 @@
 0:14            Constant:
 0:14              0 (const int)
 0:14          direct index ( in 4-component vector of float Position)
-0:?             'i_pos' ( in 3-element array of 4-component vector of float Position)
+0:?             'i.pos' ( in 3-element array of 4-component vector of float Position)
 0:14            Constant:
 0:14              0 (const int)
 0:14        move second child to first child ( temp 4-component vector of float)
@@ -169,7 +169,7 @@
 0:14            Constant:
 0:14              0 (const int)
 0:14          direct index ( in 4-component vector of float Position)
-0:?             'i_pos' ( in 3-element array of 4-component vector of float Position)
+0:?             'i.pos' ( in 3-element array of 4-component vector of float Position)
 0:14            Constant:
 0:14              1 (const int)
 0:14        move second child to first child ( temp 4-component vector of float)
@@ -181,24 +181,24 @@
 0:14            Constant:
 0:14              0 (const int)
 0:14          direct index ( in 4-component vector of float Position)
-0:?             'i_pos' ( in 3-element array of 4-component vector of float Position)
+0:?             'i.pos' ( in 3-element array of 4-component vector of float Position)
 0:14            Constant:
 0:14              2 (const int)
 0:14      Function Call: @main(struct-PS_IN-vf41[3];struct-GS_OUT-vf41; ( temp void)
 0:?         'i' ( temp 3-element array of structure{ temp 4-component vector of float pos})
 0:?         'ts' ( temp structure{ temp 4-component vector of float pos})
 0:?   Linker Objects
-0:?     'i' (layout( location=0) in 3-element array of structure{})
-0:?     'ts' (layout( location=0) out structure{})
+0:?     'i.pos' ( in 3-element array of 4-component vector of float Position)
+0:?     'ts.pos' ( out 4-component vector of float Position)
 
 // Module Version 10000
-// Generated by (magic number): 80001
-// Id's are bound by 74
+// Generated by (magic number): 80007
+// Id's are bound by 67
 
                               Capability Geometry
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Geometry 4  "main" 40 49 70 73
+                              EntryPoint Geometry 4  "main" 40 49
                               ExecutionMode 4 Triangles
                               ExecutionMode 4 Invocations 1
                               ExecutionMode 4 OutputTriangleStrip
@@ -214,20 +214,14 @@
                               Name 17  "ts"
                               Name 22  "x"
                               Name 33  "o"
-                              Name 40  "ts_pos"
+                              Name 40  "ts.pos"
                               Name 46  "i"
-                              Name 49  "i_pos"
+                              Name 49  "i.pos"
                               Name 61  "ts"
                               Name 62  "param"
                               Name 64  "param"
-                              Name 67  "PS_IN"
-                              Name 70  "i"
-                              Name 71  "GS_OUT"
-                              Name 73  "ts"
-                              Decorate 40(ts_pos) BuiltIn Position
-                              Decorate 49(i_pos) BuiltIn Position
-                              Decorate 70(i) Location 0
-                              Decorate 73(ts) Location 0
+                              Decorate 40(ts.pos) BuiltIn Position
+                              Decorate 49(i.pos) BuiltIn Position
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -247,35 +241,28 @@
               31:             TypeBool
               35:             TypePointer Function 7(fvec4)
               39:             TypePointer Output 7(fvec4)
-      40(ts_pos):     39(ptr) Variable Output
+      40(ts.pos):     39(ptr) Variable Output
               44:     20(int) Constant 1
               47:             TypeArray 7(fvec4) 10
               48:             TypePointer Input 47
-       49(i_pos):     48(ptr) Variable Input
+       49(i.pos):     48(ptr) Variable Input
               50:             TypePointer Input 7(fvec4)
               57:     20(int) Constant 2
-       67(PS_IN):             TypeStruct
-              68:             TypeArray 67(PS_IN) 10
-              69:             TypePointer Input 68
-           70(i):     69(ptr) Variable Input
-      71(GS_OUT):             TypeStruct
-              72:             TypePointer Output 71(GS_OUT)
-          73(ts):     72(ptr) Variable Output
          4(main):           2 Function None 3
                5:             Label
            46(i):     12(ptr) Variable Function
           61(ts):     14(ptr) Variable Function
        62(param):     12(ptr) Variable Function
        64(param):     14(ptr) Variable Function
-              51:     50(ptr) AccessChain 49(i_pos) 23
+              51:     50(ptr) AccessChain 49(i.pos) 23
               52:    7(fvec4) Load 51
               53:     35(ptr) AccessChain 46(i) 23 23
                               Store 53 52
-              54:     50(ptr) AccessChain 49(i_pos) 44
+              54:     50(ptr) AccessChain 49(i.pos) 44
               55:    7(fvec4) Load 54
               56:     35(ptr) AccessChain 46(i) 44 23
                               Store 56 55
-              58:     50(ptr) AccessChain 49(i_pos) 57
+              58:     50(ptr) AccessChain 49(i.pos) 57
               59:    7(fvec4) Load 58
               60:     35(ptr) AccessChain 46(i) 57 23
                               Store 60 59
@@ -309,7 +296,7 @@
                                 Store 38 37
               41:     35(ptr)   AccessChain 33(o) 23
               42:    7(fvec4)   Load 41
-                                Store 40(ts_pos) 42
+                                Store 40(ts.pos) 42
                                 EmitVertex
                                 Branch 27
               27:               Label
diff --git a/Test/baseResults/hlsl.struct.split.trivial.vert.out b/Test/baseResults/hlsl.struct.split.trivial.vert.out
index 05dcb26..8bf477e 100644
--- a/Test/baseResults/hlsl.struct.split.trivial.vert.out
+++ b/Test/baseResults/hlsl.struct.split.trivial.vert.out
@@ -28,13 +28,13 @@
 0:?             'vsin' ( temp structure{ temp 4-component vector of float Pos_in})
 0:16            Constant:
 0:16              0 (const int)
-0:?           'Pos_in' (layout( location=0) in 4-component vector of float)
+0:?           'vsin.Pos_in' (layout( location=0) in 4-component vector of float)
 0:16      move second child to first child ( temp 4-component vector of float)
 0:?         'Pos_loose' ( temp 4-component vector of float)
 0:?         'Pos_loose' (layout( location=1) in 4-component vector of float)
 0:16      Sequence
 0:16        move second child to first child ( temp 4-component vector of float)
-0:?           '@entryPointOutput_Pos' ( out 4-component vector of float Position)
+0:?           '@entryPointOutput.Pos' ( out 4-component vector of float Position)
 0:16          Pos: direct index for structure ( temp 4-component vector of float)
 0:16            Function Call: @main(struct-VS_INPUT-vf41;vf4; ( temp structure{ temp 4-component vector of float Pos})
 0:?               'vsin' ( temp structure{ temp 4-component vector of float Pos_in})
@@ -42,8 +42,8 @@
 0:16            Constant:
 0:16              0 (const int)
 0:?   Linker Objects
-0:?     '@entryPointOutput' (layout( location=0) out structure{})
-0:?     'Pos_in' (layout( location=0) in 4-component vector of float)
+0:?     '@entryPointOutput.Pos' ( out 4-component vector of float Position)
+0:?     'vsin.Pos_in' (layout( location=0) in 4-component vector of float)
 0:?     'Pos_loose' (layout( location=1) in 4-component vector of float)
 
 
@@ -79,13 +79,13 @@
 0:?             'vsin' ( temp structure{ temp 4-component vector of float Pos_in})
 0:16            Constant:
 0:16              0 (const int)
-0:?           'Pos_in' (layout( location=0) in 4-component vector of float)
+0:?           'vsin.Pos_in' (layout( location=0) in 4-component vector of float)
 0:16      move second child to first child ( temp 4-component vector of float)
 0:?         'Pos_loose' ( temp 4-component vector of float)
 0:?         'Pos_loose' (layout( location=1) in 4-component vector of float)
 0:16      Sequence
 0:16        move second child to first child ( temp 4-component vector of float)
-0:?           '@entryPointOutput_Pos' ( out 4-component vector of float Position)
+0:?           '@entryPointOutput.Pos' ( out 4-component vector of float Position)
 0:16          Pos: direct index for structure ( temp 4-component vector of float)
 0:16            Function Call: @main(struct-VS_INPUT-vf41;vf4; ( temp structure{ temp 4-component vector of float Pos})
 0:?               'vsin' ( temp structure{ temp 4-component vector of float Pos_in})
@@ -93,18 +93,18 @@
 0:16            Constant:
 0:16              0 (const int)
 0:?   Linker Objects
-0:?     '@entryPointOutput' (layout( location=0) out structure{})
-0:?     'Pos_in' (layout( location=0) in 4-component vector of float)
+0:?     '@entryPointOutput.Pos' ( out 4-component vector of float Position)
+0:?     'vsin.Pos_in' (layout( location=0) in 4-component vector of float)
 0:?     'Pos_loose' (layout( location=1) in 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80001
-// Id's are bound by 48
+// Generated by (magic number): 80007
+// Id's are bound by 45
 
                               Capability Shader
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Vertex 4  "main" 31 35 38 47
+                              EntryPoint Vertex 4  "main" 31 35 38
                               Source HLSL 500
                               Name 4  "main"
                               Name 8  "VS_INPUT"
@@ -116,18 +116,15 @@
                               Name 14  "Pos_loose"
                               Name 18  "vsout"
                               Name 29  "vsin"
-                              Name 31  "Pos_in"
+                              Name 31  "vsin.Pos_in"
                               Name 34  "Pos_loose"
                               Name 35  "Pos_loose"
-                              Name 38  "@entryPointOutput_Pos"
+                              Name 38  "@entryPointOutput.Pos"
                               Name 39  "param"
                               Name 41  "param"
-                              Name 45  "VS_OUTPUT"
-                              Name 47  "@entryPointOutput"
-                              Decorate 31(Pos_in) Location 0
+                              Decorate 31(vsin.Pos_in) Location 0
                               Decorate 35(Pos_loose) Location 1
-                              Decorate 38(@entryPointOutput_Pos) BuiltIn Position
-                              Decorate 47(@entryPointOutput) Location 0
+                              Decorate 38(@entryPointOutput.Pos) BuiltIn Position
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -141,20 +138,17 @@
               19:             TypeInt 32 1
               20:     19(int) Constant 0
               30:             TypePointer Input 7(fvec4)
-      31(Pos_in):     30(ptr) Variable Input
+ 31(vsin.Pos_in):     30(ptr) Variable Input
    35(Pos_loose):     30(ptr) Variable Input
               37:             TypePointer Output 7(fvec4)
-38(@entryPointOutput_Pos):     37(ptr) Variable Output
-   45(VS_OUTPUT):             TypeStruct
-              46:             TypePointer Output 45(VS_OUTPUT)
-47(@entryPointOutput):     46(ptr) Variable Output
+38(@entryPointOutput.Pos):     37(ptr) Variable Output
          4(main):           2 Function None 3
                5:             Label
         29(vsin):      9(ptr) Variable Function
    34(Pos_loose):     10(ptr) Variable Function
        39(param):      9(ptr) Variable Function
        41(param):     10(ptr) Variable Function
-              32:    7(fvec4) Load 31(Pos_in)
+              32:    7(fvec4) Load 31(vsin.Pos_in)
               33:     10(ptr) AccessChain 29(vsin) 20
                               Store 33 32
               36:    7(fvec4) Load 35(Pos_loose)
@@ -165,7 +159,7 @@
                               Store 41(param) 42
               43:11(VS_OUTPUT) FunctionCall 15(@main(struct-VS_INPUT-vf41;vf4;) 39(param) 41(param)
               44:    7(fvec4) CompositeExtract 43 0
-                              Store 38(@entryPointOutput_Pos) 44
+                              Store 38(@entryPointOutput.Pos) 44
                               Return
                               FunctionEnd
 15(@main(struct-VS_INPUT-vf41;vf4;):11(VS_OUTPUT) Function None 12
diff --git a/Test/baseResults/hlsl.structIoFourWay.frag.out b/Test/baseResults/hlsl.structIoFourWay.frag.out
old mode 100755
new mode 100644
index cb26bb0..f60c80b
--- a/Test/baseResults/hlsl.structIoFourWay.frag.out
+++ b/Test/baseResults/hlsl.structIoFourWay.frag.out
@@ -12,46 +12,71 @@
 0:15  Function Definition: main( ( temp void)
 0:15    Function Parameters: 
 0:?     Sequence
-0:15      move second child to first child ( temp structure{ temp float f,  temp float g,  temp float d,  temp 4-component vector of float normal})
-0:?         't' ( temp structure{ temp float f,  temp float g,  temp float d,  temp 4-component vector of float normal})
-0:?         't' (layout( location=0) in structure{ temp float f,  centroid temp float g,  temp float d,  temp 4-component vector of float normal})
+0:15      Sequence
+0:15        move second child to first child ( temp float)
+0:15          f: direct index for structure ( temp float)
+0:?             't' ( temp structure{ temp float f,  temp float g,  temp float d,  temp 4-component vector of float normal})
+0:15            Constant:
+0:15              0 (const int)
+0:?           't.f' (layout( location=0) in float)
+0:15        move second child to first child ( temp float)
+0:15          g: direct index for structure ( temp float)
+0:?             't' ( temp structure{ temp float f,  temp float g,  temp float d,  temp 4-component vector of float normal})
+0:15            Constant:
+0:15              1 (const int)
+0:?           't.g' (layout( location=1) centroid in float)
+0:15        move second child to first child ( temp float)
+0:15          d: direct index for structure ( temp float)
+0:?             't' ( temp structure{ temp float f,  temp float g,  temp float d,  temp 4-component vector of float normal})
+0:15            Constant:
+0:15              2 (const int)
+0:?           't.d' (layout( location=2) in float)
+0:15        move second child to first child ( temp 4-component vector of float)
+0:15          normal: direct index for structure ( temp 4-component vector of float)
+0:?             't' ( temp structure{ temp float f,  temp float g,  temp float d,  temp 4-component vector of float normal})
+0:15            Constant:
+0:15              3 (const int)
+0:?           't.normal' (layout( location=3) in 4-component vector of float)
 0:15      Sequence
 0:15        move second child to first child ( temp structure{ temp float f,  temp float g,  temp float d,  temp 4-component vector of float normal})
 0:15          'flattenTemp' ( temp structure{ temp float f,  temp float g,  temp float d,  temp 4-component vector of float normal})
 0:15          Function Call: @main(struct-T-f1-f1-f1-vf41; ( temp structure{ temp float f,  temp float g,  temp float d,  temp 4-component vector of float normal})
 0:?             't' ( temp structure{ temp float f,  temp float g,  temp float d,  temp 4-component vector of float normal})
 0:15        move second child to first child ( temp float)
-0:?           'f' (layout( location=0) out float)
+0:?           '@entryPointOutput.f' (layout( location=0) out float)
 0:15          f: direct index for structure ( temp float)
 0:15            'flattenTemp' ( temp structure{ temp float f,  temp float g,  temp float d,  temp 4-component vector of float normal})
 0:15            Constant:
 0:15              0 (const int)
 0:15        move second child to first child ( temp float)
-0:?           'g' (layout( location=1) out float)
+0:?           '@entryPointOutput.g' (layout( location=1) out float)
 0:15          g: direct index for structure ( temp float)
 0:15            'flattenTemp' ( temp structure{ temp float f,  temp float g,  temp float d,  temp 4-component vector of float normal})
 0:15            Constant:
 0:15              1 (const int)
 0:15        move second child to first child ( temp float)
-0:?           'd' ( out float FragDepth)
+0:?           '@entryPointOutput.d' ( out float FragDepth)
 0:15          d: direct index for structure ( temp float)
 0:15            'flattenTemp' ( temp structure{ temp float f,  temp float g,  temp float d,  temp 4-component vector of float normal})
 0:15            Constant:
 0:15              2 (const int)
 0:15        move second child to first child ( temp 4-component vector of float)
-0:?           'normal' (layout( location=2) out 4-component vector of float)
+0:?           '@entryPointOutput.normal' (layout( location=2) out 4-component vector of float)
 0:15          normal: direct index for structure ( temp 4-component vector of float)
 0:15            'flattenTemp' ( temp structure{ temp float f,  temp float g,  temp float d,  temp 4-component vector of float normal})
 0:15            Constant:
 0:15              3 (const int)
 0:?   Linker Objects
 0:?     'anon@0' (layout( row_major std140) uniform block{ uniform structure{layout( offset=68) temp float f,  temp float g,  temp float d,  temp 4-component vector of float normal} s})
-0:?     'anon@1' (layout( row_major std140) uniform block{layout( row_major std140 offset=88) uniform structure{ temp float f,  temp float g,  temp float d,  temp 4-component vector of float normal} t})
-0:?     'f' (layout( location=0) out float)
-0:?     'g' (layout( location=1) out float)
-0:?     'd' ( out float FragDepth)
-0:?     'normal' (layout( location=2) out 4-component vector of float)
-0:?     't' (layout( location=0) in structure{ temp float f,  centroid temp float g,  temp float d,  temp 4-component vector of float normal})
+0:?     'anon@1' (layout( row_major std140) uniform block{layout( row_major std140 offset=88) uniform structure{layout( offset=68) temp float f,  temp float g,  temp float d,  temp 4-component vector of float normal} t})
+0:?     '@entryPointOutput.d' ( out float FragDepth)
+0:?     '@entryPointOutput.f' (layout( location=0) out float)
+0:?     '@entryPointOutput.g' (layout( location=1) out float)
+0:?     '@entryPointOutput.normal' (layout( location=2) out 4-component vector of float)
+0:?     't.f' (layout( location=0) in float)
+0:?     't.g' (layout( location=1) centroid in float)
+0:?     't.d' (layout( location=2) in float)
+0:?     't.normal' (layout( location=3) in 4-component vector of float)
 
 
 Linked fragment stage:
@@ -70,57 +95,83 @@
 0:15  Function Definition: main( ( temp void)
 0:15    Function Parameters: 
 0:?     Sequence
-0:15      move second child to first child ( temp structure{ temp float f,  temp float g,  temp float d,  temp 4-component vector of float normal})
-0:?         't' ( temp structure{ temp float f,  temp float g,  temp float d,  temp 4-component vector of float normal})
-0:?         't' (layout( location=0) in structure{ temp float f,  centroid temp float g,  temp float d,  temp 4-component vector of float normal})
+0:15      Sequence
+0:15        move second child to first child ( temp float)
+0:15          f: direct index for structure ( temp float)
+0:?             't' ( temp structure{ temp float f,  temp float g,  temp float d,  temp 4-component vector of float normal})
+0:15            Constant:
+0:15              0 (const int)
+0:?           't.f' (layout( location=0) in float)
+0:15        move second child to first child ( temp float)
+0:15          g: direct index for structure ( temp float)
+0:?             't' ( temp structure{ temp float f,  temp float g,  temp float d,  temp 4-component vector of float normal})
+0:15            Constant:
+0:15              1 (const int)
+0:?           't.g' (layout( location=1) centroid in float)
+0:15        move second child to first child ( temp float)
+0:15          d: direct index for structure ( temp float)
+0:?             't' ( temp structure{ temp float f,  temp float g,  temp float d,  temp 4-component vector of float normal})
+0:15            Constant:
+0:15              2 (const int)
+0:?           't.d' (layout( location=2) in float)
+0:15        move second child to first child ( temp 4-component vector of float)
+0:15          normal: direct index for structure ( temp 4-component vector of float)
+0:?             't' ( temp structure{ temp float f,  temp float g,  temp float d,  temp 4-component vector of float normal})
+0:15            Constant:
+0:15              3 (const int)
+0:?           't.normal' (layout( location=3) in 4-component vector of float)
 0:15      Sequence
 0:15        move second child to first child ( temp structure{ temp float f,  temp float g,  temp float d,  temp 4-component vector of float normal})
 0:15          'flattenTemp' ( temp structure{ temp float f,  temp float g,  temp float d,  temp 4-component vector of float normal})
 0:15          Function Call: @main(struct-T-f1-f1-f1-vf41; ( temp structure{ temp float f,  temp float g,  temp float d,  temp 4-component vector of float normal})
 0:?             't' ( temp structure{ temp float f,  temp float g,  temp float d,  temp 4-component vector of float normal})
 0:15        move second child to first child ( temp float)
-0:?           'f' (layout( location=0) out float)
+0:?           '@entryPointOutput.f' (layout( location=0) out float)
 0:15          f: direct index for structure ( temp float)
 0:15            'flattenTemp' ( temp structure{ temp float f,  temp float g,  temp float d,  temp 4-component vector of float normal})
 0:15            Constant:
 0:15              0 (const int)
 0:15        move second child to first child ( temp float)
-0:?           'g' (layout( location=1) out float)
+0:?           '@entryPointOutput.g' (layout( location=1) out float)
 0:15          g: direct index for structure ( temp float)
 0:15            'flattenTemp' ( temp structure{ temp float f,  temp float g,  temp float d,  temp 4-component vector of float normal})
 0:15            Constant:
 0:15              1 (const int)
 0:15        move second child to first child ( temp float)
-0:?           'd' ( out float FragDepth)
+0:?           '@entryPointOutput.d' ( out float FragDepth)
 0:15          d: direct index for structure ( temp float)
 0:15            'flattenTemp' ( temp structure{ temp float f,  temp float g,  temp float d,  temp 4-component vector of float normal})
 0:15            Constant:
 0:15              2 (const int)
 0:15        move second child to first child ( temp 4-component vector of float)
-0:?           'normal' (layout( location=2) out 4-component vector of float)
+0:?           '@entryPointOutput.normal' (layout( location=2) out 4-component vector of float)
 0:15          normal: direct index for structure ( temp 4-component vector of float)
 0:15            'flattenTemp' ( temp structure{ temp float f,  temp float g,  temp float d,  temp 4-component vector of float normal})
 0:15            Constant:
 0:15              3 (const int)
 0:?   Linker Objects
 0:?     'anon@0' (layout( row_major std140) uniform block{ uniform structure{layout( offset=68) temp float f,  temp float g,  temp float d,  temp 4-component vector of float normal} s})
-0:?     'anon@1' (layout( row_major std140) uniform block{layout( row_major std140 offset=88) uniform structure{ temp float f,  temp float g,  temp float d,  temp 4-component vector of float normal} t})
-0:?     'f' (layout( location=0) out float)
-0:?     'g' (layout( location=1) out float)
-0:?     'd' ( out float FragDepth)
-0:?     'normal' (layout( location=2) out 4-component vector of float)
-0:?     't' (layout( location=0) in structure{ temp float f,  centroid temp float g,  temp float d,  temp 4-component vector of float normal})
+0:?     'anon@1' (layout( row_major std140) uniform block{layout( row_major std140 offset=88) uniform structure{layout( offset=68) temp float f,  temp float g,  temp float d,  temp 4-component vector of float normal} t})
+0:?     '@entryPointOutput.d' ( out float FragDepth)
+0:?     '@entryPointOutput.f' (layout( location=0) out float)
+0:?     '@entryPointOutput.g' (layout( location=1) out float)
+0:?     '@entryPointOutput.normal' (layout( location=2) out 4-component vector of float)
+0:?     't.f' (layout( location=0) in float)
+0:?     't.g' (layout( location=1) centroid in float)
+0:?     't.d' (layout( location=2) in float)
+0:?     't.normal' (layout( location=3) in 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80001
-// Id's are bound by 64
+// Generated by (magic number): 80007
+// Id's are bound by 65
 
                               Capability Shader
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "main" 21 43 46 49 53
+                              EntryPoint Fragment 4  "main" 22 27 31 36 45 48 51 55
                               ExecutionMode 4 OriginUpperLeft
                               ExecutionMode 4 DepthGreater
+                              ExecutionMode 4 DepthReplacing
                               Source HLSL 500
                               Name 4  "main"
                               Name 8  "T"
@@ -132,54 +183,46 @@
                               Name 11  "t"
                               Name 14  "local"
                               Name 18  "t"
-                              Name 19  "T"
-                              MemberName 19(T) 0  "f"
-                              MemberName 19(T) 1  "g"
-                              MemberName 19(T) 2  "d"
-                              MemberName 19(T) 3  "normal"
-                              Name 21  "t"
-                              Name 38  "flattenTemp"
-                              Name 39  "param"
-                              Name 43  "f"
-                              Name 46  "g"
-                              Name 49  "d"
-                              Name 53  "normal"
-                              Name 56  "T"
-                              MemberName 56(T) 0  "f"
-                              MemberName 56(T) 1  "g"
-                              MemberName 56(T) 2  "d"
-                              MemberName 56(T) 3  "normal"
-                              Name 57  "$Global"
-                              MemberName 57($Global) 0  "s"
-                              Name 59  ""
-                              Name 60  "T"
-                              MemberName 60(T) 0  "f"
-                              MemberName 60(T) 1  "g"
-                              MemberName 60(T) 2  "d"
-                              MemberName 60(T) 3  "normal"
-                              Name 61  "buff"
-                              MemberName 61(buff) 0  "t"
-                              Name 63  ""
-                              MemberDecorate 19(T) 1 Centroid
-                              Decorate 21(t) Location 0
-                              Decorate 43(f) Location 0
-                              Decorate 46(g) Location 1
-                              Decorate 49(d) BuiltIn FragDepth
-                              Decorate 53(normal) Location 2
-                              MemberDecorate 56(T) 0 Offset 68
-                              MemberDecorate 56(T) 1 Offset 72
-                              MemberDecorate 56(T) 2 Offset 76
-                              MemberDecorate 56(T) 3 Offset 80
-                              MemberDecorate 57($Global) 0 Offset 0
-                              Decorate 57($Global) Block
-                              Decorate 59 DescriptorSet 0
-                              MemberDecorate 60(T) 0 Offset 0
-                              MemberDecorate 60(T) 1 Offset 4
-                              MemberDecorate 60(T) 2 Offset 8
-                              MemberDecorate 60(T) 3 Offset 16
-                              MemberDecorate 61(buff) 0 Offset 96
-                              Decorate 61(buff) Block
-                              Decorate 63 DescriptorSet 0
+                              Name 22  "t.f"
+                              Name 27  "t.g"
+                              Name 31  "t.d"
+                              Name 36  "t.normal"
+                              Name 40  "flattenTemp"
+                              Name 41  "param"
+                              Name 45  "@entryPointOutput.f"
+                              Name 48  "@entryPointOutput.g"
+                              Name 51  "@entryPointOutput.d"
+                              Name 55  "@entryPointOutput.normal"
+                              Name 58  "T"
+                              MemberName 58(T) 0  "f"
+                              MemberName 58(T) 1  "g"
+                              MemberName 58(T) 2  "d"
+                              MemberName 58(T) 3  "normal"
+                              Name 59  "$Global"
+                              MemberName 59($Global) 0  "s"
+                              Name 61  ""
+                              Name 62  "buff"
+                              MemberName 62(buff) 0  "t"
+                              Name 64  ""
+                              Decorate 22(t.f) Location 0
+                              Decorate 27(t.g) Centroid
+                              Decorate 27(t.g) Location 1
+                              Decorate 31(t.d) Location 2
+                              Decorate 36(t.normal) Location 3
+                              Decorate 45(@entryPointOutput.f) Location 0
+                              Decorate 48(@entryPointOutput.g) Location 1
+                              Decorate 51(@entryPointOutput.d) BuiltIn FragDepth
+                              Decorate 55(@entryPointOutput.normal) Location 2
+                              MemberDecorate 58(T) 0 Offset 68
+                              MemberDecorate 58(T) 1 Offset 72
+                              MemberDecorate 58(T) 2 Offset 76
+                              MemberDecorate 58(T) 3 Offset 80
+                              MemberDecorate 59($Global) 0 Offset 0
+                              Decorate 59($Global) Block
+                              Decorate 61 DescriptorSet 0
+                              MemberDecorate 62(buff) 0 Offset 96
+                              Decorate 62(buff) Block
+                              Decorate 64 DescriptorSet 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -187,64 +230,65 @@
             8(T):             TypeStruct 6(float) 6(float) 6(float) 7(fvec4)
                9:             TypePointer Function 8(T)
               10:             TypeFunction 8(T) 9(ptr)
-           19(T):             TypeStruct 6(float) 6(float) 6(float) 7(fvec4)
-              20:             TypePointer Input 19(T)
-           21(t):     20(ptr) Variable Input
-              24:             TypeInt 32 1
-              25:     24(int) Constant 0
-              26:             TypePointer Function 6(float)
-              29:     24(int) Constant 1
-              32:     24(int) Constant 2
-              35:     24(int) Constant 3
-              36:             TypePointer Function 7(fvec4)
-              42:             TypePointer Output 6(float)
-           43(f):     42(ptr) Variable Output
-           46(g):     42(ptr) Variable Output
-           49(d):     42(ptr) Variable Output
-              52:             TypePointer Output 7(fvec4)
-      53(normal):     52(ptr) Variable Output
-           56(T):             TypeStruct 6(float) 6(float) 6(float) 7(fvec4)
-     57($Global):             TypeStruct 56(T)
-              58:             TypePointer Uniform 57($Global)
-              59:     58(ptr) Variable Uniform
-           60(T):             TypeStruct 6(float) 6(float) 6(float) 7(fvec4)
-        61(buff):             TypeStruct 60(T)
-              62:             TypePointer Uniform 61(buff)
-              63:     62(ptr) Variable Uniform
+              19:             TypeInt 32 1
+              20:     19(int) Constant 0
+              21:             TypePointer Input 6(float)
+         22(t.f):     21(ptr) Variable Input
+              24:             TypePointer Function 6(float)
+              26:     19(int) Constant 1
+         27(t.g):     21(ptr) Variable Input
+              30:     19(int) Constant 2
+         31(t.d):     21(ptr) Variable Input
+              34:     19(int) Constant 3
+              35:             TypePointer Input 7(fvec4)
+    36(t.normal):     35(ptr) Variable Input
+              38:             TypePointer Function 7(fvec4)
+              44:             TypePointer Output 6(float)
+45(@entryPointOutput.f):     44(ptr) Variable Output
+48(@entryPointOutput.g):     44(ptr) Variable Output
+51(@entryPointOutput.d):     44(ptr) Variable Output
+              54:             TypePointer Output 7(fvec4)
+55(@entryPointOutput.normal):     54(ptr) Variable Output
+           58(T):             TypeStruct 6(float) 6(float) 6(float) 7(fvec4)
+     59($Global):             TypeStruct 58(T)
+              60:             TypePointer Uniform 59($Global)
+              61:     60(ptr) Variable Uniform
+        62(buff):             TypeStruct 58(T)
+              63:             TypePointer Uniform 62(buff)
+              64:     63(ptr) Variable Uniform
          4(main):           2 Function None 3
                5:             Label
            18(t):      9(ptr) Variable Function
- 38(flattenTemp):      9(ptr) Variable Function
-       39(param):      9(ptr) Variable Function
-              22:       19(T) Load 21(t)
-              23:    6(float) CompositeExtract 22 0
-              27:     26(ptr) AccessChain 18(t) 25
-                              Store 27 23
-              28:    6(float) CompositeExtract 22 1
-              30:     26(ptr) AccessChain 18(t) 29
-                              Store 30 28
-              31:    6(float) CompositeExtract 22 2
-              33:     26(ptr) AccessChain 18(t) 32
-                              Store 33 31
-              34:    7(fvec4) CompositeExtract 22 3
-              37:     36(ptr) AccessChain 18(t) 35
-                              Store 37 34
-              40:        8(T) Load 18(t)
-                              Store 39(param) 40
-              41:        8(T) FunctionCall 12(@main(struct-T-f1-f1-f1-vf41;) 39(param)
-                              Store 38(flattenTemp) 41
-              44:     26(ptr) AccessChain 38(flattenTemp) 25
-              45:    6(float) Load 44
-                              Store 43(f) 45
-              47:     26(ptr) AccessChain 38(flattenTemp) 29
-              48:    6(float) Load 47
-                              Store 46(g) 48
-              50:     26(ptr) AccessChain 38(flattenTemp) 32
-              51:    6(float) Load 50
-                              Store 49(d) 51
-              54:     36(ptr) AccessChain 38(flattenTemp) 35
-              55:    7(fvec4) Load 54
-                              Store 53(normal) 55
+ 40(flattenTemp):      9(ptr) Variable Function
+       41(param):      9(ptr) Variable Function
+              23:    6(float) Load 22(t.f)
+              25:     24(ptr) AccessChain 18(t) 20
+                              Store 25 23
+              28:    6(float) Load 27(t.g)
+              29:     24(ptr) AccessChain 18(t) 26
+                              Store 29 28
+              32:    6(float) Load 31(t.d)
+              33:     24(ptr) AccessChain 18(t) 30
+                              Store 33 32
+              37:    7(fvec4) Load 36(t.normal)
+              39:     38(ptr) AccessChain 18(t) 34
+                              Store 39 37
+              42:        8(T) Load 18(t)
+                              Store 41(param) 42
+              43:        8(T) FunctionCall 12(@main(struct-T-f1-f1-f1-vf41;) 41(param)
+                              Store 40(flattenTemp) 43
+              46:     24(ptr) AccessChain 40(flattenTemp) 20
+              47:    6(float) Load 46
+                              Store 45(@entryPointOutput.f) 47
+              49:     24(ptr) AccessChain 40(flattenTemp) 26
+              50:    6(float) Load 49
+                              Store 48(@entryPointOutput.g) 50
+              52:     24(ptr) AccessChain 40(flattenTemp) 30
+              53:    6(float) Load 52
+                              Store 51(@entryPointOutput.d) 53
+              56:     38(ptr) AccessChain 40(flattenTemp) 34
+              57:    7(fvec4) Load 56
+                              Store 55(@entryPointOutput.normal) 57
                               Return
                               FunctionEnd
 12(@main(struct-T-f1-f1-f1-vf41;):        8(T) Function None 10
diff --git a/Test/baseResults/hlsl.structStructName.frag.out b/Test/baseResults/hlsl.structStructName.frag.out
old mode 100755
new mode 100644
index 3b28805..183dcf6
--- a/Test/baseResults/hlsl.structStructName.frag.out
+++ b/Test/baseResults/hlsl.structStructName.frag.out
@@ -44,7 +44,7 @@
 0:?     '@entryPointOutput' (layout( location=0) out int)
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 22
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.structarray.flatten.frag.out b/Test/baseResults/hlsl.structarray.flatten.frag.out
index d70af80..fc66a7c 100644
--- a/Test/baseResults/hlsl.structarray.flatten.frag.out
+++ b/Test/baseResults/hlsl.structarray.flatten.frag.out
@@ -15,8 +15,8 @@
 0:25          add ( temp 4-component vector of float)
 0:25            texture ( temp 4-component vector of float)
 0:25              Construct combined texture-sampler ( temp sampler1D)
-0:?                 'tex' ( uniform texture1D)
-0:?                 'samp' ( uniform sampler)
+0:?                 'g_texdata.tex' ( uniform texture1D)
+0:?                 'g_texdata.samp' ( uniform sampler)
 0:25              Constant:
 0:25                0.500000
 0:26            texture ( temp 4-component vector of float)
@@ -27,8 +27,14 @@
 0:26                0.400000
 0:27          texture ( temp 4-component vector of float)
 0:27            Construct combined texture-sampler ( temp sampler1D)
-0:?               'g_texdata_array2[1].tex[0]' ( uniform texture1D)
-0:?               'g_texdata_array2[1].samp[0]' ( uniform sampler)
+0:27              direct index ( temp texture1D)
+0:?                 'g_texdata_array2[1].tex' ( uniform 2-element array of texture1D)
+0:27                Constant:
+0:27                  0 (const int)
+0:27              direct index ( temp sampler)
+0:?                 'g_texdata_array2[1].samp' ( uniform 2-element array of sampler)
+0:27                Constant:
+0:27                  0 (const int)
 0:27            Constant:
 0:27              0.300000
 0:23  Function Definition: main( ( temp void)
@@ -38,7 +44,7 @@
 0:?         'ps_output' ( temp structure{ temp 4-component vector of float color})
 0:23      Sequence
 0:23        move second child to first child ( temp 4-component vector of float)
-0:?           'color' (layout( location=0) out 4-component vector of float)
+0:?           'ps_output.color' (layout( location=0) out 4-component vector of float)
 0:23          color: direct index for structure ( temp 4-component vector of float)
 0:?             'ps_output' ( temp structure{ temp 4-component vector of float color})
 0:23            Constant:
@@ -46,19 +52,28 @@
 0:?   Linker Objects
 0:?     'g_samp' ( uniform sampler)
 0:?     'g_tex' ( uniform texture1D)
-0:?     'g_texdata_array2[0].samp[0]' ( uniform sampler)
-0:?     'g_texdata_array2[0].samp[1]' ( uniform sampler)
-0:?     'g_texdata_array2[0].tex[0]' ( uniform texture1D)
-0:?     'g_texdata_array2[0].tex[1]' ( uniform texture1D)
-0:?     'g_texdata_array2[1].samp[0]' ( uniform sampler)
-0:?     'g_texdata_array2[1].samp[1]' ( uniform sampler)
-0:?     'g_texdata_array2[1].tex[0]' ( uniform texture1D)
-0:?     'g_texdata_array2[1].tex[1]' ( uniform texture1D)
-0:?     'g_texdata_array2[2].samp[0]' ( uniform sampler)
-0:?     'g_texdata_array2[2].samp[1]' ( uniform sampler)
-0:?     'g_texdata_array2[2].tex[0]' ( uniform texture1D)
-0:?     'g_texdata_array2[2].tex[1]' ( uniform texture1D)
-0:?     'color' (layout( location=0) out 4-component vector of float)
+0:?     'g_texdata.samp' ( uniform sampler)
+0:?     'g_texdata.tex' ( uniform texture1D)
+0:?     'g_texdata.nonopaque_thing' ( uniform int)
+0:?     'g_texdata_array[0].samp' ( uniform sampler)
+0:?     'g_texdata_array[0].tex' ( uniform texture1D)
+0:?     'g_texdata_array[0].nonopaque_thing' ( uniform int)
+0:?     'g_texdata_array[1].samp' ( uniform sampler)
+0:?     'g_texdata_array[1].tex' ( uniform texture1D)
+0:?     'g_texdata_array[1].nonopaque_thing' ( uniform int)
+0:?     'g_texdata_array[2].samp' ( uniform sampler)
+0:?     'g_texdata_array[2].tex' ( uniform texture1D)
+0:?     'g_texdata_array[2].nonopaque_thing' ( uniform int)
+0:?     'g_texdata_array2[0].samp' ( uniform 2-element array of sampler)
+0:?     'g_texdata_array2[0].tex' ( uniform 2-element array of texture1D)
+0:?     'g_texdata_array2[0].nonopaque_thing' ( uniform int)
+0:?     'g_texdata_array2[1].samp' ( uniform 2-element array of sampler)
+0:?     'g_texdata_array2[1].tex' ( uniform 2-element array of texture1D)
+0:?     'g_texdata_array2[1].nonopaque_thing' ( uniform int)
+0:?     'g_texdata_array2[2].samp' ( uniform 2-element array of sampler)
+0:?     'g_texdata_array2[2].tex' ( uniform 2-element array of texture1D)
+0:?     'g_texdata_array2[2].nonopaque_thing' ( uniform int)
+0:?     'ps_output.color' (layout( location=0) out 4-component vector of float)
 
 
 Linked fragment stage:
@@ -80,8 +95,8 @@
 0:25          add ( temp 4-component vector of float)
 0:25            texture ( temp 4-component vector of float)
 0:25              Construct combined texture-sampler ( temp sampler1D)
-0:?                 'tex' ( uniform texture1D)
-0:?                 'samp' ( uniform sampler)
+0:?                 'g_texdata.tex' ( uniform texture1D)
+0:?                 'g_texdata.samp' ( uniform sampler)
 0:25              Constant:
 0:25                0.500000
 0:26            texture ( temp 4-component vector of float)
@@ -92,8 +107,14 @@
 0:26                0.400000
 0:27          texture ( temp 4-component vector of float)
 0:27            Construct combined texture-sampler ( temp sampler1D)
-0:?               'g_texdata_array2[1].tex[0]' ( uniform texture1D)
-0:?               'g_texdata_array2[1].samp[0]' ( uniform sampler)
+0:27              direct index ( temp texture1D)
+0:?                 'g_texdata_array2[1].tex' ( uniform 2-element array of texture1D)
+0:27                Constant:
+0:27                  0 (const int)
+0:27              direct index ( temp sampler)
+0:?                 'g_texdata_array2[1].samp' ( uniform 2-element array of sampler)
+0:27                Constant:
+0:27                  0 (const int)
 0:27            Constant:
 0:27              0.300000
 0:23  Function Definition: main( ( temp void)
@@ -103,7 +124,7 @@
 0:?         'ps_output' ( temp structure{ temp 4-component vector of float color})
 0:23      Sequence
 0:23        move second child to first child ( temp 4-component vector of float)
-0:?           'color' (layout( location=0) out 4-component vector of float)
+0:?           'ps_output.color' (layout( location=0) out 4-component vector of float)
 0:23          color: direct index for structure ( temp 4-component vector of float)
 0:?             'ps_output' ( temp structure{ temp 4-component vector of float color})
 0:23            Constant:
@@ -111,29 +132,44 @@
 0:?   Linker Objects
 0:?     'g_samp' ( uniform sampler)
 0:?     'g_tex' ( uniform texture1D)
-0:?     'g_texdata_array2[0].samp[0]' ( uniform sampler)
-0:?     'g_texdata_array2[0].samp[1]' ( uniform sampler)
-0:?     'g_texdata_array2[0].tex[0]' ( uniform texture1D)
-0:?     'g_texdata_array2[0].tex[1]' ( uniform texture1D)
-0:?     'g_texdata_array2[1].samp[0]' ( uniform sampler)
-0:?     'g_texdata_array2[1].samp[1]' ( uniform sampler)
-0:?     'g_texdata_array2[1].tex[0]' ( uniform texture1D)
-0:?     'g_texdata_array2[1].tex[1]' ( uniform texture1D)
-0:?     'g_texdata_array2[2].samp[0]' ( uniform sampler)
-0:?     'g_texdata_array2[2].samp[1]' ( uniform sampler)
-0:?     'g_texdata_array2[2].tex[0]' ( uniform texture1D)
-0:?     'g_texdata_array2[2].tex[1]' ( uniform texture1D)
-0:?     'color' (layout( location=0) out 4-component vector of float)
+0:?     'g_texdata.samp' ( uniform sampler)
+0:?     'g_texdata.tex' ( uniform texture1D)
+0:?     'g_texdata.nonopaque_thing' ( uniform int)
+0:?     'g_texdata_array[0].samp' ( uniform sampler)
+0:?     'g_texdata_array[0].tex' ( uniform texture1D)
+0:?     'g_texdata_array[0].nonopaque_thing' ( uniform int)
+0:?     'g_texdata_array[1].samp' ( uniform sampler)
+0:?     'g_texdata_array[1].tex' ( uniform texture1D)
+0:?     'g_texdata_array[1].nonopaque_thing' ( uniform int)
+0:?     'g_texdata_array[2].samp' ( uniform sampler)
+0:?     'g_texdata_array[2].tex' ( uniform texture1D)
+0:?     'g_texdata_array[2].nonopaque_thing' ( uniform int)
+0:?     'g_texdata_array2[0].samp' ( uniform 2-element array of sampler)
+0:?     'g_texdata_array2[0].tex' ( uniform 2-element array of texture1D)
+0:?     'g_texdata_array2[0].nonopaque_thing' ( uniform int)
+0:?     'g_texdata_array2[1].samp' ( uniform 2-element array of sampler)
+0:?     'g_texdata_array2[1].tex' ( uniform 2-element array of texture1D)
+0:?     'g_texdata_array2[1].nonopaque_thing' ( uniform int)
+0:?     'g_texdata_array2[2].samp' ( uniform 2-element array of sampler)
+0:?     'g_texdata_array2[2].tex' ( uniform 2-element array of texture1D)
+0:?     'g_texdata_array2[2].nonopaque_thing' ( uniform int)
+0:?     'ps_output.color' (layout( location=0) out 4-component vector of float)
+
+error: SPIRV-Tools Validation Errors
+error: UniformConstant OpVariable <id> '65[g_texdata.nonopaque_thing] 'has illegal type.
+From Vulkan spec, section 14.5.2:
+Variables identified with the UniformConstant storage class are used only as handles to refer to opaque resources. Such variables must be typed as OpTypeImage, OpTypeSampler, OpTypeSampledImage, OpTypeAccelerationStructureNV, or an array of one of these types.
+  %g_texdata_nonopaque_thing = OpVariable %_ptr_UniformConstant_int UniformConstant
 
 // Module Version 10000
-// Generated by (magic number): 80001
-// Id's are bound by 66
+// Generated by (magic number): 80007
+// Id's are bound by 80
 
                               Capability Shader
                               Capability Sampled1D
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "main" 51
+                              EntryPoint Fragment 4  "main" 59
                               ExecutionMode 4 OriginUpperLeft
                               Source HLSL 500
                               Name 4  "main"
@@ -141,46 +177,49 @@
                               MemberName 8(PS_OUTPUT) 0  "color"
                               Name 12  "@main(struct-PS_OUTPUT-vf41;"
                               Name 11  "ps_output"
-                              Name 18  "tex"
-                              Name 22  "samp"
+                              Name 18  "g_texdata.tex"
+                              Name 22  "g_texdata.samp"
                               Name 28  "g_texdata_array[1].tex"
                               Name 30  "g_texdata_array[1].samp"
-                              Name 36  "g_texdata_array2[1].tex[0]"
-                              Name 38  "g_texdata_array2[1].samp[0]"
-                              Name 46  "ps_output"
-                              Name 47  "param"
-                              Name 51  "color"
-                              Name 54  "g_samp"
-                              Name 55  "g_tex"
-                              Name 56  "g_texdata_array2[0].samp[0]"
-                              Name 57  "g_texdata_array2[0].samp[1]"
-                              Name 58  "g_texdata_array2[0].tex[0]"
-                              Name 59  "g_texdata_array2[0].tex[1]"
-                              Name 60  "g_texdata_array2[1].samp[1]"
-                              Name 61  "g_texdata_array2[1].tex[1]"
-                              Name 62  "g_texdata_array2[2].samp[0]"
-                              Name 63  "g_texdata_array2[2].samp[1]"
-                              Name 64  "g_texdata_array2[2].tex[0]"
-                              Name 65  "g_texdata_array2[2].tex[1]"
-                              Decorate 18(tex) DescriptorSet 0
-                              Decorate 22(samp) DescriptorSet 0
+                              Name 40  "g_texdata_array2[1].tex"
+                              Name 45  "g_texdata_array2[1].samp"
+                              Name 54  "ps_output"
+                              Name 55  "param"
+                              Name 59  "ps_output.color"
+                              Name 62  "g_samp"
+                              Name 63  "g_tex"
+                              Name 65  "g_texdata.nonopaque_thing"
+                              Name 66  "g_texdata_array[0].samp"
+                              Name 67  "g_texdata_array[0].tex"
+                              Name 68  "g_texdata_array[0].nonopaque_thing"
+                              Name 69  "g_texdata_array[1].nonopaque_thing"
+                              Name 70  "g_texdata_array[2].samp"
+                              Name 71  "g_texdata_array[2].tex"
+                              Name 72  "g_texdata_array[2].nonopaque_thing"
+                              Name 73  "g_texdata_array2[0].samp"
+                              Name 74  "g_texdata_array2[0].tex"
+                              Name 75  "g_texdata_array2[0].nonopaque_thing"
+                              Name 76  "g_texdata_array2[1].nonopaque_thing"
+                              Name 77  "g_texdata_array2[2].samp"
+                              Name 78  "g_texdata_array2[2].tex"
+                              Name 79  "g_texdata_array2[2].nonopaque_thing"
+                              Decorate 18(g_texdata.tex) DescriptorSet 0
+                              Decorate 22(g_texdata.samp) DescriptorSet 0
                               Decorate 28(g_texdata_array[1].tex) DescriptorSet 0
                               Decorate 30(g_texdata_array[1].samp) DescriptorSet 0
-                              Decorate 36(g_texdata_array2[1].tex[0]) DescriptorSet 0
-                              Decorate 38(g_texdata_array2[1].samp[0]) DescriptorSet 0
-                              Decorate 51(color) Location 0
-                              Decorate 54(g_samp) DescriptorSet 0
-                              Decorate 55(g_tex) DescriptorSet 0
-                              Decorate 56(g_texdata_array2[0].samp[0]) DescriptorSet 0
-                              Decorate 57(g_texdata_array2[0].samp[1]) DescriptorSet 0
-                              Decorate 58(g_texdata_array2[0].tex[0]) DescriptorSet 0
-                              Decorate 59(g_texdata_array2[0].tex[1]) DescriptorSet 0
-                              Decorate 60(g_texdata_array2[1].samp[1]) DescriptorSet 0
-                              Decorate 61(g_texdata_array2[1].tex[1]) DescriptorSet 0
-                              Decorate 62(g_texdata_array2[2].samp[0]) DescriptorSet 0
-                              Decorate 63(g_texdata_array2[2].samp[1]) DescriptorSet 0
-                              Decorate 64(g_texdata_array2[2].tex[0]) DescriptorSet 0
-                              Decorate 65(g_texdata_array2[2].tex[1]) DescriptorSet 0
+                              Decorate 40(g_texdata_array2[1].tex) DescriptorSet 0
+                              Decorate 45(g_texdata_array2[1].samp) DescriptorSet 0
+                              Decorate 59(ps_output.color) Location 0
+                              Decorate 62(g_samp) DescriptorSet 0
+                              Decorate 63(g_tex) DescriptorSet 0
+                              Decorate 66(g_texdata_array[0].samp) DescriptorSet 0
+                              Decorate 67(g_texdata_array[0].tex) DescriptorSet 0
+                              Decorate 70(g_texdata_array[2].samp) DescriptorSet 0
+                              Decorate 71(g_texdata_array[2].tex) DescriptorSet 0
+                              Decorate 73(g_texdata_array2[0].samp) DescriptorSet 0
+                              Decorate 74(g_texdata_array2[0].tex) DescriptorSet 0
+                              Decorate 77(g_texdata_array2[2].samp) DescriptorSet 0
+                              Decorate 78(g_texdata_array2[2].tex) DescriptorSet 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -192,50 +231,62 @@
               15:     14(int) Constant 0
               16:             TypeImage 6(float) 1D sampled format:Unknown
               17:             TypePointer UniformConstant 16
-         18(tex):     17(ptr) Variable UniformConstant
+18(g_texdata.tex):     17(ptr) Variable UniformConstant
               20:             TypeSampler
               21:             TypePointer UniformConstant 20
-        22(samp):     21(ptr) Variable UniformConstant
+22(g_texdata.samp):     21(ptr) Variable UniformConstant
               24:             TypeSampledImage 16
               26:    6(float) Constant 1056964608
 28(g_texdata_array[1].tex):     17(ptr) Variable UniformConstant
 30(g_texdata_array[1].samp):     21(ptr) Variable UniformConstant
               33:    6(float) Constant 1053609165
-36(g_texdata_array2[1].tex[0]):     17(ptr) Variable UniformConstant
-38(g_texdata_array2[1].samp[0]):     21(ptr) Variable UniformConstant
-              41:    6(float) Constant 1050253722
-              44:             TypePointer Function 7(fvec4)
-              50:             TypePointer Output 7(fvec4)
-       51(color):     50(ptr) Variable Output
-      54(g_samp):     21(ptr) Variable UniformConstant
-       55(g_tex):     17(ptr) Variable UniformConstant
-56(g_texdata_array2[0].samp[0]):     21(ptr) Variable UniformConstant
-57(g_texdata_array2[0].samp[1]):     21(ptr) Variable UniformConstant
-58(g_texdata_array2[0].tex[0]):     17(ptr) Variable UniformConstant
-59(g_texdata_array2[0].tex[1]):     17(ptr) Variable UniformConstant
-60(g_texdata_array2[1].samp[1]):     21(ptr) Variable UniformConstant
-61(g_texdata_array2[1].tex[1]):     17(ptr) Variable UniformConstant
-62(g_texdata_array2[2].samp[0]):     21(ptr) Variable UniformConstant
-63(g_texdata_array2[2].samp[1]):     21(ptr) Variable UniformConstant
-64(g_texdata_array2[2].tex[0]):     17(ptr) Variable UniformConstant
-65(g_texdata_array2[2].tex[1]):     17(ptr) Variable UniformConstant
+              36:             TypeInt 32 0
+              37:     36(int) Constant 2
+              38:             TypeArray 16 37
+              39:             TypePointer UniformConstant 38
+40(g_texdata_array2[1].tex):     39(ptr) Variable UniformConstant
+              43:             TypeArray 20 37
+              44:             TypePointer UniformConstant 43
+45(g_texdata_array2[1].samp):     44(ptr) Variable UniformConstant
+              49:    6(float) Constant 1050253722
+              52:             TypePointer Function 7(fvec4)
+              58:             TypePointer Output 7(fvec4)
+59(ps_output.color):     58(ptr) Variable Output
+      62(g_samp):     21(ptr) Variable UniformConstant
+       63(g_tex):     17(ptr) Variable UniformConstant
+              64:             TypePointer UniformConstant 14(int)
+65(g_texdata.nonopaque_thing):     64(ptr) Variable UniformConstant
+66(g_texdata_array[0].samp):     21(ptr) Variable UniformConstant
+67(g_texdata_array[0].tex):     17(ptr) Variable UniformConstant
+68(g_texdata_array[0].nonopaque_thing):     64(ptr) Variable UniformConstant
+69(g_texdata_array[1].nonopaque_thing):     64(ptr) Variable UniformConstant
+70(g_texdata_array[2].samp):     21(ptr) Variable UniformConstant
+71(g_texdata_array[2].tex):     17(ptr) Variable UniformConstant
+72(g_texdata_array[2].nonopaque_thing):     64(ptr) Variable UniformConstant
+73(g_texdata_array2[0].samp):     44(ptr) Variable UniformConstant
+74(g_texdata_array2[0].tex):     39(ptr) Variable UniformConstant
+75(g_texdata_array2[0].nonopaque_thing):     64(ptr) Variable UniformConstant
+76(g_texdata_array2[1].nonopaque_thing):     64(ptr) Variable UniformConstant
+77(g_texdata_array2[2].samp):     44(ptr) Variable UniformConstant
+78(g_texdata_array2[2].tex):     39(ptr) Variable UniformConstant
+79(g_texdata_array2[2].nonopaque_thing):     64(ptr) Variable UniformConstant
          4(main):           2 Function None 3
                5:             Label
-   46(ps_output):      9(ptr) Variable Function
-       47(param):      9(ptr) Variable Function
-              48:           2 FunctionCall 12(@main(struct-PS_OUTPUT-vf41;) 47(param)
-              49:8(PS_OUTPUT) Load 47(param)
-                              Store 46(ps_output) 49
-              52:     44(ptr) AccessChain 46(ps_output) 15
-              53:    7(fvec4) Load 52
-                              Store 51(color) 53
+   54(ps_output):      9(ptr) Variable Function
+       55(param):      9(ptr) Variable Function
+              56:           2 FunctionCall 12(@main(struct-PS_OUTPUT-vf41;) 55(param)
+              57:8(PS_OUTPUT) Load 55(param)
+                              Store 54(ps_output) 57
+              60:     52(ptr) AccessChain 54(ps_output) 15
+              61:    7(fvec4) Load 60
+                              Store 59(ps_output.color) 61
                               Return
                               FunctionEnd
 12(@main(struct-PS_OUTPUT-vf41;):           2 Function None 10
    11(ps_output):      9(ptr) FunctionParameter
               13:             Label
-              19:          16 Load 18(tex)
-              23:          20 Load 22(samp)
+              19:          16 Load 18(g_texdata.tex)
+              23:          20 Load 22(g_texdata.samp)
               25:          24 SampledImage 19 23
               27:    7(fvec4) ImageSampleImplicitLod 25 26
               29:          16 Load 28(g_texdata_array[1].tex)
@@ -243,12 +294,14 @@
               32:          24 SampledImage 29 31
               34:    7(fvec4) ImageSampleImplicitLod 32 33
               35:    7(fvec4) FAdd 27 34
-              37:          16 Load 36(g_texdata_array2[1].tex[0])
-              39:          20 Load 38(g_texdata_array2[1].samp[0])
-              40:          24 SampledImage 37 39
-              42:    7(fvec4) ImageSampleImplicitLod 40 41
-              43:    7(fvec4) FAdd 35 42
-              45:     44(ptr) AccessChain 11(ps_output) 15
-                              Store 45 43
+              41:     17(ptr) AccessChain 40(g_texdata_array2[1].tex) 15
+              42:          16 Load 41
+              46:     21(ptr) AccessChain 45(g_texdata_array2[1].samp) 15
+              47:          20 Load 46
+              48:          24 SampledImage 42 47
+              50:    7(fvec4) ImageSampleImplicitLod 48 49
+              51:    7(fvec4) FAdd 35 50
+              53:     52(ptr) AccessChain 11(ps_output) 15
+                              Store 53 51
                               Return
                               FunctionEnd
diff --git a/Test/baseResults/hlsl.structarray.flatten.geom.out b/Test/baseResults/hlsl.structarray.flatten.geom.out
index 702f06e..f88118d 100644
--- a/Test/baseResults/hlsl.structarray.flatten.geom.out
+++ b/Test/baseResults/hlsl.structarray.flatten.geom.out
@@ -49,25 +49,19 @@
 0:22      Sequence
 0:22        Sequence
 0:22          move second child to first child ( temp 4-component vector of float)
-0:?             'outStream_position' ( out 4-component vector of float Position)
+0:?             'outStream.position' ( out 4-component vector of float Position)
 0:22            position: direct index for structure ( temp 4-component vector of float)
 0:22              'vout' ( temp structure{ temp 4-component vector of float position,  temp 4-component vector of float color,  temp 2-component vector of float uv})
 0:22              Constant:
 0:22                0 (const int)
 0:22          move second child to first child ( temp 4-component vector of float)
-0:22            color: direct index for structure ( temp 4-component vector of float)
-0:22              'outStream' (layout( location=0) out structure{ temp 4-component vector of float color,  temp 2-component vector of float uv})
-0:22              Constant:
-0:22                0 (const int)
+0:?             'outStream.color' (layout( location=0) out 4-component vector of float)
 0:22            color: direct index for structure ( temp 4-component vector of float)
 0:22              'vout' ( temp structure{ temp 4-component vector of float position,  temp 4-component vector of float color,  temp 2-component vector of float uv})
 0:22              Constant:
 0:22                1 (const int)
 0:22          move second child to first child ( temp 2-component vector of float)
-0:22            uv: direct index for structure ( temp 2-component vector of float)
-0:22              'outStream' (layout( location=0) out structure{ temp 4-component vector of float color,  temp 2-component vector of float uv})
-0:22              Constant:
-0:22                1 (const int)
+0:?             'outStream.uv' (layout( location=1) out 2-component vector of float)
 0:22            uv: direct index for structure ( temp 2-component vector of float)
 0:22              'vout' ( temp structure{ temp 4-component vector of float position,  temp 4-component vector of float color,  temp 2-component vector of float uv})
 0:22              Constant:
@@ -84,7 +78,9 @@
 0:?         'outStream' ( temp structure{ temp 4-component vector of float position,  temp 4-component vector of float color,  temp 2-component vector of float uv})
 0:?   Linker Objects
 0:?     'vin' (layout( location=0) in 2-element array of structure{ temp 4-component vector of float position,  temp 4-component vector of float color,  temp 2-component vector of float uv})
-0:?     'outStream' (layout( location=0) out structure{ temp 4-component vector of float color,  temp 2-component vector of float uv})
+0:?     'outStream.position' ( out 4-component vector of float Position)
+0:?     'outStream.color' (layout( location=0) out 4-component vector of float)
+0:?     'outStream.uv' (layout( location=1) out 2-component vector of float)
 
 
 Linked geometry stage:
@@ -140,25 +136,19 @@
 0:22      Sequence
 0:22        Sequence
 0:22          move second child to first child ( temp 4-component vector of float)
-0:?             'outStream_position' ( out 4-component vector of float Position)
+0:?             'outStream.position' ( out 4-component vector of float Position)
 0:22            position: direct index for structure ( temp 4-component vector of float)
 0:22              'vout' ( temp structure{ temp 4-component vector of float position,  temp 4-component vector of float color,  temp 2-component vector of float uv})
 0:22              Constant:
 0:22                0 (const int)
 0:22          move second child to first child ( temp 4-component vector of float)
-0:22            color: direct index for structure ( temp 4-component vector of float)
-0:22              'outStream' (layout( location=0) out structure{ temp 4-component vector of float color,  temp 2-component vector of float uv})
-0:22              Constant:
-0:22                0 (const int)
+0:?             'outStream.color' (layout( location=0) out 4-component vector of float)
 0:22            color: direct index for structure ( temp 4-component vector of float)
 0:22              'vout' ( temp structure{ temp 4-component vector of float position,  temp 4-component vector of float color,  temp 2-component vector of float uv})
 0:22              Constant:
 0:22                1 (const int)
 0:22          move second child to first child ( temp 2-component vector of float)
-0:22            uv: direct index for structure ( temp 2-component vector of float)
-0:22              'outStream' (layout( location=0) out structure{ temp 4-component vector of float color,  temp 2-component vector of float uv})
-0:22              Constant:
-0:22                1 (const int)
+0:?             'outStream.uv' (layout( location=1) out 2-component vector of float)
 0:22            uv: direct index for structure ( temp 2-component vector of float)
 0:22              'vout' ( temp structure{ temp 4-component vector of float position,  temp 4-component vector of float color,  temp 2-component vector of float uv})
 0:22              Constant:
@@ -175,16 +165,18 @@
 0:?         'outStream' ( temp structure{ temp 4-component vector of float position,  temp 4-component vector of float color,  temp 2-component vector of float uv})
 0:?   Linker Objects
 0:?     'vin' (layout( location=0) in 2-element array of structure{ temp 4-component vector of float position,  temp 4-component vector of float color,  temp 2-component vector of float uv})
-0:?     'outStream' (layout( location=0) out structure{ temp 4-component vector of float color,  temp 2-component vector of float uv})
+0:?     'outStream.position' ( out 4-component vector of float Position)
+0:?     'outStream.color' (layout( location=0) out 4-component vector of float)
+0:?     'outStream.uv' (layout( location=1) out 2-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80001
-// Id's are bound by 61
+// Generated by (magic number): 80007
+// Id's are bound by 58
 
                               Capability Geometry
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Geometry 4  "main" 38 43 53
+                              EntryPoint Geometry 4  "main" 38 41 45 50
                               ExecutionMode 4 InputLines
                               ExecutionMode 4 Invocations 1
                               ExecutionMode 4 OutputTriangleStrip
@@ -203,19 +195,18 @@
                               Name 17  "vin"
                               Name 18  "outStream"
                               Name 21  "vout"
-                              Name 38  "outStream_position"
-                              Name 41  "PS_IN"
-                              MemberName 41(PS_IN) 0  "color"
-                              MemberName 41(PS_IN) 1  "uv"
-                              Name 43  "outStream"
-                              Name 51  "vin"
-                              Name 53  "vin"
-                              Name 55  "outStream"
-                              Name 56  "param"
-                              Name 58  "param"
-                              Decorate 38(outStream_position) BuiltIn Position
-                              Decorate 43(outStream) Location 0
-                              Decorate 53(vin) Location 0
+                              Name 38  "outStream.position"
+                              Name 41  "outStream.color"
+                              Name 45  "outStream.uv"
+                              Name 48  "vin"
+                              Name 50  "vin"
+                              Name 52  "outStream"
+                              Name 53  "param"
+                              Name 55  "param"
+                              Decorate 38(outStream.position) BuiltIn Position
+                              Decorate 41(outStream.color) Location 0
+                              Decorate 45(outStream.uv) Location 1
+                              Decorate 50(vin) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -236,26 +227,25 @@
               29:             TypePointer Function 8(fvec2)
               33:     22(int) Constant 0
               37:             TypePointer Output 7(fvec4)
-38(outStream_position):     37(ptr) Variable Output
-       41(PS_IN):             TypeStruct 7(fvec4) 8(fvec2)
-              42:             TypePointer Output 41(PS_IN)
-   43(outStream):     42(ptr) Variable Output
-              49:             TypePointer Output 8(fvec2)
-              52:             TypePointer Input 12
-         53(vin):     52(ptr) Variable Input
+38(outStream.position):     37(ptr) Variable Output
+41(outStream.color):     37(ptr) Variable Output
+              44:             TypePointer Output 8(fvec2)
+45(outStream.uv):     44(ptr) Variable Output
+              49:             TypePointer Input 12
+         50(vin):     49(ptr) Variable Input
          4(main):           2 Function None 3
                5:             Label
-         51(vin):     13(ptr) Variable Function
-   55(outStream):     15(ptr) Variable Function
-       56(param):     13(ptr) Variable Function
-       58(param):     15(ptr) Variable Function
-              54:          12 Load 53(vin)
-                              Store 51(vin) 54
-              57:          12 Load 51(vin)
-                              Store 56(param) 57
-              59:           2 FunctionCall 19(@main(struct-VertexData-vf4-vf4-vf21[2];struct-PS_IN-vf4-vf4-vf21;) 56(param) 58(param)
-              60:   14(PS_IN) Load 58(param)
-                              Store 55(outStream) 60
+         48(vin):     13(ptr) Variable Function
+   52(outStream):     15(ptr) Variable Function
+       53(param):     13(ptr) Variable Function
+       55(param):     15(ptr) Variable Function
+              51:          12 Load 50(vin)
+                              Store 48(vin) 51
+              54:          12 Load 48(vin)
+                              Store 53(param) 54
+              56:           2 FunctionCall 19(@main(struct-VertexData-vf4-vf4-vf21[2];struct-PS_IN-vf4-vf4-vf21;) 53(param) 55(param)
+              57:   14(PS_IN) Load 55(param)
+                              Store 52(outStream) 57
                               Return
                               FunctionEnd
 19(@main(struct-VertexData-vf4-vf4-vf21[2];struct-PS_IN-vf4-vf4-vf21;):           2 Function None 16
@@ -277,15 +267,13 @@
                               Store 36 35
               39:     24(ptr) AccessChain 21(vout) 33
               40:    7(fvec4) Load 39
-                              Store 38(outStream_position) 40
-              44:     24(ptr) AccessChain 21(vout) 23
-              45:    7(fvec4) Load 44
-              46:     37(ptr) AccessChain 43(outStream) 33
-                              Store 46 45
-              47:     29(ptr) AccessChain 21(vout) 28
-              48:    8(fvec2) Load 47
-              50:     49(ptr) AccessChain 43(outStream) 23
-                              Store 50 48
+                              Store 38(outStream.position) 40
+              42:     24(ptr) AccessChain 21(vout) 23
+              43:    7(fvec4) Load 42
+                              Store 41(outStream.color) 43
+              46:     29(ptr) AccessChain 21(vout) 28
+              47:    8(fvec2) Load 46
+                              Store 45(outStream.uv) 47
                               EmitVertex
                               Return
                               FunctionEnd
diff --git a/Test/baseResults/hlsl.structbuffer.append.fn.frag.out b/Test/baseResults/hlsl.structbuffer.append.fn.frag.out
new file mode 100644
index 0000000..df08655
--- /dev/null
+++ b/Test/baseResults/hlsl.structbuffer.append.fn.frag.out
@@ -0,0 +1,280 @@
+hlsl.structbuffer.append.fn.frag
+Shader version: 500
+gl_FragCoord origin is upper left
+0:? Sequence
+0:8  Function Definition: Fn2(block--vf4[0]1;block--vf4[0]1; ( temp 4-component vector of float)
+0:8    Function Parameters: 
+0:8      'arg_a' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of 4-component vector of float @data})
+0:8      'arg_a@count' ( buffer block{layout( row_major std430) buffer uint @count})
+0:8      'arg_c' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of 4-component vector of float @data})
+0:8      'arg_c@count' ( buffer block{layout( row_major std430) buffer uint @count})
+0:?     Sequence
+0:9      move second child to first child ( temp 4-component vector of float)
+0:9        indirect index ( buffer 4-component vector of float)
+0:9          @data: direct index for structure ( buffer unsized 1-element array of 4-component vector of float)
+0:9            'arg_a' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of 4-component vector of float @data})
+0:9            Constant:
+0:9              0 (const uint)
+0:9          AtomicAdd ( temp uint)
+0:9            @count: direct index for structure ( temp uint)
+0:9              'arg_a@count' ( buffer block{layout( row_major std430) buffer uint @count})
+0:9              Constant:
+0:9                0 (const int)
+0:9            Constant:
+0:9              1 (const uint)
+0:?         Constant:
+0:?           1.000000
+0:?           2.000000
+0:?           3.000000
+0:?           4.000000
+0:10      Branch: Return with expression
+0:10        indirect index ( buffer 4-component vector of float)
+0:10          @data: direct index for structure ( buffer unsized 1-element array of 4-component vector of float)
+0:10            'arg_c' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of 4-component vector of float @data})
+0:10            Constant:
+0:10              0 (const uint)
+0:10          add ( temp uint)
+0:10            AtomicAdd ( temp uint)
+0:10              @count: direct index for structure ( temp uint)
+0:10                'arg_c@count' ( buffer block{layout( row_major std430) buffer uint @count})
+0:10                Constant:
+0:10                  0 (const int)
+0:10              Constant:
+0:10                4294967295 (const uint)
+0:10            Constant:
+0:10              -1 (const int)
+0:19  Function Definition: @main(u1; ( temp 4-component vector of float)
+0:19    Function Parameters: 
+0:19      'pos' ( in uint)
+0:?     Sequence
+0:22      Branch: Return with expression
+0:22        Function Call: Fn2(block--vf4[0]1;block--vf4[0]1; ( temp 4-component vector of float)
+0:22          'sbuf_a' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of 4-component vector of float @data})
+0:22          'sbuf_a@count' ( buffer block{layout( row_major std430) buffer uint @count})
+0:22          'sbuf_c' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of 4-component vector of float @data})
+0:22          'sbuf_c@count' ( buffer block{layout( row_major std430) buffer uint @count})
+0:19  Function Definition: main( ( temp void)
+0:19    Function Parameters: 
+0:?     Sequence
+0:19      move second child to first child ( temp uint)
+0:?         'pos' ( temp uint)
+0:?         'pos' (layout( location=0) flat in uint)
+0:19      move second child to first child ( temp 4-component vector of float)
+0:?         '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+0:19        Function Call: @main(u1; ( temp 4-component vector of float)
+0:?           'pos' ( temp uint)
+0:?   Linker Objects
+0:?     'sbuf_a' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of 4-component vector of float @data})
+0:?     'sbuf_a@count' (layout( row_major std430) buffer block{layout( row_major std430) buffer uint @count})
+0:?     'sbuf_c' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of 4-component vector of float @data})
+0:?     'sbuf_c@count' (layout( row_major std430) buffer block{layout( row_major std430) buffer uint @count})
+0:?     'sbuf_unused' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of 4-component vector of float @data})
+0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+0:?     'pos' (layout( location=0) flat in uint)
+
+
+Linked fragment stage:
+
+
+Shader version: 500
+gl_FragCoord origin is upper left
+0:? Sequence
+0:8  Function Definition: Fn2(block--vf4[0]1;block--vf4[0]1; ( temp 4-component vector of float)
+0:8    Function Parameters: 
+0:8      'arg_a' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of 4-component vector of float @data})
+0:8      'arg_a@count' ( buffer block{layout( row_major std430) buffer uint @count})
+0:8      'arg_c' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of 4-component vector of float @data})
+0:8      'arg_c@count' ( buffer block{layout( row_major std430) buffer uint @count})
+0:?     Sequence
+0:9      move second child to first child ( temp 4-component vector of float)
+0:9        indirect index ( buffer 4-component vector of float)
+0:9          @data: direct index for structure ( buffer unsized 1-element array of 4-component vector of float)
+0:9            'arg_a' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of 4-component vector of float @data})
+0:9            Constant:
+0:9              0 (const uint)
+0:9          AtomicAdd ( temp uint)
+0:9            @count: direct index for structure ( temp uint)
+0:9              'arg_a@count' ( buffer block{layout( row_major std430) buffer uint @count})
+0:9              Constant:
+0:9                0 (const int)
+0:9            Constant:
+0:9              1 (const uint)
+0:?         Constant:
+0:?           1.000000
+0:?           2.000000
+0:?           3.000000
+0:?           4.000000
+0:10      Branch: Return with expression
+0:10        indirect index ( buffer 4-component vector of float)
+0:10          @data: direct index for structure ( buffer unsized 1-element array of 4-component vector of float)
+0:10            'arg_c' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of 4-component vector of float @data})
+0:10            Constant:
+0:10              0 (const uint)
+0:10          add ( temp uint)
+0:10            AtomicAdd ( temp uint)
+0:10              @count: direct index for structure ( temp uint)
+0:10                'arg_c@count' ( buffer block{layout( row_major std430) buffer uint @count})
+0:10                Constant:
+0:10                  0 (const int)
+0:10              Constant:
+0:10                4294967295 (const uint)
+0:10            Constant:
+0:10              -1 (const int)
+0:19  Function Definition: @main(u1; ( temp 4-component vector of float)
+0:19    Function Parameters: 
+0:19      'pos' ( in uint)
+0:?     Sequence
+0:22      Branch: Return with expression
+0:22        Function Call: Fn2(block--vf4[0]1;block--vf4[0]1; ( temp 4-component vector of float)
+0:22          'sbuf_a' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of 4-component vector of float @data})
+0:22          'sbuf_a@count' ( buffer block{layout( row_major std430) buffer uint @count})
+0:22          'sbuf_c' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of 4-component vector of float @data})
+0:22          'sbuf_c@count' ( buffer block{layout( row_major std430) buffer uint @count})
+0:19  Function Definition: main( ( temp void)
+0:19    Function Parameters: 
+0:?     Sequence
+0:19      move second child to first child ( temp uint)
+0:?         'pos' ( temp uint)
+0:?         'pos' (layout( location=0) flat in uint)
+0:19      move second child to first child ( temp 4-component vector of float)
+0:?         '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+0:19        Function Call: @main(u1; ( temp 4-component vector of float)
+0:?           'pos' ( temp uint)
+0:?   Linker Objects
+0:?     'sbuf_a' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of 4-component vector of float @data})
+0:?     'sbuf_a@count' (layout( row_major std430) buffer block{layout( row_major std430) buffer uint @count})
+0:?     'sbuf_c' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of 4-component vector of float @data})
+0:?     'sbuf_c@count' (layout( row_major std430) buffer block{layout( row_major std430) buffer uint @count})
+0:?     'sbuf_unused' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of 4-component vector of float @data})
+0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+0:?     'pos' (layout( location=0) flat in uint)
+
+error: SPIRV-Tools Validation Errors
+error: Structure id 12 decorated as BufferBlock must be explicitly laid out with Offset decorations.
+  %__0 = OpTypeStruct %uint
+
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 70
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 58 61
+                              ExecutionMode 4 OriginUpperLeft
+                              Source HLSL 500
+                              Name 4  "main"
+                              Name 9  ""
+                              MemberName 9 0  "@data"
+                              Name 12  ""
+                              MemberName 12 0  "@count"
+                              Name 19  "Fn2(block--vf4[0]1;block--vf4[0]1;"
+                              Name 15  "arg_a"
+                              Name 16  "arg_a@count"
+                              Name 17  "arg_c"
+                              Name 18  "arg_c@count"
+                              Name 24  "@main(u1;"
+                              Name 23  "pos"
+                              Name 49  "sbuf_a"
+                              Name 50  "sbuf_a@count"
+                              Name 51  "sbuf_c"
+                              Name 52  "sbuf_c@count"
+                              Name 56  "pos"
+                              Name 58  "pos"
+                              Name 61  "@entryPointOutput"
+                              Name 62  "param"
+                              Name 65  "sbuf_a@count"
+                              MemberName 65(sbuf_a@count) 0  "@count"
+                              Name 67  "sbuf_a@count"
+                              Name 68  "sbuf_c@count"
+                              Name 69  "sbuf_unused"
+                              Decorate 8 ArrayStride 16
+                              MemberDecorate 9 0 Offset 0
+                              Decorate 9 BufferBlock
+                              Decorate 12 BufferBlock
+                              Decorate 49(sbuf_a) DescriptorSet 0
+                              Decorate 50(sbuf_a@count) DescriptorSet 0
+                              Decorate 51(sbuf_c) DescriptorSet 0
+                              Decorate 52(sbuf_c@count) DescriptorSet 0
+                              Decorate 58(pos) Flat
+                              Decorate 58(pos) Location 0
+                              Decorate 61(@entryPointOutput) Location 0
+                              MemberDecorate 65(sbuf_a@count) 0 Offset 0
+                              Decorate 65(sbuf_a@count) BufferBlock
+                              Decorate 67(sbuf_a@count) DescriptorSet 0
+                              Decorate 68(sbuf_c@count) DescriptorSet 0
+                              Decorate 69(sbuf_unused) DescriptorSet 0
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+               8:             TypeRuntimeArray 7(fvec4)
+               9:             TypeStruct 8
+              10:             TypePointer Uniform 9(struct)
+              11:             TypeInt 32 0
+              12:             TypeStruct 11(int)
+              13:             TypePointer Uniform 12(struct)
+              14:             TypeFunction 7(fvec4) 10(ptr) 13(ptr) 10(ptr) 13(ptr)
+              21:             TypePointer Function 11(int)
+              22:             TypeFunction 7(fvec4) 21(ptr)
+              26:             TypeInt 32 1
+              27:     26(int) Constant 0
+              28:             TypePointer Uniform 11(int)
+              30:     11(int) Constant 1
+              31:     11(int) Constant 0
+              33:    6(float) Constant 1065353216
+              34:    6(float) Constant 1073741824
+              35:    6(float) Constant 1077936128
+              36:    6(float) Constant 1082130432
+              37:    7(fvec4) ConstantComposite 33 34 35 36
+              38:             TypePointer Uniform 7(fvec4)
+              41:     11(int) Constant 4294967295
+              43:     26(int) Constant 4294967295
+      49(sbuf_a):     10(ptr) Variable Uniform
+50(sbuf_a@count):     13(ptr) Variable Uniform
+      51(sbuf_c):     10(ptr) Variable Uniform
+52(sbuf_c@count):     13(ptr) Variable Uniform
+              57:             TypePointer Input 11(int)
+         58(pos):     57(ptr) Variable Input
+              60:             TypePointer Output 7(fvec4)
+61(@entryPointOutput):     60(ptr) Variable Output
+65(sbuf_a@count):             TypeStruct 11(int)
+              66:             TypePointer Uniform 65(sbuf_a@count)
+67(sbuf_a@count):     66(ptr) Variable Uniform
+68(sbuf_c@count):     66(ptr) Variable Uniform
+ 69(sbuf_unused):     10(ptr) Variable Uniform
+         4(main):           2 Function None 3
+               5:             Label
+         56(pos):     21(ptr) Variable Function
+       62(param):     21(ptr) Variable Function
+              59:     11(int) Load 58(pos)
+                              Store 56(pos) 59
+              63:     11(int) Load 56(pos)
+                              Store 62(param) 63
+              64:    7(fvec4) FunctionCall 24(@main(u1;) 62(param)
+                              Store 61(@entryPointOutput) 64
+                              Return
+                              FunctionEnd
+19(Fn2(block--vf4[0]1;block--vf4[0]1;):    7(fvec4) Function None 14
+       15(arg_a):     10(ptr) FunctionParameter
+ 16(arg_a@count):     13(ptr) FunctionParameter
+       17(arg_c):     10(ptr) FunctionParameter
+ 18(arg_c@count):     13(ptr) FunctionParameter
+              20:             Label
+              29:     28(ptr) AccessChain 16(arg_a@count) 27
+              32:     11(int) AtomicIAdd 29 30 31 30
+              39:     38(ptr) AccessChain 15(arg_a) 27 32
+                              Store 39 37
+              40:     28(ptr) AccessChain 18(arg_c@count) 27
+              42:     11(int) AtomicIAdd 40 30 31 41
+              44:     11(int) IAdd 42 43
+              45:     38(ptr) AccessChain 17(arg_c) 27 44
+              46:    7(fvec4) Load 45
+                              ReturnValue 46
+                              FunctionEnd
+   24(@main(u1;):    7(fvec4) Function None 22
+         23(pos):     21(ptr) FunctionParameter
+              25:             Label
+              53:    7(fvec4) FunctionCall 19(Fn2(block--vf4[0]1;block--vf4[0]1;) 49(sbuf_a) 50(sbuf_a@count) 51(sbuf_c) 52(sbuf_c@count)
+                              ReturnValue 53
+                              FunctionEnd
diff --git a/Test/baseResults/hlsl.structbuffer.append.frag.out b/Test/baseResults/hlsl.structbuffer.append.frag.out
index 323e960..dff47f8 100644
--- a/Test/baseResults/hlsl.structbuffer.append.frag.out
+++ b/Test/baseResults/hlsl.structbuffer.append.frag.out
@@ -8,17 +8,17 @@
 0:?     Sequence
 0:8      move second child to first child ( temp 4-component vector of float)
 0:8        indirect index (layout( row_major std430) buffer 4-component vector of float)
-0:8          @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of 4-component vector of float)
-0:8            'sbuf_a' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of 4-component vector of float @data})
+0:8          @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of 4-component vector of float)
+0:8            'sbuf_a' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of 4-component vector of float @data})
 0:8            Constant:
 0:8              0 (const uint)
 0:8          AtomicAdd ( temp uint)
-0:8            @count: direct index for structure ( temp int)
-0:8              'sbuf_a@count' (layout( row_major std430) buffer block{layout( row_major std430) buffer int @count})
+0:8            @count: direct index for structure ( temp uint)
+0:8              'sbuf_a@count' (layout( row_major std430) buffer block{layout( row_major std430) buffer uint @count})
 0:8              Constant:
 0:8                0 (const int)
 0:8            Constant:
-0:8              1 (const int)
+0:8              1 (const uint)
 0:?         Constant:
 0:?           1.000000
 0:?           2.000000
@@ -26,18 +26,18 @@
 0:?           4.000000
 0:10      Branch: Return with expression
 0:10        indirect index (layout( row_major std430) buffer 4-component vector of float)
-0:10          @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of 4-component vector of float)
-0:10            'sbuf_c' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of 4-component vector of float @data})
+0:10          @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of 4-component vector of float)
+0:10            'sbuf_c' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of 4-component vector of float @data})
 0:10            Constant:
 0:10              0 (const uint)
 0:10          add ( temp uint)
 0:10            AtomicAdd ( temp uint)
-0:10              @count: direct index for structure ( temp int)
-0:10                'sbuf_c@count' (layout( row_major std430) buffer block{layout( row_major std430) buffer int @count})
+0:10              @count: direct index for structure ( temp uint)
+0:10                'sbuf_c@count' (layout( row_major std430) buffer block{layout( row_major std430) buffer uint @count})
 0:10                Constant:
 0:10                  0 (const int)
 0:10              Constant:
-0:10                -1 (const int)
+0:10                4294967295 (const uint)
 0:10            Constant:
 0:10              -1 (const int)
 0:7  Function Definition: main( ( temp void)
@@ -45,19 +45,19 @@
 0:?     Sequence
 0:7      move second child to first child ( temp uint)
 0:?         'pos' ( temp uint)
-0:?         'pos' (layout( location=0) in uint)
+0:?         'pos' (layout( location=0) flat in uint)
 0:7      move second child to first child ( temp 4-component vector of float)
 0:?         '@entryPointOutput' (layout( location=0) out 4-component vector of float)
 0:7        Function Call: @main(u1; ( temp 4-component vector of float)
 0:?           'pos' ( temp uint)
 0:?   Linker Objects
-0:?     'sbuf_a' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of 4-component vector of float @data})
-0:?     'sbuf_a@count' (layout( row_major std430) buffer block{layout( row_major std430) buffer int @count})
-0:?     'sbuf_c' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of 4-component vector of float @data})
-0:?     'sbuf_c@count' (layout( row_major std430) buffer block{layout( row_major std430) buffer int @count})
-0:?     'sbuf_unused' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of 4-component vector of float @data})
+0:?     'sbuf_a' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of 4-component vector of float @data})
+0:?     'sbuf_a@count' (layout( row_major std430) buffer block{layout( row_major std430) buffer uint @count})
+0:?     'sbuf_c' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of 4-component vector of float @data})
+0:?     'sbuf_c@count' (layout( row_major std430) buffer block{layout( row_major std430) buffer uint @count})
+0:?     'sbuf_unused' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of 4-component vector of float @data})
 0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
-0:?     'pos' (layout( location=0) in uint)
+0:?     'pos' (layout( location=0) flat in uint)
 
 
 Linked fragment stage:
@@ -72,17 +72,17 @@
 0:?     Sequence
 0:8      move second child to first child ( temp 4-component vector of float)
 0:8        indirect index (layout( row_major std430) buffer 4-component vector of float)
-0:8          @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of 4-component vector of float)
-0:8            'sbuf_a' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of 4-component vector of float @data})
+0:8          @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of 4-component vector of float)
+0:8            'sbuf_a' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of 4-component vector of float @data})
 0:8            Constant:
 0:8              0 (const uint)
 0:8          AtomicAdd ( temp uint)
-0:8            @count: direct index for structure ( temp int)
-0:8              'sbuf_a@count' (layout( row_major std430) buffer block{layout( row_major std430) buffer int @count})
+0:8            @count: direct index for structure ( temp uint)
+0:8              'sbuf_a@count' (layout( row_major std430) buffer block{layout( row_major std430) buffer uint @count})
 0:8              Constant:
 0:8                0 (const int)
 0:8            Constant:
-0:8              1 (const int)
+0:8              1 (const uint)
 0:?         Constant:
 0:?           1.000000
 0:?           2.000000
@@ -90,18 +90,18 @@
 0:?           4.000000
 0:10      Branch: Return with expression
 0:10        indirect index (layout( row_major std430) buffer 4-component vector of float)
-0:10          @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of 4-component vector of float)
-0:10            'sbuf_c' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of 4-component vector of float @data})
+0:10          @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of 4-component vector of float)
+0:10            'sbuf_c' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of 4-component vector of float @data})
 0:10            Constant:
 0:10              0 (const uint)
 0:10          add ( temp uint)
 0:10            AtomicAdd ( temp uint)
-0:10              @count: direct index for structure ( temp int)
-0:10                'sbuf_c@count' (layout( row_major std430) buffer block{layout( row_major std430) buffer int @count})
+0:10              @count: direct index for structure ( temp uint)
+0:10                'sbuf_c@count' (layout( row_major std430) buffer block{layout( row_major std430) buffer uint @count})
 0:10                Constant:
 0:10                  0 (const int)
 0:10              Constant:
-0:10                -1 (const int)
+0:10                4294967295 (const uint)
 0:10            Constant:
 0:10              -1 (const int)
 0:7  Function Definition: main( ( temp void)
@@ -109,22 +109,22 @@
 0:?     Sequence
 0:7      move second child to first child ( temp uint)
 0:?         'pos' ( temp uint)
-0:?         'pos' (layout( location=0) in uint)
+0:?         'pos' (layout( location=0) flat in uint)
 0:7      move second child to first child ( temp 4-component vector of float)
 0:?         '@entryPointOutput' (layout( location=0) out 4-component vector of float)
 0:7        Function Call: @main(u1; ( temp 4-component vector of float)
 0:?           'pos' ( temp uint)
 0:?   Linker Objects
-0:?     'sbuf_a' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of 4-component vector of float @data})
-0:?     'sbuf_a@count' (layout( row_major std430) buffer block{layout( row_major std430) buffer int @count})
-0:?     'sbuf_c' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of 4-component vector of float @data})
-0:?     'sbuf_c@count' (layout( row_major std430) buffer block{layout( row_major std430) buffer int @count})
-0:?     'sbuf_unused' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of 4-component vector of float @data})
+0:?     'sbuf_a' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of 4-component vector of float @data})
+0:?     'sbuf_a@count' (layout( row_major std430) buffer block{layout( row_major std430) buffer uint @count})
+0:?     'sbuf_c' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of 4-component vector of float @data})
+0:?     'sbuf_c@count' (layout( row_major std430) buffer block{layout( row_major std430) buffer uint @count})
+0:?     'sbuf_unused' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of 4-component vector of float @data})
 0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
-0:?     'pos' (layout( location=0) in uint)
+0:?     'pos' (layout( location=0) flat in uint)
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 56
 
                               Capability Shader
@@ -142,8 +142,8 @@
                               Name 20  "sbuf_a@count"
                               MemberName 20(sbuf_a@count) 0  "@count"
                               Name 22  "sbuf_a@count"
-                              Name 36  "sbuf_c"
-                              Name 37  "sbuf_c@count"
+                              Name 35  "sbuf_c"
+                              Name 36  "sbuf_c@count"
                               Name 46  "pos"
                               Name 48  "pos"
                               Name 51  "@entryPointOutput"
@@ -156,8 +156,9 @@
                               MemberDecorate 20(sbuf_a@count) 0 Offset 0
                               Decorate 20(sbuf_a@count) BufferBlock
                               Decorate 22(sbuf_a@count) DescriptorSet 0
-                              Decorate 36(sbuf_c) DescriptorSet 0
-                              Decorate 37(sbuf_c@count) DescriptorSet 0
+                              Decorate 35(sbuf_c) DescriptorSet 0
+                              Decorate 36(sbuf_c@count) DescriptorSet 0
+                              Decorate 48(pos) Flat
                               Decorate 48(pos) Location 0
                               Decorate 51(@entryPointOutput) Location 0
                               Decorate 55(sbuf_unused) DescriptorSet 0
@@ -174,22 +175,22 @@
       17(sbuf_a):     16(ptr) Variable Uniform
               18:             TypeInt 32 1
               19:     18(int) Constant 0
-20(sbuf_a@count):             TypeStruct 18(int)
+20(sbuf_a@count):             TypeStruct 6(int)
               21:             TypePointer Uniform 20(sbuf_a@count)
 22(sbuf_a@count):     21(ptr) Variable Uniform
-              23:             TypePointer Uniform 18(int)
-              25:     18(int) Constant 1
-              26:      6(int) Constant 1
-              27:      6(int) Constant 0
-              29:    8(float) Constant 1065353216
-              30:    8(float) Constant 1073741824
-              31:    8(float) Constant 1077936128
-              32:    8(float) Constant 1082130432
-              33:    9(fvec4) ConstantComposite 29 30 31 32
-              34:             TypePointer Uniform 9(fvec4)
-      36(sbuf_c):     16(ptr) Variable Uniform
-37(sbuf_c@count):     21(ptr) Variable Uniform
-              39:     18(int) Constant 4294967295
+              23:             TypePointer Uniform 6(int)
+              25:      6(int) Constant 1
+              26:      6(int) Constant 0
+              28:    8(float) Constant 1065353216
+              29:    8(float) Constant 1073741824
+              30:    8(float) Constant 1077936128
+              31:    8(float) Constant 1082130432
+              32:    9(fvec4) ConstantComposite 28 29 30 31
+              33:             TypePointer Uniform 9(fvec4)
+      35(sbuf_c):     16(ptr) Variable Uniform
+36(sbuf_c@count):     21(ptr) Variable Uniform
+              38:      6(int) Constant 4294967295
+              40:     18(int) Constant 4294967295
               47:             TypePointer Input 6(int)
          48(pos):     47(ptr) Variable Input
               50:             TypePointer Output 9(fvec4)
@@ -211,13 +212,13 @@
          11(pos):      7(ptr) FunctionParameter
               13:             Label
               24:     23(ptr) AccessChain 22(sbuf_a@count) 19
-              28:      6(int) AtomicIAdd 24 26 27 25
-              35:     34(ptr) AccessChain 17(sbuf_a) 19 28
-                              Store 35 33
-              38:     23(ptr) AccessChain 37(sbuf_c@count) 19
-              40:      6(int) AtomicIAdd 38 26 27 39
-              41:      6(int) IAdd 40 39
-              42:     34(ptr) AccessChain 36(sbuf_c) 19 41
+              27:      6(int) AtomicIAdd 24 25 26 25
+              34:     33(ptr) AccessChain 17(sbuf_a) 19 27
+                              Store 34 32
+              37:     23(ptr) AccessChain 36(sbuf_c@count) 19
+              39:      6(int) AtomicIAdd 37 25 26 38
+              41:      6(int) IAdd 39 40
+              42:     33(ptr) AccessChain 35(sbuf_c) 19 41
               43:    9(fvec4) Load 42
                               ReturnValue 43
                               FunctionEnd
diff --git a/Test/baseResults/hlsl.structbuffer.atomics.frag.out b/Test/baseResults/hlsl.structbuffer.atomics.frag.out
index c3a3f87..68d93c1 100644
--- a/Test/baseResults/hlsl.structbuffer.atomics.frag.out
+++ b/Test/baseResults/hlsl.structbuffer.atomics.frag.out
@@ -6,10 +6,10 @@
 0:5    Function Parameters: 
 0:5      'pos' ( in uint)
 0:?     Sequence
-0:8      AtomicAdd ( temp void)
+0:8      AtomicAdd ( temp uint)
 0:8        indirect index (layout( row_major std430) buffer uint)
-0:8          @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:8            'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:8          @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:8            'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:8            Constant:
 0:8              0 (const uint)
 0:8          right-shift ( temp int)
@@ -23,8 +23,8 @@
 0:9        'u' ( temp uint)
 0:9        AtomicAdd ( temp uint)
 0:9          indirect index (layout( row_major std430) buffer uint)
-0:9            @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:9              'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:9            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:9              'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:9              Constant:
 0:9                0 (const uint)
 0:9            right-shift ( temp int)
@@ -34,10 +34,10 @@
 0:9                2 (const int)
 0:9          Constant:
 0:9            1 (const int)
-0:10      AtomicAnd ( temp void)
+0:10      AtomicAnd ( temp uint)
 0:10        indirect index (layout( row_major std430) buffer uint)
-0:10          @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:10            'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:10          @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:10            'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:10            Constant:
 0:10              0 (const uint)
 0:10          right-shift ( temp int)
@@ -51,8 +51,8 @@
 0:11        'u' ( temp uint)
 0:11        AtomicAnd ( temp uint)
 0:11          indirect index (layout( row_major std430) buffer uint)
-0:11            @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:11              'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:11            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:11              'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:11              Constant:
 0:11                0 (const uint)
 0:11            right-shift ( temp int)
@@ -67,8 +67,8 @@
 0:12        Convert int to uint ( temp uint)
 0:12          AtomicCompSwap ( temp int)
 0:12            indirect index (layout( row_major std430) buffer uint)
-0:12              @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:12                'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:12              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:12                'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:12                Constant:
 0:12                  0 (const uint)
 0:12              right-shift ( temp int)
@@ -84,8 +84,8 @@
 0:14        'u' ( temp uint)
 0:14        AtomicExchange ( temp uint)
 0:14          indirect index (layout( row_major std430) buffer uint)
-0:14            @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:14              'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:14            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:14              'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:14              Constant:
 0:14                0 (const uint)
 0:14            right-shift ( temp int)
@@ -95,10 +95,10 @@
 0:14                2 (const int)
 0:14          Constant:
 0:14            1 (const int)
-0:15      AtomicMax ( temp void)
+0:15      AtomicMax ( temp uint)
 0:15        indirect index (layout( row_major std430) buffer uint)
-0:15          @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:15            'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:15          @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:15            'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:15            Constant:
 0:15              0 (const uint)
 0:15          right-shift ( temp int)
@@ -112,8 +112,8 @@
 0:16        'u' ( temp uint)
 0:16        AtomicMax ( temp uint)
 0:16          indirect index (layout( row_major std430) buffer uint)
-0:16            @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:16              'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:16            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:16              'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:16              Constant:
 0:16                0 (const uint)
 0:16            right-shift ( temp int)
@@ -123,10 +123,10 @@
 0:16                2 (const int)
 0:16          Constant:
 0:16            1 (const int)
-0:17      AtomicMin ( temp void)
+0:17      AtomicMin ( temp uint)
 0:17        indirect index (layout( row_major std430) buffer uint)
-0:17          @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:17            'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:17          @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:17            'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:17            Constant:
 0:17              0 (const uint)
 0:17          right-shift ( temp int)
@@ -140,8 +140,8 @@
 0:18        'u' ( temp uint)
 0:18        AtomicMin ( temp uint)
 0:18          indirect index (layout( row_major std430) buffer uint)
-0:18            @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:18              'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:18            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:18              'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:18              Constant:
 0:18                0 (const uint)
 0:18            right-shift ( temp int)
@@ -151,10 +151,10 @@
 0:18                2 (const int)
 0:18          Constant:
 0:18            1 (const int)
-0:19      AtomicOr ( temp void)
+0:19      AtomicOr ( temp uint)
 0:19        indirect index (layout( row_major std430) buffer uint)
-0:19          @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:19            'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:19          @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:19            'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:19            Constant:
 0:19              0 (const uint)
 0:19          right-shift ( temp int)
@@ -168,8 +168,8 @@
 0:20        'u' ( temp uint)
 0:20        AtomicOr ( temp uint)
 0:20          indirect index (layout( row_major std430) buffer uint)
-0:20            @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:20              'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:20            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:20              'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:20              Constant:
 0:20                0 (const uint)
 0:20            right-shift ( temp int)
@@ -179,10 +179,10 @@
 0:20                2 (const int)
 0:20          Constant:
 0:20            1 (const int)
-0:21      AtomicXor ( temp void)
+0:21      AtomicXor ( temp uint)
 0:21        indirect index (layout( row_major std430) buffer uint)
-0:21          @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:21            'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:21          @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:21            'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:21            Constant:
 0:21              0 (const uint)
 0:21          right-shift ( temp int)
@@ -196,8 +196,8 @@
 0:22        'u' ( temp uint)
 0:22        AtomicXor ( temp uint)
 0:22          indirect index (layout( row_major std430) buffer uint)
-0:22            @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:22              'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:22            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:22              'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:22              Constant:
 0:22                0 (const uint)
 0:22            right-shift ( temp int)
@@ -211,8 +211,8 @@
 0:24        Construct vec4 ( temp 4-component vector of float)
 0:24          Convert uint to float ( temp float)
 0:24            indirect index (layout( row_major std430) buffer uint)
-0:24              @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:24                'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:24              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:24                'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:24                Constant:
 0:24                  0 (const uint)
 0:24              right-shift ( temp int)
@@ -224,15 +224,15 @@
 0:?     Sequence
 0:5      move second child to first child ( temp uint)
 0:?         'pos' ( temp uint)
-0:?         'pos' (layout( location=0) in uint)
+0:?         'pos' (layout( location=0) flat in uint)
 0:5      move second child to first child ( temp 4-component vector of float)
 0:?         '@entryPointOutput' (layout( location=0) out 4-component vector of float)
 0:5        Function Call: @main(u1; ( temp 4-component vector of float)
 0:?           'pos' ( temp uint)
 0:?   Linker Objects
-0:?     'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:?     'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
-0:?     'pos' (layout( location=0) in uint)
+0:?     'pos' (layout( location=0) flat in uint)
 
 
 Linked fragment stage:
@@ -245,10 +245,10 @@
 0:5    Function Parameters: 
 0:5      'pos' ( in uint)
 0:?     Sequence
-0:8      AtomicAdd ( temp void)
+0:8      AtomicAdd ( temp uint)
 0:8        indirect index (layout( row_major std430) buffer uint)
-0:8          @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:8            'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:8          @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:8            'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:8            Constant:
 0:8              0 (const uint)
 0:8          right-shift ( temp int)
@@ -262,8 +262,8 @@
 0:9        'u' ( temp uint)
 0:9        AtomicAdd ( temp uint)
 0:9          indirect index (layout( row_major std430) buffer uint)
-0:9            @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:9              'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:9            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:9              'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:9              Constant:
 0:9                0 (const uint)
 0:9            right-shift ( temp int)
@@ -273,10 +273,10 @@
 0:9                2 (const int)
 0:9          Constant:
 0:9            1 (const int)
-0:10      AtomicAnd ( temp void)
+0:10      AtomicAnd ( temp uint)
 0:10        indirect index (layout( row_major std430) buffer uint)
-0:10          @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:10            'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:10          @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:10            'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:10            Constant:
 0:10              0 (const uint)
 0:10          right-shift ( temp int)
@@ -290,8 +290,8 @@
 0:11        'u' ( temp uint)
 0:11        AtomicAnd ( temp uint)
 0:11          indirect index (layout( row_major std430) buffer uint)
-0:11            @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:11              'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:11            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:11              'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:11              Constant:
 0:11                0 (const uint)
 0:11            right-shift ( temp int)
@@ -306,8 +306,8 @@
 0:12        Convert int to uint ( temp uint)
 0:12          AtomicCompSwap ( temp int)
 0:12            indirect index (layout( row_major std430) buffer uint)
-0:12              @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:12                'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:12              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:12                'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:12                Constant:
 0:12                  0 (const uint)
 0:12              right-shift ( temp int)
@@ -323,8 +323,8 @@
 0:14        'u' ( temp uint)
 0:14        AtomicExchange ( temp uint)
 0:14          indirect index (layout( row_major std430) buffer uint)
-0:14            @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:14              'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:14            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:14              'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:14              Constant:
 0:14                0 (const uint)
 0:14            right-shift ( temp int)
@@ -334,10 +334,10 @@
 0:14                2 (const int)
 0:14          Constant:
 0:14            1 (const int)
-0:15      AtomicMax ( temp void)
+0:15      AtomicMax ( temp uint)
 0:15        indirect index (layout( row_major std430) buffer uint)
-0:15          @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:15            'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:15          @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:15            'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:15            Constant:
 0:15              0 (const uint)
 0:15          right-shift ( temp int)
@@ -351,8 +351,8 @@
 0:16        'u' ( temp uint)
 0:16        AtomicMax ( temp uint)
 0:16          indirect index (layout( row_major std430) buffer uint)
-0:16            @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:16              'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:16            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:16              'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:16              Constant:
 0:16                0 (const uint)
 0:16            right-shift ( temp int)
@@ -362,10 +362,10 @@
 0:16                2 (const int)
 0:16          Constant:
 0:16            1 (const int)
-0:17      AtomicMin ( temp void)
+0:17      AtomicMin ( temp uint)
 0:17        indirect index (layout( row_major std430) buffer uint)
-0:17          @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:17            'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:17          @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:17            'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:17            Constant:
 0:17              0 (const uint)
 0:17          right-shift ( temp int)
@@ -379,8 +379,8 @@
 0:18        'u' ( temp uint)
 0:18        AtomicMin ( temp uint)
 0:18          indirect index (layout( row_major std430) buffer uint)
-0:18            @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:18              'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:18            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:18              'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:18              Constant:
 0:18                0 (const uint)
 0:18            right-shift ( temp int)
@@ -390,10 +390,10 @@
 0:18                2 (const int)
 0:18          Constant:
 0:18            1 (const int)
-0:19      AtomicOr ( temp void)
+0:19      AtomicOr ( temp uint)
 0:19        indirect index (layout( row_major std430) buffer uint)
-0:19          @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:19            'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:19          @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:19            'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:19            Constant:
 0:19              0 (const uint)
 0:19          right-shift ( temp int)
@@ -407,8 +407,8 @@
 0:20        'u' ( temp uint)
 0:20        AtomicOr ( temp uint)
 0:20          indirect index (layout( row_major std430) buffer uint)
-0:20            @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:20              'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:20            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:20              'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:20              Constant:
 0:20                0 (const uint)
 0:20            right-shift ( temp int)
@@ -418,10 +418,10 @@
 0:20                2 (const int)
 0:20          Constant:
 0:20            1 (const int)
-0:21      AtomicXor ( temp void)
+0:21      AtomicXor ( temp uint)
 0:21        indirect index (layout( row_major std430) buffer uint)
-0:21          @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:21            'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:21          @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:21            'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:21            Constant:
 0:21              0 (const uint)
 0:21          right-shift ( temp int)
@@ -435,8 +435,8 @@
 0:22        'u' ( temp uint)
 0:22        AtomicXor ( temp uint)
 0:22          indirect index (layout( row_major std430) buffer uint)
-0:22            @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:22              'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:22            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:22              'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:22              Constant:
 0:22                0 (const uint)
 0:22            right-shift ( temp int)
@@ -450,8 +450,8 @@
 0:24        Construct vec4 ( temp 4-component vector of float)
 0:24          Convert uint to float ( temp float)
 0:24            indirect index (layout( row_major std430) buffer uint)
-0:24              @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:24                'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:24              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:24                'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:24                Constant:
 0:24                  0 (const uint)
 0:24              right-shift ( temp int)
@@ -463,18 +463,22 @@
 0:?     Sequence
 0:5      move second child to first child ( temp uint)
 0:?         'pos' ( temp uint)
-0:?         'pos' (layout( location=0) in uint)
+0:?         'pos' (layout( location=0) flat in uint)
 0:5      move second child to first child ( temp 4-component vector of float)
 0:?         '@entryPointOutput' (layout( location=0) out 4-component vector of float)
 0:5        Function Call: @main(u1; ( temp 4-component vector of float)
 0:?           'pos' ( temp uint)
 0:?   Linker Objects
-0:?     'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:?     'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
-0:?     'pos' (layout( location=0) in uint)
+0:?     'pos' (layout( location=0) flat in uint)
+
+error: SPIRV-Tools Validation Errors
+error: AtomicIAdd: expected Value to be of type Result Type
+  %28 = OpAtomicIAdd %uint %24 %uint_1 %uint_0 %int_1
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 87
 
                               Capability Shader
@@ -498,6 +502,7 @@
                               MemberDecorate 15(sbuf) 0 Offset 0
                               Decorate 15(sbuf) BufferBlock
                               Decorate 17(sbuf) DescriptorSet 0
+                              Decorate 80(pos) Flat
                               Decorate 80(pos) Location 0
                               Decorate 83(@entryPointOutput) Location 0
                2:             TypeVoid
@@ -541,14 +546,14 @@
            29(u):      7(ptr) Variable Function
               22:     18(int) ShiftRightArithmetic 20 21
               24:     23(ptr) AccessChain 17(sbuf) 19 22
-              28:           2 AtomicIAdd 24 26 27 25
+              28:      6(int) AtomicIAdd 24 26 27 25
               30:     18(int) ShiftRightArithmetic 20 21
               31:     23(ptr) AccessChain 17(sbuf) 19 30
               32:      6(int) AtomicIAdd 31 26 27 25
                               Store 29(u) 32
               33:     18(int) ShiftRightArithmetic 20 21
               34:     23(ptr) AccessChain 17(sbuf) 19 33
-              35:           2 AtomicAnd 34 26 27 25
+              35:      6(int) AtomicAnd 34 26 27 25
               36:     18(int) ShiftRightArithmetic 20 21
               37:     23(ptr) AccessChain 17(sbuf) 19 36
               38:      6(int) AtomicAnd 37 26 27 25
@@ -564,28 +569,28 @@
                               Store 29(u) 45
               46:     18(int) ShiftRightArithmetic 20 21
               47:     23(ptr) AccessChain 17(sbuf) 19 46
-              48:           2 AtomicSMax 47 26 27 25
+              48:      6(int) AtomicUMax 47 26 27 25
               49:     18(int) ShiftRightArithmetic 20 21
               50:     23(ptr) AccessChain 17(sbuf) 19 49
               51:      6(int) AtomicUMax 50 26 27 25
                               Store 29(u) 51
               52:     18(int) ShiftRightArithmetic 20 21
               53:     23(ptr) AccessChain 17(sbuf) 19 52
-              54:           2 AtomicSMin 53 26 27 25
+              54:      6(int) AtomicUMin 53 26 27 25
               55:     18(int) ShiftRightArithmetic 20 21
               56:     23(ptr) AccessChain 17(sbuf) 19 55
               57:      6(int) AtomicUMin 56 26 27 25
                               Store 29(u) 57
               58:     18(int) ShiftRightArithmetic 20 21
               59:     23(ptr) AccessChain 17(sbuf) 19 58
-              60:           2 AtomicOr 59 26 27 25
+              60:      6(int) AtomicOr 59 26 27 25
               61:     18(int) ShiftRightArithmetic 20 21
               62:     23(ptr) AccessChain 17(sbuf) 19 61
               63:      6(int) AtomicOr 62 26 27 25
                               Store 29(u) 63
               64:     18(int) ShiftRightArithmetic 20 21
               65:     23(ptr) AccessChain 17(sbuf) 19 64
-              66:           2 AtomicXor 65 26 27 25
+              66:      6(int) AtomicXor 65 26 27 25
               67:     18(int) ShiftRightArithmetic 20 21
               68:     23(ptr) AccessChain 17(sbuf) 19 67
               69:      6(int) AtomicXor 68 26 27 25
diff --git a/Test/baseResults/hlsl.structbuffer.byte.frag.out b/Test/baseResults/hlsl.structbuffer.byte.frag.out
index 6541946..a23ccd2 100644
--- a/Test/baseResults/hlsl.structbuffer.byte.frag.out
+++ b/Test/baseResults/hlsl.structbuffer.byte.frag.out
@@ -10,8 +10,8 @@
 0:7        move second child to first child ( temp uint)
 0:7          'size' ( temp uint)
 0:7          array length ( temp uint)
-0:7            @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:7              'sbuf' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:7            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:7              'sbuf' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:7              Constant:
 0:7                0 (const uint)
 0:12      Branch: Return with expression
@@ -20,8 +20,8 @@
 0:9            add ( temp 4-component vector of float)
 0:9              Convert uint to float ( temp float)
 0:9                indirect index (layout( row_major std430) buffer uint)
-0:9                  @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:9                    'sbuf' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:9                  @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:9                    'sbuf' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:9                    Constant:
 0:9                      0 (const uint)
 0:9                  right-shift ( temp int)
@@ -41,15 +41,15 @@
 0:10                        Constant:
 0:10                          2 (const int)
 0:?                     Construct vec2 ( temp 2-component vector of uint)
-0:10                      indirect index ( temp float)
-0:10                        @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:10                          'sbuf' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:10                      indirect index ( temp uint)
+0:10                        @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:10                          'sbuf' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:10                          Constant:
 0:10                            0 (const uint)
 0:10                        'byteAddrTemp' ( temp int)
-0:10                      indirect index ( temp float)
-0:10                        @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:10                          'sbuf' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:10                      indirect index ( temp uint)
+0:10                        @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:10                          'sbuf' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:10                          Constant:
 0:10                            0 (const uint)
 0:10                        add ( temp int)
@@ -73,24 +73,24 @@
 0:11                      Constant:
 0:11                        2 (const int)
 0:?                   Construct vec3 ( temp 3-component vector of uint)
-0:11                    indirect index ( temp float)
-0:11                      @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:11                        'sbuf' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:11                    indirect index ( temp uint)
+0:11                      @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:11                        'sbuf' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:11                        Constant:
 0:11                          0 (const uint)
 0:11                      'byteAddrTemp' ( temp int)
-0:11                    indirect index ( temp float)
-0:11                      @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:11                        'sbuf' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:11                    indirect index ( temp uint)
+0:11                      @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:11                        'sbuf' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:11                        Constant:
 0:11                          0 (const uint)
 0:11                      add ( temp int)
 0:11                        'byteAddrTemp' ( temp int)
 0:11                        Constant:
 0:11                          1 (const int)
-0:11                    indirect index ( temp float)
-0:11                      @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:11                        'sbuf' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:11                    indirect index ( temp uint)
+0:11                      @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:11                        'sbuf' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:11                        Constant:
 0:11                          0 (const uint)
 0:11                      add ( temp int)
@@ -111,33 +111,33 @@
 0:12                  Constant:
 0:12                    2 (const int)
 0:?               Construct vec4 ( temp 4-component vector of uint)
-0:12                indirect index ( temp float)
-0:12                  @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:12                    'sbuf' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:12                indirect index ( temp uint)
+0:12                  @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:12                    'sbuf' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:12                    Constant:
 0:12                      0 (const uint)
 0:12                  'byteAddrTemp' ( temp int)
-0:12                indirect index ( temp float)
-0:12                  @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:12                    'sbuf' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:12                indirect index ( temp uint)
+0:12                  @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:12                    'sbuf' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:12                    Constant:
 0:12                      0 (const uint)
 0:12                  add ( temp int)
 0:12                    'byteAddrTemp' ( temp int)
 0:12                    Constant:
 0:12                      1 (const int)
-0:12                indirect index ( temp float)
-0:12                  @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:12                    'sbuf' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:12                indirect index ( temp uint)
+0:12                  @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:12                    'sbuf' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:12                    Constant:
 0:12                      0 (const uint)
 0:12                  add ( temp int)
 0:12                    'byteAddrTemp' ( temp int)
 0:12                    Constant:
 0:12                      2 (const int)
-0:12                indirect index ( temp float)
-0:12                  @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:12                    'sbuf' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:12                indirect index ( temp uint)
+0:12                  @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:12                    'sbuf' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:12                    Constant:
 0:12                      0 (const uint)
 0:12                  add ( temp int)
@@ -149,15 +149,15 @@
 0:?     Sequence
 0:5      move second child to first child ( temp uint)
 0:?         'pos' ( temp uint)
-0:?         'pos' (layout( location=0) in uint)
+0:?         'pos' (layout( location=0) flat in uint)
 0:5      move second child to first child ( temp 4-component vector of float)
 0:?         '@entryPointOutput' (layout( location=0) out 4-component vector of float)
 0:5        Function Call: @main(u1; ( temp 4-component vector of float)
 0:?           'pos' ( temp uint)
 0:?   Linker Objects
-0:?     'sbuf' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:?     'sbuf' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
-0:?     'pos' (layout( location=0) in uint)
+0:?     'pos' (layout( location=0) flat in uint)
 
 
 Linked fragment stage:
@@ -174,8 +174,8 @@
 0:7        move second child to first child ( temp uint)
 0:7          'size' ( temp uint)
 0:7          array length ( temp uint)
-0:7            @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:7              'sbuf' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:7            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:7              'sbuf' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:7              Constant:
 0:7                0 (const uint)
 0:12      Branch: Return with expression
@@ -184,8 +184,8 @@
 0:9            add ( temp 4-component vector of float)
 0:9              Convert uint to float ( temp float)
 0:9                indirect index (layout( row_major std430) buffer uint)
-0:9                  @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:9                    'sbuf' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:9                  @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:9                    'sbuf' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:9                    Constant:
 0:9                      0 (const uint)
 0:9                  right-shift ( temp int)
@@ -205,15 +205,15 @@
 0:10                        Constant:
 0:10                          2 (const int)
 0:?                     Construct vec2 ( temp 2-component vector of uint)
-0:10                      indirect index ( temp float)
-0:10                        @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:10                          'sbuf' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:10                      indirect index ( temp uint)
+0:10                        @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:10                          'sbuf' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:10                          Constant:
 0:10                            0 (const uint)
 0:10                        'byteAddrTemp' ( temp int)
-0:10                      indirect index ( temp float)
-0:10                        @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:10                          'sbuf' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:10                      indirect index ( temp uint)
+0:10                        @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:10                          'sbuf' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:10                          Constant:
 0:10                            0 (const uint)
 0:10                        add ( temp int)
@@ -237,24 +237,24 @@
 0:11                      Constant:
 0:11                        2 (const int)
 0:?                   Construct vec3 ( temp 3-component vector of uint)
-0:11                    indirect index ( temp float)
-0:11                      @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:11                        'sbuf' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:11                    indirect index ( temp uint)
+0:11                      @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:11                        'sbuf' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:11                        Constant:
 0:11                          0 (const uint)
 0:11                      'byteAddrTemp' ( temp int)
-0:11                    indirect index ( temp float)
-0:11                      @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:11                        'sbuf' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:11                    indirect index ( temp uint)
+0:11                      @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:11                        'sbuf' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:11                        Constant:
 0:11                          0 (const uint)
 0:11                      add ( temp int)
 0:11                        'byteAddrTemp' ( temp int)
 0:11                        Constant:
 0:11                          1 (const int)
-0:11                    indirect index ( temp float)
-0:11                      @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:11                        'sbuf' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:11                    indirect index ( temp uint)
+0:11                      @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:11                        'sbuf' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:11                        Constant:
 0:11                          0 (const uint)
 0:11                      add ( temp int)
@@ -275,33 +275,33 @@
 0:12                  Constant:
 0:12                    2 (const int)
 0:?               Construct vec4 ( temp 4-component vector of uint)
-0:12                indirect index ( temp float)
-0:12                  @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:12                    'sbuf' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:12                indirect index ( temp uint)
+0:12                  @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:12                    'sbuf' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:12                    Constant:
 0:12                      0 (const uint)
 0:12                  'byteAddrTemp' ( temp int)
-0:12                indirect index ( temp float)
-0:12                  @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:12                    'sbuf' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:12                indirect index ( temp uint)
+0:12                  @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:12                    'sbuf' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:12                    Constant:
 0:12                      0 (const uint)
 0:12                  add ( temp int)
 0:12                    'byteAddrTemp' ( temp int)
 0:12                    Constant:
 0:12                      1 (const int)
-0:12                indirect index ( temp float)
-0:12                  @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:12                    'sbuf' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:12                indirect index ( temp uint)
+0:12                  @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:12                    'sbuf' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:12                    Constant:
 0:12                      0 (const uint)
 0:12                  add ( temp int)
 0:12                    'byteAddrTemp' ( temp int)
 0:12                    Constant:
 0:12                      2 (const int)
-0:12                indirect index ( temp float)
-0:12                  @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:12                    'sbuf' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:12                indirect index ( temp uint)
+0:12                  @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:12                    'sbuf' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:12                    Constant:
 0:12                      0 (const uint)
 0:12                  add ( temp int)
@@ -313,18 +313,18 @@
 0:?     Sequence
 0:5      move second child to first child ( temp uint)
 0:?         'pos' ( temp uint)
-0:?         'pos' (layout( location=0) in uint)
+0:?         'pos' (layout( location=0) flat in uint)
 0:5      move second child to first child ( temp 4-component vector of float)
 0:?         '@entryPointOutput' (layout( location=0) out 4-component vector of float)
 0:5        Function Call: @main(u1; ( temp 4-component vector of float)
 0:?           'pos' ( temp uint)
 0:?   Linker Objects
-0:?     'sbuf' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:?     'sbuf' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
-0:?     'pos' (layout( location=0) in uint)
+0:?     'pos' (layout( location=0) flat in uint)
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 114
 
                               Capability Shader
@@ -352,6 +352,7 @@
                               MemberDecorate 16(sbuf) 0 Offset 0
                               Decorate 16(sbuf) BufferBlock
                               Decorate 18(sbuf) DescriptorSet 0
+                              Decorate 107(pos) Flat
                               Decorate 107(pos) Location 0
                               Decorate 110(@entryPointOutput) Location 0
                2:             TypeVoid
@@ -365,13 +366,13 @@
         16(sbuf):             TypeStruct 15
               17:             TypePointer Uniform 16(sbuf)
         18(sbuf):     17(ptr) Variable Uniform
-              19:             TypeInt 32 1
-              21:     19(int) Constant 0
-              23:     19(int) Constant 2
+              20:             TypeInt 32 1
+              21:     20(int) Constant 0
+              23:     20(int) Constant 2
               25:             TypePointer Uniform 6(int)
-              29:             TypePointer Function 19(int)
+              29:             TypePointer Function 20(int)
               32:      6(int) Constant 4
-              39:     19(int) Constant 1
+              39:     20(int) Constant 1
               43:             TypeVector 6(int) 2
               45:             TypeVector 8(float) 2
               47:    8(float) Constant 0
@@ -379,7 +380,7 @@
               69:             TypeVector 6(int) 3
               71:             TypeVector 8(float) 3
               80:      6(int) Constant 12
-              95:     19(int) Constant 3
+              95:     20(int) Constant 3
               99:             TypeVector 6(int) 4
              106:             TypePointer Input 6(int)
         107(pos):    106(ptr) Variable Input
@@ -404,22 +405,22 @@
 30(byteAddrTemp):     29(ptr) Variable Function
 53(byteAddrTemp):     29(ptr) Variable Function
 78(byteAddrTemp):     29(ptr) Variable Function
-              20:     19(int) ArrayLength 18(sbuf) 0
-                              Store 14(size) 20
+              19:      6(int) ArrayLength 18(sbuf) 0
+                              Store 14(size) 19
               22:      6(int) Load 11(pos)
-              24:     19(int) ShiftRightLogical 22 23
+              24:     20(int) ShiftRightLogical 22 23
               26:     25(ptr) AccessChain 18(sbuf) 21 24
               27:      6(int) Load 26
               28:    8(float) ConvertUToF 27
               31:      6(int) Load 11(pos)
               33:      6(int) IAdd 31 32
-              34:     19(int) ShiftRightLogical 33 23
+              34:     20(int) ShiftRightLogical 33 23
                               Store 30(byteAddrTemp) 34
-              35:     19(int) Load 30(byteAddrTemp)
+              35:     20(int) Load 30(byteAddrTemp)
               36:     25(ptr) AccessChain 18(sbuf) 21 35
               37:      6(int) Load 36
-              38:     19(int) Load 30(byteAddrTemp)
-              40:     19(int) IAdd 38 39
+              38:     20(int) Load 30(byteAddrTemp)
+              40:     20(int) IAdd 38 39
               41:     25(ptr) AccessChain 18(sbuf) 21 40
               42:      6(int) Load 41
               44:   43(ivec2) CompositeConstruct 37 42
@@ -431,17 +432,17 @@
               52:    9(fvec4) FAdd 51 50
               54:      6(int) Load 11(pos)
               56:      6(int) IAdd 54 55
-              57:     19(int) ShiftRightLogical 56 23
+              57:     20(int) ShiftRightLogical 56 23
                               Store 53(byteAddrTemp) 57
-              58:     19(int) Load 53(byteAddrTemp)
+              58:     20(int) Load 53(byteAddrTemp)
               59:     25(ptr) AccessChain 18(sbuf) 21 58
               60:      6(int) Load 59
-              61:     19(int) Load 53(byteAddrTemp)
-              62:     19(int) IAdd 61 39
+              61:     20(int) Load 53(byteAddrTemp)
+              62:     20(int) IAdd 61 39
               63:     25(ptr) AccessChain 18(sbuf) 21 62
               64:      6(int) Load 63
-              65:     19(int) Load 53(byteAddrTemp)
-              66:     19(int) IAdd 65 23
+              65:     20(int) Load 53(byteAddrTemp)
+              66:     20(int) IAdd 65 23
               67:     25(ptr) AccessChain 18(sbuf) 21 66
               68:      6(int) Load 67
               70:   69(ivec3) CompositeConstruct 60 64 68
@@ -453,21 +454,21 @@
               77:    9(fvec4) FAdd 52 76
               79:      6(int) Load 11(pos)
               81:      6(int) IAdd 79 80
-              82:     19(int) ShiftRightLogical 81 23
+              82:     20(int) ShiftRightLogical 81 23
                               Store 78(byteAddrTemp) 82
-              83:     19(int) Load 78(byteAddrTemp)
+              83:     20(int) Load 78(byteAddrTemp)
               84:     25(ptr) AccessChain 18(sbuf) 21 83
               85:      6(int) Load 84
-              86:     19(int) Load 78(byteAddrTemp)
-              87:     19(int) IAdd 86 39
+              86:     20(int) Load 78(byteAddrTemp)
+              87:     20(int) IAdd 86 39
               88:     25(ptr) AccessChain 18(sbuf) 21 87
               89:      6(int) Load 88
-              90:     19(int) Load 78(byteAddrTemp)
-              91:     19(int) IAdd 90 23
+              90:     20(int) Load 78(byteAddrTemp)
+              91:     20(int) IAdd 90 23
               92:     25(ptr) AccessChain 18(sbuf) 21 91
               93:      6(int) Load 92
-              94:     19(int) Load 78(byteAddrTemp)
-              96:     19(int) IAdd 94 95
+              94:     20(int) Load 78(byteAddrTemp)
+              96:     20(int) IAdd 94 95
               97:     25(ptr) AccessChain 18(sbuf) 21 96
               98:      6(int) Load 97
              100:   99(ivec4) CompositeConstruct 85 89 93 98
diff --git a/Test/baseResults/hlsl.structbuffer.coherent.frag.out b/Test/baseResults/hlsl.structbuffer.coherent.frag.out
index fab95f7..738e13d 100644
--- a/Test/baseResults/hlsl.structbuffer.coherent.frag.out
+++ b/Test/baseResults/hlsl.structbuffer.coherent.frag.out
@@ -8,8 +8,8 @@
 0:?     Sequence
 0:13      move second child to first child ( temp float)
 0:13        indirect index (layout( row_major std430) buffer float)
-0:13          @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of float)
-0:13            'sbuf2' (layout( row_major std430) coherent buffer block{layout( row_major std430) buffer implicitly-sized array of float @data})
+0:13          @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of float)
+0:13            'sbuf2' (layout( row_major std430) coherent buffer block{layout( row_major std430) buffer unsized 1-element array of float @data})
 0:13            Constant:
 0:13              0 (const uint)
 0:13          add ( temp uint)
@@ -22,8 +22,8 @@
 0:17        move second child to first child ( temp uint)
 0:17          'size' ( temp uint)
 0:17          array length ( temp uint)
-0:17            @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of structure{ temp 3-component vector of float color,  temp bool test})
-0:17              'sbuf' (layout( row_major std430) coherent buffer block{layout( row_major std430) buffer implicitly-sized array of structure{ temp 3-component vector of float color,  temp bool test} @data})
+0:17            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 3-component vector of float color,  temp bool test})
+0:17              'sbuf' (layout( row_major std430) coherent buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 3-component vector of float color,  temp bool test} @data})
 0:17              Constant:
 0:17                0 (const uint)
 0:17        move second child to first child ( temp uint)
@@ -34,8 +34,8 @@
 0:19        Condition
 0:19        test: direct index for structure ( temp bool)
 0:19          indirect index (layout( row_major std430) buffer structure{ temp 3-component vector of float color,  temp bool test})
-0:19            @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of structure{ temp 3-component vector of float color,  temp bool test})
-0:19              'sbuf' (layout( row_major std430) coherent buffer block{layout( row_major std430) buffer implicitly-sized array of structure{ temp 3-component vector of float color,  temp bool test} @data})
+0:19            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 3-component vector of float color,  temp bool test})
+0:19              'sbuf' (layout( row_major std430) coherent buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 3-component vector of float color,  temp bool test} @data})
 0:19              Constant:
 0:19                0 (const uint)
 0:19            'pos' ( in uint)
@@ -47,16 +47,16 @@
 0:20            add ( temp 3-component vector of float)
 0:20              color: direct index for structure ( temp 3-component vector of float)
 0:20                indirect index (layout( row_major std430) buffer structure{ temp 3-component vector of float color,  temp bool test})
-0:20                  @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of structure{ temp 3-component vector of float color,  temp bool test})
-0:20                    'sbuf' (layout( row_major std430) coherent buffer block{layout( row_major std430) buffer implicitly-sized array of structure{ temp 3-component vector of float color,  temp bool test} @data})
+0:20                  @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 3-component vector of float color,  temp bool test})
+0:20                    'sbuf' (layout( row_major std430) coherent buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 3-component vector of float color,  temp bool test} @data})
 0:20                    Constant:
 0:20                      0 (const uint)
 0:20                  'pos' ( in uint)
 0:20                Constant:
 0:20                  0 (const int)
 0:20              indirect index (layout( row_major std430) buffer float)
-0:20                @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of float)
-0:20                  'sbuf2' (layout( row_major std430) coherent buffer block{layout( row_major std430) buffer implicitly-sized array of float @data})
+0:20                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of float)
+0:20                  'sbuf2' (layout( row_major std430) coherent buffer block{layout( row_major std430) buffer unsized 1-element array of float @data})
 0:20                  Constant:
 0:20                    0 (const uint)
 0:20                'pos' ( in uint)
@@ -74,16 +74,16 @@
 0:?     Sequence
 0:12      move second child to first child ( temp uint)
 0:?         'pos' ( temp uint)
-0:?         'pos' (layout( location=0) in uint)
+0:?         'pos' (layout( location=0) flat in uint)
 0:12      move second child to first child ( temp 4-component vector of float)
 0:?         '@entryPointOutput' (layout( location=0) out 4-component vector of float)
 0:12        Function Call: @main(u1; ( temp 4-component vector of float)
 0:?           'pos' ( temp uint)
 0:?   Linker Objects
-0:?     'sbuf' (layout( row_major std430) coherent buffer block{layout( row_major std430) buffer implicitly-sized array of structure{ temp 3-component vector of float color,  temp bool test} @data})
-0:?     'sbuf2' (layout( row_major std430) coherent buffer block{layout( row_major std430) buffer implicitly-sized array of float @data})
+0:?     'sbuf' (layout( row_major std430) coherent buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 3-component vector of float color,  temp bool test} @data})
+0:?     'sbuf2' (layout( row_major std430) coherent buffer block{layout( row_major std430) buffer unsized 1-element array of float @data})
 0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
-0:?     'pos' (layout( location=0) in uint)
+0:?     'pos' (layout( location=0) flat in uint)
 
 
 Linked fragment stage:
@@ -98,8 +98,8 @@
 0:?     Sequence
 0:13      move second child to first child ( temp float)
 0:13        indirect index (layout( row_major std430) buffer float)
-0:13          @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of float)
-0:13            'sbuf2' (layout( row_major std430) coherent buffer block{layout( row_major std430) buffer implicitly-sized array of float @data})
+0:13          @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of float)
+0:13            'sbuf2' (layout( row_major std430) coherent buffer block{layout( row_major std430) buffer unsized 1-element array of float @data})
 0:13            Constant:
 0:13              0 (const uint)
 0:13          add ( temp uint)
@@ -112,8 +112,8 @@
 0:17        move second child to first child ( temp uint)
 0:17          'size' ( temp uint)
 0:17          array length ( temp uint)
-0:17            @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of structure{ temp 3-component vector of float color,  temp bool test})
-0:17              'sbuf' (layout( row_major std430) coherent buffer block{layout( row_major std430) buffer implicitly-sized array of structure{ temp 3-component vector of float color,  temp bool test} @data})
+0:17            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 3-component vector of float color,  temp bool test})
+0:17              'sbuf' (layout( row_major std430) coherent buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 3-component vector of float color,  temp bool test} @data})
 0:17              Constant:
 0:17                0 (const uint)
 0:17        move second child to first child ( temp uint)
@@ -124,8 +124,8 @@
 0:19        Condition
 0:19        test: direct index for structure ( temp bool)
 0:19          indirect index (layout( row_major std430) buffer structure{ temp 3-component vector of float color,  temp bool test})
-0:19            @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of structure{ temp 3-component vector of float color,  temp bool test})
-0:19              'sbuf' (layout( row_major std430) coherent buffer block{layout( row_major std430) buffer implicitly-sized array of structure{ temp 3-component vector of float color,  temp bool test} @data})
+0:19            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 3-component vector of float color,  temp bool test})
+0:19              'sbuf' (layout( row_major std430) coherent buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 3-component vector of float color,  temp bool test} @data})
 0:19              Constant:
 0:19                0 (const uint)
 0:19            'pos' ( in uint)
@@ -137,16 +137,16 @@
 0:20            add ( temp 3-component vector of float)
 0:20              color: direct index for structure ( temp 3-component vector of float)
 0:20                indirect index (layout( row_major std430) buffer structure{ temp 3-component vector of float color,  temp bool test})
-0:20                  @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of structure{ temp 3-component vector of float color,  temp bool test})
-0:20                    'sbuf' (layout( row_major std430) coherent buffer block{layout( row_major std430) buffer implicitly-sized array of structure{ temp 3-component vector of float color,  temp bool test} @data})
+0:20                  @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 3-component vector of float color,  temp bool test})
+0:20                    'sbuf' (layout( row_major std430) coherent buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 3-component vector of float color,  temp bool test} @data})
 0:20                    Constant:
 0:20                      0 (const uint)
 0:20                  'pos' ( in uint)
 0:20                Constant:
 0:20                  0 (const int)
 0:20              indirect index (layout( row_major std430) buffer float)
-0:20                @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of float)
-0:20                  'sbuf2' (layout( row_major std430) coherent buffer block{layout( row_major std430) buffer implicitly-sized array of float @data})
+0:20                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of float)
+0:20                  'sbuf2' (layout( row_major std430) coherent buffer block{layout( row_major std430) buffer unsized 1-element array of float @data})
 0:20                  Constant:
 0:20                    0 (const uint)
 0:20                'pos' ( in uint)
@@ -164,19 +164,19 @@
 0:?     Sequence
 0:12      move second child to first child ( temp uint)
 0:?         'pos' ( temp uint)
-0:?         'pos' (layout( location=0) in uint)
+0:?         'pos' (layout( location=0) flat in uint)
 0:12      move second child to first child ( temp 4-component vector of float)
 0:?         '@entryPointOutput' (layout( location=0) out 4-component vector of float)
 0:12        Function Call: @main(u1; ( temp 4-component vector of float)
 0:?           'pos' ( temp uint)
 0:?   Linker Objects
-0:?     'sbuf' (layout( row_major std430) coherent buffer block{layout( row_major std430) buffer implicitly-sized array of structure{ temp 3-component vector of float color,  temp bool test} @data})
-0:?     'sbuf2' (layout( row_major std430) coherent buffer block{layout( row_major std430) buffer implicitly-sized array of float @data})
+0:?     'sbuf' (layout( row_major std430) coherent buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 3-component vector of float color,  temp bool test} @data})
+0:?     'sbuf2' (layout( row_major std430) coherent buffer block{layout( row_major std430) buffer unsized 1-element array of float @data})
 0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
-0:?     'pos' (layout( location=0) in uint)
+0:?     'pos' (layout( location=0) flat in uint)
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 78
 
                               Capability Shader
@@ -208,15 +208,14 @@
                               MemberDecorate 15(sbuf2) 0 Offset 0
                               Decorate 15(sbuf2) BufferBlock
                               Decorate 17(sbuf2) DescriptorSet 0
-                              MemberDecorate 28(sb_t) 0 Coherent
                               MemberDecorate 28(sb_t) 0 Offset 0
-                              MemberDecorate 28(sb_t) 1 Coherent
                               MemberDecorate 28(sb_t) 1 Offset 12
                               Decorate 29 ArrayStride 16
                               MemberDecorate 30(sbuf) 0 Coherent
                               MemberDecorate 30(sbuf) 0 Offset 0
                               Decorate 30(sbuf) BufferBlock
                               Decorate 32(sbuf) DescriptorSet 0
+                              Decorate 71(pos) Flat
                               Decorate 71(pos) Location 0
                               Decorate 74(@entryPointOutput) Location 0
                2:             TypeVoid
@@ -273,7 +272,7 @@
               22:      6(int) IAdd 20 21
               25:     24(ptr) AccessChain 17(sbuf2) 19 22
                               Store 25 23
-              33:     18(int) ArrayLength 32(sbuf) 0
+              33:      6(int) ArrayLength 32(sbuf) 0
                               Store 26(size) 33
                               Store 34(stride) 35
               36:      6(int) Load 11(pos)
diff --git a/Test/baseResults/hlsl.structbuffer.floatidx.comp.out b/Test/baseResults/hlsl.structbuffer.floatidx.comp.out
index 9ce8358..82e307b 100644
--- a/Test/baseResults/hlsl.structbuffer.floatidx.comp.out
+++ b/Test/baseResults/hlsl.structbuffer.floatidx.comp.out
@@ -10,18 +10,18 @@
 0:14        move second child to first child ( temp structure{ temp 4-component vector of float color,  temp 2-component vector of uint threadId})
 0:14          'data' ( temp structure{ temp 4-component vector of float color,  temp 2-component vector of uint threadId})
 0:14          indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of float color,  temp 2-component vector of uint threadId})
-0:14            @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of structure{ temp 4-component vector of float color,  temp 2-component vector of uint threadId})
-0:14              'csb' (layout( binding=1 row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of structure{ temp 4-component vector of float color,  temp 2-component vector of uint threadId} @data})
+0:14            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of float color,  temp 2-component vector of uint threadId})
+0:14              'csb' (layout( binding=1 row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of float color,  temp 2-component vector of uint threadId} @data})
 0:14              Constant:
 0:14                0 (const uint)
 0:14            add ( temp uint)
 0:14              AtomicAdd ( temp uint)
-0:14                @count: direct index for structure ( temp int)
-0:14                  'csb@count' (layout( row_major std430) buffer block{layout( row_major std430) buffer int @count})
+0:14                @count: direct index for structure ( temp uint)
+0:14                  'csb@count' (layout( row_major std430) buffer block{layout( row_major std430) buffer uint @count})
 0:14                  Constant:
 0:14                    0 (const int)
 0:14                Constant:
-0:14                  -1 (const int)
+0:14                  4294967295 (const uint)
 0:14              Constant:
 0:14                -1 (const int)
 0:15      Sequence
@@ -53,8 +53,8 @@
 0:16        'storeTemp' ( temp 4-component vector of float)
 0:18      move second child to first child ( temp 4-component vector of float)
 0:18        indirect index (layout( row_major std430) buffer 4-component vector of float)
-0:18          @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of 4-component vector of float)
-0:18            'rwsb' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of 4-component vector of float @data})
+0:18          @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of 4-component vector of float)
+0:18            'rwsb' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of 4-component vector of float @data})
 0:18            Constant:
 0:18              0 (const uint)
 0:18          Convert float to uint ( temp uint)
@@ -63,8 +63,8 @@
 0:18              Constant:
 0:18                0 (const int)
 0:18        indirect index (layout( row_major std430) buffer 4-component vector of float)
-0:18          @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of 4-component vector of float)
-0:18            'rwsb' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of 4-component vector of float @data})
+0:18          @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of 4-component vector of float)
+0:18            'rwsb' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of 4-component vector of float @data})
 0:18            Constant:
 0:18              0 (const uint)
 0:18          Convert float to uint ( temp uint)
@@ -82,9 +82,9 @@
 0:?         'nThreadId' ( temp 3-component vector of uint)
 0:?   Linker Objects
 0:?     'outtx' (layout( rgba32f) uniform image2D)
-0:?     'csb' (layout( binding=1 row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of structure{ temp 4-component vector of float color,  temp 2-component vector of uint threadId} @data})
-0:?     'csb@count' (layout( row_major std430) buffer block{layout( row_major std430) buffer int @count})
-0:?     'rwsb' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of 4-component vector of float @data})
+0:?     'csb' (layout( binding=1 row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of float color,  temp 2-component vector of uint threadId} @data})
+0:?     'csb@count' (layout( row_major std430) buffer block{layout( row_major std430) buffer uint @count})
+0:?     'rwsb' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of 4-component vector of float @data})
 0:?     'nThreadId' ( in 3-component vector of uint GlobalInvocationID)
 
 
@@ -102,18 +102,18 @@
 0:14        move second child to first child ( temp structure{ temp 4-component vector of float color,  temp 2-component vector of uint threadId})
 0:14          'data' ( temp structure{ temp 4-component vector of float color,  temp 2-component vector of uint threadId})
 0:14          indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of float color,  temp 2-component vector of uint threadId})
-0:14            @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of structure{ temp 4-component vector of float color,  temp 2-component vector of uint threadId})
-0:14              'csb' (layout( binding=1 row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of structure{ temp 4-component vector of float color,  temp 2-component vector of uint threadId} @data})
+0:14            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of float color,  temp 2-component vector of uint threadId})
+0:14              'csb' (layout( binding=1 row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of float color,  temp 2-component vector of uint threadId} @data})
 0:14              Constant:
 0:14                0 (const uint)
 0:14            add ( temp uint)
 0:14              AtomicAdd ( temp uint)
-0:14                @count: direct index for structure ( temp int)
-0:14                  'csb@count' (layout( row_major std430) buffer block{layout( row_major std430) buffer int @count})
+0:14                @count: direct index for structure ( temp uint)
+0:14                  'csb@count' (layout( row_major std430) buffer block{layout( row_major std430) buffer uint @count})
 0:14                  Constant:
 0:14                    0 (const int)
 0:14                Constant:
-0:14                  -1 (const int)
+0:14                  4294967295 (const uint)
 0:14              Constant:
 0:14                -1 (const int)
 0:15      Sequence
@@ -145,8 +145,8 @@
 0:16        'storeTemp' ( temp 4-component vector of float)
 0:18      move second child to first child ( temp 4-component vector of float)
 0:18        indirect index (layout( row_major std430) buffer 4-component vector of float)
-0:18          @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of 4-component vector of float)
-0:18            'rwsb' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of 4-component vector of float @data})
+0:18          @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of 4-component vector of float)
+0:18            'rwsb' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of 4-component vector of float @data})
 0:18            Constant:
 0:18              0 (const uint)
 0:18          Convert float to uint ( temp uint)
@@ -155,8 +155,8 @@
 0:18              Constant:
 0:18                0 (const int)
 0:18        indirect index (layout( row_major std430) buffer 4-component vector of float)
-0:18          @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of 4-component vector of float)
-0:18            'rwsb' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of 4-component vector of float @data})
+0:18          @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of 4-component vector of float)
+0:18            'rwsb' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of 4-component vector of float @data})
 0:18            Constant:
 0:18              0 (const uint)
 0:18          Convert float to uint ( temp uint)
@@ -174,19 +174,19 @@
 0:?         'nThreadId' ( temp 3-component vector of uint)
 0:?   Linker Objects
 0:?     'outtx' (layout( rgba32f) uniform image2D)
-0:?     'csb' (layout( binding=1 row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of structure{ temp 4-component vector of float color,  temp 2-component vector of uint threadId} @data})
-0:?     'csb@count' (layout( row_major std430) buffer block{layout( row_major std430) buffer int @count})
-0:?     'rwsb' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of 4-component vector of float @data})
+0:?     'csb' (layout( binding=1 row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of float color,  temp 2-component vector of uint threadId} @data})
+0:?     'csb@count' (layout( row_major std430) buffer block{layout( row_major std430) buffer uint @count})
+0:?     'rwsb' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of 4-component vector of float @data})
 0:?     'nThreadId' ( in 3-component vector of uint GlobalInvocationID)
 
 // Module Version 10000
-// Generated by (magic number): 80001
-// Id's are bound by 84
+// Generated by (magic number): 80007
+// Id's are bound by 85
 
                               Capability Shader
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint GLCompute 4  "main" 79
+                              EntryPoint GLCompute 4  "main" 80
                               ExecutionMode 4 LocalSize 1 1 1
                               Source HLSL 500
                               Name 4  "main"
@@ -205,15 +205,15 @@
                               Name 26  "csb@count"
                               MemberName 26(csb@count) 0  "@count"
                               Name 28  "csb@count"
-                              Name 48  "coord"
-                              Name 52  "storeTemp"
-                              Name 57  "outtx"
-                              Name 63  "rwsb"
-                              MemberName 63(rwsb) 0  "@data"
-                              Name 65  "rwsb"
-                              Name 77  "nThreadId"
-                              Name 79  "nThreadId"
-                              Name 81  "param"
+                              Name 49  "coord"
+                              Name 53  "storeTemp"
+                              Name 58  "outtx"
+                              Name 64  "rwsb"
+                              MemberName 64(rwsb) 0  "@data"
+                              Name 66  "rwsb"
+                              Name 78  "nThreadId"
+                              Name 80  "nThreadId"
+                              Name 82  "param"
                               MemberDecorate 19(sb_t) 0 Offset 0
                               MemberDecorate 19(sb_t) 1 Offset 16
                               Decorate 20 ArrayStride 32
@@ -224,12 +224,12 @@
                               MemberDecorate 26(csb@count) 0 Offset 0
                               Decorate 26(csb@count) BufferBlock
                               Decorate 28(csb@count) DescriptorSet 0
-                              Decorate 57(outtx) DescriptorSet 0
-                              Decorate 62 ArrayStride 16
-                              MemberDecorate 63(rwsb) 0 Offset 0
-                              Decorate 63(rwsb) BufferBlock
-                              Decorate 65(rwsb) DescriptorSet 0
-                              Decorate 79(nThreadId) BuiltIn GlobalInvocationId
+                              Decorate 58(outtx) DescriptorSet 0
+                              Decorate 63 ArrayStride 16
+                              MemberDecorate 64(rwsb) 0 Offset 0
+                              Decorate 64(rwsb) BufferBlock
+                              Decorate 66(rwsb) DescriptorSet 0
+                              Decorate 80(nThreadId) BuiltIn GlobalInvocationId
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 32 0
@@ -248,79 +248,80 @@
          23(csb):     22(ptr) Variable Uniform
               24:             TypeInt 32 1
               25:     24(int) Constant 0
-   26(csb@count):             TypeStruct 24(int)
+   26(csb@count):             TypeStruct 6(int)
               27:             TypePointer Uniform 26(csb@count)
    28(csb@count):     27(ptr) Variable Uniform
-              29:             TypePointer Uniform 24(int)
-              31:     24(int) Constant 4294967295
+              29:             TypePointer Uniform 6(int)
+              31:      6(int) Constant 4294967295
               32:      6(int) Constant 1
               33:      6(int) Constant 0
-              36:             TypePointer Uniform 19(sb_t)
-              40:             TypePointer Function 14(fvec4)
-              43:     24(int) Constant 1
-              44:             TypePointer Function 15(ivec2)
-              46:             TypeVector 13(float) 2
-              47:             TypePointer Function 46(fvec2)
-              55:             TypeImage 13(float) 2D nonsampled format:Rgba32f
-              56:             TypePointer UniformConstant 55
-       57(outtx):     56(ptr) Variable UniformConstant
-              62:             TypeRuntimeArray 14(fvec4)
-        63(rwsb):             TypeStruct 62
-              64:             TypePointer Uniform 63(rwsb)
-        65(rwsb):     64(ptr) Variable Uniform
-              66:             TypePointer Function 13(float)
-              73:             TypePointer Uniform 14(fvec4)
-              78:             TypePointer Input 7(ivec3)
-   79(nThreadId):     78(ptr) Variable Input
+              35:     24(int) Constant 4294967295
+              37:             TypePointer Uniform 19(sb_t)
+              41:             TypePointer Function 14(fvec4)
+              44:     24(int) Constant 1
+              45:             TypePointer Function 15(ivec2)
+              47:             TypeVector 13(float) 2
+              48:             TypePointer Function 47(fvec2)
+              56:             TypeImage 13(float) 2D nonsampled format:Rgba32f
+              57:             TypePointer UniformConstant 56
+       58(outtx):     57(ptr) Variable UniformConstant
+              63:             TypeRuntimeArray 14(fvec4)
+        64(rwsb):             TypeStruct 63
+              65:             TypePointer Uniform 64(rwsb)
+        66(rwsb):     65(ptr) Variable Uniform
+              67:             TypePointer Function 13(float)
+              74:             TypePointer Uniform 14(fvec4)
+              79:             TypePointer Input 7(ivec3)
+   80(nThreadId):     79(ptr) Variable Input
          4(main):           2 Function None 3
                5:             Label
-   77(nThreadId):      8(ptr) Variable Function
-       81(param):      8(ptr) Variable Function
-              80:    7(ivec3) Load 79(nThreadId)
-                              Store 77(nThreadId) 80
-              82:    7(ivec3) Load 77(nThreadId)
-                              Store 81(param) 82
-              83:           2 FunctionCall 11(@main(vu3;) 81(param)
+   78(nThreadId):      8(ptr) Variable Function
+       82(param):      8(ptr) Variable Function
+              81:    7(ivec3) Load 80(nThreadId)
+                              Store 78(nThreadId) 81
+              83:    7(ivec3) Load 78(nThreadId)
+                              Store 82(param) 83
+              84:           2 FunctionCall 11(@main(vu3;) 82(param)
                               Return
                               FunctionEnd
   11(@main(vu3;):           2 Function None 9
    10(nThreadId):      8(ptr) FunctionParameter
               12:             Label
         18(data):     17(ptr) Variable Function
-       48(coord):     47(ptr) Variable Function
-   52(storeTemp):     40(ptr) Variable Function
+       49(coord):     48(ptr) Variable Function
+   53(storeTemp):     41(ptr) Variable Function
               30:     29(ptr) AccessChain 28(csb@count) 25
               34:      6(int) AtomicIAdd 30 32 33 31
-              35:      6(int) IAdd 34 31
-              37:     36(ptr) AccessChain 23(csb) 25 35
-              38:    19(sb_t) Load 37
-              39:   14(fvec4) CompositeExtract 38 0
-              41:     40(ptr) AccessChain 18(data) 25
-                              Store 41 39
-              42:   15(ivec2) CompositeExtract 38 1
-              45:     44(ptr) AccessChain 18(data) 43
-                              Store 45 42
-              49:     44(ptr) AccessChain 18(data) 43
-              50:   15(ivec2) Load 49
-              51:   46(fvec2) ConvertUToF 50
-                              Store 48(coord) 51
-              53:     40(ptr) AccessChain 18(data) 25
-              54:   14(fvec4) Load 53
-                              Store 52(storeTemp) 54
-              58:          55 Load 57(outtx)
-              59:   46(fvec2) Load 48(coord)
-              60:   15(ivec2) ConvertFToU 59
-              61:   14(fvec4) Load 52(storeTemp)
-                              ImageWrite 58 60 61
-              67:     66(ptr) AccessChain 48(coord) 33
-              68:   13(float) Load 67
-              69:      6(int) ConvertFToU 68
-              70:     66(ptr) AccessChain 48(coord) 32
-              71:   13(float) Load 70
-              72:      6(int) ConvertFToU 71
-              74:     73(ptr) AccessChain 65(rwsb) 25 72
-              75:   14(fvec4) Load 74
-              76:     73(ptr) AccessChain 65(rwsb) 25 69
-                              Store 76 75
+              36:      6(int) IAdd 34 35
+              38:     37(ptr) AccessChain 23(csb) 25 36
+              39:    19(sb_t) Load 38
+              40:   14(fvec4) CompositeExtract 39 0
+              42:     41(ptr) AccessChain 18(data) 25
+                              Store 42 40
+              43:   15(ivec2) CompositeExtract 39 1
+              46:     45(ptr) AccessChain 18(data) 44
+                              Store 46 43
+              50:     45(ptr) AccessChain 18(data) 44
+              51:   15(ivec2) Load 50
+              52:   47(fvec2) ConvertUToF 51
+                              Store 49(coord) 52
+              54:     41(ptr) AccessChain 18(data) 25
+              55:   14(fvec4) Load 54
+                              Store 53(storeTemp) 55
+              59:          56 Load 58(outtx)
+              60:   47(fvec2) Load 49(coord)
+              61:   15(ivec2) ConvertFToU 60
+              62:   14(fvec4) Load 53(storeTemp)
+                              ImageWrite 59 61 62
+              68:     67(ptr) AccessChain 49(coord) 33
+              69:   13(float) Load 68
+              70:      6(int) ConvertFToU 69
+              71:     67(ptr) AccessChain 49(coord) 32
+              72:   13(float) Load 71
+              73:      6(int) ConvertFToU 72
+              75:     74(ptr) AccessChain 66(rwsb) 25 73
+              76:   14(fvec4) Load 75
+              77:     74(ptr) AccessChain 66(rwsb) 25 70
+                              Store 77 76
                               Return
                               FunctionEnd
diff --git a/Test/baseResults/hlsl.structbuffer.fn.frag.out b/Test/baseResults/hlsl.structbuffer.fn.frag.out
index 762ea80..4b8ee63 100644
--- a/Test/baseResults/hlsl.structbuffer.fn.frag.out
+++ b/Test/baseResults/hlsl.structbuffer.fn.frag.out
@@ -4,26 +4,27 @@
 0:? Sequence
 0:5  Function Definition: get(block--vu4[0]1;u1; ( temp 4-component vector of uint)
 0:5    Function Parameters: 
-0:5      'sb' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer implicitly-sized array of 4-component vector of uint @data})
+0:5      'sb' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of 4-component vector of uint @data})
 0:5      'bufferOffset' ( in uint)
 0:?     Sequence
 0:6      Branch: Return with expression
 0:6        indirect index (layout( row_major std430) buffer 4-component vector of uint)
-0:6          @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of 4-component vector of uint)
-0:6            'sb' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer implicitly-sized array of 4-component vector of uint @data})
+0:6          @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of 4-component vector of uint)
+0:6            'sb' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of 4-component vector of uint @data})
 0:6            Constant:
 0:6              0 (const uint)
 0:6          'bufferOffset' ( in uint)
 0:10  Function Definition: set(block--vu4[0]1;u1;vu4; ( temp void)
 0:10    Function Parameters: 
-0:10      'sb' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of 4-component vector of uint @data})
+0:10      'sb' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of 4-component vector of uint @data})
+0:10      'sb@count' ( buffer block{layout( row_major std430) buffer uint @count})
 0:10      'bufferOffset' ( in uint)
 0:10      'data' ( in 4-component vector of uint)
 0:?     Sequence
 0:11      move second child to first child ( temp 4-component vector of uint)
 0:11        indirect index ( buffer 4-component vector of uint)
-0:11          @data: direct index for structure ( buffer implicitly-sized array of 4-component vector of uint)
-0:11            'sb' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of 4-component vector of uint @data})
+0:11          @data: direct index for structure ( buffer unsized 1-element array of 4-component vector of uint)
+0:11            'sb' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of 4-component vector of uint @data})
 0:11            Constant:
 0:11              0 (const uint)
 0:11          'bufferOffset' ( in uint)
@@ -33,11 +34,12 @@
 0:20      'pos' ( in uint)
 0:?     Sequence
 0:21      Function Call: set(block--vu4[0]1;u1;vu4; ( temp void)
-0:21        'sbuf2' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of 4-component vector of uint @data})
+0:21        'sbuf2' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of 4-component vector of uint @data})
+0:21        'sbuf2@count' ( buffer block{layout( row_major std430) buffer uint @count})
 0:21        Constant:
 0:21          2 (const uint)
 0:21        Function Call: get(block--vu4[0]1;u1; ( temp 4-component vector of uint)
-0:21          'sbuf' (layout( binding=10 row_major std430) readonly buffer block{layout( row_major std430) buffer implicitly-sized array of 4-component vector of uint @data})
+0:21          'sbuf' (layout( binding=10 row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of 4-component vector of uint @data})
 0:21          Constant:
 0:21            3 (const uint)
 0:23      Branch: Return with expression
@@ -51,17 +53,18 @@
 0:?     Sequence
 0:20      move second child to first child ( temp uint)
 0:?         'pos' ( temp uint)
-0:?         'pos' (layout( location=0) in uint)
+0:?         'pos' (layout( location=0) flat in uint)
 0:20      move second child to first child ( temp 4-component vector of float)
 0:?         '@entryPointOutput' (layout( location=0) out 4-component vector of float)
 0:20        Function Call: @main(u1; ( temp 4-component vector of float)
 0:?           'pos' ( temp uint)
 0:?   Linker Objects
-0:?     'sbuf' (layout( binding=10 row_major std430) readonly buffer block{layout( row_major std430) buffer implicitly-sized array of 4-component vector of uint @data})
-0:?     'sbuf2' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of 4-component vector of uint @data})
-0:?     'sbuf3' (layout( binding=12 row_major std430) readonly buffer block{layout( row_major std430) buffer implicitly-sized array of 3-component vector of uint @data})
+0:?     'sbuf' (layout( binding=10 row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of 4-component vector of uint @data})
+0:?     'sbuf2' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of 4-component vector of uint @data})
+0:?     'sbuf2@count' (layout( row_major std430) buffer block{layout( row_major std430) buffer uint @count})
+0:?     'sbuf3' (layout( binding=12 row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of 3-component vector of uint @data})
 0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
-0:?     'pos' (layout( location=0) in uint)
+0:?     'pos' (layout( location=0) flat in uint)
 
 
 Linked fragment stage:
@@ -72,26 +75,27 @@
 0:? Sequence
 0:5  Function Definition: get(block--vu4[0]1;u1; ( temp 4-component vector of uint)
 0:5    Function Parameters: 
-0:5      'sb' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer implicitly-sized array of 4-component vector of uint @data})
+0:5      'sb' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of 4-component vector of uint @data})
 0:5      'bufferOffset' ( in uint)
 0:?     Sequence
 0:6      Branch: Return with expression
 0:6        indirect index (layout( row_major std430) buffer 4-component vector of uint)
-0:6          @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of 4-component vector of uint)
-0:6            'sb' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer implicitly-sized array of 4-component vector of uint @data})
+0:6          @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of 4-component vector of uint)
+0:6            'sb' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of 4-component vector of uint @data})
 0:6            Constant:
 0:6              0 (const uint)
 0:6          'bufferOffset' ( in uint)
 0:10  Function Definition: set(block--vu4[0]1;u1;vu4; ( temp void)
 0:10    Function Parameters: 
-0:10      'sb' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of 4-component vector of uint @data})
+0:10      'sb' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of 4-component vector of uint @data})
+0:10      'sb@count' ( buffer block{layout( row_major std430) buffer uint @count})
 0:10      'bufferOffset' ( in uint)
 0:10      'data' ( in 4-component vector of uint)
 0:?     Sequence
 0:11      move second child to first child ( temp 4-component vector of uint)
 0:11        indirect index ( buffer 4-component vector of uint)
-0:11          @data: direct index for structure ( buffer implicitly-sized array of 4-component vector of uint)
-0:11            'sb' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of 4-component vector of uint @data})
+0:11          @data: direct index for structure ( buffer unsized 1-element array of 4-component vector of uint)
+0:11            'sb' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of 4-component vector of uint @data})
 0:11            Constant:
 0:11              0 (const uint)
 0:11          'bufferOffset' ( in uint)
@@ -101,11 +105,12 @@
 0:20      'pos' ( in uint)
 0:?     Sequence
 0:21      Function Call: set(block--vu4[0]1;u1;vu4; ( temp void)
-0:21        'sbuf2' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of 4-component vector of uint @data})
+0:21        'sbuf2' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of 4-component vector of uint @data})
+0:21        'sbuf2@count' ( buffer block{layout( row_major std430) buffer uint @count})
 0:21        Constant:
 0:21          2 (const uint)
 0:21        Function Call: get(block--vu4[0]1;u1; ( temp 4-component vector of uint)
-0:21          'sbuf' (layout( binding=10 row_major std430) readonly buffer block{layout( row_major std430) buffer implicitly-sized array of 4-component vector of uint @data})
+0:21          'sbuf' (layout( binding=10 row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of 4-component vector of uint @data})
 0:21          Constant:
 0:21            3 (const uint)
 0:23      Branch: Return with expression
@@ -119,26 +124,31 @@
 0:?     Sequence
 0:20      move second child to first child ( temp uint)
 0:?         'pos' ( temp uint)
-0:?         'pos' (layout( location=0) in uint)
+0:?         'pos' (layout( location=0) flat in uint)
 0:20      move second child to first child ( temp 4-component vector of float)
 0:?         '@entryPointOutput' (layout( location=0) out 4-component vector of float)
 0:20        Function Call: @main(u1; ( temp 4-component vector of float)
 0:?           'pos' ( temp uint)
 0:?   Linker Objects
-0:?     'sbuf' (layout( binding=10 row_major std430) readonly buffer block{layout( row_major std430) buffer implicitly-sized array of 4-component vector of uint @data})
-0:?     'sbuf2' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of 4-component vector of uint @data})
-0:?     'sbuf3' (layout( binding=12 row_major std430) readonly buffer block{layout( row_major std430) buffer implicitly-sized array of 3-component vector of uint @data})
+0:?     'sbuf' (layout( binding=10 row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of 4-component vector of uint @data})
+0:?     'sbuf2' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of 4-component vector of uint @data})
+0:?     'sbuf2@count' (layout( row_major std430) buffer block{layout( row_major std430) buffer uint @count})
+0:?     'sbuf3' (layout( binding=12 row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of 3-component vector of uint @data})
 0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
-0:?     'pos' (layout( location=0) in uint)
+0:?     'pos' (layout( location=0) flat in uint)
+
+error: SPIRV-Tools Validation Errors
+error: Structure id 20 decorated as BufferBlock must be explicitly laid out with Offset decorations.
+  %__1 = OpTypeStruct %uint
 
 // Module Version 10000
-// Generated by (magic number): 80001
-// Id's are bound by 71
+// Generated by (magic number): 80007
+// Id's are bound by 78
 
                               Capability Shader
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "main" 59 62
+                              EntryPoint Fragment 4  "main" 63 66
                               ExecutionMode 4 OriginUpperLeft
                               Source HLSL 500
                               Name 4  "main"
@@ -149,42 +159,56 @@
                               Name 14  "bufferOffset"
                               Name 18  ""
                               MemberName 18 0  "@data"
-                              Name 25  "set(block--vu4[0]1;u1;vu4;"
-                              Name 22  "sb"
-                              Name 23  "bufferOffset"
-                              Name 24  "data"
-                              Name 31  "@main(u1;"
-                              Name 30  "pos"
-                              Name 44  "sbuf2"
-                              Name 46  "sbuf"
-                              Name 48  "param"
-                              Name 50  "param"
-                              Name 51  "param"
-                              Name 57  "pos"
-                              Name 59  "pos"
-                              Name 62  "@entryPointOutput"
-                              Name 63  "param"
-                              Name 68  "sbuf3"
-                              MemberName 68(sbuf3) 0  "@data"
-                              Name 70  "sbuf3"
+                              Name 20  ""
+                              MemberName 20 0  "@count"
+                              Name 28  "set(block--vu4[0]1;u1;vu4;"
+                              Name 24  "sb"
+                              Name 25  "sb@count"
+                              Name 26  "bufferOffset"
+                              Name 27  "data"
+                              Name 34  "@main(u1;"
+                              Name 33  "pos"
+                              Name 47  "sbuf2"
+                              Name 48  "sbuf2@count"
+                              Name 50  "sbuf"
+                              Name 52  "param"
+                              Name 54  "param"
+                              Name 55  "param"
+                              Name 61  "pos"
+                              Name 63  "pos"
+                              Name 66  "@entryPointOutput"
+                              Name 67  "param"
+                              Name 70  "sbuf2@count"
+                              MemberName 70(sbuf2@count) 0  "@count"
+                              Name 72  "sbuf2@count"
+                              Name 75  "sbuf3"
+                              MemberName 75(sbuf3) 0  "@data"
+                              Name 77  "sbuf3"
                               Decorate 8 ArrayStride 16
                               MemberDecorate 9 0 NonWritable
                               MemberDecorate 9 0 Offset 0
                               Decorate 9 BufferBlock
+                              Decorate 13(sb) NonWritable
                               Decorate 17 ArrayStride 16
                               MemberDecorate 18 0 Offset 0
                               Decorate 18 BufferBlock
-                              Decorate 44(sbuf2) DescriptorSet 0
-                              Decorate 46(sbuf) DescriptorSet 0
-                              Decorate 46(sbuf) Binding 10
-                              Decorate 59(pos) Location 0
-                              Decorate 62(@entryPointOutput) Location 0
-                              Decorate 67 ArrayStride 16
-                              MemberDecorate 68(sbuf3) 0 NonWritable
-                              MemberDecorate 68(sbuf3) 0 Offset 0
-                              Decorate 68(sbuf3) BufferBlock
-                              Decorate 70(sbuf3) DescriptorSet 0
-                              Decorate 70(sbuf3) Binding 12
+                              Decorate 20 BufferBlock
+                              Decorate 47(sbuf2) DescriptorSet 0
+                              Decorate 48(sbuf2@count) DescriptorSet 0
+                              Decorate 50(sbuf) DescriptorSet 0
+                              Decorate 50(sbuf) Binding 10
+                              Decorate 63(pos) Flat
+                              Decorate 63(pos) Location 0
+                              Decorate 66(@entryPointOutput) Location 0
+                              MemberDecorate 70(sbuf2@count) 0 Offset 0
+                              Decorate 70(sbuf2@count) BufferBlock
+                              Decorate 72(sbuf2@count) DescriptorSet 0
+                              Decorate 74 ArrayStride 16
+                              MemberDecorate 75(sbuf3) 0 NonWritable
+                              MemberDecorate 75(sbuf3) 0 Offset 0
+                              Decorate 75(sbuf3) BufferBlock
+                              Decorate 77(sbuf3) DescriptorSet 0
+                              Decorate 77(sbuf3) Binding 12
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 32 0
@@ -197,71 +221,78 @@
               17:             TypeRuntimeArray 7(ivec4)
               18:             TypeStruct 17
               19:             TypePointer Uniform 18(struct)
-              20:             TypePointer Function 7(ivec4)
-              21:             TypeFunction 2 19(ptr) 11(ptr) 20(ptr)
-              27:             TypeFloat 32
-              28:             TypeVector 27(float) 4
-              29:             TypeFunction 28(fvec4) 11(ptr)
-              33:             TypeInt 32 1
-              34:     33(int) Constant 0
-              36:             TypePointer Uniform 7(ivec4)
-       44(sbuf2):     19(ptr) Variable Uniform
-              45:      6(int) Constant 2
-        46(sbuf):     10(ptr) Variable Uniform
-              47:      6(int) Constant 3
-              53:   27(float) Constant 0
-              54:   28(fvec4) ConstantComposite 53 53 53 53
-              58:             TypePointer Input 6(int)
-         59(pos):     58(ptr) Variable Input
-              61:             TypePointer Output 28(fvec4)
-62(@entryPointOutput):     61(ptr) Variable Output
-              66:             TypeVector 6(int) 3
-              67:             TypeRuntimeArray 66(ivec3)
-       68(sbuf3):             TypeStruct 67
-              69:             TypePointer Uniform 68(sbuf3)
-       70(sbuf3):     69(ptr) Variable Uniform
+              20:             TypeStruct 6(int)
+              21:             TypePointer Uniform 20(struct)
+              22:             TypePointer Function 7(ivec4)
+              23:             TypeFunction 2 19(ptr) 21(ptr) 11(ptr) 22(ptr)
+              30:             TypeFloat 32
+              31:             TypeVector 30(float) 4
+              32:             TypeFunction 31(fvec4) 11(ptr)
+              36:             TypeInt 32 1
+              37:     36(int) Constant 0
+              39:             TypePointer Uniform 7(ivec4)
+       47(sbuf2):     19(ptr) Variable Uniform
+ 48(sbuf2@count):     21(ptr) Variable Uniform
+              49:      6(int) Constant 2
+        50(sbuf):     10(ptr) Variable Uniform
+              51:      6(int) Constant 3
+              57:   30(float) Constant 0
+              58:   31(fvec4) ConstantComposite 57 57 57 57
+              62:             TypePointer Input 6(int)
+         63(pos):     62(ptr) Variable Input
+              65:             TypePointer Output 31(fvec4)
+66(@entryPointOutput):     65(ptr) Variable Output
+ 70(sbuf2@count):             TypeStruct 6(int)
+              71:             TypePointer Uniform 70(sbuf2@count)
+ 72(sbuf2@count):     71(ptr) Variable Uniform
+              73:             TypeVector 6(int) 3
+              74:             TypeRuntimeArray 73(ivec3)
+       75(sbuf3):             TypeStruct 74
+              76:             TypePointer Uniform 75(sbuf3)
+       77(sbuf3):     76(ptr) Variable Uniform
          4(main):           2 Function None 3
                5:             Label
-         57(pos):     11(ptr) Variable Function
-       63(param):     11(ptr) Variable Function
-              60:      6(int) Load 59(pos)
-                              Store 57(pos) 60
-              64:      6(int) Load 57(pos)
-                              Store 63(param) 64
-              65:   28(fvec4) FunctionCall 31(@main(u1;) 63(param)
-                              Store 62(@entryPointOutput) 65
+         61(pos):     11(ptr) Variable Function
+       67(param):     11(ptr) Variable Function
+              64:      6(int) Load 63(pos)
+                              Store 61(pos) 64
+              68:      6(int) Load 61(pos)
+                              Store 67(param) 68
+              69:   31(fvec4) FunctionCall 34(@main(u1;) 67(param)
+                              Store 66(@entryPointOutput) 69
                               Return
                               FunctionEnd
 15(get(block--vu4[0]1;u1;):    7(ivec4) Function None 12
           13(sb):     10(ptr) FunctionParameter
 14(bufferOffset):     11(ptr) FunctionParameter
               16:             Label
-              35:      6(int) Load 14(bufferOffset)
-              37:     36(ptr) AccessChain 13(sb) 34 35
-              38:    7(ivec4) Load 37
-                              ReturnValue 38
+              38:      6(int) Load 14(bufferOffset)
+              40:     39(ptr) AccessChain 13(sb) 37 38
+              41:    7(ivec4) Load 40
+                              ReturnValue 41
                               FunctionEnd
-25(set(block--vu4[0]1;u1;vu4;):           2 Function None 21
-          22(sb):     19(ptr) FunctionParameter
-23(bufferOffset):     11(ptr) FunctionParameter
-        24(data):     20(ptr) FunctionParameter
-              26:             Label
-              41:      6(int) Load 23(bufferOffset)
-              42:    7(ivec4) Load 24(data)
-              43:     36(ptr) AccessChain 22(sb) 34 41
-                              Store 43 42
+28(set(block--vu4[0]1;u1;vu4;):           2 Function None 23
+          24(sb):     19(ptr) FunctionParameter
+    25(sb@count):     21(ptr) FunctionParameter
+26(bufferOffset):     11(ptr) FunctionParameter
+        27(data):     22(ptr) FunctionParameter
+              29:             Label
+              44:      6(int) Load 26(bufferOffset)
+              45:    7(ivec4) Load 27(data)
+              46:     39(ptr) AccessChain 24(sb) 37 44
+                              Store 46 45
                               Return
                               FunctionEnd
-   31(@main(u1;):   28(fvec4) Function None 29
-         30(pos):     11(ptr) FunctionParameter
-              32:             Label
-       48(param):     11(ptr) Variable Function
-       50(param):     11(ptr) Variable Function
-       51(param):     20(ptr) Variable Function
-                              Store 48(param) 47
-              49:    7(ivec4) FunctionCall 15(get(block--vu4[0]1;u1;) 46(sbuf) 48(param)
-                              Store 50(param) 45
-                              Store 51(param) 49
-              52:           2 FunctionCall 25(set(block--vu4[0]1;u1;vu4;) 44(sbuf2) 50(param) 51(param)
-                              ReturnValue 54
+   34(@main(u1;):   31(fvec4) Function None 32
+         33(pos):     11(ptr) FunctionParameter
+              35:             Label
+       52(param):     11(ptr) Variable Function
+       54(param):     11(ptr) Variable Function
+       55(param):     22(ptr) Variable Function
+                              Store 52(param) 51
+              53:    7(ivec4) FunctionCall 15(get(block--vu4[0]1;u1;) 50(sbuf) 52(param)
+                              Store 54(param) 49
+                              Store 55(param) 53
+              56:           2 FunctionCall 28(set(block--vu4[0]1;u1;vu4;) 47(sbuf2) 48(sbuf2@count) 54(param) 55(param)
+                              ReturnValue 58
                               FunctionEnd
diff --git a/Test/baseResults/hlsl.structbuffer.fn2.comp.out b/Test/baseResults/hlsl.structbuffer.fn2.comp.out
index 686a0a2..517b48c 100644
--- a/Test/baseResults/hlsl.structbuffer.fn2.comp.out
+++ b/Test/baseResults/hlsl.structbuffer.fn2.comp.out
@@ -5,7 +5,7 @@
 0:5  Function Definition: testLoad(u1;block--u1[0]1; ( temp 2-component vector of uint)
 0:5    Function Parameters: 
 0:5      'loc' ( in uint)
-0:5      'buffer' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:5      'buffer' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:?     Sequence
 0:6      Sequence
 0:6        move second child to first child ( temp 2-component vector of uint)
@@ -18,15 +18,15 @@
 0:6                Constant:
 0:6                  2 (const int)
 0:?             Construct vec2 ( temp 2-component vector of uint)
-0:6              indirect index ( temp float)
-0:6                @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:6                  'buffer' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:6              indirect index ( temp uint)
+0:6                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:6                  'buffer' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:6                  Constant:
 0:6                    0 (const uint)
 0:6                'byteAddrTemp' ( temp int)
-0:6              indirect index ( temp float)
-0:6                @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:6                  'buffer' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:6              indirect index ( temp uint)
+0:6                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:6                  'buffer' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:6                  Constant:
 0:6                    0 (const uint)
 0:6                add ( temp int)
@@ -44,7 +44,7 @@
 0:13          'result' ( temp 2-component vector of uint)
 0:13          Function Call: testLoad(u1;block--u1[0]1; ( temp 2-component vector of uint)
 0:13            'dispatchId' ( in uint)
-0:13            'g_input' (layout( binding=0 row_major std430) readonly buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:13            'g_input' (layout( binding=0 row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:14      Sequence
 0:14        imageStore ( temp void)
 0:14          'g_output' (layout( binding=1 rg32ui) uniform uimageBuffer)
@@ -56,13 +56,14 @@
 0:?     Sequence
 0:12      move second child to first child ( temp uint)
 0:?         'dispatchId' ( temp uint)
-0:?         'dispatchId' ( in uint GlobalInvocationID)
+0:?         Construct uint ( temp uint)
+0:?           'dispatchId' ( in 3-component vector of uint GlobalInvocationID)
 0:12      Function Call: @main(u1; ( temp void)
 0:?         'dispatchId' ( temp uint)
 0:?   Linker Objects
-0:?     'g_input' (layout( binding=0 row_major std430) readonly buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:?     'g_input' (layout( binding=0 row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:?     'g_output' (layout( binding=1 rg32ui) uniform uimageBuffer)
-0:?     'dispatchId' ( in uint GlobalInvocationID)
+0:?     'dispatchId' ( in 3-component vector of uint GlobalInvocationID)
 
 
 Linked compute stage:
@@ -74,7 +75,7 @@
 0:5  Function Definition: testLoad(u1;block--u1[0]1; ( temp 2-component vector of uint)
 0:5    Function Parameters: 
 0:5      'loc' ( in uint)
-0:5      'buffer' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:5      'buffer' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:?     Sequence
 0:6      Sequence
 0:6        move second child to first child ( temp 2-component vector of uint)
@@ -87,15 +88,15 @@
 0:6                Constant:
 0:6                  2 (const int)
 0:?             Construct vec2 ( temp 2-component vector of uint)
-0:6              indirect index ( temp float)
-0:6                @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:6                  'buffer' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:6              indirect index ( temp uint)
+0:6                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:6                  'buffer' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:6                  Constant:
 0:6                    0 (const uint)
 0:6                'byteAddrTemp' ( temp int)
-0:6              indirect index ( temp float)
-0:6                @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:6                  'buffer' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:6              indirect index ( temp uint)
+0:6                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:6                  'buffer' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:6                  Constant:
 0:6                    0 (const uint)
 0:6                add ( temp int)
@@ -113,7 +114,7 @@
 0:13          'result' ( temp 2-component vector of uint)
 0:13          Function Call: testLoad(u1;block--u1[0]1; ( temp 2-component vector of uint)
 0:13            'dispatchId' ( in uint)
-0:13            'g_input' (layout( binding=0 row_major std430) readonly buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:13            'g_input' (layout( binding=0 row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:14      Sequence
 0:14        imageStore ( temp void)
 0:14          'g_output' (layout( binding=1 rg32ui) uniform uimageBuffer)
@@ -125,24 +126,25 @@
 0:?     Sequence
 0:12      move second child to first child ( temp uint)
 0:?         'dispatchId' ( temp uint)
-0:?         'dispatchId' ( in uint GlobalInvocationID)
+0:?         Construct uint ( temp uint)
+0:?           'dispatchId' ( in 3-component vector of uint GlobalInvocationID)
 0:12      Function Call: @main(u1; ( temp void)
 0:?         'dispatchId' ( temp uint)
 0:?   Linker Objects
-0:?     'g_input' (layout( binding=0 row_major std430) readonly buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:?     'g_input' (layout( binding=0 row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:?     'g_output' (layout( binding=1 rg32ui) uniform uimageBuffer)
-0:?     'dispatchId' ( in uint GlobalInvocationID)
+0:?     'dispatchId' ( in 3-component vector of uint GlobalInvocationID)
 
 // Module Version 10000
-// Generated by (magic number): 80001
-// Id's are bound by 61
+// Generated by (magic number): 80007
+// Id's are bound by 63
 
                               Capability Shader
-                              Capability SampledBuffer
+                              Capability ImageBuffer
                               Capability StorageImageExtendedFormats
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint GLCompute 4  "main" 56
+                              EntryPoint GLCompute 4  "main" 57
                               ExecutionMode 4 LocalSize 256 1 1
                               Source HLSL 500
                               Name 4  "main"
@@ -160,17 +162,18 @@
                               Name 45  "param"
                               Name 50  "g_output"
                               Name 54  "dispatchId"
-                              Name 56  "dispatchId"
-                              Name 58  "param"
+                              Name 57  "dispatchId"
+                              Name 60  "param"
                               Decorate 8 ArrayStride 4
                               MemberDecorate 9 0 NonWritable
                               MemberDecorate 9 0 Offset 0
                               Decorate 9 BufferBlock
+                              Decorate 14(buffer) NonWritable
                               Decorate 44(g_input) DescriptorSet 0
                               Decorate 44(g_input) Binding 0
                               Decorate 50(g_output) DescriptorSet 0
                               Decorate 50(g_output) Binding 1
-                              Decorate 56(dispatchId) BuiltIn GlobalInvocationId
+                              Decorate 57(dispatchId) BuiltIn GlobalInvocationId
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 32 0
@@ -192,17 +195,19 @@
               48:             TypeImage 6(int) Buffer nonsampled format:Rg32ui
               49:             TypePointer UniformConstant 48
     50(g_output):     49(ptr) Variable UniformConstant
-              55:             TypePointer Input 6(int)
-  56(dispatchId):     55(ptr) Variable Input
+              55:             TypeVector 6(int) 3
+              56:             TypePointer Input 55(ivec3)
+  57(dispatchId):     56(ptr) Variable Input
          4(main):           2 Function None 3
                5:             Label
   54(dispatchId):      7(ptr) Variable Function
-       58(param):      7(ptr) Variable Function
-              57:      6(int) Load 56(dispatchId)
-                              Store 54(dispatchId) 57
-              59:      6(int) Load 54(dispatchId)
-                              Store 58(param) 59
-              60:           2 FunctionCall 19(@main(u1;) 58(param)
+       60(param):      7(ptr) Variable Function
+              58:   55(ivec3) Load 57(dispatchId)
+              59:      6(int) CompositeExtract 58 0
+                              Store 54(dispatchId) 59
+              61:      6(int) Load 54(dispatchId)
+                              Store 60(param) 61
+              62:           2 FunctionCall 19(@main(u1;) 60(param)
                               Return
                               FunctionEnd
 15(testLoad(u1;block--u1[0]1;):   11(ivec2) Function None 12
diff --git a/Test/baseResults/hlsl.structbuffer.frag.out b/Test/baseResults/hlsl.structbuffer.frag.out
index 634c1b8..af76bfb 100644
--- a/Test/baseResults/hlsl.structbuffer.frag.out
+++ b/Test/baseResults/hlsl.structbuffer.frag.out
@@ -10,8 +10,8 @@
 0:13        move second child to first child ( temp structure{ temp 3-component vector of float color,  temp bool test,  temp bool test2})
 0:13          'mydata' ( temp structure{ temp 3-component vector of float color,  temp bool test,  temp bool test2})
 0:13          indirect index (layout( row_major std430) buffer structure{ temp 3-component vector of float color,  temp bool test,  temp bool test2})
-0:13            @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of structure{ temp 3-component vector of float color,  temp bool test,  temp bool test2})
-0:13              'sbuf' (layout( binding=10 row_major std430) readonly buffer block{layout( row_major std430) buffer implicitly-sized array of structure{ temp 3-component vector of float color,  temp bool test,  temp bool test2} @data})
+0:13            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 3-component vector of float color,  temp bool test,  temp bool test2})
+0:13              'sbuf' (layout( binding=10 row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 3-component vector of float color,  temp bool test,  temp bool test2} @data})
 0:13              Constant:
 0:13                0 (const uint)
 0:13            'pos' ( in uint)
@@ -19,8 +19,8 @@
 0:17        move second child to first child ( temp uint)
 0:17          'size' ( temp uint)
 0:17          array length ( temp uint)
-0:17            @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of structure{ temp 3-component vector of float color,  temp bool test,  temp bool test2})
-0:17              'sbuf' (layout( binding=10 row_major std430) readonly buffer block{layout( row_major std430) buffer implicitly-sized array of structure{ temp 3-component vector of float color,  temp bool test,  temp bool test2} @data})
+0:17            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 3-component vector of float color,  temp bool test,  temp bool test2})
+0:17              'sbuf' (layout( binding=10 row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 3-component vector of float color,  temp bool test,  temp bool test2} @data})
 0:17              Constant:
 0:17                0 (const uint)
 0:17        move second child to first child ( temp uint)
@@ -31,8 +31,8 @@
 0:19        Condition
 0:19        test: direct index for structure ( temp bool)
 0:19          indirect index (layout( row_major std430) buffer structure{ temp 3-component vector of float color,  temp bool test,  temp bool test2})
-0:19            @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of structure{ temp 3-component vector of float color,  temp bool test,  temp bool test2})
-0:19              'sbuf' (layout( binding=10 row_major std430) readonly buffer block{layout( row_major std430) buffer implicitly-sized array of structure{ temp 3-component vector of float color,  temp bool test,  temp bool test2} @data})
+0:19            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 3-component vector of float color,  temp bool test,  temp bool test2})
+0:19              'sbuf' (layout( binding=10 row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 3-component vector of float color,  temp bool test,  temp bool test2} @data})
 0:19              Constant:
 0:19                0 (const uint)
 0:19            'pos' ( in uint)
@@ -44,16 +44,16 @@
 0:20            add ( temp 3-component vector of float)
 0:20              color: direct index for structure ( temp 3-component vector of float)
 0:20                indirect index (layout( row_major std430) buffer structure{ temp 3-component vector of float color,  temp bool test,  temp bool test2})
-0:20                  @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of structure{ temp 3-component vector of float color,  temp bool test,  temp bool test2})
-0:20                    'sbuf' (layout( binding=10 row_major std430) readonly buffer block{layout( row_major std430) buffer implicitly-sized array of structure{ temp 3-component vector of float color,  temp bool test,  temp bool test2} @data})
+0:20                  @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 3-component vector of float color,  temp bool test,  temp bool test2})
+0:20                    'sbuf' (layout( binding=10 row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 3-component vector of float color,  temp bool test,  temp bool test2} @data})
 0:20                    Constant:
 0:20                      0 (const uint)
 0:20                  'pos' ( in uint)
 0:20                Constant:
 0:20                  0 (const int)
 0:20              indirect index (layout( row_major std430) buffer float)
-0:20                @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of float)
-0:20                  'sbuf2' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer implicitly-sized array of float @data})
+0:20                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of float)
+0:20                  'sbuf2' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of float @data})
 0:20                  Constant:
 0:20                    0 (const uint)
 0:20                'pos' ( in uint)
@@ -80,16 +80,16 @@
 0:?     Sequence
 0:12      move second child to first child ( temp uint)
 0:?         'pos' ( temp uint)
-0:?         'pos' (layout( location=0) in uint)
+0:?         'pos' (layout( location=0) flat in uint)
 0:12      move second child to first child ( temp 4-component vector of float)
 0:?         '@entryPointOutput' (layout( location=0) out 4-component vector of float)
 0:12        Function Call: @main(u1; ( temp 4-component vector of float)
 0:?           'pos' ( temp uint)
 0:?   Linker Objects
-0:?     'sbuf' (layout( binding=10 row_major std430) readonly buffer block{layout( row_major std430) buffer implicitly-sized array of structure{ temp 3-component vector of float color,  temp bool test,  temp bool test2} @data})
-0:?     'sbuf2' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer implicitly-sized array of float @data})
+0:?     'sbuf' (layout( binding=10 row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 3-component vector of float color,  temp bool test,  temp bool test2} @data})
+0:?     'sbuf2' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of float @data})
 0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
-0:?     'pos' (layout( location=0) in uint)
+0:?     'pos' (layout( location=0) flat in uint)
 
 
 Linked fragment stage:
@@ -106,8 +106,8 @@
 0:13        move second child to first child ( temp structure{ temp 3-component vector of float color,  temp bool test,  temp bool test2})
 0:13          'mydata' ( temp structure{ temp 3-component vector of float color,  temp bool test,  temp bool test2})
 0:13          indirect index (layout( row_major std430) buffer structure{ temp 3-component vector of float color,  temp bool test,  temp bool test2})
-0:13            @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of structure{ temp 3-component vector of float color,  temp bool test,  temp bool test2})
-0:13              'sbuf' (layout( binding=10 row_major std430) readonly buffer block{layout( row_major std430) buffer implicitly-sized array of structure{ temp 3-component vector of float color,  temp bool test,  temp bool test2} @data})
+0:13            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 3-component vector of float color,  temp bool test,  temp bool test2})
+0:13              'sbuf' (layout( binding=10 row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 3-component vector of float color,  temp bool test,  temp bool test2} @data})
 0:13              Constant:
 0:13                0 (const uint)
 0:13            'pos' ( in uint)
@@ -115,8 +115,8 @@
 0:17        move second child to first child ( temp uint)
 0:17          'size' ( temp uint)
 0:17          array length ( temp uint)
-0:17            @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of structure{ temp 3-component vector of float color,  temp bool test,  temp bool test2})
-0:17              'sbuf' (layout( binding=10 row_major std430) readonly buffer block{layout( row_major std430) buffer implicitly-sized array of structure{ temp 3-component vector of float color,  temp bool test,  temp bool test2} @data})
+0:17            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 3-component vector of float color,  temp bool test,  temp bool test2})
+0:17              'sbuf' (layout( binding=10 row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 3-component vector of float color,  temp bool test,  temp bool test2} @data})
 0:17              Constant:
 0:17                0 (const uint)
 0:17        move second child to first child ( temp uint)
@@ -127,8 +127,8 @@
 0:19        Condition
 0:19        test: direct index for structure ( temp bool)
 0:19          indirect index (layout( row_major std430) buffer structure{ temp 3-component vector of float color,  temp bool test,  temp bool test2})
-0:19            @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of structure{ temp 3-component vector of float color,  temp bool test,  temp bool test2})
-0:19              'sbuf' (layout( binding=10 row_major std430) readonly buffer block{layout( row_major std430) buffer implicitly-sized array of structure{ temp 3-component vector of float color,  temp bool test,  temp bool test2} @data})
+0:19            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 3-component vector of float color,  temp bool test,  temp bool test2})
+0:19              'sbuf' (layout( binding=10 row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 3-component vector of float color,  temp bool test,  temp bool test2} @data})
 0:19              Constant:
 0:19                0 (const uint)
 0:19            'pos' ( in uint)
@@ -140,16 +140,16 @@
 0:20            add ( temp 3-component vector of float)
 0:20              color: direct index for structure ( temp 3-component vector of float)
 0:20                indirect index (layout( row_major std430) buffer structure{ temp 3-component vector of float color,  temp bool test,  temp bool test2})
-0:20                  @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of structure{ temp 3-component vector of float color,  temp bool test,  temp bool test2})
-0:20                    'sbuf' (layout( binding=10 row_major std430) readonly buffer block{layout( row_major std430) buffer implicitly-sized array of structure{ temp 3-component vector of float color,  temp bool test,  temp bool test2} @data})
+0:20                  @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 3-component vector of float color,  temp bool test,  temp bool test2})
+0:20                    'sbuf' (layout( binding=10 row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 3-component vector of float color,  temp bool test,  temp bool test2} @data})
 0:20                    Constant:
 0:20                      0 (const uint)
 0:20                  'pos' ( in uint)
 0:20                Constant:
 0:20                  0 (const int)
 0:20              indirect index (layout( row_major std430) buffer float)
-0:20                @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of float)
-0:20                  'sbuf2' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer implicitly-sized array of float @data})
+0:20                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of float)
+0:20                  'sbuf2' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of float @data})
 0:20                  Constant:
 0:20                    0 (const uint)
 0:20                'pos' ( in uint)
@@ -176,25 +176,25 @@
 0:?     Sequence
 0:12      move second child to first child ( temp uint)
 0:?         'pos' ( temp uint)
-0:?         'pos' (layout( location=0) in uint)
+0:?         'pos' (layout( location=0) flat in uint)
 0:12      move second child to first child ( temp 4-component vector of float)
 0:?         '@entryPointOutput' (layout( location=0) out 4-component vector of float)
 0:12        Function Call: @main(u1; ( temp 4-component vector of float)
 0:?           'pos' ( temp uint)
 0:?   Linker Objects
-0:?     'sbuf' (layout( binding=10 row_major std430) readonly buffer block{layout( row_major std430) buffer implicitly-sized array of structure{ temp 3-component vector of float color,  temp bool test,  temp bool test2} @data})
-0:?     'sbuf2' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer implicitly-sized array of float @data})
+0:?     'sbuf' (layout( binding=10 row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 3-component vector of float color,  temp bool test,  temp bool test2} @data})
+0:?     'sbuf2' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of float @data})
 0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
-0:?     'pos' (layout( location=0) in uint)
+0:?     'pos' (layout( location=0) flat in uint)
 
 // Module Version 10000
-// Generated by (magic number): 80001
-// Id's are bound by 94
+// Generated by (magic number): 80007
+// Id's are bound by 96
 
                               Capability Shader
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "main" 87 90
+                              EntryPoint Fragment 4  "main" 89 92
                               ExecutionMode 4 OriginUpperLeft
                               Source HLSL 500
                               Name 4  "main"
@@ -212,20 +212,17 @@
                               Name 21  "sbuf"
                               MemberName 21(sbuf) 0  "@data"
                               Name 23  "sbuf"
-                              Name 40  "size"
-                              Name 42  "stride"
-                              Name 57  "sbuf2"
-                              MemberName 57(sbuf2) 0  "@data"
+                              Name 43  "size"
+                              Name 45  "stride"
                               Name 59  "sbuf2"
-                              Name 85  "pos"
+                              MemberName 59(sbuf2) 0  "@data"
+                              Name 61  "sbuf2"
                               Name 87  "pos"
-                              Name 90  "@entryPointOutput"
-                              Name 91  "param"
-                              MemberDecorate 19(sb_t) 0 NonWritable
+                              Name 89  "pos"
+                              Name 92  "@entryPointOutput"
+                              Name 93  "param"
                               MemberDecorate 19(sb_t) 0 Offset 0
-                              MemberDecorate 19(sb_t) 1 NonWritable
                               MemberDecorate 19(sb_t) 1 Offset 12
-                              MemberDecorate 19(sb_t) 2 NonWritable
                               MemberDecorate 19(sb_t) 2 Offset 16
                               Decorate 20 ArrayStride 32
                               MemberDecorate 21(sbuf) 0 NonWritable
@@ -233,13 +230,14 @@
                               Decorate 21(sbuf) BufferBlock
                               Decorate 23(sbuf) DescriptorSet 0
                               Decorate 23(sbuf) Binding 10
-                              Decorate 56 ArrayStride 4
-                              MemberDecorate 57(sbuf2) 0 NonWritable
-                              MemberDecorate 57(sbuf2) 0 Offset 0
-                              Decorate 57(sbuf2) BufferBlock
-                              Decorate 59(sbuf2) DescriptorSet 0
-                              Decorate 87(pos) Location 0
-                              Decorate 90(@entryPointOutput) Location 0
+                              Decorate 58 ArrayStride 4
+                              MemberDecorate 59(sbuf2) 0 NonWritable
+                              MemberDecorate 59(sbuf2) 0 Offset 0
+                              Decorate 59(sbuf2) BufferBlock
+                              Decorate 61(sbuf2) DescriptorSet 0
+                              Decorate 89(pos) Flat
+                              Decorate 89(pos) Location 0
+                              Decorate 92(@entryPointOutput) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 32 0
@@ -261,41 +259,41 @@
               27:             TypePointer Uniform 19(sb_t)
               31:             TypePointer Function 14(fvec3)
               34:     24(int) Constant 1
-              35:             TypePointer Function 15(bool)
-              38:     24(int) Constant 2
-              43:      6(int) Constant 32
-              45:             TypePointer Uniform 6(int)
-              48:      6(int) Constant 0
-              53:             TypePointer Uniform 14(fvec3)
-              56:             TypeRuntimeArray 8(float)
-       57(sbuf2):             TypeStruct 56
-              58:             TypePointer Uniform 57(sbuf2)
-       59(sbuf2):     58(ptr) Variable Uniform
-              61:             TypePointer Uniform 8(float)
-              66:    8(float) Constant 0
-              73:             TypePointer Function 8(float)
-              86:             TypePointer Input 6(int)
-         87(pos):     86(ptr) Variable Input
-              89:             TypePointer Output 9(fvec4)
-90(@entryPointOutput):     89(ptr) Variable Output
+              35:      6(int) Constant 0
+              37:             TypePointer Function 15(bool)
+              40:     24(int) Constant 2
+              46:      6(int) Constant 32
+              48:             TypePointer Uniform 6(int)
+              55:             TypePointer Uniform 14(fvec3)
+              58:             TypeRuntimeArray 8(float)
+       59(sbuf2):             TypeStruct 58
+              60:             TypePointer Uniform 59(sbuf2)
+       61(sbuf2):     60(ptr) Variable Uniform
+              63:             TypePointer Uniform 8(float)
+              68:    8(float) Constant 0
+              75:             TypePointer Function 8(float)
+              88:             TypePointer Input 6(int)
+         89(pos):     88(ptr) Variable Input
+              91:             TypePointer Output 9(fvec4)
+92(@entryPointOutput):     91(ptr) Variable Output
          4(main):           2 Function None 3
                5:             Label
-         85(pos):      7(ptr) Variable Function
-       91(param):      7(ptr) Variable Function
-              88:      6(int) Load 87(pos)
-                              Store 85(pos) 88
-              92:      6(int) Load 85(pos)
-                              Store 91(param) 92
-              93:    9(fvec4) FunctionCall 12(@main(u1;) 91(param)
-                              Store 90(@entryPointOutput) 93
+         87(pos):      7(ptr) Variable Function
+       93(param):      7(ptr) Variable Function
+              90:      6(int) Load 89(pos)
+                              Store 87(pos) 90
+              94:      6(int) Load 87(pos)
+                              Store 93(param) 94
+              95:    9(fvec4) FunctionCall 12(@main(u1;) 93(param)
+                              Store 92(@entryPointOutput) 95
                               Return
                               FunctionEnd
    12(@main(u1;):    9(fvec4) Function None 10
          11(pos):      7(ptr) FunctionParameter
               13:             Label
       18(mydata):     17(ptr) Variable Function
-        40(size):      7(ptr) Variable Function
-      42(stride):      7(ptr) Variable Function
+        43(size):      7(ptr) Variable Function
+      45(stride):      7(ptr) Variable Function
               26:      6(int) Load 11(pos)
               28:     27(ptr) AccessChain 23(sbuf) 25 26
               29:    19(sb_t) Load 28
@@ -303,46 +301,48 @@
               32:     31(ptr) AccessChain 18(mydata) 25
                               Store 32 30
               33:      6(int) CompositeExtract 29 1
-              36:     35(ptr) AccessChain 18(mydata) 34
-                              Store 36 33
-              37:      6(int) CompositeExtract 29 2
-              39:     35(ptr) AccessChain 18(mydata) 38
-                              Store 39 37
-              41:     24(int) ArrayLength 23(sbuf) 0
-                              Store 40(size) 41
-                              Store 42(stride) 43
-              44:      6(int) Load 11(pos)
-              46:     45(ptr) AccessChain 23(sbuf) 25 44 34
-              47:      6(int) Load 46
-              49:    15(bool) INotEqual 47 48
-                              SelectionMerge 51 None
-                              BranchConditional 49 50 72
-              50:               Label
-              52:      6(int)   Load 11(pos)
-              54:     53(ptr)   AccessChain 23(sbuf) 25 52 25
-              55:   14(fvec3)   Load 54
-              60:      6(int)   Load 11(pos)
-              62:     61(ptr)   AccessChain 59(sbuf2) 25 60
-              63:    8(float)   Load 62
-              64:   14(fvec3)   CompositeConstruct 63 63 63
-              65:   14(fvec3)   FAdd 55 64
-              67:    8(float)   CompositeExtract 65 0
-              68:    8(float)   CompositeExtract 65 1
-              69:    8(float)   CompositeExtract 65 2
-              70:    9(fvec4)   CompositeConstruct 67 68 69 66
-                                ReturnValue 70
-              72:               Label
-              74:     73(ptr)   AccessChain 18(mydata) 25 48
-              75:    8(float)   Load 74
-              76:      6(int)   Load 40(size)
-              77:    8(float)   ConvertUToF 76
-              78:    8(float)   FAdd 75 77
-              79:      6(int)   Load 42(stride)
-              80:    8(float)   ConvertUToF 79
-              81:    8(float)   FAdd 78 80
-              82:    9(fvec4)   CompositeConstruct 81 81 81 81
-                                ReturnValue 82
-              51:             Label
-              84:    9(fvec4) Undef
-                              ReturnValue 84
+              36:    15(bool) INotEqual 33 35
+              38:     37(ptr) AccessChain 18(mydata) 34
+                              Store 38 36
+              39:      6(int) CompositeExtract 29 2
+              41:    15(bool) INotEqual 39 35
+              42:     37(ptr) AccessChain 18(mydata) 40
+                              Store 42 41
+              44:      6(int) ArrayLength 23(sbuf) 0
+                              Store 43(size) 44
+                              Store 45(stride) 46
+              47:      6(int) Load 11(pos)
+              49:     48(ptr) AccessChain 23(sbuf) 25 47 34
+              50:      6(int) Load 49
+              51:    15(bool) INotEqual 50 35
+                              SelectionMerge 53 None
+                              BranchConditional 51 52 74
+              52:               Label
+              54:      6(int)   Load 11(pos)
+              56:     55(ptr)   AccessChain 23(sbuf) 25 54 25
+              57:   14(fvec3)   Load 56
+              62:      6(int)   Load 11(pos)
+              64:     63(ptr)   AccessChain 61(sbuf2) 25 62
+              65:    8(float)   Load 64
+              66:   14(fvec3)   CompositeConstruct 65 65 65
+              67:   14(fvec3)   FAdd 57 66
+              69:    8(float)   CompositeExtract 67 0
+              70:    8(float)   CompositeExtract 67 1
+              71:    8(float)   CompositeExtract 67 2
+              72:    9(fvec4)   CompositeConstruct 69 70 71 68
+                                ReturnValue 72
+              74:               Label
+              76:     75(ptr)   AccessChain 18(mydata) 25 35
+              77:    8(float)   Load 76
+              78:      6(int)   Load 43(size)
+              79:    8(float)   ConvertUToF 78
+              80:    8(float)   FAdd 77 79
+              81:      6(int)   Load 45(stride)
+              82:    8(float)   ConvertUToF 81
+              83:    8(float)   FAdd 80 82
+              84:    9(fvec4)   CompositeConstruct 83 83 83 83
+                                ReturnValue 84
+              53:             Label
+              86:    9(fvec4) Undef
+                              ReturnValue 86
                               FunctionEnd
diff --git a/Test/baseResults/hlsl.structbuffer.incdec.frag.hlslfun1.out b/Test/baseResults/hlsl.structbuffer.incdec.frag.hlslfun1.out
new file mode 100644
index 0000000..8b84a73
--- /dev/null
+++ b/Test/baseResults/hlsl.structbuffer.incdec.frag.hlslfun1.out
@@ -0,0 +1,125 @@
+hlsl.structbuffer.incdec.frag
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 70
+
+                              Capability Shader
+                              Extension  "SPV_GOOGLE_hlsl_functionality1"
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 63 66
+                              ExecutionMode 4 OriginUpperLeft
+                              Source HLSL 500
+                              Name 4  "main"
+                              Name 12  "@main(u1;"
+                              Name 11  "pos"
+                              Name 16  "result"
+                              Name 20  "sbuf_rw_i"
+                              MemberName 20(sbuf_rw_i) 0  "@data"
+                              Name 22  "sbuf_rw_i"
+                              Name 26  "sbuf_rw_d"
+                              Name 27  "sbuf_rw_nocounter"
+                              Name 33  "c1"
+                              Name 34  "sbuf_rw_i@count"
+                              MemberName 34(sbuf_rw_i@count) 0  "@count"
+                              Name 36  "sbuf_rw_i@count"
+                              Name 41  "c2"
+                              Name 42  "sbuf_rw_d@count"
+                              Name 61  "pos"
+                              Name 63  "pos"
+                              Name 66  "@entryPointOutput"
+                              Name 67  "param"
+                              Decorate 19 ArrayStride 16
+                              MemberDecorate 20(sbuf_rw_i) 0 Offset 0
+                              Decorate 20(sbuf_rw_i) BufferBlock
+                              Decorate 22(sbuf_rw_i) DescriptorSet 0
+                              Decorate 26(sbuf_rw_d) DescriptorSet 0
+                              Decorate 27(sbuf_rw_nocounter) DescriptorSet 0
+                              MemberDecorate 34(sbuf_rw_i@count) 0 Offset 0
+                              Decorate 34(sbuf_rw_i@count) BufferBlock
+                              Decorate 36(sbuf_rw_i@count) DescriptorSet 0
+                              Decorate 42(sbuf_rw_d@count) DescriptorSet 0
+                              Decorate 63(pos) Flat
+                              Decorate 63(pos) Location 0
+                              DecorateStringGOOGLE 63(pos) DecorationHlslSemanticGOOGLE  "FOO"
+                              Decorate 66(@entryPointOutput) Location 0
+                              DecorateStringGOOGLE 66(@entryPointOutput) DecorationHlslSemanticGOOGLE  "SV_TARGET0"
+                              DecorateId 22(sbuf_rw_i) DecorationHlslCounterBufferGOOGLE 36(sbuf_rw_i@count)
+                              DecorateId 26(sbuf_rw_d) DecorationHlslCounterBufferGOOGLE 42(sbuf_rw_d@count)
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeInt 32 0
+               7:             TypePointer Function 6(int)
+               8:             TypeFloat 32
+               9:             TypeVector 8(float) 4
+              10:             TypeFunction 9(fvec4) 7(ptr)
+              14:             TypeVector 6(int) 4
+              15:             TypePointer Function 14(ivec4)
+              17:      6(int) Constant 0
+              18:   14(ivec4) ConstantComposite 17 17 17 17
+              19:             TypeRuntimeArray 14(ivec4)
+   20(sbuf_rw_i):             TypeStruct 19
+              21:             TypePointer Uniform 20(sbuf_rw_i)
+   22(sbuf_rw_i):     21(ptr) Variable Uniform
+              23:             TypeInt 32 1
+              24:     23(int) Constant 0
+              25:     23(int) Constant 7
+   26(sbuf_rw_d):     21(ptr) Variable Uniform
+27(sbuf_rw_nocounter):     21(ptr) Variable Uniform
+              28:     23(int) Constant 5
+              29:      6(int) Constant 2
+              30:   14(ivec4) ConstantComposite 29 29 29 29
+              31:             TypePointer Uniform 14(ivec4)
+34(sbuf_rw_i@count):             TypeStruct 6(int)
+              35:             TypePointer Uniform 34(sbuf_rw_i@count)
+36(sbuf_rw_i@count):     35(ptr) Variable Uniform
+              37:             TypePointer Uniform 6(int)
+              39:      6(int) Constant 1
+42(sbuf_rw_d@count):     35(ptr) Variable Uniform
+              44:      6(int) Constant 4294967295
+              46:     23(int) Constant 4294967295
+              62:             TypePointer Input 6(int)
+         63(pos):     62(ptr) Variable Input
+              65:             TypePointer Output 9(fvec4)
+66(@entryPointOutput):     65(ptr) Variable Output
+         4(main):           2 Function None 3
+               5:             Label
+         61(pos):      7(ptr) Variable Function
+       67(param):      7(ptr) Variable Function
+              64:      6(int) Load 63(pos)
+                              Store 61(pos) 64
+              68:      6(int) Load 61(pos)
+                              Store 67(param) 68
+              69:    9(fvec4) FunctionCall 12(@main(u1;) 67(param)
+                              Store 66(@entryPointOutput) 69
+                              Return
+                              FunctionEnd
+   12(@main(u1;):    9(fvec4) Function None 10
+         11(pos):      7(ptr) FunctionParameter
+              13:             Label
+      16(result):     15(ptr) Variable Function
+          33(c1):      7(ptr) Variable Function
+          41(c2):      7(ptr) Variable Function
+                              Store 16(result) 18
+              32:     31(ptr) AccessChain 27(sbuf_rw_nocounter) 24 28
+                              Store 32 30
+              38:     37(ptr) AccessChain 36(sbuf_rw_i@count) 24
+              40:      6(int) AtomicIAdd 38 39 17 39
+                              Store 33(c1) 40
+              43:     37(ptr) AccessChain 42(sbuf_rw_d@count) 24
+              45:      6(int) AtomicIAdd 43 39 17 44
+              47:      6(int) IAdd 45 46
+                              Store 41(c2) 47
+              48:      7(ptr) AccessChain 16(result) 17
+              49:      6(int) Load 48
+              50:    8(float) ConvertUToF 49
+              51:      7(ptr) AccessChain 16(result) 39
+              52:      6(int) Load 51
+              53:    8(float) ConvertUToF 52
+              54:      6(int) Load 33(c1)
+              55:    8(float) ConvertUToF 54
+              56:      6(int) Load 41(c2)
+              57:    8(float) ConvertUToF 56
+              58:    9(fvec4) CompositeConstruct 50 53 55 57
+                              ReturnValue 58
+                              FunctionEnd
diff --git a/Test/baseResults/hlsl.structbuffer.incdec.frag.out b/Test/baseResults/hlsl.structbuffer.incdec.frag.out
index ebd6941..5c8afd9 100644
--- a/Test/baseResults/hlsl.structbuffer.incdec.frag.out
+++ b/Test/baseResults/hlsl.structbuffer.incdec.frag.out
@@ -15,23 +15,23 @@
 0:8            0 (const uint)
 0:8            0 (const uint)
 0:10      direct index (layout( row_major std430) buffer 4-component vector of uint)
-0:10        @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of 4-component vector of uint)
-0:10          'sbuf_rw_i' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of 4-component vector of uint @data})
+0:10        @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of 4-component vector of uint)
+0:10          'sbuf_rw_i' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of 4-component vector of uint @data})
 0:10          Constant:
 0:10            0 (const uint)
 0:10        Constant:
 0:10          7 (const int)
 0:11      direct index (layout( row_major std430) buffer 4-component vector of uint)
-0:11        @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of 4-component vector of uint)
-0:11          'sbuf_rw_d' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of 4-component vector of uint @data})
+0:11        @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of 4-component vector of uint)
+0:11          'sbuf_rw_d' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of 4-component vector of uint @data})
 0:11          Constant:
 0:11            0 (const uint)
 0:11        Constant:
 0:11          7 (const int)
 0:13      move second child to first child ( temp 4-component vector of uint)
 0:13        direct index (layout( row_major std430) buffer 4-component vector of uint)
-0:13          @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of 4-component vector of uint)
-0:13            'sbuf_rw_nocounter' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of 4-component vector of uint @data})
+0:13          @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of 4-component vector of uint)
+0:13            'sbuf_rw_nocounter' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of 4-component vector of uint @data})
 0:13            Constant:
 0:13              0 (const uint)
 0:13          Constant:
@@ -45,23 +45,23 @@
 0:15        move second child to first child ( temp uint)
 0:15          'c1' ( temp uint)
 0:15          AtomicAdd ( temp uint)
-0:15            @count: direct index for structure ( temp int)
-0:15              'sbuf_rw_i@count' (layout( row_major std430) buffer block{layout( row_major std430) buffer int @count})
+0:15            @count: direct index for structure ( temp uint)
+0:15              'sbuf_rw_i@count' (layout( row_major std430) buffer block{layout( row_major std430) buffer uint @count})
 0:15              Constant:
 0:15                0 (const int)
 0:15            Constant:
-0:15              1 (const int)
+0:15              1 (const uint)
 0:16      Sequence
 0:16        move second child to first child ( temp uint)
 0:16          'c2' ( temp uint)
 0:16          add ( temp uint)
 0:16            AtomicAdd ( temp uint)
-0:16              @count: direct index for structure ( temp int)
-0:16                'sbuf_rw_d@count' (layout( row_major std430) buffer block{layout( row_major std430) buffer int @count})
+0:16              @count: direct index for structure ( temp uint)
+0:16                'sbuf_rw_d@count' (layout( row_major std430) buffer block{layout( row_major std430) buffer uint @count})
 0:16                Constant:
 0:16                  0 (const int)
 0:16              Constant:
-0:16                -1 (const int)
+0:16                4294967295 (const uint)
 0:16            Constant:
 0:16              -1 (const int)
 0:18      Branch: Return with expression
@@ -85,19 +85,19 @@
 0:?     Sequence
 0:7      move second child to first child ( temp uint)
 0:?         'pos' ( temp uint)
-0:?         'pos' (layout( location=0) in uint)
+0:?         'pos' (layout( location=0) flat in uint)
 0:7      move second child to first child ( temp 4-component vector of float)
 0:?         '@entryPointOutput' (layout( location=0) out 4-component vector of float)
 0:7        Function Call: @main(u1; ( temp 4-component vector of float)
 0:?           'pos' ( temp uint)
 0:?   Linker Objects
-0:?     'sbuf_rw_i' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of 4-component vector of uint @data})
-0:?     'sbuf_rw_i@count' (layout( row_major std430) buffer block{layout( row_major std430) buffer int @count})
-0:?     'sbuf_rw_d' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of 4-component vector of uint @data})
-0:?     'sbuf_rw_d@count' (layout( row_major std430) buffer block{layout( row_major std430) buffer int @count})
-0:?     'sbuf_rw_nocounter' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of 4-component vector of uint @data})
+0:?     'sbuf_rw_i' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of 4-component vector of uint @data})
+0:?     'sbuf_rw_i@count' (layout( row_major std430) buffer block{layout( row_major std430) buffer uint @count})
+0:?     'sbuf_rw_d' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of 4-component vector of uint @data})
+0:?     'sbuf_rw_d@count' (layout( row_major std430) buffer block{layout( row_major std430) buffer uint @count})
+0:?     'sbuf_rw_nocounter' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of 4-component vector of uint @data})
 0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
-0:?     'pos' (layout( location=0) in uint)
+0:?     'pos' (layout( location=0) flat in uint)
 
 
 Linked fragment stage:
@@ -119,23 +119,23 @@
 0:8            0 (const uint)
 0:8            0 (const uint)
 0:10      direct index (layout( row_major std430) buffer 4-component vector of uint)
-0:10        @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of 4-component vector of uint)
-0:10          'sbuf_rw_i' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of 4-component vector of uint @data})
+0:10        @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of 4-component vector of uint)
+0:10          'sbuf_rw_i' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of 4-component vector of uint @data})
 0:10          Constant:
 0:10            0 (const uint)
 0:10        Constant:
 0:10          7 (const int)
 0:11      direct index (layout( row_major std430) buffer 4-component vector of uint)
-0:11        @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of 4-component vector of uint)
-0:11          'sbuf_rw_d' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of 4-component vector of uint @data})
+0:11        @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of 4-component vector of uint)
+0:11          'sbuf_rw_d' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of 4-component vector of uint @data})
 0:11          Constant:
 0:11            0 (const uint)
 0:11        Constant:
 0:11          7 (const int)
 0:13      move second child to first child ( temp 4-component vector of uint)
 0:13        direct index (layout( row_major std430) buffer 4-component vector of uint)
-0:13          @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of 4-component vector of uint)
-0:13            'sbuf_rw_nocounter' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of 4-component vector of uint @data})
+0:13          @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of 4-component vector of uint)
+0:13            'sbuf_rw_nocounter' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of 4-component vector of uint @data})
 0:13            Constant:
 0:13              0 (const uint)
 0:13          Constant:
@@ -149,23 +149,23 @@
 0:15        move second child to first child ( temp uint)
 0:15          'c1' ( temp uint)
 0:15          AtomicAdd ( temp uint)
-0:15            @count: direct index for structure ( temp int)
-0:15              'sbuf_rw_i@count' (layout( row_major std430) buffer block{layout( row_major std430) buffer int @count})
+0:15            @count: direct index for structure ( temp uint)
+0:15              'sbuf_rw_i@count' (layout( row_major std430) buffer block{layout( row_major std430) buffer uint @count})
 0:15              Constant:
 0:15                0 (const int)
 0:15            Constant:
-0:15              1 (const int)
+0:15              1 (const uint)
 0:16      Sequence
 0:16        move second child to first child ( temp uint)
 0:16          'c2' ( temp uint)
 0:16          add ( temp uint)
 0:16            AtomicAdd ( temp uint)
-0:16              @count: direct index for structure ( temp int)
-0:16                'sbuf_rw_d@count' (layout( row_major std430) buffer block{layout( row_major std430) buffer int @count})
+0:16              @count: direct index for structure ( temp uint)
+0:16                'sbuf_rw_d@count' (layout( row_major std430) buffer block{layout( row_major std430) buffer uint @count})
 0:16                Constant:
 0:16                  0 (const int)
 0:16              Constant:
-0:16                -1 (const int)
+0:16                4294967295 (const uint)
 0:16            Constant:
 0:16              -1 (const int)
 0:18      Branch: Return with expression
@@ -189,22 +189,22 @@
 0:?     Sequence
 0:7      move second child to first child ( temp uint)
 0:?         'pos' ( temp uint)
-0:?         'pos' (layout( location=0) in uint)
+0:?         'pos' (layout( location=0) flat in uint)
 0:7      move second child to first child ( temp 4-component vector of float)
 0:?         '@entryPointOutput' (layout( location=0) out 4-component vector of float)
 0:7        Function Call: @main(u1; ( temp 4-component vector of float)
 0:?           'pos' ( temp uint)
 0:?   Linker Objects
-0:?     'sbuf_rw_i' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of 4-component vector of uint @data})
-0:?     'sbuf_rw_i@count' (layout( row_major std430) buffer block{layout( row_major std430) buffer int @count})
-0:?     'sbuf_rw_d' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of 4-component vector of uint @data})
-0:?     'sbuf_rw_d@count' (layout( row_major std430) buffer block{layout( row_major std430) buffer int @count})
-0:?     'sbuf_rw_nocounter' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of 4-component vector of uint @data})
+0:?     'sbuf_rw_i' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of 4-component vector of uint @data})
+0:?     'sbuf_rw_i@count' (layout( row_major std430) buffer block{layout( row_major std430) buffer uint @count})
+0:?     'sbuf_rw_d' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of 4-component vector of uint @data})
+0:?     'sbuf_rw_d@count' (layout( row_major std430) buffer block{layout( row_major std430) buffer uint @count})
+0:?     'sbuf_rw_nocounter' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of 4-component vector of uint @data})
 0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
-0:?     'pos' (layout( location=0) in uint)
+0:?     'pos' (layout( location=0) flat in uint)
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 70
 
                               Capability Shader
@@ -226,8 +226,8 @@
                               Name 34  "sbuf_rw_i@count"
                               MemberName 34(sbuf_rw_i@count) 0  "@count"
                               Name 36  "sbuf_rw_i@count"
-                              Name 42  "c2"
-                              Name 43  "sbuf_rw_d@count"
+                              Name 41  "c2"
+                              Name 42  "sbuf_rw_d@count"
                               Name 61  "pos"
                               Name 63  "pos"
                               Name 66  "@entryPointOutput"
@@ -241,7 +241,8 @@
                               MemberDecorate 34(sbuf_rw_i@count) 0 Offset 0
                               Decorate 34(sbuf_rw_i@count) BufferBlock
                               Decorate 36(sbuf_rw_i@count) DescriptorSet 0
-                              Decorate 43(sbuf_rw_d@count) DescriptorSet 0
+                              Decorate 42(sbuf_rw_d@count) DescriptorSet 0
+                              Decorate 63(pos) Flat
                               Decorate 63(pos) Location 0
                               Decorate 66(@entryPointOutput) Location 0
                2:             TypeVoid
@@ -268,14 +269,14 @@
               29:      6(int) Constant 2
               30:   14(ivec4) ConstantComposite 29 29 29 29
               31:             TypePointer Uniform 14(ivec4)
-34(sbuf_rw_i@count):             TypeStruct 23(int)
+34(sbuf_rw_i@count):             TypeStruct 6(int)
               35:             TypePointer Uniform 34(sbuf_rw_i@count)
 36(sbuf_rw_i@count):     35(ptr) Variable Uniform
-              37:             TypePointer Uniform 23(int)
-              39:     23(int) Constant 1
-              40:      6(int) Constant 1
-43(sbuf_rw_d@count):     35(ptr) Variable Uniform
-              45:     23(int) Constant 4294967295
+              37:             TypePointer Uniform 6(int)
+              39:      6(int) Constant 1
+42(sbuf_rw_d@count):     35(ptr) Variable Uniform
+              44:      6(int) Constant 4294967295
+              46:     23(int) Constant 4294967295
               62:             TypePointer Input 6(int)
          63(pos):     62(ptr) Variable Input
               65:             TypePointer Output 9(fvec4)
@@ -297,26 +298,26 @@
               13:             Label
       16(result):     15(ptr) Variable Function
           33(c1):      7(ptr) Variable Function
-          42(c2):      7(ptr) Variable Function
+          41(c2):      7(ptr) Variable Function
                               Store 16(result) 18
               32:     31(ptr) AccessChain 27(sbuf_rw_nocounter) 24 28
                               Store 32 30
               38:     37(ptr) AccessChain 36(sbuf_rw_i@count) 24
-              41:      6(int) AtomicIAdd 38 40 17 39
-                              Store 33(c1) 41
-              44:     37(ptr) AccessChain 43(sbuf_rw_d@count) 24
-              46:      6(int) AtomicIAdd 44 40 17 45
-              47:      6(int) IAdd 46 45
-                              Store 42(c2) 47
+              40:      6(int) AtomicIAdd 38 39 17 39
+                              Store 33(c1) 40
+              43:     37(ptr) AccessChain 42(sbuf_rw_d@count) 24
+              45:      6(int) AtomicIAdd 43 39 17 44
+              47:      6(int) IAdd 45 46
+                              Store 41(c2) 47
               48:      7(ptr) AccessChain 16(result) 17
               49:      6(int) Load 48
               50:    8(float) ConvertUToF 49
-              51:      7(ptr) AccessChain 16(result) 40
+              51:      7(ptr) AccessChain 16(result) 39
               52:      6(int) Load 51
               53:    8(float) ConvertUToF 52
               54:      6(int) Load 33(c1)
               55:    8(float) ConvertUToF 54
-              56:      6(int) Load 42(c2)
+              56:      6(int) Load 41(c2)
               57:    8(float) ConvertUToF 56
               58:    9(fvec4) CompositeConstruct 50 53 55 57
                               ReturnValue 58
diff --git a/Test/baseResults/hlsl.structbuffer.rw.frag.out b/Test/baseResults/hlsl.structbuffer.rw.frag.out
index b1bba58..13a5956 100644
--- a/Test/baseResults/hlsl.structbuffer.rw.frag.out
+++ b/Test/baseResults/hlsl.structbuffer.rw.frag.out
@@ -8,8 +8,8 @@
 0:?     Sequence
 0:13      move second child to first child ( temp float)
 0:13        indirect index (layout( row_major std430) buffer float)
-0:13          @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of float)
-0:13            'sbuf2' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of float @data})
+0:13          @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of float)
+0:13            'sbuf2' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of float @data})
 0:13            Constant:
 0:13              0 (const uint)
 0:13          add ( temp uint)
@@ -22,8 +22,8 @@
 0:17        move second child to first child ( temp uint)
 0:17          'size' ( temp uint)
 0:17          array length ( temp uint)
-0:17            @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of structure{ temp 3-component vector of float color,  temp bool test})
-0:17              'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of structure{ temp 3-component vector of float color,  temp bool test} @data})
+0:17            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 3-component vector of float color,  temp bool test})
+0:17              'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 3-component vector of float color,  temp bool test} @data})
 0:17              Constant:
 0:17                0 (const uint)
 0:17        move second child to first child ( temp uint)
@@ -34,8 +34,8 @@
 0:19        Condition
 0:19        test: direct index for structure ( temp bool)
 0:19          indirect index (layout( row_major std430) buffer structure{ temp 3-component vector of float color,  temp bool test})
-0:19            @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of structure{ temp 3-component vector of float color,  temp bool test})
-0:19              'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of structure{ temp 3-component vector of float color,  temp bool test} @data})
+0:19            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 3-component vector of float color,  temp bool test})
+0:19              'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 3-component vector of float color,  temp bool test} @data})
 0:19              Constant:
 0:19                0 (const uint)
 0:19            'pos' ( in uint)
@@ -47,16 +47,16 @@
 0:20            add ( temp 3-component vector of float)
 0:20              color: direct index for structure ( temp 3-component vector of float)
 0:20                indirect index (layout( row_major std430) buffer structure{ temp 3-component vector of float color,  temp bool test})
-0:20                  @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of structure{ temp 3-component vector of float color,  temp bool test})
-0:20                    'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of structure{ temp 3-component vector of float color,  temp bool test} @data})
+0:20                  @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 3-component vector of float color,  temp bool test})
+0:20                    'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 3-component vector of float color,  temp bool test} @data})
 0:20                    Constant:
 0:20                      0 (const uint)
 0:20                  'pos' ( in uint)
 0:20                Constant:
 0:20                  0 (const int)
 0:20              indirect index (layout( row_major std430) buffer float)
-0:20                @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of float)
-0:20                  'sbuf2' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of float @data})
+0:20                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of float)
+0:20                  'sbuf2' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of float @data})
 0:20                  Constant:
 0:20                    0 (const uint)
 0:20                'pos' ( in uint)
@@ -74,16 +74,16 @@
 0:?     Sequence
 0:12      move second child to first child ( temp uint)
 0:?         'pos' ( temp uint)
-0:?         'pos' (layout( location=0) in uint)
+0:?         'pos' (layout( location=0) flat in uint)
 0:12      move second child to first child ( temp 4-component vector of float)
 0:?         '@entryPointOutput' (layout( location=0) out 4-component vector of float)
 0:12        Function Call: @main(u1; ( temp 4-component vector of float)
 0:?           'pos' ( temp uint)
 0:?   Linker Objects
-0:?     'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of structure{ temp 3-component vector of float color,  temp bool test} @data})
-0:?     'sbuf2' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of float @data})
+0:?     'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 3-component vector of float color,  temp bool test} @data})
+0:?     'sbuf2' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of float @data})
 0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
-0:?     'pos' (layout( location=0) in uint)
+0:?     'pos' (layout( location=0) flat in uint)
 
 
 Linked fragment stage:
@@ -98,8 +98,8 @@
 0:?     Sequence
 0:13      move second child to first child ( temp float)
 0:13        indirect index (layout( row_major std430) buffer float)
-0:13          @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of float)
-0:13            'sbuf2' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of float @data})
+0:13          @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of float)
+0:13            'sbuf2' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of float @data})
 0:13            Constant:
 0:13              0 (const uint)
 0:13          add ( temp uint)
@@ -112,8 +112,8 @@
 0:17        move second child to first child ( temp uint)
 0:17          'size' ( temp uint)
 0:17          array length ( temp uint)
-0:17            @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of structure{ temp 3-component vector of float color,  temp bool test})
-0:17              'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of structure{ temp 3-component vector of float color,  temp bool test} @data})
+0:17            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 3-component vector of float color,  temp bool test})
+0:17              'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 3-component vector of float color,  temp bool test} @data})
 0:17              Constant:
 0:17                0 (const uint)
 0:17        move second child to first child ( temp uint)
@@ -124,8 +124,8 @@
 0:19        Condition
 0:19        test: direct index for structure ( temp bool)
 0:19          indirect index (layout( row_major std430) buffer structure{ temp 3-component vector of float color,  temp bool test})
-0:19            @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of structure{ temp 3-component vector of float color,  temp bool test})
-0:19              'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of structure{ temp 3-component vector of float color,  temp bool test} @data})
+0:19            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 3-component vector of float color,  temp bool test})
+0:19              'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 3-component vector of float color,  temp bool test} @data})
 0:19              Constant:
 0:19                0 (const uint)
 0:19            'pos' ( in uint)
@@ -137,16 +137,16 @@
 0:20            add ( temp 3-component vector of float)
 0:20              color: direct index for structure ( temp 3-component vector of float)
 0:20                indirect index (layout( row_major std430) buffer structure{ temp 3-component vector of float color,  temp bool test})
-0:20                  @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of structure{ temp 3-component vector of float color,  temp bool test})
-0:20                    'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of structure{ temp 3-component vector of float color,  temp bool test} @data})
+0:20                  @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 3-component vector of float color,  temp bool test})
+0:20                    'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 3-component vector of float color,  temp bool test} @data})
 0:20                    Constant:
 0:20                      0 (const uint)
 0:20                  'pos' ( in uint)
 0:20                Constant:
 0:20                  0 (const int)
 0:20              indirect index (layout( row_major std430) buffer float)
-0:20                @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of float)
-0:20                  'sbuf2' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of float @data})
+0:20                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of float)
+0:20                  'sbuf2' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of float @data})
 0:20                  Constant:
 0:20                    0 (const uint)
 0:20                'pos' ( in uint)
@@ -164,19 +164,19 @@
 0:?     Sequence
 0:12      move second child to first child ( temp uint)
 0:?         'pos' ( temp uint)
-0:?         'pos' (layout( location=0) in uint)
+0:?         'pos' (layout( location=0) flat in uint)
 0:12      move second child to first child ( temp 4-component vector of float)
 0:?         '@entryPointOutput' (layout( location=0) out 4-component vector of float)
 0:12        Function Call: @main(u1; ( temp 4-component vector of float)
 0:?           'pos' ( temp uint)
 0:?   Linker Objects
-0:?     'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of structure{ temp 3-component vector of float color,  temp bool test} @data})
-0:?     'sbuf2' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of float @data})
+0:?     'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 3-component vector of float color,  temp bool test} @data})
+0:?     'sbuf2' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of float @data})
 0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
-0:?     'pos' (layout( location=0) in uint)
+0:?     'pos' (layout( location=0) flat in uint)
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 78
 
                               Capability Shader
@@ -213,6 +213,7 @@
                               MemberDecorate 30(sbuf) 0 Offset 0
                               Decorate 30(sbuf) BufferBlock
                               Decorate 32(sbuf) DescriptorSet 0
+                              Decorate 71(pos) Flat
                               Decorate 71(pos) Location 0
                               Decorate 74(@entryPointOutput) Location 0
                2:             TypeVoid
@@ -269,7 +270,7 @@
               22:      6(int) IAdd 20 21
               25:     24(ptr) AccessChain 17(sbuf2) 19 22
                               Store 25 23
-              33:     18(int) ArrayLength 32(sbuf) 0
+              33:      6(int) ArrayLength 32(sbuf) 0
                               Store 26(size) 33
                               Store 34(stride) 35
               36:      6(int) Load 11(pos)
diff --git a/Test/baseResults/hlsl.structbuffer.rwbyte.frag.out b/Test/baseResults/hlsl.structbuffer.rwbyte.frag.out
index 14c2eb6..690a0da 100644
--- a/Test/baseResults/hlsl.structbuffer.rwbyte.frag.out
+++ b/Test/baseResults/hlsl.structbuffer.rwbyte.frag.out
@@ -10,8 +10,8 @@
 0:7        move second child to first child ( temp uint)
 0:7          'size' ( temp uint)
 0:7          array length ( temp uint)
-0:7            @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:7              'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:7            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:7              'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:7              Constant:
 0:7                0 (const uint)
 0:?       Sequence
@@ -21,23 +21,22 @@
 0:9            'pos' ( in uint)
 0:9            Constant:
 0:9              2 (const int)
-0:9        move second child to first child ( temp float)
-0:9          indirect index ( temp float)
-0:9            @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:9              'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:9        move second child to first child ( temp uint)
+0:9          indirect index (layout( row_major std430) buffer uint)
+0:9            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:9              'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:9              Constant:
 0:9                0 (const uint)
 0:9            'byteAddrTemp' ( temp int)
-0:9          Convert uint to float ( temp float)
-0:9            indirect index (layout( row_major std430) buffer uint)
-0:9              @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:9                'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
-0:9                Constant:
-0:9                  0 (const uint)
-0:9              right-shift ( temp int)
-0:9                'pos' ( in uint)
-0:9                Constant:
-0:9                  2 (const int)
+0:9          indirect index (layout( row_major std430) buffer uint)
+0:9            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:9              'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
+0:9              Constant:
+0:9                0 (const uint)
+0:9            right-shift ( temp int)
+0:9              'pos' ( in uint)
+0:9              Constant:
+0:9                2 (const int)
 0:?       Sequence
 0:10        move second child to first child ( temp int)
 0:10          'byteAddrTemp' ( temp int)
@@ -45,14 +44,14 @@
 0:10            'pos' ( in uint)
 0:10            Constant:
 0:10              2 (const int)
-0:10        move second child to first child ( temp float)
-0:10          indirect index ( temp float)
-0:10            @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:10              'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:10        move second child to first child ( temp uint)
+0:10          indirect index (layout( row_major std430) buffer uint)
+0:10            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:10              'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:10              Constant:
 0:10                0 (const uint)
 0:10            'byteAddrTemp' ( temp int)
-0:10          direct index ( temp float)
+0:10          direct index ( temp uint)
 0:?             Sequence
 0:10              move second child to first child ( temp int)
 0:10                'byteAddrTemp' ( temp int)
@@ -61,15 +60,15 @@
 0:10                  Constant:
 0:10                    2 (const int)
 0:?               Construct vec2 ( temp 2-component vector of uint)
-0:10                indirect index ( temp float)
-0:10                  @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:10                    'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:10                indirect index ( temp uint)
+0:10                  @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:10                    'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:10                    Constant:
 0:10                      0 (const uint)
 0:10                  'byteAddrTemp' ( temp int)
-0:10                indirect index ( temp float)
-0:10                  @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:10                    'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:10                indirect index ( temp uint)
+0:10                  @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:10                    'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:10                    Constant:
 0:10                      0 (const uint)
 0:10                  add ( temp int)
@@ -78,17 +77,17 @@
 0:10                      1 (const int)
 0:10            Constant:
 0:10              0 (const int)
-0:10        move second child to first child ( temp float)
-0:10          indirect index ( temp float)
-0:10            @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:10              'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:10        move second child to first child ( temp uint)
+0:10          indirect index (layout( row_major std430) buffer uint)
+0:10            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:10              'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:10              Constant:
 0:10                0 (const uint)
 0:10            add ( temp int)
 0:10              'byteAddrTemp' ( temp int)
 0:10              Constant:
 0:10                1 (const int)
-0:10          direct index ( temp float)
+0:10          direct index ( temp uint)
 0:?             Sequence
 0:10              move second child to first child ( temp int)
 0:10                'byteAddrTemp' ( temp int)
@@ -97,15 +96,15 @@
 0:10                  Constant:
 0:10                    2 (const int)
 0:?               Construct vec2 ( temp 2-component vector of uint)
-0:10                indirect index ( temp float)
-0:10                  @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:10                    'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:10                indirect index ( temp uint)
+0:10                  @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:10                    'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:10                    Constant:
 0:10                      0 (const uint)
 0:10                  'byteAddrTemp' ( temp int)
-0:10                indirect index ( temp float)
-0:10                  @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:10                    'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:10                indirect index ( temp uint)
+0:10                  @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:10                    'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:10                    Constant:
 0:10                      0 (const uint)
 0:10                  add ( temp int)
@@ -121,14 +120,14 @@
 0:11            'pos' ( in uint)
 0:11            Constant:
 0:11              2 (const int)
-0:11        move second child to first child ( temp float)
-0:11          indirect index ( temp float)
-0:11            @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:11              'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:11        move second child to first child ( temp uint)
+0:11          indirect index (layout( row_major std430) buffer uint)
+0:11            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:11              'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:11              Constant:
 0:11                0 (const uint)
 0:11            'byteAddrTemp' ( temp int)
-0:11          direct index ( temp float)
+0:11          direct index ( temp uint)
 0:?             Sequence
 0:11              move second child to first child ( temp int)
 0:11                'byteAddrTemp' ( temp int)
@@ -137,24 +136,24 @@
 0:11                  Constant:
 0:11                    2 (const int)
 0:?               Construct vec3 ( temp 3-component vector of uint)
-0:11                indirect index ( temp float)
-0:11                  @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:11                    'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:11                indirect index ( temp uint)
+0:11                  @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:11                    'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:11                    Constant:
 0:11                      0 (const uint)
 0:11                  'byteAddrTemp' ( temp int)
-0:11                indirect index ( temp float)
-0:11                  @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:11                    'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:11                indirect index ( temp uint)
+0:11                  @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:11                    'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:11                    Constant:
 0:11                      0 (const uint)
 0:11                  add ( temp int)
 0:11                    'byteAddrTemp' ( temp int)
 0:11                    Constant:
 0:11                      1 (const int)
-0:11                indirect index ( temp float)
-0:11                  @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:11                    'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:11                indirect index ( temp uint)
+0:11                  @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:11                    'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:11                    Constant:
 0:11                      0 (const uint)
 0:11                  add ( temp int)
@@ -163,17 +162,17 @@
 0:11                      2 (const int)
 0:11            Constant:
 0:11              0 (const int)
-0:11        move second child to first child ( temp float)
-0:11          indirect index ( temp float)
-0:11            @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:11              'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:11        move second child to first child ( temp uint)
+0:11          indirect index (layout( row_major std430) buffer uint)
+0:11            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:11              'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:11              Constant:
 0:11                0 (const uint)
 0:11            add ( temp int)
 0:11              'byteAddrTemp' ( temp int)
 0:11              Constant:
 0:11                1 (const int)
-0:11          direct index ( temp float)
+0:11          direct index ( temp uint)
 0:?             Sequence
 0:11              move second child to first child ( temp int)
 0:11                'byteAddrTemp' ( temp int)
@@ -182,24 +181,24 @@
 0:11                  Constant:
 0:11                    2 (const int)
 0:?               Construct vec3 ( temp 3-component vector of uint)
-0:11                indirect index ( temp float)
-0:11                  @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:11                    'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:11                indirect index ( temp uint)
+0:11                  @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:11                    'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:11                    Constant:
 0:11                      0 (const uint)
 0:11                  'byteAddrTemp' ( temp int)
-0:11                indirect index ( temp float)
-0:11                  @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:11                    'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:11                indirect index ( temp uint)
+0:11                  @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:11                    'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:11                    Constant:
 0:11                      0 (const uint)
 0:11                  add ( temp int)
 0:11                    'byteAddrTemp' ( temp int)
 0:11                    Constant:
 0:11                      1 (const int)
-0:11                indirect index ( temp float)
-0:11                  @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:11                    'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:11                indirect index ( temp uint)
+0:11                  @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:11                    'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:11                    Constant:
 0:11                      0 (const uint)
 0:11                  add ( temp int)
@@ -208,17 +207,17 @@
 0:11                      2 (const int)
 0:11            Constant:
 0:11              1 (const int)
-0:11        move second child to first child ( temp float)
-0:11          indirect index ( temp float)
-0:11            @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:11              'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:11        move second child to first child ( temp uint)
+0:11          indirect index (layout( row_major std430) buffer uint)
+0:11            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:11              'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:11              Constant:
 0:11                0 (const uint)
 0:11            add ( temp int)
 0:11              'byteAddrTemp' ( temp int)
 0:11              Constant:
 0:11                2 (const int)
-0:11          direct index ( temp float)
+0:11          direct index ( temp uint)
 0:?             Sequence
 0:11              move second child to first child ( temp int)
 0:11                'byteAddrTemp' ( temp int)
@@ -227,24 +226,24 @@
 0:11                  Constant:
 0:11                    2 (const int)
 0:?               Construct vec3 ( temp 3-component vector of uint)
-0:11                indirect index ( temp float)
-0:11                  @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:11                    'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:11                indirect index ( temp uint)
+0:11                  @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:11                    'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:11                    Constant:
 0:11                      0 (const uint)
 0:11                  'byteAddrTemp' ( temp int)
-0:11                indirect index ( temp float)
-0:11                  @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:11                    'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:11                indirect index ( temp uint)
+0:11                  @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:11                    'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:11                    Constant:
 0:11                      0 (const uint)
 0:11                  add ( temp int)
 0:11                    'byteAddrTemp' ( temp int)
 0:11                    Constant:
 0:11                      1 (const int)
-0:11                indirect index ( temp float)
-0:11                  @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:11                    'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:11                indirect index ( temp uint)
+0:11                  @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:11                    'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:11                    Constant:
 0:11                      0 (const uint)
 0:11                  add ( temp int)
@@ -260,14 +259,14 @@
 0:12            'pos' ( in uint)
 0:12            Constant:
 0:12              2 (const int)
-0:12        move second child to first child ( temp float)
-0:12          indirect index ( temp float)
-0:12            @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:12              'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:12        move second child to first child ( temp uint)
+0:12          indirect index (layout( row_major std430) buffer uint)
+0:12            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:12              'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:12              Constant:
 0:12                0 (const uint)
 0:12            'byteAddrTemp' ( temp int)
-0:12          direct index ( temp float)
+0:12          direct index ( temp uint)
 0:?             Sequence
 0:12              move second child to first child ( temp int)
 0:12                'byteAddrTemp' ( temp int)
@@ -276,33 +275,33 @@
 0:12                  Constant:
 0:12                    2 (const int)
 0:?               Construct vec4 ( temp 4-component vector of uint)
-0:12                indirect index ( temp float)
-0:12                  @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:12                    'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:12                indirect index ( temp uint)
+0:12                  @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:12                    'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:12                    Constant:
 0:12                      0 (const uint)
 0:12                  'byteAddrTemp' ( temp int)
-0:12                indirect index ( temp float)
-0:12                  @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:12                    'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:12                indirect index ( temp uint)
+0:12                  @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:12                    'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:12                    Constant:
 0:12                      0 (const uint)
 0:12                  add ( temp int)
 0:12                    'byteAddrTemp' ( temp int)
 0:12                    Constant:
 0:12                      1 (const int)
-0:12                indirect index ( temp float)
-0:12                  @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:12                    'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:12                indirect index ( temp uint)
+0:12                  @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:12                    'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:12                    Constant:
 0:12                      0 (const uint)
 0:12                  add ( temp int)
 0:12                    'byteAddrTemp' ( temp int)
 0:12                    Constant:
 0:12                      2 (const int)
-0:12                indirect index ( temp float)
-0:12                  @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:12                    'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:12                indirect index ( temp uint)
+0:12                  @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:12                    'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:12                    Constant:
 0:12                      0 (const uint)
 0:12                  add ( temp int)
@@ -311,17 +310,17 @@
 0:12                      3 (const int)
 0:12            Constant:
 0:12              0 (const int)
-0:12        move second child to first child ( temp float)
-0:12          indirect index ( temp float)
-0:12            @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:12              'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:12        move second child to first child ( temp uint)
+0:12          indirect index (layout( row_major std430) buffer uint)
+0:12            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:12              'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:12              Constant:
 0:12                0 (const uint)
 0:12            add ( temp int)
 0:12              'byteAddrTemp' ( temp int)
 0:12              Constant:
 0:12                1 (const int)
-0:12          direct index ( temp float)
+0:12          direct index ( temp uint)
 0:?             Sequence
 0:12              move second child to first child ( temp int)
 0:12                'byteAddrTemp' ( temp int)
@@ -330,33 +329,33 @@
 0:12                  Constant:
 0:12                    2 (const int)
 0:?               Construct vec4 ( temp 4-component vector of uint)
-0:12                indirect index ( temp float)
-0:12                  @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:12                    'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:12                indirect index ( temp uint)
+0:12                  @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:12                    'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:12                    Constant:
 0:12                      0 (const uint)
 0:12                  'byteAddrTemp' ( temp int)
-0:12                indirect index ( temp float)
-0:12                  @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:12                    'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:12                indirect index ( temp uint)
+0:12                  @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:12                    'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:12                    Constant:
 0:12                      0 (const uint)
 0:12                  add ( temp int)
 0:12                    'byteAddrTemp' ( temp int)
 0:12                    Constant:
 0:12                      1 (const int)
-0:12                indirect index ( temp float)
-0:12                  @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:12                    'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:12                indirect index ( temp uint)
+0:12                  @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:12                    'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:12                    Constant:
 0:12                      0 (const uint)
 0:12                  add ( temp int)
 0:12                    'byteAddrTemp' ( temp int)
 0:12                    Constant:
 0:12                      2 (const int)
-0:12                indirect index ( temp float)
-0:12                  @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:12                    'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:12                indirect index ( temp uint)
+0:12                  @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:12                    'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:12                    Constant:
 0:12                      0 (const uint)
 0:12                  add ( temp int)
@@ -365,17 +364,17 @@
 0:12                      3 (const int)
 0:12            Constant:
 0:12              1 (const int)
-0:12        move second child to first child ( temp float)
-0:12          indirect index ( temp float)
-0:12            @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:12              'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:12        move second child to first child ( temp uint)
+0:12          indirect index (layout( row_major std430) buffer uint)
+0:12            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:12              'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:12              Constant:
 0:12                0 (const uint)
 0:12            add ( temp int)
 0:12              'byteAddrTemp' ( temp int)
 0:12              Constant:
 0:12                2 (const int)
-0:12          direct index ( temp float)
+0:12          direct index ( temp uint)
 0:?             Sequence
 0:12              move second child to first child ( temp int)
 0:12                'byteAddrTemp' ( temp int)
@@ -384,33 +383,33 @@
 0:12                  Constant:
 0:12                    2 (const int)
 0:?               Construct vec4 ( temp 4-component vector of uint)
-0:12                indirect index ( temp float)
-0:12                  @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:12                    'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:12                indirect index ( temp uint)
+0:12                  @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:12                    'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:12                    Constant:
 0:12                      0 (const uint)
 0:12                  'byteAddrTemp' ( temp int)
-0:12                indirect index ( temp float)
-0:12                  @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:12                    'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:12                indirect index ( temp uint)
+0:12                  @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:12                    'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:12                    Constant:
 0:12                      0 (const uint)
 0:12                  add ( temp int)
 0:12                    'byteAddrTemp' ( temp int)
 0:12                    Constant:
 0:12                      1 (const int)
-0:12                indirect index ( temp float)
-0:12                  @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:12                    'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:12                indirect index ( temp uint)
+0:12                  @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:12                    'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:12                    Constant:
 0:12                      0 (const uint)
 0:12                  add ( temp int)
 0:12                    'byteAddrTemp' ( temp int)
 0:12                    Constant:
 0:12                      2 (const int)
-0:12                indirect index ( temp float)
-0:12                  @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:12                    'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:12                indirect index ( temp uint)
+0:12                  @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:12                    'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:12                    Constant:
 0:12                      0 (const uint)
 0:12                  add ( temp int)
@@ -419,17 +418,17 @@
 0:12                      3 (const int)
 0:12            Constant:
 0:12              2 (const int)
-0:12        move second child to first child ( temp float)
-0:12          indirect index ( temp float)
-0:12            @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:12              'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:12        move second child to first child ( temp uint)
+0:12          indirect index (layout( row_major std430) buffer uint)
+0:12            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:12              'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:12              Constant:
 0:12                0 (const uint)
 0:12            add ( temp int)
 0:12              'byteAddrTemp' ( temp int)
 0:12              Constant:
 0:12                3 (const int)
-0:12          direct index ( temp float)
+0:12          direct index ( temp uint)
 0:?             Sequence
 0:12              move second child to first child ( temp int)
 0:12                'byteAddrTemp' ( temp int)
@@ -438,33 +437,33 @@
 0:12                  Constant:
 0:12                    2 (const int)
 0:?               Construct vec4 ( temp 4-component vector of uint)
-0:12                indirect index ( temp float)
-0:12                  @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:12                    'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:12                indirect index ( temp uint)
+0:12                  @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:12                    'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:12                    Constant:
 0:12                      0 (const uint)
 0:12                  'byteAddrTemp' ( temp int)
-0:12                indirect index ( temp float)
-0:12                  @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:12                    'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:12                indirect index ( temp uint)
+0:12                  @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:12                    'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:12                    Constant:
 0:12                      0 (const uint)
 0:12                  add ( temp int)
 0:12                    'byteAddrTemp' ( temp int)
 0:12                    Constant:
 0:12                      1 (const int)
-0:12                indirect index ( temp float)
-0:12                  @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:12                    'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:12                indirect index ( temp uint)
+0:12                  @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:12                    'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:12                    Constant:
 0:12                      0 (const uint)
 0:12                  add ( temp int)
 0:12                    'byteAddrTemp' ( temp int)
 0:12                    Constant:
 0:12                      2 (const int)
-0:12                indirect index ( temp float)
-0:12                  @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:12                    'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:12                indirect index ( temp uint)
+0:12                  @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:12                    'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:12                    Constant:
 0:12                      0 (const uint)
 0:12                  add ( temp int)
@@ -477,8 +476,8 @@
 0:14        Construct vec4 ( temp 4-component vector of float)
 0:14          Convert uint to float ( temp float)
 0:14            indirect index (layout( row_major std430) buffer uint)
-0:14              @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:14                'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:14              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:14                'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:14                Constant:
 0:14                  0 (const uint)
 0:14              right-shift ( temp int)
@@ -490,15 +489,15 @@
 0:?     Sequence
 0:5      move second child to first child ( temp uint)
 0:?         'pos' ( temp uint)
-0:?         'pos' (layout( location=0) in uint)
+0:?         'pos' (layout( location=0) flat in uint)
 0:5      move second child to first child ( temp 4-component vector of float)
 0:?         '@entryPointOutput' (layout( location=0) out 4-component vector of float)
 0:5        Function Call: @main(u1; ( temp 4-component vector of float)
 0:?           'pos' ( temp uint)
 0:?   Linker Objects
-0:?     'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:?     'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
-0:?     'pos' (layout( location=0) in uint)
+0:?     'pos' (layout( location=0) flat in uint)
 
 
 Linked fragment stage:
@@ -515,8 +514,8 @@
 0:7        move second child to first child ( temp uint)
 0:7          'size' ( temp uint)
 0:7          array length ( temp uint)
-0:7            @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:7              'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:7            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:7              'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:7              Constant:
 0:7                0 (const uint)
 0:?       Sequence
@@ -526,23 +525,22 @@
 0:9            'pos' ( in uint)
 0:9            Constant:
 0:9              2 (const int)
-0:9        move second child to first child ( temp float)
-0:9          indirect index ( temp float)
-0:9            @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:9              'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:9        move second child to first child ( temp uint)
+0:9          indirect index (layout( row_major std430) buffer uint)
+0:9            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:9              'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:9              Constant:
 0:9                0 (const uint)
 0:9            'byteAddrTemp' ( temp int)
-0:9          Convert uint to float ( temp float)
-0:9            indirect index (layout( row_major std430) buffer uint)
-0:9              @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:9                'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
-0:9                Constant:
-0:9                  0 (const uint)
-0:9              right-shift ( temp int)
-0:9                'pos' ( in uint)
-0:9                Constant:
-0:9                  2 (const int)
+0:9          indirect index (layout( row_major std430) buffer uint)
+0:9            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:9              'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
+0:9              Constant:
+0:9                0 (const uint)
+0:9            right-shift ( temp int)
+0:9              'pos' ( in uint)
+0:9              Constant:
+0:9                2 (const int)
 0:?       Sequence
 0:10        move second child to first child ( temp int)
 0:10          'byteAddrTemp' ( temp int)
@@ -550,14 +548,14 @@
 0:10            'pos' ( in uint)
 0:10            Constant:
 0:10              2 (const int)
-0:10        move second child to first child ( temp float)
-0:10          indirect index ( temp float)
-0:10            @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:10              'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:10        move second child to first child ( temp uint)
+0:10          indirect index (layout( row_major std430) buffer uint)
+0:10            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:10              'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:10              Constant:
 0:10                0 (const uint)
 0:10            'byteAddrTemp' ( temp int)
-0:10          direct index ( temp float)
+0:10          direct index ( temp uint)
 0:?             Sequence
 0:10              move second child to first child ( temp int)
 0:10                'byteAddrTemp' ( temp int)
@@ -566,15 +564,15 @@
 0:10                  Constant:
 0:10                    2 (const int)
 0:?               Construct vec2 ( temp 2-component vector of uint)
-0:10                indirect index ( temp float)
-0:10                  @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:10                    'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:10                indirect index ( temp uint)
+0:10                  @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:10                    'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:10                    Constant:
 0:10                      0 (const uint)
 0:10                  'byteAddrTemp' ( temp int)
-0:10                indirect index ( temp float)
-0:10                  @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:10                    'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:10                indirect index ( temp uint)
+0:10                  @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:10                    'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:10                    Constant:
 0:10                      0 (const uint)
 0:10                  add ( temp int)
@@ -583,17 +581,17 @@
 0:10                      1 (const int)
 0:10            Constant:
 0:10              0 (const int)
-0:10        move second child to first child ( temp float)
-0:10          indirect index ( temp float)
-0:10            @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:10              'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:10        move second child to first child ( temp uint)
+0:10          indirect index (layout( row_major std430) buffer uint)
+0:10            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:10              'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:10              Constant:
 0:10                0 (const uint)
 0:10            add ( temp int)
 0:10              'byteAddrTemp' ( temp int)
 0:10              Constant:
 0:10                1 (const int)
-0:10          direct index ( temp float)
+0:10          direct index ( temp uint)
 0:?             Sequence
 0:10              move second child to first child ( temp int)
 0:10                'byteAddrTemp' ( temp int)
@@ -602,15 +600,15 @@
 0:10                  Constant:
 0:10                    2 (const int)
 0:?               Construct vec2 ( temp 2-component vector of uint)
-0:10                indirect index ( temp float)
-0:10                  @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:10                    'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:10                indirect index ( temp uint)
+0:10                  @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:10                    'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:10                    Constant:
 0:10                      0 (const uint)
 0:10                  'byteAddrTemp' ( temp int)
-0:10                indirect index ( temp float)
-0:10                  @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:10                    'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:10                indirect index ( temp uint)
+0:10                  @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:10                    'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:10                    Constant:
 0:10                      0 (const uint)
 0:10                  add ( temp int)
@@ -626,14 +624,14 @@
 0:11            'pos' ( in uint)
 0:11            Constant:
 0:11              2 (const int)
-0:11        move second child to first child ( temp float)
-0:11          indirect index ( temp float)
-0:11            @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:11              'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:11        move second child to first child ( temp uint)
+0:11          indirect index (layout( row_major std430) buffer uint)
+0:11            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:11              'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:11              Constant:
 0:11                0 (const uint)
 0:11            'byteAddrTemp' ( temp int)
-0:11          direct index ( temp float)
+0:11          direct index ( temp uint)
 0:?             Sequence
 0:11              move second child to first child ( temp int)
 0:11                'byteAddrTemp' ( temp int)
@@ -642,24 +640,24 @@
 0:11                  Constant:
 0:11                    2 (const int)
 0:?               Construct vec3 ( temp 3-component vector of uint)
-0:11                indirect index ( temp float)
-0:11                  @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:11                    'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:11                indirect index ( temp uint)
+0:11                  @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:11                    'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:11                    Constant:
 0:11                      0 (const uint)
 0:11                  'byteAddrTemp' ( temp int)
-0:11                indirect index ( temp float)
-0:11                  @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:11                    'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:11                indirect index ( temp uint)
+0:11                  @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:11                    'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:11                    Constant:
 0:11                      0 (const uint)
 0:11                  add ( temp int)
 0:11                    'byteAddrTemp' ( temp int)
 0:11                    Constant:
 0:11                      1 (const int)
-0:11                indirect index ( temp float)
-0:11                  @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:11                    'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:11                indirect index ( temp uint)
+0:11                  @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:11                    'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:11                    Constant:
 0:11                      0 (const uint)
 0:11                  add ( temp int)
@@ -668,17 +666,17 @@
 0:11                      2 (const int)
 0:11            Constant:
 0:11              0 (const int)
-0:11        move second child to first child ( temp float)
-0:11          indirect index ( temp float)
-0:11            @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:11              'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:11        move second child to first child ( temp uint)
+0:11          indirect index (layout( row_major std430) buffer uint)
+0:11            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:11              'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:11              Constant:
 0:11                0 (const uint)
 0:11            add ( temp int)
 0:11              'byteAddrTemp' ( temp int)
 0:11              Constant:
 0:11                1 (const int)
-0:11          direct index ( temp float)
+0:11          direct index ( temp uint)
 0:?             Sequence
 0:11              move second child to first child ( temp int)
 0:11                'byteAddrTemp' ( temp int)
@@ -687,24 +685,24 @@
 0:11                  Constant:
 0:11                    2 (const int)
 0:?               Construct vec3 ( temp 3-component vector of uint)
-0:11                indirect index ( temp float)
-0:11                  @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:11                    'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:11                indirect index ( temp uint)
+0:11                  @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:11                    'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:11                    Constant:
 0:11                      0 (const uint)
 0:11                  'byteAddrTemp' ( temp int)
-0:11                indirect index ( temp float)
-0:11                  @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:11                    'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:11                indirect index ( temp uint)
+0:11                  @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:11                    'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:11                    Constant:
 0:11                      0 (const uint)
 0:11                  add ( temp int)
 0:11                    'byteAddrTemp' ( temp int)
 0:11                    Constant:
 0:11                      1 (const int)
-0:11                indirect index ( temp float)
-0:11                  @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:11                    'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:11                indirect index ( temp uint)
+0:11                  @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:11                    'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:11                    Constant:
 0:11                      0 (const uint)
 0:11                  add ( temp int)
@@ -713,17 +711,17 @@
 0:11                      2 (const int)
 0:11            Constant:
 0:11              1 (const int)
-0:11        move second child to first child ( temp float)
-0:11          indirect index ( temp float)
-0:11            @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:11              'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:11        move second child to first child ( temp uint)
+0:11          indirect index (layout( row_major std430) buffer uint)
+0:11            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:11              'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:11              Constant:
 0:11                0 (const uint)
 0:11            add ( temp int)
 0:11              'byteAddrTemp' ( temp int)
 0:11              Constant:
 0:11                2 (const int)
-0:11          direct index ( temp float)
+0:11          direct index ( temp uint)
 0:?             Sequence
 0:11              move second child to first child ( temp int)
 0:11                'byteAddrTemp' ( temp int)
@@ -732,24 +730,24 @@
 0:11                  Constant:
 0:11                    2 (const int)
 0:?               Construct vec3 ( temp 3-component vector of uint)
-0:11                indirect index ( temp float)
-0:11                  @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:11                    'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:11                indirect index ( temp uint)
+0:11                  @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:11                    'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:11                    Constant:
 0:11                      0 (const uint)
 0:11                  'byteAddrTemp' ( temp int)
-0:11                indirect index ( temp float)
-0:11                  @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:11                    'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:11                indirect index ( temp uint)
+0:11                  @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:11                    'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:11                    Constant:
 0:11                      0 (const uint)
 0:11                  add ( temp int)
 0:11                    'byteAddrTemp' ( temp int)
 0:11                    Constant:
 0:11                      1 (const int)
-0:11                indirect index ( temp float)
-0:11                  @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:11                    'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:11                indirect index ( temp uint)
+0:11                  @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:11                    'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:11                    Constant:
 0:11                      0 (const uint)
 0:11                  add ( temp int)
@@ -765,14 +763,14 @@
 0:12            'pos' ( in uint)
 0:12            Constant:
 0:12              2 (const int)
-0:12        move second child to first child ( temp float)
-0:12          indirect index ( temp float)
-0:12            @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:12              'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:12        move second child to first child ( temp uint)
+0:12          indirect index (layout( row_major std430) buffer uint)
+0:12            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:12              'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:12              Constant:
 0:12                0 (const uint)
 0:12            'byteAddrTemp' ( temp int)
-0:12          direct index ( temp float)
+0:12          direct index ( temp uint)
 0:?             Sequence
 0:12              move second child to first child ( temp int)
 0:12                'byteAddrTemp' ( temp int)
@@ -781,33 +779,33 @@
 0:12                  Constant:
 0:12                    2 (const int)
 0:?               Construct vec4 ( temp 4-component vector of uint)
-0:12                indirect index ( temp float)
-0:12                  @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:12                    'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:12                indirect index ( temp uint)
+0:12                  @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:12                    'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:12                    Constant:
 0:12                      0 (const uint)
 0:12                  'byteAddrTemp' ( temp int)
-0:12                indirect index ( temp float)
-0:12                  @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:12                    'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:12                indirect index ( temp uint)
+0:12                  @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:12                    'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:12                    Constant:
 0:12                      0 (const uint)
 0:12                  add ( temp int)
 0:12                    'byteAddrTemp' ( temp int)
 0:12                    Constant:
 0:12                      1 (const int)
-0:12                indirect index ( temp float)
-0:12                  @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:12                    'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:12                indirect index ( temp uint)
+0:12                  @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:12                    'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:12                    Constant:
 0:12                      0 (const uint)
 0:12                  add ( temp int)
 0:12                    'byteAddrTemp' ( temp int)
 0:12                    Constant:
 0:12                      2 (const int)
-0:12                indirect index ( temp float)
-0:12                  @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:12                    'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:12                indirect index ( temp uint)
+0:12                  @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:12                    'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:12                    Constant:
 0:12                      0 (const uint)
 0:12                  add ( temp int)
@@ -816,17 +814,17 @@
 0:12                      3 (const int)
 0:12            Constant:
 0:12              0 (const int)
-0:12        move second child to first child ( temp float)
-0:12          indirect index ( temp float)
-0:12            @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:12              'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:12        move second child to first child ( temp uint)
+0:12          indirect index (layout( row_major std430) buffer uint)
+0:12            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:12              'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:12              Constant:
 0:12                0 (const uint)
 0:12            add ( temp int)
 0:12              'byteAddrTemp' ( temp int)
 0:12              Constant:
 0:12                1 (const int)
-0:12          direct index ( temp float)
+0:12          direct index ( temp uint)
 0:?             Sequence
 0:12              move second child to first child ( temp int)
 0:12                'byteAddrTemp' ( temp int)
@@ -835,33 +833,33 @@
 0:12                  Constant:
 0:12                    2 (const int)
 0:?               Construct vec4 ( temp 4-component vector of uint)
-0:12                indirect index ( temp float)
-0:12                  @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:12                    'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:12                indirect index ( temp uint)
+0:12                  @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:12                    'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:12                    Constant:
 0:12                      0 (const uint)
 0:12                  'byteAddrTemp' ( temp int)
-0:12                indirect index ( temp float)
-0:12                  @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:12                    'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:12                indirect index ( temp uint)
+0:12                  @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:12                    'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:12                    Constant:
 0:12                      0 (const uint)
 0:12                  add ( temp int)
 0:12                    'byteAddrTemp' ( temp int)
 0:12                    Constant:
 0:12                      1 (const int)
-0:12                indirect index ( temp float)
-0:12                  @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:12                    'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:12                indirect index ( temp uint)
+0:12                  @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:12                    'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:12                    Constant:
 0:12                      0 (const uint)
 0:12                  add ( temp int)
 0:12                    'byteAddrTemp' ( temp int)
 0:12                    Constant:
 0:12                      2 (const int)
-0:12                indirect index ( temp float)
-0:12                  @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:12                    'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:12                indirect index ( temp uint)
+0:12                  @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:12                    'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:12                    Constant:
 0:12                      0 (const uint)
 0:12                  add ( temp int)
@@ -870,17 +868,17 @@
 0:12                      3 (const int)
 0:12            Constant:
 0:12              1 (const int)
-0:12        move second child to first child ( temp float)
-0:12          indirect index ( temp float)
-0:12            @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:12              'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:12        move second child to first child ( temp uint)
+0:12          indirect index (layout( row_major std430) buffer uint)
+0:12            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:12              'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:12              Constant:
 0:12                0 (const uint)
 0:12            add ( temp int)
 0:12              'byteAddrTemp' ( temp int)
 0:12              Constant:
 0:12                2 (const int)
-0:12          direct index ( temp float)
+0:12          direct index ( temp uint)
 0:?             Sequence
 0:12              move second child to first child ( temp int)
 0:12                'byteAddrTemp' ( temp int)
@@ -889,33 +887,33 @@
 0:12                  Constant:
 0:12                    2 (const int)
 0:?               Construct vec4 ( temp 4-component vector of uint)
-0:12                indirect index ( temp float)
-0:12                  @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:12                    'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:12                indirect index ( temp uint)
+0:12                  @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:12                    'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:12                    Constant:
 0:12                      0 (const uint)
 0:12                  'byteAddrTemp' ( temp int)
-0:12                indirect index ( temp float)
-0:12                  @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:12                    'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:12                indirect index ( temp uint)
+0:12                  @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:12                    'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:12                    Constant:
 0:12                      0 (const uint)
 0:12                  add ( temp int)
 0:12                    'byteAddrTemp' ( temp int)
 0:12                    Constant:
 0:12                      1 (const int)
-0:12                indirect index ( temp float)
-0:12                  @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:12                    'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:12                indirect index ( temp uint)
+0:12                  @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:12                    'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:12                    Constant:
 0:12                      0 (const uint)
 0:12                  add ( temp int)
 0:12                    'byteAddrTemp' ( temp int)
 0:12                    Constant:
 0:12                      2 (const int)
-0:12                indirect index ( temp float)
-0:12                  @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:12                    'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:12                indirect index ( temp uint)
+0:12                  @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:12                    'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:12                    Constant:
 0:12                      0 (const uint)
 0:12                  add ( temp int)
@@ -924,17 +922,17 @@
 0:12                      3 (const int)
 0:12            Constant:
 0:12              2 (const int)
-0:12        move second child to first child ( temp float)
-0:12          indirect index ( temp float)
-0:12            @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:12              'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:12        move second child to first child ( temp uint)
+0:12          indirect index (layout( row_major std430) buffer uint)
+0:12            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:12              'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:12              Constant:
 0:12                0 (const uint)
 0:12            add ( temp int)
 0:12              'byteAddrTemp' ( temp int)
 0:12              Constant:
 0:12                3 (const int)
-0:12          direct index ( temp float)
+0:12          direct index ( temp uint)
 0:?             Sequence
 0:12              move second child to first child ( temp int)
 0:12                'byteAddrTemp' ( temp int)
@@ -943,33 +941,33 @@
 0:12                  Constant:
 0:12                    2 (const int)
 0:?               Construct vec4 ( temp 4-component vector of uint)
-0:12                indirect index ( temp float)
-0:12                  @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:12                    'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:12                indirect index ( temp uint)
+0:12                  @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:12                    'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:12                    Constant:
 0:12                      0 (const uint)
 0:12                  'byteAddrTemp' ( temp int)
-0:12                indirect index ( temp float)
-0:12                  @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:12                    'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:12                indirect index ( temp uint)
+0:12                  @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:12                    'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:12                    Constant:
 0:12                      0 (const uint)
 0:12                  add ( temp int)
 0:12                    'byteAddrTemp' ( temp int)
 0:12                    Constant:
 0:12                      1 (const int)
-0:12                indirect index ( temp float)
-0:12                  @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:12                    'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:12                indirect index ( temp uint)
+0:12                  @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:12                    'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:12                    Constant:
 0:12                      0 (const uint)
 0:12                  add ( temp int)
 0:12                    'byteAddrTemp' ( temp int)
 0:12                    Constant:
 0:12                      2 (const int)
-0:12                indirect index ( temp float)
-0:12                  @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:12                    'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:12                indirect index ( temp uint)
+0:12                  @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:12                    'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:12                    Constant:
 0:12                      0 (const uint)
 0:12                  add ( temp int)
@@ -982,8 +980,8 @@
 0:14        Construct vec4 ( temp 4-component vector of float)
 0:14          Convert uint to float ( temp float)
 0:14            indirect index (layout( row_major std430) buffer uint)
-0:14              @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint)
-0:14                'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:14              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:14                'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:14                Constant:
 0:14                  0 (const uint)
 0:14              right-shift ( temp int)
@@ -995,24 +993,24 @@
 0:?     Sequence
 0:5      move second child to first child ( temp uint)
 0:?         'pos' ( temp uint)
-0:?         'pos' (layout( location=0) in uint)
+0:?         'pos' (layout( location=0) flat in uint)
 0:5      move second child to first child ( temp 4-component vector of float)
 0:?         '@entryPointOutput' (layout( location=0) out 4-component vector of float)
 0:5        Function Call: @main(u1; ( temp 4-component vector of float)
 0:?           'pos' ( temp uint)
 0:?   Linker Objects
-0:?     'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data})
+0:?     'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
-0:?     'pos' (layout( location=0) in uint)
+0:?     'pos' (layout( location=0) flat in uint)
 
 // Module Version 10000
-// Generated by (magic number): 80001
-// Id's are bound by 240
+// Generated by (magic number): 80007
+// Id's are bound by 239
 
                               Capability Shader
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "main" 233 236
+                              EntryPoint Fragment 4  "main" 232 235
                               ExecutionMode 4 OriginUpperLeft
                               Source HLSL 500
                               Name 4  "main"
@@ -1023,22 +1021,23 @@
                               MemberName 16(sbuf) 0  "@data"
                               Name 18  "sbuf"
                               Name 22  "byteAddrTemp"
-                              Name 35  "byteAddrTemp"
-                              Name 39  "byteAddrTemp"
-                              Name 70  "byteAddrTemp"
-                              Name 74  "byteAddrTemp"
-                              Name 129  "byteAddrTemp"
-                              Name 133  "byteAddrTemp"
-                              Name 231  "pos"
-                              Name 233  "pos"
-                              Name 236  "@entryPointOutput"
-                              Name 237  "param"
+                              Name 34  "byteAddrTemp"
+                              Name 38  "byteAddrTemp"
+                              Name 69  "byteAddrTemp"
+                              Name 73  "byteAddrTemp"
+                              Name 128  "byteAddrTemp"
+                              Name 132  "byteAddrTemp"
+                              Name 230  "pos"
+                              Name 232  "pos"
+                              Name 235  "@entryPointOutput"
+                              Name 236  "param"
                               Decorate 15 ArrayStride 4
                               MemberDecorate 16(sbuf) 0 Offset 0
                               Decorate 16(sbuf) BufferBlock
                               Decorate 18(sbuf) DescriptorSet 0
-                              Decorate 233(pos) Location 0
-                              Decorate 236(@entryPointOutput) Location 0
+                              Decorate 232(pos) Flat
+                              Decorate 232(pos) Location 0
+                              Decorate 235(@entryPointOutput) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 32 0
@@ -1050,34 +1049,34 @@
         16(sbuf):             TypeStruct 15
               17:             TypePointer Uniform 16(sbuf)
         18(sbuf):     17(ptr) Variable Uniform
-              19:             TypeInt 32 1
-              21:             TypePointer Function 19(int)
-              24:     19(int) Constant 2
-              26:     19(int) Constant 0
+              20:             TypeInt 32 1
+              21:             TypePointer Function 20(int)
+              24:     20(int) Constant 2
+              26:     20(int) Constant 0
               30:             TypePointer Uniform 6(int)
-              46:     19(int) Constant 1
-              50:             TypeVector 6(int) 2
-              52:      6(int) Constant 0
-              67:      6(int) Constant 1
-              88:             TypeVector 6(int) 3
-             126:      6(int) Constant 2
-             148:     19(int) Constant 3
-             152:             TypeVector 6(int) 4
-             220:      6(int) Constant 3
-             232:             TypePointer Input 6(int)
-        233(pos):    232(ptr) Variable Input
-             235:             TypePointer Output 9(fvec4)
-236(@entryPointOutput):    235(ptr) Variable Output
+              45:     20(int) Constant 1
+              49:             TypeVector 6(int) 2
+              51:      6(int) Constant 0
+              66:      6(int) Constant 1
+              87:             TypeVector 6(int) 3
+             125:      6(int) Constant 2
+             147:     20(int) Constant 3
+             151:             TypeVector 6(int) 4
+             219:      6(int) Constant 3
+             231:             TypePointer Input 6(int)
+        232(pos):    231(ptr) Variable Input
+             234:             TypePointer Output 9(fvec4)
+235(@entryPointOutput):    234(ptr) Variable Output
          4(main):           2 Function None 3
                5:             Label
-        231(pos):      7(ptr) Variable Function
-      237(param):      7(ptr) Variable Function
-             234:      6(int) Load 233(pos)
-                              Store 231(pos) 234
-             238:      6(int) Load 231(pos)
-                              Store 237(param) 238
-             239:    9(fvec4) FunctionCall 12(@main(u1;) 237(param)
-                              Store 236(@entryPointOutput) 239
+        230(pos):      7(ptr) Variable Function
+      236(param):      7(ptr) Variable Function
+             233:      6(int) Load 232(pos)
+                              Store 230(pos) 233
+             237:      6(int) Load 230(pos)
+                              Store 236(param) 237
+             238:    9(fvec4) FunctionCall 12(@main(u1;) 236(param)
+                              Store 235(@entryPointOutput) 238
                               Return
                               FunctionEnd
    12(@main(u1;):    9(fvec4) Function None 10
@@ -1085,224 +1084,223 @@
               13:             Label
         14(size):      7(ptr) Variable Function
 22(byteAddrTemp):     21(ptr) Variable Function
-35(byteAddrTemp):     21(ptr) Variable Function
-39(byteAddrTemp):     21(ptr) Variable Function
-70(byteAddrTemp):     21(ptr) Variable Function
-74(byteAddrTemp):     21(ptr) Variable Function
-129(byteAddrTemp):     21(ptr) Variable Function
-133(byteAddrTemp):     21(ptr) Variable Function
-              20:     19(int) ArrayLength 18(sbuf) 0
-                              Store 14(size) 20
+34(byteAddrTemp):     21(ptr) Variable Function
+38(byteAddrTemp):     21(ptr) Variable Function
+69(byteAddrTemp):     21(ptr) Variable Function
+73(byteAddrTemp):     21(ptr) Variable Function
+128(byteAddrTemp):     21(ptr) Variable Function
+132(byteAddrTemp):     21(ptr) Variable Function
+              19:      6(int) ArrayLength 18(sbuf) 0
+                              Store 14(size) 19
               23:      6(int) Load 11(pos)
-              25:     19(int) ShiftRightLogical 23 24
+              25:     20(int) ShiftRightLogical 23 24
                               Store 22(byteAddrTemp) 25
-              27:     19(int) Load 22(byteAddrTemp)
+              27:     20(int) Load 22(byteAddrTemp)
               28:      6(int) Load 11(pos)
-              29:     19(int) ShiftRightLogical 28 24
+              29:     20(int) ShiftRightLogical 28 24
               31:     30(ptr) AccessChain 18(sbuf) 26 29
               32:      6(int) Load 31
-              33:    8(float) ConvertUToF 32
-              34:     30(ptr) AccessChain 18(sbuf) 26 27
-                              Store 34 33
-              36:      6(int) Load 11(pos)
-              37:     19(int) ShiftRightLogical 36 24
-                              Store 35(byteAddrTemp) 37
-              38:     19(int) Load 35(byteAddrTemp)
-              40:      6(int) Load 11(pos)
-              41:     19(int) ShiftRightLogical 40 24
-                              Store 39(byteAddrTemp) 41
-              42:     19(int) Load 39(byteAddrTemp)
-              43:     30(ptr) AccessChain 18(sbuf) 26 42
-              44:      6(int) Load 43
-              45:     19(int) Load 39(byteAddrTemp)
-              47:     19(int) IAdd 45 46
-              48:     30(ptr) AccessChain 18(sbuf) 26 47
-              49:      6(int) Load 48
-              51:   50(ivec2) CompositeConstruct 44 49
-              53:      6(int) CompositeExtract 51 0
-              54:     30(ptr) AccessChain 18(sbuf) 26 38
-                              Store 54 53
-              55:     19(int) Load 35(byteAddrTemp)
-              56:     19(int) IAdd 55 46
-              57:      6(int) Load 11(pos)
-              58:     19(int) ShiftRightLogical 57 24
-                              Store 39(byteAddrTemp) 58
-              59:     19(int) Load 39(byteAddrTemp)
-              60:     30(ptr) AccessChain 18(sbuf) 26 59
-              61:      6(int) Load 60
-              62:     19(int) Load 39(byteAddrTemp)
-              63:     19(int) IAdd 62 46
-              64:     30(ptr) AccessChain 18(sbuf) 26 63
-              65:      6(int) Load 64
-              66:   50(ivec2) CompositeConstruct 61 65
-              68:      6(int) CompositeExtract 66 1
-              69:     30(ptr) AccessChain 18(sbuf) 26 56
-                              Store 69 68
-              71:      6(int) Load 11(pos)
-              72:     19(int) ShiftRightLogical 71 24
-                              Store 70(byteAddrTemp) 72
-              73:     19(int) Load 70(byteAddrTemp)
-              75:      6(int) Load 11(pos)
-              76:     19(int) ShiftRightLogical 75 24
-                              Store 74(byteAddrTemp) 76
-              77:     19(int) Load 74(byteAddrTemp)
-              78:     30(ptr) AccessChain 18(sbuf) 26 77
-              79:      6(int) Load 78
-              80:     19(int) Load 74(byteAddrTemp)
-              81:     19(int) IAdd 80 46
-              82:     30(ptr) AccessChain 18(sbuf) 26 81
-              83:      6(int) Load 82
-              84:     19(int) Load 74(byteAddrTemp)
-              85:     19(int) IAdd 84 24
-              86:     30(ptr) AccessChain 18(sbuf) 26 85
-              87:      6(int) Load 86
-              89:   88(ivec3) CompositeConstruct 79 83 87
-              90:      6(int) CompositeExtract 89 0
-              91:     30(ptr) AccessChain 18(sbuf) 26 73
-                              Store 91 90
-              92:     19(int) Load 70(byteAddrTemp)
-              93:     19(int) IAdd 92 46
-              94:      6(int) Load 11(pos)
-              95:     19(int) ShiftRightLogical 94 24
-                              Store 74(byteAddrTemp) 95
-              96:     19(int) Load 74(byteAddrTemp)
-              97:     30(ptr) AccessChain 18(sbuf) 26 96
-              98:      6(int) Load 97
-              99:     19(int) Load 74(byteAddrTemp)
-             100:     19(int) IAdd 99 46
-             101:     30(ptr) AccessChain 18(sbuf) 26 100
-             102:      6(int) Load 101
-             103:     19(int) Load 74(byteAddrTemp)
-             104:     19(int) IAdd 103 24
-             105:     30(ptr) AccessChain 18(sbuf) 26 104
-             106:      6(int) Load 105
-             107:   88(ivec3) CompositeConstruct 98 102 106
-             108:      6(int) CompositeExtract 107 1
-             109:     30(ptr) AccessChain 18(sbuf) 26 93
-                              Store 109 108
-             110:     19(int) Load 70(byteAddrTemp)
-             111:     19(int) IAdd 110 24
-             112:      6(int) Load 11(pos)
-             113:     19(int) ShiftRightLogical 112 24
-                              Store 74(byteAddrTemp) 113
-             114:     19(int) Load 74(byteAddrTemp)
-             115:     30(ptr) AccessChain 18(sbuf) 26 114
-             116:      6(int) Load 115
-             117:     19(int) Load 74(byteAddrTemp)
-             118:     19(int) IAdd 117 46
-             119:     30(ptr) AccessChain 18(sbuf) 26 118
-             120:      6(int) Load 119
-             121:     19(int) Load 74(byteAddrTemp)
-             122:     19(int) IAdd 121 24
-             123:     30(ptr) AccessChain 18(sbuf) 26 122
-             124:      6(int) Load 123
-             125:   88(ivec3) CompositeConstruct 116 120 124
-             127:      6(int) CompositeExtract 125 2
-             128:     30(ptr) AccessChain 18(sbuf) 26 111
-                              Store 128 127
-             130:      6(int) Load 11(pos)
-             131:     19(int) ShiftRightLogical 130 24
-                              Store 129(byteAddrTemp) 131
-             132:     19(int) Load 129(byteAddrTemp)
-             134:      6(int) Load 11(pos)
-             135:     19(int) ShiftRightLogical 134 24
-                              Store 133(byteAddrTemp) 135
-             136:     19(int) Load 133(byteAddrTemp)
-             137:     30(ptr) AccessChain 18(sbuf) 26 136
-             138:      6(int) Load 137
-             139:     19(int) Load 133(byteAddrTemp)
-             140:     19(int) IAdd 139 46
-             141:     30(ptr) AccessChain 18(sbuf) 26 140
-             142:      6(int) Load 141
-             143:     19(int) Load 133(byteAddrTemp)
-             144:     19(int) IAdd 143 24
-             145:     30(ptr) AccessChain 18(sbuf) 26 144
-             146:      6(int) Load 145
-             147:     19(int) Load 133(byteAddrTemp)
-             149:     19(int) IAdd 147 148
-             150:     30(ptr) AccessChain 18(sbuf) 26 149
-             151:      6(int) Load 150
-             153:  152(ivec4) CompositeConstruct 138 142 146 151
-             154:      6(int) CompositeExtract 153 0
-             155:     30(ptr) AccessChain 18(sbuf) 26 132
-                              Store 155 154
-             156:     19(int) Load 129(byteAddrTemp)
-             157:     19(int) IAdd 156 46
-             158:      6(int) Load 11(pos)
-             159:     19(int) ShiftRightLogical 158 24
-                              Store 133(byteAddrTemp) 159
-             160:     19(int) Load 133(byteAddrTemp)
-             161:     30(ptr) AccessChain 18(sbuf) 26 160
-             162:      6(int) Load 161
-             163:     19(int) Load 133(byteAddrTemp)
-             164:     19(int) IAdd 163 46
-             165:     30(ptr) AccessChain 18(sbuf) 26 164
-             166:      6(int) Load 165
-             167:     19(int) Load 133(byteAddrTemp)
-             168:     19(int) IAdd 167 24
-             169:     30(ptr) AccessChain 18(sbuf) 26 168
-             170:      6(int) Load 169
-             171:     19(int) Load 133(byteAddrTemp)
-             172:     19(int) IAdd 171 148
-             173:     30(ptr) AccessChain 18(sbuf) 26 172
-             174:      6(int) Load 173
-             175:  152(ivec4) CompositeConstruct 162 166 170 174
-             176:      6(int) CompositeExtract 175 1
-             177:     30(ptr) AccessChain 18(sbuf) 26 157
-                              Store 177 176
-             178:     19(int) Load 129(byteAddrTemp)
-             179:     19(int) IAdd 178 24
-             180:      6(int) Load 11(pos)
-             181:     19(int) ShiftRightLogical 180 24
-                              Store 133(byteAddrTemp) 181
-             182:     19(int) Load 133(byteAddrTemp)
-             183:     30(ptr) AccessChain 18(sbuf) 26 182
-             184:      6(int) Load 183
-             185:     19(int) Load 133(byteAddrTemp)
-             186:     19(int) IAdd 185 46
-             187:     30(ptr) AccessChain 18(sbuf) 26 186
-             188:      6(int) Load 187
-             189:     19(int) Load 133(byteAddrTemp)
-             190:     19(int) IAdd 189 24
-             191:     30(ptr) AccessChain 18(sbuf) 26 190
-             192:      6(int) Load 191
-             193:     19(int) Load 133(byteAddrTemp)
-             194:     19(int) IAdd 193 148
-             195:     30(ptr) AccessChain 18(sbuf) 26 194
-             196:      6(int) Load 195
-             197:  152(ivec4) CompositeConstruct 184 188 192 196
-             198:      6(int) CompositeExtract 197 2
-             199:     30(ptr) AccessChain 18(sbuf) 26 179
-                              Store 199 198
-             200:     19(int) Load 129(byteAddrTemp)
-             201:     19(int) IAdd 200 148
-             202:      6(int) Load 11(pos)
-             203:     19(int) ShiftRightLogical 202 24
-                              Store 133(byteAddrTemp) 203
-             204:     19(int) Load 133(byteAddrTemp)
-             205:     30(ptr) AccessChain 18(sbuf) 26 204
-             206:      6(int) Load 205
-             207:     19(int) Load 133(byteAddrTemp)
-             208:     19(int) IAdd 207 46
-             209:     30(ptr) AccessChain 18(sbuf) 26 208
-             210:      6(int) Load 209
-             211:     19(int) Load 133(byteAddrTemp)
-             212:     19(int) IAdd 211 24
-             213:     30(ptr) AccessChain 18(sbuf) 26 212
-             214:      6(int) Load 213
-             215:     19(int) Load 133(byteAddrTemp)
-             216:     19(int) IAdd 215 148
-             217:     30(ptr) AccessChain 18(sbuf) 26 216
-             218:      6(int) Load 217
-             219:  152(ivec4) CompositeConstruct 206 210 214 218
-             221:      6(int) CompositeExtract 219 3
-             222:     30(ptr) AccessChain 18(sbuf) 26 201
-                              Store 222 221
-             223:      6(int) Load 11(pos)
-             224:     19(int) ShiftRightLogical 223 24
-             225:     30(ptr) AccessChain 18(sbuf) 26 224
-             226:      6(int) Load 225
-             227:    8(float) ConvertUToF 226
-             228:    9(fvec4) CompositeConstruct 227 227 227 227
-                              ReturnValue 228
+              33:     30(ptr) AccessChain 18(sbuf) 26 27
+                              Store 33 32
+              35:      6(int) Load 11(pos)
+              36:     20(int) ShiftRightLogical 35 24
+                              Store 34(byteAddrTemp) 36
+              37:     20(int) Load 34(byteAddrTemp)
+              39:      6(int) Load 11(pos)
+              40:     20(int) ShiftRightLogical 39 24
+                              Store 38(byteAddrTemp) 40
+              41:     20(int) Load 38(byteAddrTemp)
+              42:     30(ptr) AccessChain 18(sbuf) 26 41
+              43:      6(int) Load 42
+              44:     20(int) Load 38(byteAddrTemp)
+              46:     20(int) IAdd 44 45
+              47:     30(ptr) AccessChain 18(sbuf) 26 46
+              48:      6(int) Load 47
+              50:   49(ivec2) CompositeConstruct 43 48
+              52:      6(int) CompositeExtract 50 0
+              53:     30(ptr) AccessChain 18(sbuf) 26 37
+                              Store 53 52
+              54:     20(int) Load 34(byteAddrTemp)
+              55:     20(int) IAdd 54 45
+              56:      6(int) Load 11(pos)
+              57:     20(int) ShiftRightLogical 56 24
+                              Store 38(byteAddrTemp) 57
+              58:     20(int) Load 38(byteAddrTemp)
+              59:     30(ptr) AccessChain 18(sbuf) 26 58
+              60:      6(int) Load 59
+              61:     20(int) Load 38(byteAddrTemp)
+              62:     20(int) IAdd 61 45
+              63:     30(ptr) AccessChain 18(sbuf) 26 62
+              64:      6(int) Load 63
+              65:   49(ivec2) CompositeConstruct 60 64
+              67:      6(int) CompositeExtract 65 1
+              68:     30(ptr) AccessChain 18(sbuf) 26 55
+                              Store 68 67
+              70:      6(int) Load 11(pos)
+              71:     20(int) ShiftRightLogical 70 24
+                              Store 69(byteAddrTemp) 71
+              72:     20(int) Load 69(byteAddrTemp)
+              74:      6(int) Load 11(pos)
+              75:     20(int) ShiftRightLogical 74 24
+                              Store 73(byteAddrTemp) 75
+              76:     20(int) Load 73(byteAddrTemp)
+              77:     30(ptr) AccessChain 18(sbuf) 26 76
+              78:      6(int) Load 77
+              79:     20(int) Load 73(byteAddrTemp)
+              80:     20(int) IAdd 79 45
+              81:     30(ptr) AccessChain 18(sbuf) 26 80
+              82:      6(int) Load 81
+              83:     20(int) Load 73(byteAddrTemp)
+              84:     20(int) IAdd 83 24
+              85:     30(ptr) AccessChain 18(sbuf) 26 84
+              86:      6(int) Load 85
+              88:   87(ivec3) CompositeConstruct 78 82 86
+              89:      6(int) CompositeExtract 88 0
+              90:     30(ptr) AccessChain 18(sbuf) 26 72
+                              Store 90 89
+              91:     20(int) Load 69(byteAddrTemp)
+              92:     20(int) IAdd 91 45
+              93:      6(int) Load 11(pos)
+              94:     20(int) ShiftRightLogical 93 24
+                              Store 73(byteAddrTemp) 94
+              95:     20(int) Load 73(byteAddrTemp)
+              96:     30(ptr) AccessChain 18(sbuf) 26 95
+              97:      6(int) Load 96
+              98:     20(int) Load 73(byteAddrTemp)
+              99:     20(int) IAdd 98 45
+             100:     30(ptr) AccessChain 18(sbuf) 26 99
+             101:      6(int) Load 100
+             102:     20(int) Load 73(byteAddrTemp)
+             103:     20(int) IAdd 102 24
+             104:     30(ptr) AccessChain 18(sbuf) 26 103
+             105:      6(int) Load 104
+             106:   87(ivec3) CompositeConstruct 97 101 105
+             107:      6(int) CompositeExtract 106 1
+             108:     30(ptr) AccessChain 18(sbuf) 26 92
+                              Store 108 107
+             109:     20(int) Load 69(byteAddrTemp)
+             110:     20(int) IAdd 109 24
+             111:      6(int) Load 11(pos)
+             112:     20(int) ShiftRightLogical 111 24
+                              Store 73(byteAddrTemp) 112
+             113:     20(int) Load 73(byteAddrTemp)
+             114:     30(ptr) AccessChain 18(sbuf) 26 113
+             115:      6(int) Load 114
+             116:     20(int) Load 73(byteAddrTemp)
+             117:     20(int) IAdd 116 45
+             118:     30(ptr) AccessChain 18(sbuf) 26 117
+             119:      6(int) Load 118
+             120:     20(int) Load 73(byteAddrTemp)
+             121:     20(int) IAdd 120 24
+             122:     30(ptr) AccessChain 18(sbuf) 26 121
+             123:      6(int) Load 122
+             124:   87(ivec3) CompositeConstruct 115 119 123
+             126:      6(int) CompositeExtract 124 2
+             127:     30(ptr) AccessChain 18(sbuf) 26 110
+                              Store 127 126
+             129:      6(int) Load 11(pos)
+             130:     20(int) ShiftRightLogical 129 24
+                              Store 128(byteAddrTemp) 130
+             131:     20(int) Load 128(byteAddrTemp)
+             133:      6(int) Load 11(pos)
+             134:     20(int) ShiftRightLogical 133 24
+                              Store 132(byteAddrTemp) 134
+             135:     20(int) Load 132(byteAddrTemp)
+             136:     30(ptr) AccessChain 18(sbuf) 26 135
+             137:      6(int) Load 136
+             138:     20(int) Load 132(byteAddrTemp)
+             139:     20(int) IAdd 138 45
+             140:     30(ptr) AccessChain 18(sbuf) 26 139
+             141:      6(int) Load 140
+             142:     20(int) Load 132(byteAddrTemp)
+             143:     20(int) IAdd 142 24
+             144:     30(ptr) AccessChain 18(sbuf) 26 143
+             145:      6(int) Load 144
+             146:     20(int) Load 132(byteAddrTemp)
+             148:     20(int) IAdd 146 147
+             149:     30(ptr) AccessChain 18(sbuf) 26 148
+             150:      6(int) Load 149
+             152:  151(ivec4) CompositeConstruct 137 141 145 150
+             153:      6(int) CompositeExtract 152 0
+             154:     30(ptr) AccessChain 18(sbuf) 26 131
+                              Store 154 153
+             155:     20(int) Load 128(byteAddrTemp)
+             156:     20(int) IAdd 155 45
+             157:      6(int) Load 11(pos)
+             158:     20(int) ShiftRightLogical 157 24
+                              Store 132(byteAddrTemp) 158
+             159:     20(int) Load 132(byteAddrTemp)
+             160:     30(ptr) AccessChain 18(sbuf) 26 159
+             161:      6(int) Load 160
+             162:     20(int) Load 132(byteAddrTemp)
+             163:     20(int) IAdd 162 45
+             164:     30(ptr) AccessChain 18(sbuf) 26 163
+             165:      6(int) Load 164
+             166:     20(int) Load 132(byteAddrTemp)
+             167:     20(int) IAdd 166 24
+             168:     30(ptr) AccessChain 18(sbuf) 26 167
+             169:      6(int) Load 168
+             170:     20(int) Load 132(byteAddrTemp)
+             171:     20(int) IAdd 170 147
+             172:     30(ptr) AccessChain 18(sbuf) 26 171
+             173:      6(int) Load 172
+             174:  151(ivec4) CompositeConstruct 161 165 169 173
+             175:      6(int) CompositeExtract 174 1
+             176:     30(ptr) AccessChain 18(sbuf) 26 156
+                              Store 176 175
+             177:     20(int) Load 128(byteAddrTemp)
+             178:     20(int) IAdd 177 24
+             179:      6(int) Load 11(pos)
+             180:     20(int) ShiftRightLogical 179 24
+                              Store 132(byteAddrTemp) 180
+             181:     20(int) Load 132(byteAddrTemp)
+             182:     30(ptr) AccessChain 18(sbuf) 26 181
+             183:      6(int) Load 182
+             184:     20(int) Load 132(byteAddrTemp)
+             185:     20(int) IAdd 184 45
+             186:     30(ptr) AccessChain 18(sbuf) 26 185
+             187:      6(int) Load 186
+             188:     20(int) Load 132(byteAddrTemp)
+             189:     20(int) IAdd 188 24
+             190:     30(ptr) AccessChain 18(sbuf) 26 189
+             191:      6(int) Load 190
+             192:     20(int) Load 132(byteAddrTemp)
+             193:     20(int) IAdd 192 147
+             194:     30(ptr) AccessChain 18(sbuf) 26 193
+             195:      6(int) Load 194
+             196:  151(ivec4) CompositeConstruct 183 187 191 195
+             197:      6(int) CompositeExtract 196 2
+             198:     30(ptr) AccessChain 18(sbuf) 26 178
+                              Store 198 197
+             199:     20(int) Load 128(byteAddrTemp)
+             200:     20(int) IAdd 199 147
+             201:      6(int) Load 11(pos)
+             202:     20(int) ShiftRightLogical 201 24
+                              Store 132(byteAddrTemp) 202
+             203:     20(int) Load 132(byteAddrTemp)
+             204:     30(ptr) AccessChain 18(sbuf) 26 203
+             205:      6(int) Load 204
+             206:     20(int) Load 132(byteAddrTemp)
+             207:     20(int) IAdd 206 45
+             208:     30(ptr) AccessChain 18(sbuf) 26 207
+             209:      6(int) Load 208
+             210:     20(int) Load 132(byteAddrTemp)
+             211:     20(int) IAdd 210 24
+             212:     30(ptr) AccessChain 18(sbuf) 26 211
+             213:      6(int) Load 212
+             214:     20(int) Load 132(byteAddrTemp)
+             215:     20(int) IAdd 214 147
+             216:     30(ptr) AccessChain 18(sbuf) 26 215
+             217:      6(int) Load 216
+             218:  151(ivec4) CompositeConstruct 205 209 213 217
+             220:      6(int) CompositeExtract 218 3
+             221:     30(ptr) AccessChain 18(sbuf) 26 200
+                              Store 221 220
+             222:      6(int) Load 11(pos)
+             223:     20(int) ShiftRightLogical 222 24
+             224:     30(ptr) AccessChain 18(sbuf) 26 223
+             225:      6(int) Load 224
+             226:    8(float) ConvertUToF 225
+             227:    9(fvec4) CompositeConstruct 226 226 226 226
+                              ReturnValue 227
                               FunctionEnd
diff --git a/Test/baseResults/hlsl.structin.vert.out b/Test/baseResults/hlsl.structin.vert.out
old mode 100755
new mode 100644
index 8378de2..d7f539d
--- a/Test/baseResults/hlsl.structin.vert.out
+++ b/Test/baseResults/hlsl.structin.vert.out
@@ -1,15 +1,15 @@
 hlsl.structin.vert
 Shader version: 500
 0:? Sequence
-0:8  Function Definition: @main(vf4;struct-VI-vf4[2]-vu2-vf41;vf4; ( temp structure{ temp 2-element array of 4-component vector of float m,  temp 2-component vector of uint coord,  temp 4-component vector of float b})
+0:8  Function Definition: @main(vf4;struct-VI-vf4[2]-vf4-vf41;vf4; ( temp structure{ temp 2-element array of 4-component vector of float m,  temp 4-component vector of float coord,  temp 4-component vector of float b})
 0:8    Function Parameters: 
 0:8      'd' ( in 4-component vector of float)
-0:8      'vi' ( in structure{ temp 2-element array of 4-component vector of float m,  temp 2-component vector of uint coord,  temp 4-component vector of float b})
+0:8      'vi' ( in structure{ temp 2-element array of 4-component vector of float m,  temp 4-component vector of float coord,  temp 4-component vector of float b})
 0:8      'e' ( in 4-component vector of float)
 0:?     Sequence
 0:11      move second child to first child ( temp 4-component vector of float)
 0:11        b: direct index for structure ( temp 4-component vector of float)
-0:11          'local' ( temp structure{ temp 2-element array of 4-component vector of float m,  temp 2-component vector of uint coord,  temp 4-component vector of float b})
+0:11          'local' ( temp structure{ temp 2-element array of 4-component vector of float m,  temp 4-component vector of float coord,  temp 4-component vector of float b})
 0:11          Constant:
 0:11            2 (const int)
 0:11        add ( temp 4-component vector of float)
@@ -18,31 +18,66 @@
 0:11              add ( temp 4-component vector of float)
 0:11                direct index ( temp 4-component vector of float)
 0:11                  m: direct index for structure ( temp 2-element array of 4-component vector of float)
-0:11                    'vi' ( in structure{ temp 2-element array of 4-component vector of float m,  temp 2-component vector of uint coord,  temp 4-component vector of float b})
+0:11                    'vi' ( in structure{ temp 2-element array of 4-component vector of float m,  temp 4-component vector of float coord,  temp 4-component vector of float b})
 0:11                    Constant:
 0:11                      0 (const int)
 0:11                  Constant:
 0:11                    1 (const int)
 0:11                direct index ( temp 4-component vector of float)
 0:11                  m: direct index for structure ( temp 2-element array of 4-component vector of float)
-0:11                    'vi' ( in structure{ temp 2-element array of 4-component vector of float m,  temp 2-component vector of uint coord,  temp 4-component vector of float b})
+0:11                    'vi' ( in structure{ temp 2-element array of 4-component vector of float m,  temp 4-component vector of float coord,  temp 4-component vector of float b})
 0:11                    Constant:
 0:11                      0 (const int)
 0:11                  Constant:
 0:11                    0 (const int)
 0:11              Construct vec4 ( temp 4-component vector of float)
-0:11                Convert uint to float ( temp float)
-0:11                  direct index ( temp uint)
-0:11                    coord: direct index for structure ( temp 2-component vector of uint)
-0:11                      'vi' ( in structure{ temp 2-element array of 4-component vector of float m,  temp 2-component vector of uint coord,  temp 4-component vector of float b})
-0:11                      Constant:
-0:11                        1 (const int)
+0:11                direct index ( temp float)
+0:11                  coord: direct index for structure ( temp 4-component vector of float)
+0:11                    'vi' ( in structure{ temp 2-element array of 4-component vector of float m,  temp 4-component vector of float coord,  temp 4-component vector of float b})
 0:11                    Constant:
-0:11                      0 (const int)
+0:11                      1 (const int)
+0:11                  Constant:
+0:11                    0 (const int)
 0:11            'd' ( in 4-component vector of float)
 0:11          'e' ( in 4-component vector of float)
-0:13      Branch: Return with expression
-0:13        'local' ( temp structure{ temp 2-element array of 4-component vector of float m,  temp 2-component vector of uint coord,  temp 4-component vector of float b})
+0:12      move second child to first child ( temp 4-component vector of float)
+0:12        coord: direct index for structure ( temp 4-component vector of float)
+0:12          'local' ( temp structure{ temp 2-element array of 4-component vector of float m,  temp 4-component vector of float coord,  temp 4-component vector of float b})
+0:12          Constant:
+0:12            1 (const int)
+0:12        Constant:
+0:12          1.000000
+0:12          1.000000
+0:12          1.000000
+0:12          1.000000
+0:13      move second child to first child ( temp 4-component vector of float)
+0:13        direct index ( temp 4-component vector of float)
+0:13          m: direct index for structure ( temp 2-element array of 4-component vector of float)
+0:13            'local' ( temp structure{ temp 2-element array of 4-component vector of float m,  temp 4-component vector of float coord,  temp 4-component vector of float b})
+0:13            Constant:
+0:13              0 (const int)
+0:13          Constant:
+0:13            0 (const int)
+0:13        Constant:
+0:13          2.000000
+0:13          2.000000
+0:13          2.000000
+0:13          2.000000
+0:14      move second child to first child ( temp 4-component vector of float)
+0:14        direct index ( temp 4-component vector of float)
+0:14          m: direct index for structure ( temp 2-element array of 4-component vector of float)
+0:14            'local' ( temp structure{ temp 2-element array of 4-component vector of float m,  temp 4-component vector of float coord,  temp 4-component vector of float b})
+0:14            Constant:
+0:14              0 (const int)
+0:14          Constant:
+0:14            1 (const int)
+0:14        Constant:
+0:14          3.000000
+0:14          3.000000
+0:14          3.000000
+0:14          3.000000
+0:16      Branch: Return with expression
+0:16        'local' ( temp structure{ temp 2-element array of 4-component vector of float m,  temp 4-component vector of float coord,  temp 4-component vector of float b})
 0:8  Function Definition: main( ( temp void)
 0:8    Function Parameters: 
 0:?     Sequence
@@ -53,79 +88,83 @@
 0:8        move second child to first child ( temp 4-component vector of float)
 0:8          direct index ( temp 4-component vector of float)
 0:8            m: direct index for structure ( temp 2-element array of 4-component vector of float)
-0:?               'vi' ( temp structure{ temp 2-element array of 4-component vector of float m,  temp 2-component vector of uint coord,  temp 4-component vector of float b})
+0:?               'vi' ( temp structure{ temp 2-element array of 4-component vector of float m,  temp 4-component vector of float coord,  temp 4-component vector of float b})
 0:8              Constant:
 0:8                0 (const int)
 0:8            Constant:
 0:8              0 (const int)
-0:?           'm[0]' (layout( location=1) in 4-component vector of float)
+0:?           'vi.m[0]' (layout( location=1) in 4-component vector of float)
 0:8        move second child to first child ( temp 4-component vector of float)
 0:8          direct index ( temp 4-component vector of float)
 0:8            m: direct index for structure ( temp 2-element array of 4-component vector of float)
-0:?               'vi' ( temp structure{ temp 2-element array of 4-component vector of float m,  temp 2-component vector of uint coord,  temp 4-component vector of float b})
+0:?               'vi' ( temp structure{ temp 2-element array of 4-component vector of float m,  temp 4-component vector of float coord,  temp 4-component vector of float b})
 0:8              Constant:
 0:8                0 (const int)
 0:8            Constant:
 0:8              1 (const int)
-0:?           'm[1]' (layout( location=2) in 4-component vector of float)
-0:8        move second child to first child ( temp 2-component vector of uint)
-0:8          coord: direct index for structure ( temp 2-component vector of uint)
-0:?             'vi' ( temp structure{ temp 2-element array of 4-component vector of float m,  temp 2-component vector of uint coord,  temp 4-component vector of float b})
+0:?           'vi.m[1]' (layout( location=2) in 4-component vector of float)
+0:8        move second child to first child ( temp 4-component vector of float)
+0:8          coord: direct index for structure ( temp 4-component vector of float)
+0:?             'vi' ( temp structure{ temp 2-element array of 4-component vector of float m,  temp 4-component vector of float coord,  temp 4-component vector of float b})
 0:8            Constant:
 0:8              1 (const int)
-0:?           'coord' (layout( location=3) in 2-component vector of uint)
+0:?           'vi.coord' (layout( location=3) in 4-component vector of float)
 0:8        move second child to first child ( temp 4-component vector of float)
 0:8          b: direct index for structure ( temp 4-component vector of float)
-0:?             'vi' ( temp structure{ temp 2-element array of 4-component vector of float m,  temp 2-component vector of uint coord,  temp 4-component vector of float b})
+0:?             'vi' ( temp structure{ temp 2-element array of 4-component vector of float m,  temp 4-component vector of float coord,  temp 4-component vector of float b})
 0:8            Constant:
 0:8              2 (const int)
-0:?           'b' (layout( location=4) in 4-component vector of float)
+0:?           'vi.b' (layout( location=4) in 4-component vector of float)
 0:8      move second child to first child ( temp 4-component vector of float)
 0:?         'e' ( temp 4-component vector of float)
 0:?         'e' (layout( location=5) in 4-component vector of float)
 0:8      Sequence
-0:8        move second child to first child ( temp structure{ temp 2-element array of 4-component vector of float m,  temp 2-component vector of uint coord,  temp 4-component vector of float b})
-0:8          'flattenTemp' ( temp structure{ temp 2-element array of 4-component vector of float m,  temp 2-component vector of uint coord,  temp 4-component vector of float b})
-0:8          Function Call: @main(vf4;struct-VI-vf4[2]-vu2-vf41;vf4; ( temp structure{ temp 2-element array of 4-component vector of float m,  temp 2-component vector of uint coord,  temp 4-component vector of float b})
+0:8        move second child to first child ( temp structure{ temp 2-element array of 4-component vector of float m,  temp 4-component vector of float coord,  temp 4-component vector of float b})
+0:8          'flattenTemp' ( temp structure{ temp 2-element array of 4-component vector of float m,  temp 4-component vector of float coord,  temp 4-component vector of float b})
+0:8          Function Call: @main(vf4;struct-VI-vf4[2]-vf4-vf41;vf4; ( temp structure{ temp 2-element array of 4-component vector of float m,  temp 4-component vector of float coord,  temp 4-component vector of float b})
 0:?             'd' ( temp 4-component vector of float)
-0:?             'vi' ( temp structure{ temp 2-element array of 4-component vector of float m,  temp 2-component vector of uint coord,  temp 4-component vector of float b})
+0:?             'vi' ( temp structure{ temp 2-element array of 4-component vector of float m,  temp 4-component vector of float coord,  temp 4-component vector of float b})
 0:?             'e' ( temp 4-component vector of float)
-0:8        move second child to first child ( temp 2-element array of 4-component vector of float)
-0:8          m: direct index for structure ( temp 2-element array of 4-component vector of float)
-0:8            '@entryPointOutput' ( out structure Position{ temp 2-element array of 4-component vector of float m,  temp 2-component vector of uint coord,  temp 4-component vector of float b})
+0:8        move second child to first child ( temp 4-component vector of float)
+0:?           '@entryPointOutput.m[0]' (layout( location=0) out 4-component vector of float)
+0:8          direct index ( temp 4-component vector of float)
+0:8            m: direct index for structure ( temp 2-element array of 4-component vector of float)
+0:8              'flattenTemp' ( temp structure{ temp 2-element array of 4-component vector of float m,  temp 4-component vector of float coord,  temp 4-component vector of float b})
+0:8              Constant:
+0:8                0 (const int)
 0:8            Constant:
 0:8              0 (const int)
-0:8          m: direct index for structure ( temp 2-element array of 4-component vector of float)
-0:8            'flattenTemp' ( temp structure{ temp 2-element array of 4-component vector of float m,  temp 2-component vector of uint coord,  temp 4-component vector of float b})
-0:8            Constant:
-0:8              0 (const int)
-0:8        move second child to first child ( temp 2-component vector of uint)
-0:8          coord: direct index for structure ( temp 2-component vector of uint)
-0:8            '@entryPointOutput' ( out structure Position{ temp 2-element array of 4-component vector of float m,  temp 2-component vector of uint coord,  temp 4-component vector of float b})
-0:8            Constant:
-0:8              1 (const int)
-0:8          coord: direct index for structure ( temp 2-component vector of uint)
-0:8            'flattenTemp' ( temp structure{ temp 2-element array of 4-component vector of float m,  temp 2-component vector of uint coord,  temp 4-component vector of float b})
+0:8        move second child to first child ( temp 4-component vector of float)
+0:?           '@entryPointOutput.m[1]' (layout( location=1) out 4-component vector of float)
+0:8          direct index ( temp 4-component vector of float)
+0:8            m: direct index for structure ( temp 2-element array of 4-component vector of float)
+0:8              'flattenTemp' ( temp structure{ temp 2-element array of 4-component vector of float m,  temp 4-component vector of float coord,  temp 4-component vector of float b})
+0:8              Constant:
+0:8                0 (const int)
 0:8            Constant:
 0:8              1 (const int)
 0:8        move second child to first child ( temp 4-component vector of float)
-0:8          b: direct index for structure ( temp 4-component vector of float)
-0:8            '@entryPointOutput' ( out structure Position{ temp 2-element array of 4-component vector of float m,  temp 2-component vector of uint coord,  temp 4-component vector of float b})
+0:?           '@entryPointOutput.coord' ( out 4-component vector of float Position)
+0:8          coord: direct index for structure ( temp 4-component vector of float)
+0:8            'flattenTemp' ( temp structure{ temp 2-element array of 4-component vector of float m,  temp 4-component vector of float coord,  temp 4-component vector of float b})
 0:8            Constant:
-0:8              2 (const int)
+0:8              1 (const int)
+0:8        move second child to first child ( temp 4-component vector of float)
+0:?           '@entryPointOutput.b' (layout( location=2) smooth out 4-component vector of float)
 0:8          b: direct index for structure ( temp 4-component vector of float)
-0:8            'flattenTemp' ( temp structure{ temp 2-element array of 4-component vector of float m,  temp 2-component vector of uint coord,  temp 4-component vector of float b})
+0:8            'flattenTemp' ( temp structure{ temp 2-element array of 4-component vector of float m,  temp 4-component vector of float coord,  temp 4-component vector of float b})
 0:8            Constant:
 0:8              2 (const int)
 0:?   Linker Objects
-0:?     '@entryPointOutput' ( out structure Position{ temp 2-element array of 4-component vector of float m,  temp 2-component vector of uint coord,  temp 4-component vector of float b})
+0:?     '@entryPointOutput.coord' ( out 4-component vector of float Position)
+0:?     '@entryPointOutput.m[0]' (layout( location=0) out 4-component vector of float)
+0:?     '@entryPointOutput.m[1]' (layout( location=1) out 4-component vector of float)
+0:?     '@entryPointOutput.b' (layout( location=2) smooth out 4-component vector of float)
 0:?     'd' (layout( location=0) in 4-component vector of float)
-0:?     'm[0]' (layout( location=1) in 4-component vector of float)
-0:?     'm[1]' (layout( location=2) in 4-component vector of float)
-0:?     'm[0]' (layout( location=1) in 4-component vector of float)
-0:?     'm[1]' (layout( location=2) in 4-component vector of float)
-0:?     'coord' (layout( location=3) in 2-component vector of uint)
-0:?     'b' (layout( location=4) in 4-component vector of float)
+0:?     'vi.m[0]' (layout( location=1) in 4-component vector of float)
+0:?     'vi.m[1]' (layout( location=2) in 4-component vector of float)
+0:?     'vi.coord' (layout( location=3) in 4-component vector of float)
+0:?     'vi.b' (layout( location=4) in 4-component vector of float)
 0:?     'e' (layout( location=5) in 4-component vector of float)
 
 
@@ -134,15 +173,15 @@
 
 Shader version: 500
 0:? Sequence
-0:8  Function Definition: @main(vf4;struct-VI-vf4[2]-vu2-vf41;vf4; ( temp structure{ temp 2-element array of 4-component vector of float m,  temp 2-component vector of uint coord,  temp 4-component vector of float b})
+0:8  Function Definition: @main(vf4;struct-VI-vf4[2]-vf4-vf41;vf4; ( temp structure{ temp 2-element array of 4-component vector of float m,  temp 4-component vector of float coord,  temp 4-component vector of float b})
 0:8    Function Parameters: 
 0:8      'd' ( in 4-component vector of float)
-0:8      'vi' ( in structure{ temp 2-element array of 4-component vector of float m,  temp 2-component vector of uint coord,  temp 4-component vector of float b})
+0:8      'vi' ( in structure{ temp 2-element array of 4-component vector of float m,  temp 4-component vector of float coord,  temp 4-component vector of float b})
 0:8      'e' ( in 4-component vector of float)
 0:?     Sequence
 0:11      move second child to first child ( temp 4-component vector of float)
 0:11        b: direct index for structure ( temp 4-component vector of float)
-0:11          'local' ( temp structure{ temp 2-element array of 4-component vector of float m,  temp 2-component vector of uint coord,  temp 4-component vector of float b})
+0:11          'local' ( temp structure{ temp 2-element array of 4-component vector of float m,  temp 4-component vector of float coord,  temp 4-component vector of float b})
 0:11          Constant:
 0:11            2 (const int)
 0:11        add ( temp 4-component vector of float)
@@ -151,31 +190,66 @@
 0:11              add ( temp 4-component vector of float)
 0:11                direct index ( temp 4-component vector of float)
 0:11                  m: direct index for structure ( temp 2-element array of 4-component vector of float)
-0:11                    'vi' ( in structure{ temp 2-element array of 4-component vector of float m,  temp 2-component vector of uint coord,  temp 4-component vector of float b})
+0:11                    'vi' ( in structure{ temp 2-element array of 4-component vector of float m,  temp 4-component vector of float coord,  temp 4-component vector of float b})
 0:11                    Constant:
 0:11                      0 (const int)
 0:11                  Constant:
 0:11                    1 (const int)
 0:11                direct index ( temp 4-component vector of float)
 0:11                  m: direct index for structure ( temp 2-element array of 4-component vector of float)
-0:11                    'vi' ( in structure{ temp 2-element array of 4-component vector of float m,  temp 2-component vector of uint coord,  temp 4-component vector of float b})
+0:11                    'vi' ( in structure{ temp 2-element array of 4-component vector of float m,  temp 4-component vector of float coord,  temp 4-component vector of float b})
 0:11                    Constant:
 0:11                      0 (const int)
 0:11                  Constant:
 0:11                    0 (const int)
 0:11              Construct vec4 ( temp 4-component vector of float)
-0:11                Convert uint to float ( temp float)
-0:11                  direct index ( temp uint)
-0:11                    coord: direct index for structure ( temp 2-component vector of uint)
-0:11                      'vi' ( in structure{ temp 2-element array of 4-component vector of float m,  temp 2-component vector of uint coord,  temp 4-component vector of float b})
-0:11                      Constant:
-0:11                        1 (const int)
+0:11                direct index ( temp float)
+0:11                  coord: direct index for structure ( temp 4-component vector of float)
+0:11                    'vi' ( in structure{ temp 2-element array of 4-component vector of float m,  temp 4-component vector of float coord,  temp 4-component vector of float b})
 0:11                    Constant:
-0:11                      0 (const int)
+0:11                      1 (const int)
+0:11                  Constant:
+0:11                    0 (const int)
 0:11            'd' ( in 4-component vector of float)
 0:11          'e' ( in 4-component vector of float)
-0:13      Branch: Return with expression
-0:13        'local' ( temp structure{ temp 2-element array of 4-component vector of float m,  temp 2-component vector of uint coord,  temp 4-component vector of float b})
+0:12      move second child to first child ( temp 4-component vector of float)
+0:12        coord: direct index for structure ( temp 4-component vector of float)
+0:12          'local' ( temp structure{ temp 2-element array of 4-component vector of float m,  temp 4-component vector of float coord,  temp 4-component vector of float b})
+0:12          Constant:
+0:12            1 (const int)
+0:12        Constant:
+0:12          1.000000
+0:12          1.000000
+0:12          1.000000
+0:12          1.000000
+0:13      move second child to first child ( temp 4-component vector of float)
+0:13        direct index ( temp 4-component vector of float)
+0:13          m: direct index for structure ( temp 2-element array of 4-component vector of float)
+0:13            'local' ( temp structure{ temp 2-element array of 4-component vector of float m,  temp 4-component vector of float coord,  temp 4-component vector of float b})
+0:13            Constant:
+0:13              0 (const int)
+0:13          Constant:
+0:13            0 (const int)
+0:13        Constant:
+0:13          2.000000
+0:13          2.000000
+0:13          2.000000
+0:13          2.000000
+0:14      move second child to first child ( temp 4-component vector of float)
+0:14        direct index ( temp 4-component vector of float)
+0:14          m: direct index for structure ( temp 2-element array of 4-component vector of float)
+0:14            'local' ( temp structure{ temp 2-element array of 4-component vector of float m,  temp 4-component vector of float coord,  temp 4-component vector of float b})
+0:14            Constant:
+0:14              0 (const int)
+0:14          Constant:
+0:14            1 (const int)
+0:14        Constant:
+0:14          3.000000
+0:14          3.000000
+0:14          3.000000
+0:14          3.000000
+0:16      Branch: Return with expression
+0:16        'local' ( temp structure{ temp 2-element array of 4-component vector of float m,  temp 4-component vector of float coord,  temp 4-component vector of float b})
 0:8  Function Definition: main( ( temp void)
 0:8    Function Parameters: 
 0:?     Sequence
@@ -186,125 +260,131 @@
 0:8        move second child to first child ( temp 4-component vector of float)
 0:8          direct index ( temp 4-component vector of float)
 0:8            m: direct index for structure ( temp 2-element array of 4-component vector of float)
-0:?               'vi' ( temp structure{ temp 2-element array of 4-component vector of float m,  temp 2-component vector of uint coord,  temp 4-component vector of float b})
+0:?               'vi' ( temp structure{ temp 2-element array of 4-component vector of float m,  temp 4-component vector of float coord,  temp 4-component vector of float b})
 0:8              Constant:
 0:8                0 (const int)
 0:8            Constant:
 0:8              0 (const int)
-0:?           'm[0]' (layout( location=1) in 4-component vector of float)
+0:?           'vi.m[0]' (layout( location=1) in 4-component vector of float)
 0:8        move second child to first child ( temp 4-component vector of float)
 0:8          direct index ( temp 4-component vector of float)
 0:8            m: direct index for structure ( temp 2-element array of 4-component vector of float)
-0:?               'vi' ( temp structure{ temp 2-element array of 4-component vector of float m,  temp 2-component vector of uint coord,  temp 4-component vector of float b})
+0:?               'vi' ( temp structure{ temp 2-element array of 4-component vector of float m,  temp 4-component vector of float coord,  temp 4-component vector of float b})
 0:8              Constant:
 0:8                0 (const int)
 0:8            Constant:
 0:8              1 (const int)
-0:?           'm[1]' (layout( location=2) in 4-component vector of float)
-0:8        move second child to first child ( temp 2-component vector of uint)
-0:8          coord: direct index for structure ( temp 2-component vector of uint)
-0:?             'vi' ( temp structure{ temp 2-element array of 4-component vector of float m,  temp 2-component vector of uint coord,  temp 4-component vector of float b})
+0:?           'vi.m[1]' (layout( location=2) in 4-component vector of float)
+0:8        move second child to first child ( temp 4-component vector of float)
+0:8          coord: direct index for structure ( temp 4-component vector of float)
+0:?             'vi' ( temp structure{ temp 2-element array of 4-component vector of float m,  temp 4-component vector of float coord,  temp 4-component vector of float b})
 0:8            Constant:
 0:8              1 (const int)
-0:?           'coord' (layout( location=3) in 2-component vector of uint)
+0:?           'vi.coord' (layout( location=3) in 4-component vector of float)
 0:8        move second child to first child ( temp 4-component vector of float)
 0:8          b: direct index for structure ( temp 4-component vector of float)
-0:?             'vi' ( temp structure{ temp 2-element array of 4-component vector of float m,  temp 2-component vector of uint coord,  temp 4-component vector of float b})
+0:?             'vi' ( temp structure{ temp 2-element array of 4-component vector of float m,  temp 4-component vector of float coord,  temp 4-component vector of float b})
 0:8            Constant:
 0:8              2 (const int)
-0:?           'b' (layout( location=4) in 4-component vector of float)
+0:?           'vi.b' (layout( location=4) in 4-component vector of float)
 0:8      move second child to first child ( temp 4-component vector of float)
 0:?         'e' ( temp 4-component vector of float)
 0:?         'e' (layout( location=5) in 4-component vector of float)
 0:8      Sequence
-0:8        move second child to first child ( temp structure{ temp 2-element array of 4-component vector of float m,  temp 2-component vector of uint coord,  temp 4-component vector of float b})
-0:8          'flattenTemp' ( temp structure{ temp 2-element array of 4-component vector of float m,  temp 2-component vector of uint coord,  temp 4-component vector of float b})
-0:8          Function Call: @main(vf4;struct-VI-vf4[2]-vu2-vf41;vf4; ( temp structure{ temp 2-element array of 4-component vector of float m,  temp 2-component vector of uint coord,  temp 4-component vector of float b})
+0:8        move second child to first child ( temp structure{ temp 2-element array of 4-component vector of float m,  temp 4-component vector of float coord,  temp 4-component vector of float b})
+0:8          'flattenTemp' ( temp structure{ temp 2-element array of 4-component vector of float m,  temp 4-component vector of float coord,  temp 4-component vector of float b})
+0:8          Function Call: @main(vf4;struct-VI-vf4[2]-vf4-vf41;vf4; ( temp structure{ temp 2-element array of 4-component vector of float m,  temp 4-component vector of float coord,  temp 4-component vector of float b})
 0:?             'd' ( temp 4-component vector of float)
-0:?             'vi' ( temp structure{ temp 2-element array of 4-component vector of float m,  temp 2-component vector of uint coord,  temp 4-component vector of float b})
+0:?             'vi' ( temp structure{ temp 2-element array of 4-component vector of float m,  temp 4-component vector of float coord,  temp 4-component vector of float b})
 0:?             'e' ( temp 4-component vector of float)
-0:8        move second child to first child ( temp 2-element array of 4-component vector of float)
-0:8          m: direct index for structure ( temp 2-element array of 4-component vector of float)
-0:8            '@entryPointOutput' ( out structure Position{ temp 2-element array of 4-component vector of float m,  temp 2-component vector of uint coord,  temp 4-component vector of float b})
+0:8        move second child to first child ( temp 4-component vector of float)
+0:?           '@entryPointOutput.m[0]' (layout( location=0) out 4-component vector of float)
+0:8          direct index ( temp 4-component vector of float)
+0:8            m: direct index for structure ( temp 2-element array of 4-component vector of float)
+0:8              'flattenTemp' ( temp structure{ temp 2-element array of 4-component vector of float m,  temp 4-component vector of float coord,  temp 4-component vector of float b})
+0:8              Constant:
+0:8                0 (const int)
 0:8            Constant:
 0:8              0 (const int)
-0:8          m: direct index for structure ( temp 2-element array of 4-component vector of float)
-0:8            'flattenTemp' ( temp structure{ temp 2-element array of 4-component vector of float m,  temp 2-component vector of uint coord,  temp 4-component vector of float b})
-0:8            Constant:
-0:8              0 (const int)
-0:8        move second child to first child ( temp 2-component vector of uint)
-0:8          coord: direct index for structure ( temp 2-component vector of uint)
-0:8            '@entryPointOutput' ( out structure Position{ temp 2-element array of 4-component vector of float m,  temp 2-component vector of uint coord,  temp 4-component vector of float b})
-0:8            Constant:
-0:8              1 (const int)
-0:8          coord: direct index for structure ( temp 2-component vector of uint)
-0:8            'flattenTemp' ( temp structure{ temp 2-element array of 4-component vector of float m,  temp 2-component vector of uint coord,  temp 4-component vector of float b})
+0:8        move second child to first child ( temp 4-component vector of float)
+0:?           '@entryPointOutput.m[1]' (layout( location=1) out 4-component vector of float)
+0:8          direct index ( temp 4-component vector of float)
+0:8            m: direct index for structure ( temp 2-element array of 4-component vector of float)
+0:8              'flattenTemp' ( temp structure{ temp 2-element array of 4-component vector of float m,  temp 4-component vector of float coord,  temp 4-component vector of float b})
+0:8              Constant:
+0:8                0 (const int)
 0:8            Constant:
 0:8              1 (const int)
 0:8        move second child to first child ( temp 4-component vector of float)
-0:8          b: direct index for structure ( temp 4-component vector of float)
-0:8            '@entryPointOutput' ( out structure Position{ temp 2-element array of 4-component vector of float m,  temp 2-component vector of uint coord,  temp 4-component vector of float b})
+0:?           '@entryPointOutput.coord' ( out 4-component vector of float Position)
+0:8          coord: direct index for structure ( temp 4-component vector of float)
+0:8            'flattenTemp' ( temp structure{ temp 2-element array of 4-component vector of float m,  temp 4-component vector of float coord,  temp 4-component vector of float b})
 0:8            Constant:
-0:8              2 (const int)
+0:8              1 (const int)
+0:8        move second child to first child ( temp 4-component vector of float)
+0:?           '@entryPointOutput.b' (layout( location=2) smooth out 4-component vector of float)
 0:8          b: direct index for structure ( temp 4-component vector of float)
-0:8            'flattenTemp' ( temp structure{ temp 2-element array of 4-component vector of float m,  temp 2-component vector of uint coord,  temp 4-component vector of float b})
+0:8            'flattenTemp' ( temp structure{ temp 2-element array of 4-component vector of float m,  temp 4-component vector of float coord,  temp 4-component vector of float b})
 0:8            Constant:
 0:8              2 (const int)
 0:?   Linker Objects
-0:?     '@entryPointOutput' ( out structure Position{ temp 2-element array of 4-component vector of float m,  temp 2-component vector of uint coord,  temp 4-component vector of float b})
+0:?     '@entryPointOutput.coord' ( out 4-component vector of float Position)
+0:?     '@entryPointOutput.m[0]' (layout( location=0) out 4-component vector of float)
+0:?     '@entryPointOutput.m[1]' (layout( location=1) out 4-component vector of float)
+0:?     '@entryPointOutput.b' (layout( location=2) smooth out 4-component vector of float)
 0:?     'd' (layout( location=0) in 4-component vector of float)
-0:?     'm[0]' (layout( location=1) in 4-component vector of float)
-0:?     'm[1]' (layout( location=2) in 4-component vector of float)
-0:?     'm[0]' (layout( location=1) in 4-component vector of float)
-0:?     'm[1]' (layout( location=2) in 4-component vector of float)
-0:?     'coord' (layout( location=3) in 2-component vector of uint)
-0:?     'b' (layout( location=4) in 4-component vector of float)
+0:?     'vi.m[0]' (layout( location=1) in 4-component vector of float)
+0:?     'vi.m[1]' (layout( location=2) in 4-component vector of float)
+0:?     'vi.coord' (layout( location=3) in 4-component vector of float)
+0:?     'vi.b' (layout( location=4) in 4-component vector of float)
 0:?     'e' (layout( location=5) in 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80001
-// Id's are bound by 92
+// Generated by (magic number): 80007
+// Id's are bound by 94
 
                               Capability Shader
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Vertex 4  "main" 48 51 54 58 62 66 78
+                              EntryPoint Vertex 4  "main" 55 58 61 64 67 71 82 85 88 91
                               Source HLSL 500
                               Name 4  "main"
-                              Name 13  "VI"
-                              MemberName 13(VI) 0  "m"
-                              MemberName 13(VI) 1  "coord"
-                              MemberName 13(VI) 2  "b"
-                              Name 19  "@main(vf4;struct-VI-vf4[2]-vu2-vf41;vf4;"
-                              Name 16  "d"
-                              Name 17  "vi"
-                              Name 18  "e"
-                              Name 21  "local"
-                              Name 46  "d"
-                              Name 48  "d"
-                              Name 50  "vi"
-                              Name 51  "m[0]"
-                              Name 54  "m[1]"
-                              Name 58  "coord"
-                              Name 62  "b"
-                              Name 65  "e"
-                              Name 66  "e"
-                              Name 68  "flattenTemp"
-                              Name 69  "param"
-                              Name 71  "param"
-                              Name 73  "param"
-                              Name 76  "VI"
-                              MemberName 76(VI) 0  "m"
-                              MemberName 76(VI) 1  "coord"
-                              MemberName 76(VI) 2  "b"
-                              Name 78  "@entryPointOutput"
-                              Decorate 48(d) Location 0
-                              Decorate 51(m[0]) Location 1
-                              Decorate 54(m[1]) Location 2
-                              Decorate 58(coord) Location 3
-                              Decorate 62(b) Location 4
-                              Decorate 66(e) Location 5
-                              Decorate 78(@entryPointOutput) BuiltIn Position
+                              Name 12  "VI"
+                              MemberName 12(VI) 0  "m"
+                              MemberName 12(VI) 1  "coord"
+                              MemberName 12(VI) 2  "b"
+                              Name 18  "@main(vf4;struct-VI-vf4[2]-vf4-vf41;vf4;"
+                              Name 15  "d"
+                              Name 16  "vi"
+                              Name 17  "e"
+                              Name 20  "local"
+                              Name 53  "d"
+                              Name 55  "d"
+                              Name 57  "vi"
+                              Name 58  "vi.m[0]"
+                              Name 61  "vi.m[1]"
+                              Name 64  "vi.coord"
+                              Name 67  "vi.b"
+                              Name 70  "e"
+                              Name 71  "e"
+                              Name 73  "flattenTemp"
+                              Name 74  "param"
+                              Name 76  "param"
+                              Name 78  "param"
+                              Name 82  "@entryPointOutput.m[0]"
+                              Name 85  "@entryPointOutput.m[1]"
+                              Name 88  "@entryPointOutput.coord"
+                              Name 91  "@entryPointOutput.b"
+                              Decorate 55(d) Location 0
+                              Decorate 58(vi.m[0]) Location 1
+                              Decorate 61(vi.m[1]) Location 2
+                              Decorate 64(vi.coord) Location 3
+                              Decorate 67(vi.b) Location 4
+                              Decorate 71(e) Location 5
+                              Decorate 82(@entryPointOutput.m[0]) Location 0
+                              Decorate 85(@entryPointOutput.m[1]) Location 1
+                              Decorate 88(@entryPointOutput.coord) BuiltIn Position
+                              Decorate 91(@entryPointOutput.b) Location 2
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -313,101 +393,107 @@
                9:             TypeInt 32 0
               10:      9(int) Constant 2
               11:             TypeArray 7(fvec4) 10
-              12:             TypeVector 9(int) 2
-          13(VI):             TypeStruct 11 12(ivec2) 7(fvec4)
-              14:             TypePointer Function 13(VI)
-              15:             TypeFunction 13(VI) 8(ptr) 14(ptr) 8(ptr)
-              22:             TypeInt 32 1
-              23:     22(int) Constant 2
-              24:     22(int) Constant 0
-              25:     22(int) Constant 1
-              31:      9(int) Constant 0
-              32:             TypePointer Function 9(int)
-              47:             TypePointer Input 7(fvec4)
-           48(d):     47(ptr) Variable Input
-        51(m[0]):     47(ptr) Variable Input
-        54(m[1]):     47(ptr) Variable Input
-              57:             TypePointer Input 12(ivec2)
-       58(coord):     57(ptr) Variable Input
-              60:             TypePointer Function 12(ivec2)
-           62(b):     47(ptr) Variable Input
-           66(e):     47(ptr) Variable Input
-          76(VI):             TypeStruct 11 12(ivec2) 7(fvec4)
-              77:             TypePointer Output 76(VI)
-78(@entryPointOutput):     77(ptr) Variable Output
-              79:             TypePointer Function 11
-              82:             TypePointer Output 11
-              86:             TypePointer Output 12(ivec2)
-              90:             TypePointer Output 7(fvec4)
+          12(VI):             TypeStruct 11 7(fvec4) 7(fvec4)
+              13:             TypePointer Function 12(VI)
+              14:             TypeFunction 12(VI) 8(ptr) 13(ptr) 8(ptr)
+              21:             TypeInt 32 1
+              22:     21(int) Constant 2
+              23:     21(int) Constant 0
+              24:     21(int) Constant 1
+              30:      9(int) Constant 0
+              31:             TypePointer Function 6(float)
+              41:    6(float) Constant 1065353216
+              42:    7(fvec4) ConstantComposite 41 41 41 41
+              44:    6(float) Constant 1073741824
+              45:    7(fvec4) ConstantComposite 44 44 44 44
+              47:    6(float) Constant 1077936128
+              48:    7(fvec4) ConstantComposite 47 47 47 47
+              54:             TypePointer Input 7(fvec4)
+           55(d):     54(ptr) Variable Input
+     58(vi.m[0]):     54(ptr) Variable Input
+     61(vi.m[1]):     54(ptr) Variable Input
+    64(vi.coord):     54(ptr) Variable Input
+        67(vi.b):     54(ptr) Variable Input
+           71(e):     54(ptr) Variable Input
+              81:             TypePointer Output 7(fvec4)
+82(@entryPointOutput.m[0]):     81(ptr) Variable Output
+85(@entryPointOutput.m[1]):     81(ptr) Variable Output
+88(@entryPointOutput.coord):     81(ptr) Variable Output
+91(@entryPointOutput.b):     81(ptr) Variable Output
          4(main):           2 Function None 3
                5:             Label
-           46(d):      8(ptr) Variable Function
-          50(vi):     14(ptr) Variable Function
-           65(e):      8(ptr) Variable Function
- 68(flattenTemp):     14(ptr) Variable Function
-       69(param):      8(ptr) Variable Function
-       71(param):     14(ptr) Variable Function
-       73(param):      8(ptr) Variable Function
-              49:    7(fvec4) Load 48(d)
-                              Store 46(d) 49
-              52:    7(fvec4) Load 51(m[0])
-              53:      8(ptr) AccessChain 50(vi) 24 24
-                              Store 53 52
-              55:    7(fvec4) Load 54(m[1])
-              56:      8(ptr) AccessChain 50(vi) 24 25
-                              Store 56 55
-              59:   12(ivec2) Load 58(coord)
-              61:     60(ptr) AccessChain 50(vi) 25
-                              Store 61 59
-              63:    7(fvec4) Load 62(b)
-              64:      8(ptr) AccessChain 50(vi) 23
-                              Store 64 63
-              67:    7(fvec4) Load 66(e)
-                              Store 65(e) 67
-              70:    7(fvec4) Load 46(d)
-                              Store 69(param) 70
-              72:      13(VI) Load 50(vi)
-                              Store 71(param) 72
-              74:    7(fvec4) Load 65(e)
-                              Store 73(param) 74
-              75:      13(VI) FunctionCall 19(@main(vf4;struct-VI-vf4[2]-vu2-vf41;vf4;) 69(param) 71(param) 73(param)
-                              Store 68(flattenTemp) 75
-              80:     79(ptr) AccessChain 68(flattenTemp) 24
-              81:          11 Load 80
-              83:     82(ptr) AccessChain 78(@entryPointOutput) 24
-                              Store 83 81
-              84:     60(ptr) AccessChain 68(flattenTemp) 25
-              85:   12(ivec2) Load 84
-              87:     86(ptr) AccessChain 78(@entryPointOutput) 25
-                              Store 87 85
-              88:      8(ptr) AccessChain 68(flattenTemp) 23
-              89:    7(fvec4) Load 88
-              91:     90(ptr) AccessChain 78(@entryPointOutput) 23
-                              Store 91 89
+           53(d):      8(ptr) Variable Function
+          57(vi):     13(ptr) Variable Function
+           70(e):      8(ptr) Variable Function
+ 73(flattenTemp):     13(ptr) Variable Function
+       74(param):      8(ptr) Variable Function
+       76(param):     13(ptr) Variable Function
+       78(param):      8(ptr) Variable Function
+              56:    7(fvec4) Load 55(d)
+                              Store 53(d) 56
+              59:    7(fvec4) Load 58(vi.m[0])
+              60:      8(ptr) AccessChain 57(vi) 23 23
+                              Store 60 59
+              62:    7(fvec4) Load 61(vi.m[1])
+              63:      8(ptr) AccessChain 57(vi) 23 24
+                              Store 63 62
+              65:    7(fvec4) Load 64(vi.coord)
+              66:      8(ptr) AccessChain 57(vi) 24
+                              Store 66 65
+              68:    7(fvec4) Load 67(vi.b)
+              69:      8(ptr) AccessChain 57(vi) 22
+                              Store 69 68
+              72:    7(fvec4) Load 71(e)
+                              Store 70(e) 72
+              75:    7(fvec4) Load 53(d)
+                              Store 74(param) 75
+              77:      12(VI) Load 57(vi)
+                              Store 76(param) 77
+              79:    7(fvec4) Load 70(e)
+                              Store 78(param) 79
+              80:      12(VI) FunctionCall 18(@main(vf4;struct-VI-vf4[2]-vf4-vf41;vf4;) 74(param) 76(param) 78(param)
+                              Store 73(flattenTemp) 80
+              83:      8(ptr) AccessChain 73(flattenTemp) 23 23
+              84:    7(fvec4) Load 83
+                              Store 82(@entryPointOutput.m[0]) 84
+              86:      8(ptr) AccessChain 73(flattenTemp) 23 24
+              87:    7(fvec4) Load 86
+                              Store 85(@entryPointOutput.m[1]) 87
+              89:      8(ptr) AccessChain 73(flattenTemp) 24
+              90:    7(fvec4) Load 89
+                              Store 88(@entryPointOutput.coord) 90
+              92:      8(ptr) AccessChain 73(flattenTemp) 22
+              93:    7(fvec4) Load 92
+                              Store 91(@entryPointOutput.b) 93
                               Return
                               FunctionEnd
-19(@main(vf4;struct-VI-vf4[2]-vu2-vf41;vf4;):      13(VI) Function None 15
-           16(d):      8(ptr) FunctionParameter
-          17(vi):     14(ptr) FunctionParameter
-           18(e):      8(ptr) FunctionParameter
-              20:             Label
-       21(local):     14(ptr) Variable Function
-              26:      8(ptr) AccessChain 17(vi) 24 25
-              27:    7(fvec4) Load 26
-              28:      8(ptr) AccessChain 17(vi) 24 24
-              29:    7(fvec4) Load 28
-              30:    7(fvec4) FAdd 27 29
-              33:     32(ptr) AccessChain 17(vi) 25 31
-              34:      9(int) Load 33
-              35:    6(float) ConvertUToF 34
-              36:    7(fvec4) CompositeConstruct 35 35 35 35
-              37:    7(fvec4) FAdd 30 36
-              38:    7(fvec4) Load 16(d)
+18(@main(vf4;struct-VI-vf4[2]-vf4-vf41;vf4;):      12(VI) Function None 14
+           15(d):      8(ptr) FunctionParameter
+          16(vi):     13(ptr) FunctionParameter
+           17(e):      8(ptr) FunctionParameter
+              19:             Label
+       20(local):     13(ptr) Variable Function
+              25:      8(ptr) AccessChain 16(vi) 23 24
+              26:    7(fvec4) Load 25
+              27:      8(ptr) AccessChain 16(vi) 23 23
+              28:    7(fvec4) Load 27
+              29:    7(fvec4) FAdd 26 28
+              32:     31(ptr) AccessChain 16(vi) 24 30
+              33:    6(float) Load 32
+              34:    7(fvec4) CompositeConstruct 33 33 33 33
+              35:    7(fvec4) FAdd 29 34
+              36:    7(fvec4) Load 15(d)
+              37:    7(fvec4) FAdd 35 36
+              38:    7(fvec4) Load 17(e)
               39:    7(fvec4) FAdd 37 38
-              40:    7(fvec4) Load 18(e)
-              41:    7(fvec4) FAdd 39 40
-              42:      8(ptr) AccessChain 21(local) 23
-                              Store 42 41
-              43:      13(VI) Load 21(local)
-                              ReturnValue 43
+              40:      8(ptr) AccessChain 20(local) 22
+                              Store 40 39
+              43:      8(ptr) AccessChain 20(local) 24
+                              Store 43 42
+              46:      8(ptr) AccessChain 20(local) 23 23
+                              Store 46 45
+              49:      8(ptr) AccessChain 20(local) 23 24
+                              Store 49 48
+              50:      12(VI) Load 20(local)
+                              ReturnValue 50
                               FunctionEnd
diff --git a/Test/baseResults/hlsl.subpass.frag.out b/Test/baseResults/hlsl.subpass.frag.out
new file mode 100644
index 0000000..99aeb96
--- /dev/null
+++ b/Test/baseResults/hlsl.subpass.frag.out
@@ -0,0 +1,777 @@
+hlsl.subpass.frag
+Shader version: 500
+gl_FragCoord origin is upper left
+0:? Sequence
+0:68  Function Definition: @main( ( temp 4-component vector of float)
+0:68    Function Parameters: 
+0:?     Sequence
+0:69      Sequence
+0:69        move second child to first child ( temp 4-component vector of float)
+0:69          'result00' ( temp 4-component vector of float)
+0:69          subpassLoad ( temp 4-component vector of float)
+0:69            'subpass_f4' (layout( binding=1 input_attachment_index=1) uniform subpassInput)
+0:70      Sequence
+0:70        move second child to first child ( temp 4-component vector of int)
+0:70          'result01' ( temp 4-component vector of int)
+0:70          subpassLoad ( temp 4-component vector of int)
+0:70            'subpass_i4' ( uniform isubpassInput)
+0:71      Sequence
+0:71        move second child to first child ( temp 4-component vector of uint)
+0:71          'result02' ( temp 4-component vector of uint)
+0:71          subpassLoad ( temp 4-component vector of uint)
+0:71            'subpass_u4' ( uniform usubpassInput)
+0:73      Sequence
+0:73        move second child to first child ( temp 4-component vector of float)
+0:73          'result10' ( temp 4-component vector of float)
+0:73          subpassLoadMS ( temp 4-component vector of float)
+0:73            'subpass_ms_f4' ( uniform subpassInputMS)
+0:73            Constant:
+0:73              3 (const int)
+0:74      Sequence
+0:74        move second child to first child ( temp 4-component vector of int)
+0:74          'result11' ( temp 4-component vector of int)
+0:74          subpassLoadMS ( temp 4-component vector of int)
+0:74            'subpass_ms_i4' ( uniform isubpassInputMS)
+0:74            Constant:
+0:74              3 (const int)
+0:75      Sequence
+0:75        move second child to first child ( temp 4-component vector of uint)
+0:75          'result12' ( temp 4-component vector of uint)
+0:75          subpassLoadMS ( temp 4-component vector of uint)
+0:75            'subpass_ms_u4' ( uniform usubpassInputMS)
+0:75            Constant:
+0:75              3 (const int)
+0:77      Sequence
+0:77        move second child to first child ( temp 3-component vector of float)
+0:77          'result20' ( temp 3-component vector of float)
+0:77          Construct vec3 ( temp 3-component vector of float)
+0:77            subpassLoad ( temp 4-component vector of float)
+0:77              'subpass_f3' ( uniform subpassInput)
+0:78      Sequence
+0:78        move second child to first child ( temp 3-component vector of int)
+0:78          'result21' ( temp 3-component vector of int)
+0:78          Construct ivec3 ( temp 3-component vector of int)
+0:78            subpassLoad ( temp 4-component vector of int)
+0:78              'subpass_i3' ( uniform isubpassInput)
+0:79      Sequence
+0:79        move second child to first child ( temp 3-component vector of uint)
+0:79          'result22' ( temp 3-component vector of uint)
+0:79          Construct uvec3 ( temp 3-component vector of uint)
+0:79            subpassLoad ( temp 4-component vector of uint)
+0:79              'subpass_u3' ( uniform usubpassInput)
+0:81      Sequence
+0:81        move second child to first child ( temp 3-component vector of float)
+0:81          'result30' ( temp 3-component vector of float)
+0:81          Construct vec3 ( temp 3-component vector of float)
+0:81            subpassLoadMS ( temp 4-component vector of float)
+0:81              'subpass_ms_f3' ( uniform subpassInputMS)
+0:81              Constant:
+0:81                3 (const int)
+0:82      Sequence
+0:82        move second child to first child ( temp 3-component vector of int)
+0:82          'result31' ( temp 3-component vector of int)
+0:82          Construct ivec3 ( temp 3-component vector of int)
+0:82            subpassLoadMS ( temp 4-component vector of int)
+0:82              'subpass_ms_i3' ( uniform isubpassInputMS)
+0:82              Constant:
+0:82                3 (const int)
+0:83      Sequence
+0:83        move second child to first child ( temp 3-component vector of uint)
+0:83          'result32' ( temp 3-component vector of uint)
+0:83          Construct uvec3 ( temp 3-component vector of uint)
+0:83            subpassLoadMS ( temp 4-component vector of uint)
+0:83              'subpass_ms_u3' ( uniform usubpassInputMS)
+0:83              Constant:
+0:83                3 (const int)
+0:85      Sequence
+0:85        move second child to first child ( temp 2-component vector of float)
+0:85          'result40' ( temp 2-component vector of float)
+0:85          Construct vec2 ( temp 2-component vector of float)
+0:85            subpassLoad ( temp 4-component vector of float)
+0:85              'subpass_f2' ( uniform subpassInput)
+0:86      Sequence
+0:86        move second child to first child ( temp 2-component vector of int)
+0:86          'result41' ( temp 2-component vector of int)
+0:86          Construct ivec2 ( temp 2-component vector of int)
+0:86            subpassLoad ( temp 4-component vector of int)
+0:86              'subpass_i2' ( uniform isubpassInput)
+0:87      Sequence
+0:87        move second child to first child ( temp 2-component vector of uint)
+0:87          'result42' ( temp 2-component vector of uint)
+0:87          Construct uvec2 ( temp 2-component vector of uint)
+0:87            subpassLoad ( temp 4-component vector of uint)
+0:87              'subpass_u2' ( uniform usubpassInput)
+0:89      Sequence
+0:89        move second child to first child ( temp 2-component vector of float)
+0:89          'result50' ( temp 2-component vector of float)
+0:89          Construct vec2 ( temp 2-component vector of float)
+0:89            subpassLoadMS ( temp 4-component vector of float)
+0:89              'subpass_ms_f2' ( uniform subpassInputMS)
+0:89              Constant:
+0:89                2 (const int)
+0:90      Sequence
+0:90        move second child to first child ( temp 2-component vector of int)
+0:90          'result51' ( temp 2-component vector of int)
+0:90          Construct ivec2 ( temp 2-component vector of int)
+0:90            subpassLoadMS ( temp 4-component vector of int)
+0:90              'subpass_ms_i2' ( uniform isubpassInputMS)
+0:90              Constant:
+0:90                2 (const int)
+0:91      Sequence
+0:91        move second child to first child ( temp 2-component vector of uint)
+0:91          'result52' ( temp 2-component vector of uint)
+0:91          Construct uvec2 ( temp 2-component vector of uint)
+0:91            subpassLoadMS ( temp 4-component vector of uint)
+0:91              'subpass_ms_u2' ( uniform usubpassInputMS)
+0:91              Constant:
+0:91                2 (const int)
+0:93      Sequence
+0:93        move second child to first child ( temp float)
+0:93          'result60' ( temp float)
+0:93          Construct float ( temp float)
+0:93            subpassLoad ( temp 4-component vector of float)
+0:93              'subpass_f' ( uniform subpassInput)
+0:94      Sequence
+0:94        move second child to first child ( temp int)
+0:94          'result61' ( temp int)
+0:94          Construct int ( temp int)
+0:94            subpassLoad ( temp 4-component vector of int)
+0:94              'subpass_i' ( uniform isubpassInput)
+0:95      Sequence
+0:95        move second child to first child ( temp uint)
+0:95          'result62' ( temp uint)
+0:95          Construct uint ( temp uint)
+0:95            subpassLoad ( temp 4-component vector of uint)
+0:95              'subpass_u' ( uniform usubpassInput)
+0:97      Sequence
+0:97        move second child to first child ( temp float)
+0:97          'result70' ( temp float)
+0:97          Construct float ( temp float)
+0:97            subpassLoadMS ( temp 4-component vector of float)
+0:97              'subpass_ms_f' ( uniform subpassInputMS)
+0:97              Constant:
+0:97                2 (const int)
+0:98      Sequence
+0:98        move second child to first child ( temp int)
+0:98          'result71' ( temp int)
+0:98          Construct int ( temp int)
+0:98            subpassLoadMS ( temp 4-component vector of int)
+0:98              'subpass_ms_i' ( uniform isubpassInputMS)
+0:98              Constant:
+0:98                2 (const int)
+0:99      Sequence
+0:99        move second child to first child ( temp uint)
+0:99          'result72' ( temp uint)
+0:99          Construct uint ( temp uint)
+0:99            subpassLoadMS ( temp 4-component vector of uint)
+0:99              'subpass_ms_u' ( uniform usubpassInputMS)
+0:99              Constant:
+0:99                2 (const int)
+0:101      Sequence
+0:101        move second child to first child ( temp 4-component vector of float)
+0:101          'result73' ( temp 4-component vector of float)
+0:101          subpassLoad ( temp 4-component vector of float)
+0:101            'subpass_2' ( uniform subpassInput)
+0:112      Branch: Return with expression
+0:112        Constant:
+0:112          0.000000
+0:112          0.000000
+0:112          0.000000
+0:112          0.000000
+0:68  Function Definition: main( ( temp void)
+0:68    Function Parameters: 
+0:?     Sequence
+0:68      move second child to first child ( temp 4-component vector of float)
+0:?         '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+0:68        Function Call: @main( ( temp 4-component vector of float)
+0:?   Linker Objects
+0:?     'subpass_f4' (layout( binding=1 input_attachment_index=1) uniform subpassInput)
+0:?     'subpass_i4' ( uniform isubpassInput)
+0:?     'subpass_u4' ( uniform usubpassInput)
+0:?     'subpass_ms_f4' ( uniform subpassInputMS)
+0:?     'subpass_ms_i4' ( uniform isubpassInputMS)
+0:?     'subpass_ms_u4' ( uniform usubpassInputMS)
+0:?     'subpass_f3' ( uniform subpassInput)
+0:?     'subpass_i3' ( uniform isubpassInput)
+0:?     'subpass_u3' ( uniform usubpassInput)
+0:?     'subpass_ms_f3' ( uniform subpassInputMS)
+0:?     'subpass_ms_i3' ( uniform isubpassInputMS)
+0:?     'subpass_ms_u3' ( uniform usubpassInputMS)
+0:?     'subpass_f2' ( uniform subpassInput)
+0:?     'subpass_i2' ( uniform isubpassInput)
+0:?     'subpass_u2' ( uniform usubpassInput)
+0:?     'subpass_ms_f2' ( uniform subpassInputMS)
+0:?     'subpass_ms_i2' ( uniform isubpassInputMS)
+0:?     'subpass_ms_u2' ( uniform usubpassInputMS)
+0:?     'subpass_f' ( uniform subpassInput)
+0:?     'subpass_i' ( uniform isubpassInput)
+0:?     'subpass_u' ( uniform usubpassInput)
+0:?     'subpass_ms_f' ( uniform subpassInputMS)
+0:?     'subpass_ms_i' ( uniform isubpassInputMS)
+0:?     'subpass_ms_u' ( uniform usubpassInputMS)
+0:?     'subpass_2' ( uniform subpassInput)
+0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+
+
+Linked fragment stage:
+
+
+Shader version: 500
+gl_FragCoord origin is upper left
+0:? Sequence
+0:68  Function Definition: @main( ( temp 4-component vector of float)
+0:68    Function Parameters: 
+0:?     Sequence
+0:69      Sequence
+0:69        move second child to first child ( temp 4-component vector of float)
+0:69          'result00' ( temp 4-component vector of float)
+0:69          subpassLoad ( temp 4-component vector of float)
+0:69            'subpass_f4' (layout( binding=1 input_attachment_index=1) uniform subpassInput)
+0:70      Sequence
+0:70        move second child to first child ( temp 4-component vector of int)
+0:70          'result01' ( temp 4-component vector of int)
+0:70          subpassLoad ( temp 4-component vector of int)
+0:70            'subpass_i4' ( uniform isubpassInput)
+0:71      Sequence
+0:71        move second child to first child ( temp 4-component vector of uint)
+0:71          'result02' ( temp 4-component vector of uint)
+0:71          subpassLoad ( temp 4-component vector of uint)
+0:71            'subpass_u4' ( uniform usubpassInput)
+0:73      Sequence
+0:73        move second child to first child ( temp 4-component vector of float)
+0:73          'result10' ( temp 4-component vector of float)
+0:73          subpassLoadMS ( temp 4-component vector of float)
+0:73            'subpass_ms_f4' ( uniform subpassInputMS)
+0:73            Constant:
+0:73              3 (const int)
+0:74      Sequence
+0:74        move second child to first child ( temp 4-component vector of int)
+0:74          'result11' ( temp 4-component vector of int)
+0:74          subpassLoadMS ( temp 4-component vector of int)
+0:74            'subpass_ms_i4' ( uniform isubpassInputMS)
+0:74            Constant:
+0:74              3 (const int)
+0:75      Sequence
+0:75        move second child to first child ( temp 4-component vector of uint)
+0:75          'result12' ( temp 4-component vector of uint)
+0:75          subpassLoadMS ( temp 4-component vector of uint)
+0:75            'subpass_ms_u4' ( uniform usubpassInputMS)
+0:75            Constant:
+0:75              3 (const int)
+0:77      Sequence
+0:77        move second child to first child ( temp 3-component vector of float)
+0:77          'result20' ( temp 3-component vector of float)
+0:77          Construct vec3 ( temp 3-component vector of float)
+0:77            subpassLoad ( temp 4-component vector of float)
+0:77              'subpass_f3' ( uniform subpassInput)
+0:78      Sequence
+0:78        move second child to first child ( temp 3-component vector of int)
+0:78          'result21' ( temp 3-component vector of int)
+0:78          Construct ivec3 ( temp 3-component vector of int)
+0:78            subpassLoad ( temp 4-component vector of int)
+0:78              'subpass_i3' ( uniform isubpassInput)
+0:79      Sequence
+0:79        move second child to first child ( temp 3-component vector of uint)
+0:79          'result22' ( temp 3-component vector of uint)
+0:79          Construct uvec3 ( temp 3-component vector of uint)
+0:79            subpassLoad ( temp 4-component vector of uint)
+0:79              'subpass_u3' ( uniform usubpassInput)
+0:81      Sequence
+0:81        move second child to first child ( temp 3-component vector of float)
+0:81          'result30' ( temp 3-component vector of float)
+0:81          Construct vec3 ( temp 3-component vector of float)
+0:81            subpassLoadMS ( temp 4-component vector of float)
+0:81              'subpass_ms_f3' ( uniform subpassInputMS)
+0:81              Constant:
+0:81                3 (const int)
+0:82      Sequence
+0:82        move second child to first child ( temp 3-component vector of int)
+0:82          'result31' ( temp 3-component vector of int)
+0:82          Construct ivec3 ( temp 3-component vector of int)
+0:82            subpassLoadMS ( temp 4-component vector of int)
+0:82              'subpass_ms_i3' ( uniform isubpassInputMS)
+0:82              Constant:
+0:82                3 (const int)
+0:83      Sequence
+0:83        move second child to first child ( temp 3-component vector of uint)
+0:83          'result32' ( temp 3-component vector of uint)
+0:83          Construct uvec3 ( temp 3-component vector of uint)
+0:83            subpassLoadMS ( temp 4-component vector of uint)
+0:83              'subpass_ms_u3' ( uniform usubpassInputMS)
+0:83              Constant:
+0:83                3 (const int)
+0:85      Sequence
+0:85        move second child to first child ( temp 2-component vector of float)
+0:85          'result40' ( temp 2-component vector of float)
+0:85          Construct vec2 ( temp 2-component vector of float)
+0:85            subpassLoad ( temp 4-component vector of float)
+0:85              'subpass_f2' ( uniform subpassInput)
+0:86      Sequence
+0:86        move second child to first child ( temp 2-component vector of int)
+0:86          'result41' ( temp 2-component vector of int)
+0:86          Construct ivec2 ( temp 2-component vector of int)
+0:86            subpassLoad ( temp 4-component vector of int)
+0:86              'subpass_i2' ( uniform isubpassInput)
+0:87      Sequence
+0:87        move second child to first child ( temp 2-component vector of uint)
+0:87          'result42' ( temp 2-component vector of uint)
+0:87          Construct uvec2 ( temp 2-component vector of uint)
+0:87            subpassLoad ( temp 4-component vector of uint)
+0:87              'subpass_u2' ( uniform usubpassInput)
+0:89      Sequence
+0:89        move second child to first child ( temp 2-component vector of float)
+0:89          'result50' ( temp 2-component vector of float)
+0:89          Construct vec2 ( temp 2-component vector of float)
+0:89            subpassLoadMS ( temp 4-component vector of float)
+0:89              'subpass_ms_f2' ( uniform subpassInputMS)
+0:89              Constant:
+0:89                2 (const int)
+0:90      Sequence
+0:90        move second child to first child ( temp 2-component vector of int)
+0:90          'result51' ( temp 2-component vector of int)
+0:90          Construct ivec2 ( temp 2-component vector of int)
+0:90            subpassLoadMS ( temp 4-component vector of int)
+0:90              'subpass_ms_i2' ( uniform isubpassInputMS)
+0:90              Constant:
+0:90                2 (const int)
+0:91      Sequence
+0:91        move second child to first child ( temp 2-component vector of uint)
+0:91          'result52' ( temp 2-component vector of uint)
+0:91          Construct uvec2 ( temp 2-component vector of uint)
+0:91            subpassLoadMS ( temp 4-component vector of uint)
+0:91              'subpass_ms_u2' ( uniform usubpassInputMS)
+0:91              Constant:
+0:91                2 (const int)
+0:93      Sequence
+0:93        move second child to first child ( temp float)
+0:93          'result60' ( temp float)
+0:93          Construct float ( temp float)
+0:93            subpassLoad ( temp 4-component vector of float)
+0:93              'subpass_f' ( uniform subpassInput)
+0:94      Sequence
+0:94        move second child to first child ( temp int)
+0:94          'result61' ( temp int)
+0:94          Construct int ( temp int)
+0:94            subpassLoad ( temp 4-component vector of int)
+0:94              'subpass_i' ( uniform isubpassInput)
+0:95      Sequence
+0:95        move second child to first child ( temp uint)
+0:95          'result62' ( temp uint)
+0:95          Construct uint ( temp uint)
+0:95            subpassLoad ( temp 4-component vector of uint)
+0:95              'subpass_u' ( uniform usubpassInput)
+0:97      Sequence
+0:97        move second child to first child ( temp float)
+0:97          'result70' ( temp float)
+0:97          Construct float ( temp float)
+0:97            subpassLoadMS ( temp 4-component vector of float)
+0:97              'subpass_ms_f' ( uniform subpassInputMS)
+0:97              Constant:
+0:97                2 (const int)
+0:98      Sequence
+0:98        move second child to first child ( temp int)
+0:98          'result71' ( temp int)
+0:98          Construct int ( temp int)
+0:98            subpassLoadMS ( temp 4-component vector of int)
+0:98              'subpass_ms_i' ( uniform isubpassInputMS)
+0:98              Constant:
+0:98                2 (const int)
+0:99      Sequence
+0:99        move second child to first child ( temp uint)
+0:99          'result72' ( temp uint)
+0:99          Construct uint ( temp uint)
+0:99            subpassLoadMS ( temp 4-component vector of uint)
+0:99              'subpass_ms_u' ( uniform usubpassInputMS)
+0:99              Constant:
+0:99                2 (const int)
+0:101      Sequence
+0:101        move second child to first child ( temp 4-component vector of float)
+0:101          'result73' ( temp 4-component vector of float)
+0:101          subpassLoad ( temp 4-component vector of float)
+0:101            'subpass_2' ( uniform subpassInput)
+0:112      Branch: Return with expression
+0:112        Constant:
+0:112          0.000000
+0:112          0.000000
+0:112          0.000000
+0:112          0.000000
+0:68  Function Definition: main( ( temp void)
+0:68    Function Parameters: 
+0:?     Sequence
+0:68      move second child to first child ( temp 4-component vector of float)
+0:?         '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+0:68        Function Call: @main( ( temp 4-component vector of float)
+0:?   Linker Objects
+0:?     'subpass_f4' (layout( binding=1 input_attachment_index=1) uniform subpassInput)
+0:?     'subpass_i4' ( uniform isubpassInput)
+0:?     'subpass_u4' ( uniform usubpassInput)
+0:?     'subpass_ms_f4' ( uniform subpassInputMS)
+0:?     'subpass_ms_i4' ( uniform isubpassInputMS)
+0:?     'subpass_ms_u4' ( uniform usubpassInputMS)
+0:?     'subpass_f3' ( uniform subpassInput)
+0:?     'subpass_i3' ( uniform isubpassInput)
+0:?     'subpass_u3' ( uniform usubpassInput)
+0:?     'subpass_ms_f3' ( uniform subpassInputMS)
+0:?     'subpass_ms_i3' ( uniform isubpassInputMS)
+0:?     'subpass_ms_u3' ( uniform usubpassInputMS)
+0:?     'subpass_f2' ( uniform subpassInput)
+0:?     'subpass_i2' ( uniform isubpassInput)
+0:?     'subpass_u2' ( uniform usubpassInput)
+0:?     'subpass_ms_f2' ( uniform subpassInputMS)
+0:?     'subpass_ms_i2' ( uniform isubpassInputMS)
+0:?     'subpass_ms_u2' ( uniform usubpassInputMS)
+0:?     'subpass_f' ( uniform subpassInput)
+0:?     'subpass_i' ( uniform isubpassInput)
+0:?     'subpass_u' ( uniform usubpassInput)
+0:?     'subpass_ms_f' ( uniform subpassInputMS)
+0:?     'subpass_ms_i' ( uniform isubpassInputMS)
+0:?     'subpass_ms_u' ( uniform usubpassInputMS)
+0:?     'subpass_2' ( uniform subpassInput)
+0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 204
+
+                              Capability Shader
+                              Capability InputAttachment
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 202
+                              ExecutionMode 4 OriginUpperLeft
+                              Source HLSL 500
+                              Name 4  "main"
+                              Name 9  "@main("
+                              Name 12  "result00"
+                              Name 15  "subpass_f4"
+                              Name 24  "result01"
+                              Name 27  "subpass_i4"
+                              Name 33  "result02"
+                              Name 36  "subpass_u4"
+                              Name 39  "result10"
+                              Name 42  "subpass_ms_f4"
+                              Name 46  "result11"
+                              Name 49  "subpass_ms_i4"
+                              Name 52  "result12"
+                              Name 55  "subpass_ms_u4"
+                              Name 60  "result20"
+                              Name 61  "subpass_f3"
+                              Name 70  "result21"
+                              Name 71  "subpass_i3"
+                              Name 80  "result22"
+                              Name 81  "subpass_u3"
+                              Name 88  "result30"
+                              Name 89  "subpass_ms_f3"
+                              Name 96  "result31"
+                              Name 97  "subpass_ms_i3"
+                              Name 104  "result32"
+                              Name 105  "subpass_ms_u3"
+                              Name 114  "result40"
+                              Name 115  "subpass_f2"
+                              Name 122  "result41"
+                              Name 123  "subpass_i2"
+                              Name 131  "result42"
+                              Name 132  "subpass_u2"
+                              Name 138  "result50"
+                              Name 139  "subpass_ms_f2"
+                              Name 146  "result51"
+                              Name 147  "subpass_ms_i2"
+                              Name 153  "result52"
+                              Name 154  "subpass_ms_u2"
+                              Name 161  "result60"
+                              Name 162  "subpass_f"
+                              Name 167  "result61"
+                              Name 168  "subpass_i"
+                              Name 173  "result62"
+                              Name 174  "subpass_u"
+                              Name 178  "result70"
+                              Name 179  "subpass_ms_f"
+                              Name 183  "result71"
+                              Name 184  "subpass_ms_i"
+                              Name 188  "result72"
+                              Name 189  "subpass_ms_u"
+                              Name 193  "result73"
+                              Name 194  "subpass_2"
+                              Name 202  "@entryPointOutput"
+                              Decorate 15(subpass_f4) DescriptorSet 0
+                              Decorate 15(subpass_f4) Binding 1
+                              Decorate 15(subpass_f4) InputAttachmentIndex 1
+                              Decorate 27(subpass_i4) DescriptorSet 0
+                              Decorate 27(subpass_i4) InputAttachmentIndex 2
+                              Decorate 36(subpass_u4) DescriptorSet 0
+                              Decorate 36(subpass_u4) InputAttachmentIndex 3
+                              Decorate 42(subpass_ms_f4) DescriptorSet 0
+                              Decorate 42(subpass_ms_f4) InputAttachmentIndex 4
+                              Decorate 49(subpass_ms_i4) DescriptorSet 0
+                              Decorate 49(subpass_ms_i4) InputAttachmentIndex 5
+                              Decorate 55(subpass_ms_u4) DescriptorSet 0
+                              Decorate 55(subpass_ms_u4) InputAttachmentIndex 6
+                              Decorate 61(subpass_f3) DescriptorSet 0
+                              Decorate 61(subpass_f3) InputAttachmentIndex 1
+                              Decorate 71(subpass_i3) DescriptorSet 0
+                              Decorate 71(subpass_i3) InputAttachmentIndex 2
+                              Decorate 81(subpass_u3) DescriptorSet 0
+                              Decorate 81(subpass_u3) InputAttachmentIndex 3
+                              Decorate 89(subpass_ms_f3) DescriptorSet 0
+                              Decorate 89(subpass_ms_f3) InputAttachmentIndex 4
+                              Decorate 97(subpass_ms_i3) DescriptorSet 0
+                              Decorate 97(subpass_ms_i3) InputAttachmentIndex 5
+                              Decorate 105(subpass_ms_u3) DescriptorSet 0
+                              Decorate 105(subpass_ms_u3) InputAttachmentIndex 6
+                              Decorate 115(subpass_f2) DescriptorSet 0
+                              Decorate 115(subpass_f2) InputAttachmentIndex 1
+                              Decorate 123(subpass_i2) DescriptorSet 0
+                              Decorate 123(subpass_i2) InputAttachmentIndex 2
+                              Decorate 132(subpass_u2) DescriptorSet 0
+                              Decorate 132(subpass_u2) InputAttachmentIndex 3
+                              Decorate 139(subpass_ms_f2) DescriptorSet 0
+                              Decorate 139(subpass_ms_f2) InputAttachmentIndex 4
+                              Decorate 147(subpass_ms_i2) DescriptorSet 0
+                              Decorate 147(subpass_ms_i2) InputAttachmentIndex 5
+                              Decorate 154(subpass_ms_u2) DescriptorSet 0
+                              Decorate 154(subpass_ms_u2) InputAttachmentIndex 6
+                              Decorate 162(subpass_f) DescriptorSet 0
+                              Decorate 162(subpass_f) InputAttachmentIndex 1
+                              Decorate 168(subpass_i) DescriptorSet 0
+                              Decorate 168(subpass_i) InputAttachmentIndex 2
+                              Decorate 174(subpass_u) DescriptorSet 0
+                              Decorate 174(subpass_u) InputAttachmentIndex 3
+                              Decorate 179(subpass_ms_f) DescriptorSet 0
+                              Decorate 179(subpass_ms_f) InputAttachmentIndex 4
+                              Decorate 184(subpass_ms_i) DescriptorSet 0
+                              Decorate 184(subpass_ms_i) InputAttachmentIndex 5
+                              Decorate 189(subpass_ms_u) DescriptorSet 0
+                              Decorate 189(subpass_ms_u) InputAttachmentIndex 6
+                              Decorate 194(subpass_2) DescriptorSet 0
+                              Decorate 194(subpass_2) InputAttachmentIndex 7
+                              Decorate 202(@entryPointOutput) Location 0
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+               8:             TypeFunction 7(fvec4)
+              11:             TypePointer Function 7(fvec4)
+              13:             TypeImage 6(float) SubpassData nonsampled format:Unknown
+              14:             TypePointer UniformConstant 13
+  15(subpass_f4):     14(ptr) Variable UniformConstant
+              17:             TypeInt 32 1
+              18:     17(int) Constant 0
+              19:             TypeVector 17(int) 2
+              20:   19(ivec2) ConstantComposite 18 18
+              22:             TypeVector 17(int) 4
+              23:             TypePointer Function 22(ivec4)
+              25:             TypeImage 17(int) SubpassData nonsampled format:Unknown
+              26:             TypePointer UniformConstant 25
+  27(subpass_i4):     26(ptr) Variable UniformConstant
+              30:             TypeInt 32 0
+              31:             TypeVector 30(int) 4
+              32:             TypePointer Function 31(ivec4)
+              34:             TypeImage 30(int) SubpassData nonsampled format:Unknown
+              35:             TypePointer UniformConstant 34
+  36(subpass_u4):     35(ptr) Variable UniformConstant
+              40:             TypeImage 6(float) SubpassData multi-sampled nonsampled format:Unknown
+              41:             TypePointer UniformConstant 40
+42(subpass_ms_f4):     41(ptr) Variable UniformConstant
+              44:     17(int) Constant 3
+              47:             TypeImage 17(int) SubpassData multi-sampled nonsampled format:Unknown
+              48:             TypePointer UniformConstant 47
+49(subpass_ms_i4):     48(ptr) Variable UniformConstant
+              53:             TypeImage 30(int) SubpassData multi-sampled nonsampled format:Unknown
+              54:             TypePointer UniformConstant 53
+55(subpass_ms_u4):     54(ptr) Variable UniformConstant
+              58:             TypeVector 6(float) 3
+              59:             TypePointer Function 58(fvec3)
+  61(subpass_f3):     14(ptr) Variable UniformConstant
+              68:             TypeVector 17(int) 3
+              69:             TypePointer Function 68(ivec3)
+  71(subpass_i3):     26(ptr) Variable UniformConstant
+              78:             TypeVector 30(int) 3
+              79:             TypePointer Function 78(ivec3)
+  81(subpass_u3):     35(ptr) Variable UniformConstant
+89(subpass_ms_f3):     41(ptr) Variable UniformConstant
+97(subpass_ms_i3):     48(ptr) Variable UniformConstant
+105(subpass_ms_u3):     54(ptr) Variable UniformConstant
+             112:             TypeVector 6(float) 2
+             113:             TypePointer Function 112(fvec2)
+ 115(subpass_f2):     14(ptr) Variable UniformConstant
+             121:             TypePointer Function 19(ivec2)
+ 123(subpass_i2):     26(ptr) Variable UniformConstant
+             129:             TypeVector 30(int) 2
+             130:             TypePointer Function 129(ivec2)
+ 132(subpass_u2):     35(ptr) Variable UniformConstant
+139(subpass_ms_f2):     41(ptr) Variable UniformConstant
+             141:     17(int) Constant 2
+147(subpass_ms_i2):     48(ptr) Variable UniformConstant
+154(subpass_ms_u2):     54(ptr) Variable UniformConstant
+             160:             TypePointer Function 6(float)
+  162(subpass_f):     14(ptr) Variable UniformConstant
+             166:             TypePointer Function 17(int)
+  168(subpass_i):     26(ptr) Variable UniformConstant
+             172:             TypePointer Function 30(int)
+  174(subpass_u):     35(ptr) Variable UniformConstant
+179(subpass_ms_f):     41(ptr) Variable UniformConstant
+184(subpass_ms_i):     48(ptr) Variable UniformConstant
+189(subpass_ms_u):     54(ptr) Variable UniformConstant
+  194(subpass_2):     14(ptr) Variable UniformConstant
+             197:    6(float) Constant 0
+             198:    7(fvec4) ConstantComposite 197 197 197 197
+             201:             TypePointer Output 7(fvec4)
+202(@entryPointOutput):    201(ptr) Variable Output
+         4(main):           2 Function None 3
+               5:             Label
+             203:    7(fvec4) FunctionCall 9(@main()
+                              Store 202(@entryPointOutput) 203
+                              Return
+                              FunctionEnd
+       9(@main():    7(fvec4) Function None 8
+              10:             Label
+    12(result00):     11(ptr) Variable Function
+    24(result01):     23(ptr) Variable Function
+    33(result02):     32(ptr) Variable Function
+    39(result10):     11(ptr) Variable Function
+    46(result11):     23(ptr) Variable Function
+    52(result12):     32(ptr) Variable Function
+    60(result20):     59(ptr) Variable Function
+    70(result21):     69(ptr) Variable Function
+    80(result22):     79(ptr) Variable Function
+    88(result30):     59(ptr) Variable Function
+    96(result31):     69(ptr) Variable Function
+   104(result32):     79(ptr) Variable Function
+   114(result40):    113(ptr) Variable Function
+   122(result41):    121(ptr) Variable Function
+   131(result42):    130(ptr) Variable Function
+   138(result50):    113(ptr) Variable Function
+   146(result51):    121(ptr) Variable Function
+   153(result52):    130(ptr) Variable Function
+   161(result60):    160(ptr) Variable Function
+   167(result61):    166(ptr) Variable Function
+   173(result62):    172(ptr) Variable Function
+   178(result70):    160(ptr) Variable Function
+   183(result71):    166(ptr) Variable Function
+   188(result72):    172(ptr) Variable Function
+   193(result73):     11(ptr) Variable Function
+              16:          13 Load 15(subpass_f4)
+              21:    7(fvec4) ImageRead 16 20
+                              Store 12(result00) 21
+              28:          25 Load 27(subpass_i4)
+              29:   22(ivec4) ImageRead 28 20
+                              Store 24(result01) 29
+              37:          34 Load 36(subpass_u4)
+              38:   31(ivec4) ImageRead 37 20
+                              Store 33(result02) 38
+              43:          40 Load 42(subpass_ms_f4)
+              45:    7(fvec4) ImageRead 43 20 Sample 44
+                              Store 39(result10) 45
+              50:          47 Load 49(subpass_ms_i4)
+              51:   22(ivec4) ImageRead 50 20 Sample 44
+                              Store 46(result11) 51
+              56:          53 Load 55(subpass_ms_u4)
+              57:   31(ivec4) ImageRead 56 20 Sample 44
+                              Store 52(result12) 57
+              62:          13 Load 61(subpass_f3)
+              63:    7(fvec4) ImageRead 62 20
+              64:    6(float) CompositeExtract 63 0
+              65:    6(float) CompositeExtract 63 1
+              66:    6(float) CompositeExtract 63 2
+              67:   58(fvec3) CompositeConstruct 64 65 66
+                              Store 60(result20) 67
+              72:          25 Load 71(subpass_i3)
+              73:   22(ivec4) ImageRead 72 20
+              74:     17(int) CompositeExtract 73 0
+              75:     17(int) CompositeExtract 73 1
+              76:     17(int) CompositeExtract 73 2
+              77:   68(ivec3) CompositeConstruct 74 75 76
+                              Store 70(result21) 77
+              82:          34 Load 81(subpass_u3)
+              83:   31(ivec4) ImageRead 82 20
+              84:     30(int) CompositeExtract 83 0
+              85:     30(int) CompositeExtract 83 1
+              86:     30(int) CompositeExtract 83 2
+              87:   78(ivec3) CompositeConstruct 84 85 86
+                              Store 80(result22) 87
+              90:          40 Load 89(subpass_ms_f3)
+              91:    7(fvec4) ImageRead 90 20 Sample 44
+              92:    6(float) CompositeExtract 91 0
+              93:    6(float) CompositeExtract 91 1
+              94:    6(float) CompositeExtract 91 2
+              95:   58(fvec3) CompositeConstruct 92 93 94
+                              Store 88(result30) 95
+              98:          47 Load 97(subpass_ms_i3)
+              99:   22(ivec4) ImageRead 98 20 Sample 44
+             100:     17(int) CompositeExtract 99 0
+             101:     17(int) CompositeExtract 99 1
+             102:     17(int) CompositeExtract 99 2
+             103:   68(ivec3) CompositeConstruct 100 101 102
+                              Store 96(result31) 103
+             106:          53 Load 105(subpass_ms_u3)
+             107:   31(ivec4) ImageRead 106 20 Sample 44
+             108:     30(int) CompositeExtract 107 0
+             109:     30(int) CompositeExtract 107 1
+             110:     30(int) CompositeExtract 107 2
+             111:   78(ivec3) CompositeConstruct 108 109 110
+                              Store 104(result32) 111
+             116:          13 Load 115(subpass_f2)
+             117:    7(fvec4) ImageRead 116 20
+             118:    6(float) CompositeExtract 117 0
+             119:    6(float) CompositeExtract 117 1
+             120:  112(fvec2) CompositeConstruct 118 119
+                              Store 114(result40) 120
+             124:          25 Load 123(subpass_i2)
+             125:   22(ivec4) ImageRead 124 20
+             126:     17(int) CompositeExtract 125 0
+             127:     17(int) CompositeExtract 125 1
+             128:   19(ivec2) CompositeConstruct 126 127
+                              Store 122(result41) 128
+             133:          34 Load 132(subpass_u2)
+             134:   31(ivec4) ImageRead 133 20
+             135:     30(int) CompositeExtract 134 0
+             136:     30(int) CompositeExtract 134 1
+             137:  129(ivec2) CompositeConstruct 135 136
+                              Store 131(result42) 137
+             140:          40 Load 139(subpass_ms_f2)
+             142:    7(fvec4) ImageRead 140 20 Sample 141
+             143:    6(float) CompositeExtract 142 0
+             144:    6(float) CompositeExtract 142 1
+             145:  112(fvec2) CompositeConstruct 143 144
+                              Store 138(result50) 145
+             148:          47 Load 147(subpass_ms_i2)
+             149:   22(ivec4) ImageRead 148 20 Sample 141
+             150:     17(int) CompositeExtract 149 0
+             151:     17(int) CompositeExtract 149 1
+             152:   19(ivec2) CompositeConstruct 150 151
+                              Store 146(result51) 152
+             155:          53 Load 154(subpass_ms_u2)
+             156:   31(ivec4) ImageRead 155 20 Sample 141
+             157:     30(int) CompositeExtract 156 0
+             158:     30(int) CompositeExtract 156 1
+             159:  129(ivec2) CompositeConstruct 157 158
+                              Store 153(result52) 159
+             163:          13 Load 162(subpass_f)
+             164:    7(fvec4) ImageRead 163 20
+             165:    6(float) CompositeExtract 164 0
+                              Store 161(result60) 165
+             169:          25 Load 168(subpass_i)
+             170:   22(ivec4) ImageRead 169 20
+             171:     17(int) CompositeExtract 170 0
+                              Store 167(result61) 171
+             175:          34 Load 174(subpass_u)
+             176:   31(ivec4) ImageRead 175 20
+             177:     30(int) CompositeExtract 176 0
+                              Store 173(result62) 177
+             180:          40 Load 179(subpass_ms_f)
+             181:    7(fvec4) ImageRead 180 20 Sample 141
+             182:    6(float) CompositeExtract 181 0
+                              Store 178(result70) 182
+             185:          47 Load 184(subpass_ms_i)
+             186:   22(ivec4) ImageRead 185 20 Sample 141
+             187:     17(int) CompositeExtract 186 0
+                              Store 183(result71) 187
+             190:          53 Load 189(subpass_ms_u)
+             191:   31(ivec4) ImageRead 190 20 Sample 141
+             192:     30(int) CompositeExtract 191 0
+                              Store 188(result72) 192
+             195:          13 Load 194(subpass_2)
+             196:    7(fvec4) ImageRead 195 20
+                              Store 193(result73) 196
+                              ReturnValue 198
+                              FunctionEnd
diff --git a/Test/baseResults/hlsl.switch.frag.out b/Test/baseResults/hlsl.switch.frag.out
old mode 100755
new mode 100644
index c77da93..b72891e
--- a/Test/baseResults/hlsl.switch.frag.out
+++ b/Test/baseResults/hlsl.switch.frag.out
@@ -36,7 +36,7 @@
 0:17            Pre-Decrement ( temp 4-component vector of float)
 0:17              'input' ( in 4-component vector of float)
 0:18            Branch: Break
-0:21      switch
+0:21      switch: DontFlatten
 0:21      condition
 0:21        'c' ( in int)
 0:21      body
@@ -129,10 +129,10 @@
 0:?         'input' (layout( location=0) in 4-component vector of float)
 0:2      move second child to first child ( temp int)
 0:?         'c' ( temp int)
-0:?         'c' (layout( location=1) in int)
+0:?         'c' (layout( location=1) flat in int)
 0:2      move second child to first child ( temp int)
 0:?         'd' ( temp int)
-0:?         'd' (layout( location=2) in int)
+0:?         'd' (layout( location=2) flat in int)
 0:2      move second child to first child ( temp 4-component vector of float)
 0:?         '@entryPointOutput' (layout( location=0) out 4-component vector of float)
 0:2        Function Call: @PixelShaderFunction(vf4;i1;i1; ( temp 4-component vector of float)
@@ -142,8 +142,8 @@
 0:?   Linker Objects
 0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
 0:?     'input' (layout( location=0) in 4-component vector of float)
-0:?     'c' (layout( location=1) in int)
-0:?     'd' (layout( location=2) in int)
+0:?     'c' (layout( location=1) flat in int)
+0:?     'd' (layout( location=2) flat in int)
 
 
 Linked fragment stage:
@@ -186,7 +186,7 @@
 0:17            Pre-Decrement ( temp 4-component vector of float)
 0:17              'input' ( in 4-component vector of float)
 0:18            Branch: Break
-0:21      switch
+0:21      switch: DontFlatten
 0:21      condition
 0:21        'c' ( in int)
 0:21      body
@@ -279,10 +279,10 @@
 0:?         'input' (layout( location=0) in 4-component vector of float)
 0:2      move second child to first child ( temp int)
 0:?         'c' ( temp int)
-0:?         'c' (layout( location=1) in int)
+0:?         'c' (layout( location=1) flat in int)
 0:2      move second child to first child ( temp int)
 0:?         'd' ( temp int)
-0:?         'd' (layout( location=2) in int)
+0:?         'd' (layout( location=2) flat in int)
 0:2      move second child to first child ( temp 4-component vector of float)
 0:?         '@entryPointOutput' (layout( location=0) out 4-component vector of float)
 0:2        Function Call: @PixelShaderFunction(vf4;i1;i1; ( temp 4-component vector of float)
@@ -292,11 +292,11 @@
 0:?   Linker Objects
 0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
 0:?     'input' (layout( location=0) in 4-component vector of float)
-0:?     'c' (layout( location=1) in int)
-0:?     'd' (layout( location=2) in int)
+0:?     'c' (layout( location=1) flat in int)
+0:?     'd' (layout( location=2) flat in int)
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 106
 
                               Capability Shader
@@ -321,7 +321,9 @@
                               Name 101  "param"
                               Name 103  "param"
                               Decorate 88(input) Location 0
+                              Decorate 92(c) Flat
                               Decorate 92(c) Location 1
+                              Decorate 95(d) Flat
                               Decorate 95(d) Location 2
                               Decorate 98(@entryPointOutput) Location 0
                2:             TypeVoid
@@ -397,7 +399,7 @@
                                 Branch 25
               25:             Label
               36:      9(int) Load 13(c)
-                              SelectionMerge 40 None
+                              SelectionMerge 40 DontFlatten 
                               Switch 36 39 
                                      case 1: 37
                                      case 2: 38
diff --git a/Test/baseResults/hlsl.swizzle.frag.out b/Test/baseResults/hlsl.swizzle.frag.out
old mode 100755
new mode 100644
index 59b432b..c734d50
--- a/Test/baseResults/hlsl.swizzle.frag.out
+++ b/Test/baseResults/hlsl.swizzle.frag.out
@@ -77,7 +77,7 @@
 0:?     'AmbientColor' ( global 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 30
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.synthesizeInput.frag.out b/Test/baseResults/hlsl.synthesizeInput.frag.out
new file mode 100644
index 0000000..bbe9743
--- /dev/null
+++ b/Test/baseResults/hlsl.synthesizeInput.frag.out
@@ -0,0 +1,172 @@
+hlsl.synthesizeInput.frag
+Shader version: 500
+gl_FragCoord origin is upper left
+0:? Sequence
+0:7  Function Definition: @main(struct-PSInput-f1-u11; ( temp 4-component vector of float)
+0:7    Function Parameters: 
+0:7      'input' ( in structure{ temp float interp,  temp uint no_interp})
+0:?     Sequence
+0:8      Branch: Return with expression
+0:?         Construct vec4 ( temp 4-component vector of float)
+0:8          Convert uint to float ( temp float)
+0:8            no_interp: direct index for structure ( temp uint)
+0:8              'input' ( in structure{ temp float interp,  temp uint no_interp})
+0:8              Constant:
+0:8                1 (const int)
+0:8          interp: direct index for structure ( temp float)
+0:8            'input' ( in structure{ temp float interp,  temp uint no_interp})
+0:8            Constant:
+0:8              0 (const int)
+0:8          Constant:
+0:8            0.000000
+0:8          Constant:
+0:8            1.000000
+0:7  Function Definition: main( ( temp void)
+0:7    Function Parameters: 
+0:?     Sequence
+0:7      Sequence
+0:7        move second child to first child ( temp float)
+0:7          interp: direct index for structure ( temp float)
+0:?             'input' ( temp structure{ temp float interp,  temp uint no_interp})
+0:7            Constant:
+0:7              0 (const int)
+0:?           'input.interp' (layout( location=0) in float)
+0:7        move second child to first child ( temp uint)
+0:7          no_interp: direct index for structure ( temp uint)
+0:?             'input' ( temp structure{ temp float interp,  temp uint no_interp})
+0:7            Constant:
+0:7              1 (const int)
+0:?           'input.no_interp' (layout( location=1) flat in uint)
+0:7      move second child to first child ( temp 4-component vector of float)
+0:?         '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+0:7        Function Call: @main(struct-PSInput-f1-u11; ( temp 4-component vector of float)
+0:?           'input' ( temp structure{ temp float interp,  temp uint no_interp})
+0:?   Linker Objects
+0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+0:?     'input.interp' (layout( location=0) in float)
+0:?     'input.no_interp' (layout( location=1) flat in uint)
+
+
+Linked fragment stage:
+
+
+Shader version: 500
+gl_FragCoord origin is upper left
+0:? Sequence
+0:7  Function Definition: @main(struct-PSInput-f1-u11; ( temp 4-component vector of float)
+0:7    Function Parameters: 
+0:7      'input' ( in structure{ temp float interp,  temp uint no_interp})
+0:?     Sequence
+0:8      Branch: Return with expression
+0:?         Construct vec4 ( temp 4-component vector of float)
+0:8          Convert uint to float ( temp float)
+0:8            no_interp: direct index for structure ( temp uint)
+0:8              'input' ( in structure{ temp float interp,  temp uint no_interp})
+0:8              Constant:
+0:8                1 (const int)
+0:8          interp: direct index for structure ( temp float)
+0:8            'input' ( in structure{ temp float interp,  temp uint no_interp})
+0:8            Constant:
+0:8              0 (const int)
+0:8          Constant:
+0:8            0.000000
+0:8          Constant:
+0:8            1.000000
+0:7  Function Definition: main( ( temp void)
+0:7    Function Parameters: 
+0:?     Sequence
+0:7      Sequence
+0:7        move second child to first child ( temp float)
+0:7          interp: direct index for structure ( temp float)
+0:?             'input' ( temp structure{ temp float interp,  temp uint no_interp})
+0:7            Constant:
+0:7              0 (const int)
+0:?           'input.interp' (layout( location=0) in float)
+0:7        move second child to first child ( temp uint)
+0:7          no_interp: direct index for structure ( temp uint)
+0:?             'input' ( temp structure{ temp float interp,  temp uint no_interp})
+0:7            Constant:
+0:7              1 (const int)
+0:?           'input.no_interp' (layout( location=1) flat in uint)
+0:7      move second child to first child ( temp 4-component vector of float)
+0:?         '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+0:7        Function Call: @main(struct-PSInput-f1-u11; ( temp 4-component vector of float)
+0:?           'input' ( temp structure{ temp float interp,  temp uint no_interp})
+0:?   Linker Objects
+0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+0:?     'input.interp' (layout( location=0) in float)
+0:?     'input.no_interp' (layout( location=1) flat in uint)
+
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 44
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 32 36 40
+                              ExecutionMode 4 OriginUpperLeft
+                              Source HLSL 500
+                              Name 4  "main"
+                              Name 8  "PSInput"
+                              MemberName 8(PSInput) 0  "interp"
+                              MemberName 8(PSInput) 1  "no_interp"
+                              Name 13  "@main(struct-PSInput-f1-u11;"
+                              Name 12  "input"
+                              Name 30  "input"
+                              Name 32  "input.interp"
+                              Name 36  "input.no_interp"
+                              Name 40  "@entryPointOutput"
+                              Name 41  "param"
+                              Decorate 32(input.interp) Location 0
+                              Decorate 36(input.no_interp) Flat
+                              Decorate 36(input.no_interp) Location 1
+                              Decorate 40(@entryPointOutput) Location 0
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeInt 32 0
+      8(PSInput):             TypeStruct 6(float) 7(int)
+               9:             TypePointer Function 8(PSInput)
+              10:             TypeVector 6(float) 4
+              11:             TypeFunction 10(fvec4) 9(ptr)
+              15:             TypeInt 32 1
+              16:     15(int) Constant 1
+              17:             TypePointer Function 7(int)
+              21:     15(int) Constant 0
+              22:             TypePointer Function 6(float)
+              25:    6(float) Constant 0
+              26:    6(float) Constant 1065353216
+              31:             TypePointer Input 6(float)
+32(input.interp):     31(ptr) Variable Input
+              35:             TypePointer Input 7(int)
+36(input.no_interp):     35(ptr) Variable Input
+              39:             TypePointer Output 10(fvec4)
+40(@entryPointOutput):     39(ptr) Variable Output
+         4(main):           2 Function None 3
+               5:             Label
+       30(input):      9(ptr) Variable Function
+       41(param):      9(ptr) Variable Function
+              33:    6(float) Load 32(input.interp)
+              34:     22(ptr) AccessChain 30(input) 21
+                              Store 34 33
+              37:      7(int) Load 36(input.no_interp)
+              38:     17(ptr) AccessChain 30(input) 16
+                              Store 38 37
+              42:  8(PSInput) Load 30(input)
+                              Store 41(param) 42
+              43:   10(fvec4) FunctionCall 13(@main(struct-PSInput-f1-u11;) 41(param)
+                              Store 40(@entryPointOutput) 43
+                              Return
+                              FunctionEnd
+13(@main(struct-PSInput-f1-u11;):   10(fvec4) Function None 11
+       12(input):      9(ptr) FunctionParameter
+              14:             Label
+              18:     17(ptr) AccessChain 12(input) 16
+              19:      7(int) Load 18
+              20:    6(float) ConvertUToF 19
+              23:     22(ptr) AccessChain 12(input) 21
+              24:    6(float) Load 23
+              27:   10(fvec4) CompositeConstruct 20 24 25 26
+                              ReturnValue 27
+                              FunctionEnd
diff --git a/Test/baseResults/hlsl.target.frag.out b/Test/baseResults/hlsl.target.frag.out
new file mode 100644
index 0000000..0001796
--- /dev/null
+++ b/Test/baseResults/hlsl.target.frag.out
@@ -0,0 +1,209 @@
+hlsl.target.frag
+Shader version: 500
+gl_FragCoord origin is upper left
+0:? Sequence
+0:7  Function Definition: @main(struct-PSInput-f1-u11;vf4;vf4; ( temp void)
+0:7    Function Parameters: 
+0:7      'input' ( in structure{ temp float interp,  temp uint no_interp})
+0:7      'out1' ( out 4-component vector of float)
+0:7      'out2' ( out 4-component vector of float)
+0:?     Sequence
+0:8      move second child to first child ( temp 4-component vector of float)
+0:8        'out1' ( out 4-component vector of float)
+0:8        Constant:
+0:8          1.000000
+0:8          1.000000
+0:8          1.000000
+0:8          1.000000
+0:9      move second child to first child ( temp 4-component vector of float)
+0:9        'out2' ( out 4-component vector of float)
+0:9        Constant:
+0:9          0.000000
+0:9          0.000000
+0:9          0.000000
+0:9          0.000000
+0:7  Function Definition: main( ( temp void)
+0:7    Function Parameters: 
+0:?     Sequence
+0:7      Sequence
+0:7        move second child to first child ( temp float)
+0:7          interp: direct index for structure ( temp float)
+0:?             'input' ( temp structure{ temp float interp,  temp uint no_interp})
+0:7            Constant:
+0:7              0 (const int)
+0:?           'input.interp' (layout( location=0) in float)
+0:7        move second child to first child ( temp uint)
+0:7          no_interp: direct index for structure ( temp uint)
+0:?             'input' ( temp structure{ temp float interp,  temp uint no_interp})
+0:7            Constant:
+0:7              1 (const int)
+0:?           'input.no_interp' (layout( location=1) flat in uint)
+0:7      Function Call: @main(struct-PSInput-f1-u11;vf4;vf4; ( temp void)
+0:?         'input' ( temp structure{ temp float interp,  temp uint no_interp})
+0:?         'out1' ( temp 4-component vector of float)
+0:?         'out2' ( temp 4-component vector of float)
+0:7      move second child to first child ( temp 4-component vector of float)
+0:?         'out1' (layout( location=1) out 4-component vector of float)
+0:?         'out1' ( temp 4-component vector of float)
+0:7      move second child to first child ( temp 4-component vector of float)
+0:?         'out2' (layout( location=3) out 4-component vector of float)
+0:?         'out2' ( temp 4-component vector of float)
+0:?   Linker Objects
+0:?     'input.interp' (layout( location=0) in float)
+0:?     'input.no_interp' (layout( location=1) flat in uint)
+0:?     'out1' (layout( location=1) out 4-component vector of float)
+0:?     'out2' (layout( location=3) out 4-component vector of float)
+
+
+Linked fragment stage:
+
+
+Shader version: 500
+gl_FragCoord origin is upper left
+0:? Sequence
+0:7  Function Definition: @main(struct-PSInput-f1-u11;vf4;vf4; ( temp void)
+0:7    Function Parameters: 
+0:7      'input' ( in structure{ temp float interp,  temp uint no_interp})
+0:7      'out1' ( out 4-component vector of float)
+0:7      'out2' ( out 4-component vector of float)
+0:?     Sequence
+0:8      move second child to first child ( temp 4-component vector of float)
+0:8        'out1' ( out 4-component vector of float)
+0:8        Constant:
+0:8          1.000000
+0:8          1.000000
+0:8          1.000000
+0:8          1.000000
+0:9      move second child to first child ( temp 4-component vector of float)
+0:9        'out2' ( out 4-component vector of float)
+0:9        Constant:
+0:9          0.000000
+0:9          0.000000
+0:9          0.000000
+0:9          0.000000
+0:7  Function Definition: main( ( temp void)
+0:7    Function Parameters: 
+0:?     Sequence
+0:7      Sequence
+0:7        move second child to first child ( temp float)
+0:7          interp: direct index for structure ( temp float)
+0:?             'input' ( temp structure{ temp float interp,  temp uint no_interp})
+0:7            Constant:
+0:7              0 (const int)
+0:?           'input.interp' (layout( location=0) in float)
+0:7        move second child to first child ( temp uint)
+0:7          no_interp: direct index for structure ( temp uint)
+0:?             'input' ( temp structure{ temp float interp,  temp uint no_interp})
+0:7            Constant:
+0:7              1 (const int)
+0:?           'input.no_interp' (layout( location=1) flat in uint)
+0:7      Function Call: @main(struct-PSInput-f1-u11;vf4;vf4; ( temp void)
+0:?         'input' ( temp structure{ temp float interp,  temp uint no_interp})
+0:?         'out1' ( temp 4-component vector of float)
+0:?         'out2' ( temp 4-component vector of float)
+0:7      move second child to first child ( temp 4-component vector of float)
+0:?         'out1' (layout( location=1) out 4-component vector of float)
+0:?         'out1' ( temp 4-component vector of float)
+0:7      move second child to first child ( temp 4-component vector of float)
+0:?         'out2' (layout( location=3) out 4-component vector of float)
+0:?         'out2' ( temp 4-component vector of float)
+0:?   Linker Objects
+0:?     'input.interp' (layout( location=0) in float)
+0:?     'input.no_interp' (layout( location=1) flat in uint)
+0:?     'out1' (layout( location=1) out 4-component vector of float)
+0:?     'out2' (layout( location=3) out 4-component vector of float)
+
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 50
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 26 32 46 48
+                              ExecutionMode 4 OriginUpperLeft
+                              Source HLSL 500
+                              Name 4  "main"
+                              Name 8  "PSInput"
+                              MemberName 8(PSInput) 0  "interp"
+                              MemberName 8(PSInput) 1  "no_interp"
+                              Name 16  "@main(struct-PSInput-f1-u11;vf4;vf4;"
+                              Name 13  "input"
+                              Name 14  "out1"
+                              Name 15  "out2"
+                              Name 22  "input"
+                              Name 26  "input.interp"
+                              Name 32  "input.no_interp"
+                              Name 36  "out1"
+                              Name 37  "out2"
+                              Name 38  "param"
+                              Name 40  "param"
+                              Name 41  "param"
+                              Name 46  "out1"
+                              Name 48  "out2"
+                              Decorate 26(input.interp) Location 0
+                              Decorate 32(input.no_interp) Flat
+                              Decorate 32(input.no_interp) Location 1
+                              Decorate 46(out1) Location 1
+                              Decorate 48(out2) Location 3
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeInt 32 0
+      8(PSInput):             TypeStruct 6(float) 7(int)
+               9:             TypePointer Function 8(PSInput)
+              10:             TypeVector 6(float) 4
+              11:             TypePointer Function 10(fvec4)
+              12:             TypeFunction 2 9(ptr) 11(ptr) 11(ptr)
+              18:    6(float) Constant 1065353216
+              19:   10(fvec4) ConstantComposite 18 18 18 18
+              20:    6(float) Constant 0
+              21:   10(fvec4) ConstantComposite 20 20 20 20
+              23:             TypeInt 32 1
+              24:     23(int) Constant 0
+              25:             TypePointer Input 6(float)
+26(input.interp):     25(ptr) Variable Input
+              28:             TypePointer Function 6(float)
+              30:     23(int) Constant 1
+              31:             TypePointer Input 7(int)
+32(input.no_interp):     31(ptr) Variable Input
+              34:             TypePointer Function 7(int)
+              45:             TypePointer Output 10(fvec4)
+        46(out1):     45(ptr) Variable Output
+        48(out2):     45(ptr) Variable Output
+         4(main):           2 Function None 3
+               5:             Label
+       22(input):      9(ptr) Variable Function
+        36(out1):     11(ptr) Variable Function
+        37(out2):     11(ptr) Variable Function
+       38(param):      9(ptr) Variable Function
+       40(param):     11(ptr) Variable Function
+       41(param):     11(ptr) Variable Function
+              27:    6(float) Load 26(input.interp)
+              29:     28(ptr) AccessChain 22(input) 24
+                              Store 29 27
+              33:      7(int) Load 32(input.no_interp)
+              35:     34(ptr) AccessChain 22(input) 30
+                              Store 35 33
+              39:  8(PSInput) Load 22(input)
+                              Store 38(param) 39
+              42:           2 FunctionCall 16(@main(struct-PSInput-f1-u11;vf4;vf4;) 38(param) 40(param) 41(param)
+              43:   10(fvec4) Load 40(param)
+                              Store 36(out1) 43
+              44:   10(fvec4) Load 41(param)
+                              Store 37(out2) 44
+              47:   10(fvec4) Load 36(out1)
+                              Store 46(out1) 47
+              49:   10(fvec4) Load 37(out2)
+                              Store 48(out2) 49
+                              Return
+                              FunctionEnd
+16(@main(struct-PSInput-f1-u11;vf4;vf4;):           2 Function None 12
+       13(input):      9(ptr) FunctionParameter
+        14(out1):     11(ptr) FunctionParameter
+        15(out2):     11(ptr) FunctionParameter
+              17:             Label
+                              Store 14(out1) 19
+                              Store 15(out2) 21
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/hlsl.targetStruct1.frag.out b/Test/baseResults/hlsl.targetStruct1.frag.out
new file mode 100644
index 0000000..371ce2a
--- /dev/null
+++ b/Test/baseResults/hlsl.targetStruct1.frag.out
@@ -0,0 +1,298 @@
+hlsl.targetStruct1.frag
+Shader version: 500
+gl_FragCoord origin is upper left
+0:? Sequence
+0:12  Function Definition: @main(struct-PSInput-f1-u11;vf4; ( temp structure{ temp 4-component vector of float o1,  temp 4-component vector of float o2})
+0:12    Function Parameters: 
+0:12      'input' ( in structure{ temp float interp,  temp uint no_interp})
+0:12      'po' ( out 4-component vector of float)
+0:?     Sequence
+0:14      move second child to first child ( temp 4-component vector of float)
+0:14        o1: direct index for structure ( temp 4-component vector of float)
+0:14          'pso' ( temp structure{ temp 4-component vector of float o1,  temp 4-component vector of float o2})
+0:14          Constant:
+0:14            0 (const int)
+0:?         Construct vec4 ( temp 4-component vector of float)
+0:14          Convert uint to float ( temp float)
+0:14            no_interp: direct index for structure ( temp uint)
+0:14              'input' ( in structure{ temp float interp,  temp uint no_interp})
+0:14              Constant:
+0:14                1 (const int)
+0:14          interp: direct index for structure ( temp float)
+0:14            'input' ( in structure{ temp float interp,  temp uint no_interp})
+0:14            Constant:
+0:14              0 (const int)
+0:14          Constant:
+0:14            0.000000
+0:14          Constant:
+0:14            1.000000
+0:15      move second child to first child ( temp 4-component vector of float)
+0:15        o2: direct index for structure ( temp 4-component vector of float)
+0:15          'pso' ( temp structure{ temp 4-component vector of float o1,  temp 4-component vector of float o2})
+0:15          Constant:
+0:15            1 (const int)
+0:15        Constant:
+0:15          1.000000
+0:15          1.000000
+0:15          1.000000
+0:15          1.000000
+0:16      move second child to first child ( temp 4-component vector of float)
+0:16        'po' ( out 4-component vector of float)
+0:16        Constant:
+0:16          0.000000
+0:16          0.000000
+0:16          0.000000
+0:16          0.000000
+0:18      Branch: Return with expression
+0:18        'pso' ( temp structure{ temp 4-component vector of float o1,  temp 4-component vector of float o2})
+0:12  Function Definition: main( ( temp void)
+0:12    Function Parameters: 
+0:?     Sequence
+0:12      Sequence
+0:12        move second child to first child ( temp float)
+0:12          interp: direct index for structure ( temp float)
+0:?             'input' ( temp structure{ temp float interp,  temp uint no_interp})
+0:12            Constant:
+0:12              0 (const int)
+0:?           'input.interp' (layout( location=0) in float)
+0:12        move second child to first child ( temp uint)
+0:12          no_interp: direct index for structure ( temp uint)
+0:?             'input' ( temp structure{ temp float interp,  temp uint no_interp})
+0:12            Constant:
+0:12              1 (const int)
+0:?           'input.no_interp' (layout( location=1) flat in uint)
+0:12      Sequence
+0:12        move second child to first child ( temp structure{ temp 4-component vector of float o1,  temp 4-component vector of float o2})
+0:12          'flattenTemp' ( temp structure{ temp 4-component vector of float o1,  temp 4-component vector of float o2})
+0:12          Function Call: @main(struct-PSInput-f1-u11;vf4; ( temp structure{ temp 4-component vector of float o1,  temp 4-component vector of float o2})
+0:?             'input' ( temp structure{ temp float interp,  temp uint no_interp})
+0:?             'po' ( temp 4-component vector of float)
+0:12        move second child to first child ( temp 4-component vector of float)
+0:?           '@entryPointOutput.o1' (layout( location=2) out 4-component vector of float)
+0:12          o1: direct index for structure ( temp 4-component vector of float)
+0:12            'flattenTemp' ( temp structure{ temp 4-component vector of float o1,  temp 4-component vector of float o2})
+0:12            Constant:
+0:12              0 (const int)
+0:12        move second child to first child ( temp 4-component vector of float)
+0:?           '@entryPointOutput.o2' (layout( location=1) out 4-component vector of float)
+0:12          o2: direct index for structure ( temp 4-component vector of float)
+0:12            'flattenTemp' ( temp structure{ temp 4-component vector of float o1,  temp 4-component vector of float o2})
+0:12            Constant:
+0:12              1 (const int)
+0:12      move second child to first child ( temp 4-component vector of float)
+0:?         'po' (layout( location=0) out 4-component vector of float)
+0:?         'po' ( temp 4-component vector of float)
+0:?   Linker Objects
+0:?     '@entryPointOutput.o1' (layout( location=2) out 4-component vector of float)
+0:?     '@entryPointOutput.o2' (layout( location=1) out 4-component vector of float)
+0:?     'input.interp' (layout( location=0) in float)
+0:?     'input.no_interp' (layout( location=1) flat in uint)
+0:?     'po' (layout( location=0) out 4-component vector of float)
+
+
+Linked fragment stage:
+
+
+Shader version: 500
+gl_FragCoord origin is upper left
+0:? Sequence
+0:12  Function Definition: @main(struct-PSInput-f1-u11;vf4; ( temp structure{ temp 4-component vector of float o1,  temp 4-component vector of float o2})
+0:12    Function Parameters: 
+0:12      'input' ( in structure{ temp float interp,  temp uint no_interp})
+0:12      'po' ( out 4-component vector of float)
+0:?     Sequence
+0:14      move second child to first child ( temp 4-component vector of float)
+0:14        o1: direct index for structure ( temp 4-component vector of float)
+0:14          'pso' ( temp structure{ temp 4-component vector of float o1,  temp 4-component vector of float o2})
+0:14          Constant:
+0:14            0 (const int)
+0:?         Construct vec4 ( temp 4-component vector of float)
+0:14          Convert uint to float ( temp float)
+0:14            no_interp: direct index for structure ( temp uint)
+0:14              'input' ( in structure{ temp float interp,  temp uint no_interp})
+0:14              Constant:
+0:14                1 (const int)
+0:14          interp: direct index for structure ( temp float)
+0:14            'input' ( in structure{ temp float interp,  temp uint no_interp})
+0:14            Constant:
+0:14              0 (const int)
+0:14          Constant:
+0:14            0.000000
+0:14          Constant:
+0:14            1.000000
+0:15      move second child to first child ( temp 4-component vector of float)
+0:15        o2: direct index for structure ( temp 4-component vector of float)
+0:15          'pso' ( temp structure{ temp 4-component vector of float o1,  temp 4-component vector of float o2})
+0:15          Constant:
+0:15            1 (const int)
+0:15        Constant:
+0:15          1.000000
+0:15          1.000000
+0:15          1.000000
+0:15          1.000000
+0:16      move second child to first child ( temp 4-component vector of float)
+0:16        'po' ( out 4-component vector of float)
+0:16        Constant:
+0:16          0.000000
+0:16          0.000000
+0:16          0.000000
+0:16          0.000000
+0:18      Branch: Return with expression
+0:18        'pso' ( temp structure{ temp 4-component vector of float o1,  temp 4-component vector of float o2})
+0:12  Function Definition: main( ( temp void)
+0:12    Function Parameters: 
+0:?     Sequence
+0:12      Sequence
+0:12        move second child to first child ( temp float)
+0:12          interp: direct index for structure ( temp float)
+0:?             'input' ( temp structure{ temp float interp,  temp uint no_interp})
+0:12            Constant:
+0:12              0 (const int)
+0:?           'input.interp' (layout( location=0) in float)
+0:12        move second child to first child ( temp uint)
+0:12          no_interp: direct index for structure ( temp uint)
+0:?             'input' ( temp structure{ temp float interp,  temp uint no_interp})
+0:12            Constant:
+0:12              1 (const int)
+0:?           'input.no_interp' (layout( location=1) flat in uint)
+0:12      Sequence
+0:12        move second child to first child ( temp structure{ temp 4-component vector of float o1,  temp 4-component vector of float o2})
+0:12          'flattenTemp' ( temp structure{ temp 4-component vector of float o1,  temp 4-component vector of float o2})
+0:12          Function Call: @main(struct-PSInput-f1-u11;vf4; ( temp structure{ temp 4-component vector of float o1,  temp 4-component vector of float o2})
+0:?             'input' ( temp structure{ temp float interp,  temp uint no_interp})
+0:?             'po' ( temp 4-component vector of float)
+0:12        move second child to first child ( temp 4-component vector of float)
+0:?           '@entryPointOutput.o1' (layout( location=2) out 4-component vector of float)
+0:12          o1: direct index for structure ( temp 4-component vector of float)
+0:12            'flattenTemp' ( temp structure{ temp 4-component vector of float o1,  temp 4-component vector of float o2})
+0:12            Constant:
+0:12              0 (const int)
+0:12        move second child to first child ( temp 4-component vector of float)
+0:?           '@entryPointOutput.o2' (layout( location=1) out 4-component vector of float)
+0:12          o2: direct index for structure ( temp 4-component vector of float)
+0:12            'flattenTemp' ( temp structure{ temp 4-component vector of float o1,  temp 4-component vector of float o2})
+0:12            Constant:
+0:12              1 (const int)
+0:12      move second child to first child ( temp 4-component vector of float)
+0:?         'po' (layout( location=0) out 4-component vector of float)
+0:?         'po' ( temp 4-component vector of float)
+0:?   Linker Objects
+0:?     '@entryPointOutput.o1' (layout( location=2) out 4-component vector of float)
+0:?     '@entryPointOutput.o2' (layout( location=1) out 4-component vector of float)
+0:?     'input.interp' (layout( location=0) in float)
+0:?     'input.no_interp' (layout( location=1) flat in uint)
+0:?     'po' (layout( location=0) out 4-component vector of float)
+
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 65
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 42 46 57 60 63
+                              ExecutionMode 4 OriginUpperLeft
+                              Source HLSL 500
+                              Name 4  "main"
+                              Name 8  "PSInput"
+                              MemberName 8(PSInput) 0  "interp"
+                              MemberName 8(PSInput) 1  "no_interp"
+                              Name 12  "PSOutput"
+                              MemberName 12(PSOutput) 0  "o1"
+                              MemberName 12(PSOutput) 1  "o2"
+                              Name 16  "@main(struct-PSInput-f1-u11;vf4;"
+                              Name 14  "input"
+                              Name 15  "po"
+                              Name 19  "pso"
+                              Name 40  "input"
+                              Name 42  "input.interp"
+                              Name 46  "input.no_interp"
+                              Name 49  "flattenTemp"
+                              Name 50  "po"
+                              Name 51  "param"
+                              Name 53  "param"
+                              Name 57  "@entryPointOutput.o1"
+                              Name 60  "@entryPointOutput.o2"
+                              Name 63  "po"
+                              Decorate 42(input.interp) Location 0
+                              Decorate 46(input.no_interp) Flat
+                              Decorate 46(input.no_interp) Location 1
+                              Decorate 57(@entryPointOutput.o1) Location 2
+                              Decorate 60(@entryPointOutput.o2) Location 1
+                              Decorate 63(po) Location 0
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeInt 32 0
+      8(PSInput):             TypeStruct 6(float) 7(int)
+               9:             TypePointer Function 8(PSInput)
+              10:             TypeVector 6(float) 4
+              11:             TypePointer Function 10(fvec4)
+    12(PSOutput):             TypeStruct 10(fvec4) 10(fvec4)
+              13:             TypeFunction 12(PSOutput) 9(ptr) 11(ptr)
+              18:             TypePointer Function 12(PSOutput)
+              20:             TypeInt 32 1
+              21:     20(int) Constant 0
+              22:     20(int) Constant 1
+              23:             TypePointer Function 7(int)
+              27:             TypePointer Function 6(float)
+              30:    6(float) Constant 0
+              31:    6(float) Constant 1065353216
+              34:   10(fvec4) ConstantComposite 31 31 31 31
+              36:   10(fvec4) ConstantComposite 30 30 30 30
+              41:             TypePointer Input 6(float)
+42(input.interp):     41(ptr) Variable Input
+              45:             TypePointer Input 7(int)
+46(input.no_interp):     45(ptr) Variable Input
+              56:             TypePointer Output 10(fvec4)
+57(@entryPointOutput.o1):     56(ptr) Variable Output
+60(@entryPointOutput.o2):     56(ptr) Variable Output
+          63(po):     56(ptr) Variable Output
+         4(main):           2 Function None 3
+               5:             Label
+       40(input):      9(ptr) Variable Function
+ 49(flattenTemp):     18(ptr) Variable Function
+          50(po):     11(ptr) Variable Function
+       51(param):      9(ptr) Variable Function
+       53(param):     11(ptr) Variable Function
+              43:    6(float) Load 42(input.interp)
+              44:     27(ptr) AccessChain 40(input) 21
+                              Store 44 43
+              47:      7(int) Load 46(input.no_interp)
+              48:     23(ptr) AccessChain 40(input) 22
+                              Store 48 47
+              52:  8(PSInput) Load 40(input)
+                              Store 51(param) 52
+              54:12(PSOutput) FunctionCall 16(@main(struct-PSInput-f1-u11;vf4;) 51(param) 53(param)
+              55:   10(fvec4) Load 53(param)
+                              Store 50(po) 55
+                              Store 49(flattenTemp) 54
+              58:     11(ptr) AccessChain 49(flattenTemp) 21
+              59:   10(fvec4) Load 58
+                              Store 57(@entryPointOutput.o1) 59
+              61:     11(ptr) AccessChain 49(flattenTemp) 22
+              62:   10(fvec4) Load 61
+                              Store 60(@entryPointOutput.o2) 62
+              64:   10(fvec4) Load 50(po)
+                              Store 63(po) 64
+                              Return
+                              FunctionEnd
+16(@main(struct-PSInput-f1-u11;vf4;):12(PSOutput) Function None 13
+       14(input):      9(ptr) FunctionParameter
+          15(po):     11(ptr) FunctionParameter
+              17:             Label
+         19(pso):     18(ptr) Variable Function
+              24:     23(ptr) AccessChain 14(input) 22
+              25:      7(int) Load 24
+              26:    6(float) ConvertUToF 25
+              28:     27(ptr) AccessChain 14(input) 21
+              29:    6(float) Load 28
+              32:   10(fvec4) CompositeConstruct 26 29 30 31
+              33:     11(ptr) AccessChain 19(pso) 21
+                              Store 33 32
+              35:     11(ptr) AccessChain 19(pso) 22
+                              Store 35 34
+                              Store 15(po) 36
+              37:12(PSOutput) Load 19(pso)
+                              ReturnValue 37
+                              FunctionEnd
diff --git a/Test/baseResults/hlsl.targetStruct2.frag.out b/Test/baseResults/hlsl.targetStruct2.frag.out
new file mode 100644
index 0000000..e6099c9
--- /dev/null
+++ b/Test/baseResults/hlsl.targetStruct2.frag.out
@@ -0,0 +1,298 @@
+hlsl.targetStruct2.frag
+Shader version: 500
+gl_FragCoord origin is upper left
+0:? Sequence
+0:12  Function Definition: @main(struct-PSInput-f1-u11;vf4; ( temp structure{ temp 4-component vector of float o1,  temp 4-component vector of float o2})
+0:12    Function Parameters: 
+0:12      'input' ( in structure{ temp float interp,  temp uint no_interp})
+0:12      'po' ( out 4-component vector of float)
+0:?     Sequence
+0:14      move second child to first child ( temp 4-component vector of float)
+0:14        o1: direct index for structure ( temp 4-component vector of float)
+0:14          'pso' ( temp structure{ temp 4-component vector of float o1,  temp 4-component vector of float o2})
+0:14          Constant:
+0:14            0 (const int)
+0:?         Construct vec4 ( temp 4-component vector of float)
+0:14          Convert uint to float ( temp float)
+0:14            no_interp: direct index for structure ( temp uint)
+0:14              'input' ( in structure{ temp float interp,  temp uint no_interp})
+0:14              Constant:
+0:14                1 (const int)
+0:14          interp: direct index for structure ( temp float)
+0:14            'input' ( in structure{ temp float interp,  temp uint no_interp})
+0:14            Constant:
+0:14              0 (const int)
+0:14          Constant:
+0:14            0.000000
+0:14          Constant:
+0:14            1.000000
+0:15      move second child to first child ( temp 4-component vector of float)
+0:15        o2: direct index for structure ( temp 4-component vector of float)
+0:15          'pso' ( temp structure{ temp 4-component vector of float o1,  temp 4-component vector of float o2})
+0:15          Constant:
+0:15            1 (const int)
+0:15        Constant:
+0:15          1.000000
+0:15          1.000000
+0:15          1.000000
+0:15          1.000000
+0:16      move second child to first child ( temp 4-component vector of float)
+0:16        'po' ( out 4-component vector of float)
+0:16        Constant:
+0:16          0.000000
+0:16          0.000000
+0:16          0.000000
+0:16          0.000000
+0:18      Branch: Return with expression
+0:18        'pso' ( temp structure{ temp 4-component vector of float o1,  temp 4-component vector of float o2})
+0:12  Function Definition: main( ( temp void)
+0:12    Function Parameters: 
+0:?     Sequence
+0:12      Sequence
+0:12        move second child to first child ( temp float)
+0:12          interp: direct index for structure ( temp float)
+0:?             'input' ( temp structure{ temp float interp,  temp uint no_interp})
+0:12            Constant:
+0:12              0 (const int)
+0:?           'input.interp' (layout( location=0) in float)
+0:12        move second child to first child ( temp uint)
+0:12          no_interp: direct index for structure ( temp uint)
+0:?             'input' ( temp structure{ temp float interp,  temp uint no_interp})
+0:12            Constant:
+0:12              1 (const int)
+0:?           'input.no_interp' (layout( location=1) flat in uint)
+0:12      Sequence
+0:12        move second child to first child ( temp structure{ temp 4-component vector of float o1,  temp 4-component vector of float o2})
+0:12          'flattenTemp' ( temp structure{ temp 4-component vector of float o1,  temp 4-component vector of float o2})
+0:12          Function Call: @main(struct-PSInput-f1-u11;vf4; ( temp structure{ temp 4-component vector of float o1,  temp 4-component vector of float o2})
+0:?             'input' ( temp structure{ temp float interp,  temp uint no_interp})
+0:?             'po' ( temp 4-component vector of float)
+0:12        move second child to first child ( temp 4-component vector of float)
+0:?           '@entryPointOutput.o1' (layout( location=2) out 4-component vector of float)
+0:12          o1: direct index for structure ( temp 4-component vector of float)
+0:12            'flattenTemp' ( temp structure{ temp 4-component vector of float o1,  temp 4-component vector of float o2})
+0:12            Constant:
+0:12              0 (const int)
+0:12        move second child to first child ( temp 4-component vector of float)
+0:?           '@entryPointOutput.o2' (layout( location=3) out 4-component vector of float)
+0:12          o2: direct index for structure ( temp 4-component vector of float)
+0:12            'flattenTemp' ( temp structure{ temp 4-component vector of float o1,  temp 4-component vector of float o2})
+0:12            Constant:
+0:12              1 (const int)
+0:12      move second child to first child ( temp 4-component vector of float)
+0:?         'po' (layout( location=0) out 4-component vector of float)
+0:?         'po' ( temp 4-component vector of float)
+0:?   Linker Objects
+0:?     '@entryPointOutput.o1' (layout( location=2) out 4-component vector of float)
+0:?     '@entryPointOutput.o2' (layout( location=3) out 4-component vector of float)
+0:?     'input.interp' (layout( location=0) in float)
+0:?     'input.no_interp' (layout( location=1) flat in uint)
+0:?     'po' (layout( location=0) out 4-component vector of float)
+
+
+Linked fragment stage:
+
+
+Shader version: 500
+gl_FragCoord origin is upper left
+0:? Sequence
+0:12  Function Definition: @main(struct-PSInput-f1-u11;vf4; ( temp structure{ temp 4-component vector of float o1,  temp 4-component vector of float o2})
+0:12    Function Parameters: 
+0:12      'input' ( in structure{ temp float interp,  temp uint no_interp})
+0:12      'po' ( out 4-component vector of float)
+0:?     Sequence
+0:14      move second child to first child ( temp 4-component vector of float)
+0:14        o1: direct index for structure ( temp 4-component vector of float)
+0:14          'pso' ( temp structure{ temp 4-component vector of float o1,  temp 4-component vector of float o2})
+0:14          Constant:
+0:14            0 (const int)
+0:?         Construct vec4 ( temp 4-component vector of float)
+0:14          Convert uint to float ( temp float)
+0:14            no_interp: direct index for structure ( temp uint)
+0:14              'input' ( in structure{ temp float interp,  temp uint no_interp})
+0:14              Constant:
+0:14                1 (const int)
+0:14          interp: direct index for structure ( temp float)
+0:14            'input' ( in structure{ temp float interp,  temp uint no_interp})
+0:14            Constant:
+0:14              0 (const int)
+0:14          Constant:
+0:14            0.000000
+0:14          Constant:
+0:14            1.000000
+0:15      move second child to first child ( temp 4-component vector of float)
+0:15        o2: direct index for structure ( temp 4-component vector of float)
+0:15          'pso' ( temp structure{ temp 4-component vector of float o1,  temp 4-component vector of float o2})
+0:15          Constant:
+0:15            1 (const int)
+0:15        Constant:
+0:15          1.000000
+0:15          1.000000
+0:15          1.000000
+0:15          1.000000
+0:16      move second child to first child ( temp 4-component vector of float)
+0:16        'po' ( out 4-component vector of float)
+0:16        Constant:
+0:16          0.000000
+0:16          0.000000
+0:16          0.000000
+0:16          0.000000
+0:18      Branch: Return with expression
+0:18        'pso' ( temp structure{ temp 4-component vector of float o1,  temp 4-component vector of float o2})
+0:12  Function Definition: main( ( temp void)
+0:12    Function Parameters: 
+0:?     Sequence
+0:12      Sequence
+0:12        move second child to first child ( temp float)
+0:12          interp: direct index for structure ( temp float)
+0:?             'input' ( temp structure{ temp float interp,  temp uint no_interp})
+0:12            Constant:
+0:12              0 (const int)
+0:?           'input.interp' (layout( location=0) in float)
+0:12        move second child to first child ( temp uint)
+0:12          no_interp: direct index for structure ( temp uint)
+0:?             'input' ( temp structure{ temp float interp,  temp uint no_interp})
+0:12            Constant:
+0:12              1 (const int)
+0:?           'input.no_interp' (layout( location=1) flat in uint)
+0:12      Sequence
+0:12        move second child to first child ( temp structure{ temp 4-component vector of float o1,  temp 4-component vector of float o2})
+0:12          'flattenTemp' ( temp structure{ temp 4-component vector of float o1,  temp 4-component vector of float o2})
+0:12          Function Call: @main(struct-PSInput-f1-u11;vf4; ( temp structure{ temp 4-component vector of float o1,  temp 4-component vector of float o2})
+0:?             'input' ( temp structure{ temp float interp,  temp uint no_interp})
+0:?             'po' ( temp 4-component vector of float)
+0:12        move second child to first child ( temp 4-component vector of float)
+0:?           '@entryPointOutput.o1' (layout( location=2) out 4-component vector of float)
+0:12          o1: direct index for structure ( temp 4-component vector of float)
+0:12            'flattenTemp' ( temp structure{ temp 4-component vector of float o1,  temp 4-component vector of float o2})
+0:12            Constant:
+0:12              0 (const int)
+0:12        move second child to first child ( temp 4-component vector of float)
+0:?           '@entryPointOutput.o2' (layout( location=3) out 4-component vector of float)
+0:12          o2: direct index for structure ( temp 4-component vector of float)
+0:12            'flattenTemp' ( temp structure{ temp 4-component vector of float o1,  temp 4-component vector of float o2})
+0:12            Constant:
+0:12              1 (const int)
+0:12      move second child to first child ( temp 4-component vector of float)
+0:?         'po' (layout( location=0) out 4-component vector of float)
+0:?         'po' ( temp 4-component vector of float)
+0:?   Linker Objects
+0:?     '@entryPointOutput.o1' (layout( location=2) out 4-component vector of float)
+0:?     '@entryPointOutput.o2' (layout( location=3) out 4-component vector of float)
+0:?     'input.interp' (layout( location=0) in float)
+0:?     'input.no_interp' (layout( location=1) flat in uint)
+0:?     'po' (layout( location=0) out 4-component vector of float)
+
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 65
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 42 46 57 60 63
+                              ExecutionMode 4 OriginUpperLeft
+                              Source HLSL 500
+                              Name 4  "main"
+                              Name 8  "PSInput"
+                              MemberName 8(PSInput) 0  "interp"
+                              MemberName 8(PSInput) 1  "no_interp"
+                              Name 12  "PSOutput"
+                              MemberName 12(PSOutput) 0  "o1"
+                              MemberName 12(PSOutput) 1  "o2"
+                              Name 16  "@main(struct-PSInput-f1-u11;vf4;"
+                              Name 14  "input"
+                              Name 15  "po"
+                              Name 19  "pso"
+                              Name 40  "input"
+                              Name 42  "input.interp"
+                              Name 46  "input.no_interp"
+                              Name 49  "flattenTemp"
+                              Name 50  "po"
+                              Name 51  "param"
+                              Name 53  "param"
+                              Name 57  "@entryPointOutput.o1"
+                              Name 60  "@entryPointOutput.o2"
+                              Name 63  "po"
+                              Decorate 42(input.interp) Location 0
+                              Decorate 46(input.no_interp) Flat
+                              Decorate 46(input.no_interp) Location 1
+                              Decorate 57(@entryPointOutput.o1) Location 2
+                              Decorate 60(@entryPointOutput.o2) Location 3
+                              Decorate 63(po) Location 0
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeInt 32 0
+      8(PSInput):             TypeStruct 6(float) 7(int)
+               9:             TypePointer Function 8(PSInput)
+              10:             TypeVector 6(float) 4
+              11:             TypePointer Function 10(fvec4)
+    12(PSOutput):             TypeStruct 10(fvec4) 10(fvec4)
+              13:             TypeFunction 12(PSOutput) 9(ptr) 11(ptr)
+              18:             TypePointer Function 12(PSOutput)
+              20:             TypeInt 32 1
+              21:     20(int) Constant 0
+              22:     20(int) Constant 1
+              23:             TypePointer Function 7(int)
+              27:             TypePointer Function 6(float)
+              30:    6(float) Constant 0
+              31:    6(float) Constant 1065353216
+              34:   10(fvec4) ConstantComposite 31 31 31 31
+              36:   10(fvec4) ConstantComposite 30 30 30 30
+              41:             TypePointer Input 6(float)
+42(input.interp):     41(ptr) Variable Input
+              45:             TypePointer Input 7(int)
+46(input.no_interp):     45(ptr) Variable Input
+              56:             TypePointer Output 10(fvec4)
+57(@entryPointOutput.o1):     56(ptr) Variable Output
+60(@entryPointOutput.o2):     56(ptr) Variable Output
+          63(po):     56(ptr) Variable Output
+         4(main):           2 Function None 3
+               5:             Label
+       40(input):      9(ptr) Variable Function
+ 49(flattenTemp):     18(ptr) Variable Function
+          50(po):     11(ptr) Variable Function
+       51(param):      9(ptr) Variable Function
+       53(param):     11(ptr) Variable Function
+              43:    6(float) Load 42(input.interp)
+              44:     27(ptr) AccessChain 40(input) 21
+                              Store 44 43
+              47:      7(int) Load 46(input.no_interp)
+              48:     23(ptr) AccessChain 40(input) 22
+                              Store 48 47
+              52:  8(PSInput) Load 40(input)
+                              Store 51(param) 52
+              54:12(PSOutput) FunctionCall 16(@main(struct-PSInput-f1-u11;vf4;) 51(param) 53(param)
+              55:   10(fvec4) Load 53(param)
+                              Store 50(po) 55
+                              Store 49(flattenTemp) 54
+              58:     11(ptr) AccessChain 49(flattenTemp) 21
+              59:   10(fvec4) Load 58
+                              Store 57(@entryPointOutput.o1) 59
+              61:     11(ptr) AccessChain 49(flattenTemp) 22
+              62:   10(fvec4) Load 61
+                              Store 60(@entryPointOutput.o2) 62
+              64:   10(fvec4) Load 50(po)
+                              Store 63(po) 64
+                              Return
+                              FunctionEnd
+16(@main(struct-PSInput-f1-u11;vf4;):12(PSOutput) Function None 13
+       14(input):      9(ptr) FunctionParameter
+          15(po):     11(ptr) FunctionParameter
+              17:             Label
+         19(pso):     18(ptr) Variable Function
+              24:     23(ptr) AccessChain 14(input) 22
+              25:      7(int) Load 24
+              26:    6(float) ConvertUToF 25
+              28:     27(ptr) AccessChain 14(input) 21
+              29:    6(float) Load 28
+              32:   10(fvec4) CompositeConstruct 26 29 30 31
+              33:     11(ptr) AccessChain 19(pso) 21
+                              Store 33 32
+              35:     11(ptr) AccessChain 19(pso) 22
+                              Store 35 34
+                              Store 15(po) 36
+              37:12(PSOutput) Load 19(pso)
+                              ReturnValue 37
+                              FunctionEnd
diff --git a/Test/baseResults/hlsl.templatetypes.frag.out b/Test/baseResults/hlsl.templatetypes.frag.out
index 9d0cced..3fc5846 100644
--- a/Test/baseResults/hlsl.templatetypes.frag.out
+++ b/Test/baseResults/hlsl.templatetypes.frag.out
@@ -508,7 +508,7 @@
 0:?     '@entryPointOutput' (layout( location=0) out float)
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 153
 
                               Capability Shader
@@ -571,8 +571,8 @@
               28:     25(int) Constant 1
               29:             TypePointer Function 6(float)
               31:             TypeFloat 64
-              32:             TypePointer Function 31(float)
-              34:   31(float) Constant 0 1072693248
+              32:             TypePointer Function 31(float64_t)
+              34:31(float64_t) Constant 0 1072693248
               35:             TypeInt 32 0
               36:             TypePointer Function 35(int)
               38:     35(int) Constant 1
@@ -587,10 +587,10 @@
               49:             TypeVector 6(float) 2
               50:             TypePointer Function 49(fvec2)
               52:   49(fvec2) ConstantComposite 13 14
-              53:             TypeVector 31(float) 2
-              54:             TypePointer Function 53(fvec2)
-              56:   31(float) Constant 0 1073741824
-              57:   53(fvec2) ConstantComposite 34 56
+              53:             TypeVector 31(float64_t) 2
+              54:             TypePointer Function 53(f64vec2)
+              56:31(float64_t) Constant 0 1073741824
+              57: 53(f64vec2) ConstantComposite 34 56
               58:             TypeVector 35(int) 2
               59:             TypePointer Function 58(ivec2)
               61:     35(int) Constant 2
@@ -605,10 +605,10 @@
               72:             TypeVector 6(float) 3
               73:             TypePointer Function 72(fvec3)
               75:   72(fvec3) ConstantComposite 13 14 15
-              76:             TypeVector 31(float) 3
-              77:             TypePointer Function 76(fvec3)
-              79:   31(float) Constant 0 1074266112
-              80:   76(fvec3) ConstantComposite 34 56 79
+              76:             TypeVector 31(float64_t) 3
+              77:             TypePointer Function 76(f64vec3)
+              79:31(float64_t) Constant 0 1074266112
+              80: 76(f64vec3) ConstantComposite 34 56 79
               81:             TypeVector 35(int) 3
               82:             TypePointer Function 81(ivec3)
               84:     35(int) Constant 3
@@ -620,10 +620,10 @@
               91:             TypePointer Function 90(ivec4)
               93:     25(int) Constant 4
               94:   90(ivec4) ConstantComposite 28 47 70 93
-              96:             TypeVector 31(float) 4
-              97:             TypePointer Function 96(fvec4)
-              99:   31(float) Constant 0 1074790400
-             100:   96(fvec4) ConstantComposite 34 56 79 99
+              96:             TypeVector 31(float64_t) 4
+              97:             TypePointer Function 96(f64vec4)
+              99:31(float64_t) Constant 0 1074790400
+             100: 96(f64vec4) ConstantComposite 34 56 79 99
              101:             TypeVector 35(int) 4
              102:             TypePointer Function 101(ivec4)
              104:     35(int) Constant 4
diff --git a/Test/baseResults/hlsl.texture.struct.frag.out b/Test/baseResults/hlsl.texture.struct.frag.out
new file mode 100644
index 0000000..62cb574
--- /dev/null
+++ b/Test/baseResults/hlsl.texture.struct.frag.out
@@ -0,0 +1,1201 @@
+hlsl.texture.struct.frag
+Shader version: 500
+gl_FragCoord origin is upper left
+0:? Sequence
+0:38  Function Definition: fn1(t2-tx-struct0-1; ( temp structure{ temp float c0,  temp 2-component vector of float c1,  temp float c2})
+0:38    Function Parameters: 
+0:38      't1' ( in texture2D)
+0:?     Sequence
+0:38      Branch: Return with expression
+0:38        Sequence
+0:38          move second child to first child ( temp 4-component vector of float)
+0:38            '@sampleResultShadow' ( temp 4-component vector of float)
+0:?             texture ( temp 4-component vector of float)
+0:38              Construct combined texture-sampler ( temp sampler2D)
+0:38                't1' ( in texture2D)
+0:38                'g_sSamp' ( uniform sampler)
+0:?               Constant:
+0:?                 0.600000
+0:?                 0.610000
+0:38          move second child to first child ( temp float)
+0:38            c0: direct index for structure ( temp float)
+0:38              '@sampleStructTemp' ( temp structure{ temp float c0,  temp 2-component vector of float c1,  temp float c2})
+0:38              Constant:
+0:38                0 (const uint)
+0:38            direct index ( temp float)
+0:38              '@sampleResultShadow' ( temp 4-component vector of float)
+0:38              Constant:
+0:38                0 (const uint)
+0:38          move second child to first child ( temp float)
+0:38            direct index ( temp float)
+0:38              c1: direct index for structure ( temp 2-component vector of float)
+0:38                '@sampleStructTemp' ( temp structure{ temp float c0,  temp 2-component vector of float c1,  temp float c2})
+0:38                Constant:
+0:38                  1 (const uint)
+0:38              Constant:
+0:38                0 (const int)
+0:38            direct index ( temp float)
+0:38              '@sampleResultShadow' ( temp 4-component vector of float)
+0:38              Constant:
+0:38                1 (const uint)
+0:38          move second child to first child ( temp float)
+0:38            direct index ( temp float)
+0:38              c1: direct index for structure ( temp 2-component vector of float)
+0:38                '@sampleStructTemp' ( temp structure{ temp float c0,  temp 2-component vector of float c1,  temp float c2})
+0:38                Constant:
+0:38                  1 (const uint)
+0:38              Constant:
+0:38                1 (const int)
+0:38            direct index ( temp float)
+0:38              '@sampleResultShadow' ( temp 4-component vector of float)
+0:38              Constant:
+0:38                2 (const uint)
+0:38          move second child to first child ( temp float)
+0:38            c2: direct index for structure ( temp float)
+0:38              '@sampleStructTemp' ( temp structure{ temp float c0,  temp 2-component vector of float c1,  temp float c2})
+0:38              Constant:
+0:38                2 (const uint)
+0:38            direct index ( temp float)
+0:38              '@sampleResultShadow' ( temp 4-component vector of float)
+0:38              Constant:
+0:38                3 (const uint)
+0:38          '@sampleStructTemp' ( temp structure{ temp float c0,  temp 2-component vector of float c1,  temp float c2})
+0:39  Function Definition: fn1(t2-tx-struct1-1; ( temp structure{ temp float c0,  temp 3-component vector of float c1})
+0:39    Function Parameters: 
+0:39      't2' ( in texture2D)
+0:?     Sequence
+0:39      Branch: Return with expression
+0:39        Sequence
+0:39          move second child to first child ( temp 4-component vector of float)
+0:39            '@sampleResultShadow' ( temp 4-component vector of float)
+0:?             texture ( temp 4-component vector of float)
+0:39              Construct combined texture-sampler ( temp sampler2D)
+0:39                't2' ( in texture2D)
+0:39                'g_sSamp' ( uniform sampler)
+0:?               Constant:
+0:?                 0.600000
+0:?                 0.610000
+0:39          move second child to first child ( temp float)
+0:39            c0: direct index for structure ( temp float)
+0:39              '@sampleStructTemp' ( temp structure{ temp float c0,  temp 3-component vector of float c1})
+0:39              Constant:
+0:39                0 (const uint)
+0:39            direct index ( temp float)
+0:39              '@sampleResultShadow' ( temp 4-component vector of float)
+0:39              Constant:
+0:39                0 (const uint)
+0:39          move second child to first child ( temp float)
+0:39            direct index ( temp float)
+0:39              c1: direct index for structure ( temp 3-component vector of float)
+0:39                '@sampleStructTemp' ( temp structure{ temp float c0,  temp 3-component vector of float c1})
+0:39                Constant:
+0:39                  1 (const uint)
+0:39              Constant:
+0:39                0 (const int)
+0:39            direct index ( temp float)
+0:39              '@sampleResultShadow' ( temp 4-component vector of float)
+0:39              Constant:
+0:39                1 (const uint)
+0:39          move second child to first child ( temp float)
+0:39            direct index ( temp float)
+0:39              c1: direct index for structure ( temp 3-component vector of float)
+0:39                '@sampleStructTemp' ( temp structure{ temp float c0,  temp 3-component vector of float c1})
+0:39                Constant:
+0:39                  1 (const uint)
+0:39              Constant:
+0:39                1 (const int)
+0:39            direct index ( temp float)
+0:39              '@sampleResultShadow' ( temp 4-component vector of float)
+0:39              Constant:
+0:39                2 (const uint)
+0:39          move second child to first child ( temp float)
+0:39            direct index ( temp float)
+0:39              c1: direct index for structure ( temp 3-component vector of float)
+0:39                '@sampleStructTemp' ( temp structure{ temp float c0,  temp 3-component vector of float c1})
+0:39                Constant:
+0:39                  1 (const uint)
+0:39              Constant:
+0:39                2 (const int)
+0:39            direct index ( temp float)
+0:39              '@sampleResultShadow' ( temp 4-component vector of float)
+0:39              Constant:
+0:39                3 (const uint)
+0:39          '@sampleStructTemp' ( temp structure{ temp float c0,  temp 3-component vector of float c1})
+0:42  Function Definition: @main( ( temp 4-component vector of float)
+0:42    Function Parameters: 
+0:?     Sequence
+0:43      Sequence
+0:43        move second child to first child ( temp structure{ temp float c0,  temp 2-component vector of float c1,  temp float c2})
+0:43          's1' ( temp structure{ temp float c0,  temp 2-component vector of float c1,  temp float c2})
+0:43          Sequence
+0:43            move second child to first child ( temp 4-component vector of float)
+0:43              '@sampleResultShadow' ( temp 4-component vector of float)
+0:?               texture ( temp 4-component vector of float)
+0:43                Construct combined texture-sampler ( temp sampler2D)
+0:43                  'g_tTex2s1' ( uniform texture2D)
+0:43                  'g_sSamp' ( uniform sampler)
+0:?                 Constant:
+0:?                   0.100000
+0:?                   0.110000
+0:43            move second child to first child ( temp float)
+0:43              c0: direct index for structure ( temp float)
+0:43                '@sampleStructTemp' ( temp structure{ temp float c0,  temp 2-component vector of float c1,  temp float c2})
+0:43                Constant:
+0:43                  0 (const uint)
+0:43              direct index ( temp float)
+0:43                '@sampleResultShadow' ( temp 4-component vector of float)
+0:43                Constant:
+0:43                  0 (const uint)
+0:43            move second child to first child ( temp float)
+0:43              direct index ( temp float)
+0:43                c1: direct index for structure ( temp 2-component vector of float)
+0:43                  '@sampleStructTemp' ( temp structure{ temp float c0,  temp 2-component vector of float c1,  temp float c2})
+0:43                  Constant:
+0:43                    1 (const uint)
+0:43                Constant:
+0:43                  0 (const int)
+0:43              direct index ( temp float)
+0:43                '@sampleResultShadow' ( temp 4-component vector of float)
+0:43                Constant:
+0:43                  1 (const uint)
+0:43            move second child to first child ( temp float)
+0:43              direct index ( temp float)
+0:43                c1: direct index for structure ( temp 2-component vector of float)
+0:43                  '@sampleStructTemp' ( temp structure{ temp float c0,  temp 2-component vector of float c1,  temp float c2})
+0:43                  Constant:
+0:43                    1 (const uint)
+0:43                Constant:
+0:43                  1 (const int)
+0:43              direct index ( temp float)
+0:43                '@sampleResultShadow' ( temp 4-component vector of float)
+0:43                Constant:
+0:43                  2 (const uint)
+0:43            move second child to first child ( temp float)
+0:43              c2: direct index for structure ( temp float)
+0:43                '@sampleStructTemp' ( temp structure{ temp float c0,  temp 2-component vector of float c1,  temp float c2})
+0:43                Constant:
+0:43                  2 (const uint)
+0:43              direct index ( temp float)
+0:43                '@sampleResultShadow' ( temp 4-component vector of float)
+0:43                Constant:
+0:43                  3 (const uint)
+0:43            '@sampleStructTemp' ( temp structure{ temp float c0,  temp 2-component vector of float c1,  temp float c2})
+0:44      Sequence
+0:44        move second child to first child ( temp structure{ temp float c0,  temp 3-component vector of float c1})
+0:44          's2' ( temp structure{ temp float c0,  temp 3-component vector of float c1})
+0:44          Sequence
+0:44            move second child to first child ( temp 4-component vector of float)
+0:44              '@sampleResultShadow' ( temp 4-component vector of float)
+0:?               texture ( temp 4-component vector of float)
+0:44                Construct combined texture-sampler ( temp sampler2D)
+0:44                  'g_tTex2s2' ( uniform texture2D)
+0:44                  'g_sSamp' ( uniform sampler)
+0:?                 Constant:
+0:?                   0.200000
+0:?                   0.210000
+0:44            move second child to first child ( temp float)
+0:44              c0: direct index for structure ( temp float)
+0:44                '@sampleStructTemp' ( temp structure{ temp float c0,  temp 3-component vector of float c1})
+0:44                Constant:
+0:44                  0 (const uint)
+0:44              direct index ( temp float)
+0:44                '@sampleResultShadow' ( temp 4-component vector of float)
+0:44                Constant:
+0:44                  0 (const uint)
+0:44            move second child to first child ( temp float)
+0:44              direct index ( temp float)
+0:44                c1: direct index for structure ( temp 3-component vector of float)
+0:44                  '@sampleStructTemp' ( temp structure{ temp float c0,  temp 3-component vector of float c1})
+0:44                  Constant:
+0:44                    1 (const uint)
+0:44                Constant:
+0:44                  0 (const int)
+0:44              direct index ( temp float)
+0:44                '@sampleResultShadow' ( temp 4-component vector of float)
+0:44                Constant:
+0:44                  1 (const uint)
+0:44            move second child to first child ( temp float)
+0:44              direct index ( temp float)
+0:44                c1: direct index for structure ( temp 3-component vector of float)
+0:44                  '@sampleStructTemp' ( temp structure{ temp float c0,  temp 3-component vector of float c1})
+0:44                  Constant:
+0:44                    1 (const uint)
+0:44                Constant:
+0:44                  1 (const int)
+0:44              direct index ( temp float)
+0:44                '@sampleResultShadow' ( temp 4-component vector of float)
+0:44                Constant:
+0:44                  2 (const uint)
+0:44            move second child to first child ( temp float)
+0:44              direct index ( temp float)
+0:44                c1: direct index for structure ( temp 3-component vector of float)
+0:44                  '@sampleStructTemp' ( temp structure{ temp float c0,  temp 3-component vector of float c1})
+0:44                  Constant:
+0:44                    1 (const uint)
+0:44                Constant:
+0:44                  2 (const int)
+0:44              direct index ( temp float)
+0:44                '@sampleResultShadow' ( temp 4-component vector of float)
+0:44                Constant:
+0:44                  3 (const uint)
+0:44            '@sampleStructTemp' ( temp structure{ temp float c0,  temp 3-component vector of float c1})
+0:45      Sequence
+0:45        move second child to first child ( temp structure{ temp 2-component vector of float c0,  temp 1-component vector of float c1})
+0:45          's3' ( temp structure{ temp 2-component vector of float c0,  temp 1-component vector of float c1})
+0:45          Sequence
+0:45            move second child to first child ( temp 4-component vector of float)
+0:45              '@sampleResultShadow' ( temp 4-component vector of float)
+0:?               texture ( temp 4-component vector of float)
+0:45                Construct combined texture-sampler ( temp sampler2D)
+0:45                  'g_tTex2s3' ( uniform texture2D)
+0:45                  'g_sSamp' ( uniform sampler)
+0:?                 Constant:
+0:?                   0.300000
+0:?                   0.310000
+0:45            move second child to first child ( temp float)
+0:45              direct index ( temp float)
+0:45                c0: direct index for structure ( temp 2-component vector of float)
+0:45                  '@sampleStructTemp' ( temp structure{ temp 2-component vector of float c0,  temp 1-component vector of float c1})
+0:45                  Constant:
+0:45                    0 (const uint)
+0:45                Constant:
+0:45                  0 (const int)
+0:45              direct index ( temp float)
+0:45                '@sampleResultShadow' ( temp 4-component vector of float)
+0:45                Constant:
+0:45                  0 (const uint)
+0:45            move second child to first child ( temp float)
+0:45              direct index ( temp float)
+0:45                c0: direct index for structure ( temp 2-component vector of float)
+0:45                  '@sampleStructTemp' ( temp structure{ temp 2-component vector of float c0,  temp 1-component vector of float c1})
+0:45                  Constant:
+0:45                    0 (const uint)
+0:45                Constant:
+0:45                  1 (const int)
+0:45              direct index ( temp float)
+0:45                '@sampleResultShadow' ( temp 4-component vector of float)
+0:45                Constant:
+0:45                  1 (const uint)
+0:45            move second child to first child ( temp float)
+0:45              direct index ( temp float)
+0:45                c1: direct index for structure ( temp 1-component vector of float)
+0:45                  '@sampleStructTemp' ( temp structure{ temp 2-component vector of float c0,  temp 1-component vector of float c1})
+0:45                  Constant:
+0:45                    1 (const uint)
+0:45                Constant:
+0:45                  0 (const int)
+0:45              direct index ( temp float)
+0:45                '@sampleResultShadow' ( temp 4-component vector of float)
+0:45                Constant:
+0:45                  2 (const uint)
+0:45            '@sampleStructTemp' ( temp structure{ temp 2-component vector of float c0,  temp 1-component vector of float c1})
+0:46      Sequence
+0:46        move second child to first child ( temp structure{ temp int c0,  temp 2-component vector of int c1,  temp int c2})
+0:46          's4' ( temp structure{ temp int c0,  temp 2-component vector of int c1,  temp int c2})
+0:46          Sequence
+0:46            move second child to first child ( temp 4-component vector of int)
+0:46              '@sampleResultShadow' ( temp 4-component vector of int)
+0:?               texture ( temp 4-component vector of int)
+0:46                Construct combined texture-sampler ( temp isampler2D)
+0:46                  'g_tTex2s4' ( uniform itexture2D)
+0:46                  'g_sSamp' ( uniform sampler)
+0:?                 Constant:
+0:?                   0.400000
+0:?                   0.410000
+0:46            move second child to first child ( temp int)
+0:46              c0: direct index for structure ( temp int)
+0:46                '@sampleStructTemp' ( temp structure{ temp int c0,  temp 2-component vector of int c1,  temp int c2})
+0:46                Constant:
+0:46                  0 (const uint)
+0:46              direct index ( temp int)
+0:46                '@sampleResultShadow' ( temp 4-component vector of int)
+0:46                Constant:
+0:46                  0 (const uint)
+0:46            move second child to first child ( temp float)
+0:46              direct index ( temp float)
+0:46                c1: direct index for structure ( temp 2-component vector of int)
+0:46                  '@sampleStructTemp' ( temp structure{ temp int c0,  temp 2-component vector of int c1,  temp int c2})
+0:46                  Constant:
+0:46                    1 (const uint)
+0:46                Constant:
+0:46                  0 (const int)
+0:46              Convert int to float ( temp float)
+0:46                direct index ( temp int)
+0:46                  '@sampleResultShadow' ( temp 4-component vector of int)
+0:46                  Constant:
+0:46                    1 (const uint)
+0:46            move second child to first child ( temp float)
+0:46              direct index ( temp float)
+0:46                c1: direct index for structure ( temp 2-component vector of int)
+0:46                  '@sampleStructTemp' ( temp structure{ temp int c0,  temp 2-component vector of int c1,  temp int c2})
+0:46                  Constant:
+0:46                    1 (const uint)
+0:46                Constant:
+0:46                  1 (const int)
+0:46              Convert int to float ( temp float)
+0:46                direct index ( temp int)
+0:46                  '@sampleResultShadow' ( temp 4-component vector of int)
+0:46                  Constant:
+0:46                    2 (const uint)
+0:46            move second child to first child ( temp int)
+0:46              c2: direct index for structure ( temp int)
+0:46                '@sampleStructTemp' ( temp structure{ temp int c0,  temp 2-component vector of int c1,  temp int c2})
+0:46                Constant:
+0:46                  2 (const uint)
+0:46              direct index ( temp int)
+0:46                '@sampleResultShadow' ( temp 4-component vector of int)
+0:46                Constant:
+0:46                  3 (const uint)
+0:46            '@sampleStructTemp' ( temp structure{ temp int c0,  temp 2-component vector of int c1,  temp int c2})
+0:47      Sequence
+0:47        move second child to first child ( temp structure{ temp uint c0,  temp uint c1})
+0:47          's5' ( temp structure{ temp uint c0,  temp uint c1})
+0:47          Sequence
+0:47            move second child to first child ( temp 4-component vector of uint)
+0:47              '@sampleResultShadow' ( temp 4-component vector of uint)
+0:?               texture ( temp 4-component vector of uint)
+0:47                Construct combined texture-sampler ( temp usampler2D)
+0:47                  'g_tTex2s5' ( uniform utexture2D)
+0:47                  'g_sSamp' ( uniform sampler)
+0:?                 Constant:
+0:?                   0.500000
+0:?                   0.510000
+0:47            move second child to first child ( temp uint)
+0:47              c0: direct index for structure ( temp uint)
+0:47                '@sampleStructTemp' ( temp structure{ temp uint c0,  temp uint c1})
+0:47                Constant:
+0:47                  0 (const uint)
+0:47              direct index ( temp uint)
+0:47                '@sampleResultShadow' ( temp 4-component vector of uint)
+0:47                Constant:
+0:47                  0 (const uint)
+0:47            move second child to first child ( temp uint)
+0:47              c1: direct index for structure ( temp uint)
+0:47                '@sampleStructTemp' ( temp structure{ temp uint c0,  temp uint c1})
+0:47                Constant:
+0:47                  1 (const uint)
+0:47              direct index ( temp uint)
+0:47                '@sampleResultShadow' ( temp 4-component vector of uint)
+0:47                Constant:
+0:47                  1 (const uint)
+0:47            '@sampleStructTemp' ( temp structure{ temp uint c0,  temp uint c1})
+0:49      Sequence
+0:49        move second child to first child ( temp structure{ temp float c0,  temp 2-component vector of float c1,  temp float c2})
+0:49          'r0' ( temp structure{ temp float c0,  temp 2-component vector of float c1,  temp float c2})
+0:49          Function Call: fn1(t2-tx-struct0-1; ( temp structure{ temp float c0,  temp 2-component vector of float c1,  temp float c2})
+0:49            'g_tTex2s1' ( uniform texture2D)
+0:50      Sequence
+0:50        move second child to first child ( temp structure{ temp float c0,  temp 3-component vector of float c1})
+0:50          'r1' ( temp structure{ temp float c0,  temp 3-component vector of float c1})
+0:50          Function Call: fn1(t2-tx-struct1-1; ( temp structure{ temp float c0,  temp 3-component vector of float c1})
+0:50            'g_tTex2s2' ( uniform texture2D)
+0:51      Sequence
+0:51        move second child to first child ( temp structure{ temp float c0,  temp 2-component vector of float c1,  temp float c2})
+0:51          'r2' ( temp structure{ temp float c0,  temp 2-component vector of float c1,  temp float c2})
+0:51          Function Call: fn1(t2-tx-struct0-1; ( temp structure{ temp float c0,  temp 2-component vector of float c1,  temp float c2})
+0:51            'g_tTex2s1a' ( uniform texture2D)
+0:53      Branch: Return with expression
+0:53        Constant:
+0:53          0.000000
+0:53          0.000000
+0:53          0.000000
+0:53          0.000000
+0:42  Function Definition: main( ( temp void)
+0:42    Function Parameters: 
+0:?     Sequence
+0:42      move second child to first child ( temp 4-component vector of float)
+0:?         '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+0:42        Function Call: @main( ( temp 4-component vector of float)
+0:?   Linker Objects
+0:?     'g_sSamp' ( uniform sampler)
+0:?     'g_tTex2s1' ( uniform texture2D)
+0:?     'g_tTex2s2' ( uniform texture2D)
+0:?     'g_tTex2s3' ( uniform texture2D)
+0:?     'g_tTex2s4' ( uniform itexture2D)
+0:?     'g_tTex2s5' ( uniform utexture2D)
+0:?     'g_tTex2s1a' ( uniform texture2D)
+0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+
+
+Linked fragment stage:
+
+
+Shader version: 500
+gl_FragCoord origin is upper left
+0:? Sequence
+0:38  Function Definition: fn1(t2-tx-struct0-1; ( temp structure{ temp float c0,  temp 2-component vector of float c1,  temp float c2})
+0:38    Function Parameters: 
+0:38      't1' ( in texture2D)
+0:?     Sequence
+0:38      Branch: Return with expression
+0:38        Sequence
+0:38          move second child to first child ( temp 4-component vector of float)
+0:38            '@sampleResultShadow' ( temp 4-component vector of float)
+0:?             texture ( temp 4-component vector of float)
+0:38              Construct combined texture-sampler ( temp sampler2D)
+0:38                't1' ( in texture2D)
+0:38                'g_sSamp' ( uniform sampler)
+0:?               Constant:
+0:?                 0.600000
+0:?                 0.610000
+0:38          move second child to first child ( temp float)
+0:38            c0: direct index for structure ( temp float)
+0:38              '@sampleStructTemp' ( temp structure{ temp float c0,  temp 2-component vector of float c1,  temp float c2})
+0:38              Constant:
+0:38                0 (const uint)
+0:38            direct index ( temp float)
+0:38              '@sampleResultShadow' ( temp 4-component vector of float)
+0:38              Constant:
+0:38                0 (const uint)
+0:38          move second child to first child ( temp float)
+0:38            direct index ( temp float)
+0:38              c1: direct index for structure ( temp 2-component vector of float)
+0:38                '@sampleStructTemp' ( temp structure{ temp float c0,  temp 2-component vector of float c1,  temp float c2})
+0:38                Constant:
+0:38                  1 (const uint)
+0:38              Constant:
+0:38                0 (const int)
+0:38            direct index ( temp float)
+0:38              '@sampleResultShadow' ( temp 4-component vector of float)
+0:38              Constant:
+0:38                1 (const uint)
+0:38          move second child to first child ( temp float)
+0:38            direct index ( temp float)
+0:38              c1: direct index for structure ( temp 2-component vector of float)
+0:38                '@sampleStructTemp' ( temp structure{ temp float c0,  temp 2-component vector of float c1,  temp float c2})
+0:38                Constant:
+0:38                  1 (const uint)
+0:38              Constant:
+0:38                1 (const int)
+0:38            direct index ( temp float)
+0:38              '@sampleResultShadow' ( temp 4-component vector of float)
+0:38              Constant:
+0:38                2 (const uint)
+0:38          move second child to first child ( temp float)
+0:38            c2: direct index for structure ( temp float)
+0:38              '@sampleStructTemp' ( temp structure{ temp float c0,  temp 2-component vector of float c1,  temp float c2})
+0:38              Constant:
+0:38                2 (const uint)
+0:38            direct index ( temp float)
+0:38              '@sampleResultShadow' ( temp 4-component vector of float)
+0:38              Constant:
+0:38                3 (const uint)
+0:38          '@sampleStructTemp' ( temp structure{ temp float c0,  temp 2-component vector of float c1,  temp float c2})
+0:39  Function Definition: fn1(t2-tx-struct1-1; ( temp structure{ temp float c0,  temp 3-component vector of float c1})
+0:39    Function Parameters: 
+0:39      't2' ( in texture2D)
+0:?     Sequence
+0:39      Branch: Return with expression
+0:39        Sequence
+0:39          move second child to first child ( temp 4-component vector of float)
+0:39            '@sampleResultShadow' ( temp 4-component vector of float)
+0:?             texture ( temp 4-component vector of float)
+0:39              Construct combined texture-sampler ( temp sampler2D)
+0:39                't2' ( in texture2D)
+0:39                'g_sSamp' ( uniform sampler)
+0:?               Constant:
+0:?                 0.600000
+0:?                 0.610000
+0:39          move second child to first child ( temp float)
+0:39            c0: direct index for structure ( temp float)
+0:39              '@sampleStructTemp' ( temp structure{ temp float c0,  temp 3-component vector of float c1})
+0:39              Constant:
+0:39                0 (const uint)
+0:39            direct index ( temp float)
+0:39              '@sampleResultShadow' ( temp 4-component vector of float)
+0:39              Constant:
+0:39                0 (const uint)
+0:39          move second child to first child ( temp float)
+0:39            direct index ( temp float)
+0:39              c1: direct index for structure ( temp 3-component vector of float)
+0:39                '@sampleStructTemp' ( temp structure{ temp float c0,  temp 3-component vector of float c1})
+0:39                Constant:
+0:39                  1 (const uint)
+0:39              Constant:
+0:39                0 (const int)
+0:39            direct index ( temp float)
+0:39              '@sampleResultShadow' ( temp 4-component vector of float)
+0:39              Constant:
+0:39                1 (const uint)
+0:39          move second child to first child ( temp float)
+0:39            direct index ( temp float)
+0:39              c1: direct index for structure ( temp 3-component vector of float)
+0:39                '@sampleStructTemp' ( temp structure{ temp float c0,  temp 3-component vector of float c1})
+0:39                Constant:
+0:39                  1 (const uint)
+0:39              Constant:
+0:39                1 (const int)
+0:39            direct index ( temp float)
+0:39              '@sampleResultShadow' ( temp 4-component vector of float)
+0:39              Constant:
+0:39                2 (const uint)
+0:39          move second child to first child ( temp float)
+0:39            direct index ( temp float)
+0:39              c1: direct index for structure ( temp 3-component vector of float)
+0:39                '@sampleStructTemp' ( temp structure{ temp float c0,  temp 3-component vector of float c1})
+0:39                Constant:
+0:39                  1 (const uint)
+0:39              Constant:
+0:39                2 (const int)
+0:39            direct index ( temp float)
+0:39              '@sampleResultShadow' ( temp 4-component vector of float)
+0:39              Constant:
+0:39                3 (const uint)
+0:39          '@sampleStructTemp' ( temp structure{ temp float c0,  temp 3-component vector of float c1})
+0:42  Function Definition: @main( ( temp 4-component vector of float)
+0:42    Function Parameters: 
+0:?     Sequence
+0:43      Sequence
+0:43        move second child to first child ( temp structure{ temp float c0,  temp 2-component vector of float c1,  temp float c2})
+0:43          's1' ( temp structure{ temp float c0,  temp 2-component vector of float c1,  temp float c2})
+0:43          Sequence
+0:43            move second child to first child ( temp 4-component vector of float)
+0:43              '@sampleResultShadow' ( temp 4-component vector of float)
+0:?               texture ( temp 4-component vector of float)
+0:43                Construct combined texture-sampler ( temp sampler2D)
+0:43                  'g_tTex2s1' ( uniform texture2D)
+0:43                  'g_sSamp' ( uniform sampler)
+0:?                 Constant:
+0:?                   0.100000
+0:?                   0.110000
+0:43            move second child to first child ( temp float)
+0:43              c0: direct index for structure ( temp float)
+0:43                '@sampleStructTemp' ( temp structure{ temp float c0,  temp 2-component vector of float c1,  temp float c2})
+0:43                Constant:
+0:43                  0 (const uint)
+0:43              direct index ( temp float)
+0:43                '@sampleResultShadow' ( temp 4-component vector of float)
+0:43                Constant:
+0:43                  0 (const uint)
+0:43            move second child to first child ( temp float)
+0:43              direct index ( temp float)
+0:43                c1: direct index for structure ( temp 2-component vector of float)
+0:43                  '@sampleStructTemp' ( temp structure{ temp float c0,  temp 2-component vector of float c1,  temp float c2})
+0:43                  Constant:
+0:43                    1 (const uint)
+0:43                Constant:
+0:43                  0 (const int)
+0:43              direct index ( temp float)
+0:43                '@sampleResultShadow' ( temp 4-component vector of float)
+0:43                Constant:
+0:43                  1 (const uint)
+0:43            move second child to first child ( temp float)
+0:43              direct index ( temp float)
+0:43                c1: direct index for structure ( temp 2-component vector of float)
+0:43                  '@sampleStructTemp' ( temp structure{ temp float c0,  temp 2-component vector of float c1,  temp float c2})
+0:43                  Constant:
+0:43                    1 (const uint)
+0:43                Constant:
+0:43                  1 (const int)
+0:43              direct index ( temp float)
+0:43                '@sampleResultShadow' ( temp 4-component vector of float)
+0:43                Constant:
+0:43                  2 (const uint)
+0:43            move second child to first child ( temp float)
+0:43              c2: direct index for structure ( temp float)
+0:43                '@sampleStructTemp' ( temp structure{ temp float c0,  temp 2-component vector of float c1,  temp float c2})
+0:43                Constant:
+0:43                  2 (const uint)
+0:43              direct index ( temp float)
+0:43                '@sampleResultShadow' ( temp 4-component vector of float)
+0:43                Constant:
+0:43                  3 (const uint)
+0:43            '@sampleStructTemp' ( temp structure{ temp float c0,  temp 2-component vector of float c1,  temp float c2})
+0:44      Sequence
+0:44        move second child to first child ( temp structure{ temp float c0,  temp 3-component vector of float c1})
+0:44          's2' ( temp structure{ temp float c0,  temp 3-component vector of float c1})
+0:44          Sequence
+0:44            move second child to first child ( temp 4-component vector of float)
+0:44              '@sampleResultShadow' ( temp 4-component vector of float)
+0:?               texture ( temp 4-component vector of float)
+0:44                Construct combined texture-sampler ( temp sampler2D)
+0:44                  'g_tTex2s2' ( uniform texture2D)
+0:44                  'g_sSamp' ( uniform sampler)
+0:?                 Constant:
+0:?                   0.200000
+0:?                   0.210000
+0:44            move second child to first child ( temp float)
+0:44              c0: direct index for structure ( temp float)
+0:44                '@sampleStructTemp' ( temp structure{ temp float c0,  temp 3-component vector of float c1})
+0:44                Constant:
+0:44                  0 (const uint)
+0:44              direct index ( temp float)
+0:44                '@sampleResultShadow' ( temp 4-component vector of float)
+0:44                Constant:
+0:44                  0 (const uint)
+0:44            move second child to first child ( temp float)
+0:44              direct index ( temp float)
+0:44                c1: direct index for structure ( temp 3-component vector of float)
+0:44                  '@sampleStructTemp' ( temp structure{ temp float c0,  temp 3-component vector of float c1})
+0:44                  Constant:
+0:44                    1 (const uint)
+0:44                Constant:
+0:44                  0 (const int)
+0:44              direct index ( temp float)
+0:44                '@sampleResultShadow' ( temp 4-component vector of float)
+0:44                Constant:
+0:44                  1 (const uint)
+0:44            move second child to first child ( temp float)
+0:44              direct index ( temp float)
+0:44                c1: direct index for structure ( temp 3-component vector of float)
+0:44                  '@sampleStructTemp' ( temp structure{ temp float c0,  temp 3-component vector of float c1})
+0:44                  Constant:
+0:44                    1 (const uint)
+0:44                Constant:
+0:44                  1 (const int)
+0:44              direct index ( temp float)
+0:44                '@sampleResultShadow' ( temp 4-component vector of float)
+0:44                Constant:
+0:44                  2 (const uint)
+0:44            move second child to first child ( temp float)
+0:44              direct index ( temp float)
+0:44                c1: direct index for structure ( temp 3-component vector of float)
+0:44                  '@sampleStructTemp' ( temp structure{ temp float c0,  temp 3-component vector of float c1})
+0:44                  Constant:
+0:44                    1 (const uint)
+0:44                Constant:
+0:44                  2 (const int)
+0:44              direct index ( temp float)
+0:44                '@sampleResultShadow' ( temp 4-component vector of float)
+0:44                Constant:
+0:44                  3 (const uint)
+0:44            '@sampleStructTemp' ( temp structure{ temp float c0,  temp 3-component vector of float c1})
+0:45      Sequence
+0:45        move second child to first child ( temp structure{ temp 2-component vector of float c0,  temp 1-component vector of float c1})
+0:45          's3' ( temp structure{ temp 2-component vector of float c0,  temp 1-component vector of float c1})
+0:45          Sequence
+0:45            move second child to first child ( temp 4-component vector of float)
+0:45              '@sampleResultShadow' ( temp 4-component vector of float)
+0:?               texture ( temp 4-component vector of float)
+0:45                Construct combined texture-sampler ( temp sampler2D)
+0:45                  'g_tTex2s3' ( uniform texture2D)
+0:45                  'g_sSamp' ( uniform sampler)
+0:?                 Constant:
+0:?                   0.300000
+0:?                   0.310000
+0:45            move second child to first child ( temp float)
+0:45              direct index ( temp float)
+0:45                c0: direct index for structure ( temp 2-component vector of float)
+0:45                  '@sampleStructTemp' ( temp structure{ temp 2-component vector of float c0,  temp 1-component vector of float c1})
+0:45                  Constant:
+0:45                    0 (const uint)
+0:45                Constant:
+0:45                  0 (const int)
+0:45              direct index ( temp float)
+0:45                '@sampleResultShadow' ( temp 4-component vector of float)
+0:45                Constant:
+0:45                  0 (const uint)
+0:45            move second child to first child ( temp float)
+0:45              direct index ( temp float)
+0:45                c0: direct index for structure ( temp 2-component vector of float)
+0:45                  '@sampleStructTemp' ( temp structure{ temp 2-component vector of float c0,  temp 1-component vector of float c1})
+0:45                  Constant:
+0:45                    0 (const uint)
+0:45                Constant:
+0:45                  1 (const int)
+0:45              direct index ( temp float)
+0:45                '@sampleResultShadow' ( temp 4-component vector of float)
+0:45                Constant:
+0:45                  1 (const uint)
+0:45            move second child to first child ( temp float)
+0:45              direct index ( temp float)
+0:45                c1: direct index for structure ( temp 1-component vector of float)
+0:45                  '@sampleStructTemp' ( temp structure{ temp 2-component vector of float c0,  temp 1-component vector of float c1})
+0:45                  Constant:
+0:45                    1 (const uint)
+0:45                Constant:
+0:45                  0 (const int)
+0:45              direct index ( temp float)
+0:45                '@sampleResultShadow' ( temp 4-component vector of float)
+0:45                Constant:
+0:45                  2 (const uint)
+0:45            '@sampleStructTemp' ( temp structure{ temp 2-component vector of float c0,  temp 1-component vector of float c1})
+0:46      Sequence
+0:46        move second child to first child ( temp structure{ temp int c0,  temp 2-component vector of int c1,  temp int c2})
+0:46          's4' ( temp structure{ temp int c0,  temp 2-component vector of int c1,  temp int c2})
+0:46          Sequence
+0:46            move second child to first child ( temp 4-component vector of int)
+0:46              '@sampleResultShadow' ( temp 4-component vector of int)
+0:?               texture ( temp 4-component vector of int)
+0:46                Construct combined texture-sampler ( temp isampler2D)
+0:46                  'g_tTex2s4' ( uniform itexture2D)
+0:46                  'g_sSamp' ( uniform sampler)
+0:?                 Constant:
+0:?                   0.400000
+0:?                   0.410000
+0:46            move second child to first child ( temp int)
+0:46              c0: direct index for structure ( temp int)
+0:46                '@sampleStructTemp' ( temp structure{ temp int c0,  temp 2-component vector of int c1,  temp int c2})
+0:46                Constant:
+0:46                  0 (const uint)
+0:46              direct index ( temp int)
+0:46                '@sampleResultShadow' ( temp 4-component vector of int)
+0:46                Constant:
+0:46                  0 (const uint)
+0:46            move second child to first child ( temp float)
+0:46              direct index ( temp float)
+0:46                c1: direct index for structure ( temp 2-component vector of int)
+0:46                  '@sampleStructTemp' ( temp structure{ temp int c0,  temp 2-component vector of int c1,  temp int c2})
+0:46                  Constant:
+0:46                    1 (const uint)
+0:46                Constant:
+0:46                  0 (const int)
+0:46              Convert int to float ( temp float)
+0:46                direct index ( temp int)
+0:46                  '@sampleResultShadow' ( temp 4-component vector of int)
+0:46                  Constant:
+0:46                    1 (const uint)
+0:46            move second child to first child ( temp float)
+0:46              direct index ( temp float)
+0:46                c1: direct index for structure ( temp 2-component vector of int)
+0:46                  '@sampleStructTemp' ( temp structure{ temp int c0,  temp 2-component vector of int c1,  temp int c2})
+0:46                  Constant:
+0:46                    1 (const uint)
+0:46                Constant:
+0:46                  1 (const int)
+0:46              Convert int to float ( temp float)
+0:46                direct index ( temp int)
+0:46                  '@sampleResultShadow' ( temp 4-component vector of int)
+0:46                  Constant:
+0:46                    2 (const uint)
+0:46            move second child to first child ( temp int)
+0:46              c2: direct index for structure ( temp int)
+0:46                '@sampleStructTemp' ( temp structure{ temp int c0,  temp 2-component vector of int c1,  temp int c2})
+0:46                Constant:
+0:46                  2 (const uint)
+0:46              direct index ( temp int)
+0:46                '@sampleResultShadow' ( temp 4-component vector of int)
+0:46                Constant:
+0:46                  3 (const uint)
+0:46            '@sampleStructTemp' ( temp structure{ temp int c0,  temp 2-component vector of int c1,  temp int c2})
+0:47      Sequence
+0:47        move second child to first child ( temp structure{ temp uint c0,  temp uint c1})
+0:47          's5' ( temp structure{ temp uint c0,  temp uint c1})
+0:47          Sequence
+0:47            move second child to first child ( temp 4-component vector of uint)
+0:47              '@sampleResultShadow' ( temp 4-component vector of uint)
+0:?               texture ( temp 4-component vector of uint)
+0:47                Construct combined texture-sampler ( temp usampler2D)
+0:47                  'g_tTex2s5' ( uniform utexture2D)
+0:47                  'g_sSamp' ( uniform sampler)
+0:?                 Constant:
+0:?                   0.500000
+0:?                   0.510000
+0:47            move second child to first child ( temp uint)
+0:47              c0: direct index for structure ( temp uint)
+0:47                '@sampleStructTemp' ( temp structure{ temp uint c0,  temp uint c1})
+0:47                Constant:
+0:47                  0 (const uint)
+0:47              direct index ( temp uint)
+0:47                '@sampleResultShadow' ( temp 4-component vector of uint)
+0:47                Constant:
+0:47                  0 (const uint)
+0:47            move second child to first child ( temp uint)
+0:47              c1: direct index for structure ( temp uint)
+0:47                '@sampleStructTemp' ( temp structure{ temp uint c0,  temp uint c1})
+0:47                Constant:
+0:47                  1 (const uint)
+0:47              direct index ( temp uint)
+0:47                '@sampleResultShadow' ( temp 4-component vector of uint)
+0:47                Constant:
+0:47                  1 (const uint)
+0:47            '@sampleStructTemp' ( temp structure{ temp uint c0,  temp uint c1})
+0:49      Sequence
+0:49        move second child to first child ( temp structure{ temp float c0,  temp 2-component vector of float c1,  temp float c2})
+0:49          'r0' ( temp structure{ temp float c0,  temp 2-component vector of float c1,  temp float c2})
+0:49          Function Call: fn1(t2-tx-struct0-1; ( temp structure{ temp float c0,  temp 2-component vector of float c1,  temp float c2})
+0:49            'g_tTex2s1' ( uniform texture2D)
+0:50      Sequence
+0:50        move second child to first child ( temp structure{ temp float c0,  temp 3-component vector of float c1})
+0:50          'r1' ( temp structure{ temp float c0,  temp 3-component vector of float c1})
+0:50          Function Call: fn1(t2-tx-struct1-1; ( temp structure{ temp float c0,  temp 3-component vector of float c1})
+0:50            'g_tTex2s2' ( uniform texture2D)
+0:51      Sequence
+0:51        move second child to first child ( temp structure{ temp float c0,  temp 2-component vector of float c1,  temp float c2})
+0:51          'r2' ( temp structure{ temp float c0,  temp 2-component vector of float c1,  temp float c2})
+0:51          Function Call: fn1(t2-tx-struct0-1; ( temp structure{ temp float c0,  temp 2-component vector of float c1,  temp float c2})
+0:51            'g_tTex2s1a' ( uniform texture2D)
+0:53      Branch: Return with expression
+0:53        Constant:
+0:53          0.000000
+0:53          0.000000
+0:53          0.000000
+0:53          0.000000
+0:42  Function Definition: main( ( temp void)
+0:42    Function Parameters: 
+0:?     Sequence
+0:42      move second child to first child ( temp 4-component vector of float)
+0:?         '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+0:42        Function Call: @main( ( temp 4-component vector of float)
+0:?   Linker Objects
+0:?     'g_sSamp' ( uniform sampler)
+0:?     'g_tTex2s1' ( uniform texture2D)
+0:?     'g_tTex2s2' ( uniform texture2D)
+0:?     'g_tTex2s3' ( uniform texture2D)
+0:?     'g_tTex2s4' ( uniform itexture2D)
+0:?     'g_tTex2s5' ( uniform utexture2D)
+0:?     'g_tTex2s1a' ( uniform texture2D)
+0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+
+error: SPIRV-Tools Validation Errors
+error: OpStore Pointer <id> '185's type does not match Object <id> '184's type.
+  OpStore %185 %184
+
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 240
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 238
+                              ExecutionMode 4 OriginUpperLeft
+                              Source HLSL 500
+                              Name 4  "main"
+                              Name 10  "s1_t"
+                              MemberName 10(s1_t) 0  "c0"
+                              MemberName 10(s1_t) 1  "c1"
+                              MemberName 10(s1_t) 2  "c2"
+                              Name 13  "fn1(t2-tx-struct0-1;"
+                              Name 12  "t1"
+                              Name 16  "s2_t"
+                              MemberName 16(s2_t) 0  "c0"
+                              MemberName 16(s2_t) 1  "c1"
+                              Name 19  "fn1(t2-tx-struct1-1;"
+                              Name 18  "t2"
+                              Name 23  "@main("
+                              Name 26  "@sampleResultShadow"
+                              Name 30  "g_sSamp"
+                              Name 39  "@sampleStructTemp"
+                              Name 65  "@sampleResultShadow"
+                              Name 71  "@sampleStructTemp"
+                              Name 87  "s1"
+                              Name 88  "@sampleResultShadow"
+                              Name 90  "g_tTex2s1"
+                              Name 98  "@sampleStructTemp"
+                              Name 112  "s2"
+                              Name 113  "@sampleResultShadow"
+                              Name 114  "g_tTex2s2"
+                              Name 122  "@sampleStructTemp"
+                              Name 136  "s3_t"
+                              MemberName 136(s3_t) 0  "c0"
+                              MemberName 136(s3_t) 1  "c1"
+                              Name 138  "s3"
+                              Name 139  "@sampleResultShadow"
+                              Name 140  "g_tTex2s3"
+                              Name 148  "@sampleStructTemp"
+                              Name 160  "s4_t"
+                              MemberName 160(s4_t) 0  "c0"
+                              MemberName 160(s4_t) 1  "c1"
+                              MemberName 160(s4_t) 2  "c2"
+                              Name 162  "s4"
+                              Name 165  "@sampleResultShadow"
+                              Name 168  "g_tTex2s4"
+                              Name 177  "@sampleStructTemp"
+                              Name 194  "s5_t"
+                              MemberName 194(s5_t) 0  "c0"
+                              MemberName 194(s5_t) 1  "c1"
+                              Name 196  "s5"
+                              Name 199  "@sampleResultShadow"
+                              Name 202  "g_tTex2s5"
+                              Name 211  "@sampleStructTemp"
+                              Name 220  "r0"
+                              Name 221  "param"
+                              Name 224  "r1"
+                              Name 225  "param"
+                              Name 228  "r2"
+                              Name 229  "g_tTex2s1a"
+                              Name 230  "param"
+                              Name 238  "@entryPointOutput"
+                              Decorate 30(g_sSamp) DescriptorSet 0
+                              Decorate 90(g_tTex2s1) DescriptorSet 0
+                              Decorate 114(g_tTex2s2) DescriptorSet 0
+                              Decorate 140(g_tTex2s3) DescriptorSet 0
+                              Decorate 168(g_tTex2s4) DescriptorSet 0
+                              Decorate 202(g_tTex2s5) DescriptorSet 0
+                              Decorate 229(g_tTex2s1a) DescriptorSet 0
+                              Decorate 238(@entryPointOutput) Location 0
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeImage 6(float) 2D sampled format:Unknown
+               8:             TypePointer Function 7
+               9:             TypeVector 6(float) 2
+        10(s1_t):             TypeStruct 6(float) 9(fvec2) 6(float)
+              11:             TypeFunction 10(s1_t) 8(ptr)
+              15:             TypeVector 6(float) 3
+        16(s2_t):             TypeStruct 6(float) 15(fvec3)
+              17:             TypeFunction 16(s2_t) 8(ptr)
+              21:             TypeVector 6(float) 4
+              22:             TypeFunction 21(fvec4)
+              25:             TypePointer Function 21(fvec4)
+              28:             TypeSampler
+              29:             TypePointer UniformConstant 28
+     30(g_sSamp):     29(ptr) Variable UniformConstant
+              32:             TypeSampledImage 7
+              34:    6(float) Constant 1058642330
+              35:    6(float) Constant 1058810102
+              36:    9(fvec2) ConstantComposite 34 35
+              38:             TypePointer Function 10(s1_t)
+              40:             TypeInt 32 1
+              41:     40(int) Constant 0
+              42:             TypeInt 32 0
+              43:     42(int) Constant 0
+              44:             TypePointer Function 6(float)
+              48:     40(int) Constant 1
+              49:     42(int) Constant 1
+              53:     42(int) Constant 2
+              57:     40(int) Constant 2
+              58:     42(int) Constant 3
+              70:             TypePointer Function 16(s2_t)
+              89:             TypePointer UniformConstant 7
+   90(g_tTex2s1):     89(ptr) Variable UniformConstant
+              94:    6(float) Constant 1036831949
+              95:    6(float) Constant 1038174126
+              96:    9(fvec2) ConstantComposite 94 95
+  114(g_tTex2s2):     89(ptr) Variable UniformConstant
+             118:    6(float) Constant 1045220557
+             119:    6(float) Constant 1045891645
+             120:    9(fvec2) ConstantComposite 118 119
+       136(s3_t):             TypeStruct 9(fvec2) 6(float)
+             137:             TypePointer Function 136(s3_t)
+  140(g_tTex2s3):     89(ptr) Variable UniformConstant
+             144:    6(float) Constant 1050253722
+             145:    6(float) Constant 1050589266
+             146:    9(fvec2) ConstantComposite 144 145
+             159:             TypeVector 40(int) 2
+       160(s4_t):             TypeStruct 40(int) 159(ivec2) 40(int)
+             161:             TypePointer Function 160(s4_t)
+             163:             TypeVector 40(int) 4
+             164:             TypePointer Function 163(ivec4)
+             166:             TypeImage 40(int) 2D sampled format:Unknown
+             167:             TypePointer UniformConstant 166
+  168(g_tTex2s4):    167(ptr) Variable UniformConstant
+             171:             TypeSampledImage 166
+             173:    6(float) Constant 1053609165
+             174:    6(float) Constant 1053944709
+             175:    9(fvec2) ConstantComposite 173 174
+             178:             TypePointer Function 40(int)
+       194(s5_t):             TypeStruct 42(int) 42(int)
+             195:             TypePointer Function 194(s5_t)
+             197:             TypeVector 42(int) 4
+             198:             TypePointer Function 197(ivec4)
+             200:             TypeImage 42(int) 2D sampled format:Unknown
+             201:             TypePointer UniformConstant 200
+  202(g_tTex2s5):    201(ptr) Variable UniformConstant
+             205:             TypeSampledImage 200
+             207:    6(float) Constant 1056964608
+             208:    6(float) Constant 1057132380
+             209:    9(fvec2) ConstantComposite 207 208
+             212:             TypePointer Function 42(int)
+ 229(g_tTex2s1a):     89(ptr) Variable UniformConstant
+             233:    6(float) Constant 0
+             234:   21(fvec4) ConstantComposite 233 233 233 233
+             237:             TypePointer Output 21(fvec4)
+238(@entryPointOutput):    237(ptr) Variable Output
+         4(main):           2 Function None 3
+               5:             Label
+             239:   21(fvec4) FunctionCall 23(@main()
+                              Store 238(@entryPointOutput) 239
+                              Return
+                              FunctionEnd
+13(fn1(t2-tx-struct0-1;):    10(s1_t) Function None 11
+          12(t1):      8(ptr) FunctionParameter
+              14:             Label
+26(@sampleResultShadow):     25(ptr) Variable Function
+39(@sampleStructTemp):     38(ptr) Variable Function
+              27:           7 Load 12(t1)
+              31:          28 Load 30(g_sSamp)
+              33:          32 SampledImage 27 31
+              37:   21(fvec4) ImageSampleImplicitLod 33 36
+                              Store 26(@sampleResultShadow) 37
+              45:     44(ptr) AccessChain 26(@sampleResultShadow) 43
+              46:    6(float) Load 45
+              47:     44(ptr) AccessChain 39(@sampleStructTemp) 41
+                              Store 47 46
+              50:     44(ptr) AccessChain 26(@sampleResultShadow) 49
+              51:    6(float) Load 50
+              52:     44(ptr) AccessChain 39(@sampleStructTemp) 48 43
+                              Store 52 51
+              54:     44(ptr) AccessChain 26(@sampleResultShadow) 53
+              55:    6(float) Load 54
+              56:     44(ptr) AccessChain 39(@sampleStructTemp) 48 49
+                              Store 56 55
+              59:     44(ptr) AccessChain 26(@sampleResultShadow) 58
+              60:    6(float) Load 59
+              61:     44(ptr) AccessChain 39(@sampleStructTemp) 57
+                              Store 61 60
+              62:    10(s1_t) Load 39(@sampleStructTemp)
+                              ReturnValue 62
+                              FunctionEnd
+19(fn1(t2-tx-struct1-1;):    16(s2_t) Function None 17
+          18(t2):      8(ptr) FunctionParameter
+              20:             Label
+65(@sampleResultShadow):     25(ptr) Variable Function
+71(@sampleStructTemp):     70(ptr) Variable Function
+              66:           7 Load 18(t2)
+              67:          28 Load 30(g_sSamp)
+              68:          32 SampledImage 66 67
+              69:   21(fvec4) ImageSampleImplicitLod 68 36
+                              Store 65(@sampleResultShadow) 69
+              72:     44(ptr) AccessChain 65(@sampleResultShadow) 43
+              73:    6(float) Load 72
+              74:     44(ptr) AccessChain 71(@sampleStructTemp) 41
+                              Store 74 73
+              75:     44(ptr) AccessChain 65(@sampleResultShadow) 49
+              76:    6(float) Load 75
+              77:     44(ptr) AccessChain 71(@sampleStructTemp) 48 43
+                              Store 77 76
+              78:     44(ptr) AccessChain 65(@sampleResultShadow) 53
+              79:    6(float) Load 78
+              80:     44(ptr) AccessChain 71(@sampleStructTemp) 48 49
+                              Store 80 79
+              81:     44(ptr) AccessChain 65(@sampleResultShadow) 58
+              82:    6(float) Load 81
+              83:     44(ptr) AccessChain 71(@sampleStructTemp) 48 53
+                              Store 83 82
+              84:    16(s2_t) Load 71(@sampleStructTemp)
+                              ReturnValue 84
+                              FunctionEnd
+      23(@main():   21(fvec4) Function None 22
+              24:             Label
+          87(s1):     38(ptr) Variable Function
+88(@sampleResultShadow):     25(ptr) Variable Function
+98(@sampleStructTemp):     38(ptr) Variable Function
+         112(s2):     70(ptr) Variable Function
+113(@sampleResultShadow):     25(ptr) Variable Function
+122(@sampleStructTemp):     70(ptr) Variable Function
+         138(s3):    137(ptr) Variable Function
+139(@sampleResultShadow):     25(ptr) Variable Function
+148(@sampleStructTemp):    137(ptr) Variable Function
+         162(s4):    161(ptr) Variable Function
+165(@sampleResultShadow):    164(ptr) Variable Function
+177(@sampleStructTemp):    161(ptr) Variable Function
+         196(s5):    195(ptr) Variable Function
+199(@sampleResultShadow):    198(ptr) Variable Function
+211(@sampleStructTemp):    195(ptr) Variable Function
+         220(r0):     38(ptr) Variable Function
+      221(param):      8(ptr) Variable Function
+         224(r1):     70(ptr) Variable Function
+      225(param):      8(ptr) Variable Function
+         228(r2):     38(ptr) Variable Function
+      230(param):      8(ptr) Variable Function
+              91:           7 Load 90(g_tTex2s1)
+              92:          28 Load 30(g_sSamp)
+              93:          32 SampledImage 91 92
+              97:   21(fvec4) ImageSampleImplicitLod 93 96
+                              Store 88(@sampleResultShadow) 97
+              99:     44(ptr) AccessChain 88(@sampleResultShadow) 43
+             100:    6(float) Load 99
+             101:     44(ptr) AccessChain 98(@sampleStructTemp) 41
+                              Store 101 100
+             102:     44(ptr) AccessChain 88(@sampleResultShadow) 49
+             103:    6(float) Load 102
+             104:     44(ptr) AccessChain 98(@sampleStructTemp) 48 43
+                              Store 104 103
+             105:     44(ptr) AccessChain 88(@sampleResultShadow) 53
+             106:    6(float) Load 105
+             107:     44(ptr) AccessChain 98(@sampleStructTemp) 48 49
+                              Store 107 106
+             108:     44(ptr) AccessChain 88(@sampleResultShadow) 58
+             109:    6(float) Load 108
+             110:     44(ptr) AccessChain 98(@sampleStructTemp) 57
+                              Store 110 109
+             111:    10(s1_t) Load 98(@sampleStructTemp)
+                              Store 87(s1) 111
+             115:           7 Load 114(g_tTex2s2)
+             116:          28 Load 30(g_sSamp)
+             117:          32 SampledImage 115 116
+             121:   21(fvec4) ImageSampleImplicitLod 117 120
+                              Store 113(@sampleResultShadow) 121
+             123:     44(ptr) AccessChain 113(@sampleResultShadow) 43
+             124:    6(float) Load 123
+             125:     44(ptr) AccessChain 122(@sampleStructTemp) 41
+                              Store 125 124
+             126:     44(ptr) AccessChain 113(@sampleResultShadow) 49
+             127:    6(float) Load 126
+             128:     44(ptr) AccessChain 122(@sampleStructTemp) 48 43
+                              Store 128 127
+             129:     44(ptr) AccessChain 113(@sampleResultShadow) 53
+             130:    6(float) Load 129
+             131:     44(ptr) AccessChain 122(@sampleStructTemp) 48 49
+                              Store 131 130
+             132:     44(ptr) AccessChain 113(@sampleResultShadow) 58
+             133:    6(float) Load 132
+             134:     44(ptr) AccessChain 122(@sampleStructTemp) 48 53
+                              Store 134 133
+             135:    16(s2_t) Load 122(@sampleStructTemp)
+                              Store 112(s2) 135
+             141:           7 Load 140(g_tTex2s3)
+             142:          28 Load 30(g_sSamp)
+             143:          32 SampledImage 141 142
+             147:   21(fvec4) ImageSampleImplicitLod 143 146
+                              Store 139(@sampleResultShadow) 147
+             149:     44(ptr) AccessChain 139(@sampleResultShadow) 43
+             150:    6(float) Load 149
+             151:     44(ptr) AccessChain 148(@sampleStructTemp) 41 43
+                              Store 151 150
+             152:     44(ptr) AccessChain 139(@sampleResultShadow) 49
+             153:    6(float) Load 152
+             154:     44(ptr) AccessChain 148(@sampleStructTemp) 41 49
+                              Store 154 153
+             155:     44(ptr) AccessChain 139(@sampleResultShadow) 53
+             156:    6(float) Load 155
+             157:     44(ptr) AccessChain 148(@sampleStructTemp) 48
+                              Store 157 156
+             158:   136(s3_t) Load 148(@sampleStructTemp)
+                              Store 138(s3) 158
+             169:         166 Load 168(g_tTex2s4)
+             170:          28 Load 30(g_sSamp)
+             172:         171 SampledImage 169 170
+             176:  163(ivec4) ImageSampleImplicitLod 172 175
+                              Store 165(@sampleResultShadow) 176
+             179:    178(ptr) AccessChain 165(@sampleResultShadow) 43
+             180:     40(int) Load 179
+             181:    178(ptr) AccessChain 177(@sampleStructTemp) 41
+                              Store 181 180
+             182:    178(ptr) AccessChain 165(@sampleResultShadow) 49
+             183:     40(int) Load 182
+             184:    6(float) ConvertSToF 183
+             185:    178(ptr) AccessChain 177(@sampleStructTemp) 48 43
+                              Store 185 184
+             186:    178(ptr) AccessChain 165(@sampleResultShadow) 53
+             187:     40(int) Load 186
+             188:    6(float) ConvertSToF 187
+             189:    178(ptr) AccessChain 177(@sampleStructTemp) 48 49
+                              Store 189 188
+             190:    178(ptr) AccessChain 165(@sampleResultShadow) 58
+             191:     40(int) Load 190
+             192:    178(ptr) AccessChain 177(@sampleStructTemp) 57
+                              Store 192 191
+             193:   160(s4_t) Load 177(@sampleStructTemp)
+                              Store 162(s4) 193
+             203:         200 Load 202(g_tTex2s5)
+             204:          28 Load 30(g_sSamp)
+             206:         205 SampledImage 203 204
+             210:  197(ivec4) ImageSampleImplicitLod 206 209
+                              Store 199(@sampleResultShadow) 210
+             213:    212(ptr) AccessChain 199(@sampleResultShadow) 43
+             214:     42(int) Load 213
+             215:    212(ptr) AccessChain 211(@sampleStructTemp) 41
+                              Store 215 214
+             216:    212(ptr) AccessChain 199(@sampleResultShadow) 49
+             217:     42(int) Load 216
+             218:    212(ptr) AccessChain 211(@sampleStructTemp) 48
+                              Store 218 217
+             219:   194(s5_t) Load 211(@sampleStructTemp)
+                              Store 196(s5) 219
+             222:           7 Load 90(g_tTex2s1)
+                              Store 221(param) 222
+             223:    10(s1_t) FunctionCall 13(fn1(t2-tx-struct0-1;) 221(param)
+                              Store 220(r0) 223
+             226:           7 Load 114(g_tTex2s2)
+                              Store 225(param) 226
+             227:    16(s2_t) FunctionCall 19(fn1(t2-tx-struct1-1;) 225(param)
+                              Store 224(r1) 227
+             231:           7 Load 229(g_tTex2s1a)
+                              Store 230(param) 231
+             232:    10(s1_t) FunctionCall 13(fn1(t2-tx-struct0-1;) 230(param)
+                              Store 228(r2) 232
+                              ReturnValue 234
+                              FunctionEnd
diff --git a/Test/baseResults/hlsl.texture.subvec4.frag.out b/Test/baseResults/hlsl.texture.subvec4.frag.out
new file mode 100644
index 0000000..bf0f146
--- /dev/null
+++ b/Test/baseResults/hlsl.texture.subvec4.frag.out
@@ -0,0 +1,544 @@
+hlsl.texture.subvec4.frag
+Shader version: 500
+gl_FragCoord origin is upper left
+0:? Sequence
+0:15  Function Definition: @main( ( temp 4-component vector of float)
+0:15    Function Parameters: 
+0:?     Sequence
+0:24      Sequence
+0:24        move second child to first child ( temp 2-component vector of uint)
+0:24          'sizeQueryTemp' ( temp 2-component vector of uint)
+0:24          textureSize ( temp 2-component vector of uint)
+0:24            'g_tTex2dmsf1' ( uniform texture2DMS)
+0:24        move second child to first child ( temp uint)
+0:24          'WidthU' ( temp uint)
+0:24          direct index ( temp uint)
+0:24            'sizeQueryTemp' ( temp 2-component vector of uint)
+0:24            Constant:
+0:24              0 (const int)
+0:24        move second child to first child ( temp uint)
+0:24          'HeightU' ( temp uint)
+0:24          direct index ( temp uint)
+0:24            'sizeQueryTemp' ( temp 2-component vector of uint)
+0:24            Constant:
+0:24              1 (const int)
+0:24        move second child to first child ( temp uint)
+0:24          'NumberOfSamplesU' ( temp uint)
+0:24          imageQuerySamples ( temp uint)
+0:24            'g_tTex2dmsf1' ( uniform texture2DMS)
+0:25      Sequence
+0:25        move second child to first child ( temp 2-component vector of uint)
+0:25          'sizeQueryTemp' ( temp 2-component vector of uint)
+0:25          textureSize ( temp 2-component vector of uint)
+0:25            'g_tTex2dmsf2' ( uniform texture2DMS)
+0:25        move second child to first child ( temp uint)
+0:25          'WidthU' ( temp uint)
+0:25          direct index ( temp uint)
+0:25            'sizeQueryTemp' ( temp 2-component vector of uint)
+0:25            Constant:
+0:25              0 (const int)
+0:25        move second child to first child ( temp uint)
+0:25          'HeightU' ( temp uint)
+0:25          direct index ( temp uint)
+0:25            'sizeQueryTemp' ( temp 2-component vector of uint)
+0:25            Constant:
+0:25              1 (const int)
+0:25        move second child to first child ( temp uint)
+0:25          'NumberOfSamplesU' ( temp uint)
+0:25          imageQuerySamples ( temp uint)
+0:25            'g_tTex2dmsf2' ( uniform texture2DMS)
+0:26      Sequence
+0:26        move second child to first child ( temp 2-component vector of uint)
+0:26          'sizeQueryTemp' ( temp 2-component vector of uint)
+0:26          textureSize ( temp 2-component vector of uint)
+0:26            'g_tTex2dmsf3' ( uniform texture2DMS)
+0:26        move second child to first child ( temp uint)
+0:26          'WidthU' ( temp uint)
+0:26          direct index ( temp uint)
+0:26            'sizeQueryTemp' ( temp 2-component vector of uint)
+0:26            Constant:
+0:26              0 (const int)
+0:26        move second child to first child ( temp uint)
+0:26          'HeightU' ( temp uint)
+0:26          direct index ( temp uint)
+0:26            'sizeQueryTemp' ( temp 2-component vector of uint)
+0:26            Constant:
+0:26              1 (const int)
+0:26        move second child to first child ( temp uint)
+0:26          'NumberOfSamplesU' ( temp uint)
+0:26          imageQuerySamples ( temp uint)
+0:26            'g_tTex2dmsf3' ( uniform texture2DMS)
+0:27      Sequence
+0:27        move second child to first child ( temp 2-component vector of uint)
+0:27          'sizeQueryTemp' ( temp 2-component vector of uint)
+0:27          textureSize ( temp 2-component vector of uint)
+0:27            'g_tTex2dmsf4' ( uniform texture2DMS)
+0:27        move second child to first child ( temp uint)
+0:27          'WidthU' ( temp uint)
+0:27          direct index ( temp uint)
+0:27            'sizeQueryTemp' ( temp 2-component vector of uint)
+0:27            Constant:
+0:27              0 (const int)
+0:27        move second child to first child ( temp uint)
+0:27          'HeightU' ( temp uint)
+0:27          direct index ( temp uint)
+0:27            'sizeQueryTemp' ( temp 2-component vector of uint)
+0:27            Constant:
+0:27              1 (const int)
+0:27        move second child to first child ( temp uint)
+0:27          'NumberOfSamplesU' ( temp uint)
+0:27          imageQuerySamples ( temp uint)
+0:27            'g_tTex2dmsf4' ( uniform texture2DMS)
+0:29      Construct float ( temp float)
+0:?         textureFetch ( temp 4-component vector of float)
+0:29          'g_tTex2dmsf1' ( uniform texture2DMS)
+0:?           Constant:
+0:?             1 (const int)
+0:?             2 (const int)
+0:29          Constant:
+0:29            3 (const int)
+0:30      Construct vec2 ( temp 2-component vector of float)
+0:?         textureFetch ( temp 4-component vector of float)
+0:30          'g_tTex2dmsf2' ( uniform texture2DMS)
+0:?           Constant:
+0:?             1 (const int)
+0:?             2 (const int)
+0:30          Constant:
+0:30            3 (const int)
+0:31      Construct vec3 ( temp 3-component vector of float)
+0:?         textureFetch ( temp 4-component vector of float)
+0:31          'g_tTex2dmsf3' ( uniform texture2DMS)
+0:?           Constant:
+0:?             1 (const int)
+0:?             2 (const int)
+0:31          Constant:
+0:31            3 (const int)
+0:32      textureFetch ( temp 4-component vector of float)
+0:32        'g_tTex2dmsf4' ( uniform texture2DMS)
+0:?         Constant:
+0:?           1 (const int)
+0:?           2 (const int)
+0:32        Constant:
+0:32          3 (const int)
+0:34      Construct float ( temp float)
+0:?         texture ( temp 4-component vector of float)
+0:34          Construct combined texture-sampler ( temp sampler2D)
+0:34            'g_tTex2df1' ( uniform texture2D)
+0:34            'g_sSamp' ( uniform sampler)
+0:?           Constant:
+0:?             0.100000
+0:?             0.200000
+0:35      Construct vec2 ( temp 2-component vector of float)
+0:?         texture ( temp 4-component vector of float)
+0:35          Construct combined texture-sampler ( temp sampler2D)
+0:35            'g_tTex2df2' ( uniform texture2D)
+0:35            'g_sSamp' ( uniform sampler)
+0:?           Constant:
+0:?             0.100000
+0:?             0.200000
+0:36      Construct vec3 ( temp 3-component vector of float)
+0:?         texture ( temp 4-component vector of float)
+0:36          Construct combined texture-sampler ( temp sampler2D)
+0:36            'g_tTex2df3' ( uniform texture2D)
+0:36            'g_sSamp' ( uniform sampler)
+0:?           Constant:
+0:?             0.100000
+0:?             0.200000
+0:37      texture ( temp 4-component vector of float)
+0:37        Construct combined texture-sampler ( temp sampler2D)
+0:37          'g_tTex2df4' ( uniform texture2D)
+0:37          'g_sSamp' ( uniform sampler)
+0:?         Constant:
+0:?           0.100000
+0:?           0.200000
+0:39      Branch: Return with expression
+0:39        Constant:
+0:39          0.000000
+0:39          0.000000
+0:39          0.000000
+0:39          0.000000
+0:15  Function Definition: main( ( temp void)
+0:15    Function Parameters: 
+0:?     Sequence
+0:15      move second child to first child ( temp 4-component vector of float)
+0:?         '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+0:15        Function Call: @main( ( temp 4-component vector of float)
+0:?   Linker Objects
+0:?     'g_tTex2dmsf1' ( uniform texture2DMS)
+0:?     'g_tTex2dmsf2' ( uniform texture2DMS)
+0:?     'g_tTex2dmsf3' ( uniform texture2DMS)
+0:?     'g_tTex2dmsf4' ( uniform texture2DMS)
+0:?     'g_tTex2df1' ( uniform texture2D)
+0:?     'g_tTex2df2' ( uniform texture2D)
+0:?     'g_tTex2df3' ( uniform texture2D)
+0:?     'g_tTex2df4' ( uniform texture2D)
+0:?     'g_sSamp' ( uniform sampler)
+0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+
+
+Linked fragment stage:
+
+
+Shader version: 500
+gl_FragCoord origin is upper left
+0:? Sequence
+0:15  Function Definition: @main( ( temp 4-component vector of float)
+0:15    Function Parameters: 
+0:?     Sequence
+0:24      Sequence
+0:24        move second child to first child ( temp 2-component vector of uint)
+0:24          'sizeQueryTemp' ( temp 2-component vector of uint)
+0:24          textureSize ( temp 2-component vector of uint)
+0:24            'g_tTex2dmsf1' ( uniform texture2DMS)
+0:24        move second child to first child ( temp uint)
+0:24          'WidthU' ( temp uint)
+0:24          direct index ( temp uint)
+0:24            'sizeQueryTemp' ( temp 2-component vector of uint)
+0:24            Constant:
+0:24              0 (const int)
+0:24        move second child to first child ( temp uint)
+0:24          'HeightU' ( temp uint)
+0:24          direct index ( temp uint)
+0:24            'sizeQueryTemp' ( temp 2-component vector of uint)
+0:24            Constant:
+0:24              1 (const int)
+0:24        move second child to first child ( temp uint)
+0:24          'NumberOfSamplesU' ( temp uint)
+0:24          imageQuerySamples ( temp uint)
+0:24            'g_tTex2dmsf1' ( uniform texture2DMS)
+0:25      Sequence
+0:25        move second child to first child ( temp 2-component vector of uint)
+0:25          'sizeQueryTemp' ( temp 2-component vector of uint)
+0:25          textureSize ( temp 2-component vector of uint)
+0:25            'g_tTex2dmsf2' ( uniform texture2DMS)
+0:25        move second child to first child ( temp uint)
+0:25          'WidthU' ( temp uint)
+0:25          direct index ( temp uint)
+0:25            'sizeQueryTemp' ( temp 2-component vector of uint)
+0:25            Constant:
+0:25              0 (const int)
+0:25        move second child to first child ( temp uint)
+0:25          'HeightU' ( temp uint)
+0:25          direct index ( temp uint)
+0:25            'sizeQueryTemp' ( temp 2-component vector of uint)
+0:25            Constant:
+0:25              1 (const int)
+0:25        move second child to first child ( temp uint)
+0:25          'NumberOfSamplesU' ( temp uint)
+0:25          imageQuerySamples ( temp uint)
+0:25            'g_tTex2dmsf2' ( uniform texture2DMS)
+0:26      Sequence
+0:26        move second child to first child ( temp 2-component vector of uint)
+0:26          'sizeQueryTemp' ( temp 2-component vector of uint)
+0:26          textureSize ( temp 2-component vector of uint)
+0:26            'g_tTex2dmsf3' ( uniform texture2DMS)
+0:26        move second child to first child ( temp uint)
+0:26          'WidthU' ( temp uint)
+0:26          direct index ( temp uint)
+0:26            'sizeQueryTemp' ( temp 2-component vector of uint)
+0:26            Constant:
+0:26              0 (const int)
+0:26        move second child to first child ( temp uint)
+0:26          'HeightU' ( temp uint)
+0:26          direct index ( temp uint)
+0:26            'sizeQueryTemp' ( temp 2-component vector of uint)
+0:26            Constant:
+0:26              1 (const int)
+0:26        move second child to first child ( temp uint)
+0:26          'NumberOfSamplesU' ( temp uint)
+0:26          imageQuerySamples ( temp uint)
+0:26            'g_tTex2dmsf3' ( uniform texture2DMS)
+0:27      Sequence
+0:27        move second child to first child ( temp 2-component vector of uint)
+0:27          'sizeQueryTemp' ( temp 2-component vector of uint)
+0:27          textureSize ( temp 2-component vector of uint)
+0:27            'g_tTex2dmsf4' ( uniform texture2DMS)
+0:27        move second child to first child ( temp uint)
+0:27          'WidthU' ( temp uint)
+0:27          direct index ( temp uint)
+0:27            'sizeQueryTemp' ( temp 2-component vector of uint)
+0:27            Constant:
+0:27              0 (const int)
+0:27        move second child to first child ( temp uint)
+0:27          'HeightU' ( temp uint)
+0:27          direct index ( temp uint)
+0:27            'sizeQueryTemp' ( temp 2-component vector of uint)
+0:27            Constant:
+0:27              1 (const int)
+0:27        move second child to first child ( temp uint)
+0:27          'NumberOfSamplesU' ( temp uint)
+0:27          imageQuerySamples ( temp uint)
+0:27            'g_tTex2dmsf4' ( uniform texture2DMS)
+0:29      Construct float ( temp float)
+0:?         textureFetch ( temp 4-component vector of float)
+0:29          'g_tTex2dmsf1' ( uniform texture2DMS)
+0:?           Constant:
+0:?             1 (const int)
+0:?             2 (const int)
+0:29          Constant:
+0:29            3 (const int)
+0:30      Construct vec2 ( temp 2-component vector of float)
+0:?         textureFetch ( temp 4-component vector of float)
+0:30          'g_tTex2dmsf2' ( uniform texture2DMS)
+0:?           Constant:
+0:?             1 (const int)
+0:?             2 (const int)
+0:30          Constant:
+0:30            3 (const int)
+0:31      Construct vec3 ( temp 3-component vector of float)
+0:?         textureFetch ( temp 4-component vector of float)
+0:31          'g_tTex2dmsf3' ( uniform texture2DMS)
+0:?           Constant:
+0:?             1 (const int)
+0:?             2 (const int)
+0:31          Constant:
+0:31            3 (const int)
+0:32      textureFetch ( temp 4-component vector of float)
+0:32        'g_tTex2dmsf4' ( uniform texture2DMS)
+0:?         Constant:
+0:?           1 (const int)
+0:?           2 (const int)
+0:32        Constant:
+0:32          3 (const int)
+0:34      Construct float ( temp float)
+0:?         texture ( temp 4-component vector of float)
+0:34          Construct combined texture-sampler ( temp sampler2D)
+0:34            'g_tTex2df1' ( uniform texture2D)
+0:34            'g_sSamp' ( uniform sampler)
+0:?           Constant:
+0:?             0.100000
+0:?             0.200000
+0:35      Construct vec2 ( temp 2-component vector of float)
+0:?         texture ( temp 4-component vector of float)
+0:35          Construct combined texture-sampler ( temp sampler2D)
+0:35            'g_tTex2df2' ( uniform texture2D)
+0:35            'g_sSamp' ( uniform sampler)
+0:?           Constant:
+0:?             0.100000
+0:?             0.200000
+0:36      Construct vec3 ( temp 3-component vector of float)
+0:?         texture ( temp 4-component vector of float)
+0:36          Construct combined texture-sampler ( temp sampler2D)
+0:36            'g_tTex2df3' ( uniform texture2D)
+0:36            'g_sSamp' ( uniform sampler)
+0:?           Constant:
+0:?             0.100000
+0:?             0.200000
+0:37      texture ( temp 4-component vector of float)
+0:37        Construct combined texture-sampler ( temp sampler2D)
+0:37          'g_tTex2df4' ( uniform texture2D)
+0:37          'g_sSamp' ( uniform sampler)
+0:?         Constant:
+0:?           0.100000
+0:?           0.200000
+0:39      Branch: Return with expression
+0:39        Constant:
+0:39          0.000000
+0:39          0.000000
+0:39          0.000000
+0:39          0.000000
+0:15  Function Definition: main( ( temp void)
+0:15    Function Parameters: 
+0:?     Sequence
+0:15      move second child to first child ( temp 4-component vector of float)
+0:?         '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+0:15        Function Call: @main( ( temp 4-component vector of float)
+0:?   Linker Objects
+0:?     'g_tTex2dmsf1' ( uniform texture2DMS)
+0:?     'g_tTex2dmsf2' ( uniform texture2DMS)
+0:?     'g_tTex2dmsf3' ( uniform texture2DMS)
+0:?     'g_tTex2dmsf4' ( uniform texture2DMS)
+0:?     'g_tTex2df1' ( uniform texture2D)
+0:?     'g_tTex2df2' ( uniform texture2D)
+0:?     'g_tTex2df3' ( uniform texture2D)
+0:?     'g_tTex2df4' ( uniform texture2D)
+0:?     'g_sSamp' ( uniform sampler)
+0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 130
+
+                              Capability Shader
+                              Capability ImageQuery
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 128
+                              ExecutionMode 4 OriginUpperLeft
+                              Source HLSL 500
+                              Name 4  "main"
+                              Name 9  "@main("
+                              Name 14  "sizeQueryTemp"
+                              Name 17  "g_tTex2dmsf1"
+                              Name 21  "WidthU"
+                              Name 25  "HeightU"
+                              Name 29  "NumberOfSamplesU"
+                              Name 32  "sizeQueryTemp"
+                              Name 33  "g_tTex2dmsf2"
+                              Name 42  "sizeQueryTemp"
+                              Name 43  "g_tTex2dmsf3"
+                              Name 52  "sizeQueryTemp"
+                              Name 53  "g_tTex2dmsf4"
+                              Name 88  "g_tTex2df1"
+                              Name 92  "g_sSamp"
+                              Name 101  "g_tTex2df2"
+                              Name 109  "g_tTex2df3"
+                              Name 118  "g_tTex2df4"
+                              Name 128  "@entryPointOutput"
+                              Decorate 17(g_tTex2dmsf1) DescriptorSet 0
+                              Decorate 33(g_tTex2dmsf2) DescriptorSet 0
+                              Decorate 43(g_tTex2dmsf3) DescriptorSet 0
+                              Decorate 53(g_tTex2dmsf4) DescriptorSet 0
+                              Decorate 88(g_tTex2df1) DescriptorSet 0
+                              Decorate 92(g_sSamp) DescriptorSet 0
+                              Decorate 101(g_tTex2df2) DescriptorSet 0
+                              Decorate 109(g_tTex2df3) DescriptorSet 0
+                              Decorate 118(g_tTex2df4) DescriptorSet 0
+                              Decorate 128(@entryPointOutput) Location 0
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+               8:             TypeFunction 7(fvec4)
+              11:             TypeInt 32 0
+              12:             TypeVector 11(int) 2
+              13:             TypePointer Function 12(ivec2)
+              15:             TypeImage 6(float) 2D multi-sampled sampled format:Unknown
+              16:             TypePointer UniformConstant 15
+17(g_tTex2dmsf1):     16(ptr) Variable UniformConstant
+              20:             TypePointer Function 11(int)
+              22:     11(int) Constant 0
+              26:     11(int) Constant 1
+33(g_tTex2dmsf2):     16(ptr) Variable UniformConstant
+43(g_tTex2dmsf3):     16(ptr) Variable UniformConstant
+53(g_tTex2dmsf4):     16(ptr) Variable UniformConstant
+              63:             TypeInt 32 1
+              64:             TypeVector 63(int) 2
+              65:     63(int) Constant 1
+              66:     63(int) Constant 2
+              67:   64(ivec2) ConstantComposite 65 66
+              68:     63(int) Constant 3
+              73:             TypeVector 6(float) 2
+              79:             TypeVector 6(float) 3
+              86:             TypeImage 6(float) 2D sampled format:Unknown
+              87:             TypePointer UniformConstant 86
+  88(g_tTex2df1):     87(ptr) Variable UniformConstant
+              90:             TypeSampler
+              91:             TypePointer UniformConstant 90
+     92(g_sSamp):     91(ptr) Variable UniformConstant
+              94:             TypeSampledImage 86
+              96:    6(float) Constant 1036831949
+              97:    6(float) Constant 1045220557
+              98:   73(fvec2) ConstantComposite 96 97
+ 101(g_tTex2df2):     87(ptr) Variable UniformConstant
+ 109(g_tTex2df3):     87(ptr) Variable UniformConstant
+ 118(g_tTex2df4):     87(ptr) Variable UniformConstant
+             123:    6(float) Constant 0
+             124:    7(fvec4) ConstantComposite 123 123 123 123
+             127:             TypePointer Output 7(fvec4)
+128(@entryPointOutput):    127(ptr) Variable Output
+         4(main):           2 Function None 3
+               5:             Label
+             129:    7(fvec4) FunctionCall 9(@main()
+                              Store 128(@entryPointOutput) 129
+                              Return
+                              FunctionEnd
+       9(@main():    7(fvec4) Function None 8
+              10:             Label
+14(sizeQueryTemp):     13(ptr) Variable Function
+      21(WidthU):     20(ptr) Variable Function
+     25(HeightU):     20(ptr) Variable Function
+29(NumberOfSamplesU):     20(ptr) Variable Function
+32(sizeQueryTemp):     13(ptr) Variable Function
+42(sizeQueryTemp):     13(ptr) Variable Function
+52(sizeQueryTemp):     13(ptr) Variable Function
+              18:          15 Load 17(g_tTex2dmsf1)
+              19:   12(ivec2) ImageQuerySize 18
+                              Store 14(sizeQueryTemp) 19
+              23:     20(ptr) AccessChain 14(sizeQueryTemp) 22
+              24:     11(int) Load 23
+                              Store 21(WidthU) 24
+              27:     20(ptr) AccessChain 14(sizeQueryTemp) 26
+              28:     11(int) Load 27
+                              Store 25(HeightU) 28
+              30:          15 Load 17(g_tTex2dmsf1)
+              31:     11(int) ImageQuerySamples 30
+                              Store 29(NumberOfSamplesU) 31
+              34:          15 Load 33(g_tTex2dmsf2)
+              35:   12(ivec2) ImageQuerySize 34
+                              Store 32(sizeQueryTemp) 35
+              36:     20(ptr) AccessChain 32(sizeQueryTemp) 22
+              37:     11(int) Load 36
+                              Store 21(WidthU) 37
+              38:     20(ptr) AccessChain 32(sizeQueryTemp) 26
+              39:     11(int) Load 38
+                              Store 25(HeightU) 39
+              40:          15 Load 33(g_tTex2dmsf2)
+              41:     11(int) ImageQuerySamples 40
+                              Store 29(NumberOfSamplesU) 41
+              44:          15 Load 43(g_tTex2dmsf3)
+              45:   12(ivec2) ImageQuerySize 44
+                              Store 42(sizeQueryTemp) 45
+              46:     20(ptr) AccessChain 42(sizeQueryTemp) 22
+              47:     11(int) Load 46
+                              Store 21(WidthU) 47
+              48:     20(ptr) AccessChain 42(sizeQueryTemp) 26
+              49:     11(int) Load 48
+                              Store 25(HeightU) 49
+              50:          15 Load 43(g_tTex2dmsf3)
+              51:     11(int) ImageQuerySamples 50
+                              Store 29(NumberOfSamplesU) 51
+              54:          15 Load 53(g_tTex2dmsf4)
+              55:   12(ivec2) ImageQuerySize 54
+                              Store 52(sizeQueryTemp) 55
+              56:     20(ptr) AccessChain 52(sizeQueryTemp) 22
+              57:     11(int) Load 56
+                              Store 21(WidthU) 57
+              58:     20(ptr) AccessChain 52(sizeQueryTemp) 26
+              59:     11(int) Load 58
+                              Store 25(HeightU) 59
+              60:          15 Load 53(g_tTex2dmsf4)
+              61:     11(int) ImageQuerySamples 60
+                              Store 29(NumberOfSamplesU) 61
+              62:          15 Load 17(g_tTex2dmsf1)
+              69:    7(fvec4) ImageFetch 62 67 Sample 68
+              70:    6(float) CompositeExtract 69 0
+              71:          15 Load 33(g_tTex2dmsf2)
+              72:    7(fvec4) ImageFetch 71 67 Sample 68
+              74:    6(float) CompositeExtract 72 0
+              75:    6(float) CompositeExtract 72 1
+              76:   73(fvec2) CompositeConstruct 74 75
+              77:          15 Load 43(g_tTex2dmsf3)
+              78:    7(fvec4) ImageFetch 77 67 Sample 68
+              80:    6(float) CompositeExtract 78 0
+              81:    6(float) CompositeExtract 78 1
+              82:    6(float) CompositeExtract 78 2
+              83:   79(fvec3) CompositeConstruct 80 81 82
+              84:          15 Load 53(g_tTex2dmsf4)
+              85:    7(fvec4) ImageFetch 84 67 Sample 68
+              89:          86 Load 88(g_tTex2df1)
+              93:          90 Load 92(g_sSamp)
+              95:          94 SampledImage 89 93
+              99:    7(fvec4) ImageSampleImplicitLod 95 98
+             100:    6(float) CompositeExtract 99 0
+             102:          86 Load 101(g_tTex2df2)
+             103:          90 Load 92(g_sSamp)
+             104:          94 SampledImage 102 103
+             105:    7(fvec4) ImageSampleImplicitLod 104 98
+             106:    6(float) CompositeExtract 105 0
+             107:    6(float) CompositeExtract 105 1
+             108:   73(fvec2) CompositeConstruct 106 107
+             110:          86 Load 109(g_tTex2df3)
+             111:          90 Load 92(g_sSamp)
+             112:          94 SampledImage 110 111
+             113:    7(fvec4) ImageSampleImplicitLod 112 98
+             114:    6(float) CompositeExtract 113 0
+             115:    6(float) CompositeExtract 113 1
+             116:    6(float) CompositeExtract 113 2
+             117:   79(fvec3) CompositeConstruct 114 115 116
+             119:          86 Load 118(g_tTex2df4)
+             120:          90 Load 92(g_sSamp)
+             121:          94 SampledImage 119 120
+             122:    7(fvec4) ImageSampleImplicitLod 121 98
+                              ReturnValue 124
+                              FunctionEnd
diff --git a/Test/baseResults/hlsl.texturebuffer.frag.out b/Test/baseResults/hlsl.texturebuffer.frag.out
new file mode 100644
index 0000000..89b5c54
--- /dev/null
+++ b/Test/baseResults/hlsl.texturebuffer.frag.out
@@ -0,0 +1,153 @@
+hlsl.texturebuffer.frag
+Shader version: 500
+gl_FragCoord origin is upper left
+0:? Sequence
+0:15  Function Definition: @main(vf4; ( temp 4-component vector of float)
+0:15    Function Parameters: 
+0:15      'pos' ( in 4-component vector of float)
+0:?     Sequence
+0:16      Branch: Return with expression
+0:16        add ( temp 4-component vector of float)
+0:16          f: direct index for structure (layout( row_major std430) buffer 4-component vector of float)
+0:16            'TextureBuffer_var' (layout( binding=0 row_major std430) readonly buffer block{layout( row_major std430) buffer 4-component vector of float f, layout( row_major std430) buffer 4-component vector of int i})
+0:16            Constant:
+0:16              0 (const int)
+0:16          f2: direct index for structure (layout( row_major std430) buffer 4-component vector of float)
+0:16            'anon@0' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer 4-component vector of float f2, layout( row_major std430) buffer 4-component vector of int i2})
+0:16            Constant:
+0:16              0 (const uint)
+0:15  Function Definition: main( ( temp void)
+0:15    Function Parameters: 
+0:?     Sequence
+0:15      move second child to first child ( temp 4-component vector of float)
+0:?         'pos' ( temp 4-component vector of float)
+0:?         'pos' ( in 4-component vector of float FragCoord)
+0:15      move second child to first child ( temp 4-component vector of float)
+0:?         '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+0:15        Function Call: @main(vf4; ( temp 4-component vector of float)
+0:?           'pos' ( temp 4-component vector of float)
+0:?   Linker Objects
+0:?     'TextureBuffer_var' (layout( binding=0 row_major std430) readonly buffer block{layout( row_major std430) buffer 4-component vector of float f, layout( row_major std430) buffer 4-component vector of int i})
+0:?     'anon@0' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer 4-component vector of float f2, layout( row_major std430) buffer 4-component vector of int i2})
+0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+0:?     'pos' ( in 4-component vector of float FragCoord)
+
+
+Linked fragment stage:
+
+
+Shader version: 500
+gl_FragCoord origin is upper left
+0:? Sequence
+0:15  Function Definition: @main(vf4; ( temp 4-component vector of float)
+0:15    Function Parameters: 
+0:15      'pos' ( in 4-component vector of float)
+0:?     Sequence
+0:16      Branch: Return with expression
+0:16        add ( temp 4-component vector of float)
+0:16          f: direct index for structure (layout( row_major std430) buffer 4-component vector of float)
+0:16            'TextureBuffer_var' (layout( binding=0 row_major std430) readonly buffer block{layout( row_major std430) buffer 4-component vector of float f, layout( row_major std430) buffer 4-component vector of int i})
+0:16            Constant:
+0:16              0 (const int)
+0:16          f2: direct index for structure (layout( row_major std430) buffer 4-component vector of float)
+0:16            'anon@0' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer 4-component vector of float f2, layout( row_major std430) buffer 4-component vector of int i2})
+0:16            Constant:
+0:16              0 (const uint)
+0:15  Function Definition: main( ( temp void)
+0:15    Function Parameters: 
+0:?     Sequence
+0:15      move second child to first child ( temp 4-component vector of float)
+0:?         'pos' ( temp 4-component vector of float)
+0:?         'pos' ( in 4-component vector of float FragCoord)
+0:15      move second child to first child ( temp 4-component vector of float)
+0:?         '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+0:15        Function Call: @main(vf4; ( temp 4-component vector of float)
+0:?           'pos' ( temp 4-component vector of float)
+0:?   Linker Objects
+0:?     'TextureBuffer_var' (layout( binding=0 row_major std430) readonly buffer block{layout( row_major std430) buffer 4-component vector of float f, layout( row_major std430) buffer 4-component vector of int i})
+0:?     'anon@0' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer 4-component vector of float f2, layout( row_major std430) buffer 4-component vector of int i2})
+0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+0:?     'pos' ( in 4-component vector of float FragCoord)
+
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 39
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 32 35
+                              ExecutionMode 4 OriginUpperLeft
+                              Source HLSL 500
+                              Name 4  "main"
+                              Name 11  "@main(vf4;"
+                              Name 10  "pos"
+                              Name 15  "TextureBuffer_var"
+                              MemberName 15(TextureBuffer_var) 0  "f"
+                              MemberName 15(TextureBuffer_var) 1  "i"
+                              Name 17  "TextureBuffer_var"
+                              Name 22  "tbuf2"
+                              MemberName 22(tbuf2) 0  "f2"
+                              MemberName 22(tbuf2) 1  "i2"
+                              Name 24  ""
+                              Name 30  "pos"
+                              Name 32  "pos"
+                              Name 35  "@entryPointOutput"
+                              Name 36  "param"
+                              MemberDecorate 15(TextureBuffer_var) 0 NonWritable
+                              MemberDecorate 15(TextureBuffer_var) 0 Offset 0
+                              MemberDecorate 15(TextureBuffer_var) 1 NonWritable
+                              MemberDecorate 15(TextureBuffer_var) 1 Offset 16
+                              Decorate 15(TextureBuffer_var) BufferBlock
+                              Decorate 17(TextureBuffer_var) DescriptorSet 0
+                              Decorate 17(TextureBuffer_var) Binding 0
+                              MemberDecorate 22(tbuf2) 0 NonWritable
+                              MemberDecorate 22(tbuf2) 0 Offset 0
+                              MemberDecorate 22(tbuf2) 1 NonWritable
+                              MemberDecorate 22(tbuf2) 1 Offset 16
+                              Decorate 22(tbuf2) BufferBlock
+                              Decorate 24 DescriptorSet 0
+                              Decorate 32(pos) BuiltIn FragCoord
+                              Decorate 35(@entryPointOutput) Location 0
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+               8:             TypePointer Function 7(fvec4)
+               9:             TypeFunction 7(fvec4) 8(ptr)
+              13:             TypeInt 32 1
+              14:             TypeVector 13(int) 4
+15(TextureBuffer_var):             TypeStruct 7(fvec4) 14(ivec4)
+              16:             TypePointer Uniform 15(TextureBuffer_var)
+17(TextureBuffer_var):     16(ptr) Variable Uniform
+              18:     13(int) Constant 0
+              19:             TypePointer Uniform 7(fvec4)
+       22(tbuf2):             TypeStruct 7(fvec4) 14(ivec4)
+              23:             TypePointer Uniform 22(tbuf2)
+              24:     23(ptr) Variable Uniform
+              31:             TypePointer Input 7(fvec4)
+         32(pos):     31(ptr) Variable Input
+              34:             TypePointer Output 7(fvec4)
+35(@entryPointOutput):     34(ptr) Variable Output
+         4(main):           2 Function None 3
+               5:             Label
+         30(pos):      8(ptr) Variable Function
+       36(param):      8(ptr) Variable Function
+              33:    7(fvec4) Load 32(pos)
+                              Store 30(pos) 33
+              37:    7(fvec4) Load 30(pos)
+                              Store 36(param) 37
+              38:    7(fvec4) FunctionCall 11(@main(vf4;) 36(param)
+                              Store 35(@entryPointOutput) 38
+                              Return
+                              FunctionEnd
+  11(@main(vf4;):    7(fvec4) Function None 9
+         10(pos):      8(ptr) FunctionParameter
+              12:             Label
+              20:     19(ptr) AccessChain 17(TextureBuffer_var) 18
+              21:    7(fvec4) Load 20
+              25:     19(ptr) AccessChain 24 18
+              26:    7(fvec4) Load 25
+              27:    7(fvec4) FAdd 21 26
+                              ReturnValue 27
+                              FunctionEnd
diff --git a/Test/baseResults/hlsl.this.frag.out b/Test/baseResults/hlsl.this.frag.out
old mode 100755
new mode 100644
index b35e267..ac5fde8
--- a/Test/baseResults/hlsl.this.frag.out
+++ b/Test/baseResults/hlsl.this.frag.out
@@ -240,7 +240,7 @@
 0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 98
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.tristream-append.geom.out b/Test/baseResults/hlsl.tristream-append.geom.out
new file mode 100644
index 0000000..c116724
--- /dev/null
+++ b/Test/baseResults/hlsl.tristream-append.geom.out
@@ -0,0 +1,216 @@
+hlsl.tristream-append.geom
+Shader version: 500
+invocations = -1
+max_vertices = 3
+input primitive = triangles
+output primitive = triangle_strip
+0:? Sequence
+0:8  Function Definition: EmitVertex(struct-GSPS_INPUT1;struct-GSPS_INPUT1; ( temp void)
+0:8    Function Parameters: 
+0:8      'output' ( in structure{})
+0:8      'TriStream' ( out structure{})
+0:?     Sequence
+0:9      Sequence
+0:9        Sequence
+0:9          move second child to first child ( temp structure{})
+0:9            'TriStream' ( out structure{})
+0:9            'output' ( in structure{})
+0:9        EmitVertex ( temp void)
+0:14  Function Definition: @main(struct-GSPS_INPUT1[3];struct-GSPS_INPUT1; ( temp void)
+0:14    Function Parameters: 
+0:14      'input' ( in 3-element array of structure{})
+0:14      'TriStream' ( out structure{})
+0:?     Sequence
+0:15      Function Call: EmitVertex(struct-GSPS_INPUT1;struct-GSPS_INPUT1; ( temp void)
+0:15        direct index ( temp structure{})
+0:15          'input' ( in 3-element array of structure{})
+0:15          Constant:
+0:15            0 (const int)
+0:15        'TriStream' ( out structure{})
+0:16      Function Call: EmitVertex(struct-GSPS_INPUT1;struct-GSPS_INPUT1; ( temp void)
+0:16        direct index ( temp structure{})
+0:16          'input' ( in 3-element array of structure{})
+0:16          Constant:
+0:16            1 (const int)
+0:16        'TriStream' ( out structure{})
+0:17      Function Call: EmitVertex(struct-GSPS_INPUT1;struct-GSPS_INPUT1; ( temp void)
+0:17        direct index ( temp structure{})
+0:17          'input' ( in 3-element array of structure{})
+0:17          Constant:
+0:17            2 (const int)
+0:17        'TriStream' ( out structure{})
+0:14  Function Definition: main( ( temp void)
+0:14    Function Parameters: 
+0:?     Sequence
+0:14      move second child to first child ( temp 3-element array of structure{})
+0:?         'input' ( temp 3-element array of structure{})
+0:?         'input' ( in 3-element array of structure{})
+0:14      Function Call: @main(struct-GSPS_INPUT1[3];struct-GSPS_INPUT1; ( temp void)
+0:?         'input' ( temp 3-element array of structure{})
+0:?         'TriStream' ( temp structure{})
+0:?   Linker Objects
+
+
+Linked geometry stage:
+
+
+Shader version: 500
+invocations = 1
+max_vertices = 3
+input primitive = triangles
+output primitive = triangle_strip
+0:? Sequence
+0:8  Function Definition: EmitVertex(struct-GSPS_INPUT1;struct-GSPS_INPUT1; ( temp void)
+0:8    Function Parameters: 
+0:8      'output' ( in structure{})
+0:8      'TriStream' ( out structure{})
+0:?     Sequence
+0:9      Sequence
+0:9        Sequence
+0:9          move second child to first child ( temp structure{})
+0:9            'TriStream' ( out structure{})
+0:9            'output' ( in structure{})
+0:9        EmitVertex ( temp void)
+0:14  Function Definition: @main(struct-GSPS_INPUT1[3];struct-GSPS_INPUT1; ( temp void)
+0:14    Function Parameters: 
+0:14      'input' ( in 3-element array of structure{})
+0:14      'TriStream' ( out structure{})
+0:?     Sequence
+0:15      Function Call: EmitVertex(struct-GSPS_INPUT1;struct-GSPS_INPUT1; ( temp void)
+0:15        direct index ( temp structure{})
+0:15          'input' ( in 3-element array of structure{})
+0:15          Constant:
+0:15            0 (const int)
+0:15        'TriStream' ( out structure{})
+0:16      Function Call: EmitVertex(struct-GSPS_INPUT1;struct-GSPS_INPUT1; ( temp void)
+0:16        direct index ( temp structure{})
+0:16          'input' ( in 3-element array of structure{})
+0:16          Constant:
+0:16            1 (const int)
+0:16        'TriStream' ( out structure{})
+0:17      Function Call: EmitVertex(struct-GSPS_INPUT1;struct-GSPS_INPUT1; ( temp void)
+0:17        direct index ( temp structure{})
+0:17          'input' ( in 3-element array of structure{})
+0:17          Constant:
+0:17            2 (const int)
+0:17        'TriStream' ( out structure{})
+0:14  Function Definition: main( ( temp void)
+0:14    Function Parameters: 
+0:?     Sequence
+0:14      move second child to first child ( temp 3-element array of structure{})
+0:?         'input' ( temp 3-element array of structure{})
+0:?         'input' ( in 3-element array of structure{})
+0:14      Function Call: @main(struct-GSPS_INPUT1[3];struct-GSPS_INPUT1; ( temp void)
+0:?         'input' ( temp 3-element array of structure{})
+0:?         'TriStream' ( temp structure{})
+0:?   Linker Objects
+
+error: SPIRV-Tools Validation Errors
+error: Output variable id <23> is used by entry point 'main' id <4>, but is not listed as an interface
+  %TriStream_1 = OpVariable %_ptr_Output_GSPS_INPUT Output
+
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 57
+
+                              Capability Geometry
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Geometry 4  "main"
+                              ExecutionMode 4 Triangles
+                              ExecutionMode 4 Invocations 1
+                              ExecutionMode 4 OutputTriangleStrip
+                              ExecutionMode 4 OutputVertices 3
+                              Source HLSL 500
+                              Name 4  "main"
+                              Name 6  "GSPS_INPUT"
+                              Name 11  "EmitVertex(struct-GSPS_INPUT1;struct-GSPS_INPUT1;"
+                              Name 9  "output"
+                              Name 10  "TriStream"
+                              Name 20  "@main(struct-GSPS_INPUT1[3];struct-GSPS_INPUT1;"
+                              Name 18  "input"
+                              Name 19  "TriStream"
+                              Name 23  "TriStream"
+                              Name 27  "param"
+                              Name 30  "param"
+                              Name 34  "param"
+                              Name 37  "param"
+                              Name 41  "param"
+                              Name 44  "param"
+                              Name 47  "input"
+                              Name 49  "input"
+                              Name 51  "TriStream"
+                              Name 52  "param"
+                              Name 54  "param"
+               2:             TypeVoid
+               3:             TypeFunction 2
+   6(GSPS_INPUT):             TypeStruct
+               7:             TypePointer Function 6(GSPS_INPUT)
+               8:             TypeFunction 2 7(ptr) 7(ptr)
+              13:             TypeInt 32 0
+              14:     13(int) Constant 3
+              15:             TypeArray 6(GSPS_INPUT) 14
+              16:             TypePointer Function 15
+              17:             TypeFunction 2 16(ptr) 7(ptr)
+              22:             TypePointer Output 6(GSPS_INPUT)
+   23(TriStream):     22(ptr) Variable Output
+              25:             TypeInt 32 1
+              26:     25(int) Constant 0
+              33:     25(int) Constant 1
+              40:     25(int) Constant 2
+              48:             TypePointer Input 15
+       49(input):     48(ptr) Variable Input
+         4(main):           2 Function None 3
+               5:             Label
+       47(input):     16(ptr) Variable Function
+   51(TriStream):      7(ptr) Variable Function
+       52(param):     16(ptr) Variable Function
+       54(param):      7(ptr) Variable Function
+              50:          15 Load 49(input)
+                              Store 47(input) 50
+              53:          15 Load 47(input)
+                              Store 52(param) 53
+              55:           2 FunctionCall 20(@main(struct-GSPS_INPUT1[3];struct-GSPS_INPUT1;) 52(param) 54(param)
+              56:6(GSPS_INPUT) Load 54(param)
+                              Store 51(TriStream) 56
+                              Return
+                              FunctionEnd
+11(EmitVertex(struct-GSPS_INPUT1;struct-GSPS_INPUT1;):           2 Function None 8
+       9(output):      7(ptr) FunctionParameter
+   10(TriStream):      7(ptr) FunctionParameter
+              12:             Label
+              24:6(GSPS_INPUT) Load 9(output)
+                              Store 23(TriStream) 24
+                              EmitVertex
+                              Return
+                              FunctionEnd
+20(@main(struct-GSPS_INPUT1[3];struct-GSPS_INPUT1;):           2 Function None 17
+       18(input):     16(ptr) FunctionParameter
+   19(TriStream):      7(ptr) FunctionParameter
+              21:             Label
+       27(param):      7(ptr) Variable Function
+       30(param):      7(ptr) Variable Function
+       34(param):      7(ptr) Variable Function
+       37(param):      7(ptr) Variable Function
+       41(param):      7(ptr) Variable Function
+       44(param):      7(ptr) Variable Function
+              28:      7(ptr) AccessChain 18(input) 26
+              29:6(GSPS_INPUT) Load 28
+                              Store 27(param) 29
+              31:           2 FunctionCall 11(EmitVertex(struct-GSPS_INPUT1;struct-GSPS_INPUT1;) 27(param) 30(param)
+              32:6(GSPS_INPUT) Load 30(param)
+                              Store 19(TriStream) 32
+              35:      7(ptr) AccessChain 18(input) 33
+              36:6(GSPS_INPUT) Load 35
+                              Store 34(param) 36
+              38:           2 FunctionCall 11(EmitVertex(struct-GSPS_INPUT1;struct-GSPS_INPUT1;) 34(param) 37(param)
+              39:6(GSPS_INPUT) Load 37(param)
+                              Store 19(TriStream) 39
+              42:      7(ptr) AccessChain 18(input) 40
+              43:6(GSPS_INPUT) Load 42
+                              Store 41(param) 43
+              45:           2 FunctionCall 11(EmitVertex(struct-GSPS_INPUT1;struct-GSPS_INPUT1;) 41(param) 44(param)
+              46:6(GSPS_INPUT) Load 44(param)
+                              Store 19(TriStream) 46
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/hlsl.tx.bracket.frag.out b/Test/baseResults/hlsl.tx.bracket.frag.out
index 0ea9c68..400beb6 100644
--- a/Test/baseResults/hlsl.tx.bracket.frag.out
+++ b/Test/baseResults/hlsl.tx.bracket.frag.out
@@ -183,7 +183,7 @@
 0:?     Sequence
 0:45      Sequence
 0:45        move second child to first child ( temp 4-component vector of float)
-0:?           'Color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 0:45          Color: direct index for structure ( temp 4-component vector of float)
 0:45            Function Call: @main( ( temp structure{ temp 4-component vector of float Color})
 0:45            Constant:
@@ -206,7 +206,7 @@
 0:?     'g_tTex2di4a' ( uniform itexture2DArray)
 0:?     'g_tTex2du4a' ( uniform utexture2DArray)
 0:?     'anon@0' (layout( row_major std140) uniform block{ uniform int c1,  uniform 2-component vector of int c2,  uniform 3-component vector of int c3,  uniform 4-component vector of int c4,  uniform int o1,  uniform 2-component vector of int o2,  uniform 3-component vector of int o3,  uniform 4-component vector of int o4})
-0:?     'Color' (layout( location=0) out 4-component vector of float)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 
 Linked fragment stage:
@@ -396,7 +396,7 @@
 0:?     Sequence
 0:45      Sequence
 0:45        move second child to first child ( temp 4-component vector of float)
-0:?           'Color' (layout( location=0) out 4-component vector of float)
+0:?           '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 0:45          Color: direct index for structure ( temp 4-component vector of float)
 0:45            Function Call: @main( ( temp structure{ temp 4-component vector of float Color})
 0:45            Constant:
@@ -419,10 +419,10 @@
 0:?     'g_tTex2di4a' ( uniform itexture2DArray)
 0:?     'g_tTex2du4a' ( uniform utexture2DArray)
 0:?     'anon@0' (layout( row_major std140) uniform block{ uniform int c1,  uniform 2-component vector of int c2,  uniform 3-component vector of int c3,  uniform 4-component vector of int c4,  uniform int o1,  uniform 2-component vector of int o2,  uniform 3-component vector of int o3,  uniform 4-component vector of int o4})
-0:?     'Color' (layout( location=0) out 4-component vector of float)
+0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 188
 
                               Capability Shader
@@ -475,7 +475,7 @@
                               Name 147  "param"
                               Name 153  "param"
                               Name 156  "psout"
-                              Name 164  "Color"
+                              Name 164  "@entryPointOutput.Color"
                               Name 169  "g_sSamp"
                               Name 172  "g_tTex1df4a"
                               Name 175  "g_tTex1di4a"
@@ -484,11 +484,11 @@
                               Name 184  "g_tTex2di4a"
                               Name 187  "g_tTex2du4a"
                               MemberDecorate 45($Global) 0 Offset 0
-                              MemberDecorate 45($Global) 1 Offset 4
+                              MemberDecorate 45($Global) 1 Offset 8
                               MemberDecorate 45($Global) 2 Offset 16
                               MemberDecorate 45($Global) 3 Offset 32
                               MemberDecorate 45($Global) 4 Offset 48
-                              MemberDecorate 45($Global) 5 Offset 52
+                              MemberDecorate 45($Global) 5 Offset 56
                               MemberDecorate 45($Global) 6 Offset 64
                               MemberDecorate 45($Global) 7 Offset 80
                               Decorate 45($Global) Block
@@ -503,7 +503,7 @@
                               Decorate 114(g_tTex3df4) DescriptorSet 0
                               Decorate 124(g_tTex3di4) DescriptorSet 0
                               Decorate 132(g_tTex3du4) DescriptorSet 0
-                              Decorate 164(Color) Location 0
+                              Decorate 164(@entryPointOutput.Color) Location 0
                               Decorate 169(g_sSamp) DescriptorSet 0
                               Decorate 169(g_sSamp) Binding 0
                               Decorate 172(g_tTex1df4a) DescriptorSet 0
@@ -573,7 +573,7 @@
              157:   20(float) Constant 1065353216
              158:   21(fvec4) ConstantComposite 157 157 157 157
              163:             TypePointer Output 21(fvec4)
-      164(Color):    163(ptr) Variable Output
+164(@entryPointOutput.Color):    163(ptr) Variable Output
              167:             TypeSampler
              168:             TypePointer UniformConstant 167
     169(g_sSamp):    168(ptr) Variable UniformConstant
@@ -599,7 +599,7 @@
                5:             Label
              165:30(PS_OUTPUT) FunctionCall 32(@main()
              166:   21(fvec4) CompositeExtract 165 0
-                              Store 164(Color) 166
+                              Store 164(@entryPointOutput.Color) 166
                               Return
                               FunctionEnd
     11(Fn1(vi4;):    7(ivec4) Function None 9
diff --git a/Test/baseResults/hlsl.tx.overload.frag.out b/Test/baseResults/hlsl.tx.overload.frag.out
new file mode 100644
index 0000000..c8d064a
--- /dev/null
+++ b/Test/baseResults/hlsl.tx.overload.frag.out
@@ -0,0 +1,247 @@
+hlsl.tx.overload.frag
+Shader version: 500
+gl_FragCoord origin is upper left
+0:? Sequence
+0:8  Function Definition: Func(t211; ( temp float)
+0:8    Function Parameters: 
+0:8      'DummyTex' ( in texture2D)
+0:?     Sequence
+0:8      Branch: Return with expression
+0:8        Constant:
+0:8          1.000000
+0:9  Function Definition: Func(t21; ( temp 4-component vector of float)
+0:9    Function Parameters: 
+0:9      'DummyTex' ( in texture2D)
+0:?     Sequence
+0:9      Branch: Return with expression
+0:?         Constant:
+0:?           0.000000
+0:?           0.000000
+0:?           0.000000
+0:?           0.000000
+0:11  Function Definition: Func(I211; ( temp float)
+0:11    Function Parameters: 
+0:11      'DummyTex' (layout( r32f) in image2D)
+0:?     Sequence
+0:11      Branch: Return with expression
+0:11        Constant:
+0:11          1.000000
+0:12  Function Definition: Func(I21; ( temp 4-component vector of float)
+0:12    Function Parameters: 
+0:12      'DummyTex' (layout( rgba32f) in image2D)
+0:?     Sequence
+0:12      Branch: Return with expression
+0:?         Constant:
+0:?           0.000000
+0:?           0.000000
+0:?           0.000000
+0:?           0.000000
+0:15  Function Definition: @main( ( temp 4-component vector of float)
+0:15    Function Parameters: 
+0:?     Sequence
+0:16      Branch: Return with expression
+0:16        add ( temp 4-component vector of float)
+0:16          add ( temp 4-component vector of float)
+0:16            add ( temp 4-component vector of float)
+0:16              Function Call: Func(t211; ( temp float)
+0:16                'tf1' ( uniform texture2D)
+0:16              Function Call: Func(t21; ( temp 4-component vector of float)
+0:16                'tf4' ( uniform texture2D)
+0:16            Function Call: Func(I211; ( temp float)
+0:16              'twf1' (layout( r32f) uniform image2D)
+0:16          Function Call: Func(I21; ( temp 4-component vector of float)
+0:16            'twf4' (layout( rgba32f) uniform image2D)
+0:15  Function Definition: main( ( temp void)
+0:15    Function Parameters: 
+0:?     Sequence
+0:15      move second child to first child ( temp 4-component vector of float)
+0:?         '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+0:15        Function Call: @main( ( temp 4-component vector of float)
+0:?   Linker Objects
+0:?     'tf1' ( uniform texture2D)
+0:?     'tf4' ( uniform texture2D)
+0:?     'twf1' (layout( r32f) uniform image2D)
+0:?     'twf4' (layout( rgba32f) uniform image2D)
+0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+
+
+Linked fragment stage:
+
+
+Shader version: 500
+gl_FragCoord origin is upper left
+0:? Sequence
+0:8  Function Definition: Func(t211; ( temp float)
+0:8    Function Parameters: 
+0:8      'DummyTex' ( in texture2D)
+0:?     Sequence
+0:8      Branch: Return with expression
+0:8        Constant:
+0:8          1.000000
+0:9  Function Definition: Func(t21; ( temp 4-component vector of float)
+0:9    Function Parameters: 
+0:9      'DummyTex' ( in texture2D)
+0:?     Sequence
+0:9      Branch: Return with expression
+0:?         Constant:
+0:?           0.000000
+0:?           0.000000
+0:?           0.000000
+0:?           0.000000
+0:11  Function Definition: Func(I211; ( temp float)
+0:11    Function Parameters: 
+0:11      'DummyTex' (layout( r32f) in image2D)
+0:?     Sequence
+0:11      Branch: Return with expression
+0:11        Constant:
+0:11          1.000000
+0:12  Function Definition: Func(I21; ( temp 4-component vector of float)
+0:12    Function Parameters: 
+0:12      'DummyTex' (layout( rgba32f) in image2D)
+0:?     Sequence
+0:12      Branch: Return with expression
+0:?         Constant:
+0:?           0.000000
+0:?           0.000000
+0:?           0.000000
+0:?           0.000000
+0:15  Function Definition: @main( ( temp 4-component vector of float)
+0:15    Function Parameters: 
+0:?     Sequence
+0:16      Branch: Return with expression
+0:16        add ( temp 4-component vector of float)
+0:16          add ( temp 4-component vector of float)
+0:16            add ( temp 4-component vector of float)
+0:16              Function Call: Func(t211; ( temp float)
+0:16                'tf1' ( uniform texture2D)
+0:16              Function Call: Func(t21; ( temp 4-component vector of float)
+0:16                'tf4' ( uniform texture2D)
+0:16            Function Call: Func(I211; ( temp float)
+0:16              'twf1' (layout( r32f) uniform image2D)
+0:16          Function Call: Func(I21; ( temp 4-component vector of float)
+0:16            'twf4' (layout( rgba32f) uniform image2D)
+0:15  Function Definition: main( ( temp void)
+0:15    Function Parameters: 
+0:?     Sequence
+0:15      move second child to first child ( temp 4-component vector of float)
+0:?         '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+0:15        Function Call: @main( ( temp 4-component vector of float)
+0:?   Linker Objects
+0:?     'tf1' ( uniform texture2D)
+0:?     'tf4' ( uniform texture2D)
+0:?     'twf1' (layout( r32f) uniform image2D)
+0:?     'twf4' (layout( rgba32f) uniform image2D)
+0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 73
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 71
+                              ExecutionMode 4 OriginUpperLeft
+                              Source HLSL 500
+                              Name 4  "main"
+                              Name 11  "Func(t211;"
+                              Name 10  "DummyTex"
+                              Name 16  "Func(t21;"
+                              Name 15  "DummyTex"
+                              Name 22  "Func(I211;"
+                              Name 21  "DummyTex"
+                              Name 28  "Func(I21;"
+                              Name 27  "DummyTex"
+                              Name 31  "@main("
+                              Name 45  "tf1"
+                              Name 46  "param"
+                              Name 49  "tf4"
+                              Name 50  "param"
+                              Name 56  "twf1"
+                              Name 57  "param"
+                              Name 63  "twf4"
+                              Name 64  "param"
+                              Name 71  "@entryPointOutput"
+                              Decorate 45(tf1) DescriptorSet 0
+                              Decorate 49(tf4) DescriptorSet 0
+                              Decorate 56(twf1) DescriptorSet 0
+                              Decorate 63(twf4) DescriptorSet 0
+                              Decorate 71(@entryPointOutput) Location 0
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeImage 6(float) 2D sampled format:Unknown
+               8:             TypePointer Function 7
+               9:             TypeFunction 6(float) 8(ptr)
+              13:             TypeVector 6(float) 4
+              14:             TypeFunction 13(fvec4) 8(ptr)
+              18:             TypeImage 6(float) 2D nonsampled format:R32f
+              19:             TypePointer Function 18
+              20:             TypeFunction 6(float) 19(ptr)
+              24:             TypeImage 6(float) 2D nonsampled format:Rgba32f
+              25:             TypePointer Function 24
+              26:             TypeFunction 13(fvec4) 25(ptr)
+              30:             TypeFunction 13(fvec4)
+              33:    6(float) Constant 1065353216
+              36:    6(float) Constant 0
+              37:   13(fvec4) ConstantComposite 36 36 36 36
+              44:             TypePointer UniformConstant 7
+         45(tf1):     44(ptr) Variable UniformConstant
+         49(tf4):     44(ptr) Variable UniformConstant
+              55:             TypePointer UniformConstant 18
+        56(twf1):     55(ptr) Variable UniformConstant
+              62:             TypePointer UniformConstant 24
+        63(twf4):     62(ptr) Variable UniformConstant
+              70:             TypePointer Output 13(fvec4)
+71(@entryPointOutput):     70(ptr) Variable Output
+         4(main):           2 Function None 3
+               5:             Label
+              72:   13(fvec4) FunctionCall 31(@main()
+                              Store 71(@entryPointOutput) 72
+                              Return
+                              FunctionEnd
+  11(Func(t211;):    6(float) Function None 9
+    10(DummyTex):      8(ptr) FunctionParameter
+              12:             Label
+                              ReturnValue 33
+                              FunctionEnd
+   16(Func(t21;):   13(fvec4) Function None 14
+    15(DummyTex):      8(ptr) FunctionParameter
+              17:             Label
+                              ReturnValue 37
+                              FunctionEnd
+  22(Func(I211;):    6(float) Function None 20
+    21(DummyTex):     19(ptr) FunctionParameter
+              23:             Label
+                              ReturnValue 33
+                              FunctionEnd
+   28(Func(I21;):   13(fvec4) Function None 26
+    27(DummyTex):     25(ptr) FunctionParameter
+              29:             Label
+                              ReturnValue 37
+                              FunctionEnd
+      31(@main():   13(fvec4) Function None 30
+              32:             Label
+       46(param):      8(ptr) Variable Function
+       50(param):      8(ptr) Variable Function
+       57(param):     19(ptr) Variable Function
+       64(param):     25(ptr) Variable Function
+              47:           7 Load 45(tf1)
+                              Store 46(param) 47
+              48:    6(float) FunctionCall 11(Func(t211;) 46(param)
+              51:           7 Load 49(tf4)
+                              Store 50(param) 51
+              52:   13(fvec4) FunctionCall 16(Func(t21;) 50(param)
+              53:   13(fvec4) CompositeConstruct 48 48 48 48
+              54:   13(fvec4) FAdd 53 52
+              58:          18 Load 56(twf1)
+                              Store 57(param) 58
+              59:    6(float) FunctionCall 22(Func(I211;) 57(param)
+              60:   13(fvec4) CompositeConstruct 59 59 59 59
+              61:   13(fvec4) FAdd 54 60
+              65:          24 Load 63(twf4)
+                              Store 64(param) 65
+              66:   13(fvec4) FunctionCall 28(Func(I21;) 64(param)
+              67:   13(fvec4) FAdd 61 66
+                              ReturnValue 67
+                              FunctionEnd
diff --git a/Test/baseResults/hlsl.type.half.frag.out b/Test/baseResults/hlsl.type.half.frag.out
index 889d79b..6b5a945 100644
--- a/Test/baseResults/hlsl.type.half.frag.out
+++ b/Test/baseResults/hlsl.type.half.frag.out
@@ -6,42 +6,70 @@
 0:3    Function Parameters: 
 0:?     Sequence
 0:4      Sequence
-0:4        move second child to first child ( temp mediump float)
-0:4          'h0' ( temp mediump float)
+0:4        move second child to first child ( temp float)
+0:4          'h0' ( temp float)
 0:4          Constant:
 0:4            0.000000
 0:5      Sequence
-0:5        move second child to first child ( temp mediump 1-component vector of float)
-0:5          'h1' ( temp mediump 1-component vector of float)
+0:5        move second child to first child ( temp 1-component vector of float)
+0:5          'h1' ( temp 1-component vector of float)
 0:5          Constant:
 0:5            1.000000
 0:6      Sequence
-0:6        move second child to first child ( temp mediump 2-component vector of float)
-0:6          'h2' ( temp mediump 2-component vector of float)
+0:6        move second child to first child ( temp 2-component vector of float)
+0:6          'h2' ( temp 2-component vector of float)
 0:6          Constant:
 0:6            2.000000
 0:6            2.000000
 0:7      Sequence
-0:7        move second child to first child ( temp mediump 3-component vector of float)
-0:7          'h3' ( temp mediump 3-component vector of float)
+0:7        move second child to first child ( temp 3-component vector of float)
+0:7          'h3' ( temp 3-component vector of float)
 0:7          Constant:
 0:7            3.000000
 0:7            3.000000
 0:7            3.000000
 0:8      Sequence
-0:8        move second child to first child ( temp mediump 4-component vector of float)
-0:8          'h4' ( temp mediump 4-component vector of float)
+0:8        move second child to first child ( temp 4-component vector of float)
+0:8          'h4' ( temp 4-component vector of float)
 0:8          Constant:
 0:8            4.000000
 0:8            4.000000
 0:8            4.000000
 0:8            4.000000
-0:10      Branch: Return with expression
-0:10        Constant:
-0:10          0.000000
-0:10          0.000000
-0:10          0.000000
-0:10          0.000000
+0:15      Sequence
+0:15        move second child to first child ( temp 2X2 matrix of float)
+0:15          'h22' ( temp 2X2 matrix of float)
+0:?           Constant:
+0:?             1.000000
+0:?             2.000000
+0:?             3.000000
+0:?             4.000000
+0:16      Sequence
+0:16        move second child to first child ( temp 2X3 matrix of float)
+0:16          'h23' ( temp 2X3 matrix of float)
+0:16          Constant:
+0:16            4.900000
+0:16            4.900000
+0:16            4.900000
+0:16            4.900000
+0:16            4.900000
+0:16            4.900000
+0:27      Branch: Return with expression
+0:27        Construct vec4 ( temp 4-component vector of float)
+0:27          add ( temp float)
+0:27            add ( temp float)
+0:27              direct index ( temp float)
+0:27                direct index ( temp 3-component vector of float)
+0:27                  'h23' ( temp 2X3 matrix of float)
+0:27                  Constant:
+0:27                    0 (const int)
+0:27                Constant:
+0:27                  0 (const int)
+0:27              direct index ( temp float)
+0:27                'h4' ( temp 4-component vector of float)
+0:27                Constant:
+0:27                  1 (const int)
+0:27            'h0' ( temp float)
 0:3  Function Definition: main( ( temp void)
 0:3    Function Parameters: 
 0:?     Sequence
@@ -62,42 +90,70 @@
 0:3    Function Parameters: 
 0:?     Sequence
 0:4      Sequence
-0:4        move second child to first child ( temp mediump float)
-0:4          'h0' ( temp mediump float)
+0:4        move second child to first child ( temp float)
+0:4          'h0' ( temp float)
 0:4          Constant:
 0:4            0.000000
 0:5      Sequence
-0:5        move second child to first child ( temp mediump 1-component vector of float)
-0:5          'h1' ( temp mediump 1-component vector of float)
+0:5        move second child to first child ( temp 1-component vector of float)
+0:5          'h1' ( temp 1-component vector of float)
 0:5          Constant:
 0:5            1.000000
 0:6      Sequence
-0:6        move second child to first child ( temp mediump 2-component vector of float)
-0:6          'h2' ( temp mediump 2-component vector of float)
+0:6        move second child to first child ( temp 2-component vector of float)
+0:6          'h2' ( temp 2-component vector of float)
 0:6          Constant:
 0:6            2.000000
 0:6            2.000000
 0:7      Sequence
-0:7        move second child to first child ( temp mediump 3-component vector of float)
-0:7          'h3' ( temp mediump 3-component vector of float)
+0:7        move second child to first child ( temp 3-component vector of float)
+0:7          'h3' ( temp 3-component vector of float)
 0:7          Constant:
 0:7            3.000000
 0:7            3.000000
 0:7            3.000000
 0:8      Sequence
-0:8        move second child to first child ( temp mediump 4-component vector of float)
-0:8          'h4' ( temp mediump 4-component vector of float)
+0:8        move second child to first child ( temp 4-component vector of float)
+0:8          'h4' ( temp 4-component vector of float)
 0:8          Constant:
 0:8            4.000000
 0:8            4.000000
 0:8            4.000000
 0:8            4.000000
-0:10      Branch: Return with expression
-0:10        Constant:
-0:10          0.000000
-0:10          0.000000
-0:10          0.000000
-0:10          0.000000
+0:15      Sequence
+0:15        move second child to first child ( temp 2X2 matrix of float)
+0:15          'h22' ( temp 2X2 matrix of float)
+0:?           Constant:
+0:?             1.000000
+0:?             2.000000
+0:?             3.000000
+0:?             4.000000
+0:16      Sequence
+0:16        move second child to first child ( temp 2X3 matrix of float)
+0:16          'h23' ( temp 2X3 matrix of float)
+0:16          Constant:
+0:16            4.900000
+0:16            4.900000
+0:16            4.900000
+0:16            4.900000
+0:16            4.900000
+0:16            4.900000
+0:27      Branch: Return with expression
+0:27        Construct vec4 ( temp 4-component vector of float)
+0:27          add ( temp float)
+0:27            add ( temp float)
+0:27              direct index ( temp float)
+0:27                direct index ( temp 3-component vector of float)
+0:27                  'h23' ( temp 2X3 matrix of float)
+0:27                  Constant:
+0:27                    0 (const int)
+0:27                Constant:
+0:27                  0 (const int)
+0:27              direct index ( temp float)
+0:27                'h4' ( temp 4-component vector of float)
+0:27                Constant:
+0:27                  1 (const int)
+0:27            'h0' ( temp float)
 0:3  Function Definition: main( ( temp void)
 0:3    Function Parameters: 
 0:?     Sequence
@@ -108,13 +164,13 @@
 0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80001
-// Id's are bound by 36
+// Generated by (magic number): 80007
+// Id's are bound by 60
 
                               Capability Shader
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "main" 34
+                              EntryPoint Fragment 4  "main" 58
                               ExecutionMode 4 OriginUpperLeft
                               Source HLSL 500
                               Name 4  "main"
@@ -124,13 +180,10 @@
                               Name 18  "h2"
                               Name 23  "h3"
                               Name 27  "h4"
-                              Name 34  "@entryPointOutput"
-                              Decorate 12(h0) RelaxedPrecision
-                              Decorate 14(h1) RelaxedPrecision
-                              Decorate 18(h2) RelaxedPrecision
-                              Decorate 23(h3) RelaxedPrecision
-                              Decorate 27(h4) RelaxedPrecision
-                              Decorate 34(@entryPointOutput) Location 0
+                              Name 32  "h22"
+                              Name 38  "h23"
+                              Name 58  "@entryPointOutput"
+                              Decorate 58(@entryPointOutput) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -150,13 +203,27 @@
               26:             TypePointer Function 7(fvec4)
               28:    6(float) Constant 1082130432
               29:    7(fvec4) ConstantComposite 28 28 28 28
-              30:    7(fvec4) ConstantComposite 13 13 13 13
-              33:             TypePointer Output 7(fvec4)
-34(@entryPointOutput):     33(ptr) Variable Output
+              30:             TypeMatrix 16(fvec2) 2
+              31:             TypePointer Function 30
+              33:   16(fvec2) ConstantComposite 15 19
+              34:   16(fvec2) ConstantComposite 24 28
+              35:          30 ConstantComposite 33 34
+              36:             TypeMatrix 21(fvec3) 2
+              37:             TypePointer Function 36
+              39:    6(float) Constant 1084017869
+              40:   21(fvec3) ConstantComposite 39 39 39
+              41:          36 ConstantComposite 40 40
+              42:             TypeInt 32 1
+              43:     42(int) Constant 0
+              44:             TypeInt 32 0
+              45:     44(int) Constant 0
+              48:     44(int) Constant 1
+              57:             TypePointer Output 7(fvec4)
+58(@entryPointOutput):     57(ptr) Variable Output
          4(main):           2 Function None 3
                5:             Label
-              35:    7(fvec4) FunctionCall 9(@main()
-                              Store 34(@entryPointOutput) 35
+              59:    7(fvec4) FunctionCall 9(@main()
+                              Store 58(@entryPointOutput) 59
                               Return
                               FunctionEnd
        9(@main():    7(fvec4) Function None 8
@@ -166,10 +233,22 @@
           18(h2):     17(ptr) Variable Function
           23(h3):     22(ptr) Variable Function
           27(h4):     26(ptr) Variable Function
+         32(h22):     31(ptr) Variable Function
+         38(h23):     37(ptr) Variable Function
                               Store 12(h0) 13
                               Store 14(h1) 15
                               Store 18(h2) 20
                               Store 23(h3) 25
                               Store 27(h4) 29
-                              ReturnValue 30
+                              Store 32(h22) 35
+                              Store 38(h23) 41
+              46:     11(ptr) AccessChain 38(h23) 43 45
+              47:    6(float) Load 46
+              49:     11(ptr) AccessChain 27(h4) 48
+              50:    6(float) Load 49
+              51:    6(float) FAdd 47 50
+              52:    6(float) Load 12(h0)
+              53:    6(float) FAdd 51 52
+              54:    7(fvec4) CompositeConstruct 53 53 53 53
+                              ReturnValue 54
                               FunctionEnd
diff --git a/Test/baseResults/hlsl.type.identifier.frag.out b/Test/baseResults/hlsl.type.identifier.frag.out
index 1977340..2eaa2ae 100644
--- a/Test/baseResults/hlsl.type.identifier.frag.out
+++ b/Test/baseResults/hlsl.type.identifier.frag.out
@@ -50,8 +50,8 @@
 0:15          'min10float' ( temp mediump float)
 0:15          'min16float' ( temp mediump float)
 0:16      Sequence
-0:16        move second child to first child ( temp mediump float)
-0:16          'half' ( temp mediump float)
+0:16        move second child to first child ( temp float)
+0:16          'half' ( temp float)
 0:16          Constant:
 0:16            0.500000
 0:?       Sequence
@@ -86,7 +86,7 @@
 0:25                    'uint' ( temp mediump uint)
 0:25                'min16float' ( temp mediump float)
 0:25              'min10float' ( temp mediump float)
-0:25            Test condition and select ( temp mediump float)
+0:25            Test condition and select ( temp mediump float): no shortcircuit
 0:25              Condition
 0:25              direct index ( temp bool)
 0:25                'bool' ( temp 2-element array of bool)
@@ -99,9 +99,28 @@
 0:25              'float' ( temp mediump float)
 0:25          Function Call: fn(f1; ( temp mediump float)
 0:25            'float' ( temp mediump float)
-0:27      Branch: Return with expression
-0:27        Construct vec4 ( temp 4-component vector of float)
-0:27          'float' ( temp float)
+0:28      move second child to first child ( temp float)
+0:28        direct index ( temp float)
+0:28          direct index ( temp 3-component vector of float)
+0:28            'half2x3' ( temp 2X3 matrix of float)
+0:28            Constant:
+0:28              0 (const int)
+0:28          Constant:
+0:28            0 (const int)
+0:28        component-wise multiply ( temp float)
+0:28          'float' ( temp float)
+0:28          'float' ( temp float)
+0:30      Branch: Return with expression
+0:30        Construct vec4 ( temp 4-component vector of float)
+0:30          add ( temp float)
+0:30            'float' ( temp float)
+0:30            direct index ( temp float)
+0:30              direct index ( temp 3-component vector of float)
+0:30                'half2x3' ( temp 2X3 matrix of float)
+0:30                Constant:
+0:30                  0 (const int)
+0:30              Constant:
+0:30                0 (const int)
 0:9  Function Definition: main( ( temp void)
 0:9    Function Parameters: 
 0:?     Sequence
@@ -166,8 +185,8 @@
 0:15          'min10float' ( temp mediump float)
 0:15          'min16float' ( temp mediump float)
 0:16      Sequence
-0:16        move second child to first child ( temp mediump float)
-0:16          'half' ( temp mediump float)
+0:16        move second child to first child ( temp float)
+0:16          'half' ( temp float)
 0:16          Constant:
 0:16            0.500000
 0:?       Sequence
@@ -202,7 +221,7 @@
 0:25                    'uint' ( temp mediump uint)
 0:25                'min16float' ( temp mediump float)
 0:25              'min10float' ( temp mediump float)
-0:25            Test condition and select ( temp mediump float)
+0:25            Test condition and select ( temp mediump float): no shortcircuit
 0:25              Condition
 0:25              direct index ( temp bool)
 0:25                'bool' ( temp 2-element array of bool)
@@ -215,9 +234,28 @@
 0:25              'float' ( temp mediump float)
 0:25          Function Call: fn(f1; ( temp mediump float)
 0:25            'float' ( temp mediump float)
-0:27      Branch: Return with expression
-0:27        Construct vec4 ( temp 4-component vector of float)
-0:27          'float' ( temp float)
+0:28      move second child to first child ( temp float)
+0:28        direct index ( temp float)
+0:28          direct index ( temp 3-component vector of float)
+0:28            'half2x3' ( temp 2X3 matrix of float)
+0:28            Constant:
+0:28              0 (const int)
+0:28          Constant:
+0:28            0 (const int)
+0:28        component-wise multiply ( temp float)
+0:28          'float' ( temp float)
+0:28          'float' ( temp float)
+0:30      Branch: Return with expression
+0:30        Construct vec4 ( temp 4-component vector of float)
+0:30          add ( temp float)
+0:30            'float' ( temp float)
+0:30            direct index ( temp float)
+0:30              direct index ( temp 3-component vector of float)
+0:30                'half2x3' ( temp 2X3 matrix of float)
+0:30                Constant:
+0:30                  0 (const int)
+0:30              Constant:
+0:30                0 (const int)
 0:9  Function Definition: main( ( temp void)
 0:9    Function Parameters: 
 0:?     Sequence
@@ -228,13 +266,13 @@
 0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80001
-// Id's are bound by 97
+// Generated by (magic number): 80007
+// Id's are bound by 105
 
                               Capability Shader
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "main" 95
+                              EntryPoint Fragment 4  "main" 103
                               ExecutionMode 4 OriginUpperLeft
                               Source HLSL 500
                               Name 4  "main"
@@ -251,14 +289,14 @@
                               Name 56  "foo_t"
                               MemberName 56(foo_t) 0  "float"
                               Name 58  "float"
-                              Name 86  "param"
-                              Name 95  "@entryPointOutput"
+                              Name 82  "param"
+                              Name 89  "half2x3"
+                              Name 103  "@entryPointOutput"
                               Decorate 49(min16float) RelaxedPrecision
                               Decorate 50 RelaxedPrecision
                               Decorate 51 RelaxedPrecision
                               Decorate 52(min10float) RelaxedPrecision
                               Decorate 53 RelaxedPrecision
-                              Decorate 54(half) RelaxedPrecision
                               Decorate 64 RelaxedPrecision
                               Decorate 65 RelaxedPrecision
                               Decorate 66 RelaxedPrecision
@@ -270,15 +308,14 @@
                               Decorate 72 RelaxedPrecision
                               Decorate 73 RelaxedPrecision
                               Decorate 74 RelaxedPrecision
-                              Decorate 80 RelaxedPrecision
+                              Decorate 77 RelaxedPrecision
+                              Decorate 78 RelaxedPrecision
+                              Decorate 79 RelaxedPrecision
                               Decorate 81 RelaxedPrecision
                               Decorate 83 RelaxedPrecision
                               Decorate 84 RelaxedPrecision
                               Decorate 85 RelaxedPrecision
-                              Decorate 87 RelaxedPrecision
-                              Decorate 88 RelaxedPrecision
-                              Decorate 89 RelaxedPrecision
-                              Decorate 95(@entryPointOutput) Location 0
+                              Decorate 103(@entryPointOutput) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -303,12 +340,16 @@
        56(foo_t):             TypeStruct 6(float)
               57:             TypePointer Function 56(foo_t)
               59:    6(float) Constant 1109917696
-              94:             TypePointer Output 12(fvec4)
-95(@entryPointOutput):     94(ptr) Variable Output
+              86:             TypeVector 6(float) 3
+              87:             TypeMatrix 86(fvec3) 2
+              88:             TypePointer Function 87
+              93:     22(int) Constant 0
+             102:             TypePointer Output 12(fvec4)
+103(@entryPointOutput):    102(ptr) Variable Output
          4(main):           2 Function None 3
                5:             Label
-              96:   12(fvec4) FunctionCall 14(@main()
-                              Store 95(@entryPointOutput) 96
+             104:   12(fvec4) FunctionCall 14(@main()
+                              Store 103(@entryPointOutput) 104
                               Return
                               FunctionEnd
       10(fn(f1;):    6(float) Function None 8
@@ -327,8 +368,8 @@
   52(min10float):      7(ptr) Variable Function
         54(half):      7(ptr) Variable Function
        58(float):     57(ptr) Variable Function
-              75:      7(ptr) Variable Function
-       86(param):      7(ptr) Variable Function
+       82(param):      7(ptr) Variable Function
+     89(half2x3):     88(ptr) Variable Function
                               Store 19(float) 20
               27:    6(float) Load 19(float)
               29:    21(bool) FOrdNotEqual 27 28
@@ -369,28 +410,27 @@
               72:    6(float) FAdd 70 71
               73:    6(float) Load 52(min10float)
               74:    6(float) FAdd 72 73
-              76:     37(ptr) AccessChain 26(bool) 40
-              77:    21(bool) Load 76
-                              SelectionMerge 79 None
-                              BranchConditional 77 78 82
-              78:               Label
-              80:     33(int)   Load 35(int)
-              81:    6(float)   ConvertSToF 80
-                                Store 75 81
-                                Branch 79
-              82:               Label
-              83:    6(float)   Load 19(float)
-                                Store 75 83
-                                Branch 79
-              79:             Label
-              84:    6(float) Load 75
-              85:    6(float) FAdd 74 84
-              87:    6(float) Load 19(float)
-                              Store 86(param) 87
-              88:    6(float) FunctionCall 10(fn(f1;) 86(param)
-              89:    6(float) FAdd 85 88
-                              Store 19(float) 89
+              75:     37(ptr) AccessChain 26(bool) 40
+              76:    21(bool) Load 75
+              77:     33(int) Load 35(int)
+              78:    6(float) ConvertSToF 77
+              79:    6(float) Load 19(float)
+              80:    6(float) Select 76 78 79
+              81:    6(float) FAdd 74 80
+              83:    6(float) Load 19(float)
+                              Store 82(param) 83
+              84:    6(float) FunctionCall 10(fn(f1;) 82(param)
+              85:    6(float) FAdd 81 84
+                              Store 19(float) 85
               90:    6(float) Load 19(float)
-              91:   12(fvec4) CompositeConstruct 90 90 90 90
-                              ReturnValue 91
+              91:    6(float) Load 19(float)
+              92:    6(float) FMul 90 91
+              94:      7(ptr) AccessChain 89(half2x3) 40 93
+                              Store 94 92
+              95:    6(float) Load 19(float)
+              96:      7(ptr) AccessChain 89(half2x3) 40 93
+              97:    6(float) Load 96
+              98:    6(float) FAdd 95 97
+              99:   12(fvec4) CompositeConstruct 98 98 98 98
+                              ReturnValue 99
                               FunctionEnd
diff --git a/Test/baseResults/hlsl.type.type.conversion.all.frag.out b/Test/baseResults/hlsl.type.type.conversion.all.frag.out
new file mode 100644
index 0000000..083c929
--- /dev/null
+++ b/Test/baseResults/hlsl.type.type.conversion.all.frag.out
@@ -0,0 +1,1469 @@
+hlsl.type.type.conversion.all.frag
+ERROR: 0:88: '=' :  cannot convert from ' const 2X2 matrix of float' to ' temp 2-component vector of float'
+ERROR: 0:89: '=' :  cannot convert from ' const 2X3 matrix of float' to ' temp 2-component vector of float'
+ERROR: 0:90: '=' :  cannot convert from ' const 2X4 matrix of float' to ' temp 2-component vector of float'
+ERROR: 0:91: '=' :  cannot convert from ' const 3X2 matrix of float' to ' temp 2-component vector of float'
+ERROR: 0:92: '=' :  cannot convert from ' const 3X3 matrix of float' to ' temp 2-component vector of float'
+ERROR: 0:93: '=' :  cannot convert from ' const 3X4 matrix of float' to ' temp 2-component vector of float'
+ERROR: 0:94: '=' :  cannot convert from ' const 4X2 matrix of float' to ' temp 2-component vector of float'
+ERROR: 0:95: '=' :  cannot convert from ' const 4X3 matrix of float' to ' temp 2-component vector of float'
+ERROR: 0:96: '=' :  cannot convert from ' const 4X4 matrix of float' to ' temp 2-component vector of float'
+ERROR: 0:97: '=' :  cannot convert from ' const 2-component vector of float' to ' temp 3-component vector of float'
+ERROR: 0:98: '=' :  cannot convert from ' const 2X2 matrix of float' to ' temp 3-component vector of float'
+ERROR: 0:99: '=' :  cannot convert from ' const 2X3 matrix of float' to ' temp 3-component vector of float'
+ERROR: 0:100: '=' :  cannot convert from ' const 2X4 matrix of float' to ' temp 3-component vector of float'
+ERROR: 0:101: '=' :  cannot convert from ' const 3X2 matrix of float' to ' temp 3-component vector of float'
+ERROR: 0:102: '=' :  cannot convert from ' const 3X3 matrix of float' to ' temp 3-component vector of float'
+ERROR: 0:103: '=' :  cannot convert from ' const 3X4 matrix of float' to ' temp 3-component vector of float'
+ERROR: 0:104: '=' :  cannot convert from ' const 4X2 matrix of float' to ' temp 3-component vector of float'
+ERROR: 0:105: '=' :  cannot convert from ' const 4X3 matrix of float' to ' temp 3-component vector of float'
+ERROR: 0:106: '=' :  cannot convert from ' const 4X4 matrix of float' to ' temp 3-component vector of float'
+ERROR: 0:107: '=' :  cannot convert from ' const 2-component vector of float' to ' temp 4-component vector of float'
+ERROR: 0:108: '=' :  cannot convert from ' const 3-component vector of float' to ' temp 4-component vector of float'
+ERROR: 0:109: '=' :  cannot convert from ' const 2X3 matrix of float' to ' temp 4-component vector of float'
+ERROR: 0:110: '=' :  cannot convert from ' const 2X4 matrix of float' to ' temp 4-component vector of float'
+ERROR: 0:111: '=' :  cannot convert from ' const 3X2 matrix of float' to ' temp 4-component vector of float'
+ERROR: 0:112: '=' :  cannot convert from ' const 3X3 matrix of float' to ' temp 4-component vector of float'
+ERROR: 0:113: '=' :  cannot convert from ' const 3X4 matrix of float' to ' temp 4-component vector of float'
+ERROR: 0:114: '=' :  cannot convert from ' const 4X2 matrix of float' to ' temp 4-component vector of float'
+ERROR: 0:115: '=' :  cannot convert from ' const 4X3 matrix of float' to ' temp 4-component vector of float'
+ERROR: 0:116: '=' :  cannot convert from ' const 4X4 matrix of float' to ' temp 4-component vector of float'
+ERROR: 0:117: '=' :  cannot convert from ' const 2-component vector of float' to ' temp 2X2 matrix of float'
+ERROR: 0:118: '=' :  cannot convert from ' const 3-component vector of float' to ' temp 2X2 matrix of float'
+ERROR: 0:119: '=' :  cannot convert from ' const 2-component vector of float' to ' temp 2X3 matrix of float'
+ERROR: 0:120: '=' :  cannot convert from ' const 3-component vector of float' to ' temp 2X3 matrix of float'
+ERROR: 0:121: '=' :  cannot convert from ' const 4-component vector of float' to ' temp 2X3 matrix of float'
+ERROR: 0:122: '=' :  cannot convert from ' const 2X2 matrix of float' to ' temp 2X3 matrix of float'
+ERROR: 0:123: '=' :  cannot convert from ' const 3X2 matrix of float' to ' temp 2X3 matrix of float'
+ERROR: 0:124: '=' :  cannot convert from ' const 4X2 matrix of float' to ' temp 2X3 matrix of float'
+ERROR: 0:125: '=' :  cannot convert from ' const 2-component vector of float' to ' temp 2X4 matrix of float'
+ERROR: 0:126: '=' :  cannot convert from ' const 3-component vector of float' to ' temp 2X4 matrix of float'
+ERROR: 0:127: '=' :  cannot convert from ' const 4-component vector of float' to ' temp 2X4 matrix of float'
+ERROR: 0:128: '=' :  cannot convert from ' const 2X2 matrix of float' to ' temp 2X4 matrix of float'
+ERROR: 0:129: '=' :  cannot convert from ' const 2X3 matrix of float' to ' temp 2X4 matrix of float'
+ERROR: 0:130: '=' :  cannot convert from ' const 3X2 matrix of float' to ' temp 2X4 matrix of float'
+ERROR: 0:131: '=' :  cannot convert from ' const 3X3 matrix of float' to ' temp 2X4 matrix of float'
+ERROR: 0:132: '=' :  cannot convert from ' const 4X2 matrix of float' to ' temp 2X4 matrix of float'
+ERROR: 0:133: '=' :  cannot convert from ' const 4X3 matrix of float' to ' temp 2X4 matrix of float'
+ERROR: 0:134: '=' :  cannot convert from ' const 2-component vector of float' to ' temp 3X2 matrix of float'
+ERROR: 0:135: '=' :  cannot convert from ' const 3-component vector of float' to ' temp 3X2 matrix of float'
+ERROR: 0:136: '=' :  cannot convert from ' const 4-component vector of float' to ' temp 3X2 matrix of float'
+ERROR: 0:137: '=' :  cannot convert from ' const 2X2 matrix of float' to ' temp 3X2 matrix of float'
+ERROR: 0:138: '=' :  cannot convert from ' const 2X3 matrix of float' to ' temp 3X2 matrix of float'
+ERROR: 0:139: '=' :  cannot convert from ' const 2X4 matrix of float' to ' temp 3X2 matrix of float'
+ERROR: 0:140: '=' :  cannot convert from ' const 2-component vector of float' to ' temp 3X3 matrix of float'
+ERROR: 0:141: '=' :  cannot convert from ' const 3-component vector of float' to ' temp 3X3 matrix of float'
+ERROR: 0:142: '=' :  cannot convert from ' const 4-component vector of float' to ' temp 3X3 matrix of float'
+ERROR: 0:143: '=' :  cannot convert from ' const 2X2 matrix of float' to ' temp 3X3 matrix of float'
+ERROR: 0:144: '=' :  cannot convert from ' const 2X3 matrix of float' to ' temp 3X3 matrix of float'
+ERROR: 0:145: '=' :  cannot convert from ' const 2X4 matrix of float' to ' temp 3X3 matrix of float'
+ERROR: 0:146: '=' :  cannot convert from ' const 3X2 matrix of float' to ' temp 3X3 matrix of float'
+ERROR: 0:147: '=' :  cannot convert from ' const 4X2 matrix of float' to ' temp 3X3 matrix of float'
+ERROR: 0:148: '=' :  cannot convert from ' const 2-component vector of float' to ' temp 3X4 matrix of float'
+ERROR: 0:149: '=' :  cannot convert from ' const 3-component vector of float' to ' temp 3X4 matrix of float'
+ERROR: 0:150: '=' :  cannot convert from ' const 4-component vector of float' to ' temp 3X4 matrix of float'
+ERROR: 0:151: '=' :  cannot convert from ' const 2X2 matrix of float' to ' temp 3X4 matrix of float'
+ERROR: 0:152: '=' :  cannot convert from ' const 2X3 matrix of float' to ' temp 3X4 matrix of float'
+ERROR: 0:153: '=' :  cannot convert from ' const 2X4 matrix of float' to ' temp 3X4 matrix of float'
+ERROR: 0:154: '=' :  cannot convert from ' const 3X2 matrix of float' to ' temp 3X4 matrix of float'
+ERROR: 0:155: '=' :  cannot convert from ' const 3X3 matrix of float' to ' temp 3X4 matrix of float'
+ERROR: 0:156: '=' :  cannot convert from ' const 4X2 matrix of float' to ' temp 3X4 matrix of float'
+ERROR: 0:157: '=' :  cannot convert from ' const 4X3 matrix of float' to ' temp 3X4 matrix of float'
+ERROR: 0:158: '=' :  cannot convert from ' const 2-component vector of float' to ' temp 4X2 matrix of float'
+ERROR: 0:159: '=' :  cannot convert from ' const 3-component vector of float' to ' temp 4X2 matrix of float'
+ERROR: 0:160: '=' :  cannot convert from ' const 4-component vector of float' to ' temp 4X2 matrix of float'
+ERROR: 0:161: '=' :  cannot convert from ' const 2X2 matrix of float' to ' temp 4X2 matrix of float'
+ERROR: 0:162: '=' :  cannot convert from ' const 2X3 matrix of float' to ' temp 4X2 matrix of float'
+ERROR: 0:163: '=' :  cannot convert from ' const 2X4 matrix of float' to ' temp 4X2 matrix of float'
+ERROR: 0:164: '=' :  cannot convert from ' const 3X2 matrix of float' to ' temp 4X2 matrix of float'
+ERROR: 0:165: '=' :  cannot convert from ' const 3X3 matrix of float' to ' temp 4X2 matrix of float'
+ERROR: 0:166: '=' :  cannot convert from ' const 3X4 matrix of float' to ' temp 4X2 matrix of float'
+ERROR: 0:167: '=' :  cannot convert from ' const 2-component vector of float' to ' temp 4X3 matrix of float'
+ERROR: 0:168: '=' :  cannot convert from ' const 3-component vector of float' to ' temp 4X3 matrix of float'
+ERROR: 0:169: '=' :  cannot convert from ' const 4-component vector of float' to ' temp 4X3 matrix of float'
+ERROR: 0:170: '=' :  cannot convert from ' const 2X2 matrix of float' to ' temp 4X3 matrix of float'
+ERROR: 0:171: '=' :  cannot convert from ' const 2X3 matrix of float' to ' temp 4X3 matrix of float'
+ERROR: 0:172: '=' :  cannot convert from ' const 2X4 matrix of float' to ' temp 4X3 matrix of float'
+ERROR: 0:173: '=' :  cannot convert from ' const 3X2 matrix of float' to ' temp 4X3 matrix of float'
+ERROR: 0:174: '=' :  cannot convert from ' const 3X3 matrix of float' to ' temp 4X3 matrix of float'
+ERROR: 0:175: '=' :  cannot convert from ' const 3X4 matrix of float' to ' temp 4X3 matrix of float'
+ERROR: 0:176: '=' :  cannot convert from ' const 4X2 matrix of float' to ' temp 4X3 matrix of float'
+ERROR: 0:177: '=' :  cannot convert from ' const 2-component vector of float' to ' temp 4X4 matrix of float'
+ERROR: 0:178: '=' :  cannot convert from ' const 3-component vector of float' to ' temp 4X4 matrix of float'
+ERROR: 0:179: '=' :  cannot convert from ' const 4-component vector of float' to ' temp 4X4 matrix of float'
+ERROR: 0:180: '=' :  cannot convert from ' const 2X2 matrix of float' to ' temp 4X4 matrix of float'
+ERROR: 0:181: '=' :  cannot convert from ' const 2X3 matrix of float' to ' temp 4X4 matrix of float'
+ERROR: 0:182: '=' :  cannot convert from ' const 2X4 matrix of float' to ' temp 4X4 matrix of float'
+ERROR: 0:183: '=' :  cannot convert from ' const 3X2 matrix of float' to ' temp 4X4 matrix of float'
+ERROR: 0:184: '=' :  cannot convert from ' const 3X3 matrix of float' to ' temp 4X4 matrix of float'
+ERROR: 0:185: '=' :  cannot convert from ' const 3X4 matrix of float' to ' temp 4X4 matrix of float'
+ERROR: 0:186: '=' :  cannot convert from ' const 4X2 matrix of float' to ' temp 4X4 matrix of float'
+ERROR: 0:187: '=' :  cannot convert from ' const 4X3 matrix of float' to ' temp 4X4 matrix of float'
+ERROR: 100 compilation errors.  No code generated.
+
+
+Shader version: 500
+gl_FragCoord origin is upper left
+ERROR: node is still EOpNull!
+0:18  Function Definition: @main( ( temp 4-component vector of float)
+0:18    Function Parameters: 
+0:?     Sequence
+0:19      Sequence
+0:19        move second child to first child ( temp float)
+0:19          'var0' ( temp float)
+0:19          Constant:
+0:19            0.000000
+0:20      Sequence
+0:20        move second child to first child ( temp 2-component vector of float)
+0:20          'var13' ( temp 2-component vector of float)
+0:20          Constant:
+0:20            0.000000
+0:20            0.000000
+0:21      Sequence
+0:21        move second child to first child ( temp 2-component vector of float)
+0:21          'var14' ( temp 2-component vector of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:22      Sequence
+0:22        move second child to first child ( temp 3-component vector of float)
+0:22          'var26' ( temp 3-component vector of float)
+0:22          Constant:
+0:22            0.000000
+0:22            0.000000
+0:22            0.000000
+0:23      Sequence
+0:23        move second child to first child ( temp 3-component vector of float)
+0:23          'var28' ( temp 3-component vector of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:24      Sequence
+0:24        move second child to first child ( temp 4-component vector of float)
+0:24          'var39' ( temp 4-component vector of float)
+0:24          Constant:
+0:24            0.000000
+0:24            0.000000
+0:24            0.000000
+0:24            0.000000
+0:25      Sequence
+0:25        move second child to first child ( temp 4-component vector of float)
+0:25          'var42' ( temp 4-component vector of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:26      Sequence
+0:26        move second child to first child ( temp 4-component vector of float)
+0:26          'var43' ( temp 4-component vector of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:27      Sequence
+0:27        move second child to first child ( temp 2X2 matrix of float)
+0:27          'var52' ( temp 2X2 matrix of float)
+0:27          Constant:
+0:27            0.000000
+0:27            0.000000
+0:27            0.000000
+0:27            0.000000
+0:28      Sequence
+0:28        move second child to first child ( temp 2X2 matrix of float)
+0:28          'var55' ( temp 2X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:29      Sequence
+0:29        move second child to first child ( temp 2X2 matrix of float)
+0:29          'var56' ( temp 2X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:30      Sequence
+0:30        move second child to first child ( temp 2X3 matrix of float)
+0:30          'var65' ( temp 2X3 matrix of float)
+0:30          Constant:
+0:30            0.000000
+0:30            0.000000
+0:30            0.000000
+0:30            0.000000
+0:30            0.000000
+0:30            0.000000
+0:31      Sequence
+0:31        move second child to first child ( temp 2X3 matrix of float)
+0:31          'var70' ( temp 2X3 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:32      Sequence
+0:32        move second child to first child ( temp 2X4 matrix of float)
+0:32          'var78' ( temp 2X4 matrix of float)
+0:32          Constant:
+0:32            0.000000
+0:32            0.000000
+0:32            0.000000
+0:32            0.000000
+0:32            0.000000
+0:32            0.000000
+0:32            0.000000
+0:32            0.000000
+0:33      Sequence
+0:33        move second child to first child ( temp 2X4 matrix of float)
+0:33          'var84' ( temp 2X4 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:34      Sequence
+0:34        move second child to first child ( temp 3X2 matrix of float)
+0:34          'var91' ( temp 3X2 matrix of float)
+0:34          Constant:
+0:34            0.000000
+0:34            0.000000
+0:34            0.000000
+0:34            0.000000
+0:34            0.000000
+0:34            0.000000
+0:35      Sequence
+0:35        move second child to first child ( temp 3X2 matrix of float)
+0:35          'var98' ( temp 3X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:36      Sequence
+0:36        move second child to first child ( temp 3X3 matrix of float)
+0:36          'var104' ( temp 3X3 matrix of float)
+0:36          Constant:
+0:36            0.000000
+0:36            0.000000
+0:36            0.000000
+0:36            0.000000
+0:36            0.000000
+0:36            0.000000
+0:36            0.000000
+0:36            0.000000
+0:36            0.000000
+0:37      Sequence
+0:37        move second child to first child ( temp 3X3 matrix of float)
+0:37          'var112' ( temp 3X3 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:38      Sequence
+0:38        move second child to first child ( temp 3X4 matrix of float)
+0:38          'var117' ( temp 3X4 matrix of float)
+0:38          Constant:
+0:38            0.000000
+0:38            0.000000
+0:38            0.000000
+0:38            0.000000
+0:38            0.000000
+0:38            0.000000
+0:38            0.000000
+0:38            0.000000
+0:38            0.000000
+0:38            0.000000
+0:38            0.000000
+0:38            0.000000
+0:39      Sequence
+0:39        move second child to first child ( temp 3X4 matrix of float)
+0:39          'var126' ( temp 3X4 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:40      Sequence
+0:40        move second child to first child ( temp 4X2 matrix of float)
+0:40          'var130' ( temp 4X2 matrix of float)
+0:40          Constant:
+0:40            0.000000
+0:40            0.000000
+0:40            0.000000
+0:40            0.000000
+0:40            0.000000
+0:40            0.000000
+0:40            0.000000
+0:40            0.000000
+0:41      Sequence
+0:41        move second child to first child ( temp 4X2 matrix of float)
+0:41          'var140' ( temp 4X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:42      Sequence
+0:42        move second child to first child ( temp 4X3 matrix of float)
+0:42          'var143' ( temp 4X3 matrix of float)
+0:42          Constant:
+0:42            0.000000
+0:42            0.000000
+0:42            0.000000
+0:42            0.000000
+0:42            0.000000
+0:42            0.000000
+0:42            0.000000
+0:42            0.000000
+0:42            0.000000
+0:42            0.000000
+0:42            0.000000
+0:42            0.000000
+0:43      Sequence
+0:43        move second child to first child ( temp 4X3 matrix of float)
+0:43          'var154' ( temp 4X3 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:44      Sequence
+0:44        move second child to first child ( temp 4X4 matrix of float)
+0:44          'var156' ( temp 4X4 matrix of float)
+0:44          Constant:
+0:44            0.000000
+0:44            0.000000
+0:44            0.000000
+0:44            0.000000
+0:44            0.000000
+0:44            0.000000
+0:44            0.000000
+0:44            0.000000
+0:44            0.000000
+0:44            0.000000
+0:44            0.000000
+0:44            0.000000
+0:44            0.000000
+0:44            0.000000
+0:44            0.000000
+0:44            0.000000
+0:45      Sequence
+0:45        move second child to first child ( temp 4X4 matrix of float)
+0:45          'var168' ( temp 4X4 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:46      Sequence
+0:46        move second child to first child ( temp float)
+0:46          'var1' ( temp float)
+0:?           Constant:
+0:?             0.000000
+0:47      Sequence
+0:47        move second child to first child ( temp float)
+0:47          'var2' ( temp float)
+0:?           Constant:
+0:?             0.000000
+0:48      Sequence
+0:48        move second child to first child ( temp float)
+0:48          'var3' ( temp float)
+0:?           Constant:
+0:?             0.000000
+0:49      Sequence
+0:49        move second child to first child ( temp float)
+0:49          'var4' ( temp float)
+0:?           Constant:
+0:?             0.000000
+0:50      Sequence
+0:50        move second child to first child ( temp float)
+0:50          'var5' ( temp float)
+0:?           Constant:
+0:?             0.000000
+0:51      Sequence
+0:51        move second child to first child ( temp float)
+0:51          'var6' ( temp float)
+0:?           Constant:
+0:?             0.000000
+0:52      Sequence
+0:52        move second child to first child ( temp float)
+0:52          'var7' ( temp float)
+0:?           Constant:
+0:?             0.000000
+0:53      Sequence
+0:53        move second child to first child ( temp float)
+0:53          'var8' ( temp float)
+0:?           Constant:
+0:?             0.000000
+0:54      Sequence
+0:54        move second child to first child ( temp float)
+0:54          'var9' ( temp float)
+0:?           Constant:
+0:?             0.000000
+0:55      Sequence
+0:55        move second child to first child ( temp float)
+0:55          'var10' ( temp float)
+0:?           Constant:
+0:?             0.000000
+0:56      Sequence
+0:56        move second child to first child ( temp float)
+0:56          'var11' ( temp float)
+0:?           Constant:
+0:?             0.000000
+0:57      Sequence
+0:57        move second child to first child ( temp float)
+0:57          'var12' ( temp float)
+0:?           Constant:
+0:?             0.000000
+0:58      Sequence
+0:58        move second child to first child ( temp 2-component vector of float)
+0:58          'var15' ( temp 2-component vector of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:59      Sequence
+0:59        move second child to first child ( temp 2-component vector of float)
+0:59          'var16' ( temp 2-component vector of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:60      Sequence
+0:60        move second child to first child ( temp 3-component vector of float)
+0:60          'var29' ( temp 3-component vector of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:61      Sequence
+0:61        move second child to first child ( temp 2X2 matrix of float)
+0:61          'var57' ( temp 2X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:62      Sequence
+0:62        move second child to first child ( temp 2X2 matrix of float)
+0:62          'var58' ( temp 2X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:63      Sequence
+0:63        move second child to first child ( temp 2X2 matrix of float)
+0:63          'var59' ( temp 2X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:64      Sequence
+0:64        move second child to first child ( temp 2X2 matrix of float)
+0:64          'var60' ( temp 2X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:65      Sequence
+0:65        move second child to first child ( temp 2X2 matrix of float)
+0:65          'var61' ( temp 2X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:66      Sequence
+0:66        move second child to first child ( temp 2X2 matrix of float)
+0:66          'var62' ( temp 2X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:67      Sequence
+0:67        move second child to first child ( temp 2X2 matrix of float)
+0:67          'var63' ( temp 2X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:68      Sequence
+0:68        move second child to first child ( temp 2X2 matrix of float)
+0:68          'var64' ( temp 2X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:69      Sequence
+0:69        move second child to first child ( temp 2X3 matrix of float)
+0:69          'var71' ( temp 2X3 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:70      Sequence
+0:70        move second child to first child ( temp 2X3 matrix of float)
+0:70          'var73' ( temp 2X3 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:71      Sequence
+0:71        move second child to first child ( temp 2X3 matrix of float)
+0:71          'var74' ( temp 2X3 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:72      Sequence
+0:72        move second child to first child ( temp 2X3 matrix of float)
+0:72          'var76' ( temp 2X3 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:73      Sequence
+0:73        move second child to first child ( temp 2X3 matrix of float)
+0:73          'var77' ( temp 2X3 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:74      Sequence
+0:74        move second child to first child ( temp 2X4 matrix of float)
+0:74          'var87' ( temp 2X4 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:75      Sequence
+0:75        move second child to first child ( temp 2X4 matrix of float)
+0:75          'var90' ( temp 2X4 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:76      Sequence
+0:76        move second child to first child ( temp 3X2 matrix of float)
+0:76          'var99' ( temp 3X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:77      Sequence
+0:77        move second child to first child ( temp 3X2 matrix of float)
+0:77          'var100' ( temp 3X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:78      Sequence
+0:78        move second child to first child ( temp 3X2 matrix of float)
+0:78          'var101' ( temp 3X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:79      Sequence
+0:79        move second child to first child ( temp 3X2 matrix of float)
+0:79          'var102' ( temp 3X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:80      Sequence
+0:80        move second child to first child ( temp 3X2 matrix of float)
+0:80          'var103' ( temp 3X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:81      Sequence
+0:81        move second child to first child ( temp 3X3 matrix of float)
+0:81          'var113' ( temp 3X3 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:82      Sequence
+0:82        move second child to first child ( temp 3X3 matrix of float)
+0:82          'var115' ( temp 3X3 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:83      Sequence
+0:83        move second child to first child ( temp 3X3 matrix of float)
+0:83          'var116' ( temp 3X3 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:84      Sequence
+0:84        move second child to first child ( temp 3X4 matrix of float)
+0:84          'var129' ( temp 3X4 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:85      Sequence
+0:85        move second child to first child ( temp 4X2 matrix of float)
+0:85          'var141' ( temp 4X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:86      Sequence
+0:86        move second child to first child ( temp 4X2 matrix of float)
+0:86          'var142' ( temp 4X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:87      Sequence
+0:87        move second child to first child ( temp 4X3 matrix of float)
+0:87          'var155' ( temp 4X3 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:188      Branch: Return with expression
+0:188        Constant:
+0:188          0.000000
+0:188          0.000000
+0:188          0.000000
+0:188          0.000000
+0:18  Function Definition: main( ( temp void)
+0:18    Function Parameters: 
+0:?     Sequence
+0:18      move second child to first child ( temp 4-component vector of float)
+0:?         '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+0:18        Function Call: @main( ( temp 4-component vector of float)
+0:?   Linker Objects
+0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+
+
+Linked fragment stage:
+
+
+Shader version: 500
+gl_FragCoord origin is upper left
+ERROR: node is still EOpNull!
+0:18  Function Definition: @main( ( temp 4-component vector of float)
+0:18    Function Parameters: 
+0:?     Sequence
+0:19      Sequence
+0:19        move second child to first child ( temp float)
+0:19          'var0' ( temp float)
+0:19          Constant:
+0:19            0.000000
+0:20      Sequence
+0:20        move second child to first child ( temp 2-component vector of float)
+0:20          'var13' ( temp 2-component vector of float)
+0:20          Constant:
+0:20            0.000000
+0:20            0.000000
+0:21      Sequence
+0:21        move second child to first child ( temp 2-component vector of float)
+0:21          'var14' ( temp 2-component vector of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:22      Sequence
+0:22        move second child to first child ( temp 3-component vector of float)
+0:22          'var26' ( temp 3-component vector of float)
+0:22          Constant:
+0:22            0.000000
+0:22            0.000000
+0:22            0.000000
+0:23      Sequence
+0:23        move second child to first child ( temp 3-component vector of float)
+0:23          'var28' ( temp 3-component vector of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:24      Sequence
+0:24        move second child to first child ( temp 4-component vector of float)
+0:24          'var39' ( temp 4-component vector of float)
+0:24          Constant:
+0:24            0.000000
+0:24            0.000000
+0:24            0.000000
+0:24            0.000000
+0:25      Sequence
+0:25        move second child to first child ( temp 4-component vector of float)
+0:25          'var42' ( temp 4-component vector of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:26      Sequence
+0:26        move second child to first child ( temp 4-component vector of float)
+0:26          'var43' ( temp 4-component vector of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:27      Sequence
+0:27        move second child to first child ( temp 2X2 matrix of float)
+0:27          'var52' ( temp 2X2 matrix of float)
+0:27          Constant:
+0:27            0.000000
+0:27            0.000000
+0:27            0.000000
+0:27            0.000000
+0:28      Sequence
+0:28        move second child to first child ( temp 2X2 matrix of float)
+0:28          'var55' ( temp 2X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:29      Sequence
+0:29        move second child to first child ( temp 2X2 matrix of float)
+0:29          'var56' ( temp 2X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:30      Sequence
+0:30        move second child to first child ( temp 2X3 matrix of float)
+0:30          'var65' ( temp 2X3 matrix of float)
+0:30          Constant:
+0:30            0.000000
+0:30            0.000000
+0:30            0.000000
+0:30            0.000000
+0:30            0.000000
+0:30            0.000000
+0:31      Sequence
+0:31        move second child to first child ( temp 2X3 matrix of float)
+0:31          'var70' ( temp 2X3 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:32      Sequence
+0:32        move second child to first child ( temp 2X4 matrix of float)
+0:32          'var78' ( temp 2X4 matrix of float)
+0:32          Constant:
+0:32            0.000000
+0:32            0.000000
+0:32            0.000000
+0:32            0.000000
+0:32            0.000000
+0:32            0.000000
+0:32            0.000000
+0:32            0.000000
+0:33      Sequence
+0:33        move second child to first child ( temp 2X4 matrix of float)
+0:33          'var84' ( temp 2X4 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:34      Sequence
+0:34        move second child to first child ( temp 3X2 matrix of float)
+0:34          'var91' ( temp 3X2 matrix of float)
+0:34          Constant:
+0:34            0.000000
+0:34            0.000000
+0:34            0.000000
+0:34            0.000000
+0:34            0.000000
+0:34            0.000000
+0:35      Sequence
+0:35        move second child to first child ( temp 3X2 matrix of float)
+0:35          'var98' ( temp 3X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:36      Sequence
+0:36        move second child to first child ( temp 3X3 matrix of float)
+0:36          'var104' ( temp 3X3 matrix of float)
+0:36          Constant:
+0:36            0.000000
+0:36            0.000000
+0:36            0.000000
+0:36            0.000000
+0:36            0.000000
+0:36            0.000000
+0:36            0.000000
+0:36            0.000000
+0:36            0.000000
+0:37      Sequence
+0:37        move second child to first child ( temp 3X3 matrix of float)
+0:37          'var112' ( temp 3X3 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:38      Sequence
+0:38        move second child to first child ( temp 3X4 matrix of float)
+0:38          'var117' ( temp 3X4 matrix of float)
+0:38          Constant:
+0:38            0.000000
+0:38            0.000000
+0:38            0.000000
+0:38            0.000000
+0:38            0.000000
+0:38            0.000000
+0:38            0.000000
+0:38            0.000000
+0:38            0.000000
+0:38            0.000000
+0:38            0.000000
+0:38            0.000000
+0:39      Sequence
+0:39        move second child to first child ( temp 3X4 matrix of float)
+0:39          'var126' ( temp 3X4 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:40      Sequence
+0:40        move second child to first child ( temp 4X2 matrix of float)
+0:40          'var130' ( temp 4X2 matrix of float)
+0:40          Constant:
+0:40            0.000000
+0:40            0.000000
+0:40            0.000000
+0:40            0.000000
+0:40            0.000000
+0:40            0.000000
+0:40            0.000000
+0:40            0.000000
+0:41      Sequence
+0:41        move second child to first child ( temp 4X2 matrix of float)
+0:41          'var140' ( temp 4X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:42      Sequence
+0:42        move second child to first child ( temp 4X3 matrix of float)
+0:42          'var143' ( temp 4X3 matrix of float)
+0:42          Constant:
+0:42            0.000000
+0:42            0.000000
+0:42            0.000000
+0:42            0.000000
+0:42            0.000000
+0:42            0.000000
+0:42            0.000000
+0:42            0.000000
+0:42            0.000000
+0:42            0.000000
+0:42            0.000000
+0:42            0.000000
+0:43      Sequence
+0:43        move second child to first child ( temp 4X3 matrix of float)
+0:43          'var154' ( temp 4X3 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:44      Sequence
+0:44        move second child to first child ( temp 4X4 matrix of float)
+0:44          'var156' ( temp 4X4 matrix of float)
+0:44          Constant:
+0:44            0.000000
+0:44            0.000000
+0:44            0.000000
+0:44            0.000000
+0:44            0.000000
+0:44            0.000000
+0:44            0.000000
+0:44            0.000000
+0:44            0.000000
+0:44            0.000000
+0:44            0.000000
+0:44            0.000000
+0:44            0.000000
+0:44            0.000000
+0:44            0.000000
+0:44            0.000000
+0:45      Sequence
+0:45        move second child to first child ( temp 4X4 matrix of float)
+0:45          'var168' ( temp 4X4 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:46      Sequence
+0:46        move second child to first child ( temp float)
+0:46          'var1' ( temp float)
+0:?           Constant:
+0:?             0.000000
+0:47      Sequence
+0:47        move second child to first child ( temp float)
+0:47          'var2' ( temp float)
+0:?           Constant:
+0:?             0.000000
+0:48      Sequence
+0:48        move second child to first child ( temp float)
+0:48          'var3' ( temp float)
+0:?           Constant:
+0:?             0.000000
+0:49      Sequence
+0:49        move second child to first child ( temp float)
+0:49          'var4' ( temp float)
+0:?           Constant:
+0:?             0.000000
+0:50      Sequence
+0:50        move second child to first child ( temp float)
+0:50          'var5' ( temp float)
+0:?           Constant:
+0:?             0.000000
+0:51      Sequence
+0:51        move second child to first child ( temp float)
+0:51          'var6' ( temp float)
+0:?           Constant:
+0:?             0.000000
+0:52      Sequence
+0:52        move second child to first child ( temp float)
+0:52          'var7' ( temp float)
+0:?           Constant:
+0:?             0.000000
+0:53      Sequence
+0:53        move second child to first child ( temp float)
+0:53          'var8' ( temp float)
+0:?           Constant:
+0:?             0.000000
+0:54      Sequence
+0:54        move second child to first child ( temp float)
+0:54          'var9' ( temp float)
+0:?           Constant:
+0:?             0.000000
+0:55      Sequence
+0:55        move second child to first child ( temp float)
+0:55          'var10' ( temp float)
+0:?           Constant:
+0:?             0.000000
+0:56      Sequence
+0:56        move second child to first child ( temp float)
+0:56          'var11' ( temp float)
+0:?           Constant:
+0:?             0.000000
+0:57      Sequence
+0:57        move second child to first child ( temp float)
+0:57          'var12' ( temp float)
+0:?           Constant:
+0:?             0.000000
+0:58      Sequence
+0:58        move second child to first child ( temp 2-component vector of float)
+0:58          'var15' ( temp 2-component vector of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:59      Sequence
+0:59        move second child to first child ( temp 2-component vector of float)
+0:59          'var16' ( temp 2-component vector of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:60      Sequence
+0:60        move second child to first child ( temp 3-component vector of float)
+0:60          'var29' ( temp 3-component vector of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:61      Sequence
+0:61        move second child to first child ( temp 2X2 matrix of float)
+0:61          'var57' ( temp 2X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:62      Sequence
+0:62        move second child to first child ( temp 2X2 matrix of float)
+0:62          'var58' ( temp 2X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:63      Sequence
+0:63        move second child to first child ( temp 2X2 matrix of float)
+0:63          'var59' ( temp 2X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:64      Sequence
+0:64        move second child to first child ( temp 2X2 matrix of float)
+0:64          'var60' ( temp 2X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:65      Sequence
+0:65        move second child to first child ( temp 2X2 matrix of float)
+0:65          'var61' ( temp 2X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:66      Sequence
+0:66        move second child to first child ( temp 2X2 matrix of float)
+0:66          'var62' ( temp 2X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:67      Sequence
+0:67        move second child to first child ( temp 2X2 matrix of float)
+0:67          'var63' ( temp 2X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:68      Sequence
+0:68        move second child to first child ( temp 2X2 matrix of float)
+0:68          'var64' ( temp 2X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:69      Sequence
+0:69        move second child to first child ( temp 2X3 matrix of float)
+0:69          'var71' ( temp 2X3 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:70      Sequence
+0:70        move second child to first child ( temp 2X3 matrix of float)
+0:70          'var73' ( temp 2X3 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:71      Sequence
+0:71        move second child to first child ( temp 2X3 matrix of float)
+0:71          'var74' ( temp 2X3 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:72      Sequence
+0:72        move second child to first child ( temp 2X3 matrix of float)
+0:72          'var76' ( temp 2X3 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:73      Sequence
+0:73        move second child to first child ( temp 2X3 matrix of float)
+0:73          'var77' ( temp 2X3 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:74      Sequence
+0:74        move second child to first child ( temp 2X4 matrix of float)
+0:74          'var87' ( temp 2X4 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:75      Sequence
+0:75        move second child to first child ( temp 2X4 matrix of float)
+0:75          'var90' ( temp 2X4 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:76      Sequence
+0:76        move second child to first child ( temp 3X2 matrix of float)
+0:76          'var99' ( temp 3X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:77      Sequence
+0:77        move second child to first child ( temp 3X2 matrix of float)
+0:77          'var100' ( temp 3X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:78      Sequence
+0:78        move second child to first child ( temp 3X2 matrix of float)
+0:78          'var101' ( temp 3X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:79      Sequence
+0:79        move second child to first child ( temp 3X2 matrix of float)
+0:79          'var102' ( temp 3X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:80      Sequence
+0:80        move second child to first child ( temp 3X2 matrix of float)
+0:80          'var103' ( temp 3X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:81      Sequence
+0:81        move second child to first child ( temp 3X3 matrix of float)
+0:81          'var113' ( temp 3X3 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:82      Sequence
+0:82        move second child to first child ( temp 3X3 matrix of float)
+0:82          'var115' ( temp 3X3 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:83      Sequence
+0:83        move second child to first child ( temp 3X3 matrix of float)
+0:83          'var116' ( temp 3X3 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:84      Sequence
+0:84        move second child to first child ( temp 3X4 matrix of float)
+0:84          'var129' ( temp 3X4 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:85      Sequence
+0:85        move second child to first child ( temp 4X2 matrix of float)
+0:85          'var141' ( temp 4X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:86      Sequence
+0:86        move second child to first child ( temp 4X2 matrix of float)
+0:86          'var142' ( temp 4X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:87      Sequence
+0:87        move second child to first child ( temp 4X3 matrix of float)
+0:87          'var155' ( temp 4X3 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:188      Branch: Return with expression
+0:188        Constant:
+0:188          0.000000
+0:188          0.000000
+0:188          0.000000
+0:188          0.000000
+0:18  Function Definition: main( ( temp void)
+0:18    Function Parameters: 
+0:?     Sequence
+0:18      move second child to first child ( temp 4-component vector of float)
+0:?         '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+0:18        Function Call: @main( ( temp 4-component vector of float)
+0:?   Linker Objects
+0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+
+SPIR-V is not generated for failed compile or link
diff --git a/Test/baseResults/hlsl.type.type.conversion.valid.frag.out b/Test/baseResults/hlsl.type.type.conversion.valid.frag.out
new file mode 100644
index 0000000..fc67200
--- /dev/null
+++ b/Test/baseResults/hlsl.type.type.conversion.valid.frag.out
@@ -0,0 +1,1640 @@
+hlsl.type.type.conversion.valid.frag
+Shader version: 500
+gl_FragCoord origin is upper left
+0:? Sequence
+0:18  Function Definition: @main( ( temp 4-component vector of float)
+0:18    Function Parameters: 
+0:?     Sequence
+0:19      Sequence
+0:19        move second child to first child ( temp float)
+0:19          'var0' ( temp float)
+0:19          Constant:
+0:19            0.000000
+0:20      Sequence
+0:20        move second child to first child ( temp 2-component vector of float)
+0:20          'var13' ( temp 2-component vector of float)
+0:20          Constant:
+0:20            0.000000
+0:20            0.000000
+0:21      Sequence
+0:21        move second child to first child ( temp 2-component vector of float)
+0:21          'var14' ( temp 2-component vector of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:22      Sequence
+0:22        move second child to first child ( temp 3-component vector of float)
+0:22          'var26' ( temp 3-component vector of float)
+0:22          Constant:
+0:22            0.000000
+0:22            0.000000
+0:22            0.000000
+0:23      Sequence
+0:23        move second child to first child ( temp 3-component vector of float)
+0:23          'var28' ( temp 3-component vector of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:24      Sequence
+0:24        move second child to first child ( temp 4-component vector of float)
+0:24          'var39' ( temp 4-component vector of float)
+0:24          Constant:
+0:24            0.000000
+0:24            0.000000
+0:24            0.000000
+0:24            0.000000
+0:25      Sequence
+0:25        move second child to first child ( temp 4-component vector of float)
+0:25          'var42' ( temp 4-component vector of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:26      Sequence
+0:26        move second child to first child ( temp 4-component vector of float)
+0:26          'var43' ( temp 4-component vector of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:27      Sequence
+0:27        move second child to first child ( temp 2X2 matrix of float)
+0:27          'var52' ( temp 2X2 matrix of float)
+0:27          Constant:
+0:27            0.000000
+0:27            0.000000
+0:27            0.000000
+0:27            0.000000
+0:28      Sequence
+0:28        move second child to first child ( temp 2X2 matrix of float)
+0:28          'var55' ( temp 2X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:29      Sequence
+0:29        move second child to first child ( temp 2X2 matrix of float)
+0:29          'var56' ( temp 2X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:30      Sequence
+0:30        move second child to first child ( temp 2X3 matrix of float)
+0:30          'var65' ( temp 2X3 matrix of float)
+0:30          Constant:
+0:30            0.000000
+0:30            0.000000
+0:30            0.000000
+0:30            0.000000
+0:30            0.000000
+0:30            0.000000
+0:31      Sequence
+0:31        move second child to first child ( temp 2X3 matrix of float)
+0:31          'var70' ( temp 2X3 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:32      Sequence
+0:32        move second child to first child ( temp 2X4 matrix of float)
+0:32          'var78' ( temp 2X4 matrix of float)
+0:32          Constant:
+0:32            0.000000
+0:32            0.000000
+0:32            0.000000
+0:32            0.000000
+0:32            0.000000
+0:32            0.000000
+0:32            0.000000
+0:32            0.000000
+0:33      Sequence
+0:33        move second child to first child ( temp 2X4 matrix of float)
+0:33          'var84' ( temp 2X4 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:34      Sequence
+0:34        move second child to first child ( temp 3X2 matrix of float)
+0:34          'var91' ( temp 3X2 matrix of float)
+0:34          Constant:
+0:34            0.000000
+0:34            0.000000
+0:34            0.000000
+0:34            0.000000
+0:34            0.000000
+0:34            0.000000
+0:35      Sequence
+0:35        move second child to first child ( temp 3X2 matrix of float)
+0:35          'var98' ( temp 3X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:36      Sequence
+0:36        move second child to first child ( temp 3X3 matrix of float)
+0:36          'var104' ( temp 3X3 matrix of float)
+0:36          Constant:
+0:36            0.000000
+0:36            0.000000
+0:36            0.000000
+0:36            0.000000
+0:36            0.000000
+0:36            0.000000
+0:36            0.000000
+0:36            0.000000
+0:36            0.000000
+0:37      Sequence
+0:37        move second child to first child ( temp 3X3 matrix of float)
+0:37          'var112' ( temp 3X3 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:38      Sequence
+0:38        move second child to first child ( temp 3X4 matrix of float)
+0:38          'var117' ( temp 3X4 matrix of float)
+0:38          Constant:
+0:38            0.000000
+0:38            0.000000
+0:38            0.000000
+0:38            0.000000
+0:38            0.000000
+0:38            0.000000
+0:38            0.000000
+0:38            0.000000
+0:38            0.000000
+0:38            0.000000
+0:38            0.000000
+0:38            0.000000
+0:39      Sequence
+0:39        move second child to first child ( temp 3X4 matrix of float)
+0:39          'var126' ( temp 3X4 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:40      Sequence
+0:40        move second child to first child ( temp 4X2 matrix of float)
+0:40          'var130' ( temp 4X2 matrix of float)
+0:40          Constant:
+0:40            0.000000
+0:40            0.000000
+0:40            0.000000
+0:40            0.000000
+0:40            0.000000
+0:40            0.000000
+0:40            0.000000
+0:40            0.000000
+0:41      Sequence
+0:41        move second child to first child ( temp 4X2 matrix of float)
+0:41          'var140' ( temp 4X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:42      Sequence
+0:42        move second child to first child ( temp 4X3 matrix of float)
+0:42          'var143' ( temp 4X3 matrix of float)
+0:42          Constant:
+0:42            0.000000
+0:42            0.000000
+0:42            0.000000
+0:42            0.000000
+0:42            0.000000
+0:42            0.000000
+0:42            0.000000
+0:42            0.000000
+0:42            0.000000
+0:42            0.000000
+0:42            0.000000
+0:42            0.000000
+0:43      Sequence
+0:43        move second child to first child ( temp 4X3 matrix of float)
+0:43          'var154' ( temp 4X3 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:44      Sequence
+0:44        move second child to first child ( temp 4X4 matrix of float)
+0:44          'var156' ( temp 4X4 matrix of float)
+0:44          Constant:
+0:44            0.000000
+0:44            0.000000
+0:44            0.000000
+0:44            0.000000
+0:44            0.000000
+0:44            0.000000
+0:44            0.000000
+0:44            0.000000
+0:44            0.000000
+0:44            0.000000
+0:44            0.000000
+0:44            0.000000
+0:44            0.000000
+0:44            0.000000
+0:44            0.000000
+0:44            0.000000
+0:45      Sequence
+0:45        move second child to first child ( temp 4X4 matrix of float)
+0:45          'var168' ( temp 4X4 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:46      Sequence
+0:46        move second child to first child ( temp float)
+0:46          'var1' ( temp float)
+0:?           Constant:
+0:?             0.000000
+0:47      Sequence
+0:47        move second child to first child ( temp float)
+0:47          'var2' ( temp float)
+0:?           Constant:
+0:?             0.000000
+0:48      Sequence
+0:48        move second child to first child ( temp float)
+0:48          'var3' ( temp float)
+0:?           Constant:
+0:?             0.000000
+0:49      Sequence
+0:49        move second child to first child ( temp float)
+0:49          'var4' ( temp float)
+0:?           Constant:
+0:?             0.000000
+0:50      Sequence
+0:50        move second child to first child ( temp float)
+0:50          'var5' ( temp float)
+0:?           Constant:
+0:?             0.000000
+0:51      Sequence
+0:51        move second child to first child ( temp float)
+0:51          'var6' ( temp float)
+0:?           Constant:
+0:?             0.000000
+0:52      Sequence
+0:52        move second child to first child ( temp float)
+0:52          'var7' ( temp float)
+0:?           Constant:
+0:?             0.000000
+0:53      Sequence
+0:53        move second child to first child ( temp float)
+0:53          'var8' ( temp float)
+0:?           Constant:
+0:?             0.000000
+0:54      Sequence
+0:54        move second child to first child ( temp float)
+0:54          'var9' ( temp float)
+0:?           Constant:
+0:?             0.000000
+0:55      Sequence
+0:55        move second child to first child ( temp float)
+0:55          'var10' ( temp float)
+0:?           Constant:
+0:?             0.000000
+0:56      Sequence
+0:56        move second child to first child ( temp float)
+0:56          'var11' ( temp float)
+0:?           Constant:
+0:?             0.000000
+0:57      Sequence
+0:57        move second child to first child ( temp float)
+0:57          'var12' ( temp float)
+0:?           Constant:
+0:?             0.000000
+0:58      Sequence
+0:58        move second child to first child ( temp 2-component vector of float)
+0:58          'var15' ( temp 2-component vector of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:59      Sequence
+0:59        move second child to first child ( temp 2-component vector of float)
+0:59          'var16' ( temp 2-component vector of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:60      Sequence
+0:60        move second child to first child ( temp 3-component vector of float)
+0:60          'var29' ( temp 3-component vector of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:61      Sequence
+0:61        move second child to first child ( temp 2X2 matrix of float)
+0:61          'var57' ( temp 2X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:62      Sequence
+0:62        move second child to first child ( temp 2X2 matrix of float)
+0:62          'var58' ( temp 2X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:63      Sequence
+0:63        move second child to first child ( temp 2X2 matrix of float)
+0:63          'var59' ( temp 2X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:64      Sequence
+0:64        move second child to first child ( temp 2X2 matrix of float)
+0:64          'var60' ( temp 2X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:65      Sequence
+0:65        move second child to first child ( temp 2X2 matrix of float)
+0:65          'var61' ( temp 2X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:66      Sequence
+0:66        move second child to first child ( temp 2X2 matrix of float)
+0:66          'var62' ( temp 2X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:67      Sequence
+0:67        move second child to first child ( temp 2X2 matrix of float)
+0:67          'var63' ( temp 2X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:68      Sequence
+0:68        move second child to first child ( temp 2X2 matrix of float)
+0:68          'var64' ( temp 2X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:69      Sequence
+0:69        move second child to first child ( temp 2X3 matrix of float)
+0:69          'var71' ( temp 2X3 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:70      Sequence
+0:70        move second child to first child ( temp 2X3 matrix of float)
+0:70          'var73' ( temp 2X3 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:71      Sequence
+0:71        move second child to first child ( temp 2X3 matrix of float)
+0:71          'var74' ( temp 2X3 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:72      Sequence
+0:72        move second child to first child ( temp 2X3 matrix of float)
+0:72          'var76' ( temp 2X3 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:73      Sequence
+0:73        move second child to first child ( temp 2X3 matrix of float)
+0:73          'var77' ( temp 2X3 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:74      Sequence
+0:74        move second child to first child ( temp 2X4 matrix of float)
+0:74          'var87' ( temp 2X4 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:75      Sequence
+0:75        move second child to first child ( temp 2X4 matrix of float)
+0:75          'var90' ( temp 2X4 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:76      Sequence
+0:76        move second child to first child ( temp 3X2 matrix of float)
+0:76          'var99' ( temp 3X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:77      Sequence
+0:77        move second child to first child ( temp 3X2 matrix of float)
+0:77          'var100' ( temp 3X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:78      Sequence
+0:78        move second child to first child ( temp 3X2 matrix of float)
+0:78          'var101' ( temp 3X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:79      Sequence
+0:79        move second child to first child ( temp 3X2 matrix of float)
+0:79          'var102' ( temp 3X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:80      Sequence
+0:80        move second child to first child ( temp 3X2 matrix of float)
+0:80          'var103' ( temp 3X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:81      Sequence
+0:81        move second child to first child ( temp 3X3 matrix of float)
+0:81          'var113' ( temp 3X3 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:82      Sequence
+0:82        move second child to first child ( temp 3X3 matrix of float)
+0:82          'var115' ( temp 3X3 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:83      Sequence
+0:83        move second child to first child ( temp 3X3 matrix of float)
+0:83          'var116' ( temp 3X3 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:84      Sequence
+0:84        move second child to first child ( temp 3X4 matrix of float)
+0:84          'var129' ( temp 3X4 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:85      Sequence
+0:85        move second child to first child ( temp 4X2 matrix of float)
+0:85          'var141' ( temp 4X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:86      Sequence
+0:86        move second child to first child ( temp 4X2 matrix of float)
+0:86          'var142' ( temp 4X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:87      Sequence
+0:87        move second child to first child ( temp 4X3 matrix of float)
+0:87          'var155' ( temp 4X3 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:88      Branch: Return with expression
+0:88        Constant:
+0:88          0.000000
+0:88          0.000000
+0:88          0.000000
+0:88          0.000000
+0:18  Function Definition: main( ( temp void)
+0:18    Function Parameters: 
+0:?     Sequence
+0:18      move second child to first child ( temp 4-component vector of float)
+0:?         '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+0:18        Function Call: @main( ( temp 4-component vector of float)
+0:?   Linker Objects
+0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+
+
+Linked fragment stage:
+
+
+Shader version: 500
+gl_FragCoord origin is upper left
+0:? Sequence
+0:18  Function Definition: @main( ( temp 4-component vector of float)
+0:18    Function Parameters: 
+0:?     Sequence
+0:19      Sequence
+0:19        move second child to first child ( temp float)
+0:19          'var0' ( temp float)
+0:19          Constant:
+0:19            0.000000
+0:20      Sequence
+0:20        move second child to first child ( temp 2-component vector of float)
+0:20          'var13' ( temp 2-component vector of float)
+0:20          Constant:
+0:20            0.000000
+0:20            0.000000
+0:21      Sequence
+0:21        move second child to first child ( temp 2-component vector of float)
+0:21          'var14' ( temp 2-component vector of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:22      Sequence
+0:22        move second child to first child ( temp 3-component vector of float)
+0:22          'var26' ( temp 3-component vector of float)
+0:22          Constant:
+0:22            0.000000
+0:22            0.000000
+0:22            0.000000
+0:23      Sequence
+0:23        move second child to first child ( temp 3-component vector of float)
+0:23          'var28' ( temp 3-component vector of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:24      Sequence
+0:24        move second child to first child ( temp 4-component vector of float)
+0:24          'var39' ( temp 4-component vector of float)
+0:24          Constant:
+0:24            0.000000
+0:24            0.000000
+0:24            0.000000
+0:24            0.000000
+0:25      Sequence
+0:25        move second child to first child ( temp 4-component vector of float)
+0:25          'var42' ( temp 4-component vector of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:26      Sequence
+0:26        move second child to first child ( temp 4-component vector of float)
+0:26          'var43' ( temp 4-component vector of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:27      Sequence
+0:27        move second child to first child ( temp 2X2 matrix of float)
+0:27          'var52' ( temp 2X2 matrix of float)
+0:27          Constant:
+0:27            0.000000
+0:27            0.000000
+0:27            0.000000
+0:27            0.000000
+0:28      Sequence
+0:28        move second child to first child ( temp 2X2 matrix of float)
+0:28          'var55' ( temp 2X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:29      Sequence
+0:29        move second child to first child ( temp 2X2 matrix of float)
+0:29          'var56' ( temp 2X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:30      Sequence
+0:30        move second child to first child ( temp 2X3 matrix of float)
+0:30          'var65' ( temp 2X3 matrix of float)
+0:30          Constant:
+0:30            0.000000
+0:30            0.000000
+0:30            0.000000
+0:30            0.000000
+0:30            0.000000
+0:30            0.000000
+0:31      Sequence
+0:31        move second child to first child ( temp 2X3 matrix of float)
+0:31          'var70' ( temp 2X3 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:32      Sequence
+0:32        move second child to first child ( temp 2X4 matrix of float)
+0:32          'var78' ( temp 2X4 matrix of float)
+0:32          Constant:
+0:32            0.000000
+0:32            0.000000
+0:32            0.000000
+0:32            0.000000
+0:32            0.000000
+0:32            0.000000
+0:32            0.000000
+0:32            0.000000
+0:33      Sequence
+0:33        move second child to first child ( temp 2X4 matrix of float)
+0:33          'var84' ( temp 2X4 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:34      Sequence
+0:34        move second child to first child ( temp 3X2 matrix of float)
+0:34          'var91' ( temp 3X2 matrix of float)
+0:34          Constant:
+0:34            0.000000
+0:34            0.000000
+0:34            0.000000
+0:34            0.000000
+0:34            0.000000
+0:34            0.000000
+0:35      Sequence
+0:35        move second child to first child ( temp 3X2 matrix of float)
+0:35          'var98' ( temp 3X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:36      Sequence
+0:36        move second child to first child ( temp 3X3 matrix of float)
+0:36          'var104' ( temp 3X3 matrix of float)
+0:36          Constant:
+0:36            0.000000
+0:36            0.000000
+0:36            0.000000
+0:36            0.000000
+0:36            0.000000
+0:36            0.000000
+0:36            0.000000
+0:36            0.000000
+0:36            0.000000
+0:37      Sequence
+0:37        move second child to first child ( temp 3X3 matrix of float)
+0:37          'var112' ( temp 3X3 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:38      Sequence
+0:38        move second child to first child ( temp 3X4 matrix of float)
+0:38          'var117' ( temp 3X4 matrix of float)
+0:38          Constant:
+0:38            0.000000
+0:38            0.000000
+0:38            0.000000
+0:38            0.000000
+0:38            0.000000
+0:38            0.000000
+0:38            0.000000
+0:38            0.000000
+0:38            0.000000
+0:38            0.000000
+0:38            0.000000
+0:38            0.000000
+0:39      Sequence
+0:39        move second child to first child ( temp 3X4 matrix of float)
+0:39          'var126' ( temp 3X4 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:40      Sequence
+0:40        move second child to first child ( temp 4X2 matrix of float)
+0:40          'var130' ( temp 4X2 matrix of float)
+0:40          Constant:
+0:40            0.000000
+0:40            0.000000
+0:40            0.000000
+0:40            0.000000
+0:40            0.000000
+0:40            0.000000
+0:40            0.000000
+0:40            0.000000
+0:41      Sequence
+0:41        move second child to first child ( temp 4X2 matrix of float)
+0:41          'var140' ( temp 4X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:42      Sequence
+0:42        move second child to first child ( temp 4X3 matrix of float)
+0:42          'var143' ( temp 4X3 matrix of float)
+0:42          Constant:
+0:42            0.000000
+0:42            0.000000
+0:42            0.000000
+0:42            0.000000
+0:42            0.000000
+0:42            0.000000
+0:42            0.000000
+0:42            0.000000
+0:42            0.000000
+0:42            0.000000
+0:42            0.000000
+0:42            0.000000
+0:43      Sequence
+0:43        move second child to first child ( temp 4X3 matrix of float)
+0:43          'var154' ( temp 4X3 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:44      Sequence
+0:44        move second child to first child ( temp 4X4 matrix of float)
+0:44          'var156' ( temp 4X4 matrix of float)
+0:44          Constant:
+0:44            0.000000
+0:44            0.000000
+0:44            0.000000
+0:44            0.000000
+0:44            0.000000
+0:44            0.000000
+0:44            0.000000
+0:44            0.000000
+0:44            0.000000
+0:44            0.000000
+0:44            0.000000
+0:44            0.000000
+0:44            0.000000
+0:44            0.000000
+0:44            0.000000
+0:44            0.000000
+0:45      Sequence
+0:45        move second child to first child ( temp 4X4 matrix of float)
+0:45          'var168' ( temp 4X4 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:46      Sequence
+0:46        move second child to first child ( temp float)
+0:46          'var1' ( temp float)
+0:?           Constant:
+0:?             0.000000
+0:47      Sequence
+0:47        move second child to first child ( temp float)
+0:47          'var2' ( temp float)
+0:?           Constant:
+0:?             0.000000
+0:48      Sequence
+0:48        move second child to first child ( temp float)
+0:48          'var3' ( temp float)
+0:?           Constant:
+0:?             0.000000
+0:49      Sequence
+0:49        move second child to first child ( temp float)
+0:49          'var4' ( temp float)
+0:?           Constant:
+0:?             0.000000
+0:50      Sequence
+0:50        move second child to first child ( temp float)
+0:50          'var5' ( temp float)
+0:?           Constant:
+0:?             0.000000
+0:51      Sequence
+0:51        move second child to first child ( temp float)
+0:51          'var6' ( temp float)
+0:?           Constant:
+0:?             0.000000
+0:52      Sequence
+0:52        move second child to first child ( temp float)
+0:52          'var7' ( temp float)
+0:?           Constant:
+0:?             0.000000
+0:53      Sequence
+0:53        move second child to first child ( temp float)
+0:53          'var8' ( temp float)
+0:?           Constant:
+0:?             0.000000
+0:54      Sequence
+0:54        move second child to first child ( temp float)
+0:54          'var9' ( temp float)
+0:?           Constant:
+0:?             0.000000
+0:55      Sequence
+0:55        move second child to first child ( temp float)
+0:55          'var10' ( temp float)
+0:?           Constant:
+0:?             0.000000
+0:56      Sequence
+0:56        move second child to first child ( temp float)
+0:56          'var11' ( temp float)
+0:?           Constant:
+0:?             0.000000
+0:57      Sequence
+0:57        move second child to first child ( temp float)
+0:57          'var12' ( temp float)
+0:?           Constant:
+0:?             0.000000
+0:58      Sequence
+0:58        move second child to first child ( temp 2-component vector of float)
+0:58          'var15' ( temp 2-component vector of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:59      Sequence
+0:59        move second child to first child ( temp 2-component vector of float)
+0:59          'var16' ( temp 2-component vector of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:60      Sequence
+0:60        move second child to first child ( temp 3-component vector of float)
+0:60          'var29' ( temp 3-component vector of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:61      Sequence
+0:61        move second child to first child ( temp 2X2 matrix of float)
+0:61          'var57' ( temp 2X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:62      Sequence
+0:62        move second child to first child ( temp 2X2 matrix of float)
+0:62          'var58' ( temp 2X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:63      Sequence
+0:63        move second child to first child ( temp 2X2 matrix of float)
+0:63          'var59' ( temp 2X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:64      Sequence
+0:64        move second child to first child ( temp 2X2 matrix of float)
+0:64          'var60' ( temp 2X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:65      Sequence
+0:65        move second child to first child ( temp 2X2 matrix of float)
+0:65          'var61' ( temp 2X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:66      Sequence
+0:66        move second child to first child ( temp 2X2 matrix of float)
+0:66          'var62' ( temp 2X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:67      Sequence
+0:67        move second child to first child ( temp 2X2 matrix of float)
+0:67          'var63' ( temp 2X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:68      Sequence
+0:68        move second child to first child ( temp 2X2 matrix of float)
+0:68          'var64' ( temp 2X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:69      Sequence
+0:69        move second child to first child ( temp 2X3 matrix of float)
+0:69          'var71' ( temp 2X3 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:70      Sequence
+0:70        move second child to first child ( temp 2X3 matrix of float)
+0:70          'var73' ( temp 2X3 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:71      Sequence
+0:71        move second child to first child ( temp 2X3 matrix of float)
+0:71          'var74' ( temp 2X3 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:72      Sequence
+0:72        move second child to first child ( temp 2X3 matrix of float)
+0:72          'var76' ( temp 2X3 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:73      Sequence
+0:73        move second child to first child ( temp 2X3 matrix of float)
+0:73          'var77' ( temp 2X3 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:74      Sequence
+0:74        move second child to first child ( temp 2X4 matrix of float)
+0:74          'var87' ( temp 2X4 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:75      Sequence
+0:75        move second child to first child ( temp 2X4 matrix of float)
+0:75          'var90' ( temp 2X4 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:76      Sequence
+0:76        move second child to first child ( temp 3X2 matrix of float)
+0:76          'var99' ( temp 3X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:77      Sequence
+0:77        move second child to first child ( temp 3X2 matrix of float)
+0:77          'var100' ( temp 3X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:78      Sequence
+0:78        move second child to first child ( temp 3X2 matrix of float)
+0:78          'var101' ( temp 3X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:79      Sequence
+0:79        move second child to first child ( temp 3X2 matrix of float)
+0:79          'var102' ( temp 3X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:80      Sequence
+0:80        move second child to first child ( temp 3X2 matrix of float)
+0:80          'var103' ( temp 3X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:81      Sequence
+0:81        move second child to first child ( temp 3X3 matrix of float)
+0:81          'var113' ( temp 3X3 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:82      Sequence
+0:82        move second child to first child ( temp 3X3 matrix of float)
+0:82          'var115' ( temp 3X3 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:83      Sequence
+0:83        move second child to first child ( temp 3X3 matrix of float)
+0:83          'var116' ( temp 3X3 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:84      Sequence
+0:84        move second child to first child ( temp 3X4 matrix of float)
+0:84          'var129' ( temp 3X4 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:85      Sequence
+0:85        move second child to first child ( temp 4X2 matrix of float)
+0:85          'var141' ( temp 4X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:86      Sequence
+0:86        move second child to first child ( temp 4X2 matrix of float)
+0:86          'var142' ( temp 4X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:87      Sequence
+0:87        move second child to first child ( temp 4X3 matrix of float)
+0:87          'var155' ( temp 4X3 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:88      Branch: Return with expression
+0:88        Constant:
+0:88          0.000000
+0:88          0.000000
+0:88          0.000000
+0:88          0.000000
+0:18  Function Definition: main( ( temp void)
+0:18    Function Parameters: 
+0:?     Sequence
+0:18      move second child to first child ( temp 4-component vector of float)
+0:?         '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+0:18        Function Call: @main( ( temp 4-component vector of float)
+0:?   Linker Objects
+0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+
+// Module Version 10300
+// Generated by (magic number): 80007
+// Id's are bound by 122
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 120
+                              ExecutionMode 4 OriginUpperLeft
+                              Source HLSL 500
+                              Name 4  "main"
+                              Name 9  "@main("
+                              Name 12  "var0"
+                              Name 16  "var13"
+                              Name 18  "var14"
+                              Name 21  "var26"
+                              Name 23  "var28"
+                              Name 25  "var39"
+                              Name 27  "var42"
+                              Name 28  "var43"
+                              Name 31  "var52"
+                              Name 33  "var55"
+                              Name 34  "var56"
+                              Name 37  "var65"
+                              Name 39  "var70"
+                              Name 42  "var78"
+                              Name 44  "var84"
+                              Name 47  "var91"
+                              Name 49  "var98"
+                              Name 52  "var104"
+                              Name 54  "var112"
+                              Name 57  "var117"
+                              Name 59  "var126"
+                              Name 62  "var130"
+                              Name 64  "var140"
+                              Name 67  "var143"
+                              Name 69  "var154"
+                              Name 72  "var156"
+                              Name 74  "var168"
+                              Name 75  "var1"
+                              Name 76  "var2"
+                              Name 77  "var3"
+                              Name 78  "var4"
+                              Name 79  "var5"
+                              Name 80  "var6"
+                              Name 81  "var7"
+                              Name 82  "var8"
+                              Name 83  "var9"
+                              Name 84  "var10"
+                              Name 85  "var11"
+                              Name 86  "var12"
+                              Name 87  "var15"
+                              Name 88  "var16"
+                              Name 89  "var29"
+                              Name 90  "var57"
+                              Name 91  "var58"
+                              Name 92  "var59"
+                              Name 93  "var60"
+                              Name 94  "var61"
+                              Name 95  "var62"
+                              Name 96  "var63"
+                              Name 97  "var64"
+                              Name 98  "var71"
+                              Name 99  "var73"
+                              Name 100  "var74"
+                              Name 101  "var76"
+                              Name 102  "var77"
+                              Name 103  "var87"
+                              Name 104  "var90"
+                              Name 105  "var99"
+                              Name 106  "var100"
+                              Name 107  "var101"
+                              Name 108  "var102"
+                              Name 109  "var103"
+                              Name 110  "var113"
+                              Name 111  "var115"
+                              Name 112  "var116"
+                              Name 113  "var129"
+                              Name 114  "var141"
+                              Name 115  "var142"
+                              Name 116  "var155"
+                              Name 120  "@entryPointOutput"
+                              Decorate 120(@entryPointOutput) Location 0
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+               8:             TypeFunction 7(fvec4)
+              11:             TypePointer Function 6(float)
+              13:    6(float) Constant 0
+              14:             TypeVector 6(float) 2
+              15:             TypePointer Function 14(fvec2)
+              17:   14(fvec2) ConstantComposite 13 13
+              19:             TypeVector 6(float) 3
+              20:             TypePointer Function 19(fvec3)
+              22:   19(fvec3) ConstantComposite 13 13 13
+              24:             TypePointer Function 7(fvec4)
+              26:    7(fvec4) ConstantComposite 13 13 13 13
+              29:             TypeMatrix 14(fvec2) 2
+              30:             TypePointer Function 29
+              32:          29 ConstantComposite 17 17
+              35:             TypeMatrix 19(fvec3) 2
+              36:             TypePointer Function 35
+              38:          35 ConstantComposite 22 22
+              40:             TypeMatrix 7(fvec4) 2
+              41:             TypePointer Function 40
+              43:          40 ConstantComposite 26 26
+              45:             TypeMatrix 14(fvec2) 3
+              46:             TypePointer Function 45
+              48:          45 ConstantComposite 17 17 17
+              50:             TypeMatrix 19(fvec3) 3
+              51:             TypePointer Function 50
+              53:          50 ConstantComposite 22 22 22
+              55:             TypeMatrix 7(fvec4) 3
+              56:             TypePointer Function 55
+              58:          55 ConstantComposite 26 26 26
+              60:             TypeMatrix 14(fvec2) 4
+              61:             TypePointer Function 60
+              63:          60 ConstantComposite 17 17 17 17
+              65:             TypeMatrix 19(fvec3) 4
+              66:             TypePointer Function 65
+              68:          65 ConstantComposite 22 22 22 22
+              70:             TypeMatrix 7(fvec4) 4
+              71:             TypePointer Function 70
+              73:          70 ConstantComposite 26 26 26 26
+             119:             TypePointer Output 7(fvec4)
+120(@entryPointOutput):    119(ptr) Variable Output
+         4(main):           2 Function None 3
+               5:             Label
+             121:    7(fvec4) FunctionCall 9(@main()
+                              Store 120(@entryPointOutput) 121
+                              Return
+                              FunctionEnd
+       9(@main():    7(fvec4) Function None 8
+              10:             Label
+        12(var0):     11(ptr) Variable Function
+       16(var13):     15(ptr) Variable Function
+       18(var14):     15(ptr) Variable Function
+       21(var26):     20(ptr) Variable Function
+       23(var28):     20(ptr) Variable Function
+       25(var39):     24(ptr) Variable Function
+       27(var42):     24(ptr) Variable Function
+       28(var43):     24(ptr) Variable Function
+       31(var52):     30(ptr) Variable Function
+       33(var55):     30(ptr) Variable Function
+       34(var56):     30(ptr) Variable Function
+       37(var65):     36(ptr) Variable Function
+       39(var70):     36(ptr) Variable Function
+       42(var78):     41(ptr) Variable Function
+       44(var84):     41(ptr) Variable Function
+       47(var91):     46(ptr) Variable Function
+       49(var98):     46(ptr) Variable Function
+      52(var104):     51(ptr) Variable Function
+      54(var112):     51(ptr) Variable Function
+      57(var117):     56(ptr) Variable Function
+      59(var126):     56(ptr) Variable Function
+      62(var130):     61(ptr) Variable Function
+      64(var140):     61(ptr) Variable Function
+      67(var143):     66(ptr) Variable Function
+      69(var154):     66(ptr) Variable Function
+      72(var156):     71(ptr) Variable Function
+      74(var168):     71(ptr) Variable Function
+        75(var1):     11(ptr) Variable Function
+        76(var2):     11(ptr) Variable Function
+        77(var3):     11(ptr) Variable Function
+        78(var4):     11(ptr) Variable Function
+        79(var5):     11(ptr) Variable Function
+        80(var6):     11(ptr) Variable Function
+        81(var7):     11(ptr) Variable Function
+        82(var8):     11(ptr) Variable Function
+        83(var9):     11(ptr) Variable Function
+       84(var10):     11(ptr) Variable Function
+       85(var11):     11(ptr) Variable Function
+       86(var12):     11(ptr) Variable Function
+       87(var15):     15(ptr) Variable Function
+       88(var16):     15(ptr) Variable Function
+       89(var29):     20(ptr) Variable Function
+       90(var57):     30(ptr) Variable Function
+       91(var58):     30(ptr) Variable Function
+       92(var59):     30(ptr) Variable Function
+       93(var60):     30(ptr) Variable Function
+       94(var61):     30(ptr) Variable Function
+       95(var62):     30(ptr) Variable Function
+       96(var63):     30(ptr) Variable Function
+       97(var64):     30(ptr) Variable Function
+       98(var71):     36(ptr) Variable Function
+       99(var73):     36(ptr) Variable Function
+      100(var74):     36(ptr) Variable Function
+      101(var76):     36(ptr) Variable Function
+      102(var77):     36(ptr) Variable Function
+      103(var87):     41(ptr) Variable Function
+      104(var90):     41(ptr) Variable Function
+      105(var99):     46(ptr) Variable Function
+     106(var100):     46(ptr) Variable Function
+     107(var101):     46(ptr) Variable Function
+     108(var102):     46(ptr) Variable Function
+     109(var103):     46(ptr) Variable Function
+     110(var113):     51(ptr) Variable Function
+     111(var115):     51(ptr) Variable Function
+     112(var116):     51(ptr) Variable Function
+     113(var129):     56(ptr) Variable Function
+     114(var141):     61(ptr) Variable Function
+     115(var142):     61(ptr) Variable Function
+     116(var155):     66(ptr) Variable Function
+                              Store 12(var0) 13
+                              Store 16(var13) 17
+                              Store 18(var14) 17
+                              Store 21(var26) 22
+                              Store 23(var28) 22
+                              Store 25(var39) 26
+                              Store 27(var42) 26
+                              Store 28(var43) 26
+                              Store 31(var52) 32
+                              Store 33(var55) 32
+                              Store 34(var56) 32
+                              Store 37(var65) 38
+                              Store 39(var70) 38
+                              Store 42(var78) 43
+                              Store 44(var84) 43
+                              Store 47(var91) 48
+                              Store 49(var98) 48
+                              Store 52(var104) 53
+                              Store 54(var112) 53
+                              Store 57(var117) 58
+                              Store 59(var126) 58
+                              Store 62(var130) 63
+                              Store 64(var140) 63
+                              Store 67(var143) 68
+                              Store 69(var154) 68
+                              Store 72(var156) 73
+                              Store 74(var168) 73
+                              Store 75(var1) 13
+                              Store 76(var2) 13
+                              Store 77(var3) 13
+                              Store 78(var4) 13
+                              Store 79(var5) 13
+                              Store 80(var6) 13
+                              Store 81(var7) 13
+                              Store 82(var8) 13
+                              Store 83(var9) 13
+                              Store 84(var10) 13
+                              Store 85(var11) 13
+                              Store 86(var12) 13
+                              Store 87(var15) 17
+                              Store 88(var16) 17
+                              Store 89(var29) 22
+                              Store 90(var57) 32
+                              Store 91(var58) 32
+                              Store 92(var59) 32
+                              Store 93(var60) 32
+                              Store 94(var61) 32
+                              Store 95(var62) 32
+                              Store 96(var63) 32
+                              Store 97(var64) 32
+                              Store 98(var71) 38
+                              Store 99(var73) 38
+                              Store 100(var74) 38
+                              Store 101(var76) 38
+                              Store 102(var77) 38
+                              Store 103(var87) 43
+                              Store 104(var90) 43
+                              Store 105(var99) 48
+                              Store 106(var100) 48
+                              Store 107(var101) 48
+                              Store 108(var102) 48
+                              Store 109(var103) 48
+                              Store 110(var113) 53
+                              Store 111(var115) 53
+                              Store 112(var116) 53
+                              Store 113(var129) 58
+                              Store 114(var141) 63
+                              Store 115(var142) 63
+                              Store 116(var155) 68
+                              ReturnValue 26
+                              FunctionEnd
diff --git a/Test/baseResults/hlsl.typeGraphCopy.vert.out b/Test/baseResults/hlsl.typeGraphCopy.vert.out
old mode 100755
new mode 100644
index 217e7ec..c0c7227
--- a/Test/baseResults/hlsl.typeGraphCopy.vert.out
+++ b/Test/baseResults/hlsl.typeGraphCopy.vert.out
@@ -62,7 +62,7 @@
 0:?     '@entryPointOutput' (layout( location=0) out float)
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 28
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.typedef.frag.out b/Test/baseResults/hlsl.typedef.frag.out
old mode 100755
new mode 100644
index 1c1a351..11fd107
--- a/Test/baseResults/hlsl.typedef.frag.out
+++ b/Test/baseResults/hlsl.typedef.frag.out
@@ -79,7 +79,7 @@
 0:?   Linker Objects
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 34
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.void.frag.out b/Test/baseResults/hlsl.void.frag.out
old mode 100755
new mode 100644
index 1df35a6..30edd63
--- a/Test/baseResults/hlsl.void.frag.out
+++ b/Test/baseResults/hlsl.void.frag.out
@@ -54,7 +54,7 @@
 0:?     'input' (layout( location=0) in 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 27
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.wavebroadcast.comp.out b/Test/baseResults/hlsl.wavebroadcast.comp.out
new file mode 100644
index 0000000..0dfd9ef
--- /dev/null
+++ b/Test/baseResults/hlsl.wavebroadcast.comp.out
@@ -0,0 +1,2731 @@
+hlsl.wavebroadcast.comp
+Shader version: 500
+local_size = (32, 16, 1)
+0:? Sequence
+0:13  Function Definition: @CSMain(vu3; ( temp void)
+0:13    Function Parameters: 
+0:13      'dti' ( in 3-component vector of uint)
+0:?     Sequence
+0:14      move second child to first child ( temp 4-component vector of uint)
+0:14        u: direct index for structure ( temp 4-component vector of uint)
+0:14          indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:14            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:14              'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:14              Constant:
+0:14                0 (const uint)
+0:14            direct index ( temp uint)
+0:14              'dti' ( in 3-component vector of uint)
+0:14              Constant:
+0:14                0 (const int)
+0:14          Constant:
+0:14            0 (const int)
+0:14        subgroupShuffle ( temp 4-component vector of uint)
+0:14          u: direct index for structure ( temp 4-component vector of uint)
+0:14            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:14              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:14                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:14                Constant:
+0:14                  0 (const uint)
+0:14              direct index ( temp uint)
+0:14                'dti' ( in 3-component vector of uint)
+0:14                Constant:
+0:14                  0 (const int)
+0:14            Constant:
+0:14              0 (const int)
+0:14          Constant:
+0:14            13 (const uint)
+0:15      move second child to first child ( temp uint)
+0:15        direct index ( temp uint)
+0:15          u: direct index for structure ( temp 4-component vector of uint)
+0:15            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:15              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:15                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:15                Constant:
+0:15                  0 (const uint)
+0:15              direct index ( temp uint)
+0:15                'dti' ( in 3-component vector of uint)
+0:15                Constant:
+0:15                  0 (const int)
+0:15            Constant:
+0:15              0 (const int)
+0:15          Constant:
+0:15            0 (const int)
+0:15        subgroupShuffle ( temp uint)
+0:15          direct index ( temp uint)
+0:15            u: direct index for structure ( temp 4-component vector of uint)
+0:15              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:15                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:15                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:15                  Constant:
+0:15                    0 (const uint)
+0:15                direct index ( temp uint)
+0:15                  'dti' ( in 3-component vector of uint)
+0:15                  Constant:
+0:15                    0 (const int)
+0:15              Constant:
+0:15                0 (const int)
+0:15            Constant:
+0:15              0 (const int)
+0:15          Constant:
+0:15            13 (const uint)
+0:16      move second child to first child ( temp 2-component vector of uint)
+0:16        vector swizzle ( temp 2-component vector of uint)
+0:16          u: direct index for structure ( temp 4-component vector of uint)
+0:16            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:16              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:16                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:16                Constant:
+0:16                  0 (const uint)
+0:16              direct index ( temp uint)
+0:16                'dti' ( in 3-component vector of uint)
+0:16                Constant:
+0:16                  0 (const int)
+0:16            Constant:
+0:16              0 (const int)
+0:16          Sequence
+0:16            Constant:
+0:16              0 (const int)
+0:16            Constant:
+0:16              1 (const int)
+0:16        subgroupShuffle ( temp 2-component vector of uint)
+0:16          vector swizzle ( temp 2-component vector of uint)
+0:16            u: direct index for structure ( temp 4-component vector of uint)
+0:16              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:16                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:16                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:16                  Constant:
+0:16                    0 (const uint)
+0:16                direct index ( temp uint)
+0:16                  'dti' ( in 3-component vector of uint)
+0:16                  Constant:
+0:16                    0 (const int)
+0:16              Constant:
+0:16                0 (const int)
+0:16            Sequence
+0:16              Constant:
+0:16                0 (const int)
+0:16              Constant:
+0:16                1 (const int)
+0:16          Constant:
+0:16            13 (const uint)
+0:17      move second child to first child ( temp 3-component vector of uint)
+0:17        vector swizzle ( temp 3-component vector of uint)
+0:17          u: direct index for structure ( temp 4-component vector of uint)
+0:17            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:17              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:17                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:17                Constant:
+0:17                  0 (const uint)
+0:17              direct index ( temp uint)
+0:17                'dti' ( in 3-component vector of uint)
+0:17                Constant:
+0:17                  0 (const int)
+0:17            Constant:
+0:17              0 (const int)
+0:17          Sequence
+0:17            Constant:
+0:17              0 (const int)
+0:17            Constant:
+0:17              1 (const int)
+0:17            Constant:
+0:17              2 (const int)
+0:17        subgroupShuffle ( temp 3-component vector of uint)
+0:17          vector swizzle ( temp 3-component vector of uint)
+0:17            u: direct index for structure ( temp 4-component vector of uint)
+0:17              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:17                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:17                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:17                  Constant:
+0:17                    0 (const uint)
+0:17                direct index ( temp uint)
+0:17                  'dti' ( in 3-component vector of uint)
+0:17                  Constant:
+0:17                    0 (const int)
+0:17              Constant:
+0:17                0 (const int)
+0:17            Sequence
+0:17              Constant:
+0:17                0 (const int)
+0:17              Constant:
+0:17                1 (const int)
+0:17              Constant:
+0:17                2 (const int)
+0:17          Constant:
+0:17            13 (const uint)
+0:19      move second child to first child ( temp 4-component vector of int)
+0:19        i: direct index for structure ( temp 4-component vector of int)
+0:19          indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:19            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:19              'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:19              Constant:
+0:19                0 (const uint)
+0:19            direct index ( temp uint)
+0:19              'dti' ( in 3-component vector of uint)
+0:19              Constant:
+0:19                0 (const int)
+0:19          Constant:
+0:19            1 (const int)
+0:19        subgroupShuffle ( temp 4-component vector of int)
+0:19          i: direct index for structure ( temp 4-component vector of int)
+0:19            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:19              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:19                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:19                Constant:
+0:19                  0 (const uint)
+0:19              direct index ( temp uint)
+0:19                'dti' ( in 3-component vector of uint)
+0:19                Constant:
+0:19                  0 (const int)
+0:19            Constant:
+0:19              1 (const int)
+0:19          Constant:
+0:19            13 (const uint)
+0:20      move second child to first child ( temp int)
+0:20        direct index ( temp int)
+0:20          i: direct index for structure ( temp 4-component vector of int)
+0:20            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:20              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:20                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:20                Constant:
+0:20                  0 (const uint)
+0:20              direct index ( temp uint)
+0:20                'dti' ( in 3-component vector of uint)
+0:20                Constant:
+0:20                  0 (const int)
+0:20            Constant:
+0:20              1 (const int)
+0:20          Constant:
+0:20            0 (const int)
+0:20        subgroupShuffle ( temp int)
+0:20          direct index ( temp int)
+0:20            i: direct index for structure ( temp 4-component vector of int)
+0:20              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:20                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:20                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:20                  Constant:
+0:20                    0 (const uint)
+0:20                direct index ( temp uint)
+0:20                  'dti' ( in 3-component vector of uint)
+0:20                  Constant:
+0:20                    0 (const int)
+0:20              Constant:
+0:20                1 (const int)
+0:20            Constant:
+0:20              0 (const int)
+0:20          Constant:
+0:20            13 (const uint)
+0:21      move second child to first child ( temp 2-component vector of int)
+0:21        vector swizzle ( temp 2-component vector of int)
+0:21          i: direct index for structure ( temp 4-component vector of int)
+0:21            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:21              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:21                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:21                Constant:
+0:21                  0 (const uint)
+0:21              direct index ( temp uint)
+0:21                'dti' ( in 3-component vector of uint)
+0:21                Constant:
+0:21                  0 (const int)
+0:21            Constant:
+0:21              1 (const int)
+0:21          Sequence
+0:21            Constant:
+0:21              0 (const int)
+0:21            Constant:
+0:21              1 (const int)
+0:21        subgroupShuffle ( temp 2-component vector of int)
+0:21          vector swizzle ( temp 2-component vector of int)
+0:21            i: direct index for structure ( temp 4-component vector of int)
+0:21              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:21                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:21                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:21                  Constant:
+0:21                    0 (const uint)
+0:21                direct index ( temp uint)
+0:21                  'dti' ( in 3-component vector of uint)
+0:21                  Constant:
+0:21                    0 (const int)
+0:21              Constant:
+0:21                1 (const int)
+0:21            Sequence
+0:21              Constant:
+0:21                0 (const int)
+0:21              Constant:
+0:21                1 (const int)
+0:21          Constant:
+0:21            13 (const uint)
+0:22      move second child to first child ( temp 3-component vector of int)
+0:22        vector swizzle ( temp 3-component vector of int)
+0:22          i: direct index for structure ( temp 4-component vector of int)
+0:22            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:22              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:22                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:22                Constant:
+0:22                  0 (const uint)
+0:22              direct index ( temp uint)
+0:22                'dti' ( in 3-component vector of uint)
+0:22                Constant:
+0:22                  0 (const int)
+0:22            Constant:
+0:22              1 (const int)
+0:22          Sequence
+0:22            Constant:
+0:22              0 (const int)
+0:22            Constant:
+0:22              1 (const int)
+0:22            Constant:
+0:22              2 (const int)
+0:22        subgroupShuffle ( temp 3-component vector of int)
+0:22          vector swizzle ( temp 3-component vector of int)
+0:22            i: direct index for structure ( temp 4-component vector of int)
+0:22              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:22                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:22                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:22                  Constant:
+0:22                    0 (const uint)
+0:22                direct index ( temp uint)
+0:22                  'dti' ( in 3-component vector of uint)
+0:22                  Constant:
+0:22                    0 (const int)
+0:22              Constant:
+0:22                1 (const int)
+0:22            Sequence
+0:22              Constant:
+0:22                0 (const int)
+0:22              Constant:
+0:22                1 (const int)
+0:22              Constant:
+0:22                2 (const int)
+0:22          Constant:
+0:22            13 (const uint)
+0:24      move second child to first child ( temp 4-component vector of float)
+0:24        f: direct index for structure ( temp 4-component vector of float)
+0:24          indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:24            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:24              'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:24              Constant:
+0:24                0 (const uint)
+0:24            direct index ( temp uint)
+0:24              'dti' ( in 3-component vector of uint)
+0:24              Constant:
+0:24                0 (const int)
+0:24          Constant:
+0:24            2 (const int)
+0:24        subgroupShuffle ( temp 4-component vector of float)
+0:24          f: direct index for structure ( temp 4-component vector of float)
+0:24            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:24              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:24                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:24                Constant:
+0:24                  0 (const uint)
+0:24              direct index ( temp uint)
+0:24                'dti' ( in 3-component vector of uint)
+0:24                Constant:
+0:24                  0 (const int)
+0:24            Constant:
+0:24              2 (const int)
+0:24          Constant:
+0:24            13 (const uint)
+0:25      move second child to first child ( temp float)
+0:25        direct index ( temp float)
+0:25          f: direct index for structure ( temp 4-component vector of float)
+0:25            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:25              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:25                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:25                Constant:
+0:25                  0 (const uint)
+0:25              direct index ( temp uint)
+0:25                'dti' ( in 3-component vector of uint)
+0:25                Constant:
+0:25                  0 (const int)
+0:25            Constant:
+0:25              2 (const int)
+0:25          Constant:
+0:25            0 (const int)
+0:25        subgroupShuffle ( temp float)
+0:25          direct index ( temp float)
+0:25            f: direct index for structure ( temp 4-component vector of float)
+0:25              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:25                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:25                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:25                  Constant:
+0:25                    0 (const uint)
+0:25                direct index ( temp uint)
+0:25                  'dti' ( in 3-component vector of uint)
+0:25                  Constant:
+0:25                    0 (const int)
+0:25              Constant:
+0:25                2 (const int)
+0:25            Constant:
+0:25              0 (const int)
+0:25          Constant:
+0:25            13 (const uint)
+0:26      move second child to first child ( temp 2-component vector of float)
+0:26        vector swizzle ( temp 2-component vector of float)
+0:26          f: direct index for structure ( temp 4-component vector of float)
+0:26            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:26              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:26                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:26                Constant:
+0:26                  0 (const uint)
+0:26              direct index ( temp uint)
+0:26                'dti' ( in 3-component vector of uint)
+0:26                Constant:
+0:26                  0 (const int)
+0:26            Constant:
+0:26              2 (const int)
+0:26          Sequence
+0:26            Constant:
+0:26              0 (const int)
+0:26            Constant:
+0:26              1 (const int)
+0:26        subgroupShuffle ( temp 2-component vector of float)
+0:26          vector swizzle ( temp 2-component vector of float)
+0:26            f: direct index for structure ( temp 4-component vector of float)
+0:26              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:26                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:26                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:26                  Constant:
+0:26                    0 (const uint)
+0:26                direct index ( temp uint)
+0:26                  'dti' ( in 3-component vector of uint)
+0:26                  Constant:
+0:26                    0 (const int)
+0:26              Constant:
+0:26                2 (const int)
+0:26            Sequence
+0:26              Constant:
+0:26                0 (const int)
+0:26              Constant:
+0:26                1 (const int)
+0:26          Constant:
+0:26            13 (const uint)
+0:27      move second child to first child ( temp 3-component vector of float)
+0:27        vector swizzle ( temp 3-component vector of float)
+0:27          f: direct index for structure ( temp 4-component vector of float)
+0:27            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:27              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:27                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:27                Constant:
+0:27                  0 (const uint)
+0:27              direct index ( temp uint)
+0:27                'dti' ( in 3-component vector of uint)
+0:27                Constant:
+0:27                  0 (const int)
+0:27            Constant:
+0:27              2 (const int)
+0:27          Sequence
+0:27            Constant:
+0:27              0 (const int)
+0:27            Constant:
+0:27              1 (const int)
+0:27            Constant:
+0:27              2 (const int)
+0:27        subgroupShuffle ( temp 3-component vector of float)
+0:27          vector swizzle ( temp 3-component vector of float)
+0:27            f: direct index for structure ( temp 4-component vector of float)
+0:27              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:27                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:27                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:27                  Constant:
+0:27                    0 (const uint)
+0:27                direct index ( temp uint)
+0:27                  'dti' ( in 3-component vector of uint)
+0:27                  Constant:
+0:27                    0 (const int)
+0:27              Constant:
+0:27                2 (const int)
+0:27            Sequence
+0:27              Constant:
+0:27                0 (const int)
+0:27              Constant:
+0:27                1 (const int)
+0:27              Constant:
+0:27                2 (const int)
+0:27          Constant:
+0:27            13 (const uint)
+0:29      move second child to first child ( temp 4-component vector of double)
+0:29        d: direct index for structure ( temp 4-component vector of double)
+0:29          indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:29            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:29              'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:29              Constant:
+0:29                0 (const uint)
+0:29            direct index ( temp uint)
+0:29              'dti' ( in 3-component vector of uint)
+0:29              Constant:
+0:29                0 (const int)
+0:29          Constant:
+0:29            3 (const int)
+0:29        subgroupBroadcastFirst ( temp 4-component vector of double)
+0:29          d: direct index for structure ( temp 4-component vector of double)
+0:29            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:29              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:29                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:29                Constant:
+0:29                  0 (const uint)
+0:29              direct index ( temp uint)
+0:29                'dti' ( in 3-component vector of uint)
+0:29                Constant:
+0:29                  0 (const int)
+0:29            Constant:
+0:29              3 (const int)
+0:30      move second child to first child ( temp double)
+0:30        direct index ( temp double)
+0:30          d: direct index for structure ( temp 4-component vector of double)
+0:30            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:30              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:30                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:30                Constant:
+0:30                  0 (const uint)
+0:30              direct index ( temp uint)
+0:30                'dti' ( in 3-component vector of uint)
+0:30                Constant:
+0:30                  0 (const int)
+0:30            Constant:
+0:30              3 (const int)
+0:30          Constant:
+0:30            0 (const int)
+0:30        subgroupBroadcastFirst ( temp double)
+0:30          direct index ( temp double)
+0:30            d: direct index for structure ( temp 4-component vector of double)
+0:30              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:30                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:30                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:30                  Constant:
+0:30                    0 (const uint)
+0:30                direct index ( temp uint)
+0:30                  'dti' ( in 3-component vector of uint)
+0:30                  Constant:
+0:30                    0 (const int)
+0:30              Constant:
+0:30                3 (const int)
+0:30            Constant:
+0:30              0 (const int)
+0:31      move second child to first child ( temp 2-component vector of double)
+0:31        vector swizzle ( temp 2-component vector of double)
+0:31          d: direct index for structure ( temp 4-component vector of double)
+0:31            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:31              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:31                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:31                Constant:
+0:31                  0 (const uint)
+0:31              direct index ( temp uint)
+0:31                'dti' ( in 3-component vector of uint)
+0:31                Constant:
+0:31                  0 (const int)
+0:31            Constant:
+0:31              3 (const int)
+0:31          Sequence
+0:31            Constant:
+0:31              0 (const int)
+0:31            Constant:
+0:31              1 (const int)
+0:31        subgroupBroadcastFirst ( temp 2-component vector of double)
+0:31          vector swizzle ( temp 2-component vector of double)
+0:31            d: direct index for structure ( temp 4-component vector of double)
+0:31              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:31                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:31                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:31                  Constant:
+0:31                    0 (const uint)
+0:31                direct index ( temp uint)
+0:31                  'dti' ( in 3-component vector of uint)
+0:31                  Constant:
+0:31                    0 (const int)
+0:31              Constant:
+0:31                3 (const int)
+0:31            Sequence
+0:31              Constant:
+0:31                0 (const int)
+0:31              Constant:
+0:31                1 (const int)
+0:32      move second child to first child ( temp 3-component vector of double)
+0:32        vector swizzle ( temp 3-component vector of double)
+0:32          d: direct index for structure ( temp 4-component vector of double)
+0:32            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:32              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:32                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:32                Constant:
+0:32                  0 (const uint)
+0:32              direct index ( temp uint)
+0:32                'dti' ( in 3-component vector of uint)
+0:32                Constant:
+0:32                  0 (const int)
+0:32            Constant:
+0:32              3 (const int)
+0:32          Sequence
+0:32            Constant:
+0:32              0 (const int)
+0:32            Constant:
+0:32              1 (const int)
+0:32            Constant:
+0:32              2 (const int)
+0:32        subgroupBroadcastFirst ( temp 3-component vector of double)
+0:32          vector swizzle ( temp 3-component vector of double)
+0:32            d: direct index for structure ( temp 4-component vector of double)
+0:32              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:32                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:32                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:32                  Constant:
+0:32                    0 (const uint)
+0:32                direct index ( temp uint)
+0:32                  'dti' ( in 3-component vector of uint)
+0:32                  Constant:
+0:32                    0 (const int)
+0:32              Constant:
+0:32                3 (const int)
+0:32            Sequence
+0:32              Constant:
+0:32                0 (const int)
+0:32              Constant:
+0:32                1 (const int)
+0:32              Constant:
+0:32                2 (const int)
+0:34      move second child to first child ( temp 4-component vector of uint)
+0:34        u: direct index for structure ( temp 4-component vector of uint)
+0:34          indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:34            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:34              'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:34              Constant:
+0:34                0 (const uint)
+0:34            direct index ( temp uint)
+0:34              'dti' ( in 3-component vector of uint)
+0:34              Constant:
+0:34                0 (const int)
+0:34          Constant:
+0:34            0 (const int)
+0:34        subgroupBroadcastFirst ( temp 4-component vector of uint)
+0:34          u: direct index for structure ( temp 4-component vector of uint)
+0:34            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:34              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:34                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:34                Constant:
+0:34                  0 (const uint)
+0:34              direct index ( temp uint)
+0:34                'dti' ( in 3-component vector of uint)
+0:34                Constant:
+0:34                  0 (const int)
+0:34            Constant:
+0:34              0 (const int)
+0:35      move second child to first child ( temp uint)
+0:35        direct index ( temp uint)
+0:35          u: direct index for structure ( temp 4-component vector of uint)
+0:35            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:35              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:35                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:35                Constant:
+0:35                  0 (const uint)
+0:35              direct index ( temp uint)
+0:35                'dti' ( in 3-component vector of uint)
+0:35                Constant:
+0:35                  0 (const int)
+0:35            Constant:
+0:35              0 (const int)
+0:35          Constant:
+0:35            0 (const int)
+0:35        subgroupBroadcastFirst ( temp uint)
+0:35          direct index ( temp uint)
+0:35            u: direct index for structure ( temp 4-component vector of uint)
+0:35              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:35                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:35                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:35                  Constant:
+0:35                    0 (const uint)
+0:35                direct index ( temp uint)
+0:35                  'dti' ( in 3-component vector of uint)
+0:35                  Constant:
+0:35                    0 (const int)
+0:35              Constant:
+0:35                0 (const int)
+0:35            Constant:
+0:35              0 (const int)
+0:36      move second child to first child ( temp 2-component vector of uint)
+0:36        vector swizzle ( temp 2-component vector of uint)
+0:36          u: direct index for structure ( temp 4-component vector of uint)
+0:36            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:36              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:36                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:36                Constant:
+0:36                  0 (const uint)
+0:36              direct index ( temp uint)
+0:36                'dti' ( in 3-component vector of uint)
+0:36                Constant:
+0:36                  0 (const int)
+0:36            Constant:
+0:36              0 (const int)
+0:36          Sequence
+0:36            Constant:
+0:36              0 (const int)
+0:36            Constant:
+0:36              1 (const int)
+0:36        subgroupBroadcastFirst ( temp 2-component vector of uint)
+0:36          vector swizzle ( temp 2-component vector of uint)
+0:36            u: direct index for structure ( temp 4-component vector of uint)
+0:36              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:36                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:36                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:36                  Constant:
+0:36                    0 (const uint)
+0:36                direct index ( temp uint)
+0:36                  'dti' ( in 3-component vector of uint)
+0:36                  Constant:
+0:36                    0 (const int)
+0:36              Constant:
+0:36                0 (const int)
+0:36            Sequence
+0:36              Constant:
+0:36                0 (const int)
+0:36              Constant:
+0:36                1 (const int)
+0:37      move second child to first child ( temp 3-component vector of uint)
+0:37        vector swizzle ( temp 3-component vector of uint)
+0:37          u: direct index for structure ( temp 4-component vector of uint)
+0:37            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:37              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:37                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:37                Constant:
+0:37                  0 (const uint)
+0:37              direct index ( temp uint)
+0:37                'dti' ( in 3-component vector of uint)
+0:37                Constant:
+0:37                  0 (const int)
+0:37            Constant:
+0:37              0 (const int)
+0:37          Sequence
+0:37            Constant:
+0:37              0 (const int)
+0:37            Constant:
+0:37              1 (const int)
+0:37            Constant:
+0:37              2 (const int)
+0:37        subgroupBroadcastFirst ( temp 3-component vector of uint)
+0:37          vector swizzle ( temp 3-component vector of uint)
+0:37            u: direct index for structure ( temp 4-component vector of uint)
+0:37              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:37                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:37                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:37                  Constant:
+0:37                    0 (const uint)
+0:37                direct index ( temp uint)
+0:37                  'dti' ( in 3-component vector of uint)
+0:37                  Constant:
+0:37                    0 (const int)
+0:37              Constant:
+0:37                0 (const int)
+0:37            Sequence
+0:37              Constant:
+0:37                0 (const int)
+0:37              Constant:
+0:37                1 (const int)
+0:37              Constant:
+0:37                2 (const int)
+0:39      move second child to first child ( temp 4-component vector of int)
+0:39        i: direct index for structure ( temp 4-component vector of int)
+0:39          indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:39            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:39              'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:39              Constant:
+0:39                0 (const uint)
+0:39            direct index ( temp uint)
+0:39              'dti' ( in 3-component vector of uint)
+0:39              Constant:
+0:39                0 (const int)
+0:39          Constant:
+0:39            1 (const int)
+0:39        subgroupBroadcastFirst ( temp 4-component vector of int)
+0:39          i: direct index for structure ( temp 4-component vector of int)
+0:39            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:39              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:39                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:39                Constant:
+0:39                  0 (const uint)
+0:39              direct index ( temp uint)
+0:39                'dti' ( in 3-component vector of uint)
+0:39                Constant:
+0:39                  0 (const int)
+0:39            Constant:
+0:39              1 (const int)
+0:40      move second child to first child ( temp int)
+0:40        direct index ( temp int)
+0:40          i: direct index for structure ( temp 4-component vector of int)
+0:40            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:40              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:40                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:40                Constant:
+0:40                  0 (const uint)
+0:40              direct index ( temp uint)
+0:40                'dti' ( in 3-component vector of uint)
+0:40                Constant:
+0:40                  0 (const int)
+0:40            Constant:
+0:40              1 (const int)
+0:40          Constant:
+0:40            0 (const int)
+0:40        subgroupBroadcastFirst ( temp int)
+0:40          direct index ( temp int)
+0:40            i: direct index for structure ( temp 4-component vector of int)
+0:40              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:40                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:40                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:40                  Constant:
+0:40                    0 (const uint)
+0:40                direct index ( temp uint)
+0:40                  'dti' ( in 3-component vector of uint)
+0:40                  Constant:
+0:40                    0 (const int)
+0:40              Constant:
+0:40                1 (const int)
+0:40            Constant:
+0:40              0 (const int)
+0:41      move second child to first child ( temp 2-component vector of int)
+0:41        vector swizzle ( temp 2-component vector of int)
+0:41          i: direct index for structure ( temp 4-component vector of int)
+0:41            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:41              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:41                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:41                Constant:
+0:41                  0 (const uint)
+0:41              direct index ( temp uint)
+0:41                'dti' ( in 3-component vector of uint)
+0:41                Constant:
+0:41                  0 (const int)
+0:41            Constant:
+0:41              1 (const int)
+0:41          Sequence
+0:41            Constant:
+0:41              0 (const int)
+0:41            Constant:
+0:41              1 (const int)
+0:41        subgroupBroadcastFirst ( temp 2-component vector of int)
+0:41          vector swizzle ( temp 2-component vector of int)
+0:41            i: direct index for structure ( temp 4-component vector of int)
+0:41              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:41                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:41                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:41                  Constant:
+0:41                    0 (const uint)
+0:41                direct index ( temp uint)
+0:41                  'dti' ( in 3-component vector of uint)
+0:41                  Constant:
+0:41                    0 (const int)
+0:41              Constant:
+0:41                1 (const int)
+0:41            Sequence
+0:41              Constant:
+0:41                0 (const int)
+0:41              Constant:
+0:41                1 (const int)
+0:42      move second child to first child ( temp 3-component vector of int)
+0:42        vector swizzle ( temp 3-component vector of int)
+0:42          i: direct index for structure ( temp 4-component vector of int)
+0:42            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:42              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:42                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:42                Constant:
+0:42                  0 (const uint)
+0:42              direct index ( temp uint)
+0:42                'dti' ( in 3-component vector of uint)
+0:42                Constant:
+0:42                  0 (const int)
+0:42            Constant:
+0:42              1 (const int)
+0:42          Sequence
+0:42            Constant:
+0:42              0 (const int)
+0:42            Constant:
+0:42              1 (const int)
+0:42            Constant:
+0:42              2 (const int)
+0:42        subgroupBroadcastFirst ( temp 3-component vector of int)
+0:42          vector swizzle ( temp 3-component vector of int)
+0:42            i: direct index for structure ( temp 4-component vector of int)
+0:42              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:42                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:42                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:42                  Constant:
+0:42                    0 (const uint)
+0:42                direct index ( temp uint)
+0:42                  'dti' ( in 3-component vector of uint)
+0:42                  Constant:
+0:42                    0 (const int)
+0:42              Constant:
+0:42                1 (const int)
+0:42            Sequence
+0:42              Constant:
+0:42                0 (const int)
+0:42              Constant:
+0:42                1 (const int)
+0:42              Constant:
+0:42                2 (const int)
+0:44      move second child to first child ( temp 4-component vector of float)
+0:44        f: direct index for structure ( temp 4-component vector of float)
+0:44          indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:44            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:44              'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:44              Constant:
+0:44                0 (const uint)
+0:44            direct index ( temp uint)
+0:44              'dti' ( in 3-component vector of uint)
+0:44              Constant:
+0:44                0 (const int)
+0:44          Constant:
+0:44            2 (const int)
+0:44        subgroupBroadcastFirst ( temp 4-component vector of float)
+0:44          f: direct index for structure ( temp 4-component vector of float)
+0:44            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:44              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:44                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:44                Constant:
+0:44                  0 (const uint)
+0:44              direct index ( temp uint)
+0:44                'dti' ( in 3-component vector of uint)
+0:44                Constant:
+0:44                  0 (const int)
+0:44            Constant:
+0:44              2 (const int)
+0:45      move second child to first child ( temp float)
+0:45        direct index ( temp float)
+0:45          f: direct index for structure ( temp 4-component vector of float)
+0:45            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:45              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:45                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:45                Constant:
+0:45                  0 (const uint)
+0:45              direct index ( temp uint)
+0:45                'dti' ( in 3-component vector of uint)
+0:45                Constant:
+0:45                  0 (const int)
+0:45            Constant:
+0:45              2 (const int)
+0:45          Constant:
+0:45            0 (const int)
+0:45        subgroupBroadcastFirst ( temp float)
+0:45          direct index ( temp float)
+0:45            f: direct index for structure ( temp 4-component vector of float)
+0:45              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:45                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:45                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:45                  Constant:
+0:45                    0 (const uint)
+0:45                direct index ( temp uint)
+0:45                  'dti' ( in 3-component vector of uint)
+0:45                  Constant:
+0:45                    0 (const int)
+0:45              Constant:
+0:45                2 (const int)
+0:45            Constant:
+0:45              0 (const int)
+0:46      move second child to first child ( temp 2-component vector of float)
+0:46        vector swizzle ( temp 2-component vector of float)
+0:46          f: direct index for structure ( temp 4-component vector of float)
+0:46            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:46              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:46                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:46                Constant:
+0:46                  0 (const uint)
+0:46              direct index ( temp uint)
+0:46                'dti' ( in 3-component vector of uint)
+0:46                Constant:
+0:46                  0 (const int)
+0:46            Constant:
+0:46              2 (const int)
+0:46          Sequence
+0:46            Constant:
+0:46              0 (const int)
+0:46            Constant:
+0:46              1 (const int)
+0:46        subgroupBroadcastFirst ( temp 2-component vector of float)
+0:46          vector swizzle ( temp 2-component vector of float)
+0:46            f: direct index for structure ( temp 4-component vector of float)
+0:46              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:46                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:46                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:46                  Constant:
+0:46                    0 (const uint)
+0:46                direct index ( temp uint)
+0:46                  'dti' ( in 3-component vector of uint)
+0:46                  Constant:
+0:46                    0 (const int)
+0:46              Constant:
+0:46                2 (const int)
+0:46            Sequence
+0:46              Constant:
+0:46                0 (const int)
+0:46              Constant:
+0:46                1 (const int)
+0:47      move second child to first child ( temp 3-component vector of float)
+0:47        vector swizzle ( temp 3-component vector of float)
+0:47          f: direct index for structure ( temp 4-component vector of float)
+0:47            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:47              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:47                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:47                Constant:
+0:47                  0 (const uint)
+0:47              direct index ( temp uint)
+0:47                'dti' ( in 3-component vector of uint)
+0:47                Constant:
+0:47                  0 (const int)
+0:47            Constant:
+0:47              2 (const int)
+0:47          Sequence
+0:47            Constant:
+0:47              0 (const int)
+0:47            Constant:
+0:47              1 (const int)
+0:47            Constant:
+0:47              2 (const int)
+0:47        subgroupBroadcastFirst ( temp 3-component vector of float)
+0:47          vector swizzle ( temp 3-component vector of float)
+0:47            f: direct index for structure ( temp 4-component vector of float)
+0:47              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:47                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:47                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:47                  Constant:
+0:47                    0 (const uint)
+0:47                direct index ( temp uint)
+0:47                  'dti' ( in 3-component vector of uint)
+0:47                  Constant:
+0:47                    0 (const int)
+0:47              Constant:
+0:47                2 (const int)
+0:47            Sequence
+0:47              Constant:
+0:47                0 (const int)
+0:47              Constant:
+0:47                1 (const int)
+0:47              Constant:
+0:47                2 (const int)
+0:49      move second child to first child ( temp 4-component vector of double)
+0:49        d: direct index for structure ( temp 4-component vector of double)
+0:49          indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:49            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:49              'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:49              Constant:
+0:49                0 (const uint)
+0:49            direct index ( temp uint)
+0:49              'dti' ( in 3-component vector of uint)
+0:49              Constant:
+0:49                0 (const int)
+0:49          Constant:
+0:49            3 (const int)
+0:49        subgroupBroadcastFirst ( temp 4-component vector of double)
+0:49          d: direct index for structure ( temp 4-component vector of double)
+0:49            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:49              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:49                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:49                Constant:
+0:49                  0 (const uint)
+0:49              direct index ( temp uint)
+0:49                'dti' ( in 3-component vector of uint)
+0:49                Constant:
+0:49                  0 (const int)
+0:49            Constant:
+0:49              3 (const int)
+0:50      move second child to first child ( temp double)
+0:50        direct index ( temp double)
+0:50          d: direct index for structure ( temp 4-component vector of double)
+0:50            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:50              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:50                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:50                Constant:
+0:50                  0 (const uint)
+0:50              direct index ( temp uint)
+0:50                'dti' ( in 3-component vector of uint)
+0:50                Constant:
+0:50                  0 (const int)
+0:50            Constant:
+0:50              3 (const int)
+0:50          Constant:
+0:50            0 (const int)
+0:50        subgroupBroadcastFirst ( temp double)
+0:50          direct index ( temp double)
+0:50            d: direct index for structure ( temp 4-component vector of double)
+0:50              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:50                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:50                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:50                  Constant:
+0:50                    0 (const uint)
+0:50                direct index ( temp uint)
+0:50                  'dti' ( in 3-component vector of uint)
+0:50                  Constant:
+0:50                    0 (const int)
+0:50              Constant:
+0:50                3 (const int)
+0:50            Constant:
+0:50              0 (const int)
+0:51      move second child to first child ( temp 2-component vector of double)
+0:51        vector swizzle ( temp 2-component vector of double)
+0:51          d: direct index for structure ( temp 4-component vector of double)
+0:51            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:51              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:51                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:51                Constant:
+0:51                  0 (const uint)
+0:51              direct index ( temp uint)
+0:51                'dti' ( in 3-component vector of uint)
+0:51                Constant:
+0:51                  0 (const int)
+0:51            Constant:
+0:51              3 (const int)
+0:51          Sequence
+0:51            Constant:
+0:51              0 (const int)
+0:51            Constant:
+0:51              1 (const int)
+0:51        subgroupBroadcastFirst ( temp 2-component vector of double)
+0:51          vector swizzle ( temp 2-component vector of double)
+0:51            d: direct index for structure ( temp 4-component vector of double)
+0:51              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:51                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:51                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:51                  Constant:
+0:51                    0 (const uint)
+0:51                direct index ( temp uint)
+0:51                  'dti' ( in 3-component vector of uint)
+0:51                  Constant:
+0:51                    0 (const int)
+0:51              Constant:
+0:51                3 (const int)
+0:51            Sequence
+0:51              Constant:
+0:51                0 (const int)
+0:51              Constant:
+0:51                1 (const int)
+0:52      move second child to first child ( temp 3-component vector of double)
+0:52        vector swizzle ( temp 3-component vector of double)
+0:52          d: direct index for structure ( temp 4-component vector of double)
+0:52            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:52              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:52                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:52                Constant:
+0:52                  0 (const uint)
+0:52              direct index ( temp uint)
+0:52                'dti' ( in 3-component vector of uint)
+0:52                Constant:
+0:52                  0 (const int)
+0:52            Constant:
+0:52              3 (const int)
+0:52          Sequence
+0:52            Constant:
+0:52              0 (const int)
+0:52            Constant:
+0:52              1 (const int)
+0:52            Constant:
+0:52              2 (const int)
+0:52        subgroupBroadcastFirst ( temp 3-component vector of double)
+0:52          vector swizzle ( temp 3-component vector of double)
+0:52            d: direct index for structure ( temp 4-component vector of double)
+0:52              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:52                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:52                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:52                  Constant:
+0:52                    0 (const uint)
+0:52                direct index ( temp uint)
+0:52                  'dti' ( in 3-component vector of uint)
+0:52                  Constant:
+0:52                    0 (const int)
+0:52              Constant:
+0:52                3 (const int)
+0:52            Sequence
+0:52              Constant:
+0:52                0 (const int)
+0:52              Constant:
+0:52                1 (const int)
+0:52              Constant:
+0:52                2 (const int)
+0:13  Function Definition: CSMain( ( temp void)
+0:13    Function Parameters: 
+0:?     Sequence
+0:13      move second child to first child ( temp 3-component vector of uint)
+0:?         'dti' ( temp 3-component vector of uint)
+0:?         'dti' ( in 3-component vector of uint GlobalInvocationID)
+0:13      Function Call: @CSMain(vu3; ( temp void)
+0:?         'dti' ( temp 3-component vector of uint)
+0:?   Linker Objects
+0:?     'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:?     'dti' ( in 3-component vector of uint GlobalInvocationID)
+
+
+Linked compute stage:
+
+
+Shader version: 500
+local_size = (32, 16, 1)
+0:? Sequence
+0:13  Function Definition: @CSMain(vu3; ( temp void)
+0:13    Function Parameters: 
+0:13      'dti' ( in 3-component vector of uint)
+0:?     Sequence
+0:14      move second child to first child ( temp 4-component vector of uint)
+0:14        u: direct index for structure ( temp 4-component vector of uint)
+0:14          indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:14            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:14              'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:14              Constant:
+0:14                0 (const uint)
+0:14            direct index ( temp uint)
+0:14              'dti' ( in 3-component vector of uint)
+0:14              Constant:
+0:14                0 (const int)
+0:14          Constant:
+0:14            0 (const int)
+0:14        subgroupShuffle ( temp 4-component vector of uint)
+0:14          u: direct index for structure ( temp 4-component vector of uint)
+0:14            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:14              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:14                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:14                Constant:
+0:14                  0 (const uint)
+0:14              direct index ( temp uint)
+0:14                'dti' ( in 3-component vector of uint)
+0:14                Constant:
+0:14                  0 (const int)
+0:14            Constant:
+0:14              0 (const int)
+0:14          Constant:
+0:14            13 (const uint)
+0:15      move second child to first child ( temp uint)
+0:15        direct index ( temp uint)
+0:15          u: direct index for structure ( temp 4-component vector of uint)
+0:15            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:15              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:15                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:15                Constant:
+0:15                  0 (const uint)
+0:15              direct index ( temp uint)
+0:15                'dti' ( in 3-component vector of uint)
+0:15                Constant:
+0:15                  0 (const int)
+0:15            Constant:
+0:15              0 (const int)
+0:15          Constant:
+0:15            0 (const int)
+0:15        subgroupShuffle ( temp uint)
+0:15          direct index ( temp uint)
+0:15            u: direct index for structure ( temp 4-component vector of uint)
+0:15              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:15                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:15                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:15                  Constant:
+0:15                    0 (const uint)
+0:15                direct index ( temp uint)
+0:15                  'dti' ( in 3-component vector of uint)
+0:15                  Constant:
+0:15                    0 (const int)
+0:15              Constant:
+0:15                0 (const int)
+0:15            Constant:
+0:15              0 (const int)
+0:15          Constant:
+0:15            13 (const uint)
+0:16      move second child to first child ( temp 2-component vector of uint)
+0:16        vector swizzle ( temp 2-component vector of uint)
+0:16          u: direct index for structure ( temp 4-component vector of uint)
+0:16            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:16              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:16                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:16                Constant:
+0:16                  0 (const uint)
+0:16              direct index ( temp uint)
+0:16                'dti' ( in 3-component vector of uint)
+0:16                Constant:
+0:16                  0 (const int)
+0:16            Constant:
+0:16              0 (const int)
+0:16          Sequence
+0:16            Constant:
+0:16              0 (const int)
+0:16            Constant:
+0:16              1 (const int)
+0:16        subgroupShuffle ( temp 2-component vector of uint)
+0:16          vector swizzle ( temp 2-component vector of uint)
+0:16            u: direct index for structure ( temp 4-component vector of uint)
+0:16              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:16                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:16                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:16                  Constant:
+0:16                    0 (const uint)
+0:16                direct index ( temp uint)
+0:16                  'dti' ( in 3-component vector of uint)
+0:16                  Constant:
+0:16                    0 (const int)
+0:16              Constant:
+0:16                0 (const int)
+0:16            Sequence
+0:16              Constant:
+0:16                0 (const int)
+0:16              Constant:
+0:16                1 (const int)
+0:16          Constant:
+0:16            13 (const uint)
+0:17      move second child to first child ( temp 3-component vector of uint)
+0:17        vector swizzle ( temp 3-component vector of uint)
+0:17          u: direct index for structure ( temp 4-component vector of uint)
+0:17            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:17              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:17                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:17                Constant:
+0:17                  0 (const uint)
+0:17              direct index ( temp uint)
+0:17                'dti' ( in 3-component vector of uint)
+0:17                Constant:
+0:17                  0 (const int)
+0:17            Constant:
+0:17              0 (const int)
+0:17          Sequence
+0:17            Constant:
+0:17              0 (const int)
+0:17            Constant:
+0:17              1 (const int)
+0:17            Constant:
+0:17              2 (const int)
+0:17        subgroupShuffle ( temp 3-component vector of uint)
+0:17          vector swizzle ( temp 3-component vector of uint)
+0:17            u: direct index for structure ( temp 4-component vector of uint)
+0:17              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:17                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:17                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:17                  Constant:
+0:17                    0 (const uint)
+0:17                direct index ( temp uint)
+0:17                  'dti' ( in 3-component vector of uint)
+0:17                  Constant:
+0:17                    0 (const int)
+0:17              Constant:
+0:17                0 (const int)
+0:17            Sequence
+0:17              Constant:
+0:17                0 (const int)
+0:17              Constant:
+0:17                1 (const int)
+0:17              Constant:
+0:17                2 (const int)
+0:17          Constant:
+0:17            13 (const uint)
+0:19      move second child to first child ( temp 4-component vector of int)
+0:19        i: direct index for structure ( temp 4-component vector of int)
+0:19          indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:19            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:19              'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:19              Constant:
+0:19                0 (const uint)
+0:19            direct index ( temp uint)
+0:19              'dti' ( in 3-component vector of uint)
+0:19              Constant:
+0:19                0 (const int)
+0:19          Constant:
+0:19            1 (const int)
+0:19        subgroupShuffle ( temp 4-component vector of int)
+0:19          i: direct index for structure ( temp 4-component vector of int)
+0:19            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:19              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:19                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:19                Constant:
+0:19                  0 (const uint)
+0:19              direct index ( temp uint)
+0:19                'dti' ( in 3-component vector of uint)
+0:19                Constant:
+0:19                  0 (const int)
+0:19            Constant:
+0:19              1 (const int)
+0:19          Constant:
+0:19            13 (const uint)
+0:20      move second child to first child ( temp int)
+0:20        direct index ( temp int)
+0:20          i: direct index for structure ( temp 4-component vector of int)
+0:20            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:20              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:20                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:20                Constant:
+0:20                  0 (const uint)
+0:20              direct index ( temp uint)
+0:20                'dti' ( in 3-component vector of uint)
+0:20                Constant:
+0:20                  0 (const int)
+0:20            Constant:
+0:20              1 (const int)
+0:20          Constant:
+0:20            0 (const int)
+0:20        subgroupShuffle ( temp int)
+0:20          direct index ( temp int)
+0:20            i: direct index for structure ( temp 4-component vector of int)
+0:20              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:20                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:20                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:20                  Constant:
+0:20                    0 (const uint)
+0:20                direct index ( temp uint)
+0:20                  'dti' ( in 3-component vector of uint)
+0:20                  Constant:
+0:20                    0 (const int)
+0:20              Constant:
+0:20                1 (const int)
+0:20            Constant:
+0:20              0 (const int)
+0:20          Constant:
+0:20            13 (const uint)
+0:21      move second child to first child ( temp 2-component vector of int)
+0:21        vector swizzle ( temp 2-component vector of int)
+0:21          i: direct index for structure ( temp 4-component vector of int)
+0:21            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:21              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:21                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:21                Constant:
+0:21                  0 (const uint)
+0:21              direct index ( temp uint)
+0:21                'dti' ( in 3-component vector of uint)
+0:21                Constant:
+0:21                  0 (const int)
+0:21            Constant:
+0:21              1 (const int)
+0:21          Sequence
+0:21            Constant:
+0:21              0 (const int)
+0:21            Constant:
+0:21              1 (const int)
+0:21        subgroupShuffle ( temp 2-component vector of int)
+0:21          vector swizzle ( temp 2-component vector of int)
+0:21            i: direct index for structure ( temp 4-component vector of int)
+0:21              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:21                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:21                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:21                  Constant:
+0:21                    0 (const uint)
+0:21                direct index ( temp uint)
+0:21                  'dti' ( in 3-component vector of uint)
+0:21                  Constant:
+0:21                    0 (const int)
+0:21              Constant:
+0:21                1 (const int)
+0:21            Sequence
+0:21              Constant:
+0:21                0 (const int)
+0:21              Constant:
+0:21                1 (const int)
+0:21          Constant:
+0:21            13 (const uint)
+0:22      move second child to first child ( temp 3-component vector of int)
+0:22        vector swizzle ( temp 3-component vector of int)
+0:22          i: direct index for structure ( temp 4-component vector of int)
+0:22            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:22              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:22                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:22                Constant:
+0:22                  0 (const uint)
+0:22              direct index ( temp uint)
+0:22                'dti' ( in 3-component vector of uint)
+0:22                Constant:
+0:22                  0 (const int)
+0:22            Constant:
+0:22              1 (const int)
+0:22          Sequence
+0:22            Constant:
+0:22              0 (const int)
+0:22            Constant:
+0:22              1 (const int)
+0:22            Constant:
+0:22              2 (const int)
+0:22        subgroupShuffle ( temp 3-component vector of int)
+0:22          vector swizzle ( temp 3-component vector of int)
+0:22            i: direct index for structure ( temp 4-component vector of int)
+0:22              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:22                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:22                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:22                  Constant:
+0:22                    0 (const uint)
+0:22                direct index ( temp uint)
+0:22                  'dti' ( in 3-component vector of uint)
+0:22                  Constant:
+0:22                    0 (const int)
+0:22              Constant:
+0:22                1 (const int)
+0:22            Sequence
+0:22              Constant:
+0:22                0 (const int)
+0:22              Constant:
+0:22                1 (const int)
+0:22              Constant:
+0:22                2 (const int)
+0:22          Constant:
+0:22            13 (const uint)
+0:24      move second child to first child ( temp 4-component vector of float)
+0:24        f: direct index for structure ( temp 4-component vector of float)
+0:24          indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:24            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:24              'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:24              Constant:
+0:24                0 (const uint)
+0:24            direct index ( temp uint)
+0:24              'dti' ( in 3-component vector of uint)
+0:24              Constant:
+0:24                0 (const int)
+0:24          Constant:
+0:24            2 (const int)
+0:24        subgroupShuffle ( temp 4-component vector of float)
+0:24          f: direct index for structure ( temp 4-component vector of float)
+0:24            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:24              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:24                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:24                Constant:
+0:24                  0 (const uint)
+0:24              direct index ( temp uint)
+0:24                'dti' ( in 3-component vector of uint)
+0:24                Constant:
+0:24                  0 (const int)
+0:24            Constant:
+0:24              2 (const int)
+0:24          Constant:
+0:24            13 (const uint)
+0:25      move second child to first child ( temp float)
+0:25        direct index ( temp float)
+0:25          f: direct index for structure ( temp 4-component vector of float)
+0:25            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:25              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:25                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:25                Constant:
+0:25                  0 (const uint)
+0:25              direct index ( temp uint)
+0:25                'dti' ( in 3-component vector of uint)
+0:25                Constant:
+0:25                  0 (const int)
+0:25            Constant:
+0:25              2 (const int)
+0:25          Constant:
+0:25            0 (const int)
+0:25        subgroupShuffle ( temp float)
+0:25          direct index ( temp float)
+0:25            f: direct index for structure ( temp 4-component vector of float)
+0:25              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:25                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:25                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:25                  Constant:
+0:25                    0 (const uint)
+0:25                direct index ( temp uint)
+0:25                  'dti' ( in 3-component vector of uint)
+0:25                  Constant:
+0:25                    0 (const int)
+0:25              Constant:
+0:25                2 (const int)
+0:25            Constant:
+0:25              0 (const int)
+0:25          Constant:
+0:25            13 (const uint)
+0:26      move second child to first child ( temp 2-component vector of float)
+0:26        vector swizzle ( temp 2-component vector of float)
+0:26          f: direct index for structure ( temp 4-component vector of float)
+0:26            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:26              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:26                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:26                Constant:
+0:26                  0 (const uint)
+0:26              direct index ( temp uint)
+0:26                'dti' ( in 3-component vector of uint)
+0:26                Constant:
+0:26                  0 (const int)
+0:26            Constant:
+0:26              2 (const int)
+0:26          Sequence
+0:26            Constant:
+0:26              0 (const int)
+0:26            Constant:
+0:26              1 (const int)
+0:26        subgroupShuffle ( temp 2-component vector of float)
+0:26          vector swizzle ( temp 2-component vector of float)
+0:26            f: direct index for structure ( temp 4-component vector of float)
+0:26              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:26                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:26                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:26                  Constant:
+0:26                    0 (const uint)
+0:26                direct index ( temp uint)
+0:26                  'dti' ( in 3-component vector of uint)
+0:26                  Constant:
+0:26                    0 (const int)
+0:26              Constant:
+0:26                2 (const int)
+0:26            Sequence
+0:26              Constant:
+0:26                0 (const int)
+0:26              Constant:
+0:26                1 (const int)
+0:26          Constant:
+0:26            13 (const uint)
+0:27      move second child to first child ( temp 3-component vector of float)
+0:27        vector swizzle ( temp 3-component vector of float)
+0:27          f: direct index for structure ( temp 4-component vector of float)
+0:27            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:27              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:27                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:27                Constant:
+0:27                  0 (const uint)
+0:27              direct index ( temp uint)
+0:27                'dti' ( in 3-component vector of uint)
+0:27                Constant:
+0:27                  0 (const int)
+0:27            Constant:
+0:27              2 (const int)
+0:27          Sequence
+0:27            Constant:
+0:27              0 (const int)
+0:27            Constant:
+0:27              1 (const int)
+0:27            Constant:
+0:27              2 (const int)
+0:27        subgroupShuffle ( temp 3-component vector of float)
+0:27          vector swizzle ( temp 3-component vector of float)
+0:27            f: direct index for structure ( temp 4-component vector of float)
+0:27              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:27                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:27                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:27                  Constant:
+0:27                    0 (const uint)
+0:27                direct index ( temp uint)
+0:27                  'dti' ( in 3-component vector of uint)
+0:27                  Constant:
+0:27                    0 (const int)
+0:27              Constant:
+0:27                2 (const int)
+0:27            Sequence
+0:27              Constant:
+0:27                0 (const int)
+0:27              Constant:
+0:27                1 (const int)
+0:27              Constant:
+0:27                2 (const int)
+0:27          Constant:
+0:27            13 (const uint)
+0:29      move second child to first child ( temp 4-component vector of double)
+0:29        d: direct index for structure ( temp 4-component vector of double)
+0:29          indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:29            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:29              'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:29              Constant:
+0:29                0 (const uint)
+0:29            direct index ( temp uint)
+0:29              'dti' ( in 3-component vector of uint)
+0:29              Constant:
+0:29                0 (const int)
+0:29          Constant:
+0:29            3 (const int)
+0:29        subgroupBroadcastFirst ( temp 4-component vector of double)
+0:29          d: direct index for structure ( temp 4-component vector of double)
+0:29            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:29              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:29                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:29                Constant:
+0:29                  0 (const uint)
+0:29              direct index ( temp uint)
+0:29                'dti' ( in 3-component vector of uint)
+0:29                Constant:
+0:29                  0 (const int)
+0:29            Constant:
+0:29              3 (const int)
+0:30      move second child to first child ( temp double)
+0:30        direct index ( temp double)
+0:30          d: direct index for structure ( temp 4-component vector of double)
+0:30            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:30              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:30                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:30                Constant:
+0:30                  0 (const uint)
+0:30              direct index ( temp uint)
+0:30                'dti' ( in 3-component vector of uint)
+0:30                Constant:
+0:30                  0 (const int)
+0:30            Constant:
+0:30              3 (const int)
+0:30          Constant:
+0:30            0 (const int)
+0:30        subgroupBroadcastFirst ( temp double)
+0:30          direct index ( temp double)
+0:30            d: direct index for structure ( temp 4-component vector of double)
+0:30              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:30                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:30                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:30                  Constant:
+0:30                    0 (const uint)
+0:30                direct index ( temp uint)
+0:30                  'dti' ( in 3-component vector of uint)
+0:30                  Constant:
+0:30                    0 (const int)
+0:30              Constant:
+0:30                3 (const int)
+0:30            Constant:
+0:30              0 (const int)
+0:31      move second child to first child ( temp 2-component vector of double)
+0:31        vector swizzle ( temp 2-component vector of double)
+0:31          d: direct index for structure ( temp 4-component vector of double)
+0:31            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:31              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:31                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:31                Constant:
+0:31                  0 (const uint)
+0:31              direct index ( temp uint)
+0:31                'dti' ( in 3-component vector of uint)
+0:31                Constant:
+0:31                  0 (const int)
+0:31            Constant:
+0:31              3 (const int)
+0:31          Sequence
+0:31            Constant:
+0:31              0 (const int)
+0:31            Constant:
+0:31              1 (const int)
+0:31        subgroupBroadcastFirst ( temp 2-component vector of double)
+0:31          vector swizzle ( temp 2-component vector of double)
+0:31            d: direct index for structure ( temp 4-component vector of double)
+0:31              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:31                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:31                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:31                  Constant:
+0:31                    0 (const uint)
+0:31                direct index ( temp uint)
+0:31                  'dti' ( in 3-component vector of uint)
+0:31                  Constant:
+0:31                    0 (const int)
+0:31              Constant:
+0:31                3 (const int)
+0:31            Sequence
+0:31              Constant:
+0:31                0 (const int)
+0:31              Constant:
+0:31                1 (const int)
+0:32      move second child to first child ( temp 3-component vector of double)
+0:32        vector swizzle ( temp 3-component vector of double)
+0:32          d: direct index for structure ( temp 4-component vector of double)
+0:32            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:32              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:32                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:32                Constant:
+0:32                  0 (const uint)
+0:32              direct index ( temp uint)
+0:32                'dti' ( in 3-component vector of uint)
+0:32                Constant:
+0:32                  0 (const int)
+0:32            Constant:
+0:32              3 (const int)
+0:32          Sequence
+0:32            Constant:
+0:32              0 (const int)
+0:32            Constant:
+0:32              1 (const int)
+0:32            Constant:
+0:32              2 (const int)
+0:32        subgroupBroadcastFirst ( temp 3-component vector of double)
+0:32          vector swizzle ( temp 3-component vector of double)
+0:32            d: direct index for structure ( temp 4-component vector of double)
+0:32              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:32                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:32                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:32                  Constant:
+0:32                    0 (const uint)
+0:32                direct index ( temp uint)
+0:32                  'dti' ( in 3-component vector of uint)
+0:32                  Constant:
+0:32                    0 (const int)
+0:32              Constant:
+0:32                3 (const int)
+0:32            Sequence
+0:32              Constant:
+0:32                0 (const int)
+0:32              Constant:
+0:32                1 (const int)
+0:32              Constant:
+0:32                2 (const int)
+0:34      move second child to first child ( temp 4-component vector of uint)
+0:34        u: direct index for structure ( temp 4-component vector of uint)
+0:34          indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:34            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:34              'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:34              Constant:
+0:34                0 (const uint)
+0:34            direct index ( temp uint)
+0:34              'dti' ( in 3-component vector of uint)
+0:34              Constant:
+0:34                0 (const int)
+0:34          Constant:
+0:34            0 (const int)
+0:34        subgroupBroadcastFirst ( temp 4-component vector of uint)
+0:34          u: direct index for structure ( temp 4-component vector of uint)
+0:34            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:34              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:34                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:34                Constant:
+0:34                  0 (const uint)
+0:34              direct index ( temp uint)
+0:34                'dti' ( in 3-component vector of uint)
+0:34                Constant:
+0:34                  0 (const int)
+0:34            Constant:
+0:34              0 (const int)
+0:35      move second child to first child ( temp uint)
+0:35        direct index ( temp uint)
+0:35          u: direct index for structure ( temp 4-component vector of uint)
+0:35            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:35              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:35                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:35                Constant:
+0:35                  0 (const uint)
+0:35              direct index ( temp uint)
+0:35                'dti' ( in 3-component vector of uint)
+0:35                Constant:
+0:35                  0 (const int)
+0:35            Constant:
+0:35              0 (const int)
+0:35          Constant:
+0:35            0 (const int)
+0:35        subgroupBroadcastFirst ( temp uint)
+0:35          direct index ( temp uint)
+0:35            u: direct index for structure ( temp 4-component vector of uint)
+0:35              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:35                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:35                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:35                  Constant:
+0:35                    0 (const uint)
+0:35                direct index ( temp uint)
+0:35                  'dti' ( in 3-component vector of uint)
+0:35                  Constant:
+0:35                    0 (const int)
+0:35              Constant:
+0:35                0 (const int)
+0:35            Constant:
+0:35              0 (const int)
+0:36      move second child to first child ( temp 2-component vector of uint)
+0:36        vector swizzle ( temp 2-component vector of uint)
+0:36          u: direct index for structure ( temp 4-component vector of uint)
+0:36            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:36              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:36                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:36                Constant:
+0:36                  0 (const uint)
+0:36              direct index ( temp uint)
+0:36                'dti' ( in 3-component vector of uint)
+0:36                Constant:
+0:36                  0 (const int)
+0:36            Constant:
+0:36              0 (const int)
+0:36          Sequence
+0:36            Constant:
+0:36              0 (const int)
+0:36            Constant:
+0:36              1 (const int)
+0:36        subgroupBroadcastFirst ( temp 2-component vector of uint)
+0:36          vector swizzle ( temp 2-component vector of uint)
+0:36            u: direct index for structure ( temp 4-component vector of uint)
+0:36              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:36                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:36                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:36                  Constant:
+0:36                    0 (const uint)
+0:36                direct index ( temp uint)
+0:36                  'dti' ( in 3-component vector of uint)
+0:36                  Constant:
+0:36                    0 (const int)
+0:36              Constant:
+0:36                0 (const int)
+0:36            Sequence
+0:36              Constant:
+0:36                0 (const int)
+0:36              Constant:
+0:36                1 (const int)
+0:37      move second child to first child ( temp 3-component vector of uint)
+0:37        vector swizzle ( temp 3-component vector of uint)
+0:37          u: direct index for structure ( temp 4-component vector of uint)
+0:37            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:37              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:37                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:37                Constant:
+0:37                  0 (const uint)
+0:37              direct index ( temp uint)
+0:37                'dti' ( in 3-component vector of uint)
+0:37                Constant:
+0:37                  0 (const int)
+0:37            Constant:
+0:37              0 (const int)
+0:37          Sequence
+0:37            Constant:
+0:37              0 (const int)
+0:37            Constant:
+0:37              1 (const int)
+0:37            Constant:
+0:37              2 (const int)
+0:37        subgroupBroadcastFirst ( temp 3-component vector of uint)
+0:37          vector swizzle ( temp 3-component vector of uint)
+0:37            u: direct index for structure ( temp 4-component vector of uint)
+0:37              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:37                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:37                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:37                  Constant:
+0:37                    0 (const uint)
+0:37                direct index ( temp uint)
+0:37                  'dti' ( in 3-component vector of uint)
+0:37                  Constant:
+0:37                    0 (const int)
+0:37              Constant:
+0:37                0 (const int)
+0:37            Sequence
+0:37              Constant:
+0:37                0 (const int)
+0:37              Constant:
+0:37                1 (const int)
+0:37              Constant:
+0:37                2 (const int)
+0:39      move second child to first child ( temp 4-component vector of int)
+0:39        i: direct index for structure ( temp 4-component vector of int)
+0:39          indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:39            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:39              'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:39              Constant:
+0:39                0 (const uint)
+0:39            direct index ( temp uint)
+0:39              'dti' ( in 3-component vector of uint)
+0:39              Constant:
+0:39                0 (const int)
+0:39          Constant:
+0:39            1 (const int)
+0:39        subgroupBroadcastFirst ( temp 4-component vector of int)
+0:39          i: direct index for structure ( temp 4-component vector of int)
+0:39            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:39              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:39                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:39                Constant:
+0:39                  0 (const uint)
+0:39              direct index ( temp uint)
+0:39                'dti' ( in 3-component vector of uint)
+0:39                Constant:
+0:39                  0 (const int)
+0:39            Constant:
+0:39              1 (const int)
+0:40      move second child to first child ( temp int)
+0:40        direct index ( temp int)
+0:40          i: direct index for structure ( temp 4-component vector of int)
+0:40            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:40              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:40                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:40                Constant:
+0:40                  0 (const uint)
+0:40              direct index ( temp uint)
+0:40                'dti' ( in 3-component vector of uint)
+0:40                Constant:
+0:40                  0 (const int)
+0:40            Constant:
+0:40              1 (const int)
+0:40          Constant:
+0:40            0 (const int)
+0:40        subgroupBroadcastFirst ( temp int)
+0:40          direct index ( temp int)
+0:40            i: direct index for structure ( temp 4-component vector of int)
+0:40              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:40                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:40                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:40                  Constant:
+0:40                    0 (const uint)
+0:40                direct index ( temp uint)
+0:40                  'dti' ( in 3-component vector of uint)
+0:40                  Constant:
+0:40                    0 (const int)
+0:40              Constant:
+0:40                1 (const int)
+0:40            Constant:
+0:40              0 (const int)
+0:41      move second child to first child ( temp 2-component vector of int)
+0:41        vector swizzle ( temp 2-component vector of int)
+0:41          i: direct index for structure ( temp 4-component vector of int)
+0:41            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:41              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:41                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:41                Constant:
+0:41                  0 (const uint)
+0:41              direct index ( temp uint)
+0:41                'dti' ( in 3-component vector of uint)
+0:41                Constant:
+0:41                  0 (const int)
+0:41            Constant:
+0:41              1 (const int)
+0:41          Sequence
+0:41            Constant:
+0:41              0 (const int)
+0:41            Constant:
+0:41              1 (const int)
+0:41        subgroupBroadcastFirst ( temp 2-component vector of int)
+0:41          vector swizzle ( temp 2-component vector of int)
+0:41            i: direct index for structure ( temp 4-component vector of int)
+0:41              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:41                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:41                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:41                  Constant:
+0:41                    0 (const uint)
+0:41                direct index ( temp uint)
+0:41                  'dti' ( in 3-component vector of uint)
+0:41                  Constant:
+0:41                    0 (const int)
+0:41              Constant:
+0:41                1 (const int)
+0:41            Sequence
+0:41              Constant:
+0:41                0 (const int)
+0:41              Constant:
+0:41                1 (const int)
+0:42      move second child to first child ( temp 3-component vector of int)
+0:42        vector swizzle ( temp 3-component vector of int)
+0:42          i: direct index for structure ( temp 4-component vector of int)
+0:42            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:42              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:42                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:42                Constant:
+0:42                  0 (const uint)
+0:42              direct index ( temp uint)
+0:42                'dti' ( in 3-component vector of uint)
+0:42                Constant:
+0:42                  0 (const int)
+0:42            Constant:
+0:42              1 (const int)
+0:42          Sequence
+0:42            Constant:
+0:42              0 (const int)
+0:42            Constant:
+0:42              1 (const int)
+0:42            Constant:
+0:42              2 (const int)
+0:42        subgroupBroadcastFirst ( temp 3-component vector of int)
+0:42          vector swizzle ( temp 3-component vector of int)
+0:42            i: direct index for structure ( temp 4-component vector of int)
+0:42              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:42                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:42                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:42                  Constant:
+0:42                    0 (const uint)
+0:42                direct index ( temp uint)
+0:42                  'dti' ( in 3-component vector of uint)
+0:42                  Constant:
+0:42                    0 (const int)
+0:42              Constant:
+0:42                1 (const int)
+0:42            Sequence
+0:42              Constant:
+0:42                0 (const int)
+0:42              Constant:
+0:42                1 (const int)
+0:42              Constant:
+0:42                2 (const int)
+0:44      move second child to first child ( temp 4-component vector of float)
+0:44        f: direct index for structure ( temp 4-component vector of float)
+0:44          indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:44            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:44              'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:44              Constant:
+0:44                0 (const uint)
+0:44            direct index ( temp uint)
+0:44              'dti' ( in 3-component vector of uint)
+0:44              Constant:
+0:44                0 (const int)
+0:44          Constant:
+0:44            2 (const int)
+0:44        subgroupBroadcastFirst ( temp 4-component vector of float)
+0:44          f: direct index for structure ( temp 4-component vector of float)
+0:44            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:44              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:44                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:44                Constant:
+0:44                  0 (const uint)
+0:44              direct index ( temp uint)
+0:44                'dti' ( in 3-component vector of uint)
+0:44                Constant:
+0:44                  0 (const int)
+0:44            Constant:
+0:44              2 (const int)
+0:45      move second child to first child ( temp float)
+0:45        direct index ( temp float)
+0:45          f: direct index for structure ( temp 4-component vector of float)
+0:45            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:45              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:45                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:45                Constant:
+0:45                  0 (const uint)
+0:45              direct index ( temp uint)
+0:45                'dti' ( in 3-component vector of uint)
+0:45                Constant:
+0:45                  0 (const int)
+0:45            Constant:
+0:45              2 (const int)
+0:45          Constant:
+0:45            0 (const int)
+0:45        subgroupBroadcastFirst ( temp float)
+0:45          direct index ( temp float)
+0:45            f: direct index for structure ( temp 4-component vector of float)
+0:45              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:45                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:45                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:45                  Constant:
+0:45                    0 (const uint)
+0:45                direct index ( temp uint)
+0:45                  'dti' ( in 3-component vector of uint)
+0:45                  Constant:
+0:45                    0 (const int)
+0:45              Constant:
+0:45                2 (const int)
+0:45            Constant:
+0:45              0 (const int)
+0:46      move second child to first child ( temp 2-component vector of float)
+0:46        vector swizzle ( temp 2-component vector of float)
+0:46          f: direct index for structure ( temp 4-component vector of float)
+0:46            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:46              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:46                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:46                Constant:
+0:46                  0 (const uint)
+0:46              direct index ( temp uint)
+0:46                'dti' ( in 3-component vector of uint)
+0:46                Constant:
+0:46                  0 (const int)
+0:46            Constant:
+0:46              2 (const int)
+0:46          Sequence
+0:46            Constant:
+0:46              0 (const int)
+0:46            Constant:
+0:46              1 (const int)
+0:46        subgroupBroadcastFirst ( temp 2-component vector of float)
+0:46          vector swizzle ( temp 2-component vector of float)
+0:46            f: direct index for structure ( temp 4-component vector of float)
+0:46              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:46                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:46                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:46                  Constant:
+0:46                    0 (const uint)
+0:46                direct index ( temp uint)
+0:46                  'dti' ( in 3-component vector of uint)
+0:46                  Constant:
+0:46                    0 (const int)
+0:46              Constant:
+0:46                2 (const int)
+0:46            Sequence
+0:46              Constant:
+0:46                0 (const int)
+0:46              Constant:
+0:46                1 (const int)
+0:47      move second child to first child ( temp 3-component vector of float)
+0:47        vector swizzle ( temp 3-component vector of float)
+0:47          f: direct index for structure ( temp 4-component vector of float)
+0:47            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:47              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:47                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:47                Constant:
+0:47                  0 (const uint)
+0:47              direct index ( temp uint)
+0:47                'dti' ( in 3-component vector of uint)
+0:47                Constant:
+0:47                  0 (const int)
+0:47            Constant:
+0:47              2 (const int)
+0:47          Sequence
+0:47            Constant:
+0:47              0 (const int)
+0:47            Constant:
+0:47              1 (const int)
+0:47            Constant:
+0:47              2 (const int)
+0:47        subgroupBroadcastFirst ( temp 3-component vector of float)
+0:47          vector swizzle ( temp 3-component vector of float)
+0:47            f: direct index for structure ( temp 4-component vector of float)
+0:47              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:47                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:47                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:47                  Constant:
+0:47                    0 (const uint)
+0:47                direct index ( temp uint)
+0:47                  'dti' ( in 3-component vector of uint)
+0:47                  Constant:
+0:47                    0 (const int)
+0:47              Constant:
+0:47                2 (const int)
+0:47            Sequence
+0:47              Constant:
+0:47                0 (const int)
+0:47              Constant:
+0:47                1 (const int)
+0:47              Constant:
+0:47                2 (const int)
+0:49      move second child to first child ( temp 4-component vector of double)
+0:49        d: direct index for structure ( temp 4-component vector of double)
+0:49          indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:49            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:49              'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:49              Constant:
+0:49                0 (const uint)
+0:49            direct index ( temp uint)
+0:49              'dti' ( in 3-component vector of uint)
+0:49              Constant:
+0:49                0 (const int)
+0:49          Constant:
+0:49            3 (const int)
+0:49        subgroupBroadcastFirst ( temp 4-component vector of double)
+0:49          d: direct index for structure ( temp 4-component vector of double)
+0:49            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:49              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:49                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:49                Constant:
+0:49                  0 (const uint)
+0:49              direct index ( temp uint)
+0:49                'dti' ( in 3-component vector of uint)
+0:49                Constant:
+0:49                  0 (const int)
+0:49            Constant:
+0:49              3 (const int)
+0:50      move second child to first child ( temp double)
+0:50        direct index ( temp double)
+0:50          d: direct index for structure ( temp 4-component vector of double)
+0:50            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:50              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:50                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:50                Constant:
+0:50                  0 (const uint)
+0:50              direct index ( temp uint)
+0:50                'dti' ( in 3-component vector of uint)
+0:50                Constant:
+0:50                  0 (const int)
+0:50            Constant:
+0:50              3 (const int)
+0:50          Constant:
+0:50            0 (const int)
+0:50        subgroupBroadcastFirst ( temp double)
+0:50          direct index ( temp double)
+0:50            d: direct index for structure ( temp 4-component vector of double)
+0:50              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:50                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:50                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:50                  Constant:
+0:50                    0 (const uint)
+0:50                direct index ( temp uint)
+0:50                  'dti' ( in 3-component vector of uint)
+0:50                  Constant:
+0:50                    0 (const int)
+0:50              Constant:
+0:50                3 (const int)
+0:50            Constant:
+0:50              0 (const int)
+0:51      move second child to first child ( temp 2-component vector of double)
+0:51        vector swizzle ( temp 2-component vector of double)
+0:51          d: direct index for structure ( temp 4-component vector of double)
+0:51            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:51              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:51                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:51                Constant:
+0:51                  0 (const uint)
+0:51              direct index ( temp uint)
+0:51                'dti' ( in 3-component vector of uint)
+0:51                Constant:
+0:51                  0 (const int)
+0:51            Constant:
+0:51              3 (const int)
+0:51          Sequence
+0:51            Constant:
+0:51              0 (const int)
+0:51            Constant:
+0:51              1 (const int)
+0:51        subgroupBroadcastFirst ( temp 2-component vector of double)
+0:51          vector swizzle ( temp 2-component vector of double)
+0:51            d: direct index for structure ( temp 4-component vector of double)
+0:51              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:51                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:51                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:51                  Constant:
+0:51                    0 (const uint)
+0:51                direct index ( temp uint)
+0:51                  'dti' ( in 3-component vector of uint)
+0:51                  Constant:
+0:51                    0 (const int)
+0:51              Constant:
+0:51                3 (const int)
+0:51            Sequence
+0:51              Constant:
+0:51                0 (const int)
+0:51              Constant:
+0:51                1 (const int)
+0:52      move second child to first child ( temp 3-component vector of double)
+0:52        vector swizzle ( temp 3-component vector of double)
+0:52          d: direct index for structure ( temp 4-component vector of double)
+0:52            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:52              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:52                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:52                Constant:
+0:52                  0 (const uint)
+0:52              direct index ( temp uint)
+0:52                'dti' ( in 3-component vector of uint)
+0:52                Constant:
+0:52                  0 (const int)
+0:52            Constant:
+0:52              3 (const int)
+0:52          Sequence
+0:52            Constant:
+0:52              0 (const int)
+0:52            Constant:
+0:52              1 (const int)
+0:52            Constant:
+0:52              2 (const int)
+0:52        subgroupBroadcastFirst ( temp 3-component vector of double)
+0:52          vector swizzle ( temp 3-component vector of double)
+0:52            d: direct index for structure ( temp 4-component vector of double)
+0:52              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:52                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:52                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:52                  Constant:
+0:52                    0 (const uint)
+0:52                direct index ( temp uint)
+0:52                  'dti' ( in 3-component vector of uint)
+0:52                  Constant:
+0:52                    0 (const int)
+0:52              Constant:
+0:52                3 (const int)
+0:52            Sequence
+0:52              Constant:
+0:52                0 (const int)
+0:52              Constant:
+0:52                1 (const int)
+0:52              Constant:
+0:52                2 (const int)
+0:13  Function Definition: CSMain( ( temp void)
+0:13    Function Parameters: 
+0:?     Sequence
+0:13      move second child to first child ( temp 3-component vector of uint)
+0:?         'dti' ( temp 3-component vector of uint)
+0:?         'dti' ( in 3-component vector of uint GlobalInvocationID)
+0:13      Function Call: @CSMain(vu3; ( temp void)
+0:?         'dti' ( temp 3-component vector of uint)
+0:?   Linker Objects
+0:?     'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:?     'dti' ( in 3-component vector of uint GlobalInvocationID)
+
+// Module Version 10300
+// Generated by (magic number): 80007
+// Id's are bound by 359
+
+                              Capability Shader
+                              Capability Float64
+                              Capability GroupNonUniform
+                              Capability GroupNonUniformBallot
+                              Capability GroupNonUniformShuffle
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint GLCompute 4  "CSMain" 354
+                              ExecutionMode 4 LocalSize 32 16 1
+                              Source HLSL 500
+                              Name 4  "CSMain"
+                              Name 11  "@CSMain(vu3;"
+                              Name 10  "dti"
+                              Name 20  "Types"
+                              MemberName 20(Types) 0  "u"
+                              MemberName 20(Types) 1  "i"
+                              MemberName 20(Types) 2  "f"
+                              MemberName 20(Types) 3  "d"
+                              Name 22  "data"
+                              MemberName 22(data) 0  "@data"
+                              Name 24  "data"
+                              Name 352  "dti"
+                              Name 354  "dti"
+                              Name 356  "param"
+                              MemberDecorate 20(Types) 0 Offset 0
+                              MemberDecorate 20(Types) 1 Offset 16
+                              MemberDecorate 20(Types) 2 Offset 32
+                              MemberDecorate 20(Types) 3 Offset 64
+                              Decorate 21 ArrayStride 96
+                              MemberDecorate 22(data) 0 Offset 0
+                              Decorate 22(data) BufferBlock
+                              Decorate 24(data) DescriptorSet 0
+                              Decorate 354(dti) BuiltIn GlobalInvocationId
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeInt 32 0
+               7:             TypeVector 6(int) 3
+               8:             TypePointer Function 7(ivec3)
+               9:             TypeFunction 2 8(ptr)
+              13:             TypeVector 6(int) 4
+              14:             TypeInt 32 1
+              15:             TypeVector 14(int) 4
+              16:             TypeFloat 32
+              17:             TypeVector 16(float) 4
+              18:             TypeFloat 64
+              19:             TypeVector 18(float64_t) 4
+       20(Types):             TypeStruct 13(ivec4) 15(ivec4) 17(fvec4) 19(f64vec4)
+              21:             TypeRuntimeArray 20(Types)
+        22(data):             TypeStruct 21
+              23:             TypePointer Uniform 22(data)
+        24(data):     23(ptr) Variable Uniform
+              25:     14(int) Constant 0
+              26:      6(int) Constant 0
+              27:             TypePointer Function 6(int)
+              32:             TypePointer Uniform 13(ivec4)
+              35:      6(int) Constant 13
+              36:      6(int) Constant 3
+              43:             TypePointer Uniform 6(int)
+              52:             TypeVector 6(int) 2
+              73:     14(int) Constant 1
+              76:             TypePointer Uniform 15(ivec4)
+              85:             TypePointer Uniform 14(int)
+              94:             TypeVector 14(int) 2
+             106:             TypeVector 14(int) 3
+             116:     14(int) Constant 2
+             119:             TypePointer Uniform 17(fvec4)
+             128:             TypePointer Uniform 16(float)
+             137:             TypeVector 16(float) 2
+             149:             TypeVector 16(float) 3
+             159:     14(int) Constant 3
+             162:             TypePointer Uniform 19(f64vec4)
+             171:             TypePointer Uniform 18(float64_t)
+             180:             TypeVector 18(float64_t) 2
+             192:             TypeVector 18(float64_t) 3
+             353:             TypePointer Input 7(ivec3)
+        354(dti):    353(ptr) Variable Input
+       4(CSMain):           2 Function None 3
+               5:             Label
+        352(dti):      8(ptr) Variable Function
+      356(param):      8(ptr) Variable Function
+             355:    7(ivec3) Load 354(dti)
+                              Store 352(dti) 355
+             357:    7(ivec3) Load 352(dti)
+                              Store 356(param) 357
+             358:           2 FunctionCall 11(@CSMain(vu3;) 356(param)
+                              Return
+                              FunctionEnd
+11(@CSMain(vu3;):           2 Function None 9
+         10(dti):      8(ptr) FunctionParameter
+              12:             Label
+              28:     27(ptr) AccessChain 10(dti) 26
+              29:      6(int) Load 28
+              30:     27(ptr) AccessChain 10(dti) 26
+              31:      6(int) Load 30
+              33:     32(ptr) AccessChain 24(data) 25 31 25
+              34:   13(ivec4) Load 33
+              37:   13(ivec4) GroupNonUniformShuffle 36 34 35
+              38:     32(ptr) AccessChain 24(data) 25 29 25
+                              Store 38 37
+              39:     27(ptr) AccessChain 10(dti) 26
+              40:      6(int) Load 39
+              41:     27(ptr) AccessChain 10(dti) 26
+              42:      6(int) Load 41
+              44:     43(ptr) AccessChain 24(data) 25 42 25 26
+              45:      6(int) Load 44
+              46:      6(int) GroupNonUniformShuffle 36 45 35
+              47:     43(ptr) AccessChain 24(data) 25 40 25 26
+                              Store 47 46
+              48:     27(ptr) AccessChain 10(dti) 26
+              49:      6(int) Load 48
+              50:     27(ptr) AccessChain 10(dti) 26
+              51:      6(int) Load 50
+              53:     32(ptr) AccessChain 24(data) 25 51 25
+              54:   13(ivec4) Load 53
+              55:   52(ivec2) VectorShuffle 54 54 0 1
+              56:   52(ivec2) GroupNonUniformShuffle 36 55 35
+              57:     32(ptr) AccessChain 24(data) 25 49 25
+              58:   13(ivec4) Load 57
+              59:   13(ivec4) VectorShuffle 58 56 4 5 2 3
+                              Store 57 59
+              60:     27(ptr) AccessChain 10(dti) 26
+              61:      6(int) Load 60
+              62:     27(ptr) AccessChain 10(dti) 26
+              63:      6(int) Load 62
+              64:     32(ptr) AccessChain 24(data) 25 63 25
+              65:   13(ivec4) Load 64
+              66:    7(ivec3) VectorShuffle 65 65 0 1 2
+              67:    7(ivec3) GroupNonUniformShuffle 36 66 35
+              68:     32(ptr) AccessChain 24(data) 25 61 25
+              69:   13(ivec4) Load 68
+              70:   13(ivec4) VectorShuffle 69 67 4 5 6 3
+                              Store 68 70
+              71:     27(ptr) AccessChain 10(dti) 26
+              72:      6(int) Load 71
+              74:     27(ptr) AccessChain 10(dti) 26
+              75:      6(int) Load 74
+              77:     76(ptr) AccessChain 24(data) 25 75 73
+              78:   15(ivec4) Load 77
+              79:   15(ivec4) GroupNonUniformShuffle 36 78 35
+              80:     76(ptr) AccessChain 24(data) 25 72 73
+                              Store 80 79
+              81:     27(ptr) AccessChain 10(dti) 26
+              82:      6(int) Load 81
+              83:     27(ptr) AccessChain 10(dti) 26
+              84:      6(int) Load 83
+              86:     85(ptr) AccessChain 24(data) 25 84 73 26
+              87:     14(int) Load 86
+              88:     14(int) GroupNonUniformShuffle 36 87 35
+              89:     85(ptr) AccessChain 24(data) 25 82 73 26
+                              Store 89 88
+              90:     27(ptr) AccessChain 10(dti) 26
+              91:      6(int) Load 90
+              92:     27(ptr) AccessChain 10(dti) 26
+              93:      6(int) Load 92
+              95:     76(ptr) AccessChain 24(data) 25 93 73
+              96:   15(ivec4) Load 95
+              97:   94(ivec2) VectorShuffle 96 96 0 1
+              98:   94(ivec2) GroupNonUniformShuffle 36 97 35
+              99:     76(ptr) AccessChain 24(data) 25 91 73
+             100:   15(ivec4) Load 99
+             101:   15(ivec4) VectorShuffle 100 98 4 5 2 3
+                              Store 99 101
+             102:     27(ptr) AccessChain 10(dti) 26
+             103:      6(int) Load 102
+             104:     27(ptr) AccessChain 10(dti) 26
+             105:      6(int) Load 104
+             107:     76(ptr) AccessChain 24(data) 25 105 73
+             108:   15(ivec4) Load 107
+             109:  106(ivec3) VectorShuffle 108 108 0 1 2
+             110:  106(ivec3) GroupNonUniformShuffle 36 109 35
+             111:     76(ptr) AccessChain 24(data) 25 103 73
+             112:   15(ivec4) Load 111
+             113:   15(ivec4) VectorShuffle 112 110 4 5 6 3
+                              Store 111 113
+             114:     27(ptr) AccessChain 10(dti) 26
+             115:      6(int) Load 114
+             117:     27(ptr) AccessChain 10(dti) 26
+             118:      6(int) Load 117
+             120:    119(ptr) AccessChain 24(data) 25 118 116
+             121:   17(fvec4) Load 120
+             122:   17(fvec4) GroupNonUniformShuffle 36 121 35
+             123:    119(ptr) AccessChain 24(data) 25 115 116
+                              Store 123 122
+             124:     27(ptr) AccessChain 10(dti) 26
+             125:      6(int) Load 124
+             126:     27(ptr) AccessChain 10(dti) 26
+             127:      6(int) Load 126
+             129:    128(ptr) AccessChain 24(data) 25 127 116 26
+             130:   16(float) Load 129
+             131:   16(float) GroupNonUniformShuffle 36 130 35
+             132:    128(ptr) AccessChain 24(data) 25 125 116 26
+                              Store 132 131
+             133:     27(ptr) AccessChain 10(dti) 26
+             134:      6(int) Load 133
+             135:     27(ptr) AccessChain 10(dti) 26
+             136:      6(int) Load 135
+             138:    119(ptr) AccessChain 24(data) 25 136 116
+             139:   17(fvec4) Load 138
+             140:  137(fvec2) VectorShuffle 139 139 0 1
+             141:  137(fvec2) GroupNonUniformShuffle 36 140 35
+             142:    119(ptr) AccessChain 24(data) 25 134 116
+             143:   17(fvec4) Load 142
+             144:   17(fvec4) VectorShuffle 143 141 4 5 2 3
+                              Store 142 144
+             145:     27(ptr) AccessChain 10(dti) 26
+             146:      6(int) Load 145
+             147:     27(ptr) AccessChain 10(dti) 26
+             148:      6(int) Load 147
+             150:    119(ptr) AccessChain 24(data) 25 148 116
+             151:   17(fvec4) Load 150
+             152:  149(fvec3) VectorShuffle 151 151 0 1 2
+             153:  149(fvec3) GroupNonUniformShuffle 36 152 35
+             154:    119(ptr) AccessChain 24(data) 25 146 116
+             155:   17(fvec4) Load 154
+             156:   17(fvec4) VectorShuffle 155 153 4 5 6 3
+                              Store 154 156
+             157:     27(ptr) AccessChain 10(dti) 26
+             158:      6(int) Load 157
+             160:     27(ptr) AccessChain 10(dti) 26
+             161:      6(int) Load 160
+             163:    162(ptr) AccessChain 24(data) 25 161 159
+             164: 19(f64vec4) Load 163
+             165: 19(f64vec4) GroupNonUniformBroadcastFirst 36 164
+             166:    162(ptr) AccessChain 24(data) 25 158 159
+                              Store 166 165
+             167:     27(ptr) AccessChain 10(dti) 26
+             168:      6(int) Load 167
+             169:     27(ptr) AccessChain 10(dti) 26
+             170:      6(int) Load 169
+             172:    171(ptr) AccessChain 24(data) 25 170 159 26
+             173:18(float64_t) Load 172
+             174:18(float64_t) GroupNonUniformBroadcastFirst 36 173
+             175:    171(ptr) AccessChain 24(data) 25 168 159 26
+                              Store 175 174
+             176:     27(ptr) AccessChain 10(dti) 26
+             177:      6(int) Load 176
+             178:     27(ptr) AccessChain 10(dti) 26
+             179:      6(int) Load 178
+             181:    162(ptr) AccessChain 24(data) 25 179 159
+             182: 19(f64vec4) Load 181
+             183:180(f64vec2) VectorShuffle 182 182 0 1
+             184:180(f64vec2) GroupNonUniformBroadcastFirst 36 183
+             185:    162(ptr) AccessChain 24(data) 25 177 159
+             186: 19(f64vec4) Load 185
+             187: 19(f64vec4) VectorShuffle 186 184 4 5 2 3
+                              Store 185 187
+             188:     27(ptr) AccessChain 10(dti) 26
+             189:      6(int) Load 188
+             190:     27(ptr) AccessChain 10(dti) 26
+             191:      6(int) Load 190
+             193:    162(ptr) AccessChain 24(data) 25 191 159
+             194: 19(f64vec4) Load 193
+             195:192(f64vec3) VectorShuffle 194 194 0 1 2
+             196:192(f64vec3) GroupNonUniformBroadcastFirst 36 195
+             197:    162(ptr) AccessChain 24(data) 25 189 159
+             198: 19(f64vec4) Load 197
+             199: 19(f64vec4) VectorShuffle 198 196 4 5 6 3
+                              Store 197 199
+             200:     27(ptr) AccessChain 10(dti) 26
+             201:      6(int) Load 200
+             202:     27(ptr) AccessChain 10(dti) 26
+             203:      6(int) Load 202
+             204:     32(ptr) AccessChain 24(data) 25 203 25
+             205:   13(ivec4) Load 204
+             206:   13(ivec4) GroupNonUniformBroadcastFirst 36 205
+             207:     32(ptr) AccessChain 24(data) 25 201 25
+                              Store 207 206
+             208:     27(ptr) AccessChain 10(dti) 26
+             209:      6(int) Load 208
+             210:     27(ptr) AccessChain 10(dti) 26
+             211:      6(int) Load 210
+             212:     43(ptr) AccessChain 24(data) 25 211 25 26
+             213:      6(int) Load 212
+             214:      6(int) GroupNonUniformBroadcastFirst 36 213
+             215:     43(ptr) AccessChain 24(data) 25 209 25 26
+                              Store 215 214
+             216:     27(ptr) AccessChain 10(dti) 26
+             217:      6(int) Load 216
+             218:     27(ptr) AccessChain 10(dti) 26
+             219:      6(int) Load 218
+             220:     32(ptr) AccessChain 24(data) 25 219 25
+             221:   13(ivec4) Load 220
+             222:   52(ivec2) VectorShuffle 221 221 0 1
+             223:   52(ivec2) GroupNonUniformBroadcastFirst 36 222
+             224:     32(ptr) AccessChain 24(data) 25 217 25
+             225:   13(ivec4) Load 224
+             226:   13(ivec4) VectorShuffle 225 223 4 5 2 3
+                              Store 224 226
+             227:     27(ptr) AccessChain 10(dti) 26
+             228:      6(int) Load 227
+             229:     27(ptr) AccessChain 10(dti) 26
+             230:      6(int) Load 229
+             231:     32(ptr) AccessChain 24(data) 25 230 25
+             232:   13(ivec4) Load 231
+             233:    7(ivec3) VectorShuffle 232 232 0 1 2
+             234:    7(ivec3) GroupNonUniformBroadcastFirst 36 233
+             235:     32(ptr) AccessChain 24(data) 25 228 25
+             236:   13(ivec4) Load 235
+             237:   13(ivec4) VectorShuffle 236 234 4 5 6 3
+                              Store 235 237
+             238:     27(ptr) AccessChain 10(dti) 26
+             239:      6(int) Load 238
+             240:     27(ptr) AccessChain 10(dti) 26
+             241:      6(int) Load 240
+             242:     76(ptr) AccessChain 24(data) 25 241 73
+             243:   15(ivec4) Load 242
+             244:   15(ivec4) GroupNonUniformBroadcastFirst 36 243
+             245:     76(ptr) AccessChain 24(data) 25 239 73
+                              Store 245 244
+             246:     27(ptr) AccessChain 10(dti) 26
+             247:      6(int) Load 246
+             248:     27(ptr) AccessChain 10(dti) 26
+             249:      6(int) Load 248
+             250:     85(ptr) AccessChain 24(data) 25 249 73 26
+             251:     14(int) Load 250
+             252:     14(int) GroupNonUniformBroadcastFirst 36 251
+             253:     85(ptr) AccessChain 24(data) 25 247 73 26
+                              Store 253 252
+             254:     27(ptr) AccessChain 10(dti) 26
+             255:      6(int) Load 254
+             256:     27(ptr) AccessChain 10(dti) 26
+             257:      6(int) Load 256
+             258:     76(ptr) AccessChain 24(data) 25 257 73
+             259:   15(ivec4) Load 258
+             260:   94(ivec2) VectorShuffle 259 259 0 1
+             261:   94(ivec2) GroupNonUniformBroadcastFirst 36 260
+             262:     76(ptr) AccessChain 24(data) 25 255 73
+             263:   15(ivec4) Load 262
+             264:   15(ivec4) VectorShuffle 263 261 4 5 2 3
+                              Store 262 264
+             265:     27(ptr) AccessChain 10(dti) 26
+             266:      6(int) Load 265
+             267:     27(ptr) AccessChain 10(dti) 26
+             268:      6(int) Load 267
+             269:     76(ptr) AccessChain 24(data) 25 268 73
+             270:   15(ivec4) Load 269
+             271:  106(ivec3) VectorShuffle 270 270 0 1 2
+             272:  106(ivec3) GroupNonUniformBroadcastFirst 36 271
+             273:     76(ptr) AccessChain 24(data) 25 266 73
+             274:   15(ivec4) Load 273
+             275:   15(ivec4) VectorShuffle 274 272 4 5 6 3
+                              Store 273 275
+             276:     27(ptr) AccessChain 10(dti) 26
+             277:      6(int) Load 276
+             278:     27(ptr) AccessChain 10(dti) 26
+             279:      6(int) Load 278
+             280:    119(ptr) AccessChain 24(data) 25 279 116
+             281:   17(fvec4) Load 280
+             282:   17(fvec4) GroupNonUniformBroadcastFirst 36 281
+             283:    119(ptr) AccessChain 24(data) 25 277 116
+                              Store 283 282
+             284:     27(ptr) AccessChain 10(dti) 26
+             285:      6(int) Load 284
+             286:     27(ptr) AccessChain 10(dti) 26
+             287:      6(int) Load 286
+             288:    128(ptr) AccessChain 24(data) 25 287 116 26
+             289:   16(float) Load 288
+             290:   16(float) GroupNonUniformBroadcastFirst 36 289
+             291:    128(ptr) AccessChain 24(data) 25 285 116 26
+                              Store 291 290
+             292:     27(ptr) AccessChain 10(dti) 26
+             293:      6(int) Load 292
+             294:     27(ptr) AccessChain 10(dti) 26
+             295:      6(int) Load 294
+             296:    119(ptr) AccessChain 24(data) 25 295 116
+             297:   17(fvec4) Load 296
+             298:  137(fvec2) VectorShuffle 297 297 0 1
+             299:  137(fvec2) GroupNonUniformBroadcastFirst 36 298
+             300:    119(ptr) AccessChain 24(data) 25 293 116
+             301:   17(fvec4) Load 300
+             302:   17(fvec4) VectorShuffle 301 299 4 5 2 3
+                              Store 300 302
+             303:     27(ptr) AccessChain 10(dti) 26
+             304:      6(int) Load 303
+             305:     27(ptr) AccessChain 10(dti) 26
+             306:      6(int) Load 305
+             307:    119(ptr) AccessChain 24(data) 25 306 116
+             308:   17(fvec4) Load 307
+             309:  149(fvec3) VectorShuffle 308 308 0 1 2
+             310:  149(fvec3) GroupNonUniformBroadcastFirst 36 309
+             311:    119(ptr) AccessChain 24(data) 25 304 116
+             312:   17(fvec4) Load 311
+             313:   17(fvec4) VectorShuffle 312 310 4 5 6 3
+                              Store 311 313
+             314:     27(ptr) AccessChain 10(dti) 26
+             315:      6(int) Load 314
+             316:     27(ptr) AccessChain 10(dti) 26
+             317:      6(int) Load 316
+             318:    162(ptr) AccessChain 24(data) 25 317 159
+             319: 19(f64vec4) Load 318
+             320: 19(f64vec4) GroupNonUniformBroadcastFirst 36 319
+             321:    162(ptr) AccessChain 24(data) 25 315 159
+                              Store 321 320
+             322:     27(ptr) AccessChain 10(dti) 26
+             323:      6(int) Load 322
+             324:     27(ptr) AccessChain 10(dti) 26
+             325:      6(int) Load 324
+             326:    171(ptr) AccessChain 24(data) 25 325 159 26
+             327:18(float64_t) Load 326
+             328:18(float64_t) GroupNonUniformBroadcastFirst 36 327
+             329:    171(ptr) AccessChain 24(data) 25 323 159 26
+                              Store 329 328
+             330:     27(ptr) AccessChain 10(dti) 26
+             331:      6(int) Load 330
+             332:     27(ptr) AccessChain 10(dti) 26
+             333:      6(int) Load 332
+             334:    162(ptr) AccessChain 24(data) 25 333 159
+             335: 19(f64vec4) Load 334
+             336:180(f64vec2) VectorShuffle 335 335 0 1
+             337:180(f64vec2) GroupNonUniformBroadcastFirst 36 336
+             338:    162(ptr) AccessChain 24(data) 25 331 159
+             339: 19(f64vec4) Load 338
+             340: 19(f64vec4) VectorShuffle 339 337 4 5 2 3
+                              Store 338 340
+             341:     27(ptr) AccessChain 10(dti) 26
+             342:      6(int) Load 341
+             343:     27(ptr) AccessChain 10(dti) 26
+             344:      6(int) Load 343
+             345:    162(ptr) AccessChain 24(data) 25 344 159
+             346: 19(f64vec4) Load 345
+             347:192(f64vec3) VectorShuffle 346 346 0 1 2
+             348:192(f64vec3) GroupNonUniformBroadcastFirst 36 347
+             349:    162(ptr) AccessChain 24(data) 25 342 159
+             350: 19(f64vec4) Load 349
+             351: 19(f64vec4) VectorShuffle 350 348 4 5 6 3
+                              Store 349 351
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/hlsl.waveprefix.comp.out b/Test/baseResults/hlsl.waveprefix.comp.out
new file mode 100644
index 0000000..9736b4e
--- /dev/null
+++ b/Test/baseResults/hlsl.waveprefix.comp.out
@@ -0,0 +1,2766 @@
+hlsl.waveprefix.comp
+Shader version: 500
+local_size = (32, 16, 1)
+0:? Sequence
+0:13  Function Definition: @CSMain(vu3; ( temp void)
+0:13    Function Parameters: 
+0:13      'dti' ( in 3-component vector of uint)
+0:?     Sequence
+0:14      move second child to first child ( temp 4-component vector of uint)
+0:14        u: direct index for structure ( temp 4-component vector of uint)
+0:14          indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:14            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:14              'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:14              Constant:
+0:14                0 (const uint)
+0:14            direct index ( temp uint)
+0:14              'dti' ( in 3-component vector of uint)
+0:14              Constant:
+0:14                0 (const int)
+0:14          Constant:
+0:14            0 (const int)
+0:14        subgroupInclusiveAdd ( temp 4-component vector of uint)
+0:14          u: direct index for structure ( temp 4-component vector of uint)
+0:14            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:14              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:14                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:14                Constant:
+0:14                  0 (const uint)
+0:14              direct index ( temp uint)
+0:14                'dti' ( in 3-component vector of uint)
+0:14                Constant:
+0:14                  0 (const int)
+0:14            Constant:
+0:14              0 (const int)
+0:15      move second child to first child ( temp uint)
+0:15        direct index ( temp uint)
+0:15          u: direct index for structure ( temp 4-component vector of uint)
+0:15            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:15              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:15                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:15                Constant:
+0:15                  0 (const uint)
+0:15              direct index ( temp uint)
+0:15                'dti' ( in 3-component vector of uint)
+0:15                Constant:
+0:15                  0 (const int)
+0:15            Constant:
+0:15              0 (const int)
+0:15          Constant:
+0:15            0 (const int)
+0:15        subgroupInclusiveAdd ( temp uint)
+0:15          direct index ( temp uint)
+0:15            u: direct index for structure ( temp 4-component vector of uint)
+0:15              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:15                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:15                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:15                  Constant:
+0:15                    0 (const uint)
+0:15                direct index ( temp uint)
+0:15                  'dti' ( in 3-component vector of uint)
+0:15                  Constant:
+0:15                    0 (const int)
+0:15              Constant:
+0:15                0 (const int)
+0:15            Constant:
+0:15              0 (const int)
+0:16      move second child to first child ( temp 2-component vector of uint)
+0:16        vector swizzle ( temp 2-component vector of uint)
+0:16          u: direct index for structure ( temp 4-component vector of uint)
+0:16            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:16              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:16                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:16                Constant:
+0:16                  0 (const uint)
+0:16              direct index ( temp uint)
+0:16                'dti' ( in 3-component vector of uint)
+0:16                Constant:
+0:16                  0 (const int)
+0:16            Constant:
+0:16              0 (const int)
+0:16          Sequence
+0:16            Constant:
+0:16              0 (const int)
+0:16            Constant:
+0:16              1 (const int)
+0:16        subgroupInclusiveAdd ( temp 2-component vector of uint)
+0:16          vector swizzle ( temp 2-component vector of uint)
+0:16            u: direct index for structure ( temp 4-component vector of uint)
+0:16              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:16                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:16                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:16                  Constant:
+0:16                    0 (const uint)
+0:16                direct index ( temp uint)
+0:16                  'dti' ( in 3-component vector of uint)
+0:16                  Constant:
+0:16                    0 (const int)
+0:16              Constant:
+0:16                0 (const int)
+0:16            Sequence
+0:16              Constant:
+0:16                0 (const int)
+0:16              Constant:
+0:16                1 (const int)
+0:17      move second child to first child ( temp 3-component vector of uint)
+0:17        vector swizzle ( temp 3-component vector of uint)
+0:17          u: direct index for structure ( temp 4-component vector of uint)
+0:17            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:17              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:17                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:17                Constant:
+0:17                  0 (const uint)
+0:17              direct index ( temp uint)
+0:17                'dti' ( in 3-component vector of uint)
+0:17                Constant:
+0:17                  0 (const int)
+0:17            Constant:
+0:17              0 (const int)
+0:17          Sequence
+0:17            Constant:
+0:17              0 (const int)
+0:17            Constant:
+0:17              1 (const int)
+0:17            Constant:
+0:17              2 (const int)
+0:17        subgroupInclusiveAdd ( temp 3-component vector of uint)
+0:17          vector swizzle ( temp 3-component vector of uint)
+0:17            u: direct index for structure ( temp 4-component vector of uint)
+0:17              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:17                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:17                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:17                  Constant:
+0:17                    0 (const uint)
+0:17                direct index ( temp uint)
+0:17                  'dti' ( in 3-component vector of uint)
+0:17                  Constant:
+0:17                    0 (const int)
+0:17              Constant:
+0:17                0 (const int)
+0:17            Sequence
+0:17              Constant:
+0:17                0 (const int)
+0:17              Constant:
+0:17                1 (const int)
+0:17              Constant:
+0:17                2 (const int)
+0:19      move second child to first child ( temp 4-component vector of int)
+0:19        i: direct index for structure ( temp 4-component vector of int)
+0:19          indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:19            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:19              'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:19              Constant:
+0:19                0 (const uint)
+0:19            direct index ( temp uint)
+0:19              'dti' ( in 3-component vector of uint)
+0:19              Constant:
+0:19                0 (const int)
+0:19          Constant:
+0:19            1 (const int)
+0:19        subgroupInclusiveAdd ( temp 4-component vector of int)
+0:19          i: direct index for structure ( temp 4-component vector of int)
+0:19            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:19              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:19                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:19                Constant:
+0:19                  0 (const uint)
+0:19              direct index ( temp uint)
+0:19                'dti' ( in 3-component vector of uint)
+0:19                Constant:
+0:19                  0 (const int)
+0:19            Constant:
+0:19              1 (const int)
+0:20      move second child to first child ( temp int)
+0:20        direct index ( temp int)
+0:20          i: direct index for structure ( temp 4-component vector of int)
+0:20            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:20              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:20                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:20                Constant:
+0:20                  0 (const uint)
+0:20              direct index ( temp uint)
+0:20                'dti' ( in 3-component vector of uint)
+0:20                Constant:
+0:20                  0 (const int)
+0:20            Constant:
+0:20              1 (const int)
+0:20          Constant:
+0:20            0 (const int)
+0:20        subgroupInclusiveAdd ( temp int)
+0:20          direct index ( temp int)
+0:20            i: direct index for structure ( temp 4-component vector of int)
+0:20              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:20                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:20                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:20                  Constant:
+0:20                    0 (const uint)
+0:20                direct index ( temp uint)
+0:20                  'dti' ( in 3-component vector of uint)
+0:20                  Constant:
+0:20                    0 (const int)
+0:20              Constant:
+0:20                1 (const int)
+0:20            Constant:
+0:20              0 (const int)
+0:21      move second child to first child ( temp 2-component vector of int)
+0:21        vector swizzle ( temp 2-component vector of int)
+0:21          i: direct index for structure ( temp 4-component vector of int)
+0:21            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:21              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:21                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:21                Constant:
+0:21                  0 (const uint)
+0:21              direct index ( temp uint)
+0:21                'dti' ( in 3-component vector of uint)
+0:21                Constant:
+0:21                  0 (const int)
+0:21            Constant:
+0:21              1 (const int)
+0:21          Sequence
+0:21            Constant:
+0:21              0 (const int)
+0:21            Constant:
+0:21              1 (const int)
+0:21        subgroupInclusiveAdd ( temp 2-component vector of int)
+0:21          vector swizzle ( temp 2-component vector of int)
+0:21            i: direct index for structure ( temp 4-component vector of int)
+0:21              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:21                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:21                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:21                  Constant:
+0:21                    0 (const uint)
+0:21                direct index ( temp uint)
+0:21                  'dti' ( in 3-component vector of uint)
+0:21                  Constant:
+0:21                    0 (const int)
+0:21              Constant:
+0:21                1 (const int)
+0:21            Sequence
+0:21              Constant:
+0:21                0 (const int)
+0:21              Constant:
+0:21                1 (const int)
+0:22      move second child to first child ( temp 3-component vector of int)
+0:22        vector swizzle ( temp 3-component vector of int)
+0:22          i: direct index for structure ( temp 4-component vector of int)
+0:22            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:22              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:22                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:22                Constant:
+0:22                  0 (const uint)
+0:22              direct index ( temp uint)
+0:22                'dti' ( in 3-component vector of uint)
+0:22                Constant:
+0:22                  0 (const int)
+0:22            Constant:
+0:22              1 (const int)
+0:22          Sequence
+0:22            Constant:
+0:22              0 (const int)
+0:22            Constant:
+0:22              1 (const int)
+0:22            Constant:
+0:22              2 (const int)
+0:22        subgroupInclusiveAdd ( temp 3-component vector of int)
+0:22          vector swizzle ( temp 3-component vector of int)
+0:22            i: direct index for structure ( temp 4-component vector of int)
+0:22              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:22                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:22                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:22                  Constant:
+0:22                    0 (const uint)
+0:22                direct index ( temp uint)
+0:22                  'dti' ( in 3-component vector of uint)
+0:22                  Constant:
+0:22                    0 (const int)
+0:22              Constant:
+0:22                1 (const int)
+0:22            Sequence
+0:22              Constant:
+0:22                0 (const int)
+0:22              Constant:
+0:22                1 (const int)
+0:22              Constant:
+0:22                2 (const int)
+0:24      move second child to first child ( temp 4-component vector of float)
+0:24        f: direct index for structure ( temp 4-component vector of float)
+0:24          indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:24            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:24              'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:24              Constant:
+0:24                0 (const uint)
+0:24            direct index ( temp uint)
+0:24              'dti' ( in 3-component vector of uint)
+0:24              Constant:
+0:24                0 (const int)
+0:24          Constant:
+0:24            2 (const int)
+0:24        subgroupInclusiveAdd ( temp 4-component vector of float)
+0:24          f: direct index for structure ( temp 4-component vector of float)
+0:24            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:24              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:24                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:24                Constant:
+0:24                  0 (const uint)
+0:24              direct index ( temp uint)
+0:24                'dti' ( in 3-component vector of uint)
+0:24                Constant:
+0:24                  0 (const int)
+0:24            Constant:
+0:24              2 (const int)
+0:25      move second child to first child ( temp float)
+0:25        direct index ( temp float)
+0:25          f: direct index for structure ( temp 4-component vector of float)
+0:25            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:25              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:25                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:25                Constant:
+0:25                  0 (const uint)
+0:25              direct index ( temp uint)
+0:25                'dti' ( in 3-component vector of uint)
+0:25                Constant:
+0:25                  0 (const int)
+0:25            Constant:
+0:25              2 (const int)
+0:25          Constant:
+0:25            0 (const int)
+0:25        subgroupInclusiveAdd ( temp float)
+0:25          direct index ( temp float)
+0:25            f: direct index for structure ( temp 4-component vector of float)
+0:25              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:25                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:25                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:25                  Constant:
+0:25                    0 (const uint)
+0:25                direct index ( temp uint)
+0:25                  'dti' ( in 3-component vector of uint)
+0:25                  Constant:
+0:25                    0 (const int)
+0:25              Constant:
+0:25                2 (const int)
+0:25            Constant:
+0:25              0 (const int)
+0:26      move second child to first child ( temp 2-component vector of float)
+0:26        vector swizzle ( temp 2-component vector of float)
+0:26          f: direct index for structure ( temp 4-component vector of float)
+0:26            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:26              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:26                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:26                Constant:
+0:26                  0 (const uint)
+0:26              direct index ( temp uint)
+0:26                'dti' ( in 3-component vector of uint)
+0:26                Constant:
+0:26                  0 (const int)
+0:26            Constant:
+0:26              2 (const int)
+0:26          Sequence
+0:26            Constant:
+0:26              0 (const int)
+0:26            Constant:
+0:26              1 (const int)
+0:26        subgroupInclusiveAdd ( temp 2-component vector of float)
+0:26          vector swizzle ( temp 2-component vector of float)
+0:26            f: direct index for structure ( temp 4-component vector of float)
+0:26              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:26                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:26                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:26                  Constant:
+0:26                    0 (const uint)
+0:26                direct index ( temp uint)
+0:26                  'dti' ( in 3-component vector of uint)
+0:26                  Constant:
+0:26                    0 (const int)
+0:26              Constant:
+0:26                2 (const int)
+0:26            Sequence
+0:26              Constant:
+0:26                0 (const int)
+0:26              Constant:
+0:26                1 (const int)
+0:27      move second child to first child ( temp 3-component vector of float)
+0:27        vector swizzle ( temp 3-component vector of float)
+0:27          f: direct index for structure ( temp 4-component vector of float)
+0:27            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:27              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:27                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:27                Constant:
+0:27                  0 (const uint)
+0:27              direct index ( temp uint)
+0:27                'dti' ( in 3-component vector of uint)
+0:27                Constant:
+0:27                  0 (const int)
+0:27            Constant:
+0:27              2 (const int)
+0:27          Sequence
+0:27            Constant:
+0:27              0 (const int)
+0:27            Constant:
+0:27              1 (const int)
+0:27            Constant:
+0:27              2 (const int)
+0:27        subgroupInclusiveAdd ( temp 3-component vector of float)
+0:27          vector swizzle ( temp 3-component vector of float)
+0:27            f: direct index for structure ( temp 4-component vector of float)
+0:27              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:27                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:27                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:27                  Constant:
+0:27                    0 (const uint)
+0:27                direct index ( temp uint)
+0:27                  'dti' ( in 3-component vector of uint)
+0:27                  Constant:
+0:27                    0 (const int)
+0:27              Constant:
+0:27                2 (const int)
+0:27            Sequence
+0:27              Constant:
+0:27                0 (const int)
+0:27              Constant:
+0:27                1 (const int)
+0:27              Constant:
+0:27                2 (const int)
+0:29      move second child to first child ( temp 4-component vector of double)
+0:29        d: direct index for structure ( temp 4-component vector of double)
+0:29          indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:29            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:29              'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:29              Constant:
+0:29                0 (const uint)
+0:29            direct index ( temp uint)
+0:29              'dti' ( in 3-component vector of uint)
+0:29              Constant:
+0:29                0 (const int)
+0:29          Constant:
+0:29            3 (const int)
+0:29        subgroupInclusiveAdd ( temp 4-component vector of double)
+0:29          d: direct index for structure ( temp 4-component vector of double)
+0:29            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:29              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:29                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:29                Constant:
+0:29                  0 (const uint)
+0:29              direct index ( temp uint)
+0:29                'dti' ( in 3-component vector of uint)
+0:29                Constant:
+0:29                  0 (const int)
+0:29            Constant:
+0:29              3 (const int)
+0:30      move second child to first child ( temp double)
+0:30        direct index ( temp double)
+0:30          d: direct index for structure ( temp 4-component vector of double)
+0:30            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:30              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:30                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:30                Constant:
+0:30                  0 (const uint)
+0:30              direct index ( temp uint)
+0:30                'dti' ( in 3-component vector of uint)
+0:30                Constant:
+0:30                  0 (const int)
+0:30            Constant:
+0:30              3 (const int)
+0:30          Constant:
+0:30            0 (const int)
+0:30        subgroupInclusiveAdd ( temp double)
+0:30          direct index ( temp double)
+0:30            d: direct index for structure ( temp 4-component vector of double)
+0:30              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:30                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:30                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:30                  Constant:
+0:30                    0 (const uint)
+0:30                direct index ( temp uint)
+0:30                  'dti' ( in 3-component vector of uint)
+0:30                  Constant:
+0:30                    0 (const int)
+0:30              Constant:
+0:30                3 (const int)
+0:30            Constant:
+0:30              0 (const int)
+0:31      move second child to first child ( temp 2-component vector of double)
+0:31        vector swizzle ( temp 2-component vector of double)
+0:31          d: direct index for structure ( temp 4-component vector of double)
+0:31            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:31              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:31                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:31                Constant:
+0:31                  0 (const uint)
+0:31              direct index ( temp uint)
+0:31                'dti' ( in 3-component vector of uint)
+0:31                Constant:
+0:31                  0 (const int)
+0:31            Constant:
+0:31              3 (const int)
+0:31          Sequence
+0:31            Constant:
+0:31              0 (const int)
+0:31            Constant:
+0:31              1 (const int)
+0:31        subgroupInclusiveAdd ( temp 2-component vector of double)
+0:31          vector swizzle ( temp 2-component vector of double)
+0:31            d: direct index for structure ( temp 4-component vector of double)
+0:31              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:31                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:31                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:31                  Constant:
+0:31                    0 (const uint)
+0:31                direct index ( temp uint)
+0:31                  'dti' ( in 3-component vector of uint)
+0:31                  Constant:
+0:31                    0 (const int)
+0:31              Constant:
+0:31                3 (const int)
+0:31            Sequence
+0:31              Constant:
+0:31                0 (const int)
+0:31              Constant:
+0:31                1 (const int)
+0:32      move second child to first child ( temp 3-component vector of double)
+0:32        vector swizzle ( temp 3-component vector of double)
+0:32          d: direct index for structure ( temp 4-component vector of double)
+0:32            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:32              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:32                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:32                Constant:
+0:32                  0 (const uint)
+0:32              direct index ( temp uint)
+0:32                'dti' ( in 3-component vector of uint)
+0:32                Constant:
+0:32                  0 (const int)
+0:32            Constant:
+0:32              3 (const int)
+0:32          Sequence
+0:32            Constant:
+0:32              0 (const int)
+0:32            Constant:
+0:32              1 (const int)
+0:32            Constant:
+0:32              2 (const int)
+0:32        subgroupInclusiveAdd ( temp 3-component vector of double)
+0:32          vector swizzle ( temp 3-component vector of double)
+0:32            d: direct index for structure ( temp 4-component vector of double)
+0:32              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:32                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:32                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:32                  Constant:
+0:32                    0 (const uint)
+0:32                direct index ( temp uint)
+0:32                  'dti' ( in 3-component vector of uint)
+0:32                  Constant:
+0:32                    0 (const int)
+0:32              Constant:
+0:32                3 (const int)
+0:32            Sequence
+0:32              Constant:
+0:32                0 (const int)
+0:32              Constant:
+0:32                1 (const int)
+0:32              Constant:
+0:32                2 (const int)
+0:34      move second child to first child ( temp 4-component vector of uint)
+0:34        u: direct index for structure ( temp 4-component vector of uint)
+0:34          indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:34            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:34              'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:34              Constant:
+0:34                0 (const uint)
+0:34            direct index ( temp uint)
+0:34              'dti' ( in 3-component vector of uint)
+0:34              Constant:
+0:34                0 (const int)
+0:34          Constant:
+0:34            0 (const int)
+0:34        subgroupInclusiveMul ( temp 4-component vector of uint)
+0:34          u: direct index for structure ( temp 4-component vector of uint)
+0:34            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:34              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:34                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:34                Constant:
+0:34                  0 (const uint)
+0:34              direct index ( temp uint)
+0:34                'dti' ( in 3-component vector of uint)
+0:34                Constant:
+0:34                  0 (const int)
+0:34            Constant:
+0:34              0 (const int)
+0:35      move second child to first child ( temp uint)
+0:35        direct index ( temp uint)
+0:35          u: direct index for structure ( temp 4-component vector of uint)
+0:35            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:35              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:35                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:35                Constant:
+0:35                  0 (const uint)
+0:35              direct index ( temp uint)
+0:35                'dti' ( in 3-component vector of uint)
+0:35                Constant:
+0:35                  0 (const int)
+0:35            Constant:
+0:35              0 (const int)
+0:35          Constant:
+0:35            0 (const int)
+0:35        subgroupInclusiveMul ( temp uint)
+0:35          direct index ( temp uint)
+0:35            u: direct index for structure ( temp 4-component vector of uint)
+0:35              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:35                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:35                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:35                  Constant:
+0:35                    0 (const uint)
+0:35                direct index ( temp uint)
+0:35                  'dti' ( in 3-component vector of uint)
+0:35                  Constant:
+0:35                    0 (const int)
+0:35              Constant:
+0:35                0 (const int)
+0:35            Constant:
+0:35              0 (const int)
+0:36      move second child to first child ( temp 2-component vector of uint)
+0:36        vector swizzle ( temp 2-component vector of uint)
+0:36          u: direct index for structure ( temp 4-component vector of uint)
+0:36            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:36              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:36                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:36                Constant:
+0:36                  0 (const uint)
+0:36              direct index ( temp uint)
+0:36                'dti' ( in 3-component vector of uint)
+0:36                Constant:
+0:36                  0 (const int)
+0:36            Constant:
+0:36              0 (const int)
+0:36          Sequence
+0:36            Constant:
+0:36              0 (const int)
+0:36            Constant:
+0:36              1 (const int)
+0:36        subgroupInclusiveMul ( temp 2-component vector of uint)
+0:36          vector swizzle ( temp 2-component vector of uint)
+0:36            u: direct index for structure ( temp 4-component vector of uint)
+0:36              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:36                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:36                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:36                  Constant:
+0:36                    0 (const uint)
+0:36                direct index ( temp uint)
+0:36                  'dti' ( in 3-component vector of uint)
+0:36                  Constant:
+0:36                    0 (const int)
+0:36              Constant:
+0:36                0 (const int)
+0:36            Sequence
+0:36              Constant:
+0:36                0 (const int)
+0:36              Constant:
+0:36                1 (const int)
+0:37      move second child to first child ( temp 3-component vector of uint)
+0:37        vector swizzle ( temp 3-component vector of uint)
+0:37          u: direct index for structure ( temp 4-component vector of uint)
+0:37            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:37              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:37                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:37                Constant:
+0:37                  0 (const uint)
+0:37              direct index ( temp uint)
+0:37                'dti' ( in 3-component vector of uint)
+0:37                Constant:
+0:37                  0 (const int)
+0:37            Constant:
+0:37              0 (const int)
+0:37          Sequence
+0:37            Constant:
+0:37              0 (const int)
+0:37            Constant:
+0:37              1 (const int)
+0:37            Constant:
+0:37              2 (const int)
+0:37        subgroupInclusiveMul ( temp 3-component vector of uint)
+0:37          vector swizzle ( temp 3-component vector of uint)
+0:37            u: direct index for structure ( temp 4-component vector of uint)
+0:37              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:37                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:37                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:37                  Constant:
+0:37                    0 (const uint)
+0:37                direct index ( temp uint)
+0:37                  'dti' ( in 3-component vector of uint)
+0:37                  Constant:
+0:37                    0 (const int)
+0:37              Constant:
+0:37                0 (const int)
+0:37            Sequence
+0:37              Constant:
+0:37                0 (const int)
+0:37              Constant:
+0:37                1 (const int)
+0:37              Constant:
+0:37                2 (const int)
+0:39      move second child to first child ( temp 4-component vector of int)
+0:39        i: direct index for structure ( temp 4-component vector of int)
+0:39          indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:39            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:39              'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:39              Constant:
+0:39                0 (const uint)
+0:39            direct index ( temp uint)
+0:39              'dti' ( in 3-component vector of uint)
+0:39              Constant:
+0:39                0 (const int)
+0:39          Constant:
+0:39            1 (const int)
+0:39        subgroupInclusiveMul ( temp 4-component vector of int)
+0:39          i: direct index for structure ( temp 4-component vector of int)
+0:39            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:39              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:39                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:39                Constant:
+0:39                  0 (const uint)
+0:39              direct index ( temp uint)
+0:39                'dti' ( in 3-component vector of uint)
+0:39                Constant:
+0:39                  0 (const int)
+0:39            Constant:
+0:39              1 (const int)
+0:40      move second child to first child ( temp int)
+0:40        direct index ( temp int)
+0:40          i: direct index for structure ( temp 4-component vector of int)
+0:40            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:40              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:40                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:40                Constant:
+0:40                  0 (const uint)
+0:40              direct index ( temp uint)
+0:40                'dti' ( in 3-component vector of uint)
+0:40                Constant:
+0:40                  0 (const int)
+0:40            Constant:
+0:40              1 (const int)
+0:40          Constant:
+0:40            0 (const int)
+0:40        subgroupInclusiveMul ( temp int)
+0:40          direct index ( temp int)
+0:40            i: direct index for structure ( temp 4-component vector of int)
+0:40              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:40                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:40                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:40                  Constant:
+0:40                    0 (const uint)
+0:40                direct index ( temp uint)
+0:40                  'dti' ( in 3-component vector of uint)
+0:40                  Constant:
+0:40                    0 (const int)
+0:40              Constant:
+0:40                1 (const int)
+0:40            Constant:
+0:40              0 (const int)
+0:41      move second child to first child ( temp 2-component vector of int)
+0:41        vector swizzle ( temp 2-component vector of int)
+0:41          i: direct index for structure ( temp 4-component vector of int)
+0:41            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:41              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:41                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:41                Constant:
+0:41                  0 (const uint)
+0:41              direct index ( temp uint)
+0:41                'dti' ( in 3-component vector of uint)
+0:41                Constant:
+0:41                  0 (const int)
+0:41            Constant:
+0:41              1 (const int)
+0:41          Sequence
+0:41            Constant:
+0:41              0 (const int)
+0:41            Constant:
+0:41              1 (const int)
+0:41        subgroupInclusiveMul ( temp 2-component vector of int)
+0:41          vector swizzle ( temp 2-component vector of int)
+0:41            i: direct index for structure ( temp 4-component vector of int)
+0:41              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:41                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:41                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:41                  Constant:
+0:41                    0 (const uint)
+0:41                direct index ( temp uint)
+0:41                  'dti' ( in 3-component vector of uint)
+0:41                  Constant:
+0:41                    0 (const int)
+0:41              Constant:
+0:41                1 (const int)
+0:41            Sequence
+0:41              Constant:
+0:41                0 (const int)
+0:41              Constant:
+0:41                1 (const int)
+0:42      move second child to first child ( temp 3-component vector of int)
+0:42        vector swizzle ( temp 3-component vector of int)
+0:42          i: direct index for structure ( temp 4-component vector of int)
+0:42            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:42              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:42                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:42                Constant:
+0:42                  0 (const uint)
+0:42              direct index ( temp uint)
+0:42                'dti' ( in 3-component vector of uint)
+0:42                Constant:
+0:42                  0 (const int)
+0:42            Constant:
+0:42              1 (const int)
+0:42          Sequence
+0:42            Constant:
+0:42              0 (const int)
+0:42            Constant:
+0:42              1 (const int)
+0:42            Constant:
+0:42              2 (const int)
+0:42        subgroupInclusiveMul ( temp 3-component vector of int)
+0:42          vector swizzle ( temp 3-component vector of int)
+0:42            i: direct index for structure ( temp 4-component vector of int)
+0:42              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:42                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:42                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:42                  Constant:
+0:42                    0 (const uint)
+0:42                direct index ( temp uint)
+0:42                  'dti' ( in 3-component vector of uint)
+0:42                  Constant:
+0:42                    0 (const int)
+0:42              Constant:
+0:42                1 (const int)
+0:42            Sequence
+0:42              Constant:
+0:42                0 (const int)
+0:42              Constant:
+0:42                1 (const int)
+0:42              Constant:
+0:42                2 (const int)
+0:44      move second child to first child ( temp 4-component vector of float)
+0:44        f: direct index for structure ( temp 4-component vector of float)
+0:44          indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:44            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:44              'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:44              Constant:
+0:44                0 (const uint)
+0:44            direct index ( temp uint)
+0:44              'dti' ( in 3-component vector of uint)
+0:44              Constant:
+0:44                0 (const int)
+0:44          Constant:
+0:44            2 (const int)
+0:44        subgroupInclusiveMul ( temp 4-component vector of float)
+0:44          f: direct index for structure ( temp 4-component vector of float)
+0:44            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:44              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:44                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:44                Constant:
+0:44                  0 (const uint)
+0:44              direct index ( temp uint)
+0:44                'dti' ( in 3-component vector of uint)
+0:44                Constant:
+0:44                  0 (const int)
+0:44            Constant:
+0:44              2 (const int)
+0:45      move second child to first child ( temp float)
+0:45        direct index ( temp float)
+0:45          f: direct index for structure ( temp 4-component vector of float)
+0:45            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:45              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:45                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:45                Constant:
+0:45                  0 (const uint)
+0:45              direct index ( temp uint)
+0:45                'dti' ( in 3-component vector of uint)
+0:45                Constant:
+0:45                  0 (const int)
+0:45            Constant:
+0:45              2 (const int)
+0:45          Constant:
+0:45            0 (const int)
+0:45        subgroupInclusiveMul ( temp float)
+0:45          direct index ( temp float)
+0:45            f: direct index for structure ( temp 4-component vector of float)
+0:45              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:45                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:45                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:45                  Constant:
+0:45                    0 (const uint)
+0:45                direct index ( temp uint)
+0:45                  'dti' ( in 3-component vector of uint)
+0:45                  Constant:
+0:45                    0 (const int)
+0:45              Constant:
+0:45                2 (const int)
+0:45            Constant:
+0:45              0 (const int)
+0:46      move second child to first child ( temp 2-component vector of float)
+0:46        vector swizzle ( temp 2-component vector of float)
+0:46          f: direct index for structure ( temp 4-component vector of float)
+0:46            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:46              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:46                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:46                Constant:
+0:46                  0 (const uint)
+0:46              direct index ( temp uint)
+0:46                'dti' ( in 3-component vector of uint)
+0:46                Constant:
+0:46                  0 (const int)
+0:46            Constant:
+0:46              2 (const int)
+0:46          Sequence
+0:46            Constant:
+0:46              0 (const int)
+0:46            Constant:
+0:46              1 (const int)
+0:46        subgroupInclusiveMul ( temp 2-component vector of float)
+0:46          vector swizzle ( temp 2-component vector of float)
+0:46            f: direct index for structure ( temp 4-component vector of float)
+0:46              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:46                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:46                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:46                  Constant:
+0:46                    0 (const uint)
+0:46                direct index ( temp uint)
+0:46                  'dti' ( in 3-component vector of uint)
+0:46                  Constant:
+0:46                    0 (const int)
+0:46              Constant:
+0:46                2 (const int)
+0:46            Sequence
+0:46              Constant:
+0:46                0 (const int)
+0:46              Constant:
+0:46                1 (const int)
+0:47      move second child to first child ( temp 3-component vector of float)
+0:47        vector swizzle ( temp 3-component vector of float)
+0:47          f: direct index for structure ( temp 4-component vector of float)
+0:47            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:47              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:47                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:47                Constant:
+0:47                  0 (const uint)
+0:47              direct index ( temp uint)
+0:47                'dti' ( in 3-component vector of uint)
+0:47                Constant:
+0:47                  0 (const int)
+0:47            Constant:
+0:47              2 (const int)
+0:47          Sequence
+0:47            Constant:
+0:47              0 (const int)
+0:47            Constant:
+0:47              1 (const int)
+0:47            Constant:
+0:47              2 (const int)
+0:47        subgroupInclusiveMul ( temp 3-component vector of float)
+0:47          vector swizzle ( temp 3-component vector of float)
+0:47            f: direct index for structure ( temp 4-component vector of float)
+0:47              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:47                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:47                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:47                  Constant:
+0:47                    0 (const uint)
+0:47                direct index ( temp uint)
+0:47                  'dti' ( in 3-component vector of uint)
+0:47                  Constant:
+0:47                    0 (const int)
+0:47              Constant:
+0:47                2 (const int)
+0:47            Sequence
+0:47              Constant:
+0:47                0 (const int)
+0:47              Constant:
+0:47                1 (const int)
+0:47              Constant:
+0:47                2 (const int)
+0:49      move second child to first child ( temp 4-component vector of double)
+0:49        d: direct index for structure ( temp 4-component vector of double)
+0:49          indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:49            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:49              'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:49              Constant:
+0:49                0 (const uint)
+0:49            direct index ( temp uint)
+0:49              'dti' ( in 3-component vector of uint)
+0:49              Constant:
+0:49                0 (const int)
+0:49          Constant:
+0:49            3 (const int)
+0:49        subgroupInclusiveMul ( temp 4-component vector of double)
+0:49          d: direct index for structure ( temp 4-component vector of double)
+0:49            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:49              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:49                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:49                Constant:
+0:49                  0 (const uint)
+0:49              direct index ( temp uint)
+0:49                'dti' ( in 3-component vector of uint)
+0:49                Constant:
+0:49                  0 (const int)
+0:49            Constant:
+0:49              3 (const int)
+0:50      move second child to first child ( temp double)
+0:50        direct index ( temp double)
+0:50          d: direct index for structure ( temp 4-component vector of double)
+0:50            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:50              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:50                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:50                Constant:
+0:50                  0 (const uint)
+0:50              direct index ( temp uint)
+0:50                'dti' ( in 3-component vector of uint)
+0:50                Constant:
+0:50                  0 (const int)
+0:50            Constant:
+0:50              3 (const int)
+0:50          Constant:
+0:50            0 (const int)
+0:50        subgroupInclusiveMul ( temp double)
+0:50          direct index ( temp double)
+0:50            d: direct index for structure ( temp 4-component vector of double)
+0:50              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:50                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:50                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:50                  Constant:
+0:50                    0 (const uint)
+0:50                direct index ( temp uint)
+0:50                  'dti' ( in 3-component vector of uint)
+0:50                  Constant:
+0:50                    0 (const int)
+0:50              Constant:
+0:50                3 (const int)
+0:50            Constant:
+0:50              0 (const int)
+0:51      move second child to first child ( temp 2-component vector of double)
+0:51        vector swizzle ( temp 2-component vector of double)
+0:51          d: direct index for structure ( temp 4-component vector of double)
+0:51            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:51              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:51                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:51                Constant:
+0:51                  0 (const uint)
+0:51              direct index ( temp uint)
+0:51                'dti' ( in 3-component vector of uint)
+0:51                Constant:
+0:51                  0 (const int)
+0:51            Constant:
+0:51              3 (const int)
+0:51          Sequence
+0:51            Constant:
+0:51              0 (const int)
+0:51            Constant:
+0:51              1 (const int)
+0:51        subgroupInclusiveMul ( temp 2-component vector of double)
+0:51          vector swizzle ( temp 2-component vector of double)
+0:51            d: direct index for structure ( temp 4-component vector of double)
+0:51              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:51                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:51                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:51                  Constant:
+0:51                    0 (const uint)
+0:51                direct index ( temp uint)
+0:51                  'dti' ( in 3-component vector of uint)
+0:51                  Constant:
+0:51                    0 (const int)
+0:51              Constant:
+0:51                3 (const int)
+0:51            Sequence
+0:51              Constant:
+0:51                0 (const int)
+0:51              Constant:
+0:51                1 (const int)
+0:52      move second child to first child ( temp 3-component vector of double)
+0:52        vector swizzle ( temp 3-component vector of double)
+0:52          d: direct index for structure ( temp 4-component vector of double)
+0:52            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:52              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:52                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:52                Constant:
+0:52                  0 (const uint)
+0:52              direct index ( temp uint)
+0:52                'dti' ( in 3-component vector of uint)
+0:52                Constant:
+0:52                  0 (const int)
+0:52            Constant:
+0:52              3 (const int)
+0:52          Sequence
+0:52            Constant:
+0:52              0 (const int)
+0:52            Constant:
+0:52              1 (const int)
+0:52            Constant:
+0:52              2 (const int)
+0:52        subgroupInclusiveMul ( temp 3-component vector of double)
+0:52          vector swizzle ( temp 3-component vector of double)
+0:52            d: direct index for structure ( temp 4-component vector of double)
+0:52              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:52                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:52                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:52                  Constant:
+0:52                    0 (const uint)
+0:52                direct index ( temp uint)
+0:52                  'dti' ( in 3-component vector of uint)
+0:52                  Constant:
+0:52                    0 (const int)
+0:52              Constant:
+0:52                3 (const int)
+0:52            Sequence
+0:52              Constant:
+0:52                0 (const int)
+0:52              Constant:
+0:52                1 (const int)
+0:52              Constant:
+0:52                2 (const int)
+0:54      move second child to first child ( temp uint)
+0:54        direct index ( temp uint)
+0:54          u: direct index for structure ( temp 4-component vector of uint)
+0:54            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:54              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:54                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:54                Constant:
+0:54                  0 (const uint)
+0:54              direct index ( temp uint)
+0:54                'dti' ( in 3-component vector of uint)
+0:54                Constant:
+0:54                  0 (const int)
+0:54            Constant:
+0:54              0 (const int)
+0:54          Constant:
+0:54            0 (const int)
+0:54        subgroupBallotInclusiveBitCount ( temp uint)
+0:54          subgroupBallot ( temp 4-component vector of uint)
+0:54            Compare Equal ( temp bool)
+0:54              direct index ( temp uint)
+0:54                u: direct index for structure ( temp 4-component vector of uint)
+0:54                  indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:54                    @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:54                      'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:54                      Constant:
+0:54                        0 (const uint)
+0:54                    direct index ( temp uint)
+0:54                      'dti' ( in 3-component vector of uint)
+0:54                      Constant:
+0:54                        0 (const int)
+0:54                  Constant:
+0:54                    0 (const int)
+0:54                Constant:
+0:54                  0 (const int)
+0:54              Constant:
+0:54                0 (const uint)
+0:13  Function Definition: CSMain( ( temp void)
+0:13    Function Parameters: 
+0:?     Sequence
+0:13      move second child to first child ( temp 3-component vector of uint)
+0:?         'dti' ( temp 3-component vector of uint)
+0:?         'dti' ( in 3-component vector of uint GlobalInvocationID)
+0:13      Function Call: @CSMain(vu3; ( temp void)
+0:?         'dti' ( temp 3-component vector of uint)
+0:?   Linker Objects
+0:?     'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:?     'dti' ( in 3-component vector of uint GlobalInvocationID)
+
+
+Linked compute stage:
+
+
+Shader version: 500
+local_size = (32, 16, 1)
+0:? Sequence
+0:13  Function Definition: @CSMain(vu3; ( temp void)
+0:13    Function Parameters: 
+0:13      'dti' ( in 3-component vector of uint)
+0:?     Sequence
+0:14      move second child to first child ( temp 4-component vector of uint)
+0:14        u: direct index for structure ( temp 4-component vector of uint)
+0:14          indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:14            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:14              'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:14              Constant:
+0:14                0 (const uint)
+0:14            direct index ( temp uint)
+0:14              'dti' ( in 3-component vector of uint)
+0:14              Constant:
+0:14                0 (const int)
+0:14          Constant:
+0:14            0 (const int)
+0:14        subgroupInclusiveAdd ( temp 4-component vector of uint)
+0:14          u: direct index for structure ( temp 4-component vector of uint)
+0:14            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:14              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:14                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:14                Constant:
+0:14                  0 (const uint)
+0:14              direct index ( temp uint)
+0:14                'dti' ( in 3-component vector of uint)
+0:14                Constant:
+0:14                  0 (const int)
+0:14            Constant:
+0:14              0 (const int)
+0:15      move second child to first child ( temp uint)
+0:15        direct index ( temp uint)
+0:15          u: direct index for structure ( temp 4-component vector of uint)
+0:15            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:15              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:15                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:15                Constant:
+0:15                  0 (const uint)
+0:15              direct index ( temp uint)
+0:15                'dti' ( in 3-component vector of uint)
+0:15                Constant:
+0:15                  0 (const int)
+0:15            Constant:
+0:15              0 (const int)
+0:15          Constant:
+0:15            0 (const int)
+0:15        subgroupInclusiveAdd ( temp uint)
+0:15          direct index ( temp uint)
+0:15            u: direct index for structure ( temp 4-component vector of uint)
+0:15              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:15                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:15                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:15                  Constant:
+0:15                    0 (const uint)
+0:15                direct index ( temp uint)
+0:15                  'dti' ( in 3-component vector of uint)
+0:15                  Constant:
+0:15                    0 (const int)
+0:15              Constant:
+0:15                0 (const int)
+0:15            Constant:
+0:15              0 (const int)
+0:16      move second child to first child ( temp 2-component vector of uint)
+0:16        vector swizzle ( temp 2-component vector of uint)
+0:16          u: direct index for structure ( temp 4-component vector of uint)
+0:16            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:16              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:16                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:16                Constant:
+0:16                  0 (const uint)
+0:16              direct index ( temp uint)
+0:16                'dti' ( in 3-component vector of uint)
+0:16                Constant:
+0:16                  0 (const int)
+0:16            Constant:
+0:16              0 (const int)
+0:16          Sequence
+0:16            Constant:
+0:16              0 (const int)
+0:16            Constant:
+0:16              1 (const int)
+0:16        subgroupInclusiveAdd ( temp 2-component vector of uint)
+0:16          vector swizzle ( temp 2-component vector of uint)
+0:16            u: direct index for structure ( temp 4-component vector of uint)
+0:16              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:16                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:16                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:16                  Constant:
+0:16                    0 (const uint)
+0:16                direct index ( temp uint)
+0:16                  'dti' ( in 3-component vector of uint)
+0:16                  Constant:
+0:16                    0 (const int)
+0:16              Constant:
+0:16                0 (const int)
+0:16            Sequence
+0:16              Constant:
+0:16                0 (const int)
+0:16              Constant:
+0:16                1 (const int)
+0:17      move second child to first child ( temp 3-component vector of uint)
+0:17        vector swizzle ( temp 3-component vector of uint)
+0:17          u: direct index for structure ( temp 4-component vector of uint)
+0:17            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:17              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:17                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:17                Constant:
+0:17                  0 (const uint)
+0:17              direct index ( temp uint)
+0:17                'dti' ( in 3-component vector of uint)
+0:17                Constant:
+0:17                  0 (const int)
+0:17            Constant:
+0:17              0 (const int)
+0:17          Sequence
+0:17            Constant:
+0:17              0 (const int)
+0:17            Constant:
+0:17              1 (const int)
+0:17            Constant:
+0:17              2 (const int)
+0:17        subgroupInclusiveAdd ( temp 3-component vector of uint)
+0:17          vector swizzle ( temp 3-component vector of uint)
+0:17            u: direct index for structure ( temp 4-component vector of uint)
+0:17              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:17                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:17                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:17                  Constant:
+0:17                    0 (const uint)
+0:17                direct index ( temp uint)
+0:17                  'dti' ( in 3-component vector of uint)
+0:17                  Constant:
+0:17                    0 (const int)
+0:17              Constant:
+0:17                0 (const int)
+0:17            Sequence
+0:17              Constant:
+0:17                0 (const int)
+0:17              Constant:
+0:17                1 (const int)
+0:17              Constant:
+0:17                2 (const int)
+0:19      move second child to first child ( temp 4-component vector of int)
+0:19        i: direct index for structure ( temp 4-component vector of int)
+0:19          indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:19            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:19              'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:19              Constant:
+0:19                0 (const uint)
+0:19            direct index ( temp uint)
+0:19              'dti' ( in 3-component vector of uint)
+0:19              Constant:
+0:19                0 (const int)
+0:19          Constant:
+0:19            1 (const int)
+0:19        subgroupInclusiveAdd ( temp 4-component vector of int)
+0:19          i: direct index for structure ( temp 4-component vector of int)
+0:19            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:19              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:19                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:19                Constant:
+0:19                  0 (const uint)
+0:19              direct index ( temp uint)
+0:19                'dti' ( in 3-component vector of uint)
+0:19                Constant:
+0:19                  0 (const int)
+0:19            Constant:
+0:19              1 (const int)
+0:20      move second child to first child ( temp int)
+0:20        direct index ( temp int)
+0:20          i: direct index for structure ( temp 4-component vector of int)
+0:20            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:20              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:20                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:20                Constant:
+0:20                  0 (const uint)
+0:20              direct index ( temp uint)
+0:20                'dti' ( in 3-component vector of uint)
+0:20                Constant:
+0:20                  0 (const int)
+0:20            Constant:
+0:20              1 (const int)
+0:20          Constant:
+0:20            0 (const int)
+0:20        subgroupInclusiveAdd ( temp int)
+0:20          direct index ( temp int)
+0:20            i: direct index for structure ( temp 4-component vector of int)
+0:20              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:20                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:20                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:20                  Constant:
+0:20                    0 (const uint)
+0:20                direct index ( temp uint)
+0:20                  'dti' ( in 3-component vector of uint)
+0:20                  Constant:
+0:20                    0 (const int)
+0:20              Constant:
+0:20                1 (const int)
+0:20            Constant:
+0:20              0 (const int)
+0:21      move second child to first child ( temp 2-component vector of int)
+0:21        vector swizzle ( temp 2-component vector of int)
+0:21          i: direct index for structure ( temp 4-component vector of int)
+0:21            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:21              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:21                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:21                Constant:
+0:21                  0 (const uint)
+0:21              direct index ( temp uint)
+0:21                'dti' ( in 3-component vector of uint)
+0:21                Constant:
+0:21                  0 (const int)
+0:21            Constant:
+0:21              1 (const int)
+0:21          Sequence
+0:21            Constant:
+0:21              0 (const int)
+0:21            Constant:
+0:21              1 (const int)
+0:21        subgroupInclusiveAdd ( temp 2-component vector of int)
+0:21          vector swizzle ( temp 2-component vector of int)
+0:21            i: direct index for structure ( temp 4-component vector of int)
+0:21              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:21                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:21                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:21                  Constant:
+0:21                    0 (const uint)
+0:21                direct index ( temp uint)
+0:21                  'dti' ( in 3-component vector of uint)
+0:21                  Constant:
+0:21                    0 (const int)
+0:21              Constant:
+0:21                1 (const int)
+0:21            Sequence
+0:21              Constant:
+0:21                0 (const int)
+0:21              Constant:
+0:21                1 (const int)
+0:22      move second child to first child ( temp 3-component vector of int)
+0:22        vector swizzle ( temp 3-component vector of int)
+0:22          i: direct index for structure ( temp 4-component vector of int)
+0:22            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:22              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:22                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:22                Constant:
+0:22                  0 (const uint)
+0:22              direct index ( temp uint)
+0:22                'dti' ( in 3-component vector of uint)
+0:22                Constant:
+0:22                  0 (const int)
+0:22            Constant:
+0:22              1 (const int)
+0:22          Sequence
+0:22            Constant:
+0:22              0 (const int)
+0:22            Constant:
+0:22              1 (const int)
+0:22            Constant:
+0:22              2 (const int)
+0:22        subgroupInclusiveAdd ( temp 3-component vector of int)
+0:22          vector swizzle ( temp 3-component vector of int)
+0:22            i: direct index for structure ( temp 4-component vector of int)
+0:22              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:22                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:22                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:22                  Constant:
+0:22                    0 (const uint)
+0:22                direct index ( temp uint)
+0:22                  'dti' ( in 3-component vector of uint)
+0:22                  Constant:
+0:22                    0 (const int)
+0:22              Constant:
+0:22                1 (const int)
+0:22            Sequence
+0:22              Constant:
+0:22                0 (const int)
+0:22              Constant:
+0:22                1 (const int)
+0:22              Constant:
+0:22                2 (const int)
+0:24      move second child to first child ( temp 4-component vector of float)
+0:24        f: direct index for structure ( temp 4-component vector of float)
+0:24          indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:24            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:24              'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:24              Constant:
+0:24                0 (const uint)
+0:24            direct index ( temp uint)
+0:24              'dti' ( in 3-component vector of uint)
+0:24              Constant:
+0:24                0 (const int)
+0:24          Constant:
+0:24            2 (const int)
+0:24        subgroupInclusiveAdd ( temp 4-component vector of float)
+0:24          f: direct index for structure ( temp 4-component vector of float)
+0:24            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:24              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:24                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:24                Constant:
+0:24                  0 (const uint)
+0:24              direct index ( temp uint)
+0:24                'dti' ( in 3-component vector of uint)
+0:24                Constant:
+0:24                  0 (const int)
+0:24            Constant:
+0:24              2 (const int)
+0:25      move second child to first child ( temp float)
+0:25        direct index ( temp float)
+0:25          f: direct index for structure ( temp 4-component vector of float)
+0:25            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:25              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:25                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:25                Constant:
+0:25                  0 (const uint)
+0:25              direct index ( temp uint)
+0:25                'dti' ( in 3-component vector of uint)
+0:25                Constant:
+0:25                  0 (const int)
+0:25            Constant:
+0:25              2 (const int)
+0:25          Constant:
+0:25            0 (const int)
+0:25        subgroupInclusiveAdd ( temp float)
+0:25          direct index ( temp float)
+0:25            f: direct index for structure ( temp 4-component vector of float)
+0:25              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:25                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:25                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:25                  Constant:
+0:25                    0 (const uint)
+0:25                direct index ( temp uint)
+0:25                  'dti' ( in 3-component vector of uint)
+0:25                  Constant:
+0:25                    0 (const int)
+0:25              Constant:
+0:25                2 (const int)
+0:25            Constant:
+0:25              0 (const int)
+0:26      move second child to first child ( temp 2-component vector of float)
+0:26        vector swizzle ( temp 2-component vector of float)
+0:26          f: direct index for structure ( temp 4-component vector of float)
+0:26            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:26              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:26                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:26                Constant:
+0:26                  0 (const uint)
+0:26              direct index ( temp uint)
+0:26                'dti' ( in 3-component vector of uint)
+0:26                Constant:
+0:26                  0 (const int)
+0:26            Constant:
+0:26              2 (const int)
+0:26          Sequence
+0:26            Constant:
+0:26              0 (const int)
+0:26            Constant:
+0:26              1 (const int)
+0:26        subgroupInclusiveAdd ( temp 2-component vector of float)
+0:26          vector swizzle ( temp 2-component vector of float)
+0:26            f: direct index for structure ( temp 4-component vector of float)
+0:26              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:26                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:26                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:26                  Constant:
+0:26                    0 (const uint)
+0:26                direct index ( temp uint)
+0:26                  'dti' ( in 3-component vector of uint)
+0:26                  Constant:
+0:26                    0 (const int)
+0:26              Constant:
+0:26                2 (const int)
+0:26            Sequence
+0:26              Constant:
+0:26                0 (const int)
+0:26              Constant:
+0:26                1 (const int)
+0:27      move second child to first child ( temp 3-component vector of float)
+0:27        vector swizzle ( temp 3-component vector of float)
+0:27          f: direct index for structure ( temp 4-component vector of float)
+0:27            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:27              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:27                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:27                Constant:
+0:27                  0 (const uint)
+0:27              direct index ( temp uint)
+0:27                'dti' ( in 3-component vector of uint)
+0:27                Constant:
+0:27                  0 (const int)
+0:27            Constant:
+0:27              2 (const int)
+0:27          Sequence
+0:27            Constant:
+0:27              0 (const int)
+0:27            Constant:
+0:27              1 (const int)
+0:27            Constant:
+0:27              2 (const int)
+0:27        subgroupInclusiveAdd ( temp 3-component vector of float)
+0:27          vector swizzle ( temp 3-component vector of float)
+0:27            f: direct index for structure ( temp 4-component vector of float)
+0:27              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:27                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:27                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:27                  Constant:
+0:27                    0 (const uint)
+0:27                direct index ( temp uint)
+0:27                  'dti' ( in 3-component vector of uint)
+0:27                  Constant:
+0:27                    0 (const int)
+0:27              Constant:
+0:27                2 (const int)
+0:27            Sequence
+0:27              Constant:
+0:27                0 (const int)
+0:27              Constant:
+0:27                1 (const int)
+0:27              Constant:
+0:27                2 (const int)
+0:29      move second child to first child ( temp 4-component vector of double)
+0:29        d: direct index for structure ( temp 4-component vector of double)
+0:29          indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:29            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:29              'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:29              Constant:
+0:29                0 (const uint)
+0:29            direct index ( temp uint)
+0:29              'dti' ( in 3-component vector of uint)
+0:29              Constant:
+0:29                0 (const int)
+0:29          Constant:
+0:29            3 (const int)
+0:29        subgroupInclusiveAdd ( temp 4-component vector of double)
+0:29          d: direct index for structure ( temp 4-component vector of double)
+0:29            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:29              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:29                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:29                Constant:
+0:29                  0 (const uint)
+0:29              direct index ( temp uint)
+0:29                'dti' ( in 3-component vector of uint)
+0:29                Constant:
+0:29                  0 (const int)
+0:29            Constant:
+0:29              3 (const int)
+0:30      move second child to first child ( temp double)
+0:30        direct index ( temp double)
+0:30          d: direct index for structure ( temp 4-component vector of double)
+0:30            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:30              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:30                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:30                Constant:
+0:30                  0 (const uint)
+0:30              direct index ( temp uint)
+0:30                'dti' ( in 3-component vector of uint)
+0:30                Constant:
+0:30                  0 (const int)
+0:30            Constant:
+0:30              3 (const int)
+0:30          Constant:
+0:30            0 (const int)
+0:30        subgroupInclusiveAdd ( temp double)
+0:30          direct index ( temp double)
+0:30            d: direct index for structure ( temp 4-component vector of double)
+0:30              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:30                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:30                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:30                  Constant:
+0:30                    0 (const uint)
+0:30                direct index ( temp uint)
+0:30                  'dti' ( in 3-component vector of uint)
+0:30                  Constant:
+0:30                    0 (const int)
+0:30              Constant:
+0:30                3 (const int)
+0:30            Constant:
+0:30              0 (const int)
+0:31      move second child to first child ( temp 2-component vector of double)
+0:31        vector swizzle ( temp 2-component vector of double)
+0:31          d: direct index for structure ( temp 4-component vector of double)
+0:31            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:31              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:31                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:31                Constant:
+0:31                  0 (const uint)
+0:31              direct index ( temp uint)
+0:31                'dti' ( in 3-component vector of uint)
+0:31                Constant:
+0:31                  0 (const int)
+0:31            Constant:
+0:31              3 (const int)
+0:31          Sequence
+0:31            Constant:
+0:31              0 (const int)
+0:31            Constant:
+0:31              1 (const int)
+0:31        subgroupInclusiveAdd ( temp 2-component vector of double)
+0:31          vector swizzle ( temp 2-component vector of double)
+0:31            d: direct index for structure ( temp 4-component vector of double)
+0:31              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:31                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:31                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:31                  Constant:
+0:31                    0 (const uint)
+0:31                direct index ( temp uint)
+0:31                  'dti' ( in 3-component vector of uint)
+0:31                  Constant:
+0:31                    0 (const int)
+0:31              Constant:
+0:31                3 (const int)
+0:31            Sequence
+0:31              Constant:
+0:31                0 (const int)
+0:31              Constant:
+0:31                1 (const int)
+0:32      move second child to first child ( temp 3-component vector of double)
+0:32        vector swizzle ( temp 3-component vector of double)
+0:32          d: direct index for structure ( temp 4-component vector of double)
+0:32            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:32              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:32                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:32                Constant:
+0:32                  0 (const uint)
+0:32              direct index ( temp uint)
+0:32                'dti' ( in 3-component vector of uint)
+0:32                Constant:
+0:32                  0 (const int)
+0:32            Constant:
+0:32              3 (const int)
+0:32          Sequence
+0:32            Constant:
+0:32              0 (const int)
+0:32            Constant:
+0:32              1 (const int)
+0:32            Constant:
+0:32              2 (const int)
+0:32        subgroupInclusiveAdd ( temp 3-component vector of double)
+0:32          vector swizzle ( temp 3-component vector of double)
+0:32            d: direct index for structure ( temp 4-component vector of double)
+0:32              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:32                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:32                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:32                  Constant:
+0:32                    0 (const uint)
+0:32                direct index ( temp uint)
+0:32                  'dti' ( in 3-component vector of uint)
+0:32                  Constant:
+0:32                    0 (const int)
+0:32              Constant:
+0:32                3 (const int)
+0:32            Sequence
+0:32              Constant:
+0:32                0 (const int)
+0:32              Constant:
+0:32                1 (const int)
+0:32              Constant:
+0:32                2 (const int)
+0:34      move second child to first child ( temp 4-component vector of uint)
+0:34        u: direct index for structure ( temp 4-component vector of uint)
+0:34          indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:34            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:34              'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:34              Constant:
+0:34                0 (const uint)
+0:34            direct index ( temp uint)
+0:34              'dti' ( in 3-component vector of uint)
+0:34              Constant:
+0:34                0 (const int)
+0:34          Constant:
+0:34            0 (const int)
+0:34        subgroupInclusiveMul ( temp 4-component vector of uint)
+0:34          u: direct index for structure ( temp 4-component vector of uint)
+0:34            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:34              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:34                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:34                Constant:
+0:34                  0 (const uint)
+0:34              direct index ( temp uint)
+0:34                'dti' ( in 3-component vector of uint)
+0:34                Constant:
+0:34                  0 (const int)
+0:34            Constant:
+0:34              0 (const int)
+0:35      move second child to first child ( temp uint)
+0:35        direct index ( temp uint)
+0:35          u: direct index for structure ( temp 4-component vector of uint)
+0:35            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:35              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:35                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:35                Constant:
+0:35                  0 (const uint)
+0:35              direct index ( temp uint)
+0:35                'dti' ( in 3-component vector of uint)
+0:35                Constant:
+0:35                  0 (const int)
+0:35            Constant:
+0:35              0 (const int)
+0:35          Constant:
+0:35            0 (const int)
+0:35        subgroupInclusiveMul ( temp uint)
+0:35          direct index ( temp uint)
+0:35            u: direct index for structure ( temp 4-component vector of uint)
+0:35              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:35                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:35                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:35                  Constant:
+0:35                    0 (const uint)
+0:35                direct index ( temp uint)
+0:35                  'dti' ( in 3-component vector of uint)
+0:35                  Constant:
+0:35                    0 (const int)
+0:35              Constant:
+0:35                0 (const int)
+0:35            Constant:
+0:35              0 (const int)
+0:36      move second child to first child ( temp 2-component vector of uint)
+0:36        vector swizzle ( temp 2-component vector of uint)
+0:36          u: direct index for structure ( temp 4-component vector of uint)
+0:36            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:36              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:36                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:36                Constant:
+0:36                  0 (const uint)
+0:36              direct index ( temp uint)
+0:36                'dti' ( in 3-component vector of uint)
+0:36                Constant:
+0:36                  0 (const int)
+0:36            Constant:
+0:36              0 (const int)
+0:36          Sequence
+0:36            Constant:
+0:36              0 (const int)
+0:36            Constant:
+0:36              1 (const int)
+0:36        subgroupInclusiveMul ( temp 2-component vector of uint)
+0:36          vector swizzle ( temp 2-component vector of uint)
+0:36            u: direct index for structure ( temp 4-component vector of uint)
+0:36              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:36                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:36                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:36                  Constant:
+0:36                    0 (const uint)
+0:36                direct index ( temp uint)
+0:36                  'dti' ( in 3-component vector of uint)
+0:36                  Constant:
+0:36                    0 (const int)
+0:36              Constant:
+0:36                0 (const int)
+0:36            Sequence
+0:36              Constant:
+0:36                0 (const int)
+0:36              Constant:
+0:36                1 (const int)
+0:37      move second child to first child ( temp 3-component vector of uint)
+0:37        vector swizzle ( temp 3-component vector of uint)
+0:37          u: direct index for structure ( temp 4-component vector of uint)
+0:37            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:37              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:37                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:37                Constant:
+0:37                  0 (const uint)
+0:37              direct index ( temp uint)
+0:37                'dti' ( in 3-component vector of uint)
+0:37                Constant:
+0:37                  0 (const int)
+0:37            Constant:
+0:37              0 (const int)
+0:37          Sequence
+0:37            Constant:
+0:37              0 (const int)
+0:37            Constant:
+0:37              1 (const int)
+0:37            Constant:
+0:37              2 (const int)
+0:37        subgroupInclusiveMul ( temp 3-component vector of uint)
+0:37          vector swizzle ( temp 3-component vector of uint)
+0:37            u: direct index for structure ( temp 4-component vector of uint)
+0:37              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:37                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:37                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:37                  Constant:
+0:37                    0 (const uint)
+0:37                direct index ( temp uint)
+0:37                  'dti' ( in 3-component vector of uint)
+0:37                  Constant:
+0:37                    0 (const int)
+0:37              Constant:
+0:37                0 (const int)
+0:37            Sequence
+0:37              Constant:
+0:37                0 (const int)
+0:37              Constant:
+0:37                1 (const int)
+0:37              Constant:
+0:37                2 (const int)
+0:39      move second child to first child ( temp 4-component vector of int)
+0:39        i: direct index for structure ( temp 4-component vector of int)
+0:39          indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:39            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:39              'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:39              Constant:
+0:39                0 (const uint)
+0:39            direct index ( temp uint)
+0:39              'dti' ( in 3-component vector of uint)
+0:39              Constant:
+0:39                0 (const int)
+0:39          Constant:
+0:39            1 (const int)
+0:39        subgroupInclusiveMul ( temp 4-component vector of int)
+0:39          i: direct index for structure ( temp 4-component vector of int)
+0:39            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:39              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:39                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:39                Constant:
+0:39                  0 (const uint)
+0:39              direct index ( temp uint)
+0:39                'dti' ( in 3-component vector of uint)
+0:39                Constant:
+0:39                  0 (const int)
+0:39            Constant:
+0:39              1 (const int)
+0:40      move second child to first child ( temp int)
+0:40        direct index ( temp int)
+0:40          i: direct index for structure ( temp 4-component vector of int)
+0:40            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:40              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:40                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:40                Constant:
+0:40                  0 (const uint)
+0:40              direct index ( temp uint)
+0:40                'dti' ( in 3-component vector of uint)
+0:40                Constant:
+0:40                  0 (const int)
+0:40            Constant:
+0:40              1 (const int)
+0:40          Constant:
+0:40            0 (const int)
+0:40        subgroupInclusiveMul ( temp int)
+0:40          direct index ( temp int)
+0:40            i: direct index for structure ( temp 4-component vector of int)
+0:40              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:40                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:40                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:40                  Constant:
+0:40                    0 (const uint)
+0:40                direct index ( temp uint)
+0:40                  'dti' ( in 3-component vector of uint)
+0:40                  Constant:
+0:40                    0 (const int)
+0:40              Constant:
+0:40                1 (const int)
+0:40            Constant:
+0:40              0 (const int)
+0:41      move second child to first child ( temp 2-component vector of int)
+0:41        vector swizzle ( temp 2-component vector of int)
+0:41          i: direct index for structure ( temp 4-component vector of int)
+0:41            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:41              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:41                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:41                Constant:
+0:41                  0 (const uint)
+0:41              direct index ( temp uint)
+0:41                'dti' ( in 3-component vector of uint)
+0:41                Constant:
+0:41                  0 (const int)
+0:41            Constant:
+0:41              1 (const int)
+0:41          Sequence
+0:41            Constant:
+0:41              0 (const int)
+0:41            Constant:
+0:41              1 (const int)
+0:41        subgroupInclusiveMul ( temp 2-component vector of int)
+0:41          vector swizzle ( temp 2-component vector of int)
+0:41            i: direct index for structure ( temp 4-component vector of int)
+0:41              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:41                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:41                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:41                  Constant:
+0:41                    0 (const uint)
+0:41                direct index ( temp uint)
+0:41                  'dti' ( in 3-component vector of uint)
+0:41                  Constant:
+0:41                    0 (const int)
+0:41              Constant:
+0:41                1 (const int)
+0:41            Sequence
+0:41              Constant:
+0:41                0 (const int)
+0:41              Constant:
+0:41                1 (const int)
+0:42      move second child to first child ( temp 3-component vector of int)
+0:42        vector swizzle ( temp 3-component vector of int)
+0:42          i: direct index for structure ( temp 4-component vector of int)
+0:42            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:42              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:42                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:42                Constant:
+0:42                  0 (const uint)
+0:42              direct index ( temp uint)
+0:42                'dti' ( in 3-component vector of uint)
+0:42                Constant:
+0:42                  0 (const int)
+0:42            Constant:
+0:42              1 (const int)
+0:42          Sequence
+0:42            Constant:
+0:42              0 (const int)
+0:42            Constant:
+0:42              1 (const int)
+0:42            Constant:
+0:42              2 (const int)
+0:42        subgroupInclusiveMul ( temp 3-component vector of int)
+0:42          vector swizzle ( temp 3-component vector of int)
+0:42            i: direct index for structure ( temp 4-component vector of int)
+0:42              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:42                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:42                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:42                  Constant:
+0:42                    0 (const uint)
+0:42                direct index ( temp uint)
+0:42                  'dti' ( in 3-component vector of uint)
+0:42                  Constant:
+0:42                    0 (const int)
+0:42              Constant:
+0:42                1 (const int)
+0:42            Sequence
+0:42              Constant:
+0:42                0 (const int)
+0:42              Constant:
+0:42                1 (const int)
+0:42              Constant:
+0:42                2 (const int)
+0:44      move second child to first child ( temp 4-component vector of float)
+0:44        f: direct index for structure ( temp 4-component vector of float)
+0:44          indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:44            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:44              'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:44              Constant:
+0:44                0 (const uint)
+0:44            direct index ( temp uint)
+0:44              'dti' ( in 3-component vector of uint)
+0:44              Constant:
+0:44                0 (const int)
+0:44          Constant:
+0:44            2 (const int)
+0:44        subgroupInclusiveMul ( temp 4-component vector of float)
+0:44          f: direct index for structure ( temp 4-component vector of float)
+0:44            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:44              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:44                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:44                Constant:
+0:44                  0 (const uint)
+0:44              direct index ( temp uint)
+0:44                'dti' ( in 3-component vector of uint)
+0:44                Constant:
+0:44                  0 (const int)
+0:44            Constant:
+0:44              2 (const int)
+0:45      move second child to first child ( temp float)
+0:45        direct index ( temp float)
+0:45          f: direct index for structure ( temp 4-component vector of float)
+0:45            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:45              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:45                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:45                Constant:
+0:45                  0 (const uint)
+0:45              direct index ( temp uint)
+0:45                'dti' ( in 3-component vector of uint)
+0:45                Constant:
+0:45                  0 (const int)
+0:45            Constant:
+0:45              2 (const int)
+0:45          Constant:
+0:45            0 (const int)
+0:45        subgroupInclusiveMul ( temp float)
+0:45          direct index ( temp float)
+0:45            f: direct index for structure ( temp 4-component vector of float)
+0:45              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:45                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:45                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:45                  Constant:
+0:45                    0 (const uint)
+0:45                direct index ( temp uint)
+0:45                  'dti' ( in 3-component vector of uint)
+0:45                  Constant:
+0:45                    0 (const int)
+0:45              Constant:
+0:45                2 (const int)
+0:45            Constant:
+0:45              0 (const int)
+0:46      move second child to first child ( temp 2-component vector of float)
+0:46        vector swizzle ( temp 2-component vector of float)
+0:46          f: direct index for structure ( temp 4-component vector of float)
+0:46            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:46              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:46                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:46                Constant:
+0:46                  0 (const uint)
+0:46              direct index ( temp uint)
+0:46                'dti' ( in 3-component vector of uint)
+0:46                Constant:
+0:46                  0 (const int)
+0:46            Constant:
+0:46              2 (const int)
+0:46          Sequence
+0:46            Constant:
+0:46              0 (const int)
+0:46            Constant:
+0:46              1 (const int)
+0:46        subgroupInclusiveMul ( temp 2-component vector of float)
+0:46          vector swizzle ( temp 2-component vector of float)
+0:46            f: direct index for structure ( temp 4-component vector of float)
+0:46              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:46                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:46                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:46                  Constant:
+0:46                    0 (const uint)
+0:46                direct index ( temp uint)
+0:46                  'dti' ( in 3-component vector of uint)
+0:46                  Constant:
+0:46                    0 (const int)
+0:46              Constant:
+0:46                2 (const int)
+0:46            Sequence
+0:46              Constant:
+0:46                0 (const int)
+0:46              Constant:
+0:46                1 (const int)
+0:47      move second child to first child ( temp 3-component vector of float)
+0:47        vector swizzle ( temp 3-component vector of float)
+0:47          f: direct index for structure ( temp 4-component vector of float)
+0:47            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:47              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:47                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:47                Constant:
+0:47                  0 (const uint)
+0:47              direct index ( temp uint)
+0:47                'dti' ( in 3-component vector of uint)
+0:47                Constant:
+0:47                  0 (const int)
+0:47            Constant:
+0:47              2 (const int)
+0:47          Sequence
+0:47            Constant:
+0:47              0 (const int)
+0:47            Constant:
+0:47              1 (const int)
+0:47            Constant:
+0:47              2 (const int)
+0:47        subgroupInclusiveMul ( temp 3-component vector of float)
+0:47          vector swizzle ( temp 3-component vector of float)
+0:47            f: direct index for structure ( temp 4-component vector of float)
+0:47              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:47                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:47                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:47                  Constant:
+0:47                    0 (const uint)
+0:47                direct index ( temp uint)
+0:47                  'dti' ( in 3-component vector of uint)
+0:47                  Constant:
+0:47                    0 (const int)
+0:47              Constant:
+0:47                2 (const int)
+0:47            Sequence
+0:47              Constant:
+0:47                0 (const int)
+0:47              Constant:
+0:47                1 (const int)
+0:47              Constant:
+0:47                2 (const int)
+0:49      move second child to first child ( temp 4-component vector of double)
+0:49        d: direct index for structure ( temp 4-component vector of double)
+0:49          indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:49            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:49              'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:49              Constant:
+0:49                0 (const uint)
+0:49            direct index ( temp uint)
+0:49              'dti' ( in 3-component vector of uint)
+0:49              Constant:
+0:49                0 (const int)
+0:49          Constant:
+0:49            3 (const int)
+0:49        subgroupInclusiveMul ( temp 4-component vector of double)
+0:49          d: direct index for structure ( temp 4-component vector of double)
+0:49            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:49              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:49                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:49                Constant:
+0:49                  0 (const uint)
+0:49              direct index ( temp uint)
+0:49                'dti' ( in 3-component vector of uint)
+0:49                Constant:
+0:49                  0 (const int)
+0:49            Constant:
+0:49              3 (const int)
+0:50      move second child to first child ( temp double)
+0:50        direct index ( temp double)
+0:50          d: direct index for structure ( temp 4-component vector of double)
+0:50            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:50              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:50                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:50                Constant:
+0:50                  0 (const uint)
+0:50              direct index ( temp uint)
+0:50                'dti' ( in 3-component vector of uint)
+0:50                Constant:
+0:50                  0 (const int)
+0:50            Constant:
+0:50              3 (const int)
+0:50          Constant:
+0:50            0 (const int)
+0:50        subgroupInclusiveMul ( temp double)
+0:50          direct index ( temp double)
+0:50            d: direct index for structure ( temp 4-component vector of double)
+0:50              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:50                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:50                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:50                  Constant:
+0:50                    0 (const uint)
+0:50                direct index ( temp uint)
+0:50                  'dti' ( in 3-component vector of uint)
+0:50                  Constant:
+0:50                    0 (const int)
+0:50              Constant:
+0:50                3 (const int)
+0:50            Constant:
+0:50              0 (const int)
+0:51      move second child to first child ( temp 2-component vector of double)
+0:51        vector swizzle ( temp 2-component vector of double)
+0:51          d: direct index for structure ( temp 4-component vector of double)
+0:51            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:51              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:51                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:51                Constant:
+0:51                  0 (const uint)
+0:51              direct index ( temp uint)
+0:51                'dti' ( in 3-component vector of uint)
+0:51                Constant:
+0:51                  0 (const int)
+0:51            Constant:
+0:51              3 (const int)
+0:51          Sequence
+0:51            Constant:
+0:51              0 (const int)
+0:51            Constant:
+0:51              1 (const int)
+0:51        subgroupInclusiveMul ( temp 2-component vector of double)
+0:51          vector swizzle ( temp 2-component vector of double)
+0:51            d: direct index for structure ( temp 4-component vector of double)
+0:51              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:51                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:51                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:51                  Constant:
+0:51                    0 (const uint)
+0:51                direct index ( temp uint)
+0:51                  'dti' ( in 3-component vector of uint)
+0:51                  Constant:
+0:51                    0 (const int)
+0:51              Constant:
+0:51                3 (const int)
+0:51            Sequence
+0:51              Constant:
+0:51                0 (const int)
+0:51              Constant:
+0:51                1 (const int)
+0:52      move second child to first child ( temp 3-component vector of double)
+0:52        vector swizzle ( temp 3-component vector of double)
+0:52          d: direct index for structure ( temp 4-component vector of double)
+0:52            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:52              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:52                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:52                Constant:
+0:52                  0 (const uint)
+0:52              direct index ( temp uint)
+0:52                'dti' ( in 3-component vector of uint)
+0:52                Constant:
+0:52                  0 (const int)
+0:52            Constant:
+0:52              3 (const int)
+0:52          Sequence
+0:52            Constant:
+0:52              0 (const int)
+0:52            Constant:
+0:52              1 (const int)
+0:52            Constant:
+0:52              2 (const int)
+0:52        subgroupInclusiveMul ( temp 3-component vector of double)
+0:52          vector swizzle ( temp 3-component vector of double)
+0:52            d: direct index for structure ( temp 4-component vector of double)
+0:52              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:52                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:52                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:52                  Constant:
+0:52                    0 (const uint)
+0:52                direct index ( temp uint)
+0:52                  'dti' ( in 3-component vector of uint)
+0:52                  Constant:
+0:52                    0 (const int)
+0:52              Constant:
+0:52                3 (const int)
+0:52            Sequence
+0:52              Constant:
+0:52                0 (const int)
+0:52              Constant:
+0:52                1 (const int)
+0:52              Constant:
+0:52                2 (const int)
+0:54      move second child to first child ( temp uint)
+0:54        direct index ( temp uint)
+0:54          u: direct index for structure ( temp 4-component vector of uint)
+0:54            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:54              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:54                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:54                Constant:
+0:54                  0 (const uint)
+0:54              direct index ( temp uint)
+0:54                'dti' ( in 3-component vector of uint)
+0:54                Constant:
+0:54                  0 (const int)
+0:54            Constant:
+0:54              0 (const int)
+0:54          Constant:
+0:54            0 (const int)
+0:54        subgroupBallotInclusiveBitCount ( temp uint)
+0:54          subgroupBallot ( temp 4-component vector of uint)
+0:54            Compare Equal ( temp bool)
+0:54              direct index ( temp uint)
+0:54                u: direct index for structure ( temp 4-component vector of uint)
+0:54                  indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:54                    @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:54                      'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:54                      Constant:
+0:54                        0 (const uint)
+0:54                    direct index ( temp uint)
+0:54                      'dti' ( in 3-component vector of uint)
+0:54                      Constant:
+0:54                        0 (const int)
+0:54                  Constant:
+0:54                    0 (const int)
+0:54                Constant:
+0:54                  0 (const int)
+0:54              Constant:
+0:54                0 (const uint)
+0:13  Function Definition: CSMain( ( temp void)
+0:13    Function Parameters: 
+0:?     Sequence
+0:13      move second child to first child ( temp 3-component vector of uint)
+0:?         'dti' ( temp 3-component vector of uint)
+0:?         'dti' ( in 3-component vector of uint GlobalInvocationID)
+0:13      Function Call: @CSMain(vu3; ( temp void)
+0:?         'dti' ( temp 3-component vector of uint)
+0:?   Linker Objects
+0:?     'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:?     'dti' ( in 3-component vector of uint GlobalInvocationID)
+
+// Module Version 10300
+// Generated by (magic number): 80007
+// Id's are bound by 369
+
+                              Capability Shader
+                              Capability Float64
+                              Capability GroupNonUniform
+                              Capability GroupNonUniformArithmetic
+                              Capability GroupNonUniformBallot
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint GLCompute 4  "CSMain" 364
+                              ExecutionMode 4 LocalSize 32 16 1
+                              Source HLSL 500
+                              Name 4  "CSMain"
+                              Name 11  "@CSMain(vu3;"
+                              Name 10  "dti"
+                              Name 20  "Types"
+                              MemberName 20(Types) 0  "u"
+                              MemberName 20(Types) 1  "i"
+                              MemberName 20(Types) 2  "f"
+                              MemberName 20(Types) 3  "d"
+                              Name 22  "data"
+                              MemberName 22(data) 0  "@data"
+                              Name 24  "data"
+                              Name 362  "dti"
+                              Name 364  "dti"
+                              Name 366  "param"
+                              MemberDecorate 20(Types) 0 Offset 0
+                              MemberDecorate 20(Types) 1 Offset 16
+                              MemberDecorate 20(Types) 2 Offset 32
+                              MemberDecorate 20(Types) 3 Offset 64
+                              Decorate 21 ArrayStride 96
+                              MemberDecorate 22(data) 0 Offset 0
+                              Decorate 22(data) BufferBlock
+                              Decorate 24(data) DescriptorSet 0
+                              Decorate 364(dti) BuiltIn GlobalInvocationId
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeInt 32 0
+               7:             TypeVector 6(int) 3
+               8:             TypePointer Function 7(ivec3)
+               9:             TypeFunction 2 8(ptr)
+              13:             TypeVector 6(int) 4
+              14:             TypeInt 32 1
+              15:             TypeVector 14(int) 4
+              16:             TypeFloat 32
+              17:             TypeVector 16(float) 4
+              18:             TypeFloat 64
+              19:             TypeVector 18(float64_t) 4
+       20(Types):             TypeStruct 13(ivec4) 15(ivec4) 17(fvec4) 19(f64vec4)
+              21:             TypeRuntimeArray 20(Types)
+        22(data):             TypeStruct 21
+              23:             TypePointer Uniform 22(data)
+        24(data):     23(ptr) Variable Uniform
+              25:     14(int) Constant 0
+              26:      6(int) Constant 0
+              27:             TypePointer Function 6(int)
+              32:             TypePointer Uniform 13(ivec4)
+              35:      6(int) Constant 3
+              42:             TypePointer Uniform 6(int)
+              51:             TypeVector 6(int) 2
+              72:     14(int) Constant 1
+              75:             TypePointer Uniform 15(ivec4)
+              84:             TypePointer Uniform 14(int)
+              93:             TypeVector 14(int) 2
+             105:             TypeVector 14(int) 3
+             115:     14(int) Constant 2
+             118:             TypePointer Uniform 17(fvec4)
+             127:             TypePointer Uniform 16(float)
+             136:             TypeVector 16(float) 2
+             148:             TypeVector 16(float) 3
+             158:     14(int) Constant 3
+             161:             TypePointer Uniform 19(f64vec4)
+             170:             TypePointer Uniform 18(float64_t)
+             179:             TypeVector 18(float64_t) 2
+             191:             TypeVector 18(float64_t) 3
+             357:             TypeBool
+             363:             TypePointer Input 7(ivec3)
+        364(dti):    363(ptr) Variable Input
+       4(CSMain):           2 Function None 3
+               5:             Label
+        362(dti):      8(ptr) Variable Function
+      366(param):      8(ptr) Variable Function
+             365:    7(ivec3) Load 364(dti)
+                              Store 362(dti) 365
+             367:    7(ivec3) Load 362(dti)
+                              Store 366(param) 367
+             368:           2 FunctionCall 11(@CSMain(vu3;) 366(param)
+                              Return
+                              FunctionEnd
+11(@CSMain(vu3;):           2 Function None 9
+         10(dti):      8(ptr) FunctionParameter
+              12:             Label
+              28:     27(ptr) AccessChain 10(dti) 26
+              29:      6(int) Load 28
+              30:     27(ptr) AccessChain 10(dti) 26
+              31:      6(int) Load 30
+              33:     32(ptr) AccessChain 24(data) 25 31 25
+              34:   13(ivec4) Load 33
+              36:   13(ivec4) GroupNonUniformIAdd 35 InclusiveScan 34
+              37:     32(ptr) AccessChain 24(data) 25 29 25
+                              Store 37 36
+              38:     27(ptr) AccessChain 10(dti) 26
+              39:      6(int) Load 38
+              40:     27(ptr) AccessChain 10(dti) 26
+              41:      6(int) Load 40
+              43:     42(ptr) AccessChain 24(data) 25 41 25 26
+              44:      6(int) Load 43
+              45:      6(int) GroupNonUniformIAdd 35 InclusiveScan 44
+              46:     42(ptr) AccessChain 24(data) 25 39 25 26
+                              Store 46 45
+              47:     27(ptr) AccessChain 10(dti) 26
+              48:      6(int) Load 47
+              49:     27(ptr) AccessChain 10(dti) 26
+              50:      6(int) Load 49
+              52:     32(ptr) AccessChain 24(data) 25 50 25
+              53:   13(ivec4) Load 52
+              54:   51(ivec2) VectorShuffle 53 53 0 1
+              55:   51(ivec2) GroupNonUniformIAdd 35 InclusiveScan 54
+              56:     32(ptr) AccessChain 24(data) 25 48 25
+              57:   13(ivec4) Load 56
+              58:   13(ivec4) VectorShuffle 57 55 4 5 2 3
+                              Store 56 58
+              59:     27(ptr) AccessChain 10(dti) 26
+              60:      6(int) Load 59
+              61:     27(ptr) AccessChain 10(dti) 26
+              62:      6(int) Load 61
+              63:     32(ptr) AccessChain 24(data) 25 62 25
+              64:   13(ivec4) Load 63
+              65:    7(ivec3) VectorShuffle 64 64 0 1 2
+              66:    7(ivec3) GroupNonUniformIAdd 35 InclusiveScan 65
+              67:     32(ptr) AccessChain 24(data) 25 60 25
+              68:   13(ivec4) Load 67
+              69:   13(ivec4) VectorShuffle 68 66 4 5 6 3
+                              Store 67 69
+              70:     27(ptr) AccessChain 10(dti) 26
+              71:      6(int) Load 70
+              73:     27(ptr) AccessChain 10(dti) 26
+              74:      6(int) Load 73
+              76:     75(ptr) AccessChain 24(data) 25 74 72
+              77:   15(ivec4) Load 76
+              78:   15(ivec4) GroupNonUniformIAdd 35 InclusiveScan 77
+              79:     75(ptr) AccessChain 24(data) 25 71 72
+                              Store 79 78
+              80:     27(ptr) AccessChain 10(dti) 26
+              81:      6(int) Load 80
+              82:     27(ptr) AccessChain 10(dti) 26
+              83:      6(int) Load 82
+              85:     84(ptr) AccessChain 24(data) 25 83 72 26
+              86:     14(int) Load 85
+              87:     14(int) GroupNonUniformIAdd 35 InclusiveScan 86
+              88:     84(ptr) AccessChain 24(data) 25 81 72 26
+                              Store 88 87
+              89:     27(ptr) AccessChain 10(dti) 26
+              90:      6(int) Load 89
+              91:     27(ptr) AccessChain 10(dti) 26
+              92:      6(int) Load 91
+              94:     75(ptr) AccessChain 24(data) 25 92 72
+              95:   15(ivec4) Load 94
+              96:   93(ivec2) VectorShuffle 95 95 0 1
+              97:   93(ivec2) GroupNonUniformIAdd 35 InclusiveScan 96
+              98:     75(ptr) AccessChain 24(data) 25 90 72
+              99:   15(ivec4) Load 98
+             100:   15(ivec4) VectorShuffle 99 97 4 5 2 3
+                              Store 98 100
+             101:     27(ptr) AccessChain 10(dti) 26
+             102:      6(int) Load 101
+             103:     27(ptr) AccessChain 10(dti) 26
+             104:      6(int) Load 103
+             106:     75(ptr) AccessChain 24(data) 25 104 72
+             107:   15(ivec4) Load 106
+             108:  105(ivec3) VectorShuffle 107 107 0 1 2
+             109:  105(ivec3) GroupNonUniformIAdd 35 InclusiveScan 108
+             110:     75(ptr) AccessChain 24(data) 25 102 72
+             111:   15(ivec4) Load 110
+             112:   15(ivec4) VectorShuffle 111 109 4 5 6 3
+                              Store 110 112
+             113:     27(ptr) AccessChain 10(dti) 26
+             114:      6(int) Load 113
+             116:     27(ptr) AccessChain 10(dti) 26
+             117:      6(int) Load 116
+             119:    118(ptr) AccessChain 24(data) 25 117 115
+             120:   17(fvec4) Load 119
+             121:   17(fvec4) GroupNonUniformFAdd 35 InclusiveScan 120
+             122:    118(ptr) AccessChain 24(data) 25 114 115
+                              Store 122 121
+             123:     27(ptr) AccessChain 10(dti) 26
+             124:      6(int) Load 123
+             125:     27(ptr) AccessChain 10(dti) 26
+             126:      6(int) Load 125
+             128:    127(ptr) AccessChain 24(data) 25 126 115 26
+             129:   16(float) Load 128
+             130:   16(float) GroupNonUniformFAdd 35 InclusiveScan 129
+             131:    127(ptr) AccessChain 24(data) 25 124 115 26
+                              Store 131 130
+             132:     27(ptr) AccessChain 10(dti) 26
+             133:      6(int) Load 132
+             134:     27(ptr) AccessChain 10(dti) 26
+             135:      6(int) Load 134
+             137:    118(ptr) AccessChain 24(data) 25 135 115
+             138:   17(fvec4) Load 137
+             139:  136(fvec2) VectorShuffle 138 138 0 1
+             140:  136(fvec2) GroupNonUniformFAdd 35 InclusiveScan 139
+             141:    118(ptr) AccessChain 24(data) 25 133 115
+             142:   17(fvec4) Load 141
+             143:   17(fvec4) VectorShuffle 142 140 4 5 2 3
+                              Store 141 143
+             144:     27(ptr) AccessChain 10(dti) 26
+             145:      6(int) Load 144
+             146:     27(ptr) AccessChain 10(dti) 26
+             147:      6(int) Load 146
+             149:    118(ptr) AccessChain 24(data) 25 147 115
+             150:   17(fvec4) Load 149
+             151:  148(fvec3) VectorShuffle 150 150 0 1 2
+             152:  148(fvec3) GroupNonUniformFAdd 35 InclusiveScan 151
+             153:    118(ptr) AccessChain 24(data) 25 145 115
+             154:   17(fvec4) Load 153
+             155:   17(fvec4) VectorShuffle 154 152 4 5 6 3
+                              Store 153 155
+             156:     27(ptr) AccessChain 10(dti) 26
+             157:      6(int) Load 156
+             159:     27(ptr) AccessChain 10(dti) 26
+             160:      6(int) Load 159
+             162:    161(ptr) AccessChain 24(data) 25 160 158
+             163: 19(f64vec4) Load 162
+             164: 19(f64vec4) GroupNonUniformFAdd 35 InclusiveScan 163
+             165:    161(ptr) AccessChain 24(data) 25 157 158
+                              Store 165 164
+             166:     27(ptr) AccessChain 10(dti) 26
+             167:      6(int) Load 166
+             168:     27(ptr) AccessChain 10(dti) 26
+             169:      6(int) Load 168
+             171:    170(ptr) AccessChain 24(data) 25 169 158 26
+             172:18(float64_t) Load 171
+             173:18(float64_t) GroupNonUniformFAdd 35 InclusiveScan 172
+             174:    170(ptr) AccessChain 24(data) 25 167 158 26
+                              Store 174 173
+             175:     27(ptr) AccessChain 10(dti) 26
+             176:      6(int) Load 175
+             177:     27(ptr) AccessChain 10(dti) 26
+             178:      6(int) Load 177
+             180:    161(ptr) AccessChain 24(data) 25 178 158
+             181: 19(f64vec4) Load 180
+             182:179(f64vec2) VectorShuffle 181 181 0 1
+             183:179(f64vec2) GroupNonUniformFAdd 35 InclusiveScan 182
+             184:    161(ptr) AccessChain 24(data) 25 176 158
+             185: 19(f64vec4) Load 184
+             186: 19(f64vec4) VectorShuffle 185 183 4 5 2 3
+                              Store 184 186
+             187:     27(ptr) AccessChain 10(dti) 26
+             188:      6(int) Load 187
+             189:     27(ptr) AccessChain 10(dti) 26
+             190:      6(int) Load 189
+             192:    161(ptr) AccessChain 24(data) 25 190 158
+             193: 19(f64vec4) Load 192
+             194:191(f64vec3) VectorShuffle 193 193 0 1 2
+             195:191(f64vec3) GroupNonUniformFAdd 35 InclusiveScan 194
+             196:    161(ptr) AccessChain 24(data) 25 188 158
+             197: 19(f64vec4) Load 196
+             198: 19(f64vec4) VectorShuffle 197 195 4 5 6 3
+                              Store 196 198
+             199:     27(ptr) AccessChain 10(dti) 26
+             200:      6(int) Load 199
+             201:     27(ptr) AccessChain 10(dti) 26
+             202:      6(int) Load 201
+             203:     32(ptr) AccessChain 24(data) 25 202 25
+             204:   13(ivec4) Load 203
+             205:   13(ivec4) GroupNonUniformIMul 35 InclusiveScan 204
+             206:     32(ptr) AccessChain 24(data) 25 200 25
+                              Store 206 205
+             207:     27(ptr) AccessChain 10(dti) 26
+             208:      6(int) Load 207
+             209:     27(ptr) AccessChain 10(dti) 26
+             210:      6(int) Load 209
+             211:     42(ptr) AccessChain 24(data) 25 210 25 26
+             212:      6(int) Load 211
+             213:      6(int) GroupNonUniformIMul 35 InclusiveScan 212
+             214:     42(ptr) AccessChain 24(data) 25 208 25 26
+                              Store 214 213
+             215:     27(ptr) AccessChain 10(dti) 26
+             216:      6(int) Load 215
+             217:     27(ptr) AccessChain 10(dti) 26
+             218:      6(int) Load 217
+             219:     32(ptr) AccessChain 24(data) 25 218 25
+             220:   13(ivec4) Load 219
+             221:   51(ivec2) VectorShuffle 220 220 0 1
+             222:   51(ivec2) GroupNonUniformIMul 35 InclusiveScan 221
+             223:     32(ptr) AccessChain 24(data) 25 216 25
+             224:   13(ivec4) Load 223
+             225:   13(ivec4) VectorShuffle 224 222 4 5 2 3
+                              Store 223 225
+             226:     27(ptr) AccessChain 10(dti) 26
+             227:      6(int) Load 226
+             228:     27(ptr) AccessChain 10(dti) 26
+             229:      6(int) Load 228
+             230:     32(ptr) AccessChain 24(data) 25 229 25
+             231:   13(ivec4) Load 230
+             232:    7(ivec3) VectorShuffle 231 231 0 1 2
+             233:    7(ivec3) GroupNonUniformIMul 35 InclusiveScan 232
+             234:     32(ptr) AccessChain 24(data) 25 227 25
+             235:   13(ivec4) Load 234
+             236:   13(ivec4) VectorShuffle 235 233 4 5 6 3
+                              Store 234 236
+             237:     27(ptr) AccessChain 10(dti) 26
+             238:      6(int) Load 237
+             239:     27(ptr) AccessChain 10(dti) 26
+             240:      6(int) Load 239
+             241:     75(ptr) AccessChain 24(data) 25 240 72
+             242:   15(ivec4) Load 241
+             243:   15(ivec4) GroupNonUniformIMul 35 InclusiveScan 242
+             244:     75(ptr) AccessChain 24(data) 25 238 72
+                              Store 244 243
+             245:     27(ptr) AccessChain 10(dti) 26
+             246:      6(int) Load 245
+             247:     27(ptr) AccessChain 10(dti) 26
+             248:      6(int) Load 247
+             249:     84(ptr) AccessChain 24(data) 25 248 72 26
+             250:     14(int) Load 249
+             251:     14(int) GroupNonUniformIMul 35 InclusiveScan 250
+             252:     84(ptr) AccessChain 24(data) 25 246 72 26
+                              Store 252 251
+             253:     27(ptr) AccessChain 10(dti) 26
+             254:      6(int) Load 253
+             255:     27(ptr) AccessChain 10(dti) 26
+             256:      6(int) Load 255
+             257:     75(ptr) AccessChain 24(data) 25 256 72
+             258:   15(ivec4) Load 257
+             259:   93(ivec2) VectorShuffle 258 258 0 1
+             260:   93(ivec2) GroupNonUniformIMul 35 InclusiveScan 259
+             261:     75(ptr) AccessChain 24(data) 25 254 72
+             262:   15(ivec4) Load 261
+             263:   15(ivec4) VectorShuffle 262 260 4 5 2 3
+                              Store 261 263
+             264:     27(ptr) AccessChain 10(dti) 26
+             265:      6(int) Load 264
+             266:     27(ptr) AccessChain 10(dti) 26
+             267:      6(int) Load 266
+             268:     75(ptr) AccessChain 24(data) 25 267 72
+             269:   15(ivec4) Load 268
+             270:  105(ivec3) VectorShuffle 269 269 0 1 2
+             271:  105(ivec3) GroupNonUniformIMul 35 InclusiveScan 270
+             272:     75(ptr) AccessChain 24(data) 25 265 72
+             273:   15(ivec4) Load 272
+             274:   15(ivec4) VectorShuffle 273 271 4 5 6 3
+                              Store 272 274
+             275:     27(ptr) AccessChain 10(dti) 26
+             276:      6(int) Load 275
+             277:     27(ptr) AccessChain 10(dti) 26
+             278:      6(int) Load 277
+             279:    118(ptr) AccessChain 24(data) 25 278 115
+             280:   17(fvec4) Load 279
+             281:   17(fvec4) GroupNonUniformFMul 35 InclusiveScan 280
+             282:    118(ptr) AccessChain 24(data) 25 276 115
+                              Store 282 281
+             283:     27(ptr) AccessChain 10(dti) 26
+             284:      6(int) Load 283
+             285:     27(ptr) AccessChain 10(dti) 26
+             286:      6(int) Load 285
+             287:    127(ptr) AccessChain 24(data) 25 286 115 26
+             288:   16(float) Load 287
+             289:   16(float) GroupNonUniformFMul 35 InclusiveScan 288
+             290:    127(ptr) AccessChain 24(data) 25 284 115 26
+                              Store 290 289
+             291:     27(ptr) AccessChain 10(dti) 26
+             292:      6(int) Load 291
+             293:     27(ptr) AccessChain 10(dti) 26
+             294:      6(int) Load 293
+             295:    118(ptr) AccessChain 24(data) 25 294 115
+             296:   17(fvec4) Load 295
+             297:  136(fvec2) VectorShuffle 296 296 0 1
+             298:  136(fvec2) GroupNonUniformFMul 35 InclusiveScan 297
+             299:    118(ptr) AccessChain 24(data) 25 292 115
+             300:   17(fvec4) Load 299
+             301:   17(fvec4) VectorShuffle 300 298 4 5 2 3
+                              Store 299 301
+             302:     27(ptr) AccessChain 10(dti) 26
+             303:      6(int) Load 302
+             304:     27(ptr) AccessChain 10(dti) 26
+             305:      6(int) Load 304
+             306:    118(ptr) AccessChain 24(data) 25 305 115
+             307:   17(fvec4) Load 306
+             308:  148(fvec3) VectorShuffle 307 307 0 1 2
+             309:  148(fvec3) GroupNonUniformFMul 35 InclusiveScan 308
+             310:    118(ptr) AccessChain 24(data) 25 303 115
+             311:   17(fvec4) Load 310
+             312:   17(fvec4) VectorShuffle 311 309 4 5 6 3
+                              Store 310 312
+             313:     27(ptr) AccessChain 10(dti) 26
+             314:      6(int) Load 313
+             315:     27(ptr) AccessChain 10(dti) 26
+             316:      6(int) Load 315
+             317:    161(ptr) AccessChain 24(data) 25 316 158
+             318: 19(f64vec4) Load 317
+             319: 19(f64vec4) GroupNonUniformFMul 35 InclusiveScan 318
+             320:    161(ptr) AccessChain 24(data) 25 314 158
+                              Store 320 319
+             321:     27(ptr) AccessChain 10(dti) 26
+             322:      6(int) Load 321
+             323:     27(ptr) AccessChain 10(dti) 26
+             324:      6(int) Load 323
+             325:    170(ptr) AccessChain 24(data) 25 324 158 26
+             326:18(float64_t) Load 325
+             327:18(float64_t) GroupNonUniformFMul 35 InclusiveScan 326
+             328:    170(ptr) AccessChain 24(data) 25 322 158 26
+                              Store 328 327
+             329:     27(ptr) AccessChain 10(dti) 26
+             330:      6(int) Load 329
+             331:     27(ptr) AccessChain 10(dti) 26
+             332:      6(int) Load 331
+             333:    161(ptr) AccessChain 24(data) 25 332 158
+             334: 19(f64vec4) Load 333
+             335:179(f64vec2) VectorShuffle 334 334 0 1
+             336:179(f64vec2) GroupNonUniformFMul 35 InclusiveScan 335
+             337:    161(ptr) AccessChain 24(data) 25 330 158
+             338: 19(f64vec4) Load 337
+             339: 19(f64vec4) VectorShuffle 338 336 4 5 2 3
+                              Store 337 339
+             340:     27(ptr) AccessChain 10(dti) 26
+             341:      6(int) Load 340
+             342:     27(ptr) AccessChain 10(dti) 26
+             343:      6(int) Load 342
+             344:    161(ptr) AccessChain 24(data) 25 343 158
+             345: 19(f64vec4) Load 344
+             346:191(f64vec3) VectorShuffle 345 345 0 1 2
+             347:191(f64vec3) GroupNonUniformFMul 35 InclusiveScan 346
+             348:    161(ptr) AccessChain 24(data) 25 341 158
+             349: 19(f64vec4) Load 348
+             350: 19(f64vec4) VectorShuffle 349 347 4 5 6 3
+                              Store 348 350
+             351:     27(ptr) AccessChain 10(dti) 26
+             352:      6(int) Load 351
+             353:     27(ptr) AccessChain 10(dti) 26
+             354:      6(int) Load 353
+             355:     42(ptr) AccessChain 24(data) 25 354 25 26
+             356:      6(int) Load 355
+             358:   357(bool) IEqual 356 26
+             359:   13(ivec4) GroupNonUniformBallot 35 358
+             360:      6(int) GroupNonUniformBallotBitCount 35 InclusiveScan 359
+             361:     42(ptr) AccessChain 24(data) 25 352 25 26
+                              Store 361 360
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/hlsl.wavequad.comp.out b/Test/baseResults/hlsl.wavequad.comp.out
new file mode 100644
index 0000000..56ef6d7
--- /dev/null
+++ b/Test/baseResults/hlsl.wavequad.comp.out
@@ -0,0 +1,9299 @@
+hlsl.wavequad.comp
+Shader version: 500
+local_size = (32, 16, 1)
+0:? Sequence
+0:13  Function Definition: @CSMain(vu3; ( temp void)
+0:13    Function Parameters: 
+0:13      'dti' ( in 3-component vector of uint)
+0:?     Sequence
+0:14      move second child to first child ( temp 4-component vector of uint)
+0:14        u: direct index for structure ( temp 4-component vector of uint)
+0:14          indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:14            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:14              'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:14              Constant:
+0:14                0 (const uint)
+0:14            direct index ( temp uint)
+0:14              'dti' ( in 3-component vector of uint)
+0:14              Constant:
+0:14                0 (const int)
+0:14          Constant:
+0:14            0 (const int)
+0:14        subgroupQuadBroadcast ( temp 4-component vector of uint)
+0:14          u: direct index for structure ( temp 4-component vector of uint)
+0:14            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:14              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:14                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:14                Constant:
+0:14                  0 (const uint)
+0:14              direct index ( temp uint)
+0:14                'dti' ( in 3-component vector of uint)
+0:14                Constant:
+0:14                  0 (const int)
+0:14            Constant:
+0:14              0 (const int)
+0:14          Constant:
+0:14            0 (const uint)
+0:15      move second child to first child ( temp uint)
+0:15        direct index ( temp uint)
+0:15          u: direct index for structure ( temp 4-component vector of uint)
+0:15            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:15              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:15                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:15                Constant:
+0:15                  0 (const uint)
+0:15              direct index ( temp uint)
+0:15                'dti' ( in 3-component vector of uint)
+0:15                Constant:
+0:15                  0 (const int)
+0:15            Constant:
+0:15              0 (const int)
+0:15          Constant:
+0:15            0 (const int)
+0:15        subgroupQuadBroadcast ( temp uint)
+0:15          direct index ( temp uint)
+0:15            u: direct index for structure ( temp 4-component vector of uint)
+0:15              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:15                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:15                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:15                  Constant:
+0:15                    0 (const uint)
+0:15                direct index ( temp uint)
+0:15                  'dti' ( in 3-component vector of uint)
+0:15                  Constant:
+0:15                    0 (const int)
+0:15              Constant:
+0:15                0 (const int)
+0:15            Constant:
+0:15              0 (const int)
+0:15          Constant:
+0:15            0 (const uint)
+0:16      move second child to first child ( temp 2-component vector of uint)
+0:16        vector swizzle ( temp 2-component vector of uint)
+0:16          u: direct index for structure ( temp 4-component vector of uint)
+0:16            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:16              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:16                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:16                Constant:
+0:16                  0 (const uint)
+0:16              direct index ( temp uint)
+0:16                'dti' ( in 3-component vector of uint)
+0:16                Constant:
+0:16                  0 (const int)
+0:16            Constant:
+0:16              0 (const int)
+0:16          Sequence
+0:16            Constant:
+0:16              0 (const int)
+0:16            Constant:
+0:16              1 (const int)
+0:16        subgroupQuadBroadcast ( temp 2-component vector of uint)
+0:16          vector swizzle ( temp 2-component vector of uint)
+0:16            u: direct index for structure ( temp 4-component vector of uint)
+0:16              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:16                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:16                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:16                  Constant:
+0:16                    0 (const uint)
+0:16                direct index ( temp uint)
+0:16                  'dti' ( in 3-component vector of uint)
+0:16                  Constant:
+0:16                    0 (const int)
+0:16              Constant:
+0:16                0 (const int)
+0:16            Sequence
+0:16              Constant:
+0:16                0 (const int)
+0:16              Constant:
+0:16                1 (const int)
+0:16          Constant:
+0:16            0 (const uint)
+0:17      move second child to first child ( temp 3-component vector of uint)
+0:17        vector swizzle ( temp 3-component vector of uint)
+0:17          u: direct index for structure ( temp 4-component vector of uint)
+0:17            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:17              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:17                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:17                Constant:
+0:17                  0 (const uint)
+0:17              direct index ( temp uint)
+0:17                'dti' ( in 3-component vector of uint)
+0:17                Constant:
+0:17                  0 (const int)
+0:17            Constant:
+0:17              0 (const int)
+0:17          Sequence
+0:17            Constant:
+0:17              0 (const int)
+0:17            Constant:
+0:17              1 (const int)
+0:17            Constant:
+0:17              2 (const int)
+0:17        subgroupQuadBroadcast ( temp 3-component vector of uint)
+0:17          vector swizzle ( temp 3-component vector of uint)
+0:17            u: direct index for structure ( temp 4-component vector of uint)
+0:17              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:17                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:17                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:17                  Constant:
+0:17                    0 (const uint)
+0:17                direct index ( temp uint)
+0:17                  'dti' ( in 3-component vector of uint)
+0:17                  Constant:
+0:17                    0 (const int)
+0:17              Constant:
+0:17                0 (const int)
+0:17            Sequence
+0:17              Constant:
+0:17                0 (const int)
+0:17              Constant:
+0:17                1 (const int)
+0:17              Constant:
+0:17                2 (const int)
+0:17          Constant:
+0:17            0 (const uint)
+0:19      move second child to first child ( temp 4-component vector of int)
+0:19        i: direct index for structure ( temp 4-component vector of int)
+0:19          indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:19            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:19              'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:19              Constant:
+0:19                0 (const uint)
+0:19            direct index ( temp uint)
+0:19              'dti' ( in 3-component vector of uint)
+0:19              Constant:
+0:19                0 (const int)
+0:19          Constant:
+0:19            1 (const int)
+0:19        subgroupQuadBroadcast ( temp 4-component vector of int)
+0:19          i: direct index for structure ( temp 4-component vector of int)
+0:19            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:19              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:19                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:19                Constant:
+0:19                  0 (const uint)
+0:19              direct index ( temp uint)
+0:19                'dti' ( in 3-component vector of uint)
+0:19                Constant:
+0:19                  0 (const int)
+0:19            Constant:
+0:19              1 (const int)
+0:19          Constant:
+0:19            0 (const uint)
+0:20      move second child to first child ( temp int)
+0:20        direct index ( temp int)
+0:20          i: direct index for structure ( temp 4-component vector of int)
+0:20            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:20              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:20                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:20                Constant:
+0:20                  0 (const uint)
+0:20              direct index ( temp uint)
+0:20                'dti' ( in 3-component vector of uint)
+0:20                Constant:
+0:20                  0 (const int)
+0:20            Constant:
+0:20              1 (const int)
+0:20          Constant:
+0:20            0 (const int)
+0:20        subgroupQuadBroadcast ( temp int)
+0:20          direct index ( temp int)
+0:20            i: direct index for structure ( temp 4-component vector of int)
+0:20              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:20                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:20                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:20                  Constant:
+0:20                    0 (const uint)
+0:20                direct index ( temp uint)
+0:20                  'dti' ( in 3-component vector of uint)
+0:20                  Constant:
+0:20                    0 (const int)
+0:20              Constant:
+0:20                1 (const int)
+0:20            Constant:
+0:20              0 (const int)
+0:20          Constant:
+0:20            0 (const uint)
+0:21      move second child to first child ( temp 2-component vector of int)
+0:21        vector swizzle ( temp 2-component vector of int)
+0:21          i: direct index for structure ( temp 4-component vector of int)
+0:21            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:21              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:21                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:21                Constant:
+0:21                  0 (const uint)
+0:21              direct index ( temp uint)
+0:21                'dti' ( in 3-component vector of uint)
+0:21                Constant:
+0:21                  0 (const int)
+0:21            Constant:
+0:21              1 (const int)
+0:21          Sequence
+0:21            Constant:
+0:21              0 (const int)
+0:21            Constant:
+0:21              1 (const int)
+0:21        subgroupQuadBroadcast ( temp 2-component vector of int)
+0:21          vector swizzle ( temp 2-component vector of int)
+0:21            i: direct index for structure ( temp 4-component vector of int)
+0:21              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:21                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:21                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:21                  Constant:
+0:21                    0 (const uint)
+0:21                direct index ( temp uint)
+0:21                  'dti' ( in 3-component vector of uint)
+0:21                  Constant:
+0:21                    0 (const int)
+0:21              Constant:
+0:21                1 (const int)
+0:21            Sequence
+0:21              Constant:
+0:21                0 (const int)
+0:21              Constant:
+0:21                1 (const int)
+0:21          Constant:
+0:21            0 (const uint)
+0:22      move second child to first child ( temp 3-component vector of int)
+0:22        vector swizzle ( temp 3-component vector of int)
+0:22          i: direct index for structure ( temp 4-component vector of int)
+0:22            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:22              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:22                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:22                Constant:
+0:22                  0 (const uint)
+0:22              direct index ( temp uint)
+0:22                'dti' ( in 3-component vector of uint)
+0:22                Constant:
+0:22                  0 (const int)
+0:22            Constant:
+0:22              1 (const int)
+0:22          Sequence
+0:22            Constant:
+0:22              0 (const int)
+0:22            Constant:
+0:22              1 (const int)
+0:22            Constant:
+0:22              2 (const int)
+0:22        subgroupQuadBroadcast ( temp 3-component vector of int)
+0:22          vector swizzle ( temp 3-component vector of int)
+0:22            i: direct index for structure ( temp 4-component vector of int)
+0:22              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:22                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:22                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:22                  Constant:
+0:22                    0 (const uint)
+0:22                direct index ( temp uint)
+0:22                  'dti' ( in 3-component vector of uint)
+0:22                  Constant:
+0:22                    0 (const int)
+0:22              Constant:
+0:22                1 (const int)
+0:22            Sequence
+0:22              Constant:
+0:22                0 (const int)
+0:22              Constant:
+0:22                1 (const int)
+0:22              Constant:
+0:22                2 (const int)
+0:22          Constant:
+0:22            0 (const uint)
+0:24      move second child to first child ( temp 4-component vector of float)
+0:24        f: direct index for structure ( temp 4-component vector of float)
+0:24          indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:24            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:24              'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:24              Constant:
+0:24                0 (const uint)
+0:24            direct index ( temp uint)
+0:24              'dti' ( in 3-component vector of uint)
+0:24              Constant:
+0:24                0 (const int)
+0:24          Constant:
+0:24            2 (const int)
+0:24        subgroupQuadBroadcast ( temp 4-component vector of float)
+0:24          f: direct index for structure ( temp 4-component vector of float)
+0:24            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:24              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:24                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:24                Constant:
+0:24                  0 (const uint)
+0:24              direct index ( temp uint)
+0:24                'dti' ( in 3-component vector of uint)
+0:24                Constant:
+0:24                  0 (const int)
+0:24            Constant:
+0:24              2 (const int)
+0:24          Constant:
+0:24            0 (const uint)
+0:25      move second child to first child ( temp float)
+0:25        direct index ( temp float)
+0:25          f: direct index for structure ( temp 4-component vector of float)
+0:25            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:25              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:25                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:25                Constant:
+0:25                  0 (const uint)
+0:25              direct index ( temp uint)
+0:25                'dti' ( in 3-component vector of uint)
+0:25                Constant:
+0:25                  0 (const int)
+0:25            Constant:
+0:25              2 (const int)
+0:25          Constant:
+0:25            0 (const int)
+0:25        subgroupQuadBroadcast ( temp float)
+0:25          direct index ( temp float)
+0:25            f: direct index for structure ( temp 4-component vector of float)
+0:25              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:25                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:25                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:25                  Constant:
+0:25                    0 (const uint)
+0:25                direct index ( temp uint)
+0:25                  'dti' ( in 3-component vector of uint)
+0:25                  Constant:
+0:25                    0 (const int)
+0:25              Constant:
+0:25                2 (const int)
+0:25            Constant:
+0:25              0 (const int)
+0:25          Constant:
+0:25            0 (const uint)
+0:26      move second child to first child ( temp 2-component vector of float)
+0:26        vector swizzle ( temp 2-component vector of float)
+0:26          f: direct index for structure ( temp 4-component vector of float)
+0:26            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:26              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:26                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:26                Constant:
+0:26                  0 (const uint)
+0:26              direct index ( temp uint)
+0:26                'dti' ( in 3-component vector of uint)
+0:26                Constant:
+0:26                  0 (const int)
+0:26            Constant:
+0:26              2 (const int)
+0:26          Sequence
+0:26            Constant:
+0:26              0 (const int)
+0:26            Constant:
+0:26              1 (const int)
+0:26        subgroupQuadBroadcast ( temp 2-component vector of float)
+0:26          vector swizzle ( temp 2-component vector of float)
+0:26            f: direct index for structure ( temp 4-component vector of float)
+0:26              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:26                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:26                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:26                  Constant:
+0:26                    0 (const uint)
+0:26                direct index ( temp uint)
+0:26                  'dti' ( in 3-component vector of uint)
+0:26                  Constant:
+0:26                    0 (const int)
+0:26              Constant:
+0:26                2 (const int)
+0:26            Sequence
+0:26              Constant:
+0:26                0 (const int)
+0:26              Constant:
+0:26                1 (const int)
+0:26          Constant:
+0:26            0 (const uint)
+0:27      move second child to first child ( temp 3-component vector of float)
+0:27        vector swizzle ( temp 3-component vector of float)
+0:27          f: direct index for structure ( temp 4-component vector of float)
+0:27            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:27              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:27                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:27                Constant:
+0:27                  0 (const uint)
+0:27              direct index ( temp uint)
+0:27                'dti' ( in 3-component vector of uint)
+0:27                Constant:
+0:27                  0 (const int)
+0:27            Constant:
+0:27              2 (const int)
+0:27          Sequence
+0:27            Constant:
+0:27              0 (const int)
+0:27            Constant:
+0:27              1 (const int)
+0:27            Constant:
+0:27              2 (const int)
+0:27        subgroupQuadBroadcast ( temp 3-component vector of float)
+0:27          vector swizzle ( temp 3-component vector of float)
+0:27            f: direct index for structure ( temp 4-component vector of float)
+0:27              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:27                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:27                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:27                  Constant:
+0:27                    0 (const uint)
+0:27                direct index ( temp uint)
+0:27                  'dti' ( in 3-component vector of uint)
+0:27                  Constant:
+0:27                    0 (const int)
+0:27              Constant:
+0:27                2 (const int)
+0:27            Sequence
+0:27              Constant:
+0:27                0 (const int)
+0:27              Constant:
+0:27                1 (const int)
+0:27              Constant:
+0:27                2 (const int)
+0:27          Constant:
+0:27            0 (const uint)
+0:29      move second child to first child ( temp 4-component vector of double)
+0:29        d: direct index for structure ( temp 4-component vector of double)
+0:29          indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:29            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:29              'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:29              Constant:
+0:29                0 (const uint)
+0:29            direct index ( temp uint)
+0:29              'dti' ( in 3-component vector of uint)
+0:29              Constant:
+0:29                0 (const int)
+0:29          Constant:
+0:29            3 (const int)
+0:29        subgroupQuadBroadcast ( temp 4-component vector of double)
+0:29          d: direct index for structure ( temp 4-component vector of double)
+0:29            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:29              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:29                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:29                Constant:
+0:29                  0 (const uint)
+0:29              direct index ( temp uint)
+0:29                'dti' ( in 3-component vector of uint)
+0:29                Constant:
+0:29                  0 (const int)
+0:29            Constant:
+0:29              3 (const int)
+0:29          Constant:
+0:29            0 (const uint)
+0:30      move second child to first child ( temp double)
+0:30        direct index ( temp double)
+0:30          d: direct index for structure ( temp 4-component vector of double)
+0:30            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:30              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:30                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:30                Constant:
+0:30                  0 (const uint)
+0:30              direct index ( temp uint)
+0:30                'dti' ( in 3-component vector of uint)
+0:30                Constant:
+0:30                  0 (const int)
+0:30            Constant:
+0:30              3 (const int)
+0:30          Constant:
+0:30            0 (const int)
+0:30        subgroupQuadBroadcast ( temp double)
+0:30          direct index ( temp double)
+0:30            d: direct index for structure ( temp 4-component vector of double)
+0:30              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:30                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:30                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:30                  Constant:
+0:30                    0 (const uint)
+0:30                direct index ( temp uint)
+0:30                  'dti' ( in 3-component vector of uint)
+0:30                  Constant:
+0:30                    0 (const int)
+0:30              Constant:
+0:30                3 (const int)
+0:30            Constant:
+0:30              0 (const int)
+0:30          Constant:
+0:30            0 (const uint)
+0:31      move second child to first child ( temp 2-component vector of double)
+0:31        vector swizzle ( temp 2-component vector of double)
+0:31          d: direct index for structure ( temp 4-component vector of double)
+0:31            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:31              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:31                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:31                Constant:
+0:31                  0 (const uint)
+0:31              direct index ( temp uint)
+0:31                'dti' ( in 3-component vector of uint)
+0:31                Constant:
+0:31                  0 (const int)
+0:31            Constant:
+0:31              3 (const int)
+0:31          Sequence
+0:31            Constant:
+0:31              0 (const int)
+0:31            Constant:
+0:31              1 (const int)
+0:31        subgroupQuadBroadcast ( temp 2-component vector of double)
+0:31          vector swizzle ( temp 2-component vector of double)
+0:31            d: direct index for structure ( temp 4-component vector of double)
+0:31              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:31                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:31                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:31                  Constant:
+0:31                    0 (const uint)
+0:31                direct index ( temp uint)
+0:31                  'dti' ( in 3-component vector of uint)
+0:31                  Constant:
+0:31                    0 (const int)
+0:31              Constant:
+0:31                3 (const int)
+0:31            Sequence
+0:31              Constant:
+0:31                0 (const int)
+0:31              Constant:
+0:31                1 (const int)
+0:31          Constant:
+0:31            0 (const uint)
+0:32      move second child to first child ( temp 3-component vector of double)
+0:32        vector swizzle ( temp 3-component vector of double)
+0:32          d: direct index for structure ( temp 4-component vector of double)
+0:32            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:32              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:32                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:32                Constant:
+0:32                  0 (const uint)
+0:32              direct index ( temp uint)
+0:32                'dti' ( in 3-component vector of uint)
+0:32                Constant:
+0:32                  0 (const int)
+0:32            Constant:
+0:32              3 (const int)
+0:32          Sequence
+0:32            Constant:
+0:32              0 (const int)
+0:32            Constant:
+0:32              1 (const int)
+0:32            Constant:
+0:32              2 (const int)
+0:32        subgroupQuadBroadcast ( temp 3-component vector of double)
+0:32          vector swizzle ( temp 3-component vector of double)
+0:32            d: direct index for structure ( temp 4-component vector of double)
+0:32              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:32                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:32                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:32                  Constant:
+0:32                    0 (const uint)
+0:32                direct index ( temp uint)
+0:32                  'dti' ( in 3-component vector of uint)
+0:32                  Constant:
+0:32                    0 (const int)
+0:32              Constant:
+0:32                3 (const int)
+0:32            Sequence
+0:32              Constant:
+0:32                0 (const int)
+0:32              Constant:
+0:32                1 (const int)
+0:32              Constant:
+0:32                2 (const int)
+0:32          Constant:
+0:32            0 (const uint)
+0:34      move second child to first child ( temp 4-component vector of uint)
+0:34        u: direct index for structure ( temp 4-component vector of uint)
+0:34          indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:34            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:34              'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:34              Constant:
+0:34                0 (const uint)
+0:34            direct index ( temp uint)
+0:34              'dti' ( in 3-component vector of uint)
+0:34              Constant:
+0:34                0 (const int)
+0:34          Constant:
+0:34            0 (const int)
+0:34        subgroupQuadBroadcast ( temp 4-component vector of uint)
+0:34          u: direct index for structure ( temp 4-component vector of uint)
+0:34            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:34              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:34                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:34                Constant:
+0:34                  0 (const uint)
+0:34              direct index ( temp uint)
+0:34                'dti' ( in 3-component vector of uint)
+0:34                Constant:
+0:34                  0 (const int)
+0:34            Constant:
+0:34              0 (const int)
+0:34          Constant:
+0:34            1 (const uint)
+0:35      move second child to first child ( temp uint)
+0:35        direct index ( temp uint)
+0:35          u: direct index for structure ( temp 4-component vector of uint)
+0:35            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:35              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:35                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:35                Constant:
+0:35                  0 (const uint)
+0:35              direct index ( temp uint)
+0:35                'dti' ( in 3-component vector of uint)
+0:35                Constant:
+0:35                  0 (const int)
+0:35            Constant:
+0:35              0 (const int)
+0:35          Constant:
+0:35            0 (const int)
+0:35        subgroupQuadBroadcast ( temp uint)
+0:35          direct index ( temp uint)
+0:35            u: direct index for structure ( temp 4-component vector of uint)
+0:35              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:35                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:35                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:35                  Constant:
+0:35                    0 (const uint)
+0:35                direct index ( temp uint)
+0:35                  'dti' ( in 3-component vector of uint)
+0:35                  Constant:
+0:35                    0 (const int)
+0:35              Constant:
+0:35                0 (const int)
+0:35            Constant:
+0:35              0 (const int)
+0:35          Constant:
+0:35            1 (const uint)
+0:36      move second child to first child ( temp 2-component vector of uint)
+0:36        vector swizzle ( temp 2-component vector of uint)
+0:36          u: direct index for structure ( temp 4-component vector of uint)
+0:36            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:36              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:36                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:36                Constant:
+0:36                  0 (const uint)
+0:36              direct index ( temp uint)
+0:36                'dti' ( in 3-component vector of uint)
+0:36                Constant:
+0:36                  0 (const int)
+0:36            Constant:
+0:36              0 (const int)
+0:36          Sequence
+0:36            Constant:
+0:36              0 (const int)
+0:36            Constant:
+0:36              1 (const int)
+0:36        subgroupQuadBroadcast ( temp 2-component vector of uint)
+0:36          vector swizzle ( temp 2-component vector of uint)
+0:36            u: direct index for structure ( temp 4-component vector of uint)
+0:36              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:36                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:36                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:36                  Constant:
+0:36                    0 (const uint)
+0:36                direct index ( temp uint)
+0:36                  'dti' ( in 3-component vector of uint)
+0:36                  Constant:
+0:36                    0 (const int)
+0:36              Constant:
+0:36                0 (const int)
+0:36            Sequence
+0:36              Constant:
+0:36                0 (const int)
+0:36              Constant:
+0:36                1 (const int)
+0:36          Constant:
+0:36            1 (const uint)
+0:37      move second child to first child ( temp 3-component vector of uint)
+0:37        vector swizzle ( temp 3-component vector of uint)
+0:37          u: direct index for structure ( temp 4-component vector of uint)
+0:37            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:37              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:37                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:37                Constant:
+0:37                  0 (const uint)
+0:37              direct index ( temp uint)
+0:37                'dti' ( in 3-component vector of uint)
+0:37                Constant:
+0:37                  0 (const int)
+0:37            Constant:
+0:37              0 (const int)
+0:37          Sequence
+0:37            Constant:
+0:37              0 (const int)
+0:37            Constant:
+0:37              1 (const int)
+0:37            Constant:
+0:37              2 (const int)
+0:37        subgroupQuadBroadcast ( temp 3-component vector of uint)
+0:37          vector swizzle ( temp 3-component vector of uint)
+0:37            u: direct index for structure ( temp 4-component vector of uint)
+0:37              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:37                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:37                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:37                  Constant:
+0:37                    0 (const uint)
+0:37                direct index ( temp uint)
+0:37                  'dti' ( in 3-component vector of uint)
+0:37                  Constant:
+0:37                    0 (const int)
+0:37              Constant:
+0:37                0 (const int)
+0:37            Sequence
+0:37              Constant:
+0:37                0 (const int)
+0:37              Constant:
+0:37                1 (const int)
+0:37              Constant:
+0:37                2 (const int)
+0:37          Constant:
+0:37            1 (const uint)
+0:39      move second child to first child ( temp 4-component vector of int)
+0:39        i: direct index for structure ( temp 4-component vector of int)
+0:39          indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:39            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:39              'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:39              Constant:
+0:39                0 (const uint)
+0:39            direct index ( temp uint)
+0:39              'dti' ( in 3-component vector of uint)
+0:39              Constant:
+0:39                0 (const int)
+0:39          Constant:
+0:39            1 (const int)
+0:39        subgroupQuadBroadcast ( temp 4-component vector of int)
+0:39          i: direct index for structure ( temp 4-component vector of int)
+0:39            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:39              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:39                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:39                Constant:
+0:39                  0 (const uint)
+0:39              direct index ( temp uint)
+0:39                'dti' ( in 3-component vector of uint)
+0:39                Constant:
+0:39                  0 (const int)
+0:39            Constant:
+0:39              1 (const int)
+0:39          Constant:
+0:39            1 (const uint)
+0:40      move second child to first child ( temp int)
+0:40        direct index ( temp int)
+0:40          i: direct index for structure ( temp 4-component vector of int)
+0:40            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:40              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:40                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:40                Constant:
+0:40                  0 (const uint)
+0:40              direct index ( temp uint)
+0:40                'dti' ( in 3-component vector of uint)
+0:40                Constant:
+0:40                  0 (const int)
+0:40            Constant:
+0:40              1 (const int)
+0:40          Constant:
+0:40            0 (const int)
+0:40        subgroupQuadBroadcast ( temp int)
+0:40          direct index ( temp int)
+0:40            i: direct index for structure ( temp 4-component vector of int)
+0:40              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:40                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:40                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:40                  Constant:
+0:40                    0 (const uint)
+0:40                direct index ( temp uint)
+0:40                  'dti' ( in 3-component vector of uint)
+0:40                  Constant:
+0:40                    0 (const int)
+0:40              Constant:
+0:40                1 (const int)
+0:40            Constant:
+0:40              0 (const int)
+0:40          Constant:
+0:40            1 (const uint)
+0:41      move second child to first child ( temp 2-component vector of int)
+0:41        vector swizzle ( temp 2-component vector of int)
+0:41          i: direct index for structure ( temp 4-component vector of int)
+0:41            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:41              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:41                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:41                Constant:
+0:41                  0 (const uint)
+0:41              direct index ( temp uint)
+0:41                'dti' ( in 3-component vector of uint)
+0:41                Constant:
+0:41                  0 (const int)
+0:41            Constant:
+0:41              1 (const int)
+0:41          Sequence
+0:41            Constant:
+0:41              0 (const int)
+0:41            Constant:
+0:41              1 (const int)
+0:41        subgroupQuadBroadcast ( temp 2-component vector of int)
+0:41          vector swizzle ( temp 2-component vector of int)
+0:41            i: direct index for structure ( temp 4-component vector of int)
+0:41              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:41                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:41                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:41                  Constant:
+0:41                    0 (const uint)
+0:41                direct index ( temp uint)
+0:41                  'dti' ( in 3-component vector of uint)
+0:41                  Constant:
+0:41                    0 (const int)
+0:41              Constant:
+0:41                1 (const int)
+0:41            Sequence
+0:41              Constant:
+0:41                0 (const int)
+0:41              Constant:
+0:41                1 (const int)
+0:41          Constant:
+0:41            1 (const uint)
+0:42      move second child to first child ( temp 3-component vector of int)
+0:42        vector swizzle ( temp 3-component vector of int)
+0:42          i: direct index for structure ( temp 4-component vector of int)
+0:42            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:42              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:42                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:42                Constant:
+0:42                  0 (const uint)
+0:42              direct index ( temp uint)
+0:42                'dti' ( in 3-component vector of uint)
+0:42                Constant:
+0:42                  0 (const int)
+0:42            Constant:
+0:42              1 (const int)
+0:42          Sequence
+0:42            Constant:
+0:42              0 (const int)
+0:42            Constant:
+0:42              1 (const int)
+0:42            Constant:
+0:42              2 (const int)
+0:42        subgroupQuadBroadcast ( temp 3-component vector of int)
+0:42          vector swizzle ( temp 3-component vector of int)
+0:42            i: direct index for structure ( temp 4-component vector of int)
+0:42              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:42                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:42                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:42                  Constant:
+0:42                    0 (const uint)
+0:42                direct index ( temp uint)
+0:42                  'dti' ( in 3-component vector of uint)
+0:42                  Constant:
+0:42                    0 (const int)
+0:42              Constant:
+0:42                1 (const int)
+0:42            Sequence
+0:42              Constant:
+0:42                0 (const int)
+0:42              Constant:
+0:42                1 (const int)
+0:42              Constant:
+0:42                2 (const int)
+0:42          Constant:
+0:42            1 (const uint)
+0:44      move second child to first child ( temp 4-component vector of float)
+0:44        f: direct index for structure ( temp 4-component vector of float)
+0:44          indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:44            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:44              'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:44              Constant:
+0:44                0 (const uint)
+0:44            direct index ( temp uint)
+0:44              'dti' ( in 3-component vector of uint)
+0:44              Constant:
+0:44                0 (const int)
+0:44          Constant:
+0:44            2 (const int)
+0:44        subgroupQuadBroadcast ( temp 4-component vector of float)
+0:44          f: direct index for structure ( temp 4-component vector of float)
+0:44            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:44              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:44                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:44                Constant:
+0:44                  0 (const uint)
+0:44              direct index ( temp uint)
+0:44                'dti' ( in 3-component vector of uint)
+0:44                Constant:
+0:44                  0 (const int)
+0:44            Constant:
+0:44              2 (const int)
+0:44          Constant:
+0:44            1 (const uint)
+0:45      move second child to first child ( temp float)
+0:45        direct index ( temp float)
+0:45          f: direct index for structure ( temp 4-component vector of float)
+0:45            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:45              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:45                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:45                Constant:
+0:45                  0 (const uint)
+0:45              direct index ( temp uint)
+0:45                'dti' ( in 3-component vector of uint)
+0:45                Constant:
+0:45                  0 (const int)
+0:45            Constant:
+0:45              2 (const int)
+0:45          Constant:
+0:45            0 (const int)
+0:45        subgroupQuadBroadcast ( temp float)
+0:45          direct index ( temp float)
+0:45            f: direct index for structure ( temp 4-component vector of float)
+0:45              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:45                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:45                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:45                  Constant:
+0:45                    0 (const uint)
+0:45                direct index ( temp uint)
+0:45                  'dti' ( in 3-component vector of uint)
+0:45                  Constant:
+0:45                    0 (const int)
+0:45              Constant:
+0:45                2 (const int)
+0:45            Constant:
+0:45              0 (const int)
+0:45          Constant:
+0:45            1 (const uint)
+0:46      move second child to first child ( temp 2-component vector of float)
+0:46        vector swizzle ( temp 2-component vector of float)
+0:46          f: direct index for structure ( temp 4-component vector of float)
+0:46            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:46              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:46                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:46                Constant:
+0:46                  0 (const uint)
+0:46              direct index ( temp uint)
+0:46                'dti' ( in 3-component vector of uint)
+0:46                Constant:
+0:46                  0 (const int)
+0:46            Constant:
+0:46              2 (const int)
+0:46          Sequence
+0:46            Constant:
+0:46              0 (const int)
+0:46            Constant:
+0:46              1 (const int)
+0:46        subgroupQuadBroadcast ( temp 2-component vector of float)
+0:46          vector swizzle ( temp 2-component vector of float)
+0:46            f: direct index for structure ( temp 4-component vector of float)
+0:46              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:46                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:46                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:46                  Constant:
+0:46                    0 (const uint)
+0:46                direct index ( temp uint)
+0:46                  'dti' ( in 3-component vector of uint)
+0:46                  Constant:
+0:46                    0 (const int)
+0:46              Constant:
+0:46                2 (const int)
+0:46            Sequence
+0:46              Constant:
+0:46                0 (const int)
+0:46              Constant:
+0:46                1 (const int)
+0:46          Constant:
+0:46            1 (const uint)
+0:47      move second child to first child ( temp 3-component vector of float)
+0:47        vector swizzle ( temp 3-component vector of float)
+0:47          f: direct index for structure ( temp 4-component vector of float)
+0:47            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:47              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:47                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:47                Constant:
+0:47                  0 (const uint)
+0:47              direct index ( temp uint)
+0:47                'dti' ( in 3-component vector of uint)
+0:47                Constant:
+0:47                  0 (const int)
+0:47            Constant:
+0:47              2 (const int)
+0:47          Sequence
+0:47            Constant:
+0:47              0 (const int)
+0:47            Constant:
+0:47              1 (const int)
+0:47            Constant:
+0:47              2 (const int)
+0:47        subgroupQuadBroadcast ( temp 3-component vector of float)
+0:47          vector swizzle ( temp 3-component vector of float)
+0:47            f: direct index for structure ( temp 4-component vector of float)
+0:47              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:47                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:47                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:47                  Constant:
+0:47                    0 (const uint)
+0:47                direct index ( temp uint)
+0:47                  'dti' ( in 3-component vector of uint)
+0:47                  Constant:
+0:47                    0 (const int)
+0:47              Constant:
+0:47                2 (const int)
+0:47            Sequence
+0:47              Constant:
+0:47                0 (const int)
+0:47              Constant:
+0:47                1 (const int)
+0:47              Constant:
+0:47                2 (const int)
+0:47          Constant:
+0:47            1 (const uint)
+0:49      move second child to first child ( temp 4-component vector of double)
+0:49        d: direct index for structure ( temp 4-component vector of double)
+0:49          indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:49            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:49              'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:49              Constant:
+0:49                0 (const uint)
+0:49            direct index ( temp uint)
+0:49              'dti' ( in 3-component vector of uint)
+0:49              Constant:
+0:49                0 (const int)
+0:49          Constant:
+0:49            3 (const int)
+0:49        subgroupQuadBroadcast ( temp 4-component vector of double)
+0:49          d: direct index for structure ( temp 4-component vector of double)
+0:49            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:49              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:49                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:49                Constant:
+0:49                  0 (const uint)
+0:49              direct index ( temp uint)
+0:49                'dti' ( in 3-component vector of uint)
+0:49                Constant:
+0:49                  0 (const int)
+0:49            Constant:
+0:49              3 (const int)
+0:49          Constant:
+0:49            1 (const uint)
+0:50      move second child to first child ( temp double)
+0:50        direct index ( temp double)
+0:50          d: direct index for structure ( temp 4-component vector of double)
+0:50            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:50              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:50                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:50                Constant:
+0:50                  0 (const uint)
+0:50              direct index ( temp uint)
+0:50                'dti' ( in 3-component vector of uint)
+0:50                Constant:
+0:50                  0 (const int)
+0:50            Constant:
+0:50              3 (const int)
+0:50          Constant:
+0:50            0 (const int)
+0:50        subgroupQuadBroadcast ( temp double)
+0:50          direct index ( temp double)
+0:50            d: direct index for structure ( temp 4-component vector of double)
+0:50              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:50                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:50                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:50                  Constant:
+0:50                    0 (const uint)
+0:50                direct index ( temp uint)
+0:50                  'dti' ( in 3-component vector of uint)
+0:50                  Constant:
+0:50                    0 (const int)
+0:50              Constant:
+0:50                3 (const int)
+0:50            Constant:
+0:50              0 (const int)
+0:50          Constant:
+0:50            1 (const uint)
+0:51      move second child to first child ( temp 2-component vector of double)
+0:51        vector swizzle ( temp 2-component vector of double)
+0:51          d: direct index for structure ( temp 4-component vector of double)
+0:51            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:51              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:51                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:51                Constant:
+0:51                  0 (const uint)
+0:51              direct index ( temp uint)
+0:51                'dti' ( in 3-component vector of uint)
+0:51                Constant:
+0:51                  0 (const int)
+0:51            Constant:
+0:51              3 (const int)
+0:51          Sequence
+0:51            Constant:
+0:51              0 (const int)
+0:51            Constant:
+0:51              1 (const int)
+0:51        subgroupQuadBroadcast ( temp 2-component vector of double)
+0:51          vector swizzle ( temp 2-component vector of double)
+0:51            d: direct index for structure ( temp 4-component vector of double)
+0:51              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:51                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:51                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:51                  Constant:
+0:51                    0 (const uint)
+0:51                direct index ( temp uint)
+0:51                  'dti' ( in 3-component vector of uint)
+0:51                  Constant:
+0:51                    0 (const int)
+0:51              Constant:
+0:51                3 (const int)
+0:51            Sequence
+0:51              Constant:
+0:51                0 (const int)
+0:51              Constant:
+0:51                1 (const int)
+0:51          Constant:
+0:51            1 (const uint)
+0:52      move second child to first child ( temp 3-component vector of double)
+0:52        vector swizzle ( temp 3-component vector of double)
+0:52          d: direct index for structure ( temp 4-component vector of double)
+0:52            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:52              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:52                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:52                Constant:
+0:52                  0 (const uint)
+0:52              direct index ( temp uint)
+0:52                'dti' ( in 3-component vector of uint)
+0:52                Constant:
+0:52                  0 (const int)
+0:52            Constant:
+0:52              3 (const int)
+0:52          Sequence
+0:52            Constant:
+0:52              0 (const int)
+0:52            Constant:
+0:52              1 (const int)
+0:52            Constant:
+0:52              2 (const int)
+0:52        subgroupQuadBroadcast ( temp 3-component vector of double)
+0:52          vector swizzle ( temp 3-component vector of double)
+0:52            d: direct index for structure ( temp 4-component vector of double)
+0:52              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:52                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:52                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:52                  Constant:
+0:52                    0 (const uint)
+0:52                direct index ( temp uint)
+0:52                  'dti' ( in 3-component vector of uint)
+0:52                  Constant:
+0:52                    0 (const int)
+0:52              Constant:
+0:52                3 (const int)
+0:52            Sequence
+0:52              Constant:
+0:52                0 (const int)
+0:52              Constant:
+0:52                1 (const int)
+0:52              Constant:
+0:52                2 (const int)
+0:52          Constant:
+0:52            1 (const uint)
+0:54      move second child to first child ( temp 4-component vector of uint)
+0:54        u: direct index for structure ( temp 4-component vector of uint)
+0:54          indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:54            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:54              'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:54              Constant:
+0:54                0 (const uint)
+0:54            direct index ( temp uint)
+0:54              'dti' ( in 3-component vector of uint)
+0:54              Constant:
+0:54                0 (const int)
+0:54          Constant:
+0:54            0 (const int)
+0:54        subgroupQuadBroadcast ( temp 4-component vector of uint)
+0:54          u: direct index for structure ( temp 4-component vector of uint)
+0:54            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:54              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:54                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:54                Constant:
+0:54                  0 (const uint)
+0:54              direct index ( temp uint)
+0:54                'dti' ( in 3-component vector of uint)
+0:54                Constant:
+0:54                  0 (const int)
+0:54            Constant:
+0:54              0 (const int)
+0:54          Constant:
+0:54            2 (const uint)
+0:55      move second child to first child ( temp uint)
+0:55        direct index ( temp uint)
+0:55          u: direct index for structure ( temp 4-component vector of uint)
+0:55            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:55              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:55                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:55                Constant:
+0:55                  0 (const uint)
+0:55              direct index ( temp uint)
+0:55                'dti' ( in 3-component vector of uint)
+0:55                Constant:
+0:55                  0 (const int)
+0:55            Constant:
+0:55              0 (const int)
+0:55          Constant:
+0:55            0 (const int)
+0:55        subgroupQuadBroadcast ( temp uint)
+0:55          direct index ( temp uint)
+0:55            u: direct index for structure ( temp 4-component vector of uint)
+0:55              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:55                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:55                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:55                  Constant:
+0:55                    0 (const uint)
+0:55                direct index ( temp uint)
+0:55                  'dti' ( in 3-component vector of uint)
+0:55                  Constant:
+0:55                    0 (const int)
+0:55              Constant:
+0:55                0 (const int)
+0:55            Constant:
+0:55              0 (const int)
+0:55          Constant:
+0:55            2 (const uint)
+0:56      move second child to first child ( temp 2-component vector of uint)
+0:56        vector swizzle ( temp 2-component vector of uint)
+0:56          u: direct index for structure ( temp 4-component vector of uint)
+0:56            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:56              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:56                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:56                Constant:
+0:56                  0 (const uint)
+0:56              direct index ( temp uint)
+0:56                'dti' ( in 3-component vector of uint)
+0:56                Constant:
+0:56                  0 (const int)
+0:56            Constant:
+0:56              0 (const int)
+0:56          Sequence
+0:56            Constant:
+0:56              0 (const int)
+0:56            Constant:
+0:56              1 (const int)
+0:56        subgroupQuadBroadcast ( temp 2-component vector of uint)
+0:56          vector swizzle ( temp 2-component vector of uint)
+0:56            u: direct index for structure ( temp 4-component vector of uint)
+0:56              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:56                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:56                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:56                  Constant:
+0:56                    0 (const uint)
+0:56                direct index ( temp uint)
+0:56                  'dti' ( in 3-component vector of uint)
+0:56                  Constant:
+0:56                    0 (const int)
+0:56              Constant:
+0:56                0 (const int)
+0:56            Sequence
+0:56              Constant:
+0:56                0 (const int)
+0:56              Constant:
+0:56                1 (const int)
+0:56          Constant:
+0:56            2 (const uint)
+0:57      move second child to first child ( temp 3-component vector of uint)
+0:57        vector swizzle ( temp 3-component vector of uint)
+0:57          u: direct index for structure ( temp 4-component vector of uint)
+0:57            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:57              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:57                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:57                Constant:
+0:57                  0 (const uint)
+0:57              direct index ( temp uint)
+0:57                'dti' ( in 3-component vector of uint)
+0:57                Constant:
+0:57                  0 (const int)
+0:57            Constant:
+0:57              0 (const int)
+0:57          Sequence
+0:57            Constant:
+0:57              0 (const int)
+0:57            Constant:
+0:57              1 (const int)
+0:57            Constant:
+0:57              2 (const int)
+0:57        subgroupQuadBroadcast ( temp 3-component vector of uint)
+0:57          vector swizzle ( temp 3-component vector of uint)
+0:57            u: direct index for structure ( temp 4-component vector of uint)
+0:57              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:57                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:57                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:57                  Constant:
+0:57                    0 (const uint)
+0:57                direct index ( temp uint)
+0:57                  'dti' ( in 3-component vector of uint)
+0:57                  Constant:
+0:57                    0 (const int)
+0:57              Constant:
+0:57                0 (const int)
+0:57            Sequence
+0:57              Constant:
+0:57                0 (const int)
+0:57              Constant:
+0:57                1 (const int)
+0:57              Constant:
+0:57                2 (const int)
+0:57          Constant:
+0:57            2 (const uint)
+0:59      move second child to first child ( temp 4-component vector of int)
+0:59        i: direct index for structure ( temp 4-component vector of int)
+0:59          indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:59            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:59              'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:59              Constant:
+0:59                0 (const uint)
+0:59            direct index ( temp uint)
+0:59              'dti' ( in 3-component vector of uint)
+0:59              Constant:
+0:59                0 (const int)
+0:59          Constant:
+0:59            1 (const int)
+0:59        subgroupQuadBroadcast ( temp 4-component vector of int)
+0:59          i: direct index for structure ( temp 4-component vector of int)
+0:59            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:59              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:59                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:59                Constant:
+0:59                  0 (const uint)
+0:59              direct index ( temp uint)
+0:59                'dti' ( in 3-component vector of uint)
+0:59                Constant:
+0:59                  0 (const int)
+0:59            Constant:
+0:59              1 (const int)
+0:59          Constant:
+0:59            2 (const uint)
+0:60      move second child to first child ( temp int)
+0:60        direct index ( temp int)
+0:60          i: direct index for structure ( temp 4-component vector of int)
+0:60            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:60              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:60                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:60                Constant:
+0:60                  0 (const uint)
+0:60              direct index ( temp uint)
+0:60                'dti' ( in 3-component vector of uint)
+0:60                Constant:
+0:60                  0 (const int)
+0:60            Constant:
+0:60              1 (const int)
+0:60          Constant:
+0:60            0 (const int)
+0:60        subgroupQuadBroadcast ( temp int)
+0:60          direct index ( temp int)
+0:60            i: direct index for structure ( temp 4-component vector of int)
+0:60              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:60                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:60                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:60                  Constant:
+0:60                    0 (const uint)
+0:60                direct index ( temp uint)
+0:60                  'dti' ( in 3-component vector of uint)
+0:60                  Constant:
+0:60                    0 (const int)
+0:60              Constant:
+0:60                1 (const int)
+0:60            Constant:
+0:60              0 (const int)
+0:60          Constant:
+0:60            2 (const uint)
+0:61      move second child to first child ( temp 2-component vector of int)
+0:61        vector swizzle ( temp 2-component vector of int)
+0:61          i: direct index for structure ( temp 4-component vector of int)
+0:61            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:61              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:61                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:61                Constant:
+0:61                  0 (const uint)
+0:61              direct index ( temp uint)
+0:61                'dti' ( in 3-component vector of uint)
+0:61                Constant:
+0:61                  0 (const int)
+0:61            Constant:
+0:61              1 (const int)
+0:61          Sequence
+0:61            Constant:
+0:61              0 (const int)
+0:61            Constant:
+0:61              1 (const int)
+0:61        subgroupQuadBroadcast ( temp 2-component vector of int)
+0:61          vector swizzle ( temp 2-component vector of int)
+0:61            i: direct index for structure ( temp 4-component vector of int)
+0:61              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:61                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:61                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:61                  Constant:
+0:61                    0 (const uint)
+0:61                direct index ( temp uint)
+0:61                  'dti' ( in 3-component vector of uint)
+0:61                  Constant:
+0:61                    0 (const int)
+0:61              Constant:
+0:61                1 (const int)
+0:61            Sequence
+0:61              Constant:
+0:61                0 (const int)
+0:61              Constant:
+0:61                1 (const int)
+0:61          Constant:
+0:61            2 (const uint)
+0:62      move second child to first child ( temp 3-component vector of int)
+0:62        vector swizzle ( temp 3-component vector of int)
+0:62          i: direct index for structure ( temp 4-component vector of int)
+0:62            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:62              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:62                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:62                Constant:
+0:62                  0 (const uint)
+0:62              direct index ( temp uint)
+0:62                'dti' ( in 3-component vector of uint)
+0:62                Constant:
+0:62                  0 (const int)
+0:62            Constant:
+0:62              1 (const int)
+0:62          Sequence
+0:62            Constant:
+0:62              0 (const int)
+0:62            Constant:
+0:62              1 (const int)
+0:62            Constant:
+0:62              2 (const int)
+0:62        subgroupQuadBroadcast ( temp 3-component vector of int)
+0:62          vector swizzle ( temp 3-component vector of int)
+0:62            i: direct index for structure ( temp 4-component vector of int)
+0:62              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:62                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:62                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:62                  Constant:
+0:62                    0 (const uint)
+0:62                direct index ( temp uint)
+0:62                  'dti' ( in 3-component vector of uint)
+0:62                  Constant:
+0:62                    0 (const int)
+0:62              Constant:
+0:62                1 (const int)
+0:62            Sequence
+0:62              Constant:
+0:62                0 (const int)
+0:62              Constant:
+0:62                1 (const int)
+0:62              Constant:
+0:62                2 (const int)
+0:62          Constant:
+0:62            2 (const uint)
+0:64      move second child to first child ( temp 4-component vector of float)
+0:64        f: direct index for structure ( temp 4-component vector of float)
+0:64          indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:64            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:64              'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:64              Constant:
+0:64                0 (const uint)
+0:64            direct index ( temp uint)
+0:64              'dti' ( in 3-component vector of uint)
+0:64              Constant:
+0:64                0 (const int)
+0:64          Constant:
+0:64            2 (const int)
+0:64        subgroupQuadBroadcast ( temp 4-component vector of float)
+0:64          f: direct index for structure ( temp 4-component vector of float)
+0:64            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:64              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:64                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:64                Constant:
+0:64                  0 (const uint)
+0:64              direct index ( temp uint)
+0:64                'dti' ( in 3-component vector of uint)
+0:64                Constant:
+0:64                  0 (const int)
+0:64            Constant:
+0:64              2 (const int)
+0:64          Constant:
+0:64            2 (const uint)
+0:65      move second child to first child ( temp float)
+0:65        direct index ( temp float)
+0:65          f: direct index for structure ( temp 4-component vector of float)
+0:65            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:65              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:65                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:65                Constant:
+0:65                  0 (const uint)
+0:65              direct index ( temp uint)
+0:65                'dti' ( in 3-component vector of uint)
+0:65                Constant:
+0:65                  0 (const int)
+0:65            Constant:
+0:65              2 (const int)
+0:65          Constant:
+0:65            0 (const int)
+0:65        subgroupQuadBroadcast ( temp float)
+0:65          direct index ( temp float)
+0:65            f: direct index for structure ( temp 4-component vector of float)
+0:65              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:65                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:65                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:65                  Constant:
+0:65                    0 (const uint)
+0:65                direct index ( temp uint)
+0:65                  'dti' ( in 3-component vector of uint)
+0:65                  Constant:
+0:65                    0 (const int)
+0:65              Constant:
+0:65                2 (const int)
+0:65            Constant:
+0:65              0 (const int)
+0:65          Constant:
+0:65            2 (const uint)
+0:66      move second child to first child ( temp 2-component vector of float)
+0:66        vector swizzle ( temp 2-component vector of float)
+0:66          f: direct index for structure ( temp 4-component vector of float)
+0:66            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:66              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:66                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:66                Constant:
+0:66                  0 (const uint)
+0:66              direct index ( temp uint)
+0:66                'dti' ( in 3-component vector of uint)
+0:66                Constant:
+0:66                  0 (const int)
+0:66            Constant:
+0:66              2 (const int)
+0:66          Sequence
+0:66            Constant:
+0:66              0 (const int)
+0:66            Constant:
+0:66              1 (const int)
+0:66        subgroupQuadBroadcast ( temp 2-component vector of float)
+0:66          vector swizzle ( temp 2-component vector of float)
+0:66            f: direct index for structure ( temp 4-component vector of float)
+0:66              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:66                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:66                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:66                  Constant:
+0:66                    0 (const uint)
+0:66                direct index ( temp uint)
+0:66                  'dti' ( in 3-component vector of uint)
+0:66                  Constant:
+0:66                    0 (const int)
+0:66              Constant:
+0:66                2 (const int)
+0:66            Sequence
+0:66              Constant:
+0:66                0 (const int)
+0:66              Constant:
+0:66                1 (const int)
+0:66          Constant:
+0:66            2 (const uint)
+0:67      move second child to first child ( temp 3-component vector of float)
+0:67        vector swizzle ( temp 3-component vector of float)
+0:67          f: direct index for structure ( temp 4-component vector of float)
+0:67            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:67              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:67                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:67                Constant:
+0:67                  0 (const uint)
+0:67              direct index ( temp uint)
+0:67                'dti' ( in 3-component vector of uint)
+0:67                Constant:
+0:67                  0 (const int)
+0:67            Constant:
+0:67              2 (const int)
+0:67          Sequence
+0:67            Constant:
+0:67              0 (const int)
+0:67            Constant:
+0:67              1 (const int)
+0:67            Constant:
+0:67              2 (const int)
+0:67        subgroupQuadBroadcast ( temp 3-component vector of float)
+0:67          vector swizzle ( temp 3-component vector of float)
+0:67            f: direct index for structure ( temp 4-component vector of float)
+0:67              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:67                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:67                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:67                  Constant:
+0:67                    0 (const uint)
+0:67                direct index ( temp uint)
+0:67                  'dti' ( in 3-component vector of uint)
+0:67                  Constant:
+0:67                    0 (const int)
+0:67              Constant:
+0:67                2 (const int)
+0:67            Sequence
+0:67              Constant:
+0:67                0 (const int)
+0:67              Constant:
+0:67                1 (const int)
+0:67              Constant:
+0:67                2 (const int)
+0:67          Constant:
+0:67            2 (const uint)
+0:69      move second child to first child ( temp 4-component vector of double)
+0:69        d: direct index for structure ( temp 4-component vector of double)
+0:69          indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:69            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:69              'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:69              Constant:
+0:69                0 (const uint)
+0:69            direct index ( temp uint)
+0:69              'dti' ( in 3-component vector of uint)
+0:69              Constant:
+0:69                0 (const int)
+0:69          Constant:
+0:69            3 (const int)
+0:69        subgroupQuadBroadcast ( temp 4-component vector of double)
+0:69          d: direct index for structure ( temp 4-component vector of double)
+0:69            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:69              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:69                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:69                Constant:
+0:69                  0 (const uint)
+0:69              direct index ( temp uint)
+0:69                'dti' ( in 3-component vector of uint)
+0:69                Constant:
+0:69                  0 (const int)
+0:69            Constant:
+0:69              3 (const int)
+0:69          Constant:
+0:69            2 (const uint)
+0:70      move second child to first child ( temp double)
+0:70        direct index ( temp double)
+0:70          d: direct index for structure ( temp 4-component vector of double)
+0:70            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:70              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:70                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:70                Constant:
+0:70                  0 (const uint)
+0:70              direct index ( temp uint)
+0:70                'dti' ( in 3-component vector of uint)
+0:70                Constant:
+0:70                  0 (const int)
+0:70            Constant:
+0:70              3 (const int)
+0:70          Constant:
+0:70            0 (const int)
+0:70        subgroupQuadBroadcast ( temp double)
+0:70          direct index ( temp double)
+0:70            d: direct index for structure ( temp 4-component vector of double)
+0:70              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:70                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:70                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:70                  Constant:
+0:70                    0 (const uint)
+0:70                direct index ( temp uint)
+0:70                  'dti' ( in 3-component vector of uint)
+0:70                  Constant:
+0:70                    0 (const int)
+0:70              Constant:
+0:70                3 (const int)
+0:70            Constant:
+0:70              0 (const int)
+0:70          Constant:
+0:70            2 (const uint)
+0:71      move second child to first child ( temp 2-component vector of double)
+0:71        vector swizzle ( temp 2-component vector of double)
+0:71          d: direct index for structure ( temp 4-component vector of double)
+0:71            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:71              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:71                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:71                Constant:
+0:71                  0 (const uint)
+0:71              direct index ( temp uint)
+0:71                'dti' ( in 3-component vector of uint)
+0:71                Constant:
+0:71                  0 (const int)
+0:71            Constant:
+0:71              3 (const int)
+0:71          Sequence
+0:71            Constant:
+0:71              0 (const int)
+0:71            Constant:
+0:71              1 (const int)
+0:71        subgroupQuadBroadcast ( temp 2-component vector of double)
+0:71          vector swizzle ( temp 2-component vector of double)
+0:71            d: direct index for structure ( temp 4-component vector of double)
+0:71              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:71                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:71                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:71                  Constant:
+0:71                    0 (const uint)
+0:71                direct index ( temp uint)
+0:71                  'dti' ( in 3-component vector of uint)
+0:71                  Constant:
+0:71                    0 (const int)
+0:71              Constant:
+0:71                3 (const int)
+0:71            Sequence
+0:71              Constant:
+0:71                0 (const int)
+0:71              Constant:
+0:71                1 (const int)
+0:71          Constant:
+0:71            2 (const uint)
+0:72      move second child to first child ( temp 3-component vector of double)
+0:72        vector swizzle ( temp 3-component vector of double)
+0:72          d: direct index for structure ( temp 4-component vector of double)
+0:72            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:72              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:72                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:72                Constant:
+0:72                  0 (const uint)
+0:72              direct index ( temp uint)
+0:72                'dti' ( in 3-component vector of uint)
+0:72                Constant:
+0:72                  0 (const int)
+0:72            Constant:
+0:72              3 (const int)
+0:72          Sequence
+0:72            Constant:
+0:72              0 (const int)
+0:72            Constant:
+0:72              1 (const int)
+0:72            Constant:
+0:72              2 (const int)
+0:72        subgroupQuadBroadcast ( temp 3-component vector of double)
+0:72          vector swizzle ( temp 3-component vector of double)
+0:72            d: direct index for structure ( temp 4-component vector of double)
+0:72              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:72                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:72                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:72                  Constant:
+0:72                    0 (const uint)
+0:72                direct index ( temp uint)
+0:72                  'dti' ( in 3-component vector of uint)
+0:72                  Constant:
+0:72                    0 (const int)
+0:72              Constant:
+0:72                3 (const int)
+0:72            Sequence
+0:72              Constant:
+0:72                0 (const int)
+0:72              Constant:
+0:72                1 (const int)
+0:72              Constant:
+0:72                2 (const int)
+0:72          Constant:
+0:72            2 (const uint)
+0:74      move second child to first child ( temp 4-component vector of uint)
+0:74        u: direct index for structure ( temp 4-component vector of uint)
+0:74          indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:74            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:74              'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:74              Constant:
+0:74                0 (const uint)
+0:74            direct index ( temp uint)
+0:74              'dti' ( in 3-component vector of uint)
+0:74              Constant:
+0:74                0 (const int)
+0:74          Constant:
+0:74            0 (const int)
+0:74        subgroupQuadBroadcast ( temp 4-component vector of uint)
+0:74          u: direct index for structure ( temp 4-component vector of uint)
+0:74            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:74              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:74                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:74                Constant:
+0:74                  0 (const uint)
+0:74              direct index ( temp uint)
+0:74                'dti' ( in 3-component vector of uint)
+0:74                Constant:
+0:74                  0 (const int)
+0:74            Constant:
+0:74              0 (const int)
+0:74          Constant:
+0:74            3 (const uint)
+0:75      move second child to first child ( temp uint)
+0:75        direct index ( temp uint)
+0:75          u: direct index for structure ( temp 4-component vector of uint)
+0:75            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:75              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:75                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:75                Constant:
+0:75                  0 (const uint)
+0:75              direct index ( temp uint)
+0:75                'dti' ( in 3-component vector of uint)
+0:75                Constant:
+0:75                  0 (const int)
+0:75            Constant:
+0:75              0 (const int)
+0:75          Constant:
+0:75            0 (const int)
+0:75        subgroupQuadBroadcast ( temp uint)
+0:75          direct index ( temp uint)
+0:75            u: direct index for structure ( temp 4-component vector of uint)
+0:75              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:75                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:75                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:75                  Constant:
+0:75                    0 (const uint)
+0:75                direct index ( temp uint)
+0:75                  'dti' ( in 3-component vector of uint)
+0:75                  Constant:
+0:75                    0 (const int)
+0:75              Constant:
+0:75                0 (const int)
+0:75            Constant:
+0:75              0 (const int)
+0:75          Constant:
+0:75            3 (const uint)
+0:76      move second child to first child ( temp 2-component vector of uint)
+0:76        vector swizzle ( temp 2-component vector of uint)
+0:76          u: direct index for structure ( temp 4-component vector of uint)
+0:76            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:76              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:76                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:76                Constant:
+0:76                  0 (const uint)
+0:76              direct index ( temp uint)
+0:76                'dti' ( in 3-component vector of uint)
+0:76                Constant:
+0:76                  0 (const int)
+0:76            Constant:
+0:76              0 (const int)
+0:76          Sequence
+0:76            Constant:
+0:76              0 (const int)
+0:76            Constant:
+0:76              1 (const int)
+0:76        subgroupQuadBroadcast ( temp 2-component vector of uint)
+0:76          vector swizzle ( temp 2-component vector of uint)
+0:76            u: direct index for structure ( temp 4-component vector of uint)
+0:76              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:76                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:76                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:76                  Constant:
+0:76                    0 (const uint)
+0:76                direct index ( temp uint)
+0:76                  'dti' ( in 3-component vector of uint)
+0:76                  Constant:
+0:76                    0 (const int)
+0:76              Constant:
+0:76                0 (const int)
+0:76            Sequence
+0:76              Constant:
+0:76                0 (const int)
+0:76              Constant:
+0:76                1 (const int)
+0:76          Constant:
+0:76            3 (const uint)
+0:77      move second child to first child ( temp 3-component vector of uint)
+0:77        vector swizzle ( temp 3-component vector of uint)
+0:77          u: direct index for structure ( temp 4-component vector of uint)
+0:77            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:77              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:77                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:77                Constant:
+0:77                  0 (const uint)
+0:77              direct index ( temp uint)
+0:77                'dti' ( in 3-component vector of uint)
+0:77                Constant:
+0:77                  0 (const int)
+0:77            Constant:
+0:77              0 (const int)
+0:77          Sequence
+0:77            Constant:
+0:77              0 (const int)
+0:77            Constant:
+0:77              1 (const int)
+0:77            Constant:
+0:77              2 (const int)
+0:77        subgroupQuadBroadcast ( temp 3-component vector of uint)
+0:77          vector swizzle ( temp 3-component vector of uint)
+0:77            u: direct index for structure ( temp 4-component vector of uint)
+0:77              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:77                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:77                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:77                  Constant:
+0:77                    0 (const uint)
+0:77                direct index ( temp uint)
+0:77                  'dti' ( in 3-component vector of uint)
+0:77                  Constant:
+0:77                    0 (const int)
+0:77              Constant:
+0:77                0 (const int)
+0:77            Sequence
+0:77              Constant:
+0:77                0 (const int)
+0:77              Constant:
+0:77                1 (const int)
+0:77              Constant:
+0:77                2 (const int)
+0:77          Constant:
+0:77            3 (const uint)
+0:79      move second child to first child ( temp 4-component vector of int)
+0:79        i: direct index for structure ( temp 4-component vector of int)
+0:79          indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:79            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:79              'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:79              Constant:
+0:79                0 (const uint)
+0:79            direct index ( temp uint)
+0:79              'dti' ( in 3-component vector of uint)
+0:79              Constant:
+0:79                0 (const int)
+0:79          Constant:
+0:79            1 (const int)
+0:79        subgroupQuadBroadcast ( temp 4-component vector of int)
+0:79          i: direct index for structure ( temp 4-component vector of int)
+0:79            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:79              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:79                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:79                Constant:
+0:79                  0 (const uint)
+0:79              direct index ( temp uint)
+0:79                'dti' ( in 3-component vector of uint)
+0:79                Constant:
+0:79                  0 (const int)
+0:79            Constant:
+0:79              1 (const int)
+0:79          Constant:
+0:79            3 (const uint)
+0:80      move second child to first child ( temp int)
+0:80        direct index ( temp int)
+0:80          i: direct index for structure ( temp 4-component vector of int)
+0:80            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:80              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:80                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:80                Constant:
+0:80                  0 (const uint)
+0:80              direct index ( temp uint)
+0:80                'dti' ( in 3-component vector of uint)
+0:80                Constant:
+0:80                  0 (const int)
+0:80            Constant:
+0:80              1 (const int)
+0:80          Constant:
+0:80            0 (const int)
+0:80        subgroupQuadBroadcast ( temp int)
+0:80          direct index ( temp int)
+0:80            i: direct index for structure ( temp 4-component vector of int)
+0:80              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:80                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:80                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:80                  Constant:
+0:80                    0 (const uint)
+0:80                direct index ( temp uint)
+0:80                  'dti' ( in 3-component vector of uint)
+0:80                  Constant:
+0:80                    0 (const int)
+0:80              Constant:
+0:80                1 (const int)
+0:80            Constant:
+0:80              0 (const int)
+0:80          Constant:
+0:80            3 (const uint)
+0:81      move second child to first child ( temp 2-component vector of int)
+0:81        vector swizzle ( temp 2-component vector of int)
+0:81          i: direct index for structure ( temp 4-component vector of int)
+0:81            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:81              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:81                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:81                Constant:
+0:81                  0 (const uint)
+0:81              direct index ( temp uint)
+0:81                'dti' ( in 3-component vector of uint)
+0:81                Constant:
+0:81                  0 (const int)
+0:81            Constant:
+0:81              1 (const int)
+0:81          Sequence
+0:81            Constant:
+0:81              0 (const int)
+0:81            Constant:
+0:81              1 (const int)
+0:81        subgroupQuadBroadcast ( temp 2-component vector of int)
+0:81          vector swizzle ( temp 2-component vector of int)
+0:81            i: direct index for structure ( temp 4-component vector of int)
+0:81              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:81                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:81                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:81                  Constant:
+0:81                    0 (const uint)
+0:81                direct index ( temp uint)
+0:81                  'dti' ( in 3-component vector of uint)
+0:81                  Constant:
+0:81                    0 (const int)
+0:81              Constant:
+0:81                1 (const int)
+0:81            Sequence
+0:81              Constant:
+0:81                0 (const int)
+0:81              Constant:
+0:81                1 (const int)
+0:81          Constant:
+0:81            3 (const uint)
+0:82      move second child to first child ( temp 3-component vector of int)
+0:82        vector swizzle ( temp 3-component vector of int)
+0:82          i: direct index for structure ( temp 4-component vector of int)
+0:82            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:82              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:82                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:82                Constant:
+0:82                  0 (const uint)
+0:82              direct index ( temp uint)
+0:82                'dti' ( in 3-component vector of uint)
+0:82                Constant:
+0:82                  0 (const int)
+0:82            Constant:
+0:82              1 (const int)
+0:82          Sequence
+0:82            Constant:
+0:82              0 (const int)
+0:82            Constant:
+0:82              1 (const int)
+0:82            Constant:
+0:82              2 (const int)
+0:82        subgroupQuadBroadcast ( temp 3-component vector of int)
+0:82          vector swizzle ( temp 3-component vector of int)
+0:82            i: direct index for structure ( temp 4-component vector of int)
+0:82              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:82                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:82                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:82                  Constant:
+0:82                    0 (const uint)
+0:82                direct index ( temp uint)
+0:82                  'dti' ( in 3-component vector of uint)
+0:82                  Constant:
+0:82                    0 (const int)
+0:82              Constant:
+0:82                1 (const int)
+0:82            Sequence
+0:82              Constant:
+0:82                0 (const int)
+0:82              Constant:
+0:82                1 (const int)
+0:82              Constant:
+0:82                2 (const int)
+0:82          Constant:
+0:82            3 (const uint)
+0:84      move second child to first child ( temp 4-component vector of float)
+0:84        f: direct index for structure ( temp 4-component vector of float)
+0:84          indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:84            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:84              'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:84              Constant:
+0:84                0 (const uint)
+0:84            direct index ( temp uint)
+0:84              'dti' ( in 3-component vector of uint)
+0:84              Constant:
+0:84                0 (const int)
+0:84          Constant:
+0:84            2 (const int)
+0:84        subgroupQuadBroadcast ( temp 4-component vector of float)
+0:84          f: direct index for structure ( temp 4-component vector of float)
+0:84            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:84              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:84                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:84                Constant:
+0:84                  0 (const uint)
+0:84              direct index ( temp uint)
+0:84                'dti' ( in 3-component vector of uint)
+0:84                Constant:
+0:84                  0 (const int)
+0:84            Constant:
+0:84              2 (const int)
+0:84          Constant:
+0:84            3 (const uint)
+0:85      move second child to first child ( temp float)
+0:85        direct index ( temp float)
+0:85          f: direct index for structure ( temp 4-component vector of float)
+0:85            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:85              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:85                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:85                Constant:
+0:85                  0 (const uint)
+0:85              direct index ( temp uint)
+0:85                'dti' ( in 3-component vector of uint)
+0:85                Constant:
+0:85                  0 (const int)
+0:85            Constant:
+0:85              2 (const int)
+0:85          Constant:
+0:85            0 (const int)
+0:85        subgroupQuadBroadcast ( temp float)
+0:85          direct index ( temp float)
+0:85            f: direct index for structure ( temp 4-component vector of float)
+0:85              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:85                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:85                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:85                  Constant:
+0:85                    0 (const uint)
+0:85                direct index ( temp uint)
+0:85                  'dti' ( in 3-component vector of uint)
+0:85                  Constant:
+0:85                    0 (const int)
+0:85              Constant:
+0:85                2 (const int)
+0:85            Constant:
+0:85              0 (const int)
+0:85          Constant:
+0:85            3 (const uint)
+0:86      move second child to first child ( temp 2-component vector of float)
+0:86        vector swizzle ( temp 2-component vector of float)
+0:86          f: direct index for structure ( temp 4-component vector of float)
+0:86            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:86              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:86                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:86                Constant:
+0:86                  0 (const uint)
+0:86              direct index ( temp uint)
+0:86                'dti' ( in 3-component vector of uint)
+0:86                Constant:
+0:86                  0 (const int)
+0:86            Constant:
+0:86              2 (const int)
+0:86          Sequence
+0:86            Constant:
+0:86              0 (const int)
+0:86            Constant:
+0:86              1 (const int)
+0:86        subgroupQuadBroadcast ( temp 2-component vector of float)
+0:86          vector swizzle ( temp 2-component vector of float)
+0:86            f: direct index for structure ( temp 4-component vector of float)
+0:86              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:86                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:86                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:86                  Constant:
+0:86                    0 (const uint)
+0:86                direct index ( temp uint)
+0:86                  'dti' ( in 3-component vector of uint)
+0:86                  Constant:
+0:86                    0 (const int)
+0:86              Constant:
+0:86                2 (const int)
+0:86            Sequence
+0:86              Constant:
+0:86                0 (const int)
+0:86              Constant:
+0:86                1 (const int)
+0:86          Constant:
+0:86            3 (const uint)
+0:87      move second child to first child ( temp 3-component vector of float)
+0:87        vector swizzle ( temp 3-component vector of float)
+0:87          f: direct index for structure ( temp 4-component vector of float)
+0:87            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:87              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:87                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:87                Constant:
+0:87                  0 (const uint)
+0:87              direct index ( temp uint)
+0:87                'dti' ( in 3-component vector of uint)
+0:87                Constant:
+0:87                  0 (const int)
+0:87            Constant:
+0:87              2 (const int)
+0:87          Sequence
+0:87            Constant:
+0:87              0 (const int)
+0:87            Constant:
+0:87              1 (const int)
+0:87            Constant:
+0:87              2 (const int)
+0:87        subgroupQuadBroadcast ( temp 3-component vector of float)
+0:87          vector swizzle ( temp 3-component vector of float)
+0:87            f: direct index for structure ( temp 4-component vector of float)
+0:87              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:87                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:87                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:87                  Constant:
+0:87                    0 (const uint)
+0:87                direct index ( temp uint)
+0:87                  'dti' ( in 3-component vector of uint)
+0:87                  Constant:
+0:87                    0 (const int)
+0:87              Constant:
+0:87                2 (const int)
+0:87            Sequence
+0:87              Constant:
+0:87                0 (const int)
+0:87              Constant:
+0:87                1 (const int)
+0:87              Constant:
+0:87                2 (const int)
+0:87          Constant:
+0:87            3 (const uint)
+0:89      move second child to first child ( temp 4-component vector of double)
+0:89        d: direct index for structure ( temp 4-component vector of double)
+0:89          indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:89            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:89              'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:89              Constant:
+0:89                0 (const uint)
+0:89            direct index ( temp uint)
+0:89              'dti' ( in 3-component vector of uint)
+0:89              Constant:
+0:89                0 (const int)
+0:89          Constant:
+0:89            3 (const int)
+0:89        subgroupQuadBroadcast ( temp 4-component vector of double)
+0:89          d: direct index for structure ( temp 4-component vector of double)
+0:89            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:89              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:89                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:89                Constant:
+0:89                  0 (const uint)
+0:89              direct index ( temp uint)
+0:89                'dti' ( in 3-component vector of uint)
+0:89                Constant:
+0:89                  0 (const int)
+0:89            Constant:
+0:89              3 (const int)
+0:89          Constant:
+0:89            3 (const uint)
+0:90      move second child to first child ( temp double)
+0:90        direct index ( temp double)
+0:90          d: direct index for structure ( temp 4-component vector of double)
+0:90            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:90              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:90                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:90                Constant:
+0:90                  0 (const uint)
+0:90              direct index ( temp uint)
+0:90                'dti' ( in 3-component vector of uint)
+0:90                Constant:
+0:90                  0 (const int)
+0:90            Constant:
+0:90              3 (const int)
+0:90          Constant:
+0:90            0 (const int)
+0:90        subgroupQuadBroadcast ( temp double)
+0:90          direct index ( temp double)
+0:90            d: direct index for structure ( temp 4-component vector of double)
+0:90              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:90                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:90                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:90                  Constant:
+0:90                    0 (const uint)
+0:90                direct index ( temp uint)
+0:90                  'dti' ( in 3-component vector of uint)
+0:90                  Constant:
+0:90                    0 (const int)
+0:90              Constant:
+0:90                3 (const int)
+0:90            Constant:
+0:90              0 (const int)
+0:90          Constant:
+0:90            3 (const uint)
+0:91      move second child to first child ( temp 2-component vector of double)
+0:91        vector swizzle ( temp 2-component vector of double)
+0:91          d: direct index for structure ( temp 4-component vector of double)
+0:91            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:91              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:91                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:91                Constant:
+0:91                  0 (const uint)
+0:91              direct index ( temp uint)
+0:91                'dti' ( in 3-component vector of uint)
+0:91                Constant:
+0:91                  0 (const int)
+0:91            Constant:
+0:91              3 (const int)
+0:91          Sequence
+0:91            Constant:
+0:91              0 (const int)
+0:91            Constant:
+0:91              1 (const int)
+0:91        subgroupQuadBroadcast ( temp 2-component vector of double)
+0:91          vector swizzle ( temp 2-component vector of double)
+0:91            d: direct index for structure ( temp 4-component vector of double)
+0:91              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:91                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:91                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:91                  Constant:
+0:91                    0 (const uint)
+0:91                direct index ( temp uint)
+0:91                  'dti' ( in 3-component vector of uint)
+0:91                  Constant:
+0:91                    0 (const int)
+0:91              Constant:
+0:91                3 (const int)
+0:91            Sequence
+0:91              Constant:
+0:91                0 (const int)
+0:91              Constant:
+0:91                1 (const int)
+0:91          Constant:
+0:91            3 (const uint)
+0:92      move second child to first child ( temp 3-component vector of double)
+0:92        vector swizzle ( temp 3-component vector of double)
+0:92          d: direct index for structure ( temp 4-component vector of double)
+0:92            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:92              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:92                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:92                Constant:
+0:92                  0 (const uint)
+0:92              direct index ( temp uint)
+0:92                'dti' ( in 3-component vector of uint)
+0:92                Constant:
+0:92                  0 (const int)
+0:92            Constant:
+0:92              3 (const int)
+0:92          Sequence
+0:92            Constant:
+0:92              0 (const int)
+0:92            Constant:
+0:92              1 (const int)
+0:92            Constant:
+0:92              2 (const int)
+0:92        subgroupQuadBroadcast ( temp 3-component vector of double)
+0:92          vector swizzle ( temp 3-component vector of double)
+0:92            d: direct index for structure ( temp 4-component vector of double)
+0:92              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:92                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:92                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:92                  Constant:
+0:92                    0 (const uint)
+0:92                direct index ( temp uint)
+0:92                  'dti' ( in 3-component vector of uint)
+0:92                  Constant:
+0:92                    0 (const int)
+0:92              Constant:
+0:92                3 (const int)
+0:92            Sequence
+0:92              Constant:
+0:92                0 (const int)
+0:92              Constant:
+0:92                1 (const int)
+0:92              Constant:
+0:92                2 (const int)
+0:92          Constant:
+0:92            3 (const uint)
+0:94      move second child to first child ( temp 4-component vector of uint)
+0:94        u: direct index for structure ( temp 4-component vector of uint)
+0:94          indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:94            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:94              'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:94              Constant:
+0:94                0 (const uint)
+0:94            direct index ( temp uint)
+0:94              'dti' ( in 3-component vector of uint)
+0:94              Constant:
+0:94                0 (const int)
+0:94          Constant:
+0:94            0 (const int)
+0:94        subgroupQuadSwapHorizontal ( temp 4-component vector of uint)
+0:94          u: direct index for structure ( temp 4-component vector of uint)
+0:94            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:94              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:94                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:94                Constant:
+0:94                  0 (const uint)
+0:94              direct index ( temp uint)
+0:94                'dti' ( in 3-component vector of uint)
+0:94                Constant:
+0:94                  0 (const int)
+0:94            Constant:
+0:94              0 (const int)
+0:95      move second child to first child ( temp uint)
+0:95        direct index ( temp uint)
+0:95          u: direct index for structure ( temp 4-component vector of uint)
+0:95            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:95              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:95                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:95                Constant:
+0:95                  0 (const uint)
+0:95              direct index ( temp uint)
+0:95                'dti' ( in 3-component vector of uint)
+0:95                Constant:
+0:95                  0 (const int)
+0:95            Constant:
+0:95              0 (const int)
+0:95          Constant:
+0:95            0 (const int)
+0:95        subgroupQuadSwapHorizontal ( temp uint)
+0:95          direct index ( temp uint)
+0:95            u: direct index for structure ( temp 4-component vector of uint)
+0:95              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:95                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:95                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:95                  Constant:
+0:95                    0 (const uint)
+0:95                direct index ( temp uint)
+0:95                  'dti' ( in 3-component vector of uint)
+0:95                  Constant:
+0:95                    0 (const int)
+0:95              Constant:
+0:95                0 (const int)
+0:95            Constant:
+0:95              0 (const int)
+0:96      move second child to first child ( temp 2-component vector of uint)
+0:96        vector swizzle ( temp 2-component vector of uint)
+0:96          u: direct index for structure ( temp 4-component vector of uint)
+0:96            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:96              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:96                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:96                Constant:
+0:96                  0 (const uint)
+0:96              direct index ( temp uint)
+0:96                'dti' ( in 3-component vector of uint)
+0:96                Constant:
+0:96                  0 (const int)
+0:96            Constant:
+0:96              0 (const int)
+0:96          Sequence
+0:96            Constant:
+0:96              0 (const int)
+0:96            Constant:
+0:96              1 (const int)
+0:96        subgroupQuadSwapHorizontal ( temp 2-component vector of uint)
+0:96          vector swizzle ( temp 2-component vector of uint)
+0:96            u: direct index for structure ( temp 4-component vector of uint)
+0:96              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:96                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:96                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:96                  Constant:
+0:96                    0 (const uint)
+0:96                direct index ( temp uint)
+0:96                  'dti' ( in 3-component vector of uint)
+0:96                  Constant:
+0:96                    0 (const int)
+0:96              Constant:
+0:96                0 (const int)
+0:96            Sequence
+0:96              Constant:
+0:96                0 (const int)
+0:96              Constant:
+0:96                1 (const int)
+0:97      move second child to first child ( temp 3-component vector of uint)
+0:97        vector swizzle ( temp 3-component vector of uint)
+0:97          u: direct index for structure ( temp 4-component vector of uint)
+0:97            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:97              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:97                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:97                Constant:
+0:97                  0 (const uint)
+0:97              direct index ( temp uint)
+0:97                'dti' ( in 3-component vector of uint)
+0:97                Constant:
+0:97                  0 (const int)
+0:97            Constant:
+0:97              0 (const int)
+0:97          Sequence
+0:97            Constant:
+0:97              0 (const int)
+0:97            Constant:
+0:97              1 (const int)
+0:97            Constant:
+0:97              2 (const int)
+0:97        subgroupQuadSwapHorizontal ( temp 3-component vector of uint)
+0:97          vector swizzle ( temp 3-component vector of uint)
+0:97            u: direct index for structure ( temp 4-component vector of uint)
+0:97              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:97                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:97                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:97                  Constant:
+0:97                    0 (const uint)
+0:97                direct index ( temp uint)
+0:97                  'dti' ( in 3-component vector of uint)
+0:97                  Constant:
+0:97                    0 (const int)
+0:97              Constant:
+0:97                0 (const int)
+0:97            Sequence
+0:97              Constant:
+0:97                0 (const int)
+0:97              Constant:
+0:97                1 (const int)
+0:97              Constant:
+0:97                2 (const int)
+0:99      move second child to first child ( temp 4-component vector of int)
+0:99        i: direct index for structure ( temp 4-component vector of int)
+0:99          indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:99            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:99              'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:99              Constant:
+0:99                0 (const uint)
+0:99            direct index ( temp uint)
+0:99              'dti' ( in 3-component vector of uint)
+0:99              Constant:
+0:99                0 (const int)
+0:99          Constant:
+0:99            1 (const int)
+0:99        subgroupQuadSwapHorizontal ( temp 4-component vector of int)
+0:99          i: direct index for structure ( temp 4-component vector of int)
+0:99            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:99              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:99                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:99                Constant:
+0:99                  0 (const uint)
+0:99              direct index ( temp uint)
+0:99                'dti' ( in 3-component vector of uint)
+0:99                Constant:
+0:99                  0 (const int)
+0:99            Constant:
+0:99              1 (const int)
+0:100      move second child to first child ( temp int)
+0:100        direct index ( temp int)
+0:100          i: direct index for structure ( temp 4-component vector of int)
+0:100            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:100              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:100                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:100                Constant:
+0:100                  0 (const uint)
+0:100              direct index ( temp uint)
+0:100                'dti' ( in 3-component vector of uint)
+0:100                Constant:
+0:100                  0 (const int)
+0:100            Constant:
+0:100              1 (const int)
+0:100          Constant:
+0:100            0 (const int)
+0:100        subgroupQuadSwapHorizontal ( temp int)
+0:100          direct index ( temp int)
+0:100            i: direct index for structure ( temp 4-component vector of int)
+0:100              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:100                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:100                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:100                  Constant:
+0:100                    0 (const uint)
+0:100                direct index ( temp uint)
+0:100                  'dti' ( in 3-component vector of uint)
+0:100                  Constant:
+0:100                    0 (const int)
+0:100              Constant:
+0:100                1 (const int)
+0:100            Constant:
+0:100              0 (const int)
+0:101      move second child to first child ( temp 2-component vector of int)
+0:101        vector swizzle ( temp 2-component vector of int)
+0:101          i: direct index for structure ( temp 4-component vector of int)
+0:101            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:101              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:101                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:101                Constant:
+0:101                  0 (const uint)
+0:101              direct index ( temp uint)
+0:101                'dti' ( in 3-component vector of uint)
+0:101                Constant:
+0:101                  0 (const int)
+0:101            Constant:
+0:101              1 (const int)
+0:101          Sequence
+0:101            Constant:
+0:101              0 (const int)
+0:101            Constant:
+0:101              1 (const int)
+0:101        subgroupQuadSwapHorizontal ( temp 2-component vector of int)
+0:101          vector swizzle ( temp 2-component vector of int)
+0:101            i: direct index for structure ( temp 4-component vector of int)
+0:101              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:101                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:101                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:101                  Constant:
+0:101                    0 (const uint)
+0:101                direct index ( temp uint)
+0:101                  'dti' ( in 3-component vector of uint)
+0:101                  Constant:
+0:101                    0 (const int)
+0:101              Constant:
+0:101                1 (const int)
+0:101            Sequence
+0:101              Constant:
+0:101                0 (const int)
+0:101              Constant:
+0:101                1 (const int)
+0:102      move second child to first child ( temp 3-component vector of int)
+0:102        vector swizzle ( temp 3-component vector of int)
+0:102          i: direct index for structure ( temp 4-component vector of int)
+0:102            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:102              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:102                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:102                Constant:
+0:102                  0 (const uint)
+0:102              direct index ( temp uint)
+0:102                'dti' ( in 3-component vector of uint)
+0:102                Constant:
+0:102                  0 (const int)
+0:102            Constant:
+0:102              1 (const int)
+0:102          Sequence
+0:102            Constant:
+0:102              0 (const int)
+0:102            Constant:
+0:102              1 (const int)
+0:102            Constant:
+0:102              2 (const int)
+0:102        subgroupQuadSwapHorizontal ( temp 3-component vector of int)
+0:102          vector swizzle ( temp 3-component vector of int)
+0:102            i: direct index for structure ( temp 4-component vector of int)
+0:102              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:102                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:102                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:102                  Constant:
+0:102                    0 (const uint)
+0:102                direct index ( temp uint)
+0:102                  'dti' ( in 3-component vector of uint)
+0:102                  Constant:
+0:102                    0 (const int)
+0:102              Constant:
+0:102                1 (const int)
+0:102            Sequence
+0:102              Constant:
+0:102                0 (const int)
+0:102              Constant:
+0:102                1 (const int)
+0:102              Constant:
+0:102                2 (const int)
+0:104      move second child to first child ( temp 4-component vector of float)
+0:104        f: direct index for structure ( temp 4-component vector of float)
+0:104          indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:104            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:104              'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:104              Constant:
+0:104                0 (const uint)
+0:104            direct index ( temp uint)
+0:104              'dti' ( in 3-component vector of uint)
+0:104              Constant:
+0:104                0 (const int)
+0:104          Constant:
+0:104            2 (const int)
+0:104        subgroupQuadSwapHorizontal ( temp 4-component vector of float)
+0:104          f: direct index for structure ( temp 4-component vector of float)
+0:104            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:104              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:104                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:104                Constant:
+0:104                  0 (const uint)
+0:104              direct index ( temp uint)
+0:104                'dti' ( in 3-component vector of uint)
+0:104                Constant:
+0:104                  0 (const int)
+0:104            Constant:
+0:104              2 (const int)
+0:105      move second child to first child ( temp float)
+0:105        direct index ( temp float)
+0:105          f: direct index for structure ( temp 4-component vector of float)
+0:105            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:105              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:105                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:105                Constant:
+0:105                  0 (const uint)
+0:105              direct index ( temp uint)
+0:105                'dti' ( in 3-component vector of uint)
+0:105                Constant:
+0:105                  0 (const int)
+0:105            Constant:
+0:105              2 (const int)
+0:105          Constant:
+0:105            0 (const int)
+0:105        subgroupQuadSwapHorizontal ( temp float)
+0:105          direct index ( temp float)
+0:105            f: direct index for structure ( temp 4-component vector of float)
+0:105              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:105                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:105                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:105                  Constant:
+0:105                    0 (const uint)
+0:105                direct index ( temp uint)
+0:105                  'dti' ( in 3-component vector of uint)
+0:105                  Constant:
+0:105                    0 (const int)
+0:105              Constant:
+0:105                2 (const int)
+0:105            Constant:
+0:105              0 (const int)
+0:106      move second child to first child ( temp 2-component vector of float)
+0:106        vector swizzle ( temp 2-component vector of float)
+0:106          f: direct index for structure ( temp 4-component vector of float)
+0:106            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:106              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:106                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:106                Constant:
+0:106                  0 (const uint)
+0:106              direct index ( temp uint)
+0:106                'dti' ( in 3-component vector of uint)
+0:106                Constant:
+0:106                  0 (const int)
+0:106            Constant:
+0:106              2 (const int)
+0:106          Sequence
+0:106            Constant:
+0:106              0 (const int)
+0:106            Constant:
+0:106              1 (const int)
+0:106        subgroupQuadSwapHorizontal ( temp 2-component vector of float)
+0:106          vector swizzle ( temp 2-component vector of float)
+0:106            f: direct index for structure ( temp 4-component vector of float)
+0:106              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:106                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:106                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:106                  Constant:
+0:106                    0 (const uint)
+0:106                direct index ( temp uint)
+0:106                  'dti' ( in 3-component vector of uint)
+0:106                  Constant:
+0:106                    0 (const int)
+0:106              Constant:
+0:106                2 (const int)
+0:106            Sequence
+0:106              Constant:
+0:106                0 (const int)
+0:106              Constant:
+0:106                1 (const int)
+0:107      move second child to first child ( temp 3-component vector of float)
+0:107        vector swizzle ( temp 3-component vector of float)
+0:107          f: direct index for structure ( temp 4-component vector of float)
+0:107            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:107              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:107                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:107                Constant:
+0:107                  0 (const uint)
+0:107              direct index ( temp uint)
+0:107                'dti' ( in 3-component vector of uint)
+0:107                Constant:
+0:107                  0 (const int)
+0:107            Constant:
+0:107              2 (const int)
+0:107          Sequence
+0:107            Constant:
+0:107              0 (const int)
+0:107            Constant:
+0:107              1 (const int)
+0:107            Constant:
+0:107              2 (const int)
+0:107        subgroupQuadSwapHorizontal ( temp 3-component vector of float)
+0:107          vector swizzle ( temp 3-component vector of float)
+0:107            f: direct index for structure ( temp 4-component vector of float)
+0:107              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:107                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:107                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:107                  Constant:
+0:107                    0 (const uint)
+0:107                direct index ( temp uint)
+0:107                  'dti' ( in 3-component vector of uint)
+0:107                  Constant:
+0:107                    0 (const int)
+0:107              Constant:
+0:107                2 (const int)
+0:107            Sequence
+0:107              Constant:
+0:107                0 (const int)
+0:107              Constant:
+0:107                1 (const int)
+0:107              Constant:
+0:107                2 (const int)
+0:109      move second child to first child ( temp 4-component vector of double)
+0:109        d: direct index for structure ( temp 4-component vector of double)
+0:109          indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:109            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:109              'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:109              Constant:
+0:109                0 (const uint)
+0:109            direct index ( temp uint)
+0:109              'dti' ( in 3-component vector of uint)
+0:109              Constant:
+0:109                0 (const int)
+0:109          Constant:
+0:109            3 (const int)
+0:109        subgroupQuadSwapHorizontal ( temp 4-component vector of double)
+0:109          d: direct index for structure ( temp 4-component vector of double)
+0:109            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:109              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:109                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:109                Constant:
+0:109                  0 (const uint)
+0:109              direct index ( temp uint)
+0:109                'dti' ( in 3-component vector of uint)
+0:109                Constant:
+0:109                  0 (const int)
+0:109            Constant:
+0:109              3 (const int)
+0:110      move second child to first child ( temp double)
+0:110        direct index ( temp double)
+0:110          d: direct index for structure ( temp 4-component vector of double)
+0:110            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:110              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:110                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:110                Constant:
+0:110                  0 (const uint)
+0:110              direct index ( temp uint)
+0:110                'dti' ( in 3-component vector of uint)
+0:110                Constant:
+0:110                  0 (const int)
+0:110            Constant:
+0:110              3 (const int)
+0:110          Constant:
+0:110            0 (const int)
+0:110        subgroupQuadSwapHorizontal ( temp double)
+0:110          direct index ( temp double)
+0:110            d: direct index for structure ( temp 4-component vector of double)
+0:110              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:110                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:110                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:110                  Constant:
+0:110                    0 (const uint)
+0:110                direct index ( temp uint)
+0:110                  'dti' ( in 3-component vector of uint)
+0:110                  Constant:
+0:110                    0 (const int)
+0:110              Constant:
+0:110                3 (const int)
+0:110            Constant:
+0:110              0 (const int)
+0:111      move second child to first child ( temp 2-component vector of double)
+0:111        vector swizzle ( temp 2-component vector of double)
+0:111          d: direct index for structure ( temp 4-component vector of double)
+0:111            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:111              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:111                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:111                Constant:
+0:111                  0 (const uint)
+0:111              direct index ( temp uint)
+0:111                'dti' ( in 3-component vector of uint)
+0:111                Constant:
+0:111                  0 (const int)
+0:111            Constant:
+0:111              3 (const int)
+0:111          Sequence
+0:111            Constant:
+0:111              0 (const int)
+0:111            Constant:
+0:111              1 (const int)
+0:111        subgroupQuadSwapHorizontal ( temp 2-component vector of double)
+0:111          vector swizzle ( temp 2-component vector of double)
+0:111            d: direct index for structure ( temp 4-component vector of double)
+0:111              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:111                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:111                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:111                  Constant:
+0:111                    0 (const uint)
+0:111                direct index ( temp uint)
+0:111                  'dti' ( in 3-component vector of uint)
+0:111                  Constant:
+0:111                    0 (const int)
+0:111              Constant:
+0:111                3 (const int)
+0:111            Sequence
+0:111              Constant:
+0:111                0 (const int)
+0:111              Constant:
+0:111                1 (const int)
+0:112      move second child to first child ( temp 3-component vector of double)
+0:112        vector swizzle ( temp 3-component vector of double)
+0:112          d: direct index for structure ( temp 4-component vector of double)
+0:112            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:112              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:112                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:112                Constant:
+0:112                  0 (const uint)
+0:112              direct index ( temp uint)
+0:112                'dti' ( in 3-component vector of uint)
+0:112                Constant:
+0:112                  0 (const int)
+0:112            Constant:
+0:112              3 (const int)
+0:112          Sequence
+0:112            Constant:
+0:112              0 (const int)
+0:112            Constant:
+0:112              1 (const int)
+0:112            Constant:
+0:112              2 (const int)
+0:112        subgroupQuadSwapHorizontal ( temp 3-component vector of double)
+0:112          vector swizzle ( temp 3-component vector of double)
+0:112            d: direct index for structure ( temp 4-component vector of double)
+0:112              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:112                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:112                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:112                  Constant:
+0:112                    0 (const uint)
+0:112                direct index ( temp uint)
+0:112                  'dti' ( in 3-component vector of uint)
+0:112                  Constant:
+0:112                    0 (const int)
+0:112              Constant:
+0:112                3 (const int)
+0:112            Sequence
+0:112              Constant:
+0:112                0 (const int)
+0:112              Constant:
+0:112                1 (const int)
+0:112              Constant:
+0:112                2 (const int)
+0:114      move second child to first child ( temp 4-component vector of uint)
+0:114        u: direct index for structure ( temp 4-component vector of uint)
+0:114          indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:114            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:114              'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:114              Constant:
+0:114                0 (const uint)
+0:114            direct index ( temp uint)
+0:114              'dti' ( in 3-component vector of uint)
+0:114              Constant:
+0:114                0 (const int)
+0:114          Constant:
+0:114            0 (const int)
+0:114        subgroupQuadSwapVertical ( temp 4-component vector of uint)
+0:114          u: direct index for structure ( temp 4-component vector of uint)
+0:114            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:114              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:114                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:114                Constant:
+0:114                  0 (const uint)
+0:114              direct index ( temp uint)
+0:114                'dti' ( in 3-component vector of uint)
+0:114                Constant:
+0:114                  0 (const int)
+0:114            Constant:
+0:114              0 (const int)
+0:115      move second child to first child ( temp uint)
+0:115        direct index ( temp uint)
+0:115          u: direct index for structure ( temp 4-component vector of uint)
+0:115            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:115              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:115                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:115                Constant:
+0:115                  0 (const uint)
+0:115              direct index ( temp uint)
+0:115                'dti' ( in 3-component vector of uint)
+0:115                Constant:
+0:115                  0 (const int)
+0:115            Constant:
+0:115              0 (const int)
+0:115          Constant:
+0:115            0 (const int)
+0:115        subgroupQuadSwapVertical ( temp uint)
+0:115          direct index ( temp uint)
+0:115            u: direct index for structure ( temp 4-component vector of uint)
+0:115              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:115                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:115                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:115                  Constant:
+0:115                    0 (const uint)
+0:115                direct index ( temp uint)
+0:115                  'dti' ( in 3-component vector of uint)
+0:115                  Constant:
+0:115                    0 (const int)
+0:115              Constant:
+0:115                0 (const int)
+0:115            Constant:
+0:115              0 (const int)
+0:116      move second child to first child ( temp 2-component vector of uint)
+0:116        vector swizzle ( temp 2-component vector of uint)
+0:116          u: direct index for structure ( temp 4-component vector of uint)
+0:116            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:116              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:116                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:116                Constant:
+0:116                  0 (const uint)
+0:116              direct index ( temp uint)
+0:116                'dti' ( in 3-component vector of uint)
+0:116                Constant:
+0:116                  0 (const int)
+0:116            Constant:
+0:116              0 (const int)
+0:116          Sequence
+0:116            Constant:
+0:116              0 (const int)
+0:116            Constant:
+0:116              1 (const int)
+0:116        subgroupQuadSwapVertical ( temp 2-component vector of uint)
+0:116          vector swizzle ( temp 2-component vector of uint)
+0:116            u: direct index for structure ( temp 4-component vector of uint)
+0:116              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:116                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:116                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:116                  Constant:
+0:116                    0 (const uint)
+0:116                direct index ( temp uint)
+0:116                  'dti' ( in 3-component vector of uint)
+0:116                  Constant:
+0:116                    0 (const int)
+0:116              Constant:
+0:116                0 (const int)
+0:116            Sequence
+0:116              Constant:
+0:116                0 (const int)
+0:116              Constant:
+0:116                1 (const int)
+0:117      move second child to first child ( temp 3-component vector of uint)
+0:117        vector swizzle ( temp 3-component vector of uint)
+0:117          u: direct index for structure ( temp 4-component vector of uint)
+0:117            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:117              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:117                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:117                Constant:
+0:117                  0 (const uint)
+0:117              direct index ( temp uint)
+0:117                'dti' ( in 3-component vector of uint)
+0:117                Constant:
+0:117                  0 (const int)
+0:117            Constant:
+0:117              0 (const int)
+0:117          Sequence
+0:117            Constant:
+0:117              0 (const int)
+0:117            Constant:
+0:117              1 (const int)
+0:117            Constant:
+0:117              2 (const int)
+0:117        subgroupQuadSwapVertical ( temp 3-component vector of uint)
+0:117          vector swizzle ( temp 3-component vector of uint)
+0:117            u: direct index for structure ( temp 4-component vector of uint)
+0:117              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:117                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:117                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:117                  Constant:
+0:117                    0 (const uint)
+0:117                direct index ( temp uint)
+0:117                  'dti' ( in 3-component vector of uint)
+0:117                  Constant:
+0:117                    0 (const int)
+0:117              Constant:
+0:117                0 (const int)
+0:117            Sequence
+0:117              Constant:
+0:117                0 (const int)
+0:117              Constant:
+0:117                1 (const int)
+0:117              Constant:
+0:117                2 (const int)
+0:119      move second child to first child ( temp 4-component vector of int)
+0:119        i: direct index for structure ( temp 4-component vector of int)
+0:119          indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:119            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:119              'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:119              Constant:
+0:119                0 (const uint)
+0:119            direct index ( temp uint)
+0:119              'dti' ( in 3-component vector of uint)
+0:119              Constant:
+0:119                0 (const int)
+0:119          Constant:
+0:119            1 (const int)
+0:119        subgroupQuadSwapVertical ( temp 4-component vector of int)
+0:119          i: direct index for structure ( temp 4-component vector of int)
+0:119            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:119              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:119                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:119                Constant:
+0:119                  0 (const uint)
+0:119              direct index ( temp uint)
+0:119                'dti' ( in 3-component vector of uint)
+0:119                Constant:
+0:119                  0 (const int)
+0:119            Constant:
+0:119              1 (const int)
+0:120      move second child to first child ( temp int)
+0:120        direct index ( temp int)
+0:120          i: direct index for structure ( temp 4-component vector of int)
+0:120            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:120              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:120                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:120                Constant:
+0:120                  0 (const uint)
+0:120              direct index ( temp uint)
+0:120                'dti' ( in 3-component vector of uint)
+0:120                Constant:
+0:120                  0 (const int)
+0:120            Constant:
+0:120              1 (const int)
+0:120          Constant:
+0:120            0 (const int)
+0:120        subgroupQuadSwapVertical ( temp int)
+0:120          direct index ( temp int)
+0:120            i: direct index for structure ( temp 4-component vector of int)
+0:120              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:120                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:120                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:120                  Constant:
+0:120                    0 (const uint)
+0:120                direct index ( temp uint)
+0:120                  'dti' ( in 3-component vector of uint)
+0:120                  Constant:
+0:120                    0 (const int)
+0:120              Constant:
+0:120                1 (const int)
+0:120            Constant:
+0:120              0 (const int)
+0:121      move second child to first child ( temp 2-component vector of int)
+0:121        vector swizzle ( temp 2-component vector of int)
+0:121          i: direct index for structure ( temp 4-component vector of int)
+0:121            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:121              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:121                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:121                Constant:
+0:121                  0 (const uint)
+0:121              direct index ( temp uint)
+0:121                'dti' ( in 3-component vector of uint)
+0:121                Constant:
+0:121                  0 (const int)
+0:121            Constant:
+0:121              1 (const int)
+0:121          Sequence
+0:121            Constant:
+0:121              0 (const int)
+0:121            Constant:
+0:121              1 (const int)
+0:121        subgroupQuadSwapVertical ( temp 2-component vector of int)
+0:121          vector swizzle ( temp 2-component vector of int)
+0:121            i: direct index for structure ( temp 4-component vector of int)
+0:121              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:121                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:121                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:121                  Constant:
+0:121                    0 (const uint)
+0:121                direct index ( temp uint)
+0:121                  'dti' ( in 3-component vector of uint)
+0:121                  Constant:
+0:121                    0 (const int)
+0:121              Constant:
+0:121                1 (const int)
+0:121            Sequence
+0:121              Constant:
+0:121                0 (const int)
+0:121              Constant:
+0:121                1 (const int)
+0:122      move second child to first child ( temp 3-component vector of int)
+0:122        vector swizzle ( temp 3-component vector of int)
+0:122          i: direct index for structure ( temp 4-component vector of int)
+0:122            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:122              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:122                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:122                Constant:
+0:122                  0 (const uint)
+0:122              direct index ( temp uint)
+0:122                'dti' ( in 3-component vector of uint)
+0:122                Constant:
+0:122                  0 (const int)
+0:122            Constant:
+0:122              1 (const int)
+0:122          Sequence
+0:122            Constant:
+0:122              0 (const int)
+0:122            Constant:
+0:122              1 (const int)
+0:122            Constant:
+0:122              2 (const int)
+0:122        subgroupQuadSwapVertical ( temp 3-component vector of int)
+0:122          vector swizzle ( temp 3-component vector of int)
+0:122            i: direct index for structure ( temp 4-component vector of int)
+0:122              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:122                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:122                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:122                  Constant:
+0:122                    0 (const uint)
+0:122                direct index ( temp uint)
+0:122                  'dti' ( in 3-component vector of uint)
+0:122                  Constant:
+0:122                    0 (const int)
+0:122              Constant:
+0:122                1 (const int)
+0:122            Sequence
+0:122              Constant:
+0:122                0 (const int)
+0:122              Constant:
+0:122                1 (const int)
+0:122              Constant:
+0:122                2 (const int)
+0:124      move second child to first child ( temp 4-component vector of float)
+0:124        f: direct index for structure ( temp 4-component vector of float)
+0:124          indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:124            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:124              'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:124              Constant:
+0:124                0 (const uint)
+0:124            direct index ( temp uint)
+0:124              'dti' ( in 3-component vector of uint)
+0:124              Constant:
+0:124                0 (const int)
+0:124          Constant:
+0:124            2 (const int)
+0:124        subgroupQuadSwapVertical ( temp 4-component vector of float)
+0:124          f: direct index for structure ( temp 4-component vector of float)
+0:124            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:124              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:124                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:124                Constant:
+0:124                  0 (const uint)
+0:124              direct index ( temp uint)
+0:124                'dti' ( in 3-component vector of uint)
+0:124                Constant:
+0:124                  0 (const int)
+0:124            Constant:
+0:124              2 (const int)
+0:125      move second child to first child ( temp float)
+0:125        direct index ( temp float)
+0:125          f: direct index for structure ( temp 4-component vector of float)
+0:125            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:125              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:125                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:125                Constant:
+0:125                  0 (const uint)
+0:125              direct index ( temp uint)
+0:125                'dti' ( in 3-component vector of uint)
+0:125                Constant:
+0:125                  0 (const int)
+0:125            Constant:
+0:125              2 (const int)
+0:125          Constant:
+0:125            0 (const int)
+0:125        subgroupQuadSwapVertical ( temp float)
+0:125          direct index ( temp float)
+0:125            f: direct index for structure ( temp 4-component vector of float)
+0:125              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:125                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:125                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:125                  Constant:
+0:125                    0 (const uint)
+0:125                direct index ( temp uint)
+0:125                  'dti' ( in 3-component vector of uint)
+0:125                  Constant:
+0:125                    0 (const int)
+0:125              Constant:
+0:125                2 (const int)
+0:125            Constant:
+0:125              0 (const int)
+0:126      move second child to first child ( temp 2-component vector of float)
+0:126        vector swizzle ( temp 2-component vector of float)
+0:126          f: direct index for structure ( temp 4-component vector of float)
+0:126            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:126              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:126                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:126                Constant:
+0:126                  0 (const uint)
+0:126              direct index ( temp uint)
+0:126                'dti' ( in 3-component vector of uint)
+0:126                Constant:
+0:126                  0 (const int)
+0:126            Constant:
+0:126              2 (const int)
+0:126          Sequence
+0:126            Constant:
+0:126              0 (const int)
+0:126            Constant:
+0:126              1 (const int)
+0:126        subgroupQuadSwapVertical ( temp 2-component vector of float)
+0:126          vector swizzle ( temp 2-component vector of float)
+0:126            f: direct index for structure ( temp 4-component vector of float)
+0:126              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:126                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:126                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:126                  Constant:
+0:126                    0 (const uint)
+0:126                direct index ( temp uint)
+0:126                  'dti' ( in 3-component vector of uint)
+0:126                  Constant:
+0:126                    0 (const int)
+0:126              Constant:
+0:126                2 (const int)
+0:126            Sequence
+0:126              Constant:
+0:126                0 (const int)
+0:126              Constant:
+0:126                1 (const int)
+0:127      move second child to first child ( temp 3-component vector of float)
+0:127        vector swizzle ( temp 3-component vector of float)
+0:127          f: direct index for structure ( temp 4-component vector of float)
+0:127            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:127              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:127                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:127                Constant:
+0:127                  0 (const uint)
+0:127              direct index ( temp uint)
+0:127                'dti' ( in 3-component vector of uint)
+0:127                Constant:
+0:127                  0 (const int)
+0:127            Constant:
+0:127              2 (const int)
+0:127          Sequence
+0:127            Constant:
+0:127              0 (const int)
+0:127            Constant:
+0:127              1 (const int)
+0:127            Constant:
+0:127              2 (const int)
+0:127        subgroupQuadSwapVertical ( temp 3-component vector of float)
+0:127          vector swizzle ( temp 3-component vector of float)
+0:127            f: direct index for structure ( temp 4-component vector of float)
+0:127              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:127                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:127                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:127                  Constant:
+0:127                    0 (const uint)
+0:127                direct index ( temp uint)
+0:127                  'dti' ( in 3-component vector of uint)
+0:127                  Constant:
+0:127                    0 (const int)
+0:127              Constant:
+0:127                2 (const int)
+0:127            Sequence
+0:127              Constant:
+0:127                0 (const int)
+0:127              Constant:
+0:127                1 (const int)
+0:127              Constant:
+0:127                2 (const int)
+0:129      move second child to first child ( temp 4-component vector of double)
+0:129        d: direct index for structure ( temp 4-component vector of double)
+0:129          indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:129            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:129              'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:129              Constant:
+0:129                0 (const uint)
+0:129            direct index ( temp uint)
+0:129              'dti' ( in 3-component vector of uint)
+0:129              Constant:
+0:129                0 (const int)
+0:129          Constant:
+0:129            3 (const int)
+0:129        subgroupQuadSwapVertical ( temp 4-component vector of double)
+0:129          d: direct index for structure ( temp 4-component vector of double)
+0:129            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:129              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:129                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:129                Constant:
+0:129                  0 (const uint)
+0:129              direct index ( temp uint)
+0:129                'dti' ( in 3-component vector of uint)
+0:129                Constant:
+0:129                  0 (const int)
+0:129            Constant:
+0:129              3 (const int)
+0:130      move second child to first child ( temp double)
+0:130        direct index ( temp double)
+0:130          d: direct index for structure ( temp 4-component vector of double)
+0:130            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:130              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:130                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:130                Constant:
+0:130                  0 (const uint)
+0:130              direct index ( temp uint)
+0:130                'dti' ( in 3-component vector of uint)
+0:130                Constant:
+0:130                  0 (const int)
+0:130            Constant:
+0:130              3 (const int)
+0:130          Constant:
+0:130            0 (const int)
+0:130        subgroupQuadSwapVertical ( temp double)
+0:130          direct index ( temp double)
+0:130            d: direct index for structure ( temp 4-component vector of double)
+0:130              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:130                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:130                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:130                  Constant:
+0:130                    0 (const uint)
+0:130                direct index ( temp uint)
+0:130                  'dti' ( in 3-component vector of uint)
+0:130                  Constant:
+0:130                    0 (const int)
+0:130              Constant:
+0:130                3 (const int)
+0:130            Constant:
+0:130              0 (const int)
+0:131      move second child to first child ( temp 2-component vector of double)
+0:131        vector swizzle ( temp 2-component vector of double)
+0:131          d: direct index for structure ( temp 4-component vector of double)
+0:131            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:131              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:131                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:131                Constant:
+0:131                  0 (const uint)
+0:131              direct index ( temp uint)
+0:131                'dti' ( in 3-component vector of uint)
+0:131                Constant:
+0:131                  0 (const int)
+0:131            Constant:
+0:131              3 (const int)
+0:131          Sequence
+0:131            Constant:
+0:131              0 (const int)
+0:131            Constant:
+0:131              1 (const int)
+0:131        subgroupQuadSwapVertical ( temp 2-component vector of double)
+0:131          vector swizzle ( temp 2-component vector of double)
+0:131            d: direct index for structure ( temp 4-component vector of double)
+0:131              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:131                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:131                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:131                  Constant:
+0:131                    0 (const uint)
+0:131                direct index ( temp uint)
+0:131                  'dti' ( in 3-component vector of uint)
+0:131                  Constant:
+0:131                    0 (const int)
+0:131              Constant:
+0:131                3 (const int)
+0:131            Sequence
+0:131              Constant:
+0:131                0 (const int)
+0:131              Constant:
+0:131                1 (const int)
+0:132      move second child to first child ( temp 3-component vector of double)
+0:132        vector swizzle ( temp 3-component vector of double)
+0:132          d: direct index for structure ( temp 4-component vector of double)
+0:132            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:132              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:132                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:132                Constant:
+0:132                  0 (const uint)
+0:132              direct index ( temp uint)
+0:132                'dti' ( in 3-component vector of uint)
+0:132                Constant:
+0:132                  0 (const int)
+0:132            Constant:
+0:132              3 (const int)
+0:132          Sequence
+0:132            Constant:
+0:132              0 (const int)
+0:132            Constant:
+0:132              1 (const int)
+0:132            Constant:
+0:132              2 (const int)
+0:132        subgroupQuadSwapVertical ( temp 3-component vector of double)
+0:132          vector swizzle ( temp 3-component vector of double)
+0:132            d: direct index for structure ( temp 4-component vector of double)
+0:132              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:132                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:132                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:132                  Constant:
+0:132                    0 (const uint)
+0:132                direct index ( temp uint)
+0:132                  'dti' ( in 3-component vector of uint)
+0:132                  Constant:
+0:132                    0 (const int)
+0:132              Constant:
+0:132                3 (const int)
+0:132            Sequence
+0:132              Constant:
+0:132                0 (const int)
+0:132              Constant:
+0:132                1 (const int)
+0:132              Constant:
+0:132                2 (const int)
+0:134      move second child to first child ( temp 4-component vector of uint)
+0:134        u: direct index for structure ( temp 4-component vector of uint)
+0:134          indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:134            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:134              'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:134              Constant:
+0:134                0 (const uint)
+0:134            direct index ( temp uint)
+0:134              'dti' ( in 3-component vector of uint)
+0:134              Constant:
+0:134                0 (const int)
+0:134          Constant:
+0:134            0 (const int)
+0:134        subgroupQuadSwapDiagonal ( temp 4-component vector of uint)
+0:134          u: direct index for structure ( temp 4-component vector of uint)
+0:134            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:134              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:134                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:134                Constant:
+0:134                  0 (const uint)
+0:134              direct index ( temp uint)
+0:134                'dti' ( in 3-component vector of uint)
+0:134                Constant:
+0:134                  0 (const int)
+0:134            Constant:
+0:134              0 (const int)
+0:135      move second child to first child ( temp uint)
+0:135        direct index ( temp uint)
+0:135          u: direct index for structure ( temp 4-component vector of uint)
+0:135            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:135              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:135                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:135                Constant:
+0:135                  0 (const uint)
+0:135              direct index ( temp uint)
+0:135                'dti' ( in 3-component vector of uint)
+0:135                Constant:
+0:135                  0 (const int)
+0:135            Constant:
+0:135              0 (const int)
+0:135          Constant:
+0:135            0 (const int)
+0:135        subgroupQuadSwapDiagonal ( temp uint)
+0:135          direct index ( temp uint)
+0:135            u: direct index for structure ( temp 4-component vector of uint)
+0:135              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:135                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:135                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:135                  Constant:
+0:135                    0 (const uint)
+0:135                direct index ( temp uint)
+0:135                  'dti' ( in 3-component vector of uint)
+0:135                  Constant:
+0:135                    0 (const int)
+0:135              Constant:
+0:135                0 (const int)
+0:135            Constant:
+0:135              0 (const int)
+0:136      move second child to first child ( temp 2-component vector of uint)
+0:136        vector swizzle ( temp 2-component vector of uint)
+0:136          u: direct index for structure ( temp 4-component vector of uint)
+0:136            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:136              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:136                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:136                Constant:
+0:136                  0 (const uint)
+0:136              direct index ( temp uint)
+0:136                'dti' ( in 3-component vector of uint)
+0:136                Constant:
+0:136                  0 (const int)
+0:136            Constant:
+0:136              0 (const int)
+0:136          Sequence
+0:136            Constant:
+0:136              0 (const int)
+0:136            Constant:
+0:136              1 (const int)
+0:136        subgroupQuadSwapDiagonal ( temp 2-component vector of uint)
+0:136          vector swizzle ( temp 2-component vector of uint)
+0:136            u: direct index for structure ( temp 4-component vector of uint)
+0:136              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:136                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:136                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:136                  Constant:
+0:136                    0 (const uint)
+0:136                direct index ( temp uint)
+0:136                  'dti' ( in 3-component vector of uint)
+0:136                  Constant:
+0:136                    0 (const int)
+0:136              Constant:
+0:136                0 (const int)
+0:136            Sequence
+0:136              Constant:
+0:136                0 (const int)
+0:136              Constant:
+0:136                1 (const int)
+0:137      move second child to first child ( temp 3-component vector of uint)
+0:137        vector swizzle ( temp 3-component vector of uint)
+0:137          u: direct index for structure ( temp 4-component vector of uint)
+0:137            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:137              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:137                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:137                Constant:
+0:137                  0 (const uint)
+0:137              direct index ( temp uint)
+0:137                'dti' ( in 3-component vector of uint)
+0:137                Constant:
+0:137                  0 (const int)
+0:137            Constant:
+0:137              0 (const int)
+0:137          Sequence
+0:137            Constant:
+0:137              0 (const int)
+0:137            Constant:
+0:137              1 (const int)
+0:137            Constant:
+0:137              2 (const int)
+0:137        subgroupQuadSwapDiagonal ( temp 3-component vector of uint)
+0:137          vector swizzle ( temp 3-component vector of uint)
+0:137            u: direct index for structure ( temp 4-component vector of uint)
+0:137              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:137                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:137                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:137                  Constant:
+0:137                    0 (const uint)
+0:137                direct index ( temp uint)
+0:137                  'dti' ( in 3-component vector of uint)
+0:137                  Constant:
+0:137                    0 (const int)
+0:137              Constant:
+0:137                0 (const int)
+0:137            Sequence
+0:137              Constant:
+0:137                0 (const int)
+0:137              Constant:
+0:137                1 (const int)
+0:137              Constant:
+0:137                2 (const int)
+0:139      move second child to first child ( temp 4-component vector of int)
+0:139        i: direct index for structure ( temp 4-component vector of int)
+0:139          indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:139            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:139              'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:139              Constant:
+0:139                0 (const uint)
+0:139            direct index ( temp uint)
+0:139              'dti' ( in 3-component vector of uint)
+0:139              Constant:
+0:139                0 (const int)
+0:139          Constant:
+0:139            1 (const int)
+0:139        subgroupQuadSwapDiagonal ( temp 4-component vector of int)
+0:139          i: direct index for structure ( temp 4-component vector of int)
+0:139            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:139              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:139                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:139                Constant:
+0:139                  0 (const uint)
+0:139              direct index ( temp uint)
+0:139                'dti' ( in 3-component vector of uint)
+0:139                Constant:
+0:139                  0 (const int)
+0:139            Constant:
+0:139              1 (const int)
+0:140      move second child to first child ( temp int)
+0:140        direct index ( temp int)
+0:140          i: direct index for structure ( temp 4-component vector of int)
+0:140            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:140              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:140                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:140                Constant:
+0:140                  0 (const uint)
+0:140              direct index ( temp uint)
+0:140                'dti' ( in 3-component vector of uint)
+0:140                Constant:
+0:140                  0 (const int)
+0:140            Constant:
+0:140              1 (const int)
+0:140          Constant:
+0:140            0 (const int)
+0:140        subgroupQuadSwapDiagonal ( temp int)
+0:140          direct index ( temp int)
+0:140            i: direct index for structure ( temp 4-component vector of int)
+0:140              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:140                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:140                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:140                  Constant:
+0:140                    0 (const uint)
+0:140                direct index ( temp uint)
+0:140                  'dti' ( in 3-component vector of uint)
+0:140                  Constant:
+0:140                    0 (const int)
+0:140              Constant:
+0:140                1 (const int)
+0:140            Constant:
+0:140              0 (const int)
+0:141      move second child to first child ( temp 2-component vector of int)
+0:141        vector swizzle ( temp 2-component vector of int)
+0:141          i: direct index for structure ( temp 4-component vector of int)
+0:141            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:141              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:141                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:141                Constant:
+0:141                  0 (const uint)
+0:141              direct index ( temp uint)
+0:141                'dti' ( in 3-component vector of uint)
+0:141                Constant:
+0:141                  0 (const int)
+0:141            Constant:
+0:141              1 (const int)
+0:141          Sequence
+0:141            Constant:
+0:141              0 (const int)
+0:141            Constant:
+0:141              1 (const int)
+0:141        subgroupQuadSwapDiagonal ( temp 2-component vector of int)
+0:141          vector swizzle ( temp 2-component vector of int)
+0:141            i: direct index for structure ( temp 4-component vector of int)
+0:141              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:141                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:141                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:141                  Constant:
+0:141                    0 (const uint)
+0:141                direct index ( temp uint)
+0:141                  'dti' ( in 3-component vector of uint)
+0:141                  Constant:
+0:141                    0 (const int)
+0:141              Constant:
+0:141                1 (const int)
+0:141            Sequence
+0:141              Constant:
+0:141                0 (const int)
+0:141              Constant:
+0:141                1 (const int)
+0:142      move second child to first child ( temp 3-component vector of int)
+0:142        vector swizzle ( temp 3-component vector of int)
+0:142          i: direct index for structure ( temp 4-component vector of int)
+0:142            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:142              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:142                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:142                Constant:
+0:142                  0 (const uint)
+0:142              direct index ( temp uint)
+0:142                'dti' ( in 3-component vector of uint)
+0:142                Constant:
+0:142                  0 (const int)
+0:142            Constant:
+0:142              1 (const int)
+0:142          Sequence
+0:142            Constant:
+0:142              0 (const int)
+0:142            Constant:
+0:142              1 (const int)
+0:142            Constant:
+0:142              2 (const int)
+0:142        subgroupQuadSwapDiagonal ( temp 3-component vector of int)
+0:142          vector swizzle ( temp 3-component vector of int)
+0:142            i: direct index for structure ( temp 4-component vector of int)
+0:142              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:142                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:142                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:142                  Constant:
+0:142                    0 (const uint)
+0:142                direct index ( temp uint)
+0:142                  'dti' ( in 3-component vector of uint)
+0:142                  Constant:
+0:142                    0 (const int)
+0:142              Constant:
+0:142                1 (const int)
+0:142            Sequence
+0:142              Constant:
+0:142                0 (const int)
+0:142              Constant:
+0:142                1 (const int)
+0:142              Constant:
+0:142                2 (const int)
+0:144      move second child to first child ( temp 4-component vector of float)
+0:144        f: direct index for structure ( temp 4-component vector of float)
+0:144          indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:144            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:144              'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:144              Constant:
+0:144                0 (const uint)
+0:144            direct index ( temp uint)
+0:144              'dti' ( in 3-component vector of uint)
+0:144              Constant:
+0:144                0 (const int)
+0:144          Constant:
+0:144            2 (const int)
+0:144        subgroupQuadSwapDiagonal ( temp 4-component vector of float)
+0:144          f: direct index for structure ( temp 4-component vector of float)
+0:144            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:144              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:144                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:144                Constant:
+0:144                  0 (const uint)
+0:144              direct index ( temp uint)
+0:144                'dti' ( in 3-component vector of uint)
+0:144                Constant:
+0:144                  0 (const int)
+0:144            Constant:
+0:144              2 (const int)
+0:145      move second child to first child ( temp float)
+0:145        direct index ( temp float)
+0:145          f: direct index for structure ( temp 4-component vector of float)
+0:145            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:145              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:145                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:145                Constant:
+0:145                  0 (const uint)
+0:145              direct index ( temp uint)
+0:145                'dti' ( in 3-component vector of uint)
+0:145                Constant:
+0:145                  0 (const int)
+0:145            Constant:
+0:145              2 (const int)
+0:145          Constant:
+0:145            0 (const int)
+0:145        subgroupQuadSwapDiagonal ( temp float)
+0:145          direct index ( temp float)
+0:145            f: direct index for structure ( temp 4-component vector of float)
+0:145              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:145                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:145                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:145                  Constant:
+0:145                    0 (const uint)
+0:145                direct index ( temp uint)
+0:145                  'dti' ( in 3-component vector of uint)
+0:145                  Constant:
+0:145                    0 (const int)
+0:145              Constant:
+0:145                2 (const int)
+0:145            Constant:
+0:145              0 (const int)
+0:146      move second child to first child ( temp 2-component vector of float)
+0:146        vector swizzle ( temp 2-component vector of float)
+0:146          f: direct index for structure ( temp 4-component vector of float)
+0:146            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:146              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:146                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:146                Constant:
+0:146                  0 (const uint)
+0:146              direct index ( temp uint)
+0:146                'dti' ( in 3-component vector of uint)
+0:146                Constant:
+0:146                  0 (const int)
+0:146            Constant:
+0:146              2 (const int)
+0:146          Sequence
+0:146            Constant:
+0:146              0 (const int)
+0:146            Constant:
+0:146              1 (const int)
+0:146        subgroupQuadSwapDiagonal ( temp 2-component vector of float)
+0:146          vector swizzle ( temp 2-component vector of float)
+0:146            f: direct index for structure ( temp 4-component vector of float)
+0:146              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:146                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:146                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:146                  Constant:
+0:146                    0 (const uint)
+0:146                direct index ( temp uint)
+0:146                  'dti' ( in 3-component vector of uint)
+0:146                  Constant:
+0:146                    0 (const int)
+0:146              Constant:
+0:146                2 (const int)
+0:146            Sequence
+0:146              Constant:
+0:146                0 (const int)
+0:146              Constant:
+0:146                1 (const int)
+0:147      move second child to first child ( temp 3-component vector of float)
+0:147        vector swizzle ( temp 3-component vector of float)
+0:147          f: direct index for structure ( temp 4-component vector of float)
+0:147            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:147              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:147                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:147                Constant:
+0:147                  0 (const uint)
+0:147              direct index ( temp uint)
+0:147                'dti' ( in 3-component vector of uint)
+0:147                Constant:
+0:147                  0 (const int)
+0:147            Constant:
+0:147              2 (const int)
+0:147          Sequence
+0:147            Constant:
+0:147              0 (const int)
+0:147            Constant:
+0:147              1 (const int)
+0:147            Constant:
+0:147              2 (const int)
+0:147        subgroupQuadSwapDiagonal ( temp 3-component vector of float)
+0:147          vector swizzle ( temp 3-component vector of float)
+0:147            f: direct index for structure ( temp 4-component vector of float)
+0:147              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:147                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:147                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:147                  Constant:
+0:147                    0 (const uint)
+0:147                direct index ( temp uint)
+0:147                  'dti' ( in 3-component vector of uint)
+0:147                  Constant:
+0:147                    0 (const int)
+0:147              Constant:
+0:147                2 (const int)
+0:147            Sequence
+0:147              Constant:
+0:147                0 (const int)
+0:147              Constant:
+0:147                1 (const int)
+0:147              Constant:
+0:147                2 (const int)
+0:149      move second child to first child ( temp 4-component vector of double)
+0:149        d: direct index for structure ( temp 4-component vector of double)
+0:149          indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:149            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:149              'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:149              Constant:
+0:149                0 (const uint)
+0:149            direct index ( temp uint)
+0:149              'dti' ( in 3-component vector of uint)
+0:149              Constant:
+0:149                0 (const int)
+0:149          Constant:
+0:149            3 (const int)
+0:149        subgroupQuadSwapDiagonal ( temp 4-component vector of double)
+0:149          d: direct index for structure ( temp 4-component vector of double)
+0:149            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:149              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:149                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:149                Constant:
+0:149                  0 (const uint)
+0:149              direct index ( temp uint)
+0:149                'dti' ( in 3-component vector of uint)
+0:149                Constant:
+0:149                  0 (const int)
+0:149            Constant:
+0:149              3 (const int)
+0:150      move second child to first child ( temp double)
+0:150        direct index ( temp double)
+0:150          d: direct index for structure ( temp 4-component vector of double)
+0:150            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:150              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:150                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:150                Constant:
+0:150                  0 (const uint)
+0:150              direct index ( temp uint)
+0:150                'dti' ( in 3-component vector of uint)
+0:150                Constant:
+0:150                  0 (const int)
+0:150            Constant:
+0:150              3 (const int)
+0:150          Constant:
+0:150            0 (const int)
+0:150        subgroupQuadSwapDiagonal ( temp double)
+0:150          direct index ( temp double)
+0:150            d: direct index for structure ( temp 4-component vector of double)
+0:150              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:150                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:150                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:150                  Constant:
+0:150                    0 (const uint)
+0:150                direct index ( temp uint)
+0:150                  'dti' ( in 3-component vector of uint)
+0:150                  Constant:
+0:150                    0 (const int)
+0:150              Constant:
+0:150                3 (const int)
+0:150            Constant:
+0:150              0 (const int)
+0:151      move second child to first child ( temp 2-component vector of double)
+0:151        vector swizzle ( temp 2-component vector of double)
+0:151          d: direct index for structure ( temp 4-component vector of double)
+0:151            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:151              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:151                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:151                Constant:
+0:151                  0 (const uint)
+0:151              direct index ( temp uint)
+0:151                'dti' ( in 3-component vector of uint)
+0:151                Constant:
+0:151                  0 (const int)
+0:151            Constant:
+0:151              3 (const int)
+0:151          Sequence
+0:151            Constant:
+0:151              0 (const int)
+0:151            Constant:
+0:151              1 (const int)
+0:151        subgroupQuadSwapDiagonal ( temp 2-component vector of double)
+0:151          vector swizzle ( temp 2-component vector of double)
+0:151            d: direct index for structure ( temp 4-component vector of double)
+0:151              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:151                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:151                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:151                  Constant:
+0:151                    0 (const uint)
+0:151                direct index ( temp uint)
+0:151                  'dti' ( in 3-component vector of uint)
+0:151                  Constant:
+0:151                    0 (const int)
+0:151              Constant:
+0:151                3 (const int)
+0:151            Sequence
+0:151              Constant:
+0:151                0 (const int)
+0:151              Constant:
+0:151                1 (const int)
+0:152      move second child to first child ( temp 3-component vector of double)
+0:152        vector swizzle ( temp 3-component vector of double)
+0:152          d: direct index for structure ( temp 4-component vector of double)
+0:152            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:152              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:152                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:152                Constant:
+0:152                  0 (const uint)
+0:152              direct index ( temp uint)
+0:152                'dti' ( in 3-component vector of uint)
+0:152                Constant:
+0:152                  0 (const int)
+0:152            Constant:
+0:152              3 (const int)
+0:152          Sequence
+0:152            Constant:
+0:152              0 (const int)
+0:152            Constant:
+0:152              1 (const int)
+0:152            Constant:
+0:152              2 (const int)
+0:152        subgroupQuadSwapDiagonal ( temp 3-component vector of double)
+0:152          vector swizzle ( temp 3-component vector of double)
+0:152            d: direct index for structure ( temp 4-component vector of double)
+0:152              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:152                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:152                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:152                  Constant:
+0:152                    0 (const uint)
+0:152                direct index ( temp uint)
+0:152                  'dti' ( in 3-component vector of uint)
+0:152                  Constant:
+0:152                    0 (const int)
+0:152              Constant:
+0:152                3 (const int)
+0:152            Sequence
+0:152              Constant:
+0:152                0 (const int)
+0:152              Constant:
+0:152                1 (const int)
+0:152              Constant:
+0:152                2 (const int)
+0:13  Function Definition: CSMain( ( temp void)
+0:13    Function Parameters: 
+0:?     Sequence
+0:13      move second child to first child ( temp 3-component vector of uint)
+0:?         'dti' ( temp 3-component vector of uint)
+0:?         'dti' ( in 3-component vector of uint GlobalInvocationID)
+0:13      Function Call: @CSMain(vu3; ( temp void)
+0:?         'dti' ( temp 3-component vector of uint)
+0:?   Linker Objects
+0:?     'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:?     'dti' ( in 3-component vector of uint GlobalInvocationID)
+
+
+Linked compute stage:
+
+
+Shader version: 500
+local_size = (32, 16, 1)
+0:? Sequence
+0:13  Function Definition: @CSMain(vu3; ( temp void)
+0:13    Function Parameters: 
+0:13      'dti' ( in 3-component vector of uint)
+0:?     Sequence
+0:14      move second child to first child ( temp 4-component vector of uint)
+0:14        u: direct index for structure ( temp 4-component vector of uint)
+0:14          indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:14            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:14              'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:14              Constant:
+0:14                0 (const uint)
+0:14            direct index ( temp uint)
+0:14              'dti' ( in 3-component vector of uint)
+0:14              Constant:
+0:14                0 (const int)
+0:14          Constant:
+0:14            0 (const int)
+0:14        subgroupQuadBroadcast ( temp 4-component vector of uint)
+0:14          u: direct index for structure ( temp 4-component vector of uint)
+0:14            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:14              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:14                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:14                Constant:
+0:14                  0 (const uint)
+0:14              direct index ( temp uint)
+0:14                'dti' ( in 3-component vector of uint)
+0:14                Constant:
+0:14                  0 (const int)
+0:14            Constant:
+0:14              0 (const int)
+0:14          Constant:
+0:14            0 (const uint)
+0:15      move second child to first child ( temp uint)
+0:15        direct index ( temp uint)
+0:15          u: direct index for structure ( temp 4-component vector of uint)
+0:15            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:15              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:15                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:15                Constant:
+0:15                  0 (const uint)
+0:15              direct index ( temp uint)
+0:15                'dti' ( in 3-component vector of uint)
+0:15                Constant:
+0:15                  0 (const int)
+0:15            Constant:
+0:15              0 (const int)
+0:15          Constant:
+0:15            0 (const int)
+0:15        subgroupQuadBroadcast ( temp uint)
+0:15          direct index ( temp uint)
+0:15            u: direct index for structure ( temp 4-component vector of uint)
+0:15              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:15                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:15                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:15                  Constant:
+0:15                    0 (const uint)
+0:15                direct index ( temp uint)
+0:15                  'dti' ( in 3-component vector of uint)
+0:15                  Constant:
+0:15                    0 (const int)
+0:15              Constant:
+0:15                0 (const int)
+0:15            Constant:
+0:15              0 (const int)
+0:15          Constant:
+0:15            0 (const uint)
+0:16      move second child to first child ( temp 2-component vector of uint)
+0:16        vector swizzle ( temp 2-component vector of uint)
+0:16          u: direct index for structure ( temp 4-component vector of uint)
+0:16            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:16              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:16                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:16                Constant:
+0:16                  0 (const uint)
+0:16              direct index ( temp uint)
+0:16                'dti' ( in 3-component vector of uint)
+0:16                Constant:
+0:16                  0 (const int)
+0:16            Constant:
+0:16              0 (const int)
+0:16          Sequence
+0:16            Constant:
+0:16              0 (const int)
+0:16            Constant:
+0:16              1 (const int)
+0:16        subgroupQuadBroadcast ( temp 2-component vector of uint)
+0:16          vector swizzle ( temp 2-component vector of uint)
+0:16            u: direct index for structure ( temp 4-component vector of uint)
+0:16              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:16                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:16                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:16                  Constant:
+0:16                    0 (const uint)
+0:16                direct index ( temp uint)
+0:16                  'dti' ( in 3-component vector of uint)
+0:16                  Constant:
+0:16                    0 (const int)
+0:16              Constant:
+0:16                0 (const int)
+0:16            Sequence
+0:16              Constant:
+0:16                0 (const int)
+0:16              Constant:
+0:16                1 (const int)
+0:16          Constant:
+0:16            0 (const uint)
+0:17      move second child to first child ( temp 3-component vector of uint)
+0:17        vector swizzle ( temp 3-component vector of uint)
+0:17          u: direct index for structure ( temp 4-component vector of uint)
+0:17            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:17              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:17                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:17                Constant:
+0:17                  0 (const uint)
+0:17              direct index ( temp uint)
+0:17                'dti' ( in 3-component vector of uint)
+0:17                Constant:
+0:17                  0 (const int)
+0:17            Constant:
+0:17              0 (const int)
+0:17          Sequence
+0:17            Constant:
+0:17              0 (const int)
+0:17            Constant:
+0:17              1 (const int)
+0:17            Constant:
+0:17              2 (const int)
+0:17        subgroupQuadBroadcast ( temp 3-component vector of uint)
+0:17          vector swizzle ( temp 3-component vector of uint)
+0:17            u: direct index for structure ( temp 4-component vector of uint)
+0:17              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:17                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:17                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:17                  Constant:
+0:17                    0 (const uint)
+0:17                direct index ( temp uint)
+0:17                  'dti' ( in 3-component vector of uint)
+0:17                  Constant:
+0:17                    0 (const int)
+0:17              Constant:
+0:17                0 (const int)
+0:17            Sequence
+0:17              Constant:
+0:17                0 (const int)
+0:17              Constant:
+0:17                1 (const int)
+0:17              Constant:
+0:17                2 (const int)
+0:17          Constant:
+0:17            0 (const uint)
+0:19      move second child to first child ( temp 4-component vector of int)
+0:19        i: direct index for structure ( temp 4-component vector of int)
+0:19          indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:19            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:19              'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:19              Constant:
+0:19                0 (const uint)
+0:19            direct index ( temp uint)
+0:19              'dti' ( in 3-component vector of uint)
+0:19              Constant:
+0:19                0 (const int)
+0:19          Constant:
+0:19            1 (const int)
+0:19        subgroupQuadBroadcast ( temp 4-component vector of int)
+0:19          i: direct index for structure ( temp 4-component vector of int)
+0:19            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:19              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:19                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:19                Constant:
+0:19                  0 (const uint)
+0:19              direct index ( temp uint)
+0:19                'dti' ( in 3-component vector of uint)
+0:19                Constant:
+0:19                  0 (const int)
+0:19            Constant:
+0:19              1 (const int)
+0:19          Constant:
+0:19            0 (const uint)
+0:20      move second child to first child ( temp int)
+0:20        direct index ( temp int)
+0:20          i: direct index for structure ( temp 4-component vector of int)
+0:20            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:20              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:20                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:20                Constant:
+0:20                  0 (const uint)
+0:20              direct index ( temp uint)
+0:20                'dti' ( in 3-component vector of uint)
+0:20                Constant:
+0:20                  0 (const int)
+0:20            Constant:
+0:20              1 (const int)
+0:20          Constant:
+0:20            0 (const int)
+0:20        subgroupQuadBroadcast ( temp int)
+0:20          direct index ( temp int)
+0:20            i: direct index for structure ( temp 4-component vector of int)
+0:20              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:20                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:20                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:20                  Constant:
+0:20                    0 (const uint)
+0:20                direct index ( temp uint)
+0:20                  'dti' ( in 3-component vector of uint)
+0:20                  Constant:
+0:20                    0 (const int)
+0:20              Constant:
+0:20                1 (const int)
+0:20            Constant:
+0:20              0 (const int)
+0:20          Constant:
+0:20            0 (const uint)
+0:21      move second child to first child ( temp 2-component vector of int)
+0:21        vector swizzle ( temp 2-component vector of int)
+0:21          i: direct index for structure ( temp 4-component vector of int)
+0:21            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:21              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:21                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:21                Constant:
+0:21                  0 (const uint)
+0:21              direct index ( temp uint)
+0:21                'dti' ( in 3-component vector of uint)
+0:21                Constant:
+0:21                  0 (const int)
+0:21            Constant:
+0:21              1 (const int)
+0:21          Sequence
+0:21            Constant:
+0:21              0 (const int)
+0:21            Constant:
+0:21              1 (const int)
+0:21        subgroupQuadBroadcast ( temp 2-component vector of int)
+0:21          vector swizzle ( temp 2-component vector of int)
+0:21            i: direct index for structure ( temp 4-component vector of int)
+0:21              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:21                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:21                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:21                  Constant:
+0:21                    0 (const uint)
+0:21                direct index ( temp uint)
+0:21                  'dti' ( in 3-component vector of uint)
+0:21                  Constant:
+0:21                    0 (const int)
+0:21              Constant:
+0:21                1 (const int)
+0:21            Sequence
+0:21              Constant:
+0:21                0 (const int)
+0:21              Constant:
+0:21                1 (const int)
+0:21          Constant:
+0:21            0 (const uint)
+0:22      move second child to first child ( temp 3-component vector of int)
+0:22        vector swizzle ( temp 3-component vector of int)
+0:22          i: direct index for structure ( temp 4-component vector of int)
+0:22            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:22              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:22                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:22                Constant:
+0:22                  0 (const uint)
+0:22              direct index ( temp uint)
+0:22                'dti' ( in 3-component vector of uint)
+0:22                Constant:
+0:22                  0 (const int)
+0:22            Constant:
+0:22              1 (const int)
+0:22          Sequence
+0:22            Constant:
+0:22              0 (const int)
+0:22            Constant:
+0:22              1 (const int)
+0:22            Constant:
+0:22              2 (const int)
+0:22        subgroupQuadBroadcast ( temp 3-component vector of int)
+0:22          vector swizzle ( temp 3-component vector of int)
+0:22            i: direct index for structure ( temp 4-component vector of int)
+0:22              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:22                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:22                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:22                  Constant:
+0:22                    0 (const uint)
+0:22                direct index ( temp uint)
+0:22                  'dti' ( in 3-component vector of uint)
+0:22                  Constant:
+0:22                    0 (const int)
+0:22              Constant:
+0:22                1 (const int)
+0:22            Sequence
+0:22              Constant:
+0:22                0 (const int)
+0:22              Constant:
+0:22                1 (const int)
+0:22              Constant:
+0:22                2 (const int)
+0:22          Constant:
+0:22            0 (const uint)
+0:24      move second child to first child ( temp 4-component vector of float)
+0:24        f: direct index for structure ( temp 4-component vector of float)
+0:24          indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:24            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:24              'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:24              Constant:
+0:24                0 (const uint)
+0:24            direct index ( temp uint)
+0:24              'dti' ( in 3-component vector of uint)
+0:24              Constant:
+0:24                0 (const int)
+0:24          Constant:
+0:24            2 (const int)
+0:24        subgroupQuadBroadcast ( temp 4-component vector of float)
+0:24          f: direct index for structure ( temp 4-component vector of float)
+0:24            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:24              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:24                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:24                Constant:
+0:24                  0 (const uint)
+0:24              direct index ( temp uint)
+0:24                'dti' ( in 3-component vector of uint)
+0:24                Constant:
+0:24                  0 (const int)
+0:24            Constant:
+0:24              2 (const int)
+0:24          Constant:
+0:24            0 (const uint)
+0:25      move second child to first child ( temp float)
+0:25        direct index ( temp float)
+0:25          f: direct index for structure ( temp 4-component vector of float)
+0:25            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:25              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:25                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:25                Constant:
+0:25                  0 (const uint)
+0:25              direct index ( temp uint)
+0:25                'dti' ( in 3-component vector of uint)
+0:25                Constant:
+0:25                  0 (const int)
+0:25            Constant:
+0:25              2 (const int)
+0:25          Constant:
+0:25            0 (const int)
+0:25        subgroupQuadBroadcast ( temp float)
+0:25          direct index ( temp float)
+0:25            f: direct index for structure ( temp 4-component vector of float)
+0:25              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:25                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:25                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:25                  Constant:
+0:25                    0 (const uint)
+0:25                direct index ( temp uint)
+0:25                  'dti' ( in 3-component vector of uint)
+0:25                  Constant:
+0:25                    0 (const int)
+0:25              Constant:
+0:25                2 (const int)
+0:25            Constant:
+0:25              0 (const int)
+0:25          Constant:
+0:25            0 (const uint)
+0:26      move second child to first child ( temp 2-component vector of float)
+0:26        vector swizzle ( temp 2-component vector of float)
+0:26          f: direct index for structure ( temp 4-component vector of float)
+0:26            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:26              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:26                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:26                Constant:
+0:26                  0 (const uint)
+0:26              direct index ( temp uint)
+0:26                'dti' ( in 3-component vector of uint)
+0:26                Constant:
+0:26                  0 (const int)
+0:26            Constant:
+0:26              2 (const int)
+0:26          Sequence
+0:26            Constant:
+0:26              0 (const int)
+0:26            Constant:
+0:26              1 (const int)
+0:26        subgroupQuadBroadcast ( temp 2-component vector of float)
+0:26          vector swizzle ( temp 2-component vector of float)
+0:26            f: direct index for structure ( temp 4-component vector of float)
+0:26              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:26                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:26                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:26                  Constant:
+0:26                    0 (const uint)
+0:26                direct index ( temp uint)
+0:26                  'dti' ( in 3-component vector of uint)
+0:26                  Constant:
+0:26                    0 (const int)
+0:26              Constant:
+0:26                2 (const int)
+0:26            Sequence
+0:26              Constant:
+0:26                0 (const int)
+0:26              Constant:
+0:26                1 (const int)
+0:26          Constant:
+0:26            0 (const uint)
+0:27      move second child to first child ( temp 3-component vector of float)
+0:27        vector swizzle ( temp 3-component vector of float)
+0:27          f: direct index for structure ( temp 4-component vector of float)
+0:27            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:27              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:27                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:27                Constant:
+0:27                  0 (const uint)
+0:27              direct index ( temp uint)
+0:27                'dti' ( in 3-component vector of uint)
+0:27                Constant:
+0:27                  0 (const int)
+0:27            Constant:
+0:27              2 (const int)
+0:27          Sequence
+0:27            Constant:
+0:27              0 (const int)
+0:27            Constant:
+0:27              1 (const int)
+0:27            Constant:
+0:27              2 (const int)
+0:27        subgroupQuadBroadcast ( temp 3-component vector of float)
+0:27          vector swizzle ( temp 3-component vector of float)
+0:27            f: direct index for structure ( temp 4-component vector of float)
+0:27              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:27                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:27                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:27                  Constant:
+0:27                    0 (const uint)
+0:27                direct index ( temp uint)
+0:27                  'dti' ( in 3-component vector of uint)
+0:27                  Constant:
+0:27                    0 (const int)
+0:27              Constant:
+0:27                2 (const int)
+0:27            Sequence
+0:27              Constant:
+0:27                0 (const int)
+0:27              Constant:
+0:27                1 (const int)
+0:27              Constant:
+0:27                2 (const int)
+0:27          Constant:
+0:27            0 (const uint)
+0:29      move second child to first child ( temp 4-component vector of double)
+0:29        d: direct index for structure ( temp 4-component vector of double)
+0:29          indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:29            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:29              'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:29              Constant:
+0:29                0 (const uint)
+0:29            direct index ( temp uint)
+0:29              'dti' ( in 3-component vector of uint)
+0:29              Constant:
+0:29                0 (const int)
+0:29          Constant:
+0:29            3 (const int)
+0:29        subgroupQuadBroadcast ( temp 4-component vector of double)
+0:29          d: direct index for structure ( temp 4-component vector of double)
+0:29            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:29              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:29                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:29                Constant:
+0:29                  0 (const uint)
+0:29              direct index ( temp uint)
+0:29                'dti' ( in 3-component vector of uint)
+0:29                Constant:
+0:29                  0 (const int)
+0:29            Constant:
+0:29              3 (const int)
+0:29          Constant:
+0:29            0 (const uint)
+0:30      move second child to first child ( temp double)
+0:30        direct index ( temp double)
+0:30          d: direct index for structure ( temp 4-component vector of double)
+0:30            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:30              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:30                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:30                Constant:
+0:30                  0 (const uint)
+0:30              direct index ( temp uint)
+0:30                'dti' ( in 3-component vector of uint)
+0:30                Constant:
+0:30                  0 (const int)
+0:30            Constant:
+0:30              3 (const int)
+0:30          Constant:
+0:30            0 (const int)
+0:30        subgroupQuadBroadcast ( temp double)
+0:30          direct index ( temp double)
+0:30            d: direct index for structure ( temp 4-component vector of double)
+0:30              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:30                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:30                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:30                  Constant:
+0:30                    0 (const uint)
+0:30                direct index ( temp uint)
+0:30                  'dti' ( in 3-component vector of uint)
+0:30                  Constant:
+0:30                    0 (const int)
+0:30              Constant:
+0:30                3 (const int)
+0:30            Constant:
+0:30              0 (const int)
+0:30          Constant:
+0:30            0 (const uint)
+0:31      move second child to first child ( temp 2-component vector of double)
+0:31        vector swizzle ( temp 2-component vector of double)
+0:31          d: direct index for structure ( temp 4-component vector of double)
+0:31            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:31              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:31                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:31                Constant:
+0:31                  0 (const uint)
+0:31              direct index ( temp uint)
+0:31                'dti' ( in 3-component vector of uint)
+0:31                Constant:
+0:31                  0 (const int)
+0:31            Constant:
+0:31              3 (const int)
+0:31          Sequence
+0:31            Constant:
+0:31              0 (const int)
+0:31            Constant:
+0:31              1 (const int)
+0:31        subgroupQuadBroadcast ( temp 2-component vector of double)
+0:31          vector swizzle ( temp 2-component vector of double)
+0:31            d: direct index for structure ( temp 4-component vector of double)
+0:31              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:31                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:31                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:31                  Constant:
+0:31                    0 (const uint)
+0:31                direct index ( temp uint)
+0:31                  'dti' ( in 3-component vector of uint)
+0:31                  Constant:
+0:31                    0 (const int)
+0:31              Constant:
+0:31                3 (const int)
+0:31            Sequence
+0:31              Constant:
+0:31                0 (const int)
+0:31              Constant:
+0:31                1 (const int)
+0:31          Constant:
+0:31            0 (const uint)
+0:32      move second child to first child ( temp 3-component vector of double)
+0:32        vector swizzle ( temp 3-component vector of double)
+0:32          d: direct index for structure ( temp 4-component vector of double)
+0:32            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:32              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:32                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:32                Constant:
+0:32                  0 (const uint)
+0:32              direct index ( temp uint)
+0:32                'dti' ( in 3-component vector of uint)
+0:32                Constant:
+0:32                  0 (const int)
+0:32            Constant:
+0:32              3 (const int)
+0:32          Sequence
+0:32            Constant:
+0:32              0 (const int)
+0:32            Constant:
+0:32              1 (const int)
+0:32            Constant:
+0:32              2 (const int)
+0:32        subgroupQuadBroadcast ( temp 3-component vector of double)
+0:32          vector swizzle ( temp 3-component vector of double)
+0:32            d: direct index for structure ( temp 4-component vector of double)
+0:32              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:32                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:32                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:32                  Constant:
+0:32                    0 (const uint)
+0:32                direct index ( temp uint)
+0:32                  'dti' ( in 3-component vector of uint)
+0:32                  Constant:
+0:32                    0 (const int)
+0:32              Constant:
+0:32                3 (const int)
+0:32            Sequence
+0:32              Constant:
+0:32                0 (const int)
+0:32              Constant:
+0:32                1 (const int)
+0:32              Constant:
+0:32                2 (const int)
+0:32          Constant:
+0:32            0 (const uint)
+0:34      move second child to first child ( temp 4-component vector of uint)
+0:34        u: direct index for structure ( temp 4-component vector of uint)
+0:34          indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:34            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:34              'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:34              Constant:
+0:34                0 (const uint)
+0:34            direct index ( temp uint)
+0:34              'dti' ( in 3-component vector of uint)
+0:34              Constant:
+0:34                0 (const int)
+0:34          Constant:
+0:34            0 (const int)
+0:34        subgroupQuadBroadcast ( temp 4-component vector of uint)
+0:34          u: direct index for structure ( temp 4-component vector of uint)
+0:34            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:34              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:34                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:34                Constant:
+0:34                  0 (const uint)
+0:34              direct index ( temp uint)
+0:34                'dti' ( in 3-component vector of uint)
+0:34                Constant:
+0:34                  0 (const int)
+0:34            Constant:
+0:34              0 (const int)
+0:34          Constant:
+0:34            1 (const uint)
+0:35      move second child to first child ( temp uint)
+0:35        direct index ( temp uint)
+0:35          u: direct index for structure ( temp 4-component vector of uint)
+0:35            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:35              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:35                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:35                Constant:
+0:35                  0 (const uint)
+0:35              direct index ( temp uint)
+0:35                'dti' ( in 3-component vector of uint)
+0:35                Constant:
+0:35                  0 (const int)
+0:35            Constant:
+0:35              0 (const int)
+0:35          Constant:
+0:35            0 (const int)
+0:35        subgroupQuadBroadcast ( temp uint)
+0:35          direct index ( temp uint)
+0:35            u: direct index for structure ( temp 4-component vector of uint)
+0:35              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:35                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:35                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:35                  Constant:
+0:35                    0 (const uint)
+0:35                direct index ( temp uint)
+0:35                  'dti' ( in 3-component vector of uint)
+0:35                  Constant:
+0:35                    0 (const int)
+0:35              Constant:
+0:35                0 (const int)
+0:35            Constant:
+0:35              0 (const int)
+0:35          Constant:
+0:35            1 (const uint)
+0:36      move second child to first child ( temp 2-component vector of uint)
+0:36        vector swizzle ( temp 2-component vector of uint)
+0:36          u: direct index for structure ( temp 4-component vector of uint)
+0:36            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:36              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:36                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:36                Constant:
+0:36                  0 (const uint)
+0:36              direct index ( temp uint)
+0:36                'dti' ( in 3-component vector of uint)
+0:36                Constant:
+0:36                  0 (const int)
+0:36            Constant:
+0:36              0 (const int)
+0:36          Sequence
+0:36            Constant:
+0:36              0 (const int)
+0:36            Constant:
+0:36              1 (const int)
+0:36        subgroupQuadBroadcast ( temp 2-component vector of uint)
+0:36          vector swizzle ( temp 2-component vector of uint)
+0:36            u: direct index for structure ( temp 4-component vector of uint)
+0:36              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:36                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:36                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:36                  Constant:
+0:36                    0 (const uint)
+0:36                direct index ( temp uint)
+0:36                  'dti' ( in 3-component vector of uint)
+0:36                  Constant:
+0:36                    0 (const int)
+0:36              Constant:
+0:36                0 (const int)
+0:36            Sequence
+0:36              Constant:
+0:36                0 (const int)
+0:36              Constant:
+0:36                1 (const int)
+0:36          Constant:
+0:36            1 (const uint)
+0:37      move second child to first child ( temp 3-component vector of uint)
+0:37        vector swizzle ( temp 3-component vector of uint)
+0:37          u: direct index for structure ( temp 4-component vector of uint)
+0:37            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:37              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:37                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:37                Constant:
+0:37                  0 (const uint)
+0:37              direct index ( temp uint)
+0:37                'dti' ( in 3-component vector of uint)
+0:37                Constant:
+0:37                  0 (const int)
+0:37            Constant:
+0:37              0 (const int)
+0:37          Sequence
+0:37            Constant:
+0:37              0 (const int)
+0:37            Constant:
+0:37              1 (const int)
+0:37            Constant:
+0:37              2 (const int)
+0:37        subgroupQuadBroadcast ( temp 3-component vector of uint)
+0:37          vector swizzle ( temp 3-component vector of uint)
+0:37            u: direct index for structure ( temp 4-component vector of uint)
+0:37              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:37                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:37                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:37                  Constant:
+0:37                    0 (const uint)
+0:37                direct index ( temp uint)
+0:37                  'dti' ( in 3-component vector of uint)
+0:37                  Constant:
+0:37                    0 (const int)
+0:37              Constant:
+0:37                0 (const int)
+0:37            Sequence
+0:37              Constant:
+0:37                0 (const int)
+0:37              Constant:
+0:37                1 (const int)
+0:37              Constant:
+0:37                2 (const int)
+0:37          Constant:
+0:37            1 (const uint)
+0:39      move second child to first child ( temp 4-component vector of int)
+0:39        i: direct index for structure ( temp 4-component vector of int)
+0:39          indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:39            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:39              'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:39              Constant:
+0:39                0 (const uint)
+0:39            direct index ( temp uint)
+0:39              'dti' ( in 3-component vector of uint)
+0:39              Constant:
+0:39                0 (const int)
+0:39          Constant:
+0:39            1 (const int)
+0:39        subgroupQuadBroadcast ( temp 4-component vector of int)
+0:39          i: direct index for structure ( temp 4-component vector of int)
+0:39            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:39              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:39                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:39                Constant:
+0:39                  0 (const uint)
+0:39              direct index ( temp uint)
+0:39                'dti' ( in 3-component vector of uint)
+0:39                Constant:
+0:39                  0 (const int)
+0:39            Constant:
+0:39              1 (const int)
+0:39          Constant:
+0:39            1 (const uint)
+0:40      move second child to first child ( temp int)
+0:40        direct index ( temp int)
+0:40          i: direct index for structure ( temp 4-component vector of int)
+0:40            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:40              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:40                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:40                Constant:
+0:40                  0 (const uint)
+0:40              direct index ( temp uint)
+0:40                'dti' ( in 3-component vector of uint)
+0:40                Constant:
+0:40                  0 (const int)
+0:40            Constant:
+0:40              1 (const int)
+0:40          Constant:
+0:40            0 (const int)
+0:40        subgroupQuadBroadcast ( temp int)
+0:40          direct index ( temp int)
+0:40            i: direct index for structure ( temp 4-component vector of int)
+0:40              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:40                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:40                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:40                  Constant:
+0:40                    0 (const uint)
+0:40                direct index ( temp uint)
+0:40                  'dti' ( in 3-component vector of uint)
+0:40                  Constant:
+0:40                    0 (const int)
+0:40              Constant:
+0:40                1 (const int)
+0:40            Constant:
+0:40              0 (const int)
+0:40          Constant:
+0:40            1 (const uint)
+0:41      move second child to first child ( temp 2-component vector of int)
+0:41        vector swizzle ( temp 2-component vector of int)
+0:41          i: direct index for structure ( temp 4-component vector of int)
+0:41            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:41              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:41                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:41                Constant:
+0:41                  0 (const uint)
+0:41              direct index ( temp uint)
+0:41                'dti' ( in 3-component vector of uint)
+0:41                Constant:
+0:41                  0 (const int)
+0:41            Constant:
+0:41              1 (const int)
+0:41          Sequence
+0:41            Constant:
+0:41              0 (const int)
+0:41            Constant:
+0:41              1 (const int)
+0:41        subgroupQuadBroadcast ( temp 2-component vector of int)
+0:41          vector swizzle ( temp 2-component vector of int)
+0:41            i: direct index for structure ( temp 4-component vector of int)
+0:41              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:41                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:41                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:41                  Constant:
+0:41                    0 (const uint)
+0:41                direct index ( temp uint)
+0:41                  'dti' ( in 3-component vector of uint)
+0:41                  Constant:
+0:41                    0 (const int)
+0:41              Constant:
+0:41                1 (const int)
+0:41            Sequence
+0:41              Constant:
+0:41                0 (const int)
+0:41              Constant:
+0:41                1 (const int)
+0:41          Constant:
+0:41            1 (const uint)
+0:42      move second child to first child ( temp 3-component vector of int)
+0:42        vector swizzle ( temp 3-component vector of int)
+0:42          i: direct index for structure ( temp 4-component vector of int)
+0:42            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:42              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:42                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:42                Constant:
+0:42                  0 (const uint)
+0:42              direct index ( temp uint)
+0:42                'dti' ( in 3-component vector of uint)
+0:42                Constant:
+0:42                  0 (const int)
+0:42            Constant:
+0:42              1 (const int)
+0:42          Sequence
+0:42            Constant:
+0:42              0 (const int)
+0:42            Constant:
+0:42              1 (const int)
+0:42            Constant:
+0:42              2 (const int)
+0:42        subgroupQuadBroadcast ( temp 3-component vector of int)
+0:42          vector swizzle ( temp 3-component vector of int)
+0:42            i: direct index for structure ( temp 4-component vector of int)
+0:42              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:42                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:42                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:42                  Constant:
+0:42                    0 (const uint)
+0:42                direct index ( temp uint)
+0:42                  'dti' ( in 3-component vector of uint)
+0:42                  Constant:
+0:42                    0 (const int)
+0:42              Constant:
+0:42                1 (const int)
+0:42            Sequence
+0:42              Constant:
+0:42                0 (const int)
+0:42              Constant:
+0:42                1 (const int)
+0:42              Constant:
+0:42                2 (const int)
+0:42          Constant:
+0:42            1 (const uint)
+0:44      move second child to first child ( temp 4-component vector of float)
+0:44        f: direct index for structure ( temp 4-component vector of float)
+0:44          indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:44            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:44              'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:44              Constant:
+0:44                0 (const uint)
+0:44            direct index ( temp uint)
+0:44              'dti' ( in 3-component vector of uint)
+0:44              Constant:
+0:44                0 (const int)
+0:44          Constant:
+0:44            2 (const int)
+0:44        subgroupQuadBroadcast ( temp 4-component vector of float)
+0:44          f: direct index for structure ( temp 4-component vector of float)
+0:44            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:44              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:44                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:44                Constant:
+0:44                  0 (const uint)
+0:44              direct index ( temp uint)
+0:44                'dti' ( in 3-component vector of uint)
+0:44                Constant:
+0:44                  0 (const int)
+0:44            Constant:
+0:44              2 (const int)
+0:44          Constant:
+0:44            1 (const uint)
+0:45      move second child to first child ( temp float)
+0:45        direct index ( temp float)
+0:45          f: direct index for structure ( temp 4-component vector of float)
+0:45            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:45              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:45                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:45                Constant:
+0:45                  0 (const uint)
+0:45              direct index ( temp uint)
+0:45                'dti' ( in 3-component vector of uint)
+0:45                Constant:
+0:45                  0 (const int)
+0:45            Constant:
+0:45              2 (const int)
+0:45          Constant:
+0:45            0 (const int)
+0:45        subgroupQuadBroadcast ( temp float)
+0:45          direct index ( temp float)
+0:45            f: direct index for structure ( temp 4-component vector of float)
+0:45              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:45                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:45                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:45                  Constant:
+0:45                    0 (const uint)
+0:45                direct index ( temp uint)
+0:45                  'dti' ( in 3-component vector of uint)
+0:45                  Constant:
+0:45                    0 (const int)
+0:45              Constant:
+0:45                2 (const int)
+0:45            Constant:
+0:45              0 (const int)
+0:45          Constant:
+0:45            1 (const uint)
+0:46      move second child to first child ( temp 2-component vector of float)
+0:46        vector swizzle ( temp 2-component vector of float)
+0:46          f: direct index for structure ( temp 4-component vector of float)
+0:46            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:46              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:46                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:46                Constant:
+0:46                  0 (const uint)
+0:46              direct index ( temp uint)
+0:46                'dti' ( in 3-component vector of uint)
+0:46                Constant:
+0:46                  0 (const int)
+0:46            Constant:
+0:46              2 (const int)
+0:46          Sequence
+0:46            Constant:
+0:46              0 (const int)
+0:46            Constant:
+0:46              1 (const int)
+0:46        subgroupQuadBroadcast ( temp 2-component vector of float)
+0:46          vector swizzle ( temp 2-component vector of float)
+0:46            f: direct index for structure ( temp 4-component vector of float)
+0:46              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:46                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:46                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:46                  Constant:
+0:46                    0 (const uint)
+0:46                direct index ( temp uint)
+0:46                  'dti' ( in 3-component vector of uint)
+0:46                  Constant:
+0:46                    0 (const int)
+0:46              Constant:
+0:46                2 (const int)
+0:46            Sequence
+0:46              Constant:
+0:46                0 (const int)
+0:46              Constant:
+0:46                1 (const int)
+0:46          Constant:
+0:46            1 (const uint)
+0:47      move second child to first child ( temp 3-component vector of float)
+0:47        vector swizzle ( temp 3-component vector of float)
+0:47          f: direct index for structure ( temp 4-component vector of float)
+0:47            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:47              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:47                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:47                Constant:
+0:47                  0 (const uint)
+0:47              direct index ( temp uint)
+0:47                'dti' ( in 3-component vector of uint)
+0:47                Constant:
+0:47                  0 (const int)
+0:47            Constant:
+0:47              2 (const int)
+0:47          Sequence
+0:47            Constant:
+0:47              0 (const int)
+0:47            Constant:
+0:47              1 (const int)
+0:47            Constant:
+0:47              2 (const int)
+0:47        subgroupQuadBroadcast ( temp 3-component vector of float)
+0:47          vector swizzle ( temp 3-component vector of float)
+0:47            f: direct index for structure ( temp 4-component vector of float)
+0:47              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:47                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:47                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:47                  Constant:
+0:47                    0 (const uint)
+0:47                direct index ( temp uint)
+0:47                  'dti' ( in 3-component vector of uint)
+0:47                  Constant:
+0:47                    0 (const int)
+0:47              Constant:
+0:47                2 (const int)
+0:47            Sequence
+0:47              Constant:
+0:47                0 (const int)
+0:47              Constant:
+0:47                1 (const int)
+0:47              Constant:
+0:47                2 (const int)
+0:47          Constant:
+0:47            1 (const uint)
+0:49      move second child to first child ( temp 4-component vector of double)
+0:49        d: direct index for structure ( temp 4-component vector of double)
+0:49          indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:49            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:49              'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:49              Constant:
+0:49                0 (const uint)
+0:49            direct index ( temp uint)
+0:49              'dti' ( in 3-component vector of uint)
+0:49              Constant:
+0:49                0 (const int)
+0:49          Constant:
+0:49            3 (const int)
+0:49        subgroupQuadBroadcast ( temp 4-component vector of double)
+0:49          d: direct index for structure ( temp 4-component vector of double)
+0:49            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:49              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:49                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:49                Constant:
+0:49                  0 (const uint)
+0:49              direct index ( temp uint)
+0:49                'dti' ( in 3-component vector of uint)
+0:49                Constant:
+0:49                  0 (const int)
+0:49            Constant:
+0:49              3 (const int)
+0:49          Constant:
+0:49            1 (const uint)
+0:50      move second child to first child ( temp double)
+0:50        direct index ( temp double)
+0:50          d: direct index for structure ( temp 4-component vector of double)
+0:50            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:50              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:50                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:50                Constant:
+0:50                  0 (const uint)
+0:50              direct index ( temp uint)
+0:50                'dti' ( in 3-component vector of uint)
+0:50                Constant:
+0:50                  0 (const int)
+0:50            Constant:
+0:50              3 (const int)
+0:50          Constant:
+0:50            0 (const int)
+0:50        subgroupQuadBroadcast ( temp double)
+0:50          direct index ( temp double)
+0:50            d: direct index for structure ( temp 4-component vector of double)
+0:50              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:50                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:50                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:50                  Constant:
+0:50                    0 (const uint)
+0:50                direct index ( temp uint)
+0:50                  'dti' ( in 3-component vector of uint)
+0:50                  Constant:
+0:50                    0 (const int)
+0:50              Constant:
+0:50                3 (const int)
+0:50            Constant:
+0:50              0 (const int)
+0:50          Constant:
+0:50            1 (const uint)
+0:51      move second child to first child ( temp 2-component vector of double)
+0:51        vector swizzle ( temp 2-component vector of double)
+0:51          d: direct index for structure ( temp 4-component vector of double)
+0:51            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:51              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:51                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:51                Constant:
+0:51                  0 (const uint)
+0:51              direct index ( temp uint)
+0:51                'dti' ( in 3-component vector of uint)
+0:51                Constant:
+0:51                  0 (const int)
+0:51            Constant:
+0:51              3 (const int)
+0:51          Sequence
+0:51            Constant:
+0:51              0 (const int)
+0:51            Constant:
+0:51              1 (const int)
+0:51        subgroupQuadBroadcast ( temp 2-component vector of double)
+0:51          vector swizzle ( temp 2-component vector of double)
+0:51            d: direct index for structure ( temp 4-component vector of double)
+0:51              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:51                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:51                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:51                  Constant:
+0:51                    0 (const uint)
+0:51                direct index ( temp uint)
+0:51                  'dti' ( in 3-component vector of uint)
+0:51                  Constant:
+0:51                    0 (const int)
+0:51              Constant:
+0:51                3 (const int)
+0:51            Sequence
+0:51              Constant:
+0:51                0 (const int)
+0:51              Constant:
+0:51                1 (const int)
+0:51          Constant:
+0:51            1 (const uint)
+0:52      move second child to first child ( temp 3-component vector of double)
+0:52        vector swizzle ( temp 3-component vector of double)
+0:52          d: direct index for structure ( temp 4-component vector of double)
+0:52            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:52              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:52                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:52                Constant:
+0:52                  0 (const uint)
+0:52              direct index ( temp uint)
+0:52                'dti' ( in 3-component vector of uint)
+0:52                Constant:
+0:52                  0 (const int)
+0:52            Constant:
+0:52              3 (const int)
+0:52          Sequence
+0:52            Constant:
+0:52              0 (const int)
+0:52            Constant:
+0:52              1 (const int)
+0:52            Constant:
+0:52              2 (const int)
+0:52        subgroupQuadBroadcast ( temp 3-component vector of double)
+0:52          vector swizzle ( temp 3-component vector of double)
+0:52            d: direct index for structure ( temp 4-component vector of double)
+0:52              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:52                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:52                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:52                  Constant:
+0:52                    0 (const uint)
+0:52                direct index ( temp uint)
+0:52                  'dti' ( in 3-component vector of uint)
+0:52                  Constant:
+0:52                    0 (const int)
+0:52              Constant:
+0:52                3 (const int)
+0:52            Sequence
+0:52              Constant:
+0:52                0 (const int)
+0:52              Constant:
+0:52                1 (const int)
+0:52              Constant:
+0:52                2 (const int)
+0:52          Constant:
+0:52            1 (const uint)
+0:54      move second child to first child ( temp 4-component vector of uint)
+0:54        u: direct index for structure ( temp 4-component vector of uint)
+0:54          indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:54            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:54              'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:54              Constant:
+0:54                0 (const uint)
+0:54            direct index ( temp uint)
+0:54              'dti' ( in 3-component vector of uint)
+0:54              Constant:
+0:54                0 (const int)
+0:54          Constant:
+0:54            0 (const int)
+0:54        subgroupQuadBroadcast ( temp 4-component vector of uint)
+0:54          u: direct index for structure ( temp 4-component vector of uint)
+0:54            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:54              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:54                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:54                Constant:
+0:54                  0 (const uint)
+0:54              direct index ( temp uint)
+0:54                'dti' ( in 3-component vector of uint)
+0:54                Constant:
+0:54                  0 (const int)
+0:54            Constant:
+0:54              0 (const int)
+0:54          Constant:
+0:54            2 (const uint)
+0:55      move second child to first child ( temp uint)
+0:55        direct index ( temp uint)
+0:55          u: direct index for structure ( temp 4-component vector of uint)
+0:55            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:55              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:55                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:55                Constant:
+0:55                  0 (const uint)
+0:55              direct index ( temp uint)
+0:55                'dti' ( in 3-component vector of uint)
+0:55                Constant:
+0:55                  0 (const int)
+0:55            Constant:
+0:55              0 (const int)
+0:55          Constant:
+0:55            0 (const int)
+0:55        subgroupQuadBroadcast ( temp uint)
+0:55          direct index ( temp uint)
+0:55            u: direct index for structure ( temp 4-component vector of uint)
+0:55              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:55                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:55                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:55                  Constant:
+0:55                    0 (const uint)
+0:55                direct index ( temp uint)
+0:55                  'dti' ( in 3-component vector of uint)
+0:55                  Constant:
+0:55                    0 (const int)
+0:55              Constant:
+0:55                0 (const int)
+0:55            Constant:
+0:55              0 (const int)
+0:55          Constant:
+0:55            2 (const uint)
+0:56      move second child to first child ( temp 2-component vector of uint)
+0:56        vector swizzle ( temp 2-component vector of uint)
+0:56          u: direct index for structure ( temp 4-component vector of uint)
+0:56            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:56              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:56                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:56                Constant:
+0:56                  0 (const uint)
+0:56              direct index ( temp uint)
+0:56                'dti' ( in 3-component vector of uint)
+0:56                Constant:
+0:56                  0 (const int)
+0:56            Constant:
+0:56              0 (const int)
+0:56          Sequence
+0:56            Constant:
+0:56              0 (const int)
+0:56            Constant:
+0:56              1 (const int)
+0:56        subgroupQuadBroadcast ( temp 2-component vector of uint)
+0:56          vector swizzle ( temp 2-component vector of uint)
+0:56            u: direct index for structure ( temp 4-component vector of uint)
+0:56              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:56                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:56                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:56                  Constant:
+0:56                    0 (const uint)
+0:56                direct index ( temp uint)
+0:56                  'dti' ( in 3-component vector of uint)
+0:56                  Constant:
+0:56                    0 (const int)
+0:56              Constant:
+0:56                0 (const int)
+0:56            Sequence
+0:56              Constant:
+0:56                0 (const int)
+0:56              Constant:
+0:56                1 (const int)
+0:56          Constant:
+0:56            2 (const uint)
+0:57      move second child to first child ( temp 3-component vector of uint)
+0:57        vector swizzle ( temp 3-component vector of uint)
+0:57          u: direct index for structure ( temp 4-component vector of uint)
+0:57            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:57              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:57                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:57                Constant:
+0:57                  0 (const uint)
+0:57              direct index ( temp uint)
+0:57                'dti' ( in 3-component vector of uint)
+0:57                Constant:
+0:57                  0 (const int)
+0:57            Constant:
+0:57              0 (const int)
+0:57          Sequence
+0:57            Constant:
+0:57              0 (const int)
+0:57            Constant:
+0:57              1 (const int)
+0:57            Constant:
+0:57              2 (const int)
+0:57        subgroupQuadBroadcast ( temp 3-component vector of uint)
+0:57          vector swizzle ( temp 3-component vector of uint)
+0:57            u: direct index for structure ( temp 4-component vector of uint)
+0:57              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:57                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:57                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:57                  Constant:
+0:57                    0 (const uint)
+0:57                direct index ( temp uint)
+0:57                  'dti' ( in 3-component vector of uint)
+0:57                  Constant:
+0:57                    0 (const int)
+0:57              Constant:
+0:57                0 (const int)
+0:57            Sequence
+0:57              Constant:
+0:57                0 (const int)
+0:57              Constant:
+0:57                1 (const int)
+0:57              Constant:
+0:57                2 (const int)
+0:57          Constant:
+0:57            2 (const uint)
+0:59      move second child to first child ( temp 4-component vector of int)
+0:59        i: direct index for structure ( temp 4-component vector of int)
+0:59          indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:59            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:59              'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:59              Constant:
+0:59                0 (const uint)
+0:59            direct index ( temp uint)
+0:59              'dti' ( in 3-component vector of uint)
+0:59              Constant:
+0:59                0 (const int)
+0:59          Constant:
+0:59            1 (const int)
+0:59        subgroupQuadBroadcast ( temp 4-component vector of int)
+0:59          i: direct index for structure ( temp 4-component vector of int)
+0:59            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:59              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:59                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:59                Constant:
+0:59                  0 (const uint)
+0:59              direct index ( temp uint)
+0:59                'dti' ( in 3-component vector of uint)
+0:59                Constant:
+0:59                  0 (const int)
+0:59            Constant:
+0:59              1 (const int)
+0:59          Constant:
+0:59            2 (const uint)
+0:60      move second child to first child ( temp int)
+0:60        direct index ( temp int)
+0:60          i: direct index for structure ( temp 4-component vector of int)
+0:60            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:60              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:60                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:60                Constant:
+0:60                  0 (const uint)
+0:60              direct index ( temp uint)
+0:60                'dti' ( in 3-component vector of uint)
+0:60                Constant:
+0:60                  0 (const int)
+0:60            Constant:
+0:60              1 (const int)
+0:60          Constant:
+0:60            0 (const int)
+0:60        subgroupQuadBroadcast ( temp int)
+0:60          direct index ( temp int)
+0:60            i: direct index for structure ( temp 4-component vector of int)
+0:60              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:60                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:60                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:60                  Constant:
+0:60                    0 (const uint)
+0:60                direct index ( temp uint)
+0:60                  'dti' ( in 3-component vector of uint)
+0:60                  Constant:
+0:60                    0 (const int)
+0:60              Constant:
+0:60                1 (const int)
+0:60            Constant:
+0:60              0 (const int)
+0:60          Constant:
+0:60            2 (const uint)
+0:61      move second child to first child ( temp 2-component vector of int)
+0:61        vector swizzle ( temp 2-component vector of int)
+0:61          i: direct index for structure ( temp 4-component vector of int)
+0:61            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:61              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:61                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:61                Constant:
+0:61                  0 (const uint)
+0:61              direct index ( temp uint)
+0:61                'dti' ( in 3-component vector of uint)
+0:61                Constant:
+0:61                  0 (const int)
+0:61            Constant:
+0:61              1 (const int)
+0:61          Sequence
+0:61            Constant:
+0:61              0 (const int)
+0:61            Constant:
+0:61              1 (const int)
+0:61        subgroupQuadBroadcast ( temp 2-component vector of int)
+0:61          vector swizzle ( temp 2-component vector of int)
+0:61            i: direct index for structure ( temp 4-component vector of int)
+0:61              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:61                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:61                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:61                  Constant:
+0:61                    0 (const uint)
+0:61                direct index ( temp uint)
+0:61                  'dti' ( in 3-component vector of uint)
+0:61                  Constant:
+0:61                    0 (const int)
+0:61              Constant:
+0:61                1 (const int)
+0:61            Sequence
+0:61              Constant:
+0:61                0 (const int)
+0:61              Constant:
+0:61                1 (const int)
+0:61          Constant:
+0:61            2 (const uint)
+0:62      move second child to first child ( temp 3-component vector of int)
+0:62        vector swizzle ( temp 3-component vector of int)
+0:62          i: direct index for structure ( temp 4-component vector of int)
+0:62            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:62              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:62                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:62                Constant:
+0:62                  0 (const uint)
+0:62              direct index ( temp uint)
+0:62                'dti' ( in 3-component vector of uint)
+0:62                Constant:
+0:62                  0 (const int)
+0:62            Constant:
+0:62              1 (const int)
+0:62          Sequence
+0:62            Constant:
+0:62              0 (const int)
+0:62            Constant:
+0:62              1 (const int)
+0:62            Constant:
+0:62              2 (const int)
+0:62        subgroupQuadBroadcast ( temp 3-component vector of int)
+0:62          vector swizzle ( temp 3-component vector of int)
+0:62            i: direct index for structure ( temp 4-component vector of int)
+0:62              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:62                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:62                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:62                  Constant:
+0:62                    0 (const uint)
+0:62                direct index ( temp uint)
+0:62                  'dti' ( in 3-component vector of uint)
+0:62                  Constant:
+0:62                    0 (const int)
+0:62              Constant:
+0:62                1 (const int)
+0:62            Sequence
+0:62              Constant:
+0:62                0 (const int)
+0:62              Constant:
+0:62                1 (const int)
+0:62              Constant:
+0:62                2 (const int)
+0:62          Constant:
+0:62            2 (const uint)
+0:64      move second child to first child ( temp 4-component vector of float)
+0:64        f: direct index for structure ( temp 4-component vector of float)
+0:64          indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:64            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:64              'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:64              Constant:
+0:64                0 (const uint)
+0:64            direct index ( temp uint)
+0:64              'dti' ( in 3-component vector of uint)
+0:64              Constant:
+0:64                0 (const int)
+0:64          Constant:
+0:64            2 (const int)
+0:64        subgroupQuadBroadcast ( temp 4-component vector of float)
+0:64          f: direct index for structure ( temp 4-component vector of float)
+0:64            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:64              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:64                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:64                Constant:
+0:64                  0 (const uint)
+0:64              direct index ( temp uint)
+0:64                'dti' ( in 3-component vector of uint)
+0:64                Constant:
+0:64                  0 (const int)
+0:64            Constant:
+0:64              2 (const int)
+0:64          Constant:
+0:64            2 (const uint)
+0:65      move second child to first child ( temp float)
+0:65        direct index ( temp float)
+0:65          f: direct index for structure ( temp 4-component vector of float)
+0:65            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:65              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:65                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:65                Constant:
+0:65                  0 (const uint)
+0:65              direct index ( temp uint)
+0:65                'dti' ( in 3-component vector of uint)
+0:65                Constant:
+0:65                  0 (const int)
+0:65            Constant:
+0:65              2 (const int)
+0:65          Constant:
+0:65            0 (const int)
+0:65        subgroupQuadBroadcast ( temp float)
+0:65          direct index ( temp float)
+0:65            f: direct index for structure ( temp 4-component vector of float)
+0:65              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:65                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:65                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:65                  Constant:
+0:65                    0 (const uint)
+0:65                direct index ( temp uint)
+0:65                  'dti' ( in 3-component vector of uint)
+0:65                  Constant:
+0:65                    0 (const int)
+0:65              Constant:
+0:65                2 (const int)
+0:65            Constant:
+0:65              0 (const int)
+0:65          Constant:
+0:65            2 (const uint)
+0:66      move second child to first child ( temp 2-component vector of float)
+0:66        vector swizzle ( temp 2-component vector of float)
+0:66          f: direct index for structure ( temp 4-component vector of float)
+0:66            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:66              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:66                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:66                Constant:
+0:66                  0 (const uint)
+0:66              direct index ( temp uint)
+0:66                'dti' ( in 3-component vector of uint)
+0:66                Constant:
+0:66                  0 (const int)
+0:66            Constant:
+0:66              2 (const int)
+0:66          Sequence
+0:66            Constant:
+0:66              0 (const int)
+0:66            Constant:
+0:66              1 (const int)
+0:66        subgroupQuadBroadcast ( temp 2-component vector of float)
+0:66          vector swizzle ( temp 2-component vector of float)
+0:66            f: direct index for structure ( temp 4-component vector of float)
+0:66              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:66                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:66                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:66                  Constant:
+0:66                    0 (const uint)
+0:66                direct index ( temp uint)
+0:66                  'dti' ( in 3-component vector of uint)
+0:66                  Constant:
+0:66                    0 (const int)
+0:66              Constant:
+0:66                2 (const int)
+0:66            Sequence
+0:66              Constant:
+0:66                0 (const int)
+0:66              Constant:
+0:66                1 (const int)
+0:66          Constant:
+0:66            2 (const uint)
+0:67      move second child to first child ( temp 3-component vector of float)
+0:67        vector swizzle ( temp 3-component vector of float)
+0:67          f: direct index for structure ( temp 4-component vector of float)
+0:67            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:67              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:67                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:67                Constant:
+0:67                  0 (const uint)
+0:67              direct index ( temp uint)
+0:67                'dti' ( in 3-component vector of uint)
+0:67                Constant:
+0:67                  0 (const int)
+0:67            Constant:
+0:67              2 (const int)
+0:67          Sequence
+0:67            Constant:
+0:67              0 (const int)
+0:67            Constant:
+0:67              1 (const int)
+0:67            Constant:
+0:67              2 (const int)
+0:67        subgroupQuadBroadcast ( temp 3-component vector of float)
+0:67          vector swizzle ( temp 3-component vector of float)
+0:67            f: direct index for structure ( temp 4-component vector of float)
+0:67              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:67                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:67                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:67                  Constant:
+0:67                    0 (const uint)
+0:67                direct index ( temp uint)
+0:67                  'dti' ( in 3-component vector of uint)
+0:67                  Constant:
+0:67                    0 (const int)
+0:67              Constant:
+0:67                2 (const int)
+0:67            Sequence
+0:67              Constant:
+0:67                0 (const int)
+0:67              Constant:
+0:67                1 (const int)
+0:67              Constant:
+0:67                2 (const int)
+0:67          Constant:
+0:67            2 (const uint)
+0:69      move second child to first child ( temp 4-component vector of double)
+0:69        d: direct index for structure ( temp 4-component vector of double)
+0:69          indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:69            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:69              'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:69              Constant:
+0:69                0 (const uint)
+0:69            direct index ( temp uint)
+0:69              'dti' ( in 3-component vector of uint)
+0:69              Constant:
+0:69                0 (const int)
+0:69          Constant:
+0:69            3 (const int)
+0:69        subgroupQuadBroadcast ( temp 4-component vector of double)
+0:69          d: direct index for structure ( temp 4-component vector of double)
+0:69            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:69              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:69                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:69                Constant:
+0:69                  0 (const uint)
+0:69              direct index ( temp uint)
+0:69                'dti' ( in 3-component vector of uint)
+0:69                Constant:
+0:69                  0 (const int)
+0:69            Constant:
+0:69              3 (const int)
+0:69          Constant:
+0:69            2 (const uint)
+0:70      move second child to first child ( temp double)
+0:70        direct index ( temp double)
+0:70          d: direct index for structure ( temp 4-component vector of double)
+0:70            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:70              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:70                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:70                Constant:
+0:70                  0 (const uint)
+0:70              direct index ( temp uint)
+0:70                'dti' ( in 3-component vector of uint)
+0:70                Constant:
+0:70                  0 (const int)
+0:70            Constant:
+0:70              3 (const int)
+0:70          Constant:
+0:70            0 (const int)
+0:70        subgroupQuadBroadcast ( temp double)
+0:70          direct index ( temp double)
+0:70            d: direct index for structure ( temp 4-component vector of double)
+0:70              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:70                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:70                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:70                  Constant:
+0:70                    0 (const uint)
+0:70                direct index ( temp uint)
+0:70                  'dti' ( in 3-component vector of uint)
+0:70                  Constant:
+0:70                    0 (const int)
+0:70              Constant:
+0:70                3 (const int)
+0:70            Constant:
+0:70              0 (const int)
+0:70          Constant:
+0:70            2 (const uint)
+0:71      move second child to first child ( temp 2-component vector of double)
+0:71        vector swizzle ( temp 2-component vector of double)
+0:71          d: direct index for structure ( temp 4-component vector of double)
+0:71            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:71              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:71                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:71                Constant:
+0:71                  0 (const uint)
+0:71              direct index ( temp uint)
+0:71                'dti' ( in 3-component vector of uint)
+0:71                Constant:
+0:71                  0 (const int)
+0:71            Constant:
+0:71              3 (const int)
+0:71          Sequence
+0:71            Constant:
+0:71              0 (const int)
+0:71            Constant:
+0:71              1 (const int)
+0:71        subgroupQuadBroadcast ( temp 2-component vector of double)
+0:71          vector swizzle ( temp 2-component vector of double)
+0:71            d: direct index for structure ( temp 4-component vector of double)
+0:71              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:71                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:71                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:71                  Constant:
+0:71                    0 (const uint)
+0:71                direct index ( temp uint)
+0:71                  'dti' ( in 3-component vector of uint)
+0:71                  Constant:
+0:71                    0 (const int)
+0:71              Constant:
+0:71                3 (const int)
+0:71            Sequence
+0:71              Constant:
+0:71                0 (const int)
+0:71              Constant:
+0:71                1 (const int)
+0:71          Constant:
+0:71            2 (const uint)
+0:72      move second child to first child ( temp 3-component vector of double)
+0:72        vector swizzle ( temp 3-component vector of double)
+0:72          d: direct index for structure ( temp 4-component vector of double)
+0:72            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:72              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:72                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:72                Constant:
+0:72                  0 (const uint)
+0:72              direct index ( temp uint)
+0:72                'dti' ( in 3-component vector of uint)
+0:72                Constant:
+0:72                  0 (const int)
+0:72            Constant:
+0:72              3 (const int)
+0:72          Sequence
+0:72            Constant:
+0:72              0 (const int)
+0:72            Constant:
+0:72              1 (const int)
+0:72            Constant:
+0:72              2 (const int)
+0:72        subgroupQuadBroadcast ( temp 3-component vector of double)
+0:72          vector swizzle ( temp 3-component vector of double)
+0:72            d: direct index for structure ( temp 4-component vector of double)
+0:72              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:72                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:72                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:72                  Constant:
+0:72                    0 (const uint)
+0:72                direct index ( temp uint)
+0:72                  'dti' ( in 3-component vector of uint)
+0:72                  Constant:
+0:72                    0 (const int)
+0:72              Constant:
+0:72                3 (const int)
+0:72            Sequence
+0:72              Constant:
+0:72                0 (const int)
+0:72              Constant:
+0:72                1 (const int)
+0:72              Constant:
+0:72                2 (const int)
+0:72          Constant:
+0:72            2 (const uint)
+0:74      move second child to first child ( temp 4-component vector of uint)
+0:74        u: direct index for structure ( temp 4-component vector of uint)
+0:74          indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:74            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:74              'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:74              Constant:
+0:74                0 (const uint)
+0:74            direct index ( temp uint)
+0:74              'dti' ( in 3-component vector of uint)
+0:74              Constant:
+0:74                0 (const int)
+0:74          Constant:
+0:74            0 (const int)
+0:74        subgroupQuadBroadcast ( temp 4-component vector of uint)
+0:74          u: direct index for structure ( temp 4-component vector of uint)
+0:74            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:74              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:74                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:74                Constant:
+0:74                  0 (const uint)
+0:74              direct index ( temp uint)
+0:74                'dti' ( in 3-component vector of uint)
+0:74                Constant:
+0:74                  0 (const int)
+0:74            Constant:
+0:74              0 (const int)
+0:74          Constant:
+0:74            3 (const uint)
+0:75      move second child to first child ( temp uint)
+0:75        direct index ( temp uint)
+0:75          u: direct index for structure ( temp 4-component vector of uint)
+0:75            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:75              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:75                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:75                Constant:
+0:75                  0 (const uint)
+0:75              direct index ( temp uint)
+0:75                'dti' ( in 3-component vector of uint)
+0:75                Constant:
+0:75                  0 (const int)
+0:75            Constant:
+0:75              0 (const int)
+0:75          Constant:
+0:75            0 (const int)
+0:75        subgroupQuadBroadcast ( temp uint)
+0:75          direct index ( temp uint)
+0:75            u: direct index for structure ( temp 4-component vector of uint)
+0:75              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:75                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:75                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:75                  Constant:
+0:75                    0 (const uint)
+0:75                direct index ( temp uint)
+0:75                  'dti' ( in 3-component vector of uint)
+0:75                  Constant:
+0:75                    0 (const int)
+0:75              Constant:
+0:75                0 (const int)
+0:75            Constant:
+0:75              0 (const int)
+0:75          Constant:
+0:75            3 (const uint)
+0:76      move second child to first child ( temp 2-component vector of uint)
+0:76        vector swizzle ( temp 2-component vector of uint)
+0:76          u: direct index for structure ( temp 4-component vector of uint)
+0:76            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:76              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:76                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:76                Constant:
+0:76                  0 (const uint)
+0:76              direct index ( temp uint)
+0:76                'dti' ( in 3-component vector of uint)
+0:76                Constant:
+0:76                  0 (const int)
+0:76            Constant:
+0:76              0 (const int)
+0:76          Sequence
+0:76            Constant:
+0:76              0 (const int)
+0:76            Constant:
+0:76              1 (const int)
+0:76        subgroupQuadBroadcast ( temp 2-component vector of uint)
+0:76          vector swizzle ( temp 2-component vector of uint)
+0:76            u: direct index for structure ( temp 4-component vector of uint)
+0:76              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:76                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:76                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:76                  Constant:
+0:76                    0 (const uint)
+0:76                direct index ( temp uint)
+0:76                  'dti' ( in 3-component vector of uint)
+0:76                  Constant:
+0:76                    0 (const int)
+0:76              Constant:
+0:76                0 (const int)
+0:76            Sequence
+0:76              Constant:
+0:76                0 (const int)
+0:76              Constant:
+0:76                1 (const int)
+0:76          Constant:
+0:76            3 (const uint)
+0:77      move second child to first child ( temp 3-component vector of uint)
+0:77        vector swizzle ( temp 3-component vector of uint)
+0:77          u: direct index for structure ( temp 4-component vector of uint)
+0:77            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:77              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:77                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:77                Constant:
+0:77                  0 (const uint)
+0:77              direct index ( temp uint)
+0:77                'dti' ( in 3-component vector of uint)
+0:77                Constant:
+0:77                  0 (const int)
+0:77            Constant:
+0:77              0 (const int)
+0:77          Sequence
+0:77            Constant:
+0:77              0 (const int)
+0:77            Constant:
+0:77              1 (const int)
+0:77            Constant:
+0:77              2 (const int)
+0:77        subgroupQuadBroadcast ( temp 3-component vector of uint)
+0:77          vector swizzle ( temp 3-component vector of uint)
+0:77            u: direct index for structure ( temp 4-component vector of uint)
+0:77              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:77                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:77                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:77                  Constant:
+0:77                    0 (const uint)
+0:77                direct index ( temp uint)
+0:77                  'dti' ( in 3-component vector of uint)
+0:77                  Constant:
+0:77                    0 (const int)
+0:77              Constant:
+0:77                0 (const int)
+0:77            Sequence
+0:77              Constant:
+0:77                0 (const int)
+0:77              Constant:
+0:77                1 (const int)
+0:77              Constant:
+0:77                2 (const int)
+0:77          Constant:
+0:77            3 (const uint)
+0:79      move second child to first child ( temp 4-component vector of int)
+0:79        i: direct index for structure ( temp 4-component vector of int)
+0:79          indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:79            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:79              'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:79              Constant:
+0:79                0 (const uint)
+0:79            direct index ( temp uint)
+0:79              'dti' ( in 3-component vector of uint)
+0:79              Constant:
+0:79                0 (const int)
+0:79          Constant:
+0:79            1 (const int)
+0:79        subgroupQuadBroadcast ( temp 4-component vector of int)
+0:79          i: direct index for structure ( temp 4-component vector of int)
+0:79            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:79              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:79                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:79                Constant:
+0:79                  0 (const uint)
+0:79              direct index ( temp uint)
+0:79                'dti' ( in 3-component vector of uint)
+0:79                Constant:
+0:79                  0 (const int)
+0:79            Constant:
+0:79              1 (const int)
+0:79          Constant:
+0:79            3 (const uint)
+0:80      move second child to first child ( temp int)
+0:80        direct index ( temp int)
+0:80          i: direct index for structure ( temp 4-component vector of int)
+0:80            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:80              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:80                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:80                Constant:
+0:80                  0 (const uint)
+0:80              direct index ( temp uint)
+0:80                'dti' ( in 3-component vector of uint)
+0:80                Constant:
+0:80                  0 (const int)
+0:80            Constant:
+0:80              1 (const int)
+0:80          Constant:
+0:80            0 (const int)
+0:80        subgroupQuadBroadcast ( temp int)
+0:80          direct index ( temp int)
+0:80            i: direct index for structure ( temp 4-component vector of int)
+0:80              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:80                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:80                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:80                  Constant:
+0:80                    0 (const uint)
+0:80                direct index ( temp uint)
+0:80                  'dti' ( in 3-component vector of uint)
+0:80                  Constant:
+0:80                    0 (const int)
+0:80              Constant:
+0:80                1 (const int)
+0:80            Constant:
+0:80              0 (const int)
+0:80          Constant:
+0:80            3 (const uint)
+0:81      move second child to first child ( temp 2-component vector of int)
+0:81        vector swizzle ( temp 2-component vector of int)
+0:81          i: direct index for structure ( temp 4-component vector of int)
+0:81            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:81              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:81                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:81                Constant:
+0:81                  0 (const uint)
+0:81              direct index ( temp uint)
+0:81                'dti' ( in 3-component vector of uint)
+0:81                Constant:
+0:81                  0 (const int)
+0:81            Constant:
+0:81              1 (const int)
+0:81          Sequence
+0:81            Constant:
+0:81              0 (const int)
+0:81            Constant:
+0:81              1 (const int)
+0:81        subgroupQuadBroadcast ( temp 2-component vector of int)
+0:81          vector swizzle ( temp 2-component vector of int)
+0:81            i: direct index for structure ( temp 4-component vector of int)
+0:81              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:81                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:81                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:81                  Constant:
+0:81                    0 (const uint)
+0:81                direct index ( temp uint)
+0:81                  'dti' ( in 3-component vector of uint)
+0:81                  Constant:
+0:81                    0 (const int)
+0:81              Constant:
+0:81                1 (const int)
+0:81            Sequence
+0:81              Constant:
+0:81                0 (const int)
+0:81              Constant:
+0:81                1 (const int)
+0:81          Constant:
+0:81            3 (const uint)
+0:82      move second child to first child ( temp 3-component vector of int)
+0:82        vector swizzle ( temp 3-component vector of int)
+0:82          i: direct index for structure ( temp 4-component vector of int)
+0:82            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:82              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:82                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:82                Constant:
+0:82                  0 (const uint)
+0:82              direct index ( temp uint)
+0:82                'dti' ( in 3-component vector of uint)
+0:82                Constant:
+0:82                  0 (const int)
+0:82            Constant:
+0:82              1 (const int)
+0:82          Sequence
+0:82            Constant:
+0:82              0 (const int)
+0:82            Constant:
+0:82              1 (const int)
+0:82            Constant:
+0:82              2 (const int)
+0:82        subgroupQuadBroadcast ( temp 3-component vector of int)
+0:82          vector swizzle ( temp 3-component vector of int)
+0:82            i: direct index for structure ( temp 4-component vector of int)
+0:82              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:82                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:82                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:82                  Constant:
+0:82                    0 (const uint)
+0:82                direct index ( temp uint)
+0:82                  'dti' ( in 3-component vector of uint)
+0:82                  Constant:
+0:82                    0 (const int)
+0:82              Constant:
+0:82                1 (const int)
+0:82            Sequence
+0:82              Constant:
+0:82                0 (const int)
+0:82              Constant:
+0:82                1 (const int)
+0:82              Constant:
+0:82                2 (const int)
+0:82          Constant:
+0:82            3 (const uint)
+0:84      move second child to first child ( temp 4-component vector of float)
+0:84        f: direct index for structure ( temp 4-component vector of float)
+0:84          indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:84            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:84              'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:84              Constant:
+0:84                0 (const uint)
+0:84            direct index ( temp uint)
+0:84              'dti' ( in 3-component vector of uint)
+0:84              Constant:
+0:84                0 (const int)
+0:84          Constant:
+0:84            2 (const int)
+0:84        subgroupQuadBroadcast ( temp 4-component vector of float)
+0:84          f: direct index for structure ( temp 4-component vector of float)
+0:84            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:84              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:84                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:84                Constant:
+0:84                  0 (const uint)
+0:84              direct index ( temp uint)
+0:84                'dti' ( in 3-component vector of uint)
+0:84                Constant:
+0:84                  0 (const int)
+0:84            Constant:
+0:84              2 (const int)
+0:84          Constant:
+0:84            3 (const uint)
+0:85      move second child to first child ( temp float)
+0:85        direct index ( temp float)
+0:85          f: direct index for structure ( temp 4-component vector of float)
+0:85            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:85              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:85                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:85                Constant:
+0:85                  0 (const uint)
+0:85              direct index ( temp uint)
+0:85                'dti' ( in 3-component vector of uint)
+0:85                Constant:
+0:85                  0 (const int)
+0:85            Constant:
+0:85              2 (const int)
+0:85          Constant:
+0:85            0 (const int)
+0:85        subgroupQuadBroadcast ( temp float)
+0:85          direct index ( temp float)
+0:85            f: direct index for structure ( temp 4-component vector of float)
+0:85              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:85                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:85                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:85                  Constant:
+0:85                    0 (const uint)
+0:85                direct index ( temp uint)
+0:85                  'dti' ( in 3-component vector of uint)
+0:85                  Constant:
+0:85                    0 (const int)
+0:85              Constant:
+0:85                2 (const int)
+0:85            Constant:
+0:85              0 (const int)
+0:85          Constant:
+0:85            3 (const uint)
+0:86      move second child to first child ( temp 2-component vector of float)
+0:86        vector swizzle ( temp 2-component vector of float)
+0:86          f: direct index for structure ( temp 4-component vector of float)
+0:86            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:86              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:86                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:86                Constant:
+0:86                  0 (const uint)
+0:86              direct index ( temp uint)
+0:86                'dti' ( in 3-component vector of uint)
+0:86                Constant:
+0:86                  0 (const int)
+0:86            Constant:
+0:86              2 (const int)
+0:86          Sequence
+0:86            Constant:
+0:86              0 (const int)
+0:86            Constant:
+0:86              1 (const int)
+0:86        subgroupQuadBroadcast ( temp 2-component vector of float)
+0:86          vector swizzle ( temp 2-component vector of float)
+0:86            f: direct index for structure ( temp 4-component vector of float)
+0:86              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:86                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:86                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:86                  Constant:
+0:86                    0 (const uint)
+0:86                direct index ( temp uint)
+0:86                  'dti' ( in 3-component vector of uint)
+0:86                  Constant:
+0:86                    0 (const int)
+0:86              Constant:
+0:86                2 (const int)
+0:86            Sequence
+0:86              Constant:
+0:86                0 (const int)
+0:86              Constant:
+0:86                1 (const int)
+0:86          Constant:
+0:86            3 (const uint)
+0:87      move second child to first child ( temp 3-component vector of float)
+0:87        vector swizzle ( temp 3-component vector of float)
+0:87          f: direct index for structure ( temp 4-component vector of float)
+0:87            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:87              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:87                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:87                Constant:
+0:87                  0 (const uint)
+0:87              direct index ( temp uint)
+0:87                'dti' ( in 3-component vector of uint)
+0:87                Constant:
+0:87                  0 (const int)
+0:87            Constant:
+0:87              2 (const int)
+0:87          Sequence
+0:87            Constant:
+0:87              0 (const int)
+0:87            Constant:
+0:87              1 (const int)
+0:87            Constant:
+0:87              2 (const int)
+0:87        subgroupQuadBroadcast ( temp 3-component vector of float)
+0:87          vector swizzle ( temp 3-component vector of float)
+0:87            f: direct index for structure ( temp 4-component vector of float)
+0:87              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:87                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:87                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:87                  Constant:
+0:87                    0 (const uint)
+0:87                direct index ( temp uint)
+0:87                  'dti' ( in 3-component vector of uint)
+0:87                  Constant:
+0:87                    0 (const int)
+0:87              Constant:
+0:87                2 (const int)
+0:87            Sequence
+0:87              Constant:
+0:87                0 (const int)
+0:87              Constant:
+0:87                1 (const int)
+0:87              Constant:
+0:87                2 (const int)
+0:87          Constant:
+0:87            3 (const uint)
+0:89      move second child to first child ( temp 4-component vector of double)
+0:89        d: direct index for structure ( temp 4-component vector of double)
+0:89          indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:89            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:89              'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:89              Constant:
+0:89                0 (const uint)
+0:89            direct index ( temp uint)
+0:89              'dti' ( in 3-component vector of uint)
+0:89              Constant:
+0:89                0 (const int)
+0:89          Constant:
+0:89            3 (const int)
+0:89        subgroupQuadBroadcast ( temp 4-component vector of double)
+0:89          d: direct index for structure ( temp 4-component vector of double)
+0:89            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:89              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:89                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:89                Constant:
+0:89                  0 (const uint)
+0:89              direct index ( temp uint)
+0:89                'dti' ( in 3-component vector of uint)
+0:89                Constant:
+0:89                  0 (const int)
+0:89            Constant:
+0:89              3 (const int)
+0:89          Constant:
+0:89            3 (const uint)
+0:90      move second child to first child ( temp double)
+0:90        direct index ( temp double)
+0:90          d: direct index for structure ( temp 4-component vector of double)
+0:90            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:90              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:90                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:90                Constant:
+0:90                  0 (const uint)
+0:90              direct index ( temp uint)
+0:90                'dti' ( in 3-component vector of uint)
+0:90                Constant:
+0:90                  0 (const int)
+0:90            Constant:
+0:90              3 (const int)
+0:90          Constant:
+0:90            0 (const int)
+0:90        subgroupQuadBroadcast ( temp double)
+0:90          direct index ( temp double)
+0:90            d: direct index for structure ( temp 4-component vector of double)
+0:90              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:90                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:90                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:90                  Constant:
+0:90                    0 (const uint)
+0:90                direct index ( temp uint)
+0:90                  'dti' ( in 3-component vector of uint)
+0:90                  Constant:
+0:90                    0 (const int)
+0:90              Constant:
+0:90                3 (const int)
+0:90            Constant:
+0:90              0 (const int)
+0:90          Constant:
+0:90            3 (const uint)
+0:91      move second child to first child ( temp 2-component vector of double)
+0:91        vector swizzle ( temp 2-component vector of double)
+0:91          d: direct index for structure ( temp 4-component vector of double)
+0:91            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:91              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:91                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:91                Constant:
+0:91                  0 (const uint)
+0:91              direct index ( temp uint)
+0:91                'dti' ( in 3-component vector of uint)
+0:91                Constant:
+0:91                  0 (const int)
+0:91            Constant:
+0:91              3 (const int)
+0:91          Sequence
+0:91            Constant:
+0:91              0 (const int)
+0:91            Constant:
+0:91              1 (const int)
+0:91        subgroupQuadBroadcast ( temp 2-component vector of double)
+0:91          vector swizzle ( temp 2-component vector of double)
+0:91            d: direct index for structure ( temp 4-component vector of double)
+0:91              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:91                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:91                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:91                  Constant:
+0:91                    0 (const uint)
+0:91                direct index ( temp uint)
+0:91                  'dti' ( in 3-component vector of uint)
+0:91                  Constant:
+0:91                    0 (const int)
+0:91              Constant:
+0:91                3 (const int)
+0:91            Sequence
+0:91              Constant:
+0:91                0 (const int)
+0:91              Constant:
+0:91                1 (const int)
+0:91          Constant:
+0:91            3 (const uint)
+0:92      move second child to first child ( temp 3-component vector of double)
+0:92        vector swizzle ( temp 3-component vector of double)
+0:92          d: direct index for structure ( temp 4-component vector of double)
+0:92            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:92              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:92                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:92                Constant:
+0:92                  0 (const uint)
+0:92              direct index ( temp uint)
+0:92                'dti' ( in 3-component vector of uint)
+0:92                Constant:
+0:92                  0 (const int)
+0:92            Constant:
+0:92              3 (const int)
+0:92          Sequence
+0:92            Constant:
+0:92              0 (const int)
+0:92            Constant:
+0:92              1 (const int)
+0:92            Constant:
+0:92              2 (const int)
+0:92        subgroupQuadBroadcast ( temp 3-component vector of double)
+0:92          vector swizzle ( temp 3-component vector of double)
+0:92            d: direct index for structure ( temp 4-component vector of double)
+0:92              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:92                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:92                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:92                  Constant:
+0:92                    0 (const uint)
+0:92                direct index ( temp uint)
+0:92                  'dti' ( in 3-component vector of uint)
+0:92                  Constant:
+0:92                    0 (const int)
+0:92              Constant:
+0:92                3 (const int)
+0:92            Sequence
+0:92              Constant:
+0:92                0 (const int)
+0:92              Constant:
+0:92                1 (const int)
+0:92              Constant:
+0:92                2 (const int)
+0:92          Constant:
+0:92            3 (const uint)
+0:94      move second child to first child ( temp 4-component vector of uint)
+0:94        u: direct index for structure ( temp 4-component vector of uint)
+0:94          indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:94            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:94              'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:94              Constant:
+0:94                0 (const uint)
+0:94            direct index ( temp uint)
+0:94              'dti' ( in 3-component vector of uint)
+0:94              Constant:
+0:94                0 (const int)
+0:94          Constant:
+0:94            0 (const int)
+0:94        subgroupQuadSwapHorizontal ( temp 4-component vector of uint)
+0:94          u: direct index for structure ( temp 4-component vector of uint)
+0:94            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:94              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:94                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:94                Constant:
+0:94                  0 (const uint)
+0:94              direct index ( temp uint)
+0:94                'dti' ( in 3-component vector of uint)
+0:94                Constant:
+0:94                  0 (const int)
+0:94            Constant:
+0:94              0 (const int)
+0:95      move second child to first child ( temp uint)
+0:95        direct index ( temp uint)
+0:95          u: direct index for structure ( temp 4-component vector of uint)
+0:95            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:95              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:95                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:95                Constant:
+0:95                  0 (const uint)
+0:95              direct index ( temp uint)
+0:95                'dti' ( in 3-component vector of uint)
+0:95                Constant:
+0:95                  0 (const int)
+0:95            Constant:
+0:95              0 (const int)
+0:95          Constant:
+0:95            0 (const int)
+0:95        subgroupQuadSwapHorizontal ( temp uint)
+0:95          direct index ( temp uint)
+0:95            u: direct index for structure ( temp 4-component vector of uint)
+0:95              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:95                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:95                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:95                  Constant:
+0:95                    0 (const uint)
+0:95                direct index ( temp uint)
+0:95                  'dti' ( in 3-component vector of uint)
+0:95                  Constant:
+0:95                    0 (const int)
+0:95              Constant:
+0:95                0 (const int)
+0:95            Constant:
+0:95              0 (const int)
+0:96      move second child to first child ( temp 2-component vector of uint)
+0:96        vector swizzle ( temp 2-component vector of uint)
+0:96          u: direct index for structure ( temp 4-component vector of uint)
+0:96            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:96              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:96                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:96                Constant:
+0:96                  0 (const uint)
+0:96              direct index ( temp uint)
+0:96                'dti' ( in 3-component vector of uint)
+0:96                Constant:
+0:96                  0 (const int)
+0:96            Constant:
+0:96              0 (const int)
+0:96          Sequence
+0:96            Constant:
+0:96              0 (const int)
+0:96            Constant:
+0:96              1 (const int)
+0:96        subgroupQuadSwapHorizontal ( temp 2-component vector of uint)
+0:96          vector swizzle ( temp 2-component vector of uint)
+0:96            u: direct index for structure ( temp 4-component vector of uint)
+0:96              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:96                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:96                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:96                  Constant:
+0:96                    0 (const uint)
+0:96                direct index ( temp uint)
+0:96                  'dti' ( in 3-component vector of uint)
+0:96                  Constant:
+0:96                    0 (const int)
+0:96              Constant:
+0:96                0 (const int)
+0:96            Sequence
+0:96              Constant:
+0:96                0 (const int)
+0:96              Constant:
+0:96                1 (const int)
+0:97      move second child to first child ( temp 3-component vector of uint)
+0:97        vector swizzle ( temp 3-component vector of uint)
+0:97          u: direct index for structure ( temp 4-component vector of uint)
+0:97            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:97              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:97                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:97                Constant:
+0:97                  0 (const uint)
+0:97              direct index ( temp uint)
+0:97                'dti' ( in 3-component vector of uint)
+0:97                Constant:
+0:97                  0 (const int)
+0:97            Constant:
+0:97              0 (const int)
+0:97          Sequence
+0:97            Constant:
+0:97              0 (const int)
+0:97            Constant:
+0:97              1 (const int)
+0:97            Constant:
+0:97              2 (const int)
+0:97        subgroupQuadSwapHorizontal ( temp 3-component vector of uint)
+0:97          vector swizzle ( temp 3-component vector of uint)
+0:97            u: direct index for structure ( temp 4-component vector of uint)
+0:97              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:97                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:97                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:97                  Constant:
+0:97                    0 (const uint)
+0:97                direct index ( temp uint)
+0:97                  'dti' ( in 3-component vector of uint)
+0:97                  Constant:
+0:97                    0 (const int)
+0:97              Constant:
+0:97                0 (const int)
+0:97            Sequence
+0:97              Constant:
+0:97                0 (const int)
+0:97              Constant:
+0:97                1 (const int)
+0:97              Constant:
+0:97                2 (const int)
+0:99      move second child to first child ( temp 4-component vector of int)
+0:99        i: direct index for structure ( temp 4-component vector of int)
+0:99          indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:99            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:99              'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:99              Constant:
+0:99                0 (const uint)
+0:99            direct index ( temp uint)
+0:99              'dti' ( in 3-component vector of uint)
+0:99              Constant:
+0:99                0 (const int)
+0:99          Constant:
+0:99            1 (const int)
+0:99        subgroupQuadSwapHorizontal ( temp 4-component vector of int)
+0:99          i: direct index for structure ( temp 4-component vector of int)
+0:99            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:99              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:99                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:99                Constant:
+0:99                  0 (const uint)
+0:99              direct index ( temp uint)
+0:99                'dti' ( in 3-component vector of uint)
+0:99                Constant:
+0:99                  0 (const int)
+0:99            Constant:
+0:99              1 (const int)
+0:100      move second child to first child ( temp int)
+0:100        direct index ( temp int)
+0:100          i: direct index for structure ( temp 4-component vector of int)
+0:100            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:100              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:100                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:100                Constant:
+0:100                  0 (const uint)
+0:100              direct index ( temp uint)
+0:100                'dti' ( in 3-component vector of uint)
+0:100                Constant:
+0:100                  0 (const int)
+0:100            Constant:
+0:100              1 (const int)
+0:100          Constant:
+0:100            0 (const int)
+0:100        subgroupQuadSwapHorizontal ( temp int)
+0:100          direct index ( temp int)
+0:100            i: direct index for structure ( temp 4-component vector of int)
+0:100              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:100                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:100                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:100                  Constant:
+0:100                    0 (const uint)
+0:100                direct index ( temp uint)
+0:100                  'dti' ( in 3-component vector of uint)
+0:100                  Constant:
+0:100                    0 (const int)
+0:100              Constant:
+0:100                1 (const int)
+0:100            Constant:
+0:100              0 (const int)
+0:101      move second child to first child ( temp 2-component vector of int)
+0:101        vector swizzle ( temp 2-component vector of int)
+0:101          i: direct index for structure ( temp 4-component vector of int)
+0:101            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:101              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:101                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:101                Constant:
+0:101                  0 (const uint)
+0:101              direct index ( temp uint)
+0:101                'dti' ( in 3-component vector of uint)
+0:101                Constant:
+0:101                  0 (const int)
+0:101            Constant:
+0:101              1 (const int)
+0:101          Sequence
+0:101            Constant:
+0:101              0 (const int)
+0:101            Constant:
+0:101              1 (const int)
+0:101        subgroupQuadSwapHorizontal ( temp 2-component vector of int)
+0:101          vector swizzle ( temp 2-component vector of int)
+0:101            i: direct index for structure ( temp 4-component vector of int)
+0:101              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:101                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:101                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:101                  Constant:
+0:101                    0 (const uint)
+0:101                direct index ( temp uint)
+0:101                  'dti' ( in 3-component vector of uint)
+0:101                  Constant:
+0:101                    0 (const int)
+0:101              Constant:
+0:101                1 (const int)
+0:101            Sequence
+0:101              Constant:
+0:101                0 (const int)
+0:101              Constant:
+0:101                1 (const int)
+0:102      move second child to first child ( temp 3-component vector of int)
+0:102        vector swizzle ( temp 3-component vector of int)
+0:102          i: direct index for structure ( temp 4-component vector of int)
+0:102            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:102              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:102                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:102                Constant:
+0:102                  0 (const uint)
+0:102              direct index ( temp uint)
+0:102                'dti' ( in 3-component vector of uint)
+0:102                Constant:
+0:102                  0 (const int)
+0:102            Constant:
+0:102              1 (const int)
+0:102          Sequence
+0:102            Constant:
+0:102              0 (const int)
+0:102            Constant:
+0:102              1 (const int)
+0:102            Constant:
+0:102              2 (const int)
+0:102        subgroupQuadSwapHorizontal ( temp 3-component vector of int)
+0:102          vector swizzle ( temp 3-component vector of int)
+0:102            i: direct index for structure ( temp 4-component vector of int)
+0:102              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:102                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:102                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:102                  Constant:
+0:102                    0 (const uint)
+0:102                direct index ( temp uint)
+0:102                  'dti' ( in 3-component vector of uint)
+0:102                  Constant:
+0:102                    0 (const int)
+0:102              Constant:
+0:102                1 (const int)
+0:102            Sequence
+0:102              Constant:
+0:102                0 (const int)
+0:102              Constant:
+0:102                1 (const int)
+0:102              Constant:
+0:102                2 (const int)
+0:104      move second child to first child ( temp 4-component vector of float)
+0:104        f: direct index for structure ( temp 4-component vector of float)
+0:104          indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:104            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:104              'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:104              Constant:
+0:104                0 (const uint)
+0:104            direct index ( temp uint)
+0:104              'dti' ( in 3-component vector of uint)
+0:104              Constant:
+0:104                0 (const int)
+0:104          Constant:
+0:104            2 (const int)
+0:104        subgroupQuadSwapHorizontal ( temp 4-component vector of float)
+0:104          f: direct index for structure ( temp 4-component vector of float)
+0:104            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:104              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:104                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:104                Constant:
+0:104                  0 (const uint)
+0:104              direct index ( temp uint)
+0:104                'dti' ( in 3-component vector of uint)
+0:104                Constant:
+0:104                  0 (const int)
+0:104            Constant:
+0:104              2 (const int)
+0:105      move second child to first child ( temp float)
+0:105        direct index ( temp float)
+0:105          f: direct index for structure ( temp 4-component vector of float)
+0:105            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:105              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:105                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:105                Constant:
+0:105                  0 (const uint)
+0:105              direct index ( temp uint)
+0:105                'dti' ( in 3-component vector of uint)
+0:105                Constant:
+0:105                  0 (const int)
+0:105            Constant:
+0:105              2 (const int)
+0:105          Constant:
+0:105            0 (const int)
+0:105        subgroupQuadSwapHorizontal ( temp float)
+0:105          direct index ( temp float)
+0:105            f: direct index for structure ( temp 4-component vector of float)
+0:105              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:105                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:105                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:105                  Constant:
+0:105                    0 (const uint)
+0:105                direct index ( temp uint)
+0:105                  'dti' ( in 3-component vector of uint)
+0:105                  Constant:
+0:105                    0 (const int)
+0:105              Constant:
+0:105                2 (const int)
+0:105            Constant:
+0:105              0 (const int)
+0:106      move second child to first child ( temp 2-component vector of float)
+0:106        vector swizzle ( temp 2-component vector of float)
+0:106          f: direct index for structure ( temp 4-component vector of float)
+0:106            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:106              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:106                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:106                Constant:
+0:106                  0 (const uint)
+0:106              direct index ( temp uint)
+0:106                'dti' ( in 3-component vector of uint)
+0:106                Constant:
+0:106                  0 (const int)
+0:106            Constant:
+0:106              2 (const int)
+0:106          Sequence
+0:106            Constant:
+0:106              0 (const int)
+0:106            Constant:
+0:106              1 (const int)
+0:106        subgroupQuadSwapHorizontal ( temp 2-component vector of float)
+0:106          vector swizzle ( temp 2-component vector of float)
+0:106            f: direct index for structure ( temp 4-component vector of float)
+0:106              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:106                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:106                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:106                  Constant:
+0:106                    0 (const uint)
+0:106                direct index ( temp uint)
+0:106                  'dti' ( in 3-component vector of uint)
+0:106                  Constant:
+0:106                    0 (const int)
+0:106              Constant:
+0:106                2 (const int)
+0:106            Sequence
+0:106              Constant:
+0:106                0 (const int)
+0:106              Constant:
+0:106                1 (const int)
+0:107      move second child to first child ( temp 3-component vector of float)
+0:107        vector swizzle ( temp 3-component vector of float)
+0:107          f: direct index for structure ( temp 4-component vector of float)
+0:107            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:107              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:107                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:107                Constant:
+0:107                  0 (const uint)
+0:107              direct index ( temp uint)
+0:107                'dti' ( in 3-component vector of uint)
+0:107                Constant:
+0:107                  0 (const int)
+0:107            Constant:
+0:107              2 (const int)
+0:107          Sequence
+0:107            Constant:
+0:107              0 (const int)
+0:107            Constant:
+0:107              1 (const int)
+0:107            Constant:
+0:107              2 (const int)
+0:107        subgroupQuadSwapHorizontal ( temp 3-component vector of float)
+0:107          vector swizzle ( temp 3-component vector of float)
+0:107            f: direct index for structure ( temp 4-component vector of float)
+0:107              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:107                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:107                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:107                  Constant:
+0:107                    0 (const uint)
+0:107                direct index ( temp uint)
+0:107                  'dti' ( in 3-component vector of uint)
+0:107                  Constant:
+0:107                    0 (const int)
+0:107              Constant:
+0:107                2 (const int)
+0:107            Sequence
+0:107              Constant:
+0:107                0 (const int)
+0:107              Constant:
+0:107                1 (const int)
+0:107              Constant:
+0:107                2 (const int)
+0:109      move second child to first child ( temp 4-component vector of double)
+0:109        d: direct index for structure ( temp 4-component vector of double)
+0:109          indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:109            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:109              'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:109              Constant:
+0:109                0 (const uint)
+0:109            direct index ( temp uint)
+0:109              'dti' ( in 3-component vector of uint)
+0:109              Constant:
+0:109                0 (const int)
+0:109          Constant:
+0:109            3 (const int)
+0:109        subgroupQuadSwapHorizontal ( temp 4-component vector of double)
+0:109          d: direct index for structure ( temp 4-component vector of double)
+0:109            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:109              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:109                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:109                Constant:
+0:109                  0 (const uint)
+0:109              direct index ( temp uint)
+0:109                'dti' ( in 3-component vector of uint)
+0:109                Constant:
+0:109                  0 (const int)
+0:109            Constant:
+0:109              3 (const int)
+0:110      move second child to first child ( temp double)
+0:110        direct index ( temp double)
+0:110          d: direct index for structure ( temp 4-component vector of double)
+0:110            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:110              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:110                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:110                Constant:
+0:110                  0 (const uint)
+0:110              direct index ( temp uint)
+0:110                'dti' ( in 3-component vector of uint)
+0:110                Constant:
+0:110                  0 (const int)
+0:110            Constant:
+0:110              3 (const int)
+0:110          Constant:
+0:110            0 (const int)
+0:110        subgroupQuadSwapHorizontal ( temp double)
+0:110          direct index ( temp double)
+0:110            d: direct index for structure ( temp 4-component vector of double)
+0:110              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:110                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:110                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:110                  Constant:
+0:110                    0 (const uint)
+0:110                direct index ( temp uint)
+0:110                  'dti' ( in 3-component vector of uint)
+0:110                  Constant:
+0:110                    0 (const int)
+0:110              Constant:
+0:110                3 (const int)
+0:110            Constant:
+0:110              0 (const int)
+0:111      move second child to first child ( temp 2-component vector of double)
+0:111        vector swizzle ( temp 2-component vector of double)
+0:111          d: direct index for structure ( temp 4-component vector of double)
+0:111            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:111              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:111                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:111                Constant:
+0:111                  0 (const uint)
+0:111              direct index ( temp uint)
+0:111                'dti' ( in 3-component vector of uint)
+0:111                Constant:
+0:111                  0 (const int)
+0:111            Constant:
+0:111              3 (const int)
+0:111          Sequence
+0:111            Constant:
+0:111              0 (const int)
+0:111            Constant:
+0:111              1 (const int)
+0:111        subgroupQuadSwapHorizontal ( temp 2-component vector of double)
+0:111          vector swizzle ( temp 2-component vector of double)
+0:111            d: direct index for structure ( temp 4-component vector of double)
+0:111              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:111                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:111                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:111                  Constant:
+0:111                    0 (const uint)
+0:111                direct index ( temp uint)
+0:111                  'dti' ( in 3-component vector of uint)
+0:111                  Constant:
+0:111                    0 (const int)
+0:111              Constant:
+0:111                3 (const int)
+0:111            Sequence
+0:111              Constant:
+0:111                0 (const int)
+0:111              Constant:
+0:111                1 (const int)
+0:112      move second child to first child ( temp 3-component vector of double)
+0:112        vector swizzle ( temp 3-component vector of double)
+0:112          d: direct index for structure ( temp 4-component vector of double)
+0:112            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:112              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:112                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:112                Constant:
+0:112                  0 (const uint)
+0:112              direct index ( temp uint)
+0:112                'dti' ( in 3-component vector of uint)
+0:112                Constant:
+0:112                  0 (const int)
+0:112            Constant:
+0:112              3 (const int)
+0:112          Sequence
+0:112            Constant:
+0:112              0 (const int)
+0:112            Constant:
+0:112              1 (const int)
+0:112            Constant:
+0:112              2 (const int)
+0:112        subgroupQuadSwapHorizontal ( temp 3-component vector of double)
+0:112          vector swizzle ( temp 3-component vector of double)
+0:112            d: direct index for structure ( temp 4-component vector of double)
+0:112              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:112                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:112                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:112                  Constant:
+0:112                    0 (const uint)
+0:112                direct index ( temp uint)
+0:112                  'dti' ( in 3-component vector of uint)
+0:112                  Constant:
+0:112                    0 (const int)
+0:112              Constant:
+0:112                3 (const int)
+0:112            Sequence
+0:112              Constant:
+0:112                0 (const int)
+0:112              Constant:
+0:112                1 (const int)
+0:112              Constant:
+0:112                2 (const int)
+0:114      move second child to first child ( temp 4-component vector of uint)
+0:114        u: direct index for structure ( temp 4-component vector of uint)
+0:114          indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:114            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:114              'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:114              Constant:
+0:114                0 (const uint)
+0:114            direct index ( temp uint)
+0:114              'dti' ( in 3-component vector of uint)
+0:114              Constant:
+0:114                0 (const int)
+0:114          Constant:
+0:114            0 (const int)
+0:114        subgroupQuadSwapVertical ( temp 4-component vector of uint)
+0:114          u: direct index for structure ( temp 4-component vector of uint)
+0:114            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:114              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:114                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:114                Constant:
+0:114                  0 (const uint)
+0:114              direct index ( temp uint)
+0:114                'dti' ( in 3-component vector of uint)
+0:114                Constant:
+0:114                  0 (const int)
+0:114            Constant:
+0:114              0 (const int)
+0:115      move second child to first child ( temp uint)
+0:115        direct index ( temp uint)
+0:115          u: direct index for structure ( temp 4-component vector of uint)
+0:115            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:115              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:115                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:115                Constant:
+0:115                  0 (const uint)
+0:115              direct index ( temp uint)
+0:115                'dti' ( in 3-component vector of uint)
+0:115                Constant:
+0:115                  0 (const int)
+0:115            Constant:
+0:115              0 (const int)
+0:115          Constant:
+0:115            0 (const int)
+0:115        subgroupQuadSwapVertical ( temp uint)
+0:115          direct index ( temp uint)
+0:115            u: direct index for structure ( temp 4-component vector of uint)
+0:115              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:115                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:115                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:115                  Constant:
+0:115                    0 (const uint)
+0:115                direct index ( temp uint)
+0:115                  'dti' ( in 3-component vector of uint)
+0:115                  Constant:
+0:115                    0 (const int)
+0:115              Constant:
+0:115                0 (const int)
+0:115            Constant:
+0:115              0 (const int)
+0:116      move second child to first child ( temp 2-component vector of uint)
+0:116        vector swizzle ( temp 2-component vector of uint)
+0:116          u: direct index for structure ( temp 4-component vector of uint)
+0:116            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:116              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:116                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:116                Constant:
+0:116                  0 (const uint)
+0:116              direct index ( temp uint)
+0:116                'dti' ( in 3-component vector of uint)
+0:116                Constant:
+0:116                  0 (const int)
+0:116            Constant:
+0:116              0 (const int)
+0:116          Sequence
+0:116            Constant:
+0:116              0 (const int)
+0:116            Constant:
+0:116              1 (const int)
+0:116        subgroupQuadSwapVertical ( temp 2-component vector of uint)
+0:116          vector swizzle ( temp 2-component vector of uint)
+0:116            u: direct index for structure ( temp 4-component vector of uint)
+0:116              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:116                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:116                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:116                  Constant:
+0:116                    0 (const uint)
+0:116                direct index ( temp uint)
+0:116                  'dti' ( in 3-component vector of uint)
+0:116                  Constant:
+0:116                    0 (const int)
+0:116              Constant:
+0:116                0 (const int)
+0:116            Sequence
+0:116              Constant:
+0:116                0 (const int)
+0:116              Constant:
+0:116                1 (const int)
+0:117      move second child to first child ( temp 3-component vector of uint)
+0:117        vector swizzle ( temp 3-component vector of uint)
+0:117          u: direct index for structure ( temp 4-component vector of uint)
+0:117            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:117              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:117                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:117                Constant:
+0:117                  0 (const uint)
+0:117              direct index ( temp uint)
+0:117                'dti' ( in 3-component vector of uint)
+0:117                Constant:
+0:117                  0 (const int)
+0:117            Constant:
+0:117              0 (const int)
+0:117          Sequence
+0:117            Constant:
+0:117              0 (const int)
+0:117            Constant:
+0:117              1 (const int)
+0:117            Constant:
+0:117              2 (const int)
+0:117        subgroupQuadSwapVertical ( temp 3-component vector of uint)
+0:117          vector swizzle ( temp 3-component vector of uint)
+0:117            u: direct index for structure ( temp 4-component vector of uint)
+0:117              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:117                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:117                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:117                  Constant:
+0:117                    0 (const uint)
+0:117                direct index ( temp uint)
+0:117                  'dti' ( in 3-component vector of uint)
+0:117                  Constant:
+0:117                    0 (const int)
+0:117              Constant:
+0:117                0 (const int)
+0:117            Sequence
+0:117              Constant:
+0:117                0 (const int)
+0:117              Constant:
+0:117                1 (const int)
+0:117              Constant:
+0:117                2 (const int)
+0:119      move second child to first child ( temp 4-component vector of int)
+0:119        i: direct index for structure ( temp 4-component vector of int)
+0:119          indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:119            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:119              'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:119              Constant:
+0:119                0 (const uint)
+0:119            direct index ( temp uint)
+0:119              'dti' ( in 3-component vector of uint)
+0:119              Constant:
+0:119                0 (const int)
+0:119          Constant:
+0:119            1 (const int)
+0:119        subgroupQuadSwapVertical ( temp 4-component vector of int)
+0:119          i: direct index for structure ( temp 4-component vector of int)
+0:119            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:119              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:119                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:119                Constant:
+0:119                  0 (const uint)
+0:119              direct index ( temp uint)
+0:119                'dti' ( in 3-component vector of uint)
+0:119                Constant:
+0:119                  0 (const int)
+0:119            Constant:
+0:119              1 (const int)
+0:120      move second child to first child ( temp int)
+0:120        direct index ( temp int)
+0:120          i: direct index for structure ( temp 4-component vector of int)
+0:120            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:120              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:120                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:120                Constant:
+0:120                  0 (const uint)
+0:120              direct index ( temp uint)
+0:120                'dti' ( in 3-component vector of uint)
+0:120                Constant:
+0:120                  0 (const int)
+0:120            Constant:
+0:120              1 (const int)
+0:120          Constant:
+0:120            0 (const int)
+0:120        subgroupQuadSwapVertical ( temp int)
+0:120          direct index ( temp int)
+0:120            i: direct index for structure ( temp 4-component vector of int)
+0:120              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:120                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:120                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:120                  Constant:
+0:120                    0 (const uint)
+0:120                direct index ( temp uint)
+0:120                  'dti' ( in 3-component vector of uint)
+0:120                  Constant:
+0:120                    0 (const int)
+0:120              Constant:
+0:120                1 (const int)
+0:120            Constant:
+0:120              0 (const int)
+0:121      move second child to first child ( temp 2-component vector of int)
+0:121        vector swizzle ( temp 2-component vector of int)
+0:121          i: direct index for structure ( temp 4-component vector of int)
+0:121            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:121              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:121                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:121                Constant:
+0:121                  0 (const uint)
+0:121              direct index ( temp uint)
+0:121                'dti' ( in 3-component vector of uint)
+0:121                Constant:
+0:121                  0 (const int)
+0:121            Constant:
+0:121              1 (const int)
+0:121          Sequence
+0:121            Constant:
+0:121              0 (const int)
+0:121            Constant:
+0:121              1 (const int)
+0:121        subgroupQuadSwapVertical ( temp 2-component vector of int)
+0:121          vector swizzle ( temp 2-component vector of int)
+0:121            i: direct index for structure ( temp 4-component vector of int)
+0:121              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:121                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:121                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:121                  Constant:
+0:121                    0 (const uint)
+0:121                direct index ( temp uint)
+0:121                  'dti' ( in 3-component vector of uint)
+0:121                  Constant:
+0:121                    0 (const int)
+0:121              Constant:
+0:121                1 (const int)
+0:121            Sequence
+0:121              Constant:
+0:121                0 (const int)
+0:121              Constant:
+0:121                1 (const int)
+0:122      move second child to first child ( temp 3-component vector of int)
+0:122        vector swizzle ( temp 3-component vector of int)
+0:122          i: direct index for structure ( temp 4-component vector of int)
+0:122            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:122              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:122                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:122                Constant:
+0:122                  0 (const uint)
+0:122              direct index ( temp uint)
+0:122                'dti' ( in 3-component vector of uint)
+0:122                Constant:
+0:122                  0 (const int)
+0:122            Constant:
+0:122              1 (const int)
+0:122          Sequence
+0:122            Constant:
+0:122              0 (const int)
+0:122            Constant:
+0:122              1 (const int)
+0:122            Constant:
+0:122              2 (const int)
+0:122        subgroupQuadSwapVertical ( temp 3-component vector of int)
+0:122          vector swizzle ( temp 3-component vector of int)
+0:122            i: direct index for structure ( temp 4-component vector of int)
+0:122              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:122                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:122                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:122                  Constant:
+0:122                    0 (const uint)
+0:122                direct index ( temp uint)
+0:122                  'dti' ( in 3-component vector of uint)
+0:122                  Constant:
+0:122                    0 (const int)
+0:122              Constant:
+0:122                1 (const int)
+0:122            Sequence
+0:122              Constant:
+0:122                0 (const int)
+0:122              Constant:
+0:122                1 (const int)
+0:122              Constant:
+0:122                2 (const int)
+0:124      move second child to first child ( temp 4-component vector of float)
+0:124        f: direct index for structure ( temp 4-component vector of float)
+0:124          indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:124            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:124              'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:124              Constant:
+0:124                0 (const uint)
+0:124            direct index ( temp uint)
+0:124              'dti' ( in 3-component vector of uint)
+0:124              Constant:
+0:124                0 (const int)
+0:124          Constant:
+0:124            2 (const int)
+0:124        subgroupQuadSwapVertical ( temp 4-component vector of float)
+0:124          f: direct index for structure ( temp 4-component vector of float)
+0:124            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:124              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:124                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:124                Constant:
+0:124                  0 (const uint)
+0:124              direct index ( temp uint)
+0:124                'dti' ( in 3-component vector of uint)
+0:124                Constant:
+0:124                  0 (const int)
+0:124            Constant:
+0:124              2 (const int)
+0:125      move second child to first child ( temp float)
+0:125        direct index ( temp float)
+0:125          f: direct index for structure ( temp 4-component vector of float)
+0:125            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:125              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:125                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:125                Constant:
+0:125                  0 (const uint)
+0:125              direct index ( temp uint)
+0:125                'dti' ( in 3-component vector of uint)
+0:125                Constant:
+0:125                  0 (const int)
+0:125            Constant:
+0:125              2 (const int)
+0:125          Constant:
+0:125            0 (const int)
+0:125        subgroupQuadSwapVertical ( temp float)
+0:125          direct index ( temp float)
+0:125            f: direct index for structure ( temp 4-component vector of float)
+0:125              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:125                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:125                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:125                  Constant:
+0:125                    0 (const uint)
+0:125                direct index ( temp uint)
+0:125                  'dti' ( in 3-component vector of uint)
+0:125                  Constant:
+0:125                    0 (const int)
+0:125              Constant:
+0:125                2 (const int)
+0:125            Constant:
+0:125              0 (const int)
+0:126      move second child to first child ( temp 2-component vector of float)
+0:126        vector swizzle ( temp 2-component vector of float)
+0:126          f: direct index for structure ( temp 4-component vector of float)
+0:126            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:126              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:126                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:126                Constant:
+0:126                  0 (const uint)
+0:126              direct index ( temp uint)
+0:126                'dti' ( in 3-component vector of uint)
+0:126                Constant:
+0:126                  0 (const int)
+0:126            Constant:
+0:126              2 (const int)
+0:126          Sequence
+0:126            Constant:
+0:126              0 (const int)
+0:126            Constant:
+0:126              1 (const int)
+0:126        subgroupQuadSwapVertical ( temp 2-component vector of float)
+0:126          vector swizzle ( temp 2-component vector of float)
+0:126            f: direct index for structure ( temp 4-component vector of float)
+0:126              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:126                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:126                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:126                  Constant:
+0:126                    0 (const uint)
+0:126                direct index ( temp uint)
+0:126                  'dti' ( in 3-component vector of uint)
+0:126                  Constant:
+0:126                    0 (const int)
+0:126              Constant:
+0:126                2 (const int)
+0:126            Sequence
+0:126              Constant:
+0:126                0 (const int)
+0:126              Constant:
+0:126                1 (const int)
+0:127      move second child to first child ( temp 3-component vector of float)
+0:127        vector swizzle ( temp 3-component vector of float)
+0:127          f: direct index for structure ( temp 4-component vector of float)
+0:127            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:127              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:127                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:127                Constant:
+0:127                  0 (const uint)
+0:127              direct index ( temp uint)
+0:127                'dti' ( in 3-component vector of uint)
+0:127                Constant:
+0:127                  0 (const int)
+0:127            Constant:
+0:127              2 (const int)
+0:127          Sequence
+0:127            Constant:
+0:127              0 (const int)
+0:127            Constant:
+0:127              1 (const int)
+0:127            Constant:
+0:127              2 (const int)
+0:127        subgroupQuadSwapVertical ( temp 3-component vector of float)
+0:127          vector swizzle ( temp 3-component vector of float)
+0:127            f: direct index for structure ( temp 4-component vector of float)
+0:127              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:127                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:127                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:127                  Constant:
+0:127                    0 (const uint)
+0:127                direct index ( temp uint)
+0:127                  'dti' ( in 3-component vector of uint)
+0:127                  Constant:
+0:127                    0 (const int)
+0:127              Constant:
+0:127                2 (const int)
+0:127            Sequence
+0:127              Constant:
+0:127                0 (const int)
+0:127              Constant:
+0:127                1 (const int)
+0:127              Constant:
+0:127                2 (const int)
+0:129      move second child to first child ( temp 4-component vector of double)
+0:129        d: direct index for structure ( temp 4-component vector of double)
+0:129          indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:129            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:129              'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:129              Constant:
+0:129                0 (const uint)
+0:129            direct index ( temp uint)
+0:129              'dti' ( in 3-component vector of uint)
+0:129              Constant:
+0:129                0 (const int)
+0:129          Constant:
+0:129            3 (const int)
+0:129        subgroupQuadSwapVertical ( temp 4-component vector of double)
+0:129          d: direct index for structure ( temp 4-component vector of double)
+0:129            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:129              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:129                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:129                Constant:
+0:129                  0 (const uint)
+0:129              direct index ( temp uint)
+0:129                'dti' ( in 3-component vector of uint)
+0:129                Constant:
+0:129                  0 (const int)
+0:129            Constant:
+0:129              3 (const int)
+0:130      move second child to first child ( temp double)
+0:130        direct index ( temp double)
+0:130          d: direct index for structure ( temp 4-component vector of double)
+0:130            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:130              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:130                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:130                Constant:
+0:130                  0 (const uint)
+0:130              direct index ( temp uint)
+0:130                'dti' ( in 3-component vector of uint)
+0:130                Constant:
+0:130                  0 (const int)
+0:130            Constant:
+0:130              3 (const int)
+0:130          Constant:
+0:130            0 (const int)
+0:130        subgroupQuadSwapVertical ( temp double)
+0:130          direct index ( temp double)
+0:130            d: direct index for structure ( temp 4-component vector of double)
+0:130              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:130                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:130                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:130                  Constant:
+0:130                    0 (const uint)
+0:130                direct index ( temp uint)
+0:130                  'dti' ( in 3-component vector of uint)
+0:130                  Constant:
+0:130                    0 (const int)
+0:130              Constant:
+0:130                3 (const int)
+0:130            Constant:
+0:130              0 (const int)
+0:131      move second child to first child ( temp 2-component vector of double)
+0:131        vector swizzle ( temp 2-component vector of double)
+0:131          d: direct index for structure ( temp 4-component vector of double)
+0:131            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:131              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:131                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:131                Constant:
+0:131                  0 (const uint)
+0:131              direct index ( temp uint)
+0:131                'dti' ( in 3-component vector of uint)
+0:131                Constant:
+0:131                  0 (const int)
+0:131            Constant:
+0:131              3 (const int)
+0:131          Sequence
+0:131            Constant:
+0:131              0 (const int)
+0:131            Constant:
+0:131              1 (const int)
+0:131        subgroupQuadSwapVertical ( temp 2-component vector of double)
+0:131          vector swizzle ( temp 2-component vector of double)
+0:131            d: direct index for structure ( temp 4-component vector of double)
+0:131              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:131                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:131                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:131                  Constant:
+0:131                    0 (const uint)
+0:131                direct index ( temp uint)
+0:131                  'dti' ( in 3-component vector of uint)
+0:131                  Constant:
+0:131                    0 (const int)
+0:131              Constant:
+0:131                3 (const int)
+0:131            Sequence
+0:131              Constant:
+0:131                0 (const int)
+0:131              Constant:
+0:131                1 (const int)
+0:132      move second child to first child ( temp 3-component vector of double)
+0:132        vector swizzle ( temp 3-component vector of double)
+0:132          d: direct index for structure ( temp 4-component vector of double)
+0:132            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:132              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:132                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:132                Constant:
+0:132                  0 (const uint)
+0:132              direct index ( temp uint)
+0:132                'dti' ( in 3-component vector of uint)
+0:132                Constant:
+0:132                  0 (const int)
+0:132            Constant:
+0:132              3 (const int)
+0:132          Sequence
+0:132            Constant:
+0:132              0 (const int)
+0:132            Constant:
+0:132              1 (const int)
+0:132            Constant:
+0:132              2 (const int)
+0:132        subgroupQuadSwapVertical ( temp 3-component vector of double)
+0:132          vector swizzle ( temp 3-component vector of double)
+0:132            d: direct index for structure ( temp 4-component vector of double)
+0:132              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:132                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:132                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:132                  Constant:
+0:132                    0 (const uint)
+0:132                direct index ( temp uint)
+0:132                  'dti' ( in 3-component vector of uint)
+0:132                  Constant:
+0:132                    0 (const int)
+0:132              Constant:
+0:132                3 (const int)
+0:132            Sequence
+0:132              Constant:
+0:132                0 (const int)
+0:132              Constant:
+0:132                1 (const int)
+0:132              Constant:
+0:132                2 (const int)
+0:134      move second child to first child ( temp 4-component vector of uint)
+0:134        u: direct index for structure ( temp 4-component vector of uint)
+0:134          indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:134            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:134              'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:134              Constant:
+0:134                0 (const uint)
+0:134            direct index ( temp uint)
+0:134              'dti' ( in 3-component vector of uint)
+0:134              Constant:
+0:134                0 (const int)
+0:134          Constant:
+0:134            0 (const int)
+0:134        subgroupQuadSwapDiagonal ( temp 4-component vector of uint)
+0:134          u: direct index for structure ( temp 4-component vector of uint)
+0:134            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:134              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:134                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:134                Constant:
+0:134                  0 (const uint)
+0:134              direct index ( temp uint)
+0:134                'dti' ( in 3-component vector of uint)
+0:134                Constant:
+0:134                  0 (const int)
+0:134            Constant:
+0:134              0 (const int)
+0:135      move second child to first child ( temp uint)
+0:135        direct index ( temp uint)
+0:135          u: direct index for structure ( temp 4-component vector of uint)
+0:135            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:135              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:135                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:135                Constant:
+0:135                  0 (const uint)
+0:135              direct index ( temp uint)
+0:135                'dti' ( in 3-component vector of uint)
+0:135                Constant:
+0:135                  0 (const int)
+0:135            Constant:
+0:135              0 (const int)
+0:135          Constant:
+0:135            0 (const int)
+0:135        subgroupQuadSwapDiagonal ( temp uint)
+0:135          direct index ( temp uint)
+0:135            u: direct index for structure ( temp 4-component vector of uint)
+0:135              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:135                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:135                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:135                  Constant:
+0:135                    0 (const uint)
+0:135                direct index ( temp uint)
+0:135                  'dti' ( in 3-component vector of uint)
+0:135                  Constant:
+0:135                    0 (const int)
+0:135              Constant:
+0:135                0 (const int)
+0:135            Constant:
+0:135              0 (const int)
+0:136      move second child to first child ( temp 2-component vector of uint)
+0:136        vector swizzle ( temp 2-component vector of uint)
+0:136          u: direct index for structure ( temp 4-component vector of uint)
+0:136            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:136              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:136                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:136                Constant:
+0:136                  0 (const uint)
+0:136              direct index ( temp uint)
+0:136                'dti' ( in 3-component vector of uint)
+0:136                Constant:
+0:136                  0 (const int)
+0:136            Constant:
+0:136              0 (const int)
+0:136          Sequence
+0:136            Constant:
+0:136              0 (const int)
+0:136            Constant:
+0:136              1 (const int)
+0:136        subgroupQuadSwapDiagonal ( temp 2-component vector of uint)
+0:136          vector swizzle ( temp 2-component vector of uint)
+0:136            u: direct index for structure ( temp 4-component vector of uint)
+0:136              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:136                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:136                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:136                  Constant:
+0:136                    0 (const uint)
+0:136                direct index ( temp uint)
+0:136                  'dti' ( in 3-component vector of uint)
+0:136                  Constant:
+0:136                    0 (const int)
+0:136              Constant:
+0:136                0 (const int)
+0:136            Sequence
+0:136              Constant:
+0:136                0 (const int)
+0:136              Constant:
+0:136                1 (const int)
+0:137      move second child to first child ( temp 3-component vector of uint)
+0:137        vector swizzle ( temp 3-component vector of uint)
+0:137          u: direct index for structure ( temp 4-component vector of uint)
+0:137            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:137              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:137                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:137                Constant:
+0:137                  0 (const uint)
+0:137              direct index ( temp uint)
+0:137                'dti' ( in 3-component vector of uint)
+0:137                Constant:
+0:137                  0 (const int)
+0:137            Constant:
+0:137              0 (const int)
+0:137          Sequence
+0:137            Constant:
+0:137              0 (const int)
+0:137            Constant:
+0:137              1 (const int)
+0:137            Constant:
+0:137              2 (const int)
+0:137        subgroupQuadSwapDiagonal ( temp 3-component vector of uint)
+0:137          vector swizzle ( temp 3-component vector of uint)
+0:137            u: direct index for structure ( temp 4-component vector of uint)
+0:137              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:137                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:137                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:137                  Constant:
+0:137                    0 (const uint)
+0:137                direct index ( temp uint)
+0:137                  'dti' ( in 3-component vector of uint)
+0:137                  Constant:
+0:137                    0 (const int)
+0:137              Constant:
+0:137                0 (const int)
+0:137            Sequence
+0:137              Constant:
+0:137                0 (const int)
+0:137              Constant:
+0:137                1 (const int)
+0:137              Constant:
+0:137                2 (const int)
+0:139      move second child to first child ( temp 4-component vector of int)
+0:139        i: direct index for structure ( temp 4-component vector of int)
+0:139          indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:139            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:139              'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:139              Constant:
+0:139                0 (const uint)
+0:139            direct index ( temp uint)
+0:139              'dti' ( in 3-component vector of uint)
+0:139              Constant:
+0:139                0 (const int)
+0:139          Constant:
+0:139            1 (const int)
+0:139        subgroupQuadSwapDiagonal ( temp 4-component vector of int)
+0:139          i: direct index for structure ( temp 4-component vector of int)
+0:139            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:139              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:139                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:139                Constant:
+0:139                  0 (const uint)
+0:139              direct index ( temp uint)
+0:139                'dti' ( in 3-component vector of uint)
+0:139                Constant:
+0:139                  0 (const int)
+0:139            Constant:
+0:139              1 (const int)
+0:140      move second child to first child ( temp int)
+0:140        direct index ( temp int)
+0:140          i: direct index for structure ( temp 4-component vector of int)
+0:140            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:140              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:140                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:140                Constant:
+0:140                  0 (const uint)
+0:140              direct index ( temp uint)
+0:140                'dti' ( in 3-component vector of uint)
+0:140                Constant:
+0:140                  0 (const int)
+0:140            Constant:
+0:140              1 (const int)
+0:140          Constant:
+0:140            0 (const int)
+0:140        subgroupQuadSwapDiagonal ( temp int)
+0:140          direct index ( temp int)
+0:140            i: direct index for structure ( temp 4-component vector of int)
+0:140              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:140                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:140                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:140                  Constant:
+0:140                    0 (const uint)
+0:140                direct index ( temp uint)
+0:140                  'dti' ( in 3-component vector of uint)
+0:140                  Constant:
+0:140                    0 (const int)
+0:140              Constant:
+0:140                1 (const int)
+0:140            Constant:
+0:140              0 (const int)
+0:141      move second child to first child ( temp 2-component vector of int)
+0:141        vector swizzle ( temp 2-component vector of int)
+0:141          i: direct index for structure ( temp 4-component vector of int)
+0:141            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:141              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:141                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:141                Constant:
+0:141                  0 (const uint)
+0:141              direct index ( temp uint)
+0:141                'dti' ( in 3-component vector of uint)
+0:141                Constant:
+0:141                  0 (const int)
+0:141            Constant:
+0:141              1 (const int)
+0:141          Sequence
+0:141            Constant:
+0:141              0 (const int)
+0:141            Constant:
+0:141              1 (const int)
+0:141        subgroupQuadSwapDiagonal ( temp 2-component vector of int)
+0:141          vector swizzle ( temp 2-component vector of int)
+0:141            i: direct index for structure ( temp 4-component vector of int)
+0:141              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:141                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:141                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:141                  Constant:
+0:141                    0 (const uint)
+0:141                direct index ( temp uint)
+0:141                  'dti' ( in 3-component vector of uint)
+0:141                  Constant:
+0:141                    0 (const int)
+0:141              Constant:
+0:141                1 (const int)
+0:141            Sequence
+0:141              Constant:
+0:141                0 (const int)
+0:141              Constant:
+0:141                1 (const int)
+0:142      move second child to first child ( temp 3-component vector of int)
+0:142        vector swizzle ( temp 3-component vector of int)
+0:142          i: direct index for structure ( temp 4-component vector of int)
+0:142            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:142              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:142                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:142                Constant:
+0:142                  0 (const uint)
+0:142              direct index ( temp uint)
+0:142                'dti' ( in 3-component vector of uint)
+0:142                Constant:
+0:142                  0 (const int)
+0:142            Constant:
+0:142              1 (const int)
+0:142          Sequence
+0:142            Constant:
+0:142              0 (const int)
+0:142            Constant:
+0:142              1 (const int)
+0:142            Constant:
+0:142              2 (const int)
+0:142        subgroupQuadSwapDiagonal ( temp 3-component vector of int)
+0:142          vector swizzle ( temp 3-component vector of int)
+0:142            i: direct index for structure ( temp 4-component vector of int)
+0:142              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:142                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:142                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:142                  Constant:
+0:142                    0 (const uint)
+0:142                direct index ( temp uint)
+0:142                  'dti' ( in 3-component vector of uint)
+0:142                  Constant:
+0:142                    0 (const int)
+0:142              Constant:
+0:142                1 (const int)
+0:142            Sequence
+0:142              Constant:
+0:142                0 (const int)
+0:142              Constant:
+0:142                1 (const int)
+0:142              Constant:
+0:142                2 (const int)
+0:144      move second child to first child ( temp 4-component vector of float)
+0:144        f: direct index for structure ( temp 4-component vector of float)
+0:144          indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:144            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:144              'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:144              Constant:
+0:144                0 (const uint)
+0:144            direct index ( temp uint)
+0:144              'dti' ( in 3-component vector of uint)
+0:144              Constant:
+0:144                0 (const int)
+0:144          Constant:
+0:144            2 (const int)
+0:144        subgroupQuadSwapDiagonal ( temp 4-component vector of float)
+0:144          f: direct index for structure ( temp 4-component vector of float)
+0:144            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:144              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:144                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:144                Constant:
+0:144                  0 (const uint)
+0:144              direct index ( temp uint)
+0:144                'dti' ( in 3-component vector of uint)
+0:144                Constant:
+0:144                  0 (const int)
+0:144            Constant:
+0:144              2 (const int)
+0:145      move second child to first child ( temp float)
+0:145        direct index ( temp float)
+0:145          f: direct index for structure ( temp 4-component vector of float)
+0:145            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:145              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:145                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:145                Constant:
+0:145                  0 (const uint)
+0:145              direct index ( temp uint)
+0:145                'dti' ( in 3-component vector of uint)
+0:145                Constant:
+0:145                  0 (const int)
+0:145            Constant:
+0:145              2 (const int)
+0:145          Constant:
+0:145            0 (const int)
+0:145        subgroupQuadSwapDiagonal ( temp float)
+0:145          direct index ( temp float)
+0:145            f: direct index for structure ( temp 4-component vector of float)
+0:145              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:145                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:145                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:145                  Constant:
+0:145                    0 (const uint)
+0:145                direct index ( temp uint)
+0:145                  'dti' ( in 3-component vector of uint)
+0:145                  Constant:
+0:145                    0 (const int)
+0:145              Constant:
+0:145                2 (const int)
+0:145            Constant:
+0:145              0 (const int)
+0:146      move second child to first child ( temp 2-component vector of float)
+0:146        vector swizzle ( temp 2-component vector of float)
+0:146          f: direct index for structure ( temp 4-component vector of float)
+0:146            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:146              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:146                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:146                Constant:
+0:146                  0 (const uint)
+0:146              direct index ( temp uint)
+0:146                'dti' ( in 3-component vector of uint)
+0:146                Constant:
+0:146                  0 (const int)
+0:146            Constant:
+0:146              2 (const int)
+0:146          Sequence
+0:146            Constant:
+0:146              0 (const int)
+0:146            Constant:
+0:146              1 (const int)
+0:146        subgroupQuadSwapDiagonal ( temp 2-component vector of float)
+0:146          vector swizzle ( temp 2-component vector of float)
+0:146            f: direct index for structure ( temp 4-component vector of float)
+0:146              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:146                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:146                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:146                  Constant:
+0:146                    0 (const uint)
+0:146                direct index ( temp uint)
+0:146                  'dti' ( in 3-component vector of uint)
+0:146                  Constant:
+0:146                    0 (const int)
+0:146              Constant:
+0:146                2 (const int)
+0:146            Sequence
+0:146              Constant:
+0:146                0 (const int)
+0:146              Constant:
+0:146                1 (const int)
+0:147      move second child to first child ( temp 3-component vector of float)
+0:147        vector swizzle ( temp 3-component vector of float)
+0:147          f: direct index for structure ( temp 4-component vector of float)
+0:147            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:147              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:147                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:147                Constant:
+0:147                  0 (const uint)
+0:147              direct index ( temp uint)
+0:147                'dti' ( in 3-component vector of uint)
+0:147                Constant:
+0:147                  0 (const int)
+0:147            Constant:
+0:147              2 (const int)
+0:147          Sequence
+0:147            Constant:
+0:147              0 (const int)
+0:147            Constant:
+0:147              1 (const int)
+0:147            Constant:
+0:147              2 (const int)
+0:147        subgroupQuadSwapDiagonal ( temp 3-component vector of float)
+0:147          vector swizzle ( temp 3-component vector of float)
+0:147            f: direct index for structure ( temp 4-component vector of float)
+0:147              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:147                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:147                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:147                  Constant:
+0:147                    0 (const uint)
+0:147                direct index ( temp uint)
+0:147                  'dti' ( in 3-component vector of uint)
+0:147                  Constant:
+0:147                    0 (const int)
+0:147              Constant:
+0:147                2 (const int)
+0:147            Sequence
+0:147              Constant:
+0:147                0 (const int)
+0:147              Constant:
+0:147                1 (const int)
+0:147              Constant:
+0:147                2 (const int)
+0:149      move second child to first child ( temp 4-component vector of double)
+0:149        d: direct index for structure ( temp 4-component vector of double)
+0:149          indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:149            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:149              'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:149              Constant:
+0:149                0 (const uint)
+0:149            direct index ( temp uint)
+0:149              'dti' ( in 3-component vector of uint)
+0:149              Constant:
+0:149                0 (const int)
+0:149          Constant:
+0:149            3 (const int)
+0:149        subgroupQuadSwapDiagonal ( temp 4-component vector of double)
+0:149          d: direct index for structure ( temp 4-component vector of double)
+0:149            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:149              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:149                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:149                Constant:
+0:149                  0 (const uint)
+0:149              direct index ( temp uint)
+0:149                'dti' ( in 3-component vector of uint)
+0:149                Constant:
+0:149                  0 (const int)
+0:149            Constant:
+0:149              3 (const int)
+0:150      move second child to first child ( temp double)
+0:150        direct index ( temp double)
+0:150          d: direct index for structure ( temp 4-component vector of double)
+0:150            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:150              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:150                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:150                Constant:
+0:150                  0 (const uint)
+0:150              direct index ( temp uint)
+0:150                'dti' ( in 3-component vector of uint)
+0:150                Constant:
+0:150                  0 (const int)
+0:150            Constant:
+0:150              3 (const int)
+0:150          Constant:
+0:150            0 (const int)
+0:150        subgroupQuadSwapDiagonal ( temp double)
+0:150          direct index ( temp double)
+0:150            d: direct index for structure ( temp 4-component vector of double)
+0:150              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:150                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:150                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:150                  Constant:
+0:150                    0 (const uint)
+0:150                direct index ( temp uint)
+0:150                  'dti' ( in 3-component vector of uint)
+0:150                  Constant:
+0:150                    0 (const int)
+0:150              Constant:
+0:150                3 (const int)
+0:150            Constant:
+0:150              0 (const int)
+0:151      move second child to first child ( temp 2-component vector of double)
+0:151        vector swizzle ( temp 2-component vector of double)
+0:151          d: direct index for structure ( temp 4-component vector of double)
+0:151            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:151              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:151                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:151                Constant:
+0:151                  0 (const uint)
+0:151              direct index ( temp uint)
+0:151                'dti' ( in 3-component vector of uint)
+0:151                Constant:
+0:151                  0 (const int)
+0:151            Constant:
+0:151              3 (const int)
+0:151          Sequence
+0:151            Constant:
+0:151              0 (const int)
+0:151            Constant:
+0:151              1 (const int)
+0:151        subgroupQuadSwapDiagonal ( temp 2-component vector of double)
+0:151          vector swizzle ( temp 2-component vector of double)
+0:151            d: direct index for structure ( temp 4-component vector of double)
+0:151              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:151                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:151                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:151                  Constant:
+0:151                    0 (const uint)
+0:151                direct index ( temp uint)
+0:151                  'dti' ( in 3-component vector of uint)
+0:151                  Constant:
+0:151                    0 (const int)
+0:151              Constant:
+0:151                3 (const int)
+0:151            Sequence
+0:151              Constant:
+0:151                0 (const int)
+0:151              Constant:
+0:151                1 (const int)
+0:152      move second child to first child ( temp 3-component vector of double)
+0:152        vector swizzle ( temp 3-component vector of double)
+0:152          d: direct index for structure ( temp 4-component vector of double)
+0:152            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:152              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:152                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:152                Constant:
+0:152                  0 (const uint)
+0:152              direct index ( temp uint)
+0:152                'dti' ( in 3-component vector of uint)
+0:152                Constant:
+0:152                  0 (const int)
+0:152            Constant:
+0:152              3 (const int)
+0:152          Sequence
+0:152            Constant:
+0:152              0 (const int)
+0:152            Constant:
+0:152              1 (const int)
+0:152            Constant:
+0:152              2 (const int)
+0:152        subgroupQuadSwapDiagonal ( temp 3-component vector of double)
+0:152          vector swizzle ( temp 3-component vector of double)
+0:152            d: direct index for structure ( temp 4-component vector of double)
+0:152              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:152                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:152                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:152                  Constant:
+0:152                    0 (const uint)
+0:152                direct index ( temp uint)
+0:152                  'dti' ( in 3-component vector of uint)
+0:152                  Constant:
+0:152                    0 (const int)
+0:152              Constant:
+0:152                3 (const int)
+0:152            Sequence
+0:152              Constant:
+0:152                0 (const int)
+0:152              Constant:
+0:152                1 (const int)
+0:152              Constant:
+0:152                2 (const int)
+0:13  Function Definition: CSMain( ( temp void)
+0:13    Function Parameters: 
+0:?     Sequence
+0:13      move second child to first child ( temp 3-component vector of uint)
+0:?         'dti' ( temp 3-component vector of uint)
+0:?         'dti' ( in 3-component vector of uint GlobalInvocationID)
+0:13      Function Call: @CSMain(vu3; ( temp void)
+0:?         'dti' ( temp 3-component vector of uint)
+0:?   Linker Objects
+0:?     'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:?     'dti' ( in 3-component vector of uint GlobalInvocationID)
+
+// Module Version 10300
+// Generated by (magic number): 80007
+// Id's are bound by 1120
+
+                              Capability Shader
+                              Capability Float64
+                              Capability GroupNonUniform
+                              Capability GroupNonUniformQuad
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint GLCompute 4  "CSMain" 1115
+                              ExecutionMode 4 LocalSize 32 16 1
+                              Source HLSL 500
+                              Name 4  "CSMain"
+                              Name 11  "@CSMain(vu3;"
+                              Name 10  "dti"
+                              Name 20  "Types"
+                              MemberName 20(Types) 0  "u"
+                              MemberName 20(Types) 1  "i"
+                              MemberName 20(Types) 2  "f"
+                              MemberName 20(Types) 3  "d"
+                              Name 22  "data"
+                              MemberName 22(data) 0  "@data"
+                              Name 24  "data"
+                              Name 1113  "dti"
+                              Name 1115  "dti"
+                              Name 1117  "param"
+                              MemberDecorate 20(Types) 0 Offset 0
+                              MemberDecorate 20(Types) 1 Offset 16
+                              MemberDecorate 20(Types) 2 Offset 32
+                              MemberDecorate 20(Types) 3 Offset 64
+                              Decorate 21 ArrayStride 96
+                              MemberDecorate 22(data) 0 Offset 0
+                              Decorate 22(data) BufferBlock
+                              Decorate 24(data) DescriptorSet 0
+                              Decorate 1115(dti) BuiltIn GlobalInvocationId
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeInt 32 0
+               7:             TypeVector 6(int) 3
+               8:             TypePointer Function 7(ivec3)
+               9:             TypeFunction 2 8(ptr)
+              13:             TypeVector 6(int) 4
+              14:             TypeInt 32 1
+              15:             TypeVector 14(int) 4
+              16:             TypeFloat 32
+              17:             TypeVector 16(float) 4
+              18:             TypeFloat 64
+              19:             TypeVector 18(float64_t) 4
+       20(Types):             TypeStruct 13(ivec4) 15(ivec4) 17(fvec4) 19(f64vec4)
+              21:             TypeRuntimeArray 20(Types)
+        22(data):             TypeStruct 21
+              23:             TypePointer Uniform 22(data)
+        24(data):     23(ptr) Variable Uniform
+              25:     14(int) Constant 0
+              26:      6(int) Constant 0
+              27:             TypePointer Function 6(int)
+              32:             TypePointer Uniform 13(ivec4)
+              35:      6(int) Constant 3
+              42:             TypePointer Uniform 6(int)
+              51:             TypeVector 6(int) 2
+              72:     14(int) Constant 1
+              75:             TypePointer Uniform 15(ivec4)
+              84:             TypePointer Uniform 14(int)
+              93:             TypeVector 14(int) 2
+             105:             TypeVector 14(int) 3
+             115:     14(int) Constant 2
+             118:             TypePointer Uniform 17(fvec4)
+             127:             TypePointer Uniform 16(float)
+             136:             TypeVector 16(float) 2
+             148:             TypeVector 16(float) 3
+             158:     14(int) Constant 3
+             161:             TypePointer Uniform 19(f64vec4)
+             170:             TypePointer Uniform 18(float64_t)
+             179:             TypeVector 18(float64_t) 2
+             191:             TypeVector 18(float64_t) 3
+             205:      6(int) Constant 1
+             358:      6(int) Constant 2
+            1114:             TypePointer Input 7(ivec3)
+       1115(dti):   1114(ptr) Variable Input
+       4(CSMain):           2 Function None 3
+               5:             Label
+       1113(dti):      8(ptr) Variable Function
+     1117(param):      8(ptr) Variable Function
+            1116:    7(ivec3) Load 1115(dti)
+                              Store 1113(dti) 1116
+            1118:    7(ivec3) Load 1113(dti)
+                              Store 1117(param) 1118
+            1119:           2 FunctionCall 11(@CSMain(vu3;) 1117(param)
+                              Return
+                              FunctionEnd
+11(@CSMain(vu3;):           2 Function None 9
+         10(dti):      8(ptr) FunctionParameter
+              12:             Label
+              28:     27(ptr) AccessChain 10(dti) 26
+              29:      6(int) Load 28
+              30:     27(ptr) AccessChain 10(dti) 26
+              31:      6(int) Load 30
+              33:     32(ptr) AccessChain 24(data) 25 31 25
+              34:   13(ivec4) Load 33
+              36:   13(ivec4) GroupNonUniformQuadBroadcast 35 34 26
+              37:     32(ptr) AccessChain 24(data) 25 29 25
+                              Store 37 36
+              38:     27(ptr) AccessChain 10(dti) 26
+              39:      6(int) Load 38
+              40:     27(ptr) AccessChain 10(dti) 26
+              41:      6(int) Load 40
+              43:     42(ptr) AccessChain 24(data) 25 41 25 26
+              44:      6(int) Load 43
+              45:      6(int) GroupNonUniformQuadBroadcast 35 44 26
+              46:     42(ptr) AccessChain 24(data) 25 39 25 26
+                              Store 46 45
+              47:     27(ptr) AccessChain 10(dti) 26
+              48:      6(int) Load 47
+              49:     27(ptr) AccessChain 10(dti) 26
+              50:      6(int) Load 49
+              52:     32(ptr) AccessChain 24(data) 25 50 25
+              53:   13(ivec4) Load 52
+              54:   51(ivec2) VectorShuffle 53 53 0 1
+              55:   51(ivec2) GroupNonUniformQuadBroadcast 35 54 26
+              56:     32(ptr) AccessChain 24(data) 25 48 25
+              57:   13(ivec4) Load 56
+              58:   13(ivec4) VectorShuffle 57 55 4 5 2 3
+                              Store 56 58
+              59:     27(ptr) AccessChain 10(dti) 26
+              60:      6(int) Load 59
+              61:     27(ptr) AccessChain 10(dti) 26
+              62:      6(int) Load 61
+              63:     32(ptr) AccessChain 24(data) 25 62 25
+              64:   13(ivec4) Load 63
+              65:    7(ivec3) VectorShuffle 64 64 0 1 2
+              66:    7(ivec3) GroupNonUniformQuadBroadcast 35 65 26
+              67:     32(ptr) AccessChain 24(data) 25 60 25
+              68:   13(ivec4) Load 67
+              69:   13(ivec4) VectorShuffle 68 66 4 5 6 3
+                              Store 67 69
+              70:     27(ptr) AccessChain 10(dti) 26
+              71:      6(int) Load 70
+              73:     27(ptr) AccessChain 10(dti) 26
+              74:      6(int) Load 73
+              76:     75(ptr) AccessChain 24(data) 25 74 72
+              77:   15(ivec4) Load 76
+              78:   15(ivec4) GroupNonUniformQuadBroadcast 35 77 26
+              79:     75(ptr) AccessChain 24(data) 25 71 72
+                              Store 79 78
+              80:     27(ptr) AccessChain 10(dti) 26
+              81:      6(int) Load 80
+              82:     27(ptr) AccessChain 10(dti) 26
+              83:      6(int) Load 82
+              85:     84(ptr) AccessChain 24(data) 25 83 72 26
+              86:     14(int) Load 85
+              87:     14(int) GroupNonUniformQuadBroadcast 35 86 26
+              88:     84(ptr) AccessChain 24(data) 25 81 72 26
+                              Store 88 87
+              89:     27(ptr) AccessChain 10(dti) 26
+              90:      6(int) Load 89
+              91:     27(ptr) AccessChain 10(dti) 26
+              92:      6(int) Load 91
+              94:     75(ptr) AccessChain 24(data) 25 92 72
+              95:   15(ivec4) Load 94
+              96:   93(ivec2) VectorShuffle 95 95 0 1
+              97:   93(ivec2) GroupNonUniformQuadBroadcast 35 96 26
+              98:     75(ptr) AccessChain 24(data) 25 90 72
+              99:   15(ivec4) Load 98
+             100:   15(ivec4) VectorShuffle 99 97 4 5 2 3
+                              Store 98 100
+             101:     27(ptr) AccessChain 10(dti) 26
+             102:      6(int) Load 101
+             103:     27(ptr) AccessChain 10(dti) 26
+             104:      6(int) Load 103
+             106:     75(ptr) AccessChain 24(data) 25 104 72
+             107:   15(ivec4) Load 106
+             108:  105(ivec3) VectorShuffle 107 107 0 1 2
+             109:  105(ivec3) GroupNonUniformQuadBroadcast 35 108 26
+             110:     75(ptr) AccessChain 24(data) 25 102 72
+             111:   15(ivec4) Load 110
+             112:   15(ivec4) VectorShuffle 111 109 4 5 6 3
+                              Store 110 112
+             113:     27(ptr) AccessChain 10(dti) 26
+             114:      6(int) Load 113
+             116:     27(ptr) AccessChain 10(dti) 26
+             117:      6(int) Load 116
+             119:    118(ptr) AccessChain 24(data) 25 117 115
+             120:   17(fvec4) Load 119
+             121:   17(fvec4) GroupNonUniformQuadBroadcast 35 120 26
+             122:    118(ptr) AccessChain 24(data) 25 114 115
+                              Store 122 121
+             123:     27(ptr) AccessChain 10(dti) 26
+             124:      6(int) Load 123
+             125:     27(ptr) AccessChain 10(dti) 26
+             126:      6(int) Load 125
+             128:    127(ptr) AccessChain 24(data) 25 126 115 26
+             129:   16(float) Load 128
+             130:   16(float) GroupNonUniformQuadBroadcast 35 129 26
+             131:    127(ptr) AccessChain 24(data) 25 124 115 26
+                              Store 131 130
+             132:     27(ptr) AccessChain 10(dti) 26
+             133:      6(int) Load 132
+             134:     27(ptr) AccessChain 10(dti) 26
+             135:      6(int) Load 134
+             137:    118(ptr) AccessChain 24(data) 25 135 115
+             138:   17(fvec4) Load 137
+             139:  136(fvec2) VectorShuffle 138 138 0 1
+             140:  136(fvec2) GroupNonUniformQuadBroadcast 35 139 26
+             141:    118(ptr) AccessChain 24(data) 25 133 115
+             142:   17(fvec4) Load 141
+             143:   17(fvec4) VectorShuffle 142 140 4 5 2 3
+                              Store 141 143
+             144:     27(ptr) AccessChain 10(dti) 26
+             145:      6(int) Load 144
+             146:     27(ptr) AccessChain 10(dti) 26
+             147:      6(int) Load 146
+             149:    118(ptr) AccessChain 24(data) 25 147 115
+             150:   17(fvec4) Load 149
+             151:  148(fvec3) VectorShuffle 150 150 0 1 2
+             152:  148(fvec3) GroupNonUniformQuadBroadcast 35 151 26
+             153:    118(ptr) AccessChain 24(data) 25 145 115
+             154:   17(fvec4) Load 153
+             155:   17(fvec4) VectorShuffle 154 152 4 5 6 3
+                              Store 153 155
+             156:     27(ptr) AccessChain 10(dti) 26
+             157:      6(int) Load 156
+             159:     27(ptr) AccessChain 10(dti) 26
+             160:      6(int) Load 159
+             162:    161(ptr) AccessChain 24(data) 25 160 158
+             163: 19(f64vec4) Load 162
+             164: 19(f64vec4) GroupNonUniformQuadBroadcast 35 163 26
+             165:    161(ptr) AccessChain 24(data) 25 157 158
+                              Store 165 164
+             166:     27(ptr) AccessChain 10(dti) 26
+             167:      6(int) Load 166
+             168:     27(ptr) AccessChain 10(dti) 26
+             169:      6(int) Load 168
+             171:    170(ptr) AccessChain 24(data) 25 169 158 26
+             172:18(float64_t) Load 171
+             173:18(float64_t) GroupNonUniformQuadBroadcast 35 172 26
+             174:    170(ptr) AccessChain 24(data) 25 167 158 26
+                              Store 174 173
+             175:     27(ptr) AccessChain 10(dti) 26
+             176:      6(int) Load 175
+             177:     27(ptr) AccessChain 10(dti) 26
+             178:      6(int) Load 177
+             180:    161(ptr) AccessChain 24(data) 25 178 158
+             181: 19(f64vec4) Load 180
+             182:179(f64vec2) VectorShuffle 181 181 0 1
+             183:179(f64vec2) GroupNonUniformQuadBroadcast 35 182 26
+             184:    161(ptr) AccessChain 24(data) 25 176 158
+             185: 19(f64vec4) Load 184
+             186: 19(f64vec4) VectorShuffle 185 183 4 5 2 3
+                              Store 184 186
+             187:     27(ptr) AccessChain 10(dti) 26
+             188:      6(int) Load 187
+             189:     27(ptr) AccessChain 10(dti) 26
+             190:      6(int) Load 189
+             192:    161(ptr) AccessChain 24(data) 25 190 158
+             193: 19(f64vec4) Load 192
+             194:191(f64vec3) VectorShuffle 193 193 0 1 2
+             195:191(f64vec3) GroupNonUniformQuadBroadcast 35 194 26
+             196:    161(ptr) AccessChain 24(data) 25 188 158
+             197: 19(f64vec4) Load 196
+             198: 19(f64vec4) VectorShuffle 197 195 4 5 6 3
+                              Store 196 198
+             199:     27(ptr) AccessChain 10(dti) 26
+             200:      6(int) Load 199
+             201:     27(ptr) AccessChain 10(dti) 26
+             202:      6(int) Load 201
+             203:     32(ptr) AccessChain 24(data) 25 202 25
+             204:   13(ivec4) Load 203
+             206:   13(ivec4) GroupNonUniformQuadBroadcast 35 204 205
+             207:     32(ptr) AccessChain 24(data) 25 200 25
+                              Store 207 206
+             208:     27(ptr) AccessChain 10(dti) 26
+             209:      6(int) Load 208
+             210:     27(ptr) AccessChain 10(dti) 26
+             211:      6(int) Load 210
+             212:     42(ptr) AccessChain 24(data) 25 211 25 26
+             213:      6(int) Load 212
+             214:      6(int) GroupNonUniformQuadBroadcast 35 213 205
+             215:     42(ptr) AccessChain 24(data) 25 209 25 26
+                              Store 215 214
+             216:     27(ptr) AccessChain 10(dti) 26
+             217:      6(int) Load 216
+             218:     27(ptr) AccessChain 10(dti) 26
+             219:      6(int) Load 218
+             220:     32(ptr) AccessChain 24(data) 25 219 25
+             221:   13(ivec4) Load 220
+             222:   51(ivec2) VectorShuffle 221 221 0 1
+             223:   51(ivec2) GroupNonUniformQuadBroadcast 35 222 205
+             224:     32(ptr) AccessChain 24(data) 25 217 25
+             225:   13(ivec4) Load 224
+             226:   13(ivec4) VectorShuffle 225 223 4 5 2 3
+                              Store 224 226
+             227:     27(ptr) AccessChain 10(dti) 26
+             228:      6(int) Load 227
+             229:     27(ptr) AccessChain 10(dti) 26
+             230:      6(int) Load 229
+             231:     32(ptr) AccessChain 24(data) 25 230 25
+             232:   13(ivec4) Load 231
+             233:    7(ivec3) VectorShuffle 232 232 0 1 2
+             234:    7(ivec3) GroupNonUniformQuadBroadcast 35 233 205
+             235:     32(ptr) AccessChain 24(data) 25 228 25
+             236:   13(ivec4) Load 235
+             237:   13(ivec4) VectorShuffle 236 234 4 5 6 3
+                              Store 235 237
+             238:     27(ptr) AccessChain 10(dti) 26
+             239:      6(int) Load 238
+             240:     27(ptr) AccessChain 10(dti) 26
+             241:      6(int) Load 240
+             242:     75(ptr) AccessChain 24(data) 25 241 72
+             243:   15(ivec4) Load 242
+             244:   15(ivec4) GroupNonUniformQuadBroadcast 35 243 205
+             245:     75(ptr) AccessChain 24(data) 25 239 72
+                              Store 245 244
+             246:     27(ptr) AccessChain 10(dti) 26
+             247:      6(int) Load 246
+             248:     27(ptr) AccessChain 10(dti) 26
+             249:      6(int) Load 248
+             250:     84(ptr) AccessChain 24(data) 25 249 72 26
+             251:     14(int) Load 250
+             252:     14(int) GroupNonUniformQuadBroadcast 35 251 205
+             253:     84(ptr) AccessChain 24(data) 25 247 72 26
+                              Store 253 252
+             254:     27(ptr) AccessChain 10(dti) 26
+             255:      6(int) Load 254
+             256:     27(ptr) AccessChain 10(dti) 26
+             257:      6(int) Load 256
+             258:     75(ptr) AccessChain 24(data) 25 257 72
+             259:   15(ivec4) Load 258
+             260:   93(ivec2) VectorShuffle 259 259 0 1
+             261:   93(ivec2) GroupNonUniformQuadBroadcast 35 260 205
+             262:     75(ptr) AccessChain 24(data) 25 255 72
+             263:   15(ivec4) Load 262
+             264:   15(ivec4) VectorShuffle 263 261 4 5 2 3
+                              Store 262 264
+             265:     27(ptr) AccessChain 10(dti) 26
+             266:      6(int) Load 265
+             267:     27(ptr) AccessChain 10(dti) 26
+             268:      6(int) Load 267
+             269:     75(ptr) AccessChain 24(data) 25 268 72
+             270:   15(ivec4) Load 269
+             271:  105(ivec3) VectorShuffle 270 270 0 1 2
+             272:  105(ivec3) GroupNonUniformQuadBroadcast 35 271 205
+             273:     75(ptr) AccessChain 24(data) 25 266 72
+             274:   15(ivec4) Load 273
+             275:   15(ivec4) VectorShuffle 274 272 4 5 6 3
+                              Store 273 275
+             276:     27(ptr) AccessChain 10(dti) 26
+             277:      6(int) Load 276
+             278:     27(ptr) AccessChain 10(dti) 26
+             279:      6(int) Load 278
+             280:    118(ptr) AccessChain 24(data) 25 279 115
+             281:   17(fvec4) Load 280
+             282:   17(fvec4) GroupNonUniformQuadBroadcast 35 281 205
+             283:    118(ptr) AccessChain 24(data) 25 277 115
+                              Store 283 282
+             284:     27(ptr) AccessChain 10(dti) 26
+             285:      6(int) Load 284
+             286:     27(ptr) AccessChain 10(dti) 26
+             287:      6(int) Load 286
+             288:    127(ptr) AccessChain 24(data) 25 287 115 26
+             289:   16(float) Load 288
+             290:   16(float) GroupNonUniformQuadBroadcast 35 289 205
+             291:    127(ptr) AccessChain 24(data) 25 285 115 26
+                              Store 291 290
+             292:     27(ptr) AccessChain 10(dti) 26
+             293:      6(int) Load 292
+             294:     27(ptr) AccessChain 10(dti) 26
+             295:      6(int) Load 294
+             296:    118(ptr) AccessChain 24(data) 25 295 115
+             297:   17(fvec4) Load 296
+             298:  136(fvec2) VectorShuffle 297 297 0 1
+             299:  136(fvec2) GroupNonUniformQuadBroadcast 35 298 205
+             300:    118(ptr) AccessChain 24(data) 25 293 115
+             301:   17(fvec4) Load 300
+             302:   17(fvec4) VectorShuffle 301 299 4 5 2 3
+                              Store 300 302
+             303:     27(ptr) AccessChain 10(dti) 26
+             304:      6(int) Load 303
+             305:     27(ptr) AccessChain 10(dti) 26
+             306:      6(int) Load 305
+             307:    118(ptr) AccessChain 24(data) 25 306 115
+             308:   17(fvec4) Load 307
+             309:  148(fvec3) VectorShuffle 308 308 0 1 2
+             310:  148(fvec3) GroupNonUniformQuadBroadcast 35 309 205
+             311:    118(ptr) AccessChain 24(data) 25 304 115
+             312:   17(fvec4) Load 311
+             313:   17(fvec4) VectorShuffle 312 310 4 5 6 3
+                              Store 311 313
+             314:     27(ptr) AccessChain 10(dti) 26
+             315:      6(int) Load 314
+             316:     27(ptr) AccessChain 10(dti) 26
+             317:      6(int) Load 316
+             318:    161(ptr) AccessChain 24(data) 25 317 158
+             319: 19(f64vec4) Load 318
+             320: 19(f64vec4) GroupNonUniformQuadBroadcast 35 319 205
+             321:    161(ptr) AccessChain 24(data) 25 315 158
+                              Store 321 320
+             322:     27(ptr) AccessChain 10(dti) 26
+             323:      6(int) Load 322
+             324:     27(ptr) AccessChain 10(dti) 26
+             325:      6(int) Load 324
+             326:    170(ptr) AccessChain 24(data) 25 325 158 26
+             327:18(float64_t) Load 326
+             328:18(float64_t) GroupNonUniformQuadBroadcast 35 327 205
+             329:    170(ptr) AccessChain 24(data) 25 323 158 26
+                              Store 329 328
+             330:     27(ptr) AccessChain 10(dti) 26
+             331:      6(int) Load 330
+             332:     27(ptr) AccessChain 10(dti) 26
+             333:      6(int) Load 332
+             334:    161(ptr) AccessChain 24(data) 25 333 158
+             335: 19(f64vec4) Load 334
+             336:179(f64vec2) VectorShuffle 335 335 0 1
+             337:179(f64vec2) GroupNonUniformQuadBroadcast 35 336 205
+             338:    161(ptr) AccessChain 24(data) 25 331 158
+             339: 19(f64vec4) Load 338
+             340: 19(f64vec4) VectorShuffle 339 337 4 5 2 3
+                              Store 338 340
+             341:     27(ptr) AccessChain 10(dti) 26
+             342:      6(int) Load 341
+             343:     27(ptr) AccessChain 10(dti) 26
+             344:      6(int) Load 343
+             345:    161(ptr) AccessChain 24(data) 25 344 158
+             346: 19(f64vec4) Load 345
+             347:191(f64vec3) VectorShuffle 346 346 0 1 2
+             348:191(f64vec3) GroupNonUniformQuadBroadcast 35 347 205
+             349:    161(ptr) AccessChain 24(data) 25 342 158
+             350: 19(f64vec4) Load 349
+             351: 19(f64vec4) VectorShuffle 350 348 4 5 6 3
+                              Store 349 351
+             352:     27(ptr) AccessChain 10(dti) 26
+             353:      6(int) Load 352
+             354:     27(ptr) AccessChain 10(dti) 26
+             355:      6(int) Load 354
+             356:     32(ptr) AccessChain 24(data) 25 355 25
+             357:   13(ivec4) Load 356
+             359:   13(ivec4) GroupNonUniformQuadBroadcast 35 357 358
+             360:     32(ptr) AccessChain 24(data) 25 353 25
+                              Store 360 359
+             361:     27(ptr) AccessChain 10(dti) 26
+             362:      6(int) Load 361
+             363:     27(ptr) AccessChain 10(dti) 26
+             364:      6(int) Load 363
+             365:     42(ptr) AccessChain 24(data) 25 364 25 26
+             366:      6(int) Load 365
+             367:      6(int) GroupNonUniformQuadBroadcast 35 366 358
+             368:     42(ptr) AccessChain 24(data) 25 362 25 26
+                              Store 368 367
+             369:     27(ptr) AccessChain 10(dti) 26
+             370:      6(int) Load 369
+             371:     27(ptr) AccessChain 10(dti) 26
+             372:      6(int) Load 371
+             373:     32(ptr) AccessChain 24(data) 25 372 25
+             374:   13(ivec4) Load 373
+             375:   51(ivec2) VectorShuffle 374 374 0 1
+             376:   51(ivec2) GroupNonUniformQuadBroadcast 35 375 358
+             377:     32(ptr) AccessChain 24(data) 25 370 25
+             378:   13(ivec4) Load 377
+             379:   13(ivec4) VectorShuffle 378 376 4 5 2 3
+                              Store 377 379
+             380:     27(ptr) AccessChain 10(dti) 26
+             381:      6(int) Load 380
+             382:     27(ptr) AccessChain 10(dti) 26
+             383:      6(int) Load 382
+             384:     32(ptr) AccessChain 24(data) 25 383 25
+             385:   13(ivec4) Load 384
+             386:    7(ivec3) VectorShuffle 385 385 0 1 2
+             387:    7(ivec3) GroupNonUniformQuadBroadcast 35 386 358
+             388:     32(ptr) AccessChain 24(data) 25 381 25
+             389:   13(ivec4) Load 388
+             390:   13(ivec4) VectorShuffle 389 387 4 5 6 3
+                              Store 388 390
+             391:     27(ptr) AccessChain 10(dti) 26
+             392:      6(int) Load 391
+             393:     27(ptr) AccessChain 10(dti) 26
+             394:      6(int) Load 393
+             395:     75(ptr) AccessChain 24(data) 25 394 72
+             396:   15(ivec4) Load 395
+             397:   15(ivec4) GroupNonUniformQuadBroadcast 35 396 358
+             398:     75(ptr) AccessChain 24(data) 25 392 72
+                              Store 398 397
+             399:     27(ptr) AccessChain 10(dti) 26
+             400:      6(int) Load 399
+             401:     27(ptr) AccessChain 10(dti) 26
+             402:      6(int) Load 401
+             403:     84(ptr) AccessChain 24(data) 25 402 72 26
+             404:     14(int) Load 403
+             405:     14(int) GroupNonUniformQuadBroadcast 35 404 358
+             406:     84(ptr) AccessChain 24(data) 25 400 72 26
+                              Store 406 405
+             407:     27(ptr) AccessChain 10(dti) 26
+             408:      6(int) Load 407
+             409:     27(ptr) AccessChain 10(dti) 26
+             410:      6(int) Load 409
+             411:     75(ptr) AccessChain 24(data) 25 410 72
+             412:   15(ivec4) Load 411
+             413:   93(ivec2) VectorShuffle 412 412 0 1
+             414:   93(ivec2) GroupNonUniformQuadBroadcast 35 413 358
+             415:     75(ptr) AccessChain 24(data) 25 408 72
+             416:   15(ivec4) Load 415
+             417:   15(ivec4) VectorShuffle 416 414 4 5 2 3
+                              Store 415 417
+             418:     27(ptr) AccessChain 10(dti) 26
+             419:      6(int) Load 418
+             420:     27(ptr) AccessChain 10(dti) 26
+             421:      6(int) Load 420
+             422:     75(ptr) AccessChain 24(data) 25 421 72
+             423:   15(ivec4) Load 422
+             424:  105(ivec3) VectorShuffle 423 423 0 1 2
+             425:  105(ivec3) GroupNonUniformQuadBroadcast 35 424 358
+             426:     75(ptr) AccessChain 24(data) 25 419 72
+             427:   15(ivec4) Load 426
+             428:   15(ivec4) VectorShuffle 427 425 4 5 6 3
+                              Store 426 428
+             429:     27(ptr) AccessChain 10(dti) 26
+             430:      6(int) Load 429
+             431:     27(ptr) AccessChain 10(dti) 26
+             432:      6(int) Load 431
+             433:    118(ptr) AccessChain 24(data) 25 432 115
+             434:   17(fvec4) Load 433
+             435:   17(fvec4) GroupNonUniformQuadBroadcast 35 434 358
+             436:    118(ptr) AccessChain 24(data) 25 430 115
+                              Store 436 435
+             437:     27(ptr) AccessChain 10(dti) 26
+             438:      6(int) Load 437
+             439:     27(ptr) AccessChain 10(dti) 26
+             440:      6(int) Load 439
+             441:    127(ptr) AccessChain 24(data) 25 440 115 26
+             442:   16(float) Load 441
+             443:   16(float) GroupNonUniformQuadBroadcast 35 442 358
+             444:    127(ptr) AccessChain 24(data) 25 438 115 26
+                              Store 444 443
+             445:     27(ptr) AccessChain 10(dti) 26
+             446:      6(int) Load 445
+             447:     27(ptr) AccessChain 10(dti) 26
+             448:      6(int) Load 447
+             449:    118(ptr) AccessChain 24(data) 25 448 115
+             450:   17(fvec4) Load 449
+             451:  136(fvec2) VectorShuffle 450 450 0 1
+             452:  136(fvec2) GroupNonUniformQuadBroadcast 35 451 358
+             453:    118(ptr) AccessChain 24(data) 25 446 115
+             454:   17(fvec4) Load 453
+             455:   17(fvec4) VectorShuffle 454 452 4 5 2 3
+                              Store 453 455
+             456:     27(ptr) AccessChain 10(dti) 26
+             457:      6(int) Load 456
+             458:     27(ptr) AccessChain 10(dti) 26
+             459:      6(int) Load 458
+             460:    118(ptr) AccessChain 24(data) 25 459 115
+             461:   17(fvec4) Load 460
+             462:  148(fvec3) VectorShuffle 461 461 0 1 2
+             463:  148(fvec3) GroupNonUniformQuadBroadcast 35 462 358
+             464:    118(ptr) AccessChain 24(data) 25 457 115
+             465:   17(fvec4) Load 464
+             466:   17(fvec4) VectorShuffle 465 463 4 5 6 3
+                              Store 464 466
+             467:     27(ptr) AccessChain 10(dti) 26
+             468:      6(int) Load 467
+             469:     27(ptr) AccessChain 10(dti) 26
+             470:      6(int) Load 469
+             471:    161(ptr) AccessChain 24(data) 25 470 158
+             472: 19(f64vec4) Load 471
+             473: 19(f64vec4) GroupNonUniformQuadBroadcast 35 472 358
+             474:    161(ptr) AccessChain 24(data) 25 468 158
+                              Store 474 473
+             475:     27(ptr) AccessChain 10(dti) 26
+             476:      6(int) Load 475
+             477:     27(ptr) AccessChain 10(dti) 26
+             478:      6(int) Load 477
+             479:    170(ptr) AccessChain 24(data) 25 478 158 26
+             480:18(float64_t) Load 479
+             481:18(float64_t) GroupNonUniformQuadBroadcast 35 480 358
+             482:    170(ptr) AccessChain 24(data) 25 476 158 26
+                              Store 482 481
+             483:     27(ptr) AccessChain 10(dti) 26
+             484:      6(int) Load 483
+             485:     27(ptr) AccessChain 10(dti) 26
+             486:      6(int) Load 485
+             487:    161(ptr) AccessChain 24(data) 25 486 158
+             488: 19(f64vec4) Load 487
+             489:179(f64vec2) VectorShuffle 488 488 0 1
+             490:179(f64vec2) GroupNonUniformQuadBroadcast 35 489 358
+             491:    161(ptr) AccessChain 24(data) 25 484 158
+             492: 19(f64vec4) Load 491
+             493: 19(f64vec4) VectorShuffle 492 490 4 5 2 3
+                              Store 491 493
+             494:     27(ptr) AccessChain 10(dti) 26
+             495:      6(int) Load 494
+             496:     27(ptr) AccessChain 10(dti) 26
+             497:      6(int) Load 496
+             498:    161(ptr) AccessChain 24(data) 25 497 158
+             499: 19(f64vec4) Load 498
+             500:191(f64vec3) VectorShuffle 499 499 0 1 2
+             501:191(f64vec3) GroupNonUniformQuadBroadcast 35 500 358
+             502:    161(ptr) AccessChain 24(data) 25 495 158
+             503: 19(f64vec4) Load 502
+             504: 19(f64vec4) VectorShuffle 503 501 4 5 6 3
+                              Store 502 504
+             505:     27(ptr) AccessChain 10(dti) 26
+             506:      6(int) Load 505
+             507:     27(ptr) AccessChain 10(dti) 26
+             508:      6(int) Load 507
+             509:     32(ptr) AccessChain 24(data) 25 508 25
+             510:   13(ivec4) Load 509
+             511:   13(ivec4) GroupNonUniformQuadBroadcast 35 510 35
+             512:     32(ptr) AccessChain 24(data) 25 506 25
+                              Store 512 511
+             513:     27(ptr) AccessChain 10(dti) 26
+             514:      6(int) Load 513
+             515:     27(ptr) AccessChain 10(dti) 26
+             516:      6(int) Load 515
+             517:     42(ptr) AccessChain 24(data) 25 516 25 26
+             518:      6(int) Load 517
+             519:      6(int) GroupNonUniformQuadBroadcast 35 518 35
+             520:     42(ptr) AccessChain 24(data) 25 514 25 26
+                              Store 520 519
+             521:     27(ptr) AccessChain 10(dti) 26
+             522:      6(int) Load 521
+             523:     27(ptr) AccessChain 10(dti) 26
+             524:      6(int) Load 523
+             525:     32(ptr) AccessChain 24(data) 25 524 25
+             526:   13(ivec4) Load 525
+             527:   51(ivec2) VectorShuffle 526 526 0 1
+             528:   51(ivec2) GroupNonUniformQuadBroadcast 35 527 35
+             529:     32(ptr) AccessChain 24(data) 25 522 25
+             530:   13(ivec4) Load 529
+             531:   13(ivec4) VectorShuffle 530 528 4 5 2 3
+                              Store 529 531
+             532:     27(ptr) AccessChain 10(dti) 26
+             533:      6(int) Load 532
+             534:     27(ptr) AccessChain 10(dti) 26
+             535:      6(int) Load 534
+             536:     32(ptr) AccessChain 24(data) 25 535 25
+             537:   13(ivec4) Load 536
+             538:    7(ivec3) VectorShuffle 537 537 0 1 2
+             539:    7(ivec3) GroupNonUniformQuadBroadcast 35 538 35
+             540:     32(ptr) AccessChain 24(data) 25 533 25
+             541:   13(ivec4) Load 540
+             542:   13(ivec4) VectorShuffle 541 539 4 5 6 3
+                              Store 540 542
+             543:     27(ptr) AccessChain 10(dti) 26
+             544:      6(int) Load 543
+             545:     27(ptr) AccessChain 10(dti) 26
+             546:      6(int) Load 545
+             547:     75(ptr) AccessChain 24(data) 25 546 72
+             548:   15(ivec4) Load 547
+             549:   15(ivec4) GroupNonUniformQuadBroadcast 35 548 35
+             550:     75(ptr) AccessChain 24(data) 25 544 72
+                              Store 550 549
+             551:     27(ptr) AccessChain 10(dti) 26
+             552:      6(int) Load 551
+             553:     27(ptr) AccessChain 10(dti) 26
+             554:      6(int) Load 553
+             555:     84(ptr) AccessChain 24(data) 25 554 72 26
+             556:     14(int) Load 555
+             557:     14(int) GroupNonUniformQuadBroadcast 35 556 35
+             558:     84(ptr) AccessChain 24(data) 25 552 72 26
+                              Store 558 557
+             559:     27(ptr) AccessChain 10(dti) 26
+             560:      6(int) Load 559
+             561:     27(ptr) AccessChain 10(dti) 26
+             562:      6(int) Load 561
+             563:     75(ptr) AccessChain 24(data) 25 562 72
+             564:   15(ivec4) Load 563
+             565:   93(ivec2) VectorShuffle 564 564 0 1
+             566:   93(ivec2) GroupNonUniformQuadBroadcast 35 565 35
+             567:     75(ptr) AccessChain 24(data) 25 560 72
+             568:   15(ivec4) Load 567
+             569:   15(ivec4) VectorShuffle 568 566 4 5 2 3
+                              Store 567 569
+             570:     27(ptr) AccessChain 10(dti) 26
+             571:      6(int) Load 570
+             572:     27(ptr) AccessChain 10(dti) 26
+             573:      6(int) Load 572
+             574:     75(ptr) AccessChain 24(data) 25 573 72
+             575:   15(ivec4) Load 574
+             576:  105(ivec3) VectorShuffle 575 575 0 1 2
+             577:  105(ivec3) GroupNonUniformQuadBroadcast 35 576 35
+             578:     75(ptr) AccessChain 24(data) 25 571 72
+             579:   15(ivec4) Load 578
+             580:   15(ivec4) VectorShuffle 579 577 4 5 6 3
+                              Store 578 580
+             581:     27(ptr) AccessChain 10(dti) 26
+             582:      6(int) Load 581
+             583:     27(ptr) AccessChain 10(dti) 26
+             584:      6(int) Load 583
+             585:    118(ptr) AccessChain 24(data) 25 584 115
+             586:   17(fvec4) Load 585
+             587:   17(fvec4) GroupNonUniformQuadBroadcast 35 586 35
+             588:    118(ptr) AccessChain 24(data) 25 582 115
+                              Store 588 587
+             589:     27(ptr) AccessChain 10(dti) 26
+             590:      6(int) Load 589
+             591:     27(ptr) AccessChain 10(dti) 26
+             592:      6(int) Load 591
+             593:    127(ptr) AccessChain 24(data) 25 592 115 26
+             594:   16(float) Load 593
+             595:   16(float) GroupNonUniformQuadBroadcast 35 594 35
+             596:    127(ptr) AccessChain 24(data) 25 590 115 26
+                              Store 596 595
+             597:     27(ptr) AccessChain 10(dti) 26
+             598:      6(int) Load 597
+             599:     27(ptr) AccessChain 10(dti) 26
+             600:      6(int) Load 599
+             601:    118(ptr) AccessChain 24(data) 25 600 115
+             602:   17(fvec4) Load 601
+             603:  136(fvec2) VectorShuffle 602 602 0 1
+             604:  136(fvec2) GroupNonUniformQuadBroadcast 35 603 35
+             605:    118(ptr) AccessChain 24(data) 25 598 115
+             606:   17(fvec4) Load 605
+             607:   17(fvec4) VectorShuffle 606 604 4 5 2 3
+                              Store 605 607
+             608:     27(ptr) AccessChain 10(dti) 26
+             609:      6(int) Load 608
+             610:     27(ptr) AccessChain 10(dti) 26
+             611:      6(int) Load 610
+             612:    118(ptr) AccessChain 24(data) 25 611 115
+             613:   17(fvec4) Load 612
+             614:  148(fvec3) VectorShuffle 613 613 0 1 2
+             615:  148(fvec3) GroupNonUniformQuadBroadcast 35 614 35
+             616:    118(ptr) AccessChain 24(data) 25 609 115
+             617:   17(fvec4) Load 616
+             618:   17(fvec4) VectorShuffle 617 615 4 5 6 3
+                              Store 616 618
+             619:     27(ptr) AccessChain 10(dti) 26
+             620:      6(int) Load 619
+             621:     27(ptr) AccessChain 10(dti) 26
+             622:      6(int) Load 621
+             623:    161(ptr) AccessChain 24(data) 25 622 158
+             624: 19(f64vec4) Load 623
+             625: 19(f64vec4) GroupNonUniformQuadBroadcast 35 624 35
+             626:    161(ptr) AccessChain 24(data) 25 620 158
+                              Store 626 625
+             627:     27(ptr) AccessChain 10(dti) 26
+             628:      6(int) Load 627
+             629:     27(ptr) AccessChain 10(dti) 26
+             630:      6(int) Load 629
+             631:    170(ptr) AccessChain 24(data) 25 630 158 26
+             632:18(float64_t) Load 631
+             633:18(float64_t) GroupNonUniformQuadBroadcast 35 632 35
+             634:    170(ptr) AccessChain 24(data) 25 628 158 26
+                              Store 634 633
+             635:     27(ptr) AccessChain 10(dti) 26
+             636:      6(int) Load 635
+             637:     27(ptr) AccessChain 10(dti) 26
+             638:      6(int) Load 637
+             639:    161(ptr) AccessChain 24(data) 25 638 158
+             640: 19(f64vec4) Load 639
+             641:179(f64vec2) VectorShuffle 640 640 0 1
+             642:179(f64vec2) GroupNonUniformQuadBroadcast 35 641 35
+             643:    161(ptr) AccessChain 24(data) 25 636 158
+             644: 19(f64vec4) Load 643
+             645: 19(f64vec4) VectorShuffle 644 642 4 5 2 3
+                              Store 643 645
+             646:     27(ptr) AccessChain 10(dti) 26
+             647:      6(int) Load 646
+             648:     27(ptr) AccessChain 10(dti) 26
+             649:      6(int) Load 648
+             650:    161(ptr) AccessChain 24(data) 25 649 158
+             651: 19(f64vec4) Load 650
+             652:191(f64vec3) VectorShuffle 651 651 0 1 2
+             653:191(f64vec3) GroupNonUniformQuadBroadcast 35 652 35
+             654:    161(ptr) AccessChain 24(data) 25 647 158
+             655: 19(f64vec4) Load 654
+             656: 19(f64vec4) VectorShuffle 655 653 4 5 6 3
+                              Store 654 656
+             657:     27(ptr) AccessChain 10(dti) 26
+             658:      6(int) Load 657
+             659:     27(ptr) AccessChain 10(dti) 26
+             660:      6(int) Load 659
+             661:     32(ptr) AccessChain 24(data) 25 660 25
+             662:   13(ivec4) Load 661
+             663:   13(ivec4) GroupNonUniformQuadSwap 35 662 26
+             664:     32(ptr) AccessChain 24(data) 25 658 25
+                              Store 664 663
+             665:     27(ptr) AccessChain 10(dti) 26
+             666:      6(int) Load 665
+             667:     27(ptr) AccessChain 10(dti) 26
+             668:      6(int) Load 667
+             669:     42(ptr) AccessChain 24(data) 25 668 25 26
+             670:      6(int) Load 669
+             671:      6(int) GroupNonUniformQuadSwap 35 670 26
+             672:     42(ptr) AccessChain 24(data) 25 666 25 26
+                              Store 672 671
+             673:     27(ptr) AccessChain 10(dti) 26
+             674:      6(int) Load 673
+             675:     27(ptr) AccessChain 10(dti) 26
+             676:      6(int) Load 675
+             677:     32(ptr) AccessChain 24(data) 25 676 25
+             678:   13(ivec4) Load 677
+             679:   51(ivec2) VectorShuffle 678 678 0 1
+             680:   51(ivec2) GroupNonUniformQuadSwap 35 679 26
+             681:     32(ptr) AccessChain 24(data) 25 674 25
+             682:   13(ivec4) Load 681
+             683:   13(ivec4) VectorShuffle 682 680 4 5 2 3
+                              Store 681 683
+             684:     27(ptr) AccessChain 10(dti) 26
+             685:      6(int) Load 684
+             686:     27(ptr) AccessChain 10(dti) 26
+             687:      6(int) Load 686
+             688:     32(ptr) AccessChain 24(data) 25 687 25
+             689:   13(ivec4) Load 688
+             690:    7(ivec3) VectorShuffle 689 689 0 1 2
+             691:    7(ivec3) GroupNonUniformQuadSwap 35 690 26
+             692:     32(ptr) AccessChain 24(data) 25 685 25
+             693:   13(ivec4) Load 692
+             694:   13(ivec4) VectorShuffle 693 691 4 5 6 3
+                              Store 692 694
+             695:     27(ptr) AccessChain 10(dti) 26
+             696:      6(int) Load 695
+             697:     27(ptr) AccessChain 10(dti) 26
+             698:      6(int) Load 697
+             699:     75(ptr) AccessChain 24(data) 25 698 72
+             700:   15(ivec4) Load 699
+             701:   15(ivec4) GroupNonUniformQuadSwap 35 700 26
+             702:     75(ptr) AccessChain 24(data) 25 696 72
+                              Store 702 701
+             703:     27(ptr) AccessChain 10(dti) 26
+             704:      6(int) Load 703
+             705:     27(ptr) AccessChain 10(dti) 26
+             706:      6(int) Load 705
+             707:     84(ptr) AccessChain 24(data) 25 706 72 26
+             708:     14(int) Load 707
+             709:     14(int) GroupNonUniformQuadSwap 35 708 26
+             710:     84(ptr) AccessChain 24(data) 25 704 72 26
+                              Store 710 709
+             711:     27(ptr) AccessChain 10(dti) 26
+             712:      6(int) Load 711
+             713:     27(ptr) AccessChain 10(dti) 26
+             714:      6(int) Load 713
+             715:     75(ptr) AccessChain 24(data) 25 714 72
+             716:   15(ivec4) Load 715
+             717:   93(ivec2) VectorShuffle 716 716 0 1
+             718:   93(ivec2) GroupNonUniformQuadSwap 35 717 26
+             719:     75(ptr) AccessChain 24(data) 25 712 72
+             720:   15(ivec4) Load 719
+             721:   15(ivec4) VectorShuffle 720 718 4 5 2 3
+                              Store 719 721
+             722:     27(ptr) AccessChain 10(dti) 26
+             723:      6(int) Load 722
+             724:     27(ptr) AccessChain 10(dti) 26
+             725:      6(int) Load 724
+             726:     75(ptr) AccessChain 24(data) 25 725 72
+             727:   15(ivec4) Load 726
+             728:  105(ivec3) VectorShuffle 727 727 0 1 2
+             729:  105(ivec3) GroupNonUniformQuadSwap 35 728 26
+             730:     75(ptr) AccessChain 24(data) 25 723 72
+             731:   15(ivec4) Load 730
+             732:   15(ivec4) VectorShuffle 731 729 4 5 6 3
+                              Store 730 732
+             733:     27(ptr) AccessChain 10(dti) 26
+             734:      6(int) Load 733
+             735:     27(ptr) AccessChain 10(dti) 26
+             736:      6(int) Load 735
+             737:    118(ptr) AccessChain 24(data) 25 736 115
+             738:   17(fvec4) Load 737
+             739:   17(fvec4) GroupNonUniformQuadSwap 35 738 26
+             740:    118(ptr) AccessChain 24(data) 25 734 115
+                              Store 740 739
+             741:     27(ptr) AccessChain 10(dti) 26
+             742:      6(int) Load 741
+             743:     27(ptr) AccessChain 10(dti) 26
+             744:      6(int) Load 743
+             745:    127(ptr) AccessChain 24(data) 25 744 115 26
+             746:   16(float) Load 745
+             747:   16(float) GroupNonUniformQuadSwap 35 746 26
+             748:    127(ptr) AccessChain 24(data) 25 742 115 26
+                              Store 748 747
+             749:     27(ptr) AccessChain 10(dti) 26
+             750:      6(int) Load 749
+             751:     27(ptr) AccessChain 10(dti) 26
+             752:      6(int) Load 751
+             753:    118(ptr) AccessChain 24(data) 25 752 115
+             754:   17(fvec4) Load 753
+             755:  136(fvec2) VectorShuffle 754 754 0 1
+             756:  136(fvec2) GroupNonUniformQuadSwap 35 755 26
+             757:    118(ptr) AccessChain 24(data) 25 750 115
+             758:   17(fvec4) Load 757
+             759:   17(fvec4) VectorShuffle 758 756 4 5 2 3
+                              Store 757 759
+             760:     27(ptr) AccessChain 10(dti) 26
+             761:      6(int) Load 760
+             762:     27(ptr) AccessChain 10(dti) 26
+             763:      6(int) Load 762
+             764:    118(ptr) AccessChain 24(data) 25 763 115
+             765:   17(fvec4) Load 764
+             766:  148(fvec3) VectorShuffle 765 765 0 1 2
+             767:  148(fvec3) GroupNonUniformQuadSwap 35 766 26
+             768:    118(ptr) AccessChain 24(data) 25 761 115
+             769:   17(fvec4) Load 768
+             770:   17(fvec4) VectorShuffle 769 767 4 5 6 3
+                              Store 768 770
+             771:     27(ptr) AccessChain 10(dti) 26
+             772:      6(int) Load 771
+             773:     27(ptr) AccessChain 10(dti) 26
+             774:      6(int) Load 773
+             775:    161(ptr) AccessChain 24(data) 25 774 158
+             776: 19(f64vec4) Load 775
+             777: 19(f64vec4) GroupNonUniformQuadSwap 35 776 26
+             778:    161(ptr) AccessChain 24(data) 25 772 158
+                              Store 778 777
+             779:     27(ptr) AccessChain 10(dti) 26
+             780:      6(int) Load 779
+             781:     27(ptr) AccessChain 10(dti) 26
+             782:      6(int) Load 781
+             783:    170(ptr) AccessChain 24(data) 25 782 158 26
+             784:18(float64_t) Load 783
+             785:18(float64_t) GroupNonUniformQuadSwap 35 784 26
+             786:    170(ptr) AccessChain 24(data) 25 780 158 26
+                              Store 786 785
+             787:     27(ptr) AccessChain 10(dti) 26
+             788:      6(int) Load 787
+             789:     27(ptr) AccessChain 10(dti) 26
+             790:      6(int) Load 789
+             791:    161(ptr) AccessChain 24(data) 25 790 158
+             792: 19(f64vec4) Load 791
+             793:179(f64vec2) VectorShuffle 792 792 0 1
+             794:179(f64vec2) GroupNonUniformQuadSwap 35 793 26
+             795:    161(ptr) AccessChain 24(data) 25 788 158
+             796: 19(f64vec4) Load 795
+             797: 19(f64vec4) VectorShuffle 796 794 4 5 2 3
+                              Store 795 797
+             798:     27(ptr) AccessChain 10(dti) 26
+             799:      6(int) Load 798
+             800:     27(ptr) AccessChain 10(dti) 26
+             801:      6(int) Load 800
+             802:    161(ptr) AccessChain 24(data) 25 801 158
+             803: 19(f64vec4) Load 802
+             804:191(f64vec3) VectorShuffle 803 803 0 1 2
+             805:191(f64vec3) GroupNonUniformQuadSwap 35 804 26
+             806:    161(ptr) AccessChain 24(data) 25 799 158
+             807: 19(f64vec4) Load 806
+             808: 19(f64vec4) VectorShuffle 807 805 4 5 6 3
+                              Store 806 808
+             809:     27(ptr) AccessChain 10(dti) 26
+             810:      6(int) Load 809
+             811:     27(ptr) AccessChain 10(dti) 26
+             812:      6(int) Load 811
+             813:     32(ptr) AccessChain 24(data) 25 812 25
+             814:   13(ivec4) Load 813
+             815:   13(ivec4) GroupNonUniformQuadSwap 35 814 205
+             816:     32(ptr) AccessChain 24(data) 25 810 25
+                              Store 816 815
+             817:     27(ptr) AccessChain 10(dti) 26
+             818:      6(int) Load 817
+             819:     27(ptr) AccessChain 10(dti) 26
+             820:      6(int) Load 819
+             821:     42(ptr) AccessChain 24(data) 25 820 25 26
+             822:      6(int) Load 821
+             823:      6(int) GroupNonUniformQuadSwap 35 822 205
+             824:     42(ptr) AccessChain 24(data) 25 818 25 26
+                              Store 824 823
+             825:     27(ptr) AccessChain 10(dti) 26
+             826:      6(int) Load 825
+             827:     27(ptr) AccessChain 10(dti) 26
+             828:      6(int) Load 827
+             829:     32(ptr) AccessChain 24(data) 25 828 25
+             830:   13(ivec4) Load 829
+             831:   51(ivec2) VectorShuffle 830 830 0 1
+             832:   51(ivec2) GroupNonUniformQuadSwap 35 831 205
+             833:     32(ptr) AccessChain 24(data) 25 826 25
+             834:   13(ivec4) Load 833
+             835:   13(ivec4) VectorShuffle 834 832 4 5 2 3
+                              Store 833 835
+             836:     27(ptr) AccessChain 10(dti) 26
+             837:      6(int) Load 836
+             838:     27(ptr) AccessChain 10(dti) 26
+             839:      6(int) Load 838
+             840:     32(ptr) AccessChain 24(data) 25 839 25
+             841:   13(ivec4) Load 840
+             842:    7(ivec3) VectorShuffle 841 841 0 1 2
+             843:    7(ivec3) GroupNonUniformQuadSwap 35 842 205
+             844:     32(ptr) AccessChain 24(data) 25 837 25
+             845:   13(ivec4) Load 844
+             846:   13(ivec4) VectorShuffle 845 843 4 5 6 3
+                              Store 844 846
+             847:     27(ptr) AccessChain 10(dti) 26
+             848:      6(int) Load 847
+             849:     27(ptr) AccessChain 10(dti) 26
+             850:      6(int) Load 849
+             851:     75(ptr) AccessChain 24(data) 25 850 72
+             852:   15(ivec4) Load 851
+             853:   15(ivec4) GroupNonUniformQuadSwap 35 852 205
+             854:     75(ptr) AccessChain 24(data) 25 848 72
+                              Store 854 853
+             855:     27(ptr) AccessChain 10(dti) 26
+             856:      6(int) Load 855
+             857:     27(ptr) AccessChain 10(dti) 26
+             858:      6(int) Load 857
+             859:     84(ptr) AccessChain 24(data) 25 858 72 26
+             860:     14(int) Load 859
+             861:     14(int) GroupNonUniformQuadSwap 35 860 205
+             862:     84(ptr) AccessChain 24(data) 25 856 72 26
+                              Store 862 861
+             863:     27(ptr) AccessChain 10(dti) 26
+             864:      6(int) Load 863
+             865:     27(ptr) AccessChain 10(dti) 26
+             866:      6(int) Load 865
+             867:     75(ptr) AccessChain 24(data) 25 866 72
+             868:   15(ivec4) Load 867
+             869:   93(ivec2) VectorShuffle 868 868 0 1
+             870:   93(ivec2) GroupNonUniformQuadSwap 35 869 205
+             871:     75(ptr) AccessChain 24(data) 25 864 72
+             872:   15(ivec4) Load 871
+             873:   15(ivec4) VectorShuffle 872 870 4 5 2 3
+                              Store 871 873
+             874:     27(ptr) AccessChain 10(dti) 26
+             875:      6(int) Load 874
+             876:     27(ptr) AccessChain 10(dti) 26
+             877:      6(int) Load 876
+             878:     75(ptr) AccessChain 24(data) 25 877 72
+             879:   15(ivec4) Load 878
+             880:  105(ivec3) VectorShuffle 879 879 0 1 2
+             881:  105(ivec3) GroupNonUniformQuadSwap 35 880 205
+             882:     75(ptr) AccessChain 24(data) 25 875 72
+             883:   15(ivec4) Load 882
+             884:   15(ivec4) VectorShuffle 883 881 4 5 6 3
+                              Store 882 884
+             885:     27(ptr) AccessChain 10(dti) 26
+             886:      6(int) Load 885
+             887:     27(ptr) AccessChain 10(dti) 26
+             888:      6(int) Load 887
+             889:    118(ptr) AccessChain 24(data) 25 888 115
+             890:   17(fvec4) Load 889
+             891:   17(fvec4) GroupNonUniformQuadSwap 35 890 205
+             892:    118(ptr) AccessChain 24(data) 25 886 115
+                              Store 892 891
+             893:     27(ptr) AccessChain 10(dti) 26
+             894:      6(int) Load 893
+             895:     27(ptr) AccessChain 10(dti) 26
+             896:      6(int) Load 895
+             897:    127(ptr) AccessChain 24(data) 25 896 115 26
+             898:   16(float) Load 897
+             899:   16(float) GroupNonUniformQuadSwap 35 898 205
+             900:    127(ptr) AccessChain 24(data) 25 894 115 26
+                              Store 900 899
+             901:     27(ptr) AccessChain 10(dti) 26
+             902:      6(int) Load 901
+             903:     27(ptr) AccessChain 10(dti) 26
+             904:      6(int) Load 903
+             905:    118(ptr) AccessChain 24(data) 25 904 115
+             906:   17(fvec4) Load 905
+             907:  136(fvec2) VectorShuffle 906 906 0 1
+             908:  136(fvec2) GroupNonUniformQuadSwap 35 907 205
+             909:    118(ptr) AccessChain 24(data) 25 902 115
+             910:   17(fvec4) Load 909
+             911:   17(fvec4) VectorShuffle 910 908 4 5 2 3
+                              Store 909 911
+             912:     27(ptr) AccessChain 10(dti) 26
+             913:      6(int) Load 912
+             914:     27(ptr) AccessChain 10(dti) 26
+             915:      6(int) Load 914
+             916:    118(ptr) AccessChain 24(data) 25 915 115
+             917:   17(fvec4) Load 916
+             918:  148(fvec3) VectorShuffle 917 917 0 1 2
+             919:  148(fvec3) GroupNonUniformQuadSwap 35 918 205
+             920:    118(ptr) AccessChain 24(data) 25 913 115
+             921:   17(fvec4) Load 920
+             922:   17(fvec4) VectorShuffle 921 919 4 5 6 3
+                              Store 920 922
+             923:     27(ptr) AccessChain 10(dti) 26
+             924:      6(int) Load 923
+             925:     27(ptr) AccessChain 10(dti) 26
+             926:      6(int) Load 925
+             927:    161(ptr) AccessChain 24(data) 25 926 158
+             928: 19(f64vec4) Load 927
+             929: 19(f64vec4) GroupNonUniformQuadSwap 35 928 205
+             930:    161(ptr) AccessChain 24(data) 25 924 158
+                              Store 930 929
+             931:     27(ptr) AccessChain 10(dti) 26
+             932:      6(int) Load 931
+             933:     27(ptr) AccessChain 10(dti) 26
+             934:      6(int) Load 933
+             935:    170(ptr) AccessChain 24(data) 25 934 158 26
+             936:18(float64_t) Load 935
+             937:18(float64_t) GroupNonUniformQuadSwap 35 936 205
+             938:    170(ptr) AccessChain 24(data) 25 932 158 26
+                              Store 938 937
+             939:     27(ptr) AccessChain 10(dti) 26
+             940:      6(int) Load 939
+             941:     27(ptr) AccessChain 10(dti) 26
+             942:      6(int) Load 941
+             943:    161(ptr) AccessChain 24(data) 25 942 158
+             944: 19(f64vec4) Load 943
+             945:179(f64vec2) VectorShuffle 944 944 0 1
+             946:179(f64vec2) GroupNonUniformQuadSwap 35 945 205
+             947:    161(ptr) AccessChain 24(data) 25 940 158
+             948: 19(f64vec4) Load 947
+             949: 19(f64vec4) VectorShuffle 948 946 4 5 2 3
+                              Store 947 949
+             950:     27(ptr) AccessChain 10(dti) 26
+             951:      6(int) Load 950
+             952:     27(ptr) AccessChain 10(dti) 26
+             953:      6(int) Load 952
+             954:    161(ptr) AccessChain 24(data) 25 953 158
+             955: 19(f64vec4) Load 954
+             956:191(f64vec3) VectorShuffle 955 955 0 1 2
+             957:191(f64vec3) GroupNonUniformQuadSwap 35 956 205
+             958:    161(ptr) AccessChain 24(data) 25 951 158
+             959: 19(f64vec4) Load 958
+             960: 19(f64vec4) VectorShuffle 959 957 4 5 6 3
+                              Store 958 960
+             961:     27(ptr) AccessChain 10(dti) 26
+             962:      6(int) Load 961
+             963:     27(ptr) AccessChain 10(dti) 26
+             964:      6(int) Load 963
+             965:     32(ptr) AccessChain 24(data) 25 964 25
+             966:   13(ivec4) Load 965
+             967:   13(ivec4) GroupNonUniformQuadSwap 35 966 358
+             968:     32(ptr) AccessChain 24(data) 25 962 25
+                              Store 968 967
+             969:     27(ptr) AccessChain 10(dti) 26
+             970:      6(int) Load 969
+             971:     27(ptr) AccessChain 10(dti) 26
+             972:      6(int) Load 971
+             973:     42(ptr) AccessChain 24(data) 25 972 25 26
+             974:      6(int) Load 973
+             975:      6(int) GroupNonUniformQuadSwap 35 974 358
+             976:     42(ptr) AccessChain 24(data) 25 970 25 26
+                              Store 976 975
+             977:     27(ptr) AccessChain 10(dti) 26
+             978:      6(int) Load 977
+             979:     27(ptr) AccessChain 10(dti) 26
+             980:      6(int) Load 979
+             981:     32(ptr) AccessChain 24(data) 25 980 25
+             982:   13(ivec4) Load 981
+             983:   51(ivec2) VectorShuffle 982 982 0 1
+             984:   51(ivec2) GroupNonUniformQuadSwap 35 983 358
+             985:     32(ptr) AccessChain 24(data) 25 978 25
+             986:   13(ivec4) Load 985
+             987:   13(ivec4) VectorShuffle 986 984 4 5 2 3
+                              Store 985 987
+             988:     27(ptr) AccessChain 10(dti) 26
+             989:      6(int) Load 988
+             990:     27(ptr) AccessChain 10(dti) 26
+             991:      6(int) Load 990
+             992:     32(ptr) AccessChain 24(data) 25 991 25
+             993:   13(ivec4) Load 992
+             994:    7(ivec3) VectorShuffle 993 993 0 1 2
+             995:    7(ivec3) GroupNonUniformQuadSwap 35 994 358
+             996:     32(ptr) AccessChain 24(data) 25 989 25
+             997:   13(ivec4) Load 996
+             998:   13(ivec4) VectorShuffle 997 995 4 5 6 3
+                              Store 996 998
+             999:     27(ptr) AccessChain 10(dti) 26
+            1000:      6(int) Load 999
+            1001:     27(ptr) AccessChain 10(dti) 26
+            1002:      6(int) Load 1001
+            1003:     75(ptr) AccessChain 24(data) 25 1002 72
+            1004:   15(ivec4) Load 1003
+            1005:   15(ivec4) GroupNonUniformQuadSwap 35 1004 358
+            1006:     75(ptr) AccessChain 24(data) 25 1000 72
+                              Store 1006 1005
+            1007:     27(ptr) AccessChain 10(dti) 26
+            1008:      6(int) Load 1007
+            1009:     27(ptr) AccessChain 10(dti) 26
+            1010:      6(int) Load 1009
+            1011:     84(ptr) AccessChain 24(data) 25 1010 72 26
+            1012:     14(int) Load 1011
+            1013:     14(int) GroupNonUniformQuadSwap 35 1012 358
+            1014:     84(ptr) AccessChain 24(data) 25 1008 72 26
+                              Store 1014 1013
+            1015:     27(ptr) AccessChain 10(dti) 26
+            1016:      6(int) Load 1015
+            1017:     27(ptr) AccessChain 10(dti) 26
+            1018:      6(int) Load 1017
+            1019:     75(ptr) AccessChain 24(data) 25 1018 72
+            1020:   15(ivec4) Load 1019
+            1021:   93(ivec2) VectorShuffle 1020 1020 0 1
+            1022:   93(ivec2) GroupNonUniformQuadSwap 35 1021 358
+            1023:     75(ptr) AccessChain 24(data) 25 1016 72
+            1024:   15(ivec4) Load 1023
+            1025:   15(ivec4) VectorShuffle 1024 1022 4 5 2 3
+                              Store 1023 1025
+            1026:     27(ptr) AccessChain 10(dti) 26
+            1027:      6(int) Load 1026
+            1028:     27(ptr) AccessChain 10(dti) 26
+            1029:      6(int) Load 1028
+            1030:     75(ptr) AccessChain 24(data) 25 1029 72
+            1031:   15(ivec4) Load 1030
+            1032:  105(ivec3) VectorShuffle 1031 1031 0 1 2
+            1033:  105(ivec3) GroupNonUniformQuadSwap 35 1032 358
+            1034:     75(ptr) AccessChain 24(data) 25 1027 72
+            1035:   15(ivec4) Load 1034
+            1036:   15(ivec4) VectorShuffle 1035 1033 4 5 6 3
+                              Store 1034 1036
+            1037:     27(ptr) AccessChain 10(dti) 26
+            1038:      6(int) Load 1037
+            1039:     27(ptr) AccessChain 10(dti) 26
+            1040:      6(int) Load 1039
+            1041:    118(ptr) AccessChain 24(data) 25 1040 115
+            1042:   17(fvec4) Load 1041
+            1043:   17(fvec4) GroupNonUniformQuadSwap 35 1042 358
+            1044:    118(ptr) AccessChain 24(data) 25 1038 115
+                              Store 1044 1043
+            1045:     27(ptr) AccessChain 10(dti) 26
+            1046:      6(int) Load 1045
+            1047:     27(ptr) AccessChain 10(dti) 26
+            1048:      6(int) Load 1047
+            1049:    127(ptr) AccessChain 24(data) 25 1048 115 26
+            1050:   16(float) Load 1049
+            1051:   16(float) GroupNonUniformQuadSwap 35 1050 358
+            1052:    127(ptr) AccessChain 24(data) 25 1046 115 26
+                              Store 1052 1051
+            1053:     27(ptr) AccessChain 10(dti) 26
+            1054:      6(int) Load 1053
+            1055:     27(ptr) AccessChain 10(dti) 26
+            1056:      6(int) Load 1055
+            1057:    118(ptr) AccessChain 24(data) 25 1056 115
+            1058:   17(fvec4) Load 1057
+            1059:  136(fvec2) VectorShuffle 1058 1058 0 1
+            1060:  136(fvec2) GroupNonUniformQuadSwap 35 1059 358
+            1061:    118(ptr) AccessChain 24(data) 25 1054 115
+            1062:   17(fvec4) Load 1061
+            1063:   17(fvec4) VectorShuffle 1062 1060 4 5 2 3
+                              Store 1061 1063
+            1064:     27(ptr) AccessChain 10(dti) 26
+            1065:      6(int) Load 1064
+            1066:     27(ptr) AccessChain 10(dti) 26
+            1067:      6(int) Load 1066
+            1068:    118(ptr) AccessChain 24(data) 25 1067 115
+            1069:   17(fvec4) Load 1068
+            1070:  148(fvec3) VectorShuffle 1069 1069 0 1 2
+            1071:  148(fvec3) GroupNonUniformQuadSwap 35 1070 358
+            1072:    118(ptr) AccessChain 24(data) 25 1065 115
+            1073:   17(fvec4) Load 1072
+            1074:   17(fvec4) VectorShuffle 1073 1071 4 5 6 3
+                              Store 1072 1074
+            1075:     27(ptr) AccessChain 10(dti) 26
+            1076:      6(int) Load 1075
+            1077:     27(ptr) AccessChain 10(dti) 26
+            1078:      6(int) Load 1077
+            1079:    161(ptr) AccessChain 24(data) 25 1078 158
+            1080: 19(f64vec4) Load 1079
+            1081: 19(f64vec4) GroupNonUniformQuadSwap 35 1080 358
+            1082:    161(ptr) AccessChain 24(data) 25 1076 158
+                              Store 1082 1081
+            1083:     27(ptr) AccessChain 10(dti) 26
+            1084:      6(int) Load 1083
+            1085:     27(ptr) AccessChain 10(dti) 26
+            1086:      6(int) Load 1085
+            1087:    170(ptr) AccessChain 24(data) 25 1086 158 26
+            1088:18(float64_t) Load 1087
+            1089:18(float64_t) GroupNonUniformQuadSwap 35 1088 358
+            1090:    170(ptr) AccessChain 24(data) 25 1084 158 26
+                              Store 1090 1089
+            1091:     27(ptr) AccessChain 10(dti) 26
+            1092:      6(int) Load 1091
+            1093:     27(ptr) AccessChain 10(dti) 26
+            1094:      6(int) Load 1093
+            1095:    161(ptr) AccessChain 24(data) 25 1094 158
+            1096: 19(f64vec4) Load 1095
+            1097:179(f64vec2) VectorShuffle 1096 1096 0 1
+            1098:179(f64vec2) GroupNonUniformQuadSwap 35 1097 358
+            1099:    161(ptr) AccessChain 24(data) 25 1092 158
+            1100: 19(f64vec4) Load 1099
+            1101: 19(f64vec4) VectorShuffle 1100 1098 4 5 2 3
+                              Store 1099 1101
+            1102:     27(ptr) AccessChain 10(dti) 26
+            1103:      6(int) Load 1102
+            1104:     27(ptr) AccessChain 10(dti) 26
+            1105:      6(int) Load 1104
+            1106:    161(ptr) AccessChain 24(data) 25 1105 158
+            1107: 19(f64vec4) Load 1106
+            1108:191(f64vec3) VectorShuffle 1107 1107 0 1 2
+            1109:191(f64vec3) GroupNonUniformQuadSwap 35 1108 358
+            1110:    161(ptr) AccessChain 24(data) 25 1103 158
+            1111: 19(f64vec4) Load 1110
+            1112: 19(f64vec4) VectorShuffle 1111 1109 4 5 6 3
+                              Store 1110 1112
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/hlsl.wavequery.comp.out b/Test/baseResults/hlsl.wavequery.comp.out
new file mode 100644
index 0000000..5f70124
--- /dev/null
+++ b/Test/baseResults/hlsl.wavequery.comp.out
@@ -0,0 +1,116 @@
+hlsl.wavequery.comp
+Shader version: 500
+local_size = (32, 16, 1)
+0:? Sequence
+0:5  Function Definition: @CSMain( ( temp void)
+0:5    Function Parameters: 
+0:?     Sequence
+0:6      move second child to first child ( temp uint)
+0:6        indirect index (layout( row_major std430) buffer uint)
+0:6          @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:6            'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
+0:6            Constant:
+0:6              0 (const uint)
+0:6          '@gl_SubgroupInvocationID' ( in uint unknown built-in variable)
+0:6        Test condition and select ( temp uint): no shortcircuit
+0:6          Condition
+0:6          subgroupElect ( temp bool)
+0:6          true case
+0:6          '@gl_SubgroupSize' ( in uint unknown built-in variable)
+0:6          false case
+0:6          Constant:
+0:6            0 (const uint)
+0:5  Function Definition: CSMain( ( temp void)
+0:5    Function Parameters: 
+0:?     Sequence
+0:5      Function Call: @CSMain( ( temp void)
+0:?   Linker Objects
+0:?     'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
+
+
+Linked compute stage:
+
+
+Shader version: 500
+local_size = (32, 16, 1)
+0:? Sequence
+0:5  Function Definition: @CSMain( ( temp void)
+0:5    Function Parameters: 
+0:?     Sequence
+0:6      move second child to first child ( temp uint)
+0:6        indirect index (layout( row_major std430) buffer uint)
+0:6          @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint)
+0:6            'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
+0:6            Constant:
+0:6              0 (const uint)
+0:6          '@gl_SubgroupInvocationID' ( in uint unknown built-in variable)
+0:6        Test condition and select ( temp uint): no shortcircuit
+0:6          Condition
+0:6          subgroupElect ( temp bool)
+0:6          true case
+0:6          '@gl_SubgroupSize' ( in uint unknown built-in variable)
+0:6          false case
+0:6          Constant:
+0:6            0 (const uint)
+0:5  Function Definition: CSMain( ( temp void)
+0:5    Function Parameters: 
+0:?     Sequence
+0:5      Function Call: @CSMain( ( temp void)
+0:?   Linker Objects
+0:?     'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
+
+// Module Version 10300
+// Generated by (magic number): 80007
+// Id's are bound by 28
+
+                              Capability Shader
+                              Capability GroupNonUniform
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint GLCompute 4  "CSMain" 16 21
+                              ExecutionMode 4 LocalSize 32 16 1
+                              Source HLSL 500
+                              Name 4  "CSMain"
+                              Name 6  "@CSMain("
+                              Name 10  "data"
+                              MemberName 10(data) 0  "@data"
+                              Name 12  "data"
+                              Name 16  "@gl_SubgroupInvocationID"
+                              Name 21  "@gl_SubgroupSize"
+                              Decorate 9 ArrayStride 4
+                              MemberDecorate 10(data) 0 Offset 0
+                              Decorate 10(data) BufferBlock
+                              Decorate 12(data) DescriptorSet 0
+                              Decorate 16(@gl_SubgroupInvocationID) BuiltIn SubgroupLocalInvocationId
+                              Decorate 21(@gl_SubgroupSize) BuiltIn SubgroupSize
+               2:             TypeVoid
+               3:             TypeFunction 2
+               8:             TypeInt 32 0
+               9:             TypeRuntimeArray 8(int)
+        10(data):             TypeStruct 9
+              11:             TypePointer Uniform 10(data)
+        12(data):     11(ptr) Variable Uniform
+              13:             TypeInt 32 1
+              14:     13(int) Constant 0
+              15:             TypePointer Input 8(int)
+16(@gl_SubgroupInvocationID):     15(ptr) Variable Input
+              18:             TypeBool
+              19:      8(int) Constant 3
+21(@gl_SubgroupSize):     15(ptr) Variable Input
+              23:      8(int) Constant 0
+              25:             TypePointer Uniform 8(int)
+       4(CSMain):           2 Function None 3
+               5:             Label
+              27:           2 FunctionCall 6(@CSMain()
+                              Return
+                              FunctionEnd
+     6(@CSMain():           2 Function None 3
+               7:             Label
+              17:      8(int) Load 16(@gl_SubgroupInvocationID)
+              20:    18(bool) GroupNonUniformElect 19
+              22:      8(int) Load 21(@gl_SubgroupSize)
+              24:      8(int) Select 20 22 23
+              26:     25(ptr) AccessChain 12(data) 14 17
+                              Store 26 24
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/hlsl.wavequery.frag.out b/Test/baseResults/hlsl.wavequery.frag.out
new file mode 100644
index 0000000..52304a6
--- /dev/null
+++ b/Test/baseResults/hlsl.wavequery.frag.out
@@ -0,0 +1,123 @@
+hlsl.wavequery.frag
+Shader version: 500
+gl_FragCoord origin is upper left
+0:? Sequence
+0:2  Function Definition: @PixelShaderFunction( ( temp 4-component vector of float)
+0:2    Function Parameters: 
+0:?     Sequence
+0:3      Test condition and select ( temp void)
+0:3        Condition
+0:3        subgroupElect ( temp bool)
+0:3        true case
+0:?         Sequence
+0:5          Branch: Return with expression
+0:?             Constant:
+0:?               1.000000
+0:?               2.000000
+0:?               3.000000
+0:?               4.000000
+0:3        false case
+0:?         Sequence
+0:9          Branch: Return with expression
+0:?             Constant:
+0:?               4.000000
+0:?               3.000000
+0:?               2.000000
+0:?               1.000000
+0:2  Function Definition: PixelShaderFunction( ( temp void)
+0:2    Function Parameters: 
+0:?     Sequence
+0:2      move second child to first child ( temp 4-component vector of float)
+0:?         '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+0:2        Function Call: @PixelShaderFunction( ( temp 4-component vector of float)
+0:?   Linker Objects
+0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+
+
+Linked fragment stage:
+
+
+Shader version: 500
+gl_FragCoord origin is upper left
+0:? Sequence
+0:2  Function Definition: @PixelShaderFunction( ( temp 4-component vector of float)
+0:2    Function Parameters: 
+0:?     Sequence
+0:3      Test condition and select ( temp void)
+0:3        Condition
+0:3        subgroupElect ( temp bool)
+0:3        true case
+0:?         Sequence
+0:5          Branch: Return with expression
+0:?             Constant:
+0:?               1.000000
+0:?               2.000000
+0:?               3.000000
+0:?               4.000000
+0:3        false case
+0:?         Sequence
+0:9          Branch: Return with expression
+0:?             Constant:
+0:?               4.000000
+0:?               3.000000
+0:?               2.000000
+0:?               1.000000
+0:2  Function Definition: PixelShaderFunction( ( temp void)
+0:2    Function Parameters: 
+0:?     Sequence
+0:2      move second child to first child ( temp 4-component vector of float)
+0:?         '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+0:2        Function Call: @PixelShaderFunction( ( temp 4-component vector of float)
+0:?   Linker Objects
+0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+
+// Module Version 10300
+// Generated by (magic number): 80007
+// Id's are bound by 30
+
+                              Capability Shader
+                              Capability GroupNonUniform
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "PixelShaderFunction" 28
+                              ExecutionMode 4 OriginUpperLeft
+                              Source HLSL 500
+                              Name 4  "PixelShaderFunction"
+                              Name 9  "@PixelShaderFunction("
+                              Name 28  "@entryPointOutput"
+                              Decorate 28(@entryPointOutput) Location 0
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+               8:             TypeFunction 7(fvec4)
+              11:             TypeBool
+              12:             TypeInt 32 0
+              13:     12(int) Constant 3
+              17:    6(float) Constant 1065353216
+              18:    6(float) Constant 1073741824
+              19:    6(float) Constant 1077936128
+              20:    6(float) Constant 1082130432
+              21:    7(fvec4) ConstantComposite 17 18 19 20
+              24:    7(fvec4) ConstantComposite 20 19 18 17
+              27:             TypePointer Output 7(fvec4)
+28(@entryPointOutput):     27(ptr) Variable Output
+4(PixelShaderFunction):           2 Function None 3
+               5:             Label
+              29:    7(fvec4) FunctionCall 9(@PixelShaderFunction()
+                              Store 28(@entryPointOutput) 29
+                              Return
+                              FunctionEnd
+9(@PixelShaderFunction():    7(fvec4) Function None 8
+              10:             Label
+              14:    11(bool) GroupNonUniformElect 13
+                              SelectionMerge 16 None
+                              BranchConditional 14 15 23
+              15:               Label
+                                ReturnValue 21
+              23:               Label
+                                ReturnValue 24
+              16:             Label
+              26:    7(fvec4) Undef
+                              ReturnValue 26
+                              FunctionEnd
diff --git a/Test/baseResults/hlsl.wavereduction.comp.out b/Test/baseResults/hlsl.wavereduction.comp.out
new file mode 100644
index 0000000..f922f3d
--- /dev/null
+++ b/Test/baseResults/hlsl.wavereduction.comp.out
@@ -0,0 +1,7218 @@
+hlsl.wavereduction.comp
+Shader version: 500
+local_size = (32, 16, 1)
+0:? Sequence
+0:13  Function Definition: @CSMain(vu3; ( temp void)
+0:13    Function Parameters: 
+0:13      'dti' ( in 3-component vector of uint)
+0:?     Sequence
+0:14      move second child to first child ( temp 4-component vector of uint)
+0:14        u: direct index for structure ( temp 4-component vector of uint)
+0:14          indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:14            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:14              'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:14              Constant:
+0:14                0 (const uint)
+0:14            direct index ( temp uint)
+0:14              'dti' ( in 3-component vector of uint)
+0:14              Constant:
+0:14                0 (const int)
+0:14          Constant:
+0:14            0 (const int)
+0:14        subgroupAdd ( temp 4-component vector of uint)
+0:14          u: direct index for structure ( temp 4-component vector of uint)
+0:14            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:14              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:14                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:14                Constant:
+0:14                  0 (const uint)
+0:14              direct index ( temp uint)
+0:14                'dti' ( in 3-component vector of uint)
+0:14                Constant:
+0:14                  0 (const int)
+0:14            Constant:
+0:14              0 (const int)
+0:15      move second child to first child ( temp uint)
+0:15        direct index ( temp uint)
+0:15          u: direct index for structure ( temp 4-component vector of uint)
+0:15            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:15              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:15                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:15                Constant:
+0:15                  0 (const uint)
+0:15              direct index ( temp uint)
+0:15                'dti' ( in 3-component vector of uint)
+0:15                Constant:
+0:15                  0 (const int)
+0:15            Constant:
+0:15              0 (const int)
+0:15          Constant:
+0:15            0 (const int)
+0:15        subgroupAdd ( temp uint)
+0:15          direct index ( temp uint)
+0:15            u: direct index for structure ( temp 4-component vector of uint)
+0:15              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:15                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:15                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:15                  Constant:
+0:15                    0 (const uint)
+0:15                direct index ( temp uint)
+0:15                  'dti' ( in 3-component vector of uint)
+0:15                  Constant:
+0:15                    0 (const int)
+0:15              Constant:
+0:15                0 (const int)
+0:15            Constant:
+0:15              0 (const int)
+0:16      move second child to first child ( temp 2-component vector of uint)
+0:16        vector swizzle ( temp 2-component vector of uint)
+0:16          u: direct index for structure ( temp 4-component vector of uint)
+0:16            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:16              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:16                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:16                Constant:
+0:16                  0 (const uint)
+0:16              direct index ( temp uint)
+0:16                'dti' ( in 3-component vector of uint)
+0:16                Constant:
+0:16                  0 (const int)
+0:16            Constant:
+0:16              0 (const int)
+0:16          Sequence
+0:16            Constant:
+0:16              0 (const int)
+0:16            Constant:
+0:16              1 (const int)
+0:16        subgroupAdd ( temp 2-component vector of uint)
+0:16          vector swizzle ( temp 2-component vector of uint)
+0:16            u: direct index for structure ( temp 4-component vector of uint)
+0:16              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:16                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:16                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:16                  Constant:
+0:16                    0 (const uint)
+0:16                direct index ( temp uint)
+0:16                  'dti' ( in 3-component vector of uint)
+0:16                  Constant:
+0:16                    0 (const int)
+0:16              Constant:
+0:16                0 (const int)
+0:16            Sequence
+0:16              Constant:
+0:16                0 (const int)
+0:16              Constant:
+0:16                1 (const int)
+0:17      move second child to first child ( temp 3-component vector of uint)
+0:17        vector swizzle ( temp 3-component vector of uint)
+0:17          u: direct index for structure ( temp 4-component vector of uint)
+0:17            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:17              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:17                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:17                Constant:
+0:17                  0 (const uint)
+0:17              direct index ( temp uint)
+0:17                'dti' ( in 3-component vector of uint)
+0:17                Constant:
+0:17                  0 (const int)
+0:17            Constant:
+0:17              0 (const int)
+0:17          Sequence
+0:17            Constant:
+0:17              0 (const int)
+0:17            Constant:
+0:17              1 (const int)
+0:17            Constant:
+0:17              2 (const int)
+0:17        subgroupAdd ( temp 3-component vector of uint)
+0:17          vector swizzle ( temp 3-component vector of uint)
+0:17            u: direct index for structure ( temp 4-component vector of uint)
+0:17              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:17                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:17                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:17                  Constant:
+0:17                    0 (const uint)
+0:17                direct index ( temp uint)
+0:17                  'dti' ( in 3-component vector of uint)
+0:17                  Constant:
+0:17                    0 (const int)
+0:17              Constant:
+0:17                0 (const int)
+0:17            Sequence
+0:17              Constant:
+0:17                0 (const int)
+0:17              Constant:
+0:17                1 (const int)
+0:17              Constant:
+0:17                2 (const int)
+0:19      move second child to first child ( temp 4-component vector of int)
+0:19        i: direct index for structure ( temp 4-component vector of int)
+0:19          indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:19            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:19              'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:19              Constant:
+0:19                0 (const uint)
+0:19            direct index ( temp uint)
+0:19              'dti' ( in 3-component vector of uint)
+0:19              Constant:
+0:19                0 (const int)
+0:19          Constant:
+0:19            1 (const int)
+0:19        subgroupAdd ( temp 4-component vector of int)
+0:19          i: direct index for structure ( temp 4-component vector of int)
+0:19            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:19              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:19                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:19                Constant:
+0:19                  0 (const uint)
+0:19              direct index ( temp uint)
+0:19                'dti' ( in 3-component vector of uint)
+0:19                Constant:
+0:19                  0 (const int)
+0:19            Constant:
+0:19              1 (const int)
+0:20      move second child to first child ( temp int)
+0:20        direct index ( temp int)
+0:20          i: direct index for structure ( temp 4-component vector of int)
+0:20            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:20              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:20                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:20                Constant:
+0:20                  0 (const uint)
+0:20              direct index ( temp uint)
+0:20                'dti' ( in 3-component vector of uint)
+0:20                Constant:
+0:20                  0 (const int)
+0:20            Constant:
+0:20              1 (const int)
+0:20          Constant:
+0:20            0 (const int)
+0:20        subgroupAdd ( temp int)
+0:20          direct index ( temp int)
+0:20            i: direct index for structure ( temp 4-component vector of int)
+0:20              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:20                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:20                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:20                  Constant:
+0:20                    0 (const uint)
+0:20                direct index ( temp uint)
+0:20                  'dti' ( in 3-component vector of uint)
+0:20                  Constant:
+0:20                    0 (const int)
+0:20              Constant:
+0:20                1 (const int)
+0:20            Constant:
+0:20              0 (const int)
+0:21      move second child to first child ( temp 2-component vector of int)
+0:21        vector swizzle ( temp 2-component vector of int)
+0:21          i: direct index for structure ( temp 4-component vector of int)
+0:21            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:21              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:21                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:21                Constant:
+0:21                  0 (const uint)
+0:21              direct index ( temp uint)
+0:21                'dti' ( in 3-component vector of uint)
+0:21                Constant:
+0:21                  0 (const int)
+0:21            Constant:
+0:21              1 (const int)
+0:21          Sequence
+0:21            Constant:
+0:21              0 (const int)
+0:21            Constant:
+0:21              1 (const int)
+0:21        subgroupAdd ( temp 2-component vector of int)
+0:21          vector swizzle ( temp 2-component vector of int)
+0:21            i: direct index for structure ( temp 4-component vector of int)
+0:21              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:21                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:21                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:21                  Constant:
+0:21                    0 (const uint)
+0:21                direct index ( temp uint)
+0:21                  'dti' ( in 3-component vector of uint)
+0:21                  Constant:
+0:21                    0 (const int)
+0:21              Constant:
+0:21                1 (const int)
+0:21            Sequence
+0:21              Constant:
+0:21                0 (const int)
+0:21              Constant:
+0:21                1 (const int)
+0:22      move second child to first child ( temp 3-component vector of int)
+0:22        vector swizzle ( temp 3-component vector of int)
+0:22          i: direct index for structure ( temp 4-component vector of int)
+0:22            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:22              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:22                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:22                Constant:
+0:22                  0 (const uint)
+0:22              direct index ( temp uint)
+0:22                'dti' ( in 3-component vector of uint)
+0:22                Constant:
+0:22                  0 (const int)
+0:22            Constant:
+0:22              1 (const int)
+0:22          Sequence
+0:22            Constant:
+0:22              0 (const int)
+0:22            Constant:
+0:22              1 (const int)
+0:22            Constant:
+0:22              2 (const int)
+0:22        subgroupAdd ( temp 3-component vector of int)
+0:22          vector swizzle ( temp 3-component vector of int)
+0:22            i: direct index for structure ( temp 4-component vector of int)
+0:22              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:22                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:22                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:22                  Constant:
+0:22                    0 (const uint)
+0:22                direct index ( temp uint)
+0:22                  'dti' ( in 3-component vector of uint)
+0:22                  Constant:
+0:22                    0 (const int)
+0:22              Constant:
+0:22                1 (const int)
+0:22            Sequence
+0:22              Constant:
+0:22                0 (const int)
+0:22              Constant:
+0:22                1 (const int)
+0:22              Constant:
+0:22                2 (const int)
+0:24      move second child to first child ( temp 4-component vector of float)
+0:24        f: direct index for structure ( temp 4-component vector of float)
+0:24          indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:24            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:24              'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:24              Constant:
+0:24                0 (const uint)
+0:24            direct index ( temp uint)
+0:24              'dti' ( in 3-component vector of uint)
+0:24              Constant:
+0:24                0 (const int)
+0:24          Constant:
+0:24            2 (const int)
+0:24        subgroupAdd ( temp 4-component vector of float)
+0:24          f: direct index for structure ( temp 4-component vector of float)
+0:24            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:24              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:24                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:24                Constant:
+0:24                  0 (const uint)
+0:24              direct index ( temp uint)
+0:24                'dti' ( in 3-component vector of uint)
+0:24                Constant:
+0:24                  0 (const int)
+0:24            Constant:
+0:24              2 (const int)
+0:25      move second child to first child ( temp float)
+0:25        direct index ( temp float)
+0:25          f: direct index for structure ( temp 4-component vector of float)
+0:25            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:25              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:25                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:25                Constant:
+0:25                  0 (const uint)
+0:25              direct index ( temp uint)
+0:25                'dti' ( in 3-component vector of uint)
+0:25                Constant:
+0:25                  0 (const int)
+0:25            Constant:
+0:25              2 (const int)
+0:25          Constant:
+0:25            0 (const int)
+0:25        subgroupAdd ( temp float)
+0:25          direct index ( temp float)
+0:25            f: direct index for structure ( temp 4-component vector of float)
+0:25              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:25                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:25                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:25                  Constant:
+0:25                    0 (const uint)
+0:25                direct index ( temp uint)
+0:25                  'dti' ( in 3-component vector of uint)
+0:25                  Constant:
+0:25                    0 (const int)
+0:25              Constant:
+0:25                2 (const int)
+0:25            Constant:
+0:25              0 (const int)
+0:26      move second child to first child ( temp 2-component vector of float)
+0:26        vector swizzle ( temp 2-component vector of float)
+0:26          f: direct index for structure ( temp 4-component vector of float)
+0:26            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:26              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:26                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:26                Constant:
+0:26                  0 (const uint)
+0:26              direct index ( temp uint)
+0:26                'dti' ( in 3-component vector of uint)
+0:26                Constant:
+0:26                  0 (const int)
+0:26            Constant:
+0:26              2 (const int)
+0:26          Sequence
+0:26            Constant:
+0:26              0 (const int)
+0:26            Constant:
+0:26              1 (const int)
+0:26        subgroupAdd ( temp 2-component vector of float)
+0:26          vector swizzle ( temp 2-component vector of float)
+0:26            f: direct index for structure ( temp 4-component vector of float)
+0:26              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:26                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:26                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:26                  Constant:
+0:26                    0 (const uint)
+0:26                direct index ( temp uint)
+0:26                  'dti' ( in 3-component vector of uint)
+0:26                  Constant:
+0:26                    0 (const int)
+0:26              Constant:
+0:26                2 (const int)
+0:26            Sequence
+0:26              Constant:
+0:26                0 (const int)
+0:26              Constant:
+0:26                1 (const int)
+0:27      move second child to first child ( temp 3-component vector of float)
+0:27        vector swizzle ( temp 3-component vector of float)
+0:27          f: direct index for structure ( temp 4-component vector of float)
+0:27            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:27              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:27                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:27                Constant:
+0:27                  0 (const uint)
+0:27              direct index ( temp uint)
+0:27                'dti' ( in 3-component vector of uint)
+0:27                Constant:
+0:27                  0 (const int)
+0:27            Constant:
+0:27              2 (const int)
+0:27          Sequence
+0:27            Constant:
+0:27              0 (const int)
+0:27            Constant:
+0:27              1 (const int)
+0:27            Constant:
+0:27              2 (const int)
+0:27        subgroupAdd ( temp 3-component vector of float)
+0:27          vector swizzle ( temp 3-component vector of float)
+0:27            f: direct index for structure ( temp 4-component vector of float)
+0:27              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:27                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:27                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:27                  Constant:
+0:27                    0 (const uint)
+0:27                direct index ( temp uint)
+0:27                  'dti' ( in 3-component vector of uint)
+0:27                  Constant:
+0:27                    0 (const int)
+0:27              Constant:
+0:27                2 (const int)
+0:27            Sequence
+0:27              Constant:
+0:27                0 (const int)
+0:27              Constant:
+0:27                1 (const int)
+0:27              Constant:
+0:27                2 (const int)
+0:29      move second child to first child ( temp 4-component vector of double)
+0:29        d: direct index for structure ( temp 4-component vector of double)
+0:29          indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:29            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:29              'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:29              Constant:
+0:29                0 (const uint)
+0:29            direct index ( temp uint)
+0:29              'dti' ( in 3-component vector of uint)
+0:29              Constant:
+0:29                0 (const int)
+0:29          Constant:
+0:29            3 (const int)
+0:29        subgroupAdd ( temp 4-component vector of double)
+0:29          d: direct index for structure ( temp 4-component vector of double)
+0:29            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:29              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:29                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:29                Constant:
+0:29                  0 (const uint)
+0:29              direct index ( temp uint)
+0:29                'dti' ( in 3-component vector of uint)
+0:29                Constant:
+0:29                  0 (const int)
+0:29            Constant:
+0:29              3 (const int)
+0:30      move second child to first child ( temp double)
+0:30        direct index ( temp double)
+0:30          d: direct index for structure ( temp 4-component vector of double)
+0:30            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:30              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:30                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:30                Constant:
+0:30                  0 (const uint)
+0:30              direct index ( temp uint)
+0:30                'dti' ( in 3-component vector of uint)
+0:30                Constant:
+0:30                  0 (const int)
+0:30            Constant:
+0:30              3 (const int)
+0:30          Constant:
+0:30            0 (const int)
+0:30        subgroupAdd ( temp double)
+0:30          direct index ( temp double)
+0:30            d: direct index for structure ( temp 4-component vector of double)
+0:30              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:30                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:30                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:30                  Constant:
+0:30                    0 (const uint)
+0:30                direct index ( temp uint)
+0:30                  'dti' ( in 3-component vector of uint)
+0:30                  Constant:
+0:30                    0 (const int)
+0:30              Constant:
+0:30                3 (const int)
+0:30            Constant:
+0:30              0 (const int)
+0:31      move second child to first child ( temp 2-component vector of double)
+0:31        vector swizzle ( temp 2-component vector of double)
+0:31          d: direct index for structure ( temp 4-component vector of double)
+0:31            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:31              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:31                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:31                Constant:
+0:31                  0 (const uint)
+0:31              direct index ( temp uint)
+0:31                'dti' ( in 3-component vector of uint)
+0:31                Constant:
+0:31                  0 (const int)
+0:31            Constant:
+0:31              3 (const int)
+0:31          Sequence
+0:31            Constant:
+0:31              0 (const int)
+0:31            Constant:
+0:31              1 (const int)
+0:31        subgroupAdd ( temp 2-component vector of double)
+0:31          vector swizzle ( temp 2-component vector of double)
+0:31            d: direct index for structure ( temp 4-component vector of double)
+0:31              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:31                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:31                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:31                  Constant:
+0:31                    0 (const uint)
+0:31                direct index ( temp uint)
+0:31                  'dti' ( in 3-component vector of uint)
+0:31                  Constant:
+0:31                    0 (const int)
+0:31              Constant:
+0:31                3 (const int)
+0:31            Sequence
+0:31              Constant:
+0:31                0 (const int)
+0:31              Constant:
+0:31                1 (const int)
+0:32      move second child to first child ( temp 3-component vector of double)
+0:32        vector swizzle ( temp 3-component vector of double)
+0:32          d: direct index for structure ( temp 4-component vector of double)
+0:32            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:32              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:32                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:32                Constant:
+0:32                  0 (const uint)
+0:32              direct index ( temp uint)
+0:32                'dti' ( in 3-component vector of uint)
+0:32                Constant:
+0:32                  0 (const int)
+0:32            Constant:
+0:32              3 (const int)
+0:32          Sequence
+0:32            Constant:
+0:32              0 (const int)
+0:32            Constant:
+0:32              1 (const int)
+0:32            Constant:
+0:32              2 (const int)
+0:32        subgroupAdd ( temp 3-component vector of double)
+0:32          vector swizzle ( temp 3-component vector of double)
+0:32            d: direct index for structure ( temp 4-component vector of double)
+0:32              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:32                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:32                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:32                  Constant:
+0:32                    0 (const uint)
+0:32                direct index ( temp uint)
+0:32                  'dti' ( in 3-component vector of uint)
+0:32                  Constant:
+0:32                    0 (const int)
+0:32              Constant:
+0:32                3 (const int)
+0:32            Sequence
+0:32              Constant:
+0:32                0 (const int)
+0:32              Constant:
+0:32                1 (const int)
+0:32              Constant:
+0:32                2 (const int)
+0:34      move second child to first child ( temp 4-component vector of uint)
+0:34        u: direct index for structure ( temp 4-component vector of uint)
+0:34          indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:34            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:34              'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:34              Constant:
+0:34                0 (const uint)
+0:34            direct index ( temp uint)
+0:34              'dti' ( in 3-component vector of uint)
+0:34              Constant:
+0:34                0 (const int)
+0:34          Constant:
+0:34            0 (const int)
+0:34        subgroupMul ( temp 4-component vector of uint)
+0:34          u: direct index for structure ( temp 4-component vector of uint)
+0:34            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:34              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:34                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:34                Constant:
+0:34                  0 (const uint)
+0:34              direct index ( temp uint)
+0:34                'dti' ( in 3-component vector of uint)
+0:34                Constant:
+0:34                  0 (const int)
+0:34            Constant:
+0:34              0 (const int)
+0:35      move second child to first child ( temp uint)
+0:35        direct index ( temp uint)
+0:35          u: direct index for structure ( temp 4-component vector of uint)
+0:35            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:35              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:35                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:35                Constant:
+0:35                  0 (const uint)
+0:35              direct index ( temp uint)
+0:35                'dti' ( in 3-component vector of uint)
+0:35                Constant:
+0:35                  0 (const int)
+0:35            Constant:
+0:35              0 (const int)
+0:35          Constant:
+0:35            0 (const int)
+0:35        subgroupMul ( temp uint)
+0:35          direct index ( temp uint)
+0:35            u: direct index for structure ( temp 4-component vector of uint)
+0:35              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:35                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:35                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:35                  Constant:
+0:35                    0 (const uint)
+0:35                direct index ( temp uint)
+0:35                  'dti' ( in 3-component vector of uint)
+0:35                  Constant:
+0:35                    0 (const int)
+0:35              Constant:
+0:35                0 (const int)
+0:35            Constant:
+0:35              0 (const int)
+0:36      move second child to first child ( temp 2-component vector of uint)
+0:36        vector swizzle ( temp 2-component vector of uint)
+0:36          u: direct index for structure ( temp 4-component vector of uint)
+0:36            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:36              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:36                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:36                Constant:
+0:36                  0 (const uint)
+0:36              direct index ( temp uint)
+0:36                'dti' ( in 3-component vector of uint)
+0:36                Constant:
+0:36                  0 (const int)
+0:36            Constant:
+0:36              0 (const int)
+0:36          Sequence
+0:36            Constant:
+0:36              0 (const int)
+0:36            Constant:
+0:36              1 (const int)
+0:36        subgroupMul ( temp 2-component vector of uint)
+0:36          vector swizzle ( temp 2-component vector of uint)
+0:36            u: direct index for structure ( temp 4-component vector of uint)
+0:36              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:36                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:36                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:36                  Constant:
+0:36                    0 (const uint)
+0:36                direct index ( temp uint)
+0:36                  'dti' ( in 3-component vector of uint)
+0:36                  Constant:
+0:36                    0 (const int)
+0:36              Constant:
+0:36                0 (const int)
+0:36            Sequence
+0:36              Constant:
+0:36                0 (const int)
+0:36              Constant:
+0:36                1 (const int)
+0:37      move second child to first child ( temp 3-component vector of uint)
+0:37        vector swizzle ( temp 3-component vector of uint)
+0:37          u: direct index for structure ( temp 4-component vector of uint)
+0:37            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:37              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:37                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:37                Constant:
+0:37                  0 (const uint)
+0:37              direct index ( temp uint)
+0:37                'dti' ( in 3-component vector of uint)
+0:37                Constant:
+0:37                  0 (const int)
+0:37            Constant:
+0:37              0 (const int)
+0:37          Sequence
+0:37            Constant:
+0:37              0 (const int)
+0:37            Constant:
+0:37              1 (const int)
+0:37            Constant:
+0:37              2 (const int)
+0:37        subgroupMul ( temp 3-component vector of uint)
+0:37          vector swizzle ( temp 3-component vector of uint)
+0:37            u: direct index for structure ( temp 4-component vector of uint)
+0:37              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:37                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:37                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:37                  Constant:
+0:37                    0 (const uint)
+0:37                direct index ( temp uint)
+0:37                  'dti' ( in 3-component vector of uint)
+0:37                  Constant:
+0:37                    0 (const int)
+0:37              Constant:
+0:37                0 (const int)
+0:37            Sequence
+0:37              Constant:
+0:37                0 (const int)
+0:37              Constant:
+0:37                1 (const int)
+0:37              Constant:
+0:37                2 (const int)
+0:39      move second child to first child ( temp 4-component vector of int)
+0:39        i: direct index for structure ( temp 4-component vector of int)
+0:39          indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:39            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:39              'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:39              Constant:
+0:39                0 (const uint)
+0:39            direct index ( temp uint)
+0:39              'dti' ( in 3-component vector of uint)
+0:39              Constant:
+0:39                0 (const int)
+0:39          Constant:
+0:39            1 (const int)
+0:39        subgroupMul ( temp 4-component vector of int)
+0:39          i: direct index for structure ( temp 4-component vector of int)
+0:39            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:39              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:39                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:39                Constant:
+0:39                  0 (const uint)
+0:39              direct index ( temp uint)
+0:39                'dti' ( in 3-component vector of uint)
+0:39                Constant:
+0:39                  0 (const int)
+0:39            Constant:
+0:39              1 (const int)
+0:40      move second child to first child ( temp int)
+0:40        direct index ( temp int)
+0:40          i: direct index for structure ( temp 4-component vector of int)
+0:40            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:40              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:40                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:40                Constant:
+0:40                  0 (const uint)
+0:40              direct index ( temp uint)
+0:40                'dti' ( in 3-component vector of uint)
+0:40                Constant:
+0:40                  0 (const int)
+0:40            Constant:
+0:40              1 (const int)
+0:40          Constant:
+0:40            0 (const int)
+0:40        subgroupMul ( temp int)
+0:40          direct index ( temp int)
+0:40            i: direct index for structure ( temp 4-component vector of int)
+0:40              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:40                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:40                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:40                  Constant:
+0:40                    0 (const uint)
+0:40                direct index ( temp uint)
+0:40                  'dti' ( in 3-component vector of uint)
+0:40                  Constant:
+0:40                    0 (const int)
+0:40              Constant:
+0:40                1 (const int)
+0:40            Constant:
+0:40              0 (const int)
+0:41      move second child to first child ( temp 2-component vector of int)
+0:41        vector swizzle ( temp 2-component vector of int)
+0:41          i: direct index for structure ( temp 4-component vector of int)
+0:41            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:41              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:41                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:41                Constant:
+0:41                  0 (const uint)
+0:41              direct index ( temp uint)
+0:41                'dti' ( in 3-component vector of uint)
+0:41                Constant:
+0:41                  0 (const int)
+0:41            Constant:
+0:41              1 (const int)
+0:41          Sequence
+0:41            Constant:
+0:41              0 (const int)
+0:41            Constant:
+0:41              1 (const int)
+0:41        subgroupMul ( temp 2-component vector of int)
+0:41          vector swizzle ( temp 2-component vector of int)
+0:41            i: direct index for structure ( temp 4-component vector of int)
+0:41              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:41                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:41                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:41                  Constant:
+0:41                    0 (const uint)
+0:41                direct index ( temp uint)
+0:41                  'dti' ( in 3-component vector of uint)
+0:41                  Constant:
+0:41                    0 (const int)
+0:41              Constant:
+0:41                1 (const int)
+0:41            Sequence
+0:41              Constant:
+0:41                0 (const int)
+0:41              Constant:
+0:41                1 (const int)
+0:42      move second child to first child ( temp 3-component vector of int)
+0:42        vector swizzle ( temp 3-component vector of int)
+0:42          i: direct index for structure ( temp 4-component vector of int)
+0:42            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:42              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:42                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:42                Constant:
+0:42                  0 (const uint)
+0:42              direct index ( temp uint)
+0:42                'dti' ( in 3-component vector of uint)
+0:42                Constant:
+0:42                  0 (const int)
+0:42            Constant:
+0:42              1 (const int)
+0:42          Sequence
+0:42            Constant:
+0:42              0 (const int)
+0:42            Constant:
+0:42              1 (const int)
+0:42            Constant:
+0:42              2 (const int)
+0:42        subgroupMul ( temp 3-component vector of int)
+0:42          vector swizzle ( temp 3-component vector of int)
+0:42            i: direct index for structure ( temp 4-component vector of int)
+0:42              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:42                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:42                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:42                  Constant:
+0:42                    0 (const uint)
+0:42                direct index ( temp uint)
+0:42                  'dti' ( in 3-component vector of uint)
+0:42                  Constant:
+0:42                    0 (const int)
+0:42              Constant:
+0:42                1 (const int)
+0:42            Sequence
+0:42              Constant:
+0:42                0 (const int)
+0:42              Constant:
+0:42                1 (const int)
+0:42              Constant:
+0:42                2 (const int)
+0:44      move second child to first child ( temp 4-component vector of float)
+0:44        f: direct index for structure ( temp 4-component vector of float)
+0:44          indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:44            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:44              'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:44              Constant:
+0:44                0 (const uint)
+0:44            direct index ( temp uint)
+0:44              'dti' ( in 3-component vector of uint)
+0:44              Constant:
+0:44                0 (const int)
+0:44          Constant:
+0:44            2 (const int)
+0:44        subgroupMul ( temp 4-component vector of float)
+0:44          f: direct index for structure ( temp 4-component vector of float)
+0:44            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:44              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:44                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:44                Constant:
+0:44                  0 (const uint)
+0:44              direct index ( temp uint)
+0:44                'dti' ( in 3-component vector of uint)
+0:44                Constant:
+0:44                  0 (const int)
+0:44            Constant:
+0:44              2 (const int)
+0:45      move second child to first child ( temp float)
+0:45        direct index ( temp float)
+0:45          f: direct index for structure ( temp 4-component vector of float)
+0:45            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:45              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:45                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:45                Constant:
+0:45                  0 (const uint)
+0:45              direct index ( temp uint)
+0:45                'dti' ( in 3-component vector of uint)
+0:45                Constant:
+0:45                  0 (const int)
+0:45            Constant:
+0:45              2 (const int)
+0:45          Constant:
+0:45            0 (const int)
+0:45        subgroupMul ( temp float)
+0:45          direct index ( temp float)
+0:45            f: direct index for structure ( temp 4-component vector of float)
+0:45              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:45                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:45                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:45                  Constant:
+0:45                    0 (const uint)
+0:45                direct index ( temp uint)
+0:45                  'dti' ( in 3-component vector of uint)
+0:45                  Constant:
+0:45                    0 (const int)
+0:45              Constant:
+0:45                2 (const int)
+0:45            Constant:
+0:45              0 (const int)
+0:46      move second child to first child ( temp 2-component vector of float)
+0:46        vector swizzle ( temp 2-component vector of float)
+0:46          f: direct index for structure ( temp 4-component vector of float)
+0:46            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:46              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:46                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:46                Constant:
+0:46                  0 (const uint)
+0:46              direct index ( temp uint)
+0:46                'dti' ( in 3-component vector of uint)
+0:46                Constant:
+0:46                  0 (const int)
+0:46            Constant:
+0:46              2 (const int)
+0:46          Sequence
+0:46            Constant:
+0:46              0 (const int)
+0:46            Constant:
+0:46              1 (const int)
+0:46        subgroupMul ( temp 2-component vector of float)
+0:46          vector swizzle ( temp 2-component vector of float)
+0:46            f: direct index for structure ( temp 4-component vector of float)
+0:46              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:46                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:46                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:46                  Constant:
+0:46                    0 (const uint)
+0:46                direct index ( temp uint)
+0:46                  'dti' ( in 3-component vector of uint)
+0:46                  Constant:
+0:46                    0 (const int)
+0:46              Constant:
+0:46                2 (const int)
+0:46            Sequence
+0:46              Constant:
+0:46                0 (const int)
+0:46              Constant:
+0:46                1 (const int)
+0:47      move second child to first child ( temp 3-component vector of float)
+0:47        vector swizzle ( temp 3-component vector of float)
+0:47          f: direct index for structure ( temp 4-component vector of float)
+0:47            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:47              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:47                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:47                Constant:
+0:47                  0 (const uint)
+0:47              direct index ( temp uint)
+0:47                'dti' ( in 3-component vector of uint)
+0:47                Constant:
+0:47                  0 (const int)
+0:47            Constant:
+0:47              2 (const int)
+0:47          Sequence
+0:47            Constant:
+0:47              0 (const int)
+0:47            Constant:
+0:47              1 (const int)
+0:47            Constant:
+0:47              2 (const int)
+0:47        subgroupMul ( temp 3-component vector of float)
+0:47          vector swizzle ( temp 3-component vector of float)
+0:47            f: direct index for structure ( temp 4-component vector of float)
+0:47              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:47                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:47                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:47                  Constant:
+0:47                    0 (const uint)
+0:47                direct index ( temp uint)
+0:47                  'dti' ( in 3-component vector of uint)
+0:47                  Constant:
+0:47                    0 (const int)
+0:47              Constant:
+0:47                2 (const int)
+0:47            Sequence
+0:47              Constant:
+0:47                0 (const int)
+0:47              Constant:
+0:47                1 (const int)
+0:47              Constant:
+0:47                2 (const int)
+0:49      move second child to first child ( temp 4-component vector of double)
+0:49        d: direct index for structure ( temp 4-component vector of double)
+0:49          indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:49            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:49              'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:49              Constant:
+0:49                0 (const uint)
+0:49            direct index ( temp uint)
+0:49              'dti' ( in 3-component vector of uint)
+0:49              Constant:
+0:49                0 (const int)
+0:49          Constant:
+0:49            3 (const int)
+0:49        subgroupMul ( temp 4-component vector of double)
+0:49          d: direct index for structure ( temp 4-component vector of double)
+0:49            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:49              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:49                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:49                Constant:
+0:49                  0 (const uint)
+0:49              direct index ( temp uint)
+0:49                'dti' ( in 3-component vector of uint)
+0:49                Constant:
+0:49                  0 (const int)
+0:49            Constant:
+0:49              3 (const int)
+0:50      move second child to first child ( temp double)
+0:50        direct index ( temp double)
+0:50          d: direct index for structure ( temp 4-component vector of double)
+0:50            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:50              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:50                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:50                Constant:
+0:50                  0 (const uint)
+0:50              direct index ( temp uint)
+0:50                'dti' ( in 3-component vector of uint)
+0:50                Constant:
+0:50                  0 (const int)
+0:50            Constant:
+0:50              3 (const int)
+0:50          Constant:
+0:50            0 (const int)
+0:50        subgroupMul ( temp double)
+0:50          direct index ( temp double)
+0:50            d: direct index for structure ( temp 4-component vector of double)
+0:50              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:50                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:50                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:50                  Constant:
+0:50                    0 (const uint)
+0:50                direct index ( temp uint)
+0:50                  'dti' ( in 3-component vector of uint)
+0:50                  Constant:
+0:50                    0 (const int)
+0:50              Constant:
+0:50                3 (const int)
+0:50            Constant:
+0:50              0 (const int)
+0:51      move second child to first child ( temp 2-component vector of double)
+0:51        vector swizzle ( temp 2-component vector of double)
+0:51          d: direct index for structure ( temp 4-component vector of double)
+0:51            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:51              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:51                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:51                Constant:
+0:51                  0 (const uint)
+0:51              direct index ( temp uint)
+0:51                'dti' ( in 3-component vector of uint)
+0:51                Constant:
+0:51                  0 (const int)
+0:51            Constant:
+0:51              3 (const int)
+0:51          Sequence
+0:51            Constant:
+0:51              0 (const int)
+0:51            Constant:
+0:51              1 (const int)
+0:51        subgroupMul ( temp 2-component vector of double)
+0:51          vector swizzle ( temp 2-component vector of double)
+0:51            d: direct index for structure ( temp 4-component vector of double)
+0:51              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:51                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:51                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:51                  Constant:
+0:51                    0 (const uint)
+0:51                direct index ( temp uint)
+0:51                  'dti' ( in 3-component vector of uint)
+0:51                  Constant:
+0:51                    0 (const int)
+0:51              Constant:
+0:51                3 (const int)
+0:51            Sequence
+0:51              Constant:
+0:51                0 (const int)
+0:51              Constant:
+0:51                1 (const int)
+0:52      move second child to first child ( temp 3-component vector of double)
+0:52        vector swizzle ( temp 3-component vector of double)
+0:52          d: direct index for structure ( temp 4-component vector of double)
+0:52            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:52              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:52                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:52                Constant:
+0:52                  0 (const uint)
+0:52              direct index ( temp uint)
+0:52                'dti' ( in 3-component vector of uint)
+0:52                Constant:
+0:52                  0 (const int)
+0:52            Constant:
+0:52              3 (const int)
+0:52          Sequence
+0:52            Constant:
+0:52              0 (const int)
+0:52            Constant:
+0:52              1 (const int)
+0:52            Constant:
+0:52              2 (const int)
+0:52        subgroupMul ( temp 3-component vector of double)
+0:52          vector swizzle ( temp 3-component vector of double)
+0:52            d: direct index for structure ( temp 4-component vector of double)
+0:52              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:52                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:52                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:52                  Constant:
+0:52                    0 (const uint)
+0:52                direct index ( temp uint)
+0:52                  'dti' ( in 3-component vector of uint)
+0:52                  Constant:
+0:52                    0 (const int)
+0:52              Constant:
+0:52                3 (const int)
+0:52            Sequence
+0:52              Constant:
+0:52                0 (const int)
+0:52              Constant:
+0:52                1 (const int)
+0:52              Constant:
+0:52                2 (const int)
+0:54      move second child to first child ( temp 4-component vector of uint)
+0:54        u: direct index for structure ( temp 4-component vector of uint)
+0:54          indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:54            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:54              'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:54              Constant:
+0:54                0 (const uint)
+0:54            direct index ( temp uint)
+0:54              'dti' ( in 3-component vector of uint)
+0:54              Constant:
+0:54                0 (const int)
+0:54          Constant:
+0:54            0 (const int)
+0:54        subgroupMin ( temp 4-component vector of uint)
+0:54          u: direct index for structure ( temp 4-component vector of uint)
+0:54            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:54              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:54                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:54                Constant:
+0:54                  0 (const uint)
+0:54              direct index ( temp uint)
+0:54                'dti' ( in 3-component vector of uint)
+0:54                Constant:
+0:54                  0 (const int)
+0:54            Constant:
+0:54              0 (const int)
+0:55      move second child to first child ( temp uint)
+0:55        direct index ( temp uint)
+0:55          u: direct index for structure ( temp 4-component vector of uint)
+0:55            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:55              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:55                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:55                Constant:
+0:55                  0 (const uint)
+0:55              direct index ( temp uint)
+0:55                'dti' ( in 3-component vector of uint)
+0:55                Constant:
+0:55                  0 (const int)
+0:55            Constant:
+0:55              0 (const int)
+0:55          Constant:
+0:55            0 (const int)
+0:55        subgroupMin ( temp uint)
+0:55          direct index ( temp uint)
+0:55            u: direct index for structure ( temp 4-component vector of uint)
+0:55              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:55                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:55                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:55                  Constant:
+0:55                    0 (const uint)
+0:55                direct index ( temp uint)
+0:55                  'dti' ( in 3-component vector of uint)
+0:55                  Constant:
+0:55                    0 (const int)
+0:55              Constant:
+0:55                0 (const int)
+0:55            Constant:
+0:55              0 (const int)
+0:56      move second child to first child ( temp 2-component vector of uint)
+0:56        vector swizzle ( temp 2-component vector of uint)
+0:56          u: direct index for structure ( temp 4-component vector of uint)
+0:56            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:56              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:56                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:56                Constant:
+0:56                  0 (const uint)
+0:56              direct index ( temp uint)
+0:56                'dti' ( in 3-component vector of uint)
+0:56                Constant:
+0:56                  0 (const int)
+0:56            Constant:
+0:56              0 (const int)
+0:56          Sequence
+0:56            Constant:
+0:56              0 (const int)
+0:56            Constant:
+0:56              1 (const int)
+0:56        subgroupMin ( temp 2-component vector of uint)
+0:56          vector swizzle ( temp 2-component vector of uint)
+0:56            u: direct index for structure ( temp 4-component vector of uint)
+0:56              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:56                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:56                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:56                  Constant:
+0:56                    0 (const uint)
+0:56                direct index ( temp uint)
+0:56                  'dti' ( in 3-component vector of uint)
+0:56                  Constant:
+0:56                    0 (const int)
+0:56              Constant:
+0:56                0 (const int)
+0:56            Sequence
+0:56              Constant:
+0:56                0 (const int)
+0:56              Constant:
+0:56                1 (const int)
+0:57      move second child to first child ( temp 3-component vector of uint)
+0:57        vector swizzle ( temp 3-component vector of uint)
+0:57          u: direct index for structure ( temp 4-component vector of uint)
+0:57            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:57              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:57                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:57                Constant:
+0:57                  0 (const uint)
+0:57              direct index ( temp uint)
+0:57                'dti' ( in 3-component vector of uint)
+0:57                Constant:
+0:57                  0 (const int)
+0:57            Constant:
+0:57              0 (const int)
+0:57          Sequence
+0:57            Constant:
+0:57              0 (const int)
+0:57            Constant:
+0:57              1 (const int)
+0:57            Constant:
+0:57              2 (const int)
+0:57        subgroupMin ( temp 3-component vector of uint)
+0:57          vector swizzle ( temp 3-component vector of uint)
+0:57            u: direct index for structure ( temp 4-component vector of uint)
+0:57              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:57                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:57                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:57                  Constant:
+0:57                    0 (const uint)
+0:57                direct index ( temp uint)
+0:57                  'dti' ( in 3-component vector of uint)
+0:57                  Constant:
+0:57                    0 (const int)
+0:57              Constant:
+0:57                0 (const int)
+0:57            Sequence
+0:57              Constant:
+0:57                0 (const int)
+0:57              Constant:
+0:57                1 (const int)
+0:57              Constant:
+0:57                2 (const int)
+0:59      move second child to first child ( temp 4-component vector of int)
+0:59        i: direct index for structure ( temp 4-component vector of int)
+0:59          indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:59            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:59              'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:59              Constant:
+0:59                0 (const uint)
+0:59            direct index ( temp uint)
+0:59              'dti' ( in 3-component vector of uint)
+0:59              Constant:
+0:59                0 (const int)
+0:59          Constant:
+0:59            1 (const int)
+0:59        subgroupMin ( temp 4-component vector of int)
+0:59          i: direct index for structure ( temp 4-component vector of int)
+0:59            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:59              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:59                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:59                Constant:
+0:59                  0 (const uint)
+0:59              direct index ( temp uint)
+0:59                'dti' ( in 3-component vector of uint)
+0:59                Constant:
+0:59                  0 (const int)
+0:59            Constant:
+0:59              1 (const int)
+0:60      move second child to first child ( temp int)
+0:60        direct index ( temp int)
+0:60          i: direct index for structure ( temp 4-component vector of int)
+0:60            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:60              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:60                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:60                Constant:
+0:60                  0 (const uint)
+0:60              direct index ( temp uint)
+0:60                'dti' ( in 3-component vector of uint)
+0:60                Constant:
+0:60                  0 (const int)
+0:60            Constant:
+0:60              1 (const int)
+0:60          Constant:
+0:60            0 (const int)
+0:60        subgroupMin ( temp int)
+0:60          direct index ( temp int)
+0:60            i: direct index for structure ( temp 4-component vector of int)
+0:60              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:60                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:60                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:60                  Constant:
+0:60                    0 (const uint)
+0:60                direct index ( temp uint)
+0:60                  'dti' ( in 3-component vector of uint)
+0:60                  Constant:
+0:60                    0 (const int)
+0:60              Constant:
+0:60                1 (const int)
+0:60            Constant:
+0:60              0 (const int)
+0:61      move second child to first child ( temp 2-component vector of int)
+0:61        vector swizzle ( temp 2-component vector of int)
+0:61          i: direct index for structure ( temp 4-component vector of int)
+0:61            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:61              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:61                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:61                Constant:
+0:61                  0 (const uint)
+0:61              direct index ( temp uint)
+0:61                'dti' ( in 3-component vector of uint)
+0:61                Constant:
+0:61                  0 (const int)
+0:61            Constant:
+0:61              1 (const int)
+0:61          Sequence
+0:61            Constant:
+0:61              0 (const int)
+0:61            Constant:
+0:61              1 (const int)
+0:61        subgroupMin ( temp 2-component vector of int)
+0:61          vector swizzle ( temp 2-component vector of int)
+0:61            i: direct index for structure ( temp 4-component vector of int)
+0:61              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:61                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:61                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:61                  Constant:
+0:61                    0 (const uint)
+0:61                direct index ( temp uint)
+0:61                  'dti' ( in 3-component vector of uint)
+0:61                  Constant:
+0:61                    0 (const int)
+0:61              Constant:
+0:61                1 (const int)
+0:61            Sequence
+0:61              Constant:
+0:61                0 (const int)
+0:61              Constant:
+0:61                1 (const int)
+0:62      move second child to first child ( temp 3-component vector of int)
+0:62        vector swizzle ( temp 3-component vector of int)
+0:62          i: direct index for structure ( temp 4-component vector of int)
+0:62            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:62              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:62                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:62                Constant:
+0:62                  0 (const uint)
+0:62              direct index ( temp uint)
+0:62                'dti' ( in 3-component vector of uint)
+0:62                Constant:
+0:62                  0 (const int)
+0:62            Constant:
+0:62              1 (const int)
+0:62          Sequence
+0:62            Constant:
+0:62              0 (const int)
+0:62            Constant:
+0:62              1 (const int)
+0:62            Constant:
+0:62              2 (const int)
+0:62        subgroupMin ( temp 3-component vector of int)
+0:62          vector swizzle ( temp 3-component vector of int)
+0:62            i: direct index for structure ( temp 4-component vector of int)
+0:62              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:62                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:62                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:62                  Constant:
+0:62                    0 (const uint)
+0:62                direct index ( temp uint)
+0:62                  'dti' ( in 3-component vector of uint)
+0:62                  Constant:
+0:62                    0 (const int)
+0:62              Constant:
+0:62                1 (const int)
+0:62            Sequence
+0:62              Constant:
+0:62                0 (const int)
+0:62              Constant:
+0:62                1 (const int)
+0:62              Constant:
+0:62                2 (const int)
+0:64      move second child to first child ( temp 4-component vector of float)
+0:64        f: direct index for structure ( temp 4-component vector of float)
+0:64          indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:64            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:64              'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:64              Constant:
+0:64                0 (const uint)
+0:64            direct index ( temp uint)
+0:64              'dti' ( in 3-component vector of uint)
+0:64              Constant:
+0:64                0 (const int)
+0:64          Constant:
+0:64            2 (const int)
+0:64        subgroupMin ( temp 4-component vector of float)
+0:64          f: direct index for structure ( temp 4-component vector of float)
+0:64            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:64              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:64                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:64                Constant:
+0:64                  0 (const uint)
+0:64              direct index ( temp uint)
+0:64                'dti' ( in 3-component vector of uint)
+0:64                Constant:
+0:64                  0 (const int)
+0:64            Constant:
+0:64              2 (const int)
+0:65      move second child to first child ( temp float)
+0:65        direct index ( temp float)
+0:65          f: direct index for structure ( temp 4-component vector of float)
+0:65            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:65              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:65                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:65                Constant:
+0:65                  0 (const uint)
+0:65              direct index ( temp uint)
+0:65                'dti' ( in 3-component vector of uint)
+0:65                Constant:
+0:65                  0 (const int)
+0:65            Constant:
+0:65              2 (const int)
+0:65          Constant:
+0:65            0 (const int)
+0:65        subgroupMin ( temp float)
+0:65          direct index ( temp float)
+0:65            f: direct index for structure ( temp 4-component vector of float)
+0:65              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:65                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:65                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:65                  Constant:
+0:65                    0 (const uint)
+0:65                direct index ( temp uint)
+0:65                  'dti' ( in 3-component vector of uint)
+0:65                  Constant:
+0:65                    0 (const int)
+0:65              Constant:
+0:65                2 (const int)
+0:65            Constant:
+0:65              0 (const int)
+0:66      move second child to first child ( temp 2-component vector of float)
+0:66        vector swizzle ( temp 2-component vector of float)
+0:66          f: direct index for structure ( temp 4-component vector of float)
+0:66            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:66              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:66                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:66                Constant:
+0:66                  0 (const uint)
+0:66              direct index ( temp uint)
+0:66                'dti' ( in 3-component vector of uint)
+0:66                Constant:
+0:66                  0 (const int)
+0:66            Constant:
+0:66              2 (const int)
+0:66          Sequence
+0:66            Constant:
+0:66              0 (const int)
+0:66            Constant:
+0:66              1 (const int)
+0:66        subgroupMin ( temp 2-component vector of float)
+0:66          vector swizzle ( temp 2-component vector of float)
+0:66            f: direct index for structure ( temp 4-component vector of float)
+0:66              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:66                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:66                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:66                  Constant:
+0:66                    0 (const uint)
+0:66                direct index ( temp uint)
+0:66                  'dti' ( in 3-component vector of uint)
+0:66                  Constant:
+0:66                    0 (const int)
+0:66              Constant:
+0:66                2 (const int)
+0:66            Sequence
+0:66              Constant:
+0:66                0 (const int)
+0:66              Constant:
+0:66                1 (const int)
+0:67      move second child to first child ( temp 3-component vector of float)
+0:67        vector swizzle ( temp 3-component vector of float)
+0:67          f: direct index for structure ( temp 4-component vector of float)
+0:67            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:67              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:67                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:67                Constant:
+0:67                  0 (const uint)
+0:67              direct index ( temp uint)
+0:67                'dti' ( in 3-component vector of uint)
+0:67                Constant:
+0:67                  0 (const int)
+0:67            Constant:
+0:67              2 (const int)
+0:67          Sequence
+0:67            Constant:
+0:67              0 (const int)
+0:67            Constant:
+0:67              1 (const int)
+0:67            Constant:
+0:67              2 (const int)
+0:67        subgroupMin ( temp 3-component vector of float)
+0:67          vector swizzle ( temp 3-component vector of float)
+0:67            f: direct index for structure ( temp 4-component vector of float)
+0:67              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:67                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:67                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:67                  Constant:
+0:67                    0 (const uint)
+0:67                direct index ( temp uint)
+0:67                  'dti' ( in 3-component vector of uint)
+0:67                  Constant:
+0:67                    0 (const int)
+0:67              Constant:
+0:67                2 (const int)
+0:67            Sequence
+0:67              Constant:
+0:67                0 (const int)
+0:67              Constant:
+0:67                1 (const int)
+0:67              Constant:
+0:67                2 (const int)
+0:69      move second child to first child ( temp 4-component vector of double)
+0:69        d: direct index for structure ( temp 4-component vector of double)
+0:69          indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:69            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:69              'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:69              Constant:
+0:69                0 (const uint)
+0:69            direct index ( temp uint)
+0:69              'dti' ( in 3-component vector of uint)
+0:69              Constant:
+0:69                0 (const int)
+0:69          Constant:
+0:69            3 (const int)
+0:69        subgroupMin ( temp 4-component vector of double)
+0:69          d: direct index for structure ( temp 4-component vector of double)
+0:69            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:69              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:69                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:69                Constant:
+0:69                  0 (const uint)
+0:69              direct index ( temp uint)
+0:69                'dti' ( in 3-component vector of uint)
+0:69                Constant:
+0:69                  0 (const int)
+0:69            Constant:
+0:69              3 (const int)
+0:70      move second child to first child ( temp double)
+0:70        direct index ( temp double)
+0:70          d: direct index for structure ( temp 4-component vector of double)
+0:70            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:70              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:70                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:70                Constant:
+0:70                  0 (const uint)
+0:70              direct index ( temp uint)
+0:70                'dti' ( in 3-component vector of uint)
+0:70                Constant:
+0:70                  0 (const int)
+0:70            Constant:
+0:70              3 (const int)
+0:70          Constant:
+0:70            0 (const int)
+0:70        subgroupMin ( temp double)
+0:70          direct index ( temp double)
+0:70            d: direct index for structure ( temp 4-component vector of double)
+0:70              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:70                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:70                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:70                  Constant:
+0:70                    0 (const uint)
+0:70                direct index ( temp uint)
+0:70                  'dti' ( in 3-component vector of uint)
+0:70                  Constant:
+0:70                    0 (const int)
+0:70              Constant:
+0:70                3 (const int)
+0:70            Constant:
+0:70              0 (const int)
+0:71      move second child to first child ( temp 2-component vector of double)
+0:71        vector swizzle ( temp 2-component vector of double)
+0:71          d: direct index for structure ( temp 4-component vector of double)
+0:71            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:71              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:71                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:71                Constant:
+0:71                  0 (const uint)
+0:71              direct index ( temp uint)
+0:71                'dti' ( in 3-component vector of uint)
+0:71                Constant:
+0:71                  0 (const int)
+0:71            Constant:
+0:71              3 (const int)
+0:71          Sequence
+0:71            Constant:
+0:71              0 (const int)
+0:71            Constant:
+0:71              1 (const int)
+0:71        subgroupMin ( temp 2-component vector of double)
+0:71          vector swizzle ( temp 2-component vector of double)
+0:71            d: direct index for structure ( temp 4-component vector of double)
+0:71              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:71                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:71                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:71                  Constant:
+0:71                    0 (const uint)
+0:71                direct index ( temp uint)
+0:71                  'dti' ( in 3-component vector of uint)
+0:71                  Constant:
+0:71                    0 (const int)
+0:71              Constant:
+0:71                3 (const int)
+0:71            Sequence
+0:71              Constant:
+0:71                0 (const int)
+0:71              Constant:
+0:71                1 (const int)
+0:72      move second child to first child ( temp 3-component vector of double)
+0:72        vector swizzle ( temp 3-component vector of double)
+0:72          d: direct index for structure ( temp 4-component vector of double)
+0:72            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:72              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:72                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:72                Constant:
+0:72                  0 (const uint)
+0:72              direct index ( temp uint)
+0:72                'dti' ( in 3-component vector of uint)
+0:72                Constant:
+0:72                  0 (const int)
+0:72            Constant:
+0:72              3 (const int)
+0:72          Sequence
+0:72            Constant:
+0:72              0 (const int)
+0:72            Constant:
+0:72              1 (const int)
+0:72            Constant:
+0:72              2 (const int)
+0:72        subgroupMin ( temp 3-component vector of double)
+0:72          vector swizzle ( temp 3-component vector of double)
+0:72            d: direct index for structure ( temp 4-component vector of double)
+0:72              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:72                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:72                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:72                  Constant:
+0:72                    0 (const uint)
+0:72                direct index ( temp uint)
+0:72                  'dti' ( in 3-component vector of uint)
+0:72                  Constant:
+0:72                    0 (const int)
+0:72              Constant:
+0:72                3 (const int)
+0:72            Sequence
+0:72              Constant:
+0:72                0 (const int)
+0:72              Constant:
+0:72                1 (const int)
+0:72              Constant:
+0:72                2 (const int)
+0:74      move second child to first child ( temp 4-component vector of uint)
+0:74        u: direct index for structure ( temp 4-component vector of uint)
+0:74          indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:74            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:74              'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:74              Constant:
+0:74                0 (const uint)
+0:74            direct index ( temp uint)
+0:74              'dti' ( in 3-component vector of uint)
+0:74              Constant:
+0:74                0 (const int)
+0:74          Constant:
+0:74            0 (const int)
+0:74        subgroupMax ( temp 4-component vector of uint)
+0:74          u: direct index for structure ( temp 4-component vector of uint)
+0:74            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:74              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:74                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:74                Constant:
+0:74                  0 (const uint)
+0:74              direct index ( temp uint)
+0:74                'dti' ( in 3-component vector of uint)
+0:74                Constant:
+0:74                  0 (const int)
+0:74            Constant:
+0:74              0 (const int)
+0:75      move second child to first child ( temp uint)
+0:75        direct index ( temp uint)
+0:75          u: direct index for structure ( temp 4-component vector of uint)
+0:75            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:75              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:75                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:75                Constant:
+0:75                  0 (const uint)
+0:75              direct index ( temp uint)
+0:75                'dti' ( in 3-component vector of uint)
+0:75                Constant:
+0:75                  0 (const int)
+0:75            Constant:
+0:75              0 (const int)
+0:75          Constant:
+0:75            0 (const int)
+0:75        subgroupMax ( temp uint)
+0:75          direct index ( temp uint)
+0:75            u: direct index for structure ( temp 4-component vector of uint)
+0:75              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:75                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:75                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:75                  Constant:
+0:75                    0 (const uint)
+0:75                direct index ( temp uint)
+0:75                  'dti' ( in 3-component vector of uint)
+0:75                  Constant:
+0:75                    0 (const int)
+0:75              Constant:
+0:75                0 (const int)
+0:75            Constant:
+0:75              0 (const int)
+0:76      move second child to first child ( temp 2-component vector of uint)
+0:76        vector swizzle ( temp 2-component vector of uint)
+0:76          u: direct index for structure ( temp 4-component vector of uint)
+0:76            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:76              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:76                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:76                Constant:
+0:76                  0 (const uint)
+0:76              direct index ( temp uint)
+0:76                'dti' ( in 3-component vector of uint)
+0:76                Constant:
+0:76                  0 (const int)
+0:76            Constant:
+0:76              0 (const int)
+0:76          Sequence
+0:76            Constant:
+0:76              0 (const int)
+0:76            Constant:
+0:76              1 (const int)
+0:76        subgroupMax ( temp 2-component vector of uint)
+0:76          vector swizzle ( temp 2-component vector of uint)
+0:76            u: direct index for structure ( temp 4-component vector of uint)
+0:76              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:76                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:76                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:76                  Constant:
+0:76                    0 (const uint)
+0:76                direct index ( temp uint)
+0:76                  'dti' ( in 3-component vector of uint)
+0:76                  Constant:
+0:76                    0 (const int)
+0:76              Constant:
+0:76                0 (const int)
+0:76            Sequence
+0:76              Constant:
+0:76                0 (const int)
+0:76              Constant:
+0:76                1 (const int)
+0:77      move second child to first child ( temp 3-component vector of uint)
+0:77        vector swizzle ( temp 3-component vector of uint)
+0:77          u: direct index for structure ( temp 4-component vector of uint)
+0:77            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:77              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:77                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:77                Constant:
+0:77                  0 (const uint)
+0:77              direct index ( temp uint)
+0:77                'dti' ( in 3-component vector of uint)
+0:77                Constant:
+0:77                  0 (const int)
+0:77            Constant:
+0:77              0 (const int)
+0:77          Sequence
+0:77            Constant:
+0:77              0 (const int)
+0:77            Constant:
+0:77              1 (const int)
+0:77            Constant:
+0:77              2 (const int)
+0:77        subgroupMax ( temp 3-component vector of uint)
+0:77          vector swizzle ( temp 3-component vector of uint)
+0:77            u: direct index for structure ( temp 4-component vector of uint)
+0:77              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:77                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:77                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:77                  Constant:
+0:77                    0 (const uint)
+0:77                direct index ( temp uint)
+0:77                  'dti' ( in 3-component vector of uint)
+0:77                  Constant:
+0:77                    0 (const int)
+0:77              Constant:
+0:77                0 (const int)
+0:77            Sequence
+0:77              Constant:
+0:77                0 (const int)
+0:77              Constant:
+0:77                1 (const int)
+0:77              Constant:
+0:77                2 (const int)
+0:79      move second child to first child ( temp 4-component vector of int)
+0:79        i: direct index for structure ( temp 4-component vector of int)
+0:79          indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:79            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:79              'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:79              Constant:
+0:79                0 (const uint)
+0:79            direct index ( temp uint)
+0:79              'dti' ( in 3-component vector of uint)
+0:79              Constant:
+0:79                0 (const int)
+0:79          Constant:
+0:79            1 (const int)
+0:79        subgroupMax ( temp 4-component vector of int)
+0:79          i: direct index for structure ( temp 4-component vector of int)
+0:79            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:79              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:79                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:79                Constant:
+0:79                  0 (const uint)
+0:79              direct index ( temp uint)
+0:79                'dti' ( in 3-component vector of uint)
+0:79                Constant:
+0:79                  0 (const int)
+0:79            Constant:
+0:79              1 (const int)
+0:80      move second child to first child ( temp int)
+0:80        direct index ( temp int)
+0:80          i: direct index for structure ( temp 4-component vector of int)
+0:80            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:80              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:80                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:80                Constant:
+0:80                  0 (const uint)
+0:80              direct index ( temp uint)
+0:80                'dti' ( in 3-component vector of uint)
+0:80                Constant:
+0:80                  0 (const int)
+0:80            Constant:
+0:80              1 (const int)
+0:80          Constant:
+0:80            0 (const int)
+0:80        subgroupMax ( temp int)
+0:80          direct index ( temp int)
+0:80            i: direct index for structure ( temp 4-component vector of int)
+0:80              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:80                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:80                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:80                  Constant:
+0:80                    0 (const uint)
+0:80                direct index ( temp uint)
+0:80                  'dti' ( in 3-component vector of uint)
+0:80                  Constant:
+0:80                    0 (const int)
+0:80              Constant:
+0:80                1 (const int)
+0:80            Constant:
+0:80              0 (const int)
+0:81      move second child to first child ( temp 2-component vector of int)
+0:81        vector swizzle ( temp 2-component vector of int)
+0:81          i: direct index for structure ( temp 4-component vector of int)
+0:81            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:81              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:81                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:81                Constant:
+0:81                  0 (const uint)
+0:81              direct index ( temp uint)
+0:81                'dti' ( in 3-component vector of uint)
+0:81                Constant:
+0:81                  0 (const int)
+0:81            Constant:
+0:81              1 (const int)
+0:81          Sequence
+0:81            Constant:
+0:81              0 (const int)
+0:81            Constant:
+0:81              1 (const int)
+0:81        subgroupMax ( temp 2-component vector of int)
+0:81          vector swizzle ( temp 2-component vector of int)
+0:81            i: direct index for structure ( temp 4-component vector of int)
+0:81              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:81                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:81                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:81                  Constant:
+0:81                    0 (const uint)
+0:81                direct index ( temp uint)
+0:81                  'dti' ( in 3-component vector of uint)
+0:81                  Constant:
+0:81                    0 (const int)
+0:81              Constant:
+0:81                1 (const int)
+0:81            Sequence
+0:81              Constant:
+0:81                0 (const int)
+0:81              Constant:
+0:81                1 (const int)
+0:82      move second child to first child ( temp 3-component vector of int)
+0:82        vector swizzle ( temp 3-component vector of int)
+0:82          i: direct index for structure ( temp 4-component vector of int)
+0:82            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:82              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:82                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:82                Constant:
+0:82                  0 (const uint)
+0:82              direct index ( temp uint)
+0:82                'dti' ( in 3-component vector of uint)
+0:82                Constant:
+0:82                  0 (const int)
+0:82            Constant:
+0:82              1 (const int)
+0:82          Sequence
+0:82            Constant:
+0:82              0 (const int)
+0:82            Constant:
+0:82              1 (const int)
+0:82            Constant:
+0:82              2 (const int)
+0:82        subgroupMax ( temp 3-component vector of int)
+0:82          vector swizzle ( temp 3-component vector of int)
+0:82            i: direct index for structure ( temp 4-component vector of int)
+0:82              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:82                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:82                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:82                  Constant:
+0:82                    0 (const uint)
+0:82                direct index ( temp uint)
+0:82                  'dti' ( in 3-component vector of uint)
+0:82                  Constant:
+0:82                    0 (const int)
+0:82              Constant:
+0:82                1 (const int)
+0:82            Sequence
+0:82              Constant:
+0:82                0 (const int)
+0:82              Constant:
+0:82                1 (const int)
+0:82              Constant:
+0:82                2 (const int)
+0:84      move second child to first child ( temp 4-component vector of float)
+0:84        f: direct index for structure ( temp 4-component vector of float)
+0:84          indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:84            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:84              'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:84              Constant:
+0:84                0 (const uint)
+0:84            direct index ( temp uint)
+0:84              'dti' ( in 3-component vector of uint)
+0:84              Constant:
+0:84                0 (const int)
+0:84          Constant:
+0:84            2 (const int)
+0:84        subgroupMax ( temp 4-component vector of float)
+0:84          f: direct index for structure ( temp 4-component vector of float)
+0:84            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:84              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:84                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:84                Constant:
+0:84                  0 (const uint)
+0:84              direct index ( temp uint)
+0:84                'dti' ( in 3-component vector of uint)
+0:84                Constant:
+0:84                  0 (const int)
+0:84            Constant:
+0:84              2 (const int)
+0:85      move second child to first child ( temp float)
+0:85        direct index ( temp float)
+0:85          f: direct index for structure ( temp 4-component vector of float)
+0:85            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:85              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:85                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:85                Constant:
+0:85                  0 (const uint)
+0:85              direct index ( temp uint)
+0:85                'dti' ( in 3-component vector of uint)
+0:85                Constant:
+0:85                  0 (const int)
+0:85            Constant:
+0:85              2 (const int)
+0:85          Constant:
+0:85            0 (const int)
+0:85        subgroupMax ( temp float)
+0:85          direct index ( temp float)
+0:85            f: direct index for structure ( temp 4-component vector of float)
+0:85              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:85                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:85                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:85                  Constant:
+0:85                    0 (const uint)
+0:85                direct index ( temp uint)
+0:85                  'dti' ( in 3-component vector of uint)
+0:85                  Constant:
+0:85                    0 (const int)
+0:85              Constant:
+0:85                2 (const int)
+0:85            Constant:
+0:85              0 (const int)
+0:86      move second child to first child ( temp 2-component vector of float)
+0:86        vector swizzle ( temp 2-component vector of float)
+0:86          f: direct index for structure ( temp 4-component vector of float)
+0:86            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:86              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:86                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:86                Constant:
+0:86                  0 (const uint)
+0:86              direct index ( temp uint)
+0:86                'dti' ( in 3-component vector of uint)
+0:86                Constant:
+0:86                  0 (const int)
+0:86            Constant:
+0:86              2 (const int)
+0:86          Sequence
+0:86            Constant:
+0:86              0 (const int)
+0:86            Constant:
+0:86              1 (const int)
+0:86        subgroupMax ( temp 2-component vector of float)
+0:86          vector swizzle ( temp 2-component vector of float)
+0:86            f: direct index for structure ( temp 4-component vector of float)
+0:86              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:86                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:86                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:86                  Constant:
+0:86                    0 (const uint)
+0:86                direct index ( temp uint)
+0:86                  'dti' ( in 3-component vector of uint)
+0:86                  Constant:
+0:86                    0 (const int)
+0:86              Constant:
+0:86                2 (const int)
+0:86            Sequence
+0:86              Constant:
+0:86                0 (const int)
+0:86              Constant:
+0:86                1 (const int)
+0:87      move second child to first child ( temp 3-component vector of float)
+0:87        vector swizzle ( temp 3-component vector of float)
+0:87          f: direct index for structure ( temp 4-component vector of float)
+0:87            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:87              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:87                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:87                Constant:
+0:87                  0 (const uint)
+0:87              direct index ( temp uint)
+0:87                'dti' ( in 3-component vector of uint)
+0:87                Constant:
+0:87                  0 (const int)
+0:87            Constant:
+0:87              2 (const int)
+0:87          Sequence
+0:87            Constant:
+0:87              0 (const int)
+0:87            Constant:
+0:87              1 (const int)
+0:87            Constant:
+0:87              2 (const int)
+0:87        subgroupMax ( temp 3-component vector of float)
+0:87          vector swizzle ( temp 3-component vector of float)
+0:87            f: direct index for structure ( temp 4-component vector of float)
+0:87              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:87                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:87                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:87                  Constant:
+0:87                    0 (const uint)
+0:87                direct index ( temp uint)
+0:87                  'dti' ( in 3-component vector of uint)
+0:87                  Constant:
+0:87                    0 (const int)
+0:87              Constant:
+0:87                2 (const int)
+0:87            Sequence
+0:87              Constant:
+0:87                0 (const int)
+0:87              Constant:
+0:87                1 (const int)
+0:87              Constant:
+0:87                2 (const int)
+0:89      move second child to first child ( temp 4-component vector of double)
+0:89        d: direct index for structure ( temp 4-component vector of double)
+0:89          indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:89            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:89              'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:89              Constant:
+0:89                0 (const uint)
+0:89            direct index ( temp uint)
+0:89              'dti' ( in 3-component vector of uint)
+0:89              Constant:
+0:89                0 (const int)
+0:89          Constant:
+0:89            3 (const int)
+0:89        subgroupMax ( temp 4-component vector of double)
+0:89          d: direct index for structure ( temp 4-component vector of double)
+0:89            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:89              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:89                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:89                Constant:
+0:89                  0 (const uint)
+0:89              direct index ( temp uint)
+0:89                'dti' ( in 3-component vector of uint)
+0:89                Constant:
+0:89                  0 (const int)
+0:89            Constant:
+0:89              3 (const int)
+0:90      move second child to first child ( temp double)
+0:90        direct index ( temp double)
+0:90          d: direct index for structure ( temp 4-component vector of double)
+0:90            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:90              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:90                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:90                Constant:
+0:90                  0 (const uint)
+0:90              direct index ( temp uint)
+0:90                'dti' ( in 3-component vector of uint)
+0:90                Constant:
+0:90                  0 (const int)
+0:90            Constant:
+0:90              3 (const int)
+0:90          Constant:
+0:90            0 (const int)
+0:90        subgroupMax ( temp double)
+0:90          direct index ( temp double)
+0:90            d: direct index for structure ( temp 4-component vector of double)
+0:90              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:90                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:90                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:90                  Constant:
+0:90                    0 (const uint)
+0:90                direct index ( temp uint)
+0:90                  'dti' ( in 3-component vector of uint)
+0:90                  Constant:
+0:90                    0 (const int)
+0:90              Constant:
+0:90                3 (const int)
+0:90            Constant:
+0:90              0 (const int)
+0:91      move second child to first child ( temp 2-component vector of double)
+0:91        vector swizzle ( temp 2-component vector of double)
+0:91          d: direct index for structure ( temp 4-component vector of double)
+0:91            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:91              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:91                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:91                Constant:
+0:91                  0 (const uint)
+0:91              direct index ( temp uint)
+0:91                'dti' ( in 3-component vector of uint)
+0:91                Constant:
+0:91                  0 (const int)
+0:91            Constant:
+0:91              3 (const int)
+0:91          Sequence
+0:91            Constant:
+0:91              0 (const int)
+0:91            Constant:
+0:91              1 (const int)
+0:91        subgroupMax ( temp 2-component vector of double)
+0:91          vector swizzle ( temp 2-component vector of double)
+0:91            d: direct index for structure ( temp 4-component vector of double)
+0:91              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:91                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:91                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:91                  Constant:
+0:91                    0 (const uint)
+0:91                direct index ( temp uint)
+0:91                  'dti' ( in 3-component vector of uint)
+0:91                  Constant:
+0:91                    0 (const int)
+0:91              Constant:
+0:91                3 (const int)
+0:91            Sequence
+0:91              Constant:
+0:91                0 (const int)
+0:91              Constant:
+0:91                1 (const int)
+0:92      move second child to first child ( temp 3-component vector of double)
+0:92        vector swizzle ( temp 3-component vector of double)
+0:92          d: direct index for structure ( temp 4-component vector of double)
+0:92            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:92              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:92                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:92                Constant:
+0:92                  0 (const uint)
+0:92              direct index ( temp uint)
+0:92                'dti' ( in 3-component vector of uint)
+0:92                Constant:
+0:92                  0 (const int)
+0:92            Constant:
+0:92              3 (const int)
+0:92          Sequence
+0:92            Constant:
+0:92              0 (const int)
+0:92            Constant:
+0:92              1 (const int)
+0:92            Constant:
+0:92              2 (const int)
+0:92        subgroupMax ( temp 3-component vector of double)
+0:92          vector swizzle ( temp 3-component vector of double)
+0:92            d: direct index for structure ( temp 4-component vector of double)
+0:92              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:92                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:92                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:92                  Constant:
+0:92                    0 (const uint)
+0:92                direct index ( temp uint)
+0:92                  'dti' ( in 3-component vector of uint)
+0:92                  Constant:
+0:92                    0 (const int)
+0:92              Constant:
+0:92                3 (const int)
+0:92            Sequence
+0:92              Constant:
+0:92                0 (const int)
+0:92              Constant:
+0:92                1 (const int)
+0:92              Constant:
+0:92                2 (const int)
+0:94      move second child to first child ( temp 4-component vector of uint)
+0:94        u: direct index for structure ( temp 4-component vector of uint)
+0:94          indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:94            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:94              'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:94              Constant:
+0:94                0 (const uint)
+0:94            direct index ( temp uint)
+0:94              'dti' ( in 3-component vector of uint)
+0:94              Constant:
+0:94                0 (const int)
+0:94          Constant:
+0:94            0 (const int)
+0:94        subgroupAnd ( temp 4-component vector of uint)
+0:94          u: direct index for structure ( temp 4-component vector of uint)
+0:94            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:94              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:94                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:94                Constant:
+0:94                  0 (const uint)
+0:94              direct index ( temp uint)
+0:94                'dti' ( in 3-component vector of uint)
+0:94                Constant:
+0:94                  0 (const int)
+0:94            Constant:
+0:94              0 (const int)
+0:95      move second child to first child ( temp uint)
+0:95        direct index ( temp uint)
+0:95          u: direct index for structure ( temp 4-component vector of uint)
+0:95            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:95              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:95                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:95                Constant:
+0:95                  0 (const uint)
+0:95              direct index ( temp uint)
+0:95                'dti' ( in 3-component vector of uint)
+0:95                Constant:
+0:95                  0 (const int)
+0:95            Constant:
+0:95              0 (const int)
+0:95          Constant:
+0:95            0 (const int)
+0:95        subgroupAnd ( temp uint)
+0:95          direct index ( temp uint)
+0:95            u: direct index for structure ( temp 4-component vector of uint)
+0:95              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:95                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:95                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:95                  Constant:
+0:95                    0 (const uint)
+0:95                direct index ( temp uint)
+0:95                  'dti' ( in 3-component vector of uint)
+0:95                  Constant:
+0:95                    0 (const int)
+0:95              Constant:
+0:95                0 (const int)
+0:95            Constant:
+0:95              0 (const int)
+0:96      move second child to first child ( temp 2-component vector of uint)
+0:96        vector swizzle ( temp 2-component vector of uint)
+0:96          u: direct index for structure ( temp 4-component vector of uint)
+0:96            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:96              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:96                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:96                Constant:
+0:96                  0 (const uint)
+0:96              direct index ( temp uint)
+0:96                'dti' ( in 3-component vector of uint)
+0:96                Constant:
+0:96                  0 (const int)
+0:96            Constant:
+0:96              0 (const int)
+0:96          Sequence
+0:96            Constant:
+0:96              0 (const int)
+0:96            Constant:
+0:96              1 (const int)
+0:96        subgroupAnd ( temp 2-component vector of uint)
+0:96          vector swizzle ( temp 2-component vector of uint)
+0:96            u: direct index for structure ( temp 4-component vector of uint)
+0:96              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:96                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:96                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:96                  Constant:
+0:96                    0 (const uint)
+0:96                direct index ( temp uint)
+0:96                  'dti' ( in 3-component vector of uint)
+0:96                  Constant:
+0:96                    0 (const int)
+0:96              Constant:
+0:96                0 (const int)
+0:96            Sequence
+0:96              Constant:
+0:96                0 (const int)
+0:96              Constant:
+0:96                1 (const int)
+0:97      move second child to first child ( temp 3-component vector of uint)
+0:97        vector swizzle ( temp 3-component vector of uint)
+0:97          u: direct index for structure ( temp 4-component vector of uint)
+0:97            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:97              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:97                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:97                Constant:
+0:97                  0 (const uint)
+0:97              direct index ( temp uint)
+0:97                'dti' ( in 3-component vector of uint)
+0:97                Constant:
+0:97                  0 (const int)
+0:97            Constant:
+0:97              0 (const int)
+0:97          Sequence
+0:97            Constant:
+0:97              0 (const int)
+0:97            Constant:
+0:97              1 (const int)
+0:97            Constant:
+0:97              2 (const int)
+0:97        subgroupAnd ( temp 3-component vector of uint)
+0:97          vector swizzle ( temp 3-component vector of uint)
+0:97            u: direct index for structure ( temp 4-component vector of uint)
+0:97              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:97                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:97                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:97                  Constant:
+0:97                    0 (const uint)
+0:97                direct index ( temp uint)
+0:97                  'dti' ( in 3-component vector of uint)
+0:97                  Constant:
+0:97                    0 (const int)
+0:97              Constant:
+0:97                0 (const int)
+0:97            Sequence
+0:97              Constant:
+0:97                0 (const int)
+0:97              Constant:
+0:97                1 (const int)
+0:97              Constant:
+0:97                2 (const int)
+0:99      move second child to first child ( temp 4-component vector of int)
+0:99        i: direct index for structure ( temp 4-component vector of int)
+0:99          indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:99            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:99              'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:99              Constant:
+0:99                0 (const uint)
+0:99            direct index ( temp uint)
+0:99              'dti' ( in 3-component vector of uint)
+0:99              Constant:
+0:99                0 (const int)
+0:99          Constant:
+0:99            1 (const int)
+0:99        subgroupAnd ( temp 4-component vector of int)
+0:99          i: direct index for structure ( temp 4-component vector of int)
+0:99            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:99              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:99                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:99                Constant:
+0:99                  0 (const uint)
+0:99              direct index ( temp uint)
+0:99                'dti' ( in 3-component vector of uint)
+0:99                Constant:
+0:99                  0 (const int)
+0:99            Constant:
+0:99              1 (const int)
+0:100      move second child to first child ( temp int)
+0:100        direct index ( temp int)
+0:100          i: direct index for structure ( temp 4-component vector of int)
+0:100            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:100              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:100                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:100                Constant:
+0:100                  0 (const uint)
+0:100              direct index ( temp uint)
+0:100                'dti' ( in 3-component vector of uint)
+0:100                Constant:
+0:100                  0 (const int)
+0:100            Constant:
+0:100              1 (const int)
+0:100          Constant:
+0:100            0 (const int)
+0:100        subgroupAnd ( temp int)
+0:100          direct index ( temp int)
+0:100            i: direct index for structure ( temp 4-component vector of int)
+0:100              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:100                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:100                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:100                  Constant:
+0:100                    0 (const uint)
+0:100                direct index ( temp uint)
+0:100                  'dti' ( in 3-component vector of uint)
+0:100                  Constant:
+0:100                    0 (const int)
+0:100              Constant:
+0:100                1 (const int)
+0:100            Constant:
+0:100              0 (const int)
+0:101      move second child to first child ( temp 2-component vector of int)
+0:101        vector swizzle ( temp 2-component vector of int)
+0:101          i: direct index for structure ( temp 4-component vector of int)
+0:101            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:101              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:101                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:101                Constant:
+0:101                  0 (const uint)
+0:101              direct index ( temp uint)
+0:101                'dti' ( in 3-component vector of uint)
+0:101                Constant:
+0:101                  0 (const int)
+0:101            Constant:
+0:101              1 (const int)
+0:101          Sequence
+0:101            Constant:
+0:101              0 (const int)
+0:101            Constant:
+0:101              1 (const int)
+0:101        subgroupAnd ( temp 2-component vector of int)
+0:101          vector swizzle ( temp 2-component vector of int)
+0:101            i: direct index for structure ( temp 4-component vector of int)
+0:101              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:101                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:101                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:101                  Constant:
+0:101                    0 (const uint)
+0:101                direct index ( temp uint)
+0:101                  'dti' ( in 3-component vector of uint)
+0:101                  Constant:
+0:101                    0 (const int)
+0:101              Constant:
+0:101                1 (const int)
+0:101            Sequence
+0:101              Constant:
+0:101                0 (const int)
+0:101              Constant:
+0:101                1 (const int)
+0:102      move second child to first child ( temp 3-component vector of int)
+0:102        vector swizzle ( temp 3-component vector of int)
+0:102          i: direct index for structure ( temp 4-component vector of int)
+0:102            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:102              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:102                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:102                Constant:
+0:102                  0 (const uint)
+0:102              direct index ( temp uint)
+0:102                'dti' ( in 3-component vector of uint)
+0:102                Constant:
+0:102                  0 (const int)
+0:102            Constant:
+0:102              1 (const int)
+0:102          Sequence
+0:102            Constant:
+0:102              0 (const int)
+0:102            Constant:
+0:102              1 (const int)
+0:102            Constant:
+0:102              2 (const int)
+0:102        subgroupAnd ( temp 3-component vector of int)
+0:102          vector swizzle ( temp 3-component vector of int)
+0:102            i: direct index for structure ( temp 4-component vector of int)
+0:102              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:102                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:102                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:102                  Constant:
+0:102                    0 (const uint)
+0:102                direct index ( temp uint)
+0:102                  'dti' ( in 3-component vector of uint)
+0:102                  Constant:
+0:102                    0 (const int)
+0:102              Constant:
+0:102                1 (const int)
+0:102            Sequence
+0:102              Constant:
+0:102                0 (const int)
+0:102              Constant:
+0:102                1 (const int)
+0:102              Constant:
+0:102                2 (const int)
+0:104      move second child to first child ( temp 4-component vector of uint)
+0:104        u: direct index for structure ( temp 4-component vector of uint)
+0:104          indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:104            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:104              'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:104              Constant:
+0:104                0 (const uint)
+0:104            direct index ( temp uint)
+0:104              'dti' ( in 3-component vector of uint)
+0:104              Constant:
+0:104                0 (const int)
+0:104          Constant:
+0:104            0 (const int)
+0:104        subgroupOr ( temp 4-component vector of uint)
+0:104          u: direct index for structure ( temp 4-component vector of uint)
+0:104            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:104              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:104                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:104                Constant:
+0:104                  0 (const uint)
+0:104              direct index ( temp uint)
+0:104                'dti' ( in 3-component vector of uint)
+0:104                Constant:
+0:104                  0 (const int)
+0:104            Constant:
+0:104              0 (const int)
+0:105      move second child to first child ( temp uint)
+0:105        direct index ( temp uint)
+0:105          u: direct index for structure ( temp 4-component vector of uint)
+0:105            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:105              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:105                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:105                Constant:
+0:105                  0 (const uint)
+0:105              direct index ( temp uint)
+0:105                'dti' ( in 3-component vector of uint)
+0:105                Constant:
+0:105                  0 (const int)
+0:105            Constant:
+0:105              0 (const int)
+0:105          Constant:
+0:105            0 (const int)
+0:105        subgroupOr ( temp uint)
+0:105          direct index ( temp uint)
+0:105            u: direct index for structure ( temp 4-component vector of uint)
+0:105              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:105                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:105                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:105                  Constant:
+0:105                    0 (const uint)
+0:105                direct index ( temp uint)
+0:105                  'dti' ( in 3-component vector of uint)
+0:105                  Constant:
+0:105                    0 (const int)
+0:105              Constant:
+0:105                0 (const int)
+0:105            Constant:
+0:105              0 (const int)
+0:106      move second child to first child ( temp 2-component vector of uint)
+0:106        vector swizzle ( temp 2-component vector of uint)
+0:106          u: direct index for structure ( temp 4-component vector of uint)
+0:106            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:106              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:106                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:106                Constant:
+0:106                  0 (const uint)
+0:106              direct index ( temp uint)
+0:106                'dti' ( in 3-component vector of uint)
+0:106                Constant:
+0:106                  0 (const int)
+0:106            Constant:
+0:106              0 (const int)
+0:106          Sequence
+0:106            Constant:
+0:106              0 (const int)
+0:106            Constant:
+0:106              1 (const int)
+0:106        subgroupOr ( temp 2-component vector of uint)
+0:106          vector swizzle ( temp 2-component vector of uint)
+0:106            u: direct index for structure ( temp 4-component vector of uint)
+0:106              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:106                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:106                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:106                  Constant:
+0:106                    0 (const uint)
+0:106                direct index ( temp uint)
+0:106                  'dti' ( in 3-component vector of uint)
+0:106                  Constant:
+0:106                    0 (const int)
+0:106              Constant:
+0:106                0 (const int)
+0:106            Sequence
+0:106              Constant:
+0:106                0 (const int)
+0:106              Constant:
+0:106                1 (const int)
+0:107      move second child to first child ( temp 3-component vector of uint)
+0:107        vector swizzle ( temp 3-component vector of uint)
+0:107          u: direct index for structure ( temp 4-component vector of uint)
+0:107            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:107              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:107                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:107                Constant:
+0:107                  0 (const uint)
+0:107              direct index ( temp uint)
+0:107                'dti' ( in 3-component vector of uint)
+0:107                Constant:
+0:107                  0 (const int)
+0:107            Constant:
+0:107              0 (const int)
+0:107          Sequence
+0:107            Constant:
+0:107              0 (const int)
+0:107            Constant:
+0:107              1 (const int)
+0:107            Constant:
+0:107              2 (const int)
+0:107        subgroupOr ( temp 3-component vector of uint)
+0:107          vector swizzle ( temp 3-component vector of uint)
+0:107            u: direct index for structure ( temp 4-component vector of uint)
+0:107              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:107                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:107                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:107                  Constant:
+0:107                    0 (const uint)
+0:107                direct index ( temp uint)
+0:107                  'dti' ( in 3-component vector of uint)
+0:107                  Constant:
+0:107                    0 (const int)
+0:107              Constant:
+0:107                0 (const int)
+0:107            Sequence
+0:107              Constant:
+0:107                0 (const int)
+0:107              Constant:
+0:107                1 (const int)
+0:107              Constant:
+0:107                2 (const int)
+0:109      move second child to first child ( temp 4-component vector of int)
+0:109        i: direct index for structure ( temp 4-component vector of int)
+0:109          indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:109            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:109              'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:109              Constant:
+0:109                0 (const uint)
+0:109            direct index ( temp uint)
+0:109              'dti' ( in 3-component vector of uint)
+0:109              Constant:
+0:109                0 (const int)
+0:109          Constant:
+0:109            1 (const int)
+0:109        subgroupOr ( temp 4-component vector of int)
+0:109          i: direct index for structure ( temp 4-component vector of int)
+0:109            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:109              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:109                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:109                Constant:
+0:109                  0 (const uint)
+0:109              direct index ( temp uint)
+0:109                'dti' ( in 3-component vector of uint)
+0:109                Constant:
+0:109                  0 (const int)
+0:109            Constant:
+0:109              1 (const int)
+0:110      move second child to first child ( temp int)
+0:110        direct index ( temp int)
+0:110          i: direct index for structure ( temp 4-component vector of int)
+0:110            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:110              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:110                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:110                Constant:
+0:110                  0 (const uint)
+0:110              direct index ( temp uint)
+0:110                'dti' ( in 3-component vector of uint)
+0:110                Constant:
+0:110                  0 (const int)
+0:110            Constant:
+0:110              1 (const int)
+0:110          Constant:
+0:110            0 (const int)
+0:110        subgroupOr ( temp int)
+0:110          direct index ( temp int)
+0:110            i: direct index for structure ( temp 4-component vector of int)
+0:110              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:110                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:110                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:110                  Constant:
+0:110                    0 (const uint)
+0:110                direct index ( temp uint)
+0:110                  'dti' ( in 3-component vector of uint)
+0:110                  Constant:
+0:110                    0 (const int)
+0:110              Constant:
+0:110                1 (const int)
+0:110            Constant:
+0:110              0 (const int)
+0:111      move second child to first child ( temp 2-component vector of int)
+0:111        vector swizzle ( temp 2-component vector of int)
+0:111          i: direct index for structure ( temp 4-component vector of int)
+0:111            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:111              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:111                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:111                Constant:
+0:111                  0 (const uint)
+0:111              direct index ( temp uint)
+0:111                'dti' ( in 3-component vector of uint)
+0:111                Constant:
+0:111                  0 (const int)
+0:111            Constant:
+0:111              1 (const int)
+0:111          Sequence
+0:111            Constant:
+0:111              0 (const int)
+0:111            Constant:
+0:111              1 (const int)
+0:111        subgroupOr ( temp 2-component vector of int)
+0:111          vector swizzle ( temp 2-component vector of int)
+0:111            i: direct index for structure ( temp 4-component vector of int)
+0:111              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:111                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:111                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:111                  Constant:
+0:111                    0 (const uint)
+0:111                direct index ( temp uint)
+0:111                  'dti' ( in 3-component vector of uint)
+0:111                  Constant:
+0:111                    0 (const int)
+0:111              Constant:
+0:111                1 (const int)
+0:111            Sequence
+0:111              Constant:
+0:111                0 (const int)
+0:111              Constant:
+0:111                1 (const int)
+0:112      move second child to first child ( temp 3-component vector of int)
+0:112        vector swizzle ( temp 3-component vector of int)
+0:112          i: direct index for structure ( temp 4-component vector of int)
+0:112            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:112              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:112                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:112                Constant:
+0:112                  0 (const uint)
+0:112              direct index ( temp uint)
+0:112                'dti' ( in 3-component vector of uint)
+0:112                Constant:
+0:112                  0 (const int)
+0:112            Constant:
+0:112              1 (const int)
+0:112          Sequence
+0:112            Constant:
+0:112              0 (const int)
+0:112            Constant:
+0:112              1 (const int)
+0:112            Constant:
+0:112              2 (const int)
+0:112        subgroupOr ( temp 3-component vector of int)
+0:112          vector swizzle ( temp 3-component vector of int)
+0:112            i: direct index for structure ( temp 4-component vector of int)
+0:112              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:112                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:112                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:112                  Constant:
+0:112                    0 (const uint)
+0:112                direct index ( temp uint)
+0:112                  'dti' ( in 3-component vector of uint)
+0:112                  Constant:
+0:112                    0 (const int)
+0:112              Constant:
+0:112                1 (const int)
+0:112            Sequence
+0:112              Constant:
+0:112                0 (const int)
+0:112              Constant:
+0:112                1 (const int)
+0:112              Constant:
+0:112                2 (const int)
+0:114      move second child to first child ( temp 4-component vector of uint)
+0:114        u: direct index for structure ( temp 4-component vector of uint)
+0:114          indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:114            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:114              'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:114              Constant:
+0:114                0 (const uint)
+0:114            direct index ( temp uint)
+0:114              'dti' ( in 3-component vector of uint)
+0:114              Constant:
+0:114                0 (const int)
+0:114          Constant:
+0:114            0 (const int)
+0:114        subgroupXor ( temp 4-component vector of uint)
+0:114          u: direct index for structure ( temp 4-component vector of uint)
+0:114            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:114              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:114                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:114                Constant:
+0:114                  0 (const uint)
+0:114              direct index ( temp uint)
+0:114                'dti' ( in 3-component vector of uint)
+0:114                Constant:
+0:114                  0 (const int)
+0:114            Constant:
+0:114              0 (const int)
+0:115      move second child to first child ( temp uint)
+0:115        direct index ( temp uint)
+0:115          u: direct index for structure ( temp 4-component vector of uint)
+0:115            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:115              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:115                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:115                Constant:
+0:115                  0 (const uint)
+0:115              direct index ( temp uint)
+0:115                'dti' ( in 3-component vector of uint)
+0:115                Constant:
+0:115                  0 (const int)
+0:115            Constant:
+0:115              0 (const int)
+0:115          Constant:
+0:115            0 (const int)
+0:115        subgroupXor ( temp uint)
+0:115          direct index ( temp uint)
+0:115            u: direct index for structure ( temp 4-component vector of uint)
+0:115              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:115                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:115                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:115                  Constant:
+0:115                    0 (const uint)
+0:115                direct index ( temp uint)
+0:115                  'dti' ( in 3-component vector of uint)
+0:115                  Constant:
+0:115                    0 (const int)
+0:115              Constant:
+0:115                0 (const int)
+0:115            Constant:
+0:115              0 (const int)
+0:116      move second child to first child ( temp 2-component vector of uint)
+0:116        vector swizzle ( temp 2-component vector of uint)
+0:116          u: direct index for structure ( temp 4-component vector of uint)
+0:116            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:116              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:116                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:116                Constant:
+0:116                  0 (const uint)
+0:116              direct index ( temp uint)
+0:116                'dti' ( in 3-component vector of uint)
+0:116                Constant:
+0:116                  0 (const int)
+0:116            Constant:
+0:116              0 (const int)
+0:116          Sequence
+0:116            Constant:
+0:116              0 (const int)
+0:116            Constant:
+0:116              1 (const int)
+0:116        subgroupXor ( temp 2-component vector of uint)
+0:116          vector swizzle ( temp 2-component vector of uint)
+0:116            u: direct index for structure ( temp 4-component vector of uint)
+0:116              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:116                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:116                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:116                  Constant:
+0:116                    0 (const uint)
+0:116                direct index ( temp uint)
+0:116                  'dti' ( in 3-component vector of uint)
+0:116                  Constant:
+0:116                    0 (const int)
+0:116              Constant:
+0:116                0 (const int)
+0:116            Sequence
+0:116              Constant:
+0:116                0 (const int)
+0:116              Constant:
+0:116                1 (const int)
+0:117      move second child to first child ( temp 3-component vector of uint)
+0:117        vector swizzle ( temp 3-component vector of uint)
+0:117          u: direct index for structure ( temp 4-component vector of uint)
+0:117            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:117              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:117                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:117                Constant:
+0:117                  0 (const uint)
+0:117              direct index ( temp uint)
+0:117                'dti' ( in 3-component vector of uint)
+0:117                Constant:
+0:117                  0 (const int)
+0:117            Constant:
+0:117              0 (const int)
+0:117          Sequence
+0:117            Constant:
+0:117              0 (const int)
+0:117            Constant:
+0:117              1 (const int)
+0:117            Constant:
+0:117              2 (const int)
+0:117        subgroupXor ( temp 3-component vector of uint)
+0:117          vector swizzle ( temp 3-component vector of uint)
+0:117            u: direct index for structure ( temp 4-component vector of uint)
+0:117              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:117                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:117                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:117                  Constant:
+0:117                    0 (const uint)
+0:117                direct index ( temp uint)
+0:117                  'dti' ( in 3-component vector of uint)
+0:117                  Constant:
+0:117                    0 (const int)
+0:117              Constant:
+0:117                0 (const int)
+0:117            Sequence
+0:117              Constant:
+0:117                0 (const int)
+0:117              Constant:
+0:117                1 (const int)
+0:117              Constant:
+0:117                2 (const int)
+0:119      move second child to first child ( temp 4-component vector of int)
+0:119        i: direct index for structure ( temp 4-component vector of int)
+0:119          indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:119            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:119              'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:119              Constant:
+0:119                0 (const uint)
+0:119            direct index ( temp uint)
+0:119              'dti' ( in 3-component vector of uint)
+0:119              Constant:
+0:119                0 (const int)
+0:119          Constant:
+0:119            1 (const int)
+0:119        subgroupXor ( temp 4-component vector of int)
+0:119          i: direct index for structure ( temp 4-component vector of int)
+0:119            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:119              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:119                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:119                Constant:
+0:119                  0 (const uint)
+0:119              direct index ( temp uint)
+0:119                'dti' ( in 3-component vector of uint)
+0:119                Constant:
+0:119                  0 (const int)
+0:119            Constant:
+0:119              1 (const int)
+0:120      move second child to first child ( temp int)
+0:120        direct index ( temp int)
+0:120          i: direct index for structure ( temp 4-component vector of int)
+0:120            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:120              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:120                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:120                Constant:
+0:120                  0 (const uint)
+0:120              direct index ( temp uint)
+0:120                'dti' ( in 3-component vector of uint)
+0:120                Constant:
+0:120                  0 (const int)
+0:120            Constant:
+0:120              1 (const int)
+0:120          Constant:
+0:120            0 (const int)
+0:120        subgroupXor ( temp int)
+0:120          direct index ( temp int)
+0:120            i: direct index for structure ( temp 4-component vector of int)
+0:120              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:120                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:120                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:120                  Constant:
+0:120                    0 (const uint)
+0:120                direct index ( temp uint)
+0:120                  'dti' ( in 3-component vector of uint)
+0:120                  Constant:
+0:120                    0 (const int)
+0:120              Constant:
+0:120                1 (const int)
+0:120            Constant:
+0:120              0 (const int)
+0:121      move second child to first child ( temp 2-component vector of int)
+0:121        vector swizzle ( temp 2-component vector of int)
+0:121          i: direct index for structure ( temp 4-component vector of int)
+0:121            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:121              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:121                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:121                Constant:
+0:121                  0 (const uint)
+0:121              direct index ( temp uint)
+0:121                'dti' ( in 3-component vector of uint)
+0:121                Constant:
+0:121                  0 (const int)
+0:121            Constant:
+0:121              1 (const int)
+0:121          Sequence
+0:121            Constant:
+0:121              0 (const int)
+0:121            Constant:
+0:121              1 (const int)
+0:121        subgroupXor ( temp 2-component vector of int)
+0:121          vector swizzle ( temp 2-component vector of int)
+0:121            i: direct index for structure ( temp 4-component vector of int)
+0:121              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:121                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:121                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:121                  Constant:
+0:121                    0 (const uint)
+0:121                direct index ( temp uint)
+0:121                  'dti' ( in 3-component vector of uint)
+0:121                  Constant:
+0:121                    0 (const int)
+0:121              Constant:
+0:121                1 (const int)
+0:121            Sequence
+0:121              Constant:
+0:121                0 (const int)
+0:121              Constant:
+0:121                1 (const int)
+0:122      move second child to first child ( temp 3-component vector of int)
+0:122        vector swizzle ( temp 3-component vector of int)
+0:122          i: direct index for structure ( temp 4-component vector of int)
+0:122            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:122              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:122                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:122                Constant:
+0:122                  0 (const uint)
+0:122              direct index ( temp uint)
+0:122                'dti' ( in 3-component vector of uint)
+0:122                Constant:
+0:122                  0 (const int)
+0:122            Constant:
+0:122              1 (const int)
+0:122          Sequence
+0:122            Constant:
+0:122              0 (const int)
+0:122            Constant:
+0:122              1 (const int)
+0:122            Constant:
+0:122              2 (const int)
+0:122        subgroupXor ( temp 3-component vector of int)
+0:122          vector swizzle ( temp 3-component vector of int)
+0:122            i: direct index for structure ( temp 4-component vector of int)
+0:122              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:122                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:122                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:122                  Constant:
+0:122                    0 (const uint)
+0:122                direct index ( temp uint)
+0:122                  'dti' ( in 3-component vector of uint)
+0:122                  Constant:
+0:122                    0 (const int)
+0:122              Constant:
+0:122                1 (const int)
+0:122            Sequence
+0:122              Constant:
+0:122                0 (const int)
+0:122              Constant:
+0:122                1 (const int)
+0:122              Constant:
+0:122                2 (const int)
+0:124      move second child to first child ( temp uint)
+0:124        direct index ( temp uint)
+0:124          u: direct index for structure ( temp 4-component vector of uint)
+0:124            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:124              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:124                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:124                Constant:
+0:124                  0 (const uint)
+0:124              direct index ( temp uint)
+0:124                'dti' ( in 3-component vector of uint)
+0:124                Constant:
+0:124                  0 (const int)
+0:124            Constant:
+0:124              0 (const int)
+0:124          Constant:
+0:124            0 (const int)
+0:124        subgroupBallotBitCount ( temp uint)
+0:124          subgroupBallot ( temp 4-component vector of uint)
+0:124            Compare Equal ( temp bool)
+0:124              direct index ( temp uint)
+0:124                u: direct index for structure ( temp 4-component vector of uint)
+0:124                  indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:124                    @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:124                      'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:124                      Constant:
+0:124                        0 (const uint)
+0:124                    direct index ( temp uint)
+0:124                      'dti' ( in 3-component vector of uint)
+0:124                      Constant:
+0:124                        0 (const int)
+0:124                  Constant:
+0:124                    0 (const int)
+0:124                Constant:
+0:124                  0 (const int)
+0:124              Constant:
+0:124                0 (const uint)
+0:13  Function Definition: CSMain( ( temp void)
+0:13    Function Parameters: 
+0:?     Sequence
+0:13      move second child to first child ( temp 3-component vector of uint)
+0:?         'dti' ( temp 3-component vector of uint)
+0:?         'dti' ( in 3-component vector of uint GlobalInvocationID)
+0:13      Function Call: @CSMain(vu3; ( temp void)
+0:?         'dti' ( temp 3-component vector of uint)
+0:?   Linker Objects
+0:?     'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:?     'dti' ( in 3-component vector of uint GlobalInvocationID)
+
+
+Linked compute stage:
+
+
+Shader version: 500
+local_size = (32, 16, 1)
+0:? Sequence
+0:13  Function Definition: @CSMain(vu3; ( temp void)
+0:13    Function Parameters: 
+0:13      'dti' ( in 3-component vector of uint)
+0:?     Sequence
+0:14      move second child to first child ( temp 4-component vector of uint)
+0:14        u: direct index for structure ( temp 4-component vector of uint)
+0:14          indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:14            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:14              'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:14              Constant:
+0:14                0 (const uint)
+0:14            direct index ( temp uint)
+0:14              'dti' ( in 3-component vector of uint)
+0:14              Constant:
+0:14                0 (const int)
+0:14          Constant:
+0:14            0 (const int)
+0:14        subgroupAdd ( temp 4-component vector of uint)
+0:14          u: direct index for structure ( temp 4-component vector of uint)
+0:14            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:14              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:14                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:14                Constant:
+0:14                  0 (const uint)
+0:14              direct index ( temp uint)
+0:14                'dti' ( in 3-component vector of uint)
+0:14                Constant:
+0:14                  0 (const int)
+0:14            Constant:
+0:14              0 (const int)
+0:15      move second child to first child ( temp uint)
+0:15        direct index ( temp uint)
+0:15          u: direct index for structure ( temp 4-component vector of uint)
+0:15            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:15              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:15                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:15                Constant:
+0:15                  0 (const uint)
+0:15              direct index ( temp uint)
+0:15                'dti' ( in 3-component vector of uint)
+0:15                Constant:
+0:15                  0 (const int)
+0:15            Constant:
+0:15              0 (const int)
+0:15          Constant:
+0:15            0 (const int)
+0:15        subgroupAdd ( temp uint)
+0:15          direct index ( temp uint)
+0:15            u: direct index for structure ( temp 4-component vector of uint)
+0:15              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:15                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:15                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:15                  Constant:
+0:15                    0 (const uint)
+0:15                direct index ( temp uint)
+0:15                  'dti' ( in 3-component vector of uint)
+0:15                  Constant:
+0:15                    0 (const int)
+0:15              Constant:
+0:15                0 (const int)
+0:15            Constant:
+0:15              0 (const int)
+0:16      move second child to first child ( temp 2-component vector of uint)
+0:16        vector swizzle ( temp 2-component vector of uint)
+0:16          u: direct index for structure ( temp 4-component vector of uint)
+0:16            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:16              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:16                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:16                Constant:
+0:16                  0 (const uint)
+0:16              direct index ( temp uint)
+0:16                'dti' ( in 3-component vector of uint)
+0:16                Constant:
+0:16                  0 (const int)
+0:16            Constant:
+0:16              0 (const int)
+0:16          Sequence
+0:16            Constant:
+0:16              0 (const int)
+0:16            Constant:
+0:16              1 (const int)
+0:16        subgroupAdd ( temp 2-component vector of uint)
+0:16          vector swizzle ( temp 2-component vector of uint)
+0:16            u: direct index for structure ( temp 4-component vector of uint)
+0:16              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:16                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:16                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:16                  Constant:
+0:16                    0 (const uint)
+0:16                direct index ( temp uint)
+0:16                  'dti' ( in 3-component vector of uint)
+0:16                  Constant:
+0:16                    0 (const int)
+0:16              Constant:
+0:16                0 (const int)
+0:16            Sequence
+0:16              Constant:
+0:16                0 (const int)
+0:16              Constant:
+0:16                1 (const int)
+0:17      move second child to first child ( temp 3-component vector of uint)
+0:17        vector swizzle ( temp 3-component vector of uint)
+0:17          u: direct index for structure ( temp 4-component vector of uint)
+0:17            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:17              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:17                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:17                Constant:
+0:17                  0 (const uint)
+0:17              direct index ( temp uint)
+0:17                'dti' ( in 3-component vector of uint)
+0:17                Constant:
+0:17                  0 (const int)
+0:17            Constant:
+0:17              0 (const int)
+0:17          Sequence
+0:17            Constant:
+0:17              0 (const int)
+0:17            Constant:
+0:17              1 (const int)
+0:17            Constant:
+0:17              2 (const int)
+0:17        subgroupAdd ( temp 3-component vector of uint)
+0:17          vector swizzle ( temp 3-component vector of uint)
+0:17            u: direct index for structure ( temp 4-component vector of uint)
+0:17              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:17                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:17                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:17                  Constant:
+0:17                    0 (const uint)
+0:17                direct index ( temp uint)
+0:17                  'dti' ( in 3-component vector of uint)
+0:17                  Constant:
+0:17                    0 (const int)
+0:17              Constant:
+0:17                0 (const int)
+0:17            Sequence
+0:17              Constant:
+0:17                0 (const int)
+0:17              Constant:
+0:17                1 (const int)
+0:17              Constant:
+0:17                2 (const int)
+0:19      move second child to first child ( temp 4-component vector of int)
+0:19        i: direct index for structure ( temp 4-component vector of int)
+0:19          indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:19            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:19              'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:19              Constant:
+0:19                0 (const uint)
+0:19            direct index ( temp uint)
+0:19              'dti' ( in 3-component vector of uint)
+0:19              Constant:
+0:19                0 (const int)
+0:19          Constant:
+0:19            1 (const int)
+0:19        subgroupAdd ( temp 4-component vector of int)
+0:19          i: direct index for structure ( temp 4-component vector of int)
+0:19            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:19              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:19                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:19                Constant:
+0:19                  0 (const uint)
+0:19              direct index ( temp uint)
+0:19                'dti' ( in 3-component vector of uint)
+0:19                Constant:
+0:19                  0 (const int)
+0:19            Constant:
+0:19              1 (const int)
+0:20      move second child to first child ( temp int)
+0:20        direct index ( temp int)
+0:20          i: direct index for structure ( temp 4-component vector of int)
+0:20            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:20              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:20                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:20                Constant:
+0:20                  0 (const uint)
+0:20              direct index ( temp uint)
+0:20                'dti' ( in 3-component vector of uint)
+0:20                Constant:
+0:20                  0 (const int)
+0:20            Constant:
+0:20              1 (const int)
+0:20          Constant:
+0:20            0 (const int)
+0:20        subgroupAdd ( temp int)
+0:20          direct index ( temp int)
+0:20            i: direct index for structure ( temp 4-component vector of int)
+0:20              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:20                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:20                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:20                  Constant:
+0:20                    0 (const uint)
+0:20                direct index ( temp uint)
+0:20                  'dti' ( in 3-component vector of uint)
+0:20                  Constant:
+0:20                    0 (const int)
+0:20              Constant:
+0:20                1 (const int)
+0:20            Constant:
+0:20              0 (const int)
+0:21      move second child to first child ( temp 2-component vector of int)
+0:21        vector swizzle ( temp 2-component vector of int)
+0:21          i: direct index for structure ( temp 4-component vector of int)
+0:21            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:21              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:21                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:21                Constant:
+0:21                  0 (const uint)
+0:21              direct index ( temp uint)
+0:21                'dti' ( in 3-component vector of uint)
+0:21                Constant:
+0:21                  0 (const int)
+0:21            Constant:
+0:21              1 (const int)
+0:21          Sequence
+0:21            Constant:
+0:21              0 (const int)
+0:21            Constant:
+0:21              1 (const int)
+0:21        subgroupAdd ( temp 2-component vector of int)
+0:21          vector swizzle ( temp 2-component vector of int)
+0:21            i: direct index for structure ( temp 4-component vector of int)
+0:21              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:21                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:21                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:21                  Constant:
+0:21                    0 (const uint)
+0:21                direct index ( temp uint)
+0:21                  'dti' ( in 3-component vector of uint)
+0:21                  Constant:
+0:21                    0 (const int)
+0:21              Constant:
+0:21                1 (const int)
+0:21            Sequence
+0:21              Constant:
+0:21                0 (const int)
+0:21              Constant:
+0:21                1 (const int)
+0:22      move second child to first child ( temp 3-component vector of int)
+0:22        vector swizzle ( temp 3-component vector of int)
+0:22          i: direct index for structure ( temp 4-component vector of int)
+0:22            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:22              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:22                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:22                Constant:
+0:22                  0 (const uint)
+0:22              direct index ( temp uint)
+0:22                'dti' ( in 3-component vector of uint)
+0:22                Constant:
+0:22                  0 (const int)
+0:22            Constant:
+0:22              1 (const int)
+0:22          Sequence
+0:22            Constant:
+0:22              0 (const int)
+0:22            Constant:
+0:22              1 (const int)
+0:22            Constant:
+0:22              2 (const int)
+0:22        subgroupAdd ( temp 3-component vector of int)
+0:22          vector swizzle ( temp 3-component vector of int)
+0:22            i: direct index for structure ( temp 4-component vector of int)
+0:22              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:22                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:22                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:22                  Constant:
+0:22                    0 (const uint)
+0:22                direct index ( temp uint)
+0:22                  'dti' ( in 3-component vector of uint)
+0:22                  Constant:
+0:22                    0 (const int)
+0:22              Constant:
+0:22                1 (const int)
+0:22            Sequence
+0:22              Constant:
+0:22                0 (const int)
+0:22              Constant:
+0:22                1 (const int)
+0:22              Constant:
+0:22                2 (const int)
+0:24      move second child to first child ( temp 4-component vector of float)
+0:24        f: direct index for structure ( temp 4-component vector of float)
+0:24          indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:24            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:24              'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:24              Constant:
+0:24                0 (const uint)
+0:24            direct index ( temp uint)
+0:24              'dti' ( in 3-component vector of uint)
+0:24              Constant:
+0:24                0 (const int)
+0:24          Constant:
+0:24            2 (const int)
+0:24        subgroupAdd ( temp 4-component vector of float)
+0:24          f: direct index for structure ( temp 4-component vector of float)
+0:24            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:24              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:24                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:24                Constant:
+0:24                  0 (const uint)
+0:24              direct index ( temp uint)
+0:24                'dti' ( in 3-component vector of uint)
+0:24                Constant:
+0:24                  0 (const int)
+0:24            Constant:
+0:24              2 (const int)
+0:25      move second child to first child ( temp float)
+0:25        direct index ( temp float)
+0:25          f: direct index for structure ( temp 4-component vector of float)
+0:25            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:25              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:25                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:25                Constant:
+0:25                  0 (const uint)
+0:25              direct index ( temp uint)
+0:25                'dti' ( in 3-component vector of uint)
+0:25                Constant:
+0:25                  0 (const int)
+0:25            Constant:
+0:25              2 (const int)
+0:25          Constant:
+0:25            0 (const int)
+0:25        subgroupAdd ( temp float)
+0:25          direct index ( temp float)
+0:25            f: direct index for structure ( temp 4-component vector of float)
+0:25              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:25                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:25                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:25                  Constant:
+0:25                    0 (const uint)
+0:25                direct index ( temp uint)
+0:25                  'dti' ( in 3-component vector of uint)
+0:25                  Constant:
+0:25                    0 (const int)
+0:25              Constant:
+0:25                2 (const int)
+0:25            Constant:
+0:25              0 (const int)
+0:26      move second child to first child ( temp 2-component vector of float)
+0:26        vector swizzle ( temp 2-component vector of float)
+0:26          f: direct index for structure ( temp 4-component vector of float)
+0:26            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:26              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:26                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:26                Constant:
+0:26                  0 (const uint)
+0:26              direct index ( temp uint)
+0:26                'dti' ( in 3-component vector of uint)
+0:26                Constant:
+0:26                  0 (const int)
+0:26            Constant:
+0:26              2 (const int)
+0:26          Sequence
+0:26            Constant:
+0:26              0 (const int)
+0:26            Constant:
+0:26              1 (const int)
+0:26        subgroupAdd ( temp 2-component vector of float)
+0:26          vector swizzle ( temp 2-component vector of float)
+0:26            f: direct index for structure ( temp 4-component vector of float)
+0:26              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:26                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:26                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:26                  Constant:
+0:26                    0 (const uint)
+0:26                direct index ( temp uint)
+0:26                  'dti' ( in 3-component vector of uint)
+0:26                  Constant:
+0:26                    0 (const int)
+0:26              Constant:
+0:26                2 (const int)
+0:26            Sequence
+0:26              Constant:
+0:26                0 (const int)
+0:26              Constant:
+0:26                1 (const int)
+0:27      move second child to first child ( temp 3-component vector of float)
+0:27        vector swizzle ( temp 3-component vector of float)
+0:27          f: direct index for structure ( temp 4-component vector of float)
+0:27            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:27              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:27                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:27                Constant:
+0:27                  0 (const uint)
+0:27              direct index ( temp uint)
+0:27                'dti' ( in 3-component vector of uint)
+0:27                Constant:
+0:27                  0 (const int)
+0:27            Constant:
+0:27              2 (const int)
+0:27          Sequence
+0:27            Constant:
+0:27              0 (const int)
+0:27            Constant:
+0:27              1 (const int)
+0:27            Constant:
+0:27              2 (const int)
+0:27        subgroupAdd ( temp 3-component vector of float)
+0:27          vector swizzle ( temp 3-component vector of float)
+0:27            f: direct index for structure ( temp 4-component vector of float)
+0:27              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:27                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:27                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:27                  Constant:
+0:27                    0 (const uint)
+0:27                direct index ( temp uint)
+0:27                  'dti' ( in 3-component vector of uint)
+0:27                  Constant:
+0:27                    0 (const int)
+0:27              Constant:
+0:27                2 (const int)
+0:27            Sequence
+0:27              Constant:
+0:27                0 (const int)
+0:27              Constant:
+0:27                1 (const int)
+0:27              Constant:
+0:27                2 (const int)
+0:29      move second child to first child ( temp 4-component vector of double)
+0:29        d: direct index for structure ( temp 4-component vector of double)
+0:29          indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:29            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:29              'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:29              Constant:
+0:29                0 (const uint)
+0:29            direct index ( temp uint)
+0:29              'dti' ( in 3-component vector of uint)
+0:29              Constant:
+0:29                0 (const int)
+0:29          Constant:
+0:29            3 (const int)
+0:29        subgroupAdd ( temp 4-component vector of double)
+0:29          d: direct index for structure ( temp 4-component vector of double)
+0:29            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:29              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:29                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:29                Constant:
+0:29                  0 (const uint)
+0:29              direct index ( temp uint)
+0:29                'dti' ( in 3-component vector of uint)
+0:29                Constant:
+0:29                  0 (const int)
+0:29            Constant:
+0:29              3 (const int)
+0:30      move second child to first child ( temp double)
+0:30        direct index ( temp double)
+0:30          d: direct index for structure ( temp 4-component vector of double)
+0:30            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:30              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:30                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:30                Constant:
+0:30                  0 (const uint)
+0:30              direct index ( temp uint)
+0:30                'dti' ( in 3-component vector of uint)
+0:30                Constant:
+0:30                  0 (const int)
+0:30            Constant:
+0:30              3 (const int)
+0:30          Constant:
+0:30            0 (const int)
+0:30        subgroupAdd ( temp double)
+0:30          direct index ( temp double)
+0:30            d: direct index for structure ( temp 4-component vector of double)
+0:30              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:30                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:30                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:30                  Constant:
+0:30                    0 (const uint)
+0:30                direct index ( temp uint)
+0:30                  'dti' ( in 3-component vector of uint)
+0:30                  Constant:
+0:30                    0 (const int)
+0:30              Constant:
+0:30                3 (const int)
+0:30            Constant:
+0:30              0 (const int)
+0:31      move second child to first child ( temp 2-component vector of double)
+0:31        vector swizzle ( temp 2-component vector of double)
+0:31          d: direct index for structure ( temp 4-component vector of double)
+0:31            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:31              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:31                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:31                Constant:
+0:31                  0 (const uint)
+0:31              direct index ( temp uint)
+0:31                'dti' ( in 3-component vector of uint)
+0:31                Constant:
+0:31                  0 (const int)
+0:31            Constant:
+0:31              3 (const int)
+0:31          Sequence
+0:31            Constant:
+0:31              0 (const int)
+0:31            Constant:
+0:31              1 (const int)
+0:31        subgroupAdd ( temp 2-component vector of double)
+0:31          vector swizzle ( temp 2-component vector of double)
+0:31            d: direct index for structure ( temp 4-component vector of double)
+0:31              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:31                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:31                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:31                  Constant:
+0:31                    0 (const uint)
+0:31                direct index ( temp uint)
+0:31                  'dti' ( in 3-component vector of uint)
+0:31                  Constant:
+0:31                    0 (const int)
+0:31              Constant:
+0:31                3 (const int)
+0:31            Sequence
+0:31              Constant:
+0:31                0 (const int)
+0:31              Constant:
+0:31                1 (const int)
+0:32      move second child to first child ( temp 3-component vector of double)
+0:32        vector swizzle ( temp 3-component vector of double)
+0:32          d: direct index for structure ( temp 4-component vector of double)
+0:32            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:32              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:32                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:32                Constant:
+0:32                  0 (const uint)
+0:32              direct index ( temp uint)
+0:32                'dti' ( in 3-component vector of uint)
+0:32                Constant:
+0:32                  0 (const int)
+0:32            Constant:
+0:32              3 (const int)
+0:32          Sequence
+0:32            Constant:
+0:32              0 (const int)
+0:32            Constant:
+0:32              1 (const int)
+0:32            Constant:
+0:32              2 (const int)
+0:32        subgroupAdd ( temp 3-component vector of double)
+0:32          vector swizzle ( temp 3-component vector of double)
+0:32            d: direct index for structure ( temp 4-component vector of double)
+0:32              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:32                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:32                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:32                  Constant:
+0:32                    0 (const uint)
+0:32                direct index ( temp uint)
+0:32                  'dti' ( in 3-component vector of uint)
+0:32                  Constant:
+0:32                    0 (const int)
+0:32              Constant:
+0:32                3 (const int)
+0:32            Sequence
+0:32              Constant:
+0:32                0 (const int)
+0:32              Constant:
+0:32                1 (const int)
+0:32              Constant:
+0:32                2 (const int)
+0:34      move second child to first child ( temp 4-component vector of uint)
+0:34        u: direct index for structure ( temp 4-component vector of uint)
+0:34          indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:34            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:34              'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:34              Constant:
+0:34                0 (const uint)
+0:34            direct index ( temp uint)
+0:34              'dti' ( in 3-component vector of uint)
+0:34              Constant:
+0:34                0 (const int)
+0:34          Constant:
+0:34            0 (const int)
+0:34        subgroupMul ( temp 4-component vector of uint)
+0:34          u: direct index for structure ( temp 4-component vector of uint)
+0:34            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:34              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:34                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:34                Constant:
+0:34                  0 (const uint)
+0:34              direct index ( temp uint)
+0:34                'dti' ( in 3-component vector of uint)
+0:34                Constant:
+0:34                  0 (const int)
+0:34            Constant:
+0:34              0 (const int)
+0:35      move second child to first child ( temp uint)
+0:35        direct index ( temp uint)
+0:35          u: direct index for structure ( temp 4-component vector of uint)
+0:35            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:35              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:35                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:35                Constant:
+0:35                  0 (const uint)
+0:35              direct index ( temp uint)
+0:35                'dti' ( in 3-component vector of uint)
+0:35                Constant:
+0:35                  0 (const int)
+0:35            Constant:
+0:35              0 (const int)
+0:35          Constant:
+0:35            0 (const int)
+0:35        subgroupMul ( temp uint)
+0:35          direct index ( temp uint)
+0:35            u: direct index for structure ( temp 4-component vector of uint)
+0:35              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:35                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:35                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:35                  Constant:
+0:35                    0 (const uint)
+0:35                direct index ( temp uint)
+0:35                  'dti' ( in 3-component vector of uint)
+0:35                  Constant:
+0:35                    0 (const int)
+0:35              Constant:
+0:35                0 (const int)
+0:35            Constant:
+0:35              0 (const int)
+0:36      move second child to first child ( temp 2-component vector of uint)
+0:36        vector swizzle ( temp 2-component vector of uint)
+0:36          u: direct index for structure ( temp 4-component vector of uint)
+0:36            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:36              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:36                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:36                Constant:
+0:36                  0 (const uint)
+0:36              direct index ( temp uint)
+0:36                'dti' ( in 3-component vector of uint)
+0:36                Constant:
+0:36                  0 (const int)
+0:36            Constant:
+0:36              0 (const int)
+0:36          Sequence
+0:36            Constant:
+0:36              0 (const int)
+0:36            Constant:
+0:36              1 (const int)
+0:36        subgroupMul ( temp 2-component vector of uint)
+0:36          vector swizzle ( temp 2-component vector of uint)
+0:36            u: direct index for structure ( temp 4-component vector of uint)
+0:36              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:36                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:36                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:36                  Constant:
+0:36                    0 (const uint)
+0:36                direct index ( temp uint)
+0:36                  'dti' ( in 3-component vector of uint)
+0:36                  Constant:
+0:36                    0 (const int)
+0:36              Constant:
+0:36                0 (const int)
+0:36            Sequence
+0:36              Constant:
+0:36                0 (const int)
+0:36              Constant:
+0:36                1 (const int)
+0:37      move second child to first child ( temp 3-component vector of uint)
+0:37        vector swizzle ( temp 3-component vector of uint)
+0:37          u: direct index for structure ( temp 4-component vector of uint)
+0:37            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:37              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:37                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:37                Constant:
+0:37                  0 (const uint)
+0:37              direct index ( temp uint)
+0:37                'dti' ( in 3-component vector of uint)
+0:37                Constant:
+0:37                  0 (const int)
+0:37            Constant:
+0:37              0 (const int)
+0:37          Sequence
+0:37            Constant:
+0:37              0 (const int)
+0:37            Constant:
+0:37              1 (const int)
+0:37            Constant:
+0:37              2 (const int)
+0:37        subgroupMul ( temp 3-component vector of uint)
+0:37          vector swizzle ( temp 3-component vector of uint)
+0:37            u: direct index for structure ( temp 4-component vector of uint)
+0:37              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:37                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:37                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:37                  Constant:
+0:37                    0 (const uint)
+0:37                direct index ( temp uint)
+0:37                  'dti' ( in 3-component vector of uint)
+0:37                  Constant:
+0:37                    0 (const int)
+0:37              Constant:
+0:37                0 (const int)
+0:37            Sequence
+0:37              Constant:
+0:37                0 (const int)
+0:37              Constant:
+0:37                1 (const int)
+0:37              Constant:
+0:37                2 (const int)
+0:39      move second child to first child ( temp 4-component vector of int)
+0:39        i: direct index for structure ( temp 4-component vector of int)
+0:39          indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:39            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:39              'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:39              Constant:
+0:39                0 (const uint)
+0:39            direct index ( temp uint)
+0:39              'dti' ( in 3-component vector of uint)
+0:39              Constant:
+0:39                0 (const int)
+0:39          Constant:
+0:39            1 (const int)
+0:39        subgroupMul ( temp 4-component vector of int)
+0:39          i: direct index for structure ( temp 4-component vector of int)
+0:39            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:39              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:39                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:39                Constant:
+0:39                  0 (const uint)
+0:39              direct index ( temp uint)
+0:39                'dti' ( in 3-component vector of uint)
+0:39                Constant:
+0:39                  0 (const int)
+0:39            Constant:
+0:39              1 (const int)
+0:40      move second child to first child ( temp int)
+0:40        direct index ( temp int)
+0:40          i: direct index for structure ( temp 4-component vector of int)
+0:40            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:40              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:40                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:40                Constant:
+0:40                  0 (const uint)
+0:40              direct index ( temp uint)
+0:40                'dti' ( in 3-component vector of uint)
+0:40                Constant:
+0:40                  0 (const int)
+0:40            Constant:
+0:40              1 (const int)
+0:40          Constant:
+0:40            0 (const int)
+0:40        subgroupMul ( temp int)
+0:40          direct index ( temp int)
+0:40            i: direct index for structure ( temp 4-component vector of int)
+0:40              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:40                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:40                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:40                  Constant:
+0:40                    0 (const uint)
+0:40                direct index ( temp uint)
+0:40                  'dti' ( in 3-component vector of uint)
+0:40                  Constant:
+0:40                    0 (const int)
+0:40              Constant:
+0:40                1 (const int)
+0:40            Constant:
+0:40              0 (const int)
+0:41      move second child to first child ( temp 2-component vector of int)
+0:41        vector swizzle ( temp 2-component vector of int)
+0:41          i: direct index for structure ( temp 4-component vector of int)
+0:41            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:41              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:41                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:41                Constant:
+0:41                  0 (const uint)
+0:41              direct index ( temp uint)
+0:41                'dti' ( in 3-component vector of uint)
+0:41                Constant:
+0:41                  0 (const int)
+0:41            Constant:
+0:41              1 (const int)
+0:41          Sequence
+0:41            Constant:
+0:41              0 (const int)
+0:41            Constant:
+0:41              1 (const int)
+0:41        subgroupMul ( temp 2-component vector of int)
+0:41          vector swizzle ( temp 2-component vector of int)
+0:41            i: direct index for structure ( temp 4-component vector of int)
+0:41              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:41                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:41                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:41                  Constant:
+0:41                    0 (const uint)
+0:41                direct index ( temp uint)
+0:41                  'dti' ( in 3-component vector of uint)
+0:41                  Constant:
+0:41                    0 (const int)
+0:41              Constant:
+0:41                1 (const int)
+0:41            Sequence
+0:41              Constant:
+0:41                0 (const int)
+0:41              Constant:
+0:41                1 (const int)
+0:42      move second child to first child ( temp 3-component vector of int)
+0:42        vector swizzle ( temp 3-component vector of int)
+0:42          i: direct index for structure ( temp 4-component vector of int)
+0:42            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:42              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:42                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:42                Constant:
+0:42                  0 (const uint)
+0:42              direct index ( temp uint)
+0:42                'dti' ( in 3-component vector of uint)
+0:42                Constant:
+0:42                  0 (const int)
+0:42            Constant:
+0:42              1 (const int)
+0:42          Sequence
+0:42            Constant:
+0:42              0 (const int)
+0:42            Constant:
+0:42              1 (const int)
+0:42            Constant:
+0:42              2 (const int)
+0:42        subgroupMul ( temp 3-component vector of int)
+0:42          vector swizzle ( temp 3-component vector of int)
+0:42            i: direct index for structure ( temp 4-component vector of int)
+0:42              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:42                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:42                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:42                  Constant:
+0:42                    0 (const uint)
+0:42                direct index ( temp uint)
+0:42                  'dti' ( in 3-component vector of uint)
+0:42                  Constant:
+0:42                    0 (const int)
+0:42              Constant:
+0:42                1 (const int)
+0:42            Sequence
+0:42              Constant:
+0:42                0 (const int)
+0:42              Constant:
+0:42                1 (const int)
+0:42              Constant:
+0:42                2 (const int)
+0:44      move second child to first child ( temp 4-component vector of float)
+0:44        f: direct index for structure ( temp 4-component vector of float)
+0:44          indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:44            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:44              'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:44              Constant:
+0:44                0 (const uint)
+0:44            direct index ( temp uint)
+0:44              'dti' ( in 3-component vector of uint)
+0:44              Constant:
+0:44                0 (const int)
+0:44          Constant:
+0:44            2 (const int)
+0:44        subgroupMul ( temp 4-component vector of float)
+0:44          f: direct index for structure ( temp 4-component vector of float)
+0:44            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:44              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:44                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:44                Constant:
+0:44                  0 (const uint)
+0:44              direct index ( temp uint)
+0:44                'dti' ( in 3-component vector of uint)
+0:44                Constant:
+0:44                  0 (const int)
+0:44            Constant:
+0:44              2 (const int)
+0:45      move second child to first child ( temp float)
+0:45        direct index ( temp float)
+0:45          f: direct index for structure ( temp 4-component vector of float)
+0:45            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:45              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:45                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:45                Constant:
+0:45                  0 (const uint)
+0:45              direct index ( temp uint)
+0:45                'dti' ( in 3-component vector of uint)
+0:45                Constant:
+0:45                  0 (const int)
+0:45            Constant:
+0:45              2 (const int)
+0:45          Constant:
+0:45            0 (const int)
+0:45        subgroupMul ( temp float)
+0:45          direct index ( temp float)
+0:45            f: direct index for structure ( temp 4-component vector of float)
+0:45              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:45                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:45                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:45                  Constant:
+0:45                    0 (const uint)
+0:45                direct index ( temp uint)
+0:45                  'dti' ( in 3-component vector of uint)
+0:45                  Constant:
+0:45                    0 (const int)
+0:45              Constant:
+0:45                2 (const int)
+0:45            Constant:
+0:45              0 (const int)
+0:46      move second child to first child ( temp 2-component vector of float)
+0:46        vector swizzle ( temp 2-component vector of float)
+0:46          f: direct index for structure ( temp 4-component vector of float)
+0:46            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:46              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:46                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:46                Constant:
+0:46                  0 (const uint)
+0:46              direct index ( temp uint)
+0:46                'dti' ( in 3-component vector of uint)
+0:46                Constant:
+0:46                  0 (const int)
+0:46            Constant:
+0:46              2 (const int)
+0:46          Sequence
+0:46            Constant:
+0:46              0 (const int)
+0:46            Constant:
+0:46              1 (const int)
+0:46        subgroupMul ( temp 2-component vector of float)
+0:46          vector swizzle ( temp 2-component vector of float)
+0:46            f: direct index for structure ( temp 4-component vector of float)
+0:46              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:46                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:46                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:46                  Constant:
+0:46                    0 (const uint)
+0:46                direct index ( temp uint)
+0:46                  'dti' ( in 3-component vector of uint)
+0:46                  Constant:
+0:46                    0 (const int)
+0:46              Constant:
+0:46                2 (const int)
+0:46            Sequence
+0:46              Constant:
+0:46                0 (const int)
+0:46              Constant:
+0:46                1 (const int)
+0:47      move second child to first child ( temp 3-component vector of float)
+0:47        vector swizzle ( temp 3-component vector of float)
+0:47          f: direct index for structure ( temp 4-component vector of float)
+0:47            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:47              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:47                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:47                Constant:
+0:47                  0 (const uint)
+0:47              direct index ( temp uint)
+0:47                'dti' ( in 3-component vector of uint)
+0:47                Constant:
+0:47                  0 (const int)
+0:47            Constant:
+0:47              2 (const int)
+0:47          Sequence
+0:47            Constant:
+0:47              0 (const int)
+0:47            Constant:
+0:47              1 (const int)
+0:47            Constant:
+0:47              2 (const int)
+0:47        subgroupMul ( temp 3-component vector of float)
+0:47          vector swizzle ( temp 3-component vector of float)
+0:47            f: direct index for structure ( temp 4-component vector of float)
+0:47              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:47                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:47                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:47                  Constant:
+0:47                    0 (const uint)
+0:47                direct index ( temp uint)
+0:47                  'dti' ( in 3-component vector of uint)
+0:47                  Constant:
+0:47                    0 (const int)
+0:47              Constant:
+0:47                2 (const int)
+0:47            Sequence
+0:47              Constant:
+0:47                0 (const int)
+0:47              Constant:
+0:47                1 (const int)
+0:47              Constant:
+0:47                2 (const int)
+0:49      move second child to first child ( temp 4-component vector of double)
+0:49        d: direct index for structure ( temp 4-component vector of double)
+0:49          indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:49            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:49              'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:49              Constant:
+0:49                0 (const uint)
+0:49            direct index ( temp uint)
+0:49              'dti' ( in 3-component vector of uint)
+0:49              Constant:
+0:49                0 (const int)
+0:49          Constant:
+0:49            3 (const int)
+0:49        subgroupMul ( temp 4-component vector of double)
+0:49          d: direct index for structure ( temp 4-component vector of double)
+0:49            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:49              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:49                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:49                Constant:
+0:49                  0 (const uint)
+0:49              direct index ( temp uint)
+0:49                'dti' ( in 3-component vector of uint)
+0:49                Constant:
+0:49                  0 (const int)
+0:49            Constant:
+0:49              3 (const int)
+0:50      move second child to first child ( temp double)
+0:50        direct index ( temp double)
+0:50          d: direct index for structure ( temp 4-component vector of double)
+0:50            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:50              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:50                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:50                Constant:
+0:50                  0 (const uint)
+0:50              direct index ( temp uint)
+0:50                'dti' ( in 3-component vector of uint)
+0:50                Constant:
+0:50                  0 (const int)
+0:50            Constant:
+0:50              3 (const int)
+0:50          Constant:
+0:50            0 (const int)
+0:50        subgroupMul ( temp double)
+0:50          direct index ( temp double)
+0:50            d: direct index for structure ( temp 4-component vector of double)
+0:50              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:50                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:50                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:50                  Constant:
+0:50                    0 (const uint)
+0:50                direct index ( temp uint)
+0:50                  'dti' ( in 3-component vector of uint)
+0:50                  Constant:
+0:50                    0 (const int)
+0:50              Constant:
+0:50                3 (const int)
+0:50            Constant:
+0:50              0 (const int)
+0:51      move second child to first child ( temp 2-component vector of double)
+0:51        vector swizzle ( temp 2-component vector of double)
+0:51          d: direct index for structure ( temp 4-component vector of double)
+0:51            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:51              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:51                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:51                Constant:
+0:51                  0 (const uint)
+0:51              direct index ( temp uint)
+0:51                'dti' ( in 3-component vector of uint)
+0:51                Constant:
+0:51                  0 (const int)
+0:51            Constant:
+0:51              3 (const int)
+0:51          Sequence
+0:51            Constant:
+0:51              0 (const int)
+0:51            Constant:
+0:51              1 (const int)
+0:51        subgroupMul ( temp 2-component vector of double)
+0:51          vector swizzle ( temp 2-component vector of double)
+0:51            d: direct index for structure ( temp 4-component vector of double)
+0:51              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:51                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:51                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:51                  Constant:
+0:51                    0 (const uint)
+0:51                direct index ( temp uint)
+0:51                  'dti' ( in 3-component vector of uint)
+0:51                  Constant:
+0:51                    0 (const int)
+0:51              Constant:
+0:51                3 (const int)
+0:51            Sequence
+0:51              Constant:
+0:51                0 (const int)
+0:51              Constant:
+0:51                1 (const int)
+0:52      move second child to first child ( temp 3-component vector of double)
+0:52        vector swizzle ( temp 3-component vector of double)
+0:52          d: direct index for structure ( temp 4-component vector of double)
+0:52            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:52              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:52                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:52                Constant:
+0:52                  0 (const uint)
+0:52              direct index ( temp uint)
+0:52                'dti' ( in 3-component vector of uint)
+0:52                Constant:
+0:52                  0 (const int)
+0:52            Constant:
+0:52              3 (const int)
+0:52          Sequence
+0:52            Constant:
+0:52              0 (const int)
+0:52            Constant:
+0:52              1 (const int)
+0:52            Constant:
+0:52              2 (const int)
+0:52        subgroupMul ( temp 3-component vector of double)
+0:52          vector swizzle ( temp 3-component vector of double)
+0:52            d: direct index for structure ( temp 4-component vector of double)
+0:52              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:52                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:52                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:52                  Constant:
+0:52                    0 (const uint)
+0:52                direct index ( temp uint)
+0:52                  'dti' ( in 3-component vector of uint)
+0:52                  Constant:
+0:52                    0 (const int)
+0:52              Constant:
+0:52                3 (const int)
+0:52            Sequence
+0:52              Constant:
+0:52                0 (const int)
+0:52              Constant:
+0:52                1 (const int)
+0:52              Constant:
+0:52                2 (const int)
+0:54      move second child to first child ( temp 4-component vector of uint)
+0:54        u: direct index for structure ( temp 4-component vector of uint)
+0:54          indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:54            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:54              'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:54              Constant:
+0:54                0 (const uint)
+0:54            direct index ( temp uint)
+0:54              'dti' ( in 3-component vector of uint)
+0:54              Constant:
+0:54                0 (const int)
+0:54          Constant:
+0:54            0 (const int)
+0:54        subgroupMin ( temp 4-component vector of uint)
+0:54          u: direct index for structure ( temp 4-component vector of uint)
+0:54            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:54              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:54                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:54                Constant:
+0:54                  0 (const uint)
+0:54              direct index ( temp uint)
+0:54                'dti' ( in 3-component vector of uint)
+0:54                Constant:
+0:54                  0 (const int)
+0:54            Constant:
+0:54              0 (const int)
+0:55      move second child to first child ( temp uint)
+0:55        direct index ( temp uint)
+0:55          u: direct index for structure ( temp 4-component vector of uint)
+0:55            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:55              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:55                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:55                Constant:
+0:55                  0 (const uint)
+0:55              direct index ( temp uint)
+0:55                'dti' ( in 3-component vector of uint)
+0:55                Constant:
+0:55                  0 (const int)
+0:55            Constant:
+0:55              0 (const int)
+0:55          Constant:
+0:55            0 (const int)
+0:55        subgroupMin ( temp uint)
+0:55          direct index ( temp uint)
+0:55            u: direct index for structure ( temp 4-component vector of uint)
+0:55              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:55                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:55                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:55                  Constant:
+0:55                    0 (const uint)
+0:55                direct index ( temp uint)
+0:55                  'dti' ( in 3-component vector of uint)
+0:55                  Constant:
+0:55                    0 (const int)
+0:55              Constant:
+0:55                0 (const int)
+0:55            Constant:
+0:55              0 (const int)
+0:56      move second child to first child ( temp 2-component vector of uint)
+0:56        vector swizzle ( temp 2-component vector of uint)
+0:56          u: direct index for structure ( temp 4-component vector of uint)
+0:56            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:56              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:56                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:56                Constant:
+0:56                  0 (const uint)
+0:56              direct index ( temp uint)
+0:56                'dti' ( in 3-component vector of uint)
+0:56                Constant:
+0:56                  0 (const int)
+0:56            Constant:
+0:56              0 (const int)
+0:56          Sequence
+0:56            Constant:
+0:56              0 (const int)
+0:56            Constant:
+0:56              1 (const int)
+0:56        subgroupMin ( temp 2-component vector of uint)
+0:56          vector swizzle ( temp 2-component vector of uint)
+0:56            u: direct index for structure ( temp 4-component vector of uint)
+0:56              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:56                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:56                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:56                  Constant:
+0:56                    0 (const uint)
+0:56                direct index ( temp uint)
+0:56                  'dti' ( in 3-component vector of uint)
+0:56                  Constant:
+0:56                    0 (const int)
+0:56              Constant:
+0:56                0 (const int)
+0:56            Sequence
+0:56              Constant:
+0:56                0 (const int)
+0:56              Constant:
+0:56                1 (const int)
+0:57      move second child to first child ( temp 3-component vector of uint)
+0:57        vector swizzle ( temp 3-component vector of uint)
+0:57          u: direct index for structure ( temp 4-component vector of uint)
+0:57            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:57              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:57                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:57                Constant:
+0:57                  0 (const uint)
+0:57              direct index ( temp uint)
+0:57                'dti' ( in 3-component vector of uint)
+0:57                Constant:
+0:57                  0 (const int)
+0:57            Constant:
+0:57              0 (const int)
+0:57          Sequence
+0:57            Constant:
+0:57              0 (const int)
+0:57            Constant:
+0:57              1 (const int)
+0:57            Constant:
+0:57              2 (const int)
+0:57        subgroupMin ( temp 3-component vector of uint)
+0:57          vector swizzle ( temp 3-component vector of uint)
+0:57            u: direct index for structure ( temp 4-component vector of uint)
+0:57              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:57                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:57                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:57                  Constant:
+0:57                    0 (const uint)
+0:57                direct index ( temp uint)
+0:57                  'dti' ( in 3-component vector of uint)
+0:57                  Constant:
+0:57                    0 (const int)
+0:57              Constant:
+0:57                0 (const int)
+0:57            Sequence
+0:57              Constant:
+0:57                0 (const int)
+0:57              Constant:
+0:57                1 (const int)
+0:57              Constant:
+0:57                2 (const int)
+0:59      move second child to first child ( temp 4-component vector of int)
+0:59        i: direct index for structure ( temp 4-component vector of int)
+0:59          indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:59            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:59              'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:59              Constant:
+0:59                0 (const uint)
+0:59            direct index ( temp uint)
+0:59              'dti' ( in 3-component vector of uint)
+0:59              Constant:
+0:59                0 (const int)
+0:59          Constant:
+0:59            1 (const int)
+0:59        subgroupMin ( temp 4-component vector of int)
+0:59          i: direct index for structure ( temp 4-component vector of int)
+0:59            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:59              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:59                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:59                Constant:
+0:59                  0 (const uint)
+0:59              direct index ( temp uint)
+0:59                'dti' ( in 3-component vector of uint)
+0:59                Constant:
+0:59                  0 (const int)
+0:59            Constant:
+0:59              1 (const int)
+0:60      move second child to first child ( temp int)
+0:60        direct index ( temp int)
+0:60          i: direct index for structure ( temp 4-component vector of int)
+0:60            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:60              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:60                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:60                Constant:
+0:60                  0 (const uint)
+0:60              direct index ( temp uint)
+0:60                'dti' ( in 3-component vector of uint)
+0:60                Constant:
+0:60                  0 (const int)
+0:60            Constant:
+0:60              1 (const int)
+0:60          Constant:
+0:60            0 (const int)
+0:60        subgroupMin ( temp int)
+0:60          direct index ( temp int)
+0:60            i: direct index for structure ( temp 4-component vector of int)
+0:60              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:60                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:60                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:60                  Constant:
+0:60                    0 (const uint)
+0:60                direct index ( temp uint)
+0:60                  'dti' ( in 3-component vector of uint)
+0:60                  Constant:
+0:60                    0 (const int)
+0:60              Constant:
+0:60                1 (const int)
+0:60            Constant:
+0:60              0 (const int)
+0:61      move second child to first child ( temp 2-component vector of int)
+0:61        vector swizzle ( temp 2-component vector of int)
+0:61          i: direct index for structure ( temp 4-component vector of int)
+0:61            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:61              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:61                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:61                Constant:
+0:61                  0 (const uint)
+0:61              direct index ( temp uint)
+0:61                'dti' ( in 3-component vector of uint)
+0:61                Constant:
+0:61                  0 (const int)
+0:61            Constant:
+0:61              1 (const int)
+0:61          Sequence
+0:61            Constant:
+0:61              0 (const int)
+0:61            Constant:
+0:61              1 (const int)
+0:61        subgroupMin ( temp 2-component vector of int)
+0:61          vector swizzle ( temp 2-component vector of int)
+0:61            i: direct index for structure ( temp 4-component vector of int)
+0:61              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:61                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:61                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:61                  Constant:
+0:61                    0 (const uint)
+0:61                direct index ( temp uint)
+0:61                  'dti' ( in 3-component vector of uint)
+0:61                  Constant:
+0:61                    0 (const int)
+0:61              Constant:
+0:61                1 (const int)
+0:61            Sequence
+0:61              Constant:
+0:61                0 (const int)
+0:61              Constant:
+0:61                1 (const int)
+0:62      move second child to first child ( temp 3-component vector of int)
+0:62        vector swizzle ( temp 3-component vector of int)
+0:62          i: direct index for structure ( temp 4-component vector of int)
+0:62            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:62              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:62                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:62                Constant:
+0:62                  0 (const uint)
+0:62              direct index ( temp uint)
+0:62                'dti' ( in 3-component vector of uint)
+0:62                Constant:
+0:62                  0 (const int)
+0:62            Constant:
+0:62              1 (const int)
+0:62          Sequence
+0:62            Constant:
+0:62              0 (const int)
+0:62            Constant:
+0:62              1 (const int)
+0:62            Constant:
+0:62              2 (const int)
+0:62        subgroupMin ( temp 3-component vector of int)
+0:62          vector swizzle ( temp 3-component vector of int)
+0:62            i: direct index for structure ( temp 4-component vector of int)
+0:62              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:62                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:62                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:62                  Constant:
+0:62                    0 (const uint)
+0:62                direct index ( temp uint)
+0:62                  'dti' ( in 3-component vector of uint)
+0:62                  Constant:
+0:62                    0 (const int)
+0:62              Constant:
+0:62                1 (const int)
+0:62            Sequence
+0:62              Constant:
+0:62                0 (const int)
+0:62              Constant:
+0:62                1 (const int)
+0:62              Constant:
+0:62                2 (const int)
+0:64      move second child to first child ( temp 4-component vector of float)
+0:64        f: direct index for structure ( temp 4-component vector of float)
+0:64          indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:64            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:64              'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:64              Constant:
+0:64                0 (const uint)
+0:64            direct index ( temp uint)
+0:64              'dti' ( in 3-component vector of uint)
+0:64              Constant:
+0:64                0 (const int)
+0:64          Constant:
+0:64            2 (const int)
+0:64        subgroupMin ( temp 4-component vector of float)
+0:64          f: direct index for structure ( temp 4-component vector of float)
+0:64            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:64              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:64                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:64                Constant:
+0:64                  0 (const uint)
+0:64              direct index ( temp uint)
+0:64                'dti' ( in 3-component vector of uint)
+0:64                Constant:
+0:64                  0 (const int)
+0:64            Constant:
+0:64              2 (const int)
+0:65      move second child to first child ( temp float)
+0:65        direct index ( temp float)
+0:65          f: direct index for structure ( temp 4-component vector of float)
+0:65            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:65              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:65                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:65                Constant:
+0:65                  0 (const uint)
+0:65              direct index ( temp uint)
+0:65                'dti' ( in 3-component vector of uint)
+0:65                Constant:
+0:65                  0 (const int)
+0:65            Constant:
+0:65              2 (const int)
+0:65          Constant:
+0:65            0 (const int)
+0:65        subgroupMin ( temp float)
+0:65          direct index ( temp float)
+0:65            f: direct index for structure ( temp 4-component vector of float)
+0:65              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:65                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:65                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:65                  Constant:
+0:65                    0 (const uint)
+0:65                direct index ( temp uint)
+0:65                  'dti' ( in 3-component vector of uint)
+0:65                  Constant:
+0:65                    0 (const int)
+0:65              Constant:
+0:65                2 (const int)
+0:65            Constant:
+0:65              0 (const int)
+0:66      move second child to first child ( temp 2-component vector of float)
+0:66        vector swizzle ( temp 2-component vector of float)
+0:66          f: direct index for structure ( temp 4-component vector of float)
+0:66            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:66              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:66                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:66                Constant:
+0:66                  0 (const uint)
+0:66              direct index ( temp uint)
+0:66                'dti' ( in 3-component vector of uint)
+0:66                Constant:
+0:66                  0 (const int)
+0:66            Constant:
+0:66              2 (const int)
+0:66          Sequence
+0:66            Constant:
+0:66              0 (const int)
+0:66            Constant:
+0:66              1 (const int)
+0:66        subgroupMin ( temp 2-component vector of float)
+0:66          vector swizzle ( temp 2-component vector of float)
+0:66            f: direct index for structure ( temp 4-component vector of float)
+0:66              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:66                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:66                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:66                  Constant:
+0:66                    0 (const uint)
+0:66                direct index ( temp uint)
+0:66                  'dti' ( in 3-component vector of uint)
+0:66                  Constant:
+0:66                    0 (const int)
+0:66              Constant:
+0:66                2 (const int)
+0:66            Sequence
+0:66              Constant:
+0:66                0 (const int)
+0:66              Constant:
+0:66                1 (const int)
+0:67      move second child to first child ( temp 3-component vector of float)
+0:67        vector swizzle ( temp 3-component vector of float)
+0:67          f: direct index for structure ( temp 4-component vector of float)
+0:67            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:67              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:67                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:67                Constant:
+0:67                  0 (const uint)
+0:67              direct index ( temp uint)
+0:67                'dti' ( in 3-component vector of uint)
+0:67                Constant:
+0:67                  0 (const int)
+0:67            Constant:
+0:67              2 (const int)
+0:67          Sequence
+0:67            Constant:
+0:67              0 (const int)
+0:67            Constant:
+0:67              1 (const int)
+0:67            Constant:
+0:67              2 (const int)
+0:67        subgroupMin ( temp 3-component vector of float)
+0:67          vector swizzle ( temp 3-component vector of float)
+0:67            f: direct index for structure ( temp 4-component vector of float)
+0:67              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:67                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:67                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:67                  Constant:
+0:67                    0 (const uint)
+0:67                direct index ( temp uint)
+0:67                  'dti' ( in 3-component vector of uint)
+0:67                  Constant:
+0:67                    0 (const int)
+0:67              Constant:
+0:67                2 (const int)
+0:67            Sequence
+0:67              Constant:
+0:67                0 (const int)
+0:67              Constant:
+0:67                1 (const int)
+0:67              Constant:
+0:67                2 (const int)
+0:69      move second child to first child ( temp 4-component vector of double)
+0:69        d: direct index for structure ( temp 4-component vector of double)
+0:69          indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:69            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:69              'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:69              Constant:
+0:69                0 (const uint)
+0:69            direct index ( temp uint)
+0:69              'dti' ( in 3-component vector of uint)
+0:69              Constant:
+0:69                0 (const int)
+0:69          Constant:
+0:69            3 (const int)
+0:69        subgroupMin ( temp 4-component vector of double)
+0:69          d: direct index for structure ( temp 4-component vector of double)
+0:69            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:69              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:69                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:69                Constant:
+0:69                  0 (const uint)
+0:69              direct index ( temp uint)
+0:69                'dti' ( in 3-component vector of uint)
+0:69                Constant:
+0:69                  0 (const int)
+0:69            Constant:
+0:69              3 (const int)
+0:70      move second child to first child ( temp double)
+0:70        direct index ( temp double)
+0:70          d: direct index for structure ( temp 4-component vector of double)
+0:70            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:70              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:70                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:70                Constant:
+0:70                  0 (const uint)
+0:70              direct index ( temp uint)
+0:70                'dti' ( in 3-component vector of uint)
+0:70                Constant:
+0:70                  0 (const int)
+0:70            Constant:
+0:70              3 (const int)
+0:70          Constant:
+0:70            0 (const int)
+0:70        subgroupMin ( temp double)
+0:70          direct index ( temp double)
+0:70            d: direct index for structure ( temp 4-component vector of double)
+0:70              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:70                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:70                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:70                  Constant:
+0:70                    0 (const uint)
+0:70                direct index ( temp uint)
+0:70                  'dti' ( in 3-component vector of uint)
+0:70                  Constant:
+0:70                    0 (const int)
+0:70              Constant:
+0:70                3 (const int)
+0:70            Constant:
+0:70              0 (const int)
+0:71      move second child to first child ( temp 2-component vector of double)
+0:71        vector swizzle ( temp 2-component vector of double)
+0:71          d: direct index for structure ( temp 4-component vector of double)
+0:71            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:71              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:71                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:71                Constant:
+0:71                  0 (const uint)
+0:71              direct index ( temp uint)
+0:71                'dti' ( in 3-component vector of uint)
+0:71                Constant:
+0:71                  0 (const int)
+0:71            Constant:
+0:71              3 (const int)
+0:71          Sequence
+0:71            Constant:
+0:71              0 (const int)
+0:71            Constant:
+0:71              1 (const int)
+0:71        subgroupMin ( temp 2-component vector of double)
+0:71          vector swizzle ( temp 2-component vector of double)
+0:71            d: direct index for structure ( temp 4-component vector of double)
+0:71              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:71                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:71                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:71                  Constant:
+0:71                    0 (const uint)
+0:71                direct index ( temp uint)
+0:71                  'dti' ( in 3-component vector of uint)
+0:71                  Constant:
+0:71                    0 (const int)
+0:71              Constant:
+0:71                3 (const int)
+0:71            Sequence
+0:71              Constant:
+0:71                0 (const int)
+0:71              Constant:
+0:71                1 (const int)
+0:72      move second child to first child ( temp 3-component vector of double)
+0:72        vector swizzle ( temp 3-component vector of double)
+0:72          d: direct index for structure ( temp 4-component vector of double)
+0:72            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:72              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:72                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:72                Constant:
+0:72                  0 (const uint)
+0:72              direct index ( temp uint)
+0:72                'dti' ( in 3-component vector of uint)
+0:72                Constant:
+0:72                  0 (const int)
+0:72            Constant:
+0:72              3 (const int)
+0:72          Sequence
+0:72            Constant:
+0:72              0 (const int)
+0:72            Constant:
+0:72              1 (const int)
+0:72            Constant:
+0:72              2 (const int)
+0:72        subgroupMin ( temp 3-component vector of double)
+0:72          vector swizzle ( temp 3-component vector of double)
+0:72            d: direct index for structure ( temp 4-component vector of double)
+0:72              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:72                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:72                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:72                  Constant:
+0:72                    0 (const uint)
+0:72                direct index ( temp uint)
+0:72                  'dti' ( in 3-component vector of uint)
+0:72                  Constant:
+0:72                    0 (const int)
+0:72              Constant:
+0:72                3 (const int)
+0:72            Sequence
+0:72              Constant:
+0:72                0 (const int)
+0:72              Constant:
+0:72                1 (const int)
+0:72              Constant:
+0:72                2 (const int)
+0:74      move second child to first child ( temp 4-component vector of uint)
+0:74        u: direct index for structure ( temp 4-component vector of uint)
+0:74          indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:74            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:74              'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:74              Constant:
+0:74                0 (const uint)
+0:74            direct index ( temp uint)
+0:74              'dti' ( in 3-component vector of uint)
+0:74              Constant:
+0:74                0 (const int)
+0:74          Constant:
+0:74            0 (const int)
+0:74        subgroupMax ( temp 4-component vector of uint)
+0:74          u: direct index for structure ( temp 4-component vector of uint)
+0:74            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:74              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:74                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:74                Constant:
+0:74                  0 (const uint)
+0:74              direct index ( temp uint)
+0:74                'dti' ( in 3-component vector of uint)
+0:74                Constant:
+0:74                  0 (const int)
+0:74            Constant:
+0:74              0 (const int)
+0:75      move second child to first child ( temp uint)
+0:75        direct index ( temp uint)
+0:75          u: direct index for structure ( temp 4-component vector of uint)
+0:75            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:75              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:75                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:75                Constant:
+0:75                  0 (const uint)
+0:75              direct index ( temp uint)
+0:75                'dti' ( in 3-component vector of uint)
+0:75                Constant:
+0:75                  0 (const int)
+0:75            Constant:
+0:75              0 (const int)
+0:75          Constant:
+0:75            0 (const int)
+0:75        subgroupMax ( temp uint)
+0:75          direct index ( temp uint)
+0:75            u: direct index for structure ( temp 4-component vector of uint)
+0:75              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:75                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:75                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:75                  Constant:
+0:75                    0 (const uint)
+0:75                direct index ( temp uint)
+0:75                  'dti' ( in 3-component vector of uint)
+0:75                  Constant:
+0:75                    0 (const int)
+0:75              Constant:
+0:75                0 (const int)
+0:75            Constant:
+0:75              0 (const int)
+0:76      move second child to first child ( temp 2-component vector of uint)
+0:76        vector swizzle ( temp 2-component vector of uint)
+0:76          u: direct index for structure ( temp 4-component vector of uint)
+0:76            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:76              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:76                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:76                Constant:
+0:76                  0 (const uint)
+0:76              direct index ( temp uint)
+0:76                'dti' ( in 3-component vector of uint)
+0:76                Constant:
+0:76                  0 (const int)
+0:76            Constant:
+0:76              0 (const int)
+0:76          Sequence
+0:76            Constant:
+0:76              0 (const int)
+0:76            Constant:
+0:76              1 (const int)
+0:76        subgroupMax ( temp 2-component vector of uint)
+0:76          vector swizzle ( temp 2-component vector of uint)
+0:76            u: direct index for structure ( temp 4-component vector of uint)
+0:76              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:76                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:76                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:76                  Constant:
+0:76                    0 (const uint)
+0:76                direct index ( temp uint)
+0:76                  'dti' ( in 3-component vector of uint)
+0:76                  Constant:
+0:76                    0 (const int)
+0:76              Constant:
+0:76                0 (const int)
+0:76            Sequence
+0:76              Constant:
+0:76                0 (const int)
+0:76              Constant:
+0:76                1 (const int)
+0:77      move second child to first child ( temp 3-component vector of uint)
+0:77        vector swizzle ( temp 3-component vector of uint)
+0:77          u: direct index for structure ( temp 4-component vector of uint)
+0:77            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:77              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:77                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:77                Constant:
+0:77                  0 (const uint)
+0:77              direct index ( temp uint)
+0:77                'dti' ( in 3-component vector of uint)
+0:77                Constant:
+0:77                  0 (const int)
+0:77            Constant:
+0:77              0 (const int)
+0:77          Sequence
+0:77            Constant:
+0:77              0 (const int)
+0:77            Constant:
+0:77              1 (const int)
+0:77            Constant:
+0:77              2 (const int)
+0:77        subgroupMax ( temp 3-component vector of uint)
+0:77          vector swizzle ( temp 3-component vector of uint)
+0:77            u: direct index for structure ( temp 4-component vector of uint)
+0:77              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:77                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:77                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:77                  Constant:
+0:77                    0 (const uint)
+0:77                direct index ( temp uint)
+0:77                  'dti' ( in 3-component vector of uint)
+0:77                  Constant:
+0:77                    0 (const int)
+0:77              Constant:
+0:77                0 (const int)
+0:77            Sequence
+0:77              Constant:
+0:77                0 (const int)
+0:77              Constant:
+0:77                1 (const int)
+0:77              Constant:
+0:77                2 (const int)
+0:79      move second child to first child ( temp 4-component vector of int)
+0:79        i: direct index for structure ( temp 4-component vector of int)
+0:79          indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:79            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:79              'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:79              Constant:
+0:79                0 (const uint)
+0:79            direct index ( temp uint)
+0:79              'dti' ( in 3-component vector of uint)
+0:79              Constant:
+0:79                0 (const int)
+0:79          Constant:
+0:79            1 (const int)
+0:79        subgroupMax ( temp 4-component vector of int)
+0:79          i: direct index for structure ( temp 4-component vector of int)
+0:79            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:79              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:79                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:79                Constant:
+0:79                  0 (const uint)
+0:79              direct index ( temp uint)
+0:79                'dti' ( in 3-component vector of uint)
+0:79                Constant:
+0:79                  0 (const int)
+0:79            Constant:
+0:79              1 (const int)
+0:80      move second child to first child ( temp int)
+0:80        direct index ( temp int)
+0:80          i: direct index for structure ( temp 4-component vector of int)
+0:80            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:80              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:80                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:80                Constant:
+0:80                  0 (const uint)
+0:80              direct index ( temp uint)
+0:80                'dti' ( in 3-component vector of uint)
+0:80                Constant:
+0:80                  0 (const int)
+0:80            Constant:
+0:80              1 (const int)
+0:80          Constant:
+0:80            0 (const int)
+0:80        subgroupMax ( temp int)
+0:80          direct index ( temp int)
+0:80            i: direct index for structure ( temp 4-component vector of int)
+0:80              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:80                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:80                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:80                  Constant:
+0:80                    0 (const uint)
+0:80                direct index ( temp uint)
+0:80                  'dti' ( in 3-component vector of uint)
+0:80                  Constant:
+0:80                    0 (const int)
+0:80              Constant:
+0:80                1 (const int)
+0:80            Constant:
+0:80              0 (const int)
+0:81      move second child to first child ( temp 2-component vector of int)
+0:81        vector swizzle ( temp 2-component vector of int)
+0:81          i: direct index for structure ( temp 4-component vector of int)
+0:81            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:81              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:81                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:81                Constant:
+0:81                  0 (const uint)
+0:81              direct index ( temp uint)
+0:81                'dti' ( in 3-component vector of uint)
+0:81                Constant:
+0:81                  0 (const int)
+0:81            Constant:
+0:81              1 (const int)
+0:81          Sequence
+0:81            Constant:
+0:81              0 (const int)
+0:81            Constant:
+0:81              1 (const int)
+0:81        subgroupMax ( temp 2-component vector of int)
+0:81          vector swizzle ( temp 2-component vector of int)
+0:81            i: direct index for structure ( temp 4-component vector of int)
+0:81              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:81                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:81                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:81                  Constant:
+0:81                    0 (const uint)
+0:81                direct index ( temp uint)
+0:81                  'dti' ( in 3-component vector of uint)
+0:81                  Constant:
+0:81                    0 (const int)
+0:81              Constant:
+0:81                1 (const int)
+0:81            Sequence
+0:81              Constant:
+0:81                0 (const int)
+0:81              Constant:
+0:81                1 (const int)
+0:82      move second child to first child ( temp 3-component vector of int)
+0:82        vector swizzle ( temp 3-component vector of int)
+0:82          i: direct index for structure ( temp 4-component vector of int)
+0:82            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:82              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:82                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:82                Constant:
+0:82                  0 (const uint)
+0:82              direct index ( temp uint)
+0:82                'dti' ( in 3-component vector of uint)
+0:82                Constant:
+0:82                  0 (const int)
+0:82            Constant:
+0:82              1 (const int)
+0:82          Sequence
+0:82            Constant:
+0:82              0 (const int)
+0:82            Constant:
+0:82              1 (const int)
+0:82            Constant:
+0:82              2 (const int)
+0:82        subgroupMax ( temp 3-component vector of int)
+0:82          vector swizzle ( temp 3-component vector of int)
+0:82            i: direct index for structure ( temp 4-component vector of int)
+0:82              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:82                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:82                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:82                  Constant:
+0:82                    0 (const uint)
+0:82                direct index ( temp uint)
+0:82                  'dti' ( in 3-component vector of uint)
+0:82                  Constant:
+0:82                    0 (const int)
+0:82              Constant:
+0:82                1 (const int)
+0:82            Sequence
+0:82              Constant:
+0:82                0 (const int)
+0:82              Constant:
+0:82                1 (const int)
+0:82              Constant:
+0:82                2 (const int)
+0:84      move second child to first child ( temp 4-component vector of float)
+0:84        f: direct index for structure ( temp 4-component vector of float)
+0:84          indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:84            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:84              'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:84              Constant:
+0:84                0 (const uint)
+0:84            direct index ( temp uint)
+0:84              'dti' ( in 3-component vector of uint)
+0:84              Constant:
+0:84                0 (const int)
+0:84          Constant:
+0:84            2 (const int)
+0:84        subgroupMax ( temp 4-component vector of float)
+0:84          f: direct index for structure ( temp 4-component vector of float)
+0:84            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:84              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:84                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:84                Constant:
+0:84                  0 (const uint)
+0:84              direct index ( temp uint)
+0:84                'dti' ( in 3-component vector of uint)
+0:84                Constant:
+0:84                  0 (const int)
+0:84            Constant:
+0:84              2 (const int)
+0:85      move second child to first child ( temp float)
+0:85        direct index ( temp float)
+0:85          f: direct index for structure ( temp 4-component vector of float)
+0:85            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:85              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:85                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:85                Constant:
+0:85                  0 (const uint)
+0:85              direct index ( temp uint)
+0:85                'dti' ( in 3-component vector of uint)
+0:85                Constant:
+0:85                  0 (const int)
+0:85            Constant:
+0:85              2 (const int)
+0:85          Constant:
+0:85            0 (const int)
+0:85        subgroupMax ( temp float)
+0:85          direct index ( temp float)
+0:85            f: direct index for structure ( temp 4-component vector of float)
+0:85              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:85                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:85                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:85                  Constant:
+0:85                    0 (const uint)
+0:85                direct index ( temp uint)
+0:85                  'dti' ( in 3-component vector of uint)
+0:85                  Constant:
+0:85                    0 (const int)
+0:85              Constant:
+0:85                2 (const int)
+0:85            Constant:
+0:85              0 (const int)
+0:86      move second child to first child ( temp 2-component vector of float)
+0:86        vector swizzle ( temp 2-component vector of float)
+0:86          f: direct index for structure ( temp 4-component vector of float)
+0:86            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:86              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:86                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:86                Constant:
+0:86                  0 (const uint)
+0:86              direct index ( temp uint)
+0:86                'dti' ( in 3-component vector of uint)
+0:86                Constant:
+0:86                  0 (const int)
+0:86            Constant:
+0:86              2 (const int)
+0:86          Sequence
+0:86            Constant:
+0:86              0 (const int)
+0:86            Constant:
+0:86              1 (const int)
+0:86        subgroupMax ( temp 2-component vector of float)
+0:86          vector swizzle ( temp 2-component vector of float)
+0:86            f: direct index for structure ( temp 4-component vector of float)
+0:86              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:86                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:86                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:86                  Constant:
+0:86                    0 (const uint)
+0:86                direct index ( temp uint)
+0:86                  'dti' ( in 3-component vector of uint)
+0:86                  Constant:
+0:86                    0 (const int)
+0:86              Constant:
+0:86                2 (const int)
+0:86            Sequence
+0:86              Constant:
+0:86                0 (const int)
+0:86              Constant:
+0:86                1 (const int)
+0:87      move second child to first child ( temp 3-component vector of float)
+0:87        vector swizzle ( temp 3-component vector of float)
+0:87          f: direct index for structure ( temp 4-component vector of float)
+0:87            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:87              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:87                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:87                Constant:
+0:87                  0 (const uint)
+0:87              direct index ( temp uint)
+0:87                'dti' ( in 3-component vector of uint)
+0:87                Constant:
+0:87                  0 (const int)
+0:87            Constant:
+0:87              2 (const int)
+0:87          Sequence
+0:87            Constant:
+0:87              0 (const int)
+0:87            Constant:
+0:87              1 (const int)
+0:87            Constant:
+0:87              2 (const int)
+0:87        subgroupMax ( temp 3-component vector of float)
+0:87          vector swizzle ( temp 3-component vector of float)
+0:87            f: direct index for structure ( temp 4-component vector of float)
+0:87              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:87                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:87                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:87                  Constant:
+0:87                    0 (const uint)
+0:87                direct index ( temp uint)
+0:87                  'dti' ( in 3-component vector of uint)
+0:87                  Constant:
+0:87                    0 (const int)
+0:87              Constant:
+0:87                2 (const int)
+0:87            Sequence
+0:87              Constant:
+0:87                0 (const int)
+0:87              Constant:
+0:87                1 (const int)
+0:87              Constant:
+0:87                2 (const int)
+0:89      move second child to first child ( temp 4-component vector of double)
+0:89        d: direct index for structure ( temp 4-component vector of double)
+0:89          indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:89            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:89              'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:89              Constant:
+0:89                0 (const uint)
+0:89            direct index ( temp uint)
+0:89              'dti' ( in 3-component vector of uint)
+0:89              Constant:
+0:89                0 (const int)
+0:89          Constant:
+0:89            3 (const int)
+0:89        subgroupMax ( temp 4-component vector of double)
+0:89          d: direct index for structure ( temp 4-component vector of double)
+0:89            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:89              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:89                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:89                Constant:
+0:89                  0 (const uint)
+0:89              direct index ( temp uint)
+0:89                'dti' ( in 3-component vector of uint)
+0:89                Constant:
+0:89                  0 (const int)
+0:89            Constant:
+0:89              3 (const int)
+0:90      move second child to first child ( temp double)
+0:90        direct index ( temp double)
+0:90          d: direct index for structure ( temp 4-component vector of double)
+0:90            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:90              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:90                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:90                Constant:
+0:90                  0 (const uint)
+0:90              direct index ( temp uint)
+0:90                'dti' ( in 3-component vector of uint)
+0:90                Constant:
+0:90                  0 (const int)
+0:90            Constant:
+0:90              3 (const int)
+0:90          Constant:
+0:90            0 (const int)
+0:90        subgroupMax ( temp double)
+0:90          direct index ( temp double)
+0:90            d: direct index for structure ( temp 4-component vector of double)
+0:90              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:90                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:90                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:90                  Constant:
+0:90                    0 (const uint)
+0:90                direct index ( temp uint)
+0:90                  'dti' ( in 3-component vector of uint)
+0:90                  Constant:
+0:90                    0 (const int)
+0:90              Constant:
+0:90                3 (const int)
+0:90            Constant:
+0:90              0 (const int)
+0:91      move second child to first child ( temp 2-component vector of double)
+0:91        vector swizzle ( temp 2-component vector of double)
+0:91          d: direct index for structure ( temp 4-component vector of double)
+0:91            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:91              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:91                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:91                Constant:
+0:91                  0 (const uint)
+0:91              direct index ( temp uint)
+0:91                'dti' ( in 3-component vector of uint)
+0:91                Constant:
+0:91                  0 (const int)
+0:91            Constant:
+0:91              3 (const int)
+0:91          Sequence
+0:91            Constant:
+0:91              0 (const int)
+0:91            Constant:
+0:91              1 (const int)
+0:91        subgroupMax ( temp 2-component vector of double)
+0:91          vector swizzle ( temp 2-component vector of double)
+0:91            d: direct index for structure ( temp 4-component vector of double)
+0:91              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:91                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:91                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:91                  Constant:
+0:91                    0 (const uint)
+0:91                direct index ( temp uint)
+0:91                  'dti' ( in 3-component vector of uint)
+0:91                  Constant:
+0:91                    0 (const int)
+0:91              Constant:
+0:91                3 (const int)
+0:91            Sequence
+0:91              Constant:
+0:91                0 (const int)
+0:91              Constant:
+0:91                1 (const int)
+0:92      move second child to first child ( temp 3-component vector of double)
+0:92        vector swizzle ( temp 3-component vector of double)
+0:92          d: direct index for structure ( temp 4-component vector of double)
+0:92            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:92              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:92                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:92                Constant:
+0:92                  0 (const uint)
+0:92              direct index ( temp uint)
+0:92                'dti' ( in 3-component vector of uint)
+0:92                Constant:
+0:92                  0 (const int)
+0:92            Constant:
+0:92              3 (const int)
+0:92          Sequence
+0:92            Constant:
+0:92              0 (const int)
+0:92            Constant:
+0:92              1 (const int)
+0:92            Constant:
+0:92              2 (const int)
+0:92        subgroupMax ( temp 3-component vector of double)
+0:92          vector swizzle ( temp 3-component vector of double)
+0:92            d: direct index for structure ( temp 4-component vector of double)
+0:92              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:92                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:92                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:92                  Constant:
+0:92                    0 (const uint)
+0:92                direct index ( temp uint)
+0:92                  'dti' ( in 3-component vector of uint)
+0:92                  Constant:
+0:92                    0 (const int)
+0:92              Constant:
+0:92                3 (const int)
+0:92            Sequence
+0:92              Constant:
+0:92                0 (const int)
+0:92              Constant:
+0:92                1 (const int)
+0:92              Constant:
+0:92                2 (const int)
+0:94      move second child to first child ( temp 4-component vector of uint)
+0:94        u: direct index for structure ( temp 4-component vector of uint)
+0:94          indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:94            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:94              'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:94              Constant:
+0:94                0 (const uint)
+0:94            direct index ( temp uint)
+0:94              'dti' ( in 3-component vector of uint)
+0:94              Constant:
+0:94                0 (const int)
+0:94          Constant:
+0:94            0 (const int)
+0:94        subgroupAnd ( temp 4-component vector of uint)
+0:94          u: direct index for structure ( temp 4-component vector of uint)
+0:94            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:94              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:94                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:94                Constant:
+0:94                  0 (const uint)
+0:94              direct index ( temp uint)
+0:94                'dti' ( in 3-component vector of uint)
+0:94                Constant:
+0:94                  0 (const int)
+0:94            Constant:
+0:94              0 (const int)
+0:95      move second child to first child ( temp uint)
+0:95        direct index ( temp uint)
+0:95          u: direct index for structure ( temp 4-component vector of uint)
+0:95            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:95              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:95                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:95                Constant:
+0:95                  0 (const uint)
+0:95              direct index ( temp uint)
+0:95                'dti' ( in 3-component vector of uint)
+0:95                Constant:
+0:95                  0 (const int)
+0:95            Constant:
+0:95              0 (const int)
+0:95          Constant:
+0:95            0 (const int)
+0:95        subgroupAnd ( temp uint)
+0:95          direct index ( temp uint)
+0:95            u: direct index for structure ( temp 4-component vector of uint)
+0:95              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:95                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:95                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:95                  Constant:
+0:95                    0 (const uint)
+0:95                direct index ( temp uint)
+0:95                  'dti' ( in 3-component vector of uint)
+0:95                  Constant:
+0:95                    0 (const int)
+0:95              Constant:
+0:95                0 (const int)
+0:95            Constant:
+0:95              0 (const int)
+0:96      move second child to first child ( temp 2-component vector of uint)
+0:96        vector swizzle ( temp 2-component vector of uint)
+0:96          u: direct index for structure ( temp 4-component vector of uint)
+0:96            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:96              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:96                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:96                Constant:
+0:96                  0 (const uint)
+0:96              direct index ( temp uint)
+0:96                'dti' ( in 3-component vector of uint)
+0:96                Constant:
+0:96                  0 (const int)
+0:96            Constant:
+0:96              0 (const int)
+0:96          Sequence
+0:96            Constant:
+0:96              0 (const int)
+0:96            Constant:
+0:96              1 (const int)
+0:96        subgroupAnd ( temp 2-component vector of uint)
+0:96          vector swizzle ( temp 2-component vector of uint)
+0:96            u: direct index for structure ( temp 4-component vector of uint)
+0:96              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:96                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:96                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:96                  Constant:
+0:96                    0 (const uint)
+0:96                direct index ( temp uint)
+0:96                  'dti' ( in 3-component vector of uint)
+0:96                  Constant:
+0:96                    0 (const int)
+0:96              Constant:
+0:96                0 (const int)
+0:96            Sequence
+0:96              Constant:
+0:96                0 (const int)
+0:96              Constant:
+0:96                1 (const int)
+0:97      move second child to first child ( temp 3-component vector of uint)
+0:97        vector swizzle ( temp 3-component vector of uint)
+0:97          u: direct index for structure ( temp 4-component vector of uint)
+0:97            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:97              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:97                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:97                Constant:
+0:97                  0 (const uint)
+0:97              direct index ( temp uint)
+0:97                'dti' ( in 3-component vector of uint)
+0:97                Constant:
+0:97                  0 (const int)
+0:97            Constant:
+0:97              0 (const int)
+0:97          Sequence
+0:97            Constant:
+0:97              0 (const int)
+0:97            Constant:
+0:97              1 (const int)
+0:97            Constant:
+0:97              2 (const int)
+0:97        subgroupAnd ( temp 3-component vector of uint)
+0:97          vector swizzle ( temp 3-component vector of uint)
+0:97            u: direct index for structure ( temp 4-component vector of uint)
+0:97              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:97                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:97                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:97                  Constant:
+0:97                    0 (const uint)
+0:97                direct index ( temp uint)
+0:97                  'dti' ( in 3-component vector of uint)
+0:97                  Constant:
+0:97                    0 (const int)
+0:97              Constant:
+0:97                0 (const int)
+0:97            Sequence
+0:97              Constant:
+0:97                0 (const int)
+0:97              Constant:
+0:97                1 (const int)
+0:97              Constant:
+0:97                2 (const int)
+0:99      move second child to first child ( temp 4-component vector of int)
+0:99        i: direct index for structure ( temp 4-component vector of int)
+0:99          indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:99            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:99              'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:99              Constant:
+0:99                0 (const uint)
+0:99            direct index ( temp uint)
+0:99              'dti' ( in 3-component vector of uint)
+0:99              Constant:
+0:99                0 (const int)
+0:99          Constant:
+0:99            1 (const int)
+0:99        subgroupAnd ( temp 4-component vector of int)
+0:99          i: direct index for structure ( temp 4-component vector of int)
+0:99            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:99              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:99                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:99                Constant:
+0:99                  0 (const uint)
+0:99              direct index ( temp uint)
+0:99                'dti' ( in 3-component vector of uint)
+0:99                Constant:
+0:99                  0 (const int)
+0:99            Constant:
+0:99              1 (const int)
+0:100      move second child to first child ( temp int)
+0:100        direct index ( temp int)
+0:100          i: direct index for structure ( temp 4-component vector of int)
+0:100            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:100              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:100                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:100                Constant:
+0:100                  0 (const uint)
+0:100              direct index ( temp uint)
+0:100                'dti' ( in 3-component vector of uint)
+0:100                Constant:
+0:100                  0 (const int)
+0:100            Constant:
+0:100              1 (const int)
+0:100          Constant:
+0:100            0 (const int)
+0:100        subgroupAnd ( temp int)
+0:100          direct index ( temp int)
+0:100            i: direct index for structure ( temp 4-component vector of int)
+0:100              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:100                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:100                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:100                  Constant:
+0:100                    0 (const uint)
+0:100                direct index ( temp uint)
+0:100                  'dti' ( in 3-component vector of uint)
+0:100                  Constant:
+0:100                    0 (const int)
+0:100              Constant:
+0:100                1 (const int)
+0:100            Constant:
+0:100              0 (const int)
+0:101      move second child to first child ( temp 2-component vector of int)
+0:101        vector swizzle ( temp 2-component vector of int)
+0:101          i: direct index for structure ( temp 4-component vector of int)
+0:101            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:101              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:101                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:101                Constant:
+0:101                  0 (const uint)
+0:101              direct index ( temp uint)
+0:101                'dti' ( in 3-component vector of uint)
+0:101                Constant:
+0:101                  0 (const int)
+0:101            Constant:
+0:101              1 (const int)
+0:101          Sequence
+0:101            Constant:
+0:101              0 (const int)
+0:101            Constant:
+0:101              1 (const int)
+0:101        subgroupAnd ( temp 2-component vector of int)
+0:101          vector swizzle ( temp 2-component vector of int)
+0:101            i: direct index for structure ( temp 4-component vector of int)
+0:101              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:101                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:101                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:101                  Constant:
+0:101                    0 (const uint)
+0:101                direct index ( temp uint)
+0:101                  'dti' ( in 3-component vector of uint)
+0:101                  Constant:
+0:101                    0 (const int)
+0:101              Constant:
+0:101                1 (const int)
+0:101            Sequence
+0:101              Constant:
+0:101                0 (const int)
+0:101              Constant:
+0:101                1 (const int)
+0:102      move second child to first child ( temp 3-component vector of int)
+0:102        vector swizzle ( temp 3-component vector of int)
+0:102          i: direct index for structure ( temp 4-component vector of int)
+0:102            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:102              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:102                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:102                Constant:
+0:102                  0 (const uint)
+0:102              direct index ( temp uint)
+0:102                'dti' ( in 3-component vector of uint)
+0:102                Constant:
+0:102                  0 (const int)
+0:102            Constant:
+0:102              1 (const int)
+0:102          Sequence
+0:102            Constant:
+0:102              0 (const int)
+0:102            Constant:
+0:102              1 (const int)
+0:102            Constant:
+0:102              2 (const int)
+0:102        subgroupAnd ( temp 3-component vector of int)
+0:102          vector swizzle ( temp 3-component vector of int)
+0:102            i: direct index for structure ( temp 4-component vector of int)
+0:102              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:102                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:102                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:102                  Constant:
+0:102                    0 (const uint)
+0:102                direct index ( temp uint)
+0:102                  'dti' ( in 3-component vector of uint)
+0:102                  Constant:
+0:102                    0 (const int)
+0:102              Constant:
+0:102                1 (const int)
+0:102            Sequence
+0:102              Constant:
+0:102                0 (const int)
+0:102              Constant:
+0:102                1 (const int)
+0:102              Constant:
+0:102                2 (const int)
+0:104      move second child to first child ( temp 4-component vector of uint)
+0:104        u: direct index for structure ( temp 4-component vector of uint)
+0:104          indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:104            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:104              'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:104              Constant:
+0:104                0 (const uint)
+0:104            direct index ( temp uint)
+0:104              'dti' ( in 3-component vector of uint)
+0:104              Constant:
+0:104                0 (const int)
+0:104          Constant:
+0:104            0 (const int)
+0:104        subgroupOr ( temp 4-component vector of uint)
+0:104          u: direct index for structure ( temp 4-component vector of uint)
+0:104            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:104              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:104                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:104                Constant:
+0:104                  0 (const uint)
+0:104              direct index ( temp uint)
+0:104                'dti' ( in 3-component vector of uint)
+0:104                Constant:
+0:104                  0 (const int)
+0:104            Constant:
+0:104              0 (const int)
+0:105      move second child to first child ( temp uint)
+0:105        direct index ( temp uint)
+0:105          u: direct index for structure ( temp 4-component vector of uint)
+0:105            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:105              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:105                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:105                Constant:
+0:105                  0 (const uint)
+0:105              direct index ( temp uint)
+0:105                'dti' ( in 3-component vector of uint)
+0:105                Constant:
+0:105                  0 (const int)
+0:105            Constant:
+0:105              0 (const int)
+0:105          Constant:
+0:105            0 (const int)
+0:105        subgroupOr ( temp uint)
+0:105          direct index ( temp uint)
+0:105            u: direct index for structure ( temp 4-component vector of uint)
+0:105              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:105                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:105                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:105                  Constant:
+0:105                    0 (const uint)
+0:105                direct index ( temp uint)
+0:105                  'dti' ( in 3-component vector of uint)
+0:105                  Constant:
+0:105                    0 (const int)
+0:105              Constant:
+0:105                0 (const int)
+0:105            Constant:
+0:105              0 (const int)
+0:106      move second child to first child ( temp 2-component vector of uint)
+0:106        vector swizzle ( temp 2-component vector of uint)
+0:106          u: direct index for structure ( temp 4-component vector of uint)
+0:106            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:106              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:106                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:106                Constant:
+0:106                  0 (const uint)
+0:106              direct index ( temp uint)
+0:106                'dti' ( in 3-component vector of uint)
+0:106                Constant:
+0:106                  0 (const int)
+0:106            Constant:
+0:106              0 (const int)
+0:106          Sequence
+0:106            Constant:
+0:106              0 (const int)
+0:106            Constant:
+0:106              1 (const int)
+0:106        subgroupOr ( temp 2-component vector of uint)
+0:106          vector swizzle ( temp 2-component vector of uint)
+0:106            u: direct index for structure ( temp 4-component vector of uint)
+0:106              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:106                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:106                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:106                  Constant:
+0:106                    0 (const uint)
+0:106                direct index ( temp uint)
+0:106                  'dti' ( in 3-component vector of uint)
+0:106                  Constant:
+0:106                    0 (const int)
+0:106              Constant:
+0:106                0 (const int)
+0:106            Sequence
+0:106              Constant:
+0:106                0 (const int)
+0:106              Constant:
+0:106                1 (const int)
+0:107      move second child to first child ( temp 3-component vector of uint)
+0:107        vector swizzle ( temp 3-component vector of uint)
+0:107          u: direct index for structure ( temp 4-component vector of uint)
+0:107            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:107              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:107                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:107                Constant:
+0:107                  0 (const uint)
+0:107              direct index ( temp uint)
+0:107                'dti' ( in 3-component vector of uint)
+0:107                Constant:
+0:107                  0 (const int)
+0:107            Constant:
+0:107              0 (const int)
+0:107          Sequence
+0:107            Constant:
+0:107              0 (const int)
+0:107            Constant:
+0:107              1 (const int)
+0:107            Constant:
+0:107              2 (const int)
+0:107        subgroupOr ( temp 3-component vector of uint)
+0:107          vector swizzle ( temp 3-component vector of uint)
+0:107            u: direct index for structure ( temp 4-component vector of uint)
+0:107              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:107                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:107                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:107                  Constant:
+0:107                    0 (const uint)
+0:107                direct index ( temp uint)
+0:107                  'dti' ( in 3-component vector of uint)
+0:107                  Constant:
+0:107                    0 (const int)
+0:107              Constant:
+0:107                0 (const int)
+0:107            Sequence
+0:107              Constant:
+0:107                0 (const int)
+0:107              Constant:
+0:107                1 (const int)
+0:107              Constant:
+0:107                2 (const int)
+0:109      move second child to first child ( temp 4-component vector of int)
+0:109        i: direct index for structure ( temp 4-component vector of int)
+0:109          indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:109            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:109              'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:109              Constant:
+0:109                0 (const uint)
+0:109            direct index ( temp uint)
+0:109              'dti' ( in 3-component vector of uint)
+0:109              Constant:
+0:109                0 (const int)
+0:109          Constant:
+0:109            1 (const int)
+0:109        subgroupOr ( temp 4-component vector of int)
+0:109          i: direct index for structure ( temp 4-component vector of int)
+0:109            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:109              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:109                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:109                Constant:
+0:109                  0 (const uint)
+0:109              direct index ( temp uint)
+0:109                'dti' ( in 3-component vector of uint)
+0:109                Constant:
+0:109                  0 (const int)
+0:109            Constant:
+0:109              1 (const int)
+0:110      move second child to first child ( temp int)
+0:110        direct index ( temp int)
+0:110          i: direct index for structure ( temp 4-component vector of int)
+0:110            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:110              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:110                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:110                Constant:
+0:110                  0 (const uint)
+0:110              direct index ( temp uint)
+0:110                'dti' ( in 3-component vector of uint)
+0:110                Constant:
+0:110                  0 (const int)
+0:110            Constant:
+0:110              1 (const int)
+0:110          Constant:
+0:110            0 (const int)
+0:110        subgroupOr ( temp int)
+0:110          direct index ( temp int)
+0:110            i: direct index for structure ( temp 4-component vector of int)
+0:110              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:110                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:110                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:110                  Constant:
+0:110                    0 (const uint)
+0:110                direct index ( temp uint)
+0:110                  'dti' ( in 3-component vector of uint)
+0:110                  Constant:
+0:110                    0 (const int)
+0:110              Constant:
+0:110                1 (const int)
+0:110            Constant:
+0:110              0 (const int)
+0:111      move second child to first child ( temp 2-component vector of int)
+0:111        vector swizzle ( temp 2-component vector of int)
+0:111          i: direct index for structure ( temp 4-component vector of int)
+0:111            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:111              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:111                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:111                Constant:
+0:111                  0 (const uint)
+0:111              direct index ( temp uint)
+0:111                'dti' ( in 3-component vector of uint)
+0:111                Constant:
+0:111                  0 (const int)
+0:111            Constant:
+0:111              1 (const int)
+0:111          Sequence
+0:111            Constant:
+0:111              0 (const int)
+0:111            Constant:
+0:111              1 (const int)
+0:111        subgroupOr ( temp 2-component vector of int)
+0:111          vector swizzle ( temp 2-component vector of int)
+0:111            i: direct index for structure ( temp 4-component vector of int)
+0:111              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:111                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:111                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:111                  Constant:
+0:111                    0 (const uint)
+0:111                direct index ( temp uint)
+0:111                  'dti' ( in 3-component vector of uint)
+0:111                  Constant:
+0:111                    0 (const int)
+0:111              Constant:
+0:111                1 (const int)
+0:111            Sequence
+0:111              Constant:
+0:111                0 (const int)
+0:111              Constant:
+0:111                1 (const int)
+0:112      move second child to first child ( temp 3-component vector of int)
+0:112        vector swizzle ( temp 3-component vector of int)
+0:112          i: direct index for structure ( temp 4-component vector of int)
+0:112            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:112              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:112                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:112                Constant:
+0:112                  0 (const uint)
+0:112              direct index ( temp uint)
+0:112                'dti' ( in 3-component vector of uint)
+0:112                Constant:
+0:112                  0 (const int)
+0:112            Constant:
+0:112              1 (const int)
+0:112          Sequence
+0:112            Constant:
+0:112              0 (const int)
+0:112            Constant:
+0:112              1 (const int)
+0:112            Constant:
+0:112              2 (const int)
+0:112        subgroupOr ( temp 3-component vector of int)
+0:112          vector swizzle ( temp 3-component vector of int)
+0:112            i: direct index for structure ( temp 4-component vector of int)
+0:112              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:112                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:112                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:112                  Constant:
+0:112                    0 (const uint)
+0:112                direct index ( temp uint)
+0:112                  'dti' ( in 3-component vector of uint)
+0:112                  Constant:
+0:112                    0 (const int)
+0:112              Constant:
+0:112                1 (const int)
+0:112            Sequence
+0:112              Constant:
+0:112                0 (const int)
+0:112              Constant:
+0:112                1 (const int)
+0:112              Constant:
+0:112                2 (const int)
+0:114      move second child to first child ( temp 4-component vector of uint)
+0:114        u: direct index for structure ( temp 4-component vector of uint)
+0:114          indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:114            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:114              'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:114              Constant:
+0:114                0 (const uint)
+0:114            direct index ( temp uint)
+0:114              'dti' ( in 3-component vector of uint)
+0:114              Constant:
+0:114                0 (const int)
+0:114          Constant:
+0:114            0 (const int)
+0:114        subgroupXor ( temp 4-component vector of uint)
+0:114          u: direct index for structure ( temp 4-component vector of uint)
+0:114            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:114              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:114                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:114                Constant:
+0:114                  0 (const uint)
+0:114              direct index ( temp uint)
+0:114                'dti' ( in 3-component vector of uint)
+0:114                Constant:
+0:114                  0 (const int)
+0:114            Constant:
+0:114              0 (const int)
+0:115      move second child to first child ( temp uint)
+0:115        direct index ( temp uint)
+0:115          u: direct index for structure ( temp 4-component vector of uint)
+0:115            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:115              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:115                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:115                Constant:
+0:115                  0 (const uint)
+0:115              direct index ( temp uint)
+0:115                'dti' ( in 3-component vector of uint)
+0:115                Constant:
+0:115                  0 (const int)
+0:115            Constant:
+0:115              0 (const int)
+0:115          Constant:
+0:115            0 (const int)
+0:115        subgroupXor ( temp uint)
+0:115          direct index ( temp uint)
+0:115            u: direct index for structure ( temp 4-component vector of uint)
+0:115              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:115                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:115                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:115                  Constant:
+0:115                    0 (const uint)
+0:115                direct index ( temp uint)
+0:115                  'dti' ( in 3-component vector of uint)
+0:115                  Constant:
+0:115                    0 (const int)
+0:115              Constant:
+0:115                0 (const int)
+0:115            Constant:
+0:115              0 (const int)
+0:116      move second child to first child ( temp 2-component vector of uint)
+0:116        vector swizzle ( temp 2-component vector of uint)
+0:116          u: direct index for structure ( temp 4-component vector of uint)
+0:116            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:116              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:116                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:116                Constant:
+0:116                  0 (const uint)
+0:116              direct index ( temp uint)
+0:116                'dti' ( in 3-component vector of uint)
+0:116                Constant:
+0:116                  0 (const int)
+0:116            Constant:
+0:116              0 (const int)
+0:116          Sequence
+0:116            Constant:
+0:116              0 (const int)
+0:116            Constant:
+0:116              1 (const int)
+0:116        subgroupXor ( temp 2-component vector of uint)
+0:116          vector swizzle ( temp 2-component vector of uint)
+0:116            u: direct index for structure ( temp 4-component vector of uint)
+0:116              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:116                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:116                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:116                  Constant:
+0:116                    0 (const uint)
+0:116                direct index ( temp uint)
+0:116                  'dti' ( in 3-component vector of uint)
+0:116                  Constant:
+0:116                    0 (const int)
+0:116              Constant:
+0:116                0 (const int)
+0:116            Sequence
+0:116              Constant:
+0:116                0 (const int)
+0:116              Constant:
+0:116                1 (const int)
+0:117      move second child to first child ( temp 3-component vector of uint)
+0:117        vector swizzle ( temp 3-component vector of uint)
+0:117          u: direct index for structure ( temp 4-component vector of uint)
+0:117            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:117              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:117                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:117                Constant:
+0:117                  0 (const uint)
+0:117              direct index ( temp uint)
+0:117                'dti' ( in 3-component vector of uint)
+0:117                Constant:
+0:117                  0 (const int)
+0:117            Constant:
+0:117              0 (const int)
+0:117          Sequence
+0:117            Constant:
+0:117              0 (const int)
+0:117            Constant:
+0:117              1 (const int)
+0:117            Constant:
+0:117              2 (const int)
+0:117        subgroupXor ( temp 3-component vector of uint)
+0:117          vector swizzle ( temp 3-component vector of uint)
+0:117            u: direct index for structure ( temp 4-component vector of uint)
+0:117              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:117                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:117                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:117                  Constant:
+0:117                    0 (const uint)
+0:117                direct index ( temp uint)
+0:117                  'dti' ( in 3-component vector of uint)
+0:117                  Constant:
+0:117                    0 (const int)
+0:117              Constant:
+0:117                0 (const int)
+0:117            Sequence
+0:117              Constant:
+0:117                0 (const int)
+0:117              Constant:
+0:117                1 (const int)
+0:117              Constant:
+0:117                2 (const int)
+0:119      move second child to first child ( temp 4-component vector of int)
+0:119        i: direct index for structure ( temp 4-component vector of int)
+0:119          indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:119            @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:119              'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:119              Constant:
+0:119                0 (const uint)
+0:119            direct index ( temp uint)
+0:119              'dti' ( in 3-component vector of uint)
+0:119              Constant:
+0:119                0 (const int)
+0:119          Constant:
+0:119            1 (const int)
+0:119        subgroupXor ( temp 4-component vector of int)
+0:119          i: direct index for structure ( temp 4-component vector of int)
+0:119            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:119              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:119                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:119                Constant:
+0:119                  0 (const uint)
+0:119              direct index ( temp uint)
+0:119                'dti' ( in 3-component vector of uint)
+0:119                Constant:
+0:119                  0 (const int)
+0:119            Constant:
+0:119              1 (const int)
+0:120      move second child to first child ( temp int)
+0:120        direct index ( temp int)
+0:120          i: direct index for structure ( temp 4-component vector of int)
+0:120            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:120              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:120                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:120                Constant:
+0:120                  0 (const uint)
+0:120              direct index ( temp uint)
+0:120                'dti' ( in 3-component vector of uint)
+0:120                Constant:
+0:120                  0 (const int)
+0:120            Constant:
+0:120              1 (const int)
+0:120          Constant:
+0:120            0 (const int)
+0:120        subgroupXor ( temp int)
+0:120          direct index ( temp int)
+0:120            i: direct index for structure ( temp 4-component vector of int)
+0:120              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:120                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:120                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:120                  Constant:
+0:120                    0 (const uint)
+0:120                direct index ( temp uint)
+0:120                  'dti' ( in 3-component vector of uint)
+0:120                  Constant:
+0:120                    0 (const int)
+0:120              Constant:
+0:120                1 (const int)
+0:120            Constant:
+0:120              0 (const int)
+0:121      move second child to first child ( temp 2-component vector of int)
+0:121        vector swizzle ( temp 2-component vector of int)
+0:121          i: direct index for structure ( temp 4-component vector of int)
+0:121            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:121              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:121                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:121                Constant:
+0:121                  0 (const uint)
+0:121              direct index ( temp uint)
+0:121                'dti' ( in 3-component vector of uint)
+0:121                Constant:
+0:121                  0 (const int)
+0:121            Constant:
+0:121              1 (const int)
+0:121          Sequence
+0:121            Constant:
+0:121              0 (const int)
+0:121            Constant:
+0:121              1 (const int)
+0:121        subgroupXor ( temp 2-component vector of int)
+0:121          vector swizzle ( temp 2-component vector of int)
+0:121            i: direct index for structure ( temp 4-component vector of int)
+0:121              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:121                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:121                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:121                  Constant:
+0:121                    0 (const uint)
+0:121                direct index ( temp uint)
+0:121                  'dti' ( in 3-component vector of uint)
+0:121                  Constant:
+0:121                    0 (const int)
+0:121              Constant:
+0:121                1 (const int)
+0:121            Sequence
+0:121              Constant:
+0:121                0 (const int)
+0:121              Constant:
+0:121                1 (const int)
+0:122      move second child to first child ( temp 3-component vector of int)
+0:122        vector swizzle ( temp 3-component vector of int)
+0:122          i: direct index for structure ( temp 4-component vector of int)
+0:122            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:122              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:122                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:122                Constant:
+0:122                  0 (const uint)
+0:122              direct index ( temp uint)
+0:122                'dti' ( in 3-component vector of uint)
+0:122                Constant:
+0:122                  0 (const int)
+0:122            Constant:
+0:122              1 (const int)
+0:122          Sequence
+0:122            Constant:
+0:122              0 (const int)
+0:122            Constant:
+0:122              1 (const int)
+0:122            Constant:
+0:122              2 (const int)
+0:122        subgroupXor ( temp 3-component vector of int)
+0:122          vector swizzle ( temp 3-component vector of int)
+0:122            i: direct index for structure ( temp 4-component vector of int)
+0:122              indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:122                @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:122                  'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:122                  Constant:
+0:122                    0 (const uint)
+0:122                direct index ( temp uint)
+0:122                  'dti' ( in 3-component vector of uint)
+0:122                  Constant:
+0:122                    0 (const int)
+0:122              Constant:
+0:122                1 (const int)
+0:122            Sequence
+0:122              Constant:
+0:122                0 (const int)
+0:122              Constant:
+0:122                1 (const int)
+0:122              Constant:
+0:122                2 (const int)
+0:124      move second child to first child ( temp uint)
+0:124        direct index ( temp uint)
+0:124          u: direct index for structure ( temp 4-component vector of uint)
+0:124            indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:124              @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:124                'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:124                Constant:
+0:124                  0 (const uint)
+0:124              direct index ( temp uint)
+0:124                'dti' ( in 3-component vector of uint)
+0:124                Constant:
+0:124                  0 (const int)
+0:124            Constant:
+0:124              0 (const int)
+0:124          Constant:
+0:124            0 (const int)
+0:124        subgroupBallotBitCount ( temp uint)
+0:124          subgroupBallot ( temp 4-component vector of uint)
+0:124            Compare Equal ( temp bool)
+0:124              direct index ( temp uint)
+0:124                u: direct index for structure ( temp 4-component vector of uint)
+0:124                  indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:124                    @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d})
+0:124                      'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:124                      Constant:
+0:124                        0 (const uint)
+0:124                    direct index ( temp uint)
+0:124                      'dti' ( in 3-component vector of uint)
+0:124                      Constant:
+0:124                        0 (const int)
+0:124                  Constant:
+0:124                    0 (const int)
+0:124                Constant:
+0:124                  0 (const int)
+0:124              Constant:
+0:124                0 (const uint)
+0:13  Function Definition: CSMain( ( temp void)
+0:13    Function Parameters: 
+0:?     Sequence
+0:13      move second child to first child ( temp 3-component vector of uint)
+0:?         'dti' ( temp 3-component vector of uint)
+0:?         'dti' ( in 3-component vector of uint GlobalInvocationID)
+0:13      Function Call: @CSMain(vu3; ( temp void)
+0:?         'dti' ( temp 3-component vector of uint)
+0:?   Linker Objects
+0:?     'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u,  temp 4-component vector of int i,  temp 4-component vector of float f,  temp 4-component vector of double d} @data})
+0:?     'dti' ( in 3-component vector of uint GlobalInvocationID)
+
+// Module Version 10300
+// Generated by (magic number): 80007
+// Id's are bound by 901
+
+                              Capability Shader
+                              Capability Float64
+                              Capability GroupNonUniform
+                              Capability GroupNonUniformArithmetic
+                              Capability GroupNonUniformBallot
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint GLCompute 4  "CSMain" 896
+                              ExecutionMode 4 LocalSize 32 16 1
+                              Source HLSL 500
+                              Name 4  "CSMain"
+                              Name 11  "@CSMain(vu3;"
+                              Name 10  "dti"
+                              Name 20  "Types"
+                              MemberName 20(Types) 0  "u"
+                              MemberName 20(Types) 1  "i"
+                              MemberName 20(Types) 2  "f"
+                              MemberName 20(Types) 3  "d"
+                              Name 22  "data"
+                              MemberName 22(data) 0  "@data"
+                              Name 24  "data"
+                              Name 894  "dti"
+                              Name 896  "dti"
+                              Name 898  "param"
+                              MemberDecorate 20(Types) 0 Offset 0
+                              MemberDecorate 20(Types) 1 Offset 16
+                              MemberDecorate 20(Types) 2 Offset 32
+                              MemberDecorate 20(Types) 3 Offset 64
+                              Decorate 21 ArrayStride 96
+                              MemberDecorate 22(data) 0 Offset 0
+                              Decorate 22(data) BufferBlock
+                              Decorate 24(data) DescriptorSet 0
+                              Decorate 896(dti) BuiltIn GlobalInvocationId
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeInt 32 0
+               7:             TypeVector 6(int) 3
+               8:             TypePointer Function 7(ivec3)
+               9:             TypeFunction 2 8(ptr)
+              13:             TypeVector 6(int) 4
+              14:             TypeInt 32 1
+              15:             TypeVector 14(int) 4
+              16:             TypeFloat 32
+              17:             TypeVector 16(float) 4
+              18:             TypeFloat 64
+              19:             TypeVector 18(float64_t) 4
+       20(Types):             TypeStruct 13(ivec4) 15(ivec4) 17(fvec4) 19(f64vec4)
+              21:             TypeRuntimeArray 20(Types)
+        22(data):             TypeStruct 21
+              23:             TypePointer Uniform 22(data)
+        24(data):     23(ptr) Variable Uniform
+              25:     14(int) Constant 0
+              26:      6(int) Constant 0
+              27:             TypePointer Function 6(int)
+              32:             TypePointer Uniform 13(ivec4)
+              35:      6(int) Constant 3
+              42:             TypePointer Uniform 6(int)
+              51:             TypeVector 6(int) 2
+              72:     14(int) Constant 1
+              75:             TypePointer Uniform 15(ivec4)
+              84:             TypePointer Uniform 14(int)
+              93:             TypeVector 14(int) 2
+             105:             TypeVector 14(int) 3
+             115:     14(int) Constant 2
+             118:             TypePointer Uniform 17(fvec4)
+             127:             TypePointer Uniform 16(float)
+             136:             TypeVector 16(float) 2
+             148:             TypeVector 16(float) 3
+             158:     14(int) Constant 3
+             161:             TypePointer Uniform 19(f64vec4)
+             170:             TypePointer Uniform 18(float64_t)
+             179:             TypeVector 18(float64_t) 2
+             191:             TypeVector 18(float64_t) 3
+             889:             TypeBool
+             895:             TypePointer Input 7(ivec3)
+        896(dti):    895(ptr) Variable Input
+       4(CSMain):           2 Function None 3
+               5:             Label
+        894(dti):      8(ptr) Variable Function
+      898(param):      8(ptr) Variable Function
+             897:    7(ivec3) Load 896(dti)
+                              Store 894(dti) 897
+             899:    7(ivec3) Load 894(dti)
+                              Store 898(param) 899
+             900:           2 FunctionCall 11(@CSMain(vu3;) 898(param)
+                              Return
+                              FunctionEnd
+11(@CSMain(vu3;):           2 Function None 9
+         10(dti):      8(ptr) FunctionParameter
+              12:             Label
+              28:     27(ptr) AccessChain 10(dti) 26
+              29:      6(int) Load 28
+              30:     27(ptr) AccessChain 10(dti) 26
+              31:      6(int) Load 30
+              33:     32(ptr) AccessChain 24(data) 25 31 25
+              34:   13(ivec4) Load 33
+              36:   13(ivec4) GroupNonUniformIAdd 35 Reduce 34
+              37:     32(ptr) AccessChain 24(data) 25 29 25
+                              Store 37 36
+              38:     27(ptr) AccessChain 10(dti) 26
+              39:      6(int) Load 38
+              40:     27(ptr) AccessChain 10(dti) 26
+              41:      6(int) Load 40
+              43:     42(ptr) AccessChain 24(data) 25 41 25 26
+              44:      6(int) Load 43
+              45:      6(int) GroupNonUniformIAdd 35 Reduce 44
+              46:     42(ptr) AccessChain 24(data) 25 39 25 26
+                              Store 46 45
+              47:     27(ptr) AccessChain 10(dti) 26
+              48:      6(int) Load 47
+              49:     27(ptr) AccessChain 10(dti) 26
+              50:      6(int) Load 49
+              52:     32(ptr) AccessChain 24(data) 25 50 25
+              53:   13(ivec4) Load 52
+              54:   51(ivec2) VectorShuffle 53 53 0 1
+              55:   51(ivec2) GroupNonUniformIAdd 35 Reduce 54
+              56:     32(ptr) AccessChain 24(data) 25 48 25
+              57:   13(ivec4) Load 56
+              58:   13(ivec4) VectorShuffle 57 55 4 5 2 3
+                              Store 56 58
+              59:     27(ptr) AccessChain 10(dti) 26
+              60:      6(int) Load 59
+              61:     27(ptr) AccessChain 10(dti) 26
+              62:      6(int) Load 61
+              63:     32(ptr) AccessChain 24(data) 25 62 25
+              64:   13(ivec4) Load 63
+              65:    7(ivec3) VectorShuffle 64 64 0 1 2
+              66:    7(ivec3) GroupNonUniformIAdd 35 Reduce 65
+              67:     32(ptr) AccessChain 24(data) 25 60 25
+              68:   13(ivec4) Load 67
+              69:   13(ivec4) VectorShuffle 68 66 4 5 6 3
+                              Store 67 69
+              70:     27(ptr) AccessChain 10(dti) 26
+              71:      6(int) Load 70
+              73:     27(ptr) AccessChain 10(dti) 26
+              74:      6(int) Load 73
+              76:     75(ptr) AccessChain 24(data) 25 74 72
+              77:   15(ivec4) Load 76
+              78:   15(ivec4) GroupNonUniformIAdd 35 Reduce 77
+              79:     75(ptr) AccessChain 24(data) 25 71 72
+                              Store 79 78
+              80:     27(ptr) AccessChain 10(dti) 26
+              81:      6(int) Load 80
+              82:     27(ptr) AccessChain 10(dti) 26
+              83:      6(int) Load 82
+              85:     84(ptr) AccessChain 24(data) 25 83 72 26
+              86:     14(int) Load 85
+              87:     14(int) GroupNonUniformIAdd 35 Reduce 86
+              88:     84(ptr) AccessChain 24(data) 25 81 72 26
+                              Store 88 87
+              89:     27(ptr) AccessChain 10(dti) 26
+              90:      6(int) Load 89
+              91:     27(ptr) AccessChain 10(dti) 26
+              92:      6(int) Load 91
+              94:     75(ptr) AccessChain 24(data) 25 92 72
+              95:   15(ivec4) Load 94
+              96:   93(ivec2) VectorShuffle 95 95 0 1
+              97:   93(ivec2) GroupNonUniformIAdd 35 Reduce 96
+              98:     75(ptr) AccessChain 24(data) 25 90 72
+              99:   15(ivec4) Load 98
+             100:   15(ivec4) VectorShuffle 99 97 4 5 2 3
+                              Store 98 100
+             101:     27(ptr) AccessChain 10(dti) 26
+             102:      6(int) Load 101
+             103:     27(ptr) AccessChain 10(dti) 26
+             104:      6(int) Load 103
+             106:     75(ptr) AccessChain 24(data) 25 104 72
+             107:   15(ivec4) Load 106
+             108:  105(ivec3) VectorShuffle 107 107 0 1 2
+             109:  105(ivec3) GroupNonUniformIAdd 35 Reduce 108
+             110:     75(ptr) AccessChain 24(data) 25 102 72
+             111:   15(ivec4) Load 110
+             112:   15(ivec4) VectorShuffle 111 109 4 5 6 3
+                              Store 110 112
+             113:     27(ptr) AccessChain 10(dti) 26
+             114:      6(int) Load 113
+             116:     27(ptr) AccessChain 10(dti) 26
+             117:      6(int) Load 116
+             119:    118(ptr) AccessChain 24(data) 25 117 115
+             120:   17(fvec4) Load 119
+             121:   17(fvec4) GroupNonUniformFAdd 35 Reduce 120
+             122:    118(ptr) AccessChain 24(data) 25 114 115
+                              Store 122 121
+             123:     27(ptr) AccessChain 10(dti) 26
+             124:      6(int) Load 123
+             125:     27(ptr) AccessChain 10(dti) 26
+             126:      6(int) Load 125
+             128:    127(ptr) AccessChain 24(data) 25 126 115 26
+             129:   16(float) Load 128
+             130:   16(float) GroupNonUniformFAdd 35 Reduce 129
+             131:    127(ptr) AccessChain 24(data) 25 124 115 26
+                              Store 131 130
+             132:     27(ptr) AccessChain 10(dti) 26
+             133:      6(int) Load 132
+             134:     27(ptr) AccessChain 10(dti) 26
+             135:      6(int) Load 134
+             137:    118(ptr) AccessChain 24(data) 25 135 115
+             138:   17(fvec4) Load 137
+             139:  136(fvec2) VectorShuffle 138 138 0 1
+             140:  136(fvec2) GroupNonUniformFAdd 35 Reduce 139
+             141:    118(ptr) AccessChain 24(data) 25 133 115
+             142:   17(fvec4) Load 141
+             143:   17(fvec4) VectorShuffle 142 140 4 5 2 3
+                              Store 141 143
+             144:     27(ptr) AccessChain 10(dti) 26
+             145:      6(int) Load 144
+             146:     27(ptr) AccessChain 10(dti) 26
+             147:      6(int) Load 146
+             149:    118(ptr) AccessChain 24(data) 25 147 115
+             150:   17(fvec4) Load 149
+             151:  148(fvec3) VectorShuffle 150 150 0 1 2
+             152:  148(fvec3) GroupNonUniformFAdd 35 Reduce 151
+             153:    118(ptr) AccessChain 24(data) 25 145 115
+             154:   17(fvec4) Load 153
+             155:   17(fvec4) VectorShuffle 154 152 4 5 6 3
+                              Store 153 155
+             156:     27(ptr) AccessChain 10(dti) 26
+             157:      6(int) Load 156
+             159:     27(ptr) AccessChain 10(dti) 26
+             160:      6(int) Load 159
+             162:    161(ptr) AccessChain 24(data) 25 160 158
+             163: 19(f64vec4) Load 162
+             164: 19(f64vec4) GroupNonUniformFAdd 35 Reduce 163
+             165:    161(ptr) AccessChain 24(data) 25 157 158
+                              Store 165 164
+             166:     27(ptr) AccessChain 10(dti) 26
+             167:      6(int) Load 166
+             168:     27(ptr) AccessChain 10(dti) 26
+             169:      6(int) Load 168
+             171:    170(ptr) AccessChain 24(data) 25 169 158 26
+             172:18(float64_t) Load 171
+             173:18(float64_t) GroupNonUniformFAdd 35 Reduce 172
+             174:    170(ptr) AccessChain 24(data) 25 167 158 26
+                              Store 174 173
+             175:     27(ptr) AccessChain 10(dti) 26
+             176:      6(int) Load 175
+             177:     27(ptr) AccessChain 10(dti) 26
+             178:      6(int) Load 177
+             180:    161(ptr) AccessChain 24(data) 25 178 158
+             181: 19(f64vec4) Load 180
+             182:179(f64vec2) VectorShuffle 181 181 0 1
+             183:179(f64vec2) GroupNonUniformFAdd 35 Reduce 182
+             184:    161(ptr) AccessChain 24(data) 25 176 158
+             185: 19(f64vec4) Load 184
+             186: 19(f64vec4) VectorShuffle 185 183 4 5 2 3
+                              Store 184 186
+             187:     27(ptr) AccessChain 10(dti) 26
+             188:      6(int) Load 187
+             189:     27(ptr) AccessChain 10(dti) 26
+             190:      6(int) Load 189
+             192:    161(ptr) AccessChain 24(data) 25 190 158
+             193: 19(f64vec4) Load 192
+             194:191(f64vec3) VectorShuffle 193 193 0 1 2
+             195:191(f64vec3) GroupNonUniformFAdd 35 Reduce 194
+             196:    161(ptr) AccessChain 24(data) 25 188 158
+             197: 19(f64vec4) Load 196
+             198: 19(f64vec4) VectorShuffle 197 195 4 5 6 3
+                              Store 196 198
+             199:     27(ptr) AccessChain 10(dti) 26
+             200:      6(int) Load 199
+             201:     27(ptr) AccessChain 10(dti) 26
+             202:      6(int) Load 201
+             203:     32(ptr) AccessChain 24(data) 25 202 25
+             204:   13(ivec4) Load 203
+             205:   13(ivec4) GroupNonUniformIMul 35 Reduce 204
+             206:     32(ptr) AccessChain 24(data) 25 200 25
+                              Store 206 205
+             207:     27(ptr) AccessChain 10(dti) 26
+             208:      6(int) Load 207
+             209:     27(ptr) AccessChain 10(dti) 26
+             210:      6(int) Load 209
+             211:     42(ptr) AccessChain 24(data) 25 210 25 26
+             212:      6(int) Load 211
+             213:      6(int) GroupNonUniformIMul 35 Reduce 212
+             214:     42(ptr) AccessChain 24(data) 25 208 25 26
+                              Store 214 213
+             215:     27(ptr) AccessChain 10(dti) 26
+             216:      6(int) Load 215
+             217:     27(ptr) AccessChain 10(dti) 26
+             218:      6(int) Load 217
+             219:     32(ptr) AccessChain 24(data) 25 218 25
+             220:   13(ivec4) Load 219
+             221:   51(ivec2) VectorShuffle 220 220 0 1
+             222:   51(ivec2) GroupNonUniformIMul 35 Reduce 221
+             223:     32(ptr) AccessChain 24(data) 25 216 25
+             224:   13(ivec4) Load 223
+             225:   13(ivec4) VectorShuffle 224 222 4 5 2 3
+                              Store 223 225
+             226:     27(ptr) AccessChain 10(dti) 26
+             227:      6(int) Load 226
+             228:     27(ptr) AccessChain 10(dti) 26
+             229:      6(int) Load 228
+             230:     32(ptr) AccessChain 24(data) 25 229 25
+             231:   13(ivec4) Load 230
+             232:    7(ivec3) VectorShuffle 231 231 0 1 2
+             233:    7(ivec3) GroupNonUniformIMul 35 Reduce 232
+             234:     32(ptr) AccessChain 24(data) 25 227 25
+             235:   13(ivec4) Load 234
+             236:   13(ivec4) VectorShuffle 235 233 4 5 6 3
+                              Store 234 236
+             237:     27(ptr) AccessChain 10(dti) 26
+             238:      6(int) Load 237
+             239:     27(ptr) AccessChain 10(dti) 26
+             240:      6(int) Load 239
+             241:     75(ptr) AccessChain 24(data) 25 240 72
+             242:   15(ivec4) Load 241
+             243:   15(ivec4) GroupNonUniformIMul 35 Reduce 242
+             244:     75(ptr) AccessChain 24(data) 25 238 72
+                              Store 244 243
+             245:     27(ptr) AccessChain 10(dti) 26
+             246:      6(int) Load 245
+             247:     27(ptr) AccessChain 10(dti) 26
+             248:      6(int) Load 247
+             249:     84(ptr) AccessChain 24(data) 25 248 72 26
+             250:     14(int) Load 249
+             251:     14(int) GroupNonUniformIMul 35 Reduce 250
+             252:     84(ptr) AccessChain 24(data) 25 246 72 26
+                              Store 252 251
+             253:     27(ptr) AccessChain 10(dti) 26
+             254:      6(int) Load 253
+             255:     27(ptr) AccessChain 10(dti) 26
+             256:      6(int) Load 255
+             257:     75(ptr) AccessChain 24(data) 25 256 72
+             258:   15(ivec4) Load 257
+             259:   93(ivec2) VectorShuffle 258 258 0 1
+             260:   93(ivec2) GroupNonUniformIMul 35 Reduce 259
+             261:     75(ptr) AccessChain 24(data) 25 254 72
+             262:   15(ivec4) Load 261
+             263:   15(ivec4) VectorShuffle 262 260 4 5 2 3
+                              Store 261 263
+             264:     27(ptr) AccessChain 10(dti) 26
+             265:      6(int) Load 264
+             266:     27(ptr) AccessChain 10(dti) 26
+             267:      6(int) Load 266
+             268:     75(ptr) AccessChain 24(data) 25 267 72
+             269:   15(ivec4) Load 268
+             270:  105(ivec3) VectorShuffle 269 269 0 1 2
+             271:  105(ivec3) GroupNonUniformIMul 35 Reduce 270
+             272:     75(ptr) AccessChain 24(data) 25 265 72
+             273:   15(ivec4) Load 272
+             274:   15(ivec4) VectorShuffle 273 271 4 5 6 3
+                              Store 272 274
+             275:     27(ptr) AccessChain 10(dti) 26
+             276:      6(int) Load 275
+             277:     27(ptr) AccessChain 10(dti) 26
+             278:      6(int) Load 277
+             279:    118(ptr) AccessChain 24(data) 25 278 115
+             280:   17(fvec4) Load 279
+             281:   17(fvec4) GroupNonUniformFMul 35 Reduce 280
+             282:    118(ptr) AccessChain 24(data) 25 276 115
+                              Store 282 281
+             283:     27(ptr) AccessChain 10(dti) 26
+             284:      6(int) Load 283
+             285:     27(ptr) AccessChain 10(dti) 26
+             286:      6(int) Load 285
+             287:    127(ptr) AccessChain 24(data) 25 286 115 26
+             288:   16(float) Load 287
+             289:   16(float) GroupNonUniformFMul 35 Reduce 288
+             290:    127(ptr) AccessChain 24(data) 25 284 115 26
+                              Store 290 289
+             291:     27(ptr) AccessChain 10(dti) 26
+             292:      6(int) Load 291
+             293:     27(ptr) AccessChain 10(dti) 26
+             294:      6(int) Load 293
+             295:    118(ptr) AccessChain 24(data) 25 294 115
+             296:   17(fvec4) Load 295
+             297:  136(fvec2) VectorShuffle 296 296 0 1
+             298:  136(fvec2) GroupNonUniformFMul 35 Reduce 297
+             299:    118(ptr) AccessChain 24(data) 25 292 115
+             300:   17(fvec4) Load 299
+             301:   17(fvec4) VectorShuffle 300 298 4 5 2 3
+                              Store 299 301
+             302:     27(ptr) AccessChain 10(dti) 26
+             303:      6(int) Load 302
+             304:     27(ptr) AccessChain 10(dti) 26
+             305:      6(int) Load 304
+             306:    118(ptr) AccessChain 24(data) 25 305 115
+             307:   17(fvec4) Load 306
+             308:  148(fvec3) VectorShuffle 307 307 0 1 2
+             309:  148(fvec3) GroupNonUniformFMul 35 Reduce 308
+             310:    118(ptr) AccessChain 24(data) 25 303 115
+             311:   17(fvec4) Load 310
+             312:   17(fvec4) VectorShuffle 311 309 4 5 6 3
+                              Store 310 312
+             313:     27(ptr) AccessChain 10(dti) 26
+             314:      6(int) Load 313
+             315:     27(ptr) AccessChain 10(dti) 26
+             316:      6(int) Load 315
+             317:    161(ptr) AccessChain 24(data) 25 316 158
+             318: 19(f64vec4) Load 317
+             319: 19(f64vec4) GroupNonUniformFMul 35 Reduce 318
+             320:    161(ptr) AccessChain 24(data) 25 314 158
+                              Store 320 319
+             321:     27(ptr) AccessChain 10(dti) 26
+             322:      6(int) Load 321
+             323:     27(ptr) AccessChain 10(dti) 26
+             324:      6(int) Load 323
+             325:    170(ptr) AccessChain 24(data) 25 324 158 26
+             326:18(float64_t) Load 325
+             327:18(float64_t) GroupNonUniformFMul 35 Reduce 326
+             328:    170(ptr) AccessChain 24(data) 25 322 158 26
+                              Store 328 327
+             329:     27(ptr) AccessChain 10(dti) 26
+             330:      6(int) Load 329
+             331:     27(ptr) AccessChain 10(dti) 26
+             332:      6(int) Load 331
+             333:    161(ptr) AccessChain 24(data) 25 332 158
+             334: 19(f64vec4) Load 333
+             335:179(f64vec2) VectorShuffle 334 334 0 1
+             336:179(f64vec2) GroupNonUniformFMul 35 Reduce 335
+             337:    161(ptr) AccessChain 24(data) 25 330 158
+             338: 19(f64vec4) Load 337
+             339: 19(f64vec4) VectorShuffle 338 336 4 5 2 3
+                              Store 337 339
+             340:     27(ptr) AccessChain 10(dti) 26
+             341:      6(int) Load 340
+             342:     27(ptr) AccessChain 10(dti) 26
+             343:      6(int) Load 342
+             344:    161(ptr) AccessChain 24(data) 25 343 158
+             345: 19(f64vec4) Load 344
+             346:191(f64vec3) VectorShuffle 345 345 0 1 2
+             347:191(f64vec3) GroupNonUniformFMul 35 Reduce 346
+             348:    161(ptr) AccessChain 24(data) 25 341 158
+             349: 19(f64vec4) Load 348
+             350: 19(f64vec4) VectorShuffle 349 347 4 5 6 3
+                              Store 348 350
+             351:     27(ptr) AccessChain 10(dti) 26
+             352:      6(int) Load 351
+             353:     27(ptr) AccessChain 10(dti) 26
+             354:      6(int) Load 353
+             355:     32(ptr) AccessChain 24(data) 25 354 25
+             356:   13(ivec4) Load 355
+             357:   13(ivec4) GroupNonUniformUMin 35 Reduce 356
+             358:     32(ptr) AccessChain 24(data) 25 352 25
+                              Store 358 357
+             359:     27(ptr) AccessChain 10(dti) 26
+             360:      6(int) Load 359
+             361:     27(ptr) AccessChain 10(dti) 26
+             362:      6(int) Load 361
+             363:     42(ptr) AccessChain 24(data) 25 362 25 26
+             364:      6(int) Load 363
+             365:      6(int) GroupNonUniformUMin 35 Reduce 364
+             366:     42(ptr) AccessChain 24(data) 25 360 25 26
+                              Store 366 365
+             367:     27(ptr) AccessChain 10(dti) 26
+             368:      6(int) Load 367
+             369:     27(ptr) AccessChain 10(dti) 26
+             370:      6(int) Load 369
+             371:     32(ptr) AccessChain 24(data) 25 370 25
+             372:   13(ivec4) Load 371
+             373:   51(ivec2) VectorShuffle 372 372 0 1
+             374:   51(ivec2) GroupNonUniformUMin 35 Reduce 373
+             375:     32(ptr) AccessChain 24(data) 25 368 25
+             376:   13(ivec4) Load 375
+             377:   13(ivec4) VectorShuffle 376 374 4 5 2 3
+                              Store 375 377
+             378:     27(ptr) AccessChain 10(dti) 26
+             379:      6(int) Load 378
+             380:     27(ptr) AccessChain 10(dti) 26
+             381:      6(int) Load 380
+             382:     32(ptr) AccessChain 24(data) 25 381 25
+             383:   13(ivec4) Load 382
+             384:    7(ivec3) VectorShuffle 383 383 0 1 2
+             385:    7(ivec3) GroupNonUniformUMin 35 Reduce 384
+             386:     32(ptr) AccessChain 24(data) 25 379 25
+             387:   13(ivec4) Load 386
+             388:   13(ivec4) VectorShuffle 387 385 4 5 6 3
+                              Store 386 388
+             389:     27(ptr) AccessChain 10(dti) 26
+             390:      6(int) Load 389
+             391:     27(ptr) AccessChain 10(dti) 26
+             392:      6(int) Load 391
+             393:     75(ptr) AccessChain 24(data) 25 392 72
+             394:   15(ivec4) Load 393
+             395:   15(ivec4) GroupNonUniformSMin 35 Reduce 394
+             396:     75(ptr) AccessChain 24(data) 25 390 72
+                              Store 396 395
+             397:     27(ptr) AccessChain 10(dti) 26
+             398:      6(int) Load 397
+             399:     27(ptr) AccessChain 10(dti) 26
+             400:      6(int) Load 399
+             401:     84(ptr) AccessChain 24(data) 25 400 72 26
+             402:     14(int) Load 401
+             403:     14(int) GroupNonUniformSMin 35 Reduce 402
+             404:     84(ptr) AccessChain 24(data) 25 398 72 26
+                              Store 404 403
+             405:     27(ptr) AccessChain 10(dti) 26
+             406:      6(int) Load 405
+             407:     27(ptr) AccessChain 10(dti) 26
+             408:      6(int) Load 407
+             409:     75(ptr) AccessChain 24(data) 25 408 72
+             410:   15(ivec4) Load 409
+             411:   93(ivec2) VectorShuffle 410 410 0 1
+             412:   93(ivec2) GroupNonUniformSMin 35 Reduce 411
+             413:     75(ptr) AccessChain 24(data) 25 406 72
+             414:   15(ivec4) Load 413
+             415:   15(ivec4) VectorShuffle 414 412 4 5 2 3
+                              Store 413 415
+             416:     27(ptr) AccessChain 10(dti) 26
+             417:      6(int) Load 416
+             418:     27(ptr) AccessChain 10(dti) 26
+             419:      6(int) Load 418
+             420:     75(ptr) AccessChain 24(data) 25 419 72
+             421:   15(ivec4) Load 420
+             422:  105(ivec3) VectorShuffle 421 421 0 1 2
+             423:  105(ivec3) GroupNonUniformSMin 35 Reduce 422
+             424:     75(ptr) AccessChain 24(data) 25 417 72
+             425:   15(ivec4) Load 424
+             426:   15(ivec4) VectorShuffle 425 423 4 5 6 3
+                              Store 424 426
+             427:     27(ptr) AccessChain 10(dti) 26
+             428:      6(int) Load 427
+             429:     27(ptr) AccessChain 10(dti) 26
+             430:      6(int) Load 429
+             431:    118(ptr) AccessChain 24(data) 25 430 115
+             432:   17(fvec4) Load 431
+             433:   17(fvec4) GroupNonUniformFMin 35 Reduce 432
+             434:    118(ptr) AccessChain 24(data) 25 428 115
+                              Store 434 433
+             435:     27(ptr) AccessChain 10(dti) 26
+             436:      6(int) Load 435
+             437:     27(ptr) AccessChain 10(dti) 26
+             438:      6(int) Load 437
+             439:    127(ptr) AccessChain 24(data) 25 438 115 26
+             440:   16(float) Load 439
+             441:   16(float) GroupNonUniformFMin 35 Reduce 440
+             442:    127(ptr) AccessChain 24(data) 25 436 115 26
+                              Store 442 441
+             443:     27(ptr) AccessChain 10(dti) 26
+             444:      6(int) Load 443
+             445:     27(ptr) AccessChain 10(dti) 26
+             446:      6(int) Load 445
+             447:    118(ptr) AccessChain 24(data) 25 446 115
+             448:   17(fvec4) Load 447
+             449:  136(fvec2) VectorShuffle 448 448 0 1
+             450:  136(fvec2) GroupNonUniformFMin 35 Reduce 449
+             451:    118(ptr) AccessChain 24(data) 25 444 115
+             452:   17(fvec4) Load 451
+             453:   17(fvec4) VectorShuffle 452 450 4 5 2 3
+                              Store 451 453
+             454:     27(ptr) AccessChain 10(dti) 26
+             455:      6(int) Load 454
+             456:     27(ptr) AccessChain 10(dti) 26
+             457:      6(int) Load 456
+             458:    118(ptr) AccessChain 24(data) 25 457 115
+             459:   17(fvec4) Load 458
+             460:  148(fvec3) VectorShuffle 459 459 0 1 2
+             461:  148(fvec3) GroupNonUniformFMin 35 Reduce 460
+             462:    118(ptr) AccessChain 24(data) 25 455 115
+             463:   17(fvec4) Load 462
+             464:   17(fvec4) VectorShuffle 463 461 4 5 6 3
+                              Store 462 464
+             465:     27(ptr) AccessChain 10(dti) 26
+             466:      6(int) Load 465
+             467:     27(ptr) AccessChain 10(dti) 26
+             468:      6(int) Load 467
+             469:    161(ptr) AccessChain 24(data) 25 468 158
+             470: 19(f64vec4) Load 469
+             471: 19(f64vec4) GroupNonUniformFMin 35 Reduce 470
+             472:    161(ptr) AccessChain 24(data) 25 466 158
+                              Store 472 471
+             473:     27(ptr) AccessChain 10(dti) 26
+             474:      6(int) Load 473
+             475:     27(ptr) AccessChain 10(dti) 26
+             476:      6(int) Load 475
+             477:    170(ptr) AccessChain 24(data) 25 476 158 26
+             478:18(float64_t) Load 477
+             479:18(float64_t) GroupNonUniformFMin 35 Reduce 478
+             480:    170(ptr) AccessChain 24(data) 25 474 158 26
+                              Store 480 479
+             481:     27(ptr) AccessChain 10(dti) 26
+             482:      6(int) Load 481
+             483:     27(ptr) AccessChain 10(dti) 26
+             484:      6(int) Load 483
+             485:    161(ptr) AccessChain 24(data) 25 484 158
+             486: 19(f64vec4) Load 485
+             487:179(f64vec2) VectorShuffle 486 486 0 1
+             488:179(f64vec2) GroupNonUniformFMin 35 Reduce 487
+             489:    161(ptr) AccessChain 24(data) 25 482 158
+             490: 19(f64vec4) Load 489
+             491: 19(f64vec4) VectorShuffle 490 488 4 5 2 3
+                              Store 489 491
+             492:     27(ptr) AccessChain 10(dti) 26
+             493:      6(int) Load 492
+             494:     27(ptr) AccessChain 10(dti) 26
+             495:      6(int) Load 494
+             496:    161(ptr) AccessChain 24(data) 25 495 158
+             497: 19(f64vec4) Load 496
+             498:191(f64vec3) VectorShuffle 497 497 0 1 2
+             499:191(f64vec3) GroupNonUniformFMin 35 Reduce 498
+             500:    161(ptr) AccessChain 24(data) 25 493 158
+             501: 19(f64vec4) Load 500
+             502: 19(f64vec4) VectorShuffle 501 499 4 5 6 3
+                              Store 500 502
+             503:     27(ptr) AccessChain 10(dti) 26
+             504:      6(int) Load 503
+             505:     27(ptr) AccessChain 10(dti) 26
+             506:      6(int) Load 505
+             507:     32(ptr) AccessChain 24(data) 25 506 25
+             508:   13(ivec4) Load 507
+             509:   13(ivec4) GroupNonUniformUMax 35 Reduce 508
+             510:     32(ptr) AccessChain 24(data) 25 504 25
+                              Store 510 509
+             511:     27(ptr) AccessChain 10(dti) 26
+             512:      6(int) Load 511
+             513:     27(ptr) AccessChain 10(dti) 26
+             514:      6(int) Load 513
+             515:     42(ptr) AccessChain 24(data) 25 514 25 26
+             516:      6(int) Load 515
+             517:      6(int) GroupNonUniformUMax 35 Reduce 516
+             518:     42(ptr) AccessChain 24(data) 25 512 25 26
+                              Store 518 517
+             519:     27(ptr) AccessChain 10(dti) 26
+             520:      6(int) Load 519
+             521:     27(ptr) AccessChain 10(dti) 26
+             522:      6(int) Load 521
+             523:     32(ptr) AccessChain 24(data) 25 522 25
+             524:   13(ivec4) Load 523
+             525:   51(ivec2) VectorShuffle 524 524 0 1
+             526:   51(ivec2) GroupNonUniformUMax 35 Reduce 525
+             527:     32(ptr) AccessChain 24(data) 25 520 25
+             528:   13(ivec4) Load 527
+             529:   13(ivec4) VectorShuffle 528 526 4 5 2 3
+                              Store 527 529
+             530:     27(ptr) AccessChain 10(dti) 26
+             531:      6(int) Load 530
+             532:     27(ptr) AccessChain 10(dti) 26
+             533:      6(int) Load 532
+             534:     32(ptr) AccessChain 24(data) 25 533 25
+             535:   13(ivec4) Load 534
+             536:    7(ivec3) VectorShuffle 535 535 0 1 2
+             537:    7(ivec3) GroupNonUniformUMax 35 Reduce 536
+             538:     32(ptr) AccessChain 24(data) 25 531 25
+             539:   13(ivec4) Load 538
+             540:   13(ivec4) VectorShuffle 539 537 4 5 6 3
+                              Store 538 540
+             541:     27(ptr) AccessChain 10(dti) 26
+             542:      6(int) Load 541
+             543:     27(ptr) AccessChain 10(dti) 26
+             544:      6(int) Load 543
+             545:     75(ptr) AccessChain 24(data) 25 544 72
+             546:   15(ivec4) Load 545
+             547:   15(ivec4) GroupNonUniformSMax 35 Reduce 546
+             548:     75(ptr) AccessChain 24(data) 25 542 72
+                              Store 548 547
+             549:     27(ptr) AccessChain 10(dti) 26
+             550:      6(int) Load 549
+             551:     27(ptr) AccessChain 10(dti) 26
+             552:      6(int) Load 551
+             553:     84(ptr) AccessChain 24(data) 25 552 72 26
+             554:     14(int) Load 553
+             555:     14(int) GroupNonUniformSMax 35 Reduce 554
+             556:     84(ptr) AccessChain 24(data) 25 550 72 26
+                              Store 556 555
+             557:     27(ptr) AccessChain 10(dti) 26
+             558:      6(int) Load 557
+             559:     27(ptr) AccessChain 10(dti) 26
+             560:      6(int) Load 559
+             561:     75(ptr) AccessChain 24(data) 25 560 72
+             562:   15(ivec4) Load 561
+             563:   93(ivec2) VectorShuffle 562 562 0 1
+             564:   93(ivec2) GroupNonUniformSMax 35 Reduce 563
+             565:     75(ptr) AccessChain 24(data) 25 558 72
+             566:   15(ivec4) Load 565
+             567:   15(ivec4) VectorShuffle 566 564 4 5 2 3
+                              Store 565 567
+             568:     27(ptr) AccessChain 10(dti) 26
+             569:      6(int) Load 568
+             570:     27(ptr) AccessChain 10(dti) 26
+             571:      6(int) Load 570
+             572:     75(ptr) AccessChain 24(data) 25 571 72
+             573:   15(ivec4) Load 572
+             574:  105(ivec3) VectorShuffle 573 573 0 1 2
+             575:  105(ivec3) GroupNonUniformSMax 35 Reduce 574
+             576:     75(ptr) AccessChain 24(data) 25 569 72
+             577:   15(ivec4) Load 576
+             578:   15(ivec4) VectorShuffle 577 575 4 5 6 3
+                              Store 576 578
+             579:     27(ptr) AccessChain 10(dti) 26
+             580:      6(int) Load 579
+             581:     27(ptr) AccessChain 10(dti) 26
+             582:      6(int) Load 581
+             583:    118(ptr) AccessChain 24(data) 25 582 115
+             584:   17(fvec4) Load 583
+             585:   17(fvec4) GroupNonUniformFMax 35 Reduce 584
+             586:    118(ptr) AccessChain 24(data) 25 580 115
+                              Store 586 585
+             587:     27(ptr) AccessChain 10(dti) 26
+             588:      6(int) Load 587
+             589:     27(ptr) AccessChain 10(dti) 26
+             590:      6(int) Load 589
+             591:    127(ptr) AccessChain 24(data) 25 590 115 26
+             592:   16(float) Load 591
+             593:   16(float) GroupNonUniformFMax 35 Reduce 592
+             594:    127(ptr) AccessChain 24(data) 25 588 115 26
+                              Store 594 593
+             595:     27(ptr) AccessChain 10(dti) 26
+             596:      6(int) Load 595
+             597:     27(ptr) AccessChain 10(dti) 26
+             598:      6(int) Load 597
+             599:    118(ptr) AccessChain 24(data) 25 598 115
+             600:   17(fvec4) Load 599
+             601:  136(fvec2) VectorShuffle 600 600 0 1
+             602:  136(fvec2) GroupNonUniformFMax 35 Reduce 601
+             603:    118(ptr) AccessChain 24(data) 25 596 115
+             604:   17(fvec4) Load 603
+             605:   17(fvec4) VectorShuffle 604 602 4 5 2 3
+                              Store 603 605
+             606:     27(ptr) AccessChain 10(dti) 26
+             607:      6(int) Load 606
+             608:     27(ptr) AccessChain 10(dti) 26
+             609:      6(int) Load 608
+             610:    118(ptr) AccessChain 24(data) 25 609 115
+             611:   17(fvec4) Load 610
+             612:  148(fvec3) VectorShuffle 611 611 0 1 2
+             613:  148(fvec3) GroupNonUniformFMax 35 Reduce 612
+             614:    118(ptr) AccessChain 24(data) 25 607 115
+             615:   17(fvec4) Load 614
+             616:   17(fvec4) VectorShuffle 615 613 4 5 6 3
+                              Store 614 616
+             617:     27(ptr) AccessChain 10(dti) 26
+             618:      6(int) Load 617
+             619:     27(ptr) AccessChain 10(dti) 26
+             620:      6(int) Load 619
+             621:    161(ptr) AccessChain 24(data) 25 620 158
+             622: 19(f64vec4) Load 621
+             623: 19(f64vec4) GroupNonUniformFMax 35 Reduce 622
+             624:    161(ptr) AccessChain 24(data) 25 618 158
+                              Store 624 623
+             625:     27(ptr) AccessChain 10(dti) 26
+             626:      6(int) Load 625
+             627:     27(ptr) AccessChain 10(dti) 26
+             628:      6(int) Load 627
+             629:    170(ptr) AccessChain 24(data) 25 628 158 26
+             630:18(float64_t) Load 629
+             631:18(float64_t) GroupNonUniformFMax 35 Reduce 630
+             632:    170(ptr) AccessChain 24(data) 25 626 158 26
+                              Store 632 631
+             633:     27(ptr) AccessChain 10(dti) 26
+             634:      6(int) Load 633
+             635:     27(ptr) AccessChain 10(dti) 26
+             636:      6(int) Load 635
+             637:    161(ptr) AccessChain 24(data) 25 636 158
+             638: 19(f64vec4) Load 637
+             639:179(f64vec2) VectorShuffle 638 638 0 1
+             640:179(f64vec2) GroupNonUniformFMax 35 Reduce 639
+             641:    161(ptr) AccessChain 24(data) 25 634 158
+             642: 19(f64vec4) Load 641
+             643: 19(f64vec4) VectorShuffle 642 640 4 5 2 3
+                              Store 641 643
+             644:     27(ptr) AccessChain 10(dti) 26
+             645:      6(int) Load 644
+             646:     27(ptr) AccessChain 10(dti) 26
+             647:      6(int) Load 646
+             648:    161(ptr) AccessChain 24(data) 25 647 158
+             649: 19(f64vec4) Load 648
+             650:191(f64vec3) VectorShuffle 649 649 0 1 2
+             651:191(f64vec3) GroupNonUniformFMax 35 Reduce 650
+             652:    161(ptr) AccessChain 24(data) 25 645 158
+             653: 19(f64vec4) Load 652
+             654: 19(f64vec4) VectorShuffle 653 651 4 5 6 3
+                              Store 652 654
+             655:     27(ptr) AccessChain 10(dti) 26
+             656:      6(int) Load 655
+             657:     27(ptr) AccessChain 10(dti) 26
+             658:      6(int) Load 657
+             659:     32(ptr) AccessChain 24(data) 25 658 25
+             660:   13(ivec4) Load 659
+             661:   13(ivec4) GroupNonUniformBitwiseAnd 35 Reduce 660
+             662:     32(ptr) AccessChain 24(data) 25 656 25
+                              Store 662 661
+             663:     27(ptr) AccessChain 10(dti) 26
+             664:      6(int) Load 663
+             665:     27(ptr) AccessChain 10(dti) 26
+             666:      6(int) Load 665
+             667:     42(ptr) AccessChain 24(data) 25 666 25 26
+             668:      6(int) Load 667
+             669:      6(int) GroupNonUniformBitwiseAnd 35 Reduce 668
+             670:     42(ptr) AccessChain 24(data) 25 664 25 26
+                              Store 670 669
+             671:     27(ptr) AccessChain 10(dti) 26
+             672:      6(int) Load 671
+             673:     27(ptr) AccessChain 10(dti) 26
+             674:      6(int) Load 673
+             675:     32(ptr) AccessChain 24(data) 25 674 25
+             676:   13(ivec4) Load 675
+             677:   51(ivec2) VectorShuffle 676 676 0 1
+             678:   51(ivec2) GroupNonUniformBitwiseAnd 35 Reduce 677
+             679:     32(ptr) AccessChain 24(data) 25 672 25
+             680:   13(ivec4) Load 679
+             681:   13(ivec4) VectorShuffle 680 678 4 5 2 3
+                              Store 679 681
+             682:     27(ptr) AccessChain 10(dti) 26
+             683:      6(int) Load 682
+             684:     27(ptr) AccessChain 10(dti) 26
+             685:      6(int) Load 684
+             686:     32(ptr) AccessChain 24(data) 25 685 25
+             687:   13(ivec4) Load 686
+             688:    7(ivec3) VectorShuffle 687 687 0 1 2
+             689:    7(ivec3) GroupNonUniformBitwiseAnd 35 Reduce 688
+             690:     32(ptr) AccessChain 24(data) 25 683 25
+             691:   13(ivec4) Load 690
+             692:   13(ivec4) VectorShuffle 691 689 4 5 6 3
+                              Store 690 692
+             693:     27(ptr) AccessChain 10(dti) 26
+             694:      6(int) Load 693
+             695:     27(ptr) AccessChain 10(dti) 26
+             696:      6(int) Load 695
+             697:     75(ptr) AccessChain 24(data) 25 696 72
+             698:   15(ivec4) Load 697
+             699:   15(ivec4) GroupNonUniformBitwiseAnd 35 Reduce 698
+             700:     75(ptr) AccessChain 24(data) 25 694 72
+                              Store 700 699
+             701:     27(ptr) AccessChain 10(dti) 26
+             702:      6(int) Load 701
+             703:     27(ptr) AccessChain 10(dti) 26
+             704:      6(int) Load 703
+             705:     84(ptr) AccessChain 24(data) 25 704 72 26
+             706:     14(int) Load 705
+             707:     14(int) GroupNonUniformBitwiseAnd 35 Reduce 706
+             708:     84(ptr) AccessChain 24(data) 25 702 72 26
+                              Store 708 707
+             709:     27(ptr) AccessChain 10(dti) 26
+             710:      6(int) Load 709
+             711:     27(ptr) AccessChain 10(dti) 26
+             712:      6(int) Load 711
+             713:     75(ptr) AccessChain 24(data) 25 712 72
+             714:   15(ivec4) Load 713
+             715:   93(ivec2) VectorShuffle 714 714 0 1
+             716:   93(ivec2) GroupNonUniformBitwiseAnd 35 Reduce 715
+             717:     75(ptr) AccessChain 24(data) 25 710 72
+             718:   15(ivec4) Load 717
+             719:   15(ivec4) VectorShuffle 718 716 4 5 2 3
+                              Store 717 719
+             720:     27(ptr) AccessChain 10(dti) 26
+             721:      6(int) Load 720
+             722:     27(ptr) AccessChain 10(dti) 26
+             723:      6(int) Load 722
+             724:     75(ptr) AccessChain 24(data) 25 723 72
+             725:   15(ivec4) Load 724
+             726:  105(ivec3) VectorShuffle 725 725 0 1 2
+             727:  105(ivec3) GroupNonUniformBitwiseAnd 35 Reduce 726
+             728:     75(ptr) AccessChain 24(data) 25 721 72
+             729:   15(ivec4) Load 728
+             730:   15(ivec4) VectorShuffle 729 727 4 5 6 3
+                              Store 728 730
+             731:     27(ptr) AccessChain 10(dti) 26
+             732:      6(int) Load 731
+             733:     27(ptr) AccessChain 10(dti) 26
+             734:      6(int) Load 733
+             735:     32(ptr) AccessChain 24(data) 25 734 25
+             736:   13(ivec4) Load 735
+             737:   13(ivec4) GroupNonUniformBitwiseOr 35 Reduce 736
+             738:     32(ptr) AccessChain 24(data) 25 732 25
+                              Store 738 737
+             739:     27(ptr) AccessChain 10(dti) 26
+             740:      6(int) Load 739
+             741:     27(ptr) AccessChain 10(dti) 26
+             742:      6(int) Load 741
+             743:     42(ptr) AccessChain 24(data) 25 742 25 26
+             744:      6(int) Load 743
+             745:      6(int) GroupNonUniformBitwiseOr 35 Reduce 744
+             746:     42(ptr) AccessChain 24(data) 25 740 25 26
+                              Store 746 745
+             747:     27(ptr) AccessChain 10(dti) 26
+             748:      6(int) Load 747
+             749:     27(ptr) AccessChain 10(dti) 26
+             750:      6(int) Load 749
+             751:     32(ptr) AccessChain 24(data) 25 750 25
+             752:   13(ivec4) Load 751
+             753:   51(ivec2) VectorShuffle 752 752 0 1
+             754:   51(ivec2) GroupNonUniformBitwiseOr 35 Reduce 753
+             755:     32(ptr) AccessChain 24(data) 25 748 25
+             756:   13(ivec4) Load 755
+             757:   13(ivec4) VectorShuffle 756 754 4 5 2 3
+                              Store 755 757
+             758:     27(ptr) AccessChain 10(dti) 26
+             759:      6(int) Load 758
+             760:     27(ptr) AccessChain 10(dti) 26
+             761:      6(int) Load 760
+             762:     32(ptr) AccessChain 24(data) 25 761 25
+             763:   13(ivec4) Load 762
+             764:    7(ivec3) VectorShuffle 763 763 0 1 2
+             765:    7(ivec3) GroupNonUniformBitwiseOr 35 Reduce 764
+             766:     32(ptr) AccessChain 24(data) 25 759 25
+             767:   13(ivec4) Load 766
+             768:   13(ivec4) VectorShuffle 767 765 4 5 6 3
+                              Store 766 768
+             769:     27(ptr) AccessChain 10(dti) 26
+             770:      6(int) Load 769
+             771:     27(ptr) AccessChain 10(dti) 26
+             772:      6(int) Load 771
+             773:     75(ptr) AccessChain 24(data) 25 772 72
+             774:   15(ivec4) Load 773
+             775:   15(ivec4) GroupNonUniformBitwiseOr 35 Reduce 774
+             776:     75(ptr) AccessChain 24(data) 25 770 72
+                              Store 776 775
+             777:     27(ptr) AccessChain 10(dti) 26
+             778:      6(int) Load 777
+             779:     27(ptr) AccessChain 10(dti) 26
+             780:      6(int) Load 779
+             781:     84(ptr) AccessChain 24(data) 25 780 72 26
+             782:     14(int) Load 781
+             783:     14(int) GroupNonUniformBitwiseOr 35 Reduce 782
+             784:     84(ptr) AccessChain 24(data) 25 778 72 26
+                              Store 784 783
+             785:     27(ptr) AccessChain 10(dti) 26
+             786:      6(int) Load 785
+             787:     27(ptr) AccessChain 10(dti) 26
+             788:      6(int) Load 787
+             789:     75(ptr) AccessChain 24(data) 25 788 72
+             790:   15(ivec4) Load 789
+             791:   93(ivec2) VectorShuffle 790 790 0 1
+             792:   93(ivec2) GroupNonUniformBitwiseOr 35 Reduce 791
+             793:     75(ptr) AccessChain 24(data) 25 786 72
+             794:   15(ivec4) Load 793
+             795:   15(ivec4) VectorShuffle 794 792 4 5 2 3
+                              Store 793 795
+             796:     27(ptr) AccessChain 10(dti) 26
+             797:      6(int) Load 796
+             798:     27(ptr) AccessChain 10(dti) 26
+             799:      6(int) Load 798
+             800:     75(ptr) AccessChain 24(data) 25 799 72
+             801:   15(ivec4) Load 800
+             802:  105(ivec3) VectorShuffle 801 801 0 1 2
+             803:  105(ivec3) GroupNonUniformBitwiseOr 35 Reduce 802
+             804:     75(ptr) AccessChain 24(data) 25 797 72
+             805:   15(ivec4) Load 804
+             806:   15(ivec4) VectorShuffle 805 803 4 5 6 3
+                              Store 804 806
+             807:     27(ptr) AccessChain 10(dti) 26
+             808:      6(int) Load 807
+             809:     27(ptr) AccessChain 10(dti) 26
+             810:      6(int) Load 809
+             811:     32(ptr) AccessChain 24(data) 25 810 25
+             812:   13(ivec4) Load 811
+             813:   13(ivec4) GroupNonUniformBitwiseXor 35 Reduce 812
+             814:     32(ptr) AccessChain 24(data) 25 808 25
+                              Store 814 813
+             815:     27(ptr) AccessChain 10(dti) 26
+             816:      6(int) Load 815
+             817:     27(ptr) AccessChain 10(dti) 26
+             818:      6(int) Load 817
+             819:     42(ptr) AccessChain 24(data) 25 818 25 26
+             820:      6(int) Load 819
+             821:      6(int) GroupNonUniformBitwiseXor 35 Reduce 820
+             822:     42(ptr) AccessChain 24(data) 25 816 25 26
+                              Store 822 821
+             823:     27(ptr) AccessChain 10(dti) 26
+             824:      6(int) Load 823
+             825:     27(ptr) AccessChain 10(dti) 26
+             826:      6(int) Load 825
+             827:     32(ptr) AccessChain 24(data) 25 826 25
+             828:   13(ivec4) Load 827
+             829:   51(ivec2) VectorShuffle 828 828 0 1
+             830:   51(ivec2) GroupNonUniformBitwiseXor 35 Reduce 829
+             831:     32(ptr) AccessChain 24(data) 25 824 25
+             832:   13(ivec4) Load 831
+             833:   13(ivec4) VectorShuffle 832 830 4 5 2 3
+                              Store 831 833
+             834:     27(ptr) AccessChain 10(dti) 26
+             835:      6(int) Load 834
+             836:     27(ptr) AccessChain 10(dti) 26
+             837:      6(int) Load 836
+             838:     32(ptr) AccessChain 24(data) 25 837 25
+             839:   13(ivec4) Load 838
+             840:    7(ivec3) VectorShuffle 839 839 0 1 2
+             841:    7(ivec3) GroupNonUniformBitwiseXor 35 Reduce 840
+             842:     32(ptr) AccessChain 24(data) 25 835 25
+             843:   13(ivec4) Load 842
+             844:   13(ivec4) VectorShuffle 843 841 4 5 6 3
+                              Store 842 844
+             845:     27(ptr) AccessChain 10(dti) 26
+             846:      6(int) Load 845
+             847:     27(ptr) AccessChain 10(dti) 26
+             848:      6(int) Load 847
+             849:     75(ptr) AccessChain 24(data) 25 848 72
+             850:   15(ivec4) Load 849
+             851:   15(ivec4) GroupNonUniformBitwiseXor 35 Reduce 850
+             852:     75(ptr) AccessChain 24(data) 25 846 72
+                              Store 852 851
+             853:     27(ptr) AccessChain 10(dti) 26
+             854:      6(int) Load 853
+             855:     27(ptr) AccessChain 10(dti) 26
+             856:      6(int) Load 855
+             857:     84(ptr) AccessChain 24(data) 25 856 72 26
+             858:     14(int) Load 857
+             859:     14(int) GroupNonUniformBitwiseXor 35 Reduce 858
+             860:     84(ptr) AccessChain 24(data) 25 854 72 26
+                              Store 860 859
+             861:     27(ptr) AccessChain 10(dti) 26
+             862:      6(int) Load 861
+             863:     27(ptr) AccessChain 10(dti) 26
+             864:      6(int) Load 863
+             865:     75(ptr) AccessChain 24(data) 25 864 72
+             866:   15(ivec4) Load 865
+             867:   93(ivec2) VectorShuffle 866 866 0 1
+             868:   93(ivec2) GroupNonUniformBitwiseXor 35 Reduce 867
+             869:     75(ptr) AccessChain 24(data) 25 862 72
+             870:   15(ivec4) Load 869
+             871:   15(ivec4) VectorShuffle 870 868 4 5 2 3
+                              Store 869 871
+             872:     27(ptr) AccessChain 10(dti) 26
+             873:      6(int) Load 872
+             874:     27(ptr) AccessChain 10(dti) 26
+             875:      6(int) Load 874
+             876:     75(ptr) AccessChain 24(data) 25 875 72
+             877:   15(ivec4) Load 876
+             878:  105(ivec3) VectorShuffle 877 877 0 1 2
+             879:  105(ivec3) GroupNonUniformBitwiseXor 35 Reduce 878
+             880:     75(ptr) AccessChain 24(data) 25 873 72
+             881:   15(ivec4) Load 880
+             882:   15(ivec4) VectorShuffle 881 879 4 5 6 3
+                              Store 880 882
+             883:     27(ptr) AccessChain 10(dti) 26
+             884:      6(int) Load 883
+             885:     27(ptr) AccessChain 10(dti) 26
+             886:      6(int) Load 885
+             887:     42(ptr) AccessChain 24(data) 25 886 25 26
+             888:      6(int) Load 887
+             890:   889(bool) IEqual 888 26
+             891:   13(ivec4) GroupNonUniformBallot 35 890
+             892:      6(int) GroupNonUniformBallotBitCount 35 Reduce 891
+             893:     42(ptr) AccessChain 24(data) 25 884 25 26
+                              Store 893 892
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/hlsl.wavevote.comp.out b/Test/baseResults/hlsl.wavevote.comp.out
new file mode 100644
index 0000000..04f2f98
--- /dev/null
+++ b/Test/baseResults/hlsl.wavevote.comp.out
@@ -0,0 +1,316 @@
+hlsl.wavevote.comp
+Shader version: 500
+local_size = (32, 16, 1)
+0:? Sequence
+0:5  Function Definition: @CSMain(vu3; ( temp void)
+0:5    Function Parameters: 
+0:5      'dti' ( in 3-component vector of uint)
+0:?     Sequence
+0:6      move second child to first child ( temp uint64_t)
+0:6        indirect index (layout( row_major std430) buffer uint64_t)
+0:6          @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint64_t)
+0:6            'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint64_t @data})
+0:6            Constant:
+0:6              0 (const uint)
+0:6          direct index ( temp uint)
+0:6            'dti' ( in 3-component vector of uint)
+0:6            Constant:
+0:6              0 (const int)
+0:6        Construct uint64 (layout( row_major std430) buffer uint64_t)
+0:6          Convert uint to uint64 ( temp 4-component vector of uint64_t)
+0:6            subgroupBallot ( temp 4-component vector of uint)
+0:6              subgroupAny ( temp bool)
+0:6                Compare Equal ( temp bool)
+0:6                  direct index ( temp uint)
+0:6                    'dti' ( in 3-component vector of uint)
+0:6                    Constant:
+0:6                      0 (const int)
+0:6                  Constant:
+0:6                    0 (const uint)
+0:7      move second child to first child ( temp uint64_t)
+0:7        indirect index (layout( row_major std430) buffer uint64_t)
+0:7          @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint64_t)
+0:7            'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint64_t @data})
+0:7            Constant:
+0:7              0 (const uint)
+0:7          direct index ( temp uint)
+0:7            'dti' ( in 3-component vector of uint)
+0:7            Constant:
+0:7              1 (const int)
+0:7        Construct uint64 (layout( row_major std430) buffer uint64_t)
+0:7          Convert uint to uint64 ( temp 4-component vector of uint64_t)
+0:7            subgroupBallot ( temp 4-component vector of uint)
+0:7              subgroupAll ( temp bool)
+0:7                Compare Equal ( temp bool)
+0:7                  direct index ( temp uint)
+0:7                    'dti' ( in 3-component vector of uint)
+0:7                    Constant:
+0:7                      1 (const int)
+0:7                  Constant:
+0:7                    0 (const uint)
+0:8      move second child to first child ( temp uint64_t)
+0:8        indirect index (layout( row_major std430) buffer uint64_t)
+0:8          @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint64_t)
+0:8            'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint64_t @data})
+0:8            Constant:
+0:8              0 (const uint)
+0:8          direct index ( temp uint)
+0:8            'dti' ( in 3-component vector of uint)
+0:8            Constant:
+0:8              2 (const int)
+0:8        Construct uint64 (layout( row_major std430) buffer uint64_t)
+0:8          Convert uint to uint64 ( temp 4-component vector of uint64_t)
+0:8            subgroupBallot ( temp 4-component vector of uint)
+0:8              subgroupAllEqual ( temp bool)
+0:8                Compare Equal ( temp bool)
+0:8                  direct index ( temp uint)
+0:8                    'dti' ( in 3-component vector of uint)
+0:8                    Constant:
+0:8                      2 (const int)
+0:8                  Constant:
+0:8                    0 (const uint)
+0:9      move second child to first child ( temp uint64_t)
+0:9        indirect index (layout( row_major std430) buffer uint64_t)
+0:9          @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint64_t)
+0:9            'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint64_t @data})
+0:9            Constant:
+0:9              0 (const uint)
+0:9          direct index ( temp uint)
+0:9            'dti' ( in 3-component vector of uint)
+0:9            Constant:
+0:9              2 (const int)
+0:9        Construct uint64 (layout( row_major std430) buffer uint64_t)
+0:9          Convert uint to uint64 ( temp 4-component vector of uint64_t)
+0:9            subgroupBallot ( temp 4-component vector of uint)
+0:9              subgroupAllEqual ( temp bool)
+0:9                direct index ( temp uint)
+0:9                  'dti' ( in 3-component vector of uint)
+0:9                  Constant:
+0:9                    2 (const int)
+0:5  Function Definition: CSMain( ( temp void)
+0:5    Function Parameters: 
+0:?     Sequence
+0:5      move second child to first child ( temp 3-component vector of uint)
+0:?         'dti' ( temp 3-component vector of uint)
+0:?         'dti' ( in 3-component vector of uint GlobalInvocationID)
+0:5      Function Call: @CSMain(vu3; ( temp void)
+0:?         'dti' ( temp 3-component vector of uint)
+0:?   Linker Objects
+0:?     'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint64_t @data})
+0:?     'dti' ( in 3-component vector of uint GlobalInvocationID)
+
+
+Linked compute stage:
+
+
+Shader version: 500
+local_size = (32, 16, 1)
+0:? Sequence
+0:5  Function Definition: @CSMain(vu3; ( temp void)
+0:5    Function Parameters: 
+0:5      'dti' ( in 3-component vector of uint)
+0:?     Sequence
+0:6      move second child to first child ( temp uint64_t)
+0:6        indirect index (layout( row_major std430) buffer uint64_t)
+0:6          @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint64_t)
+0:6            'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint64_t @data})
+0:6            Constant:
+0:6              0 (const uint)
+0:6          direct index ( temp uint)
+0:6            'dti' ( in 3-component vector of uint)
+0:6            Constant:
+0:6              0 (const int)
+0:6        Construct uint64 (layout( row_major std430) buffer uint64_t)
+0:6          Convert uint to uint64 ( temp 4-component vector of uint64_t)
+0:6            subgroupBallot ( temp 4-component vector of uint)
+0:6              subgroupAny ( temp bool)
+0:6                Compare Equal ( temp bool)
+0:6                  direct index ( temp uint)
+0:6                    'dti' ( in 3-component vector of uint)
+0:6                    Constant:
+0:6                      0 (const int)
+0:6                  Constant:
+0:6                    0 (const uint)
+0:7      move second child to first child ( temp uint64_t)
+0:7        indirect index (layout( row_major std430) buffer uint64_t)
+0:7          @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint64_t)
+0:7            'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint64_t @data})
+0:7            Constant:
+0:7              0 (const uint)
+0:7          direct index ( temp uint)
+0:7            'dti' ( in 3-component vector of uint)
+0:7            Constant:
+0:7              1 (const int)
+0:7        Construct uint64 (layout( row_major std430) buffer uint64_t)
+0:7          Convert uint to uint64 ( temp 4-component vector of uint64_t)
+0:7            subgroupBallot ( temp 4-component vector of uint)
+0:7              subgroupAll ( temp bool)
+0:7                Compare Equal ( temp bool)
+0:7                  direct index ( temp uint)
+0:7                    'dti' ( in 3-component vector of uint)
+0:7                    Constant:
+0:7                      1 (const int)
+0:7                  Constant:
+0:7                    0 (const uint)
+0:8      move second child to first child ( temp uint64_t)
+0:8        indirect index (layout( row_major std430) buffer uint64_t)
+0:8          @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint64_t)
+0:8            'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint64_t @data})
+0:8            Constant:
+0:8              0 (const uint)
+0:8          direct index ( temp uint)
+0:8            'dti' ( in 3-component vector of uint)
+0:8            Constant:
+0:8              2 (const int)
+0:8        Construct uint64 (layout( row_major std430) buffer uint64_t)
+0:8          Convert uint to uint64 ( temp 4-component vector of uint64_t)
+0:8            subgroupBallot ( temp 4-component vector of uint)
+0:8              subgroupAllEqual ( temp bool)
+0:8                Compare Equal ( temp bool)
+0:8                  direct index ( temp uint)
+0:8                    'dti' ( in 3-component vector of uint)
+0:8                    Constant:
+0:8                      2 (const int)
+0:8                  Constant:
+0:8                    0 (const uint)
+0:9      move second child to first child ( temp uint64_t)
+0:9        indirect index (layout( row_major std430) buffer uint64_t)
+0:9          @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint64_t)
+0:9            'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint64_t @data})
+0:9            Constant:
+0:9              0 (const uint)
+0:9          direct index ( temp uint)
+0:9            'dti' ( in 3-component vector of uint)
+0:9            Constant:
+0:9              2 (const int)
+0:9        Construct uint64 (layout( row_major std430) buffer uint64_t)
+0:9          Convert uint to uint64 ( temp 4-component vector of uint64_t)
+0:9            subgroupBallot ( temp 4-component vector of uint)
+0:9              subgroupAllEqual ( temp bool)
+0:9                direct index ( temp uint)
+0:9                  'dti' ( in 3-component vector of uint)
+0:9                  Constant:
+0:9                    2 (const int)
+0:5  Function Definition: CSMain( ( temp void)
+0:5    Function Parameters: 
+0:?     Sequence
+0:5      move second child to first child ( temp 3-component vector of uint)
+0:?         'dti' ( temp 3-component vector of uint)
+0:?         'dti' ( in 3-component vector of uint GlobalInvocationID)
+0:5      Function Call: @CSMain(vu3; ( temp void)
+0:?         'dti' ( temp 3-component vector of uint)
+0:?   Linker Objects
+0:?     'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint64_t @data})
+0:?     'dti' ( in 3-component vector of uint GlobalInvocationID)
+
+// Module Version 10300
+// Generated by (magic number): 80007
+// Id's are bound by 75
+
+                              Capability Shader
+                              Capability Int64
+                              Capability GroupNonUniform
+                              Capability GroupNonUniformVote
+                              Capability GroupNonUniformBallot
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint GLCompute 4  "CSMain" 70
+                              ExecutionMode 4 LocalSize 32 16 1
+                              Source HLSL 500
+                              Name 4  "CSMain"
+                              Name 11  "@CSMain(vu3;"
+                              Name 10  "dti"
+                              Name 15  "data"
+                              MemberName 15(data) 0  "@data"
+                              Name 17  "data"
+                              Name 68  "dti"
+                              Name 70  "dti"
+                              Name 72  "param"
+                              Decorate 14 ArrayStride 8
+                              MemberDecorate 15(data) 0 Offset 0
+                              Decorate 15(data) BufferBlock
+                              Decorate 17(data) DescriptorSet 0
+                              Decorate 70(dti) BuiltIn GlobalInvocationId
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeInt 32 0
+               7:             TypeVector 6(int) 3
+               8:             TypePointer Function 7(ivec3)
+               9:             TypeFunction 2 8(ptr)
+              13:             TypeInt 64 0
+              14:             TypeRuntimeArray 13(int64_t)
+        15(data):             TypeStruct 14
+              16:             TypePointer Uniform 15(data)
+        17(data):     16(ptr) Variable Uniform
+              18:             TypeInt 32 1
+              19:     18(int) Constant 0
+              20:      6(int) Constant 0
+              21:             TypePointer Function 6(int)
+              26:             TypeBool
+              28:      6(int) Constant 3
+              30:             TypeVector 6(int) 4
+              32:             TypeVector 13(int64_t) 4
+              35:             TypePointer Uniform 13(int64_t)
+              37:      6(int) Constant 1
+              48:      6(int) Constant 2
+              69:             TypePointer Input 7(ivec3)
+         70(dti):     69(ptr) Variable Input
+       4(CSMain):           2 Function None 3
+               5:             Label
+         68(dti):      8(ptr) Variable Function
+       72(param):      8(ptr) Variable Function
+              71:    7(ivec3) Load 70(dti)
+                              Store 68(dti) 71
+              73:    7(ivec3) Load 68(dti)
+                              Store 72(param) 73
+              74:           2 FunctionCall 11(@CSMain(vu3;) 72(param)
+                              Return
+                              FunctionEnd
+11(@CSMain(vu3;):           2 Function None 9
+         10(dti):      8(ptr) FunctionParameter
+              12:             Label
+              22:     21(ptr) AccessChain 10(dti) 20
+              23:      6(int) Load 22
+              24:     21(ptr) AccessChain 10(dti) 20
+              25:      6(int) Load 24
+              27:    26(bool) IEqual 25 20
+              29:    26(bool) GroupNonUniformAny 28 27
+              31:   30(ivec4) GroupNonUniformBallot 28 29
+              33: 32(i64vec4) UConvert 31
+              34: 13(int64_t) CompositeExtract 33 0
+              36:     35(ptr) AccessChain 17(data) 19 23
+                              Store 36 34
+              38:     21(ptr) AccessChain 10(dti) 37
+              39:      6(int) Load 38
+              40:     21(ptr) AccessChain 10(dti) 37
+              41:      6(int) Load 40
+              42:    26(bool) IEqual 41 20
+              43:    26(bool) GroupNonUniformAll 28 42
+              44:   30(ivec4) GroupNonUniformBallot 28 43
+              45: 32(i64vec4) UConvert 44
+              46: 13(int64_t) CompositeExtract 45 0
+              47:     35(ptr) AccessChain 17(data) 19 39
+                              Store 47 46
+              49:     21(ptr) AccessChain 10(dti) 48
+              50:      6(int) Load 49
+              51:     21(ptr) AccessChain 10(dti) 48
+              52:      6(int) Load 51
+              53:    26(bool) IEqual 52 20
+              54:    26(bool) GroupNonUniformAllEqual 28 53
+              55:   30(ivec4) GroupNonUniformBallot 28 54
+              56: 32(i64vec4) UConvert 55
+              57: 13(int64_t) CompositeExtract 56 0
+              58:     35(ptr) AccessChain 17(data) 19 50
+                              Store 58 57
+              59:     21(ptr) AccessChain 10(dti) 48
+              60:      6(int) Load 59
+              61:     21(ptr) AccessChain 10(dti) 48
+              62:      6(int) Load 61
+              63:    26(bool) GroupNonUniformAllEqual 28 62
+              64:   30(ivec4) GroupNonUniformBallot 28 63
+              65: 32(i64vec4) UConvert 64
+              66: 13(int64_t) CompositeExtract 65 0
+              67:     35(ptr) AccessChain 17(data) 19 60
+                              Store 67 66
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/hlsl.whileLoop.frag.out b/Test/baseResults/hlsl.whileLoop.frag.out
old mode 100755
new mode 100644
index 3e9b794..babc77d
--- a/Test/baseResults/hlsl.whileLoop.frag.out
+++ b/Test/baseResults/hlsl.whileLoop.frag.out
@@ -21,7 +21,7 @@
 0:4        Constant:
 0:4          false (const bool)
 0:4        No loop body
-0:5      Loop with condition tested first
+0:5      Loop with condition tested first: Unroll
 0:5        Loop Condition
 0:5        Constant:
 0:5          false (const bool)
@@ -71,7 +71,7 @@
 0:4        Constant:
 0:4          false (const bool)
 0:4        No loop body
-0:5      Loop with condition tested first
+0:5      Loop with condition tested first: Unroll
 0:5        Loop Condition
 0:5        Constant:
 0:5          false (const bool)
@@ -96,7 +96,7 @@
 0:?     'input' (layout( location=0) in 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 52
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.y-negate-1.vert.out b/Test/baseResults/hlsl.y-negate-1.vert.out
new file mode 100644
index 0000000..257d56c
--- /dev/null
+++ b/Test/baseResults/hlsl.y-negate-1.vert.out
@@ -0,0 +1,130 @@
+hlsl.y-negate-1.vert
+Shader version: 500
+0:? Sequence
+0:7  Function Definition: @main( ( temp 4-component vector of float)
+0:7    Function Parameters: 
+0:?     Sequence
+0:8      Branch: Return with expression
+0:8        pos: direct index for structure ( uniform 4-component vector of float)
+0:8          'anon@0' (layout( row_major std140) uniform block{ uniform 4-component vector of float pos})
+0:8          Constant:
+0:8            0 (const uint)
+0:7  Function Definition: main( ( temp void)
+0:7    Function Parameters: 
+0:?     Sequence
+0:7      Sequence
+0:7        move second child to first child ( temp 4-component vector of float)
+0:7          '@position' ( temp 4-component vector of float)
+0:7          Function Call: @main( ( temp 4-component vector of float)
+0:7        move second child to first child ( temp float)
+0:7          direct index ( temp float)
+0:7            '@position' ( temp 4-component vector of float)
+0:7            Constant:
+0:7              1 (const int)
+0:7          Negate value ( temp float)
+0:7            direct index ( temp float)
+0:7              '@position' ( temp 4-component vector of float)
+0:7              Constant:
+0:7                1 (const int)
+0:7        move second child to first child ( temp 4-component vector of float)
+0:?           '@entryPointOutput' ( out 4-component vector of float Position)
+0:7          '@position' ( temp 4-component vector of float)
+0:?   Linker Objects
+0:?     'anon@0' (layout( row_major std140) uniform block{ uniform 4-component vector of float pos})
+0:?     '@entryPointOutput' ( out 4-component vector of float Position)
+
+
+Linked vertex stage:
+
+
+Shader version: 500
+0:? Sequence
+0:7  Function Definition: @main( ( temp 4-component vector of float)
+0:7    Function Parameters: 
+0:?     Sequence
+0:8      Branch: Return with expression
+0:8        pos: direct index for structure ( uniform 4-component vector of float)
+0:8          'anon@0' (layout( row_major std140) uniform block{ uniform 4-component vector of float pos})
+0:8          Constant:
+0:8            0 (const uint)
+0:7  Function Definition: main( ( temp void)
+0:7    Function Parameters: 
+0:?     Sequence
+0:7      Sequence
+0:7        move second child to first child ( temp 4-component vector of float)
+0:7          '@position' ( temp 4-component vector of float)
+0:7          Function Call: @main( ( temp 4-component vector of float)
+0:7        move second child to first child ( temp float)
+0:7          direct index ( temp float)
+0:7            '@position' ( temp 4-component vector of float)
+0:7            Constant:
+0:7              1 (const int)
+0:7          Negate value ( temp float)
+0:7            direct index ( temp float)
+0:7              '@position' ( temp 4-component vector of float)
+0:7              Constant:
+0:7                1 (const int)
+0:7        move second child to first child ( temp 4-component vector of float)
+0:?           '@entryPointOutput' ( out 4-component vector of float Position)
+0:7          '@position' ( temp 4-component vector of float)
+0:?   Linker Objects
+0:?     'anon@0' (layout( row_major std140) uniform block{ uniform 4-component vector of float pos})
+0:?     '@entryPointOutput' ( out 4-component vector of float Position)
+
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 34
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Vertex 4  "main" 32
+                              Source HLSL 500
+                              Name 4  "main"
+                              Name 9  "@main("
+                              Name 11  "$Global"
+                              MemberName 11($Global) 0  "pos"
+                              Name 13  ""
+                              Name 22  "@position"
+                              Name 32  "@entryPointOutput"
+                              MemberDecorate 11($Global) 0 Offset 0
+                              Decorate 11($Global) Block
+                              Decorate 13 DescriptorSet 0
+                              Decorate 32(@entryPointOutput) BuiltIn Position
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+               8:             TypeFunction 7(fvec4)
+     11($Global):             TypeStruct 7(fvec4)
+              12:             TypePointer Uniform 11($Global)
+              13:     12(ptr) Variable Uniform
+              14:             TypeInt 32 1
+              15:     14(int) Constant 0
+              16:             TypePointer Uniform 7(fvec4)
+              21:             TypePointer Function 7(fvec4)
+              24:             TypeInt 32 0
+              25:     24(int) Constant 1
+              26:             TypePointer Function 6(float)
+              31:             TypePointer Output 7(fvec4)
+32(@entryPointOutput):     31(ptr) Variable Output
+         4(main):           2 Function None 3
+               5:             Label
+   22(@position):     21(ptr) Variable Function
+              23:    7(fvec4) FunctionCall 9(@main()
+                              Store 22(@position) 23
+              27:     26(ptr) AccessChain 22(@position) 25
+              28:    6(float) Load 27
+              29:    6(float) FNegate 28
+              30:     26(ptr) AccessChain 22(@position) 25
+                              Store 30 29
+              33:    7(fvec4) Load 22(@position)
+                              Store 32(@entryPointOutput) 33
+                              Return
+                              FunctionEnd
+       9(@main():    7(fvec4) Function None 8
+              10:             Label
+              17:     16(ptr) AccessChain 13 15
+              18:    7(fvec4) Load 17
+                              ReturnValue 18
+                              FunctionEnd
diff --git a/Test/baseResults/hlsl.y-negate-2.vert.out b/Test/baseResults/hlsl.y-negate-2.vert.out
new file mode 100644
index 0000000..a234a2e
--- /dev/null
+++ b/Test/baseResults/hlsl.y-negate-2.vert.out
@@ -0,0 +1,148 @@
+hlsl.y-negate-2.vert
+Shader version: 500
+0:? Sequence
+0:6  Function Definition: @main(vf4; ( temp void)
+0:6    Function Parameters: 
+0:6      'position' ( out 4-component vector of float)
+0:?     Sequence
+0:7      move second child to first child ( temp 4-component vector of float)
+0:7        'position' ( out 4-component vector of float)
+0:7        pos: direct index for structure ( uniform 4-component vector of float)
+0:7          'anon@0' (layout( row_major std140) uniform block{ uniform 4-component vector of float pos})
+0:7          Constant:
+0:7            0 (const uint)
+0:6  Function Definition: main( ( temp void)
+0:6    Function Parameters: 
+0:?     Sequence
+0:6      Function Call: @main(vf4; ( temp void)
+0:?         'position' ( temp 4-component vector of float)
+0:6      Sequence
+0:6        move second child to first child ( temp 4-component vector of float)
+0:6          '@position' ( temp 4-component vector of float)
+0:?           'position' ( temp 4-component vector of float)
+0:6        move second child to first child ( temp float)
+0:6          direct index ( temp float)
+0:6            '@position' ( temp 4-component vector of float)
+0:6            Constant:
+0:6              1 (const int)
+0:6          Negate value ( temp float)
+0:6            direct index ( temp float)
+0:6              '@position' ( temp 4-component vector of float)
+0:6              Constant:
+0:6                1 (const int)
+0:6        move second child to first child ( temp 4-component vector of float)
+0:?           'position' ( out 4-component vector of float Position)
+0:6          '@position' ( temp 4-component vector of float)
+0:?   Linker Objects
+0:?     'anon@0' (layout( row_major std140) uniform block{ uniform 4-component vector of float pos})
+0:?     'position' ( out 4-component vector of float Position)
+
+
+Linked vertex stage:
+
+
+Shader version: 500
+0:? Sequence
+0:6  Function Definition: @main(vf4; ( temp void)
+0:6    Function Parameters: 
+0:6      'position' ( out 4-component vector of float)
+0:?     Sequence
+0:7      move second child to first child ( temp 4-component vector of float)
+0:7        'position' ( out 4-component vector of float)
+0:7        pos: direct index for structure ( uniform 4-component vector of float)
+0:7          'anon@0' (layout( row_major std140) uniform block{ uniform 4-component vector of float pos})
+0:7          Constant:
+0:7            0 (const uint)
+0:6  Function Definition: main( ( temp void)
+0:6    Function Parameters: 
+0:?     Sequence
+0:6      Function Call: @main(vf4; ( temp void)
+0:?         'position' ( temp 4-component vector of float)
+0:6      Sequence
+0:6        move second child to first child ( temp 4-component vector of float)
+0:6          '@position' ( temp 4-component vector of float)
+0:?           'position' ( temp 4-component vector of float)
+0:6        move second child to first child ( temp float)
+0:6          direct index ( temp float)
+0:6            '@position' ( temp 4-component vector of float)
+0:6            Constant:
+0:6              1 (const int)
+0:6          Negate value ( temp float)
+0:6            direct index ( temp float)
+0:6              '@position' ( temp 4-component vector of float)
+0:6              Constant:
+0:6                1 (const int)
+0:6        move second child to first child ( temp 4-component vector of float)
+0:?           'position' ( out 4-component vector of float Position)
+0:6          '@position' ( temp 4-component vector of float)
+0:?   Linker Objects
+0:?     'anon@0' (layout( row_major std140) uniform block{ uniform 4-component vector of float pos})
+0:?     'position' ( out 4-component vector of float Position)
+
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 37
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Vertex 4  "main" 35
+                              Source HLSL 500
+                              Name 4  "main"
+                              Name 11  "@main(vf4;"
+                              Name 10  "position"
+                              Name 13  "$Global"
+                              MemberName 13($Global) 0  "pos"
+                              Name 15  ""
+                              Name 21  "position"
+                              Name 22  "param"
+                              Name 25  "@position"
+                              Name 35  "position"
+                              MemberDecorate 13($Global) 0 Offset 0
+                              Decorate 13($Global) Block
+                              Decorate 15 DescriptorSet 0
+                              Decorate 35(position) BuiltIn Position
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+               8:             TypePointer Function 7(fvec4)
+               9:             TypeFunction 2 8(ptr)
+     13($Global):             TypeStruct 7(fvec4)
+              14:             TypePointer Uniform 13($Global)
+              15:     14(ptr) Variable Uniform
+              16:             TypeInt 32 1
+              17:     16(int) Constant 0
+              18:             TypePointer Uniform 7(fvec4)
+              27:             TypeInt 32 0
+              28:     27(int) Constant 1
+              29:             TypePointer Function 6(float)
+              34:             TypePointer Output 7(fvec4)
+    35(position):     34(ptr) Variable Output
+         4(main):           2 Function None 3
+               5:             Label
+    21(position):      8(ptr) Variable Function
+       22(param):      8(ptr) Variable Function
+   25(@position):      8(ptr) Variable Function
+              23:           2 FunctionCall 11(@main(vf4;) 22(param)
+              24:    7(fvec4) Load 22(param)
+                              Store 21(position) 24
+              26:    7(fvec4) Load 21(position)
+                              Store 25(@position) 26
+              30:     29(ptr) AccessChain 25(@position) 28
+              31:    6(float) Load 30
+              32:    6(float) FNegate 31
+              33:     29(ptr) AccessChain 25(@position) 28
+                              Store 33 32
+              36:    7(fvec4) Load 25(@position)
+                              Store 35(position) 36
+                              Return
+                              FunctionEnd
+  11(@main(vf4;):           2 Function None 9
+    10(position):      8(ptr) FunctionParameter
+              12:             Label
+              19:     18(ptr) AccessChain 15 17
+              20:    7(fvec4) Load 19
+                              Store 10(position) 20
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/hlsl.y-negate-3.vert.out b/Test/baseResults/hlsl.y-negate-3.vert.out
new file mode 100644
index 0000000..34bf8f9
--- /dev/null
+++ b/Test/baseResults/hlsl.y-negate-3.vert.out
@@ -0,0 +1,211 @@
+hlsl.y-negate-3.vert
+Shader version: 500
+0:? Sequence
+0:11  Function Definition: @main( ( temp structure{ temp 4-component vector of float pos,  temp int somethingelse})
+0:11    Function Parameters: 
+0:?     Sequence
+0:14      move second child to first child ( temp 4-component vector of float)
+0:14        pos: direct index for structure ( temp 4-component vector of float)
+0:14          'vsout' ( temp structure{ temp 4-component vector of float pos,  temp int somethingelse})
+0:14          Constant:
+0:14            0 (const int)
+0:14        position: direct index for structure ( uniform 4-component vector of float)
+0:14          'anon@0' (layout( row_major std140) uniform block{ uniform 4-component vector of float position})
+0:14          Constant:
+0:14            0 (const uint)
+0:15      move second child to first child ( temp int)
+0:15        somethingelse: direct index for structure ( temp int)
+0:15          'vsout' ( temp structure{ temp 4-component vector of float pos,  temp int somethingelse})
+0:15          Constant:
+0:15            1 (const int)
+0:15        Constant:
+0:15          42 (const int)
+0:17      Branch: Return with expression
+0:17        'vsout' ( temp structure{ temp 4-component vector of float pos,  temp int somethingelse})
+0:11  Function Definition: main( ( temp void)
+0:11    Function Parameters: 
+0:?     Sequence
+0:11      Sequence
+0:11        move second child to first child ( temp structure{ temp 4-component vector of float pos,  temp int somethingelse})
+0:11          'flattenTemp' ( temp structure{ temp 4-component vector of float pos,  temp int somethingelse})
+0:11          Function Call: @main( ( temp structure{ temp 4-component vector of float pos,  temp int somethingelse})
+0:11        Sequence
+0:11          move second child to first child ( temp 4-component vector of float)
+0:11            '@position' ( temp 4-component vector of float)
+0:11            pos: direct index for structure ( temp 4-component vector of float)
+0:11              'flattenTemp' ( temp structure{ temp 4-component vector of float pos,  temp int somethingelse})
+0:11              Constant:
+0:11                0 (const int)
+0:11          move second child to first child ( temp float)
+0:11            direct index ( temp float)
+0:11              '@position' ( temp 4-component vector of float)
+0:11              Constant:
+0:11                1 (const int)
+0:11            Negate value ( temp float)
+0:11              direct index ( temp float)
+0:11                '@position' ( temp 4-component vector of float)
+0:11                Constant:
+0:11                  1 (const int)
+0:11          move second child to first child ( temp 4-component vector of float)
+0:?             '@entryPointOutput.pos' ( out 4-component vector of float Position)
+0:11            '@position' ( temp 4-component vector of float)
+0:11        move second child to first child ( temp int)
+0:?           '@entryPointOutput.somethingelse' (layout( location=0) out int)
+0:11          somethingelse: direct index for structure ( temp int)
+0:11            'flattenTemp' ( temp structure{ temp 4-component vector of float pos,  temp int somethingelse})
+0:11            Constant:
+0:11              1 (const int)
+0:?   Linker Objects
+0:?     'anon@0' (layout( row_major std140) uniform block{ uniform 4-component vector of float position})
+0:?     '@entryPointOutput.pos' ( out 4-component vector of float Position)
+0:?     '@entryPointOutput.somethingelse' (layout( location=0) out int)
+
+
+Linked vertex stage:
+
+
+Shader version: 500
+0:? Sequence
+0:11  Function Definition: @main( ( temp structure{ temp 4-component vector of float pos,  temp int somethingelse})
+0:11    Function Parameters: 
+0:?     Sequence
+0:14      move second child to first child ( temp 4-component vector of float)
+0:14        pos: direct index for structure ( temp 4-component vector of float)
+0:14          'vsout' ( temp structure{ temp 4-component vector of float pos,  temp int somethingelse})
+0:14          Constant:
+0:14            0 (const int)
+0:14        position: direct index for structure ( uniform 4-component vector of float)
+0:14          'anon@0' (layout( row_major std140) uniform block{ uniform 4-component vector of float position})
+0:14          Constant:
+0:14            0 (const uint)
+0:15      move second child to first child ( temp int)
+0:15        somethingelse: direct index for structure ( temp int)
+0:15          'vsout' ( temp structure{ temp 4-component vector of float pos,  temp int somethingelse})
+0:15          Constant:
+0:15            1 (const int)
+0:15        Constant:
+0:15          42 (const int)
+0:17      Branch: Return with expression
+0:17        'vsout' ( temp structure{ temp 4-component vector of float pos,  temp int somethingelse})
+0:11  Function Definition: main( ( temp void)
+0:11    Function Parameters: 
+0:?     Sequence
+0:11      Sequence
+0:11        move second child to first child ( temp structure{ temp 4-component vector of float pos,  temp int somethingelse})
+0:11          'flattenTemp' ( temp structure{ temp 4-component vector of float pos,  temp int somethingelse})
+0:11          Function Call: @main( ( temp structure{ temp 4-component vector of float pos,  temp int somethingelse})
+0:11        Sequence
+0:11          move second child to first child ( temp 4-component vector of float)
+0:11            '@position' ( temp 4-component vector of float)
+0:11            pos: direct index for structure ( temp 4-component vector of float)
+0:11              'flattenTemp' ( temp structure{ temp 4-component vector of float pos,  temp int somethingelse})
+0:11              Constant:
+0:11                0 (const int)
+0:11          move second child to first child ( temp float)
+0:11            direct index ( temp float)
+0:11              '@position' ( temp 4-component vector of float)
+0:11              Constant:
+0:11                1 (const int)
+0:11            Negate value ( temp float)
+0:11              direct index ( temp float)
+0:11                '@position' ( temp 4-component vector of float)
+0:11                Constant:
+0:11                  1 (const int)
+0:11          move second child to first child ( temp 4-component vector of float)
+0:?             '@entryPointOutput.pos' ( out 4-component vector of float Position)
+0:11            '@position' ( temp 4-component vector of float)
+0:11        move second child to first child ( temp int)
+0:?           '@entryPointOutput.somethingelse' (layout( location=0) out int)
+0:11          somethingelse: direct index for structure ( temp int)
+0:11            'flattenTemp' ( temp structure{ temp 4-component vector of float pos,  temp int somethingelse})
+0:11            Constant:
+0:11              1 (const int)
+0:?   Linker Objects
+0:?     'anon@0' (layout( row_major std140) uniform block{ uniform 4-component vector of float position})
+0:?     '@entryPointOutput.pos' ( out 4-component vector of float Position)
+0:?     '@entryPointOutput.somethingelse' (layout( location=0) out int)
+
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 50
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Vertex 4  "main" 44 47
+                              Source HLSL 500
+                              Name 4  "main"
+                              Name 9  "VS_OUT"
+                              MemberName 9(VS_OUT) 0  "pos"
+                              MemberName 9(VS_OUT) 1  "somethingelse"
+                              Name 11  "@main("
+                              Name 14  "vsout"
+                              Name 16  "$Global"
+                              MemberName 16($Global) 0  "position"
+                              Name 18  ""
+                              Name 31  "flattenTemp"
+                              Name 33  "@position"
+                              Name 44  "@entryPointOutput.pos"
+                              Name 47  "@entryPointOutput.somethingelse"
+                              MemberDecorate 16($Global) 0 Offset 0
+                              Decorate 16($Global) Block
+                              Decorate 18 DescriptorSet 0
+                              Decorate 44(@entryPointOutput.pos) BuiltIn Position
+                              Decorate 47(@entryPointOutput.somethingelse) Location 0
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+               8:             TypeInt 32 1
+       9(VS_OUT):             TypeStruct 7(fvec4) 8(int)
+              10:             TypeFunction 9(VS_OUT)
+              13:             TypePointer Function 9(VS_OUT)
+              15:      8(int) Constant 0
+     16($Global):             TypeStruct 7(fvec4)
+              17:             TypePointer Uniform 16($Global)
+              18:     17(ptr) Variable Uniform
+              19:             TypePointer Uniform 7(fvec4)
+              22:             TypePointer Function 7(fvec4)
+              24:      8(int) Constant 1
+              25:      8(int) Constant 42
+              26:             TypePointer Function 8(int)
+              36:             TypeInt 32 0
+              37:     36(int) Constant 1
+              38:             TypePointer Function 6(float)
+              43:             TypePointer Output 7(fvec4)
+44(@entryPointOutput.pos):     43(ptr) Variable Output
+              46:             TypePointer Output 8(int)
+47(@entryPointOutput.somethingelse):     46(ptr) Variable Output
+         4(main):           2 Function None 3
+               5:             Label
+ 31(flattenTemp):     13(ptr) Variable Function
+   33(@position):     22(ptr) Variable Function
+              32:   9(VS_OUT) FunctionCall 11(@main()
+                              Store 31(flattenTemp) 32
+              34:     22(ptr) AccessChain 31(flattenTemp) 15
+              35:    7(fvec4) Load 34
+                              Store 33(@position) 35
+              39:     38(ptr) AccessChain 33(@position) 37
+              40:    6(float) Load 39
+              41:    6(float) FNegate 40
+              42:     38(ptr) AccessChain 33(@position) 37
+                              Store 42 41
+              45:    7(fvec4) Load 33(@position)
+                              Store 44(@entryPointOutput.pos) 45
+              48:     26(ptr) AccessChain 31(flattenTemp) 24
+              49:      8(int) Load 48
+                              Store 47(@entryPointOutput.somethingelse) 49
+                              Return
+                              FunctionEnd
+      11(@main():   9(VS_OUT) Function None 10
+              12:             Label
+       14(vsout):     13(ptr) Variable Function
+              20:     19(ptr) AccessChain 18 15
+              21:    7(fvec4) Load 20
+              23:     22(ptr) AccessChain 14(vsout) 15
+                              Store 23 21
+              27:     26(ptr) AccessChain 14(vsout) 24
+                              Store 27 25
+              28:   9(VS_OUT) Load 14(vsout)
+                              ReturnValue 28
+                              FunctionEnd
diff --git a/Test/baseResults/implicitInnerAtomicUint.frag.out b/Test/baseResults/implicitInnerAtomicUint.frag.out
new file mode 100644
index 0000000..ed9771e
--- /dev/null
+++ b/Test/baseResults/implicitInnerAtomicUint.frag.out
@@ -0,0 +1,20 @@
+implicitInnerAtomicUint.frag
+ERROR: 0:2: '[]' : only outermost dimension of an array of arrays can be implicitly sized 
+ERROR: 1 compilation errors.  No code generated.
+
+
+Shader version: 460
+ERROR: node is still EOpNull!
+0:?   Linker Objects
+0:?     'c' (layout( binding=0 offset=0) uniform 1-element array of 1-element array of atomic_uint)
+
+
+Linked fragment stage:
+
+ERROR: Linking fragment stage: Missing entry point: Each stage requires one entry point
+
+Shader version: 460
+ERROR: node is still EOpNull!
+0:?   Linker Objects
+0:?     'c' (layout( binding=0 offset=0) uniform 1-element array of 1-element array of atomic_uint)
+
diff --git a/Test/baseResults/include.vert.out b/Test/baseResults/include.vert.out
new file mode 100644
index 0000000..42f1032
--- /dev/null
+++ b/Test/baseResults/include.vert.out
@@ -0,0 +1,67 @@
+include.vert
+Shader version: 450
+Requested GL_GOOGLE_cpp_style_line_directive
+Requested GL_GOOGLE_include_directive
+0:? Sequence
+0:13  Function Definition: main( ( global void)
+0:13    Function Parameters: 
+0:15    Sequence
+0:15      move second child to first child ( temp 4-component vector of float)
+0:15        'color' ( smooth out 4-component vector of float)
+0:15        add ( temp 4-component vector of float)
+0:15          add ( temp 4-component vector of float)
+0:15            add ( temp 4-component vector of float)
+0:15              add ( temp 4-component vector of float)
+0:15                add ( temp 4-component vector of float)
+0:15                  'i1' ( global 4-component vector of float)
+0:15                  'i2' ( global 4-component vector of float)
+0:15                'i3' ( global 4-component vector of float)
+0:15              'i4' ( global 4-component vector of float)
+0:15            'i5' ( global 4-component vector of float)
+0:15          'i6' ( global 4-component vector of float)
+0:?   Linker Objects
+0:?     'i1' ( global 4-component vector of float)
+0:?     'i2' ( global 4-component vector of float)
+0:?     'i4' ( global 4-component vector of float)
+0:?     'i3' ( global 4-component vector of float)
+0:?     'i6' ( global 4-component vector of float)
+0:?     'i5' ( global 4-component vector of float)
+0:?     'color' ( smooth out 4-component vector of float)
+0:?     'gl_VertexID' ( gl_VertexId int VertexId)
+0:?     'gl_InstanceID' ( gl_InstanceId int InstanceId)
+
+
+Linked vertex stage:
+
+
+Shader version: 450
+Requested GL_GOOGLE_cpp_style_line_directive
+Requested GL_GOOGLE_include_directive
+0:? Sequence
+0:13  Function Definition: main( ( global void)
+0:13    Function Parameters: 
+0:15    Sequence
+0:15      move second child to first child ( temp 4-component vector of float)
+0:15        'color' ( smooth out 4-component vector of float)
+0:15        add ( temp 4-component vector of float)
+0:15          add ( temp 4-component vector of float)
+0:15            add ( temp 4-component vector of float)
+0:15              add ( temp 4-component vector of float)
+0:15                add ( temp 4-component vector of float)
+0:15                  'i1' ( global 4-component vector of float)
+0:15                  'i2' ( global 4-component vector of float)
+0:15                'i3' ( global 4-component vector of float)
+0:15              'i4' ( global 4-component vector of float)
+0:15            'i5' ( global 4-component vector of float)
+0:15          'i6' ( global 4-component vector of float)
+0:?   Linker Objects
+0:?     'i1' ( global 4-component vector of float)
+0:?     'i2' ( global 4-component vector of float)
+0:?     'i4' ( global 4-component vector of float)
+0:?     'i3' ( global 4-component vector of float)
+0:?     'i6' ( global 4-component vector of float)
+0:?     'i5' ( global 4-component vector of float)
+0:?     'color' ( smooth out 4-component vector of float)
+0:?     'gl_VertexID' ( gl_VertexId int VertexId)
+0:?     'gl_InstanceID' ( gl_InstanceId int InstanceId)
+
diff --git a/Test/baseResults/invalidSwizzle.vert.out b/Test/baseResults/invalidSwizzle.vert.out
new file mode 100644
index 0000000..5104fdc
--- /dev/null
+++ b/Test/baseResults/invalidSwizzle.vert.out
@@ -0,0 +1,38 @@
+invalidSwizzle.vert
+ERROR: 0:7: 'rr' : does not apply to this type:  uniform sampler2D
+ERROR: 0:7: '=' :  cannot convert from ' uniform sampler2D' to ' temp 2-component vector of float'
+ERROR: 0:8: 'xx' : does not apply to this type:  global void
+ERROR: 0:9: 'xy' : does not apply to this type:  global void
+ERROR: 4 compilation errors.  No code generated.
+
+
+Shader version: 420
+ERROR: node is still EOpNull!
+0:6  Function Definition: main( ( global void)
+0:6    Function Parameters: 
+0:?     Sequence
+0:8      Function Call: f( ( global void)
+0:9      Function Call: f( ( global void)
+0:?   Linker Objects
+0:?     's' ( uniform sampler2D)
+0:?     'gl_VertexID' ( gl_VertexId int VertexId)
+0:?     'gl_InstanceID' ( gl_InstanceId int InstanceId)
+
+
+Linked vertex stage:
+
+ERROR: Linking vertex stage: No function definition (body) found: 
+    f(
+
+Shader version: 420
+ERROR: node is still EOpNull!
+0:6  Function Definition: main( ( global void)
+0:6    Function Parameters: 
+0:?     Sequence
+0:8      Function Call: f( ( global void)
+0:9      Function Call: f( ( global void)
+0:?   Linker Objects
+0:?     's' ( uniform sampler2D)
+0:?     'gl_VertexID' ( gl_VertexId int VertexId)
+0:?     'gl_InstanceID' ( gl_InstanceId int InstanceId)
+
diff --git a/Test/baseResults/lineContinuation.vert.out b/Test/baseResults/lineContinuation.vert.out
index 3dd8206..9faa420 100644
--- a/Test/baseResults/lineContinuation.vert.out
+++ b/Test/baseResults/lineContinuation.vert.out
@@ -66,7 +66,7 @@
 0:74    move second child to first child ( temp highp float)
 0:74      'funkyf' ( global highp float)
 0:75      Constant:
-0:75        12300000000000000.000000
+0:75        1.2300000000000e+16
 0:85  Sequence
 0:84    move second child to first child ( temp highp int)
 0:84      'funkyh' ( global highp int)
@@ -200,7 +200,7 @@
 0:74    move second child to first child ( temp highp float)
 0:74      'funkyf' ( global highp float)
 0:75      Constant:
-0:75        12300000000000000.000000
+0:75        1.2300000000000e+16
 0:85  Sequence
 0:84    move second child to first child ( temp highp int)
 0:84      'funkyh' ( global highp int)
diff --git a/Test/baseResults/link1.vk.frag.out b/Test/baseResults/link1.vk.frag.out
index 436f5e2..333594e 100644
--- a/Test/baseResults/link1.vk.frag.out
+++ b/Test/baseResults/link1.vk.frag.out
@@ -1,35 +1,106 @@
 link1.vk.frag
-Warning, version 450 is not yet complete; most version-specific features are present, but some are missing.
-
 Shader version: 450
 gl_FragCoord origin is upper left
 0:? Sequence
-0:7  Function Definition: main( ( global void)
-0:7    Function Parameters: 
-0:9    Sequence
-0:9      move second child to first child ( temp highp 4-component vector of float)
-0:9        'color' ( out highp 4-component vector of float)
-0:9        Function Call: getColor( ( global highp 4-component vector of float)
+0:16  Function Definition: main( ( global void)
+0:16    Function Parameters: 
+0:18    Sequence
+0:18      move second child to first child ( temp highp 4-component vector of float)
+0:18        'color' (layout( location=0) out highp 4-component vector of float)
+0:18        Function Call: getColor( ( global highp 4-component vector of float)
+0:20      move second child to first child ( temp highp int)
+0:20        direct index ( temp highp int)
+0:20          'a1' ( global unsized 9-element array of highp int)
+0:20          Constant:
+0:20            8 (const int)
+0:20        Constant:
+0:20          1 (const int)
+0:21      move second child to first child ( temp highp int)
+0:21        direct index ( temp highp int)
+0:21          'a2' ( global unsized 2-element array of highp int)
+0:21          Constant:
+0:21            1 (const int)
+0:21        Constant:
+0:21          1 (const int)
+0:22      move second child to first child ( temp highp int)
+0:22        indirect index ( temp highp int)
+0:22          'b' ( global 5-element array of highp int)
+0:22          'i' ( global highp int)
+0:22        Constant:
+0:22          1 (const int)
+0:23      move second child to first child ( temp highp int)
+0:23        direct index ( temp highp int)
+0:23          'c' ( global unsized 4-element array of highp int)
+0:23          Constant:
+0:23            3 (const int)
+0:23        Constant:
+0:23          1 (const int)
 0:?   Linker Objects
-0:?     'color' ( out highp 4-component vector of float)
+0:?     'color' (layout( location=0) out highp 4-component vector of float)
+0:?     'a1' ( global unsized 9-element array of highp int)
+0:?     'a2' ( global unsized 2-element array of highp int)
+0:?     'b' ( global 5-element array of highp int)
+0:?     'c' ( global unsized 4-element array of highp int)
+0:?     'i' ( global highp int)
+0:?     'anon@0' (layout( column_major std430) buffer block{layout( column_major std430) buffer unsized 1-element array of highp float r})
+0:?     'anon@1' (layout( column_major std430) buffer block{layout( column_major std430) buffer unsized 1-element array of highp float m})
 
 link2.vk.frag
-Warning, version 450 is not yet complete; most version-specific features are present, but some are missing.
-
 Shader version: 450
 gl_FragCoord origin is upper left
 0:? Sequence
-0:5  Function Definition: getColor( ( global highp 4-component vector of float)
-0:5    Function Parameters: 
-0:7    Sequence
-0:7      Branch: Return with expression
-0:7        texture ( global highp 4-component vector of float)
-0:7          's2D' ( uniform highp sampler2D)
-0:7          Constant:
-0:7            0.500000
-0:7            0.500000
+0:14  Function Definition: getColor( ( global highp 4-component vector of float)
+0:14    Function Parameters: 
+0:16    Sequence
+0:16      move second child to first child ( temp highp int)
+0:16        direct index ( temp highp int)
+0:16          'a1' ( global unsized 3-element array of highp int)
+0:16          Constant:
+0:16            2 (const int)
+0:16        Constant:
+0:16          1 (const int)
+0:17      move second child to first child ( temp highp int)
+0:17        direct index ( temp highp int)
+0:17          'a2' ( global unsized 10-element array of highp int)
+0:17          Constant:
+0:17            9 (const int)
+0:17        Constant:
+0:17          1 (const int)
+0:18      move second child to first child ( temp highp int)
+0:18        direct index ( temp highp int)
+0:18          'b' ( global unsized 3-element array of highp int)
+0:18          Constant:
+0:18            2 (const int)
+0:18        Constant:
+0:18          1 (const int)
+0:19      move second child to first child ( temp highp int)
+0:19        direct index ( temp highp int)
+0:19          'c' ( global 7-element array of highp int)
+0:19          Constant:
+0:19            3 (const int)
+0:19        Constant:
+0:19          1 (const int)
+0:20      move second child to first child ( temp highp int)
+0:20        indirect index ( temp highp int)
+0:20          'c' ( global 7-element array of highp int)
+0:20          'i' ( global highp int)
+0:20        Constant:
+0:20          1 (const int)
+0:22      Branch: Return with expression
+0:22        texture ( global highp 4-component vector of float)
+0:22          's2D' (layout( binding=1) uniform highp sampler2D)
+0:22          Constant:
+0:22            0.500000
+0:22            0.500000
 0:?   Linker Objects
-0:?     's2D' ( uniform highp sampler2D)
+0:?     's2D' (layout( binding=1) uniform highp sampler2D)
+0:?     'a1' ( global unsized 3-element array of highp int)
+0:?     'a2' ( global unsized 10-element array of highp int)
+0:?     'b' ( global unsized 3-element array of highp int)
+0:?     'c' ( global 7-element array of highp int)
+0:?     'i' ( global highp int)
+0:?     'anon@0' (layout( column_major std430) buffer block{layout( column_major std430) buffer unsized 1-element array of highp float r})
+0:?     'anon@1' (layout( column_major std430) buffer block{layout( column_major std430) buffer 4-element array of highp float m})
 
 
 Linked fragment stage:
@@ -38,23 +109,206 @@
 Shader version: 450
 gl_FragCoord origin is upper left
 0:? Sequence
-0:7  Function Definition: main( ( global void)
-0:7    Function Parameters: 
-0:9    Sequence
-0:9      move second child to first child ( temp highp 4-component vector of float)
-0:9        'color' ( out highp 4-component vector of float)
-0:9        Function Call: getColor( ( global highp 4-component vector of float)
-0:5  Function Definition: getColor( ( global highp 4-component vector of float)
-0:5    Function Parameters: 
-0:7    Sequence
-0:7      Branch: Return with expression
-0:7        texture ( global highp 4-component vector of float)
-0:7          's2D' ( uniform highp sampler2D)
-0:7          Constant:
-0:7            0.500000
-0:7            0.500000
+0:16  Function Definition: main( ( global void)
+0:16    Function Parameters: 
+0:18    Sequence
+0:18      move second child to first child ( temp highp 4-component vector of float)
+0:18        'color' (layout( location=0) out highp 4-component vector of float)
+0:18        Function Call: getColor( ( global highp 4-component vector of float)
+0:20      move second child to first child ( temp highp int)
+0:20        direct index ( temp highp int)
+0:20          'a1' ( global 9-element array of highp int)
+0:20          Constant:
+0:20            8 (const int)
+0:20        Constant:
+0:20          1 (const int)
+0:21      move second child to first child ( temp highp int)
+0:21        direct index ( temp highp int)
+0:21          'a2' ( global 10-element array of highp int)
+0:21          Constant:
+0:21            1 (const int)
+0:21        Constant:
+0:21          1 (const int)
+0:22      move second child to first child ( temp highp int)
+0:22        indirect index ( temp highp int)
+0:22          'b' ( global 5-element array of highp int)
+0:22          'i' ( global highp int)
+0:22        Constant:
+0:22          1 (const int)
+0:23      move second child to first child ( temp highp int)
+0:23        direct index ( temp highp int)
+0:23          'c' ( global 7-element array of highp int)
+0:23          Constant:
+0:23            3 (const int)
+0:23        Constant:
+0:23          1 (const int)
+0:14  Function Definition: getColor( ( global highp 4-component vector of float)
+0:14    Function Parameters: 
+0:16    Sequence
+0:16      move second child to first child ( temp highp int)
+0:16        direct index ( temp highp int)
+0:16          'a1' ( global 3-element array of highp int)
+0:16          Constant:
+0:16            2 (const int)
+0:16        Constant:
+0:16          1 (const int)
+0:17      move second child to first child ( temp highp int)
+0:17        direct index ( temp highp int)
+0:17          'a2' ( global 10-element array of highp int)
+0:17          Constant:
+0:17            9 (const int)
+0:17        Constant:
+0:17          1 (const int)
+0:18      move second child to first child ( temp highp int)
+0:18        direct index ( temp highp int)
+0:18          'b' ( global 3-element array of highp int)
+0:18          Constant:
+0:18            2 (const int)
+0:18        Constant:
+0:18          1 (const int)
+0:19      move second child to first child ( temp highp int)
+0:19        direct index ( temp highp int)
+0:19          'c' ( global 7-element array of highp int)
+0:19          Constant:
+0:19            3 (const int)
+0:19        Constant:
+0:19          1 (const int)
+0:20      move second child to first child ( temp highp int)
+0:20        indirect index ( temp highp int)
+0:20          'c' ( global 7-element array of highp int)
+0:20          'i' ( global highp int)
+0:20        Constant:
+0:20          1 (const int)
+0:22      Branch: Return with expression
+0:22        texture ( global highp 4-component vector of float)
+0:22          's2D' (layout( binding=1) uniform highp sampler2D)
+0:22          Constant:
+0:22            0.500000
+0:22            0.500000
 0:?   Linker Objects
-0:?     'color' ( out highp 4-component vector of float)
-0:?     's2D' ( uniform highp sampler2D)
+0:?     'color' (layout( location=0) out highp 4-component vector of float)
+0:?     'a1' ( global 9-element array of highp int)
+0:?     'a2' ( global 10-element array of highp int)
+0:?     'b' ( global 5-element array of highp int)
+0:?     'c' ( global 7-element array of highp int)
+0:?     'i' ( global highp int)
+0:?     'anon@0' (layout( column_major std430) buffer block{layout( column_major std430) buffer unsized 1-element array of highp float r})
+0:?     'anon@1' (layout( column_major std430) buffer block{layout( column_major std430) buffer 4-element array of highp float m})
+0:?     's2D' (layout( binding=1) uniform highp sampler2D)
 
-SPIR-V is not generated for failed compile or link
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 70
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 12
+                              ExecutionMode 4 OriginUpperLeft
+                              Source GLSL 450
+                              Name 4  "main"
+                              Name 9  "getColor("
+                              Name 12  "color"
+                              Name 19  "a1"
+                              Name 27  "a2"
+                              Name 32  "b"
+                              Name 33  "i"
+                              Name 39  "c"
+                              Name 53  "s2D"
+                              Name 62  "bnameRuntime"
+                              MemberName 62(bnameRuntime) 0  "r"
+                              Name 64  ""
+                              Name 67  "bnameImplicit"
+                              MemberName 67(bnameImplicit) 0  "m"
+                              Name 69  ""
+                              Decorate 12(color) Location 0
+                              Decorate 53(s2D) DescriptorSet 0
+                              Decorate 53(s2D) Binding 1
+                              Decorate 61 ArrayStride 4
+                              MemberDecorate 62(bnameRuntime) 0 Offset 0
+                              Decorate 62(bnameRuntime) BufferBlock
+                              Decorate 64 DescriptorSet 0
+                              Decorate 66 ArrayStride 4
+                              MemberDecorate 67(bnameImplicit) 0 Offset 0
+                              Decorate 67(bnameImplicit) BufferBlock
+                              Decorate 69 DescriptorSet 0
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+               8:             TypeFunction 7(fvec4)
+              11:             TypePointer Output 7(fvec4)
+       12(color):     11(ptr) Variable Output
+              14:             TypeInt 32 1
+              15:             TypeInt 32 0
+              16:     15(int) Constant 9
+              17:             TypeArray 14(int) 16
+              18:             TypePointer Private 17
+          19(a1):     18(ptr) Variable Private
+              20:     14(int) Constant 8
+              21:     14(int) Constant 1
+              22:             TypePointer Private 14(int)
+              24:     15(int) Constant 10
+              25:             TypeArray 14(int) 24
+              26:             TypePointer Private 25
+          27(a2):     26(ptr) Variable Private
+              29:     15(int) Constant 5
+              30:             TypeArray 14(int) 29
+              31:             TypePointer Private 30
+           32(b):     31(ptr) Variable Private
+           33(i):     22(ptr) Variable Private
+              36:     15(int) Constant 7
+              37:             TypeArray 14(int) 36
+              38:             TypePointer Private 37
+           39(c):     38(ptr) Variable Private
+              40:     14(int) Constant 3
+              42:     14(int) Constant 2
+              44:     14(int) Constant 9
+              50:             TypeImage 6(float) 2D sampled format:Unknown
+              51:             TypeSampledImage 50
+              52:             TypePointer UniformConstant 51
+         53(s2D):     52(ptr) Variable UniformConstant
+              55:             TypeVector 6(float) 2
+              56:    6(float) Constant 1056964608
+              57:   55(fvec2) ConstantComposite 56 56
+              61:             TypeRuntimeArray 6(float)
+62(bnameRuntime):             TypeStruct 61
+              63:             TypePointer Uniform 62(bnameRuntime)
+              64:     63(ptr) Variable Uniform
+              65:     15(int) Constant 4
+              66:             TypeArray 6(float) 65
+67(bnameImplicit):             TypeStruct 66
+              68:             TypePointer Uniform 67(bnameImplicit)
+              69:     68(ptr) Variable Uniform
+         4(main):           2 Function None 3
+               5:             Label
+              13:    7(fvec4) FunctionCall 9(getColor()
+                              Store 12(color) 13
+              23:     22(ptr) AccessChain 19(a1) 20
+                              Store 23 21
+              28:     22(ptr) AccessChain 27(a2) 21
+                              Store 28 21
+              34:     14(int) Load 33(i)
+              35:     22(ptr) AccessChain 32(b) 34
+                              Store 35 21
+              41:     22(ptr) AccessChain 39(c) 40
+                              Store 41 21
+                              Return
+                              FunctionEnd
+    9(getColor():    7(fvec4) Function None 8
+              10:             Label
+              43:     22(ptr) AccessChain 19(a1) 42
+                              Store 43 21
+              45:     22(ptr) AccessChain 27(a2) 44
+                              Store 45 21
+              46:     22(ptr) AccessChain 32(b) 42
+                              Store 46 21
+              47:     22(ptr) AccessChain 39(c) 40
+                              Store 47 21
+              48:     14(int) Load 33(i)
+              49:     22(ptr) AccessChain 39(c) 48
+                              Store 49 21
+              54:          51 Load 53(s2D)
+              58:    7(fvec4) ImageSampleImplicitLod 54 57
+                              ReturnValue 58
+                              FunctionEnd
diff --git a/Test/baseResults/matrix2.frag.out b/Test/baseResults/matrix2.frag.out
index 880f75a..3e3b3f0 100644
--- a/Test/baseResults/matrix2.frag.out
+++ b/Test/baseResults/matrix2.frag.out
@@ -158,6 +158,9 @@
 0:49            'FragColor' ( out 4-component vector of float)
 0:49            Constant:
 0:49              3 (const int)
+0:50      matrix mult second child into first child ( temp 3X4 matrix of float)
+0:50        'm34' ( temp 3X4 matrix of float)
+0:50        'colorTransform' ( uniform 3X3 matrix of float)
 0:?   Linker Objects
 0:?     'colorTransform' ( uniform 3X3 matrix of float)
 0:?     'Color' ( smooth in 3-component vector of float)
@@ -331,6 +334,9 @@
 0:49            'FragColor' ( out 4-component vector of float)
 0:49            Constant:
 0:49              3 (const int)
+0:50      matrix mult second child into first child ( temp 3X4 matrix of float)
+0:50        'm34' ( temp 3X4 matrix of float)
+0:50        'colorTransform' ( uniform 3X3 matrix of float)
 0:?   Linker Objects
 0:?     'colorTransform' ( uniform 3X3 matrix of float)
 0:?     'Color' ( smooth in 3-component vector of float)
diff --git a/Test/baseResults/matrixError.vert.out b/Test/baseResults/matrixError.vert.out
index f818892..0a0d1e4 100644
--- a/Test/baseResults/matrixError.vert.out
+++ b/Test/baseResults/matrixError.vert.out
@@ -6,7 +6,9 @@
 ERROR: 0:19: 'xy' : does not apply to this type:  temp 2X3 matrix of float
 ERROR: 0:21: '[' :  matrix index out of range '2'
 ERROR: 0:21: '[' :  vector index out of range '4'
-ERROR: 7 compilation errors.  No code generated.
+ERROR: 0:22: 'assign' :  cannot convert from ' temp 2X3 matrix of float' to ' temp 2X3 matrix of float'
+ERROR: 0:23: 'assign' :  cannot convert from ' uniform 3X2 matrix of float' to ' temp 2X3 matrix of float'
+ERROR: 9 compilation errors.  No code generated.
 
 
 Shader version: 120
@@ -32,6 +34,8 @@
 0:21                2 (const int)
 0:21            Constant:
 0:21              4 (const int)
+0:22      'm23' ( temp 2X3 matrix of float)
+0:23      'm23' ( temp 2X3 matrix of float)
 0:?   Linker Objects
 0:?     'v3' ( in 3-component vector of float)
 0:?     'm32' ( uniform 3X2 matrix of float)
@@ -64,6 +68,8 @@
 0:21                2 (const int)
 0:21            Constant:
 0:21              4 (const int)
+0:22      'm23' ( temp 2X3 matrix of float)
+0:23      'm23' ( temp 2X3 matrix of float)
 0:?   Linker Objects
 0:?     'v3' ( in 3-component vector of float)
 0:?     'm32' ( uniform 3X2 matrix of float)
diff --git a/Test/baseResults/missingBodies.vert.out b/Test/baseResults/missingBodies.vert.out
old mode 100755
new mode 100644
index 7760c3f..3a9a99f
--- a/Test/baseResults/missingBodies.vert.out
+++ b/Test/baseResults/missingBodies.vert.out
@@ -1,6 +1,4 @@
 missingBodies.vert
-Warning, version 450 is not yet complete; most version-specific features are present, but some are missing.
-
 Shader version: 450
 0:? Sequence
 0:4  Function Definition: foo( ( global void)
diff --git a/Test/baseResults/mixedArrayDecls.frag.out b/Test/baseResults/mixedArrayDecls.frag.out
new file mode 100644
index 0000000..598b828
--- /dev/null
+++ b/Test/baseResults/mixedArrayDecls.frag.out
@@ -0,0 +1,68 @@
+mixedArrayDecls.frag
+ERROR: 0:30: '' :  syntax error, unexpected LEFT_PAREN, expecting COMMA or SEMICOLON
+ERROR: 1 compilation errors.  No code generated.
+
+
+Shader version: 450
+ERROR: node is still EOpNull!
+0:16  Function Definition: foo(i1[14][15][6]; ( global 14-element array of 15-element array of 6-element array of int)
+0:16    Function Parameters: 
+0:16      'p' ( in 14-element array of 15-element array of 6-element array of int)
+0:16    Sequence
+0:16      Branch: Return with expression
+0:16        'p' ( in 14-element array of 15-element array of 6-element array of int)
+0:18  Function Definition: main( ( global void)
+0:18    Function Parameters: 
+0:20    Sequence
+0:20      direct index ( temp 14-element array of int)
+0:20        'g' ( global unsized 4-element array of 14-element array of int)
+0:20        Constant:
+0:20          3 (const int)
+0:21      direct index ( temp 14-element array of int)
+0:21        'h' ( global unsized 3-element array of 14-element array of int)
+0:21        Constant:
+0:21          2 (const int)
+0:24  Function Definition: bar( ( global 4-element array of 3-element array of 2-element array of float)
+0:24    Function Parameters: 
+0:?     Sequence
+0:24      Branch: Return with expression
+0:24        'a' ( temp 4-element array of 3-element array of 2-element array of float)
+0:?   Linker Objects
+0:?     's' ( global structure{ global 2-element array of 3-element array of int a,  global 5-element array of 3-element array of int b})
+0:?     'c' ( global 4-element array of 5-element array of int)
+0:?     'd' ( global 8-element array of 5-element array of int)
+0:?     'e' ( global 11-element array of 9-element array of int)
+0:?     'f' ( global 13-element array of 9-element array of int)
+0:?     'g' ( global unsized 4-element array of 14-element array of int)
+0:?     'h' ( global unsized 3-element array of 14-element array of int)
+0:?     'inbinst' ( in 4-element array of 5-element array of 6-element array of block{ in 8-element array of 9-element array of 7-element array of float f})
+0:?     'barm' ( global 4-element array of 3-element array of 2-element array of float)
+
+
+Linked fragment stage:
+
+
+Shader version: 450
+ERROR: node is still EOpNull!
+0:18  Function Definition: main( ( global void)
+0:18    Function Parameters: 
+0:20    Sequence
+0:20      direct index ( temp 14-element array of int)
+0:20        'g' ( global 4-element array of 14-element array of int)
+0:20        Constant:
+0:20          3 (const int)
+0:21      direct index ( temp 14-element array of int)
+0:21        'h' ( global 3-element array of 14-element array of int)
+0:21        Constant:
+0:21          2 (const int)
+0:?   Linker Objects
+0:?     's' ( global structure{ global 2-element array of 3-element array of int a,  global 5-element array of 3-element array of int b})
+0:?     'c' ( global 4-element array of 5-element array of int)
+0:?     'd' ( global 8-element array of 5-element array of int)
+0:?     'e' ( global 11-element array of 9-element array of int)
+0:?     'f' ( global 13-element array of 9-element array of int)
+0:?     'g' ( global 4-element array of 14-element array of int)
+0:?     'h' ( global 3-element array of 14-element array of int)
+0:?     'inbinst' ( in 4-element array of 5-element array of 6-element array of block{ in 8-element array of 9-element array of 7-element array of float f})
+0:?     'barm' ( global 4-element array of 3-element array of 2-element array of float)
+
diff --git a/Test/baseResults/negativeArraySize.comp.out b/Test/baseResults/negativeArraySize.comp.out
index abdd51e..0a5ba31 100644
--- a/Test/baseResults/negativeArraySize.comp.out
+++ b/Test/baseResults/negativeArraySize.comp.out
@@ -1,5 +1,4 @@
 negativeArraySize.comp
-Warning, version 310 is not yet complete; most version-specific features are present, but some are missing.
 ERROR: 0:9: '' : array size must be a positive integer 
 ERROR: 1 compilation errors.  No code generated.
 
diff --git a/Test/baseResults/newTexture.frag.out b/Test/baseResults/newTexture.frag.out
index 3a1c7a2..52921e8 100644
--- a/Test/baseResults/newTexture.frag.out
+++ b/Test/baseResults/newTexture.frag.out
@@ -1,6 +1,4 @@
 newTexture.frag
-Warning, version 430 is not yet complete; most version-specific features are present, but some are missing.
-
 Shader version: 430
 0:? Sequence
 0:36  Function Definition: main( ( global void)
diff --git a/Test/baseResults/nonVulkan.frag.out b/Test/baseResults/nonVulkan.frag.out
index 236f5a8..2b8b6a0 100644
--- a/Test/baseResults/nonVulkan.frag.out
+++ b/Test/baseResults/nonVulkan.frag.out
@@ -1,5 +1,4 @@
 nonVulkan.frag
-Warning, version 450 is not yet complete; most version-specific features are present, but some are missing.
 ERROR: 0:3: 'constant_id' : only allowed when generating SPIR-V 
 ERROR: 0:4: 'input_attachment_index' : only allowed when using GLSL for Vulkan 
 ERROR: 0:4: 'input_attachment_index' : can only be used with a subpass 
diff --git a/Test/baseResults/nonuniform.frag.out b/Test/baseResults/nonuniform.frag.out
new file mode 100644
index 0000000..2d4e9b0
--- /dev/null
+++ b/Test/baseResults/nonuniform.frag.out
@@ -0,0 +1,92 @@
+nonuniform.frag
+ERROR: 0:10: 'nonuniformEXT' : for non-parameter, can only apply to 'in' or no storage qualifier 
+ERROR: 0:11: 'nonuniformEXT' : for non-parameter, can only apply to 'in' or no storage qualifier 
+ERROR: 0:12: 'nonuniformEXT' : for non-parameter, can only apply to 'in' or no storage qualifier 
+ERROR: 0:22: 'nonuniformEXT' : for non-parameter, can only apply to 'in' or no storage qualifier 
+ERROR: 0:28: 'constructor' : too many arguments 
+ERROR: 0:28: 'assign' :  cannot convert from ' const float' to ' nonuniform temp int'
+ERROR: 0:29: 'constructor' : not enough data provided for construction 
+ERROR: 0:29: 'assign' :  cannot convert from ' const float' to ' nonuniform temp int'
+ERROR: 0:32: 'nonuniformEXT' : not allowed on block or structure members 
+ERROR: 0:33: 'nonuniformEXT' : not allowed on block or structure members 
+ERROR: 10 compilation errors.  No code generated.
+
+
+Shader version: 450
+Requested GL_EXT_nonuniform_qualifier
+ERROR: node is still EOpNull!
+0:14  Function Definition: foo(i1;i1; ( nonuniform temp int)
+0:14    Function Parameters: 
+0:14      'nupi' ( nonuniform in int)
+0:14      'f' ( nonuniform out int)
+0:16    Sequence
+0:16      Branch: Return with expression
+0:16        'nupi' ( nonuniform in int)
+0:19  Function Definition: main( ( global void)
+0:19    Function Parameters: 
+0:?     Sequence
+0:24      Function Call: foo(i1;i1; ( nonuniform temp int)
+0:24        'nu_li' ( nonuniform temp int)
+0:24        'nu_li' ( nonuniform temp int)
+0:27      move second child to first child ( temp int)
+0:27        'nu_li' ( nonuniform temp int)
+0:27        add ( nonuniform temp int)
+0:27          'a' ( nonuniform temp int)
+0:27          component-wise multiply ( nonuniform temp int)
+0:27            'a' ( temp int)
+0:27            Constant:
+0:27              2 (const int)
+0:28      'nu_li' ( nonuniform temp int)
+0:29      'nu_li' ( nonuniform temp int)
+0:?   Linker Objects
+0:?     'nonuniformEXT' ( global int)
+0:?     'nu_inv4' ( smooth nonuniform in 4-component vector of float)
+0:?     'nu_gf' ( nonuniform temp float)
+0:?     'nu_outv4' ( nonuniform out 4-component vector of float)
+0:?     'nu_uv4' ( nonuniform uniform 4-component vector of float)
+0:?     'nu_constf' ( nonuniform const float)
+0:?       1.000000
+0:?     'ins' (layout( location=1) smooth in structure{ global float a,  temp float b})
+0:?     'inb' (layout( location=3) in block{ in float a,  in float b})
+
+
+Linked fragment stage:
+
+
+Shader version: 450
+Requested GL_EXT_nonuniform_qualifier
+ERROR: node is still EOpNull!
+0:14  Function Definition: foo(i1;i1; ( nonuniform temp int)
+0:14    Function Parameters: 
+0:14      'nupi' ( nonuniform in int)
+0:14      'f' ( nonuniform out int)
+0:16    Sequence
+0:16      Branch: Return with expression
+0:16        'nupi' ( nonuniform in int)
+0:19  Function Definition: main( ( global void)
+0:19    Function Parameters: 
+0:?     Sequence
+0:24      Function Call: foo(i1;i1; ( nonuniform temp int)
+0:24        'nu_li' ( nonuniform temp int)
+0:24        'nu_li' ( nonuniform temp int)
+0:27      move second child to first child ( temp int)
+0:27        'nu_li' ( nonuniform temp int)
+0:27        add ( nonuniform temp int)
+0:27          'a' ( nonuniform temp int)
+0:27          component-wise multiply ( nonuniform temp int)
+0:27            'a' ( temp int)
+0:27            Constant:
+0:27              2 (const int)
+0:28      'nu_li' ( nonuniform temp int)
+0:29      'nu_li' ( nonuniform temp int)
+0:?   Linker Objects
+0:?     'nonuniformEXT' ( global int)
+0:?     'nu_inv4' ( smooth nonuniform in 4-component vector of float)
+0:?     'nu_gf' ( nonuniform temp float)
+0:?     'nu_outv4' ( nonuniform out 4-component vector of float)
+0:?     'nu_uv4' ( nonuniform uniform 4-component vector of float)
+0:?     'nu_constf' ( nonuniform const float)
+0:?       1.000000
+0:?     'ins' (layout( location=1) smooth in structure{ global float a,  temp float b})
+0:?     'inb' (layout( location=3) in block{ in float a,  in float b})
+
diff --git a/Test/baseResults/numeral.frag.out b/Test/baseResults/numeral.frag.out
index 22f4a94..b7c0a78 100644
--- a/Test/baseResults/numeral.frag.out
+++ b/Test/baseResults/numeral.frag.out
@@ -1,5 +1,4 @@
 numeral.frag
-Warning, version 400 is not yet complete; most version-specific features are present, but some are missing.
 ERROR: 0:14: '' : octal literal digit too large 
 ERROR: 0:15: '' : octal literal digit too large 
 ERROR: 0:16: '' : octal literal digit too large 
@@ -12,7 +11,9 @@
 ERROR: 0:88: '' : float literal needs a decimal point or exponent 
 ERROR: 0:98: '' : numeric literal too big 
 ERROR: 0:101: '' : numeric literal too big 
-ERROR: 12 compilation errors.  No code generated.
+ERROR: 0:104: '#' : preprocessor directive cannot be preceded by another token 
+ERROR: 0:104: '' :  syntax error, unexpected $end, expecting COMMA or SEMICOLON
+ERROR: 14 compilation errors.  No code generated.
 
 
 Shader version: 400
@@ -84,12 +85,12 @@
 0:17        move second child to first child ( temp int)
 0:17          'obig' ( temp int)
 0:17          Constant:
-0:17            995208915 (const int)
+0:17            -1662398820 (const int)
 0:18      Sequence
 0:18        move second child to first child ( temp int)
 0:18          'omax1' ( temp int)
 0:18          Constant:
-0:18            536870912 (const int)
+0:18            0 (const int)
 0:20      Sequence
 0:20        move second child to first child ( temp uint)
 0:20          'uo5' ( temp uint)
@@ -224,7 +225,7 @@
 0:50        move second child to first child ( temp int)
 0:50          'hbig' ( temp int)
 0:50          Constant:
-0:50            -1 (const int)
+0:50            -15 (const int)
 0:52      Sequence
 0:52        move second child to first child ( temp float)
 0:52          'f1' ( temp float)
@@ -329,7 +330,7 @@
 0:73        move second child to first child ( temp float)
 0:73          'g6' ( temp float)
 0:73          Constant:
-0:73            0.000005
+0:73            5.0000000000000e-06
 0:74      Sequence
 0:74        move second child to first child ( temp float)
 0:74          'g7' ( temp float)
@@ -418,6 +419,7 @@
 0:?     'g4' ( global int)
 0:?     'g5' ( global int)
 0:?     'g6' ( global int)
+0:?     'inf1' ( global float)
 
 
 Linked fragment stage:
@@ -492,12 +494,12 @@
 0:17        move second child to first child ( temp int)
 0:17          'obig' ( temp int)
 0:17          Constant:
-0:17            995208915 (const int)
+0:17            -1662398820 (const int)
 0:18      Sequence
 0:18        move second child to first child ( temp int)
 0:18          'omax1' ( temp int)
 0:18          Constant:
-0:18            536870912 (const int)
+0:18            0 (const int)
 0:20      Sequence
 0:20        move second child to first child ( temp uint)
 0:20          'uo5' ( temp uint)
@@ -632,7 +634,7 @@
 0:50        move second child to first child ( temp int)
 0:50          'hbig' ( temp int)
 0:50          Constant:
-0:50            -1 (const int)
+0:50            -15 (const int)
 0:52      Sequence
 0:52        move second child to first child ( temp float)
 0:52          'f1' ( temp float)
@@ -737,7 +739,7 @@
 0:73        move second child to first child ( temp float)
 0:73          'g6' ( temp float)
 0:73          Constant:
-0:73            0.000005
+0:73            5.0000000000000e-06
 0:74      Sequence
 0:74        move second child to first child ( temp float)
 0:74          'g7' ( temp float)
@@ -826,4 +828,5 @@
 0:?     'g4' ( global int)
 0:?     'g5' ( global int)
 0:?     'g6' ( global int)
+0:?     'inf1' ( global float)
 
diff --git a/Test/baseResults/nvShaderNoperspectiveInterpolation.frag.out b/Test/baseResults/nvShaderNoperspectiveInterpolation.frag.out
new file mode 100644
index 0000000..ae004c6
--- /dev/null
+++ b/Test/baseResults/nvShaderNoperspectiveInterpolation.frag.out
@@ -0,0 +1,38 @@
+nvShaderNoperspectiveInterpolation.frag
+ERROR: 0:5: 'noperspective' : Reserved word. 
+ERROR: 0:5: 'noperspective' : not supported for this version or the enabled extensions 
+ERROR: 2 compilation errors.  No code generated.
+
+
+Shader version: 300
+Requested GL_NV_shader_noperspective_interpolation
+ERROR: node is still EOpNull!
+0:13  Function Definition: main( ( global void)
+0:13    Function Parameters: 
+0:14    Sequence
+0:14      move second child to first child ( temp mediump 4-component vector of float)
+0:14        'fragColor' ( out mediump 4-component vector of float)
+0:14        'color' ( noperspective in mediump 4-component vector of float)
+0:?   Linker Objects
+0:?     'bad' ( noperspective in mediump 4-component vector of float)
+0:?     'color' ( noperspective in mediump 4-component vector of float)
+0:?     'fragColor' ( out mediump 4-component vector of float)
+
+
+Linked fragment stage:
+
+
+Shader version: 300
+Requested GL_NV_shader_noperspective_interpolation
+ERROR: node is still EOpNull!
+0:13  Function Definition: main( ( global void)
+0:13    Function Parameters: 
+0:14    Sequence
+0:14      move second child to first child ( temp mediump 4-component vector of float)
+0:14        'fragColor' ( out mediump 4-component vector of float)
+0:14        'color' ( noperspective in mediump 4-component vector of float)
+0:?   Linker Objects
+0:?     'bad' ( noperspective in mediump 4-component vector of float)
+0:?     'color' ( noperspective in mediump 4-component vector of float)
+0:?     'fragColor' ( out mediump 4-component vector of float)
+
diff --git a/Test/baseResults/overlongLiteral.frag.out b/Test/baseResults/overlongLiteral.frag.out
new file mode 100644
index 0000000..372d777
--- /dev/null
+++ b/Test/baseResults/overlongLiteral.frag.out
@@ -0,0 +1,19 @@
+overlongLiteral.frag
+ERROR: 0:1: '' : hexadecimal literal too long 
+ERROR: 0:1: '' :  syntax error, unexpected INTCONSTANT
+ERROR: 2 compilation errors.  No code generated.
+
+
+Shader version: 100
+ERROR: node is still EOpNull!
+0:?   Linker Objects
+
+
+Linked fragment stage:
+
+ERROR: Linking fragment stage: Missing entry point: Each stage requires one entry point
+
+Shader version: 100
+ERROR: node is still EOpNull!
+0:?   Linker Objects
+
diff --git a/Test/baseResults/precise.tesc.out b/Test/baseResults/precise.tesc.out
index 7beff89..abe56f7 100644
--- a/Test/baseResults/precise.tesc.out
+++ b/Test/baseResults/precise.tesc.out
@@ -1,6 +1,4 @@
 precise.tesc
-Warning, version 450 is not yet complete; most version-specific features are present, but some are missing.
-
 Shader version: 450
 Requested GL_EXT_gpu_shader5
 Requested GL_EXT_shader_io_blocks
diff --git a/Test/baseResults/precise_struct_block.vert.out b/Test/baseResults/precise_struct_block.vert.out
index 638bd1b..a239e95 100644
--- a/Test/baseResults/precise_struct_block.vert.out
+++ b/Test/baseResults/precise_struct_block.vert.out
@@ -1,6 +1,4 @@
 precise_struct_block.vert
-Warning, version 450 is not yet complete; most version-specific features are present, but some are missing.
-
 Shader version: 450
 0:? Sequence
 0:11  Function Definition: struct_member( ( global float)
diff --git a/Test/baseResults/preprocessor.bad_arg.vert.err b/Test/baseResults/preprocessor.bad_arg.vert.err
new file mode 100644
index 0000000..ae970a0
--- /dev/null
+++ b/Test/baseResults/preprocessor.bad_arg.vert.err
@@ -0,0 +1,4 @@
+ERROR: 0:8: 'macro expansion' : End of input in macro EXP2
+ERROR: 1 compilation errors.  No code generated.
+
+
diff --git a/Test/baseResults/preprocessor.bad_arg.vert.out b/Test/baseResults/preprocessor.bad_arg.vert.out
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/Test/baseResults/preprocessor.bad_arg.vert.out
diff --git a/Test/baseResults/preprocessor.edge_cases.vert.err b/Test/baseResults/preprocessor.edge_cases.vert.err
index 5f177e6..e69de29 100644
--- a/Test/baseResults/preprocessor.edge_cases.vert.err
+++ b/Test/baseResults/preprocessor.edge_cases.vert.err
@@ -1,2 +0,0 @@
-Warning, version 310 is not yet complete; most version-specific features are present, but some are missing.
-
diff --git a/Test/baseResults/preprocessor.errors.vert.err b/Test/baseResults/preprocessor.errors.vert.err
index cfde404..bc58895 100644
--- a/Test/baseResults/preprocessor.errors.vert.err
+++ b/Test/baseResults/preprocessor.errors.vert.err
@@ -1,4 +1,3 @@
-Warning, version 310 is not yet complete; most version-specific features are present, but some are missing.
 ERROR: 0:9: '#error' : This should show up in pp output .  
 ERROR: 0:14: '#' : invalid directive: def
 ERROR: 0:15: 'preprocessor evaluation' : undefined macro in expression not allowed in es profile Y
diff --git a/Test/baseResults/preprocessor.extensions.vert.err b/Test/baseResults/preprocessor.extensions.vert.err
index 925cc0c..35db303 100644
--- a/Test/baseResults/preprocessor.extensions.vert.err
+++ b/Test/baseResults/preprocessor.extensions.vert.err
@@ -1,3 +1,2 @@
-Warning, version 310 is not yet complete; most version-specific features are present, but some are missing.
 WARNING: 0:6: '#extension' : extension not supported: GL_EXT_shader_texture_image_samples
 
diff --git a/Test/baseResults/preprocessor.function_macro.vert.err b/Test/baseResults/preprocessor.function_macro.vert.err
index 5f177e6..e69de29 100644
--- a/Test/baseResults/preprocessor.function_macro.vert.err
+++ b/Test/baseResults/preprocessor.function_macro.vert.err
@@ -1,2 +0,0 @@
-Warning, version 310 is not yet complete; most version-specific features are present, but some are missing.
-
diff --git a/Test/baseResults/preprocessor.line.frag.err b/Test/baseResults/preprocessor.line.frag.err
index 5f177e6..e69de29 100644
--- a/Test/baseResults/preprocessor.line.frag.err
+++ b/Test/baseResults/preprocessor.line.frag.err
@@ -1,2 +0,0 @@
-Warning, version 310 is not yet complete; most version-specific features are present, but some are missing.
-
diff --git a/Test/baseResults/preprocessor.pragma.vert.err b/Test/baseResults/preprocessor.pragma.vert.err
index 5f177e6..da435db 100644
--- a/Test/baseResults/preprocessor.pragma.vert.err
+++ b/Test/baseResults/preprocessor.pragma.vert.err
@@ -1,2 +1,2 @@
-Warning, version 310 is not yet complete; most version-specific features are present, but some are missing.
+WARNING: 0:10: '#pragma once' : not implemented 
 
diff --git a/Test/baseResults/preprocessor.pragma.vert.out b/Test/baseResults/preprocessor.pragma.vert.out
index 8c52814..ebe1e4a 100644
--- a/Test/baseResults/preprocessor.pragma.vert.out
+++ b/Test/baseResults/preprocessor.pragma.vert.out
@@ -7,6 +7,8 @@
 
 #pragma undefined_pragma(x,4)
 
+#pragma once
+
 int main(){
 }
 
diff --git a/Test/baseResults/preprocessor.simple.vert.err b/Test/baseResults/preprocessor.simple.vert.err
index 5f177e6..e69de29 100644
--- a/Test/baseResults/preprocessor.simple.vert.err
+++ b/Test/baseResults/preprocessor.simple.vert.err
@@ -1,2 +0,0 @@
-Warning, version 310 is not yet complete; most version-specific features are present, but some are missing.
-
diff --git a/Test/baseResults/preprocessor.simple.vert.out b/Test/baseResults/preprocessor.simple.vert.out
index 8cbabda..57b020c 100644
--- a/Test/baseResults/preprocessor.simple.vert.out
+++ b/Test/baseResults/preprocessor.simple.vert.out
@@ -25,6 +25,42 @@
   == !=
   & ^ | && ^^ || ? :
   += -= *= /= %= <<= >>= &= |= ^=
-  1.2 2E10 5u - 5 lf
+  1.2 2E10 5u - 5l f
+}
+
+struct S {
+    int member1;
+    float member2;
+    vec4 member3;
+};
+
+
+
+
+
+
+
+
+
+
+
+
+
+void foo()
+{
+    S s;
+    s . member2 + s . member1;
+    s . member3 . zyx;
+    s . member2 . xxyz;
+    s . member2 . yyz;
+    s . member2 . xxyz();
+    s . member2 . yzy;
+            vec3 a = vec3(0);vec3 b = a . zxyz;vec3 b = a . xxyz;vec3 b = a . yyz;vec3 b = a . xxyz();vec3 b = a . yzy;vec3 b = a . z;
+
+
+     yyz;
+    yzy
+
+
 }
 
diff --git a/Test/baseResults/reflection.vert.out b/Test/baseResults/reflection.vert.out
index ba3e0e6..52e16e6 100644
--- a/Test/baseResults/reflection.vert.out
+++ b/Test/baseResults/reflection.vert.out
@@ -1,100 +1,107 @@
 reflection.vert
-Warning, version 440 is not yet complete; most version-specific features are present, but some are missing.
-
 Uniform reflection:
-image_ui2D: offset -1, type 9063, size 1, index -1, binding -1
-sampler_2D: offset -1, type 8b5e, size 1, index -1, binding -1
-sampler_2DMSArray: offset -1, type 910b, size 1, index -1, binding -1
-anonMember3: offset 80, type 8b52, size 1, index 0, binding -1
-s.a: offset -1, type 1404, size 1, index -1, binding -1
-named.scalar: offset 12, type 1404, size 1, index 1, binding -1
-m23: offset 16, type 8b67, size 1, index 0, binding -1
-scalarAfterm23: offset 48, type 1404, size 1, index 0, binding -1
-c_m23: offset 16, type 8b67, size 1, index 2, binding -1
-c_scalarAfterm23: offset 64, type 1404, size 1, index 2, binding -1
-scalarBeforeArray: offset 96, type 1404, size 1, index 0, binding -1
-floatArray: offset 112, type 1406, size 5, index 0, binding -1
-scalarAfterArray: offset 192, type 1404, size 1, index 0, binding -1
-named.memvec2: offset 48, type 8b50, size 1, index 1, binding -1
-named.memf1: offset 56, type 1406, size 1, index 1, binding -1
-named.memf2: offset 60, type 8b56, size 1, index 1, binding -1
-named.memf3: offset 64, type 1404, size 1, index 1, binding -1
-named.memvec2a: offset 72, type 8b50, size 1, index 1, binding -1
-named.m22: offset 80, type 8b5a, size 7, index 1, binding -1
-dm22: offset -1, type 8b5a, size 4, index -1, binding -1
-m22: offset 208, type 8b5a, size 3, index 0, binding -1
-nested.foo.n1.a: offset 0, type 1406, size 1, index 3, binding -1
-nested.foo.n2.b: offset 16, type 1406, size 1, index 3, binding -1
-nested.foo.n2.c: offset 20, type 1406, size 1, index 3, binding -1
-nested.foo.n2.d: offset 24, type 1406, size 1, index 3, binding -1
-deepA[0].d2.d1[2].va: offset -1, type 8b50, size 2, index -1, binding -1
-deepA[1].d2.d1[2].va: offset -1, type 8b50, size 2, index -1, binding -1
-deepB[1].d2.d1[0].va: offset -1, type 8b50, size 2, index -1, binding -1
-deepB[1].d2.d1[1].va: offset -1, type 8b50, size 2, index -1, binding -1
-deepB[1].d2.d1[2].va: offset -1, type 8b50, size 2, index -1, binding -1
-deepB[1].d2.d1[3].va: offset -1, type 8b50, size 2, index -1, binding -1
-deepB[0].d2.d1[0].va: offset -1, type 8b50, size 2, index -1, binding -1
-deepB[0].d2.d1[1].va: offset -1, type 8b50, size 2, index -1, binding -1
-deepB[0].d2.d1[2].va: offset -1, type 8b50, size 2, index -1, binding -1
-deepB[0].d2.d1[3].va: offset -1, type 8b50, size 2, index -1, binding -1
-deepC[1].iv4: offset -1, type 8b52, size 1, index -1, binding -1
-deepC[1].d2.i: offset -1, type 1404, size 1, index -1, binding -1
-deepC[1].d2.d1[0].va: offset -1, type 8b50, size 3, index -1, binding -1
-deepC[1].d2.d1[0].b: offset -1, type 8b56, size 1, index -1, binding -1
-deepC[1].d2.d1[1].va: offset -1, type 8b50, size 3, index -1, binding -1
-deepC[1].d2.d1[1].b: offset -1, type 8b56, size 1, index -1, binding -1
-deepC[1].d2.d1[2].va: offset -1, type 8b50, size 3, index -1, binding -1
-deepC[1].d2.d1[2].b: offset -1, type 8b56, size 1, index -1, binding -1
-deepC[1].d2.d1[3].va: offset -1, type 8b50, size 3, index -1, binding -1
-deepC[1].d2.d1[3].b: offset -1, type 8b56, size 1, index -1, binding -1
-deepC[1].v3: offset -1, type 8b54, size 1, index -1, binding -1
-deepD[0].iv4: offset -1, type 8b52, size 1, index -1, binding -1
-deepD[0].d2.i: offset -1, type 1404, size 1, index -1, binding -1
-deepD[0].d2.d1[0].va: offset -1, type 8b50, size 3, index -1, binding -1
-deepD[0].d2.d1[0].b: offset -1, type 8b56, size 1, index -1, binding -1
-deepD[0].d2.d1[1].va: offset -1, type 8b50, size 3, index -1, binding -1
-deepD[0].d2.d1[1].b: offset -1, type 8b56, size 1, index -1, binding -1
-deepD[0].d2.d1[2].va: offset -1, type 8b50, size 3, index -1, binding -1
-deepD[0].d2.d1[2].b: offset -1, type 8b56, size 1, index -1, binding -1
-deepD[0].d2.d1[3].va: offset -1, type 8b50, size 3, index -1, binding -1
-deepD[0].d2.d1[3].b: offset -1, type 8b56, size 1, index -1, binding -1
-deepD[0].v3: offset -1, type 8b54, size 1, index -1, binding -1
-deepD[1].iv4: offset -1, type 8b52, size 1, index -1, binding -1
-deepD[1].d2.i: offset -1, type 1404, size 1, index -1, binding -1
-deepD[1].d2.d1[0].va: offset -1, type 8b50, size 3, index -1, binding -1
-deepD[1].d2.d1[0].b: offset -1, type 8b56, size 1, index -1, binding -1
-deepD[1].d2.d1[1].va: offset -1, type 8b50, size 3, index -1, binding -1
-deepD[1].d2.d1[1].b: offset -1, type 8b56, size 1, index -1, binding -1
-deepD[1].d2.d1[2].va: offset -1, type 8b50, size 3, index -1, binding -1
-deepD[1].d2.d1[2].b: offset -1, type 8b56, size 1, index -1, binding -1
-deepD[1].d2.d1[3].va: offset -1, type 8b50, size 3, index -1, binding -1
-deepD[1].d2.d1[3].b: offset -1, type 8b56, size 1, index -1, binding -1
-deepD[1].v3: offset -1, type 8b54, size 1, index -1, binding -1
-abl.foo: offset 0, type 1406, size 1, index 7, binding -1
-abl2.foo: offset 0, type 1406, size 1, index 11, binding -1
-anonMember1: offset 0, type 8b51, size 1, index 0, binding -1
-uf1: offset -1, type 1406, size 1, index -1, binding -1
-uf2: offset -1, type 1406, size 1, index -1, binding -1
-named.member3: offset 32, type 8b52, size 1, index 1, binding -1
+image_ui2D: offset -1, type 9063, size 1, index -1, binding -1, stages 1
+sampler_2D: offset -1, type 8b5e, size 1, index -1, binding -1, stages 1
+sampler_2DMSArray: offset -1, type 910b, size 1, index -1, binding -1, stages 1
+anonMember3: offset 80, type 8b52, size 1, index 0, binding -1, stages 1
+s.a: offset -1, type 1404, size 1, index -1, binding -1, stages 1
+named.scalar: offset 12, type 1404, size 1, index 1, binding -1, stages 1
+m23: offset 16, type 8b67, size 1, index 0, binding -1, stages 1
+scalarAfterm23: offset 48, type 1404, size 1, index 0, binding -1, stages 1
+c_m23: offset 16, type 8b67, size 1, index 2, binding -1, stages 1
+c_scalarAfterm23: offset 64, type 1404, size 1, index 2, binding -1, stages 1
+scalarBeforeArray: offset 96, type 1404, size 1, index 0, binding -1, stages 1
+floatArray: offset 112, type 1406, size 5, index 0, binding -1, stages 1
+scalarAfterArray: offset 192, type 1404, size 1, index 0, binding -1, stages 1
+named.memvec2: offset 48, type 8b50, size 1, index 1, binding -1, stages 1
+named.memf1: offset 56, type 1406, size 1, index 1, binding -1, stages 1
+named.memf2: offset 60, type 8b56, size 1, index 1, binding -1, stages 1
+named.memf3: offset 64, type 1404, size 1, index 1, binding -1, stages 1
+named.memvec2a: offset 72, type 8b50, size 1, index 1, binding -1, stages 1
+named.m22: offset 80, type 8b5a, size 7, index 1, binding -1, stages 1
+dm22: offset -1, type 8b5a, size 4, index -1, binding -1, stages 1
+m22: offset 208, type 8b5a, size 3, index 0, binding -1, stages 1
+nested.foo.n1.a: offset 0, type 1406, size 1, index 3, binding -1, stages 1
+nested.foo.n2.b: offset 16, type 1406, size 1, index 3, binding -1, stages 1
+nested.foo.n2.c: offset 20, type 1406, size 1, index 3, binding -1, stages 1
+nested.foo.n2.d: offset 24, type 1406, size 1, index 3, binding -1, stages 1
+deepA[0].d2.d1[2].va: offset -1, type 8b50, size 2, index -1, binding -1, stages 1
+deepA[1].d2.d1[2].va: offset -1, type 8b50, size 2, index -1, binding -1, stages 1
+deepB[1].d2.d1[0].va: offset -1, type 8b50, size 2, index -1, binding -1, stages 1
+deepB[1].d2.d1[1].va: offset -1, type 8b50, size 2, index -1, binding -1, stages 1
+deepB[1].d2.d1[2].va: offset -1, type 8b50, size 2, index -1, binding -1, stages 1
+deepB[1].d2.d1[3].va: offset -1, type 8b50, size 2, index -1, binding -1, stages 1
+deepB[0].d2.d1[0].va: offset -1, type 8b50, size 2, index -1, binding -1, stages 1
+deepB[0].d2.d1[1].va: offset -1, type 8b50, size 2, index -1, binding -1, stages 1
+deepB[0].d2.d1[2].va: offset -1, type 8b50, size 2, index -1, binding -1, stages 1
+deepB[0].d2.d1[3].va: offset -1, type 8b50, size 2, index -1, binding -1, stages 1
+deepC[1].iv4: offset -1, type 8b52, size 1, index -1, binding -1, stages 1
+deepC[1].d2.i: offset -1, type 1404, size 1, index -1, binding -1, stages 1
+deepC[1].d2.d1[0].va: offset -1, type 8b50, size 3, index -1, binding -1, stages 1
+deepC[1].d2.d1[0].b: offset -1, type 8b56, size 1, index -1, binding -1, stages 1
+deepC[1].d2.d1[1].va: offset -1, type 8b50, size 3, index -1, binding -1, stages 1
+deepC[1].d2.d1[1].b: offset -1, type 8b56, size 1, index -1, binding -1, stages 1
+deepC[1].d2.d1[2].va: offset -1, type 8b50, size 3, index -1, binding -1, stages 1
+deepC[1].d2.d1[2].b: offset -1, type 8b56, size 1, index -1, binding -1, stages 1
+deepC[1].d2.d1[3].va: offset -1, type 8b50, size 3, index -1, binding -1, stages 1
+deepC[1].d2.d1[3].b: offset -1, type 8b56, size 1, index -1, binding -1, stages 1
+deepC[1].v3: offset -1, type 8b54, size 1, index -1, binding -1, stages 1
+deepD[0].iv4: offset -1, type 8b52, size 1, index -1, binding -1, stages 1
+deepD[0].d2.i: offset -1, type 1404, size 1, index -1, binding -1, stages 1
+deepD[0].d2.d1[0].va: offset -1, type 8b50, size 3, index -1, binding -1, stages 1
+deepD[0].d2.d1[0].b: offset -1, type 8b56, size 1, index -1, binding -1, stages 1
+deepD[0].d2.d1[1].va: offset -1, type 8b50, size 3, index -1, binding -1, stages 1
+deepD[0].d2.d1[1].b: offset -1, type 8b56, size 1, index -1, binding -1, stages 1
+deepD[0].d2.d1[2].va: offset -1, type 8b50, size 3, index -1, binding -1, stages 1
+deepD[0].d2.d1[2].b: offset -1, type 8b56, size 1, index -1, binding -1, stages 1
+deepD[0].d2.d1[3].va: offset -1, type 8b50, size 3, index -1, binding -1, stages 1
+deepD[0].d2.d1[3].b: offset -1, type 8b56, size 1, index -1, binding -1, stages 1
+deepD[0].v3: offset -1, type 8b54, size 1, index -1, binding -1, stages 1
+deepD[1].iv4: offset -1, type 8b52, size 1, index -1, binding -1, stages 1
+deepD[1].d2.i: offset -1, type 1404, size 1, index -1, binding -1, stages 1
+deepD[1].d2.d1[0].va: offset -1, type 8b50, size 3, index -1, binding -1, stages 1
+deepD[1].d2.d1[0].b: offset -1, type 8b56, size 1, index -1, binding -1, stages 1
+deepD[1].d2.d1[1].va: offset -1, type 8b50, size 3, index -1, binding -1, stages 1
+deepD[1].d2.d1[1].b: offset -1, type 8b56, size 1, index -1, binding -1, stages 1
+deepD[1].d2.d1[2].va: offset -1, type 8b50, size 3, index -1, binding -1, stages 1
+deepD[1].d2.d1[2].b: offset -1, type 8b56, size 1, index -1, binding -1, stages 1
+deepD[1].d2.d1[3].va: offset -1, type 8b50, size 3, index -1, binding -1, stages 1
+deepD[1].d2.d1[3].b: offset -1, type 8b56, size 1, index -1, binding -1, stages 1
+deepD[1].v3: offset -1, type 8b54, size 1, index -1, binding -1, stages 1
+abl.foo: offset 0, type 1406, size 1, index 7, binding -1, stages 1
+abl2.foo: offset 0, type 1406, size 1, index 11, binding -1, stages 1
+buf1.runtimeArray: offset 4, type 1406, size 4, index 12, binding -1, stages 1
+buf2.runtimeArray.c: offset 8, type 1406, size 1, index 13, binding -1, stages 1
+buf3.runtimeArray: offset 4, type 1406, size 0, index 14, binding -1, stages 1
+buf4.runtimeArray.c: offset 8, type 1406, size 1, index 15, binding -1, stages 1
+anonMember1: offset 0, type 8b51, size 1, index 0, binding -1, stages 1
+uf1: offset -1, type 1406, size 1, index -1, binding -1, stages 1
+uf2: offset -1, type 1406, size 1, index -1, binding -1, stages 1
+named.member3: offset 32, type 8b52, size 1, index 1, binding -1, stages 1
 
 Uniform block reflection:
-nameless: offset -1, type ffffffff, size 496, index -1, binding -1
-named: offset -1, type ffffffff, size 304, index -1, binding -1
-c_nameless: offset -1, type ffffffff, size 112, index -1, binding -1
-nested: offset -1, type ffffffff, size 32, index -1, binding -1
-abl[0]: offset -1, type ffffffff, size 4, index -1, binding -1
-abl[1]: offset -1, type ffffffff, size 4, index -1, binding -1
-abl[2]: offset -1, type ffffffff, size 4, index -1, binding -1
-abl[3]: offset -1, type ffffffff, size 4, index -1, binding -1
-abl2[0]: offset -1, type ffffffff, size 4, index -1, binding -1
-abl2[1]: offset -1, type ffffffff, size 4, index -1, binding -1
-abl2[2]: offset -1, type ffffffff, size 4, index -1, binding -1
-abl2[3]: offset -1, type ffffffff, size 4, index -1, binding -1
+nameless: offset -1, type ffffffff, size 496, index -1, binding -1, stages 0
+named: offset -1, type ffffffff, size 304, index -1, binding -1, stages 0
+c_nameless: offset -1, type ffffffff, size 112, index -1, binding -1, stages 0
+nested: offset -1, type ffffffff, size 32, index -1, binding -1, stages 0
+abl[0]: offset -1, type ffffffff, size 4, index -1, binding -1, stages 0
+abl[1]: offset -1, type ffffffff, size 4, index -1, binding -1, stages 0
+abl[2]: offset -1, type ffffffff, size 4, index -1, binding -1, stages 0
+abl[3]: offset -1, type ffffffff, size 4, index -1, binding -1, stages 0
+abl2[0]: offset -1, type ffffffff, size 4, index -1, binding -1, stages 0
+abl2[1]: offset -1, type ffffffff, size 4, index -1, binding -1, stages 0
+abl2[2]: offset -1, type ffffffff, size 4, index -1, binding -1, stages 0
+abl2[3]: offset -1, type ffffffff, size 4, index -1, binding -1, stages 0
+buf1: offset -1, type ffffffff, size 4, index -1, binding -1, stages 0
+buf2: offset -1, type ffffffff, size 4, index -1, binding -1, stages 0
+buf3: offset -1, type ffffffff, size 4, index -1, binding -1, stages 0
+buf4: offset -1, type ffffffff, size 4, index -1, binding -1, stages 0
 
 Vertex attribute reflection:
-attributeFloat: offset 0, type 1406, size 0, index 0, binding -1
-attributeFloat2: offset 0, type 8b50, size 0, index 0, binding -1
-attributeFloat3: offset 0, type 8b51, size 0, index 0, binding -1
-attributeFloat4: offset 0, type 8b52, size 0, index 0, binding -1
-attributeMat4: offset 0, type 8b5c, size 0, index 0, binding -1
+attributeFloat: offset 0, type 1406, size 0, index 0, binding -1, stages 0
+attributeFloat2: offset 0, type 8b50, size 0, index 0, binding -1, stages 0
+attributeFloat3: offset 0, type 8b51, size 0, index 0, binding -1, stages 0
+attributeFloat4: offset 0, type 8b52, size 0, index 0, binding -1, stages 0
+attributeMat4: offset 0, type 8b5c, size 0, index 0, binding -1, stages 0
+gl_InstanceID: offset 0, type 1404, size 0, index 0, binding -1, stages 0
 
diff --git a/Test/baseResults/remap.basic.dcefunc.frag.out b/Test/baseResults/remap.basic.dcefunc.frag.out
index c28d90a..33ec069 100644
--- a/Test/baseResults/remap.basic.dcefunc.frag.out
+++ b/Test/baseResults/remap.basic.dcefunc.frag.out
@@ -1,8 +1,6 @@
 remap.basic.dcefunc.frag
-Warning, version 450 is not yet complete; most version-specific features are present, but some are missing.
-
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 22
 
                               Capability Shader
diff --git a/Test/baseResults/remap.basic.everything.frag.out b/Test/baseResults/remap.basic.everything.frag.out
index 357a8d2..858d629 100644
--- a/Test/baseResults/remap.basic.everything.frag.out
+++ b/Test/baseResults/remap.basic.everything.frag.out
@@ -1,8 +1,6 @@
 remap.basic.everything.frag
-Warning, version 450 is not yet complete; most version-specific features are present, but some are missing.
-
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 24969
 
                               Capability Shader
diff --git a/Test/baseResults/remap.basic.none.frag.out b/Test/baseResults/remap.basic.none.frag.out
index 44f5747..1ad1d74 100644
--- a/Test/baseResults/remap.basic.none.frag.out
+++ b/Test/baseResults/remap.basic.none.frag.out
@@ -1,8 +1,6 @@
 remap.basic.none.frag
-Warning, version 450 is not yet complete; most version-specific features are present, but some are missing.
-
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 22
 
                               Capability Shader
diff --git a/Test/baseResults/remap.basic.strip.frag.out b/Test/baseResults/remap.basic.strip.frag.out
index ab1a003..3d876d0 100644
--- a/Test/baseResults/remap.basic.strip.frag.out
+++ b/Test/baseResults/remap.basic.strip.frag.out
@@ -1,8 +1,6 @@
 remap.basic.strip.frag
-Warning, version 450 is not yet complete; most version-specific features are present, but some are missing.
-
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 22
 
                               Capability Shader
diff --git a/Test/baseResults/remap.hlsl.sample.basic.everything.frag.out b/Test/baseResults/remap.hlsl.sample.basic.everything.frag.out
index 4fc2987..211daba 100644
--- a/Test/baseResults/remap.hlsl.sample.basic.everything.frag.out
+++ b/Test/baseResults/remap.hlsl.sample.basic.everything.frag.out
@@ -2,15 +2,16 @@
 WARNING: 0:4: 'immediate sampler state' : unimplemented 
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 24878
 
                               Capability Shader
                               Capability Sampled1D
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 5663  "main" 4656 4112
+                              EntryPoint Fragment 5663  "main" 4253 3709
                               ExecutionMode 5663 OriginUpperLeft
+                              ExecutionMode 5663 DepthReplacing
                               Decorate 4727 DescriptorSet 0
                               Decorate 4727 Binding 0
                               Decorate 3305 DescriptorSet 0
@@ -26,8 +27,8 @@
                               Decorate 3789 DescriptorSet 0
                               Decorate 3805 DescriptorSet 0
                               Decorate 3869 DescriptorSet 0
-                              Decorate 4656 Location 0
-                              Decorate 4112 BuiltIn FragDepth
+                              Decorate 4253 Location 0
+                              Decorate 3709 BuiltIn FragDepth
                8:             TypeVoid
             1282:             TypeFunction 8
               13:             TypeFloat 32
@@ -127,9 +128,9 @@
             1284:   29(fvec4) ConstantComposite 138 138 138 138
              650:             TypePointer Function 13(float)
              667:             TypePointer Output 29(fvec4)
-            4656:    667(ptr) Variable Output
+            4253:    667(ptr) Variable Output
              651:             TypePointer Output 13(float)
-            4112:    651(ptr) Variable Output
+            3709:    651(ptr) Variable Output
             5663:           8 Function None 1282
            24877:             Label
             4104:   1669(ptr) Variable Function
@@ -137,10 +138,10 @@
                               Store 4104 18803
            13396:    666(ptr) AccessChain 4104 2571
             7967:   29(fvec4) Load 13396
-                              Store 4656 7967
+                              Store 4253 7967
            16622:    650(ptr) AccessChain 4104 2574
            11539:   13(float) Load 16622
-                              Store 4112 11539
+                              Store 3709 11539
                               Return
                               FunctionEnd
             3317:1032(struct) Function None 319
diff --git a/Test/baseResults/remap.hlsl.sample.basic.none.frag.out b/Test/baseResults/remap.hlsl.sample.basic.none.frag.out
index af309a1..24a1ade 100644
--- a/Test/baseResults/remap.hlsl.sample.basic.none.frag.out
+++ b/Test/baseResults/remap.hlsl.sample.basic.none.frag.out
@@ -2,7 +2,7 @@
 WARNING: 0:4: 'immediate sampler state' : unimplemented 
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 198
 
                               Capability Shader
@@ -11,6 +11,7 @@
                               MemoryModel Logical GLSL450
                               EntryPoint Fragment 4  "main" 188 192
                               ExecutionMode 4 OriginUpperLeft
+                              ExecutionMode 4 DepthReplacing
                               Source HLSL 500
                               Name 4  "main"
                               Name 8  "PS_OUTPUT"
@@ -58,8 +59,8 @@
                               Name 169  "g_tTexcdu4"
                               Name 176  "psout"
                               Name 185  "flattenTemp"
-                              Name 188  "Color"
-                              Name 192  "Depth"
+                              Name 188  "@entryPointOutput.Color"
+                              Name 192  "@entryPointOutput.Depth"
                               Name 195  "g_sSamp2d"
                               Name 196  "g_sSamp2D_b"
                               Name 197  "g_tTex1df4a"
@@ -78,8 +79,8 @@
                               Decorate 151(g_tTexcdf4) DescriptorSet 0
                               Decorate 160(g_tTexcdi4) DescriptorSet 0
                               Decorate 169(g_tTexcdu4) DescriptorSet 0
-                              Decorate 188(Color) Location 0
-                              Decorate 192(Depth) BuiltIn FragDepth
+                              Decorate 188(@entryPointOutput.Color) Location 0
+                              Decorate 192(@entryPointOutput.Depth) BuiltIn FragDepth
                               Decorate 195(g_sSamp2d) DescriptorSet 0
                               Decorate 196(g_sSamp2D_b) DescriptorSet 0
                               Decorate 197(g_tTex1df4a) DescriptorSet 0
@@ -185,9 +186,9 @@
              178:    7(fvec4) ConstantComposite 177 177 177 177
              180:             TypePointer Function 6(float)
              187:             TypePointer Output 7(fvec4)
-      188(Color):    187(ptr) Variable Output
+188(@entryPointOutput.Color):    187(ptr) Variable Output
              191:             TypePointer Output 6(float)
-      192(Depth):    191(ptr) Variable Output
+192(@entryPointOutput.Depth):    191(ptr) Variable Output
   195(g_sSamp2d):     48(ptr) Variable UniformConstant
 196(g_sSamp2D_b):     48(ptr) Variable UniformConstant
 197(g_tTex1df4a):     44(ptr) Variable UniformConstant
@@ -198,10 +199,10 @@
                               Store 185(flattenTemp) 186
              189:     41(ptr) AccessChain 185(flattenTemp) 29
              190:    7(fvec4) Load 189
-                              Store 188(Color) 190
+                              Store 188(@entryPointOutput.Color) 190
              193:    180(ptr) AccessChain 185(flattenTemp) 16
              194:    6(float) Load 193
-                              Store 192(Depth) 194
+                              Store 192(@entryPointOutput.Depth) 194
                               Return
                               FunctionEnd
       10(@main():8(PS_OUTPUT) Function None 9
diff --git a/Test/baseResults/remap.hlsl.sample.basic.strip.frag.out b/Test/baseResults/remap.hlsl.sample.basic.strip.frag.out
index d76bdd9..2108108 100644
--- a/Test/baseResults/remap.hlsl.sample.basic.strip.frag.out
+++ b/Test/baseResults/remap.hlsl.sample.basic.strip.frag.out
@@ -2,7 +2,7 @@
 WARNING: 0:4: 'immediate sampler state' : unimplemented 
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 198
 
                               Capability Shader
@@ -11,6 +11,7 @@
                               MemoryModel Logical GLSL450
                               EntryPoint Fragment 4  "main" 188 192
                               ExecutionMode 4 OriginUpperLeft
+                              ExecutionMode 4 DepthReplacing
                               Decorate 45 DescriptorSet 0
                               Decorate 45 Binding 0
                               Decorate 49 DescriptorSet 0
diff --git a/Test/baseResults/remap.hlsl.templatetypes.everything.frag.out b/Test/baseResults/remap.hlsl.templatetypes.everything.frag.out
index 330aecd..aff0998 100644
--- a/Test/baseResults/remap.hlsl.templatetypes.everything.frag.out
+++ b/Test/baseResults/remap.hlsl.templatetypes.everything.frag.out
@@ -1,6 +1,6 @@
 remap.hlsl.templatetypes.everything.frag
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 24954
 
                               Capability Shader
diff --git a/Test/baseResults/remap.hlsl.templatetypes.none.frag.out b/Test/baseResults/remap.hlsl.templatetypes.none.frag.out
index dd2917e..282fd2a 100644
--- a/Test/baseResults/remap.hlsl.templatetypes.none.frag.out
+++ b/Test/baseResults/remap.hlsl.templatetypes.none.frag.out
@@ -1,6 +1,6 @@
 remap.hlsl.templatetypes.none.frag
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 160
 
                               Capability Shader
@@ -68,8 +68,8 @@
               29:     26(int) Constant 1
               30:             TypePointer Function 6(float)
               32:             TypeFloat 64
-              33:             TypePointer Function 32(float)
-              35:   32(float) Constant 0 1072693248
+              33:             TypePointer Function 32(float64_t)
+              35:32(float64_t) Constant 0 1072693248
               36:             TypeInt 32 0
               37:             TypePointer Function 36(int)
               39:     36(int) Constant 1
@@ -84,10 +84,10 @@
               50:             TypeVector 6(float) 2
               51:             TypePointer Function 50(fvec2)
               53:   50(fvec2) ConstantComposite 14 15
-              54:             TypeVector 32(float) 2
-              55:             TypePointer Function 54(fvec2)
-              57:   32(float) Constant 0 1073741824
-              58:   54(fvec2) ConstantComposite 35 57
+              54:             TypeVector 32(float64_t) 2
+              55:             TypePointer Function 54(f64vec2)
+              57:32(float64_t) Constant 0 1073741824
+              58: 54(f64vec2) ConstantComposite 35 57
               59:             TypeVector 36(int) 2
               60:             TypePointer Function 59(ivec2)
               62:     36(int) Constant 2
@@ -102,10 +102,10 @@
               73:             TypeVector 6(float) 3
               74:             TypePointer Function 73(fvec3)
               76:   73(fvec3) ConstantComposite 14 15 16
-              77:             TypeVector 32(float) 3
-              78:             TypePointer Function 77(fvec3)
-              80:   32(float) Constant 0 1074266112
-              81:   77(fvec3) ConstantComposite 35 57 80
+              77:             TypeVector 32(float64_t) 3
+              78:             TypePointer Function 77(f64vec3)
+              80:32(float64_t) Constant 0 1074266112
+              81: 77(f64vec3) ConstantComposite 35 57 80
               82:             TypeVector 36(int) 3
               83:             TypePointer Function 82(ivec3)
               85:     36(int) Constant 3
@@ -117,10 +117,10 @@
               92:             TypePointer Function 91(ivec4)
               94:     26(int) Constant 4
               95:   91(ivec4) ConstantComposite 29 48 71 94
-              97:             TypeVector 32(float) 4
-              98:             TypePointer Function 97(fvec4)
-             100:   32(float) Constant 0 1074790400
-             101:   97(fvec4) ConstantComposite 35 57 80 100
+              97:             TypeVector 32(float64_t) 4
+              98:             TypePointer Function 97(f64vec4)
+             100:32(float64_t) Constant 0 1074790400
+             101: 97(f64vec4) ConstantComposite 35 57 80 100
              102:             TypeVector 36(int) 4
              103:             TypePointer Function 102(ivec4)
              105:     36(int) Constant 4
diff --git a/Test/baseResults/remap.if.everything.frag.out b/Test/baseResults/remap.if.everything.frag.out
index d20564c..cdb007b 100644
--- a/Test/baseResults/remap.if.everything.frag.out
+++ b/Test/baseResults/remap.if.everything.frag.out
@@ -1,8 +1,6 @@
 remap.if.everything.frag
-Warning, version 450 is not yet complete; most version-specific features are present, but some are missing.
-
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 22855
 
                               Capability Shader
diff --git a/Test/baseResults/remap.if.none.frag.out b/Test/baseResults/remap.if.none.frag.out
index 081d5cd..0c8d278 100644
--- a/Test/baseResults/remap.if.none.frag.out
+++ b/Test/baseResults/remap.if.none.frag.out
@@ -1,8 +1,6 @@
 remap.if.none.frag
-Warning, version 450 is not yet complete; most version-specific features are present, but some are missing.
-
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 25
 
                               Capability Shader
diff --git a/Test/baseResults/remap.invalid-spirv-1.out b/Test/baseResults/remap.invalid-spirv-1.out
new file mode 100644
index 0000000..91b4b6d
--- /dev/null
+++ b/Test/baseResults/remap.invalid-spirv-1.out
@@ -0,0 +1 @@
+ID out of range: 4160749568
diff --git a/Test/baseResults/remap.invalid-spirv-2.out b/Test/baseResults/remap.invalid-spirv-2.out
new file mode 100644
index 0000000..808b9b8
--- /dev/null
+++ b/Test/baseResults/remap.invalid-spirv-2.out
@@ -0,0 +1 @@
+ID not found
diff --git a/Test/baseResults/remap.literal64.none.spv.out b/Test/baseResults/remap.literal64.none.spv.out
index 792b13a..d88992f 100644
--- a/Test/baseResults/remap.literal64.none.spv.out
+++ b/Test/baseResults/remap.literal64.none.spv.out
@@ -8,7 +8,7 @@
                1:             TypeVoid
                2:             TypeInt 64 1
                3:             TypeFunction 1
-               4:      2(int) Constant 0 0
+               4:  2(int64_t) Constant 0 0
                5:           1 Function None 3
                6:             Label
                               SelectionMerge 7 None
diff --git a/Test/baseResults/remap.similar_1a.everything.frag.out b/Test/baseResults/remap.similar_1a.everything.frag.out
index 384b8e8..2f8f1c7 100644
--- a/Test/baseResults/remap.similar_1a.everything.frag.out
+++ b/Test/baseResults/remap.similar_1a.everything.frag.out
@@ -1,8 +1,6 @@
 remap.similar_1a.everything.frag
-Warning, version 450 is not yet complete; most version-specific features are present, but some are missing.
-
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 24916
 
                               Capability Shader
diff --git a/Test/baseResults/remap.similar_1a.none.frag.out b/Test/baseResults/remap.similar_1a.none.frag.out
index 910ef42..80d35c3 100644
--- a/Test/baseResults/remap.similar_1a.none.frag.out
+++ b/Test/baseResults/remap.similar_1a.none.frag.out
@@ -1,8 +1,6 @@
 remap.similar_1a.none.frag
-Warning, version 450 is not yet complete; most version-specific features are present, but some are missing.
-
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 86
 
                               Capability Shader
diff --git a/Test/baseResults/remap.similar_1b.everything.frag.out b/Test/baseResults/remap.similar_1b.everything.frag.out
index 0ce4544..c76c4bf 100644
--- a/Test/baseResults/remap.similar_1b.everything.frag.out
+++ b/Test/baseResults/remap.similar_1b.everything.frag.out
@@ -1,8 +1,6 @@
 remap.similar_1b.everything.frag
-Warning, version 450 is not yet complete; most version-specific features are present, but some are missing.
-
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 24916
 
                               Capability Shader
diff --git a/Test/baseResults/remap.similar_1b.none.frag.out b/Test/baseResults/remap.similar_1b.none.frag.out
index ce79e00..0a854d6 100644
--- a/Test/baseResults/remap.similar_1b.none.frag.out
+++ b/Test/baseResults/remap.similar_1b.none.frag.out
@@ -1,8 +1,6 @@
 remap.similar_1b.none.frag
-Warning, version 450 is not yet complete; most version-specific features are present, but some are missing.
-
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 91
 
                               Capability Shader
diff --git a/Test/baseResults/remap.specconst.comp.out b/Test/baseResults/remap.specconst.comp.out
new file mode 100644
index 0000000..ee049f4
--- /dev/null
+++ b/Test/baseResults/remap.specconst.comp.out
@@ -0,0 +1,31 @@
+remap.specconst.comp
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 16104
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint GLCompute 5663  "main"
+                              ExecutionMode 5663 LocalSize 1 1 1
+                              Decorate 2 SpecId 0
+                              Decorate 3 SpecId 1
+                              Decorate 4 SpecId 2
+                              Decorate 5 BuiltIn WorkgroupSize
+               8:             TypeVoid
+            1282:             TypeFunction 8
+              11:             TypeInt 32 0
+               2:     11(int) SpecConstant 1
+               3:     11(int) SpecConstant 1
+               4:     11(int) SpecConstant 1
+              20:             TypeVector 11(int) 3
+               5:   20(ivec3) SpecConstantComposite 2 3 4
+               6:     11(int) SpecConstantOp 81 5 0
+               7:     11(int) SpecConstantOp 81 5 1(GLSL.std.450)
+               9:     11(int) SpecConstantOp 81 5 2
+              10:     11(int) SpecConstantOp 132 7 9
+              12:     11(int) SpecConstantOp 128 6 10
+            5663:           8 Function None 1282
+           16103:             Label
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/remap.switch.everything.frag.out b/Test/baseResults/remap.switch.everything.frag.out
index e5a7ef7..ffd64d4 100644
--- a/Test/baseResults/remap.switch.everything.frag.out
+++ b/Test/baseResults/remap.switch.everything.frag.out
@@ -1,10 +1,9 @@
 remap.switch.everything.frag
-Warning, version 450 is not yet complete; most version-specific features are present, but some are missing.
 WARNING: 0:5: '' : all default precisions are highp; use precision statements to quiet warning, e.g.:
          "precision mediump int; precision highp float;" 
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 23990
 
                               Capability Shader
diff --git a/Test/baseResults/remap.switch.none.frag.out b/Test/baseResults/remap.switch.none.frag.out
index 68d075b..4dd7897 100644
--- a/Test/baseResults/remap.switch.none.frag.out
+++ b/Test/baseResults/remap.switch.none.frag.out
@@ -1,10 +1,9 @@
 remap.switch.none.frag
-Warning, version 450 is not yet complete; most version-specific features are present, but some are missing.
 WARNING: 0:5: '' : all default precisions are highp; use precision statements to quiet warning, e.g.:
          "precision mediump int; precision highp float;" 
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 48
 
                               Capability Shader
diff --git a/Test/baseResults/remap.uniformarray.everything.frag.out b/Test/baseResults/remap.uniformarray.everything.frag.out
index ed906d5..c1f306e 100644
--- a/Test/baseResults/remap.uniformarray.everything.frag.out
+++ b/Test/baseResults/remap.uniformarray.everything.frag.out
@@ -1,6 +1,6 @@
 remap.uniformarray.everything.frag
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 25030
 
                               Capability Shader
@@ -8,6 +8,7 @@
                               MemoryModel Logical GLSL450
                               EntryPoint Fragment 5663  "main" 3608 4957 4339 5139
                               ExecutionMode 5663 OriginUpperLeft
+                              Decorate 5139 Location 0
                8:             TypeVoid
             1282:             TypeFunction 8
               13:             TypeFloat 32
diff --git a/Test/baseResults/remap.uniformarray.none.frag.out b/Test/baseResults/remap.uniformarray.none.frag.out
index 526b9e4..6ed2d45 100644
--- a/Test/baseResults/remap.uniformarray.none.frag.out
+++ b/Test/baseResults/remap.uniformarray.none.frag.out
@@ -1,6 +1,6 @@
 remap.uniformarray.none.frag
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 53
 
                               Capability Shader
@@ -16,6 +16,7 @@
                               Name 35  "alpha"
                               Name 47  "gl_FragColor"
                               Name 52  "texSampler2D"
+                              Decorate 47(gl_FragColor) Location 0
                               Decorate 52(texSampler2D) DescriptorSet 0
                2:             TypeVoid
                3:             TypeFunction 2
diff --git a/Test/baseResults/runtimeArray.vert.out b/Test/baseResults/runtimeArray.vert.out
new file mode 100644
index 0000000..5ba3992
--- /dev/null
+++ b/Test/baseResults/runtimeArray.vert.out
@@ -0,0 +1,647 @@
+runtimeArray.vert
+WARNING: 0:33: '[]' : assuming binding count of one for compile-time checking of binding numbers for unsized array 
+WARNING: 0:34: '[]' : assuming binding count of one for compile-time checking of binding numbers for unsized array 
+WARNING: 0:37: '[]' : assuming binding count of one for compile-time checking of binding numbers for unsized array 
+WARNING: 0:38: '[]' : assuming binding count of one for compile-time checking of binding numbers for unsized array 
+WARNING: 0:39: '[]' : assuming binding count of one for compile-time checking of binding numbers for unsized array 
+WARNING: 0:40: '[]' : assuming binding count of one for compile-time checking of binding numbers for unsized array 
+ERROR: 0:61: '[' :  array must be redeclared with a size before being indexed with a variable
+ERROR: 0:62: '[' :  array must be redeclared with a size before being indexed with a variable
+ERROR: 0:63: '[' :  array must be redeclared with a size before being indexed with a variable
+ERROR: 0:66: 'length' :  array must be declared with a size before using this method
+ERROR: 0:67: 'length' :  array must be declared with a size before using this method
+ERROR: 0:68: 'length' :  array must be declared with a size before using this method
+ERROR: 0:71: '[' :  array must be redeclared with a size before being indexed with a variable
+ERROR: 0:72: '[' :  array must be redeclared with a size before being indexed with a variable
+ERROR: 0:73: '[' :  array must be redeclared with a size before being indexed with a variable
+ERROR: 0:76: 'length' :  array must be declared with a size before using this method
+ERROR: 0:77: 'length' :  array must be declared with a size before using this method
+ERROR: 0:78: 'length' :  array must be declared with a size before using this method
+ERROR: 0:81: '[' :  array must be redeclared with a size before being indexed with a variable
+ERROR: 0:82: '[' :  array must be redeclared with a size before being indexed with a variable
+ERROR: 0:83: '[' :  array must be redeclared with a size before being indexed with a variable
+ERROR: 0:86: 'length' :  array must be declared with a size before using this method
+ERROR: 0:87: 'length' :  array must be declared with a size before using this method
+ERROR: 0:88: 'length' :  array must be declared with a size before using this method
+ERROR: 0:100: 'variable index' : required extension not requested: GL_EXT_nonuniform_qualifier
+ERROR: 0:101: 'variable index' : required extension not requested: GL_EXT_nonuniform_qualifier
+ERROR: 0:102: 'variable index' : required extension not requested: GL_EXT_nonuniform_qualifier
+ERROR: 0:103: 'variable index' : required extension not requested: GL_EXT_nonuniform_qualifier
+ERROR: 0:104: 'variable index' : required extension not requested: GL_EXT_nonuniform_qualifier
+ERROR: 0:105: 'variable index' : required extension not requested: GL_EXT_nonuniform_qualifier
+ERROR: 0:106: 'variable index' : required extension not requested: GL_EXT_nonuniform_qualifier
+ERROR: 0:107: 'variable index' : required extension not requested: GL_EXT_nonuniform_qualifier
+ERROR: 0:109: '[]' : array initializer must be sized 
+ERROR: 27 compilation errors.  No code generated.
+
+
+Shader version: 450
+ERROR: node is still EOpNull!
+0:44  Function Definition: main( ( global void)
+0:44    Function Parameters: 
+0:46    Sequence
+0:46      direct index (layout( column_major shared) temp int)
+0:46        a: direct index for structure (layout( column_major shared) uniform runtime-sized array of int)
+0:46          'ubuf' (layout( column_major shared) uniform block{layout( column_major shared) uniform runtime-sized array of int a, layout( column_major shared) uniform runtime-sized array of float b})
+0:46          Constant:
+0:46            0 (const int)
+0:46        Constant:
+0:46          3 (const int)
+0:47      direct index (layout( column_major shared) temp float)
+0:47        b: direct index for structure (layout( column_major shared) uniform runtime-sized array of float)
+0:47          'ubuf' (layout( column_major shared) uniform block{layout( column_major shared) uniform runtime-sized array of int a, layout( column_major shared) uniform runtime-sized array of float b})
+0:47          Constant:
+0:47            1 (const int)
+0:47        Constant:
+0:47          3 (const int)
+0:48      direct index (layout( column_major shared) temp int)
+0:48        a: direct index for structure (layout( column_major shared) buffer runtime-sized array of int)
+0:48          'buf' (layout( column_major shared) buffer block{layout( column_major shared) buffer runtime-sized array of int a, layout( column_major shared) buffer runtime-sized array of float b})
+0:48          Constant:
+0:48            0 (const int)
+0:48        Constant:
+0:48          3 (const int)
+0:49      direct index (layout( column_major shared) temp float)
+0:49        b: direct index for structure (layout( column_major shared) buffer runtime-sized array of float)
+0:49          'buf' (layout( column_major shared) buffer block{layout( column_major shared) buffer runtime-sized array of int a, layout( column_major shared) buffer runtime-sized array of float b})
+0:49          Constant:
+0:49            1 (const int)
+0:49        Constant:
+0:49          3 (const int)
+0:51      direct index (layout( column_major shared) temp int)
+0:51        a: direct index for structure (layout( column_major shared) uniform runtime-sized array of int)
+0:51          direct index (layout( column_major shared) temp block{layout( column_major shared) uniform runtime-sized array of int a, layout( column_major shared) uniform runtime-sized array of float b})
+0:51            'ubufa' (layout( column_major shared) uniform 4-element array of block{layout( column_major shared) uniform runtime-sized array of int a, layout( column_major shared) uniform runtime-sized array of float b})
+0:51            Constant:
+0:51              3 (const int)
+0:51          Constant:
+0:51            0 (const int)
+0:51        Constant:
+0:51          3 (const int)
+0:52      direct index (layout( column_major shared) temp float)
+0:52        b: direct index for structure (layout( column_major shared) uniform runtime-sized array of float)
+0:52          direct index (layout( column_major shared) temp block{layout( column_major shared) uniform runtime-sized array of int a, layout( column_major shared) uniform runtime-sized array of float b})
+0:52            'ubufa' (layout( column_major shared) uniform 4-element array of block{layout( column_major shared) uniform runtime-sized array of int a, layout( column_major shared) uniform runtime-sized array of float b})
+0:52            Constant:
+0:52              3 (const int)
+0:52          Constant:
+0:52            1 (const int)
+0:52        Constant:
+0:52          3 (const int)
+0:53      direct index (layout( column_major shared) temp int)
+0:53        a: direct index for structure (layout( column_major shared) buffer runtime-sized array of int)
+0:53          direct index (layout( column_major shared) temp block{layout( column_major shared) buffer runtime-sized array of int a, layout( column_major shared) buffer runtime-sized array of float b})
+0:53            'bufa' (layout( column_major shared) buffer 4-element array of block{layout( column_major shared) buffer runtime-sized array of int a, layout( column_major shared) buffer runtime-sized array of float b})
+0:53            Constant:
+0:53              3 (const int)
+0:53          Constant:
+0:53            0 (const int)
+0:53        Constant:
+0:53          3 (const int)
+0:54      direct index (layout( column_major shared) temp float)
+0:54        b: direct index for structure (layout( column_major shared) buffer runtime-sized array of float)
+0:54          direct index (layout( column_major shared) temp block{layout( column_major shared) buffer runtime-sized array of int a, layout( column_major shared) buffer runtime-sized array of float b})
+0:54            'bufa' (layout( column_major shared) buffer 4-element array of block{layout( column_major shared) buffer runtime-sized array of int a, layout( column_major shared) buffer runtime-sized array of float b})
+0:54            Constant:
+0:54              3 (const int)
+0:54          Constant:
+0:54            1 (const int)
+0:54        Constant:
+0:54          3 (const int)
+0:56      direct index (layout( column_major shared) temp int)
+0:56        aua: direct index for structure (layout( column_major shared) uniform runtime-sized array of int)
+0:56          'anon@1' (layout( column_major shared) uniform block{layout( column_major shared) uniform runtime-sized array of int aua, layout( column_major shared) uniform runtime-sized array of float aub})
+0:56          Constant:
+0:56            0 (const uint)
+0:56        Constant:
+0:56          3 (const int)
+0:57      direct index (layout( column_major shared) temp float)
+0:57        aub: direct index for structure (layout( column_major shared) uniform runtime-sized array of float)
+0:57          'anon@1' (layout( column_major shared) uniform block{layout( column_major shared) uniform runtime-sized array of int aua, layout( column_major shared) uniform runtime-sized array of float aub})
+0:57          Constant:
+0:57            1 (const uint)
+0:57        Constant:
+0:57          3 (const int)
+0:58      direct index (layout( column_major shared) temp int)
+0:58        aba: direct index for structure (layout( column_major shared) buffer runtime-sized array of int)
+0:58          'anon@0' (layout( column_major shared) buffer block{layout( column_major shared) buffer runtime-sized array of int aba, layout( column_major shared) buffer runtime-sized array of float abb})
+0:58          Constant:
+0:58            0 (const uint)
+0:58        Constant:
+0:58          3 (const int)
+0:59      direct index (layout( column_major shared) temp float)
+0:59        abb: direct index for structure (layout( column_major shared) buffer runtime-sized array of float)
+0:59          'anon@0' (layout( column_major shared) buffer block{layout( column_major shared) buffer runtime-sized array of int aba, layout( column_major shared) buffer runtime-sized array of float abb})
+0:59          Constant:
+0:59            1 (const uint)
+0:59        Constant:
+0:59          3 (const int)
+0:61      indirect index (layout( column_major shared) temp int)
+0:61        a: direct index for structure (layout( column_major shared) uniform runtime-sized array of int)
+0:61          'ubuf' (layout( column_major shared) uniform block{layout( column_major shared) uniform runtime-sized array of int a, layout( column_major shared) uniform runtime-sized array of float b})
+0:61          Constant:
+0:61            0 (const int)
+0:61        'i' ( global int)
+0:62      indirect index (layout( column_major shared) temp float)
+0:62        b: direct index for structure (layout( column_major shared) uniform runtime-sized array of float)
+0:62          'ubuf' (layout( column_major shared) uniform block{layout( column_major shared) uniform runtime-sized array of int a, layout( column_major shared) uniform runtime-sized array of float b})
+0:62          Constant:
+0:62            1 (const int)
+0:62        'i' ( global int)
+0:63      indirect index (layout( column_major shared) temp int)
+0:63        a: direct index for structure (layout( column_major shared) buffer runtime-sized array of int)
+0:63          'buf' (layout( column_major shared) buffer block{layout( column_major shared) buffer runtime-sized array of int a, layout( column_major shared) buffer runtime-sized array of float b})
+0:63          Constant:
+0:63            0 (const int)
+0:63        'i' ( global int)
+0:64      indirect index (layout( column_major shared) temp float)
+0:64        b: direct index for structure (layout( column_major shared) buffer runtime-sized array of float)
+0:64          'buf' (layout( column_major shared) buffer block{layout( column_major shared) buffer runtime-sized array of int a, layout( column_major shared) buffer runtime-sized array of float b})
+0:64          Constant:
+0:64            1 (const int)
+0:64        'i' ( global int)
+0:66      Constant:
+0:66        1 (const int)
+0:67      Constant:
+0:67        1 (const int)
+0:68      Constant:
+0:68        1 (const int)
+0:69      array length ( temp int)
+0:69        b: direct index for structure (layout( column_major shared) buffer runtime-sized array of float)
+0:69          'buf' (layout( column_major shared) buffer block{layout( column_major shared) buffer runtime-sized array of int a, layout( column_major shared) buffer runtime-sized array of float b})
+0:69          Constant:
+0:69            1 (const int)
+0:71      indirect index (layout( column_major shared) temp int)
+0:71        a: direct index for structure (layout( column_major shared) uniform runtime-sized array of int)
+0:71          direct index (layout( column_major shared) temp block{layout( column_major shared) uniform runtime-sized array of int a, layout( column_major shared) uniform runtime-sized array of float b})
+0:71            'ubufa' (layout( column_major shared) uniform 4-element array of block{layout( column_major shared) uniform runtime-sized array of int a, layout( column_major shared) uniform runtime-sized array of float b})
+0:71            Constant:
+0:71              1 (const int)
+0:71          Constant:
+0:71            0 (const int)
+0:71        'i' ( global int)
+0:72      indirect index (layout( column_major shared) temp float)
+0:72        b: direct index for structure (layout( column_major shared) uniform runtime-sized array of float)
+0:72          direct index (layout( column_major shared) temp block{layout( column_major shared) uniform runtime-sized array of int a, layout( column_major shared) uniform runtime-sized array of float b})
+0:72            'ubufa' (layout( column_major shared) uniform 4-element array of block{layout( column_major shared) uniform runtime-sized array of int a, layout( column_major shared) uniform runtime-sized array of float b})
+0:72            Constant:
+0:72              1 (const int)
+0:72          Constant:
+0:72            1 (const int)
+0:72        'i' ( global int)
+0:73      indirect index (layout( column_major shared) temp int)
+0:73        a: direct index for structure (layout( column_major shared) buffer runtime-sized array of int)
+0:73          direct index (layout( column_major shared) temp block{layout( column_major shared) buffer runtime-sized array of int a, layout( column_major shared) buffer runtime-sized array of float b})
+0:73            'bufa' (layout( column_major shared) buffer 4-element array of block{layout( column_major shared) buffer runtime-sized array of int a, layout( column_major shared) buffer runtime-sized array of float b})
+0:73            Constant:
+0:73              1 (const int)
+0:73          Constant:
+0:73            0 (const int)
+0:73        'i' ( global int)
+0:74      indirect index (layout( column_major shared) temp float)
+0:74        b: direct index for structure (layout( column_major shared) buffer runtime-sized array of float)
+0:74          direct index (layout( column_major shared) temp block{layout( column_major shared) buffer runtime-sized array of int a, layout( column_major shared) buffer runtime-sized array of float b})
+0:74            'bufa' (layout( column_major shared) buffer 4-element array of block{layout( column_major shared) buffer runtime-sized array of int a, layout( column_major shared) buffer runtime-sized array of float b})
+0:74            Constant:
+0:74              1 (const int)
+0:74          Constant:
+0:74            1 (const int)
+0:74        'i' ( global int)
+0:76      Constant:
+0:76        1 (const int)
+0:77      Constant:
+0:77        1 (const int)
+0:78      Constant:
+0:78        1 (const int)
+0:79      array length ( temp int)
+0:79        b: direct index for structure (layout( column_major shared) buffer runtime-sized array of float)
+0:79          direct index (layout( column_major shared) temp block{layout( column_major shared) buffer runtime-sized array of int a, layout( column_major shared) buffer runtime-sized array of float b})
+0:79            'bufa' (layout( column_major shared) buffer 4-element array of block{layout( column_major shared) buffer runtime-sized array of int a, layout( column_major shared) buffer runtime-sized array of float b})
+0:79            Constant:
+0:79              1 (const int)
+0:79          Constant:
+0:79            1 (const int)
+0:81      indirect index (layout( column_major shared) temp int)
+0:81        aua: direct index for structure (layout( column_major shared) uniform runtime-sized array of int)
+0:81          'anon@1' (layout( column_major shared) uniform block{layout( column_major shared) uniform runtime-sized array of int aua, layout( column_major shared) uniform runtime-sized array of float aub})
+0:81          Constant:
+0:81            0 (const uint)
+0:81        'i' ( global int)
+0:82      indirect index (layout( column_major shared) temp float)
+0:82        aub: direct index for structure (layout( column_major shared) uniform runtime-sized array of float)
+0:82          'anon@1' (layout( column_major shared) uniform block{layout( column_major shared) uniform runtime-sized array of int aua, layout( column_major shared) uniform runtime-sized array of float aub})
+0:82          Constant:
+0:82            1 (const uint)
+0:82        'i' ( global int)
+0:83      indirect index (layout( column_major shared) temp int)
+0:83        aba: direct index for structure (layout( column_major shared) buffer runtime-sized array of int)
+0:83          'anon@0' (layout( column_major shared) buffer block{layout( column_major shared) buffer runtime-sized array of int aba, layout( column_major shared) buffer runtime-sized array of float abb})
+0:83          Constant:
+0:83            0 (const uint)
+0:83        'i' ( global int)
+0:84      indirect index (layout( column_major shared) temp float)
+0:84        abb: direct index for structure (layout( column_major shared) buffer runtime-sized array of float)
+0:84          'anon@0' (layout( column_major shared) buffer block{layout( column_major shared) buffer runtime-sized array of int aba, layout( column_major shared) buffer runtime-sized array of float abb})
+0:84          Constant:
+0:84            1 (const uint)
+0:84        'i' ( global int)
+0:86      Constant:
+0:86        1 (const int)
+0:87      Constant:
+0:87        1 (const int)
+0:88      Constant:
+0:88        1 (const int)
+0:89      array length ( temp int)
+0:89        abb: direct index for structure (layout( column_major shared) buffer runtime-sized array of float)
+0:89          'anon@0' (layout( column_major shared) buffer block{layout( column_major shared) buffer runtime-sized array of int aba, layout( column_major shared) buffer runtime-sized array of float abb})
+0:89          Constant:
+0:89            1 (const uint)
+0:91      direct index (layout( binding=1) temp samplerBuffer)
+0:91        'uniformTexelBufferDyn' (layout( binding=1) uniform runtime-sized array of samplerBuffer)
+0:91        Constant:
+0:91          1 (const int)
+0:92      direct index (layout( binding=2 r32f) temp imageBuffer)
+0:92        'storageTexelBufferDyn' (layout( binding=2 r32f) uniform runtime-sized array of imageBuffer)
+0:92        Constant:
+0:92          1 (const int)
+0:93      direct index (layout( binding=3 column_major shared) temp block{layout( column_major shared) uniform float a})
+0:93        'uniformBuffer' (layout( binding=3 column_major shared) uniform runtime-sized array of block{layout( column_major shared) uniform float a})
+0:93        Constant:
+0:93          1 (const int)
+0:94      direct index (layout( binding=4 column_major shared) temp block{layout( column_major shared) buffer float b})
+0:94        'storageBuffer' (layout( binding=4 column_major shared) buffer runtime-sized array of block{layout( column_major shared) buffer float b})
+0:94        Constant:
+0:94          1 (const int)
+0:95      direct index (layout( binding=5) temp sampler2D)
+0:95        'sampledImage' (layout( binding=5) uniform runtime-sized array of sampler2D)
+0:95        Constant:
+0:95          1 (const int)
+0:96      direct index (layout( binding=6 r32f) temp image2D)
+0:96        'storageImage' (layout( binding=6 r32f) uniform runtime-sized array of image2D)
+0:96        Constant:
+0:96          1 (const int)
+0:97      direct index (layout( binding=8) temp samplerBuffer)
+0:97        'uniformTexelBuffer' (layout( binding=8) uniform runtime-sized array of samplerBuffer)
+0:97        Constant:
+0:97          1 (const int)
+0:98      direct index (layout( binding=9 r32f) temp imageBuffer)
+0:98        'storageTexelBuffer' (layout( binding=9 r32f) uniform runtime-sized array of imageBuffer)
+0:98        Constant:
+0:98          1 (const int)
+0:100      indirect index (layout( binding=1) temp samplerBuffer)
+0:100        'uniformTexelBufferDyn' (layout( binding=1) uniform runtime-sized array of samplerBuffer)
+0:100        'i' ( global int)
+0:101      indirect index (layout( binding=2 r32f) temp imageBuffer)
+0:101        'storageTexelBufferDyn' (layout( binding=2 r32f) uniform runtime-sized array of imageBuffer)
+0:101        'i' ( global int)
+0:102      indirect index (layout( binding=3 column_major shared) temp block{layout( column_major shared) uniform float a})
+0:102        'uniformBuffer' (layout( binding=3 column_major shared) uniform runtime-sized array of block{layout( column_major shared) uniform float a})
+0:102        'i' ( global int)
+0:103      indirect index (layout( binding=4 column_major shared) temp block{layout( column_major shared) buffer float b})
+0:103        'storageBuffer' (layout( binding=4 column_major shared) buffer runtime-sized array of block{layout( column_major shared) buffer float b})
+0:103        'i' ( global int)
+0:104      indirect index (layout( binding=5) temp sampler2D)
+0:104        'sampledImage' (layout( binding=5) uniform runtime-sized array of sampler2D)
+0:104        'i' ( global int)
+0:105      indirect index (layout( binding=6 r32f) temp image2D)
+0:105        'storageImage' (layout( binding=6 r32f) uniform runtime-sized array of image2D)
+0:105        'i' ( global int)
+0:106      indirect index (layout( binding=8) temp samplerBuffer)
+0:106        'uniformTexelBuffer' (layout( binding=8) uniform runtime-sized array of samplerBuffer)
+0:106        'i' ( global int)
+0:107      indirect index (layout( binding=9 r32f) temp imageBuffer)
+0:107        'storageTexelBuffer' (layout( binding=9 r32f) uniform runtime-sized array of imageBuffer)
+0:107        'i' ( global int)
+0:109      Sequence
+0:109        move second child to first child ( temp unsized 1-element array of float)
+0:109          'local' ( temp unsized 1-element array of float)
+0:109          b: direct index for structure (layout( column_major shared) uniform runtime-sized array of float)
+0:109            'ubuf' (layout( column_major shared) uniform block{layout( column_major shared) uniform runtime-sized array of int a, layout( column_major shared) uniform runtime-sized array of float b})
+0:109            Constant:
+0:109              1 (const int)
+0:?   Linker Objects
+0:?     'buf' (layout( column_major shared) buffer block{layout( column_major shared) buffer runtime-sized array of int a, layout( column_major shared) buffer runtime-sized array of float b})
+0:?     'ubuf' (layout( column_major shared) uniform block{layout( column_major shared) uniform runtime-sized array of int a, layout( column_major shared) uniform runtime-sized array of float b})
+0:?     'bufa' (layout( column_major shared) buffer 4-element array of block{layout( column_major shared) buffer runtime-sized array of int a, layout( column_major shared) buffer runtime-sized array of float b})
+0:?     'ubufa' (layout( column_major shared) uniform 4-element array of block{layout( column_major shared) uniform runtime-sized array of int a, layout( column_major shared) uniform runtime-sized array of float b})
+0:?     'anon@0' (layout( column_major shared) buffer block{layout( column_major shared) buffer runtime-sized array of int aba, layout( column_major shared) buffer runtime-sized array of float abb})
+0:?     'anon@1' (layout( column_major shared) uniform block{layout( column_major shared) uniform runtime-sized array of int aua, layout( column_major shared) uniform runtime-sized array of float aub})
+0:?     'uniformTexelBufferDyn' (layout( binding=1) uniform runtime-sized array of samplerBuffer)
+0:?     'storageTexelBufferDyn' (layout( binding=2 r32f) uniform runtime-sized array of imageBuffer)
+0:?     'uniformBuffer' (layout( binding=3 column_major shared) uniform runtime-sized array of block{layout( column_major shared) uniform float a})
+0:?     'storageBuffer' (layout( binding=4 column_major shared) buffer runtime-sized array of block{layout( column_major shared) buffer float b})
+0:?     'sampledImage' (layout( binding=5) uniform runtime-sized array of sampler2D)
+0:?     'storageImage' (layout( binding=6 r32f) uniform runtime-sized array of image2D)
+0:?     'uniformTexelBuffer' (layout( binding=8) uniform runtime-sized array of samplerBuffer)
+0:?     'storageTexelBuffer' (layout( binding=9 r32f) uniform runtime-sized array of imageBuffer)
+0:?     'i' ( global int)
+0:?     'gl_VertexID' ( gl_VertexId int VertexId)
+0:?     'gl_InstanceID' ( gl_InstanceId int InstanceId)
+
+
+Linked vertex stage:
+
+
+Shader version: 450
+ERROR: node is still EOpNull!
+0:44  Function Definition: main( ( global void)
+0:44    Function Parameters: 
+0:46    Sequence
+0:46      direct index (layout( column_major shared) temp int)
+0:46        a: direct index for structure (layout( column_major shared) uniform runtime-sized array of int)
+0:46          'ubuf' (layout( column_major shared) uniform block{layout( column_major shared) uniform runtime-sized array of int a, layout( column_major shared) uniform runtime-sized array of float b})
+0:46          Constant:
+0:46            0 (const int)
+0:46        Constant:
+0:46          3 (const int)
+0:47      direct index (layout( column_major shared) temp float)
+0:47        b: direct index for structure (layout( column_major shared) uniform runtime-sized array of float)
+0:47          'ubuf' (layout( column_major shared) uniform block{layout( column_major shared) uniform runtime-sized array of int a, layout( column_major shared) uniform runtime-sized array of float b})
+0:47          Constant:
+0:47            1 (const int)
+0:47        Constant:
+0:47          3 (const int)
+0:48      direct index (layout( column_major shared) temp int)
+0:48        a: direct index for structure (layout( column_major shared) buffer runtime-sized array of int)
+0:48          'buf' (layout( column_major shared) buffer block{layout( column_major shared) buffer runtime-sized array of int a, layout( column_major shared) buffer runtime-sized array of float b})
+0:48          Constant:
+0:48            0 (const int)
+0:48        Constant:
+0:48          3 (const int)
+0:49      direct index (layout( column_major shared) temp float)
+0:49        b: direct index for structure (layout( column_major shared) buffer runtime-sized array of float)
+0:49          'buf' (layout( column_major shared) buffer block{layout( column_major shared) buffer runtime-sized array of int a, layout( column_major shared) buffer runtime-sized array of float b})
+0:49          Constant:
+0:49            1 (const int)
+0:49        Constant:
+0:49          3 (const int)
+0:51      direct index (layout( column_major shared) temp int)
+0:51        a: direct index for structure (layout( column_major shared) uniform runtime-sized array of int)
+0:51          direct index (layout( column_major shared) temp block{layout( column_major shared) uniform runtime-sized array of int a, layout( column_major shared) uniform runtime-sized array of float b})
+0:51            'ubufa' (layout( column_major shared) uniform 4-element array of block{layout( column_major shared) uniform runtime-sized array of int a, layout( column_major shared) uniform runtime-sized array of float b})
+0:51            Constant:
+0:51              3 (const int)
+0:51          Constant:
+0:51            0 (const int)
+0:51        Constant:
+0:51          3 (const int)
+0:52      direct index (layout( column_major shared) temp float)
+0:52        b: direct index for structure (layout( column_major shared) uniform runtime-sized array of float)
+0:52          direct index (layout( column_major shared) temp block{layout( column_major shared) uniform runtime-sized array of int a, layout( column_major shared) uniform runtime-sized array of float b})
+0:52            'ubufa' (layout( column_major shared) uniform 4-element array of block{layout( column_major shared) uniform runtime-sized array of int a, layout( column_major shared) uniform runtime-sized array of float b})
+0:52            Constant:
+0:52              3 (const int)
+0:52          Constant:
+0:52            1 (const int)
+0:52        Constant:
+0:52          3 (const int)
+0:53      direct index (layout( column_major shared) temp int)
+0:53        a: direct index for structure (layout( column_major shared) buffer runtime-sized array of int)
+0:53          direct index (layout( column_major shared) temp block{layout( column_major shared) buffer runtime-sized array of int a, layout( column_major shared) buffer runtime-sized array of float b})
+0:53            'bufa' (layout( column_major shared) buffer 4-element array of block{layout( column_major shared) buffer runtime-sized array of int a, layout( column_major shared) buffer runtime-sized array of float b})
+0:53            Constant:
+0:53              3 (const int)
+0:53          Constant:
+0:53            0 (const int)
+0:53        Constant:
+0:53          3 (const int)
+0:54      direct index (layout( column_major shared) temp float)
+0:54        b: direct index for structure (layout( column_major shared) buffer runtime-sized array of float)
+0:54          direct index (layout( column_major shared) temp block{layout( column_major shared) buffer runtime-sized array of int a, layout( column_major shared) buffer runtime-sized array of float b})
+0:54            'bufa' (layout( column_major shared) buffer 4-element array of block{layout( column_major shared) buffer runtime-sized array of int a, layout( column_major shared) buffer runtime-sized array of float b})
+0:54            Constant:
+0:54              3 (const int)
+0:54          Constant:
+0:54            1 (const int)
+0:54        Constant:
+0:54          3 (const int)
+0:56      direct index (layout( column_major shared) temp int)
+0:56        aua: direct index for structure (layout( column_major shared) uniform runtime-sized array of int)
+0:56          'anon@1' (layout( column_major shared) uniform block{layout( column_major shared) uniform runtime-sized array of int aua, layout( column_major shared) uniform runtime-sized array of float aub})
+0:56          Constant:
+0:56            0 (const uint)
+0:56        Constant:
+0:56          3 (const int)
+0:57      direct index (layout( column_major shared) temp float)
+0:57        aub: direct index for structure (layout( column_major shared) uniform runtime-sized array of float)
+0:57          'anon@1' (layout( column_major shared) uniform block{layout( column_major shared) uniform runtime-sized array of int aua, layout( column_major shared) uniform runtime-sized array of float aub})
+0:57          Constant:
+0:57            1 (const uint)
+0:57        Constant:
+0:57          3 (const int)
+0:58      direct index (layout( column_major shared) temp int)
+0:58        aba: direct index for structure (layout( column_major shared) buffer runtime-sized array of int)
+0:58          'anon@0' (layout( column_major shared) buffer block{layout( column_major shared) buffer runtime-sized array of int aba, layout( column_major shared) buffer runtime-sized array of float abb})
+0:58          Constant:
+0:58            0 (const uint)
+0:58        Constant:
+0:58          3 (const int)
+0:59      direct index (layout( column_major shared) temp float)
+0:59        abb: direct index for structure (layout( column_major shared) buffer runtime-sized array of float)
+0:59          'anon@0' (layout( column_major shared) buffer block{layout( column_major shared) buffer runtime-sized array of int aba, layout( column_major shared) buffer runtime-sized array of float abb})
+0:59          Constant:
+0:59            1 (const uint)
+0:59        Constant:
+0:59          3 (const int)
+0:61      indirect index (layout( column_major shared) temp int)
+0:61        a: direct index for structure (layout( column_major shared) uniform runtime-sized array of int)
+0:61          'ubuf' (layout( column_major shared) uniform block{layout( column_major shared) uniform runtime-sized array of int a, layout( column_major shared) uniform runtime-sized array of float b})
+0:61          Constant:
+0:61            0 (const int)
+0:61        'i' ( global int)
+0:62      indirect index (layout( column_major shared) temp float)
+0:62        b: direct index for structure (layout( column_major shared) uniform runtime-sized array of float)
+0:62          'ubuf' (layout( column_major shared) uniform block{layout( column_major shared) uniform runtime-sized array of int a, layout( column_major shared) uniform runtime-sized array of float b})
+0:62          Constant:
+0:62            1 (const int)
+0:62        'i' ( global int)
+0:63      indirect index (layout( column_major shared) temp int)
+0:63        a: direct index for structure (layout( column_major shared) buffer runtime-sized array of int)
+0:63          'buf' (layout( column_major shared) buffer block{layout( column_major shared) buffer runtime-sized array of int a, layout( column_major shared) buffer runtime-sized array of float b})
+0:63          Constant:
+0:63            0 (const int)
+0:63        'i' ( global int)
+0:64      indirect index (layout( column_major shared) temp float)
+0:64        b: direct index for structure (layout( column_major shared) buffer runtime-sized array of float)
+0:64          'buf' (layout( column_major shared) buffer block{layout( column_major shared) buffer runtime-sized array of int a, layout( column_major shared) buffer runtime-sized array of float b})
+0:64          Constant:
+0:64            1 (const int)
+0:64        'i' ( global int)
+0:66      Constant:
+0:66        1 (const int)
+0:67      Constant:
+0:67        1 (const int)
+0:68      Constant:
+0:68        1 (const int)
+0:69      array length ( temp int)
+0:69        b: direct index for structure (layout( column_major shared) buffer runtime-sized array of float)
+0:69          'buf' (layout( column_major shared) buffer block{layout( column_major shared) buffer runtime-sized array of int a, layout( column_major shared) buffer runtime-sized array of float b})
+0:69          Constant:
+0:69            1 (const int)
+0:71      indirect index (layout( column_major shared) temp int)
+0:71        a: direct index for structure (layout( column_major shared) uniform runtime-sized array of int)
+0:71          direct index (layout( column_major shared) temp block{layout( column_major shared) uniform runtime-sized array of int a, layout( column_major shared) uniform runtime-sized array of float b})
+0:71            'ubufa' (layout( column_major shared) uniform 4-element array of block{layout( column_major shared) uniform runtime-sized array of int a, layout( column_major shared) uniform runtime-sized array of float b})
+0:71            Constant:
+0:71              1 (const int)
+0:71          Constant:
+0:71            0 (const int)
+0:71        'i' ( global int)
+0:72      indirect index (layout( column_major shared) temp float)
+0:72        b: direct index for structure (layout( column_major shared) uniform runtime-sized array of float)
+0:72          direct index (layout( column_major shared) temp block{layout( column_major shared) uniform runtime-sized array of int a, layout( column_major shared) uniform runtime-sized array of float b})
+0:72            'ubufa' (layout( column_major shared) uniform 4-element array of block{layout( column_major shared) uniform runtime-sized array of int a, layout( column_major shared) uniform runtime-sized array of float b})
+0:72            Constant:
+0:72              1 (const int)
+0:72          Constant:
+0:72            1 (const int)
+0:72        'i' ( global int)
+0:73      indirect index (layout( column_major shared) temp int)
+0:73        a: direct index for structure (layout( column_major shared) buffer runtime-sized array of int)
+0:73          direct index (layout( column_major shared) temp block{layout( column_major shared) buffer runtime-sized array of int a, layout( column_major shared) buffer runtime-sized array of float b})
+0:73            'bufa' (layout( column_major shared) buffer 4-element array of block{layout( column_major shared) buffer runtime-sized array of int a, layout( column_major shared) buffer runtime-sized array of float b})
+0:73            Constant:
+0:73              1 (const int)
+0:73          Constant:
+0:73            0 (const int)
+0:73        'i' ( global int)
+0:74      indirect index (layout( column_major shared) temp float)
+0:74        b: direct index for structure (layout( column_major shared) buffer runtime-sized array of float)
+0:74          direct index (layout( column_major shared) temp block{layout( column_major shared) buffer runtime-sized array of int a, layout( column_major shared) buffer runtime-sized array of float b})
+0:74            'bufa' (layout( column_major shared) buffer 4-element array of block{layout( column_major shared) buffer runtime-sized array of int a, layout( column_major shared) buffer runtime-sized array of float b})
+0:74            Constant:
+0:74              1 (const int)
+0:74          Constant:
+0:74            1 (const int)
+0:74        'i' ( global int)
+0:76      Constant:
+0:76        1 (const int)
+0:77      Constant:
+0:77        1 (const int)
+0:78      Constant:
+0:78        1 (const int)
+0:79      array length ( temp int)
+0:79        b: direct index for structure (layout( column_major shared) buffer runtime-sized array of float)
+0:79          direct index (layout( column_major shared) temp block{layout( column_major shared) buffer runtime-sized array of int a, layout( column_major shared) buffer runtime-sized array of float b})
+0:79            'bufa' (layout( column_major shared) buffer 4-element array of block{layout( column_major shared) buffer runtime-sized array of int a, layout( column_major shared) buffer runtime-sized array of float b})
+0:79            Constant:
+0:79              1 (const int)
+0:79          Constant:
+0:79            1 (const int)
+0:81      indirect index (layout( column_major shared) temp int)
+0:81        aua: direct index for structure (layout( column_major shared) uniform runtime-sized array of int)
+0:81          'anon@1' (layout( column_major shared) uniform block{layout( column_major shared) uniform runtime-sized array of int aua, layout( column_major shared) uniform runtime-sized array of float aub})
+0:81          Constant:
+0:81            0 (const uint)
+0:81        'i' ( global int)
+0:82      indirect index (layout( column_major shared) temp float)
+0:82        aub: direct index for structure (layout( column_major shared) uniform runtime-sized array of float)
+0:82          'anon@1' (layout( column_major shared) uniform block{layout( column_major shared) uniform runtime-sized array of int aua, layout( column_major shared) uniform runtime-sized array of float aub})
+0:82          Constant:
+0:82            1 (const uint)
+0:82        'i' ( global int)
+0:83      indirect index (layout( column_major shared) temp int)
+0:83        aba: direct index for structure (layout( column_major shared) buffer runtime-sized array of int)
+0:83          'anon@0' (layout( column_major shared) buffer block{layout( column_major shared) buffer runtime-sized array of int aba, layout( column_major shared) buffer runtime-sized array of float abb})
+0:83          Constant:
+0:83            0 (const uint)
+0:83        'i' ( global int)
+0:84      indirect index (layout( column_major shared) temp float)
+0:84        abb: direct index for structure (layout( column_major shared) buffer runtime-sized array of float)
+0:84          'anon@0' (layout( column_major shared) buffer block{layout( column_major shared) buffer runtime-sized array of int aba, layout( column_major shared) buffer runtime-sized array of float abb})
+0:84          Constant:
+0:84            1 (const uint)
+0:84        'i' ( global int)
+0:86      Constant:
+0:86        1 (const int)
+0:87      Constant:
+0:87        1 (const int)
+0:88      Constant:
+0:88        1 (const int)
+0:89      array length ( temp int)
+0:89        abb: direct index for structure (layout( column_major shared) buffer runtime-sized array of float)
+0:89          'anon@0' (layout( column_major shared) buffer block{layout( column_major shared) buffer runtime-sized array of int aba, layout( column_major shared) buffer runtime-sized array of float abb})
+0:89          Constant:
+0:89            1 (const uint)
+0:91      direct index (layout( binding=1) temp samplerBuffer)
+0:91        'uniformTexelBufferDyn' (layout( binding=1) uniform runtime-sized array of samplerBuffer)
+0:91        Constant:
+0:91          1 (const int)
+0:92      direct index (layout( binding=2 r32f) temp imageBuffer)
+0:92        'storageTexelBufferDyn' (layout( binding=2 r32f) uniform runtime-sized array of imageBuffer)
+0:92        Constant:
+0:92          1 (const int)
+0:93      direct index (layout( binding=3 column_major shared) temp block{layout( column_major shared) uniform float a})
+0:93        'uniformBuffer' (layout( binding=3 column_major shared) uniform runtime-sized array of block{layout( column_major shared) uniform float a})
+0:93        Constant:
+0:93          1 (const int)
+0:94      direct index (layout( binding=4 column_major shared) temp block{layout( column_major shared) buffer float b})
+0:94        'storageBuffer' (layout( binding=4 column_major shared) buffer runtime-sized array of block{layout( column_major shared) buffer float b})
+0:94        Constant:
+0:94          1 (const int)
+0:95      direct index (layout( binding=5) temp sampler2D)
+0:95        'sampledImage' (layout( binding=5) uniform runtime-sized array of sampler2D)
+0:95        Constant:
+0:95          1 (const int)
+0:96      direct index (layout( binding=6 r32f) temp image2D)
+0:96        'storageImage' (layout( binding=6 r32f) uniform runtime-sized array of image2D)
+0:96        Constant:
+0:96          1 (const int)
+0:97      direct index (layout( binding=8) temp samplerBuffer)
+0:97        'uniformTexelBuffer' (layout( binding=8) uniform runtime-sized array of samplerBuffer)
+0:97        Constant:
+0:97          1 (const int)
+0:98      direct index (layout( binding=9 r32f) temp imageBuffer)
+0:98        'storageTexelBuffer' (layout( binding=9 r32f) uniform runtime-sized array of imageBuffer)
+0:98        Constant:
+0:98          1 (const int)
+0:100      indirect index (layout( binding=1) temp samplerBuffer)
+0:100        'uniformTexelBufferDyn' (layout( binding=1) uniform runtime-sized array of samplerBuffer)
+0:100        'i' ( global int)
+0:101      indirect index (layout( binding=2 r32f) temp imageBuffer)
+0:101        'storageTexelBufferDyn' (layout( binding=2 r32f) uniform runtime-sized array of imageBuffer)
+0:101        'i' ( global int)
+0:102      indirect index (layout( binding=3 column_major shared) temp block{layout( column_major shared) uniform float a})
+0:102        'uniformBuffer' (layout( binding=3 column_major shared) uniform runtime-sized array of block{layout( column_major shared) uniform float a})
+0:102        'i' ( global int)
+0:103      indirect index (layout( binding=4 column_major shared) temp block{layout( column_major shared) buffer float b})
+0:103        'storageBuffer' (layout( binding=4 column_major shared) buffer runtime-sized array of block{layout( column_major shared) buffer float b})
+0:103        'i' ( global int)
+0:104      indirect index (layout( binding=5) temp sampler2D)
+0:104        'sampledImage' (layout( binding=5) uniform runtime-sized array of sampler2D)
+0:104        'i' ( global int)
+0:105      indirect index (layout( binding=6 r32f) temp image2D)
+0:105        'storageImage' (layout( binding=6 r32f) uniform runtime-sized array of image2D)
+0:105        'i' ( global int)
+0:106      indirect index (layout( binding=8) temp samplerBuffer)
+0:106        'uniformTexelBuffer' (layout( binding=8) uniform runtime-sized array of samplerBuffer)
+0:106        'i' ( global int)
+0:107      indirect index (layout( binding=9 r32f) temp imageBuffer)
+0:107        'storageTexelBuffer' (layout( binding=9 r32f) uniform runtime-sized array of imageBuffer)
+0:107        'i' ( global int)
+0:109      Sequence
+0:109        move second child to first child ( temp 1-element array of float)
+0:109          'local' ( temp 1-element array of float)
+0:109          b: direct index for structure (layout( column_major shared) uniform runtime-sized array of float)
+0:109            'ubuf' (layout( column_major shared) uniform block{layout( column_major shared) uniform runtime-sized array of int a, layout( column_major shared) uniform runtime-sized array of float b})
+0:109            Constant:
+0:109              1 (const int)
+0:?   Linker Objects
+0:?     'buf' (layout( column_major shared) buffer block{layout( column_major shared) buffer runtime-sized array of int a, layout( column_major shared) buffer runtime-sized array of float b})
+0:?     'ubuf' (layout( column_major shared) uniform block{layout( column_major shared) uniform runtime-sized array of int a, layout( column_major shared) uniform runtime-sized array of float b})
+0:?     'bufa' (layout( column_major shared) buffer 4-element array of block{layout( column_major shared) buffer runtime-sized array of int a, layout( column_major shared) buffer runtime-sized array of float b})
+0:?     'ubufa' (layout( column_major shared) uniform 4-element array of block{layout( column_major shared) uniform runtime-sized array of int a, layout( column_major shared) uniform runtime-sized array of float b})
+0:?     'anon@0' (layout( column_major shared) buffer block{layout( column_major shared) buffer runtime-sized array of int aba, layout( column_major shared) buffer runtime-sized array of float abb})
+0:?     'anon@1' (layout( column_major shared) uniform block{layout( column_major shared) uniform runtime-sized array of int aua, layout( column_major shared) uniform runtime-sized array of float aub})
+0:?     'uniformTexelBufferDyn' (layout( binding=1) uniform runtime-sized array of samplerBuffer)
+0:?     'storageTexelBufferDyn' (layout( binding=2 r32f) uniform runtime-sized array of imageBuffer)
+0:?     'uniformBuffer' (layout( binding=3 column_major shared) uniform runtime-sized array of block{layout( column_major shared) uniform float a})
+0:?     'storageBuffer' (layout( binding=4 column_major shared) buffer runtime-sized array of block{layout( column_major shared) buffer float b})
+0:?     'sampledImage' (layout( binding=5) uniform runtime-sized array of sampler2D)
+0:?     'storageImage' (layout( binding=6 r32f) uniform runtime-sized array of image2D)
+0:?     'uniformTexelBuffer' (layout( binding=8) uniform runtime-sized array of samplerBuffer)
+0:?     'storageTexelBuffer' (layout( binding=9 r32f) uniform runtime-sized array of imageBuffer)
+0:?     'i' ( global int)
+0:?     'gl_VertexID' ( gl_VertexId int VertexId)
+0:?     'gl_InstanceID' ( gl_InstanceId int InstanceId)
+
diff --git a/Test/baseResults/samplerlessTextureFunctions.frag.out b/Test/baseResults/samplerlessTextureFunctions.frag.out
new file mode 100644
index 0000000..8ac8d4d
--- /dev/null
+++ b/Test/baseResults/samplerlessTextureFunctions.frag.out
@@ -0,0 +1,13 @@
+samplerlessTextureFunctions.frag
+ERROR: 0:9: 'texelFetch' : required extension not requested: GL_EXT_samplerless_texture_functions
+ERROR: 0:10: 'texelFetch' : required extension not requested: GL_EXT_samplerless_texture_functions
+ERROR: 0:16: 'texelFetchOffset' : required extension not requested: GL_EXT_samplerless_texture_functions
+ERROR: 0:18: 'textureSize' : required extension not requested: GL_EXT_samplerless_texture_functions
+ERROR: 0:19: 'textureSize' : required extension not requested: GL_EXT_samplerless_texture_functions
+ERROR: 0:20: 'textureSize' : required extension not requested: GL_EXT_samplerless_texture_functions
+ERROR: 0:22: 'textureQueryLevels' : required extension not requested: GL_EXT_samplerless_texture_functions
+ERROR: 0:24: 'textureSamples' : required extension not requested: GL_EXT_samplerless_texture_functions
+ERROR: 8 compilation errors.  No code generated.
+
+
+SPIR-V is not generated for failed compile or link
diff --git a/Test/baseResults/specExamples.frag.out b/Test/baseResults/specExamples.frag.out
index 939ea62..5eec3cb 100644
--- a/Test/baseResults/specExamples.frag.out
+++ b/Test/baseResults/specExamples.frag.out
@@ -1,5 +1,4 @@
 specExamples.frag
-Warning, version 430 is not yet complete; most version-specific features are present, but some are missing.
 ERROR: 0:6: '=' :  cannot convert from ' const uint' to ' global int'
 ERROR: 0:20: '' : numeric literal too big 
 ERROR: 0:21: '' : hexadecimal literal too big 
@@ -321,7 +320,7 @@
 0:?     'factor' (layout( location=3 index=1) out 4-component vector of float)
 0:?     'colors' (layout( location=2) out 3-element array of 4-component vector of float)
 0:?     'gl_FragDepth' ( gl_FragDepth float FragDepth)
-0:?     'anon@2' ( in block{ in float FogFragCoord gl_FogFragCoord,  in implicitly-sized array of 4-component vector of float TexCoord gl_TexCoord,  flat in 4-component vector of float Color gl_Color,  in 4-component vector of float SecondaryColor gl_SecondaryColor})
+0:?     'anon@2' ( in block{ in float FogFragCoord gl_FogFragCoord,  in unsized 1-element array of 4-component vector of float TexCoord gl_TexCoord,  flat in 4-component vector of float Color gl_Color,  in 4-component vector of float SecondaryColor gl_SecondaryColor})
 
 
 Linked fragment stage:
diff --git a/Test/baseResults/specExamples.vert.out b/Test/baseResults/specExamples.vert.out
index f050477..5c8ca39 100644
--- a/Test/baseResults/specExamples.vert.out
+++ b/Test/baseResults/specExamples.vert.out
@@ -1,5 +1,4 @@
 specExamples.vert
-Warning, version 430 is not yet complete; most version-specific features are present, but some are missing.
 ERROR: 0:29: 'location' : can only apply to uniform, buffer, in, or out storage qualifiers 
 ERROR: 0:31: 'triangles' : unrecognized layout identifier, or qualifier requires assignment (e.g., binding = 4) 
 ERROR: 0:31: 'invocations' : there is no such layout identifier for this stage taking an assigned value 
@@ -20,7 +19,6 @@
 ERROR: 0:87: 'binding' : atomic_uint binding is too large; see gl_MaxAtomicCounterBindings 
 ERROR: 0:89: 'binding' : atomic_uint binding is too large 
 ERROR: 0:91: 'bar' : redefinition 
-ERROR: 0:92: 'atomic_uint' : layout(binding=X) is required 
 ERROR: 0:94: 'a2' : redefinition 
 ERROR: 0:95: 'binding' : atomic_uint binding is too large; see gl_MaxAtomicCounterBindings 
 ERROR: 0:96: 'binding' : atomic_uint binding is too large; see gl_MaxAtomicCounterBindings 
@@ -33,7 +31,7 @@
 ERROR: 0:136: '' : function does not return a value: funcB
 ERROR: 0:153: '' : function does not return a value: func3
 ERROR: 0:170: 'coherent' : argument cannot drop memory qualifier when passed to formal parameter 
-ERROR: 33 compilation errors.  No code generated.
+ERROR: 32 compilation errors.  No code generated.
 
 
 Shader version: 430
@@ -278,7 +276,7 @@
 0:?   Linker Objects
 0:?     'Coords' ( out block{ out 4-component vector of float Position,  out 2-component vector of float Texture})
 0:?     'anon@0' ( out block{ out 4-component vector of float Color})
-0:?     'transforms' (layout( column_major shared) uniform 4-element array of block{layout( column_major shared) uniform 4X4 matrix of float ModelViewMatrix, layout( column_major shared) uniform 4X4 matrix of float ModelViewProjectionMatrix, layout( column_major shared) uniform implicitly-sized array of 4-component vector of float a, layout( column_major shared) uniform float Deformation})
+0:?     'transforms' (layout( column_major shared) uniform 4-element array of block{layout( column_major shared) uniform 4X4 matrix of float ModelViewMatrix, layout( column_major shared) uniform 4X4 matrix of float ModelViewProjectionMatrix, layout( column_major shared) uniform unsized 1-element array of 4-component vector of float a, layout( column_major shared) uniform float Deformation})
 0:?     'normal' (layout( location=3) in 4-component vector of float)
 0:?     'colors' (layout( location=6) in 3-element array of 4-component vector of float)
 0:?     'transforms2' (layout( location=9) in 2-element array of 4X4 matrix of float)
@@ -297,7 +295,7 @@
 0:?     'b2' (layout( binding=2) uniform atomic_uint)
 0:?     'c2' (layout( binding=3) uniform atomic_uint)
 0:?     'd2' (layout( binding=2) uniform atomic_uint)
-0:?     'anon@5' ( out block{ invariant gl_Position 4-component vector of float Position gl_Position,  gl_PointSize float PointSize gl_PointSize,  out implicitly-sized array of float ClipDistance gl_ClipDistance,  gl_ClipVertex 4-component vector of float ClipVertex gl_ClipVertex,  flat out 4-component vector of float FrontColor gl_FrontColor,  out 4-component vector of float BackColor gl_BackColor,  out 4-component vector of float FrontSecondaryColor gl_FrontSecondaryColor,  out 4-component vector of float BackSecondaryColor gl_BackSecondaryColor,  out implicitly-sized array of 4-component vector of float TexCoord gl_TexCoord,  out float FogFragCoord gl_FogFragCoord})
+0:?     'anon@5' ( out block{ invariant gl_Position 4-component vector of float Position gl_Position,  gl_PointSize float PointSize gl_PointSize,  out unsized 1-element array of float ClipDistance gl_ClipDistance,  gl_ClipVertex 4-component vector of float ClipVertex gl_ClipVertex,  flat out 4-component vector of float FrontColor gl_FrontColor,  out 4-component vector of float BackColor gl_BackColor,  out 4-component vector of float FrontSecondaryColor gl_FrontSecondaryColor,  out 4-component vector of float BackSecondaryColor gl_BackSecondaryColor,  out unsized 1-element array of 4-component vector of float TexCoord gl_TexCoord,  out float FogFragCoord gl_FogFragCoord})
 0:?     'ColorInv' ( smooth out 3-component vector of float)
 0:?     'Color4' ( invariant centroid smooth out 3-component vector of float)
 0:?     'position' ( noContraction smooth out 4-component vector of float)
diff --git a/Test/baseResults/specExamplesConf.vert.out b/Test/baseResults/specExamplesConf.vert.out
new file mode 100644
index 0000000..e721781
--- /dev/null
+++ b/Test/baseResults/specExamplesConf.vert.out
@@ -0,0 +1,599 @@
+specExamples.vert
+ERROR: 0:29: 'location' : can only apply to uniform, buffer, in, or out storage qualifiers 
+ERROR: 0:31: 'triangles' : unrecognized layout identifier, or qualifier requires assignment (e.g., binding = 4) 
+ERROR: 0:31: 'invocations' : there is no such layout identifier for this stage taking an assigned value 
+ERROR: 0:33: 'lines' : unrecognized layout identifier, or qualifier requires assignment (e.g., binding = 4) 
+ERROR: 0:35: 'triangle_strip' : unrecognized layout identifier, or qualifier requires assignment (e.g., binding = 4) 
+ERROR: 0:35: 'max_vertices' : there is no such layout identifier for this stage taking an assigned value 
+ERROR: 0:36: 'max_vertices' : there is no such layout identifier for this stage taking an assigned value 
+ERROR: 0:37: 'triangle_strip' : unrecognized layout identifier, or qualifier requires assignment (e.g., binding = 4) 
+ERROR: 0:41: 'stream' : there is no such layout identifier for this stage taking an assigned value 
+ERROR: 0:43: 'stream' : there is no such layout identifier for this stage taking an assigned value 
+ERROR: 0:45: 'stream' : there is no such layout identifier for this stage taking an assigned value 
+ERROR: 0:46: 'stream' : there is no such layout identifier for this stage taking an assigned value 
+ERROR: 0:47: 'stream' : there is no such layout identifier for this stage taking an assigned value 
+ERROR: 0:50: 'stream' : there is no such layout identifier for this stage taking an assigned value 
+ERROR: 0:55: 'stream' : there is no such layout identifier for this stage taking an assigned value 
+ERROR: 0:80: 's17' : redefinition 
+ERROR: 0:85: 'binding' : atomic_uint binding is too large; see gl_MaxAtomicCounterBindings 
+ERROR: 0:87: 'binding' : atomic_uint binding is too large; see gl_MaxAtomicCounterBindings 
+ERROR: 0:89: 'binding' : atomic_uint binding is too large 
+ERROR: 0:91: 'bar' : redefinition 
+ERROR: 0:92: 'atomic_uint' : layout(binding=X) is required 
+ERROR: 0:94: 'a2' : redefinition 
+ERROR: 0:95: 'binding' : atomic_uint binding is too large; see gl_MaxAtomicCounterBindings 
+ERROR: 0:96: 'binding' : atomic_uint binding is too large; see gl_MaxAtomicCounterBindings 
+ERROR: 0:97: 'binding' : atomic_uint binding is too large; see gl_MaxAtomicCounterBindings 
+ERROR: 0:106: '' : vertex input cannot be further qualified 
+ERROR: 0:106: 'redeclaration' : cannot change storage, memory, or auxiliary qualification of gl_FrontColor
+ERROR: 0:112: 'ColorIvn' : identifier not previously declared 
+ERROR: 0:132: 'shared' : not supported in this stage: vertex
+ERROR: 0:134: '' : function does not return a value: funcA
+ERROR: 0:136: '' : function does not return a value: funcB
+ERROR: 0:153: '' : function does not return a value: func3
+ERROR: 0:170: 'coherent' : argument cannot drop memory qualifier when passed to formal parameter 
+ERROR: 33 compilation errors.  No code generated.
+
+
+Shader version: 430
+Requested GL_3DL_array_objects
+ERROR: node is still EOpNull!
+0:134  Function Definition: funcA(I21; ( global 4-component vector of float)
+0:134    Function Parameters: 
+0:134      'a' ( restrict in image2D)
+0:136  Function Definition: funcB(I21; ( global 4-component vector of float)
+0:136    Function Parameters: 
+0:136      'a' ( in image2D)
+0:140  Function Definition: func(f1;f1;f1;f1; ( global float)
+0:140    Function Parameters: 
+0:140      'e' ( in float)
+0:140      'f' ( in float)
+0:140      'g' ( in float)
+0:140      'h' ( in float)
+0:142    Sequence
+0:142      Branch: Return with expression
+0:142        add ( temp float)
+0:142          component-wise multiply ( temp float)
+0:142            'e' ( in float)
+0:142            'f' ( in float)
+0:142          component-wise multiply ( temp float)
+0:142            'g' ( in float)
+0:142            'h' ( in float)
+0:146  Function Definition: func2(f1;f1;f1;f1; ( global float)
+0:146    Function Parameters: 
+0:146      'e' ( in float)
+0:146      'f' ( in float)
+0:146      'g' ( in float)
+0:146      'h' ( in float)
+0:148    Sequence
+0:148      Sequence
+0:148        move second child to first child ( temp float)
+0:148          'result' ( noContraction temp float)
+0:148          add ( temp float)
+0:148            component-wise multiply ( temp float)
+0:148              'e' ( in float)
+0:148              'f' ( in float)
+0:148            component-wise multiply ( temp float)
+0:148              'g' ( in float)
+0:148              'h' ( in float)
+0:150      Branch: Return with expression
+0:150        'result' ( noContraction temp float)
+0:153  Function Definition: func3(f1;f1;f1; ( global float)
+0:153    Function Parameters: 
+0:153      'i' ( in float)
+0:153      'j' ( in float)
+0:153      'k' ( noContraction out float)
+0:155    Sequence
+0:155      move second child to first child ( temp float)
+0:155        'k' ( noContraction out float)
+0:155        add ( temp float)
+0:155          component-wise multiply ( temp float)
+0:155            'i' ( in float)
+0:155            'i' ( in float)
+0:155          'j' ( in float)
+0:158  Function Definition: main( ( global void)
+0:158    Function Parameters: 
+0:160    Sequence
+0:160      Sequence
+0:160        move second child to first child ( temp 3-component vector of float)
+0:160          'r' ( temp 3-component vector of float)
+0:160          Construct vec3 ( temp 3-component vector of float)
+0:160            component-wise multiply ( temp 4-component vector of float)
+0:160              'a' ( in 4-component vector of float)
+0:160              'b' ( in 4-component vector of float)
+0:161      Sequence
+0:161        move second child to first child ( temp 3-component vector of float)
+0:161          's' ( temp 3-component vector of float)
+0:161          Construct vec3 ( temp 3-component vector of float)
+0:161            component-wise multiply ( temp 4-component vector of float)
+0:161              'c' ( in 4-component vector of float)
+0:161              'd' ( in 4-component vector of float)
+0:162      move second child to first child ( temp 3-component vector of float)
+0:162        vector swizzle ( noContraction temp 3-component vector of float)
+0:162          'v' ( noContraction smooth out 4-component vector of float)
+0:162          Sequence
+0:162            Constant:
+0:162              0 (const int)
+0:162            Constant:
+0:162              1 (const int)
+0:162            Constant:
+0:162              2 (const int)
+0:162        add ( temp 3-component vector of float)
+0:162          'r' ( temp 3-component vector of float)
+0:162          's' ( temp 3-component vector of float)
+0:163      move second child to first child ( temp float)
+0:163        direct index ( noContraction temp float)
+0:163          'v' ( noContraction smooth out 4-component vector of float)
+0:163          Constant:
+0:163            3 (const int)
+0:163        add ( temp float)
+0:163          component-wise multiply ( temp float)
+0:163            direct index ( temp float)
+0:163              'a' ( in 4-component vector of float)
+0:163              Constant:
+0:163                3 (const int)
+0:163            direct index ( temp float)
+0:163              'b' ( in 4-component vector of float)
+0:163              Constant:
+0:163                3 (const int)
+0:163          component-wise multiply ( temp float)
+0:163            direct index ( temp float)
+0:163              'c' ( in 4-component vector of float)
+0:163              Constant:
+0:163                3 (const int)
+0:163            direct index ( temp float)
+0:163              'd' ( in 4-component vector of float)
+0:163              Constant:
+0:163                3 (const int)
+0:164      move second child to first child ( temp float)
+0:164        direct index ( noContraction temp float)
+0:164          'v' ( noContraction smooth out 4-component vector of float)
+0:164          Constant:
+0:164            0 (const int)
+0:164        Function Call: func(f1;f1;f1;f1; ( global float)
+0:164          direct index ( temp float)
+0:164            'a' ( in 4-component vector of float)
+0:164            Constant:
+0:164              0 (const int)
+0:164          direct index ( temp float)
+0:164            'b' ( in 4-component vector of float)
+0:164            Constant:
+0:164              0 (const int)
+0:164          direct index ( temp float)
+0:164            'c' ( in 4-component vector of float)
+0:164            Constant:
+0:164              0 (const int)
+0:164          direct index ( temp float)
+0:164            'd' ( in 4-component vector of float)
+0:164            Constant:
+0:164              0 (const int)
+0:166      move second child to first child ( temp float)
+0:166        direct index ( noContraction temp float)
+0:166          'v' ( noContraction smooth out 4-component vector of float)
+0:166          Constant:
+0:166            0 (const int)
+0:166        Function Call: func2(f1;f1;f1;f1; ( global float)
+0:166          direct index ( temp float)
+0:166            'a' ( in 4-component vector of float)
+0:166            Constant:
+0:166              0 (const int)
+0:166          direct index ( temp float)
+0:166            'b' ( in 4-component vector of float)
+0:166            Constant:
+0:166              0 (const int)
+0:166          direct index ( temp float)
+0:166            'c' ( in 4-component vector of float)
+0:166            Constant:
+0:166              0 (const int)
+0:166          direct index ( temp float)
+0:166            'd' ( in 4-component vector of float)
+0:166            Constant:
+0:166              0 (const int)
+0:167      Function Call: func3(f1;f1;f1; ( global float)
+0:167        component-wise multiply ( temp float)
+0:167          direct index ( temp float)
+0:167            'a' ( in 4-component vector of float)
+0:167            Constant:
+0:167              0 (const int)
+0:167          direct index ( temp float)
+0:167            'b' ( in 4-component vector of float)
+0:167            Constant:
+0:167              0 (const int)
+0:167        component-wise multiply ( temp float)
+0:167          direct index ( temp float)
+0:167            'c' ( in 4-component vector of float)
+0:167            Constant:
+0:167              0 (const int)
+0:167          direct index ( temp float)
+0:167            'd' ( in 4-component vector of float)
+0:167            Constant:
+0:167              0 (const int)
+0:167        direct index ( noContraction temp float)
+0:167          'v' ( noContraction smooth out 4-component vector of float)
+0:167          Constant:
+0:167            0 (const int)
+0:169      Function Call: funcA(I21; ( global 4-component vector of float)
+0:169        'img1' (layout( rgba32f) uniform image2D)
+0:170      Function Call: funcB(I21; ( global 4-component vector of float)
+0:170        'img2' (layout( rgba32f) coherent uniform image2D)
+0:?       Sequence
+0:178        Sequence
+0:178          move second child to first child ( temp structure{ temp float intensity,  temp 3-component vector of float position})
+0:178            'lightVar' ( temp structure{ temp float intensity,  temp 3-component vector of float position})
+0:178            Constant:
+0:178              3.000000
+0:178              1.000000
+0:178              2.000000
+0:178              3.000000
+0:?       Sequence
+0:185        Sequence
+0:185          move second child to first child ( temp 5-element array of float)
+0:185            'a' ( temp 5-element array of float)
+0:185            Construct float ( temp 5-element array of float)
+0:185              'g' ( temp float)
+0:185              Constant:
+0:185                1.000000
+0:185              'g' ( temp float)
+0:185              Constant:
+0:185                2.300000
+0:185              'g' ( temp float)
+0:188        move second child to first child ( temp 3-element array of float)
+0:188          'b' ( temp 3-element array of float)
+0:188          Construct float ( temp 3-element array of float)
+0:188            'g' ( temp float)
+0:188            add ( temp float)
+0:188              'g' ( temp float)
+0:188              Constant:
+0:188                1.000000
+0:188            add ( temp float)
+0:188              'g' ( temp float)
+0:188              Constant:
+0:188                2.000000
+0:191      Sequence
+0:191        Sequence
+0:191          move second child to first child ( temp 2-element array of 4-component vector of float)
+0:191            'b' ( temp 2-element array of 4-component vector of float)
+0:191            Constant:
+0:191              1.000000
+0:191              1.000000
+0:191              1.000000
+0:191              1.000000
+0:191              1.000000
+0:191              1.000000
+0:191              1.000000
+0:191              1.000000
+0:192        Construct vec4 ( temp 3-element array of 2-element array of 4-component vector of float)
+0:192          'b' ( temp 2-element array of 4-component vector of float)
+0:192          'b' ( temp 2-element array of 4-component vector of float)
+0:192          'b' ( temp 2-element array of 4-component vector of float)
+0:193        Construct vec4 ( temp 3-element array of 2-element array of 4-component vector of float)
+0:193          'b' ( temp 2-element array of 4-component vector of float)
+0:193          'b' ( temp 2-element array of 4-component vector of float)
+0:193          'b' ( temp 2-element array of 4-component vector of float)
+0:194        Construct vec4 ( temp 3-element array of 2-element array of 4-component vector of float)
+0:194          'b' ( temp 2-element array of 4-component vector of float)
+0:194          'b' ( temp 2-element array of 4-component vector of float)
+0:194          'b' ( temp 2-element array of 4-component vector of float)
+0:?   Linker Objects
+0:?     'Coords' ( out block{ out 4-component vector of float Position,  out 2-component vector of float Texture})
+0:?     'anon@0' ( out block{ out 4-component vector of float Color})
+0:?     'transforms' (layout( column_major shared) uniform 4-element array of block{layout( column_major shared) uniform 4X4 matrix of float ModelViewMatrix, layout( column_major shared) uniform 4X4 matrix of float ModelViewProjectionMatrix, layout( column_major shared) uniform unsized 1-element array of 4-component vector of float a, layout( column_major shared) uniform float Deformation})
+0:?     'normal' (layout( location=3) in 4-component vector of float)
+0:?     'colors' (layout( location=6) in 3-element array of 4-component vector of float)
+0:?     'transforms2' (layout( location=9) in 2-element array of 4X4 matrix of float)
+0:?     's' (layout( location=3) temp structure{ global 3-component vector of float a1,  global 2X2 matrix of float b,  global 2-element array of 4-component vector of float c})
+0:?     'var1' ( smooth out 4-component vector of float)
+0:?     'anon@1' ( out block{ out 4-component vector of float var2,  out 2-component vector of float var3,  out 3-component vector of float var4})
+0:?     'var5' ( smooth out 4-component vector of float)
+0:?     'anon@2' ( out block{ out 4-component vector of float var6})
+0:?     'var7' ( smooth out 4-component vector of float)
+0:?     'anon@3' (layout( row_major std140) uniform block{layout( row_major std140 offset=0) uniform 4X4 matrix of float M1, layout( column_major std140 offset=64) uniform 4X4 matrix of float M2, layout( row_major std140 offset=128) uniform 3X3 matrix of float N1})
+0:?     'anon@4' (layout( column_major shared) uniform block{layout( column_major shared) uniform 4X4 matrix of float M13, layout( row_major shared) uniform 4X4 matrix of float m14, layout( column_major shared) uniform 3X3 matrix of float N12})
+0:?     's17' (layout( binding=3) uniform sampler2D)
+0:?     'a2' (layout( binding=2 offset=4) uniform atomic_uint)
+0:?     'bar' (layout( binding=2) uniform atomic_uint)
+0:?     'bar23' (layout( offset=8) uniform atomic_uint)
+0:?     'b2' (layout( binding=2) uniform atomic_uint)
+0:?     'c2' (layout( binding=3) uniform atomic_uint)
+0:?     'd2' (layout( binding=2) uniform atomic_uint)
+0:?     'anon@5' ( out block{ invariant gl_Position 4-component vector of float Position gl_Position,  gl_PointSize float PointSize gl_PointSize,  out unsized 1-element array of float ClipDistance gl_ClipDistance,  gl_ClipVertex 4-component vector of float ClipVertex gl_ClipVertex,  flat out 4-component vector of float FrontColor gl_FrontColor,  out 4-component vector of float BackColor gl_BackColor,  out 4-component vector of float FrontSecondaryColor gl_FrontSecondaryColor,  out 4-component vector of float BackSecondaryColor gl_BackSecondaryColor,  out unsized 1-element array of 4-component vector of float TexCoord gl_TexCoord,  out float FogFragCoord gl_FogFragCoord})
+0:?     'ColorInv' ( smooth out 3-component vector of float)
+0:?     'Color4' ( invariant centroid smooth out 3-component vector of float)
+0:?     'position' ( noContraction smooth out 4-component vector of float)
+0:?     'Color5' ( noContraction smooth out 3-component vector of float)
+0:?     'a' ( in 4-component vector of float)
+0:?     'b' ( in 4-component vector of float)
+0:?     'c' ( in 4-component vector of float)
+0:?     'd' ( in 4-component vector of float)
+0:?     'v' ( noContraction smooth out 4-component vector of float)
+0:?     'anon@6' (layout( column_major shared) coherent buffer block{layout( column_major shared) readonly buffer 4-component vector of float member1, layout( column_major shared) buffer 4-component vector of float member2})
+0:?     'anon@7' (layout( column_major shared) buffer block{layout( column_major shared) coherent readonly buffer 4-component vector of float member1A, layout( column_major shared) coherent buffer 4-component vector of float member2A})
+0:?     'shv' ( shared 4-component vector of float)
+0:?     'img1' (layout( rgba32f) uniform image2D)
+0:?     'img2' (layout( rgba32f) coherent uniform image2D)
+0:?     'gl_VertexID' ( gl_VertexId int VertexId)
+0:?     'gl_InstanceID' ( gl_InstanceId int InstanceId)
+
+
+Linked vertex stage:
+
+
+Shader version: 430
+Requested GL_3DL_array_objects
+ERROR: node is still EOpNull!
+0:134  Function Definition: funcA(I21; ( global 4-component vector of float)
+0:134    Function Parameters: 
+0:134      'a' ( restrict in image2D)
+0:136  Function Definition: funcB(I21; ( global 4-component vector of float)
+0:136    Function Parameters: 
+0:136      'a' ( in image2D)
+0:140  Function Definition: func(f1;f1;f1;f1; ( global float)
+0:140    Function Parameters: 
+0:140      'e' ( in float)
+0:140      'f' ( in float)
+0:140      'g' ( in float)
+0:140      'h' ( in float)
+0:142    Sequence
+0:142      Branch: Return with expression
+0:142        add ( temp float)
+0:142          component-wise multiply ( temp float)
+0:142            'e' ( in float)
+0:142            'f' ( in float)
+0:142          component-wise multiply ( temp float)
+0:142            'g' ( in float)
+0:142            'h' ( in float)
+0:146  Function Definition: func2(f1;f1;f1;f1; ( global float)
+0:146    Function Parameters: 
+0:146      'e' ( in float)
+0:146      'f' ( in float)
+0:146      'g' ( in float)
+0:146      'h' ( in float)
+0:148    Sequence
+0:148      Sequence
+0:148        move second child to first child ( temp float)
+0:148          'result' ( noContraction temp float)
+0:148          add ( temp float)
+0:148            component-wise multiply ( temp float)
+0:148              'e' ( in float)
+0:148              'f' ( in float)
+0:148            component-wise multiply ( temp float)
+0:148              'g' ( in float)
+0:148              'h' ( in float)
+0:150      Branch: Return with expression
+0:150        'result' ( noContraction temp float)
+0:153  Function Definition: func3(f1;f1;f1; ( global float)
+0:153    Function Parameters: 
+0:153      'i' ( in float)
+0:153      'j' ( in float)
+0:153      'k' ( noContraction out float)
+0:155    Sequence
+0:155      move second child to first child ( temp float)
+0:155        'k' ( noContraction out float)
+0:155        add ( temp float)
+0:155          component-wise multiply ( temp float)
+0:155            'i' ( in float)
+0:155            'i' ( in float)
+0:155          'j' ( in float)
+0:158  Function Definition: main( ( global void)
+0:158    Function Parameters: 
+0:160    Sequence
+0:160      Sequence
+0:160        move second child to first child ( temp 3-component vector of float)
+0:160          'r' ( temp 3-component vector of float)
+0:160          Construct vec3 ( temp 3-component vector of float)
+0:160            component-wise multiply ( temp 4-component vector of float)
+0:160              'a' ( in 4-component vector of float)
+0:160              'b' ( in 4-component vector of float)
+0:161      Sequence
+0:161        move second child to first child ( temp 3-component vector of float)
+0:161          's' ( temp 3-component vector of float)
+0:161          Construct vec3 ( temp 3-component vector of float)
+0:161            component-wise multiply ( temp 4-component vector of float)
+0:161              'c' ( in 4-component vector of float)
+0:161              'd' ( in 4-component vector of float)
+0:162      move second child to first child ( temp 3-component vector of float)
+0:162        vector swizzle ( noContraction temp 3-component vector of float)
+0:162          'v' ( noContraction smooth out 4-component vector of float)
+0:162          Sequence
+0:162            Constant:
+0:162              0 (const int)
+0:162            Constant:
+0:162              1 (const int)
+0:162            Constant:
+0:162              2 (const int)
+0:162        add ( temp 3-component vector of float)
+0:162          'r' ( temp 3-component vector of float)
+0:162          's' ( temp 3-component vector of float)
+0:163      move second child to first child ( temp float)
+0:163        direct index ( noContraction temp float)
+0:163          'v' ( noContraction smooth out 4-component vector of float)
+0:163          Constant:
+0:163            3 (const int)
+0:163        add ( temp float)
+0:163          component-wise multiply ( temp float)
+0:163            direct index ( temp float)
+0:163              'a' ( in 4-component vector of float)
+0:163              Constant:
+0:163                3 (const int)
+0:163            direct index ( temp float)
+0:163              'b' ( in 4-component vector of float)
+0:163              Constant:
+0:163                3 (const int)
+0:163          component-wise multiply ( temp float)
+0:163            direct index ( temp float)
+0:163              'c' ( in 4-component vector of float)
+0:163              Constant:
+0:163                3 (const int)
+0:163            direct index ( temp float)
+0:163              'd' ( in 4-component vector of float)
+0:163              Constant:
+0:163                3 (const int)
+0:164      move second child to first child ( temp float)
+0:164        direct index ( noContraction temp float)
+0:164          'v' ( noContraction smooth out 4-component vector of float)
+0:164          Constant:
+0:164            0 (const int)
+0:164        Function Call: func(f1;f1;f1;f1; ( global float)
+0:164          direct index ( temp float)
+0:164            'a' ( in 4-component vector of float)
+0:164            Constant:
+0:164              0 (const int)
+0:164          direct index ( temp float)
+0:164            'b' ( in 4-component vector of float)
+0:164            Constant:
+0:164              0 (const int)
+0:164          direct index ( temp float)
+0:164            'c' ( in 4-component vector of float)
+0:164            Constant:
+0:164              0 (const int)
+0:164          direct index ( temp float)
+0:164            'd' ( in 4-component vector of float)
+0:164            Constant:
+0:164              0 (const int)
+0:166      move second child to first child ( temp float)
+0:166        direct index ( noContraction temp float)
+0:166          'v' ( noContraction smooth out 4-component vector of float)
+0:166          Constant:
+0:166            0 (const int)
+0:166        Function Call: func2(f1;f1;f1;f1; ( global float)
+0:166          direct index ( temp float)
+0:166            'a' ( in 4-component vector of float)
+0:166            Constant:
+0:166              0 (const int)
+0:166          direct index ( temp float)
+0:166            'b' ( in 4-component vector of float)
+0:166            Constant:
+0:166              0 (const int)
+0:166          direct index ( temp float)
+0:166            'c' ( in 4-component vector of float)
+0:166            Constant:
+0:166              0 (const int)
+0:166          direct index ( temp float)
+0:166            'd' ( in 4-component vector of float)
+0:166            Constant:
+0:166              0 (const int)
+0:167      Function Call: func3(f1;f1;f1; ( global float)
+0:167        component-wise multiply ( temp float)
+0:167          direct index ( temp float)
+0:167            'a' ( in 4-component vector of float)
+0:167            Constant:
+0:167              0 (const int)
+0:167          direct index ( temp float)
+0:167            'b' ( in 4-component vector of float)
+0:167            Constant:
+0:167              0 (const int)
+0:167        component-wise multiply ( temp float)
+0:167          direct index ( temp float)
+0:167            'c' ( in 4-component vector of float)
+0:167            Constant:
+0:167              0 (const int)
+0:167          direct index ( temp float)
+0:167            'd' ( in 4-component vector of float)
+0:167            Constant:
+0:167              0 (const int)
+0:167        direct index ( noContraction temp float)
+0:167          'v' ( noContraction smooth out 4-component vector of float)
+0:167          Constant:
+0:167            0 (const int)
+0:169      Function Call: funcA(I21; ( global 4-component vector of float)
+0:169        'img1' (layout( rgba32f) uniform image2D)
+0:170      Function Call: funcB(I21; ( global 4-component vector of float)
+0:170        'img2' (layout( rgba32f) coherent uniform image2D)
+0:?       Sequence
+0:178        Sequence
+0:178          move second child to first child ( temp structure{ temp float intensity,  temp 3-component vector of float position})
+0:178            'lightVar' ( temp structure{ temp float intensity,  temp 3-component vector of float position})
+0:178            Constant:
+0:178              3.000000
+0:178              1.000000
+0:178              2.000000
+0:178              3.000000
+0:?       Sequence
+0:185        Sequence
+0:185          move second child to first child ( temp 5-element array of float)
+0:185            'a' ( temp 5-element array of float)
+0:185            Construct float ( temp 5-element array of float)
+0:185              'g' ( temp float)
+0:185              Constant:
+0:185                1.000000
+0:185              'g' ( temp float)
+0:185              Constant:
+0:185                2.300000
+0:185              'g' ( temp float)
+0:188        move second child to first child ( temp 3-element array of float)
+0:188          'b' ( temp 3-element array of float)
+0:188          Construct float ( temp 3-element array of float)
+0:188            'g' ( temp float)
+0:188            add ( temp float)
+0:188              'g' ( temp float)
+0:188              Constant:
+0:188                1.000000
+0:188            add ( temp float)
+0:188              'g' ( temp float)
+0:188              Constant:
+0:188                2.000000
+0:191      Sequence
+0:191        Sequence
+0:191          move second child to first child ( temp 2-element array of 4-component vector of float)
+0:191            'b' ( temp 2-element array of 4-component vector of float)
+0:191            Constant:
+0:191              1.000000
+0:191              1.000000
+0:191              1.000000
+0:191              1.000000
+0:191              1.000000
+0:191              1.000000
+0:191              1.000000
+0:191              1.000000
+0:192        Construct vec4 ( temp 3-element array of 2-element array of 4-component vector of float)
+0:192          'b' ( temp 2-element array of 4-component vector of float)
+0:192          'b' ( temp 2-element array of 4-component vector of float)
+0:192          'b' ( temp 2-element array of 4-component vector of float)
+0:193        Construct vec4 ( temp 3-element array of 2-element array of 4-component vector of float)
+0:193          'b' ( temp 2-element array of 4-component vector of float)
+0:193          'b' ( temp 2-element array of 4-component vector of float)
+0:193          'b' ( temp 2-element array of 4-component vector of float)
+0:194        Construct vec4 ( temp 3-element array of 2-element array of 4-component vector of float)
+0:194          'b' ( temp 2-element array of 4-component vector of float)
+0:194          'b' ( temp 2-element array of 4-component vector of float)
+0:194          'b' ( temp 2-element array of 4-component vector of float)
+0:?   Linker Objects
+0:?     'Coords' ( out block{ out 4-component vector of float Position,  out 2-component vector of float Texture})
+0:?     'anon@0' ( out block{ out 4-component vector of float Color})
+0:?     'transforms' (layout( column_major shared) uniform 4-element array of block{layout( column_major shared) uniform 4X4 matrix of float ModelViewMatrix, layout( column_major shared) uniform 4X4 matrix of float ModelViewProjectionMatrix, layout( column_major shared) uniform 1-element array of 4-component vector of float a, layout( column_major shared) uniform float Deformation})
+0:?     'normal' (layout( location=3) in 4-component vector of float)
+0:?     'colors' (layout( location=6) in 3-element array of 4-component vector of float)
+0:?     'transforms2' (layout( location=9) in 2-element array of 4X4 matrix of float)
+0:?     's' (layout( location=3) temp structure{ global 3-component vector of float a1,  global 2X2 matrix of float b,  global 2-element array of 4-component vector of float c})
+0:?     'var1' ( smooth out 4-component vector of float)
+0:?     'anon@1' ( out block{ out 4-component vector of float var2,  out 2-component vector of float var3,  out 3-component vector of float var4})
+0:?     'var5' ( smooth out 4-component vector of float)
+0:?     'anon@2' ( out block{ out 4-component vector of float var6})
+0:?     'var7' ( smooth out 4-component vector of float)
+0:?     'anon@3' (layout( row_major std140) uniform block{layout( row_major std140 offset=0) uniform 4X4 matrix of float M1, layout( column_major std140 offset=64) uniform 4X4 matrix of float M2, layout( row_major std140 offset=128) uniform 3X3 matrix of float N1})
+0:?     'anon@4' (layout( column_major shared) uniform block{layout( column_major shared) uniform 4X4 matrix of float M13, layout( row_major shared) uniform 4X4 matrix of float m14, layout( column_major shared) uniform 3X3 matrix of float N12})
+0:?     's17' (layout( binding=3) uniform sampler2D)
+0:?     'a2' (layout( binding=2 offset=4) uniform atomic_uint)
+0:?     'bar' (layout( binding=2) uniform atomic_uint)
+0:?     'bar23' (layout( offset=8) uniform atomic_uint)
+0:?     'b2' (layout( binding=2) uniform atomic_uint)
+0:?     'c2' (layout( binding=3) uniform atomic_uint)
+0:?     'd2' (layout( binding=2) uniform atomic_uint)
+0:?     'anon@5' ( out block{ invariant gl_Position 4-component vector of float Position gl_Position,  gl_PointSize float PointSize gl_PointSize,  out 1-element array of float ClipDistance gl_ClipDistance,  gl_ClipVertex 4-component vector of float ClipVertex gl_ClipVertex,  flat out 4-component vector of float FrontColor gl_FrontColor,  out 4-component vector of float BackColor gl_BackColor,  out 4-component vector of float FrontSecondaryColor gl_FrontSecondaryColor,  out 4-component vector of float BackSecondaryColor gl_BackSecondaryColor,  out 1-element array of 4-component vector of float TexCoord gl_TexCoord,  out float FogFragCoord gl_FogFragCoord})
+0:?     'ColorInv' ( smooth out 3-component vector of float)
+0:?     'Color4' ( invariant centroid smooth out 3-component vector of float)
+0:?     'position' ( noContraction smooth out 4-component vector of float)
+0:?     'Color5' ( noContraction smooth out 3-component vector of float)
+0:?     'a' ( in 4-component vector of float)
+0:?     'b' ( in 4-component vector of float)
+0:?     'c' ( in 4-component vector of float)
+0:?     'd' ( in 4-component vector of float)
+0:?     'v' ( noContraction smooth out 4-component vector of float)
+0:?     'anon@6' (layout( column_major shared) coherent buffer block{layout( column_major shared) readonly buffer 4-component vector of float member1, layout( column_major shared) buffer 4-component vector of float member2})
+0:?     'anon@7' (layout( column_major shared) buffer block{layout( column_major shared) coherent readonly buffer 4-component vector of float member1A, layout( column_major shared) coherent buffer 4-component vector of float member2A})
+0:?     'shv' ( shared 4-component vector of float)
+0:?     'img1' (layout( rgba32f) uniform image2D)
+0:?     'img2' (layout( rgba32f) coherent uniform image2D)
+0:?     'gl_VertexID' ( gl_VertexId int VertexId)
+0:?     'gl_InstanceID' ( gl_InstanceId int InstanceId)
+
diff --git a/Test/baseResults/spv.1.3.8bitstorage-ssbo.vert.out b/Test/baseResults/spv.1.3.8bitstorage-ssbo.vert.out
new file mode 100644
index 0000000..878aa1a
--- /dev/null
+++ b/Test/baseResults/spv.1.3.8bitstorage-ssbo.vert.out
@@ -0,0 +1,56 @@
+spv.1.3.8bitstorage-ssbo.vert
+// Module Version 10300
+// Generated by (magic number): 80007
+// Id's are bound by 28
+
+                              Capability Shader
+                              Capability CapabilityStorageBuffer8BitAccess
+                              Extension  "SPV_KHR_8bit_storage"
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Vertex 4  "main" 9 18
+                              Source GLSL 450
+                              SourceExtension  "GL_EXT_shader_8bit_storage"
+                              Name 4  "main"
+                              Name 9  "color"
+                              Name 12  "Vertices"
+                              MemberName 12(Vertices) 0  "vertices"
+                              Name 14  ""
+                              Name 18  "gl_VertexIndex"
+                              Decorate 9(color) Location 0
+                              Decorate 11 ArrayStride 1
+                              MemberDecorate 12(Vertices) 0 NonWritable
+                              MemberDecorate 12(Vertices) 0 Offset 0
+                              Decorate 12(Vertices) Block
+                              Decorate 14 DescriptorSet 0
+                              Decorate 14 Binding 0
+                              Decorate 18(gl_VertexIndex) BuiltIn VertexIndex
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+               8:             TypePointer Output 7(fvec4)
+        9(color):      8(ptr) Variable Output
+              10:             TypeInt 8 0
+              11:             TypeRuntimeArray 10(int8_t)
+    12(Vertices):             TypeStruct 11
+              13:             TypePointer StorageBuffer 12(Vertices)
+              14:     13(ptr) Variable StorageBuffer
+              15:             TypeInt 32 1
+              16:     15(int) Constant 0
+              17:             TypePointer Input 15(int)
+18(gl_VertexIndex):     17(ptr) Variable Input
+              20:             TypePointer StorageBuffer 10(int8_t)
+              23:             TypeInt 32 0
+         4(main):           2 Function None 3
+               5:             Label
+              19:     15(int) Load 18(gl_VertexIndex)
+              21:     20(ptr) AccessChain 14 16 19
+              22:  10(int8_t) Load 21
+              24:     23(int) UConvert 22
+              25:     15(int) Bitcast 24
+              26:    6(float) ConvertSToF 25
+              27:    7(fvec4) CompositeConstruct 26 26 26 26
+                              Store 9(color) 27
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.1.3.8bitstorage-ubo.vert.out b/Test/baseResults/spv.1.3.8bitstorage-ubo.vert.out
new file mode 100644
index 0000000..54b497f
--- /dev/null
+++ b/Test/baseResults/spv.1.3.8bitstorage-ubo.vert.out
@@ -0,0 +1,56 @@
+spv.1.3.8bitstorage-ubo.vert
+// Module Version 10300
+// Generated by (magic number): 80007
+// Id's are bound by 29
+
+                              Capability Shader
+                              Capability CapabilityUniformAndStorageBuffer8BitAccess
+                              Extension  "SPV_KHR_8bit_storage"
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Vertex 4  "main" 9 20
+                              Source GLSL 450
+                              SourceExtension  "GL_EXT_shader_8bit_storage"
+                              Name 4  "main"
+                              Name 9  "color"
+                              Name 14  "Vertices"
+                              MemberName 14(Vertices) 0  "vertices"
+                              Name 16  ""
+                              Name 20  "gl_VertexIndex"
+                              Decorate 9(color) Location 0
+                              Decorate 13 ArrayStride 16
+                              MemberDecorate 14(Vertices) 0 Offset 0
+                              Decorate 14(Vertices) Block
+                              Decorate 16 DescriptorSet 0
+                              Decorate 16 Binding 0
+                              Decorate 20(gl_VertexIndex) BuiltIn VertexIndex
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+               8:             TypePointer Output 7(fvec4)
+        9(color):      8(ptr) Variable Output
+              10:             TypeInt 8 0
+              11:             TypeInt 32 0
+              12:     11(int) Constant 512
+              13:             TypeArray 10(int8_t) 12
+    14(Vertices):             TypeStruct 13
+              15:             TypePointer Uniform 14(Vertices)
+              16:     15(ptr) Variable Uniform
+              17:             TypeInt 32 1
+              18:     17(int) Constant 0
+              19:             TypePointer Input 17(int)
+20(gl_VertexIndex):     19(ptr) Variable Input
+              22:             TypePointer Uniform 10(int8_t)
+         4(main):           2 Function None 3
+               5:             Label
+              21:     17(int) Load 20(gl_VertexIndex)
+              23:     22(ptr) AccessChain 16 18 21
+              24:  10(int8_t) Load 23
+              25:     11(int) UConvert 24
+              26:     17(int) Bitcast 25
+              27:    6(float) ConvertSToF 26
+              28:    7(fvec4) CompositeConstruct 27 27 27 27
+                              Store 9(color) 28
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.100ops.frag.out b/Test/baseResults/spv.100ops.frag.out
old mode 100755
new mode 100644
index efd8201..8f656eb
--- a/Test/baseResults/spv.100ops.frag.out
+++ b/Test/baseResults/spv.100ops.frag.out
@@ -1,8 +1,6 @@
 spv.100ops.frag
-Warning, version 310 is not yet complete; most version-specific features are present, but some are missing.
-
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 49
 
                               Capability Shader
diff --git a/Test/baseResults/spv.130.frag.out b/Test/baseResults/spv.130.frag.out
index 19c6db0..eb02bad 100644
--- a/Test/baseResults/spv.130.frag.out
+++ b/Test/baseResults/spv.130.frag.out
@@ -1,8 +1,12 @@
 spv.130.frag
 WARNING: 0:31: '#extension' : extension is only partially supported: GL_ARB_gpu_shader5
 
+error: SPIRV-Tools Validation Errors
+error: Capability SampledRect is not allowed by Vulkan 1.0 specification (or requires extension)
+  OpCapability SampledRect
+
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 205
 
                               Capability Shader
diff --git a/Test/baseResults/spv.140.frag.out b/Test/baseResults/spv.140.frag.out
old mode 100755
new mode 100644
index 324cc0c..8a59c2f
--- a/Test/baseResults/spv.140.frag.out
+++ b/Test/baseResults/spv.140.frag.out
@@ -1,6 +1,10 @@
 spv.140.frag
+error: SPIRV-Tools Validation Errors
+error: Capability SampledRect is not allowed by Vulkan 1.0 specification (or requires extension)
+  OpCapability SampledRect
+
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 96
 
                               Capability Shader
diff --git a/Test/baseResults/spv.150.geom.out b/Test/baseResults/spv.150.geom.out
old mode 100755
new mode 100644
index 1c98c70..f759793
--- a/Test/baseResults/spv.150.geom.out
+++ b/Test/baseResults/spv.150.geom.out
@@ -1,6 +1,6 @@
 spv.150.geom
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 71
 
                               Capability Geometry
diff --git a/Test/baseResults/spv.150.vert.out b/Test/baseResults/spv.150.vert.out
old mode 100755
new mode 100644
index 2843139..282f5f9
--- a/Test/baseResults/spv.150.vert.out
+++ b/Test/baseResults/spv.150.vert.out
@@ -1,6 +1,6 @@
 spv.150.vert
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 63
 
                               Capability Shader
diff --git a/Test/baseResults/spv.16bitstorage-int.frag.out b/Test/baseResults/spv.16bitstorage-int.frag.out
new file mode 100644
index 0000000..3f0fffd
--- /dev/null
+++ b/Test/baseResults/spv.16bitstorage-int.frag.out
@@ -0,0 +1,335 @@
+spv.16bitstorage-int.frag
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 172
+
+                              Capability Shader
+                              Capability StorageUniformBufferBlock16
+                              Capability StorageUniform16
+                              Extension  "SPV_KHR_16bit_storage"
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main"
+                              ExecutionMode 4 OriginUpperLeft
+                              Source GLSL 450
+                              SourceExtension  "GL_EXT_shader_16bit_storage"
+                              Name 4  "main"
+                              Name 12  "S"
+                              MemberName 12(S) 0  "x"
+                              MemberName 12(S) 1  "y"
+                              MemberName 12(S) 2  "z"
+                              Name 17  "B2"
+                              MemberName 17(B2) 0  "o"
+                              MemberName 17(B2) 1  "p"
+                              MemberName 17(B2) 2  "q"
+                              MemberName 17(B2) 3  "r"
+                              MemberName 17(B2) 4  "u"
+                              MemberName 17(B2) 5  "v"
+                              MemberName 17(B2) 6  "x"
+                              MemberName 17(B2) 7  "w"
+                              Name 19  "b2"
+                              Name 23  "S"
+                              MemberName 23(S) 0  "x"
+                              MemberName 23(S) 1  "y"
+                              MemberName 23(S) 2  "z"
+                              Name 25  "B1"
+                              MemberName 25(B1) 0  "a"
+                              MemberName 25(B1) 1  "b"
+                              MemberName 25(B1) 2  "c"
+                              MemberName 25(B1) 3  "d"
+                              MemberName 25(B1) 4  "g"
+                              MemberName 25(B1) 5  "h"
+                              MemberName 25(B1) 6  "j"
+                              Name 27  "b1"
+                              Name 45  "S"
+                              MemberName 45(S) 0  "x"
+                              MemberName 45(S) 1  "y"
+                              MemberName 45(S) 2  "z"
+                              Name 49  "B5"
+                              MemberName 49(B5) 0  "o"
+                              MemberName 49(B5) 1  "p"
+                              MemberName 49(B5) 2  "q"
+                              MemberName 49(B5) 3  "r"
+                              MemberName 49(B5) 4  "u"
+                              MemberName 49(B5) 5  "v"
+                              MemberName 49(B5) 6  "x"
+                              MemberName 49(B5) 7  "w"
+                              Name 51  "b5"
+                              Name 69  "x0"
+                              Name 75  "x1"
+                              Name 88  "S2"
+                              MemberName 88(S2) 0  "x"
+                              MemberName 88(S2) 1  "y"
+                              MemberName 88(S2) 2  "z"
+                              Name 89  "S3"
+                              MemberName 89(S3) 0  "x"
+                              Name 90  "B4"
+                              MemberName 90(B4) 0  "x"
+                              MemberName 90(B4) 1  "y"
+                              Name 92  "b4"
+                              Name 93  "S2"
+                              MemberName 93(S2) 0  "x"
+                              MemberName 93(S2) 1  "y"
+                              MemberName 93(S2) 2  "z"
+                              Name 94  "B3"
+                              MemberName 94(B3) 0  "x"
+                              Name 96  "b3"
+                              Name 113  "v3"
+                              Name 135  "u3"
+                              Decorate 11 ArrayStride 2
+                              MemberDecorate 12(S) 0 Offset 0
+                              MemberDecorate 12(S) 1 Offset 4
+                              MemberDecorate 12(S) 2 Offset 8
+                              Decorate 13 ArrayStride 16
+                              Decorate 15 ArrayStride 4
+                              Decorate 16 ArrayStride 2
+                              MemberDecorate 17(B2) 0 Offset 0
+                              MemberDecorate 17(B2) 1 Offset 4
+                              MemberDecorate 17(B2) 2 Offset 8
+                              MemberDecorate 17(B2) 3 Offset 14
+                              MemberDecorate 17(B2) 4 Offset 24
+                              MemberDecorate 17(B2) 5 Offset 40
+                              MemberDecorate 17(B2) 6 Offset 72
+                              MemberDecorate 17(B2) 7 Offset 472
+                              Decorate 17(B2) BufferBlock
+                              Decorate 19(b2) DescriptorSet 0
+                              Decorate 22 ArrayStride 16
+                              MemberDecorate 23(S) 0 Offset 0
+                              MemberDecorate 23(S) 1 Offset 4
+                              MemberDecorate 23(S) 2 Offset 8
+                              Decorate 24 ArrayStride 16
+                              MemberDecorate 25(B1) 0 Offset 0
+                              MemberDecorate 25(B1) 1 Offset 4
+                              MemberDecorate 25(B1) 2 Offset 8
+                              MemberDecorate 25(B1) 3 Offset 16
+                              MemberDecorate 25(B1) 4 Offset 48
+                              MemberDecorate 25(B1) 5 Offset 64
+                              MemberDecorate 25(B1) 6 Offset 96
+                              Decorate 25(B1) Block
+                              Decorate 27(b1) DescriptorSet 0
+                              Decorate 44 ArrayStride 16
+                              MemberDecorate 45(S) 0 Offset 0
+                              MemberDecorate 45(S) 1 Offset 4
+                              MemberDecorate 45(S) 2 Offset 8
+                              Decorate 46 ArrayStride 16
+                              Decorate 47 ArrayStride 16
+                              Decorate 48 ArrayStride 16
+                              MemberDecorate 49(B5) 0 Offset 0
+                              MemberDecorate 49(B5) 1 Offset 4
+                              MemberDecorate 49(B5) 2 Offset 8
+                              MemberDecorate 49(B5) 3 Offset 16
+                              MemberDecorate 49(B5) 4 Offset 48
+                              MemberDecorate 49(B5) 5 Offset 64
+                              MemberDecorate 49(B5) 6 Offset 96
+                              MemberDecorate 49(B5) 7 Offset 1696
+                              Decorate 49(B5) Block
+                              Decorate 51(b5) DescriptorSet 0
+                              MemberDecorate 88(S2) 0 ColMajor
+                              MemberDecorate 88(S2) 0 Offset 0
+                              MemberDecorate 88(S2) 0 MatrixStride 16
+                              MemberDecorate 88(S2) 1 Offset 64
+                              MemberDecorate 88(S2) 2 Offset 68
+                              MemberDecorate 89(S3) 0 Offset 0
+                              MemberDecorate 90(B4) 0 Offset 0
+                              MemberDecorate 90(B4) 1 Offset 80
+                              Decorate 90(B4) BufferBlock
+                              Decorate 92(b4) DescriptorSet 0
+                              MemberDecorate 93(S2) 0 RowMajor
+                              MemberDecorate 93(S2) 0 Offset 0
+                              MemberDecorate 93(S2) 0 MatrixStride 16
+                              MemberDecorate 93(S2) 1 Offset 64
+                              MemberDecorate 93(S2) 2 Offset 68
+                              MemberDecorate 94(B3) 0 Offset 0
+                              Decorate 94(B3) BufferBlock
+                              Decorate 96(b3) DescriptorSet 0
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeInt 16 1
+               7:             TypeVector 6(int16_t) 2
+               8:             TypeVector 6(int16_t) 3
+               9:             TypeInt 32 0
+              10:      9(int) Constant 2
+              11:             TypeArray 6(int16_t) 10
+           12(S):             TypeStruct 6(int16_t) 7(i16vec2) 8(i16vec3)
+              13:             TypeArray 12(S) 10
+              14:      9(int) Constant 100
+              15:             TypeArray 7(i16vec2) 14
+              16:             TypeRuntimeArray 6(int16_t)
+          17(B2):             TypeStruct 6(int16_t) 7(i16vec2) 8(i16vec3) 11 12(S) 13 15 16
+              18:             TypePointer Uniform 17(B2)
+          19(b2):     18(ptr) Variable Uniform
+              20:             TypeInt 32 1
+              21:     20(int) Constant 0
+              22:             TypeArray 6(int16_t) 10
+           23(S):             TypeStruct 6(int16_t) 7(i16vec2) 8(i16vec3)
+              24:             TypeArray 23(S) 10
+          25(B1):             TypeStruct 6(int16_t) 7(i16vec2) 8(i16vec3) 22 23(S) 24 20(int)
+              26:             TypePointer Uniform 25(B1)
+          27(b1):     26(ptr) Variable Uniform
+              28:             TypePointer Uniform 6(int16_t)
+              32:     20(int) Constant 1
+              33:     20(int) Constant 2
+              34:             TypePointer Uniform 8(i16vec3)
+              37:             TypeVector 20(int) 3
+              39:             TypeVector 20(int) 2
+              42:             TypePointer Uniform 7(i16vec2)
+              44:             TypeArray 6(int16_t) 10
+           45(S):             TypeStruct 6(int16_t) 7(i16vec2) 8(i16vec3)
+              46:             TypeArray 45(S) 10
+              47:             TypeArray 7(i16vec2) 14
+              48:             TypeArray 6(int16_t) 14
+          49(B5):             TypeStruct 6(int16_t) 7(i16vec2) 8(i16vec3) 44 45(S) 46 47 48
+              50:             TypePointer Uniform 49(B5)
+          51(b5):     50(ptr) Variable Uniform
+              58:     20(int) Constant 3
+              68:             TypePointer Function 20(int)
+              73:             TypeVector 20(int) 4
+              74:             TypePointer Function 73(ivec4)
+              85:             TypeFloat 32
+              86:             TypeVector 85(float) 4
+              87:             TypeMatrix 86(fvec4) 4
+          88(S2):             TypeStruct 87 6(int16_t) 20(int)
+          89(S3):             TypeStruct 88(S2)
+          90(B4):             TypeStruct 88(S2) 89(S3)
+              91:             TypePointer Uniform 90(B4)
+          92(b4):     91(ptr) Variable Uniform
+          93(S2):             TypeStruct 87 6(int16_t) 20(int)
+          94(B3):             TypeStruct 93(S2)
+              95:             TypePointer Uniform 94(B3)
+          96(b3):     95(ptr) Variable Uniform
+              97:             TypePointer Uniform 87
+             104:      9(int) Constant 0
+             108:     20(int) Constant 5
+             112:             TypePointer Function 37(ivec3)
+             114:     20(int) Constant 7
+             115:     20(int) Constant 6
+             116:             TypePointer Uniform 20(int)
+             166:  6(int16_t) Constant 1
+             167:  6(int16_t) Constant 2
+             168:  7(i16vec2) ConstantComposite 166 167
+             170:  6(int16_t) Constant 3
+         4(main):           2 Function None 3
+               5:             Label
+          69(x0):     68(ptr) Variable Function
+          75(x1):     74(ptr) Variable Function
+         113(v3):    112(ptr) Variable Function
+         135(u3):    112(ptr) Variable Function
+              29:     28(ptr) AccessChain 27(b1) 21
+              30:  6(int16_t) Load 29
+              31:     28(ptr) AccessChain 19(b2) 21
+                              Store 31 30
+              35:     34(ptr) AccessChain 19(b2) 33
+              36:  8(i16vec3) Load 35
+              38:   37(ivec3) SConvert 36
+              40:   39(ivec2) VectorShuffle 38 38 0 1
+              41:  7(i16vec2) SConvert 40
+              43:     42(ptr) AccessChain 19(b2) 32
+                              Store 43 41
+              52:     34(ptr) AccessChain 51(b5) 33
+              53:  8(i16vec3) Load 52
+              54:   37(ivec3) SConvert 53
+              55:   39(ivec2) VectorShuffle 54 54 0 1
+              56:  7(i16vec2) SConvert 55
+              57:     42(ptr) AccessChain 19(b2) 32
+                              Store 57 56
+              59:     28(ptr) AccessChain 19(b2) 58 21
+              60:  6(int16_t) Load 59
+              61:     28(ptr) AccessChain 19(b2) 58 21
+                              Store 61 60
+              62:     28(ptr) AccessChain 51(b5) 58 32
+              63:  6(int16_t) Load 62
+              64:     28(ptr) AccessChain 19(b2) 58 32
+                              Store 64 63
+              65:     42(ptr) AccessChain 19(b2) 32
+              66:  7(i16vec2) Load 65
+              67:     42(ptr) AccessChain 19(b2) 32
+                              Store 67 66
+              70:     28(ptr) AccessChain 27(b1) 21
+              71:  6(int16_t) Load 70
+              72:     20(int) SConvert 71
+                              Store 69(x0) 72
+              76:     28(ptr) AccessChain 27(b1) 21
+              77:  6(int16_t) Load 76
+              78:     20(int) SConvert 77
+              79:     42(ptr) AccessChain 19(b2) 32
+              80:  7(i16vec2) Load 79
+              81:   39(ivec2) SConvert 80
+              82:     20(int) CompositeExtract 81 0
+              83:     20(int) CompositeExtract 81 1
+              84:   73(ivec4) CompositeConstruct 78 82 83 32
+                              Store 75(x1) 84
+              98:     97(ptr) AccessChain 96(b3) 21 21
+              99:          87 Load 98
+             100:     97(ptr) AccessChain 92(b4) 21 21
+                              Store 100 99
+             101:     42(ptr) AccessChain 19(b2) 32
+             102:  7(i16vec2) Load 101
+             103:   39(ivec2) SConvert 102
+             105:     20(int) CompositeExtract 103 0
+             106:  6(int16_t) SConvert 105
+             107:     28(ptr) AccessChain 19(b2) 21
+                              Store 107 106
+             109:     42(ptr) AccessChain 19(b2) 108 32 32
+             110:  7(i16vec2) Load 109
+             111:     42(ptr) AccessChain 19(b2) 32
+                              Store 111 110
+             117:    116(ptr) AccessChain 27(b1) 115
+             118:     20(int) Load 117
+             119:     28(ptr) AccessChain 19(b2) 114 118
+             120:  6(int16_t) Load 119
+             121:     20(int) SConvert 120
+             122:    116(ptr) AccessChain 27(b1) 115
+             123:     20(int) Load 122
+             124:     20(int) IAdd 123 32
+             125:     28(ptr) AccessChain 19(b2) 114 124
+             126:  6(int16_t) Load 125
+             127:     20(int) SConvert 126
+             128:    116(ptr) AccessChain 27(b1) 115
+             129:     20(int) Load 128
+             130:     20(int) IAdd 129 33
+             131:     28(ptr) AccessChain 19(b2) 114 130
+             132:  6(int16_t) Load 131
+             133:     20(int) SConvert 132
+             134:   37(ivec3) CompositeConstruct 121 127 133
+                              Store 113(v3) 134
+             136:    116(ptr) AccessChain 27(b1) 115
+             137:     20(int) Load 136
+             138:     28(ptr) AccessChain 51(b5) 114 137
+             139:  6(int16_t) Load 138
+             140:     20(int) SConvert 139
+             141:    116(ptr) AccessChain 27(b1) 115
+             142:     20(int) Load 141
+             143:     20(int) IAdd 142 32
+             144:     28(ptr) AccessChain 51(b5) 114 143
+             145:  6(int16_t) Load 144
+             146:     20(int) SConvert 145
+             147:    116(ptr) AccessChain 27(b1) 115
+             148:     20(int) Load 147
+             149:     20(int) IAdd 148 33
+             150:     28(ptr) AccessChain 51(b5) 114 149
+             151:  6(int16_t) Load 150
+             152:     20(int) SConvert 151
+             153:   37(ivec3) CompositeConstruct 140 146 152
+                              Store 135(u3) 153
+             154:     42(ptr) AccessChain 19(b2) 115 21
+             155:  7(i16vec2) Load 154
+             156:     42(ptr) AccessChain 19(b2) 115 21
+                              Store 156 155
+             157:     42(ptr) AccessChain 51(b5) 115 32
+             158:  7(i16vec2) Load 157
+             159:     42(ptr) AccessChain 19(b2) 115 32
+                              Store 159 158
+             160:     28(ptr) AccessChain 27(b1) 21
+             161:  6(int16_t) Load 160
+             162:     28(ptr) AccessChain 19(b2) 32 104
+                              Store 162 161
+             163:     28(ptr) AccessChain 19(b2) 32 104
+             164:  6(int16_t) Load 163
+             165:     28(ptr) AccessChain 19(b2) 21
+                              Store 165 164
+             169:     42(ptr) AccessChain 19(b2) 32
+                              Store 169 168
+             171:     28(ptr) AccessChain 19(b2) 21
+                              Store 171 170
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.16bitstorage-uint.frag.out b/Test/baseResults/spv.16bitstorage-uint.frag.out
new file mode 100644
index 0000000..c07edaa
--- /dev/null
+++ b/Test/baseResults/spv.16bitstorage-uint.frag.out
@@ -0,0 +1,336 @@
+spv.16bitstorage-uint.frag
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 173
+
+                              Capability Shader
+                              Capability StorageUniformBufferBlock16
+                              Capability StorageUniform16
+                              Extension  "SPV_KHR_16bit_storage"
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main"
+                              ExecutionMode 4 OriginUpperLeft
+                              Source GLSL 450
+                              SourceExtension  "GL_EXT_shader_16bit_storage"
+                              Name 4  "main"
+                              Name 12  "S"
+                              MemberName 12(S) 0  "x"
+                              MemberName 12(S) 1  "y"
+                              MemberName 12(S) 2  "z"
+                              Name 17  "B2"
+                              MemberName 17(B2) 0  "o"
+                              MemberName 17(B2) 1  "p"
+                              MemberName 17(B2) 2  "q"
+                              MemberName 17(B2) 3  "r"
+                              MemberName 17(B2) 4  "u"
+                              MemberName 17(B2) 5  "v"
+                              MemberName 17(B2) 6  "x"
+                              MemberName 17(B2) 7  "w"
+                              Name 19  "b2"
+                              Name 23  "S"
+                              MemberName 23(S) 0  "x"
+                              MemberName 23(S) 1  "y"
+                              MemberName 23(S) 2  "z"
+                              Name 25  "B1"
+                              MemberName 25(B1) 0  "a"
+                              MemberName 25(B1) 1  "b"
+                              MemberName 25(B1) 2  "c"
+                              MemberName 25(B1) 3  "d"
+                              MemberName 25(B1) 4  "g"
+                              MemberName 25(B1) 5  "h"
+                              MemberName 25(B1) 6  "j"
+                              Name 27  "b1"
+                              Name 45  "S"
+                              MemberName 45(S) 0  "x"
+                              MemberName 45(S) 1  "y"
+                              MemberName 45(S) 2  "z"
+                              Name 49  "B5"
+                              MemberName 49(B5) 0  "o"
+                              MemberName 49(B5) 1  "p"
+                              MemberName 49(B5) 2  "q"
+                              MemberName 49(B5) 3  "r"
+                              MemberName 49(B5) 4  "u"
+                              MemberName 49(B5) 5  "v"
+                              MemberName 49(B5) 6  "x"
+                              MemberName 49(B5) 7  "w"
+                              Name 51  "b5"
+                              Name 69  "x0"
+                              Name 75  "x1"
+                              Name 89  "S2"
+                              MemberName 89(S2) 0  "x"
+                              MemberName 89(S2) 1  "y"
+                              MemberName 89(S2) 2  "z"
+                              Name 90  "S3"
+                              MemberName 90(S3) 0  "x"
+                              Name 91  "B4"
+                              MemberName 91(B4) 0  "x"
+                              MemberName 91(B4) 1  "y"
+                              Name 93  "b4"
+                              Name 94  "S2"
+                              MemberName 94(S2) 0  "x"
+                              MemberName 94(S2) 1  "y"
+                              MemberName 94(S2) 2  "z"
+                              Name 95  "B3"
+                              MemberName 95(B3) 0  "x"
+                              Name 97  "b3"
+                              Name 114  "v3"
+                              Name 136  "u3"
+                              Decorate 11 ArrayStride 2
+                              MemberDecorate 12(S) 0 Offset 0
+                              MemberDecorate 12(S) 1 Offset 4
+                              MemberDecorate 12(S) 2 Offset 8
+                              Decorate 13 ArrayStride 16
+                              Decorate 15 ArrayStride 4
+                              Decorate 16 ArrayStride 2
+                              MemberDecorate 17(B2) 0 Offset 0
+                              MemberDecorate 17(B2) 1 Offset 4
+                              MemberDecorate 17(B2) 2 Offset 8
+                              MemberDecorate 17(B2) 3 Offset 14
+                              MemberDecorate 17(B2) 4 Offset 24
+                              MemberDecorate 17(B2) 5 Offset 40
+                              MemberDecorate 17(B2) 6 Offset 72
+                              MemberDecorate 17(B2) 7 Offset 472
+                              Decorate 17(B2) BufferBlock
+                              Decorate 19(b2) DescriptorSet 0
+                              Decorate 22 ArrayStride 16
+                              MemberDecorate 23(S) 0 Offset 0
+                              MemberDecorate 23(S) 1 Offset 4
+                              MemberDecorate 23(S) 2 Offset 8
+                              Decorate 24 ArrayStride 16
+                              MemberDecorate 25(B1) 0 Offset 0
+                              MemberDecorate 25(B1) 1 Offset 4
+                              MemberDecorate 25(B1) 2 Offset 8
+                              MemberDecorate 25(B1) 3 Offset 16
+                              MemberDecorate 25(B1) 4 Offset 48
+                              MemberDecorate 25(B1) 5 Offset 64
+                              MemberDecorate 25(B1) 6 Offset 96
+                              Decorate 25(B1) Block
+                              Decorate 27(b1) DescriptorSet 0
+                              Decorate 44 ArrayStride 16
+                              MemberDecorate 45(S) 0 Offset 0
+                              MemberDecorate 45(S) 1 Offset 4
+                              MemberDecorate 45(S) 2 Offset 8
+                              Decorate 46 ArrayStride 16
+                              Decorate 47 ArrayStride 16
+                              Decorate 48 ArrayStride 16
+                              MemberDecorate 49(B5) 0 Offset 0
+                              MemberDecorate 49(B5) 1 Offset 4
+                              MemberDecorate 49(B5) 2 Offset 8
+                              MemberDecorate 49(B5) 3 Offset 16
+                              MemberDecorate 49(B5) 4 Offset 48
+                              MemberDecorate 49(B5) 5 Offset 64
+                              MemberDecorate 49(B5) 6 Offset 96
+                              MemberDecorate 49(B5) 7 Offset 1696
+                              Decorate 49(B5) Block
+                              Decorate 51(b5) DescriptorSet 0
+                              MemberDecorate 89(S2) 0 ColMajor
+                              MemberDecorate 89(S2) 0 Offset 0
+                              MemberDecorate 89(S2) 0 MatrixStride 16
+                              MemberDecorate 89(S2) 1 Offset 64
+                              MemberDecorate 89(S2) 2 Offset 68
+                              MemberDecorate 90(S3) 0 Offset 0
+                              MemberDecorate 91(B4) 0 Offset 0
+                              MemberDecorate 91(B4) 1 Offset 80
+                              Decorate 91(B4) BufferBlock
+                              Decorate 93(b4) DescriptorSet 0
+                              MemberDecorate 94(S2) 0 RowMajor
+                              MemberDecorate 94(S2) 0 Offset 0
+                              MemberDecorate 94(S2) 0 MatrixStride 16
+                              MemberDecorate 94(S2) 1 Offset 64
+                              MemberDecorate 94(S2) 2 Offset 68
+                              MemberDecorate 95(B3) 0 Offset 0
+                              Decorate 95(B3) BufferBlock
+                              Decorate 97(b3) DescriptorSet 0
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeInt 16 0
+               7:             TypeVector 6(int16_t) 2
+               8:             TypeVector 6(int16_t) 3
+               9:             TypeInt 32 0
+              10:      9(int) Constant 2
+              11:             TypeArray 6(int16_t) 10
+           12(S):             TypeStruct 6(int16_t) 7(i16vec2) 8(i16vec3)
+              13:             TypeArray 12(S) 10
+              14:      9(int) Constant 100
+              15:             TypeArray 7(i16vec2) 14
+              16:             TypeRuntimeArray 6(int16_t)
+          17(B2):             TypeStruct 6(int16_t) 7(i16vec2) 8(i16vec3) 11 12(S) 13 15 16
+              18:             TypePointer Uniform 17(B2)
+          19(b2):     18(ptr) Variable Uniform
+              20:             TypeInt 32 1
+              21:     20(int) Constant 0
+              22:             TypeArray 6(int16_t) 10
+           23(S):             TypeStruct 6(int16_t) 7(i16vec2) 8(i16vec3)
+              24:             TypeArray 23(S) 10
+          25(B1):             TypeStruct 6(int16_t) 7(i16vec2) 8(i16vec3) 22 23(S) 24 9(int)
+              26:             TypePointer Uniform 25(B1)
+          27(b1):     26(ptr) Variable Uniform
+              28:             TypePointer Uniform 6(int16_t)
+              32:     20(int) Constant 1
+              33:     20(int) Constant 2
+              34:             TypePointer Uniform 8(i16vec3)
+              37:             TypeVector 9(int) 3
+              39:             TypeVector 9(int) 2
+              42:             TypePointer Uniform 7(i16vec2)
+              44:             TypeArray 6(int16_t) 10
+           45(S):             TypeStruct 6(int16_t) 7(i16vec2) 8(i16vec3)
+              46:             TypeArray 45(S) 10
+              47:             TypeArray 7(i16vec2) 14
+              48:             TypeArray 6(int16_t) 14
+          49(B5):             TypeStruct 6(int16_t) 7(i16vec2) 8(i16vec3) 44 45(S) 46 47 48
+              50:             TypePointer Uniform 49(B5)
+          51(b5):     50(ptr) Variable Uniform
+              58:     20(int) Constant 3
+              68:             TypePointer Function 9(int)
+              73:             TypeVector 9(int) 4
+              74:             TypePointer Function 73(ivec4)
+              82:      9(int) Constant 1
+              86:             TypeFloat 32
+              87:             TypeVector 86(float) 4
+              88:             TypeMatrix 87(fvec4) 4
+          89(S2):             TypeStruct 88 6(int16_t) 9(int)
+          90(S3):             TypeStruct 89(S2)
+          91(B4):             TypeStruct 89(S2) 90(S3)
+              92:             TypePointer Uniform 91(B4)
+          93(b4):     92(ptr) Variable Uniform
+          94(S2):             TypeStruct 88 6(int16_t) 9(int)
+          95(B3):             TypeStruct 94(S2)
+              96:             TypePointer Uniform 95(B3)
+          97(b3):     96(ptr) Variable Uniform
+              98:             TypePointer Uniform 88
+             105:      9(int) Constant 0
+             109:     20(int) Constant 5
+             113:             TypePointer Function 37(ivec3)
+             115:     20(int) Constant 7
+             116:     20(int) Constant 6
+             117:             TypePointer Uniform 9(int)
+             167:  6(int16_t) Constant 1
+             168:  6(int16_t) Constant 2
+             169:  7(i16vec2) ConstantComposite 167 168
+             171:  6(int16_t) Constant 3
+         4(main):           2 Function None 3
+               5:             Label
+          69(x0):     68(ptr) Variable Function
+          75(x1):     74(ptr) Variable Function
+         114(v3):    113(ptr) Variable Function
+         136(u3):    113(ptr) Variable Function
+              29:     28(ptr) AccessChain 27(b1) 21
+              30:  6(int16_t) Load 29
+              31:     28(ptr) AccessChain 19(b2) 21
+                              Store 31 30
+              35:     34(ptr) AccessChain 19(b2) 33
+              36:  8(i16vec3) Load 35
+              38:   37(ivec3) UConvert 36
+              40:   39(ivec2) VectorShuffle 38 38 0 1
+              41:  7(i16vec2) UConvert 40
+              43:     42(ptr) AccessChain 19(b2) 32
+                              Store 43 41
+              52:     34(ptr) AccessChain 51(b5) 33
+              53:  8(i16vec3) Load 52
+              54:   37(ivec3) UConvert 53
+              55:   39(ivec2) VectorShuffle 54 54 0 1
+              56:  7(i16vec2) UConvert 55
+              57:     42(ptr) AccessChain 19(b2) 32
+                              Store 57 56
+              59:     28(ptr) AccessChain 19(b2) 58 21
+              60:  6(int16_t) Load 59
+              61:     28(ptr) AccessChain 19(b2) 58 21
+                              Store 61 60
+              62:     28(ptr) AccessChain 51(b5) 58 32
+              63:  6(int16_t) Load 62
+              64:     28(ptr) AccessChain 19(b2) 58 32
+                              Store 64 63
+              65:     42(ptr) AccessChain 19(b2) 32
+              66:  7(i16vec2) Load 65
+              67:     42(ptr) AccessChain 19(b2) 32
+                              Store 67 66
+              70:     28(ptr) AccessChain 27(b1) 21
+              71:  6(int16_t) Load 70
+              72:      9(int) UConvert 71
+                              Store 69(x0) 72
+              76:     28(ptr) AccessChain 27(b1) 21
+              77:  6(int16_t) Load 76
+              78:      9(int) UConvert 77
+              79:     42(ptr) AccessChain 19(b2) 32
+              80:  7(i16vec2) Load 79
+              81:   39(ivec2) UConvert 80
+              83:      9(int) CompositeExtract 81 0
+              84:      9(int) CompositeExtract 81 1
+              85:   73(ivec4) CompositeConstruct 78 83 84 82
+                              Store 75(x1) 85
+              99:     98(ptr) AccessChain 97(b3) 21 21
+             100:          88 Load 99
+             101:     98(ptr) AccessChain 93(b4) 21 21
+                              Store 101 100
+             102:     42(ptr) AccessChain 19(b2) 32
+             103:  7(i16vec2) Load 102
+             104:   39(ivec2) UConvert 103
+             106:      9(int) CompositeExtract 104 0
+             107:  6(int16_t) UConvert 106
+             108:     28(ptr) AccessChain 19(b2) 21
+                              Store 108 107
+             110:     42(ptr) AccessChain 19(b2) 109 32 32
+             111:  7(i16vec2) Load 110
+             112:     42(ptr) AccessChain 19(b2) 32
+                              Store 112 111
+             118:    117(ptr) AccessChain 27(b1) 116
+             119:      9(int) Load 118
+             120:     28(ptr) AccessChain 19(b2) 115 119
+             121:  6(int16_t) Load 120
+             122:      9(int) UConvert 121
+             123:    117(ptr) AccessChain 27(b1) 116
+             124:      9(int) Load 123
+             125:      9(int) IAdd 124 82
+             126:     28(ptr) AccessChain 19(b2) 115 125
+             127:  6(int16_t) Load 126
+             128:      9(int) UConvert 127
+             129:    117(ptr) AccessChain 27(b1) 116
+             130:      9(int) Load 129
+             131:      9(int) IAdd 130 10
+             132:     28(ptr) AccessChain 19(b2) 115 131
+             133:  6(int16_t) Load 132
+             134:      9(int) UConvert 133
+             135:   37(ivec3) CompositeConstruct 122 128 134
+                              Store 114(v3) 135
+             137:    117(ptr) AccessChain 27(b1) 116
+             138:      9(int) Load 137
+             139:     28(ptr) AccessChain 51(b5) 115 138
+             140:  6(int16_t) Load 139
+             141:      9(int) UConvert 140
+             142:    117(ptr) AccessChain 27(b1) 116
+             143:      9(int) Load 142
+             144:      9(int) IAdd 143 82
+             145:     28(ptr) AccessChain 51(b5) 115 144
+             146:  6(int16_t) Load 145
+             147:      9(int) UConvert 146
+             148:    117(ptr) AccessChain 27(b1) 116
+             149:      9(int) Load 148
+             150:      9(int) IAdd 149 10
+             151:     28(ptr) AccessChain 51(b5) 115 150
+             152:  6(int16_t) Load 151
+             153:      9(int) UConvert 152
+             154:   37(ivec3) CompositeConstruct 141 147 153
+                              Store 136(u3) 154
+             155:     42(ptr) AccessChain 19(b2) 116 21
+             156:  7(i16vec2) Load 155
+             157:     42(ptr) AccessChain 19(b2) 116 21
+                              Store 157 156
+             158:     42(ptr) AccessChain 51(b5) 116 32
+             159:  7(i16vec2) Load 158
+             160:     42(ptr) AccessChain 19(b2) 116 32
+                              Store 160 159
+             161:     28(ptr) AccessChain 27(b1) 21
+             162:  6(int16_t) Load 161
+             163:     28(ptr) AccessChain 19(b2) 32 105
+                              Store 163 162
+             164:     28(ptr) AccessChain 19(b2) 32 105
+             165:  6(int16_t) Load 164
+             166:     28(ptr) AccessChain 19(b2) 21
+                              Store 166 165
+             170:     42(ptr) AccessChain 19(b2) 32
+                              Store 170 169
+             172:     28(ptr) AccessChain 19(b2) 21
+                              Store 172 171
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.16bitstorage.frag.out b/Test/baseResults/spv.16bitstorage.frag.out
new file mode 100644
index 0000000..2d5487f
--- /dev/null
+++ b/Test/baseResults/spv.16bitstorage.frag.out
@@ -0,0 +1,335 @@
+spv.16bitstorage.frag
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 172
+
+                              Capability Shader
+                              Capability StorageUniformBufferBlock16
+                              Capability StorageUniform16
+                              Extension  "SPV_KHR_16bit_storage"
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main"
+                              ExecutionMode 4 OriginUpperLeft
+                              Source GLSL 450
+                              SourceExtension  "GL_EXT_shader_16bit_storage"
+                              Name 4  "main"
+                              Name 12  "S"
+                              MemberName 12(S) 0  "x"
+                              MemberName 12(S) 1  "y"
+                              MemberName 12(S) 2  "z"
+                              Name 17  "B2"
+                              MemberName 17(B2) 0  "o"
+                              MemberName 17(B2) 1  "p"
+                              MemberName 17(B2) 2  "q"
+                              MemberName 17(B2) 3  "r"
+                              MemberName 17(B2) 4  "u"
+                              MemberName 17(B2) 5  "v"
+                              MemberName 17(B2) 6  "x"
+                              MemberName 17(B2) 7  "w"
+                              Name 19  "b2"
+                              Name 23  "S"
+                              MemberName 23(S) 0  "x"
+                              MemberName 23(S) 1  "y"
+                              MemberName 23(S) 2  "z"
+                              Name 25  "B1"
+                              MemberName 25(B1) 0  "a"
+                              MemberName 25(B1) 1  "b"
+                              MemberName 25(B1) 2  "c"
+                              MemberName 25(B1) 3  "d"
+                              MemberName 25(B1) 4  "g"
+                              MemberName 25(B1) 5  "h"
+                              MemberName 25(B1) 6  "j"
+                              Name 27  "b1"
+                              Name 46  "S"
+                              MemberName 46(S) 0  "x"
+                              MemberName 46(S) 1  "y"
+                              MemberName 46(S) 2  "z"
+                              Name 50  "B5"
+                              MemberName 50(B5) 0  "o"
+                              MemberName 50(B5) 1  "p"
+                              MemberName 50(B5) 2  "q"
+                              MemberName 50(B5) 3  "r"
+                              MemberName 50(B5) 4  "u"
+                              MemberName 50(B5) 5  "v"
+                              MemberName 50(B5) 6  "x"
+                              MemberName 50(B5) 7  "w"
+                              Name 52  "b5"
+                              Name 70  "x0"
+                              Name 76  "x1"
+                              Name 88  "S2"
+                              MemberName 88(S2) 0  "x"
+                              MemberName 88(S2) 1  "y"
+                              MemberName 88(S2) 2  "z"
+                              Name 89  "S3"
+                              MemberName 89(S3) 0  "x"
+                              Name 90  "B4"
+                              MemberName 90(B4) 0  "x"
+                              MemberName 90(B4) 1  "y"
+                              Name 92  "b4"
+                              Name 93  "S2"
+                              MemberName 93(S2) 0  "x"
+                              MemberName 93(S2) 1  "y"
+                              MemberName 93(S2) 2  "z"
+                              Name 94  "B3"
+                              MemberName 94(B3) 0  "x"
+                              Name 96  "b3"
+                              Name 113  "v3"
+                              Name 135  "u3"
+                              Decorate 11 ArrayStride 2
+                              MemberDecorate 12(S) 0 Offset 0
+                              MemberDecorate 12(S) 1 Offset 4
+                              MemberDecorate 12(S) 2 Offset 8
+                              Decorate 13 ArrayStride 16
+                              Decorate 15 ArrayStride 4
+                              Decorate 16 ArrayStride 2
+                              MemberDecorate 17(B2) 0 Offset 0
+                              MemberDecorate 17(B2) 1 Offset 4
+                              MemberDecorate 17(B2) 2 Offset 8
+                              MemberDecorate 17(B2) 3 Offset 14
+                              MemberDecorate 17(B2) 4 Offset 24
+                              MemberDecorate 17(B2) 5 Offset 40
+                              MemberDecorate 17(B2) 6 Offset 72
+                              MemberDecorate 17(B2) 7 Offset 472
+                              Decorate 17(B2) BufferBlock
+                              Decorate 19(b2) DescriptorSet 0
+                              Decorate 22 ArrayStride 16
+                              MemberDecorate 23(S) 0 Offset 0
+                              MemberDecorate 23(S) 1 Offset 4
+                              MemberDecorate 23(S) 2 Offset 8
+                              Decorate 24 ArrayStride 16
+                              MemberDecorate 25(B1) 0 Offset 0
+                              MemberDecorate 25(B1) 1 Offset 4
+                              MemberDecorate 25(B1) 2 Offset 8
+                              MemberDecorate 25(B1) 3 Offset 16
+                              MemberDecorate 25(B1) 4 Offset 48
+                              MemberDecorate 25(B1) 5 Offset 64
+                              MemberDecorate 25(B1) 6 Offset 96
+                              Decorate 25(B1) Block
+                              Decorate 27(b1) DescriptorSet 0
+                              Decorate 45 ArrayStride 16
+                              MemberDecorate 46(S) 0 Offset 0
+                              MemberDecorate 46(S) 1 Offset 4
+                              MemberDecorate 46(S) 2 Offset 8
+                              Decorate 47 ArrayStride 16
+                              Decorate 48 ArrayStride 16
+                              Decorate 49 ArrayStride 16
+                              MemberDecorate 50(B5) 0 Offset 0
+                              MemberDecorate 50(B5) 1 Offset 4
+                              MemberDecorate 50(B5) 2 Offset 8
+                              MemberDecorate 50(B5) 3 Offset 16
+                              MemberDecorate 50(B5) 4 Offset 48
+                              MemberDecorate 50(B5) 5 Offset 64
+                              MemberDecorate 50(B5) 6 Offset 96
+                              MemberDecorate 50(B5) 7 Offset 1696
+                              Decorate 50(B5) Block
+                              Decorate 52(b5) DescriptorSet 0
+                              MemberDecorate 88(S2) 0 ColMajor
+                              MemberDecorate 88(S2) 0 Offset 0
+                              MemberDecorate 88(S2) 0 MatrixStride 16
+                              MemberDecorate 88(S2) 1 Offset 64
+                              MemberDecorate 88(S2) 2 Offset 68
+                              MemberDecorate 89(S3) 0 Offset 0
+                              MemberDecorate 90(B4) 0 Offset 0
+                              MemberDecorate 90(B4) 1 Offset 80
+                              Decorate 90(B4) BufferBlock
+                              Decorate 92(b4) DescriptorSet 0
+                              MemberDecorate 93(S2) 0 RowMajor
+                              MemberDecorate 93(S2) 0 Offset 0
+                              MemberDecorate 93(S2) 0 MatrixStride 16
+                              MemberDecorate 93(S2) 1 Offset 64
+                              MemberDecorate 93(S2) 2 Offset 68
+                              MemberDecorate 94(B3) 0 Offset 0
+                              Decorate 94(B3) BufferBlock
+                              Decorate 96(b3) DescriptorSet 0
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 16
+               7:             TypeVector 6(float16_t) 2
+               8:             TypeVector 6(float16_t) 3
+               9:             TypeInt 32 0
+              10:      9(int) Constant 2
+              11:             TypeArray 6(float16_t) 10
+           12(S):             TypeStruct 6(float16_t) 7(f16vec2) 8(f16vec3)
+              13:             TypeArray 12(S) 10
+              14:      9(int) Constant 100
+              15:             TypeArray 7(f16vec2) 14
+              16:             TypeRuntimeArray 6(float16_t)
+          17(B2):             TypeStruct 6(float16_t) 7(f16vec2) 8(f16vec3) 11 12(S) 13 15 16
+              18:             TypePointer Uniform 17(B2)
+          19(b2):     18(ptr) Variable Uniform
+              20:             TypeInt 32 1
+              21:     20(int) Constant 0
+              22:             TypeArray 6(float16_t) 10
+           23(S):             TypeStruct 6(float16_t) 7(f16vec2) 8(f16vec3)
+              24:             TypeArray 23(S) 10
+          25(B1):             TypeStruct 6(float16_t) 7(f16vec2) 8(f16vec3) 22 23(S) 24 20(int)
+              26:             TypePointer Uniform 25(B1)
+          27(b1):     26(ptr) Variable Uniform
+              28:             TypePointer Uniform 6(float16_t)
+              32:     20(int) Constant 1
+              33:     20(int) Constant 2
+              34:             TypePointer Uniform 8(f16vec3)
+              37:             TypeFloat 32
+              38:             TypeVector 37(float) 3
+              40:             TypeVector 37(float) 2
+              43:             TypePointer Uniform 7(f16vec2)
+              45:             TypeArray 6(float16_t) 10
+           46(S):             TypeStruct 6(float16_t) 7(f16vec2) 8(f16vec3)
+              47:             TypeArray 46(S) 10
+              48:             TypeArray 7(f16vec2) 14
+              49:             TypeArray 6(float16_t) 14
+          50(B5):             TypeStruct 6(float16_t) 7(f16vec2) 8(f16vec3) 45 46(S) 47 48 49
+              51:             TypePointer Uniform 50(B5)
+          52(b5):     51(ptr) Variable Uniform
+              59:     20(int) Constant 3
+              69:             TypePointer Function 37(float)
+              74:             TypeVector 37(float) 4
+              75:             TypePointer Function 74(fvec4)
+              83:   37(float) Constant 1065353216
+              87:             TypeMatrix 74(fvec4) 4
+          88(S2):             TypeStruct 87 6(float16_t) 37(float)
+          89(S3):             TypeStruct 88(S2)
+          90(B4):             TypeStruct 88(S2) 89(S3)
+              91:             TypePointer Uniform 90(B4)
+          92(b4):     91(ptr) Variable Uniform
+          93(S2):             TypeStruct 87 6(float16_t) 37(float)
+          94(B3):             TypeStruct 93(S2)
+              95:             TypePointer Uniform 94(B3)
+          96(b3):     95(ptr) Variable Uniform
+              97:             TypePointer Uniform 87
+             104:      9(int) Constant 0
+             108:     20(int) Constant 5
+             112:             TypePointer Function 38(fvec3)
+             114:     20(int) Constant 7
+             115:     20(int) Constant 6
+             116:             TypePointer Uniform 20(int)
+             166:6(float16_t) Constant 15360
+             167:6(float16_t) Constant 16384
+             168:  7(f16vec2) ConstantComposite 166 167
+             170:6(float16_t) Constant 16896
+         4(main):           2 Function None 3
+               5:             Label
+          70(x0):     69(ptr) Variable Function
+          76(x1):     75(ptr) Variable Function
+         113(v3):    112(ptr) Variable Function
+         135(u3):    112(ptr) Variable Function
+              29:     28(ptr) AccessChain 27(b1) 21
+              30:6(float16_t) Load 29
+              31:     28(ptr) AccessChain 19(b2) 21
+                              Store 31 30
+              35:     34(ptr) AccessChain 19(b2) 33
+              36:  8(f16vec3) Load 35
+              39:   38(fvec3) FConvert 36
+              41:   40(fvec2) VectorShuffle 39 39 0 1
+              42:  7(f16vec2) FConvert 41
+              44:     43(ptr) AccessChain 19(b2) 32
+                              Store 44 42
+              53:     34(ptr) AccessChain 52(b5) 33
+              54:  8(f16vec3) Load 53
+              55:   38(fvec3) FConvert 54
+              56:   40(fvec2) VectorShuffle 55 55 0 1
+              57:  7(f16vec2) FConvert 56
+              58:     43(ptr) AccessChain 19(b2) 32
+                              Store 58 57
+              60:     28(ptr) AccessChain 19(b2) 59 21
+              61:6(float16_t) Load 60
+              62:     28(ptr) AccessChain 19(b2) 59 21
+                              Store 62 61
+              63:     28(ptr) AccessChain 52(b5) 59 32
+              64:6(float16_t) Load 63
+              65:     28(ptr) AccessChain 19(b2) 59 32
+                              Store 65 64
+              66:     43(ptr) AccessChain 19(b2) 32
+              67:  7(f16vec2) Load 66
+              68:     43(ptr) AccessChain 19(b2) 32
+                              Store 68 67
+              71:     28(ptr) AccessChain 27(b1) 21
+              72:6(float16_t) Load 71
+              73:   37(float) FConvert 72
+                              Store 70(x0) 73
+              77:     28(ptr) AccessChain 27(b1) 21
+              78:6(float16_t) Load 77
+              79:   37(float) FConvert 78
+              80:     43(ptr) AccessChain 19(b2) 32
+              81:  7(f16vec2) Load 80
+              82:   40(fvec2) FConvert 81
+              84:   37(float) CompositeExtract 82 0
+              85:   37(float) CompositeExtract 82 1
+              86:   74(fvec4) CompositeConstruct 79 84 85 83
+                              Store 76(x1) 86
+              98:     97(ptr) AccessChain 96(b3) 21 21
+              99:          87 Load 98
+             100:     97(ptr) AccessChain 92(b4) 21 21
+                              Store 100 99
+             101:     43(ptr) AccessChain 19(b2) 32
+             102:  7(f16vec2) Load 101
+             103:   40(fvec2) FConvert 102
+             105:   37(float) CompositeExtract 103 0
+             106:6(float16_t) FConvert 105
+             107:     28(ptr) AccessChain 19(b2) 21
+                              Store 107 106
+             109:     43(ptr) AccessChain 19(b2) 108 32 32
+             110:  7(f16vec2) Load 109
+             111:     43(ptr) AccessChain 19(b2) 32
+                              Store 111 110
+             117:    116(ptr) AccessChain 27(b1) 115
+             118:     20(int) Load 117
+             119:     28(ptr) AccessChain 19(b2) 114 118
+             120:6(float16_t) Load 119
+             121:   37(float) FConvert 120
+             122:    116(ptr) AccessChain 27(b1) 115
+             123:     20(int) Load 122
+             124:     20(int) IAdd 123 32
+             125:     28(ptr) AccessChain 19(b2) 114 124
+             126:6(float16_t) Load 125
+             127:   37(float) FConvert 126
+             128:    116(ptr) AccessChain 27(b1) 115
+             129:     20(int) Load 128
+             130:     20(int) IAdd 129 33
+             131:     28(ptr) AccessChain 19(b2) 114 130
+             132:6(float16_t) Load 131
+             133:   37(float) FConvert 132
+             134:   38(fvec3) CompositeConstruct 121 127 133
+                              Store 113(v3) 134
+             136:    116(ptr) AccessChain 27(b1) 115
+             137:     20(int) Load 136
+             138:     28(ptr) AccessChain 52(b5) 114 137
+             139:6(float16_t) Load 138
+             140:   37(float) FConvert 139
+             141:    116(ptr) AccessChain 27(b1) 115
+             142:     20(int) Load 141
+             143:     20(int) IAdd 142 32
+             144:     28(ptr) AccessChain 52(b5) 114 143
+             145:6(float16_t) Load 144
+             146:   37(float) FConvert 145
+             147:    116(ptr) AccessChain 27(b1) 115
+             148:     20(int) Load 147
+             149:     20(int) IAdd 148 33
+             150:     28(ptr) AccessChain 52(b5) 114 149
+             151:6(float16_t) Load 150
+             152:   37(float) FConvert 151
+             153:   38(fvec3) CompositeConstruct 140 146 152
+                              Store 135(u3) 153
+             154:     43(ptr) AccessChain 19(b2) 115 21
+             155:  7(f16vec2) Load 154
+             156:     43(ptr) AccessChain 19(b2) 115 21
+                              Store 156 155
+             157:     43(ptr) AccessChain 52(b5) 115 32
+             158:  7(f16vec2) Load 157
+             159:     43(ptr) AccessChain 19(b2) 115 32
+                              Store 159 158
+             160:     28(ptr) AccessChain 27(b1) 21
+             161:6(float16_t) Load 160
+             162:     28(ptr) AccessChain 19(b2) 32 104
+                              Store 162 161
+             163:     28(ptr) AccessChain 19(b2) 32 104
+             164:6(float16_t) Load 163
+             165:     28(ptr) AccessChain 19(b2) 21
+                              Store 165 164
+             169:     43(ptr) AccessChain 19(b2) 32
+                              Store 169 168
+             171:     28(ptr) AccessChain 19(b2) 21
+                              Store 171 170
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.16bitstorage_Error-int.frag.out b/Test/baseResults/spv.16bitstorage_Error-int.frag.out
new file mode 100644
index 0000000..d6a0c13
--- /dev/null
+++ b/Test/baseResults/spv.16bitstorage_Error-int.frag.out
@@ -0,0 +1,91 @@
+spv.16bitstorage_Error-int.frag
+ERROR: 0:54: 'structure: (u)int16 types can only be in uniform block or buffer storage' : required extension not requested: Possible extensions include:
+GL_AMD_gpu_shader_int16
+GL_EXT_shader_explicit_arithmetic_types
+GL_EXT_shader_explicit_arithmetic_types_int16
+ERROR: 0:58: 'return: can't use with structs containing int16' : required extension not requested: Possible extensions include:
+GL_AMD_gpu_shader_int16
+GL_EXT_shader_explicit_arithmetic_types
+GL_EXT_shader_explicit_arithmetic_types_int16
+ERROR: 0:61: 'int16_t: (u)int16 types can only be in uniform block or buffer storage' : required extension not requested: Possible extensions include:
+GL_AMD_gpu_shader_int16
+GL_EXT_shader_explicit_arithmetic_types
+GL_EXT_shader_explicit_arithmetic_types_int16
+ERROR: 0:74: '[: does not operate on types containing (u)int16' : required extension not requested: Possible extensions include:
+GL_AMD_gpu_shader_int16
+GL_EXT_shader_explicit_arithmetic_types
+GL_EXT_shader_explicit_arithmetic_types_int16
+ERROR: 0:75: '.: can't swizzle types containing (u)int16' : required extension not requested: Possible extensions include:
+GL_AMD_gpu_shader_int16
+GL_EXT_shader_explicit_arithmetic_types
+GL_EXT_shader_explicit_arithmetic_types_int16
+ERROR: 0:76: 'built-in function: (u)int16 types can only be in uniform block or buffer storage' : required extension not requested: Possible extensions include:
+GL_AMD_gpu_shader_int16
+GL_EXT_shader_explicit_arithmetic_types
+GL_EXT_shader_explicit_arithmetic_types_int16
+ERROR: 0:76: 'built-in function: (u)int16 types can only be in uniform block or buffer storage' : required extension not requested: Possible extensions include:
+GL_AMD_gpu_shader_int16
+GL_EXT_shader_explicit_arithmetic_types
+GL_EXT_shader_explicit_arithmetic_types_int16
+ERROR: 0:76: 'built-in function: (u)int16 types can only be in uniform block or buffer storage' : required extension not requested: Possible extensions include:
+GL_AMD_gpu_shader_int16
+GL_EXT_shader_explicit_arithmetic_types
+GL_EXT_shader_explicit_arithmetic_types_int16
+ERROR: 0:77: 'built-in function: (u)int16 types can only be in uniform block or buffer storage' : required extension not requested: Possible extensions include:
+GL_AMD_gpu_shader_int16
+GL_EXT_shader_explicit_arithmetic_types
+GL_EXT_shader_explicit_arithmetic_types_int16
+ERROR: 0:77: 'built-in function: (u)int16 types can only be in uniform block or buffer storage' : required extension not requested: Possible extensions include:
+GL_AMD_gpu_shader_int16
+GL_EXT_shader_explicit_arithmetic_types
+GL_EXT_shader_explicit_arithmetic_types_int16
+ERROR: 0:78: '+' :  wrong operand types: no operation '+' exists that takes a left-hand operand of type 'layout( column_major std140 offset=0) uniform int16_t' and a right operand of type 'layout( column_major std140 offset=0) uniform int16_t' (or there is no acceptable conversion)
+ERROR: 0:79: '-' :  wrong operand type no operation '-' exists that takes an operand of type layout( column_major std140 offset=0) uniform int16_t (or there is no acceptable conversion)
+ERROR: 0:80: '+' :  wrong operand types: no operation '+' exists that takes a left-hand operand of type 'layout( column_major std140 offset=0) uniform int16_t' and a right operand of type ' const int' (or there is no acceptable conversion)
+ERROR: 0:81: '.: can't swizzle types containing (u)int16' : required extension not requested: Possible extensions include:
+GL_AMD_gpu_shader_int16
+GL_EXT_shader_explicit_arithmetic_types
+GL_EXT_shader_explicit_arithmetic_types_int16
+ERROR: 0:82: '=: can't use with structs containing int16' : required extension not requested: Possible extensions include:
+GL_AMD_gpu_shader_int16
+GL_EXT_shader_explicit_arithmetic_types
+GL_EXT_shader_explicit_arithmetic_types_int16
+ERROR: 0:83: 'qualifier: (u)int16 types can only be in uniform block or buffer storage' : required extension not requested: Possible extensions include:
+GL_AMD_gpu_shader_int16
+GL_EXT_shader_explicit_arithmetic_types
+GL_EXT_shader_explicit_arithmetic_types_int16
+ERROR: 0:84: 'qualifier: (u)int16 types can only be in uniform block or buffer storage' : required extension not requested: Possible extensions include:
+GL_AMD_gpu_shader_int16
+GL_EXT_shader_explicit_arithmetic_types
+GL_EXT_shader_explicit_arithmetic_types_int16
+ERROR: 0:85: 'qualifier: (u)int16 types can only be in uniform block or buffer storage' : required extension not requested: Possible extensions include:
+GL_AMD_gpu_shader_int16
+GL_EXT_shader_explicit_arithmetic_types
+GL_EXT_shader_explicit_arithmetic_types_int16
+ERROR: 0:86: '==' :  wrong operand types: no operation '==' exists that takes a left-hand operand of type 'layout( column_major std140 offset=0) uniform int16_t' and a right operand of type 'layout( column_major std140 offset=0) uniform int16_t' (or there is no acceptable conversion)
+ERROR: 0:87: '=: can't use with arrays containing int16' : required extension not requested: Possible extensions include:
+GL_AMD_gpu_shader_int16
+GL_EXT_shader_explicit_arithmetic_types
+GL_EXT_shader_explicit_arithmetic_types_int16
+ERROR: 0:88: 'constructor: 16-bit vectors only take vector types' : required extension not requested: Possible extensions include:
+GL_AMD_gpu_shader_int16
+GL_EXT_shader_explicit_arithmetic_types
+GL_EXT_shader_explicit_arithmetic_types_int16
+ERROR: 0:89: 'constructor: 16-bit arrays not supported' : required extension not requested: Possible extensions include:
+GL_AMD_gpu_shader_int16
+GL_EXT_shader_explicit_arithmetic_types
+GL_EXT_shader_explicit_arithmetic_types_int16
+ERROR: 0:89: 'constructor: 16-bit vectors only take vector types' : required extension not requested: Possible extensions include:
+GL_AMD_gpu_shader_int16
+GL_EXT_shader_explicit_arithmetic_types
+GL_EXT_shader_explicit_arithmetic_types_int16
+ERROR: 0:92: 'constructor: can't construct structure containing 16-bit type' : required extension not requested: Possible extensions include:
+GL_AMD_gpu_shader_int16
+GL_EXT_shader_explicit_arithmetic_types
+GL_EXT_shader_explicit_arithmetic_types_int16
+ERROR: 0:93: 'func2' : no matching overloaded function found 
+ERROR: 0:99: '' :  syntax error, unexpected IDENTIFIER
+ERROR: 26 compilation errors.  No code generated.
+
+
+SPIR-V is not generated for failed compile or link
diff --git a/Test/baseResults/spv.16bitstorage_Error-uint.frag.out b/Test/baseResults/spv.16bitstorage_Error-uint.frag.out
new file mode 100644
index 0000000..bac902e
--- /dev/null
+++ b/Test/baseResults/spv.16bitstorage_Error-uint.frag.out
@@ -0,0 +1,91 @@
+spv.16bitstorage_Error-uint.frag
+ERROR: 0:54: 'structure: (u)int16 types can only be in uniform block or buffer storage' : required extension not requested: Possible extensions include:
+GL_AMD_gpu_shader_int16
+GL_EXT_shader_explicit_arithmetic_types
+GL_EXT_shader_explicit_arithmetic_types_int16
+ERROR: 0:58: 'return: can't use with structs containing uint16' : required extension not requested: Possible extensions include:
+GL_AMD_gpu_shader_int16
+GL_EXT_shader_explicit_arithmetic_types
+GL_EXT_shader_explicit_arithmetic_types_int16
+ERROR: 0:61: 'uint16_t: (u)int16 types can only be in uniform block or buffer storage' : required extension not requested: Possible extensions include:
+GL_AMD_gpu_shader_int16
+GL_EXT_shader_explicit_arithmetic_types
+GL_EXT_shader_explicit_arithmetic_types_int16
+ERROR: 0:74: '[: does not operate on types containing (u)int16' : required extension not requested: Possible extensions include:
+GL_AMD_gpu_shader_int16
+GL_EXT_shader_explicit_arithmetic_types
+GL_EXT_shader_explicit_arithmetic_types_int16
+ERROR: 0:75: '.: can't swizzle types containing (u)int16' : required extension not requested: Possible extensions include:
+GL_AMD_gpu_shader_int16
+GL_EXT_shader_explicit_arithmetic_types
+GL_EXT_shader_explicit_arithmetic_types_int16
+ERROR: 0:76: 'built-in function: (u)int16 types can only be in uniform block or buffer storage' : required extension not requested: Possible extensions include:
+GL_AMD_gpu_shader_int16
+GL_EXT_shader_explicit_arithmetic_types
+GL_EXT_shader_explicit_arithmetic_types_int16
+ERROR: 0:76: 'built-in function: (u)int16 types can only be in uniform block or buffer storage' : required extension not requested: Possible extensions include:
+GL_AMD_gpu_shader_int16
+GL_EXT_shader_explicit_arithmetic_types
+GL_EXT_shader_explicit_arithmetic_types_int16
+ERROR: 0:76: 'built-in function: (u)int16 types can only be in uniform block or buffer storage' : required extension not requested: Possible extensions include:
+GL_AMD_gpu_shader_int16
+GL_EXT_shader_explicit_arithmetic_types
+GL_EXT_shader_explicit_arithmetic_types_int16
+ERROR: 0:77: 'built-in function: (u)int16 types can only be in uniform block or buffer storage' : required extension not requested: Possible extensions include:
+GL_AMD_gpu_shader_int16
+GL_EXT_shader_explicit_arithmetic_types
+GL_EXT_shader_explicit_arithmetic_types_int16
+ERROR: 0:77: 'built-in function: (u)int16 types can only be in uniform block or buffer storage' : required extension not requested: Possible extensions include:
+GL_AMD_gpu_shader_int16
+GL_EXT_shader_explicit_arithmetic_types
+GL_EXT_shader_explicit_arithmetic_types_int16
+ERROR: 0:78: '+' :  wrong operand types: no operation '+' exists that takes a left-hand operand of type 'layout( column_major std140 offset=0) uniform uint16_t' and a right operand of type 'layout( column_major std140 offset=0) uniform uint16_t' (or there is no acceptable conversion)
+ERROR: 0:79: '-' :  wrong operand type no operation '-' exists that takes an operand of type layout( column_major std140 offset=0) uniform uint16_t (or there is no acceptable conversion)
+ERROR: 0:80: '+' :  wrong operand types: no operation '+' exists that takes a left-hand operand of type 'layout( column_major std140 offset=0) uniform uint16_t' and a right operand of type ' const int' (or there is no acceptable conversion)
+ERROR: 0:81: '.: can't swizzle types containing (u)int16' : required extension not requested: Possible extensions include:
+GL_AMD_gpu_shader_int16
+GL_EXT_shader_explicit_arithmetic_types
+GL_EXT_shader_explicit_arithmetic_types_int16
+ERROR: 0:82: '=: can't use with structs containing uint16' : required extension not requested: Possible extensions include:
+GL_AMD_gpu_shader_int16
+GL_EXT_shader_explicit_arithmetic_types
+GL_EXT_shader_explicit_arithmetic_types_int16
+ERROR: 0:83: 'qualifier: (u)int16 types can only be in uniform block or buffer storage' : required extension not requested: Possible extensions include:
+GL_AMD_gpu_shader_int16
+GL_EXT_shader_explicit_arithmetic_types
+GL_EXT_shader_explicit_arithmetic_types_int16
+ERROR: 0:84: 'qualifier: (u)int16 types can only be in uniform block or buffer storage' : required extension not requested: Possible extensions include:
+GL_AMD_gpu_shader_int16
+GL_EXT_shader_explicit_arithmetic_types
+GL_EXT_shader_explicit_arithmetic_types_int16
+ERROR: 0:85: 'qualifier: (u)int16 types can only be in uniform block or buffer storage' : required extension not requested: Possible extensions include:
+GL_AMD_gpu_shader_int16
+GL_EXT_shader_explicit_arithmetic_types
+GL_EXT_shader_explicit_arithmetic_types_int16
+ERROR: 0:86: '==' :  wrong operand types: no operation '==' exists that takes a left-hand operand of type 'layout( column_major std140 offset=0) uniform uint16_t' and a right operand of type 'layout( column_major std140 offset=0) uniform uint16_t' (or there is no acceptable conversion)
+ERROR: 0:87: '=: can't use with arrays containing uint16' : required extension not requested: Possible extensions include:
+GL_AMD_gpu_shader_int16
+GL_EXT_shader_explicit_arithmetic_types
+GL_EXT_shader_explicit_arithmetic_types_int16
+ERROR: 0:88: 'constructor: 16-bit vectors only take vector types' : required extension not requested: Possible extensions include:
+GL_AMD_gpu_shader_int16
+GL_EXT_shader_explicit_arithmetic_types
+GL_EXT_shader_explicit_arithmetic_types_int16
+ERROR: 0:89: 'constructor: 16-bit arrays not supported' : required extension not requested: Possible extensions include:
+GL_AMD_gpu_shader_int16
+GL_EXT_shader_explicit_arithmetic_types
+GL_EXT_shader_explicit_arithmetic_types_int16
+ERROR: 0:89: 'constructor: 16-bit vectors only take vector types' : required extension not requested: Possible extensions include:
+GL_AMD_gpu_shader_int16
+GL_EXT_shader_explicit_arithmetic_types
+GL_EXT_shader_explicit_arithmetic_types_int16
+ERROR: 0:92: 'constructor: can't construct structure containing 16-bit type' : required extension not requested: Possible extensions include:
+GL_AMD_gpu_shader_int16
+GL_EXT_shader_explicit_arithmetic_types
+GL_EXT_shader_explicit_arithmetic_types_int16
+ERROR: 0:93: 'func2' : no matching overloaded function found 
+ERROR: 0:99: '' :  syntax error, unexpected IDENTIFIER
+ERROR: 26 compilation errors.  No code generated.
+
+
+SPIR-V is not generated for failed compile or link
diff --git a/Test/baseResults/spv.16bitstorage_Error.frag.out b/Test/baseResults/spv.16bitstorage_Error.frag.out
new file mode 100644
index 0000000..8e7e35e
--- /dev/null
+++ b/Test/baseResults/spv.16bitstorage_Error.frag.out
@@ -0,0 +1,99 @@
+spv.16bitstorage_Error.frag
+ERROR: 0:54: 'structure: float16 types can only be in uniform block or buffer storage' : required extension not requested: Possible extensions include:
+GL_AMD_gpu_shader_half_float
+GL_EXT_shader_explicit_arithmetic_types
+GL_EXT_shader_explicit_arithmetic_types_float16
+ERROR: 0:58: 'return: can't use with structs containing float16' : required extension not requested: Possible extensions include:
+GL_AMD_gpu_shader_half_float
+GL_EXT_shader_explicit_arithmetic_types
+GL_EXT_shader_explicit_arithmetic_types_float16
+ERROR: 0:61: 'float16_t: float16 types can only be in uniform block or buffer storage' : required extension not requested: Possible extensions include:
+GL_AMD_gpu_shader_half_float
+GL_EXT_shader_explicit_arithmetic_types
+GL_EXT_shader_explicit_arithmetic_types_float16
+ERROR: 0:74: '[: does not operate on types containing float16' : required extension not requested: Possible extensions include:
+GL_AMD_gpu_shader_half_float
+GL_EXT_shader_explicit_arithmetic_types
+GL_EXT_shader_explicit_arithmetic_types_float16
+ERROR: 0:75: '.: can't swizzle types containing float16' : required extension not requested: Possible extensions include:
+GL_AMD_gpu_shader_half_float
+GL_EXT_shader_explicit_arithmetic_types
+GL_EXT_shader_explicit_arithmetic_types_float16
+ERROR: 0:76: 'built-in function: float16 types can only be in uniform block or buffer storage' : required extension not requested: Possible extensions include:
+GL_AMD_gpu_shader_half_float
+GL_EXT_shader_explicit_arithmetic_types
+GL_EXT_shader_explicit_arithmetic_types_float16
+ERROR: 0:76: 'built-in function: float16 types can only be in uniform block or buffer storage' : required extension not requested: Possible extensions include:
+GL_AMD_gpu_shader_half_float
+GL_EXT_shader_explicit_arithmetic_types
+GL_EXT_shader_explicit_arithmetic_types_float16
+ERROR: 0:76: 'built-in function: float16 types can only be in uniform block or buffer storage' : required extension not requested: Possible extensions include:
+GL_AMD_gpu_shader_half_float
+GL_EXT_shader_explicit_arithmetic_types
+GL_EXT_shader_explicit_arithmetic_types_float16
+ERROR: 0:77: 'built-in function: float16 types can only be in uniform block or buffer storage' : required extension not requested: Possible extensions include:
+GL_AMD_gpu_shader_half_float
+GL_EXT_shader_explicit_arithmetic_types
+GL_EXT_shader_explicit_arithmetic_types_float16
+ERROR: 0:77: 'built-in function: float16 types can only be in uniform block or buffer storage' : required extension not requested: Possible extensions include:
+GL_AMD_gpu_shader_half_float
+GL_EXT_shader_explicit_arithmetic_types
+GL_EXT_shader_explicit_arithmetic_types_float16
+ERROR: 0:78: '+' :  wrong operand types: no operation '+' exists that takes a left-hand operand of type 'layout( column_major std140 offset=0) uniform float16_t' and a right operand of type 'layout( column_major std140 offset=0) uniform float16_t' (or there is no acceptable conversion)
+ERROR: 0:79: '-' :  wrong operand type no operation '-' exists that takes an operand of type layout( column_major std140 offset=0) uniform float16_t (or there is no acceptable conversion)
+ERROR: 0:80: '+' :  wrong operand types: no operation '+' exists that takes a left-hand operand of type 'layout( column_major std140 offset=0) uniform float16_t' and a right operand of type ' const float' (or there is no acceptable conversion)
+ERROR: 0:81: '.: can't swizzle types containing float16' : required extension not requested: Possible extensions include:
+GL_AMD_gpu_shader_half_float
+GL_EXT_shader_explicit_arithmetic_types
+GL_EXT_shader_explicit_arithmetic_types_float16
+ERROR: 0:82: '=: can't use with structs containing float16' : required extension not requested: Possible extensions include:
+GL_AMD_gpu_shader_half_float
+GL_EXT_shader_explicit_arithmetic_types
+GL_EXT_shader_explicit_arithmetic_types_float16
+ERROR: 0:83: 'qualifier: float16 types can only be in uniform block or buffer storage' : required extension not requested: Possible extensions include:
+GL_AMD_gpu_shader_half_float
+GL_EXT_shader_explicit_arithmetic_types
+GL_EXT_shader_explicit_arithmetic_types_float16
+ERROR: 0:84: 'qualifier: float16 types can only be in uniform block or buffer storage' : required extension not requested: Possible extensions include:
+GL_AMD_gpu_shader_half_float
+GL_EXT_shader_explicit_arithmetic_types
+GL_EXT_shader_explicit_arithmetic_types_float16
+ERROR: 0:85: 'qualifier: float16 types can only be in uniform block or buffer storage' : required extension not requested: Possible extensions include:
+GL_AMD_gpu_shader_half_float
+GL_EXT_shader_explicit_arithmetic_types
+GL_EXT_shader_explicit_arithmetic_types_float16
+ERROR: 0:86: '==' :  wrong operand types: no operation '==' exists that takes a left-hand operand of type 'layout( column_major std140 offset=0) uniform float16_t' and a right operand of type 'layout( column_major std140 offset=0) uniform float16_t' (or there is no acceptable conversion)
+ERROR: 0:87: '=: can't use with arrays containing float16' : required extension not requested: Possible extensions include:
+GL_AMD_gpu_shader_half_float
+GL_EXT_shader_explicit_arithmetic_types
+GL_EXT_shader_explicit_arithmetic_types_float16
+ERROR: 0:88: 'half floating-point suffix' : required extension not requested: Possible extensions include:
+GL_AMD_gpu_shader_half_float
+GL_EXT_shader_explicit_arithmetic_types
+GL_EXT_shader_explicit_arithmetic_types_float16
+ERROR: 0:88: 'half float literal' : required extension not requested: Possible extensions include:
+GL_AMD_gpu_shader_half_float
+GL_EXT_shader_explicit_arithmetic_types
+GL_EXT_shader_explicit_arithmetic_types_float16
+ERROR: 0:89: 'constructor: 16-bit vectors only take vector types' : required extension not requested: Possible extensions include:
+GL_AMD_gpu_shader_half_float
+GL_EXT_shader_explicit_arithmetic_types
+GL_EXT_shader_explicit_arithmetic_types_float16
+ERROR: 0:90: 'constructor: 16-bit arrays not supported' : required extension not requested: Possible extensions include:
+GL_AMD_gpu_shader_half_float
+GL_EXT_shader_explicit_arithmetic_types
+GL_EXT_shader_explicit_arithmetic_types_float16
+ERROR: 0:90: 'constructor: 16-bit vectors only take vector types' : required extension not requested: Possible extensions include:
+GL_AMD_gpu_shader_half_float
+GL_EXT_shader_explicit_arithmetic_types
+GL_EXT_shader_explicit_arithmetic_types_float16
+ERROR: 0:93: 'constructor: can't construct structure containing 16-bit type' : required extension not requested: Possible extensions include:
+GL_AMD_gpu_shader_half_float
+GL_EXT_shader_explicit_arithmetic_types
+GL_EXT_shader_explicit_arithmetic_types_float16
+ERROR: 0:94: 'func2' : no matching overloaded function found 
+ERROR: 0:100: '' :  syntax error, unexpected IDENTIFIER
+ERROR: 28 compilation errors.  No code generated.
+
+
+SPIR-V is not generated for failed compile or link
diff --git a/Test/baseResults/spv.300BuiltIns.vert.out b/Test/baseResults/spv.300BuiltIns.vert.out
old mode 100755
new mode 100644
index 7dc949d..ee2c236
--- a/Test/baseResults/spv.300BuiltIns.vert.out
+++ b/Test/baseResults/spv.300BuiltIns.vert.out
@@ -1,8 +1,6 @@
 spv.300BuiltIns.vert
-Warning, version 310 is not yet complete; most version-specific features are present, but some are missing.
-
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 42
 
                               Capability Shader
diff --git a/Test/baseResults/spv.300layout.frag.out b/Test/baseResults/spv.300layout.frag.out
old mode 100755
new mode 100644
index 7ce08d8..10a6d00
--- a/Test/baseResults/spv.300layout.frag.out
+++ b/Test/baseResults/spv.300layout.frag.out
@@ -1,8 +1,6 @@
 spv.300layout.frag
-Warning, version 310 is not yet complete; most version-specific features are present, but some are missing.
-
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 37
 
                               Capability Shader
diff --git a/Test/baseResults/spv.300layout.vert.out b/Test/baseResults/spv.300layout.vert.out
index 69f66b6..0c0663e 100644
--- a/Test/baseResults/spv.300layout.vert.out
+++ b/Test/baseResults/spv.300layout.vert.out
@@ -1,8 +1,6 @@
 spv.300layout.vert
-Warning, version 310 is not yet complete; most version-specific features are present, but some are missing.
-
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 163
 
                               Capability Shader
diff --git a/Test/baseResults/spv.300layoutp.vert.out b/Test/baseResults/spv.300layoutp.vert.out
old mode 100755
new mode 100644
index 5924137..9c4201d
--- a/Test/baseResults/spv.300layoutp.vert.out
+++ b/Test/baseResults/spv.300layoutp.vert.out
@@ -1,8 +1,6 @@
 spv.300layoutp.vert
-Warning, version 310 is not yet complete; most version-specific features are present, but some are missing.
-
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 115
 
                               Capability Shader
diff --git a/Test/baseResults/spv.310.bitcast.frag.out b/Test/baseResults/spv.310.bitcast.frag.out
old mode 100755
new mode 100644
index 14e184a..d7a244f
--- a/Test/baseResults/spv.310.bitcast.frag.out
+++ b/Test/baseResults/spv.310.bitcast.frag.out
@@ -1,8 +1,6 @@
 spv.310.bitcast.frag
-Warning, version 310 is not yet complete; most version-specific features are present, but some are missing.
-
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 153
 
                               Capability Shader
diff --git a/Test/baseResults/spv.310.comp.out b/Test/baseResults/spv.310.comp.out
index 4b47c7d..f4eaa20 100644
--- a/Test/baseResults/spv.310.comp.out
+++ b/Test/baseResults/spv.310.comp.out
@@ -1,131 +1,134 @@
 spv.310.comp
-Warning, version 310 is not yet complete; most version-specific features are present, but some are missing.
-
 // Module Version 10000
-// Generated by (magic number): 80001
-// Id's are bound by 69
+// Generated by (magic number): 80007
+// Id's are bound by 72
 
                               Capability Shader
                               Capability DeviceGroup
                               Extension  "SPV_KHR_device_group"
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint GLCompute 4  "main" 53 64
+                              EntryPoint GLCompute 4  "main" 53 65
                               ExecutionMode 4 LocalSize 16 32 4
                               Source ESSL 310
                               SourceExtension  "GL_EXT_device_group"
                               Name 4  "main"
-                              Name 13  "outb"
-                              MemberName 13(outb) 0  "f"
-                              MemberName 13(outb) 1  "g"
-                              MemberName 13(outb) 2  "h"
-                              MemberName 13(outb) 3  "uns"
-                              Name 15  "outbname"
-                              Name 19  "s"
-                              Name 24  "outbna"
-                              MemberName 24(outbna) 0  "k"
-                              MemberName 24(outbna) 1  "na"
-                              Name 26  "outbnamena"
+                              Name 12  "outb"
+                              MemberName 12(outb) 0  "f"
+                              MemberName 12(outb) 1  "g"
+                              MemberName 12(outb) 2  "h"
+                              MemberName 12(outb) 3  "uns"
+                              Name 14  "outbname"
+                              Name 18  "s"
+                              Name 23  "outbna"
+                              MemberName 23(outbna) 0  "k"
+                              MemberName 23(outbna) 1  "na"
+                              Name 25  "outbnamena"
                               Name 42  "i"
                               Name 48  "outs"
                               MemberName 48(outs) 0  "s"
                               MemberName 48(outs) 1  "va"
                               Name 50  "outnames"
                               Name 53  "gl_LocalInvocationID"
-                              Name 64  "gl_DeviceIndex"
-                              Decorate 12 ArrayStride 16
-                              MemberDecorate 13(outb) 0 Offset 0
-                              MemberDecorate 13(outb) 1 Offset 4
-                              MemberDecorate 13(outb) 2 Offset 8
-                              MemberDecorate 13(outb) 3 Offset 16
-                              Decorate 13(outb) BufferBlock
-                              Decorate 15(outbname) DescriptorSet 0
-                              MemberDecorate 24(outbna) 0 Offset 0
-                              MemberDecorate 24(outbna) 1 Offset 16
-                              Decorate 24(outbna) BufferBlock
-                              Decorate 26(outbnamena) DescriptorSet 0
+                              Name 65  "gl_DeviceIndex"
+                              Decorate 11 ArrayStride 16
+                              MemberDecorate 12(outb) 0 Offset 0
+                              MemberDecorate 12(outb) 1 Offset 4
+                              MemberDecorate 12(outb) 2 Offset 8
+                              MemberDecorate 12(outb) 3 Offset 16
+                              Decorate 12(outb) BufferBlock
+                              Decorate 14(outbname) DescriptorSet 0
+                              MemberDecorate 23(outbna) 0 Offset 0
+                              MemberDecorate 23(outbna) 1 Offset 16
+                              Decorate 23(outbna) BufferBlock
+                              Decorate 25(outbnamena) DescriptorSet 0
                               Decorate 47 ArrayStride 16
                               MemberDecorate 48(outs) 0 Offset 0
                               MemberDecorate 48(outs) 1 Offset 16
                               Decorate 48(outs) BufferBlock
                               Decorate 50(outnames) DescriptorSet 0
                               Decorate 53(gl_LocalInvocationID) BuiltIn LocalInvocationId
-                              Decorate 64(gl_DeviceIndex) BuiltIn DeviceIndex
-                              Decorate 68 BuiltIn WorkgroupSize
+                              Decorate 65(gl_DeviceIndex) BuiltIn DeviceIndex
+                              Decorate 71 BuiltIn WorkgroupSize
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 32 0
                7:      6(int) Constant 2
-               8:      6(int) Constant 1
-               9:      6(int) Constant 0
-              10:             TypeFloat 32
-              11:             TypeVector 10(float) 3
-              12:             TypeRuntimeArray 11(fvec3)
-        13(outb):             TypeStruct 10(float) 10(float) 10(float) 12
-              14:             TypePointer Uniform 13(outb)
-    15(outbname):     14(ptr) Variable Uniform
-              16:             TypeInt 32 1
-              17:     16(int) Constant 0
-              18:             TypePointer Workgroup 10(float)
-           19(s):     18(ptr) Variable Workgroup
-              21:             TypePointer Uniform 10(float)
-              23:             TypeVector 10(float) 4
-      24(outbna):             TypeStruct 16(int) 23(fvec4)
-              25:             TypePointer Uniform 24(outbna)
-  26(outbnamena):     25(ptr) Variable Uniform
-              27:     16(int) Constant 1
-              30:             TypePointer Uniform 23(fvec4)
-              32:     16(int) Constant 3
-              33:     16(int) Constant 18
-              36:     16(int) Constant 17
-              37:   10(float) Constant 1077936128
-              38:   11(fvec3) ConstantComposite 37 37 37
-              39:             TypePointer Uniform 11(fvec3)
-              41:             TypePointer Workgroup 16(int)
+               8:      6(int) Constant 264
+               9:             TypeFloat 32
+              10:             TypeVector 9(float) 3
+              11:             TypeRuntimeArray 10(fvec3)
+        12(outb):             TypeStruct 9(float) 9(float) 9(float) 11
+              13:             TypePointer Uniform 12(outb)
+    14(outbname):     13(ptr) Variable Uniform
+              15:             TypeInt 32 1
+              16:     15(int) Constant 0
+              17:             TypePointer Workgroup 9(float)
+           18(s):     17(ptr) Variable Workgroup
+              20:             TypePointer Uniform 9(float)
+              22:             TypeVector 9(float) 4
+      23(outbna):             TypeStruct 15(int) 22(fvec4)
+              24:             TypePointer Uniform 23(outbna)
+  25(outbnamena):     24(ptr) Variable Uniform
+              26:     15(int) Constant 1
+              29:             TypePointer Uniform 22(fvec4)
+              31:     15(int) Constant 3
+              32:     15(int) Constant 18
+              33:      6(int) Constant 0
+              36:     15(int) Constant 17
+              37:    9(float) Constant 1077936128
+              38:   10(fvec3) ConstantComposite 37 37 37
+              39:             TypePointer Uniform 10(fvec3)
+              41:             TypePointer Workgroup 15(int)
            42(i):     41(ptr) Variable Workgroup
-              47:             TypeRuntimeArray 23(fvec4)
-        48(outs):             TypeStruct 16(int) 47
+              47:             TypeRuntimeArray 22(fvec4)
+        48(outs):             TypeStruct 15(int) 47
               49:             TypePointer Uniform 48(outs)
     50(outnames):     49(ptr) Variable Uniform
               51:             TypeVector 6(int) 3
               52:             TypePointer Input 51(ivec3)
 53(gl_LocalInvocationID):     52(ptr) Variable Input
               54:             TypePointer Input 6(int)
-              61:             TypePointer Uniform 16(int)
-              63:             TypePointer Input 16(int)
-64(gl_DeviceIndex):     63(ptr) Variable Input
-              65:      6(int) Constant 16
-              66:      6(int) Constant 32
-              67:      6(int) Constant 4
-              68:   51(ivec3) ConstantComposite 65 66 67
+              62:             TypePointer Uniform 15(int)
+              64:             TypePointer Input 15(int)
+65(gl_DeviceIndex):     64(ptr) Variable Input
+              66:      6(int) Constant 1
+              67:      6(int) Constant 3400
+              68:      6(int) Constant 16
+              69:      6(int) Constant 32
+              70:      6(int) Constant 4
+              71:   51(ivec3) ConstantComposite 68 69 70
          4(main):           2 Function None 3
                5:             Label
-                              ControlBarrier 7 8 9
-              20:   10(float) Load 19(s)
-              22:     21(ptr) AccessChain 15(outbname) 17
-                              Store 22 20
-              28:   10(float) Load 19(s)
-              29:   23(fvec4) CompositeConstruct 28 28 28 28
-              31:     30(ptr) AccessChain 26(outbnamena) 27
-                              Store 31 29
-              34:     21(ptr) AccessChain 15(outbname) 32 33 9
-              35:   10(float) Load 34
-                              Store 19(s) 35
-              40:     39(ptr) AccessChain 15(outbname) 32 36
+                              ControlBarrier 7 7 8
+              19:    9(float) Load 18(s)
+              21:     20(ptr) AccessChain 14(outbname) 16
+                              Store 21 19
+              27:    9(float) Load 18(s)
+              28:   22(fvec4) CompositeConstruct 27 27 27 27
+              30:     29(ptr) AccessChain 25(outbnamena) 26
+                              Store 30 28
+              34:     20(ptr) AccessChain 14(outbname) 31 32 33
+              35:    9(float) Load 34
+                              Store 18(s) 35
+              40:     39(ptr) AccessChain 14(outbname) 31 36
                               Store 40 38
-              43:     16(int) Load 42(i)
-              44:   10(float) Load 19(s)
-              45:   11(fvec3) CompositeConstruct 44 44 44
-              46:     39(ptr) AccessChain 15(outbname) 32 43
+              43:     15(int) Load 42(i)
+              44:    9(float) Load 18(s)
+              45:   10(fvec3) CompositeConstruct 44 44 44
+              46:     39(ptr) AccessChain 14(outbname) 31 43
                               Store 46 45
-              55:     54(ptr) AccessChain 53(gl_LocalInvocationID) 9
+              55:     54(ptr) AccessChain 53(gl_LocalInvocationID) 33
               56:      6(int) Load 55
-              57:   10(float) Load 19(s)
-              58:   23(fvec4) CompositeConstruct 57 57 57 57
-              59:     30(ptr) AccessChain 50(outnames) 27 56
+              57:    9(float) Load 18(s)
+              58:   22(fvec4) CompositeConstruct 57 57 57 57
+              59:     29(ptr) AccessChain 50(outnames) 26 56
                               Store 59 58
-              60:     16(int) ArrayLength 15(outbname) 3
-              62:     61(ptr) AccessChain 50(outnames) 17
-                              Store 62 60
+              60:      6(int) ArrayLength 14(outbname) 3
+              61:     15(int) Bitcast 60
+              63:     62(ptr) AccessChain 50(outnames) 16
+                              Store 63 61
+                              MemoryBarrier 66 8
+                              MemoryBarrier 7 67
                               Return
                               FunctionEnd
diff --git a/Test/baseResults/spv.320.meshShaderUserDefined.mesh.out b/Test/baseResults/spv.320.meshShaderUserDefined.mesh.out
new file mode 100644
index 0000000..20b6fa2
--- /dev/null
+++ b/Test/baseResults/spv.320.meshShaderUserDefined.mesh.out
@@ -0,0 +1,205 @@
+spv.320.meshShaderUserDefined.mesh
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 140
+
+                              Capability MeshShadingNV
+                              Extension  "SPV_NV_mesh_shader"
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint MeshNV 4  "main" 12 19 37 103
+                              ExecutionMode 4 LocalSize 32 1 1
+                              ExecutionMode 4 OutputVertices 81
+                              ExecutionMode 4 OutputPrimitivesNV 32
+                              ExecutionMode 4 OutputTrianglesNV
+                              Source ESSL 320
+                              SourceExtension  "GL_NV_mesh_shader"
+                              Name 4  "main"
+                              Name 8  "iid"
+                              Name 12  "gl_LocalInvocationID"
+                              Name 18  "gid"
+                              Name 19  "gl_WorkGroupID"
+                              Name 33  "myblock"
+                              MemberName 33(myblock) 0  "f"
+                              MemberName 33(myblock) 1  "fArr"
+                              MemberName 33(myblock) 2  "pos"
+                              MemberName 33(myblock) 3  "posArr"
+                              MemberName 33(myblock) 4  "m"
+                              MemberName 33(myblock) 5  "mArr"
+                              Name 37  "blk"
+                              Name 99  "myblock2"
+                              MemberName 99(myblock2) 0  "f"
+                              MemberName 99(myblock2) 1  "pos"
+                              MemberName 99(myblock2) 2  "m"
+                              Name 103  "blk2"
+                              Decorate 12(gl_LocalInvocationID) BuiltIn LocalInvocationId
+                              Decorate 19(gl_WorkGroupID) BuiltIn WorkgroupId
+                              MemberDecorate 33(myblock) 0 PerPrimitiveNV
+                              MemberDecorate 33(myblock) 1 PerPrimitiveNV
+                              MemberDecorate 33(myblock) 2 PerPrimitiveNV
+                              MemberDecorate 33(myblock) 3 PerPrimitiveNV
+                              MemberDecorate 33(myblock) 4 PerPrimitiveNV
+                              MemberDecorate 33(myblock) 5 PerPrimitiveNV
+                              Decorate 33(myblock) Block
+                              Decorate 37(blk) Location 0
+                              Decorate 99(myblock2) Block
+                              Decorate 103(blk2) Location 20
+                              Decorate 139 BuiltIn WorkgroupSize
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeInt 32 1
+               7:             TypePointer Function 6(int)
+               9:             TypeInt 32 0
+              10:             TypeVector 9(int) 3
+              11:             TypePointer Input 10(ivec3)
+12(gl_LocalInvocationID):     11(ptr) Variable Input
+              13:      9(int) Constant 0
+              14:             TypePointer Input 9(int)
+19(gl_WorkGroupID):     11(ptr) Variable Input
+              23:             TypeFloat 32
+              24:      9(int) Constant 4
+              25:             TypeArray 23(float) 24
+              26:             TypeVector 23(float) 3
+              27:             TypeVector 23(float) 4
+              28:             TypeArray 27(fvec4) 24
+              29:             TypeMatrix 27(fvec4) 4
+              30:             TypeMatrix 26(fvec3) 3
+              31:      9(int) Constant 2
+              32:             TypeArray 30 31
+     33(myblock):             TypeStruct 23(float) 25 26(fvec3) 28 29 32
+              34:      9(int) Constant 32
+              35:             TypeArray 33(myblock) 34
+              36:             TypePointer Output 35
+         37(blk):     36(ptr) Variable Output
+              39:      6(int) Constant 0
+              40:   23(float) Constant 1093664768
+              41:             TypePointer Output 23(float)
+              44:      6(int) Constant 1
+              52:      6(int) Constant 2
+              54:   23(float) Constant 1096810496
+              55:   23(float) Constant 1097859072
+              56:   23(float) Constant 1095761920
+              57:   26(fvec3) ConstantComposite 54 55 56
+              58:             TypePointer Output 26(fvec3)
+              64:      6(int) Constant 3
+              69:             TypePointer Output 27(fvec4)
+              74:      6(int) Constant 4
+              76:   23(float) Constant 1098907648
+              77:   27(fvec4) ConstantComposite 56 54 55 76
+              82:      6(int) Constant 5
+              85:      9(int) Constant 3
+              88:      9(int) Constant 1
+              93:   23(float) Constant 1099431936
+              94:   23(float) Constant 1099956224
+              95:   23(float) Constant 1100480512
+              96:   26(fvec3) ConstantComposite 93 94 95
+              98:      9(int) Constant 264
+    99(myblock2):             TypeStruct 23(float) 27(fvec4) 29
+             100:      9(int) Constant 81
+             101:             TypeArray 99(myblock2) 100
+             102:             TypePointer Output 101
+       103(blk2):    102(ptr) Variable Output
+             109:   23(float) Constant 1101004800
+             113:   23(float) Constant 1101529088
+             114:   23(float) Constant 1102053376
+             115:   23(float) Constant 1102577664
+             116:   23(float) Constant 1103101952
+             117:   27(fvec4) ConstantComposite 113 114 115 116
+             129:   23(float) Constant 1105723392
+             139:   10(ivec3) ConstantComposite 34 88 88
+         4(main):           2 Function None 3
+               5:             Label
+          8(iid):      7(ptr) Variable Function
+         18(gid):      7(ptr) Variable Function
+              15:     14(ptr) AccessChain 12(gl_LocalInvocationID) 13
+              16:      9(int) Load 15
+              17:      6(int) Bitcast 16
+                              Store 8(iid) 17
+              20:     14(ptr) AccessChain 19(gl_WorkGroupID) 13
+              21:      9(int) Load 20
+              22:      6(int) Bitcast 21
+                              Store 18(gid) 22
+              38:      6(int) Load 8(iid)
+              42:     41(ptr) AccessChain 37(blk) 38 39
+                              Store 42 40
+              43:      6(int) Load 8(iid)
+              45:      6(int) IAdd 43 44
+              46:      6(int) Load 18(gid)
+              47:      6(int) Load 8(iid)
+              48:     41(ptr) AccessChain 37(blk) 47 39
+              49:   23(float) Load 48
+              50:     41(ptr) AccessChain 37(blk) 45 44 46
+                              Store 50 49
+              51:      6(int) Load 8(iid)
+              53:      6(int) SDiv 51 52
+              59:     58(ptr) AccessChain 37(blk) 53 52
+              60:   26(fvec3) Load 59
+              61:   26(fvec3) VectorShuffle 60 57 5 3 4
+                              Store 59 61
+              62:      6(int) Load 8(iid)
+              63:      6(int) IMul 62 52
+              65:      6(int) Load 8(iid)
+              66:      6(int) SDiv 65 52
+              67:     58(ptr) AccessChain 37(blk) 66 52
+              68:   26(fvec3) Load 67
+              70:     69(ptr) AccessChain 37(blk) 63 64 44
+              71:   27(fvec4) Load 70
+              72:   27(fvec4) VectorShuffle 71 68 0 4 5 6
+                              Store 70 72
+              73:      6(int) Load 8(iid)
+              75:      6(int) SDiv 73 74
+              78:     69(ptr) AccessChain 37(blk) 75 74 52
+              79:   27(fvec4) Load 78
+              80:   27(fvec4) VectorShuffle 79 77 7 6 5 4
+                              Store 78 80
+              81:      6(int) Load 8(iid)
+              83:      6(int) Load 8(iid)
+              84:      6(int) SDiv 83 74
+              86:     41(ptr) AccessChain 37(blk) 84 74 52 85
+              87:   23(float) Load 86
+              89:     41(ptr) AccessChain 37(blk) 81 82 39 44 88
+                              Store 89 87
+              90:      6(int) Load 8(iid)
+              91:      6(int) IMul 90 74
+              92:      6(int) Load 18(gid)
+              97:     58(ptr) AccessChain 37(blk) 91 82 44 92
+                              Store 97 96
+                              MemoryBarrier 88 98
+                              ControlBarrier 31 31 98
+             104:      6(int) Load 8(iid)
+             105:      6(int) Load 8(iid)
+             106:      6(int) ISub 105 44
+             107:     41(ptr) AccessChain 103(blk2) 106 39
+             108:   23(float) Load 107
+             110:   23(float) FAdd 108 109
+             111:     41(ptr) AccessChain 103(blk2) 104 39
+                              Store 111 110
+             112:      6(int) Load 8(iid)
+             118:     69(ptr) AccessChain 103(blk2) 112 44
+                              Store 118 117
+             119:      6(int) Load 8(iid)
+             120:      6(int) IAdd 119 44
+             121:      6(int) Load 18(gid)
+             122:      6(int) Load 8(iid)
+             123:     69(ptr) AccessChain 103(blk2) 122 44
+             124:   27(fvec4) Load 123
+             125:     69(ptr) AccessChain 103(blk2) 120 52 121
+                              Store 125 124
+             126:      6(int) Load 8(iid)
+             127:      6(int) IAdd 126 44
+             128:      6(int) Load 18(gid)
+             130:     41(ptr) AccessChain 103(blk2) 127 52 128 31
+                              Store 130 129
+             131:      6(int) Load 8(iid)
+             132:      6(int) IAdd 131 52
+             133:      6(int) Load 8(iid)
+             134:      6(int) IAdd 133 44
+             135:      6(int) Load 18(gid)
+             136:     69(ptr) AccessChain 103(blk2) 134 52 135
+             137:   27(fvec4) Load 136
+             138:     69(ptr) AccessChain 103(blk2) 132 52 64
+                              Store 138 137
+                              MemoryBarrier 88 98
+                              ControlBarrier 31 31 98
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.330.geom.out b/Test/baseResults/spv.330.geom.out
index 3e81dcb..1ccbfb6 100644
--- a/Test/baseResults/spv.330.geom.out
+++ b/Test/baseResults/spv.330.geom.out
@@ -1,6 +1,6 @@
 spv.330.geom
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 32
 
                               Capability Geometry
diff --git a/Test/baseResults/spv.400.frag.out b/Test/baseResults/spv.400.frag.out
index cb2de96..a0583cf 100644
--- a/Test/baseResults/spv.400.frag.out
+++ b/Test/baseResults/spv.400.frag.out
@@ -1,8 +1,10 @@
 spv.400.frag
-Warning, version 400 is not yet complete; most version-specific features are present, but some are missing.
+error: SPIRV-Tools Validation Errors
+error: Capability SampledRect is not allowed by Vulkan 1.0 specification (or requires extension)
+  OpCapability SampledRect
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 1118
 
                               Capability Shader
@@ -87,18 +89,18 @@
               33:     32(int) Constant 0
               34:             TypePointer Output 10(float)
               39:             TypeFloat 64
-              40:             TypePointer Function 39(float)
-              42:   39(float) Constant 2507418074 1073430332
-              43:             TypeVector 39(float) 2
-              44:             TypePointer Function 43(fvec2)
-              46:   39(float) Constant 796182188 1073367658
-              47:   43(fvec2) ConstantComposite 46 46
-              48:             TypeVector 39(float) 3
-              49:             TypePointer Function 48(fvec3)
-              51:   39(float) Constant 1719614413 1073127582
-              52:   48(fvec3) ConstantComposite 51 51 51
-              53:             TypeVector 39(float) 4
-              54:             TypePointer Function 53(fvec4)
+              40:             TypePointer Function 39(float64_t)
+              42:39(float64_t) Constant 2507418074 1073430332
+              43:             TypeVector 39(float64_t) 2
+              44:             TypePointer Function 43(f64vec2)
+              46:39(float64_t) Constant 796182188 1073367658
+              47: 43(f64vec2) ConstantComposite 46 46
+              48:             TypeVector 39(float64_t) 3
+              49:             TypePointer Function 48(f64vec3)
+              51:39(float64_t) Constant 1719614413 1073127582
+              52: 48(f64vec3) ConstantComposite 51 51 51
+              53:             TypeVector 39(float64_t) 4
+              54:             TypePointer Function 53(f64vec4)
              428:             TypeBool
              429:             TypePointer Function 428(bool)
              437:             TypeVector 428(bool) 2
@@ -111,23 +113,23 @@
              572:  437(bvec2) ConstantComposite 563 563
              581:  446(bvec3) ConstantComposite 563 563 563
              590:  455(bvec4) ConstantComposite 563 563 563 563
-             737:             TypeMatrix 43(fvec2) 2
+             737:             TypeMatrix 43(f64vec2) 2
              738:             TypePointer Function 737
-             743:             TypeMatrix 48(fvec3) 3
+             743:             TypeMatrix 48(f64vec3) 3
              744:             TypePointer Function 743
-             749:             TypeMatrix 53(fvec4) 4
+             749:             TypeMatrix 53(f64vec4) 4
              750:             TypePointer Function 749
-             755:             TypeMatrix 48(fvec3) 2
+             755:             TypeMatrix 48(f64vec3) 2
              756:             TypePointer Function 755
-             761:             TypeMatrix 43(fvec2) 3
+             761:             TypeMatrix 43(f64vec2) 3
              762:             TypePointer Function 761
-             767:             TypeMatrix 53(fvec4) 2
+             767:             TypeMatrix 53(f64vec4) 2
              768:             TypePointer Function 767
-             773:             TypeMatrix 43(fvec2) 4
+             773:             TypeMatrix 43(f64vec2) 4
              774:             TypePointer Function 773
-             779:             TypeMatrix 53(fvec4) 3
+             779:             TypeMatrix 53(f64vec4) 3
              780:             TypePointer Function 779
-             785:             TypeMatrix 48(fvec3) 4
+             785:             TypeMatrix 48(f64vec3) 4
              786:             TypePointer Function 785
              954:     32(int) Constant 1
              958:     32(int) Constant 2
@@ -275,10 +277,10 @@
      439(bvec2v):    438(ptr) Variable Function
      448(bvec3v):    447(ptr) Variable Function
      457(bvec4v):    456(ptr) Variable Function
-             556:    429(ptr) Variable Function
-             565:    438(ptr) Variable Function
-             574:    447(ptr) Variable Function
-             583:    456(ptr) Variable Function
+             557:    429(ptr) Variable Function
+             566:    438(ptr) Variable Function
+             575:    447(ptr) Variable Function
+             584:    456(ptr) Variable Function
      739(dmat2v):    738(ptr) Variable Function
      745(dmat3v):    744(ptr) Variable Function
      751(dmat4v):    750(ptr) Variable Function
@@ -291,979 +293,979 @@
                               Store 41(doublev) 42
                               Store 45(dvec2v) 47
                               Store 50(dvec3v) 52
-              56:   39(float) Load 41(doublev)
-              57:   53(fvec4) CompositeConstruct 56 56 56 56
-              58:   53(fvec4) ExtInst 1(GLSL.std.450) 31(Sqrt) 57
+              56:39(float64_t) Load 41(doublev)
+              57: 53(f64vec4) CompositeConstruct 56 56 56 56
+              58: 53(f64vec4) ExtInst 1(GLSL.std.450) 31(Sqrt) 57
                               Store 55(dvec4v) 58
-              59:   39(float) Load 41(doublev)
-              60:   39(float) ExtInst 1(GLSL.std.450) 32(InverseSqrt) 59
-              61:   39(float) Load 41(doublev)
-              62:   39(float) FAdd 61 60
+              59:39(float64_t) Load 41(doublev)
+              60:39(float64_t) ExtInst 1(GLSL.std.450) 32(InverseSqrt) 59
+              61:39(float64_t) Load 41(doublev)
+              62:39(float64_t) FAdd 61 60
                               Store 41(doublev) 62
-              63:   43(fvec2) Load 45(dvec2v)
-              64:   43(fvec2) ExtInst 1(GLSL.std.450) 32(InverseSqrt) 63
-              65:   43(fvec2) Load 45(dvec2v)
-              66:   43(fvec2) FAdd 65 64
+              63: 43(f64vec2) Load 45(dvec2v)
+              64: 43(f64vec2) ExtInst 1(GLSL.std.450) 32(InverseSqrt) 63
+              65: 43(f64vec2) Load 45(dvec2v)
+              66: 43(f64vec2) FAdd 65 64
                               Store 45(dvec2v) 66
-              67:   48(fvec3) Load 50(dvec3v)
-              68:   48(fvec3) ExtInst 1(GLSL.std.450) 32(InverseSqrt) 67
-              69:   48(fvec3) Load 50(dvec3v)
-              70:   48(fvec3) FAdd 69 68
+              67: 48(f64vec3) Load 50(dvec3v)
+              68: 48(f64vec3) ExtInst 1(GLSL.std.450) 32(InverseSqrt) 67
+              69: 48(f64vec3) Load 50(dvec3v)
+              70: 48(f64vec3) FAdd 69 68
                               Store 50(dvec3v) 70
-              71:   53(fvec4) Load 55(dvec4v)
-              72:   53(fvec4) ExtInst 1(GLSL.std.450) 32(InverseSqrt) 71
-              73:   53(fvec4) Load 55(dvec4v)
-              74:   53(fvec4) FAdd 73 72
+              71: 53(f64vec4) Load 55(dvec4v)
+              72: 53(f64vec4) ExtInst 1(GLSL.std.450) 32(InverseSqrt) 71
+              73: 53(f64vec4) Load 55(dvec4v)
+              74: 53(f64vec4) FAdd 73 72
                               Store 55(dvec4v) 74
-              75:   39(float) Load 41(doublev)
-              76:   39(float) ExtInst 1(GLSL.std.450) 4(FAbs) 75
-              77:   39(float) Load 41(doublev)
-              78:   39(float) FAdd 77 76
+              75:39(float64_t) Load 41(doublev)
+              76:39(float64_t) ExtInst 1(GLSL.std.450) 4(FAbs) 75
+              77:39(float64_t) Load 41(doublev)
+              78:39(float64_t) FAdd 77 76
                               Store 41(doublev) 78
-              79:   43(fvec2) Load 45(dvec2v)
-              80:   43(fvec2) ExtInst 1(GLSL.std.450) 4(FAbs) 79
-              81:   43(fvec2) Load 45(dvec2v)
-              82:   43(fvec2) FAdd 81 80
+              79: 43(f64vec2) Load 45(dvec2v)
+              80: 43(f64vec2) ExtInst 1(GLSL.std.450) 4(FAbs) 79
+              81: 43(f64vec2) Load 45(dvec2v)
+              82: 43(f64vec2) FAdd 81 80
                               Store 45(dvec2v) 82
-              83:   48(fvec3) Load 50(dvec3v)
-              84:   48(fvec3) ExtInst 1(GLSL.std.450) 4(FAbs) 83
-              85:   48(fvec3) Load 50(dvec3v)
-              86:   48(fvec3) FAdd 85 84
+              83: 48(f64vec3) Load 50(dvec3v)
+              84: 48(f64vec3) ExtInst 1(GLSL.std.450) 4(FAbs) 83
+              85: 48(f64vec3) Load 50(dvec3v)
+              86: 48(f64vec3) FAdd 85 84
                               Store 50(dvec3v) 86
-              87:   53(fvec4) Load 55(dvec4v)
-              88:   53(fvec4) ExtInst 1(GLSL.std.450) 4(FAbs) 87
-              89:   53(fvec4) Load 55(dvec4v)
-              90:   53(fvec4) FAdd 89 88
+              87: 53(f64vec4) Load 55(dvec4v)
+              88: 53(f64vec4) ExtInst 1(GLSL.std.450) 4(FAbs) 87
+              89: 53(f64vec4) Load 55(dvec4v)
+              90: 53(f64vec4) FAdd 89 88
                               Store 55(dvec4v) 90
-              91:   39(float) Load 41(doublev)
-              92:   39(float) ExtInst 1(GLSL.std.450) 6(FSign) 91
-              93:   39(float) Load 41(doublev)
-              94:   39(float) FAdd 93 92
+              91:39(float64_t) Load 41(doublev)
+              92:39(float64_t) ExtInst 1(GLSL.std.450) 6(FSign) 91
+              93:39(float64_t) Load 41(doublev)
+              94:39(float64_t) FAdd 93 92
                               Store 41(doublev) 94
-              95:   43(fvec2) Load 45(dvec2v)
-              96:   43(fvec2) ExtInst 1(GLSL.std.450) 6(FSign) 95
-              97:   43(fvec2) Load 45(dvec2v)
-              98:   43(fvec2) FAdd 97 96
+              95: 43(f64vec2) Load 45(dvec2v)
+              96: 43(f64vec2) ExtInst 1(GLSL.std.450) 6(FSign) 95
+              97: 43(f64vec2) Load 45(dvec2v)
+              98: 43(f64vec2) FAdd 97 96
                               Store 45(dvec2v) 98
-              99:   48(fvec3) Load 50(dvec3v)
-             100:   48(fvec3) ExtInst 1(GLSL.std.450) 6(FSign) 99
-             101:   48(fvec3) Load 50(dvec3v)
-             102:   48(fvec3) FAdd 101 100
+              99: 48(f64vec3) Load 50(dvec3v)
+             100: 48(f64vec3) ExtInst 1(GLSL.std.450) 6(FSign) 99
+             101: 48(f64vec3) Load 50(dvec3v)
+             102: 48(f64vec3) FAdd 101 100
                               Store 50(dvec3v) 102
-             103:   53(fvec4) Load 55(dvec4v)
-             104:   53(fvec4) ExtInst 1(GLSL.std.450) 6(FSign) 103
-             105:   53(fvec4) Load 55(dvec4v)
-             106:   53(fvec4) FAdd 105 104
+             103: 53(f64vec4) Load 55(dvec4v)
+             104: 53(f64vec4) ExtInst 1(GLSL.std.450) 6(FSign) 103
+             105: 53(f64vec4) Load 55(dvec4v)
+             106: 53(f64vec4) FAdd 105 104
                               Store 55(dvec4v) 106
-             107:   39(float) Load 41(doublev)
-             108:   39(float) ExtInst 1(GLSL.std.450) 8(Floor) 107
-             109:   39(float) Load 41(doublev)
-             110:   39(float) FAdd 109 108
+             107:39(float64_t) Load 41(doublev)
+             108:39(float64_t) ExtInst 1(GLSL.std.450) 8(Floor) 107
+             109:39(float64_t) Load 41(doublev)
+             110:39(float64_t) FAdd 109 108
                               Store 41(doublev) 110
-             111:   43(fvec2) Load 45(dvec2v)
-             112:   43(fvec2) ExtInst 1(GLSL.std.450) 8(Floor) 111
-             113:   43(fvec2) Load 45(dvec2v)
-             114:   43(fvec2) FAdd 113 112
+             111: 43(f64vec2) Load 45(dvec2v)
+             112: 43(f64vec2) ExtInst 1(GLSL.std.450) 8(Floor) 111
+             113: 43(f64vec2) Load 45(dvec2v)
+             114: 43(f64vec2) FAdd 113 112
                               Store 45(dvec2v) 114
-             115:   48(fvec3) Load 50(dvec3v)
-             116:   48(fvec3) ExtInst 1(GLSL.std.450) 8(Floor) 115
-             117:   48(fvec3) Load 50(dvec3v)
-             118:   48(fvec3) FAdd 117 116
+             115: 48(f64vec3) Load 50(dvec3v)
+             116: 48(f64vec3) ExtInst 1(GLSL.std.450) 8(Floor) 115
+             117: 48(f64vec3) Load 50(dvec3v)
+             118: 48(f64vec3) FAdd 117 116
                               Store 50(dvec3v) 118
-             119:   53(fvec4) Load 55(dvec4v)
-             120:   53(fvec4) ExtInst 1(GLSL.std.450) 8(Floor) 119
-             121:   53(fvec4) Load 55(dvec4v)
-             122:   53(fvec4) FAdd 121 120
+             119: 53(f64vec4) Load 55(dvec4v)
+             120: 53(f64vec4) ExtInst 1(GLSL.std.450) 8(Floor) 119
+             121: 53(f64vec4) Load 55(dvec4v)
+             122: 53(f64vec4) FAdd 121 120
                               Store 55(dvec4v) 122
-             123:   39(float) Load 41(doublev)
-             124:   39(float) ExtInst 1(GLSL.std.450) 3(Trunc) 123
-             125:   39(float) Load 41(doublev)
-             126:   39(float) FAdd 125 124
+             123:39(float64_t) Load 41(doublev)
+             124:39(float64_t) ExtInst 1(GLSL.std.450) 3(Trunc) 123
+             125:39(float64_t) Load 41(doublev)
+             126:39(float64_t) FAdd 125 124
                               Store 41(doublev) 126
-             127:   43(fvec2) Load 45(dvec2v)
-             128:   43(fvec2) ExtInst 1(GLSL.std.450) 3(Trunc) 127
-             129:   43(fvec2) Load 45(dvec2v)
-             130:   43(fvec2) FAdd 129 128
+             127: 43(f64vec2) Load 45(dvec2v)
+             128: 43(f64vec2) ExtInst 1(GLSL.std.450) 3(Trunc) 127
+             129: 43(f64vec2) Load 45(dvec2v)
+             130: 43(f64vec2) FAdd 129 128
                               Store 45(dvec2v) 130
-             131:   48(fvec3) Load 50(dvec3v)
-             132:   48(fvec3) ExtInst 1(GLSL.std.450) 3(Trunc) 131
-             133:   48(fvec3) Load 50(dvec3v)
-             134:   48(fvec3) FAdd 133 132
+             131: 48(f64vec3) Load 50(dvec3v)
+             132: 48(f64vec3) ExtInst 1(GLSL.std.450) 3(Trunc) 131
+             133: 48(f64vec3) Load 50(dvec3v)
+             134: 48(f64vec3) FAdd 133 132
                               Store 50(dvec3v) 134
-             135:   53(fvec4) Load 55(dvec4v)
-             136:   53(fvec4) ExtInst 1(GLSL.std.450) 3(Trunc) 135
-             137:   53(fvec4) Load 55(dvec4v)
-             138:   53(fvec4) FAdd 137 136
+             135: 53(f64vec4) Load 55(dvec4v)
+             136: 53(f64vec4) ExtInst 1(GLSL.std.450) 3(Trunc) 135
+             137: 53(f64vec4) Load 55(dvec4v)
+             138: 53(f64vec4) FAdd 137 136
                               Store 55(dvec4v) 138
-             139:   39(float) Load 41(doublev)
-             140:   39(float) ExtInst 1(GLSL.std.450) 1(Round) 139
-             141:   39(float) Load 41(doublev)
-             142:   39(float) FAdd 141 140
+             139:39(float64_t) Load 41(doublev)
+             140:39(float64_t) ExtInst 1(GLSL.std.450) 1(Round) 139
+             141:39(float64_t) Load 41(doublev)
+             142:39(float64_t) FAdd 141 140
                               Store 41(doublev) 142
-             143:   43(fvec2) Load 45(dvec2v)
-             144:   43(fvec2) ExtInst 1(GLSL.std.450) 1(Round) 143
-             145:   43(fvec2) Load 45(dvec2v)
-             146:   43(fvec2) FAdd 145 144
+             143: 43(f64vec2) Load 45(dvec2v)
+             144: 43(f64vec2) ExtInst 1(GLSL.std.450) 1(Round) 143
+             145: 43(f64vec2) Load 45(dvec2v)
+             146: 43(f64vec2) FAdd 145 144
                               Store 45(dvec2v) 146
-             147:   48(fvec3) Load 50(dvec3v)
-             148:   48(fvec3) ExtInst 1(GLSL.std.450) 1(Round) 147
-             149:   48(fvec3) Load 50(dvec3v)
-             150:   48(fvec3) FAdd 149 148
+             147: 48(f64vec3) Load 50(dvec3v)
+             148: 48(f64vec3) ExtInst 1(GLSL.std.450) 1(Round) 147
+             149: 48(f64vec3) Load 50(dvec3v)
+             150: 48(f64vec3) FAdd 149 148
                               Store 50(dvec3v) 150
-             151:   53(fvec4) Load 55(dvec4v)
-             152:   53(fvec4) ExtInst 1(GLSL.std.450) 1(Round) 151
-             153:   53(fvec4) Load 55(dvec4v)
-             154:   53(fvec4) FAdd 153 152
+             151: 53(f64vec4) Load 55(dvec4v)
+             152: 53(f64vec4) ExtInst 1(GLSL.std.450) 1(Round) 151
+             153: 53(f64vec4) Load 55(dvec4v)
+             154: 53(f64vec4) FAdd 153 152
                               Store 55(dvec4v) 154
-             155:   39(float) Load 41(doublev)
-             156:   39(float) ExtInst 1(GLSL.std.450) 2(RoundEven) 155
-             157:   39(float) Load 41(doublev)
-             158:   39(float) FAdd 157 156
+             155:39(float64_t) Load 41(doublev)
+             156:39(float64_t) ExtInst 1(GLSL.std.450) 2(RoundEven) 155
+             157:39(float64_t) Load 41(doublev)
+             158:39(float64_t) FAdd 157 156
                               Store 41(doublev) 158
-             159:   43(fvec2) Load 45(dvec2v)
-             160:   43(fvec2) ExtInst 1(GLSL.std.450) 2(RoundEven) 159
-             161:   43(fvec2) Load 45(dvec2v)
-             162:   43(fvec2) FAdd 161 160
+             159: 43(f64vec2) Load 45(dvec2v)
+             160: 43(f64vec2) ExtInst 1(GLSL.std.450) 2(RoundEven) 159
+             161: 43(f64vec2) Load 45(dvec2v)
+             162: 43(f64vec2) FAdd 161 160
                               Store 45(dvec2v) 162
-             163:   48(fvec3) Load 50(dvec3v)
-             164:   48(fvec3) ExtInst 1(GLSL.std.450) 2(RoundEven) 163
-             165:   48(fvec3) Load 50(dvec3v)
-             166:   48(fvec3) FAdd 165 164
+             163: 48(f64vec3) Load 50(dvec3v)
+             164: 48(f64vec3) ExtInst 1(GLSL.std.450) 2(RoundEven) 163
+             165: 48(f64vec3) Load 50(dvec3v)
+             166: 48(f64vec3) FAdd 165 164
                               Store 50(dvec3v) 166
-             167:   53(fvec4) Load 55(dvec4v)
-             168:   53(fvec4) ExtInst 1(GLSL.std.450) 2(RoundEven) 167
-             169:   53(fvec4) Load 55(dvec4v)
-             170:   53(fvec4) FAdd 169 168
+             167: 53(f64vec4) Load 55(dvec4v)
+             168: 53(f64vec4) ExtInst 1(GLSL.std.450) 2(RoundEven) 167
+             169: 53(f64vec4) Load 55(dvec4v)
+             170: 53(f64vec4) FAdd 169 168
                               Store 55(dvec4v) 170
-             171:   39(float) Load 41(doublev)
-             172:   39(float) ExtInst 1(GLSL.std.450) 9(Ceil) 171
-             173:   39(float) Load 41(doublev)
-             174:   39(float) FAdd 173 172
+             171:39(float64_t) Load 41(doublev)
+             172:39(float64_t) ExtInst 1(GLSL.std.450) 9(Ceil) 171
+             173:39(float64_t) Load 41(doublev)
+             174:39(float64_t) FAdd 173 172
                               Store 41(doublev) 174
-             175:   43(fvec2) Load 45(dvec2v)
-             176:   43(fvec2) ExtInst 1(GLSL.std.450) 9(Ceil) 175
-             177:   43(fvec2) Load 45(dvec2v)
-             178:   43(fvec2) FAdd 177 176
+             175: 43(f64vec2) Load 45(dvec2v)
+             176: 43(f64vec2) ExtInst 1(GLSL.std.450) 9(Ceil) 175
+             177: 43(f64vec2) Load 45(dvec2v)
+             178: 43(f64vec2) FAdd 177 176
                               Store 45(dvec2v) 178
-             179:   48(fvec3) Load 50(dvec3v)
-             180:   48(fvec3) ExtInst 1(GLSL.std.450) 9(Ceil) 179
-             181:   48(fvec3) Load 50(dvec3v)
-             182:   48(fvec3) FAdd 181 180
+             179: 48(f64vec3) Load 50(dvec3v)
+             180: 48(f64vec3) ExtInst 1(GLSL.std.450) 9(Ceil) 179
+             181: 48(f64vec3) Load 50(dvec3v)
+             182: 48(f64vec3) FAdd 181 180
                               Store 50(dvec3v) 182
-             183:   53(fvec4) Load 55(dvec4v)
-             184:   53(fvec4) ExtInst 1(GLSL.std.450) 9(Ceil) 183
-             185:   53(fvec4) Load 55(dvec4v)
-             186:   53(fvec4) FAdd 185 184
+             183: 53(f64vec4) Load 55(dvec4v)
+             184: 53(f64vec4) ExtInst 1(GLSL.std.450) 9(Ceil) 183
+             185: 53(f64vec4) Load 55(dvec4v)
+             186: 53(f64vec4) FAdd 185 184
                               Store 55(dvec4v) 186
-             187:   39(float) Load 41(doublev)
-             188:   39(float) ExtInst 1(GLSL.std.450) 10(Fract) 187
-             189:   39(float) Load 41(doublev)
-             190:   39(float) FAdd 189 188
+             187:39(float64_t) Load 41(doublev)
+             188:39(float64_t) ExtInst 1(GLSL.std.450) 10(Fract) 187
+             189:39(float64_t) Load 41(doublev)
+             190:39(float64_t) FAdd 189 188
                               Store 41(doublev) 190
-             191:   43(fvec2) Load 45(dvec2v)
-             192:   43(fvec2) ExtInst 1(GLSL.std.450) 10(Fract) 191
-             193:   43(fvec2) Load 45(dvec2v)
-             194:   43(fvec2) FAdd 193 192
+             191: 43(f64vec2) Load 45(dvec2v)
+             192: 43(f64vec2) ExtInst 1(GLSL.std.450) 10(Fract) 191
+             193: 43(f64vec2) Load 45(dvec2v)
+             194: 43(f64vec2) FAdd 193 192
                               Store 45(dvec2v) 194
-             195:   48(fvec3) Load 50(dvec3v)
-             196:   48(fvec3) ExtInst 1(GLSL.std.450) 10(Fract) 195
-             197:   48(fvec3) Load 50(dvec3v)
-             198:   48(fvec3) FAdd 197 196
+             195: 48(f64vec3) Load 50(dvec3v)
+             196: 48(f64vec3) ExtInst 1(GLSL.std.450) 10(Fract) 195
+             197: 48(f64vec3) Load 50(dvec3v)
+             198: 48(f64vec3) FAdd 197 196
                               Store 50(dvec3v) 198
-             199:   53(fvec4) Load 55(dvec4v)
-             200:   53(fvec4) ExtInst 1(GLSL.std.450) 10(Fract) 199
-             201:   53(fvec4) Load 55(dvec4v)
-             202:   53(fvec4) FAdd 201 200
+             199: 53(f64vec4) Load 55(dvec4v)
+             200: 53(f64vec4) ExtInst 1(GLSL.std.450) 10(Fract) 199
+             201: 53(f64vec4) Load 55(dvec4v)
+             202: 53(f64vec4) FAdd 201 200
                               Store 55(dvec4v) 202
-             203:   39(float) Load 41(doublev)
-             204:   39(float) Load 41(doublev)
-             205:   39(float) FMod 203 204
-             206:   39(float) Load 41(doublev)
-             207:   39(float) FAdd 206 205
+             203:39(float64_t) Load 41(doublev)
+             204:39(float64_t) Load 41(doublev)
+             205:39(float64_t) FMod 203 204
+             206:39(float64_t) Load 41(doublev)
+             207:39(float64_t) FAdd 206 205
                               Store 41(doublev) 207
-             208:   43(fvec2) Load 45(dvec2v)
-             209:   39(float) Load 41(doublev)
-             210:   43(fvec2) CompositeConstruct 209 209
-             211:   43(fvec2) FMod 208 210
-             212:   43(fvec2) Load 45(dvec2v)
-             213:   43(fvec2) FAdd 212 211
+             208: 43(f64vec2) Load 45(dvec2v)
+             209:39(float64_t) Load 41(doublev)
+             210: 43(f64vec2) CompositeConstruct 209 209
+             211: 43(f64vec2) FMod 208 210
+             212: 43(f64vec2) Load 45(dvec2v)
+             213: 43(f64vec2) FAdd 212 211
                               Store 45(dvec2v) 213
-             214:   48(fvec3) Load 50(dvec3v)
-             215:   39(float) Load 41(doublev)
-             216:   48(fvec3) CompositeConstruct 215 215 215
-             217:   48(fvec3) FMod 214 216
-             218:   48(fvec3) Load 50(dvec3v)
-             219:   48(fvec3) FAdd 218 217
+             214: 48(f64vec3) Load 50(dvec3v)
+             215:39(float64_t) Load 41(doublev)
+             216: 48(f64vec3) CompositeConstruct 215 215 215
+             217: 48(f64vec3) FMod 214 216
+             218: 48(f64vec3) Load 50(dvec3v)
+             219: 48(f64vec3) FAdd 218 217
                               Store 50(dvec3v) 219
-             220:   53(fvec4) Load 55(dvec4v)
-             221:   39(float) Load 41(doublev)
-             222:   53(fvec4) CompositeConstruct 221 221 221 221
-             223:   53(fvec4) FMod 220 222
-             224:   53(fvec4) Load 55(dvec4v)
-             225:   53(fvec4) FAdd 224 223
+             220: 53(f64vec4) Load 55(dvec4v)
+             221:39(float64_t) Load 41(doublev)
+             222: 53(f64vec4) CompositeConstruct 221 221 221 221
+             223: 53(f64vec4) FMod 220 222
+             224: 53(f64vec4) Load 55(dvec4v)
+             225: 53(f64vec4) FAdd 224 223
                               Store 55(dvec4v) 225
-             226:   43(fvec2) Load 45(dvec2v)
-             227:   43(fvec2) Load 45(dvec2v)
-             228:   43(fvec2) FMod 226 227
-             229:   43(fvec2) Load 45(dvec2v)
-             230:   43(fvec2) FAdd 229 228
+             226: 43(f64vec2) Load 45(dvec2v)
+             227: 43(f64vec2) Load 45(dvec2v)
+             228: 43(f64vec2) FMod 226 227
+             229: 43(f64vec2) Load 45(dvec2v)
+             230: 43(f64vec2) FAdd 229 228
                               Store 45(dvec2v) 230
-             231:   48(fvec3) Load 50(dvec3v)
-             232:   48(fvec3) Load 50(dvec3v)
-             233:   48(fvec3) FMod 231 232
-             234:   48(fvec3) Load 50(dvec3v)
-             235:   48(fvec3) FAdd 234 233
+             231: 48(f64vec3) Load 50(dvec3v)
+             232: 48(f64vec3) Load 50(dvec3v)
+             233: 48(f64vec3) FMod 231 232
+             234: 48(f64vec3) Load 50(dvec3v)
+             235: 48(f64vec3) FAdd 234 233
                               Store 50(dvec3v) 235
-             236:   53(fvec4) Load 55(dvec4v)
-             237:   53(fvec4) Load 55(dvec4v)
-             238:   53(fvec4) FMod 236 237
-             239:   53(fvec4) Load 55(dvec4v)
-             240:   53(fvec4) FAdd 239 238
+             236: 53(f64vec4) Load 55(dvec4v)
+             237: 53(f64vec4) Load 55(dvec4v)
+             238: 53(f64vec4) FMod 236 237
+             239: 53(f64vec4) Load 55(dvec4v)
+             240: 53(f64vec4) FAdd 239 238
                               Store 55(dvec4v) 240
-             241:   39(float) Load 41(doublev)
-             242:   39(float) ExtInst 1(GLSL.std.450) 35(Modf) 241 41(doublev)
-             243:   39(float) Load 41(doublev)
-             244:   39(float) FAdd 243 242
+             241:39(float64_t) Load 41(doublev)
+             242:39(float64_t) ExtInst 1(GLSL.std.450) 35(Modf) 241 41(doublev)
+             243:39(float64_t) Load 41(doublev)
+             244:39(float64_t) FAdd 243 242
                               Store 41(doublev) 244
-             245:   43(fvec2) Load 45(dvec2v)
-             246:   43(fvec2) ExtInst 1(GLSL.std.450) 35(Modf) 245 45(dvec2v)
-             247:   43(fvec2) Load 45(dvec2v)
-             248:   43(fvec2) FAdd 247 246
+             245: 43(f64vec2) Load 45(dvec2v)
+             246: 43(f64vec2) ExtInst 1(GLSL.std.450) 35(Modf) 245 45(dvec2v)
+             247: 43(f64vec2) Load 45(dvec2v)
+             248: 43(f64vec2) FAdd 247 246
                               Store 45(dvec2v) 248
-             249:   48(fvec3) Load 50(dvec3v)
-             250:   48(fvec3) ExtInst 1(GLSL.std.450) 35(Modf) 249 50(dvec3v)
-             251:   48(fvec3) Load 50(dvec3v)
-             252:   48(fvec3) FAdd 251 250
+             249: 48(f64vec3) Load 50(dvec3v)
+             250: 48(f64vec3) ExtInst 1(GLSL.std.450) 35(Modf) 249 50(dvec3v)
+             251: 48(f64vec3) Load 50(dvec3v)
+             252: 48(f64vec3) FAdd 251 250
                               Store 50(dvec3v) 252
-             253:   53(fvec4) Load 55(dvec4v)
-             254:   53(fvec4) ExtInst 1(GLSL.std.450) 35(Modf) 253 55(dvec4v)
-             255:   53(fvec4) Load 55(dvec4v)
-             256:   53(fvec4) FAdd 255 254
+             253: 53(f64vec4) Load 55(dvec4v)
+             254: 53(f64vec4) ExtInst 1(GLSL.std.450) 35(Modf) 253 55(dvec4v)
+             255: 53(f64vec4) Load 55(dvec4v)
+             256: 53(f64vec4) FAdd 255 254
                               Store 55(dvec4v) 256
-             257:   39(float) Load 41(doublev)
-             258:   39(float) Load 41(doublev)
-             259:   39(float) ExtInst 1(GLSL.std.450) 37(FMin) 257 258
-             260:   39(float) Load 41(doublev)
-             261:   39(float) FAdd 260 259
+             257:39(float64_t) Load 41(doublev)
+             258:39(float64_t) Load 41(doublev)
+             259:39(float64_t) ExtInst 1(GLSL.std.450) 37(FMin) 257 258
+             260:39(float64_t) Load 41(doublev)
+             261:39(float64_t) FAdd 260 259
                               Store 41(doublev) 261
-             262:   43(fvec2) Load 45(dvec2v)
-             263:   39(float) Load 41(doublev)
-             264:   43(fvec2) CompositeConstruct 263 263
-             265:   43(fvec2) ExtInst 1(GLSL.std.450) 37(FMin) 262 264
-             266:   43(fvec2) Load 45(dvec2v)
-             267:   43(fvec2) FAdd 266 265
+             262: 43(f64vec2) Load 45(dvec2v)
+             263:39(float64_t) Load 41(doublev)
+             264: 43(f64vec2) CompositeConstruct 263 263
+             265: 43(f64vec2) ExtInst 1(GLSL.std.450) 37(FMin) 262 264
+             266: 43(f64vec2) Load 45(dvec2v)
+             267: 43(f64vec2) FAdd 266 265
                               Store 45(dvec2v) 267
-             268:   48(fvec3) Load 50(dvec3v)
-             269:   39(float) Load 41(doublev)
-             270:   48(fvec3) CompositeConstruct 269 269 269
-             271:   48(fvec3) ExtInst 1(GLSL.std.450) 37(FMin) 268 270
-             272:   48(fvec3) Load 50(dvec3v)
-             273:   48(fvec3) FAdd 272 271
+             268: 48(f64vec3) Load 50(dvec3v)
+             269:39(float64_t) Load 41(doublev)
+             270: 48(f64vec3) CompositeConstruct 269 269 269
+             271: 48(f64vec3) ExtInst 1(GLSL.std.450) 37(FMin) 268 270
+             272: 48(f64vec3) Load 50(dvec3v)
+             273: 48(f64vec3) FAdd 272 271
                               Store 50(dvec3v) 273
-             274:   53(fvec4) Load 55(dvec4v)
-             275:   39(float) Load 41(doublev)
-             276:   53(fvec4) CompositeConstruct 275 275 275 275
-             277:   53(fvec4) ExtInst 1(GLSL.std.450) 37(FMin) 274 276
-             278:   53(fvec4) Load 55(dvec4v)
-             279:   53(fvec4) FAdd 278 277
+             274: 53(f64vec4) Load 55(dvec4v)
+             275:39(float64_t) Load 41(doublev)
+             276: 53(f64vec4) CompositeConstruct 275 275 275 275
+             277: 53(f64vec4) ExtInst 1(GLSL.std.450) 37(FMin) 274 276
+             278: 53(f64vec4) Load 55(dvec4v)
+             279: 53(f64vec4) FAdd 278 277
                               Store 55(dvec4v) 279
-             280:   43(fvec2) Load 45(dvec2v)
-             281:   43(fvec2) Load 45(dvec2v)
-             282:   43(fvec2) ExtInst 1(GLSL.std.450) 37(FMin) 280 281
-             283:   43(fvec2) Load 45(dvec2v)
-             284:   43(fvec2) FAdd 283 282
+             280: 43(f64vec2) Load 45(dvec2v)
+             281: 43(f64vec2) Load 45(dvec2v)
+             282: 43(f64vec2) ExtInst 1(GLSL.std.450) 37(FMin) 280 281
+             283: 43(f64vec2) Load 45(dvec2v)
+             284: 43(f64vec2) FAdd 283 282
                               Store 45(dvec2v) 284
-             285:   48(fvec3) Load 50(dvec3v)
-             286:   48(fvec3) Load 50(dvec3v)
-             287:   48(fvec3) ExtInst 1(GLSL.std.450) 37(FMin) 285 286
-             288:   48(fvec3) Load 50(dvec3v)
-             289:   48(fvec3) FAdd 288 287
+             285: 48(f64vec3) Load 50(dvec3v)
+             286: 48(f64vec3) Load 50(dvec3v)
+             287: 48(f64vec3) ExtInst 1(GLSL.std.450) 37(FMin) 285 286
+             288: 48(f64vec3) Load 50(dvec3v)
+             289: 48(f64vec3) FAdd 288 287
                               Store 50(dvec3v) 289
-             290:   53(fvec4) Load 55(dvec4v)
-             291:   53(fvec4) Load 55(dvec4v)
-             292:   53(fvec4) ExtInst 1(GLSL.std.450) 37(FMin) 290 291
-             293:   53(fvec4) Load 55(dvec4v)
-             294:   53(fvec4) FAdd 293 292
+             290: 53(f64vec4) Load 55(dvec4v)
+             291: 53(f64vec4) Load 55(dvec4v)
+             292: 53(f64vec4) ExtInst 1(GLSL.std.450) 37(FMin) 290 291
+             293: 53(f64vec4) Load 55(dvec4v)
+             294: 53(f64vec4) FAdd 293 292
                               Store 55(dvec4v) 294
-             295:   39(float) Load 41(doublev)
-             296:   39(float) Load 41(doublev)
-             297:   39(float) ExtInst 1(GLSL.std.450) 40(FMax) 295 296
-             298:   39(float) Load 41(doublev)
-             299:   39(float) FAdd 298 297
+             295:39(float64_t) Load 41(doublev)
+             296:39(float64_t) Load 41(doublev)
+             297:39(float64_t) ExtInst 1(GLSL.std.450) 40(FMax) 295 296
+             298:39(float64_t) Load 41(doublev)
+             299:39(float64_t) FAdd 298 297
                               Store 41(doublev) 299
-             300:   43(fvec2) Load 45(dvec2v)
-             301:   39(float) Load 41(doublev)
-             302:   43(fvec2) CompositeConstruct 301 301
-             303:   43(fvec2) ExtInst 1(GLSL.std.450) 40(FMax) 300 302
-             304:   43(fvec2) Load 45(dvec2v)
-             305:   43(fvec2) FAdd 304 303
+             300: 43(f64vec2) Load 45(dvec2v)
+             301:39(float64_t) Load 41(doublev)
+             302: 43(f64vec2) CompositeConstruct 301 301
+             303: 43(f64vec2) ExtInst 1(GLSL.std.450) 40(FMax) 300 302
+             304: 43(f64vec2) Load 45(dvec2v)
+             305: 43(f64vec2) FAdd 304 303
                               Store 45(dvec2v) 305
-             306:   48(fvec3) Load 50(dvec3v)
-             307:   39(float) Load 41(doublev)
-             308:   48(fvec3) CompositeConstruct 307 307 307
-             309:   48(fvec3) ExtInst 1(GLSL.std.450) 40(FMax) 306 308
-             310:   48(fvec3) Load 50(dvec3v)
-             311:   48(fvec3) FAdd 310 309
+             306: 48(f64vec3) Load 50(dvec3v)
+             307:39(float64_t) Load 41(doublev)
+             308: 48(f64vec3) CompositeConstruct 307 307 307
+             309: 48(f64vec3) ExtInst 1(GLSL.std.450) 40(FMax) 306 308
+             310: 48(f64vec3) Load 50(dvec3v)
+             311: 48(f64vec3) FAdd 310 309
                               Store 50(dvec3v) 311
-             312:   53(fvec4) Load 55(dvec4v)
-             313:   39(float) Load 41(doublev)
-             314:   53(fvec4) CompositeConstruct 313 313 313 313
-             315:   53(fvec4) ExtInst 1(GLSL.std.450) 40(FMax) 312 314
-             316:   53(fvec4) Load 55(dvec4v)
-             317:   53(fvec4) FAdd 316 315
+             312: 53(f64vec4) Load 55(dvec4v)
+             313:39(float64_t) Load 41(doublev)
+             314: 53(f64vec4) CompositeConstruct 313 313 313 313
+             315: 53(f64vec4) ExtInst 1(GLSL.std.450) 40(FMax) 312 314
+             316: 53(f64vec4) Load 55(dvec4v)
+             317: 53(f64vec4) FAdd 316 315
                               Store 55(dvec4v) 317
-             318:   43(fvec2) Load 45(dvec2v)
-             319:   43(fvec2) Load 45(dvec2v)
-             320:   43(fvec2) ExtInst 1(GLSL.std.450) 40(FMax) 318 319
-             321:   43(fvec2) Load 45(dvec2v)
-             322:   43(fvec2) FAdd 321 320
+             318: 43(f64vec2) Load 45(dvec2v)
+             319: 43(f64vec2) Load 45(dvec2v)
+             320: 43(f64vec2) ExtInst 1(GLSL.std.450) 40(FMax) 318 319
+             321: 43(f64vec2) Load 45(dvec2v)
+             322: 43(f64vec2) FAdd 321 320
                               Store 45(dvec2v) 322
-             323:   48(fvec3) Load 50(dvec3v)
-             324:   48(fvec3) Load 50(dvec3v)
-             325:   48(fvec3) ExtInst 1(GLSL.std.450) 40(FMax) 323 324
-             326:   48(fvec3) Load 50(dvec3v)
-             327:   48(fvec3) FAdd 326 325
+             323: 48(f64vec3) Load 50(dvec3v)
+             324: 48(f64vec3) Load 50(dvec3v)
+             325: 48(f64vec3) ExtInst 1(GLSL.std.450) 40(FMax) 323 324
+             326: 48(f64vec3) Load 50(dvec3v)
+             327: 48(f64vec3) FAdd 326 325
                               Store 50(dvec3v) 327
-             328:   53(fvec4) Load 55(dvec4v)
-             329:   53(fvec4) Load 55(dvec4v)
-             330:   53(fvec4) ExtInst 1(GLSL.std.450) 40(FMax) 328 329
-             331:   53(fvec4) Load 55(dvec4v)
-             332:   53(fvec4) FAdd 331 330
+             328: 53(f64vec4) Load 55(dvec4v)
+             329: 53(f64vec4) Load 55(dvec4v)
+             330: 53(f64vec4) ExtInst 1(GLSL.std.450) 40(FMax) 328 329
+             331: 53(f64vec4) Load 55(dvec4v)
+             332: 53(f64vec4) FAdd 331 330
                               Store 55(dvec4v) 332
-             333:   39(float) Load 41(doublev)
-             334:   39(float) Load 41(doublev)
-             335:   39(float) Load 41(doublev)
-             336:   39(float) ExtInst 1(GLSL.std.450) 43(FClamp) 333 334 335
-             337:   39(float) Load 41(doublev)
-             338:   39(float) FAdd 337 336
+             333:39(float64_t) Load 41(doublev)
+             334:39(float64_t) Load 41(doublev)
+             335:39(float64_t) Load 41(doublev)
+             336:39(float64_t) ExtInst 1(GLSL.std.450) 43(FClamp) 333 334 335
+             337:39(float64_t) Load 41(doublev)
+             338:39(float64_t) FAdd 337 336
                               Store 41(doublev) 338
-             339:   43(fvec2) Load 45(dvec2v)
-             340:   39(float) Load 41(doublev)
-             341:   39(float) Load 41(doublev)
-             342:   43(fvec2) CompositeConstruct 340 340
-             343:   43(fvec2) CompositeConstruct 341 341
-             344:   43(fvec2) ExtInst 1(GLSL.std.450) 43(FClamp) 339 342 343
-             345:   43(fvec2) Load 45(dvec2v)
-             346:   43(fvec2) FAdd 345 344
+             339: 43(f64vec2) Load 45(dvec2v)
+             340:39(float64_t) Load 41(doublev)
+             341:39(float64_t) Load 41(doublev)
+             342: 43(f64vec2) CompositeConstruct 340 340
+             343: 43(f64vec2) CompositeConstruct 341 341
+             344: 43(f64vec2) ExtInst 1(GLSL.std.450) 43(FClamp) 339 342 343
+             345: 43(f64vec2) Load 45(dvec2v)
+             346: 43(f64vec2) FAdd 345 344
                               Store 45(dvec2v) 346
-             347:   48(fvec3) Load 50(dvec3v)
-             348:   39(float) Load 41(doublev)
-             349:   39(float) Load 41(doublev)
-             350:   48(fvec3) CompositeConstruct 348 348 348
-             351:   48(fvec3) CompositeConstruct 349 349 349
-             352:   48(fvec3) ExtInst 1(GLSL.std.450) 43(FClamp) 347 350 351
-             353:   48(fvec3) Load 50(dvec3v)
-             354:   48(fvec3) FAdd 353 352
+             347: 48(f64vec3) Load 50(dvec3v)
+             348:39(float64_t) Load 41(doublev)
+             349:39(float64_t) Load 41(doublev)
+             350: 48(f64vec3) CompositeConstruct 348 348 348
+             351: 48(f64vec3) CompositeConstruct 349 349 349
+             352: 48(f64vec3) ExtInst 1(GLSL.std.450) 43(FClamp) 347 350 351
+             353: 48(f64vec3) Load 50(dvec3v)
+             354: 48(f64vec3) FAdd 353 352
                               Store 50(dvec3v) 354
-             355:   53(fvec4) Load 55(dvec4v)
-             356:   39(float) Load 41(doublev)
-             357:   39(float) Load 41(doublev)
-             358:   53(fvec4) CompositeConstruct 356 356 356 356
-             359:   53(fvec4) CompositeConstruct 357 357 357 357
-             360:   53(fvec4) ExtInst 1(GLSL.std.450) 43(FClamp) 355 358 359
-             361:   53(fvec4) Load 55(dvec4v)
-             362:   53(fvec4) FAdd 361 360
+             355: 53(f64vec4) Load 55(dvec4v)
+             356:39(float64_t) Load 41(doublev)
+             357:39(float64_t) Load 41(doublev)
+             358: 53(f64vec4) CompositeConstruct 356 356 356 356
+             359: 53(f64vec4) CompositeConstruct 357 357 357 357
+             360: 53(f64vec4) ExtInst 1(GLSL.std.450) 43(FClamp) 355 358 359
+             361: 53(f64vec4) Load 55(dvec4v)
+             362: 53(f64vec4) FAdd 361 360
                               Store 55(dvec4v) 362
-             363:   43(fvec2) Load 45(dvec2v)
-             364:   43(fvec2) Load 45(dvec2v)
-             365:   43(fvec2) Load 45(dvec2v)
-             366:   43(fvec2) ExtInst 1(GLSL.std.450) 43(FClamp) 363 364 365
-             367:   43(fvec2) Load 45(dvec2v)
-             368:   43(fvec2) FAdd 367 366
+             363: 43(f64vec2) Load 45(dvec2v)
+             364: 43(f64vec2) Load 45(dvec2v)
+             365: 43(f64vec2) Load 45(dvec2v)
+             366: 43(f64vec2) ExtInst 1(GLSL.std.450) 43(FClamp) 363 364 365
+             367: 43(f64vec2) Load 45(dvec2v)
+             368: 43(f64vec2) FAdd 367 366
                               Store 45(dvec2v) 368
-             369:   48(fvec3) Load 50(dvec3v)
-             370:   48(fvec3) Load 50(dvec3v)
-             371:   48(fvec3) Load 50(dvec3v)
-             372:   48(fvec3) ExtInst 1(GLSL.std.450) 43(FClamp) 369 370 371
-             373:   48(fvec3) Load 50(dvec3v)
-             374:   48(fvec3) FAdd 373 372
+             369: 48(f64vec3) Load 50(dvec3v)
+             370: 48(f64vec3) Load 50(dvec3v)
+             371: 48(f64vec3) Load 50(dvec3v)
+             372: 48(f64vec3) ExtInst 1(GLSL.std.450) 43(FClamp) 369 370 371
+             373: 48(f64vec3) Load 50(dvec3v)
+             374: 48(f64vec3) FAdd 373 372
                               Store 50(dvec3v) 374
-             375:   53(fvec4) Load 55(dvec4v)
-             376:   53(fvec4) Load 55(dvec4v)
-             377:   53(fvec4) Load 55(dvec4v)
-             378:   53(fvec4) ExtInst 1(GLSL.std.450) 43(FClamp) 375 376 377
-             379:   53(fvec4) Load 55(dvec4v)
-             380:   53(fvec4) FAdd 379 378
+             375: 53(f64vec4) Load 55(dvec4v)
+             376: 53(f64vec4) Load 55(dvec4v)
+             377: 53(f64vec4) Load 55(dvec4v)
+             378: 53(f64vec4) ExtInst 1(GLSL.std.450) 43(FClamp) 375 376 377
+             379: 53(f64vec4) Load 55(dvec4v)
+             380: 53(f64vec4) FAdd 379 378
                               Store 55(dvec4v) 380
-             381:   39(float) Load 41(doublev)
-             382:   39(float) Load 41(doublev)
-             383:   39(float) Load 41(doublev)
-             384:   39(float) ExtInst 1(GLSL.std.450) 46(FMix) 381 382 383
-             385:   39(float) Load 41(doublev)
-             386:   39(float) FAdd 385 384
+             381:39(float64_t) Load 41(doublev)
+             382:39(float64_t) Load 41(doublev)
+             383:39(float64_t) Load 41(doublev)
+             384:39(float64_t) ExtInst 1(GLSL.std.450) 46(FMix) 381 382 383
+             385:39(float64_t) Load 41(doublev)
+             386:39(float64_t) FAdd 385 384
                               Store 41(doublev) 386
-             387:   43(fvec2) Load 45(dvec2v)
-             388:   43(fvec2) Load 45(dvec2v)
-             389:   39(float) Load 41(doublev)
-             390:   43(fvec2) CompositeConstruct 389 389
-             391:   43(fvec2) ExtInst 1(GLSL.std.450) 46(FMix) 387 388 390
-             392:   43(fvec2) Load 45(dvec2v)
-             393:   43(fvec2) FAdd 392 391
+             387: 43(f64vec2) Load 45(dvec2v)
+             388: 43(f64vec2) Load 45(dvec2v)
+             389:39(float64_t) Load 41(doublev)
+             390: 43(f64vec2) CompositeConstruct 389 389
+             391: 43(f64vec2) ExtInst 1(GLSL.std.450) 46(FMix) 387 388 390
+             392: 43(f64vec2) Load 45(dvec2v)
+             393: 43(f64vec2) FAdd 392 391
                               Store 45(dvec2v) 393
-             394:   48(fvec3) Load 50(dvec3v)
-             395:   48(fvec3) Load 50(dvec3v)
-             396:   39(float) Load 41(doublev)
-             397:   48(fvec3) CompositeConstruct 396 396 396
-             398:   48(fvec3) ExtInst 1(GLSL.std.450) 46(FMix) 394 395 397
-             399:   48(fvec3) Load 50(dvec3v)
-             400:   48(fvec3) FAdd 399 398
+             394: 48(f64vec3) Load 50(dvec3v)
+             395: 48(f64vec3) Load 50(dvec3v)
+             396:39(float64_t) Load 41(doublev)
+             397: 48(f64vec3) CompositeConstruct 396 396 396
+             398: 48(f64vec3) ExtInst 1(GLSL.std.450) 46(FMix) 394 395 397
+             399: 48(f64vec3) Load 50(dvec3v)
+             400: 48(f64vec3) FAdd 399 398
                               Store 50(dvec3v) 400
-             401:   53(fvec4) Load 55(dvec4v)
-             402:   53(fvec4) Load 55(dvec4v)
-             403:   39(float) Load 41(doublev)
-             404:   53(fvec4) CompositeConstruct 403 403 403 403
-             405:   53(fvec4) ExtInst 1(GLSL.std.450) 46(FMix) 401 402 404
-             406:   53(fvec4) Load 55(dvec4v)
-             407:   53(fvec4) FAdd 406 405
+             401: 53(f64vec4) Load 55(dvec4v)
+             402: 53(f64vec4) Load 55(dvec4v)
+             403:39(float64_t) Load 41(doublev)
+             404: 53(f64vec4) CompositeConstruct 403 403 403 403
+             405: 53(f64vec4) ExtInst 1(GLSL.std.450) 46(FMix) 401 402 404
+             406: 53(f64vec4) Load 55(dvec4v)
+             407: 53(f64vec4) FAdd 406 405
                               Store 55(dvec4v) 407
-             408:   43(fvec2) Load 45(dvec2v)
-             409:   43(fvec2) Load 45(dvec2v)
-             410:   43(fvec2) Load 45(dvec2v)
-             411:   43(fvec2) ExtInst 1(GLSL.std.450) 46(FMix) 408 409 410
-             412:   43(fvec2) Load 45(dvec2v)
-             413:   43(fvec2) FAdd 412 411
+             408: 43(f64vec2) Load 45(dvec2v)
+             409: 43(f64vec2) Load 45(dvec2v)
+             410: 43(f64vec2) Load 45(dvec2v)
+             411: 43(f64vec2) ExtInst 1(GLSL.std.450) 46(FMix) 408 409 410
+             412: 43(f64vec2) Load 45(dvec2v)
+             413: 43(f64vec2) FAdd 412 411
                               Store 45(dvec2v) 413
-             414:   48(fvec3) Load 50(dvec3v)
-             415:   48(fvec3) Load 50(dvec3v)
-             416:   48(fvec3) Load 50(dvec3v)
-             417:   48(fvec3) ExtInst 1(GLSL.std.450) 46(FMix) 414 415 416
-             418:   48(fvec3) Load 50(dvec3v)
-             419:   48(fvec3) FAdd 418 417
+             414: 48(f64vec3) Load 50(dvec3v)
+             415: 48(f64vec3) Load 50(dvec3v)
+             416: 48(f64vec3) Load 50(dvec3v)
+             417: 48(f64vec3) ExtInst 1(GLSL.std.450) 46(FMix) 414 415 416
+             418: 48(f64vec3) Load 50(dvec3v)
+             419: 48(f64vec3) FAdd 418 417
                               Store 50(dvec3v) 419
-             420:   53(fvec4) Load 55(dvec4v)
-             421:   53(fvec4) Load 55(dvec4v)
-             422:   53(fvec4) Load 55(dvec4v)
-             423:   53(fvec4) ExtInst 1(GLSL.std.450) 46(FMix) 420 421 422
-             424:   53(fvec4) Load 55(dvec4v)
-             425:   53(fvec4) FAdd 424 423
+             420: 53(f64vec4) Load 55(dvec4v)
+             421: 53(f64vec4) Load 55(dvec4v)
+             422: 53(f64vec4) Load 55(dvec4v)
+             423: 53(f64vec4) ExtInst 1(GLSL.std.450) 46(FMix) 420 421 422
+             424: 53(f64vec4) Load 55(dvec4v)
+             425: 53(f64vec4) FAdd 424 423
                               Store 55(dvec4v) 425
-             426:   39(float) Load 41(doublev)
-             427:   39(float) Load 41(doublev)
+             426:39(float64_t) Load 41(doublev)
+             427:39(float64_t) Load 41(doublev)
              431:   428(bool) Load 430(boolv)
-             432:   39(float) Select 431 427 426
-             433:   39(float) Load 41(doublev)
-             434:   39(float) FAdd 433 432
+             432:39(float64_t) Select 431 427 426
+             433:39(float64_t) Load 41(doublev)
+             434:39(float64_t) FAdd 433 432
                               Store 41(doublev) 434
-             435:   43(fvec2) Load 45(dvec2v)
-             436:   43(fvec2) Load 45(dvec2v)
+             435: 43(f64vec2) Load 45(dvec2v)
+             436: 43(f64vec2) Load 45(dvec2v)
              440:  437(bvec2) Load 439(bvec2v)
-             441:   43(fvec2) Select 440 436 435
-             442:   43(fvec2) Load 45(dvec2v)
-             443:   43(fvec2) FAdd 442 441
+             441: 43(f64vec2) Select 440 436 435
+             442: 43(f64vec2) Load 45(dvec2v)
+             443: 43(f64vec2) FAdd 442 441
                               Store 45(dvec2v) 443
-             444:   48(fvec3) Load 50(dvec3v)
-             445:   48(fvec3) Load 50(dvec3v)
+             444: 48(f64vec3) Load 50(dvec3v)
+             445: 48(f64vec3) Load 50(dvec3v)
              449:  446(bvec3) Load 448(bvec3v)
-             450:   48(fvec3) Select 449 445 444
-             451:   48(fvec3) Load 50(dvec3v)
-             452:   48(fvec3) FAdd 451 450
+             450: 48(f64vec3) Select 449 445 444
+             451: 48(f64vec3) Load 50(dvec3v)
+             452: 48(f64vec3) FAdd 451 450
                               Store 50(dvec3v) 452
-             453:   53(fvec4) Load 55(dvec4v)
-             454:   53(fvec4) Load 55(dvec4v)
+             453: 53(f64vec4) Load 55(dvec4v)
+             454: 53(f64vec4) Load 55(dvec4v)
              458:  455(bvec4) Load 457(bvec4v)
-             459:   53(fvec4) Select 458 454 453
-             460:   53(fvec4) Load 55(dvec4v)
-             461:   53(fvec4) FAdd 460 459
+             459: 53(f64vec4) Select 458 454 453
+             460: 53(f64vec4) Load 55(dvec4v)
+             461: 53(f64vec4) FAdd 460 459
                               Store 55(dvec4v) 461
-             462:   39(float) Load 41(doublev)
-             463:   39(float) Load 41(doublev)
-             464:   39(float) ExtInst 1(GLSL.std.450) 48(Step) 462 463
-             465:   39(float) Load 41(doublev)
-             466:   39(float) FAdd 465 464
+             462:39(float64_t) Load 41(doublev)
+             463:39(float64_t) Load 41(doublev)
+             464:39(float64_t) ExtInst 1(GLSL.std.450) 48(Step) 462 463
+             465:39(float64_t) Load 41(doublev)
+             466:39(float64_t) FAdd 465 464
                               Store 41(doublev) 466
-             467:   43(fvec2) Load 45(dvec2v)
-             468:   43(fvec2) Load 45(dvec2v)
-             469:   43(fvec2) ExtInst 1(GLSL.std.450) 48(Step) 467 468
-             470:   43(fvec2) Load 45(dvec2v)
-             471:   43(fvec2) FAdd 470 469
+             467: 43(f64vec2) Load 45(dvec2v)
+             468: 43(f64vec2) Load 45(dvec2v)
+             469: 43(f64vec2) ExtInst 1(GLSL.std.450) 48(Step) 467 468
+             470: 43(f64vec2) Load 45(dvec2v)
+             471: 43(f64vec2) FAdd 470 469
                               Store 45(dvec2v) 471
-             472:   48(fvec3) Load 50(dvec3v)
-             473:   48(fvec3) Load 50(dvec3v)
-             474:   48(fvec3) ExtInst 1(GLSL.std.450) 48(Step) 472 473
-             475:   48(fvec3) Load 50(dvec3v)
-             476:   48(fvec3) FAdd 475 474
+             472: 48(f64vec3) Load 50(dvec3v)
+             473: 48(f64vec3) Load 50(dvec3v)
+             474: 48(f64vec3) ExtInst 1(GLSL.std.450) 48(Step) 472 473
+             475: 48(f64vec3) Load 50(dvec3v)
+             476: 48(f64vec3) FAdd 475 474
                               Store 50(dvec3v) 476
-             477:   53(fvec4) Load 55(dvec4v)
-             478:   53(fvec4) Load 55(dvec4v)
-             479:   53(fvec4) ExtInst 1(GLSL.std.450) 48(Step) 477 478
-             480:   53(fvec4) Load 55(dvec4v)
-             481:   53(fvec4) FAdd 480 479
+             477: 53(f64vec4) Load 55(dvec4v)
+             478: 53(f64vec4) Load 55(dvec4v)
+             479: 53(f64vec4) ExtInst 1(GLSL.std.450) 48(Step) 477 478
+             480: 53(f64vec4) Load 55(dvec4v)
+             481: 53(f64vec4) FAdd 480 479
                               Store 55(dvec4v) 481
-             482:   39(float) Load 41(doublev)
-             483:   43(fvec2) Load 45(dvec2v)
-             484:   43(fvec2) CompositeConstruct 482 482
-             485:   43(fvec2) ExtInst 1(GLSL.std.450) 48(Step) 484 483
-             486:   43(fvec2) Load 45(dvec2v)
-             487:   43(fvec2) FAdd 486 485
+             482:39(float64_t) Load 41(doublev)
+             483: 43(f64vec2) Load 45(dvec2v)
+             484: 43(f64vec2) CompositeConstruct 482 482
+             485: 43(f64vec2) ExtInst 1(GLSL.std.450) 48(Step) 484 483
+             486: 43(f64vec2) Load 45(dvec2v)
+             487: 43(f64vec2) FAdd 486 485
                               Store 45(dvec2v) 487
-             488:   39(float) Load 41(doublev)
-             489:   48(fvec3) Load 50(dvec3v)
-             490:   48(fvec3) CompositeConstruct 488 488 488
-             491:   48(fvec3) ExtInst 1(GLSL.std.450) 48(Step) 490 489
-             492:   48(fvec3) Load 50(dvec3v)
-             493:   48(fvec3) FAdd 492 491
+             488:39(float64_t) Load 41(doublev)
+             489: 48(f64vec3) Load 50(dvec3v)
+             490: 48(f64vec3) CompositeConstruct 488 488 488
+             491: 48(f64vec3) ExtInst 1(GLSL.std.450) 48(Step) 490 489
+             492: 48(f64vec3) Load 50(dvec3v)
+             493: 48(f64vec3) FAdd 492 491
                               Store 50(dvec3v) 493
-             494:   39(float) Load 41(doublev)
-             495:   53(fvec4) Load 55(dvec4v)
-             496:   53(fvec4) CompositeConstruct 494 494 494 494
-             497:   53(fvec4) ExtInst 1(GLSL.std.450) 48(Step) 496 495
-             498:   53(fvec4) Load 55(dvec4v)
-             499:   53(fvec4) FAdd 498 497
+             494:39(float64_t) Load 41(doublev)
+             495: 53(f64vec4) Load 55(dvec4v)
+             496: 53(f64vec4) CompositeConstruct 494 494 494 494
+             497: 53(f64vec4) ExtInst 1(GLSL.std.450) 48(Step) 496 495
+             498: 53(f64vec4) Load 55(dvec4v)
+             499: 53(f64vec4) FAdd 498 497
                               Store 55(dvec4v) 499
-             500:   39(float) Load 41(doublev)
-             501:   39(float) Load 41(doublev)
-             502:   39(float) Load 41(doublev)
-             503:   39(float) ExtInst 1(GLSL.std.450) 49(SmoothStep) 500 501 502
-             504:   39(float) Load 41(doublev)
-             505:   39(float) FAdd 504 503
+             500:39(float64_t) Load 41(doublev)
+             501:39(float64_t) Load 41(doublev)
+             502:39(float64_t) Load 41(doublev)
+             503:39(float64_t) ExtInst 1(GLSL.std.450) 49(SmoothStep) 500 501 502
+             504:39(float64_t) Load 41(doublev)
+             505:39(float64_t) FAdd 504 503
                               Store 41(doublev) 505
-             506:   43(fvec2) Load 45(dvec2v)
-             507:   43(fvec2) Load 45(dvec2v)
-             508:   43(fvec2) Load 45(dvec2v)
-             509:   43(fvec2) ExtInst 1(GLSL.std.450) 49(SmoothStep) 506 507 508
-             510:   43(fvec2) Load 45(dvec2v)
-             511:   43(fvec2) FAdd 510 509
+             506: 43(f64vec2) Load 45(dvec2v)
+             507: 43(f64vec2) Load 45(dvec2v)
+             508: 43(f64vec2) Load 45(dvec2v)
+             509: 43(f64vec2) ExtInst 1(GLSL.std.450) 49(SmoothStep) 506 507 508
+             510: 43(f64vec2) Load 45(dvec2v)
+             511: 43(f64vec2) FAdd 510 509
                               Store 45(dvec2v) 511
-             512:   48(fvec3) Load 50(dvec3v)
-             513:   48(fvec3) Load 50(dvec3v)
-             514:   48(fvec3) Load 50(dvec3v)
-             515:   48(fvec3) ExtInst 1(GLSL.std.450) 49(SmoothStep) 512 513 514
-             516:   48(fvec3) Load 50(dvec3v)
-             517:   48(fvec3) FAdd 516 515
+             512: 48(f64vec3) Load 50(dvec3v)
+             513: 48(f64vec3) Load 50(dvec3v)
+             514: 48(f64vec3) Load 50(dvec3v)
+             515: 48(f64vec3) ExtInst 1(GLSL.std.450) 49(SmoothStep) 512 513 514
+             516: 48(f64vec3) Load 50(dvec3v)
+             517: 48(f64vec3) FAdd 516 515
                               Store 50(dvec3v) 517
-             518:   53(fvec4) Load 55(dvec4v)
-             519:   53(fvec4) Load 55(dvec4v)
-             520:   53(fvec4) Load 55(dvec4v)
-             521:   53(fvec4) ExtInst 1(GLSL.std.450) 49(SmoothStep) 518 519 520
-             522:   53(fvec4) Load 55(dvec4v)
-             523:   53(fvec4) FAdd 522 521
+             518: 53(f64vec4) Load 55(dvec4v)
+             519: 53(f64vec4) Load 55(dvec4v)
+             520: 53(f64vec4) Load 55(dvec4v)
+             521: 53(f64vec4) ExtInst 1(GLSL.std.450) 49(SmoothStep) 518 519 520
+             522: 53(f64vec4) Load 55(dvec4v)
+             523: 53(f64vec4) FAdd 522 521
                               Store 55(dvec4v) 523
-             524:   39(float) Load 41(doublev)
-             525:   39(float) Load 41(doublev)
-             526:   43(fvec2) Load 45(dvec2v)
-             527:   43(fvec2) CompositeConstruct 524 524
-             528:   43(fvec2) CompositeConstruct 525 525
-             529:   43(fvec2) ExtInst 1(GLSL.std.450) 49(SmoothStep) 527 528 526
-             530:   43(fvec2) Load 45(dvec2v)
-             531:   43(fvec2) FAdd 530 529
+             524:39(float64_t) Load 41(doublev)
+             525:39(float64_t) Load 41(doublev)
+             526: 43(f64vec2) Load 45(dvec2v)
+             527: 43(f64vec2) CompositeConstruct 524 524
+             528: 43(f64vec2) CompositeConstruct 525 525
+             529: 43(f64vec2) ExtInst 1(GLSL.std.450) 49(SmoothStep) 527 528 526
+             530: 43(f64vec2) Load 45(dvec2v)
+             531: 43(f64vec2) FAdd 530 529
                               Store 45(dvec2v) 531
-             532:   39(float) Load 41(doublev)
-             533:   39(float) Load 41(doublev)
-             534:   48(fvec3) Load 50(dvec3v)
-             535:   48(fvec3) CompositeConstruct 532 532 532
-             536:   48(fvec3) CompositeConstruct 533 533 533
-             537:   48(fvec3) ExtInst 1(GLSL.std.450) 49(SmoothStep) 535 536 534
-             538:   48(fvec3) Load 50(dvec3v)
-             539:   48(fvec3) FAdd 538 537
+             532:39(float64_t) Load 41(doublev)
+             533:39(float64_t) Load 41(doublev)
+             534: 48(f64vec3) Load 50(dvec3v)
+             535: 48(f64vec3) CompositeConstruct 532 532 532
+             536: 48(f64vec3) CompositeConstruct 533 533 533
+             537: 48(f64vec3) ExtInst 1(GLSL.std.450) 49(SmoothStep) 535 536 534
+             538: 48(f64vec3) Load 50(dvec3v)
+             539: 48(f64vec3) FAdd 538 537
                               Store 50(dvec3v) 539
-             540:   39(float) Load 41(doublev)
-             541:   39(float) Load 41(doublev)
-             542:   53(fvec4) Load 55(dvec4v)
-             543:   53(fvec4) CompositeConstruct 540 540 540 540
-             544:   53(fvec4) CompositeConstruct 541 541 541 541
-             545:   53(fvec4) ExtInst 1(GLSL.std.450) 49(SmoothStep) 543 544 542
-             546:   53(fvec4) Load 55(dvec4v)
-             547:   53(fvec4) FAdd 546 545
+             540:39(float64_t) Load 41(doublev)
+             541:39(float64_t) Load 41(doublev)
+             542: 53(f64vec4) Load 55(dvec4v)
+             543: 53(f64vec4) CompositeConstruct 540 540 540 540
+             544: 53(f64vec4) CompositeConstruct 541 541 541 541
+             545: 53(f64vec4) ExtInst 1(GLSL.std.450) 49(SmoothStep) 543 544 542
+             546: 53(f64vec4) Load 55(dvec4v)
+             547: 53(f64vec4) FAdd 546 545
                               Store 55(dvec4v) 547
-             548:   39(float) Load 41(doublev)
+             548:39(float64_t) Load 41(doublev)
              549:   428(bool) IsNan 548
                               Store 430(boolv) 549
-             550:   43(fvec2) Load 45(dvec2v)
+             550: 43(f64vec2) Load 45(dvec2v)
              551:  437(bvec2) IsNan 550
                               Store 439(bvec2v) 551
-             552:   48(fvec3) Load 50(dvec3v)
+             552: 48(f64vec3) Load 50(dvec3v)
              553:  446(bvec3) IsNan 552
                               Store 448(bvec3v) 553
-             554:   53(fvec4) Load 55(dvec4v)
+             554: 53(f64vec4) Load 55(dvec4v)
              555:  455(bvec4) IsNan 554
                               Store 457(bvec4v) 555
-             557:   428(bool) Load 430(boolv)
+             556:   428(bool) Load 430(boolv)
                               SelectionMerge 559 None
-                              BranchConditional 557 558 562
+                              BranchConditional 556 558 562
              558:               Label
-             560:   39(float)   Load 41(doublev)
+             560:39(float64_t)   Load 41(doublev)
              561:   428(bool)   IsInf 560
-                                Store 556 561
+                                Store 557 561
                                 Branch 559
              562:               Label
-                                Store 556 563
+                                Store 557 563
                                 Branch 559
              559:             Label
-             564:   428(bool) Load 556
+             564:   428(bool) Load 557
                               Store 430(boolv) 564
-             566:   428(bool) Load 430(boolv)
+             565:   428(bool) Load 430(boolv)
                               SelectionMerge 568 None
-                              BranchConditional 566 567 571
+                              BranchConditional 565 567 571
              567:               Label
-             569:   43(fvec2)   Load 45(dvec2v)
+             569: 43(f64vec2)   Load 45(dvec2v)
              570:  437(bvec2)   IsInf 569
-                                Store 565 570
+                                Store 566 570
                                 Branch 568
              571:               Label
-                                Store 565 572
+                                Store 566 572
                                 Branch 568
              568:             Label
-             573:  437(bvec2) Load 565
+             573:  437(bvec2) Load 566
                               Store 439(bvec2v) 573
-             575:   428(bool) Load 430(boolv)
+             574:   428(bool) Load 430(boolv)
                               SelectionMerge 577 None
-                              BranchConditional 575 576 580
+                              BranchConditional 574 576 580
              576:               Label
-             578:   48(fvec3)   Load 50(dvec3v)
+             578: 48(f64vec3)   Load 50(dvec3v)
              579:  446(bvec3)   IsInf 578
-                                Store 574 579
+                                Store 575 579
                                 Branch 577
              580:               Label
-                                Store 574 581
+                                Store 575 581
                                 Branch 577
              577:             Label
-             582:  446(bvec3) Load 574
+             582:  446(bvec3) Load 575
                               Store 448(bvec3v) 582
-             584:   428(bool) Load 430(boolv)
+             583:   428(bool) Load 430(boolv)
                               SelectionMerge 586 None
-                              BranchConditional 584 585 589
+                              BranchConditional 583 585 589
              585:               Label
-             587:   53(fvec4)   Load 55(dvec4v)
+             587: 53(f64vec4)   Load 55(dvec4v)
              588:  455(bvec4)   IsInf 587
-                                Store 583 588
+                                Store 584 588
                                 Branch 586
              589:               Label
-                                Store 583 590
+                                Store 584 590
                                 Branch 586
              586:             Label
-             591:  455(bvec4) Load 583
+             591:  455(bvec4) Load 584
                               Store 457(bvec4v) 591
-             592:   39(float) Load 41(doublev)
-             593:   39(float) ExtInst 1(GLSL.std.450) 66(Length) 592
-             594:   39(float) Load 41(doublev)
-             595:   39(float) FAdd 594 593
+             592:39(float64_t) Load 41(doublev)
+             593:39(float64_t) ExtInst 1(GLSL.std.450) 66(Length) 592
+             594:39(float64_t) Load 41(doublev)
+             595:39(float64_t) FAdd 594 593
                               Store 41(doublev) 595
-             596:   43(fvec2) Load 45(dvec2v)
-             597:   39(float) ExtInst 1(GLSL.std.450) 66(Length) 596
-             598:   39(float) Load 41(doublev)
-             599:   39(float) FAdd 598 597
+             596: 43(f64vec2) Load 45(dvec2v)
+             597:39(float64_t) ExtInst 1(GLSL.std.450) 66(Length) 596
+             598:39(float64_t) Load 41(doublev)
+             599:39(float64_t) FAdd 598 597
                               Store 41(doublev) 599
-             600:   48(fvec3) Load 50(dvec3v)
-             601:   39(float) ExtInst 1(GLSL.std.450) 66(Length) 600
-             602:   39(float) Load 41(doublev)
-             603:   39(float) FAdd 602 601
+             600: 48(f64vec3) Load 50(dvec3v)
+             601:39(float64_t) ExtInst 1(GLSL.std.450) 66(Length) 600
+             602:39(float64_t) Load 41(doublev)
+             603:39(float64_t) FAdd 602 601
                               Store 41(doublev) 603
-             604:   53(fvec4) Load 55(dvec4v)
-             605:   39(float) ExtInst 1(GLSL.std.450) 66(Length) 604
-             606:   39(float) Load 41(doublev)
-             607:   39(float) FAdd 606 605
+             604: 53(f64vec4) Load 55(dvec4v)
+             605:39(float64_t) ExtInst 1(GLSL.std.450) 66(Length) 604
+             606:39(float64_t) Load 41(doublev)
+             607:39(float64_t) FAdd 606 605
                               Store 41(doublev) 607
-             608:   39(float) Load 41(doublev)
-             609:   39(float) Load 41(doublev)
-             610:   39(float) ExtInst 1(GLSL.std.450) 67(Distance) 608 609
-             611:   39(float) Load 41(doublev)
-             612:   39(float) FAdd 611 610
+             608:39(float64_t) Load 41(doublev)
+             609:39(float64_t) Load 41(doublev)
+             610:39(float64_t) ExtInst 1(GLSL.std.450) 67(Distance) 608 609
+             611:39(float64_t) Load 41(doublev)
+             612:39(float64_t) FAdd 611 610
                               Store 41(doublev) 612
-             613:   43(fvec2) Load 45(dvec2v)
-             614:   43(fvec2) Load 45(dvec2v)
-             615:   39(float) ExtInst 1(GLSL.std.450) 67(Distance) 613 614
-             616:   39(float) Load 41(doublev)
-             617:   39(float) FAdd 616 615
+             613: 43(f64vec2) Load 45(dvec2v)
+             614: 43(f64vec2) Load 45(dvec2v)
+             615:39(float64_t) ExtInst 1(GLSL.std.450) 67(Distance) 613 614
+             616:39(float64_t) Load 41(doublev)
+             617:39(float64_t) FAdd 616 615
                               Store 41(doublev) 617
-             618:   48(fvec3) Load 50(dvec3v)
-             619:   48(fvec3) Load 50(dvec3v)
-             620:   39(float) ExtInst 1(GLSL.std.450) 67(Distance) 618 619
-             621:   39(float) Load 41(doublev)
-             622:   39(float) FAdd 621 620
+             618: 48(f64vec3) Load 50(dvec3v)
+             619: 48(f64vec3) Load 50(dvec3v)
+             620:39(float64_t) ExtInst 1(GLSL.std.450) 67(Distance) 618 619
+             621:39(float64_t) Load 41(doublev)
+             622:39(float64_t) FAdd 621 620
                               Store 41(doublev) 622
-             623:   53(fvec4) Load 55(dvec4v)
-             624:   53(fvec4) Load 55(dvec4v)
-             625:   39(float) ExtInst 1(GLSL.std.450) 67(Distance) 623 624
-             626:   39(float) Load 41(doublev)
-             627:   39(float) FAdd 626 625
+             623: 53(f64vec4) Load 55(dvec4v)
+             624: 53(f64vec4) Load 55(dvec4v)
+             625:39(float64_t) ExtInst 1(GLSL.std.450) 67(Distance) 623 624
+             626:39(float64_t) Load 41(doublev)
+             627:39(float64_t) FAdd 626 625
                               Store 41(doublev) 627
-             628:   39(float) Load 41(doublev)
-             629:   39(float) Load 41(doublev)
-             630:   39(float) FMul 628 629
-             631:   39(float) Load 41(doublev)
-             632:   39(float) FAdd 631 630
+             628:39(float64_t) Load 41(doublev)
+             629:39(float64_t) Load 41(doublev)
+             630:39(float64_t) FMul 628 629
+             631:39(float64_t) Load 41(doublev)
+             632:39(float64_t) FAdd 631 630
                               Store 41(doublev) 632
-             633:   43(fvec2) Load 45(dvec2v)
-             634:   43(fvec2) Load 45(dvec2v)
-             635:   39(float) Dot 633 634
-             636:   39(float) Load 41(doublev)
-             637:   39(float) FAdd 636 635
+             633: 43(f64vec2) Load 45(dvec2v)
+             634: 43(f64vec2) Load 45(dvec2v)
+             635:39(float64_t) Dot 633 634
+             636:39(float64_t) Load 41(doublev)
+             637:39(float64_t) FAdd 636 635
                               Store 41(doublev) 637
-             638:   48(fvec3) Load 50(dvec3v)
-             639:   48(fvec3) Load 50(dvec3v)
-             640:   39(float) Dot 638 639
-             641:   39(float) Load 41(doublev)
-             642:   39(float) FAdd 641 640
+             638: 48(f64vec3) Load 50(dvec3v)
+             639: 48(f64vec3) Load 50(dvec3v)
+             640:39(float64_t) Dot 638 639
+             641:39(float64_t) Load 41(doublev)
+             642:39(float64_t) FAdd 641 640
                               Store 41(doublev) 642
-             643:   53(fvec4) Load 55(dvec4v)
-             644:   53(fvec4) Load 55(dvec4v)
-             645:   39(float) Dot 643 644
-             646:   39(float) Load 41(doublev)
-             647:   39(float) FAdd 646 645
+             643: 53(f64vec4) Load 55(dvec4v)
+             644: 53(f64vec4) Load 55(dvec4v)
+             645:39(float64_t) Dot 643 644
+             646:39(float64_t) Load 41(doublev)
+             647:39(float64_t) FAdd 646 645
                               Store 41(doublev) 647
-             648:   48(fvec3) Load 50(dvec3v)
-             649:   48(fvec3) Load 50(dvec3v)
-             650:   48(fvec3) ExtInst 1(GLSL.std.450) 68(Cross) 648 649
-             651:   48(fvec3) Load 50(dvec3v)
-             652:   48(fvec3) FAdd 651 650
+             648: 48(f64vec3) Load 50(dvec3v)
+             649: 48(f64vec3) Load 50(dvec3v)
+             650: 48(f64vec3) ExtInst 1(GLSL.std.450) 68(Cross) 648 649
+             651: 48(f64vec3) Load 50(dvec3v)
+             652: 48(f64vec3) FAdd 651 650
                               Store 50(dvec3v) 652
-             653:   39(float) Load 41(doublev)
-             654:   39(float) ExtInst 1(GLSL.std.450) 69(Normalize) 653
-             655:   39(float) Load 41(doublev)
-             656:   39(float) FAdd 655 654
+             653:39(float64_t) Load 41(doublev)
+             654:39(float64_t) ExtInst 1(GLSL.std.450) 69(Normalize) 653
+             655:39(float64_t) Load 41(doublev)
+             656:39(float64_t) FAdd 655 654
                               Store 41(doublev) 656
-             657:   43(fvec2) Load 45(dvec2v)
-             658:   43(fvec2) ExtInst 1(GLSL.std.450) 69(Normalize) 657
-             659:   43(fvec2) Load 45(dvec2v)
-             660:   43(fvec2) FAdd 659 658
+             657: 43(f64vec2) Load 45(dvec2v)
+             658: 43(f64vec2) ExtInst 1(GLSL.std.450) 69(Normalize) 657
+             659: 43(f64vec2) Load 45(dvec2v)
+             660: 43(f64vec2) FAdd 659 658
                               Store 45(dvec2v) 660
-             661:   48(fvec3) Load 50(dvec3v)
-             662:   48(fvec3) ExtInst 1(GLSL.std.450) 69(Normalize) 661
-             663:   48(fvec3) Load 50(dvec3v)
-             664:   48(fvec3) FAdd 663 662
+             661: 48(f64vec3) Load 50(dvec3v)
+             662: 48(f64vec3) ExtInst 1(GLSL.std.450) 69(Normalize) 661
+             663: 48(f64vec3) Load 50(dvec3v)
+             664: 48(f64vec3) FAdd 663 662
                               Store 50(dvec3v) 664
-             665:   53(fvec4) Load 55(dvec4v)
-             666:   53(fvec4) ExtInst 1(GLSL.std.450) 69(Normalize) 665
-             667:   53(fvec4) Load 55(dvec4v)
-             668:   53(fvec4) FAdd 667 666
+             665: 53(f64vec4) Load 55(dvec4v)
+             666: 53(f64vec4) ExtInst 1(GLSL.std.450) 69(Normalize) 665
+             667: 53(f64vec4) Load 55(dvec4v)
+             668: 53(f64vec4) FAdd 667 666
                               Store 55(dvec4v) 668
-             669:   39(float) Load 41(doublev)
-             670:   39(float) Load 41(doublev)
-             671:   39(float) Load 41(doublev)
-             672:   39(float) ExtInst 1(GLSL.std.450) 70(FaceForward) 669 670 671
-             673:   39(float) Load 41(doublev)
-             674:   39(float) FAdd 673 672
+             669:39(float64_t) Load 41(doublev)
+             670:39(float64_t) Load 41(doublev)
+             671:39(float64_t) Load 41(doublev)
+             672:39(float64_t) ExtInst 1(GLSL.std.450) 70(FaceForward) 669 670 671
+             673:39(float64_t) Load 41(doublev)
+             674:39(float64_t) FAdd 673 672
                               Store 41(doublev) 674
-             675:   43(fvec2) Load 45(dvec2v)
-             676:   43(fvec2) Load 45(dvec2v)
-             677:   43(fvec2) Load 45(dvec2v)
-             678:   43(fvec2) ExtInst 1(GLSL.std.450) 70(FaceForward) 675 676 677
-             679:   43(fvec2) Load 45(dvec2v)
-             680:   43(fvec2) FAdd 679 678
+             675: 43(f64vec2) Load 45(dvec2v)
+             676: 43(f64vec2) Load 45(dvec2v)
+             677: 43(f64vec2) Load 45(dvec2v)
+             678: 43(f64vec2) ExtInst 1(GLSL.std.450) 70(FaceForward) 675 676 677
+             679: 43(f64vec2) Load 45(dvec2v)
+             680: 43(f64vec2) FAdd 679 678
                               Store 45(dvec2v) 680
-             681:   48(fvec3) Load 50(dvec3v)
-             682:   48(fvec3) Load 50(dvec3v)
-             683:   48(fvec3) Load 50(dvec3v)
-             684:   48(fvec3) ExtInst 1(GLSL.std.450) 70(FaceForward) 681 682 683
-             685:   48(fvec3) Load 50(dvec3v)
-             686:   48(fvec3) FAdd 685 684
+             681: 48(f64vec3) Load 50(dvec3v)
+             682: 48(f64vec3) Load 50(dvec3v)
+             683: 48(f64vec3) Load 50(dvec3v)
+             684: 48(f64vec3) ExtInst 1(GLSL.std.450) 70(FaceForward) 681 682 683
+             685: 48(f64vec3) Load 50(dvec3v)
+             686: 48(f64vec3) FAdd 685 684
                               Store 50(dvec3v) 686
-             687:   53(fvec4) Load 55(dvec4v)
-             688:   53(fvec4) Load 55(dvec4v)
-             689:   53(fvec4) Load 55(dvec4v)
-             690:   53(fvec4) ExtInst 1(GLSL.std.450) 70(FaceForward) 687 688 689
-             691:   53(fvec4) Load 55(dvec4v)
-             692:   53(fvec4) FAdd 691 690
+             687: 53(f64vec4) Load 55(dvec4v)
+             688: 53(f64vec4) Load 55(dvec4v)
+             689: 53(f64vec4) Load 55(dvec4v)
+             690: 53(f64vec4) ExtInst 1(GLSL.std.450) 70(FaceForward) 687 688 689
+             691: 53(f64vec4) Load 55(dvec4v)
+             692: 53(f64vec4) FAdd 691 690
                               Store 55(dvec4v) 692
-             693:   39(float) Load 41(doublev)
-             694:   39(float) Load 41(doublev)
-             695:   39(float) ExtInst 1(GLSL.std.450) 71(Reflect) 693 694
-             696:   39(float) Load 41(doublev)
-             697:   39(float) FAdd 696 695
+             693:39(float64_t) Load 41(doublev)
+             694:39(float64_t) Load 41(doublev)
+             695:39(float64_t) ExtInst 1(GLSL.std.450) 71(Reflect) 693 694
+             696:39(float64_t) Load 41(doublev)
+             697:39(float64_t) FAdd 696 695
                               Store 41(doublev) 697
-             698:   43(fvec2) Load 45(dvec2v)
-             699:   43(fvec2) Load 45(dvec2v)
-             700:   43(fvec2) ExtInst 1(GLSL.std.450) 71(Reflect) 698 699
-             701:   43(fvec2) Load 45(dvec2v)
-             702:   43(fvec2) FAdd 701 700
+             698: 43(f64vec2) Load 45(dvec2v)
+             699: 43(f64vec2) Load 45(dvec2v)
+             700: 43(f64vec2) ExtInst 1(GLSL.std.450) 71(Reflect) 698 699
+             701: 43(f64vec2) Load 45(dvec2v)
+             702: 43(f64vec2) FAdd 701 700
                               Store 45(dvec2v) 702
-             703:   48(fvec3) Load 50(dvec3v)
-             704:   48(fvec3) Load 50(dvec3v)
-             705:   48(fvec3) ExtInst 1(GLSL.std.450) 71(Reflect) 703 704
-             706:   48(fvec3) Load 50(dvec3v)
-             707:   48(fvec3) FAdd 706 705
+             703: 48(f64vec3) Load 50(dvec3v)
+             704: 48(f64vec3) Load 50(dvec3v)
+             705: 48(f64vec3) ExtInst 1(GLSL.std.450) 71(Reflect) 703 704
+             706: 48(f64vec3) Load 50(dvec3v)
+             707: 48(f64vec3) FAdd 706 705
                               Store 50(dvec3v) 707
-             708:   53(fvec4) Load 55(dvec4v)
-             709:   53(fvec4) Load 55(dvec4v)
-             710:   53(fvec4) ExtInst 1(GLSL.std.450) 71(Reflect) 708 709
-             711:   53(fvec4) Load 55(dvec4v)
-             712:   53(fvec4) FAdd 711 710
+             708: 53(f64vec4) Load 55(dvec4v)
+             709: 53(f64vec4) Load 55(dvec4v)
+             710: 53(f64vec4) ExtInst 1(GLSL.std.450) 71(Reflect) 708 709
+             711: 53(f64vec4) Load 55(dvec4v)
+             712: 53(f64vec4) FAdd 711 710
                               Store 55(dvec4v) 712
-             713:   39(float) Load 41(doublev)
-             714:   39(float) Load 41(doublev)
-             715:   39(float) Load 41(doublev)
-             716:   39(float) ExtInst 1(GLSL.std.450) 72(Refract) 713 714 715
-             717:   39(float) Load 41(doublev)
-             718:   39(float) FAdd 717 716
+             713:39(float64_t) Load 41(doublev)
+             714:39(float64_t) Load 41(doublev)
+             715:39(float64_t) Load 41(doublev)
+             716:39(float64_t) ExtInst 1(GLSL.std.450) 72(Refract) 713 714 715
+             717:39(float64_t) Load 41(doublev)
+             718:39(float64_t) FAdd 717 716
                               Store 41(doublev) 718
-             719:   43(fvec2) Load 45(dvec2v)
-             720:   43(fvec2) Load 45(dvec2v)
-             721:   39(float) Load 41(doublev)
-             722:   43(fvec2) ExtInst 1(GLSL.std.450) 72(Refract) 719 720 721
-             723:   43(fvec2) Load 45(dvec2v)
-             724:   43(fvec2) FAdd 723 722
+             719: 43(f64vec2) Load 45(dvec2v)
+             720: 43(f64vec2) Load 45(dvec2v)
+             721:39(float64_t) Load 41(doublev)
+             722: 43(f64vec2) ExtInst 1(GLSL.std.450) 72(Refract) 719 720 721
+             723: 43(f64vec2) Load 45(dvec2v)
+             724: 43(f64vec2) FAdd 723 722
                               Store 45(dvec2v) 724
-             725:   48(fvec3) Load 50(dvec3v)
-             726:   48(fvec3) Load 50(dvec3v)
-             727:   39(float) Load 41(doublev)
-             728:   48(fvec3) ExtInst 1(GLSL.std.450) 72(Refract) 725 726 727
-             729:   48(fvec3) Load 50(dvec3v)
-             730:   48(fvec3) FAdd 729 728
+             725: 48(f64vec3) Load 50(dvec3v)
+             726: 48(f64vec3) Load 50(dvec3v)
+             727:39(float64_t) Load 41(doublev)
+             728: 48(f64vec3) ExtInst 1(GLSL.std.450) 72(Refract) 725 726 727
+             729: 48(f64vec3) Load 50(dvec3v)
+             730: 48(f64vec3) FAdd 729 728
                               Store 50(dvec3v) 730
-             731:   53(fvec4) Load 55(dvec4v)
-             732:   53(fvec4) Load 55(dvec4v)
-             733:   39(float) Load 41(doublev)
-             734:   53(fvec4) ExtInst 1(GLSL.std.450) 72(Refract) 731 732 733
-             735:   53(fvec4) Load 55(dvec4v)
-             736:   53(fvec4) FAdd 735 734
+             731: 53(f64vec4) Load 55(dvec4v)
+             732: 53(f64vec4) Load 55(dvec4v)
+             733:39(float64_t) Load 41(doublev)
+             734: 53(f64vec4) ExtInst 1(GLSL.std.450) 72(Refract) 731 732 733
+             735: 53(f64vec4) Load 55(dvec4v)
+             736: 53(f64vec4) FAdd 735 734
                               Store 55(dvec4v) 736
-             740:   43(fvec2) Load 45(dvec2v)
-             741:   43(fvec2) Load 45(dvec2v)
+             740: 43(f64vec2) Load 45(dvec2v)
+             741: 43(f64vec2) Load 45(dvec2v)
              742:         737 OuterProduct 740 741
                               Store 739(dmat2v) 742
-             746:   48(fvec3) Load 50(dvec3v)
-             747:   48(fvec3) Load 50(dvec3v)
+             746: 48(f64vec3) Load 50(dvec3v)
+             747: 48(f64vec3) Load 50(dvec3v)
              748:         743 OuterProduct 746 747
                               Store 745(dmat3v) 748
-             752:   53(fvec4) Load 55(dvec4v)
-             753:   53(fvec4) Load 55(dvec4v)
+             752: 53(f64vec4) Load 55(dvec4v)
+             753: 53(f64vec4) Load 55(dvec4v)
              754:         749 OuterProduct 752 753
                               Store 751(dmat4v) 754
-             758:   48(fvec3) Load 50(dvec3v)
-             759:   43(fvec2) Load 45(dvec2v)
+             758: 48(f64vec3) Load 50(dvec3v)
+             759: 43(f64vec2) Load 45(dvec2v)
              760:         755 OuterProduct 758 759
                               Store 757(dmat2x3v) 760
-             764:   43(fvec2) Load 45(dvec2v)
-             765:   48(fvec3) Load 50(dvec3v)
+             764: 43(f64vec2) Load 45(dvec2v)
+             765: 48(f64vec3) Load 50(dvec3v)
              766:         761 OuterProduct 764 765
                               Store 763(dmat3x2v) 766
-             770:   53(fvec4) Load 55(dvec4v)
-             771:   43(fvec2) Load 45(dvec2v)
+             770: 53(f64vec4) Load 55(dvec4v)
+             771: 43(f64vec2) Load 45(dvec2v)
              772:         767 OuterProduct 770 771
                               Store 769(dmat2x4v) 772
-             776:   43(fvec2) Load 45(dvec2v)
-             777:   53(fvec4) Load 55(dvec4v)
+             776: 43(f64vec2) Load 45(dvec2v)
+             777: 53(f64vec4) Load 55(dvec4v)
              778:         773 OuterProduct 776 777
                               Store 775(dmat4x2v) 778
-             782:   53(fvec4) Load 55(dvec4v)
-             783:   48(fvec3) Load 50(dvec3v)
+             782: 53(f64vec4) Load 55(dvec4v)
+             783: 48(f64vec3) Load 50(dvec3v)
              784:         779 OuterProduct 782 783
                               Store 781(dmat3x4v) 784
-             788:   48(fvec3) Load 50(dvec3v)
-             789:   53(fvec4) Load 55(dvec4v)
+             788: 48(f64vec3) Load 50(dvec3v)
+             789: 53(f64vec4) Load 55(dvec4v)
              790:         785 OuterProduct 788 789
                               Store 787(dmat4x3v) 790
              791:         737 Load 739(dmat2v)
              792:         737 Load 739(dmat2v)
-             793:   43(fvec2) CompositeExtract 791 0
-             794:   43(fvec2) CompositeExtract 792 0
-             795:   43(fvec2) FMul 793 794
-             796:   43(fvec2) CompositeExtract 791 1
-             797:   43(fvec2) CompositeExtract 792 1
-             798:   43(fvec2) FMul 796 797
+             793: 43(f64vec2) CompositeExtract 791 0
+             794: 43(f64vec2) CompositeExtract 792 0
+             795: 43(f64vec2) FMul 793 794
+             796: 43(f64vec2) CompositeExtract 791 1
+             797: 43(f64vec2) CompositeExtract 792 1
+             798: 43(f64vec2) FMul 796 797
              799:         737 CompositeConstruct 795 798
              800:         737 Load 739(dmat2v)
              801:         737 MatrixTimesMatrix 800 799
                               Store 739(dmat2v) 801
              802:         743 Load 745(dmat3v)
              803:         743 Load 745(dmat3v)
-             804:   48(fvec3) CompositeExtract 802 0
-             805:   48(fvec3) CompositeExtract 803 0
-             806:   48(fvec3) FMul 804 805
-             807:   48(fvec3) CompositeExtract 802 1
-             808:   48(fvec3) CompositeExtract 803 1
-             809:   48(fvec3) FMul 807 808
-             810:   48(fvec3) CompositeExtract 802 2
-             811:   48(fvec3) CompositeExtract 803 2
-             812:   48(fvec3) FMul 810 811
+             804: 48(f64vec3) CompositeExtract 802 0
+             805: 48(f64vec3) CompositeExtract 803 0
+             806: 48(f64vec3) FMul 804 805
+             807: 48(f64vec3) CompositeExtract 802 1
+             808: 48(f64vec3) CompositeExtract 803 1
+             809: 48(f64vec3) FMul 807 808
+             810: 48(f64vec3) CompositeExtract 802 2
+             811: 48(f64vec3) CompositeExtract 803 2
+             812: 48(f64vec3) FMul 810 811
              813:         743 CompositeConstruct 806 809 812
              814:         743 Load 745(dmat3v)
              815:         743 MatrixTimesMatrix 814 813
                               Store 745(dmat3v) 815
              816:         749 Load 751(dmat4v)
              817:         749 Load 751(dmat4v)
-             818:   53(fvec4) CompositeExtract 816 0
-             819:   53(fvec4) CompositeExtract 817 0
-             820:   53(fvec4) FMul 818 819
-             821:   53(fvec4) CompositeExtract 816 1
-             822:   53(fvec4) CompositeExtract 817 1
-             823:   53(fvec4) FMul 821 822
-             824:   53(fvec4) CompositeExtract 816 2
-             825:   53(fvec4) CompositeExtract 817 2
-             826:   53(fvec4) FMul 824 825
-             827:   53(fvec4) CompositeExtract 816 3
-             828:   53(fvec4) CompositeExtract 817 3
-             829:   53(fvec4) FMul 827 828
+             818: 53(f64vec4) CompositeExtract 816 0
+             819: 53(f64vec4) CompositeExtract 817 0
+             820: 53(f64vec4) FMul 818 819
+             821: 53(f64vec4) CompositeExtract 816 1
+             822: 53(f64vec4) CompositeExtract 817 1
+             823: 53(f64vec4) FMul 821 822
+             824: 53(f64vec4) CompositeExtract 816 2
+             825: 53(f64vec4) CompositeExtract 817 2
+             826: 53(f64vec4) FMul 824 825
+             827: 53(f64vec4) CompositeExtract 816 3
+             828: 53(f64vec4) CompositeExtract 817 3
+             829: 53(f64vec4) FMul 827 828
              830:         749 CompositeConstruct 820 823 826 829
              831:         749 Load 751(dmat4v)
              832:         749 MatrixTimesMatrix 831 830
                               Store 751(dmat4v) 832
              833:         755 Load 757(dmat2x3v)
              834:         755 Load 757(dmat2x3v)
-             835:   48(fvec3) CompositeExtract 833 0
-             836:   48(fvec3) CompositeExtract 834 0
-             837:   48(fvec3) FMul 835 836
-             838:   48(fvec3) CompositeExtract 833 1
-             839:   48(fvec3) CompositeExtract 834 1
-             840:   48(fvec3) FMul 838 839
+             835: 48(f64vec3) CompositeExtract 833 0
+             836: 48(f64vec3) CompositeExtract 834 0
+             837: 48(f64vec3) FMul 835 836
+             838: 48(f64vec3) CompositeExtract 833 1
+             839: 48(f64vec3) CompositeExtract 834 1
+             840: 48(f64vec3) FMul 838 839
              841:         755 CompositeConstruct 837 840
                               Store 757(dmat2x3v) 841
              842:         767 Load 769(dmat2x4v)
              843:         767 Load 769(dmat2x4v)
-             844:   53(fvec4) CompositeExtract 842 0
-             845:   53(fvec4) CompositeExtract 843 0
-             846:   53(fvec4) FMul 844 845
-             847:   53(fvec4) CompositeExtract 842 1
-             848:   53(fvec4) CompositeExtract 843 1
-             849:   53(fvec4) FMul 847 848
+             844: 53(f64vec4) CompositeExtract 842 0
+             845: 53(f64vec4) CompositeExtract 843 0
+             846: 53(f64vec4) FMul 844 845
+             847: 53(f64vec4) CompositeExtract 842 1
+             848: 53(f64vec4) CompositeExtract 843 1
+             849: 53(f64vec4) FMul 847 848
              850:         767 CompositeConstruct 846 849
                               Store 769(dmat2x4v) 850
              851:         761 Load 763(dmat3x2v)
              852:         761 Load 763(dmat3x2v)
-             853:   43(fvec2) CompositeExtract 851 0
-             854:   43(fvec2) CompositeExtract 852 0
-             855:   43(fvec2) FMul 853 854
-             856:   43(fvec2) CompositeExtract 851 1
-             857:   43(fvec2) CompositeExtract 852 1
-             858:   43(fvec2) FMul 856 857
-             859:   43(fvec2) CompositeExtract 851 2
-             860:   43(fvec2) CompositeExtract 852 2
-             861:   43(fvec2) FMul 859 860
+             853: 43(f64vec2) CompositeExtract 851 0
+             854: 43(f64vec2) CompositeExtract 852 0
+             855: 43(f64vec2) FMul 853 854
+             856: 43(f64vec2) CompositeExtract 851 1
+             857: 43(f64vec2) CompositeExtract 852 1
+             858: 43(f64vec2) FMul 856 857
+             859: 43(f64vec2) CompositeExtract 851 2
+             860: 43(f64vec2) CompositeExtract 852 2
+             861: 43(f64vec2) FMul 859 860
              862:         761 CompositeConstruct 855 858 861
                               Store 763(dmat3x2v) 862
              863:         779 Load 781(dmat3x4v)
              864:         779 Load 781(dmat3x4v)
-             865:   53(fvec4) CompositeExtract 863 0
-             866:   53(fvec4) CompositeExtract 864 0
-             867:   53(fvec4) FMul 865 866
-             868:   53(fvec4) CompositeExtract 863 1
-             869:   53(fvec4) CompositeExtract 864 1
-             870:   53(fvec4) FMul 868 869
-             871:   53(fvec4) CompositeExtract 863 2
-             872:   53(fvec4) CompositeExtract 864 2
-             873:   53(fvec4) FMul 871 872
+             865: 53(f64vec4) CompositeExtract 863 0
+             866: 53(f64vec4) CompositeExtract 864 0
+             867: 53(f64vec4) FMul 865 866
+             868: 53(f64vec4) CompositeExtract 863 1
+             869: 53(f64vec4) CompositeExtract 864 1
+             870: 53(f64vec4) FMul 868 869
+             871: 53(f64vec4) CompositeExtract 863 2
+             872: 53(f64vec4) CompositeExtract 864 2
+             873: 53(f64vec4) FMul 871 872
              874:         779 CompositeConstruct 867 870 873
                               Store 781(dmat3x4v) 874
              875:         773 Load 775(dmat4x2v)
              876:         773 Load 775(dmat4x2v)
-             877:   43(fvec2) CompositeExtract 875 0
-             878:   43(fvec2) CompositeExtract 876 0
-             879:   43(fvec2) FMul 877 878
-             880:   43(fvec2) CompositeExtract 875 1
-             881:   43(fvec2) CompositeExtract 876 1
-             882:   43(fvec2) FMul 880 881
-             883:   43(fvec2) CompositeExtract 875 2
-             884:   43(fvec2) CompositeExtract 876 2
-             885:   43(fvec2) FMul 883 884
-             886:   43(fvec2) CompositeExtract 875 3
-             887:   43(fvec2) CompositeExtract 876 3
-             888:   43(fvec2) FMul 886 887
+             877: 43(f64vec2) CompositeExtract 875 0
+             878: 43(f64vec2) CompositeExtract 876 0
+             879: 43(f64vec2) FMul 877 878
+             880: 43(f64vec2) CompositeExtract 875 1
+             881: 43(f64vec2) CompositeExtract 876 1
+             882: 43(f64vec2) FMul 880 881
+             883: 43(f64vec2) CompositeExtract 875 2
+             884: 43(f64vec2) CompositeExtract 876 2
+             885: 43(f64vec2) FMul 883 884
+             886: 43(f64vec2) CompositeExtract 875 3
+             887: 43(f64vec2) CompositeExtract 876 3
+             888: 43(f64vec2) FMul 886 887
              889:         773 CompositeConstruct 879 882 885 888
                               Store 775(dmat4x2v) 889
              890:         785 Load 787(dmat4x3v)
              891:         785 Load 787(dmat4x3v)
-             892:   48(fvec3) CompositeExtract 890 0
-             893:   48(fvec3) CompositeExtract 891 0
-             894:   48(fvec3) FMul 892 893
-             895:   48(fvec3) CompositeExtract 890 1
-             896:   48(fvec3) CompositeExtract 891 1
-             897:   48(fvec3) FMul 895 896
-             898:   48(fvec3) CompositeExtract 890 2
-             899:   48(fvec3) CompositeExtract 891 2
-             900:   48(fvec3) FMul 898 899
-             901:   48(fvec3) CompositeExtract 890 3
-             902:   48(fvec3) CompositeExtract 891 3
-             903:   48(fvec3) FMul 901 902
+             892: 48(f64vec3) CompositeExtract 890 0
+             893: 48(f64vec3) CompositeExtract 891 0
+             894: 48(f64vec3) FMul 892 893
+             895: 48(f64vec3) CompositeExtract 890 1
+             896: 48(f64vec3) CompositeExtract 891 1
+             897: 48(f64vec3) FMul 895 896
+             898: 48(f64vec3) CompositeExtract 890 2
+             899: 48(f64vec3) CompositeExtract 891 2
+             900: 48(f64vec3) FMul 898 899
+             901: 48(f64vec3) CompositeExtract 890 3
+             902: 48(f64vec3) CompositeExtract 891 3
+             903: 48(f64vec3) FMul 901 902
              904:         785 CompositeConstruct 894 897 900 903
                               Store 787(dmat4x3v) 904
              905:         737 Load 739(dmat2v)
@@ -1300,19 +1302,19 @@
              928:         785 Transpose 927
                               Store 787(dmat4x3v) 928
              929:         737 Load 739(dmat2v)
-             930:   39(float) ExtInst 1(GLSL.std.450) 33(Determinant) 929
-             931:   39(float) Load 41(doublev)
-             932:   39(float) FAdd 931 930
+             930:39(float64_t) ExtInst 1(GLSL.std.450) 33(Determinant) 929
+             931:39(float64_t) Load 41(doublev)
+             932:39(float64_t) FAdd 931 930
                               Store 41(doublev) 932
              933:         743 Load 745(dmat3v)
-             934:   39(float) ExtInst 1(GLSL.std.450) 33(Determinant) 933
-             935:   39(float) Load 41(doublev)
-             936:   39(float) FAdd 935 934
+             934:39(float64_t) ExtInst 1(GLSL.std.450) 33(Determinant) 933
+             935:39(float64_t) Load 41(doublev)
+             936:39(float64_t) FAdd 935 934
                               Store 41(doublev) 936
              937:         749 Load 751(dmat4v)
-             938:   39(float) ExtInst 1(GLSL.std.450) 33(Determinant) 937
-             939:   39(float) Load 41(doublev)
-             940:   39(float) FAdd 939 938
+             938:39(float64_t) ExtInst 1(GLSL.std.450) 33(Determinant) 937
+             939:39(float64_t) Load 41(doublev)
+             940:39(float64_t) FAdd 939 938
                               Store 41(doublev) 940
              941:         737 Load 739(dmat2v)
              942:         737 ExtInst 1(GLSL.std.450) 34(MatrixInverse) 941
@@ -1329,62 +1331,62 @@
              951:         749 Load 751(dmat4v)
              952:         749 MatrixTimesMatrix 951 950
                               Store 751(dmat4v) 952
-             953:   39(float) Load 41(doublev)
+             953:39(float64_t) Load 41(doublev)
              955:     40(ptr) AccessChain 45(dvec2v) 954
-             956:   39(float) Load 955
-             957:   39(float) FAdd 953 956
+             956:39(float64_t) Load 955
+             957:39(float64_t) FAdd 953 956
              959:     40(ptr) AccessChain 50(dvec3v) 958
-             960:   39(float) Load 959
-             961:   39(float) FAdd 957 960
+             960:39(float64_t) Load 959
+             961:39(float64_t) FAdd 957 960
              963:     40(ptr) AccessChain 55(dvec4v) 962
-             964:   39(float) Load 963
-             965:   39(float) FAdd 961 964
+             964:39(float64_t) Load 963
+             965:39(float64_t) FAdd 961 964
              967:     40(ptr) AccessChain 739(dmat2v) 966 954
-             968:   39(float) Load 967
-             969:   39(float) FAdd 965 968
+             968:39(float64_t) Load 967
+             969:39(float64_t) FAdd 965 968
              971:     40(ptr) AccessChain 745(dmat3v) 970 958
-             972:   39(float) Load 971
-             973:   39(float) FAdd 969 972
+             972:39(float64_t) Load 971
+             973:39(float64_t) FAdd 969 972
              974:     40(ptr) AccessChain 751(dmat4v) 25 962
-             975:   39(float) Load 974
-             976:   39(float) FAdd 973 975
+             975:39(float64_t) Load 974
+             976:39(float64_t) FAdd 973 975
              977:     40(ptr) AccessChain 757(dmat2x3v) 966 954
-             978:   39(float) Load 977
-             979:   39(float) FAdd 976 978
+             978:39(float64_t) Load 977
+             979:39(float64_t) FAdd 976 978
              980:     40(ptr) AccessChain 763(dmat3x2v) 966 954
-             981:   39(float) Load 980
-             982:   39(float) FAdd 979 981
+             981:39(float64_t) Load 980
+             982:39(float64_t) FAdd 979 981
              983:     40(ptr) AccessChain 781(dmat3x4v) 970 958
-             984:   39(float) Load 983
-             985:   39(float) FAdd 982 984
+             984:39(float64_t) Load 983
+             985:39(float64_t) FAdd 982 984
              986:     40(ptr) AccessChain 787(dmat4x3v) 970 958
-             987:   39(float) Load 986
-             988:   39(float) FAdd 985 987
+             987:39(float64_t) Load 986
+             988:39(float64_t) FAdd 985 987
              989:     40(ptr) AccessChain 769(dmat2x4v) 966 954
-             990:   39(float) Load 989
-             991:   39(float) FAdd 988 990
+             990:39(float64_t) Load 989
+             991:39(float64_t) FAdd 988 990
              992:     40(ptr) AccessChain 775(dmat4x2v) 966 954
-             993:   39(float) Load 992
-             994:   39(float) FAdd 991 993
+             993:39(float64_t) Load 992
+             994:39(float64_t) FAdd 991 993
              995:   428(bool) Load 430(boolv)
              997:   10(float) Select 995 996 21
-             998:   39(float) FConvert 997
-             999:   39(float) FAdd 994 998
-            1000:  437(bvec2) Load 439(bvec2v)
-            1001:   428(bool) CompositeExtract 1000 0
+             998:39(float64_t) FConvert 997
+             999:39(float64_t) FAdd 994 998
+            1000:    429(ptr) AccessChain 439(bvec2v) 33
+            1001:   428(bool) Load 1000
             1002:   10(float) Select 1001 996 21
-            1003:   39(float) FConvert 1002
-            1004:   39(float) FAdd 999 1003
-            1005:  446(bvec3) Load 448(bvec3v)
-            1006:   428(bool) CompositeExtract 1005 0
+            1003:39(float64_t) FConvert 1002
+            1004:39(float64_t) FAdd 999 1003
+            1005:    429(ptr) AccessChain 448(bvec3v) 33
+            1006:   428(bool) Load 1005
             1007:   10(float) Select 1006 996 21
-            1008:   39(float) FConvert 1007
-            1009:   39(float) FAdd 1004 1008
-            1010:  455(bvec4) Load 457(bvec4v)
-            1011:   428(bool) CompositeExtract 1010 0
+            1008:39(float64_t) FConvert 1007
+            1009:39(float64_t) FAdd 1004 1008
+            1010:    429(ptr) AccessChain 457(bvec4v) 33
+            1011:   428(bool) Load 1010
             1012:   10(float) Select 1011 996 21
-            1013:   39(float) FConvert 1012
-            1014:   39(float) FAdd 1009 1013
+            1013:39(float64_t) FConvert 1012
+            1014:39(float64_t) FAdd 1009 1013
             1015:   10(float) FConvert 1014
             1016:   11(fvec4) Load 13(outp)
             1017:   11(fvec4) VectorTimesScalar 1016 1015
diff --git a/Test/baseResults/spv.400.tesc.out b/Test/baseResults/spv.400.tesc.out
index 68b142e..ce7c3af 100644
--- a/Test/baseResults/spv.400.tesc.out
+++ b/Test/baseResults/spv.400.tesc.out
@@ -1,16 +1,14 @@
 spv.400.tesc
-Warning, version 400 is not yet complete; most version-specific features are present, but some are missing.
-
 // Module Version 10000
-// Generated by (magic number): 80001
-// Id's are bound by 93
+// Generated by (magic number): 80007
+// Id's are bound by 92
 
                               Capability Tessellation
                               Capability TessellationPointSize
                               Capability ClipDistance
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint TessellationControl 4  "main" 24 41 44 47 54 68 73 79 83 84 87 88 91 92
+                              EntryPoint TessellationControl 4  "main" 24 41 44 47 53 67 72 78 82 83 86 87 90 91
                               ExecutionMode 4 OutputVertices 4
                               Source GLSL 400
                               SourceExtension  "GL_ARB_separate_shader_objects"
@@ -34,17 +32,17 @@
                               MemberName 50(gl_PerVertex) 0  "gl_Position"
                               MemberName 50(gl_PerVertex) 1  "gl_PointSize"
                               MemberName 50(gl_PerVertex) 2  "gl_ClipDistance"
-                              Name 54  "gl_out"
-                              Name 68  "gl_TessLevelOuter"
-                              Name 73  "gl_TessLevelInner"
-                              Name 78  "outa"
-                              Name 79  "patchOut"
-                              Name 83  "inb"
-                              Name 84  "ind"
-                              Name 87  "ivla"
-                              Name 88  "ivlb"
-                              Name 91  "ovla"
-                              Name 92  "ovlb"
+                              Name 53  "gl_out"
+                              Name 67  "gl_TessLevelOuter"
+                              Name 72  "gl_TessLevelInner"
+                              Name 77  "outa"
+                              Name 78  "patchOut"
+                              Name 82  "inb"
+                              Name 83  "ind"
+                              Name 86  "ivla"
+                              Name 87  "ivlb"
+                              Name 90  "ovla"
+                              Name 91  "ovlb"
                               MemberDecorate 20(gl_PerVertex) 0 BuiltIn Position
                               MemberDecorate 20(gl_PerVertex) 1 BuiltIn PointSize
                               MemberDecorate 20(gl_PerVertex) 2 BuiltIn ClipDistance
@@ -56,20 +54,20 @@
                               MemberDecorate 50(gl_PerVertex) 1 BuiltIn PointSize
                               MemberDecorate 50(gl_PerVertex) 2 BuiltIn ClipDistance
                               Decorate 50(gl_PerVertex) Block
-                              Decorate 68(gl_TessLevelOuter) Patch
-                              Decorate 68(gl_TessLevelOuter) BuiltIn TessLevelOuter
-                              Decorate 73(gl_TessLevelInner) Patch
-                              Decorate 73(gl_TessLevelInner) BuiltIn TessLevelInner
-                              Decorate 79(patchOut) Patch
-                              Decorate 87(ivla) Location 3
-                              Decorate 88(ivlb) Location 4
-                              Decorate 91(ovla) Location 3
-                              Decorate 92(ovlb) Location 4
+                              Decorate 67(gl_TessLevelOuter) Patch
+                              Decorate 67(gl_TessLevelOuter) BuiltIn TessLevelOuter
+                              Decorate 72(gl_TessLevelInner) Patch
+                              Decorate 72(gl_TessLevelInner) BuiltIn TessLevelInner
+                              Decorate 78(patchOut) Patch
+                              Decorate 86(ivla) Location 3
+                              Decorate 87(ivlb) Location 4
+                              Decorate 90(ovla) Location 3
+                              Decorate 91(ovlb) Location 4
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 32 0
                7:      6(int) Constant 2
-               8:      6(int) Constant 1
+               8:      6(int) Constant 4
                9:      6(int) Constant 0
               10:             TypeInt 32 1
               11:             TypePointer Function 10(int)
@@ -96,37 +94,36 @@
 47(gl_InvocationID):     40(ptr) Variable Input
               49:             TypeArray 14(float) 7
 50(gl_PerVertex):             TypeStruct 15(fvec4) 14(float) 49
-              51:      6(int) Constant 4
-              52:             TypeArray 50(gl_PerVertex) 51
-              53:             TypePointer Output 52
-      54(gl_out):     53(ptr) Variable Output
-              57:             TypePointer Output 15(fvec4)
-              61:             TypePointer Output 14(float)
-              66:             TypeArray 14(float) 51
-              67:             TypePointer Output 66
-68(gl_TessLevelOuter):     67(ptr) Variable Output
-              69:     10(int) Constant 3
-              70:   14(float) Constant 1078774989
-              72:             TypePointer Output 49
-73(gl_TessLevelInner):     72(ptr) Variable Output
-              74:   14(float) Constant 1067869798
-              76:             TypeArray 10(int) 51
-              77:             TypePointer Private 76
-        78(outa):     77(ptr) Variable Private
-    79(patchOut):     57(ptr) Variable Output
-              80:             TypeVector 14(float) 2
-              81:             TypeArray 80(fvec2) 21
-              82:             TypePointer Input 81
-         83(inb):     82(ptr) Variable Input
-         84(ind):     82(ptr) Variable Input
-              85:             TypeArray 15(fvec4) 21
-              86:             TypePointer Input 85
-        87(ivla):     86(ptr) Variable Input
-        88(ivlb):     86(ptr) Variable Input
-              89:             TypeArray 15(fvec4) 51
-              90:             TypePointer Output 89
-        91(ovla):     90(ptr) Variable Output
-        92(ovlb):     90(ptr) Variable Output
+              51:             TypeArray 50(gl_PerVertex) 8
+              52:             TypePointer Output 51
+      53(gl_out):     52(ptr) Variable Output
+              56:             TypePointer Output 15(fvec4)
+              60:             TypePointer Output 14(float)
+              65:             TypeArray 14(float) 8
+              66:             TypePointer Output 65
+67(gl_TessLevelOuter):     66(ptr) Variable Output
+              68:     10(int) Constant 3
+              69:   14(float) Constant 1078774989
+              71:             TypePointer Output 49
+72(gl_TessLevelInner):     71(ptr) Variable Output
+              73:   14(float) Constant 1067869798
+              75:             TypeArray 10(int) 8
+              76:             TypePointer Private 75
+        77(outa):     76(ptr) Variable Private
+    78(patchOut):     56(ptr) Variable Output
+              79:             TypeVector 14(float) 2
+              80:             TypeArray 79(fvec2) 21
+              81:             TypePointer Input 80
+         82(inb):     81(ptr) Variable Input
+         83(ind):     81(ptr) Variable Input
+              84:             TypeArray 15(fvec4) 21
+              85:             TypePointer Input 84
+        86(ivla):     85(ptr) Variable Input
+        87(ivlb):     85(ptr) Variable Input
+              88:             TypeArray 15(fvec4) 8
+              89:             TypePointer Output 88
+        90(ovla):     89(ptr) Variable Output
+        91(ovlb):     89(ptr) Variable Output
          4(main):           2 Function None 3
                5:             Label
            12(a):     11(ptr) Variable Function
@@ -153,21 +150,21 @@
                               Store 43(pid) 45
               48:     10(int) Load 47(gl_InvocationID)
                               Store 46(iid) 48
-              55:     10(int) Load 47(gl_InvocationID)
-              56:   15(fvec4) Load 17(p)
-              58:     57(ptr) AccessChain 54(gl_out) 55 26
-                              Store 58 56
-              59:     10(int) Load 47(gl_InvocationID)
-              60:   14(float) Load 31(ps)
-              62:     61(ptr) AccessChain 54(gl_out) 59 25
-                              Store 62 60
-              63:     10(int) Load 47(gl_InvocationID)
-              64:   14(float) Load 35(cd)
-              65:     61(ptr) AccessChain 54(gl_out) 63 36 25
-                              Store 65 64
-              71:     61(ptr) AccessChain 68(gl_TessLevelOuter) 69
-                              Store 71 70
-              75:     61(ptr) AccessChain 73(gl_TessLevelInner) 25
-                              Store 75 74
+              54:     10(int) Load 47(gl_InvocationID)
+              55:   15(fvec4) Load 17(p)
+              57:     56(ptr) AccessChain 53(gl_out) 54 26
+                              Store 57 55
+              58:     10(int) Load 47(gl_InvocationID)
+              59:   14(float) Load 31(ps)
+              61:     60(ptr) AccessChain 53(gl_out) 58 25
+                              Store 61 59
+              62:     10(int) Load 47(gl_InvocationID)
+              63:   14(float) Load 35(cd)
+              64:     60(ptr) AccessChain 53(gl_out) 62 36 25
+                              Store 64 63
+              70:     60(ptr) AccessChain 67(gl_TessLevelOuter) 68
+                              Store 70 69
+              74:     60(ptr) AccessChain 72(gl_TessLevelInner) 25
+                              Store 74 73
                               Return
                               FunctionEnd
diff --git a/Test/baseResults/spv.400.tese.out b/Test/baseResults/spv.400.tese.out
old mode 100755
new mode 100644
index 0c62bed..43b6a91
--- a/Test/baseResults/spv.400.tese.out
+++ b/Test/baseResults/spv.400.tese.out
@@ -1,8 +1,6 @@
 spv.400.tese
-Warning, version 400 is not yet complete; most version-specific features are present, but some are missing.
-
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 96
 
                               Capability Tessellation
diff --git a/Test/baseResults/spv.420.geom.out b/Test/baseResults/spv.420.geom.out
index 6413d5a..74a4f0b 100644
--- a/Test/baseResults/spv.420.geom.out
+++ b/Test/baseResults/spv.420.geom.out
@@ -1,8 +1,6 @@
 spv.420.geom
-Warning, version 420 is not yet complete; most version-specific features are present, but some are missing.
-
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 72
 
                               Capability Geometry
diff --git a/Test/baseResults/spv.430.frag.out b/Test/baseResults/spv.430.frag.out
old mode 100755
new mode 100644
index abe2a58..330489f
--- a/Test/baseResults/spv.430.frag.out
+++ b/Test/baseResults/spv.430.frag.out
@@ -1,8 +1,6 @@
 spv.430.frag
-Warning, version 430 is not yet complete; most version-specific features are present, but some are missing.
-
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 24
 
                               Capability Shader
diff --git a/Test/baseResults/spv.430.vert.out b/Test/baseResults/spv.430.vert.out
old mode 100755
new mode 100644
index 8ea95d1..1cd9e61
--- a/Test/baseResults/spv.430.vert.out
+++ b/Test/baseResults/spv.430.vert.out
@@ -1,8 +1,6 @@
 spv.430.vert
-Warning, version 450 is not yet complete; most version-specific features are present, but some are missing.
-
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 66
 
                               Capability Shader
diff --git a/Test/baseResults/spv.450.geom.out b/Test/baseResults/spv.450.geom.out
old mode 100755
new mode 100644
index 85c6814..7713e54
--- a/Test/baseResults/spv.450.geom.out
+++ b/Test/baseResults/spv.450.geom.out
@@ -1,15 +1,14 @@
 spv.450.geom
-Warning, version 450 is not yet complete; most version-specific features are present, but some are missing.
-
 // Module Version 10000
-// Generated by (magic number): 80001
-// Id's are bound by 26
+// Generated by (magic number): 80007
+// Id's are bound by 31
 
                               Capability Geometry
                               Capability GeometryPointSize
+                              Capability MultiViewport
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Geometry 4  "main" 13 20
+                              EntryPoint Geometry 4  "main" 13 20 27 29
                               ExecutionMode 4 Triangles
                               ExecutionMode 4 Invocations 4
                               ExecutionMode 4 OutputLineStrip
@@ -28,6 +27,8 @@
                               MemberName 16(gl_PerVertex) 2  "gl_ClipDistance"
                               MemberName 16(gl_PerVertex) 3  "gl_CullDistance"
                               Name 20  "gl_in"
+                              Name 27  "gl_Layer"
+                              Name 29  "gl_ViewportIndex"
                               MemberDecorate 11(gl_PerVertex) 0 BuiltIn Position
                               MemberDecorate 11(gl_PerVertex) 1 BuiltIn PointSize
                               MemberDecorate 11(gl_PerVertex) 2 BuiltIn ClipDistance
@@ -38,6 +39,8 @@
                               MemberDecorate 16(gl_PerVertex) 2 BuiltIn ClipDistance
                               MemberDecorate 16(gl_PerVertex) 3 BuiltIn CullDistance
                               Decorate 16(gl_PerVertex) Block
+                              Decorate 27(gl_Layer) BuiltIn Layer
+                              Decorate 29(gl_ViewportIndex) BuiltIn ViewportIndex
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -57,11 +60,18 @@
        20(gl_in):     19(ptr) Variable Input
               21:             TypePointer Input 6(float)
               24:             TypePointer Output 6(float)
+              26:             TypePointer Output 14(int)
+    27(gl_Layer):     26(ptr) Variable Output
+              28:     14(int) Constant 2
+29(gl_ViewportIndex):     26(ptr) Variable Output
+              30:     14(int) Constant 3
          4(main):           2 Function None 3
                5:             Label
               22:     21(ptr) AccessChain 20(gl_in) 15 15
               23:    6(float) Load 22
               25:     24(ptr) AccessChain 13 15
                               Store 25 23
+                              Store 27(gl_Layer) 28
+                              Store 29(gl_ViewportIndex) 30
                               Return
                               FunctionEnd
diff --git a/Test/baseResults/spv.450.noRedecl.tesc.out b/Test/baseResults/spv.450.noRedecl.tesc.out
old mode 100755
new mode 100644
index e62aa38..b23061d
--- a/Test/baseResults/spv.450.noRedecl.tesc.out
+++ b/Test/baseResults/spv.450.noRedecl.tesc.out
@@ -1,8 +1,6 @@
 spv.450.noRedecl.tesc
-Warning, version 450 is not yet complete; most version-specific features are present, but some are missing.
-
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 21
 
                               Capability Tessellation
diff --git a/Test/baseResults/spv.450.tesc.out b/Test/baseResults/spv.450.tesc.out
old mode 100755
new mode 100644
index a0bf3dd..35653fd
--- a/Test/baseResults/spv.450.tesc.out
+++ b/Test/baseResults/spv.450.tesc.out
@@ -1,79 +1,120 @@
 spv.450.tesc
-Warning, version 450 is not yet complete; most version-specific features are present, but some are missing.
-
 // Module Version 10000
-// Generated by (magic number): 80001
-// Id's are bound by 23
+// Generated by (magic number): 80007
+// Id's are bound by 45
 
                               Capability Tessellation
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint TessellationControl 4  "main" 9 16 19 22
+                              EntryPoint TessellationControl 4  "main" 15 18 25 32 38 41 44
                               ExecutionMode 4 OutputVertices 4
                               Source GLSL 450
                               Name 4  "main"
-                              Name 9  "patchOut"
-                              Name 10  "S"
-                              MemberName 10(S) 0  "sMem1"
-                              MemberName 10(S) 1  "sMem2"
-                              Name 11  "TheBlock"
-                              MemberName 11(TheBlock) 0  "bMem1"
-                              MemberName 11(TheBlock) 1  "bMem2"
-                              MemberName 11(TheBlock) 2  "s"
-                              Name 16  "tcBlock"
-                              Name 17  "SingleBlock"
-                              MemberName 17(SingleBlock) 0  "bMem1"
-                              MemberName 17(SingleBlock) 1  "bMem2"
-                              MemberName 17(SingleBlock) 2  "s"
-                              Name 19  "singleBlock"
-                              Name 20  "bn"
-                              MemberName 20(bn) 0  "v1"
-                              MemberName 20(bn) 1  "v2"
-                              MemberName 20(bn) 2  "v3"
-                              Name 22  ""
-                              Decorate 9(patchOut) Patch
-                              MemberDecorate 11(TheBlock) 0 Patch
-                              MemberDecorate 11(TheBlock) 1 Patch
-                              MemberDecorate 11(TheBlock) 2 Patch
-                              Decorate 11(TheBlock) Block
-                              Decorate 16(tcBlock) Location 12
-                              MemberDecorate 17(SingleBlock) 0 Patch
-                              MemberDecorate 17(SingleBlock) 0 Location 2
-                              MemberDecorate 17(SingleBlock) 1 Patch
-                              MemberDecorate 17(SingleBlock) 1 Location 3
-                              MemberDecorate 17(SingleBlock) 2 Patch
-                              MemberDecorate 17(SingleBlock) 2 Location 4
-                              Decorate 17(SingleBlock) Block
-                              Decorate 19(singleBlock) Location 2
-                              MemberDecorate 20(bn) 0 Patch
-                              MemberDecorate 20(bn) 0 Location 20
-                              MemberDecorate 20(bn) 0 Component 0
-                              MemberDecorate 20(bn) 1 Patch
-                              MemberDecorate 20(bn) 1 Location 24
-                              MemberDecorate 20(bn) 2 Patch
-                              MemberDecorate 20(bn) 2 Location 25
-                              MemberDecorate 20(bn) 2 Component 0
-                              Decorate 20(bn) Block
+                              Name 11  "gl_PerVertex"
+                              MemberName 11(gl_PerVertex) 0  "gl_Position"
+                              MemberName 11(gl_PerVertex) 1  "gl_PointSize"
+                              MemberName 11(gl_PerVertex) 2  "gl_ClipDistance"
+                              MemberName 11(gl_PerVertex) 3  "gl_CullDistance"
+                              Name 15  "gl_out"
+                              Name 18  "gl_InvocationID"
+                              Name 21  "gl_PerVertex"
+                              MemberName 21(gl_PerVertex) 0  "gl_Position"
+                              MemberName 21(gl_PerVertex) 1  "gl_PointSize"
+                              MemberName 21(gl_PerVertex) 2  "gl_ClipDistance"
+                              MemberName 21(gl_PerVertex) 3  "gl_CullDistance"
+                              Name 25  "gl_in"
+                              Name 32  "patchOut"
+                              Name 33  "S"
+                              MemberName 33(S) 0  "sMem1"
+                              MemberName 33(S) 1  "sMem2"
+                              Name 34  "TheBlock"
+                              MemberName 34(TheBlock) 0  "bMem1"
+                              MemberName 34(TheBlock) 1  "bMem2"
+                              MemberName 34(TheBlock) 2  "s"
+                              Name 38  "tcBlock"
+                              Name 39  "SingleBlock"
+                              MemberName 39(SingleBlock) 0  "bMem1"
+                              MemberName 39(SingleBlock) 1  "bMem2"
+                              MemberName 39(SingleBlock) 2  "s"
+                              Name 41  "singleBlock"
+                              Name 42  "bn"
+                              MemberName 42(bn) 0  "v1"
+                              MemberName 42(bn) 1  "v2"
+                              MemberName 42(bn) 2  "v3"
+                              Name 44  ""
+                              MemberDecorate 11(gl_PerVertex) 0 BuiltIn Position
+                              MemberDecorate 11(gl_PerVertex) 1 BuiltIn PointSize
+                              MemberDecorate 11(gl_PerVertex) 2 BuiltIn ClipDistance
+                              MemberDecorate 11(gl_PerVertex) 3 BuiltIn CullDistance
+                              Decorate 11(gl_PerVertex) Block
+                              Decorate 18(gl_InvocationID) BuiltIn InvocationId
+                              MemberDecorate 21(gl_PerVertex) 0 BuiltIn Position
+                              MemberDecorate 21(gl_PerVertex) 1 BuiltIn PointSize
+                              MemberDecorate 21(gl_PerVertex) 2 BuiltIn ClipDistance
+                              MemberDecorate 21(gl_PerVertex) 3 BuiltIn CullDistance
+                              Decorate 21(gl_PerVertex) Block
+                              Decorate 32(patchOut) Patch
+                              Decorate 32(patchOut) Location 1
+                              MemberDecorate 34(TheBlock) 0 Patch
+                              MemberDecorate 34(TheBlock) 1 Patch
+                              MemberDecorate 34(TheBlock) 2 Patch
+                              Decorate 34(TheBlock) Block
+                              Decorate 38(tcBlock) Location 12
+                              MemberDecorate 39(SingleBlock) 0 Patch
+                              MemberDecorate 39(SingleBlock) 1 Patch
+                              MemberDecorate 39(SingleBlock) 2 Patch
+                              Decorate 39(SingleBlock) Block
+                              Decorate 41(singleBlock) Location 2
+                              MemberDecorate 42(bn) 0 Patch
+                              MemberDecorate 42(bn) 0 Location 20
+                              MemberDecorate 42(bn) 1 Patch
+                              MemberDecorate 42(bn) 1 Location 24
+                              MemberDecorate 42(bn) 2 Patch
+                              MemberDecorate 42(bn) 2 Location 25
+                              Decorate 42(bn) Block
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
                7:             TypeVector 6(float) 4
-               8:             TypePointer Output 7(fvec4)
-     9(patchOut):      8(ptr) Variable Output
-           10(S):             TypeStruct 6(float) 6(float)
-    11(TheBlock):             TypeStruct 6(float) 6(float) 10(S)
-              12:             TypeInt 32 0
-              13:     12(int) Constant 2
-              14:             TypeArray 11(TheBlock) 13
-              15:             TypePointer Output 14
-     16(tcBlock):     15(ptr) Variable Output
- 17(SingleBlock):             TypeStruct 6(float) 6(float) 10(S)
-              18:             TypePointer Output 17(SingleBlock)
- 19(singleBlock):     18(ptr) Variable Output
-          20(bn):             TypeStruct 7(fvec4) 7(fvec4) 7(fvec4)
-              21:             TypePointer Output 20(bn)
-              22:     21(ptr) Variable Output
+               8:             TypeInt 32 0
+               9:      8(int) Constant 1
+              10:             TypeArray 6(float) 9
+11(gl_PerVertex):             TypeStruct 7(fvec4) 6(float) 10 10
+              12:      8(int) Constant 4
+              13:             TypeArray 11(gl_PerVertex) 12
+              14:             TypePointer Output 13
+      15(gl_out):     14(ptr) Variable Output
+              16:             TypeInt 32 1
+              17:             TypePointer Input 16(int)
+18(gl_InvocationID):     17(ptr) Variable Input
+              20:     16(int) Constant 0
+21(gl_PerVertex):             TypeStruct 7(fvec4) 6(float) 10 10
+              22:      8(int) Constant 32
+              23:             TypeArray 21(gl_PerVertex) 22
+              24:             TypePointer Input 23
+       25(gl_in):     24(ptr) Variable Input
+              27:             TypePointer Input 7(fvec4)
+              30:             TypePointer Output 7(fvec4)
+    32(patchOut):     30(ptr) Variable Output
+           33(S):             TypeStruct 6(float) 6(float)
+    34(TheBlock):             TypeStruct 6(float) 6(float) 33(S)
+              35:      8(int) Constant 2
+              36:             TypeArray 34(TheBlock) 35
+              37:             TypePointer Output 36
+     38(tcBlock):     37(ptr) Variable Output
+ 39(SingleBlock):             TypeStruct 6(float) 6(float) 33(S)
+              40:             TypePointer Output 39(SingleBlock)
+ 41(singleBlock):     40(ptr) Variable Output
+          42(bn):             TypeStruct 7(fvec4) 7(fvec4) 7(fvec4)
+              43:             TypePointer Output 42(bn)
+              44:     43(ptr) Variable Output
          4(main):           2 Function None 3
                5:             Label
+              19:     16(int) Load 18(gl_InvocationID)
+              26:     16(int) Load 18(gl_InvocationID)
+              28:     27(ptr) AccessChain 25(gl_in) 26 20
+              29:    7(fvec4) Load 28
+              31:     30(ptr) AccessChain 15(gl_out) 19 20
+                              Store 31 29
                               Return
                               FunctionEnd
diff --git a/Test/baseResults/spv.460.comp.out b/Test/baseResults/spv.460.comp.out
new file mode 100644
index 0000000..6ebf49f
--- /dev/null
+++ b/Test/baseResults/spv.460.comp.out
@@ -0,0 +1,33 @@
+spv.460.comp
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 15
+
+                              Capability Shader
+                              Capability SubgroupVoteKHR
+                              Extension  "SPV_KHR_subgroup_vote"
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint GLCompute 4  "main"
+                              ExecutionMode 4 LocalSize 1 1 1
+                              Source GLSL 460
+                              Name 4  "main"
+                              Name 8  "b1"
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeBool
+               7:             TypePointer Function 6(bool)
+         4(main):           2 Function None 3
+               5:             Label
+           8(b1):      7(ptr) Variable Function
+               9:     6(bool) Load 8(b1)
+              10:     6(bool) SubgroupAnyKHR 9
+                              Store 8(b1) 10
+              11:     6(bool) Load 8(b1)
+              12:     6(bool) SubgroupAllKHR 11
+                              Store 8(b1) 12
+              13:     6(bool) Load 8(b1)
+              14:     6(bool) SubgroupAllEqualKHR 13
+                              Store 8(b1) 14
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.460.frag.out b/Test/baseResults/spv.460.frag.out
new file mode 100644
index 0000000..04393fb
--- /dev/null
+++ b/Test/baseResults/spv.460.frag.out
@@ -0,0 +1,51 @@
+spv.460.frag
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 32
+
+                              Capability Shader
+                              Capability AtomicStorage
+                              Capability AtomicStorageOps
+                              Extension  "SPV_KHR_shader_atomic_counter_ops"
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main"
+                              ExecutionMode 4 OriginLowerLeft
+                              Source GLSL 460
+                              Name 4  "main"
+                              Name 8  "aui"
+                              Name 10  "ui"
+                              Decorate 8(aui) Offset 0
+                              Decorate 8(aui) Binding 0
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeInt 32 0
+               7:             TypePointer AtomicCounter 6(int)
+          8(aui):      7(ptr) Variable AtomicCounter
+               9:             TypePointer Private 6(int)
+          10(ui):      9(ptr) Variable Private
+              12:      6(int) Constant 1
+              13:      6(int) Constant 0
+         4(main):           2 Function None 3
+               5:             Label
+              11:      6(int) Load 10(ui)
+              14:      6(int) AtomicIAdd 8(aui) 12 13 11
+              15:      6(int) Load 10(ui)
+              16:      6(int) AtomicISub 8(aui) 12 13 15
+              17:      6(int) Load 10(ui)
+              18:      6(int) AtomicUMin 8(aui) 12 13 17
+              19:      6(int) Load 10(ui)
+              20:      6(int) AtomicUMax 8(aui) 12 13 19
+              21:      6(int) Load 10(ui)
+              22:      6(int) AtomicAnd 8(aui) 12 13 21
+              23:      6(int) Load 10(ui)
+              24:      6(int) AtomicOr 8(aui) 12 13 23
+              25:      6(int) Load 10(ui)
+              26:      6(int) AtomicXor 8(aui) 12 13 25
+              27:      6(int) Load 10(ui)
+              28:      6(int) AtomicExchange 8(aui) 12 13 27
+              29:      6(int) Load 10(ui)
+              30:      6(int) Load 10(ui)
+              31:      6(int) AtomicCompareExchange 8(aui) 12 13 13 30 29
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.460.vert.out b/Test/baseResults/spv.460.vert.out
new file mode 100644
index 0000000..c2ef302
--- /dev/null
+++ b/Test/baseResults/spv.460.vert.out
@@ -0,0 +1,45 @@
+spv.460.vert
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 20
+
+                              Capability Shader
+                              Capability DrawParameters
+                              Extension  "SPV_KHR_shader_draw_parameters"
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Vertex 4  "main" 10 12 15 18 19
+                              Source GLSL 460
+                              Name 4  "main"
+                              Name 8  "a"
+                              Name 10  "gl_BaseVertex"
+                              Name 12  "gl_BaseInstance"
+                              Name 15  "gl_DrawID"
+                              Name 18  "gl_VertexID"
+                              Name 19  "gl_InstanceID"
+                              Decorate 10(gl_BaseVertex) BuiltIn BaseVertex
+                              Decorate 12(gl_BaseInstance) BuiltIn BaseInstance
+                              Decorate 15(gl_DrawID) BuiltIn DrawIndex
+                              Decorate 18(gl_VertexID) BuiltIn VertexId
+                              Decorate 19(gl_InstanceID) BuiltIn InstanceId
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeInt 32 1
+               7:             TypePointer Function 6(int)
+               9:             TypePointer Input 6(int)
+10(gl_BaseVertex):      9(ptr) Variable Input
+12(gl_BaseInstance):      9(ptr) Variable Input
+   15(gl_DrawID):      9(ptr) Variable Input
+ 18(gl_VertexID):      9(ptr) Variable Input
+19(gl_InstanceID):      9(ptr) Variable Input
+         4(main):           2 Function None 3
+               5:             Label
+            8(a):      7(ptr) Variable Function
+              11:      6(int) Load 10(gl_BaseVertex)
+              13:      6(int) Load 12(gl_BaseInstance)
+              14:      6(int) IAdd 11 13
+              16:      6(int) Load 15(gl_DrawID)
+              17:      6(int) IAdd 14 16
+                              Store 8(a) 17
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.8bitstorage-int.frag.out b/Test/baseResults/spv.8bitstorage-int.frag.out
new file mode 100644
index 0000000..a0af75a
--- /dev/null
+++ b/Test/baseResults/spv.8bitstorage-int.frag.out
@@ -0,0 +1,334 @@
+spv.8bitstorage-int.frag
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 172
+
+                              Capability Shader
+                              Capability CapabilityUniformAndStorageBuffer8BitAccess
+                              Extension  "SPV_KHR_8bit_storage"
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main"
+                              ExecutionMode 4 OriginUpperLeft
+                              Source GLSL 450
+                              SourceExtension  "GL_EXT_shader_8bit_storage"
+                              Name 4  "main"
+                              Name 12  "S"
+                              MemberName 12(S) 0  "x"
+                              MemberName 12(S) 1  "y"
+                              MemberName 12(S) 2  "z"
+                              Name 17  "B2"
+                              MemberName 17(B2) 0  "o"
+                              MemberName 17(B2) 1  "p"
+                              MemberName 17(B2) 2  "q"
+                              MemberName 17(B2) 3  "r"
+                              MemberName 17(B2) 4  "u"
+                              MemberName 17(B2) 5  "v"
+                              MemberName 17(B2) 6  "x"
+                              MemberName 17(B2) 7  "w"
+                              Name 19  "b2"
+                              Name 23  "S"
+                              MemberName 23(S) 0  "x"
+                              MemberName 23(S) 1  "y"
+                              MemberName 23(S) 2  "z"
+                              Name 25  "B1"
+                              MemberName 25(B1) 0  "a"
+                              MemberName 25(B1) 1  "b"
+                              MemberName 25(B1) 2  "c"
+                              MemberName 25(B1) 3  "d"
+                              MemberName 25(B1) 4  "g"
+                              MemberName 25(B1) 5  "h"
+                              MemberName 25(B1) 6  "j"
+                              Name 27  "b1"
+                              Name 45  "S"
+                              MemberName 45(S) 0  "x"
+                              MemberName 45(S) 1  "y"
+                              MemberName 45(S) 2  "z"
+                              Name 49  "B5"
+                              MemberName 49(B5) 0  "o"
+                              MemberName 49(B5) 1  "p"
+                              MemberName 49(B5) 2  "q"
+                              MemberName 49(B5) 3  "r"
+                              MemberName 49(B5) 4  "u"
+                              MemberName 49(B5) 5  "v"
+                              MemberName 49(B5) 6  "x"
+                              MemberName 49(B5) 7  "w"
+                              Name 51  "b5"
+                              Name 69  "x0"
+                              Name 75  "x1"
+                              Name 88  "S2"
+                              MemberName 88(S2) 0  "x"
+                              MemberName 88(S2) 1  "y"
+                              MemberName 88(S2) 2  "z"
+                              Name 89  "S3"
+                              MemberName 89(S3) 0  "x"
+                              Name 90  "B4"
+                              MemberName 90(B4) 0  "x"
+                              MemberName 90(B4) 1  "y"
+                              Name 92  "b4"
+                              Name 93  "S2"
+                              MemberName 93(S2) 0  "x"
+                              MemberName 93(S2) 1  "y"
+                              MemberName 93(S2) 2  "z"
+                              Name 94  "B3"
+                              MemberName 94(B3) 0  "x"
+                              Name 96  "b3"
+                              Name 113  "v3"
+                              Name 135  "u3"
+                              Decorate 11 ArrayStride 1
+                              MemberDecorate 12(S) 0 Offset 0
+                              MemberDecorate 12(S) 1 Offset 2
+                              MemberDecorate 12(S) 2 Offset 4
+                              Decorate 13 ArrayStride 8
+                              Decorate 15 ArrayStride 2
+                              Decorate 16 ArrayStride 1
+                              MemberDecorate 17(B2) 0 Offset 0
+                              MemberDecorate 17(B2) 1 Offset 2
+                              MemberDecorate 17(B2) 2 Offset 4
+                              MemberDecorate 17(B2) 3 Offset 7
+                              MemberDecorate 17(B2) 4 Offset 12
+                              MemberDecorate 17(B2) 5 Offset 20
+                              MemberDecorate 17(B2) 6 Offset 36
+                              MemberDecorate 17(B2) 7 Offset 236
+                              Decorate 17(B2) BufferBlock
+                              Decorate 19(b2) DescriptorSet 0
+                              Decorate 22 ArrayStride 16
+                              MemberDecorate 23(S) 0 Offset 0
+                              MemberDecorate 23(S) 1 Offset 2
+                              MemberDecorate 23(S) 2 Offset 4
+                              Decorate 24 ArrayStride 16
+                              MemberDecorate 25(B1) 0 Offset 0
+                              MemberDecorate 25(B1) 1 Offset 2
+                              MemberDecorate 25(B1) 2 Offset 4
+                              MemberDecorate 25(B1) 3 Offset 16
+                              MemberDecorate 25(B1) 4 Offset 48
+                              MemberDecorate 25(B1) 5 Offset 64
+                              MemberDecorate 25(B1) 6 Offset 96
+                              Decorate 25(B1) Block
+                              Decorate 27(b1) DescriptorSet 0
+                              Decorate 44 ArrayStride 16
+                              MemberDecorate 45(S) 0 Offset 0
+                              MemberDecorate 45(S) 1 Offset 2
+                              MemberDecorate 45(S) 2 Offset 4
+                              Decorate 46 ArrayStride 16
+                              Decorate 47 ArrayStride 16
+                              Decorate 48 ArrayStride 16
+                              MemberDecorate 49(B5) 0 Offset 0
+                              MemberDecorate 49(B5) 1 Offset 2
+                              MemberDecorate 49(B5) 2 Offset 4
+                              MemberDecorate 49(B5) 3 Offset 16
+                              MemberDecorate 49(B5) 4 Offset 48
+                              MemberDecorate 49(B5) 5 Offset 64
+                              MemberDecorate 49(B5) 6 Offset 96
+                              MemberDecorate 49(B5) 7 Offset 1696
+                              Decorate 49(B5) Block
+                              Decorate 51(b5) DescriptorSet 0
+                              MemberDecorate 88(S2) 0 ColMajor
+                              MemberDecorate 88(S2) 0 Offset 0
+                              MemberDecorate 88(S2) 0 MatrixStride 16
+                              MemberDecorate 88(S2) 1 Offset 64
+                              MemberDecorate 88(S2) 2 Offset 68
+                              MemberDecorate 89(S3) 0 Offset 0
+                              MemberDecorate 90(B4) 0 Offset 0
+                              MemberDecorate 90(B4) 1 Offset 80
+                              Decorate 90(B4) BufferBlock
+                              Decorate 92(b4) DescriptorSet 0
+                              MemberDecorate 93(S2) 0 RowMajor
+                              MemberDecorate 93(S2) 0 Offset 0
+                              MemberDecorate 93(S2) 0 MatrixStride 16
+                              MemberDecorate 93(S2) 1 Offset 64
+                              MemberDecorate 93(S2) 2 Offset 68
+                              MemberDecorate 94(B3) 0 Offset 0
+                              Decorate 94(B3) BufferBlock
+                              Decorate 96(b3) DescriptorSet 0
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeInt 8 1
+               7:             TypeVector 6(int8_t) 2
+               8:             TypeVector 6(int8_t) 3
+               9:             TypeInt 32 0
+              10:      9(int) Constant 2
+              11:             TypeArray 6(int8_t) 10
+           12(S):             TypeStruct 6(int8_t) 7(i8vec2) 8(i8vec3)
+              13:             TypeArray 12(S) 10
+              14:      9(int) Constant 100
+              15:             TypeArray 7(i8vec2) 14
+              16:             TypeRuntimeArray 6(int8_t)
+          17(B2):             TypeStruct 6(int8_t) 7(i8vec2) 8(i8vec3) 11 12(S) 13 15 16
+              18:             TypePointer Uniform 17(B2)
+          19(b2):     18(ptr) Variable Uniform
+              20:             TypeInt 32 1
+              21:     20(int) Constant 0
+              22:             TypeArray 6(int8_t) 10
+           23(S):             TypeStruct 6(int8_t) 7(i8vec2) 8(i8vec3)
+              24:             TypeArray 23(S) 10
+          25(B1):             TypeStruct 6(int8_t) 7(i8vec2) 8(i8vec3) 22 23(S) 24 20(int)
+              26:             TypePointer Uniform 25(B1)
+          27(b1):     26(ptr) Variable Uniform
+              28:             TypePointer Uniform 6(int8_t)
+              32:     20(int) Constant 1
+              33:     20(int) Constant 2
+              34:             TypePointer Uniform 8(i8vec3)
+              37:             TypeVector 20(int) 3
+              39:             TypeVector 20(int) 2
+              42:             TypePointer Uniform 7(i8vec2)
+              44:             TypeArray 6(int8_t) 10
+           45(S):             TypeStruct 6(int8_t) 7(i8vec2) 8(i8vec3)
+              46:             TypeArray 45(S) 10
+              47:             TypeArray 7(i8vec2) 14
+              48:             TypeArray 6(int8_t) 14
+          49(B5):             TypeStruct 6(int8_t) 7(i8vec2) 8(i8vec3) 44 45(S) 46 47 48
+              50:             TypePointer Uniform 49(B5)
+          51(b5):     50(ptr) Variable Uniform
+              58:     20(int) Constant 3
+              68:             TypePointer Function 20(int)
+              73:             TypeVector 20(int) 4
+              74:             TypePointer Function 73(ivec4)
+              85:             TypeFloat 32
+              86:             TypeVector 85(float) 4
+              87:             TypeMatrix 86(fvec4) 4
+          88(S2):             TypeStruct 87 6(int8_t) 20(int)
+          89(S3):             TypeStruct 88(S2)
+          90(B4):             TypeStruct 88(S2) 89(S3)
+              91:             TypePointer Uniform 90(B4)
+          92(b4):     91(ptr) Variable Uniform
+          93(S2):             TypeStruct 87 6(int8_t) 20(int)
+          94(B3):             TypeStruct 93(S2)
+              95:             TypePointer Uniform 94(B3)
+          96(b3):     95(ptr) Variable Uniform
+              97:             TypePointer Uniform 87
+             104:      9(int) Constant 0
+             108:     20(int) Constant 5
+             112:             TypePointer Function 37(ivec3)
+             114:     20(int) Constant 7
+             115:     20(int) Constant 6
+             116:             TypePointer Uniform 20(int)
+             166:   6(int8_t) Constant 1
+             167:   6(int8_t) Constant 2
+             168:   7(i8vec2) ConstantComposite 166 167
+             170:   6(int8_t) Constant 3
+         4(main):           2 Function None 3
+               5:             Label
+          69(x0):     68(ptr) Variable Function
+          75(x1):     74(ptr) Variable Function
+         113(v3):    112(ptr) Variable Function
+         135(u3):    112(ptr) Variable Function
+              29:     28(ptr) AccessChain 27(b1) 21
+              30:   6(int8_t) Load 29
+              31:     28(ptr) AccessChain 19(b2) 21
+                              Store 31 30
+              35:     34(ptr) AccessChain 19(b2) 33
+              36:   8(i8vec3) Load 35
+              38:   37(ivec3) SConvert 36
+              40:   39(ivec2) VectorShuffle 38 38 0 1
+              41:   7(i8vec2) SConvert 40
+              43:     42(ptr) AccessChain 19(b2) 32
+                              Store 43 41
+              52:     34(ptr) AccessChain 51(b5) 33
+              53:   8(i8vec3) Load 52
+              54:   37(ivec3) SConvert 53
+              55:   39(ivec2) VectorShuffle 54 54 0 1
+              56:   7(i8vec2) SConvert 55
+              57:     42(ptr) AccessChain 19(b2) 32
+                              Store 57 56
+              59:     28(ptr) AccessChain 19(b2) 58 21
+              60:   6(int8_t) Load 59
+              61:     28(ptr) AccessChain 19(b2) 58 21
+                              Store 61 60
+              62:     28(ptr) AccessChain 51(b5) 58 32
+              63:   6(int8_t) Load 62
+              64:     28(ptr) AccessChain 19(b2) 58 32
+                              Store 64 63
+              65:     42(ptr) AccessChain 19(b2) 32
+              66:   7(i8vec2) Load 65
+              67:     42(ptr) AccessChain 19(b2) 32
+                              Store 67 66
+              70:     28(ptr) AccessChain 27(b1) 21
+              71:   6(int8_t) Load 70
+              72:     20(int) SConvert 71
+                              Store 69(x0) 72
+              76:     28(ptr) AccessChain 27(b1) 21
+              77:   6(int8_t) Load 76
+              78:     20(int) SConvert 77
+              79:     42(ptr) AccessChain 19(b2) 32
+              80:   7(i8vec2) Load 79
+              81:   39(ivec2) SConvert 80
+              82:     20(int) CompositeExtract 81 0
+              83:     20(int) CompositeExtract 81 1
+              84:   73(ivec4) CompositeConstruct 78 82 83 32
+                              Store 75(x1) 84
+              98:     97(ptr) AccessChain 96(b3) 21 21
+              99:          87 Load 98
+             100:     97(ptr) AccessChain 92(b4) 21 21
+                              Store 100 99
+             101:     42(ptr) AccessChain 19(b2) 32
+             102:   7(i8vec2) Load 101
+             103:   39(ivec2) SConvert 102
+             105:     20(int) CompositeExtract 103 0
+             106:   6(int8_t) SConvert 105
+             107:     28(ptr) AccessChain 19(b2) 21
+                              Store 107 106
+             109:     42(ptr) AccessChain 19(b2) 108 32 32
+             110:   7(i8vec2) Load 109
+             111:     42(ptr) AccessChain 19(b2) 32
+                              Store 111 110
+             117:    116(ptr) AccessChain 27(b1) 115
+             118:     20(int) Load 117
+             119:     28(ptr) AccessChain 19(b2) 114 118
+             120:   6(int8_t) Load 119
+             121:     20(int) SConvert 120
+             122:    116(ptr) AccessChain 27(b1) 115
+             123:     20(int) Load 122
+             124:     20(int) IAdd 123 32
+             125:     28(ptr) AccessChain 19(b2) 114 124
+             126:   6(int8_t) Load 125
+             127:     20(int) SConvert 126
+             128:    116(ptr) AccessChain 27(b1) 115
+             129:     20(int) Load 128
+             130:     20(int) IAdd 129 33
+             131:     28(ptr) AccessChain 19(b2) 114 130
+             132:   6(int8_t) Load 131
+             133:     20(int) SConvert 132
+             134:   37(ivec3) CompositeConstruct 121 127 133
+                              Store 113(v3) 134
+             136:    116(ptr) AccessChain 27(b1) 115
+             137:     20(int) Load 136
+             138:     28(ptr) AccessChain 51(b5) 114 137
+             139:   6(int8_t) Load 138
+             140:     20(int) SConvert 139
+             141:    116(ptr) AccessChain 27(b1) 115
+             142:     20(int) Load 141
+             143:     20(int) IAdd 142 32
+             144:     28(ptr) AccessChain 51(b5) 114 143
+             145:   6(int8_t) Load 144
+             146:     20(int) SConvert 145
+             147:    116(ptr) AccessChain 27(b1) 115
+             148:     20(int) Load 147
+             149:     20(int) IAdd 148 33
+             150:     28(ptr) AccessChain 51(b5) 114 149
+             151:   6(int8_t) Load 150
+             152:     20(int) SConvert 151
+             153:   37(ivec3) CompositeConstruct 140 146 152
+                              Store 135(u3) 153
+             154:     42(ptr) AccessChain 19(b2) 115 21
+             155:   7(i8vec2) Load 154
+             156:     42(ptr) AccessChain 19(b2) 115 21
+                              Store 156 155
+             157:     42(ptr) AccessChain 51(b5) 115 32
+             158:   7(i8vec2) Load 157
+             159:     42(ptr) AccessChain 19(b2) 115 32
+                              Store 159 158
+             160:     28(ptr) AccessChain 27(b1) 21
+             161:   6(int8_t) Load 160
+             162:     28(ptr) AccessChain 19(b2) 32 104
+                              Store 162 161
+             163:     28(ptr) AccessChain 19(b2) 32 104
+             164:   6(int8_t) Load 163
+             165:     28(ptr) AccessChain 19(b2) 21
+                              Store 165 164
+             169:     42(ptr) AccessChain 19(b2) 32
+                              Store 169 168
+             171:     28(ptr) AccessChain 19(b2) 21
+                              Store 171 170
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.8bitstorage-ssbo.vert.out b/Test/baseResults/spv.8bitstorage-ssbo.vert.out
new file mode 100644
index 0000000..1e23378
--- /dev/null
+++ b/Test/baseResults/spv.8bitstorage-ssbo.vert.out
@@ -0,0 +1,56 @@
+spv.8bitstorage-ssbo.vert
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 28
+
+                              Capability Shader
+                              Capability CapabilityUniformAndStorageBuffer8BitAccess
+                              Extension  "SPV_KHR_8bit_storage"
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Vertex 4  "main" 9 18
+                              Source GLSL 450
+                              SourceExtension  "GL_EXT_shader_8bit_storage"
+                              Name 4  "main"
+                              Name 9  "color"
+                              Name 12  "Vertices"
+                              MemberName 12(Vertices) 0  "vertices"
+                              Name 14  ""
+                              Name 18  "gl_VertexIndex"
+                              Decorate 9(color) Location 0
+                              Decorate 11 ArrayStride 1
+                              MemberDecorate 12(Vertices) 0 NonWritable
+                              MemberDecorate 12(Vertices) 0 Offset 0
+                              Decorate 12(Vertices) BufferBlock
+                              Decorate 14 DescriptorSet 0
+                              Decorate 14 Binding 0
+                              Decorate 18(gl_VertexIndex) BuiltIn VertexIndex
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+               8:             TypePointer Output 7(fvec4)
+        9(color):      8(ptr) Variable Output
+              10:             TypeInt 8 0
+              11:             TypeRuntimeArray 10(int8_t)
+    12(Vertices):             TypeStruct 11
+              13:             TypePointer Uniform 12(Vertices)
+              14:     13(ptr) Variable Uniform
+              15:             TypeInt 32 1
+              16:     15(int) Constant 0
+              17:             TypePointer Input 15(int)
+18(gl_VertexIndex):     17(ptr) Variable Input
+              20:             TypePointer Uniform 10(int8_t)
+              23:             TypeInt 32 0
+         4(main):           2 Function None 3
+               5:             Label
+              19:     15(int) Load 18(gl_VertexIndex)
+              21:     20(ptr) AccessChain 14 16 19
+              22:  10(int8_t) Load 21
+              24:     23(int) UConvert 22
+              25:     15(int) Bitcast 24
+              26:    6(float) ConvertSToF 25
+              27:    7(fvec4) CompositeConstruct 26 26 26 26
+                              Store 9(color) 27
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.8bitstorage-ubo.vert.out b/Test/baseResults/spv.8bitstorage-ubo.vert.out
new file mode 100644
index 0000000..a6a05cf
--- /dev/null
+++ b/Test/baseResults/spv.8bitstorage-ubo.vert.out
@@ -0,0 +1,56 @@
+spv.8bitstorage-ubo.vert
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 29
+
+                              Capability Shader
+                              Capability CapabilityUniformAndStorageBuffer8BitAccess
+                              Extension  "SPV_KHR_8bit_storage"
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Vertex 4  "main" 9 20
+                              Source GLSL 450
+                              SourceExtension  "GL_EXT_shader_8bit_storage"
+                              Name 4  "main"
+                              Name 9  "color"
+                              Name 14  "Vertices"
+                              MemberName 14(Vertices) 0  "vertices"
+                              Name 16  ""
+                              Name 20  "gl_VertexIndex"
+                              Decorate 9(color) Location 0
+                              Decorate 13 ArrayStride 16
+                              MemberDecorate 14(Vertices) 0 Offset 0
+                              Decorate 14(Vertices) Block
+                              Decorate 16 DescriptorSet 0
+                              Decorate 16 Binding 0
+                              Decorate 20(gl_VertexIndex) BuiltIn VertexIndex
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+               8:             TypePointer Output 7(fvec4)
+        9(color):      8(ptr) Variable Output
+              10:             TypeInt 8 0
+              11:             TypeInt 32 0
+              12:     11(int) Constant 512
+              13:             TypeArray 10(int8_t) 12
+    14(Vertices):             TypeStruct 13
+              15:             TypePointer Uniform 14(Vertices)
+              16:     15(ptr) Variable Uniform
+              17:             TypeInt 32 1
+              18:     17(int) Constant 0
+              19:             TypePointer Input 17(int)
+20(gl_VertexIndex):     19(ptr) Variable Input
+              22:             TypePointer Uniform 10(int8_t)
+         4(main):           2 Function None 3
+               5:             Label
+              21:     17(int) Load 20(gl_VertexIndex)
+              23:     22(ptr) AccessChain 16 18 21
+              24:  10(int8_t) Load 23
+              25:     11(int) UConvert 24
+              26:     17(int) Bitcast 25
+              27:    6(float) ConvertSToF 26
+              28:    7(fvec4) CompositeConstruct 27 27 27 27
+                              Store 9(color) 28
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.8bitstorage-uint.frag.out b/Test/baseResults/spv.8bitstorage-uint.frag.out
new file mode 100644
index 0000000..12c390a
--- /dev/null
+++ b/Test/baseResults/spv.8bitstorage-uint.frag.out
@@ -0,0 +1,335 @@
+spv.8bitstorage-uint.frag
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 173
+
+                              Capability Shader
+                              Capability CapabilityUniformAndStorageBuffer8BitAccess
+                              Extension  "SPV_KHR_8bit_storage"
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main"
+                              ExecutionMode 4 OriginUpperLeft
+                              Source GLSL 450
+                              SourceExtension  "GL_EXT_shader_8bit_storage"
+                              Name 4  "main"
+                              Name 12  "S"
+                              MemberName 12(S) 0  "x"
+                              MemberName 12(S) 1  "y"
+                              MemberName 12(S) 2  "z"
+                              Name 17  "B2"
+                              MemberName 17(B2) 0  "o"
+                              MemberName 17(B2) 1  "p"
+                              MemberName 17(B2) 2  "q"
+                              MemberName 17(B2) 3  "r"
+                              MemberName 17(B2) 4  "u"
+                              MemberName 17(B2) 5  "v"
+                              MemberName 17(B2) 6  "x"
+                              MemberName 17(B2) 7  "w"
+                              Name 19  "b2"
+                              Name 23  "S"
+                              MemberName 23(S) 0  "x"
+                              MemberName 23(S) 1  "y"
+                              MemberName 23(S) 2  "z"
+                              Name 25  "B1"
+                              MemberName 25(B1) 0  "a"
+                              MemberName 25(B1) 1  "b"
+                              MemberName 25(B1) 2  "c"
+                              MemberName 25(B1) 3  "d"
+                              MemberName 25(B1) 4  "g"
+                              MemberName 25(B1) 5  "h"
+                              MemberName 25(B1) 6  "j"
+                              Name 27  "b1"
+                              Name 45  "S"
+                              MemberName 45(S) 0  "x"
+                              MemberName 45(S) 1  "y"
+                              MemberName 45(S) 2  "z"
+                              Name 49  "B5"
+                              MemberName 49(B5) 0  "o"
+                              MemberName 49(B5) 1  "p"
+                              MemberName 49(B5) 2  "q"
+                              MemberName 49(B5) 3  "r"
+                              MemberName 49(B5) 4  "u"
+                              MemberName 49(B5) 5  "v"
+                              MemberName 49(B5) 6  "x"
+                              MemberName 49(B5) 7  "w"
+                              Name 51  "b5"
+                              Name 69  "x0"
+                              Name 75  "x1"
+                              Name 89  "S2"
+                              MemberName 89(S2) 0  "x"
+                              MemberName 89(S2) 1  "y"
+                              MemberName 89(S2) 2  "z"
+                              Name 90  "S3"
+                              MemberName 90(S3) 0  "x"
+                              Name 91  "B4"
+                              MemberName 91(B4) 0  "x"
+                              MemberName 91(B4) 1  "y"
+                              Name 93  "b4"
+                              Name 94  "S2"
+                              MemberName 94(S2) 0  "x"
+                              MemberName 94(S2) 1  "y"
+                              MemberName 94(S2) 2  "z"
+                              Name 95  "B3"
+                              MemberName 95(B3) 0  "x"
+                              Name 97  "b3"
+                              Name 114  "v3"
+                              Name 136  "u3"
+                              Decorate 11 ArrayStride 1
+                              MemberDecorate 12(S) 0 Offset 0
+                              MemberDecorate 12(S) 1 Offset 2
+                              MemberDecorate 12(S) 2 Offset 4
+                              Decorate 13 ArrayStride 8
+                              Decorate 15 ArrayStride 2
+                              Decorate 16 ArrayStride 1
+                              MemberDecorate 17(B2) 0 Offset 0
+                              MemberDecorate 17(B2) 1 Offset 2
+                              MemberDecorate 17(B2) 2 Offset 4
+                              MemberDecorate 17(B2) 3 Offset 7
+                              MemberDecorate 17(B2) 4 Offset 12
+                              MemberDecorate 17(B2) 5 Offset 20
+                              MemberDecorate 17(B2) 6 Offset 36
+                              MemberDecorate 17(B2) 7 Offset 236
+                              Decorate 17(B2) BufferBlock
+                              Decorate 19(b2) DescriptorSet 0
+                              Decorate 22 ArrayStride 16
+                              MemberDecorate 23(S) 0 Offset 0
+                              MemberDecorate 23(S) 1 Offset 2
+                              MemberDecorate 23(S) 2 Offset 4
+                              Decorate 24 ArrayStride 16
+                              MemberDecorate 25(B1) 0 Offset 0
+                              MemberDecorate 25(B1) 1 Offset 2
+                              MemberDecorate 25(B1) 2 Offset 4
+                              MemberDecorate 25(B1) 3 Offset 16
+                              MemberDecorate 25(B1) 4 Offset 48
+                              MemberDecorate 25(B1) 5 Offset 64
+                              MemberDecorate 25(B1) 6 Offset 96
+                              Decorate 25(B1) Block
+                              Decorate 27(b1) DescriptorSet 0
+                              Decorate 44 ArrayStride 16
+                              MemberDecorate 45(S) 0 Offset 0
+                              MemberDecorate 45(S) 1 Offset 2
+                              MemberDecorate 45(S) 2 Offset 4
+                              Decorate 46 ArrayStride 16
+                              Decorate 47 ArrayStride 16
+                              Decorate 48 ArrayStride 16
+                              MemberDecorate 49(B5) 0 Offset 0
+                              MemberDecorate 49(B5) 1 Offset 2
+                              MemberDecorate 49(B5) 2 Offset 4
+                              MemberDecorate 49(B5) 3 Offset 16
+                              MemberDecorate 49(B5) 4 Offset 48
+                              MemberDecorate 49(B5) 5 Offset 64
+                              MemberDecorate 49(B5) 6 Offset 96
+                              MemberDecorate 49(B5) 7 Offset 1696
+                              Decorate 49(B5) Block
+                              Decorate 51(b5) DescriptorSet 0
+                              MemberDecorate 89(S2) 0 ColMajor
+                              MemberDecorate 89(S2) 0 Offset 0
+                              MemberDecorate 89(S2) 0 MatrixStride 16
+                              MemberDecorate 89(S2) 1 Offset 64
+                              MemberDecorate 89(S2) 2 Offset 68
+                              MemberDecorate 90(S3) 0 Offset 0
+                              MemberDecorate 91(B4) 0 Offset 0
+                              MemberDecorate 91(B4) 1 Offset 80
+                              Decorate 91(B4) BufferBlock
+                              Decorate 93(b4) DescriptorSet 0
+                              MemberDecorate 94(S2) 0 RowMajor
+                              MemberDecorate 94(S2) 0 Offset 0
+                              MemberDecorate 94(S2) 0 MatrixStride 16
+                              MemberDecorate 94(S2) 1 Offset 64
+                              MemberDecorate 94(S2) 2 Offset 68
+                              MemberDecorate 95(B3) 0 Offset 0
+                              Decorate 95(B3) BufferBlock
+                              Decorate 97(b3) DescriptorSet 0
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeInt 8 0
+               7:             TypeVector 6(int8_t) 2
+               8:             TypeVector 6(int8_t) 3
+               9:             TypeInt 32 0
+              10:      9(int) Constant 2
+              11:             TypeArray 6(int8_t) 10
+           12(S):             TypeStruct 6(int8_t) 7(i8vec2) 8(i8vec3)
+              13:             TypeArray 12(S) 10
+              14:      9(int) Constant 100
+              15:             TypeArray 7(i8vec2) 14
+              16:             TypeRuntimeArray 6(int8_t)
+          17(B2):             TypeStruct 6(int8_t) 7(i8vec2) 8(i8vec3) 11 12(S) 13 15 16
+              18:             TypePointer Uniform 17(B2)
+          19(b2):     18(ptr) Variable Uniform
+              20:             TypeInt 32 1
+              21:     20(int) Constant 0
+              22:             TypeArray 6(int8_t) 10
+           23(S):             TypeStruct 6(int8_t) 7(i8vec2) 8(i8vec3)
+              24:             TypeArray 23(S) 10
+          25(B1):             TypeStruct 6(int8_t) 7(i8vec2) 8(i8vec3) 22 23(S) 24 9(int)
+              26:             TypePointer Uniform 25(B1)
+          27(b1):     26(ptr) Variable Uniform
+              28:             TypePointer Uniform 6(int8_t)
+              32:     20(int) Constant 1
+              33:     20(int) Constant 2
+              34:             TypePointer Uniform 8(i8vec3)
+              37:             TypeVector 9(int) 3
+              39:             TypeVector 9(int) 2
+              42:             TypePointer Uniform 7(i8vec2)
+              44:             TypeArray 6(int8_t) 10
+           45(S):             TypeStruct 6(int8_t) 7(i8vec2) 8(i8vec3)
+              46:             TypeArray 45(S) 10
+              47:             TypeArray 7(i8vec2) 14
+              48:             TypeArray 6(int8_t) 14
+          49(B5):             TypeStruct 6(int8_t) 7(i8vec2) 8(i8vec3) 44 45(S) 46 47 48
+              50:             TypePointer Uniform 49(B5)
+          51(b5):     50(ptr) Variable Uniform
+              58:     20(int) Constant 3
+              68:             TypePointer Function 9(int)
+              73:             TypeVector 9(int) 4
+              74:             TypePointer Function 73(ivec4)
+              82:      9(int) Constant 1
+              86:             TypeFloat 32
+              87:             TypeVector 86(float) 4
+              88:             TypeMatrix 87(fvec4) 4
+          89(S2):             TypeStruct 88 6(int8_t) 9(int)
+          90(S3):             TypeStruct 89(S2)
+          91(B4):             TypeStruct 89(S2) 90(S3)
+              92:             TypePointer Uniform 91(B4)
+          93(b4):     92(ptr) Variable Uniform
+          94(S2):             TypeStruct 88 6(int8_t) 9(int)
+          95(B3):             TypeStruct 94(S2)
+              96:             TypePointer Uniform 95(B3)
+          97(b3):     96(ptr) Variable Uniform
+              98:             TypePointer Uniform 88
+             105:      9(int) Constant 0
+             109:     20(int) Constant 5
+             113:             TypePointer Function 37(ivec3)
+             115:     20(int) Constant 7
+             116:     20(int) Constant 6
+             117:             TypePointer Uniform 9(int)
+             167:   6(int8_t) Constant 1
+             168:   6(int8_t) Constant 2
+             169:   7(i8vec2) ConstantComposite 167 168
+             171:   6(int8_t) Constant 3
+         4(main):           2 Function None 3
+               5:             Label
+          69(x0):     68(ptr) Variable Function
+          75(x1):     74(ptr) Variable Function
+         114(v3):    113(ptr) Variable Function
+         136(u3):    113(ptr) Variable Function
+              29:     28(ptr) AccessChain 27(b1) 21
+              30:   6(int8_t) Load 29
+              31:     28(ptr) AccessChain 19(b2) 21
+                              Store 31 30
+              35:     34(ptr) AccessChain 19(b2) 33
+              36:   8(i8vec3) Load 35
+              38:   37(ivec3) UConvert 36
+              40:   39(ivec2) VectorShuffle 38 38 0 1
+              41:   7(i8vec2) UConvert 40
+              43:     42(ptr) AccessChain 19(b2) 32
+                              Store 43 41
+              52:     34(ptr) AccessChain 51(b5) 33
+              53:   8(i8vec3) Load 52
+              54:   37(ivec3) UConvert 53
+              55:   39(ivec2) VectorShuffle 54 54 0 1
+              56:   7(i8vec2) UConvert 55
+              57:     42(ptr) AccessChain 19(b2) 32
+                              Store 57 56
+              59:     28(ptr) AccessChain 19(b2) 58 21
+              60:   6(int8_t) Load 59
+              61:     28(ptr) AccessChain 19(b2) 58 21
+                              Store 61 60
+              62:     28(ptr) AccessChain 51(b5) 58 32
+              63:   6(int8_t) Load 62
+              64:     28(ptr) AccessChain 19(b2) 58 32
+                              Store 64 63
+              65:     42(ptr) AccessChain 19(b2) 32
+              66:   7(i8vec2) Load 65
+              67:     42(ptr) AccessChain 19(b2) 32
+                              Store 67 66
+              70:     28(ptr) AccessChain 27(b1) 21
+              71:   6(int8_t) Load 70
+              72:      9(int) UConvert 71
+                              Store 69(x0) 72
+              76:     28(ptr) AccessChain 27(b1) 21
+              77:   6(int8_t) Load 76
+              78:      9(int) UConvert 77
+              79:     42(ptr) AccessChain 19(b2) 32
+              80:   7(i8vec2) Load 79
+              81:   39(ivec2) UConvert 80
+              83:      9(int) CompositeExtract 81 0
+              84:      9(int) CompositeExtract 81 1
+              85:   73(ivec4) CompositeConstruct 78 83 84 82
+                              Store 75(x1) 85
+              99:     98(ptr) AccessChain 97(b3) 21 21
+             100:          88 Load 99
+             101:     98(ptr) AccessChain 93(b4) 21 21
+                              Store 101 100
+             102:     42(ptr) AccessChain 19(b2) 32
+             103:   7(i8vec2) Load 102
+             104:   39(ivec2) UConvert 103
+             106:      9(int) CompositeExtract 104 0
+             107:   6(int8_t) UConvert 106
+             108:     28(ptr) AccessChain 19(b2) 21
+                              Store 108 107
+             110:     42(ptr) AccessChain 19(b2) 109 32 32
+             111:   7(i8vec2) Load 110
+             112:     42(ptr) AccessChain 19(b2) 32
+                              Store 112 111
+             118:    117(ptr) AccessChain 27(b1) 116
+             119:      9(int) Load 118
+             120:     28(ptr) AccessChain 19(b2) 115 119
+             121:   6(int8_t) Load 120
+             122:      9(int) UConvert 121
+             123:    117(ptr) AccessChain 27(b1) 116
+             124:      9(int) Load 123
+             125:      9(int) IAdd 124 82
+             126:     28(ptr) AccessChain 19(b2) 115 125
+             127:   6(int8_t) Load 126
+             128:      9(int) UConvert 127
+             129:    117(ptr) AccessChain 27(b1) 116
+             130:      9(int) Load 129
+             131:      9(int) IAdd 130 10
+             132:     28(ptr) AccessChain 19(b2) 115 131
+             133:   6(int8_t) Load 132
+             134:      9(int) UConvert 133
+             135:   37(ivec3) CompositeConstruct 122 128 134
+                              Store 114(v3) 135
+             137:    117(ptr) AccessChain 27(b1) 116
+             138:      9(int) Load 137
+             139:     28(ptr) AccessChain 51(b5) 115 138
+             140:   6(int8_t) Load 139
+             141:      9(int) UConvert 140
+             142:    117(ptr) AccessChain 27(b1) 116
+             143:      9(int) Load 142
+             144:      9(int) IAdd 143 82
+             145:     28(ptr) AccessChain 51(b5) 115 144
+             146:   6(int8_t) Load 145
+             147:      9(int) UConvert 146
+             148:    117(ptr) AccessChain 27(b1) 116
+             149:      9(int) Load 148
+             150:      9(int) IAdd 149 10
+             151:     28(ptr) AccessChain 51(b5) 115 150
+             152:   6(int8_t) Load 151
+             153:      9(int) UConvert 152
+             154:   37(ivec3) CompositeConstruct 141 147 153
+                              Store 136(u3) 154
+             155:     42(ptr) AccessChain 19(b2) 116 21
+             156:   7(i8vec2) Load 155
+             157:     42(ptr) AccessChain 19(b2) 116 21
+                              Store 157 156
+             158:     42(ptr) AccessChain 51(b5) 116 32
+             159:   7(i8vec2) Load 158
+             160:     42(ptr) AccessChain 19(b2) 116 32
+                              Store 160 159
+             161:     28(ptr) AccessChain 27(b1) 21
+             162:   6(int8_t) Load 161
+             163:     28(ptr) AccessChain 19(b2) 32 105
+                              Store 163 162
+             164:     28(ptr) AccessChain 19(b2) 32 105
+             165:   6(int8_t) Load 164
+             166:     28(ptr) AccessChain 19(b2) 21
+                              Store 166 165
+             170:     42(ptr) AccessChain 19(b2) 32
+                              Store 170 169
+             172:     28(ptr) AccessChain 19(b2) 21
+                              Store 172 171
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.8bitstorage_Error-int.frag.out b/Test/baseResults/spv.8bitstorage_Error-int.frag.out
new file mode 100644
index 0000000..5607670
--- /dev/null
+++ b/Test/baseResults/spv.8bitstorage_Error-int.frag.out
@@ -0,0 +1,71 @@
+spv.8bitstorage_Error-int.frag
+ERROR: 0:54: 'structure: (u)int8 types can only be in uniform block or buffer storage' : required extension not requested: Possible extensions include:
+GL_EXT_shader_explicit_arithmetic_types
+GL_EXT_shader_explicit_arithmetic_types_int8
+ERROR: 0:58: 'return: can't use with structs containing int8' : required extension not requested: Possible extensions include:
+GL_EXT_shader_explicit_arithmetic_types
+GL_EXT_shader_explicit_arithmetic_types_int8
+ERROR: 0:61: 'int8_t: (u)int8 types can only be in uniform block or buffer storage' : required extension not requested: Possible extensions include:
+GL_EXT_shader_explicit_arithmetic_types
+GL_EXT_shader_explicit_arithmetic_types_int8
+ERROR: 0:74: '[: does not operate on types containing (u)int8' : required extension not requested: Possible extensions include:
+GL_EXT_shader_explicit_arithmetic_types
+GL_EXT_shader_explicit_arithmetic_types_int8
+ERROR: 0:75: '.: can't swizzle types containing (u)int8' : required extension not requested: Possible extensions include:
+GL_EXT_shader_explicit_arithmetic_types
+GL_EXT_shader_explicit_arithmetic_types_int8
+ERROR: 0:76: 'built-in function: (u)int8 types can only be in uniform block or buffer storage' : required extension not requested: Possible extensions include:
+GL_EXT_shader_explicit_arithmetic_types
+GL_EXT_shader_explicit_arithmetic_types_int8
+ERROR: 0:76: 'built-in function: (u)int8 types can only be in uniform block or buffer storage' : required extension not requested: Possible extensions include:
+GL_EXT_shader_explicit_arithmetic_types
+GL_EXT_shader_explicit_arithmetic_types_int8
+ERROR: 0:76: 'built-in function: (u)int8 types can only be in uniform block or buffer storage' : required extension not requested: Possible extensions include:
+GL_EXT_shader_explicit_arithmetic_types
+GL_EXT_shader_explicit_arithmetic_types_int8
+ERROR: 0:77: 'built-in function: (u)int8 types can only be in uniform block or buffer storage' : required extension not requested: Possible extensions include:
+GL_EXT_shader_explicit_arithmetic_types
+GL_EXT_shader_explicit_arithmetic_types_int8
+ERROR: 0:77: 'built-in function: (u)int8 types can only be in uniform block or buffer storage' : required extension not requested: Possible extensions include:
+GL_EXT_shader_explicit_arithmetic_types
+GL_EXT_shader_explicit_arithmetic_types_int8
+ERROR: 0:78: '+' :  wrong operand types: no operation '+' exists that takes a left-hand operand of type 'layout( column_major std140 offset=0) uniform int8_t' and a right operand of type 'layout( column_major std140 offset=0) uniform int8_t' (or there is no acceptable conversion)
+ERROR: 0:79: '-' :  wrong operand type no operation '-' exists that takes an operand of type layout( column_major std140 offset=0) uniform int8_t (or there is no acceptable conversion)
+ERROR: 0:80: '+' :  wrong operand types: no operation '+' exists that takes a left-hand operand of type 'layout( column_major std140 offset=0) uniform int8_t' and a right operand of type ' const int' (or there is no acceptable conversion)
+ERROR: 0:81: '.: can't swizzle types containing (u)int8' : required extension not requested: Possible extensions include:
+GL_EXT_shader_explicit_arithmetic_types
+GL_EXT_shader_explicit_arithmetic_types_int8
+ERROR: 0:82: '=: can't use with structs containing int8' : required extension not requested: Possible extensions include:
+GL_EXT_shader_explicit_arithmetic_types
+GL_EXT_shader_explicit_arithmetic_types_int8
+ERROR: 0:83: 'qualifier: (u)int8 types can only be in uniform block or buffer storage' : required extension not requested: Possible extensions include:
+GL_EXT_shader_explicit_arithmetic_types
+GL_EXT_shader_explicit_arithmetic_types_int8
+ERROR: 0:84: 'qualifier: (u)int8 types can only be in uniform block or buffer storage' : required extension not requested: Possible extensions include:
+GL_EXT_shader_explicit_arithmetic_types
+GL_EXT_shader_explicit_arithmetic_types_int8
+ERROR: 0:85: 'qualifier: (u)int8 types can only be in uniform block or buffer storage' : required extension not requested: Possible extensions include:
+GL_EXT_shader_explicit_arithmetic_types
+GL_EXT_shader_explicit_arithmetic_types_int8
+ERROR: 0:86: '==' :  wrong operand types: no operation '==' exists that takes a left-hand operand of type 'layout( column_major std140 offset=0) uniform int8_t' and a right operand of type 'layout( column_major std140 offset=0) uniform int8_t' (or there is no acceptable conversion)
+ERROR: 0:87: '=: can't use with arrays containing int8' : required extension not requested: Possible extensions include:
+GL_EXT_shader_explicit_arithmetic_types
+GL_EXT_shader_explicit_arithmetic_types_int8
+ERROR: 0:88: 'constructor: 8-bit vectors only take vector types' : required extension not requested: Possible extensions include:
+GL_EXT_shader_explicit_arithmetic_types
+GL_EXT_shader_explicit_arithmetic_types_int8
+ERROR: 0:89: 'constructor: 8-bit arrays not supported' : required extension not requested: Possible extensions include:
+GL_EXT_shader_explicit_arithmetic_types
+GL_EXT_shader_explicit_arithmetic_types_int8
+ERROR: 0:89: 'constructor: 8-bit vectors only take vector types' : required extension not requested: Possible extensions include:
+GL_EXT_shader_explicit_arithmetic_types
+GL_EXT_shader_explicit_arithmetic_types_int8
+ERROR: 0:92: 'constructor: can't construct structure containing 8-bit type' : required extension not requested: Possible extensions include:
+GL_EXT_shader_explicit_arithmetic_types
+GL_EXT_shader_explicit_arithmetic_types_int8
+ERROR: 0:93: 'func2' : no matching overloaded function found 
+ERROR: 0:99: '' :  syntax error, unexpected IDENTIFIER
+ERROR: 26 compilation errors.  No code generated.
+
+
+SPIR-V is not generated for failed compile or link
diff --git a/Test/baseResults/spv.8bitstorage_Error-uint.frag.out b/Test/baseResults/spv.8bitstorage_Error-uint.frag.out
new file mode 100644
index 0000000..c55a630
--- /dev/null
+++ b/Test/baseResults/spv.8bitstorage_Error-uint.frag.out
@@ -0,0 +1,71 @@
+spv.8bitstorage_Error-uint.frag
+ERROR: 0:54: 'structure: (u)int8 types can only be in uniform block or buffer storage' : required extension not requested: Possible extensions include:
+GL_EXT_shader_explicit_arithmetic_types
+GL_EXT_shader_explicit_arithmetic_types_int8
+ERROR: 0:58: 'return: can't use with structs containing uint8' : required extension not requested: Possible extensions include:
+GL_EXT_shader_explicit_arithmetic_types
+GL_EXT_shader_explicit_arithmetic_types_int8
+ERROR: 0:61: 'uint8_t: (u)int8 types can only be in uniform block or buffer storage' : required extension not requested: Possible extensions include:
+GL_EXT_shader_explicit_arithmetic_types
+GL_EXT_shader_explicit_arithmetic_types_int8
+ERROR: 0:74: '[: does not operate on types containing (u)int8' : required extension not requested: Possible extensions include:
+GL_EXT_shader_explicit_arithmetic_types
+GL_EXT_shader_explicit_arithmetic_types_int8
+ERROR: 0:75: '.: can't swizzle types containing (u)int8' : required extension not requested: Possible extensions include:
+GL_EXT_shader_explicit_arithmetic_types
+GL_EXT_shader_explicit_arithmetic_types_int8
+ERROR: 0:76: 'built-in function: (u)int8 types can only be in uniform block or buffer storage' : required extension not requested: Possible extensions include:
+GL_EXT_shader_explicit_arithmetic_types
+GL_EXT_shader_explicit_arithmetic_types_int8
+ERROR: 0:76: 'built-in function: (u)int8 types can only be in uniform block or buffer storage' : required extension not requested: Possible extensions include:
+GL_EXT_shader_explicit_arithmetic_types
+GL_EXT_shader_explicit_arithmetic_types_int8
+ERROR: 0:76: 'built-in function: (u)int8 types can only be in uniform block or buffer storage' : required extension not requested: Possible extensions include:
+GL_EXT_shader_explicit_arithmetic_types
+GL_EXT_shader_explicit_arithmetic_types_int8
+ERROR: 0:77: 'built-in function: (u)int8 types can only be in uniform block or buffer storage' : required extension not requested: Possible extensions include:
+GL_EXT_shader_explicit_arithmetic_types
+GL_EXT_shader_explicit_arithmetic_types_int8
+ERROR: 0:77: 'built-in function: (u)int8 types can only be in uniform block or buffer storage' : required extension not requested: Possible extensions include:
+GL_EXT_shader_explicit_arithmetic_types
+GL_EXT_shader_explicit_arithmetic_types_int8
+ERROR: 0:78: '+' :  wrong operand types: no operation '+' exists that takes a left-hand operand of type 'layout( column_major std140 offset=0) uniform uint8_t' and a right operand of type 'layout( column_major std140 offset=0) uniform uint8_t' (or there is no acceptable conversion)
+ERROR: 0:79: '-' :  wrong operand type no operation '-' exists that takes an operand of type layout( column_major std140 offset=0) uniform uint8_t (or there is no acceptable conversion)
+ERROR: 0:80: '+' :  wrong operand types: no operation '+' exists that takes a left-hand operand of type 'layout( column_major std140 offset=0) uniform uint8_t' and a right operand of type ' const int' (or there is no acceptable conversion)
+ERROR: 0:81: '.: can't swizzle types containing (u)int8' : required extension not requested: Possible extensions include:
+GL_EXT_shader_explicit_arithmetic_types
+GL_EXT_shader_explicit_arithmetic_types_int8
+ERROR: 0:82: '=: can't use with structs containing uint8' : required extension not requested: Possible extensions include:
+GL_EXT_shader_explicit_arithmetic_types
+GL_EXT_shader_explicit_arithmetic_types_int8
+ERROR: 0:83: 'qualifier: (u)int8 types can only be in uniform block or buffer storage' : required extension not requested: Possible extensions include:
+GL_EXT_shader_explicit_arithmetic_types
+GL_EXT_shader_explicit_arithmetic_types_int8
+ERROR: 0:84: 'qualifier: (u)int8 types can only be in uniform block or buffer storage' : required extension not requested: Possible extensions include:
+GL_EXT_shader_explicit_arithmetic_types
+GL_EXT_shader_explicit_arithmetic_types_int8
+ERROR: 0:85: 'qualifier: (u)int8 types can only be in uniform block or buffer storage' : required extension not requested: Possible extensions include:
+GL_EXT_shader_explicit_arithmetic_types
+GL_EXT_shader_explicit_arithmetic_types_int8
+ERROR: 0:86: '==' :  wrong operand types: no operation '==' exists that takes a left-hand operand of type 'layout( column_major std140 offset=0) uniform uint8_t' and a right operand of type 'layout( column_major std140 offset=0) uniform uint8_t' (or there is no acceptable conversion)
+ERROR: 0:87: '=: can't use with arrays containing uint8' : required extension not requested: Possible extensions include:
+GL_EXT_shader_explicit_arithmetic_types
+GL_EXT_shader_explicit_arithmetic_types_int8
+ERROR: 0:88: 'constructor: 8-bit vectors only take vector types' : required extension not requested: Possible extensions include:
+GL_EXT_shader_explicit_arithmetic_types
+GL_EXT_shader_explicit_arithmetic_types_int8
+ERROR: 0:89: 'constructor: 8-bit arrays not supported' : required extension not requested: Possible extensions include:
+GL_EXT_shader_explicit_arithmetic_types
+GL_EXT_shader_explicit_arithmetic_types_int8
+ERROR: 0:89: 'constructor: 8-bit vectors only take vector types' : required extension not requested: Possible extensions include:
+GL_EXT_shader_explicit_arithmetic_types
+GL_EXT_shader_explicit_arithmetic_types_int8
+ERROR: 0:92: 'constructor: can't construct structure containing 8-bit type' : required extension not requested: Possible extensions include:
+GL_EXT_shader_explicit_arithmetic_types
+GL_EXT_shader_explicit_arithmetic_types_int8
+ERROR: 0:93: 'func2' : no matching overloaded function found 
+ERROR: 0:99: '' :  syntax error, unexpected IDENTIFIER
+ERROR: 26 compilation errors.  No code generated.
+
+
+SPIR-V is not generated for failed compile or link
diff --git a/Test/baseResults/spv.AnyHitShader.rahit.out b/Test/baseResults/spv.AnyHitShader.rahit.out
new file mode 100644
index 0000000..92b31d0
--- /dev/null
+++ b/Test/baseResults/spv.AnyHitShader.rahit.out
@@ -0,0 +1,163 @@
+spv.AnyHitShader.rahit
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 81
+
+                              Capability RayTracingNV
+                              Extension  "SPV_NV_ray_tracing"
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint AnyHitNV 4  "main" 11 14 20 23 26 33 36 39 42 47 50 53 58 64 67
+                              Source GLSL 460
+                              SourceExtension  "GL_NV_ray_tracing"
+                              Name 4  "main"
+                              Name 9  "v0"
+                              Name 11  "gl_LaunchIDNV"
+                              Name 13  "v1"
+                              Name 14  "gl_LaunchSizeNV"
+                              Name 18  "v2"
+                              Name 20  "gl_PrimitiveID"
+                              Name 22  "v3"
+                              Name 23  "gl_InstanceID"
+                              Name 25  "v4"
+                              Name 26  "gl_InstanceCustomIndexNV"
+                              Name 31  "v5"
+                              Name 33  "gl_WorldRayOriginNV"
+                              Name 35  "v6"
+                              Name 36  "gl_WorldRayDirectionNV"
+                              Name 38  "v7"
+                              Name 39  "gl_ObjectRayOriginNV"
+                              Name 41  "v8"
+                              Name 42  "gl_ObjectRayDirectionNV"
+                              Name 45  "v9"
+                              Name 47  "gl_RayTminNV"
+                              Name 49  "v10"
+                              Name 50  "gl_RayTmaxNV"
+                              Name 52  "v11"
+                              Name 53  "gl_HitTNV"
+                              Name 56  "v12"
+                              Name 58  "gl_HitKindNV"
+                              Name 62  "v13"
+                              Name 64  "gl_ObjectToWorldNV"
+                              Name 66  "v14"
+                              Name 67  "gl_WorldToObjectNV"
+                              Name 71  "incomingPayload"
+                              Decorate 11(gl_LaunchIDNV) BuiltIn LaunchIdNV
+                              Decorate 14(gl_LaunchSizeNV) BuiltIn LaunchSizeNV
+                              Decorate 20(gl_PrimitiveID) BuiltIn PrimitiveId
+                              Decorate 23(gl_InstanceID) BuiltIn InstanceId
+                              Decorate 26(gl_InstanceCustomIndexNV) BuiltIn InstanceCustomIndexNV
+                              Decorate 33(gl_WorldRayOriginNV) BuiltIn WorldRayOriginNV
+                              Decorate 36(gl_WorldRayDirectionNV) BuiltIn WorldRayDirectionNV
+                              Decorate 39(gl_ObjectRayOriginNV) BuiltIn ObjectRayOriginNV
+                              Decorate 42(gl_ObjectRayDirectionNV) BuiltIn ObjectRayDirectionNV
+                              Decorate 47(gl_RayTminNV) BuiltIn RayTminNV
+                              Decorate 50(gl_RayTmaxNV) BuiltIn RayTmaxNV
+                              Decorate 53(gl_HitTNV) BuiltIn HitTNV
+                              Decorate 58(gl_HitKindNV) BuiltIn HitKindNV
+                              Decorate 64(gl_ObjectToWorldNV) BuiltIn ObjectToWorldNV
+                              Decorate 67(gl_WorldToObjectNV) BuiltIn WorldToObjectNV
+                              Decorate 71(incomingPayload) Location 1
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeInt 32 0
+               7:             TypeVector 6(int) 3
+               8:             TypePointer Function 7(ivec3)
+              10:             TypePointer Input 7(ivec3)
+11(gl_LaunchIDNV):     10(ptr) Variable Input
+14(gl_LaunchSizeNV):     10(ptr) Variable Input
+              16:             TypeInt 32 1
+              17:             TypePointer Function 16(int)
+              19:             TypePointer Input 16(int)
+20(gl_PrimitiveID):     19(ptr) Variable Input
+23(gl_InstanceID):     19(ptr) Variable Input
+26(gl_InstanceCustomIndexNV):     19(ptr) Variable Input
+              28:             TypeFloat 32
+              29:             TypeVector 28(float) 3
+              30:             TypePointer Function 29(fvec3)
+              32:             TypePointer Input 29(fvec3)
+33(gl_WorldRayOriginNV):     32(ptr) Variable Input
+36(gl_WorldRayDirectionNV):     32(ptr) Variable Input
+39(gl_ObjectRayOriginNV):     32(ptr) Variable Input
+42(gl_ObjectRayDirectionNV):     32(ptr) Variable Input
+              44:             TypePointer Function 28(float)
+              46:             TypePointer Input 28(float)
+47(gl_RayTminNV):     46(ptr) Variable Input
+50(gl_RayTmaxNV):     46(ptr) Variable Input
+   53(gl_HitTNV):     46(ptr) Variable Input
+              55:             TypePointer Function 6(int)
+              57:             TypePointer Input 6(int)
+58(gl_HitKindNV):     57(ptr) Variable Input
+              60:             TypeMatrix 29(fvec3) 4
+              61:             TypePointer Function 60
+              63:             TypePointer Input 60
+64(gl_ObjectToWorldNV):     63(ptr) Variable Input
+67(gl_WorldToObjectNV):     63(ptr) Variable Input
+              69:             TypeVector 28(float) 4
+              70:             TypePointer IncomingRayPayloadNV 69(fvec4)
+71(incomingPayload):     70(ptr) Variable IncomingRayPayloadNV
+              72:   28(float) Constant 1056964608
+              73:   69(fvec4) ConstantComposite 72 72 72 72
+              75:     16(int) Constant 1
+              76:             TypeBool
+         4(main):           2 Function None 3
+               5:             Label
+           9(v0):      8(ptr) Variable Function
+          13(v1):      8(ptr) Variable Function
+          18(v2):     17(ptr) Variable Function
+          22(v3):     17(ptr) Variable Function
+          25(v4):     17(ptr) Variable Function
+          31(v5):     30(ptr) Variable Function
+          35(v6):     30(ptr) Variable Function
+          38(v7):     30(ptr) Variable Function
+          41(v8):     30(ptr) Variable Function
+          45(v9):     44(ptr) Variable Function
+         49(v10):     44(ptr) Variable Function
+         52(v11):     44(ptr) Variable Function
+         56(v12):     55(ptr) Variable Function
+         62(v13):     61(ptr) Variable Function
+         66(v14):     61(ptr) Variable Function
+              12:    7(ivec3) Load 11(gl_LaunchIDNV)
+                              Store 9(v0) 12
+              15:    7(ivec3) Load 14(gl_LaunchSizeNV)
+                              Store 13(v1) 15
+              21:     16(int) Load 20(gl_PrimitiveID)
+                              Store 18(v2) 21
+              24:     16(int) Load 23(gl_InstanceID)
+                              Store 22(v3) 24
+              27:     16(int) Load 26(gl_InstanceCustomIndexNV)
+                              Store 25(v4) 27
+              34:   29(fvec3) Load 33(gl_WorldRayOriginNV)
+                              Store 31(v5) 34
+              37:   29(fvec3) Load 36(gl_WorldRayDirectionNV)
+                              Store 35(v6) 37
+              40:   29(fvec3) Load 39(gl_ObjectRayOriginNV)
+                              Store 38(v7) 40
+              43:   29(fvec3) Load 42(gl_ObjectRayDirectionNV)
+                              Store 41(v8) 43
+              48:   28(float) Load 47(gl_RayTminNV)
+                              Store 45(v9) 48
+              51:   28(float) Load 50(gl_RayTmaxNV)
+                              Store 49(v10) 51
+              54:   28(float) Load 53(gl_HitTNV)
+                              Store 52(v11) 54
+              59:      6(int) Load 58(gl_HitKindNV)
+                              Store 56(v12) 59
+              65:          60 Load 64(gl_ObjectToWorldNV)
+                              Store 62(v13) 65
+              68:          60 Load 67(gl_WorldToObjectNV)
+                              Store 66(v14) 68
+                              Store 71(incomingPayload) 73
+              74:     16(int) Load 18(v2)
+              77:    76(bool) IEqual 74 75
+                              SelectionMerge 79 None
+                              BranchConditional 77 78 80
+              78:               Label
+                                IgnoreIntersectionNV
+                                Branch 79
+              80:               Label
+                                TerminateRayNV
+                                Branch 79
+              79:             Label
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.AnyHitShader_Errors.rahit.out b/Test/baseResults/spv.AnyHitShader_Errors.rahit.out
new file mode 100644
index 0000000..e9bab08
--- /dev/null
+++ b/Test/baseResults/spv.AnyHitShader_Errors.rahit.out
@@ -0,0 +1,8 @@
+spv.AnyHitShader_Errors.rahit
+ERROR: 0:8: 'assign' :  l-value required "payload" (cannot modify hitAttributeNV in this stage)
+ERROR: 0:9: 'reportIntersectionNV' : no matching overloaded function found 
+ERROR: 0:10: 'traceNV' : no matching overloaded function found 
+ERROR: 3 compilation errors.  No code generated.
+
+
+SPIR-V is not generated for failed compile or link
diff --git a/Test/baseResults/spv.AofA.frag.out b/Test/baseResults/spv.AofA.frag.out
index 4eb7563..e8572ba 100644
--- a/Test/baseResults/spv.AofA.frag.out
+++ b/Test/baseResults/spv.AofA.frag.out
@@ -1,8 +1,14 @@
 spv.AofA.frag
-Warning, version 430 is not yet complete; most version-specific features are present, but some are missing.
+WARNING: 0:6: '[][]' : Generating SPIR-V array-of-arrays, but Vulkan only supports single array level for this resource 
+
+error: SPIRV-Tools Validation Errors
+error: Uniform OpVariable <id> '98[nameAofA] 'has illegal type.
+From Vulkan spec, section 14.5.2:
+Variables identified with the Uniform storage class are used to access transparent buffer backed resources. Such variables must be typed as OpTypeStruct, or an array of this type
+  %nameAofA = OpVariable %_ptr_Uniform__arr__arr_uAofA_uint_5_uint_3 Uniform
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 104
 
                               Capability Shader
diff --git a/Test/baseResults/spv.ClosestHitShader.rchit.out b/Test/baseResults/spv.ClosestHitShader.rchit.out
new file mode 100644
index 0000000..b461462
--- /dev/null
+++ b/Test/baseResults/spv.ClosestHitShader.rchit.out
@@ -0,0 +1,169 @@
+spv.ClosestHitShader.rchit
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 88
+
+                              Capability RayTracingNV
+                              Extension  "SPV_NV_ray_tracing"
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint ClosestHitNV 4  "main" 11 14 20 23 26 33 36 39 42 47 50 53 58 64 67
+                              Source GLSL 460
+                              SourceExtension  "GL_NV_ray_tracing"
+                              Name 4  "main"
+                              Name 9  "v0"
+                              Name 11  "gl_LaunchIDNV"
+                              Name 13  "v1"
+                              Name 14  "gl_LaunchSizeNV"
+                              Name 18  "v2"
+                              Name 20  "gl_PrimitiveID"
+                              Name 22  "v3"
+                              Name 23  "gl_InstanceID"
+                              Name 25  "v4"
+                              Name 26  "gl_InstanceCustomIndexNV"
+                              Name 31  "v5"
+                              Name 33  "gl_WorldRayOriginNV"
+                              Name 35  "v6"
+                              Name 36  "gl_WorldRayDirectionNV"
+                              Name 38  "v7"
+                              Name 39  "gl_ObjectRayOriginNV"
+                              Name 41  "v8"
+                              Name 42  "gl_ObjectRayDirectionNV"
+                              Name 45  "v9"
+                              Name 47  "gl_RayTminNV"
+                              Name 49  "v10"
+                              Name 50  "gl_RayTmaxNV"
+                              Name 52  "v11"
+                              Name 53  "gl_HitTNV"
+                              Name 56  "v12"
+                              Name 58  "gl_HitKindNV"
+                              Name 62  "v13"
+                              Name 64  "gl_ObjectToWorldNV"
+                              Name 66  "v14"
+                              Name 67  "gl_WorldToObjectNV"
+                              Name 71  "accNV"
+                              Name 85  "localPayload"
+                              Name 87  "incomingPayload"
+                              Decorate 11(gl_LaunchIDNV) BuiltIn LaunchIdNV
+                              Decorate 14(gl_LaunchSizeNV) BuiltIn LaunchSizeNV
+                              Decorate 20(gl_PrimitiveID) BuiltIn PrimitiveId
+                              Decorate 23(gl_InstanceID) BuiltIn InstanceId
+                              Decorate 26(gl_InstanceCustomIndexNV) BuiltIn InstanceCustomIndexNV
+                              Decorate 33(gl_WorldRayOriginNV) BuiltIn WorldRayOriginNV
+                              Decorate 36(gl_WorldRayDirectionNV) BuiltIn WorldRayDirectionNV
+                              Decorate 39(gl_ObjectRayOriginNV) BuiltIn ObjectRayOriginNV
+                              Decorate 42(gl_ObjectRayDirectionNV) BuiltIn ObjectRayDirectionNV
+                              Decorate 47(gl_RayTminNV) BuiltIn RayTminNV
+                              Decorate 50(gl_RayTmaxNV) BuiltIn RayTmaxNV
+                              Decorate 53(gl_HitTNV) BuiltIn HitTNV
+                              Decorate 58(gl_HitKindNV) BuiltIn HitKindNV
+                              Decorate 64(gl_ObjectToWorldNV) BuiltIn ObjectToWorldNV
+                              Decorate 67(gl_WorldToObjectNV) BuiltIn WorldToObjectNV
+                              Decorate 71(accNV) DescriptorSet 0
+                              Decorate 71(accNV) Binding 0
+                              Decorate 85(localPayload) Location 0
+                              Decorate 87(incomingPayload) Location 1
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeInt 32 0
+               7:             TypeVector 6(int) 3
+               8:             TypePointer Function 7(ivec3)
+              10:             TypePointer Input 7(ivec3)
+11(gl_LaunchIDNV):     10(ptr) Variable Input
+14(gl_LaunchSizeNV):     10(ptr) Variable Input
+              16:             TypeInt 32 1
+              17:             TypePointer Function 16(int)
+              19:             TypePointer Input 16(int)
+20(gl_PrimitiveID):     19(ptr) Variable Input
+23(gl_InstanceID):     19(ptr) Variable Input
+26(gl_InstanceCustomIndexNV):     19(ptr) Variable Input
+              28:             TypeFloat 32
+              29:             TypeVector 28(float) 3
+              30:             TypePointer Function 29(fvec3)
+              32:             TypePointer Input 29(fvec3)
+33(gl_WorldRayOriginNV):     32(ptr) Variable Input
+36(gl_WorldRayDirectionNV):     32(ptr) Variable Input
+39(gl_ObjectRayOriginNV):     32(ptr) Variable Input
+42(gl_ObjectRayDirectionNV):     32(ptr) Variable Input
+              44:             TypePointer Function 28(float)
+              46:             TypePointer Input 28(float)
+47(gl_RayTminNV):     46(ptr) Variable Input
+50(gl_RayTmaxNV):     46(ptr) Variable Input
+   53(gl_HitTNV):     46(ptr) Variable Input
+              55:             TypePointer Function 6(int)
+              57:             TypePointer Input 6(int)
+58(gl_HitKindNV):     57(ptr) Variable Input
+              60:             TypeMatrix 29(fvec3) 4
+              61:             TypePointer Function 60
+              63:             TypePointer Input 60
+64(gl_ObjectToWorldNV):     63(ptr) Variable Input
+67(gl_WorldToObjectNV):     63(ptr) Variable Input
+              69:             TypeAccelerationStructureNV
+              70:             TypePointer UniformConstant 69
+       71(accNV):     70(ptr) Variable UniformConstant
+              73:      6(int) Constant 0
+              74:      6(int) Constant 1
+              75:      6(int) Constant 2
+              76:      6(int) Constant 3
+              77:   28(float) Constant 1056964608
+              78:   29(fvec3) ConstantComposite 77 77 77
+              79:   28(float) Constant 1065353216
+              80:   29(fvec3) ConstantComposite 79 79 79
+              81:   28(float) Constant 1061158912
+              82:     16(int) Constant 1
+              83:             TypeVector 28(float) 4
+              84:             TypePointer RayPayloadNV 83(fvec4)
+85(localPayload):     84(ptr) Variable RayPayloadNV
+              86:             TypePointer IncomingRayPayloadNV 83(fvec4)
+87(incomingPayload):     86(ptr) Variable IncomingRayPayloadNV
+         4(main):           2 Function None 3
+               5:             Label
+           9(v0):      8(ptr) Variable Function
+          13(v1):      8(ptr) Variable Function
+          18(v2):     17(ptr) Variable Function
+          22(v3):     17(ptr) Variable Function
+          25(v4):     17(ptr) Variable Function
+          31(v5):     30(ptr) Variable Function
+          35(v6):     30(ptr) Variable Function
+          38(v7):     30(ptr) Variable Function
+          41(v8):     30(ptr) Variable Function
+          45(v9):     44(ptr) Variable Function
+         49(v10):     44(ptr) Variable Function
+         52(v11):     44(ptr) Variable Function
+         56(v12):     55(ptr) Variable Function
+         62(v13):     61(ptr) Variable Function
+         66(v14):     61(ptr) Variable Function
+              12:    7(ivec3) Load 11(gl_LaunchIDNV)
+                              Store 9(v0) 12
+              15:    7(ivec3) Load 14(gl_LaunchSizeNV)
+                              Store 13(v1) 15
+              21:     16(int) Load 20(gl_PrimitiveID)
+                              Store 18(v2) 21
+              24:     16(int) Load 23(gl_InstanceID)
+                              Store 22(v3) 24
+              27:     16(int) Load 26(gl_InstanceCustomIndexNV)
+                              Store 25(v4) 27
+              34:   29(fvec3) Load 33(gl_WorldRayOriginNV)
+                              Store 31(v5) 34
+              37:   29(fvec3) Load 36(gl_WorldRayDirectionNV)
+                              Store 35(v6) 37
+              40:   29(fvec3) Load 39(gl_ObjectRayOriginNV)
+                              Store 38(v7) 40
+              43:   29(fvec3) Load 42(gl_ObjectRayDirectionNV)
+                              Store 41(v8) 43
+              48:   28(float) Load 47(gl_RayTminNV)
+                              Store 45(v9) 48
+              51:   28(float) Load 50(gl_RayTmaxNV)
+                              Store 49(v10) 51
+              54:   28(float) Load 53(gl_HitTNV)
+                              Store 52(v11) 54
+              59:      6(int) Load 58(gl_HitKindNV)
+                              Store 56(v12) 59
+              65:          60 Load 64(gl_ObjectToWorldNV)
+                              Store 62(v13) 65
+              68:          60 Load 67(gl_WorldToObjectNV)
+                              Store 66(v14) 68
+              72:          69 Load 71(accNV)
+                              TraceNV 72 73 74 75 76 73 78 77 80 81 82
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.ClosestHitShader_Errors.rchit.out b/Test/baseResults/spv.ClosestHitShader_Errors.rchit.out
new file mode 100644
index 0000000..e6f8410
--- /dev/null
+++ b/Test/baseResults/spv.ClosestHitShader_Errors.rchit.out
@@ -0,0 +1,9 @@
+spv.ClosestHitShader_Errors.rchit
+ERROR: 0:8: 'assign' :  l-value required "payload" (cannot modify hitAttributeNV in this stage)
+ERROR: 0:9: 'reportIntersectionNV' : no matching overloaded function found 
+ERROR: 0:10: 'terminateRayNV' : no matching overloaded function found 
+ERROR: 0:11: 'ignoreIntersectionNV' : no matching overloaded function found 
+ERROR: 4 compilation errors.  No code generated.
+
+
+SPIR-V is not generated for failed compile or link
diff --git a/Test/baseResults/spv.GeometryShaderPassthrough.geom.out b/Test/baseResults/spv.GeometryShaderPassthrough.geom.out
index 05aeb97..5db845e 100644
--- a/Test/baseResults/spv.GeometryShaderPassthrough.geom.out
+++ b/Test/baseResults/spv.GeometryShaderPassthrough.geom.out
@@ -1,8 +1,6 @@
 spv.GeometryShaderPassthrough.geom
-Warning, version 450 is not yet complete; most version-specific features are present, but some are missing.
-
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 15
 
                               Capability Geometry
@@ -13,7 +11,8 @@
                               EntryPoint Geometry 4  "main" 10 14
                               ExecutionMode 4 Triangles
                               ExecutionMode 4 Invocations 1
-                              ExecutionMode 4 OutputVertices
+                              ExecutionMode 4 OutputTriangleStrip
+                              ExecutionMode 4 OutputVertices 3
                               Source GLSL 450
                               SourceExtension  "GL_NV_geometry_shader_passthrough"
                               Name 4  "main"
diff --git a/Test/baseResults/spv.IntersectShader.rint.out b/Test/baseResults/spv.IntersectShader.rint.out
new file mode 100644
index 0000000..cbb70cd
--- /dev/null
+++ b/Test/baseResults/spv.IntersectShader.rint.out
@@ -0,0 +1,138 @@
+spv.IntersectShader.rint
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 71
+
+                              Capability RayTracingNV
+                              Extension  "SPV_NV_ray_tracing"
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint IntersectionNV 4  "main" 11 14 20 23 26 33 36 39 42 47 50 56 59
+                              Source GLSL 460
+                              SourceExtension  "GL_NV_ray_tracing"
+                              Name 4  "main"
+                              Name 9  "v0"
+                              Name 11  "gl_LaunchIDNV"
+                              Name 13  "v1"
+                              Name 14  "gl_LaunchSizeNV"
+                              Name 18  "v2"
+                              Name 20  "gl_PrimitiveID"
+                              Name 22  "v3"
+                              Name 23  "gl_InstanceID"
+                              Name 25  "v4"
+                              Name 26  "gl_InstanceCustomIndexNV"
+                              Name 31  "v5"
+                              Name 33  "gl_WorldRayOriginNV"
+                              Name 35  "v6"
+                              Name 36  "gl_WorldRayDirectionNV"
+                              Name 38  "v7"
+                              Name 39  "gl_ObjectRayOriginNV"
+                              Name 41  "v8"
+                              Name 42  "gl_ObjectRayDirectionNV"
+                              Name 45  "v9"
+                              Name 47  "gl_RayTminNV"
+                              Name 49  "v10"
+                              Name 50  "gl_RayTmaxNV"
+                              Name 54  "v11"
+                              Name 56  "gl_ObjectToWorldNV"
+                              Name 58  "v12"
+                              Name 59  "gl_WorldToObjectNV"
+                              Name 63  "iAttr"
+                              Decorate 11(gl_LaunchIDNV) BuiltIn LaunchIdNV
+                              Decorate 14(gl_LaunchSizeNV) BuiltIn LaunchSizeNV
+                              Decorate 20(gl_PrimitiveID) BuiltIn PrimitiveId
+                              Decorate 23(gl_InstanceID) BuiltIn InstanceId
+                              Decorate 26(gl_InstanceCustomIndexNV) BuiltIn InstanceCustomIndexNV
+                              Decorate 33(gl_WorldRayOriginNV) BuiltIn WorldRayOriginNV
+                              Decorate 36(gl_WorldRayDirectionNV) BuiltIn WorldRayDirectionNV
+                              Decorate 39(gl_ObjectRayOriginNV) BuiltIn ObjectRayOriginNV
+                              Decorate 42(gl_ObjectRayDirectionNV) BuiltIn ObjectRayDirectionNV
+                              Decorate 47(gl_RayTminNV) BuiltIn RayTminNV
+                              Decorate 50(gl_RayTmaxNV) BuiltIn RayTmaxNV
+                              Decorate 56(gl_ObjectToWorldNV) BuiltIn ObjectToWorldNV
+                              Decorate 59(gl_WorldToObjectNV) BuiltIn WorldToObjectNV
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeInt 32 0
+               7:             TypeVector 6(int) 3
+               8:             TypePointer Function 7(ivec3)
+              10:             TypePointer Input 7(ivec3)
+11(gl_LaunchIDNV):     10(ptr) Variable Input
+14(gl_LaunchSizeNV):     10(ptr) Variable Input
+              16:             TypeInt 32 1
+              17:             TypePointer Function 16(int)
+              19:             TypePointer Input 16(int)
+20(gl_PrimitiveID):     19(ptr) Variable Input
+23(gl_InstanceID):     19(ptr) Variable Input
+26(gl_InstanceCustomIndexNV):     19(ptr) Variable Input
+              28:             TypeFloat 32
+              29:             TypeVector 28(float) 3
+              30:             TypePointer Function 29(fvec3)
+              32:             TypePointer Input 29(fvec3)
+33(gl_WorldRayOriginNV):     32(ptr) Variable Input
+36(gl_WorldRayDirectionNV):     32(ptr) Variable Input
+39(gl_ObjectRayOriginNV):     32(ptr) Variable Input
+42(gl_ObjectRayDirectionNV):     32(ptr) Variable Input
+              44:             TypePointer Function 28(float)
+              46:             TypePointer Input 28(float)
+47(gl_RayTminNV):     46(ptr) Variable Input
+50(gl_RayTmaxNV):     46(ptr) Variable Input
+              52:             TypeMatrix 29(fvec3) 4
+              53:             TypePointer Function 52
+              55:             TypePointer Input 52
+56(gl_ObjectToWorldNV):     55(ptr) Variable Input
+59(gl_WorldToObjectNV):     55(ptr) Variable Input
+              61:             TypeVector 28(float) 4
+              62:             TypePointer HitAttributeNV 61(fvec4)
+       63(iAttr):     62(ptr) Variable HitAttributeNV
+              64:   28(float) Constant 1056964608
+              65:   28(float) Constant 0
+              66:   28(float) Constant 1065353216
+              67:   61(fvec4) ConstantComposite 64 64 65 66
+              68:      6(int) Constant 1
+              69:             TypeBool
+         4(main):           2 Function None 3
+               5:             Label
+           9(v0):      8(ptr) Variable Function
+          13(v1):      8(ptr) Variable Function
+          18(v2):     17(ptr) Variable Function
+          22(v3):     17(ptr) Variable Function
+          25(v4):     17(ptr) Variable Function
+          31(v5):     30(ptr) Variable Function
+          35(v6):     30(ptr) Variable Function
+          38(v7):     30(ptr) Variable Function
+          41(v8):     30(ptr) Variable Function
+          45(v9):     44(ptr) Variable Function
+         49(v10):     44(ptr) Variable Function
+         54(v11):     53(ptr) Variable Function
+         58(v12):     53(ptr) Variable Function
+              12:    7(ivec3) Load 11(gl_LaunchIDNV)
+                              Store 9(v0) 12
+              15:    7(ivec3) Load 14(gl_LaunchSizeNV)
+                              Store 13(v1) 15
+              21:     16(int) Load 20(gl_PrimitiveID)
+                              Store 18(v2) 21
+              24:     16(int) Load 23(gl_InstanceID)
+                              Store 22(v3) 24
+              27:     16(int) Load 26(gl_InstanceCustomIndexNV)
+                              Store 25(v4) 27
+              34:   29(fvec3) Load 33(gl_WorldRayOriginNV)
+                              Store 31(v5) 34
+              37:   29(fvec3) Load 36(gl_WorldRayDirectionNV)
+                              Store 35(v6) 37
+              40:   29(fvec3) Load 39(gl_ObjectRayOriginNV)
+                              Store 38(v7) 40
+              43:   29(fvec3) Load 42(gl_ObjectRayDirectionNV)
+                              Store 41(v8) 43
+              48:   28(float) Load 47(gl_RayTminNV)
+                              Store 45(v9) 48
+              51:   28(float) Load 50(gl_RayTmaxNV)
+                              Store 49(v10) 51
+              57:          52 Load 56(gl_ObjectToWorldNV)
+                              Store 54(v11) 57
+              60:          52 Load 59(gl_WorldToObjectNV)
+                              Store 58(v12) 60
+                              Store 63(iAttr) 67
+              70:    69(bool) ReportIntersectionNV 64 68
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.IntersectShader_Errors.rint.out b/Test/baseResults/spv.IntersectShader_Errors.rint.out
new file mode 100644
index 0000000..f267026
--- /dev/null
+++ b/Test/baseResults/spv.IntersectShader_Errors.rint.out
@@ -0,0 +1,10 @@
+spv.IntersectShader_Errors.rint
+ERROR: 0:3: 'rayPayloadInNV' : not supported in this stage: intersection
+ERROR: 0:4: 'rayPayloadNV' : not supported in this stage: intersection
+ERROR: 0:8: 'gl_HitTNV' : undeclared identifier 
+ERROR: 0:9: 'gl_HitKindNV' : undeclared identifier 
+ERROR: 0:10: 'traceNV' : no matching overloaded function found 
+ERROR: 5 compilation errors.  No code generated.
+
+
+SPIR-V is not generated for failed compile or link
diff --git a/Test/baseResults/spv.MissShader.rmiss.out b/Test/baseResults/spv.MissShader.rmiss.out
new file mode 100644
index 0000000..0ad3341
--- /dev/null
+++ b/Test/baseResults/spv.MissShader.rmiss.out
@@ -0,0 +1,113 @@
+spv.MissShader.rmiss
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 60
+
+                              Capability RayTracingNV
+                              Extension  "SPV_NV_ray_tracing"
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint MissNV 4  "main" 11 14 21 24 27 30 35 38
+                              Source GLSL 460
+                              SourceExtension  "GL_NV_ray_tracing"
+                              Name 4  "main"
+                              Name 9  "v0"
+                              Name 11  "gl_LaunchIDNV"
+                              Name 13  "v1"
+                              Name 14  "gl_LaunchSizeNV"
+                              Name 19  "v2"
+                              Name 21  "gl_WorldRayOriginNV"
+                              Name 23  "v3"
+                              Name 24  "gl_WorldRayDirectionNV"
+                              Name 26  "v4"
+                              Name 27  "gl_ObjectRayOriginNV"
+                              Name 29  "v5"
+                              Name 30  "gl_ObjectRayDirectionNV"
+                              Name 33  "v6"
+                              Name 35  "gl_RayTminNV"
+                              Name 37  "v7"
+                              Name 38  "gl_RayTmaxNV"
+                              Name 42  "accNV"
+                              Name 57  "localPayload"
+                              Name 59  "incomingPayload"
+                              Decorate 11(gl_LaunchIDNV) BuiltIn LaunchIdNV
+                              Decorate 14(gl_LaunchSizeNV) BuiltIn LaunchSizeNV
+                              Decorate 21(gl_WorldRayOriginNV) BuiltIn WorldRayOriginNV
+                              Decorate 24(gl_WorldRayDirectionNV) BuiltIn WorldRayDirectionNV
+                              Decorate 27(gl_ObjectRayOriginNV) BuiltIn ObjectRayOriginNV
+                              Decorate 30(gl_ObjectRayDirectionNV) BuiltIn ObjectRayDirectionNV
+                              Decorate 35(gl_RayTminNV) BuiltIn RayTminNV
+                              Decorate 38(gl_RayTmaxNV) BuiltIn RayTmaxNV
+                              Decorate 42(accNV) DescriptorSet 0
+                              Decorate 42(accNV) Binding 0
+                              Decorate 57(localPayload) Location 0
+                              Decorate 59(incomingPayload) Location 1
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeInt 32 0
+               7:             TypeVector 6(int) 3
+               8:             TypePointer Function 7(ivec3)
+              10:             TypePointer Input 7(ivec3)
+11(gl_LaunchIDNV):     10(ptr) Variable Input
+14(gl_LaunchSizeNV):     10(ptr) Variable Input
+              16:             TypeFloat 32
+              17:             TypeVector 16(float) 3
+              18:             TypePointer Function 17(fvec3)
+              20:             TypePointer Input 17(fvec3)
+21(gl_WorldRayOriginNV):     20(ptr) Variable Input
+24(gl_WorldRayDirectionNV):     20(ptr) Variable Input
+27(gl_ObjectRayOriginNV):     20(ptr) Variable Input
+30(gl_ObjectRayDirectionNV):     20(ptr) Variable Input
+              32:             TypePointer Function 16(float)
+              34:             TypePointer Input 16(float)
+35(gl_RayTminNV):     34(ptr) Variable Input
+38(gl_RayTmaxNV):     34(ptr) Variable Input
+              40:             TypeAccelerationStructureNV
+              41:             TypePointer UniformConstant 40
+       42(accNV):     41(ptr) Variable UniformConstant
+              44:      6(int) Constant 0
+              45:      6(int) Constant 1
+              46:      6(int) Constant 2
+              47:      6(int) Constant 3
+              48:   16(float) Constant 1056964608
+              49:   17(fvec3) ConstantComposite 48 48 48
+              50:   16(float) Constant 1065353216
+              51:   17(fvec3) ConstantComposite 50 50 50
+              52:   16(float) Constant 1061158912
+              53:             TypeInt 32 1
+              54:     53(int) Constant 1
+              55:             TypeVector 16(float) 4
+              56:             TypePointer RayPayloadNV 55(fvec4)
+57(localPayload):     56(ptr) Variable RayPayloadNV
+              58:             TypePointer IncomingRayPayloadNV 55(fvec4)
+59(incomingPayload):     58(ptr) Variable IncomingRayPayloadNV
+         4(main):           2 Function None 3
+               5:             Label
+           9(v0):      8(ptr) Variable Function
+          13(v1):      8(ptr) Variable Function
+          19(v2):     18(ptr) Variable Function
+          23(v3):     18(ptr) Variable Function
+          26(v4):     18(ptr) Variable Function
+          29(v5):     18(ptr) Variable Function
+          33(v6):     32(ptr) Variable Function
+          37(v7):     32(ptr) Variable Function
+              12:    7(ivec3) Load 11(gl_LaunchIDNV)
+                              Store 9(v0) 12
+              15:    7(ivec3) Load 14(gl_LaunchSizeNV)
+                              Store 13(v1) 15
+              22:   17(fvec3) Load 21(gl_WorldRayOriginNV)
+                              Store 19(v2) 22
+              25:   17(fvec3) Load 24(gl_WorldRayDirectionNV)
+                              Store 23(v3) 25
+              28:   17(fvec3) Load 27(gl_ObjectRayOriginNV)
+                              Store 26(v4) 28
+              31:   17(fvec3) Load 30(gl_ObjectRayDirectionNV)
+                              Store 29(v5) 31
+              36:   16(float) Load 35(gl_RayTminNV)
+                              Store 33(v6) 36
+              39:   16(float) Load 38(gl_RayTmaxNV)
+                              Store 37(v7) 39
+              43:          40 Load 42(accNV)
+                              TraceNV 43 44 45 46 47 44 49 48 51 52 54
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.MissShader_Errors.rmiss.out b/Test/baseResults/spv.MissShader_Errors.rmiss.out
new file mode 100644
index 0000000..52b412b
--- /dev/null
+++ b/Test/baseResults/spv.MissShader_Errors.rmiss.out
@@ -0,0 +1,21 @@
+spv.MissShader_Errors.rmiss
+ERROR: 0:3: 'hitAttributeNV' : not supported in this stage: miss
+ERROR: 0:6: 'gl_PrimitiveID' : undeclared identifier 
+ERROR: 0:6: '=' :  cannot convert from ' temp float' to ' temp highp int'
+ERROR: 0:7: 'gl_InstanceID' : undeclared identifier (Did you mean gl_InstanceIndex?)
+ERROR: 0:7: '=' :  cannot convert from ' temp float' to ' temp highp int'
+ERROR: 0:8: 'gl_InstanceCustomIndexNV' : undeclared identifier 
+ERROR: 0:8: '=' :  cannot convert from ' temp float' to ' temp highp int'
+ERROR: 0:9: 'gl_ObjectToWorldNV' : undeclared identifier 
+ERROR: 0:9: '=' :  cannot convert from ' temp float' to ' temp highp 4X3 matrix of float'
+ERROR: 0:10: 'gl_WorldToObjectNV' : undeclared identifier 
+ERROR: 0:10: '=' :  cannot convert from ' temp float' to ' temp highp 4X3 matrix of float'
+ERROR: 0:11: 'gl_HitTNV' : undeclared identifier 
+ERROR: 0:12: 'gl_HitKindNV' : undeclared identifier 
+ERROR: 0:13: 'reportIntersectionNV' : no matching overloaded function found 
+ERROR: 0:14: 'ignoreIntersectionNV' : no matching overloaded function found 
+ERROR: 0:15: 'terminateRayNV' : no matching overloaded function found 
+ERROR: 16 compilation errors.  No code generated.
+
+
+SPIR-V is not generated for failed compile or link
diff --git a/Test/baseResults/spv.OVR_multiview.vert.out b/Test/baseResults/spv.OVR_multiview.vert.out
new file mode 100644
index 0000000..7013ced
--- /dev/null
+++ b/Test/baseResults/spv.OVR_multiview.vert.out
@@ -0,0 +1,57 @@
+spv.OVR_multiview.vert
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 27
+
+                              Capability Shader
+                              Capability MultiView
+                              Extension  "SPV_KHR_multiview"
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Vertex 4  "main" 13 17 25 26
+                              Source GLSL 330
+                              SourceExtension  "GL_OVR_multiview"
+                              Name 4  "main"
+                              Name 11  "gl_PerVertex"
+                              MemberName 11(gl_PerVertex) 0  "gl_Position"
+                              MemberName 11(gl_PerVertex) 1  "gl_PointSize"
+                              MemberName 11(gl_PerVertex) 2  "gl_ClipDistance"
+                              Name 13  ""
+                              Name 17  "gl_ViewID_OVR"
+                              Name 25  "gl_VertexID"
+                              Name 26  "gl_InstanceID"
+                              MemberDecorate 11(gl_PerVertex) 0 BuiltIn Position
+                              MemberDecorate 11(gl_PerVertex) 1 BuiltIn PointSize
+                              MemberDecorate 11(gl_PerVertex) 2 BuiltIn ClipDistance
+                              Decorate 11(gl_PerVertex) Block
+                              Decorate 17(gl_ViewID_OVR) BuiltIn ViewIndex
+                              Decorate 25(gl_VertexID) BuiltIn VertexId
+                              Decorate 26(gl_InstanceID) BuiltIn InstanceId
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+               8:             TypeInt 32 0
+               9:      8(int) Constant 1
+              10:             TypeArray 6(float) 9
+11(gl_PerVertex):             TypeStruct 7(fvec4) 6(float) 10
+              12:             TypePointer Output 11(gl_PerVertex)
+              13:     12(ptr) Variable Output
+              14:             TypeInt 32 1
+              15:     14(int) Constant 0
+              16:             TypePointer Input 8(int)
+17(gl_ViewID_OVR):     16(ptr) Variable Input
+              20:    6(float) Constant 0
+              22:             TypePointer Output 7(fvec4)
+              24:             TypePointer Input 14(int)
+ 25(gl_VertexID):     24(ptr) Variable Input
+26(gl_InstanceID):     24(ptr) Variable Input
+         4(main):           2 Function None 3
+               5:             Label
+              18:      8(int) Load 17(gl_ViewID_OVR)
+              19:    6(float) ConvertUToF 18
+              21:    7(fvec4) CompositeConstruct 19 20 20 20
+              23:     22(ptr) AccessChain 13 15
+                              Store 23 21
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.Operations.frag.out b/Test/baseResults/spv.Operations.frag.out
old mode 100755
new mode 100644
index aeee253..4113ddf
--- a/Test/baseResults/spv.Operations.frag.out
+++ b/Test/baseResults/spv.Operations.frag.out
@@ -1,8 +1,6 @@
 spv.Operations.frag
-Warning, version 450 is not yet complete; most version-specific features are present, but some are missing.
-
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 532
 
                               Capability Shader
@@ -92,10 +90,10 @@
           188(f):    143(ptr) Variable Function
           285(u):    284(ptr) Variable Function
           305(b):    304(ptr) Variable Function
-             486:      8(ptr) Variable Function
+             487:      8(ptr) Variable Function
          503(m1):    502(ptr) Variable Function
          510(m2):    502(ptr) Variable Function
-             513:    502(ptr) Variable Function
+             514:    502(ptr) Variable Function
               12:    7(fvec4) Load 11(uv4)
               13:    7(fvec4) ExtInst 1(GLSL.std.450) 11(Radians) 12
                               Store 9(v) 13
@@ -660,9 +658,9 @@
              482:   178(bool) Load 305(b)
              483:   178(bool) LogicalNot 482
                               Store 305(b) 483
-             487:   178(bool) Load 305(b)
+             486:   178(bool) Load 305(b)
                               SelectionMerge 489 None
-                              BranchConditional 487 488 498
+                              BranchConditional 486 488 498
              488:               Label
              490:     18(int)   Load 20(i)
              491:    6(float)   ConvertSToF 490
@@ -672,30 +670,30 @@
              495:    7(fvec4)   FAdd 492 494
              496:    7(fvec4)   Load 9(v)
              497:    7(fvec4)   FAdd 495 496
-                                Store 486 497
+                                Store 487 497
                                 Branch 489
              498:               Label
              499:    7(fvec4)   Load 9(v)
-                                Store 486 499
+                                Store 487 499
                                 Branch 489
              489:             Label
-             500:    7(fvec4) Load 486
+             500:    7(fvec4) Load 487
                               Store 485(FragColor) 500
                               Store 503(m1) 509
                               Store 510(m2) 512
-             514:   178(bool) Load 305(b)
+             513:   178(bool) Load 305(b)
                               SelectionMerge 516 None
-                              BranchConditional 514 515 518
+                              BranchConditional 513 515 518
              515:               Label
              517:         501   Load 503(m1)
-                                Store 513 517
+                                Store 514 517
                                 Branch 516
              518:               Label
              519:         501   Load 510(m2)
-                                Store 513 519
+                                Store 514 519
                                 Branch 516
              516:             Label
-             520:      8(ptr) AccessChain 513 405
+             520:      8(ptr) AccessChain 514 405
              521:    7(fvec4) Load 520
              522:    7(fvec4) Load 485(FragColor)
              523:    7(fvec4) FAdd 522 521
diff --git a/Test/baseResults/spv.RayCallable.rcall.out b/Test/baseResults/spv.RayCallable.rcall.out
new file mode 100644
index 0000000..198d686
--- /dev/null
+++ b/Test/baseResults/spv.RayCallable.rcall.out
@@ -0,0 +1,73 @@
+spv.RayCallable.rcall
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 38
+
+                              Capability RayTracingNV
+                              Extension  "SPV_NV_ray_tracing"
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint CallableNV 4  "main" 11 14 19
+                              Source GLSL 460
+                              SourceExtension  "GL_NV_ray_tracing"
+                              Name 4  "main"
+                              Name 9  "id"
+                              Name 11  "gl_LaunchIDNV"
+                              Name 13  "size"
+                              Name 14  "gl_LaunchSizeNV"
+                              Name 17  "curFlags"
+                              Name 19  "gl_IncomingRayFlagsNV"
+                              Name 24  "dataBlock"
+                              MemberName 24(dataBlock) 0  "data1"
+                              Name 26  ""
+                              Name 37  "data0"
+                              Decorate 11(gl_LaunchIDNV) BuiltIn LaunchIdNV
+                              Decorate 14(gl_LaunchSizeNV) BuiltIn LaunchSizeNV
+                              Decorate 19(gl_IncomingRayFlagsNV) BuiltIn IncomingRayFlagsNV
+                              Decorate 24(dataBlock) Block
+                              Decorate 26 Location 1
+                              Decorate 37(data0) Location 0
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeInt 32 0
+               7:             TypeVector 6(int) 3
+               8:             TypePointer Function 7(ivec3)
+              10:             TypePointer Input 7(ivec3)
+11(gl_LaunchIDNV):     10(ptr) Variable Input
+14(gl_LaunchSizeNV):     10(ptr) Variable Input
+              16:             TypePointer Function 6(int)
+              18:             TypePointer Input 6(int)
+19(gl_IncomingRayFlagsNV):     18(ptr) Variable Input
+              22:      6(int) Constant 1
+   24(dataBlock):             TypeStruct 6(int)
+              25:             TypePointer IncomingCallableDataNV 24(dataBlock)
+              26:     25(ptr) Variable IncomingCallableDataNV
+              27:             TypeInt 32 1
+              28:     27(int) Constant 0
+              29:      6(int) Constant 256
+              30:             TypePointer IncomingCallableDataNV 6(int)
+              32:      6(int) Constant 2
+              33:     27(int) Constant 1
+              34:             TypeFloat 32
+              35:             TypeVector 34(float) 4
+              36:             TypePointer CallableDataNV 35(fvec4)
+       37(data0):     36(ptr) Variable CallableDataNV
+         4(main):           2 Function None 3
+               5:             Label
+           9(id):      8(ptr) Variable Function
+        13(size):      8(ptr) Variable Function
+    17(curFlags):     16(ptr) Variable Function
+              12:    7(ivec3) Load 11(gl_LaunchIDNV)
+                              Store 9(id) 12
+              15:    7(ivec3) Load 14(gl_LaunchSizeNV)
+                              Store 13(size) 15
+              20:      6(int) Load 19(gl_IncomingRayFlagsNV)
+                              Store 17(curFlags) 20
+              21:      6(int) Load 17(curFlags)
+              23:      6(int) BitwiseAnd 21 22
+                              Store 17(curFlags) 23
+              31:     30(ptr) AccessChain 26 28
+                              Store 31 29
+                              ExecuteCallableNV 32 33
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.RayCallable_Errors.rcall.out b/Test/baseResults/spv.RayCallable_Errors.rcall.out
new file mode 100644
index 0000000..a807a57
--- /dev/null
+++ b/Test/baseResults/spv.RayCallable_Errors.rcall.out
@@ -0,0 +1,33 @@
+spv.RayCallable_Errors.rcall
+ERROR: 0:3: 'hitAttributeNV' : not supported in this stage: callable
+ERROR: 0:4: 'rayPayloadNV' : not supported in this stage: callable
+ERROR: 0:5: 'rayPayloadInNV' : not supported in this stage: callable
+ERROR: 0:9: 'gl_PrimitiveID' : undeclared identifier 
+ERROR: 0:9: '=' :  cannot convert from ' temp float' to ' temp highp int'
+ERROR: 0:10: 'gl_InstanceID' : undeclared identifier (Did you mean gl_InstanceIndex?)
+ERROR: 0:10: '=' :  cannot convert from ' temp float' to ' temp highp int'
+ERROR: 0:11: 'gl_InstanceCustomIndexNV' : undeclared identifier 
+ERROR: 0:11: '=' :  cannot convert from ' temp float' to ' temp highp int'
+ERROR: 0:12: 'gl_WorldRayOriginNV' : undeclared identifier 
+ERROR: 0:12: '=' :  cannot convert from ' temp float' to ' temp highp 3-component vector of float'
+ERROR: 0:13: 'gl_WorldRayDirectionNV' : undeclared identifier 
+ERROR: 0:13: '=' :  cannot convert from ' temp float' to ' temp highp 3-component vector of float'
+ERROR: 0:14: 'gl_ObjectRayOriginNV' : undeclared identifier 
+ERROR: 0:14: '=' :  cannot convert from ' temp float' to ' temp highp 3-component vector of float'
+ERROR: 0:15: 'gl_ObjectRayDirectionNV' : undeclared identifier 
+ERROR: 0:15: '=' :  cannot convert from ' temp float' to ' temp highp 3-component vector of float'
+ERROR: 0:16: 'gl_RayTminNV' : undeclared identifier 
+ERROR: 0:17: 'gl_RayTmaxNV' : undeclared identifier 
+ERROR: 0:18: 'gl_ObjectToWorldNV' : undeclared identifier 
+ERROR: 0:18: '=' :  cannot convert from ' temp float' to ' temp highp 4X3 matrix of float'
+ERROR: 0:19: 'gl_WorldToObjectNV' : undeclared identifier 
+ERROR: 0:19: '=' :  cannot convert from ' temp float' to ' temp highp 4X3 matrix of float'
+ERROR: 0:20: 'gl_HitTNV' : undeclared identifier 
+ERROR: 0:21: 'gl_HitKindNV' : undeclared identifier 
+ERROR: 0:22: 'reportIntersectionNV' : no matching overloaded function found 
+ERROR: 0:23: 'ignoreIntersectionNV' : no matching overloaded function found 
+ERROR: 0:24: 'terminateRayNV' : no matching overloaded function found 
+ERROR: 28 compilation errors.  No code generated.
+
+
+SPIR-V is not generated for failed compile or link
diff --git a/Test/baseResults/spv.RayConstants.rgen.out b/Test/baseResults/spv.RayConstants.rgen.out
new file mode 100644
index 0000000..d939acf
--- /dev/null
+++ b/Test/baseResults/spv.RayConstants.rgen.out
@@ -0,0 +1,46 @@
+spv.RayConstants.rgen
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 27
+
+                              Capability RayTracingNV
+                              Extension  "SPV_NV_ray_tracing"
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint RayGenerationNV 4  "main"
+                              Source GLSL 460
+                              SourceExtension  "GL_NV_ray_tracing"
+                              Name 4  "main"
+                              Name 8  "accNV"
+                              Name 26  "payload"
+                              Decorate 8(accNV) DescriptorSet 0
+                              Decorate 8(accNV) Binding 0
+                              Decorate 26(payload) Location 0
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeAccelerationStructureNV
+               7:             TypePointer UniformConstant 6
+        8(accNV):      7(ptr) Variable UniformConstant
+              10:             TypeInt 32 0
+              11:     10(int) Constant 255
+              12:     10(int) Constant 0
+              13:     10(int) Constant 1
+              14:             TypeFloat 32
+              15:             TypeVector 14(float) 3
+              16:   14(float) Constant 0
+              17:   15(fvec3) ConstantComposite 16 16 16
+              18:   14(float) Constant 1056964608
+              19:   14(float) Constant 1065353216
+              20:   15(fvec3) ConstantComposite 19 19 19
+              21:   14(float) Constant 1061158912
+              22:             TypeInt 32 1
+              23:     22(int) Constant 1
+              24:             TypeVector 14(float) 4
+              25:             TypePointer RayPayloadNV 24(fvec4)
+     26(payload):     25(ptr) Variable RayPayloadNV
+         4(main):           2 Function None 3
+               5:             Label
+               9:           6 Load 8(accNV)
+                              TraceNV 9 11 12 13 13 12 17 18 20 21 23
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.RayGenShader.rgen.out b/Test/baseResults/spv.RayGenShader.rgen.out
new file mode 100644
index 0000000..db6ecfc
--- /dev/null
+++ b/Test/baseResults/spv.RayGenShader.rgen.out
@@ -0,0 +1,101 @@
+spv.RayGenShader.rgen
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 60
+
+                              Capability RayTracingNV
+                              Extension  "SPV_NV_ray_tracing"
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint RayGenerationNV 4  "main" 11 21
+                              Source GLSL 460
+                              SourceExtension  "GL_NV_ray_tracing"
+                              Name 4  "main"
+                              Name 8  "lx"
+                              Name 11  "gl_LaunchIDNV"
+                              Name 16  "ly"
+                              Name 20  "sx"
+                              Name 21  "gl_LaunchSizeNV"
+                              Name 24  "sy"
+                              Name 29  "accNV"
+                              Name 48  "block"
+                              MemberName 48(block) 0  "arr"
+                              MemberName 48(block) 1  "pad"
+                              Name 50  ""
+                              Name 56  "payload"
+                              Decorate 11(gl_LaunchIDNV) BuiltIn LaunchIdNV
+                              Decorate 21(gl_LaunchSizeNV) BuiltIn LaunchSizeNV
+                              Decorate 29(accNV) DescriptorSet 0
+                              Decorate 29(accNV) Binding 0
+                              Decorate 46 ArrayStride 4
+                              MemberDecorate 48(block) 0 Offset 0
+                              MemberDecorate 48(block) 1 Offset 16
+                              Decorate 48(block) BufferBlock
+                              Decorate 56(payload) Location 0
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeInt 32 0
+               7:             TypePointer Function 6(int)
+               9:             TypeVector 6(int) 3
+              10:             TypePointer Input 9(ivec3)
+11(gl_LaunchIDNV):     10(ptr) Variable Input
+              12:      6(int) Constant 0
+              13:             TypePointer Input 6(int)
+              17:      6(int) Constant 1
+21(gl_LaunchSizeNV):     10(ptr) Variable Input
+              27:             TypeAccelerationStructureNV
+              28:             TypePointer UniformConstant 27
+       29(accNV):     28(ptr) Variable UniformConstant
+              35:             TypeFloat 32
+              36:             TypeVector 35(float) 3
+              37:   35(float) Constant 0
+              38:   36(fvec3) ConstantComposite 37 37 37
+              39:   35(float) Constant 1056964608
+              40:   35(float) Constant 1065353216
+              41:   36(fvec3) ConstantComposite 40 40 40
+              42:   35(float) Constant 1061158912
+              43:             TypeInt 32 1
+              44:     43(int) Constant 1
+              45:      6(int) Constant 4
+              46:             TypeArray 35(float) 45
+              47:             TypeVector 35(float) 4
+       48(block):             TypeStruct 46 47(fvec4)
+              49:             TypePointer ShaderRecordBufferNV 48(block)
+              50:     49(ptr) Variable ShaderRecordBufferNV
+              51:     43(int) Constant 0
+              52:     43(int) Constant 3
+              53:             TypePointer ShaderRecordBufferNV 35(float)
+              55:             TypePointer RayPayloadNV 47(fvec4)
+     56(payload):     55(ptr) Variable RayPayloadNV
+              58:             TypePointer ShaderRecordBufferNV 47(fvec4)
+         4(main):           2 Function None 3
+               5:             Label
+           8(lx):      7(ptr) Variable Function
+          16(ly):      7(ptr) Variable Function
+          20(sx):      7(ptr) Variable Function
+          24(sy):      7(ptr) Variable Function
+              14:     13(ptr) AccessChain 11(gl_LaunchIDNV) 12
+              15:      6(int) Load 14
+                              Store 8(lx) 15
+              18:     13(ptr) AccessChain 11(gl_LaunchIDNV) 17
+              19:      6(int) Load 18
+                              Store 16(ly) 19
+              22:     13(ptr) AccessChain 21(gl_LaunchSizeNV) 12
+              23:      6(int) Load 22
+                              Store 20(sx) 23
+              25:     13(ptr) AccessChain 21(gl_LaunchSizeNV) 17
+              26:      6(int) Load 25
+                              Store 24(sy) 26
+              30:          27 Load 29(accNV)
+              31:      6(int) Load 8(lx)
+              32:      6(int) Load 16(ly)
+              33:      6(int) Load 20(sx)
+              34:      6(int) Load 24(sy)
+                              TraceNV 30 31 32 33 34 12 38 39 41 42 44
+              54:     53(ptr) AccessChain 50 51 52
+                              Store 54 40
+              57:   47(fvec4) Load 56(payload)
+              59:     58(ptr) AccessChain 50 44
+                              Store 59 57
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.RayGenShader_Errors.rgen.out b/Test/baseResults/spv.RayGenShader_Errors.rgen.out
new file mode 100644
index 0000000..27d51c2
--- /dev/null
+++ b/Test/baseResults/spv.RayGenShader_Errors.rgen.out
@@ -0,0 +1,39 @@
+spv.RayGenShader_Errors.rgen
+ERROR: 0:3: 'hitAttributeNV' : not supported in this stage: ray-generation
+ERROR: 0:4: 'rayPayloadInNV' : not supported in this stage: ray-generation
+ERROR: 0:5: 'shaderRecordNV' : can only be used with a buffer 
+ERROR: 0:9: 'binding' : cannot be used with shaderRecordNV 
+ERROR: 0:12: 'set' : cannot be used with shaderRecordNV 
+ERROR: 0:23: 'accelerationStructureNV' : accelerationStructureNV can only be used in uniform variables or function parameters: a
+ERROR: 0:23: '=' :  cannot convert from ' const int' to ' temp accelerationStructureNV'
+ERROR: 0:24: 'gl_PrimitiveID' : undeclared identifier 
+ERROR: 0:24: '=' :  cannot convert from ' temp float' to ' temp highp int'
+ERROR: 0:25: 'gl_InstanceID' : undeclared identifier (Did you mean gl_InstanceIndex?)
+ERROR: 0:25: '=' :  cannot convert from ' temp float' to ' temp highp int'
+ERROR: 0:26: 'gl_InstanceCustomIndexNV' : undeclared identifier 
+ERROR: 0:26: '=' :  cannot convert from ' temp float' to ' temp highp int'
+ERROR: 0:27: 'gl_WorldRayOriginNV' : undeclared identifier 
+ERROR: 0:27: '=' :  cannot convert from ' temp float' to ' temp highp 3-component vector of float'
+ERROR: 0:28: 'gl_WorldRayDirectionNV' : undeclared identifier 
+ERROR: 0:28: '=' :  cannot convert from ' temp float' to ' temp highp 3-component vector of float'
+ERROR: 0:29: 'gl_ObjectRayOriginNV' : undeclared identifier 
+ERROR: 0:29: '=' :  cannot convert from ' temp float' to ' temp highp 3-component vector of float'
+ERROR: 0:30: 'gl_ObjectRayDirectionNV' : undeclared identifier 
+ERROR: 0:30: '=' :  cannot convert from ' temp float' to ' temp highp 3-component vector of float'
+ERROR: 0:31: 'gl_RayTminNV' : undeclared identifier 
+ERROR: 0:32: 'gl_RayTmaxNV' : undeclared identifier 
+ERROR: 0:33: 'gl_ObjectToWorldNV' : undeclared identifier 
+ERROR: 0:33: '=' :  cannot convert from ' temp float' to ' temp highp 4X3 matrix of float'
+ERROR: 0:34: 'gl_WorldToObjectNV' : undeclared identifier 
+ERROR: 0:34: '=' :  cannot convert from ' temp float' to ' temp highp 4X3 matrix of float'
+ERROR: 0:35: 'gl_HitTNV' : undeclared identifier 
+ERROR: 0:36: 'gl_HitKindNV' : undeclared identifier 
+ERROR: 0:37: 'reportIntersectionNV' : no matching overloaded function found 
+ERROR: 0:38: 'ignoreIntersectionNV' : no matching overloaded function found 
+ERROR: 0:39: 'terminateRayNV' : no matching overloaded function found 
+ERROR: 32 compilation errors.  No code generated.
+
+
+ERROR: Linking ray-generation stage: Only one shaderRecordNV buffer block is allowed per stage
+
+SPIR-V is not generated for failed compile or link
diff --git a/Test/baseResults/spv.accessChain.frag.out b/Test/baseResults/spv.accessChain.frag.out
old mode 100755
new mode 100644
index b319cfd..bf87829
--- a/Test/baseResults/spv.accessChain.frag.out
+++ b/Test/baseResults/spv.accessChain.frag.out
@@ -1,14 +1,12 @@
 spv.accessChain.frag
-Warning, version 420 is not yet complete; most version-specific features are present, but some are missing.
-
 // Module Version 10000
-// Generated by (magic number): 80001
-// Id's are bound by 206
+// Generated by (magic number): 80007
+// Id's are bound by 222
 
                               Capability Shader
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "main" 65 158
+                              EntryPoint Fragment 4  "main" 69 170
                               ExecutionMode 4 OriginUpperLeft
                               Source GLSL 420
                               Name 4  "main"
@@ -52,12 +50,12 @@
                               Name 62  "GetColor13(struct-S-vf31;i1;"
                               Name 60  "i"
                               Name 61  "comp"
-                              Name 65  "OutColor"
-                              Name 153  "s"
-                              Name 158  "u"
-                              Name 159  "param"
-                              Name 163  "param"
-                              Name 167  "param"
+                              Name 66  "GetColor14(struct-S-vf31;i1;"
+                              Name 64  "i"
+                              Name 65  "comp"
+                              Name 69  "OutColor"
+                              Name 165  "s"
+                              Name 170  "u"
                               Name 171  "param"
                               Name 175  "param"
                               Name 179  "param"
@@ -67,8 +65,12 @@
                               Name 195  "param"
                               Name 199  "param"
                               Name 203  "param"
-                              Decorate 65(OutColor) Location 0
-                              Decorate 158(u) Flat
+                              Name 207  "param"
+                              Name 211  "param"
+                              Name 215  "param"
+                              Name 219  "param"
+                              Decorate 69(OutColor) Location 0
+                              Decorate 170(u) Flat
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -78,25 +80,27 @@
               13:             TypeInt 32 1
               14:             TypePointer Function 13(int)
               15:             TypeFunction 2 8(S) 14(ptr)
-              64:             TypePointer Output 7(fvec3)
-    65(OutColor):     64(ptr) Variable Output
-              66:     13(int) Constant 0
-              67:             TypeInt 32 0
-              68:     67(int) Constant 0
-              95:             TypeVector 6(float) 2
-             109:     67(int) Constant 2
-             136:             TypePointer Output 6(float)
-             150:    6(float) Constant 0
-             151:    7(fvec3) ConstantComposite 150 150 150
-             152:             TypePointer Function 8(S)
-             157:             TypePointer Input 13(int)
-          158(u):    157(ptr) Variable Input
+              68:             TypePointer Output 7(fvec3)
+    69(OutColor):     68(ptr) Variable Output
+              70:     13(int) Constant 0
+              71:             TypeInt 32 0
+              72:     71(int) Constant 0
+              99:             TypeVector 6(float) 2
+             113:     71(int) Constant 2
+             140:             TypePointer Output 6(float)
+             147:     71(int) Constant 1
+             148:             TypeVector 71(int) 2
+             149:  148(ivec2) ConstantComposite 113 147
+             158:             TypeVector 71(int) 3
+             159:  158(ivec3) ConstantComposite 113 147 72
+             162:    6(float) Constant 0
+             163:    7(fvec3) ConstantComposite 162 162 162
+             164:             TypePointer Function 8(S)
+             169:             TypePointer Input 13(int)
+          170(u):    169(ptr) Variable Input
          4(main):           2 Function None 3
                5:             Label
-          153(s):    152(ptr) Variable Function
-      159(param):     14(ptr) Variable Function
-      163(param):     14(ptr) Variable Function
-      167(param):     14(ptr) Variable Function
+          165(s):    164(ptr) Variable Function
       171(param):     14(ptr) Variable Function
       175(param):     14(ptr) Variable Function
       179(param):     14(ptr) Variable Function
@@ -106,224 +110,242 @@
       195(param):     14(ptr) Variable Function
       199(param):     14(ptr) Variable Function
       203(param):     14(ptr) Variable Function
-                              Store 65(OutColor) 151
-             154:        8(S) Load 153(s)
-             155:           2 FunctionCall 11(GetColor1(struct-S-vf31;) 154
-             156:        8(S) Load 153(s)
-             160:     13(int) Load 158(u)
-                              Store 159(param) 160
-             161:           2 FunctionCall 18(GetColor2(struct-S-vf31;i1;) 156 159(param)
-             162:        8(S) Load 153(s)
-             164:     13(int) Load 158(u)
-                              Store 163(param) 164
-             165:           2 FunctionCall 22(GetColor3(struct-S-vf31;i1;) 162 163(param)
-             166:        8(S) Load 153(s)
-             168:     13(int) Load 158(u)
-                              Store 167(param) 168
-             169:           2 FunctionCall 26(GetColor4(struct-S-vf31;i1;) 166 167(param)
-             170:        8(S) Load 153(s)
-             172:     13(int) Load 158(u)
+      207(param):     14(ptr) Variable Function
+      211(param):     14(ptr) Variable Function
+      215(param):     14(ptr) Variable Function
+      219(param):     14(ptr) Variable Function
+                              Store 69(OutColor) 163
+             166:        8(S) Load 165(s)
+             167:           2 FunctionCall 11(GetColor1(struct-S-vf31;) 166
+             168:        8(S) Load 165(s)
+             172:     13(int) Load 170(u)
                               Store 171(param) 172
-             173:           2 FunctionCall 30(GetColor5(struct-S-vf31;i1;) 170 171(param)
-             174:        8(S) Load 153(s)
-             176:     13(int) Load 158(u)
+             173:           2 FunctionCall 18(GetColor2(struct-S-vf31;i1;) 168 171(param)
+             174:        8(S) Load 165(s)
+             176:     13(int) Load 170(u)
                               Store 175(param) 176
-             177:           2 FunctionCall 34(GetColor6(struct-S-vf31;i1;) 174 175(param)
-             178:        8(S) Load 153(s)
-             180:     13(int) Load 158(u)
+             177:           2 FunctionCall 22(GetColor3(struct-S-vf31;i1;) 174 175(param)
+             178:        8(S) Load 165(s)
+             180:     13(int) Load 170(u)
                               Store 179(param) 180
-             181:           2 FunctionCall 38(GetColor7(struct-S-vf31;i1;) 178 179(param)
-             182:        8(S) Load 153(s)
-             184:     13(int) Load 158(u)
+             181:           2 FunctionCall 26(GetColor4(struct-S-vf31;i1;) 178 179(param)
+             182:        8(S) Load 165(s)
+             184:     13(int) Load 170(u)
                               Store 183(param) 184
-             185:           2 FunctionCall 42(GetColor8(struct-S-vf31;i1;) 182 183(param)
-             186:        8(S) Load 153(s)
-             188:     13(int) Load 158(u)
+             185:           2 FunctionCall 30(GetColor5(struct-S-vf31;i1;) 182 183(param)
+             186:        8(S) Load 165(s)
+             188:     13(int) Load 170(u)
                               Store 187(param) 188
-             189:           2 FunctionCall 46(GetColor9(struct-S-vf31;i1;) 186 187(param)
-             190:        8(S) Load 153(s)
-             192:     13(int) Load 158(u)
+             189:           2 FunctionCall 34(GetColor6(struct-S-vf31;i1;) 186 187(param)
+             190:        8(S) Load 165(s)
+             192:     13(int) Load 170(u)
                               Store 191(param) 192
-             193:           2 FunctionCall 50(GetColor10(struct-S-vf31;i1;) 190 191(param)
-             194:        8(S) Load 153(s)
-             196:     13(int) Load 158(u)
+             193:           2 FunctionCall 38(GetColor7(struct-S-vf31;i1;) 190 191(param)
+             194:        8(S) Load 165(s)
+             196:     13(int) Load 170(u)
                               Store 195(param) 196
-             197:           2 FunctionCall 54(GetColor11(struct-S-vf31;i1;) 194 195(param)
-             198:        8(S) Load 153(s)
-             200:     13(int) Load 158(u)
+             197:           2 FunctionCall 42(GetColor8(struct-S-vf31;i1;) 194 195(param)
+             198:        8(S) Load 165(s)
+             200:     13(int) Load 170(u)
                               Store 199(param) 200
-             201:           2 FunctionCall 58(GetColor12(struct-S-vf31;i1;) 198 199(param)
-             202:        8(S) Load 153(s)
-             204:     13(int) Load 158(u)
+             201:           2 FunctionCall 46(GetColor9(struct-S-vf31;i1;) 198 199(param)
+             202:        8(S) Load 165(s)
+             204:     13(int) Load 170(u)
                               Store 203(param) 204
-             205:           2 FunctionCall 62(GetColor13(struct-S-vf31;i1;) 202 203(param)
+             205:           2 FunctionCall 50(GetColor10(struct-S-vf31;i1;) 202 203(param)
+             206:        8(S) Load 165(s)
+             208:     13(int) Load 170(u)
+                              Store 207(param) 208
+             209:           2 FunctionCall 54(GetColor11(struct-S-vf31;i1;) 206 207(param)
+             210:        8(S) Load 165(s)
+             212:     13(int) Load 170(u)
+                              Store 211(param) 212
+             213:           2 FunctionCall 58(GetColor12(struct-S-vf31;i1;) 210 211(param)
+             214:        8(S) Load 165(s)
+             216:     13(int) Load 170(u)
+                              Store 215(param) 216
+             217:           2 FunctionCall 62(GetColor13(struct-S-vf31;i1;) 214 215(param)
+             218:        8(S) Load 165(s)
+             220:     13(int) Load 170(u)
+                              Store 219(param) 220
+             221:           2 FunctionCall 66(GetColor14(struct-S-vf31;i1;) 218 219(param)
                               Return
                               FunctionEnd
 11(GetColor1(struct-S-vf31;):           2 Function None 9
            10(i):        8(S) FunctionParameter
               12:             Label
-              69:    6(float) CompositeExtract 10(i) 0 0
-              70:    7(fvec3) Load 65(OutColor)
-              71:    7(fvec3) CompositeConstruct 69 69 69
-              72:    7(fvec3) FAdd 70 71
-                              Store 65(OutColor) 72
+              73:    6(float) CompositeExtract 10(i) 0 0
+              74:    7(fvec3) Load 69(OutColor)
+              75:    7(fvec3) CompositeConstruct 73 73 73
+              76:    7(fvec3) FAdd 74 75
+                              Store 69(OutColor) 76
                               Return
                               FunctionEnd
 18(GetColor2(struct-S-vf31;i1;):           2 Function None 15
            16(i):        8(S) FunctionParameter
         17(comp):     14(ptr) FunctionParameter
               19:             Label
-              73:     13(int) Load 17(comp)
-              74:    7(fvec3) CompositeExtract 16(i) 0
-              75:    6(float) VectorExtractDynamic 74 73
-              76:    7(fvec3) Load 65(OutColor)
-              77:    7(fvec3) CompositeConstruct 75 75 75
-              78:    7(fvec3) FAdd 76 77
-                              Store 65(OutColor) 78
+              77:     13(int) Load 17(comp)
+              78:    7(fvec3) CompositeExtract 16(i) 0
+              79:    6(float) VectorExtractDynamic 78 77
+              80:    7(fvec3) Load 69(OutColor)
+              81:    7(fvec3) CompositeConstruct 79 79 79
+              82:    7(fvec3) FAdd 80 81
+                              Store 69(OutColor) 82
                               Return
                               FunctionEnd
 22(GetColor3(struct-S-vf31;i1;):           2 Function None 15
            20(i):        8(S) FunctionParameter
         21(comp):     14(ptr) FunctionParameter
               23:             Label
-              79:     13(int) Load 21(comp)
-              80:    7(fvec3) CompositeExtract 20(i) 0
-              81:    6(float) VectorExtractDynamic 80 79
-              82:    7(fvec3) Load 65(OutColor)
-              83:    7(fvec3) CompositeConstruct 81 81 81
-              84:    7(fvec3) FAdd 82 83
-                              Store 65(OutColor) 84
+              83:     13(int) Load 21(comp)
+              84:    7(fvec3) CompositeExtract 20(i) 0
+              85:    6(float) VectorExtractDynamic 84 83
+              86:    7(fvec3) Load 69(OutColor)
+              87:    7(fvec3) CompositeConstruct 85 85 85
+              88:    7(fvec3) FAdd 86 87
+                              Store 69(OutColor) 88
                               Return
                               FunctionEnd
 26(GetColor4(struct-S-vf31;i1;):           2 Function None 15
            24(i):        8(S) FunctionParameter
         25(comp):     14(ptr) FunctionParameter
               27:             Label
-              85:     13(int) Load 25(comp)
-              86:    7(fvec3) CompositeExtract 24(i) 0
-              87:    6(float) VectorExtractDynamic 86 85
-              88:    7(fvec3) Load 65(OutColor)
-              89:    7(fvec3) CompositeConstruct 87 87 87
-              90:    7(fvec3) FAdd 88 89
-                              Store 65(OutColor) 90
+              89:     13(int) Load 25(comp)
+              90:    7(fvec3) CompositeExtract 24(i) 0
+              91:    6(float) VectorExtractDynamic 90 89
+              92:    7(fvec3) Load 69(OutColor)
+              93:    7(fvec3) CompositeConstruct 91 91 91
+              94:    7(fvec3) FAdd 92 93
+                              Store 69(OutColor) 94
                               Return
                               FunctionEnd
 30(GetColor5(struct-S-vf31;i1;):           2 Function None 15
            28(i):        8(S) FunctionParameter
         29(comp):     14(ptr) FunctionParameter
               31:             Label
-              91:    7(fvec3) CompositeExtract 28(i) 0
-              92:    7(fvec3) Load 65(OutColor)
-              93:    7(fvec3) FAdd 92 91
-                              Store 65(OutColor) 93
+              95:    7(fvec3) CompositeExtract 28(i) 0
+              96:    7(fvec3) Load 69(OutColor)
+              97:    7(fvec3) FAdd 96 95
+                              Store 69(OutColor) 97
                               Return
                               FunctionEnd
 34(GetColor6(struct-S-vf31;i1;):           2 Function None 15
            32(i):        8(S) FunctionParameter
         33(comp):     14(ptr) FunctionParameter
               35:             Label
-              94:     13(int) Load 33(comp)
-              96:    7(fvec3) CompositeExtract 32(i) 0
-              97:   95(fvec2) VectorShuffle 96 96 1 0
-              98:    6(float) VectorExtractDynamic 97 94
-              99:    7(fvec3) Load 65(OutColor)
-             100:    7(fvec3) CompositeConstruct 98 98 98
-             101:    7(fvec3) FAdd 99 100
-                              Store 65(OutColor) 101
+              98:     13(int) Load 33(comp)
+             100:    7(fvec3) CompositeExtract 32(i) 0
+             101:   99(fvec2) VectorShuffle 100 100 1 0
+             102:    6(float) VectorExtractDynamic 101 98
+             103:    7(fvec3) Load 69(OutColor)
+             104:    7(fvec3) CompositeConstruct 102 102 102
+             105:    7(fvec3) FAdd 103 104
+                              Store 69(OutColor) 105
                               Return
                               FunctionEnd
 38(GetColor7(struct-S-vf31;i1;):           2 Function None 15
            36(i):        8(S) FunctionParameter
         37(comp):     14(ptr) FunctionParameter
               39:             Label
-             102:    7(fvec3) CompositeExtract 36(i) 0
-             103:   95(fvec2) VectorShuffle 102 102 0 1
-             104:    7(fvec3) Load 65(OutColor)
-             105:   95(fvec2) VectorShuffle 104 104 0 1
-             106:   95(fvec2) FAdd 105 103
-             107:    7(fvec3) Load 65(OutColor)
-             108:    7(fvec3) VectorShuffle 107 106 3 4 2
-                              Store 65(OutColor) 108
+             106:    7(fvec3) CompositeExtract 36(i) 0
+             107:   99(fvec2) VectorShuffle 106 106 0 1
+             108:    7(fvec3) Load 69(OutColor)
+             109:   99(fvec2) VectorShuffle 108 108 0 1
+             110:   99(fvec2) FAdd 109 107
+             111:    7(fvec3) Load 69(OutColor)
+             112:    7(fvec3) VectorShuffle 111 110 3 4 2
+                              Store 69(OutColor) 112
                               Return
                               FunctionEnd
 42(GetColor8(struct-S-vf31;i1;):           2 Function None 15
            40(i):        8(S) FunctionParameter
         41(comp):     14(ptr) FunctionParameter
               43:             Label
-             110:    6(float) CompositeExtract 40(i) 0 2
-             111:    7(fvec3) Load 65(OutColor)
-             112:    7(fvec3) CompositeConstruct 110 110 110
-             113:    7(fvec3) FAdd 111 112
-                              Store 65(OutColor) 113
+             114:    6(float) CompositeExtract 40(i) 0 2
+             115:    7(fvec3) Load 69(OutColor)
+             116:    7(fvec3) CompositeConstruct 114 114 114
+             117:    7(fvec3) FAdd 115 116
+                              Store 69(OutColor) 117
                               Return
                               FunctionEnd
 46(GetColor9(struct-S-vf31;i1;):           2 Function None 15
            44(i):        8(S) FunctionParameter
         45(comp):     14(ptr) FunctionParameter
               47:             Label
-             114:    7(fvec3) CompositeExtract 44(i) 0
-             115:    7(fvec3) Load 65(OutColor)
-             116:    7(fvec3) VectorShuffle 115 115 2 0 1
-             117:    7(fvec3) FAdd 116 114
-             118:    7(fvec3) Load 65(OutColor)
-             119:    7(fvec3) VectorShuffle 118 117 4 5 3
-                              Store 65(OutColor) 119
+             118:    7(fvec3) CompositeExtract 44(i) 0
+             119:    7(fvec3) Load 69(OutColor)
+             120:    7(fvec3) VectorShuffle 119 119 2 0 1
+             121:    7(fvec3) FAdd 120 118
+             122:    7(fvec3) Load 69(OutColor)
+             123:    7(fvec3) VectorShuffle 122 121 4 5 3
+                              Store 69(OutColor) 123
                               Return
                               FunctionEnd
 50(GetColor10(struct-S-vf31;i1;):           2 Function None 15
            48(i):        8(S) FunctionParameter
         49(comp):     14(ptr) FunctionParameter
               51:             Label
-             120:    7(fvec3) CompositeExtract 48(i) 0
-             121:   95(fvec2) VectorShuffle 120 120 0 1
-             122:    7(fvec3) Load 65(OutColor)
-             123:   95(fvec2) VectorShuffle 122 122 2 1
-             124:   95(fvec2) FAdd 123 121
-             125:    7(fvec3) Load 65(OutColor)
-             126:    7(fvec3) VectorShuffle 125 124 0 4 3
-                              Store 65(OutColor) 126
+             124:    7(fvec3) CompositeExtract 48(i) 0
+             125:   99(fvec2) VectorShuffle 124 124 0 1
+             126:    7(fvec3) Load 69(OutColor)
+             127:   99(fvec2) VectorShuffle 126 126 2 1
+             128:   99(fvec2) FAdd 127 125
+             129:    7(fvec3) Load 69(OutColor)
+             130:    7(fvec3) VectorShuffle 129 128 0 4 3
+                              Store 69(OutColor) 130
                               Return
                               FunctionEnd
 54(GetColor11(struct-S-vf31;i1;):           2 Function None 15
            52(i):        8(S) FunctionParameter
         53(comp):     14(ptr) FunctionParameter
               55:             Label
-             127:    7(fvec3) CompositeExtract 52(i) 0
-             128:   95(fvec2) VectorShuffle 127 127 0 1
-             129:    7(fvec3) Load 65(OutColor)
-             130:   95(fvec2) VectorShuffle 129 129 0 2
-             131:   95(fvec2) FAdd 130 128
-             132:    7(fvec3) Load 65(OutColor)
-             133:    7(fvec3) VectorShuffle 132 131 3 1 4
-                              Store 65(OutColor) 133
+             131:    7(fvec3) CompositeExtract 52(i) 0
+             132:   99(fvec2) VectorShuffle 131 131 0 1
+             133:    7(fvec3) Load 69(OutColor)
+             134:   99(fvec2) VectorShuffle 133 133 0 2
+             135:   99(fvec2) FAdd 134 132
+             136:    7(fvec3) Load 69(OutColor)
+             137:    7(fvec3) VectorShuffle 136 135 3 1 4
+                              Store 69(OutColor) 137
                               Return
                               FunctionEnd
 58(GetColor12(struct-S-vf31;i1;):           2 Function None 15
            56(i):        8(S) FunctionParameter
         57(comp):     14(ptr) FunctionParameter
               59:             Label
-             134:     13(int) Load 57(comp)
-             135:    6(float) CompositeExtract 56(i) 0 0
-             137:    136(ptr) AccessChain 65(OutColor) 134
-             138:    6(float) Load 137
-             139:    6(float) FAdd 138 135
-             140:    136(ptr) AccessChain 65(OutColor) 134
-                              Store 140 139
+             138:     13(int) Load 57(comp)
+             139:    6(float) CompositeExtract 56(i) 0 0
+             141:    140(ptr) AccessChain 69(OutColor) 138
+             142:    6(float) Load 141
+             143:    6(float) FAdd 142 139
+             144:    140(ptr) AccessChain 69(OutColor) 138
+                              Store 144 143
                               Return
                               FunctionEnd
 62(GetColor13(struct-S-vf31;i1;):           2 Function None 15
            60(i):        8(S) FunctionParameter
         61(comp):     14(ptr) FunctionParameter
               63:             Label
-             141:     13(int) Load 61(comp)
-             142:    6(float) CompositeExtract 60(i) 0 0
-             143:    7(fvec3) Load 65(OutColor)
-             144:   95(fvec2) VectorShuffle 143 143 2 1
-             145:    6(float) VectorExtractDynamic 144 141
-             146:    6(float) FAdd 145 142
-             147:    7(fvec3) Load 65(OutColor)
-             148:    7(fvec3) VectorShuffle 147 147 2 1 2
-             149:    7(fvec3) VectorInsertDynamic 148 146 141
-                              Store 65(OutColor) 149
+             145:     13(int) Load 61(comp)
+             146:    6(float) CompositeExtract 60(i) 0 0
+             150:     71(int) VectorExtractDynamic 149 145
+             151:    140(ptr) AccessChain 69(OutColor) 150
+             152:    6(float) Load 151
+             153:    6(float) FAdd 152 146
+             154:     71(int) VectorExtractDynamic 149 145
+             155:    140(ptr) AccessChain 69(OutColor) 154
+                              Store 155 153
+                              Return
+                              FunctionEnd
+66(GetColor14(struct-S-vf31;i1;):           2 Function None 15
+           64(i):        8(S) FunctionParameter
+        65(comp):     14(ptr) FunctionParameter
+              67:             Label
+             156:     13(int) Load 65(comp)
+             157:    6(float) CompositeExtract 64(i) 0 0
+             160:     71(int) VectorExtractDynamic 159 156
+             161:    140(ptr) AccessChain 69(OutColor) 160
+                              Store 161 157
                               Return
                               FunctionEnd
diff --git a/Test/baseResults/spv.aggOps.frag.out b/Test/baseResults/spv.aggOps.frag.out
index c3ceb9a..1c0c7e9 100644
--- a/Test/baseResults/spv.aggOps.frag.out
+++ b/Test/baseResults/spv.aggOps.frag.out
@@ -1,10 +1,9 @@
 spv.aggOps.frag
-Warning, version 450 is not yet complete; most version-specific features are present, but some are missing.
 WARNING: 0:4: '' : all default precisions are highp; use precision statements to quiet warning, e.g.:
          "precision mediump int; precision highp float;" 
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 215
 
                               Capability Shader
diff --git a/Test/baseResults/spv.always-discard.frag.out b/Test/baseResults/spv.always-discard.frag.out
index 652d45c..8074cf8 100644
--- a/Test/baseResults/spv.always-discard.frag.out
+++ b/Test/baseResults/spv.always-discard.frag.out
@@ -1,6 +1,6 @@
 spv.always-discard.frag
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 84
 
                               Capability Shader
@@ -18,6 +18,7 @@
                               Name 30  "y"
                               Name 36  "radius"
                               Name 59  "gl_FragColor"
+                              Decorate 59(gl_FragColor) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
diff --git a/Test/baseResults/spv.always-discard2.frag.out b/Test/baseResults/spv.always-discard2.frag.out
old mode 100755
new mode 100644
index 0bbb9ee..e3fa43a
--- a/Test/baseResults/spv.always-discard2.frag.out
+++ b/Test/baseResults/spv.always-discard2.frag.out
@@ -1,6 +1,6 @@
 spv.always-discard2.frag
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 40
 
                               Capability Shader
@@ -17,6 +17,7 @@
                               Name 21  "tex_coord"
                               Name 30  "y"
                               Name 38  "gl_FragColor"
+                              Decorate 38(gl_FragColor) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
diff --git a/Test/baseResults/spv.arbPostDepthCoverage.frag.out b/Test/baseResults/spv.arbPostDepthCoverage.frag.out
new file mode 100644
index 0000000..f41c012
--- /dev/null
+++ b/Test/baseResults/spv.arbPostDepthCoverage.frag.out
@@ -0,0 +1,42 @@
+spv.arbPostDepthCoverage.frag
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 18
+
+                              Capability Shader
+                              Capability SampleMaskPostDepthCoverage
+                              Extension  "SPV_KHR_post_depth_coverage"
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 8 13
+                              ExecutionMode 4 OriginUpperLeft
+                              ExecutionMode 4 EarlyFragmentTests
+                              ExecutionMode 4 PostDepthCoverage
+                              Source GLSL 450
+                              SourceExtension  "GL_ARB_post_depth_coverage"
+                              SourceExtension  "GL_EXT_post_depth_coverage"
+                              Name 4  "main"
+                              Name 8  "readSampleMaskIn"
+                              Name 13  "gl_SampleMaskIn"
+                              Decorate 8(readSampleMaskIn) Location 0
+                              Decorate 13(gl_SampleMaskIn) Flat
+                              Decorate 13(gl_SampleMaskIn) BuiltIn SampleMask
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeInt 32 1
+               7:             TypePointer Output 6(int)
+8(readSampleMaskIn):      7(ptr) Variable Output
+               9:             TypeInt 32 0
+              10:      9(int) Constant 1
+              11:             TypeArray 6(int) 10
+              12:             TypePointer Input 11
+13(gl_SampleMaskIn):     12(ptr) Variable Input
+              14:      6(int) Constant 0
+              15:             TypePointer Input 6(int)
+         4(main):           2 Function None 3
+               5:             Label
+              16:     15(ptr) AccessChain 13(gl_SampleMaskIn) 14
+              17:      6(int) Load 16
+                              Store 8(readSampleMaskIn) 17
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.arbPostDepthCoverage_Error.frag.out b/Test/baseResults/spv.arbPostDepthCoverage_Error.frag.out
new file mode 100644
index 0000000..b210144
--- /dev/null
+++ b/Test/baseResults/spv.arbPostDepthCoverage_Error.frag.out
@@ -0,0 +1,7 @@
+spv.arbPostDepthCoverage_Error.frag
+ERROR: 0:7: 'early_fragment_tests' : can only apply to a standalone qualifier 
+ERROR: 0:7: 'post_depth_coverage' : can only apply to a standalone qualifier 
+ERROR: 2 compilation errors.  No code generated.
+
+
+SPIR-V is not generated for failed compile or link
diff --git a/Test/baseResults/spv.atomic.comp.out b/Test/baseResults/spv.atomic.comp.out
old mode 100755
new mode 100644
index 97c7f6e..3dd88f3
--- a/Test/baseResults/spv.atomic.comp.out
+++ b/Test/baseResults/spv.atomic.comp.out
@@ -1,9 +1,7 @@
 spv.atomic.comp
-Warning, version 450 is not yet complete; most version-specific features are present, but some are missing.
-
 // Module Version 10000
-// Generated by (magic number): 80001
-// Id's are bound by 73
+// Generated by (magic number): 80007
+// Id's are bound by 74
 
                               Capability Shader
                               Capability AtomicStorage
@@ -19,29 +17,29 @@
                               Name 20  "counter"
                               Name 23  "val"
                               Name 27  "countArr"
-                              Name 35  "origi"
-                              Name 37  "atomi"
-                              Name 40  "origu"
-                              Name 42  "atomu"
-                              Name 43  "value"
-                              Name 60  "dataSSB"
-                              MemberName 60(dataSSB) 0  "f"
-                              MemberName 60(dataSSB) 1  "n_frames_rendered"
-                              Name 62  "result"
-                              Name 70  "arrX"
-                              Name 71  "arrY"
-                              Name 72  "arrZ"
+                              Name 37  "origi"
+                              Name 39  "atomi"
+                              Name 42  "origu"
+                              Name 44  "atomu"
+                              Name 45  "value"
+                              Name 62  "dataSSB"
+                              MemberName 62(dataSSB) 0  "f"
+                              MemberName 62(dataSSB) 1  "n_frames_rendered"
+                              Name 64  "result"
+                              Name 71  "arrX"
+                              Name 72  "arrY"
+                              Name 73  "arrZ"
                               Decorate 20(counter) Offset 0
                               Decorate 20(counter) Binding 0
                               Decorate 27(countArr) Offset 4
                               Decorate 27(countArr) Binding 0
-                              MemberDecorate 60(dataSSB) 0 Restrict
-                              MemberDecorate 60(dataSSB) 0 Offset 0
-                              MemberDecorate 60(dataSSB) 1 Restrict
-                              MemberDecorate 60(dataSSB) 1 Offset 16
-                              Decorate 60(dataSSB) BufferBlock
-                              Decorate 62(result) DescriptorSet 0
-                              Decorate 62(result) Binding 0
+                              MemberDecorate 62(dataSSB) 0 Restrict
+                              MemberDecorate 62(dataSSB) 0 Offset 0
+                              MemberDecorate 62(dataSSB) 1 Restrict
+                              MemberDecorate 62(dataSSB) 1 Offset 16
+                              Decorate 62(dataSSB) BufferBlock
+                              Decorate 64(result) DescriptorSet 0
+                              Decorate 64(result) Binding 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 32 0
@@ -49,7 +47,7 @@
                8:             TypeFunction 6(int) 7(ptr)
               14:      6(int) Constant 1
               15:      6(int) Constant 0
-              19:      6(int) Constant 1024
+              19:      6(int) Constant 1032
      20(counter):      7(ptr) Variable AtomicCounter
               22:             TypePointer Function 6(int)
               24:      6(int) Constant 4
@@ -58,29 +56,29 @@
     27(countArr):     26(ptr) Variable AtomicCounter
               28:             TypeInt 32 1
               29:     28(int) Constant 2
-              34:             TypePointer Function 28(int)
-              36:             TypePointer Workgroup 28(int)
-       37(atomi):     36(ptr) Variable Workgroup
-              38:     28(int) Constant 3
-              41:             TypePointer Workgroup 6(int)
-       42(atomu):     41(ptr) Variable Workgroup
-       43(value):     41(ptr) Variable Workgroup
-              46:      6(int) Constant 7
-              51:     28(int) Constant 7
-              55:      6(int) Constant 10
-              58:             TypeFloat 32
-              59:             TypeVector 28(int) 4
-     60(dataSSB):             TypeStruct 58(float) 59(ivec4)
-              61:             TypePointer Uniform 60(dataSSB)
-      62(result):     61(ptr) Variable Uniform
-              63:     28(int) Constant 1
-              64:      6(int) Constant 2
-              65:             TypePointer Uniform 28(int)
-              68:             TypeArray 28(int) 14
-              69:             TypePointer Private 68
-        70(arrX):     69(ptr) Variable Private
-        71(arrY):     69(ptr) Variable Private
-        72(arrZ):     69(ptr) Variable Private
+              33:     28(int) Constant 1
+              36:             TypePointer Function 28(int)
+              38:             TypePointer Workgroup 28(int)
+       39(atomi):     38(ptr) Variable Workgroup
+              40:     28(int) Constant 3
+              43:             TypePointer Workgroup 6(int)
+       44(atomu):     43(ptr) Variable Workgroup
+       45(value):     43(ptr) Variable Workgroup
+              48:      6(int) Constant 7
+              53:     28(int) Constant 7
+              57:      6(int) Constant 10
+              60:             TypeFloat 32
+              61:             TypeVector 28(int) 4
+     62(dataSSB):             TypeStruct 60(float) 61(ivec4)
+              63:             TypePointer Uniform 62(dataSSB)
+      64(result):     63(ptr) Variable Uniform
+              65:      6(int) Constant 2
+              66:             TypePointer Uniform 28(int)
+              69:             TypeArray 28(int) 14
+              70:             TypePointer Private 69
+        71(arrX):     70(ptr) Variable Private
+        72(arrY):     70(ptr) Variable Private
+        73(arrZ):     70(ptr) Variable Private
          4(main):           2 Function None 3
                5:             Label
          23(val):     22(ptr) Variable Function
@@ -90,7 +88,8 @@
               31:      6(int) AtomicLoad 30 14 15
                               Store 23(val) 31
               32:      6(int) AtomicIDecrement 20(counter) 14 15
-              33:      6(int) AtomicIIncrement 20(counter) 14 15
+              34:      6(int) ISub 32 33
+              35:      6(int) AtomicIIncrement 20(counter) 14 15
                               Return
                               FunctionEnd
    10(func(au1;):      6(int) Function None 8
@@ -101,29 +100,29 @@
                               FunctionEnd
       12(atoms():           2 Function None 3
               13:             Label
-       35(origi):     34(ptr) Variable Function
-       40(origu):     22(ptr) Variable Function
-              39:     28(int) AtomicIAdd 37(atomi) 14 15 38
-                              Store 35(origi) 39
-              44:      6(int) Load 43(value)
-              45:      6(int) AtomicAnd 42(atomu) 14 15 44
-                              Store 40(origu) 45
-              47:      6(int) AtomicOr 42(atomu) 14 15 46
-                              Store 40(origu) 47
-              48:      6(int) AtomicXor 42(atomu) 14 15 46
-                              Store 40(origu) 48
-              49:      6(int) Load 43(value)
-              50:      6(int) AtomicUMin 42(atomu) 14 15 49
-                              Store 40(origu) 50
-              52:     28(int) AtomicSMax 37(atomi) 14 15 51
-                              Store 35(origi) 52
-              53:     28(int) Load 35(origi)
-              54:     28(int) AtomicExchange 37(atomi) 14 15 53
-                              Store 35(origi) 54
-              56:      6(int) Load 43(value)
-              57:      6(int) AtomicCompareExchange 42(atomu) 14 15 15 56 55
-                              Store 40(origu) 57
-              66:     65(ptr) AccessChain 62(result) 63 64
-              67:     28(int) AtomicIAdd 66 14 15 63
+       37(origi):     36(ptr) Variable Function
+       42(origu):     22(ptr) Variable Function
+              41:     28(int) AtomicIAdd 39(atomi) 14 15 40
+                              Store 37(origi) 41
+              46:      6(int) Load 45(value)
+              47:      6(int) AtomicAnd 44(atomu) 14 15 46
+                              Store 42(origu) 47
+              49:      6(int) AtomicOr 44(atomu) 14 15 48
+                              Store 42(origu) 49
+              50:      6(int) AtomicXor 44(atomu) 14 15 48
+                              Store 42(origu) 50
+              51:      6(int) Load 45(value)
+              52:      6(int) AtomicUMin 44(atomu) 14 15 51
+                              Store 42(origu) 52
+              54:     28(int) AtomicSMax 39(atomi) 14 15 53
+                              Store 37(origi) 54
+              55:     28(int) Load 37(origi)
+              56:     28(int) AtomicExchange 39(atomi) 14 15 55
+                              Store 37(origi) 56
+              58:      6(int) Load 45(value)
+              59:      6(int) AtomicCompareExchange 44(atomu) 14 15 15 58 57
+                              Store 42(origu) 59
+              67:     66(ptr) AccessChain 64(result) 33 65
+              68:     28(int) AtomicIAdd 67 14 15 33
                               Return
                               FunctionEnd
diff --git a/Test/baseResults/spv.atomicInt64.comp.out b/Test/baseResults/spv.atomicInt64.comp.out
new file mode 100644
index 0000000..9c66aec
--- /dev/null
+++ b/Test/baseResults/spv.atomicInt64.comp.out
@@ -0,0 +1,215 @@
+spv.atomicInt64.comp
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 149
+
+                              Capability Shader
+                              Capability Int64
+                              Capability Int64Atomics
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint GLCompute 4  "main"
+                              ExecutionMode 4 LocalSize 16 16 1
+                              Source GLSL 450
+                              SourceExtension  "GL_ARB_gpu_shader_int64"
+                              SourceExtension  "GL_NV_shader_atomic_int64"
+                              Name 4  "main"
+                              Name 8  "i64"
+                              Name 12  "u64"
+                              Name 14  "Buffer"
+                              MemberName 14(Buffer) 0  "i64"
+                              MemberName 14(Buffer) 1  "u64"
+                              Name 16  "buf"
+                              Name 84  "Struct"
+                              MemberName 84(Struct) 0  "i64"
+                              MemberName 84(Struct) 1  "u64"
+                              Name 86  "s"
+                              MemberDecorate 14(Buffer) 0 Offset 0
+                              MemberDecorate 14(Buffer) 1 Offset 8
+                              Decorate 14(Buffer) BufferBlock
+                              Decorate 16(buf) DescriptorSet 0
+                              Decorate 16(buf) Binding 0
+                              Decorate 148 BuiltIn WorkgroupSize
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeInt 64 1
+               7:             TypePointer Function 6(int64_t)
+               9:  6(int64_t) Constant 0 0
+              10:             TypeInt 64 0
+              11:             TypePointer Function 10(int64_t)
+              13: 10(int64_t) Constant 0 0
+      14(Buffer):             TypeStruct 6(int64_t) 10(int64_t)
+              15:             TypePointer Uniform 14(Buffer)
+         16(buf):     15(ptr) Variable Uniform
+              17:             TypeInt 32 1
+              18:     17(int) Constant 0
+              19:             TypePointer Uniform 6(int64_t)
+              21:  6(int64_t) Constant 4294967272 4294967295
+              22:             TypeInt 32 0
+              23:     22(int) Constant 1
+              24:     22(int) Constant 0
+              28:     17(int) Constant 1
+              29:             TypePointer Uniform 10(int64_t)
+              31: 10(int64_t) Constant 15 240
+      84(Struct):             TypeStruct 6(int64_t) 10(int64_t)
+              85:             TypePointer Workgroup 84(Struct)
+           86(s):     85(ptr) Variable Workgroup
+              87:             TypePointer Workgroup 6(int64_t)
+              92:             TypePointer Workgroup 10(int64_t)
+             146:             TypeVector 22(int) 3
+             147:     22(int) Constant 16
+             148:  146(ivec3) ConstantComposite 147 147 23
+         4(main):           2 Function None 3
+               5:             Label
+          8(i64):      7(ptr) Variable Function
+         12(u64):     11(ptr) Variable Function
+                              Store 8(i64) 9
+                              Store 12(u64) 13
+              20:     19(ptr) AccessChain 16(buf) 18
+              25:  6(int64_t) AtomicSMin 20 23 24 21
+              26:  6(int64_t) Load 8(i64)
+              27:  6(int64_t) IAdd 26 25
+                              Store 8(i64) 27
+              30:     29(ptr) AccessChain 16(buf) 28
+              32: 10(int64_t) AtomicUMin 30 23 24 31
+              33: 10(int64_t) Load 12(u64)
+              34: 10(int64_t) IAdd 33 32
+                              Store 12(u64) 34
+              35:     19(ptr) AccessChain 16(buf) 18
+              36:  6(int64_t) AtomicSMax 35 23 24 21
+              37:  6(int64_t) Load 8(i64)
+              38:  6(int64_t) IAdd 37 36
+                              Store 8(i64) 38
+              39:     29(ptr) AccessChain 16(buf) 28
+              40: 10(int64_t) AtomicUMax 39 23 24 31
+              41: 10(int64_t) Load 12(u64)
+              42: 10(int64_t) IAdd 41 40
+                              Store 12(u64) 42
+              43:     19(ptr) AccessChain 16(buf) 18
+              44:  6(int64_t) AtomicAnd 43 23 24 21
+              45:  6(int64_t) Load 8(i64)
+              46:  6(int64_t) IAdd 45 44
+                              Store 8(i64) 46
+              47:     29(ptr) AccessChain 16(buf) 28
+              48: 10(int64_t) AtomicAnd 47 23 24 31
+              49: 10(int64_t) Load 12(u64)
+              50: 10(int64_t) IAdd 49 48
+                              Store 12(u64) 50
+              51:     19(ptr) AccessChain 16(buf) 18
+              52:  6(int64_t) AtomicOr 51 23 24 21
+              53:  6(int64_t) Load 8(i64)
+              54:  6(int64_t) IAdd 53 52
+                              Store 8(i64) 54
+              55:     29(ptr) AccessChain 16(buf) 28
+              56: 10(int64_t) AtomicOr 55 23 24 31
+              57: 10(int64_t) Load 12(u64)
+              58: 10(int64_t) IAdd 57 56
+                              Store 12(u64) 58
+              59:     19(ptr) AccessChain 16(buf) 18
+              60:  6(int64_t) AtomicXor 59 23 24 21
+              61:  6(int64_t) Load 8(i64)
+              62:  6(int64_t) IAdd 61 60
+                              Store 8(i64) 62
+              63:     29(ptr) AccessChain 16(buf) 28
+              64: 10(int64_t) AtomicXor 63 23 24 31
+              65: 10(int64_t) Load 12(u64)
+              66: 10(int64_t) IAdd 65 64
+                              Store 12(u64) 66
+              67:     19(ptr) AccessChain 16(buf) 18
+              68:  6(int64_t) AtomicIAdd 67 23 24 21
+              69:  6(int64_t) Load 8(i64)
+              70:  6(int64_t) IAdd 69 68
+                              Store 8(i64) 70
+              71:     19(ptr) AccessChain 16(buf) 18
+              72:  6(int64_t) AtomicExchange 71 23 24 21
+              73:  6(int64_t) Load 8(i64)
+              74:  6(int64_t) IAdd 73 72
+                              Store 8(i64) 74
+              75:     19(ptr) AccessChain 16(buf) 18
+              76:  6(int64_t) Load 8(i64)
+              77:  6(int64_t) AtomicCompareExchange 75 23 24 24 76 21
+              78:  6(int64_t) Load 8(i64)
+              79:  6(int64_t) IAdd 78 77
+                              Store 8(i64) 79
+              80:  6(int64_t) Load 8(i64)
+              81:     19(ptr) AccessChain 16(buf) 18
+                              Store 81 80
+              82: 10(int64_t) Load 12(u64)
+              83:     29(ptr) AccessChain 16(buf) 28
+                              Store 83 82
+                              Store 8(i64) 9
+                              Store 12(u64) 13
+              88:     87(ptr) AccessChain 86(s) 18
+              89:  6(int64_t) AtomicSMin 88 23 24 21
+              90:  6(int64_t) Load 8(i64)
+              91:  6(int64_t) IAdd 90 89
+                              Store 8(i64) 91
+              93:     92(ptr) AccessChain 86(s) 28
+              94: 10(int64_t) AtomicUMin 93 23 24 31
+              95: 10(int64_t) Load 12(u64)
+              96: 10(int64_t) IAdd 95 94
+                              Store 12(u64) 96
+              97:     87(ptr) AccessChain 86(s) 18
+              98:  6(int64_t) AtomicSMax 97 23 24 21
+              99:  6(int64_t) Load 8(i64)
+             100:  6(int64_t) IAdd 99 98
+                              Store 8(i64) 100
+             101:     92(ptr) AccessChain 86(s) 28
+             102: 10(int64_t) AtomicUMax 101 23 24 31
+             103: 10(int64_t) Load 12(u64)
+             104: 10(int64_t) IAdd 103 102
+                              Store 12(u64) 104
+             105:     87(ptr) AccessChain 86(s) 18
+             106:  6(int64_t) AtomicAnd 105 23 24 21
+             107:  6(int64_t) Load 8(i64)
+             108:  6(int64_t) IAdd 107 106
+                              Store 8(i64) 108
+             109:     92(ptr) AccessChain 86(s) 28
+             110: 10(int64_t) AtomicAnd 109 23 24 31
+             111: 10(int64_t) Load 12(u64)
+             112: 10(int64_t) IAdd 111 110
+                              Store 12(u64) 112
+             113:     87(ptr) AccessChain 86(s) 18
+             114:  6(int64_t) AtomicOr 113 23 24 21
+             115:  6(int64_t) Load 8(i64)
+             116:  6(int64_t) IAdd 115 114
+                              Store 8(i64) 116
+             117:     92(ptr) AccessChain 86(s) 28
+             118: 10(int64_t) AtomicOr 117 23 24 31
+             119: 10(int64_t) Load 12(u64)
+             120: 10(int64_t) IAdd 119 118
+                              Store 12(u64) 120
+             121:     87(ptr) AccessChain 86(s) 18
+             122:  6(int64_t) AtomicXor 121 23 24 21
+             123:  6(int64_t) Load 8(i64)
+             124:  6(int64_t) IAdd 123 122
+                              Store 8(i64) 124
+             125:     92(ptr) AccessChain 86(s) 28
+             126: 10(int64_t) AtomicXor 125 23 24 31
+             127: 10(int64_t) Load 12(u64)
+             128: 10(int64_t) IAdd 127 126
+                              Store 12(u64) 128
+             129:     87(ptr) AccessChain 86(s) 18
+             130:  6(int64_t) AtomicIAdd 129 23 24 21
+             131:  6(int64_t) Load 8(i64)
+             132:  6(int64_t) IAdd 131 130
+                              Store 8(i64) 132
+             133:     87(ptr) AccessChain 86(s) 18
+             134:  6(int64_t) AtomicExchange 133 23 24 21
+             135:  6(int64_t) Load 8(i64)
+             136:  6(int64_t) IAdd 135 134
+                              Store 8(i64) 136
+             137:     87(ptr) AccessChain 86(s) 18
+             138:  6(int64_t) Load 8(i64)
+             139:  6(int64_t) AtomicCompareExchange 137 23 24 24 138 21
+             140:  6(int64_t) Load 8(i64)
+             141:  6(int64_t) IAdd 140 139
+                              Store 8(i64) 141
+             142:  6(int64_t) Load 8(i64)
+             143:     87(ptr) AccessChain 86(s) 18
+                              Store 143 142
+             144: 10(int64_t) Load 12(u64)
+             145:     92(ptr) AccessChain 86(s) 28
+                              Store 145 144
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.barrier.vert.out b/Test/baseResults/spv.barrier.vert.out
new file mode 100644
index 0000000..b9369f2
--- /dev/null
+++ b/Test/baseResults/spv.barrier.vert.out
@@ -0,0 +1,46 @@
+spv.barrier.vert
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 24
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Vertex 4  "main" 9 15
+                              Source GLSL 450
+                              Name 4  "main"
+                              Name 9  "c0"
+                              Name 15  "c1"
+                              Decorate 9(c0) Location 0
+                              Decorate 15(c1) Location 1
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+               8:             TypePointer Output 7(fvec4)
+           9(c0):      8(ptr) Variable Output
+              10:    6(float) Constant 1065353216
+              11:    7(fvec4) ConstantComposite 10 10 10 10
+              12:             TypeInt 32 0
+              13:     12(int) Constant 1
+              14:     12(int) Constant 3400
+          15(c1):      8(ptr) Variable Output
+              16:     12(int) Constant 72
+              20:     12(int) Constant 2056
+         4(main):           2 Function None 3
+               5:             Label
+                              Store 9(c0) 11
+                              MemoryBarrier 13 14
+                              Store 15(c1) 11
+                              MemoryBarrier 13 16
+              17:    7(fvec4) Load 9(c0)
+              18:    7(fvec4) CompositeConstruct 10 10 10 10
+              19:    7(fvec4) FAdd 17 18
+                              Store 9(c0) 19
+                              MemoryBarrier 13 20
+              21:    7(fvec4) Load 9(c0)
+              22:    7(fvec4) CompositeConstruct 10 10 10 10
+              23:    7(fvec4) FAdd 21 22
+                              Store 9(c0) 23
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.bitCast.frag.out b/Test/baseResults/spv.bitCast.frag.out
index 07dd729..a687b8d 100644
--- a/Test/baseResults/spv.bitCast.frag.out
+++ b/Test/baseResults/spv.bitCast.frag.out
@@ -1,8 +1,6 @@
 spv.bitCast.frag
-Warning, version 450 is not yet complete; most version-specific features are present, but some are missing.
-
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 172
 
                               Capability Shader
@@ -88,8 +86,8 @@
          148(u4):    147(ptr) Variable Input
              153:             TypePointer Output 46(fvec4)
   154(fragColor):    153(ptr) Variable Output
-             159:             TypeBool
-             160:             TypeVector 159(bool) 4
+             158:             TypeBool
+             159:             TypeVector 158(bool) 4
              168:   12(float) Constant 1045220557
              169:   46(fvec4) ConstantComposite 168 168 168 168
          4(main):           2 Function None 3
@@ -97,7 +95,7 @@
         9(idata):      8(ptr) Variable Function
        55(udata):     54(ptr) Variable Function
        85(fdata):     84(ptr) Variable Function
-             155:     84(ptr) Variable Function
+             162:     84(ptr) Variable Function
                               Store 9(idata) 11
               15:   12(float) Load 14(f1)
               16:      6(int) Bitcast 15
@@ -213,24 +211,24 @@
              151:   46(fvec4) Load 85(fdata)
              152:   46(fvec4) FAdd 151 150
                               Store 85(fdata) 152
-             156:    7(ivec4) Load 9(idata)
-             157:   53(ivec4) Bitcast 156
-             158:   53(ivec4) Load 55(udata)
-             161:  160(bvec4) IEqual 157 158
-             162:   159(bool) All 161
+             155:    7(ivec4) Load 9(idata)
+             156:   53(ivec4) Bitcast 155
+             157:   53(ivec4) Load 55(udata)
+             160:  159(bvec4) IEqual 156 157
+             161:   158(bool) All 160
                               SelectionMerge 164 None
-                              BranchConditional 162 163 166
+                              BranchConditional 161 163 166
              163:               Label
              165:   46(fvec4)   Load 85(fdata)
-                                Store 155 165
+                                Store 162 165
                                 Branch 164
              166:               Label
              167:   46(fvec4)   Load 85(fdata)
              170:   46(fvec4)   FAdd 167 169
-                                Store 155 170
+                                Store 162 170
                                 Branch 164
              164:             Label
-             171:   46(fvec4) Load 155
+             171:   46(fvec4) Load 162
                               Store 154(fragColor) 171
                               Return
                               FunctionEnd
diff --git a/Test/baseResults/spv.bool.vert.out b/Test/baseResults/spv.bool.vert.out
index 1e87c42..becd707 100644
--- a/Test/baseResults/spv.bool.vert.out
+++ b/Test/baseResults/spv.bool.vert.out
@@ -1,8 +1,6 @@
 spv.bool.vert
-Warning, version 450 is not yet complete; most version-specific features are present, but some are missing.
-
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 46
 
                               Capability Shader
diff --git a/Test/baseResults/spv.boolInBlock.frag.out b/Test/baseResults/spv.boolInBlock.frag.out
index 2181f26..e86ca6b 100644
--- a/Test/baseResults/spv.boolInBlock.frag.out
+++ b/Test/baseResults/spv.boolInBlock.frag.out
@@ -1,14 +1,12 @@
 spv.boolInBlock.frag
-Warning, version 450 is not yet complete; most version-specific features are present, but some are missing.
-
 // Module Version 10000
-// Generated by (magic number): 80001
-// Id's are bound by 107
+// Generated by (magic number): 80007
+// Id's are bound by 102
 
                               Capability Shader
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "main" 75
+                              EntryPoint Fragment 4  "main" 74
                               ExecutionMode 4 OriginUpperLeft
                               Source GLSL 450
                               Name 4  "main"
@@ -16,24 +14,24 @@
                               Name 12  "paramb4"
                               Name 13  "paramb2"
                               Name 17  "b1"
-                              Name 24  "Buffer"
-                              MemberName 24(Buffer) 0  "b2"
-                              Name 26  ""
-                              Name 39  "Uniform"
-                              MemberName 39(Uniform) 0  "b4"
-                              Name 41  ""
-                              Name 62  "param"
-                              Name 67  "param"
-                              Name 75  "fragColor"
-                              MemberDecorate 24(Buffer) 0 Offset 0
-                              Decorate 24(Buffer) BufferBlock
-                              Decorate 26 DescriptorSet 0
-                              Decorate 26 Binding 1
-                              MemberDecorate 39(Uniform) 0 Offset 0
-                              Decorate 39(Uniform) Block
-                              Decorate 41 DescriptorSet 0
-                              Decorate 41 Binding 0
-                              Decorate 75(fragColor) Location 0
+                              Name 25  "Buffer"
+                              MemberName 25(Buffer) 0  "b2"
+                              Name 27  ""
+                              Name 40  "Uniform"
+                              MemberName 40(Uniform) 0  "b4"
+                              Name 42  ""
+                              Name 60  "param"
+                              Name 66  "param"
+                              Name 74  "fragColor"
+                              MemberDecorate 25(Buffer) 0 Offset 0
+                              Decorate 25(Buffer) BufferBlock
+                              Decorate 27 DescriptorSet 0
+                              Decorate 27 Binding 1
+                              MemberDecorate 40(Uniform) 0 Offset 0
+                              Decorate 40(Uniform) Block
+                              Decorate 42 DescriptorSet 0
+                              Decorate 42 Binding 0
+                              Decorate 74(fragColor) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeBool
@@ -43,111 +41,106 @@
               10:             TypePointer Function 9(bvec2)
               11:             TypeFunction 2 8(ptr) 10(ptr)
               16:             TypePointer Function 6(bool)
-              22:             TypeInt 32 0
-              23:             TypeVector 22(int) 2
-      24(Buffer):             TypeStruct 23(ivec2)
-              25:             TypePointer Uniform 24(Buffer)
-              26:     25(ptr) Variable Uniform
-              27:             TypeInt 32 1
-              28:     27(int) Constant 0
-              29:     6(bool) ConstantFalse
-              30:    9(bvec2) ConstantComposite 29 29
-              31:     22(int) Constant 0
-              32:   23(ivec2) ConstantComposite 31 31
-              33:     22(int) Constant 1
-              34:   23(ivec2) ConstantComposite 33 33
-              36:             TypePointer Uniform 23(ivec2)
-              38:             TypeVector 22(int) 4
-     39(Uniform):             TypeStruct 38(ivec4)
-              40:             TypePointer Uniform 39(Uniform)
-              41:     40(ptr) Variable Uniform
-              42:             TypePointer Uniform 38(ivec4)
-              65:   38(ivec4) ConstantComposite 31 31 31 31
-              72:             TypeFloat 32
-              73:             TypeVector 72(float) 4
-              74:             TypePointer Output 73(fvec4)
-   75(fragColor):     74(ptr) Variable Output
-              87:   72(float) Constant 0
-              88:   72(float) Constant 1065353216
+              18:             TypeInt 32 0
+              19:     18(int) Constant 2
+              24:             TypeVector 18(int) 2
+      25(Buffer):             TypeStruct 24(ivec2)
+              26:             TypePointer Uniform 25(Buffer)
+              27:     26(ptr) Variable Uniform
+              28:             TypeInt 32 1
+              29:     28(int) Constant 0
+              30:     6(bool) ConstantFalse
+              31:    9(bvec2) ConstantComposite 30 30
+              32:     18(int) Constant 1
+              33:   24(ivec2) ConstantComposite 32 32
+              34:     18(int) Constant 0
+              35:   24(ivec2) ConstantComposite 34 34
+              37:             TypePointer Uniform 24(ivec2)
+              39:             TypeVector 18(int) 4
+     40(Uniform):             TypeStruct 39(ivec4)
+              41:             TypePointer Uniform 40(Uniform)
+              42:     41(ptr) Variable Uniform
+              43:             TypePointer Uniform 18(int)
+              61:             TypePointer Uniform 39(ivec4)
+              64:   39(ivec4) ConstantComposite 34 34 34 34
+              71:             TypeFloat 32
+              72:             TypeVector 71(float) 4
+              73:             TypePointer Output 72(fvec4)
+   74(fragColor):     73(ptr) Variable Output
+              84:   71(float) Constant 0
+              85:   71(float) Constant 1065353216
          4(main):           2 Function None 3
                5:             Label
-       62(param):      8(ptr) Variable Function
-       67(param):     10(ptr) Variable Function
-              35:   23(ivec2) Select 30 34 32
-              37:     36(ptr) AccessChain 26 28
-                              Store 37 35
-              43:     42(ptr) AccessChain 41 28
-              44:   38(ivec4) Load 43
-              45:     22(int) CompositeExtract 44 2
-              46:     6(bool) INotEqual 45 31
+       60(param):      8(ptr) Variable Function
+       66(param):     10(ptr) Variable Function
+              36:   24(ivec2) Select 31 33 35
+              38:     37(ptr) AccessChain 27 29
+                              Store 38 36
+              44:     43(ptr) AccessChain 42 29 19
+              45:     18(int) Load 44
+              46:     6(bool) INotEqual 45 34
                               SelectionMerge 48 None
                               BranchConditional 46 47 48
               47:               Label
-              49:     42(ptr)   AccessChain 41 28
-              50:   38(ivec4)   Load 49
-              51:     22(int)   CompositeExtract 50 0
-              52:     6(bool)   INotEqual 51 31
-              53:    9(bvec2)   CompositeConstruct 52 52
-              54:   23(ivec2)   Select 53 34 32
-              55:     36(ptr)   AccessChain 26 28
-                                Store 55 54
+              49:     43(ptr)   AccessChain 42 29 34
+              50:     18(int)   Load 49
+              51:     6(bool)   INotEqual 50 34
+              52:    9(bvec2)   CompositeConstruct 51 51
+              53:   24(ivec2)   Select 52 33 35
+              54:     37(ptr)   AccessChain 27 29
+                                Store 54 53
                                 Branch 48
               48:             Label
-              56:     36(ptr) AccessChain 26 28
-              57:   23(ivec2) Load 56
-              58:     22(int) CompositeExtract 57 0
-              59:     6(bool) INotEqual 58 31
-                              SelectionMerge 61 None
-                              BranchConditional 59 60 61
-              60:               Label
-              63:     42(ptr)   AccessChain 41 28
-              64:   38(ivec4)   Load 63
-              66:    7(bvec4)   INotEqual 64 65
-                                Store 62(param) 66
-              68:           2   FunctionCall 14(foo(vb4;vb2;) 62(param) 67(param)
-              69:    9(bvec2)   Load 67(param)
-              70:   23(ivec2)   Select 69 34 32
-              71:     36(ptr)   AccessChain 26 28
-                                Store 71 70
-                                Branch 61
-              61:             Label
-              76:     42(ptr) AccessChain 41 28
-              77:   38(ivec4) Load 76
-              78:     22(int) CompositeExtract 77 0
-              79:     6(bool) INotEqual 78 31
-                              SelectionMerge 81 None
-                              BranchConditional 79 80 81
-              80:               Label
-              82:     42(ptr)   AccessChain 41 28
-              83:   38(ivec4)   Load 82
-              84:     22(int)   CompositeExtract 83 1
-              85:     6(bool)   INotEqual 84 31
-                                Branch 81
-              81:             Label
-              86:     6(bool) Phi 79 61 85 80
-              89:   72(float) Select 86 88 87
-              90:   73(fvec4) CompositeConstruct 89 89 89 89
-                              Store 75(fragColor) 90
-              91:     42(ptr) AccessChain 41 28
-              92:   38(ivec4) Load 91
-              93:     22(int) CompositeExtract 92 0
-              94:     6(bool) INotEqual 93 31
-              95:     6(bool) LogicalNot 94
-                              SelectionMerge 97 None
-                              BranchConditional 95 96 97
-              96:               Label
-              98:     42(ptr)   AccessChain 41 28
-              99:   38(ivec4)   Load 98
-             100:     22(int)   CompositeExtract 99 1
-             101:     6(bool)   INotEqual 100 31
-                                Branch 97
-              97:             Label
-             102:     6(bool) Phi 94 81 101 96
-             103:   72(float) Select 102 88 87
-             104:   73(fvec4) CompositeConstruct 103 103 103 103
-             105:   73(fvec4) Load 75(fragColor)
-             106:   73(fvec4) FSub 105 104
-                              Store 75(fragColor) 106
+              55:     43(ptr) AccessChain 27 29 34
+              56:     18(int) Load 55
+              57:     6(bool) INotEqual 56 34
+                              SelectionMerge 59 None
+                              BranchConditional 57 58 59
+              58:               Label
+              62:     61(ptr)   AccessChain 42 29
+              63:   39(ivec4)   Load 62
+              65:    7(bvec4)   INotEqual 63 64
+                                Store 60(param) 65
+              67:           2   FunctionCall 14(foo(vb4;vb2;) 60(param) 66(param)
+              68:    9(bvec2)   Load 66(param)
+              69:   24(ivec2)   Select 68 33 35
+              70:     37(ptr)   AccessChain 27 29
+                                Store 70 69
+                                Branch 59
+              59:             Label
+              75:     43(ptr) AccessChain 42 29 34
+              76:     18(int) Load 75
+              77:     6(bool) INotEqual 76 34
+                              SelectionMerge 79 None
+                              BranchConditional 77 78 79
+              78:               Label
+              80:     43(ptr)   AccessChain 42 29 32
+              81:     18(int)   Load 80
+              82:     6(bool)   INotEqual 81 34
+                                Branch 79
+              79:             Label
+              83:     6(bool) Phi 77 59 82 78
+              86:   71(float) Select 83 85 84
+              87:   72(fvec4) CompositeConstruct 86 86 86 86
+                              Store 74(fragColor) 87
+              88:     43(ptr) AccessChain 42 29 34
+              89:     18(int) Load 88
+              90:     6(bool) INotEqual 89 34
+              91:     6(bool) LogicalNot 90
+                              SelectionMerge 93 None
+                              BranchConditional 91 92 93
+              92:               Label
+              94:     43(ptr)   AccessChain 42 29 32
+              95:     18(int)   Load 94
+              96:     6(bool)   INotEqual 95 34
+                                Branch 93
+              93:             Label
+              97:     6(bool) Phi 90 79 96 92
+              98:   71(float) Select 97 85 84
+              99:   72(fvec4) CompositeConstruct 98 98 98 98
+             100:   72(fvec4) Load 74(fragColor)
+             101:   72(fvec4) FSub 100 99
+                              Store 74(fragColor) 101
                               Return
                               FunctionEnd
 14(foo(vb4;vb2;):           2 Function None 11
@@ -155,11 +148,11 @@
      13(paramb2):     10(ptr) FunctionParameter
               15:             Label
           17(b1):     16(ptr) Variable Function
-              18:    7(bvec4) Load 12(paramb4)
-              19:     6(bool) CompositeExtract 18 2
-                              Store 17(b1) 19
-              20:     6(bool) Load 17(b1)
-              21:    9(bvec2) CompositeConstruct 20 20
-                              Store 13(paramb2) 21
+              20:     16(ptr) AccessChain 12(paramb4) 19
+              21:     6(bool) Load 20
+                              Store 17(b1) 21
+              22:     6(bool) Load 17(b1)
+              23:    9(bvec2) CompositeConstruct 22 22
+                              Store 13(paramb2) 23
                               Return
                               FunctionEnd
diff --git a/Test/baseResults/spv.branch-return.vert.out b/Test/baseResults/spv.branch-return.vert.out
index 9093135..ca44724 100644
--- a/Test/baseResults/spv.branch-return.vert.out
+++ b/Test/baseResults/spv.branch-return.vert.out
@@ -1,8 +1,6 @@
 spv.branch-return.vert
-Warning, version 310 is not yet complete; most version-specific features are present, but some are missing.
-
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 38
 
                               Capability Shader
diff --git a/Test/baseResults/spv.buffer.autoassign.frag.out b/Test/baseResults/spv.buffer.autoassign.frag.out
index 2a316ee..507318f 100644
--- a/Test/baseResults/spv.buffer.autoassign.frag.out
+++ b/Test/baseResults/spv.buffer.autoassign.frag.out
@@ -1,6 +1,6 @@
 spv.buffer.autoassign.frag
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 50
 
                               Capability Shader
@@ -24,7 +24,7 @@
                               Name 34  "MyUB3"
                               MemberName 34(MyUB3) 0  "g_d"
                               Name 36  ""
-                              Name 47  "Color"
+                              Name 47  "@entryPointOutput.Color"
                               MemberDecorate 16(MyUB1) 0 Offset 0
                               MemberDecorate 16(MyUB1) 1 Offset 4
                               Decorate 16(MyUB1) Block
@@ -38,7 +38,7 @@
                               Decorate 34(MyUB3) Block
                               Decorate 36 DescriptorSet 0
                               Decorate 36 Binding 16
-                              Decorate 47(Color) Location 0
+                              Decorate 47(@entryPointOutput.Color) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -62,12 +62,12 @@
               36:     35(ptr) Variable Uniform
               41:             TypePointer Function 7(fvec4)
               46:             TypePointer Output 7(fvec4)
-       47(Color):     46(ptr) Variable Output
+47(@entryPointOutput.Color):     46(ptr) Variable Output
          4(main):           2 Function None 3
                5:             Label
               48:8(PS_OUTPUT) FunctionCall 10(@main()
               49:    7(fvec4) CompositeExtract 48 0
-                              Store 47(Color) 49
+                              Store 47(@entryPointOutput.Color) 49
                               Return
                               FunctionEnd
       10(@main():8(PS_OUTPUT) Function None 9
diff --git a/Test/baseResults/spv.builtInXFB.vert.out b/Test/baseResults/spv.builtInXFB.vert.out
new file mode 100644
index 0000000..556a698
--- /dev/null
+++ b/Test/baseResults/spv.builtInXFB.vert.out
@@ -0,0 +1,47 @@
+spv.builtInXFB.vert
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 21
+
+                              Capability Shader
+                              Capability TransformFeedback
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Vertex 4  "main" 10
+                              ExecutionMode 4 Xfb
+                              Source GLSL 450
+                              Name 4  "main"
+                              Name 8  "gl_PerVertex"
+                              MemberName 8(gl_PerVertex) 0  "gl_Position"
+                              MemberName 8(gl_PerVertex) 1  "gl_PointSize"
+                              Name 10  ""
+                              MemberDecorate 8(gl_PerVertex) 0 Offset 20
+                              MemberDecorate 8(gl_PerVertex) 0 BuiltIn Position
+                              MemberDecorate 8(gl_PerVertex) 1 Offset 16
+                              MemberDecorate 8(gl_PerVertex) 1 BuiltIn PointSize
+                              Decorate 8(gl_PerVertex) Block
+                              Decorate 10 XfbBuffer 1
+                              Decorate 10 XfbStride 64
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+ 8(gl_PerVertex):             TypeStruct 7(fvec4) 6(float)
+               9:             TypePointer Output 8(gl_PerVertex)
+              10:      9(ptr) Variable Output
+              11:             TypeInt 32 1
+              12:     11(int) Constant 0
+              13:    6(float) Constant 1065353216
+              14:    7(fvec4) ConstantComposite 13 13 13 13
+              15:             TypePointer Output 7(fvec4)
+              17:     11(int) Constant 1
+              18:    6(float) Constant 1073741824
+              19:             TypePointer Output 6(float)
+         4(main):           2 Function None 3
+               5:             Label
+              16:     15(ptr) AccessChain 10 12
+                              Store 16 14
+              20:     19(ptr) AccessChain 10 17
+                              Store 20 18
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.computeShaderDerivatives.comp.out b/Test/baseResults/spv.computeShaderDerivatives.comp.out
new file mode 100644
index 0000000..f05dbc0
--- /dev/null
+++ b/Test/baseResults/spv.computeShaderDerivatives.comp.out
@@ -0,0 +1,358 @@
+spv.computeShaderDerivatives.comp
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 212
+
+                              Capability Shader
+                              Capability DerivativeControl
+                              Capability ComputeDerivativeGroupQuadsNV
+                              Extension  "SPV_NV_compute_shader_derivatives"
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint GLCompute 4  "main"
+                              ExecutionMode 4 LocalSize 2 4 1
+                              ExecutionMode 4 DerivativeGroupQuadsNV
+                              Source GLSL 450
+                              SourceExtension  "GL_NV_compute_shader_derivatives"
+                              Name 4  "main"
+                              Name 10  "block"
+                              MemberName 10(block) 0  "fDerivativeX"
+                              MemberName 10(block) 1  "fDerivativeY"
+                              MemberName 10(block) 2  "fDerivativeWidth"
+                              MemberName 10(block) 3  "fCoarseDerivativeX"
+                              MemberName 10(block) 4  "fCoarseDerivativeY"
+                              MemberName 10(block) 5  "fCoarseDerivativeWidth"
+                              MemberName 10(block) 6  "fFineDerivativeX"
+                              MemberName 10(block) 7  "fFineDerivativeY"
+                              MemberName 10(block) 8  "fFineDerivativeWidth"
+                              MemberName 10(block) 9  "fX"
+                              MemberName 10(block) 10  "fY"
+                              MemberName 10(block) 11  "v2DerivativeX"
+                              MemberName 10(block) 12  "v2DerivativeY"
+                              MemberName 10(block) 13  "v2DerivativeWidth"
+                              MemberName 10(block) 14  "v2CoarseDerivativeX"
+                              MemberName 10(block) 15  "v2CoarseDerivativeY"
+                              MemberName 10(block) 16  "v2CoarseDerivativeWidth"
+                              MemberName 10(block) 17  "v2FineDerivativeX"
+                              MemberName 10(block) 18  "v2FineDerivativeY"
+                              MemberName 10(block) 19  "v2FineDerivativeWidth"
+                              MemberName 10(block) 20  "v2X"
+                              MemberName 10(block) 21  "v2Y"
+                              MemberName 10(block) 22  "v3DerivativeX"
+                              MemberName 10(block) 23  "v3DerivativeY"
+                              MemberName 10(block) 24  "v3DerivativeWidth"
+                              MemberName 10(block) 25  "v3CoarseDerivativeX"
+                              MemberName 10(block) 26  "v3CoarseDerivativeY"
+                              MemberName 10(block) 27  "v3CoarseDerivativeWidth"
+                              MemberName 10(block) 28  "v3FineDerivativeX"
+                              MemberName 10(block) 29  "v3FineDerivativeY"
+                              MemberName 10(block) 30  "v3FineDerivativeWidth"
+                              MemberName 10(block) 31  "v3X"
+                              MemberName 10(block) 32  "v3Y"
+                              MemberName 10(block) 33  "v4DerivativeX"
+                              MemberName 10(block) 34  "v4DerivativeY"
+                              MemberName 10(block) 35  "v4DerivativeWidth"
+                              MemberName 10(block) 36  "v4CoarseDerivativeX"
+                              MemberName 10(block) 37  "v4CoarseDerivativeY"
+                              MemberName 10(block) 38  "v4CoarseDerivativeWidth"
+                              MemberName 10(block) 39  "v4FineDerivativeX"
+                              MemberName 10(block) 40  "v4FineDerivativeY"
+                              MemberName 10(block) 41  "v4FineDerivativeWidth"
+                              MemberName 10(block) 42  "v4X"
+                              MemberName 10(block) 43  "v4Y"
+                              Name 12  ""
+                              MemberDecorate 10(block) 0 Offset 0
+                              MemberDecorate 10(block) 1 Offset 4
+                              MemberDecorate 10(block) 2 Offset 8
+                              MemberDecorate 10(block) 3 Offset 12
+                              MemberDecorate 10(block) 4 Offset 16
+                              MemberDecorate 10(block) 5 Offset 20
+                              MemberDecorate 10(block) 6 Offset 24
+                              MemberDecorate 10(block) 7 Offset 28
+                              MemberDecorate 10(block) 8 Offset 32
+                              MemberDecorate 10(block) 9 Offset 36
+                              MemberDecorate 10(block) 10 Offset 40
+                              MemberDecorate 10(block) 11 Offset 48
+                              MemberDecorate 10(block) 12 Offset 56
+                              MemberDecorate 10(block) 13 Offset 64
+                              MemberDecorate 10(block) 14 Offset 72
+                              MemberDecorate 10(block) 15 Offset 80
+                              MemberDecorate 10(block) 16 Offset 88
+                              MemberDecorate 10(block) 17 Offset 96
+                              MemberDecorate 10(block) 18 Offset 104
+                              MemberDecorate 10(block) 19 Offset 112
+                              MemberDecorate 10(block) 20 Offset 120
+                              MemberDecorate 10(block) 21 Offset 128
+                              MemberDecorate 10(block) 22 Offset 144
+                              MemberDecorate 10(block) 23 Offset 160
+                              MemberDecorate 10(block) 24 Offset 176
+                              MemberDecorate 10(block) 25 Offset 192
+                              MemberDecorate 10(block) 26 Offset 208
+                              MemberDecorate 10(block) 27 Offset 224
+                              MemberDecorate 10(block) 28 Offset 240
+                              MemberDecorate 10(block) 29 Offset 256
+                              MemberDecorate 10(block) 30 Offset 272
+                              MemberDecorate 10(block) 31 Offset 288
+                              MemberDecorate 10(block) 32 Offset 304
+                              MemberDecorate 10(block) 33 Offset 320
+                              MemberDecorate 10(block) 34 Offset 336
+                              MemberDecorate 10(block) 35 Offset 352
+                              MemberDecorate 10(block) 36 Offset 368
+                              MemberDecorate 10(block) 37 Offset 384
+                              MemberDecorate 10(block) 38 Offset 400
+                              MemberDecorate 10(block) 39 Offset 416
+                              MemberDecorate 10(block) 40 Offset 432
+                              MemberDecorate 10(block) 41 Offset 448
+                              MemberDecorate 10(block) 42 Offset 464
+                              MemberDecorate 10(block) 43 Offset 480
+                              Decorate 10(block) BufferBlock
+                              Decorate 12 DescriptorSet 0
+                              Decorate 211 BuiltIn WorkgroupSize
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 2
+               8:             TypeVector 6(float) 3
+               9:             TypeVector 6(float) 4
+       10(block):             TypeStruct 6(float) 6(float) 6(float) 6(float) 6(float) 6(float) 6(float) 6(float) 6(float) 6(float) 6(float) 7(fvec2) 7(fvec2) 7(fvec2) 7(fvec2) 7(fvec2) 7(fvec2) 7(fvec2) 7(fvec2) 7(fvec2) 7(fvec2) 7(fvec2) 8(fvec3) 8(fvec3) 8(fvec3) 8(fvec3) 8(fvec3) 8(fvec3) 8(fvec3) 8(fvec3) 8(fvec3) 8(fvec3) 8(fvec3) 9(fvec4) 9(fvec4) 9(fvec4) 9(fvec4) 9(fvec4) 9(fvec4) 9(fvec4) 9(fvec4) 9(fvec4) 9(fvec4) 9(fvec4)
+              11:             TypePointer Uniform 10(block)
+              12:     11(ptr) Variable Uniform
+              13:             TypeInt 32 1
+              14:     13(int) Constant 0
+              15:     13(int) Constant 9
+              16:             TypePointer Uniform 6(float)
+              21:     13(int) Constant 1
+              22:     13(int) Constant 10
+              27:     13(int) Constant 2
+              32:     13(int) Constant 3
+              37:     13(int) Constant 4
+              42:     13(int) Constant 5
+              47:     13(int) Constant 6
+              52:     13(int) Constant 7
+              57:     13(int) Constant 8
+              62:     13(int) Constant 11
+              63:     13(int) Constant 20
+              64:             TypePointer Uniform 7(fvec2)
+              69:     13(int) Constant 12
+              70:     13(int) Constant 21
+              75:     13(int) Constant 13
+              80:     13(int) Constant 14
+              85:     13(int) Constant 15
+              90:     13(int) Constant 16
+              95:     13(int) Constant 17
+             100:     13(int) Constant 18
+             105:     13(int) Constant 19
+             110:     13(int) Constant 22
+             111:     13(int) Constant 31
+             112:             TypePointer Uniform 8(fvec3)
+             117:     13(int) Constant 23
+             118:     13(int) Constant 32
+             123:     13(int) Constant 24
+             128:     13(int) Constant 25
+             133:     13(int) Constant 26
+             138:     13(int) Constant 27
+             143:     13(int) Constant 28
+             148:     13(int) Constant 29
+             153:     13(int) Constant 30
+             158:     13(int) Constant 33
+             159:     13(int) Constant 42
+             160:             TypePointer Uniform 9(fvec4)
+             165:     13(int) Constant 34
+             166:     13(int) Constant 43
+             171:     13(int) Constant 35
+             176:     13(int) Constant 36
+             181:     13(int) Constant 37
+             186:     13(int) Constant 38
+             191:     13(int) Constant 39
+             196:     13(int) Constant 40
+             201:     13(int) Constant 41
+             206:             TypeInt 32 0
+             207:             TypeVector 206(int) 3
+             208:    206(int) Constant 2
+             209:    206(int) Constant 4
+             210:    206(int) Constant 1
+             211:  207(ivec3) ConstantComposite 208 209 210
+         4(main):           2 Function None 3
+               5:             Label
+              17:     16(ptr) AccessChain 12 15
+              18:    6(float) Load 17
+              19:    6(float) DPdx 18
+              20:     16(ptr) AccessChain 12 14
+                              Store 20 19
+              23:     16(ptr) AccessChain 12 22
+              24:    6(float) Load 23
+              25:    6(float) DPdy 24
+              26:     16(ptr) AccessChain 12 21
+                              Store 26 25
+              28:     16(ptr) AccessChain 12 15
+              29:    6(float) Load 28
+              30:    6(float) Fwidth 29
+              31:     16(ptr) AccessChain 12 27
+                              Store 31 30
+              33:     16(ptr) AccessChain 12 15
+              34:    6(float) Load 33
+              35:    6(float) DPdxCoarse 34
+              36:     16(ptr) AccessChain 12 32
+                              Store 36 35
+              38:     16(ptr) AccessChain 12 22
+              39:    6(float) Load 38
+              40:    6(float) DPdyCoarse 39
+              41:     16(ptr) AccessChain 12 37
+                              Store 41 40
+              43:     16(ptr) AccessChain 12 15
+              44:    6(float) Load 43
+              45:    6(float) FwidthCoarse 44
+              46:     16(ptr) AccessChain 12 42
+                              Store 46 45
+              48:     16(ptr) AccessChain 12 15
+              49:    6(float) Load 48
+              50:    6(float) DPdxFine 49
+              51:     16(ptr) AccessChain 12 47
+                              Store 51 50
+              53:     16(ptr) AccessChain 12 22
+              54:    6(float) Load 53
+              55:    6(float) DPdyFine 54
+              56:     16(ptr) AccessChain 12 52
+                              Store 56 55
+              58:     16(ptr) AccessChain 12 15
+              59:    6(float) Load 58
+              60:    6(float) FwidthFine 59
+              61:     16(ptr) AccessChain 12 57
+                              Store 61 60
+              65:     64(ptr) AccessChain 12 63
+              66:    7(fvec2) Load 65
+              67:    7(fvec2) DPdx 66
+              68:     64(ptr) AccessChain 12 62
+                              Store 68 67
+              71:     64(ptr) AccessChain 12 70
+              72:    7(fvec2) Load 71
+              73:    7(fvec2) DPdy 72
+              74:     64(ptr) AccessChain 12 69
+                              Store 74 73
+              76:     64(ptr) AccessChain 12 63
+              77:    7(fvec2) Load 76
+              78:    7(fvec2) Fwidth 77
+              79:     64(ptr) AccessChain 12 75
+                              Store 79 78
+              81:     64(ptr) AccessChain 12 63
+              82:    7(fvec2) Load 81
+              83:    7(fvec2) DPdxCoarse 82
+              84:     64(ptr) AccessChain 12 80
+                              Store 84 83
+              86:     64(ptr) AccessChain 12 70
+              87:    7(fvec2) Load 86
+              88:    7(fvec2) DPdyCoarse 87
+              89:     64(ptr) AccessChain 12 85
+                              Store 89 88
+              91:     64(ptr) AccessChain 12 63
+              92:    7(fvec2) Load 91
+              93:    7(fvec2) FwidthCoarse 92
+              94:     64(ptr) AccessChain 12 90
+                              Store 94 93
+              96:     64(ptr) AccessChain 12 63
+              97:    7(fvec2) Load 96
+              98:    7(fvec2) DPdxFine 97
+              99:     64(ptr) AccessChain 12 95
+                              Store 99 98
+             101:     64(ptr) AccessChain 12 70
+             102:    7(fvec2) Load 101
+             103:    7(fvec2) DPdyFine 102
+             104:     64(ptr) AccessChain 12 100
+                              Store 104 103
+             106:     64(ptr) AccessChain 12 63
+             107:    7(fvec2) Load 106
+             108:    7(fvec2) FwidthFine 107
+             109:     64(ptr) AccessChain 12 105
+                              Store 109 108
+             113:    112(ptr) AccessChain 12 111
+             114:    8(fvec3) Load 113
+             115:    8(fvec3) DPdx 114
+             116:    112(ptr) AccessChain 12 110
+                              Store 116 115
+             119:    112(ptr) AccessChain 12 118
+             120:    8(fvec3) Load 119
+             121:    8(fvec3) DPdy 120
+             122:    112(ptr) AccessChain 12 117
+                              Store 122 121
+             124:    112(ptr) AccessChain 12 111
+             125:    8(fvec3) Load 124
+             126:    8(fvec3) Fwidth 125
+             127:    112(ptr) AccessChain 12 123
+                              Store 127 126
+             129:    112(ptr) AccessChain 12 111
+             130:    8(fvec3) Load 129
+             131:    8(fvec3) DPdxCoarse 130
+             132:    112(ptr) AccessChain 12 128
+                              Store 132 131
+             134:    112(ptr) AccessChain 12 118
+             135:    8(fvec3) Load 134
+             136:    8(fvec3) DPdyCoarse 135
+             137:    112(ptr) AccessChain 12 133
+                              Store 137 136
+             139:    112(ptr) AccessChain 12 111
+             140:    8(fvec3) Load 139
+             141:    8(fvec3) FwidthCoarse 140
+             142:    112(ptr) AccessChain 12 138
+                              Store 142 141
+             144:    112(ptr) AccessChain 12 111
+             145:    8(fvec3) Load 144
+             146:    8(fvec3) DPdxFine 145
+             147:    112(ptr) AccessChain 12 143
+                              Store 147 146
+             149:    112(ptr) AccessChain 12 118
+             150:    8(fvec3) Load 149
+             151:    8(fvec3) DPdyFine 150
+             152:    112(ptr) AccessChain 12 148
+                              Store 152 151
+             154:    112(ptr) AccessChain 12 111
+             155:    8(fvec3) Load 154
+             156:    8(fvec3) FwidthFine 155
+             157:    112(ptr) AccessChain 12 153
+                              Store 157 156
+             161:    160(ptr) AccessChain 12 159
+             162:    9(fvec4) Load 161
+             163:    9(fvec4) DPdx 162
+             164:    160(ptr) AccessChain 12 158
+                              Store 164 163
+             167:    160(ptr) AccessChain 12 166
+             168:    9(fvec4) Load 167
+             169:    9(fvec4) DPdy 168
+             170:    160(ptr) AccessChain 12 165
+                              Store 170 169
+             172:    160(ptr) AccessChain 12 159
+             173:    9(fvec4) Load 172
+             174:    9(fvec4) Fwidth 173
+             175:    160(ptr) AccessChain 12 171
+                              Store 175 174
+             177:    160(ptr) AccessChain 12 159
+             178:    9(fvec4) Load 177
+             179:    9(fvec4) DPdxCoarse 178
+             180:    160(ptr) AccessChain 12 176
+                              Store 180 179
+             182:    160(ptr) AccessChain 12 166
+             183:    9(fvec4) Load 182
+             184:    9(fvec4) DPdyCoarse 183
+             185:    160(ptr) AccessChain 12 181
+                              Store 185 184
+             187:    160(ptr) AccessChain 12 159
+             188:    9(fvec4) Load 187
+             189:    9(fvec4) FwidthCoarse 188
+             190:    160(ptr) AccessChain 12 186
+                              Store 190 189
+             192:    160(ptr) AccessChain 12 159
+             193:    9(fvec4) Load 192
+             194:    9(fvec4) DPdxFine 193
+             195:    160(ptr) AccessChain 12 191
+                              Store 195 194
+             197:    160(ptr) AccessChain 12 166
+             198:    9(fvec4) Load 197
+             199:    9(fvec4) DPdyFine 198
+             200:    160(ptr) AccessChain 12 196
+                              Store 200 199
+             202:    160(ptr) AccessChain 12 159
+             203:    9(fvec4) Load 202
+             204:    9(fvec4) FwidthFine 203
+             205:    160(ptr) AccessChain 12 201
+                              Store 205 204
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.computeShaderDerivatives2.comp.out b/Test/baseResults/spv.computeShaderDerivatives2.comp.out
new file mode 100644
index 0000000..94a3dfc
--- /dev/null
+++ b/Test/baseResults/spv.computeShaderDerivatives2.comp.out
@@ -0,0 +1,358 @@
+spv.computeShaderDerivatives2.comp
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 212
+
+                              Capability Shader
+                              Capability DerivativeControl
+                              Capability ComputeDerivativeGroupLinearNV
+                              Extension  "SPV_NV_compute_shader_derivatives"
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint GLCompute 4  "main"
+                              ExecutionMode 4 LocalSize 2 4 1
+                              ExecutionMode 4 DerivativeGroupLinearNV
+                              Source ESSL 320
+                              SourceExtension  "GL_NV_compute_shader_derivatives"
+                              Name 4  "main"
+                              Name 10  "block"
+                              MemberName 10(block) 0  "fDerivativeX"
+                              MemberName 10(block) 1  "fDerivativeY"
+                              MemberName 10(block) 2  "fDerivativeWidth"
+                              MemberName 10(block) 3  "fCoarseDerivativeX"
+                              MemberName 10(block) 4  "fCoarseDerivativeY"
+                              MemberName 10(block) 5  "fCoarseDerivativeWidth"
+                              MemberName 10(block) 6  "fFineDerivativeX"
+                              MemberName 10(block) 7  "fFineDerivativeY"
+                              MemberName 10(block) 8  "fFineDerivativeWidth"
+                              MemberName 10(block) 9  "fX"
+                              MemberName 10(block) 10  "fY"
+                              MemberName 10(block) 11  "v2DerivativeX"
+                              MemberName 10(block) 12  "v2DerivativeY"
+                              MemberName 10(block) 13  "v2DerivativeWidth"
+                              MemberName 10(block) 14  "v2CoarseDerivativeX"
+                              MemberName 10(block) 15  "v2CoarseDerivativeY"
+                              MemberName 10(block) 16  "v2CoarseDerivativeWidth"
+                              MemberName 10(block) 17  "v2FineDerivativeX"
+                              MemberName 10(block) 18  "v2FineDerivativeY"
+                              MemberName 10(block) 19  "v2FineDerivativeWidth"
+                              MemberName 10(block) 20  "v2X"
+                              MemberName 10(block) 21  "v2Y"
+                              MemberName 10(block) 22  "v3DerivativeX"
+                              MemberName 10(block) 23  "v3DerivativeY"
+                              MemberName 10(block) 24  "v3DerivativeWidth"
+                              MemberName 10(block) 25  "v3CoarseDerivativeX"
+                              MemberName 10(block) 26  "v3CoarseDerivativeY"
+                              MemberName 10(block) 27  "v3CoarseDerivativeWidth"
+                              MemberName 10(block) 28  "v3FineDerivativeX"
+                              MemberName 10(block) 29  "v3FineDerivativeY"
+                              MemberName 10(block) 30  "v3FineDerivativeWidth"
+                              MemberName 10(block) 31  "v3X"
+                              MemberName 10(block) 32  "v3Y"
+                              MemberName 10(block) 33  "v4DerivativeX"
+                              MemberName 10(block) 34  "v4DerivativeY"
+                              MemberName 10(block) 35  "v4DerivativeWidth"
+                              MemberName 10(block) 36  "v4CoarseDerivativeX"
+                              MemberName 10(block) 37  "v4CoarseDerivativeY"
+                              MemberName 10(block) 38  "v4CoarseDerivativeWidth"
+                              MemberName 10(block) 39  "v4FineDerivativeX"
+                              MemberName 10(block) 40  "v4FineDerivativeY"
+                              MemberName 10(block) 41  "v4FineDerivativeWidth"
+                              MemberName 10(block) 42  "v4X"
+                              MemberName 10(block) 43  "v4Y"
+                              Name 12  ""
+                              MemberDecorate 10(block) 0 Offset 0
+                              MemberDecorate 10(block) 1 Offset 4
+                              MemberDecorate 10(block) 2 Offset 8
+                              MemberDecorate 10(block) 3 Offset 12
+                              MemberDecorate 10(block) 4 Offset 16
+                              MemberDecorate 10(block) 5 Offset 20
+                              MemberDecorate 10(block) 6 Offset 24
+                              MemberDecorate 10(block) 7 Offset 28
+                              MemberDecorate 10(block) 8 Offset 32
+                              MemberDecorate 10(block) 9 Offset 36
+                              MemberDecorate 10(block) 10 Offset 40
+                              MemberDecorate 10(block) 11 Offset 48
+                              MemberDecorate 10(block) 12 Offset 56
+                              MemberDecorate 10(block) 13 Offset 64
+                              MemberDecorate 10(block) 14 Offset 72
+                              MemberDecorate 10(block) 15 Offset 80
+                              MemberDecorate 10(block) 16 Offset 88
+                              MemberDecorate 10(block) 17 Offset 96
+                              MemberDecorate 10(block) 18 Offset 104
+                              MemberDecorate 10(block) 19 Offset 112
+                              MemberDecorate 10(block) 20 Offset 120
+                              MemberDecorate 10(block) 21 Offset 128
+                              MemberDecorate 10(block) 22 Offset 144
+                              MemberDecorate 10(block) 23 Offset 160
+                              MemberDecorate 10(block) 24 Offset 176
+                              MemberDecorate 10(block) 25 Offset 192
+                              MemberDecorate 10(block) 26 Offset 208
+                              MemberDecorate 10(block) 27 Offset 224
+                              MemberDecorate 10(block) 28 Offset 240
+                              MemberDecorate 10(block) 29 Offset 256
+                              MemberDecorate 10(block) 30 Offset 272
+                              MemberDecorate 10(block) 31 Offset 288
+                              MemberDecorate 10(block) 32 Offset 304
+                              MemberDecorate 10(block) 33 Offset 320
+                              MemberDecorate 10(block) 34 Offset 336
+                              MemberDecorate 10(block) 35 Offset 352
+                              MemberDecorate 10(block) 36 Offset 368
+                              MemberDecorate 10(block) 37 Offset 384
+                              MemberDecorate 10(block) 38 Offset 400
+                              MemberDecorate 10(block) 39 Offset 416
+                              MemberDecorate 10(block) 40 Offset 432
+                              MemberDecorate 10(block) 41 Offset 448
+                              MemberDecorate 10(block) 42 Offset 464
+                              MemberDecorate 10(block) 43 Offset 480
+                              Decorate 10(block) BufferBlock
+                              Decorate 12 DescriptorSet 0
+                              Decorate 211 BuiltIn WorkgroupSize
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 2
+               8:             TypeVector 6(float) 3
+               9:             TypeVector 6(float) 4
+       10(block):             TypeStruct 6(float) 6(float) 6(float) 6(float) 6(float) 6(float) 6(float) 6(float) 6(float) 6(float) 6(float) 7(fvec2) 7(fvec2) 7(fvec2) 7(fvec2) 7(fvec2) 7(fvec2) 7(fvec2) 7(fvec2) 7(fvec2) 7(fvec2) 7(fvec2) 8(fvec3) 8(fvec3) 8(fvec3) 8(fvec3) 8(fvec3) 8(fvec3) 8(fvec3) 8(fvec3) 8(fvec3) 8(fvec3) 8(fvec3) 9(fvec4) 9(fvec4) 9(fvec4) 9(fvec4) 9(fvec4) 9(fvec4) 9(fvec4) 9(fvec4) 9(fvec4) 9(fvec4) 9(fvec4)
+              11:             TypePointer Uniform 10(block)
+              12:     11(ptr) Variable Uniform
+              13:             TypeInt 32 1
+              14:     13(int) Constant 0
+              15:     13(int) Constant 9
+              16:             TypePointer Uniform 6(float)
+              21:     13(int) Constant 1
+              22:     13(int) Constant 10
+              27:     13(int) Constant 2
+              32:     13(int) Constant 3
+              37:     13(int) Constant 4
+              42:     13(int) Constant 5
+              47:     13(int) Constant 6
+              52:     13(int) Constant 7
+              57:     13(int) Constant 8
+              62:     13(int) Constant 11
+              63:     13(int) Constant 20
+              64:             TypePointer Uniform 7(fvec2)
+              69:     13(int) Constant 12
+              70:     13(int) Constant 21
+              75:     13(int) Constant 13
+              80:     13(int) Constant 14
+              85:     13(int) Constant 15
+              90:     13(int) Constant 16
+              95:     13(int) Constant 17
+             100:     13(int) Constant 18
+             105:     13(int) Constant 19
+             110:     13(int) Constant 22
+             111:     13(int) Constant 31
+             112:             TypePointer Uniform 8(fvec3)
+             117:     13(int) Constant 23
+             118:     13(int) Constant 32
+             123:     13(int) Constant 24
+             128:     13(int) Constant 25
+             133:     13(int) Constant 26
+             138:     13(int) Constant 27
+             143:     13(int) Constant 28
+             148:     13(int) Constant 29
+             153:     13(int) Constant 30
+             158:     13(int) Constant 33
+             159:     13(int) Constant 42
+             160:             TypePointer Uniform 9(fvec4)
+             165:     13(int) Constant 34
+             166:     13(int) Constant 43
+             171:     13(int) Constant 35
+             176:     13(int) Constant 36
+             181:     13(int) Constant 37
+             186:     13(int) Constant 38
+             191:     13(int) Constant 39
+             196:     13(int) Constant 40
+             201:     13(int) Constant 41
+             206:             TypeInt 32 0
+             207:             TypeVector 206(int) 3
+             208:    206(int) Constant 2
+             209:    206(int) Constant 4
+             210:    206(int) Constant 1
+             211:  207(ivec3) ConstantComposite 208 209 210
+         4(main):           2 Function None 3
+               5:             Label
+              17:     16(ptr) AccessChain 12 15
+              18:    6(float) Load 17
+              19:    6(float) DPdx 18
+              20:     16(ptr) AccessChain 12 14
+                              Store 20 19
+              23:     16(ptr) AccessChain 12 22
+              24:    6(float) Load 23
+              25:    6(float) DPdy 24
+              26:     16(ptr) AccessChain 12 21
+                              Store 26 25
+              28:     16(ptr) AccessChain 12 15
+              29:    6(float) Load 28
+              30:    6(float) Fwidth 29
+              31:     16(ptr) AccessChain 12 27
+                              Store 31 30
+              33:     16(ptr) AccessChain 12 15
+              34:    6(float) Load 33
+              35:    6(float) DPdxCoarse 34
+              36:     16(ptr) AccessChain 12 32
+                              Store 36 35
+              38:     16(ptr) AccessChain 12 22
+              39:    6(float) Load 38
+              40:    6(float) DPdyCoarse 39
+              41:     16(ptr) AccessChain 12 37
+                              Store 41 40
+              43:     16(ptr) AccessChain 12 15
+              44:    6(float) Load 43
+              45:    6(float) FwidthCoarse 44
+              46:     16(ptr) AccessChain 12 42
+                              Store 46 45
+              48:     16(ptr) AccessChain 12 15
+              49:    6(float) Load 48
+              50:    6(float) DPdxFine 49
+              51:     16(ptr) AccessChain 12 47
+                              Store 51 50
+              53:     16(ptr) AccessChain 12 22
+              54:    6(float) Load 53
+              55:    6(float) DPdyFine 54
+              56:     16(ptr) AccessChain 12 52
+                              Store 56 55
+              58:     16(ptr) AccessChain 12 15
+              59:    6(float) Load 58
+              60:    6(float) FwidthFine 59
+              61:     16(ptr) AccessChain 12 57
+                              Store 61 60
+              65:     64(ptr) AccessChain 12 63
+              66:    7(fvec2) Load 65
+              67:    7(fvec2) DPdx 66
+              68:     64(ptr) AccessChain 12 62
+                              Store 68 67
+              71:     64(ptr) AccessChain 12 70
+              72:    7(fvec2) Load 71
+              73:    7(fvec2) DPdy 72
+              74:     64(ptr) AccessChain 12 69
+                              Store 74 73
+              76:     64(ptr) AccessChain 12 63
+              77:    7(fvec2) Load 76
+              78:    7(fvec2) Fwidth 77
+              79:     64(ptr) AccessChain 12 75
+                              Store 79 78
+              81:     64(ptr) AccessChain 12 63
+              82:    7(fvec2) Load 81
+              83:    7(fvec2) DPdxCoarse 82
+              84:     64(ptr) AccessChain 12 80
+                              Store 84 83
+              86:     64(ptr) AccessChain 12 70
+              87:    7(fvec2) Load 86
+              88:    7(fvec2) DPdyCoarse 87
+              89:     64(ptr) AccessChain 12 85
+                              Store 89 88
+              91:     64(ptr) AccessChain 12 63
+              92:    7(fvec2) Load 91
+              93:    7(fvec2) FwidthCoarse 92
+              94:     64(ptr) AccessChain 12 90
+                              Store 94 93
+              96:     64(ptr) AccessChain 12 63
+              97:    7(fvec2) Load 96
+              98:    7(fvec2) DPdxFine 97
+              99:     64(ptr) AccessChain 12 95
+                              Store 99 98
+             101:     64(ptr) AccessChain 12 70
+             102:    7(fvec2) Load 101
+             103:    7(fvec2) DPdyFine 102
+             104:     64(ptr) AccessChain 12 100
+                              Store 104 103
+             106:     64(ptr) AccessChain 12 63
+             107:    7(fvec2) Load 106
+             108:    7(fvec2) FwidthFine 107
+             109:     64(ptr) AccessChain 12 105
+                              Store 109 108
+             113:    112(ptr) AccessChain 12 111
+             114:    8(fvec3) Load 113
+             115:    8(fvec3) DPdx 114
+             116:    112(ptr) AccessChain 12 110
+                              Store 116 115
+             119:    112(ptr) AccessChain 12 118
+             120:    8(fvec3) Load 119
+             121:    8(fvec3) DPdy 120
+             122:    112(ptr) AccessChain 12 117
+                              Store 122 121
+             124:    112(ptr) AccessChain 12 111
+             125:    8(fvec3) Load 124
+             126:    8(fvec3) Fwidth 125
+             127:    112(ptr) AccessChain 12 123
+                              Store 127 126
+             129:    112(ptr) AccessChain 12 111
+             130:    8(fvec3) Load 129
+             131:    8(fvec3) DPdxCoarse 130
+             132:    112(ptr) AccessChain 12 128
+                              Store 132 131
+             134:    112(ptr) AccessChain 12 118
+             135:    8(fvec3) Load 134
+             136:    8(fvec3) DPdyCoarse 135
+             137:    112(ptr) AccessChain 12 133
+                              Store 137 136
+             139:    112(ptr) AccessChain 12 111
+             140:    8(fvec3) Load 139
+             141:    8(fvec3) FwidthCoarse 140
+             142:    112(ptr) AccessChain 12 138
+                              Store 142 141
+             144:    112(ptr) AccessChain 12 111
+             145:    8(fvec3) Load 144
+             146:    8(fvec3) DPdxFine 145
+             147:    112(ptr) AccessChain 12 143
+                              Store 147 146
+             149:    112(ptr) AccessChain 12 118
+             150:    8(fvec3) Load 149
+             151:    8(fvec3) DPdyFine 150
+             152:    112(ptr) AccessChain 12 148
+                              Store 152 151
+             154:    112(ptr) AccessChain 12 111
+             155:    8(fvec3) Load 154
+             156:    8(fvec3) FwidthFine 155
+             157:    112(ptr) AccessChain 12 153
+                              Store 157 156
+             161:    160(ptr) AccessChain 12 159
+             162:    9(fvec4) Load 161
+             163:    9(fvec4) DPdx 162
+             164:    160(ptr) AccessChain 12 158
+                              Store 164 163
+             167:    160(ptr) AccessChain 12 166
+             168:    9(fvec4) Load 167
+             169:    9(fvec4) DPdy 168
+             170:    160(ptr) AccessChain 12 165
+                              Store 170 169
+             172:    160(ptr) AccessChain 12 159
+             173:    9(fvec4) Load 172
+             174:    9(fvec4) Fwidth 173
+             175:    160(ptr) AccessChain 12 171
+                              Store 175 174
+             177:    160(ptr) AccessChain 12 159
+             178:    9(fvec4) Load 177
+             179:    9(fvec4) DPdxCoarse 178
+             180:    160(ptr) AccessChain 12 176
+                              Store 180 179
+             182:    160(ptr) AccessChain 12 166
+             183:    9(fvec4) Load 182
+             184:    9(fvec4) DPdyCoarse 183
+             185:    160(ptr) AccessChain 12 181
+                              Store 185 184
+             187:    160(ptr) AccessChain 12 159
+             188:    9(fvec4) Load 187
+             189:    9(fvec4) FwidthCoarse 188
+             190:    160(ptr) AccessChain 12 186
+                              Store 190 189
+             192:    160(ptr) AccessChain 12 159
+             193:    9(fvec4) Load 192
+             194:    9(fvec4) DPdxFine 193
+             195:    160(ptr) AccessChain 12 191
+                              Store 195 194
+             197:    160(ptr) AccessChain 12 166
+             198:    9(fvec4) Load 197
+             199:    9(fvec4) DPdyFine 198
+             200:    160(ptr) AccessChain 12 196
+                              Store 200 199
+             202:    160(ptr) AccessChain 12 159
+             203:    9(fvec4) Load 202
+             204:    9(fvec4) FwidthFine 203
+             205:    160(ptr) AccessChain 12 201
+                              Store 205 204
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.conditionalDiscard.frag.out b/Test/baseResults/spv.conditionalDiscard.frag.out
old mode 100755
new mode 100644
index b3cb8e8..f5e9e6f
--- a/Test/baseResults/spv.conditionalDiscard.frag.out
+++ b/Test/baseResults/spv.conditionalDiscard.frag.out
@@ -1,8 +1,6 @@
 spv.conditionalDiscard.frag
-Warning, version 400 is not yet complete; most version-specific features are present, but some are missing.
-
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 36
 
                               Capability Shader
@@ -17,6 +15,7 @@
                               Name 17  "coord"
                               Name 34  "gl_FragColor"
                               Decorate 13(tex) DescriptorSet 0
+                              Decorate 34(gl_FragColor) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
diff --git a/Test/baseResults/spv.constStruct.vert.out b/Test/baseResults/spv.constStruct.vert.out
new file mode 100644
index 0000000..d04f33d
--- /dev/null
+++ b/Test/baseResults/spv.constStruct.vert.out
@@ -0,0 +1,45 @@
+spv.constStruct.vert
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 23
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Vertex 4  "main"
+                              Source GLSL 450
+                              Name 4  "main"
+                              Name 9  "T"
+                              MemberName 9(T) 0  "m"
+                              Name 10  "U"
+                              MemberName 10(U) 0  "m"
+                              Name 11  "S"
+                              MemberName 11(S) 0  "t"
+                              MemberName 11(S) 1  "u"
+                              Name 13  "s1"
+                              Name 22  "s2"
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 2
+               8:             TypeMatrix 7(fvec2) 2
+            9(T):             TypeStruct 8
+           10(U):             TypeStruct 8
+           11(S):             TypeStruct 9(T) 10(U)
+              12:             TypePointer Function 11(S)
+              14:    6(float) Constant 1065353216
+              15:    6(float) Constant 0
+              16:    7(fvec2) ConstantComposite 14 15
+              17:    7(fvec2) ConstantComposite 15 14
+              18:           8 ConstantComposite 16 17
+              19:        9(T) ConstantComposite 18
+              20:       10(U) ConstantComposite 18
+              21:       11(S) ConstantComposite 19 20
+         4(main):           2 Function None 3
+               5:             Label
+          13(s1):     12(ptr) Variable Function
+          22(s2):     12(ptr) Variable Function
+                              Store 13(s1) 21
+                              Store 22(s2) 21
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.controlFlowAttributes.frag.out b/Test/baseResults/spv.controlFlowAttributes.frag.out
new file mode 100644
index 0000000..2f074de
--- /dev/null
+++ b/Test/baseResults/spv.controlFlowAttributes.frag.out
@@ -0,0 +1,240 @@
+spv.controlFlowAttributes.frag
+WARNING: 0:20: '' : attribute with arguments not recognized, skipping 
+WARNING: 0:21: '' : attribute with arguments not recognized, skipping 
+WARNING: 0:22: '' : attribute with arguments not recognized, skipping 
+WARNING: 0:23: 'dependency_length' : expected a single integer argument 
+WARNING: 0:24: '' : attribute with arguments not recognized, skipping 
+WARNING: 0:25: '' : attribute with arguments not recognized, skipping 
+WARNING: 0:26: '' : attribute with arguments not recognized, skipping 
+
+error: SPIRV-Tools Validation Errors
+error: Invalid loop control operand: 4 has invalid mask component 4
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 118
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main"
+                              ExecutionMode 4 OriginUpperLeft
+                              Source GLSL 450
+                              SourceExtension  "GL_EXT_control_flow_attributes"
+                              Name 4  "main"
+                              Name 8  "i"
+                              Name 36  "i"
+                              Name 47  "cond"
+                              Name 60  "i"
+                              Name 79  "i"
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeInt 32 1
+               7:             TypePointer Function 6(int)
+               9:      6(int) Constant 0
+              16:      6(int) Constant 8
+              17:             TypeBool
+              20:      6(int) Constant 1
+              31:    17(bool) ConstantTrue
+              46:             TypePointer Private 17(bool)
+        47(cond):     46(ptr) Variable Private
+              54:    17(bool) ConstantFalse
+              55:      6(int) Constant 3
+         4(main):           2 Function None 3
+               5:             Label
+            8(i):      7(ptr) Variable Function
+           36(i):      7(ptr) Variable Function
+           60(i):      7(ptr) Variable Function
+           79(i):      7(ptr) Variable Function
+                              Store 8(i) 9
+                              Branch 10
+              10:             Label
+                              LoopMerge 12 13 Unroll 
+                              Branch 14
+              14:             Label
+              15:      6(int) Load 8(i)
+              18:    17(bool) SLessThan 15 16
+                              BranchConditional 18 11 12
+              11:               Label
+                                Branch 13
+              13:               Label
+              19:      6(int)   Load 8(i)
+              21:      6(int)   IAdd 19 20
+                                Store 8(i) 21
+                                Branch 10
+              12:             Label
+                              Branch 22
+              22:             Label
+                              LoopMerge 24 25 DontUnroll 
+                              Branch 23
+              23:             Label
+                              Branch 25
+              25:             Label
+                              Branch 22
+              24:             Label
+                              Branch 26
+              26:             Label
+                              LoopMerge 28 29 DontUnroll 
+                              Branch 30
+              30:             Label
+                              BranchConditional 31 27 28
+              27:               Label
+                                Branch 29
+              29:               Label
+                                Branch 26
+              28:             Label
+                              Branch 32
+              32:             Label
+                              LoopMerge 34 35 DependencyInfinite 
+                              Branch 33
+              33:             Label
+                              Branch 35
+              35:             Label
+                              BranchConditional 31 32 34
+              34:             Label
+                              Store 36(i) 9
+                              Branch 37
+              37:             Label
+                              LoopMerge 39 40 DependencyLength  4
+                              Branch 41
+              41:             Label
+              42:      6(int) Load 36(i)
+              43:    17(bool) SLessThan 42 16
+                              BranchConditional 43 38 39
+              38:               Label
+                                Branch 40
+              40:               Label
+              44:      6(int)   Load 36(i)
+              45:      6(int)   IAdd 44 20
+                                Store 36(i) 45
+                                Branch 37
+              39:             Label
+              48:    17(bool) Load 47(cond)
+                              SelectionMerge 50 Flatten 
+                              BranchConditional 48 49 50
+              49:               Label
+                                Branch 50
+              50:             Label
+              51:    17(bool) Load 47(cond)
+                              SelectionMerge 53 DontFlatten 
+                              BranchConditional 51 52 53
+              52:               Label
+                                Store 47(cond) 54
+                                Branch 53
+              53:             Label
+                              SelectionMerge 57 DontFlatten 
+                              Switch 55 57 
+                                     case 3: 56
+              56:               Label
+                                Branch 57
+              57:             Label
+                              Store 60(i) 9
+                              Branch 61
+              61:             Label
+                              LoopMerge 63 64 None
+                              Branch 65
+              65:             Label
+              66:      6(int) Load 60(i)
+              67:    17(bool) SLessThan 66 16
+                              BranchConditional 67 62 63
+              62:               Label
+                                Branch 64
+              64:               Label
+              68:      6(int)   Load 60(i)
+              69:      6(int)   IAdd 68 20
+                                Store 60(i) 69
+                                Branch 61
+              63:             Label
+                              Branch 70
+              70:             Label
+                              LoopMerge 72 73 None
+                              Branch 74
+              74:             Label
+                              BranchConditional 31 71 72
+              71:               Label
+                                Branch 73
+              73:               Label
+                                Branch 70
+              72:             Label
+                              Branch 75
+              75:             Label
+                              LoopMerge 77 78 None
+                              Branch 76
+              76:             Label
+                              Branch 78
+              78:             Label
+                              BranchConditional 31 75 77
+              77:             Label
+                              Store 79(i) 9
+                              Branch 80
+              80:             Label
+                              LoopMerge 82 83 None
+                              Branch 84
+              84:             Label
+              85:      6(int) Load 79(i)
+              86:    17(bool) SLessThan 85 16
+                              BranchConditional 86 81 82
+              81:               Label
+                                Branch 83
+              83:               Label
+              87:      6(int)   Load 79(i)
+              88:      6(int)   IAdd 87 20
+                                Store 79(i) 88
+                                Branch 80
+              82:             Label
+              89:    17(bool) Load 47(cond)
+                              SelectionMerge 91 None
+                              BranchConditional 89 90 91
+              90:               Label
+                                Branch 91
+              91:             Label
+              92:    17(bool) Load 47(cond)
+                              SelectionMerge 94 None
+                              BranchConditional 92 93 94
+              93:               Label
+                                Store 47(cond) 54
+                                Branch 94
+              94:             Label
+                              SelectionMerge 96 None
+                              Switch 55 96 
+                                     case 3: 95
+              95:               Label
+                                Branch 96
+              96:             Label
+                              Branch 99
+              99:             Label
+                              LoopMerge 101 102 Unroll DontUnroll DependencyLength  2
+                              Branch 103
+             103:             Label
+             104:    17(bool) Load 47(cond)
+                              BranchConditional 104 100 101
+             100:               Label
+                                Branch 102
+             102:               Label
+                                Branch 99
+             101:             Label
+                              SelectionMerge 106 DontFlatten 
+                              Switch 55 106 
+                                     case 3: 105
+             105:               Label
+                                Branch 106
+             106:             Label
+             109:    17(bool) Load 47(cond)
+                              SelectionMerge 111 Flatten 
+                              BranchConditional 109 110 111
+             110:               Label
+                                Branch 111
+             111:             Label
+                              Branch 112
+             112:             Label
+                              LoopMerge 114 115 DependencyInfinite 
+                              Branch 116
+             116:             Label
+             117:    17(bool) Load 47(cond)
+                              BranchConditional 117 113 114
+             113:               Label
+                                Branch 115
+             115:               Label
+                                Branch 112
+             114:             Label
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.conversion.frag.out b/Test/baseResults/spv.conversion.frag.out
old mode 100755
new mode 100644
index b38d84e..a321532
--- a/Test/baseResults/spv.conversion.frag.out
+++ b/Test/baseResults/spv.conversion.frag.out
@@ -1,6 +1,6 @@
 spv.conversion.frag
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 455
 
                               Capability Shader
@@ -51,6 +51,7 @@
                               Name 454  "i_f4"
                               Decorate 39(i_i) Flat
                               Decorate 157(i_i4) Flat
+                              Decorate 322(gl_FragColor) Location 0
                               Decorate 446(i_i2) Flat
                               Decorate 448(i_i3) Flat
                2:             TypeVoid
@@ -118,8 +119,8 @@
              315:     13(int) Constant 1
              321:             TypePointer Output 95(fvec4)
 322(gl_FragColor):    321(ptr) Variable Output
-             367:     13(int) Constant 2
-             380:     13(int) Constant 3
+             336:     13(int) Constant 2
+             349:     13(int) Constant 3
              427:             TypePointer Private 6(bool)
         428(u_b):    427(ptr) Variable Private
              429:             TypePointer Private 23(bvec2)
@@ -162,9 +163,9 @@
          110(f2):    109(ptr) Variable Function
          114(f3):    113(ptr) Variable Function
          118(f4):    117(ptr) Variable Function
-             297:    105(ptr) Variable Function
-             307:    105(ptr) Variable Function
-             323:    117(ptr) Variable Function
+             298:    105(ptr) Variable Function
+             309:    105(ptr) Variable Function
+             353:    117(ptr) Variable Function
         417(cv2):     93(ptr) Variable Function
         418(cv5):     44(ptr) Variable Function
               12:      9(int) Load 11(u_i)
@@ -424,101 +425,101 @@
                               SelectionMerge 296 None
                               BranchConditional 294 295 296
              295:               Label
-             298:     6(bool)   Load 8(b)
+             297:     6(bool)   Load 8(b)
                                 SelectionMerge 300 None
-                                BranchConditional 298 299 303
+                                BranchConditional 297 299 303
              299:                 Label
              301:      9(int)     Load 58(i)
              302:   16(float)     ConvertSToF 301
-                                  Store 297 302
+                                  Store 298 302
                                   Branch 300
              303:                 Label
              304:    105(ptr)     AccessChain 110(f2) 14
              305:   16(float)     Load 304
-                                  Store 297 305
+                                  Store 298 305
                                   Branch 300
              300:               Label
-             306:   16(float)   Load 297
-             308:   23(bvec2)   Load 25(b2)
-             309:     6(bool)   CompositeExtract 308 0
+             306:   16(float)   Load 298
+             307:      7(ptr)   AccessChain 25(b2) 14
+             308:     6(bool)   Load 307
                                 SelectionMerge 311 None
-                                BranchConditional 309 310 314
+                                BranchConditional 308 310 314
              310:                 Label
              312:    105(ptr)     AccessChain 114(f3) 14
              313:   16(float)     Load 312
-                                  Store 307 313
+                                  Store 309 313
                                   Branch 311
              314:                 Label
              316:     57(ptr)     AccessChain 68(i2) 315
              317:      9(int)     Load 316
              318:   16(float)     ConvertSToF 317
-                                  Store 307 318
+                                  Store 309 318
                                   Branch 311
              311:               Label
-             319:   16(float)   Load 307
+             319:   16(float)   Load 309
              320:   16(float)   FAdd 306 319
                                 Store 106(f) 320
                                 Branch 296
              296:             Label
-             324:     6(bool) Load 8(b)
-             325:   23(bvec2) Load 25(b2)
-             326:     6(bool) CompositeExtract 325 0
-             327:     6(bool) LogicalOr 324 326
-             328:   23(bvec2) Load 25(b2)
-             329:     6(bool) CompositeExtract 328 1
-             330:     6(bool) LogicalOr 327 329
-             331:   31(bvec3) Load 33(b3)
-             332:     6(bool) CompositeExtract 331 0
-             333:     6(bool) LogicalOr 330 332
-             334:   31(bvec3) Load 33(b3)
-             335:     6(bool) CompositeExtract 334 1
-             336:     6(bool) LogicalOr 333 335
-             337:   31(bvec3) Load 33(b3)
-             338:     6(bool) CompositeExtract 337 2
-             339:     6(bool) LogicalOr 336 338
-             340:   43(bvec4) Load 45(b4)
-             341:     6(bool) CompositeExtract 340 0
+             323:     6(bool) Load 8(b)
+             324:      7(ptr) AccessChain 25(b2) 14
+             325:     6(bool) Load 324
+             326:     6(bool) LogicalOr 323 325
+             327:      7(ptr) AccessChain 25(b2) 315
+             328:     6(bool) Load 327
+             329:     6(bool) LogicalOr 326 328
+             330:      7(ptr) AccessChain 33(b3) 14
+             331:     6(bool) Load 330
+             332:     6(bool) LogicalOr 329 331
+             333:      7(ptr) AccessChain 33(b3) 315
+             334:     6(bool) Load 333
+             335:     6(bool) LogicalOr 332 334
+             337:      7(ptr) AccessChain 33(b3) 336
+             338:     6(bool) Load 337
+             339:     6(bool) LogicalOr 335 338
+             340:      7(ptr) AccessChain 45(b4) 14
+             341:     6(bool) Load 340
              342:     6(bool) LogicalOr 339 341
-             343:   43(bvec4) Load 45(b4)
-             344:     6(bool) CompositeExtract 343 1
+             343:      7(ptr) AccessChain 45(b4) 315
+             344:     6(bool) Load 343
              345:     6(bool) LogicalOr 342 344
-             346:   43(bvec4) Load 45(b4)
-             347:     6(bool) CompositeExtract 346 2
+             346:      7(ptr) AccessChain 45(b4) 336
+             347:     6(bool) Load 346
              348:     6(bool) LogicalOr 345 347
-             349:   43(bvec4) Load 45(b4)
-             350:     6(bool) CompositeExtract 349 3
-             351:     6(bool) LogicalOr 348 350
-                              SelectionMerge 353 None
-                              BranchConditional 351 352 415
-             352:               Label
-             354:      9(int)   Load 58(i)
-             355:     57(ptr)   AccessChain 68(i2) 14
-             356:      9(int)   Load 355
-             357:      9(int)   IAdd 354 356
-             358:     57(ptr)   AccessChain 68(i2) 315
-             359:      9(int)   Load 358
-             360:      9(int)   IAdd 357 359
-             361:     57(ptr)   AccessChain 81(i3) 14
-             362:      9(int)   Load 361
-             363:      9(int)   IAdd 360 362
-             364:     57(ptr)   AccessChain 81(i3) 315
-             365:      9(int)   Load 364
-             366:      9(int)   IAdd 363 365
-             368:     57(ptr)   AccessChain 81(i3) 367
-             369:      9(int)   Load 368
-             370:      9(int)   IAdd 366 369
-             371:     57(ptr)   AccessChain 94(i4) 14
-             372:      9(int)   Load 371
-             373:      9(int)   IAdd 370 372
-             374:     57(ptr)   AccessChain 94(i4) 315
-             375:      9(int)   Load 374
-             376:      9(int)   IAdd 373 375
-             377:     57(ptr)   AccessChain 94(i4) 367
-             378:      9(int)   Load 377
-             379:      9(int)   IAdd 376 378
-             381:     57(ptr)   AccessChain 94(i4) 380
+             350:      7(ptr) AccessChain 45(b4) 349
+             351:     6(bool) Load 350
+             352:     6(bool) LogicalOr 348 351
+                              SelectionMerge 355 None
+                              BranchConditional 352 354 415
+             354:               Label
+             356:      9(int)   Load 58(i)
+             357:     57(ptr)   AccessChain 68(i2) 14
+             358:      9(int)   Load 357
+             359:      9(int)   IAdd 356 358
+             360:     57(ptr)   AccessChain 68(i2) 315
+             361:      9(int)   Load 360
+             362:      9(int)   IAdd 359 361
+             363:     57(ptr)   AccessChain 81(i3) 14
+             364:      9(int)   Load 363
+             365:      9(int)   IAdd 362 364
+             366:     57(ptr)   AccessChain 81(i3) 315
+             367:      9(int)   Load 366
+             368:      9(int)   IAdd 365 367
+             369:     57(ptr)   AccessChain 81(i3) 336
+             370:      9(int)   Load 369
+             371:      9(int)   IAdd 368 370
+             372:     57(ptr)   AccessChain 94(i4) 14
+             373:      9(int)   Load 372
+             374:      9(int)   IAdd 371 373
+             375:     57(ptr)   AccessChain 94(i4) 315
+             376:      9(int)   Load 375
+             377:      9(int)   IAdd 374 376
+             378:     57(ptr)   AccessChain 94(i4) 336
+             379:      9(int)   Load 378
+             380:      9(int)   IAdd 377 379
+             381:     57(ptr)   AccessChain 94(i4) 349
              382:      9(int)   Load 381
-             383:      9(int)   IAdd 379 382
+             383:      9(int)   IAdd 380 382
              384:   16(float)   ConvertSToF 383
              385:   16(float)   Load 106(f)
              386:   16(float)   FAdd 384 385
@@ -534,7 +535,7 @@
              396:    105(ptr)   AccessChain 114(f3) 315
              397:   16(float)   Load 396
              398:   16(float)   FAdd 395 397
-             399:    105(ptr)   AccessChain 114(f3) 367
+             399:    105(ptr)   AccessChain 114(f3) 336
              400:   16(float)   Load 399
              401:   16(float)   FAdd 398 400
              402:    105(ptr)   AccessChain 118(f4) 14
@@ -543,20 +544,20 @@
              405:    105(ptr)   AccessChain 118(f4) 315
              406:   16(float)   Load 405
              407:   16(float)   FAdd 404 406
-             408:    105(ptr)   AccessChain 118(f4) 367
+             408:    105(ptr)   AccessChain 118(f4) 336
              409:   16(float)   Load 408
              410:   16(float)   FAdd 407 409
-             411:    105(ptr)   AccessChain 118(f4) 380
+             411:    105(ptr)   AccessChain 118(f4) 349
              412:   16(float)   Load 411
              413:   16(float)   FAdd 410 412
              414:   95(fvec4)   CompositeConstruct 413 413 413 413
-                                Store 323 414
-                                Branch 353
+                                Store 353 414
+                                Branch 355
              415:               Label
-                                Store 323 151
-                                Branch 353
-             353:             Label
-             416:   95(fvec4) Load 323
+                                Store 353 151
+                                Branch 355
+             355:             Label
+             416:   95(fvec4) Load 353
                               Store 322(gl_FragColor) 416
                               Store 417(cv2) 102
              419:   92(ivec4) Load 417(cv2)
diff --git a/Test/baseResults/spv.dataOut.frag.out b/Test/baseResults/spv.dataOut.frag.out
old mode 100755
new mode 100644
index 9dbe5d1..f384721
--- a/Test/baseResults/spv.dataOut.frag.out
+++ b/Test/baseResults/spv.dataOut.frag.out
@@ -1,6 +1,6 @@
 spv.dataOut.frag
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 20
 
                               Capability Shader
diff --git a/Test/baseResults/spv.dataOutIndirect.frag.out b/Test/baseResults/spv.dataOutIndirect.frag.out
old mode 100755
new mode 100644
index 663092f..c0b52ae
--- a/Test/baseResults/spv.dataOutIndirect.frag.out
+++ b/Test/baseResults/spv.dataOutIndirect.frag.out
@@ -1,6 +1,6 @@
 spv.dataOutIndirect.frag
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 26
 
                               Capability Shader
diff --git a/Test/baseResults/spv.dataOutIndirect.vert.out b/Test/baseResults/spv.dataOutIndirect.vert.out
old mode 100755
new mode 100644
index 1523fab..9ba988c
--- a/Test/baseResults/spv.dataOutIndirect.vert.out
+++ b/Test/baseResults/spv.dataOutIndirect.vert.out
@@ -2,7 +2,7 @@
 WARNING: 0:3: attribute deprecated in version 130; may be removed in future release
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 38
 
                               Capability Shader
diff --git a/Test/baseResults/spv.debugInfo.1.1.frag.out b/Test/baseResults/spv.debugInfo.1.1.frag.out
new file mode 100644
index 0000000..f9c8578
--- /dev/null
+++ b/Test/baseResults/spv.debugInfo.1.1.frag.out
@@ -0,0 +1,279 @@
+spv.debugInfo.frag
+error: SPIRV-Tools Validation Errors
+error: Invalid SPIR-V binary version 1.3 for target environment SPIR-V 1.0 (under OpenGL 4.5 semantics).
+// Module Version 10300
+// Generated by (magic number): 80007
+// Id's are bound by 124
+
+                              Capability Shader
+               2:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 5  "main" 24 52
+                              ExecutionMode 5 OriginLowerLeft
+               1:             String  "spv.debugInfo.frag"
+                              Source GLSL 450 1  "#version 450
+
+struct S {
+    int a;
+};
+
+uniform ubuf {
+    S s;
+};
+
+uniform sampler2D s2d;
+
+layout(location = 0) in vec4 inv;
+layout(location = 0) out vec4 outv;
+
+vec4 foo(S s)
+{
+    vec4 r = s.a * inv;
+    ++r;
+    if (r.x > 3.0)
+        --r;
+    else
+        r *= 2;
+
+    return r;
+}
+
+void main()
+{
+    outv = foo(s);
+    outv += texture(s2d, vec2(0.5));
+
+    switch (s.a) {
+    case 10:
+        ++outv;
+        break;
+    case 20:
+        outv = 2 * outv;
+        ++outv;
+        break;
+    default:
+        --outv;
+        break;
+    }
+
+    for (int i = 0; i < 10; ++i)
+        outv *= 3.0;
+
+    outv.x < 10.0 ?
+        outv = sin(outv) :
+        outv = cos(outv);
+}"
+                              Name 5  "main"
+                              Name 8  "S"
+                              MemberName 8(S) 0  "a"
+                              Name 14  "foo(struct-S-i11;"
+                              Name 13  "s"
+                              Name 17  "r"
+                              Name 24  "inv"
+                              Name 52  "outv"
+                              Name 53  "S"
+                              MemberName 53(S) 0  "a"
+                              Name 54  "ubuf"
+                              MemberName 54(ubuf) 0  "s"
+                              Name 56  ""
+                              Name 57  "param"
+                              Name 67  "s2d"
+                              Name 97  "i"
+                              ModuleProcessed  "no-storage-format"
+                              ModuleProcessed  "resource-set-binding 3"
+                              ModuleProcessed  "auto-map-locations"
+                              ModuleProcessed  "client opengl100"
+                              ModuleProcessed  "target-env opengl"
+                              ModuleProcessed  "relaxed-errors"
+                              ModuleProcessed  "suppress-warnings"
+                              ModuleProcessed  "hlsl-offsets"
+                              ModuleProcessed  "entry-point main"
+                              ModuleProcessed  "use-storage-buffer"
+                              Decorate 24(inv) Location 0
+                              Decorate 52(outv) Location 0
+                              MemberDecorate 53(S) 0 Offset 0
+                              MemberDecorate 54(ubuf) 0 Offset 0
+                              Decorate 54(ubuf) Block
+                              Decorate 56 DescriptorSet 3
+                              Decorate 67(s2d) Location 0
+                              Decorate 67(s2d) DescriptorSet 3
+               3:             TypeVoid
+               4:             TypeFunction 3
+               7:             TypeInt 32 1
+            8(S):             TypeStruct 7(int)
+               9:             TypePointer Function 8(S)
+              10:             TypeFloat 32
+              11:             TypeVector 10(float) 4
+              12:             TypeFunction 11(fvec4) 9(ptr)
+              16:             TypePointer Function 11(fvec4)
+              18:      7(int) Constant 0
+              19:             TypePointer Function 7(int)
+              23:             TypePointer Input 11(fvec4)
+         24(inv):     23(ptr) Variable Input
+              28:   10(float) Constant 1065353216
+              31:             TypeInt 32 0
+              32:     31(int) Constant 0
+              33:             TypePointer Function 10(float)
+              36:   10(float) Constant 1077936128
+              37:             TypeBool
+              45:   10(float) Constant 1073741824
+              51:             TypePointer Output 11(fvec4)
+        52(outv):     51(ptr) Variable Output
+           53(S):             TypeStruct 7(int)
+        54(ubuf):             TypeStruct 53(S)
+              55:             TypePointer Uniform 54(ubuf)
+              56:     55(ptr) Variable Uniform
+              58:             TypePointer Uniform 53(S)
+              64:             TypeImage 10(float) 2D sampled format:Unknown
+              65:             TypeSampledImage 64
+              66:             TypePointer UniformConstant 65
+         67(s2d):     66(ptr) Variable UniformConstant
+              69:             TypeVector 10(float) 2
+              70:   10(float) Constant 1056964608
+              71:   69(fvec2) ConstantComposite 70 70
+              75:             TypePointer Uniform 7(int)
+             104:      7(int) Constant 10
+             109:      7(int) Constant 1
+             111:             TypePointer Output 10(float)
+             114:   10(float) Constant 1092616192
+         5(main):           3 Function None 4
+               6:             Label
+       57(param):      9(ptr) Variable Function
+           97(i):     19(ptr) Variable Function
+             116:     16(ptr) Variable Function
+                              Line 1 30 0
+              59:     58(ptr) AccessChain 56 18
+              60:       53(S) Load 59
+              61:      7(int) CompositeExtract 60 0
+              62:     19(ptr) AccessChain 57(param) 18
+                              Store 62 61
+              63:   11(fvec4) FunctionCall 14(foo(struct-S-i11;) 57(param)
+                              Store 52(outv) 63
+                              Line 1 31 0
+              68:          65 Load 67(s2d)
+              72:   11(fvec4) ImageSampleImplicitLod 68 71
+              73:   11(fvec4) Load 52(outv)
+              74:   11(fvec4) FAdd 73 72
+                              Store 52(outv) 74
+                              Line 1 33 0
+              76:     75(ptr) AccessChain 56 18 18
+              77:      7(int) Load 76
+                              SelectionMerge 81 None
+                              Switch 77 80 
+                                     case 10: 78
+                                     case 20: 79
+              80:               Label
+                                Line 1 42 0
+              92:   11(fvec4)   Load 52(outv)
+              93:   11(fvec4)   CompositeConstruct 28 28 28 28
+              94:   11(fvec4)   FSub 92 93
+                                Store 52(outv) 94
+                                Line 1 43 0
+                                Branch 81
+              78:               Label
+                                Line 1 35 0
+              82:   11(fvec4)   Load 52(outv)
+              83:   11(fvec4)   CompositeConstruct 28 28 28 28
+              84:   11(fvec4)   FAdd 82 83
+                                Store 52(outv) 84
+                                Line 1 36 0
+                                Branch 81
+              79:               Label
+                                Line 1 38 0
+              86:   11(fvec4)   Load 52(outv)
+              87:   11(fvec4)   VectorTimesScalar 86 45
+                                Store 52(outv) 87
+                                Line 1 39 0
+              88:   11(fvec4)   Load 52(outv)
+              89:   11(fvec4)   CompositeConstruct 28 28 28 28
+              90:   11(fvec4)   FAdd 88 89
+                                Store 52(outv) 90
+                                Line 1 40 0
+                                Branch 81
+              81:             Label
+                              Line 1 46 0
+                              Store 97(i) 18
+                              Branch 98
+              98:             Label
+                              LoopMerge 100 101 None
+                              Branch 102
+             102:             Label
+             103:      7(int) Load 97(i)
+             105:    37(bool) SLessThan 103 104
+                              BranchConditional 105 99 100
+              99:               Label
+                                Line 1 47 0
+             106:   11(fvec4)   Load 52(outv)
+             107:   11(fvec4)   VectorTimesScalar 106 36
+                                Store 52(outv) 107
+                                Branch 101
+             101:               Label
+                                Line 1 46 0
+             108:      7(int)   Load 97(i)
+             110:      7(int)   IAdd 108 109
+                                Store 97(i) 110
+                                Branch 98
+             100:             Label
+                              Line 1 49 0
+             112:    111(ptr) AccessChain 52(outv) 32
+             113:   10(float) Load 112
+             115:    37(bool) FOrdLessThan 113 114
+                              SelectionMerge 118 None
+                              BranchConditional 115 117 121
+             117:               Label
+                                Line 1 50 0
+             119:   11(fvec4)   Load 52(outv)
+             120:   11(fvec4)   ExtInst 2(GLSL.std.450) 13(Sin) 119
+                                Store 52(outv) 120
+                                Store 116 120
+                                Branch 118
+             121:               Label
+                                Line 1 51 0
+             122:   11(fvec4)   Load 52(outv)
+             123:   11(fvec4)   ExtInst 2(GLSL.std.450) 14(Cos) 122
+                                Store 52(outv) 123
+                                Store 116 123
+                                Branch 118
+             118:             Label
+                              Return
+                              FunctionEnd
+14(foo(struct-S-i11;):   11(fvec4) Function None 12
+           13(s):      9(ptr) FunctionParameter
+              15:             Label
+           17(r):     16(ptr) Variable Function
+                              Line 1 18 0
+              20:     19(ptr) AccessChain 13(s) 18
+              21:      7(int) Load 20
+              22:   10(float) ConvertSToF 21
+              25:   11(fvec4) Load 24(inv)
+              26:   11(fvec4) VectorTimesScalar 25 22
+                              Store 17(r) 26
+                              Line 1 19 0
+              27:   11(fvec4) Load 17(r)
+              29:   11(fvec4) CompositeConstruct 28 28 28 28
+              30:   11(fvec4) FAdd 27 29
+                              Store 17(r) 30
+                              Line 1 20 0
+              34:     33(ptr) AccessChain 17(r) 32
+              35:   10(float) Load 34
+              38:    37(bool) FOrdGreaterThan 35 36
+                              SelectionMerge 40 None
+                              BranchConditional 38 39 44
+              39:               Label
+                                Line 1 21 0
+              41:   11(fvec4)   Load 17(r)
+              42:   11(fvec4)   CompositeConstruct 28 28 28 28
+              43:   11(fvec4)   FSub 41 42
+                                Store 17(r) 43
+                                Branch 40
+              44:               Label
+                                Line 1 23 0
+              46:   11(fvec4)   Load 17(r)
+              47:   11(fvec4)   VectorTimesScalar 46 45
+                                Store 17(r) 47
+                                Branch 40
+              40:             Label
+                              Line 1 25 0
+              48:   11(fvec4) Load 17(r)
+                              ReturnValue 48
+                              FunctionEnd
diff --git a/Test/baseResults/spv.debugInfo.frag.out b/Test/baseResults/spv.debugInfo.frag.out
new file mode 100644
index 0000000..aaa988d
--- /dev/null
+++ b/Test/baseResults/spv.debugInfo.frag.out
@@ -0,0 +1,280 @@
+spv.debugInfo.frag
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 124
+
+                              Capability Shader
+               2:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 5  "main" 24 52
+                              ExecutionMode 5 OriginLowerLeft
+               1:             String  "spv.debugInfo.frag"
+                              Source GLSL 450 1  "// OpModuleProcessed no-storage-format
+// OpModuleProcessed resource-set-binding 3
+// OpModuleProcessed auto-map-bindings
+// OpModuleProcessed auto-map-locations
+// OpModuleProcessed client opengl100
+// OpModuleProcessed target-env opengl
+// OpModuleProcessed relaxed-errors
+// OpModuleProcessed suppress-warnings
+// OpModuleProcessed hlsl-offsets
+// OpModuleProcessed entry-point main
+#line 1
+#version 450
+
+struct S {
+    int a;
+};
+
+uniform ubuf {
+    S s;
+};
+
+uniform sampler2D s2d;
+
+layout(location = 0) in vec4 inv;
+layout(location = 0) out vec4 outv;
+
+vec4 foo(S s)
+{
+    vec4 r = s.a * inv;
+    ++r;
+    if (r.x > 3.0)
+        --r;
+    else
+        r *= 2;
+
+    return r;
+}
+
+void main()
+{
+    outv = foo(s);
+    outv += texture(s2d, vec2(0.5));
+
+    switch (s.a) {
+    case 10:
+        ++outv;
+        break;
+    case 20:
+        outv = 2 * outv;
+        ++outv;
+        break;
+    default:
+        --outv;
+        break;
+    }
+
+    for (int i = 0; i < 10; ++i)
+        outv *= 3.0;
+
+    outv.x < 10.0 ?
+        outv = sin(outv) :
+        outv = cos(outv);
+}"
+                              Name 5  "main"
+                              Name 8  "S"
+                              MemberName 8(S) 0  "a"
+                              Name 14  "foo(struct-S-i11;"
+                              Name 13  "s"
+                              Name 17  "r"
+                              Name 24  "inv"
+                              Name 52  "outv"
+                              Name 53  "S"
+                              MemberName 53(S) 0  "a"
+                              Name 54  "ubuf"
+                              MemberName 54(ubuf) 0  "s"
+                              Name 56  ""
+                              Name 57  "param"
+                              Name 67  "s2d"
+                              Name 97  "i"
+                              Decorate 24(inv) Location 0
+                              Decorate 52(outv) Location 0
+                              MemberDecorate 53(S) 0 Offset 0
+                              MemberDecorate 54(ubuf) 0 Offset 0
+                              Decorate 54(ubuf) Block
+                              Decorate 56 DescriptorSet 3
+                              Decorate 56 Binding 0
+                              Decorate 67(s2d) Location 0
+                              Decorate 67(s2d) DescriptorSet 3
+                              Decorate 67(s2d) Binding 1
+               3:             TypeVoid
+               4:             TypeFunction 3
+               7:             TypeInt 32 1
+            8(S):             TypeStruct 7(int)
+               9:             TypePointer Function 8(S)
+              10:             TypeFloat 32
+              11:             TypeVector 10(float) 4
+              12:             TypeFunction 11(fvec4) 9(ptr)
+              16:             TypePointer Function 11(fvec4)
+              18:      7(int) Constant 0
+              19:             TypePointer Function 7(int)
+              23:             TypePointer Input 11(fvec4)
+         24(inv):     23(ptr) Variable Input
+              28:   10(float) Constant 1065353216
+              31:             TypeInt 32 0
+              32:     31(int) Constant 0
+              33:             TypePointer Function 10(float)
+              36:   10(float) Constant 1077936128
+              37:             TypeBool
+              45:   10(float) Constant 1073741824
+              51:             TypePointer Output 11(fvec4)
+        52(outv):     51(ptr) Variable Output
+           53(S):             TypeStruct 7(int)
+        54(ubuf):             TypeStruct 53(S)
+              55:             TypePointer Uniform 54(ubuf)
+              56:     55(ptr) Variable Uniform
+              58:             TypePointer Uniform 53(S)
+              64:             TypeImage 10(float) 2D sampled format:Unknown
+              65:             TypeSampledImage 64
+              66:             TypePointer UniformConstant 65
+         67(s2d):     66(ptr) Variable UniformConstant
+              69:             TypeVector 10(float) 2
+              70:   10(float) Constant 1056964608
+              71:   69(fvec2) ConstantComposite 70 70
+              75:             TypePointer Uniform 7(int)
+             104:      7(int) Constant 10
+             109:      7(int) Constant 1
+             111:             TypePointer Output 10(float)
+             114:   10(float) Constant 1092616192
+         5(main):           3 Function None 4
+               6:             Label
+       57(param):      9(ptr) Variable Function
+           97(i):     19(ptr) Variable Function
+             116:     16(ptr) Variable Function
+                              Line 1 30 0
+              59:     58(ptr) AccessChain 56 18
+              60:       53(S) Load 59
+              61:      7(int) CompositeExtract 60 0
+              62:     19(ptr) AccessChain 57(param) 18
+                              Store 62 61
+              63:   11(fvec4) FunctionCall 14(foo(struct-S-i11;) 57(param)
+                              Store 52(outv) 63
+                              Line 1 31 0
+              68:          65 Load 67(s2d)
+              72:   11(fvec4) ImageSampleImplicitLod 68 71
+              73:   11(fvec4) Load 52(outv)
+              74:   11(fvec4) FAdd 73 72
+                              Store 52(outv) 74
+                              Line 1 33 0
+              76:     75(ptr) AccessChain 56 18 18
+              77:      7(int) Load 76
+                              SelectionMerge 81 None
+                              Switch 77 80 
+                                     case 10: 78
+                                     case 20: 79
+              80:               Label
+                                Line 1 42 0
+              92:   11(fvec4)   Load 52(outv)
+              93:   11(fvec4)   CompositeConstruct 28 28 28 28
+              94:   11(fvec4)   FSub 92 93
+                                Store 52(outv) 94
+                                Line 1 43 0
+                                Branch 81
+              78:               Label
+                                Line 1 35 0
+              82:   11(fvec4)   Load 52(outv)
+              83:   11(fvec4)   CompositeConstruct 28 28 28 28
+              84:   11(fvec4)   FAdd 82 83
+                                Store 52(outv) 84
+                                Line 1 36 0
+                                Branch 81
+              79:               Label
+                                Line 1 38 0
+              86:   11(fvec4)   Load 52(outv)
+              87:   11(fvec4)   VectorTimesScalar 86 45
+                                Store 52(outv) 87
+                                Line 1 39 0
+              88:   11(fvec4)   Load 52(outv)
+              89:   11(fvec4)   CompositeConstruct 28 28 28 28
+              90:   11(fvec4)   FAdd 88 89
+                                Store 52(outv) 90
+                                Line 1 40 0
+                                Branch 81
+              81:             Label
+                              Line 1 46 0
+                              Store 97(i) 18
+                              Branch 98
+              98:             Label
+                              LoopMerge 100 101 None
+                              Branch 102
+             102:             Label
+             103:      7(int) Load 97(i)
+             105:    37(bool) SLessThan 103 104
+                              BranchConditional 105 99 100
+              99:               Label
+                                Line 1 47 0
+             106:   11(fvec4)   Load 52(outv)
+             107:   11(fvec4)   VectorTimesScalar 106 36
+                                Store 52(outv) 107
+                                Branch 101
+             101:               Label
+                                Line 1 46 0
+             108:      7(int)   Load 97(i)
+             110:      7(int)   IAdd 108 109
+                                Store 97(i) 110
+                                Branch 98
+             100:             Label
+                              Line 1 49 0
+             112:    111(ptr) AccessChain 52(outv) 32
+             113:   10(float) Load 112
+             115:    37(bool) FOrdLessThan 113 114
+                              SelectionMerge 118 None
+                              BranchConditional 115 117 121
+             117:               Label
+                                Line 1 50 0
+             119:   11(fvec4)   Load 52(outv)
+             120:   11(fvec4)   ExtInst 2(GLSL.std.450) 13(Sin) 119
+                                Store 52(outv) 120
+                                Store 116 120
+                                Branch 118
+             121:               Label
+                                Line 1 51 0
+             122:   11(fvec4)   Load 52(outv)
+             123:   11(fvec4)   ExtInst 2(GLSL.std.450) 14(Cos) 122
+                                Store 52(outv) 123
+                                Store 116 123
+                                Branch 118
+             118:             Label
+                              Return
+                              FunctionEnd
+14(foo(struct-S-i11;):   11(fvec4) Function None 12
+           13(s):      9(ptr) FunctionParameter
+              15:             Label
+           17(r):     16(ptr) Variable Function
+                              Line 1 18 0
+              20:     19(ptr) AccessChain 13(s) 18
+              21:      7(int) Load 20
+              22:   10(float) ConvertSToF 21
+              25:   11(fvec4) Load 24(inv)
+              26:   11(fvec4) VectorTimesScalar 25 22
+                              Store 17(r) 26
+                              Line 1 19 0
+              27:   11(fvec4) Load 17(r)
+              29:   11(fvec4) CompositeConstruct 28 28 28 28
+              30:   11(fvec4) FAdd 27 29
+                              Store 17(r) 30
+                              Line 1 20 0
+              34:     33(ptr) AccessChain 17(r) 32
+              35:   10(float) Load 34
+              38:    37(bool) FOrdGreaterThan 35 36
+                              SelectionMerge 40 None
+                              BranchConditional 38 39 44
+              39:               Label
+                                Line 1 21 0
+              41:   11(fvec4)   Load 17(r)
+              42:   11(fvec4)   CompositeConstruct 28 28 28 28
+              43:   11(fvec4)   FSub 41 42
+                                Store 17(r) 43
+                                Branch 40
+              44:               Label
+                                Line 1 23 0
+              46:   11(fvec4)   Load 17(r)
+              47:   11(fvec4)   VectorTimesScalar 46 45
+                                Store 17(r) 47
+                                Branch 40
+              40:             Label
+                              Line 1 25 0
+              48:   11(fvec4) Load 17(r)
+                              ReturnValue 48
+                              FunctionEnd
diff --git a/Test/baseResults/spv.deepRvalue.frag.out b/Test/baseResults/spv.deepRvalue.frag.out
index b8f4d06..a0e4eab 100644
--- a/Test/baseResults/spv.deepRvalue.frag.out
+++ b/Test/baseResults/spv.deepRvalue.frag.out
@@ -1,6 +1,6 @@
 spv.deepRvalue.frag
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 152
 
                               Capability Shader
@@ -28,6 +28,7 @@
                               Name 133  "t"
                               Name 146  "gl_FragColor"
                               Decorate 111(samp2D) DescriptorSet 0
+                              Decorate 146(gl_FragColor) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
diff --git a/Test/baseResults/spv.depthOut.frag.out b/Test/baseResults/spv.depthOut.frag.out
old mode 100755
new mode 100644
index 247b2f3..5da0df0
--- a/Test/baseResults/spv.depthOut.frag.out
+++ b/Test/baseResults/spv.depthOut.frag.out
@@ -1,8 +1,6 @@
 spv.depthOut.frag
-Warning, version 450 is not yet complete; most version-specific features are present, but some are missing.
-
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 15
 
                               Capability Shader
diff --git a/Test/baseResults/spv.deviceGroup.frag.out b/Test/baseResults/spv.deviceGroup.frag.out
old mode 100755
new mode 100644
index 42e045b..6710b77
--- a/Test/baseResults/spv.deviceGroup.frag.out
+++ b/Test/baseResults/spv.deviceGroup.frag.out
@@ -1,13 +1,10 @@
 spv.deviceGroup.frag
-Warning, version 450 is not yet complete; most version-specific features are present, but some are missing.
-
-// Module Version 10000
-// Generated by (magic number): 80001
+// Module Version 10300
+// Generated by (magic number): 80007
 // Id's are bound by 17
 
                               Capability Shader
                               Capability DeviceGroup
-                              Extension  "SPV_KHR_device_group"
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
                               EntryPoint Fragment 4  "main" 9 12
diff --git a/Test/baseResults/spv.discard-dce.frag.out b/Test/baseResults/spv.discard-dce.frag.out
old mode 100755
new mode 100644
index 173ea26..9d138f2
--- a/Test/baseResults/spv.discard-dce.frag.out
+++ b/Test/baseResults/spv.discard-dce.frag.out
@@ -1,6 +1,6 @@
 spv.discard-dce.frag
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 84
 
                               Capability Shader
@@ -18,6 +18,7 @@
                               Name 30  "y"
                               Name 36  "radius"
                               Name 59  "gl_FragColor"
+                              Decorate 59(gl_FragColor) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
diff --git a/Test/baseResults/spv.do-simple.vert.out b/Test/baseResults/spv.do-simple.vert.out
old mode 100755
new mode 100644
index d6d4c28..6014dfe
--- a/Test/baseResults/spv.do-simple.vert.out
+++ b/Test/baseResults/spv.do-simple.vert.out
@@ -1,8 +1,6 @@
 spv.do-simple.vert
-Warning, version 310 is not yet complete; most version-specific features are present, but some are missing.
-
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 21
 
                               Capability Shader
diff --git a/Test/baseResults/spv.do-while-continue-break.vert.out b/Test/baseResults/spv.do-while-continue-break.vert.out
index d1d0c85..2838880 100644
--- a/Test/baseResults/spv.do-while-continue-break.vert.out
+++ b/Test/baseResults/spv.do-while-continue-break.vert.out
@@ -1,8 +1,6 @@
 spv.do-while-continue-break.vert
-Warning, version 310 is not yet complete; most version-specific features are present, but some are missing.
-
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 43
 
                               Capability Shader
diff --git a/Test/baseResults/spv.doWhileLoop.frag.out b/Test/baseResults/spv.doWhileLoop.frag.out
old mode 100755
new mode 100644
index 9b8cee7..808466e
--- a/Test/baseResults/spv.doWhileLoop.frag.out
+++ b/Test/baseResults/spv.doWhileLoop.frag.out
@@ -1,6 +1,6 @@
 spv.doWhileLoop.frag
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 34
 
                               Capability Shader
@@ -15,6 +15,7 @@
                               Name 17  "bigColor"
                               Name 27  "d"
                               Name 32  "gl_FragColor"
+                              Decorate 32(gl_FragColor) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
diff --git a/Test/baseResults/spv.double.comp.out b/Test/baseResults/spv.double.comp.out
old mode 100755
new mode 100644
index 3b1bdc8..eb8e122
--- a/Test/baseResults/spv.double.comp.out
+++ b/Test/baseResults/spv.double.comp.out
@@ -1,8 +1,6 @@
 spv.double.comp
-Warning, version 430 is not yet complete; most version-specific features are present, but some are missing.
-
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 60
 
                               Capability Shader
@@ -36,13 +34,13 @@
                3:             TypeFunction 2
                6:             TypeFloat 32
                7:             TypeFloat 64
-      8(bufName):             TypeStruct 6(float) 7(float)
+      8(bufName):             TypeStruct 6(float) 7(float64_t)
                9:             TypePointer Uniform 8(bufName)
      10(bufInst):      9(ptr) Variable Uniform
               11:             TypeInt 32 1
               12:     11(int) Constant 1
-              13:    7(float) Constant 1413754136 1074340347
-              14:             TypePointer Uniform 7(float)
+              13:7(float64_t) Constant 1413754136 1074340347
+              14:             TypePointer Uniform 7(float64_t)
               16:     11(int) Constant 0
               17:    6(float) Constant 1095307129
               18:             TypePointer Uniform 6(float)
@@ -53,19 +51,19 @@
               25:             TypePointer Input 24(ivec3)
 26(gl_GlobalInvocationID):     25(ptr) Variable Input
               27:             TypeVector 23(int) 2
-              31:             TypePointer Function 7(float)
+              31:             TypePointer Function 7(float64_t)
 33(gl_LocalInvocationID):     25(ptr) Variable Input
               37:     11(int) Constant 8
               40:             TypeVector 6(float) 2
               42:    6(float) Constant 1090519040
-              47:             TypeVector 7(float) 4
-              48:             TypePointer Function 47(fvec4)
-              50:    7(float) Constant 2576980378 1071225241
-              51:    7(float) Constant 2576980378 1070176665
-              52:    7(float) Constant 858993459 1070805811
-              53:   47(fvec4) ConstantComposite 50 51 52 50
-              55:    7(float) Constant 0 1072693248
-              56:    7(float) Constant 3229815407 1074340298
+              47:             TypeVector 7(float64_t) 4
+              48:             TypePointer Function 47(f64vec4)
+              50:7(float64_t) Constant 2576980378 1071225241
+              51:7(float64_t) Constant 2576980378 1070176665
+              52:7(float64_t) Constant 858993459 1070805811
+              53: 47(f64vec4) ConstantComposite 50 51 52 50
+              55:7(float64_t) Constant 0 1072693248
+              56:7(float64_t) Constant 3229815407 1074340298
               57:             TypeImage 6(float) 2D nonsampled format:Unknown
               58:             TypePointer UniformConstant 57
      59(destTex):     58(ptr) Variable UniformConstant
@@ -92,7 +90,7 @@
               43:   40(fvec2) CompositeConstruct 42 42
               44:   40(fvec2) FDiv 41 43
               45:    6(float) ExtInst 1(GLSL.std.450) 66(Length) 44
-              46:    7(float) FConvert 45
+              46:7(float64_t) FConvert 45
                               Store 32(localCoef) 46
                               Store 49(aa) 53
                               Store 54(globalCoef) 55
diff --git a/Test/baseResults/spv.drawParams.vert.out b/Test/baseResults/spv.drawParams.vert.out
old mode 100755
new mode 100644
index b75efe0..8f3e2c0
--- a/Test/baseResults/spv.drawParams.vert.out
+++ b/Test/baseResults/spv.drawParams.vert.out
@@ -1,13 +1,10 @@
 spv.drawParams.vert
-Warning, version 450 is not yet complete; most version-specific features are present, but some are missing.
-
-// Module Version 10000
-// Generated by (magic number): 80001
+// Module Version 10300
+// Generated by (magic number): 80007
 // Id's are bound by 29
 
                               Capability Shader
                               Capability DrawParameters
-                              Extension  "SPV_KHR_shader_draw_parameters"
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
                               EntryPoint Vertex 4  "main" 10 13 16 21
diff --git a/Test/baseResults/spv.earlyReturnDiscard.frag.out b/Test/baseResults/spv.earlyReturnDiscard.frag.out
old mode 100755
new mode 100644
index 41441b7..c44b722
--- a/Test/baseResults/spv.earlyReturnDiscard.frag.out
+++ b/Test/baseResults/spv.earlyReturnDiscard.frag.out
@@ -1,6 +1,6 @@
 spv.earlyReturnDiscard.frag
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 110
 
                               Capability Shader
@@ -24,6 +24,7 @@
                               Name 77  "b"
                               Name 105  "gl_FragColor"
                               Name 109  "threshhold3"
+                              Decorate 105(gl_FragColor) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
diff --git a/Test/baseResults/spv.explicittypes.frag.out b/Test/baseResults/spv.explicittypes.frag.out
new file mode 100644
index 0000000..1b5bcf0
--- /dev/null
+++ b/Test/baseResults/spv.explicittypes.frag.out
@@ -0,0 +1,886 @@
+spv.explicittypes.frag
+error: SPIRV-Tools Validation Errors
+error: Capability Float16 is not allowed by Vulkan 1.1 specification (or requires extension)
+  OpCapability Float16
+
+// Module Version 10300
+// Generated by (magic number): 80007
+// Id's are bound by 576
+
+                              Capability Shader
+                              Capability Float16
+                              Capability Float64
+                              Capability Int64
+                              Capability Int16
+                              Capability Int8
+                              Capability StorageUniform16
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main"
+                              ExecutionMode 4 OriginUpperLeft
+                              Source GLSL 450
+                              SourceExtension  "GL_EXT_shader_explicit_arithmetic_types"
+                              SourceExtension  "GL_EXT_shader_explicit_arithmetic_types_float16"
+                              SourceExtension  "GL_EXT_shader_explicit_arithmetic_types_float32"
+                              SourceExtension  "GL_EXT_shader_explicit_arithmetic_types_float64"
+                              SourceExtension  "GL_EXT_shader_explicit_arithmetic_types_int16"
+                              SourceExtension  "GL_EXT_shader_explicit_arithmetic_types_int32"
+                              SourceExtension  "GL_EXT_shader_explicit_arithmetic_types_int64"
+                              SourceExtension  "GL_EXT_shader_explicit_arithmetic_types_int8"
+                              Name 4  "main"
+                              Name 6  "literal("
+                              Name 8  "typeCast8("
+                              Name 10  "typeCast16("
+                              Name 12  "typeCast32("
+                              Name 14  "typeCast64("
+                              Name 18  "i64"
+                              Name 26  "Uniforms"
+                              MemberName 26(Uniforms) 0  "index"
+                              Name 28  ""
+                              Name 35  "indexable"
+                              Name 40  "u64"
+                              Name 49  "indexable"
+                              Name 53  "i32"
+                              Name 62  "indexable"
+                              Name 66  "u32"
+                              Name 74  "indexable"
+                              Name 79  "i16"
+                              Name 88  "indexable"
+                              Name 93  "u16"
+                              Name 101  "indexable"
+                              Name 106  "i8"
+                              Name 115  "indexable"
+                              Name 120  "u8"
+                              Name 128  "indexable"
+                              Name 133  "u8v"
+                              Name 136  "i8v"
+                              Name 141  "i16v"
+                              Name 150  "i32v"
+                              Name 158  "u32v"
+                              Name 164  "i64v"
+                              Name 169  "u64v"
+                              Name 183  "f16v"
+                              Name 189  "f32v"
+                              Name 195  "f64v"
+                              Name 222  "u16v"
+                              Name 252  "bv"
+                              Name 268  "i32v"
+                              Name 269  "i16v"
+                              Name 272  "u16v"
+                              Name 278  "u32v"
+                              Name 282  "i64v"
+                              Name 285  "u64v"
+                              Name 296  "f16v"
+                              Name 299  "f32v"
+                              Name 302  "f64v"
+                              Name 347  "i8v"
+                              Name 353  "u8v"
+                              Name 363  "bv"
+                              Name 380  "u32v"
+                              Name 381  "i32v"
+                              Name 384  "i64v"
+                              Name 387  "u64v"
+                              Name 396  "f32v"
+                              Name 399  "f64v"
+                              Name 406  "i8v"
+                              Name 412  "i16v"
+                              Name 429  "u8v"
+                              Name 435  "u16v"
+                              Name 452  "f16v"
+                              Name 465  "bv"
+                              Name 481  "u64v"
+                              Name 482  "i64v"
+                              Name 485  "f64v"
+                              Name 490  "i8v"
+                              Name 496  "i16v"
+                              Name 502  "i32v"
+                              Name 510  "u8v"
+                              Name 516  "u16v"
+                              Name 522  "u32v"
+                              Name 534  "f16v"
+                              Name 537  "f32v"
+                              Name 548  "bv"
+                              Name 573  "Block"
+                              MemberName 573(Block) 0  "i16"
+                              MemberName 573(Block) 1  "i16v2"
+                              MemberName 573(Block) 2  "i16v3"
+                              MemberName 573(Block) 3  "i16v4"
+                              MemberName 573(Block) 4  "u16"
+                              MemberName 573(Block) 5  "u16v2"
+                              MemberName 573(Block) 6  "u16v3"
+                              MemberName 573(Block) 7  "u16v4"
+                              MemberName 573(Block) 8  "i32"
+                              MemberName 573(Block) 9  "i32v2"
+                              MemberName 573(Block) 10  "i32v3"
+                              MemberName 573(Block) 11  "i32v4"
+                              MemberName 573(Block) 12  "u32"
+                              MemberName 573(Block) 13  "u32v2"
+                              MemberName 573(Block) 14  "u32v3"
+                              MemberName 573(Block) 15  "u32v4"
+                              Name 575  "block"
+                              MemberDecorate 26(Uniforms) 0 Offset 0
+                              Decorate 26(Uniforms) Block
+                              Decorate 28 DescriptorSet 0
+                              Decorate 28 Binding 0
+                              MemberDecorate 573(Block) 0 Offset 0
+                              MemberDecorate 573(Block) 1 Offset 4
+                              MemberDecorate 573(Block) 2 Offset 8
+                              MemberDecorate 573(Block) 3 Offset 16
+                              MemberDecorate 573(Block) 4 Offset 24
+                              MemberDecorate 573(Block) 5 Offset 28
+                              MemberDecorate 573(Block) 6 Offset 32
+                              MemberDecorate 573(Block) 7 Offset 40
+                              MemberDecorate 573(Block) 8 Offset 48
+                              MemberDecorate 573(Block) 9 Offset 56
+                              MemberDecorate 573(Block) 10 Offset 64
+                              MemberDecorate 573(Block) 11 Offset 80
+                              MemberDecorate 573(Block) 12 Offset 96
+                              MemberDecorate 573(Block) 13 Offset 104
+                              MemberDecorate 573(Block) 14 Offset 112
+                              MemberDecorate 573(Block) 15 Offset 128
+                              Decorate 573(Block) Block
+                              Decorate 575(block) DescriptorSet 0
+                              Decorate 575(block) Binding 1
+               2:             TypeVoid
+               3:             TypeFunction 2
+              16:             TypeInt 64 1
+              17:             TypePointer Function 16(int64_t)
+              19:             TypeInt 32 0
+              20:     19(int) Constant 3
+              21:             TypeArray 16(int64_t) 20
+              22: 16(int64_t) Constant 4008636143 4008636142
+              23: 16(int64_t) Constant 4294967295 4294967295
+              24: 16(int64_t) Constant 0 1
+              25:          21 ConstantComposite 22 23 24
+    26(Uniforms):             TypeStruct 19(int)
+              27:             TypePointer Uniform 26(Uniforms)
+              28:     27(ptr) Variable Uniform
+              29:             TypeInt 32 1
+              30:     29(int) Constant 0
+              31:             TypePointer Uniform 19(int)
+              34:             TypePointer Function 21
+              38:             TypeInt 64 0
+              39:             TypePointer Function 38(int64_t)
+              41:             TypeArray 38(int64_t) 20
+              42: 38(int64_t) Constant 4294967295 4294967295
+              43: 38(int64_t) Constant 0 1
+              44: 38(int64_t) Constant 4294967295 1
+              45:          41 ConstantComposite 42 43 44
+              48:             TypePointer Function 41
+              52:             TypePointer Function 29(int)
+              54:             TypeArray 29(int) 20
+              55:     29(int) Constant 4008636143
+              56:     29(int) Constant 4294967295
+              57:     29(int) Constant 536870912
+              58:          54 ConstantComposite 55 56 57
+              61:             TypePointer Function 54
+              65:             TypePointer Function 19(int)
+              67:             TypeArray 19(int) 20
+              68:     19(int) Constant 4294967295
+              69:     19(int) Constant 2147483647
+              70:          67 ConstantComposite 68 68 69
+              73:             TypePointer Function 67
+              77:             TypeInt 16 1
+              78:             TypePointer Function 77(int16_t)
+              80:             TypeArray 77(int16_t) 20
+              81: 77(int16_t) Constant 4294962927
+              82: 77(int16_t) Constant 4294967295
+              83: 77(int16_t) Constant 16384
+              84:          80 ConstantComposite 81 82 83
+              87:             TypePointer Function 80
+              91:             TypeInt 16 0
+              92:             TypePointer Function 91(int16_t)
+              94:             TypeArray 91(int16_t) 20
+              95: 91(int16_t) Constant 65535
+              96: 91(int16_t) Constant 32767
+              97:          94 ConstantComposite 95 95 96
+             100:             TypePointer Function 94
+             104:             TypeInt 8 1
+             105:             TypePointer Function 104(int8_t)
+             107:             TypeArray 104(int8_t) 20
+             108: 104(int8_t) Constant 4294967279
+             109: 104(int8_t) Constant 4294967295
+             110: 104(int8_t) Constant 0
+             111:         107 ConstantComposite 108 109 110
+             114:             TypePointer Function 107
+             118:             TypeInt 8 0
+             119:             TypePointer Function 118(int8_t)
+             121:             TypeArray 118(int8_t) 20
+             122: 118(int8_t) Constant 255
+             123: 118(int8_t) Constant 127
+             124:         121 ConstantComposite 122 122 123
+             127:             TypePointer Function 121
+             131:             TypeVector 118(int8_t) 2
+             132:             TypePointer Function 131(i8vec2)
+             134:             TypeVector 104(int8_t) 2
+             135:             TypePointer Function 134(i8vec2)
+             139:             TypeVector 77(int16_t) 2
+             140:             TypePointer Function 139(i16vec2)
+             145:             TypeVector 91(int16_t) 2
+             148:             TypeVector 29(int) 2
+             149:             TypePointer Function 148(ivec2)
+             154:             TypeVector 19(int) 2
+             157:             TypePointer Function 154(ivec2)
+             162:             TypeVector 16(int64_t) 2
+             163:             TypePointer Function 162(i64vec2)
+             167:             TypeVector 38(int64_t) 2
+             168:             TypePointer Function 167(i64vec2)
+             180:             TypeFloat 16
+             181:             TypeVector 180(float16_t) 2
+             182:             TypePointer Function 181(f16vec2)
+             186:             TypeFloat 32
+             187:             TypeVector 186(float) 2
+             188:             TypePointer Function 187(fvec2)
+             192:             TypeFloat 64
+             193:             TypeVector 192(float64_t) 2
+             194:             TypePointer Function 193(f64vec2)
+             221:             TypePointer Function 145(i16vec2)
+             249:             TypeBool
+             250:             TypeVector 249(bool) 2
+             251:             TypePointer Function 250(bvec2)
+             254: 104(int8_t) Constant 1
+             255: 134(i8vec2) ConstantComposite 110 110
+             256: 134(i8vec2) ConstantComposite 254 254
+             259: 118(int8_t) Constant 0
+             260: 118(int8_t) Constant 1
+             261: 131(i8vec2) ConstantComposite 259 259
+             262: 131(i8vec2) ConstantComposite 260 260
+             365: 77(int16_t) Constant 0
+             366: 77(int16_t) Constant 1
+             367:139(i16vec2) ConstantComposite 365 365
+             368:139(i16vec2) ConstantComposite 366 366
+             371: 91(int16_t) Constant 0
+             372: 91(int16_t) Constant 1
+             373:145(i16vec2) ConstantComposite 371 371
+             374:145(i16vec2) ConstantComposite 372 372
+             467:     29(int) Constant 1
+             468:  148(ivec2) ConstantComposite 30 30
+             469:  148(ivec2) ConstantComposite 467 467
+             472:     19(int) Constant 0
+             473:     19(int) Constant 1
+             474:  154(ivec2) ConstantComposite 472 472
+             475:  154(ivec2) ConstantComposite 473 473
+             550: 16(int64_t) Constant 0 0
+             551: 16(int64_t) Constant 1 0
+             552:162(i64vec2) ConstantComposite 550 550
+             553:162(i64vec2) ConstantComposite 551 551
+             556: 38(int64_t) Constant 0 0
+             557: 38(int64_t) Constant 1 0
+             558:167(i64vec2) ConstantComposite 556 556
+             559:167(i64vec2) ConstantComposite 557 557
+             565:             TypeVector 77(int16_t) 3
+             566:             TypeVector 77(int16_t) 4
+             567:             TypeVector 91(int16_t) 3
+             568:             TypeVector 91(int16_t) 4
+             569:             TypeVector 29(int) 3
+             570:             TypeVector 29(int) 4
+             571:             TypeVector 19(int) 3
+             572:             TypeVector 19(int) 4
+      573(Block):             TypeStruct 77(int16_t) 139(i16vec2) 565(i16vec3) 566(i16vec4) 91(int16_t) 145(i16vec2) 567(i16vec3) 568(i16vec4) 29(int) 148(ivec2) 569(ivec3) 570(ivec4) 19(int) 154(ivec2) 571(ivec3) 572(ivec4)
+             574:             TypePointer Uniform 573(Block)
+      575(block):    574(ptr) Variable Uniform
+         4(main):           2 Function None 3
+               5:             Label
+                              Return
+                              FunctionEnd
+     6(literal():           2 Function None 3
+               7:             Label
+         18(i64):     17(ptr) Variable Function
+   35(indexable):     34(ptr) Variable Function
+         40(u64):     39(ptr) Variable Function
+   49(indexable):     48(ptr) Variable Function
+         53(i32):     52(ptr) Variable Function
+   62(indexable):     61(ptr) Variable Function
+         66(u32):     65(ptr) Variable Function
+   74(indexable):     73(ptr) Variable Function
+         79(i16):     78(ptr) Variable Function
+   88(indexable):     87(ptr) Variable Function
+         93(u16):     92(ptr) Variable Function
+  101(indexable):    100(ptr) Variable Function
+         106(i8):    105(ptr) Variable Function
+  115(indexable):    114(ptr) Variable Function
+         120(u8):    119(ptr) Variable Function
+  128(indexable):    127(ptr) Variable Function
+              32:     31(ptr) AccessChain 28 30
+              33:     19(int) Load 32
+                              Store 35(indexable) 25
+              36:     17(ptr) AccessChain 35(indexable) 33
+              37: 16(int64_t) Load 36
+                              Store 18(i64) 37
+              46:     31(ptr) AccessChain 28 30
+              47:     19(int) Load 46
+                              Store 49(indexable) 45
+              50:     39(ptr) AccessChain 49(indexable) 47
+              51: 38(int64_t) Load 50
+                              Store 40(u64) 51
+              59:     31(ptr) AccessChain 28 30
+              60:     19(int) Load 59
+                              Store 62(indexable) 58
+              63:     52(ptr) AccessChain 62(indexable) 60
+              64:     29(int) Load 63
+                              Store 53(i32) 64
+              71:     31(ptr) AccessChain 28 30
+              72:     19(int) Load 71
+                              Store 74(indexable) 70
+              75:     65(ptr) AccessChain 74(indexable) 72
+              76:     19(int) Load 75
+                              Store 66(u32) 76
+              85:     31(ptr) AccessChain 28 30
+              86:     19(int) Load 85
+                              Store 88(indexable) 84
+              89:     78(ptr) AccessChain 88(indexable) 86
+              90: 77(int16_t) Load 89
+                              Store 79(i16) 90
+              98:     31(ptr) AccessChain 28 30
+              99:     19(int) Load 98
+                              Store 101(indexable) 97
+             102:     92(ptr) AccessChain 101(indexable) 99
+             103: 91(int16_t) Load 102
+                              Store 93(u16) 103
+             112:     31(ptr) AccessChain 28 30
+             113:     19(int) Load 112
+                              Store 115(indexable) 111
+             116:    105(ptr) AccessChain 115(indexable) 113
+             117: 104(int8_t) Load 116
+                              Store 106(i8) 117
+             125:     31(ptr) AccessChain 28 30
+             126:     19(int) Load 125
+                              Store 128(indexable) 124
+             129:    119(ptr) AccessChain 128(indexable) 126
+             130: 118(int8_t) Load 129
+                              Store 120(u8) 130
+                              Return
+                              FunctionEnd
+   8(typeCast8():           2 Function None 3
+               9:             Label
+        133(u8v):    132(ptr) Variable Function
+        136(i8v):    135(ptr) Variable Function
+       141(i16v):    140(ptr) Variable Function
+       150(i32v):    149(ptr) Variable Function
+       158(u32v):    157(ptr) Variable Function
+       164(i64v):    163(ptr) Variable Function
+       169(u64v):    168(ptr) Variable Function
+       183(f16v):    182(ptr) Variable Function
+       189(f32v):    188(ptr) Variable Function
+       195(f64v):    194(ptr) Variable Function
+       222(u16v):    221(ptr) Variable Function
+         252(bv):    251(ptr) Variable Function
+             137: 134(i8vec2) Load 136(i8v)
+             138: 131(i8vec2) Bitcast 137
+                              Store 133(u8v) 138
+             142: 134(i8vec2) Load 136(i8v)
+             143:139(i16vec2) SConvert 142
+                              Store 141(i16v) 143
+             144: 131(i8vec2) Load 133(u8v)
+             146:145(i16vec2) UConvert 144
+             147:139(i16vec2) Bitcast 146
+                              Store 141(i16v) 147
+             151: 134(i8vec2) Load 136(i8v)
+             152:  148(ivec2) SConvert 151
+                              Store 150(i32v) 152
+             153: 131(i8vec2) Load 133(u8v)
+             155:  154(ivec2) UConvert 153
+             156:  148(ivec2) Bitcast 155
+                              Store 150(i32v) 156
+             159: 134(i8vec2) Load 136(i8v)
+             160:  148(ivec2) SConvert 159
+             161:  154(ivec2) Bitcast 160
+                              Store 158(u32v) 161
+             165: 134(i8vec2) Load 136(i8v)
+             166:162(i64vec2) SConvert 165
+                              Store 164(i64v) 166
+             170: 134(i8vec2) Load 136(i8v)
+             171:162(i64vec2) SConvert 170
+             172:167(i64vec2) Bitcast 171
+                              Store 169(u64v) 172
+             173: 131(i8vec2) Load 133(u8v)
+             174:  154(ivec2) UConvert 173
+                              Store 158(u32v) 174
+             175: 131(i8vec2) Load 133(u8v)
+             176:167(i64vec2) UConvert 175
+             177:162(i64vec2) Bitcast 176
+                              Store 164(i64v) 177
+             178: 131(i8vec2) Load 133(u8v)
+             179:167(i64vec2) UConvert 178
+                              Store 169(u64v) 179
+             184: 134(i8vec2) Load 136(i8v)
+             185:181(f16vec2) ConvertSToF 184
+                              Store 183(f16v) 185
+             190: 134(i8vec2) Load 136(i8v)
+             191:  187(fvec2) ConvertSToF 190
+                              Store 189(f32v) 191
+             196: 134(i8vec2) Load 136(i8v)
+             197:193(f64vec2) ConvertSToF 196
+                              Store 195(f64v) 197
+             198: 131(i8vec2) Load 133(u8v)
+             199:181(f16vec2) ConvertUToF 198
+                              Store 183(f16v) 199
+             200: 131(i8vec2) Load 133(u8v)
+             201:  187(fvec2) ConvertUToF 200
+                              Store 189(f32v) 201
+             202: 131(i8vec2) Load 133(u8v)
+             203:193(f64vec2) ConvertUToF 202
+                              Store 195(f64v) 203
+             204: 131(i8vec2) Load 133(u8v)
+             205: 134(i8vec2) Bitcast 204
+                              Store 136(i8v) 205
+             206: 134(i8vec2) Load 136(i8v)
+             207:139(i16vec2) SConvert 206
+                              Store 141(i16v) 207
+             208: 131(i8vec2) Load 133(u8v)
+             209:145(i16vec2) UConvert 208
+             210:139(i16vec2) Bitcast 209
+                              Store 141(i16v) 210
+             211: 134(i8vec2) Load 136(i8v)
+             212:  148(ivec2) SConvert 211
+                              Store 150(i32v) 212
+             213: 131(i8vec2) Load 133(u8v)
+             214:  154(ivec2) UConvert 213
+             215:  148(ivec2) Bitcast 214
+                              Store 150(i32v) 215
+             216: 134(i8vec2) Load 136(i8v)
+             217:162(i64vec2) SConvert 216
+                              Store 164(i64v) 217
+             218: 134(i8vec2) Load 136(i8v)
+             219:162(i64vec2) SConvert 218
+             220:167(i64vec2) Bitcast 219
+                              Store 169(u64v) 220
+             223: 134(i8vec2) Load 136(i8v)
+             224:139(i16vec2) SConvert 223
+             225:145(i16vec2) Bitcast 224
+                              Store 222(u16v) 225
+             226: 131(i8vec2) Load 133(u8v)
+             227:145(i16vec2) UConvert 226
+                              Store 222(u16v) 227
+             228: 131(i8vec2) Load 133(u8v)
+             229:  154(ivec2) UConvert 228
+                              Store 158(u32v) 229
+             230: 131(i8vec2) Load 133(u8v)
+             231:167(i64vec2) UConvert 230
+             232:162(i64vec2) Bitcast 231
+                              Store 164(i64v) 232
+             233: 131(i8vec2) Load 133(u8v)
+             234:167(i64vec2) UConvert 233
+             235:162(i64vec2) Bitcast 234
+             236:167(i64vec2) Bitcast 235
+                              Store 169(u64v) 236
+             237: 134(i8vec2) Load 136(i8v)
+             238:181(f16vec2) ConvertSToF 237
+                              Store 183(f16v) 238
+             239: 134(i8vec2) Load 136(i8v)
+             240:  187(fvec2) ConvertSToF 239
+                              Store 189(f32v) 240
+             241: 134(i8vec2) Load 136(i8v)
+             242:193(f64vec2) ConvertSToF 241
+                              Store 195(f64v) 242
+             243: 131(i8vec2) Load 133(u8v)
+             244:181(f16vec2) ConvertUToF 243
+                              Store 183(f16v) 244
+             245: 131(i8vec2) Load 133(u8v)
+             246:  187(fvec2) ConvertUToF 245
+                              Store 189(f32v) 246
+             247: 131(i8vec2) Load 133(u8v)
+             248:193(f64vec2) ConvertUToF 247
+                              Store 195(f64v) 248
+             253:  250(bvec2) Load 252(bv)
+             257: 134(i8vec2) Select 253 256 255
+                              Store 136(i8v) 257
+             258:  250(bvec2) Load 252(bv)
+             263: 131(i8vec2) Select 258 262 261
+                              Store 133(u8v) 263
+             264: 134(i8vec2) Load 136(i8v)
+             265:  250(bvec2) INotEqual 264 261
+                              Store 252(bv) 265
+             266: 131(i8vec2) Load 133(u8v)
+             267:  250(bvec2) INotEqual 266 261
+                              Store 252(bv) 267
+                              Return
+                              FunctionEnd
+ 10(typeCast16():           2 Function None 3
+              11:             Label
+       268(i32v):    149(ptr) Variable Function
+       269(i16v):    140(ptr) Variable Function
+       272(u16v):    221(ptr) Variable Function
+       278(u32v):    157(ptr) Variable Function
+       282(i64v):    163(ptr) Variable Function
+       285(u64v):    168(ptr) Variable Function
+       296(f16v):    182(ptr) Variable Function
+       299(f32v):    188(ptr) Variable Function
+       302(f64v):    194(ptr) Variable Function
+        347(i8v):    135(ptr) Variable Function
+        353(u8v):    132(ptr) Variable Function
+         363(bv):    251(ptr) Variable Function
+             270:139(i16vec2) Load 269(i16v)
+             271:  148(ivec2) SConvert 270
+                              Store 268(i32v) 271
+             273:145(i16vec2) Load 272(u16v)
+             274:  154(ivec2) UConvert 273
+             275:  148(ivec2) Bitcast 274
+                              Store 268(i32v) 275
+             276:139(i16vec2) Load 269(i16v)
+             277:145(i16vec2) Bitcast 276
+                              Store 272(u16v) 277
+             279:139(i16vec2) Load 269(i16v)
+             280:  148(ivec2) SConvert 279
+             281:  154(ivec2) Bitcast 280
+                              Store 278(u32v) 281
+             283:139(i16vec2) Load 269(i16v)
+             284:162(i64vec2) SConvert 283
+                              Store 282(i64v) 284
+             286:139(i16vec2) Load 269(i16v)
+             287:162(i64vec2) SConvert 286
+             288:167(i64vec2) Bitcast 287
+                              Store 285(u64v) 288
+             289:145(i16vec2) Load 272(u16v)
+             290:  154(ivec2) UConvert 289
+                              Store 278(u32v) 290
+             291:145(i16vec2) Load 272(u16v)
+             292:167(i64vec2) UConvert 291
+             293:162(i64vec2) Bitcast 292
+                              Store 282(i64v) 293
+             294:145(i16vec2) Load 272(u16v)
+             295:167(i64vec2) UConvert 294
+                              Store 285(u64v) 295
+             297:139(i16vec2) Load 269(i16v)
+             298:181(f16vec2) ConvertSToF 297
+                              Store 296(f16v) 298
+             300:139(i16vec2) Load 269(i16v)
+             301:  187(fvec2) ConvertSToF 300
+                              Store 299(f32v) 301
+             303:139(i16vec2) Load 269(i16v)
+             304:193(f64vec2) ConvertSToF 303
+                              Store 302(f64v) 304
+             305:145(i16vec2) Load 272(u16v)
+             306:181(f16vec2) ConvertUToF 305
+                              Store 296(f16v) 306
+             307:145(i16vec2) Load 272(u16v)
+             308:  187(fvec2) ConvertUToF 307
+                              Store 299(f32v) 308
+             309:145(i16vec2) Load 272(u16v)
+             310:193(f64vec2) ConvertUToF 309
+                              Store 302(f64v) 310
+             311:139(i16vec2) Load 269(i16v)
+             312:  148(ivec2) SConvert 311
+                              Store 268(i32v) 312
+             313:145(i16vec2) Load 272(u16v)
+             314:  154(ivec2) UConvert 313
+             315:  148(ivec2) Bitcast 314
+                              Store 268(i32v) 315
+             316:139(i16vec2) Load 269(i16v)
+             317:145(i16vec2) Bitcast 316
+                              Store 272(u16v) 317
+             318:139(i16vec2) Load 269(i16v)
+             319:  148(ivec2) SConvert 318
+             320:  154(ivec2) Bitcast 319
+                              Store 278(u32v) 320
+             321:139(i16vec2) Load 269(i16v)
+             322:162(i64vec2) SConvert 321
+                              Store 282(i64v) 322
+             323:139(i16vec2) Load 269(i16v)
+             324:162(i64vec2) SConvert 323
+             325:167(i64vec2) Bitcast 324
+                              Store 285(u64v) 325
+             326:145(i16vec2) Load 272(u16v)
+             327:  154(ivec2) UConvert 326
+                              Store 278(u32v) 327
+             328:145(i16vec2) Load 272(u16v)
+             329:167(i64vec2) UConvert 328
+             330:162(i64vec2) Bitcast 329
+                              Store 282(i64v) 330
+             331:145(i16vec2) Load 272(u16v)
+             332:167(i64vec2) UConvert 331
+             333:162(i64vec2) Bitcast 332
+             334:167(i64vec2) Bitcast 333
+                              Store 285(u64v) 334
+             335:139(i16vec2) Load 269(i16v)
+             336:181(f16vec2) ConvertSToF 335
+                              Store 296(f16v) 336
+             337:139(i16vec2) Load 269(i16v)
+             338:  187(fvec2) ConvertSToF 337
+                              Store 299(f32v) 338
+             339:139(i16vec2) Load 269(i16v)
+             340:193(f64vec2) ConvertSToF 339
+                              Store 302(f64v) 340
+             341:145(i16vec2) Load 272(u16v)
+             342:181(f16vec2) ConvertUToF 341
+                              Store 296(f16v) 342
+             343:145(i16vec2) Load 272(u16v)
+             344:  187(fvec2) ConvertUToF 343
+                              Store 299(f32v) 344
+             345:145(i16vec2) Load 272(u16v)
+             346:193(f64vec2) ConvertUToF 345
+                              Store 302(f64v) 346
+             348:139(i16vec2) Load 269(i16v)
+             349: 134(i8vec2) SConvert 348
+                              Store 347(i8v) 349
+             350:145(i16vec2) Load 272(u16v)
+             351: 131(i8vec2) UConvert 350
+             352: 134(i8vec2) Bitcast 351
+                              Store 347(i8v) 352
+             354:139(i16vec2) Load 269(i16v)
+             355: 134(i8vec2) SConvert 354
+             356: 131(i8vec2) Bitcast 355
+                              Store 353(u8v) 356
+             357:145(i16vec2) Load 272(u16v)
+             358: 131(i8vec2) UConvert 357
+                              Store 353(u8v) 358
+             359:145(i16vec2) Load 272(u16v)
+             360: 131(i8vec2) UConvert 359
+             361:145(i16vec2) UConvert 360
+             362:139(i16vec2) Bitcast 361
+                              Store 269(i16v) 362
+             364:  250(bvec2) Load 363(bv)
+             369:139(i16vec2) Select 364 368 367
+                              Store 269(i16v) 369
+             370:  250(bvec2) Load 363(bv)
+             375:145(i16vec2) Select 370 374 373
+                              Store 272(u16v) 375
+             376:139(i16vec2) Load 269(i16v)
+             377:  250(bvec2) INotEqual 376 373
+                              Store 363(bv) 377
+             378:145(i16vec2) Load 272(u16v)
+             379:  250(bvec2) INotEqual 378 373
+                              Store 363(bv) 379
+                              Return
+                              FunctionEnd
+ 12(typeCast32():           2 Function None 3
+              13:             Label
+       380(u32v):    157(ptr) Variable Function
+       381(i32v):    149(ptr) Variable Function
+       384(i64v):    163(ptr) Variable Function
+       387(u64v):    168(ptr) Variable Function
+       396(f32v):    188(ptr) Variable Function
+       399(f64v):    194(ptr) Variable Function
+        406(i8v):    135(ptr) Variable Function
+       412(i16v):    140(ptr) Variable Function
+        429(u8v):    132(ptr) Variable Function
+       435(u16v):    221(ptr) Variable Function
+       452(f16v):    182(ptr) Variable Function
+         465(bv):    251(ptr) Variable Function
+             382:  148(ivec2) Load 381(i32v)
+             383:  154(ivec2) Bitcast 382
+                              Store 380(u32v) 383
+             385:  148(ivec2) Load 381(i32v)
+             386:162(i64vec2) SConvert 385
+                              Store 384(i64v) 386
+             388:  148(ivec2) Load 381(i32v)
+             389:162(i64vec2) SConvert 388
+             390:167(i64vec2) Bitcast 389
+                              Store 387(u64v) 390
+             391:  154(ivec2) Load 380(u32v)
+             392:167(i64vec2) UConvert 391
+             393:162(i64vec2) Bitcast 392
+                              Store 384(i64v) 393
+             394:  154(ivec2) Load 380(u32v)
+             395:167(i64vec2) UConvert 394
+                              Store 387(u64v) 395
+             397:  148(ivec2) Load 381(i32v)
+             398:  187(fvec2) ConvertSToF 397
+                              Store 396(f32v) 398
+             400:  148(ivec2) Load 381(i32v)
+             401:193(f64vec2) ConvertSToF 400
+                              Store 399(f64v) 401
+             402:  154(ivec2) Load 380(u32v)
+             403:  187(fvec2) ConvertUToF 402
+                              Store 396(f32v) 403
+             404:  154(ivec2) Load 380(u32v)
+             405:193(f64vec2) ConvertUToF 404
+                              Store 399(f64v) 405
+             407:  148(ivec2) Load 381(i32v)
+             408: 134(i8vec2) SConvert 407
+                              Store 406(i8v) 408
+             409:  154(ivec2) Load 380(u32v)
+             410: 131(i8vec2) UConvert 409
+             411: 134(i8vec2) Bitcast 410
+                              Store 406(i8v) 411
+             413:  148(ivec2) Load 381(i32v)
+             414:139(i16vec2) SConvert 413
+                              Store 412(i16v) 414
+             415:  154(ivec2) Load 380(u32v)
+             416:145(i16vec2) UConvert 415
+             417:139(i16vec2) Bitcast 416
+                              Store 412(i16v) 417
+             418:  148(ivec2) Load 381(i32v)
+             419:     29(int) CompositeExtract 418 0
+             420:     29(int) CompositeExtract 418 1
+             421:  148(ivec2) CompositeConstruct 419 420
+                              Store 381(i32v) 421
+             422:  154(ivec2) Load 380(u32v)
+             423:  148(ivec2) Bitcast 422
+                              Store 381(i32v) 423
+             424:  148(ivec2) Load 381(i32v)
+             425:162(i64vec2) SConvert 424
+                              Store 384(i64v) 425
+             426:  154(ivec2) Load 380(u32v)
+             427:167(i64vec2) UConvert 426
+             428:162(i64vec2) Bitcast 427
+                              Store 384(i64v) 428
+             430:  148(ivec2) Load 381(i32v)
+             431: 134(i8vec2) SConvert 430
+             432: 131(i8vec2) Bitcast 431
+                              Store 429(u8v) 432
+             433:  154(ivec2) Load 380(u32v)
+             434: 131(i8vec2) UConvert 433
+                              Store 429(u8v) 434
+             436:  148(ivec2) Load 381(i32v)
+             437:139(i16vec2) SConvert 436
+             438:145(i16vec2) Bitcast 437
+                              Store 435(u16v) 438
+             439:  154(ivec2) Load 380(u32v)
+             440:145(i16vec2) UConvert 439
+                              Store 435(u16v) 440
+             441:  148(ivec2) Load 381(i32v)
+             442:  154(ivec2) Bitcast 441
+                              Store 380(u32v) 442
+             443:  154(ivec2) Load 380(u32v)
+             444:     19(int) CompositeExtract 443 0
+             445:     19(int) CompositeExtract 443 1
+             446:  154(ivec2) CompositeConstruct 444 445
+                              Store 380(u32v) 446
+             447:  148(ivec2) Load 381(i32v)
+             448:162(i64vec2) SConvert 447
+             449:167(i64vec2) Bitcast 448
+                              Store 387(u64v) 449
+             450:  154(ivec2) Load 380(u32v)
+             451:167(i64vec2) UConvert 450
+                              Store 387(u64v) 451
+             453:  148(ivec2) Load 381(i32v)
+             454:181(f16vec2) ConvertSToF 453
+                              Store 452(f16v) 454
+             455:  148(ivec2) Load 381(i32v)
+             456:  187(fvec2) ConvertSToF 455
+                              Store 396(f32v) 456
+             457:  148(ivec2) Load 381(i32v)
+             458:193(f64vec2) ConvertSToF 457
+                              Store 399(f64v) 458
+             459:  154(ivec2) Load 380(u32v)
+             460:181(f16vec2) ConvertUToF 459
+                              Store 452(f16v) 460
+             461:  154(ivec2) Load 380(u32v)
+             462:  187(fvec2) ConvertUToF 461
+                              Store 396(f32v) 462
+             463:  154(ivec2) Load 380(u32v)
+             464:193(f64vec2) ConvertUToF 463
+                              Store 399(f64v) 464
+             466:  250(bvec2) Load 465(bv)
+             470:  148(ivec2) Select 466 469 468
+                              Store 381(i32v) 470
+             471:  250(bvec2) Load 465(bv)
+             476:  154(ivec2) Select 471 475 474
+                              Store 380(u32v) 476
+             477:  148(ivec2) Load 381(i32v)
+             478:  250(bvec2) INotEqual 477 474
+                              Store 465(bv) 478
+             479:  154(ivec2) Load 380(u32v)
+             480:  250(bvec2) INotEqual 479 474
+                              Store 465(bv) 480
+                              Return
+                              FunctionEnd
+ 14(typeCast64():           2 Function None 3
+              15:             Label
+       481(u64v):    168(ptr) Variable Function
+       482(i64v):    163(ptr) Variable Function
+       485(f64v):    194(ptr) Variable Function
+        490(i8v):    135(ptr) Variable Function
+       496(i16v):    140(ptr) Variable Function
+       502(i32v):    149(ptr) Variable Function
+        510(u8v):    132(ptr) Variable Function
+       516(u16v):    221(ptr) Variable Function
+       522(u32v):    157(ptr) Variable Function
+       534(f16v):    182(ptr) Variable Function
+       537(f32v):    188(ptr) Variable Function
+         548(bv):    251(ptr) Variable Function
+             483:162(i64vec2) Load 482(i64v)
+             484:167(i64vec2) Bitcast 483
+                              Store 481(u64v) 484
+             486:162(i64vec2) Load 482(i64v)
+             487:193(f64vec2) ConvertSToF 486
+                              Store 485(f64v) 487
+             488:167(i64vec2) Load 481(u64v)
+             489:193(f64vec2) ConvertUToF 488
+                              Store 485(f64v) 489
+             491:162(i64vec2) Load 482(i64v)
+             492: 134(i8vec2) SConvert 491
+                              Store 490(i8v) 492
+             493:167(i64vec2) Load 481(u64v)
+             494: 131(i8vec2) UConvert 493
+             495: 134(i8vec2) Bitcast 494
+                              Store 490(i8v) 495
+             497:162(i64vec2) Load 482(i64v)
+             498:139(i16vec2) SConvert 497
+                              Store 496(i16v) 498
+             499:167(i64vec2) Load 481(u64v)
+             500:145(i16vec2) UConvert 499
+             501:139(i16vec2) Bitcast 500
+                              Store 496(i16v) 501
+             503:162(i64vec2) Load 482(i64v)
+             504:  148(ivec2) SConvert 503
+                              Store 502(i32v) 504
+             505:167(i64vec2) Load 481(u64v)
+             506:  154(ivec2) UConvert 505
+             507:  148(ivec2) Bitcast 506
+                              Store 502(i32v) 507
+             508:167(i64vec2) Load 481(u64v)
+             509:162(i64vec2) Bitcast 508
+                              Store 482(i64v) 509
+             511:162(i64vec2) Load 482(i64v)
+             512: 134(i8vec2) SConvert 511
+             513: 131(i8vec2) Bitcast 512
+                              Store 510(u8v) 513
+             514:167(i64vec2) Load 481(u64v)
+             515: 131(i8vec2) UConvert 514
+                              Store 510(u8v) 515
+             517:162(i64vec2) Load 482(i64v)
+             518:139(i16vec2) SConvert 517
+             519:145(i16vec2) Bitcast 518
+                              Store 516(u16v) 519
+             520:167(i64vec2) Load 481(u64v)
+             521:145(i16vec2) UConvert 520
+                              Store 516(u16v) 521
+             523:162(i64vec2) Load 482(i64v)
+             524:  148(ivec2) SConvert 523
+             525:  154(ivec2) Bitcast 524
+                              Store 522(u32v) 525
+             526:167(i64vec2) Load 481(u64v)
+             527:  154(ivec2) UConvert 526
+                              Store 522(u32v) 527
+             528:162(i64vec2) Load 482(i64v)
+             529:167(i64vec2) Bitcast 528
+                              Store 481(u64v) 529
+             530:167(i64vec2) Load 481(u64v)
+             531: 38(int64_t) CompositeExtract 530 0
+             532: 38(int64_t) CompositeExtract 530 1
+             533:167(i64vec2) CompositeConstruct 531 532
+                              Store 481(u64v) 533
+             535:162(i64vec2) Load 482(i64v)
+             536:181(f16vec2) ConvertSToF 535
+                              Store 534(f16v) 536
+             538:162(i64vec2) Load 482(i64v)
+             539:  187(fvec2) ConvertSToF 538
+                              Store 537(f32v) 539
+             540:162(i64vec2) Load 482(i64v)
+             541:193(f64vec2) ConvertSToF 540
+                              Store 485(f64v) 541
+             542:167(i64vec2) Load 481(u64v)
+             543:181(f16vec2) ConvertUToF 542
+                              Store 534(f16v) 543
+             544:167(i64vec2) Load 481(u64v)
+             545:  187(fvec2) ConvertUToF 544
+                              Store 537(f32v) 545
+             546:167(i64vec2) Load 481(u64v)
+             547:193(f64vec2) ConvertUToF 546
+                              Store 485(f64v) 547
+             549:  250(bvec2) Load 548(bv)
+             554:162(i64vec2) Select 549 553 552
+                              Store 482(i64v) 554
+             555:  250(bvec2) Load 548(bv)
+             560:167(i64vec2) Select 555 559 558
+                              Store 481(u64v) 560
+             561:162(i64vec2) Load 482(i64v)
+             562:  250(bvec2) INotEqual 561 558
+                              Store 548(bv) 562
+             563:167(i64vec2) Load 481(u64v)
+             564:  250(bvec2) INotEqual 563 558
+                              Store 548(bv) 564
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.extPostDepthCoverage.frag.out b/Test/baseResults/spv.extPostDepthCoverage.frag.out
new file mode 100644
index 0000000..85a2359
--- /dev/null
+++ b/Test/baseResults/spv.extPostDepthCoverage.frag.out
@@ -0,0 +1,23 @@
+spv.extPostDepthCoverage.frag
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 6
+
+                              Capability Shader
+                              Capability SampleMaskPostDepthCoverage
+                              Extension  "SPV_KHR_post_depth_coverage"
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main"
+                              ExecutionMode 4 OriginUpperLeft
+                              ExecutionMode 4 EarlyFragmentTests
+                              ExecutionMode 4 PostDepthCoverage
+                              Source ESSL 310
+                              SourceExtension  "GL_EXT_post_depth_coverage"
+                              Name 4  "main"
+               2:             TypeVoid
+               3:             TypeFunction 2
+         4(main):           2 Function None 3
+               5:             Label
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.extPostDepthCoverage_Error.frag.out b/Test/baseResults/spv.extPostDepthCoverage_Error.frag.out
new file mode 100644
index 0000000..9ce299f
--- /dev/null
+++ b/Test/baseResults/spv.extPostDepthCoverage_Error.frag.out
@@ -0,0 +1,4 @@
+spv.extPostDepthCoverage_Error.frag
+ERROR: Linking fragment stage: post_depth_coverage requires early_fragment_tests
+
+SPIR-V is not generated for failed compile or link
diff --git a/Test/baseResults/spv.float16.frag.out b/Test/baseResults/spv.float16.frag.out
index 7c2b3c0..37c6639 100644
--- a/Test/baseResults/spv.float16.frag.out
+++ b/Test/baseResults/spv.float16.frag.out
@@ -1,8 +1,10 @@
 spv.float16.frag
-Warning, version 450 is not yet complete; most version-specific features are present, but some are missing.
+error: SPIRV-Tools Validation Errors
+error: Capability Float16 is not allowed by Vulkan 1.0 specification (or requires extension)
+  OpCapability Float16
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 534
 
                               Capability Shader
@@ -112,6 +114,10 @@
                               Name 526  "sf16"
                               Name 527  "sf"
                               Name 528  "sd"
+                              Name 529  "f16_to_f"
+                              Name 531  "f16_to_d"
+                              Name 532  "f_to_f16"
+                              Name 533  "d_to_f16"
                               Decorate 512 ArrayStride 16
                               Decorate 513 ArrayStride 32
                               MemberDecorate 514(S) 0 Offset 0
@@ -158,86 +164,86 @@
                2:             TypeVoid
                3:             TypeFunction 2
               28:             TypeFloat 16
-              29:             TypeVector 28(float) 2
-              30:             TypePointer Function 29(fvec2)
-              32:   28(float) Constant 16
+              29:             TypeVector 28(float16_t) 2
+              30:             TypePointer Function 29(f16vec2)
+              32:28(float16_t) Constant 16
               33:             TypeInt 32 0
               34:     33(int) Constant 0
-              35:             TypePointer Function 28(float)
-              37:   28(float) Constant 46080
-              38:   28(float) Constant 10158
-              39:   29(fvec2) ConstantComposite 37 38
-              56:   28(float) Constant 15360
-              62:             TypeMatrix 29(fvec2) 2
+              35:             TypePointer Function 28(float16_t)
+              37:28(float16_t) Constant 46080
+              38:28(float16_t) Constant 10158
+              39: 29(f16vec2) ConstantComposite 37 38
+              56:28(float16_t) Constant 15360
+              62:             TypeMatrix 29(f16vec2) 2
               63:             TypePointer Function 62
               90:     33(int) Constant 1
              109:             TypeBool
              110:             TypePointer Function 109(bool)
-             151:             TypeVector 28(float) 3
-             152:             TypePointer Function 151(fvec3)
+             151:             TypeVector 28(float16_t) 3
+             152:             TypePointer Function 151(f16vec3)
              154:             TypeVector 109(bool) 3
              155:             TypePointer Function 154(bvec3)
-             158:   28(float) Constant 0
-             159:  151(fvec3) ConstantComposite 158 158 158
-             160:  151(fvec3) ConstantComposite 56 56 56
+             158:28(float16_t) Constant 0
+             159:151(f16vec3) ConstantComposite 158 158 158
+             160:151(f16vec3) ConstantComposite 56 56 56
              164:             TypeFloat 32
              165:             TypeVector 164(float) 3
              166:             TypePointer Function 165(fvec3)
              172:             TypeFloat 64
-             173:             TypeVector 172(float) 3
-             174:             TypePointer Function 173(fvec3)
+             173:             TypeVector 172(float64_t) 3
+             174:             TypePointer Function 173(f64vec3)
              183:             TypeInt 32 1
              184:             TypeVector 183(int) 3
              185:             TypePointer Function 184(ivec3)
              191:             TypeVector 33(int) 3
              192:             TypePointer Function 191(ivec3)
              198:             TypeInt 64 1
-             199:             TypeVector 198(int) 3
-             200:             TypePointer Function 199(ivec3)
+             199:             TypeVector 198(int64_t) 3
+             200:             TypePointer Function 199(i64vec3)
              206:             TypeInt 64 0
-             207:             TypeVector 206(int) 3
-             208:             TypePointer Function 207(ivec3)
-             214:             TypeVector 28(float) 4
-             215:             TypePointer Function 214(fvec4)
-    364(ResType):             TypeStruct 151(fvec3) 184(ivec3)
+             207:             TypeVector 206(int64_t) 3
+             208:             TypePointer Function 207(i64vec3)
+             214:             TypeVector 28(float16_t) 4
+             215:             TypePointer Function 214(f16vec4)
+    364(ResType):             TypeStruct 151(f16vec3) 184(ivec3)
              371:             TypePointer Function 33(int)
-             406:             TypeMatrix 151(fvec3) 2
+             406:             TypeMatrix 151(f16vec3) 2
              407:             TypePointer Function 406
-             425:             TypeMatrix 29(fvec2) 3
+             425:             TypeMatrix 29(f16vec2) 3
              426:             TypePointer Function 425
-             431:             TypeMatrix 151(fvec3) 3
+             431:             TypeMatrix 151(f16vec3) 3
              432:             TypePointer Function 431
-             436:             TypeMatrix 214(fvec4) 4
+             436:             TypeMatrix 214(f16vec4) 4
              437:             TypePointer Function 436
-             464:             TypePointer Input 151(fvec3)
+             464:             TypePointer Input 151(f16vec3)
       465(if16v):    464(ptr) Variable Input
-             466:             TypePointer Input 28(float)
+             466:             TypePointer Input 28(float16_t)
              503:    183(int) Constant 1
-             508:   28(float) Constant 14336
-             509:   29(fvec2) ConstantComposite 508 508
+             508:28(float16_t) Constant 14336
+             509: 29(f16vec2) ConstantComposite 508 508
              511:     33(int) Constant 2
-             512:             TypeArray 28(float) 511
+             512:             TypeArray 28(float16_t) 511
              513:             TypeArray 406 511
-          514(S):             TypeStruct 28(float) 29(fvec2) 151(fvec3)
+          514(S):             TypeStruct 28(float16_t) 29(f16vec2) 151(f16vec3)
              515:             TypeArray 514(S) 511
-         516(B1):             TypeStruct 28(float) 29(fvec2) 151(fvec3) 512 406 513 514(S) 515
+         516(B1):             TypeStruct 28(float16_t) 29(f16vec2) 151(f16vec3) 512 406 513 514(S) 515
              517:             TypePointer Uniform 516(B1)
              518:    517(ptr) Variable Uniform
-             519:             TypeArray 28(float) 511
+             519:             TypeArray 28(float16_t) 511
              520:             TypeArray 406 511
-          521(S):             TypeStruct 28(float) 29(fvec2) 151(fvec3)
+          521(S):             TypeStruct 28(float16_t) 29(f16vec2) 151(f16vec3)
              522:             TypeArray 521(S) 511
-         523(B2):             TypeStruct 28(float) 29(fvec2) 151(fvec3) 519 406 520 521(S) 522
+         523(B2):             TypeStruct 28(float16_t) 29(f16vec2) 151(f16vec3) 519 406 520 521(S) 522
              524:             TypePointer Uniform 523(B2)
              525:    524(ptr) Variable Uniform
-       526(sf16):   28(float) SpecConstant 12288
+       526(sf16):28(float16_t) SpecConstant 12288
          527(sf):  164(float) SpecConstant 1048576000
-         528(sd):  172(float) SpecConstant 0 1071644672
-             529:  164(float) SpecConstantOp 115 526(sf16)
+         528(sd):172(float64_t) SpecConstant 0 1071644672
+   529(f16_to_f):  164(float) SpecConstantOp 115 526(sf16)
              530:  164(float) SpecConstantOp 115 526(sf16)
-             531:  172(float) SpecConstantOp 115 530
-             532:   28(float) SpecConstantOp 115 527(sf)
-             533:   28(float) SpecConstantOp 115 528(sd)
+   531(f16_to_d):172(float64_t) SpecConstantOp 115 530
+   532(f_to_f16):28(float16_t) SpecConstantOp 115 527(sf)
+   533(d_to_f16):28(float16_t) SpecConstantOp 115 528(sd)
          4(main):           2 Function None 3
                5:             Label
                               Return
@@ -247,8 +253,8 @@
         31(f16v):     30(ptr) Variable Function
               36:     35(ptr) AccessChain 31(f16v) 34
                               Store 36 32
-              40:   29(fvec2) Load 31(f16v)
-              41:   29(fvec2) FAdd 40 39
+              40: 29(f16vec2) Load 31(f16v)
+              41: 29(f16vec2) FAdd 40 39
                               Store 31(f16v) 41
                               Return
                               FunctionEnd
@@ -258,125 +264,125 @@
         64(f16m):     63(ptr) Variable Function
          87(f16):     35(ptr) Variable Function
           111(b):    110(ptr) Variable Function
-              43:   29(fvec2) Load 42(f16v)
-              44:   29(fvec2) Load 42(f16v)
-              45:   29(fvec2) FAdd 44 43
+              43: 29(f16vec2) Load 42(f16v)
+              44: 29(f16vec2) Load 42(f16v)
+              45: 29(f16vec2) FAdd 44 43
                               Store 42(f16v) 45
-              46:   29(fvec2) Load 42(f16v)
-              47:   29(fvec2) Load 42(f16v)
-              48:   29(fvec2) FSub 47 46
+              46: 29(f16vec2) Load 42(f16v)
+              47: 29(f16vec2) Load 42(f16v)
+              48: 29(f16vec2) FSub 47 46
                               Store 42(f16v) 48
-              49:   29(fvec2) Load 42(f16v)
-              50:   29(fvec2) Load 42(f16v)
-              51:   29(fvec2) FMul 50 49
+              49: 29(f16vec2) Load 42(f16v)
+              50: 29(f16vec2) Load 42(f16v)
+              51: 29(f16vec2) FMul 50 49
                               Store 42(f16v) 51
-              52:   29(fvec2) Load 42(f16v)
-              53:   29(fvec2) Load 42(f16v)
-              54:   29(fvec2) FDiv 53 52
+              52: 29(f16vec2) Load 42(f16v)
+              53: 29(f16vec2) Load 42(f16v)
+              54: 29(f16vec2) FDiv 53 52
                               Store 42(f16v) 54
-              55:   29(fvec2) Load 42(f16v)
-              57:   29(fvec2) CompositeConstruct 56 56
-              58:   29(fvec2) FAdd 55 57
+              55: 29(f16vec2) Load 42(f16v)
+              57: 29(f16vec2) CompositeConstruct 56 56
+              58: 29(f16vec2) FAdd 55 57
                               Store 42(f16v) 58
-              59:   29(fvec2) Load 42(f16v)
-              60:   29(fvec2) CompositeConstruct 56 56
-              61:   29(fvec2) FSub 59 60
+              59: 29(f16vec2) Load 42(f16v)
+              60: 29(f16vec2) CompositeConstruct 56 56
+              61: 29(f16vec2) FSub 59 60
                               Store 42(f16v) 61
               65:          62 Load 64(f16m)
-              66:   29(fvec2) CompositeConstruct 56 56
-              67:   29(fvec2) CompositeExtract 65 0
-              68:   29(fvec2) FAdd 67 66
-              69:   29(fvec2) CompositeExtract 65 1
-              70:   29(fvec2) FAdd 69 66
+              66: 29(f16vec2) CompositeConstruct 56 56
+              67: 29(f16vec2) CompositeExtract 65 0
+              68: 29(f16vec2) FAdd 67 66
+              69: 29(f16vec2) CompositeExtract 65 1
+              70: 29(f16vec2) FAdd 69 66
               71:          62 CompositeConstruct 68 70
                               Store 64(f16m) 71
               72:          62 Load 64(f16m)
-              73:   29(fvec2) CompositeConstruct 56 56
-              74:   29(fvec2) CompositeExtract 72 0
-              75:   29(fvec2) FSub 74 73
-              76:   29(fvec2) CompositeExtract 72 1
-              77:   29(fvec2) FSub 76 73
+              73: 29(f16vec2) CompositeConstruct 56 56
+              74: 29(f16vec2) CompositeExtract 72 0
+              75: 29(f16vec2) FSub 74 73
+              76: 29(f16vec2) CompositeExtract 72 1
+              77: 29(f16vec2) FSub 76 73
               78:          62 CompositeConstruct 75 77
                               Store 64(f16m) 78
-              79:   29(fvec2) Load 42(f16v)
-              80:   29(fvec2) FNegate 79
+              79: 29(f16vec2) Load 42(f16v)
+              80: 29(f16vec2) FNegate 79
                               Store 42(f16v) 80
               81:          62 Load 64(f16m)
-              82:   29(fvec2) CompositeExtract 81 0
-              83:   29(fvec2) FNegate 82
-              84:   29(fvec2) CompositeExtract 81 1
-              85:   29(fvec2) FNegate 84
+              82: 29(f16vec2) CompositeExtract 81 0
+              83: 29(f16vec2) FNegate 82
+              84: 29(f16vec2) CompositeExtract 81 1
+              85: 29(f16vec2) FNegate 84
               86:          62 CompositeConstruct 83 85
                               Store 64(f16m) 86
               88:     35(ptr) AccessChain 42(f16v) 34
-              89:   28(float) Load 88
+              89:28(float16_t) Load 88
               91:     35(ptr) AccessChain 42(f16v) 90
-              92:   28(float) Load 91
-              93:   28(float) FAdd 89 92
+              92:28(float16_t) Load 91
+              93:28(float16_t) FAdd 89 92
                               Store 87(f16) 93
               94:     35(ptr) AccessChain 42(f16v) 34
-              95:   28(float) Load 94
+              95:28(float16_t) Load 94
               96:     35(ptr) AccessChain 42(f16v) 90
-              97:   28(float) Load 96
-              98:   28(float) FSub 95 97
+              97:28(float16_t) Load 96
+              98:28(float16_t) FSub 95 97
                               Store 87(f16) 98
               99:     35(ptr) AccessChain 42(f16v) 34
-             100:   28(float) Load 99
+             100:28(float16_t) Load 99
              101:     35(ptr) AccessChain 42(f16v) 90
-             102:   28(float) Load 101
-             103:   28(float) FMul 100 102
+             102:28(float16_t) Load 101
+             103:28(float16_t) FMul 100 102
                               Store 87(f16) 103
              104:     35(ptr) AccessChain 42(f16v) 34
-             105:   28(float) Load 104
+             105:28(float16_t) Load 104
              106:     35(ptr) AccessChain 42(f16v) 90
-             107:   28(float) Load 106
-             108:   28(float) FDiv 105 107
+             107:28(float16_t) Load 106
+             108:28(float16_t) FDiv 105 107
                               Store 87(f16) 108
              112:     35(ptr) AccessChain 42(f16v) 34
-             113:   28(float) Load 112
-             114:   28(float) Load 87(f16)
+             113:28(float16_t) Load 112
+             114:28(float16_t) Load 87(f16)
              115:   109(bool) FOrdNotEqual 113 114
                               Store 111(b) 115
              116:     35(ptr) AccessChain 42(f16v) 90
-             117:   28(float) Load 116
-             118:   28(float) Load 87(f16)
+             117:28(float16_t) Load 116
+             118:28(float16_t) Load 87(f16)
              119:   109(bool) FOrdEqual 117 118
                               Store 111(b) 119
              120:     35(ptr) AccessChain 42(f16v) 34
-             121:   28(float) Load 120
-             122:   28(float) Load 87(f16)
+             121:28(float16_t) Load 120
+             122:28(float16_t) Load 87(f16)
              123:   109(bool) FOrdGreaterThan 121 122
                               Store 111(b) 123
              124:     35(ptr) AccessChain 42(f16v) 90
-             125:   28(float) Load 124
-             126:   28(float) Load 87(f16)
+             125:28(float16_t) Load 124
+             126:28(float16_t) Load 87(f16)
              127:   109(bool) FOrdLessThan 125 126
                               Store 111(b) 127
              128:     35(ptr) AccessChain 42(f16v) 34
-             129:   28(float) Load 128
-             130:   28(float) Load 87(f16)
+             129:28(float16_t) Load 128
+             130:28(float16_t) Load 87(f16)
              131:   109(bool) FOrdGreaterThanEqual 129 130
                               Store 111(b) 131
              132:     35(ptr) AccessChain 42(f16v) 90
-             133:   28(float) Load 132
-             134:   28(float) Load 87(f16)
+             133:28(float16_t) Load 132
+             134:28(float16_t) Load 87(f16)
              135:   109(bool) FOrdLessThanEqual 133 134
                               Store 111(b) 135
-             136:   29(fvec2) Load 42(f16v)
-             137:   28(float) Load 87(f16)
-             138:   29(fvec2) VectorTimesScalar 136 137
+             136: 29(f16vec2) Load 42(f16v)
+             137:28(float16_t) Load 87(f16)
+             138: 29(f16vec2) VectorTimesScalar 136 137
                               Store 42(f16v) 138
              139:          62 Load 64(f16m)
-             140:   28(float) Load 87(f16)
+             140:28(float16_t) Load 87(f16)
              141:          62 MatrixTimesScalar 139 140
                               Store 64(f16m) 141
              142:          62 Load 64(f16m)
-             143:   29(fvec2) Load 42(f16v)
-             144:   29(fvec2) MatrixTimesVector 142 143
+             143: 29(f16vec2) Load 42(f16v)
+             144: 29(f16vec2) MatrixTimesVector 142 143
                               Store 42(f16v) 144
-             145:   29(fvec2) Load 42(f16v)
+             145: 29(f16vec2) Load 42(f16v)
              146:          62 Load 64(f16m)
-             147:   29(fvec2) VectorTimesMatrix 145 146
+             147: 29(f16vec2) VectorTimesMatrix 145 146
                               Store 42(f16v) 147
              148:          62 Load 64(f16m)
              149:          62 Load 64(f16m)
@@ -395,49 +401,49 @@
        201(i64v):    200(ptr) Variable Function
        209(u64v):    208(ptr) Variable Function
              157:  154(bvec3) Load 156(bv)
-             161:  151(fvec3) Select 157 160 159
+             161:151(f16vec3) Select 157 160 159
                               Store 153(f16v) 161
-             162:  151(fvec3) Load 153(f16v)
+             162:151(f16vec3) Load 153(f16v)
              163:  154(bvec3) FOrdNotEqual 162 159
                               Store 156(bv) 163
              168:  165(fvec3) Load 167(fv)
-             169:  151(fvec3) FConvert 168
+             169:151(f16vec3) FConvert 168
                               Store 153(f16v) 169
-             170:  151(fvec3) Load 153(f16v)
+             170:151(f16vec3) Load 153(f16v)
              171:  165(fvec3) FConvert 170
                               Store 167(fv) 171
-             176:  173(fvec3) Load 175(dv)
-             177:  151(fvec3) FConvert 176
+             176:173(f64vec3) Load 175(dv)
+             177:151(f16vec3) FConvert 176
                               Store 153(f16v) 177
-             178:  173(fvec3) Load 175(dv)
-             179:  172(float) CompositeExtract 178 0
-             180:  172(float) CompositeExtract 178 1
-             181:  172(float) CompositeExtract 178 2
-             182:  173(fvec3) CompositeConstruct 179 180 181
+             178:173(f64vec3) Load 175(dv)
+             179:172(float64_t) CompositeExtract 178 0
+             180:172(float64_t) CompositeExtract 178 1
+             181:172(float64_t) CompositeExtract 178 2
+             182:173(f64vec3) CompositeConstruct 179 180 181
                               Store 175(dv) 182
              187:  184(ivec3) Load 186(iv)
-             188:  151(fvec3) ConvertSToF 187
+             188:151(f16vec3) ConvertSToF 187
                               Store 153(f16v) 188
-             189:  151(fvec3) Load 153(f16v)
+             189:151(f16vec3) Load 153(f16v)
              190:  184(ivec3) ConvertFToS 189
                               Store 186(iv) 190
              194:  191(ivec3) Load 193(uv)
-             195:  151(fvec3) ConvertUToF 194
+             195:151(f16vec3) ConvertUToF 194
                               Store 153(f16v) 195
-             196:  151(fvec3) Load 153(f16v)
+             196:151(f16vec3) Load 153(f16v)
              197:  191(ivec3) ConvertFToU 196
                               Store 193(uv) 197
-             202:  199(ivec3) Load 201(i64v)
-             203:  151(fvec3) ConvertSToF 202
+             202:199(i64vec3) Load 201(i64v)
+             203:151(f16vec3) ConvertSToF 202
                               Store 153(f16v) 203
-             204:  151(fvec3) Load 153(f16v)
-             205:  199(ivec3) ConvertFToS 204
+             204:151(f16vec3) Load 153(f16v)
+             205:199(i64vec3) ConvertFToS 204
                               Store 201(i64v) 205
-             210:  207(ivec3) Load 209(u64v)
-             211:  151(fvec3) ConvertUToF 210
+             210:207(i64vec3) Load 209(u64v)
+             211:151(f16vec3) ConvertUToF 210
                               Store 153(f16v) 211
-             212:  151(fvec3) Load 153(f16v)
-             213:  207(ivec3) ConvertFToU 212
+             212:151(f16vec3) Load 153(f16v)
+             213:207(i64vec3) ConvertFToU 212
                               Store 209(u64v) 213
                               Return
                               FunctionEnd
@@ -445,51 +451,51 @@
               13:             Label
       216(f16v2):    215(ptr) Variable Function
       217(f16v1):    215(ptr) Variable Function
-             218:  214(fvec4) Load 217(f16v1)
-             219:  214(fvec4) ExtInst 1(GLSL.std.450) 11(Radians) 218
+             218:214(f16vec4) Load 217(f16v1)
+             219:214(f16vec4) ExtInst 1(GLSL.std.450) 11(Radians) 218
                               Store 216(f16v2) 219
-             220:  214(fvec4) Load 217(f16v1)
-             221:  214(fvec4) ExtInst 1(GLSL.std.450) 12(Degrees) 220
+             220:214(f16vec4) Load 217(f16v1)
+             221:214(f16vec4) ExtInst 1(GLSL.std.450) 12(Degrees) 220
                               Store 216(f16v2) 221
-             222:  214(fvec4) Load 217(f16v1)
-             223:  214(fvec4) ExtInst 1(GLSL.std.450) 13(Sin) 222
+             222:214(f16vec4) Load 217(f16v1)
+             223:214(f16vec4) ExtInst 1(GLSL.std.450) 13(Sin) 222
                               Store 216(f16v2) 223
-             224:  214(fvec4) Load 217(f16v1)
-             225:  214(fvec4) ExtInst 1(GLSL.std.450) 14(Cos) 224
+             224:214(f16vec4) Load 217(f16v1)
+             225:214(f16vec4) ExtInst 1(GLSL.std.450) 14(Cos) 224
                               Store 216(f16v2) 225
-             226:  214(fvec4) Load 217(f16v1)
-             227:  214(fvec4) ExtInst 1(GLSL.std.450) 15(Tan) 226
+             226:214(f16vec4) Load 217(f16v1)
+             227:214(f16vec4) ExtInst 1(GLSL.std.450) 15(Tan) 226
                               Store 216(f16v2) 227
-             228:  214(fvec4) Load 217(f16v1)
-             229:  214(fvec4) ExtInst 1(GLSL.std.450) 16(Asin) 228
+             228:214(f16vec4) Load 217(f16v1)
+             229:214(f16vec4) ExtInst 1(GLSL.std.450) 16(Asin) 228
                               Store 216(f16v2) 229
-             230:  214(fvec4) Load 217(f16v1)
-             231:  214(fvec4) ExtInst 1(GLSL.std.450) 17(Acos) 230
+             230:214(f16vec4) Load 217(f16v1)
+             231:214(f16vec4) ExtInst 1(GLSL.std.450) 17(Acos) 230
                               Store 216(f16v2) 231
-             232:  214(fvec4) Load 217(f16v1)
-             233:  214(fvec4) Load 216(f16v2)
-             234:  214(fvec4) ExtInst 1(GLSL.std.450) 25(Atan2) 232 233
+             232:214(f16vec4) Load 217(f16v1)
+             233:214(f16vec4) Load 216(f16v2)
+             234:214(f16vec4) ExtInst 1(GLSL.std.450) 25(Atan2) 232 233
                               Store 216(f16v2) 234
-             235:  214(fvec4) Load 217(f16v1)
-             236:  214(fvec4) ExtInst 1(GLSL.std.450) 18(Atan) 235
+             235:214(f16vec4) Load 217(f16v1)
+             236:214(f16vec4) ExtInst 1(GLSL.std.450) 18(Atan) 235
                               Store 216(f16v2) 236
-             237:  214(fvec4) Load 217(f16v1)
-             238:  214(fvec4) ExtInst 1(GLSL.std.450) 19(Sinh) 237
+             237:214(f16vec4) Load 217(f16v1)
+             238:214(f16vec4) ExtInst 1(GLSL.std.450) 19(Sinh) 237
                               Store 216(f16v2) 238
-             239:  214(fvec4) Load 217(f16v1)
-             240:  214(fvec4) ExtInst 1(GLSL.std.450) 20(Cosh) 239
+             239:214(f16vec4) Load 217(f16v1)
+             240:214(f16vec4) ExtInst 1(GLSL.std.450) 20(Cosh) 239
                               Store 216(f16v2) 240
-             241:  214(fvec4) Load 217(f16v1)
-             242:  214(fvec4) ExtInst 1(GLSL.std.450) 21(Tanh) 241
+             241:214(f16vec4) Load 217(f16v1)
+             242:214(f16vec4) ExtInst 1(GLSL.std.450) 21(Tanh) 241
                               Store 216(f16v2) 242
-             243:  214(fvec4) Load 217(f16v1)
-             244:  214(fvec4) ExtInst 1(GLSL.std.450) 22(Asinh) 243
+             243:214(f16vec4) Load 217(f16v1)
+             244:214(f16vec4) ExtInst 1(GLSL.std.450) 22(Asinh) 243
                               Store 216(f16v2) 244
-             245:  214(fvec4) Load 217(f16v1)
-             246:  214(fvec4) ExtInst 1(GLSL.std.450) 23(Acosh) 245
+             245:214(f16vec4) Load 217(f16v1)
+             246:214(f16vec4) ExtInst 1(GLSL.std.450) 23(Acosh) 245
                               Store 216(f16v2) 246
-             247:  214(fvec4) Load 217(f16v1)
-             248:  214(fvec4) ExtInst 1(GLSL.std.450) 24(Atanh) 247
+             247:214(f16vec4) Load 217(f16v1)
+             248:214(f16vec4) ExtInst 1(GLSL.std.450) 24(Atanh) 247
                               Store 216(f16v2) 248
                               Return
                               FunctionEnd
@@ -497,27 +503,27 @@
               15:             Label
       249(f16v2):     30(ptr) Variable Function
       250(f16v1):     30(ptr) Variable Function
-             251:   29(fvec2) Load 250(f16v1)
-             252:   29(fvec2) Load 249(f16v2)
-             253:   29(fvec2) ExtInst 1(GLSL.std.450) 26(Pow) 251 252
+             251: 29(f16vec2) Load 250(f16v1)
+             252: 29(f16vec2) Load 249(f16v2)
+             253: 29(f16vec2) ExtInst 1(GLSL.std.450) 26(Pow) 251 252
                               Store 249(f16v2) 253
-             254:   29(fvec2) Load 250(f16v1)
-             255:   29(fvec2) ExtInst 1(GLSL.std.450) 27(Exp) 254
+             254: 29(f16vec2) Load 250(f16v1)
+             255: 29(f16vec2) ExtInst 1(GLSL.std.450) 27(Exp) 254
                               Store 249(f16v2) 255
-             256:   29(fvec2) Load 250(f16v1)
-             257:   29(fvec2) ExtInst 1(GLSL.std.450) 28(Log) 256
+             256: 29(f16vec2) Load 250(f16v1)
+             257: 29(f16vec2) ExtInst 1(GLSL.std.450) 28(Log) 256
                               Store 249(f16v2) 257
-             258:   29(fvec2) Load 250(f16v1)
-             259:   29(fvec2) ExtInst 1(GLSL.std.450) 29(Exp2) 258
+             258: 29(f16vec2) Load 250(f16v1)
+             259: 29(f16vec2) ExtInst 1(GLSL.std.450) 29(Exp2) 258
                               Store 249(f16v2) 259
-             260:   29(fvec2) Load 250(f16v1)
-             261:   29(fvec2) ExtInst 1(GLSL.std.450) 30(Log2) 260
+             260: 29(f16vec2) Load 250(f16v1)
+             261: 29(f16vec2) ExtInst 1(GLSL.std.450) 30(Log2) 260
                               Store 249(f16v2) 261
-             262:   29(fvec2) Load 250(f16v1)
-             263:   29(fvec2) ExtInst 1(GLSL.std.450) 31(Sqrt) 262
+             262: 29(f16vec2) Load 250(f16v1)
+             263: 29(f16vec2) ExtInst 1(GLSL.std.450) 31(Sqrt) 262
                               Store 249(f16v2) 263
-             264:   29(fvec2) Load 250(f16v1)
-             265:   29(fvec2) ExtInst 1(GLSL.std.450) 32(InverseSqrt) 264
+             264: 29(f16vec2) Load 250(f16v1)
+             265: 29(f16vec2) ExtInst 1(GLSL.std.450) 32(InverseSqrt) 264
                               Store 249(f16v2) 265
                               Return
                               FunctionEnd
@@ -530,132 +536,132 @@
          332(bv):    155(ptr) Variable Function
           353(b):    110(ptr) Variable Function
          363(iv):    185(ptr) Variable Function
-             268:  151(fvec3) Load 267(f16v1)
-             269:  151(fvec3) ExtInst 1(GLSL.std.450) 4(FAbs) 268
+             268:151(f16vec3) Load 267(f16v1)
+             269:151(f16vec3) ExtInst 1(GLSL.std.450) 4(FAbs) 268
                               Store 266(f16v2) 269
-             270:  151(fvec3) Load 267(f16v1)
-             271:  151(fvec3) ExtInst 1(GLSL.std.450) 6(FSign) 270
+             270:151(f16vec3) Load 267(f16v1)
+             271:151(f16vec3) ExtInst 1(GLSL.std.450) 6(FSign) 270
                               Store 266(f16v2) 271
-             272:  151(fvec3) Load 267(f16v1)
-             273:  151(fvec3) ExtInst 1(GLSL.std.450) 8(Floor) 272
+             272:151(f16vec3) Load 267(f16v1)
+             273:151(f16vec3) ExtInst 1(GLSL.std.450) 8(Floor) 272
                               Store 266(f16v2) 273
-             274:  151(fvec3) Load 267(f16v1)
-             275:  151(fvec3) ExtInst 1(GLSL.std.450) 3(Trunc) 274
+             274:151(f16vec3) Load 267(f16v1)
+             275:151(f16vec3) ExtInst 1(GLSL.std.450) 3(Trunc) 274
                               Store 266(f16v2) 275
-             276:  151(fvec3) Load 267(f16v1)
-             277:  151(fvec3) ExtInst 1(GLSL.std.450) 1(Round) 276
+             276:151(f16vec3) Load 267(f16v1)
+             277:151(f16vec3) ExtInst 1(GLSL.std.450) 1(Round) 276
                               Store 266(f16v2) 277
-             278:  151(fvec3) Load 267(f16v1)
-             279:  151(fvec3) ExtInst 1(GLSL.std.450) 2(RoundEven) 278
+             278:151(f16vec3) Load 267(f16v1)
+             279:151(f16vec3) ExtInst 1(GLSL.std.450) 2(RoundEven) 278
                               Store 266(f16v2) 279
-             280:  151(fvec3) Load 267(f16v1)
-             281:  151(fvec3) ExtInst 1(GLSL.std.450) 9(Ceil) 280
+             280:151(f16vec3) Load 267(f16v1)
+             281:151(f16vec3) ExtInst 1(GLSL.std.450) 9(Ceil) 280
                               Store 266(f16v2) 281
-             282:  151(fvec3) Load 267(f16v1)
-             283:  151(fvec3) ExtInst 1(GLSL.std.450) 10(Fract) 282
+             282:151(f16vec3) Load 267(f16v1)
+             283:151(f16vec3) ExtInst 1(GLSL.std.450) 10(Fract) 282
                               Store 266(f16v2) 283
-             284:  151(fvec3) Load 267(f16v1)
-             285:  151(fvec3) Load 266(f16v2)
-             286:  151(fvec3) FMod 284 285
+             284:151(f16vec3) Load 267(f16v1)
+             285:151(f16vec3) Load 266(f16v2)
+             286:151(f16vec3) FMod 284 285
                               Store 266(f16v2) 286
-             287:  151(fvec3) Load 267(f16v1)
-             289:   28(float) Load 288(f16)
-             290:  151(fvec3) CompositeConstruct 289 289 289
-             291:  151(fvec3) FMod 287 290
+             287:151(f16vec3) Load 267(f16v1)
+             289:28(float16_t) Load 288(f16)
+             290:151(f16vec3) CompositeConstruct 289 289 289
+             291:151(f16vec3) FMod 287 290
                               Store 266(f16v2) 291
-             293:  151(fvec3) Load 267(f16v1)
-             294:  151(fvec3) ExtInst 1(GLSL.std.450) 35(Modf) 293 266(f16v2)
+             293:151(f16vec3) Load 267(f16v1)
+             294:151(f16vec3) ExtInst 1(GLSL.std.450) 35(Modf) 293 266(f16v2)
                               Store 292(f16v3) 294
-             295:  151(fvec3) Load 267(f16v1)
-             296:  151(fvec3) Load 266(f16v2)
-             297:  151(fvec3) ExtInst 1(GLSL.std.450) 37(FMin) 295 296
+             295:151(f16vec3) Load 267(f16v1)
+             296:151(f16vec3) Load 266(f16v2)
+             297:151(f16vec3) ExtInst 1(GLSL.std.450) 37(FMin) 295 296
                               Store 292(f16v3) 297
-             298:  151(fvec3) Load 267(f16v1)
-             299:   28(float) Load 288(f16)
-             300:  151(fvec3) CompositeConstruct 299 299 299
-             301:  151(fvec3) ExtInst 1(GLSL.std.450) 37(FMin) 298 300
+             298:151(f16vec3) Load 267(f16v1)
+             299:28(float16_t) Load 288(f16)
+             300:151(f16vec3) CompositeConstruct 299 299 299
+             301:151(f16vec3) ExtInst 1(GLSL.std.450) 37(FMin) 298 300
                               Store 292(f16v3) 301
-             302:  151(fvec3) Load 267(f16v1)
-             303:  151(fvec3) Load 266(f16v2)
-             304:  151(fvec3) ExtInst 1(GLSL.std.450) 40(FMax) 302 303
+             302:151(f16vec3) Load 267(f16v1)
+             303:151(f16vec3) Load 266(f16v2)
+             304:151(f16vec3) ExtInst 1(GLSL.std.450) 40(FMax) 302 303
                               Store 292(f16v3) 304
-             305:  151(fvec3) Load 267(f16v1)
-             306:   28(float) Load 288(f16)
-             307:  151(fvec3) CompositeConstruct 306 306 306
-             308:  151(fvec3) ExtInst 1(GLSL.std.450) 40(FMax) 305 307
+             305:151(f16vec3) Load 267(f16v1)
+             306:28(float16_t) Load 288(f16)
+             307:151(f16vec3) CompositeConstruct 306 306 306
+             308:151(f16vec3) ExtInst 1(GLSL.std.450) 40(FMax) 305 307
                               Store 292(f16v3) 308
-             309:  151(fvec3) Load 267(f16v1)
-             310:   28(float) Load 288(f16)
+             309:151(f16vec3) Load 267(f16v1)
+             310:28(float16_t) Load 288(f16)
              311:     35(ptr) AccessChain 266(f16v2) 34
-             312:   28(float) Load 311
-             313:  151(fvec3) CompositeConstruct 310 310 310
-             314:  151(fvec3) CompositeConstruct 312 312 312
-             315:  151(fvec3) ExtInst 1(GLSL.std.450) 43(FClamp) 309 313 314
+             312:28(float16_t) Load 311
+             313:151(f16vec3) CompositeConstruct 310 310 310
+             314:151(f16vec3) CompositeConstruct 312 312 312
+             315:151(f16vec3) ExtInst 1(GLSL.std.450) 43(FClamp) 309 313 314
                               Store 292(f16v3) 315
-             316:  151(fvec3) Load 267(f16v1)
-             317:  151(fvec3) Load 266(f16v2)
-             318:   28(float) Load 288(f16)
-             319:  151(fvec3) CompositeConstruct 318 318 318
-             320:  151(fvec3) ExtInst 1(GLSL.std.450) 43(FClamp) 316 317 319
+             316:151(f16vec3) Load 267(f16v1)
+             317:151(f16vec3) Load 266(f16v2)
+             318:28(float16_t) Load 288(f16)
+             319:151(f16vec3) CompositeConstruct 318 318 318
+             320:151(f16vec3) ExtInst 1(GLSL.std.450) 43(FClamp) 316 317 319
                               Store 292(f16v3) 320
-             321:  151(fvec3) Load 267(f16v1)
-             322:  151(fvec3) Load 266(f16v2)
-             323:   28(float) Load 288(f16)
-             324:  151(fvec3) CompositeConstruct 323 323 323
-             325:  151(fvec3) ExtInst 1(GLSL.std.450) 46(FMix) 321 322 324
+             321:151(f16vec3) Load 267(f16v1)
+             322:151(f16vec3) Load 266(f16v2)
+             323:28(float16_t) Load 288(f16)
+             324:151(f16vec3) CompositeConstruct 323 323 323
+             325:151(f16vec3) ExtInst 1(GLSL.std.450) 46(FMix) 321 322 324
                               Store 292(f16v3) 325
-             326:  151(fvec3) Load 267(f16v1)
-             327:  151(fvec3) Load 266(f16v2)
-             328:  151(fvec3) Load 292(f16v3)
-             329:  151(fvec3) ExtInst 1(GLSL.std.450) 46(FMix) 326 327 328
+             326:151(f16vec3) Load 267(f16v1)
+             327:151(f16vec3) Load 266(f16v2)
+             328:151(f16vec3) Load 292(f16v3)
+             329:151(f16vec3) ExtInst 1(GLSL.std.450) 46(FMix) 326 327 328
                               Store 292(f16v3) 329
-             330:  151(fvec3) Load 267(f16v1)
-             331:  151(fvec3) Load 266(f16v2)
+             330:151(f16vec3) Load 267(f16v1)
+             331:151(f16vec3) Load 266(f16v2)
              333:  154(bvec3) Load 332(bv)
-             334:  151(fvec3) Select 333 331 330
+             334:151(f16vec3) Select 333 331 330
                               Store 292(f16v3) 334
-             335:  151(fvec3) Load 267(f16v1)
-             336:  151(fvec3) Load 266(f16v2)
-             337:  151(fvec3) ExtInst 1(GLSL.std.450) 48(Step) 335 336
+             335:151(f16vec3) Load 267(f16v1)
+             336:151(f16vec3) Load 266(f16v2)
+             337:151(f16vec3) ExtInst 1(GLSL.std.450) 48(Step) 335 336
                               Store 292(f16v3) 337
-             338:   28(float) Load 288(f16)
-             339:  151(fvec3) Load 292(f16v3)
-             340:  151(fvec3) CompositeConstruct 338 338 338
-             341:  151(fvec3) ExtInst 1(GLSL.std.450) 48(Step) 340 339
+             338:28(float16_t) Load 288(f16)
+             339:151(f16vec3) Load 292(f16v3)
+             340:151(f16vec3) CompositeConstruct 338 338 338
+             341:151(f16vec3) ExtInst 1(GLSL.std.450) 48(Step) 340 339
                               Store 292(f16v3) 341
-             342:  151(fvec3) Load 267(f16v1)
-             343:  151(fvec3) Load 266(f16v2)
-             344:  151(fvec3) Load 292(f16v3)
-             345:  151(fvec3) ExtInst 1(GLSL.std.450) 49(SmoothStep) 342 343 344
+             342:151(f16vec3) Load 267(f16v1)
+             343:151(f16vec3) Load 266(f16v2)
+             344:151(f16vec3) Load 292(f16v3)
+             345:151(f16vec3) ExtInst 1(GLSL.std.450) 49(SmoothStep) 342 343 344
                               Store 292(f16v3) 345
-             346:   28(float) Load 288(f16)
+             346:28(float16_t) Load 288(f16)
              347:     35(ptr) AccessChain 267(f16v1) 34
-             348:   28(float) Load 347
-             349:  151(fvec3) Load 266(f16v2)
-             350:  151(fvec3) CompositeConstruct 346 346 346
-             351:  151(fvec3) CompositeConstruct 348 348 348
-             352:  151(fvec3) ExtInst 1(GLSL.std.450) 49(SmoothStep) 350 351 349
+             348:28(float16_t) Load 347
+             349:151(f16vec3) Load 266(f16v2)
+             350:151(f16vec3) CompositeConstruct 346 346 346
+             351:151(f16vec3) CompositeConstruct 348 348 348
+             352:151(f16vec3) ExtInst 1(GLSL.std.450) 49(SmoothStep) 350 351 349
                               Store 292(f16v3) 352
-             354:   28(float) Load 288(f16)
+             354:28(float16_t) Load 288(f16)
              355:   109(bool) IsNan 354
                               Store 353(b) 355
-             356:  151(fvec3) Load 267(f16v1)
+             356:151(f16vec3) Load 267(f16v1)
              357:  154(bvec3) IsInf 356
                               Store 332(bv) 357
-             358:  151(fvec3) Load 267(f16v1)
-             359:  151(fvec3) Load 266(f16v2)
-             360:  151(fvec3) Load 292(f16v3)
-             361:  151(fvec3) ExtInst 1(GLSL.std.450) 50(Fma) 358 359 360
+             358:151(f16vec3) Load 267(f16v1)
+             359:151(f16vec3) Load 266(f16v2)
+             360:151(f16vec3) Load 292(f16v3)
+             361:151(f16vec3) ExtInst 1(GLSL.std.450) 50(Fma) 358 359 360
                               Store 292(f16v3) 361
-             362:  151(fvec3) Load 267(f16v1)
+             362:151(f16vec3) Load 267(f16v1)
              365:364(ResType) ExtInst 1(GLSL.std.450) 52(FrexpStruct) 362
              366:  184(ivec3) CompositeExtract 365 1
                               Store 363(iv) 366
-             367:  151(fvec3) CompositeExtract 365 0
+             367:151(f16vec3) CompositeExtract 365 0
                               Store 266(f16v2) 367
-             368:  151(fvec3) Load 267(f16v1)
+             368:151(f16vec3) Load 267(f16v1)
              369:  184(ivec3) Load 363(iv)
-             370:  151(fvec3) ExtInst 1(GLSL.std.450) 53(Ldexp) 368 369
+             370:151(f16vec3) ExtInst 1(GLSL.std.450) 53(Ldexp) 368 369
                               Store 266(f16v2) 370
                               Return
                               FunctionEnd
@@ -663,11 +669,11 @@
               19:             Label
           372(u):    371(ptr) Variable Function
        373(f16v):     30(ptr) Variable Function
-             374:   29(fvec2) Load 373(f16v)
+             374: 29(f16vec2) Load 373(f16v)
              375:     33(int) Bitcast 374
                               Store 372(u) 375
              376:     33(int) Load 372(u)
-             377:   29(fvec2) Bitcast 376
+             377: 29(f16vec2) Bitcast 376
                               Store 373(f16v) 377
                               Return
                               FunctionEnd
@@ -677,37 +683,37 @@
       379(f16v1):    152(ptr) Variable Function
       383(f16v2):    152(ptr) Variable Function
       389(f16v3):    152(ptr) Variable Function
-             380:  151(fvec3) Load 379(f16v1)
-             381:   28(float) ExtInst 1(GLSL.std.450) 66(Length) 380
+             380:151(f16vec3) Load 379(f16v1)
+             381:28(float16_t) ExtInst 1(GLSL.std.450) 66(Length) 380
                               Store 378(f16) 381
-             382:  151(fvec3) Load 379(f16v1)
-             384:  151(fvec3) Load 383(f16v2)
-             385:   28(float) ExtInst 1(GLSL.std.450) 67(Distance) 382 384
+             382:151(f16vec3) Load 379(f16v1)
+             384:151(f16vec3) Load 383(f16v2)
+             385:28(float16_t) ExtInst 1(GLSL.std.450) 67(Distance) 382 384
                               Store 378(f16) 385
-             386:  151(fvec3) Load 379(f16v1)
-             387:  151(fvec3) Load 383(f16v2)
-             388:   28(float) Dot 386 387
+             386:151(f16vec3) Load 379(f16v1)
+             387:151(f16vec3) Load 383(f16v2)
+             388:28(float16_t) Dot 386 387
                               Store 378(f16) 388
-             390:  151(fvec3) Load 379(f16v1)
-             391:  151(fvec3) Load 383(f16v2)
-             392:  151(fvec3) ExtInst 1(GLSL.std.450) 68(Cross) 390 391
+             390:151(f16vec3) Load 379(f16v1)
+             391:151(f16vec3) Load 383(f16v2)
+             392:151(f16vec3) ExtInst 1(GLSL.std.450) 68(Cross) 390 391
                               Store 389(f16v3) 392
-             393:  151(fvec3) Load 379(f16v1)
-             394:  151(fvec3) ExtInst 1(GLSL.std.450) 69(Normalize) 393
+             393:151(f16vec3) Load 379(f16v1)
+             394:151(f16vec3) ExtInst 1(GLSL.std.450) 69(Normalize) 393
                               Store 383(f16v2) 394
-             395:  151(fvec3) Load 379(f16v1)
-             396:  151(fvec3) Load 383(f16v2)
-             397:  151(fvec3) Load 389(f16v3)
-             398:  151(fvec3) ExtInst 1(GLSL.std.450) 70(FaceForward) 395 396 397
+             395:151(f16vec3) Load 379(f16v1)
+             396:151(f16vec3) Load 383(f16v2)
+             397:151(f16vec3) Load 389(f16v3)
+             398:151(f16vec3) ExtInst 1(GLSL.std.450) 70(FaceForward) 395 396 397
                               Store 389(f16v3) 398
-             399:  151(fvec3) Load 379(f16v1)
-             400:  151(fvec3) Load 383(f16v2)
-             401:  151(fvec3) ExtInst 1(GLSL.std.450) 71(Reflect) 399 400
+             399:151(f16vec3) Load 379(f16v1)
+             400:151(f16vec3) Load 383(f16v2)
+             401:151(f16vec3) ExtInst 1(GLSL.std.450) 71(Reflect) 399 400
                               Store 389(f16v3) 401
-             402:  151(fvec3) Load 379(f16v1)
-             403:  151(fvec3) Load 383(f16v2)
-             404:   28(float) Load 378(f16)
-             405:  151(fvec3) ExtInst 1(GLSL.std.450) 72(Refract) 402 403 404
+             402:151(f16vec3) Load 379(f16v1)
+             403:151(f16vec3) Load 383(f16v2)
+             404:28(float16_t) Load 378(f16)
+             405:151(f16vec3) ExtInst 1(GLSL.std.450) 72(Refract) 402 403 404
                               Store 389(f16v3) 405
                               Return
                               FunctionEnd
@@ -725,23 +731,23 @@
       439(f16m7):    437(ptr) Variable Function
              410:         406 Load 409(f16m1)
              412:         406 Load 411(f16m2)
-             413:  151(fvec3) CompositeExtract 410 0
-             414:  151(fvec3) CompositeExtract 412 0
-             415:  151(fvec3) FMul 413 414
-             416:  151(fvec3) CompositeExtract 410 1
-             417:  151(fvec3) CompositeExtract 412 1
-             418:  151(fvec3) FMul 416 417
+             413:151(f16vec3) CompositeExtract 410 0
+             414:151(f16vec3) CompositeExtract 412 0
+             415:151(f16vec3) FMul 413 414
+             416:151(f16vec3) CompositeExtract 410 1
+             417:151(f16vec3) CompositeExtract 412 1
+             418:151(f16vec3) FMul 416 417
              419:         406 CompositeConstruct 415 418
                               Store 408(f16m3) 419
-             421:  151(fvec3) Load 420(f16v1)
-             423:   29(fvec2) Load 422(f16v2)
+             421:151(f16vec3) Load 420(f16v1)
+             423: 29(f16vec2) Load 422(f16v2)
              424:         406 OuterProduct 421 423
                               Store 409(f16m1) 424
              428:         406 Load 409(f16m1)
              429:         425 Transpose 428
                               Store 427(f16m4) 429
              434:         431 Load 433(f16m5)
-             435:   28(float) ExtInst 1(GLSL.std.450) 33(Determinant) 434
+             435:28(float16_t) ExtInst 1(GLSL.std.450) 33(Determinant) 434
                               Store 430(f16) 435
              440:         436 Load 439(f16m7)
              441:         436 ExtInst 1(GLSL.std.450) 34(MatrixInverse) 440
@@ -753,28 +759,28 @@
          442(bv):    155(ptr) Variable Function
       443(f16v1):    152(ptr) Variable Function
       445(f16v2):    152(ptr) Variable Function
-             444:  151(fvec3) Load 443(f16v1)
-             446:  151(fvec3) Load 445(f16v2)
+             444:151(f16vec3) Load 443(f16v1)
+             446:151(f16vec3) Load 445(f16v2)
              447:  154(bvec3) FOrdLessThan 444 446
                               Store 442(bv) 447
-             448:  151(fvec3) Load 443(f16v1)
-             449:  151(fvec3) Load 445(f16v2)
+             448:151(f16vec3) Load 443(f16v1)
+             449:151(f16vec3) Load 445(f16v2)
              450:  154(bvec3) FOrdLessThanEqual 448 449
                               Store 442(bv) 450
-             451:  151(fvec3) Load 443(f16v1)
-             452:  151(fvec3) Load 445(f16v2)
+             451:151(f16vec3) Load 443(f16v1)
+             452:151(f16vec3) Load 445(f16v2)
              453:  154(bvec3) FOrdGreaterThan 451 452
                               Store 442(bv) 453
-             454:  151(fvec3) Load 443(f16v1)
-             455:  151(fvec3) Load 445(f16v2)
+             454:151(f16vec3) Load 443(f16v1)
+             455:151(f16vec3) Load 445(f16v2)
              456:  154(bvec3) FOrdGreaterThanEqual 454 455
                               Store 442(bv) 456
-             457:  151(fvec3) Load 443(f16v1)
-             458:  151(fvec3) Load 445(f16v2)
+             457:151(f16vec3) Load 443(f16v1)
+             458:151(f16vec3) Load 445(f16v2)
              459:  154(bvec3) FOrdEqual 457 458
                               Store 442(bv) 459
-             460:  151(fvec3) Load 443(f16v1)
-             461:  151(fvec3) Load 445(f16v2)
+             460:151(f16vec3) Load 443(f16v1)
+             461:151(f16vec3) Load 445(f16v2)
              462:  154(bvec3) FOrdNotEqual 460 461
                               Store 442(bv) 462
                               Return
@@ -783,57 +789,57 @@
               27:             Label
        463(f16v):    152(ptr) Variable Function
              467:    466(ptr) AccessChain 465(if16v) 34
-             468:   28(float) Load 467
-             469:   28(float) DPdx 468
+             468:28(float16_t) Load 467
+             469:28(float16_t) DPdx 468
              470:     35(ptr) AccessChain 463(f16v) 34
                               Store 470 469
              471:    466(ptr) AccessChain 465(if16v) 90
-             472:   28(float) Load 471
-             473:   28(float) DPdy 472
+             472:28(float16_t) Load 471
+             473:28(float16_t) DPdy 472
              474:     35(ptr) AccessChain 463(f16v) 90
                               Store 474 473
-             475:  151(fvec3) Load 465(if16v)
-             476:   29(fvec2) VectorShuffle 475 475 0 1
-             477:   29(fvec2) DPdxFine 476
-             478:  151(fvec3) Load 463(f16v)
-             479:  151(fvec3) VectorShuffle 478 477 3 4 2
+             475:151(f16vec3) Load 465(if16v)
+             476: 29(f16vec2) VectorShuffle 475 475 0 1
+             477: 29(f16vec2) DPdxFine 476
+             478:151(f16vec3) Load 463(f16v)
+             479:151(f16vec3) VectorShuffle 478 477 3 4 2
                               Store 463(f16v) 479
-             480:  151(fvec3) Load 465(if16v)
-             481:   29(fvec2) VectorShuffle 480 480 0 1
-             482:   29(fvec2) DPdyFine 481
-             483:  151(fvec3) Load 463(f16v)
-             484:  151(fvec3) VectorShuffle 483 482 3 4 2
+             480:151(f16vec3) Load 465(if16v)
+             481: 29(f16vec2) VectorShuffle 480 480 0 1
+             482: 29(f16vec2) DPdyFine 481
+             483:151(f16vec3) Load 463(f16v)
+             484:151(f16vec3) VectorShuffle 483 482 3 4 2
                               Store 463(f16v) 484
-             485:  151(fvec3) Load 465(if16v)
-             486:  151(fvec3) DPdxCoarse 485
+             485:151(f16vec3) Load 465(if16v)
+             486:151(f16vec3) DPdxCoarse 485
                               Store 463(f16v) 486
-             487:  151(fvec3) Load 465(if16v)
-             488:  151(fvec3) DPdxCoarse 487
+             487:151(f16vec3) Load 465(if16v)
+             488:151(f16vec3) DPdxCoarse 487
                               Store 463(f16v) 488
              489:    466(ptr) AccessChain 465(if16v) 34
-             490:   28(float) Load 489
-             491:   28(float) Fwidth 490
+             490:28(float16_t) Load 489
+             491:28(float16_t) Fwidth 490
              492:     35(ptr) AccessChain 463(f16v) 34
                               Store 492 491
-             493:  151(fvec3) Load 465(if16v)
-             494:   29(fvec2) VectorShuffle 493 493 0 1
-             495:   29(fvec2) FwidthFine 494
-             496:  151(fvec3) Load 463(f16v)
-             497:  151(fvec3) VectorShuffle 496 495 3 4 2
+             493:151(f16vec3) Load 465(if16v)
+             494: 29(f16vec2) VectorShuffle 493 493 0 1
+             495: 29(f16vec2) FwidthFine 494
+             496:151(f16vec3) Load 463(f16v)
+             497:151(f16vec3) VectorShuffle 496 495 3 4 2
                               Store 463(f16v) 497
-             498:  151(fvec3) Load 465(if16v)
-             499:  151(fvec3) FwidthCoarse 498
+             498:151(f16vec3) Load 465(if16v)
+             499:151(f16vec3) FwidthCoarse 498
                               Store 463(f16v) 499
              500:    466(ptr) AccessChain 465(if16v) 34
-             501:   28(float) ExtInst 1(GLSL.std.450) 76(InterpolateAtCentroid) 500
+             501:28(float16_t) ExtInst 1(GLSL.std.450) 76(InterpolateAtCentroid) 500
              502:     35(ptr) AccessChain 463(f16v) 34
                               Store 502 501
-             504:  151(fvec3) ExtInst 1(GLSL.std.450) 77(InterpolateAtSample) 465(if16v) 503
-             505:   29(fvec2) VectorShuffle 504 504 0 1
-             506:  151(fvec3) Load 463(f16v)
-             507:  151(fvec3) VectorShuffle 506 505 3 4 2
+             504:151(f16vec3) ExtInst 1(GLSL.std.450) 77(InterpolateAtSample) 465(if16v) 503
+             505: 29(f16vec2) VectorShuffle 504 504 0 1
+             506:151(f16vec3) Load 463(f16v)
+             507:151(f16vec3) VectorShuffle 506 505 3 4 2
                               Store 463(f16v) 507
-             510:  151(fvec3) ExtInst 1(GLSL.std.450) 78(InterpolateAtOffset) 465(if16v) 509
+             510:151(f16vec3) ExtInst 1(GLSL.std.450) 78(InterpolateAtOffset) 465(if16v) 509
                               Store 463(f16v) 510
                               Return
                               FunctionEnd
diff --git a/Test/baseResults/spv.float16Fetch.frag.out b/Test/baseResults/spv.float16Fetch.frag.out
new file mode 100644
index 0000000..7632737
--- /dev/null
+++ b/Test/baseResults/spv.float16Fetch.frag.out
@@ -0,0 +1,7074 @@
+spv.float16Fetch.frag
+error: SPIRV-Tools Validation Errors
+error: Capability Float16 is not allowed by Vulkan 1.0 specification (or requires extension)
+  OpCapability Float16
+
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 5923
+
+                              Capability Shader
+                              Capability Float16
+                              Capability ImageGatherExtended
+                              Capability StorageImageMultisample
+                              Capability ImageCubeArray
+                              Capability ImageRect
+                              Capability SampledRect
+                              Capability InputAttachment
+                              Capability SparseResidency
+                              Capability MinLod
+                              Capability Sampled1D
+                              Capability Image1D
+                              Capability SampledCubeArray
+                              Capability SampledBuffer
+                              Capability ImageBuffer
+                              Capability ImageMSArray
+                              Capability ImageQuery
+                              Capability StorageInputOutput16
+                              Capability Float16ImageAMD
+                              Capability ImageGatherBiasLodAMD
+                              Extension  "SPV_AMD_gpu_shader_half_float_fetch"
+                              Extension  "SPV_AMD_texture_gather_bias_lod"
+                              Extension  "SPV_KHR_16bit_storage"
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 128 135 137 148 156 169 177 215 251 309 565 572 1393 1401 1409 1417 1425 1433 4257 4264 5913 5922
+                              ExecutionMode 4 OriginUpperLeft
+                              Source GLSL 450
+                              SourceExtension  "GL_AMD_gpu_shader_half_float"
+                              SourceExtension  "GL_AMD_gpu_shader_half_float_fetch"
+                              SourceExtension  "GL_AMD_texture_gather_bias_lod"
+                              SourceExtension  "GL_ARB_sparse_texture2"
+                              SourceExtension  "GL_ARB_sparse_texture_clamp"
+                              Name 4  "main"
+                              Name 9  "testTexture("
+                              Name 11  "testTextureProj("
+                              Name 13  "testTextureLod("
+                              Name 15  "testTextureOffset("
+                              Name 17  "testTextureProjOffset("
+                              Name 19  "testTextureLodOffset("
+                              Name 21  "testTextureProjLodOffset("
+                              Name 23  "testTexelFetch("
+                              Name 25  "testTexelFetchOffset("
+                              Name 27  "testTextureGrad("
+                              Name 29  "testTextureGradOffset("
+                              Name 31  "testTextureProjGrad("
+                              Name 33  "testTextureProjGradoffset("
+                              Name 35  "testTextureGather("
+                              Name 37  "testTextureGatherOffset("
+                              Name 39  "testTextureGatherOffsets("
+                              Name 41  "testTextureGatherLod("
+                              Name 43  "testTextureGatherLodOffset("
+                              Name 45  "testTextureGatherLodOffsets("
+                              Name 50  "testTextureSize("
+                              Name 55  "testTextureQueryLod("
+                              Name 58  "testTextureQueryLevels("
+                              Name 60  "testTextureSamples("
+                              Name 62  "testImageLoad("
+                              Name 67  "testImageStore(vf164;"
+                              Name 66  "data"
+                              Name 69  "testSparseTexture("
+                              Name 71  "testSparseTextureLod("
+                              Name 73  "testSparseTextureOffset("
+                              Name 75  "testSparseTextureLodOffset("
+                              Name 77  "testSparseTextureGrad("
+                              Name 79  "testSparseTextureGradOffset("
+                              Name 81  "testSparseTexelFetch("
+                              Name 83  "testSparseTexelFetchOffset("
+                              Name 85  "testSparseTextureGather("
+                              Name 87  "testSparseTextureGatherOffset("
+                              Name 89  "testSparseTextureGatherOffsets("
+                              Name 91  "testSparseTextureGatherLod("
+                              Name 93  "testSparseTextureGatherLodOffset("
+                              Name 95  "testSparseTextureGatherLodOffsets("
+                              Name 97  "testSparseImageLoad("
+                              Name 99  "testSparseTextureClamp("
+                              Name 101  "testTextureClamp("
+                              Name 103  "testSparseTextureOffsetClamp("
+                              Name 105  "testTextureOffsetClamp("
+                              Name 107  "testSparseTextureGradClamp("
+                              Name 109  "testTextureGradClamp("
+                              Name 111  "testSparseTextureGradOffsetClamp("
+                              Name 113  "testTextureGradOffsetClamp("
+                              Name 115  "testCombinedTextureSampler("
+                              Name 117  "testSubpassLoad("
+                              Name 119  "texel"
+                              Name 125  "s1D"
+                              Name 128  "c1"
+                              Name 135  "f16c1"
+                              Name 137  "f16bias"
+                              Name 145  "s2D"
+                              Name 148  "c2"
+                              Name 156  "f16c2"
+                              Name 165  "s3D"
+                              Name 169  "c3"
+                              Name 177  "f16c3"
+                              Name 186  "sCube"
+                              Name 201  "s1DShadow"
+                              Name 215  "compare"
+                              Name 226  "s2DShadow"
+                              Name 247  "sCubeShadow"
+                              Name 251  "c4"
+                              Name 271  "s1DArray"
+                              Name 286  "s2DArray"
+                              Name 301  "sCubeArray"
+                              Name 309  "f16c4"
+                              Name 318  "s1DArrayShadow"
+                              Name 339  "s2DArrayShadow"
+                              Name 359  "s2DRect"
+                              Name 373  "s2DRectShadow"
+                              Name 393  "sCubeArrayShadow"
+                              Name 413  "texel"
+                              Name 562  "texel"
+                              Name 565  "lod"
+                              Name 572  "f16lod"
+                              Name 706  "texel"
+                              Name 863  "texel"
+                              Name 1012  "texel"
+                              Name 1130  "texel"
+                              Name 1244  "texel"
+                              Name 1300  "sBuffer"
+                              Name 1311  "s2DMS"
+                              Name 1322  "s2DMSArray"
+                              Name 1334  "texel"
+                              Name 1390  "texel"
+                              Name 1393  "dPdxy1"
+                              Name 1401  "f16dPdxy1"
+                              Name 1409  "dPdxy2"
+                              Name 1417  "f16dPdxy2"
+                              Name 1425  "dPdxy3"
+                              Name 1433  "f16dPdxy3"
+                              Name 1632  "texel"
+                              Name 1820  "texel"
+                              Name 2002  "texel"
+                              Name 2184  "texel"
+                              Name 2303  "texel"
+                              Name 2375  "texel"
+                              Name 2450  "texel"
+                              Name 2502  "texel"
+                              Name 2530  "texel"
+                              Name 2559  "size"
+                              Name 2733  "lod"
+                              Name 2869  "levels"
+                              Name 2938  "samples"
+                              Name 2952  "texel"
+                              Name 2955  "i1D"
+                              Name 2964  "i2D"
+                              Name 2973  "i3D"
+                              Name 2982  "i2DRect"
+                              Name 2991  "iCube"
+                              Name 3000  "iBuffer"
+                              Name 3009  "i1DArray"
+                              Name 3018  "i2DArray"
+                              Name 3027  "iCubeArray"
+                              Name 3036  "i2DMS"
+                              Name 3045  "i2DMSArray"
+                              Name 3099  "texel"
+                              Name 3102  "ResType"
+                              Name 3138  "ResType"
+                              Name 3242  "texel"
+                              Name 3322  "texel"
+                              Name 3412  "texel"
+                              Name 3468  "texel"
+                              Name 3628  "texel"
+                              Name 3742  "texel"
+                              Name 3794  "texel"
+                              Name 3832  "texel"
+                              Name 3950  "texel"
+                              Name 4022  "texel"
+                              Name 4094  "texel"
+                              Name 4146  "texel"
+                              Name 4174  "texel"
+                              Name 4202  "texel"
+                              Name 4254  "texel"
+                              Name 4257  "lodClamp"
+                              Name 4264  "f16lodClamp"
+                              Name 4391  "texel"
+                              Name 4598  "texel"
+                              Name 4674  "texel"
+                              Name 4818  "texel"
+                              Name 4962  "texel"
+                              Name 5188  "texel"
+                              Name 5280  "texel"
+                              Name 5452  "texel"
+                              Name 5454  "t1D"
+                              Name 5458  "s"
+                              Name 5474  "t2D"
+                              Name 5491  "t3D"
+                              Name 5508  "tCube"
+                              Name 5525  "sShadow"
+                              Name 5589  "t1DArray"
+                              Name 5606  "t2DArray"
+                              Name 5623  "tCubeArray"
+                              Name 5681  "t2DRect"
+                              Name 5741  "subpass"
+                              Name 5747  "subpassMS"
+                              Name 5753  "result"
+                              Name 5834  "param"
+                              Name 5913  "fragColor"
+                              Name 5917  "tBuffer"
+                              Name 5919  "t2DMS"
+                              Name 5921  "t2DMSArray"
+                              Name 5922  "bias"
+                              Decorate 125(s1D) DescriptorSet 0
+                              Decorate 125(s1D) Binding 0
+                              Decorate 128(c1) Location 0
+                              Decorate 135(f16c1) Location 11
+                              Decorate 137(f16bias) Location 16
+                              Decorate 145(s2D) DescriptorSet 0
+                              Decorate 145(s2D) Binding 1
+                              Decorate 148(c2) Location 1
+                              Decorate 156(f16c2) Location 12
+                              Decorate 165(s3D) DescriptorSet 0
+                              Decorate 165(s3D) Binding 2
+                              Decorate 169(c3) Location 2
+                              Decorate 177(f16c3) Location 13
+                              Decorate 186(sCube) DescriptorSet 0
+                              Decorate 186(sCube) Binding 4
+                              Decorate 201(s1DShadow) DescriptorSet 0
+                              Decorate 201(s1DShadow) Binding 11
+                              Decorate 215(compare) Location 4
+                              Decorate 226(s2DShadow) DescriptorSet 0
+                              Decorate 226(s2DShadow) Binding 12
+                              Decorate 247(sCubeShadow) DescriptorSet 0
+                              Decorate 247(sCubeShadow) Binding 14
+                              Decorate 251(c4) Location 3
+                              Decorate 271(s1DArray) DescriptorSet 0
+                              Decorate 271(s1DArray) Binding 7
+                              Decorate 286(s2DArray) DescriptorSet 0
+                              Decorate 286(s2DArray) Binding 8
+                              Decorate 301(sCubeArray) DescriptorSet 0
+                              Decorate 301(sCubeArray) Binding 9
+                              Decorate 309(f16c4) Location 14
+                              Decorate 318(s1DArrayShadow) DescriptorSet 0
+                              Decorate 318(s1DArrayShadow) Binding 15
+                              Decorate 339(s2DArrayShadow) DescriptorSet 0
+                              Decorate 339(s2DArrayShadow) Binding 16
+                              Decorate 359(s2DRect) DescriptorSet 0
+                              Decorate 359(s2DRect) Binding 3
+                              Decorate 373(s2DRectShadow) DescriptorSet 0
+                              Decorate 373(s2DRectShadow) Binding 13
+                              Decorate 393(sCubeArrayShadow) DescriptorSet 0
+                              Decorate 393(sCubeArrayShadow) Binding 17
+                              Decorate 565(lod) Location 5
+                              Decorate 572(f16lod) Location 15
+                              Decorate 1300(sBuffer) DescriptorSet 0
+                              Decorate 1300(sBuffer) Binding 5
+                              Decorate 1311(s2DMS) DescriptorSet 0
+                              Decorate 1311(s2DMS) Binding 6
+                              Decorate 1322(s2DMSArray) DescriptorSet 0
+                              Decorate 1322(s2DMSArray) Binding 10
+                              Decorate 1393(dPdxy1) Location 8
+                              Decorate 1401(f16dPdxy1) Location 18
+                              Decorate 1409(dPdxy2) Location 9
+                              Decorate 1417(f16dPdxy2) Location 19
+                              Decorate 1425(dPdxy3) Location 10
+                              Decorate 1433(f16dPdxy3) Location 20
+                              Decorate 2955(i1D) DescriptorSet 1
+                              Decorate 2955(i1D) Binding 0
+                              Decorate 2964(i2D) DescriptorSet 1
+                              Decorate 2964(i2D) Binding 1
+                              Decorate 2973(i3D) DescriptorSet 1
+                              Decorate 2973(i3D) Binding 2
+                              Decorate 2982(i2DRect) DescriptorSet 1
+                              Decorate 2982(i2DRect) Binding 3
+                              Decorate 2991(iCube) DescriptorSet 1
+                              Decorate 2991(iCube) Binding 4
+                              Decorate 3000(iBuffer) DescriptorSet 1
+                              Decorate 3000(iBuffer) Binding 8
+                              Decorate 3009(i1DArray) DescriptorSet 1
+                              Decorate 3009(i1DArray) Binding 5
+                              Decorate 3018(i2DArray) DescriptorSet 1
+                              Decorate 3018(i2DArray) Binding 6
+                              Decorate 3027(iCubeArray) DescriptorSet 1
+                              Decorate 3027(iCubeArray) Binding 7
+                              Decorate 3036(i2DMS) DescriptorSet 1
+                              Decorate 3036(i2DMS) Binding 9
+                              Decorate 3045(i2DMSArray) DescriptorSet 1
+                              Decorate 3045(i2DMSArray) Binding 10
+                              Decorate 4257(lodClamp) Location 7
+                              Decorate 4264(f16lodClamp) Location 17
+                              Decorate 5454(t1D) DescriptorSet 2
+                              Decorate 5454(t1D) Binding 0
+                              Decorate 5458(s) DescriptorSet 2
+                              Decorate 5458(s) Binding 11
+                              Decorate 5474(t2D) DescriptorSet 2
+                              Decorate 5474(t2D) Binding 1
+                              Decorate 5491(t3D) DescriptorSet 2
+                              Decorate 5491(t3D) Binding 2
+                              Decorate 5508(tCube) DescriptorSet 2
+                              Decorate 5508(tCube) Binding 4
+                              Decorate 5525(sShadow) DescriptorSet 2
+                              Decorate 5525(sShadow) Binding 12
+                              Decorate 5589(t1DArray) DescriptorSet 2
+                              Decorate 5589(t1DArray) Binding 5
+                              Decorate 5606(t2DArray) DescriptorSet 2
+                              Decorate 5606(t2DArray) Binding 6
+                              Decorate 5623(tCubeArray) DescriptorSet 2
+                              Decorate 5623(tCubeArray) Binding 7
+                              Decorate 5681(t2DRect) DescriptorSet 2
+                              Decorate 5681(t2DRect) Binding 3
+                              Decorate 5741(subpass) DescriptorSet 3
+                              Decorate 5741(subpass) Binding 0
+                              Decorate 5741(subpass) InputAttachmentIndex 0
+                              Decorate 5747(subpassMS) DescriptorSet 3
+                              Decorate 5747(subpassMS) Binding 1
+                              Decorate 5747(subpassMS) InputAttachmentIndex 0
+                              Decorate 5913(fragColor) Location 0
+                              Decorate 5917(tBuffer) DescriptorSet 2
+                              Decorate 5917(tBuffer) Binding 8
+                              Decorate 5919(t2DMS) DescriptorSet 2
+                              Decorate 5919(t2DMS) Binding 9
+                              Decorate 5921(t2DMSArray) DescriptorSet 2
+                              Decorate 5921(t2DMSArray) Binding 10
+                              Decorate 5922(bias) Location 6
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 16
+               7:             TypeVector 6(float16_t) 4
+               8:             TypeFunction 7(f16vec4)
+              47:             TypeInt 32 1
+              48:             TypeVector 47(int) 4
+              49:             TypeFunction 48(ivec4)
+              52:             TypeFloat 32
+              53:             TypeVector 52(float) 2
+              54:             TypeFunction 53(fvec2)
+              57:             TypeFunction 47(int)
+              64:             TypePointer Function 7(f16vec4)
+              65:             TypeFunction 2 64(ptr)
+             120:6(float16_t) Constant 0
+             121:  7(f16vec4) ConstantComposite 120 120 120 120
+             122:             TypeImage 6(float16_t) 1D sampled format:Unknown
+             123:             TypeSampledImage 122
+             124:             TypePointer UniformConstant 123
+        125(s1D):    124(ptr) Variable UniformConstant
+             127:             TypePointer Input 52(float)
+         128(c1):    127(ptr) Variable Input
+             134:             TypePointer Input 6(float16_t)
+      135(f16c1):    134(ptr) Variable Input
+    137(f16bias):    134(ptr) Variable Input
+             142:             TypeImage 6(float16_t) 2D sampled format:Unknown
+             143:             TypeSampledImage 142
+             144:             TypePointer UniformConstant 143
+        145(s2D):    144(ptr) Variable UniformConstant
+             147:             TypePointer Input 53(fvec2)
+         148(c2):    147(ptr) Variable Input
+             154:             TypeVector 6(float16_t) 2
+             155:             TypePointer Input 154(f16vec2)
+      156(f16c2):    155(ptr) Variable Input
+             162:             TypeImage 6(float16_t) 3D sampled format:Unknown
+             163:             TypeSampledImage 162
+             164:             TypePointer UniformConstant 163
+        165(s3D):    164(ptr) Variable UniformConstant
+             167:             TypeVector 52(float) 3
+             168:             TypePointer Input 167(fvec3)
+         169(c3):    168(ptr) Variable Input
+             175:             TypeVector 6(float16_t) 3
+             176:             TypePointer Input 175(f16vec3)
+      177(f16c3):    176(ptr) Variable Input
+             183:             TypeImage 6(float16_t) Cube sampled format:Unknown
+             184:             TypeSampledImage 183
+             185:             TypePointer UniformConstant 184
+      186(sCube):    185(ptr) Variable UniformConstant
+             198:             TypeImage 6(float16_t) 1D depth sampled format:Unknown
+             199:             TypeSampledImage 198
+             200:             TypePointer UniformConstant 199
+  201(s1DShadow):    200(ptr) Variable UniformConstant
+             206:             TypeInt 32 0
+             207:    206(int) Constant 0
+             208:             TypePointer Function 6(float16_t)
+    215(compare):    127(ptr) Variable Input
+             223:             TypeImage 6(float16_t) 2D depth sampled format:Unknown
+             224:             TypeSampledImage 223
+             225:             TypePointer UniformConstant 224
+  226(s2DShadow):    225(ptr) Variable UniformConstant
+             244:             TypeImage 6(float16_t) Cube depth sampled format:Unknown
+             245:             TypeSampledImage 244
+             246:             TypePointer UniformConstant 245
+247(sCubeShadow):    246(ptr) Variable UniformConstant
+             249:             TypeVector 52(float) 4
+             250:             TypePointer Input 249(fvec4)
+         251(c4):    250(ptr) Variable Input
+             268:             TypeImage 6(float16_t) 1D array sampled format:Unknown
+             269:             TypeSampledImage 268
+             270:             TypePointer UniformConstant 269
+   271(s1DArray):    270(ptr) Variable UniformConstant
+             283:             TypeImage 6(float16_t) 2D array sampled format:Unknown
+             284:             TypeSampledImage 283
+             285:             TypePointer UniformConstant 284
+   286(s2DArray):    285(ptr) Variable UniformConstant
+             298:             TypeImage 6(float16_t) Cube array sampled format:Unknown
+             299:             TypeSampledImage 298
+             300:             TypePointer UniformConstant 299
+ 301(sCubeArray):    300(ptr) Variable UniformConstant
+             308:             TypePointer Input 7(f16vec4)
+      309(f16c4):    308(ptr) Variable Input
+             315:             TypeImage 6(float16_t) 1D depth array sampled format:Unknown
+             316:             TypeSampledImage 315
+             317:             TypePointer UniformConstant 316
+318(s1DArrayShadow):    317(ptr) Variable UniformConstant
+             336:             TypeImage 6(float16_t) 2D depth array sampled format:Unknown
+             337:             TypeSampledImage 336
+             338:             TypePointer UniformConstant 337
+339(s2DArrayShadow):    338(ptr) Variable UniformConstant
+             356:             TypeImage 6(float16_t) Rect sampled format:Unknown
+             357:             TypeSampledImage 356
+             358:             TypePointer UniformConstant 357
+    359(s2DRect):    358(ptr) Variable UniformConstant
+             370:             TypeImage 6(float16_t) Rect depth sampled format:Unknown
+             371:             TypeSampledImage 370
+             372:             TypePointer UniformConstant 371
+373(s2DRectShadow):    372(ptr) Variable UniformConstant
+             390:             TypeImage 6(float16_t) Cube depth array sampled format:Unknown
+             391:             TypeSampledImage 390
+             392:             TypePointer UniformConstant 391
+393(sCubeArrayShadow):    392(ptr) Variable UniformConstant
+        565(lod):    127(ptr) Variable Input
+     572(f16lod):    134(ptr) Variable Input
+             709:     47(int) Constant 1
+             721:             TypeVector 47(int) 2
+             722:  721(ivec2) ConstantComposite 709 709
+             734:             TypeVector 47(int) 3
+             735:  734(ivec3) ConstantComposite 709 709 709
+            1297:             TypeImage 6(float16_t) Buffer sampled format:Unknown
+            1298:             TypeSampledImage 1297
+            1299:             TypePointer UniformConstant 1298
+   1300(sBuffer):   1299(ptr) Variable UniformConstant
+            1308:             TypeImage 6(float16_t) 2D multi-sampled sampled format:Unknown
+            1309:             TypeSampledImage 1308
+            1310:             TypePointer UniformConstant 1309
+     1311(s2DMS):   1310(ptr) Variable UniformConstant
+            1319:             TypeImage 6(float16_t) 2D array multi-sampled sampled format:Unknown
+            1320:             TypeSampledImage 1319
+            1321:             TypePointer UniformConstant 1320
+1322(s2DMSArray):   1321(ptr) Variable UniformConstant
+            1326:     47(int) Constant 2
+    1393(dPdxy1):    127(ptr) Variable Input
+ 1401(f16dPdxy1):    134(ptr) Variable Input
+    1409(dPdxy2):    147(ptr) Variable Input
+ 1417(f16dPdxy2):    155(ptr) Variable Input
+    1425(dPdxy3):    168(ptr) Variable Input
+ 1433(f16dPdxy3):    176(ptr) Variable Input
+            2187:     47(int) Constant 0
+            2378:    206(int) Constant 4
+            2379:             TypeArray 721(ivec2) 2378
+            2380:        2379 ConstantComposite 722 722 722 722
+            2558:             TypePointer Function 48(ivec4)
+            2560:   48(ivec4) ConstantComposite 2187 2187 2187 2187
+            2566:             TypePointer Function 47(int)
+            2732:             TypePointer Function 53(fvec2)
+            2734:   52(float) Constant 0
+            2735:   53(fvec2) ConstantComposite 2734 2734
+            2953:             TypeImage 6(float16_t) 1D nonsampled format:Rgba16f
+            2954:             TypePointer UniformConstant 2953
+       2955(i1D):   2954(ptr) Variable UniformConstant
+            2962:             TypeImage 6(float16_t) 2D nonsampled format:Rgba16f
+            2963:             TypePointer UniformConstant 2962
+       2964(i2D):   2963(ptr) Variable UniformConstant
+            2971:             TypeImage 6(float16_t) 3D nonsampled format:Rgba16f
+            2972:             TypePointer UniformConstant 2971
+       2973(i3D):   2972(ptr) Variable UniformConstant
+            2980:             TypeImage 6(float16_t) Rect nonsampled format:Rgba16f
+            2981:             TypePointer UniformConstant 2980
+   2982(i2DRect):   2981(ptr) Variable UniformConstant
+            2989:             TypeImage 6(float16_t) Cube nonsampled format:Rgba16f
+            2990:             TypePointer UniformConstant 2989
+     2991(iCube):   2990(ptr) Variable UniformConstant
+            2998:             TypeImage 6(float16_t) Buffer nonsampled format:Rgba16f
+            2999:             TypePointer UniformConstant 2998
+   3000(iBuffer):   2999(ptr) Variable UniformConstant
+            3007:             TypeImage 6(float16_t) 1D array nonsampled format:Rgba16f
+            3008:             TypePointer UniformConstant 3007
+  3009(i1DArray):   3008(ptr) Variable UniformConstant
+            3016:             TypeImage 6(float16_t) 2D array nonsampled format:Rgba16f
+            3017:             TypePointer UniformConstant 3016
+  3018(i2DArray):   3017(ptr) Variable UniformConstant
+            3025:             TypeImage 6(float16_t) Cube array nonsampled format:Rgba16f
+            3026:             TypePointer UniformConstant 3025
+3027(iCubeArray):   3026(ptr) Variable UniformConstant
+            3034:             TypeImage 6(float16_t) 2D multi-sampled nonsampled format:Rgba16f
+            3035:             TypePointer UniformConstant 3034
+     3036(i2DMS):   3035(ptr) Variable UniformConstant
+            3043:             TypeImage 6(float16_t) 2D array multi-sampled nonsampled format:Rgba16f
+            3044:             TypePointer UniformConstant 3043
+3045(i2DMSArray):   3044(ptr) Variable UniformConstant
+   3102(ResType):             TypeStruct 47(int) 7(f16vec4)
+   3138(ResType):             TypeStruct 47(int) 6(float16_t)
+  4257(lodClamp):    127(ptr) Variable Input
+4264(f16lodClamp):    134(ptr) Variable Input
+            5453:             TypePointer UniformConstant 122
+       5454(t1D):   5453(ptr) Variable UniformConstant
+            5456:             TypeSampler
+            5457:             TypePointer UniformConstant 5456
+         5458(s):   5457(ptr) Variable UniformConstant
+            5473:             TypePointer UniformConstant 142
+       5474(t2D):   5473(ptr) Variable UniformConstant
+            5490:             TypePointer UniformConstant 162
+       5491(t3D):   5490(ptr) Variable UniformConstant
+            5507:             TypePointer UniformConstant 183
+     5508(tCube):   5507(ptr) Variable UniformConstant
+   5525(sShadow):   5457(ptr) Variable UniformConstant
+            5588:             TypePointer UniformConstant 268
+  5589(t1DArray):   5588(ptr) Variable UniformConstant
+            5605:             TypePointer UniformConstant 283
+  5606(t2DArray):   5605(ptr) Variable UniformConstant
+            5622:             TypePointer UniformConstant 298
+5623(tCubeArray):   5622(ptr) Variable UniformConstant
+            5680:             TypePointer UniformConstant 356
+   5681(t2DRect):   5680(ptr) Variable UniformConstant
+            5739:             TypeImage 6(float16_t) SubpassData nonsampled format:Unknown
+            5740:             TypePointer UniformConstant 5739
+   5741(subpass):   5740(ptr) Variable UniformConstant
+            5743:  721(ivec2) ConstantComposite 2187 2187
+            5745:             TypeImage 6(float16_t) SubpassData multi-sampled nonsampled format:Unknown
+            5746:             TypePointer UniformConstant 5745
+ 5747(subpassMS):   5746(ptr) Variable UniformConstant
+            5912:             TypePointer Output 249(fvec4)
+ 5913(fragColor):   5912(ptr) Variable Output
+            5916:             TypePointer UniformConstant 1297
+   5917(tBuffer):   5916(ptr) Variable UniformConstant
+            5918:             TypePointer UniformConstant 1308
+     5919(t2DMS):   5918(ptr) Variable UniformConstant
+            5920:             TypePointer UniformConstant 1319
+5921(t2DMSArray):   5920(ptr) Variable UniformConstant
+      5922(bias):    127(ptr) Variable Input
+         4(main):           2 Function None 3
+               5:             Label
+    5753(result):     64(ptr) Variable Function
+     5834(param):     64(ptr) Variable Function
+                              Store 5753(result) 121
+            5754:  7(f16vec4) FunctionCall 9(testTexture()
+            5755:  7(f16vec4) Load 5753(result)
+            5756:  7(f16vec4) FAdd 5755 5754
+                              Store 5753(result) 5756
+            5757:  7(f16vec4) FunctionCall 11(testTextureProj()
+            5758:  7(f16vec4) Load 5753(result)
+            5759:  7(f16vec4) FAdd 5758 5757
+                              Store 5753(result) 5759
+            5760:  7(f16vec4) FunctionCall 13(testTextureLod()
+            5761:  7(f16vec4) Load 5753(result)
+            5762:  7(f16vec4) FAdd 5761 5760
+                              Store 5753(result) 5762
+            5763:  7(f16vec4) FunctionCall 15(testTextureOffset()
+            5764:  7(f16vec4) Load 5753(result)
+            5765:  7(f16vec4) FAdd 5764 5763
+                              Store 5753(result) 5765
+            5766:  7(f16vec4) FunctionCall 19(testTextureLodOffset()
+            5767:  7(f16vec4) Load 5753(result)
+            5768:  7(f16vec4) FAdd 5767 5766
+                              Store 5753(result) 5768
+            5769:  7(f16vec4) FunctionCall 21(testTextureProjLodOffset()
+            5770:  7(f16vec4) Load 5753(result)
+            5771:  7(f16vec4) FAdd 5770 5769
+                              Store 5753(result) 5771
+            5772:  7(f16vec4) FunctionCall 23(testTexelFetch()
+            5773:  7(f16vec4) Load 5753(result)
+            5774:  7(f16vec4) FAdd 5773 5772
+                              Store 5753(result) 5774
+            5775:  7(f16vec4) FunctionCall 25(testTexelFetchOffset()
+            5776:  7(f16vec4) Load 5753(result)
+            5777:  7(f16vec4) FAdd 5776 5775
+                              Store 5753(result) 5777
+            5778:  7(f16vec4) FunctionCall 27(testTextureGrad()
+            5779:  7(f16vec4) Load 5753(result)
+            5780:  7(f16vec4) FAdd 5779 5778
+                              Store 5753(result) 5780
+            5781:  7(f16vec4) FunctionCall 29(testTextureGradOffset()
+            5782:  7(f16vec4) Load 5753(result)
+            5783:  7(f16vec4) FAdd 5782 5781
+                              Store 5753(result) 5783
+            5784:  7(f16vec4) FunctionCall 31(testTextureProjGrad()
+            5785:  7(f16vec4) Load 5753(result)
+            5786:  7(f16vec4) FAdd 5785 5784
+                              Store 5753(result) 5786
+            5787:  7(f16vec4) FunctionCall 33(testTextureProjGradoffset()
+            5788:  7(f16vec4) Load 5753(result)
+            5789:  7(f16vec4) FAdd 5788 5787
+                              Store 5753(result) 5789
+            5790:  7(f16vec4) FunctionCall 35(testTextureGather()
+            5791:  7(f16vec4) Load 5753(result)
+            5792:  7(f16vec4) FAdd 5791 5790
+                              Store 5753(result) 5792
+            5793:  7(f16vec4) FunctionCall 37(testTextureGatherOffset()
+            5794:  7(f16vec4) Load 5753(result)
+            5795:  7(f16vec4) FAdd 5794 5793
+                              Store 5753(result) 5795
+            5796:  7(f16vec4) FunctionCall 39(testTextureGatherOffsets()
+            5797:  7(f16vec4) Load 5753(result)
+            5798:  7(f16vec4) FAdd 5797 5796
+                              Store 5753(result) 5798
+            5799:  7(f16vec4) FunctionCall 41(testTextureGatherLod()
+            5800:  7(f16vec4) Load 5753(result)
+            5801:  7(f16vec4) FAdd 5800 5799
+                              Store 5753(result) 5801
+            5802:  7(f16vec4) FunctionCall 43(testTextureGatherLodOffset()
+            5803:  7(f16vec4) Load 5753(result)
+            5804:  7(f16vec4) FAdd 5803 5802
+                              Store 5753(result) 5804
+            5805:  7(f16vec4) FunctionCall 45(testTextureGatherLodOffsets()
+            5806:  7(f16vec4) Load 5753(result)
+            5807:  7(f16vec4) FAdd 5806 5805
+                              Store 5753(result) 5807
+            5808:   48(ivec4) FunctionCall 50(testTextureSize()
+            5809:  7(f16vec4) ConvertSToF 5808
+            5810:  7(f16vec4) Load 5753(result)
+            5811:  7(f16vec4) FAdd 5810 5809
+                              Store 5753(result) 5811
+            5812:   53(fvec2) FunctionCall 55(testTextureQueryLod()
+            5813:154(f16vec2) FConvert 5812
+            5814:  7(f16vec4) Load 5753(result)
+            5815:154(f16vec2) VectorShuffle 5814 5814 0 1
+            5816:154(f16vec2) FAdd 5815 5813
+            5817:  7(f16vec4) Load 5753(result)
+            5818:  7(f16vec4) VectorShuffle 5817 5816 4 5 2 3
+                              Store 5753(result) 5818
+            5819:     47(int) FunctionCall 58(testTextureQueryLevels()
+            5820:6(float16_t) ConvertSToF 5819
+            5821:    208(ptr) AccessChain 5753(result) 207
+            5822:6(float16_t) Load 5821
+            5823:6(float16_t) FAdd 5822 5820
+            5824:    208(ptr) AccessChain 5753(result) 207
+                              Store 5824 5823
+            5825:     47(int) FunctionCall 60(testTextureSamples()
+            5826:6(float16_t) ConvertSToF 5825
+            5827:    208(ptr) AccessChain 5753(result) 207
+            5828:6(float16_t) Load 5827
+            5829:6(float16_t) FAdd 5828 5826
+            5830:    208(ptr) AccessChain 5753(result) 207
+                              Store 5830 5829
+            5831:  7(f16vec4) FunctionCall 62(testImageLoad()
+            5832:  7(f16vec4) Load 5753(result)
+            5833:  7(f16vec4) FAdd 5832 5831
+                              Store 5753(result) 5833
+            5835:  7(f16vec4) Load 5753(result)
+                              Store 5834(param) 5835
+            5836:           2 FunctionCall 67(testImageStore(vf164;) 5834(param)
+            5837:  7(f16vec4) FunctionCall 69(testSparseTexture()
+            5838:  7(f16vec4) Load 5753(result)
+            5839:  7(f16vec4) FAdd 5838 5837
+                              Store 5753(result) 5839
+            5840:  7(f16vec4) FunctionCall 71(testSparseTextureLod()
+            5841:  7(f16vec4) Load 5753(result)
+            5842:  7(f16vec4) FAdd 5841 5840
+                              Store 5753(result) 5842
+            5843:  7(f16vec4) FunctionCall 73(testSparseTextureOffset()
+            5844:  7(f16vec4) Load 5753(result)
+            5845:  7(f16vec4) FAdd 5844 5843
+                              Store 5753(result) 5845
+            5846:  7(f16vec4) FunctionCall 75(testSparseTextureLodOffset()
+            5847:  7(f16vec4) Load 5753(result)
+            5848:  7(f16vec4) FAdd 5847 5846
+                              Store 5753(result) 5848
+            5849:  7(f16vec4) FunctionCall 77(testSparseTextureGrad()
+            5850:  7(f16vec4) Load 5753(result)
+            5851:  7(f16vec4) FAdd 5850 5849
+                              Store 5753(result) 5851
+            5852:  7(f16vec4) FunctionCall 79(testSparseTextureGradOffset()
+            5853:  7(f16vec4) Load 5753(result)
+            5854:  7(f16vec4) FAdd 5853 5852
+                              Store 5753(result) 5854
+            5855:  7(f16vec4) FunctionCall 81(testSparseTexelFetch()
+            5856:  7(f16vec4) Load 5753(result)
+            5857:  7(f16vec4) FAdd 5856 5855
+                              Store 5753(result) 5857
+            5858:  7(f16vec4) FunctionCall 83(testSparseTexelFetchOffset()
+            5859:  7(f16vec4) Load 5753(result)
+            5860:  7(f16vec4) FAdd 5859 5858
+                              Store 5753(result) 5860
+            5861:  7(f16vec4) FunctionCall 85(testSparseTextureGather()
+            5862:  7(f16vec4) Load 5753(result)
+            5863:  7(f16vec4) FAdd 5862 5861
+                              Store 5753(result) 5863
+            5864:  7(f16vec4) FunctionCall 87(testSparseTextureGatherOffset()
+            5865:  7(f16vec4) Load 5753(result)
+            5866:  7(f16vec4) FAdd 5865 5864
+                              Store 5753(result) 5866
+            5867:  7(f16vec4) FunctionCall 89(testSparseTextureGatherOffsets()
+            5868:  7(f16vec4) Load 5753(result)
+            5869:  7(f16vec4) FAdd 5868 5867
+                              Store 5753(result) 5869
+            5870:  7(f16vec4) FunctionCall 91(testSparseTextureGatherLod()
+            5871:  7(f16vec4) Load 5753(result)
+            5872:  7(f16vec4) FAdd 5871 5870
+                              Store 5753(result) 5872
+            5873:  7(f16vec4) FunctionCall 93(testSparseTextureGatherLodOffset()
+            5874:  7(f16vec4) Load 5753(result)
+            5875:  7(f16vec4) FAdd 5874 5873
+                              Store 5753(result) 5875
+            5876:  7(f16vec4) FunctionCall 95(testSparseTextureGatherLodOffsets()
+            5877:  7(f16vec4) Load 5753(result)
+            5878:  7(f16vec4) FAdd 5877 5876
+                              Store 5753(result) 5878
+            5879:  7(f16vec4) FunctionCall 97(testSparseImageLoad()
+            5880:  7(f16vec4) Load 5753(result)
+            5881:  7(f16vec4) FAdd 5880 5879
+                              Store 5753(result) 5881
+            5882:  7(f16vec4) FunctionCall 99(testSparseTextureClamp()
+            5883:  7(f16vec4) Load 5753(result)
+            5884:  7(f16vec4) FAdd 5883 5882
+                              Store 5753(result) 5884
+            5885:  7(f16vec4) FunctionCall 101(testTextureClamp()
+            5886:  7(f16vec4) Load 5753(result)
+            5887:  7(f16vec4) FAdd 5886 5885
+                              Store 5753(result) 5887
+            5888:  7(f16vec4) FunctionCall 103(testSparseTextureOffsetClamp()
+            5889:  7(f16vec4) Load 5753(result)
+            5890:  7(f16vec4) FAdd 5889 5888
+                              Store 5753(result) 5890
+            5891:  7(f16vec4) FunctionCall 105(testTextureOffsetClamp()
+            5892:  7(f16vec4) Load 5753(result)
+            5893:  7(f16vec4) FAdd 5892 5891
+                              Store 5753(result) 5893
+            5894:  7(f16vec4) FunctionCall 77(testSparseTextureGrad()
+            5895:  7(f16vec4) Load 5753(result)
+            5896:  7(f16vec4) FAdd 5895 5894
+                              Store 5753(result) 5896
+            5897:  7(f16vec4) FunctionCall 27(testTextureGrad()
+            5898:  7(f16vec4) Load 5753(result)
+            5899:  7(f16vec4) FAdd 5898 5897
+                              Store 5753(result) 5899
+            5900:  7(f16vec4) FunctionCall 111(testSparseTextureGradOffsetClamp()
+            5901:  7(f16vec4) Load 5753(result)
+            5902:  7(f16vec4) FAdd 5901 5900
+                              Store 5753(result) 5902
+            5903:  7(f16vec4) FunctionCall 113(testTextureGradOffsetClamp()
+            5904:  7(f16vec4) Load 5753(result)
+            5905:  7(f16vec4) FAdd 5904 5903
+                              Store 5753(result) 5905
+            5906:  7(f16vec4) FunctionCall 115(testCombinedTextureSampler()
+            5907:  7(f16vec4) Load 5753(result)
+            5908:  7(f16vec4) FAdd 5907 5906
+                              Store 5753(result) 5908
+            5909:  7(f16vec4) FunctionCall 117(testSubpassLoad()
+            5910:  7(f16vec4) Load 5753(result)
+            5911:  7(f16vec4) FAdd 5910 5909
+                              Store 5753(result) 5911
+            5914:  7(f16vec4) Load 5753(result)
+            5915:  249(fvec4) FConvert 5914
+                              Store 5913(fragColor) 5915
+                              Return
+                              FunctionEnd
+ 9(testTexture():  7(f16vec4) Function None 8
+              10:             Label
+      119(texel):     64(ptr) Variable Function
+                              Store 119(texel) 121
+             126:         123 Load 125(s1D)
+             129:   52(float) Load 128(c1)
+             130:  7(f16vec4) ImageSampleImplicitLod 126 129
+             131:  7(f16vec4) Load 119(texel)
+             132:  7(f16vec4) FAdd 131 130
+                              Store 119(texel) 132
+             133:         123 Load 125(s1D)
+             136:6(float16_t) Load 135(f16c1)
+             138:6(float16_t) Load 137(f16bias)
+             139:  7(f16vec4) ImageSampleImplicitLod 133 136 Bias 138
+             140:  7(f16vec4) Load 119(texel)
+             141:  7(f16vec4) FAdd 140 139
+                              Store 119(texel) 141
+             146:         143 Load 145(s2D)
+             149:   53(fvec2) Load 148(c2)
+             150:  7(f16vec4) ImageSampleImplicitLod 146 149
+             151:  7(f16vec4) Load 119(texel)
+             152:  7(f16vec4) FAdd 151 150
+                              Store 119(texel) 152
+             153:         143 Load 145(s2D)
+             157:154(f16vec2) Load 156(f16c2)
+             158:6(float16_t) Load 137(f16bias)
+             159:  7(f16vec4) ImageSampleImplicitLod 153 157 Bias 158
+             160:  7(f16vec4) Load 119(texel)
+             161:  7(f16vec4) FAdd 160 159
+                              Store 119(texel) 161
+             166:         163 Load 165(s3D)
+             170:  167(fvec3) Load 169(c3)
+             171:  7(f16vec4) ImageSampleImplicitLod 166 170
+             172:  7(f16vec4) Load 119(texel)
+             173:  7(f16vec4) FAdd 172 171
+                              Store 119(texel) 173
+             174:         163 Load 165(s3D)
+             178:175(f16vec3) Load 177(f16c3)
+             179:6(float16_t) Load 137(f16bias)
+             180:  7(f16vec4) ImageSampleImplicitLod 174 178 Bias 179
+             181:  7(f16vec4) Load 119(texel)
+             182:  7(f16vec4) FAdd 181 180
+                              Store 119(texel) 182
+             187:         184 Load 186(sCube)
+             188:  167(fvec3) Load 169(c3)
+             189:  7(f16vec4) ImageSampleImplicitLod 187 188
+             190:  7(f16vec4) Load 119(texel)
+             191:  7(f16vec4) FAdd 190 189
+                              Store 119(texel) 191
+             192:         184 Load 186(sCube)
+             193:175(f16vec3) Load 177(f16c3)
+             194:6(float16_t) Load 137(f16bias)
+             195:  7(f16vec4) ImageSampleImplicitLod 192 193 Bias 194
+             196:  7(f16vec4) Load 119(texel)
+             197:  7(f16vec4) FAdd 196 195
+                              Store 119(texel) 197
+             202:         199 Load 201(s1DShadow)
+             203:  167(fvec3) Load 169(c3)
+             204:   52(float) CompositeExtract 203 2
+             205:6(float16_t) ImageSampleDrefImplicitLod 202 203 204
+             209:    208(ptr) AccessChain 119(texel) 207
+             210:6(float16_t) Load 209
+             211:6(float16_t) FAdd 210 205
+             212:    208(ptr) AccessChain 119(texel) 207
+                              Store 212 211
+             213:         199 Load 201(s1DShadow)
+             214:154(f16vec2) Load 156(f16c2)
+             216:   52(float) Load 215(compare)
+             217:6(float16_t) Load 137(f16bias)
+             218:6(float16_t) ImageSampleDrefImplicitLod 213 214 216 Bias 217
+             219:    208(ptr) AccessChain 119(texel) 207
+             220:6(float16_t) Load 219
+             221:6(float16_t) FAdd 220 218
+             222:    208(ptr) AccessChain 119(texel) 207
+                              Store 222 221
+             227:         224 Load 226(s2DShadow)
+             228:  167(fvec3) Load 169(c3)
+             229:   52(float) CompositeExtract 228 2
+             230:6(float16_t) ImageSampleDrefImplicitLod 227 228 229
+             231:    208(ptr) AccessChain 119(texel) 207
+             232:6(float16_t) Load 231
+             233:6(float16_t) FAdd 232 230
+             234:    208(ptr) AccessChain 119(texel) 207
+                              Store 234 233
+             235:         224 Load 226(s2DShadow)
+             236:154(f16vec2) Load 156(f16c2)
+             237:   52(float) Load 215(compare)
+             238:6(float16_t) Load 137(f16bias)
+             239:6(float16_t) ImageSampleDrefImplicitLod 235 236 237 Bias 238
+             240:    208(ptr) AccessChain 119(texel) 207
+             241:6(float16_t) Load 240
+             242:6(float16_t) FAdd 241 239
+             243:    208(ptr) AccessChain 119(texel) 207
+                              Store 243 242
+             248:         245 Load 247(sCubeShadow)
+             252:  249(fvec4) Load 251(c4)
+             253:   52(float) CompositeExtract 252 3
+             254:6(float16_t) ImageSampleDrefImplicitLod 248 252 253
+             255:    208(ptr) AccessChain 119(texel) 207
+             256:6(float16_t) Load 255
+             257:6(float16_t) FAdd 256 254
+             258:    208(ptr) AccessChain 119(texel) 207
+                              Store 258 257
+             259:         245 Load 247(sCubeShadow)
+             260:175(f16vec3) Load 177(f16c3)
+             261:   52(float) Load 215(compare)
+             262:6(float16_t) Load 137(f16bias)
+             263:6(float16_t) ImageSampleDrefImplicitLod 259 260 261 Bias 262
+             264:    208(ptr) AccessChain 119(texel) 207
+             265:6(float16_t) Load 264
+             266:6(float16_t) FAdd 265 263
+             267:    208(ptr) AccessChain 119(texel) 207
+                              Store 267 266
+             272:         269 Load 271(s1DArray)
+             273:   53(fvec2) Load 148(c2)
+             274:  7(f16vec4) ImageSampleImplicitLod 272 273
+             275:  7(f16vec4) Load 119(texel)
+             276:  7(f16vec4) FAdd 275 274
+                              Store 119(texel) 276
+             277:         269 Load 271(s1DArray)
+             278:154(f16vec2) Load 156(f16c2)
+             279:6(float16_t) Load 137(f16bias)
+             280:  7(f16vec4) ImageSampleImplicitLod 277 278 Bias 279
+             281:  7(f16vec4) Load 119(texel)
+             282:  7(f16vec4) FAdd 281 280
+                              Store 119(texel) 282
+             287:         284 Load 286(s2DArray)
+             288:  167(fvec3) Load 169(c3)
+             289:  7(f16vec4) ImageSampleImplicitLod 287 288
+             290:  7(f16vec4) Load 119(texel)
+             291:  7(f16vec4) FAdd 290 289
+                              Store 119(texel) 291
+             292:         284 Load 286(s2DArray)
+             293:175(f16vec3) Load 177(f16c3)
+             294:6(float16_t) Load 137(f16bias)
+             295:  7(f16vec4) ImageSampleImplicitLod 292 293 Bias 294
+             296:  7(f16vec4) Load 119(texel)
+             297:  7(f16vec4) FAdd 296 295
+                              Store 119(texel) 297
+             302:         299 Load 301(sCubeArray)
+             303:  249(fvec4) Load 251(c4)
+             304:  7(f16vec4) ImageSampleImplicitLod 302 303
+             305:  7(f16vec4) Load 119(texel)
+             306:  7(f16vec4) FAdd 305 304
+                              Store 119(texel) 306
+             307:         299 Load 301(sCubeArray)
+             310:  7(f16vec4) Load 309(f16c4)
+             311:6(float16_t) Load 137(f16bias)
+             312:  7(f16vec4) ImageSampleImplicitLod 307 310 Bias 311
+             313:  7(f16vec4) Load 119(texel)
+             314:  7(f16vec4) FAdd 313 312
+                              Store 119(texel) 314
+             319:         316 Load 318(s1DArrayShadow)
+             320:  167(fvec3) Load 169(c3)
+             321:   52(float) CompositeExtract 320 2
+             322:6(float16_t) ImageSampleDrefImplicitLod 319 320 321
+             323:    208(ptr) AccessChain 119(texel) 207
+             324:6(float16_t) Load 323
+             325:6(float16_t) FAdd 324 322
+             326:    208(ptr) AccessChain 119(texel) 207
+                              Store 326 325
+             327:         316 Load 318(s1DArrayShadow)
+             328:154(f16vec2) Load 156(f16c2)
+             329:   52(float) Load 215(compare)
+             330:6(float16_t) Load 137(f16bias)
+             331:6(float16_t) ImageSampleDrefImplicitLod 327 328 329 Bias 330
+             332:    208(ptr) AccessChain 119(texel) 207
+             333:6(float16_t) Load 332
+             334:6(float16_t) FAdd 333 331
+             335:    208(ptr) AccessChain 119(texel) 207
+                              Store 335 334
+             340:         337 Load 339(s2DArrayShadow)
+             341:  249(fvec4) Load 251(c4)
+             342:   52(float) CompositeExtract 341 3
+             343:6(float16_t) ImageSampleDrefImplicitLod 340 341 342
+             344:    208(ptr) AccessChain 119(texel) 207
+             345:6(float16_t) Load 344
+             346:6(float16_t) FAdd 345 343
+             347:    208(ptr) AccessChain 119(texel) 207
+                              Store 347 346
+             348:         337 Load 339(s2DArrayShadow)
+             349:175(f16vec3) Load 177(f16c3)
+             350:   52(float) Load 215(compare)
+             351:6(float16_t) ImageSampleDrefImplicitLod 348 349 350
+             352:    208(ptr) AccessChain 119(texel) 207
+             353:6(float16_t) Load 352
+             354:6(float16_t) FAdd 353 351
+             355:    208(ptr) AccessChain 119(texel) 207
+                              Store 355 354
+             360:         357 Load 359(s2DRect)
+             361:   53(fvec2) Load 148(c2)
+             362:  7(f16vec4) ImageSampleImplicitLod 360 361
+             363:  7(f16vec4) Load 119(texel)
+             364:  7(f16vec4) FAdd 363 362
+                              Store 119(texel) 364
+             365:         357 Load 359(s2DRect)
+             366:154(f16vec2) Load 156(f16c2)
+             367:  7(f16vec4) ImageSampleImplicitLod 365 366
+             368:  7(f16vec4) Load 119(texel)
+             369:  7(f16vec4) FAdd 368 367
+                              Store 119(texel) 369
+             374:         371 Load 373(s2DRectShadow)
+             375:  167(fvec3) Load 169(c3)
+             376:   52(float) CompositeExtract 375 2
+             377:6(float16_t) ImageSampleDrefImplicitLod 374 375 376
+             378:    208(ptr) AccessChain 119(texel) 207
+             379:6(float16_t) Load 378
+             380:6(float16_t) FAdd 379 377
+             381:    208(ptr) AccessChain 119(texel) 207
+                              Store 381 380
+             382:         371 Load 373(s2DRectShadow)
+             383:154(f16vec2) Load 156(f16c2)
+             384:   52(float) Load 215(compare)
+             385:6(float16_t) ImageSampleDrefImplicitLod 382 383 384
+             386:    208(ptr) AccessChain 119(texel) 207
+             387:6(float16_t) Load 386
+             388:6(float16_t) FAdd 387 385
+             389:    208(ptr) AccessChain 119(texel) 207
+                              Store 389 388
+             394:         391 Load 393(sCubeArrayShadow)
+             395:  249(fvec4) Load 251(c4)
+             396:   52(float) Load 215(compare)
+             397:6(float16_t) ImageSampleDrefImplicitLod 394 395 396
+             398:    208(ptr) AccessChain 119(texel) 207
+             399:6(float16_t) Load 398
+             400:6(float16_t) FAdd 399 397
+             401:    208(ptr) AccessChain 119(texel) 207
+                              Store 401 400
+             402:         391 Load 393(sCubeArrayShadow)
+             403:  7(f16vec4) Load 309(f16c4)
+             404:   52(float) Load 215(compare)
+             405:6(float16_t) ImageSampleDrefImplicitLod 402 403 404
+             406:    208(ptr) AccessChain 119(texel) 207
+             407:6(float16_t) Load 406
+             408:6(float16_t) FAdd 407 405
+             409:    208(ptr) AccessChain 119(texel) 207
+                              Store 409 408
+             410:  7(f16vec4) Load 119(texel)
+                              ReturnValue 410
+                              FunctionEnd
+11(testTextureProj():  7(f16vec4) Function None 8
+              12:             Label
+      413(texel):     64(ptr) Variable Function
+                              Store 413(texel) 121
+             414:         123 Load 125(s1D)
+             415:   53(fvec2) Load 148(c2)
+             416:  7(f16vec4) ImageSampleProjImplicitLod 414 415
+             417:  7(f16vec4) Load 413(texel)
+             418:  7(f16vec4) FAdd 417 416
+                              Store 413(texel) 418
+             419:         123 Load 125(s1D)
+             420:154(f16vec2) Load 156(f16c2)
+             421:6(float16_t) Load 137(f16bias)
+             422:  7(f16vec4) ImageSampleProjImplicitLod 419 420 Bias 421
+             423:  7(f16vec4) Load 413(texel)
+             424:  7(f16vec4) FAdd 423 422
+                              Store 413(texel) 424
+             425:         123 Load 125(s1D)
+             426:  249(fvec4) Load 251(c4)
+             427:   52(float) CompositeExtract 426 3
+             428:  249(fvec4) CompositeInsert 427 426 1
+             429:  7(f16vec4) ImageSampleProjImplicitLod 425 428
+             430:  7(f16vec4) Load 413(texel)
+             431:  7(f16vec4) FAdd 430 429
+                              Store 413(texel) 431
+             432:         123 Load 125(s1D)
+             433:  7(f16vec4) Load 309(f16c4)
+             434:6(float16_t) Load 137(f16bias)
+             435:6(float16_t) CompositeExtract 433 3
+             436:  7(f16vec4) CompositeInsert 435 433 1
+             437:  7(f16vec4) ImageSampleProjImplicitLod 432 436 Bias 434
+             438:  7(f16vec4) Load 413(texel)
+             439:  7(f16vec4) FAdd 438 437
+                              Store 413(texel) 439
+             440:         143 Load 145(s2D)
+             441:  167(fvec3) Load 169(c3)
+             442:  7(f16vec4) ImageSampleProjImplicitLod 440 441
+             443:  7(f16vec4) Load 413(texel)
+             444:  7(f16vec4) FAdd 443 442
+                              Store 413(texel) 444
+             445:         143 Load 145(s2D)
+             446:175(f16vec3) Load 177(f16c3)
+             447:6(float16_t) Load 137(f16bias)
+             448:  7(f16vec4) ImageSampleProjImplicitLod 445 446 Bias 447
+             449:  7(f16vec4) Load 413(texel)
+             450:  7(f16vec4) FAdd 449 448
+                              Store 413(texel) 450
+             451:         143 Load 145(s2D)
+             452:  249(fvec4) Load 251(c4)
+             453:   52(float) CompositeExtract 452 3
+             454:  249(fvec4) CompositeInsert 453 452 2
+             455:  7(f16vec4) ImageSampleProjImplicitLod 451 454
+             456:  7(f16vec4) Load 413(texel)
+             457:  7(f16vec4) FAdd 456 455
+                              Store 413(texel) 457
+             458:         143 Load 145(s2D)
+             459:  7(f16vec4) Load 309(f16c4)
+             460:6(float16_t) Load 137(f16bias)
+             461:6(float16_t) CompositeExtract 459 3
+             462:  7(f16vec4) CompositeInsert 461 459 2
+             463:  7(f16vec4) ImageSampleProjImplicitLod 458 462 Bias 460
+             464:  7(f16vec4) Load 413(texel)
+             465:  7(f16vec4) FAdd 464 463
+                              Store 413(texel) 465
+             466:         163 Load 165(s3D)
+             467:  249(fvec4) Load 251(c4)
+             468:  7(f16vec4) ImageSampleProjImplicitLod 466 467
+             469:  7(f16vec4) Load 413(texel)
+             470:  7(f16vec4) FAdd 469 468
+                              Store 413(texel) 470
+             471:         163 Load 165(s3D)
+             472:  7(f16vec4) Load 309(f16c4)
+             473:6(float16_t) Load 137(f16bias)
+             474:  7(f16vec4) ImageSampleProjImplicitLod 471 472 Bias 473
+             475:  7(f16vec4) Load 413(texel)
+             476:  7(f16vec4) FAdd 475 474
+                              Store 413(texel) 476
+             477:         199 Load 201(s1DShadow)
+             478:  249(fvec4) Load 251(c4)
+             479:   52(float) CompositeExtract 478 2
+             480:   52(float) CompositeExtract 478 3
+             481:  249(fvec4) CompositeInsert 480 478 1
+             482:6(float16_t) ImageSampleProjDrefImplicitLod 477 481 479
+             483:    208(ptr) AccessChain 413(texel) 207
+             484:6(float16_t) Load 483
+             485:6(float16_t) FAdd 484 482
+             486:    208(ptr) AccessChain 413(texel) 207
+                              Store 486 485
+             487:         199 Load 201(s1DShadow)
+             488:175(f16vec3) Load 177(f16c3)
+             489:   52(float) Load 215(compare)
+             490:6(float16_t) Load 137(f16bias)
+             491:6(float16_t) CompositeExtract 488 2
+             492:175(f16vec3) CompositeInsert 491 488 1
+             493:6(float16_t) ImageSampleProjDrefImplicitLod 487 492 489 Bias 490
+             494:    208(ptr) AccessChain 413(texel) 207
+             495:6(float16_t) Load 494
+             496:6(float16_t) FAdd 495 493
+             497:    208(ptr) AccessChain 413(texel) 207
+                              Store 497 496
+             498:         224 Load 226(s2DShadow)
+             499:  249(fvec4) Load 251(c4)
+             500:   52(float) CompositeExtract 499 2
+             501:   52(float) CompositeExtract 499 3
+             502:  249(fvec4) CompositeInsert 501 499 2
+             503:6(float16_t) ImageSampleProjDrefImplicitLod 498 502 500
+             504:    208(ptr) AccessChain 413(texel) 207
+             505:6(float16_t) Load 504
+             506:6(float16_t) FAdd 505 503
+             507:    208(ptr) AccessChain 413(texel) 207
+                              Store 507 506
+             508:         224 Load 226(s2DShadow)
+             509:175(f16vec3) Load 177(f16c3)
+             510:   52(float) Load 215(compare)
+             511:6(float16_t) Load 137(f16bias)
+             512:6(float16_t) ImageSampleProjDrefImplicitLod 508 509 510 Bias 511
+             513:    208(ptr) AccessChain 413(texel) 207
+             514:6(float16_t) Load 513
+             515:6(float16_t) FAdd 514 512
+             516:    208(ptr) AccessChain 413(texel) 207
+                              Store 516 515
+             517:         357 Load 359(s2DRect)
+             518:  167(fvec3) Load 169(c3)
+             519:  7(f16vec4) ImageSampleProjImplicitLod 517 518
+             520:  7(f16vec4) Load 413(texel)
+             521:  7(f16vec4) FAdd 520 519
+                              Store 413(texel) 521
+             522:         357 Load 359(s2DRect)
+             523:175(f16vec3) Load 177(f16c3)
+             524:  7(f16vec4) ImageSampleProjImplicitLod 522 523
+             525:  7(f16vec4) Load 413(texel)
+             526:  7(f16vec4) FAdd 525 524
+                              Store 413(texel) 526
+             527:         357 Load 359(s2DRect)
+             528:  249(fvec4) Load 251(c4)
+             529:   52(float) CompositeExtract 528 3
+             530:  249(fvec4) CompositeInsert 529 528 2
+             531:  7(f16vec4) ImageSampleProjImplicitLod 527 530
+             532:  7(f16vec4) Load 413(texel)
+             533:  7(f16vec4) FAdd 532 531
+                              Store 413(texel) 533
+             534:         357 Load 359(s2DRect)
+             535:  7(f16vec4) Load 309(f16c4)
+             536:6(float16_t) CompositeExtract 535 3
+             537:  7(f16vec4) CompositeInsert 536 535 2
+             538:  7(f16vec4) ImageSampleProjImplicitLod 534 537
+             539:  7(f16vec4) Load 413(texel)
+             540:  7(f16vec4) FAdd 539 538
+                              Store 413(texel) 540
+             541:         371 Load 373(s2DRectShadow)
+             542:  249(fvec4) Load 251(c4)
+             543:   52(float) CompositeExtract 542 2
+             544:   52(float) CompositeExtract 542 3
+             545:  249(fvec4) CompositeInsert 544 542 2
+             546:6(float16_t) ImageSampleProjDrefImplicitLod 541 545 543
+             547:    208(ptr) AccessChain 413(texel) 207
+             548:6(float16_t) Load 547
+             549:6(float16_t) FAdd 548 546
+             550:    208(ptr) AccessChain 413(texel) 207
+                              Store 550 549
+             551:         371 Load 373(s2DRectShadow)
+             552:175(f16vec3) Load 177(f16c3)
+             553:   52(float) Load 215(compare)
+             554:6(float16_t) ImageSampleProjDrefImplicitLod 551 552 553
+             555:    208(ptr) AccessChain 413(texel) 207
+             556:6(float16_t) Load 555
+             557:6(float16_t) FAdd 556 554
+             558:    208(ptr) AccessChain 413(texel) 207
+                              Store 558 557
+             559:  7(f16vec4) Load 413(texel)
+                              ReturnValue 559
+                              FunctionEnd
+13(testTextureLod():  7(f16vec4) Function None 8
+              14:             Label
+      562(texel):     64(ptr) Variable Function
+                              Store 562(texel) 121
+             563:         123 Load 125(s1D)
+             564:   52(float) Load 128(c1)
+             566:   52(float) Load 565(lod)
+             567:  7(f16vec4) ImageSampleExplicitLod 563 564 Lod 566
+             568:  7(f16vec4) Load 562(texel)
+             569:  7(f16vec4) FAdd 568 567
+                              Store 562(texel) 569
+             570:         123 Load 125(s1D)
+             571:6(float16_t) Load 135(f16c1)
+             573:6(float16_t) Load 572(f16lod)
+             574:  7(f16vec4) ImageSampleExplicitLod 570 571 Lod 573
+             575:  7(f16vec4) Load 562(texel)
+             576:  7(f16vec4) FAdd 575 574
+                              Store 562(texel) 576
+             577:         143 Load 145(s2D)
+             578:   53(fvec2) Load 148(c2)
+             579:   52(float) Load 565(lod)
+             580:  7(f16vec4) ImageSampleExplicitLod 577 578 Lod 579
+             581:  7(f16vec4) Load 562(texel)
+             582:  7(f16vec4) FAdd 581 580
+                              Store 562(texel) 582
+             583:         143 Load 145(s2D)
+             584:154(f16vec2) Load 156(f16c2)
+             585:6(float16_t) Load 572(f16lod)
+             586:  7(f16vec4) ImageSampleExplicitLod 583 584 Lod 585
+             587:  7(f16vec4) Load 562(texel)
+             588:  7(f16vec4) FAdd 587 586
+                              Store 562(texel) 588
+             589:         163 Load 165(s3D)
+             590:  167(fvec3) Load 169(c3)
+             591:   52(float) Load 565(lod)
+             592:  7(f16vec4) ImageSampleExplicitLod 589 590 Lod 591
+             593:  7(f16vec4) Load 562(texel)
+             594:  7(f16vec4) FAdd 593 592
+                              Store 562(texel) 594
+             595:         163 Load 165(s3D)
+             596:175(f16vec3) Load 177(f16c3)
+             597:6(float16_t) Load 572(f16lod)
+             598:  7(f16vec4) ImageSampleExplicitLod 595 596 Lod 597
+             599:  7(f16vec4) Load 562(texel)
+             600:  7(f16vec4) FAdd 599 598
+                              Store 562(texel) 600
+             601:         184 Load 186(sCube)
+             602:  167(fvec3) Load 169(c3)
+             603:   52(float) Load 565(lod)
+             604:  7(f16vec4) ImageSampleExplicitLod 601 602 Lod 603
+             605:  7(f16vec4) Load 562(texel)
+             606:  7(f16vec4) FAdd 605 604
+                              Store 562(texel) 606
+             607:         184 Load 186(sCube)
+             608:175(f16vec3) Load 177(f16c3)
+             609:6(float16_t) Load 572(f16lod)
+             610:  7(f16vec4) ImageSampleExplicitLod 607 608 Lod 609
+             611:  7(f16vec4) Load 562(texel)
+             612:  7(f16vec4) FAdd 611 610
+                              Store 562(texel) 612
+             613:         199 Load 201(s1DShadow)
+             614:  167(fvec3) Load 169(c3)
+             615:   52(float) Load 565(lod)
+             616:   52(float) CompositeExtract 614 2
+             617:6(float16_t) ImageSampleDrefExplicitLod 613 614 616 Lod 615
+             618:    208(ptr) AccessChain 562(texel) 207
+             619:6(float16_t) Load 618
+             620:6(float16_t) FAdd 619 617
+             621:    208(ptr) AccessChain 562(texel) 207
+                              Store 621 620
+             622:         199 Load 201(s1DShadow)
+             623:154(f16vec2) Load 156(f16c2)
+             624:   52(float) Load 215(compare)
+             625:6(float16_t) Load 572(f16lod)
+             626:6(float16_t) ImageSampleDrefExplicitLod 622 623 624 Lod 625
+             627:    208(ptr) AccessChain 562(texel) 207
+             628:6(float16_t) Load 627
+             629:6(float16_t) FAdd 628 626
+             630:    208(ptr) AccessChain 562(texel) 207
+                              Store 630 629
+             631:         224 Load 226(s2DShadow)
+             632:  167(fvec3) Load 169(c3)
+             633:   52(float) Load 565(lod)
+             634:   52(float) CompositeExtract 632 2
+             635:6(float16_t) ImageSampleDrefExplicitLod 631 632 634 Lod 633
+             636:    208(ptr) AccessChain 562(texel) 207
+             637:6(float16_t) Load 636
+             638:6(float16_t) FAdd 637 635
+             639:    208(ptr) AccessChain 562(texel) 207
+                              Store 639 638
+             640:         224 Load 226(s2DShadow)
+             641:154(f16vec2) Load 156(f16c2)
+             642:   52(float) Load 215(compare)
+             643:6(float16_t) Load 572(f16lod)
+             644:6(float16_t) ImageSampleDrefExplicitLod 640 641 642 Lod 643
+             645:    208(ptr) AccessChain 562(texel) 207
+             646:6(float16_t) Load 645
+             647:6(float16_t) FAdd 646 644
+             648:    208(ptr) AccessChain 562(texel) 207
+                              Store 648 647
+             649:         269 Load 271(s1DArray)
+             650:   53(fvec2) Load 148(c2)
+             651:   52(float) Load 565(lod)
+             652:  7(f16vec4) ImageSampleExplicitLod 649 650 Lod 651
+             653:  7(f16vec4) Load 562(texel)
+             654:  7(f16vec4) FAdd 653 652
+                              Store 562(texel) 654
+             655:         269 Load 271(s1DArray)
+             656:154(f16vec2) Load 156(f16c2)
+             657:6(float16_t) Load 572(f16lod)
+             658:  7(f16vec4) ImageSampleExplicitLod 655 656 Lod 657
+             659:  7(f16vec4) Load 562(texel)
+             660:  7(f16vec4) FAdd 659 658
+                              Store 562(texel) 660
+             661:         284 Load 286(s2DArray)
+             662:  167(fvec3) Load 169(c3)
+             663:   52(float) Load 565(lod)
+             664:  7(f16vec4) ImageSampleExplicitLod 661 662 Lod 663
+             665:  7(f16vec4) Load 562(texel)
+             666:  7(f16vec4) FAdd 665 664
+                              Store 562(texel) 666
+             667:         284 Load 286(s2DArray)
+             668:175(f16vec3) Load 177(f16c3)
+             669:6(float16_t) Load 572(f16lod)
+             670:  7(f16vec4) ImageSampleExplicitLod 667 668 Lod 669
+             671:  7(f16vec4) Load 562(texel)
+             672:  7(f16vec4) FAdd 671 670
+                              Store 562(texel) 672
+             673:         316 Load 318(s1DArrayShadow)
+             674:  167(fvec3) Load 169(c3)
+             675:   52(float) Load 565(lod)
+             676:   52(float) CompositeExtract 674 2
+             677:6(float16_t) ImageSampleDrefExplicitLod 673 674 676 Lod 675
+             678:    208(ptr) AccessChain 562(texel) 207
+             679:6(float16_t) Load 678
+             680:6(float16_t) FAdd 679 677
+             681:    208(ptr) AccessChain 562(texel) 207
+                              Store 681 680
+             682:         316 Load 318(s1DArrayShadow)
+             683:154(f16vec2) Load 156(f16c2)
+             684:   52(float) Load 215(compare)
+             685:6(float16_t) Load 572(f16lod)
+             686:6(float16_t) ImageSampleDrefExplicitLod 682 683 684 Lod 685
+             687:    208(ptr) AccessChain 562(texel) 207
+             688:6(float16_t) Load 687
+             689:6(float16_t) FAdd 688 686
+             690:    208(ptr) AccessChain 562(texel) 207
+                              Store 690 689
+             691:         299 Load 301(sCubeArray)
+             692:  249(fvec4) Load 251(c4)
+             693:   52(float) Load 565(lod)
+             694:  7(f16vec4) ImageSampleExplicitLod 691 692 Lod 693
+             695:  7(f16vec4) Load 562(texel)
+             696:  7(f16vec4) FAdd 695 694
+                              Store 562(texel) 696
+             697:         299 Load 301(sCubeArray)
+             698:  7(f16vec4) Load 309(f16c4)
+             699:6(float16_t) Load 572(f16lod)
+             700:  7(f16vec4) ImageSampleExplicitLod 697 698 Lod 699
+             701:  7(f16vec4) Load 562(texel)
+             702:  7(f16vec4) FAdd 701 700
+                              Store 562(texel) 702
+             703:  7(f16vec4) Load 562(texel)
+                              ReturnValue 703
+                              FunctionEnd
+15(testTextureOffset():  7(f16vec4) Function None 8
+              16:             Label
+      706(texel):     64(ptr) Variable Function
+                              Store 706(texel) 121
+             707:         123 Load 125(s1D)
+             708:   52(float) Load 128(c1)
+             710:  7(f16vec4) ImageSampleImplicitLod 707 708 ConstOffset 709
+             711:  7(f16vec4) Load 706(texel)
+             712:  7(f16vec4) FAdd 711 710
+                              Store 706(texel) 712
+             713:         123 Load 125(s1D)
+             714:6(float16_t) Load 135(f16c1)
+             715:6(float16_t) Load 137(f16bias)
+             716:  7(f16vec4) ImageSampleImplicitLod 713 714 Bias ConstOffset 715 709
+             717:  7(f16vec4) Load 706(texel)
+             718:  7(f16vec4) FAdd 717 716
+                              Store 706(texel) 718
+             719:         143 Load 145(s2D)
+             720:   53(fvec2) Load 148(c2)
+             723:  7(f16vec4) ImageSampleImplicitLod 719 720 ConstOffset 722
+             724:  7(f16vec4) Load 706(texel)
+             725:  7(f16vec4) FAdd 724 723
+                              Store 706(texel) 725
+             726:         143 Load 145(s2D)
+             727:154(f16vec2) Load 156(f16c2)
+             728:6(float16_t) Load 137(f16bias)
+             729:  7(f16vec4) ImageSampleImplicitLod 726 727 Bias ConstOffset 728 722
+             730:  7(f16vec4) Load 706(texel)
+             731:  7(f16vec4) FAdd 730 729
+                              Store 706(texel) 731
+             732:         163 Load 165(s3D)
+             733:  167(fvec3) Load 169(c3)
+             736:  7(f16vec4) ImageSampleImplicitLod 732 733 ConstOffset 735
+             737:  7(f16vec4) Load 706(texel)
+             738:  7(f16vec4) FAdd 737 736
+                              Store 706(texel) 738
+             739:         163 Load 165(s3D)
+             740:175(f16vec3) Load 177(f16c3)
+             741:6(float16_t) Load 137(f16bias)
+             742:  7(f16vec4) ImageSampleImplicitLod 739 740 Bias ConstOffset 741 735
+             743:  7(f16vec4) Load 706(texel)
+             744:  7(f16vec4) FAdd 743 742
+                              Store 706(texel) 744
+             745:         357 Load 359(s2DRect)
+             746:   53(fvec2) Load 148(c2)
+             747:  7(f16vec4) ImageSampleImplicitLod 745 746 ConstOffset 722
+             748:  7(f16vec4) Load 706(texel)
+             749:  7(f16vec4) FAdd 748 747
+                              Store 706(texel) 749
+             750:         357 Load 359(s2DRect)
+             751:154(f16vec2) Load 156(f16c2)
+             752:  7(f16vec4) ImageSampleImplicitLod 750 751 ConstOffset 722
+             753:  7(f16vec4) Load 706(texel)
+             754:  7(f16vec4) FAdd 753 752
+                              Store 706(texel) 754
+             755:         371 Load 373(s2DRectShadow)
+             756:  167(fvec3) Load 169(c3)
+             757:   52(float) CompositeExtract 756 2
+             758:6(float16_t) ImageSampleDrefImplicitLod 755 756 757 ConstOffset 722
+             759:    208(ptr) AccessChain 706(texel) 207
+             760:6(float16_t) Load 759
+             761:6(float16_t) FAdd 760 758
+             762:    208(ptr) AccessChain 706(texel) 207
+                              Store 762 761
+             763:         371 Load 373(s2DRectShadow)
+             764:154(f16vec2) Load 156(f16c2)
+             765:   52(float) Load 215(compare)
+             766:6(float16_t) ImageSampleDrefImplicitLod 763 764 765 ConstOffset 722
+             767:    208(ptr) AccessChain 706(texel) 207
+             768:6(float16_t) Load 767
+             769:6(float16_t) FAdd 768 766
+             770:    208(ptr) AccessChain 706(texel) 207
+                              Store 770 769
+             771:         199 Load 201(s1DShadow)
+             772:  167(fvec3) Load 169(c3)
+             773:   52(float) CompositeExtract 772 2
+             774:6(float16_t) ImageSampleDrefImplicitLod 771 772 773 ConstOffset 709
+             775:    208(ptr) AccessChain 706(texel) 207
+             776:6(float16_t) Load 775
+             777:6(float16_t) FAdd 776 774
+             778:    208(ptr) AccessChain 706(texel) 207
+                              Store 778 777
+             779:         199 Load 201(s1DShadow)
+             780:154(f16vec2) Load 156(f16c2)
+             781:   52(float) Load 215(compare)
+             782:6(float16_t) Load 137(f16bias)
+             783:6(float16_t) ImageSampleDrefImplicitLod 779 780 781 Bias ConstOffset 782 709
+             784:    208(ptr) AccessChain 706(texel) 207
+             785:6(float16_t) Load 784
+             786:6(float16_t) FAdd 785 783
+             787:    208(ptr) AccessChain 706(texel) 207
+                              Store 787 786
+             788:         224 Load 226(s2DShadow)
+             789:  167(fvec3) Load 169(c3)
+             790:   52(float) CompositeExtract 789 2
+             791:6(float16_t) ImageSampleDrefImplicitLod 788 789 790 ConstOffset 722
+             792:    208(ptr) AccessChain 706(texel) 207
+             793:6(float16_t) Load 792
+             794:6(float16_t) FAdd 793 791
+             795:    208(ptr) AccessChain 706(texel) 207
+                              Store 795 794
+             796:         224 Load 226(s2DShadow)
+             797:154(f16vec2) Load 156(f16c2)
+             798:   52(float) Load 215(compare)
+             799:6(float16_t) Load 137(f16bias)
+             800:6(float16_t) ImageSampleDrefImplicitLod 796 797 798 Bias ConstOffset 799 722
+             801:    208(ptr) AccessChain 706(texel) 207
+             802:6(float16_t) Load 801
+             803:6(float16_t) FAdd 802 800
+             804:    208(ptr) AccessChain 706(texel) 207
+                              Store 804 803
+             805:         269 Load 271(s1DArray)
+             806:   53(fvec2) Load 148(c2)
+             807:  7(f16vec4) ImageSampleImplicitLod 805 806 ConstOffset 709
+             808:  7(f16vec4) Load 706(texel)
+             809:  7(f16vec4) FAdd 808 807
+                              Store 706(texel) 809
+             810:         269 Load 271(s1DArray)
+             811:154(f16vec2) Load 156(f16c2)
+             812:6(float16_t) Load 137(f16bias)
+             813:  7(f16vec4) ImageSampleImplicitLod 810 811 Bias ConstOffset 812 709
+             814:  7(f16vec4) Load 706(texel)
+             815:  7(f16vec4) FAdd 814 813
+                              Store 706(texel) 815
+             816:         284 Load 286(s2DArray)
+             817:  167(fvec3) Load 169(c3)
+             818:  7(f16vec4) ImageSampleImplicitLod 816 817 ConstOffset 722
+             819:  7(f16vec4) Load 706(texel)
+             820:  7(f16vec4) FAdd 819 818
+                              Store 706(texel) 820
+             821:         284 Load 286(s2DArray)
+             822:175(f16vec3) Load 177(f16c3)
+             823:6(float16_t) Load 137(f16bias)
+             824:  7(f16vec4) ImageSampleImplicitLod 821 822 Bias ConstOffset 823 722
+             825:  7(f16vec4) Load 706(texel)
+             826:  7(f16vec4) FAdd 825 824
+                              Store 706(texel) 826
+             827:         316 Load 318(s1DArrayShadow)
+             828:  167(fvec3) Load 169(c3)
+             829:   52(float) CompositeExtract 828 2
+             830:6(float16_t) ImageSampleDrefImplicitLod 827 828 829 ConstOffset 709
+             831:    208(ptr) AccessChain 706(texel) 207
+             832:6(float16_t) Load 831
+             833:6(float16_t) FAdd 832 830
+             834:    208(ptr) AccessChain 706(texel) 207
+                              Store 834 833
+             835:         316 Load 318(s1DArrayShadow)
+             836:154(f16vec2) Load 156(f16c2)
+             837:   52(float) Load 215(compare)
+             838:6(float16_t) Load 137(f16bias)
+             839:6(float16_t) ImageSampleDrefImplicitLod 835 836 837 Bias ConstOffset 838 709
+             840:    208(ptr) AccessChain 706(texel) 207
+             841:6(float16_t) Load 840
+             842:6(float16_t) FAdd 841 839
+             843:    208(ptr) AccessChain 706(texel) 207
+                              Store 843 842
+             844:         337 Load 339(s2DArrayShadow)
+             845:  249(fvec4) Load 251(c4)
+             846:   52(float) CompositeExtract 845 3
+             847:6(float16_t) ImageSampleDrefImplicitLod 844 845 846 ConstOffset 722
+             848:    208(ptr) AccessChain 706(texel) 207
+             849:6(float16_t) Load 848
+             850:6(float16_t) FAdd 849 847
+             851:    208(ptr) AccessChain 706(texel) 207
+                              Store 851 850
+             852:         337 Load 339(s2DArrayShadow)
+             853:175(f16vec3) Load 177(f16c3)
+             854:   52(float) Load 215(compare)
+             855:6(float16_t) ImageSampleDrefImplicitLod 852 853 854 ConstOffset 722
+             856:    208(ptr) AccessChain 706(texel) 207
+             857:6(float16_t) Load 856
+             858:6(float16_t) FAdd 857 855
+             859:    208(ptr) AccessChain 706(texel) 207
+                              Store 859 858
+             860:  7(f16vec4) Load 706(texel)
+                              ReturnValue 860
+                              FunctionEnd
+17(testTextureProjOffset():  7(f16vec4) Function None 8
+              18:             Label
+      863(texel):     64(ptr) Variable Function
+                              Store 863(texel) 121
+             864:         123 Load 125(s1D)
+             865:   53(fvec2) Load 148(c2)
+             866:  7(f16vec4) ImageSampleProjImplicitLod 864 865 ConstOffset 709
+             867:  7(f16vec4) Load 863(texel)
+             868:  7(f16vec4) FAdd 867 866
+                              Store 863(texel) 868
+             869:         123 Load 125(s1D)
+             870:154(f16vec2) Load 156(f16c2)
+             871:6(float16_t) Load 137(f16bias)
+             872:  7(f16vec4) ImageSampleProjImplicitLod 869 870 Bias ConstOffset 871 709
+             873:  7(f16vec4) Load 863(texel)
+             874:  7(f16vec4) FAdd 873 872
+                              Store 863(texel) 874
+             875:         123 Load 125(s1D)
+             876:  249(fvec4) Load 251(c4)
+             877:   52(float) CompositeExtract 876 3
+             878:  249(fvec4) CompositeInsert 877 876 1
+             879:  7(f16vec4) ImageSampleProjImplicitLod 875 878 ConstOffset 709
+             880:  7(f16vec4) Load 863(texel)
+             881:  7(f16vec4) FAdd 880 879
+                              Store 863(texel) 881
+             882:         123 Load 125(s1D)
+             883:  7(f16vec4) Load 309(f16c4)
+             884:6(float16_t) Load 137(f16bias)
+             885:6(float16_t) CompositeExtract 883 3
+             886:  7(f16vec4) CompositeInsert 885 883 1
+             887:  7(f16vec4) ImageSampleProjImplicitLod 882 886 Bias ConstOffset 884 709
+             888:  7(f16vec4) Load 863(texel)
+             889:  7(f16vec4) FAdd 888 887
+                              Store 863(texel) 889
+             890:         143 Load 145(s2D)
+             891:  167(fvec3) Load 169(c3)
+             892:  7(f16vec4) ImageSampleProjImplicitLod 890 891 ConstOffset 722
+             893:  7(f16vec4) Load 863(texel)
+             894:  7(f16vec4) FAdd 893 892
+                              Store 863(texel) 894
+             895:         143 Load 145(s2D)
+             896:175(f16vec3) Load 177(f16c3)
+             897:6(float16_t) Load 137(f16bias)
+             898:  7(f16vec4) ImageSampleProjImplicitLod 895 896 Bias ConstOffset 897 722
+             899:  7(f16vec4) Load 863(texel)
+             900:  7(f16vec4) FAdd 899 898
+                              Store 863(texel) 900
+             901:         143 Load 145(s2D)
+             902:  249(fvec4) Load 251(c4)
+             903:   52(float) CompositeExtract 902 3
+             904:  249(fvec4) CompositeInsert 903 902 2
+             905:  7(f16vec4) ImageSampleProjImplicitLod 901 904 ConstOffset 722
+             906:  7(f16vec4) Load 863(texel)
+             907:  7(f16vec4) FAdd 906 905
+                              Store 863(texel) 907
+             908:         143 Load 145(s2D)
+             909:  7(f16vec4) Load 309(f16c4)
+             910:6(float16_t) Load 137(f16bias)
+             911:6(float16_t) CompositeExtract 909 3
+             912:  7(f16vec4) CompositeInsert 911 909 2
+             913:  7(f16vec4) ImageSampleProjImplicitLod 908 912 Bias ConstOffset 910 722
+             914:  7(f16vec4) Load 863(texel)
+             915:  7(f16vec4) FAdd 914 913
+                              Store 863(texel) 915
+             916:         163 Load 165(s3D)
+             917:  249(fvec4) Load 251(c4)
+             918:  7(f16vec4) ImageSampleProjImplicitLod 916 917 ConstOffset 735
+             919:  7(f16vec4) Load 863(texel)
+             920:  7(f16vec4) FAdd 919 918
+                              Store 863(texel) 920
+             921:         163 Load 165(s3D)
+             922:  7(f16vec4) Load 309(f16c4)
+             923:6(float16_t) Load 137(f16bias)
+             924:  7(f16vec4) ImageSampleProjImplicitLod 921 922 Bias ConstOffset 923 735
+             925:  7(f16vec4) Load 863(texel)
+             926:  7(f16vec4) FAdd 925 924
+                              Store 863(texel) 926
+             927:         357 Load 359(s2DRect)
+             928:  167(fvec3) Load 169(c3)
+             929:  7(f16vec4) ImageSampleProjImplicitLod 927 928 ConstOffset 722
+             930:  7(f16vec4) Load 863(texel)
+             931:  7(f16vec4) FAdd 930 929
+                              Store 863(texel) 931
+             932:         357 Load 359(s2DRect)
+             933:175(f16vec3) Load 177(f16c3)
+             934:  7(f16vec4) ImageSampleProjImplicitLod 932 933 ConstOffset 722
+             935:  7(f16vec4) Load 863(texel)
+             936:  7(f16vec4) FAdd 935 934
+                              Store 863(texel) 936
+             937:         357 Load 359(s2DRect)
+             938:  249(fvec4) Load 251(c4)
+             939:   52(float) CompositeExtract 938 3
+             940:  249(fvec4) CompositeInsert 939 938 2
+             941:  7(f16vec4) ImageSampleProjImplicitLod 937 940 ConstOffset 722
+             942:  7(f16vec4) Load 863(texel)
+             943:  7(f16vec4) FAdd 942 941
+                              Store 863(texel) 943
+             944:         357 Load 359(s2DRect)
+             945:  7(f16vec4) Load 309(f16c4)
+             946:6(float16_t) CompositeExtract 945 3
+             947:  7(f16vec4) CompositeInsert 946 945 2
+             948:  7(f16vec4) ImageSampleProjImplicitLod 944 947 ConstOffset 722
+             949:  7(f16vec4) Load 863(texel)
+             950:  7(f16vec4) FAdd 949 948
+                              Store 863(texel) 950
+             951:         371 Load 373(s2DRectShadow)
+             952:  249(fvec4) Load 251(c4)
+             953:   52(float) CompositeExtract 952 2
+             954:   52(float) CompositeExtract 952 3
+             955:  249(fvec4) CompositeInsert 954 952 2
+             956:6(float16_t) ImageSampleProjDrefImplicitLod 951 955 953 ConstOffset 722
+             957:    208(ptr) AccessChain 863(texel) 207
+             958:6(float16_t) Load 957
+             959:6(float16_t) FAdd 958 956
+             960:    208(ptr) AccessChain 863(texel) 207
+                              Store 960 959
+             961:         371 Load 373(s2DRectShadow)
+             962:175(f16vec3) Load 177(f16c3)
+             963:   52(float) Load 215(compare)
+             964:6(float16_t) ImageSampleProjDrefImplicitLod 961 962 963 ConstOffset 722
+             965:    208(ptr) AccessChain 863(texel) 207
+             966:6(float16_t) Load 965
+             967:6(float16_t) FAdd 966 964
+             968:    208(ptr) AccessChain 863(texel) 207
+                              Store 968 967
+             969:         199 Load 201(s1DShadow)
+             970:  249(fvec4) Load 251(c4)
+             971:   52(float) CompositeExtract 970 2
+             972:   52(float) CompositeExtract 970 3
+             973:  249(fvec4) CompositeInsert 972 970 1
+             974:6(float16_t) ImageSampleProjDrefImplicitLod 969 973 971 ConstOffset 709
+             975:    208(ptr) AccessChain 863(texel) 207
+             976:6(float16_t) Load 975
+             977:6(float16_t) FAdd 976 974
+             978:    208(ptr) AccessChain 863(texel) 207
+                              Store 978 977
+             979:         199 Load 201(s1DShadow)
+             980:175(f16vec3) Load 177(f16c3)
+             981:   52(float) Load 215(compare)
+             982:6(float16_t) Load 137(f16bias)
+             983:6(float16_t) CompositeExtract 980 2
+             984:175(f16vec3) CompositeInsert 983 980 1
+             985:6(float16_t) ImageSampleProjDrefImplicitLod 979 984 981 Bias ConstOffset 982 709
+             986:    208(ptr) AccessChain 863(texel) 207
+             987:6(float16_t) Load 986
+             988:6(float16_t) FAdd 987 985
+             989:    208(ptr) AccessChain 863(texel) 207
+                              Store 989 988
+             990:         224 Load 226(s2DShadow)
+             991:  249(fvec4) Load 251(c4)
+             992:   52(float) CompositeExtract 991 2
+             993:   52(float) CompositeExtract 991 3
+             994:  249(fvec4) CompositeInsert 993 991 2
+             995:6(float16_t) ImageSampleProjDrefImplicitLod 990 994 992 ConstOffset 722
+             996:    208(ptr) AccessChain 863(texel) 207
+             997:6(float16_t) Load 996
+             998:6(float16_t) FAdd 997 995
+             999:    208(ptr) AccessChain 863(texel) 207
+                              Store 999 998
+            1000:         224 Load 226(s2DShadow)
+            1001:175(f16vec3) Load 177(f16c3)
+            1002:   52(float) Load 215(compare)
+            1003:6(float16_t) Load 137(f16bias)
+            1004:6(float16_t) ImageSampleProjDrefImplicitLod 1000 1001 1002 Bias ConstOffset 1003 722
+            1005:    208(ptr) AccessChain 863(texel) 207
+            1006:6(float16_t) Load 1005
+            1007:6(float16_t) FAdd 1006 1004
+            1008:    208(ptr) AccessChain 863(texel) 207
+                              Store 1008 1007
+            1009:  7(f16vec4) Load 863(texel)
+                              ReturnValue 1009
+                              FunctionEnd
+19(testTextureLodOffset():  7(f16vec4) Function None 8
+              20:             Label
+     1012(texel):     64(ptr) Variable Function
+                              Store 1012(texel) 121
+            1013:         123 Load 125(s1D)
+            1014:   52(float) Load 128(c1)
+            1015:   52(float) Load 565(lod)
+            1016:  7(f16vec4) ImageSampleExplicitLod 1013 1014 Lod ConstOffset 1015 709
+            1017:  7(f16vec4) Load 1012(texel)
+            1018:  7(f16vec4) FAdd 1017 1016
+                              Store 1012(texel) 1018
+            1019:         123 Load 125(s1D)
+            1020:6(float16_t) Load 135(f16c1)
+            1021:6(float16_t) Load 572(f16lod)
+            1022:  7(f16vec4) ImageSampleExplicitLod 1019 1020 Lod ConstOffset 1021 709
+            1023:  7(f16vec4) Load 1012(texel)
+            1024:  7(f16vec4) FAdd 1023 1022
+                              Store 1012(texel) 1024
+            1025:         143 Load 145(s2D)
+            1026:   53(fvec2) Load 148(c2)
+            1027:   52(float) Load 565(lod)
+            1028:  7(f16vec4) ImageSampleExplicitLod 1025 1026 Lod ConstOffset 1027 722
+            1029:  7(f16vec4) Load 1012(texel)
+            1030:  7(f16vec4) FAdd 1029 1028
+                              Store 1012(texel) 1030
+            1031:         143 Load 145(s2D)
+            1032:154(f16vec2) Load 156(f16c2)
+            1033:6(float16_t) Load 572(f16lod)
+            1034:  7(f16vec4) ImageSampleExplicitLod 1031 1032 Lod ConstOffset 1033 722
+            1035:  7(f16vec4) Load 1012(texel)
+            1036:  7(f16vec4) FAdd 1035 1034
+                              Store 1012(texel) 1036
+            1037:         163 Load 165(s3D)
+            1038:  167(fvec3) Load 169(c3)
+            1039:   52(float) Load 565(lod)
+            1040:  7(f16vec4) ImageSampleExplicitLod 1037 1038 Lod ConstOffset 1039 735
+            1041:  7(f16vec4) Load 1012(texel)
+            1042:  7(f16vec4) FAdd 1041 1040
+                              Store 1012(texel) 1042
+            1043:         163 Load 165(s3D)
+            1044:175(f16vec3) Load 177(f16c3)
+            1045:6(float16_t) Load 572(f16lod)
+            1046:  7(f16vec4) ImageSampleExplicitLod 1043 1044 Lod ConstOffset 1045 735
+            1047:  7(f16vec4) Load 1012(texel)
+            1048:  7(f16vec4) FAdd 1047 1046
+                              Store 1012(texel) 1048
+            1049:         199 Load 201(s1DShadow)
+            1050:  167(fvec3) Load 169(c3)
+            1051:   52(float) Load 565(lod)
+            1052:   52(float) CompositeExtract 1050 2
+            1053:6(float16_t) ImageSampleDrefExplicitLod 1049 1050 1052 Lod ConstOffset 1051 709
+            1054:    208(ptr) AccessChain 1012(texel) 207
+            1055:6(float16_t) Load 1054
+            1056:6(float16_t) FAdd 1055 1053
+            1057:    208(ptr) AccessChain 1012(texel) 207
+                              Store 1057 1056
+            1058:         199 Load 201(s1DShadow)
+            1059:154(f16vec2) Load 156(f16c2)
+            1060:   52(float) Load 215(compare)
+            1061:6(float16_t) Load 572(f16lod)
+            1062:6(float16_t) ImageSampleDrefExplicitLod 1058 1059 1060 Lod ConstOffset 1061 709
+            1063:    208(ptr) AccessChain 1012(texel) 207
+            1064:6(float16_t) Load 1063
+            1065:6(float16_t) FAdd 1064 1062
+            1066:    208(ptr) AccessChain 1012(texel) 207
+                              Store 1066 1065
+            1067:         224 Load 226(s2DShadow)
+            1068:  167(fvec3) Load 169(c3)
+            1069:   52(float) Load 565(lod)
+            1070:   52(float) CompositeExtract 1068 2
+            1071:6(float16_t) ImageSampleDrefExplicitLod 1067 1068 1070 Lod ConstOffset 1069 722
+            1072:    208(ptr) AccessChain 1012(texel) 207
+            1073:6(float16_t) Load 1072
+            1074:6(float16_t) FAdd 1073 1071
+            1075:    208(ptr) AccessChain 1012(texel) 207
+                              Store 1075 1074
+            1076:         224 Load 226(s2DShadow)
+            1077:154(f16vec2) Load 156(f16c2)
+            1078:   52(float) Load 215(compare)
+            1079:6(float16_t) Load 572(f16lod)
+            1080:6(float16_t) ImageSampleDrefExplicitLod 1076 1077 1078 Lod ConstOffset 1079 722
+            1081:    208(ptr) AccessChain 1012(texel) 207
+            1082:6(float16_t) Load 1081
+            1083:6(float16_t) FAdd 1082 1080
+            1084:    208(ptr) AccessChain 1012(texel) 207
+                              Store 1084 1083
+            1085:         269 Load 271(s1DArray)
+            1086:   53(fvec2) Load 148(c2)
+            1087:   52(float) Load 565(lod)
+            1088:  7(f16vec4) ImageSampleExplicitLod 1085 1086 Lod ConstOffset 1087 709
+            1089:  7(f16vec4) Load 1012(texel)
+            1090:  7(f16vec4) FAdd 1089 1088
+                              Store 1012(texel) 1090
+            1091:         269 Load 271(s1DArray)
+            1092:154(f16vec2) Load 156(f16c2)
+            1093:6(float16_t) Load 572(f16lod)
+            1094:  7(f16vec4) ImageSampleExplicitLod 1091 1092 Lod ConstOffset 1093 709
+            1095:  7(f16vec4) Load 1012(texel)
+            1096:  7(f16vec4) FAdd 1095 1094
+                              Store 1012(texel) 1096
+            1097:         284 Load 286(s2DArray)
+            1098:  167(fvec3) Load 169(c3)
+            1099:   52(float) Load 565(lod)
+            1100:  7(f16vec4) ImageSampleExplicitLod 1097 1098 Lod ConstOffset 1099 722
+            1101:  7(f16vec4) Load 1012(texel)
+            1102:  7(f16vec4) FAdd 1101 1100
+                              Store 1012(texel) 1102
+            1103:         284 Load 286(s2DArray)
+            1104:175(f16vec3) Load 177(f16c3)
+            1105:6(float16_t) Load 572(f16lod)
+            1106:  7(f16vec4) ImageSampleExplicitLod 1103 1104 Lod ConstOffset 1105 722
+            1107:  7(f16vec4) Load 1012(texel)
+            1108:  7(f16vec4) FAdd 1107 1106
+                              Store 1012(texel) 1108
+            1109:         316 Load 318(s1DArrayShadow)
+            1110:  167(fvec3) Load 169(c3)
+            1111:   52(float) Load 565(lod)
+            1112:   52(float) CompositeExtract 1110 2
+            1113:6(float16_t) ImageSampleDrefExplicitLod 1109 1110 1112 Lod ConstOffset 1111 709
+            1114:    208(ptr) AccessChain 1012(texel) 207
+            1115:6(float16_t) Load 1114
+            1116:6(float16_t) FAdd 1115 1113
+            1117:    208(ptr) AccessChain 1012(texel) 207
+                              Store 1117 1116
+            1118:         316 Load 318(s1DArrayShadow)
+            1119:154(f16vec2) Load 156(f16c2)
+            1120:   52(float) Load 215(compare)
+            1121:6(float16_t) Load 572(f16lod)
+            1122:6(float16_t) ImageSampleDrefExplicitLod 1118 1119 1120 Lod ConstOffset 1121 709
+            1123:    208(ptr) AccessChain 1012(texel) 207
+            1124:6(float16_t) Load 1123
+            1125:6(float16_t) FAdd 1124 1122
+            1126:    208(ptr) AccessChain 1012(texel) 207
+                              Store 1126 1125
+            1127:  7(f16vec4) Load 1012(texel)
+                              ReturnValue 1127
+                              FunctionEnd
+21(testTextureProjLodOffset():  7(f16vec4) Function None 8
+              22:             Label
+     1130(texel):     64(ptr) Variable Function
+                              Store 1130(texel) 121
+            1131:         123 Load 125(s1D)
+            1132:   53(fvec2) Load 148(c2)
+            1133:   52(float) Load 565(lod)
+            1134:  7(f16vec4) ImageSampleProjExplicitLod 1131 1132 Lod ConstOffset 1133 709
+            1135:  7(f16vec4) Load 1130(texel)
+            1136:  7(f16vec4) FAdd 1135 1134
+                              Store 1130(texel) 1136
+            1137:         123 Load 125(s1D)
+            1138:154(f16vec2) Load 156(f16c2)
+            1139:6(float16_t) Load 572(f16lod)
+            1140:  7(f16vec4) ImageSampleProjExplicitLod 1137 1138 Lod ConstOffset 1139 709
+            1141:  7(f16vec4) Load 1130(texel)
+            1142:  7(f16vec4) FAdd 1141 1140
+                              Store 1130(texel) 1142
+            1143:         123 Load 125(s1D)
+            1144:  249(fvec4) Load 251(c4)
+            1145:   52(float) Load 565(lod)
+            1146:   52(float) CompositeExtract 1144 3
+            1147:  249(fvec4) CompositeInsert 1146 1144 1
+            1148:  7(f16vec4) ImageSampleProjExplicitLod 1143 1147 Lod ConstOffset 1145 709
+            1149:  7(f16vec4) Load 1130(texel)
+            1150:  7(f16vec4) FAdd 1149 1148
+                              Store 1130(texel) 1150
+            1151:         123 Load 125(s1D)
+            1152:  7(f16vec4) Load 309(f16c4)
+            1153:6(float16_t) Load 572(f16lod)
+            1154:6(float16_t) CompositeExtract 1152 3
+            1155:  7(f16vec4) CompositeInsert 1154 1152 1
+            1156:  7(f16vec4) ImageSampleProjExplicitLod 1151 1155 Lod ConstOffset 1153 709
+            1157:  7(f16vec4) Load 1130(texel)
+            1158:  7(f16vec4) FAdd 1157 1156
+                              Store 1130(texel) 1158
+            1159:         143 Load 145(s2D)
+            1160:  167(fvec3) Load 169(c3)
+            1161:   52(float) Load 565(lod)
+            1162:  7(f16vec4) ImageSampleProjExplicitLod 1159 1160 Lod ConstOffset 1161 722
+            1163:  7(f16vec4) Load 1130(texel)
+            1164:  7(f16vec4) FAdd 1163 1162
+                              Store 1130(texel) 1164
+            1165:         143 Load 145(s2D)
+            1166:175(f16vec3) Load 177(f16c3)
+            1167:6(float16_t) Load 572(f16lod)
+            1168:  7(f16vec4) ImageSampleProjExplicitLod 1165 1166 Lod ConstOffset 1167 722
+            1169:  7(f16vec4) Load 1130(texel)
+            1170:  7(f16vec4) FAdd 1169 1168
+                              Store 1130(texel) 1170
+            1171:         143 Load 145(s2D)
+            1172:  249(fvec4) Load 251(c4)
+            1173:   52(float) Load 565(lod)
+            1174:   52(float) CompositeExtract 1172 3
+            1175:  249(fvec4) CompositeInsert 1174 1172 2
+            1176:  7(f16vec4) ImageSampleProjExplicitLod 1171 1175 Lod ConstOffset 1173 722
+            1177:  7(f16vec4) Load 1130(texel)
+            1178:  7(f16vec4) FAdd 1177 1176
+                              Store 1130(texel) 1178
+            1179:         143 Load 145(s2D)
+            1180:  7(f16vec4) Load 309(f16c4)
+            1181:6(float16_t) Load 572(f16lod)
+            1182:6(float16_t) CompositeExtract 1180 3
+            1183:  7(f16vec4) CompositeInsert 1182 1180 2
+            1184:  7(f16vec4) ImageSampleProjExplicitLod 1179 1183 Lod ConstOffset 1181 722
+            1185:  7(f16vec4) Load 1130(texel)
+            1186:  7(f16vec4) FAdd 1185 1184
+                              Store 1130(texel) 1186
+            1187:         163 Load 165(s3D)
+            1188:  249(fvec4) Load 251(c4)
+            1189:   52(float) Load 565(lod)
+            1190:  7(f16vec4) ImageSampleProjExplicitLod 1187 1188 Lod ConstOffset 1189 735
+            1191:  7(f16vec4) Load 1130(texel)
+            1192:  7(f16vec4) FAdd 1191 1190
+                              Store 1130(texel) 1192
+            1193:         163 Load 165(s3D)
+            1194:  7(f16vec4) Load 309(f16c4)
+            1195:6(float16_t) Load 572(f16lod)
+            1196:  7(f16vec4) ImageSampleProjExplicitLod 1193 1194 Lod ConstOffset 1195 735
+            1197:  7(f16vec4) Load 1130(texel)
+            1198:  7(f16vec4) FAdd 1197 1196
+                              Store 1130(texel) 1198
+            1199:         199 Load 201(s1DShadow)
+            1200:  249(fvec4) Load 251(c4)
+            1201:   52(float) Load 565(lod)
+            1202:   52(float) CompositeExtract 1200 2
+            1203:   52(float) CompositeExtract 1200 3
+            1204:  249(fvec4) CompositeInsert 1203 1200 1
+            1205:6(float16_t) ImageSampleProjDrefExplicitLod 1199 1204 1202 Lod ConstOffset 1201 709
+            1206:    208(ptr) AccessChain 1130(texel) 207
+            1207:6(float16_t) Load 1206
+            1208:6(float16_t) FAdd 1207 1205
+            1209:    208(ptr) AccessChain 1130(texel) 207
+                              Store 1209 1208
+            1210:         199 Load 201(s1DShadow)
+            1211:175(f16vec3) Load 177(f16c3)
+            1212:   52(float) Load 215(compare)
+            1213:6(float16_t) Load 572(f16lod)
+            1214:6(float16_t) CompositeExtract 1211 2
+            1215:175(f16vec3) CompositeInsert 1214 1211 1
+            1216:6(float16_t) ImageSampleProjDrefExplicitLod 1210 1215 1212 Lod ConstOffset 1213 709
+            1217:    208(ptr) AccessChain 1130(texel) 207
+            1218:6(float16_t) Load 1217
+            1219:6(float16_t) FAdd 1218 1216
+            1220:    208(ptr) AccessChain 1130(texel) 207
+                              Store 1220 1219
+            1221:         224 Load 226(s2DShadow)
+            1222:  249(fvec4) Load 251(c4)
+            1223:   52(float) Load 565(lod)
+            1224:   52(float) CompositeExtract 1222 2
+            1225:   52(float) CompositeExtract 1222 3
+            1226:  249(fvec4) CompositeInsert 1225 1222 2
+            1227:6(float16_t) ImageSampleProjDrefExplicitLod 1221 1226 1224 Lod ConstOffset 1223 722
+            1228:    208(ptr) AccessChain 1130(texel) 207
+            1229:6(float16_t) Load 1228
+            1230:6(float16_t) FAdd 1229 1227
+            1231:    208(ptr) AccessChain 1130(texel) 207
+                              Store 1231 1230
+            1232:         224 Load 226(s2DShadow)
+            1233:175(f16vec3) Load 177(f16c3)
+            1234:   52(float) Load 215(compare)
+            1235:6(float16_t) Load 572(f16lod)
+            1236:6(float16_t) ImageSampleProjDrefExplicitLod 1232 1233 1234 Lod ConstOffset 1235 722
+            1237:    208(ptr) AccessChain 1130(texel) 207
+            1238:6(float16_t) Load 1237
+            1239:6(float16_t) FAdd 1238 1236
+            1240:    208(ptr) AccessChain 1130(texel) 207
+                              Store 1240 1239
+            1241:  7(f16vec4) Load 1130(texel)
+                              ReturnValue 1241
+                              FunctionEnd
+23(testTexelFetch():  7(f16vec4) Function None 8
+              24:             Label
+     1244(texel):     64(ptr) Variable Function
+                              Store 1244(texel) 121
+            1245:         123 Load 125(s1D)
+            1246:   52(float) Load 128(c1)
+            1247:     47(int) ConvertFToS 1246
+            1248:   52(float) Load 565(lod)
+            1249:     47(int) ConvertFToS 1248
+            1250:         122 Image 1245
+            1251:  7(f16vec4) ImageFetch 1250 1247 Lod 1249
+            1252:  7(f16vec4) Load 1244(texel)
+            1253:  7(f16vec4) FAdd 1252 1251
+                              Store 1244(texel) 1253
+            1254:         143 Load 145(s2D)
+            1255:   53(fvec2) Load 148(c2)
+            1256:  721(ivec2) ConvertFToS 1255
+            1257:   52(float) Load 565(lod)
+            1258:     47(int) ConvertFToS 1257
+            1259:         142 Image 1254
+            1260:  7(f16vec4) ImageFetch 1259 1256 Lod 1258
+            1261:  7(f16vec4) Load 1244(texel)
+            1262:  7(f16vec4) FAdd 1261 1260
+                              Store 1244(texel) 1262
+            1263:         163 Load 165(s3D)
+            1264:  167(fvec3) Load 169(c3)
+            1265:  734(ivec3) ConvertFToS 1264
+            1266:   52(float) Load 565(lod)
+            1267:     47(int) ConvertFToS 1266
+            1268:         162 Image 1263
+            1269:  7(f16vec4) ImageFetch 1268 1265 Lod 1267
+            1270:  7(f16vec4) Load 1244(texel)
+            1271:  7(f16vec4) FAdd 1270 1269
+                              Store 1244(texel) 1271
+            1272:         357 Load 359(s2DRect)
+            1273:   53(fvec2) Load 148(c2)
+            1274:  721(ivec2) ConvertFToS 1273
+            1275:         356 Image 1272
+            1276:  7(f16vec4) ImageFetch 1275 1274
+            1277:  7(f16vec4) Load 1244(texel)
+            1278:  7(f16vec4) FAdd 1277 1276
+                              Store 1244(texel) 1278
+            1279:         269 Load 271(s1DArray)
+            1280:   53(fvec2) Load 148(c2)
+            1281:  721(ivec2) ConvertFToS 1280
+            1282:   52(float) Load 565(lod)
+            1283:     47(int) ConvertFToS 1282
+            1284:         268 Image 1279
+            1285:  7(f16vec4) ImageFetch 1284 1281 Lod 1283
+            1286:  7(f16vec4) Load 1244(texel)
+            1287:  7(f16vec4) FAdd 1286 1285
+                              Store 1244(texel) 1287
+            1288:         284 Load 286(s2DArray)
+            1289:  167(fvec3) Load 169(c3)
+            1290:  734(ivec3) ConvertFToS 1289
+            1291:   52(float) Load 565(lod)
+            1292:     47(int) ConvertFToS 1291
+            1293:         283 Image 1288
+            1294:  7(f16vec4) ImageFetch 1293 1290 Lod 1292
+            1295:  7(f16vec4) Load 1244(texel)
+            1296:  7(f16vec4) FAdd 1295 1294
+                              Store 1244(texel) 1296
+            1301:        1298 Load 1300(sBuffer)
+            1302:   52(float) Load 128(c1)
+            1303:     47(int) ConvertFToS 1302
+            1304:        1297 Image 1301
+            1305:  7(f16vec4) ImageFetch 1304 1303
+            1306:  7(f16vec4) Load 1244(texel)
+            1307:  7(f16vec4) FAdd 1306 1305
+                              Store 1244(texel) 1307
+            1312:        1309 Load 1311(s2DMS)
+            1313:   53(fvec2) Load 148(c2)
+            1314:  721(ivec2) ConvertFToS 1313
+            1315:        1308 Image 1312
+            1316:  7(f16vec4) ImageFetch 1315 1314 Sample 709
+            1317:  7(f16vec4) Load 1244(texel)
+            1318:  7(f16vec4) FAdd 1317 1316
+                              Store 1244(texel) 1318
+            1323:        1320 Load 1322(s2DMSArray)
+            1324:  167(fvec3) Load 169(c3)
+            1325:  734(ivec3) ConvertFToS 1324
+            1327:        1319 Image 1323
+            1328:  7(f16vec4) ImageFetch 1327 1325 Sample 1326
+            1329:  7(f16vec4) Load 1244(texel)
+            1330:  7(f16vec4) FAdd 1329 1328
+                              Store 1244(texel) 1330
+            1331:  7(f16vec4) Load 1244(texel)
+                              ReturnValue 1331
+                              FunctionEnd
+25(testTexelFetchOffset():  7(f16vec4) Function None 8
+              26:             Label
+     1334(texel):     64(ptr) Variable Function
+                              Store 1334(texel) 121
+            1335:         123 Load 125(s1D)
+            1336:   52(float) Load 128(c1)
+            1337:     47(int) ConvertFToS 1336
+            1338:   52(float) Load 565(lod)
+            1339:     47(int) ConvertFToS 1338
+            1340:         122 Image 1335
+            1341:  7(f16vec4) ImageFetch 1340 1337 Lod ConstOffset 1339 709
+            1342:  7(f16vec4) Load 1334(texel)
+            1343:  7(f16vec4) FAdd 1342 1341
+                              Store 1334(texel) 1343
+            1344:         143 Load 145(s2D)
+            1345:   53(fvec2) Load 148(c2)
+            1346:  721(ivec2) ConvertFToS 1345
+            1347:   52(float) Load 565(lod)
+            1348:     47(int) ConvertFToS 1347
+            1349:         142 Image 1344
+            1350:  7(f16vec4) ImageFetch 1349 1346 Lod ConstOffset 1348 722
+            1351:  7(f16vec4) Load 1334(texel)
+            1352:  7(f16vec4) FAdd 1351 1350
+                              Store 1334(texel) 1352
+            1353:         163 Load 165(s3D)
+            1354:  167(fvec3) Load 169(c3)
+            1355:  734(ivec3) ConvertFToS 1354
+            1356:   52(float) Load 565(lod)
+            1357:     47(int) ConvertFToS 1356
+            1358:         162 Image 1353
+            1359:  7(f16vec4) ImageFetch 1358 1355 Lod ConstOffset 1357 735
+            1360:  7(f16vec4) Load 1334(texel)
+            1361:  7(f16vec4) FAdd 1360 1359
+                              Store 1334(texel) 1361
+            1362:         357 Load 359(s2DRect)
+            1363:   53(fvec2) Load 148(c2)
+            1364:  721(ivec2) ConvertFToS 1363
+            1365:         356 Image 1362
+            1366:  7(f16vec4) ImageFetch 1365 1364 ConstOffset 722
+            1367:  7(f16vec4) Load 1334(texel)
+            1368:  7(f16vec4) FAdd 1367 1366
+                              Store 1334(texel) 1368
+            1369:         269 Load 271(s1DArray)
+            1370:   53(fvec2) Load 148(c2)
+            1371:  721(ivec2) ConvertFToS 1370
+            1372:   52(float) Load 565(lod)
+            1373:     47(int) ConvertFToS 1372
+            1374:         268 Image 1369
+            1375:  7(f16vec4) ImageFetch 1374 1371 Lod ConstOffset 1373 709
+            1376:  7(f16vec4) Load 1334(texel)
+            1377:  7(f16vec4) FAdd 1376 1375
+                              Store 1334(texel) 1377
+            1378:         284 Load 286(s2DArray)
+            1379:  167(fvec3) Load 169(c3)
+            1380:  734(ivec3) ConvertFToS 1379
+            1381:   52(float) Load 565(lod)
+            1382:     47(int) ConvertFToS 1381
+            1383:         283 Image 1378
+            1384:  7(f16vec4) ImageFetch 1383 1380 Lod ConstOffset 1382 722
+            1385:  7(f16vec4) Load 1334(texel)
+            1386:  7(f16vec4) FAdd 1385 1384
+                              Store 1334(texel) 1386
+            1387:  7(f16vec4) Load 1334(texel)
+                              ReturnValue 1387
+                              FunctionEnd
+27(testTextureGrad():  7(f16vec4) Function None 8
+              28:             Label
+     1390(texel):     64(ptr) Variable Function
+                              Store 1390(texel) 121
+            1391:         123 Load 125(s1D)
+            1392:   52(float) Load 128(c1)
+            1394:   52(float) Load 1393(dPdxy1)
+            1395:   52(float) Load 1393(dPdxy1)
+            1396:  7(f16vec4) ImageSampleExplicitLod 1391 1392 Grad 1394 1395
+            1397:  7(f16vec4) Load 1390(texel)
+            1398:  7(f16vec4) FAdd 1397 1396
+                              Store 1390(texel) 1398
+            1399:         123 Load 125(s1D)
+            1400:6(float16_t) Load 135(f16c1)
+            1402:6(float16_t) Load 1401(f16dPdxy1)
+            1403:6(float16_t) Load 1401(f16dPdxy1)
+            1404:  7(f16vec4) ImageSampleExplicitLod 1399 1400 Grad 1402 1403
+            1405:  7(f16vec4) Load 1390(texel)
+            1406:  7(f16vec4) FAdd 1405 1404
+                              Store 1390(texel) 1406
+            1407:         143 Load 145(s2D)
+            1408:   53(fvec2) Load 148(c2)
+            1410:   53(fvec2) Load 1409(dPdxy2)
+            1411:   53(fvec2) Load 1409(dPdxy2)
+            1412:  7(f16vec4) ImageSampleExplicitLod 1407 1408 Grad 1410 1411
+            1413:  7(f16vec4) Load 1390(texel)
+            1414:  7(f16vec4) FAdd 1413 1412
+                              Store 1390(texel) 1414
+            1415:         143 Load 145(s2D)
+            1416:154(f16vec2) Load 156(f16c2)
+            1418:154(f16vec2) Load 1417(f16dPdxy2)
+            1419:154(f16vec2) Load 1417(f16dPdxy2)
+            1420:  7(f16vec4) ImageSampleExplicitLod 1415 1416 Grad 1418 1419
+            1421:  7(f16vec4) Load 1390(texel)
+            1422:  7(f16vec4) FAdd 1421 1420
+                              Store 1390(texel) 1422
+            1423:         163 Load 165(s3D)
+            1424:  167(fvec3) Load 169(c3)
+            1426:  167(fvec3) Load 1425(dPdxy3)
+            1427:  167(fvec3) Load 1425(dPdxy3)
+            1428:  7(f16vec4) ImageSampleExplicitLod 1423 1424 Grad 1426 1427
+            1429:  7(f16vec4) Load 1390(texel)
+            1430:  7(f16vec4) FAdd 1429 1428
+                              Store 1390(texel) 1430
+            1431:         163 Load 165(s3D)
+            1432:175(f16vec3) Load 177(f16c3)
+            1434:175(f16vec3) Load 1433(f16dPdxy3)
+            1435:175(f16vec3) Load 1433(f16dPdxy3)
+            1436:  7(f16vec4) ImageSampleExplicitLod 1431 1432 Grad 1434 1435
+            1437:  7(f16vec4) Load 1390(texel)
+            1438:  7(f16vec4) FAdd 1437 1436
+                              Store 1390(texel) 1438
+            1439:         184 Load 186(sCube)
+            1440:  167(fvec3) Load 169(c3)
+            1441:  167(fvec3) Load 1425(dPdxy3)
+            1442:  167(fvec3) Load 1425(dPdxy3)
+            1443:  7(f16vec4) ImageSampleExplicitLod 1439 1440 Grad 1441 1442
+            1444:  7(f16vec4) Load 1390(texel)
+            1445:  7(f16vec4) FAdd 1444 1443
+                              Store 1390(texel) 1445
+            1446:         184 Load 186(sCube)
+            1447:175(f16vec3) Load 177(f16c3)
+            1448:175(f16vec3) Load 1433(f16dPdxy3)
+            1449:175(f16vec3) Load 1433(f16dPdxy3)
+            1450:  7(f16vec4) ImageSampleExplicitLod 1446 1447 Grad 1448 1449
+            1451:  7(f16vec4) Load 1390(texel)
+            1452:  7(f16vec4) FAdd 1451 1450
+                              Store 1390(texel) 1452
+            1453:         357 Load 359(s2DRect)
+            1454:   53(fvec2) Load 148(c2)
+            1455:   53(fvec2) Load 1409(dPdxy2)
+            1456:   53(fvec2) Load 1409(dPdxy2)
+            1457:  7(f16vec4) ImageSampleExplicitLod 1453 1454 Grad 1455 1456
+            1458:  7(f16vec4) Load 1390(texel)
+            1459:  7(f16vec4) FAdd 1458 1457
+                              Store 1390(texel) 1459
+            1460:         357 Load 359(s2DRect)
+            1461:154(f16vec2) Load 156(f16c2)
+            1462:154(f16vec2) Load 1417(f16dPdxy2)
+            1463:154(f16vec2) Load 1417(f16dPdxy2)
+            1464:  7(f16vec4) ImageSampleExplicitLod 1460 1461 Grad 1462 1463
+            1465:  7(f16vec4) Load 1390(texel)
+            1466:  7(f16vec4) FAdd 1465 1464
+                              Store 1390(texel) 1466
+            1467:         371 Load 373(s2DRectShadow)
+            1468:  167(fvec3) Load 169(c3)
+            1469:   53(fvec2) Load 1409(dPdxy2)
+            1470:   53(fvec2) Load 1409(dPdxy2)
+            1471:   52(float) CompositeExtract 1468 2
+            1472:6(float16_t) ImageSampleDrefExplicitLod 1467 1468 1471 Grad 1469 1470
+            1473:    208(ptr) AccessChain 1390(texel) 207
+            1474:6(float16_t) Load 1473
+            1475:6(float16_t) FAdd 1474 1472
+            1476:    208(ptr) AccessChain 1390(texel) 207
+                              Store 1476 1475
+            1477:         371 Load 373(s2DRectShadow)
+            1478:154(f16vec2) Load 156(f16c2)
+            1479:   52(float) Load 215(compare)
+            1480:154(f16vec2) Load 1417(f16dPdxy2)
+            1481:154(f16vec2) Load 1417(f16dPdxy2)
+            1482:6(float16_t) ImageSampleDrefExplicitLod 1477 1478 1479 Grad 1480 1481
+            1483:    208(ptr) AccessChain 1390(texel) 207
+            1484:6(float16_t) Load 1483
+            1485:6(float16_t) FAdd 1484 1482
+            1486:    208(ptr) AccessChain 1390(texel) 207
+                              Store 1486 1485
+            1487:         199 Load 201(s1DShadow)
+            1488:  167(fvec3) Load 169(c3)
+            1489:   52(float) Load 1393(dPdxy1)
+            1490:   52(float) Load 1393(dPdxy1)
+            1491:   52(float) CompositeExtract 1488 2
+            1492:6(float16_t) ImageSampleDrefExplicitLod 1487 1488 1491 Grad 1489 1490
+            1493:    208(ptr) AccessChain 1390(texel) 207
+            1494:6(float16_t) Load 1493
+            1495:6(float16_t) FAdd 1494 1492
+            1496:    208(ptr) AccessChain 1390(texel) 207
+                              Store 1496 1495
+            1497:         199 Load 201(s1DShadow)
+            1498:154(f16vec2) Load 156(f16c2)
+            1499:   52(float) Load 215(compare)
+            1500:6(float16_t) Load 1401(f16dPdxy1)
+            1501:6(float16_t) Load 1401(f16dPdxy1)
+            1502:6(float16_t) ImageSampleDrefExplicitLod 1497 1498 1499 Grad 1500 1501
+            1503:    208(ptr) AccessChain 1390(texel) 207
+            1504:6(float16_t) Load 1503
+            1505:6(float16_t) FAdd 1504 1502
+            1506:    208(ptr) AccessChain 1390(texel) 207
+                              Store 1506 1505
+            1507:         224 Load 226(s2DShadow)
+            1508:  167(fvec3) Load 169(c3)
+            1509:   53(fvec2) Load 1409(dPdxy2)
+            1510:   53(fvec2) Load 1409(dPdxy2)
+            1511:   52(float) CompositeExtract 1508 2
+            1512:6(float16_t) ImageSampleDrefExplicitLod 1507 1508 1511 Grad 1509 1510
+            1513:    208(ptr) AccessChain 1390(texel) 207
+            1514:6(float16_t) Load 1513
+            1515:6(float16_t) FAdd 1514 1512
+            1516:    208(ptr) AccessChain 1390(texel) 207
+                              Store 1516 1515
+            1517:         224 Load 226(s2DShadow)
+            1518:154(f16vec2) Load 156(f16c2)
+            1519:   52(float) Load 215(compare)
+            1520:154(f16vec2) Load 1417(f16dPdxy2)
+            1521:154(f16vec2) Load 1417(f16dPdxy2)
+            1522:6(float16_t) ImageSampleDrefExplicitLod 1517 1518 1519 Grad 1520 1521
+            1523:    208(ptr) AccessChain 1390(texel) 207
+            1524:6(float16_t) Load 1523
+            1525:6(float16_t) FAdd 1524 1522
+            1526:    208(ptr) AccessChain 1390(texel) 207
+                              Store 1526 1525
+            1527:         245 Load 247(sCubeShadow)
+            1528:  249(fvec4) Load 251(c4)
+            1529:  167(fvec3) Load 1425(dPdxy3)
+            1530:  167(fvec3) Load 1425(dPdxy3)
+            1531:   52(float) CompositeExtract 1528 3
+            1532:6(float16_t) ImageSampleDrefExplicitLod 1527 1528 1531 Grad 1529 1530
+            1533:    208(ptr) AccessChain 1390(texel) 207
+            1534:6(float16_t) Load 1533
+            1535:6(float16_t) FAdd 1534 1532
+            1536:    208(ptr) AccessChain 1390(texel) 207
+                              Store 1536 1535
+            1537:         245 Load 247(sCubeShadow)
+            1538:175(f16vec3) Load 177(f16c3)
+            1539:   52(float) Load 215(compare)
+            1540:175(f16vec3) Load 1433(f16dPdxy3)
+            1541:175(f16vec3) Load 1433(f16dPdxy3)
+            1542:6(float16_t) ImageSampleDrefExplicitLod 1537 1538 1539 Grad 1540 1541
+            1543:    208(ptr) AccessChain 1390(texel) 207
+            1544:6(float16_t) Load 1543
+            1545:6(float16_t) FAdd 1544 1542
+            1546:    208(ptr) AccessChain 1390(texel) 207
+                              Store 1546 1545
+            1547:         269 Load 271(s1DArray)
+            1548:   53(fvec2) Load 148(c2)
+            1549:   52(float) Load 1393(dPdxy1)
+            1550:   52(float) Load 1393(dPdxy1)
+            1551:  7(f16vec4) ImageSampleExplicitLod 1547 1548 Grad 1549 1550
+            1552:  7(f16vec4) Load 1390(texel)
+            1553:  7(f16vec4) FAdd 1552 1551
+                              Store 1390(texel) 1553
+            1554:         269 Load 271(s1DArray)
+            1555:154(f16vec2) Load 156(f16c2)
+            1556:6(float16_t) Load 1401(f16dPdxy1)
+            1557:6(float16_t) Load 1401(f16dPdxy1)
+            1558:  7(f16vec4) ImageSampleExplicitLod 1554 1555 Grad 1556 1557
+            1559:  7(f16vec4) Load 1390(texel)
+            1560:  7(f16vec4) FAdd 1559 1558
+                              Store 1390(texel) 1560
+            1561:         284 Load 286(s2DArray)
+            1562:  167(fvec3) Load 169(c3)
+            1563:   53(fvec2) Load 1409(dPdxy2)
+            1564:   53(fvec2) Load 1409(dPdxy2)
+            1565:  7(f16vec4) ImageSampleExplicitLod 1561 1562 Grad 1563 1564
+            1566:  7(f16vec4) Load 1390(texel)
+            1567:  7(f16vec4) FAdd 1566 1565
+                              Store 1390(texel) 1567
+            1568:         284 Load 286(s2DArray)
+            1569:175(f16vec3) Load 177(f16c3)
+            1570:154(f16vec2) Load 1417(f16dPdxy2)
+            1571:154(f16vec2) Load 1417(f16dPdxy2)
+            1572:  7(f16vec4) ImageSampleExplicitLod 1568 1569 Grad 1570 1571
+            1573:  7(f16vec4) Load 1390(texel)
+            1574:  7(f16vec4) FAdd 1573 1572
+                              Store 1390(texel) 1574
+            1575:         316 Load 318(s1DArrayShadow)
+            1576:  167(fvec3) Load 169(c3)
+            1577:   52(float) Load 1393(dPdxy1)
+            1578:   52(float) Load 1393(dPdxy1)
+            1579:   52(float) CompositeExtract 1576 2
+            1580:6(float16_t) ImageSampleDrefExplicitLod 1575 1576 1579 Grad 1577 1578
+            1581:    208(ptr) AccessChain 1390(texel) 207
+            1582:6(float16_t) Load 1581
+            1583:6(float16_t) FAdd 1582 1580
+            1584:    208(ptr) AccessChain 1390(texel) 207
+                              Store 1584 1583
+            1585:         316 Load 318(s1DArrayShadow)
+            1586:154(f16vec2) Load 156(f16c2)
+            1587:   52(float) Load 215(compare)
+            1588:6(float16_t) Load 1401(f16dPdxy1)
+            1589:6(float16_t) Load 1401(f16dPdxy1)
+            1590:6(float16_t) ImageSampleDrefExplicitLod 1585 1586 1587 Grad 1588 1589
+            1591:    208(ptr) AccessChain 1390(texel) 207
+            1592:6(float16_t) Load 1591
+            1593:6(float16_t) FAdd 1592 1590
+            1594:    208(ptr) AccessChain 1390(texel) 207
+                              Store 1594 1593
+            1595:         337 Load 339(s2DArrayShadow)
+            1596:  249(fvec4) Load 251(c4)
+            1597:   53(fvec2) Load 1409(dPdxy2)
+            1598:   53(fvec2) Load 1409(dPdxy2)
+            1599:   52(float) CompositeExtract 1596 3
+            1600:6(float16_t) ImageSampleDrefExplicitLod 1595 1596 1599 Grad 1597 1598
+            1601:    208(ptr) AccessChain 1390(texel) 207
+            1602:6(float16_t) Load 1601
+            1603:6(float16_t) FAdd 1602 1600
+            1604:    208(ptr) AccessChain 1390(texel) 207
+                              Store 1604 1603
+            1605:         337 Load 339(s2DArrayShadow)
+            1606:175(f16vec3) Load 177(f16c3)
+            1607:   52(float) Load 215(compare)
+            1608:154(f16vec2) Load 1417(f16dPdxy2)
+            1609:154(f16vec2) Load 1417(f16dPdxy2)
+            1610:6(float16_t) ImageSampleDrefExplicitLod 1605 1606 1607 Grad 1608 1609
+            1611:    208(ptr) AccessChain 1390(texel) 207
+            1612:6(float16_t) Load 1611
+            1613:6(float16_t) FAdd 1612 1610
+            1614:    208(ptr) AccessChain 1390(texel) 207
+                              Store 1614 1613
+            1615:         299 Load 301(sCubeArray)
+            1616:  249(fvec4) Load 251(c4)
+            1617:  167(fvec3) Load 1425(dPdxy3)
+            1618:  167(fvec3) Load 1425(dPdxy3)
+            1619:  7(f16vec4) ImageSampleExplicitLod 1615 1616 Grad 1617 1618
+            1620:  7(f16vec4) Load 1390(texel)
+            1621:  7(f16vec4) FAdd 1620 1619
+                              Store 1390(texel) 1621
+            1622:         299 Load 301(sCubeArray)
+            1623:  7(f16vec4) Load 309(f16c4)
+            1624:175(f16vec3) Load 1433(f16dPdxy3)
+            1625:175(f16vec3) Load 1433(f16dPdxy3)
+            1626:  7(f16vec4) ImageSampleExplicitLod 1622 1623 Grad 1624 1625
+            1627:  7(f16vec4) Load 1390(texel)
+            1628:  7(f16vec4) FAdd 1627 1626
+                              Store 1390(texel) 1628
+            1629:  7(f16vec4) Load 1390(texel)
+                              ReturnValue 1629
+                              FunctionEnd
+29(testTextureGradOffset():  7(f16vec4) Function None 8
+              30:             Label
+     1632(texel):     64(ptr) Variable Function
+                              Store 1632(texel) 121
+            1633:         123 Load 125(s1D)
+            1634:   52(float) Load 128(c1)
+            1635:   52(float) Load 1393(dPdxy1)
+            1636:   52(float) Load 1393(dPdxy1)
+            1637:  7(f16vec4) ImageSampleExplicitLod 1633 1634 Grad ConstOffset 1635 1636 709
+            1638:  7(f16vec4) Load 1632(texel)
+            1639:  7(f16vec4) FAdd 1638 1637
+                              Store 1632(texel) 1639
+            1640:         123 Load 125(s1D)
+            1641:6(float16_t) Load 135(f16c1)
+            1642:6(float16_t) Load 1401(f16dPdxy1)
+            1643:6(float16_t) Load 1401(f16dPdxy1)
+            1644:  7(f16vec4) ImageSampleExplicitLod 1640 1641 Grad ConstOffset 1642 1643 709
+            1645:  7(f16vec4) Load 1632(texel)
+            1646:  7(f16vec4) FAdd 1645 1644
+                              Store 1632(texel) 1646
+            1647:         143 Load 145(s2D)
+            1648:   53(fvec2) Load 148(c2)
+            1649:   53(fvec2) Load 1409(dPdxy2)
+            1650:   53(fvec2) Load 1409(dPdxy2)
+            1651:  7(f16vec4) ImageSampleExplicitLod 1647 1648 Grad ConstOffset 1649 1650 722
+            1652:  7(f16vec4) Load 1632(texel)
+            1653:  7(f16vec4) FAdd 1652 1651
+                              Store 1632(texel) 1653
+            1654:         143 Load 145(s2D)
+            1655:154(f16vec2) Load 156(f16c2)
+            1656:154(f16vec2) Load 1417(f16dPdxy2)
+            1657:154(f16vec2) Load 1417(f16dPdxy2)
+            1658:  7(f16vec4) ImageSampleExplicitLod 1654 1655 Grad ConstOffset 1656 1657 722
+            1659:  7(f16vec4) Load 1632(texel)
+            1660:  7(f16vec4) FAdd 1659 1658
+                              Store 1632(texel) 1660
+            1661:         163 Load 165(s3D)
+            1662:  167(fvec3) Load 169(c3)
+            1663:  167(fvec3) Load 1425(dPdxy3)
+            1664:  167(fvec3) Load 1425(dPdxy3)
+            1665:  7(f16vec4) ImageSampleExplicitLod 1661 1662 Grad ConstOffset 1663 1664 735
+            1666:  7(f16vec4) Load 1632(texel)
+            1667:  7(f16vec4) FAdd 1666 1665
+                              Store 1632(texel) 1667
+            1668:         163 Load 165(s3D)
+            1669:175(f16vec3) Load 177(f16c3)
+            1670:175(f16vec3) Load 1433(f16dPdxy3)
+            1671:175(f16vec3) Load 1433(f16dPdxy3)
+            1672:  7(f16vec4) ImageSampleExplicitLod 1668 1669 Grad ConstOffset 1670 1671 735
+            1673:  7(f16vec4) Load 1632(texel)
+            1674:  7(f16vec4) FAdd 1673 1672
+                              Store 1632(texel) 1674
+            1675:         357 Load 359(s2DRect)
+            1676:   53(fvec2) Load 148(c2)
+            1677:   53(fvec2) Load 1409(dPdxy2)
+            1678:   53(fvec2) Load 1409(dPdxy2)
+            1679:  7(f16vec4) ImageSampleExplicitLod 1675 1676 Grad ConstOffset 1677 1678 722
+            1680:  7(f16vec4) Load 1632(texel)
+            1681:  7(f16vec4) FAdd 1680 1679
+                              Store 1632(texel) 1681
+            1682:         357 Load 359(s2DRect)
+            1683:154(f16vec2) Load 156(f16c2)
+            1684:154(f16vec2) Load 1417(f16dPdxy2)
+            1685:154(f16vec2) Load 1417(f16dPdxy2)
+            1686:  7(f16vec4) ImageSampleExplicitLod 1682 1683 Grad ConstOffset 1684 1685 722
+            1687:  7(f16vec4) Load 1632(texel)
+            1688:  7(f16vec4) FAdd 1687 1686
+                              Store 1632(texel) 1688
+            1689:         371 Load 373(s2DRectShadow)
+            1690:  167(fvec3) Load 169(c3)
+            1691:   53(fvec2) Load 1409(dPdxy2)
+            1692:   53(fvec2) Load 1409(dPdxy2)
+            1693:   52(float) CompositeExtract 1690 2
+            1694:6(float16_t) ImageSampleDrefExplicitLod 1689 1690 1693 Grad ConstOffset 1691 1692 722
+            1695:    208(ptr) AccessChain 1632(texel) 207
+            1696:6(float16_t) Load 1695
+            1697:6(float16_t) FAdd 1696 1694
+            1698:    208(ptr) AccessChain 1632(texel) 207
+                              Store 1698 1697
+            1699:         371 Load 373(s2DRectShadow)
+            1700:154(f16vec2) Load 156(f16c2)
+            1701:   52(float) Load 215(compare)
+            1702:154(f16vec2) Load 1417(f16dPdxy2)
+            1703:154(f16vec2) Load 1417(f16dPdxy2)
+            1704:6(float16_t) ImageSampleDrefExplicitLod 1699 1700 1701 Grad ConstOffset 1702 1703 722
+            1705:    208(ptr) AccessChain 1632(texel) 207
+            1706:6(float16_t) Load 1705
+            1707:6(float16_t) FAdd 1706 1704
+            1708:    208(ptr) AccessChain 1632(texel) 207
+                              Store 1708 1707
+            1709:         199 Load 201(s1DShadow)
+            1710:  167(fvec3) Load 169(c3)
+            1711:   52(float) Load 1393(dPdxy1)
+            1712:   52(float) Load 1393(dPdxy1)
+            1713:   52(float) CompositeExtract 1710 2
+            1714:6(float16_t) ImageSampleDrefExplicitLod 1709 1710 1713 Grad ConstOffset 1711 1712 709
+            1715:    208(ptr) AccessChain 1632(texel) 207
+            1716:6(float16_t) Load 1715
+            1717:6(float16_t) FAdd 1716 1714
+            1718:    208(ptr) AccessChain 1632(texel) 207
+                              Store 1718 1717
+            1719:         199 Load 201(s1DShadow)
+            1720:154(f16vec2) Load 156(f16c2)
+            1721:   52(float) Load 215(compare)
+            1722:6(float16_t) Load 1401(f16dPdxy1)
+            1723:6(float16_t) Load 1401(f16dPdxy1)
+            1724:6(float16_t) ImageSampleDrefExplicitLod 1719 1720 1721 Grad ConstOffset 1722 1723 709
+            1725:    208(ptr) AccessChain 1632(texel) 207
+            1726:6(float16_t) Load 1725
+            1727:6(float16_t) FAdd 1726 1724
+            1728:    208(ptr) AccessChain 1632(texel) 207
+                              Store 1728 1727
+            1729:         224 Load 226(s2DShadow)
+            1730:  167(fvec3) Load 169(c3)
+            1731:   53(fvec2) Load 1409(dPdxy2)
+            1732:   53(fvec2) Load 1409(dPdxy2)
+            1733:   52(float) CompositeExtract 1730 2
+            1734:6(float16_t) ImageSampleDrefExplicitLod 1729 1730 1733 Grad ConstOffset 1731 1732 722
+            1735:    208(ptr) AccessChain 1632(texel) 207
+            1736:6(float16_t) Load 1735
+            1737:6(float16_t) FAdd 1736 1734
+            1738:    208(ptr) AccessChain 1632(texel) 207
+                              Store 1738 1737
+            1739:         224 Load 226(s2DShadow)
+            1740:154(f16vec2) Load 156(f16c2)
+            1741:   52(float) Load 215(compare)
+            1742:154(f16vec2) Load 1417(f16dPdxy2)
+            1743:154(f16vec2) Load 1417(f16dPdxy2)
+            1744:6(float16_t) ImageSampleDrefExplicitLod 1739 1740 1741 Grad ConstOffset 1742 1743 722
+            1745:    208(ptr) AccessChain 1632(texel) 207
+            1746:6(float16_t) Load 1745
+            1747:6(float16_t) FAdd 1746 1744
+            1748:    208(ptr) AccessChain 1632(texel) 207
+                              Store 1748 1747
+            1749:         269 Load 271(s1DArray)
+            1750:   53(fvec2) Load 148(c2)
+            1751:   52(float) Load 1393(dPdxy1)
+            1752:   52(float) Load 1393(dPdxy1)
+            1753:  7(f16vec4) ImageSampleExplicitLod 1749 1750 Grad ConstOffset 1751 1752 709
+            1754:  7(f16vec4) Load 1632(texel)
+            1755:  7(f16vec4) FAdd 1754 1753
+                              Store 1632(texel) 1755
+            1756:         269 Load 271(s1DArray)
+            1757:154(f16vec2) Load 156(f16c2)
+            1758:6(float16_t) Load 1401(f16dPdxy1)
+            1759:6(float16_t) Load 1401(f16dPdxy1)
+            1760:  7(f16vec4) ImageSampleExplicitLod 1756 1757 Grad ConstOffset 1758 1759 709
+            1761:  7(f16vec4) Load 1632(texel)
+            1762:  7(f16vec4) FAdd 1761 1760
+                              Store 1632(texel) 1762
+            1763:         284 Load 286(s2DArray)
+            1764:  167(fvec3) Load 169(c3)
+            1765:   53(fvec2) Load 1409(dPdxy2)
+            1766:   53(fvec2) Load 1409(dPdxy2)
+            1767:  7(f16vec4) ImageSampleExplicitLod 1763 1764 Grad ConstOffset 1765 1766 722
+            1768:  7(f16vec4) Load 1632(texel)
+            1769:  7(f16vec4) FAdd 1768 1767
+                              Store 1632(texel) 1769
+            1770:         284 Load 286(s2DArray)
+            1771:175(f16vec3) Load 177(f16c3)
+            1772:154(f16vec2) Load 1417(f16dPdxy2)
+            1773:154(f16vec2) Load 1417(f16dPdxy2)
+            1774:  7(f16vec4) ImageSampleExplicitLod 1770 1771 Grad ConstOffset 1772 1773 722
+            1775:  7(f16vec4) Load 1632(texel)
+            1776:  7(f16vec4) FAdd 1775 1774
+                              Store 1632(texel) 1776
+            1777:         316 Load 318(s1DArrayShadow)
+            1778:  167(fvec3) Load 169(c3)
+            1779:   52(float) Load 1393(dPdxy1)
+            1780:   52(float) Load 1393(dPdxy1)
+            1781:   52(float) CompositeExtract 1778 2
+            1782:6(float16_t) ImageSampleDrefExplicitLod 1777 1778 1781 Grad ConstOffset 1779 1780 709
+            1783:    208(ptr) AccessChain 1632(texel) 207
+            1784:6(float16_t) Load 1783
+            1785:6(float16_t) FAdd 1784 1782
+            1786:    208(ptr) AccessChain 1632(texel) 207
+                              Store 1786 1785
+            1787:         316 Load 318(s1DArrayShadow)
+            1788:154(f16vec2) Load 156(f16c2)
+            1789:   52(float) Load 215(compare)
+            1790:6(float16_t) Load 1401(f16dPdxy1)
+            1791:6(float16_t) Load 1401(f16dPdxy1)
+            1792:6(float16_t) ImageSampleDrefExplicitLod 1787 1788 1789 Grad ConstOffset 1790 1791 709
+            1793:    208(ptr) AccessChain 1632(texel) 207
+            1794:6(float16_t) Load 1793
+            1795:6(float16_t) FAdd 1794 1792
+            1796:    208(ptr) AccessChain 1632(texel) 207
+                              Store 1796 1795
+            1797:         337 Load 339(s2DArrayShadow)
+            1798:  249(fvec4) Load 251(c4)
+            1799:   53(fvec2) Load 1409(dPdxy2)
+            1800:   53(fvec2) Load 1409(dPdxy2)
+            1801:   52(float) CompositeExtract 1798 3
+            1802:6(float16_t) ImageSampleDrefExplicitLod 1797 1798 1801 Grad ConstOffset 1799 1800 722
+            1803:    208(ptr) AccessChain 1632(texel) 207
+            1804:6(float16_t) Load 1803
+            1805:6(float16_t) FAdd 1804 1802
+            1806:    208(ptr) AccessChain 1632(texel) 207
+                              Store 1806 1805
+            1807:         337 Load 339(s2DArrayShadow)
+            1808:175(f16vec3) Load 177(f16c3)
+            1809:   52(float) Load 215(compare)
+            1810:154(f16vec2) Load 1417(f16dPdxy2)
+            1811:154(f16vec2) Load 1417(f16dPdxy2)
+            1812:6(float16_t) ImageSampleDrefExplicitLod 1807 1808 1809 Grad ConstOffset 1810 1811 722
+            1813:    208(ptr) AccessChain 1632(texel) 207
+            1814:6(float16_t) Load 1813
+            1815:6(float16_t) FAdd 1814 1812
+            1816:    208(ptr) AccessChain 1632(texel) 207
+                              Store 1816 1815
+            1817:  7(f16vec4) Load 1632(texel)
+                              ReturnValue 1817
+                              FunctionEnd
+31(testTextureProjGrad():  7(f16vec4) Function None 8
+              32:             Label
+     1820(texel):     64(ptr) Variable Function
+                              Store 1820(texel) 121
+            1821:         123 Load 125(s1D)
+            1822:   53(fvec2) Load 148(c2)
+            1823:   52(float) Load 1393(dPdxy1)
+            1824:   52(float) Load 1393(dPdxy1)
+            1825:  7(f16vec4) ImageSampleProjExplicitLod 1821 1822 Grad 1823 1824
+            1826:  7(f16vec4) Load 1820(texel)
+            1827:  7(f16vec4) FAdd 1826 1825
+                              Store 1820(texel) 1827
+            1828:         123 Load 125(s1D)
+            1829:154(f16vec2) Load 156(f16c2)
+            1830:6(float16_t) Load 1401(f16dPdxy1)
+            1831:6(float16_t) Load 1401(f16dPdxy1)
+            1832:  7(f16vec4) ImageSampleProjExplicitLod 1828 1829 Grad 1830 1831
+            1833:  7(f16vec4) Load 1820(texel)
+            1834:  7(f16vec4) FAdd 1833 1832
+                              Store 1820(texel) 1834
+            1835:         123 Load 125(s1D)
+            1836:  249(fvec4) Load 251(c4)
+            1837:   52(float) Load 1393(dPdxy1)
+            1838:   52(float) Load 1393(dPdxy1)
+            1839:   52(float) CompositeExtract 1836 3
+            1840:  249(fvec4) CompositeInsert 1839 1836 1
+            1841:  7(f16vec4) ImageSampleProjExplicitLod 1835 1840 Grad 1837 1838
+            1842:  7(f16vec4) Load 1820(texel)
+            1843:  7(f16vec4) FAdd 1842 1841
+                              Store 1820(texel) 1843
+            1844:         123 Load 125(s1D)
+            1845:  7(f16vec4) Load 309(f16c4)
+            1846:6(float16_t) Load 1401(f16dPdxy1)
+            1847:6(float16_t) Load 1401(f16dPdxy1)
+            1848:6(float16_t) CompositeExtract 1845 3
+            1849:  7(f16vec4) CompositeInsert 1848 1845 1
+            1850:  7(f16vec4) ImageSampleProjExplicitLod 1844 1849 Grad 1846 1847
+            1851:  7(f16vec4) Load 1820(texel)
+            1852:  7(f16vec4) FAdd 1851 1850
+                              Store 1820(texel) 1852
+            1853:         143 Load 145(s2D)
+            1854:  167(fvec3) Load 169(c3)
+            1855:   53(fvec2) Load 1409(dPdxy2)
+            1856:   53(fvec2) Load 1409(dPdxy2)
+            1857:  7(f16vec4) ImageSampleProjExplicitLod 1853 1854 Grad 1855 1856
+            1858:  7(f16vec4) Load 1820(texel)
+            1859:  7(f16vec4) FAdd 1858 1857
+                              Store 1820(texel) 1859
+            1860:         143 Load 145(s2D)
+            1861:175(f16vec3) Load 177(f16c3)
+            1862:154(f16vec2) Load 1417(f16dPdxy2)
+            1863:154(f16vec2) Load 1417(f16dPdxy2)
+            1864:  7(f16vec4) ImageSampleProjExplicitLod 1860 1861 Grad 1862 1863
+            1865:  7(f16vec4) Load 1820(texel)
+            1866:  7(f16vec4) FAdd 1865 1864
+                              Store 1820(texel) 1866
+            1867:         143 Load 145(s2D)
+            1868:  249(fvec4) Load 251(c4)
+            1869:   53(fvec2) Load 1409(dPdxy2)
+            1870:   53(fvec2) Load 1409(dPdxy2)
+            1871:   52(float) CompositeExtract 1868 3
+            1872:  249(fvec4) CompositeInsert 1871 1868 2
+            1873:  7(f16vec4) ImageSampleProjExplicitLod 1867 1872 Grad 1869 1870
+            1874:  7(f16vec4) Load 1820(texel)
+            1875:  7(f16vec4) FAdd 1874 1873
+                              Store 1820(texel) 1875
+            1876:         143 Load 145(s2D)
+            1877:  7(f16vec4) Load 309(f16c4)
+            1878:154(f16vec2) Load 1417(f16dPdxy2)
+            1879:154(f16vec2) Load 1417(f16dPdxy2)
+            1880:6(float16_t) CompositeExtract 1877 3
+            1881:  7(f16vec4) CompositeInsert 1880 1877 2
+            1882:  7(f16vec4) ImageSampleProjExplicitLod 1876 1881 Grad 1878 1879
+            1883:  7(f16vec4) Load 1820(texel)
+            1884:  7(f16vec4) FAdd 1883 1882
+                              Store 1820(texel) 1884
+            1885:         163 Load 165(s3D)
+            1886:  249(fvec4) Load 251(c4)
+            1887:  167(fvec3) Load 1425(dPdxy3)
+            1888:  167(fvec3) Load 1425(dPdxy3)
+            1889:  7(f16vec4) ImageSampleProjExplicitLod 1885 1886 Grad 1887 1888
+            1890:  7(f16vec4) Load 1820(texel)
+            1891:  7(f16vec4) FAdd 1890 1889
+                              Store 1820(texel) 1891
+            1892:         163 Load 165(s3D)
+            1893:  7(f16vec4) Load 309(f16c4)
+            1894:175(f16vec3) Load 1433(f16dPdxy3)
+            1895:175(f16vec3) Load 1433(f16dPdxy3)
+            1896:  7(f16vec4) ImageSampleProjExplicitLod 1892 1893 Grad 1894 1895
+            1897:  7(f16vec4) Load 1820(texel)
+            1898:  7(f16vec4) FAdd 1897 1896
+                              Store 1820(texel) 1898
+            1899:         357 Load 359(s2DRect)
+            1900:  167(fvec3) Load 169(c3)
+            1901:   53(fvec2) Load 1409(dPdxy2)
+            1902:   53(fvec2) Load 1409(dPdxy2)
+            1903:  7(f16vec4) ImageSampleProjExplicitLod 1899 1900 Grad 1901 1902
+            1904:  7(f16vec4) Load 1820(texel)
+            1905:  7(f16vec4) FAdd 1904 1903
+                              Store 1820(texel) 1905
+            1906:         357 Load 359(s2DRect)
+            1907:175(f16vec3) Load 177(f16c3)
+            1908:154(f16vec2) Load 1417(f16dPdxy2)
+            1909:154(f16vec2) Load 1417(f16dPdxy2)
+            1910:  7(f16vec4) ImageSampleProjExplicitLod 1906 1907 Grad 1908 1909
+            1911:  7(f16vec4) Load 1820(texel)
+            1912:  7(f16vec4) FAdd 1911 1910
+                              Store 1820(texel) 1912
+            1913:         357 Load 359(s2DRect)
+            1914:  249(fvec4) Load 251(c4)
+            1915:   53(fvec2) Load 1409(dPdxy2)
+            1916:   53(fvec2) Load 1409(dPdxy2)
+            1917:   52(float) CompositeExtract 1914 3
+            1918:  249(fvec4) CompositeInsert 1917 1914 2
+            1919:  7(f16vec4) ImageSampleProjExplicitLod 1913 1918 Grad 1915 1916
+            1920:  7(f16vec4) Load 1820(texel)
+            1921:  7(f16vec4) FAdd 1920 1919
+                              Store 1820(texel) 1921
+            1922:         357 Load 359(s2DRect)
+            1923:  7(f16vec4) Load 309(f16c4)
+            1924:154(f16vec2) Load 1417(f16dPdxy2)
+            1925:154(f16vec2) Load 1417(f16dPdxy2)
+            1926:6(float16_t) CompositeExtract 1923 3
+            1927:  7(f16vec4) CompositeInsert 1926 1923 2
+            1928:  7(f16vec4) ImageSampleProjExplicitLod 1922 1927 Grad 1924 1925
+            1929:  7(f16vec4) Load 1820(texel)
+            1930:  7(f16vec4) FAdd 1929 1928
+                              Store 1820(texel) 1930
+            1931:         371 Load 373(s2DRectShadow)
+            1932:  249(fvec4) Load 251(c4)
+            1933:   53(fvec2) Load 1409(dPdxy2)
+            1934:   53(fvec2) Load 1409(dPdxy2)
+            1935:   52(float) CompositeExtract 1932 2
+            1936:   52(float) CompositeExtract 1932 3
+            1937:  249(fvec4) CompositeInsert 1936 1932 2
+            1938:6(float16_t) ImageSampleProjDrefExplicitLod 1931 1937 1935 Grad 1933 1934
+            1939:    208(ptr) AccessChain 1820(texel) 207
+            1940:6(float16_t) Load 1939
+            1941:6(float16_t) FAdd 1940 1938
+            1942:    208(ptr) AccessChain 1820(texel) 207
+                              Store 1942 1941
+            1943:         371 Load 373(s2DRectShadow)
+            1944:175(f16vec3) Load 177(f16c3)
+            1945:   52(float) Load 215(compare)
+            1946:154(f16vec2) Load 1417(f16dPdxy2)
+            1947:154(f16vec2) Load 1417(f16dPdxy2)
+            1948:6(float16_t) ImageSampleProjDrefExplicitLod 1943 1944 1945 Grad 1946 1947
+            1949:    208(ptr) AccessChain 1820(texel) 207
+            1950:6(float16_t) Load 1949
+            1951:6(float16_t) FAdd 1950 1948
+            1952:    208(ptr) AccessChain 1820(texel) 207
+                              Store 1952 1951
+            1953:         199 Load 201(s1DShadow)
+            1954:  249(fvec4) Load 251(c4)
+            1955:   52(float) Load 1393(dPdxy1)
+            1956:   52(float) Load 1393(dPdxy1)
+            1957:   52(float) CompositeExtract 1954 2
+            1958:   52(float) CompositeExtract 1954 3
+            1959:  249(fvec4) CompositeInsert 1958 1954 1
+            1960:6(float16_t) ImageSampleProjDrefExplicitLod 1953 1959 1957 Grad 1955 1956
+            1961:    208(ptr) AccessChain 1820(texel) 207
+            1962:6(float16_t) Load 1961
+            1963:6(float16_t) FAdd 1962 1960
+            1964:    208(ptr) AccessChain 1820(texel) 207
+                              Store 1964 1963
+            1965:         199 Load 201(s1DShadow)
+            1966:175(f16vec3) Load 177(f16c3)
+            1967:   52(float) Load 215(compare)
+            1968:6(float16_t) Load 1401(f16dPdxy1)
+            1969:6(float16_t) Load 1401(f16dPdxy1)
+            1970:6(float16_t) CompositeExtract 1966 2
+            1971:175(f16vec3) CompositeInsert 1970 1966 1
+            1972:6(float16_t) ImageSampleProjDrefExplicitLod 1965 1971 1967 Grad 1968 1969
+            1973:    208(ptr) AccessChain 1820(texel) 207
+            1974:6(float16_t) Load 1973
+            1975:6(float16_t) FAdd 1974 1972
+            1976:    208(ptr) AccessChain 1820(texel) 207
+                              Store 1976 1975
+            1977:         224 Load 226(s2DShadow)
+            1978:  249(fvec4) Load 251(c4)
+            1979:   53(fvec2) Load 1409(dPdxy2)
+            1980:   53(fvec2) Load 1409(dPdxy2)
+            1981:   52(float) CompositeExtract 1978 2
+            1982:   52(float) CompositeExtract 1978 3
+            1983:  249(fvec4) CompositeInsert 1982 1978 2
+            1984:6(float16_t) ImageSampleProjDrefExplicitLod 1977 1983 1981 Grad 1979 1980
+            1985:    208(ptr) AccessChain 1820(texel) 207
+            1986:6(float16_t) Load 1985
+            1987:6(float16_t) FAdd 1986 1984
+            1988:    208(ptr) AccessChain 1820(texel) 207
+                              Store 1988 1987
+            1989:         224 Load 226(s2DShadow)
+            1990:175(f16vec3) Load 177(f16c3)
+            1991:   52(float) Load 215(compare)
+            1992:154(f16vec2) Load 1417(f16dPdxy2)
+            1993:154(f16vec2) Load 1417(f16dPdxy2)
+            1994:6(float16_t) ImageSampleProjDrefExplicitLod 1989 1990 1991 Grad 1992 1993
+            1995:    208(ptr) AccessChain 1820(texel) 207
+            1996:6(float16_t) Load 1995
+            1997:6(float16_t) FAdd 1996 1994
+            1998:    208(ptr) AccessChain 1820(texel) 207
+                              Store 1998 1997
+            1999:  7(f16vec4) Load 1820(texel)
+                              ReturnValue 1999
+                              FunctionEnd
+33(testTextureProjGradoffset():  7(f16vec4) Function None 8
+              34:             Label
+     2002(texel):     64(ptr) Variable Function
+                              Store 2002(texel) 121
+            2003:         123 Load 125(s1D)
+            2004:   53(fvec2) Load 148(c2)
+            2005:   52(float) Load 1393(dPdxy1)
+            2006:   52(float) Load 1393(dPdxy1)
+            2007:  7(f16vec4) ImageSampleProjExplicitLod 2003 2004 Grad ConstOffset 2005 2006 709
+            2008:  7(f16vec4) Load 2002(texel)
+            2009:  7(f16vec4) FAdd 2008 2007
+                              Store 2002(texel) 2009
+            2010:         123 Load 125(s1D)
+            2011:154(f16vec2) Load 156(f16c2)
+            2012:6(float16_t) Load 1401(f16dPdxy1)
+            2013:6(float16_t) Load 1401(f16dPdxy1)
+            2014:  7(f16vec4) ImageSampleProjExplicitLod 2010 2011 Grad ConstOffset 2012 2013 709
+            2015:  7(f16vec4) Load 2002(texel)
+            2016:  7(f16vec4) FAdd 2015 2014
+                              Store 2002(texel) 2016
+            2017:         123 Load 125(s1D)
+            2018:  249(fvec4) Load 251(c4)
+            2019:   52(float) Load 1393(dPdxy1)
+            2020:   52(float) Load 1393(dPdxy1)
+            2021:   52(float) CompositeExtract 2018 3
+            2022:  249(fvec4) CompositeInsert 2021 2018 1
+            2023:  7(f16vec4) ImageSampleProjExplicitLod 2017 2022 Grad ConstOffset 2019 2020 709
+            2024:  7(f16vec4) Load 2002(texel)
+            2025:  7(f16vec4) FAdd 2024 2023
+                              Store 2002(texel) 2025
+            2026:         123 Load 125(s1D)
+            2027:  7(f16vec4) Load 309(f16c4)
+            2028:6(float16_t) Load 1401(f16dPdxy1)
+            2029:6(float16_t) Load 1401(f16dPdxy1)
+            2030:6(float16_t) CompositeExtract 2027 3
+            2031:  7(f16vec4) CompositeInsert 2030 2027 1
+            2032:  7(f16vec4) ImageSampleProjExplicitLod 2026 2031 Grad ConstOffset 2028 2029 709
+            2033:  7(f16vec4) Load 2002(texel)
+            2034:  7(f16vec4) FAdd 2033 2032
+                              Store 2002(texel) 2034
+            2035:         143 Load 145(s2D)
+            2036:  167(fvec3) Load 169(c3)
+            2037:   53(fvec2) Load 1409(dPdxy2)
+            2038:   53(fvec2) Load 1409(dPdxy2)
+            2039:  7(f16vec4) ImageSampleProjExplicitLod 2035 2036 Grad ConstOffset 2037 2038 722
+            2040:  7(f16vec4) Load 2002(texel)
+            2041:  7(f16vec4) FAdd 2040 2039
+                              Store 2002(texel) 2041
+            2042:         143 Load 145(s2D)
+            2043:175(f16vec3) Load 177(f16c3)
+            2044:154(f16vec2) Load 1417(f16dPdxy2)
+            2045:154(f16vec2) Load 1417(f16dPdxy2)
+            2046:  7(f16vec4) ImageSampleProjExplicitLod 2042 2043 Grad ConstOffset 2044 2045 722
+            2047:  7(f16vec4) Load 2002(texel)
+            2048:  7(f16vec4) FAdd 2047 2046
+                              Store 2002(texel) 2048
+            2049:         143 Load 145(s2D)
+            2050:  249(fvec4) Load 251(c4)
+            2051:   53(fvec2) Load 1409(dPdxy2)
+            2052:   53(fvec2) Load 1409(dPdxy2)
+            2053:   52(float) CompositeExtract 2050 3
+            2054:  249(fvec4) CompositeInsert 2053 2050 2
+            2055:  7(f16vec4) ImageSampleProjExplicitLod 2049 2054 Grad ConstOffset 2051 2052 722
+            2056:  7(f16vec4) Load 2002(texel)
+            2057:  7(f16vec4) FAdd 2056 2055
+                              Store 2002(texel) 2057
+            2058:         143 Load 145(s2D)
+            2059:  7(f16vec4) Load 309(f16c4)
+            2060:154(f16vec2) Load 1417(f16dPdxy2)
+            2061:154(f16vec2) Load 1417(f16dPdxy2)
+            2062:6(float16_t) CompositeExtract 2059 3
+            2063:  7(f16vec4) CompositeInsert 2062 2059 2
+            2064:  7(f16vec4) ImageSampleProjExplicitLod 2058 2063 Grad ConstOffset 2060 2061 722
+            2065:  7(f16vec4) Load 2002(texel)
+            2066:  7(f16vec4) FAdd 2065 2064
+                              Store 2002(texel) 2066
+            2067:         357 Load 359(s2DRect)
+            2068:  167(fvec3) Load 169(c3)
+            2069:   53(fvec2) Load 1409(dPdxy2)
+            2070:   53(fvec2) Load 1409(dPdxy2)
+            2071:  7(f16vec4) ImageSampleProjExplicitLod 2067 2068 Grad ConstOffset 2069 2070 722
+            2072:  7(f16vec4) Load 2002(texel)
+            2073:  7(f16vec4) FAdd 2072 2071
+                              Store 2002(texel) 2073
+            2074:         357 Load 359(s2DRect)
+            2075:175(f16vec3) Load 177(f16c3)
+            2076:154(f16vec2) Load 1417(f16dPdxy2)
+            2077:154(f16vec2) Load 1417(f16dPdxy2)
+            2078:  7(f16vec4) ImageSampleProjExplicitLod 2074 2075 Grad ConstOffset 2076 2077 722
+            2079:  7(f16vec4) Load 2002(texel)
+            2080:  7(f16vec4) FAdd 2079 2078
+                              Store 2002(texel) 2080
+            2081:         357 Load 359(s2DRect)
+            2082:  249(fvec4) Load 251(c4)
+            2083:   53(fvec2) Load 1409(dPdxy2)
+            2084:   53(fvec2) Load 1409(dPdxy2)
+            2085:   52(float) CompositeExtract 2082 3
+            2086:  249(fvec4) CompositeInsert 2085 2082 2
+            2087:  7(f16vec4) ImageSampleProjExplicitLod 2081 2086 Grad ConstOffset 2083 2084 722
+            2088:  7(f16vec4) Load 2002(texel)
+            2089:  7(f16vec4) FAdd 2088 2087
+                              Store 2002(texel) 2089
+            2090:         357 Load 359(s2DRect)
+            2091:  7(f16vec4) Load 309(f16c4)
+            2092:154(f16vec2) Load 1417(f16dPdxy2)
+            2093:154(f16vec2) Load 1417(f16dPdxy2)
+            2094:6(float16_t) CompositeExtract 2091 3
+            2095:  7(f16vec4) CompositeInsert 2094 2091 2
+            2096:  7(f16vec4) ImageSampleProjExplicitLod 2090 2095 Grad ConstOffset 2092 2093 722
+            2097:  7(f16vec4) Load 2002(texel)
+            2098:  7(f16vec4) FAdd 2097 2096
+                              Store 2002(texel) 2098
+            2099:         371 Load 373(s2DRectShadow)
+            2100:  249(fvec4) Load 251(c4)
+            2101:   53(fvec2) Load 1409(dPdxy2)
+            2102:   53(fvec2) Load 1409(dPdxy2)
+            2103:   52(float) CompositeExtract 2100 2
+            2104:   52(float) CompositeExtract 2100 3
+            2105:  249(fvec4) CompositeInsert 2104 2100 2
+            2106:6(float16_t) ImageSampleProjDrefExplicitLod 2099 2105 2103 Grad ConstOffset 2101 2102 722
+            2107:    208(ptr) AccessChain 2002(texel) 207
+            2108:6(float16_t) Load 2107
+            2109:6(float16_t) FAdd 2108 2106
+            2110:    208(ptr) AccessChain 2002(texel) 207
+                              Store 2110 2109
+            2111:         371 Load 373(s2DRectShadow)
+            2112:175(f16vec3) Load 177(f16c3)
+            2113:   52(float) Load 215(compare)
+            2114:154(f16vec2) Load 1417(f16dPdxy2)
+            2115:154(f16vec2) Load 1417(f16dPdxy2)
+            2116:6(float16_t) ImageSampleProjDrefExplicitLod 2111 2112 2113 Grad ConstOffset 2114 2115 722
+            2117:    208(ptr) AccessChain 2002(texel) 207
+            2118:6(float16_t) Load 2117
+            2119:6(float16_t) FAdd 2118 2116
+            2120:    208(ptr) AccessChain 2002(texel) 207
+                              Store 2120 2119
+            2121:         163 Load 165(s3D)
+            2122:  249(fvec4) Load 251(c4)
+            2123:  167(fvec3) Load 1425(dPdxy3)
+            2124:  167(fvec3) Load 1425(dPdxy3)
+            2125:  7(f16vec4) ImageSampleProjExplicitLod 2121 2122 Grad ConstOffset 2123 2124 735
+            2126:  7(f16vec4) Load 2002(texel)
+            2127:  7(f16vec4) FAdd 2126 2125
+                              Store 2002(texel) 2127
+            2128:         163 Load 165(s3D)
+            2129:  7(f16vec4) Load 309(f16c4)
+            2130:175(f16vec3) Load 1433(f16dPdxy3)
+            2131:175(f16vec3) Load 1433(f16dPdxy3)
+            2132:  7(f16vec4) ImageSampleProjExplicitLod 2128 2129 Grad ConstOffset 2130 2131 735
+            2133:  7(f16vec4) Load 2002(texel)
+            2134:  7(f16vec4) FAdd 2133 2132
+                              Store 2002(texel) 2134
+            2135:         199 Load 201(s1DShadow)
+            2136:  249(fvec4) Load 251(c4)
+            2137:   52(float) Load 1393(dPdxy1)
+            2138:   52(float) Load 1393(dPdxy1)
+            2139:   52(float) CompositeExtract 2136 2
+            2140:   52(float) CompositeExtract 2136 3
+            2141:  249(fvec4) CompositeInsert 2140 2136 1
+            2142:6(float16_t) ImageSampleProjDrefExplicitLod 2135 2141 2139 Grad ConstOffset 2137 2138 709
+            2143:    208(ptr) AccessChain 2002(texel) 207
+            2144:6(float16_t) Load 2143
+            2145:6(float16_t) FAdd 2144 2142
+            2146:    208(ptr) AccessChain 2002(texel) 207
+                              Store 2146 2145
+            2147:         199 Load 201(s1DShadow)
+            2148:175(f16vec3) Load 177(f16c3)
+            2149:   52(float) Load 215(compare)
+            2150:6(float16_t) Load 1401(f16dPdxy1)
+            2151:6(float16_t) Load 1401(f16dPdxy1)
+            2152:6(float16_t) CompositeExtract 2148 2
+            2153:175(f16vec3) CompositeInsert 2152 2148 1
+            2154:6(float16_t) ImageSampleProjDrefExplicitLod 2147 2153 2149 Grad ConstOffset 2150 2151 709
+            2155:    208(ptr) AccessChain 2002(texel) 207
+            2156:6(float16_t) Load 2155
+            2157:6(float16_t) FAdd 2156 2154
+            2158:    208(ptr) AccessChain 2002(texel) 207
+                              Store 2158 2157
+            2159:         224 Load 226(s2DShadow)
+            2160:  249(fvec4) Load 251(c4)
+            2161:   53(fvec2) Load 1409(dPdxy2)
+            2162:   53(fvec2) Load 1409(dPdxy2)
+            2163:   52(float) CompositeExtract 2160 2
+            2164:   52(float) CompositeExtract 2160 3
+            2165:  249(fvec4) CompositeInsert 2164 2160 2
+            2166:6(float16_t) ImageSampleProjDrefExplicitLod 2159 2165 2163 Grad ConstOffset 2161 2162 722
+            2167:    208(ptr) AccessChain 2002(texel) 207
+            2168:6(float16_t) Load 2167
+            2169:6(float16_t) FAdd 2168 2166
+            2170:    208(ptr) AccessChain 2002(texel) 207
+                              Store 2170 2169
+            2171:         224 Load 226(s2DShadow)
+            2172:175(f16vec3) Load 177(f16c3)
+            2173:   52(float) Load 215(compare)
+            2174:154(f16vec2) Load 1417(f16dPdxy2)
+            2175:154(f16vec2) Load 1417(f16dPdxy2)
+            2176:6(float16_t) ImageSampleProjDrefExplicitLod 2171 2172 2173 Grad ConstOffset 2174 2175 722
+            2177:    208(ptr) AccessChain 2002(texel) 207
+            2178:6(float16_t) Load 2177
+            2179:6(float16_t) FAdd 2178 2176
+            2180:    208(ptr) AccessChain 2002(texel) 207
+                              Store 2180 2179
+            2181:  7(f16vec4) Load 2002(texel)
+                              ReturnValue 2181
+                              FunctionEnd
+35(testTextureGather():  7(f16vec4) Function None 8
+              36:             Label
+     2184(texel):     64(ptr) Variable Function
+                              Store 2184(texel) 121
+            2185:         143 Load 145(s2D)
+            2186:   53(fvec2) Load 148(c2)
+            2188:  7(f16vec4) ImageGather 2185 2186 2187
+            2189:  7(f16vec4) Load 2184(texel)
+            2190:  7(f16vec4) FAdd 2189 2188
+                              Store 2184(texel) 2190
+            2191:         143 Load 145(s2D)
+            2192:154(f16vec2) Load 156(f16c2)
+            2193:6(float16_t) Load 137(f16bias)
+            2194:  7(f16vec4) ImageGather 2191 2192 2187 Bias 2193
+            2195:  7(f16vec4) Load 2184(texel)
+            2196:  7(f16vec4) FAdd 2195 2194
+                              Store 2184(texel) 2196
+            2197:         284 Load 286(s2DArray)
+            2198:  167(fvec3) Load 169(c3)
+            2199:  7(f16vec4) ImageGather 2197 2198 2187
+            2200:  7(f16vec4) Load 2184(texel)
+            2201:  7(f16vec4) FAdd 2200 2199
+                              Store 2184(texel) 2201
+            2202:         284 Load 286(s2DArray)
+            2203:175(f16vec3) Load 177(f16c3)
+            2204:6(float16_t) Load 137(f16bias)
+            2205:  7(f16vec4) ImageGather 2202 2203 2187 Bias 2204
+            2206:  7(f16vec4) Load 2184(texel)
+            2207:  7(f16vec4) FAdd 2206 2205
+                              Store 2184(texel) 2207
+            2208:         184 Load 186(sCube)
+            2209:  167(fvec3) Load 169(c3)
+            2210:  7(f16vec4) ImageGather 2208 2209 2187
+            2211:  7(f16vec4) Load 2184(texel)
+            2212:  7(f16vec4) FAdd 2211 2210
+                              Store 2184(texel) 2212
+            2213:         184 Load 186(sCube)
+            2214:175(f16vec3) Load 177(f16c3)
+            2215:6(float16_t) Load 137(f16bias)
+            2216:  7(f16vec4) ImageGather 2213 2214 2187 Bias 2215
+            2217:  7(f16vec4) Load 2184(texel)
+            2218:  7(f16vec4) FAdd 2217 2216
+                              Store 2184(texel) 2218
+            2219:         299 Load 301(sCubeArray)
+            2220:  249(fvec4) Load 251(c4)
+            2221:  7(f16vec4) ImageGather 2219 2220 2187
+            2222:  7(f16vec4) Load 2184(texel)
+            2223:  7(f16vec4) FAdd 2222 2221
+                              Store 2184(texel) 2223
+            2224:         299 Load 301(sCubeArray)
+            2225:  7(f16vec4) Load 309(f16c4)
+            2226:6(float16_t) Load 137(f16bias)
+            2227:  7(f16vec4) ImageGather 2224 2225 2187 Bias 2226
+            2228:  7(f16vec4) Load 2184(texel)
+            2229:  7(f16vec4) FAdd 2228 2227
+                              Store 2184(texel) 2229
+            2230:         357 Load 359(s2DRect)
+            2231:   53(fvec2) Load 148(c2)
+            2232:  7(f16vec4) ImageGather 2230 2231 2187
+            2233:  7(f16vec4) Load 2184(texel)
+            2234:  7(f16vec4) FAdd 2233 2232
+                              Store 2184(texel) 2234
+            2235:         357 Load 359(s2DRect)
+            2236:154(f16vec2) Load 156(f16c2)
+            2237:  7(f16vec4) ImageGather 2235 2236 2187
+            2238:  7(f16vec4) Load 2184(texel)
+            2239:  7(f16vec4) FAdd 2238 2237
+                              Store 2184(texel) 2239
+            2240:         224 Load 226(s2DShadow)
+            2241:   53(fvec2) Load 148(c2)
+            2242:   52(float) Load 215(compare)
+            2243:  7(f16vec4) ImageDrefGather 2240 2241 2242
+            2244:  7(f16vec4) Load 2184(texel)
+            2245:  7(f16vec4) FAdd 2244 2243
+                              Store 2184(texel) 2245
+            2246:         224 Load 226(s2DShadow)
+            2247:154(f16vec2) Load 156(f16c2)
+            2248:   52(float) Load 215(compare)
+            2249:  7(f16vec4) ImageDrefGather 2246 2247 2248
+            2250:  7(f16vec4) Load 2184(texel)
+            2251:  7(f16vec4) FAdd 2250 2249
+                              Store 2184(texel) 2251
+            2252:         337 Load 339(s2DArrayShadow)
+            2253:  167(fvec3) Load 169(c3)
+            2254:   52(float) Load 215(compare)
+            2255:  7(f16vec4) ImageDrefGather 2252 2253 2254
+            2256:  7(f16vec4) Load 2184(texel)
+            2257:  7(f16vec4) FAdd 2256 2255
+                              Store 2184(texel) 2257
+            2258:         337 Load 339(s2DArrayShadow)
+            2259:175(f16vec3) Load 177(f16c3)
+            2260:   52(float) Load 215(compare)
+            2261:  7(f16vec4) ImageDrefGather 2258 2259 2260
+            2262:  7(f16vec4) Load 2184(texel)
+            2263:  7(f16vec4) FAdd 2262 2261
+                              Store 2184(texel) 2263
+            2264:         245 Load 247(sCubeShadow)
+            2265:  167(fvec3) Load 169(c3)
+            2266:   52(float) Load 215(compare)
+            2267:  7(f16vec4) ImageDrefGather 2264 2265 2266
+            2268:  7(f16vec4) Load 2184(texel)
+            2269:  7(f16vec4) FAdd 2268 2267
+                              Store 2184(texel) 2269
+            2270:         245 Load 247(sCubeShadow)
+            2271:175(f16vec3) Load 177(f16c3)
+            2272:   52(float) Load 215(compare)
+            2273:  7(f16vec4) ImageDrefGather 2270 2271 2272
+            2274:  7(f16vec4) Load 2184(texel)
+            2275:  7(f16vec4) FAdd 2274 2273
+                              Store 2184(texel) 2275
+            2276:         391 Load 393(sCubeArrayShadow)
+            2277:  249(fvec4) Load 251(c4)
+            2278:   52(float) Load 215(compare)
+            2279:  7(f16vec4) ImageDrefGather 2276 2277 2278
+            2280:  7(f16vec4) Load 2184(texel)
+            2281:  7(f16vec4) FAdd 2280 2279
+                              Store 2184(texel) 2281
+            2282:         391 Load 393(sCubeArrayShadow)
+            2283:  7(f16vec4) Load 309(f16c4)
+            2284:   52(float) Load 215(compare)
+            2285:  7(f16vec4) ImageDrefGather 2282 2283 2284
+            2286:  7(f16vec4) Load 2184(texel)
+            2287:  7(f16vec4) FAdd 2286 2285
+                              Store 2184(texel) 2287
+            2288:         371 Load 373(s2DRectShadow)
+            2289:   53(fvec2) Load 148(c2)
+            2290:   52(float) Load 215(compare)
+            2291:  7(f16vec4) ImageDrefGather 2288 2289 2290
+            2292:  7(f16vec4) Load 2184(texel)
+            2293:  7(f16vec4) FAdd 2292 2291
+                              Store 2184(texel) 2293
+            2294:         371 Load 373(s2DRectShadow)
+            2295:154(f16vec2) Load 156(f16c2)
+            2296:   52(float) Load 215(compare)
+            2297:  7(f16vec4) ImageDrefGather 2294 2295 2296
+            2298:  7(f16vec4) Load 2184(texel)
+            2299:  7(f16vec4) FAdd 2298 2297
+                              Store 2184(texel) 2299
+            2300:  7(f16vec4) Load 2184(texel)
+                              ReturnValue 2300
+                              FunctionEnd
+37(testTextureGatherOffset():  7(f16vec4) Function None 8
+              38:             Label
+     2303(texel):     64(ptr) Variable Function
+                              Store 2303(texel) 121
+            2304:         143 Load 145(s2D)
+            2305:   53(fvec2) Load 148(c2)
+            2306:  7(f16vec4) ImageGather 2304 2305 2187 ConstOffset 722
+            2307:  7(f16vec4) Load 2303(texel)
+            2308:  7(f16vec4) FAdd 2307 2306
+                              Store 2303(texel) 2308
+            2309:         143 Load 145(s2D)
+            2310:154(f16vec2) Load 156(f16c2)
+            2311:6(float16_t) Load 137(f16bias)
+            2312:  7(f16vec4) ImageGather 2309 2310 2187 Bias ConstOffset 2311 722
+            2313:  7(f16vec4) Load 2303(texel)
+            2314:  7(f16vec4) FAdd 2313 2312
+                              Store 2303(texel) 2314
+            2315:         284 Load 286(s2DArray)
+            2316:  167(fvec3) Load 169(c3)
+            2317:  7(f16vec4) ImageGather 2315 2316 2187 ConstOffset 722
+            2318:  7(f16vec4) Load 2303(texel)
+            2319:  7(f16vec4) FAdd 2318 2317
+                              Store 2303(texel) 2319
+            2320:         284 Load 286(s2DArray)
+            2321:175(f16vec3) Load 177(f16c3)
+            2322:6(float16_t) Load 137(f16bias)
+            2323:  7(f16vec4) ImageGather 2320 2321 2187 Bias ConstOffset 2322 722
+            2324:  7(f16vec4) Load 2303(texel)
+            2325:  7(f16vec4) FAdd 2324 2323
+                              Store 2303(texel) 2325
+            2326:         357 Load 359(s2DRect)
+            2327:   53(fvec2) Load 148(c2)
+            2328:  7(f16vec4) ImageGather 2326 2327 2187 ConstOffset 722
+            2329:  7(f16vec4) Load 2303(texel)
+            2330:  7(f16vec4) FAdd 2329 2328
+                              Store 2303(texel) 2330
+            2331:         357 Load 359(s2DRect)
+            2332:154(f16vec2) Load 156(f16c2)
+            2333:  7(f16vec4) ImageGather 2331 2332 2187 ConstOffset 722
+            2334:  7(f16vec4) Load 2303(texel)
+            2335:  7(f16vec4) FAdd 2334 2333
+                              Store 2303(texel) 2335
+            2336:         224 Load 226(s2DShadow)
+            2337:   53(fvec2) Load 148(c2)
+            2338:   52(float) Load 215(compare)
+            2339:  7(f16vec4) ImageDrefGather 2336 2337 2338 ConstOffset 722
+            2340:  7(f16vec4) Load 2303(texel)
+            2341:  7(f16vec4) FAdd 2340 2339
+                              Store 2303(texel) 2341
+            2342:         224 Load 226(s2DShadow)
+            2343:154(f16vec2) Load 156(f16c2)
+            2344:   52(float) Load 215(compare)
+            2345:  7(f16vec4) ImageDrefGather 2342 2343 2344 ConstOffset 722
+            2346:  7(f16vec4) Load 2303(texel)
+            2347:  7(f16vec4) FAdd 2346 2345
+                              Store 2303(texel) 2347
+            2348:         337 Load 339(s2DArrayShadow)
+            2349:  167(fvec3) Load 169(c3)
+            2350:   52(float) Load 215(compare)
+            2351:  7(f16vec4) ImageDrefGather 2348 2349 2350 ConstOffset 722
+            2352:  7(f16vec4) Load 2303(texel)
+            2353:  7(f16vec4) FAdd 2352 2351
+                              Store 2303(texel) 2353
+            2354:         337 Load 339(s2DArrayShadow)
+            2355:175(f16vec3) Load 177(f16c3)
+            2356:   52(float) Load 215(compare)
+            2357:  7(f16vec4) ImageDrefGather 2354 2355 2356 ConstOffset 722
+            2358:  7(f16vec4) Load 2303(texel)
+            2359:  7(f16vec4) FAdd 2358 2357
+                              Store 2303(texel) 2359
+            2360:         371 Load 373(s2DRectShadow)
+            2361:   53(fvec2) Load 148(c2)
+            2362:   52(float) Load 215(compare)
+            2363:  7(f16vec4) ImageDrefGather 2360 2361 2362 ConstOffset 722
+            2364:  7(f16vec4) Load 2303(texel)
+            2365:  7(f16vec4) FAdd 2364 2363
+                              Store 2303(texel) 2365
+            2366:         371 Load 373(s2DRectShadow)
+            2367:154(f16vec2) Load 156(f16c2)
+            2368:   52(float) Load 215(compare)
+            2369:  7(f16vec4) ImageDrefGather 2366 2367 2368 ConstOffset 722
+            2370:  7(f16vec4) Load 2303(texel)
+            2371:  7(f16vec4) FAdd 2370 2369
+                              Store 2303(texel) 2371
+            2372:  7(f16vec4) Load 2303(texel)
+                              ReturnValue 2372
+                              FunctionEnd
+39(testTextureGatherOffsets():  7(f16vec4) Function None 8
+              40:             Label
+     2375(texel):     64(ptr) Variable Function
+                              Store 2375(texel) 121
+            2376:         143 Load 145(s2D)
+            2377:   53(fvec2) Load 148(c2)
+            2381:  7(f16vec4) ImageGather 2376 2377 2187 ConstOffsets 2380
+            2382:  7(f16vec4) Load 2375(texel)
+            2383:  7(f16vec4) FAdd 2382 2381
+                              Store 2375(texel) 2383
+            2384:         143 Load 145(s2D)
+            2385:154(f16vec2) Load 156(f16c2)
+            2386:6(float16_t) Load 137(f16bias)
+            2387:  7(f16vec4) ImageGather 2384 2385 2187 Bias ConstOffsets 2386 2380
+            2388:  7(f16vec4) Load 2375(texel)
+            2389:  7(f16vec4) FAdd 2388 2387
+                              Store 2375(texel) 2389
+            2390:         284 Load 286(s2DArray)
+            2391:  167(fvec3) Load 169(c3)
+            2392:  7(f16vec4) ImageGather 2390 2391 2187 ConstOffsets 2380
+            2393:  7(f16vec4) Load 2375(texel)
+            2394:  7(f16vec4) FAdd 2393 2392
+                              Store 2375(texel) 2394
+            2395:         284 Load 286(s2DArray)
+            2396:175(f16vec3) Load 177(f16c3)
+            2397:6(float16_t) Load 137(f16bias)
+            2398:  7(f16vec4) ImageGather 2395 2396 2187 Bias ConstOffsets 2397 2380
+            2399:  7(f16vec4) Load 2375(texel)
+            2400:  7(f16vec4) FAdd 2399 2398
+                              Store 2375(texel) 2400
+            2401:         357 Load 359(s2DRect)
+            2402:   53(fvec2) Load 148(c2)
+            2403:  7(f16vec4) ImageGather 2401 2402 2187 ConstOffsets 2380
+            2404:  7(f16vec4) Load 2375(texel)
+            2405:  7(f16vec4) FAdd 2404 2403
+                              Store 2375(texel) 2405
+            2406:         357 Load 359(s2DRect)
+            2407:154(f16vec2) Load 156(f16c2)
+            2408:  7(f16vec4) ImageGather 2406 2407 2187 ConstOffsets 2380
+            2409:  7(f16vec4) Load 2375(texel)
+            2410:  7(f16vec4) FAdd 2409 2408
+                              Store 2375(texel) 2410
+            2411:         224 Load 226(s2DShadow)
+            2412:   53(fvec2) Load 148(c2)
+            2413:   52(float) Load 215(compare)
+            2414:  7(f16vec4) ImageDrefGather 2411 2412 2413 ConstOffsets 2380
+            2415:  7(f16vec4) Load 2375(texel)
+            2416:  7(f16vec4) FAdd 2415 2414
+                              Store 2375(texel) 2416
+            2417:         224 Load 226(s2DShadow)
+            2418:154(f16vec2) Load 156(f16c2)
+            2419:   52(float) Load 215(compare)
+            2420:  7(f16vec4) ImageDrefGather 2417 2418 2419 ConstOffsets 2380
+            2421:  7(f16vec4) Load 2375(texel)
+            2422:  7(f16vec4) FAdd 2421 2420
+                              Store 2375(texel) 2422
+            2423:         337 Load 339(s2DArrayShadow)
+            2424:  167(fvec3) Load 169(c3)
+            2425:   52(float) Load 215(compare)
+            2426:  7(f16vec4) ImageDrefGather 2423 2424 2425 ConstOffsets 2380
+            2427:  7(f16vec4) Load 2375(texel)
+            2428:  7(f16vec4) FAdd 2427 2426
+                              Store 2375(texel) 2428
+            2429:         337 Load 339(s2DArrayShadow)
+            2430:175(f16vec3) Load 177(f16c3)
+            2431:   52(float) Load 215(compare)
+            2432:  7(f16vec4) ImageDrefGather 2429 2430 2431 ConstOffsets 2380
+            2433:  7(f16vec4) Load 2375(texel)
+            2434:  7(f16vec4) FAdd 2433 2432
+                              Store 2375(texel) 2434
+            2435:         371 Load 373(s2DRectShadow)
+            2436:   53(fvec2) Load 148(c2)
+            2437:   52(float) Load 215(compare)
+            2438:  7(f16vec4) ImageDrefGather 2435 2436 2437 ConstOffsets 2380
+            2439:  7(f16vec4) Load 2375(texel)
+            2440:  7(f16vec4) FAdd 2439 2438
+                              Store 2375(texel) 2440
+            2441:         371 Load 373(s2DRectShadow)
+            2442:154(f16vec2) Load 156(f16c2)
+            2443:   52(float) Load 215(compare)
+            2444:  7(f16vec4) ImageDrefGather 2441 2442 2443 ConstOffsets 2380
+            2445:  7(f16vec4) Load 2375(texel)
+            2446:  7(f16vec4) FAdd 2445 2444
+                              Store 2375(texel) 2446
+            2447:  7(f16vec4) Load 2375(texel)
+                              ReturnValue 2447
+                              FunctionEnd
+41(testTextureGatherLod():  7(f16vec4) Function None 8
+              42:             Label
+     2450(texel):     64(ptr) Variable Function
+                              Store 2450(texel) 121
+            2451:         143 Load 145(s2D)
+            2452:   53(fvec2) Load 148(c2)
+            2453:   52(float) Load 565(lod)
+            2454:  7(f16vec4) ImageGather 2451 2452 2187 Lod 2453
+            2455:  7(f16vec4) Load 2450(texel)
+            2456:  7(f16vec4) FAdd 2455 2454
+                              Store 2450(texel) 2456
+            2457:         143 Load 145(s2D)
+            2458:154(f16vec2) Load 156(f16c2)
+            2459:6(float16_t) Load 572(f16lod)
+            2460:  7(f16vec4) ImageGather 2457 2458 2187 Lod 2459
+            2461:  7(f16vec4) Load 2450(texel)
+            2462:  7(f16vec4) FAdd 2461 2460
+                              Store 2450(texel) 2462
+            2463:         284 Load 286(s2DArray)
+            2464:  167(fvec3) Load 169(c3)
+            2465:   52(float) Load 565(lod)
+            2466:  7(f16vec4) ImageGather 2463 2464 2187 Lod 2465
+            2467:  7(f16vec4) Load 2450(texel)
+            2468:  7(f16vec4) FAdd 2467 2466
+                              Store 2450(texel) 2468
+            2469:         284 Load 286(s2DArray)
+            2470:175(f16vec3) Load 177(f16c3)
+            2471:6(float16_t) Load 572(f16lod)
+            2472:  7(f16vec4) ImageGather 2469 2470 2187 Lod 2471
+            2473:  7(f16vec4) Load 2450(texel)
+            2474:  7(f16vec4) FAdd 2473 2472
+                              Store 2450(texel) 2474
+            2475:         184 Load 186(sCube)
+            2476:  167(fvec3) Load 169(c3)
+            2477:   52(float) Load 565(lod)
+            2478:  7(f16vec4) ImageGather 2475 2476 2187 Lod 2477
+            2479:  7(f16vec4) Load 2450(texel)
+            2480:  7(f16vec4) FAdd 2479 2478
+                              Store 2450(texel) 2480
+            2481:         184 Load 186(sCube)
+            2482:175(f16vec3) Load 177(f16c3)
+            2483:6(float16_t) Load 572(f16lod)
+            2484:  7(f16vec4) ImageGather 2481 2482 2187 Lod 2483
+            2485:  7(f16vec4) Load 2450(texel)
+            2486:  7(f16vec4) FAdd 2485 2484
+                              Store 2450(texel) 2486
+            2487:         299 Load 301(sCubeArray)
+            2488:  249(fvec4) Load 251(c4)
+            2489:   52(float) Load 565(lod)
+            2490:  7(f16vec4) ImageGather 2487 2488 2187 Lod 2489
+            2491:  7(f16vec4) Load 2450(texel)
+            2492:  7(f16vec4) FAdd 2491 2490
+                              Store 2450(texel) 2492
+            2493:         299 Load 301(sCubeArray)
+            2494:  7(f16vec4) Load 309(f16c4)
+            2495:6(float16_t) Load 572(f16lod)
+            2496:  7(f16vec4) ImageGather 2493 2494 2187 Lod 2495
+            2497:  7(f16vec4) Load 2450(texel)
+            2498:  7(f16vec4) FAdd 2497 2496
+                              Store 2450(texel) 2498
+            2499:  7(f16vec4) Load 2450(texel)
+                              ReturnValue 2499
+                              FunctionEnd
+43(testTextureGatherLodOffset():  7(f16vec4) Function None 8
+              44:             Label
+     2502(texel):     64(ptr) Variable Function
+                              Store 2502(texel) 121
+            2503:         143 Load 145(s2D)
+            2504:   53(fvec2) Load 148(c2)
+            2505:   52(float) Load 565(lod)
+            2506:  7(f16vec4) ImageGather 2503 2504 2187 Lod ConstOffset 2505 722
+            2507:  7(f16vec4) Load 2502(texel)
+            2508:  7(f16vec4) FAdd 2507 2506
+                              Store 2502(texel) 2508
+            2509:         143 Load 145(s2D)
+            2510:154(f16vec2) Load 156(f16c2)
+            2511:6(float16_t) Load 572(f16lod)
+            2512:  7(f16vec4) ImageGather 2509 2510 2187 Lod ConstOffset 2511 722
+            2513:  7(f16vec4) Load 2502(texel)
+            2514:  7(f16vec4) FAdd 2513 2512
+                              Store 2502(texel) 2514
+            2515:         284 Load 286(s2DArray)
+            2516:  167(fvec3) Load 169(c3)
+            2517:   52(float) Load 565(lod)
+            2518:  7(f16vec4) ImageGather 2515 2516 2187 Lod ConstOffset 2517 722
+            2519:  7(f16vec4) Load 2502(texel)
+            2520:  7(f16vec4) FAdd 2519 2518
+                              Store 2502(texel) 2520
+            2521:         284 Load 286(s2DArray)
+            2522:175(f16vec3) Load 177(f16c3)
+            2523:6(float16_t) Load 572(f16lod)
+            2524:  7(f16vec4) ImageGather 2521 2522 2187 Lod ConstOffset 2523 722
+            2525:  7(f16vec4) Load 2502(texel)
+            2526:  7(f16vec4) FAdd 2525 2524
+                              Store 2502(texel) 2526
+            2527:  7(f16vec4) Load 2502(texel)
+                              ReturnValue 2527
+                              FunctionEnd
+45(testTextureGatherLodOffsets():  7(f16vec4) Function None 8
+              46:             Label
+     2530(texel):     64(ptr) Variable Function
+                              Store 2530(texel) 121
+            2531:         143 Load 145(s2D)
+            2532:   53(fvec2) Load 148(c2)
+            2533:   52(float) Load 565(lod)
+            2534:  7(f16vec4) ImageGather 2531 2532 2187 Lod ConstOffsets 2533 2380
+            2535:  7(f16vec4) Load 2530(texel)
+            2536:  7(f16vec4) FAdd 2535 2534
+                              Store 2530(texel) 2536
+            2537:         143 Load 145(s2D)
+            2538:154(f16vec2) Load 156(f16c2)
+            2539:6(float16_t) Load 572(f16lod)
+            2540:  7(f16vec4) ImageGather 2537 2538 2187 Lod ConstOffsets 2539 2380
+            2541:  7(f16vec4) Load 2530(texel)
+            2542:  7(f16vec4) FAdd 2541 2540
+                              Store 2530(texel) 2542
+            2543:         284 Load 286(s2DArray)
+            2544:  167(fvec3) Load 169(c3)
+            2545:   52(float) Load 565(lod)
+            2546:  7(f16vec4) ImageGather 2543 2544 2187 Lod ConstOffsets 2545 2380
+            2547:  7(f16vec4) Load 2530(texel)
+            2548:  7(f16vec4) FAdd 2547 2546
+                              Store 2530(texel) 2548
+            2549:         284 Load 286(s2DArray)
+            2550:175(f16vec3) Load 177(f16c3)
+            2551:6(float16_t) Load 572(f16lod)
+            2552:  7(f16vec4) ImageGather 2549 2550 2187 Lod ConstOffsets 2551 2380
+            2553:  7(f16vec4) Load 2530(texel)
+            2554:  7(f16vec4) FAdd 2553 2552
+                              Store 2530(texel) 2554
+            2555:  7(f16vec4) Load 2530(texel)
+                              ReturnValue 2555
+                              FunctionEnd
+50(testTextureSize():   48(ivec4) Function None 49
+              51:             Label
+      2559(size):   2558(ptr) Variable Function
+                              Store 2559(size) 2560
+            2561:         123 Load 125(s1D)
+            2562:   52(float) Load 565(lod)
+            2563:     47(int) ConvertFToS 2562
+            2564:         122 Image 2561
+            2565:     47(int) ImageQuerySizeLod 2564 2563
+            2567:   2566(ptr) AccessChain 2559(size) 207
+            2568:     47(int) Load 2567
+            2569:     47(int) IAdd 2568 2565
+            2570:   2566(ptr) AccessChain 2559(size) 207
+                              Store 2570 2569
+            2571:         143 Load 145(s2D)
+            2572:   52(float) Load 565(lod)
+            2573:     47(int) ConvertFToS 2572
+            2574:         142 Image 2571
+            2575:  721(ivec2) ImageQuerySizeLod 2574 2573
+            2576:   48(ivec4) Load 2559(size)
+            2577:  721(ivec2) VectorShuffle 2576 2576 0 1
+            2578:  721(ivec2) IAdd 2577 2575
+            2579:   48(ivec4) Load 2559(size)
+            2580:   48(ivec4) VectorShuffle 2579 2578 4 5 2 3
+                              Store 2559(size) 2580
+            2581:         163 Load 165(s3D)
+            2582:   52(float) Load 565(lod)
+            2583:     47(int) ConvertFToS 2582
+            2584:         162 Image 2581
+            2585:  734(ivec3) ImageQuerySizeLod 2584 2583
+            2586:   48(ivec4) Load 2559(size)
+            2587:  734(ivec3) VectorShuffle 2586 2586 0 1 2
+            2588:  734(ivec3) IAdd 2587 2585
+            2589:   48(ivec4) Load 2559(size)
+            2590:   48(ivec4) VectorShuffle 2589 2588 4 5 6 3
+                              Store 2559(size) 2590
+            2591:         184 Load 186(sCube)
+            2592:   52(float) Load 565(lod)
+            2593:     47(int) ConvertFToS 2592
+            2594:         183 Image 2591
+            2595:  721(ivec2) ImageQuerySizeLod 2594 2593
+            2596:   48(ivec4) Load 2559(size)
+            2597:  721(ivec2) VectorShuffle 2596 2596 0 1
+            2598:  721(ivec2) IAdd 2597 2595
+            2599:   48(ivec4) Load 2559(size)
+            2600:   48(ivec4) VectorShuffle 2599 2598 4 5 2 3
+                              Store 2559(size) 2600
+            2601:         199 Load 201(s1DShadow)
+            2602:   52(float) Load 565(lod)
+            2603:     47(int) ConvertFToS 2602
+            2604:         198 Image 2601
+            2605:     47(int) ImageQuerySizeLod 2604 2603
+            2606:   2566(ptr) AccessChain 2559(size) 207
+            2607:     47(int) Load 2606
+            2608:     47(int) IAdd 2607 2605
+            2609:   2566(ptr) AccessChain 2559(size) 207
+                              Store 2609 2608
+            2610:         224 Load 226(s2DShadow)
+            2611:   52(float) Load 565(lod)
+            2612:     47(int) ConvertFToS 2611
+            2613:         223 Image 2610
+            2614:  721(ivec2) ImageQuerySizeLod 2613 2612
+            2615:   48(ivec4) Load 2559(size)
+            2616:  721(ivec2) VectorShuffle 2615 2615 0 1
+            2617:  721(ivec2) IAdd 2616 2614
+            2618:   48(ivec4) Load 2559(size)
+            2619:   48(ivec4) VectorShuffle 2618 2617 4 5 2 3
+                              Store 2559(size) 2619
+            2620:         245 Load 247(sCubeShadow)
+            2621:   52(float) Load 565(lod)
+            2622:     47(int) ConvertFToS 2621
+            2623:         244 Image 2620
+            2624:  721(ivec2) ImageQuerySizeLod 2623 2622
+            2625:   48(ivec4) Load 2559(size)
+            2626:  721(ivec2) VectorShuffle 2625 2625 0 1
+            2627:  721(ivec2) IAdd 2626 2624
+            2628:   48(ivec4) Load 2559(size)
+            2629:   48(ivec4) VectorShuffle 2628 2627 4 5 2 3
+                              Store 2559(size) 2629
+            2630:         299 Load 301(sCubeArray)
+            2631:   52(float) Load 565(lod)
+            2632:     47(int) ConvertFToS 2631
+            2633:         298 Image 2630
+            2634:  734(ivec3) ImageQuerySizeLod 2633 2632
+            2635:   48(ivec4) Load 2559(size)
+            2636:  734(ivec3) VectorShuffle 2635 2635 0 1 2
+            2637:  734(ivec3) IAdd 2636 2634
+            2638:   48(ivec4) Load 2559(size)
+            2639:   48(ivec4) VectorShuffle 2638 2637 4 5 6 3
+                              Store 2559(size) 2639
+            2640:         391 Load 393(sCubeArrayShadow)
+            2641:   52(float) Load 565(lod)
+            2642:     47(int) ConvertFToS 2641
+            2643:         390 Image 2640
+            2644:  734(ivec3) ImageQuerySizeLod 2643 2642
+            2645:   48(ivec4) Load 2559(size)
+            2646:  734(ivec3) VectorShuffle 2645 2645 0 1 2
+            2647:  734(ivec3) IAdd 2646 2644
+            2648:   48(ivec4) Load 2559(size)
+            2649:   48(ivec4) VectorShuffle 2648 2647 4 5 6 3
+                              Store 2559(size) 2649
+            2650:         357 Load 359(s2DRect)
+            2651:         356 Image 2650
+            2652:  721(ivec2) ImageQuerySize 2651
+            2653:   48(ivec4) Load 2559(size)
+            2654:  721(ivec2) VectorShuffle 2653 2653 0 1
+            2655:  721(ivec2) IAdd 2654 2652
+            2656:   48(ivec4) Load 2559(size)
+            2657:   48(ivec4) VectorShuffle 2656 2655 4 5 2 3
+                              Store 2559(size) 2657
+            2658:         371 Load 373(s2DRectShadow)
+            2659:         370 Image 2658
+            2660:  721(ivec2) ImageQuerySize 2659
+            2661:   48(ivec4) Load 2559(size)
+            2662:  721(ivec2) VectorShuffle 2661 2661 0 1
+            2663:  721(ivec2) IAdd 2662 2660
+            2664:   48(ivec4) Load 2559(size)
+            2665:   48(ivec4) VectorShuffle 2664 2663 4 5 2 3
+                              Store 2559(size) 2665
+            2666:         269 Load 271(s1DArray)
+            2667:   52(float) Load 565(lod)
+            2668:     47(int) ConvertFToS 2667
+            2669:         268 Image 2666
+            2670:  721(ivec2) ImageQuerySizeLod 2669 2668
+            2671:   48(ivec4) Load 2559(size)
+            2672:  721(ivec2) VectorShuffle 2671 2671 0 1
+            2673:  721(ivec2) IAdd 2672 2670
+            2674:   48(ivec4) Load 2559(size)
+            2675:   48(ivec4) VectorShuffle 2674 2673 4 5 2 3
+                              Store 2559(size) 2675
+            2676:         284 Load 286(s2DArray)
+            2677:   52(float) Load 565(lod)
+            2678:     47(int) ConvertFToS 2677
+            2679:         283 Image 2676
+            2680:  734(ivec3) ImageQuerySizeLod 2679 2678
+            2681:   48(ivec4) Load 2559(size)
+            2682:  734(ivec3) VectorShuffle 2681 2681 0 1 2
+            2683:  734(ivec3) IAdd 2682 2680
+            2684:   48(ivec4) Load 2559(size)
+            2685:   48(ivec4) VectorShuffle 2684 2683 4 5 6 3
+                              Store 2559(size) 2685
+            2686:         316 Load 318(s1DArrayShadow)
+            2687:   52(float) Load 565(lod)
+            2688:     47(int) ConvertFToS 2687
+            2689:         315 Image 2686
+            2690:  721(ivec2) ImageQuerySizeLod 2689 2688
+            2691:   48(ivec4) Load 2559(size)
+            2692:  721(ivec2) VectorShuffle 2691 2691 0 1
+            2693:  721(ivec2) IAdd 2692 2690
+            2694:   48(ivec4) Load 2559(size)
+            2695:   48(ivec4) VectorShuffle 2694 2693 4 5 2 3
+                              Store 2559(size) 2695
+            2696:         337 Load 339(s2DArrayShadow)
+            2697:   52(float) Load 565(lod)
+            2698:     47(int) ConvertFToS 2697
+            2699:         336 Image 2696
+            2700:  734(ivec3) ImageQuerySizeLod 2699 2698
+            2701:   48(ivec4) Load 2559(size)
+            2702:  734(ivec3) VectorShuffle 2701 2701 0 1 2
+            2703:  734(ivec3) IAdd 2702 2700
+            2704:   48(ivec4) Load 2559(size)
+            2705:   48(ivec4) VectorShuffle 2704 2703 4 5 6 3
+                              Store 2559(size) 2705
+            2706:        1298 Load 1300(sBuffer)
+            2707:        1297 Image 2706
+            2708:     47(int) ImageQuerySize 2707
+            2709:   2566(ptr) AccessChain 2559(size) 207
+            2710:     47(int) Load 2709
+            2711:     47(int) IAdd 2710 2708
+            2712:   2566(ptr) AccessChain 2559(size) 207
+                              Store 2712 2711
+            2713:        1309 Load 1311(s2DMS)
+            2714:        1308 Image 2713
+            2715:  721(ivec2) ImageQuerySize 2714
+            2716:   48(ivec4) Load 2559(size)
+            2717:  721(ivec2) VectorShuffle 2716 2716 0 1
+            2718:  721(ivec2) IAdd 2717 2715
+            2719:   48(ivec4) Load 2559(size)
+            2720:   48(ivec4) VectorShuffle 2719 2718 4 5 2 3
+                              Store 2559(size) 2720
+            2721:        1320 Load 1322(s2DMSArray)
+            2722:        1319 Image 2721
+            2723:  734(ivec3) ImageQuerySize 2722
+            2724:   48(ivec4) Load 2559(size)
+            2725:  734(ivec3) VectorShuffle 2724 2724 0 1 2
+            2726:  734(ivec3) IAdd 2725 2723
+            2727:   48(ivec4) Load 2559(size)
+            2728:   48(ivec4) VectorShuffle 2727 2726 4 5 6 3
+                              Store 2559(size) 2728
+            2729:   48(ivec4) Load 2559(size)
+                              ReturnValue 2729
+                              FunctionEnd
+55(testTextureQueryLod():   53(fvec2) Function None 54
+              56:             Label
+       2733(lod):   2732(ptr) Variable Function
+                              Store 2733(lod) 2735
+            2736:         123 Load 125(s1D)
+            2737:   52(float) Load 128(c1)
+            2738:   53(fvec2) ImageQueryLod 2736 2737
+            2739:   53(fvec2) Load 2733(lod)
+            2740:   53(fvec2) FAdd 2739 2738
+                              Store 2733(lod) 2740
+            2741:         123 Load 125(s1D)
+            2742:6(float16_t) Load 135(f16c1)
+            2743:154(f16vec2) ImageQueryLod 2741 2742
+            2744:   53(fvec2) Load 2733(lod)
+            2745:   53(fvec2) FAdd 2744 2743
+                              Store 2733(lod) 2745
+            2746:         143 Load 145(s2D)
+            2747:   53(fvec2) Load 148(c2)
+            2748:   53(fvec2) ImageQueryLod 2746 2747
+            2749:   53(fvec2) Load 2733(lod)
+            2750:   53(fvec2) FAdd 2749 2748
+                              Store 2733(lod) 2750
+            2751:         143 Load 145(s2D)
+            2752:154(f16vec2) Load 156(f16c2)
+            2753:154(f16vec2) ImageQueryLod 2751 2752
+            2754:   53(fvec2) Load 2733(lod)
+            2755:   53(fvec2) FAdd 2754 2753
+                              Store 2733(lod) 2755
+            2756:         163 Load 165(s3D)
+            2757:  167(fvec3) Load 169(c3)
+            2758:   53(fvec2) ImageQueryLod 2756 2757
+            2759:   53(fvec2) Load 2733(lod)
+            2760:   53(fvec2) FAdd 2759 2758
+                              Store 2733(lod) 2760
+            2761:         163 Load 165(s3D)
+            2762:175(f16vec3) Load 177(f16c3)
+            2763:154(f16vec2) ImageQueryLod 2761 2762
+            2764:   53(fvec2) Load 2733(lod)
+            2765:   53(fvec2) FAdd 2764 2763
+                              Store 2733(lod) 2765
+            2766:         184 Load 186(sCube)
+            2767:  167(fvec3) Load 169(c3)
+            2768:   53(fvec2) ImageQueryLod 2766 2767
+            2769:   53(fvec2) Load 2733(lod)
+            2770:   53(fvec2) FAdd 2769 2768
+                              Store 2733(lod) 2770
+            2771:         184 Load 186(sCube)
+            2772:175(f16vec3) Load 177(f16c3)
+            2773:154(f16vec2) ImageQueryLod 2771 2772
+            2774:   53(fvec2) Load 2733(lod)
+            2775:   53(fvec2) FAdd 2774 2773
+                              Store 2733(lod) 2775
+            2776:         269 Load 271(s1DArray)
+            2777:   52(float) Load 128(c1)
+            2778:   53(fvec2) ImageQueryLod 2776 2777
+            2779:   53(fvec2) Load 2733(lod)
+            2780:   53(fvec2) FAdd 2779 2778
+                              Store 2733(lod) 2780
+            2781:         269 Load 271(s1DArray)
+            2782:6(float16_t) Load 135(f16c1)
+            2783:154(f16vec2) ImageQueryLod 2781 2782
+            2784:   53(fvec2) Load 2733(lod)
+            2785:   53(fvec2) FAdd 2784 2783
+                              Store 2733(lod) 2785
+            2786:         284 Load 286(s2DArray)
+            2787:   53(fvec2) Load 148(c2)
+            2788:   53(fvec2) ImageQueryLod 2786 2787
+            2789:   53(fvec2) Load 2733(lod)
+            2790:   53(fvec2) FAdd 2789 2788
+                              Store 2733(lod) 2790
+            2791:         284 Load 286(s2DArray)
+            2792:154(f16vec2) Load 156(f16c2)
+            2793:154(f16vec2) ImageQueryLod 2791 2792
+            2794:   53(fvec2) Load 2733(lod)
+            2795:   53(fvec2) FAdd 2794 2793
+                              Store 2733(lod) 2795
+            2796:         299 Load 301(sCubeArray)
+            2797:  167(fvec3) Load 169(c3)
+            2798:   53(fvec2) ImageQueryLod 2796 2797
+            2799:   53(fvec2) Load 2733(lod)
+            2800:   53(fvec2) FAdd 2799 2798
+                              Store 2733(lod) 2800
+            2801:         299 Load 301(sCubeArray)
+            2802:175(f16vec3) Load 177(f16c3)
+            2803:154(f16vec2) ImageQueryLod 2801 2802
+            2804:   53(fvec2) Load 2733(lod)
+            2805:   53(fvec2) FAdd 2804 2803
+                              Store 2733(lod) 2805
+            2806:         199 Load 201(s1DShadow)
+            2807:   52(float) Load 128(c1)
+            2808:   53(fvec2) ImageQueryLod 2806 2807
+            2809:   53(fvec2) Load 2733(lod)
+            2810:   53(fvec2) FAdd 2809 2808
+                              Store 2733(lod) 2810
+            2811:         199 Load 201(s1DShadow)
+            2812:6(float16_t) Load 135(f16c1)
+            2813:154(f16vec2) ImageQueryLod 2811 2812
+            2814:   53(fvec2) Load 2733(lod)
+            2815:   53(fvec2) FAdd 2814 2813
+                              Store 2733(lod) 2815
+            2816:         224 Load 226(s2DShadow)
+            2817:   53(fvec2) Load 148(c2)
+            2818:   53(fvec2) ImageQueryLod 2816 2817
+            2819:   53(fvec2) Load 2733(lod)
+            2820:   53(fvec2) FAdd 2819 2818
+                              Store 2733(lod) 2820
+            2821:         224 Load 226(s2DShadow)
+            2822:154(f16vec2) Load 156(f16c2)
+            2823:154(f16vec2) ImageQueryLod 2821 2822
+            2824:   53(fvec2) Load 2733(lod)
+            2825:   53(fvec2) FAdd 2824 2823
+                              Store 2733(lod) 2825
+            2826:         391 Load 393(sCubeArrayShadow)
+            2827:  167(fvec3) Load 169(c3)
+            2828:   53(fvec2) ImageQueryLod 2826 2827
+            2829:   53(fvec2) Load 2733(lod)
+            2830:   53(fvec2) FAdd 2829 2828
+                              Store 2733(lod) 2830
+            2831:         391 Load 393(sCubeArrayShadow)
+            2832:175(f16vec3) Load 177(f16c3)
+            2833:154(f16vec2) ImageQueryLod 2831 2832
+            2834:   53(fvec2) Load 2733(lod)
+            2835:   53(fvec2) FAdd 2834 2833
+                              Store 2733(lod) 2835
+            2836:         316 Load 318(s1DArrayShadow)
+            2837:   52(float) Load 128(c1)
+            2838:   53(fvec2) ImageQueryLod 2836 2837
+            2839:   53(fvec2) Load 2733(lod)
+            2840:   53(fvec2) FAdd 2839 2838
+                              Store 2733(lod) 2840
+            2841:         316 Load 318(s1DArrayShadow)
+            2842:6(float16_t) Load 135(f16c1)
+            2843:154(f16vec2) ImageQueryLod 2841 2842
+            2844:   53(fvec2) Load 2733(lod)
+            2845:   53(fvec2) FAdd 2844 2843
+                              Store 2733(lod) 2845
+            2846:         337 Load 339(s2DArrayShadow)
+            2847:   53(fvec2) Load 148(c2)
+            2848:   53(fvec2) ImageQueryLod 2846 2847
+            2849:   53(fvec2) Load 2733(lod)
+            2850:   53(fvec2) FAdd 2849 2848
+                              Store 2733(lod) 2850
+            2851:         337 Load 339(s2DArrayShadow)
+            2852:154(f16vec2) Load 156(f16c2)
+            2853:154(f16vec2) ImageQueryLod 2851 2852
+            2854:   53(fvec2) Load 2733(lod)
+            2855:   53(fvec2) FAdd 2854 2853
+                              Store 2733(lod) 2855
+            2856:         391 Load 393(sCubeArrayShadow)
+            2857:  167(fvec3) Load 169(c3)
+            2858:   53(fvec2) ImageQueryLod 2856 2857
+            2859:   53(fvec2) Load 2733(lod)
+            2860:   53(fvec2) FAdd 2859 2858
+                              Store 2733(lod) 2860
+            2861:         391 Load 393(sCubeArrayShadow)
+            2862:175(f16vec3) Load 177(f16c3)
+            2863:154(f16vec2) ImageQueryLod 2861 2862
+            2864:   53(fvec2) Load 2733(lod)
+            2865:   53(fvec2) FAdd 2864 2863
+                              Store 2733(lod) 2865
+            2866:   53(fvec2) Load 2733(lod)
+                              ReturnValue 2866
+                              FunctionEnd
+58(testTextureQueryLevels():     47(int) Function None 57
+              59:             Label
+    2869(levels):   2566(ptr) Variable Function
+                              Store 2869(levels) 2187
+            2870:         123 Load 125(s1D)
+            2871:         122 Image 2870
+            2872:     47(int) ImageQueryLevels 2871
+            2873:     47(int) Load 2869(levels)
+            2874:     47(int) IAdd 2873 2872
+                              Store 2869(levels) 2874
+            2875:         143 Load 145(s2D)
+            2876:         142 Image 2875
+            2877:     47(int) ImageQueryLevels 2876
+            2878:     47(int) Load 2869(levels)
+            2879:     47(int) IAdd 2878 2877
+                              Store 2869(levels) 2879
+            2880:         163 Load 165(s3D)
+            2881:         162 Image 2880
+            2882:     47(int) ImageQueryLevels 2881
+            2883:     47(int) Load 2869(levels)
+            2884:     47(int) IAdd 2883 2882
+                              Store 2869(levels) 2884
+            2885:         184 Load 186(sCube)
+            2886:         183 Image 2885
+            2887:     47(int) ImageQueryLevels 2886
+            2888:     47(int) Load 2869(levels)
+            2889:     47(int) IAdd 2888 2887
+                              Store 2869(levels) 2889
+            2890:         199 Load 201(s1DShadow)
+            2891:         198 Image 2890
+            2892:     47(int) ImageQueryLevels 2891
+            2893:     47(int) Load 2869(levels)
+            2894:     47(int) IAdd 2893 2892
+                              Store 2869(levels) 2894
+            2895:         224 Load 226(s2DShadow)
+            2896:         223 Image 2895
+            2897:     47(int) ImageQueryLevels 2896
+            2898:     47(int) Load 2869(levels)
+            2899:     47(int) IAdd 2898 2897
+                              Store 2869(levels) 2899
+            2900:         245 Load 247(sCubeShadow)
+            2901:         244 Image 2900
+            2902:     47(int) ImageQueryLevels 2901
+            2903:     47(int) Load 2869(levels)
+            2904:     47(int) IAdd 2903 2902
+                              Store 2869(levels) 2904
+            2905:         299 Load 301(sCubeArray)
+            2906:         298 Image 2905
+            2907:     47(int) ImageQueryLevels 2906
+            2908:     47(int) Load 2869(levels)
+            2909:     47(int) IAdd 2908 2907
+                              Store 2869(levels) 2909
+            2910:         391 Load 393(sCubeArrayShadow)
+            2911:         390 Image 2910
+            2912:     47(int) ImageQueryLevels 2911
+            2913:     47(int) Load 2869(levels)
+            2914:     47(int) IAdd 2913 2912
+                              Store 2869(levels) 2914
+            2915:         269 Load 271(s1DArray)
+            2916:         268 Image 2915
+            2917:     47(int) ImageQueryLevels 2916
+            2918:     47(int) Load 2869(levels)
+            2919:     47(int) IAdd 2918 2917
+                              Store 2869(levels) 2919
+            2920:         284 Load 286(s2DArray)
+            2921:         283 Image 2920
+            2922:     47(int) ImageQueryLevels 2921
+            2923:     47(int) Load 2869(levels)
+            2924:     47(int) IAdd 2923 2922
+                              Store 2869(levels) 2924
+            2925:         316 Load 318(s1DArrayShadow)
+            2926:         315 Image 2925
+            2927:     47(int) ImageQueryLevels 2926
+            2928:     47(int) Load 2869(levels)
+            2929:     47(int) IAdd 2928 2927
+                              Store 2869(levels) 2929
+            2930:         337 Load 339(s2DArrayShadow)
+            2931:         336 Image 2930
+            2932:     47(int) ImageQueryLevels 2931
+            2933:     47(int) Load 2869(levels)
+            2934:     47(int) IAdd 2933 2932
+                              Store 2869(levels) 2934
+            2935:     47(int) Load 2869(levels)
+                              ReturnValue 2935
+                              FunctionEnd
+60(testTextureSamples():     47(int) Function None 57
+              61:             Label
+   2938(samples):   2566(ptr) Variable Function
+                              Store 2938(samples) 2187
+            2939:        1309 Load 1311(s2DMS)
+            2940:        1308 Image 2939
+            2941:     47(int) ImageQuerySamples 2940
+            2942:     47(int) Load 2938(samples)
+            2943:     47(int) IAdd 2942 2941
+                              Store 2938(samples) 2943
+            2944:        1320 Load 1322(s2DMSArray)
+            2945:        1319 Image 2944
+            2946:     47(int) ImageQuerySamples 2945
+            2947:     47(int) Load 2938(samples)
+            2948:     47(int) IAdd 2947 2946
+                              Store 2938(samples) 2948
+            2949:     47(int) Load 2938(samples)
+                              ReturnValue 2949
+                              FunctionEnd
+62(testImageLoad():  7(f16vec4) Function None 8
+              63:             Label
+     2952(texel):     64(ptr) Variable Function
+                              Store 2952(texel) 121
+            2956:        2953 Load 2955(i1D)
+            2957:   52(float) Load 128(c1)
+            2958:     47(int) ConvertFToS 2957
+            2959:  7(f16vec4) ImageRead 2956 2958
+            2960:  7(f16vec4) Load 2952(texel)
+            2961:  7(f16vec4) FAdd 2960 2959
+                              Store 2952(texel) 2961
+            2965:        2962 Load 2964(i2D)
+            2966:   53(fvec2) Load 148(c2)
+            2967:  721(ivec2) ConvertFToS 2966
+            2968:  7(f16vec4) ImageRead 2965 2967
+            2969:  7(f16vec4) Load 2952(texel)
+            2970:  7(f16vec4) FAdd 2969 2968
+                              Store 2952(texel) 2970
+            2974:        2971 Load 2973(i3D)
+            2975:  167(fvec3) Load 169(c3)
+            2976:  734(ivec3) ConvertFToS 2975
+            2977:  7(f16vec4) ImageRead 2974 2976
+            2978:  7(f16vec4) Load 2952(texel)
+            2979:  7(f16vec4) FAdd 2978 2977
+                              Store 2952(texel) 2979
+            2983:        2980 Load 2982(i2DRect)
+            2984:   53(fvec2) Load 148(c2)
+            2985:  721(ivec2) ConvertFToS 2984
+            2986:  7(f16vec4) ImageRead 2983 2985
+            2987:  7(f16vec4) Load 2952(texel)
+            2988:  7(f16vec4) FAdd 2987 2986
+                              Store 2952(texel) 2988
+            2992:        2989 Load 2991(iCube)
+            2993:  167(fvec3) Load 169(c3)
+            2994:  734(ivec3) ConvertFToS 2993
+            2995:  7(f16vec4) ImageRead 2992 2994
+            2996:  7(f16vec4) Load 2952(texel)
+            2997:  7(f16vec4) FAdd 2996 2995
+                              Store 2952(texel) 2997
+            3001:        2998 Load 3000(iBuffer)
+            3002:   52(float) Load 128(c1)
+            3003:     47(int) ConvertFToS 3002
+            3004:  7(f16vec4) ImageRead 3001 3003
+            3005:  7(f16vec4) Load 2952(texel)
+            3006:  7(f16vec4) FAdd 3005 3004
+                              Store 2952(texel) 3006
+            3010:        3007 Load 3009(i1DArray)
+            3011:   53(fvec2) Load 148(c2)
+            3012:  721(ivec2) ConvertFToS 3011
+            3013:  7(f16vec4) ImageRead 3010 3012
+            3014:  7(f16vec4) Load 2952(texel)
+            3015:  7(f16vec4) FAdd 3014 3013
+                              Store 2952(texel) 3015
+            3019:        3016 Load 3018(i2DArray)
+            3020:  167(fvec3) Load 169(c3)
+            3021:  734(ivec3) ConvertFToS 3020
+            3022:  7(f16vec4) ImageRead 3019 3021
+            3023:  7(f16vec4) Load 2952(texel)
+            3024:  7(f16vec4) FAdd 3023 3022
+                              Store 2952(texel) 3024
+            3028:        3025 Load 3027(iCubeArray)
+            3029:  167(fvec3) Load 169(c3)
+            3030:  734(ivec3) ConvertFToS 3029
+            3031:  7(f16vec4) ImageRead 3028 3030
+            3032:  7(f16vec4) Load 2952(texel)
+            3033:  7(f16vec4) FAdd 3032 3031
+                              Store 2952(texel) 3033
+            3037:        3034 Load 3036(i2DMS)
+            3038:   53(fvec2) Load 148(c2)
+            3039:  721(ivec2) ConvertFToS 3038
+            3040:  7(f16vec4) ImageRead 3037 3039 Sample 709
+            3041:  7(f16vec4) Load 2952(texel)
+            3042:  7(f16vec4) FAdd 3041 3040
+                              Store 2952(texel) 3042
+            3046:        3043 Load 3045(i2DMSArray)
+            3047:  167(fvec3) Load 169(c3)
+            3048:  734(ivec3) ConvertFToS 3047
+            3049:  7(f16vec4) ImageRead 3046 3048 Sample 709
+            3050:  7(f16vec4) Load 2952(texel)
+            3051:  7(f16vec4) FAdd 3050 3049
+                              Store 2952(texel) 3051
+            3052:  7(f16vec4) Load 2952(texel)
+                              ReturnValue 3052
+                              FunctionEnd
+67(testImageStore(vf164;):           2 Function None 65
+        66(data):     64(ptr) FunctionParameter
+              68:             Label
+            3055:        2953 Load 2955(i1D)
+            3056:   52(float) Load 128(c1)
+            3057:     47(int) ConvertFToS 3056
+            3058:  7(f16vec4) Load 66(data)
+                              ImageWrite 3055 3057 3058
+            3059:        2962 Load 2964(i2D)
+            3060:   53(fvec2) Load 148(c2)
+            3061:  721(ivec2) ConvertFToS 3060
+            3062:  7(f16vec4) Load 66(data)
+                              ImageWrite 3059 3061 3062
+            3063:        2971 Load 2973(i3D)
+            3064:  167(fvec3) Load 169(c3)
+            3065:  734(ivec3) ConvertFToS 3064
+            3066:  7(f16vec4) Load 66(data)
+                              ImageWrite 3063 3065 3066
+            3067:        2980 Load 2982(i2DRect)
+            3068:   53(fvec2) Load 148(c2)
+            3069:  721(ivec2) ConvertFToS 3068
+            3070:  7(f16vec4) Load 66(data)
+                              ImageWrite 3067 3069 3070
+            3071:        2989 Load 2991(iCube)
+            3072:  167(fvec3) Load 169(c3)
+            3073:  734(ivec3) ConvertFToS 3072
+            3074:  7(f16vec4) Load 66(data)
+                              ImageWrite 3071 3073 3074
+            3075:        2998 Load 3000(iBuffer)
+            3076:   52(float) Load 128(c1)
+            3077:     47(int) ConvertFToS 3076
+            3078:  7(f16vec4) Load 66(data)
+                              ImageWrite 3075 3077 3078
+            3079:        3007 Load 3009(i1DArray)
+            3080:   53(fvec2) Load 148(c2)
+            3081:  721(ivec2) ConvertFToS 3080
+            3082:  7(f16vec4) Load 66(data)
+                              ImageWrite 3079 3081 3082
+            3083:        3016 Load 3018(i2DArray)
+            3084:  167(fvec3) Load 169(c3)
+            3085:  734(ivec3) ConvertFToS 3084
+            3086:  7(f16vec4) Load 66(data)
+                              ImageWrite 3083 3085 3086
+            3087:        3025 Load 3027(iCubeArray)
+            3088:  167(fvec3) Load 169(c3)
+            3089:  734(ivec3) ConvertFToS 3088
+            3090:  7(f16vec4) Load 66(data)
+                              ImageWrite 3087 3089 3090
+            3091:        3034 Load 3036(i2DMS)
+            3092:   53(fvec2) Load 148(c2)
+            3093:  721(ivec2) ConvertFToS 3092
+            3094:  7(f16vec4) Load 66(data)
+                              ImageWrite 3091 3093 3094 Sample 709
+            3095:        3043 Load 3045(i2DMSArray)
+            3096:  167(fvec3) Load 169(c3)
+            3097:  734(ivec3) ConvertFToS 3096
+            3098:  7(f16vec4) Load 66(data)
+                              ImageWrite 3095 3097 3098 Sample 709
+                              Return
+                              FunctionEnd
+69(testSparseTexture():  7(f16vec4) Function None 8
+              70:             Label
+     3099(texel):     64(ptr) Variable Function
+                              Store 3099(texel) 121
+            3100:         143 Load 145(s2D)
+            3101:   53(fvec2) Load 148(c2)
+            3103:3102(ResType) ImageSparseSampleImplicitLod 3100 3101
+            3104:  7(f16vec4) CompositeExtract 3103 1
+                              Store 3099(texel) 3104
+            3105:     47(int) CompositeExtract 3103 0
+            3106:         143 Load 145(s2D)
+            3107:154(f16vec2) Load 156(f16c2)
+            3108:6(float16_t) Load 137(f16bias)
+            3109:3102(ResType) ImageSparseSampleImplicitLod 3106 3107 Bias 3108
+            3110:  7(f16vec4) CompositeExtract 3109 1
+                              Store 3099(texel) 3110
+            3111:     47(int) CompositeExtract 3109 0
+            3112:         163 Load 165(s3D)
+            3113:  167(fvec3) Load 169(c3)
+            3114:3102(ResType) ImageSparseSampleImplicitLod 3112 3113
+            3115:  7(f16vec4) CompositeExtract 3114 1
+                              Store 3099(texel) 3115
+            3116:     47(int) CompositeExtract 3114 0
+            3117:         163 Load 165(s3D)
+            3118:175(f16vec3) Load 177(f16c3)
+            3119:6(float16_t) Load 137(f16bias)
+            3120:3102(ResType) ImageSparseSampleImplicitLod 3117 3118 Bias 3119
+            3121:  7(f16vec4) CompositeExtract 3120 1
+                              Store 3099(texel) 3121
+            3122:     47(int) CompositeExtract 3120 0
+            3123:         184 Load 186(sCube)
+            3124:  167(fvec3) Load 169(c3)
+            3125:3102(ResType) ImageSparseSampleImplicitLod 3123 3124
+            3126:  7(f16vec4) CompositeExtract 3125 1
+                              Store 3099(texel) 3126
+            3127:     47(int) CompositeExtract 3125 0
+            3128:         184 Load 186(sCube)
+            3129:175(f16vec3) Load 177(f16c3)
+            3130:6(float16_t) Load 137(f16bias)
+            3131:3102(ResType) ImageSparseSampleImplicitLod 3128 3129 Bias 3130
+            3132:  7(f16vec4) CompositeExtract 3131 1
+                              Store 3099(texel) 3132
+            3133:     47(int) CompositeExtract 3131 0
+            3134:         224 Load 226(s2DShadow)
+            3135:  167(fvec3) Load 169(c3)
+            3136:    208(ptr) AccessChain 3099(texel) 207
+            3137:   52(float) CompositeExtract 3135 2
+            3139:3138(ResType) ImageSparseSampleDrefImplicitLod 3134 3135 3137
+            3140:6(float16_t) CompositeExtract 3139 1
+                              Store 3136 3140
+            3141:     47(int) CompositeExtract 3139 0
+            3142:         224 Load 226(s2DShadow)
+            3143:154(f16vec2) Load 156(f16c2)
+            3144:   52(float) Load 215(compare)
+            3145:    208(ptr) AccessChain 3099(texel) 207
+            3146:6(float16_t) Load 137(f16bias)
+            3147:3138(ResType) ImageSparseSampleDrefImplicitLod 3142 3143 3144 Bias 3146
+            3148:6(float16_t) CompositeExtract 3147 1
+                              Store 3145 3148
+            3149:     47(int) CompositeExtract 3147 0
+            3150:         245 Load 247(sCubeShadow)
+            3151:  249(fvec4) Load 251(c4)
+            3152:    208(ptr) AccessChain 3099(texel) 207
+            3153:   52(float) CompositeExtract 3151 3
+            3154:3138(ResType) ImageSparseSampleDrefImplicitLod 3150 3151 3153
+            3155:6(float16_t) CompositeExtract 3154 1
+                              Store 3152 3155
+            3156:     47(int) CompositeExtract 3154 0
+            3157:         245 Load 247(sCubeShadow)
+            3158:175(f16vec3) Load 177(f16c3)
+            3159:   52(float) Load 215(compare)
+            3160:    208(ptr) AccessChain 3099(texel) 207
+            3161:6(float16_t) Load 137(f16bias)
+            3162:3138(ResType) ImageSparseSampleDrefImplicitLod 3157 3158 3159 Bias 3161
+            3163:6(float16_t) CompositeExtract 3162 1
+                              Store 3160 3163
+            3164:     47(int) CompositeExtract 3162 0
+            3165:         284 Load 286(s2DArray)
+            3166:  167(fvec3) Load 169(c3)
+            3167:3102(ResType) ImageSparseSampleImplicitLod 3165 3166
+            3168:  7(f16vec4) CompositeExtract 3167 1
+                              Store 3099(texel) 3168
+            3169:     47(int) CompositeExtract 3167 0
+            3170:         284 Load 286(s2DArray)
+            3171:175(f16vec3) Load 177(f16c3)
+            3172:6(float16_t) Load 137(f16bias)
+            3173:3102(ResType) ImageSparseSampleImplicitLod 3170 3171 Bias 3172
+            3174:  7(f16vec4) CompositeExtract 3173 1
+                              Store 3099(texel) 3174
+            3175:     47(int) CompositeExtract 3173 0
+            3176:         299 Load 301(sCubeArray)
+            3177:  249(fvec4) Load 251(c4)
+            3178:3102(ResType) ImageSparseSampleImplicitLod 3176 3177
+            3179:  7(f16vec4) CompositeExtract 3178 1
+                              Store 3099(texel) 3179
+            3180:     47(int) CompositeExtract 3178 0
+            3181:         299 Load 301(sCubeArray)
+            3182:  7(f16vec4) Load 309(f16c4)
+            3183:6(float16_t) Load 137(f16bias)
+            3184:3102(ResType) ImageSparseSampleImplicitLod 3181 3182 Bias 3183
+            3185:  7(f16vec4) CompositeExtract 3184 1
+                              Store 3099(texel) 3185
+            3186:     47(int) CompositeExtract 3184 0
+            3187:         337 Load 339(s2DArrayShadow)
+            3188:  249(fvec4) Load 251(c4)
+            3189:    208(ptr) AccessChain 3099(texel) 207
+            3190:   52(float) CompositeExtract 3188 3
+            3191:3138(ResType) ImageSparseSampleDrefImplicitLod 3187 3188 3190
+            3192:6(float16_t) CompositeExtract 3191 1
+                              Store 3189 3192
+            3193:     47(int) CompositeExtract 3191 0
+            3194:         337 Load 339(s2DArrayShadow)
+            3195:175(f16vec3) Load 177(f16c3)
+            3196:   52(float) Load 215(compare)
+            3197:    208(ptr) AccessChain 3099(texel) 207
+            3198:3138(ResType) ImageSparseSampleDrefImplicitLod 3194 3195 3196
+            3199:6(float16_t) CompositeExtract 3198 1
+                              Store 3197 3199
+            3200:     47(int) CompositeExtract 3198 0
+            3201:         357 Load 359(s2DRect)
+            3202:   53(fvec2) Load 148(c2)
+            3203:3102(ResType) ImageSparseSampleImplicitLod 3201 3202
+            3204:  7(f16vec4) CompositeExtract 3203 1
+                              Store 3099(texel) 3204
+            3205:     47(int) CompositeExtract 3203 0
+            3206:         357 Load 359(s2DRect)
+            3207:154(f16vec2) Load 156(f16c2)
+            3208:3102(ResType) ImageSparseSampleImplicitLod 3206 3207
+            3209:  7(f16vec4) CompositeExtract 3208 1
+                              Store 3099(texel) 3209
+            3210:     47(int) CompositeExtract 3208 0
+            3211:         371 Load 373(s2DRectShadow)
+            3212:  167(fvec3) Load 169(c3)
+            3213:    208(ptr) AccessChain 3099(texel) 207
+            3214:   52(float) CompositeExtract 3212 2
+            3215:3138(ResType) ImageSparseSampleDrefImplicitLod 3211 3212 3214
+            3216:6(float16_t) CompositeExtract 3215 1
+                              Store 3213 3216
+            3217:     47(int) CompositeExtract 3215 0
+            3218:         371 Load 373(s2DRectShadow)
+            3219:154(f16vec2) Load 156(f16c2)
+            3220:   52(float) Load 215(compare)
+            3221:    208(ptr) AccessChain 3099(texel) 207
+            3222:3138(ResType) ImageSparseSampleDrefImplicitLod 3218 3219 3220
+            3223:6(float16_t) CompositeExtract 3222 1
+                              Store 3221 3223
+            3224:     47(int) CompositeExtract 3222 0
+            3225:         391 Load 393(sCubeArrayShadow)
+            3226:  249(fvec4) Load 251(c4)
+            3227:   52(float) Load 215(compare)
+            3228:    208(ptr) AccessChain 3099(texel) 207
+            3229:3138(ResType) ImageSparseSampleDrefImplicitLod 3225 3226 3227
+            3230:6(float16_t) CompositeExtract 3229 1
+                              Store 3228 3230
+            3231:     47(int) CompositeExtract 3229 0
+            3232:         391 Load 393(sCubeArrayShadow)
+            3233:  7(f16vec4) Load 309(f16c4)
+            3234:   52(float) Load 215(compare)
+            3235:    208(ptr) AccessChain 3099(texel) 207
+            3236:3138(ResType) ImageSparseSampleDrefImplicitLod 3232 3233 3234
+            3237:6(float16_t) CompositeExtract 3236 1
+                              Store 3235 3237
+            3238:     47(int) CompositeExtract 3236 0
+            3239:  7(f16vec4) Load 3099(texel)
+                              ReturnValue 3239
+                              FunctionEnd
+71(testSparseTextureLod():  7(f16vec4) Function None 8
+              72:             Label
+     3242(texel):     64(ptr) Variable Function
+                              Store 3242(texel) 121
+            3243:         143 Load 145(s2D)
+            3244:   53(fvec2) Load 148(c2)
+            3245:   52(float) Load 565(lod)
+            3246:3102(ResType) ImageSparseSampleExplicitLod 3243 3244 Lod 3245
+            3247:  7(f16vec4) CompositeExtract 3246 1
+                              Store 3242(texel) 3247
+            3248:     47(int) CompositeExtract 3246 0
+            3249:         143 Load 145(s2D)
+            3250:154(f16vec2) Load 156(f16c2)
+            3251:6(float16_t) Load 572(f16lod)
+            3252:3102(ResType) ImageSparseSampleExplicitLod 3249 3250 Lod 3251
+            3253:  7(f16vec4) CompositeExtract 3252 1
+                              Store 3242(texel) 3253
+            3254:     47(int) CompositeExtract 3252 0
+            3255:         163 Load 165(s3D)
+            3256:  167(fvec3) Load 169(c3)
+            3257:   52(float) Load 565(lod)
+            3258:3102(ResType) ImageSparseSampleExplicitLod 3255 3256 Lod 3257
+            3259:  7(f16vec4) CompositeExtract 3258 1
+                              Store 3242(texel) 3259
+            3260:     47(int) CompositeExtract 3258 0
+            3261:         163 Load 165(s3D)
+            3262:175(f16vec3) Load 177(f16c3)
+            3263:6(float16_t) Load 572(f16lod)
+            3264:3102(ResType) ImageSparseSampleExplicitLod 3261 3262 Lod 3263
+            3265:  7(f16vec4) CompositeExtract 3264 1
+                              Store 3242(texel) 3265
+            3266:     47(int) CompositeExtract 3264 0
+            3267:         184 Load 186(sCube)
+            3268:  167(fvec3) Load 169(c3)
+            3269:   52(float) Load 565(lod)
+            3270:3102(ResType) ImageSparseSampleExplicitLod 3267 3268 Lod 3269
+            3271:  7(f16vec4) CompositeExtract 3270 1
+                              Store 3242(texel) 3271
+            3272:     47(int) CompositeExtract 3270 0
+            3273:         184 Load 186(sCube)
+            3274:175(f16vec3) Load 177(f16c3)
+            3275:6(float16_t) Load 572(f16lod)
+            3276:3102(ResType) ImageSparseSampleExplicitLod 3273 3274 Lod 3275
+            3277:  7(f16vec4) CompositeExtract 3276 1
+                              Store 3242(texel) 3277
+            3278:     47(int) CompositeExtract 3276 0
+            3279:         224 Load 226(s2DShadow)
+            3280:  167(fvec3) Load 169(c3)
+            3281:   52(float) Load 565(lod)
+            3282:    208(ptr) AccessChain 3242(texel) 207
+            3283:   52(float) CompositeExtract 3280 2
+            3284:3138(ResType) ImageSparseSampleDrefExplicitLod 3279 3280 3283 Lod 3281
+            3285:6(float16_t) CompositeExtract 3284 1
+                              Store 3282 3285
+            3286:     47(int) CompositeExtract 3284 0
+            3287:         224 Load 226(s2DShadow)
+            3288:154(f16vec2) Load 156(f16c2)
+            3289:   52(float) Load 215(compare)
+            3290:6(float16_t) Load 572(f16lod)
+            3291:    208(ptr) AccessChain 3242(texel) 207
+            3292:3138(ResType) ImageSparseSampleDrefExplicitLod 3287 3288 3289 Lod 3290
+            3293:6(float16_t) CompositeExtract 3292 1
+                              Store 3291 3293
+            3294:     47(int) CompositeExtract 3292 0
+            3295:         284 Load 286(s2DArray)
+            3296:  167(fvec3) Load 169(c3)
+            3297:   52(float) Load 565(lod)
+            3298:3102(ResType) ImageSparseSampleExplicitLod 3295 3296 Lod 3297
+            3299:  7(f16vec4) CompositeExtract 3298 1
+                              Store 3242(texel) 3299
+            3300:     47(int) CompositeExtract 3298 0
+            3301:         284 Load 286(s2DArray)
+            3302:175(f16vec3) Load 177(f16c3)
+            3303:6(float16_t) Load 572(f16lod)
+            3304:3102(ResType) ImageSparseSampleExplicitLod 3301 3302 Lod 3303
+            3305:  7(f16vec4) CompositeExtract 3304 1
+                              Store 3242(texel) 3305
+            3306:     47(int) CompositeExtract 3304 0
+            3307:         299 Load 301(sCubeArray)
+            3308:  249(fvec4) Load 251(c4)
+            3309:   52(float) Load 565(lod)
+            3310:3102(ResType) ImageSparseSampleExplicitLod 3307 3308 Lod 3309
+            3311:  7(f16vec4) CompositeExtract 3310 1
+                              Store 3242(texel) 3311
+            3312:     47(int) CompositeExtract 3310 0
+            3313:         299 Load 301(sCubeArray)
+            3314:  7(f16vec4) Load 309(f16c4)
+            3315:6(float16_t) Load 572(f16lod)
+            3316:3102(ResType) ImageSparseSampleExplicitLod 3313 3314 Lod 3315
+            3317:  7(f16vec4) CompositeExtract 3316 1
+                              Store 3242(texel) 3317
+            3318:     47(int) CompositeExtract 3316 0
+            3319:  7(f16vec4) Load 3242(texel)
+                              ReturnValue 3319
+                              FunctionEnd
+73(testSparseTextureOffset():  7(f16vec4) Function None 8
+              74:             Label
+     3322(texel):     64(ptr) Variable Function
+                              Store 3322(texel) 121
+            3323:         143 Load 145(s2D)
+            3324:   53(fvec2) Load 148(c2)
+            3325:3102(ResType) ImageSparseSampleImplicitLod 3323 3324 ConstOffset 722
+            3326:  7(f16vec4) CompositeExtract 3325 1
+                              Store 3322(texel) 3326
+            3327:     47(int) CompositeExtract 3325 0
+            3328:         143 Load 145(s2D)
+            3329:154(f16vec2) Load 156(f16c2)
+            3330:6(float16_t) Load 137(f16bias)
+            3331:3102(ResType) ImageSparseSampleImplicitLod 3328 3329 Bias ConstOffset 3330 722
+            3332:  7(f16vec4) CompositeExtract 3331 1
+                              Store 3322(texel) 3332
+            3333:     47(int) CompositeExtract 3331 0
+            3334:         163 Load 165(s3D)
+            3335:  167(fvec3) Load 169(c3)
+            3336:3102(ResType) ImageSparseSampleImplicitLod 3334 3335 ConstOffset 735
+            3337:  7(f16vec4) CompositeExtract 3336 1
+                              Store 3322(texel) 3337
+            3338:     47(int) CompositeExtract 3336 0
+            3339:         163 Load 165(s3D)
+            3340:175(f16vec3) Load 177(f16c3)
+            3341:6(float16_t) Load 137(f16bias)
+            3342:3102(ResType) ImageSparseSampleImplicitLod 3339 3340 Bias ConstOffset 3341 735
+            3343:  7(f16vec4) CompositeExtract 3342 1
+                              Store 3322(texel) 3343
+            3344:     47(int) CompositeExtract 3342 0
+            3345:         357 Load 359(s2DRect)
+            3346:   53(fvec2) Load 148(c2)
+            3347:3102(ResType) ImageSparseSampleImplicitLod 3345 3346 ConstOffset 722
+            3348:  7(f16vec4) CompositeExtract 3347 1
+                              Store 3322(texel) 3348
+            3349:     47(int) CompositeExtract 3347 0
+            3350:         357 Load 359(s2DRect)
+            3351:154(f16vec2) Load 156(f16c2)
+            3352:3102(ResType) ImageSparseSampleImplicitLod 3350 3351 ConstOffset 722
+            3353:  7(f16vec4) CompositeExtract 3352 1
+                              Store 3322(texel) 3353
+            3354:     47(int) CompositeExtract 3352 0
+            3355:         371 Load 373(s2DRectShadow)
+            3356:  167(fvec3) Load 169(c3)
+            3357:    208(ptr) AccessChain 3322(texel) 207
+            3358:   52(float) CompositeExtract 3356 2
+            3359:3138(ResType) ImageSparseSampleDrefImplicitLod 3355 3356 3358 ConstOffset 722
+            3360:6(float16_t) CompositeExtract 3359 1
+                              Store 3357 3360
+            3361:     47(int) CompositeExtract 3359 0
+            3362:         371 Load 373(s2DRectShadow)
+            3363:154(f16vec2) Load 156(f16c2)
+            3364:   52(float) Load 215(compare)
+            3365:    208(ptr) AccessChain 3322(texel) 207
+            3366:3138(ResType) ImageSparseSampleDrefImplicitLod 3362 3363 3364 ConstOffset 722
+            3367:6(float16_t) CompositeExtract 3366 1
+                              Store 3365 3367
+            3368:     47(int) CompositeExtract 3366 0
+            3369:         224 Load 226(s2DShadow)
+            3370:  167(fvec3) Load 169(c3)
+            3371:    208(ptr) AccessChain 3322(texel) 207
+            3372:   52(float) CompositeExtract 3370 2
+            3373:3138(ResType) ImageSparseSampleDrefImplicitLod 3369 3370 3372 ConstOffset 722
+            3374:6(float16_t) CompositeExtract 3373 1
+                              Store 3371 3374
+            3375:     47(int) CompositeExtract 3373 0
+            3376:         224 Load 226(s2DShadow)
+            3377:154(f16vec2) Load 156(f16c2)
+            3378:   52(float) Load 215(compare)
+            3379:    208(ptr) AccessChain 3322(texel) 207
+            3380:6(float16_t) Load 137(f16bias)
+            3381:3138(ResType) ImageSparseSampleDrefImplicitLod 3376 3377 3378 Bias ConstOffset 3380 722
+            3382:6(float16_t) CompositeExtract 3381 1
+                              Store 3379 3382
+            3383:     47(int) CompositeExtract 3381 0
+            3384:         284 Load 286(s2DArray)
+            3385:  167(fvec3) Load 169(c3)
+            3386:3102(ResType) ImageSparseSampleImplicitLod 3384 3385 ConstOffset 722
+            3387:  7(f16vec4) CompositeExtract 3386 1
+                              Store 3322(texel) 3387
+            3388:     47(int) CompositeExtract 3386 0
+            3389:         284 Load 286(s2DArray)
+            3390:175(f16vec3) Load 177(f16c3)
+            3391:6(float16_t) Load 137(f16bias)
+            3392:3102(ResType) ImageSparseSampleImplicitLod 3389 3390 Bias ConstOffset 3391 722
+            3393:  7(f16vec4) CompositeExtract 3392 1
+                              Store 3322(texel) 3393
+            3394:     47(int) CompositeExtract 3392 0
+            3395:         337 Load 339(s2DArrayShadow)
+            3396:  249(fvec4) Load 251(c4)
+            3397:    208(ptr) AccessChain 3322(texel) 207
+            3398:   52(float) CompositeExtract 3396 3
+            3399:3138(ResType) ImageSparseSampleDrefImplicitLod 3395 3396 3398 ConstOffset 722
+            3400:6(float16_t) CompositeExtract 3399 1
+                              Store 3397 3400
+            3401:     47(int) CompositeExtract 3399 0
+            3402:         337 Load 339(s2DArrayShadow)
+            3403:175(f16vec3) Load 177(f16c3)
+            3404:   52(float) Load 215(compare)
+            3405:    208(ptr) AccessChain 3322(texel) 207
+            3406:3138(ResType) ImageSparseSampleDrefImplicitLod 3402 3403 3404 ConstOffset 722
+            3407:6(float16_t) CompositeExtract 3406 1
+                              Store 3405 3407
+            3408:     47(int) CompositeExtract 3406 0
+            3409:  7(f16vec4) Load 3322(texel)
+                              ReturnValue 3409
+                              FunctionEnd
+75(testSparseTextureLodOffset():  7(f16vec4) Function None 8
+              76:             Label
+     3412(texel):     64(ptr) Variable Function
+                              Store 3412(texel) 121
+            3413:         143 Load 145(s2D)
+            3414:   53(fvec2) Load 148(c2)
+            3415:   52(float) Load 565(lod)
+            3416:3102(ResType) ImageSparseSampleExplicitLod 3413 3414 Lod ConstOffset 3415 722
+            3417:  7(f16vec4) CompositeExtract 3416 1
+                              Store 3412(texel) 3417
+            3418:     47(int) CompositeExtract 3416 0
+            3419:         143 Load 145(s2D)
+            3420:154(f16vec2) Load 156(f16c2)
+            3421:6(float16_t) Load 572(f16lod)
+            3422:3102(ResType) ImageSparseSampleExplicitLod 3419 3420 Lod ConstOffset 3421 722
+            3423:  7(f16vec4) CompositeExtract 3422 1
+                              Store 3412(texel) 3423
+            3424:     47(int) CompositeExtract 3422 0
+            3425:         163 Load 165(s3D)
+            3426:  167(fvec3) Load 169(c3)
+            3427:   52(float) Load 565(lod)
+            3428:3102(ResType) ImageSparseSampleExplicitLod 3425 3426 Lod ConstOffset 3427 735
+            3429:  7(f16vec4) CompositeExtract 3428 1
+                              Store 3412(texel) 3429
+            3430:     47(int) CompositeExtract 3428 0
+            3431:         163 Load 165(s3D)
+            3432:175(f16vec3) Load 177(f16c3)
+            3433:6(float16_t) Load 572(f16lod)
+            3434:3102(ResType) ImageSparseSampleExplicitLod 3431 3432 Lod ConstOffset 3433 735
+            3435:  7(f16vec4) CompositeExtract 3434 1
+                              Store 3412(texel) 3435
+            3436:     47(int) CompositeExtract 3434 0
+            3437:         224 Load 226(s2DShadow)
+            3438:  167(fvec3) Load 169(c3)
+            3439:   52(float) Load 565(lod)
+            3440:    208(ptr) AccessChain 3412(texel) 207
+            3441:   52(float) CompositeExtract 3438 2
+            3442:3138(ResType) ImageSparseSampleDrefExplicitLod 3437 3438 3441 Lod ConstOffset 3439 722
+            3443:6(float16_t) CompositeExtract 3442 1
+                              Store 3440 3443
+            3444:     47(int) CompositeExtract 3442 0
+            3445:         224 Load 226(s2DShadow)
+            3446:154(f16vec2) Load 156(f16c2)
+            3447:   52(float) Load 215(compare)
+            3448:6(float16_t) Load 572(f16lod)
+            3449:    208(ptr) AccessChain 3412(texel) 207
+            3450:3138(ResType) ImageSparseSampleDrefExplicitLod 3445 3446 3447 Lod ConstOffset 3448 722
+            3451:6(float16_t) CompositeExtract 3450 1
+                              Store 3449 3451
+            3452:     47(int) CompositeExtract 3450 0
+            3453:         284 Load 286(s2DArray)
+            3454:  167(fvec3) Load 169(c3)
+            3455:   52(float) Load 565(lod)
+            3456:3102(ResType) ImageSparseSampleExplicitLod 3453 3454 Lod ConstOffset 3455 722
+            3457:  7(f16vec4) CompositeExtract 3456 1
+                              Store 3412(texel) 3457
+            3458:     47(int) CompositeExtract 3456 0
+            3459:         284 Load 286(s2DArray)
+            3460:175(f16vec3) Load 177(f16c3)
+            3461:6(float16_t) Load 572(f16lod)
+            3462:3102(ResType) ImageSparseSampleExplicitLod 3459 3460 Lod ConstOffset 3461 722
+            3463:  7(f16vec4) CompositeExtract 3462 1
+                              Store 3412(texel) 3463
+            3464:     47(int) CompositeExtract 3462 0
+            3465:  7(f16vec4) Load 3412(texel)
+                              ReturnValue 3465
+                              FunctionEnd
+77(testSparseTextureGrad():  7(f16vec4) Function None 8
+              78:             Label
+     3468(texel):     64(ptr) Variable Function
+                              Store 3468(texel) 121
+            3469:         143 Load 145(s2D)
+            3470:   53(fvec2) Load 148(c2)
+            3471:   53(fvec2) Load 1409(dPdxy2)
+            3472:   53(fvec2) Load 1409(dPdxy2)
+            3473:3102(ResType) ImageSparseSampleExplicitLod 3469 3470 Grad 3471 3472
+            3474:  7(f16vec4) CompositeExtract 3473 1
+                              Store 3468(texel) 3474
+            3475:     47(int) CompositeExtract 3473 0
+            3476:         143 Load 145(s2D)
+            3477:154(f16vec2) Load 156(f16c2)
+            3478:154(f16vec2) Load 1417(f16dPdxy2)
+            3479:154(f16vec2) Load 1417(f16dPdxy2)
+            3480:3102(ResType) ImageSparseSampleExplicitLod 3476 3477 Grad 3478 3479
+            3481:  7(f16vec4) CompositeExtract 3480 1
+                              Store 3468(texel) 3481
+            3482:     47(int) CompositeExtract 3480 0
+            3483:         163 Load 165(s3D)
+            3484:  167(fvec3) Load 169(c3)
+            3485:  167(fvec3) Load 1425(dPdxy3)
+            3486:  167(fvec3) Load 1425(dPdxy3)
+            3487:3102(ResType) ImageSparseSampleExplicitLod 3483 3484 Grad 3485 3486
+            3488:  7(f16vec4) CompositeExtract 3487 1
+                              Store 3468(texel) 3488
+            3489:     47(int) CompositeExtract 3487 0
+            3490:         163 Load 165(s3D)
+            3491:175(f16vec3) Load 177(f16c3)
+            3492:175(f16vec3) Load 1433(f16dPdxy3)
+            3493:175(f16vec3) Load 1433(f16dPdxy3)
+            3494:3102(ResType) ImageSparseSampleExplicitLod 3490 3491 Grad 3492 3493
+            3495:  7(f16vec4) CompositeExtract 3494 1
+                              Store 3468(texel) 3495
+            3496:     47(int) CompositeExtract 3494 0
+            3497:         184 Load 186(sCube)
+            3498:  167(fvec3) Load 169(c3)
+            3499:  167(fvec3) Load 1425(dPdxy3)
+            3500:  167(fvec3) Load 1425(dPdxy3)
+            3501:3102(ResType) ImageSparseSampleExplicitLod 3497 3498 Grad 3499 3500
+            3502:  7(f16vec4) CompositeExtract 3501 1
+                              Store 3468(texel) 3502
+            3503:     47(int) CompositeExtract 3501 0
+            3504:         184 Load 186(sCube)
+            3505:175(f16vec3) Load 177(f16c3)
+            3506:175(f16vec3) Load 1433(f16dPdxy3)
+            3507:175(f16vec3) Load 1433(f16dPdxy3)
+            3508:3102(ResType) ImageSparseSampleExplicitLod 3504 3505 Grad 3506 3507
+            3509:  7(f16vec4) CompositeExtract 3508 1
+                              Store 3468(texel) 3509
+            3510:     47(int) CompositeExtract 3508 0
+            3511:         357 Load 359(s2DRect)
+            3512:   53(fvec2) Load 148(c2)
+            3513:   53(fvec2) Load 1409(dPdxy2)
+            3514:   53(fvec2) Load 1409(dPdxy2)
+            3515:3102(ResType) ImageSparseSampleExplicitLod 3511 3512 Grad 3513 3514
+            3516:  7(f16vec4) CompositeExtract 3515 1
+                              Store 3468(texel) 3516
+            3517:     47(int) CompositeExtract 3515 0
+            3518:         357 Load 359(s2DRect)
+            3519:154(f16vec2) Load 156(f16c2)
+            3520:154(f16vec2) Load 1417(f16dPdxy2)
+            3521:154(f16vec2) Load 1417(f16dPdxy2)
+            3522:3102(ResType) ImageSparseSampleExplicitLod 3518 3519 Grad 3520 3521
+            3523:  7(f16vec4) CompositeExtract 3522 1
+                              Store 3468(texel) 3523
+            3524:     47(int) CompositeExtract 3522 0
+            3525:         371 Load 373(s2DRectShadow)
+            3526:  167(fvec3) Load 169(c3)
+            3527:   53(fvec2) Load 1409(dPdxy2)
+            3528:   53(fvec2) Load 1409(dPdxy2)
+            3529:    208(ptr) AccessChain 3468(texel) 207
+            3530:   52(float) CompositeExtract 3526 2
+            3531:3138(ResType) ImageSparseSampleDrefExplicitLod 3525 3526 3530 Grad 3527 3528
+            3532:6(float16_t) CompositeExtract 3531 1
+                              Store 3529 3532
+            3533:     47(int) CompositeExtract 3531 0
+            3534:         371 Load 373(s2DRectShadow)
+            3535:154(f16vec2) Load 156(f16c2)
+            3536:   52(float) Load 215(compare)
+            3537:154(f16vec2) Load 1417(f16dPdxy2)
+            3538:154(f16vec2) Load 1417(f16dPdxy2)
+            3539:    208(ptr) AccessChain 3468(texel) 207
+            3540:3138(ResType) ImageSparseSampleDrefExplicitLod 3534 3535 3536 Grad 3537 3538
+            3541:6(float16_t) CompositeExtract 3540 1
+                              Store 3539 3541
+            3542:     47(int) CompositeExtract 3540 0
+            3543:         224 Load 226(s2DShadow)
+            3544:  167(fvec3) Load 169(c3)
+            3545:   53(fvec2) Load 1409(dPdxy2)
+            3546:   53(fvec2) Load 1409(dPdxy2)
+            3547:    208(ptr) AccessChain 3468(texel) 207
+            3548:   52(float) CompositeExtract 3544 2
+            3549:3138(ResType) ImageSparseSampleDrefExplicitLod 3543 3544 3548 Grad 3545 3546
+            3550:6(float16_t) CompositeExtract 3549 1
+                              Store 3547 3550
+            3551:     47(int) CompositeExtract 3549 0
+            3552:         224 Load 226(s2DShadow)
+            3553:154(f16vec2) Load 156(f16c2)
+            3554:   52(float) Load 215(compare)
+            3555:154(f16vec2) Load 1417(f16dPdxy2)
+            3556:154(f16vec2) Load 1417(f16dPdxy2)
+            3557:    208(ptr) AccessChain 3468(texel) 207
+            3558:3138(ResType) ImageSparseSampleDrefExplicitLod 3552 3553 3554 Grad 3555 3556
+            3559:6(float16_t) CompositeExtract 3558 1
+                              Store 3557 3559
+            3560:     47(int) CompositeExtract 3558 0
+            3561:         245 Load 247(sCubeShadow)
+            3562:  249(fvec4) Load 251(c4)
+            3563:  167(fvec3) Load 1425(dPdxy3)
+            3564:  167(fvec3) Load 1425(dPdxy3)
+            3565:    208(ptr) AccessChain 3468(texel) 207
+            3566:   52(float) CompositeExtract 3562 3
+            3567:3138(ResType) ImageSparseSampleDrefExplicitLod 3561 3562 3566 Grad 3563 3564
+            3568:6(float16_t) CompositeExtract 3567 1
+                              Store 3565 3568
+            3569:     47(int) CompositeExtract 3567 0
+            3570:         245 Load 247(sCubeShadow)
+            3571:175(f16vec3) Load 177(f16c3)
+            3572:   52(float) Load 215(compare)
+            3573:175(f16vec3) Load 1433(f16dPdxy3)
+            3574:175(f16vec3) Load 1433(f16dPdxy3)
+            3575:    208(ptr) AccessChain 3468(texel) 207
+            3576:3138(ResType) ImageSparseSampleDrefExplicitLod 3570 3571 3572 Grad 3573 3574
+            3577:6(float16_t) CompositeExtract 3576 1
+                              Store 3575 3577
+            3578:     47(int) CompositeExtract 3576 0
+            3579:         284 Load 286(s2DArray)
+            3580:  167(fvec3) Load 169(c3)
+            3581:   53(fvec2) Load 1409(dPdxy2)
+            3582:   53(fvec2) Load 1409(dPdxy2)
+            3583:3102(ResType) ImageSparseSampleExplicitLod 3579 3580 Grad 3581 3582
+            3584:  7(f16vec4) CompositeExtract 3583 1
+                              Store 3468(texel) 3584
+            3585:     47(int) CompositeExtract 3583 0
+            3586:         284 Load 286(s2DArray)
+            3587:175(f16vec3) Load 177(f16c3)
+            3588:154(f16vec2) Load 1417(f16dPdxy2)
+            3589:154(f16vec2) Load 1417(f16dPdxy2)
+            3590:3102(ResType) ImageSparseSampleExplicitLod 3586 3587 Grad 3588 3589
+            3591:  7(f16vec4) CompositeExtract 3590 1
+                              Store 3468(texel) 3591
+            3592:     47(int) CompositeExtract 3590 0
+            3593:         337 Load 339(s2DArrayShadow)
+            3594:  249(fvec4) Load 251(c4)
+            3595:   53(fvec2) Load 1409(dPdxy2)
+            3596:   53(fvec2) Load 1409(dPdxy2)
+            3597:    208(ptr) AccessChain 3468(texel) 207
+            3598:   52(float) CompositeExtract 3594 3
+            3599:3138(ResType) ImageSparseSampleDrefExplicitLod 3593 3594 3598 Grad 3595 3596
+            3600:6(float16_t) CompositeExtract 3599 1
+                              Store 3597 3600
+            3601:     47(int) CompositeExtract 3599 0
+            3602:         337 Load 339(s2DArrayShadow)
+            3603:175(f16vec3) Load 177(f16c3)
+            3604:   52(float) Load 215(compare)
+            3605:154(f16vec2) Load 1417(f16dPdxy2)
+            3606:154(f16vec2) Load 1417(f16dPdxy2)
+            3607:    208(ptr) AccessChain 3468(texel) 207
+            3608:3138(ResType) ImageSparseSampleDrefExplicitLod 3602 3603 3604 Grad 3605 3606
+            3609:6(float16_t) CompositeExtract 3608 1
+                              Store 3607 3609
+            3610:     47(int) CompositeExtract 3608 0
+            3611:         299 Load 301(sCubeArray)
+            3612:  249(fvec4) Load 251(c4)
+            3613:  167(fvec3) Load 1425(dPdxy3)
+            3614:  167(fvec3) Load 1425(dPdxy3)
+            3615:3102(ResType) ImageSparseSampleExplicitLod 3611 3612 Grad 3613 3614
+            3616:  7(f16vec4) CompositeExtract 3615 1
+                              Store 3468(texel) 3616
+            3617:     47(int) CompositeExtract 3615 0
+            3618:         299 Load 301(sCubeArray)
+            3619:  7(f16vec4) Load 309(f16c4)
+            3620:175(f16vec3) Load 1433(f16dPdxy3)
+            3621:175(f16vec3) Load 1433(f16dPdxy3)
+            3622:3102(ResType) ImageSparseSampleExplicitLod 3618 3619 Grad 3620 3621
+            3623:  7(f16vec4) CompositeExtract 3622 1
+                              Store 3468(texel) 3623
+            3624:     47(int) CompositeExtract 3622 0
+            3625:  7(f16vec4) Load 3468(texel)
+                              ReturnValue 3625
+                              FunctionEnd
+79(testSparseTextureGradOffset():  7(f16vec4) Function None 8
+              80:             Label
+     3628(texel):     64(ptr) Variable Function
+                              Store 3628(texel) 121
+            3629:         143 Load 145(s2D)
+            3630:   53(fvec2) Load 148(c2)
+            3631:   53(fvec2) Load 1409(dPdxy2)
+            3632:   53(fvec2) Load 1409(dPdxy2)
+            3633:3102(ResType) ImageSparseSampleExplicitLod 3629 3630 Grad ConstOffset 3631 3632 722
+            3634:  7(f16vec4) CompositeExtract 3633 1
+                              Store 3628(texel) 3634
+            3635:     47(int) CompositeExtract 3633 0
+            3636:         143 Load 145(s2D)
+            3637:154(f16vec2) Load 156(f16c2)
+            3638:154(f16vec2) Load 1417(f16dPdxy2)
+            3639:154(f16vec2) Load 1417(f16dPdxy2)
+            3640:3102(ResType) ImageSparseSampleExplicitLod 3636 3637 Grad ConstOffset 3638 3639 722
+            3641:  7(f16vec4) CompositeExtract 3640 1
+                              Store 3628(texel) 3641
+            3642:     47(int) CompositeExtract 3640 0
+            3643:         163 Load 165(s3D)
+            3644:  167(fvec3) Load 169(c3)
+            3645:  167(fvec3) Load 1425(dPdxy3)
+            3646:  167(fvec3) Load 1425(dPdxy3)
+            3647:3102(ResType) ImageSparseSampleExplicitLod 3643 3644 Grad ConstOffset 3645 3646 735
+            3648:  7(f16vec4) CompositeExtract 3647 1
+                              Store 3628(texel) 3648
+            3649:     47(int) CompositeExtract 3647 0
+            3650:         163 Load 165(s3D)
+            3651:175(f16vec3) Load 177(f16c3)
+            3652:175(f16vec3) Load 1433(f16dPdxy3)
+            3653:175(f16vec3) Load 1433(f16dPdxy3)
+            3654:3102(ResType) ImageSparseSampleExplicitLod 3650 3651 Grad ConstOffset 3652 3653 735
+            3655:  7(f16vec4) CompositeExtract 3654 1
+                              Store 3628(texel) 3655
+            3656:     47(int) CompositeExtract 3654 0
+            3657:         357 Load 359(s2DRect)
+            3658:   53(fvec2) Load 148(c2)
+            3659:   53(fvec2) Load 1409(dPdxy2)
+            3660:   53(fvec2) Load 1409(dPdxy2)
+            3661:3102(ResType) ImageSparseSampleExplicitLod 3657 3658 Grad ConstOffset 3659 3660 722
+            3662:  7(f16vec4) CompositeExtract 3661 1
+                              Store 3628(texel) 3662
+            3663:     47(int) CompositeExtract 3661 0
+            3664:         357 Load 359(s2DRect)
+            3665:154(f16vec2) Load 156(f16c2)
+            3666:154(f16vec2) Load 1417(f16dPdxy2)
+            3667:154(f16vec2) Load 1417(f16dPdxy2)
+            3668:3102(ResType) ImageSparseSampleExplicitLod 3664 3665 Grad ConstOffset 3666 3667 722
+            3669:  7(f16vec4) CompositeExtract 3668 1
+                              Store 3628(texel) 3669
+            3670:     47(int) CompositeExtract 3668 0
+            3671:         371 Load 373(s2DRectShadow)
+            3672:  167(fvec3) Load 169(c3)
+            3673:   53(fvec2) Load 1409(dPdxy2)
+            3674:   53(fvec2) Load 1409(dPdxy2)
+            3675:    208(ptr) AccessChain 3628(texel) 207
+            3676:   52(float) CompositeExtract 3672 2
+            3677:3138(ResType) ImageSparseSampleDrefExplicitLod 3671 3672 3676 Grad ConstOffset 3673 3674 722
+            3678:6(float16_t) CompositeExtract 3677 1
+                              Store 3675 3678
+            3679:     47(int) CompositeExtract 3677 0
+            3680:         371 Load 373(s2DRectShadow)
+            3681:154(f16vec2) Load 156(f16c2)
+            3682:   52(float) Load 215(compare)
+            3683:154(f16vec2) Load 1417(f16dPdxy2)
+            3684:154(f16vec2) Load 1417(f16dPdxy2)
+            3685:    208(ptr) AccessChain 3628(texel) 207
+            3686:3138(ResType) ImageSparseSampleDrefExplicitLod 3680 3681 3682 Grad ConstOffset 3683 3684 722
+            3687:6(float16_t) CompositeExtract 3686 1
+                              Store 3685 3687
+            3688:     47(int) CompositeExtract 3686 0
+            3689:         224 Load 226(s2DShadow)
+            3690:  167(fvec3) Load 169(c3)
+            3691:   53(fvec2) Load 1409(dPdxy2)
+            3692:   53(fvec2) Load 1409(dPdxy2)
+            3693:    208(ptr) AccessChain 3628(texel) 207
+            3694:   52(float) CompositeExtract 3690 2
+            3695:3138(ResType) ImageSparseSampleDrefExplicitLod 3689 3690 3694 Grad ConstOffset 3691 3692 722
+            3696:6(float16_t) CompositeExtract 3695 1
+                              Store 3693 3696
+            3697:     47(int) CompositeExtract 3695 0
+            3698:         224 Load 226(s2DShadow)
+            3699:154(f16vec2) Load 156(f16c2)
+            3700:   52(float) Load 215(compare)
+            3701:154(f16vec2) Load 1417(f16dPdxy2)
+            3702:154(f16vec2) Load 1417(f16dPdxy2)
+            3703:    208(ptr) AccessChain 3628(texel) 207
+            3704:3138(ResType) ImageSparseSampleDrefExplicitLod 3698 3699 3700 Grad ConstOffset 3701 3702 722
+            3705:6(float16_t) CompositeExtract 3704 1
+                              Store 3703 3705
+            3706:     47(int) CompositeExtract 3704 0
+            3707:         284 Load 286(s2DArray)
+            3708:  167(fvec3) Load 169(c3)
+            3709:   53(fvec2) Load 1409(dPdxy2)
+            3710:   53(fvec2) Load 1409(dPdxy2)
+            3711:3102(ResType) ImageSparseSampleExplicitLod 3707 3708 Grad ConstOffset 3709 3710 722
+            3712:  7(f16vec4) CompositeExtract 3711 1
+                              Store 3628(texel) 3712
+            3713:     47(int) CompositeExtract 3711 0
+            3714:         284 Load 286(s2DArray)
+            3715:175(f16vec3) Load 177(f16c3)
+            3716:154(f16vec2) Load 1417(f16dPdxy2)
+            3717:154(f16vec2) Load 1417(f16dPdxy2)
+            3718:3102(ResType) ImageSparseSampleExplicitLod 3714 3715 Grad ConstOffset 3716 3717 722
+            3719:  7(f16vec4) CompositeExtract 3718 1
+                              Store 3628(texel) 3719
+            3720:     47(int) CompositeExtract 3718 0
+            3721:         337 Load 339(s2DArrayShadow)
+            3722:  249(fvec4) Load 251(c4)
+            3723:   53(fvec2) Load 1409(dPdxy2)
+            3724:   53(fvec2) Load 1409(dPdxy2)
+            3725:    208(ptr) AccessChain 3628(texel) 207
+            3726:   52(float) CompositeExtract 3722 3
+            3727:3138(ResType) ImageSparseSampleDrefExplicitLod 3721 3722 3726 Grad ConstOffset 3723 3724 722
+            3728:6(float16_t) CompositeExtract 3727 1
+                              Store 3725 3728
+            3729:     47(int) CompositeExtract 3727 0
+            3730:         337 Load 339(s2DArrayShadow)
+            3731:175(f16vec3) Load 177(f16c3)
+            3732:   52(float) Load 215(compare)
+            3733:154(f16vec2) Load 1417(f16dPdxy2)
+            3734:154(f16vec2) Load 1417(f16dPdxy2)
+            3735:    208(ptr) AccessChain 3628(texel) 207
+            3736:3138(ResType) ImageSparseSampleDrefExplicitLod 3730 3731 3732 Grad ConstOffset 3733 3734 722
+            3737:6(float16_t) CompositeExtract 3736 1
+                              Store 3735 3737
+            3738:     47(int) CompositeExtract 3736 0
+            3739:  7(f16vec4) Load 3628(texel)
+                              ReturnValue 3739
+                              FunctionEnd
+81(testSparseTexelFetch():  7(f16vec4) Function None 8
+              82:             Label
+     3742(texel):     64(ptr) Variable Function
+                              Store 3742(texel) 121
+            3743:         143 Load 145(s2D)
+            3744:   53(fvec2) Load 148(c2)
+            3745:  721(ivec2) ConvertFToS 3744
+            3746:   52(float) Load 565(lod)
+            3747:     47(int) ConvertFToS 3746
+            3748:         142 Image 3743
+            3749:3102(ResType) ImageSparseFetch 3748 3745 Lod 3747
+            3750:  7(f16vec4) CompositeExtract 3749 1
+                              Store 3742(texel) 3750
+            3751:     47(int) CompositeExtract 3749 0
+            3752:         163 Load 165(s3D)
+            3753:  167(fvec3) Load 169(c3)
+            3754:  734(ivec3) ConvertFToS 3753
+            3755:   52(float) Load 565(lod)
+            3756:     47(int) ConvertFToS 3755
+            3757:         162 Image 3752
+            3758:3102(ResType) ImageSparseFetch 3757 3754 Lod 3756
+            3759:  7(f16vec4) CompositeExtract 3758 1
+                              Store 3742(texel) 3759
+            3760:     47(int) CompositeExtract 3758 0
+            3761:         357 Load 359(s2DRect)
+            3762:   53(fvec2) Load 148(c2)
+            3763:  721(ivec2) ConvertFToS 3762
+            3764:         356 Image 3761
+            3765:3102(ResType) ImageSparseFetch 3764 3763
+            3766:  7(f16vec4) CompositeExtract 3765 1
+                              Store 3742(texel) 3766
+            3767:     47(int) CompositeExtract 3765 0
+            3768:         284 Load 286(s2DArray)
+            3769:  167(fvec3) Load 169(c3)
+            3770:  734(ivec3) ConvertFToS 3769
+            3771:   52(float) Load 565(lod)
+            3772:     47(int) ConvertFToS 3771
+            3773:         283 Image 3768
+            3774:3102(ResType) ImageSparseFetch 3773 3770 Lod 3772
+            3775:  7(f16vec4) CompositeExtract 3774 1
+                              Store 3742(texel) 3775
+            3776:     47(int) CompositeExtract 3774 0
+            3777:        1309 Load 1311(s2DMS)
+            3778:   53(fvec2) Load 148(c2)
+            3779:  721(ivec2) ConvertFToS 3778
+            3780:        1308 Image 3777
+            3781:3102(ResType) ImageSparseFetch 3780 3779 Sample 709
+            3782:  7(f16vec4) CompositeExtract 3781 1
+                              Store 3742(texel) 3782
+            3783:     47(int) CompositeExtract 3781 0
+            3784:        1320 Load 1322(s2DMSArray)
+            3785:  167(fvec3) Load 169(c3)
+            3786:  734(ivec3) ConvertFToS 3785
+            3787:        1319 Image 3784
+            3788:3102(ResType) ImageSparseFetch 3787 3786 Sample 1326
+            3789:  7(f16vec4) CompositeExtract 3788 1
+                              Store 3742(texel) 3789
+            3790:     47(int) CompositeExtract 3788 0
+            3791:  7(f16vec4) Load 3742(texel)
+                              ReturnValue 3791
+                              FunctionEnd
+83(testSparseTexelFetchOffset():  7(f16vec4) Function None 8
+              84:             Label
+     3794(texel):     64(ptr) Variable Function
+                              Store 3794(texel) 121
+            3795:         143 Load 145(s2D)
+            3796:   53(fvec2) Load 148(c2)
+            3797:  721(ivec2) ConvertFToS 3796
+            3798:   52(float) Load 565(lod)
+            3799:     47(int) ConvertFToS 3798
+            3800:         142 Image 3795
+            3801:3102(ResType) ImageSparseFetch 3800 3797 Lod ConstOffset 3799 722
+            3802:  7(f16vec4) CompositeExtract 3801 1
+                              Store 3794(texel) 3802
+            3803:     47(int) CompositeExtract 3801 0
+            3804:         163 Load 165(s3D)
+            3805:  167(fvec3) Load 169(c3)
+            3806:  734(ivec3) ConvertFToS 3805
+            3807:   52(float) Load 565(lod)
+            3808:     47(int) ConvertFToS 3807
+            3809:         162 Image 3804
+            3810:3102(ResType) ImageSparseFetch 3809 3806 Lod ConstOffset 3808 735
+            3811:  7(f16vec4) CompositeExtract 3810 1
+                              Store 3794(texel) 3811
+            3812:     47(int) CompositeExtract 3810 0
+            3813:         357 Load 359(s2DRect)
+            3814:   53(fvec2) Load 148(c2)
+            3815:  721(ivec2) ConvertFToS 3814
+            3816:         356 Image 3813
+            3817:3102(ResType) ImageSparseFetch 3816 3815 ConstOffset 722
+            3818:  7(f16vec4) CompositeExtract 3817 1
+                              Store 3794(texel) 3818
+            3819:     47(int) CompositeExtract 3817 0
+            3820:         284 Load 286(s2DArray)
+            3821:  167(fvec3) Load 169(c3)
+            3822:  734(ivec3) ConvertFToS 3821
+            3823:   52(float) Load 565(lod)
+            3824:     47(int) ConvertFToS 3823
+            3825:         283 Image 3820
+            3826:3102(ResType) ImageSparseFetch 3825 3822 Lod ConstOffset 3824 722
+            3827:  7(f16vec4) CompositeExtract 3826 1
+                              Store 3794(texel) 3827
+            3828:     47(int) CompositeExtract 3826 0
+            3829:  7(f16vec4) Load 3794(texel)
+                              ReturnValue 3829
+                              FunctionEnd
+85(testSparseTextureGather():  7(f16vec4) Function None 8
+              86:             Label
+     3832(texel):     64(ptr) Variable Function
+                              Store 3832(texel) 121
+            3833:         143 Load 145(s2D)
+            3834:   53(fvec2) Load 148(c2)
+            3835:3102(ResType) ImageSparseGather 3833 3834 2187
+            3836:  7(f16vec4) CompositeExtract 3835 1
+                              Store 3832(texel) 3836
+            3837:     47(int) CompositeExtract 3835 0
+            3838:         143 Load 145(s2D)
+            3839:154(f16vec2) Load 156(f16c2)
+            3840:6(float16_t) Load 137(f16bias)
+            3841:3102(ResType) ImageSparseGather 3838 3839 2187 Bias 3840
+            3842:  7(f16vec4) CompositeExtract 3841 1
+                              Store 3832(texel) 3842
+            3843:     47(int) CompositeExtract 3841 0
+            3844:         284 Load 286(s2DArray)
+            3845:  167(fvec3) Load 169(c3)
+            3846:3102(ResType) ImageSparseGather 3844 3845 2187
+            3847:  7(f16vec4) CompositeExtract 3846 1
+                              Store 3832(texel) 3847
+            3848:     47(int) CompositeExtract 3846 0
+            3849:         284 Load 286(s2DArray)
+            3850:175(f16vec3) Load 177(f16c3)
+            3851:6(float16_t) Load 137(f16bias)
+            3852:3102(ResType) ImageSparseGather 3849 3850 2187 Bias 3851
+            3853:  7(f16vec4) CompositeExtract 3852 1
+                              Store 3832(texel) 3853
+            3854:     47(int) CompositeExtract 3852 0
+            3855:         184 Load 186(sCube)
+            3856:  167(fvec3) Load 169(c3)
+            3857:3102(ResType) ImageSparseGather 3855 3856 2187
+            3858:  7(f16vec4) CompositeExtract 3857 1
+                              Store 3832(texel) 3858
+            3859:     47(int) CompositeExtract 3857 0
+            3860:         184 Load 186(sCube)
+            3861:175(f16vec3) Load 177(f16c3)
+            3862:6(float16_t) Load 137(f16bias)
+            3863:3102(ResType) ImageSparseGather 3860 3861 2187 Bias 3862
+            3864:  7(f16vec4) CompositeExtract 3863 1
+                              Store 3832(texel) 3864
+            3865:     47(int) CompositeExtract 3863 0
+            3866:         299 Load 301(sCubeArray)
+            3867:  249(fvec4) Load 251(c4)
+            3868:3102(ResType) ImageSparseGather 3866 3867 2187
+            3869:  7(f16vec4) CompositeExtract 3868 1
+                              Store 3832(texel) 3869
+            3870:     47(int) CompositeExtract 3868 0
+            3871:         299 Load 301(sCubeArray)
+            3872:  7(f16vec4) Load 309(f16c4)
+            3873:6(float16_t) Load 137(f16bias)
+            3874:3102(ResType) ImageSparseGather 3871 3872 2187 Bias 3873
+            3875:  7(f16vec4) CompositeExtract 3874 1
+                              Store 3832(texel) 3875
+            3876:     47(int) CompositeExtract 3874 0
+            3877:         357 Load 359(s2DRect)
+            3878:   53(fvec2) Load 148(c2)
+            3879:3102(ResType) ImageSparseGather 3877 3878 2187
+            3880:  7(f16vec4) CompositeExtract 3879 1
+                              Store 3832(texel) 3880
+            3881:     47(int) CompositeExtract 3879 0
+            3882:         357 Load 359(s2DRect)
+            3883:154(f16vec2) Load 156(f16c2)
+            3884:3102(ResType) ImageSparseGather 3882 3883 2187
+            3885:  7(f16vec4) CompositeExtract 3884 1
+                              Store 3832(texel) 3885
+            3886:     47(int) CompositeExtract 3884 0
+            3887:         224 Load 226(s2DShadow)
+            3888:   53(fvec2) Load 148(c2)
+            3889:   52(float) Load 215(compare)
+            3890:3102(ResType) ImageSparseDrefGather 3887 3888 3889
+            3891:  7(f16vec4) CompositeExtract 3890 1
+                              Store 3832(texel) 3891
+            3892:     47(int) CompositeExtract 3890 0
+            3893:         224 Load 226(s2DShadow)
+            3894:154(f16vec2) Load 156(f16c2)
+            3895:   52(float) Load 215(compare)
+            3896:3102(ResType) ImageSparseDrefGather 3893 3894 3895
+            3897:  7(f16vec4) CompositeExtract 3896 1
+                              Store 3832(texel) 3897
+            3898:     47(int) CompositeExtract 3896 0
+            3899:         337 Load 339(s2DArrayShadow)
+            3900:  167(fvec3) Load 169(c3)
+            3901:   52(float) Load 215(compare)
+            3902:3102(ResType) ImageSparseDrefGather 3899 3900 3901
+            3903:  7(f16vec4) CompositeExtract 3902 1
+                              Store 3832(texel) 3903
+            3904:     47(int) CompositeExtract 3902 0
+            3905:         337 Load 339(s2DArrayShadow)
+            3906:175(f16vec3) Load 177(f16c3)
+            3907:   52(float) Load 215(compare)
+            3908:3102(ResType) ImageSparseDrefGather 3905 3906 3907
+            3909:  7(f16vec4) CompositeExtract 3908 1
+                              Store 3832(texel) 3909
+            3910:     47(int) CompositeExtract 3908 0
+            3911:         245 Load 247(sCubeShadow)
+            3912:  167(fvec3) Load 169(c3)
+            3913:   52(float) Load 215(compare)
+            3914:3102(ResType) ImageSparseDrefGather 3911 3912 3913
+            3915:  7(f16vec4) CompositeExtract 3914 1
+                              Store 3832(texel) 3915
+            3916:     47(int) CompositeExtract 3914 0
+            3917:         245 Load 247(sCubeShadow)
+            3918:175(f16vec3) Load 177(f16c3)
+            3919:   52(float) Load 215(compare)
+            3920:3102(ResType) ImageSparseDrefGather 3917 3918 3919
+            3921:  7(f16vec4) CompositeExtract 3920 1
+                              Store 3832(texel) 3921
+            3922:     47(int) CompositeExtract 3920 0
+            3923:         391 Load 393(sCubeArrayShadow)
+            3924:  249(fvec4) Load 251(c4)
+            3925:   52(float) Load 215(compare)
+            3926:3102(ResType) ImageSparseDrefGather 3923 3924 3925
+            3927:  7(f16vec4) CompositeExtract 3926 1
+                              Store 3832(texel) 3927
+            3928:     47(int) CompositeExtract 3926 0
+            3929:         391 Load 393(sCubeArrayShadow)
+            3930:  7(f16vec4) Load 309(f16c4)
+            3931:   52(float) Load 215(compare)
+            3932:3102(ResType) ImageSparseDrefGather 3929 3930 3931
+            3933:  7(f16vec4) CompositeExtract 3932 1
+                              Store 3832(texel) 3933
+            3934:     47(int) CompositeExtract 3932 0
+            3935:         371 Load 373(s2DRectShadow)
+            3936:   53(fvec2) Load 148(c2)
+            3937:   52(float) Load 215(compare)
+            3938:3102(ResType) ImageSparseDrefGather 3935 3936 3937
+            3939:  7(f16vec4) CompositeExtract 3938 1
+                              Store 3832(texel) 3939
+            3940:     47(int) CompositeExtract 3938 0
+            3941:         371 Load 373(s2DRectShadow)
+            3942:154(f16vec2) Load 156(f16c2)
+            3943:   52(float) Load 215(compare)
+            3944:3102(ResType) ImageSparseDrefGather 3941 3942 3943
+            3945:  7(f16vec4) CompositeExtract 3944 1
+                              Store 3832(texel) 3945
+            3946:     47(int) CompositeExtract 3944 0
+            3947:  7(f16vec4) Load 3832(texel)
+                              ReturnValue 3947
+                              FunctionEnd
+87(testSparseTextureGatherOffset():  7(f16vec4) Function None 8
+              88:             Label
+     3950(texel):     64(ptr) Variable Function
+                              Store 3950(texel) 121
+            3951:         143 Load 145(s2D)
+            3952:   53(fvec2) Load 148(c2)
+            3953:3102(ResType) ImageSparseGather 3951 3952 2187 ConstOffset 722
+            3954:  7(f16vec4) CompositeExtract 3953 1
+                              Store 3950(texel) 3954
+            3955:     47(int) CompositeExtract 3953 0
+            3956:         143 Load 145(s2D)
+            3957:154(f16vec2) Load 156(f16c2)
+            3958:6(float16_t) Load 137(f16bias)
+            3959:3102(ResType) ImageSparseGather 3956 3957 2187 Bias ConstOffset 3958 722
+            3960:  7(f16vec4) CompositeExtract 3959 1
+                              Store 3950(texel) 3960
+            3961:     47(int) CompositeExtract 3959 0
+            3962:         284 Load 286(s2DArray)
+            3963:  167(fvec3) Load 169(c3)
+            3964:3102(ResType) ImageSparseGather 3962 3963 2187 ConstOffset 722
+            3965:  7(f16vec4) CompositeExtract 3964 1
+                              Store 3950(texel) 3965
+            3966:     47(int) CompositeExtract 3964 0
+            3967:         284 Load 286(s2DArray)
+            3968:175(f16vec3) Load 177(f16c3)
+            3969:6(float16_t) Load 137(f16bias)
+            3970:3102(ResType) ImageSparseGather 3967 3968 2187 Bias ConstOffset 3969 722
+            3971:  7(f16vec4) CompositeExtract 3970 1
+                              Store 3950(texel) 3971
+            3972:     47(int) CompositeExtract 3970 0
+            3973:         357 Load 359(s2DRect)
+            3974:   53(fvec2) Load 148(c2)
+            3975:3102(ResType) ImageSparseGather 3973 3974 2187 ConstOffset 722
+            3976:  7(f16vec4) CompositeExtract 3975 1
+                              Store 3950(texel) 3976
+            3977:     47(int) CompositeExtract 3975 0
+            3978:         357 Load 359(s2DRect)
+            3979:154(f16vec2) Load 156(f16c2)
+            3980:3102(ResType) ImageSparseGather 3978 3979 2187 ConstOffset 722
+            3981:  7(f16vec4) CompositeExtract 3980 1
+                              Store 3950(texel) 3981
+            3982:     47(int) CompositeExtract 3980 0
+            3983:         224 Load 226(s2DShadow)
+            3984:   53(fvec2) Load 148(c2)
+            3985:   52(float) Load 215(compare)
+            3986:3102(ResType) ImageSparseDrefGather 3983 3984 3985 ConstOffset 722
+            3987:  7(f16vec4) CompositeExtract 3986 1
+                              Store 3950(texel) 3987
+            3988:     47(int) CompositeExtract 3986 0
+            3989:         224 Load 226(s2DShadow)
+            3990:154(f16vec2) Load 156(f16c2)
+            3991:   52(float) Load 215(compare)
+            3992:3102(ResType) ImageSparseDrefGather 3989 3990 3991 ConstOffset 722
+            3993:  7(f16vec4) CompositeExtract 3992 1
+                              Store 3950(texel) 3993
+            3994:     47(int) CompositeExtract 3992 0
+            3995:         337 Load 339(s2DArrayShadow)
+            3996:  167(fvec3) Load 169(c3)
+            3997:   52(float) Load 215(compare)
+            3998:3102(ResType) ImageSparseDrefGather 3995 3996 3997 ConstOffset 722
+            3999:  7(f16vec4) CompositeExtract 3998 1
+                              Store 3950(texel) 3999
+            4000:     47(int) CompositeExtract 3998 0
+            4001:         337 Load 339(s2DArrayShadow)
+            4002:175(f16vec3) Load 177(f16c3)
+            4003:   52(float) Load 215(compare)
+            4004:3102(ResType) ImageSparseDrefGather 4001 4002 4003 ConstOffset 722
+            4005:  7(f16vec4) CompositeExtract 4004 1
+                              Store 3950(texel) 4005
+            4006:     47(int) CompositeExtract 4004 0
+            4007:         371 Load 373(s2DRectShadow)
+            4008:   53(fvec2) Load 148(c2)
+            4009:   52(float) Load 215(compare)
+            4010:3102(ResType) ImageSparseDrefGather 4007 4008 4009 ConstOffset 722
+            4011:  7(f16vec4) CompositeExtract 4010 1
+                              Store 3950(texel) 4011
+            4012:     47(int) CompositeExtract 4010 0
+            4013:         371 Load 373(s2DRectShadow)
+            4014:154(f16vec2) Load 156(f16c2)
+            4015:   52(float) Load 215(compare)
+            4016:3102(ResType) ImageSparseDrefGather 4013 4014 4015 ConstOffset 722
+            4017:  7(f16vec4) CompositeExtract 4016 1
+                              Store 3950(texel) 4017
+            4018:     47(int) CompositeExtract 4016 0
+            4019:  7(f16vec4) Load 3950(texel)
+                              ReturnValue 4019
+                              FunctionEnd
+89(testSparseTextureGatherOffsets():  7(f16vec4) Function None 8
+              90:             Label
+     4022(texel):     64(ptr) Variable Function
+                              Store 4022(texel) 121
+            4023:         143 Load 145(s2D)
+            4024:   53(fvec2) Load 148(c2)
+            4025:3102(ResType) ImageSparseGather 4023 4024 2187 ConstOffsets 2380
+            4026:  7(f16vec4) CompositeExtract 4025 1
+                              Store 4022(texel) 4026
+            4027:     47(int) CompositeExtract 4025 0
+            4028:         143 Load 145(s2D)
+            4029:154(f16vec2) Load 156(f16c2)
+            4030:6(float16_t) Load 137(f16bias)
+            4031:3102(ResType) ImageSparseGather 4028 4029 2187 Bias ConstOffsets 4030 2380
+            4032:  7(f16vec4) CompositeExtract 4031 1
+                              Store 4022(texel) 4032
+            4033:     47(int) CompositeExtract 4031 0
+            4034:         284 Load 286(s2DArray)
+            4035:  167(fvec3) Load 169(c3)
+            4036:3102(ResType) ImageSparseGather 4034 4035 2187 ConstOffsets 2380
+            4037:  7(f16vec4) CompositeExtract 4036 1
+                              Store 4022(texel) 4037
+            4038:     47(int) CompositeExtract 4036 0
+            4039:         284 Load 286(s2DArray)
+            4040:175(f16vec3) Load 177(f16c3)
+            4041:6(float16_t) Load 137(f16bias)
+            4042:3102(ResType) ImageSparseGather 4039 4040 2187 Bias ConstOffsets 4041 2380
+            4043:  7(f16vec4) CompositeExtract 4042 1
+                              Store 4022(texel) 4043
+            4044:     47(int) CompositeExtract 4042 0
+            4045:         357 Load 359(s2DRect)
+            4046:   53(fvec2) Load 148(c2)
+            4047:3102(ResType) ImageSparseGather 4045 4046 2187 ConstOffsets 2380
+            4048:  7(f16vec4) CompositeExtract 4047 1
+                              Store 4022(texel) 4048
+            4049:     47(int) CompositeExtract 4047 0
+            4050:         357 Load 359(s2DRect)
+            4051:154(f16vec2) Load 156(f16c2)
+            4052:3102(ResType) ImageSparseGather 4050 4051 2187 ConstOffsets 2380
+            4053:  7(f16vec4) CompositeExtract 4052 1
+                              Store 4022(texel) 4053
+            4054:     47(int) CompositeExtract 4052 0
+            4055:         224 Load 226(s2DShadow)
+            4056:   53(fvec2) Load 148(c2)
+            4057:   52(float) Load 215(compare)
+            4058:3102(ResType) ImageSparseDrefGather 4055 4056 4057 ConstOffsets 2380
+            4059:  7(f16vec4) CompositeExtract 4058 1
+                              Store 4022(texel) 4059
+            4060:     47(int) CompositeExtract 4058 0
+            4061:         224 Load 226(s2DShadow)
+            4062:154(f16vec2) Load 156(f16c2)
+            4063:   52(float) Load 215(compare)
+            4064:3102(ResType) ImageSparseDrefGather 4061 4062 4063 ConstOffsets 2380
+            4065:  7(f16vec4) CompositeExtract 4064 1
+                              Store 4022(texel) 4065
+            4066:     47(int) CompositeExtract 4064 0
+            4067:         337 Load 339(s2DArrayShadow)
+            4068:  167(fvec3) Load 169(c3)
+            4069:   52(float) Load 215(compare)
+            4070:3102(ResType) ImageSparseDrefGather 4067 4068 4069 ConstOffsets 2380
+            4071:  7(f16vec4) CompositeExtract 4070 1
+                              Store 4022(texel) 4071
+            4072:     47(int) CompositeExtract 4070 0
+            4073:         337 Load 339(s2DArrayShadow)
+            4074:175(f16vec3) Load 177(f16c3)
+            4075:   52(float) Load 215(compare)
+            4076:3102(ResType) ImageSparseDrefGather 4073 4074 4075 ConstOffsets 2380
+            4077:  7(f16vec4) CompositeExtract 4076 1
+                              Store 4022(texel) 4077
+            4078:     47(int) CompositeExtract 4076 0
+            4079:         371 Load 373(s2DRectShadow)
+            4080:   53(fvec2) Load 148(c2)
+            4081:   52(float) Load 215(compare)
+            4082:3102(ResType) ImageSparseDrefGather 4079 4080 4081 ConstOffsets 2380
+            4083:  7(f16vec4) CompositeExtract 4082 1
+                              Store 4022(texel) 4083
+            4084:     47(int) CompositeExtract 4082 0
+            4085:         371 Load 373(s2DRectShadow)
+            4086:154(f16vec2) Load 156(f16c2)
+            4087:   52(float) Load 215(compare)
+            4088:3102(ResType) ImageSparseDrefGather 4085 4086 4087 ConstOffsets 2380
+            4089:  7(f16vec4) CompositeExtract 4088 1
+                              Store 4022(texel) 4089
+            4090:     47(int) CompositeExtract 4088 0
+            4091:  7(f16vec4) Load 4022(texel)
+                              ReturnValue 4091
+                              FunctionEnd
+91(testSparseTextureGatherLod():  7(f16vec4) Function None 8
+              92:             Label
+     4094(texel):     64(ptr) Variable Function
+                              Store 4094(texel) 121
+            4095:         143 Load 145(s2D)
+            4096:   53(fvec2) Load 148(c2)
+            4097:   52(float) Load 565(lod)
+            4098:3102(ResType) ImageSparseGather 4095 4096 2187 Lod 4097
+            4099:  7(f16vec4) CompositeExtract 4098 1
+                              Store 4094(texel) 4099
+            4100:     47(int) CompositeExtract 4098 0
+            4101:         143 Load 145(s2D)
+            4102:154(f16vec2) Load 156(f16c2)
+            4103:6(float16_t) Load 572(f16lod)
+            4104:3102(ResType) ImageSparseGather 4101 4102 2187 Lod 4103
+            4105:  7(f16vec4) CompositeExtract 4104 1
+                              Store 4094(texel) 4105
+            4106:     47(int) CompositeExtract 4104 0
+            4107:         284 Load 286(s2DArray)
+            4108:  167(fvec3) Load 169(c3)
+            4109:   52(float) Load 565(lod)
+            4110:3102(ResType) ImageSparseGather 4107 4108 2187 Lod 4109
+            4111:  7(f16vec4) CompositeExtract 4110 1
+                              Store 4094(texel) 4111
+            4112:     47(int) CompositeExtract 4110 0
+            4113:         284 Load 286(s2DArray)
+            4114:175(f16vec3) Load 177(f16c3)
+            4115:6(float16_t) Load 572(f16lod)
+            4116:3102(ResType) ImageSparseGather 4113 4114 2187 Lod 4115
+            4117:  7(f16vec4) CompositeExtract 4116 1
+                              Store 4094(texel) 4117
+            4118:     47(int) CompositeExtract 4116 0
+            4119:         184 Load 186(sCube)
+            4120:  167(fvec3) Load 169(c3)
+            4121:   52(float) Load 565(lod)
+            4122:3102(ResType) ImageSparseGather 4119 4120 2187 Lod 4121
+            4123:  7(f16vec4) CompositeExtract 4122 1
+                              Store 4094(texel) 4123
+            4124:     47(int) CompositeExtract 4122 0
+            4125:         184 Load 186(sCube)
+            4126:175(f16vec3) Load 177(f16c3)
+            4127:6(float16_t) Load 572(f16lod)
+            4128:3102(ResType) ImageSparseGather 4125 4126 2187 Lod 4127
+            4129:  7(f16vec4) CompositeExtract 4128 1
+                              Store 4094(texel) 4129
+            4130:     47(int) CompositeExtract 4128 0
+            4131:         299 Load 301(sCubeArray)
+            4132:  249(fvec4) Load 251(c4)
+            4133:   52(float) Load 565(lod)
+            4134:3102(ResType) ImageSparseGather 4131 4132 2187 Lod 4133
+            4135:  7(f16vec4) CompositeExtract 4134 1
+                              Store 4094(texel) 4135
+            4136:     47(int) CompositeExtract 4134 0
+            4137:         299 Load 301(sCubeArray)
+            4138:  7(f16vec4) Load 309(f16c4)
+            4139:6(float16_t) Load 572(f16lod)
+            4140:3102(ResType) ImageSparseGather 4137 4138 2187 Lod 4139
+            4141:  7(f16vec4) CompositeExtract 4140 1
+                              Store 4094(texel) 4141
+            4142:     47(int) CompositeExtract 4140 0
+            4143:  7(f16vec4) Load 4094(texel)
+                              ReturnValue 4143
+                              FunctionEnd
+93(testSparseTextureGatherLodOffset():  7(f16vec4) Function None 8
+              94:             Label
+     4146(texel):     64(ptr) Variable Function
+                              Store 4146(texel) 121
+            4147:         143 Load 145(s2D)
+            4148:   53(fvec2) Load 148(c2)
+            4149:   52(float) Load 565(lod)
+            4150:3102(ResType) ImageSparseGather 4147 4148 2187 Lod ConstOffset 4149 722
+            4151:  7(f16vec4) CompositeExtract 4150 1
+                              Store 4146(texel) 4151
+            4152:     47(int) CompositeExtract 4150 0
+            4153:         143 Load 145(s2D)
+            4154:154(f16vec2) Load 156(f16c2)
+            4155:6(float16_t) Load 572(f16lod)
+            4156:3102(ResType) ImageSparseGather 4153 4154 2187 Lod ConstOffset 4155 722
+            4157:  7(f16vec4) CompositeExtract 4156 1
+                              Store 4146(texel) 4157
+            4158:     47(int) CompositeExtract 4156 0
+            4159:         284 Load 286(s2DArray)
+            4160:  167(fvec3) Load 169(c3)
+            4161:   52(float) Load 565(lod)
+            4162:3102(ResType) ImageSparseGather 4159 4160 2187 Lod ConstOffset 4161 722
+            4163:  7(f16vec4) CompositeExtract 4162 1
+                              Store 4146(texel) 4163
+            4164:     47(int) CompositeExtract 4162 0
+            4165:         284 Load 286(s2DArray)
+            4166:175(f16vec3) Load 177(f16c3)
+            4167:6(float16_t) Load 572(f16lod)
+            4168:3102(ResType) ImageSparseGather 4165 4166 2187 Lod ConstOffset 4167 722
+            4169:  7(f16vec4) CompositeExtract 4168 1
+                              Store 4146(texel) 4169
+            4170:     47(int) CompositeExtract 4168 0
+            4171:  7(f16vec4) Load 4146(texel)
+                              ReturnValue 4171
+                              FunctionEnd
+95(testSparseTextureGatherLodOffsets():  7(f16vec4) Function None 8
+              96:             Label
+     4174(texel):     64(ptr) Variable Function
+                              Store 4174(texel) 121
+            4175:         143 Load 145(s2D)
+            4176:   53(fvec2) Load 148(c2)
+            4177:   52(float) Load 565(lod)
+            4178:3102(ResType) ImageSparseGather 4175 4176 2187 Lod ConstOffsets 4177 2380
+            4179:  7(f16vec4) CompositeExtract 4178 1
+                              Store 4174(texel) 4179
+            4180:     47(int) CompositeExtract 4178 0
+            4181:         143 Load 145(s2D)
+            4182:154(f16vec2) Load 156(f16c2)
+            4183:6(float16_t) Load 572(f16lod)
+            4184:3102(ResType) ImageSparseGather 4181 4182 2187 Lod ConstOffsets 4183 2380
+            4185:  7(f16vec4) CompositeExtract 4184 1
+                              Store 4174(texel) 4185
+            4186:     47(int) CompositeExtract 4184 0
+            4187:         284 Load 286(s2DArray)
+            4188:  167(fvec3) Load 169(c3)
+            4189:   52(float) Load 565(lod)
+            4190:3102(ResType) ImageSparseGather 4187 4188 2187 Lod ConstOffsets 4189 2380
+            4191:  7(f16vec4) CompositeExtract 4190 1
+                              Store 4174(texel) 4191
+            4192:     47(int) CompositeExtract 4190 0
+            4193:         284 Load 286(s2DArray)
+            4194:175(f16vec3) Load 177(f16c3)
+            4195:6(float16_t) Load 572(f16lod)
+            4196:3102(ResType) ImageSparseGather 4193 4194 2187 Lod ConstOffsets 4195 2380
+            4197:  7(f16vec4) CompositeExtract 4196 1
+                              Store 4174(texel) 4197
+            4198:     47(int) CompositeExtract 4196 0
+            4199:  7(f16vec4) Load 4174(texel)
+                              ReturnValue 4199
+                              FunctionEnd
+97(testSparseImageLoad():  7(f16vec4) Function None 8
+              98:             Label
+     4202(texel):     64(ptr) Variable Function
+                              Store 4202(texel) 121
+            4203:        2962 Load 2964(i2D)
+            4204:   53(fvec2) Load 148(c2)
+            4205:  721(ivec2) ConvertFToS 4204
+            4206:3102(ResType) ImageSparseRead 4203 4205
+            4207:  7(f16vec4) CompositeExtract 4206 1
+                              Store 4202(texel) 4207
+            4208:     47(int) CompositeExtract 4206 0
+            4209:        2971 Load 2973(i3D)
+            4210:  167(fvec3) Load 169(c3)
+            4211:  734(ivec3) ConvertFToS 4210
+            4212:3102(ResType) ImageSparseRead 4209 4211
+            4213:  7(f16vec4) CompositeExtract 4212 1
+                              Store 4202(texel) 4213
+            4214:     47(int) CompositeExtract 4212 0
+            4215:        2980 Load 2982(i2DRect)
+            4216:   53(fvec2) Load 148(c2)
+            4217:  721(ivec2) ConvertFToS 4216
+            4218:3102(ResType) ImageSparseRead 4215 4217
+            4219:  7(f16vec4) CompositeExtract 4218 1
+                              Store 4202(texel) 4219
+            4220:     47(int) CompositeExtract 4218 0
+            4221:        2989 Load 2991(iCube)
+            4222:  167(fvec3) Load 169(c3)
+            4223:  734(ivec3) ConvertFToS 4222
+            4224:3102(ResType) ImageSparseRead 4221 4223
+            4225:  7(f16vec4) CompositeExtract 4224 1
+                              Store 4202(texel) 4225
+            4226:     47(int) CompositeExtract 4224 0
+            4227:        3016 Load 3018(i2DArray)
+            4228:  167(fvec3) Load 169(c3)
+            4229:  734(ivec3) ConvertFToS 4228
+            4230:3102(ResType) ImageSparseRead 4227 4229
+            4231:  7(f16vec4) CompositeExtract 4230 1
+                              Store 4202(texel) 4231
+            4232:     47(int) CompositeExtract 4230 0
+            4233:        3025 Load 3027(iCubeArray)
+            4234:  167(fvec3) Load 169(c3)
+            4235:  734(ivec3) ConvertFToS 4234
+            4236:3102(ResType) ImageSparseRead 4233 4235
+            4237:  7(f16vec4) CompositeExtract 4236 1
+                              Store 4202(texel) 4237
+            4238:     47(int) CompositeExtract 4236 0
+            4239:        3034 Load 3036(i2DMS)
+            4240:   53(fvec2) Load 148(c2)
+            4241:  721(ivec2) ConvertFToS 4240
+            4242:3102(ResType) ImageSparseRead 4239 4241 Sample 709
+            4243:  7(f16vec4) CompositeExtract 4242 1
+                              Store 4202(texel) 4243
+            4244:     47(int) CompositeExtract 4242 0
+            4245:        3043 Load 3045(i2DMSArray)
+            4246:  167(fvec3) Load 169(c3)
+            4247:  734(ivec3) ConvertFToS 4246
+            4248:3102(ResType) ImageSparseRead 4245 4247 Sample 1326
+            4249:  7(f16vec4) CompositeExtract 4248 1
+                              Store 4202(texel) 4249
+            4250:     47(int) CompositeExtract 4248 0
+            4251:  7(f16vec4) Load 4202(texel)
+                              ReturnValue 4251
+                              FunctionEnd
+99(testSparseTextureClamp():  7(f16vec4) Function None 8
+             100:             Label
+     4254(texel):     64(ptr) Variable Function
+                              Store 4254(texel) 121
+            4255:         143 Load 145(s2D)
+            4256:   53(fvec2) Load 148(c2)
+            4258:   52(float) Load 4257(lodClamp)
+            4259:3102(ResType) ImageSparseSampleImplicitLod 4255 4256 MinLod 4258
+            4260:  7(f16vec4) CompositeExtract 4259 1
+                              Store 4254(texel) 4260
+            4261:     47(int) CompositeExtract 4259 0
+            4262:         143 Load 145(s2D)
+            4263:154(f16vec2) Load 156(f16c2)
+            4265:6(float16_t) Load 4264(f16lodClamp)
+            4266:6(float16_t) Load 137(f16bias)
+            4267:3102(ResType) ImageSparseSampleImplicitLod 4262 4263 Bias MinLod 4266 4265
+            4268:  7(f16vec4) CompositeExtract 4267 1
+                              Store 4254(texel) 4268
+            4269:     47(int) CompositeExtract 4267 0
+            4270:         163 Load 165(s3D)
+            4271:  167(fvec3) Load 169(c3)
+            4272:   52(float) Load 4257(lodClamp)
+            4273:3102(ResType) ImageSparseSampleImplicitLod 4270 4271 MinLod 4272
+            4274:  7(f16vec4) CompositeExtract 4273 1
+                              Store 4254(texel) 4274
+            4275:     47(int) CompositeExtract 4273 0
+            4276:         163 Load 165(s3D)
+            4277:175(f16vec3) Load 177(f16c3)
+            4278:6(float16_t) Load 4264(f16lodClamp)
+            4279:6(float16_t) Load 137(f16bias)
+            4280:3102(ResType) ImageSparseSampleImplicitLod 4276 4277 Bias MinLod 4279 4278
+            4281:  7(f16vec4) CompositeExtract 4280 1
+                              Store 4254(texel) 4281
+            4282:     47(int) CompositeExtract 4280 0
+            4283:         184 Load 186(sCube)
+            4284:  167(fvec3) Load 169(c3)
+            4285:   52(float) Load 4257(lodClamp)
+            4286:3102(ResType) ImageSparseSampleImplicitLod 4283 4284 MinLod 4285
+            4287:  7(f16vec4) CompositeExtract 4286 1
+                              Store 4254(texel) 4287
+            4288:     47(int) CompositeExtract 4286 0
+            4289:         184 Load 186(sCube)
+            4290:175(f16vec3) Load 177(f16c3)
+            4291:6(float16_t) Load 4264(f16lodClamp)
+            4292:6(float16_t) Load 137(f16bias)
+            4293:3102(ResType) ImageSparseSampleImplicitLod 4289 4290 Bias MinLod 4292 4291
+            4294:  7(f16vec4) CompositeExtract 4293 1
+                              Store 4254(texel) 4294
+            4295:     47(int) CompositeExtract 4293 0
+            4296:         224 Load 226(s2DShadow)
+            4297:  167(fvec3) Load 169(c3)
+            4298:   52(float) Load 4257(lodClamp)
+            4299:    208(ptr) AccessChain 4254(texel) 207
+            4300:   52(float) CompositeExtract 4297 2
+            4301:3138(ResType) ImageSparseSampleDrefImplicitLod 4296 4297 4300 MinLod 4298
+            4302:6(float16_t) CompositeExtract 4301 1
+                              Store 4299 4302
+            4303:     47(int) CompositeExtract 4301 0
+            4304:         224 Load 226(s2DShadow)
+            4305:154(f16vec2) Load 156(f16c2)
+            4306:   52(float) Load 215(compare)
+            4307:6(float16_t) Load 4264(f16lodClamp)
+            4308:    208(ptr) AccessChain 4254(texel) 207
+            4309:6(float16_t) Load 137(f16bias)
+            4310:3138(ResType) ImageSparseSampleDrefImplicitLod 4304 4305 4306 Bias MinLod 4309 4307
+            4311:6(float16_t) CompositeExtract 4310 1
+                              Store 4308 4311
+            4312:     47(int) CompositeExtract 4310 0
+            4313:         245 Load 247(sCubeShadow)
+            4314:  249(fvec4) Load 251(c4)
+            4315:   52(float) Load 4257(lodClamp)
+            4316:    208(ptr) AccessChain 4254(texel) 207
+            4317:   52(float) CompositeExtract 4314 3
+            4318:3138(ResType) ImageSparseSampleDrefImplicitLod 4313 4314 4317 MinLod 4315
+            4319:6(float16_t) CompositeExtract 4318 1
+                              Store 4316 4319
+            4320:     47(int) CompositeExtract 4318 0
+            4321:         245 Load 247(sCubeShadow)
+            4322:175(f16vec3) Load 177(f16c3)
+            4323:   52(float) Load 215(compare)
+            4324:6(float16_t) Load 4264(f16lodClamp)
+            4325:    208(ptr) AccessChain 4254(texel) 207
+            4326:6(float16_t) Load 137(f16bias)
+            4327:3138(ResType) ImageSparseSampleDrefImplicitLod 4321 4322 4323 Bias MinLod 4326 4324
+            4328:6(float16_t) CompositeExtract 4327 1
+                              Store 4325 4328
+            4329:     47(int) CompositeExtract 4327 0
+            4330:         284 Load 286(s2DArray)
+            4331:  167(fvec3) Load 169(c3)
+            4332:   52(float) Load 4257(lodClamp)
+            4333:3102(ResType) ImageSparseSampleImplicitLod 4330 4331 MinLod 4332
+            4334:  7(f16vec4) CompositeExtract 4333 1
+                              Store 4254(texel) 4334
+            4335:     47(int) CompositeExtract 4333 0
+            4336:         284 Load 286(s2DArray)
+            4337:175(f16vec3) Load 177(f16c3)
+            4338:6(float16_t) Load 4264(f16lodClamp)
+            4339:6(float16_t) Load 137(f16bias)
+            4340:3102(ResType) ImageSparseSampleImplicitLod 4336 4337 Bias MinLod 4339 4338
+            4341:  7(f16vec4) CompositeExtract 4340 1
+                              Store 4254(texel) 4341
+            4342:     47(int) CompositeExtract 4340 0
+            4343:         299 Load 301(sCubeArray)
+            4344:  249(fvec4) Load 251(c4)
+            4345:   52(float) Load 4257(lodClamp)
+            4346:3102(ResType) ImageSparseSampleImplicitLod 4343 4344 MinLod 4345
+            4347:  7(f16vec4) CompositeExtract 4346 1
+                              Store 4254(texel) 4347
+            4348:     47(int) CompositeExtract 4346 0
+            4349:         299 Load 301(sCubeArray)
+            4350:  7(f16vec4) Load 309(f16c4)
+            4351:6(float16_t) Load 4264(f16lodClamp)
+            4352:6(float16_t) Load 137(f16bias)
+            4353:3102(ResType) ImageSparseSampleImplicitLod 4349 4350 Bias MinLod 4352 4351
+            4354:  7(f16vec4) CompositeExtract 4353 1
+                              Store 4254(texel) 4354
+            4355:     47(int) CompositeExtract 4353 0
+            4356:         337 Load 339(s2DArrayShadow)
+            4357:  249(fvec4) Load 251(c4)
+            4358:   52(float) Load 4257(lodClamp)
+            4359:    208(ptr) AccessChain 4254(texel) 207
+            4360:   52(float) CompositeExtract 4357 3
+            4361:3138(ResType) ImageSparseSampleDrefImplicitLod 4356 4357 4360 MinLod 4358
+            4362:6(float16_t) CompositeExtract 4361 1
+                              Store 4359 4362
+            4363:     47(int) CompositeExtract 4361 0
+            4364:         337 Load 339(s2DArrayShadow)
+            4365:175(f16vec3) Load 177(f16c3)
+            4366:   52(float) Load 215(compare)
+            4367:6(float16_t) Load 4264(f16lodClamp)
+            4368:    208(ptr) AccessChain 4254(texel) 207
+            4369:3138(ResType) ImageSparseSampleDrefImplicitLod 4364 4365 4366 MinLod 4367
+            4370:6(float16_t) CompositeExtract 4369 1
+                              Store 4368 4370
+            4371:     47(int) CompositeExtract 4369 0
+            4372:         391 Load 393(sCubeArrayShadow)
+            4373:  249(fvec4) Load 251(c4)
+            4374:   52(float) Load 215(compare)
+            4375:   52(float) Load 4257(lodClamp)
+            4376:    208(ptr) AccessChain 4254(texel) 207
+            4377:3138(ResType) ImageSparseSampleDrefImplicitLod 4372 4373 4374 MinLod 4375
+            4378:6(float16_t) CompositeExtract 4377 1
+                              Store 4376 4378
+            4379:     47(int) CompositeExtract 4377 0
+            4380:         391 Load 393(sCubeArrayShadow)
+            4381:  7(f16vec4) Load 309(f16c4)
+            4382:   52(float) Load 215(compare)
+            4383:6(float16_t) Load 4264(f16lodClamp)
+            4384:    208(ptr) AccessChain 4254(texel) 207
+            4385:3138(ResType) ImageSparseSampleDrefImplicitLod 4380 4381 4382 MinLod 4383
+            4386:6(float16_t) CompositeExtract 4385 1
+                              Store 4384 4386
+            4387:     47(int) CompositeExtract 4385 0
+            4388:  7(f16vec4) Load 4254(texel)
+                              ReturnValue 4388
+                              FunctionEnd
+101(testTextureClamp():  7(f16vec4) Function None 8
+             102:             Label
+     4391(texel):     64(ptr) Variable Function
+                              Store 4391(texel) 121
+            4392:         123 Load 125(s1D)
+            4393:   52(float) Load 128(c1)
+            4394:   52(float) Load 4257(lodClamp)
+            4395:  7(f16vec4) ImageSampleImplicitLod 4392 4393 MinLod 4394
+            4396:  7(f16vec4) Load 4391(texel)
+            4397:  7(f16vec4) FAdd 4396 4395
+                              Store 4391(texel) 4397
+            4398:         123 Load 125(s1D)
+            4399:6(float16_t) Load 135(f16c1)
+            4400:6(float16_t) Load 4264(f16lodClamp)
+            4401:6(float16_t) Load 137(f16bias)
+            4402:  7(f16vec4) ImageSampleImplicitLod 4398 4399 Bias MinLod 4401 4400
+            4403:  7(f16vec4) Load 4391(texel)
+            4404:  7(f16vec4) FAdd 4403 4402
+                              Store 4391(texel) 4404
+            4405:         143 Load 145(s2D)
+            4406:   53(fvec2) Load 148(c2)
+            4407:   52(float) Load 4257(lodClamp)
+            4408:  7(f16vec4) ImageSampleImplicitLod 4405 4406 MinLod 4407
+            4409:  7(f16vec4) Load 4391(texel)
+            4410:  7(f16vec4) FAdd 4409 4408
+                              Store 4391(texel) 4410
+            4411:         143 Load 145(s2D)
+            4412:154(f16vec2) Load 156(f16c2)
+            4413:6(float16_t) Load 4264(f16lodClamp)
+            4414:6(float16_t) Load 137(f16bias)
+            4415:  7(f16vec4) ImageSampleImplicitLod 4411 4412 Bias MinLod 4414 4413
+            4416:  7(f16vec4) Load 4391(texel)
+            4417:  7(f16vec4) FAdd 4416 4415
+                              Store 4391(texel) 4417
+            4418:         163 Load 165(s3D)
+            4419:  167(fvec3) Load 169(c3)
+            4420:   52(float) Load 4257(lodClamp)
+            4421:  7(f16vec4) ImageSampleImplicitLod 4418 4419 MinLod 4420
+            4422:  7(f16vec4) Load 4391(texel)
+            4423:  7(f16vec4) FAdd 4422 4421
+                              Store 4391(texel) 4423
+            4424:         163 Load 165(s3D)
+            4425:175(f16vec3) Load 177(f16c3)
+            4426:6(float16_t) Load 4264(f16lodClamp)
+            4427:6(float16_t) Load 137(f16bias)
+            4428:  7(f16vec4) ImageSampleImplicitLod 4424 4425 Bias MinLod 4427 4426
+            4429:  7(f16vec4) Load 4391(texel)
+            4430:  7(f16vec4) FAdd 4429 4428
+                              Store 4391(texel) 4430
+            4431:         184 Load 186(sCube)
+            4432:  167(fvec3) Load 169(c3)
+            4433:   52(float) Load 4257(lodClamp)
+            4434:  7(f16vec4) ImageSampleImplicitLod 4431 4432 MinLod 4433
+            4435:  7(f16vec4) Load 4391(texel)
+            4436:  7(f16vec4) FAdd 4435 4434
+                              Store 4391(texel) 4436
+            4437:         184 Load 186(sCube)
+            4438:175(f16vec3) Load 177(f16c3)
+            4439:6(float16_t) Load 4264(f16lodClamp)
+            4440:6(float16_t) Load 137(f16bias)
+            4441:  7(f16vec4) ImageSampleImplicitLod 4437 4438 Bias MinLod 4440 4439
+            4442:  7(f16vec4) Load 4391(texel)
+            4443:  7(f16vec4) FAdd 4442 4441
+                              Store 4391(texel) 4443
+            4444:         199 Load 201(s1DShadow)
+            4445:  167(fvec3) Load 169(c3)
+            4446:   52(float) Load 4257(lodClamp)
+            4447:   52(float) CompositeExtract 4445 2
+            4448:6(float16_t) ImageSampleDrefImplicitLod 4444 4445 4447 MinLod 4446
+            4449:    208(ptr) AccessChain 4391(texel) 207
+            4450:6(float16_t) Load 4449
+            4451:6(float16_t) FAdd 4450 4448
+            4452:    208(ptr) AccessChain 4391(texel) 207
+                              Store 4452 4451
+            4453:         199 Load 201(s1DShadow)
+            4454:154(f16vec2) Load 156(f16c2)
+            4455:   52(float) Load 215(compare)
+            4456:6(float16_t) Load 4264(f16lodClamp)
+            4457:6(float16_t) Load 137(f16bias)
+            4458:6(float16_t) ImageSampleDrefImplicitLod 4453 4454 4455 Bias MinLod 4457 4456
+            4459:    208(ptr) AccessChain 4391(texel) 207
+            4460:6(float16_t) Load 4459
+            4461:6(float16_t) FAdd 4460 4458
+            4462:    208(ptr) AccessChain 4391(texel) 207
+                              Store 4462 4461
+            4463:         224 Load 226(s2DShadow)
+            4464:  167(fvec3) Load 169(c3)
+            4465:   52(float) Load 4257(lodClamp)
+            4466:   52(float) CompositeExtract 4464 2
+            4467:6(float16_t) ImageSampleDrefImplicitLod 4463 4464 4466 MinLod 4465
+            4468:    208(ptr) AccessChain 4391(texel) 207
+            4469:6(float16_t) Load 4468
+            4470:6(float16_t) FAdd 4469 4467
+            4471:    208(ptr) AccessChain 4391(texel) 207
+                              Store 4471 4470
+            4472:         224 Load 226(s2DShadow)
+            4473:154(f16vec2) Load 156(f16c2)
+            4474:   52(float) Load 215(compare)
+            4475:6(float16_t) Load 4264(f16lodClamp)
+            4476:6(float16_t) Load 137(f16bias)
+            4477:6(float16_t) ImageSampleDrefImplicitLod 4472 4473 4474 Bias MinLod 4476 4475
+            4478:    208(ptr) AccessChain 4391(texel) 207
+            4479:6(float16_t) Load 4478
+            4480:6(float16_t) FAdd 4479 4477
+            4481:    208(ptr) AccessChain 4391(texel) 207
+                              Store 4481 4480
+            4482:         245 Load 247(sCubeShadow)
+            4483:  249(fvec4) Load 251(c4)
+            4484:   52(float) Load 4257(lodClamp)
+            4485:   52(float) CompositeExtract 4483 3
+            4486:6(float16_t) ImageSampleDrefImplicitLod 4482 4483 4485 MinLod 4484
+            4487:    208(ptr) AccessChain 4391(texel) 207
+            4488:6(float16_t) Load 4487
+            4489:6(float16_t) FAdd 4488 4486
+            4490:    208(ptr) AccessChain 4391(texel) 207
+                              Store 4490 4489
+            4491:         245 Load 247(sCubeShadow)
+            4492:175(f16vec3) Load 177(f16c3)
+            4493:   52(float) Load 215(compare)
+            4494:6(float16_t) Load 4264(f16lodClamp)
+            4495:6(float16_t) Load 137(f16bias)
+            4496:6(float16_t) ImageSampleDrefImplicitLod 4491 4492 4493 Bias MinLod 4495 4494
+            4497:    208(ptr) AccessChain 4391(texel) 207
+            4498:6(float16_t) Load 4497
+            4499:6(float16_t) FAdd 4498 4496
+            4500:    208(ptr) AccessChain 4391(texel) 207
+                              Store 4500 4499
+            4501:         269 Load 271(s1DArray)
+            4502:   53(fvec2) Load 148(c2)
+            4503:   52(float) Load 4257(lodClamp)
+            4504:  7(f16vec4) ImageSampleImplicitLod 4501 4502 MinLod 4503
+            4505:  7(f16vec4) Load 4391(texel)
+            4506:  7(f16vec4) FAdd 4505 4504
+                              Store 4391(texel) 4506
+            4507:         269 Load 271(s1DArray)
+            4508:154(f16vec2) Load 156(f16c2)
+            4509:6(float16_t) Load 4264(f16lodClamp)
+            4510:6(float16_t) Load 137(f16bias)
+            4511:  7(f16vec4) ImageSampleImplicitLod 4507 4508 Bias MinLod 4510 4509
+            4512:  7(f16vec4) Load 4391(texel)
+            4513:  7(f16vec4) FAdd 4512 4511
+                              Store 4391(texel) 4513
+            4514:         284 Load 286(s2DArray)
+            4515:  167(fvec3) Load 169(c3)
+            4516:   52(float) Load 4257(lodClamp)
+            4517:  7(f16vec4) ImageSampleImplicitLod 4514 4515 MinLod 4516
+            4518:  7(f16vec4) Load 4391(texel)
+            4519:  7(f16vec4) FAdd 4518 4517
+                              Store 4391(texel) 4519
+            4520:         284 Load 286(s2DArray)
+            4521:175(f16vec3) Load 177(f16c3)
+            4522:6(float16_t) Load 4264(f16lodClamp)
+            4523:6(float16_t) Load 137(f16bias)
+            4524:  7(f16vec4) ImageSampleImplicitLod 4520 4521 Bias MinLod 4523 4522
+            4525:  7(f16vec4) Load 4391(texel)
+            4526:  7(f16vec4) FAdd 4525 4524
+                              Store 4391(texel) 4526
+            4527:         299 Load 301(sCubeArray)
+            4528:  249(fvec4) Load 251(c4)
+            4529:   52(float) Load 4257(lodClamp)
+            4530:  7(f16vec4) ImageSampleImplicitLod 4527 4528 MinLod 4529
+            4531:  7(f16vec4) Load 4391(texel)
+            4532:  7(f16vec4) FAdd 4531 4530
+                              Store 4391(texel) 4532
+            4533:         299 Load 301(sCubeArray)
+            4534:  7(f16vec4) Load 309(f16c4)
+            4535:6(float16_t) Load 4264(f16lodClamp)
+            4536:6(float16_t) Load 137(f16bias)
+            4537:  7(f16vec4) ImageSampleImplicitLod 4533 4534 Bias MinLod 4536 4535
+            4538:  7(f16vec4) Load 4391(texel)
+            4539:  7(f16vec4) FAdd 4538 4537
+                              Store 4391(texel) 4539
+            4540:         316 Load 318(s1DArrayShadow)
+            4541:  167(fvec3) Load 169(c3)
+            4542:   52(float) Load 4257(lodClamp)
+            4543:   52(float) CompositeExtract 4541 2
+            4544:6(float16_t) ImageSampleDrefImplicitLod 4540 4541 4543 MinLod 4542
+            4545:    208(ptr) AccessChain 4391(texel) 207
+            4546:6(float16_t) Load 4545
+            4547:6(float16_t) FAdd 4546 4544
+            4548:    208(ptr) AccessChain 4391(texel) 207
+                              Store 4548 4547
+            4549:         316 Load 318(s1DArrayShadow)
+            4550:154(f16vec2) Load 156(f16c2)
+            4551:   52(float) Load 215(compare)
+            4552:6(float16_t) Load 4264(f16lodClamp)
+            4553:6(float16_t) Load 137(f16bias)
+            4554:6(float16_t) ImageSampleDrefImplicitLod 4549 4550 4551 Bias MinLod 4553 4552
+            4555:    208(ptr) AccessChain 4391(texel) 207
+            4556:6(float16_t) Load 4555
+            4557:6(float16_t) FAdd 4556 4554
+            4558:    208(ptr) AccessChain 4391(texel) 207
+                              Store 4558 4557
+            4559:         337 Load 339(s2DArrayShadow)
+            4560:  249(fvec4) Load 251(c4)
+            4561:   52(float) Load 4257(lodClamp)
+            4562:   52(float) CompositeExtract 4560 3
+            4563:6(float16_t) ImageSampleDrefImplicitLod 4559 4560 4562 MinLod 4561
+            4564:    208(ptr) AccessChain 4391(texel) 207
+            4565:6(float16_t) Load 4564
+            4566:6(float16_t) FAdd 4565 4563
+            4567:    208(ptr) AccessChain 4391(texel) 207
+                              Store 4567 4566
+            4568:         337 Load 339(s2DArrayShadow)
+            4569:175(f16vec3) Load 177(f16c3)
+            4570:   52(float) Load 215(compare)
+            4571:6(float16_t) Load 4264(f16lodClamp)
+            4572:6(float16_t) ImageSampleDrefImplicitLod 4568 4569 4570 MinLod 4571
+            4573:    208(ptr) AccessChain 4391(texel) 207
+            4574:6(float16_t) Load 4573
+            4575:6(float16_t) FAdd 4574 4572
+            4576:    208(ptr) AccessChain 4391(texel) 207
+                              Store 4576 4575
+            4577:         391 Load 393(sCubeArrayShadow)
+            4578:  249(fvec4) Load 251(c4)
+            4579:   52(float) Load 215(compare)
+            4580:   52(float) Load 4257(lodClamp)
+            4581:6(float16_t) ImageSampleDrefImplicitLod 4577 4578 4579 MinLod 4580
+            4582:    208(ptr) AccessChain 4391(texel) 207
+            4583:6(float16_t) Load 4582
+            4584:6(float16_t) FAdd 4583 4581
+            4585:    208(ptr) AccessChain 4391(texel) 207
+                              Store 4585 4584
+            4586:         391 Load 393(sCubeArrayShadow)
+            4587:  7(f16vec4) Load 309(f16c4)
+            4588:   52(float) Load 215(compare)
+            4589:6(float16_t) Load 4264(f16lodClamp)
+            4590:6(float16_t) ImageSampleDrefImplicitLod 4586 4587 4588 MinLod 4589
+            4591:    208(ptr) AccessChain 4391(texel) 207
+            4592:6(float16_t) Load 4591
+            4593:6(float16_t) FAdd 4592 4590
+            4594:    208(ptr) AccessChain 4391(texel) 207
+                              Store 4594 4593
+            4595:  7(f16vec4) Load 4391(texel)
+                              ReturnValue 4595
+                              FunctionEnd
+103(testSparseTextureOffsetClamp():  7(f16vec4) Function None 8
+             104:             Label
+     4598(texel):     64(ptr) Variable Function
+                              Store 4598(texel) 121
+            4599:         143 Load 145(s2D)
+            4600:   53(fvec2) Load 148(c2)
+            4601:   52(float) Load 4257(lodClamp)
+            4602:3102(ResType) ImageSparseSampleImplicitLod 4599 4600 ConstOffset MinLod 722 4601
+            4603:  7(f16vec4) CompositeExtract 4602 1
+                              Store 4598(texel) 4603
+            4604:     47(int) CompositeExtract 4602 0
+            4605:         143 Load 145(s2D)
+            4606:154(f16vec2) Load 156(f16c2)
+            4607:6(float16_t) Load 4264(f16lodClamp)
+            4608:6(float16_t) Load 137(f16bias)
+            4609:3102(ResType) ImageSparseSampleImplicitLod 4605 4606 Bias ConstOffset MinLod 4608 722 4607
+            4610:  7(f16vec4) CompositeExtract 4609 1
+                              Store 4598(texel) 4610
+            4611:     47(int) CompositeExtract 4609 0
+            4612:         163 Load 165(s3D)
+            4613:  167(fvec3) Load 169(c3)
+            4614:   52(float) Load 4257(lodClamp)
+            4615:3102(ResType) ImageSparseSampleImplicitLod 4612 4613 ConstOffset MinLod 735 4614
+            4616:  7(f16vec4) CompositeExtract 4615 1
+                              Store 4598(texel) 4616
+            4617:     47(int) CompositeExtract 4615 0
+            4618:         163 Load 165(s3D)
+            4619:175(f16vec3) Load 177(f16c3)
+            4620:6(float16_t) Load 4264(f16lodClamp)
+            4621:6(float16_t) Load 137(f16bias)
+            4622:3102(ResType) ImageSparseSampleImplicitLod 4618 4619 Bias ConstOffset MinLod 4621 735 4620
+            4623:  7(f16vec4) CompositeExtract 4622 1
+                              Store 4598(texel) 4623
+            4624:     47(int) CompositeExtract 4622 0
+            4625:         224 Load 226(s2DShadow)
+            4626:  167(fvec3) Load 169(c3)
+            4627:   52(float) Load 4257(lodClamp)
+            4628:    208(ptr) AccessChain 4598(texel) 207
+            4629:   52(float) CompositeExtract 4626 2
+            4630:3138(ResType) ImageSparseSampleDrefImplicitLod 4625 4626 4629 ConstOffset MinLod 722 4627
+            4631:6(float16_t) CompositeExtract 4630 1
+                              Store 4628 4631
+            4632:     47(int) CompositeExtract 4630 0
+            4633:         224 Load 226(s2DShadow)
+            4634:154(f16vec2) Load 156(f16c2)
+            4635:   52(float) Load 215(compare)
+            4636:6(float16_t) Load 4264(f16lodClamp)
+            4637:    208(ptr) AccessChain 4598(texel) 207
+            4638:6(float16_t) Load 137(f16bias)
+            4639:3138(ResType) ImageSparseSampleDrefImplicitLod 4633 4634 4635 Bias ConstOffset MinLod 4638 722 4636
+            4640:6(float16_t) CompositeExtract 4639 1
+                              Store 4637 4640
+            4641:     47(int) CompositeExtract 4639 0
+            4642:         284 Load 286(s2DArray)
+            4643:  167(fvec3) Load 169(c3)
+            4644:   52(float) Load 4257(lodClamp)
+            4645:3102(ResType) ImageSparseSampleImplicitLod 4642 4643 ConstOffset MinLod 722 4644
+            4646:  7(f16vec4) CompositeExtract 4645 1
+                              Store 4598(texel) 4646
+            4647:     47(int) CompositeExtract 4645 0
+            4648:         284 Load 286(s2DArray)
+            4649:175(f16vec3) Load 177(f16c3)
+            4650:6(float16_t) Load 4264(f16lodClamp)
+            4651:6(float16_t) Load 137(f16bias)
+            4652:3102(ResType) ImageSparseSampleImplicitLod 4648 4649 Bias ConstOffset MinLod 4651 722 4650
+            4653:  7(f16vec4) CompositeExtract 4652 1
+                              Store 4598(texel) 4653
+            4654:     47(int) CompositeExtract 4652 0
+            4655:         337 Load 339(s2DArrayShadow)
+            4656:  249(fvec4) Load 251(c4)
+            4657:   52(float) Load 4257(lodClamp)
+            4658:    208(ptr) AccessChain 4598(texel) 207
+            4659:   52(float) CompositeExtract 4656 3
+            4660:3138(ResType) ImageSparseSampleDrefImplicitLod 4655 4656 4659 ConstOffset MinLod 722 4657
+            4661:6(float16_t) CompositeExtract 4660 1
+                              Store 4658 4661
+            4662:     47(int) CompositeExtract 4660 0
+            4663:         337 Load 339(s2DArrayShadow)
+            4664:175(f16vec3) Load 177(f16c3)
+            4665:   52(float) Load 215(compare)
+            4666:6(float16_t) Load 4264(f16lodClamp)
+            4667:    208(ptr) AccessChain 4598(texel) 207
+            4668:3138(ResType) ImageSparseSampleDrefImplicitLod 4663 4664 4665 ConstOffset MinLod 722 4666
+            4669:6(float16_t) CompositeExtract 4668 1
+                              Store 4667 4669
+            4670:     47(int) CompositeExtract 4668 0
+            4671:  7(f16vec4) Load 4598(texel)
+                              ReturnValue 4671
+                              FunctionEnd
+105(testTextureOffsetClamp():  7(f16vec4) Function None 8
+             106:             Label
+     4674(texel):     64(ptr) Variable Function
+                              Store 4674(texel) 121
+            4675:         123 Load 125(s1D)
+            4676:   52(float) Load 128(c1)
+            4677:   52(float) Load 4257(lodClamp)
+            4678:  7(f16vec4) ImageSampleImplicitLod 4675 4676 ConstOffset MinLod 709 4677
+            4679:  7(f16vec4) Load 4674(texel)
+            4680:  7(f16vec4) FAdd 4679 4678
+                              Store 4674(texel) 4680
+            4681:         123 Load 125(s1D)
+            4682:6(float16_t) Load 135(f16c1)
+            4683:6(float16_t) Load 4264(f16lodClamp)
+            4684:6(float16_t) Load 137(f16bias)
+            4685:  7(f16vec4) ImageSampleImplicitLod 4681 4682 Bias ConstOffset MinLod 4684 709 4683
+            4686:  7(f16vec4) Load 4674(texel)
+            4687:  7(f16vec4) FAdd 4686 4685
+                              Store 4674(texel) 4687
+            4688:         143 Load 145(s2D)
+            4689:   53(fvec2) Load 148(c2)
+            4690:   52(float) Load 4257(lodClamp)
+            4691:  7(f16vec4) ImageSampleImplicitLod 4688 4689 ConstOffset MinLod 722 4690
+            4692:  7(f16vec4) Load 4674(texel)
+            4693:  7(f16vec4) FAdd 4692 4691
+                              Store 4674(texel) 4693
+            4694:         143 Load 145(s2D)
+            4695:154(f16vec2) Load 156(f16c2)
+            4696:6(float16_t) Load 4264(f16lodClamp)
+            4697:6(float16_t) Load 137(f16bias)
+            4698:  7(f16vec4) ImageSampleImplicitLod 4694 4695 Bias ConstOffset MinLod 4697 722 4696
+            4699:  7(f16vec4) Load 4674(texel)
+            4700:  7(f16vec4) FAdd 4699 4698
+                              Store 4674(texel) 4700
+            4701:         163 Load 165(s3D)
+            4702:  167(fvec3) Load 169(c3)
+            4703:   52(float) Load 4257(lodClamp)
+            4704:  7(f16vec4) ImageSampleImplicitLod 4701 4702 ConstOffset MinLod 735 4703
+            4705:  7(f16vec4) Load 4674(texel)
+            4706:  7(f16vec4) FAdd 4705 4704
+                              Store 4674(texel) 4706
+            4707:         163 Load 165(s3D)
+            4708:175(f16vec3) Load 177(f16c3)
+            4709:6(float16_t) Load 4264(f16lodClamp)
+            4710:6(float16_t) Load 137(f16bias)
+            4711:  7(f16vec4) ImageSampleImplicitLod 4707 4708 Bias ConstOffset MinLod 4710 735 4709
+            4712:  7(f16vec4) Load 4674(texel)
+            4713:  7(f16vec4) FAdd 4712 4711
+                              Store 4674(texel) 4713
+            4714:         199 Load 201(s1DShadow)
+            4715:  167(fvec3) Load 169(c3)
+            4716:   52(float) Load 4257(lodClamp)
+            4717:   52(float) CompositeExtract 4715 2
+            4718:6(float16_t) ImageSampleDrefImplicitLod 4714 4715 4717 ConstOffset MinLod 709 4716
+            4719:    208(ptr) AccessChain 4674(texel) 207
+            4720:6(float16_t) Load 4719
+            4721:6(float16_t) FAdd 4720 4718
+            4722:    208(ptr) AccessChain 4674(texel) 207
+                              Store 4722 4721
+            4723:         199 Load 201(s1DShadow)
+            4724:154(f16vec2) Load 156(f16c2)
+            4725:   52(float) Load 215(compare)
+            4726:6(float16_t) Load 4264(f16lodClamp)
+            4727:6(float16_t) Load 137(f16bias)
+            4728:6(float16_t) ImageSampleDrefImplicitLod 4723 4724 4725 Bias ConstOffset MinLod 4727 709 4726
+            4729:    208(ptr) AccessChain 4674(texel) 207
+            4730:6(float16_t) Load 4729
+            4731:6(float16_t) FAdd 4730 4728
+            4732:    208(ptr) AccessChain 4674(texel) 207
+                              Store 4732 4731
+            4733:         224 Load 226(s2DShadow)
+            4734:  167(fvec3) Load 169(c3)
+            4735:   52(float) Load 4257(lodClamp)
+            4736:   52(float) CompositeExtract 4734 2
+            4737:6(float16_t) ImageSampleDrefImplicitLod 4733 4734 4736 ConstOffset MinLod 722 4735
+            4738:    208(ptr) AccessChain 4674(texel) 207
+            4739:6(float16_t) Load 4738
+            4740:6(float16_t) FAdd 4739 4737
+            4741:    208(ptr) AccessChain 4674(texel) 207
+                              Store 4741 4740
+            4742:         224 Load 226(s2DShadow)
+            4743:154(f16vec2) Load 156(f16c2)
+            4744:   52(float) Load 215(compare)
+            4745:6(float16_t) Load 4264(f16lodClamp)
+            4746:6(float16_t) Load 137(f16bias)
+            4747:6(float16_t) ImageSampleDrefImplicitLod 4742 4743 4744 Bias ConstOffset MinLod 4746 722 4745
+            4748:    208(ptr) AccessChain 4674(texel) 207
+            4749:6(float16_t) Load 4748
+            4750:6(float16_t) FAdd 4749 4747
+            4751:    208(ptr) AccessChain 4674(texel) 207
+                              Store 4751 4750
+            4752:         269 Load 271(s1DArray)
+            4753:   53(fvec2) Load 148(c2)
+            4754:   52(float) Load 4257(lodClamp)
+            4755:  7(f16vec4) ImageSampleImplicitLod 4752 4753 ConstOffset MinLod 709 4754
+            4756:  7(f16vec4) Load 4674(texel)
+            4757:  7(f16vec4) FAdd 4756 4755
+                              Store 4674(texel) 4757
+            4758:         269 Load 271(s1DArray)
+            4759:154(f16vec2) Load 156(f16c2)
+            4760:6(float16_t) Load 4264(f16lodClamp)
+            4761:6(float16_t) Load 137(f16bias)
+            4762:  7(f16vec4) ImageSampleImplicitLod 4758 4759 Bias ConstOffset MinLod 4761 709 4760
+            4763:  7(f16vec4) Load 4674(texel)
+            4764:  7(f16vec4) FAdd 4763 4762
+                              Store 4674(texel) 4764
+            4765:         284 Load 286(s2DArray)
+            4766:  167(fvec3) Load 169(c3)
+            4767:   52(float) Load 4257(lodClamp)
+            4768:  7(f16vec4) ImageSampleImplicitLod 4765 4766 ConstOffset MinLod 722 4767
+            4769:  7(f16vec4) Load 4674(texel)
+            4770:  7(f16vec4) FAdd 4769 4768
+                              Store 4674(texel) 4770
+            4771:         284 Load 286(s2DArray)
+            4772:175(f16vec3) Load 177(f16c3)
+            4773:6(float16_t) Load 4264(f16lodClamp)
+            4774:6(float16_t) Load 137(f16bias)
+            4775:  7(f16vec4) ImageSampleImplicitLod 4771 4772 Bias ConstOffset MinLod 4774 722 4773
+            4776:  7(f16vec4) Load 4674(texel)
+            4777:  7(f16vec4) FAdd 4776 4775
+                              Store 4674(texel) 4777
+            4778:         316 Load 318(s1DArrayShadow)
+            4779:  167(fvec3) Load 169(c3)
+            4780:   52(float) Load 4257(lodClamp)
+            4781:   52(float) CompositeExtract 4779 2
+            4782:6(float16_t) ImageSampleDrefImplicitLod 4778 4779 4781 ConstOffset MinLod 709 4780
+            4783:    208(ptr) AccessChain 4674(texel) 207
+            4784:6(float16_t) Load 4783
+            4785:6(float16_t) FAdd 4784 4782
+            4786:    208(ptr) AccessChain 4674(texel) 207
+                              Store 4786 4785
+            4787:         316 Load 318(s1DArrayShadow)
+            4788:154(f16vec2) Load 156(f16c2)
+            4789:   52(float) Load 215(compare)
+            4790:6(float16_t) Load 4264(f16lodClamp)
+            4791:6(float16_t) Load 137(f16bias)
+            4792:6(float16_t) ImageSampleDrefImplicitLod 4787 4788 4789 Bias ConstOffset MinLod 4791 709 4790
+            4793:    208(ptr) AccessChain 4674(texel) 207
+            4794:6(float16_t) Load 4793
+            4795:6(float16_t) FAdd 4794 4792
+            4796:    208(ptr) AccessChain 4674(texel) 207
+                              Store 4796 4795
+            4797:         337 Load 339(s2DArrayShadow)
+            4798:  249(fvec4) Load 251(c4)
+            4799:   52(float) Load 4257(lodClamp)
+            4800:   52(float) CompositeExtract 4798 3
+            4801:6(float16_t) ImageSampleDrefImplicitLod 4797 4798 4800 ConstOffset MinLod 722 4799
+            4802:    208(ptr) AccessChain 4674(texel) 207
+            4803:6(float16_t) Load 4802
+            4804:6(float16_t) FAdd 4803 4801
+            4805:    208(ptr) AccessChain 4674(texel) 207
+                              Store 4805 4804
+            4806:         337 Load 339(s2DArrayShadow)
+            4807:175(f16vec3) Load 177(f16c3)
+            4808:   52(float) Load 215(compare)
+            4809:6(float16_t) Load 4264(f16lodClamp)
+            4810:6(float16_t) ImageSampleDrefImplicitLod 4806 4807 4808 ConstOffset MinLod 722 4809
+            4811:    208(ptr) AccessChain 4674(texel) 207
+            4812:6(float16_t) Load 4811
+            4813:6(float16_t) FAdd 4812 4810
+            4814:    208(ptr) AccessChain 4674(texel) 207
+                              Store 4814 4813
+            4815:  7(f16vec4) Load 4674(texel)
+                              ReturnValue 4815
+                              FunctionEnd
+107(testSparseTextureGradClamp():  7(f16vec4) Function None 8
+             108:             Label
+     4818(texel):     64(ptr) Variable Function
+                              Store 4818(texel) 121
+            4819:         143 Load 145(s2D)
+            4820:   53(fvec2) Load 148(c2)
+            4821:   53(fvec2) Load 1409(dPdxy2)
+            4822:   53(fvec2) Load 1409(dPdxy2)
+            4823:   52(float) Load 4257(lodClamp)
+            4824:3102(ResType) ImageSparseSampleExplicitLod 4819 4820 Grad MinLod 4821 4822 4823
+            4825:  7(f16vec4) CompositeExtract 4824 1
+                              Store 4818(texel) 4825
+            4826:     47(int) CompositeExtract 4824 0
+            4827:         143 Load 145(s2D)
+            4828:154(f16vec2) Load 156(f16c2)
+            4829:154(f16vec2) Load 1417(f16dPdxy2)
+            4830:154(f16vec2) Load 1417(f16dPdxy2)
+            4831:6(float16_t) Load 4264(f16lodClamp)
+            4832:3102(ResType) ImageSparseSampleExplicitLod 4827 4828 Grad MinLod 4829 4830 4831
+            4833:  7(f16vec4) CompositeExtract 4832 1
+                              Store 4818(texel) 4833
+            4834:     47(int) CompositeExtract 4832 0
+            4835:         163 Load 165(s3D)
+            4836:  167(fvec3) Load 169(c3)
+            4837:  167(fvec3) Load 1425(dPdxy3)
+            4838:  167(fvec3) Load 1425(dPdxy3)
+            4839:   52(float) Load 4257(lodClamp)
+            4840:3102(ResType) ImageSparseSampleExplicitLod 4835 4836 Grad MinLod 4837 4838 4839
+            4841:  7(f16vec4) CompositeExtract 4840 1
+                              Store 4818(texel) 4841
+            4842:     47(int) CompositeExtract 4840 0
+            4843:         163 Load 165(s3D)
+            4844:175(f16vec3) Load 177(f16c3)
+            4845:175(f16vec3) Load 1433(f16dPdxy3)
+            4846:175(f16vec3) Load 1433(f16dPdxy3)
+            4847:6(float16_t) Load 4264(f16lodClamp)
+            4848:3102(ResType) ImageSparseSampleExplicitLod 4843 4844 Grad MinLod 4845 4846 4847
+            4849:  7(f16vec4) CompositeExtract 4848 1
+                              Store 4818(texel) 4849
+            4850:     47(int) CompositeExtract 4848 0
+            4851:         184 Load 186(sCube)
+            4852:  167(fvec3) Load 169(c3)
+            4853:  167(fvec3) Load 1425(dPdxy3)
+            4854:  167(fvec3) Load 1425(dPdxy3)
+            4855:   52(float) Load 4257(lodClamp)
+            4856:3102(ResType) ImageSparseSampleExplicitLod 4851 4852 Grad MinLod 4853 4854 4855
+            4857:  7(f16vec4) CompositeExtract 4856 1
+                              Store 4818(texel) 4857
+            4858:     47(int) CompositeExtract 4856 0
+            4859:         184 Load 186(sCube)
+            4860:175(f16vec3) Load 177(f16c3)
+            4861:175(f16vec3) Load 1433(f16dPdxy3)
+            4862:175(f16vec3) Load 1433(f16dPdxy3)
+            4863:6(float16_t) Load 4264(f16lodClamp)
+            4864:3102(ResType) ImageSparseSampleExplicitLod 4859 4860 Grad MinLod 4861 4862 4863
+            4865:  7(f16vec4) CompositeExtract 4864 1
+                              Store 4818(texel) 4865
+            4866:     47(int) CompositeExtract 4864 0
+            4867:         224 Load 226(s2DShadow)
+            4868:  167(fvec3) Load 169(c3)
+            4869:   53(fvec2) Load 1409(dPdxy2)
+            4870:   53(fvec2) Load 1409(dPdxy2)
+            4871:   52(float) Load 4257(lodClamp)
+            4872:    208(ptr) AccessChain 4818(texel) 207
+            4873:   52(float) CompositeExtract 4868 2
+            4874:3138(ResType) ImageSparseSampleDrefExplicitLod 4867 4868 4873 Grad MinLod 4869 4870 4871
+            4875:6(float16_t) CompositeExtract 4874 1
+                              Store 4872 4875
+            4876:     47(int) CompositeExtract 4874 0
+            4877:         224 Load 226(s2DShadow)
+            4878:154(f16vec2) Load 156(f16c2)
+            4879:   52(float) Load 215(compare)
+            4880:154(f16vec2) Load 1417(f16dPdxy2)
+            4881:154(f16vec2) Load 1417(f16dPdxy2)
+            4882:6(float16_t) Load 4264(f16lodClamp)
+            4883:    208(ptr) AccessChain 4818(texel) 207
+            4884:3138(ResType) ImageSparseSampleDrefExplicitLod 4877 4878 4879 Grad MinLod 4880 4881 4882
+            4885:6(float16_t) CompositeExtract 4884 1
+                              Store 4883 4885
+            4886:     47(int) CompositeExtract 4884 0
+            4887:         245 Load 247(sCubeShadow)
+            4888:  249(fvec4) Load 251(c4)
+            4889:  167(fvec3) Load 1425(dPdxy3)
+            4890:  167(fvec3) Load 1425(dPdxy3)
+            4891:   52(float) Load 4257(lodClamp)
+            4892:    208(ptr) AccessChain 4818(texel) 207
+            4893:   52(float) CompositeExtract 4888 3
+            4894:3138(ResType) ImageSparseSampleDrefExplicitLod 4887 4888 4893 Grad MinLod 4889 4890 4891
+            4895:6(float16_t) CompositeExtract 4894 1
+                              Store 4892 4895
+            4896:     47(int) CompositeExtract 4894 0
+            4897:         245 Load 247(sCubeShadow)
+            4898:175(f16vec3) Load 177(f16c3)
+            4899:   52(float) Load 215(compare)
+            4900:175(f16vec3) Load 1433(f16dPdxy3)
+            4901:175(f16vec3) Load 1433(f16dPdxy3)
+            4902:6(float16_t) Load 4264(f16lodClamp)
+            4903:    208(ptr) AccessChain 4818(texel) 207
+            4904:3138(ResType) ImageSparseSampleDrefExplicitLod 4897 4898 4899 Grad MinLod 4900 4901 4902
+            4905:6(float16_t) CompositeExtract 4904 1
+                              Store 4903 4905
+            4906:     47(int) CompositeExtract 4904 0
+            4907:         284 Load 286(s2DArray)
+            4908:  167(fvec3) Load 169(c3)
+            4909:   53(fvec2) Load 1409(dPdxy2)
+            4910:   53(fvec2) Load 1409(dPdxy2)
+            4911:   52(float) Load 4257(lodClamp)
+            4912:3102(ResType) ImageSparseSampleExplicitLod 4907 4908 Grad MinLod 4909 4910 4911
+            4913:  7(f16vec4) CompositeExtract 4912 1
+                              Store 4818(texel) 4913
+            4914:     47(int) CompositeExtract 4912 0
+            4915:         284 Load 286(s2DArray)
+            4916:175(f16vec3) Load 177(f16c3)
+            4917:154(f16vec2) Load 1417(f16dPdxy2)
+            4918:154(f16vec2) Load 1417(f16dPdxy2)
+            4919:6(float16_t) Load 4264(f16lodClamp)
+            4920:3102(ResType) ImageSparseSampleExplicitLod 4915 4916 Grad MinLod 4917 4918 4919
+            4921:  7(f16vec4) CompositeExtract 4920 1
+                              Store 4818(texel) 4921
+            4922:     47(int) CompositeExtract 4920 0
+            4923:         337 Load 339(s2DArrayShadow)
+            4924:  249(fvec4) Load 251(c4)
+            4925:   53(fvec2) Load 1409(dPdxy2)
+            4926:   53(fvec2) Load 1409(dPdxy2)
+            4927:   52(float) Load 4257(lodClamp)
+            4928:    208(ptr) AccessChain 4818(texel) 207
+            4929:   52(float) CompositeExtract 4924 3
+            4930:3138(ResType) ImageSparseSampleDrefExplicitLod 4923 4924 4929 Grad MinLod 4925 4926 4927
+            4931:6(float16_t) CompositeExtract 4930 1
+                              Store 4928 4931
+            4932:     47(int) CompositeExtract 4930 0
+            4933:         337 Load 339(s2DArrayShadow)
+            4934:175(f16vec3) Load 177(f16c3)
+            4935:   52(float) Load 215(compare)
+            4936:154(f16vec2) Load 1417(f16dPdxy2)
+            4937:154(f16vec2) Load 1417(f16dPdxy2)
+            4938:6(float16_t) Load 4264(f16lodClamp)
+            4939:    208(ptr) AccessChain 4818(texel) 207
+            4940:3138(ResType) ImageSparseSampleDrefExplicitLod 4933 4934 4935 Grad MinLod 4936 4937 4938
+            4941:6(float16_t) CompositeExtract 4940 1
+                              Store 4939 4941
+            4942:     47(int) CompositeExtract 4940 0
+            4943:         299 Load 301(sCubeArray)
+            4944:  249(fvec4) Load 251(c4)
+            4945:  167(fvec3) Load 1425(dPdxy3)
+            4946:  167(fvec3) Load 1425(dPdxy3)
+            4947:   52(float) Load 4257(lodClamp)
+            4948:3102(ResType) ImageSparseSampleExplicitLod 4943 4944 Grad MinLod 4945 4946 4947
+            4949:  7(f16vec4) CompositeExtract 4948 1
+                              Store 4818(texel) 4949
+            4950:     47(int) CompositeExtract 4948 0
+            4951:         299 Load 301(sCubeArray)
+            4952:  7(f16vec4) Load 309(f16c4)
+            4953:175(f16vec3) Load 1433(f16dPdxy3)
+            4954:175(f16vec3) Load 1433(f16dPdxy3)
+            4955:6(float16_t) Load 4264(f16lodClamp)
+            4956:3102(ResType) ImageSparseSampleExplicitLod 4951 4952 Grad MinLod 4953 4954 4955
+            4957:  7(f16vec4) CompositeExtract 4956 1
+                              Store 4818(texel) 4957
+            4958:     47(int) CompositeExtract 4956 0
+            4959:  7(f16vec4) Load 4818(texel)
+                              ReturnValue 4959
+                              FunctionEnd
+109(testTextureGradClamp():  7(f16vec4) Function None 8
+             110:             Label
+     4962(texel):     64(ptr) Variable Function
+                              Store 4962(texel) 121
+            4963:         123 Load 125(s1D)
+            4964:   52(float) Load 128(c1)
+            4965:   52(float) Load 1393(dPdxy1)
+            4966:   52(float) Load 1393(dPdxy1)
+            4967:   52(float) Load 4257(lodClamp)
+            4968:  7(f16vec4) ImageSampleExplicitLod 4963 4964 Grad MinLod 4965 4966 4967
+            4969:  7(f16vec4) Load 4962(texel)
+            4970:  7(f16vec4) FAdd 4969 4968
+                              Store 4962(texel) 4970
+            4971:         123 Load 125(s1D)
+            4972:6(float16_t) Load 135(f16c1)
+            4973:6(float16_t) Load 1401(f16dPdxy1)
+            4974:6(float16_t) Load 1401(f16dPdxy1)
+            4975:6(float16_t) Load 4264(f16lodClamp)
+            4976:  7(f16vec4) ImageSampleExplicitLod 4971 4972 Grad MinLod 4973 4974 4975
+            4977:  7(f16vec4) Load 4962(texel)
+            4978:  7(f16vec4) FAdd 4977 4976
+                              Store 4962(texel) 4978
+            4979:         143 Load 145(s2D)
+            4980:   53(fvec2) Load 148(c2)
+            4981:   53(fvec2) Load 1409(dPdxy2)
+            4982:   53(fvec2) Load 1409(dPdxy2)
+            4983:   52(float) Load 4257(lodClamp)
+            4984:  7(f16vec4) ImageSampleExplicitLod 4979 4980 Grad MinLod 4981 4982 4983
+            4985:  7(f16vec4) Load 4962(texel)
+            4986:  7(f16vec4) FAdd 4985 4984
+                              Store 4962(texel) 4986
+            4987:         143 Load 145(s2D)
+            4988:154(f16vec2) Load 156(f16c2)
+            4989:154(f16vec2) Load 1417(f16dPdxy2)
+            4990:154(f16vec2) Load 1417(f16dPdxy2)
+            4991:6(float16_t) Load 4264(f16lodClamp)
+            4992:  7(f16vec4) ImageSampleExplicitLod 4987 4988 Grad MinLod 4989 4990 4991
+            4993:  7(f16vec4) Load 4962(texel)
+            4994:  7(f16vec4) FAdd 4993 4992
+                              Store 4962(texel) 4994
+            4995:         163 Load 165(s3D)
+            4996:  167(fvec3) Load 169(c3)
+            4997:  167(fvec3) Load 1425(dPdxy3)
+            4998:  167(fvec3) Load 1425(dPdxy3)
+            4999:   52(float) Load 4257(lodClamp)
+            5000:  7(f16vec4) ImageSampleExplicitLod 4995 4996 Grad MinLod 4997 4998 4999
+            5001:  7(f16vec4) Load 4962(texel)
+            5002:  7(f16vec4) FAdd 5001 5000
+                              Store 4962(texel) 5002
+            5003:         163 Load 165(s3D)
+            5004:175(f16vec3) Load 177(f16c3)
+            5005:175(f16vec3) Load 1433(f16dPdxy3)
+            5006:175(f16vec3) Load 1433(f16dPdxy3)
+            5007:6(float16_t) Load 4264(f16lodClamp)
+            5008:  7(f16vec4) ImageSampleExplicitLod 5003 5004 Grad MinLod 5005 5006 5007
+            5009:  7(f16vec4) Load 4962(texel)
+            5010:  7(f16vec4) FAdd 5009 5008
+                              Store 4962(texel) 5010
+            5011:         184 Load 186(sCube)
+            5012:  167(fvec3) Load 169(c3)
+            5013:  167(fvec3) Load 1425(dPdxy3)
+            5014:  167(fvec3) Load 1425(dPdxy3)
+            5015:   52(float) Load 4257(lodClamp)
+            5016:  7(f16vec4) ImageSampleExplicitLod 5011 5012 Grad MinLod 5013 5014 5015
+            5017:  7(f16vec4) Load 4962(texel)
+            5018:  7(f16vec4) FAdd 5017 5016
+                              Store 4962(texel) 5018
+            5019:         184 Load 186(sCube)
+            5020:175(f16vec3) Load 177(f16c3)
+            5021:175(f16vec3) Load 1433(f16dPdxy3)
+            5022:175(f16vec3) Load 1433(f16dPdxy3)
+            5023:6(float16_t) Load 4264(f16lodClamp)
+            5024:  7(f16vec4) ImageSampleExplicitLod 5019 5020 Grad MinLod 5021 5022 5023
+            5025:  7(f16vec4) Load 4962(texel)
+            5026:  7(f16vec4) FAdd 5025 5024
+                              Store 4962(texel) 5026
+            5027:         199 Load 201(s1DShadow)
+            5028:  167(fvec3) Load 169(c3)
+            5029:   52(float) Load 1393(dPdxy1)
+            5030:   52(float) Load 1393(dPdxy1)
+            5031:   52(float) Load 4257(lodClamp)
+            5032:   52(float) CompositeExtract 5028 2
+            5033:6(float16_t) ImageSampleDrefExplicitLod 5027 5028 5032 Grad MinLod 5029 5030 5031
+            5034:    208(ptr) AccessChain 4962(texel) 207
+            5035:6(float16_t) Load 5034
+            5036:6(float16_t) FAdd 5035 5033
+            5037:    208(ptr) AccessChain 4962(texel) 207
+                              Store 5037 5036
+            5038:         199 Load 201(s1DShadow)
+            5039:154(f16vec2) Load 156(f16c2)
+            5040:   52(float) Load 215(compare)
+            5041:6(float16_t) Load 1401(f16dPdxy1)
+            5042:6(float16_t) Load 1401(f16dPdxy1)
+            5043:6(float16_t) Load 4264(f16lodClamp)
+            5044:6(float16_t) ImageSampleDrefExplicitLod 5038 5039 5040 Grad MinLod 5041 5042 5043
+            5045:    208(ptr) AccessChain 4962(texel) 207
+            5046:6(float16_t) Load 5045
+            5047:6(float16_t) FAdd 5046 5044
+            5048:    208(ptr) AccessChain 4962(texel) 207
+                              Store 5048 5047
+            5049:         224 Load 226(s2DShadow)
+            5050:  167(fvec3) Load 169(c3)
+            5051:   53(fvec2) Load 1409(dPdxy2)
+            5052:   53(fvec2) Load 1409(dPdxy2)
+            5053:   52(float) Load 4257(lodClamp)
+            5054:   52(float) CompositeExtract 5050 2
+            5055:6(float16_t) ImageSampleDrefExplicitLod 5049 5050 5054 Grad MinLod 5051 5052 5053
+            5056:    208(ptr) AccessChain 4962(texel) 207
+            5057:6(float16_t) Load 5056
+            5058:6(float16_t) FAdd 5057 5055
+            5059:    208(ptr) AccessChain 4962(texel) 207
+                              Store 5059 5058
+            5060:         224 Load 226(s2DShadow)
+            5061:154(f16vec2) Load 156(f16c2)
+            5062:   52(float) Load 215(compare)
+            5063:154(f16vec2) Load 1417(f16dPdxy2)
+            5064:154(f16vec2) Load 1417(f16dPdxy2)
+            5065:6(float16_t) Load 4264(f16lodClamp)
+            5066:6(float16_t) ImageSampleDrefExplicitLod 5060 5061 5062 Grad MinLod 5063 5064 5065
+            5067:    208(ptr) AccessChain 4962(texel) 207
+            5068:6(float16_t) Load 5067
+            5069:6(float16_t) FAdd 5068 5066
+            5070:    208(ptr) AccessChain 4962(texel) 207
+                              Store 5070 5069
+            5071:         245 Load 247(sCubeShadow)
+            5072:  249(fvec4) Load 251(c4)
+            5073:  167(fvec3) Load 1425(dPdxy3)
+            5074:  167(fvec3) Load 1425(dPdxy3)
+            5075:   52(float) Load 4257(lodClamp)
+            5076:   52(float) CompositeExtract 5072 3
+            5077:6(float16_t) ImageSampleDrefExplicitLod 5071 5072 5076 Grad MinLod 5073 5074 5075
+            5078:    208(ptr) AccessChain 4962(texel) 207
+            5079:6(float16_t) Load 5078
+            5080:6(float16_t) FAdd 5079 5077
+            5081:    208(ptr) AccessChain 4962(texel) 207
+                              Store 5081 5080
+            5082:         245 Load 247(sCubeShadow)
+            5083:175(f16vec3) Load 177(f16c3)
+            5084:   52(float) Load 215(compare)
+            5085:175(f16vec3) Load 1433(f16dPdxy3)
+            5086:175(f16vec3) Load 1433(f16dPdxy3)
+            5087:6(float16_t) Load 4264(f16lodClamp)
+            5088:6(float16_t) ImageSampleDrefExplicitLod 5082 5083 5084 Grad MinLod 5085 5086 5087
+            5089:    208(ptr) AccessChain 4962(texel) 207
+            5090:6(float16_t) Load 5089
+            5091:6(float16_t) FAdd 5090 5088
+            5092:    208(ptr) AccessChain 4962(texel) 207
+                              Store 5092 5091
+            5093:         269 Load 271(s1DArray)
+            5094:   53(fvec2) Load 148(c2)
+            5095:   52(float) Load 1393(dPdxy1)
+            5096:   52(float) Load 1393(dPdxy1)
+            5097:   52(float) Load 4257(lodClamp)
+            5098:  7(f16vec4) ImageSampleExplicitLod 5093 5094 Grad MinLod 5095 5096 5097
+            5099:  7(f16vec4) Load 4962(texel)
+            5100:  7(f16vec4) FAdd 5099 5098
+                              Store 4962(texel) 5100
+            5101:         269 Load 271(s1DArray)
+            5102:154(f16vec2) Load 156(f16c2)
+            5103:6(float16_t) Load 1401(f16dPdxy1)
+            5104:6(float16_t) Load 1401(f16dPdxy1)
+            5105:6(float16_t) Load 4264(f16lodClamp)
+            5106:  7(f16vec4) ImageSampleExplicitLod 5101 5102 Grad MinLod 5103 5104 5105
+            5107:  7(f16vec4) Load 4962(texel)
+            5108:  7(f16vec4) FAdd 5107 5106
+                              Store 4962(texel) 5108
+            5109:         284 Load 286(s2DArray)
+            5110:  167(fvec3) Load 169(c3)
+            5111:   53(fvec2) Load 1409(dPdxy2)
+            5112:   53(fvec2) Load 1409(dPdxy2)
+            5113:   52(float) Load 4257(lodClamp)
+            5114:  7(f16vec4) ImageSampleExplicitLod 5109 5110 Grad MinLod 5111 5112 5113
+            5115:  7(f16vec4) Load 4962(texel)
+            5116:  7(f16vec4) FAdd 5115 5114
+                              Store 4962(texel) 5116
+            5117:         284 Load 286(s2DArray)
+            5118:175(f16vec3) Load 177(f16c3)
+            5119:154(f16vec2) Load 1417(f16dPdxy2)
+            5120:154(f16vec2) Load 1417(f16dPdxy2)
+            5121:6(float16_t) Load 4264(f16lodClamp)
+            5122:  7(f16vec4) ImageSampleExplicitLod 5117 5118 Grad MinLod 5119 5120 5121
+            5123:  7(f16vec4) Load 4962(texel)
+            5124:  7(f16vec4) FAdd 5123 5122
+                              Store 4962(texel) 5124
+            5125:         316 Load 318(s1DArrayShadow)
+            5126:  167(fvec3) Load 169(c3)
+            5127:   52(float) Load 1393(dPdxy1)
+            5128:   52(float) Load 1393(dPdxy1)
+            5129:   52(float) Load 4257(lodClamp)
+            5130:   52(float) CompositeExtract 5126 2
+            5131:6(float16_t) ImageSampleDrefExplicitLod 5125 5126 5130 Grad MinLod 5127 5128 5129
+            5132:    208(ptr) AccessChain 4962(texel) 207
+            5133:6(float16_t) Load 5132
+            5134:6(float16_t) FAdd 5133 5131
+            5135:    208(ptr) AccessChain 4962(texel) 207
+                              Store 5135 5134
+            5136:         316 Load 318(s1DArrayShadow)
+            5137:154(f16vec2) Load 156(f16c2)
+            5138:   52(float) Load 215(compare)
+            5139:6(float16_t) Load 1401(f16dPdxy1)
+            5140:6(float16_t) Load 1401(f16dPdxy1)
+            5141:6(float16_t) Load 4264(f16lodClamp)
+            5142:6(float16_t) ImageSampleDrefExplicitLod 5136 5137 5138 Grad MinLod 5139 5140 5141
+            5143:    208(ptr) AccessChain 4962(texel) 207
+            5144:6(float16_t) Load 5143
+            5145:6(float16_t) FAdd 5144 5142
+            5146:    208(ptr) AccessChain 4962(texel) 207
+                              Store 5146 5145
+            5147:         337 Load 339(s2DArrayShadow)
+            5148:  249(fvec4) Load 251(c4)
+            5149:   53(fvec2) Load 1409(dPdxy2)
+            5150:   53(fvec2) Load 1409(dPdxy2)
+            5151:   52(float) Load 4257(lodClamp)
+            5152:   52(float) CompositeExtract 5148 3
+            5153:6(float16_t) ImageSampleDrefExplicitLod 5147 5148 5152 Grad MinLod 5149 5150 5151
+            5154:    208(ptr) AccessChain 4962(texel) 207
+            5155:6(float16_t) Load 5154
+            5156:6(float16_t) FAdd 5155 5153
+            5157:    208(ptr) AccessChain 4962(texel) 207
+                              Store 5157 5156
+            5158:         337 Load 339(s2DArrayShadow)
+            5159:175(f16vec3) Load 177(f16c3)
+            5160:   52(float) Load 215(compare)
+            5161:154(f16vec2) Load 1417(f16dPdxy2)
+            5162:154(f16vec2) Load 1417(f16dPdxy2)
+            5163:6(float16_t) Load 4264(f16lodClamp)
+            5164:6(float16_t) ImageSampleDrefExplicitLod 5158 5159 5160 Grad MinLod 5161 5162 5163
+            5165:    208(ptr) AccessChain 4962(texel) 207
+            5166:6(float16_t) Load 5165
+            5167:6(float16_t) FAdd 5166 5164
+            5168:    208(ptr) AccessChain 4962(texel) 207
+                              Store 5168 5167
+            5169:         299 Load 301(sCubeArray)
+            5170:  249(fvec4) Load 251(c4)
+            5171:  167(fvec3) Load 1425(dPdxy3)
+            5172:  167(fvec3) Load 1425(dPdxy3)
+            5173:   52(float) Load 4257(lodClamp)
+            5174:  7(f16vec4) ImageSampleExplicitLod 5169 5170 Grad MinLod 5171 5172 5173
+            5175:  7(f16vec4) Load 4962(texel)
+            5176:  7(f16vec4) FAdd 5175 5174
+                              Store 4962(texel) 5176
+            5177:         299 Load 301(sCubeArray)
+            5178:  7(f16vec4) Load 309(f16c4)
+            5179:175(f16vec3) Load 1433(f16dPdxy3)
+            5180:175(f16vec3) Load 1433(f16dPdxy3)
+            5181:6(float16_t) Load 4264(f16lodClamp)
+            5182:  7(f16vec4) ImageSampleExplicitLod 5177 5178 Grad MinLod 5179 5180 5181
+            5183:  7(f16vec4) Load 4962(texel)
+            5184:  7(f16vec4) FAdd 5183 5182
+                              Store 4962(texel) 5184
+            5185:  7(f16vec4) Load 4962(texel)
+                              ReturnValue 5185
+                              FunctionEnd
+111(testSparseTextureGradOffsetClamp():  7(f16vec4) Function None 8
+             112:             Label
+     5188(texel):     64(ptr) Variable Function
+                              Store 5188(texel) 121
+            5189:         143 Load 145(s2D)
+            5190:   53(fvec2) Load 148(c2)
+            5191:   53(fvec2) Load 1409(dPdxy2)
+            5192:   53(fvec2) Load 1409(dPdxy2)
+            5193:   52(float) Load 4257(lodClamp)
+            5194:3102(ResType) ImageSparseSampleExplicitLod 5189 5190 Grad ConstOffset MinLod 5191 5192 722 5193
+            5195:  7(f16vec4) CompositeExtract 5194 1
+                              Store 5188(texel) 5195
+            5196:     47(int) CompositeExtract 5194 0
+            5197:         143 Load 145(s2D)
+            5198:154(f16vec2) Load 156(f16c2)
+            5199:154(f16vec2) Load 1417(f16dPdxy2)
+            5200:154(f16vec2) Load 1417(f16dPdxy2)
+            5201:6(float16_t) Load 4264(f16lodClamp)
+            5202:3102(ResType) ImageSparseSampleExplicitLod 5197 5198 Grad ConstOffset MinLod 5199 5200 722 5201
+            5203:  7(f16vec4) CompositeExtract 5202 1
+                              Store 5188(texel) 5203
+            5204:     47(int) CompositeExtract 5202 0
+            5205:         163 Load 165(s3D)
+            5206:  167(fvec3) Load 169(c3)
+            5207:  167(fvec3) Load 1425(dPdxy3)
+            5208:  167(fvec3) Load 1425(dPdxy3)
+            5209:   52(float) Load 4257(lodClamp)
+            5210:3102(ResType) ImageSparseSampleExplicitLod 5205 5206 Grad ConstOffset MinLod 5207 5208 735 5209
+            5211:  7(f16vec4) CompositeExtract 5210 1
+                              Store 5188(texel) 5211
+            5212:     47(int) CompositeExtract 5210 0
+            5213:         163 Load 165(s3D)
+            5214:175(f16vec3) Load 177(f16c3)
+            5215:175(f16vec3) Load 1433(f16dPdxy3)
+            5216:175(f16vec3) Load 1433(f16dPdxy3)
+            5217:6(float16_t) Load 4264(f16lodClamp)
+            5218:3102(ResType) ImageSparseSampleExplicitLod 5213 5214 Grad ConstOffset MinLod 5215 5216 735 5217
+            5219:  7(f16vec4) CompositeExtract 5218 1
+                              Store 5188(texel) 5219
+            5220:     47(int) CompositeExtract 5218 0
+            5221:         224 Load 226(s2DShadow)
+            5222:  167(fvec3) Load 169(c3)
+            5223:   53(fvec2) Load 1409(dPdxy2)
+            5224:   53(fvec2) Load 1409(dPdxy2)
+            5225:   52(float) Load 4257(lodClamp)
+            5226:    208(ptr) AccessChain 5188(texel) 207
+            5227:   52(float) CompositeExtract 5222 2
+            5228:3138(ResType) ImageSparseSampleDrefExplicitLod 5221 5222 5227 Grad ConstOffset MinLod 5223 5224 722 5225
+            5229:6(float16_t) CompositeExtract 5228 1
+                              Store 5226 5229
+            5230:     47(int) CompositeExtract 5228 0
+            5231:         224 Load 226(s2DShadow)
+            5232:154(f16vec2) Load 156(f16c2)
+            5233:   52(float) Load 215(compare)
+            5234:154(f16vec2) Load 1417(f16dPdxy2)
+            5235:154(f16vec2) Load 1417(f16dPdxy2)
+            5236:6(float16_t) Load 4264(f16lodClamp)
+            5237:    208(ptr) AccessChain 5188(texel) 207
+            5238:3138(ResType) ImageSparseSampleDrefExplicitLod 5231 5232 5233 Grad ConstOffset MinLod 5234 5235 722 5236
+            5239:6(float16_t) CompositeExtract 5238 1
+                              Store 5237 5239
+            5240:     47(int) CompositeExtract 5238 0
+            5241:         284 Load 286(s2DArray)
+            5242:  167(fvec3) Load 169(c3)
+            5243:   53(fvec2) Load 1409(dPdxy2)
+            5244:   53(fvec2) Load 1409(dPdxy2)
+            5245:   52(float) Load 4257(lodClamp)
+            5246:3102(ResType) ImageSparseSampleExplicitLod 5241 5242 Grad ConstOffset MinLod 5243 5244 722 5245
+            5247:  7(f16vec4) CompositeExtract 5246 1
+                              Store 5188(texel) 5247
+            5248:     47(int) CompositeExtract 5246 0
+            5249:         284 Load 286(s2DArray)
+            5250:175(f16vec3) Load 177(f16c3)
+            5251:154(f16vec2) Load 1417(f16dPdxy2)
+            5252:154(f16vec2) Load 1417(f16dPdxy2)
+            5253:6(float16_t) Load 4264(f16lodClamp)
+            5254:3102(ResType) ImageSparseSampleExplicitLod 5249 5250 Grad ConstOffset MinLod 5251 5252 722 5253
+            5255:  7(f16vec4) CompositeExtract 5254 1
+                              Store 5188(texel) 5255
+            5256:     47(int) CompositeExtract 5254 0
+            5257:         337 Load 339(s2DArrayShadow)
+            5258:  249(fvec4) Load 251(c4)
+            5259:   53(fvec2) Load 1409(dPdxy2)
+            5260:   53(fvec2) Load 1409(dPdxy2)
+            5261:   52(float) Load 4257(lodClamp)
+            5262:    208(ptr) AccessChain 5188(texel) 207
+            5263:   52(float) CompositeExtract 5258 3
+            5264:3138(ResType) ImageSparseSampleDrefExplicitLod 5257 5258 5263 Grad ConstOffset MinLod 5259 5260 722 5261
+            5265:6(float16_t) CompositeExtract 5264 1
+                              Store 5262 5265
+            5266:     47(int) CompositeExtract 5264 0
+            5267:         337 Load 339(s2DArrayShadow)
+            5268:175(f16vec3) Load 177(f16c3)
+            5269:   52(float) Load 215(compare)
+            5270:154(f16vec2) Load 1417(f16dPdxy2)
+            5271:154(f16vec2) Load 1417(f16dPdxy2)
+            5272:6(float16_t) Load 4264(f16lodClamp)
+            5273:    208(ptr) AccessChain 5188(texel) 207
+            5274:3138(ResType) ImageSparseSampleDrefExplicitLod 5267 5268 5269 Grad ConstOffset MinLod 5270 5271 722 5272
+            5275:6(float16_t) CompositeExtract 5274 1
+                              Store 5273 5275
+            5276:     47(int) CompositeExtract 5274 0
+            5277:  7(f16vec4) Load 5188(texel)
+                              ReturnValue 5277
+                              FunctionEnd
+113(testTextureGradOffsetClamp():  7(f16vec4) Function None 8
+             114:             Label
+     5280(texel):     64(ptr) Variable Function
+                              Store 5280(texel) 121
+            5281:         123 Load 125(s1D)
+            5282:   52(float) Load 128(c1)
+            5283:   52(float) Load 1393(dPdxy1)
+            5284:   52(float) Load 1393(dPdxy1)
+            5285:   52(float) Load 4257(lodClamp)
+            5286:  7(f16vec4) ImageSampleExplicitLod 5281 5282 Grad ConstOffset MinLod 5283 5284 709 5285
+            5287:  7(f16vec4) Load 5280(texel)
+            5288:  7(f16vec4) FAdd 5287 5286
+                              Store 5280(texel) 5288
+            5289:         123 Load 125(s1D)
+            5290:6(float16_t) Load 135(f16c1)
+            5291:6(float16_t) Load 1401(f16dPdxy1)
+            5292:6(float16_t) Load 1401(f16dPdxy1)
+            5293:6(float16_t) Load 4264(f16lodClamp)
+            5294:  7(f16vec4) ImageSampleExplicitLod 5289 5290 Grad ConstOffset MinLod 5291 5292 709 5293
+            5295:  7(f16vec4) Load 5280(texel)
+            5296:  7(f16vec4) FAdd 5295 5294
+                              Store 5280(texel) 5296
+            5297:         143 Load 145(s2D)
+            5298:   53(fvec2) Load 148(c2)
+            5299:   53(fvec2) Load 1409(dPdxy2)
+            5300:   53(fvec2) Load 1409(dPdxy2)
+            5301:   52(float) Load 4257(lodClamp)
+            5302:  7(f16vec4) ImageSampleExplicitLod 5297 5298 Grad ConstOffset MinLod 5299 5300 722 5301
+            5303:  7(f16vec4) Load 5280(texel)
+            5304:  7(f16vec4) FAdd 5303 5302
+                              Store 5280(texel) 5304
+            5305:         143 Load 145(s2D)
+            5306:154(f16vec2) Load 156(f16c2)
+            5307:154(f16vec2) Load 1417(f16dPdxy2)
+            5308:154(f16vec2) Load 1417(f16dPdxy2)
+            5309:6(float16_t) Load 4264(f16lodClamp)
+            5310:  7(f16vec4) ImageSampleExplicitLod 5305 5306 Grad ConstOffset MinLod 5307 5308 722 5309
+            5311:  7(f16vec4) Load 5280(texel)
+            5312:  7(f16vec4) FAdd 5311 5310
+                              Store 5280(texel) 5312
+            5313:         163 Load 165(s3D)
+            5314:  167(fvec3) Load 169(c3)
+            5315:  167(fvec3) Load 1425(dPdxy3)
+            5316:  167(fvec3) Load 1425(dPdxy3)
+            5317:   52(float) Load 4257(lodClamp)
+            5318:  7(f16vec4) ImageSampleExplicitLod 5313 5314 Grad ConstOffset MinLod 5315 5316 735 5317
+            5319:  7(f16vec4) Load 5280(texel)
+            5320:  7(f16vec4) FAdd 5319 5318
+                              Store 5280(texel) 5320
+            5321:         163 Load 165(s3D)
+            5322:175(f16vec3) Load 177(f16c3)
+            5323:175(f16vec3) Load 1433(f16dPdxy3)
+            5324:175(f16vec3) Load 1433(f16dPdxy3)
+            5325:6(float16_t) Load 4264(f16lodClamp)
+            5326:  7(f16vec4) ImageSampleExplicitLod 5321 5322 Grad ConstOffset MinLod 5323 5324 735 5325
+            5327:  7(f16vec4) Load 5280(texel)
+            5328:  7(f16vec4) FAdd 5327 5326
+                              Store 5280(texel) 5328
+            5329:         199 Load 201(s1DShadow)
+            5330:  167(fvec3) Load 169(c3)
+            5331:   52(float) Load 1393(dPdxy1)
+            5332:   52(float) Load 1393(dPdxy1)
+            5333:   52(float) Load 4257(lodClamp)
+            5334:   52(float) CompositeExtract 5330 2
+            5335:6(float16_t) ImageSampleDrefExplicitLod 5329 5330 5334 Grad ConstOffset MinLod 5331 5332 709 5333
+            5336:    208(ptr) AccessChain 5280(texel) 207
+            5337:6(float16_t) Load 5336
+            5338:6(float16_t) FAdd 5337 5335
+            5339:    208(ptr) AccessChain 5280(texel) 207
+                              Store 5339 5338
+            5340:         199 Load 201(s1DShadow)
+            5341:154(f16vec2) Load 156(f16c2)
+            5342:   52(float) Load 215(compare)
+            5343:6(float16_t) Load 1401(f16dPdxy1)
+            5344:6(float16_t) Load 1401(f16dPdxy1)
+            5345:6(float16_t) Load 4264(f16lodClamp)
+            5346:6(float16_t) ImageSampleDrefExplicitLod 5340 5341 5342 Grad ConstOffset MinLod 5343 5344 709 5345
+            5347:    208(ptr) AccessChain 5280(texel) 207
+            5348:6(float16_t) Load 5347
+            5349:6(float16_t) FAdd 5348 5346
+            5350:    208(ptr) AccessChain 5280(texel) 207
+                              Store 5350 5349
+            5351:         224 Load 226(s2DShadow)
+            5352:  167(fvec3) Load 169(c3)
+            5353:   53(fvec2) Load 1409(dPdxy2)
+            5354:   53(fvec2) Load 1409(dPdxy2)
+            5355:   52(float) Load 4257(lodClamp)
+            5356:   52(float) CompositeExtract 5352 2
+            5357:6(float16_t) ImageSampleDrefExplicitLod 5351 5352 5356 Grad ConstOffset MinLod 5353 5354 722 5355
+            5358:    208(ptr) AccessChain 5280(texel) 207
+            5359:6(float16_t) Load 5358
+            5360:6(float16_t) FAdd 5359 5357
+            5361:    208(ptr) AccessChain 5280(texel) 207
+                              Store 5361 5360
+            5362:         224 Load 226(s2DShadow)
+            5363:154(f16vec2) Load 156(f16c2)
+            5364:   52(float) Load 215(compare)
+            5365:154(f16vec2) Load 1417(f16dPdxy2)
+            5366:154(f16vec2) Load 1417(f16dPdxy2)
+            5367:6(float16_t) Load 4264(f16lodClamp)
+            5368:6(float16_t) ImageSampleDrefExplicitLod 5362 5363 5364 Grad ConstOffset MinLod 5365 5366 722 5367
+            5369:    208(ptr) AccessChain 5280(texel) 207
+            5370:6(float16_t) Load 5369
+            5371:6(float16_t) FAdd 5370 5368
+            5372:    208(ptr) AccessChain 5280(texel) 207
+                              Store 5372 5371
+            5373:         269 Load 271(s1DArray)
+            5374:   53(fvec2) Load 148(c2)
+            5375:   52(float) Load 1393(dPdxy1)
+            5376:   52(float) Load 1393(dPdxy1)
+            5377:   52(float) Load 4257(lodClamp)
+            5378:  7(f16vec4) ImageSampleExplicitLod 5373 5374 Grad ConstOffset MinLod 5375 5376 709 5377
+            5379:  7(f16vec4) Load 5280(texel)
+            5380:  7(f16vec4) FAdd 5379 5378
+                              Store 5280(texel) 5380
+            5381:         269 Load 271(s1DArray)
+            5382:154(f16vec2) Load 156(f16c2)
+            5383:6(float16_t) Load 1401(f16dPdxy1)
+            5384:6(float16_t) Load 1401(f16dPdxy1)
+            5385:6(float16_t) Load 4264(f16lodClamp)
+            5386:  7(f16vec4) ImageSampleExplicitLod 5381 5382 Grad ConstOffset MinLod 5383 5384 709 5385
+            5387:  7(f16vec4) Load 5280(texel)
+            5388:  7(f16vec4) FAdd 5387 5386
+                              Store 5280(texel) 5388
+            5389:         284 Load 286(s2DArray)
+            5390:  167(fvec3) Load 169(c3)
+            5391:   53(fvec2) Load 1409(dPdxy2)
+            5392:   53(fvec2) Load 1409(dPdxy2)
+            5393:   52(float) Load 4257(lodClamp)
+            5394:  7(f16vec4) ImageSampleExplicitLod 5389 5390 Grad ConstOffset MinLod 5391 5392 722 5393
+            5395:  7(f16vec4) Load 5280(texel)
+            5396:  7(f16vec4) FAdd 5395 5394
+                              Store 5280(texel) 5396
+            5397:         284 Load 286(s2DArray)
+            5398:175(f16vec3) Load 177(f16c3)
+            5399:154(f16vec2) Load 1417(f16dPdxy2)
+            5400:154(f16vec2) Load 1417(f16dPdxy2)
+            5401:6(float16_t) Load 4264(f16lodClamp)
+            5402:  7(f16vec4) ImageSampleExplicitLod 5397 5398 Grad ConstOffset MinLod 5399 5400 722 5401
+            5403:  7(f16vec4) Load 5280(texel)
+            5404:  7(f16vec4) FAdd 5403 5402
+                              Store 5280(texel) 5404
+            5405:         316 Load 318(s1DArrayShadow)
+            5406:  167(fvec3) Load 169(c3)
+            5407:   52(float) Load 1393(dPdxy1)
+            5408:   52(float) Load 1393(dPdxy1)
+            5409:   52(float) Load 4257(lodClamp)
+            5410:   52(float) CompositeExtract 5406 2
+            5411:6(float16_t) ImageSampleDrefExplicitLod 5405 5406 5410 Grad ConstOffset MinLod 5407 5408 709 5409
+            5412:    208(ptr) AccessChain 5280(texel) 207
+            5413:6(float16_t) Load 5412
+            5414:6(float16_t) FAdd 5413 5411
+            5415:    208(ptr) AccessChain 5280(texel) 207
+                              Store 5415 5414
+            5416:         316 Load 318(s1DArrayShadow)
+            5417:154(f16vec2) Load 156(f16c2)
+            5418:   52(float) Load 215(compare)
+            5419:6(float16_t) Load 1401(f16dPdxy1)
+            5420:6(float16_t) Load 1401(f16dPdxy1)
+            5421:6(float16_t) Load 4264(f16lodClamp)
+            5422:6(float16_t) ImageSampleDrefExplicitLod 5416 5417 5418 Grad ConstOffset MinLod 5419 5420 709 5421
+            5423:    208(ptr) AccessChain 5280(texel) 207
+            5424:6(float16_t) Load 5423
+            5425:6(float16_t) FAdd 5424 5422
+            5426:    208(ptr) AccessChain 5280(texel) 207
+                              Store 5426 5425
+            5427:         337 Load 339(s2DArrayShadow)
+            5428:  249(fvec4) Load 251(c4)
+            5429:   53(fvec2) Load 1409(dPdxy2)
+            5430:   53(fvec2) Load 1409(dPdxy2)
+            5431:   52(float) Load 4257(lodClamp)
+            5432:   52(float) CompositeExtract 5428 3
+            5433:6(float16_t) ImageSampleDrefExplicitLod 5427 5428 5432 Grad ConstOffset MinLod 5429 5430 722 5431
+            5434:    208(ptr) AccessChain 5280(texel) 207
+            5435:6(float16_t) Load 5434
+            5436:6(float16_t) FAdd 5435 5433
+            5437:    208(ptr) AccessChain 5280(texel) 207
+                              Store 5437 5436
+            5438:         337 Load 339(s2DArrayShadow)
+            5439:175(f16vec3) Load 177(f16c3)
+            5440:   52(float) Load 215(compare)
+            5441:154(f16vec2) Load 1417(f16dPdxy2)
+            5442:154(f16vec2) Load 1417(f16dPdxy2)
+            5443:6(float16_t) Load 4264(f16lodClamp)
+            5444:6(float16_t) ImageSampleDrefExplicitLod 5438 5439 5440 Grad ConstOffset MinLod 5441 5442 722 5443
+            5445:    208(ptr) AccessChain 5280(texel) 207
+            5446:6(float16_t) Load 5445
+            5447:6(float16_t) FAdd 5446 5444
+            5448:    208(ptr) AccessChain 5280(texel) 207
+                              Store 5448 5447
+            5449:  7(f16vec4) Load 5280(texel)
+                              ReturnValue 5449
+                              FunctionEnd
+115(testCombinedTextureSampler():  7(f16vec4) Function None 8
+             116:             Label
+     5452(texel):     64(ptr) Variable Function
+                              Store 5452(texel) 121
+            5455:         122 Load 5454(t1D)
+            5459:        5456 Load 5458(s)
+            5460:         123 SampledImage 5455 5459
+            5461:   52(float) Load 128(c1)
+            5462:  7(f16vec4) ImageSampleImplicitLod 5460 5461
+            5463:  7(f16vec4) Load 5452(texel)
+            5464:  7(f16vec4) FAdd 5463 5462
+                              Store 5452(texel) 5464
+            5465:         122 Load 5454(t1D)
+            5466:        5456 Load 5458(s)
+            5467:         123 SampledImage 5465 5466
+            5468:6(float16_t) Load 135(f16c1)
+            5469:6(float16_t) Load 137(f16bias)
+            5470:  7(f16vec4) ImageSampleImplicitLod 5467 5468 Bias 5469
+            5471:  7(f16vec4) Load 5452(texel)
+            5472:  7(f16vec4) FAdd 5471 5470
+                              Store 5452(texel) 5472
+            5475:         142 Load 5474(t2D)
+            5476:        5456 Load 5458(s)
+            5477:         143 SampledImage 5475 5476
+            5478:   53(fvec2) Load 148(c2)
+            5479:  7(f16vec4) ImageSampleImplicitLod 5477 5478
+            5480:  7(f16vec4) Load 5452(texel)
+            5481:  7(f16vec4) FAdd 5480 5479
+                              Store 5452(texel) 5481
+            5482:         142 Load 5474(t2D)
+            5483:        5456 Load 5458(s)
+            5484:         143 SampledImage 5482 5483
+            5485:154(f16vec2) Load 156(f16c2)
+            5486:6(float16_t) Load 137(f16bias)
+            5487:  7(f16vec4) ImageSampleImplicitLod 5484 5485 Bias 5486
+            5488:  7(f16vec4) Load 5452(texel)
+            5489:  7(f16vec4) FAdd 5488 5487
+                              Store 5452(texel) 5489
+            5492:         162 Load 5491(t3D)
+            5493:        5456 Load 5458(s)
+            5494:         163 SampledImage 5492 5493
+            5495:  167(fvec3) Load 169(c3)
+            5496:  7(f16vec4) ImageSampleImplicitLod 5494 5495
+            5497:  7(f16vec4) Load 5452(texel)
+            5498:  7(f16vec4) FAdd 5497 5496
+                              Store 5452(texel) 5498
+            5499:         162 Load 5491(t3D)
+            5500:        5456 Load 5458(s)
+            5501:         163 SampledImage 5499 5500
+            5502:175(f16vec3) Load 177(f16c3)
+            5503:6(float16_t) Load 137(f16bias)
+            5504:  7(f16vec4) ImageSampleImplicitLod 5501 5502 Bias 5503
+            5505:  7(f16vec4) Load 5452(texel)
+            5506:  7(f16vec4) FAdd 5505 5504
+                              Store 5452(texel) 5506
+            5509:         183 Load 5508(tCube)
+            5510:        5456 Load 5458(s)
+            5511:         184 SampledImage 5509 5510
+            5512:  167(fvec3) Load 169(c3)
+            5513:  7(f16vec4) ImageSampleImplicitLod 5511 5512
+            5514:  7(f16vec4) Load 5452(texel)
+            5515:  7(f16vec4) FAdd 5514 5513
+                              Store 5452(texel) 5515
+            5516:         183 Load 5508(tCube)
+            5517:        5456 Load 5458(s)
+            5518:         184 SampledImage 5516 5517
+            5519:175(f16vec3) Load 177(f16c3)
+            5520:6(float16_t) Load 137(f16bias)
+            5521:  7(f16vec4) ImageSampleImplicitLod 5518 5519 Bias 5520
+            5522:  7(f16vec4) Load 5452(texel)
+            5523:  7(f16vec4) FAdd 5522 5521
+                              Store 5452(texel) 5523
+            5524:         122 Load 5454(t1D)
+            5526:        5456 Load 5525(sShadow)
+            5527:         199 SampledImage 5524 5526
+            5528:  167(fvec3) Load 169(c3)
+            5529:   52(float) CompositeExtract 5528 2
+            5530:6(float16_t) ImageSampleDrefImplicitLod 5527 5528 5529
+            5531:    208(ptr) AccessChain 5452(texel) 207
+            5532:6(float16_t) Load 5531
+            5533:6(float16_t) FAdd 5532 5530
+            5534:    208(ptr) AccessChain 5452(texel) 207
+                              Store 5534 5533
+            5535:         122 Load 5454(t1D)
+            5536:        5456 Load 5525(sShadow)
+            5537:         199 SampledImage 5535 5536
+            5538:154(f16vec2) Load 156(f16c2)
+            5539:   52(float) Load 215(compare)
+            5540:6(float16_t) Load 137(f16bias)
+            5541:6(float16_t) ImageSampleDrefImplicitLod 5537 5538 5539 Bias 5540
+            5542:    208(ptr) AccessChain 5452(texel) 207
+            5543:6(float16_t) Load 5542
+            5544:6(float16_t) FAdd 5543 5541
+            5545:    208(ptr) AccessChain 5452(texel) 207
+                              Store 5545 5544
+            5546:         142 Load 5474(t2D)
+            5547:        5456 Load 5525(sShadow)
+            5548:         224 SampledImage 5546 5547
+            5549:  167(fvec3) Load 169(c3)
+            5550:   52(float) CompositeExtract 5549 2
+            5551:6(float16_t) ImageSampleDrefImplicitLod 5548 5549 5550
+            5552:    208(ptr) AccessChain 5452(texel) 207
+            5553:6(float16_t) Load 5552
+            5554:6(float16_t) FAdd 5553 5551
+            5555:    208(ptr) AccessChain 5452(texel) 207
+                              Store 5555 5554
+            5556:         142 Load 5474(t2D)
+            5557:        5456 Load 5525(sShadow)
+            5558:         224 SampledImage 5556 5557
+            5559:154(f16vec2) Load 156(f16c2)
+            5560:   52(float) Load 215(compare)
+            5561:6(float16_t) Load 137(f16bias)
+            5562:6(float16_t) ImageSampleDrefImplicitLod 5558 5559 5560 Bias 5561
+            5563:    208(ptr) AccessChain 5452(texel) 207
+            5564:6(float16_t) Load 5563
+            5565:6(float16_t) FAdd 5564 5562
+            5566:    208(ptr) AccessChain 5452(texel) 207
+                              Store 5566 5565
+            5567:         183 Load 5508(tCube)
+            5568:        5456 Load 5525(sShadow)
+            5569:         245 SampledImage 5567 5568
+            5570:  249(fvec4) Load 251(c4)
+            5571:   52(float) CompositeExtract 5570 3
+            5572:6(float16_t) ImageSampleDrefImplicitLod 5569 5570 5571
+            5573:    208(ptr) AccessChain 5452(texel) 207
+            5574:6(float16_t) Load 5573
+            5575:6(float16_t) FAdd 5574 5572
+            5576:    208(ptr) AccessChain 5452(texel) 207
+                              Store 5576 5575
+            5577:         183 Load 5508(tCube)
+            5578:        5456 Load 5525(sShadow)
+            5579:         245 SampledImage 5577 5578
+            5580:175(f16vec3) Load 177(f16c3)
+            5581:   52(float) Load 215(compare)
+            5582:6(float16_t) Load 137(f16bias)
+            5583:6(float16_t) ImageSampleDrefImplicitLod 5579 5580 5581 Bias 5582
+            5584:    208(ptr) AccessChain 5452(texel) 207
+            5585:6(float16_t) Load 5584
+            5586:6(float16_t) FAdd 5585 5583
+            5587:    208(ptr) AccessChain 5452(texel) 207
+                              Store 5587 5586
+            5590:         268 Load 5589(t1DArray)
+            5591:        5456 Load 5458(s)
+            5592:         269 SampledImage 5590 5591
+            5593:   53(fvec2) Load 148(c2)
+            5594:  7(f16vec4) ImageSampleImplicitLod 5592 5593
+            5595:  7(f16vec4) Load 5452(texel)
+            5596:  7(f16vec4) FAdd 5595 5594
+                              Store 5452(texel) 5596
+            5597:         268 Load 5589(t1DArray)
+            5598:        5456 Load 5458(s)
+            5599:         269 SampledImage 5597 5598
+            5600:154(f16vec2) Load 156(f16c2)
+            5601:6(float16_t) Load 137(f16bias)
+            5602:  7(f16vec4) ImageSampleImplicitLod 5599 5600 Bias 5601
+            5603:  7(f16vec4) Load 5452(texel)
+            5604:  7(f16vec4) FAdd 5603 5602
+                              Store 5452(texel) 5604
+            5607:         283 Load 5606(t2DArray)
+            5608:        5456 Load 5458(s)
+            5609:         284 SampledImage 5607 5608
+            5610:  167(fvec3) Load 169(c3)
+            5611:  7(f16vec4) ImageSampleImplicitLod 5609 5610
+            5612:  7(f16vec4) Load 5452(texel)
+            5613:  7(f16vec4) FAdd 5612 5611
+                              Store 5452(texel) 5613
+            5614:         283 Load 5606(t2DArray)
+            5615:        5456 Load 5458(s)
+            5616:         284 SampledImage 5614 5615
+            5617:175(f16vec3) Load 177(f16c3)
+            5618:6(float16_t) Load 137(f16bias)
+            5619:  7(f16vec4) ImageSampleImplicitLod 5616 5617 Bias 5618
+            5620:  7(f16vec4) Load 5452(texel)
+            5621:  7(f16vec4) FAdd 5620 5619
+                              Store 5452(texel) 5621
+            5624:         298 Load 5623(tCubeArray)
+            5625:        5456 Load 5458(s)
+            5626:         299 SampledImage 5624 5625
+            5627:  249(fvec4) Load 251(c4)
+            5628:  7(f16vec4) ImageSampleImplicitLod 5626 5627
+            5629:  7(f16vec4) Load 5452(texel)
+            5630:  7(f16vec4) FAdd 5629 5628
+                              Store 5452(texel) 5630
+            5631:         298 Load 5623(tCubeArray)
+            5632:        5456 Load 5458(s)
+            5633:         299 SampledImage 5631 5632
+            5634:  7(f16vec4) Load 309(f16c4)
+            5635:6(float16_t) Load 137(f16bias)
+            5636:  7(f16vec4) ImageSampleImplicitLod 5633 5634 Bias 5635
+            5637:  7(f16vec4) Load 5452(texel)
+            5638:  7(f16vec4) FAdd 5637 5636
+                              Store 5452(texel) 5638
+            5639:         268 Load 5589(t1DArray)
+            5640:        5456 Load 5525(sShadow)
+            5641:         316 SampledImage 5639 5640
+            5642:  167(fvec3) Load 169(c3)
+            5643:   52(float) CompositeExtract 5642 2
+            5644:6(float16_t) ImageSampleDrefImplicitLod 5641 5642 5643
+            5645:    208(ptr) AccessChain 5452(texel) 207
+            5646:6(float16_t) Load 5645
+            5647:6(float16_t) FAdd 5646 5644
+            5648:    208(ptr) AccessChain 5452(texel) 207
+                              Store 5648 5647
+            5649:         268 Load 5589(t1DArray)
+            5650:        5456 Load 5525(sShadow)
+            5651:         316 SampledImage 5649 5650
+            5652:154(f16vec2) Load 156(f16c2)
+            5653:   52(float) Load 215(compare)
+            5654:6(float16_t) Load 137(f16bias)
+            5655:6(float16_t) ImageSampleDrefImplicitLod 5651 5652 5653 Bias 5654
+            5656:    208(ptr) AccessChain 5452(texel) 207
+            5657:6(float16_t) Load 5656
+            5658:6(float16_t) FAdd 5657 5655
+            5659:    208(ptr) AccessChain 5452(texel) 207
+                              Store 5659 5658
+            5660:         283 Load 5606(t2DArray)
+            5661:        5456 Load 5525(sShadow)
+            5662:         337 SampledImage 5660 5661
+            5663:  249(fvec4) Load 251(c4)
+            5664:   52(float) CompositeExtract 5663 3
+            5665:6(float16_t) ImageSampleDrefImplicitLod 5662 5663 5664
+            5666:    208(ptr) AccessChain 5452(texel) 207
+            5667:6(float16_t) Load 5666
+            5668:6(float16_t) FAdd 5667 5665
+            5669:    208(ptr) AccessChain 5452(texel) 207
+                              Store 5669 5668
+            5670:         283 Load 5606(t2DArray)
+            5671:        5456 Load 5525(sShadow)
+            5672:         337 SampledImage 5670 5671
+            5673:175(f16vec3) Load 177(f16c3)
+            5674:   52(float) Load 215(compare)
+            5675:6(float16_t) ImageSampleDrefImplicitLod 5672 5673 5674
+            5676:    208(ptr) AccessChain 5452(texel) 207
+            5677:6(float16_t) Load 5676
+            5678:6(float16_t) FAdd 5677 5675
+            5679:    208(ptr) AccessChain 5452(texel) 207
+                              Store 5679 5678
+            5682:         356 Load 5681(t2DRect)
+            5683:        5456 Load 5458(s)
+            5684:         357 SampledImage 5682 5683
+            5685:   53(fvec2) Load 148(c2)
+            5686:  7(f16vec4) ImageSampleImplicitLod 5684 5685
+            5687:  7(f16vec4) Load 5452(texel)
+            5688:  7(f16vec4) FAdd 5687 5686
+                              Store 5452(texel) 5688
+            5689:         356 Load 5681(t2DRect)
+            5690:        5456 Load 5458(s)
+            5691:         357 SampledImage 5689 5690
+            5692:154(f16vec2) Load 156(f16c2)
+            5693:  7(f16vec4) ImageSampleImplicitLod 5691 5692
+            5694:  7(f16vec4) Load 5452(texel)
+            5695:  7(f16vec4) FAdd 5694 5693
+                              Store 5452(texel) 5695
+            5696:         356 Load 5681(t2DRect)
+            5697:        5456 Load 5525(sShadow)
+            5698:         371 SampledImage 5696 5697
+            5699:  167(fvec3) Load 169(c3)
+            5700:   52(float) CompositeExtract 5699 2
+            5701:6(float16_t) ImageSampleDrefImplicitLod 5698 5699 5700
+            5702:    208(ptr) AccessChain 5452(texel) 207
+            5703:6(float16_t) Load 5702
+            5704:6(float16_t) FAdd 5703 5701
+            5705:    208(ptr) AccessChain 5452(texel) 207
+                              Store 5705 5704
+            5706:         356 Load 5681(t2DRect)
+            5707:        5456 Load 5525(sShadow)
+            5708:         371 SampledImage 5706 5707
+            5709:154(f16vec2) Load 156(f16c2)
+            5710:   52(float) Load 215(compare)
+            5711:6(float16_t) ImageSampleDrefImplicitLod 5708 5709 5710
+            5712:    208(ptr) AccessChain 5452(texel) 207
+            5713:6(float16_t) Load 5712
+            5714:6(float16_t) FAdd 5713 5711
+            5715:    208(ptr) AccessChain 5452(texel) 207
+                              Store 5715 5714
+            5716:         298 Load 5623(tCubeArray)
+            5717:        5456 Load 5525(sShadow)
+            5718:         391 SampledImage 5716 5717
+            5719:  249(fvec4) Load 251(c4)
+            5720:   52(float) Load 215(compare)
+            5721:6(float16_t) ImageSampleDrefImplicitLod 5718 5719 5720
+            5722:    208(ptr) AccessChain 5452(texel) 207
+            5723:6(float16_t) Load 5722
+            5724:6(float16_t) FAdd 5723 5721
+            5725:    208(ptr) AccessChain 5452(texel) 207
+                              Store 5725 5724
+            5726:         298 Load 5623(tCubeArray)
+            5727:        5456 Load 5525(sShadow)
+            5728:         391 SampledImage 5726 5727
+            5729:  7(f16vec4) Load 309(f16c4)
+            5730:   52(float) Load 215(compare)
+            5731:6(float16_t) ImageSampleDrefImplicitLod 5728 5729 5730
+            5732:    208(ptr) AccessChain 5452(texel) 207
+            5733:6(float16_t) Load 5732
+            5734:6(float16_t) FAdd 5733 5731
+            5735:    208(ptr) AccessChain 5452(texel) 207
+                              Store 5735 5734
+            5736:  7(f16vec4) Load 5452(texel)
+                              ReturnValue 5736
+                              FunctionEnd
+117(testSubpassLoad():  7(f16vec4) Function None 8
+             118:             Label
+            5742:        5739 Load 5741(subpass)
+            5744:  7(f16vec4) ImageRead 5742 5743
+            5748:        5745 Load 5747(subpassMS)
+            5749:  7(f16vec4) ImageRead 5748 5743 Sample 1326
+            5750:  7(f16vec4) FAdd 5744 5749
+                              ReturnValue 5750
+                              FunctionEnd
diff --git a/Test/baseResults/spv.float32.frag.out b/Test/baseResults/spv.float32.frag.out
new file mode 100644
index 0000000..3f07e4e
--- /dev/null
+++ b/Test/baseResults/spv.float32.frag.out
@@ -0,0 +1,811 @@
+spv.float32.frag
+error: SPIRV-Tools Validation Errors
+error: Capability Float16 is not allowed by Vulkan 1.1 specification (or requires extension)
+  OpCapability Float16
+
+// Module Version 10300
+// Generated by (magic number): 80007
+// Id's are bound by 533
+
+                              Capability Shader
+                              Capability Float16
+                              Capability Float64
+                              Capability Int64
+                              Capability Int16
+                              Capability Int8
+                              Capability DerivativeControl
+                              Capability InterpolationFunction
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 471
+                              ExecutionMode 4 OriginUpperLeft
+                              Source GLSL 450
+                              SourceExtension  "GL_EXT_shader_explicit_arithmetic_types"
+                              SourceExtension  "GL_EXT_shader_explicit_arithmetic_types_float16"
+                              SourceExtension  "GL_EXT_shader_explicit_arithmetic_types_float32"
+                              SourceExtension  "GL_EXT_shader_explicit_arithmetic_types_float64"
+                              SourceExtension  "GL_EXT_shader_explicit_arithmetic_types_int16"
+                              SourceExtension  "GL_EXT_shader_explicit_arithmetic_types_int32"
+                              SourceExtension  "GL_EXT_shader_explicit_arithmetic_types_int64"
+                              SourceExtension  "GL_EXT_shader_explicit_arithmetic_types_int8"
+                              Name 4  "main"
+                              Name 6  "literal("
+                              Name 8  "operators("
+                              Name 10  "typeCast("
+                              Name 12  "builtinAngleTrigFuncs("
+                              Name 14  "builtinExpFuncs("
+                              Name 16  "builtinCommonFuncs("
+                              Name 18  "builtinGeometryFuncs("
+                              Name 20  "builtinMatrixFuncs("
+                              Name 22  "builtinVecRelFuncs("
+                              Name 24  "builtinFragProcFuncs("
+                              Name 29  "f32v"
+                              Name 40  "f32v"
+                              Name 62  "f32m"
+                              Name 85  "f32"
+                              Name 109  "b"
+                              Name 152  "f64v"
+                              Name 155  "f32v"
+                              Name 160  "bv"
+                              Name 175  "f16v"
+                              Name 183  "i8v"
+                              Name 189  "i16v"
+                              Name 195  "i32v"
+                              Name 201  "i64v"
+                              Name 207  "u8v"
+                              Name 213  "u16v"
+                              Name 218  "u32v"
+                              Name 224  "u64v"
+                              Name 229  "f32v2"
+                              Name 230  "f32v1"
+                              Name 262  "f32v2"
+                              Name 263  "f32v1"
+                              Name 279  "f32v2"
+                              Name 280  "f32v1"
+                              Name 301  "f32"
+                              Name 305  "f32v3"
+                              Name 345  "bv"
+                              Name 366  "b"
+                              Name 376  "iv"
+                              Name 377  "ResType"
+                              Name 384  "f32"
+                              Name 385  "f32v1"
+                              Name 389  "f32v2"
+                              Name 395  "f32v3"
+                              Name 414  "f32m3"
+                              Name 415  "f32m1"
+                              Name 417  "f32m2"
+                              Name 426  "f32v1"
+                              Name 428  "f32v2"
+                              Name 433  "f32m4"
+                              Name 436  "f32"
+                              Name 439  "f32m5"
+                              Name 444  "f32m6"
+                              Name 445  "f32m7"
+                              Name 448  "bv"
+                              Name 449  "f32v1"
+                              Name 451  "f32v2"
+                              Name 469  "f32v"
+                              Name 471  "if32v"
+                              Name 520  "S"
+                              MemberName 520(S) 0  "x"
+                              MemberName 520(S) 1  "y"
+                              MemberName 520(S) 2  "z"
+                              Name 522  "B1"
+                              MemberName 522(B1) 0  "a"
+                              MemberName 522(B1) 1  "b"
+                              MemberName 522(B1) 2  "c"
+                              MemberName 522(B1) 3  "d"
+                              MemberName 522(B1) 4  "e"
+                              MemberName 522(B1) 5  "f"
+                              MemberName 522(B1) 6  "g"
+                              MemberName 522(B1) 7  "h"
+                              Name 524  ""
+                              Name 525  "sf16"
+                              Name 526  "sf"
+                              Name 527  "sd"
+                              Name 528  "f16_to_f"
+                              Name 530  "f16_to_d"
+                              Name 531  "f_to_f16"
+                              Name 532  "d_to_f16"
+                              Decorate 518 ArrayStride 16
+                              Decorate 519 ArrayStride 32
+                              MemberDecorate 520(S) 0 Offset 0
+                              MemberDecorate 520(S) 1 Offset 8
+                              MemberDecorate 520(S) 2 Offset 16
+                              Decorate 521 ArrayStride 32
+                              MemberDecorate 522(B1) 0 Offset 0
+                              MemberDecorate 522(B1) 1 Offset 8
+                              MemberDecorate 522(B1) 2 Offset 16
+                              MemberDecorate 522(B1) 3 Offset 32
+                              MemberDecorate 522(B1) 4 ColMajor
+                              MemberDecorate 522(B1) 4 Offset 64
+                              MemberDecorate 522(B1) 4 MatrixStride 16
+                              MemberDecorate 522(B1) 5 ColMajor
+                              MemberDecorate 522(B1) 5 Offset 96
+                              MemberDecorate 522(B1) 5 MatrixStride 16
+                              MemberDecorate 522(B1) 6 Offset 160
+                              MemberDecorate 522(B1) 7 Offset 192
+                              Decorate 522(B1) Block
+                              Decorate 524 DescriptorSet 0
+                              Decorate 525(sf16) SpecId 100
+                              Decorate 526(sf) SpecId 101
+                              Decorate 527(sd) SpecId 102
+               2:             TypeVoid
+               3:             TypeFunction 2
+              26:             TypeFloat 32
+              27:             TypeVector 26(float) 2
+              28:             TypePointer Function 27(fvec2)
+              30:   26(float) Constant 897988541
+              31:             TypeInt 32 0
+              32:     31(int) Constant 0
+              33:             TypePointer Function 26(float)
+              35:   26(float) Constant 3196059648
+              36:   26(float) Constant 1022739087
+              37:   27(fvec2) ConstantComposite 35 36
+              54:   26(float) Constant 1065353216
+              60:             TypeMatrix 27(fvec2) 2
+              61:             TypePointer Function 60
+              88:     31(int) Constant 1
+             107:             TypeBool
+             108:             TypePointer Function 107(bool)
+             149:             TypeFloat 64
+             150:             TypeVector 149(float64_t) 3
+             151:             TypePointer Function 150(f64vec3)
+             153:             TypeVector 26(float) 3
+             154:             TypePointer Function 153(fvec3)
+             158:             TypeVector 107(bool) 3
+             159:             TypePointer Function 158(bvec3)
+             162:   26(float) Constant 0
+             163:  153(fvec3) ConstantComposite 162 162 162
+             164:  153(fvec3) ConstantComposite 54 54 54
+             172:             TypeFloat 16
+             173:             TypeVector 172(float16_t) 3
+             174:             TypePointer Function 173(f16vec3)
+             180:             TypeInt 8 1
+             181:             TypeVector 180(int8_t) 3
+             182:             TypePointer Function 181(i8vec3)
+             186:             TypeInt 16 1
+             187:             TypeVector 186(int16_t) 3
+             188:             TypePointer Function 187(i16vec3)
+             192:             TypeInt 32 1
+             193:             TypeVector 192(int) 3
+             194:             TypePointer Function 193(ivec3)
+             198:             TypeInt 64 1
+             199:             TypeVector 198(int64_t) 3
+             200:             TypePointer Function 199(i64vec3)
+             204:             TypeInt 8 0
+             205:             TypeVector 204(int8_t) 3
+             206:             TypePointer Function 205(i8vec3)
+             210:             TypeInt 16 0
+             211:             TypeVector 210(int16_t) 3
+             212:             TypePointer Function 211(i16vec3)
+             216:             TypeVector 31(int) 3
+             217:             TypePointer Function 216(ivec3)
+             221:             TypeInt 64 0
+             222:             TypeVector 221(int64_t) 3
+             223:             TypePointer Function 222(i64vec3)
+             227:             TypeVector 26(float) 4
+             228:             TypePointer Function 227(fvec4)
+    377(ResType):             TypeStruct 153(fvec3) 193(ivec3)
+             412:             TypeMatrix 153(fvec3) 2
+             413:             TypePointer Function 412
+             431:             TypeMatrix 27(fvec2) 3
+             432:             TypePointer Function 431
+             437:             TypeMatrix 153(fvec3) 3
+             438:             TypePointer Function 437
+             442:             TypeMatrix 227(fvec4) 4
+             443:             TypePointer Function 442
+             470:             TypePointer Input 153(fvec3)
+      471(if32v):    470(ptr) Variable Input
+             472:             TypePointer Input 26(float)
+             509:    192(int) Constant 1
+             514:   26(float) Constant 1056964608
+             515:   27(fvec2) ConstantComposite 514 514
+             517:     31(int) Constant 2
+             518:             TypeArray 26(float) 517
+             519:             TypeArray 412 517
+          520(S):             TypeStruct 26(float) 27(fvec2) 153(fvec3)
+             521:             TypeArray 520(S) 517
+         522(B1):             TypeStruct 26(float) 27(fvec2) 153(fvec3) 518 412 519 520(S) 521
+             523:             TypePointer Uniform 522(B1)
+             524:    523(ptr) Variable Uniform
+       525(sf16):172(float16_t) SpecConstant 12288
+         526(sf):   26(float) SpecConstant 1048576000
+         527(sd):149(float64_t) SpecConstant 0 1071644672
+   528(f16_to_f):   26(float) SpecConstantOp 115 525(sf16)
+             529:   26(float) SpecConstantOp 115 525(sf16)
+   530(f16_to_d):149(float64_t) SpecConstantOp 115 529
+   531(f_to_f16):172(float16_t) SpecConstantOp 115 526(sf)
+   532(d_to_f16):172(float16_t) SpecConstantOp 115 527(sd)
+         4(main):           2 Function None 3
+               5:             Label
+                              Return
+                              FunctionEnd
+     6(literal():           2 Function None 3
+               7:             Label
+        29(f32v):     28(ptr) Variable Function
+              34:     33(ptr) AccessChain 29(f32v) 32
+                              Store 34 30
+              38:   27(fvec2) Load 29(f32v)
+              39:   27(fvec2) FAdd 38 37
+                              Store 29(f32v) 39
+                              Return
+                              FunctionEnd
+   8(operators():           2 Function None 3
+               9:             Label
+        40(f32v):     28(ptr) Variable Function
+        62(f32m):     61(ptr) Variable Function
+         85(f32):     33(ptr) Variable Function
+          109(b):    108(ptr) Variable Function
+              41:   27(fvec2) Load 40(f32v)
+              42:   27(fvec2) Load 40(f32v)
+              43:   27(fvec2) FAdd 42 41
+                              Store 40(f32v) 43
+              44:   27(fvec2) Load 40(f32v)
+              45:   27(fvec2) Load 40(f32v)
+              46:   27(fvec2) FSub 45 44
+                              Store 40(f32v) 46
+              47:   27(fvec2) Load 40(f32v)
+              48:   27(fvec2) Load 40(f32v)
+              49:   27(fvec2) FMul 48 47
+                              Store 40(f32v) 49
+              50:   27(fvec2) Load 40(f32v)
+              51:   27(fvec2) Load 40(f32v)
+              52:   27(fvec2) FDiv 51 50
+                              Store 40(f32v) 52
+              53:   27(fvec2) Load 40(f32v)
+              55:   27(fvec2) CompositeConstruct 54 54
+              56:   27(fvec2) FAdd 53 55
+                              Store 40(f32v) 56
+              57:   27(fvec2) Load 40(f32v)
+              58:   27(fvec2) CompositeConstruct 54 54
+              59:   27(fvec2) FSub 57 58
+                              Store 40(f32v) 59
+              63:          60 Load 62(f32m)
+              64:   27(fvec2) CompositeConstruct 54 54
+              65:   27(fvec2) CompositeExtract 63 0
+              66:   27(fvec2) FAdd 65 64
+              67:   27(fvec2) CompositeExtract 63 1
+              68:   27(fvec2) FAdd 67 64
+              69:          60 CompositeConstruct 66 68
+                              Store 62(f32m) 69
+              70:          60 Load 62(f32m)
+              71:   27(fvec2) CompositeConstruct 54 54
+              72:   27(fvec2) CompositeExtract 70 0
+              73:   27(fvec2) FSub 72 71
+              74:   27(fvec2) CompositeExtract 70 1
+              75:   27(fvec2) FSub 74 71
+              76:          60 CompositeConstruct 73 75
+                              Store 62(f32m) 76
+              77:   27(fvec2) Load 40(f32v)
+              78:   27(fvec2) FNegate 77
+                              Store 40(f32v) 78
+              79:          60 Load 62(f32m)
+              80:   27(fvec2) CompositeExtract 79 0
+              81:   27(fvec2) FNegate 80
+              82:   27(fvec2) CompositeExtract 79 1
+              83:   27(fvec2) FNegate 82
+              84:          60 CompositeConstruct 81 83
+                              Store 62(f32m) 84
+              86:     33(ptr) AccessChain 40(f32v) 32
+              87:   26(float) Load 86
+              89:     33(ptr) AccessChain 40(f32v) 88
+              90:   26(float) Load 89
+              91:   26(float) FAdd 87 90
+                              Store 85(f32) 91
+              92:     33(ptr) AccessChain 40(f32v) 32
+              93:   26(float) Load 92
+              94:     33(ptr) AccessChain 40(f32v) 88
+              95:   26(float) Load 94
+              96:   26(float) FSub 93 95
+                              Store 85(f32) 96
+              97:     33(ptr) AccessChain 40(f32v) 32
+              98:   26(float) Load 97
+              99:     33(ptr) AccessChain 40(f32v) 88
+             100:   26(float) Load 99
+             101:   26(float) FMul 98 100
+                              Store 85(f32) 101
+             102:     33(ptr) AccessChain 40(f32v) 32
+             103:   26(float) Load 102
+             104:     33(ptr) AccessChain 40(f32v) 88
+             105:   26(float) Load 104
+             106:   26(float) FDiv 103 105
+                              Store 85(f32) 106
+             110:     33(ptr) AccessChain 40(f32v) 32
+             111:   26(float) Load 110
+             112:   26(float) Load 85(f32)
+             113:   107(bool) FOrdNotEqual 111 112
+                              Store 109(b) 113
+             114:     33(ptr) AccessChain 40(f32v) 88
+             115:   26(float) Load 114
+             116:   26(float) Load 85(f32)
+             117:   107(bool) FOrdEqual 115 116
+                              Store 109(b) 117
+             118:     33(ptr) AccessChain 40(f32v) 32
+             119:   26(float) Load 118
+             120:   26(float) Load 85(f32)
+             121:   107(bool) FOrdGreaterThan 119 120
+                              Store 109(b) 121
+             122:     33(ptr) AccessChain 40(f32v) 88
+             123:   26(float) Load 122
+             124:   26(float) Load 85(f32)
+             125:   107(bool) FOrdLessThan 123 124
+                              Store 109(b) 125
+             126:     33(ptr) AccessChain 40(f32v) 32
+             127:   26(float) Load 126
+             128:   26(float) Load 85(f32)
+             129:   107(bool) FOrdGreaterThanEqual 127 128
+                              Store 109(b) 129
+             130:     33(ptr) AccessChain 40(f32v) 88
+             131:   26(float) Load 130
+             132:   26(float) Load 85(f32)
+             133:   107(bool) FOrdLessThanEqual 131 132
+                              Store 109(b) 133
+             134:   27(fvec2) Load 40(f32v)
+             135:   26(float) Load 85(f32)
+             136:   27(fvec2) VectorTimesScalar 134 135
+                              Store 40(f32v) 136
+             137:          60 Load 62(f32m)
+             138:   26(float) Load 85(f32)
+             139:          60 MatrixTimesScalar 137 138
+                              Store 62(f32m) 139
+             140:          60 Load 62(f32m)
+             141:   27(fvec2) Load 40(f32v)
+             142:   27(fvec2) MatrixTimesVector 140 141
+                              Store 40(f32v) 142
+             143:   27(fvec2) Load 40(f32v)
+             144:          60 Load 62(f32m)
+             145:   27(fvec2) VectorTimesMatrix 143 144
+                              Store 40(f32v) 145
+             146:          60 Load 62(f32m)
+             147:          60 Load 62(f32m)
+             148:          60 MatrixTimesMatrix 146 147
+                              Store 62(f32m) 148
+                              Return
+                              FunctionEnd
+   10(typeCast():           2 Function None 3
+              11:             Label
+       152(f64v):    151(ptr) Variable Function
+       155(f32v):    154(ptr) Variable Function
+         160(bv):    159(ptr) Variable Function
+       175(f16v):    174(ptr) Variable Function
+        183(i8v):    182(ptr) Variable Function
+       189(i16v):    188(ptr) Variable Function
+       195(i32v):    194(ptr) Variable Function
+       201(i64v):    200(ptr) Variable Function
+        207(u8v):    206(ptr) Variable Function
+       213(u16v):    212(ptr) Variable Function
+       218(u32v):    217(ptr) Variable Function
+       224(u64v):    223(ptr) Variable Function
+             156:  153(fvec3) Load 155(f32v)
+             157:150(f64vec3) FConvert 156
+                              Store 152(f64v) 157
+             161:  158(bvec3) Load 160(bv)
+             165:  153(fvec3) Select 161 164 163
+                              Store 155(f32v) 165
+             166:  153(fvec3) Load 155(f32v)
+             167:  158(bvec3) FOrdNotEqual 166 163
+                              Store 160(bv) 167
+             168:150(f64vec3) Load 152(f64v)
+             169:  153(fvec3) FConvert 168
+                              Store 155(f32v) 169
+             170:  153(fvec3) Load 155(f32v)
+             171:150(f64vec3) FConvert 170
+                              Store 152(f64v) 171
+             176:173(f16vec3) Load 175(f16v)
+             177:  153(fvec3) FConvert 176
+                              Store 155(f32v) 177
+             178:  153(fvec3) Load 155(f32v)
+             179:173(f16vec3) FConvert 178
+                              Store 175(f16v) 179
+             184:  153(fvec3) Load 155(f32v)
+             185: 181(i8vec3) ConvertFToS 184
+                              Store 183(i8v) 185
+             190:  153(fvec3) Load 155(f32v)
+             191:187(i16vec3) ConvertFToS 190
+                              Store 189(i16v) 191
+             196:  153(fvec3) Load 155(f32v)
+             197:  193(ivec3) ConvertFToS 196
+                              Store 195(i32v) 197
+             202:  153(fvec3) Load 155(f32v)
+             203:199(i64vec3) ConvertFToS 202
+                              Store 201(i64v) 203
+             208:  153(fvec3) Load 155(f32v)
+             209: 205(i8vec3) ConvertFToU 208
+                              Store 207(u8v) 209
+             214:  153(fvec3) Load 155(f32v)
+             215:211(i16vec3) ConvertFToU 214
+                              Store 213(u16v) 215
+             219:  153(fvec3) Load 155(f32v)
+             220:  216(ivec3) ConvertFToU 219
+                              Store 218(u32v) 220
+             225:  153(fvec3) Load 155(f32v)
+             226:222(i64vec3) ConvertFToU 225
+                              Store 224(u64v) 226
+                              Return
+                              FunctionEnd
+12(builtinAngleTrigFuncs():           2 Function None 3
+              13:             Label
+      229(f32v2):    228(ptr) Variable Function
+      230(f32v1):    228(ptr) Variable Function
+             231:  227(fvec4) Load 230(f32v1)
+             232:  227(fvec4) ExtInst 1(GLSL.std.450) 11(Radians) 231
+                              Store 229(f32v2) 232
+             233:  227(fvec4) Load 230(f32v1)
+             234:  227(fvec4) ExtInst 1(GLSL.std.450) 12(Degrees) 233
+                              Store 229(f32v2) 234
+             235:  227(fvec4) Load 230(f32v1)
+             236:  227(fvec4) ExtInst 1(GLSL.std.450) 13(Sin) 235
+                              Store 229(f32v2) 236
+             237:  227(fvec4) Load 230(f32v1)
+             238:  227(fvec4) ExtInst 1(GLSL.std.450) 14(Cos) 237
+                              Store 229(f32v2) 238
+             239:  227(fvec4) Load 230(f32v1)
+             240:  227(fvec4) ExtInst 1(GLSL.std.450) 15(Tan) 239
+                              Store 229(f32v2) 240
+             241:  227(fvec4) Load 230(f32v1)
+             242:  227(fvec4) ExtInst 1(GLSL.std.450) 16(Asin) 241
+                              Store 229(f32v2) 242
+             243:  227(fvec4) Load 230(f32v1)
+             244:  227(fvec4) ExtInst 1(GLSL.std.450) 17(Acos) 243
+                              Store 229(f32v2) 244
+             245:  227(fvec4) Load 230(f32v1)
+             246:  227(fvec4) Load 229(f32v2)
+             247:  227(fvec4) ExtInst 1(GLSL.std.450) 25(Atan2) 245 246
+                              Store 229(f32v2) 247
+             248:  227(fvec4) Load 230(f32v1)
+             249:  227(fvec4) ExtInst 1(GLSL.std.450) 18(Atan) 248
+                              Store 229(f32v2) 249
+             250:  227(fvec4) Load 230(f32v1)
+             251:  227(fvec4) ExtInst 1(GLSL.std.450) 19(Sinh) 250
+                              Store 229(f32v2) 251
+             252:  227(fvec4) Load 230(f32v1)
+             253:  227(fvec4) ExtInst 1(GLSL.std.450) 20(Cosh) 252
+                              Store 229(f32v2) 253
+             254:  227(fvec4) Load 230(f32v1)
+             255:  227(fvec4) ExtInst 1(GLSL.std.450) 21(Tanh) 254
+                              Store 229(f32v2) 255
+             256:  227(fvec4) Load 230(f32v1)
+             257:  227(fvec4) ExtInst 1(GLSL.std.450) 22(Asinh) 256
+                              Store 229(f32v2) 257
+             258:  227(fvec4) Load 230(f32v1)
+             259:  227(fvec4) ExtInst 1(GLSL.std.450) 23(Acosh) 258
+                              Store 229(f32v2) 259
+             260:  227(fvec4) Load 230(f32v1)
+             261:  227(fvec4) ExtInst 1(GLSL.std.450) 24(Atanh) 260
+                              Store 229(f32v2) 261
+                              Return
+                              FunctionEnd
+14(builtinExpFuncs():           2 Function None 3
+              15:             Label
+      262(f32v2):     28(ptr) Variable Function
+      263(f32v1):     28(ptr) Variable Function
+             264:   27(fvec2) Load 263(f32v1)
+             265:   27(fvec2) Load 262(f32v2)
+             266:   27(fvec2) ExtInst 1(GLSL.std.450) 26(Pow) 264 265
+                              Store 262(f32v2) 266
+             267:   27(fvec2) Load 263(f32v1)
+             268:   27(fvec2) ExtInst 1(GLSL.std.450) 27(Exp) 267
+                              Store 262(f32v2) 268
+             269:   27(fvec2) Load 263(f32v1)
+             270:   27(fvec2) ExtInst 1(GLSL.std.450) 28(Log) 269
+                              Store 262(f32v2) 270
+             271:   27(fvec2) Load 263(f32v1)
+             272:   27(fvec2) ExtInst 1(GLSL.std.450) 29(Exp2) 271
+                              Store 262(f32v2) 272
+             273:   27(fvec2) Load 263(f32v1)
+             274:   27(fvec2) ExtInst 1(GLSL.std.450) 30(Log2) 273
+                              Store 262(f32v2) 274
+             275:   27(fvec2) Load 263(f32v1)
+             276:   27(fvec2) ExtInst 1(GLSL.std.450) 31(Sqrt) 275
+                              Store 262(f32v2) 276
+             277:   27(fvec2) Load 263(f32v1)
+             278:   27(fvec2) ExtInst 1(GLSL.std.450) 32(InverseSqrt) 277
+                              Store 262(f32v2) 278
+                              Return
+                              FunctionEnd
+16(builtinCommonFuncs():           2 Function None 3
+              17:             Label
+      279(f32v2):    154(ptr) Variable Function
+      280(f32v1):    154(ptr) Variable Function
+        301(f32):     33(ptr) Variable Function
+      305(f32v3):    154(ptr) Variable Function
+         345(bv):    159(ptr) Variable Function
+          366(b):    108(ptr) Variable Function
+         376(iv):    194(ptr) Variable Function
+             281:  153(fvec3) Load 280(f32v1)
+             282:  153(fvec3) ExtInst 1(GLSL.std.450) 4(FAbs) 281
+                              Store 279(f32v2) 282
+             283:  153(fvec3) Load 280(f32v1)
+             284:  153(fvec3) ExtInst 1(GLSL.std.450) 6(FSign) 283
+                              Store 279(f32v2) 284
+             285:  153(fvec3) Load 280(f32v1)
+             286:  153(fvec3) ExtInst 1(GLSL.std.450) 8(Floor) 285
+                              Store 279(f32v2) 286
+             287:  153(fvec3) Load 280(f32v1)
+             288:  153(fvec3) ExtInst 1(GLSL.std.450) 3(Trunc) 287
+                              Store 279(f32v2) 288
+             289:  153(fvec3) Load 280(f32v1)
+             290:  153(fvec3) ExtInst 1(GLSL.std.450) 1(Round) 289
+                              Store 279(f32v2) 290
+             291:  153(fvec3) Load 280(f32v1)
+             292:  153(fvec3) ExtInst 1(GLSL.std.450) 2(RoundEven) 291
+                              Store 279(f32v2) 292
+             293:  153(fvec3) Load 280(f32v1)
+             294:  153(fvec3) ExtInst 1(GLSL.std.450) 9(Ceil) 293
+                              Store 279(f32v2) 294
+             295:  153(fvec3) Load 280(f32v1)
+             296:  153(fvec3) ExtInst 1(GLSL.std.450) 10(Fract) 295
+                              Store 279(f32v2) 296
+             297:  153(fvec3) Load 280(f32v1)
+             298:  153(fvec3) Load 279(f32v2)
+             299:  153(fvec3) FMod 297 298
+                              Store 279(f32v2) 299
+             300:  153(fvec3) Load 280(f32v1)
+             302:   26(float) Load 301(f32)
+             303:  153(fvec3) CompositeConstruct 302 302 302
+             304:  153(fvec3) FMod 300 303
+                              Store 279(f32v2) 304
+             306:  153(fvec3) Load 280(f32v1)
+             307:  153(fvec3) ExtInst 1(GLSL.std.450) 35(Modf) 306 279(f32v2)
+                              Store 305(f32v3) 307
+             308:  153(fvec3) Load 280(f32v1)
+             309:  153(fvec3) Load 279(f32v2)
+             310:  153(fvec3) ExtInst 1(GLSL.std.450) 37(FMin) 308 309
+                              Store 305(f32v3) 310
+             311:  153(fvec3) Load 280(f32v1)
+             312:   26(float) Load 301(f32)
+             313:  153(fvec3) CompositeConstruct 312 312 312
+             314:  153(fvec3) ExtInst 1(GLSL.std.450) 37(FMin) 311 313
+                              Store 305(f32v3) 314
+             315:  153(fvec3) Load 280(f32v1)
+             316:  153(fvec3) Load 279(f32v2)
+             317:  153(fvec3) ExtInst 1(GLSL.std.450) 40(FMax) 315 316
+                              Store 305(f32v3) 317
+             318:  153(fvec3) Load 280(f32v1)
+             319:   26(float) Load 301(f32)
+             320:  153(fvec3) CompositeConstruct 319 319 319
+             321:  153(fvec3) ExtInst 1(GLSL.std.450) 40(FMax) 318 320
+                              Store 305(f32v3) 321
+             322:  153(fvec3) Load 280(f32v1)
+             323:   26(float) Load 301(f32)
+             324:     33(ptr) AccessChain 279(f32v2) 32
+             325:   26(float) Load 324
+             326:  153(fvec3) CompositeConstruct 323 323 323
+             327:  153(fvec3) CompositeConstruct 325 325 325
+             328:  153(fvec3) ExtInst 1(GLSL.std.450) 43(FClamp) 322 326 327
+                              Store 305(f32v3) 328
+             329:  153(fvec3) Load 280(f32v1)
+             330:  153(fvec3) Load 279(f32v2)
+             331:   26(float) Load 301(f32)
+             332:  153(fvec3) CompositeConstruct 331 331 331
+             333:  153(fvec3) ExtInst 1(GLSL.std.450) 43(FClamp) 329 330 332
+                              Store 305(f32v3) 333
+             334:  153(fvec3) Load 280(f32v1)
+             335:  153(fvec3) Load 279(f32v2)
+             336:   26(float) Load 301(f32)
+             337:  153(fvec3) CompositeConstruct 336 336 336
+             338:  153(fvec3) ExtInst 1(GLSL.std.450) 46(FMix) 334 335 337
+                              Store 305(f32v3) 338
+             339:  153(fvec3) Load 280(f32v1)
+             340:  153(fvec3) Load 279(f32v2)
+             341:  153(fvec3) Load 305(f32v3)
+             342:  153(fvec3) ExtInst 1(GLSL.std.450) 46(FMix) 339 340 341
+                              Store 305(f32v3) 342
+             343:  153(fvec3) Load 280(f32v1)
+             344:  153(fvec3) Load 279(f32v2)
+             346:  158(bvec3) Load 345(bv)
+             347:  153(fvec3) Select 346 344 343
+                              Store 305(f32v3) 347
+             348:  153(fvec3) Load 280(f32v1)
+             349:  153(fvec3) Load 279(f32v2)
+             350:  153(fvec3) ExtInst 1(GLSL.std.450) 48(Step) 348 349
+                              Store 305(f32v3) 350
+             351:   26(float) Load 301(f32)
+             352:  153(fvec3) Load 305(f32v3)
+             353:  153(fvec3) CompositeConstruct 351 351 351
+             354:  153(fvec3) ExtInst 1(GLSL.std.450) 48(Step) 353 352
+                              Store 305(f32v3) 354
+             355:  153(fvec3) Load 280(f32v1)
+             356:  153(fvec3) Load 279(f32v2)
+             357:  153(fvec3) Load 305(f32v3)
+             358:  153(fvec3) ExtInst 1(GLSL.std.450) 49(SmoothStep) 355 356 357
+                              Store 305(f32v3) 358
+             359:   26(float) Load 301(f32)
+             360:     33(ptr) AccessChain 280(f32v1) 32
+             361:   26(float) Load 360
+             362:  153(fvec3) Load 279(f32v2)
+             363:  153(fvec3) CompositeConstruct 359 359 359
+             364:  153(fvec3) CompositeConstruct 361 361 361
+             365:  153(fvec3) ExtInst 1(GLSL.std.450) 49(SmoothStep) 363 364 362
+                              Store 305(f32v3) 365
+             367:   26(float) Load 301(f32)
+             368:   107(bool) IsNan 367
+                              Store 366(b) 368
+             369:  153(fvec3) Load 280(f32v1)
+             370:  158(bvec3) IsInf 369
+                              Store 345(bv) 370
+             371:  153(fvec3) Load 280(f32v1)
+             372:  153(fvec3) Load 279(f32v2)
+             373:  153(fvec3) Load 305(f32v3)
+             374:  153(fvec3) ExtInst 1(GLSL.std.450) 50(Fma) 371 372 373
+                              Store 305(f32v3) 374
+             375:  153(fvec3) Load 280(f32v1)
+             378:377(ResType) ExtInst 1(GLSL.std.450) 52(FrexpStruct) 375
+             379:  193(ivec3) CompositeExtract 378 1
+                              Store 376(iv) 379
+             380:  153(fvec3) CompositeExtract 378 0
+                              Store 279(f32v2) 380
+             381:  153(fvec3) Load 280(f32v1)
+             382:  193(ivec3) Load 376(iv)
+             383:  153(fvec3) ExtInst 1(GLSL.std.450) 53(Ldexp) 381 382
+                              Store 279(f32v2) 383
+                              Return
+                              FunctionEnd
+18(builtinGeometryFuncs():           2 Function None 3
+              19:             Label
+        384(f32):     33(ptr) Variable Function
+      385(f32v1):    154(ptr) Variable Function
+      389(f32v2):    154(ptr) Variable Function
+      395(f32v3):    154(ptr) Variable Function
+             386:  153(fvec3) Load 385(f32v1)
+             387:   26(float) ExtInst 1(GLSL.std.450) 66(Length) 386
+                              Store 384(f32) 387
+             388:  153(fvec3) Load 385(f32v1)
+             390:  153(fvec3) Load 389(f32v2)
+             391:   26(float) ExtInst 1(GLSL.std.450) 67(Distance) 388 390
+                              Store 384(f32) 391
+             392:  153(fvec3) Load 385(f32v1)
+             393:  153(fvec3) Load 389(f32v2)
+             394:   26(float) Dot 392 393
+                              Store 384(f32) 394
+             396:  153(fvec3) Load 385(f32v1)
+             397:  153(fvec3) Load 389(f32v2)
+             398:  153(fvec3) ExtInst 1(GLSL.std.450) 68(Cross) 396 397
+                              Store 395(f32v3) 398
+             399:  153(fvec3) Load 385(f32v1)
+             400:  153(fvec3) ExtInst 1(GLSL.std.450) 69(Normalize) 399
+                              Store 389(f32v2) 400
+             401:  153(fvec3) Load 385(f32v1)
+             402:  153(fvec3) Load 389(f32v2)
+             403:  153(fvec3) Load 395(f32v3)
+             404:  153(fvec3) ExtInst 1(GLSL.std.450) 70(FaceForward) 401 402 403
+                              Store 395(f32v3) 404
+             405:  153(fvec3) Load 385(f32v1)
+             406:  153(fvec3) Load 389(f32v2)
+             407:  153(fvec3) ExtInst 1(GLSL.std.450) 71(Reflect) 405 406
+                              Store 395(f32v3) 407
+             408:  153(fvec3) Load 385(f32v1)
+             409:  153(fvec3) Load 389(f32v2)
+             410:   26(float) Load 384(f32)
+             411:  153(fvec3) ExtInst 1(GLSL.std.450) 72(Refract) 408 409 410
+                              Store 395(f32v3) 411
+                              Return
+                              FunctionEnd
+20(builtinMatrixFuncs():           2 Function None 3
+              21:             Label
+      414(f32m3):    413(ptr) Variable Function
+      415(f32m1):    413(ptr) Variable Function
+      417(f32m2):    413(ptr) Variable Function
+      426(f32v1):    154(ptr) Variable Function
+      428(f32v2):     28(ptr) Variable Function
+      433(f32m4):    432(ptr) Variable Function
+        436(f32):     33(ptr) Variable Function
+      439(f32m5):    438(ptr) Variable Function
+      444(f32m6):    443(ptr) Variable Function
+      445(f32m7):    443(ptr) Variable Function
+             416:         412 Load 415(f32m1)
+             418:         412 Load 417(f32m2)
+             419:  153(fvec3) CompositeExtract 416 0
+             420:  153(fvec3) CompositeExtract 418 0
+             421:  153(fvec3) FMul 419 420
+             422:  153(fvec3) CompositeExtract 416 1
+             423:  153(fvec3) CompositeExtract 418 1
+             424:  153(fvec3) FMul 422 423
+             425:         412 CompositeConstruct 421 424
+                              Store 414(f32m3) 425
+             427:  153(fvec3) Load 426(f32v1)
+             429:   27(fvec2) Load 428(f32v2)
+             430:         412 OuterProduct 427 429
+                              Store 415(f32m1) 430
+             434:         412 Load 415(f32m1)
+             435:         431 Transpose 434
+                              Store 433(f32m4) 435
+             440:         437 Load 439(f32m5)
+             441:   26(float) ExtInst 1(GLSL.std.450) 33(Determinant) 440
+                              Store 436(f32) 441
+             446:         442 Load 445(f32m7)
+             447:         442 ExtInst 1(GLSL.std.450) 34(MatrixInverse) 446
+                              Store 444(f32m6) 447
+                              Return
+                              FunctionEnd
+22(builtinVecRelFuncs():           2 Function None 3
+              23:             Label
+         448(bv):    159(ptr) Variable Function
+      449(f32v1):    154(ptr) Variable Function
+      451(f32v2):    154(ptr) Variable Function
+             450:  153(fvec3) Load 449(f32v1)
+             452:  153(fvec3) Load 451(f32v2)
+             453:  158(bvec3) FOrdLessThan 450 452
+                              Store 448(bv) 453
+             454:  153(fvec3) Load 449(f32v1)
+             455:  153(fvec3) Load 451(f32v2)
+             456:  158(bvec3) FOrdLessThanEqual 454 455
+                              Store 448(bv) 456
+             457:  153(fvec3) Load 449(f32v1)
+             458:  153(fvec3) Load 451(f32v2)
+             459:  158(bvec3) FOrdGreaterThan 457 458
+                              Store 448(bv) 459
+             460:  153(fvec3) Load 449(f32v1)
+             461:  153(fvec3) Load 451(f32v2)
+             462:  158(bvec3) FOrdGreaterThanEqual 460 461
+                              Store 448(bv) 462
+             463:  153(fvec3) Load 449(f32v1)
+             464:  153(fvec3) Load 451(f32v2)
+             465:  158(bvec3) FOrdEqual 463 464
+                              Store 448(bv) 465
+             466:  153(fvec3) Load 449(f32v1)
+             467:  153(fvec3) Load 451(f32v2)
+             468:  158(bvec3) FOrdNotEqual 466 467
+                              Store 448(bv) 468
+                              Return
+                              FunctionEnd
+24(builtinFragProcFuncs():           2 Function None 3
+              25:             Label
+       469(f32v):    154(ptr) Variable Function
+             473:    472(ptr) AccessChain 471(if32v) 32
+             474:   26(float) Load 473
+             475:   26(float) DPdx 474
+             476:     33(ptr) AccessChain 469(f32v) 32
+                              Store 476 475
+             477:    472(ptr) AccessChain 471(if32v) 88
+             478:   26(float) Load 477
+             479:   26(float) DPdy 478
+             480:     33(ptr) AccessChain 469(f32v) 88
+                              Store 480 479
+             481:  153(fvec3) Load 471(if32v)
+             482:   27(fvec2) VectorShuffle 481 481 0 1
+             483:   27(fvec2) DPdxFine 482
+             484:  153(fvec3) Load 469(f32v)
+             485:  153(fvec3) VectorShuffle 484 483 3 4 2
+                              Store 469(f32v) 485
+             486:  153(fvec3) Load 471(if32v)
+             487:   27(fvec2) VectorShuffle 486 486 0 1
+             488:   27(fvec2) DPdyFine 487
+             489:  153(fvec3) Load 469(f32v)
+             490:  153(fvec3) VectorShuffle 489 488 3 4 2
+                              Store 469(f32v) 490
+             491:  153(fvec3) Load 471(if32v)
+             492:  153(fvec3) DPdxCoarse 491
+                              Store 469(f32v) 492
+             493:  153(fvec3) Load 471(if32v)
+             494:  153(fvec3) DPdxCoarse 493
+                              Store 469(f32v) 494
+             495:    472(ptr) AccessChain 471(if32v) 32
+             496:   26(float) Load 495
+             497:   26(float) Fwidth 496
+             498:     33(ptr) AccessChain 469(f32v) 32
+                              Store 498 497
+             499:  153(fvec3) Load 471(if32v)
+             500:   27(fvec2) VectorShuffle 499 499 0 1
+             501:   27(fvec2) FwidthFine 500
+             502:  153(fvec3) Load 469(f32v)
+             503:  153(fvec3) VectorShuffle 502 501 3 4 2
+                              Store 469(f32v) 503
+             504:  153(fvec3) Load 471(if32v)
+             505:  153(fvec3) FwidthCoarse 504
+                              Store 469(f32v) 505
+             506:    472(ptr) AccessChain 471(if32v) 32
+             507:   26(float) ExtInst 1(GLSL.std.450) 76(InterpolateAtCentroid) 506
+             508:     33(ptr) AccessChain 469(f32v) 32
+                              Store 508 507
+             510:  153(fvec3) ExtInst 1(GLSL.std.450) 77(InterpolateAtSample) 471(if32v) 509
+             511:   27(fvec2) VectorShuffle 510 510 0 1
+             512:  153(fvec3) Load 469(f32v)
+             513:  153(fvec3) VectorShuffle 512 511 3 4 2
+                              Store 469(f32v) 513
+             516:  153(fvec3) ExtInst 1(GLSL.std.450) 78(InterpolateAtOffset) 471(if32v) 515
+                              Store 469(f32v) 516
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.float64.frag.out b/Test/baseResults/spv.float64.frag.out
new file mode 100644
index 0000000..6c0bfe7
--- /dev/null
+++ b/Test/baseResults/spv.float64.frag.out
@@ -0,0 +1,799 @@
+spv.float64.frag
+error: SPIRV-Tools Validation Errors
+error: Capability Float16 is not allowed by Vulkan 1.1 specification (or requires extension)
+  OpCapability Float16
+
+// Module Version 10300
+// Generated by (magic number): 80007
+// Id's are bound by 524
+
+                              Capability Shader
+                              Capability Float16
+                              Capability Float64
+                              Capability Int64
+                              Capability Int16
+                              Capability Int8
+                              Capability DerivativeControl
+                              Capability InterpolationFunction
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 461
+                              ExecutionMode 4 OriginUpperLeft
+                              Source GLSL 450
+                              SourceExtension  "GL_EXT_shader_explicit_arithmetic_types"
+                              SourceExtension  "GL_EXT_shader_explicit_arithmetic_types_float16"
+                              SourceExtension  "GL_EXT_shader_explicit_arithmetic_types_float32"
+                              SourceExtension  "GL_EXT_shader_explicit_arithmetic_types_float64"
+                              SourceExtension  "GL_EXT_shader_explicit_arithmetic_types_int16"
+                              SourceExtension  "GL_EXT_shader_explicit_arithmetic_types_int32"
+                              SourceExtension  "GL_EXT_shader_explicit_arithmetic_types_int64"
+                              SourceExtension  "GL_EXT_shader_explicit_arithmetic_types_int8"
+                              Name 4  "main"
+                              Name 6  "literal("
+                              Name 8  "operators("
+                              Name 10  "typeCast("
+                              Name 12  "builtinAngleTrigFuncs("
+                              Name 14  "builtinExpFuncs("
+                              Name 16  "builtinCommonFuncs("
+                              Name 18  "builtinGeometryFuncs("
+                              Name 20  "builtinMatrixFuncs("
+                              Name 22  "builtinVecRelFuncs("
+                              Name 24  "builtinFragProcFuncs("
+                              Name 29  "f64v"
+                              Name 40  "f64v"
+                              Name 62  "f64m"
+                              Name 85  "f64"
+                              Name 109  "b"
+                              Name 151  "f64v"
+                              Name 154  "bv"
+                              Name 165  "f16v"
+                              Name 173  "i8v"
+                              Name 179  "i16v"
+                              Name 185  "i32v"
+                              Name 191  "i64v"
+                              Name 197  "u8v"
+                              Name 203  "u16v"
+                              Name 208  "u32v"
+                              Name 214  "u64v"
+                              Name 219  "f64v2"
+                              Name 220  "f64v1"
+                              Name 252  "f64v2"
+                              Name 253  "f64v1"
+                              Name 269  "f64v2"
+                              Name 270  "f64v1"
+                              Name 291  "f64"
+                              Name 295  "f64v3"
+                              Name 335  "bv"
+                              Name 356  "b"
+                              Name 366  "iv"
+                              Name 367  "ResType"
+                              Name 374  "f64"
+                              Name 375  "f64v1"
+                              Name 379  "f64v2"
+                              Name 385  "f64v3"
+                              Name 404  "f64m3"
+                              Name 405  "f64m1"
+                              Name 407  "f64m2"
+                              Name 416  "f64v1"
+                              Name 418  "f64v2"
+                              Name 423  "f64m4"
+                              Name 426  "f64"
+                              Name 429  "f64m5"
+                              Name 434  "f64m6"
+                              Name 435  "f64m7"
+                              Name 438  "bv"
+                              Name 439  "f64v1"
+                              Name 441  "f64v2"
+                              Name 459  "f64v"
+                              Name 461  "if64v"
+                              Name 510  "S"
+                              MemberName 510(S) 0  "x"
+                              MemberName 510(S) 1  "y"
+                              MemberName 510(S) 2  "z"
+                              Name 512  "B1"
+                              MemberName 512(B1) 0  "a"
+                              MemberName 512(B1) 1  "b"
+                              MemberName 512(B1) 2  "c"
+                              MemberName 512(B1) 3  "d"
+                              MemberName 512(B1) 4  "e"
+                              MemberName 512(B1) 5  "f"
+                              MemberName 512(B1) 6  "g"
+                              MemberName 512(B1) 7  "h"
+                              Name 514  ""
+                              Name 515  "sf16"
+                              Name 517  "sf"
+                              Name 518  "sd"
+                              Name 519  "f16_to_f"
+                              Name 521  "f16_to_d"
+                              Name 522  "f_to_f16"
+                              Name 523  "d_to_f16"
+                              Decorate 461(if64v) Flat
+                              Decorate 508 ArrayStride 16
+                              Decorate 509 ArrayStride 64
+                              MemberDecorate 510(S) 0 Offset 0
+                              MemberDecorate 510(S) 1 Offset 16
+                              MemberDecorate 510(S) 2 Offset 32
+                              Decorate 511 ArrayStride 64
+                              MemberDecorate 512(B1) 0 Offset 0
+                              MemberDecorate 512(B1) 1 Offset 16
+                              MemberDecorate 512(B1) 2 Offset 32
+                              MemberDecorate 512(B1) 3 Offset 64
+                              MemberDecorate 512(B1) 4 ColMajor
+                              MemberDecorate 512(B1) 4 Offset 96
+                              MemberDecorate 512(B1) 4 MatrixStride 32
+                              MemberDecorate 512(B1) 5 ColMajor
+                              MemberDecorate 512(B1) 5 Offset 160
+                              MemberDecorate 512(B1) 5 MatrixStride 32
+                              MemberDecorate 512(B1) 6 Offset 288
+                              MemberDecorate 512(B1) 7 Offset 352
+                              Decorate 512(B1) Block
+                              Decorate 514 DescriptorSet 0
+                              Decorate 515(sf16) SpecId 100
+                              Decorate 517(sf) SpecId 101
+                              Decorate 518(sd) SpecId 102
+               2:             TypeVoid
+               3:             TypeFunction 2
+              26:             TypeFloat 64
+              27:             TypeVector 26(float64_t) 2
+              28:             TypePointer Function 27(f64vec2)
+              30:26(float64_t) Constant 2696277389 1051772663
+              31:             TypeInt 32 0
+              32:     31(int) Constant 0
+              33:             TypePointer Function 26(float64_t)
+              35:26(float64_t) Constant 0 3218079744
+              36:26(float64_t) Constant 3951369912 1067366481
+              37: 27(f64vec2) ConstantComposite 35 36
+              54:26(float64_t) Constant 0 1072693248
+              60:             TypeMatrix 27(f64vec2) 2
+              61:             TypePointer Function 60
+              88:     31(int) Constant 1
+             107:             TypeBool
+             108:             TypePointer Function 107(bool)
+             149:             TypeVector 26(float64_t) 3
+             150:             TypePointer Function 149(f64vec3)
+             152:             TypeVector 107(bool) 3
+             153:             TypePointer Function 152(bvec3)
+             156:26(float64_t) Constant 0 0
+             157:149(f64vec3) ConstantComposite 156 156 156
+             158:149(f64vec3) ConstantComposite 54 54 54
+             162:             TypeFloat 16
+             163:             TypeVector 162(float16_t) 3
+             164:             TypePointer Function 163(f16vec3)
+             170:             TypeInt 8 1
+             171:             TypeVector 170(int8_t) 3
+             172:             TypePointer Function 171(i8vec3)
+             176:             TypeInt 16 1
+             177:             TypeVector 176(int16_t) 3
+             178:             TypePointer Function 177(i16vec3)
+             182:             TypeInt 32 1
+             183:             TypeVector 182(int) 3
+             184:             TypePointer Function 183(ivec3)
+             188:             TypeInt 64 1
+             189:             TypeVector 188(int64_t) 3
+             190:             TypePointer Function 189(i64vec3)
+             194:             TypeInt 8 0
+             195:             TypeVector 194(int8_t) 3
+             196:             TypePointer Function 195(i8vec3)
+             200:             TypeInt 16 0
+             201:             TypeVector 200(int16_t) 3
+             202:             TypePointer Function 201(i16vec3)
+             206:             TypeVector 31(int) 3
+             207:             TypePointer Function 206(ivec3)
+             211:             TypeInt 64 0
+             212:             TypeVector 211(int64_t) 3
+             213:             TypePointer Function 212(i64vec3)
+             217:             TypeVector 26(float64_t) 4
+             218:             TypePointer Function 217(f64vec4)
+    367(ResType):             TypeStruct 149(f64vec3) 183(ivec3)
+             402:             TypeMatrix 149(f64vec3) 2
+             403:             TypePointer Function 402
+             421:             TypeMatrix 27(f64vec2) 3
+             422:             TypePointer Function 421
+             427:             TypeMatrix 149(f64vec3) 3
+             428:             TypePointer Function 427
+             432:             TypeMatrix 217(f64vec4) 4
+             433:             TypePointer Function 432
+             460:             TypePointer Input 149(f64vec3)
+      461(if64v):    460(ptr) Variable Input
+             462:             TypePointer Input 26(float64_t)
+             499:    182(int) Constant 1
+             504:26(float64_t) Constant 0 1071644672
+             505: 27(f64vec2) ConstantComposite 504 504
+             507:     31(int) Constant 2
+             508:             TypeArray 26(float64_t) 507
+             509:             TypeArray 402 507
+          510(S):             TypeStruct 26(float64_t) 27(f64vec2) 149(f64vec3)
+             511:             TypeArray 510(S) 507
+         512(B1):             TypeStruct 26(float64_t) 27(f64vec2) 149(f64vec3) 508 402 509 510(S) 511
+             513:             TypePointer Uniform 512(B1)
+             514:    513(ptr) Variable Uniform
+       515(sf16):162(float16_t) SpecConstant 12288
+             516:             TypeFloat 32
+         517(sf):  516(float) SpecConstant 1048576000
+         518(sd):26(float64_t) SpecConstant 0 1071644672
+   519(f16_to_f):  516(float) SpecConstantOp 115 515(sf16)
+             520:  516(float) SpecConstantOp 115 515(sf16)
+   521(f16_to_d):26(float64_t) SpecConstantOp 115 520
+   522(f_to_f16):162(float16_t) SpecConstantOp 115 517(sf)
+   523(d_to_f16):162(float16_t) SpecConstantOp 115 518(sd)
+         4(main):           2 Function None 3
+               5:             Label
+                              Return
+                              FunctionEnd
+     6(literal():           2 Function None 3
+               7:             Label
+        29(f64v):     28(ptr) Variable Function
+              34:     33(ptr) AccessChain 29(f64v) 32
+                              Store 34 30
+              38: 27(f64vec2) Load 29(f64v)
+              39: 27(f64vec2) FAdd 38 37
+                              Store 29(f64v) 39
+                              Return
+                              FunctionEnd
+   8(operators():           2 Function None 3
+               9:             Label
+        40(f64v):     28(ptr) Variable Function
+        62(f64m):     61(ptr) Variable Function
+         85(f64):     33(ptr) Variable Function
+          109(b):    108(ptr) Variable Function
+              41: 27(f64vec2) Load 40(f64v)
+              42: 27(f64vec2) Load 40(f64v)
+              43: 27(f64vec2) FAdd 42 41
+                              Store 40(f64v) 43
+              44: 27(f64vec2) Load 40(f64v)
+              45: 27(f64vec2) Load 40(f64v)
+              46: 27(f64vec2) FSub 45 44
+                              Store 40(f64v) 46
+              47: 27(f64vec2) Load 40(f64v)
+              48: 27(f64vec2) Load 40(f64v)
+              49: 27(f64vec2) FMul 48 47
+                              Store 40(f64v) 49
+              50: 27(f64vec2) Load 40(f64v)
+              51: 27(f64vec2) Load 40(f64v)
+              52: 27(f64vec2) FDiv 51 50
+                              Store 40(f64v) 52
+              53: 27(f64vec2) Load 40(f64v)
+              55: 27(f64vec2) CompositeConstruct 54 54
+              56: 27(f64vec2) FAdd 53 55
+                              Store 40(f64v) 56
+              57: 27(f64vec2) Load 40(f64v)
+              58: 27(f64vec2) CompositeConstruct 54 54
+              59: 27(f64vec2) FSub 57 58
+                              Store 40(f64v) 59
+              63:          60 Load 62(f64m)
+              64: 27(f64vec2) CompositeConstruct 54 54
+              65: 27(f64vec2) CompositeExtract 63 0
+              66: 27(f64vec2) FAdd 65 64
+              67: 27(f64vec2) CompositeExtract 63 1
+              68: 27(f64vec2) FAdd 67 64
+              69:          60 CompositeConstruct 66 68
+                              Store 62(f64m) 69
+              70:          60 Load 62(f64m)
+              71: 27(f64vec2) CompositeConstruct 54 54
+              72: 27(f64vec2) CompositeExtract 70 0
+              73: 27(f64vec2) FSub 72 71
+              74: 27(f64vec2) CompositeExtract 70 1
+              75: 27(f64vec2) FSub 74 71
+              76:          60 CompositeConstruct 73 75
+                              Store 62(f64m) 76
+              77: 27(f64vec2) Load 40(f64v)
+              78: 27(f64vec2) FNegate 77
+                              Store 40(f64v) 78
+              79:          60 Load 62(f64m)
+              80: 27(f64vec2) CompositeExtract 79 0
+              81: 27(f64vec2) FNegate 80
+              82: 27(f64vec2) CompositeExtract 79 1
+              83: 27(f64vec2) FNegate 82
+              84:          60 CompositeConstruct 81 83
+                              Store 62(f64m) 84
+              86:     33(ptr) AccessChain 40(f64v) 32
+              87:26(float64_t) Load 86
+              89:     33(ptr) AccessChain 40(f64v) 88
+              90:26(float64_t) Load 89
+              91:26(float64_t) FAdd 87 90
+                              Store 85(f64) 91
+              92:     33(ptr) AccessChain 40(f64v) 32
+              93:26(float64_t) Load 92
+              94:     33(ptr) AccessChain 40(f64v) 88
+              95:26(float64_t) Load 94
+              96:26(float64_t) FSub 93 95
+                              Store 85(f64) 96
+              97:     33(ptr) AccessChain 40(f64v) 32
+              98:26(float64_t) Load 97
+              99:     33(ptr) AccessChain 40(f64v) 88
+             100:26(float64_t) Load 99
+             101:26(float64_t) FMul 98 100
+                              Store 85(f64) 101
+             102:     33(ptr) AccessChain 40(f64v) 32
+             103:26(float64_t) Load 102
+             104:     33(ptr) AccessChain 40(f64v) 88
+             105:26(float64_t) Load 104
+             106:26(float64_t) FDiv 103 105
+                              Store 85(f64) 106
+             110:     33(ptr) AccessChain 40(f64v) 32
+             111:26(float64_t) Load 110
+             112:26(float64_t) Load 85(f64)
+             113:   107(bool) FOrdNotEqual 111 112
+                              Store 109(b) 113
+             114:     33(ptr) AccessChain 40(f64v) 88
+             115:26(float64_t) Load 114
+             116:26(float64_t) Load 85(f64)
+             117:   107(bool) FOrdEqual 115 116
+                              Store 109(b) 117
+             118:     33(ptr) AccessChain 40(f64v) 32
+             119:26(float64_t) Load 118
+             120:26(float64_t) Load 85(f64)
+             121:   107(bool) FOrdGreaterThan 119 120
+                              Store 109(b) 121
+             122:     33(ptr) AccessChain 40(f64v) 88
+             123:26(float64_t) Load 122
+             124:26(float64_t) Load 85(f64)
+             125:   107(bool) FOrdLessThan 123 124
+                              Store 109(b) 125
+             126:     33(ptr) AccessChain 40(f64v) 32
+             127:26(float64_t) Load 126
+             128:26(float64_t) Load 85(f64)
+             129:   107(bool) FOrdGreaterThanEqual 127 128
+                              Store 109(b) 129
+             130:     33(ptr) AccessChain 40(f64v) 88
+             131:26(float64_t) Load 130
+             132:26(float64_t) Load 85(f64)
+             133:   107(bool) FOrdLessThanEqual 131 132
+                              Store 109(b) 133
+             134: 27(f64vec2) Load 40(f64v)
+             135:26(float64_t) Load 85(f64)
+             136: 27(f64vec2) VectorTimesScalar 134 135
+                              Store 40(f64v) 136
+             137:          60 Load 62(f64m)
+             138:26(float64_t) Load 85(f64)
+             139:          60 MatrixTimesScalar 137 138
+                              Store 62(f64m) 139
+             140:          60 Load 62(f64m)
+             141: 27(f64vec2) Load 40(f64v)
+             142: 27(f64vec2) MatrixTimesVector 140 141
+                              Store 40(f64v) 142
+             143: 27(f64vec2) Load 40(f64v)
+             144:          60 Load 62(f64m)
+             145: 27(f64vec2) VectorTimesMatrix 143 144
+                              Store 40(f64v) 145
+             146:          60 Load 62(f64m)
+             147:          60 Load 62(f64m)
+             148:          60 MatrixTimesMatrix 146 147
+                              Store 62(f64m) 148
+                              Return
+                              FunctionEnd
+   10(typeCast():           2 Function None 3
+              11:             Label
+       151(f64v):    150(ptr) Variable Function
+         154(bv):    153(ptr) Variable Function
+       165(f16v):    164(ptr) Variable Function
+        173(i8v):    172(ptr) Variable Function
+       179(i16v):    178(ptr) Variable Function
+       185(i32v):    184(ptr) Variable Function
+       191(i64v):    190(ptr) Variable Function
+        197(u8v):    196(ptr) Variable Function
+       203(u16v):    202(ptr) Variable Function
+       208(u32v):    207(ptr) Variable Function
+       214(u64v):    213(ptr) Variable Function
+             155:  152(bvec3) Load 154(bv)
+             159:149(f64vec3) Select 155 158 157
+                              Store 151(f64v) 159
+             160:149(f64vec3) Load 151(f64v)
+             161:  152(bvec3) FOrdNotEqual 160 157
+                              Store 154(bv) 161
+             166:163(f16vec3) Load 165(f16v)
+             167:149(f64vec3) FConvert 166
+                              Store 151(f64v) 167
+             168:149(f64vec3) Load 151(f64v)
+             169:163(f16vec3) FConvert 168
+                              Store 165(f16v) 169
+             174:149(f64vec3) Load 151(f64v)
+             175: 171(i8vec3) ConvertFToS 174
+                              Store 173(i8v) 175
+             180:149(f64vec3) Load 151(f64v)
+             181:177(i16vec3) ConvertFToS 180
+                              Store 179(i16v) 181
+             186:149(f64vec3) Load 151(f64v)
+             187:  183(ivec3) ConvertFToS 186
+                              Store 185(i32v) 187
+             192:149(f64vec3) Load 151(f64v)
+             193:189(i64vec3) ConvertFToS 192
+                              Store 191(i64v) 193
+             198:149(f64vec3) Load 151(f64v)
+             199: 195(i8vec3) ConvertFToU 198
+                              Store 197(u8v) 199
+             204:149(f64vec3) Load 151(f64v)
+             205:201(i16vec3) ConvertFToU 204
+                              Store 203(u16v) 205
+             209:149(f64vec3) Load 151(f64v)
+             210:  206(ivec3) ConvertFToU 209
+                              Store 208(u32v) 210
+             215:149(f64vec3) Load 151(f64v)
+             216:212(i64vec3) ConvertFToU 215
+                              Store 214(u64v) 216
+                              Return
+                              FunctionEnd
+12(builtinAngleTrigFuncs():           2 Function None 3
+              13:             Label
+      219(f64v2):    218(ptr) Variable Function
+      220(f64v1):    218(ptr) Variable Function
+             221:217(f64vec4) Load 220(f64v1)
+             222:217(f64vec4) ExtInst 1(GLSL.std.450) 11(Radians) 221
+                              Store 219(f64v2) 222
+             223:217(f64vec4) Load 220(f64v1)
+             224:217(f64vec4) ExtInst 1(GLSL.std.450) 12(Degrees) 223
+                              Store 219(f64v2) 224
+             225:217(f64vec4) Load 220(f64v1)
+             226:217(f64vec4) ExtInst 1(GLSL.std.450) 13(Sin) 225
+                              Store 219(f64v2) 226
+             227:217(f64vec4) Load 220(f64v1)
+             228:217(f64vec4) ExtInst 1(GLSL.std.450) 14(Cos) 227
+                              Store 219(f64v2) 228
+             229:217(f64vec4) Load 220(f64v1)
+             230:217(f64vec4) ExtInst 1(GLSL.std.450) 15(Tan) 229
+                              Store 219(f64v2) 230
+             231:217(f64vec4) Load 220(f64v1)
+             232:217(f64vec4) ExtInst 1(GLSL.std.450) 16(Asin) 231
+                              Store 219(f64v2) 232
+             233:217(f64vec4) Load 220(f64v1)
+             234:217(f64vec4) ExtInst 1(GLSL.std.450) 17(Acos) 233
+                              Store 219(f64v2) 234
+             235:217(f64vec4) Load 220(f64v1)
+             236:217(f64vec4) Load 219(f64v2)
+             237:217(f64vec4) ExtInst 1(GLSL.std.450) 25(Atan2) 235 236
+                              Store 219(f64v2) 237
+             238:217(f64vec4) Load 220(f64v1)
+             239:217(f64vec4) ExtInst 1(GLSL.std.450) 18(Atan) 238
+                              Store 219(f64v2) 239
+             240:217(f64vec4) Load 220(f64v1)
+             241:217(f64vec4) ExtInst 1(GLSL.std.450) 19(Sinh) 240
+                              Store 219(f64v2) 241
+             242:217(f64vec4) Load 220(f64v1)
+             243:217(f64vec4) ExtInst 1(GLSL.std.450) 20(Cosh) 242
+                              Store 219(f64v2) 243
+             244:217(f64vec4) Load 220(f64v1)
+             245:217(f64vec4) ExtInst 1(GLSL.std.450) 21(Tanh) 244
+                              Store 219(f64v2) 245
+             246:217(f64vec4) Load 220(f64v1)
+             247:217(f64vec4) ExtInst 1(GLSL.std.450) 22(Asinh) 246
+                              Store 219(f64v2) 247
+             248:217(f64vec4) Load 220(f64v1)
+             249:217(f64vec4) ExtInst 1(GLSL.std.450) 23(Acosh) 248
+                              Store 219(f64v2) 249
+             250:217(f64vec4) Load 220(f64v1)
+             251:217(f64vec4) ExtInst 1(GLSL.std.450) 24(Atanh) 250
+                              Store 219(f64v2) 251
+                              Return
+                              FunctionEnd
+14(builtinExpFuncs():           2 Function None 3
+              15:             Label
+      252(f64v2):     28(ptr) Variable Function
+      253(f64v1):     28(ptr) Variable Function
+             254: 27(f64vec2) Load 253(f64v1)
+             255: 27(f64vec2) Load 252(f64v2)
+             256: 27(f64vec2) ExtInst 1(GLSL.std.450) 26(Pow) 254 255
+                              Store 252(f64v2) 256
+             257: 27(f64vec2) Load 253(f64v1)
+             258: 27(f64vec2) ExtInst 1(GLSL.std.450) 27(Exp) 257
+                              Store 252(f64v2) 258
+             259: 27(f64vec2) Load 253(f64v1)
+             260: 27(f64vec2) ExtInst 1(GLSL.std.450) 28(Log) 259
+                              Store 252(f64v2) 260
+             261: 27(f64vec2) Load 253(f64v1)
+             262: 27(f64vec2) ExtInst 1(GLSL.std.450) 29(Exp2) 261
+                              Store 252(f64v2) 262
+             263: 27(f64vec2) Load 253(f64v1)
+             264: 27(f64vec2) ExtInst 1(GLSL.std.450) 30(Log2) 263
+                              Store 252(f64v2) 264
+             265: 27(f64vec2) Load 253(f64v1)
+             266: 27(f64vec2) ExtInst 1(GLSL.std.450) 31(Sqrt) 265
+                              Store 252(f64v2) 266
+             267: 27(f64vec2) Load 253(f64v1)
+             268: 27(f64vec2) ExtInst 1(GLSL.std.450) 32(InverseSqrt) 267
+                              Store 252(f64v2) 268
+                              Return
+                              FunctionEnd
+16(builtinCommonFuncs():           2 Function None 3
+              17:             Label
+      269(f64v2):    150(ptr) Variable Function
+      270(f64v1):    150(ptr) Variable Function
+        291(f64):     33(ptr) Variable Function
+      295(f64v3):    150(ptr) Variable Function
+         335(bv):    153(ptr) Variable Function
+          356(b):    108(ptr) Variable Function
+         366(iv):    184(ptr) Variable Function
+             271:149(f64vec3) Load 270(f64v1)
+             272:149(f64vec3) ExtInst 1(GLSL.std.450) 4(FAbs) 271
+                              Store 269(f64v2) 272
+             273:149(f64vec3) Load 270(f64v1)
+             274:149(f64vec3) ExtInst 1(GLSL.std.450) 6(FSign) 273
+                              Store 269(f64v2) 274
+             275:149(f64vec3) Load 270(f64v1)
+             276:149(f64vec3) ExtInst 1(GLSL.std.450) 8(Floor) 275
+                              Store 269(f64v2) 276
+             277:149(f64vec3) Load 270(f64v1)
+             278:149(f64vec3) ExtInst 1(GLSL.std.450) 3(Trunc) 277
+                              Store 269(f64v2) 278
+             279:149(f64vec3) Load 270(f64v1)
+             280:149(f64vec3) ExtInst 1(GLSL.std.450) 1(Round) 279
+                              Store 269(f64v2) 280
+             281:149(f64vec3) Load 270(f64v1)
+             282:149(f64vec3) ExtInst 1(GLSL.std.450) 2(RoundEven) 281
+                              Store 269(f64v2) 282
+             283:149(f64vec3) Load 270(f64v1)
+             284:149(f64vec3) ExtInst 1(GLSL.std.450) 9(Ceil) 283
+                              Store 269(f64v2) 284
+             285:149(f64vec3) Load 270(f64v1)
+             286:149(f64vec3) ExtInst 1(GLSL.std.450) 10(Fract) 285
+                              Store 269(f64v2) 286
+             287:149(f64vec3) Load 270(f64v1)
+             288:149(f64vec3) Load 269(f64v2)
+             289:149(f64vec3) FMod 287 288
+                              Store 269(f64v2) 289
+             290:149(f64vec3) Load 270(f64v1)
+             292:26(float64_t) Load 291(f64)
+             293:149(f64vec3) CompositeConstruct 292 292 292
+             294:149(f64vec3) FMod 290 293
+                              Store 269(f64v2) 294
+             296:149(f64vec3) Load 270(f64v1)
+             297:149(f64vec3) ExtInst 1(GLSL.std.450) 35(Modf) 296 269(f64v2)
+                              Store 295(f64v3) 297
+             298:149(f64vec3) Load 270(f64v1)
+             299:149(f64vec3) Load 269(f64v2)
+             300:149(f64vec3) ExtInst 1(GLSL.std.450) 37(FMin) 298 299
+                              Store 295(f64v3) 300
+             301:149(f64vec3) Load 270(f64v1)
+             302:26(float64_t) Load 291(f64)
+             303:149(f64vec3) CompositeConstruct 302 302 302
+             304:149(f64vec3) ExtInst 1(GLSL.std.450) 37(FMin) 301 303
+                              Store 295(f64v3) 304
+             305:149(f64vec3) Load 270(f64v1)
+             306:149(f64vec3) Load 269(f64v2)
+             307:149(f64vec3) ExtInst 1(GLSL.std.450) 40(FMax) 305 306
+                              Store 295(f64v3) 307
+             308:149(f64vec3) Load 270(f64v1)
+             309:26(float64_t) Load 291(f64)
+             310:149(f64vec3) CompositeConstruct 309 309 309
+             311:149(f64vec3) ExtInst 1(GLSL.std.450) 40(FMax) 308 310
+                              Store 295(f64v3) 311
+             312:149(f64vec3) Load 270(f64v1)
+             313:26(float64_t) Load 291(f64)
+             314:     33(ptr) AccessChain 269(f64v2) 32
+             315:26(float64_t) Load 314
+             316:149(f64vec3) CompositeConstruct 313 313 313
+             317:149(f64vec3) CompositeConstruct 315 315 315
+             318:149(f64vec3) ExtInst 1(GLSL.std.450) 43(FClamp) 312 316 317
+                              Store 295(f64v3) 318
+             319:149(f64vec3) Load 270(f64v1)
+             320:149(f64vec3) Load 269(f64v2)
+             321:26(float64_t) Load 291(f64)
+             322:149(f64vec3) CompositeConstruct 321 321 321
+             323:149(f64vec3) ExtInst 1(GLSL.std.450) 43(FClamp) 319 320 322
+                              Store 295(f64v3) 323
+             324:149(f64vec3) Load 270(f64v1)
+             325:149(f64vec3) Load 269(f64v2)
+             326:26(float64_t) Load 291(f64)
+             327:149(f64vec3) CompositeConstruct 326 326 326
+             328:149(f64vec3) ExtInst 1(GLSL.std.450) 46(FMix) 324 325 327
+                              Store 295(f64v3) 328
+             329:149(f64vec3) Load 270(f64v1)
+             330:149(f64vec3) Load 269(f64v2)
+             331:149(f64vec3) Load 295(f64v3)
+             332:149(f64vec3) ExtInst 1(GLSL.std.450) 46(FMix) 329 330 331
+                              Store 295(f64v3) 332
+             333:149(f64vec3) Load 270(f64v1)
+             334:149(f64vec3) Load 269(f64v2)
+             336:  152(bvec3) Load 335(bv)
+             337:149(f64vec3) Select 336 334 333
+                              Store 295(f64v3) 337
+             338:149(f64vec3) Load 270(f64v1)
+             339:149(f64vec3) Load 269(f64v2)
+             340:149(f64vec3) ExtInst 1(GLSL.std.450) 48(Step) 338 339
+                              Store 295(f64v3) 340
+             341:26(float64_t) Load 291(f64)
+             342:149(f64vec3) Load 295(f64v3)
+             343:149(f64vec3) CompositeConstruct 341 341 341
+             344:149(f64vec3) ExtInst 1(GLSL.std.450) 48(Step) 343 342
+                              Store 295(f64v3) 344
+             345:149(f64vec3) Load 270(f64v1)
+             346:149(f64vec3) Load 269(f64v2)
+             347:149(f64vec3) Load 295(f64v3)
+             348:149(f64vec3) ExtInst 1(GLSL.std.450) 49(SmoothStep) 345 346 347
+                              Store 295(f64v3) 348
+             349:26(float64_t) Load 291(f64)
+             350:     33(ptr) AccessChain 270(f64v1) 32
+             351:26(float64_t) Load 350
+             352:149(f64vec3) Load 269(f64v2)
+             353:149(f64vec3) CompositeConstruct 349 349 349
+             354:149(f64vec3) CompositeConstruct 351 351 351
+             355:149(f64vec3) ExtInst 1(GLSL.std.450) 49(SmoothStep) 353 354 352
+                              Store 295(f64v3) 355
+             357:26(float64_t) Load 291(f64)
+             358:   107(bool) IsNan 357
+                              Store 356(b) 358
+             359:149(f64vec3) Load 270(f64v1)
+             360:  152(bvec3) IsInf 359
+                              Store 335(bv) 360
+             361:149(f64vec3) Load 270(f64v1)
+             362:149(f64vec3) Load 269(f64v2)
+             363:149(f64vec3) Load 295(f64v3)
+             364:149(f64vec3) ExtInst 1(GLSL.std.450) 50(Fma) 361 362 363
+                              Store 295(f64v3) 364
+             365:149(f64vec3) Load 270(f64v1)
+             368:367(ResType) ExtInst 1(GLSL.std.450) 52(FrexpStruct) 365
+             369:  183(ivec3) CompositeExtract 368 1
+                              Store 366(iv) 369
+             370:149(f64vec3) CompositeExtract 368 0
+                              Store 269(f64v2) 370
+             371:149(f64vec3) Load 270(f64v1)
+             372:  183(ivec3) Load 366(iv)
+             373:149(f64vec3) ExtInst 1(GLSL.std.450) 53(Ldexp) 371 372
+                              Store 269(f64v2) 373
+                              Return
+                              FunctionEnd
+18(builtinGeometryFuncs():           2 Function None 3
+              19:             Label
+        374(f64):     33(ptr) Variable Function
+      375(f64v1):    150(ptr) Variable Function
+      379(f64v2):    150(ptr) Variable Function
+      385(f64v3):    150(ptr) Variable Function
+             376:149(f64vec3) Load 375(f64v1)
+             377:26(float64_t) ExtInst 1(GLSL.std.450) 66(Length) 376
+                              Store 374(f64) 377
+             378:149(f64vec3) Load 375(f64v1)
+             380:149(f64vec3) Load 379(f64v2)
+             381:26(float64_t) ExtInst 1(GLSL.std.450) 67(Distance) 378 380
+                              Store 374(f64) 381
+             382:149(f64vec3) Load 375(f64v1)
+             383:149(f64vec3) Load 379(f64v2)
+             384:26(float64_t) Dot 382 383
+                              Store 374(f64) 384
+             386:149(f64vec3) Load 375(f64v1)
+             387:149(f64vec3) Load 379(f64v2)
+             388:149(f64vec3) ExtInst 1(GLSL.std.450) 68(Cross) 386 387
+                              Store 385(f64v3) 388
+             389:149(f64vec3) Load 375(f64v1)
+             390:149(f64vec3) ExtInst 1(GLSL.std.450) 69(Normalize) 389
+                              Store 379(f64v2) 390
+             391:149(f64vec3) Load 375(f64v1)
+             392:149(f64vec3) Load 379(f64v2)
+             393:149(f64vec3) Load 385(f64v3)
+             394:149(f64vec3) ExtInst 1(GLSL.std.450) 70(FaceForward) 391 392 393
+                              Store 385(f64v3) 394
+             395:149(f64vec3) Load 375(f64v1)
+             396:149(f64vec3) Load 379(f64v2)
+             397:149(f64vec3) ExtInst 1(GLSL.std.450) 71(Reflect) 395 396
+                              Store 385(f64v3) 397
+             398:149(f64vec3) Load 375(f64v1)
+             399:149(f64vec3) Load 379(f64v2)
+             400:26(float64_t) Load 374(f64)
+             401:149(f64vec3) ExtInst 1(GLSL.std.450) 72(Refract) 398 399 400
+                              Store 385(f64v3) 401
+                              Return
+                              FunctionEnd
+20(builtinMatrixFuncs():           2 Function None 3
+              21:             Label
+      404(f64m3):    403(ptr) Variable Function
+      405(f64m1):    403(ptr) Variable Function
+      407(f64m2):    403(ptr) Variable Function
+      416(f64v1):    150(ptr) Variable Function
+      418(f64v2):     28(ptr) Variable Function
+      423(f64m4):    422(ptr) Variable Function
+        426(f64):     33(ptr) Variable Function
+      429(f64m5):    428(ptr) Variable Function
+      434(f64m6):    433(ptr) Variable Function
+      435(f64m7):    433(ptr) Variable Function
+             406:         402 Load 405(f64m1)
+             408:         402 Load 407(f64m2)
+             409:149(f64vec3) CompositeExtract 406 0
+             410:149(f64vec3) CompositeExtract 408 0
+             411:149(f64vec3) FMul 409 410
+             412:149(f64vec3) CompositeExtract 406 1
+             413:149(f64vec3) CompositeExtract 408 1
+             414:149(f64vec3) FMul 412 413
+             415:         402 CompositeConstruct 411 414
+                              Store 404(f64m3) 415
+             417:149(f64vec3) Load 416(f64v1)
+             419: 27(f64vec2) Load 418(f64v2)
+             420:         402 OuterProduct 417 419
+                              Store 405(f64m1) 420
+             424:         402 Load 405(f64m1)
+             425:         421 Transpose 424
+                              Store 423(f64m4) 425
+             430:         427 Load 429(f64m5)
+             431:26(float64_t) ExtInst 1(GLSL.std.450) 33(Determinant) 430
+                              Store 426(f64) 431
+             436:         432 Load 435(f64m7)
+             437:         432 ExtInst 1(GLSL.std.450) 34(MatrixInverse) 436
+                              Store 434(f64m6) 437
+                              Return
+                              FunctionEnd
+22(builtinVecRelFuncs():           2 Function None 3
+              23:             Label
+         438(bv):    153(ptr) Variable Function
+      439(f64v1):    150(ptr) Variable Function
+      441(f64v2):    150(ptr) Variable Function
+             440:149(f64vec3) Load 439(f64v1)
+             442:149(f64vec3) Load 441(f64v2)
+             443:  152(bvec3) FOrdLessThan 440 442
+                              Store 438(bv) 443
+             444:149(f64vec3) Load 439(f64v1)
+             445:149(f64vec3) Load 441(f64v2)
+             446:  152(bvec3) FOrdLessThanEqual 444 445
+                              Store 438(bv) 446
+             447:149(f64vec3) Load 439(f64v1)
+             448:149(f64vec3) Load 441(f64v2)
+             449:  152(bvec3) FOrdGreaterThan 447 448
+                              Store 438(bv) 449
+             450:149(f64vec3) Load 439(f64v1)
+             451:149(f64vec3) Load 441(f64v2)
+             452:  152(bvec3) FOrdGreaterThanEqual 450 451
+                              Store 438(bv) 452
+             453:149(f64vec3) Load 439(f64v1)
+             454:149(f64vec3) Load 441(f64v2)
+             455:  152(bvec3) FOrdEqual 453 454
+                              Store 438(bv) 455
+             456:149(f64vec3) Load 439(f64v1)
+             457:149(f64vec3) Load 441(f64v2)
+             458:  152(bvec3) FOrdNotEqual 456 457
+                              Store 438(bv) 458
+                              Return
+                              FunctionEnd
+24(builtinFragProcFuncs():           2 Function None 3
+              25:             Label
+       459(f64v):    150(ptr) Variable Function
+             463:    462(ptr) AccessChain 461(if64v) 32
+             464:26(float64_t) Load 463
+             465:26(float64_t) DPdx 464
+             466:     33(ptr) AccessChain 459(f64v) 32
+                              Store 466 465
+             467:    462(ptr) AccessChain 461(if64v) 88
+             468:26(float64_t) Load 467
+             469:26(float64_t) DPdy 468
+             470:     33(ptr) AccessChain 459(f64v) 88
+                              Store 470 469
+             471:149(f64vec3) Load 461(if64v)
+             472: 27(f64vec2) VectorShuffle 471 471 0 1
+             473: 27(f64vec2) DPdxFine 472
+             474:149(f64vec3) Load 459(f64v)
+             475:149(f64vec3) VectorShuffle 474 473 3 4 2
+                              Store 459(f64v) 475
+             476:149(f64vec3) Load 461(if64v)
+             477: 27(f64vec2) VectorShuffle 476 476 0 1
+             478: 27(f64vec2) DPdyFine 477
+             479:149(f64vec3) Load 459(f64v)
+             480:149(f64vec3) VectorShuffle 479 478 3 4 2
+                              Store 459(f64v) 480
+             481:149(f64vec3) Load 461(if64v)
+             482:149(f64vec3) DPdxCoarse 481
+                              Store 459(f64v) 482
+             483:149(f64vec3) Load 461(if64v)
+             484:149(f64vec3) DPdxCoarse 483
+                              Store 459(f64v) 484
+             485:    462(ptr) AccessChain 461(if64v) 32
+             486:26(float64_t) Load 485
+             487:26(float64_t) Fwidth 486
+             488:     33(ptr) AccessChain 459(f64v) 32
+                              Store 488 487
+             489:149(f64vec3) Load 461(if64v)
+             490: 27(f64vec2) VectorShuffle 489 489 0 1
+             491: 27(f64vec2) FwidthFine 490
+             492:149(f64vec3) Load 459(f64v)
+             493:149(f64vec3) VectorShuffle 492 491 3 4 2
+                              Store 459(f64v) 493
+             494:149(f64vec3) Load 461(if64v)
+             495:149(f64vec3) FwidthCoarse 494
+                              Store 459(f64v) 495
+             496:    462(ptr) AccessChain 461(if64v) 32
+             497:26(float64_t) ExtInst 1(GLSL.std.450) 76(InterpolateAtCentroid) 496
+             498:     33(ptr) AccessChain 459(f64v) 32
+                              Store 498 497
+             500:149(f64vec3) ExtInst 1(GLSL.std.450) 77(InterpolateAtSample) 461(if64v) 499
+             501: 27(f64vec2) VectorShuffle 500 500 0 1
+             502:149(f64vec3) Load 459(f64v)
+             503:149(f64vec3) VectorShuffle 502 501 3 4 2
+                              Store 459(f64v) 503
+             506:149(f64vec3) ExtInst 1(GLSL.std.450) 78(InterpolateAtOffset) 461(if64v) 505
+                              Store 459(f64v) 506
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.flowControl.frag.out b/Test/baseResults/spv.flowControl.frag.out
old mode 100755
new mode 100644
index 274cb74..30c2a4b
--- a/Test/baseResults/spv.flowControl.frag.out
+++ b/Test/baseResults/spv.flowControl.frag.out
@@ -1,6 +1,6 @@
 spv.flowControl.frag
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 39
 
                               Capability Shader
@@ -19,6 +19,7 @@
                               Name 25  "bigColor"
                               Name 30  "smallColor"
                               Name 35  "gl_FragColor"
+                              Decorate 35(gl_FragColor) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
diff --git a/Test/baseResults/spv.for-complex-condition.vert.out b/Test/baseResults/spv.for-complex-condition.vert.out
index 939d082..41275a4 100644
--- a/Test/baseResults/spv.for-complex-condition.vert.out
+++ b/Test/baseResults/spv.for-complex-condition.vert.out
@@ -1,8 +1,6 @@
 spv.for-complex-condition.vert
-Warning, version 450 is not yet complete; most version-specific features are present, but some are missing.
-
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 31
 
                               Capability Shader
diff --git a/Test/baseResults/spv.for-continue-break.vert.out b/Test/baseResults/spv.for-continue-break.vert.out
index 764001d..ff94a93 100644
--- a/Test/baseResults/spv.for-continue-break.vert.out
+++ b/Test/baseResults/spv.for-continue-break.vert.out
@@ -1,8 +1,6 @@
 spv.for-continue-break.vert
-Warning, version 310 is not yet complete; most version-specific features are present, but some are missing.
-
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 45
 
                               Capability Shader
diff --git a/Test/baseResults/spv.for-nobody.vert.out b/Test/baseResults/spv.for-nobody.vert.out
index 0ec3584..2a3bcf4 100644
--- a/Test/baseResults/spv.for-nobody.vert.out
+++ b/Test/baseResults/spv.for-nobody.vert.out
@@ -1,8 +1,6 @@
 spv.for-nobody.vert
-Warning, version 450 is not yet complete; most version-specific features are present, but some are missing.
-
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 25
 
                               Capability Shader
diff --git a/Test/baseResults/spv.for-notest.vert.out b/Test/baseResults/spv.for-notest.vert.out
index c7346f9..36c4a96 100644
--- a/Test/baseResults/spv.for-notest.vert.out
+++ b/Test/baseResults/spv.for-notest.vert.out
@@ -1,8 +1,6 @@
 spv.for-notest.vert
-Warning, version 450 is not yet complete; most version-specific features are present, but some are missing.
-
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 20
 
                               Capability Shader
diff --git a/Test/baseResults/spv.for-simple.vert.out b/Test/baseResults/spv.for-simple.vert.out
old mode 100755
new mode 100644
index 996b65a..ecb539f
--- a/Test/baseResults/spv.for-simple.vert.out
+++ b/Test/baseResults/spv.for-simple.vert.out
@@ -1,8 +1,6 @@
 spv.for-simple.vert
-Warning, version 310 is not yet complete; most version-specific features are present, but some are missing.
-
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 24
 
                               Capability Shader
diff --git a/Test/baseResults/spv.forLoop.frag.out b/Test/baseResults/spv.forLoop.frag.out
old mode 100755
new mode 100644
index 628c791..a07921c
--- a/Test/baseResults/spv.forLoop.frag.out
+++ b/Test/baseResults/spv.forLoop.frag.out
@@ -1,6 +1,6 @@
 spv.forLoop.frag
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 131
 
                               Capability Shader
@@ -26,6 +26,7 @@
                               Name 104  "f"
                               Name 117  "i"
                               Decorate 24(Count) Flat
+                              Decorate 36(gl_FragColor) Location 0
                               Decorate 53(v4) Flat
                2:             TypeVoid
                3:             TypeFunction 2
diff --git a/Test/baseResults/spv.forwardFun.frag.out b/Test/baseResults/spv.forwardFun.frag.out
old mode 100755
new mode 100644
index 6575953..32875b2
--- a/Test/baseResults/spv.forwardFun.frag.out
+++ b/Test/baseResults/spv.forwardFun.frag.out
@@ -1,6 +1,6 @@
 spv.forwardFun.frag
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 60
 
                               Capability Shader
@@ -32,6 +32,7 @@
                               Decorate 27(f) RelaxedPrecision
                               Decorate 28 RelaxedPrecision
                               Decorate 30(gl_FragColor) RelaxedPrecision
+                              Decorate 30(gl_FragColor) Location 0
                               Decorate 31 RelaxedPrecision
                               Decorate 32 RelaxedPrecision
                               Decorate 33 RelaxedPrecision
diff --git a/Test/baseResults/spv.fragmentDensity-es.frag.out b/Test/baseResults/spv.fragmentDensity-es.frag.out
new file mode 100644
index 0000000..01ac383
--- /dev/null
+++ b/Test/baseResults/spv.fragmentDensity-es.frag.out
@@ -0,0 +1,45 @@
+spv.fragmentDensity-es.frag
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 18
+
+                              Capability Shader
+                              Capability FragmentDensityEXT
+                              Extension  "SPV_EXT_fragment_invocation_density"
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 9 11 14 16
+                              ExecutionMode 4 OriginUpperLeft
+                              Source ESSL 310
+                              SourceExtension  "GL_EXT_fragment_invocation_density"
+                              Name 4  "main"
+                              Name 9  "FragSize"
+                              Name 11  "gl_FragSizeEXT"
+                              Name 14  "FragInvocationCount"
+                              Name 16  "gl_FragInvocationCountEXT"
+                              Decorate 9(FragSize) Location 0
+                              Decorate 11(gl_FragSizeEXT) Flat
+                              Decorate 11(gl_FragSizeEXT) BuiltIn FragSizeEXT
+                              Decorate 14(FragInvocationCount) Location 2
+                              Decorate 16(gl_FragInvocationCountEXT) Flat
+                              Decorate 16(gl_FragInvocationCountEXT) BuiltIn FragInvocationCountEXT
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeInt 32 1
+               7:             TypeVector 6(int) 2
+               8:             TypePointer Output 7(ivec2)
+     9(FragSize):      8(ptr) Variable Output
+              10:             TypePointer Input 7(ivec2)
+11(gl_FragSizeEXT):     10(ptr) Variable Input
+              13:             TypePointer Output 6(int)
+14(FragInvocationCount):     13(ptr) Variable Output
+              15:             TypePointer Input 6(int)
+16(gl_FragInvocationCountEXT):     15(ptr) Variable Input
+         4(main):           2 Function None 3
+               5:             Label
+              12:    7(ivec2) Load 11(gl_FragSizeEXT)
+                              Store 9(FragSize) 12
+              17:      6(int) Load 16(gl_FragInvocationCountEXT)
+                              Store 14(FragInvocationCount) 17
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.fragmentDensity-neg.frag.out b/Test/baseResults/spv.fragmentDensity-neg.frag.out
new file mode 100644
index 0000000..6b5078b
--- /dev/null
+++ b/Test/baseResults/spv.fragmentDensity-neg.frag.out
@@ -0,0 +1,7 @@
+spv.fragmentDensity-neg.frag
+ERROR: 0:10: 'gl_FragSizeEXT' : required extension not requested: GL_EXT_fragment_invocation_density
+ERROR: 0:11: 'gl_FragInvocationCountEXT' : required extension not requested: GL_EXT_fragment_invocation_density
+ERROR: 2 compilation errors.  No code generated.
+
+
+SPIR-V is not generated for failed compile or link
diff --git a/Test/baseResults/spv.fragmentDensity.frag.out b/Test/baseResults/spv.fragmentDensity.frag.out
new file mode 100644
index 0000000..8bbc37c
--- /dev/null
+++ b/Test/baseResults/spv.fragmentDensity.frag.out
@@ -0,0 +1,48 @@
+spv.fragmentDensity.frag
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 21
+
+                              Capability Shader
+                              Capability FragmentDensityEXT
+                              Extension  "SPV_EXT_fragment_invocation_density"
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 9 13 17 19
+                              ExecutionMode 4 OriginUpperLeft
+                              Source GLSL 450
+                              SourceExtension  "GL_EXT_fragment_invocation_density"
+                              Name 4  "main"
+                              Name 9  "FragSize"
+                              Name 13  "gl_FragSizeEXT"
+                              Name 17  "FragInvocationCount"
+                              Name 19  "gl_FragInvocationCountEXT"
+                              Decorate 9(FragSize) Location 0
+                              Decorate 13(gl_FragSizeEXT) Flat
+                              Decorate 13(gl_FragSizeEXT) BuiltIn FragSizeEXT
+                              Decorate 17(FragInvocationCount) Location 2
+                              Decorate 19(gl_FragInvocationCountEXT) Flat
+                              Decorate 19(gl_FragInvocationCountEXT) BuiltIn FragInvocationCountEXT
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 2
+               8:             TypePointer Output 7(fvec2)
+     9(FragSize):      8(ptr) Variable Output
+              10:             TypeInt 32 1
+              11:             TypeVector 10(int) 2
+              12:             TypePointer Input 11(ivec2)
+13(gl_FragSizeEXT):     12(ptr) Variable Input
+              16:             TypePointer Output 10(int)
+17(FragInvocationCount):     16(ptr) Variable Output
+              18:             TypePointer Input 10(int)
+19(gl_FragInvocationCountEXT):     18(ptr) Variable Input
+         4(main):           2 Function None 3
+               5:             Label
+              14:   11(ivec2) Load 13(gl_FragSizeEXT)
+              15:    7(fvec2) ConvertSToF 14
+                              Store 9(FragSize) 15
+              20:     10(int) Load 19(gl_FragInvocationCountEXT)
+                              Store 17(FragInvocationCount) 20
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.fragmentDensity.vert.out b/Test/baseResults/spv.fragmentDensity.vert.out
new file mode 100644
index 0000000..ff77a3e
--- /dev/null
+++ b/Test/baseResults/spv.fragmentDensity.vert.out
@@ -0,0 +1,9 @@
+spv.fragmentDensity.vert
+ERROR: 0:10: 'gl_FragSizeEXT' : undeclared identifier 
+ERROR: 0:10: 'assign' :  cannot convert from ' temp float' to 'layout( location=0) smooth out highp 2-component vector of uint'
+ERROR: 0:11: 'gl_FragInvocationCountEXT' : undeclared identifier 
+ERROR: 0:11: 'assign' :  cannot convert from ' temp float' to 'layout( location=2) smooth out highp int'
+ERROR: 4 compilation errors.  No code generated.
+
+
+SPIR-V is not generated for failed compile or link
diff --git a/Test/baseResults/spv.fragmentShaderBarycentric.frag.out b/Test/baseResults/spv.fragmentShaderBarycentric.frag.out
new file mode 100644
index 0000000..ffb3527
--- /dev/null
+++ b/Test/baseResults/spv.fragmentShaderBarycentric.frag.out
@@ -0,0 +1,69 @@
+spv.fragmentShaderBarycentric.frag
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 43
+
+                              Capability Shader
+                              Capability FragmentBarycentricNV
+                              Extension  "SPV_NV_fragment_shader_barycentric"
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 8 11 21
+                              ExecutionMode 4 OriginUpperLeft
+                              Source GLSL 450
+                              SourceExtension  "GL_NV_fragment_shader_barycentric"
+                              Name 4  "main"
+                              Name 8  "value"
+                              Name 11  "gl_BaryCoordNV"
+                              Name 17  "vertices"
+                              MemberName 17(vertices) 0  "attrib"
+                              Name 21  "v"
+                              Decorate 8(value) Location 1
+                              Decorate 11(gl_BaryCoordNV) BuiltIn BaryCoordNV
+                              Decorate 17(vertices) Block
+                              Decorate 21(v) Location 0
+                              Decorate 21(v) PerVertexNV
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypePointer Output 6(float)
+        8(value):      7(ptr) Variable Output
+               9:             TypeVector 6(float) 3
+              10:             TypePointer Input 9(fvec3)
+11(gl_BaryCoordNV):     10(ptr) Variable Input
+              12:             TypeInt 32 0
+              13:     12(int) Constant 0
+              14:             TypePointer Input 6(float)
+    17(vertices):             TypeStruct 6(float)
+              18:     12(int) Constant 3
+              19:             TypeArray 17(vertices) 18
+              20:             TypePointer Input 19
+           21(v):     20(ptr) Variable Input
+              22:             TypeInt 32 1
+              23:     22(int) Constant 0
+              27:     12(int) Constant 1
+              30:     22(int) Constant 1
+              35:     12(int) Constant 2
+              38:     22(int) Constant 2
+         4(main):           2 Function None 3
+               5:             Label
+              15:     14(ptr) AccessChain 11(gl_BaryCoordNV) 13
+              16:    6(float) Load 15
+              24:     14(ptr) AccessChain 21(v) 23 23
+              25:    6(float) Load 24
+              26:    6(float) FMul 16 25
+              28:     14(ptr) AccessChain 11(gl_BaryCoordNV) 27
+              29:    6(float) Load 28
+              31:     14(ptr) AccessChain 21(v) 30 23
+              32:    6(float) Load 31
+              33:    6(float) FMul 29 32
+              34:    6(float) FAdd 26 33
+              36:     14(ptr) AccessChain 11(gl_BaryCoordNV) 35
+              37:    6(float) Load 36
+              39:     14(ptr) AccessChain 21(v) 38 23
+              40:    6(float) Load 39
+              41:    6(float) FMul 37 40
+              42:    6(float) FAdd 34 41
+                              Store 8(value) 42
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.fragmentShaderBarycentric2.frag.out b/Test/baseResults/spv.fragmentShaderBarycentric2.frag.out
new file mode 100644
index 0000000..05dce7a
--- /dev/null
+++ b/Test/baseResults/spv.fragmentShaderBarycentric2.frag.out
@@ -0,0 +1,65 @@
+spv.fragmentShaderBarycentric2.frag
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 42
+
+                              Capability Shader
+                              Capability FragmentBarycentricNV
+                              Extension  "SPV_NV_fragment_shader_barycentric"
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 8 11 20
+                              ExecutionMode 4 OriginUpperLeft
+                              Source ESSL 320
+                              SourceExtension  "GL_NV_fragment_shader_barycentric"
+                              Name 4  "main"
+                              Name 8  "value"
+                              Name 11  "gl_BaryCoordNoPerspNV"
+                              Name 20  "vertexIDs"
+                              Decorate 8(value) Location 1
+                              Decorate 11(gl_BaryCoordNoPerspNV) BuiltIn BaryCoordNoPerspNV
+                              Decorate 20(vertexIDs) Location 0
+                              Decorate 20(vertexIDs) PerVertexNV
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypePointer Output 6(float)
+        8(value):      7(ptr) Variable Output
+               9:             TypeVector 6(float) 3
+              10:             TypePointer Input 9(fvec3)
+11(gl_BaryCoordNoPerspNV):     10(ptr) Variable Input
+              12:             TypeInt 32 0
+              13:     12(int) Constant 0
+              14:             TypePointer Input 6(float)
+              17:     12(int) Constant 3
+              18:             TypeArray 6(float) 17
+              19:             TypePointer Input 18
+   20(vertexIDs):     19(ptr) Variable Input
+              21:             TypeInt 32 1
+              22:     21(int) Constant 0
+              26:     12(int) Constant 1
+              29:     21(int) Constant 1
+              34:     12(int) Constant 2
+              37:     21(int) Constant 2
+         4(main):           2 Function None 3
+               5:             Label
+              15:     14(ptr) AccessChain 11(gl_BaryCoordNoPerspNV) 13
+              16:    6(float) Load 15
+              23:     14(ptr) AccessChain 20(vertexIDs) 22
+              24:    6(float) Load 23
+              25:    6(float) FMul 16 24
+              27:     14(ptr) AccessChain 11(gl_BaryCoordNoPerspNV) 26
+              28:    6(float) Load 27
+              30:     14(ptr) AccessChain 20(vertexIDs) 29
+              31:    6(float) Load 30
+              32:    6(float) FMul 28 31
+              33:    6(float) FAdd 25 32
+              35:     14(ptr) AccessChain 11(gl_BaryCoordNoPerspNV) 34
+              36:    6(float) Load 35
+              38:     14(ptr) AccessChain 20(vertexIDs) 37
+              39:    6(float) Load 38
+              40:    6(float) FMul 36 39
+              41:    6(float) FAdd 33 40
+                              Store 8(value) 41
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.fullyCovered.frag.out b/Test/baseResults/spv.fullyCovered.frag.out
new file mode 100644
index 0000000..76c8e44
--- /dev/null
+++ b/Test/baseResults/spv.fullyCovered.frag.out
@@ -0,0 +1,37 @@
+spv.fullyCovered.frag
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 18
+
+                              Capability Shader
+                              Capability FragmentFullyCoveredEXT
+                              Extension  "SPV_EXT_fragment_fully_covered"
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 9 12
+                              ExecutionMode 4 OriginUpperLeft
+                              Source GLSL 450
+                              SourceExtension  "GL_NV_conservative_raster_underestimation"
+                              Name 4  "main"
+                              Name 9  "color"
+                              Name 12  "gl_FragFullyCoveredNV"
+                              Decorate 12(gl_FragFullyCoveredNV) BuiltIn FullyCoveredEXT
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+               8:             TypePointer Output 7(fvec4)
+        9(color):      8(ptr) Variable Output
+              10:             TypeBool
+              11:             TypePointer Input 10(bool)
+12(gl_FragFullyCoveredNV):     11(ptr) Variable Input
+              14:    6(float) Constant 0
+              15:    6(float) Constant 1065353216
+         4(main):           2 Function None 3
+               5:             Label
+              13:    10(bool) Load 12(gl_FragFullyCoveredNV)
+              16:    6(float) Select 13 15 14
+              17:    7(fvec4) CompositeConstruct 16 14 14 14
+                              Store 9(color) 17
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.functionCall.frag.out b/Test/baseResults/spv.functionCall.frag.out
old mode 100755
new mode 100644
index 69a525f..269b74e
--- a/Test/baseResults/spv.functionCall.frag.out
+++ b/Test/baseResults/spv.functionCall.frag.out
@@ -4,7 +4,7 @@
 WARNING: 0:5: varying deprecated in version 130; may be removed in future release
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 76
 
                               Capability Shader
@@ -28,6 +28,7 @@
                               Name 66  "g"
                               Name 69  "gl_FragColor"
                               Name 75  "bigColor"
+                              Decorate 69(gl_FragColor) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
diff --git a/Test/baseResults/spv.functionNestedOpaque.vert.out b/Test/baseResults/spv.functionNestedOpaque.vert.out
index 1dae381..ff94077 100644
--- a/Test/baseResults/spv.functionNestedOpaque.vert.out
+++ b/Test/baseResults/spv.functionNestedOpaque.vert.out
@@ -1,8 +1,12 @@
 spv.functionNestedOpaque.vert
-Warning, version 450 is not yet complete; most version-specific features are present, but some are missing.
+error: SPIRV-Tools Validation Errors
+error: UniformConstant OpVariable <id> '36[si] 'has illegal type.
+From Vulkan spec, section 14.5.2:
+Variables identified with the UniformConstant storage class are used only as handles to refer to opaque resources. Such variables must be typed as OpTypeImage, OpTypeSampler, OpTypeSampledImage, OpTypeAccelerationStructureNV, or an array of one of these types.
+  %si = OpVariable %_ptr_UniformConstant_S UniformConstant
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 39
 
                               Capability Shader
diff --git a/Test/baseResults/spv.functionSemantics.frag.out b/Test/baseResults/spv.functionSemantics.frag.out
old mode 100755
new mode 100644
index 005a315..49bdf7c
--- a/Test/baseResults/spv.functionSemantics.frag.out
+++ b/Test/baseResults/spv.functionSemantics.frag.out
@@ -1,8 +1,6 @@
 spv.functionSemantics.frag
-Warning, version 400 is not yet complete; most version-specific features are present, but some are missing.
-
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 156
 
                               Capability Shader
@@ -44,6 +42,7 @@
                               Name 133  "param"
                               Name 136  "arg"
                               Name 152  "gl_FragColor"
+                              Decorate 152(gl_FragColor) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 32 1
diff --git a/Test/baseResults/spv.glFragColor.frag.out b/Test/baseResults/spv.glFragColor.frag.out
old mode 100755
new mode 100644
index febbdf4..55fb24f
--- a/Test/baseResults/spv.glFragColor.frag.out
+++ b/Test/baseResults/spv.glFragColor.frag.out
@@ -1,6 +1,6 @@
 spv.glFragColor.frag
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 12
 
                               Capability Shader
@@ -11,6 +11,7 @@
                               Source GLSL 330
                               Name 4  "main"
                               Name 9  "gl_FragColor"
+                              Decorate 9(gl_FragColor) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
diff --git a/Test/baseResults/spv.glsl.register.autoassign.frag.out b/Test/baseResults/spv.glsl.register.autoassign.frag.out
index 11818f6..079e8d5 100644
--- a/Test/baseResults/spv.glsl.register.autoassign.frag.out
+++ b/Test/baseResults/spv.glsl.register.autoassign.frag.out
@@ -1,8 +1,6 @@
 spv.glsl.register.autoassign.frag
-Warning, version 450 is not yet complete; most version-specific features are present, but some are missing.
-
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 142
 
                               Capability Shader
@@ -78,6 +76,7 @@
                               Decorate 126(g_tTex_unused2) DescriptorSet 0
                               Decorate 126(g_tTex_unused2) Binding 12
                               Decorate 128(g_sSamp_unused2) DescriptorSet 0
+                              Decorate 137(FragColor) Location 0
                               Decorate 141(g_tTex_unused3) DescriptorSet 0
                2:             TypeVoid
                3:             TypeFunction 2
diff --git a/Test/baseResults/spv.glsl.register.noautoassign.frag.out b/Test/baseResults/spv.glsl.register.noautoassign.frag.out
index 327ac04..44d63ed 100644
--- a/Test/baseResults/spv.glsl.register.noautoassign.frag.out
+++ b/Test/baseResults/spv.glsl.register.noautoassign.frag.out
@@ -1,8 +1,6 @@
 spv.glsl.register.noautoassign.frag
-Warning, version 450 is not yet complete; most version-specific features are present, but some are missing.
-
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 142
 
                               Capability Shader
@@ -43,19 +41,25 @@
                               Name 137  "FragColor"
                               Name 141  "g_tTex_unused3"
                               Decorate 17(g_tTex1) DescriptorSet 0
-                              Decorate 17(g_tTex1) Binding 11
+                              Decorate 17(g_tTex1) Binding 17
                               Decorate 21(g_sSamp1) DescriptorSet 0
                               Decorate 21(g_sSamp1) Binding 5
                               Decorate 27(g_tTex2) DescriptorSet 0
+                              Decorate 27(g_tTex2) Binding 18
                               Decorate 29(g_sSamp2) DescriptorSet 0
+                              Decorate 29(g_sSamp2) Binding 6
                               Decorate 39(g_tTex3) DescriptorSet 0
-                              Decorate 39(g_tTex3) Binding 13
+                              Decorate 39(g_tTex3) Binding 19
                               Decorate 46(g_sSamp3) DescriptorSet 0
                               Decorate 46(g_sSamp3) Binding 7
                               Decorate 64(g_tTex4) DescriptorSet 0
+                              Decorate 64(g_tTex4) Binding 20
                               Decorate 69(g_sSamp4) DescriptorSet 0
+                              Decorate 69(g_sSamp4) Binding 8
                               Decorate 84(g_tTex5) DescriptorSet 0
+                              Decorate 84(g_tTex5) Binding 21
                               Decorate 86(g_sSamp5) DescriptorSet 0
+                              Decorate 86(g_sSamp5) Binding 9
                               MemberDecorate 93(MyStruct_t) 0 Offset 0
                               MemberDecorate 93(MyStruct_t) 1 Offset 4
                               MemberDecorate 93(MyStruct_t) 2 Offset 16
@@ -67,12 +71,16 @@
                               Decorate 97 DescriptorSet 0
                               Decorate 97 Binding 19
                               Decorate 119(g_tTex_unused1) DescriptorSet 0
-                              Decorate 119(g_tTex_unused1) Binding 10
+                              Decorate 119(g_tTex_unused1) Binding 22
                               Decorate 121(g_sSamp_unused1) DescriptorSet 0
+                              Decorate 121(g_sSamp_unused1) Binding 10
                               Decorate 126(g_tTex_unused2) DescriptorSet 0
-                              Decorate 126(g_tTex_unused2) Binding 12
+                              Decorate 126(g_tTex_unused2) Binding 23
                               Decorate 128(g_sSamp_unused2) DescriptorSet 0
+                              Decorate 128(g_sSamp_unused2) Binding 11
+                              Decorate 137(FragColor) Location 0
                               Decorate 141(g_tTex_unused3) DescriptorSet 0
+                              Decorate 141(g_tTex_unused3) Binding 24
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
diff --git a/Test/baseResults/spv.hlslDebugInfo.frag.out b/Test/baseResults/spv.hlslDebugInfo.frag.out
new file mode 100644
index 0000000..9912d4e
--- /dev/null
+++ b/Test/baseResults/spv.hlslDebugInfo.frag.out
@@ -0,0 +1,58 @@
+spv.hlslDebugInfo.vert
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 19
+
+                              Capability Shader
+               2:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Vertex 5  "newMain" 17
+               1:             String  "spv.hlslDebugInfo.vert"
+                              Source HLSL 500 1  "// OpModuleProcessed entry-point newMain
+// OpModuleProcessed shift-sampler-binding 2
+// OpModuleProcessed shift-texture-binding 4
+// OpModuleProcessed shift-image-binding 1
+// OpModuleProcessed shift-UBO-binding 6
+// OpModuleProcessed shift-ssbo-binding 3
+// OpModuleProcessed shift-uav-binding 5
+// OpModuleProcessed flatten-uniform-arrays
+// OpModuleProcessed no-storage-format
+// OpModuleProcessed resource-set-binding t0 0 0
+// OpModuleProcessed hlsl-iomap
+// OpModuleProcessed auto-map-bindings
+// OpModuleProcessed auto-map-locations
+// OpModuleProcessed client vulkan100
+// OpModuleProcessed target-env vulkan1.0
+// OpModuleProcessed source-entrypoint origMain
+// OpModuleProcessed hlsl-offsets
+#line 1
+float4 origMain() : SV_Position
+{
+    return (float4)0;
+}
+"
+                              Name 5  "newMain"
+                              Name 10  "@newMain("
+                              Name 17  "@entryPointOutput"
+                              Decorate 17(@entryPointOutput) BuiltIn Position
+               3:             TypeVoid
+               4:             TypeFunction 3
+               7:             TypeFloat 32
+               8:             TypeVector 7(float) 4
+               9:             TypeFunction 8(fvec4)
+              12:    7(float) Constant 0
+              13:    8(fvec4) ConstantComposite 12 12 12 12
+              16:             TypePointer Output 8(fvec4)
+17(@entryPointOutput):     16(ptr) Variable Output
+      5(newMain):           3 Function None 4
+               6:             Label
+                              Line 1 2 0
+              18:    8(fvec4) FunctionCall 10(@newMain()
+                              Store 17(@entryPointOutput) 18
+                              Return
+                              FunctionEnd
+   10(@newMain():    8(fvec4) Function None 9
+              11:             Label
+                              Line 1 3 0
+                              ReturnValue 13
+                              FunctionEnd
diff --git a/Test/baseResults/spv.hlslOffsets.vert.out b/Test/baseResults/spv.hlslOffsets.vert.out
index c1f6cb2..af59fdb 100644
--- a/Test/baseResults/spv.hlslOffsets.vert.out
+++ b/Test/baseResults/spv.hlslOffsets.vert.out
@@ -1,6 +1,4 @@
 spv.hlslOffsets.vert
-Warning, version 450 is not yet complete; most version-specific features are present, but some are missing.
-
 Shader version: 450
 0:? Sequence
 0:27  Function Definition: main( ( global void)
@@ -20,7 +18,7 @@
 0:?     'anon@0' (layout( column_major std430) buffer block{layout( column_major std430) buffer highp float m0, layout( column_major std430) buffer highp 3-component vector of float m4, layout( column_major std430) buffer highp float m16, layout( column_major std430 offset=20) buffer highp 3-component vector of float m20, layout( column_major std430) buffer highp 3-component vector of float m32, layout( column_major std430) buffer highp 2-component vector of float m48, layout( column_major std430) buffer highp 2-component vector of float m56, layout( column_major std430) buffer highp float m64, layout( column_major std430) buffer highp 2-component vector of float m68, layout( column_major std430) buffer highp float m76, layout( column_major std430) buffer highp float m80, layout( column_major std430 offset=88) buffer highp 2-component vector of float m88, layout( column_major std430) buffer highp 2-component vector of float m96, layout( column_major std430) buffer 2-component vector of double m112})
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 14
 
                               Capability Shader
@@ -68,8 +66,8 @@
                7:             TypeVector 6(float) 3
                8:             TypeVector 6(float) 2
                9:             TypeFloat 64
-              10:             TypeVector 9(float) 2
-       11(block):             TypeStruct 6(float) 7(fvec3) 6(float) 7(fvec3) 7(fvec3) 8(fvec2) 8(fvec2) 6(float) 8(fvec2) 6(float) 6(float) 8(fvec2) 8(fvec2) 10(fvec2)
+              10:             TypeVector 9(float64_t) 2
+       11(block):             TypeStruct 6(float) 7(fvec3) 6(float) 7(fvec3) 7(fvec3) 8(fvec2) 8(fvec2) 6(float) 8(fvec2) 6(float) 6(float) 8(fvec2) 8(fvec2) 10(f64vec2)
               12:             TypePointer Uniform 11(block)
               13:     12(ptr) Variable Uniform
          4(main):           2 Function None 3
diff --git a/Test/baseResults/spv.image.frag.out b/Test/baseResults/spv.image.frag.out
index b4f673b..a544180 100644
--- a/Test/baseResults/spv.image.frag.out
+++ b/Test/baseResults/spv.image.frag.out
@@ -1,22 +1,25 @@
 spv.image.frag
-Warning, version 450 is not yet complete; most version-specific features are present, but some are missing.
+error: SPIRV-Tools Validation Errors
+error: Capability ImageRect is not allowed by Vulkan 1.0 specification (or requires extension)
+  OpCapability ImageRect
 
 // Module Version 10000
-// Generated by (magic number): 80001
-// Id's are bound by 376
+// Generated by (magic number): 80007
+// Id's are bound by 395
 
                               Capability Shader
-                              Capability SampledRect
-                              Capability Sampled1D
-                              Capability SampledCubeArray
-                              Capability SampledBuffer
+                              Capability StorageImageMultisample
+                              Capability ImageCubeArray
+                              Capability ImageRect
+                              Capability Image1D
+                              Capability ImageBuffer
                               Capability ImageMSArray
                               Capability StorageImageExtendedFormats
                               Capability ImageQuery
                               Capability StorageImageWriteWithoutFormat
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "main" 132 142 152 248 362 375
+                              EntryPoint Fragment 4  "main" 132 142 152 248 381 394
                               ExecutionMode 4 OriginUpperLeft
                               Source GLSL 450
                               Name 4  "main"
@@ -40,9 +43,11 @@
                               Name 232  "ii1D"
                               Name 245  "ui2D"
                               Name 248  "value"
-                              Name 357  "wo2D"
-                              Name 362  "fragData"
-                              Name 375  "ic4D"
+                              Name 357  "ii2DMS"
+                              Name 367  "ui2DMSArray"
+                              Name 376  "wo2D"
+                              Name 381  "fragData"
+                              Name 394  "ic4D"
                               Decorate 15(i1D) DescriptorSet 0
                               Decorate 15(i1D) Binding 0
                               Decorate 27(i2D) DescriptorSet 0
@@ -73,10 +78,14 @@
                               Decorate 245(ui2D) DescriptorSet 0
                               Decorate 245(ui2D) Binding 12
                               Decorate 248(value) Flat
-                              Decorate 357(wo2D) DescriptorSet 0
-                              Decorate 357(wo2D) Binding 1
-                              Decorate 357(wo2D) NonReadable
-                              Decorate 375(ic4D) Flat
+                              Decorate 357(ii2DMS) DescriptorSet 0
+                              Decorate 357(ii2DMS) Binding 13
+                              Decorate 367(ui2DMSArray) DescriptorSet 0
+                              Decorate 367(ui2DMSArray) Binding 14
+                              Decorate 376(wo2D) DescriptorSet 0
+                              Decorate 376(wo2D) Binding 1
+                              Decorate 376(wo2D) NonReadable
+                              Decorate 394(ic4D) Flat
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 32 1
@@ -158,16 +167,22 @@
              340:      6(int) Constant 18
              341:      6(int) Constant 17
              349:     18(int) Constant 19
-             355:             TypeImage 12(float) 2D nonsampled format:Unknown
+             355:             TypeImage 6(int) 2D multi-sampled nonsampled format:R32i
              356:             TypePointer UniformConstant 355
-       357(wo2D):    356(ptr) Variable UniformConstant
-             361:             TypePointer Output 125(fvec4)
-   362(fragData):    361(ptr) Variable Output
-             367:             TypeBool
-             370:             TypeVector 367(bool) 4
-             373:             TypeVector 6(int) 4
-             374:             TypePointer Input 373(ivec4)
-       375(ic4D):    374(ptr) Variable Input
+     357(ii2DMS):    356(ptr) Variable UniformConstant
+             365:             TypeImage 18(int) 2D array multi-sampled nonsampled format:R32ui
+             366:             TypePointer UniformConstant 365
+367(ui2DMSArray):    366(ptr) Variable UniformConstant
+             374:             TypeImage 12(float) 2D nonsampled format:Unknown
+             375:             TypePointer UniformConstant 374
+       376(wo2D):    375(ptr) Variable UniformConstant
+             380:             TypePointer Output 125(fvec4)
+   381(fragData):    380(ptr) Variable Output
+             386:             TypeBool
+             389:             TypeVector 386(bool) 4
+             392:             TypeVector 6(int) 4
+             393:             TypePointer Input 392(ivec4)
+       394(ic4D):    393(ptr) Variable Input
          4(main):           2 Function None 3
                5:             Label
            9(iv):      8(ptr) Variable Function
@@ -494,18 +509,33 @@
              353:     18(int) Load 229(ui)
              354:     18(int) IAdd 353 352
                               Store 229(ui) 354
-             358:         355 Load 357(wo2D)
-             359:   29(ivec2) Load 142(ic2D)
-             360:  125(fvec4) Load 127(v)
-                              ImageWrite 358 359 360
-             363:     18(int) Load 229(ui)
-             364:     20(ptr) AccessChain 9(iv) 237
-             365:      6(int) Load 364
-             366:     18(int) Bitcast 365
-             368:   367(bool) INotEqual 363 366
-             369:  125(fvec4) Load 127(v)
-             371:  370(bvec4) CompositeConstruct 368 368 368 368
-             372:  125(fvec4) Select 371 369 129
-                              Store 362(fragData) 372
+             358:   29(ivec2) Load 142(ic2D)
+             359:    235(ptr) ImageTexelPointer 357(ii2DMS) 358 216
+             360:      6(int) AtomicCompareExchange 359 237 19 19 341 340
+             361:     20(ptr) AccessChain 9(iv) 19
+             362:      6(int) Load 361
+             363:      6(int) IAdd 362 360
+             364:     20(ptr) AccessChain 9(iv) 19
+                              Store 364 363
+             368:    7(ivec3) Load 152(ic3D)
+             369:     18(int) Load 248(value)
+             370:    250(ptr) ImageTexelPointer 367(ui2DMSArray) 368 220
+             371:     18(int) AtomicCompareExchange 370 237 19 19 369 349
+             372:     18(int) Load 229(ui)
+             373:     18(int) IAdd 372 371
+                              Store 229(ui) 373
+             377:         374 Load 376(wo2D)
+             378:   29(ivec2) Load 142(ic2D)
+             379:  125(fvec4) Load 127(v)
+                              ImageWrite 377 378 379
+             382:     18(int) Load 229(ui)
+             383:     20(ptr) AccessChain 9(iv) 237
+             384:      6(int) Load 383
+             385:     18(int) Bitcast 384
+             387:   386(bool) INotEqual 382 385
+             388:  125(fvec4) Load 127(v)
+             390:  389(bvec4) CompositeConstruct 387 387 387 387
+             391:  125(fvec4) Select 390 388 129
+                              Store 381(fragData) 391
                               Return
                               FunctionEnd
diff --git a/Test/baseResults/spv.imageLoadStoreLod.frag.out b/Test/baseResults/spv.imageLoadStoreLod.frag.out
new file mode 100644
index 0000000..db9177d
--- /dev/null
+++ b/Test/baseResults/spv.imageLoadStoreLod.frag.out
@@ -0,0 +1,139 @@
+spv.imageLoadStoreLod.frag
+error: SPIRV-Tools Validation Errors
+error: Image Operand Lod can only be used with ExplicitLod opcodes and OpImageFetch
+  %19 = OpImageRead %v4float %15 %int_1 Lod %int_3
+
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 82
+
+                              Capability Shader
+                              Capability ImageCubeArray
+                              Capability SparseResidency
+                              Capability Image1D
+                              Capability ImageReadWriteLodAMD
+                              Extension  "SPV_AMD_shader_image_load_store_lod"
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 77
+                              ExecutionMode 4 OriginUpperLeft
+                              Source GLSL 450
+                              SourceExtension  "GL_AMD_shader_image_load_store_lod"
+                              Name 4  "main"
+                              Name 9  "f4"
+                              Name 14  "i1D"
+                              Name 24  "i2D"
+                              Name 34  "i3D"
+                              Name 46  "iiCube"
+                              Name 53  "ii1DArray"
+                              Name 60  "ui2DArray"
+                              Name 64  "u4"
+                              Name 65  "ResType"
+                              Name 71  "uiCubeArray"
+                              Name 77  "fragColor"
+                              Decorate 14(i1D) DescriptorSet 0
+                              Decorate 14(i1D) Binding 0
+                              Decorate 24(i2D) DescriptorSet 0
+                              Decorate 24(i2D) Binding 1
+                              Decorate 34(i3D) DescriptorSet 0
+                              Decorate 34(i3D) Binding 2
+                              Decorate 46(iiCube) DescriptorSet 0
+                              Decorate 46(iiCube) Binding 3
+                              Decorate 53(ii1DArray) DescriptorSet 0
+                              Decorate 53(ii1DArray) Binding 4
+                              Decorate 60(ui2DArray) DescriptorSet 0
+                              Decorate 60(ui2DArray) Binding 5
+                              Decorate 71(uiCubeArray) DescriptorSet 0
+                              Decorate 71(uiCubeArray) Binding 6
+                              Decorate 77(fragColor) Location 0
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+               8:             TypePointer Function 7(fvec4)
+              10:    6(float) Constant 0
+              11:    7(fvec4) ConstantComposite 10 10 10 10
+              12:             TypeImage 6(float) 1D nonsampled format:Rgba32f
+              13:             TypePointer UniformConstant 12
+         14(i1D):     13(ptr) Variable UniformConstant
+              16:             TypeInt 32 1
+              17:     16(int) Constant 1
+              18:     16(int) Constant 3
+              22:             TypeImage 6(float) 2D nonsampled format:Rgba32f
+              23:             TypePointer UniformConstant 22
+         24(i2D):     23(ptr) Variable UniformConstant
+              26:             TypeVector 16(int) 2
+              27:     16(int) Constant 2
+              28:   26(ivec2) ConstantComposite 27 18
+              32:             TypeImage 6(float) 3D nonsampled format:Rgba32f
+              33:             TypePointer UniformConstant 32
+         34(i3D):     33(ptr) Variable UniformConstant
+              36:             TypeVector 16(int) 3
+              37:     16(int) Constant 4
+              38:     16(int) Constant 5
+              39:     16(int) Constant 6
+              40:   36(ivec3) ConstantComposite 37 38 39
+              44:             TypeImage 16(int) Cube nonsampled format:Rgba32i
+              45:             TypePointer UniformConstant 44
+      46(iiCube):     45(ptr) Variable UniformConstant
+              49:             TypeVector 16(int) 4
+              51:             TypeImage 16(int) 1D array nonsampled format:Rgba32i
+              52:             TypePointer UniformConstant 51
+   53(ii1DArray):     52(ptr) Variable UniformConstant
+              57:             TypeInt 32 0
+              58:             TypeImage 57(int) 2D array nonsampled format:Rgba32ui
+              59:             TypePointer UniformConstant 58
+   60(ui2DArray):     59(ptr) Variable UniformConstant
+              62:             TypeVector 57(int) 4
+              63:             TypePointer Function 62(ivec4)
+     65(ResType):             TypeStruct 16(int) 62(ivec4)
+              69:             TypeImage 57(int) Cube array nonsampled format:Rgba32ui
+              70:             TypePointer UniformConstant 69
+ 71(uiCubeArray):     70(ptr) Variable UniformConstant
+              76:             TypePointer Output 7(fvec4)
+   77(fragColor):     76(ptr) Variable Output
+         4(main):           2 Function None 3
+               5:             Label
+           9(f4):      8(ptr) Variable Function
+          64(u4):     63(ptr) Variable Function
+                              Store 9(f4) 11
+              15:          12 Load 14(i1D)
+              19:    7(fvec4) ImageRead 15 17 Lod 18
+              20:    7(fvec4) Load 9(f4)
+              21:    7(fvec4) FAdd 20 19
+                              Store 9(f4) 21
+              25:          22 Load 24(i2D)
+              29:    7(fvec4) ImageRead 25 28 Lod 18
+              30:    7(fvec4) Load 9(f4)
+              31:    7(fvec4) FAdd 30 29
+                              Store 9(f4) 31
+              35:          32 Load 34(i3D)
+              41:    7(fvec4) ImageRead 35 40 Lod 18
+              42:    7(fvec4) Load 9(f4)
+              43:    7(fvec4) FAdd 42 41
+                              Store 9(f4) 43
+              47:          44 Load 46(iiCube)
+              48:    7(fvec4) Load 9(f4)
+              50:   49(ivec4) ConvertFToS 48
+                              ImageWrite 47 40 50 Lod 18
+              54:          51 Load 53(ii1DArray)
+              55:    7(fvec4) Load 9(f4)
+              56:   49(ivec4) ConvertFToS 55
+                              ImageWrite 54 28 56 Lod 18
+              61:          58 Load 60(ui2DArray)
+              66: 65(ResType) ImageSparseRead 61 40 Lod 18
+              67:   62(ivec4) CompositeExtract 66 1
+                              Store 64(u4) 67
+              68:     16(int) CompositeExtract 66 0
+              72:          69 Load 71(uiCubeArray)
+              73: 65(ResType) ImageSparseRead 72 40 Lod 18
+              74:   62(ivec4) CompositeExtract 73 1
+                              Store 64(u4) 74
+              75:     16(int) CompositeExtract 73 0
+              78:    7(fvec4) Load 9(f4)
+              79:   62(ivec4) Load 64(u4)
+              80:    7(fvec4) ConvertUToF 79
+              81:    7(fvec4) FAdd 78 80
+                              Store 77(fragColor) 81
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.int16.amd.frag.out b/Test/baseResults/spv.int16.amd.frag.out
new file mode 100644
index 0000000..0e3323b
--- /dev/null
+++ b/Test/baseResults/spv.int16.amd.frag.out
@@ -0,0 +1,803 @@
+spv.int16.amd.frag
+error: SPIRV-Tools Validation Errors
+error: Capability Float16 is not allowed by Vulkan 1.0 specification (or requires extension)
+  OpCapability Float16
+
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 560
+
+                              Capability Shader
+                              Capability Float16
+                              Capability Float64
+                              Capability Int64
+                              Capability Int16
+                              Capability StorageUniform16
+                              Capability StorageInputOutput16
+                              Extension  "SPV_AMD_gpu_shader_int16"
+                              Extension  "SPV_KHR_16bit_storage"
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 519 521
+                              ExecutionMode 4 OriginUpperLeft
+                              Source GLSL 450
+                              SourceExtension  "GL_AMD_gpu_shader_half_float"
+                              SourceExtension  "GL_AMD_gpu_shader_int16"
+                              SourceExtension  "GL_ARB_gpu_shader_int64"
+                              Name 4  "main"
+                              Name 6  "literal("
+                              Name 8  "operators("
+                              Name 10  "typeCast("
+                              Name 12  "builtinFuncs("
+                              Name 16  "u16"
+                              Name 25  "Uniforms"
+                              MemberName 25(Uniforms) 0  "i"
+                              Name 27  ""
+                              Name 34  "indexable"
+                              Name 45  "indexable"
+                              Name 51  "u16v"
+                              Name 57  "i16"
+                              Name 70  "u16"
+                              Name 127  "b"
+                              Name 148  "u"
+                              Name 159  "i"
+                              Name 189  "i16v"
+                              Name 192  "bv"
+                              Name 200  "u16v"
+                              Name 213  "iv"
+                              Name 226  "uv"
+                              Name 240  "fv"
+                              Name 252  "dv"
+                              Name 264  "f16v"
+                              Name 276  "i64v"
+                              Name 290  "u64v"
+                              Name 305  "i16v"
+                              Name 311  "i16"
+                              Name 319  "u16v"
+                              Name 321  "u16"
+                              Name 393  "f16v"
+                              Name 396  "exp"
+                              Name 397  "ResType"
+                              Name 418  "packi"
+                              Name 423  "packu"
+                              Name 432  "packi64"
+                              Name 441  "packu64"
+                              Name 450  "bv"
+                              Name 515  "Block"
+                              MemberName 515(Block) 0  "i16v"
+                              MemberName 515(Block) 1  "u16"
+                              Name 517  "block"
+                              Name 519  "iu16v"
+                              Name 521  "ii16"
+                              Name 522  "si64"
+                              Name 523  "su64"
+                              Name 524  "si"
+                              Name 525  "su"
+                              Name 526  "sb"
+                              Name 527  "si16"
+                              Name 528  "su16"
+                              Name 529  "i16_to_b"
+                              Name 530  "u16_to_b"
+                              Name 531  "b_to_i16"
+                              Name 532  "b_to_u16"
+                              Name 533  "i16_to_i"
+                              Name 535  "u16_to_i"
+                              Name 536  "i_to_i16"
+                              Name 538  "i_to_u16"
+                              Name 540  "i16_to_u"
+                              Name 541  "u16_to_u"
+                              Name 543  "u_to_i16"
+                              Name 544  "u_to_u16"
+                              Name 545  "i16_to_i64"
+                              Name 548  "u16_to_i64"
+                              Name 549  "i64_to_i16"
+                              Name 551  "i64_to_u16"
+                              Name 553  "i16_to_u64"
+                              Name 554  "u16_to_u64"
+                              Name 556  "u64_to_i16"
+                              Name 557  "u64_to_u16"
+                              Name 558  "i16_to_u16"
+                              Name 559  "u16_to_i16"
+                              MemberDecorate 25(Uniforms) 0 Offset 0
+                              Decorate 25(Uniforms) Block
+                              Decorate 27 DescriptorSet 0
+                              Decorate 27 Binding 0
+                              MemberDecorate 515(Block) 0 Offset 0
+                              MemberDecorate 515(Block) 1 Offset 6
+                              Decorate 515(Block) Block
+                              Decorate 517(block) DescriptorSet 0
+                              Decorate 517(block) Binding 1
+                              Decorate 519(iu16v) Flat
+                              Decorate 519(iu16v) Location 0
+                              Decorate 521(ii16) Flat
+                              Decorate 521(ii16) Location 1
+                              Decorate 522(si64) SpecId 100
+                              Decorate 523(su64) SpecId 101
+                              Decorate 524(si) SpecId 102
+                              Decorate 525(su) SpecId 103
+                              Decorate 526(sb) SpecId 104
+                              Decorate 527(si16) SpecId 105
+                              Decorate 528(su16) SpecId 106
+               2:             TypeVoid
+               3:             TypeFunction 2
+              14:             TypeInt 16 0
+              15:             TypePointer Function 14(int16_t)
+              17:             TypeInt 16 1
+              18:             TypeInt 32 0
+              19:     18(int) Constant 3
+              20:             TypeArray 17(int16_t) 19
+              21: 17(int16_t) Constant 273
+              22: 17(int16_t) Constant 4294967294
+              23: 17(int16_t) Constant 256
+              24:          20 ConstantComposite 21 22 23
+    25(Uniforms):             TypeStruct 18(int)
+              26:             TypePointer Uniform 25(Uniforms)
+              27:     26(ptr) Variable Uniform
+              28:             TypeInt 32 1
+              29:     28(int) Constant 0
+              30:             TypePointer Uniform 18(int)
+              33:             TypePointer Function 20
+              35:             TypePointer Function 17(int16_t)
+              39:             TypeArray 14(int16_t) 19
+              40: 14(int16_t) Constant 65535
+              41:          39 ConstantComposite 40 40 40
+              44:             TypePointer Function 39
+              49:             TypeVector 14(int16_t) 3
+              50:             TypePointer Function 49(i16vec3)
+              53: 17(int16_t) Constant 1
+              54:             TypeVector 17(int16_t) 3
+             111:     18(int) Constant 1
+             117:     18(int) Constant 2
+             125:             TypeBool
+             126:             TypePointer Function 125(bool)
+             128:     18(int) Constant 0
+             147:             TypePointer Function 18(int)
+             158:             TypePointer Function 28(int)
+             187:             TypeVector 17(int16_t) 2
+             188:             TypePointer Function 187(i16vec2)
+             190:             TypeVector 125(bool) 2
+             191:             TypePointer Function 190(bvec2)
+             194: 17(int16_t) Constant 0
+             195:187(i16vec2) ConstantComposite 194 194
+             196:187(i16vec2) ConstantComposite 53 53
+             198:             TypeVector 14(int16_t) 2
+             199:             TypePointer Function 198(i16vec2)
+             202: 14(int16_t) Constant 0
+             203: 14(int16_t) Constant 1
+             204:198(i16vec2) ConstantComposite 202 202
+             205:198(i16vec2) ConstantComposite 203 203
+             211:             TypeVector 28(int) 2
+             212:             TypePointer Function 211(ivec2)
+             222:             TypeVector 18(int) 2
+             225:             TypePointer Function 222(ivec2)
+             237:             TypeFloat 32
+             238:             TypeVector 237(float) 2
+             239:             TypePointer Function 238(fvec2)
+             249:             TypeFloat 64
+             250:             TypeVector 249(float64_t) 2
+             251:             TypePointer Function 250(f64vec2)
+             261:             TypeFloat 16
+             262:             TypeVector 261(float16_t) 2
+             263:             TypePointer Function 262(f16vec2)
+             273:             TypeInt 64 1
+             274:             TypeVector 273(int64_t) 2
+             275:             TypePointer Function 274(i64vec2)
+             285:             TypeInt 64 0
+             286:             TypeVector 285(int64_t) 2
+             289:             TypePointer Function 286(i64vec2)
+             316: 17(int16_t) Constant 4294967295
+             317:187(i16vec2) ConstantComposite 316 316
+             326: 49(i16vec3) ConstantComposite 202 202 202
+             368:   125(bool) ConstantTrue
+             375:   125(bool) ConstantFalse
+             376:  190(bvec2) ConstantComposite 375 375
+             388:             TypeVector 125(bool) 3
+             389:  388(bvec3) ConstantComposite 375 375 375
+             391:             TypeVector 261(float16_t) 3
+             392:             TypePointer Function 391(f16vec3)
+             395:             TypePointer Function 54(i16vec3)
+    397(ResType):             TypeStruct 391(f16vec3) 54(i16vec3)
+             407:             TypePointer Function 261(float16_t)
+             431:             TypePointer Function 273(int64_t)
+             434:             TypeVector 17(int16_t) 4
+             440:             TypePointer Function 285(int64_t)
+             443:             TypeVector 14(int16_t) 4
+             449:             TypePointer Function 388(bvec3)
+      515(Block):             TypeStruct 54(i16vec3) 14(int16_t)
+             516:             TypePointer Uniform 515(Block)
+      517(block):    516(ptr) Variable Uniform
+             518:             TypePointer Input 49(i16vec3)
+      519(iu16v):    518(ptr) Variable Input
+             520:             TypePointer Input 17(int16_t)
+       521(ii16):    520(ptr) Variable Input
+       522(si64):273(int64_t) SpecConstant 4294967286 4294967295
+       523(su64):285(int64_t) SpecConstant 20 0
+         524(si):     28(int) SpecConstant 4294967291
+         525(su):     18(int) SpecConstant 4
+         526(sb):   125(bool) SpecConstantTrue
+       527(si16): 17(int16_t) SpecConstant 4294967291
+       528(su16): 14(int16_t) SpecConstant 4
+   529(i16_to_b):   125(bool) SpecConstantOp 171 527(si16) 202
+   530(u16_to_b):   125(bool) SpecConstantOp 171 528(su16) 202
+   531(b_to_i16): 17(int16_t) SpecConstantOp 169 526(sb) 53 194
+   532(b_to_u16): 14(int16_t) SpecConstantOp 169 526(sb) 203 202
+   533(i16_to_i):     28(int) SpecConstantOp 114 527(si16)
+             534:     18(int) SpecConstantOp 113 528(su16)
+   535(u16_to_i):     28(int) SpecConstantOp 128 534 128
+   536(i_to_i16): 17(int16_t) SpecConstantOp 114 524(si)
+             537: 17(int16_t) SpecConstantOp 114 524(si)
+   538(i_to_u16): 14(int16_t) SpecConstantOp 128 537 202
+             539:     28(int) SpecConstantOp 114 527(si16)
+   540(i16_to_u):     18(int) SpecConstantOp 128 539 128
+   541(u16_to_u):     18(int) SpecConstantOp 113 528(su16)
+             542: 14(int16_t) SpecConstantOp 113 525(su)
+   543(u_to_i16): 17(int16_t) SpecConstantOp 128 542 202
+   544(u_to_u16): 14(int16_t) SpecConstantOp 113 525(su)
+ 545(i16_to_i64):273(int64_t) SpecConstantOp 114 527(si16)
+             546:285(int64_t) SpecConstantOp 113 528(su16)
+             547:285(int64_t) Constant 0 0
+ 548(u16_to_i64):273(int64_t) SpecConstantOp 128 546 547
+ 549(i64_to_i16): 17(int16_t) SpecConstantOp 114 522(si64)
+             550: 17(int16_t) SpecConstantOp 114 522(si64)
+ 551(i64_to_u16): 14(int16_t) SpecConstantOp 128 550 202
+             552:273(int64_t) SpecConstantOp 114 527(si16)
+ 553(i16_to_u64):285(int64_t) SpecConstantOp 128 552 547
+ 554(u16_to_u64):285(int64_t) SpecConstantOp 113 528(su16)
+             555: 14(int16_t) SpecConstantOp 113 523(su64)
+ 556(u64_to_i16): 17(int16_t) SpecConstantOp 128 555 202
+ 557(u64_to_u16): 14(int16_t) SpecConstantOp 113 523(su64)
+ 558(i16_to_u16): 14(int16_t) SpecConstantOp 128 527(si16) 202
+ 559(u16_to_i16): 17(int16_t) SpecConstantOp 128 528(su16) 202
+         4(main):           2 Function None 3
+               5:             Label
+             511:           2 FunctionCall 6(literal()
+             512:           2 FunctionCall 8(operators()
+             513:           2 FunctionCall 10(typeCast()
+             514:           2 FunctionCall 12(builtinFuncs()
+                              Return
+                              FunctionEnd
+     6(literal():           2 Function None 3
+               7:             Label
+         16(u16):     15(ptr) Variable Function
+   34(indexable):     33(ptr) Variable Function
+   45(indexable):     44(ptr) Variable Function
+              31:     30(ptr) AccessChain 27 29
+              32:     18(int) Load 31
+                              Store 34(indexable) 24
+              36:     35(ptr) AccessChain 34(indexable) 32
+              37: 17(int16_t) Load 36
+              38: 14(int16_t) Bitcast 37
+              42:     30(ptr) AccessChain 27 29
+              43:     18(int) Load 42
+                              Store 45(indexable) 41
+              46:     15(ptr) AccessChain 45(indexable) 43
+              47: 14(int16_t) Load 46
+              48: 14(int16_t) IAdd 38 47
+                              Store 16(u16) 48
+                              Return
+                              FunctionEnd
+   8(operators():           2 Function None 3
+               9:             Label
+        51(u16v):     50(ptr) Variable Function
+         57(i16):     35(ptr) Variable Function
+         70(u16):     15(ptr) Variable Function
+          127(b):    126(ptr) Variable Function
+          148(u):    147(ptr) Variable Function
+          159(i):    158(ptr) Variable Function
+              52: 49(i16vec3) Load 51(u16v)
+              55: 54(i16vec3) CompositeConstruct 53 53 53
+              56: 49(i16vec3) IAdd 52 55
+                              Store 51(u16v) 56
+              58: 17(int16_t) Load 57(i16)
+              59: 17(int16_t) ISub 58 53
+                              Store 57(i16) 59
+              60: 17(int16_t) Load 57(i16)
+              61: 17(int16_t) IAdd 60 53
+                              Store 57(i16) 61
+              62: 49(i16vec3) Load 51(u16v)
+              63: 54(i16vec3) CompositeConstruct 53 53 53
+              64: 49(i16vec3) ISub 62 63
+                              Store 51(u16v) 64
+              65: 49(i16vec3) Load 51(u16v)
+              66: 49(i16vec3) Not 65
+                              Store 51(u16v) 66
+              67: 17(int16_t) Load 57(i16)
+                              Store 57(i16) 67
+              68: 49(i16vec3) Load 51(u16v)
+              69: 49(i16vec3) SNegate 68
+                              Store 51(u16v) 69
+              71: 17(int16_t) Load 57(i16)
+              72: 14(int16_t) Bitcast 71
+              73: 14(int16_t) Load 70(u16)
+              74: 14(int16_t) IAdd 73 72
+                              Store 70(u16) 74
+              75: 49(i16vec3) Load 51(u16v)
+              76: 49(i16vec3) Load 51(u16v)
+              77: 49(i16vec3) ISub 76 75
+                              Store 51(u16v) 77
+              78: 17(int16_t) Load 57(i16)
+              79: 17(int16_t) Load 57(i16)
+              80: 17(int16_t) IMul 79 78
+                              Store 57(i16) 80
+              81: 49(i16vec3) Load 51(u16v)
+              82: 49(i16vec3) Load 51(u16v)
+              83: 49(i16vec3) UDiv 82 81
+                              Store 51(u16v) 83
+              84: 17(int16_t) Load 57(i16)
+              85: 14(int16_t) Bitcast 84
+              86: 49(i16vec3) Load 51(u16v)
+              87: 49(i16vec3) CompositeConstruct 85 85 85
+              88: 49(i16vec3) UMod 86 87
+                              Store 51(u16v) 88
+              89: 49(i16vec3) Load 51(u16v)
+              90: 49(i16vec3) Load 51(u16v)
+              91: 49(i16vec3) IAdd 89 90
+                              Store 51(u16v) 91
+              92: 17(int16_t) Load 57(i16)
+              93: 14(int16_t) Bitcast 92
+              94: 14(int16_t) Load 70(u16)
+              95: 14(int16_t) ISub 93 94
+                              Store 70(u16) 95
+              96: 49(i16vec3) Load 51(u16v)
+              97: 17(int16_t) Load 57(i16)
+              98: 14(int16_t) Bitcast 97
+              99: 49(i16vec3) CompositeConstruct 98 98 98
+             100: 49(i16vec3) IMul 96 99
+                              Store 51(u16v) 100
+             101: 17(int16_t) Load 57(i16)
+             102: 17(int16_t) Load 57(i16)
+             103: 17(int16_t) IMul 101 102
+                              Store 57(i16) 103
+             104: 17(int16_t) Load 57(i16)
+             105: 17(int16_t) Load 57(i16)
+             106: 17(int16_t) SMod 104 105
+                              Store 57(i16) 106
+             107: 17(int16_t) Load 57(i16)
+             108: 49(i16vec3) Load 51(u16v)
+             109: 54(i16vec3) CompositeConstruct 107 107 107
+             110: 49(i16vec3) ShiftLeftLogical 108 109
+                              Store 51(u16v) 110
+             112:     15(ptr) AccessChain 51(u16v) 111
+             113: 14(int16_t) Load 112
+             114: 17(int16_t) Load 57(i16)
+             115: 17(int16_t) ShiftRightArithmetic 114 113
+                              Store 57(i16) 115
+             116: 17(int16_t) Load 57(i16)
+             118:     15(ptr) AccessChain 51(u16v) 117
+             119: 14(int16_t) Load 118
+             120: 17(int16_t) ShiftLeftLogical 116 119
+                              Store 57(i16) 120
+             121: 49(i16vec3) Load 51(u16v)
+             122: 17(int16_t) Load 57(i16)
+             123: 54(i16vec3) CompositeConstruct 122 122 122
+             124: 49(i16vec3) ShiftLeftLogical 121 123
+                              Store 51(u16v) 124
+             129:     15(ptr) AccessChain 51(u16v) 128
+             130: 14(int16_t) Load 129
+             131: 17(int16_t) Load 57(i16)
+             132: 14(int16_t) Bitcast 131
+             133:   125(bool) INotEqual 130 132
+                              Store 127(b) 133
+             134: 17(int16_t) Load 57(i16)
+             135: 14(int16_t) Bitcast 134
+             136:     15(ptr) AccessChain 51(u16v) 128
+             137: 14(int16_t) Load 136
+             138:   125(bool) IEqual 135 137
+                              Store 127(b) 138
+             139:     15(ptr) AccessChain 51(u16v) 128
+             140: 14(int16_t) Load 139
+             141:     15(ptr) AccessChain 51(u16v) 111
+             142: 14(int16_t) Load 141
+             143:   125(bool) UGreaterThan 140 142
+                              Store 127(b) 143
+             144: 17(int16_t) Load 57(i16)
+             145:     28(int) SConvert 144
+             146:     18(int) Bitcast 145
+             149:     18(int) Load 148(u)
+             150:   125(bool) ULessThan 146 149
+                              Store 127(b) 150
+             151:     15(ptr) AccessChain 51(u16v) 111
+             152: 14(int16_t) Load 151
+             153:     15(ptr) AccessChain 51(u16v) 128
+             154: 14(int16_t) Load 153
+             155:   125(bool) UGreaterThanEqual 152 154
+                              Store 127(b) 155
+             156: 17(int16_t) Load 57(i16)
+             157:     28(int) SConvert 156
+             160:     28(int) Load 159(i)
+             161:   125(bool) SLessThanEqual 157 160
+                              Store 127(b) 161
+             162: 17(int16_t) Load 57(i16)
+             163: 14(int16_t) Bitcast 162
+             164: 49(i16vec3) Load 51(u16v)
+             165: 49(i16vec3) CompositeConstruct 163 163 163
+             166: 49(i16vec3) BitwiseOr 164 165
+                              Store 51(u16v) 166
+             167: 17(int16_t) Load 57(i16)
+             168: 14(int16_t) Bitcast 167
+             169: 14(int16_t) Load 70(u16)
+             170: 14(int16_t) BitwiseOr 168 169
+                              Store 70(u16) 170
+             171: 17(int16_t) Load 57(i16)
+             172: 17(int16_t) Load 57(i16)
+             173: 17(int16_t) BitwiseAnd 172 171
+                              Store 57(i16) 173
+             174: 49(i16vec3) Load 51(u16v)
+             175: 49(i16vec3) Load 51(u16v)
+             176: 49(i16vec3) BitwiseAnd 174 175
+                              Store 51(u16v) 176
+             177: 17(int16_t) Load 57(i16)
+             178: 14(int16_t) Bitcast 177
+             179: 49(i16vec3) Load 51(u16v)
+             180: 49(i16vec3) CompositeConstruct 178 178 178
+             181: 49(i16vec3) BitwiseXor 179 180
+                              Store 51(u16v) 181
+             182: 49(i16vec3) Load 51(u16v)
+             183: 17(int16_t) Load 57(i16)
+             184: 14(int16_t) Bitcast 183
+             185: 49(i16vec3) CompositeConstruct 184 184 184
+             186: 49(i16vec3) BitwiseXor 182 185
+                              Store 51(u16v) 186
+                              Return
+                              FunctionEnd
+   10(typeCast():           2 Function None 3
+              11:             Label
+       189(i16v):    188(ptr) Variable Function
+         192(bv):    191(ptr) Variable Function
+       200(u16v):    199(ptr) Variable Function
+         213(iv):    212(ptr) Variable Function
+         226(uv):    225(ptr) Variable Function
+         240(fv):    239(ptr) Variable Function
+         252(dv):    251(ptr) Variable Function
+       264(f16v):    263(ptr) Variable Function
+       276(i64v):    275(ptr) Variable Function
+       290(u64v):    289(ptr) Variable Function
+             193:  190(bvec2) Load 192(bv)
+             197:187(i16vec2) Select 193 196 195
+                              Store 189(i16v) 197
+             201:  190(bvec2) Load 192(bv)
+             206:198(i16vec2) Select 201 205 204
+                              Store 200(u16v) 206
+             207:187(i16vec2) Load 189(i16v)
+             208:  190(bvec2) INotEqual 207 204
+                              Store 192(bv) 208
+             209:198(i16vec2) Load 200(u16v)
+             210:  190(bvec2) INotEqual 209 204
+                              Store 192(bv) 210
+             214:  211(ivec2) Load 213(iv)
+             215:187(i16vec2) SConvert 214
+                              Store 189(i16v) 215
+             216:  211(ivec2) Load 213(iv)
+             217:187(i16vec2) SConvert 216
+             218:198(i16vec2) Bitcast 217
+                              Store 200(u16v) 218
+             219:187(i16vec2) Load 189(i16v)
+             220:  211(ivec2) SConvert 219
+                              Store 213(iv) 220
+             221:198(i16vec2) Load 200(u16v)
+             223:  222(ivec2) UConvert 221
+             224:  211(ivec2) Bitcast 223
+                              Store 213(iv) 224
+             227:  222(ivec2) Load 226(uv)
+             228:198(i16vec2) UConvert 227
+             229:187(i16vec2) Bitcast 228
+                              Store 189(i16v) 229
+             230:  222(ivec2) Load 226(uv)
+             231:198(i16vec2) UConvert 230
+                              Store 200(u16v) 231
+             232:187(i16vec2) Load 189(i16v)
+             233:  211(ivec2) SConvert 232
+             234:  222(ivec2) Bitcast 233
+                              Store 226(uv) 234
+             235:198(i16vec2) Load 200(u16v)
+             236:  222(ivec2) UConvert 235
+                              Store 226(uv) 236
+             241:  238(fvec2) Load 240(fv)
+             242:187(i16vec2) ConvertFToS 241
+                              Store 189(i16v) 242
+             243:  238(fvec2) Load 240(fv)
+             244:198(i16vec2) ConvertFToU 243
+                              Store 200(u16v) 244
+             245:187(i16vec2) Load 189(i16v)
+             246:  238(fvec2) ConvertSToF 245
+                              Store 240(fv) 246
+             247:198(i16vec2) Load 200(u16v)
+             248:  238(fvec2) ConvertUToF 247
+                              Store 240(fv) 248
+             253:250(f64vec2) Load 252(dv)
+             254:187(i16vec2) ConvertFToS 253
+                              Store 189(i16v) 254
+             255:250(f64vec2) Load 252(dv)
+             256:198(i16vec2) ConvertFToU 255
+                              Store 200(u16v) 256
+             257:187(i16vec2) Load 189(i16v)
+             258:250(f64vec2) ConvertSToF 257
+                              Store 252(dv) 258
+             259:198(i16vec2) Load 200(u16v)
+             260:250(f64vec2) ConvertUToF 259
+                              Store 252(dv) 260
+             265:262(f16vec2) Load 264(f16v)
+             266:187(i16vec2) ConvertFToS 265
+                              Store 189(i16v) 266
+             267:262(f16vec2) Load 264(f16v)
+             268:198(i16vec2) ConvertFToU 267
+                              Store 200(u16v) 268
+             269:187(i16vec2) Load 189(i16v)
+             270:262(f16vec2) ConvertSToF 269
+                              Store 264(f16v) 270
+             271:198(i16vec2) Load 200(u16v)
+             272:262(f16vec2) ConvertUToF 271
+                              Store 264(f16v) 272
+             277:274(i64vec2) Load 276(i64v)
+             278:187(i16vec2) SConvert 277
+                              Store 189(i16v) 278
+             279:274(i64vec2) Load 276(i64v)
+             280:187(i16vec2) SConvert 279
+             281:198(i16vec2) Bitcast 280
+                              Store 200(u16v) 281
+             282:187(i16vec2) Load 189(i16v)
+             283:274(i64vec2) SConvert 282
+                              Store 276(i64v) 283
+             284:198(i16vec2) Load 200(u16v)
+             287:286(i64vec2) UConvert 284
+             288:274(i64vec2) Bitcast 287
+                              Store 276(i64v) 288
+             291:286(i64vec2) Load 290(u64v)
+             292:198(i16vec2) UConvert 291
+             293:187(i16vec2) Bitcast 292
+                              Store 189(i16v) 293
+             294:286(i64vec2) Load 290(u64v)
+             295:198(i16vec2) UConvert 294
+                              Store 200(u16v) 295
+             296:187(i16vec2) Load 189(i16v)
+             297:274(i64vec2) SConvert 296
+             298:286(i64vec2) Bitcast 297
+                              Store 290(u64v) 298
+             299:198(i16vec2) Load 200(u16v)
+             300:286(i64vec2) UConvert 299
+                              Store 290(u64v) 300
+             301:198(i16vec2) Load 200(u16v)
+             302:187(i16vec2) Bitcast 301
+                              Store 189(i16v) 302
+             303:187(i16vec2) Load 189(i16v)
+             304:198(i16vec2) Bitcast 303
+                              Store 200(u16v) 304
+                              Return
+                              FunctionEnd
+12(builtinFuncs():           2 Function None 3
+              13:             Label
+       305(i16v):    188(ptr) Variable Function
+        311(i16):     35(ptr) Variable Function
+       319(u16v):     50(ptr) Variable Function
+        321(u16):     15(ptr) Variable Function
+       393(f16v):    392(ptr) Variable Function
+        396(exp):    395(ptr) Variable Function
+      418(packi):    158(ptr) Variable Function
+      423(packu):    147(ptr) Variable Function
+    432(packi64):    431(ptr) Variable Function
+    441(packu64):    440(ptr) Variable Function
+         450(bv):    449(ptr) Variable Function
+             306:187(i16vec2) Load 305(i16v)
+             307:187(i16vec2) ExtInst 1(GLSL.std.450) 5(SAbs) 306
+                              Store 305(i16v) 307
+             308:187(i16vec2) Load 305(i16v)
+             309:187(i16vec2) ExtInst 1(GLSL.std.450) 7(SSign) 308
+                              Store 305(i16v) 309
+             310:187(i16vec2) Load 305(i16v)
+             312: 17(int16_t) Load 311(i16)
+             313:187(i16vec2) CompositeConstruct 312 312
+             314:187(i16vec2) ExtInst 1(GLSL.std.450) 39(SMin) 310 313
+                              Store 305(i16v) 314
+             315:187(i16vec2) Load 305(i16v)
+             318:187(i16vec2) ExtInst 1(GLSL.std.450) 39(SMin) 315 317
+                              Store 305(i16v) 318
+             320: 49(i16vec3) Load 319(u16v)
+             322: 14(int16_t) Load 321(u16)
+             323: 49(i16vec3) CompositeConstruct 322 322 322
+             324: 49(i16vec3) ExtInst 1(GLSL.std.450) 38(UMin) 320 323
+                              Store 319(u16v) 324
+             325: 49(i16vec3) Load 319(u16v)
+             327: 49(i16vec3) ExtInst 1(GLSL.std.450) 38(UMin) 325 326
+                              Store 319(u16v) 327
+             328:187(i16vec2) Load 305(i16v)
+             329: 17(int16_t) Load 311(i16)
+             330:187(i16vec2) CompositeConstruct 329 329
+             331:187(i16vec2) ExtInst 1(GLSL.std.450) 42(SMax) 328 330
+                              Store 305(i16v) 331
+             332:187(i16vec2) Load 305(i16v)
+             333:187(i16vec2) ExtInst 1(GLSL.std.450) 42(SMax) 332 317
+                              Store 305(i16v) 333
+             334: 49(i16vec3) Load 319(u16v)
+             335: 14(int16_t) Load 321(u16)
+             336: 49(i16vec3) CompositeConstruct 335 335 335
+             337: 49(i16vec3) ExtInst 1(GLSL.std.450) 41(UMax) 334 336
+                              Store 319(u16v) 337
+             338: 49(i16vec3) Load 319(u16v)
+             339: 49(i16vec3) ExtInst 1(GLSL.std.450) 41(UMax) 338 326
+                              Store 319(u16v) 339
+             340:187(i16vec2) Load 305(i16v)
+             341: 17(int16_t) Load 311(i16)
+             342: 17(int16_t) SNegate 341
+             343: 17(int16_t) Load 311(i16)
+             344:187(i16vec2) CompositeConstruct 342 342
+             345:187(i16vec2) CompositeConstruct 343 343
+             346:187(i16vec2) ExtInst 1(GLSL.std.450) 45(SClamp) 340 344 345
+                              Store 305(i16v) 346
+             347:187(i16vec2) Load 305(i16v)
+             348:187(i16vec2) Load 305(i16v)
+             349:187(i16vec2) SNegate 348
+             350:187(i16vec2) Load 305(i16v)
+             351:187(i16vec2) ExtInst 1(GLSL.std.450) 45(SClamp) 347 349 350
+                              Store 305(i16v) 351
+             352: 49(i16vec3) Load 319(u16v)
+             353: 14(int16_t) Load 321(u16)
+             354: 14(int16_t) SNegate 353
+             355: 14(int16_t) Load 321(u16)
+             356: 49(i16vec3) CompositeConstruct 354 354 354
+             357: 49(i16vec3) CompositeConstruct 355 355 355
+             358: 49(i16vec3) ExtInst 1(GLSL.std.450) 44(UClamp) 352 356 357
+                              Store 319(u16v) 358
+             359: 49(i16vec3) Load 319(u16v)
+             360: 49(i16vec3) Load 319(u16v)
+             361: 49(i16vec3) SNegate 360
+             362: 49(i16vec3) Load 319(u16v)
+             363: 49(i16vec3) ExtInst 1(GLSL.std.450) 44(UClamp) 359 361 362
+                              Store 319(u16v) 363
+             364:     35(ptr) AccessChain 305(i16v) 128
+             365: 17(int16_t) Load 364
+             366:     35(ptr) AccessChain 305(i16v) 111
+             367: 17(int16_t) Load 366
+             369: 17(int16_t) Select 368 367 365
+                              Store 311(i16) 369
+             370: 17(int16_t) Load 311(i16)
+             371:187(i16vec2) CompositeConstruct 370 370
+             372: 17(int16_t) Load 311(i16)
+             373: 17(int16_t) SNegate 372
+             374:187(i16vec2) CompositeConstruct 373 373
+             377:187(i16vec2) Select 376 374 371
+                              Store 305(i16v) 377
+             378:     15(ptr) AccessChain 319(u16v) 128
+             379: 14(int16_t) Load 378
+             380:     15(ptr) AccessChain 319(u16v) 111
+             381: 14(int16_t) Load 380
+             382: 14(int16_t) Select 368 381 379
+                              Store 321(u16) 382
+             383: 14(int16_t) Load 321(u16)
+             384: 49(i16vec3) CompositeConstruct 383 383 383
+             385: 14(int16_t) Load 321(u16)
+             386: 14(int16_t) SNegate 385
+             387: 49(i16vec3) CompositeConstruct 386 386 386
+             390: 49(i16vec3) Select 389 387 384
+                              Store 319(u16v) 390
+             394:391(f16vec3) Load 393(f16v)
+             398:397(ResType) ExtInst 1(GLSL.std.450) 52(FrexpStruct) 394
+             399: 54(i16vec3) CompositeExtract 398 1
+                              Store 396(exp) 399
+             400:391(f16vec3) CompositeExtract 398 0
+                              Store 393(f16v) 400
+             401:391(f16vec3) Load 393(f16v)
+             402: 54(i16vec3) Load 396(exp)
+             403:391(f16vec3) ExtInst 1(GLSL.std.450) 53(Ldexp) 401 402
+                              Store 393(f16v) 403
+             404:391(f16vec3) Load 393(f16v)
+             405:262(f16vec2) VectorShuffle 404 404 0 1
+             406:187(i16vec2) Bitcast 405
+                              Store 305(i16v) 406
+             408:    407(ptr) AccessChain 393(f16v) 117
+             409:261(float16_t) Load 408
+             410: 14(int16_t) Bitcast 409
+             411:     15(ptr) AccessChain 319(u16v) 128
+                              Store 411 410
+             412:187(i16vec2) Load 305(i16v)
+             413:262(f16vec2) Bitcast 412
+             414:391(f16vec3) Load 393(f16v)
+             415:391(f16vec3) VectorShuffle 414 413 3 4 2
+                              Store 393(f16v) 415
+             416: 49(i16vec3) Load 319(u16v)
+             417:391(f16vec3) Bitcast 416
+                              Store 393(f16v) 417
+             419:187(i16vec2) Load 305(i16v)
+             420:     28(int) Bitcast 419
+                              Store 418(packi) 420
+             421:     28(int) Load 418(packi)
+             422:187(i16vec2) Bitcast 421
+                              Store 305(i16v) 422
+             424: 49(i16vec3) Load 319(u16v)
+             425:198(i16vec2) VectorShuffle 424 424 0 1
+             426:     18(int) Bitcast 425
+                              Store 423(packu) 426
+             427:     18(int) Load 423(packu)
+             428:198(i16vec2) Bitcast 427
+             429: 49(i16vec3) Load 319(u16v)
+             430: 49(i16vec3) VectorShuffle 429 428 3 4 2
+                              Store 319(u16v) 430
+             433: 17(int16_t) Load 311(i16)
+             435:434(i16vec4) CompositeConstruct 433 433 433 433
+             436:273(int64_t) Bitcast 435
+                              Store 432(packi64) 436
+             437:273(int64_t) Load 432(packi64)
+             438:434(i16vec4) Bitcast 437
+             439:187(i16vec2) VectorShuffle 438 438 0 1
+                              Store 305(i16v) 439
+             442: 14(int16_t) Load 321(u16)
+             444:443(i16vec4) CompositeConstruct 442 442 442 442
+             445:285(int64_t) Bitcast 444
+                              Store 441(packu64) 445
+             446:285(int64_t) Load 441(packu64)
+             447:443(i16vec4) Bitcast 446
+             448: 49(i16vec3) VectorShuffle 447 447 0 1 2
+                              Store 319(u16v) 448
+             451: 49(i16vec3) Load 319(u16v)
+             452: 14(int16_t) Load 321(u16)
+             453: 49(i16vec3) CompositeConstruct 452 452 452
+             454:  388(bvec3) ULessThan 451 453
+                              Store 450(bv) 454
+             455:187(i16vec2) Load 305(i16v)
+             456: 17(int16_t) Load 311(i16)
+             457:187(i16vec2) CompositeConstruct 456 456
+             458:  190(bvec2) SLessThan 455 457
+             459:  388(bvec3) Load 450(bv)
+             460:  388(bvec3) VectorShuffle 459 458 3 4 2
+                              Store 450(bv) 460
+             461: 49(i16vec3) Load 319(u16v)
+             462: 14(int16_t) Load 321(u16)
+             463: 49(i16vec3) CompositeConstruct 462 462 462
+             464:  388(bvec3) ULessThanEqual 461 463
+                              Store 450(bv) 464
+             465:187(i16vec2) Load 305(i16v)
+             466: 17(int16_t) Load 311(i16)
+             467:187(i16vec2) CompositeConstruct 466 466
+             468:  190(bvec2) SLessThanEqual 465 467
+             469:  388(bvec3) Load 450(bv)
+             470:  388(bvec3) VectorShuffle 469 468 3 4 2
+                              Store 450(bv) 470
+             471: 49(i16vec3) Load 319(u16v)
+             472: 14(int16_t) Load 321(u16)
+             473: 49(i16vec3) CompositeConstruct 472 472 472
+             474:  388(bvec3) UGreaterThan 471 473
+                              Store 450(bv) 474
+             475:187(i16vec2) Load 305(i16v)
+             476: 17(int16_t) Load 311(i16)
+             477:187(i16vec2) CompositeConstruct 476 476
+             478:  190(bvec2) SGreaterThan 475 477
+             479:  388(bvec3) Load 450(bv)
+             480:  388(bvec3) VectorShuffle 479 478 3 4 2
+                              Store 450(bv) 480
+             481: 49(i16vec3) Load 319(u16v)
+             482: 14(int16_t) Load 321(u16)
+             483: 49(i16vec3) CompositeConstruct 482 482 482
+             484:  388(bvec3) UGreaterThanEqual 481 483
+                              Store 450(bv) 484
+             485:187(i16vec2) Load 305(i16v)
+             486: 17(int16_t) Load 311(i16)
+             487:187(i16vec2) CompositeConstruct 486 486
+             488:  190(bvec2) SGreaterThanEqual 485 487
+             489:  388(bvec3) Load 450(bv)
+             490:  388(bvec3) VectorShuffle 489 488 3 4 2
+                              Store 450(bv) 490
+             491: 49(i16vec3) Load 319(u16v)
+             492: 14(int16_t) Load 321(u16)
+             493: 49(i16vec3) CompositeConstruct 492 492 492
+             494:  388(bvec3) IEqual 491 493
+                              Store 450(bv) 494
+             495:187(i16vec2) Load 305(i16v)
+             496: 17(int16_t) Load 311(i16)
+             497:187(i16vec2) CompositeConstruct 496 496
+             498:  190(bvec2) IEqual 495 497
+             499:  388(bvec3) Load 450(bv)
+             500:  388(bvec3) VectorShuffle 499 498 3 4 2
+                              Store 450(bv) 500
+             501: 49(i16vec3) Load 319(u16v)
+             502: 14(int16_t) Load 321(u16)
+             503: 49(i16vec3) CompositeConstruct 502 502 502
+             504:  388(bvec3) INotEqual 501 503
+                              Store 450(bv) 504
+             505:187(i16vec2) Load 305(i16v)
+             506: 17(int16_t) Load 311(i16)
+             507:187(i16vec2) CompositeConstruct 506 506
+             508:  190(bvec2) INotEqual 505 507
+             509:  388(bvec3) Load 450(bv)
+             510:  388(bvec3) VectorShuffle 509 508 3 4 2
+                              Store 450(bv) 510
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.int16.frag.out b/Test/baseResults/spv.int16.frag.out
new file mode 100644
index 0000000..3cc5bf6
--- /dev/null
+++ b/Test/baseResults/spv.int16.frag.out
@@ -0,0 +1,746 @@
+spv.int16.frag
+error: SPIRV-Tools Validation Errors
+error: Capability Float16 is not allowed by Vulkan 1.0 specification (or requires extension)
+  OpCapability Float16
+
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 523
+
+                              Capability Shader
+                              Capability Float16
+                              Capability Float64
+                              Capability Int64
+                              Capability Int16
+                              Capability Int8
+                              Capability StorageUniform16
+                              Extension  "SPV_KHR_16bit_storage"
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main"
+                              ExecutionMode 4 OriginUpperLeft
+                              Source GLSL 450
+                              SourceExtension  "GL_EXT_shader_explicit_arithmetic_types"
+                              SourceExtension  "GL_EXT_shader_explicit_arithmetic_types_float16"
+                              SourceExtension  "GL_EXT_shader_explicit_arithmetic_types_float32"
+                              SourceExtension  "GL_EXT_shader_explicit_arithmetic_types_float64"
+                              SourceExtension  "GL_EXT_shader_explicit_arithmetic_types_int16"
+                              SourceExtension  "GL_EXT_shader_explicit_arithmetic_types_int32"
+                              SourceExtension  "GL_EXT_shader_explicit_arithmetic_types_int64"
+                              SourceExtension  "GL_EXT_shader_explicit_arithmetic_types_int8"
+                              Name 4  "main"
+                              Name 6  "literal("
+                              Name 8  "typeCast16("
+                              Name 10  "operators("
+                              Name 12  "builtinFuncs("
+                              Name 16  "i16"
+                              Name 24  "Uniforms"
+                              MemberName 24(Uniforms) 0  "index"
+                              Name 26  ""
+                              Name 33  "indexable"
+                              Name 38  "u16"
+                              Name 46  "indexable"
+                              Name 51  "i32v"
+                              Name 54  "i16v"
+                              Name 59  "u16v"
+                              Name 67  "u32v"
+                              Name 74  "i64v"
+                              Name 80  "u64v"
+                              Name 94  "f16v"
+                              Name 100  "f32v"
+                              Name 106  "f64v"
+                              Name 154  "i8v"
+                              Name 163  "u8v"
+                              Name 176  "bv"
+                              Name 195  "u16v"
+                              Name 200  "i16"
+                              Name 220  "i"
+                              Name 227  "uv"
+                              Name 243  "i64"
+                              Name 281  "b"
+                              Name 343  "i16v"
+                              Name 346  "i16"
+                              Name 356  "u16v"
+                              Name 358  "u16"
+                              Name 428  "i32"
+                              Name 431  "i64"
+                              Name 434  "i16v4"
+                              Name 437  "u32"
+                              Name 438  "u16v2"
+                              Name 442  "u64"
+                              Name 445  "u16v4"
+                              Name 457  "bv"
+                              Name 518  "Block"
+                              MemberName 518(Block) 0  "i16"
+                              MemberName 518(Block) 1  "i16v2"
+                              MemberName 518(Block) 2  "i16v3"
+                              MemberName 518(Block) 3  "i16v4"
+                              MemberName 518(Block) 4  "u16"
+                              MemberName 518(Block) 5  "u16v2"
+                              MemberName 518(Block) 6  "u16v3"
+                              MemberName 518(Block) 7  "u16v4"
+                              Name 520  "block"
+                              Name 521  "si16"
+                              Name 522  "su16"
+                              MemberDecorate 24(Uniforms) 0 Offset 0
+                              Decorate 24(Uniforms) Block
+                              Decorate 26 DescriptorSet 0
+                              Decorate 26 Binding 0
+                              MemberDecorate 518(Block) 0 Offset 0
+                              MemberDecorate 518(Block) 1 Offset 4
+                              MemberDecorate 518(Block) 2 Offset 8
+                              MemberDecorate 518(Block) 3 Offset 16
+                              MemberDecorate 518(Block) 4 Offset 24
+                              MemberDecorate 518(Block) 5 Offset 28
+                              MemberDecorate 518(Block) 6 Offset 32
+                              MemberDecorate 518(Block) 7 Offset 40
+                              Decorate 518(Block) Block
+                              Decorate 520(block) DescriptorSet 0
+                              Decorate 520(block) Binding 1
+                              Decorate 521(si16) SpecId 100
+                              Decorate 522(su16) SpecId 101
+               2:             TypeVoid
+               3:             TypeFunction 2
+              14:             TypeInt 16 1
+              15:             TypePointer Function 14(int16_t)
+              17:             TypeInt 32 0
+              18:     17(int) Constant 3
+              19:             TypeArray 14(int16_t) 18
+              20: 14(int16_t) Constant 4294962927
+              21: 14(int16_t) Constant 4294967295
+              22: 14(int16_t) Constant 16384
+              23:          19 ConstantComposite 20 21 22
+    24(Uniforms):             TypeStruct 17(int)
+              25:             TypePointer Uniform 24(Uniforms)
+              26:     25(ptr) Variable Uniform
+              27:             TypeInt 32 1
+              28:     27(int) Constant 0
+              29:             TypePointer Uniform 17(int)
+              32:             TypePointer Function 19
+              36:             TypeInt 16 0
+              37:             TypePointer Function 36(int16_t)
+              39:             TypeArray 36(int16_t) 18
+              40: 36(int16_t) Constant 65535
+              41: 36(int16_t) Constant 32767
+              42:          39 ConstantComposite 40 40 41
+              45:             TypePointer Function 39
+              49:             TypeVector 27(int) 2
+              50:             TypePointer Function 49(ivec2)
+              52:             TypeVector 14(int16_t) 2
+              53:             TypePointer Function 52(i16vec2)
+              57:             TypeVector 36(int16_t) 2
+              58:             TypePointer Function 57(i16vec2)
+              61:             TypeVector 17(int) 2
+              66:             TypePointer Function 61(ivec2)
+              71:             TypeInt 64 1
+              72:             TypeVector 71(int64_t) 2
+              73:             TypePointer Function 72(i64vec2)
+              77:             TypeInt 64 0
+              78:             TypeVector 77(int64_t) 2
+              79:             TypePointer Function 78(i64vec2)
+              91:             TypeFloat 16
+              92:             TypeVector 91(float16_t) 2
+              93:             TypePointer Function 92(f16vec2)
+              97:             TypeFloat 32
+              98:             TypeVector 97(float) 2
+              99:             TypePointer Function 98(fvec2)
+             103:             TypeFloat 64
+             104:             TypeVector 103(float64_t) 2
+             105:             TypePointer Function 104(f64vec2)
+             151:             TypeInt 8 1
+             152:             TypeVector 151(int8_t) 2
+             153:             TypePointer Function 152(i8vec2)
+             158:             TypeInt 8 0
+             159:             TypeVector 158(int8_t) 2
+             162:             TypePointer Function 159(i8vec2)
+             173:             TypeBool
+             174:             TypeVector 173(bool) 2
+             175:             TypePointer Function 174(bvec2)
+             178: 14(int16_t) Constant 0
+             179: 14(int16_t) Constant 1
+             180: 52(i16vec2) ConstantComposite 178 178
+             181: 52(i16vec2) ConstantComposite 179 179
+             184: 36(int16_t) Constant 0
+             185: 36(int16_t) Constant 1
+             186: 57(i16vec2) ConstantComposite 184 184
+             187: 57(i16vec2) ConstantComposite 185 185
+             193:             TypeVector 36(int16_t) 3
+             194:             TypePointer Function 193(i16vec3)
+             197:             TypeVector 14(int16_t) 3
+             219:             TypePointer Function 27(int)
+             225:             TypeVector 17(int) 3
+             226:             TypePointer Function 225(ivec3)
+             242:             TypePointer Function 71(int64_t)
+             264:     17(int) Constant 1
+             270:     17(int) Constant 2
+             276:             TypeVector 27(int) 3
+             280:             TypePointer Function 173(bool)
+             282:     17(int) Constant 0
+             296:             TypePointer Function 17(int)
+             354: 52(i16vec2) ConstantComposite 21 21
+             363:193(i16vec3) ConstantComposite 184 184 184
+             405:   173(bool) ConstantTrue
+             412:   173(bool) ConstantFalse
+             413:  174(bvec2) ConstantComposite 412 412
+             425:             TypeVector 173(bool) 3
+             426:  425(bvec3) ConstantComposite 412 412 412
+             432:             TypeVector 14(int16_t) 4
+             433:             TypePointer Function 432(i16vec4)
+             441:             TypePointer Function 77(int64_t)
+             443:             TypeVector 36(int16_t) 4
+             444:             TypePointer Function 443(i16vec4)
+             456:             TypePointer Function 425(bvec3)
+      518(Block):             TypeStruct 14(int16_t) 52(i16vec2) 197(i16vec3) 432(i16vec4) 36(int16_t) 57(i16vec2) 193(i16vec3) 443(i16vec4)
+             519:             TypePointer Uniform 518(Block)
+      520(block):    519(ptr) Variable Uniform
+       521(si16): 14(int16_t) SpecConstant 4294967286
+       522(su16): 36(int16_t) SpecConstant 20
+         4(main):           2 Function None 3
+               5:             Label
+                              Return
+                              FunctionEnd
+     6(literal():           2 Function None 3
+               7:             Label
+         16(i16):     15(ptr) Variable Function
+   33(indexable):     32(ptr) Variable Function
+         38(u16):     37(ptr) Variable Function
+   46(indexable):     45(ptr) Variable Function
+              30:     29(ptr) AccessChain 26 28
+              31:     17(int) Load 30
+                              Store 33(indexable) 23
+              34:     15(ptr) AccessChain 33(indexable) 31
+              35: 14(int16_t) Load 34
+                              Store 16(i16) 35
+              43:     29(ptr) AccessChain 26 28
+              44:     17(int) Load 43
+                              Store 46(indexable) 42
+              47:     37(ptr) AccessChain 46(indexable) 44
+              48: 36(int16_t) Load 47
+                              Store 38(u16) 48
+                              Return
+                              FunctionEnd
+  8(typeCast16():           2 Function None 3
+               9:             Label
+        51(i32v):     50(ptr) Variable Function
+        54(i16v):     53(ptr) Variable Function
+        59(u16v):     58(ptr) Variable Function
+        67(u32v):     66(ptr) Variable Function
+        74(i64v):     73(ptr) Variable Function
+        80(u64v):     79(ptr) Variable Function
+        94(f16v):     93(ptr) Variable Function
+       100(f32v):     99(ptr) Variable Function
+       106(f64v):    105(ptr) Variable Function
+        154(i8v):    153(ptr) Variable Function
+        163(u8v):    162(ptr) Variable Function
+         176(bv):    175(ptr) Variable Function
+              55: 52(i16vec2) Load 54(i16v)
+              56:   49(ivec2) SConvert 55
+                              Store 51(i32v) 56
+              60: 57(i16vec2) Load 59(u16v)
+              62:   61(ivec2) UConvert 60
+              63:   49(ivec2) Bitcast 62
+                              Store 51(i32v) 63
+              64: 52(i16vec2) Load 54(i16v)
+              65: 57(i16vec2) Bitcast 64
+                              Store 59(u16v) 65
+              68: 52(i16vec2) Load 54(i16v)
+              69:   49(ivec2) SConvert 68
+              70:   61(ivec2) Bitcast 69
+                              Store 67(u32v) 70
+              75: 52(i16vec2) Load 54(i16v)
+              76: 72(i64vec2) SConvert 75
+                              Store 74(i64v) 76
+              81: 52(i16vec2) Load 54(i16v)
+              82: 72(i64vec2) SConvert 81
+              83: 78(i64vec2) Bitcast 82
+                              Store 80(u64v) 83
+              84: 57(i16vec2) Load 59(u16v)
+              85:   61(ivec2) UConvert 84
+                              Store 67(u32v) 85
+              86: 57(i16vec2) Load 59(u16v)
+              87: 78(i64vec2) UConvert 86
+              88: 72(i64vec2) Bitcast 87
+                              Store 74(i64v) 88
+              89: 57(i16vec2) Load 59(u16v)
+              90: 78(i64vec2) UConvert 89
+                              Store 80(u64v) 90
+              95: 52(i16vec2) Load 54(i16v)
+              96: 92(f16vec2) ConvertSToF 95
+                              Store 94(f16v) 96
+             101: 52(i16vec2) Load 54(i16v)
+             102:   98(fvec2) ConvertSToF 101
+                              Store 100(f32v) 102
+             107: 52(i16vec2) Load 54(i16v)
+             108:104(f64vec2) ConvertSToF 107
+                              Store 106(f64v) 108
+             109: 57(i16vec2) Load 59(u16v)
+             110: 92(f16vec2) ConvertUToF 109
+                              Store 94(f16v) 110
+             111: 57(i16vec2) Load 59(u16v)
+             112:   98(fvec2) ConvertUToF 111
+                              Store 100(f32v) 112
+             113: 57(i16vec2) Load 59(u16v)
+             114:104(f64vec2) ConvertUToF 113
+                              Store 106(f64v) 114
+             115: 52(i16vec2) Load 54(i16v)
+             116:   49(ivec2) SConvert 115
+                              Store 51(i32v) 116
+             117: 57(i16vec2) Load 59(u16v)
+             118:   61(ivec2) UConvert 117
+             119:   49(ivec2) Bitcast 118
+                              Store 51(i32v) 119
+             120: 52(i16vec2) Load 54(i16v)
+             121: 57(i16vec2) Bitcast 120
+                              Store 59(u16v) 121
+             122: 52(i16vec2) Load 54(i16v)
+             123:   49(ivec2) SConvert 122
+             124:   61(ivec2) Bitcast 123
+                              Store 67(u32v) 124
+             125: 52(i16vec2) Load 54(i16v)
+             126: 72(i64vec2) SConvert 125
+                              Store 74(i64v) 126
+             127: 52(i16vec2) Load 54(i16v)
+             128: 72(i64vec2) SConvert 127
+             129: 78(i64vec2) Bitcast 128
+                              Store 80(u64v) 129
+             130: 57(i16vec2) Load 59(u16v)
+             131:   61(ivec2) UConvert 130
+                              Store 67(u32v) 131
+             132: 57(i16vec2) Load 59(u16v)
+             133: 78(i64vec2) UConvert 132
+             134: 72(i64vec2) Bitcast 133
+                              Store 74(i64v) 134
+             135: 57(i16vec2) Load 59(u16v)
+             136: 78(i64vec2) UConvert 135
+             137: 72(i64vec2) Bitcast 136
+             138: 78(i64vec2) Bitcast 137
+                              Store 80(u64v) 138
+             139: 52(i16vec2) Load 54(i16v)
+             140: 92(f16vec2) ConvertSToF 139
+                              Store 94(f16v) 140
+             141: 52(i16vec2) Load 54(i16v)
+             142:   98(fvec2) ConvertSToF 141
+                              Store 100(f32v) 142
+             143: 52(i16vec2) Load 54(i16v)
+             144:104(f64vec2) ConvertSToF 143
+                              Store 106(f64v) 144
+             145: 57(i16vec2) Load 59(u16v)
+             146: 92(f16vec2) ConvertUToF 145
+                              Store 94(f16v) 146
+             147: 57(i16vec2) Load 59(u16v)
+             148:   98(fvec2) ConvertUToF 147
+                              Store 100(f32v) 148
+             149: 57(i16vec2) Load 59(u16v)
+             150:104(f64vec2) ConvertUToF 149
+                              Store 106(f64v) 150
+             155: 52(i16vec2) Load 54(i16v)
+             156: 152(i8vec2) SConvert 155
+                              Store 154(i8v) 156
+             157: 57(i16vec2) Load 59(u16v)
+             160: 159(i8vec2) UConvert 157
+             161: 152(i8vec2) Bitcast 160
+                              Store 154(i8v) 161
+             164: 52(i16vec2) Load 54(i16v)
+             165: 152(i8vec2) SConvert 164
+             166: 159(i8vec2) Bitcast 165
+                              Store 163(u8v) 166
+             167: 57(i16vec2) Load 59(u16v)
+             168: 159(i8vec2) UConvert 167
+                              Store 163(u8v) 168
+             169: 57(i16vec2) Load 59(u16v)
+             170: 159(i8vec2) UConvert 169
+             171: 57(i16vec2) UConvert 170
+             172: 52(i16vec2) Bitcast 171
+                              Store 54(i16v) 172
+             177:  174(bvec2) Load 176(bv)
+             182: 52(i16vec2) Select 177 181 180
+                              Store 54(i16v) 182
+             183:  174(bvec2) Load 176(bv)
+             188: 57(i16vec2) Select 183 187 186
+                              Store 59(u16v) 188
+             189: 52(i16vec2) Load 54(i16v)
+             190:  174(bvec2) INotEqual 189 186
+                              Store 176(bv) 190
+             191: 57(i16vec2) Load 59(u16v)
+             192:  174(bvec2) INotEqual 191 186
+                              Store 176(bv) 192
+                              Return
+                              FunctionEnd
+  10(operators():           2 Function None 3
+              11:             Label
+       195(u16v):    194(ptr) Variable Function
+        200(i16):     15(ptr) Variable Function
+          220(i):    219(ptr) Variable Function
+         227(uv):    226(ptr) Variable Function
+        243(i64):    242(ptr) Variable Function
+          281(b):    280(ptr) Variable Function
+             196:193(i16vec3) Load 195(u16v)
+             198:197(i16vec3) CompositeConstruct 179 179 179
+             199:193(i16vec3) IAdd 196 198
+                              Store 195(u16v) 199
+             201: 14(int16_t) Load 200(i16)
+             202: 14(int16_t) ISub 201 179
+                              Store 200(i16) 202
+             203: 14(int16_t) Load 200(i16)
+             204: 14(int16_t) IAdd 203 179
+                              Store 200(i16) 204
+             205:193(i16vec3) Load 195(u16v)
+             206:197(i16vec3) CompositeConstruct 179 179 179
+             207:193(i16vec3) ISub 205 206
+                              Store 195(u16v) 207
+             208:193(i16vec3) Load 195(u16v)
+             209:193(i16vec3) Not 208
+                              Store 195(u16v) 209
+             210: 14(int16_t) Load 200(i16)
+                              Store 200(i16) 210
+             211:193(i16vec3) Load 195(u16v)
+             212:193(i16vec3) SNegate 211
+                              Store 195(u16v) 212
+             213: 14(int16_t) Load 200(i16)
+             214: 14(int16_t) Load 200(i16)
+             215: 14(int16_t) IAdd 214 213
+                              Store 200(i16) 215
+             216:193(i16vec3) Load 195(u16v)
+             217:193(i16vec3) Load 195(u16v)
+             218:193(i16vec3) ISub 217 216
+                              Store 195(u16v) 218
+             221: 14(int16_t) Load 200(i16)
+             222:     27(int) SConvert 221
+             223:     27(int) Load 220(i)
+             224:     27(int) IMul 223 222
+                              Store 220(i) 224
+             228:193(i16vec3) Load 195(u16v)
+             229:  225(ivec3) UConvert 228
+             230:  225(ivec3) Load 227(uv)
+             231:  225(ivec3) UDiv 230 229
+                              Store 227(uv) 231
+             232: 14(int16_t) Load 200(i16)
+             233:     27(int) SConvert 232
+             234:     17(int) Bitcast 233
+             235:  225(ivec3) Load 227(uv)
+             236:  225(ivec3) CompositeConstruct 234 234 234
+             237:  225(ivec3) UMod 235 236
+                              Store 227(uv) 237
+             238:193(i16vec3) Load 195(u16v)
+             239:  225(ivec3) UConvert 238
+             240:  225(ivec3) Load 227(uv)
+             241:  225(ivec3) IAdd 239 240
+                              Store 227(uv) 241
+             244: 14(int16_t) Load 200(i16)
+             245: 71(int64_t) SConvert 244
+             246: 71(int64_t) Load 243(i64)
+             247: 71(int64_t) ISub 245 246
+                              Store 243(i64) 247
+             248:193(i16vec3) Load 195(u16v)
+             249:  225(ivec3) UConvert 248
+             250:  225(ivec3) Load 227(uv)
+             251:  225(ivec3) IMul 249 250
+                              Store 227(uv) 251
+             252: 14(int16_t) Load 200(i16)
+             253: 71(int64_t) SConvert 252
+             254: 71(int64_t) Load 243(i64)
+             255: 71(int64_t) IMul 253 254
+                              Store 243(i64) 255
+             256: 14(int16_t) Load 200(i16)
+             257:     27(int) SConvert 256
+             258:     27(int) Load 220(i)
+             259:     27(int) SMod 257 258
+                              Store 220(i) 259
+             260: 14(int16_t) Load 200(i16)
+             261:193(i16vec3) Load 195(u16v)
+             262:197(i16vec3) CompositeConstruct 260 260 260
+             263:193(i16vec3) ShiftLeftLogical 261 262
+                              Store 195(u16v) 263
+             265:     37(ptr) AccessChain 195(u16v) 264
+             266: 36(int16_t) Load 265
+             267: 14(int16_t) Load 200(i16)
+             268: 14(int16_t) ShiftRightArithmetic 267 266
+                              Store 200(i16) 268
+             269: 14(int16_t) Load 200(i16)
+             271:     37(ptr) AccessChain 195(u16v) 270
+             272: 36(int16_t) Load 271
+             273: 14(int16_t) ShiftLeftLogical 269 272
+                              Store 200(i16) 273
+             274:193(i16vec3) Load 195(u16v)
+             275:     27(int) Load 220(i)
+             277:  276(ivec3) CompositeConstruct 275 275 275
+             278:193(i16vec3) ShiftLeftLogical 274 277
+             279:  225(ivec3) UConvert 278
+                              Store 227(uv) 279
+             283:     37(ptr) AccessChain 195(u16v) 282
+             284: 36(int16_t) Load 283
+             285: 14(int16_t) Load 200(i16)
+             286: 36(int16_t) Bitcast 285
+             287:   173(bool) INotEqual 284 286
+                              Store 281(b) 287
+             288: 14(int16_t) Load 200(i16)
+             289: 36(int16_t) Bitcast 288
+             290:     37(ptr) AccessChain 195(u16v) 282
+             291: 36(int16_t) Load 290
+             292:   173(bool) IEqual 289 291
+                              Store 281(b) 292
+             293:     37(ptr) AccessChain 195(u16v) 282
+             294: 36(int16_t) Load 293
+             295:     17(int) UConvert 294
+             297:    296(ptr) AccessChain 227(uv) 264
+             298:     17(int) Load 297
+             299:   173(bool) UGreaterThan 295 298
+                              Store 281(b) 299
+             300: 14(int16_t) Load 200(i16)
+             301:     27(int) SConvert 300
+             302:     27(int) Load 220(i)
+             303:   173(bool) SLessThan 301 302
+                              Store 281(b) 303
+             304:     37(ptr) AccessChain 195(u16v) 264
+             305: 36(int16_t) Load 304
+             306:     17(int) UConvert 305
+             307:    296(ptr) AccessChain 227(uv) 282
+             308:     17(int) Load 307
+             309:   173(bool) UGreaterThanEqual 306 308
+                              Store 281(b) 309
+             310: 14(int16_t) Load 200(i16)
+             311:     27(int) SConvert 310
+             312:     27(int) Load 220(i)
+             313:   173(bool) SLessThanEqual 311 312
+                              Store 281(b) 313
+             314: 14(int16_t) Load 200(i16)
+             315:     27(int) SConvert 314
+             316:     17(int) Bitcast 315
+             317:  225(ivec3) Load 227(uv)
+             318:  225(ivec3) CompositeConstruct 316 316 316
+             319:  225(ivec3) BitwiseOr 317 318
+                              Store 227(uv) 319
+             320: 14(int16_t) Load 200(i16)
+             321:     27(int) SConvert 320
+             322:     27(int) Load 220(i)
+             323:     27(int) BitwiseOr 321 322
+                              Store 220(i) 323
+             324: 14(int16_t) Load 200(i16)
+             325: 71(int64_t) SConvert 324
+             326: 71(int64_t) Load 243(i64)
+             327: 71(int64_t) BitwiseAnd 326 325
+                              Store 243(i64) 327
+             328:193(i16vec3) Load 195(u16v)
+             329:  225(ivec3) UConvert 328
+             330:  225(ivec3) Load 227(uv)
+             331:  225(ivec3) BitwiseAnd 329 330
+                              Store 227(uv) 331
+             332: 14(int16_t) Load 200(i16)
+             333:     27(int) SConvert 332
+             334:     17(int) Bitcast 333
+             335:  225(ivec3) Load 227(uv)
+             336:  225(ivec3) CompositeConstruct 334 334 334
+             337:  225(ivec3) BitwiseXor 335 336
+                              Store 227(uv) 337
+             338:193(i16vec3) Load 195(u16v)
+             339: 14(int16_t) Load 200(i16)
+             340: 36(int16_t) Bitcast 339
+             341:193(i16vec3) CompositeConstruct 340 340 340
+             342:193(i16vec3) BitwiseXor 338 341
+                              Store 195(u16v) 342
+                              Return
+                              FunctionEnd
+12(builtinFuncs():           2 Function None 3
+              13:             Label
+       343(i16v):     53(ptr) Variable Function
+        346(i16):     15(ptr) Variable Function
+       356(u16v):    194(ptr) Variable Function
+        358(u16):     37(ptr) Variable Function
+        428(i32):    219(ptr) Variable Function
+        431(i64):    242(ptr) Variable Function
+      434(i16v4):    433(ptr) Variable Function
+        437(u32):    296(ptr) Variable Function
+      438(u16v2):     58(ptr) Variable Function
+        442(u64):    441(ptr) Variable Function
+      445(u16v4):    444(ptr) Variable Function
+         457(bv):    456(ptr) Variable Function
+             344: 52(i16vec2) Load 343(i16v)
+             345: 52(i16vec2) ExtInst 1(GLSL.std.450) 5(SAbs) 344
+                              Store 343(i16v) 345
+             347: 14(int16_t) Load 346(i16)
+             348: 14(int16_t) ExtInst 1(GLSL.std.450) 7(SSign) 347
+                              Store 346(i16) 348
+             349: 52(i16vec2) Load 343(i16v)
+             350: 14(int16_t) Load 346(i16)
+             351: 52(i16vec2) CompositeConstruct 350 350
+             352: 52(i16vec2) ExtInst 1(GLSL.std.450) 39(SMin) 349 351
+                              Store 343(i16v) 352
+             353: 52(i16vec2) Load 343(i16v)
+             355: 52(i16vec2) ExtInst 1(GLSL.std.450) 39(SMin) 353 354
+                              Store 343(i16v) 355
+             357:193(i16vec3) Load 356(u16v)
+             359: 36(int16_t) Load 358(u16)
+             360:193(i16vec3) CompositeConstruct 359 359 359
+             361:193(i16vec3) ExtInst 1(GLSL.std.450) 38(UMin) 357 360
+                              Store 356(u16v) 361
+             362:193(i16vec3) Load 356(u16v)
+             364:193(i16vec3) ExtInst 1(GLSL.std.450) 38(UMin) 362 363
+                              Store 356(u16v) 364
+             365: 52(i16vec2) Load 343(i16v)
+             366: 14(int16_t) Load 346(i16)
+             367: 52(i16vec2) CompositeConstruct 366 366
+             368: 52(i16vec2) ExtInst 1(GLSL.std.450) 42(SMax) 365 367
+                              Store 343(i16v) 368
+             369: 52(i16vec2) Load 343(i16v)
+             370: 52(i16vec2) ExtInst 1(GLSL.std.450) 42(SMax) 369 354
+                              Store 343(i16v) 370
+             371:193(i16vec3) Load 356(u16v)
+             372: 36(int16_t) Load 358(u16)
+             373:193(i16vec3) CompositeConstruct 372 372 372
+             374:193(i16vec3) ExtInst 1(GLSL.std.450) 41(UMax) 371 373
+                              Store 356(u16v) 374
+             375:193(i16vec3) Load 356(u16v)
+             376:193(i16vec3) ExtInst 1(GLSL.std.450) 41(UMax) 375 363
+                              Store 356(u16v) 376
+             377: 52(i16vec2) Load 343(i16v)
+             378: 14(int16_t) Load 346(i16)
+             379: 14(int16_t) SNegate 378
+             380: 14(int16_t) Load 346(i16)
+             381: 52(i16vec2) CompositeConstruct 379 379
+             382: 52(i16vec2) CompositeConstruct 380 380
+             383: 52(i16vec2) ExtInst 1(GLSL.std.450) 45(SClamp) 377 381 382
+                              Store 343(i16v) 383
+             384: 52(i16vec2) Load 343(i16v)
+             385: 52(i16vec2) Load 343(i16v)
+             386: 52(i16vec2) SNegate 385
+             387: 52(i16vec2) Load 343(i16v)
+             388: 52(i16vec2) ExtInst 1(GLSL.std.450) 45(SClamp) 384 386 387
+                              Store 343(i16v) 388
+             389:193(i16vec3) Load 356(u16v)
+             390: 36(int16_t) Load 358(u16)
+             391: 36(int16_t) SNegate 390
+             392: 36(int16_t) Load 358(u16)
+             393:193(i16vec3) CompositeConstruct 391 391 391
+             394:193(i16vec3) CompositeConstruct 392 392 392
+             395:193(i16vec3) ExtInst 1(GLSL.std.450) 44(UClamp) 389 393 394
+                              Store 356(u16v) 395
+             396:193(i16vec3) Load 356(u16v)
+             397:193(i16vec3) Load 356(u16v)
+             398:193(i16vec3) SNegate 397
+             399:193(i16vec3) Load 356(u16v)
+             400:193(i16vec3) ExtInst 1(GLSL.std.450) 44(UClamp) 396 398 399
+                              Store 356(u16v) 400
+             401:     15(ptr) AccessChain 343(i16v) 282
+             402: 14(int16_t) Load 401
+             403:     15(ptr) AccessChain 343(i16v) 264
+             404: 14(int16_t) Load 403
+             406: 14(int16_t) Select 405 404 402
+                              Store 346(i16) 406
+             407: 14(int16_t) Load 346(i16)
+             408: 52(i16vec2) CompositeConstruct 407 407
+             409: 14(int16_t) Load 346(i16)
+             410: 14(int16_t) SNegate 409
+             411: 52(i16vec2) CompositeConstruct 410 410
+             414: 52(i16vec2) Select 413 411 408
+                              Store 343(i16v) 414
+             415:     37(ptr) AccessChain 356(u16v) 282
+             416: 36(int16_t) Load 415
+             417:     37(ptr) AccessChain 356(u16v) 264
+             418: 36(int16_t) Load 417
+             419: 36(int16_t) Select 405 418 416
+                              Store 358(u16) 419
+             420: 36(int16_t) Load 358(u16)
+             421:193(i16vec3) CompositeConstruct 420 420 420
+             422: 36(int16_t) Load 358(u16)
+             423: 36(int16_t) SNegate 422
+             424:193(i16vec3) CompositeConstruct 423 423 423
+             427:193(i16vec3) Select 426 424 421
+                              Store 356(u16v) 427
+             429: 52(i16vec2) Load 343(i16v)
+             430:     27(int) Bitcast 429
+                              Store 428(i32) 430
+             435:432(i16vec4) Load 434(i16v4)
+             436: 71(int64_t) Bitcast 435
+                              Store 431(i64) 436
+             439: 57(i16vec2) Load 438(u16v2)
+             440:     17(int) Bitcast 439
+                              Store 437(u32) 440
+             446:443(i16vec4) Load 445(u16v4)
+             447: 77(int64_t) Bitcast 446
+                              Store 442(u64) 447
+             448:     27(int) Load 428(i32)
+             449: 52(i16vec2) Bitcast 448
+                              Store 343(i16v) 449
+             450: 71(int64_t) Load 431(i64)
+             451:432(i16vec4) Bitcast 450
+                              Store 434(i16v4) 451
+             452:     17(int) Load 437(u32)
+             453: 57(i16vec2) Bitcast 452
+                              Store 438(u16v2) 453
+             454: 77(int64_t) Load 442(u64)
+             455:443(i16vec4) Bitcast 454
+                              Store 445(u16v4) 455
+             458:193(i16vec3) Load 356(u16v)
+             459: 36(int16_t) Load 358(u16)
+             460:193(i16vec3) CompositeConstruct 459 459 459
+             461:  425(bvec3) ULessThan 458 460
+                              Store 457(bv) 461
+             462: 52(i16vec2) Load 343(i16v)
+             463: 14(int16_t) Load 346(i16)
+             464: 52(i16vec2) CompositeConstruct 463 463
+             465:  174(bvec2) SLessThan 462 464
+             466:  425(bvec3) Load 457(bv)
+             467:  425(bvec3) VectorShuffle 466 465 3 4 2
+                              Store 457(bv) 467
+             468:193(i16vec3) Load 356(u16v)
+             469: 36(int16_t) Load 358(u16)
+             470:193(i16vec3) CompositeConstruct 469 469 469
+             471:  425(bvec3) ULessThanEqual 468 470
+                              Store 457(bv) 471
+             472: 52(i16vec2) Load 343(i16v)
+             473: 14(int16_t) Load 346(i16)
+             474: 52(i16vec2) CompositeConstruct 473 473
+             475:  174(bvec2) SLessThanEqual 472 474
+             476:  425(bvec3) Load 457(bv)
+             477:  425(bvec3) VectorShuffle 476 475 3 4 2
+                              Store 457(bv) 477
+             478:193(i16vec3) Load 356(u16v)
+             479: 36(int16_t) Load 358(u16)
+             480:193(i16vec3) CompositeConstruct 479 479 479
+             481:  425(bvec3) UGreaterThan 478 480
+                              Store 457(bv) 481
+             482: 52(i16vec2) Load 343(i16v)
+             483: 14(int16_t) Load 346(i16)
+             484: 52(i16vec2) CompositeConstruct 483 483
+             485:  174(bvec2) SGreaterThan 482 484
+             486:  425(bvec3) Load 457(bv)
+             487:  425(bvec3) VectorShuffle 486 485 3 4 2
+                              Store 457(bv) 487
+             488:193(i16vec3) Load 356(u16v)
+             489: 36(int16_t) Load 358(u16)
+             490:193(i16vec3) CompositeConstruct 489 489 489
+             491:  425(bvec3) UGreaterThanEqual 488 490
+                              Store 457(bv) 491
+             492: 52(i16vec2) Load 343(i16v)
+             493: 14(int16_t) Load 346(i16)
+             494: 52(i16vec2) CompositeConstruct 493 493
+             495:  174(bvec2) SGreaterThanEqual 492 494
+             496:  425(bvec3) Load 457(bv)
+             497:  425(bvec3) VectorShuffle 496 495 3 4 2
+                              Store 457(bv) 497
+             498:193(i16vec3) Load 356(u16v)
+             499: 36(int16_t) Load 358(u16)
+             500:193(i16vec3) CompositeConstruct 499 499 499
+             501:  425(bvec3) IEqual 498 500
+                              Store 457(bv) 501
+             502: 52(i16vec2) Load 343(i16v)
+             503: 14(int16_t) Load 346(i16)
+             504: 52(i16vec2) CompositeConstruct 503 503
+             505:  174(bvec2) IEqual 502 504
+             506:  425(bvec3) Load 457(bv)
+             507:  425(bvec3) VectorShuffle 506 505 3 4 2
+                              Store 457(bv) 507
+             508:193(i16vec3) Load 356(u16v)
+             509: 36(int16_t) Load 358(u16)
+             510:193(i16vec3) CompositeConstruct 509 509 509
+             511:  425(bvec3) INotEqual 508 510
+                              Store 457(bv) 511
+             512: 52(i16vec2) Load 343(i16v)
+             513: 14(int16_t) Load 346(i16)
+             514: 52(i16vec2) CompositeConstruct 513 513
+             515:  174(bvec2) INotEqual 512 514
+             516:  425(bvec3) Load 457(bv)
+             517:  425(bvec3) VectorShuffle 516 515 3 4 2
+                              Store 457(bv) 517
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.int32.frag.out b/Test/baseResults/spv.int32.frag.out
new file mode 100644
index 0000000..8fd736e
--- /dev/null
+++ b/Test/baseResults/spv.int32.frag.out
@@ -0,0 +1,716 @@
+spv.int32.frag
+error: SPIRV-Tools Validation Errors
+error: Capability Float16 is not allowed by Vulkan 1.1 specification (or requires extension)
+  OpCapability Float16
+
+// Module Version 10300
+// Generated by (magic number): 80007
+// Id's are bound by 493
+
+                              Capability Shader
+                              Capability Float16
+                              Capability Float64
+                              Capability Int64
+                              Capability Int16
+                              Capability Int8
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main"
+                              ExecutionMode 4 OriginUpperLeft
+                              Source GLSL 450
+                              SourceExtension  "GL_EXT_shader_explicit_arithmetic_types"
+                              SourceExtension  "GL_EXT_shader_explicit_arithmetic_types_float16"
+                              SourceExtension  "GL_EXT_shader_explicit_arithmetic_types_float32"
+                              SourceExtension  "GL_EXT_shader_explicit_arithmetic_types_float64"
+                              SourceExtension  "GL_EXT_shader_explicit_arithmetic_types_int16"
+                              SourceExtension  "GL_EXT_shader_explicit_arithmetic_types_int32"
+                              SourceExtension  "GL_EXT_shader_explicit_arithmetic_types_int64"
+                              SourceExtension  "GL_EXT_shader_explicit_arithmetic_types_int8"
+                              Name 4  "main"
+                              Name 6  "literal("
+                              Name 8  "typeCast32("
+                              Name 10  "operators("
+                              Name 12  "builtinFuncs("
+                              Name 16  "u32Max"
+                              Name 20  "i32"
+                              Name 27  "Uniforms"
+                              MemberName 27(Uniforms) 0  "index"
+                              Name 29  ""
+                              Name 35  "indexable"
+                              Name 39  "u32"
+                              Name 46  "indexable"
+                              Name 51  "u32v"
+                              Name 54  "i32v"
+                              Name 60  "i64v"
+                              Name 66  "u64v"
+                              Name 78  "f32v"
+                              Name 84  "f64v"
+                              Name 94  "i8v"
+                              Name 105  "i16v"
+                              Name 125  "u8v"
+                              Name 132  "u16v"
+                              Name 152  "f16v"
+                              Name 168  "bv"
+                              Name 186  "u32v"
+                              Name 191  "i32"
+                              Name 210  "i"
+                              Name 214  "uv"
+                              Name 227  "i64"
+                              Name 260  "b"
+                              Name 312  "i32v"
+                              Name 315  "i32"
+                              Name 325  "u32v"
+                              Name 327  "u32"
+                              Name 399  "i8v4"
+                              Name 402  "i16v2"
+                              Name 407  "u8v4"
+                              Name 410  "u16v2"
+                              Name 413  "i64"
+                              Name 416  "u32v2"
+                              Name 418  "u64"
+                              Name 422  "bv"
+                              Name 485  "Block"
+                              MemberName 485(Block) 0  "i32"
+                              MemberName 485(Block) 1  "i32v2"
+                              MemberName 485(Block) 2  "i32v3"
+                              MemberName 485(Block) 3  "i32v4"
+                              MemberName 485(Block) 4  "u32"
+                              MemberName 485(Block) 5  "u32v2"
+                              MemberName 485(Block) 6  "u32v3"
+                              MemberName 485(Block) 7  "u32v4"
+                              Name 487  "block"
+                              Name 488  "si32"
+                              Name 489  "su32"
+                              Name 490  "si"
+                              Name 491  "su"
+                              Name 492  "sb"
+                              MemberDecorate 27(Uniforms) 0 Offset 0
+                              Decorate 27(Uniforms) Block
+                              Decorate 29 DescriptorSet 0
+                              Decorate 29 Binding 0
+                              MemberDecorate 485(Block) 0 Offset 0
+                              MemberDecorate 485(Block) 1 Offset 8
+                              MemberDecorate 485(Block) 2 Offset 16
+                              MemberDecorate 485(Block) 3 Offset 32
+                              MemberDecorate 485(Block) 4 Offset 48
+                              MemberDecorate 485(Block) 5 Offset 56
+                              MemberDecorate 485(Block) 6 Offset 64
+                              MemberDecorate 485(Block) 7 Offset 80
+                              Decorate 485(Block) Block
+                              Decorate 487(block) DescriptorSet 0
+                              Decorate 487(block) Binding 1
+                              Decorate 488(si32) SpecId 100
+                              Decorate 489(su32) SpecId 101
+                              Decorate 490(si) SpecId 102
+                              Decorate 491(su) SpecId 103
+                              Decorate 492(sb) SpecId 104
+               2:             TypeVoid
+               3:             TypeFunction 2
+              14:             TypeInt 32 0
+              15:             TypePointer Private 14(int)
+      16(u32Max):     15(ptr) Variable Private
+              17:     14(int) Constant 4294967295
+              18:             TypeInt 32 1
+              19:             TypePointer Function 18(int)
+              21:     14(int) Constant 3
+              22:             TypeArray 18(int) 21
+              23:     18(int) Constant 4008636143
+              24:     18(int) Constant 4294967295
+              25:     18(int) Constant 536870912
+              26:          22 ConstantComposite 23 24 25
+    27(Uniforms):             TypeStruct 14(int)
+              28:             TypePointer Uniform 27(Uniforms)
+              29:     28(ptr) Variable Uniform
+              30:     18(int) Constant 0
+              31:             TypePointer Uniform 14(int)
+              34:             TypePointer Function 22
+              38:             TypePointer Function 14(int)
+              40:             TypeArray 14(int) 21
+              41:     14(int) Constant 2147483647
+              42:          40 ConstantComposite 17 17 41
+              45:             TypePointer Function 40
+              49:             TypeVector 14(int) 2
+              50:             TypePointer Function 49(ivec2)
+              52:             TypeVector 18(int) 2
+              53:             TypePointer Function 52(ivec2)
+              57:             TypeInt 64 1
+              58:             TypeVector 57(int64_t) 2
+              59:             TypePointer Function 58(i64vec2)
+              63:             TypeInt 64 0
+              64:             TypeVector 63(int64_t) 2
+              65:             TypePointer Function 64(i64vec2)
+              75:             TypeFloat 32
+              76:             TypeVector 75(float) 2
+              77:             TypePointer Function 76(fvec2)
+              81:             TypeFloat 64
+              82:             TypeVector 81(float64_t) 2
+              83:             TypePointer Function 82(f64vec2)
+              91:             TypeInt 8 1
+              92:             TypeVector 91(int8_t) 2
+              93:             TypePointer Function 92(i8vec2)
+              98:             TypeInt 8 0
+              99:             TypeVector 98(int8_t) 2
+             102:             TypeInt 16 1
+             103:             TypeVector 102(int16_t) 2
+             104:             TypePointer Function 103(i16vec2)
+             109:             TypeInt 16 0
+             110:             TypeVector 109(int16_t) 2
+             124:             TypePointer Function 99(i8vec2)
+             131:             TypePointer Function 110(i16vec2)
+             149:             TypeFloat 16
+             150:             TypeVector 149(float16_t) 2
+             151:             TypePointer Function 150(f16vec2)
+             165:             TypeBool
+             166:             TypeVector 165(bool) 2
+             167:             TypePointer Function 166(bvec2)
+             170:     18(int) Constant 1
+             171:   52(ivec2) ConstantComposite 30 30
+             172:   52(ivec2) ConstantComposite 170 170
+             175:     14(int) Constant 0
+             176:     14(int) Constant 1
+             177:   49(ivec2) ConstantComposite 175 175
+             178:   49(ivec2) ConstantComposite 176 176
+             184:             TypeVector 14(int) 3
+             185:             TypePointer Function 184(ivec3)
+             188:             TypeVector 18(int) 3
+             226:             TypePointer Function 57(int64_t)
+             251:     14(int) Constant 2
+             259:             TypePointer Function 165(bool)
+             323:   52(ivec2) ConstantComposite 24 24
+             332:  184(ivec3) ConstantComposite 175 175 175
+             374:   165(bool) ConstantTrue
+             381:   165(bool) ConstantFalse
+             382:  166(bvec2) ConstantComposite 381 381
+             394:             TypeVector 165(bool) 3
+             395:  394(bvec3) ConstantComposite 381 381 381
+             397:             TypeVector 91(int8_t) 4
+             398:             TypePointer Function 397(i8vec4)
+             405:             TypeVector 98(int8_t) 4
+             406:             TypePointer Function 405(i8vec4)
+             417:             TypePointer Function 63(int64_t)
+             421:             TypePointer Function 394(bvec3)
+             483:             TypeVector 18(int) 4
+             484:             TypeVector 14(int) 4
+      485(Block):             TypeStruct 18(int) 52(ivec2) 188(ivec3) 483(ivec4) 14(int) 49(ivec2) 184(ivec3) 484(ivec4)
+             486:             TypePointer Uniform 485(Block)
+      487(block):    486(ptr) Variable Uniform
+       488(si32):     18(int) SpecConstant 4294967286
+       489(su32):     14(int) SpecConstant 20
+         490(si):     18(int) SpecConstant 4294967291
+         491(su):     14(int) SpecConstant 4
+         492(sb):   165(bool) SpecConstantTrue
+         4(main):           2 Function None 3
+               5:             Label
+                              Store 16(u32Max) 17
+                              Return
+                              FunctionEnd
+     6(literal():           2 Function None 3
+               7:             Label
+         20(i32):     19(ptr) Variable Function
+   35(indexable):     34(ptr) Variable Function
+         39(u32):     38(ptr) Variable Function
+   46(indexable):     45(ptr) Variable Function
+              32:     31(ptr) AccessChain 29 30
+              33:     14(int) Load 32
+                              Store 35(indexable) 26
+              36:     19(ptr) AccessChain 35(indexable) 33
+              37:     18(int) Load 36
+                              Store 20(i32) 37
+              43:     31(ptr) AccessChain 29 30
+              44:     14(int) Load 43
+                              Store 46(indexable) 42
+              47:     38(ptr) AccessChain 46(indexable) 44
+              48:     14(int) Load 47
+                              Store 39(u32) 48
+                              Return
+                              FunctionEnd
+  8(typeCast32():           2 Function None 3
+               9:             Label
+        51(u32v):     50(ptr) Variable Function
+        54(i32v):     53(ptr) Variable Function
+        60(i64v):     59(ptr) Variable Function
+        66(u64v):     65(ptr) Variable Function
+        78(f32v):     77(ptr) Variable Function
+        84(f64v):     83(ptr) Variable Function
+         94(i8v):     93(ptr) Variable Function
+       105(i16v):    104(ptr) Variable Function
+        125(u8v):    124(ptr) Variable Function
+       132(u16v):    131(ptr) Variable Function
+       152(f16v):    151(ptr) Variable Function
+         168(bv):    167(ptr) Variable Function
+              55:   52(ivec2) Load 54(i32v)
+              56:   49(ivec2) Bitcast 55
+                              Store 51(u32v) 56
+              61:   52(ivec2) Load 54(i32v)
+              62: 58(i64vec2) SConvert 61
+                              Store 60(i64v) 62
+              67:   52(ivec2) Load 54(i32v)
+              68: 58(i64vec2) SConvert 67
+              69: 64(i64vec2) Bitcast 68
+                              Store 66(u64v) 69
+              70:   49(ivec2) Load 51(u32v)
+              71: 64(i64vec2) UConvert 70
+              72: 58(i64vec2) Bitcast 71
+                              Store 60(i64v) 72
+              73:   49(ivec2) Load 51(u32v)
+              74: 64(i64vec2) UConvert 73
+                              Store 66(u64v) 74
+              79:   52(ivec2) Load 54(i32v)
+              80:   76(fvec2) ConvertSToF 79
+                              Store 78(f32v) 80
+              85:   52(ivec2) Load 54(i32v)
+              86: 82(f64vec2) ConvertSToF 85
+                              Store 84(f64v) 86
+              87:   49(ivec2) Load 51(u32v)
+              88:   76(fvec2) ConvertUToF 87
+                              Store 78(f32v) 88
+              89:   49(ivec2) Load 51(u32v)
+              90: 82(f64vec2) ConvertUToF 89
+                              Store 84(f64v) 90
+              95:   52(ivec2) Load 54(i32v)
+              96:  92(i8vec2) SConvert 95
+                              Store 94(i8v) 96
+              97:   49(ivec2) Load 51(u32v)
+             100:  99(i8vec2) UConvert 97
+             101:  92(i8vec2) Bitcast 100
+                              Store 94(i8v) 101
+             106:   52(ivec2) Load 54(i32v)
+             107:103(i16vec2) SConvert 106
+                              Store 105(i16v) 107
+             108:   49(ivec2) Load 51(u32v)
+             111:110(i16vec2) UConvert 108
+             112:103(i16vec2) Bitcast 111
+                              Store 105(i16v) 112
+             113:   52(ivec2) Load 54(i32v)
+             114:     18(int) CompositeExtract 113 0
+             115:     18(int) CompositeExtract 113 1
+             116:   52(ivec2) CompositeConstruct 114 115
+                              Store 54(i32v) 116
+             117:   49(ivec2) Load 51(u32v)
+             118:   52(ivec2) Bitcast 117
+                              Store 54(i32v) 118
+             119:   52(ivec2) Load 54(i32v)
+             120: 58(i64vec2) SConvert 119
+                              Store 60(i64v) 120
+             121:   49(ivec2) Load 51(u32v)
+             122: 64(i64vec2) UConvert 121
+             123: 58(i64vec2) Bitcast 122
+                              Store 60(i64v) 123
+             126:   52(ivec2) Load 54(i32v)
+             127:  92(i8vec2) SConvert 126
+             128:  99(i8vec2) Bitcast 127
+                              Store 125(u8v) 128
+             129:   49(ivec2) Load 51(u32v)
+             130:  99(i8vec2) UConvert 129
+                              Store 125(u8v) 130
+             133:   52(ivec2) Load 54(i32v)
+             134:103(i16vec2) SConvert 133
+             135:110(i16vec2) Bitcast 134
+                              Store 132(u16v) 135
+             136:   49(ivec2) Load 51(u32v)
+             137:110(i16vec2) UConvert 136
+                              Store 132(u16v) 137
+             138:   52(ivec2) Load 54(i32v)
+             139:   49(ivec2) Bitcast 138
+                              Store 51(u32v) 139
+             140:   49(ivec2) Load 51(u32v)
+             141:     14(int) CompositeExtract 140 0
+             142:     14(int) CompositeExtract 140 1
+             143:   49(ivec2) CompositeConstruct 141 142
+                              Store 51(u32v) 143
+             144:   52(ivec2) Load 54(i32v)
+             145: 58(i64vec2) SConvert 144
+             146: 64(i64vec2) Bitcast 145
+                              Store 66(u64v) 146
+             147:   49(ivec2) Load 51(u32v)
+             148: 64(i64vec2) UConvert 147
+                              Store 66(u64v) 148
+             153:   52(ivec2) Load 54(i32v)
+             154:150(f16vec2) ConvertSToF 153
+                              Store 152(f16v) 154
+             155:   52(ivec2) Load 54(i32v)
+             156:   76(fvec2) ConvertSToF 155
+                              Store 78(f32v) 156
+             157:   52(ivec2) Load 54(i32v)
+             158: 82(f64vec2) ConvertSToF 157
+                              Store 84(f64v) 158
+             159:   49(ivec2) Load 51(u32v)
+             160:150(f16vec2) ConvertUToF 159
+                              Store 152(f16v) 160
+             161:   49(ivec2) Load 51(u32v)
+             162:   76(fvec2) ConvertUToF 161
+                              Store 78(f32v) 162
+             163:   49(ivec2) Load 51(u32v)
+             164: 82(f64vec2) ConvertUToF 163
+                              Store 84(f64v) 164
+             169:  166(bvec2) Load 168(bv)
+             173:   52(ivec2) Select 169 172 171
+                              Store 54(i32v) 173
+             174:  166(bvec2) Load 168(bv)
+             179:   49(ivec2) Select 174 178 177
+                              Store 51(u32v) 179
+             180:   52(ivec2) Load 54(i32v)
+             181:  166(bvec2) INotEqual 180 177
+                              Store 168(bv) 181
+             182:   49(ivec2) Load 51(u32v)
+             183:  166(bvec2) INotEqual 182 177
+                              Store 168(bv) 183
+                              Return
+                              FunctionEnd
+  10(operators():           2 Function None 3
+              11:             Label
+       186(u32v):    185(ptr) Variable Function
+        191(i32):     19(ptr) Variable Function
+          210(i):     19(ptr) Variable Function
+         214(uv):    185(ptr) Variable Function
+        227(i64):    226(ptr) Variable Function
+          260(b):    259(ptr) Variable Function
+             187:  184(ivec3) Load 186(u32v)
+             189:  188(ivec3) CompositeConstruct 170 170 170
+             190:  184(ivec3) IAdd 187 189
+                              Store 186(u32v) 190
+             192:     18(int) Load 191(i32)
+             193:     18(int) ISub 192 170
+                              Store 191(i32) 193
+             194:     18(int) Load 191(i32)
+             195:     18(int) IAdd 194 170
+                              Store 191(i32) 195
+             196:  184(ivec3) Load 186(u32v)
+             197:  188(ivec3) CompositeConstruct 170 170 170
+             198:  184(ivec3) ISub 196 197
+                              Store 186(u32v) 198
+             199:  184(ivec3) Load 186(u32v)
+             200:  184(ivec3) Not 199
+                              Store 186(u32v) 200
+             201:     18(int) Load 191(i32)
+                              Store 191(i32) 201
+             202:  184(ivec3) Load 186(u32v)
+             203:  184(ivec3) SNegate 202
+                              Store 186(u32v) 203
+             204:     18(int) Load 191(i32)
+             205:     18(int) Load 191(i32)
+             206:     18(int) IAdd 205 204
+                              Store 191(i32) 206
+             207:  184(ivec3) Load 186(u32v)
+             208:  184(ivec3) Load 186(u32v)
+             209:  184(ivec3) ISub 208 207
+                              Store 186(u32v) 209
+             211:     18(int) Load 191(i32)
+             212:     18(int) Load 210(i)
+             213:     18(int) IMul 212 211
+                              Store 210(i) 213
+             215:  184(ivec3) Load 186(u32v)
+             216:  184(ivec3) Load 214(uv)
+             217:  184(ivec3) UDiv 216 215
+                              Store 214(uv) 217
+             218:     18(int) Load 191(i32)
+             219:     14(int) Bitcast 218
+             220:  184(ivec3) Load 214(uv)
+             221:  184(ivec3) CompositeConstruct 219 219 219
+             222:  184(ivec3) UMod 220 221
+                              Store 214(uv) 222
+             223:  184(ivec3) Load 186(u32v)
+             224:  184(ivec3) Load 214(uv)
+             225:  184(ivec3) IAdd 223 224
+                              Store 214(uv) 225
+             228:     18(int) Load 191(i32)
+             229: 57(int64_t) SConvert 228
+             230: 57(int64_t) Load 227(i64)
+             231: 57(int64_t) ISub 229 230
+                              Store 227(i64) 231
+             232:  184(ivec3) Load 186(u32v)
+             233:  184(ivec3) Load 214(uv)
+             234:  184(ivec3) IMul 232 233
+                              Store 214(uv) 234
+             235:     18(int) Load 191(i32)
+             236: 57(int64_t) SConvert 235
+             237: 57(int64_t) Load 227(i64)
+             238: 57(int64_t) IMul 236 237
+                              Store 227(i64) 238
+             239:     18(int) Load 191(i32)
+             240:     18(int) Load 210(i)
+             241:     18(int) SMod 239 240
+                              Store 210(i) 241
+             242:     18(int) Load 191(i32)
+             243:  184(ivec3) Load 186(u32v)
+             244:  188(ivec3) CompositeConstruct 242 242 242
+             245:  184(ivec3) ShiftLeftLogical 243 244
+                              Store 186(u32v) 245
+             246:     38(ptr) AccessChain 186(u32v) 176
+             247:     14(int) Load 246
+             248:     18(int) Load 191(i32)
+             249:     18(int) ShiftRightArithmetic 248 247
+                              Store 191(i32) 249
+             250: 57(int64_t) Load 227(i64)
+             252:     38(ptr) AccessChain 186(u32v) 251
+             253:     14(int) Load 252
+             254: 57(int64_t) ShiftLeftLogical 250 253
+                              Store 227(i64) 254
+             255:  184(ivec3) Load 186(u32v)
+             256:     18(int) Load 210(i)
+             257:  188(ivec3) CompositeConstruct 256 256 256
+             258:  184(ivec3) ShiftLeftLogical 255 257
+                              Store 214(uv) 258
+             261:     38(ptr) AccessChain 186(u32v) 175
+             262:     14(int) Load 261
+             263:     18(int) Load 191(i32)
+             264:     14(int) Bitcast 263
+             265:   165(bool) INotEqual 262 264
+                              Store 260(b) 265
+             266:     18(int) Load 191(i32)
+             267:     14(int) Bitcast 266
+             268:     38(ptr) AccessChain 186(u32v) 175
+             269:     14(int) Load 268
+             270:   165(bool) IEqual 267 269
+                              Store 260(b) 270
+             271:     38(ptr) AccessChain 186(u32v) 175
+             272:     14(int) Load 271
+             273:     38(ptr) AccessChain 214(uv) 176
+             274:     14(int) Load 273
+             275:   165(bool) UGreaterThan 272 274
+                              Store 260(b) 275
+             276:     18(int) Load 191(i32)
+             277:     18(int) Load 210(i)
+             278:   165(bool) SLessThan 276 277
+                              Store 260(b) 278
+             279:     38(ptr) AccessChain 186(u32v) 176
+             280:     14(int) Load 279
+             281:     38(ptr) AccessChain 214(uv) 175
+             282:     14(int) Load 281
+             283:   165(bool) UGreaterThanEqual 280 282
+                              Store 260(b) 283
+             284:     18(int) Load 191(i32)
+             285:     18(int) Load 210(i)
+             286:   165(bool) SLessThanEqual 284 285
+                              Store 260(b) 286
+             287:     18(int) Load 191(i32)
+             288:     14(int) Bitcast 287
+             289:  184(ivec3) Load 214(uv)
+             290:  184(ivec3) CompositeConstruct 288 288 288
+             291:  184(ivec3) BitwiseOr 289 290
+                              Store 214(uv) 291
+             292:     18(int) Load 191(i32)
+             293:     18(int) Load 210(i)
+             294:     18(int) BitwiseOr 292 293
+                              Store 210(i) 294
+             295:     18(int) Load 191(i32)
+             296: 57(int64_t) SConvert 295
+             297: 57(int64_t) Load 227(i64)
+             298: 57(int64_t) BitwiseAnd 297 296
+                              Store 227(i64) 298
+             299:  184(ivec3) Load 186(u32v)
+             300:  184(ivec3) Load 214(uv)
+             301:  184(ivec3) BitwiseAnd 299 300
+                              Store 214(uv) 301
+             302:     18(int) Load 191(i32)
+             303:     14(int) Bitcast 302
+             304:  184(ivec3) Load 214(uv)
+             305:  184(ivec3) CompositeConstruct 303 303 303
+             306:  184(ivec3) BitwiseXor 304 305
+                              Store 214(uv) 306
+             307:  184(ivec3) Load 186(u32v)
+             308:     18(int) Load 191(i32)
+             309:     14(int) Bitcast 308
+             310:  184(ivec3) CompositeConstruct 309 309 309
+             311:  184(ivec3) BitwiseXor 307 310
+                              Store 186(u32v) 311
+                              Return
+                              FunctionEnd
+12(builtinFuncs():           2 Function None 3
+              13:             Label
+       312(i32v):     53(ptr) Variable Function
+        315(i32):     19(ptr) Variable Function
+       325(u32v):    185(ptr) Variable Function
+        327(u32):     38(ptr) Variable Function
+       399(i8v4):    398(ptr) Variable Function
+      402(i16v2):    104(ptr) Variable Function
+       407(u8v4):    406(ptr) Variable Function
+      410(u16v2):    131(ptr) Variable Function
+        413(i64):    226(ptr) Variable Function
+      416(u32v2):     50(ptr) Variable Function
+        418(u64):    417(ptr) Variable Function
+         422(bv):    421(ptr) Variable Function
+             313:   52(ivec2) Load 312(i32v)
+             314:   52(ivec2) ExtInst 1(GLSL.std.450) 5(SAbs) 313
+                              Store 312(i32v) 314
+             316:     18(int) Load 315(i32)
+             317:     18(int) ExtInst 1(GLSL.std.450) 7(SSign) 316
+                              Store 315(i32) 317
+             318:   52(ivec2) Load 312(i32v)
+             319:     18(int) Load 315(i32)
+             320:   52(ivec2) CompositeConstruct 319 319
+             321:   52(ivec2) ExtInst 1(GLSL.std.450) 39(SMin) 318 320
+                              Store 312(i32v) 321
+             322:   52(ivec2) Load 312(i32v)
+             324:   52(ivec2) ExtInst 1(GLSL.std.450) 39(SMin) 322 323
+                              Store 312(i32v) 324
+             326:  184(ivec3) Load 325(u32v)
+             328:     14(int) Load 327(u32)
+             329:  184(ivec3) CompositeConstruct 328 328 328
+             330:  184(ivec3) ExtInst 1(GLSL.std.450) 38(UMin) 326 329
+                              Store 325(u32v) 330
+             331:  184(ivec3) Load 325(u32v)
+             333:  184(ivec3) ExtInst 1(GLSL.std.450) 38(UMin) 331 332
+                              Store 325(u32v) 333
+             334:   52(ivec2) Load 312(i32v)
+             335:     18(int) Load 315(i32)
+             336:   52(ivec2) CompositeConstruct 335 335
+             337:   52(ivec2) ExtInst 1(GLSL.std.450) 42(SMax) 334 336
+                              Store 312(i32v) 337
+             338:   52(ivec2) Load 312(i32v)
+             339:   52(ivec2) ExtInst 1(GLSL.std.450) 42(SMax) 338 323
+                              Store 312(i32v) 339
+             340:  184(ivec3) Load 325(u32v)
+             341:     14(int) Load 327(u32)
+             342:  184(ivec3) CompositeConstruct 341 341 341
+             343:  184(ivec3) ExtInst 1(GLSL.std.450) 41(UMax) 340 342
+                              Store 325(u32v) 343
+             344:  184(ivec3) Load 325(u32v)
+             345:  184(ivec3) ExtInst 1(GLSL.std.450) 41(UMax) 344 332
+                              Store 325(u32v) 345
+             346:   52(ivec2) Load 312(i32v)
+             347:     18(int) Load 315(i32)
+             348:     18(int) SNegate 347
+             349:     18(int) Load 315(i32)
+             350:   52(ivec2) CompositeConstruct 348 348
+             351:   52(ivec2) CompositeConstruct 349 349
+             352:   52(ivec2) ExtInst 1(GLSL.std.450) 45(SClamp) 346 350 351
+                              Store 312(i32v) 352
+             353:   52(ivec2) Load 312(i32v)
+             354:   52(ivec2) Load 312(i32v)
+             355:   52(ivec2) SNegate 354
+             356:   52(ivec2) Load 312(i32v)
+             357:   52(ivec2) ExtInst 1(GLSL.std.450) 45(SClamp) 353 355 356
+                              Store 312(i32v) 357
+             358:  184(ivec3) Load 325(u32v)
+             359:     14(int) Load 327(u32)
+             360:     14(int) SNegate 359
+             361:     14(int) Load 327(u32)
+             362:  184(ivec3) CompositeConstruct 360 360 360
+             363:  184(ivec3) CompositeConstruct 361 361 361
+             364:  184(ivec3) ExtInst 1(GLSL.std.450) 44(UClamp) 358 362 363
+                              Store 325(u32v) 364
+             365:  184(ivec3) Load 325(u32v)
+             366:  184(ivec3) Load 325(u32v)
+             367:  184(ivec3) SNegate 366
+             368:  184(ivec3) Load 325(u32v)
+             369:  184(ivec3) ExtInst 1(GLSL.std.450) 44(UClamp) 365 367 368
+                              Store 325(u32v) 369
+             370:     19(ptr) AccessChain 312(i32v) 175
+             371:     18(int) Load 370
+             372:     19(ptr) AccessChain 312(i32v) 176
+             373:     18(int) Load 372
+             375:     18(int) Select 374 373 371
+                              Store 315(i32) 375
+             376:     18(int) Load 315(i32)
+             377:   52(ivec2) CompositeConstruct 376 376
+             378:     18(int) Load 315(i32)
+             379:     18(int) SNegate 378
+             380:   52(ivec2) CompositeConstruct 379 379
+             383:   52(ivec2) Select 382 380 377
+                              Store 312(i32v) 383
+             384:     38(ptr) AccessChain 325(u32v) 175
+             385:     14(int) Load 384
+             386:     38(ptr) AccessChain 325(u32v) 176
+             387:     14(int) Load 386
+             388:     14(int) Select 374 387 385
+                              Store 327(u32) 388
+             389:     14(int) Load 327(u32)
+             390:  184(ivec3) CompositeConstruct 389 389 389
+             391:     14(int) Load 327(u32)
+             392:     14(int) SNegate 391
+             393:  184(ivec3) CompositeConstruct 392 392 392
+             396:  184(ivec3) Select 395 393 390
+                              Store 325(u32v) 396
+             400: 397(i8vec4) Load 399(i8v4)
+             401:     18(int) Bitcast 400
+                              Store 315(i32) 401
+             403:103(i16vec2) Load 402(i16v2)
+             404:     18(int) Bitcast 403
+                              Store 315(i32) 404
+             408: 405(i8vec4) Load 407(u8v4)
+             409:     14(int) Bitcast 408
+                              Store 327(u32) 409
+             411:110(i16vec2) Load 410(u16v2)
+             412:     14(int) Bitcast 411
+                              Store 327(u32) 412
+             414: 57(int64_t) Load 413(i64)
+             415:   52(ivec2) Bitcast 414
+                              Store 312(i32v) 415
+             419: 63(int64_t) Load 418(u64)
+             420:   49(ivec2) Bitcast 419
+                              Store 416(u32v2) 420
+             423:  184(ivec3) Load 325(u32v)
+             424:     14(int) Load 327(u32)
+             425:  184(ivec3) CompositeConstruct 424 424 424
+             426:  394(bvec3) ULessThan 423 425
+                              Store 422(bv) 426
+             427:   52(ivec2) Load 312(i32v)
+             428:     18(int) Load 315(i32)
+             429:   52(ivec2) CompositeConstruct 428 428
+             430:  166(bvec2) SLessThan 427 429
+             431:  394(bvec3) Load 422(bv)
+             432:  394(bvec3) VectorShuffle 431 430 3 4 2
+                              Store 422(bv) 432
+             433:  184(ivec3) Load 325(u32v)
+             434:     14(int) Load 327(u32)
+             435:  184(ivec3) CompositeConstruct 434 434 434
+             436:  394(bvec3) ULessThanEqual 433 435
+                              Store 422(bv) 436
+             437:   52(ivec2) Load 312(i32v)
+             438:     18(int) Load 315(i32)
+             439:   52(ivec2) CompositeConstruct 438 438
+             440:  166(bvec2) SLessThanEqual 437 439
+             441:  394(bvec3) Load 422(bv)
+             442:  394(bvec3) VectorShuffle 441 440 3 4 2
+                              Store 422(bv) 442
+             443:  184(ivec3) Load 325(u32v)
+             444:     14(int) Load 327(u32)
+             445:  184(ivec3) CompositeConstruct 444 444 444
+             446:  394(bvec3) UGreaterThan 443 445
+                              Store 422(bv) 446
+             447:   52(ivec2) Load 312(i32v)
+             448:     18(int) Load 315(i32)
+             449:   52(ivec2) CompositeConstruct 448 448
+             450:  166(bvec2) SGreaterThan 447 449
+             451:  394(bvec3) Load 422(bv)
+             452:  394(bvec3) VectorShuffle 451 450 3 4 2
+                              Store 422(bv) 452
+             453:  184(ivec3) Load 325(u32v)
+             454:     14(int) Load 327(u32)
+             455:  184(ivec3) CompositeConstruct 454 454 454
+             456:  394(bvec3) UGreaterThanEqual 453 455
+                              Store 422(bv) 456
+             457:   52(ivec2) Load 312(i32v)
+             458:     18(int) Load 315(i32)
+             459:   52(ivec2) CompositeConstruct 458 458
+             460:  166(bvec2) SGreaterThanEqual 457 459
+             461:  394(bvec3) Load 422(bv)
+             462:  394(bvec3) VectorShuffle 461 460 3 4 2
+                              Store 422(bv) 462
+             463:  184(ivec3) Load 325(u32v)
+             464:     14(int) Load 327(u32)
+             465:  184(ivec3) CompositeConstruct 464 464 464
+             466:  394(bvec3) IEqual 463 465
+                              Store 422(bv) 466
+             467:   52(ivec2) Load 312(i32v)
+             468:     18(int) Load 315(i32)
+             469:   52(ivec2) CompositeConstruct 468 468
+             470:  166(bvec2) IEqual 467 469
+             471:  394(bvec3) Load 422(bv)
+             472:  394(bvec3) VectorShuffle 471 470 3 4 2
+                              Store 422(bv) 472
+             473:  184(ivec3) Load 325(u32v)
+             474:     14(int) Load 327(u32)
+             475:  184(ivec3) CompositeConstruct 474 474 474
+             476:  394(bvec3) INotEqual 473 475
+                              Store 422(bv) 476
+             477:   52(ivec2) Load 312(i32v)
+             478:     18(int) Load 315(i32)
+             479:   52(ivec2) CompositeConstruct 478 478
+             480:  166(bvec2) INotEqual 477 479
+             481:  394(bvec3) Load 422(bv)
+             482:  394(bvec3) VectorShuffle 481 480 3 4 2
+                              Store 422(bv) 482
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.int64.frag.out b/Test/baseResults/spv.int64.frag.out
index df35fea..013934c 100644
--- a/Test/baseResults/spv.int64.frag.out
+++ b/Test/baseResults/spv.int64.frag.out
@@ -1,9 +1,11 @@
 spv.int64.frag
-Warning, version 450 is not yet complete; most version-specific features are present, but some are missing.
+error: SPIRV-Tools Validation Errors
+error: OpDecorate SpecId decoration target <id> '1' is not a scalar specialization constant.
+  OpDecorate %su64inc SpecId 105
 
 // Module Version 10000
-// Generated by (magic number): 80001
-// Id's are bound by 480
+// Generated by (magic number): 80007
+// Id's are bound by 489
 
                               Capability Shader
                               Capability Float64
@@ -14,6 +16,7 @@
                               ExecutionMode 4 OriginUpperLeft
                               Source GLSL 450
                               SourceExtension  "GL_ARB_gpu_shader_int64"
+                              SourceExtension  "GL_EXT_shader_explicit_arithmetic_types_int64"
                               Name 4  "main"
                               Name 6  "literal("
                               Name 8  "typeCast("
@@ -38,52 +41,68 @@
                               Name 139  "i64"
                               Name 159  "i"
                               Name 166  "uv"
-                              Name 218  "b"
-                              Name 278  "i64v"
-                              Name 281  "i64"
-                              Name 291  "u64v"
-                              Name 293  "u64"
-                              Name 365  "dv"
-                              Name 384  "iv"
-                              Name 389  "uv"
-                              Name 393  "bv"
-                              Name 454  "Block"
-                              MemberName 454(Block) 0  "i64v"
-                              MemberName 454(Block) 1  "u64"
-                              Name 456  "block"
-                              Name 457  "si64"
-                              Name 458  "su64"
-                              Name 459  "si"
-                              Name 460  "su"
-                              Name 461  "sb"
+                              Name 226  "b"
+                              Name 286  "i64v"
+                              Name 289  "i64"
+                              Name 299  "u64v"
+                              Name 301  "u64"
+                              Name 373  "dv"
+                              Name 392  "iv"
+                              Name 397  "uv"
+                              Name 401  "bv"
+                              Name 462  "Block"
+                              MemberName 462(Block) 0  "i64v"
+                              MemberName 462(Block) 1  "u64"
+                              Name 464  "block"
+                              Name 465  "si64"
+                              Name 466  "su64"
+                              Name 467  "si"
+                              Name 468  "su"
+                              Name 469  "sb"
+                              Name 470  "su64inc"
+                              Name 471  "i64_to_b"
+                              Name 472  "u64_to_b"
+                              Name 473  "b_to_i64"
+                              Name 474  "b_to_u64"
+                              Name 475  "i64_to_i"
+                              Name 476  "i_to_i64"
+                              Name 477  "u64_to_u"
+                              Name 478  "u_to_u64"
+                              Name 479  "u64_to_i64"
+                              Name 480  "i64_to_u64"
+                              Name 482  "u64_to_i"
+                              Name 484  "i_to_u64"
+                              Name 486  "i64_to_u"
+                              Name 488  "u_to_i64"
                               MemberDecorate 28(Uniforms) 0 Offset 0
                               Decorate 28(Uniforms) Block
                               Decorate 30 DescriptorSet 0
                               Decorate 30 Binding 0
-                              MemberDecorate 454(Block) 0 Offset 0
-                              MemberDecorate 454(Block) 1 Offset 24
-                              Decorate 454(Block) Block
-                              Decorate 456(block) DescriptorSet 0
-                              Decorate 456(block) Binding 1
-                              Decorate 457(si64) SpecId 100
-                              Decorate 458(su64) SpecId 101
-                              Decorate 459(si) SpecId 102
-                              Decorate 460(su) SpecId 103
-                              Decorate 461(sb) SpecId 104
+                              MemberDecorate 462(Block) 0 Offset 0
+                              MemberDecorate 462(Block) 1 Offset 24
+                              Decorate 462(Block) Block
+                              Decorate 464(block) DescriptorSet 0
+                              Decorate 464(block) Binding 1
+                              Decorate 465(si64) SpecId 100
+                              Decorate 466(su64) SpecId 101
+                              Decorate 467(si) SpecId 102
+                              Decorate 468(su) SpecId 103
+                              Decorate 469(sb) SpecId 104
+                              Decorate 470(su64inc) SpecId 105
                2:             TypeVoid
                3:             TypeFunction 2
               14:             TypeInt 64 0
-              15:             TypePointer Private 14(int)
+              15:             TypePointer Private 14(int64_t)
       16(u64Max):     15(ptr) Variable Private
-              17:     14(int) Constant 4294967295 4294967295
+              17: 14(int64_t) Constant 4294967295 4294967295
               18:             TypeInt 64 1
-              19:             TypePointer Function 18(int)
+              19:             TypePointer Function 18(int64_t)
               21:             TypeInt 32 0
               22:     21(int) Constant 3
-              23:             TypeArray 18(int) 22
-              24:     18(int) Constant 4008636143 4008636142
-              25:     18(int) Constant 4294967295 4294967295
-              26:     18(int) Constant 0 1
+              23:             TypeArray 18(int64_t) 22
+              24: 18(int64_t) Constant 4008636143 4008636142
+              25: 18(int64_t) Constant 4294967295 4294967295
+              26: 18(int64_t) Constant 0 1
               27:          23 ConstantComposite 24 25 26
     28(Uniforms):             TypeStruct 21(int)
               29:             TypePointer Uniform 28(Uniforms)
@@ -92,27 +111,27 @@
               32:     31(int) Constant 0
               33:             TypePointer Uniform 21(int)
               36:             TypePointer Function 23
-              40:             TypePointer Function 14(int)
-              42:             TypeArray 14(int) 22
-              43:     14(int) Constant 0 1
-              44:     14(int) Constant 4294967295 1
+              40:             TypePointer Function 14(int64_t)
+              42:             TypeArray 14(int64_t) 22
+              43: 14(int64_t) Constant 0 1
+              44: 14(int64_t) Constant 4294967295 1
               45:          42 ConstantComposite 17 43 44
               48:             TypePointer Function 42
-              52:             TypeVector 18(int) 2
-              53:             TypePointer Function 52(ivec2)
+              52:             TypeVector 18(int64_t) 2
+              53:             TypePointer Function 52(i64vec2)
               55:             TypeBool
               56:             TypeVector 55(bool) 2
               57:             TypePointer Function 56(bvec2)
-              60:     18(int) Constant 0 0
-              61:     18(int) Constant 1 0
-              62:   52(ivec2) ConstantComposite 60 60
-              63:   52(ivec2) ConstantComposite 61 61
-              65:             TypeVector 14(int) 2
-              66:             TypePointer Function 65(ivec2)
-              69:     14(int) Constant 0 0
-              70:     14(int) Constant 1 0
-              71:   65(ivec2) ConstantComposite 69 69
-              72:   65(ivec2) ConstantComposite 70 70
+              60: 18(int64_t) Constant 0 0
+              61: 18(int64_t) Constant 1 0
+              62: 52(i64vec2) ConstantComposite 60 60
+              63: 52(i64vec2) ConstantComposite 61 61
+              65:             TypeVector 14(int64_t) 2
+              66:             TypePointer Function 65(i64vec2)
+              69: 14(int64_t) Constant 0 0
+              70: 14(int64_t) Constant 1 0
+              71: 65(i64vec2) ConstantComposite 69 69
+              72: 65(i64vec2) ConstantComposite 70 70
               74:             TypeVector 31(int) 2
               75:             TypePointer Function 74(ivec2)
               81:             TypeVector 21(int) 2
@@ -121,61 +140,62 @@
               89:             TypeVector 88(float) 2
               90:             TypePointer Function 89(fvec2)
               94:             TypeFloat 64
-              95:             TypeVector 94(float) 2
-              96:             TypePointer Function 95(fvec2)
-             132:             TypeVector 14(int) 3
-             133:             TypePointer Function 132(ivec3)
-             136:             TypeVector 18(int) 3
+              95:             TypeVector 94(float64_t) 2
+              96:             TypePointer Function 95(f64vec2)
+             132:             TypeVector 14(int64_t) 3
+             133:             TypePointer Function 132(i64vec3)
+             136:             TypeVector 18(int64_t) 3
              158:             TypePointer Function 31(int)
              164:             TypeVector 21(int) 3
              165:             TypePointer Function 164(ivec3)
              199:             TypeVector 31(int) 3
-             202:     21(int) Constant 1
-             203:             TypePointer Function 21(int)
-             209:     21(int) Constant 2
-             217:             TypePointer Function 55(bool)
-             219:     21(int) Constant 0
-             289:   52(ivec2) ConstantComposite 25 25
-             298:  132(ivec3) ConstantComposite 69 69 69
-             340:    55(bool) ConstantTrue
-             347:    55(bool) ConstantFalse
-             348:   56(bvec2) ConstantComposite 347 347
-             360:             TypeVector 55(bool) 3
-             361:  360(bvec3) ConstantComposite 347 347 347
-             363:             TypeVector 94(float) 3
-             364:             TypePointer Function 363(fvec3)
-             369:             TypePointer Function 94(float)
-             380:     31(int) Constant 1
-             381:     31(int) Constant 2
-             382:   74(ivec2) ConstantComposite 380 381
-             387:   81(ivec2) ConstantComposite 209 22
-             392:             TypePointer Function 360(bvec3)
-      454(Block):             TypeStruct 136(ivec3) 14(int)
-             455:             TypePointer Uniform 454(Block)
-      456(block):    455(ptr) Variable Uniform
-       457(si64):     18(int) SpecConstant 4294967286 4294967295
-       458(su64):     14(int) SpecConstant 20 0
-         459(si):     31(int) SpecConstant 4294967291
-         460(su):     21(int) SpecConstant 4
-         461(sb):    55(bool) SpecConstantTrue
-             462:    55(bool) SpecConstantOp 171 457(si64) 69
-             463:    55(bool) SpecConstantOp 171 458(su64) 69
-             464:     18(int) SpecConstantOp 169 461(sb) 61 60
-             465:     14(int) SpecConstantOp 169 461(sb) 70 69
-             466:     31(int) SpecConstantOp 114 457(si64)
-             467:     18(int) SpecConstantOp 114 459(si)
-             468:     21(int) SpecConstantOp 113 458(su64)
-             469:     14(int) SpecConstantOp 113 460(su)
-             470:     18(int) SpecConstantOp 128 458(su64) 69
-             471:     14(int) SpecConstantOp 128 457(si64) 69
-             472:     21(int) SpecConstantOp 113 458(su64)
-             473:     31(int) SpecConstantOp 128 472 219
-             474:     18(int) SpecConstantOp 114 459(si)
-             475:     14(int) SpecConstantOp 128 474 69
-             476:     31(int) SpecConstantOp 114 457(si64)
-             477:     21(int) SpecConstantOp 128 476 219
-             478:     14(int) SpecConstantOp 113 460(su)
-             479:     18(int) SpecConstantOp 128 478 69
+             203:     21(int) Constant 1
+             204:             TypePointer Function 21(int)
+             217:     21(int) Constant 2
+             225:             TypePointer Function 55(bool)
+             227:     21(int) Constant 0
+             297: 52(i64vec2) ConstantComposite 25 25
+             306:132(i64vec3) ConstantComposite 69 69 69
+             348:    55(bool) ConstantTrue
+             355:    55(bool) ConstantFalse
+             356:   56(bvec2) ConstantComposite 355 355
+             368:             TypeVector 55(bool) 3
+             369:  368(bvec3) ConstantComposite 355 355 355
+             371:             TypeVector 94(float64_t) 3
+             372:             TypePointer Function 371(f64vec3)
+             377:             TypePointer Function 94(float64_t)
+             388:     31(int) Constant 1
+             389:     31(int) Constant 2
+             390:   74(ivec2) ConstantComposite 388 389
+             395:   81(ivec2) ConstantComposite 217 22
+             400:             TypePointer Function 368(bvec3)
+      462(Block):             TypeStruct 136(i64vec3) 14(int64_t)
+             463:             TypePointer Uniform 462(Block)
+      464(block):    463(ptr) Variable Uniform
+       465(si64): 18(int64_t) SpecConstant 4294967286 4294967295
+       466(su64): 14(int64_t) SpecConstant 20 0
+         467(si):     31(int) SpecConstant 4294967291
+         468(su):     21(int) SpecConstant 4
+         469(sb):    55(bool) SpecConstantTrue
+    470(su64inc): 14(int64_t) SpecConstantOp 128 466(su64) 70
+   471(i64_to_b):    55(bool) SpecConstantOp 171 465(si64) 69
+   472(u64_to_b):    55(bool) SpecConstantOp 171 466(su64) 69
+   473(b_to_i64): 18(int64_t) SpecConstantOp 169 469(sb) 61 60
+   474(b_to_u64): 14(int64_t) SpecConstantOp 169 469(sb) 70 69
+   475(i64_to_i):     31(int) SpecConstantOp 114 465(si64)
+   476(i_to_i64): 18(int64_t) SpecConstantOp 114 467(si)
+   477(u64_to_u):     21(int) SpecConstantOp 113 466(su64)
+   478(u_to_u64): 14(int64_t) SpecConstantOp 113 468(su)
+ 479(u64_to_i64): 18(int64_t) SpecConstantOp 128 466(su64) 69
+ 480(i64_to_u64): 14(int64_t) SpecConstantOp 128 465(si64) 69
+             481:     21(int) SpecConstantOp 113 466(su64)
+   482(u64_to_i):     31(int) SpecConstantOp 128 481 227
+             483: 18(int64_t) SpecConstantOp 114 467(si)
+   484(i_to_u64): 14(int64_t) SpecConstantOp 128 483 69
+             485:     31(int) SpecConstantOp 114 465(si64)
+   486(i64_to_u):     21(int) SpecConstantOp 128 485 227
+             487: 14(int64_t) SpecConstantOp 113 468(su)
+   488(u_to_i64): 18(int64_t) SpecConstantOp 128 487 69
          4(main):           2 Function None 3
                5:             Label
                               Store 16(u64Max) 17
@@ -191,13 +211,13 @@
               35:     21(int) Load 34
                               Store 37(indexable) 27
               38:     19(ptr) AccessChain 37(indexable) 35
-              39:     18(int) Load 38
+              39: 18(int64_t) Load 38
                               Store 20(i64) 39
               46:     33(ptr) AccessChain 30 32
               47:     21(int) Load 46
                               Store 49(indexable) 45
               50:     40(ptr) AccessChain 49(indexable) 47
-              51:     14(int) Load 50
+              51: 14(int64_t) Load 50
                               Store 41(u64) 51
                               Return
                               FunctionEnd
@@ -211,74 +231,74 @@
           91(fv):     90(ptr) Variable Function
           97(dv):     96(ptr) Variable Function
               59:   56(bvec2) Load 58(bv)
-              64:   52(ivec2) Select 59 63 62
+              64: 52(i64vec2) Select 59 63 62
                               Store 54(i64v) 64
               68:   56(bvec2) Load 58(bv)
-              73:   65(ivec2) Select 68 72 71
+              73: 65(i64vec2) Select 68 72 71
                               Store 67(u64v) 73
               77:   74(ivec2) Load 76(iv)
-              78:   52(ivec2) SConvert 77
+              78: 52(i64vec2) SConvert 77
                               Store 54(i64v) 78
-              79:   52(ivec2) Load 54(i64v)
+              79: 52(i64vec2) Load 54(i64v)
               80:   74(ivec2) SConvert 79
                               Store 76(iv) 80
               84:   81(ivec2) Load 83(uv)
-              85:   65(ivec2) UConvert 84
+              85: 65(i64vec2) UConvert 84
                               Store 67(u64v) 85
-              86:   65(ivec2) Load 67(u64v)
+              86: 65(i64vec2) Load 67(u64v)
               87:   81(ivec2) UConvert 86
                               Store 83(uv) 87
-              92:   52(ivec2) Load 54(i64v)
+              92: 52(i64vec2) Load 54(i64v)
               93:   89(fvec2) ConvertSToF 92
                               Store 91(fv) 93
-              98:   52(ivec2) Load 54(i64v)
-              99:   95(fvec2) ConvertSToF 98
+              98: 52(i64vec2) Load 54(i64v)
+              99: 95(f64vec2) ConvertSToF 98
                               Store 97(dv) 99
-             100:   65(ivec2) Load 67(u64v)
+             100: 65(i64vec2) Load 67(u64v)
              101:   89(fvec2) ConvertUToF 100
                               Store 91(fv) 101
-             102:   65(ivec2) Load 67(u64v)
-             103:   95(fvec2) ConvertUToF 102
+             102: 65(i64vec2) Load 67(u64v)
+             103: 95(f64vec2) ConvertUToF 102
                               Store 97(dv) 103
              104:   89(fvec2) Load 91(fv)
-             105:   52(ivec2) ConvertFToS 104
+             105: 52(i64vec2) ConvertFToS 104
                               Store 54(i64v) 105
-             106:   95(fvec2) Load 97(dv)
-             107:   52(ivec2) ConvertFToS 106
+             106: 95(f64vec2) Load 97(dv)
+             107: 52(i64vec2) ConvertFToS 106
                               Store 54(i64v) 107
              108:   89(fvec2) Load 91(fv)
-             109:   65(ivec2) ConvertFToU 108
+             109: 65(i64vec2) ConvertFToU 108
                               Store 67(u64v) 109
-             110:   95(fvec2) Load 97(dv)
-             111:   65(ivec2) ConvertFToU 110
+             110: 95(f64vec2) Load 97(dv)
+             111: 65(i64vec2) ConvertFToU 110
                               Store 67(u64v) 111
-             112:   52(ivec2) Load 54(i64v)
+             112: 52(i64vec2) Load 54(i64v)
              113:   56(bvec2) INotEqual 112 71
                               Store 58(bv) 113
-             114:   65(ivec2) Load 67(u64v)
+             114: 65(i64vec2) Load 67(u64v)
              115:   56(bvec2) INotEqual 114 71
                               Store 58(bv) 115
-             116:   52(ivec2) Load 54(i64v)
-             117:   65(ivec2) Bitcast 116
+             116: 52(i64vec2) Load 54(i64v)
+             117: 65(i64vec2) Bitcast 116
                               Store 67(u64v) 117
-             118:   65(ivec2) Load 67(u64v)
-             119:   52(ivec2) Bitcast 118
+             118: 65(i64vec2) Load 67(u64v)
+             119: 52(i64vec2) Bitcast 118
                               Store 54(i64v) 119
-             120:   52(ivec2) Load 54(i64v)
+             120: 52(i64vec2) Load 54(i64v)
              121:   74(ivec2) SConvert 120
              122:   81(ivec2) Bitcast 121
                               Store 83(uv) 122
              123:   81(ivec2) Load 83(uv)
-             124:   65(ivec2) UConvert 123
-             125:   52(ivec2) Bitcast 124
+             124: 65(i64vec2) UConvert 123
+             125: 52(i64vec2) Bitcast 124
                               Store 54(i64v) 125
-             126:   65(ivec2) Load 67(u64v)
+             126: 65(i64vec2) Load 67(u64v)
              127:   81(ivec2) UConvert 126
              128:   74(ivec2) Bitcast 127
                               Store 76(iv) 128
              129:   74(ivec2) Load 76(iv)
-             130:   52(ivec2) SConvert 129
-             131:   65(ivec2) Bitcast 130
+             130: 52(i64vec2) SConvert 129
+             131: 65(i64vec2) Bitcast 130
                               Store 67(u64v) 131
                               Return
                               FunctionEnd
@@ -288,371 +308,381 @@
         139(i64):     19(ptr) Variable Function
           159(i):    158(ptr) Variable Function
          166(uv):    165(ptr) Variable Function
-          218(b):    217(ptr) Variable Function
-             135:  132(ivec3) Load 134(u64v)
-             137:  136(ivec3) CompositeConstruct 61 61 61
-             138:  132(ivec3) IAdd 135 137
+          226(b):    225(ptr) Variable Function
+             135:132(i64vec3) Load 134(u64v)
+             137:136(i64vec3) CompositeConstruct 61 61 61
+             138:132(i64vec3) IAdd 135 137
                               Store 134(u64v) 138
-             140:     18(int) Load 139(i64)
-             141:     18(int) ISub 140 61
+             140: 18(int64_t) Load 139(i64)
+             141: 18(int64_t) ISub 140 61
                               Store 139(i64) 141
-             142:     18(int) Load 139(i64)
-             143:     18(int) IAdd 142 61
+             142: 18(int64_t) Load 139(i64)
+             143: 18(int64_t) IAdd 142 61
                               Store 139(i64) 143
-             144:  132(ivec3) Load 134(u64v)
-             145:  136(ivec3) CompositeConstruct 61 61 61
-             146:  132(ivec3) ISub 144 145
+             144:132(i64vec3) Load 134(u64v)
+             145:136(i64vec3) CompositeConstruct 61 61 61
+             146:132(i64vec3) ISub 144 145
                               Store 134(u64v) 146
-             147:  132(ivec3) Load 134(u64v)
-             148:  132(ivec3) Not 147
+             147:132(i64vec3) Load 134(u64v)
+             148:132(i64vec3) Not 147
                               Store 134(u64v) 148
-             149:     18(int) Load 139(i64)
+             149: 18(int64_t) Load 139(i64)
                               Store 139(i64) 149
-             150:  132(ivec3) Load 134(u64v)
-             151:  132(ivec3) SNegate 150
+             150:132(i64vec3) Load 134(u64v)
+             151:132(i64vec3) SNegate 150
                               Store 134(u64v) 151
-             152:     18(int) Load 139(i64)
-             153:     18(int) Load 139(i64)
-             154:     18(int) IAdd 153 152
+             152: 18(int64_t) Load 139(i64)
+             153: 18(int64_t) Load 139(i64)
+             154: 18(int64_t) IAdd 153 152
                               Store 139(i64) 154
-             155:  132(ivec3) Load 134(u64v)
-             156:  132(ivec3) Load 134(u64v)
-             157:  132(ivec3) ISub 156 155
+             155:132(i64vec3) Load 134(u64v)
+             156:132(i64vec3) Load 134(u64v)
+             157:132(i64vec3) ISub 156 155
                               Store 134(u64v) 157
              160:     31(int) Load 159(i)
-             161:     18(int) SConvert 160
-             162:     18(int) Load 139(i64)
-             163:     18(int) IMul 162 161
+             161: 18(int64_t) SConvert 160
+             162: 18(int64_t) Load 139(i64)
+             163: 18(int64_t) IMul 162 161
                               Store 139(i64) 163
              167:  164(ivec3) Load 166(uv)
-             168:  132(ivec3) UConvert 167
-             169:  132(ivec3) Load 134(u64v)
-             170:  132(ivec3) UDiv 169 168
+             168:132(i64vec3) UConvert 167
+             169:132(i64vec3) Load 134(u64v)
+             170:132(i64vec3) UDiv 169 168
                               Store 134(u64v) 170
              171:     31(int) Load 159(i)
-             172:     18(int) SConvert 171
-             173:     14(int) Bitcast 172
-             174:  132(ivec3) Load 134(u64v)
-             175:  132(ivec3) CompositeConstruct 173 173 173
-             176:  132(ivec3) UMod 174 175
+             172: 18(int64_t) SConvert 171
+             173: 14(int64_t) Bitcast 172
+             174:132(i64vec3) Load 134(u64v)
+             175:132(i64vec3) CompositeConstruct 173 173 173
+             176:132(i64vec3) UMod 174 175
                               Store 134(u64v) 176
-             177:  132(ivec3) Load 134(u64v)
+             177:132(i64vec3) Load 134(u64v)
              178:  164(ivec3) Load 166(uv)
-             179:  132(ivec3) UConvert 178
-             180:  132(ivec3) IAdd 177 179
+             179:132(i64vec3) UConvert 178
+             180:132(i64vec3) IAdd 177 179
                               Store 134(u64v) 180
-             181:     18(int) Load 139(i64)
+             181: 18(int64_t) Load 139(i64)
              182:     31(int) Load 159(i)
-             183:     18(int) SConvert 182
-             184:     18(int) ISub 181 183
+             183: 18(int64_t) SConvert 182
+             184: 18(int64_t) ISub 181 183
                               Store 139(i64) 184
-             185:  132(ivec3) Load 134(u64v)
+             185:132(i64vec3) Load 134(u64v)
              186:  164(ivec3) Load 166(uv)
-             187:  132(ivec3) UConvert 186
-             188:  132(ivec3) IMul 185 187
+             187:132(i64vec3) UConvert 186
+             188:132(i64vec3) IMul 185 187
                               Store 134(u64v) 188
-             189:     18(int) Load 139(i64)
+             189: 18(int64_t) Load 139(i64)
              190:     31(int) Load 159(i)
-             191:     18(int) SConvert 190
-             192:     18(int) IMul 189 191
+             191: 18(int64_t) SConvert 190
+             192: 18(int64_t) IMul 189 191
                               Store 139(i64) 192
-             193:     18(int) Load 139(i64)
+             193: 18(int64_t) Load 139(i64)
              194:     31(int) Load 159(i)
-             195:     18(int) SConvert 194
-             196:     18(int) SMod 193 195
+             195: 18(int64_t) SConvert 194
+             196: 18(int64_t) SMod 193 195
                               Store 139(i64) 196
-             197:     31(int) Load 159(i)
-             198:  132(ivec3) Load 134(u64v)
-             200:  199(ivec3) CompositeConstruct 197 197 197
-             201:  132(ivec3) ShiftLeftLogical 198 200
+             197:132(i64vec3) Load 134(u64v)
+             198:     31(int) Load 159(i)
+             200:  199(ivec3) CompositeConstruct 198 198 198
+             201:132(i64vec3) ShiftLeftLogical 197 200
                               Store 134(u64v) 201
-             204:    203(ptr) AccessChain 166(uv) 202
-             205:     21(int) Load 204
-             206:     18(int) Load 139(i64)
-             207:     18(int) ShiftRightArithmetic 206 205
+             202: 18(int64_t) Load 139(i64)
+             205:    204(ptr) AccessChain 166(uv) 203
+             206:     21(int) Load 205
+             207: 18(int64_t) ShiftRightArithmetic 202 206
                               Store 139(i64) 207
-             208:     18(int) Load 139(i64)
-             210:     40(ptr) AccessChain 134(u64v) 209
-             211:     14(int) Load 210
-             212:     18(int) ShiftLeftLogical 208 211
-                              Store 139(i64) 212
-             213:  132(ivec3) Load 134(u64v)
-             214:     18(int) Load 139(i64)
-             215:  136(ivec3) CompositeConstruct 214 214 214
-             216:  132(ivec3) ShiftLeftLogical 213 215
-                              Store 134(u64v) 216
-             220:     40(ptr) AccessChain 134(u64v) 219
-             221:     14(int) Load 220
-             222:     18(int) Load 139(i64)
-             223:     14(int) Bitcast 222
-             224:    55(bool) INotEqual 221 223
-                              Store 218(b) 224
-             225:     18(int) Load 139(i64)
-             226:     14(int) Bitcast 225
-             227:     40(ptr) AccessChain 134(u64v) 219
-             228:     14(int) Load 227
-             229:    55(bool) IEqual 226 228
-                              Store 218(b) 229
-             230:     40(ptr) AccessChain 134(u64v) 219
-             231:     14(int) Load 230
-             232:    203(ptr) AccessChain 166(uv) 202
-             233:     21(int) Load 232
-             234:     14(int) UConvert 233
-             235:    55(bool) UGreaterThan 231 234
-                              Store 218(b) 235
-             236:     18(int) Load 139(i64)
-             237:     31(int) Load 159(i)
-             238:     18(int) SConvert 237
-             239:    55(bool) SLessThan 236 238
-                              Store 218(b) 239
-             240:     40(ptr) AccessChain 134(u64v) 202
-             241:     14(int) Load 240
-             242:    203(ptr) AccessChain 166(uv) 219
-             243:     21(int) Load 242
-             244:     14(int) UConvert 243
-             245:    55(bool) UGreaterThanEqual 241 244
-                              Store 218(b) 245
-             246:     18(int) Load 139(i64)
-             247:     31(int) Load 159(i)
-             248:     18(int) SConvert 247
-             249:    55(bool) SLessThanEqual 246 248
-                              Store 218(b) 249
-             250:     31(int) Load 159(i)
-             251:     18(int) SConvert 250
-             252:     14(int) Bitcast 251
-             253:  132(ivec3) Load 134(u64v)
-             254:  132(ivec3) CompositeConstruct 252 252 252
-             255:  132(ivec3) BitwiseOr 253 254
-                              Store 134(u64v) 255
-             256:     18(int) Load 139(i64)
-             257:     31(int) Load 159(i)
-             258:     18(int) SConvert 257
-             259:     18(int) BitwiseOr 256 258
-                              Store 139(i64) 259
-             260:     31(int) Load 159(i)
-             261:     18(int) SConvert 260
-             262:     18(int) Load 139(i64)
-             263:     18(int) BitwiseAnd 262 261
-                              Store 139(i64) 263
-             264:  132(ivec3) Load 134(u64v)
-             265:  164(ivec3) Load 166(uv)
-             266:  132(ivec3) UConvert 265
-             267:  132(ivec3) BitwiseAnd 264 266
-                              Store 134(u64v) 267
-             268:     18(int) Load 139(i64)
-             269:     14(int) Bitcast 268
-             270:  132(ivec3) Load 134(u64v)
-             271:  132(ivec3) CompositeConstruct 269 269 269
-             272:  132(ivec3) BitwiseXor 270 271
-                              Store 134(u64v) 272
-             273:  132(ivec3) Load 134(u64v)
-             274:     18(int) Load 139(i64)
-             275:     14(int) Bitcast 274
-             276:  132(ivec3) CompositeConstruct 275 275 275
-             277:  132(ivec3) BitwiseXor 273 276
-                              Store 134(u64v) 277
+             208:     31(int) Load 159(i)
+             209:132(i64vec3) Load 134(u64v)
+             210:  199(ivec3) CompositeConstruct 208 208 208
+             211:132(i64vec3) ShiftLeftLogical 209 210
+                              Store 134(u64v) 211
+             212:    204(ptr) AccessChain 166(uv) 203
+             213:     21(int) Load 212
+             214: 18(int64_t) Load 139(i64)
+             215: 18(int64_t) ShiftRightArithmetic 214 213
+                              Store 139(i64) 215
+             216: 18(int64_t) Load 139(i64)
+             218:     40(ptr) AccessChain 134(u64v) 217
+             219: 14(int64_t) Load 218
+             220: 18(int64_t) ShiftLeftLogical 216 219
+                              Store 139(i64) 220
+             221:132(i64vec3) Load 134(u64v)
+             222: 18(int64_t) Load 139(i64)
+             223:136(i64vec3) CompositeConstruct 222 222 222
+             224:132(i64vec3) ShiftLeftLogical 221 223
+                              Store 134(u64v) 224
+             228:     40(ptr) AccessChain 134(u64v) 227
+             229: 14(int64_t) Load 228
+             230: 18(int64_t) Load 139(i64)
+             231: 14(int64_t) Bitcast 230
+             232:    55(bool) INotEqual 229 231
+                              Store 226(b) 232
+             233: 18(int64_t) Load 139(i64)
+             234: 14(int64_t) Bitcast 233
+             235:     40(ptr) AccessChain 134(u64v) 227
+             236: 14(int64_t) Load 235
+             237:    55(bool) IEqual 234 236
+                              Store 226(b) 237
+             238:     40(ptr) AccessChain 134(u64v) 227
+             239: 14(int64_t) Load 238
+             240:    204(ptr) AccessChain 166(uv) 203
+             241:     21(int) Load 240
+             242: 14(int64_t) UConvert 241
+             243:    55(bool) UGreaterThan 239 242
+                              Store 226(b) 243
+             244: 18(int64_t) Load 139(i64)
+             245:     31(int) Load 159(i)
+             246: 18(int64_t) SConvert 245
+             247:    55(bool) SLessThan 244 246
+                              Store 226(b) 247
+             248:     40(ptr) AccessChain 134(u64v) 203
+             249: 14(int64_t) Load 248
+             250:    204(ptr) AccessChain 166(uv) 227
+             251:     21(int) Load 250
+             252: 14(int64_t) UConvert 251
+             253:    55(bool) UGreaterThanEqual 249 252
+                              Store 226(b) 253
+             254: 18(int64_t) Load 139(i64)
+             255:     31(int) Load 159(i)
+             256: 18(int64_t) SConvert 255
+             257:    55(bool) SLessThanEqual 254 256
+                              Store 226(b) 257
+             258:     31(int) Load 159(i)
+             259: 18(int64_t) SConvert 258
+             260: 14(int64_t) Bitcast 259
+             261:132(i64vec3) Load 134(u64v)
+             262:132(i64vec3) CompositeConstruct 260 260 260
+             263:132(i64vec3) BitwiseOr 261 262
+                              Store 134(u64v) 263
+             264: 18(int64_t) Load 139(i64)
+             265:     31(int) Load 159(i)
+             266: 18(int64_t) SConvert 265
+             267: 18(int64_t) BitwiseOr 264 266
+                              Store 139(i64) 267
+             268:     31(int) Load 159(i)
+             269: 18(int64_t) SConvert 268
+             270: 18(int64_t) Load 139(i64)
+             271: 18(int64_t) BitwiseAnd 270 269
+                              Store 139(i64) 271
+             272:132(i64vec3) Load 134(u64v)
+             273:  164(ivec3) Load 166(uv)
+             274:132(i64vec3) UConvert 273
+             275:132(i64vec3) BitwiseAnd 272 274
+                              Store 134(u64v) 275
+             276: 18(int64_t) Load 139(i64)
+             277: 14(int64_t) Bitcast 276
+             278:132(i64vec3) Load 134(u64v)
+             279:132(i64vec3) CompositeConstruct 277 277 277
+             280:132(i64vec3) BitwiseXor 278 279
+                              Store 134(u64v) 280
+             281:132(i64vec3) Load 134(u64v)
+             282: 18(int64_t) Load 139(i64)
+             283: 14(int64_t) Bitcast 282
+             284:132(i64vec3) CompositeConstruct 283 283 283
+             285:132(i64vec3) BitwiseXor 281 284
+                              Store 134(u64v) 285
                               Return
                               FunctionEnd
 12(builtinFuncs():           2 Function None 3
               13:             Label
-       278(i64v):     53(ptr) Variable Function
-        281(i64):     19(ptr) Variable Function
-       291(u64v):    133(ptr) Variable Function
-        293(u64):     40(ptr) Variable Function
-         365(dv):    364(ptr) Variable Function
-         384(iv):     75(ptr) Variable Function
-         389(uv):     82(ptr) Variable Function
-         393(bv):    392(ptr) Variable Function
-             279:   52(ivec2) Load 278(i64v)
-             280:   52(ivec2) ExtInst 1(GLSL.std.450) 5(SAbs) 279
-                              Store 278(i64v) 280
-             282:     18(int) Load 281(i64)
-             283:     18(int) ExtInst 1(GLSL.std.450) 7(SSign) 282
-                              Store 281(i64) 283
-             284:   52(ivec2) Load 278(i64v)
-             285:     18(int) Load 281(i64)
-             286:   52(ivec2) CompositeConstruct 285 285
-             287:   52(ivec2) ExtInst 1(GLSL.std.450) 39(SMin) 284 286
-                              Store 278(i64v) 287
-             288:   52(ivec2) Load 278(i64v)
-             290:   52(ivec2) ExtInst 1(GLSL.std.450) 39(SMin) 288 289
-                              Store 278(i64v) 290
-             292:  132(ivec3) Load 291(u64v)
-             294:     14(int) Load 293(u64)
-             295:  132(ivec3) CompositeConstruct 294 294 294
-             296:  132(ivec3) ExtInst 1(GLSL.std.450) 38(UMin) 292 295
-                              Store 291(u64v) 296
-             297:  132(ivec3) Load 291(u64v)
-             299:  132(ivec3) ExtInst 1(GLSL.std.450) 38(UMin) 297 298
-                              Store 291(u64v) 299
-             300:   52(ivec2) Load 278(i64v)
-             301:     18(int) Load 281(i64)
-             302:   52(ivec2) CompositeConstruct 301 301
-             303:   52(ivec2) ExtInst 1(GLSL.std.450) 42(SMax) 300 302
-                              Store 278(i64v) 303
-             304:   52(ivec2) Load 278(i64v)
-             305:   52(ivec2) ExtInst 1(GLSL.std.450) 42(SMax) 304 289
-                              Store 278(i64v) 305
-             306:  132(ivec3) Load 291(u64v)
-             307:     14(int) Load 293(u64)
-             308:  132(ivec3) CompositeConstruct 307 307 307
-             309:  132(ivec3) ExtInst 1(GLSL.std.450) 41(UMax) 306 308
-                              Store 291(u64v) 309
-             310:  132(ivec3) Load 291(u64v)
-             311:  132(ivec3) ExtInst 1(GLSL.std.450) 41(UMax) 310 298
-                              Store 291(u64v) 311
-             312:   52(ivec2) Load 278(i64v)
-             313:     18(int) Load 281(i64)
-             314:     18(int) SNegate 313
-             315:     18(int) Load 281(i64)
-             316:   52(ivec2) CompositeConstruct 314 314
-             317:   52(ivec2) CompositeConstruct 315 315
-             318:   52(ivec2) ExtInst 1(GLSL.std.450) 45(SClamp) 312 316 317
-                              Store 278(i64v) 318
-             319:   52(ivec2) Load 278(i64v)
-             320:   52(ivec2) Load 278(i64v)
-             321:   52(ivec2) SNegate 320
-             322:   52(ivec2) Load 278(i64v)
-             323:   52(ivec2) ExtInst 1(GLSL.std.450) 45(SClamp) 319 321 322
-                              Store 278(i64v) 323
-             324:  132(ivec3) Load 291(u64v)
-             325:     14(int) Load 293(u64)
-             326:     14(int) SNegate 325
-             327:     14(int) Load 293(u64)
-             328:  132(ivec3) CompositeConstruct 326 326 326
-             329:  132(ivec3) CompositeConstruct 327 327 327
-             330:  132(ivec3) ExtInst 1(GLSL.std.450) 44(UClamp) 324 328 329
-                              Store 291(u64v) 330
-             331:  132(ivec3) Load 291(u64v)
-             332:  132(ivec3) Load 291(u64v)
-             333:  132(ivec3) SNegate 332
-             334:  132(ivec3) Load 291(u64v)
-             335:  132(ivec3) ExtInst 1(GLSL.std.450) 44(UClamp) 331 333 334
-                              Store 291(u64v) 335
-             336:     19(ptr) AccessChain 278(i64v) 219
-             337:     18(int) Load 336
-             338:     19(ptr) AccessChain 278(i64v) 202
-             339:     18(int) Load 338
-             341:     18(int) Select 340 339 337
-                              Store 281(i64) 341
-             342:     18(int) Load 281(i64)
-             343:   52(ivec2) CompositeConstruct 342 342
-             344:     18(int) Load 281(i64)
-             345:     18(int) SNegate 344
-             346:   52(ivec2) CompositeConstruct 345 345
-             349:   52(ivec2) Select 348 346 343
-                              Store 278(i64v) 349
-             350:     40(ptr) AccessChain 291(u64v) 219
-             351:     14(int) Load 350
-             352:     40(ptr) AccessChain 291(u64v) 202
-             353:     14(int) Load 352
-             354:     14(int) Select 340 353 351
-                              Store 293(u64) 354
-             355:     14(int) Load 293(u64)
-             356:  132(ivec3) CompositeConstruct 355 355 355
-             357:     14(int) Load 293(u64)
-             358:     14(int) SNegate 357
-             359:  132(ivec3) CompositeConstruct 358 358 358
-             362:  132(ivec3) Select 361 359 356
-                              Store 291(u64v) 362
-             366:  363(fvec3) Load 365(dv)
-             367:   95(fvec2) VectorShuffle 366 366 0 1
-             368:   52(ivec2) Bitcast 367
-                              Store 278(i64v) 368
-             370:    369(ptr) AccessChain 365(dv) 209
-             371:   94(float) Load 370
-             372:     14(int) Bitcast 371
-             373:     40(ptr) AccessChain 291(u64v) 219
-                              Store 373 372
-             374:   52(ivec2) Load 278(i64v)
-             375:   95(fvec2) Bitcast 374
-             376:  363(fvec3) Load 365(dv)
-             377:  363(fvec3) VectorShuffle 376 375 3 4 2
-                              Store 365(dv) 377
-             378:  132(ivec3) Load 291(u64v)
-             379:  363(fvec3) Bitcast 378
-                              Store 365(dv) 379
-             383:     18(int) Bitcast 382
-                              Store 281(i64) 383
-             385:     18(int) Load 281(i64)
-             386:   74(ivec2) Bitcast 385
-                              Store 384(iv) 386
-             388:     14(int) Bitcast 387
-                              Store 293(u64) 388
-             390:     14(int) Load 293(u64)
-             391:   81(ivec2) Bitcast 390
-                              Store 389(uv) 391
-             394:  132(ivec3) Load 291(u64v)
-             395:     14(int) Load 293(u64)
-             396:  132(ivec3) CompositeConstruct 395 395 395
-             397:  360(bvec3) ULessThan 394 396
-                              Store 393(bv) 397
-             398:   52(ivec2) Load 278(i64v)
-             399:     18(int) Load 281(i64)
-             400:   52(ivec2) CompositeConstruct 399 399
-             401:   56(bvec2) SLessThan 398 400
-             402:  360(bvec3) Load 393(bv)
-             403:  360(bvec3) VectorShuffle 402 401 3 4 2
-                              Store 393(bv) 403
-             404:  132(ivec3) Load 291(u64v)
-             405:     14(int) Load 293(u64)
-             406:  132(ivec3) CompositeConstruct 405 405 405
-             407:  360(bvec3) ULessThanEqual 404 406
-                              Store 393(bv) 407
-             408:   52(ivec2) Load 278(i64v)
-             409:     18(int) Load 281(i64)
-             410:   52(ivec2) CompositeConstruct 409 409
-             411:   56(bvec2) SLessThanEqual 408 410
-             412:  360(bvec3) Load 393(bv)
-             413:  360(bvec3) VectorShuffle 412 411 3 4 2
-                              Store 393(bv) 413
-             414:  132(ivec3) Load 291(u64v)
-             415:     14(int) Load 293(u64)
-             416:  132(ivec3) CompositeConstruct 415 415 415
-             417:  360(bvec3) UGreaterThan 414 416
-                              Store 393(bv) 417
-             418:   52(ivec2) Load 278(i64v)
-             419:     18(int) Load 281(i64)
-             420:   52(ivec2) CompositeConstruct 419 419
-             421:   56(bvec2) SGreaterThan 418 420
-             422:  360(bvec3) Load 393(bv)
-             423:  360(bvec3) VectorShuffle 422 421 3 4 2
-                              Store 393(bv) 423
-             424:  132(ivec3) Load 291(u64v)
-             425:     14(int) Load 293(u64)
-             426:  132(ivec3) CompositeConstruct 425 425 425
-             427:  360(bvec3) UGreaterThanEqual 424 426
-                              Store 393(bv) 427
-             428:   52(ivec2) Load 278(i64v)
-             429:     18(int) Load 281(i64)
-             430:   52(ivec2) CompositeConstruct 429 429
-             431:   56(bvec2) SGreaterThanEqual 428 430
-             432:  360(bvec3) Load 393(bv)
-             433:  360(bvec3) VectorShuffle 432 431 3 4 2
-                              Store 393(bv) 433
-             434:  132(ivec3) Load 291(u64v)
-             435:     14(int) Load 293(u64)
-             436:  132(ivec3) CompositeConstruct 435 435 435
-             437:  360(bvec3) IEqual 434 436
-                              Store 393(bv) 437
-             438:   52(ivec2) Load 278(i64v)
-             439:     18(int) Load 281(i64)
-             440:   52(ivec2) CompositeConstruct 439 439
-             441:   56(bvec2) IEqual 438 440
-             442:  360(bvec3) Load 393(bv)
-             443:  360(bvec3) VectorShuffle 442 441 3 4 2
-                              Store 393(bv) 443
-             444:  132(ivec3) Load 291(u64v)
-             445:     14(int) Load 293(u64)
-             446:  132(ivec3) CompositeConstruct 445 445 445
-             447:  360(bvec3) INotEqual 444 446
-                              Store 393(bv) 447
-             448:   52(ivec2) Load 278(i64v)
-             449:     18(int) Load 281(i64)
-             450:   52(ivec2) CompositeConstruct 449 449
-             451:   56(bvec2) INotEqual 448 450
-             452:  360(bvec3) Load 393(bv)
-             453:  360(bvec3) VectorShuffle 452 451 3 4 2
-                              Store 393(bv) 453
+       286(i64v):     53(ptr) Variable Function
+        289(i64):     19(ptr) Variable Function
+       299(u64v):    133(ptr) Variable Function
+        301(u64):     40(ptr) Variable Function
+         373(dv):    372(ptr) Variable Function
+         392(iv):     75(ptr) Variable Function
+         397(uv):     82(ptr) Variable Function
+         401(bv):    400(ptr) Variable Function
+             287: 52(i64vec2) Load 286(i64v)
+             288: 52(i64vec2) ExtInst 1(GLSL.std.450) 5(SAbs) 287
+                              Store 286(i64v) 288
+             290: 18(int64_t) Load 289(i64)
+             291: 18(int64_t) ExtInst 1(GLSL.std.450) 7(SSign) 290
+                              Store 289(i64) 291
+             292: 52(i64vec2) Load 286(i64v)
+             293: 18(int64_t) Load 289(i64)
+             294: 52(i64vec2) CompositeConstruct 293 293
+             295: 52(i64vec2) ExtInst 1(GLSL.std.450) 39(SMin) 292 294
+                              Store 286(i64v) 295
+             296: 52(i64vec2) Load 286(i64v)
+             298: 52(i64vec2) ExtInst 1(GLSL.std.450) 39(SMin) 296 297
+                              Store 286(i64v) 298
+             300:132(i64vec3) Load 299(u64v)
+             302: 14(int64_t) Load 301(u64)
+             303:132(i64vec3) CompositeConstruct 302 302 302
+             304:132(i64vec3) ExtInst 1(GLSL.std.450) 38(UMin) 300 303
+                              Store 299(u64v) 304
+             305:132(i64vec3) Load 299(u64v)
+             307:132(i64vec3) ExtInst 1(GLSL.std.450) 38(UMin) 305 306
+                              Store 299(u64v) 307
+             308: 52(i64vec2) Load 286(i64v)
+             309: 18(int64_t) Load 289(i64)
+             310: 52(i64vec2) CompositeConstruct 309 309
+             311: 52(i64vec2) ExtInst 1(GLSL.std.450) 42(SMax) 308 310
+                              Store 286(i64v) 311
+             312: 52(i64vec2) Load 286(i64v)
+             313: 52(i64vec2) ExtInst 1(GLSL.std.450) 42(SMax) 312 297
+                              Store 286(i64v) 313
+             314:132(i64vec3) Load 299(u64v)
+             315: 14(int64_t) Load 301(u64)
+             316:132(i64vec3) CompositeConstruct 315 315 315
+             317:132(i64vec3) ExtInst 1(GLSL.std.450) 41(UMax) 314 316
+                              Store 299(u64v) 317
+             318:132(i64vec3) Load 299(u64v)
+             319:132(i64vec3) ExtInst 1(GLSL.std.450) 41(UMax) 318 306
+                              Store 299(u64v) 319
+             320: 52(i64vec2) Load 286(i64v)
+             321: 18(int64_t) Load 289(i64)
+             322: 18(int64_t) SNegate 321
+             323: 18(int64_t) Load 289(i64)
+             324: 52(i64vec2) CompositeConstruct 322 322
+             325: 52(i64vec2) CompositeConstruct 323 323
+             326: 52(i64vec2) ExtInst 1(GLSL.std.450) 45(SClamp) 320 324 325
+                              Store 286(i64v) 326
+             327: 52(i64vec2) Load 286(i64v)
+             328: 52(i64vec2) Load 286(i64v)
+             329: 52(i64vec2) SNegate 328
+             330: 52(i64vec2) Load 286(i64v)
+             331: 52(i64vec2) ExtInst 1(GLSL.std.450) 45(SClamp) 327 329 330
+                              Store 286(i64v) 331
+             332:132(i64vec3) Load 299(u64v)
+             333: 14(int64_t) Load 301(u64)
+             334: 14(int64_t) SNegate 333
+             335: 14(int64_t) Load 301(u64)
+             336:132(i64vec3) CompositeConstruct 334 334 334
+             337:132(i64vec3) CompositeConstruct 335 335 335
+             338:132(i64vec3) ExtInst 1(GLSL.std.450) 44(UClamp) 332 336 337
+                              Store 299(u64v) 338
+             339:132(i64vec3) Load 299(u64v)
+             340:132(i64vec3) Load 299(u64v)
+             341:132(i64vec3) SNegate 340
+             342:132(i64vec3) Load 299(u64v)
+             343:132(i64vec3) ExtInst 1(GLSL.std.450) 44(UClamp) 339 341 342
+                              Store 299(u64v) 343
+             344:     19(ptr) AccessChain 286(i64v) 227
+             345: 18(int64_t) Load 344
+             346:     19(ptr) AccessChain 286(i64v) 203
+             347: 18(int64_t) Load 346
+             349: 18(int64_t) Select 348 347 345
+                              Store 289(i64) 349
+             350: 18(int64_t) Load 289(i64)
+             351: 52(i64vec2) CompositeConstruct 350 350
+             352: 18(int64_t) Load 289(i64)
+             353: 18(int64_t) SNegate 352
+             354: 52(i64vec2) CompositeConstruct 353 353
+             357: 52(i64vec2) Select 356 354 351
+                              Store 286(i64v) 357
+             358:     40(ptr) AccessChain 299(u64v) 227
+             359: 14(int64_t) Load 358
+             360:     40(ptr) AccessChain 299(u64v) 203
+             361: 14(int64_t) Load 360
+             362: 14(int64_t) Select 348 361 359
+                              Store 301(u64) 362
+             363: 14(int64_t) Load 301(u64)
+             364:132(i64vec3) CompositeConstruct 363 363 363
+             365: 14(int64_t) Load 301(u64)
+             366: 14(int64_t) SNegate 365
+             367:132(i64vec3) CompositeConstruct 366 366 366
+             370:132(i64vec3) Select 369 367 364
+                              Store 299(u64v) 370
+             374:371(f64vec3) Load 373(dv)
+             375: 95(f64vec2) VectorShuffle 374 374 0 1
+             376: 52(i64vec2) Bitcast 375
+                              Store 286(i64v) 376
+             378:    377(ptr) AccessChain 373(dv) 217
+             379:94(float64_t) Load 378
+             380: 14(int64_t) Bitcast 379
+             381:     40(ptr) AccessChain 299(u64v) 227
+                              Store 381 380
+             382: 52(i64vec2) Load 286(i64v)
+             383: 95(f64vec2) Bitcast 382
+             384:371(f64vec3) Load 373(dv)
+             385:371(f64vec3) VectorShuffle 384 383 3 4 2
+                              Store 373(dv) 385
+             386:132(i64vec3) Load 299(u64v)
+             387:371(f64vec3) Bitcast 386
+                              Store 373(dv) 387
+             391: 18(int64_t) Bitcast 390
+                              Store 289(i64) 391
+             393: 18(int64_t) Load 289(i64)
+             394:   74(ivec2) Bitcast 393
+                              Store 392(iv) 394
+             396: 14(int64_t) Bitcast 395
+                              Store 301(u64) 396
+             398: 14(int64_t) Load 301(u64)
+             399:   81(ivec2) Bitcast 398
+                              Store 397(uv) 399
+             402:132(i64vec3) Load 299(u64v)
+             403: 14(int64_t) Load 301(u64)
+             404:132(i64vec3) CompositeConstruct 403 403 403
+             405:  368(bvec3) ULessThan 402 404
+                              Store 401(bv) 405
+             406: 52(i64vec2) Load 286(i64v)
+             407: 18(int64_t) Load 289(i64)
+             408: 52(i64vec2) CompositeConstruct 407 407
+             409:   56(bvec2) SLessThan 406 408
+             410:  368(bvec3) Load 401(bv)
+             411:  368(bvec3) VectorShuffle 410 409 3 4 2
+                              Store 401(bv) 411
+             412:132(i64vec3) Load 299(u64v)
+             413: 14(int64_t) Load 301(u64)
+             414:132(i64vec3) CompositeConstruct 413 413 413
+             415:  368(bvec3) ULessThanEqual 412 414
+                              Store 401(bv) 415
+             416: 52(i64vec2) Load 286(i64v)
+             417: 18(int64_t) Load 289(i64)
+             418: 52(i64vec2) CompositeConstruct 417 417
+             419:   56(bvec2) SLessThanEqual 416 418
+             420:  368(bvec3) Load 401(bv)
+             421:  368(bvec3) VectorShuffle 420 419 3 4 2
+                              Store 401(bv) 421
+             422:132(i64vec3) Load 299(u64v)
+             423: 14(int64_t) Load 301(u64)
+             424:132(i64vec3) CompositeConstruct 423 423 423
+             425:  368(bvec3) UGreaterThan 422 424
+                              Store 401(bv) 425
+             426: 52(i64vec2) Load 286(i64v)
+             427: 18(int64_t) Load 289(i64)
+             428: 52(i64vec2) CompositeConstruct 427 427
+             429:   56(bvec2) SGreaterThan 426 428
+             430:  368(bvec3) Load 401(bv)
+             431:  368(bvec3) VectorShuffle 430 429 3 4 2
+                              Store 401(bv) 431
+             432:132(i64vec3) Load 299(u64v)
+             433: 14(int64_t) Load 301(u64)
+             434:132(i64vec3) CompositeConstruct 433 433 433
+             435:  368(bvec3) UGreaterThanEqual 432 434
+                              Store 401(bv) 435
+             436: 52(i64vec2) Load 286(i64v)
+             437: 18(int64_t) Load 289(i64)
+             438: 52(i64vec2) CompositeConstruct 437 437
+             439:   56(bvec2) SGreaterThanEqual 436 438
+             440:  368(bvec3) Load 401(bv)
+             441:  368(bvec3) VectorShuffle 440 439 3 4 2
+                              Store 401(bv) 441
+             442:132(i64vec3) Load 299(u64v)
+             443: 14(int64_t) Load 301(u64)
+             444:132(i64vec3) CompositeConstruct 443 443 443
+             445:  368(bvec3) IEqual 442 444
+                              Store 401(bv) 445
+             446: 52(i64vec2) Load 286(i64v)
+             447: 18(int64_t) Load 289(i64)
+             448: 52(i64vec2) CompositeConstruct 447 447
+             449:   56(bvec2) IEqual 446 448
+             450:  368(bvec3) Load 401(bv)
+             451:  368(bvec3) VectorShuffle 450 449 3 4 2
+                              Store 401(bv) 451
+             452:132(i64vec3) Load 299(u64v)
+             453: 14(int64_t) Load 301(u64)
+             454:132(i64vec3) CompositeConstruct 453 453 453
+             455:  368(bvec3) INotEqual 452 454
+                              Store 401(bv) 455
+             456: 52(i64vec2) Load 286(i64v)
+             457: 18(int64_t) Load 289(i64)
+             458: 52(i64vec2) CompositeConstruct 457 457
+             459:   56(bvec2) INotEqual 456 458
+             460:  368(bvec3) Load 401(bv)
+             461:  368(bvec3) VectorShuffle 460 459 3 4 2
+                              Store 401(bv) 461
                               Return
                               FunctionEnd
diff --git a/Test/baseResults/spv.int8.frag.out b/Test/baseResults/spv.int8.frag.out
new file mode 100644
index 0000000..b94bd48
--- /dev/null
+++ b/Test/baseResults/spv.int8.frag.out
@@ -0,0 +1,741 @@
+spv.int8.frag
+error: SPIRV-Tools Validation Errors
+error: Capability Float16 is not allowed by Vulkan 1.1 specification (or requires extension)
+  OpCapability Float16
+
+// Module Version 10300
+// Generated by (magic number): 80007
+// Id's are bound by 518
+
+                              Capability Shader
+                              Capability Float16
+                              Capability Float64
+                              Capability Int64
+                              Capability Int16
+                              Capability Int8
+                              Capability CapabilityUniformAndStorageBuffer8BitAccess
+                              Extension  "SPV_KHR_8bit_storage"
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main"
+                              ExecutionMode 4 OriginUpperLeft
+                              Source GLSL 450
+                              SourceExtension  "GL_EXT_shader_explicit_arithmetic_types"
+                              SourceExtension  "GL_EXT_shader_explicit_arithmetic_types_float16"
+                              SourceExtension  "GL_EXT_shader_explicit_arithmetic_types_float32"
+                              SourceExtension  "GL_EXT_shader_explicit_arithmetic_types_float64"
+                              SourceExtension  "GL_EXT_shader_explicit_arithmetic_types_int16"
+                              SourceExtension  "GL_EXT_shader_explicit_arithmetic_types_int32"
+                              SourceExtension  "GL_EXT_shader_explicit_arithmetic_types_int64"
+                              SourceExtension  "GL_EXT_shader_explicit_arithmetic_types_int8"
+                              Name 4  "main"
+                              Name 6  "literal("
+                              Name 8  "typeCast8("
+                              Name 10  "operators("
+                              Name 12  "builtinFuncs("
+                              Name 16  "i8"
+                              Name 24  "Uniforms"
+                              MemberName 24(Uniforms) 0  "index"
+                              Name 26  ""
+                              Name 33  "indexable"
+                              Name 38  "u8"
+                              Name 46  "indexable"
+                              Name 51  "u8v"
+                              Name 54  "i8v"
+                              Name 60  "i16v"
+                              Name 70  "i32v"
+                              Name 78  "u32v"
+                              Name 85  "i64v"
+                              Name 91  "u64v"
+                              Name 105  "f16v"
+                              Name 111  "f32v"
+                              Name 117  "f64v"
+                              Name 144  "u16v"
+                              Name 174  "bv"
+                              Name 192  "u8v"
+                              Name 197  "i8"
+                              Name 217  "i"
+                              Name 224  "uv"
+                              Name 240  "i16"
+                              Name 276  "b"
+                              Name 338  "i8v"
+                              Name 341  "i8"
+                              Name 351  "u8v"
+                              Name 353  "u8"
+                              Name 423  "i16"
+                              Name 426  "i32"
+                              Name 429  "i8v4"
+                              Name 433  "u16"
+                              Name 434  "u8v2"
+                              Name 437  "u32"
+                              Name 440  "u8v4"
+                              Name 452  "bv"
+                              Name 513  "Block"
+                              MemberName 513(Block) 0  "i8"
+                              MemberName 513(Block) 1  "i8v2"
+                              MemberName 513(Block) 2  "i8v3"
+                              MemberName 513(Block) 3  "i8v4"
+                              MemberName 513(Block) 4  "u8"
+                              MemberName 513(Block) 5  "u8v2"
+                              MemberName 513(Block) 6  "u8v3"
+                              MemberName 513(Block) 7  "u8v4"
+                              Name 515  "block"
+                              Name 516  "si8"
+                              Name 517  "su8"
+                              MemberDecorate 24(Uniforms) 0 Offset 0
+                              Decorate 24(Uniforms) Block
+                              Decorate 26 DescriptorSet 0
+                              Decorate 26 Binding 0
+                              MemberDecorate 513(Block) 0 Offset 0
+                              MemberDecorate 513(Block) 1 Offset 2
+                              MemberDecorate 513(Block) 2 Offset 4
+                              MemberDecorate 513(Block) 3 Offset 8
+                              MemberDecorate 513(Block) 4 Offset 12
+                              MemberDecorate 513(Block) 5 Offset 14
+                              MemberDecorate 513(Block) 6 Offset 16
+                              MemberDecorate 513(Block) 7 Offset 20
+                              Decorate 513(Block) Block
+                              Decorate 515(block) DescriptorSet 0
+                              Decorate 515(block) Binding 1
+                              Decorate 516(si8) SpecId 100
+                              Decorate 517(su8) SpecId 101
+               2:             TypeVoid
+               3:             TypeFunction 2
+              14:             TypeInt 8 1
+              15:             TypePointer Function 14(int8_t)
+              17:             TypeInt 32 0
+              18:     17(int) Constant 3
+              19:             TypeArray 14(int8_t) 18
+              20:  14(int8_t) Constant 4294967279
+              21:  14(int8_t) Constant 4294967295
+              22:  14(int8_t) Constant 0
+              23:          19 ConstantComposite 20 21 22
+    24(Uniforms):             TypeStruct 17(int)
+              25:             TypePointer Uniform 24(Uniforms)
+              26:     25(ptr) Variable Uniform
+              27:             TypeInt 32 1
+              28:     27(int) Constant 0
+              29:             TypePointer Uniform 17(int)
+              32:             TypePointer Function 19
+              36:             TypeInt 8 0
+              37:             TypePointer Function 36(int8_t)
+              39:             TypeArray 36(int8_t) 18
+              40:  36(int8_t) Constant 255
+              41:  36(int8_t) Constant 127
+              42:          39 ConstantComposite 40 40 41
+              45:             TypePointer Function 39
+              49:             TypeVector 36(int8_t) 2
+              50:             TypePointer Function 49(i8vec2)
+              52:             TypeVector 14(int8_t) 2
+              53:             TypePointer Function 52(i8vec2)
+              57:             TypeInt 16 1
+              58:             TypeVector 57(int16_t) 2
+              59:             TypePointer Function 58(i16vec2)
+              64:             TypeInt 16 0
+              65:             TypeVector 64(int16_t) 2
+              68:             TypeVector 27(int) 2
+              69:             TypePointer Function 68(ivec2)
+              74:             TypeVector 17(int) 2
+              77:             TypePointer Function 74(ivec2)
+              82:             TypeInt 64 1
+              83:             TypeVector 82(int64_t) 2
+              84:             TypePointer Function 83(i64vec2)
+              88:             TypeInt 64 0
+              89:             TypeVector 88(int64_t) 2
+              90:             TypePointer Function 89(i64vec2)
+             102:             TypeFloat 16
+             103:             TypeVector 102(float16_t) 2
+             104:             TypePointer Function 103(f16vec2)
+             108:             TypeFloat 32
+             109:             TypeVector 108(float) 2
+             110:             TypePointer Function 109(fvec2)
+             114:             TypeFloat 64
+             115:             TypeVector 114(float64_t) 2
+             116:             TypePointer Function 115(f64vec2)
+             143:             TypePointer Function 65(i16vec2)
+             171:             TypeBool
+             172:             TypeVector 171(bool) 2
+             173:             TypePointer Function 172(bvec2)
+             176:  14(int8_t) Constant 1
+             177:  52(i8vec2) ConstantComposite 22 22
+             178:  52(i8vec2) ConstantComposite 176 176
+             181:  36(int8_t) Constant 0
+             182:  36(int8_t) Constant 1
+             183:  49(i8vec2) ConstantComposite 181 181
+             184:  49(i8vec2) ConstantComposite 182 182
+             190:             TypeVector 36(int8_t) 3
+             191:             TypePointer Function 190(i8vec3)
+             194:             TypeVector 14(int8_t) 3
+             216:             TypePointer Function 27(int)
+             222:             TypeVector 17(int) 3
+             223:             TypePointer Function 222(ivec3)
+             239:             TypePointer Function 57(int16_t)
+             261:     17(int) Constant 1
+             267:     17(int) Constant 2
+             275:             TypePointer Function 171(bool)
+             277:     17(int) Constant 0
+             291:             TypePointer Function 17(int)
+             349:  52(i8vec2) ConstantComposite 21 21
+             358: 190(i8vec3) ConstantComposite 181 181 181
+             400:   171(bool) ConstantTrue
+             407:   171(bool) ConstantFalse
+             408:  172(bvec2) ConstantComposite 407 407
+             420:             TypeVector 171(bool) 3
+             421:  420(bvec3) ConstantComposite 407 407 407
+             427:             TypeVector 14(int8_t) 4
+             428:             TypePointer Function 427(i8vec4)
+             432:             TypePointer Function 64(int16_t)
+             438:             TypeVector 36(int8_t) 4
+             439:             TypePointer Function 438(i8vec4)
+             451:             TypePointer Function 420(bvec3)
+      513(Block):             TypeStruct 14(int8_t) 52(i8vec2) 194(i8vec3) 427(i8vec4) 36(int8_t) 49(i8vec2) 190(i8vec3) 438(i8vec4)
+             514:             TypePointer Uniform 513(Block)
+      515(block):    514(ptr) Variable Uniform
+        516(si8):  14(int8_t) SpecConstant 4294967286
+        517(su8):  36(int8_t) SpecConstant 20
+         4(main):           2 Function None 3
+               5:             Label
+                              Return
+                              FunctionEnd
+     6(literal():           2 Function None 3
+               7:             Label
+          16(i8):     15(ptr) Variable Function
+   33(indexable):     32(ptr) Variable Function
+          38(u8):     37(ptr) Variable Function
+   46(indexable):     45(ptr) Variable Function
+              30:     29(ptr) AccessChain 26 28
+              31:     17(int) Load 30
+                              Store 33(indexable) 23
+              34:     15(ptr) AccessChain 33(indexable) 31
+              35:  14(int8_t) Load 34
+                              Store 16(i8) 35
+              43:     29(ptr) AccessChain 26 28
+              44:     17(int) Load 43
+                              Store 46(indexable) 42
+              47:     37(ptr) AccessChain 46(indexable) 44
+              48:  36(int8_t) Load 47
+                              Store 38(u8) 48
+                              Return
+                              FunctionEnd
+   8(typeCast8():           2 Function None 3
+               9:             Label
+         51(u8v):     50(ptr) Variable Function
+         54(i8v):     53(ptr) Variable Function
+        60(i16v):     59(ptr) Variable Function
+        70(i32v):     69(ptr) Variable Function
+        78(u32v):     77(ptr) Variable Function
+        85(i64v):     84(ptr) Variable Function
+        91(u64v):     90(ptr) Variable Function
+       105(f16v):    104(ptr) Variable Function
+       111(f32v):    110(ptr) Variable Function
+       117(f64v):    116(ptr) Variable Function
+       144(u16v):    143(ptr) Variable Function
+         174(bv):    173(ptr) Variable Function
+              55:  52(i8vec2) Load 54(i8v)
+              56:  49(i8vec2) Bitcast 55
+                              Store 51(u8v) 56
+              61:  52(i8vec2) Load 54(i8v)
+              62: 58(i16vec2) SConvert 61
+                              Store 60(i16v) 62
+              63:  49(i8vec2) Load 51(u8v)
+              66: 65(i16vec2) UConvert 63
+              67: 58(i16vec2) Bitcast 66
+                              Store 60(i16v) 67
+              71:  52(i8vec2) Load 54(i8v)
+              72:   68(ivec2) SConvert 71
+                              Store 70(i32v) 72
+              73:  49(i8vec2) Load 51(u8v)
+              75:   74(ivec2) UConvert 73
+              76:   68(ivec2) Bitcast 75
+                              Store 70(i32v) 76
+              79:  52(i8vec2) Load 54(i8v)
+              80:   68(ivec2) SConvert 79
+              81:   74(ivec2) Bitcast 80
+                              Store 78(u32v) 81
+              86:  52(i8vec2) Load 54(i8v)
+              87: 83(i64vec2) SConvert 86
+                              Store 85(i64v) 87
+              92:  52(i8vec2) Load 54(i8v)
+              93: 83(i64vec2) SConvert 92
+              94: 89(i64vec2) Bitcast 93
+                              Store 91(u64v) 94
+              95:  49(i8vec2) Load 51(u8v)
+              96:   74(ivec2) UConvert 95
+                              Store 78(u32v) 96
+              97:  49(i8vec2) Load 51(u8v)
+              98: 89(i64vec2) UConvert 97
+              99: 83(i64vec2) Bitcast 98
+                              Store 85(i64v) 99
+             100:  49(i8vec2) Load 51(u8v)
+             101: 89(i64vec2) UConvert 100
+                              Store 91(u64v) 101
+             106:  52(i8vec2) Load 54(i8v)
+             107:103(f16vec2) ConvertSToF 106
+                              Store 105(f16v) 107
+             112:  52(i8vec2) Load 54(i8v)
+             113:  109(fvec2) ConvertSToF 112
+                              Store 111(f32v) 113
+             118:  52(i8vec2) Load 54(i8v)
+             119:115(f64vec2) ConvertSToF 118
+                              Store 117(f64v) 119
+             120:  49(i8vec2) Load 51(u8v)
+             121:103(f16vec2) ConvertUToF 120
+                              Store 105(f16v) 121
+             122:  49(i8vec2) Load 51(u8v)
+             123:  109(fvec2) ConvertUToF 122
+                              Store 111(f32v) 123
+             124:  49(i8vec2) Load 51(u8v)
+             125:115(f64vec2) ConvertUToF 124
+                              Store 117(f64v) 125
+             126:  49(i8vec2) Load 51(u8v)
+             127:  52(i8vec2) Bitcast 126
+                              Store 54(i8v) 127
+             128:  52(i8vec2) Load 54(i8v)
+             129: 58(i16vec2) SConvert 128
+                              Store 60(i16v) 129
+             130:  49(i8vec2) Load 51(u8v)
+             131: 65(i16vec2) UConvert 130
+             132: 58(i16vec2) Bitcast 131
+                              Store 60(i16v) 132
+             133:  52(i8vec2) Load 54(i8v)
+             134:   68(ivec2) SConvert 133
+                              Store 70(i32v) 134
+             135:  49(i8vec2) Load 51(u8v)
+             136:   74(ivec2) UConvert 135
+             137:   68(ivec2) Bitcast 136
+                              Store 70(i32v) 137
+             138:  52(i8vec2) Load 54(i8v)
+             139: 83(i64vec2) SConvert 138
+                              Store 85(i64v) 139
+             140:  52(i8vec2) Load 54(i8v)
+             141: 83(i64vec2) SConvert 140
+             142: 89(i64vec2) Bitcast 141
+                              Store 91(u64v) 142
+             145:  52(i8vec2) Load 54(i8v)
+             146: 58(i16vec2) SConvert 145
+             147: 65(i16vec2) Bitcast 146
+                              Store 144(u16v) 147
+             148:  49(i8vec2) Load 51(u8v)
+             149: 65(i16vec2) UConvert 148
+                              Store 144(u16v) 149
+             150:  49(i8vec2) Load 51(u8v)
+             151:   74(ivec2) UConvert 150
+                              Store 78(u32v) 151
+             152:  49(i8vec2) Load 51(u8v)
+             153: 89(i64vec2) UConvert 152
+             154: 83(i64vec2) Bitcast 153
+                              Store 85(i64v) 154
+             155:  49(i8vec2) Load 51(u8v)
+             156: 89(i64vec2) UConvert 155
+             157: 83(i64vec2) Bitcast 156
+             158: 89(i64vec2) Bitcast 157
+                              Store 91(u64v) 158
+             159:  52(i8vec2) Load 54(i8v)
+             160:103(f16vec2) ConvertSToF 159
+                              Store 105(f16v) 160
+             161:  52(i8vec2) Load 54(i8v)
+             162:  109(fvec2) ConvertSToF 161
+                              Store 111(f32v) 162
+             163:  52(i8vec2) Load 54(i8v)
+             164:115(f64vec2) ConvertSToF 163
+                              Store 117(f64v) 164
+             165:  49(i8vec2) Load 51(u8v)
+             166:103(f16vec2) ConvertUToF 165
+                              Store 105(f16v) 166
+             167:  49(i8vec2) Load 51(u8v)
+             168:  109(fvec2) ConvertUToF 167
+                              Store 111(f32v) 168
+             169:  49(i8vec2) Load 51(u8v)
+             170:115(f64vec2) ConvertUToF 169
+                              Store 117(f64v) 170
+             175:  172(bvec2) Load 174(bv)
+             179:  52(i8vec2) Select 175 178 177
+                              Store 54(i8v) 179
+             180:  172(bvec2) Load 174(bv)
+             185:  49(i8vec2) Select 180 184 183
+                              Store 51(u8v) 185
+             186:  52(i8vec2) Load 54(i8v)
+             187:  172(bvec2) INotEqual 186 183
+                              Store 174(bv) 187
+             188:  49(i8vec2) Load 51(u8v)
+             189:  172(bvec2) INotEqual 188 183
+                              Store 174(bv) 189
+                              Return
+                              FunctionEnd
+  10(operators():           2 Function None 3
+              11:             Label
+        192(u8v):    191(ptr) Variable Function
+         197(i8):     15(ptr) Variable Function
+          217(i):    216(ptr) Variable Function
+         224(uv):    223(ptr) Variable Function
+        240(i16):    239(ptr) Variable Function
+          276(b):    275(ptr) Variable Function
+             193: 190(i8vec3) Load 192(u8v)
+             195: 194(i8vec3) CompositeConstruct 176 176 176
+             196: 190(i8vec3) IAdd 193 195
+                              Store 192(u8v) 196
+             198:  14(int8_t) Load 197(i8)
+             199:  14(int8_t) ISub 198 176
+                              Store 197(i8) 199
+             200:  14(int8_t) Load 197(i8)
+             201:  14(int8_t) IAdd 200 176
+                              Store 197(i8) 201
+             202: 190(i8vec3) Load 192(u8v)
+             203: 194(i8vec3) CompositeConstruct 176 176 176
+             204: 190(i8vec3) ISub 202 203
+                              Store 192(u8v) 204
+             205: 190(i8vec3) Load 192(u8v)
+             206: 190(i8vec3) Not 205
+                              Store 192(u8v) 206
+             207:  14(int8_t) Load 197(i8)
+                              Store 197(i8) 207
+             208: 190(i8vec3) Load 192(u8v)
+             209: 190(i8vec3) SNegate 208
+                              Store 192(u8v) 209
+             210:  14(int8_t) Load 197(i8)
+             211:  14(int8_t) Load 197(i8)
+             212:  14(int8_t) IAdd 211 210
+                              Store 197(i8) 212
+             213: 190(i8vec3) Load 192(u8v)
+             214: 190(i8vec3) Load 192(u8v)
+             215: 190(i8vec3) ISub 214 213
+                              Store 192(u8v) 215
+             218:  14(int8_t) Load 197(i8)
+             219:     27(int) SConvert 218
+             220:     27(int) Load 217(i)
+             221:     27(int) IMul 220 219
+                              Store 217(i) 221
+             225: 190(i8vec3) Load 192(u8v)
+             226:  222(ivec3) UConvert 225
+             227:  222(ivec3) Load 224(uv)
+             228:  222(ivec3) UDiv 227 226
+                              Store 224(uv) 228
+             229:  14(int8_t) Load 197(i8)
+             230:     27(int) SConvert 229
+             231:     17(int) Bitcast 230
+             232:  222(ivec3) Load 224(uv)
+             233:  222(ivec3) CompositeConstruct 231 231 231
+             234:  222(ivec3) UMod 232 233
+                              Store 224(uv) 234
+             235: 190(i8vec3) Load 192(u8v)
+             236:  222(ivec3) UConvert 235
+             237:  222(ivec3) Load 224(uv)
+             238:  222(ivec3) IAdd 236 237
+                              Store 224(uv) 238
+             241:  14(int8_t) Load 197(i8)
+             242: 57(int16_t) SConvert 241
+             243: 57(int16_t) Load 240(i16)
+             244: 57(int16_t) ISub 242 243
+                              Store 240(i16) 244
+             245: 190(i8vec3) Load 192(u8v)
+             246:  222(ivec3) UConvert 245
+             247:  222(ivec3) Load 224(uv)
+             248:  222(ivec3) IMul 246 247
+                              Store 224(uv) 248
+             249:  14(int8_t) Load 197(i8)
+             250: 57(int16_t) SConvert 249
+             251: 57(int16_t) Load 240(i16)
+             252: 57(int16_t) IMul 250 251
+                              Store 240(i16) 252
+             253:  14(int8_t) Load 197(i8)
+             254:     27(int) SConvert 253
+             255:     27(int) Load 217(i)
+             256:     27(int) SMod 254 255
+                              Store 217(i) 256
+             257:  14(int8_t) Load 197(i8)
+             258: 190(i8vec3) Load 192(u8v)
+             259: 194(i8vec3) CompositeConstruct 257 257 257
+             260: 190(i8vec3) ShiftLeftLogical 258 259
+                              Store 192(u8v) 260
+             262:     37(ptr) AccessChain 192(u8v) 261
+             263:  36(int8_t) Load 262
+             264:  14(int8_t) Load 197(i8)
+             265:  14(int8_t) ShiftRightArithmetic 264 263
+                              Store 197(i8) 265
+             266:  14(int8_t) Load 197(i8)
+             268:     37(ptr) AccessChain 192(u8v) 267
+             269:  36(int8_t) Load 268
+             270:  14(int8_t) ShiftLeftLogical 266 269
+                              Store 197(i8) 270
+             271: 190(i8vec3) Load 192(u8v)
+             272:  14(int8_t) Load 197(i8)
+             273: 194(i8vec3) CompositeConstruct 272 272 272
+             274: 190(i8vec3) ShiftLeftLogical 271 273
+                              Store 192(u8v) 274
+             278:     37(ptr) AccessChain 192(u8v) 277
+             279:  36(int8_t) Load 278
+             280:  14(int8_t) Load 197(i8)
+             281:  36(int8_t) Bitcast 280
+             282:   171(bool) INotEqual 279 281
+                              Store 276(b) 282
+             283:  14(int8_t) Load 197(i8)
+             284:  36(int8_t) Bitcast 283
+             285:     37(ptr) AccessChain 192(u8v) 277
+             286:  36(int8_t) Load 285
+             287:   171(bool) IEqual 284 286
+                              Store 276(b) 287
+             288:     37(ptr) AccessChain 192(u8v) 277
+             289:  36(int8_t) Load 288
+             290:     17(int) UConvert 289
+             292:    291(ptr) AccessChain 224(uv) 261
+             293:     17(int) Load 292
+             294:   171(bool) UGreaterThan 290 293
+                              Store 276(b) 294
+             295:  14(int8_t) Load 197(i8)
+             296:     27(int) SConvert 295
+             297:     27(int) Load 217(i)
+             298:   171(bool) SLessThan 296 297
+                              Store 276(b) 298
+             299:     37(ptr) AccessChain 192(u8v) 261
+             300:  36(int8_t) Load 299
+             301:     17(int) UConvert 300
+             302:    291(ptr) AccessChain 224(uv) 277
+             303:     17(int) Load 302
+             304:   171(bool) UGreaterThanEqual 301 303
+                              Store 276(b) 304
+             305:  14(int8_t) Load 197(i8)
+             306:     27(int) SConvert 305
+             307:     27(int) Load 217(i)
+             308:   171(bool) SLessThanEqual 306 307
+                              Store 276(b) 308
+             309:  14(int8_t) Load 197(i8)
+             310:     27(int) SConvert 309
+             311:     17(int) Bitcast 310
+             312:  222(ivec3) Load 224(uv)
+             313:  222(ivec3) CompositeConstruct 311 311 311
+             314:  222(ivec3) BitwiseOr 312 313
+                              Store 224(uv) 314
+             315:  14(int8_t) Load 197(i8)
+             316:     27(int) SConvert 315
+             317:     27(int) Load 217(i)
+             318:     27(int) BitwiseOr 316 317
+                              Store 217(i) 318
+             319:  14(int8_t) Load 197(i8)
+             320: 57(int16_t) SConvert 319
+             321: 57(int16_t) Load 240(i16)
+             322: 57(int16_t) BitwiseAnd 321 320
+                              Store 240(i16) 322
+             323: 190(i8vec3) Load 192(u8v)
+             324:  222(ivec3) UConvert 323
+             325:  222(ivec3) Load 224(uv)
+             326:  222(ivec3) BitwiseAnd 324 325
+                              Store 224(uv) 326
+             327:  14(int8_t) Load 197(i8)
+             328:     27(int) SConvert 327
+             329:     17(int) Bitcast 328
+             330:  222(ivec3) Load 224(uv)
+             331:  222(ivec3) CompositeConstruct 329 329 329
+             332:  222(ivec3) BitwiseXor 330 331
+                              Store 224(uv) 332
+             333: 190(i8vec3) Load 192(u8v)
+             334:  14(int8_t) Load 197(i8)
+             335:  36(int8_t) Bitcast 334
+             336: 190(i8vec3) CompositeConstruct 335 335 335
+             337: 190(i8vec3) BitwiseXor 333 336
+                              Store 192(u8v) 337
+                              Return
+                              FunctionEnd
+12(builtinFuncs():           2 Function None 3
+              13:             Label
+        338(i8v):     53(ptr) Variable Function
+         341(i8):     15(ptr) Variable Function
+        351(u8v):    191(ptr) Variable Function
+         353(u8):     37(ptr) Variable Function
+        423(i16):    239(ptr) Variable Function
+        426(i32):    216(ptr) Variable Function
+       429(i8v4):    428(ptr) Variable Function
+        433(u16):    432(ptr) Variable Function
+       434(u8v2):     50(ptr) Variable Function
+        437(u32):    291(ptr) Variable Function
+       440(u8v4):    439(ptr) Variable Function
+         452(bv):    451(ptr) Variable Function
+             339:  52(i8vec2) Load 338(i8v)
+             340:  52(i8vec2) ExtInst 1(GLSL.std.450) 5(SAbs) 339
+                              Store 338(i8v) 340
+             342:  14(int8_t) Load 341(i8)
+             343:  14(int8_t) ExtInst 1(GLSL.std.450) 7(SSign) 342
+                              Store 341(i8) 343
+             344:  52(i8vec2) Load 338(i8v)
+             345:  14(int8_t) Load 341(i8)
+             346:  52(i8vec2) CompositeConstruct 345 345
+             347:  52(i8vec2) ExtInst 1(GLSL.std.450) 39(SMin) 344 346
+                              Store 338(i8v) 347
+             348:  52(i8vec2) Load 338(i8v)
+             350:  52(i8vec2) ExtInst 1(GLSL.std.450) 39(SMin) 348 349
+                              Store 338(i8v) 350
+             352: 190(i8vec3) Load 351(u8v)
+             354:  36(int8_t) Load 353(u8)
+             355: 190(i8vec3) CompositeConstruct 354 354 354
+             356: 190(i8vec3) ExtInst 1(GLSL.std.450) 38(UMin) 352 355
+                              Store 351(u8v) 356
+             357: 190(i8vec3) Load 351(u8v)
+             359: 190(i8vec3) ExtInst 1(GLSL.std.450) 38(UMin) 357 358
+                              Store 351(u8v) 359
+             360:  52(i8vec2) Load 338(i8v)
+             361:  14(int8_t) Load 341(i8)
+             362:  52(i8vec2) CompositeConstruct 361 361
+             363:  52(i8vec2) ExtInst 1(GLSL.std.450) 42(SMax) 360 362
+                              Store 338(i8v) 363
+             364:  52(i8vec2) Load 338(i8v)
+             365:  52(i8vec2) ExtInst 1(GLSL.std.450) 42(SMax) 364 349
+                              Store 338(i8v) 365
+             366: 190(i8vec3) Load 351(u8v)
+             367:  36(int8_t) Load 353(u8)
+             368: 190(i8vec3) CompositeConstruct 367 367 367
+             369: 190(i8vec3) ExtInst 1(GLSL.std.450) 41(UMax) 366 368
+                              Store 351(u8v) 369
+             370: 190(i8vec3) Load 351(u8v)
+             371: 190(i8vec3) ExtInst 1(GLSL.std.450) 41(UMax) 370 358
+                              Store 351(u8v) 371
+             372:  52(i8vec2) Load 338(i8v)
+             373:  14(int8_t) Load 341(i8)
+             374:  14(int8_t) SNegate 373
+             375:  14(int8_t) Load 341(i8)
+             376:  52(i8vec2) CompositeConstruct 374 374
+             377:  52(i8vec2) CompositeConstruct 375 375
+             378:  52(i8vec2) ExtInst 1(GLSL.std.450) 45(SClamp) 372 376 377
+                              Store 338(i8v) 378
+             379:  52(i8vec2) Load 338(i8v)
+             380:  52(i8vec2) Load 338(i8v)
+             381:  52(i8vec2) SNegate 380
+             382:  52(i8vec2) Load 338(i8v)
+             383:  52(i8vec2) ExtInst 1(GLSL.std.450) 45(SClamp) 379 381 382
+                              Store 338(i8v) 383
+             384: 190(i8vec3) Load 351(u8v)
+             385:  36(int8_t) Load 353(u8)
+             386:  36(int8_t) SNegate 385
+             387:  36(int8_t) Load 353(u8)
+             388: 190(i8vec3) CompositeConstruct 386 386 386
+             389: 190(i8vec3) CompositeConstruct 387 387 387
+             390: 190(i8vec3) ExtInst 1(GLSL.std.450) 44(UClamp) 384 388 389
+                              Store 351(u8v) 390
+             391: 190(i8vec3) Load 351(u8v)
+             392: 190(i8vec3) Load 351(u8v)
+             393: 190(i8vec3) SNegate 392
+             394: 190(i8vec3) Load 351(u8v)
+             395: 190(i8vec3) ExtInst 1(GLSL.std.450) 44(UClamp) 391 393 394
+                              Store 351(u8v) 395
+             396:     15(ptr) AccessChain 338(i8v) 277
+             397:  14(int8_t) Load 396
+             398:     15(ptr) AccessChain 338(i8v) 261
+             399:  14(int8_t) Load 398
+             401:  14(int8_t) Select 400 399 397
+                              Store 341(i8) 401
+             402:  14(int8_t) Load 341(i8)
+             403:  52(i8vec2) CompositeConstruct 402 402
+             404:  14(int8_t) Load 341(i8)
+             405:  14(int8_t) SNegate 404
+             406:  52(i8vec2) CompositeConstruct 405 405
+             409:  52(i8vec2) Select 408 406 403
+                              Store 338(i8v) 409
+             410:     37(ptr) AccessChain 351(u8v) 277
+             411:  36(int8_t) Load 410
+             412:     37(ptr) AccessChain 351(u8v) 261
+             413:  36(int8_t) Load 412
+             414:  36(int8_t) Select 400 413 411
+                              Store 353(u8) 414
+             415:  36(int8_t) Load 353(u8)
+             416: 190(i8vec3) CompositeConstruct 415 415 415
+             417:  36(int8_t) Load 353(u8)
+             418:  36(int8_t) SNegate 417
+             419: 190(i8vec3) CompositeConstruct 418 418 418
+             422: 190(i8vec3) Select 421 419 416
+                              Store 351(u8v) 422
+             424:  52(i8vec2) Load 338(i8v)
+             425: 57(int16_t) Bitcast 424
+                              Store 423(i16) 425
+             430: 427(i8vec4) Load 429(i8v4)
+             431:     27(int) Bitcast 430
+                              Store 426(i32) 431
+             435:  49(i8vec2) Load 434(u8v2)
+             436: 64(int16_t) Bitcast 435
+                              Store 433(u16) 436
+             441: 438(i8vec4) Load 440(u8v4)
+             442:     17(int) Bitcast 441
+                              Store 437(u32) 442
+             443: 57(int16_t) Load 423(i16)
+             444:  52(i8vec2) Bitcast 443
+                              Store 338(i8v) 444
+             445:     27(int) Load 426(i32)
+             446: 427(i8vec4) Bitcast 445
+                              Store 429(i8v4) 446
+             447: 64(int16_t) Load 433(u16)
+             448:  49(i8vec2) Bitcast 447
+                              Store 434(u8v2) 448
+             449:     17(int) Load 437(u32)
+             450: 438(i8vec4) Bitcast 449
+                              Store 440(u8v4) 450
+             453: 190(i8vec3) Load 351(u8v)
+             454:  36(int8_t) Load 353(u8)
+             455: 190(i8vec3) CompositeConstruct 454 454 454
+             456:  420(bvec3) ULessThan 453 455
+                              Store 452(bv) 456
+             457:  52(i8vec2) Load 338(i8v)
+             458:  14(int8_t) Load 341(i8)
+             459:  52(i8vec2) CompositeConstruct 458 458
+             460:  172(bvec2) SLessThan 457 459
+             461:  420(bvec3) Load 452(bv)
+             462:  420(bvec3) VectorShuffle 461 460 3 4 2
+                              Store 452(bv) 462
+             463: 190(i8vec3) Load 351(u8v)
+             464:  36(int8_t) Load 353(u8)
+             465: 190(i8vec3) CompositeConstruct 464 464 464
+             466:  420(bvec3) ULessThanEqual 463 465
+                              Store 452(bv) 466
+             467:  52(i8vec2) Load 338(i8v)
+             468:  14(int8_t) Load 341(i8)
+             469:  52(i8vec2) CompositeConstruct 468 468
+             470:  172(bvec2) SLessThanEqual 467 469
+             471:  420(bvec3) Load 452(bv)
+             472:  420(bvec3) VectorShuffle 471 470 3 4 2
+                              Store 452(bv) 472
+             473: 190(i8vec3) Load 351(u8v)
+             474:  36(int8_t) Load 353(u8)
+             475: 190(i8vec3) CompositeConstruct 474 474 474
+             476:  420(bvec3) UGreaterThan 473 475
+                              Store 452(bv) 476
+             477:  52(i8vec2) Load 338(i8v)
+             478:  14(int8_t) Load 341(i8)
+             479:  52(i8vec2) CompositeConstruct 478 478
+             480:  172(bvec2) SGreaterThan 477 479
+             481:  420(bvec3) Load 452(bv)
+             482:  420(bvec3) VectorShuffle 481 480 3 4 2
+                              Store 452(bv) 482
+             483: 190(i8vec3) Load 351(u8v)
+             484:  36(int8_t) Load 353(u8)
+             485: 190(i8vec3) CompositeConstruct 484 484 484
+             486:  420(bvec3) UGreaterThanEqual 483 485
+                              Store 452(bv) 486
+             487:  52(i8vec2) Load 338(i8v)
+             488:  14(int8_t) Load 341(i8)
+             489:  52(i8vec2) CompositeConstruct 488 488
+             490:  172(bvec2) SGreaterThanEqual 487 489
+             491:  420(bvec3) Load 452(bv)
+             492:  420(bvec3) VectorShuffle 491 490 3 4 2
+                              Store 452(bv) 492
+             493: 190(i8vec3) Load 351(u8v)
+             494:  36(int8_t) Load 353(u8)
+             495: 190(i8vec3) CompositeConstruct 494 494 494
+             496:  420(bvec3) IEqual 493 495
+                              Store 452(bv) 496
+             497:  52(i8vec2) Load 338(i8v)
+             498:  14(int8_t) Load 341(i8)
+             499:  52(i8vec2) CompositeConstruct 498 498
+             500:  172(bvec2) IEqual 497 499
+             501:  420(bvec3) Load 452(bv)
+             502:  420(bvec3) VectorShuffle 501 500 3 4 2
+                              Store 452(bv) 502
+             503: 190(i8vec3) Load 351(u8v)
+             504:  36(int8_t) Load 353(u8)
+             505: 190(i8vec3) CompositeConstruct 504 504 504
+             506:  420(bvec3) INotEqual 503 505
+                              Store 452(bv) 506
+             507:  52(i8vec2) Load 338(i8v)
+             508:  14(int8_t) Load 341(i8)
+             509:  52(i8vec2) CompositeConstruct 508 508
+             510:  172(bvec2) INotEqual 507 509
+             511:  420(bvec3) Load 452(bv)
+             512:  420(bvec3) VectorShuffle 511 510 3 4 2
+                              Store 452(bv) 512
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.intOps.vert.out b/Test/baseResults/spv.intOps.vert.out
index 93d2dfd..2a63783 100644
--- a/Test/baseResults/spv.intOps.vert.out
+++ b/Test/baseResults/spv.intOps.vert.out
@@ -1,8 +1,6 @@
 spv.intOps.vert
-Warning, version 310 is not yet complete; most version-specific features are present, but some are missing.
-
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 268
 
                               Capability Shader
diff --git a/Test/baseResults/spv.interpOps.frag.out b/Test/baseResults/spv.interpOps.frag.out
index 88d8e53..699524d 100644
--- a/Test/baseResults/spv.interpOps.frag.out
+++ b/Test/baseResults/spv.interpOps.frag.out
@@ -1,8 +1,6 @@
 spv.interpOps.frag
-Warning, version 450 is not yet complete; most version-specific features are present, but some are missing.
-
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 100
 
                               Capability Shader
diff --git a/Test/baseResults/spv.layoutNested.vert.out b/Test/baseResults/spv.layoutNested.vert.out
index 0d0b28b..b5ef883 100644
--- a/Test/baseResults/spv.layoutNested.vert.out
+++ b/Test/baseResults/spv.layoutNested.vert.out
@@ -1,8 +1,6 @@
 spv.layoutNested.vert
-Warning, version 450 is not yet complete; most version-specific features are present, but some are missing.
-
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 66
 
                               Capability Shader
diff --git a/Test/baseResults/spv.length.frag.out b/Test/baseResults/spv.length.frag.out
old mode 100755
new mode 100644
index 76f6ca6..8e799fb
--- a/Test/baseResults/spv.length.frag.out
+++ b/Test/baseResults/spv.length.frag.out
@@ -1,6 +1,6 @@
 spv.length.frag
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 33
 
                               Capability Shader
@@ -14,6 +14,7 @@
                               Name 14  "v"
                               Name 26  "gl_FragColor"
                               Name 32  "u"
+                              Decorate 26(gl_FragColor) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
diff --git a/Test/baseResults/spv.localAggregates.frag.out b/Test/baseResults/spv.localAggregates.frag.out
old mode 100755
new mode 100644
index 7ffa874..5f89611
--- a/Test/baseResults/spv.localAggregates.frag.out
+++ b/Test/baseResults/spv.localAggregates.frag.out
@@ -1,8 +1,6 @@
 spv.localAggregates.frag
-Warning, version 400 is not yet complete; most version-specific features are present, but some are missing.
-
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 136
 
                               Capability Shader
@@ -42,6 +40,7 @@
                               Name 135  "foo2"
                               Decorate 15(foo3) Flat
                               Decorate 90(condition) Flat
+                              Decorate 108(gl_FragColor) Location 0
                               Decorate 128(samp2D) DescriptorSet 0
                               Decorate 134(foo) Flat
                               Decorate 135(foo2) Flat
diff --git a/Test/baseResults/spv.loops.frag.out b/Test/baseResults/spv.loops.frag.out
old mode 100755
new mode 100644
index 8b1b480..046360f
--- a/Test/baseResults/spv.loops.frag.out
+++ b/Test/baseResults/spv.loops.frag.out
@@ -1,6 +1,6 @@
 spv.loops.frag
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 725
 
                               Capability Shader
@@ -49,6 +49,7 @@
                               Name 687  "d18"
                               Name 698  "d17"
                               Decorate 157(Count) Flat
+                              Decorate 615(gl_FragColor) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
diff --git a/Test/baseResults/spv.loopsArtificial.frag.out b/Test/baseResults/spv.loopsArtificial.frag.out
old mode 100755
new mode 100644
index 707a78d..d0d6054
--- a/Test/baseResults/spv.loopsArtificial.frag.out
+++ b/Test/baseResults/spv.loopsArtificial.frag.out
@@ -1,6 +1,6 @@
 spv.loopsArtificial.frag
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 158
 
                               Capability Shader
@@ -30,6 +30,7 @@
                               Name 153  "d2"
                               Name 154  "d3"
                               Name 157  "Count"
+                              Decorate 140(gl_FragColor) Location 0
                               Decorate 157(Count) Flat
                2:             TypeVoid
                3:             TypeFunction 2
diff --git a/Test/baseResults/spv.looseUniformNoLoc.vert.out b/Test/baseResults/spv.looseUniformNoLoc.vert.out
new file mode 100644
index 0000000..55d1639
--- /dev/null
+++ b/Test/baseResults/spv.looseUniformNoLoc.vert.out
@@ -0,0 +1,8 @@
+spv.looseUniformNoLoc.vert
+ERROR: spv.looseUniformNoLoc.vert:9: 'uv' : non-opaque uniform variables need a layout(location=L) 
+ERROR: 1 compilation errors.  No code generated.
+
+
+ERROR: Linking vertex stage: Missing entry point: Each stage requires one entry point
+
+SPIR-V is not generated for failed compile or link
diff --git a/Test/baseResults/spv.matFun.vert.out b/Test/baseResults/spv.matFun.vert.out
old mode 100755
new mode 100644
index 38d9d2c..47b692f
--- a/Test/baseResults/spv.matFun.vert.out
+++ b/Test/baseResults/spv.matFun.vert.out
@@ -1,8 +1,6 @@
 spv.matFun.vert
-Warning, version 400 is not yet complete; most version-specific features are present, but some are missing.
-
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 103
 
                               Capability Shader
diff --git a/Test/baseResults/spv.matrix.frag.out b/Test/baseResults/spv.matrix.frag.out
index c7077b9..c2b4a1f 100644
--- a/Test/baseResults/spv.matrix.frag.out
+++ b/Test/baseResults/spv.matrix.frag.out
@@ -1,8 +1,6 @@
 spv.matrix.frag
-Warning, version 420 is not yet complete; most version-specific features are present, but some are missing.
-
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 286
 
                               Capability Shader
@@ -38,8 +36,8 @@
            28(f):     27(ptr) Variable Input
               81:    6(float) Constant 1065353216
              136:             TypeFloat 64
-             137:             TypeVector 136(float) 4
-             138:             TypeMatrix 137(fvec4) 3
+             137:             TypeVector 136(float64_t) 4
+             138:             TypeMatrix 137(f64vec4) 3
              139:             TypePointer Function 138
              157:             TypeVector 6(float) 3
              158:             TypePointer Function 157(fvec3)
@@ -195,19 +193,19 @@
                               Store 10(sum34) 135
              141:           8 Load 10(sum34)
              142:    7(fvec4) CompositeExtract 141 0
-             143:  137(fvec4) FConvert 142
+             143:137(f64vec4) FConvert 142
              144:    7(fvec4) CompositeExtract 141 1
-             145:  137(fvec4) FConvert 144
+             145:137(f64vec4) FConvert 144
              146:    7(fvec4) CompositeExtract 141 2
-             147:  137(fvec4) FConvert 146
+             147:137(f64vec4) FConvert 146
              148:         138 CompositeConstruct 143 145 147
                               Store 140(dm) 148
              149:         138 Load 140(dm)
-             150:  137(fvec4) CompositeExtract 149 0
+             150:137(f64vec4) CompositeExtract 149 0
              151:    7(fvec4) FConvert 150
-             152:  137(fvec4) CompositeExtract 149 1
+             152:137(f64vec4) CompositeExtract 149 1
              153:    7(fvec4) FConvert 152
-             154:  137(fvec4) CompositeExtract 149 2
+             154:137(f64vec4) CompositeExtract 149 2
              155:    7(fvec4) FConvert 154
              156:           8 CompositeConstruct 151 153 155
                               Store 10(sum34) 156
diff --git a/Test/baseResults/spv.matrix2.frag.out b/Test/baseResults/spv.matrix2.frag.out
index 78facff..dc574a4 100644
--- a/Test/baseResults/spv.matrix2.frag.out
+++ b/Test/baseResults/spv.matrix2.frag.out
@@ -1,6 +1,6 @@
 spv.matrix2.frag
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 221
 
                               Capability Shader
diff --git a/Test/baseResults/spv.memoryQualifier.frag.out b/Test/baseResults/spv.memoryQualifier.frag.out
index a990e47..4113cc9 100644
--- a/Test/baseResults/spv.memoryQualifier.frag.out
+++ b/Test/baseResults/spv.memoryQualifier.frag.out
@@ -1,13 +1,15 @@
 spv.memoryQualifier.frag
-Warning, version 450 is not yet complete; most version-specific features are present, but some are missing.
+error: SPIRV-Tools Validation Errors
+error: Capability ImageRect is not allowed by Vulkan 1.0 specification (or requires extension)
+  OpCapability ImageRect
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 97
 
                               Capability Shader
-                              Capability SampledRect
-                              Capability Sampled1D
+                              Capability ImageRect
+                              Capability Image1D
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
                               EntryPoint Fragment 4  "main"
@@ -37,6 +39,7 @@
                               Decorate 19(i2D) DescriptorSet 0
                               Decorate 19(i2D) Binding 1
                               Decorate 19(i2D) Volatile
+                              Decorate 19(i2D) Coherent
                               Decorate 28(i2DRect) DescriptorSet 0
                               Decorate 28(i2DRect) Binding 2
                               Decorate 28(i2DRect) Restrict
@@ -46,12 +49,11 @@
                               Decorate 44(iCube) DescriptorSet 0
                               Decorate 44(iCube) Binding 3
                               Decorate 44(iCube) NonReadable
-                              MemberDecorate 49(Data) 0 Coherent
                               MemberDecorate 49(Data) 0 Offset 0
-                              MemberDecorate 49(Data) 1 Coherent
                               MemberDecorate 49(Data) 1 Offset 8
                               MemberDecorate 50(Buffer) 0 Coherent
                               MemberDecorate 50(Buffer) 0 Volatile
+                              MemberDecorate 50(Buffer) 0 Coherent
                               MemberDecorate 50(Buffer) 0 Offset 0
                               MemberDecorate 50(Buffer) 1 Coherent
                               MemberDecorate 50(Buffer) 1 Restrict
diff --git a/Test/baseResults/spv.memoryScopeSemantics.comp.out b/Test/baseResults/spv.memoryScopeSemantics.comp.out
new file mode 100644
index 0000000..46f9a07
--- /dev/null
+++ b/Test/baseResults/spv.memoryScopeSemantics.comp.out
@@ -0,0 +1,239 @@
+spv.memoryScopeSemantics.comp
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 142
+
+                              Capability Shader
+                              Capability Int64
+                              Capability Int64Atomics
+                              Capability CapabilityVulkanMemoryModelKHR
+                              Capability CapabilityVulkanMemoryModelDeviceScopeKHR
+                              Extension  "SPV_KHR_vulkan_memory_model"
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical VulkanKHR
+                              EntryPoint GLCompute 4  "main"
+                              ExecutionMode 4 LocalSize 1 1 1
+                              Source GLSL 450
+                              SourceExtension  "GL_ARB_gpu_shader_int64"
+                              SourceExtension  "GL_KHR_memory_scope_semantics"
+                              Name 4  "main"
+                              Name 8  "origi"
+                              Name 10  "atomi"
+                              Name 21  "origu"
+                              Name 23  "atomu"
+                              Name 24  "value"
+                              Name 36  "imagei"
+                              Name 45  "imageu"
+                              Name 65  "BufferU"
+                              MemberName 65(BufferU) 0  "x"
+                              Name 67  "bufferu"
+                              Name 72  "y"
+                              Name 77  "BufferI"
+                              MemberName 77(BufferI) 0  "x"
+                              Name 79  "bufferi"
+                              Name 83  "A"
+                              MemberName 83(A) 0  "x"
+                              Name 84  "BufferJ"
+                              MemberName 84(BufferJ) 0  "a"
+                              Name 87  "bufferj"
+                              Name 98  "BufferK"
+                              MemberName 98(BufferK) 0  "x"
+                              Name 100  "bufferk"
+                              Name 109  "imagej"
+                              Name 121  "samp"
+                              Name 132  "atomu64"
+                              Name 137  "atomi64"
+                              Decorate 36(imagei) DescriptorSet 0
+                              Decorate 36(imagei) Binding 1
+                              Decorate 45(imageu) DescriptorSet 0
+                              Decorate 45(imageu) Binding 0
+                              MemberDecorate 65(BufferU) 0 Offset 0
+                              Decorate 65(BufferU) BufferBlock
+                              Decorate 67(bufferu) DescriptorSet 0
+                              Decorate 67(bufferu) Binding 2
+                              MemberDecorate 77(BufferI) 0 Offset 0
+                              Decorate 77(BufferI) BufferBlock
+                              Decorate 79(bufferi) DescriptorSet 0
+                              Decorate 79(bufferi) Binding 3
+                              Decorate 82 ArrayStride 4
+                              MemberDecorate 83(A) 0 Offset 0
+                              MemberDecorate 84(BufferJ) 0 Offset 0
+                              Decorate 84(BufferJ) BufferBlock
+                              Decorate 87(bufferj) DescriptorSet 0
+                              Decorate 87(bufferj) Binding 4
+                              MemberDecorate 98(BufferK) 0 Offset 0
+                              Decorate 98(BufferK) Block
+                              Decorate 100(bufferk) DescriptorSet 0
+                              Decorate 100(bufferk) Binding 7
+                              Decorate 109(imagej) DescriptorSet 0
+                              Decorate 109(imagej) Binding 5
+                              Decorate 121(samp) DescriptorSet 0
+                              Decorate 121(samp) Binding 6
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeInt 32 1
+               7:             TypePointer Function 6(int)
+               9:             TypePointer Workgroup 6(int)
+       10(atomi):      9(ptr) Variable Workgroup
+              11:      6(int) Constant 3
+              12:      6(int) Constant 1
+              13:      6(int) Constant 320
+              14:      6(int) Constant 4
+              15:             TypeInt 32 0
+              16:     15(int) Constant 5
+              17:     15(int) Constant 0
+              18:     15(int) Constant 324
+              20:             TypePointer Function 15(int)
+              22:             TypePointer Workgroup 15(int)
+       23(atomu):     22(ptr) Variable Workgroup
+       24(value):     22(ptr) Variable Workgroup
+              26:     15(int) Constant 2
+              28:      6(int) Constant 64
+              29:      6(int) Constant 2
+              30:     15(int) Constant 66
+              33:     15(int) Constant 68
+              34:             TypeImage 6(int) 2D nonsampled format:R32i
+              35:             TypePointer UniformConstant 34
+      36(imagei):     35(ptr) Variable UniformConstant
+              37:             TypeVector 6(int) 2
+              38:      6(int) Constant 0
+              39:   37(ivec2) ConstantComposite 38 38
+              40:             TypePointer Image 6(int)
+              43:             TypeImage 15(int) 2D nonsampled format:R32ui
+              44:             TypePointer UniformConstant 43
+      45(imageu):     44(ptr) Variable UniformConstant
+              46:     15(int) Constant 3
+              47:             TypePointer Image 15(int)
+              50:     15(int) Constant 4
+              52:     15(int) Constant 7
+              57:      6(int) Constant 7
+              61:     15(int) Constant 10
+              63:     15(int) Constant 322
+     65(BufferU):             TypeStruct 15(int)
+              66:             TypePointer Uniform 65(BufferU)
+     67(bufferu):     66(ptr) Variable Uniform
+              68:             TypePointer Uniform 15(int)
+              70:     15(int) Constant 1
+     77(BufferI):             TypeStruct 15(int)
+              78:             TypePointer Uniform 77(BufferI)
+     79(bufferi):     78(ptr) Variable Uniform
+              82:             TypeArray 15(int) 26
+           83(A):             TypeStruct 82
+     84(BufferJ):             TypeStruct 83(A)
+              85:             TypeArray 84(BufferJ) 26
+              86:             TypePointer Uniform 85
+     87(bufferj):     86(ptr) Variable Uniform
+              94:             TypePointer Uniform 83(A)
+     98(BufferK):             TypeStruct 15(int)
+              99:             TypePointer Uniform 98(BufferK)
+    100(bufferk):     99(ptr) Variable Uniform
+             105:             TypeVector 6(int) 4
+             107:             TypeArray 34 26
+             108:             TypePointer UniformConstant 107
+     109(imagej):    108(ptr) Variable UniformConstant
+             115:  105(ivec4) ConstantComposite 38 38 38 38
+             116:             TypeFloat 32
+             117:             TypeImage 116(float) 2D sampled format:Unknown
+             118:             TypeSampledImage 117
+             119:             TypeArray 118 26
+             120:             TypePointer UniformConstant 119
+       121(samp):    120(ptr) Variable UniformConstant
+             122:             TypePointer UniformConstant 118
+             125:             TypeVector 116(float) 2
+             126:  116(float) Constant 0
+             127:  125(fvec2) ConstantComposite 126 126
+             128:             TypeVector 116(float) 4
+             130:             TypeInt 64 0
+             131:             TypePointer Workgroup 130(int64_t)
+    132(atomu64):    131(ptr) Variable Workgroup
+             133:130(int64_t) Constant 7 0
+             135:             TypeInt 64 1
+             136:             TypePointer Workgroup 135(int64_t)
+    137(atomi64):    136(ptr) Variable Workgroup
+             138:135(int64_t) Constant 10 0
+         4(main):           2 Function None 3
+               5:             Label
+        8(origi):      7(ptr) Variable Function
+       21(origu):     20(ptr) Variable Function
+           72(y):     20(ptr) Variable Function
+              19:      6(int) AtomicIAdd 10(atomi) 12 18 11
+                              Store 8(origi) 19
+              25:     15(int) Load 24(value) MakePointerVisibleKHR NonPrivatePointerKHR 26
+              27:     15(int) AtomicAnd 23(atomu) 16 17 25
+                              Store 21(origu) 27
+              31:      6(int) AtomicLoad 10(atomi) 12 30
+                              Store 8(origi) 31
+              32:     15(int) Load 24(value) MakePointerVisibleKHR NonPrivatePointerKHR 26
+                              AtomicStore 23(atomu) 12 33 32
+              41:     40(ptr) ImageTexelPointer 36(imagei) 39 17
+              42:      6(int) AtomicLoad 41 12 30
+                              Store 8(origi) 42
+              48:     47(ptr) ImageTexelPointer 45(imageu) 39 17
+              49:     15(int) AtomicIAdd 48 12 30 46
+                              Store 21(origu) 49
+              51:     47(ptr) ImageTexelPointer 45(imageu) 39 17
+                              AtomicStore 51 12 33 50
+              53:     15(int) AtomicOr 23(atomu) 12 17 52
+                              Store 21(origu) 53
+              54:     15(int) AtomicXor 23(atomu) 12 17 52
+                              Store 21(origu) 54
+              55:     15(int) Load 24(value) MakePointerVisibleKHR NonPrivatePointerKHR 26
+              56:     15(int) AtomicUMin 23(atomu) 12 17 55
+                              Store 21(origu) 56
+              58:      6(int) AtomicSMax 10(atomi) 12 17 57
+                              Store 8(origi) 58
+              59:      6(int) Load 8(origi)
+              60:      6(int) AtomicExchange 10(atomi) 12 17 59
+                              Store 8(origi) 60
+              62:     15(int) Load 24(value) MakePointerVisibleKHR NonPrivatePointerKHR 26
+              64:     15(int) AtomicCompareExchange 23(atomu) 12 63 63 62 61
+                              Store 21(origu) 64
+              69:     68(ptr) AccessChain 67(bufferu) 38
+              71:     15(int) AtomicIAdd 69 12 18 70
+                              MemoryBarrier 26 18
+                              ControlBarrier 26 26 63
+                              ControlBarrier 26 26 17
+              73:     68(ptr) AccessChain 67(bufferu) 38
+              74:     15(int) Load 73 MakePointerVisibleKHR NonPrivatePointerKHR 26
+                              Store 72(y) 74
+              75:     15(int) Load 72(y)
+              76:     68(ptr) AccessChain 67(bufferu) 38
+                              Store 76 75 MakePointerAvailableKHR NonPrivatePointerKHR 26
+              80:     68(ptr) AccessChain 79(bufferi) 38
+              81:     15(int) Load 80 MakePointerVisibleKHR NonPrivatePointerKHR 16
+                              Store 72(y) 81
+              88:     68(ptr) AccessChain 87(bufferj) 38 38 38 12
+              89:     15(int) Load 88 Volatile MakePointerVisibleKHR NonPrivatePointerKHR 46
+                              Store 72(y) 89
+              90:     15(int) Load 72(y)
+              91:     68(ptr) AccessChain 79(bufferi) 38
+                              Store 91 90 MakePointerAvailableKHR NonPrivatePointerKHR 16
+              92:     15(int) Load 72(y)
+              93:     68(ptr) AccessChain 87(bufferj) 38 38 38 12
+                              Store 93 92 Volatile MakePointerAvailableKHR NonPrivatePointerKHR 46
+              95:     94(ptr) AccessChain 87(bufferj) 12 38
+              96:       83(A) Load 95 Volatile MakePointerVisibleKHR NonPrivatePointerKHR 46
+              97:     94(ptr) AccessChain 87(bufferj) 38 38
+                              Store 97 96 Volatile MakePointerAvailableKHR NonPrivatePointerKHR 46
+             101:     68(ptr) AccessChain 100(bufferk) 38
+             102:     15(int) Load 101 NonPrivatePointerKHR 
+             103:     68(ptr) AccessChain 79(bufferi) 38
+                              Store 103 102 MakePointerAvailableKHR NonPrivatePointerKHR 16
+             104:          34 Load 36(imagei)
+             106:  105(ivec4) ImageRead 104 39 MakeTexelVisibleKHR NonPrivateTexelKHR VolatileTexelKHR 16
+             110:     35(ptr) AccessChain 109(imagej) 38
+             111:          34 Load 110
+             112:  105(ivec4) ImageRead 111 39 NonPrivateTexelKHR 
+             113:     35(ptr) AccessChain 109(imagej) 12
+             114:          34 Load 113
+                              ImageWrite 114 39 115 NonPrivateTexelKHR 
+             123:    122(ptr) AccessChain 121(samp) 38
+             124:         118 Load 123
+             129:  128(fvec4) ImageSampleExplicitLod 124 127 Lod NonPrivateTexelKHR 126
+             134:130(int64_t) AtomicUMax 132(atomu64) 12 17 133
+                              Store 132(atomu64) 134 MakePointerAvailableKHR NonPrivatePointerKHR 26
+             139:130(int64_t) Load 132(atomu64) MakePointerVisibleKHR NonPrivatePointerKHR 26
+             140:135(int64_t) Bitcast 139
+             141:135(int64_t) AtomicCompareExchange 137(atomi64) 12 63 63 140 138
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.memoryScopeSemantics_Error.comp.out b/Test/baseResults/spv.memoryScopeSemantics_Error.comp.out
new file mode 100644
index 0000000..c4149d8
--- /dev/null
+++ b/Test/baseResults/spv.memoryScopeSemantics_Error.comp.out
@@ -0,0 +1,17 @@
+spv.memoryScopeSemantics_Error.comp
+ERROR: 0:15: 'atomicStore' : gl_SemanticsAcquire must not be used with (image) atomic store 
+ERROR: 0:16: 'imageAtomicLoad' : gl_SemanticsRelease must not be used with (image) atomic load 
+ERROR: 0:17: 'atomicStore' : gl_SemanticsAcquireRelease must not be used with (image) atomic load/store 
+ERROR: 0:18: 'atomicStore' : Invalid semantics value 
+ERROR: 0:19: 'imageAtomicLoad' : Invalid storage class semantics value 
+ERROR: 0:20: 'memoryBarrier' : Semantics must include exactly one of gl_SemanticsRelease, gl_SemanticsAcquire, or gl_SemanticsAcquireRelease 
+ERROR: 0:21: 'memoryBarrier' : Storage class semantics must not be zero 
+ERROR: 0:22: 'memoryBarrier' : Semantics must include exactly one of gl_SemanticsRelease, gl_SemanticsAcquire, or gl_SemanticsAcquireRelease 
+ERROR: 0:23: 'atomicAdd' : Semantics must not include multiple of gl_SemanticsRelease, gl_SemanticsAcquire, or gl_SemanticsAcquireRelease 
+ERROR: 0:24: 'atomicCompSwap' : semUnequal must not be gl_SemanticsRelease or gl_SemanticsAcquireRelease 
+ERROR: 0:25: 'memoryBarrier' : gl_SemanticsMakeVisible requires gl_SemanticsAcquire or gl_SemanticsAcquireRelease 
+ERROR: 0:26: 'memoryBarrier' : gl_SemanticsMakeAvailable requires gl_SemanticsRelease or gl_SemanticsAcquireRelease 
+ERROR: 12 compilation errors.  No code generated.
+
+
+SPIR-V is not generated for failed compile or link
diff --git a/Test/baseResults/spv.merge-unreachable.frag.out b/Test/baseResults/spv.merge-unreachable.frag.out
index 58bbb06..7ec0f33 100644
--- a/Test/baseResults/spv.merge-unreachable.frag.out
+++ b/Test/baseResults/spv.merge-unreachable.frag.out
@@ -1,8 +1,6 @@
 spv.merge-unreachable.frag
-Warning, version 450 is not yet complete; most version-specific features are present, but some are missing.
-
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 25
 
                               Capability Shader
diff --git a/Test/baseResults/spv.meshShaderBuiltins.mesh.out b/Test/baseResults/spv.meshShaderBuiltins.mesh.out
new file mode 100644
index 0000000..8090f7b
--- /dev/null
+++ b/Test/baseResults/spv.meshShaderBuiltins.mesh.out
@@ -0,0 +1,258 @@
+spv.meshShaderBuiltins.mesh
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 146
+
+                              Capability ClipDistance
+                              Capability CullDistance
+                              Capability MultiViewport
+                              Capability DrawParameters
+                              Capability ShaderViewportMaskNV
+                              Capability MeshShadingNV
+                              Extension  "SPV_KHR_shader_draw_parameters"
+                              Extension  "SPV_NV_mesh_shader"
+                              Extension  "SPV_NV_viewport_array2"
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint MeshNV 4  "main" 11 17 34 88 128 139 143
+                              ExecutionMode 4 LocalSize 32 1 1
+                              ExecutionMode 4 OutputVertices 81
+                              ExecutionMode 4 OutputPrimitivesNV 32
+                              ExecutionMode 4 OutputTrianglesNV
+                              Source GLSL 460
+                              SourceExtension  "GL_NV_mesh_shader"
+                              Name 4  "main"
+                              Name 8  "iid"
+                              Name 11  "gl_LocalInvocationID"
+                              Name 16  "gid"
+                              Name 17  "gl_WorkGroupID"
+                              Name 30  "gl_MeshPerVertexNV"
+                              MemberName 30(gl_MeshPerVertexNV) 0  "gl_Position"
+                              MemberName 30(gl_MeshPerVertexNV) 1  "gl_PointSize"
+                              MemberName 30(gl_MeshPerVertexNV) 2  "gl_ClipDistance"
+                              MemberName 30(gl_MeshPerVertexNV) 3  "gl_CullDistance"
+                              MemberName 30(gl_MeshPerVertexNV) 4  "gl_PositionPerViewNV"
+                              MemberName 30(gl_MeshPerVertexNV) 5  "gl_ClipDistancePerViewNV"
+                              MemberName 30(gl_MeshPerVertexNV) 6  "gl_CullDistancePerViewNV"
+                              Name 34  "gl_MeshVerticesNV"
+                              Name 84  "gl_MeshPerPrimitiveNV"
+                              MemberName 84(gl_MeshPerPrimitiveNV) 0  "gl_PrimitiveID"
+                              MemberName 84(gl_MeshPerPrimitiveNV) 1  "gl_Layer"
+                              MemberName 84(gl_MeshPerPrimitiveNV) 2  "gl_ViewportIndex"
+                              MemberName 84(gl_MeshPerPrimitiveNV) 3  "gl_ViewportMask"
+                              MemberName 84(gl_MeshPerPrimitiveNV) 4  "gl_LayerPerViewNV"
+                              MemberName 84(gl_MeshPerPrimitiveNV) 5  "gl_ViewportMaskPerViewNV"
+                              Name 88  "gl_MeshPrimitivesNV"
+                              Name 128  "gl_PrimitiveIndicesNV"
+                              Name 139  "gl_DrawID"
+                              Name 143  "gl_PrimitiveCountNV"
+                              Decorate 11(gl_LocalInvocationID) BuiltIn LocalInvocationId
+                              Decorate 17(gl_WorkGroupID) BuiltIn WorkgroupId
+                              MemberDecorate 30(gl_MeshPerVertexNV) 0 BuiltIn Position
+                              MemberDecorate 30(gl_MeshPerVertexNV) 1 BuiltIn PointSize
+                              MemberDecorate 30(gl_MeshPerVertexNV) 2 BuiltIn ClipDistance
+                              MemberDecorate 30(gl_MeshPerVertexNV) 3 BuiltIn CullDistance
+                              MemberDecorate 30(gl_MeshPerVertexNV) 4 PerViewNV
+                              MemberDecorate 30(gl_MeshPerVertexNV) 4 BuiltIn PositionPerViewNV
+                              MemberDecorate 30(gl_MeshPerVertexNV) 5 PerViewNV
+                              MemberDecorate 30(gl_MeshPerVertexNV) 5 BuiltIn ClipDistancePerViewNV
+                              MemberDecorate 30(gl_MeshPerVertexNV) 6 PerViewNV
+                              MemberDecorate 30(gl_MeshPerVertexNV) 6 BuiltIn CullDistancePerViewNV
+                              Decorate 30(gl_MeshPerVertexNV) Block
+                              MemberDecorate 84(gl_MeshPerPrimitiveNV) 0 PerPrimitiveNV
+                              MemberDecorate 84(gl_MeshPerPrimitiveNV) 0 BuiltIn PrimitiveId
+                              MemberDecorate 84(gl_MeshPerPrimitiveNV) 1 PerPrimitiveNV
+                              MemberDecorate 84(gl_MeshPerPrimitiveNV) 1 BuiltIn Layer
+                              MemberDecorate 84(gl_MeshPerPrimitiveNV) 2 PerPrimitiveNV
+                              MemberDecorate 84(gl_MeshPerPrimitiveNV) 2 BuiltIn ViewportIndex
+                              MemberDecorate 84(gl_MeshPerPrimitiveNV) 3 PerPrimitiveNV
+                              MemberDecorate 84(gl_MeshPerPrimitiveNV) 3 BuiltIn ViewportMaskNV
+                              MemberDecorate 84(gl_MeshPerPrimitiveNV) 4 PerPrimitiveNV
+                              MemberDecorate 84(gl_MeshPerPrimitiveNV) 4 PerViewNV
+                              MemberDecorate 84(gl_MeshPerPrimitiveNV) 4 BuiltIn LayerPerViewNV
+                              MemberDecorate 84(gl_MeshPerPrimitiveNV) 5 PerPrimitiveNV
+                              MemberDecorate 84(gl_MeshPerPrimitiveNV) 5 PerViewNV
+                              MemberDecorate 84(gl_MeshPerPrimitiveNV) 5 BuiltIn ViewportMaskPerViewNV
+                              Decorate 84(gl_MeshPerPrimitiveNV) Block
+                              Decorate 128(gl_PrimitiveIndicesNV) BuiltIn PrimitiveIndicesNV
+                              Decorate 139(gl_DrawID) BuiltIn DrawIndex
+                              Decorate 143(gl_PrimitiveCountNV) BuiltIn PrimitiveCountNV
+                              Decorate 145 BuiltIn WorkgroupSize
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeInt 32 0
+               7:             TypePointer Function 6(int)
+               9:             TypeVector 6(int) 3
+              10:             TypePointer Input 9(ivec3)
+11(gl_LocalInvocationID):     10(ptr) Variable Input
+              12:      6(int) Constant 0
+              13:             TypePointer Input 6(int)
+17(gl_WorkGroupID):     10(ptr) Variable Input
+              20:             TypeFloat 32
+              21:             TypeVector 20(float) 4
+              22:      6(int) Constant 4
+              23:             TypeArray 20(float) 22
+              24:      6(int) Constant 3
+              25:             TypeArray 20(float) 24
+              26:             TypeArray 21(fvec4) 22
+              27:      6(int) Constant 1
+              28:             TypeArray 20(float) 27
+              29:             TypeArray 28 22
+30(gl_MeshPerVertexNV):             TypeStruct 21(fvec4) 20(float) 23 25 26 29 29
+              31:      6(int) Constant 81
+              32:             TypeArray 30(gl_MeshPerVertexNV) 31
+              33:             TypePointer Output 32
+34(gl_MeshVerticesNV):     33(ptr) Variable Output
+              36:             TypeInt 32 1
+              37:     36(int) Constant 0
+              38:   20(float) Constant 1065353216
+              39:   21(fvec4) ConstantComposite 38 38 38 38
+              40:             TypePointer Output 21(fvec4)
+              43:     36(int) Constant 1
+              44:   20(float) Constant 1073741824
+              45:             TypePointer Output 20(float)
+              48:     36(int) Constant 2
+              49:     36(int) Constant 3
+              50:   20(float) Constant 1077936128
+              53:   20(float) Constant 1082130432
+              55:      6(int) Constant 264
+              56:      6(int) Constant 2
+              81:             TypeArray 36(int) 27
+              82:             TypeArray 36(int) 22
+              83:             TypeArray 81 22
+84(gl_MeshPerPrimitiveNV):             TypeStruct 36(int) 36(int) 36(int) 81 82 83
+              85:      6(int) Constant 32
+              86:             TypeArray 84(gl_MeshPerPrimitiveNV) 85
+              87:             TypePointer Output 86
+88(gl_MeshPrimitivesNV):     87(ptr) Variable Output
+              90:     36(int) Constant 6
+              91:             TypePointer Output 36(int)
+              94:     36(int) Constant 7
+              97:     36(int) Constant 8
+             100:     36(int) Constant 9
+             126:             TypeArray 6(int) 31
+             127:             TypePointer Output 126
+128(gl_PrimitiveIndicesNV):    127(ptr) Variable Output
+             129:      6(int) Constant 257
+             130:             TypePointer Output 6(int)
+             138:             TypePointer Input 36(int)
+  139(gl_DrawID):    138(ptr) Variable Input
+             142:      6(int) Constant 16909060
+143(gl_PrimitiveCountNV):    130(ptr) Variable Output
+             144:      6(int) Constant 96
+             145:    9(ivec3) ConstantComposite 85 27 27
+         4(main):           2 Function None 3
+               5:             Label
+          8(iid):      7(ptr) Variable Function
+         16(gid):      7(ptr) Variable Function
+              14:     13(ptr) AccessChain 11(gl_LocalInvocationID) 12
+              15:      6(int) Load 14
+                              Store 8(iid) 15
+              18:     13(ptr) AccessChain 17(gl_WorkGroupID) 12
+              19:      6(int) Load 18
+                              Store 16(gid) 19
+              35:      6(int) Load 8(iid)
+              41:     40(ptr) AccessChain 34(gl_MeshVerticesNV) 35 37
+                              Store 41 39
+              42:      6(int) Load 8(iid)
+              46:     45(ptr) AccessChain 34(gl_MeshVerticesNV) 42 43
+                              Store 46 44
+              47:      6(int) Load 8(iid)
+              51:     45(ptr) AccessChain 34(gl_MeshVerticesNV) 47 48 49
+                              Store 51 50
+              52:      6(int) Load 8(iid)
+              54:     45(ptr) AccessChain 34(gl_MeshVerticesNV) 52 49 48
+                              Store 54 53
+                              MemoryBarrier 27 55
+                              ControlBarrier 56 56 55
+              57:      6(int) Load 8(iid)
+              58:      6(int) IAdd 57 27
+              59:      6(int) Load 8(iid)
+              60:     40(ptr) AccessChain 34(gl_MeshVerticesNV) 59 37
+              61:   21(fvec4) Load 60
+              62:     40(ptr) AccessChain 34(gl_MeshVerticesNV) 58 37
+                              Store 62 61
+              63:      6(int) Load 8(iid)
+              64:      6(int) IAdd 63 27
+              65:      6(int) Load 8(iid)
+              66:     45(ptr) AccessChain 34(gl_MeshVerticesNV) 65 43
+              67:   20(float) Load 66
+              68:     45(ptr) AccessChain 34(gl_MeshVerticesNV) 64 43
+                              Store 68 67
+              69:      6(int) Load 8(iid)
+              70:      6(int) IAdd 69 27
+              71:      6(int) Load 8(iid)
+              72:     45(ptr) AccessChain 34(gl_MeshVerticesNV) 71 48 49
+              73:   20(float) Load 72
+              74:     45(ptr) AccessChain 34(gl_MeshVerticesNV) 70 48 49
+                              Store 74 73
+              75:      6(int) Load 8(iid)
+              76:      6(int) IAdd 75 27
+              77:      6(int) Load 8(iid)
+              78:     45(ptr) AccessChain 34(gl_MeshVerticesNV) 77 49 48
+              79:   20(float) Load 78
+              80:     45(ptr) AccessChain 34(gl_MeshVerticesNV) 76 49 48
+                              Store 80 79
+                              MemoryBarrier 27 55
+                              ControlBarrier 56 56 55
+              89:      6(int) Load 8(iid)
+              92:     91(ptr) AccessChain 88(gl_MeshPrimitivesNV) 89 37
+                              Store 92 90
+              93:      6(int) Load 8(iid)
+              95:     91(ptr) AccessChain 88(gl_MeshPrimitivesNV) 93 43
+                              Store 95 94
+              96:      6(int) Load 8(iid)
+              98:     91(ptr) AccessChain 88(gl_MeshPrimitivesNV) 96 48
+                              Store 98 97
+              99:      6(int) Load 8(iid)
+             101:     91(ptr) AccessChain 88(gl_MeshPrimitivesNV) 99 49 37
+                              Store 101 100
+                              MemoryBarrier 27 55
+                              ControlBarrier 56 56 55
+             102:      6(int) Load 8(iid)
+             103:      6(int) IAdd 102 27
+             104:      6(int) Load 8(iid)
+             105:     91(ptr) AccessChain 88(gl_MeshPrimitivesNV) 104 37
+             106:     36(int) Load 105
+             107:     91(ptr) AccessChain 88(gl_MeshPrimitivesNV) 103 37
+                              Store 107 106
+             108:      6(int) Load 8(iid)
+             109:      6(int) IAdd 108 27
+             110:      6(int) Load 8(iid)
+             111:     91(ptr) AccessChain 88(gl_MeshPrimitivesNV) 110 43
+             112:     36(int) Load 111
+             113:     91(ptr) AccessChain 88(gl_MeshPrimitivesNV) 109 43
+                              Store 113 112
+             114:      6(int) Load 8(iid)
+             115:      6(int) IAdd 114 27
+             116:      6(int) Load 8(iid)
+             117:     91(ptr) AccessChain 88(gl_MeshPrimitivesNV) 116 48
+             118:     36(int) Load 117
+             119:     91(ptr) AccessChain 88(gl_MeshPrimitivesNV) 115 48
+                              Store 119 118
+             120:      6(int) Load 8(iid)
+             121:      6(int) IAdd 120 27
+             122:      6(int) Load 8(iid)
+             123:     91(ptr) AccessChain 88(gl_MeshPrimitivesNV) 122 49 37
+             124:     36(int) Load 123
+             125:     91(ptr) AccessChain 88(gl_MeshPrimitivesNV) 121 49 37
+                              Store 125 124
+                              MemoryBarrier 27 55
+                              ControlBarrier 56 56 55
+             131:    130(ptr) AccessChain 128(gl_PrimitiveIndicesNV) 37
+                              Store 131 129
+             132:      6(int) Load 16(gid)
+             133:      6(int) Load 16(gid)
+             134:      6(int) ISub 133 27
+             135:    130(ptr) AccessChain 128(gl_PrimitiveIndicesNV) 134
+             136:      6(int) Load 135
+             137:    130(ptr) AccessChain 128(gl_PrimitiveIndicesNV) 132
+                              Store 137 136
+             140:     36(int) Load 139(gl_DrawID)
+             141:      6(int) Bitcast 140
+             142:         141 WritePackedPrimitiveIndices4x8NV
+                              Store 143(gl_PrimitiveCountNV) 144
+                              MemoryBarrier 27 55
+                              ControlBarrier 56 56 55
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.meshShaderPerViewBuiltins.mesh.out b/Test/baseResults/spv.meshShaderPerViewBuiltins.mesh.out
new file mode 100644
index 0000000..b912aca
--- /dev/null
+++ b/Test/baseResults/spv.meshShaderPerViewBuiltins.mesh.out
@@ -0,0 +1,214 @@
+spv.meshShaderPerViewBuiltins.mesh
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 126
+
+                              Capability MultiViewport
+                              Capability PerViewAttributesNV
+                              Capability MeshShadingNV
+                              Extension  "SPV_NVX_multiview_per_view_attributes"
+                              Extension  "SPV_NV_mesh_shader"
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint MeshNV 4  "main" 11 20 21 40 72
+                              ExecutionMode 4 LocalSize 32 1 1
+                              ExecutionMode 4 OutputVertices 81
+                              ExecutionMode 4 OutputPrimitivesNV 32
+                              ExecutionMode 4 OutputTrianglesNV
+                              Source GLSL 450
+                              SourceExtension  "GL_NV_mesh_shader"
+                              Name 4  "main"
+                              Name 8  "iid"
+                              Name 11  "gl_LocalInvocationID"
+                              Name 16  "viewID"
+                              Name 20  "gl_MeshViewIndicesNV"
+                              Name 21  "gl_MeshViewCountNV"
+                              Name 36  "gl_MeshPerVertexNV"
+                              MemberName 36(gl_MeshPerVertexNV) 0  "gl_Position"
+                              MemberName 36(gl_MeshPerVertexNV) 1  "gl_PointSize"
+                              MemberName 36(gl_MeshPerVertexNV) 2  "gl_ClipDistance"
+                              MemberName 36(gl_MeshPerVertexNV) 3  "gl_CullDistance"
+                              MemberName 36(gl_MeshPerVertexNV) 4  "gl_PositionPerViewNV"
+                              MemberName 36(gl_MeshPerVertexNV) 5  "gl_ClipDistancePerViewNV"
+                              MemberName 36(gl_MeshPerVertexNV) 6  "gl_CullDistancePerViewNV"
+                              Name 40  "gl_MeshVerticesNV"
+                              Name 68  "gl_MeshPerPrimitiveNV"
+                              MemberName 68(gl_MeshPerPrimitiveNV) 0  "gl_PrimitiveID"
+                              MemberName 68(gl_MeshPerPrimitiveNV) 1  "gl_Layer"
+                              MemberName 68(gl_MeshPerPrimitiveNV) 2  "gl_ViewportIndex"
+                              MemberName 68(gl_MeshPerPrimitiveNV) 3  "gl_ViewportMask"
+                              MemberName 68(gl_MeshPerPrimitiveNV) 4  "gl_LayerPerViewNV"
+                              MemberName 68(gl_MeshPerPrimitiveNV) 5  "gl_ViewportMaskPerViewNV"
+                              Name 72  "gl_MeshPrimitivesNV"
+                              Decorate 11(gl_LocalInvocationID) BuiltIn LocalInvocationId
+                              Decorate 20(gl_MeshViewIndicesNV) BuiltIn MeshViewIndicesNV
+                              Decorate 21(gl_MeshViewCountNV) BuiltIn MeshViewCountNV
+                              MemberDecorate 36(gl_MeshPerVertexNV) 0 BuiltIn Position
+                              MemberDecorate 36(gl_MeshPerVertexNV) 1 BuiltIn PointSize
+                              MemberDecorate 36(gl_MeshPerVertexNV) 2 BuiltIn ClipDistance
+                              MemberDecorate 36(gl_MeshPerVertexNV) 3 BuiltIn CullDistance
+                              MemberDecorate 36(gl_MeshPerVertexNV) 4 PerViewNV
+                              MemberDecorate 36(gl_MeshPerVertexNV) 4 BuiltIn PositionPerViewNV
+                              MemberDecorate 36(gl_MeshPerVertexNV) 5 PerViewNV
+                              MemberDecorate 36(gl_MeshPerVertexNV) 5 BuiltIn ClipDistancePerViewNV
+                              MemberDecorate 36(gl_MeshPerVertexNV) 6 PerViewNV
+                              MemberDecorate 36(gl_MeshPerVertexNV) 6 BuiltIn CullDistancePerViewNV
+                              Decorate 36(gl_MeshPerVertexNV) Block
+                              MemberDecorate 68(gl_MeshPerPrimitiveNV) 0 PerPrimitiveNV
+                              MemberDecorate 68(gl_MeshPerPrimitiveNV) 0 BuiltIn PrimitiveId
+                              MemberDecorate 68(gl_MeshPerPrimitiveNV) 1 PerPrimitiveNV
+                              MemberDecorate 68(gl_MeshPerPrimitiveNV) 1 BuiltIn Layer
+                              MemberDecorate 68(gl_MeshPerPrimitiveNV) 2 PerPrimitiveNV
+                              MemberDecorate 68(gl_MeshPerPrimitiveNV) 2 BuiltIn ViewportIndex
+                              MemberDecorate 68(gl_MeshPerPrimitiveNV) 3 PerPrimitiveNV
+                              MemberDecorate 68(gl_MeshPerPrimitiveNV) 3 BuiltIn ViewportMaskNV
+                              MemberDecorate 68(gl_MeshPerPrimitiveNV) 4 PerPrimitiveNV
+                              MemberDecorate 68(gl_MeshPerPrimitiveNV) 4 PerViewNV
+                              MemberDecorate 68(gl_MeshPerPrimitiveNV) 4 BuiltIn LayerPerViewNV
+                              MemberDecorate 68(gl_MeshPerPrimitiveNV) 5 PerPrimitiveNV
+                              MemberDecorate 68(gl_MeshPerPrimitiveNV) 5 PerViewNV
+                              MemberDecorate 68(gl_MeshPerPrimitiveNV) 5 BuiltIn ViewportMaskPerViewNV
+                              Decorate 68(gl_MeshPerPrimitiveNV) Block
+                              Decorate 125 BuiltIn WorkgroupSize
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeInt 32 0
+               7:             TypePointer Function 6(int)
+               9:             TypeVector 6(int) 3
+              10:             TypePointer Input 9(ivec3)
+11(gl_LocalInvocationID):     10(ptr) Variable Input
+              12:      6(int) Constant 0
+              13:             TypePointer Input 6(int)
+              17:      6(int) Constant 4
+              18:             TypeArray 6(int) 17
+              19:             TypePointer Input 18
+20(gl_MeshViewIndicesNV):     19(ptr) Variable Input
+21(gl_MeshViewCountNV):     13(ptr) Variable Input
+              26:             TypeFloat 32
+              27:             TypeVector 26(float) 4
+              28:      6(int) Constant 1
+              29:             TypeArray 26(float) 28
+              30:             TypeArray 27(fvec4) 17
+              31:      6(int) Constant 3
+              32:             TypeArray 26(float) 31
+              33:             TypeArray 32 17
+              34:             TypeArray 26(float) 17
+              35:             TypeArray 34 17
+36(gl_MeshPerVertexNV):             TypeStruct 27(fvec4) 26(float) 29 29 30 33 35
+              37:      6(int) Constant 81
+              38:             TypeArray 36(gl_MeshPerVertexNV) 37
+              39:             TypePointer Output 38
+40(gl_MeshVerticesNV):     39(ptr) Variable Output
+              42:             TypeInt 32 1
+              43:     42(int) Constant 4
+              45:   26(float) Constant 1065353216
+              46:   26(float) Constant 1073741824
+              47:   26(float) Constant 1077936128
+              48:   26(float) Constant 1082130432
+              49:   27(fvec4) ConstantComposite 45 46 47 48
+              50:             TypePointer Output 27(fvec4)
+              53:     42(int) Constant 5
+              55:     42(int) Constant 2
+              56:   26(float) Constant 1084227584
+              57:             TypePointer Output 26(float)
+              60:     42(int) Constant 6
+              62:     42(int) Constant 3
+              63:   26(float) Constant 1086324736
+              65:             TypeArray 42(int) 28
+              66:             TypeArray 42(int) 17
+              67:             TypeArray 65 17
+68(gl_MeshPerPrimitiveNV):             TypeStruct 42(int) 42(int) 42(int) 65 66 67
+              69:      6(int) Constant 32
+              70:             TypeArray 68(gl_MeshPerPrimitiveNV) 69
+              71:             TypePointer Output 70
+72(gl_MeshPrimitivesNV):     71(ptr) Variable Output
+              75:     42(int) Constant 7
+              76:             TypePointer Output 42(int)
+              80:     42(int) Constant 0
+              81:     42(int) Constant 8
+              83:      6(int) Constant 264
+              84:      6(int) Constant 2
+             125:    9(ivec3) ConstantComposite 69 28 28
+         4(main):           2 Function None 3
+               5:             Label
+          8(iid):      7(ptr) Variable Function
+      16(viewID):      7(ptr) Variable Function
+              14:     13(ptr) AccessChain 11(gl_LocalInvocationID) 12
+              15:      6(int) Load 14
+                              Store 8(iid) 15
+              22:      6(int) Load 21(gl_MeshViewCountNV)
+              23:      6(int) UMod 22 17
+              24:     13(ptr) AccessChain 20(gl_MeshViewIndicesNV) 23
+              25:      6(int) Load 24
+                              Store 16(viewID) 25
+              41:      6(int) Load 8(iid)
+              44:      6(int) Load 16(viewID)
+              51:     50(ptr) AccessChain 40(gl_MeshVerticesNV) 41 43 44
+                              Store 51 49
+              52:      6(int) Load 8(iid)
+              54:      6(int) Load 16(viewID)
+              58:     57(ptr) AccessChain 40(gl_MeshVerticesNV) 52 53 54 55
+                              Store 58 56
+              59:      6(int) Load 8(iid)
+              61:      6(int) Load 16(viewID)
+              64:     57(ptr) AccessChain 40(gl_MeshVerticesNV) 59 60 61 62
+                              Store 64 63
+              73:      6(int) Load 8(iid)
+              74:      6(int) Load 16(viewID)
+              77:     76(ptr) AccessChain 72(gl_MeshPrimitivesNV) 73 43 74
+                              Store 77 75
+              78:      6(int) Load 8(iid)
+              79:      6(int) Load 16(viewID)
+              82:     76(ptr) AccessChain 72(gl_MeshPrimitivesNV) 78 53 79 80
+                              Store 82 81
+                              MemoryBarrier 28 83
+                              ControlBarrier 84 84 83
+              85:      6(int) Load 8(iid)
+              86:      6(int) IAdd 85 28
+              87:      6(int) Load 16(viewID)
+              88:      6(int) Load 8(iid)
+              89:      6(int) Load 16(viewID)
+              90:     50(ptr) AccessChain 40(gl_MeshVerticesNV) 88 43 89
+              91:   27(fvec4) Load 90
+              92:     50(ptr) AccessChain 40(gl_MeshVerticesNV) 86 43 87
+                              Store 92 91
+              93:      6(int) Load 8(iid)
+              94:      6(int) IAdd 93 28
+              95:      6(int) Load 16(viewID)
+              96:      6(int) Load 8(iid)
+              97:      6(int) Load 16(viewID)
+              98:     57(ptr) AccessChain 40(gl_MeshVerticesNV) 96 53 97 55
+              99:   26(float) Load 98
+             100:     57(ptr) AccessChain 40(gl_MeshVerticesNV) 94 53 95 55
+                              Store 100 99
+             101:      6(int) Load 8(iid)
+             102:      6(int) IAdd 101 28
+             103:      6(int) Load 16(viewID)
+             104:      6(int) Load 8(iid)
+             105:      6(int) Load 16(viewID)
+             106:     57(ptr) AccessChain 40(gl_MeshVerticesNV) 104 60 105 62
+             107:   26(float) Load 106
+             108:     57(ptr) AccessChain 40(gl_MeshVerticesNV) 102 60 103 62
+                              Store 108 107
+             109:      6(int) Load 8(iid)
+             110:      6(int) IAdd 109 28
+             111:      6(int) Load 16(viewID)
+             112:      6(int) Load 8(iid)
+             113:      6(int) Load 16(viewID)
+             114:     76(ptr) AccessChain 72(gl_MeshPrimitivesNV) 112 43 113
+             115:     42(int) Load 114
+             116:     76(ptr) AccessChain 72(gl_MeshPrimitivesNV) 110 43 111
+                              Store 116 115
+             117:      6(int) Load 8(iid)
+             118:      6(int) IAdd 117 28
+             119:      6(int) Load 16(viewID)
+             120:      6(int) Load 8(iid)
+             121:      6(int) Load 16(viewID)
+             122:     76(ptr) AccessChain 72(gl_MeshPrimitivesNV) 120 53 121 80
+             123:     42(int) Load 122
+             124:     76(ptr) AccessChain 72(gl_MeshPrimitivesNV) 118 53 119 80
+                              Store 124 123
+                              MemoryBarrier 28 83
+                              ControlBarrier 84 84 83
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.meshShaderPerViewUserDefined.mesh.out b/Test/baseResults/spv.meshShaderPerViewUserDefined.mesh.out
new file mode 100644
index 0000000..7e7a37d
--- /dev/null
+++ b/Test/baseResults/spv.meshShaderPerViewUserDefined.mesh.out
@@ -0,0 +1,156 @@
+spv.meshShaderPerViewUserDefined.mesh
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 90
+
+                              Capability MeshShadingNV
+                              Extension  "SPV_NV_mesh_shader"
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint MeshNV 4  "main" 11 20 21 35 67
+                              ExecutionMode 4 LocalSize 32 1 1
+                              ExecutionMode 4 OutputVertices 81
+                              ExecutionMode 4 OutputPrimitivesNV 32
+                              ExecutionMode 4 OutputTrianglesNV
+                              Source GLSL 450
+                              SourceExtension  "GL_NV_mesh_shader"
+                              Name 4  "main"
+                              Name 8  "iid"
+                              Name 11  "gl_LocalInvocationID"
+                              Name 16  "viewID"
+                              Name 20  "gl_MeshViewIndicesNV"
+                              Name 21  "gl_MeshViewCountNV"
+                              Name 31  "block"
+                              MemberName 31(block) 0  "color1"
+                              MemberName 31(block) 1  "color2"
+                              MemberName 31(block) 2  "color3"
+                              MemberName 31(block) 3  "color4"
+                              Name 35  "b"
+                              Name 64  "perviewBlock"
+                              MemberName 64(perviewBlock) 0  "color5"
+                              MemberName 64(perviewBlock) 1  "color6"
+                              MemberName 64(perviewBlock) 2  "color7"
+                              MemberName 64(perviewBlock) 3  "color8"
+                              Name 67  "b2"
+                              Decorate 11(gl_LocalInvocationID) BuiltIn LocalInvocationId
+                              Decorate 20(gl_MeshViewIndicesNV) BuiltIn MeshViewIndicesNV
+                              Decorate 21(gl_MeshViewCountNV) BuiltIn MeshViewCountNV
+                              MemberDecorate 31(block) 0 PerPrimitiveNV
+                              MemberDecorate 31(block) 0 PerViewNV
+                              MemberDecorate 31(block) 1 PerPrimitiveNV
+                              MemberDecorate 31(block) 2 PerViewNV
+                              Decorate 31(block) Block
+                              Decorate 35(b) Location 0
+                              MemberDecorate 64(perviewBlock) 0 PerPrimitiveNV
+                              MemberDecorate 64(perviewBlock) 0 PerViewNV
+                              MemberDecorate 64(perviewBlock) 1 PerPrimitiveNV
+                              MemberDecorate 64(perviewBlock) 1 PerViewNV
+                              MemberDecorate 64(perviewBlock) 2 PerViewNV
+                              MemberDecorate 64(perviewBlock) 3 PerViewNV
+                              Decorate 64(perviewBlock) Block
+                              Decorate 67(b2) Location 10
+                              Decorate 89 BuiltIn WorkgroupSize
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeInt 32 0
+               7:             TypePointer Function 6(int)
+               9:             TypeVector 6(int) 3
+              10:             TypePointer Input 9(ivec3)
+11(gl_LocalInvocationID):     10(ptr) Variable Input
+              12:      6(int) Constant 0
+              13:             TypePointer Input 6(int)
+              17:      6(int) Constant 4
+              18:             TypeArray 6(int) 17
+              19:             TypePointer Input 18
+20(gl_MeshViewIndicesNV):     19(ptr) Variable Input
+21(gl_MeshViewCountNV):     13(ptr) Variable Input
+              26:             TypeFloat 32
+              27:             TypeVector 26(float) 4
+              28:      6(int) Constant 3
+              29:             TypeArray 27(fvec4) 28
+              30:             TypeArray 29 17
+       31(block):             TypeStruct 30 29 30 27(fvec4)
+              32:      6(int) Constant 81
+              33:             TypeArray 31(block) 32
+              34:             TypePointer Output 33
+           35(b):     34(ptr) Variable Output
+              37:             TypeInt 32 1
+              38:     37(int) Constant 0
+              40:     37(int) Constant 2
+              41:   26(float) Constant 1065353216
+              42:   27(fvec4) ConstantComposite 41 41 41 41
+              43:             TypePointer Output 27(fvec4)
+              46:     37(int) Constant 1
+              47:   26(float) Constant 1073741824
+              48:   27(fvec4) ConstantComposite 47 47 47 47
+              52:   26(float) Constant 1077936128
+              53:   27(fvec4) ConstantComposite 52 52 52 52
+              56:     37(int) Constant 3
+              57:   26(float) Constant 1082130432
+              58:   27(fvec4) ConstantComposite 57 57 57 57
+              60:      6(int) Constant 1
+              61:      6(int) Constant 264
+              62:      6(int) Constant 2
+              63:             TypeArray 27(fvec4) 17
+64(perviewBlock):             TypeStruct 63 30 30 63
+              65:             TypeArray 64(perviewBlock) 32
+              66:             TypePointer Output 65
+          67(b2):     66(ptr) Variable Output
+              70:   26(float) Constant 1084227584
+              71:   27(fvec4) ConstantComposite 70 70 70 70
+              75:   26(float) Constant 1086324736
+              76:   27(fvec4) ConstantComposite 75 75 75 75
+              80:   26(float) Constant 1088421888
+              81:   27(fvec4) ConstantComposite 80 80 80 80
+              85:   26(float) Constant 1090519040
+              86:   27(fvec4) ConstantComposite 85 85 85 85
+              88:      6(int) Constant 32
+              89:    9(ivec3) ConstantComposite 88 60 60
+         4(main):           2 Function None 3
+               5:             Label
+          8(iid):      7(ptr) Variable Function
+      16(viewID):      7(ptr) Variable Function
+              14:     13(ptr) AccessChain 11(gl_LocalInvocationID) 12
+              15:      6(int) Load 14
+                              Store 8(iid) 15
+              22:      6(int) Load 21(gl_MeshViewCountNV)
+              23:      6(int) UMod 22 17
+              24:     13(ptr) AccessChain 20(gl_MeshViewIndicesNV) 23
+              25:      6(int) Load 24
+                              Store 16(viewID) 25
+              36:      6(int) Load 8(iid)
+              39:      6(int) Load 16(viewID)
+              44:     43(ptr) AccessChain 35(b) 36 38 39 40
+                              Store 44 42
+              45:      6(int) Load 8(iid)
+              49:     43(ptr) AccessChain 35(b) 45 46 46
+                              Store 49 48
+              50:      6(int) Load 8(iid)
+              51:      6(int) Load 16(viewID)
+              54:     43(ptr) AccessChain 35(b) 50 40 51 40
+                              Store 54 53
+              55:      6(int) Load 8(iid)
+              59:     43(ptr) AccessChain 35(b) 55 56
+                              Store 59 58
+                              MemoryBarrier 60 61
+                              ControlBarrier 62 62 61
+              68:      6(int) Load 8(iid)
+              69:      6(int) Load 16(viewID)
+              72:     43(ptr) AccessChain 67(b2) 68 38 69
+                              Store 72 71
+              73:      6(int) Load 8(iid)
+              74:      6(int) Load 16(viewID)
+              77:     43(ptr) AccessChain 67(b2) 73 46 74 46
+                              Store 77 76
+              78:      6(int) Load 8(iid)
+              79:      6(int) Load 16(viewID)
+              82:     43(ptr) AccessChain 67(b2) 78 40 79 40
+                              Store 82 81
+              83:      6(int) Load 8(iid)
+              84:      6(int) Load 16(viewID)
+              87:     43(ptr) AccessChain 67(b2) 83 56 84
+                              Store 87 86
+                              MemoryBarrier 60 61
+                              ControlBarrier 62 62 61
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.meshShaderRedeclBuiltins.mesh.out b/Test/baseResults/spv.meshShaderRedeclBuiltins.mesh.out
new file mode 100644
index 0000000..f4491c0
--- /dev/null
+++ b/Test/baseResults/spv.meshShaderRedeclBuiltins.mesh.out
@@ -0,0 +1,201 @@
+spv.meshShaderRedeclBuiltins.mesh
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 120
+
+                              Capability ClipDistance
+                              Capability CullDistance
+                              Capability MultiViewport
+                              Capability ShaderViewportMaskNV
+                              Capability MeshShadingNV
+                              Extension  "SPV_NV_mesh_shader"
+                              Extension  "SPV_NV_viewport_array2"
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint MeshNV 4  "main" 11 17 28 81
+                              ExecutionMode 4 LocalSize 32 1 1
+                              ExecutionMode 4 OutputVertices 81
+                              ExecutionMode 4 OutputPrimitivesNV 32
+                              ExecutionMode 4 OutputTrianglesNV
+                              Source GLSL 460
+                              SourceExtension  "GL_NV_mesh_shader"
+                              Name 4  "main"
+                              Name 8  "iid"
+                              Name 11  "gl_LocalInvocationID"
+                              Name 16  "gid"
+                              Name 17  "gl_WorkGroupID"
+                              Name 24  "gl_MeshPerVertexNV"
+                              MemberName 24(gl_MeshPerVertexNV) 0  "gl_Position"
+                              MemberName 24(gl_MeshPerVertexNV) 1  "gl_PointSize"
+                              MemberName 24(gl_MeshPerVertexNV) 2  "gl_ClipDistance"
+                              MemberName 24(gl_MeshPerVertexNV) 3  "gl_CullDistance"
+                              Name 28  "gl_MeshVerticesNV"
+                              Name 77  "gl_MeshPerPrimitiveNV"
+                              MemberName 77(gl_MeshPerPrimitiveNV) 0  "gl_PrimitiveID"
+                              MemberName 77(gl_MeshPerPrimitiveNV) 1  "gl_Layer"
+                              MemberName 77(gl_MeshPerPrimitiveNV) 2  "gl_ViewportIndex"
+                              MemberName 77(gl_MeshPerPrimitiveNV) 3  "gl_ViewportMask"
+                              Name 81  "gl_MeshPrimitivesNV"
+                              Decorate 11(gl_LocalInvocationID) BuiltIn LocalInvocationId
+                              Decorate 17(gl_WorkGroupID) BuiltIn WorkgroupId
+                              MemberDecorate 24(gl_MeshPerVertexNV) 0 BuiltIn Position
+                              MemberDecorate 24(gl_MeshPerVertexNV) 1 BuiltIn PointSize
+                              MemberDecorate 24(gl_MeshPerVertexNV) 2 BuiltIn ClipDistance
+                              MemberDecorate 24(gl_MeshPerVertexNV) 3 BuiltIn CullDistance
+                              Decorate 24(gl_MeshPerVertexNV) Block
+                              MemberDecorate 77(gl_MeshPerPrimitiveNV) 0 PerPrimitiveNV
+                              MemberDecorate 77(gl_MeshPerPrimitiveNV) 0 BuiltIn PrimitiveId
+                              MemberDecorate 77(gl_MeshPerPrimitiveNV) 1 PerPrimitiveNV
+                              MemberDecorate 77(gl_MeshPerPrimitiveNV) 1 BuiltIn Layer
+                              MemberDecorate 77(gl_MeshPerPrimitiveNV) 2 PerPrimitiveNV
+                              MemberDecorate 77(gl_MeshPerPrimitiveNV) 2 BuiltIn ViewportIndex
+                              MemberDecorate 77(gl_MeshPerPrimitiveNV) 3 PerPrimitiveNV
+                              MemberDecorate 77(gl_MeshPerPrimitiveNV) 3 BuiltIn ViewportMaskNV
+                              Decorate 77(gl_MeshPerPrimitiveNV) Block
+                              Decorate 119 BuiltIn WorkgroupSize
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeInt 32 0
+               7:             TypePointer Function 6(int)
+               9:             TypeVector 6(int) 3
+              10:             TypePointer Input 9(ivec3)
+11(gl_LocalInvocationID):     10(ptr) Variable Input
+              12:      6(int) Constant 0
+              13:             TypePointer Input 6(int)
+17(gl_WorkGroupID):     10(ptr) Variable Input
+              20:             TypeFloat 32
+              21:             TypeVector 20(float) 4
+              22:      6(int) Constant 4
+              23:             TypeArray 20(float) 22
+24(gl_MeshPerVertexNV):             TypeStruct 21(fvec4) 20(float) 23 23
+              25:      6(int) Constant 81
+              26:             TypeArray 24(gl_MeshPerVertexNV) 25
+              27:             TypePointer Output 26
+28(gl_MeshVerticesNV):     27(ptr) Variable Output
+              30:             TypeInt 32 1
+              31:     30(int) Constant 0
+              32:   20(float) Constant 1065353216
+              33:   21(fvec4) ConstantComposite 32 32 32 32
+              34:             TypePointer Output 21(fvec4)
+              37:     30(int) Constant 1
+              38:   20(float) Constant 1073741824
+              39:             TypePointer Output 20(float)
+              42:     30(int) Constant 2
+              43:     30(int) Constant 3
+              44:   20(float) Constant 1077936128
+              47:   20(float) Constant 1082130432
+              49:      6(int) Constant 1
+              50:      6(int) Constant 264
+              51:      6(int) Constant 2
+              76:             TypeArray 30(int) 49
+77(gl_MeshPerPrimitiveNV):             TypeStruct 30(int) 30(int) 30(int) 76
+              78:      6(int) Constant 32
+              79:             TypeArray 77(gl_MeshPerPrimitiveNV) 78
+              80:             TypePointer Output 79
+81(gl_MeshPrimitivesNV):     80(ptr) Variable Output
+              83:     30(int) Constant 6
+              84:             TypePointer Output 30(int)
+              87:     30(int) Constant 7
+              90:     30(int) Constant 8
+              93:     30(int) Constant 9
+             119:    9(ivec3) ConstantComposite 78 49 49
+         4(main):           2 Function None 3
+               5:             Label
+          8(iid):      7(ptr) Variable Function
+         16(gid):      7(ptr) Variable Function
+              14:     13(ptr) AccessChain 11(gl_LocalInvocationID) 12
+              15:      6(int) Load 14
+                              Store 8(iid) 15
+              18:     13(ptr) AccessChain 17(gl_WorkGroupID) 12
+              19:      6(int) Load 18
+                              Store 16(gid) 19
+              29:      6(int) Load 8(iid)
+              35:     34(ptr) AccessChain 28(gl_MeshVerticesNV) 29 31
+                              Store 35 33
+              36:      6(int) Load 8(iid)
+              40:     39(ptr) AccessChain 28(gl_MeshVerticesNV) 36 37
+                              Store 40 38
+              41:      6(int) Load 8(iid)
+              45:     39(ptr) AccessChain 28(gl_MeshVerticesNV) 41 42 43
+                              Store 45 44
+              46:      6(int) Load 8(iid)
+              48:     39(ptr) AccessChain 28(gl_MeshVerticesNV) 46 43 42
+                              Store 48 47
+                              MemoryBarrier 49 50
+                              ControlBarrier 51 51 50
+              52:      6(int) Load 8(iid)
+              53:      6(int) IAdd 52 49
+              54:      6(int) Load 8(iid)
+              55:     34(ptr) AccessChain 28(gl_MeshVerticesNV) 54 31
+              56:   21(fvec4) Load 55
+              57:     34(ptr) AccessChain 28(gl_MeshVerticesNV) 53 31
+                              Store 57 56
+              58:      6(int) Load 8(iid)
+              59:      6(int) IAdd 58 49
+              60:      6(int) Load 8(iid)
+              61:     39(ptr) AccessChain 28(gl_MeshVerticesNV) 60 37
+              62:   20(float) Load 61
+              63:     39(ptr) AccessChain 28(gl_MeshVerticesNV) 59 37
+                              Store 63 62
+              64:      6(int) Load 8(iid)
+              65:      6(int) IAdd 64 49
+              66:      6(int) Load 8(iid)
+              67:     39(ptr) AccessChain 28(gl_MeshVerticesNV) 66 42 43
+              68:   20(float) Load 67
+              69:     39(ptr) AccessChain 28(gl_MeshVerticesNV) 65 42 43
+                              Store 69 68
+              70:      6(int) Load 8(iid)
+              71:      6(int) IAdd 70 49
+              72:      6(int) Load 8(iid)
+              73:     39(ptr) AccessChain 28(gl_MeshVerticesNV) 72 43 42
+              74:   20(float) Load 73
+              75:     39(ptr) AccessChain 28(gl_MeshVerticesNV) 71 43 42
+                              Store 75 74
+                              MemoryBarrier 49 50
+                              ControlBarrier 51 51 50
+              82:      6(int) Load 8(iid)
+              85:     84(ptr) AccessChain 81(gl_MeshPrimitivesNV) 82 31
+                              Store 85 83
+              86:      6(int) Load 8(iid)
+              88:     84(ptr) AccessChain 81(gl_MeshPrimitivesNV) 86 37
+                              Store 88 87
+              89:      6(int) Load 8(iid)
+              91:     84(ptr) AccessChain 81(gl_MeshPrimitivesNV) 89 42
+                              Store 91 90
+              92:      6(int) Load 8(iid)
+              94:     84(ptr) AccessChain 81(gl_MeshPrimitivesNV) 92 43 31
+                              Store 94 93
+                              MemoryBarrier 49 50
+                              ControlBarrier 51 51 50
+              95:      6(int) Load 8(iid)
+              96:      6(int) IAdd 95 49
+              97:      6(int) Load 8(iid)
+              98:     84(ptr) AccessChain 81(gl_MeshPrimitivesNV) 97 31
+              99:     30(int) Load 98
+             100:     84(ptr) AccessChain 81(gl_MeshPrimitivesNV) 96 31
+                              Store 100 99
+             101:      6(int) Load 8(iid)
+             102:      6(int) IAdd 101 49
+             103:      6(int) Load 8(iid)
+             104:     84(ptr) AccessChain 81(gl_MeshPrimitivesNV) 103 37
+             105:     30(int) Load 104
+             106:     84(ptr) AccessChain 81(gl_MeshPrimitivesNV) 102 37
+                              Store 106 105
+             107:      6(int) Load 8(iid)
+             108:      6(int) IAdd 107 49
+             109:      6(int) Load 8(iid)
+             110:     84(ptr) AccessChain 81(gl_MeshPrimitivesNV) 109 42
+             111:     30(int) Load 110
+             112:     84(ptr) AccessChain 81(gl_MeshPrimitivesNV) 108 42
+                              Store 112 111
+             113:      6(int) Load 8(iid)
+             114:      6(int) IAdd 113 49
+             115:      6(int) Load 8(iid)
+             116:     84(ptr) AccessChain 81(gl_MeshPrimitivesNV) 115 43 31
+             117:     30(int) Load 116
+             118:     84(ptr) AccessChain 81(gl_MeshPrimitivesNV) 114 43 31
+                              Store 118 117
+                              MemoryBarrier 49 50
+                              ControlBarrier 51 51 50
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.meshShaderRedeclPerViewBuiltins.mesh.out b/Test/baseResults/spv.meshShaderRedeclPerViewBuiltins.mesh.out
new file mode 100644
index 0000000..6672dc2
--- /dev/null
+++ b/Test/baseResults/spv.meshShaderRedeclPerViewBuiltins.mesh.out
@@ -0,0 +1,187 @@
+spv.meshShaderRedeclPerViewBuiltins.mesh
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 120
+
+                              Capability PerViewAttributesNV
+                              Capability MeshShadingNV
+                              Extension  "SPV_NVX_multiview_per_view_attributes"
+                              Extension  "SPV_NV_mesh_shader"
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint MeshNV 4  "main" 11 20 21 35 67
+                              ExecutionMode 4 LocalSize 32 1 1
+                              ExecutionMode 4 OutputVertices 81
+                              ExecutionMode 4 OutputPrimitivesNV 32
+                              ExecutionMode 4 OutputTrianglesNV
+                              Source GLSL 450
+                              SourceExtension  "GL_NV_mesh_shader"
+                              Name 4  "main"
+                              Name 8  "iid"
+                              Name 11  "gl_LocalInvocationID"
+                              Name 16  "viewID"
+                              Name 20  "gl_MeshViewIndicesNV"
+                              Name 21  "gl_MeshViewCountNV"
+                              Name 31  "gl_MeshPerVertexNV"
+                              MemberName 31(gl_MeshPerVertexNV) 0  "gl_PositionPerViewNV"
+                              MemberName 31(gl_MeshPerVertexNV) 1  "gl_ClipDistancePerViewNV"
+                              MemberName 31(gl_MeshPerVertexNV) 2  "gl_CullDistancePerViewNV"
+                              Name 35  "gl_MeshVerticesNV"
+                              Name 63  "gl_MeshPerPrimitiveNV"
+                              MemberName 63(gl_MeshPerPrimitiveNV) 0  "gl_LayerPerViewNV"
+                              MemberName 63(gl_MeshPerPrimitiveNV) 1  "gl_ViewportMaskPerViewNV"
+                              Name 67  "gl_MeshPrimitivesNV"
+                              Decorate 11(gl_LocalInvocationID) BuiltIn LocalInvocationId
+                              Decorate 20(gl_MeshViewIndicesNV) BuiltIn MeshViewIndicesNV
+                              Decorate 21(gl_MeshViewCountNV) BuiltIn MeshViewCountNV
+                              MemberDecorate 31(gl_MeshPerVertexNV) 0 PerViewNV
+                              MemberDecorate 31(gl_MeshPerVertexNV) 0 BuiltIn PositionPerViewNV
+                              MemberDecorate 31(gl_MeshPerVertexNV) 1 PerViewNV
+                              MemberDecorate 31(gl_MeshPerVertexNV) 1 BuiltIn ClipDistancePerViewNV
+                              MemberDecorate 31(gl_MeshPerVertexNV) 2 PerViewNV
+                              MemberDecorate 31(gl_MeshPerVertexNV) 2 BuiltIn CullDistancePerViewNV
+                              Decorate 31(gl_MeshPerVertexNV) Block
+                              MemberDecorate 63(gl_MeshPerPrimitiveNV) 0 PerPrimitiveNV
+                              MemberDecorate 63(gl_MeshPerPrimitiveNV) 0 PerViewNV
+                              MemberDecorate 63(gl_MeshPerPrimitiveNV) 0 BuiltIn LayerPerViewNV
+                              MemberDecorate 63(gl_MeshPerPrimitiveNV) 1 PerPrimitiveNV
+                              MemberDecorate 63(gl_MeshPerPrimitiveNV) 1 PerViewNV
+                              MemberDecorate 63(gl_MeshPerPrimitiveNV) 1 BuiltIn ViewportMaskPerViewNV
+                              Decorate 63(gl_MeshPerPrimitiveNV) Block
+                              Decorate 119 BuiltIn WorkgroupSize
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeInt 32 0
+               7:             TypePointer Function 6(int)
+               9:             TypeVector 6(int) 3
+              10:             TypePointer Input 9(ivec3)
+11(gl_LocalInvocationID):     10(ptr) Variable Input
+              12:      6(int) Constant 0
+              13:             TypePointer Input 6(int)
+              17:      6(int) Constant 4
+              18:             TypeArray 6(int) 17
+              19:             TypePointer Input 18
+20(gl_MeshViewIndicesNV):     19(ptr) Variable Input
+21(gl_MeshViewCountNV):     13(ptr) Variable Input
+              26:             TypeFloat 32
+              27:             TypeVector 26(float) 4
+              28:             TypeArray 27(fvec4) 17
+              29:             TypeArray 26(float) 17
+              30:             TypeArray 29 17
+31(gl_MeshPerVertexNV):             TypeStruct 28 30 30
+              32:      6(int) Constant 81
+              33:             TypeArray 31(gl_MeshPerVertexNV) 32
+              34:             TypePointer Output 33
+35(gl_MeshVerticesNV):     34(ptr) Variable Output
+              37:             TypeInt 32 1
+              38:     37(int) Constant 0
+              40:   26(float) Constant 1065353216
+              41:   26(float) Constant 1073741824
+              42:   26(float) Constant 1077936128
+              43:   26(float) Constant 1082130432
+              44:   27(fvec4) ConstantComposite 40 41 42 43
+              45:             TypePointer Output 27(fvec4)
+              48:     37(int) Constant 1
+              50:     37(int) Constant 2
+              51:   26(float) Constant 1084227584
+              52:             TypePointer Output 26(float)
+              56:     37(int) Constant 3
+              57:   26(float) Constant 1086324736
+              59:             TypeArray 37(int) 17
+              60:      6(int) Constant 1
+              61:             TypeArray 37(int) 60
+              62:             TypeArray 61 17
+63(gl_MeshPerPrimitiveNV):             TypeStruct 59 62
+              64:      6(int) Constant 32
+              65:             TypeArray 63(gl_MeshPerPrimitiveNV) 64
+              66:             TypePointer Output 65
+67(gl_MeshPrimitivesNV):     66(ptr) Variable Output
+              70:     37(int) Constant 7
+              71:             TypePointer Output 37(int)
+              75:     37(int) Constant 8
+              77:      6(int) Constant 264
+              78:      6(int) Constant 2
+             119:    9(ivec3) ConstantComposite 64 60 60
+         4(main):           2 Function None 3
+               5:             Label
+          8(iid):      7(ptr) Variable Function
+      16(viewID):      7(ptr) Variable Function
+              14:     13(ptr) AccessChain 11(gl_LocalInvocationID) 12
+              15:      6(int) Load 14
+                              Store 8(iid) 15
+              22:      6(int) Load 21(gl_MeshViewCountNV)
+              23:      6(int) UMod 22 17
+              24:     13(ptr) AccessChain 20(gl_MeshViewIndicesNV) 23
+              25:      6(int) Load 24
+                              Store 16(viewID) 25
+              36:      6(int) Load 8(iid)
+              39:      6(int) Load 16(viewID)
+              46:     45(ptr) AccessChain 35(gl_MeshVerticesNV) 36 38 39
+                              Store 46 44
+              47:      6(int) Load 8(iid)
+              49:      6(int) Load 16(viewID)
+              53:     52(ptr) AccessChain 35(gl_MeshVerticesNV) 47 48 49 50
+                              Store 53 51
+              54:      6(int) Load 8(iid)
+              55:      6(int) Load 16(viewID)
+              58:     52(ptr) AccessChain 35(gl_MeshVerticesNV) 54 50 55 56
+                              Store 58 57
+              68:      6(int) Load 8(iid)
+              69:      6(int) Load 16(viewID)
+              72:     71(ptr) AccessChain 67(gl_MeshPrimitivesNV) 68 38 69
+                              Store 72 70
+              73:      6(int) Load 8(iid)
+              74:      6(int) Load 16(viewID)
+              76:     71(ptr) AccessChain 67(gl_MeshPrimitivesNV) 73 48 74 38
+                              Store 76 75
+                              MemoryBarrier 60 77
+                              ControlBarrier 78 78 77
+              79:      6(int) Load 8(iid)
+              80:      6(int) IAdd 79 60
+              81:      6(int) Load 16(viewID)
+              82:      6(int) Load 8(iid)
+              83:      6(int) Load 16(viewID)
+              84:     45(ptr) AccessChain 35(gl_MeshVerticesNV) 82 38 83
+              85:   27(fvec4) Load 84
+              86:     45(ptr) AccessChain 35(gl_MeshVerticesNV) 80 38 81
+                              Store 86 85
+              87:      6(int) Load 8(iid)
+              88:      6(int) IAdd 87 60
+              89:      6(int) Load 16(viewID)
+              90:      6(int) Load 8(iid)
+              91:      6(int) Load 16(viewID)
+              92:     52(ptr) AccessChain 35(gl_MeshVerticesNV) 90 48 91 50
+              93:   26(float) Load 92
+              94:     52(ptr) AccessChain 35(gl_MeshVerticesNV) 88 48 89 50
+                              Store 94 93
+              95:      6(int) Load 8(iid)
+              96:      6(int) IAdd 95 60
+              97:      6(int) Load 16(viewID)
+              98:      6(int) Load 8(iid)
+              99:      6(int) Load 16(viewID)
+             100:     52(ptr) AccessChain 35(gl_MeshVerticesNV) 98 50 99 56
+             101:   26(float) Load 100
+             102:     52(ptr) AccessChain 35(gl_MeshVerticesNV) 96 50 97 56
+                              Store 102 101
+             103:      6(int) Load 8(iid)
+             104:      6(int) IAdd 103 60
+             105:      6(int) Load 16(viewID)
+             106:      6(int) Load 8(iid)
+             107:      6(int) Load 16(viewID)
+             108:     71(ptr) AccessChain 67(gl_MeshPrimitivesNV) 106 38 107
+             109:     37(int) Load 108
+             110:     71(ptr) AccessChain 67(gl_MeshPrimitivesNV) 104 38 105
+                              Store 110 109
+             111:      6(int) Load 8(iid)
+             112:      6(int) IAdd 111 60
+             113:      6(int) Load 16(viewID)
+             114:      6(int) Load 8(iid)
+             115:      6(int) Load 16(viewID)
+             116:     71(ptr) AccessChain 67(gl_MeshPrimitivesNV) 114 48 115 38
+             117:     37(int) Load 116
+             118:     71(ptr) AccessChain 67(gl_MeshPrimitivesNV) 112 48 113 38
+                              Store 118 117
+                              MemoryBarrier 60 77
+                              ControlBarrier 78 78 77
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.meshShaderSharedMem.mesh.out b/Test/baseResults/spv.meshShaderSharedMem.mesh.out
new file mode 100644
index 0000000..198f812
--- /dev/null
+++ b/Test/baseResults/spv.meshShaderSharedMem.mesh.out
@@ -0,0 +1,128 @@
+spv.meshShaderSharedMem.mesh
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 77
+
+                              Capability StorageImageWriteWithoutFormat
+                              Capability MeshShadingNV
+                              Extension  "SPV_NV_mesh_shader"
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint MeshNV 4  "main" 11 17
+                              ExecutionMode 4 LocalSize 32 1 1
+                              ExecutionMode 4 OutputVertices 81
+                              ExecutionMode 4 OutputPrimitivesNV 32
+                              ExecutionMode 4 OutputTrianglesNV
+                              Source GLSL 450
+                              SourceExtension  "GL_NV_mesh_shader"
+                              Name 4  "main"
+                              Name 8  "iid"
+                              Name 11  "gl_LocalInvocationID"
+                              Name 16  "gid"
+                              Name 17  "gl_WorkGroupID"
+                              Name 20  "i"
+                              Name 34  "mem"
+                              Name 37  "block0"
+                              MemberName 37(block0) 0  "uni_value"
+                              Name 39  ""
+                              Name 55  "uni_image"
+                              Decorate 11(gl_LocalInvocationID) BuiltIn LocalInvocationId
+                              Decorate 17(gl_WorkGroupID) BuiltIn WorkgroupId
+                              MemberDecorate 37(block0) 0 Offset 0
+                              Decorate 37(block0) Block
+                              Decorate 39 DescriptorSet 0
+                              Decorate 55(uni_image) DescriptorSet 0
+                              Decorate 55(uni_image) NonReadable
+                              Decorate 76 BuiltIn WorkgroupSize
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeInt 32 0
+               7:             TypePointer Function 6(int)
+               9:             TypeVector 6(int) 3
+              10:             TypePointer Input 9(ivec3)
+11(gl_LocalInvocationID):     10(ptr) Variable Input
+              12:      6(int) Constant 0
+              13:             TypePointer Input 6(int)
+17(gl_WorkGroupID):     10(ptr) Variable Input
+              27:      6(int) Constant 10
+              28:             TypeBool
+              30:             TypeFloat 32
+              31:             TypeVector 30(float) 4
+              32:             TypeArray 31(fvec4) 27
+              33:             TypePointer Workgroup 32
+         34(mem):     33(ptr) Variable Workgroup
+      37(block0):             TypeStruct 6(int)
+              38:             TypePointer Uniform 37(block0)
+              39:     38(ptr) Variable Uniform
+              40:             TypeInt 32 1
+              41:     40(int) Constant 0
+              42:             TypePointer Uniform 6(int)
+              48:             TypePointer Workgroup 31(fvec4)
+              51:     40(int) Constant 1
+              53:             TypeImage 30(float) 2D nonsampled format:Unknown
+              54:             TypePointer UniformConstant 53
+   55(uni_image):     54(ptr) Variable UniformConstant
+              59:             TypeVector 40(int) 2
+              69:      6(int) Constant 1
+              73:      6(int) Constant 264
+              74:      6(int) Constant 2
+              75:      6(int) Constant 32
+              76:    9(ivec3) ConstantComposite 75 69 69
+         4(main):           2 Function None 3
+               5:             Label
+          8(iid):      7(ptr) Variable Function
+         16(gid):      7(ptr) Variable Function
+           20(i):      7(ptr) Variable Function
+              14:     13(ptr) AccessChain 11(gl_LocalInvocationID) 12
+              15:      6(int) Load 14
+                              Store 8(iid) 15
+              18:     13(ptr) AccessChain 17(gl_WorkGroupID) 12
+              19:      6(int) Load 18
+                              Store 16(gid) 19
+                              Store 20(i) 12
+                              Branch 21
+              21:             Label
+                              LoopMerge 23 24 None
+                              Branch 25
+              25:             Label
+              26:      6(int) Load 20(i)
+              29:    28(bool) ULessThan 26 27
+                              BranchConditional 29 22 23
+              22:               Label
+              35:      6(int)   Load 20(i)
+              36:      6(int)   Load 20(i)
+              43:     42(ptr)   AccessChain 39 41
+              44:      6(int)   Load 43
+              45:      6(int)   IAdd 36 44
+              46:   30(float)   ConvertUToF 45
+              47:   31(fvec4)   CompositeConstruct 46 46 46 46
+              49:     48(ptr)   AccessChain 34(mem) 35
+                                Store 49 47
+                                Branch 24
+              24:               Label
+              50:      6(int)   Load 20(i)
+              52:      6(int)   IAdd 50 51
+                                Store 20(i) 52
+                                Branch 21
+              23:             Label
+              56:          53 Load 55(uni_image)
+              57:      6(int) Load 8(iid)
+              58:     40(int) Bitcast 57
+              60:   59(ivec2) CompositeConstruct 58 58
+              61:      6(int) Load 16(gid)
+              62:     48(ptr) AccessChain 34(mem) 61
+              63:   31(fvec4) Load 62
+                              ImageWrite 56 60 63
+              64:          53 Load 55(uni_image)
+              65:      6(int) Load 8(iid)
+              66:     40(int) Bitcast 65
+              67:   59(ivec2) CompositeConstruct 66 66
+              68:      6(int) Load 16(gid)
+              70:      6(int) IAdd 68 69
+              71:     48(ptr) AccessChain 34(mem) 70
+              72:   31(fvec4) Load 71
+                              ImageWrite 64 67 72
+                              MemoryBarrier 69 73
+                              ControlBarrier 74 74 73
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.meshShaderTaskMem.mesh.out b/Test/baseResults/spv.meshShaderTaskMem.mesh.out
new file mode 100644
index 0000000..93b2a45
--- /dev/null
+++ b/Test/baseResults/spv.meshShaderTaskMem.mesh.out
@@ -0,0 +1,107 @@
+spv.meshShaderTaskMem.mesh
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 58
+
+                              Capability MeshShadingNV
+                              Extension  "SPV_NV_mesh_shader"
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint MeshNV 4  "main" 11 22 30
+                              ExecutionMode 4 LocalSize 32 1 1
+                              ExecutionMode 4 OutputVertices 81
+                              ExecutionMode 4 OutputPrimitivesNV 32
+                              ExecutionMode 4 OutputTrianglesNV
+                              Source GLSL 450
+                              SourceExtension  "GL_NV_mesh_shader"
+                              Name 4  "main"
+                              Name 8  "iid"
+                              Name 11  "gl_LocalInvocationID"
+                              Name 18  "outBlock"
+                              MemberName 18(outBlock) 0  "gid5"
+                              MemberName 18(outBlock) 1  "gid6"
+                              Name 22  "myblk"
+                              Name 28  "taskBlock"
+                              MemberName 28(taskBlock) 0  "gid1"
+                              MemberName 28(taskBlock) 1  "gid2"
+                              Name 30  "mytask"
+                              Name 36  "bufferBlock"
+                              MemberName 36(bufferBlock) 0  "gid3"
+                              MemberName 36(bufferBlock) 1  "gid4"
+                              Name 38  "mybuf"
+                              Decorate 11(gl_LocalInvocationID) BuiltIn LocalInvocationId
+                              Decorate 18(outBlock) Block
+                              Decorate 22(myblk) Location 0
+                              Decorate 27 ArrayStride 4
+                              MemberDecorate 28(taskBlock) 0 PerTaskNV
+                              MemberDecorate 28(taskBlock) 0 Offset 0
+                              MemberDecorate 28(taskBlock) 1 PerTaskNV
+                              MemberDecorate 28(taskBlock) 1 Offset 16
+                              Decorate 28(taskBlock) Block
+                              Decorate 35 ArrayStride 4
+                              MemberDecorate 36(bufferBlock) 0 Offset 0
+                              MemberDecorate 36(bufferBlock) 1 Offset 16
+                              Decorate 36(bufferBlock) BufferBlock
+                              Decorate 38(mybuf) DescriptorSet 0
+                              Decorate 57 BuiltIn WorkgroupSize
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeInt 32 0
+               7:             TypePointer Function 6(int)
+               9:             TypeVector 6(int) 3
+              10:             TypePointer Input 9(ivec3)
+11(gl_LocalInvocationID):     10(ptr) Variable Input
+              12:      6(int) Constant 0
+              13:             TypePointer Input 6(int)
+              16:             TypeFloat 32
+              17:             TypeVector 16(float) 4
+    18(outBlock):             TypeStruct 16(float) 17(fvec4)
+              19:      6(int) Constant 81
+              20:             TypeArray 18(outBlock) 19
+              21:             TypePointer Output 20
+       22(myblk):     21(ptr) Variable Output
+              24:             TypeInt 32 1
+              25:     24(int) Constant 0
+              26:      6(int) Constant 2
+              27:             TypeArray 16(float) 26
+   28(taskBlock):             TypeStruct 27 17(fvec4)
+              29:             TypePointer Input 28(taskBlock)
+      30(mytask):     29(ptr) Variable Input
+              31:     24(int) Constant 1
+              32:             TypePointer Input 16(float)
+              35:             TypeArray 16(float) 26
+ 36(bufferBlock):             TypeStruct 35 17(fvec4)
+              37:             TypePointer Uniform 36(bufferBlock)
+       38(mybuf):     37(ptr) Variable Uniform
+              39:             TypePointer Uniform 16(float)
+              43:             TypePointer Output 16(float)
+              46:             TypePointer Input 17(fvec4)
+              49:             TypePointer Uniform 17(fvec4)
+              53:             TypePointer Output 17(fvec4)
+              55:      6(int) Constant 32
+              56:      6(int) Constant 1
+              57:    9(ivec3) ConstantComposite 55 56 56
+         4(main):           2 Function None 3
+               5:             Label
+          8(iid):      7(ptr) Variable Function
+              14:     13(ptr) AccessChain 11(gl_LocalInvocationID) 12
+              15:      6(int) Load 14
+                              Store 8(iid) 15
+              23:      6(int) Load 8(iid)
+              33:     32(ptr) AccessChain 30(mytask) 25 31
+              34:   16(float) Load 33
+              40:     39(ptr) AccessChain 38(mybuf) 25 31
+              41:   16(float) Load 40
+              42:   16(float) FAdd 34 41
+              44:     43(ptr) AccessChain 22(myblk) 23 25
+                              Store 44 42
+              45:      6(int) Load 8(iid)
+              47:     46(ptr) AccessChain 30(mytask) 31
+              48:   17(fvec4) Load 47
+              50:     49(ptr) AccessChain 38(mybuf) 31
+              51:   17(fvec4) Load 50
+              52:   17(fvec4) FAdd 48 51
+              54:     53(ptr) AccessChain 22(myblk) 45 31
+                              Store 54 52
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.meshShaderUserDefined.mesh.out b/Test/baseResults/spv.meshShaderUserDefined.mesh.out
new file mode 100644
index 0000000..c3ec915
--- /dev/null
+++ b/Test/baseResults/spv.meshShaderUserDefined.mesh.out
@@ -0,0 +1,203 @@
+spv.meshShaderUserDefined.mesh
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 138
+
+                              Capability MeshShadingNV
+                              Extension  "SPV_NV_mesh_shader"
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint MeshNV 4  "main" 11 17 34 101
+                              ExecutionMode 4 LocalSize 32 1 1
+                              ExecutionMode 4 OutputVertices 81
+                              ExecutionMode 4 OutputPrimitivesNV 32
+                              ExecutionMode 4 OutputTrianglesNV
+                              Source GLSL 450
+                              SourceExtension  "GL_NV_mesh_shader"
+                              Name 4  "main"
+                              Name 8  "iid"
+                              Name 11  "gl_LocalInvocationID"
+                              Name 16  "gid"
+                              Name 17  "gl_WorkGroupID"
+                              Name 30  "myblock"
+                              MemberName 30(myblock) 0  "f"
+                              MemberName 30(myblock) 1  "fArr"
+                              MemberName 30(myblock) 2  "pos"
+                              MemberName 30(myblock) 3  "posArr"
+                              MemberName 30(myblock) 4  "m"
+                              MemberName 30(myblock) 5  "mArr"
+                              Name 34  "blk"
+                              Name 97  "myblock2"
+                              MemberName 97(myblock2) 0  "f"
+                              MemberName 97(myblock2) 1  "pos"
+                              MemberName 97(myblock2) 2  "m"
+                              Name 101  "blk2"
+                              Decorate 11(gl_LocalInvocationID) BuiltIn LocalInvocationId
+                              Decorate 17(gl_WorkGroupID) BuiltIn WorkgroupId
+                              MemberDecorate 30(myblock) 0 PerPrimitiveNV
+                              MemberDecorate 30(myblock) 1 PerPrimitiveNV
+                              MemberDecorate 30(myblock) 2 PerPrimitiveNV
+                              MemberDecorate 30(myblock) 3 PerPrimitiveNV
+                              MemberDecorate 30(myblock) 4 PerPrimitiveNV
+                              MemberDecorate 30(myblock) 5 PerPrimitiveNV
+                              Decorate 30(myblock) Block
+                              Decorate 34(blk) Location 0
+                              Decorate 97(myblock2) Block
+                              Decorate 101(blk2) Location 20
+                              Decorate 137 BuiltIn WorkgroupSize
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeInt 32 0
+               7:             TypePointer Function 6(int)
+               9:             TypeVector 6(int) 3
+              10:             TypePointer Input 9(ivec3)
+11(gl_LocalInvocationID):     10(ptr) Variable Input
+              12:      6(int) Constant 0
+              13:             TypePointer Input 6(int)
+17(gl_WorkGroupID):     10(ptr) Variable Input
+              20:             TypeFloat 32
+              21:      6(int) Constant 4
+              22:             TypeArray 20(float) 21
+              23:             TypeVector 20(float) 3
+              24:             TypeVector 20(float) 4
+              25:             TypeArray 24(fvec4) 21
+              26:             TypeMatrix 24(fvec4) 4
+              27:             TypeMatrix 23(fvec3) 3
+              28:      6(int) Constant 2
+              29:             TypeArray 27 28
+     30(myblock):             TypeStruct 20(float) 22 23(fvec3) 25 26 29
+              31:      6(int) Constant 32
+              32:             TypeArray 30(myblock) 31
+              33:             TypePointer Output 32
+         34(blk):     33(ptr) Variable Output
+              36:             TypeInt 32 1
+              37:     36(int) Constant 0
+              38:   20(float) Constant 1093664768
+              39:             TypePointer Output 20(float)
+              42:      6(int) Constant 1
+              44:     36(int) Constant 1
+              52:     36(int) Constant 2
+              53:   20(float) Constant 1096810496
+              54:   20(float) Constant 1097859072
+              55:   20(float) Constant 1095761920
+              56:   23(fvec3) ConstantComposite 53 54 55
+              57:             TypePointer Output 23(fvec3)
+              63:     36(int) Constant 3
+              68:             TypePointer Output 24(fvec4)
+              74:     36(int) Constant 4
+              75:   20(float) Constant 1098907648
+              76:   24(fvec4) ConstantComposite 55 53 54 75
+              81:     36(int) Constant 5
+              84:      6(int) Constant 3
+              91:   20(float) Constant 1099431936
+              92:   20(float) Constant 1099956224
+              93:   20(float) Constant 1100480512
+              94:   23(fvec3) ConstantComposite 91 92 93
+              96:      6(int) Constant 264
+    97(myblock2):             TypeStruct 20(float) 24(fvec4) 26
+              98:      6(int) Constant 81
+              99:             TypeArray 97(myblock2) 98
+             100:             TypePointer Output 99
+       101(blk2):    100(ptr) Variable Output
+             107:   20(float) Constant 1101004800
+             111:   20(float) Constant 1101529088
+             112:   20(float) Constant 1102053376
+             113:   20(float) Constant 1102577664
+             114:   20(float) Constant 1103101952
+             115:   24(fvec4) ConstantComposite 111 112 113 114
+             127:   20(float) Constant 1105723392
+             137:    9(ivec3) ConstantComposite 31 42 42
+         4(main):           2 Function None 3
+               5:             Label
+          8(iid):      7(ptr) Variable Function
+         16(gid):      7(ptr) Variable Function
+              14:     13(ptr) AccessChain 11(gl_LocalInvocationID) 12
+              15:      6(int) Load 14
+                              Store 8(iid) 15
+              18:     13(ptr) AccessChain 17(gl_WorkGroupID) 12
+              19:      6(int) Load 18
+                              Store 16(gid) 19
+              35:      6(int) Load 8(iid)
+              40:     39(ptr) AccessChain 34(blk) 35 37
+                              Store 40 38
+              41:      6(int) Load 8(iid)
+              43:      6(int) IAdd 41 42
+              45:      6(int) Load 16(gid)
+              46:      6(int) Load 8(iid)
+              47:     39(ptr) AccessChain 34(blk) 46 37
+              48:   20(float) Load 47
+              49:     39(ptr) AccessChain 34(blk) 43 44 45
+                              Store 49 48
+              50:      6(int) Load 8(iid)
+              51:      6(int) UDiv 50 28
+              58:     57(ptr) AccessChain 34(blk) 51 52
+              59:   23(fvec3) Load 58
+              60:   23(fvec3) VectorShuffle 59 56 5 3 4
+                              Store 58 60
+              61:      6(int) Load 8(iid)
+              62:      6(int) IMul 61 28
+              64:      6(int) Load 8(iid)
+              65:      6(int) UDiv 64 28
+              66:     57(ptr) AccessChain 34(blk) 65 52
+              67:   23(fvec3) Load 66
+              69:     68(ptr) AccessChain 34(blk) 62 63 44
+              70:   24(fvec4) Load 69
+              71:   24(fvec4) VectorShuffle 70 67 0 4 5 6
+                              Store 69 71
+              72:      6(int) Load 8(iid)
+              73:      6(int) UDiv 72 21
+              77:     68(ptr) AccessChain 34(blk) 73 74 52
+              78:   24(fvec4) Load 77
+              79:   24(fvec4) VectorShuffle 78 76 7 6 5 4
+                              Store 77 79
+              80:      6(int) Load 8(iid)
+              82:      6(int) Load 8(iid)
+              83:      6(int) UDiv 82 21
+              85:     39(ptr) AccessChain 34(blk) 83 74 52 84
+              86:   20(float) Load 85
+              87:     39(ptr) AccessChain 34(blk) 80 81 37 44 42
+                              Store 87 86
+              88:      6(int) Load 8(iid)
+              89:      6(int) IMul 88 21
+              90:      6(int) Load 16(gid)
+              95:     57(ptr) AccessChain 34(blk) 89 81 44 90
+                              Store 95 94
+                              MemoryBarrier 42 96
+                              ControlBarrier 28 28 96
+             102:      6(int) Load 8(iid)
+             103:      6(int) Load 8(iid)
+             104:      6(int) ISub 103 42
+             105:     39(ptr) AccessChain 101(blk2) 104 37
+             106:   20(float) Load 105
+             108:   20(float) FAdd 106 107
+             109:     39(ptr) AccessChain 101(blk2) 102 37
+                              Store 109 108
+             110:      6(int) Load 8(iid)
+             116:     68(ptr) AccessChain 101(blk2) 110 44
+                              Store 116 115
+             117:      6(int) Load 8(iid)
+             118:      6(int) IAdd 117 42
+             119:      6(int) Load 16(gid)
+             120:      6(int) Load 8(iid)
+             121:     68(ptr) AccessChain 101(blk2) 120 44
+             122:   24(fvec4) Load 121
+             123:     68(ptr) AccessChain 101(blk2) 118 52 119
+                              Store 123 122
+             124:      6(int) Load 8(iid)
+             125:      6(int) IAdd 124 42
+             126:      6(int) Load 16(gid)
+             128:     39(ptr) AccessChain 101(blk2) 125 52 126 28
+                              Store 128 127
+             129:      6(int) Load 8(iid)
+             130:      6(int) IAdd 129 28
+             131:      6(int) Load 8(iid)
+             132:      6(int) IAdd 131 42
+             133:      6(int) Load 16(gid)
+             134:     68(ptr) AccessChain 101(blk2) 132 52 133
+             135:   24(fvec4) Load 134
+             136:     68(ptr) AccessChain 101(blk2) 130 52 63
+                              Store 136 135
+                              MemoryBarrier 42 96
+                              ControlBarrier 28 28 96
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.meshTaskShader.task.out b/Test/baseResults/spv.meshTaskShader.task.out
new file mode 100644
index 0000000..9ac27fa
--- /dev/null
+++ b/Test/baseResults/spv.meshTaskShader.task.out
@@ -0,0 +1,172 @@
+spv.meshTaskShader.task
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 104
+
+                              Capability StorageImageWriteWithoutFormat
+                              Capability MeshShadingNV
+                              Extension  "SPV_NV_mesh_shader"
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint TaskNV 4  "main" 11 17 80 101
+                              ExecutionMode 4 LocalSize 32 1 1
+                              Source GLSL 450
+                              SourceExtension  "GL_NV_mesh_shader"
+                              Name 4  "main"
+                              Name 8  "iid"
+                              Name 11  "gl_LocalInvocationID"
+                              Name 16  "gid"
+                              Name 17  "gl_WorkGroupID"
+                              Name 20  "i"
+                              Name 34  "mem"
+                              Name 37  "block0"
+                              MemberName 37(block0) 0  "uni_value"
+                              Name 39  ""
+                              Name 55  "uni_image"
+                              Name 78  "Task"
+                              MemberName 78(Task) 0  "dummy"
+                              MemberName 78(Task) 1  "submesh"
+                              Name 80  "mytask"
+                              Name 101  "gl_TaskCountNV"
+                              Decorate 11(gl_LocalInvocationID) BuiltIn LocalInvocationId
+                              Decorate 17(gl_WorkGroupID) BuiltIn WorkgroupId
+                              MemberDecorate 37(block0) 0 Offset 0
+                              Decorate 37(block0) Block
+                              Decorate 39 DescriptorSet 0
+                              Decorate 55(uni_image) DescriptorSet 0
+                              Decorate 55(uni_image) Binding 0
+                              Decorate 55(uni_image) NonReadable
+                              Decorate 77 ArrayStride 8
+                              MemberDecorate 78(Task) 0 PerTaskNV
+                              MemberDecorate 78(Task) 0 Offset 0
+                              MemberDecorate 78(Task) 1 PerTaskNV
+                              MemberDecorate 78(Task) 1 Offset 8
+                              Decorate 78(Task) Block
+                              Decorate 101(gl_TaskCountNV) BuiltIn TaskCountNV
+                              Decorate 103 BuiltIn WorkgroupSize
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeInt 32 0
+               7:             TypePointer Function 6(int)
+               9:             TypeVector 6(int) 3
+              10:             TypePointer Input 9(ivec3)
+11(gl_LocalInvocationID):     10(ptr) Variable Input
+              12:      6(int) Constant 0
+              13:             TypePointer Input 6(int)
+17(gl_WorkGroupID):     10(ptr) Variable Input
+              27:      6(int) Constant 10
+              28:             TypeBool
+              30:             TypeFloat 32
+              31:             TypeVector 30(float) 4
+              32:             TypeArray 31(fvec4) 27
+              33:             TypePointer Workgroup 32
+         34(mem):     33(ptr) Variable Workgroup
+      37(block0):             TypeStruct 6(int)
+              38:             TypePointer Uniform 37(block0)
+              39:     38(ptr) Variable Uniform
+              40:             TypeInt 32 1
+              41:     40(int) Constant 0
+              42:             TypePointer Uniform 6(int)
+              48:             TypePointer Workgroup 31(fvec4)
+              51:     40(int) Constant 1
+              53:             TypeImage 30(float) 2D nonsampled format:Unknown
+              54:             TypePointer UniformConstant 53
+   55(uni_image):     54(ptr) Variable UniformConstant
+              59:             TypeVector 40(int) 2
+              69:      6(int) Constant 1
+              73:      6(int) Constant 264
+              74:      6(int) Constant 2
+              75:             TypeVector 30(float) 2
+              76:      6(int) Constant 3
+              77:             TypeArray 75(fvec2) 76
+        78(Task):             TypeStruct 75(fvec2) 77
+              79:             TypePointer Output 78(Task)
+      80(mytask):     79(ptr) Variable Output
+              81:   30(float) Constant 1106247680
+              82:   30(float) Constant 1106771968
+              83:   75(fvec2) ConstantComposite 81 82
+              84:             TypePointer Output 75(fvec2)
+              86:   30(float) Constant 1107296256
+              87:   30(float) Constant 1107558400
+              88:   75(fvec2) ConstantComposite 86 87
+              90:   30(float) Constant 1107820544
+              91:   30(float) Constant 1108082688
+              92:   75(fvec2) ConstantComposite 90 91
+              94:     40(int) Constant 2
+             100:             TypePointer Output 6(int)
+101(gl_TaskCountNV):    100(ptr) Variable Output
+             102:      6(int) Constant 32
+             103:    9(ivec3) ConstantComposite 102 69 69
+         4(main):           2 Function None 3
+               5:             Label
+          8(iid):      7(ptr) Variable Function
+         16(gid):      7(ptr) Variable Function
+           20(i):      7(ptr) Variable Function
+              14:     13(ptr) AccessChain 11(gl_LocalInvocationID) 12
+              15:      6(int) Load 14
+                              Store 8(iid) 15
+              18:     13(ptr) AccessChain 17(gl_WorkGroupID) 12
+              19:      6(int) Load 18
+                              Store 16(gid) 19
+                              Store 20(i) 12
+                              Branch 21
+              21:             Label
+                              LoopMerge 23 24 None
+                              Branch 25
+              25:             Label
+              26:      6(int) Load 20(i)
+              29:    28(bool) ULessThan 26 27
+                              BranchConditional 29 22 23
+              22:               Label
+              35:      6(int)   Load 20(i)
+              36:      6(int)   Load 20(i)
+              43:     42(ptr)   AccessChain 39 41
+              44:      6(int)   Load 43
+              45:      6(int)   IAdd 36 44
+              46:   30(float)   ConvertUToF 45
+              47:   31(fvec4)   CompositeConstruct 46 46 46 46
+              49:     48(ptr)   AccessChain 34(mem) 35
+                                Store 49 47
+                                Branch 24
+              24:               Label
+              50:      6(int)   Load 20(i)
+              52:      6(int)   IAdd 50 51
+                                Store 20(i) 52
+                                Branch 21
+              23:             Label
+              56:          53 Load 55(uni_image)
+              57:      6(int) Load 8(iid)
+              58:     40(int) Bitcast 57
+              60:   59(ivec2) CompositeConstruct 58 58
+              61:      6(int) Load 16(gid)
+              62:     48(ptr) AccessChain 34(mem) 61
+              63:   31(fvec4) Load 62
+                              ImageWrite 56 60 63
+              64:          53 Load 55(uni_image)
+              65:      6(int) Load 8(iid)
+              66:     40(int) Bitcast 65
+              67:   59(ivec2) CompositeConstruct 66 66
+              68:      6(int) Load 16(gid)
+              70:      6(int) IAdd 68 69
+              71:     48(ptr) AccessChain 34(mem) 70
+              72:   31(fvec4) Load 71
+                              ImageWrite 64 67 72
+                              MemoryBarrier 69 73
+                              ControlBarrier 74 74 73
+              85:     84(ptr) AccessChain 80(mytask) 41
+                              Store 85 83
+              89:     84(ptr) AccessChain 80(mytask) 51 41
+                              Store 89 88
+              93:     84(ptr) AccessChain 80(mytask) 51 51
+                              Store 93 92
+              95:      6(int) Load 16(gid)
+              96:      6(int) UMod 95 74
+              97:     84(ptr) AccessChain 80(mytask) 51 96
+              98:   75(fvec2) Load 97
+              99:     84(ptr) AccessChain 80(mytask) 51 94
+                              Store 99 98
+                              MemoryBarrier 69 73
+                              ControlBarrier 74 74 73
+                              Store 101(gl_TaskCountNV) 76
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.multiStruct.comp.out b/Test/baseResults/spv.multiStruct.comp.out
old mode 100755
new mode 100644
index f8c0eea..7e88a59
--- a/Test/baseResults/spv.multiStruct.comp.out
+++ b/Test/baseResults/spv.multiStruct.comp.out
@@ -1,9 +1,7 @@
 spv.multiStruct.comp
-Warning, version 450 is not yet complete; most version-specific features are present, but some are missing.
-
 // Module Version 10000
-// Generated by (magic number): 80001
-// Id's are bound by 157
+// Generated by (magic number): 80007
+// Id's are bound by 161
 
                               Capability Shader
                1:             ExtInstImport  "GLSL.std.450"
@@ -22,31 +20,31 @@
                               Name 17  "SSBO0"
                               MemberName 17(SSBO0) 0  "a"
                               Name 19  "inBuf"
-                              Name 37  "SSBO1"
-                              MemberName 37(SSBO1) 0  "b"
-                              Name 39  "outBuf"
-                              Name 57  "MyStruct"
-                              MemberName 57(MyStruct) 0  "foo"
-                              MemberName 57(MyStruct) 1  "sb"
-                              Name 58  "UBO"
-                              MemberName 58(UBO) 0  "c"
-                              Name 60  "uBuf"
-                              Name 84  "Nested"
-                              MemberName 84(Nested) 0  "f"
-                              MemberName 84(Nested) 1  "S"
-                              Name 86  "n"
-                              Name 88  "Nested"
-                              MemberName 88(Nested) 0  "f"
-                              MemberName 88(Nested) 1  "S"
-                              Name 89  "UBON"
-                              MemberName 89(UBON) 0  "N1"
-                              Name 91  "uBufN"
-                              Name 122  "Nested"
-                              MemberName 122(Nested) 0  "f"
-                              MemberName 122(Nested) 1  "S"
-                              Name 123  "SSBO1N"
-                              MemberName 123(SSBO1N) 0  "N2"
-                              Name 125  "outBufN"
+                              Name 39  "SSBO1"
+                              MemberName 39(SSBO1) 0  "b"
+                              Name 41  "outBuf"
+                              Name 58  "MyStruct"
+                              MemberName 58(MyStruct) 0  "foo"
+                              MemberName 58(MyStruct) 1  "sb"
+                              Name 59  "UBO"
+                              MemberName 59(UBO) 0  "c"
+                              Name 61  "uBuf"
+                              Name 86  "Nested"
+                              MemberName 86(Nested) 0  "f"
+                              MemberName 86(Nested) 1  "S"
+                              Name 88  "n"
+                              Name 90  "Nested"
+                              MemberName 90(Nested) 0  "f"
+                              MemberName 90(Nested) 1  "S"
+                              Name 91  "UBON"
+                              MemberName 91(UBON) 0  "N1"
+                              Name 93  "uBufN"
+                              Name 126  "Nested"
+                              MemberName 126(Nested) 0  "f"
+                              MemberName 126(Nested) 1  "S"
+                              Name 127  "SSBO1N"
+                              MemberName 127(SSBO1N) 0  "N2"
+                              Name 129  "outBufN"
                               Decorate 15 ArrayStride 8
                               MemberDecorate 16(MyStruct) 0 Offset 0
                               MemberDecorate 16(MyStruct) 1 Offset 16
@@ -54,31 +52,31 @@
                               Decorate 17(SSBO0) BufferBlock
                               Decorate 19(inBuf) DescriptorSet 0
                               Decorate 19(inBuf) Binding 0
-                              MemberDecorate 37(SSBO1) 0 Offset 0
-                              Decorate 37(SSBO1) BufferBlock
-                              Decorate 39(outBuf) DescriptorSet 0
-                              Decorate 39(outBuf) Binding 1
-                              Decorate 56 ArrayStride 16
-                              MemberDecorate 57(MyStruct) 0 Offset 0
-                              MemberDecorate 57(MyStruct) 1 Offset 32
-                              MemberDecorate 58(UBO) 0 Offset 0
-                              Decorate 58(UBO) Block
-                              Decorate 60(uBuf) DescriptorSet 0
-                              Decorate 60(uBuf) Binding 2
-                              Decorate 87 ArrayStride 48
-                              MemberDecorate 88(Nested) 0 Offset 0
-                              MemberDecorate 88(Nested) 1 Offset 16
-                              MemberDecorate 89(UBON) 0 Offset 0
-                              Decorate 89(UBON) Block
-                              Decorate 91(uBufN) DescriptorSet 0
-                              Decorate 91(uBufN) Binding 2
-                              Decorate 121 ArrayStride 24
-                              MemberDecorate 122(Nested) 0 Offset 0
-                              MemberDecorate 122(Nested) 1 Offset 8
-                              MemberDecorate 123(SSBO1N) 0 Offset 0
-                              Decorate 123(SSBO1N) BufferBlock
-                              Decorate 125(outBufN) DescriptorSet 0
-                              Decorate 125(outBufN) Binding 1
+                              MemberDecorate 39(SSBO1) 0 Offset 0
+                              Decorate 39(SSBO1) BufferBlock
+                              Decorate 41(outBuf) DescriptorSet 0
+                              Decorate 41(outBuf) Binding 1
+                              Decorate 57 ArrayStride 16
+                              MemberDecorate 58(MyStruct) 0 Offset 0
+                              MemberDecorate 58(MyStruct) 1 Offset 32
+                              MemberDecorate 59(UBO) 0 Offset 0
+                              Decorate 59(UBO) Block
+                              Decorate 61(uBuf) DescriptorSet 0
+                              Decorate 61(uBuf) Binding 2
+                              Decorate 89 ArrayStride 48
+                              MemberDecorate 90(Nested) 0 Offset 0
+                              MemberDecorate 90(Nested) 1 Offset 16
+                              MemberDecorate 91(UBON) 0 Offset 0
+                              Decorate 91(UBON) Block
+                              Decorate 93(uBufN) DescriptorSet 0
+                              Decorate 93(uBufN) Binding 2
+                              Decorate 125 ArrayStride 24
+                              MemberDecorate 126(Nested) 0 Offset 0
+                              MemberDecorate 126(Nested) 1 Offset 8
+                              MemberDecorate 127(SSBO1N) 0 Offset 0
+                              Decorate 127(SSBO1N) BufferBlock
+                              Decorate 129(outBufN) DescriptorSet 0
+                              Decorate 129(outBufN) Binding 1
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -100,44 +98,44 @@
               26:             TypePointer Function 10
               29:             TypePointer Function 7(fvec2)
               32:     20(int) Constant 1
-              35:             TypePointer Function 11(bool)
-       37(SSBO1):             TypeStruct 16(MyStruct)
-              38:             TypePointer Uniform 37(SSBO1)
-      39(outBuf):     38(ptr) Variable Uniform
-              43:             TypePointer Uniform 15
-              46:             TypePointer Uniform 7(fvec2)
-              51:      8(int) Constant 0
-              52:      8(int) Constant 1
-              54:             TypePointer Uniform 8(int)
-              56:             TypeArray 7(fvec2) 9
-    57(MyStruct):             TypeStruct 56 8(int)
-         58(UBO):             TypeStruct 57(MyStruct)
-              59:             TypePointer Uniform 58(UBO)
-        60(uBuf):     59(ptr) Variable Uniform
-              61:             TypePointer Uniform 57(MyStruct)
-              83:             TypeArray 12(MyStruct) 9
-      84(Nested):             TypeStruct 6(float) 83
-              85:             TypePointer Function 84(Nested)
-              87:             TypeArray 57(MyStruct) 9
-      88(Nested):             TypeStruct 6(float) 87
-        89(UBON):             TypeStruct 88(Nested)
-              90:             TypePointer Uniform 89(UBON)
-       91(uBufN):     90(ptr) Variable Uniform
-              92:             TypePointer Uniform 88(Nested)
-              96:             TypePointer Function 6(float)
-              99:             TypePointer Function 83
-             121:             TypeArray 16(MyStruct) 9
-     122(Nested):             TypeStruct 6(float) 121
-     123(SSBO1N):             TypeStruct 122(Nested)
-             124:             TypePointer Uniform 123(SSBO1N)
-    125(outBufN):    124(ptr) Variable Uniform
-             127:             TypePointer Uniform 122(Nested)
-             130:             TypePointer Uniform 6(float)
-             133:             TypePointer Uniform 121
+              35:      8(int) Constant 0
+              37:             TypePointer Function 11(bool)
+       39(SSBO1):             TypeStruct 16(MyStruct)
+              40:             TypePointer Uniform 39(SSBO1)
+      41(outBuf):     40(ptr) Variable Uniform
+              45:             TypePointer Uniform 15
+              48:             TypePointer Uniform 7(fvec2)
+              53:      8(int) Constant 1
+              55:             TypePointer Uniform 8(int)
+              57:             TypeArray 7(fvec2) 9
+    58(MyStruct):             TypeStruct 57 8(int)
+         59(UBO):             TypeStruct 58(MyStruct)
+              60:             TypePointer Uniform 59(UBO)
+        61(uBuf):     60(ptr) Variable Uniform
+              62:             TypePointer Uniform 58(MyStruct)
+              85:             TypeArray 12(MyStruct) 9
+      86(Nested):             TypeStruct 6(float) 85
+              87:             TypePointer Function 86(Nested)
+              89:             TypeArray 58(MyStruct) 9
+      90(Nested):             TypeStruct 6(float) 89
+        91(UBON):             TypeStruct 90(Nested)
+              92:             TypePointer Uniform 91(UBON)
+       93(uBufN):     92(ptr) Variable Uniform
+              94:             TypePointer Uniform 90(Nested)
+              98:             TypePointer Function 6(float)
+             101:             TypePointer Function 85
+             125:             TypeArray 16(MyStruct) 9
+     126(Nested):             TypeStruct 6(float) 125
+     127(SSBO1N):             TypeStruct 126(Nested)
+             128:             TypePointer Uniform 127(SSBO1N)
+    129(outBufN):    128(ptr) Variable Uniform
+             131:             TypePointer Uniform 126(Nested)
+             134:             TypePointer Uniform 6(float)
+             137:             TypePointer Uniform 125
          4(main):           2 Function None 3
                5:             Label
            14(t):     13(ptr) Variable Function
-           86(n):     85(ptr) Variable Function
+           88(n):     87(ptr) Variable Function
               23:     22(ptr) AccessChain 19(inBuf) 21
               24:16(MyStruct) Load 23
               25:          15 CompositeExtract 24 0
@@ -149,116 +147,120 @@
               33:     29(ptr) AccessChain 27 32
                               Store 33 31
               34:      8(int) CompositeExtract 24 1
-              36:     35(ptr) AccessChain 14(t) 32
-                              Store 36 34
-              40:12(MyStruct) Load 14(t)
-              41:     22(ptr) AccessChain 39(outBuf) 21
-              42:          10 CompositeExtract 40 0
-              44:     43(ptr) AccessChain 41 21
-              45:    7(fvec2) CompositeExtract 42 0
-              47:     46(ptr) AccessChain 44 21
-                              Store 47 45
-              48:    7(fvec2) CompositeExtract 42 1
-              49:     46(ptr) AccessChain 44 32
-                              Store 49 48
-              50:    11(bool) CompositeExtract 40 1
-              53:      8(int) Select 50 52 51
-              55:     54(ptr) AccessChain 41 32
-                              Store 55 53
-              62:     61(ptr) AccessChain 60(uBuf) 21
-              63:57(MyStruct) Load 62
-              64:          56 CompositeExtract 63 0
-              65:     26(ptr) AccessChain 14(t) 21
-              66:    7(fvec2) CompositeExtract 64 0
-              67:     29(ptr) AccessChain 65 21
-                              Store 67 66
-              68:    7(fvec2) CompositeExtract 64 1
-              69:     29(ptr) AccessChain 65 32
-                              Store 69 68
-              70:      8(int) CompositeExtract 63 1
-              71:     35(ptr) AccessChain 14(t) 32
-                              Store 71 70
-              72:12(MyStruct) Load 14(t)
-              73:     22(ptr) AccessChain 39(outBuf) 21
-              74:          10 CompositeExtract 72 0
-              75:     43(ptr) AccessChain 73 21
-              76:    7(fvec2) CompositeExtract 74 0
-              77:     46(ptr) AccessChain 75 21
-                              Store 77 76
-              78:    7(fvec2) CompositeExtract 74 1
-              79:     46(ptr) AccessChain 75 32
+              36:    11(bool) INotEqual 34 35
+              38:     37(ptr) AccessChain 14(t) 32
+                              Store 38 36
+              42:12(MyStruct) Load 14(t)
+              43:     22(ptr) AccessChain 41(outBuf) 21
+              44:          10 CompositeExtract 42 0
+              46:     45(ptr) AccessChain 43 21
+              47:    7(fvec2) CompositeExtract 44 0
+              49:     48(ptr) AccessChain 46 21
+                              Store 49 47
+              50:    7(fvec2) CompositeExtract 44 1
+              51:     48(ptr) AccessChain 46 32
+                              Store 51 50
+              52:    11(bool) CompositeExtract 42 1
+              54:      8(int) Select 52 53 35
+              56:     55(ptr) AccessChain 43 32
+                              Store 56 54
+              63:     62(ptr) AccessChain 61(uBuf) 21
+              64:58(MyStruct) Load 63
+              65:          57 CompositeExtract 64 0
+              66:     26(ptr) AccessChain 14(t) 21
+              67:    7(fvec2) CompositeExtract 65 0
+              68:     29(ptr) AccessChain 66 21
+                              Store 68 67
+              69:    7(fvec2) CompositeExtract 65 1
+              70:     29(ptr) AccessChain 66 32
+                              Store 70 69
+              71:      8(int) CompositeExtract 64 1
+              72:    11(bool) INotEqual 71 35
+              73:     37(ptr) AccessChain 14(t) 32
+                              Store 73 72
+              74:12(MyStruct) Load 14(t)
+              75:     22(ptr) AccessChain 41(outBuf) 21
+              76:          10 CompositeExtract 74 0
+              77:     45(ptr) AccessChain 75 21
+              78:    7(fvec2) CompositeExtract 76 0
+              79:     48(ptr) AccessChain 77 21
                               Store 79 78
-              80:    11(bool) CompositeExtract 72 1
-              81:      8(int) Select 80 52 51
-              82:     54(ptr) AccessChain 73 32
-                              Store 82 81
-              93:     92(ptr) AccessChain 91(uBufN) 21
-              94:  88(Nested) Load 93
-              95:    6(float) CompositeExtract 94 0
-              97:     96(ptr) AccessChain 86(n) 21
-                              Store 97 95
-              98:          87 CompositeExtract 94 1
-             100:     99(ptr) AccessChain 86(n) 32
-             101:57(MyStruct) CompositeExtract 98 0
-             102:     13(ptr) AccessChain 100 21
-             103:          56 CompositeExtract 101 0
-             104:     26(ptr) AccessChain 102 21
-             105:    7(fvec2) CompositeExtract 103 0
-             106:     29(ptr) AccessChain 104 21
-                              Store 106 105
-             107:    7(fvec2) CompositeExtract 103 1
-             108:     29(ptr) AccessChain 104 32
+              80:    7(fvec2) CompositeExtract 76 1
+              81:     48(ptr) AccessChain 77 32
+                              Store 81 80
+              82:    11(bool) CompositeExtract 74 1
+              83:      8(int) Select 82 53 35
+              84:     55(ptr) AccessChain 75 32
+                              Store 84 83
+              95:     94(ptr) AccessChain 93(uBufN) 21
+              96:  90(Nested) Load 95
+              97:    6(float) CompositeExtract 96 0
+              99:     98(ptr) AccessChain 88(n) 21
+                              Store 99 97
+             100:          89 CompositeExtract 96 1
+             102:    101(ptr) AccessChain 88(n) 32
+             103:58(MyStruct) CompositeExtract 100 0
+             104:     13(ptr) AccessChain 102 21
+             105:          57 CompositeExtract 103 0
+             106:     26(ptr) AccessChain 104 21
+             107:    7(fvec2) CompositeExtract 105 0
+             108:     29(ptr) AccessChain 106 21
                               Store 108 107
-             109:      8(int) CompositeExtract 101 1
-             110:     35(ptr) AccessChain 102 32
+             109:    7(fvec2) CompositeExtract 105 1
+             110:     29(ptr) AccessChain 106 32
                               Store 110 109
-             111:57(MyStruct) CompositeExtract 98 1
-             112:     13(ptr) AccessChain 100 32
-             113:          56 CompositeExtract 111 0
-             114:     26(ptr) AccessChain 112 21
-             115:    7(fvec2) CompositeExtract 113 0
-             116:     29(ptr) AccessChain 114 21
-                              Store 116 115
-             117:    7(fvec2) CompositeExtract 113 1
-             118:     29(ptr) AccessChain 114 32
-                              Store 118 117
-             119:      8(int) CompositeExtract 111 1
-             120:     35(ptr) AccessChain 112 32
-                              Store 120 119
-             126:  84(Nested) Load 86(n)
-             128:    127(ptr) AccessChain 125(outBufN) 21
-             129:    6(float) CompositeExtract 126 0
-             131:    130(ptr) AccessChain 128 21
-                              Store 131 129
-             132:          83 CompositeExtract 126 1
-             134:    133(ptr) AccessChain 128 32
-             135:12(MyStruct) CompositeExtract 132 0
-             136:     22(ptr) AccessChain 134 21
-             137:          10 CompositeExtract 135 0
-             138:     43(ptr) AccessChain 136 21
-             139:    7(fvec2) CompositeExtract 137 0
-             140:     46(ptr) AccessChain 138 21
-                              Store 140 139
-             141:    7(fvec2) CompositeExtract 137 1
-             142:     46(ptr) AccessChain 138 32
-                              Store 142 141
-             143:    11(bool) CompositeExtract 135 1
-             144:      8(int) Select 143 52 51
-             145:     54(ptr) AccessChain 136 32
-                              Store 145 144
-             146:12(MyStruct) CompositeExtract 132 1
-             147:     22(ptr) AccessChain 134 32
-             148:          10 CompositeExtract 146 0
-             149:     43(ptr) AccessChain 147 21
-             150:    7(fvec2) CompositeExtract 148 0
-             151:     46(ptr) AccessChain 149 21
-                              Store 151 150
-             152:    7(fvec2) CompositeExtract 148 1
-             153:     46(ptr) AccessChain 149 32
-                              Store 153 152
-             154:    11(bool) CompositeExtract 146 1
-             155:      8(int) Select 154 52 51
-             156:     54(ptr) AccessChain 147 32
-                              Store 156 155
+             111:      8(int) CompositeExtract 103 1
+             112:    11(bool) INotEqual 111 35
+             113:     37(ptr) AccessChain 104 32
+                              Store 113 112
+             114:58(MyStruct) CompositeExtract 100 1
+             115:     13(ptr) AccessChain 102 32
+             116:          57 CompositeExtract 114 0
+             117:     26(ptr) AccessChain 115 21
+             118:    7(fvec2) CompositeExtract 116 0
+             119:     29(ptr) AccessChain 117 21
+                              Store 119 118
+             120:    7(fvec2) CompositeExtract 116 1
+             121:     29(ptr) AccessChain 117 32
+                              Store 121 120
+             122:      8(int) CompositeExtract 114 1
+             123:    11(bool) INotEqual 122 35
+             124:     37(ptr) AccessChain 115 32
+                              Store 124 123
+             130:  86(Nested) Load 88(n)
+             132:    131(ptr) AccessChain 129(outBufN) 21
+             133:    6(float) CompositeExtract 130 0
+             135:    134(ptr) AccessChain 132 21
+                              Store 135 133
+             136:          85 CompositeExtract 130 1
+             138:    137(ptr) AccessChain 132 32
+             139:12(MyStruct) CompositeExtract 136 0
+             140:     22(ptr) AccessChain 138 21
+             141:          10 CompositeExtract 139 0
+             142:     45(ptr) AccessChain 140 21
+             143:    7(fvec2) CompositeExtract 141 0
+             144:     48(ptr) AccessChain 142 21
+                              Store 144 143
+             145:    7(fvec2) CompositeExtract 141 1
+             146:     48(ptr) AccessChain 142 32
+                              Store 146 145
+             147:    11(bool) CompositeExtract 139 1
+             148:      8(int) Select 147 53 35
+             149:     55(ptr) AccessChain 140 32
+                              Store 149 148
+             150:12(MyStruct) CompositeExtract 136 1
+             151:     22(ptr) AccessChain 138 32
+             152:          10 CompositeExtract 150 0
+             153:     45(ptr) AccessChain 151 21
+             154:    7(fvec2) CompositeExtract 152 0
+             155:     48(ptr) AccessChain 153 21
+                              Store 155 154
+             156:    7(fvec2) CompositeExtract 152 1
+             157:     48(ptr) AccessChain 153 32
+                              Store 157 156
+             158:    11(bool) CompositeExtract 150 1
+             159:      8(int) Select 158 53 35
+             160:     55(ptr) AccessChain 151 32
+                              Store 160 159
                               Return
                               FunctionEnd
diff --git a/Test/baseResults/spv.multiStructFuncall.frag.out b/Test/baseResults/spv.multiStructFuncall.frag.out
old mode 100755
new mode 100644
index b9b0cb2..14c851c
--- a/Test/baseResults/spv.multiStructFuncall.frag.out
+++ b/Test/baseResults/spv.multiStructFuncall.frag.out
@@ -1,9 +1,7 @@
 spv.multiStructFuncall.frag
-Warning, version 450 is not yet complete; most version-specific features are present, but some are missing.
-
 // Module Version 10000
-// Generated by (magic number): 80001
-// Id's are bound by 63
+// Generated by (magic number): 80007
+// Id's are bound by 66
 
                               Capability Shader
                1:             ExtInstImport  "GLSL.std.450"
@@ -25,20 +23,21 @@
                               Name 23  "blockName"
                               MemberName 23(blockName) 0  "s1"
                               Name 25  ""
-                              Name 33  "s2"
-                              Name 36  "S"
-                              MemberName 36(S) 0  "m"
-                              Name 38  "param"
-                              Name 45  "param"
+                              Name 31  "S"
+                              MemberName 31(S) 0  "m"
+                              Name 32  "arg"
+                              Name 39  "s2"
+                              Name 42  "param"
                               Name 48  "param"
-                              Name 59  "param"
+                              Name 51  "param"
+                              Name 62  "param"
                               MemberDecorate 22(S) 0 ColMajor
                               MemberDecorate 22(S) 0 Offset 0
                               MemberDecorate 22(S) 0 MatrixStride 16
                               MemberDecorate 23(blockName) 0 Offset 0
                               Decorate 23(blockName) BufferBlock
                               Decorate 25 DescriptorSet 0
-                              MemberDecorate 36(S) 0 ColMajor
+                              MemberDecorate 31(S) 0 ColMajor
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -55,48 +54,52 @@
               26:             TypeInt 32 1
               27:     26(int) Constant 0
               28:             TypePointer Uniform 22(S)
-              32:             TypePointer Private 9(S)
-          33(s2):     32(ptr) Variable Private
-           36(S):             TypeStruct 8
-              37:             TypePointer Function 36(S)
-              42:             TypePointer Function 8
-              57:             TypePointer Uniform 8
+           31(S):             TypeStruct 8
+              34:             TypePointer Function 8
+              38:             TypePointer Private 9(S)
+          39(s2):     38(ptr) Variable Private
+              60:             TypePointer Uniform 8
          4(main):           2 Function None 3
                5:             Label
-       38(param):     37(ptr) Variable Function
-       45(param):     14(ptr) Variable Function
-       48(param):     37(ptr) Variable Function
-       59(param):     14(ptr) Variable Function
+         32(arg):     14(ptr) Variable Function
+       42(param):     14(ptr) Variable Function
+       48(param):     14(ptr) Variable Function
+       51(param):     14(ptr) Variable Function
+       62(param):     14(ptr) Variable Function
               29:     28(ptr) AccessChain 25 27
               30:       22(S) Load 29
-              31:           2 FunctionCall 12(fooConst(struct-S-mf441;) 30
-              34:        9(S) Load 33(s2)
-              35:           2 FunctionCall 12(fooConst(struct-S-mf441;) 34
-              39:     28(ptr) AccessChain 25 27
-              40:       22(S) Load 39
-              41:           8 CompositeExtract 40 0
-              43:     42(ptr) AccessChain 38(param) 27
-                              Store 43 41
-              44:           2 FunctionCall 17(foo(struct-S-mf441;) 38(param)
-              46:        9(S) Load 33(s2)
-                              Store 45(param) 46
-              47:           2 FunctionCall 17(foo(struct-S-mf441;) 45(param)
-              49:     28(ptr) AccessChain 25 27
-              50:       22(S) Load 49
-              51:           8 CompositeExtract 50 0
-              52:     42(ptr) AccessChain 48(param) 27
-                              Store 52 51
-              53:           2 FunctionCall 20(fooOut(struct-S-mf441;) 48(param)
-              54:       36(S) Load 48(param)
-              55:     28(ptr) AccessChain 25 27
-              56:           8 CompositeExtract 54 0
-              58:     57(ptr) AccessChain 55 27
-                              Store 58 56
-              60:        9(S) Load 33(s2)
-                              Store 59(param) 60
-              61:           2 FunctionCall 20(fooOut(struct-S-mf441;) 59(param)
-              62:        9(S) Load 59(param)
-                              Store 33(s2) 62
+              33:           8 CompositeExtract 30 0
+              35:     34(ptr) AccessChain 32(arg) 27
+                              Store 35 33
+              36:        9(S) Load 32(arg)
+              37:           2 FunctionCall 12(fooConst(struct-S-mf441;) 36
+              40:        9(S) Load 39(s2)
+              41:           2 FunctionCall 12(fooConst(struct-S-mf441;) 40
+              43:     28(ptr) AccessChain 25 27
+              44:       22(S) Load 43
+              45:           8 CompositeExtract 44 0
+              46:     34(ptr) AccessChain 42(param) 27
+                              Store 46 45
+              47:           2 FunctionCall 17(foo(struct-S-mf441;) 42(param)
+              49:        9(S) Load 39(s2)
+                              Store 48(param) 49
+              50:           2 FunctionCall 17(foo(struct-S-mf441;) 48(param)
+              52:     28(ptr) AccessChain 25 27
+              53:       22(S) Load 52
+              54:           8 CompositeExtract 53 0
+              55:     34(ptr) AccessChain 51(param) 27
+                              Store 55 54
+              56:           2 FunctionCall 20(fooOut(struct-S-mf441;) 51(param)
+              57:        9(S) Load 51(param)
+              58:     28(ptr) AccessChain 25 27
+              59:           8 CompositeExtract 57 0
+              61:     60(ptr) AccessChain 58 27
+                              Store 61 59
+              63:        9(S) Load 39(s2)
+                              Store 62(param) 63
+              64:           2 FunctionCall 20(fooOut(struct-S-mf441;) 62(param)
+              65:        9(S) Load 62(param)
+                              Store 39(s2) 65
                               Return
                               FunctionEnd
 12(fooConst(struct-S-mf441;):           2 Function None 10
diff --git a/Test/baseResults/spv.multiView.frag.out b/Test/baseResults/spv.multiView.frag.out
old mode 100755
new mode 100644
index de2a549..9dbd36b
--- a/Test/baseResults/spv.multiView.frag.out
+++ b/Test/baseResults/spv.multiView.frag.out
@@ -1,13 +1,10 @@
 spv.multiView.frag
-Warning, version 450 is not yet complete; most version-specific features are present, but some are missing.
-
-// Module Version 10000
-// Generated by (magic number): 80001
+// Module Version 10300
+// Generated by (magic number): 80007
 // Id's are bound by 17
 
                               Capability Shader
                               Capability MultiView
-                              Extension  "SPV_KHR_multiview"
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
                               EntryPoint Fragment 4  "main" 9 12
diff --git a/Test/baseResults/spv.multiviewPerViewAttributes.tesc.out b/Test/baseResults/spv.multiviewPerViewAttributes.tesc.out
index f93aa01..7874b94 100644
--- a/Test/baseResults/spv.multiviewPerViewAttributes.tesc.out
+++ b/Test/baseResults/spv.multiviewPerViewAttributes.tesc.out
@@ -1,8 +1,10 @@
 spv.multiviewPerViewAttributes.tesc
-Warning, version 450 is not yet complete; most version-specific features are present, but some are missing.
+error: SPIRV-Tools Validation Errors
+error: OpMemberName Member <id> '5' index is larger than Type <id> '27[gl_PositionPerViewNV]'s member count.
+  OpMemberName %gl_PerVertex_0 5 "gl_PositionPerViewNV"
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 37
 
                               Capability Tessellation
diff --git a/Test/baseResults/spv.multiviewPerViewAttributes.vert.out b/Test/baseResults/spv.multiviewPerViewAttributes.vert.out
index 350944a..c8377cf 100644
--- a/Test/baseResults/spv.multiviewPerViewAttributes.vert.out
+++ b/Test/baseResults/spv.multiviewPerViewAttributes.vert.out
@@ -1,8 +1,6 @@
 spv.multiviewPerViewAttributes.vert
-Warning, version 450 is not yet complete; most version-specific features are present, but some are missing.
-
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 29
 
                               Capability Shader
diff --git a/Test/baseResults/spv.newTexture.frag.out b/Test/baseResults/spv.newTexture.frag.out
old mode 100755
new mode 100644
index ea694ee..5e462be
--- a/Test/baseResults/spv.newTexture.frag.out
+++ b/Test/baseResults/spv.newTexture.frag.out
@@ -1,8 +1,10 @@
 spv.newTexture.frag
-Warning, version 430 is not yet complete; most version-specific features are present, but some are missing.
+error: SPIRV-Tools Validation Errors
+error: Capability SampledRect is not allowed by Vulkan 1.0 specification (or requires extension)
+  OpCapability SampledRect
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 284
 
                               Capability Shader
diff --git a/Test/baseResults/spv.noBuiltInLoc.vert.out b/Test/baseResults/spv.noBuiltInLoc.vert.out
new file mode 100644
index 0000000..066f81f
--- /dev/null
+++ b/Test/baseResults/spv.noBuiltInLoc.vert.out
@@ -0,0 +1,81 @@
+spv.noBuiltInLoc.vert
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 35
+
+                              Capability Shader
+                              Capability AtomicStorage
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Vertex 4  "main" 9 11 18 33 34
+                              Source GLSL 450
+                              Name 4  "main"
+                              Name 9  "bar"
+                              Name 11  "foo"
+                              Name 16  "gl_PerVertex"
+                              MemberName 16(gl_PerVertex) 0  "gl_Position"
+                              MemberName 16(gl_PerVertex) 1  "gl_PointSize"
+                              MemberName 16(gl_PerVertex) 2  "gl_ClipDistance"
+                              MemberName 16(gl_PerVertex) 3  "gl_CullDistance"
+                              Name 18  ""
+                              Name 24  "uv1"
+                              Name 26  "uv2"
+                              Name 29  "uv3"
+                              Name 31  "a_uint"
+                              Name 33  "gl_VertexID"
+                              Name 34  "gl_InstanceID"
+                              Decorate 9(bar) Location 0
+                              Decorate 11(foo) Location 0
+                              MemberDecorate 16(gl_PerVertex) 0 BuiltIn Position
+                              MemberDecorate 16(gl_PerVertex) 1 BuiltIn PointSize
+                              MemberDecorate 16(gl_PerVertex) 2 BuiltIn ClipDistance
+                              MemberDecorate 16(gl_PerVertex) 3 BuiltIn CullDistance
+                              Decorate 16(gl_PerVertex) Block
+                              Decorate 24(uv1) Location 0
+                              Decorate 24(uv1) DescriptorSet 0
+                              Decorate 26(uv2) Location 1
+                              Decorate 26(uv2) DescriptorSet 0
+                              Decorate 29(uv3) Location 2
+                              Decorate 29(uv3) DescriptorSet 0
+                              Decorate 31(a_uint) Offset 0
+                              Decorate 31(a_uint) DescriptorSet 0
+                              Decorate 31(a_uint) Binding 0
+                              Decorate 33(gl_VertexID) BuiltIn VertexId
+                              Decorate 34(gl_InstanceID) BuiltIn InstanceId
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+               8:             TypePointer Output 7(fvec4)
+          9(bar):      8(ptr) Variable Output
+              10:             TypePointer Input 7(fvec4)
+         11(foo):     10(ptr) Variable Input
+              13:             TypeInt 32 0
+              14:     13(int) Constant 1
+              15:             TypeArray 6(float) 14
+16(gl_PerVertex):             TypeStruct 7(fvec4) 6(float) 15 15
+              17:             TypePointer Output 16(gl_PerVertex)
+              18:     17(ptr) Variable Output
+              19:             TypeInt 32 1
+              20:     19(int) Constant 0
+              23:             TypePointer UniformConstant 7(fvec4)
+         24(uv1):     23(ptr) Variable UniformConstant
+              25:             TypePointer UniformConstant 6(float)
+         26(uv2):     25(ptr) Variable UniformConstant
+              27:             TypeVector 6(float) 3
+              28:             TypePointer UniformConstant 27(fvec3)
+         29(uv3):     28(ptr) Variable UniformConstant
+              30:             TypePointer AtomicCounter 13(int)
+      31(a_uint):     30(ptr) Variable AtomicCounter
+              32:             TypePointer Input 19(int)
+ 33(gl_VertexID):     32(ptr) Variable Input
+34(gl_InstanceID):     32(ptr) Variable Input
+         4(main):           2 Function None 3
+               5:             Label
+              12:    7(fvec4) Load 11(foo)
+                              Store 9(bar) 12
+              21:    7(fvec4) Load 11(foo)
+              22:      8(ptr) AccessChain 18 20
+                              Store 22 21
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.noDeadDecorations.vert.out b/Test/baseResults/spv.noDeadDecorations.vert.out
index 41d2a43..d7e3702 100644
--- a/Test/baseResults/spv.noDeadDecorations.vert.out
+++ b/Test/baseResults/spv.noDeadDecorations.vert.out
@@ -1,8 +1,6 @@
 spv.noDeadDecorations.vert
-Warning, version 310 is not yet complete; most version-specific features are present, but some are missing.
-
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 32
 
                               Capability Shader
diff --git a/Test/baseResults/spv.noLocation.vert.out b/Test/baseResults/spv.noLocation.vert.out
new file mode 100644
index 0000000..7a66474
--- /dev/null
+++ b/Test/baseResults/spv.noLocation.vert.out
@@ -0,0 +1,10 @@
+spv.noLocation.vert
+ERROR: spv.noLocation.vert:4: 'location' : SPIR-V requires location for user input/output 
+ERROR: spv.noLocation.vert:8: 'location' : SPIR-V requires location for user input/output 
+ERROR: spv.noLocation.vert:19: 'location' : SPIR-V requires location for user input/output 
+ERROR: spv.noLocation.vert:25: 'location' : SPIR-V requires location for user input/output 
+ERROR: spv.noLocation.vert:29: 'location' : SPIR-V requires location for user input/output 
+ERROR: 5 compilation errors.  No code generated.
+
+
+SPIR-V is not generated for failed compile or link
diff --git a/Test/baseResults/spv.noWorkgroup.comp.out b/Test/baseResults/spv.noWorkgroup.comp.out
old mode 100755
new mode 100644
index 0f88436..2624fdc
--- a/Test/baseResults/spv.noWorkgroup.comp.out
+++ b/Test/baseResults/spv.noWorkgroup.comp.out
@@ -1,8 +1,6 @@
 spv.noWorkgroup.comp
-Warning, version 450 is not yet complete; most version-specific features are present, but some are missing.
-
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 12
 
                               Capability Shader
diff --git a/Test/baseResults/spv.nonSquare.vert.out b/Test/baseResults/spv.nonSquare.vert.out
old mode 100755
new mode 100644
index 684d4f1..679a5f0
--- a/Test/baseResults/spv.nonSquare.vert.out
+++ b/Test/baseResults/spv.nonSquare.vert.out
@@ -1,6 +1,6 @@
 spv.nonSquare.vert
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 90
 
                               Capability Shader
diff --git a/Test/baseResults/spv.nonuniform.frag.out b/Test/baseResults/spv.nonuniform.frag.out
new file mode 100644
index 0000000..972276a
--- /dev/null
+++ b/Test/baseResults/spv.nonuniform.frag.out
@@ -0,0 +1,359 @@
+spv.nonuniform.frag
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 210
+
+                              Capability Shader
+                              Capability InputAttachment
+                              Capability SampledBuffer
+                              Capability ImageBuffer
+                              Capability CapabilityShaderNonUniformEXT
+                              Capability CapabilityRuntimeDescriptorArrayEXT
+                              Capability CapabilityInputAttachmentArrayDynamicIndexingEXT
+                              Capability CapabilityUniformTexelBufferArrayDynamicIndexingEXT
+                              Capability CapabilityStorageTexelBufferArrayDynamicIndexingEXT
+                              Capability CapabilityUniformBufferArrayNonUniformIndexingEXT
+                              Capability CapabilitySampledImageArrayNonUniformIndexingEXT
+                              Capability CapabilityStorageBufferArrayNonUniformIndexingEXT
+                              Capability CapabilityStorageImageArrayNonUniformIndexingEXT
+                              Capability CapabilityInputAttachmentArrayNonUniformIndexingEXT
+                              Capability CapabilityUniformTexelBufferArrayNonUniformIndexingEXT
+                              Capability CapabilityStorageTexelBufferArrayNonUniformIndexingEXT
+                              Extension  "SPV_EXT_descriptor_indexing"
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 33 90
+                              ExecutionMode 4 OriginUpperLeft
+                              Source GLSL 450
+                              SourceExtension  "GL_EXT_nonuniform_qualifier"
+                              Name 4  "main"
+                              Name 11  "foo(i1;i1;"
+                              Name 9  "nupi"
+                              Name 10  "f"
+                              Name 16  "a"
+                              Name 17  "nu_li"
+                              Name 18  "param"
+                              Name 20  "param"
+                              Name 30  "b"
+                              Name 33  "nu_inv4"
+                              Name 39  "nu_gf"
+                              Name 45  "inputAttachmentDyn"
+                              Name 46  "dyn_i"
+                              Name 62  "uniformTexelBufferDyn"
+                              Name 76  "storageTexelBufferDyn"
+                              Name 85  "uname"
+                              MemberName 85(uname) 0  "a"
+                              Name 88  "uniformBuffer"
+                              Name 90  "nu_ii"
+                              Name 97  "bname"
+                              MemberName 97(bname) 0  "b"
+                              Name 100  "storageBuffer"
+                              Name 110  "sampledImage"
+                              Name 125  "storageImage"
+                              Name 137  "inputAttachment"
+                              Name 147  "uniformTexelBuffer"
+                              Name 158  "storageTexelBuffer"
+                              Name 168  "v"
+                              Name 183  "uv"
+                              Name 193  "m"
+                              Name 201  "S"
+                              MemberName 201(S) 0  "a"
+                              Name 203  "s"
+                              Decorate 13 DecorationNonUniformEXT
+                              Decorate 17(nu_li) DecorationNonUniformEXT
+                              Decorate 19 DecorationNonUniformEXT
+                              Decorate 23 DecorationNonUniformEXT
+                              Decorate 26 DecorationNonUniformEXT
+                              Decorate 27 DecorationNonUniformEXT
+                              Decorate 33(nu_inv4) Location 0
+                              Decorate 33(nu_inv4) DecorationNonUniformEXT
+                              Decorate 38 DecorationNonUniformEXT
+                              Decorate 39(nu_gf) DecorationNonUniformEXT
+                              Decorate 40 DecorationNonUniformEXT
+                              Decorate 41 DecorationNonUniformEXT
+                              Decorate 45(inputAttachmentDyn) DescriptorSet 0
+                              Decorate 45(inputAttachmentDyn) Binding 0
+                              Decorate 45(inputAttachmentDyn) InputAttachmentIndex 0
+                              Decorate 62(uniformTexelBufferDyn) DescriptorSet 0
+                              Decorate 62(uniformTexelBufferDyn) Binding 1
+                              Decorate 76(storageTexelBufferDyn) DescriptorSet 0
+                              Decorate 76(storageTexelBufferDyn) Binding 2
+                              MemberDecorate 85(uname) 0 Offset 0
+                              Decorate 85(uname) Block
+                              Decorate 88(uniformBuffer) DescriptorSet 0
+                              Decorate 88(uniformBuffer) Binding 3
+                              Decorate 90(nu_ii) Flat
+                              Decorate 90(nu_ii) Location 1
+                              Decorate 90(nu_ii) DecorationNonUniformEXT
+                              Decorate 91 DecorationNonUniformEXT
+                              Decorate 94 DecorationNonUniformEXT
+                              MemberDecorate 97(bname) 0 Offset 0
+                              Decorate 97(bname) BufferBlock
+                              Decorate 100(storageBuffer) DescriptorSet 0
+                              Decorate 100(storageBuffer) Binding 4
+                              Decorate 101 DecorationNonUniformEXT
+                              Decorate 103 DecorationNonUniformEXT
+                              Decorate 110(sampledImage) DescriptorSet 0
+                              Decorate 110(sampledImage) Binding 5
+                              Decorate 111 DecorationNonUniformEXT
+                              Decorate 114 DecorationNonUniformEXT
+                              Decorate 125(storageImage) DescriptorSet 0
+                              Decorate 125(storageImage) Binding 6
+                              Decorate 126 DecorationNonUniformEXT
+                              Decorate 129 DecorationNonUniformEXT
+                              Decorate 137(inputAttachment) DescriptorSet 0
+                              Decorate 137(inputAttachment) Binding 7
+                              Decorate 137(inputAttachment) InputAttachmentIndex 1
+                              Decorate 138 DecorationNonUniformEXT
+                              Decorate 140 DecorationNonUniformEXT
+                              Decorate 147(uniformTexelBuffer) DescriptorSet 0
+                              Decorate 147(uniformTexelBuffer) Binding 8
+                              Decorate 148 DecorationNonUniformEXT
+                              Decorate 150 DecorationNonUniformEXT
+                              Decorate 158(storageTexelBuffer) DescriptorSet 0
+                              Decorate 158(storageTexelBuffer) Binding 9
+                              Decorate 159 DecorationNonUniformEXT
+                              Decorate 161 DecorationNonUniformEXT
+                              Decorate 168(v) DecorationNonUniformEXT
+                              Decorate 171 DecorationNonUniformEXT
+                              Decorate 173 DecorationNonUniformEXT
+                              Decorate 178 DecorationNonUniformEXT
+                              Decorate 180 DecorationNonUniformEXT
+                              Decorate 184 DecorationNonUniformEXT
+                              Decorate 186 DecorationNonUniformEXT
+                              Decorate 188 DecorationNonUniformEXT
+                              Decorate 193(m) DecorationNonUniformEXT
+                              Decorate 195 DecorationNonUniformEXT
+                              Decorate 203(s) DecorationNonUniformEXT
+                              Decorate 205 DecorationNonUniformEXT
+                              Decorate 207 DecorationNonUniformEXT
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeInt 32 1
+               7:             TypePointer Function 6(int)
+               8:             TypeFunction 6(int) 7(ptr) 7(ptr)
+              25:      6(int) Constant 2
+              28:             TypeFloat 32
+              29:             TypePointer Function 28(float)
+              31:             TypeVector 28(float) 4
+              32:             TypePointer Input 31(fvec4)
+     33(nu_inv4):     32(ptr) Variable Input
+              34:             TypeInt 32 0
+              35:     34(int) Constant 0
+              36:             TypePointer Input 28(float)
+              42:             TypeImage 28(float) SubpassData nonsampled format:Unknown
+              43:             TypeRuntimeArray 42
+              44:             TypePointer UniformConstant 43
+45(inputAttachmentDyn):     44(ptr) Variable UniformConstant
+              48:             TypePointer UniformConstant 42
+              51:      6(int) Constant 0
+              52:             TypeVector 6(int) 2
+              53:   52(ivec2) ConstantComposite 51 51
+              58:             TypeImage 28(float) Buffer sampled format:Unknown
+              59:             TypeSampledImage 58
+              60:             TypeRuntimeArray 59
+              61:             TypePointer UniformConstant 60
+62(uniformTexelBufferDyn):     61(ptr) Variable UniformConstant
+              64:             TypePointer UniformConstant 59
+              67:      6(int) Constant 1
+              73:             TypeImage 28(float) Buffer nonsampled format:R32f
+              74:             TypeRuntimeArray 73
+              75:             TypePointer UniformConstant 74
+76(storageTexelBufferDyn):     75(ptr) Variable UniformConstant
+              78:             TypePointer UniformConstant 73
+       85(uname):             TypeStruct 28(float)
+              86:             TypeRuntimeArray 85(uname)
+              87:             TypePointer Uniform 86
+88(uniformBuffer):     87(ptr) Variable Uniform
+              89:             TypePointer Input 6(int)
+       90(nu_ii):     89(ptr) Variable Input
+              92:             TypePointer Uniform 28(float)
+       97(bname):             TypeStruct 28(float)
+              98:             TypeRuntimeArray 97(bname)
+              99:             TypePointer Uniform 98
+100(storageBuffer):     99(ptr) Variable Uniform
+             106:             TypeImage 28(float) 2D sampled format:Unknown
+             107:             TypeSampledImage 106
+             108:             TypeRuntimeArray 107
+             109:             TypePointer UniformConstant 108
+110(sampledImage):    109(ptr) Variable UniformConstant
+             112:             TypePointer UniformConstant 107
+             115:             TypeVector 28(float) 2
+             116:   28(float) Constant 1056964608
+             117:  115(fvec2) ConstantComposite 116 116
+             122:             TypeImage 28(float) 2D nonsampled format:R32f
+             123:             TypeRuntimeArray 122
+             124:             TypePointer UniformConstant 123
+125(storageImage):    124(ptr) Variable UniformConstant
+             127:             TypePointer UniformConstant 122
+             130:   52(ivec2) ConstantComposite 67 67
+             135:             TypeRuntimeArray 42
+             136:             TypePointer UniformConstant 135
+137(inputAttachment):    136(ptr) Variable UniformConstant
+             145:             TypeRuntimeArray 59
+             146:             TypePointer UniformConstant 145
+147(uniformTexelBuffer):    146(ptr) Variable UniformConstant
+             156:             TypeRuntimeArray 73
+             157:             TypePointer UniformConstant 156
+158(storageTexelBuffer):    157(ptr) Variable UniformConstant
+             166:             TypeVector 6(int) 4
+             167:             TypePointer Function 166(ivec4)
+             169:     34(int) Constant 1
+             176:     34(int) Constant 2
+             191:             TypeMatrix 31(fvec4) 4
+             192:             TypePointer Function 191
+          201(S):             TypeStruct 6(int)
+             202:             TypePointer Function 201(S)
+         4(main):           2 Function None 3
+               5:             Label
+           16(a):      7(ptr) Variable Function
+       17(nu_li):      7(ptr) Variable Function
+       18(param):      7(ptr) Variable Function
+       20(param):      7(ptr) Variable Function
+           30(b):     29(ptr) Variable Function
+       39(nu_gf):     29(ptr) Variable Function
+       46(dyn_i):      7(ptr) Variable Function
+          168(v):    167(ptr) Variable Function
+         183(uv):    167(ptr) Variable Function
+          193(m):    192(ptr) Variable Function
+          203(s):    202(ptr) Variable Function
+              19:      6(int) Load 17(nu_li)
+                              Store 18(param) 19
+              21:      6(int) FunctionCall 11(foo(i1;i1;) 18(param) 20(param)
+              22:      6(int) Load 20(param)
+                              Store 17(nu_li) 22
+                              Store 16(a) 21
+              23:      6(int) Load 16(a)
+              24:      6(int) Load 16(a)
+              26:      6(int) IMul 24 25
+              27:      6(int) IAdd 23 26
+                              Store 17(nu_li) 27
+              37:     36(ptr) AccessChain 33(nu_inv4) 35
+              38:   28(float) Load 37
+              40:   28(float) Load 39(nu_gf)
+              41:   28(float) FMul 38 40
+                              Store 30(b) 41
+              47:      6(int) Load 46(dyn_i)
+              49:     48(ptr) AccessChain 45(inputAttachmentDyn) 47
+              50:          42 Load 49
+              54:   31(fvec4) ImageRead 50 53
+              55:   28(float) CompositeExtract 54 0
+              56:   28(float) Load 30(b)
+              57:   28(float) FAdd 56 55
+                              Store 30(b) 57
+              63:      6(int) Load 46(dyn_i)
+              65:     64(ptr) AccessChain 62(uniformTexelBufferDyn) 63
+              66:          59 Load 65
+              68:          58 Image 66
+              69:   31(fvec4) ImageFetch 68 67
+              70:   28(float) CompositeExtract 69 0
+              71:   28(float) Load 30(b)
+              72:   28(float) FAdd 71 70
+                              Store 30(b) 72
+              77:      6(int) Load 46(dyn_i)
+              79:     78(ptr) AccessChain 76(storageTexelBufferDyn) 77
+              80:          73 Load 79
+              81:   31(fvec4) ImageRead 80 67
+              82:   28(float) CompositeExtract 81 0
+              83:   28(float) Load 30(b)
+              84:   28(float) FAdd 83 82
+                              Store 30(b) 84
+              91:      6(int) Load 90(nu_ii)
+              93:     92(ptr) AccessChain 88(uniformBuffer) 91 51
+              94:   28(float) Load 93
+              95:   28(float) Load 30(b)
+              96:   28(float) FAdd 95 94
+                              Store 30(b) 96
+             101:      6(int) Load 90(nu_ii)
+             102:     92(ptr) AccessChain 100(storageBuffer) 101 51
+             103:   28(float) Load 102
+             104:   28(float) Load 30(b)
+             105:   28(float) FAdd 104 103
+                              Store 30(b) 105
+             111:      6(int) Load 90(nu_ii)
+             113:    112(ptr) AccessChain 110(sampledImage) 111
+             114:         107 Load 113
+             118:   31(fvec4) ImageSampleImplicitLod 114 117
+             119:   28(float) CompositeExtract 118 0
+             120:   28(float) Load 30(b)
+             121:   28(float) FAdd 120 119
+                              Store 30(b) 121
+             126:      6(int) Load 90(nu_ii)
+             128:    127(ptr) AccessChain 125(storageImage) 126
+             129:         122 Load 128
+             131:   31(fvec4) ImageRead 129 130
+             132:   28(float) CompositeExtract 131 0
+             133:   28(float) Load 30(b)
+             134:   28(float) FAdd 133 132
+                              Store 30(b) 134
+             138:      6(int) Load 90(nu_ii)
+             139:     48(ptr) AccessChain 137(inputAttachment) 138
+             140:          42 Load 139
+             141:   31(fvec4) ImageRead 140 53
+             142:   28(float) CompositeExtract 141 0
+             143:   28(float) Load 30(b)
+             144:   28(float) FAdd 143 142
+                              Store 30(b) 144
+             148:      6(int) Load 90(nu_ii)
+             149:     64(ptr) AccessChain 147(uniformTexelBuffer) 148
+             150:          59 Load 149
+             151:          58 Image 150
+             152:   31(fvec4) ImageFetch 151 67
+             153:   28(float) CompositeExtract 152 0
+             154:   28(float) Load 30(b)
+             155:   28(float) FAdd 154 153
+                              Store 30(b) 155
+             159:      6(int) Load 90(nu_ii)
+             160:     78(ptr) AccessChain 158(storageTexelBuffer) 159
+             161:          73 Load 160
+             162:   31(fvec4) ImageRead 161 67
+             163:   28(float) CompositeExtract 162 0
+             164:   28(float) Load 30(b)
+             165:   28(float) FAdd 164 163
+                              Store 30(b) 165
+             170:      7(ptr) AccessChain 168(v) 169
+             171:      6(int) Load 170
+             172:     92(ptr) AccessChain 88(uniformBuffer) 171 51
+             173:   28(float) Load 172
+             174:   28(float) Load 30(b)
+             175:   28(float) FAdd 174 173
+                              Store 30(b) 175
+             177:      7(ptr) AccessChain 168(v) 176
+             178:      6(int) Load 177
+             179:     92(ptr) AccessChain 88(uniformBuffer) 178 51
+             180:   28(float) Load 179
+             181:   28(float) Load 30(b)
+             182:   28(float) FAdd 181 180
+                              Store 30(b) 182
+             184:      6(int) Load 90(nu_ii)
+             185:      7(ptr) AccessChain 183(uv) 184
+             186:      6(int) Load 185
+             187:     92(ptr) AccessChain 88(uniformBuffer) 186 51
+             188:   28(float) Load 187
+             189:   28(float) Load 30(b)
+             190:   28(float) FAdd 189 188
+                              Store 30(b) 190
+             194:     29(ptr) AccessChain 193(m) 25 176
+             195:   28(float) Load 194
+             196:      6(int) ConvertFToS 195
+             197:     92(ptr) AccessChain 88(uniformBuffer) 196 51
+             198:   28(float) Load 197
+             199:   28(float) Load 30(b)
+             200:   28(float) FAdd 199 198
+                              Store 30(b) 200
+             204:      7(ptr) AccessChain 203(s) 51
+             205:      6(int) Load 204
+             206:     92(ptr) AccessChain 88(uniformBuffer) 205 51
+             207:   28(float) Load 206
+             208:   28(float) Load 30(b)
+             209:   28(float) FAdd 208 207
+                              Store 30(b) 209
+                              Return
+                              FunctionEnd
+  11(foo(i1;i1;):      6(int) Function None 8
+         9(nupi):      7(ptr) FunctionParameter
+           10(f):      7(ptr) FunctionParameter
+              12:             Label
+              13:      6(int) Load 9(nupi)
+                              ReturnValue 13
+                              FunctionEnd
diff --git a/Test/baseResults/spv.offsets.frag.out b/Test/baseResults/spv.offsets.frag.out
old mode 100755
new mode 100644
index ea4be8f..17d7b86
--- a/Test/baseResults/spv.offsets.frag.out
+++ b/Test/baseResults/spv.offsets.frag.out
@@ -1,8 +1,6 @@
 spv.offsets.frag
-Warning, version 450 is not yet complete; most version-specific features are present, but some are missing.
-
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 15
 
                               Capability Shader
diff --git a/Test/baseResults/spv.paramMemory.frag.out b/Test/baseResults/spv.paramMemory.frag.out
new file mode 100644
index 0000000..a7e627a
--- /dev/null
+++ b/Test/baseResults/spv.paramMemory.frag.out
@@ -0,0 +1,141 @@
+spv.paramMemory.frag
+error: SPIRV-Tools Validation Errors
+error: OpFunctionCall Argument <id> '38[image1]'s type does not match Function <id> '8's parameter type.
+  %41 = OpFunctionCall %v4float %image_load_I21_vi2_ %image1 %param
+
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 69
+
+                              Capability Shader
+                              Capability StorageImageReadWithoutFormat
+                              Capability StorageImageWriteWithoutFormat
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 27 66
+                              ExecutionMode 4 OriginUpperLeft
+                              Source ESSL 310
+                              Name 4  "main"
+                              Name 16  "image_load(I21;vi2;"
+                              Name 14  "image"
+                              Name 15  "coords"
+                              Name 23  "image_store(I21;vi2;vf4;"
+                              Name 20  "image"
+                              Name 21  "coords"
+                              Name 22  "data"
+                              Name 27  "in_coords"
+                              Name 35  "read1"
+                              Name 38  "image1"
+                              Name 39  "param"
+                              Name 42  "read2"
+                              Name 45  "image2"
+                              Name 46  "param"
+                              Name 49  "image3"
+                              Name 53  "param"
+                              Name 55  "param"
+                              Name 57  "image4"
+                              Name 61  "param"
+                              Name 63  "param"
+                              Name 66  "out_color"
+                              Decorate 14(image) Coherent
+                              Decorate 14(image) NonWritable
+                              Decorate 20(image) Coherent
+                              Decorate 20(image) NonReadable
+                              Decorate 27(in_coords) Flat
+                              Decorate 27(in_coords) Location 0
+                              Decorate 38(image1) DescriptorSet 0
+                              Decorate 38(image1) Binding 0
+                              Decorate 38(image1) Coherent
+                              Decorate 38(image1) NonWritable
+                              Decorate 45(image2) DescriptorSet 0
+                              Decorate 45(image2) Binding 2
+                              Decorate 45(image2) NonWritable
+                              Decorate 49(image3) DescriptorSet 0
+                              Decorate 49(image3) Binding 1
+                              Decorate 49(image3) Coherent
+                              Decorate 49(image3) NonReadable
+                              Decorate 57(image4) DescriptorSet 0
+                              Decorate 57(image4) Binding 3
+                              Decorate 57(image4) NonReadable
+                              Decorate 66(out_color) Location 0
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeImage 6(float) 2D nonsampled format:Unknown
+               8:             TypePointer UniformConstant 7
+               9:             TypeInt 32 1
+              10:             TypeVector 9(int) 2
+              11:             TypePointer Function 10(ivec2)
+              12:             TypeVector 6(float) 4
+              13:             TypeFunction 12(fvec4) 8(ptr) 11(ptr)
+              18:             TypePointer Function 12(fvec4)
+              19:             TypeFunction 2 8(ptr) 11(ptr) 18(ptr)
+              26:             TypePointer Input 10(ivec2)
+   27(in_coords):     26(ptr) Variable Input
+              36:             TypeImage 6(float) 2D nonsampled format:Rgba32f
+              37:             TypePointer UniformConstant 36
+      38(image1):     37(ptr) Variable UniformConstant
+              43:             TypeImage 6(float) 2D nonsampled format:Rgba16f
+              44:             TypePointer UniformConstant 43
+      45(image2):     44(ptr) Variable UniformConstant
+      49(image3):     37(ptr) Variable UniformConstant
+              51:    6(float) Constant 1056964608
+      57(image4):     44(ptr) Variable UniformConstant
+              59:    6(float) Constant 1073741824
+              65:             TypePointer Output 12(fvec4)
+   66(out_color):     65(ptr) Variable Output
+              67:    6(float) Constant 0
+              68:   12(fvec4) ConstantComposite 67 67 67 67
+         4(main):           2 Function None 3
+               5:             Label
+       35(read1):     18(ptr) Variable Function
+       39(param):     11(ptr) Variable Function
+       42(read2):     18(ptr) Variable Function
+       46(param):     11(ptr) Variable Function
+       53(param):     11(ptr) Variable Function
+       55(param):     18(ptr) Variable Function
+       61(param):     11(ptr) Variable Function
+       63(param):     18(ptr) Variable Function
+              40:   10(ivec2) Load 27(in_coords)
+                              Store 39(param) 40
+              41:   12(fvec4) FunctionCall 16(image_load(I21;vi2;) 38(image1) 39(param)
+                              Store 35(read1) 41
+              47:   10(ivec2) Load 27(in_coords)
+                              Store 46(param) 47
+              48:   12(fvec4) FunctionCall 16(image_load(I21;vi2;) 45(image2) 46(param)
+                              Store 42(read2) 48
+              50:   12(fvec4) Load 35(read1)
+              52:   12(fvec4) VectorTimesScalar 50 51
+              54:   10(ivec2) Load 27(in_coords)
+                              Store 53(param) 54
+                              Store 55(param) 52
+              56:           2 FunctionCall 23(image_store(I21;vi2;vf4;) 49(image3) 53(param) 55(param)
+              58:   12(fvec4) Load 42(read2)
+              60:   12(fvec4) VectorTimesScalar 58 59
+              62:   10(ivec2) Load 27(in_coords)
+                              Store 61(param) 62
+                              Store 63(param) 60
+              64:           2 FunctionCall 23(image_store(I21;vi2;vf4;) 57(image4) 61(param) 63(param)
+                              Store 66(out_color) 68
+                              Return
+                              FunctionEnd
+16(image_load(I21;vi2;):   12(fvec4) Function None 13
+       14(image):      8(ptr) FunctionParameter
+      15(coords):     11(ptr) FunctionParameter
+              17:             Label
+              25:           7 Load 14(image)
+              28:   10(ivec2) Load 27(in_coords)
+              29:   12(fvec4) ImageRead 25 28
+                              ReturnValue 29
+                              FunctionEnd
+23(image_store(I21;vi2;vf4;):           2 Function None 19
+       20(image):      8(ptr) FunctionParameter
+      21(coords):     11(ptr) FunctionParameter
+        22(data):     18(ptr) FunctionParameter
+              24:             Label
+              32:           7 Load 20(image)
+              33:   10(ivec2) Load 27(in_coords)
+              34:   12(fvec4) Load 22(data)
+                              ImageWrite 32 33 34
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.perprimitiveNV.frag.out b/Test/baseResults/spv.perprimitiveNV.frag.out
new file mode 100644
index 0000000..eaff400
--- /dev/null
+++ b/Test/baseResults/spv.perprimitiveNV.frag.out
@@ -0,0 +1,54 @@
+spv.perprimitiveNV.frag
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 23
+
+                              Capability Shader
+                              Capability MeshShadingNV
+                              Extension  "SPV_NV_mesh_shader"
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 8 11 19
+                              ExecutionMode 4 OriginUpperLeft
+                              Source GLSL 460
+                              SourceExtension  "GL_NV_mesh_shader"
+                              Name 4  "main"
+                              Name 8  "g"
+                              Name 9  "B"
+                              MemberName 9(B) 0  "f"
+                              Name 11  ""
+                              Name 17  "C"
+                              MemberName 17(C) 0  "h"
+                              Name 19  ""
+                              Decorate 8(g) Location 8
+                              MemberDecorate 9(B) 0 PerPrimitiveNV
+                              Decorate 9(B) Block
+                              Decorate 11 Location 0
+                              MemberDecorate 17(C) 0 Flat
+                              MemberDecorate 17(C) 0 Centroid
+                              Decorate 17(C) Block
+                              Decorate 19 Location 4
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypePointer Output 6(float)
+            8(g):      7(ptr) Variable Output
+            9(B):             TypeStruct 6(float)
+              10:             TypePointer Input 9(B)
+              11:     10(ptr) Variable Input
+              12:             TypeInt 32 1
+              13:     12(int) Constant 0
+              14:             TypePointer Input 6(float)
+           17(C):             TypeStruct 6(float)
+              18:             TypePointer Input 17(C)
+              19:     18(ptr) Variable Input
+         4(main):           2 Function None 3
+               5:             Label
+              15:     14(ptr) AccessChain 11 13
+              16:    6(float) Load 15
+              20:     14(ptr) AccessChain 19 13
+              21:    6(float) Load 20
+              22:    6(float) FAdd 16 21
+                              Store 8(g) 22
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.precise.tesc.out b/Test/baseResults/spv.precise.tesc.out
index 4bae395..95a048f 100644
--- a/Test/baseResults/spv.precise.tesc.out
+++ b/Test/baseResults/spv.precise.tesc.out
@@ -1,8 +1,6 @@
 spv.precise.tesc
-Warning, version 310 is not yet complete; most version-specific features are present, but some are missing.
-
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 72
 
                               Capability Tessellation
diff --git a/Test/baseResults/spv.precise.tese.out b/Test/baseResults/spv.precise.tese.out
index 4f1839c..a73cbd8 100644
--- a/Test/baseResults/spv.precise.tese.out
+++ b/Test/baseResults/spv.precise.tese.out
@@ -1,8 +1,6 @@
 spv.precise.tese
-Warning, version 310 is not yet complete; most version-specific features are present, but some are missing.
-
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 119
 
                               Capability Tessellation
diff --git a/Test/baseResults/spv.precision.frag.out b/Test/baseResults/spv.precision.frag.out
old mode 100755
new mode 100644
index f49b356..5ddb492
--- a/Test/baseResults/spv.precision.frag.out
+++ b/Test/baseResults/spv.precision.frag.out
@@ -1,8 +1,6 @@
 spv.precision.frag
-Warning, version 310 is not yet complete; most version-specific features are present, but some are missing.
-
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 127
 
                               Capability Shader
diff --git a/Test/baseResults/spv.precisionNonESSamp.frag.out b/Test/baseResults/spv.precisionNonESSamp.frag.out
new file mode 100644
index 0000000..9222001
--- /dev/null
+++ b/Test/baseResults/spv.precisionNonESSamp.frag.out
@@ -0,0 +1,98 @@
+spv.precisionNonESSamp.frag
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 47
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 9 17 27 39
+                              ExecutionMode 4 OriginUpperLeft
+                              Source GLSL 450
+                              Name 4  "main"
+                              Name 9  "color"
+                              Name 13  "s"
+                              Name 17  "v2"
+                              Name 23  "t"
+                              Name 27  "v3"
+                              Name 31  "vi1"
+                              Name 34  "i1"
+                              Name 39  "iv2"
+                              Name 42  "vi2"
+                              Name 43  "i2"
+                              Decorate 9(color) RelaxedPrecision
+                              Decorate 9(color) Location 0
+                              Decorate 13(s) RelaxedPrecision
+                              Decorate 13(s) DescriptorSet 0
+                              Decorate 14 RelaxedPrecision
+                              Decorate 17(v2) RelaxedPrecision
+                              Decorate 17(v2) Location 0
+                              Decorate 18 RelaxedPrecision
+                              Decorate 19 RelaxedPrecision
+                              Decorate 23(t) DescriptorSet 0
+                              Decorate 27(v3) RelaxedPrecision
+                              Decorate 27(v3) Location 1
+                              Decorate 28 RelaxedPrecision
+                              Decorate 31(vi1) RelaxedPrecision
+                              Decorate 34(i1) RelaxedPrecision
+                              Decorate 34(i1) DescriptorSet 0
+                              Decorate 35 RelaxedPrecision
+                              Decorate 39(iv2) RelaxedPrecision
+                              Decorate 39(iv2) Flat
+                              Decorate 39(iv2) Location 3
+                              Decorate 40 RelaxedPrecision
+                              Decorate 41 RelaxedPrecision
+                              Decorate 42(vi2) RelaxedPrecision
+                              Decorate 43(i2) DescriptorSet 0
+                              Decorate 45 RelaxedPrecision
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+               8:             TypePointer Output 7(fvec4)
+        9(color):      8(ptr) Variable Output
+              10:             TypeImage 6(float) 2D sampled format:Unknown
+              11:             TypeSampledImage 10
+              12:             TypePointer UniformConstant 11
+           13(s):     12(ptr) Variable UniformConstant
+              15:             TypeVector 6(float) 2
+              16:             TypePointer Input 15(fvec2)
+          17(v2):     16(ptr) Variable Input
+              20:             TypeImage 6(float) 3D sampled format:Unknown
+              21:             TypeSampledImage 20
+              22:             TypePointer UniformConstant 21
+           23(t):     22(ptr) Variable UniformConstant
+              25:             TypeVector 6(float) 3
+              26:             TypePointer Input 25(fvec3)
+          27(v3):     26(ptr) Variable Input
+              30:             TypePointer Function 7(fvec4)
+              32:             TypeImage 6(float) 2D nonsampled format:Rgba32f
+              33:             TypePointer UniformConstant 32
+          34(i1):     33(ptr) Variable UniformConstant
+              36:             TypeInt 32 1
+              37:             TypeVector 36(int) 2
+              38:             TypePointer Input 37(ivec2)
+         39(iv2):     38(ptr) Variable Input
+          43(i2):     33(ptr) Variable UniformConstant
+         4(main):           2 Function None 3
+               5:             Label
+         31(vi1):     30(ptr) Variable Function
+         42(vi2):     30(ptr) Variable Function
+              14:          11 Load 13(s)
+              18:   15(fvec2) Load 17(v2)
+              19:    7(fvec4) ImageSampleImplicitLod 14 18
+                              Store 9(color) 19
+              24:          21 Load 23(t)
+              28:   25(fvec3) Load 27(v3)
+              29:    7(fvec4) ImageSampleImplicitLod 24 28
+                              Store 9(color) 29
+              35:          32 Load 34(i1)
+              40:   37(ivec2) Load 39(iv2)
+              41:    7(fvec4) ImageRead 35 40
+                              Store 31(vi1) 41
+              44:          32 Load 43(i2)
+              45:   37(ivec2) Load 39(iv2)
+              46:    7(fvec4) ImageRead 44 45
+                              Store 42(vi2) 46
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.prepost.frag.out b/Test/baseResults/spv.prepost.frag.out
old mode 100755
new mode 100644
index 410286c..3b4bfd8
--- a/Test/baseResults/spv.prepost.frag.out
+++ b/Test/baseResults/spv.prepost.frag.out
@@ -1,6 +1,6 @@
 spv.prepost.frag
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 94
 
                               Capability Shader
@@ -20,6 +20,7 @@
                               Name 66  "z"
                               Name 73  "v"
                               Name 90  "gl_FragColor"
+                              Decorate 90(gl_FragColor) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 32 1
diff --git a/Test/baseResults/spv.pushConstant.vert.out b/Test/baseResults/spv.pushConstant.vert.out
index bdefd63..40ee328 100644
--- a/Test/baseResults/spv.pushConstant.vert.out
+++ b/Test/baseResults/spv.pushConstant.vert.out
@@ -1,8 +1,6 @@
 spv.pushConstant.vert
-Warning, version 400 is not yet complete; most version-specific features are present, but some are missing.
-
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 35
 
                               Capability Shader
diff --git a/Test/baseResults/spv.pushConstantAnon.vert.out b/Test/baseResults/spv.pushConstantAnon.vert.out
old mode 100755
new mode 100644
index 9559815..b03855d
--- a/Test/baseResults/spv.pushConstantAnon.vert.out
+++ b/Test/baseResults/spv.pushConstantAnon.vert.out
@@ -1,8 +1,6 @@
 spv.pushConstantAnon.vert
-Warning, version 400 is not yet complete; most version-specific features are present, but some are missing.
-
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 38
 
                               Capability Shader
diff --git a/Test/baseResults/spv.qualifiers.vert.out b/Test/baseResults/spv.qualifiers.vert.out
old mode 100755
new mode 100644
index 37f474c..ffdc6f8
--- a/Test/baseResults/spv.qualifiers.vert.out
+++ b/Test/baseResults/spv.qualifiers.vert.out
@@ -1,8 +1,6 @@
 spv.qualifiers.vert
-Warning, version 430 is not yet complete; most version-specific features are present, but some are missing.
-
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 21
 
                               Capability Shader
diff --git a/Test/baseResults/spv.queryL.frag.out b/Test/baseResults/spv.queryL.frag.out
old mode 100755
new mode 100644
index fbdcbc8..b737a35
--- a/Test/baseResults/spv.queryL.frag.out
+++ b/Test/baseResults/spv.queryL.frag.out
@@ -1,8 +1,10 @@
 spv.queryL.frag
-Warning, version 430 is not yet complete; most version-specific features are present, but some are missing.
+error: SPIRV-Tools Validation Errors
+error: Capability SampledRect is not allowed by Vulkan 1.0 specification (or requires extension)
+  OpCapability SampledRect
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 224
 
                               Capability Shader
diff --git a/Test/baseResults/spv.rankShift.comp.out b/Test/baseResults/spv.rankShift.comp.out
new file mode 100644
index 0000000..3ca7514
--- /dev/null
+++ b/Test/baseResults/spv.rankShift.comp.out
@@ -0,0 +1,57 @@
+spv.rankShift.comp
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 33
+
+                              Capability Shader
+                              Capability Int64
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint GLCompute 4  "main"
+                              ExecutionMode 4 LocalSize 54 1 1
+                              Source GLSL 450
+                              SourceExtension  "GL_ARB_gpu_shader_int64"
+                              Name 4  "main"
+                              Name 8  "result"
+                              Name 11  "arg0"
+                              Name 15  "arg1"
+                              Decorate 11(arg0) Location 4
+                              Decorate 15(arg1) Location 5
+                              Decorate 32 BuiltIn WorkgroupSize
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeInt 64 0
+               7:             TypePointer Function 6(int64_t)
+               9:             TypeInt 64 1
+              10:             TypePointer UniformConstant 9(int64_t)
+        11(arg0):     10(ptr) Variable UniformConstant
+              13:             TypeInt 32 0
+              14:             TypePointer UniformConstant 13(int)
+        15(arg1):     14(ptr) Variable UniformConstant
+              29:             TypeVector 13(int) 3
+              30:     13(int) Constant 54
+              31:     13(int) Constant 1
+              32:   29(ivec3) ConstantComposite 30 31 31
+         4(main):           2 Function None 3
+               5:             Label
+       8(result):      7(ptr) Variable Function
+              12:  9(int64_t) Load 11(arg0)
+              16:     13(int) Load 15(arg1)
+              17:  9(int64_t) ShiftLeftLogical 12 16
+              18:  6(int64_t) Bitcast 17
+                              Store 8(result) 18
+              19:  9(int64_t) Load 11(arg0)
+              20:     13(int) Load 15(arg1)
+              21:  9(int64_t) ShiftRightArithmetic 19 20
+              22:  6(int64_t) Bitcast 21
+                              Store 8(result) 22
+              23:     13(int) Load 15(arg1)
+              24:  6(int64_t) Load 8(result)
+              25:  6(int64_t) ShiftLeftLogical 24 23
+                              Store 8(result) 25
+              26:     13(int) Load 15(arg1)
+              27:  6(int64_t) Load 8(result)
+              28:  6(int64_t) ShiftRightLogical 27 26
+                              Store 8(result) 28
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.register.autoassign-2.frag.out b/Test/baseResults/spv.register.autoassign-2.frag.out
index f09a468..533e388 100644
--- a/Test/baseResults/spv.register.autoassign-2.frag.out
+++ b/Test/baseResults/spv.register.autoassign-2.frag.out
@@ -1,6 +1,6 @@
 spv.register.autoassign-2.frag
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 47
 
                               Capability Shader
@@ -19,14 +19,14 @@
                               Name 31  "g_tScene[1]"
                               Name 39  "psout"
                               Name 40  "param"
-                              Name 44  "Color"
+                              Name 44  "psout.Color"
                               Decorate 18(g_tScene[0]) DescriptorSet 0
                               Decorate 18(g_tScene[0]) Binding 10
                               Decorate 22(g_tSamp) DescriptorSet 0
                               Decorate 22(g_tSamp) Binding 5
                               Decorate 31(g_tScene[1]) DescriptorSet 0
                               Decorate 31(g_tScene[1]) Binding 11
-                              Decorate 44(Color) Location 0
+                              Decorate 44(psout.Color) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -50,7 +50,7 @@
  31(g_tScene[1]):     17(ptr) Variable UniformConstant
               37:             TypePointer Function 7(fvec4)
               43:             TypePointer Output 7(fvec4)
-       44(Color):     43(ptr) Variable Output
+ 44(psout.Color):     43(ptr) Variable Output
          4(main):           2 Function None 3
                5:             Label
        39(psout):      9(ptr) Variable Function
@@ -60,7 +60,7 @@
                               Store 39(psout) 42
               45:     37(ptr) AccessChain 39(psout) 15
               46:    7(fvec4) Load 45
-                              Store 44(Color) 46
+                              Store 44(psout.Color) 46
                               Return
                               FunctionEnd
 12(@main(struct-PS_OUTPUT-vf41;):           2 Function None 10
diff --git a/Test/baseResults/spv.register.autoassign.frag.out b/Test/baseResults/spv.register.autoassign.frag.out
index 4874d90..683ae08 100644
--- a/Test/baseResults/spv.register.autoassign.frag.out
+++ b/Test/baseResults/spv.register.autoassign.frag.out
@@ -1,6 +1,6 @@
 spv.register.autoassign.frag
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 155
 
                               Capability Shader
@@ -42,7 +42,7 @@
                               Name 130  "g_tTex_unused2"
                               Name 132  "g_sSamp_unused2"
                               Name 141  "psout"
-                              Name 151  "Color"
+                              Name 151  "@entryPointOutput.Color"
                               Name 154  "g_tTex_unused3"
                               Decorate 21(g_tTex1) DescriptorSet 0
                               Decorate 21(g_tTex1) Binding 11
@@ -80,7 +80,7 @@
                               Decorate 130(g_tTex_unused2) DescriptorSet 0
                               Decorate 130(g_tTex_unused2) Binding 12
                               Decorate 132(g_sSamp_unused2) DescriptorSet 0
-                              Decorate 151(Color) Location 0
+                              Decorate 151(@entryPointOutput.Color) Location 0
                               Decorate 154(g_tTex_unused3) DescriptorSet 0
                2:             TypeVoid
                3:             TypeFunction 2
@@ -141,13 +141,13 @@
              140:             TypePointer Function 15(PS_OUTPUT)
              145:             TypePointer Function 7(fvec4)
              150:             TypePointer Output 7(fvec4)
-      151(Color):    150(ptr) Variable Output
+151(@entryPointOutput.Color):    150(ptr) Variable Output
 154(g_tTex_unused3):     20(ptr) Variable UniformConstant
       4(main_ep):           2 Function None 3
                5:             Label
              152:15(PS_OUTPUT) FunctionCall 17(@main_ep()
              153:    7(fvec4) CompositeExtract 152 0
-                              Store 151(Color) 153
+                              Store 151(@entryPointOutput.Color) 153
                               Return
                               FunctionEnd
        9(Func1():    7(fvec4) Function None 8
diff --git a/Test/baseResults/spv.register.noautoassign.frag.out b/Test/baseResults/spv.register.noautoassign.frag.out
index 71c0b37..166d92d 100644
--- a/Test/baseResults/spv.register.noautoassign.frag.out
+++ b/Test/baseResults/spv.register.noautoassign.frag.out
@@ -1,6 +1,6 @@
 spv.register.noautoassign.frag
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 155
 
                               Capability Shader
@@ -42,7 +42,7 @@
                               Name 130  "g_tTex_unused2"
                               Name 132  "g_sSamp_unused2"
                               Name 141  "psout"
-                              Name 151  "Color"
+                              Name 151  "@entryPointOutput.Color"
                               Name 154  "g_tTex_unused3"
                               Decorate 21(g_tTex1) DescriptorSet 0
                               Decorate 21(g_tTex1) Binding 11
@@ -73,7 +73,7 @@
                               Decorate 130(g_tTex_unused2) DescriptorSet 0
                               Decorate 130(g_tTex_unused2) Binding 12
                               Decorate 132(g_sSamp_unused2) DescriptorSet 0
-                              Decorate 151(Color) Location 0
+                              Decorate 151(@entryPointOutput.Color) Location 0
                               Decorate 154(g_tTex_unused3) DescriptorSet 0
                2:             TypeVoid
                3:             TypeFunction 2
@@ -134,13 +134,13 @@
              140:             TypePointer Function 15(PS_OUTPUT)
              145:             TypePointer Function 7(fvec4)
              150:             TypePointer Output 7(fvec4)
-      151(Color):    150(ptr) Variable Output
+151(@entryPointOutput.Color):    150(ptr) Variable Output
 154(g_tTex_unused3):     20(ptr) Variable UniformConstant
       4(main_ep):           2 Function None 3
                5:             Label
              152:15(PS_OUTPUT) FunctionCall 17(@main_ep()
              153:    7(fvec4) CompositeExtract 152 0
-                              Store 151(Color) 153
+                              Store 151(@entryPointOutput.Color) 153
                               Return
                               FunctionEnd
        9(Func1():    7(fvec4) Function None 8
diff --git a/Test/baseResults/spv.register.subpass.frag.out b/Test/baseResults/spv.register.subpass.frag.out
new file mode 100644
index 0000000..c42832a
--- /dev/null
+++ b/Test/baseResults/spv.register.subpass.frag.out
@@ -0,0 +1,75 @@
+spv.register.subpass.frag
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 40
+
+                              Capability Shader
+                              Capability InputAttachment
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 38
+                              ExecutionMode 4 OriginUpperLeft
+                              Source HLSL 500
+                              Name 4  "main"
+                              Name 9  "@main("
+                              Name 12  "result00"
+                              Name 15  "subpass_f4"
+                              Name 22  "result10"
+                              Name 25  "subpass_ms_f4"
+                              Name 29  "result73"
+                              Name 30  "subpass_2"
+                              Name 38  "@entryPointOutput"
+                              Decorate 15(subpass_f4) DescriptorSet 0
+                              Decorate 15(subpass_f4) Binding 21
+                              Decorate 15(subpass_f4) InputAttachmentIndex 1
+                              Decorate 25(subpass_ms_f4) DescriptorSet 0
+                              Decorate 25(subpass_ms_f4) Binding 20
+                              Decorate 25(subpass_ms_f4) InputAttachmentIndex 4
+                              Decorate 30(subpass_2) DescriptorSet 0
+                              Decorate 30(subpass_2) Binding 22
+                              Decorate 30(subpass_2) InputAttachmentIndex 7
+                              Decorate 38(@entryPointOutput) Location 0
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+               8:             TypeFunction 7(fvec4)
+              11:             TypePointer Function 7(fvec4)
+              13:             TypeImage 6(float) SubpassData nonsampled format:Unknown
+              14:             TypePointer UniformConstant 13
+  15(subpass_f4):     14(ptr) Variable UniformConstant
+              17:             TypeInt 32 1
+              18:     17(int) Constant 0
+              19:             TypeVector 17(int) 2
+              20:   19(ivec2) ConstantComposite 18 18
+              23:             TypeImage 6(float) SubpassData multi-sampled nonsampled format:Unknown
+              24:             TypePointer UniformConstant 23
+25(subpass_ms_f4):     24(ptr) Variable UniformConstant
+              27:     17(int) Constant 3
+   30(subpass_2):     14(ptr) Variable UniformConstant
+              33:    6(float) Constant 0
+              34:    7(fvec4) ConstantComposite 33 33 33 33
+              37:             TypePointer Output 7(fvec4)
+38(@entryPointOutput):     37(ptr) Variable Output
+         4(main):           2 Function None 3
+               5:             Label
+              39:    7(fvec4) FunctionCall 9(@main()
+                              Store 38(@entryPointOutput) 39
+                              Return
+                              FunctionEnd
+       9(@main():    7(fvec4) Function None 8
+              10:             Label
+    12(result00):     11(ptr) Variable Function
+    22(result10):     11(ptr) Variable Function
+    29(result73):     11(ptr) Variable Function
+              16:          13 Load 15(subpass_f4)
+              21:    7(fvec4) ImageRead 16 20
+                              Store 12(result00) 21
+              26:          23 Load 25(subpass_ms_f4)
+              28:    7(fvec4) ImageRead 26 20 Sample 27
+                              Store 22(result10) 28
+              31:          13 Load 30(subpass_2)
+              32:    7(fvec4) ImageRead 31 20
+                              Store 29(result73) 32
+                              ReturnValue 34
+                              FunctionEnd
diff --git a/Test/baseResults/spv.rw.autoassign.frag.out b/Test/baseResults/spv.rw.autoassign.frag.out
index 9069666..2ee30bc 100644
--- a/Test/baseResults/spv.rw.autoassign.frag.out
+++ b/Test/baseResults/spv.rw.autoassign.frag.out
@@ -1,11 +1,11 @@
 spv.rw.autoassign.frag
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 42
 
                               Capability Shader
-                              Capability Sampled1D
-                              Capability SampledBuffer
+                              Capability Image1D
+                              Capability ImageBuffer
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
                               EntryPoint Fragment 4  "main" 39
@@ -20,12 +20,12 @@
                               Name 23  "r01"
                               Name 26  "g_tBuf1du1"
                               Name 30  "psout"
-                              Name 39  "Color"
+                              Name 39  "@entryPointOutput.Color"
                               Decorate 16(g_tTex1df1) DescriptorSet 0
                               Decorate 16(g_tTex1df1) Binding 20
                               Decorate 26(g_tBuf1du1) DescriptorSet 0
                               Decorate 26(g_tBuf1du1) Binding 21
-                              Decorate 39(Color) Location 0
+                              Decorate 39(@entryPointOutput.Color) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -48,12 +48,12 @@
               32:    7(fvec4) ConstantComposite 31 31 31 31
               33:             TypePointer Function 7(fvec4)
               38:             TypePointer Output 7(fvec4)
-       39(Color):     38(ptr) Variable Output
+39(@entryPointOutput.Color):     38(ptr) Variable Output
          4(main):           2 Function None 3
                5:             Label
               40:8(PS_OUTPUT) FunctionCall 10(@main()
               41:    7(fvec4) CompositeExtract 40 0
-                              Store 39(Color) 41
+                              Store 39(@entryPointOutput.Color) 41
                               Return
                               FunctionEnd
       10(@main():8(PS_OUTPUT) Function None 9
diff --git a/Test/baseResults/spv.sample.frag.out b/Test/baseResults/spv.sample.frag.out
new file mode 100644
index 0000000..e4d38f3
--- /dev/null
+++ b/Test/baseResults/spv.sample.frag.out
@@ -0,0 +1,32 @@
+spv.sample.frag
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 13
+
+                              Capability Shader
+                              Capability SampleRateShading
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 9 11
+                              ExecutionMode 4 OriginUpperLeft
+                              Source GLSL 450
+                              Name 4  "main"
+                              Name 9  "color"
+                              Name 11  "samp"
+                              Decorate 9(color) Location 0
+                              Decorate 11(samp) Sample
+                              Decorate 11(samp) Location 0
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+               8:             TypePointer Output 7(fvec4)
+        9(color):      8(ptr) Variable Output
+              10:             TypePointer Input 7(fvec4)
+        11(samp):     10(ptr) Variable Input
+         4(main):           2 Function None 3
+               5:             Label
+              12:    7(fvec4) Load 11(samp)
+                              Store 9(color) 12
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.sampleId.frag.out b/Test/baseResults/spv.sampleId.frag.out
new file mode 100644
index 0000000..894d8db
--- /dev/null
+++ b/Test/baseResults/spv.sampleId.frag.out
@@ -0,0 +1,52 @@
+spv.sampleId.frag
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 26
+
+                              Capability Shader
+                              Capability SampleRateShading
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 8 18 20
+                              ExecutionMode 4 OriginUpperLeft
+                              Source GLSL 450
+                              Name 4  "main"
+                              Name 8  "gl_SampleID"
+                              Name 18  "color"
+                              Name 20  "samp"
+                              Decorate 8(gl_SampleID) Flat
+                              Decorate 8(gl_SampleID) BuiltIn SampleId
+                              Decorate 18(color) Location 0
+                              Decorate 20(samp) Location 0
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeInt 32 1
+               7:             TypePointer Input 6(int)
+  8(gl_SampleID):      7(ptr) Variable Input
+              10:      6(int) Constant 3
+              11:             TypeBool
+              15:             TypeFloat 32
+              16:             TypeVector 15(float) 4
+              17:             TypePointer Output 16(fvec4)
+       18(color):     17(ptr) Variable Output
+              19:             TypePointer Input 16(fvec4)
+        20(samp):     19(ptr) Variable Input
+              23:   15(float) Constant 1073741824
+         4(main):           2 Function None 3
+               5:             Label
+               9:      6(int) Load 8(gl_SampleID)
+              12:    11(bool) SLessThan 9 10
+                              SelectionMerge 14 None
+                              BranchConditional 12 13 22
+              13:               Label
+              21:   16(fvec4)   Load 20(samp)
+                                Store 18(color) 21
+                                Branch 14
+              22:               Label
+              24:   16(fvec4)   Load 20(samp)
+              25:   16(fvec4)   VectorTimesScalar 24 23
+                                Store 18(color) 25
+                                Branch 14
+              14:             Label
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.sampleMaskOverrideCoverage.frag.out b/Test/baseResults/spv.sampleMaskOverrideCoverage.frag.out
index 6bae6bd..ae7e824 100644
--- a/Test/baseResults/spv.sampleMaskOverrideCoverage.frag.out
+++ b/Test/baseResults/spv.sampleMaskOverrideCoverage.frag.out
@@ -1,12 +1,13 @@
 spv.sampleMaskOverrideCoverage.frag
-Warning, version 450 is not yet complete; most version-specific features are present, but some are missing.
+error: SPIRV-Tools Validation Errors
+error: Operand 2 of Decorate requires one of these capabilities: SampleMaskOverrideCoverageNV 
+  OpDecorate %gl_SampleMask OverrideCoverageNV
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 20
 
                               Capability Shader
-                              Capability SampleRateShading
                               Extension  "SPV_NV_sample_mask_override_coverage"
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
diff --git a/Test/baseResults/spv.samplePosition.frag.out b/Test/baseResults/spv.samplePosition.frag.out
new file mode 100644
index 0000000..882423e
--- /dev/null
+++ b/Test/baseResults/spv.samplePosition.frag.out
@@ -0,0 +1,55 @@
+spv.samplePosition.frag
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 30
+
+                              Capability Shader
+                              Capability SampleRateShading
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 9 22 24
+                              ExecutionMode 4 OriginUpperLeft
+                              Source GLSL 450
+                              Name 4  "main"
+                              Name 9  "gl_SamplePosition"
+                              Name 22  "color"
+                              Name 24  "samp"
+                              Decorate 9(gl_SamplePosition) BuiltIn SamplePosition
+                              Decorate 22(color) Location 0
+                              Decorate 24(samp) Location 0
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 2
+               8:             TypePointer Input 7(fvec2)
+9(gl_SamplePosition):      8(ptr) Variable Input
+              10:             TypeInt 32 0
+              11:     10(int) Constant 1
+              12:             TypePointer Input 6(float)
+              15:    6(float) Constant 1056964608
+              16:             TypeBool
+              20:             TypeVector 6(float) 4
+              21:             TypePointer Output 20(fvec4)
+       22(color):     21(ptr) Variable Output
+              23:             TypePointer Input 20(fvec4)
+        24(samp):     23(ptr) Variable Input
+              27:    6(float) Constant 1073741824
+         4(main):           2 Function None 3
+               5:             Label
+              13:     12(ptr) AccessChain 9(gl_SamplePosition) 11
+              14:    6(float) Load 13
+              17:    16(bool) FOrdLessThan 14 15
+                              SelectionMerge 19 None
+                              BranchConditional 17 18 26
+              18:               Label
+              25:   20(fvec4)   Load 24(samp)
+                                Store 22(color) 25
+                                Branch 19
+              26:               Label
+              28:   20(fvec4)   Load 24(samp)
+              29:   20(fvec4)   VectorTimesScalar 28 27
+                                Store 22(color) 29
+                                Branch 19
+              19:             Label
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.samplerlessTextureFunctions.frag.out b/Test/baseResults/spv.samplerlessTextureFunctions.frag.out
new file mode 100644
index 0000000..0f09b43
--- /dev/null
+++ b/Test/baseResults/spv.samplerlessTextureFunctions.frag.out
@@ -0,0 +1,93 @@
+spv.samplerlessTextureFunctions.frag
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 51
+
+                              Capability Shader
+                              Capability SampledBuffer
+                              Capability ImageQuery
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main"
+                              ExecutionMode 4 OriginUpperLeft
+                              Source GLSL 450
+                              SourceExtension  "GL_EXT_samplerless_texture_functions"
+                              Name 4  "main"
+                              Name 9  "tex2DFetch"
+                              Name 12  "tex2D"
+                              Name 19  "texMSFetch"
+                              Name 22  "texMS"
+                              Name 25  "bufFetch"
+                              Name 28  "buf"
+                              Name 31  "tex2DFetchOffset"
+                              Name 35  "tex2DSize"
+                              Name 38  "texMSSize"
+                              Name 42  "bufSize"
+                              Name 45  "tex2DLevels"
+                              Name 48  "texMSSamples"
+                              Decorate 12(tex2D) DescriptorSet 0
+                              Decorate 12(tex2D) Binding 1
+                              Decorate 22(texMS) DescriptorSet 0
+                              Decorate 22(texMS) Binding 1
+                              Decorate 28(buf) DescriptorSet 0
+                              Decorate 28(buf) Binding 0
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+               8:             TypePointer Function 7(fvec4)
+              10:             TypeImage 6(float) 2D sampled format:Unknown
+              11:             TypePointer UniformConstant 10
+       12(tex2D):     11(ptr) Variable UniformConstant
+              14:             TypeInt 32 1
+              15:             TypeVector 14(int) 2
+              16:     14(int) Constant 0
+              17:   15(ivec2) ConstantComposite 16 16
+              20:             TypeImage 6(float) 2D multi-sampled sampled format:Unknown
+              21:             TypePointer UniformConstant 20
+       22(texMS):     21(ptr) Variable UniformConstant
+              26:             TypeImage 6(float) Buffer sampled format:Unknown
+              27:             TypePointer UniformConstant 26
+         28(buf):     27(ptr) Variable UniformConstant
+              34:             TypePointer Function 15(ivec2)
+              41:             TypePointer Function 14(int)
+         4(main):           2 Function None 3
+               5:             Label
+   9(tex2DFetch):      8(ptr) Variable Function
+  19(texMSFetch):      8(ptr) Variable Function
+    25(bufFetch):      8(ptr) Variable Function
+31(tex2DFetchOffset):      8(ptr) Variable Function
+   35(tex2DSize):     34(ptr) Variable Function
+   38(texMSSize):     34(ptr) Variable Function
+     42(bufSize):     41(ptr) Variable Function
+ 45(tex2DLevels):     41(ptr) Variable Function
+48(texMSSamples):     41(ptr) Variable Function
+              13:          10 Load 12(tex2D)
+              18:    7(fvec4) ImageFetch 13 17 Lod 16
+                              Store 9(tex2DFetch) 18
+              23:          20 Load 22(texMS)
+              24:    7(fvec4) ImageFetch 23 17 Sample 16
+                              Store 19(texMSFetch) 24
+              29:          26 Load 28(buf)
+              30:    7(fvec4) ImageFetch 29 16
+                              Store 25(bufFetch) 30
+              32:          10 Load 12(tex2D)
+              33:    7(fvec4) ImageFetch 32 17 Lod ConstOffset 16 17
+                              Store 31(tex2DFetchOffset) 33
+              36:          10 Load 12(tex2D)
+              37:   15(ivec2) ImageQuerySizeLod 36 16
+                              Store 35(tex2DSize) 37
+              39:          20 Load 22(texMS)
+              40:   15(ivec2) ImageQuerySize 39
+                              Store 38(texMSSize) 40
+              43:          26 Load 28(buf)
+              44:     14(int) ImageQuerySize 43
+                              Store 42(bufSize) 44
+              46:          10 Load 12(tex2D)
+              47:     14(int) ImageQueryLevels 46
+                              Store 45(tex2DLevels) 47
+              49:          20 Load 22(texMS)
+              50:     14(int) ImageQuerySamples 49
+                              Store 48(texMSSamples) 50
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.scalarlayout.frag.out b/Test/baseResults/spv.scalarlayout.frag.out
new file mode 100644
index 0000000..2935e1a
--- /dev/null
+++ b/Test/baseResults/spv.scalarlayout.frag.out
@@ -0,0 +1,80 @@
+spv.scalarlayout.frag
+error: SPIRV-Tools Validation Errors
+error: Structure id 17 decorated as Block for variable in Uniform storage class must follow standard uniform buffer layout rules: member 1 at offset 4 is not aligned to 8
+  %B1 = OpTypeStruct %float %v2float %v3float %_arr_float_uint_2 %mat2v3float %_arr_mat2v3float_uint_2 %float %S %_arr_S_uint_2
+
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 20
+
+                              Capability Shader
+                              Capability Float64
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main"
+                              ExecutionMode 4 OriginUpperLeft
+                              Source GLSL 450
+                              SourceExtension  "GL_EXT_scalar_block_layout"
+                              Name 4  "main"
+                              Name 15  "S"
+                              MemberName 15(S) 0  "a"
+                              MemberName 15(S) 1  "b"
+                              MemberName 15(S) 2  "c"
+                              MemberName 15(S) 3  "d"
+                              MemberName 15(S) 4  "e"
+                              MemberName 15(S) 5  "f"
+                              Name 17  "B1"
+                              MemberName 17(B1) 0  "a"
+                              MemberName 17(B1) 1  "b"
+                              MemberName 17(B1) 2  "c"
+                              MemberName 17(B1) 3  "d"
+                              MemberName 17(B1) 4  "e"
+                              MemberName 17(B1) 5  "f"
+                              MemberName 17(B1) 6  "g"
+                              MemberName 17(B1) 7  "h"
+                              MemberName 17(B1) 8  "i"
+                              Name 19  ""
+                              Decorate 11 ArrayStride 4
+                              Decorate 13 ArrayStride 24
+                              MemberDecorate 15(S) 0 Offset 0
+                              MemberDecorate 15(S) 1 Offset 4
+                              MemberDecorate 15(S) 2 Offset 16
+                              MemberDecorate 15(S) 3 Offset 24
+                              MemberDecorate 15(S) 4 Offset 28
+                              MemberDecorate 15(S) 5 Offset 40
+                              Decorate 16 ArrayStride 48
+                              MemberDecorate 17(B1) 0 Offset 0
+                              MemberDecorate 17(B1) 1 Offset 4
+                              MemberDecorate 17(B1) 2 Offset 12
+                              MemberDecorate 17(B1) 3 Offset 24
+                              MemberDecorate 17(B1) 4 ColMajor
+                              MemberDecorate 17(B1) 4 Offset 32
+                              MemberDecorate 17(B1) 4 MatrixStride 12
+                              MemberDecorate 17(B1) 5 ColMajor
+                              MemberDecorate 17(B1) 5 Offset 56
+                              MemberDecorate 17(B1) 5 MatrixStride 12
+                              MemberDecorate 17(B1) 6 Offset 104
+                              MemberDecorate 17(B1) 7 Offset 112
+                              MemberDecorate 17(B1) 8 Offset 160
+                              Decorate 17(B1) Block
+                              Decorate 19 DescriptorSet 0
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 2
+               8:             TypeVector 6(float) 3
+               9:             TypeInt 32 0
+              10:      9(int) Constant 2
+              11:             TypeArray 6(float) 10
+              12:             TypeMatrix 8(fvec3) 2
+              13:             TypeArray 12 10
+              14:             TypeFloat 64
+           15(S):             TypeStruct 6(float) 7(fvec2) 14(float64_t) 6(float) 8(fvec3) 6(float)
+              16:             TypeArray 15(S) 10
+          17(B1):             TypeStruct 6(float) 7(fvec2) 8(fvec3) 11 12 13 6(float) 15(S) 16
+              18:             TypePointer Uniform 17(B1)
+              19:     18(ptr) Variable Uniform
+         4(main):           2 Function None 3
+               5:             Label
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.scalarlayoutfloat16.frag.out b/Test/baseResults/spv.scalarlayoutfloat16.frag.out
new file mode 100644
index 0000000..9118636
--- /dev/null
+++ b/Test/baseResults/spv.scalarlayoutfloat16.frag.out
@@ -0,0 +1,72 @@
+spv.scalarlayoutfloat16.frag
+error: SPIRV-Tools Validation Errors
+error: Structure id 15 decorated as Block for variable in Uniform storage class must follow standard uniform buffer layout rules: member 1 at offset 2 is not aligned to 4
+  %B1 = OpTypeStruct %half %v2half %v3half %_arr_half_uint_2 %half %S %_arr_S_uint_2
+
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 18
+
+                              Capability Shader
+                              Capability Float64
+                              Capability StorageUniform16
+                              Extension  "SPV_KHR_16bit_storage"
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main"
+                              ExecutionMode 4 OriginUpperLeft
+                              Source GLSL 450
+                              SourceExtension  "GL_EXT_scalar_block_layout"
+                              SourceExtension  "GL_EXT_shader_16bit_storage"
+                              Name 4  "main"
+                              Name 13  "S"
+                              MemberName 13(S) 0  "a"
+                              MemberName 13(S) 1  "b"
+                              MemberName 13(S) 2  "c"
+                              MemberName 13(S) 3  "d"
+                              MemberName 13(S) 4  "e"
+                              MemberName 13(S) 5  "f"
+                              Name 15  "B1"
+                              MemberName 15(B1) 0  "a"
+                              MemberName 15(B1) 1  "b"
+                              MemberName 15(B1) 2  "c"
+                              MemberName 15(B1) 3  "d"
+                              MemberName 15(B1) 4  "g"
+                              MemberName 15(B1) 5  "h"
+                              MemberName 15(B1) 6  "i"
+                              Name 17  ""
+                              Decorate 11 ArrayStride 2
+                              MemberDecorate 13(S) 0 Offset 0
+                              MemberDecorate 13(S) 1 Offset 2
+                              MemberDecorate 13(S) 2 Offset 8
+                              MemberDecorate 13(S) 3 Offset 16
+                              MemberDecorate 13(S) 4 Offset 18
+                              MemberDecorate 13(S) 5 Offset 24
+                              Decorate 14 ArrayStride 32
+                              MemberDecorate 15(B1) 0 Offset 0
+                              MemberDecorate 15(B1) 1 Offset 2
+                              MemberDecorate 15(B1) 2 Offset 6
+                              MemberDecorate 15(B1) 3 Offset 12
+                              MemberDecorate 15(B1) 4 Offset 16
+                              MemberDecorate 15(B1) 5 Offset 24
+                              MemberDecorate 15(B1) 6 Offset 56
+                              Decorate 15(B1) Block
+                              Decorate 17 DescriptorSet 0
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 16
+               7:             TypeVector 6(float16_t) 2
+               8:             TypeVector 6(float16_t) 3
+               9:             TypeInt 32 0
+              10:      9(int) Constant 2
+              11:             TypeArray 6(float16_t) 10
+              12:             TypeFloat 64
+           13(S):             TypeStruct 6(float16_t) 7(f16vec2) 12(float64_t) 6(float16_t) 8(f16vec3) 6(float16_t)
+              14:             TypeArray 13(S) 10
+          15(B1):             TypeStruct 6(float16_t) 7(f16vec2) 8(f16vec3) 11 6(float16_t) 13(S) 14
+              16:             TypePointer Uniform 15(B1)
+              17:     16(ptr) Variable Uniform
+         4(main):           2 Function None 3
+               5:             Label
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.separate.frag.out b/Test/baseResults/spv.separate.frag.out
index c654117..b9fefd7 100644
--- a/Test/baseResults/spv.separate.frag.out
+++ b/Test/baseResults/spv.separate.frag.out
@@ -1,8 +1,10 @@
 spv.separate.frag
-Warning, version 400 is not yet complete; most version-specific features are present, but some are missing.
+error: SPIRV-Tools Validation Errors
+error: Capability SampledRect is not allowed by Vulkan 1.0 specification (or requires extension)
+  OpCapability SampledRect
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 319
 
                               Capability Shader
@@ -10,7 +12,6 @@
                               Capability Sampled1D
                               Capability SampledCubeArray
                               Capability SampledBuffer
-                              Capability ImageMSArray
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
                               EntryPoint Fragment 4  "main" 11 34
@@ -31,33 +32,33 @@
                               Name 84  "itexCubeArray"
                               Name 91  "utexCubeArray"
                               Name 98  "tex1DArray"
-                              Name 106  "itex1DArray"
-                              Name 113  "utex1D"
-                              Name 120  "itex1D"
-                              Name 127  "utex1DArray"
-                              Name 134  "texBuffer"
-                              Name 146  "tex2DArray"
-                              Name 158  "itex2D"
-                              Name 165  "itex3D"
-                              Name 172  "itexCube"
-                              Name 179  "itex2DArray"
-                              Name 186  "utex2D"
-                              Name 193  "utex3D"
-                              Name 200  "utexCube"
-                              Name 207  "utex2DArray"
-                              Name 214  "itex2DRect"
-                              Name 221  "utex2DRect"
-                              Name 228  "itexBuffer"
-                              Name 235  "utexBuffer"
-                              Name 242  "tex2DMS"
-                              Name 249  "itex2DMS"
-                              Name 256  "utex2DMS"
-                              Name 263  "tex2DMSArray"
-                              Name 270  "itex2DMSArray"
-                              Name 277  "utex2DMSArray"
-                              Name 284  "tex1D"
-                              Name 294  "tex3D"
-                              Name 305  "tex2DRect"
+                              Name 105  "itex1DArray"
+                              Name 112  "utex1D"
+                              Name 119  "itex1D"
+                              Name 126  "utex1DArray"
+                              Name 133  "texBuffer"
+                              Name 145  "tex2DArray"
+                              Name 157  "itex2D"
+                              Name 164  "itex3D"
+                              Name 171  "itexCube"
+                              Name 178  "itex2DArray"
+                              Name 185  "utex2D"
+                              Name 192  "utex3D"
+                              Name 199  "utexCube"
+                              Name 206  "utex2DArray"
+                              Name 213  "itex2DRect"
+                              Name 220  "utex2DRect"
+                              Name 227  "itexBuffer"
+                              Name 234  "utexBuffer"
+                              Name 241  "tex2DMS"
+                              Name 248  "itex2DMS"
+                              Name 255  "utex2DMS"
+                              Name 262  "tex2DMSArray"
+                              Name 269  "itex2DMSArray"
+                              Name 276  "utex2DMSArray"
+                              Name 283  "tex1D"
+                              Name 293  "tex3D"
+                              Name 304  "tex2DRect"
                               Decorate 14(t2d) DescriptorSet 0
                               Decorate 18(s) DescriptorSet 0
                               Decorate 31(t3d) DescriptorSet 0
@@ -70,33 +71,33 @@
                               Decorate 84(itexCubeArray) DescriptorSet 0
                               Decorate 91(utexCubeArray) DescriptorSet 0
                               Decorate 98(tex1DArray) DescriptorSet 0
-                              Decorate 106(itex1DArray) DescriptorSet 0
-                              Decorate 113(utex1D) DescriptorSet 0
-                              Decorate 120(itex1D) DescriptorSet 0
-                              Decorate 127(utex1DArray) DescriptorSet 0
-                              Decorate 134(texBuffer) DescriptorSet 0
-                              Decorate 146(tex2DArray) DescriptorSet 0
-                              Decorate 158(itex2D) DescriptorSet 0
-                              Decorate 165(itex3D) DescriptorSet 0
-                              Decorate 172(itexCube) DescriptorSet 0
-                              Decorate 179(itex2DArray) DescriptorSet 0
-                              Decorate 186(utex2D) DescriptorSet 0
-                              Decorate 193(utex3D) DescriptorSet 0
-                              Decorate 200(utexCube) DescriptorSet 0
-                              Decorate 207(utex2DArray) DescriptorSet 0
-                              Decorate 214(itex2DRect) DescriptorSet 0
-                              Decorate 221(utex2DRect) DescriptorSet 0
-                              Decorate 228(itexBuffer) DescriptorSet 0
-                              Decorate 235(utexBuffer) DescriptorSet 0
-                              Decorate 242(tex2DMS) DescriptorSet 0
-                              Decorate 249(itex2DMS) DescriptorSet 0
-                              Decorate 256(utex2DMS) DescriptorSet 0
-                              Decorate 263(tex2DMSArray) DescriptorSet 0
-                              Decorate 270(itex2DMSArray) DescriptorSet 0
-                              Decorate 277(utex2DMSArray) DescriptorSet 0
-                              Decorate 284(tex1D) DescriptorSet 0
-                              Decorate 294(tex3D) DescriptorSet 0
-                              Decorate 305(tex2DRect) DescriptorSet 0
+                              Decorate 105(itex1DArray) DescriptorSet 0
+                              Decorate 112(utex1D) DescriptorSet 0
+                              Decorate 119(itex1D) DescriptorSet 0
+                              Decorate 126(utex1DArray) DescriptorSet 0
+                              Decorate 133(texBuffer) DescriptorSet 0
+                              Decorate 145(tex2DArray) DescriptorSet 0
+                              Decorate 157(itex2D) DescriptorSet 0
+                              Decorate 164(itex3D) DescriptorSet 0
+                              Decorate 171(itexCube) DescriptorSet 0
+                              Decorate 178(itex2DArray) DescriptorSet 0
+                              Decorate 185(utex2D) DescriptorSet 0
+                              Decorate 192(utex3D) DescriptorSet 0
+                              Decorate 199(utexCube) DescriptorSet 0
+                              Decorate 206(utex2DArray) DescriptorSet 0
+                              Decorate 213(itex2DRect) DescriptorSet 0
+                              Decorate 220(utex2DRect) DescriptorSet 0
+                              Decorate 227(itexBuffer) DescriptorSet 0
+                              Decorate 234(utexBuffer) DescriptorSet 0
+                              Decorate 241(tex2DMS) DescriptorSet 0
+                              Decorate 248(itex2DMS) DescriptorSet 0
+                              Decorate 255(utex2DMS) DescriptorSet 0
+                              Decorate 262(tex2DMSArray) DescriptorSet 0
+                              Decorate 269(itex2DMSArray) DescriptorSet 0
+                              Decorate 276(utex2DMSArray) DescriptorSet 0
+                              Decorate 283(tex1D) DescriptorSet 0
+                              Decorate 293(tex3D) DescriptorSet 0
+                              Decorate 304(tex2DRect) DescriptorSet 0
                2:             TypeVoid
                3:             TypeFunction 2
                8:             TypeFloat 32
@@ -150,127 +151,127 @@
               90:             TypePointer UniformConstant 89
 91(utexCubeArray):     90(ptr) Variable UniformConstant
               94:             TypeSampledImage 89
-              96:             TypeImage 8(float) 1D array sampled format:Unknown
+              96:             TypeImage 8(float) 1D depth array sampled format:Unknown
               97:             TypePointer UniformConstant 96
   98(tex1DArray):     97(ptr) Variable UniformConstant
-             101:             TypeImage 8(float) 1D depth array sampled format:Unknown
-             102:             TypeSampledImage 101
-             104:             TypeImage 32(int) 1D array sampled format:Unknown
-             105:             TypePointer UniformConstant 104
-106(itex1DArray):    105(ptr) Variable UniformConstant
-             109:             TypeSampledImage 104
-             111:             TypeImage 27(int) 1D sampled format:Unknown
-             112:             TypePointer UniformConstant 111
-     113(utex1D):    112(ptr) Variable UniformConstant
-             116:             TypeSampledImage 111
-             118:             TypeImage 32(int) 1D sampled format:Unknown
-             119:             TypePointer UniformConstant 118
-     120(itex1D):    119(ptr) Variable UniformConstant
-             123:             TypeSampledImage 118
-             125:             TypeImage 27(int) 1D array sampled format:Unknown
-             126:             TypePointer UniformConstant 125
-127(utex1DArray):    126(ptr) Variable UniformConstant
-             130:             TypeSampledImage 125
-             132:             TypeImage 8(float) Buffer sampled format:Unknown
-             133:             TypePointer UniformConstant 132
-  134(texBuffer):    133(ptr) Variable UniformConstant
-             137:             TypeSampledImage 132
-             141:             TypeImage 8(float) Cube depth sampled format:Unknown
-             142:             TypeSampledImage 141
-             144:             TypeImage 8(float) 2D array sampled format:Unknown
-             145:             TypePointer UniformConstant 144
- 146(tex2DArray):    145(ptr) Variable UniformConstant
-             149:             TypeSampledImage 144
-             153:             TypeImage 8(float) 2D depth array sampled format:Unknown
-             154:             TypeSampledImage 153
-             156:             TypeImage 32(int) 2D sampled format:Unknown
-             157:             TypePointer UniformConstant 156
-     158(itex2D):    157(ptr) Variable UniformConstant
-             161:             TypeSampledImage 156
-             163:             TypeImage 32(int) 3D sampled format:Unknown
-             164:             TypePointer UniformConstant 163
-     165(itex3D):    164(ptr) Variable UniformConstant
-             168:             TypeSampledImage 163
-             170:             TypeImage 32(int) Cube sampled format:Unknown
-             171:             TypePointer UniformConstant 170
-   172(itexCube):    171(ptr) Variable UniformConstant
-             175:             TypeSampledImage 170
-             177:             TypeImage 32(int) 2D array sampled format:Unknown
-             178:             TypePointer UniformConstant 177
-179(itex2DArray):    178(ptr) Variable UniformConstant
-             182:             TypeSampledImage 177
-             184:             TypeImage 27(int) 2D sampled format:Unknown
-             185:             TypePointer UniformConstant 184
-     186(utex2D):    185(ptr) Variable UniformConstant
-             189:             TypeSampledImage 184
-             191:             TypeImage 27(int) 3D sampled format:Unknown
-             192:             TypePointer UniformConstant 191
-     193(utex3D):    192(ptr) Variable UniformConstant
-             196:             TypeSampledImage 191
-             198:             TypeImage 27(int) Cube sampled format:Unknown
-             199:             TypePointer UniformConstant 198
-   200(utexCube):    199(ptr) Variable UniformConstant
-             203:             TypeSampledImage 198
-             205:             TypeImage 27(int) 2D array sampled format:Unknown
-             206:             TypePointer UniformConstant 205
-207(utex2DArray):    206(ptr) Variable UniformConstant
-             210:             TypeSampledImage 205
-             212:             TypeImage 32(int) Rect sampled format:Unknown
-             213:             TypePointer UniformConstant 212
- 214(itex2DRect):    213(ptr) Variable UniformConstant
-             217:             TypeSampledImage 212
-             219:             TypeImage 27(int) Rect sampled format:Unknown
-             220:             TypePointer UniformConstant 219
- 221(utex2DRect):    220(ptr) Variable UniformConstant
-             224:             TypeSampledImage 219
-             226:             TypeImage 32(int) Buffer sampled format:Unknown
-             227:             TypePointer UniformConstant 226
- 228(itexBuffer):    227(ptr) Variable UniformConstant
-             231:             TypeSampledImage 226
-             233:             TypeImage 27(int) Buffer sampled format:Unknown
-             234:             TypePointer UniformConstant 233
- 235(utexBuffer):    234(ptr) Variable UniformConstant
-             238:             TypeSampledImage 233
-             240:             TypeImage 8(float) 2D multi-sampled sampled format:Unknown
-             241:             TypePointer UniformConstant 240
-    242(tex2DMS):    241(ptr) Variable UniformConstant
-             245:             TypeSampledImage 240
-             247:             TypeImage 32(int) 2D multi-sampled sampled format:Unknown
-             248:             TypePointer UniformConstant 247
-   249(itex2DMS):    248(ptr) Variable UniformConstant
-             252:             TypeSampledImage 247
-             254:             TypeImage 27(int) 2D multi-sampled sampled format:Unknown
-             255:             TypePointer UniformConstant 254
-   256(utex2DMS):    255(ptr) Variable UniformConstant
-             259:             TypeSampledImage 254
-             261:             TypeImage 8(float) 2D array multi-sampled sampled format:Unknown
-             262:             TypePointer UniformConstant 261
-263(tex2DMSArray):    262(ptr) Variable UniformConstant
-             266:             TypeSampledImage 261
-             268:             TypeImage 32(int) 2D array multi-sampled sampled format:Unknown
-             269:             TypePointer UniformConstant 268
-270(itex2DMSArray):    269(ptr) Variable UniformConstant
-             273:             TypeSampledImage 268
-             275:             TypeImage 27(int) 2D array multi-sampled sampled format:Unknown
-             276:             TypePointer UniformConstant 275
-277(utex2DMSArray):    276(ptr) Variable UniformConstant
-             280:             TypeSampledImage 275
-             282:             TypeImage 8(float) 1D sampled format:Unknown
-             283:             TypePointer UniformConstant 282
-      284(tex1D):    283(ptr) Variable UniformConstant
-             287:             TypeSampledImage 282
-             291:             TypeImage 8(float) 1D depth sampled format:Unknown
-             292:             TypeSampledImage 291
-      294(tex3D):     36(ptr) Variable UniformConstant
-             300:             TypeImage 8(float) 2D depth sampled format:Unknown
-             301:             TypeSampledImage 300
-             303:             TypeImage 8(float) Rect sampled format:Unknown
-             304:             TypePointer UniformConstant 303
-  305(tex2DRect):    304(ptr) Variable UniformConstant
-             308:             TypeSampledImage 303
-             312:             TypeImage 8(float) Rect depth sampled format:Unknown
-             313:             TypeSampledImage 312
-             317:             TypeSampledImage 96
+             101:             TypeSampledImage 96
+             103:             TypeImage 32(int) 1D array sampled format:Unknown
+             104:             TypePointer UniformConstant 103
+105(itex1DArray):    104(ptr) Variable UniformConstant
+             108:             TypeSampledImage 103
+             110:             TypeImage 27(int) 1D sampled format:Unknown
+             111:             TypePointer UniformConstant 110
+     112(utex1D):    111(ptr) Variable UniformConstant
+             115:             TypeSampledImage 110
+             117:             TypeImage 32(int) 1D sampled format:Unknown
+             118:             TypePointer UniformConstant 117
+     119(itex1D):    118(ptr) Variable UniformConstant
+             122:             TypeSampledImage 117
+             124:             TypeImage 27(int) 1D array sampled format:Unknown
+             125:             TypePointer UniformConstant 124
+126(utex1DArray):    125(ptr) Variable UniformConstant
+             129:             TypeSampledImage 124
+             131:             TypeImage 8(float) Buffer sampled format:Unknown
+             132:             TypePointer UniformConstant 131
+  133(texBuffer):    132(ptr) Variable UniformConstant
+             136:             TypeSampledImage 131
+             140:             TypeImage 8(float) Cube depth sampled format:Unknown
+             141:             TypeSampledImage 140
+             143:             TypeImage 8(float) 2D array sampled format:Unknown
+             144:             TypePointer UniformConstant 143
+ 145(tex2DArray):    144(ptr) Variable UniformConstant
+             148:             TypeSampledImage 143
+             152:             TypeImage 8(float) 2D depth array sampled format:Unknown
+             153:             TypeSampledImage 152
+             155:             TypeImage 32(int) 2D sampled format:Unknown
+             156:             TypePointer UniformConstant 155
+     157(itex2D):    156(ptr) Variable UniformConstant
+             160:             TypeSampledImage 155
+             162:             TypeImage 32(int) 3D sampled format:Unknown
+             163:             TypePointer UniformConstant 162
+     164(itex3D):    163(ptr) Variable UniformConstant
+             167:             TypeSampledImage 162
+             169:             TypeImage 32(int) Cube sampled format:Unknown
+             170:             TypePointer UniformConstant 169
+   171(itexCube):    170(ptr) Variable UniformConstant
+             174:             TypeSampledImage 169
+             176:             TypeImage 32(int) 2D array sampled format:Unknown
+             177:             TypePointer UniformConstant 176
+178(itex2DArray):    177(ptr) Variable UniformConstant
+             181:             TypeSampledImage 176
+             183:             TypeImage 27(int) 2D sampled format:Unknown
+             184:             TypePointer UniformConstant 183
+     185(utex2D):    184(ptr) Variable UniformConstant
+             188:             TypeSampledImage 183
+             190:             TypeImage 27(int) 3D sampled format:Unknown
+             191:             TypePointer UniformConstant 190
+     192(utex3D):    191(ptr) Variable UniformConstant
+             195:             TypeSampledImage 190
+             197:             TypeImage 27(int) Cube sampled format:Unknown
+             198:             TypePointer UniformConstant 197
+   199(utexCube):    198(ptr) Variable UniformConstant
+             202:             TypeSampledImage 197
+             204:             TypeImage 27(int) 2D array sampled format:Unknown
+             205:             TypePointer UniformConstant 204
+206(utex2DArray):    205(ptr) Variable UniformConstant
+             209:             TypeSampledImage 204
+             211:             TypeImage 32(int) Rect sampled format:Unknown
+             212:             TypePointer UniformConstant 211
+ 213(itex2DRect):    212(ptr) Variable UniformConstant
+             216:             TypeSampledImage 211
+             218:             TypeImage 27(int) Rect sampled format:Unknown
+             219:             TypePointer UniformConstant 218
+ 220(utex2DRect):    219(ptr) Variable UniformConstant
+             223:             TypeSampledImage 218
+             225:             TypeImage 32(int) Buffer sampled format:Unknown
+             226:             TypePointer UniformConstant 225
+ 227(itexBuffer):    226(ptr) Variable UniformConstant
+             230:             TypeSampledImage 225
+             232:             TypeImage 27(int) Buffer sampled format:Unknown
+             233:             TypePointer UniformConstant 232
+ 234(utexBuffer):    233(ptr) Variable UniformConstant
+             237:             TypeSampledImage 232
+             239:             TypeImage 8(float) 2D multi-sampled sampled format:Unknown
+             240:             TypePointer UniformConstant 239
+    241(tex2DMS):    240(ptr) Variable UniformConstant
+             244:             TypeSampledImage 239
+             246:             TypeImage 32(int) 2D multi-sampled sampled format:Unknown
+             247:             TypePointer UniformConstant 246
+   248(itex2DMS):    247(ptr) Variable UniformConstant
+             251:             TypeSampledImage 246
+             253:             TypeImage 27(int) 2D multi-sampled sampled format:Unknown
+             254:             TypePointer UniformConstant 253
+   255(utex2DMS):    254(ptr) Variable UniformConstant
+             258:             TypeSampledImage 253
+             260:             TypeImage 8(float) 2D array multi-sampled sampled format:Unknown
+             261:             TypePointer UniformConstant 260
+262(tex2DMSArray):    261(ptr) Variable UniformConstant
+             265:             TypeSampledImage 260
+             267:             TypeImage 32(int) 2D array multi-sampled sampled format:Unknown
+             268:             TypePointer UniformConstant 267
+269(itex2DMSArray):    268(ptr) Variable UniformConstant
+             272:             TypeSampledImage 267
+             274:             TypeImage 27(int) 2D array multi-sampled sampled format:Unknown
+             275:             TypePointer UniformConstant 274
+276(utex2DMSArray):    275(ptr) Variable UniformConstant
+             279:             TypeSampledImage 274
+             281:             TypeImage 8(float) 1D sampled format:Unknown
+             282:             TypePointer UniformConstant 281
+      283(tex1D):    282(ptr) Variable UniformConstant
+             286:             TypeSampledImage 281
+             290:             TypeImage 8(float) 1D depth sampled format:Unknown
+             291:             TypeSampledImage 290
+      293(tex3D):     36(ptr) Variable UniformConstant
+             299:             TypeImage 8(float) 2D depth sampled format:Unknown
+             300:             TypeSampledImage 299
+             302:             TypeImage 8(float) Rect sampled format:Unknown
+             303:             TypePointer UniformConstant 302
+  304(tex2DRect):    303(ptr) Variable UniformConstant
+             307:             TypeSampledImage 302
+             311:             TypeImage 8(float) Rect depth sampled format:Unknown
+             312:             TypeSampledImage 311
+             316:             TypeImage 8(float) 1D array sampled format:Unknown
+             317:             TypeSampledImage 316
          4(main):           2 Function None 3
                5:             Label
               15:          12 Load 14(t2d)
@@ -319,105 +320,105 @@
               95:          94 SampledImage 92 93
               99:          96 Load 98(tex1DArray)
              100:          16 Load 77(sShadow)
-             103:         102 SampledImage 99 100
-             107:         104 Load 106(itex1DArray)
-             108:          16 Load 18(s)
-             110:         109 SampledImage 107 108
-             114:         111 Load 113(utex1D)
-             115:          16 Load 18(s)
-             117:         116 SampledImage 114 115
-             121:         118 Load 120(itex1D)
-             122:          16 Load 18(s)
-             124:         123 SampledImage 121 122
-             128:         125 Load 127(utex1DArray)
-             129:          16 Load 18(s)
-             131:         130 SampledImage 128 129
-             135:         132 Load 134(texBuffer)
-             136:          16 Load 18(s)
-             138:         137 SampledImage 135 136
-             139:          62 Load 64(texCube)
-             140:          16 Load 77(sShadow)
-             143:         142 SampledImage 139 140
-             147:         144 Load 146(tex2DArray)
-             148:          16 Load 18(s)
-             150:         149 SampledImage 147 148
-             151:         144 Load 146(tex2DArray)
-             152:          16 Load 77(sShadow)
-             155:         154 SampledImage 151 152
-             159:         156 Load 158(itex2D)
-             160:          16 Load 18(s)
-             162:         161 SampledImage 159 160
-             166:         163 Load 165(itex3D)
-             167:          16 Load 18(s)
-             169:         168 SampledImage 166 167
-             173:         170 Load 172(itexCube)
-             174:          16 Load 18(s)
-             176:         175 SampledImage 173 174
-             180:         177 Load 179(itex2DArray)
-             181:          16 Load 18(s)
-             183:         182 SampledImage 180 181
-             187:         184 Load 186(utex2D)
-             188:          16 Load 18(s)
-             190:         189 SampledImage 187 188
-             194:         191 Load 193(utex3D)
-             195:          16 Load 18(s)
-             197:         196 SampledImage 194 195
-             201:         198 Load 200(utexCube)
-             202:          16 Load 18(s)
-             204:         203 SampledImage 201 202
-             208:         205 Load 207(utex2DArray)
-             209:          16 Load 18(s)
-             211:         210 SampledImage 208 209
-             215:         212 Load 214(itex2DRect)
-             216:          16 Load 18(s)
-             218:         217 SampledImage 215 216
-             222:         219 Load 221(utex2DRect)
-             223:          16 Load 18(s)
-             225:         224 SampledImage 222 223
-             229:         226 Load 228(itexBuffer)
-             230:          16 Load 18(s)
-             232:         231 SampledImage 229 230
-             236:         233 Load 235(utexBuffer)
-             237:          16 Load 18(s)
-             239:         238 SampledImage 236 237
-             243:         240 Load 242(tex2DMS)
-             244:          16 Load 18(s)
-             246:         245 SampledImage 243 244
-             250:         247 Load 249(itex2DMS)
-             251:          16 Load 18(s)
-             253:         252 SampledImage 250 251
-             257:         254 Load 256(utex2DMS)
-             258:          16 Load 18(s)
-             260:         259 SampledImage 257 258
-             264:         261 Load 263(tex2DMSArray)
-             265:          16 Load 18(s)
-             267:         266 SampledImage 264 265
-             271:         268 Load 270(itex2DMSArray)
-             272:          16 Load 18(s)
-             274:         273 SampledImage 271 272
-             278:         275 Load 277(utex2DMSArray)
-             279:          16 Load 18(s)
-             281:         280 SampledImage 278 279
-             285:         282 Load 284(tex1D)
-             286:          16 Load 18(s)
-             288:         287 SampledImage 285 286
-             289:         282 Load 284(tex1D)
-             290:          16 Load 77(sShadow)
-             293:         292 SampledImage 289 290
-             295:          26 Load 294(tex3D)
-             296:          16 Load 18(s)
-             297:          45 SampledImage 295 296
-             298:          12 Load 58(tex2D)
-             299:          16 Load 77(sShadow)
-             302:         301 SampledImage 298 299
-             306:         303 Load 305(tex2DRect)
-             307:          16 Load 18(s)
-             309:         308 SampledImage 306 307
-             310:         303 Load 305(tex2DRect)
-             311:          16 Load 77(sShadow)
-             314:         313 SampledImage 310 311
-             315:          96 Load 98(tex1DArray)
-             316:          16 Load 18(s)
-             318:         317 SampledImage 315 316
+             102:         101 SampledImage 99 100
+             106:         103 Load 105(itex1DArray)
+             107:          16 Load 18(s)
+             109:         108 SampledImage 106 107
+             113:         110 Load 112(utex1D)
+             114:          16 Load 18(s)
+             116:         115 SampledImage 113 114
+             120:         117 Load 119(itex1D)
+             121:          16 Load 18(s)
+             123:         122 SampledImage 120 121
+             127:         124 Load 126(utex1DArray)
+             128:          16 Load 18(s)
+             130:         129 SampledImage 127 128
+             134:         131 Load 133(texBuffer)
+             135:          16 Load 18(s)
+             137:         136 SampledImage 134 135
+             138:          62 Load 64(texCube)
+             139:          16 Load 77(sShadow)
+             142:         141 SampledImage 138 139
+             146:         143 Load 145(tex2DArray)
+             147:          16 Load 18(s)
+             149:         148 SampledImage 146 147
+             150:         143 Load 145(tex2DArray)
+             151:          16 Load 77(sShadow)
+             154:         153 SampledImage 150 151
+             158:         155 Load 157(itex2D)
+             159:          16 Load 18(s)
+             161:         160 SampledImage 158 159
+             165:         162 Load 164(itex3D)
+             166:          16 Load 18(s)
+             168:         167 SampledImage 165 166
+             172:         169 Load 171(itexCube)
+             173:          16 Load 18(s)
+             175:         174 SampledImage 172 173
+             179:         176 Load 178(itex2DArray)
+             180:          16 Load 18(s)
+             182:         181 SampledImage 179 180
+             186:         183 Load 185(utex2D)
+             187:          16 Load 18(s)
+             189:         188 SampledImage 186 187
+             193:         190 Load 192(utex3D)
+             194:          16 Load 18(s)
+             196:         195 SampledImage 193 194
+             200:         197 Load 199(utexCube)
+             201:          16 Load 18(s)
+             203:         202 SampledImage 200 201
+             207:         204 Load 206(utex2DArray)
+             208:          16 Load 18(s)
+             210:         209 SampledImage 207 208
+             214:         211 Load 213(itex2DRect)
+             215:          16 Load 18(s)
+             217:         216 SampledImage 214 215
+             221:         218 Load 220(utex2DRect)
+             222:          16 Load 18(s)
+             224:         223 SampledImage 221 222
+             228:         225 Load 227(itexBuffer)
+             229:          16 Load 18(s)
+             231:         230 SampledImage 228 229
+             235:         232 Load 234(utexBuffer)
+             236:          16 Load 18(s)
+             238:         237 SampledImage 235 236
+             242:         239 Load 241(tex2DMS)
+             243:          16 Load 18(s)
+             245:         244 SampledImage 242 243
+             249:         246 Load 248(itex2DMS)
+             250:          16 Load 18(s)
+             252:         251 SampledImage 249 250
+             256:         253 Load 255(utex2DMS)
+             257:          16 Load 18(s)
+             259:         258 SampledImage 256 257
+             263:         260 Load 262(tex2DMSArray)
+             264:          16 Load 18(s)
+             266:         265 SampledImage 263 264
+             270:         267 Load 269(itex2DMSArray)
+             271:          16 Load 18(s)
+             273:         272 SampledImage 270 271
+             277:         274 Load 276(utex2DMSArray)
+             278:          16 Load 18(s)
+             280:         279 SampledImage 277 278
+             284:         281 Load 283(tex1D)
+             285:          16 Load 18(s)
+             287:         286 SampledImage 284 285
+             288:         281 Load 283(tex1D)
+             289:          16 Load 77(sShadow)
+             292:         291 SampledImage 288 289
+             294:          26 Load 293(tex3D)
+             295:          16 Load 18(s)
+             296:          45 SampledImage 294 295
+             297:          12 Load 58(tex2D)
+             298:          16 Load 77(sShadow)
+             301:         300 SampledImage 297 298
+             305:         302 Load 304(tex2DRect)
+             306:          16 Load 18(s)
+             308:         307 SampledImage 305 306
+             309:         302 Load 304(tex2DRect)
+             310:          16 Load 77(sShadow)
+             313:         312 SampledImage 309 310
+             314:          96 Load 98(tex1DArray)
+             315:          16 Load 18(s)
+             318:         317 SampledImage 314 315
                               Return
                               FunctionEnd
diff --git a/Test/baseResults/spv.set.vert.out b/Test/baseResults/spv.set.vert.out
old mode 100755
new mode 100644
index 38cb669..16d771f
--- a/Test/baseResults/spv.set.vert.out
+++ b/Test/baseResults/spv.set.vert.out
@@ -1,8 +1,6 @@
 spv.set.vert
-Warning, version 450 is not yet complete; most version-specific features are present, but some are missing.
-
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 22
 
                               Capability Shader
diff --git a/Test/baseResults/spv.shaderBallot.comp.out b/Test/baseResults/spv.shaderBallot.comp.out
index b8d5e3a..2f0e5a0 100644
--- a/Test/baseResults/spv.shaderBallot.comp.out
+++ b/Test/baseResults/spv.shaderBallot.comp.out
@@ -1,8 +1,6 @@
 spv.shaderBallot.comp
-Warning, version 450 is not yet complete; most version-specific features are present, but some are missing.
-
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 298
 
                               Capability Shader
@@ -54,8 +52,8 @@
 12(gl_SubGroupSizeARB):      9(ptr) Variable Input
               15:      6(int) Constant 4
               17:             TypeInt 64 0
-              18:             TypePointer Function 17(int)
-              20:             TypePointer Input 17(int)
+              18:             TypePointer Function 17(int64_t)
+              20:             TypePointer Input 17(int64_t)
 21(gl_SubGroupEqMaskARB):     20(ptr) Variable Input
 23(gl_SubGroupGeMaskARB):     20(ptr) Variable Input
 26(gl_SubGroupGtMaskARB):     20(ptr) Variable Input
@@ -101,22 +99,22 @@
               14:      6(int) IAdd 11 13
               16:      6(int) UMod 14 15
                               Store 8(invocation) 16
-              22:     17(int) Load 21(gl_SubGroupEqMaskARB)
-              24:     17(int) Load 23(gl_SubGroupGeMaskARB)
-              25:     17(int) IAdd 22 24
-              27:     17(int) Load 26(gl_SubGroupGtMaskARB)
-              28:     17(int) IAdd 25 27
-              30:     17(int) Load 29(gl_SubGroupLeMaskARB)
-              31:     17(int) IAdd 28 30
-              33:     17(int) Load 32(gl_SubGroupLtMaskARB)
-              34:     17(int) IAdd 31 33
+              22: 17(int64_t) Load 21(gl_SubGroupEqMaskARB)
+              24: 17(int64_t) Load 23(gl_SubGroupGeMaskARB)
+              25: 17(int64_t) IAdd 22 24
+              27: 17(int64_t) Load 26(gl_SubGroupGtMaskARB)
+              28: 17(int64_t) IAdd 25 27
+              30: 17(int64_t) Load 29(gl_SubGroupLeMaskARB)
+              31: 17(int64_t) IAdd 28 30
+              33: 17(int64_t) Load 32(gl_SubGroupLtMaskARB)
+              34: 17(int64_t) IAdd 31 33
                               Store 19(relMask) 34
-              35:     17(int) Load 19(relMask)
+              35: 17(int64_t) Load 19(relMask)
               39:   38(ivec4) SubgroupBallotKHR 37
               40:      6(int) CompositeExtract 39 0
               41:      6(int) CompositeExtract 39 1
               43:   42(ivec2) CompositeConstruct 40 41
-              44:     17(int) Bitcast 43
+              44: 17(int64_t) Bitcast 43
               45:    36(bool) IEqual 35 44
                               SelectionMerge 47 None
                               BranchConditional 45 46 216
diff --git a/Test/baseResults/spv.shaderBallotAMD.comp.out b/Test/baseResults/spv.shaderBallotAMD.comp.out
index 8011fb6..5219a3a 100644
--- a/Test/baseResults/spv.shaderBallotAMD.comp.out
+++ b/Test/baseResults/spv.shaderBallotAMD.comp.out
@@ -1,18 +1,19 @@
 spv.shaderBallotAMD.comp
-Warning, version 450 is not yet complete; most version-specific features are present, but some are missing.
+error: SPIRV-Tools Validation Errors
+error: Capability Float16 is not allowed by Vulkan 1.0 specification (or requires extension)
+  OpCapability Float16
 
 // Module Version 10000
-// Generated by (magic number): 80001
-// Id's are bound by 1048
+// Generated by (magic number): 80007
+// Id's are bound by 1343
 
                               Capability Shader
                               Capability Float16
                               Capability Float64
                               Capability Int64
                               Capability Groups
+                              Capability Int16
                               Capability StorageUniformBufferBlock16
-                              Capability StorageUniform16
-                              Extension  "SPV_AMD_gpu_shader_half_float"
                               Extension  "SPV_AMD_shader_ballot"
                               Extension  "SPV_KHR_16bit_storage"
                1:             ExtInstImport  "GLSL.std.450"
@@ -21,29 +22,34 @@
                               ExecutionMode 4 LocalSize 8 8 1
                               Source GLSL 450
                               SourceExtension  "GL_AMD_gpu_shader_half_float"
+                              SourceExtension  "GL_AMD_gpu_shader_int16"
                               SourceExtension  "GL_AMD_shader_ballot"
                               SourceExtension  "GL_ARB_gpu_shader_int64"
                               Name 4  "main"
-                              Name 18  "Buffers"
-                              MemberName 18(Buffers) 0  "i"
-                              MemberName 18(Buffers) 1  "uv"
-                              MemberName 18(Buffers) 2  "fv"
-                              MemberName 18(Buffers) 3  "dv"
-                              MemberName 18(Buffers) 4  "i64"
-                              MemberName 18(Buffers) 5  "u64v"
-                              MemberName 18(Buffers) 6  "f16v"
-                              Name 20  ""
-                              MemberDecorate 18(Buffers) 0 Offset 0
-                              MemberDecorate 18(Buffers) 1 Offset 8
-                              MemberDecorate 18(Buffers) 2 Offset 16
-                              MemberDecorate 18(Buffers) 3 Offset 32
-                              MemberDecorate 18(Buffers) 4 Offset 64
-                              MemberDecorate 18(Buffers) 5 Offset 80
-                              MemberDecorate 18(Buffers) 6 Offset 96
-                              Decorate 18(Buffers) BufferBlock
-                              Decorate 20 DescriptorSet 0
-                              Decorate 20 Binding 0
-                              Decorate 1047 BuiltIn WorkgroupSize
+                              Name 21  "Buffers"
+                              MemberName 21(Buffers) 0  "i"
+                              MemberName 21(Buffers) 1  "uv"
+                              MemberName 21(Buffers) 2  "fv"
+                              MemberName 21(Buffers) 3  "dv"
+                              MemberName 21(Buffers) 4  "i64"
+                              MemberName 21(Buffers) 5  "u64v"
+                              MemberName 21(Buffers) 6  "f16v"
+                              MemberName 21(Buffers) 7  "i16v"
+                              MemberName 21(Buffers) 8  "u16"
+                              Name 23  ""
+                              MemberDecorate 21(Buffers) 0 Offset 0
+                              MemberDecorate 21(Buffers) 1 Offset 8
+                              MemberDecorate 21(Buffers) 2 Offset 16
+                              MemberDecorate 21(Buffers) 3 Offset 32
+                              MemberDecorate 21(Buffers) 4 Offset 64
+                              MemberDecorate 21(Buffers) 5 Offset 80
+                              MemberDecorate 21(Buffers) 6 Offset 96
+                              MemberDecorate 21(Buffers) 7 Offset 104
+                              MemberDecorate 21(Buffers) 8 Offset 112
+                              Decorate 21(Buffers) BufferBlock
+                              Decorate 23 DescriptorSet 0
+                              Decorate 23 Binding 0
+                              Decorate 1342 BuiltIn WorkgroupSize
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 32 1
@@ -52,1169 +58,1500 @@
                9:             TypeFloat 32
               10:             TypeVector 9(float) 3
               11:             TypeFloat 64
-              12:             TypeVector 11(float) 4
+              12:             TypeVector 11(float64_t) 4
               13:             TypeInt 64 1
               14:             TypeInt 64 0
-              15:             TypeVector 14(int) 2
+              15:             TypeVector 14(int64_t) 2
               16:             TypeFloat 16
-              17:             TypeVector 16(float) 3
-     18(Buffers):             TypeStruct 6(int) 8(ivec2) 10(fvec3) 12(fvec4) 13(int) 15(ivec2) 17(fvec3)
-              19:             TypePointer Uniform 18(Buffers)
-              20:     19(ptr) Variable Uniform
-              21:      6(int) Constant 0
-              22:             TypePointer Uniform 6(int)
-              25:      7(int) Constant 3
-              28:      6(int) Constant 1
-              29:             TypePointer Uniform 8(ivec2)
-              38:      6(int) Constant 2
-              39:             TypePointer Uniform 10(fvec3)
-              50:      6(int) Constant 3
-              51:             TypePointer Uniform 12(fvec4)
-              64:      6(int) Constant 4
-              65:             TypePointer Uniform 13(int)
-              70:      6(int) Constant 5
-              71:             TypePointer Uniform 15(ivec2)
-              80:      6(int) Constant 6
-              81:             TypePointer Uniform 17(fvec3)
-            1044:             TypeVector 7(int) 3
-            1045:      7(int) Constant 8
-            1046:      7(int) Constant 1
-            1047: 1044(ivec3) ConstantComposite 1045 1045 1046
+              17:             TypeVector 16(float16_t) 3
+              18:             TypeInt 16 1
+              19:             TypeVector 18(int16_t) 4
+              20:             TypeInt 16 0
+     21(Buffers):             TypeStruct 6(int) 8(ivec2) 10(fvec3) 12(f64vec4) 13(int64_t) 15(i64vec2) 17(f16vec3) 19(i16vec4) 20(int16_t)
+              22:             TypePointer Uniform 21(Buffers)
+              23:     22(ptr) Variable Uniform
+              24:      6(int) Constant 0
+              25:             TypePointer Uniform 6(int)
+              28:      7(int) Constant 3
+              31:      6(int) Constant 1
+              32:             TypePointer Uniform 8(ivec2)
+              41:      6(int) Constant 2
+              42:             TypePointer Uniform 10(fvec3)
+              53:      6(int) Constant 3
+              54:             TypePointer Uniform 12(f64vec4)
+              67:      6(int) Constant 4
+              68:             TypePointer Uniform 13(int64_t)
+              73:      6(int) Constant 5
+              74:             TypePointer Uniform 15(i64vec2)
+              83:      6(int) Constant 6
+              84:             TypePointer Uniform 17(f16vec3)
+              95:      6(int) Constant 7
+              96:             TypePointer Uniform 19(i16vec4)
+             109:      6(int) Constant 8
+             110:             TypePointer Uniform 20(int16_t)
+            1339:             TypeVector 7(int) 3
+            1340:      7(int) Constant 8
+            1341:      7(int) Constant 1
+            1342: 1339(ivec3) ConstantComposite 1340 1340 1341
          4(main):           2 Function None 3
                5:             Label
-              23:     22(ptr) AccessChain 20 21
-              24:      6(int) Load 23
-              26:      6(int) GroupSMin 25 Reduce 24
-              27:     22(ptr) AccessChain 20 21
-                              Store 27 26
-              30:     29(ptr) AccessChain 20 28
-              31:    8(ivec2) Load 30
-              32:      7(int) CompositeExtract 31 0
-              33:      7(int) GroupUMin 25 Reduce 32
-              34:      7(int) CompositeExtract 31 1
-              35:      7(int) GroupUMin 25 Reduce 34
-              36:    8(ivec2) CompositeConstruct 33 35
-              37:     29(ptr) AccessChain 20 28
-                              Store 37 36
-              40:     39(ptr) AccessChain 20 38
-              41:   10(fvec3) Load 40
-              42:    9(float) CompositeExtract 41 0
-              43:    9(float) GroupFMin 25 Reduce 42
-              44:    9(float) CompositeExtract 41 1
-              45:    9(float) GroupFMin 25 Reduce 44
-              46:    9(float) CompositeExtract 41 2
-              47:    9(float) GroupFMin 25 Reduce 46
-              48:   10(fvec3) CompositeConstruct 43 45 47
-              49:     39(ptr) AccessChain 20 38
-                              Store 49 48
-              52:     51(ptr) AccessChain 20 50
-              53:   12(fvec4) Load 52
-              54:   11(float) CompositeExtract 53 0
-              55:   11(float) GroupFMin 25 Reduce 54
-              56:   11(float) CompositeExtract 53 1
-              57:   11(float) GroupFMin 25 Reduce 56
-              58:   11(float) CompositeExtract 53 2
-              59:   11(float) GroupFMin 25 Reduce 58
-              60:   11(float) CompositeExtract 53 3
-              61:   11(float) GroupFMin 25 Reduce 60
-              62:   12(fvec4) CompositeConstruct 55 57 59 61
-              63:     51(ptr) AccessChain 20 50
-                              Store 63 62
-              66:     65(ptr) AccessChain 20 64
-              67:     13(int) Load 66
-              68:     13(int) GroupSMin 25 Reduce 67
-              69:     65(ptr) AccessChain 20 64
-                              Store 69 68
-              72:     71(ptr) AccessChain 20 70
-              73:   15(ivec2) Load 72
-              74:     14(int) CompositeExtract 73 0
-              75:     14(int) GroupUMin 25 Reduce 74
-              76:     14(int) CompositeExtract 73 1
-              77:     14(int) GroupUMin 25 Reduce 76
-              78:   15(ivec2) CompositeConstruct 75 77
-              79:     71(ptr) AccessChain 20 70
-                              Store 79 78
-              82:     81(ptr) AccessChain 20 80
-              83:   17(fvec3) Load 82
-              84:   16(float) CompositeExtract 83 0
-              85:   16(float) GroupFMin 25 Reduce 84
-              86:   16(float) CompositeExtract 83 1
-              87:   16(float) GroupFMin 25 Reduce 86
-              88:   16(float) CompositeExtract 83 2
-              89:   16(float) GroupFMin 25 Reduce 88
-              90:   17(fvec3) CompositeConstruct 85 87 89
-              91:     81(ptr) AccessChain 20 80
-                              Store 91 90
-              92:     22(ptr) AccessChain 20 21
-              93:      6(int) Load 92
-              94:      6(int) GroupSMax 25 Reduce 93
-              95:     22(ptr) AccessChain 20 21
-                              Store 95 94
-              96:     29(ptr) AccessChain 20 28
-              97:    8(ivec2) Load 96
-              98:      7(int) CompositeExtract 97 0
-              99:      7(int) GroupUMax 25 Reduce 98
-             100:      7(int) CompositeExtract 97 1
-             101:      7(int) GroupUMax 25 Reduce 100
-             102:    8(ivec2) CompositeConstruct 99 101
-             103:     29(ptr) AccessChain 20 28
-                              Store 103 102
-             104:     39(ptr) AccessChain 20 38
-             105:   10(fvec3) Load 104
-             106:    9(float) CompositeExtract 105 0
-             107:    9(float) GroupFMax 25 Reduce 106
-             108:    9(float) CompositeExtract 105 1
-             109:    9(float) GroupFMax 25 Reduce 108
-             110:    9(float) CompositeExtract 105 2
-             111:    9(float) GroupFMax 25 Reduce 110
-             112:   10(fvec3) CompositeConstruct 107 109 111
-             113:     39(ptr) AccessChain 20 38
-                              Store 113 112
-             114:     51(ptr) AccessChain 20 50
-             115:   12(fvec4) Load 114
-             116:   11(float) CompositeExtract 115 0
-             117:   11(float) GroupFMax 25 Reduce 116
-             118:   11(float) CompositeExtract 115 1
-             119:   11(float) GroupFMax 25 Reduce 118
-             120:   11(float) CompositeExtract 115 2
-             121:   11(float) GroupFMax 25 Reduce 120
-             122:   11(float) CompositeExtract 115 3
-             123:   11(float) GroupFMax 25 Reduce 122
-             124:   12(fvec4) CompositeConstruct 117 119 121 123
-             125:     51(ptr) AccessChain 20 50
-                              Store 125 124
-             126:     65(ptr) AccessChain 20 64
-             127:     13(int) Load 126
-             128:     13(int) GroupSMax 25 Reduce 127
-             129:     65(ptr) AccessChain 20 64
-                              Store 129 128
-             130:     71(ptr) AccessChain 20 70
-             131:   15(ivec2) Load 130
-             132:     14(int) CompositeExtract 131 0
-             133:     14(int) GroupUMax 25 Reduce 132
-             134:     14(int) CompositeExtract 131 1
-             135:     14(int) GroupUMax 25 Reduce 134
-             136:   15(ivec2) CompositeConstruct 133 135
-             137:     71(ptr) AccessChain 20 70
-                              Store 137 136
-             138:     81(ptr) AccessChain 20 80
-             139:   17(fvec3) Load 138
-             140:   16(float) CompositeExtract 139 0
-             141:   16(float) GroupFMax 25 Reduce 140
-             142:   16(float) CompositeExtract 139 1
-             143:   16(float) GroupFMax 25 Reduce 142
-             144:   16(float) CompositeExtract 139 2
-             145:   16(float) GroupFMax 25 Reduce 144
-             146:   17(fvec3) CompositeConstruct 141 143 145
-             147:     81(ptr) AccessChain 20 80
-                              Store 147 146
-             148:     22(ptr) AccessChain 20 21
-             149:      6(int) Load 148
-             150:      6(int) GroupIAdd 25 Reduce 149
-             151:     22(ptr) AccessChain 20 21
-                              Store 151 150
-             152:     29(ptr) AccessChain 20 28
-             153:    8(ivec2) Load 152
-             154:      7(int) CompositeExtract 153 0
-             155:      7(int) GroupIAdd 25 Reduce 154
-             156:      7(int) CompositeExtract 153 1
-             157:      7(int) GroupIAdd 25 Reduce 156
-             158:    8(ivec2) CompositeConstruct 155 157
-             159:     29(ptr) AccessChain 20 28
-                              Store 159 158
-             160:     39(ptr) AccessChain 20 38
-             161:   10(fvec3) Load 160
-             162:    9(float) CompositeExtract 161 0
-             163:    9(float) GroupFAdd 25 Reduce 162
-             164:    9(float) CompositeExtract 161 1
-             165:    9(float) GroupFAdd 25 Reduce 164
-             166:    9(float) CompositeExtract 161 2
-             167:    9(float) GroupFAdd 25 Reduce 166
-             168:   10(fvec3) CompositeConstruct 163 165 167
-             169:     39(ptr) AccessChain 20 38
-                              Store 169 168
-             170:     51(ptr) AccessChain 20 50
-             171:   12(fvec4) Load 170
-             172:   11(float) CompositeExtract 171 0
-             173:   11(float) GroupFAdd 25 Reduce 172
-             174:   11(float) CompositeExtract 171 1
-             175:   11(float) GroupFAdd 25 Reduce 174
-             176:   11(float) CompositeExtract 171 2
-             177:   11(float) GroupFAdd 25 Reduce 176
-             178:   11(float) CompositeExtract 171 3
-             179:   11(float) GroupFAdd 25 Reduce 178
-             180:   12(fvec4) CompositeConstruct 173 175 177 179
-             181:     51(ptr) AccessChain 20 50
-                              Store 181 180
-             182:     65(ptr) AccessChain 20 64
-             183:     13(int) Load 182
-             184:     13(int) GroupIAdd 25 Reduce 183
-             185:     65(ptr) AccessChain 20 64
-                              Store 185 184
-             186:     71(ptr) AccessChain 20 70
-             187:   15(ivec2) Load 186
-             188:     14(int) CompositeExtract 187 0
-             189:     14(int) GroupIAdd 25 Reduce 188
-             190:     14(int) CompositeExtract 187 1
-             191:     14(int) GroupIAdd 25 Reduce 190
-             192:   15(ivec2) CompositeConstruct 189 191
-             193:     71(ptr) AccessChain 20 70
-                              Store 193 192
-             194:     81(ptr) AccessChain 20 80
-             195:   17(fvec3) Load 194
-             196:   16(float) CompositeExtract 195 0
-             197:   16(float) GroupFAdd 25 Reduce 196
-             198:   16(float) CompositeExtract 195 1
-             199:   16(float) GroupFAdd 25 Reduce 198
-             200:   16(float) CompositeExtract 195 2
-             201:   16(float) GroupFAdd 25 Reduce 200
-             202:   17(fvec3) CompositeConstruct 197 199 201
-             203:     81(ptr) AccessChain 20 80
-                              Store 203 202
-             204:     22(ptr) AccessChain 20 21
-             205:      6(int) Load 204
-             206:      6(int) GroupSMinNonUniformAMD 25 Reduce 205
-             207:     22(ptr) AccessChain 20 21
-                              Store 207 206
-             208:     29(ptr) AccessChain 20 28
-             209:    8(ivec2) Load 208
-             210:      7(int) CompositeExtract 209 0
-             211:      7(int) GroupUMinNonUniformAMD 25 Reduce 210
-             212:      7(int) CompositeExtract 209 1
-             213:      7(int) GroupUMinNonUniformAMD 25 Reduce 212
-             214:    8(ivec2) CompositeConstruct 211 213
-             215:     29(ptr) AccessChain 20 28
-                              Store 215 214
-             216:     39(ptr) AccessChain 20 38
-             217:   10(fvec3) Load 216
-             218:    9(float) CompositeExtract 217 0
-             219:    9(float) GroupFMinNonUniformAMD 25 Reduce 218
-             220:    9(float) CompositeExtract 217 1
-             221:    9(float) GroupFMinNonUniformAMD 25 Reduce 220
-             222:    9(float) CompositeExtract 217 2
-             223:    9(float) GroupFMinNonUniformAMD 25 Reduce 222
-             224:   10(fvec3) CompositeConstruct 219 221 223
-             225:     39(ptr) AccessChain 20 38
-                              Store 225 224
-             226:     51(ptr) AccessChain 20 50
-             227:   12(fvec4) Load 226
-             228:   11(float) CompositeExtract 227 0
-             229:   11(float) GroupFMinNonUniformAMD 25 Reduce 228
-             230:   11(float) CompositeExtract 227 1
-             231:   11(float) GroupFMinNonUniformAMD 25 Reduce 230
-             232:   11(float) CompositeExtract 227 2
-             233:   11(float) GroupFMinNonUniformAMD 25 Reduce 232
-             234:   11(float) CompositeExtract 227 3
-             235:   11(float) GroupFMinNonUniformAMD 25 Reduce 234
-             236:   12(fvec4) CompositeConstruct 229 231 233 235
-             237:     51(ptr) AccessChain 20 50
-                              Store 237 236
-             238:     65(ptr) AccessChain 20 64
-             239:     13(int) Load 238
-             240:     13(int) GroupSMinNonUniformAMD 25 Reduce 239
-             241:     65(ptr) AccessChain 20 64
-                              Store 241 240
-             242:     71(ptr) AccessChain 20 70
-             243:   15(ivec2) Load 242
-             244:     14(int) CompositeExtract 243 0
-             245:     14(int) GroupUMinNonUniformAMD 25 Reduce 244
-             246:     14(int) CompositeExtract 243 1
-             247:     14(int) GroupUMinNonUniformAMD 25 Reduce 246
-             248:   15(ivec2) CompositeConstruct 245 247
-             249:     71(ptr) AccessChain 20 70
-                              Store 249 248
-             250:     81(ptr) AccessChain 20 80
-             251:   17(fvec3) Load 250
-             252:   16(float) CompositeExtract 251 0
-             253:   16(float) GroupFMinNonUniformAMD 25 Reduce 252
-             254:   16(float) CompositeExtract 251 1
-             255:   16(float) GroupFMinNonUniformAMD 25 Reduce 254
-             256:   16(float) CompositeExtract 251 2
-             257:   16(float) GroupFMinNonUniformAMD 25 Reduce 256
-             258:   17(fvec3) CompositeConstruct 253 255 257
-             259:     81(ptr) AccessChain 20 80
-                              Store 259 258
-             260:     22(ptr) AccessChain 20 21
-             261:      6(int) Load 260
-             262:      6(int) GroupSMaxNonUniformAMD 25 Reduce 261
-             263:     22(ptr) AccessChain 20 21
-                              Store 263 262
-             264:     29(ptr) AccessChain 20 28
-             265:    8(ivec2) Load 264
-             266:      7(int) CompositeExtract 265 0
-             267:      7(int) GroupUMaxNonUniformAMD 25 Reduce 266
-             268:      7(int) CompositeExtract 265 1
-             269:      7(int) GroupUMaxNonUniformAMD 25 Reduce 268
-             270:    8(ivec2) CompositeConstruct 267 269
-             271:     29(ptr) AccessChain 20 28
-                              Store 271 270
-             272:     39(ptr) AccessChain 20 38
-             273:   10(fvec3) Load 272
-             274:    9(float) CompositeExtract 273 0
-             275:    9(float) GroupFMaxNonUniformAMD 25 Reduce 274
-             276:    9(float) CompositeExtract 273 1
-             277:    9(float) GroupFMaxNonUniformAMD 25 Reduce 276
-             278:    9(float) CompositeExtract 273 2
-             279:    9(float) GroupFMaxNonUniformAMD 25 Reduce 278
-             280:   10(fvec3) CompositeConstruct 275 277 279
-             281:     39(ptr) AccessChain 20 38
-                              Store 281 280
-             282:     51(ptr) AccessChain 20 50
-             283:   12(fvec4) Load 282
-             284:   11(float) CompositeExtract 283 0
-             285:   11(float) GroupFMaxNonUniformAMD 25 Reduce 284
-             286:   11(float) CompositeExtract 283 1
-             287:   11(float) GroupFMaxNonUniformAMD 25 Reduce 286
-             288:   11(float) CompositeExtract 283 2
-             289:   11(float) GroupFMaxNonUniformAMD 25 Reduce 288
-             290:   11(float) CompositeExtract 283 3
-             291:   11(float) GroupFMaxNonUniformAMD 25 Reduce 290
-             292:   12(fvec4) CompositeConstruct 285 287 289 291
-             293:     51(ptr) AccessChain 20 50
-                              Store 293 292
-             294:     65(ptr) AccessChain 20 64
-             295:     13(int) Load 294
-             296:     13(int) GroupSMaxNonUniformAMD 25 Reduce 295
-             297:     65(ptr) AccessChain 20 64
-                              Store 297 296
-             298:     71(ptr) AccessChain 20 70
-             299:   15(ivec2) Load 298
-             300:     14(int) CompositeExtract 299 0
-             301:     14(int) GroupUMaxNonUniformAMD 25 Reduce 300
-             302:     14(int) CompositeExtract 299 1
-             303:     14(int) GroupUMaxNonUniformAMD 25 Reduce 302
-             304:   15(ivec2) CompositeConstruct 301 303
-             305:     71(ptr) AccessChain 20 70
-                              Store 305 304
-             306:     81(ptr) AccessChain 20 80
-             307:   17(fvec3) Load 306
-             308:   16(float) CompositeExtract 307 0
-             309:   16(float) GroupFMaxNonUniformAMD 25 Reduce 308
-             310:   16(float) CompositeExtract 307 1
-             311:   16(float) GroupFMaxNonUniformAMD 25 Reduce 310
-             312:   16(float) CompositeExtract 307 2
-             313:   16(float) GroupFMaxNonUniformAMD 25 Reduce 312
-             314:   17(fvec3) CompositeConstruct 309 311 313
-             315:     81(ptr) AccessChain 20 80
-                              Store 315 314
-             316:     22(ptr) AccessChain 20 21
-             317:      6(int) Load 316
-             318:      6(int) GroupIAddNonUniformAMD 25 Reduce 317
-             319:     22(ptr) AccessChain 20 21
-                              Store 319 318
-             320:     29(ptr) AccessChain 20 28
-             321:    8(ivec2) Load 320
-             322:      7(int) CompositeExtract 321 0
-             323:      7(int) GroupIAddNonUniformAMD 25 Reduce 322
-             324:      7(int) CompositeExtract 321 1
-             325:      7(int) GroupIAddNonUniformAMD 25 Reduce 324
-             326:    8(ivec2) CompositeConstruct 323 325
-             327:     29(ptr) AccessChain 20 28
-                              Store 327 326
-             328:     39(ptr) AccessChain 20 38
-             329:   10(fvec3) Load 328
-             330:    9(float) CompositeExtract 329 0
-             331:    9(float) GroupFAddNonUniformAMD 25 Reduce 330
-             332:    9(float) CompositeExtract 329 1
-             333:    9(float) GroupFAddNonUniformAMD 25 Reduce 332
-             334:    9(float) CompositeExtract 329 2
-             335:    9(float) GroupFAddNonUniformAMD 25 Reduce 334
-             336:   10(fvec3) CompositeConstruct 331 333 335
-             337:     39(ptr) AccessChain 20 38
-                              Store 337 336
-             338:     51(ptr) AccessChain 20 50
-             339:   12(fvec4) Load 338
-             340:   11(float) CompositeExtract 339 0
-             341:   11(float) GroupFAddNonUniformAMD 25 Reduce 340
-             342:   11(float) CompositeExtract 339 1
-             343:   11(float) GroupFAddNonUniformAMD 25 Reduce 342
-             344:   11(float) CompositeExtract 339 2
-             345:   11(float) GroupFAddNonUniformAMD 25 Reduce 344
-             346:   11(float) CompositeExtract 339 3
-             347:   11(float) GroupFAddNonUniformAMD 25 Reduce 346
-             348:   12(fvec4) CompositeConstruct 341 343 345 347
-             349:     51(ptr) AccessChain 20 50
-                              Store 349 348
-             350:     65(ptr) AccessChain 20 64
-             351:     13(int) Load 350
-             352:     13(int) GroupIAddNonUniformAMD 25 Reduce 351
-             353:     65(ptr) AccessChain 20 64
-                              Store 353 352
-             354:     71(ptr) AccessChain 20 70
-             355:   15(ivec2) Load 354
-             356:     14(int) CompositeExtract 355 0
-             357:     14(int) GroupIAddNonUniformAMD 25 Reduce 356
-             358:     14(int) CompositeExtract 355 1
-             359:     14(int) GroupIAddNonUniformAMD 25 Reduce 358
-             360:   15(ivec2) CompositeConstruct 357 359
-             361:     71(ptr) AccessChain 20 70
-                              Store 361 360
-             362:     81(ptr) AccessChain 20 80
-             363:   17(fvec3) Load 362
-             364:   16(float) CompositeExtract 363 0
-             365:   16(float) GroupFAddNonUniformAMD 25 Reduce 364
-             366:   16(float) CompositeExtract 363 1
-             367:   16(float) GroupFAddNonUniformAMD 25 Reduce 366
-             368:   16(float) CompositeExtract 363 2
-             369:   16(float) GroupFAddNonUniformAMD 25 Reduce 368
-             370:   17(fvec3) CompositeConstruct 365 367 369
-             371:     81(ptr) AccessChain 20 80
-                              Store 371 370
-             372:     22(ptr) AccessChain 20 21
-             373:      6(int) Load 372
-             374:      6(int) GroupSMin 25 InclusiveScan 373
-             375:     22(ptr) AccessChain 20 21
-                              Store 375 374
-             376:     29(ptr) AccessChain 20 28
-             377:    8(ivec2) Load 376
-             378:      7(int) CompositeExtract 377 0
-             379:      7(int) GroupUMin 25 InclusiveScan 378
-             380:      7(int) CompositeExtract 377 1
-             381:      7(int) GroupUMin 25 InclusiveScan 380
-             382:    8(ivec2) CompositeConstruct 379 381
-             383:     29(ptr) AccessChain 20 28
-                              Store 383 382
-             384:     39(ptr) AccessChain 20 38
-             385:   10(fvec3) Load 384
-             386:    9(float) CompositeExtract 385 0
-             387:    9(float) GroupFMin 25 InclusiveScan 386
-             388:    9(float) CompositeExtract 385 1
-             389:    9(float) GroupFMin 25 InclusiveScan 388
-             390:    9(float) CompositeExtract 385 2
-             391:    9(float) GroupFMin 25 InclusiveScan 390
-             392:   10(fvec3) CompositeConstruct 387 389 391
-             393:     39(ptr) AccessChain 20 38
-                              Store 393 392
-             394:     51(ptr) AccessChain 20 50
-             395:   12(fvec4) Load 394
-             396:   11(float) CompositeExtract 395 0
-             397:   11(float) GroupFMin 25 InclusiveScan 396
-             398:   11(float) CompositeExtract 395 1
-             399:   11(float) GroupFMin 25 InclusiveScan 398
-             400:   11(float) CompositeExtract 395 2
-             401:   11(float) GroupFMin 25 InclusiveScan 400
-             402:   11(float) CompositeExtract 395 3
-             403:   11(float) GroupFMin 25 InclusiveScan 402
-             404:   12(fvec4) CompositeConstruct 397 399 401 403
-             405:     51(ptr) AccessChain 20 50
-                              Store 405 404
-             406:     65(ptr) AccessChain 20 64
-             407:     13(int) Load 406
-             408:     13(int) GroupSMin 25 InclusiveScan 407
-             409:     65(ptr) AccessChain 20 64
-                              Store 409 408
-             410:     71(ptr) AccessChain 20 70
-             411:   15(ivec2) Load 410
-             412:     14(int) CompositeExtract 411 0
-             413:     14(int) GroupUMin 25 InclusiveScan 412
-             414:     14(int) CompositeExtract 411 1
-             415:     14(int) GroupUMin 25 InclusiveScan 414
-             416:   15(ivec2) CompositeConstruct 413 415
-             417:     71(ptr) AccessChain 20 70
-                              Store 417 416
-             418:     81(ptr) AccessChain 20 80
-             419:   17(fvec3) Load 418
-             420:   16(float) CompositeExtract 419 0
-             421:   16(float) GroupFMin 25 InclusiveScan 420
-             422:   16(float) CompositeExtract 419 1
-             423:   16(float) GroupFMin 25 InclusiveScan 422
-             424:   16(float) CompositeExtract 419 2
-             425:   16(float) GroupFMin 25 InclusiveScan 424
-             426:   17(fvec3) CompositeConstruct 421 423 425
-             427:     81(ptr) AccessChain 20 80
-                              Store 427 426
-             428:     22(ptr) AccessChain 20 21
-             429:      6(int) Load 428
-             430:      6(int) GroupSMax 25 InclusiveScan 429
-             431:     22(ptr) AccessChain 20 21
-                              Store 431 430
-             432:     29(ptr) AccessChain 20 28
-             433:    8(ivec2) Load 432
-             434:      7(int) CompositeExtract 433 0
-             435:      7(int) GroupUMax 25 InclusiveScan 434
-             436:      7(int) CompositeExtract 433 1
-             437:      7(int) GroupUMax 25 InclusiveScan 436
-             438:    8(ivec2) CompositeConstruct 435 437
-             439:     29(ptr) AccessChain 20 28
-                              Store 439 438
-             440:     39(ptr) AccessChain 20 38
-             441:   10(fvec3) Load 440
-             442:    9(float) CompositeExtract 441 0
-             443:    9(float) GroupFMax 25 InclusiveScan 442
-             444:    9(float) CompositeExtract 441 1
-             445:    9(float) GroupFMax 25 InclusiveScan 444
-             446:    9(float) CompositeExtract 441 2
-             447:    9(float) GroupFMax 25 InclusiveScan 446
-             448:   10(fvec3) CompositeConstruct 443 445 447
-             449:     39(ptr) AccessChain 20 38
-                              Store 449 448
-             450:     51(ptr) AccessChain 20 50
-             451:   12(fvec4) Load 450
-             452:   11(float) CompositeExtract 451 0
-             453:   11(float) GroupFMax 25 InclusiveScan 452
-             454:   11(float) CompositeExtract 451 1
-             455:   11(float) GroupFMax 25 InclusiveScan 454
-             456:   11(float) CompositeExtract 451 2
-             457:   11(float) GroupFMax 25 InclusiveScan 456
-             458:   11(float) CompositeExtract 451 3
-             459:   11(float) GroupFMax 25 InclusiveScan 458
-             460:   12(fvec4) CompositeConstruct 453 455 457 459
-             461:     51(ptr) AccessChain 20 50
-                              Store 461 460
-             462:     65(ptr) AccessChain 20 64
-             463:     13(int) Load 462
-             464:     13(int) GroupSMax 25 InclusiveScan 463
-             465:     65(ptr) AccessChain 20 64
-                              Store 465 464
-             466:     71(ptr) AccessChain 20 70
-             467:   15(ivec2) Load 466
-             468:     14(int) CompositeExtract 467 0
-             469:     14(int) GroupUMax 25 InclusiveScan 468
-             470:     14(int) CompositeExtract 467 1
-             471:     14(int) GroupUMax 25 InclusiveScan 470
-             472:   15(ivec2) CompositeConstruct 469 471
-             473:     71(ptr) AccessChain 20 70
-                              Store 473 472
-             474:     81(ptr) AccessChain 20 80
-             475:   17(fvec3) Load 474
-             476:   16(float) CompositeExtract 475 0
-             477:   16(float) GroupFMax 25 InclusiveScan 476
-             478:   16(float) CompositeExtract 475 1
-             479:   16(float) GroupFMax 25 InclusiveScan 478
-             480:   16(float) CompositeExtract 475 2
-             481:   16(float) GroupFMax 25 InclusiveScan 480
-             482:   17(fvec3) CompositeConstruct 477 479 481
-             483:     81(ptr) AccessChain 20 80
-                              Store 483 482
-             484:     22(ptr) AccessChain 20 21
-             485:      6(int) Load 484
-             486:      6(int) GroupIAdd 25 InclusiveScan 485
-             487:     22(ptr) AccessChain 20 21
-                              Store 487 486
-             488:     29(ptr) AccessChain 20 28
-             489:    8(ivec2) Load 488
-             490:      7(int) CompositeExtract 489 0
-             491:      7(int) GroupIAdd 25 InclusiveScan 490
-             492:      7(int) CompositeExtract 489 1
-             493:      7(int) GroupIAdd 25 InclusiveScan 492
-             494:    8(ivec2) CompositeConstruct 491 493
-             495:     29(ptr) AccessChain 20 28
-                              Store 495 494
-             496:     39(ptr) AccessChain 20 38
-             497:   10(fvec3) Load 496
-             498:    9(float) CompositeExtract 497 0
-             499:    9(float) GroupFAdd 25 InclusiveScan 498
-             500:    9(float) CompositeExtract 497 1
-             501:    9(float) GroupFAdd 25 InclusiveScan 500
-             502:    9(float) CompositeExtract 497 2
-             503:    9(float) GroupFAdd 25 InclusiveScan 502
-             504:   10(fvec3) CompositeConstruct 499 501 503
-             505:     39(ptr) AccessChain 20 38
-                              Store 505 504
-             506:     51(ptr) AccessChain 20 50
-             507:   12(fvec4) Load 506
-             508:   11(float) CompositeExtract 507 0
-             509:   11(float) GroupFAdd 25 InclusiveScan 508
-             510:   11(float) CompositeExtract 507 1
-             511:   11(float) GroupFAdd 25 InclusiveScan 510
-             512:   11(float) CompositeExtract 507 2
-             513:   11(float) GroupFAdd 25 InclusiveScan 512
-             514:   11(float) CompositeExtract 507 3
-             515:   11(float) GroupFAdd 25 InclusiveScan 514
-             516:   12(fvec4) CompositeConstruct 509 511 513 515
-             517:     51(ptr) AccessChain 20 50
-                              Store 517 516
-             518:     65(ptr) AccessChain 20 64
-             519:     13(int) Load 518
-             520:     13(int) GroupIAdd 25 InclusiveScan 519
-             521:     65(ptr) AccessChain 20 64
-                              Store 521 520
-             522:     71(ptr) AccessChain 20 70
-             523:   15(ivec2) Load 522
-             524:     14(int) CompositeExtract 523 0
-             525:     14(int) GroupIAdd 25 InclusiveScan 524
-             526:     14(int) CompositeExtract 523 1
-             527:     14(int) GroupIAdd 25 InclusiveScan 526
-             528:   15(ivec2) CompositeConstruct 525 527
-             529:     71(ptr) AccessChain 20 70
-                              Store 529 528
-             530:     81(ptr) AccessChain 20 80
-             531:   17(fvec3) Load 530
-             532:   16(float) CompositeExtract 531 0
-             533:   16(float) GroupFAdd 25 InclusiveScan 532
-             534:   16(float) CompositeExtract 531 1
-             535:   16(float) GroupFAdd 25 InclusiveScan 534
-             536:   16(float) CompositeExtract 531 2
-             537:   16(float) GroupFAdd 25 InclusiveScan 536
-             538:   17(fvec3) CompositeConstruct 533 535 537
-             539:     81(ptr) AccessChain 20 80
-                              Store 539 538
-             540:     22(ptr) AccessChain 20 21
-             541:      6(int) Load 540
-             542:      6(int) GroupSMin 25 ExclusiveScan 541
-             543:     22(ptr) AccessChain 20 21
-                              Store 543 542
-             544:     29(ptr) AccessChain 20 28
-             545:    8(ivec2) Load 544
-             546:      7(int) CompositeExtract 545 0
-             547:      7(int) GroupUMin 25 ExclusiveScan 546
-             548:      7(int) CompositeExtract 545 1
-             549:      7(int) GroupUMin 25 ExclusiveScan 548
-             550:    8(ivec2) CompositeConstruct 547 549
-             551:     29(ptr) AccessChain 20 28
-                              Store 551 550
-             552:     39(ptr) AccessChain 20 38
-             553:   10(fvec3) Load 552
-             554:    9(float) CompositeExtract 553 0
-             555:    9(float) GroupFMin 25 ExclusiveScan 554
-             556:    9(float) CompositeExtract 553 1
-             557:    9(float) GroupFMin 25 ExclusiveScan 556
-             558:    9(float) CompositeExtract 553 2
-             559:    9(float) GroupFMin 25 ExclusiveScan 558
-             560:   10(fvec3) CompositeConstruct 555 557 559
-             561:     39(ptr) AccessChain 20 38
-                              Store 561 560
-             562:     51(ptr) AccessChain 20 50
-             563:   12(fvec4) Load 562
-             564:   11(float) CompositeExtract 563 0
-             565:   11(float) GroupFMin 25 ExclusiveScan 564
-             566:   11(float) CompositeExtract 563 1
-             567:   11(float) GroupFMin 25 ExclusiveScan 566
-             568:   11(float) CompositeExtract 563 2
-             569:   11(float) GroupFMin 25 ExclusiveScan 568
-             570:   11(float) CompositeExtract 563 3
-             571:   11(float) GroupFMin 25 ExclusiveScan 570
-             572:   12(fvec4) CompositeConstruct 565 567 569 571
-             573:     51(ptr) AccessChain 20 50
-                              Store 573 572
-             574:     65(ptr) AccessChain 20 64
-             575:     13(int) Load 574
-             576:     13(int) GroupSMin 25 ExclusiveScan 575
-             577:     65(ptr) AccessChain 20 64
-                              Store 577 576
-             578:     71(ptr) AccessChain 20 70
-             579:   15(ivec2) Load 578
-             580:     14(int) CompositeExtract 579 0
-             581:     14(int) GroupUMin 25 ExclusiveScan 580
-             582:     14(int) CompositeExtract 579 1
-             583:     14(int) GroupUMin 25 ExclusiveScan 582
-             584:   15(ivec2) CompositeConstruct 581 583
-             585:     71(ptr) AccessChain 20 70
-                              Store 585 584
-             586:     81(ptr) AccessChain 20 80
-             587:   17(fvec3) Load 586
-             588:   16(float) CompositeExtract 587 0
-             589:   16(float) GroupFMin 25 ExclusiveScan 588
-             590:   16(float) CompositeExtract 587 1
-             591:   16(float) GroupFMin 25 ExclusiveScan 590
-             592:   16(float) CompositeExtract 587 2
-             593:   16(float) GroupFMin 25 ExclusiveScan 592
-             594:   17(fvec3) CompositeConstruct 589 591 593
-             595:     81(ptr) AccessChain 20 80
-                              Store 595 594
-             596:     22(ptr) AccessChain 20 21
-             597:      6(int) Load 596
-             598:      6(int) GroupSMax 25 ExclusiveScan 597
-             599:     22(ptr) AccessChain 20 21
-                              Store 599 598
-             600:     29(ptr) AccessChain 20 28
-             601:    8(ivec2) Load 600
-             602:      7(int) CompositeExtract 601 0
-             603:      7(int) GroupUMax 25 ExclusiveScan 602
-             604:      7(int) CompositeExtract 601 1
-             605:      7(int) GroupUMax 25 ExclusiveScan 604
-             606:    8(ivec2) CompositeConstruct 603 605
-             607:     29(ptr) AccessChain 20 28
-                              Store 607 606
-             608:     39(ptr) AccessChain 20 38
-             609:   10(fvec3) Load 608
-             610:    9(float) CompositeExtract 609 0
-             611:    9(float) GroupFMax 25 ExclusiveScan 610
-             612:    9(float) CompositeExtract 609 1
-             613:    9(float) GroupFMax 25 ExclusiveScan 612
-             614:    9(float) CompositeExtract 609 2
-             615:    9(float) GroupFMax 25 ExclusiveScan 614
-             616:   10(fvec3) CompositeConstruct 611 613 615
-             617:     39(ptr) AccessChain 20 38
-                              Store 617 616
-             618:     51(ptr) AccessChain 20 50
-             619:   12(fvec4) Load 618
-             620:   11(float) CompositeExtract 619 0
-             621:   11(float) GroupFMax 25 ExclusiveScan 620
-             622:   11(float) CompositeExtract 619 1
-             623:   11(float) GroupFMax 25 ExclusiveScan 622
-             624:   11(float) CompositeExtract 619 2
-             625:   11(float) GroupFMax 25 ExclusiveScan 624
-             626:   11(float) CompositeExtract 619 3
-             627:   11(float) GroupFMax 25 ExclusiveScan 626
-             628:   12(fvec4) CompositeConstruct 621 623 625 627
-             629:     51(ptr) AccessChain 20 50
-                              Store 629 628
-             630:     65(ptr) AccessChain 20 64
-             631:     13(int) Load 630
-             632:     13(int) GroupSMax 25 ExclusiveScan 631
-             633:     65(ptr) AccessChain 20 64
-                              Store 633 632
-             634:     71(ptr) AccessChain 20 70
-             635:   15(ivec2) Load 634
-             636:     14(int) CompositeExtract 635 0
-             637:     14(int) GroupUMax 25 ExclusiveScan 636
-             638:     14(int) CompositeExtract 635 1
-             639:     14(int) GroupUMax 25 ExclusiveScan 638
-             640:   15(ivec2) CompositeConstruct 637 639
-             641:     71(ptr) AccessChain 20 70
-                              Store 641 640
-             642:     81(ptr) AccessChain 20 80
-             643:   17(fvec3) Load 642
-             644:   16(float) CompositeExtract 643 0
-             645:   16(float) GroupFMax 25 ExclusiveScan 644
-             646:   16(float) CompositeExtract 643 1
-             647:   16(float) GroupFMax 25 ExclusiveScan 646
-             648:   16(float) CompositeExtract 643 2
-             649:   16(float) GroupFMax 25 ExclusiveScan 648
-             650:   17(fvec3) CompositeConstruct 645 647 649
-             651:     81(ptr) AccessChain 20 80
-                              Store 651 650
-             652:     22(ptr) AccessChain 20 21
-             653:      6(int) Load 652
-             654:      6(int) GroupIAdd 25 ExclusiveScan 653
-             655:     22(ptr) AccessChain 20 21
-                              Store 655 654
-             656:     29(ptr) AccessChain 20 28
-             657:    8(ivec2) Load 656
-             658:      7(int) CompositeExtract 657 0
-             659:      7(int) GroupIAdd 25 ExclusiveScan 658
-             660:      7(int) CompositeExtract 657 1
-             661:      7(int) GroupIAdd 25 ExclusiveScan 660
-             662:    8(ivec2) CompositeConstruct 659 661
-             663:     29(ptr) AccessChain 20 28
-                              Store 663 662
-             664:     39(ptr) AccessChain 20 38
-             665:   10(fvec3) Load 664
-             666:    9(float) CompositeExtract 665 0
-             667:    9(float) GroupFAdd 25 ExclusiveScan 666
-             668:    9(float) CompositeExtract 665 1
-             669:    9(float) GroupFAdd 25 ExclusiveScan 668
-             670:    9(float) CompositeExtract 665 2
-             671:    9(float) GroupFAdd 25 ExclusiveScan 670
-             672:   10(fvec3) CompositeConstruct 667 669 671
-             673:     39(ptr) AccessChain 20 38
-                              Store 673 672
-             674:     51(ptr) AccessChain 20 50
-             675:   12(fvec4) Load 674
-             676:   11(float) CompositeExtract 675 0
-             677:   11(float) GroupFAdd 25 ExclusiveScan 676
-             678:   11(float) CompositeExtract 675 1
-             679:   11(float) GroupFAdd 25 ExclusiveScan 678
-             680:   11(float) CompositeExtract 675 2
-             681:   11(float) GroupFAdd 25 ExclusiveScan 680
-             682:   11(float) CompositeExtract 675 3
-             683:   11(float) GroupFAdd 25 ExclusiveScan 682
-             684:   12(fvec4) CompositeConstruct 677 679 681 683
-             685:     51(ptr) AccessChain 20 50
-                              Store 685 684
-             686:     65(ptr) AccessChain 20 64
-             687:     13(int) Load 686
-             688:     13(int) GroupIAdd 25 ExclusiveScan 687
-             689:     65(ptr) AccessChain 20 64
-                              Store 689 688
-             690:     71(ptr) AccessChain 20 70
-             691:   15(ivec2) Load 690
-             692:     14(int) CompositeExtract 691 0
-             693:     14(int) GroupIAdd 25 ExclusiveScan 692
-             694:     14(int) CompositeExtract 691 1
-             695:     14(int) GroupIAdd 25 ExclusiveScan 694
-             696:   15(ivec2) CompositeConstruct 693 695
-             697:     71(ptr) AccessChain 20 70
-                              Store 697 696
-             698:     81(ptr) AccessChain 20 80
-             699:   17(fvec3) Load 698
-             700:   16(float) CompositeExtract 699 0
-             701:   16(float) GroupFAdd 25 ExclusiveScan 700
-             702:   16(float) CompositeExtract 699 1
-             703:   16(float) GroupFAdd 25 ExclusiveScan 702
-             704:   16(float) CompositeExtract 699 2
-             705:   16(float) GroupFAdd 25 ExclusiveScan 704
-             706:   17(fvec3) CompositeConstruct 701 703 705
-             707:     81(ptr) AccessChain 20 80
-                              Store 707 706
-             708:     22(ptr) AccessChain 20 21
-             709:      6(int) Load 708
-             710:      6(int) GroupSMinNonUniformAMD 25 InclusiveScan 709
-             711:     22(ptr) AccessChain 20 21
-                              Store 711 710
-             712:     29(ptr) AccessChain 20 28
-             713:    8(ivec2) Load 712
-             714:      7(int) CompositeExtract 713 0
-             715:      7(int) GroupUMinNonUniformAMD 25 InclusiveScan 714
-             716:      7(int) CompositeExtract 713 1
-             717:      7(int) GroupUMinNonUniformAMD 25 InclusiveScan 716
-             718:    8(ivec2) CompositeConstruct 715 717
-             719:     29(ptr) AccessChain 20 28
-                              Store 719 718
-             720:     39(ptr) AccessChain 20 38
-             721:   10(fvec3) Load 720
-             722:    9(float) CompositeExtract 721 0
-             723:    9(float) GroupFMinNonUniformAMD 25 InclusiveScan 722
-             724:    9(float) CompositeExtract 721 1
-             725:    9(float) GroupFMinNonUniformAMD 25 InclusiveScan 724
-             726:    9(float) CompositeExtract 721 2
-             727:    9(float) GroupFMinNonUniformAMD 25 InclusiveScan 726
-             728:   10(fvec3) CompositeConstruct 723 725 727
-             729:     39(ptr) AccessChain 20 38
-                              Store 729 728
-             730:     51(ptr) AccessChain 20 50
-             731:   12(fvec4) Load 730
-             732:   11(float) CompositeExtract 731 0
-             733:   11(float) GroupFMinNonUniformAMD 25 InclusiveScan 732
-             734:   11(float) CompositeExtract 731 1
-             735:   11(float) GroupFMinNonUniformAMD 25 InclusiveScan 734
-             736:   11(float) CompositeExtract 731 2
-             737:   11(float) GroupFMinNonUniformAMD 25 InclusiveScan 736
-             738:   11(float) CompositeExtract 731 3
-             739:   11(float) GroupFMinNonUniformAMD 25 InclusiveScan 738
-             740:   12(fvec4) CompositeConstruct 733 735 737 739
-             741:     51(ptr) AccessChain 20 50
-                              Store 741 740
-             742:     65(ptr) AccessChain 20 64
-             743:     13(int) Load 742
-             744:     13(int) GroupSMinNonUniformAMD 25 InclusiveScan 743
-             745:     65(ptr) AccessChain 20 64
-                              Store 745 744
-             746:     71(ptr) AccessChain 20 70
-             747:   15(ivec2) Load 746
-             748:     14(int) CompositeExtract 747 0
-             749:     14(int) GroupUMinNonUniformAMD 25 InclusiveScan 748
-             750:     14(int) CompositeExtract 747 1
-             751:     14(int) GroupUMinNonUniformAMD 25 InclusiveScan 750
-             752:   15(ivec2) CompositeConstruct 749 751
-             753:     71(ptr) AccessChain 20 70
-                              Store 753 752
-             754:     81(ptr) AccessChain 20 80
-             755:   17(fvec3) Load 754
-             756:   16(float) CompositeExtract 755 0
-             757:   16(float) GroupFMinNonUniformAMD 25 InclusiveScan 756
-             758:   16(float) CompositeExtract 755 1
-             759:   16(float) GroupFMinNonUniformAMD 25 InclusiveScan 758
-             760:   16(float) CompositeExtract 755 2
-             761:   16(float) GroupFMinNonUniformAMD 25 InclusiveScan 760
-             762:   17(fvec3) CompositeConstruct 757 759 761
-             763:     81(ptr) AccessChain 20 80
-                              Store 763 762
-             764:     22(ptr) AccessChain 20 21
-             765:      6(int) Load 764
-             766:      6(int) GroupSMaxNonUniformAMD 25 InclusiveScan 765
-             767:     22(ptr) AccessChain 20 21
-                              Store 767 766
-             768:     29(ptr) AccessChain 20 28
-             769:    8(ivec2) Load 768
-             770:      7(int) CompositeExtract 769 0
-             771:      7(int) GroupUMaxNonUniformAMD 25 InclusiveScan 770
-             772:      7(int) CompositeExtract 769 1
-             773:      7(int) GroupUMaxNonUniformAMD 25 InclusiveScan 772
-             774:    8(ivec2) CompositeConstruct 771 773
-             775:     29(ptr) AccessChain 20 28
-                              Store 775 774
-             776:     39(ptr) AccessChain 20 38
-             777:   10(fvec3) Load 776
-             778:    9(float) CompositeExtract 777 0
-             779:    9(float) GroupFMaxNonUniformAMD 25 InclusiveScan 778
-             780:    9(float) CompositeExtract 777 1
-             781:    9(float) GroupFMaxNonUniformAMD 25 InclusiveScan 780
-             782:    9(float) CompositeExtract 777 2
-             783:    9(float) GroupFMaxNonUniformAMD 25 InclusiveScan 782
-             784:   10(fvec3) CompositeConstruct 779 781 783
-             785:     39(ptr) AccessChain 20 38
-                              Store 785 784
-             786:     51(ptr) AccessChain 20 50
-             787:   12(fvec4) Load 786
-             788:   11(float) CompositeExtract 787 0
-             789:   11(float) GroupFMaxNonUniformAMD 25 InclusiveScan 788
-             790:   11(float) CompositeExtract 787 1
-             791:   11(float) GroupFMaxNonUniformAMD 25 InclusiveScan 790
-             792:   11(float) CompositeExtract 787 2
-             793:   11(float) GroupFMaxNonUniformAMD 25 InclusiveScan 792
-             794:   11(float) CompositeExtract 787 3
-             795:   11(float) GroupFMaxNonUniformAMD 25 InclusiveScan 794
-             796:   12(fvec4) CompositeConstruct 789 791 793 795
-             797:     51(ptr) AccessChain 20 50
-                              Store 797 796
-             798:     65(ptr) AccessChain 20 64
-             799:     13(int) Load 798
-             800:     13(int) GroupSMaxNonUniformAMD 25 InclusiveScan 799
-             801:     65(ptr) AccessChain 20 64
-                              Store 801 800
-             802:     71(ptr) AccessChain 20 70
-             803:   15(ivec2) Load 802
-             804:     14(int) CompositeExtract 803 0
-             805:     14(int) GroupUMaxNonUniformAMD 25 InclusiveScan 804
-             806:     14(int) CompositeExtract 803 1
-             807:     14(int) GroupUMaxNonUniformAMD 25 InclusiveScan 806
-             808:   15(ivec2) CompositeConstruct 805 807
-             809:     71(ptr) AccessChain 20 70
-                              Store 809 808
-             810:     81(ptr) AccessChain 20 80
-             811:   17(fvec3) Load 810
-             812:   16(float) CompositeExtract 811 0
-             813:   16(float) GroupFMaxNonUniformAMD 25 InclusiveScan 812
-             814:   16(float) CompositeExtract 811 1
-             815:   16(float) GroupFMaxNonUniformAMD 25 InclusiveScan 814
-             816:   16(float) CompositeExtract 811 2
-             817:   16(float) GroupFMaxNonUniformAMD 25 InclusiveScan 816
-             818:   17(fvec3) CompositeConstruct 813 815 817
-             819:     81(ptr) AccessChain 20 80
-                              Store 819 818
-             820:     22(ptr) AccessChain 20 21
-             821:      6(int) Load 820
-             822:      6(int) GroupIAddNonUniformAMD 25 InclusiveScan 821
-             823:     22(ptr) AccessChain 20 21
-                              Store 823 822
-             824:     29(ptr) AccessChain 20 28
-             825:    8(ivec2) Load 824
-             826:      7(int) CompositeExtract 825 0
-             827:      7(int) GroupIAddNonUniformAMD 25 InclusiveScan 826
-             828:      7(int) CompositeExtract 825 1
-             829:      7(int) GroupIAddNonUniformAMD 25 InclusiveScan 828
-             830:    8(ivec2) CompositeConstruct 827 829
-             831:     29(ptr) AccessChain 20 28
-                              Store 831 830
-             832:     39(ptr) AccessChain 20 38
-             833:   10(fvec3) Load 832
-             834:    9(float) CompositeExtract 833 0
-             835:    9(float) GroupFAddNonUniformAMD 25 InclusiveScan 834
-             836:    9(float) CompositeExtract 833 1
-             837:    9(float) GroupFAddNonUniformAMD 25 InclusiveScan 836
-             838:    9(float) CompositeExtract 833 2
-             839:    9(float) GroupFAddNonUniformAMD 25 InclusiveScan 838
-             840:   10(fvec3) CompositeConstruct 835 837 839
-             841:     39(ptr) AccessChain 20 38
-                              Store 841 840
-             842:     51(ptr) AccessChain 20 50
-             843:   12(fvec4) Load 842
-             844:   11(float) CompositeExtract 843 0
-             845:   11(float) GroupFAddNonUniformAMD 25 InclusiveScan 844
-             846:   11(float) CompositeExtract 843 1
-             847:   11(float) GroupFAddNonUniformAMD 25 InclusiveScan 846
-             848:   11(float) CompositeExtract 843 2
-             849:   11(float) GroupFAddNonUniformAMD 25 InclusiveScan 848
-             850:   11(float) CompositeExtract 843 3
-             851:   11(float) GroupFAddNonUniformAMD 25 InclusiveScan 850
-             852:   12(fvec4) CompositeConstruct 845 847 849 851
-             853:     51(ptr) AccessChain 20 50
-                              Store 853 852
-             854:     65(ptr) AccessChain 20 64
-             855:     13(int) Load 854
-             856:     13(int) GroupIAddNonUniformAMD 25 InclusiveScan 855
-             857:     65(ptr) AccessChain 20 64
-                              Store 857 856
-             858:     71(ptr) AccessChain 20 70
-             859:   15(ivec2) Load 858
-             860:     14(int) CompositeExtract 859 0
-             861:     14(int) GroupIAddNonUniformAMD 25 InclusiveScan 860
-             862:     14(int) CompositeExtract 859 1
-             863:     14(int) GroupIAddNonUniformAMD 25 InclusiveScan 862
-             864:   15(ivec2) CompositeConstruct 861 863
-             865:     71(ptr) AccessChain 20 70
-                              Store 865 864
-             866:     81(ptr) AccessChain 20 80
-             867:   17(fvec3) Load 866
-             868:   16(float) CompositeExtract 867 0
-             869:   16(float) GroupFAddNonUniformAMD 25 InclusiveScan 868
-             870:   16(float) CompositeExtract 867 1
-             871:   16(float) GroupFAddNonUniformAMD 25 InclusiveScan 870
-             872:   16(float) CompositeExtract 867 2
-             873:   16(float) GroupFAddNonUniformAMD 25 InclusiveScan 872
-             874:   17(fvec3) CompositeConstruct 869 871 873
-             875:     81(ptr) AccessChain 20 80
-                              Store 875 874
-             876:     22(ptr) AccessChain 20 21
-             877:      6(int) Load 876
-             878:      6(int) GroupSMinNonUniformAMD 25 ExclusiveScan 877
-             879:     22(ptr) AccessChain 20 21
-                              Store 879 878
-             880:     29(ptr) AccessChain 20 28
-             881:    8(ivec2) Load 880
-             882:      7(int) CompositeExtract 881 0
-             883:      7(int) GroupUMinNonUniformAMD 25 ExclusiveScan 882
-             884:      7(int) CompositeExtract 881 1
-             885:      7(int) GroupUMinNonUniformAMD 25 ExclusiveScan 884
-             886:    8(ivec2) CompositeConstruct 883 885
-             887:     29(ptr) AccessChain 20 28
-                              Store 887 886
-             888:     39(ptr) AccessChain 20 38
-             889:   10(fvec3) Load 888
-             890:    9(float) CompositeExtract 889 0
-             891:    9(float) GroupFMinNonUniformAMD 25 ExclusiveScan 890
-             892:    9(float) CompositeExtract 889 1
-             893:    9(float) GroupFMinNonUniformAMD 25 ExclusiveScan 892
-             894:    9(float) CompositeExtract 889 2
-             895:    9(float) GroupFMinNonUniformAMD 25 ExclusiveScan 894
-             896:   10(fvec3) CompositeConstruct 891 893 895
-             897:     39(ptr) AccessChain 20 38
-                              Store 897 896
-             898:     51(ptr) AccessChain 20 50
-             899:   12(fvec4) Load 898
-             900:   11(float) CompositeExtract 899 0
-             901:   11(float) GroupFMinNonUniformAMD 25 ExclusiveScan 900
-             902:   11(float) CompositeExtract 899 1
-             903:   11(float) GroupFMinNonUniformAMD 25 ExclusiveScan 902
-             904:   11(float) CompositeExtract 899 2
-             905:   11(float) GroupFMinNonUniformAMD 25 ExclusiveScan 904
-             906:   11(float) CompositeExtract 899 3
-             907:   11(float) GroupFMinNonUniformAMD 25 ExclusiveScan 906
-             908:   12(fvec4) CompositeConstruct 901 903 905 907
-             909:     51(ptr) AccessChain 20 50
-                              Store 909 908
-             910:     65(ptr) AccessChain 20 64
-             911:     13(int) Load 910
-             912:     13(int) GroupSMinNonUniformAMD 25 ExclusiveScan 911
-             913:     65(ptr) AccessChain 20 64
-                              Store 913 912
-             914:     71(ptr) AccessChain 20 70
-             915:   15(ivec2) Load 914
-             916:     14(int) CompositeExtract 915 0
-             917:     14(int) GroupUMinNonUniformAMD 25 ExclusiveScan 916
-             918:     14(int) CompositeExtract 915 1
-             919:     14(int) GroupUMinNonUniformAMD 25 ExclusiveScan 918
-             920:   15(ivec2) CompositeConstruct 917 919
-             921:     71(ptr) AccessChain 20 70
-                              Store 921 920
-             922:     81(ptr) AccessChain 20 80
-             923:   17(fvec3) Load 922
-             924:   16(float) CompositeExtract 923 0
-             925:   16(float) GroupFMinNonUniformAMD 25 ExclusiveScan 924
-             926:   16(float) CompositeExtract 923 1
-             927:   16(float) GroupFMinNonUniformAMD 25 ExclusiveScan 926
-             928:   16(float) CompositeExtract 923 2
-             929:   16(float) GroupFMinNonUniformAMD 25 ExclusiveScan 928
-             930:   17(fvec3) CompositeConstruct 925 927 929
-             931:     81(ptr) AccessChain 20 80
-                              Store 931 930
-             932:     22(ptr) AccessChain 20 21
-             933:      6(int) Load 932
-             934:      6(int) GroupSMaxNonUniformAMD 25 ExclusiveScan 933
-             935:     22(ptr) AccessChain 20 21
-                              Store 935 934
-             936:     29(ptr) AccessChain 20 28
-             937:    8(ivec2) Load 936
-             938:      7(int) CompositeExtract 937 0
-             939:      7(int) GroupUMaxNonUniformAMD 25 ExclusiveScan 938
-             940:      7(int) CompositeExtract 937 1
-             941:      7(int) GroupUMaxNonUniformAMD 25 ExclusiveScan 940
-             942:    8(ivec2) CompositeConstruct 939 941
-             943:     29(ptr) AccessChain 20 28
-                              Store 943 942
-             944:     39(ptr) AccessChain 20 38
-             945:   10(fvec3) Load 944
-             946:    9(float) CompositeExtract 945 0
-             947:    9(float) GroupFMaxNonUniformAMD 25 ExclusiveScan 946
-             948:    9(float) CompositeExtract 945 1
-             949:    9(float) GroupFMaxNonUniformAMD 25 ExclusiveScan 948
-             950:    9(float) CompositeExtract 945 2
-             951:    9(float) GroupFMaxNonUniformAMD 25 ExclusiveScan 950
-             952:   10(fvec3) CompositeConstruct 947 949 951
-             953:     39(ptr) AccessChain 20 38
-                              Store 953 952
-             954:     51(ptr) AccessChain 20 50
-             955:   12(fvec4) Load 954
-             956:   11(float) CompositeExtract 955 0
-             957:   11(float) GroupFMaxNonUniformAMD 25 ExclusiveScan 956
-             958:   11(float) CompositeExtract 955 1
-             959:   11(float) GroupFMaxNonUniformAMD 25 ExclusiveScan 958
-             960:   11(float) CompositeExtract 955 2
-             961:   11(float) GroupFMaxNonUniformAMD 25 ExclusiveScan 960
-             962:   11(float) CompositeExtract 955 3
-             963:   11(float) GroupFMaxNonUniformAMD 25 ExclusiveScan 962
-             964:   12(fvec4) CompositeConstruct 957 959 961 963
-             965:     51(ptr) AccessChain 20 50
-                              Store 965 964
-             966:     65(ptr) AccessChain 20 64
-             967:     13(int) Load 966
-             968:     13(int) GroupSMaxNonUniformAMD 25 ExclusiveScan 967
-             969:     65(ptr) AccessChain 20 64
-                              Store 969 968
-             970:     71(ptr) AccessChain 20 70
-             971:   15(ivec2) Load 970
-             972:     14(int) CompositeExtract 971 0
-             973:     14(int) GroupUMaxNonUniformAMD 25 ExclusiveScan 972
-             974:     14(int) CompositeExtract 971 1
-             975:     14(int) GroupUMaxNonUniformAMD 25 ExclusiveScan 974
-             976:   15(ivec2) CompositeConstruct 973 975
-             977:     71(ptr) AccessChain 20 70
-                              Store 977 976
-             978:     81(ptr) AccessChain 20 80
-             979:   17(fvec3) Load 978
-             980:   16(float) CompositeExtract 979 0
-             981:   16(float) GroupFMaxNonUniformAMD 25 ExclusiveScan 980
-             982:   16(float) CompositeExtract 979 1
-             983:   16(float) GroupFMaxNonUniformAMD 25 ExclusiveScan 982
-             984:   16(float) CompositeExtract 979 2
-             985:   16(float) GroupFMaxNonUniformAMD 25 ExclusiveScan 984
-             986:   17(fvec3) CompositeConstruct 981 983 985
-             987:     81(ptr) AccessChain 20 80
-                              Store 987 986
-             988:     22(ptr) AccessChain 20 21
-             989:      6(int) Load 988
-             990:      6(int) GroupIAddNonUniformAMD 25 ExclusiveScan 989
-             991:     22(ptr) AccessChain 20 21
-                              Store 991 990
-             992:     29(ptr) AccessChain 20 28
-             993:    8(ivec2) Load 992
-             994:      7(int) CompositeExtract 993 0
-             995:      7(int) GroupIAddNonUniformAMD 25 ExclusiveScan 994
-             996:      7(int) CompositeExtract 993 1
-             997:      7(int) GroupIAddNonUniformAMD 25 ExclusiveScan 996
-             998:    8(ivec2) CompositeConstruct 995 997
-             999:     29(ptr) AccessChain 20 28
-                              Store 999 998
-            1000:     39(ptr) AccessChain 20 38
-            1001:   10(fvec3) Load 1000
-            1002:    9(float) CompositeExtract 1001 0
-            1003:    9(float) GroupFAddNonUniformAMD 25 ExclusiveScan 1002
-            1004:    9(float) CompositeExtract 1001 1
-            1005:    9(float) GroupFAddNonUniformAMD 25 ExclusiveScan 1004
-            1006:    9(float) CompositeExtract 1001 2
-            1007:    9(float) GroupFAddNonUniformAMD 25 ExclusiveScan 1006
-            1008:   10(fvec3) CompositeConstruct 1003 1005 1007
-            1009:     39(ptr) AccessChain 20 38
-                              Store 1009 1008
-            1010:     51(ptr) AccessChain 20 50
-            1011:   12(fvec4) Load 1010
-            1012:   11(float) CompositeExtract 1011 0
-            1013:   11(float) GroupFAddNonUniformAMD 25 ExclusiveScan 1012
-            1014:   11(float) CompositeExtract 1011 1
-            1015:   11(float) GroupFAddNonUniformAMD 25 ExclusiveScan 1014
-            1016:   11(float) CompositeExtract 1011 2
-            1017:   11(float) GroupFAddNonUniformAMD 25 ExclusiveScan 1016
-            1018:   11(float) CompositeExtract 1011 3
-            1019:   11(float) GroupFAddNonUniformAMD 25 ExclusiveScan 1018
-            1020:   12(fvec4) CompositeConstruct 1013 1015 1017 1019
-            1021:     51(ptr) AccessChain 20 50
-                              Store 1021 1020
-            1022:     65(ptr) AccessChain 20 64
-            1023:     13(int) Load 1022
-            1024:     13(int) GroupIAddNonUniformAMD 25 ExclusiveScan 1023
-            1025:     65(ptr) AccessChain 20 64
-                              Store 1025 1024
-            1026:     71(ptr) AccessChain 20 70
-            1027:   15(ivec2) Load 1026
-            1028:     14(int) CompositeExtract 1027 0
-            1029:     14(int) GroupIAddNonUniformAMD 25 ExclusiveScan 1028
-            1030:     14(int) CompositeExtract 1027 1
-            1031:     14(int) GroupIAddNonUniformAMD 25 ExclusiveScan 1030
-            1032:   15(ivec2) CompositeConstruct 1029 1031
-            1033:     71(ptr) AccessChain 20 70
-                              Store 1033 1032
-            1034:     81(ptr) AccessChain 20 80
-            1035:   17(fvec3) Load 1034
-            1036:   16(float) CompositeExtract 1035 0
-            1037:   16(float) GroupFAddNonUniformAMD 25 ExclusiveScan 1036
-            1038:   16(float) CompositeExtract 1035 1
-            1039:   16(float) GroupFAddNonUniformAMD 25 ExclusiveScan 1038
-            1040:   16(float) CompositeExtract 1035 2
-            1041:   16(float) GroupFAddNonUniformAMD 25 ExclusiveScan 1040
-            1042:   17(fvec3) CompositeConstruct 1037 1039 1041
-            1043:     81(ptr) AccessChain 20 80
-                              Store 1043 1042
+              26:     25(ptr) AccessChain 23 24
+              27:      6(int) Load 26
+              29:      6(int) GroupSMin 28 Reduce 27
+              30:     25(ptr) AccessChain 23 24
+                              Store 30 29
+              33:     32(ptr) AccessChain 23 31
+              34:    8(ivec2) Load 33
+              35:      7(int) CompositeExtract 34 0
+              36:      7(int) GroupUMin 28 Reduce 35
+              37:      7(int) CompositeExtract 34 1
+              38:      7(int) GroupUMin 28 Reduce 37
+              39:    8(ivec2) CompositeConstruct 36 38
+              40:     32(ptr) AccessChain 23 31
+                              Store 40 39
+              43:     42(ptr) AccessChain 23 41
+              44:   10(fvec3) Load 43
+              45:    9(float) CompositeExtract 44 0
+              46:    9(float) GroupFMin 28 Reduce 45
+              47:    9(float) CompositeExtract 44 1
+              48:    9(float) GroupFMin 28 Reduce 47
+              49:    9(float) CompositeExtract 44 2
+              50:    9(float) GroupFMin 28 Reduce 49
+              51:   10(fvec3) CompositeConstruct 46 48 50
+              52:     42(ptr) AccessChain 23 41
+                              Store 52 51
+              55:     54(ptr) AccessChain 23 53
+              56: 12(f64vec4) Load 55
+              57:11(float64_t) CompositeExtract 56 0
+              58:11(float64_t) GroupFMin 28 Reduce 57
+              59:11(float64_t) CompositeExtract 56 1
+              60:11(float64_t) GroupFMin 28 Reduce 59
+              61:11(float64_t) CompositeExtract 56 2
+              62:11(float64_t) GroupFMin 28 Reduce 61
+              63:11(float64_t) CompositeExtract 56 3
+              64:11(float64_t) GroupFMin 28 Reduce 63
+              65: 12(f64vec4) CompositeConstruct 58 60 62 64
+              66:     54(ptr) AccessChain 23 53
+                              Store 66 65
+              69:     68(ptr) AccessChain 23 67
+              70: 13(int64_t) Load 69
+              71: 13(int64_t) GroupSMin 28 Reduce 70
+              72:     68(ptr) AccessChain 23 67
+                              Store 72 71
+              75:     74(ptr) AccessChain 23 73
+              76: 15(i64vec2) Load 75
+              77: 14(int64_t) CompositeExtract 76 0
+              78: 14(int64_t) GroupUMin 28 Reduce 77
+              79: 14(int64_t) CompositeExtract 76 1
+              80: 14(int64_t) GroupUMin 28 Reduce 79
+              81: 15(i64vec2) CompositeConstruct 78 80
+              82:     74(ptr) AccessChain 23 73
+                              Store 82 81
+              85:     84(ptr) AccessChain 23 83
+              86: 17(f16vec3) Load 85
+              87:16(float16_t) CompositeExtract 86 0
+              88:16(float16_t) GroupFMin 28 Reduce 87
+              89:16(float16_t) CompositeExtract 86 1
+              90:16(float16_t) GroupFMin 28 Reduce 89
+              91:16(float16_t) CompositeExtract 86 2
+              92:16(float16_t) GroupFMin 28 Reduce 91
+              93: 17(f16vec3) CompositeConstruct 88 90 92
+              94:     84(ptr) AccessChain 23 83
+                              Store 94 93
+              97:     96(ptr) AccessChain 23 95
+              98: 19(i16vec4) Load 97
+              99: 18(int16_t) CompositeExtract 98 0
+             100: 18(int16_t) GroupSMin 28 Reduce 99
+             101: 18(int16_t) CompositeExtract 98 1
+             102: 18(int16_t) GroupSMin 28 Reduce 101
+             103: 18(int16_t) CompositeExtract 98 2
+             104: 18(int16_t) GroupSMin 28 Reduce 103
+             105: 18(int16_t) CompositeExtract 98 3
+             106: 18(int16_t) GroupSMin 28 Reduce 105
+             107: 19(i16vec4) CompositeConstruct 100 102 104 106
+             108:     96(ptr) AccessChain 23 95
+                              Store 108 107
+             111:    110(ptr) AccessChain 23 109
+             112: 20(int16_t) Load 111
+             113: 20(int16_t) GroupUMin 28 Reduce 112
+             114:    110(ptr) AccessChain 23 109
+                              Store 114 113
+             115:     25(ptr) AccessChain 23 24
+             116:      6(int) Load 115
+             117:      6(int) GroupSMax 28 Reduce 116
+             118:     25(ptr) AccessChain 23 24
+                              Store 118 117
+             119:     32(ptr) AccessChain 23 31
+             120:    8(ivec2) Load 119
+             121:      7(int) CompositeExtract 120 0
+             122:      7(int) GroupUMax 28 Reduce 121
+             123:      7(int) CompositeExtract 120 1
+             124:      7(int) GroupUMax 28 Reduce 123
+             125:    8(ivec2) CompositeConstruct 122 124
+             126:     32(ptr) AccessChain 23 31
+                              Store 126 125
+             127:     42(ptr) AccessChain 23 41
+             128:   10(fvec3) Load 127
+             129:    9(float) CompositeExtract 128 0
+             130:    9(float) GroupFMax 28 Reduce 129
+             131:    9(float) CompositeExtract 128 1
+             132:    9(float) GroupFMax 28 Reduce 131
+             133:    9(float) CompositeExtract 128 2
+             134:    9(float) GroupFMax 28 Reduce 133
+             135:   10(fvec3) CompositeConstruct 130 132 134
+             136:     42(ptr) AccessChain 23 41
+                              Store 136 135
+             137:     54(ptr) AccessChain 23 53
+             138: 12(f64vec4) Load 137
+             139:11(float64_t) CompositeExtract 138 0
+             140:11(float64_t) GroupFMax 28 Reduce 139
+             141:11(float64_t) CompositeExtract 138 1
+             142:11(float64_t) GroupFMax 28 Reduce 141
+             143:11(float64_t) CompositeExtract 138 2
+             144:11(float64_t) GroupFMax 28 Reduce 143
+             145:11(float64_t) CompositeExtract 138 3
+             146:11(float64_t) GroupFMax 28 Reduce 145
+             147: 12(f64vec4) CompositeConstruct 140 142 144 146
+             148:     54(ptr) AccessChain 23 53
+                              Store 148 147
+             149:     68(ptr) AccessChain 23 67
+             150: 13(int64_t) Load 149
+             151: 13(int64_t) GroupSMax 28 Reduce 150
+             152:     68(ptr) AccessChain 23 67
+                              Store 152 151
+             153:     74(ptr) AccessChain 23 73
+             154: 15(i64vec2) Load 153
+             155: 14(int64_t) CompositeExtract 154 0
+             156: 14(int64_t) GroupUMax 28 Reduce 155
+             157: 14(int64_t) CompositeExtract 154 1
+             158: 14(int64_t) GroupUMax 28 Reduce 157
+             159: 15(i64vec2) CompositeConstruct 156 158
+             160:     74(ptr) AccessChain 23 73
+                              Store 160 159
+             161:     84(ptr) AccessChain 23 83
+             162: 17(f16vec3) Load 161
+             163:16(float16_t) CompositeExtract 162 0
+             164:16(float16_t) GroupFMax 28 Reduce 163
+             165:16(float16_t) CompositeExtract 162 1
+             166:16(float16_t) GroupFMax 28 Reduce 165
+             167:16(float16_t) CompositeExtract 162 2
+             168:16(float16_t) GroupFMax 28 Reduce 167
+             169: 17(f16vec3) CompositeConstruct 164 166 168
+             170:     84(ptr) AccessChain 23 83
+                              Store 170 169
+             171:     96(ptr) AccessChain 23 95
+             172: 19(i16vec4) Load 171
+             173: 18(int16_t) CompositeExtract 172 0
+             174: 18(int16_t) GroupSMax 28 Reduce 173
+             175: 18(int16_t) CompositeExtract 172 1
+             176: 18(int16_t) GroupSMax 28 Reduce 175
+             177: 18(int16_t) CompositeExtract 172 2
+             178: 18(int16_t) GroupSMax 28 Reduce 177
+             179: 18(int16_t) CompositeExtract 172 3
+             180: 18(int16_t) GroupSMax 28 Reduce 179
+             181: 19(i16vec4) CompositeConstruct 174 176 178 180
+             182:     96(ptr) AccessChain 23 95
+                              Store 182 181
+             183:    110(ptr) AccessChain 23 109
+             184: 20(int16_t) Load 183
+             185: 20(int16_t) GroupUMax 28 Reduce 184
+             186:    110(ptr) AccessChain 23 109
+                              Store 186 185
+             187:     25(ptr) AccessChain 23 24
+             188:      6(int) Load 187
+             189:      6(int) GroupIAdd 28 Reduce 188
+             190:     25(ptr) AccessChain 23 24
+                              Store 190 189
+             191:     32(ptr) AccessChain 23 31
+             192:    8(ivec2) Load 191
+             193:      7(int) CompositeExtract 192 0
+             194:      7(int) GroupIAdd 28 Reduce 193
+             195:      7(int) CompositeExtract 192 1
+             196:      7(int) GroupIAdd 28 Reduce 195
+             197:    8(ivec2) CompositeConstruct 194 196
+             198:     32(ptr) AccessChain 23 31
+                              Store 198 197
+             199:     42(ptr) AccessChain 23 41
+             200:   10(fvec3) Load 199
+             201:    9(float) CompositeExtract 200 0
+             202:    9(float) GroupFAdd 28 Reduce 201
+             203:    9(float) CompositeExtract 200 1
+             204:    9(float) GroupFAdd 28 Reduce 203
+             205:    9(float) CompositeExtract 200 2
+             206:    9(float) GroupFAdd 28 Reduce 205
+             207:   10(fvec3) CompositeConstruct 202 204 206
+             208:     42(ptr) AccessChain 23 41
+                              Store 208 207
+             209:     54(ptr) AccessChain 23 53
+             210: 12(f64vec4) Load 209
+             211:11(float64_t) CompositeExtract 210 0
+             212:11(float64_t) GroupFAdd 28 Reduce 211
+             213:11(float64_t) CompositeExtract 210 1
+             214:11(float64_t) GroupFAdd 28 Reduce 213
+             215:11(float64_t) CompositeExtract 210 2
+             216:11(float64_t) GroupFAdd 28 Reduce 215
+             217:11(float64_t) CompositeExtract 210 3
+             218:11(float64_t) GroupFAdd 28 Reduce 217
+             219: 12(f64vec4) CompositeConstruct 212 214 216 218
+             220:     54(ptr) AccessChain 23 53
+                              Store 220 219
+             221:     68(ptr) AccessChain 23 67
+             222: 13(int64_t) Load 221
+             223: 13(int64_t) GroupIAdd 28 Reduce 222
+             224:     68(ptr) AccessChain 23 67
+                              Store 224 223
+             225:     74(ptr) AccessChain 23 73
+             226: 15(i64vec2) Load 225
+             227: 14(int64_t) CompositeExtract 226 0
+             228: 14(int64_t) GroupIAdd 28 Reduce 227
+             229: 14(int64_t) CompositeExtract 226 1
+             230: 14(int64_t) GroupIAdd 28 Reduce 229
+             231: 15(i64vec2) CompositeConstruct 228 230
+             232:     74(ptr) AccessChain 23 73
+                              Store 232 231
+             233:     84(ptr) AccessChain 23 83
+             234: 17(f16vec3) Load 233
+             235:16(float16_t) CompositeExtract 234 0
+             236:16(float16_t) GroupFAdd 28 Reduce 235
+             237:16(float16_t) CompositeExtract 234 1
+             238:16(float16_t) GroupFAdd 28 Reduce 237
+             239:16(float16_t) CompositeExtract 234 2
+             240:16(float16_t) GroupFAdd 28 Reduce 239
+             241: 17(f16vec3) CompositeConstruct 236 238 240
+             242:     84(ptr) AccessChain 23 83
+                              Store 242 241
+             243:     96(ptr) AccessChain 23 95
+             244: 19(i16vec4) Load 243
+             245: 18(int16_t) CompositeExtract 244 0
+             246: 18(int16_t) GroupIAdd 28 Reduce 245
+             247: 18(int16_t) CompositeExtract 244 1
+             248: 18(int16_t) GroupIAdd 28 Reduce 247
+             249: 18(int16_t) CompositeExtract 244 2
+             250: 18(int16_t) GroupIAdd 28 Reduce 249
+             251: 18(int16_t) CompositeExtract 244 3
+             252: 18(int16_t) GroupIAdd 28 Reduce 251
+             253: 19(i16vec4) CompositeConstruct 246 248 250 252
+             254:     96(ptr) AccessChain 23 95
+                              Store 254 253
+             255:    110(ptr) AccessChain 23 109
+             256: 20(int16_t) Load 255
+             257: 20(int16_t) GroupIAdd 28 Reduce 256
+             258:    110(ptr) AccessChain 23 109
+                              Store 258 257
+             259:     25(ptr) AccessChain 23 24
+             260:      6(int) Load 259
+             261:      6(int) GroupSMinNonUniformAMD 28 Reduce 260
+             262:     25(ptr) AccessChain 23 24
+                              Store 262 261
+             263:     32(ptr) AccessChain 23 31
+             264:    8(ivec2) Load 263
+             265:      7(int) CompositeExtract 264 0
+             266:      7(int) GroupUMinNonUniformAMD 28 Reduce 265
+             267:      7(int) CompositeExtract 264 1
+             268:      7(int) GroupUMinNonUniformAMD 28 Reduce 267
+             269:    8(ivec2) CompositeConstruct 266 268
+             270:     32(ptr) AccessChain 23 31
+                              Store 270 269
+             271:     42(ptr) AccessChain 23 41
+             272:   10(fvec3) Load 271
+             273:    9(float) CompositeExtract 272 0
+             274:    9(float) GroupFMinNonUniformAMD 28 Reduce 273
+             275:    9(float) CompositeExtract 272 1
+             276:    9(float) GroupFMinNonUniformAMD 28 Reduce 275
+             277:    9(float) CompositeExtract 272 2
+             278:    9(float) GroupFMinNonUniformAMD 28 Reduce 277
+             279:   10(fvec3) CompositeConstruct 274 276 278
+             280:     42(ptr) AccessChain 23 41
+                              Store 280 279
+             281:     54(ptr) AccessChain 23 53
+             282: 12(f64vec4) Load 281
+             283:11(float64_t) CompositeExtract 282 0
+             284:11(float64_t) GroupFMinNonUniformAMD 28 Reduce 283
+             285:11(float64_t) CompositeExtract 282 1
+             286:11(float64_t) GroupFMinNonUniformAMD 28 Reduce 285
+             287:11(float64_t) CompositeExtract 282 2
+             288:11(float64_t) GroupFMinNonUniformAMD 28 Reduce 287
+             289:11(float64_t) CompositeExtract 282 3
+             290:11(float64_t) GroupFMinNonUniformAMD 28 Reduce 289
+             291: 12(f64vec4) CompositeConstruct 284 286 288 290
+             292:     54(ptr) AccessChain 23 53
+                              Store 292 291
+             293:     68(ptr) AccessChain 23 67
+             294: 13(int64_t) Load 293
+             295: 13(int64_t) GroupSMinNonUniformAMD 28 Reduce 294
+             296:     68(ptr) AccessChain 23 67
+                              Store 296 295
+             297:     74(ptr) AccessChain 23 73
+             298: 15(i64vec2) Load 297
+             299: 14(int64_t) CompositeExtract 298 0
+             300: 14(int64_t) GroupUMinNonUniformAMD 28 Reduce 299
+             301: 14(int64_t) CompositeExtract 298 1
+             302: 14(int64_t) GroupUMinNonUniformAMD 28 Reduce 301
+             303: 15(i64vec2) CompositeConstruct 300 302
+             304:     74(ptr) AccessChain 23 73
+                              Store 304 303
+             305:     84(ptr) AccessChain 23 83
+             306: 17(f16vec3) Load 305
+             307:16(float16_t) CompositeExtract 306 0
+             308:16(float16_t) GroupFMinNonUniformAMD 28 Reduce 307
+             309:16(float16_t) CompositeExtract 306 1
+             310:16(float16_t) GroupFMinNonUniformAMD 28 Reduce 309
+             311:16(float16_t) CompositeExtract 306 2
+             312:16(float16_t) GroupFMinNonUniformAMD 28 Reduce 311
+             313: 17(f16vec3) CompositeConstruct 308 310 312
+             314:     84(ptr) AccessChain 23 83
+                              Store 314 313
+             315:     96(ptr) AccessChain 23 95
+             316: 19(i16vec4) Load 315
+             317: 18(int16_t) CompositeExtract 316 0
+             318: 18(int16_t) GroupSMinNonUniformAMD 28 Reduce 317
+             319: 18(int16_t) CompositeExtract 316 1
+             320: 18(int16_t) GroupSMinNonUniformAMD 28 Reduce 319
+             321: 18(int16_t) CompositeExtract 316 2
+             322: 18(int16_t) GroupSMinNonUniformAMD 28 Reduce 321
+             323: 18(int16_t) CompositeExtract 316 3
+             324: 18(int16_t) GroupSMinNonUniformAMD 28 Reduce 323
+             325: 19(i16vec4) CompositeConstruct 318 320 322 324
+             326:     96(ptr) AccessChain 23 95
+                              Store 326 325
+             327:    110(ptr) AccessChain 23 109
+             328: 20(int16_t) Load 327
+             329: 20(int16_t) GroupUMinNonUniformAMD 28 Reduce 328
+             330:    110(ptr) AccessChain 23 109
+                              Store 330 329
+             331:     25(ptr) AccessChain 23 24
+             332:      6(int) Load 331
+             333:      6(int) GroupSMaxNonUniformAMD 28 Reduce 332
+             334:     25(ptr) AccessChain 23 24
+                              Store 334 333
+             335:     32(ptr) AccessChain 23 31
+             336:    8(ivec2) Load 335
+             337:      7(int) CompositeExtract 336 0
+             338:      7(int) GroupUMaxNonUniformAMD 28 Reduce 337
+             339:      7(int) CompositeExtract 336 1
+             340:      7(int) GroupUMaxNonUniformAMD 28 Reduce 339
+             341:    8(ivec2) CompositeConstruct 338 340
+             342:     32(ptr) AccessChain 23 31
+                              Store 342 341
+             343:     42(ptr) AccessChain 23 41
+             344:   10(fvec3) Load 343
+             345:    9(float) CompositeExtract 344 0
+             346:    9(float) GroupFMaxNonUniformAMD 28 Reduce 345
+             347:    9(float) CompositeExtract 344 1
+             348:    9(float) GroupFMaxNonUniformAMD 28 Reduce 347
+             349:    9(float) CompositeExtract 344 2
+             350:    9(float) GroupFMaxNonUniformAMD 28 Reduce 349
+             351:   10(fvec3) CompositeConstruct 346 348 350
+             352:     42(ptr) AccessChain 23 41
+                              Store 352 351
+             353:     54(ptr) AccessChain 23 53
+             354: 12(f64vec4) Load 353
+             355:11(float64_t) CompositeExtract 354 0
+             356:11(float64_t) GroupFMaxNonUniformAMD 28 Reduce 355
+             357:11(float64_t) CompositeExtract 354 1
+             358:11(float64_t) GroupFMaxNonUniformAMD 28 Reduce 357
+             359:11(float64_t) CompositeExtract 354 2
+             360:11(float64_t) GroupFMaxNonUniformAMD 28 Reduce 359
+             361:11(float64_t) CompositeExtract 354 3
+             362:11(float64_t) GroupFMaxNonUniformAMD 28 Reduce 361
+             363: 12(f64vec4) CompositeConstruct 356 358 360 362
+             364:     54(ptr) AccessChain 23 53
+                              Store 364 363
+             365:     68(ptr) AccessChain 23 67
+             366: 13(int64_t) Load 365
+             367: 13(int64_t) GroupSMaxNonUniformAMD 28 Reduce 366
+             368:     68(ptr) AccessChain 23 67
+                              Store 368 367
+             369:     74(ptr) AccessChain 23 73
+             370: 15(i64vec2) Load 369
+             371: 14(int64_t) CompositeExtract 370 0
+             372: 14(int64_t) GroupUMaxNonUniformAMD 28 Reduce 371
+             373: 14(int64_t) CompositeExtract 370 1
+             374: 14(int64_t) GroupUMaxNonUniformAMD 28 Reduce 373
+             375: 15(i64vec2) CompositeConstruct 372 374
+             376:     74(ptr) AccessChain 23 73
+                              Store 376 375
+             377:     84(ptr) AccessChain 23 83
+             378: 17(f16vec3) Load 377
+             379:16(float16_t) CompositeExtract 378 0
+             380:16(float16_t) GroupFMaxNonUniformAMD 28 Reduce 379
+             381:16(float16_t) CompositeExtract 378 1
+             382:16(float16_t) GroupFMaxNonUniformAMD 28 Reduce 381
+             383:16(float16_t) CompositeExtract 378 2
+             384:16(float16_t) GroupFMaxNonUniformAMD 28 Reduce 383
+             385: 17(f16vec3) CompositeConstruct 380 382 384
+             386:     84(ptr) AccessChain 23 83
+                              Store 386 385
+             387:     96(ptr) AccessChain 23 95
+             388: 19(i16vec4) Load 387
+             389: 18(int16_t) CompositeExtract 388 0
+             390: 18(int16_t) GroupSMaxNonUniformAMD 28 Reduce 389
+             391: 18(int16_t) CompositeExtract 388 1
+             392: 18(int16_t) GroupSMaxNonUniformAMD 28 Reduce 391
+             393: 18(int16_t) CompositeExtract 388 2
+             394: 18(int16_t) GroupSMaxNonUniformAMD 28 Reduce 393
+             395: 18(int16_t) CompositeExtract 388 3
+             396: 18(int16_t) GroupSMaxNonUniformAMD 28 Reduce 395
+             397: 19(i16vec4) CompositeConstruct 390 392 394 396
+             398:     96(ptr) AccessChain 23 95
+                              Store 398 397
+             399:    110(ptr) AccessChain 23 109
+             400: 20(int16_t) Load 399
+             401: 20(int16_t) GroupUMaxNonUniformAMD 28 Reduce 400
+             402:    110(ptr) AccessChain 23 109
+                              Store 402 401
+             403:     25(ptr) AccessChain 23 24
+             404:      6(int) Load 403
+             405:      6(int) GroupIAddNonUniformAMD 28 Reduce 404
+             406:     25(ptr) AccessChain 23 24
+                              Store 406 405
+             407:     32(ptr) AccessChain 23 31
+             408:    8(ivec2) Load 407
+             409:      7(int) CompositeExtract 408 0
+             410:      7(int) GroupIAddNonUniformAMD 28 Reduce 409
+             411:      7(int) CompositeExtract 408 1
+             412:      7(int) GroupIAddNonUniformAMD 28 Reduce 411
+             413:    8(ivec2) CompositeConstruct 410 412
+             414:     32(ptr) AccessChain 23 31
+                              Store 414 413
+             415:     42(ptr) AccessChain 23 41
+             416:   10(fvec3) Load 415
+             417:    9(float) CompositeExtract 416 0
+             418:    9(float) GroupFAddNonUniformAMD 28 Reduce 417
+             419:    9(float) CompositeExtract 416 1
+             420:    9(float) GroupFAddNonUniformAMD 28 Reduce 419
+             421:    9(float) CompositeExtract 416 2
+             422:    9(float) GroupFAddNonUniformAMD 28 Reduce 421
+             423:   10(fvec3) CompositeConstruct 418 420 422
+             424:     42(ptr) AccessChain 23 41
+                              Store 424 423
+             425:     54(ptr) AccessChain 23 53
+             426: 12(f64vec4) Load 425
+             427:11(float64_t) CompositeExtract 426 0
+             428:11(float64_t) GroupFAddNonUniformAMD 28 Reduce 427
+             429:11(float64_t) CompositeExtract 426 1
+             430:11(float64_t) GroupFAddNonUniformAMD 28 Reduce 429
+             431:11(float64_t) CompositeExtract 426 2
+             432:11(float64_t) GroupFAddNonUniformAMD 28 Reduce 431
+             433:11(float64_t) CompositeExtract 426 3
+             434:11(float64_t) GroupFAddNonUniformAMD 28 Reduce 433
+             435: 12(f64vec4) CompositeConstruct 428 430 432 434
+             436:     54(ptr) AccessChain 23 53
+                              Store 436 435
+             437:     68(ptr) AccessChain 23 67
+             438: 13(int64_t) Load 437
+             439: 13(int64_t) GroupIAddNonUniformAMD 28 Reduce 438
+             440:     68(ptr) AccessChain 23 67
+                              Store 440 439
+             441:     74(ptr) AccessChain 23 73
+             442: 15(i64vec2) Load 441
+             443: 14(int64_t) CompositeExtract 442 0
+             444: 14(int64_t) GroupIAddNonUniformAMD 28 Reduce 443
+             445: 14(int64_t) CompositeExtract 442 1
+             446: 14(int64_t) GroupIAddNonUniformAMD 28 Reduce 445
+             447: 15(i64vec2) CompositeConstruct 444 446
+             448:     74(ptr) AccessChain 23 73
+                              Store 448 447
+             449:     84(ptr) AccessChain 23 83
+             450: 17(f16vec3) Load 449
+             451:16(float16_t) CompositeExtract 450 0
+             452:16(float16_t) GroupFAddNonUniformAMD 28 Reduce 451
+             453:16(float16_t) CompositeExtract 450 1
+             454:16(float16_t) GroupFAddNonUniformAMD 28 Reduce 453
+             455:16(float16_t) CompositeExtract 450 2
+             456:16(float16_t) GroupFAddNonUniformAMD 28 Reduce 455
+             457: 17(f16vec3) CompositeConstruct 452 454 456
+             458:     84(ptr) AccessChain 23 83
+                              Store 458 457
+             459:     96(ptr) AccessChain 23 95
+             460: 19(i16vec4) Load 459
+             461: 18(int16_t) CompositeExtract 460 0
+             462: 18(int16_t) GroupIAddNonUniformAMD 28 Reduce 461
+             463: 18(int16_t) CompositeExtract 460 1
+             464: 18(int16_t) GroupIAddNonUniformAMD 28 Reduce 463
+             465: 18(int16_t) CompositeExtract 460 2
+             466: 18(int16_t) GroupIAddNonUniformAMD 28 Reduce 465
+             467: 18(int16_t) CompositeExtract 460 3
+             468: 18(int16_t) GroupIAddNonUniformAMD 28 Reduce 467
+             469: 19(i16vec4) CompositeConstruct 462 464 466 468
+             470:     96(ptr) AccessChain 23 95
+                              Store 470 469
+             471:    110(ptr) AccessChain 23 109
+             472: 20(int16_t) Load 471
+             473: 20(int16_t) GroupIAddNonUniformAMD 28 Reduce 472
+             474:    110(ptr) AccessChain 23 109
+                              Store 474 473
+             475:     25(ptr) AccessChain 23 24
+             476:      6(int) Load 475
+             477:      6(int) GroupSMin 28 InclusiveScan 476
+             478:     25(ptr) AccessChain 23 24
+                              Store 478 477
+             479:     32(ptr) AccessChain 23 31
+             480:    8(ivec2) Load 479
+             481:      7(int) CompositeExtract 480 0
+             482:      7(int) GroupUMin 28 InclusiveScan 481
+             483:      7(int) CompositeExtract 480 1
+             484:      7(int) GroupUMin 28 InclusiveScan 483
+             485:    8(ivec2) CompositeConstruct 482 484
+             486:     32(ptr) AccessChain 23 31
+                              Store 486 485
+             487:     42(ptr) AccessChain 23 41
+             488:   10(fvec3) Load 487
+             489:    9(float) CompositeExtract 488 0
+             490:    9(float) GroupFMin 28 InclusiveScan 489
+             491:    9(float) CompositeExtract 488 1
+             492:    9(float) GroupFMin 28 InclusiveScan 491
+             493:    9(float) CompositeExtract 488 2
+             494:    9(float) GroupFMin 28 InclusiveScan 493
+             495:   10(fvec3) CompositeConstruct 490 492 494
+             496:     42(ptr) AccessChain 23 41
+                              Store 496 495
+             497:     54(ptr) AccessChain 23 53
+             498: 12(f64vec4) Load 497
+             499:11(float64_t) CompositeExtract 498 0
+             500:11(float64_t) GroupFMin 28 InclusiveScan 499
+             501:11(float64_t) CompositeExtract 498 1
+             502:11(float64_t) GroupFMin 28 InclusiveScan 501
+             503:11(float64_t) CompositeExtract 498 2
+             504:11(float64_t) GroupFMin 28 InclusiveScan 503
+             505:11(float64_t) CompositeExtract 498 3
+             506:11(float64_t) GroupFMin 28 InclusiveScan 505
+             507: 12(f64vec4) CompositeConstruct 500 502 504 506
+             508:     54(ptr) AccessChain 23 53
+                              Store 508 507
+             509:     68(ptr) AccessChain 23 67
+             510: 13(int64_t) Load 509
+             511: 13(int64_t) GroupSMin 28 InclusiveScan 510
+             512:     68(ptr) AccessChain 23 67
+                              Store 512 511
+             513:     74(ptr) AccessChain 23 73
+             514: 15(i64vec2) Load 513
+             515: 14(int64_t) CompositeExtract 514 0
+             516: 14(int64_t) GroupUMin 28 InclusiveScan 515
+             517: 14(int64_t) CompositeExtract 514 1
+             518: 14(int64_t) GroupUMin 28 InclusiveScan 517
+             519: 15(i64vec2) CompositeConstruct 516 518
+             520:     74(ptr) AccessChain 23 73
+                              Store 520 519
+             521:     84(ptr) AccessChain 23 83
+             522: 17(f16vec3) Load 521
+             523:16(float16_t) CompositeExtract 522 0
+             524:16(float16_t) GroupFMin 28 InclusiveScan 523
+             525:16(float16_t) CompositeExtract 522 1
+             526:16(float16_t) GroupFMin 28 InclusiveScan 525
+             527:16(float16_t) CompositeExtract 522 2
+             528:16(float16_t) GroupFMin 28 InclusiveScan 527
+             529: 17(f16vec3) CompositeConstruct 524 526 528
+             530:     84(ptr) AccessChain 23 83
+                              Store 530 529
+             531:     96(ptr) AccessChain 23 95
+             532: 19(i16vec4) Load 531
+             533: 18(int16_t) CompositeExtract 532 0
+             534: 18(int16_t) GroupSMin 28 InclusiveScan 533
+             535: 18(int16_t) CompositeExtract 532 1
+             536: 18(int16_t) GroupSMin 28 InclusiveScan 535
+             537: 18(int16_t) CompositeExtract 532 2
+             538: 18(int16_t) GroupSMin 28 InclusiveScan 537
+             539: 18(int16_t) CompositeExtract 532 3
+             540: 18(int16_t) GroupSMin 28 InclusiveScan 539
+             541: 19(i16vec4) CompositeConstruct 534 536 538 540
+             542:     96(ptr) AccessChain 23 95
+                              Store 542 541
+             543:    110(ptr) AccessChain 23 109
+             544: 20(int16_t) Load 543
+             545: 20(int16_t) GroupUMin 28 InclusiveScan 544
+             546:    110(ptr) AccessChain 23 109
+                              Store 546 545
+             547:     25(ptr) AccessChain 23 24
+             548:      6(int) Load 547
+             549:      6(int) GroupSMax 28 InclusiveScan 548
+             550:     25(ptr) AccessChain 23 24
+                              Store 550 549
+             551:     32(ptr) AccessChain 23 31
+             552:    8(ivec2) Load 551
+             553:      7(int) CompositeExtract 552 0
+             554:      7(int) GroupUMax 28 InclusiveScan 553
+             555:      7(int) CompositeExtract 552 1
+             556:      7(int) GroupUMax 28 InclusiveScan 555
+             557:    8(ivec2) CompositeConstruct 554 556
+             558:     32(ptr) AccessChain 23 31
+                              Store 558 557
+             559:     42(ptr) AccessChain 23 41
+             560:   10(fvec3) Load 559
+             561:    9(float) CompositeExtract 560 0
+             562:    9(float) GroupFMax 28 InclusiveScan 561
+             563:    9(float) CompositeExtract 560 1
+             564:    9(float) GroupFMax 28 InclusiveScan 563
+             565:    9(float) CompositeExtract 560 2
+             566:    9(float) GroupFMax 28 InclusiveScan 565
+             567:   10(fvec3) CompositeConstruct 562 564 566
+             568:     42(ptr) AccessChain 23 41
+                              Store 568 567
+             569:     54(ptr) AccessChain 23 53
+             570: 12(f64vec4) Load 569
+             571:11(float64_t) CompositeExtract 570 0
+             572:11(float64_t) GroupFMax 28 InclusiveScan 571
+             573:11(float64_t) CompositeExtract 570 1
+             574:11(float64_t) GroupFMax 28 InclusiveScan 573
+             575:11(float64_t) CompositeExtract 570 2
+             576:11(float64_t) GroupFMax 28 InclusiveScan 575
+             577:11(float64_t) CompositeExtract 570 3
+             578:11(float64_t) GroupFMax 28 InclusiveScan 577
+             579: 12(f64vec4) CompositeConstruct 572 574 576 578
+             580:     54(ptr) AccessChain 23 53
+                              Store 580 579
+             581:     68(ptr) AccessChain 23 67
+             582: 13(int64_t) Load 581
+             583: 13(int64_t) GroupSMax 28 InclusiveScan 582
+             584:     68(ptr) AccessChain 23 67
+                              Store 584 583
+             585:     74(ptr) AccessChain 23 73
+             586: 15(i64vec2) Load 585
+             587: 14(int64_t) CompositeExtract 586 0
+             588: 14(int64_t) GroupUMax 28 InclusiveScan 587
+             589: 14(int64_t) CompositeExtract 586 1
+             590: 14(int64_t) GroupUMax 28 InclusiveScan 589
+             591: 15(i64vec2) CompositeConstruct 588 590
+             592:     74(ptr) AccessChain 23 73
+                              Store 592 591
+             593:     84(ptr) AccessChain 23 83
+             594: 17(f16vec3) Load 593
+             595:16(float16_t) CompositeExtract 594 0
+             596:16(float16_t) GroupFMax 28 InclusiveScan 595
+             597:16(float16_t) CompositeExtract 594 1
+             598:16(float16_t) GroupFMax 28 InclusiveScan 597
+             599:16(float16_t) CompositeExtract 594 2
+             600:16(float16_t) GroupFMax 28 InclusiveScan 599
+             601: 17(f16vec3) CompositeConstruct 596 598 600
+             602:     84(ptr) AccessChain 23 83
+                              Store 602 601
+             603:     96(ptr) AccessChain 23 95
+             604: 19(i16vec4) Load 603
+             605: 18(int16_t) CompositeExtract 604 0
+             606: 18(int16_t) GroupSMax 28 InclusiveScan 605
+             607: 18(int16_t) CompositeExtract 604 1
+             608: 18(int16_t) GroupSMax 28 InclusiveScan 607
+             609: 18(int16_t) CompositeExtract 604 2
+             610: 18(int16_t) GroupSMax 28 InclusiveScan 609
+             611: 18(int16_t) CompositeExtract 604 3
+             612: 18(int16_t) GroupSMax 28 InclusiveScan 611
+             613: 19(i16vec4) CompositeConstruct 606 608 610 612
+             614:     96(ptr) AccessChain 23 95
+                              Store 614 613
+             615:    110(ptr) AccessChain 23 109
+             616: 20(int16_t) Load 615
+             617: 20(int16_t) GroupUMax 28 InclusiveScan 616
+             618:    110(ptr) AccessChain 23 109
+                              Store 618 617
+             619:     25(ptr) AccessChain 23 24
+             620:      6(int) Load 619
+             621:      6(int) GroupIAdd 28 InclusiveScan 620
+             622:     25(ptr) AccessChain 23 24
+                              Store 622 621
+             623:     32(ptr) AccessChain 23 31
+             624:    8(ivec2) Load 623
+             625:      7(int) CompositeExtract 624 0
+             626:      7(int) GroupIAdd 28 InclusiveScan 625
+             627:      7(int) CompositeExtract 624 1
+             628:      7(int) GroupIAdd 28 InclusiveScan 627
+             629:    8(ivec2) CompositeConstruct 626 628
+             630:     32(ptr) AccessChain 23 31
+                              Store 630 629
+             631:     42(ptr) AccessChain 23 41
+             632:   10(fvec3) Load 631
+             633:    9(float) CompositeExtract 632 0
+             634:    9(float) GroupFAdd 28 InclusiveScan 633
+             635:    9(float) CompositeExtract 632 1
+             636:    9(float) GroupFAdd 28 InclusiveScan 635
+             637:    9(float) CompositeExtract 632 2
+             638:    9(float) GroupFAdd 28 InclusiveScan 637
+             639:   10(fvec3) CompositeConstruct 634 636 638
+             640:     42(ptr) AccessChain 23 41
+                              Store 640 639
+             641:     54(ptr) AccessChain 23 53
+             642: 12(f64vec4) Load 641
+             643:11(float64_t) CompositeExtract 642 0
+             644:11(float64_t) GroupFAdd 28 InclusiveScan 643
+             645:11(float64_t) CompositeExtract 642 1
+             646:11(float64_t) GroupFAdd 28 InclusiveScan 645
+             647:11(float64_t) CompositeExtract 642 2
+             648:11(float64_t) GroupFAdd 28 InclusiveScan 647
+             649:11(float64_t) CompositeExtract 642 3
+             650:11(float64_t) GroupFAdd 28 InclusiveScan 649
+             651: 12(f64vec4) CompositeConstruct 644 646 648 650
+             652:     54(ptr) AccessChain 23 53
+                              Store 652 651
+             653:     68(ptr) AccessChain 23 67
+             654: 13(int64_t) Load 653
+             655: 13(int64_t) GroupIAdd 28 InclusiveScan 654
+             656:     68(ptr) AccessChain 23 67
+                              Store 656 655
+             657:     74(ptr) AccessChain 23 73
+             658: 15(i64vec2) Load 657
+             659: 14(int64_t) CompositeExtract 658 0
+             660: 14(int64_t) GroupIAdd 28 InclusiveScan 659
+             661: 14(int64_t) CompositeExtract 658 1
+             662: 14(int64_t) GroupIAdd 28 InclusiveScan 661
+             663: 15(i64vec2) CompositeConstruct 660 662
+             664:     74(ptr) AccessChain 23 73
+                              Store 664 663
+             665:     84(ptr) AccessChain 23 83
+             666: 17(f16vec3) Load 665
+             667:16(float16_t) CompositeExtract 666 0
+             668:16(float16_t) GroupFAdd 28 InclusiveScan 667
+             669:16(float16_t) CompositeExtract 666 1
+             670:16(float16_t) GroupFAdd 28 InclusiveScan 669
+             671:16(float16_t) CompositeExtract 666 2
+             672:16(float16_t) GroupFAdd 28 InclusiveScan 671
+             673: 17(f16vec3) CompositeConstruct 668 670 672
+             674:     84(ptr) AccessChain 23 83
+                              Store 674 673
+             675:     96(ptr) AccessChain 23 95
+             676: 19(i16vec4) Load 675
+             677: 18(int16_t) CompositeExtract 676 0
+             678: 18(int16_t) GroupIAdd 28 InclusiveScan 677
+             679: 18(int16_t) CompositeExtract 676 1
+             680: 18(int16_t) GroupIAdd 28 InclusiveScan 679
+             681: 18(int16_t) CompositeExtract 676 2
+             682: 18(int16_t) GroupIAdd 28 InclusiveScan 681
+             683: 18(int16_t) CompositeExtract 676 3
+             684: 18(int16_t) GroupIAdd 28 InclusiveScan 683
+             685: 19(i16vec4) CompositeConstruct 678 680 682 684
+             686:     96(ptr) AccessChain 23 95
+                              Store 686 685
+             687:    110(ptr) AccessChain 23 109
+             688: 20(int16_t) Load 687
+             689: 20(int16_t) GroupIAdd 28 InclusiveScan 688
+             690:    110(ptr) AccessChain 23 109
+                              Store 690 689
+             691:     25(ptr) AccessChain 23 24
+             692:      6(int) Load 691
+             693:      6(int) GroupSMin 28 ExclusiveScan 692
+             694:     25(ptr) AccessChain 23 24
+                              Store 694 693
+             695:     32(ptr) AccessChain 23 31
+             696:    8(ivec2) Load 695
+             697:      7(int) CompositeExtract 696 0
+             698:      7(int) GroupUMin 28 ExclusiveScan 697
+             699:      7(int) CompositeExtract 696 1
+             700:      7(int) GroupUMin 28 ExclusiveScan 699
+             701:    8(ivec2) CompositeConstruct 698 700
+             702:     32(ptr) AccessChain 23 31
+                              Store 702 701
+             703:     42(ptr) AccessChain 23 41
+             704:   10(fvec3) Load 703
+             705:    9(float) CompositeExtract 704 0
+             706:    9(float) GroupFMin 28 ExclusiveScan 705
+             707:    9(float) CompositeExtract 704 1
+             708:    9(float) GroupFMin 28 ExclusiveScan 707
+             709:    9(float) CompositeExtract 704 2
+             710:    9(float) GroupFMin 28 ExclusiveScan 709
+             711:   10(fvec3) CompositeConstruct 706 708 710
+             712:     42(ptr) AccessChain 23 41
+                              Store 712 711
+             713:     54(ptr) AccessChain 23 53
+             714: 12(f64vec4) Load 713
+             715:11(float64_t) CompositeExtract 714 0
+             716:11(float64_t) GroupFMin 28 ExclusiveScan 715
+             717:11(float64_t) CompositeExtract 714 1
+             718:11(float64_t) GroupFMin 28 ExclusiveScan 717
+             719:11(float64_t) CompositeExtract 714 2
+             720:11(float64_t) GroupFMin 28 ExclusiveScan 719
+             721:11(float64_t) CompositeExtract 714 3
+             722:11(float64_t) GroupFMin 28 ExclusiveScan 721
+             723: 12(f64vec4) CompositeConstruct 716 718 720 722
+             724:     54(ptr) AccessChain 23 53
+                              Store 724 723
+             725:     68(ptr) AccessChain 23 67
+             726: 13(int64_t) Load 725
+             727: 13(int64_t) GroupSMin 28 ExclusiveScan 726
+             728:     68(ptr) AccessChain 23 67
+                              Store 728 727
+             729:     74(ptr) AccessChain 23 73
+             730: 15(i64vec2) Load 729
+             731: 14(int64_t) CompositeExtract 730 0
+             732: 14(int64_t) GroupUMin 28 ExclusiveScan 731
+             733: 14(int64_t) CompositeExtract 730 1
+             734: 14(int64_t) GroupUMin 28 ExclusiveScan 733
+             735: 15(i64vec2) CompositeConstruct 732 734
+             736:     74(ptr) AccessChain 23 73
+                              Store 736 735
+             737:     84(ptr) AccessChain 23 83
+             738: 17(f16vec3) Load 737
+             739:16(float16_t) CompositeExtract 738 0
+             740:16(float16_t) GroupFMin 28 ExclusiveScan 739
+             741:16(float16_t) CompositeExtract 738 1
+             742:16(float16_t) GroupFMin 28 ExclusiveScan 741
+             743:16(float16_t) CompositeExtract 738 2
+             744:16(float16_t) GroupFMin 28 ExclusiveScan 743
+             745: 17(f16vec3) CompositeConstruct 740 742 744
+             746:     84(ptr) AccessChain 23 83
+                              Store 746 745
+             747:     96(ptr) AccessChain 23 95
+             748: 19(i16vec4) Load 747
+             749: 18(int16_t) CompositeExtract 748 0
+             750: 18(int16_t) GroupSMin 28 ExclusiveScan 749
+             751: 18(int16_t) CompositeExtract 748 1
+             752: 18(int16_t) GroupSMin 28 ExclusiveScan 751
+             753: 18(int16_t) CompositeExtract 748 2
+             754: 18(int16_t) GroupSMin 28 ExclusiveScan 753
+             755: 18(int16_t) CompositeExtract 748 3
+             756: 18(int16_t) GroupSMin 28 ExclusiveScan 755
+             757: 19(i16vec4) CompositeConstruct 750 752 754 756
+             758:     96(ptr) AccessChain 23 95
+                              Store 758 757
+             759:    110(ptr) AccessChain 23 109
+             760: 20(int16_t) Load 759
+             761: 20(int16_t) GroupUMin 28 ExclusiveScan 760
+             762:    110(ptr) AccessChain 23 109
+                              Store 762 761
+             763:     25(ptr) AccessChain 23 24
+             764:      6(int) Load 763
+             765:      6(int) GroupSMax 28 ExclusiveScan 764
+             766:     25(ptr) AccessChain 23 24
+                              Store 766 765
+             767:     32(ptr) AccessChain 23 31
+             768:    8(ivec2) Load 767
+             769:      7(int) CompositeExtract 768 0
+             770:      7(int) GroupUMax 28 ExclusiveScan 769
+             771:      7(int) CompositeExtract 768 1
+             772:      7(int) GroupUMax 28 ExclusiveScan 771
+             773:    8(ivec2) CompositeConstruct 770 772
+             774:     32(ptr) AccessChain 23 31
+                              Store 774 773
+             775:     42(ptr) AccessChain 23 41
+             776:   10(fvec3) Load 775
+             777:    9(float) CompositeExtract 776 0
+             778:    9(float) GroupFMax 28 ExclusiveScan 777
+             779:    9(float) CompositeExtract 776 1
+             780:    9(float) GroupFMax 28 ExclusiveScan 779
+             781:    9(float) CompositeExtract 776 2
+             782:    9(float) GroupFMax 28 ExclusiveScan 781
+             783:   10(fvec3) CompositeConstruct 778 780 782
+             784:     42(ptr) AccessChain 23 41
+                              Store 784 783
+             785:     54(ptr) AccessChain 23 53
+             786: 12(f64vec4) Load 785
+             787:11(float64_t) CompositeExtract 786 0
+             788:11(float64_t) GroupFMax 28 ExclusiveScan 787
+             789:11(float64_t) CompositeExtract 786 1
+             790:11(float64_t) GroupFMax 28 ExclusiveScan 789
+             791:11(float64_t) CompositeExtract 786 2
+             792:11(float64_t) GroupFMax 28 ExclusiveScan 791
+             793:11(float64_t) CompositeExtract 786 3
+             794:11(float64_t) GroupFMax 28 ExclusiveScan 793
+             795: 12(f64vec4) CompositeConstruct 788 790 792 794
+             796:     54(ptr) AccessChain 23 53
+                              Store 796 795
+             797:     68(ptr) AccessChain 23 67
+             798: 13(int64_t) Load 797
+             799: 13(int64_t) GroupSMax 28 ExclusiveScan 798
+             800:     68(ptr) AccessChain 23 67
+                              Store 800 799
+             801:     74(ptr) AccessChain 23 73
+             802: 15(i64vec2) Load 801
+             803: 14(int64_t) CompositeExtract 802 0
+             804: 14(int64_t) GroupUMax 28 ExclusiveScan 803
+             805: 14(int64_t) CompositeExtract 802 1
+             806: 14(int64_t) GroupUMax 28 ExclusiveScan 805
+             807: 15(i64vec2) CompositeConstruct 804 806
+             808:     74(ptr) AccessChain 23 73
+                              Store 808 807
+             809:     84(ptr) AccessChain 23 83
+             810: 17(f16vec3) Load 809
+             811:16(float16_t) CompositeExtract 810 0
+             812:16(float16_t) GroupFMax 28 ExclusiveScan 811
+             813:16(float16_t) CompositeExtract 810 1
+             814:16(float16_t) GroupFMax 28 ExclusiveScan 813
+             815:16(float16_t) CompositeExtract 810 2
+             816:16(float16_t) GroupFMax 28 ExclusiveScan 815
+             817: 17(f16vec3) CompositeConstruct 812 814 816
+             818:     84(ptr) AccessChain 23 83
+                              Store 818 817
+             819:     96(ptr) AccessChain 23 95
+             820: 19(i16vec4) Load 819
+             821: 18(int16_t) CompositeExtract 820 0
+             822: 18(int16_t) GroupSMax 28 ExclusiveScan 821
+             823: 18(int16_t) CompositeExtract 820 1
+             824: 18(int16_t) GroupSMax 28 ExclusiveScan 823
+             825: 18(int16_t) CompositeExtract 820 2
+             826: 18(int16_t) GroupSMax 28 ExclusiveScan 825
+             827: 18(int16_t) CompositeExtract 820 3
+             828: 18(int16_t) GroupSMax 28 ExclusiveScan 827
+             829: 19(i16vec4) CompositeConstruct 822 824 826 828
+             830:     96(ptr) AccessChain 23 95
+                              Store 830 829
+             831:    110(ptr) AccessChain 23 109
+             832: 20(int16_t) Load 831
+             833: 20(int16_t) GroupUMax 28 ExclusiveScan 832
+             834:    110(ptr) AccessChain 23 109
+                              Store 834 833
+             835:     25(ptr) AccessChain 23 24
+             836:      6(int) Load 835
+             837:      6(int) GroupIAdd 28 ExclusiveScan 836
+             838:     25(ptr) AccessChain 23 24
+                              Store 838 837
+             839:     32(ptr) AccessChain 23 31
+             840:    8(ivec2) Load 839
+             841:      7(int) CompositeExtract 840 0
+             842:      7(int) GroupIAdd 28 ExclusiveScan 841
+             843:      7(int) CompositeExtract 840 1
+             844:      7(int) GroupIAdd 28 ExclusiveScan 843
+             845:    8(ivec2) CompositeConstruct 842 844
+             846:     32(ptr) AccessChain 23 31
+                              Store 846 845
+             847:     42(ptr) AccessChain 23 41
+             848:   10(fvec3) Load 847
+             849:    9(float) CompositeExtract 848 0
+             850:    9(float) GroupFAdd 28 ExclusiveScan 849
+             851:    9(float) CompositeExtract 848 1
+             852:    9(float) GroupFAdd 28 ExclusiveScan 851
+             853:    9(float) CompositeExtract 848 2
+             854:    9(float) GroupFAdd 28 ExclusiveScan 853
+             855:   10(fvec3) CompositeConstruct 850 852 854
+             856:     42(ptr) AccessChain 23 41
+                              Store 856 855
+             857:     54(ptr) AccessChain 23 53
+             858: 12(f64vec4) Load 857
+             859:11(float64_t) CompositeExtract 858 0
+             860:11(float64_t) GroupFAdd 28 ExclusiveScan 859
+             861:11(float64_t) CompositeExtract 858 1
+             862:11(float64_t) GroupFAdd 28 ExclusiveScan 861
+             863:11(float64_t) CompositeExtract 858 2
+             864:11(float64_t) GroupFAdd 28 ExclusiveScan 863
+             865:11(float64_t) CompositeExtract 858 3
+             866:11(float64_t) GroupFAdd 28 ExclusiveScan 865
+             867: 12(f64vec4) CompositeConstruct 860 862 864 866
+             868:     54(ptr) AccessChain 23 53
+                              Store 868 867
+             869:     68(ptr) AccessChain 23 67
+             870: 13(int64_t) Load 869
+             871: 13(int64_t) GroupIAdd 28 ExclusiveScan 870
+             872:     68(ptr) AccessChain 23 67
+                              Store 872 871
+             873:     74(ptr) AccessChain 23 73
+             874: 15(i64vec2) Load 873
+             875: 14(int64_t) CompositeExtract 874 0
+             876: 14(int64_t) GroupIAdd 28 ExclusiveScan 875
+             877: 14(int64_t) CompositeExtract 874 1
+             878: 14(int64_t) GroupIAdd 28 ExclusiveScan 877
+             879: 15(i64vec2) CompositeConstruct 876 878
+             880:     74(ptr) AccessChain 23 73
+                              Store 880 879
+             881:     84(ptr) AccessChain 23 83
+             882: 17(f16vec3) Load 881
+             883:16(float16_t) CompositeExtract 882 0
+             884:16(float16_t) GroupFAdd 28 ExclusiveScan 883
+             885:16(float16_t) CompositeExtract 882 1
+             886:16(float16_t) GroupFAdd 28 ExclusiveScan 885
+             887:16(float16_t) CompositeExtract 882 2
+             888:16(float16_t) GroupFAdd 28 ExclusiveScan 887
+             889: 17(f16vec3) CompositeConstruct 884 886 888
+             890:     84(ptr) AccessChain 23 83
+                              Store 890 889
+             891:     96(ptr) AccessChain 23 95
+             892: 19(i16vec4) Load 891
+             893: 18(int16_t) CompositeExtract 892 0
+             894: 18(int16_t) GroupIAdd 28 ExclusiveScan 893
+             895: 18(int16_t) CompositeExtract 892 1
+             896: 18(int16_t) GroupIAdd 28 ExclusiveScan 895
+             897: 18(int16_t) CompositeExtract 892 2
+             898: 18(int16_t) GroupIAdd 28 ExclusiveScan 897
+             899: 18(int16_t) CompositeExtract 892 3
+             900: 18(int16_t) GroupIAdd 28 ExclusiveScan 899
+             901: 19(i16vec4) CompositeConstruct 894 896 898 900
+             902:     96(ptr) AccessChain 23 95
+                              Store 902 901
+             903:    110(ptr) AccessChain 23 109
+             904: 20(int16_t) Load 903
+             905: 20(int16_t) GroupIAdd 28 ExclusiveScan 904
+             906:    110(ptr) AccessChain 23 109
+                              Store 906 905
+             907:     25(ptr) AccessChain 23 24
+             908:      6(int) Load 907
+             909:      6(int) GroupSMinNonUniformAMD 28 InclusiveScan 908
+             910:     25(ptr) AccessChain 23 24
+                              Store 910 909
+             911:     32(ptr) AccessChain 23 31
+             912:    8(ivec2) Load 911
+             913:      7(int) CompositeExtract 912 0
+             914:      7(int) GroupUMinNonUniformAMD 28 InclusiveScan 913
+             915:      7(int) CompositeExtract 912 1
+             916:      7(int) GroupUMinNonUniformAMD 28 InclusiveScan 915
+             917:    8(ivec2) CompositeConstruct 914 916
+             918:     32(ptr) AccessChain 23 31
+                              Store 918 917
+             919:     42(ptr) AccessChain 23 41
+             920:   10(fvec3) Load 919
+             921:    9(float) CompositeExtract 920 0
+             922:    9(float) GroupFMinNonUniformAMD 28 InclusiveScan 921
+             923:    9(float) CompositeExtract 920 1
+             924:    9(float) GroupFMinNonUniformAMD 28 InclusiveScan 923
+             925:    9(float) CompositeExtract 920 2
+             926:    9(float) GroupFMinNonUniformAMD 28 InclusiveScan 925
+             927:   10(fvec3) CompositeConstruct 922 924 926
+             928:     42(ptr) AccessChain 23 41
+                              Store 928 927
+             929:     54(ptr) AccessChain 23 53
+             930: 12(f64vec4) Load 929
+             931:11(float64_t) CompositeExtract 930 0
+             932:11(float64_t) GroupFMinNonUniformAMD 28 InclusiveScan 931
+             933:11(float64_t) CompositeExtract 930 1
+             934:11(float64_t) GroupFMinNonUniformAMD 28 InclusiveScan 933
+             935:11(float64_t) CompositeExtract 930 2
+             936:11(float64_t) GroupFMinNonUniformAMD 28 InclusiveScan 935
+             937:11(float64_t) CompositeExtract 930 3
+             938:11(float64_t) GroupFMinNonUniformAMD 28 InclusiveScan 937
+             939: 12(f64vec4) CompositeConstruct 932 934 936 938
+             940:     54(ptr) AccessChain 23 53
+                              Store 940 939
+             941:     68(ptr) AccessChain 23 67
+             942: 13(int64_t) Load 941
+             943: 13(int64_t) GroupSMinNonUniformAMD 28 InclusiveScan 942
+             944:     68(ptr) AccessChain 23 67
+                              Store 944 943
+             945:     74(ptr) AccessChain 23 73
+             946: 15(i64vec2) Load 945
+             947: 14(int64_t) CompositeExtract 946 0
+             948: 14(int64_t) GroupUMinNonUniformAMD 28 InclusiveScan 947
+             949: 14(int64_t) CompositeExtract 946 1
+             950: 14(int64_t) GroupUMinNonUniformAMD 28 InclusiveScan 949
+             951: 15(i64vec2) CompositeConstruct 948 950
+             952:     74(ptr) AccessChain 23 73
+                              Store 952 951
+             953:     84(ptr) AccessChain 23 83
+             954: 17(f16vec3) Load 953
+             955:16(float16_t) CompositeExtract 954 0
+             956:16(float16_t) GroupFMinNonUniformAMD 28 InclusiveScan 955
+             957:16(float16_t) CompositeExtract 954 1
+             958:16(float16_t) GroupFMinNonUniformAMD 28 InclusiveScan 957
+             959:16(float16_t) CompositeExtract 954 2
+             960:16(float16_t) GroupFMinNonUniformAMD 28 InclusiveScan 959
+             961: 17(f16vec3) CompositeConstruct 956 958 960
+             962:     84(ptr) AccessChain 23 83
+                              Store 962 961
+             963:     96(ptr) AccessChain 23 95
+             964: 19(i16vec4) Load 963
+             965: 18(int16_t) CompositeExtract 964 0
+             966: 18(int16_t) GroupSMinNonUniformAMD 28 InclusiveScan 965
+             967: 18(int16_t) CompositeExtract 964 1
+             968: 18(int16_t) GroupSMinNonUniformAMD 28 InclusiveScan 967
+             969: 18(int16_t) CompositeExtract 964 2
+             970: 18(int16_t) GroupSMinNonUniformAMD 28 InclusiveScan 969
+             971: 18(int16_t) CompositeExtract 964 3
+             972: 18(int16_t) GroupSMinNonUniformAMD 28 InclusiveScan 971
+             973: 19(i16vec4) CompositeConstruct 966 968 970 972
+             974:     96(ptr) AccessChain 23 95
+                              Store 974 973
+             975:    110(ptr) AccessChain 23 109
+             976: 20(int16_t) Load 975
+             977: 20(int16_t) GroupUMinNonUniformAMD 28 InclusiveScan 976
+             978:    110(ptr) AccessChain 23 109
+                              Store 978 977
+             979:     25(ptr) AccessChain 23 24
+             980:      6(int) Load 979
+             981:      6(int) GroupSMaxNonUniformAMD 28 InclusiveScan 980
+             982:     25(ptr) AccessChain 23 24
+                              Store 982 981
+             983:     32(ptr) AccessChain 23 31
+             984:    8(ivec2) Load 983
+             985:      7(int) CompositeExtract 984 0
+             986:      7(int) GroupUMaxNonUniformAMD 28 InclusiveScan 985
+             987:      7(int) CompositeExtract 984 1
+             988:      7(int) GroupUMaxNonUniformAMD 28 InclusiveScan 987
+             989:    8(ivec2) CompositeConstruct 986 988
+             990:     32(ptr) AccessChain 23 31
+                              Store 990 989
+             991:     42(ptr) AccessChain 23 41
+             992:   10(fvec3) Load 991
+             993:    9(float) CompositeExtract 992 0
+             994:    9(float) GroupFMaxNonUniformAMD 28 InclusiveScan 993
+             995:    9(float) CompositeExtract 992 1
+             996:    9(float) GroupFMaxNonUniformAMD 28 InclusiveScan 995
+             997:    9(float) CompositeExtract 992 2
+             998:    9(float) GroupFMaxNonUniformAMD 28 InclusiveScan 997
+             999:   10(fvec3) CompositeConstruct 994 996 998
+            1000:     42(ptr) AccessChain 23 41
+                              Store 1000 999
+            1001:     54(ptr) AccessChain 23 53
+            1002: 12(f64vec4) Load 1001
+            1003:11(float64_t) CompositeExtract 1002 0
+            1004:11(float64_t) GroupFMaxNonUniformAMD 28 InclusiveScan 1003
+            1005:11(float64_t) CompositeExtract 1002 1
+            1006:11(float64_t) GroupFMaxNonUniformAMD 28 InclusiveScan 1005
+            1007:11(float64_t) CompositeExtract 1002 2
+            1008:11(float64_t) GroupFMaxNonUniformAMD 28 InclusiveScan 1007
+            1009:11(float64_t) CompositeExtract 1002 3
+            1010:11(float64_t) GroupFMaxNonUniformAMD 28 InclusiveScan 1009
+            1011: 12(f64vec4) CompositeConstruct 1004 1006 1008 1010
+            1012:     54(ptr) AccessChain 23 53
+                              Store 1012 1011
+            1013:     68(ptr) AccessChain 23 67
+            1014: 13(int64_t) Load 1013
+            1015: 13(int64_t) GroupSMaxNonUniformAMD 28 InclusiveScan 1014
+            1016:     68(ptr) AccessChain 23 67
+                              Store 1016 1015
+            1017:     74(ptr) AccessChain 23 73
+            1018: 15(i64vec2) Load 1017
+            1019: 14(int64_t) CompositeExtract 1018 0
+            1020: 14(int64_t) GroupUMaxNonUniformAMD 28 InclusiveScan 1019
+            1021: 14(int64_t) CompositeExtract 1018 1
+            1022: 14(int64_t) GroupUMaxNonUniformAMD 28 InclusiveScan 1021
+            1023: 15(i64vec2) CompositeConstruct 1020 1022
+            1024:     74(ptr) AccessChain 23 73
+                              Store 1024 1023
+            1025:     84(ptr) AccessChain 23 83
+            1026: 17(f16vec3) Load 1025
+            1027:16(float16_t) CompositeExtract 1026 0
+            1028:16(float16_t) GroupFMaxNonUniformAMD 28 InclusiveScan 1027
+            1029:16(float16_t) CompositeExtract 1026 1
+            1030:16(float16_t) GroupFMaxNonUniformAMD 28 InclusiveScan 1029
+            1031:16(float16_t) CompositeExtract 1026 2
+            1032:16(float16_t) GroupFMaxNonUniformAMD 28 InclusiveScan 1031
+            1033: 17(f16vec3) CompositeConstruct 1028 1030 1032
+            1034:     84(ptr) AccessChain 23 83
+                              Store 1034 1033
+            1035:     96(ptr) AccessChain 23 95
+            1036: 19(i16vec4) Load 1035
+            1037: 18(int16_t) CompositeExtract 1036 0
+            1038: 18(int16_t) GroupSMaxNonUniformAMD 28 InclusiveScan 1037
+            1039: 18(int16_t) CompositeExtract 1036 1
+            1040: 18(int16_t) GroupSMaxNonUniformAMD 28 InclusiveScan 1039
+            1041: 18(int16_t) CompositeExtract 1036 2
+            1042: 18(int16_t) GroupSMaxNonUniformAMD 28 InclusiveScan 1041
+            1043: 18(int16_t) CompositeExtract 1036 3
+            1044: 18(int16_t) GroupSMaxNonUniformAMD 28 InclusiveScan 1043
+            1045: 19(i16vec4) CompositeConstruct 1038 1040 1042 1044
+            1046:     96(ptr) AccessChain 23 95
+                              Store 1046 1045
+            1047:    110(ptr) AccessChain 23 109
+            1048: 20(int16_t) Load 1047
+            1049: 20(int16_t) GroupUMaxNonUniformAMD 28 InclusiveScan 1048
+            1050:    110(ptr) AccessChain 23 109
+                              Store 1050 1049
+            1051:     25(ptr) AccessChain 23 24
+            1052:      6(int) Load 1051
+            1053:      6(int) GroupIAddNonUniformAMD 28 InclusiveScan 1052
+            1054:     25(ptr) AccessChain 23 24
+                              Store 1054 1053
+            1055:     32(ptr) AccessChain 23 31
+            1056:    8(ivec2) Load 1055
+            1057:      7(int) CompositeExtract 1056 0
+            1058:      7(int) GroupIAddNonUniformAMD 28 InclusiveScan 1057
+            1059:      7(int) CompositeExtract 1056 1
+            1060:      7(int) GroupIAddNonUniformAMD 28 InclusiveScan 1059
+            1061:    8(ivec2) CompositeConstruct 1058 1060
+            1062:     32(ptr) AccessChain 23 31
+                              Store 1062 1061
+            1063:     42(ptr) AccessChain 23 41
+            1064:   10(fvec3) Load 1063
+            1065:    9(float) CompositeExtract 1064 0
+            1066:    9(float) GroupFAddNonUniformAMD 28 InclusiveScan 1065
+            1067:    9(float) CompositeExtract 1064 1
+            1068:    9(float) GroupFAddNonUniformAMD 28 InclusiveScan 1067
+            1069:    9(float) CompositeExtract 1064 2
+            1070:    9(float) GroupFAddNonUniformAMD 28 InclusiveScan 1069
+            1071:   10(fvec3) CompositeConstruct 1066 1068 1070
+            1072:     42(ptr) AccessChain 23 41
+                              Store 1072 1071
+            1073:     54(ptr) AccessChain 23 53
+            1074: 12(f64vec4) Load 1073
+            1075:11(float64_t) CompositeExtract 1074 0
+            1076:11(float64_t) GroupFAddNonUniformAMD 28 InclusiveScan 1075
+            1077:11(float64_t) CompositeExtract 1074 1
+            1078:11(float64_t) GroupFAddNonUniformAMD 28 InclusiveScan 1077
+            1079:11(float64_t) CompositeExtract 1074 2
+            1080:11(float64_t) GroupFAddNonUniformAMD 28 InclusiveScan 1079
+            1081:11(float64_t) CompositeExtract 1074 3
+            1082:11(float64_t) GroupFAddNonUniformAMD 28 InclusiveScan 1081
+            1083: 12(f64vec4) CompositeConstruct 1076 1078 1080 1082
+            1084:     54(ptr) AccessChain 23 53
+                              Store 1084 1083
+            1085:     68(ptr) AccessChain 23 67
+            1086: 13(int64_t) Load 1085
+            1087: 13(int64_t) GroupIAddNonUniformAMD 28 InclusiveScan 1086
+            1088:     68(ptr) AccessChain 23 67
+                              Store 1088 1087
+            1089:     74(ptr) AccessChain 23 73
+            1090: 15(i64vec2) Load 1089
+            1091: 14(int64_t) CompositeExtract 1090 0
+            1092: 14(int64_t) GroupIAddNonUniformAMD 28 InclusiveScan 1091
+            1093: 14(int64_t) CompositeExtract 1090 1
+            1094: 14(int64_t) GroupIAddNonUniformAMD 28 InclusiveScan 1093
+            1095: 15(i64vec2) CompositeConstruct 1092 1094
+            1096:     74(ptr) AccessChain 23 73
+                              Store 1096 1095
+            1097:     84(ptr) AccessChain 23 83
+            1098: 17(f16vec3) Load 1097
+            1099:16(float16_t) CompositeExtract 1098 0
+            1100:16(float16_t) GroupFAddNonUniformAMD 28 InclusiveScan 1099
+            1101:16(float16_t) CompositeExtract 1098 1
+            1102:16(float16_t) GroupFAddNonUniformAMD 28 InclusiveScan 1101
+            1103:16(float16_t) CompositeExtract 1098 2
+            1104:16(float16_t) GroupFAddNonUniformAMD 28 InclusiveScan 1103
+            1105: 17(f16vec3) CompositeConstruct 1100 1102 1104
+            1106:     84(ptr) AccessChain 23 83
+                              Store 1106 1105
+            1107:     96(ptr) AccessChain 23 95
+            1108: 19(i16vec4) Load 1107
+            1109: 18(int16_t) CompositeExtract 1108 0
+            1110: 18(int16_t) GroupIAddNonUniformAMD 28 InclusiveScan 1109
+            1111: 18(int16_t) CompositeExtract 1108 1
+            1112: 18(int16_t) GroupIAddNonUniformAMD 28 InclusiveScan 1111
+            1113: 18(int16_t) CompositeExtract 1108 2
+            1114: 18(int16_t) GroupIAddNonUniformAMD 28 InclusiveScan 1113
+            1115: 18(int16_t) CompositeExtract 1108 3
+            1116: 18(int16_t) GroupIAddNonUniformAMD 28 InclusiveScan 1115
+            1117: 19(i16vec4) CompositeConstruct 1110 1112 1114 1116
+            1118:     96(ptr) AccessChain 23 95
+                              Store 1118 1117
+            1119:    110(ptr) AccessChain 23 109
+            1120: 20(int16_t) Load 1119
+            1121: 20(int16_t) GroupIAddNonUniformAMD 28 InclusiveScan 1120
+            1122:    110(ptr) AccessChain 23 109
+                              Store 1122 1121
+            1123:     25(ptr) AccessChain 23 24
+            1124:      6(int) Load 1123
+            1125:      6(int) GroupSMinNonUniformAMD 28 ExclusiveScan 1124
+            1126:     25(ptr) AccessChain 23 24
+                              Store 1126 1125
+            1127:     32(ptr) AccessChain 23 31
+            1128:    8(ivec2) Load 1127
+            1129:      7(int) CompositeExtract 1128 0
+            1130:      7(int) GroupUMinNonUniformAMD 28 ExclusiveScan 1129
+            1131:      7(int) CompositeExtract 1128 1
+            1132:      7(int) GroupUMinNonUniformAMD 28 ExclusiveScan 1131
+            1133:    8(ivec2) CompositeConstruct 1130 1132
+            1134:     32(ptr) AccessChain 23 31
+                              Store 1134 1133
+            1135:     42(ptr) AccessChain 23 41
+            1136:   10(fvec3) Load 1135
+            1137:    9(float) CompositeExtract 1136 0
+            1138:    9(float) GroupFMinNonUniformAMD 28 ExclusiveScan 1137
+            1139:    9(float) CompositeExtract 1136 1
+            1140:    9(float) GroupFMinNonUniformAMD 28 ExclusiveScan 1139
+            1141:    9(float) CompositeExtract 1136 2
+            1142:    9(float) GroupFMinNonUniformAMD 28 ExclusiveScan 1141
+            1143:   10(fvec3) CompositeConstruct 1138 1140 1142
+            1144:     42(ptr) AccessChain 23 41
+                              Store 1144 1143
+            1145:     54(ptr) AccessChain 23 53
+            1146: 12(f64vec4) Load 1145
+            1147:11(float64_t) CompositeExtract 1146 0
+            1148:11(float64_t) GroupFMinNonUniformAMD 28 ExclusiveScan 1147
+            1149:11(float64_t) CompositeExtract 1146 1
+            1150:11(float64_t) GroupFMinNonUniformAMD 28 ExclusiveScan 1149
+            1151:11(float64_t) CompositeExtract 1146 2
+            1152:11(float64_t) GroupFMinNonUniformAMD 28 ExclusiveScan 1151
+            1153:11(float64_t) CompositeExtract 1146 3
+            1154:11(float64_t) GroupFMinNonUniformAMD 28 ExclusiveScan 1153
+            1155: 12(f64vec4) CompositeConstruct 1148 1150 1152 1154
+            1156:     54(ptr) AccessChain 23 53
+                              Store 1156 1155
+            1157:     68(ptr) AccessChain 23 67
+            1158: 13(int64_t) Load 1157
+            1159: 13(int64_t) GroupSMinNonUniformAMD 28 ExclusiveScan 1158
+            1160:     68(ptr) AccessChain 23 67
+                              Store 1160 1159
+            1161:     74(ptr) AccessChain 23 73
+            1162: 15(i64vec2) Load 1161
+            1163: 14(int64_t) CompositeExtract 1162 0
+            1164: 14(int64_t) GroupUMinNonUniformAMD 28 ExclusiveScan 1163
+            1165: 14(int64_t) CompositeExtract 1162 1
+            1166: 14(int64_t) GroupUMinNonUniformAMD 28 ExclusiveScan 1165
+            1167: 15(i64vec2) CompositeConstruct 1164 1166
+            1168:     74(ptr) AccessChain 23 73
+                              Store 1168 1167
+            1169:     84(ptr) AccessChain 23 83
+            1170: 17(f16vec3) Load 1169
+            1171:16(float16_t) CompositeExtract 1170 0
+            1172:16(float16_t) GroupFMinNonUniformAMD 28 ExclusiveScan 1171
+            1173:16(float16_t) CompositeExtract 1170 1
+            1174:16(float16_t) GroupFMinNonUniformAMD 28 ExclusiveScan 1173
+            1175:16(float16_t) CompositeExtract 1170 2
+            1176:16(float16_t) GroupFMinNonUniformAMD 28 ExclusiveScan 1175
+            1177: 17(f16vec3) CompositeConstruct 1172 1174 1176
+            1178:     84(ptr) AccessChain 23 83
+                              Store 1178 1177
+            1179:     96(ptr) AccessChain 23 95
+            1180: 19(i16vec4) Load 1179
+            1181: 18(int16_t) CompositeExtract 1180 0
+            1182: 18(int16_t) GroupSMinNonUniformAMD 28 ExclusiveScan 1181
+            1183: 18(int16_t) CompositeExtract 1180 1
+            1184: 18(int16_t) GroupSMinNonUniformAMD 28 ExclusiveScan 1183
+            1185: 18(int16_t) CompositeExtract 1180 2
+            1186: 18(int16_t) GroupSMinNonUniformAMD 28 ExclusiveScan 1185
+            1187: 18(int16_t) CompositeExtract 1180 3
+            1188: 18(int16_t) GroupSMinNonUniformAMD 28 ExclusiveScan 1187
+            1189: 19(i16vec4) CompositeConstruct 1182 1184 1186 1188
+            1190:     96(ptr) AccessChain 23 95
+                              Store 1190 1189
+            1191:    110(ptr) AccessChain 23 109
+            1192: 20(int16_t) Load 1191
+            1193: 20(int16_t) GroupUMinNonUniformAMD 28 ExclusiveScan 1192
+            1194:    110(ptr) AccessChain 23 109
+                              Store 1194 1193
+            1195:     25(ptr) AccessChain 23 24
+            1196:      6(int) Load 1195
+            1197:      6(int) GroupSMaxNonUniformAMD 28 ExclusiveScan 1196
+            1198:     25(ptr) AccessChain 23 24
+                              Store 1198 1197
+            1199:     32(ptr) AccessChain 23 31
+            1200:    8(ivec2) Load 1199
+            1201:      7(int) CompositeExtract 1200 0
+            1202:      7(int) GroupUMaxNonUniformAMD 28 ExclusiveScan 1201
+            1203:      7(int) CompositeExtract 1200 1
+            1204:      7(int) GroupUMaxNonUniformAMD 28 ExclusiveScan 1203
+            1205:    8(ivec2) CompositeConstruct 1202 1204
+            1206:     32(ptr) AccessChain 23 31
+                              Store 1206 1205
+            1207:     42(ptr) AccessChain 23 41
+            1208:   10(fvec3) Load 1207
+            1209:    9(float) CompositeExtract 1208 0
+            1210:    9(float) GroupFMaxNonUniformAMD 28 ExclusiveScan 1209
+            1211:    9(float) CompositeExtract 1208 1
+            1212:    9(float) GroupFMaxNonUniformAMD 28 ExclusiveScan 1211
+            1213:    9(float) CompositeExtract 1208 2
+            1214:    9(float) GroupFMaxNonUniformAMD 28 ExclusiveScan 1213
+            1215:   10(fvec3) CompositeConstruct 1210 1212 1214
+            1216:     42(ptr) AccessChain 23 41
+                              Store 1216 1215
+            1217:     54(ptr) AccessChain 23 53
+            1218: 12(f64vec4) Load 1217
+            1219:11(float64_t) CompositeExtract 1218 0
+            1220:11(float64_t) GroupFMaxNonUniformAMD 28 ExclusiveScan 1219
+            1221:11(float64_t) CompositeExtract 1218 1
+            1222:11(float64_t) GroupFMaxNonUniformAMD 28 ExclusiveScan 1221
+            1223:11(float64_t) CompositeExtract 1218 2
+            1224:11(float64_t) GroupFMaxNonUniformAMD 28 ExclusiveScan 1223
+            1225:11(float64_t) CompositeExtract 1218 3
+            1226:11(float64_t) GroupFMaxNonUniformAMD 28 ExclusiveScan 1225
+            1227: 12(f64vec4) CompositeConstruct 1220 1222 1224 1226
+            1228:     54(ptr) AccessChain 23 53
+                              Store 1228 1227
+            1229:     68(ptr) AccessChain 23 67
+            1230: 13(int64_t) Load 1229
+            1231: 13(int64_t) GroupSMaxNonUniformAMD 28 ExclusiveScan 1230
+            1232:     68(ptr) AccessChain 23 67
+                              Store 1232 1231
+            1233:     74(ptr) AccessChain 23 73
+            1234: 15(i64vec2) Load 1233
+            1235: 14(int64_t) CompositeExtract 1234 0
+            1236: 14(int64_t) GroupUMaxNonUniformAMD 28 ExclusiveScan 1235
+            1237: 14(int64_t) CompositeExtract 1234 1
+            1238: 14(int64_t) GroupUMaxNonUniformAMD 28 ExclusiveScan 1237
+            1239: 15(i64vec2) CompositeConstruct 1236 1238
+            1240:     74(ptr) AccessChain 23 73
+                              Store 1240 1239
+            1241:     84(ptr) AccessChain 23 83
+            1242: 17(f16vec3) Load 1241
+            1243:16(float16_t) CompositeExtract 1242 0
+            1244:16(float16_t) GroupFMaxNonUniformAMD 28 ExclusiveScan 1243
+            1245:16(float16_t) CompositeExtract 1242 1
+            1246:16(float16_t) GroupFMaxNonUniformAMD 28 ExclusiveScan 1245
+            1247:16(float16_t) CompositeExtract 1242 2
+            1248:16(float16_t) GroupFMaxNonUniformAMD 28 ExclusiveScan 1247
+            1249: 17(f16vec3) CompositeConstruct 1244 1246 1248
+            1250:     84(ptr) AccessChain 23 83
+                              Store 1250 1249
+            1251:     96(ptr) AccessChain 23 95
+            1252: 19(i16vec4) Load 1251
+            1253: 18(int16_t) CompositeExtract 1252 0
+            1254: 18(int16_t) GroupSMaxNonUniformAMD 28 ExclusiveScan 1253
+            1255: 18(int16_t) CompositeExtract 1252 1
+            1256: 18(int16_t) GroupSMaxNonUniformAMD 28 ExclusiveScan 1255
+            1257: 18(int16_t) CompositeExtract 1252 2
+            1258: 18(int16_t) GroupSMaxNonUniformAMD 28 ExclusiveScan 1257
+            1259: 18(int16_t) CompositeExtract 1252 3
+            1260: 18(int16_t) GroupSMaxNonUniformAMD 28 ExclusiveScan 1259
+            1261: 19(i16vec4) CompositeConstruct 1254 1256 1258 1260
+            1262:     96(ptr) AccessChain 23 95
+                              Store 1262 1261
+            1263:    110(ptr) AccessChain 23 109
+            1264: 20(int16_t) Load 1263
+            1265: 20(int16_t) GroupUMaxNonUniformAMD 28 ExclusiveScan 1264
+            1266:    110(ptr) AccessChain 23 109
+                              Store 1266 1265
+            1267:     25(ptr) AccessChain 23 24
+            1268:      6(int) Load 1267
+            1269:      6(int) GroupIAddNonUniformAMD 28 ExclusiveScan 1268
+            1270:     25(ptr) AccessChain 23 24
+                              Store 1270 1269
+            1271:     32(ptr) AccessChain 23 31
+            1272:    8(ivec2) Load 1271
+            1273:      7(int) CompositeExtract 1272 0
+            1274:      7(int) GroupIAddNonUniformAMD 28 ExclusiveScan 1273
+            1275:      7(int) CompositeExtract 1272 1
+            1276:      7(int) GroupIAddNonUniformAMD 28 ExclusiveScan 1275
+            1277:    8(ivec2) CompositeConstruct 1274 1276
+            1278:     32(ptr) AccessChain 23 31
+                              Store 1278 1277
+            1279:     42(ptr) AccessChain 23 41
+            1280:   10(fvec3) Load 1279
+            1281:    9(float) CompositeExtract 1280 0
+            1282:    9(float) GroupFAddNonUniformAMD 28 ExclusiveScan 1281
+            1283:    9(float) CompositeExtract 1280 1
+            1284:    9(float) GroupFAddNonUniformAMD 28 ExclusiveScan 1283
+            1285:    9(float) CompositeExtract 1280 2
+            1286:    9(float) GroupFAddNonUniformAMD 28 ExclusiveScan 1285
+            1287:   10(fvec3) CompositeConstruct 1282 1284 1286
+            1288:     42(ptr) AccessChain 23 41
+                              Store 1288 1287
+            1289:     54(ptr) AccessChain 23 53
+            1290: 12(f64vec4) Load 1289
+            1291:11(float64_t) CompositeExtract 1290 0
+            1292:11(float64_t) GroupFAddNonUniformAMD 28 ExclusiveScan 1291
+            1293:11(float64_t) CompositeExtract 1290 1
+            1294:11(float64_t) GroupFAddNonUniformAMD 28 ExclusiveScan 1293
+            1295:11(float64_t) CompositeExtract 1290 2
+            1296:11(float64_t) GroupFAddNonUniformAMD 28 ExclusiveScan 1295
+            1297:11(float64_t) CompositeExtract 1290 3
+            1298:11(float64_t) GroupFAddNonUniformAMD 28 ExclusiveScan 1297
+            1299: 12(f64vec4) CompositeConstruct 1292 1294 1296 1298
+            1300:     54(ptr) AccessChain 23 53
+                              Store 1300 1299
+            1301:     68(ptr) AccessChain 23 67
+            1302: 13(int64_t) Load 1301
+            1303: 13(int64_t) GroupIAddNonUniformAMD 28 ExclusiveScan 1302
+            1304:     68(ptr) AccessChain 23 67
+                              Store 1304 1303
+            1305:     74(ptr) AccessChain 23 73
+            1306: 15(i64vec2) Load 1305
+            1307: 14(int64_t) CompositeExtract 1306 0
+            1308: 14(int64_t) GroupIAddNonUniformAMD 28 ExclusiveScan 1307
+            1309: 14(int64_t) CompositeExtract 1306 1
+            1310: 14(int64_t) GroupIAddNonUniformAMD 28 ExclusiveScan 1309
+            1311: 15(i64vec2) CompositeConstruct 1308 1310
+            1312:     74(ptr) AccessChain 23 73
+                              Store 1312 1311
+            1313:     84(ptr) AccessChain 23 83
+            1314: 17(f16vec3) Load 1313
+            1315:16(float16_t) CompositeExtract 1314 0
+            1316:16(float16_t) GroupFAddNonUniformAMD 28 ExclusiveScan 1315
+            1317:16(float16_t) CompositeExtract 1314 1
+            1318:16(float16_t) GroupFAddNonUniformAMD 28 ExclusiveScan 1317
+            1319:16(float16_t) CompositeExtract 1314 2
+            1320:16(float16_t) GroupFAddNonUniformAMD 28 ExclusiveScan 1319
+            1321: 17(f16vec3) CompositeConstruct 1316 1318 1320
+            1322:     84(ptr) AccessChain 23 83
+                              Store 1322 1321
+            1323:     96(ptr) AccessChain 23 95
+            1324: 19(i16vec4) Load 1323
+            1325: 18(int16_t) CompositeExtract 1324 0
+            1326: 18(int16_t) GroupIAddNonUniformAMD 28 ExclusiveScan 1325
+            1327: 18(int16_t) CompositeExtract 1324 1
+            1328: 18(int16_t) GroupIAddNonUniformAMD 28 ExclusiveScan 1327
+            1329: 18(int16_t) CompositeExtract 1324 2
+            1330: 18(int16_t) GroupIAddNonUniformAMD 28 ExclusiveScan 1329
+            1331: 18(int16_t) CompositeExtract 1324 3
+            1332: 18(int16_t) GroupIAddNonUniformAMD 28 ExclusiveScan 1331
+            1333: 19(i16vec4) CompositeConstruct 1326 1328 1330 1332
+            1334:     96(ptr) AccessChain 23 95
+                              Store 1334 1333
+            1335:    110(ptr) AccessChain 23 109
+            1336: 20(int16_t) Load 1335
+            1337: 20(int16_t) GroupIAddNonUniformAMD 28 ExclusiveScan 1336
+            1338:    110(ptr) AccessChain 23 109
+                              Store 1338 1337
                               Return
                               FunctionEnd
diff --git a/Test/baseResults/spv.shaderDrawParams.vert.out b/Test/baseResults/spv.shaderDrawParams.vert.out
index 41ad78d..d6b43e8 100644
--- a/Test/baseResults/spv.shaderDrawParams.vert.out
+++ b/Test/baseResults/spv.shaderDrawParams.vert.out
@@ -1,8 +1,6 @@
 spv.shaderDrawParams.vert
-Warning, version 450 is not yet complete; most version-specific features are present, but some are missing.
-
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 53
 
                               Capability Shader
diff --git a/Test/baseResults/spv.shaderFragMaskAMD.frag.out b/Test/baseResults/spv.shaderFragMaskAMD.frag.out
new file mode 100644
index 0000000..788d3ee
--- /dev/null
+++ b/Test/baseResults/spv.shaderFragMaskAMD.frag.out
@@ -0,0 +1,122 @@
+spv.shaderFragMaskAMD.frag
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 80
+
+                              Capability Shader
+                              Capability InputAttachment
+                              Capability FragmentMaskAMD
+                              Extension  "SPV_AMD_shader_fragment_mask"
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 78
+                              ExecutionMode 4 OriginUpperLeft
+                              Source GLSL 450
+                              SourceExtension  "GL_AMD_shader_fragment_mask"
+                              Name 4  "main"
+                              Name 9  "f4"
+                              Name 14  "fragMask"
+                              Name 18  "s2DMS"
+                              Name 27  "fragIndex"
+                              Name 42  "is2DMSArray"
+                              Name 62  "usubpassMS"
+                              Name 78  "fragColor"
+                              Decorate 18(s2DMS) DescriptorSet 0
+                              Decorate 18(s2DMS) Binding 0
+                              Decorate 42(is2DMSArray) DescriptorSet 0
+                              Decorate 42(is2DMSArray) Binding 1
+                              Decorate 62(usubpassMS) DescriptorSet 0
+                              Decorate 62(usubpassMS) Binding 2
+                              Decorate 62(usubpassMS) InputAttachmentIndex 0
+                              Decorate 78(fragColor) Location 0
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+               8:             TypePointer Function 7(fvec4)
+              10:    6(float) Constant 0
+              11:    7(fvec4) ConstantComposite 10 10 10 10
+              12:             TypeInt 32 0
+              13:             TypePointer Function 12(int)
+              15:             TypeImage 6(float) 2D multi-sampled sampled format:Unknown
+              16:             TypeSampledImage 15
+              17:             TypePointer UniformConstant 16
+       18(s2DMS):     17(ptr) Variable UniformConstant
+              20:             TypeInt 32 1
+              21:             TypeVector 20(int) 2
+              22:     20(int) Constant 2
+              23:     20(int) Constant 3
+              24:   21(ivec2) ConstantComposite 22 23
+              29:     12(int) Constant 240
+              31:     20(int) Constant 4
+              34:     12(int) Constant 1
+              39:             TypeImage 20(int) 2D array multi-sampled sampled format:Unknown
+              40:             TypeSampledImage 39
+              41:             TypePointer UniformConstant 40
+ 42(is2DMSArray):     41(ptr) Variable UniformConstant
+              44:             TypeVector 20(int) 3
+              45:     20(int) Constant 1
+              46:   44(ivec3) ConstantComposite 22 23 45
+              55:             TypeVector 20(int) 4
+              60:             TypeImage 12(int) SubpassData multi-sampled nonsampled format:Unknown
+              61:             TypePointer UniformConstant 60
+  62(usubpassMS):     61(ptr) Variable UniformConstant
+              64:     20(int) Constant 0
+              65:   21(ivec2) ConstantComposite 64 64
+              72:             TypeVector 12(int) 4
+              77:             TypePointer Output 7(fvec4)
+   78(fragColor):     77(ptr) Variable Output
+         4(main):           2 Function None 3
+               5:             Label
+           9(f4):      8(ptr) Variable Function
+    14(fragMask):     13(ptr) Variable Function
+   27(fragIndex):     13(ptr) Variable Function
+                              Store 9(f4) 11
+              19:          16 Load 18(s2DMS)
+              25:          15 Image 19
+              26:     12(int) FragmentMaskFetchAMD 25 24
+                              Store 14(fragMask) 26
+              28:     12(int) Load 14(fragMask)
+              30:     12(int) BitwiseAnd 28 29
+              32:     12(int) ShiftRightLogical 30 31
+                              Store 27(fragIndex) 32
+              33:          16 Load 18(s2DMS)
+              35:          15 Image 33
+              36:    7(fvec4) FragmentFetchAMD 35 24 34
+              37:    7(fvec4) Load 9(f4)
+              38:    7(fvec4) FAdd 37 36
+                              Store 9(f4) 38
+              43:          40 Load 42(is2DMSArray)
+              47:          39 Image 43
+              48:     12(int) FragmentMaskFetchAMD 47 46
+                              Store 14(fragMask) 48
+              49:     12(int) Load 14(fragMask)
+              50:     12(int) BitwiseAnd 49 29
+              51:     12(int) ShiftRightLogical 50 31
+                              Store 27(fragIndex) 51
+              52:          40 Load 42(is2DMSArray)
+              53:     12(int) Load 27(fragIndex)
+              54:          39 Image 52
+              56:   55(ivec4) FragmentFetchAMD 54 46 53
+              57:    7(fvec4) ConvertSToF 56
+              58:    7(fvec4) Load 9(f4)
+              59:    7(fvec4) FAdd 58 57
+                              Store 9(f4) 59
+              63:          60 Load 62(usubpassMS)
+              66:     12(int) FragmentMaskFetchAMD 63 65
+                              Store 14(fragMask) 66
+              67:     12(int) Load 14(fragMask)
+              68:     12(int) BitwiseAnd 67 29
+              69:     12(int) ShiftRightLogical 68 31
+                              Store 27(fragIndex) 69
+              70:          60 Load 62(usubpassMS)
+              71:     12(int) Load 27(fragIndex)
+              73:   72(ivec4) FragmentFetchAMD 70 65 71
+              74:    7(fvec4) ConvertUToF 73
+              75:    7(fvec4) Load 9(f4)
+              76:    7(fvec4) FAdd 75 74
+                              Store 9(f4) 76
+              79:    7(fvec4) Load 9(f4)
+                              Store 78(fragColor) 79
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.shaderGroupVote.comp.out b/Test/baseResults/spv.shaderGroupVote.comp.out
index 0277149..e45f585 100644
--- a/Test/baseResults/spv.shaderGroupVote.comp.out
+++ b/Test/baseResults/spv.shaderGroupVote.comp.out
@@ -1,8 +1,6 @@
 spv.shaderGroupVote.comp
-Warning, version 450 is not yet complete; most version-specific features are present, but some are missing.
-
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 33
 
                               Capability Shader
diff --git a/Test/baseResults/spv.shaderImageFootprint.frag.out b/Test/baseResults/spv.shaderImageFootprint.frag.out
new file mode 100644
index 0000000..2ada2b5
--- /dev/null
+++ b/Test/baseResults/spv.shaderImageFootprint.frag.out
@@ -0,0 +1,849 @@
+spv.shaderImageFootprint.frag
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 622
+
+                              Capability Shader
+                              Capability MinLod
+                              Capability Bad
+                              Extension  "SPV_NV_shader_image_footprint"
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 21 24 76 125 225 275 277 387
+                              ExecutionMode 4 OriginUpperLeft
+                              Source GLSL 450
+                              SourceExtension  "GL_NV_shader_texture_footprint"
+                              Name 4  "main"
+                              Name 8  "result2D"
+                              MemberName 8(result2D) 0  "ret2D"
+                              MemberName 8(result2D) 1  "anchor2D"
+                              MemberName 8(result2D) 2  "offset2D"
+                              MemberName 8(result2D) 3  "mask2D"
+                              MemberName 8(result2D) 4  "lod2D"
+                              MemberName 8(result2D) 5  "granularity2D"
+                              Name 10  ""
+                              Name 17  "sample2D"
+                              Name 21  "P2"
+                              Name 24  "granularity"
+                              Name 28  "gl_TextureFootprint2DNV"
+                              MemberName 28(gl_TextureFootprint2DNV) 0  "anchor"
+                              MemberName 28(gl_TextureFootprint2DNV) 1  "offset"
+                              MemberName 28(gl_TextureFootprint2DNV) 2  "mask"
+                              MemberName 28(gl_TextureFootprint2DNV) 3  "lod"
+                              MemberName 28(gl_TextureFootprint2DNV) 4  "granularity"
+                              Name 30  "fp2D"
+                              Name 31  "ResType"
+                              Name 76  "bias"
+                              Name 78  "ResType"
+                              Name 125  "lodClamp"
+                              Name 128  "ResType"
+                              Name 178  "ResType"
+                              Name 225  "lod"
+                              Name 228  "ResType"
+                              Name 275  "dx"
+                              Name 277  "dy"
+                              Name 280  "ResType"
+                              Name 331  "ResType"
+                              Name 377  "result3D"
+                              MemberName 377(result3D) 0  "ret3D"
+                              MemberName 377(result3D) 1  "anchor3D"
+                              MemberName 377(result3D) 2  "offset3D"
+                              MemberName 377(result3D) 3  "mask3D"
+                              MemberName 377(result3D) 4  "lod3D"
+                              MemberName 377(result3D) 5  "granularity3D"
+                              Name 379  ""
+                              Name 383  "sample3D"
+                              Name 387  "P3"
+                              Name 390  "gl_TextureFootprint3DNV"
+                              MemberName 390(gl_TextureFootprint3DNV) 0  "anchor"
+                              MemberName 390(gl_TextureFootprint3DNV) 1  "offset"
+                              MemberName 390(gl_TextureFootprint3DNV) 2  "mask"
+                              MemberName 390(gl_TextureFootprint3DNV) 3  "lod"
+                              MemberName 390(gl_TextureFootprint3DNV) 4  "granularity"
+                              Name 392  "fp3D"
+                              Name 393  "ResType"
+                              Name 429  "ResType"
+                              Name 478  "ResType"
+                              Name 528  "ResType"
+                              Name 577  "ResType"
+                              MemberDecorate 8(result2D) 0 Offset 0
+                              MemberDecorate 8(result2D) 1 Offset 8
+                              MemberDecorate 8(result2D) 2 Offset 16
+                              MemberDecorate 8(result2D) 3 Offset 24
+                              MemberDecorate 8(result2D) 4 Offset 32
+                              MemberDecorate 8(result2D) 5 Offset 36
+                              Decorate 8(result2D) BufferBlock
+                              Decorate 10 DescriptorSet 0
+                              Decorate 17(sample2D) DescriptorSet 0
+                              Decorate 21(P2) Location 0
+                              Decorate 24(granularity) Flat
+                              Decorate 24(granularity) Location 3
+                              Decorate 76(bias) Location 9
+                              Decorate 125(lodClamp) Location 4
+                              Decorate 225(lod) Location 5
+                              Decorate 275(dx) Location 6
+                              Decorate 277(dy) Location 8
+                              MemberDecorate 377(result3D) 0 Offset 0
+                              MemberDecorate 377(result3D) 1 Offset 16
+                              MemberDecorate 377(result3D) 2 Offset 32
+                              MemberDecorate 377(result3D) 3 Offset 48
+                              MemberDecorate 377(result3D) 4 Offset 56
+                              MemberDecorate 377(result3D) 5 Offset 60
+                              Decorate 377(result3D) BufferBlock
+                              Decorate 379 DescriptorSet 0
+                              Decorate 383(sample3D) DescriptorSet 0
+                              Decorate 387(P3) Location 2
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeInt 32 0
+               7:             TypeVector 6(int) 2
+     8(result2D):             TypeStruct 6(int) 7(ivec2) 7(ivec2) 7(ivec2) 6(int) 6(int)
+               9:             TypePointer Uniform 8(result2D)
+              10:      9(ptr) Variable Uniform
+              11:             TypeInt 32 1
+              12:     11(int) Constant 0
+              13:             TypeFloat 32
+              14:             TypeImage 13(float) 2D sampled format:Unknown
+              15:             TypeSampledImage 14
+              16:             TypePointer UniformConstant 15
+    17(sample2D):     16(ptr) Variable UniformConstant
+              19:             TypeVector 13(float) 2
+              20:             TypePointer Input 19(fvec2)
+          21(P2):     20(ptr) Variable Input
+              23:             TypePointer Input 11(int)
+ 24(granularity):     23(ptr) Variable Input
+              26:             TypeBool
+              27:    26(bool) ConstantTrue
+28(gl_TextureFootprint2DNV):             TypeStruct 7(ivec2) 7(ivec2) 7(ivec2) 6(int) 6(int)
+              29:             TypePointer Function 28(gl_TextureFootprint2DNV)
+     31(ResType):             TypeStruct 26(bool) 7(ivec2) 7(ivec2) 7(ivec2) 6(int) 6(int)
+              34:             TypePointer Function 7(ivec2)
+              36:     11(int) Constant 1
+              39:     11(int) Constant 2
+              42:     11(int) Constant 3
+              44:             TypePointer Function 6(int)
+              46:     11(int) Constant 4
+              50:      6(int) Constant 1
+              51:      6(int) Constant 0
+              53:             TypePointer Uniform 6(int)
+              57:             TypePointer Uniform 7(ivec2)
+              68:     11(int) Constant 5
+              75:             TypePointer Input 13(float)
+        76(bias):     75(ptr) Variable Input
+     78(ResType):             TypeStruct 26(bool) 7(ivec2) 7(ivec2) 7(ivec2) 6(int) 6(int)
+   125(lodClamp):     75(ptr) Variable Input
+    128(ResType):             TypeStruct 26(bool) 7(ivec2) 7(ivec2) 7(ivec2) 6(int) 6(int)
+    178(ResType):             TypeStruct 26(bool) 7(ivec2) 7(ivec2) 7(ivec2) 6(int) 6(int)
+        225(lod):     75(ptr) Variable Input
+    228(ResType):             TypeStruct 26(bool) 7(ivec2) 7(ivec2) 7(ivec2) 6(int) 6(int)
+         275(dx):     20(ptr) Variable Input
+         277(dy):     20(ptr) Variable Input
+    280(ResType):             TypeStruct 26(bool) 7(ivec2) 7(ivec2) 7(ivec2) 6(int) 6(int)
+    331(ResType):             TypeStruct 26(bool) 7(ivec2) 7(ivec2) 7(ivec2) 6(int) 6(int)
+             376:             TypeVector 6(int) 3
+   377(result3D):             TypeStruct 6(int) 376(ivec3) 376(ivec3) 7(ivec2) 6(int) 6(int)
+             378:             TypePointer Uniform 377(result3D)
+             379:    378(ptr) Variable Uniform
+             380:             TypeImage 13(float) 3D sampled format:Unknown
+             381:             TypeSampledImage 380
+             382:             TypePointer UniformConstant 381
+   383(sample3D):    382(ptr) Variable UniformConstant
+             385:             TypeVector 13(float) 3
+             386:             TypePointer Input 385(fvec3)
+         387(P3):    386(ptr) Variable Input
+390(gl_TextureFootprint3DNV):             TypeStruct 376(ivec3) 376(ivec3) 7(ivec2) 6(int) 6(int)
+             391:             TypePointer Function 390(gl_TextureFootprint3DNV)
+    393(ResType):             TypeStruct 26(bool) 376(ivec3) 376(ivec3) 7(ivec2) 6(int) 6(int)
+             396:             TypePointer Function 376(ivec3)
+             411:             TypePointer Uniform 376(ivec3)
+    429(ResType):             TypeStruct 26(bool) 376(ivec3) 376(ivec3) 7(ivec2) 6(int) 6(int)
+    478(ResType):             TypeStruct 26(bool) 376(ivec3) 376(ivec3) 7(ivec2) 6(int) 6(int)
+    528(ResType):             TypeStruct 26(bool) 376(ivec3) 376(ivec3) 7(ivec2) 6(int) 6(int)
+    577(ResType):             TypeStruct 26(bool) 376(ivec3) 376(ivec3) 7(ivec2) 6(int) 6(int)
+         4(main):           2 Function None 3
+               5:             Label
+        30(fp2D):     29(ptr) Variable Function
+       392(fp3D):    391(ptr) Variable Function
+              18:          15 Load 17(sample2D)
+              22:   19(fvec2) Load 21(P2)
+              25:     11(int) Load 24(granularity)
+              32: 31(ResType) ImageSampleFootprintNV 18 22 25 27
+              33:    7(ivec2) CompositeExtract 32 1
+              35:     34(ptr) AccessChain 30(fp2D) 12
+                              Store 35 33
+              37:    7(ivec2) CompositeExtract 32 2
+              38:     34(ptr) AccessChain 30(fp2D) 36
+                              Store 38 37
+              40:    7(ivec2) CompositeExtract 32 3
+              41:     34(ptr) AccessChain 30(fp2D) 39
+                              Store 41 40
+              43:      6(int) CompositeExtract 32 4
+              45:     44(ptr) AccessChain 30(fp2D) 42
+                              Store 45 43
+              47:      6(int) CompositeExtract 32 5
+              48:     44(ptr) AccessChain 30(fp2D) 46
+                              Store 48 47
+              49:    26(bool) CompositeExtract 32 0
+              52:      6(int) Select 49 50 51
+              54:     53(ptr) AccessChain 10 12
+                              Store 54 52
+              55:     34(ptr) AccessChain 30(fp2D) 12
+              56:    7(ivec2) Load 55
+              58:     57(ptr) AccessChain 10 36
+                              Store 58 56
+              59:     34(ptr) AccessChain 30(fp2D) 36
+              60:    7(ivec2) Load 59
+              61:     57(ptr) AccessChain 10 39
+                              Store 61 60
+              62:     34(ptr) AccessChain 30(fp2D) 39
+              63:    7(ivec2) Load 62
+              64:     57(ptr) AccessChain 10 42
+                              Store 64 63
+              65:     44(ptr) AccessChain 30(fp2D) 42
+              66:      6(int) Load 65
+              67:     53(ptr) AccessChain 10 46
+                              Store 67 66
+              69:     44(ptr) AccessChain 30(fp2D) 46
+              70:      6(int) Load 69
+              71:     53(ptr) AccessChain 10 68
+                              Store 71 70
+              72:          15 Load 17(sample2D)
+              73:   19(fvec2) Load 21(P2)
+              74:     11(int) Load 24(granularity)
+              77:   13(float) Load 76(bias)
+              79: 78(ResType) ImageSampleFootprintNV 72 73 74 27 Bias 77
+              80:    7(ivec2) CompositeExtract 79 1
+              81:     34(ptr) AccessChain 30(fp2D) 12
+                              Store 81 80
+              82:    7(ivec2) CompositeExtract 79 2
+              83:     34(ptr) AccessChain 30(fp2D) 36
+                              Store 83 82
+              84:    7(ivec2) CompositeExtract 79 3
+              85:     34(ptr) AccessChain 30(fp2D) 39
+                              Store 85 84
+              86:      6(int) CompositeExtract 79 4
+              87:     44(ptr) AccessChain 30(fp2D) 42
+                              Store 87 86
+              88:      6(int) CompositeExtract 79 5
+              89:     44(ptr) AccessChain 30(fp2D) 46
+                              Store 89 88
+              90:    26(bool) CompositeExtract 79 0
+              91:      6(int) Select 90 50 51
+              92:     53(ptr) AccessChain 10 12
+                              Store 92 91
+              93:     34(ptr) AccessChain 30(fp2D) 12
+              94:    7(ivec2) Load 93
+              95:     57(ptr) AccessChain 10 36
+              96:    7(ivec2) Load 95
+              97:    7(ivec2) IAdd 96 94
+              98:     57(ptr) AccessChain 10 36
+                              Store 98 97
+              99:     34(ptr) AccessChain 30(fp2D) 36
+             100:    7(ivec2) Load 99
+             101:     57(ptr) AccessChain 10 39
+             102:    7(ivec2) Load 101
+             103:    7(ivec2) IAdd 102 100
+             104:     57(ptr) AccessChain 10 39
+                              Store 104 103
+             105:     34(ptr) AccessChain 30(fp2D) 39
+             106:    7(ivec2) Load 105
+             107:     57(ptr) AccessChain 10 42
+             108:    7(ivec2) Load 107
+             109:    7(ivec2) IAdd 108 106
+             110:     57(ptr) AccessChain 10 42
+                              Store 110 109
+             111:     44(ptr) AccessChain 30(fp2D) 42
+             112:      6(int) Load 111
+             113:     53(ptr) AccessChain 10 46
+             114:      6(int) Load 113
+             115:      6(int) IAdd 114 112
+             116:     53(ptr) AccessChain 10 46
+                              Store 116 115
+             117:     44(ptr) AccessChain 30(fp2D) 46
+             118:      6(int) Load 117
+             119:     53(ptr) AccessChain 10 68
+             120:      6(int) Load 119
+             121:      6(int) IAdd 120 118
+             122:     53(ptr) AccessChain 10 68
+                              Store 122 121
+             123:          15 Load 17(sample2D)
+             124:   19(fvec2) Load 21(P2)
+             126:   13(float) Load 125(lodClamp)
+             127:     11(int) Load 24(granularity)
+             129:128(ResType) ImageSampleFootprintNV 123 124 127 27 MinLod 126
+             130:    7(ivec2) CompositeExtract 129 1
+             131:     34(ptr) AccessChain 30(fp2D) 12
+                              Store 131 130
+             132:    7(ivec2) CompositeExtract 129 2
+             133:     34(ptr) AccessChain 30(fp2D) 36
+                              Store 133 132
+             134:    7(ivec2) CompositeExtract 129 3
+             135:     34(ptr) AccessChain 30(fp2D) 39
+                              Store 135 134
+             136:      6(int) CompositeExtract 129 4
+             137:     44(ptr) AccessChain 30(fp2D) 42
+                              Store 137 136
+             138:      6(int) CompositeExtract 129 5
+             139:     44(ptr) AccessChain 30(fp2D) 46
+                              Store 139 138
+             140:    26(bool) CompositeExtract 129 0
+             141:      6(int) Select 140 50 51
+             142:     53(ptr) AccessChain 10 12
+                              Store 142 141
+             143:     34(ptr) AccessChain 30(fp2D) 12
+             144:    7(ivec2) Load 143
+             145:     57(ptr) AccessChain 10 36
+             146:    7(ivec2) Load 145
+             147:    7(ivec2) IAdd 146 144
+             148:     57(ptr) AccessChain 10 36
+                              Store 148 147
+             149:     34(ptr) AccessChain 30(fp2D) 36
+             150:    7(ivec2) Load 149
+             151:     57(ptr) AccessChain 10 39
+             152:    7(ivec2) Load 151
+             153:    7(ivec2) IAdd 152 150
+             154:     57(ptr) AccessChain 10 39
+                              Store 154 153
+             155:     34(ptr) AccessChain 30(fp2D) 39
+             156:    7(ivec2) Load 155
+             157:     57(ptr) AccessChain 10 42
+             158:    7(ivec2) Load 157
+             159:    7(ivec2) IAdd 158 156
+             160:     57(ptr) AccessChain 10 42
+                              Store 160 159
+             161:     44(ptr) AccessChain 30(fp2D) 42
+             162:      6(int) Load 161
+             163:     53(ptr) AccessChain 10 46
+             164:      6(int) Load 163
+             165:      6(int) IAdd 164 162
+             166:     53(ptr) AccessChain 10 46
+                              Store 166 165
+             167:     44(ptr) AccessChain 30(fp2D) 46
+             168:      6(int) Load 167
+             169:     53(ptr) AccessChain 10 68
+             170:      6(int) Load 169
+             171:      6(int) IAdd 170 168
+             172:     53(ptr) AccessChain 10 68
+                              Store 172 171
+             173:          15 Load 17(sample2D)
+             174:   19(fvec2) Load 21(P2)
+             175:   13(float) Load 125(lodClamp)
+             176:     11(int) Load 24(granularity)
+             177:   13(float) Load 76(bias)
+             179:178(ResType) ImageSampleFootprintNV 173 174 176 27 Bias MinLod 177 175
+             180:    7(ivec2) CompositeExtract 179 1
+             181:     34(ptr) AccessChain 30(fp2D) 12
+                              Store 181 180
+             182:    7(ivec2) CompositeExtract 179 2
+             183:     34(ptr) AccessChain 30(fp2D) 36
+                              Store 183 182
+             184:    7(ivec2) CompositeExtract 179 3
+             185:     34(ptr) AccessChain 30(fp2D) 39
+                              Store 185 184
+             186:      6(int) CompositeExtract 179 4
+             187:     44(ptr) AccessChain 30(fp2D) 42
+                              Store 187 186
+             188:      6(int) CompositeExtract 179 5
+             189:     44(ptr) AccessChain 30(fp2D) 46
+                              Store 189 188
+             190:    26(bool) CompositeExtract 179 0
+             191:      6(int) Select 190 50 51
+             192:     53(ptr) AccessChain 10 12
+                              Store 192 191
+             193:     34(ptr) AccessChain 30(fp2D) 12
+             194:    7(ivec2) Load 193
+             195:     57(ptr) AccessChain 10 36
+             196:    7(ivec2) Load 195
+             197:    7(ivec2) IAdd 196 194
+             198:     57(ptr) AccessChain 10 36
+                              Store 198 197
+             199:     34(ptr) AccessChain 30(fp2D) 36
+             200:    7(ivec2) Load 199
+             201:     57(ptr) AccessChain 10 39
+             202:    7(ivec2) Load 201
+             203:    7(ivec2) IAdd 202 200
+             204:     57(ptr) AccessChain 10 39
+                              Store 204 203
+             205:     34(ptr) AccessChain 30(fp2D) 39
+             206:    7(ivec2) Load 205
+             207:     57(ptr) AccessChain 10 42
+             208:    7(ivec2) Load 207
+             209:    7(ivec2) IAdd 208 206
+             210:     57(ptr) AccessChain 10 42
+                              Store 210 209
+             211:     44(ptr) AccessChain 30(fp2D) 42
+             212:      6(int) Load 211
+             213:     53(ptr) AccessChain 10 46
+             214:      6(int) Load 213
+             215:      6(int) IAdd 214 212
+             216:     53(ptr) AccessChain 10 46
+                              Store 216 215
+             217:     44(ptr) AccessChain 30(fp2D) 46
+             218:      6(int) Load 217
+             219:     53(ptr) AccessChain 10 68
+             220:      6(int) Load 219
+             221:      6(int) IAdd 220 218
+             222:     53(ptr) AccessChain 10 68
+                              Store 222 221
+             223:          15 Load 17(sample2D)
+             224:   19(fvec2) Load 21(P2)
+             226:   13(float) Load 225(lod)
+             227:     11(int) Load 24(granularity)
+             229:228(ResType) ImageSampleFootprintNV 223 224 227 27 Lod 226
+             230:    7(ivec2) CompositeExtract 229 1
+             231:     34(ptr) AccessChain 30(fp2D) 12
+                              Store 231 230
+             232:    7(ivec2) CompositeExtract 229 2
+             233:     34(ptr) AccessChain 30(fp2D) 36
+                              Store 233 232
+             234:    7(ivec2) CompositeExtract 229 3
+             235:     34(ptr) AccessChain 30(fp2D) 39
+                              Store 235 234
+             236:      6(int) CompositeExtract 229 4
+             237:     44(ptr) AccessChain 30(fp2D) 42
+                              Store 237 236
+             238:      6(int) CompositeExtract 229 5
+             239:     44(ptr) AccessChain 30(fp2D) 46
+                              Store 239 238
+             240:    26(bool) CompositeExtract 229 0
+             241:      6(int) Select 240 50 51
+             242:     53(ptr) AccessChain 10 12
+                              Store 242 241
+             243:     34(ptr) AccessChain 30(fp2D) 12
+             244:    7(ivec2) Load 243
+             245:     57(ptr) AccessChain 10 36
+             246:    7(ivec2) Load 245
+             247:    7(ivec2) IAdd 246 244
+             248:     57(ptr) AccessChain 10 36
+                              Store 248 247
+             249:     34(ptr) AccessChain 30(fp2D) 36
+             250:    7(ivec2) Load 249
+             251:     57(ptr) AccessChain 10 39
+             252:    7(ivec2) Load 251
+             253:    7(ivec2) IAdd 252 250
+             254:     57(ptr) AccessChain 10 39
+                              Store 254 253
+             255:     34(ptr) AccessChain 30(fp2D) 39
+             256:    7(ivec2) Load 255
+             257:     57(ptr) AccessChain 10 42
+             258:    7(ivec2) Load 257
+             259:    7(ivec2) IAdd 258 256
+             260:     57(ptr) AccessChain 10 42
+                              Store 260 259
+             261:     44(ptr) AccessChain 30(fp2D) 42
+             262:      6(int) Load 261
+             263:     53(ptr) AccessChain 10 46
+             264:      6(int) Load 263
+             265:      6(int) IAdd 264 262
+             266:     53(ptr) AccessChain 10 46
+                              Store 266 265
+             267:     44(ptr) AccessChain 30(fp2D) 46
+             268:      6(int) Load 267
+             269:     53(ptr) AccessChain 10 68
+             270:      6(int) Load 269
+             271:      6(int) IAdd 270 268
+             272:     53(ptr) AccessChain 10 68
+                              Store 272 271
+             273:          15 Load 17(sample2D)
+             274:   19(fvec2) Load 21(P2)
+             276:   19(fvec2) Load 275(dx)
+             278:   19(fvec2) Load 277(dy)
+             279:     11(int) Load 24(granularity)
+             281:280(ResType) ImageSampleFootprintNV 273 274 279 27 Grad 276 278
+             282:    7(ivec2) CompositeExtract 281 1
+             283:     34(ptr) AccessChain 30(fp2D) 12
+                              Store 283 282
+             284:    7(ivec2) CompositeExtract 281 2
+             285:     34(ptr) AccessChain 30(fp2D) 36
+                              Store 285 284
+             286:    7(ivec2) CompositeExtract 281 3
+             287:     34(ptr) AccessChain 30(fp2D) 39
+                              Store 287 286
+             288:      6(int) CompositeExtract 281 4
+             289:     44(ptr) AccessChain 30(fp2D) 42
+                              Store 289 288
+             290:      6(int) CompositeExtract 281 5
+             291:     44(ptr) AccessChain 30(fp2D) 46
+                              Store 291 290
+             292:    26(bool) CompositeExtract 281 0
+             293:      6(int) Select 292 50 51
+             294:     53(ptr) AccessChain 10 12
+                              Store 294 293
+             295:     34(ptr) AccessChain 30(fp2D) 12
+             296:    7(ivec2) Load 295
+             297:     57(ptr) AccessChain 10 36
+             298:    7(ivec2) Load 297
+             299:    7(ivec2) IAdd 298 296
+             300:     57(ptr) AccessChain 10 36
+                              Store 300 299
+             301:     34(ptr) AccessChain 30(fp2D) 36
+             302:    7(ivec2) Load 301
+             303:     57(ptr) AccessChain 10 39
+             304:    7(ivec2) Load 303
+             305:    7(ivec2) IAdd 304 302
+             306:     57(ptr) AccessChain 10 39
+                              Store 306 305
+             307:     34(ptr) AccessChain 30(fp2D) 39
+             308:    7(ivec2) Load 307
+             309:     57(ptr) AccessChain 10 42
+             310:    7(ivec2) Load 309
+             311:    7(ivec2) IAdd 310 308
+             312:     57(ptr) AccessChain 10 42
+                              Store 312 311
+             313:     44(ptr) AccessChain 30(fp2D) 42
+             314:      6(int) Load 313
+             315:     53(ptr) AccessChain 10 46
+             316:      6(int) Load 315
+             317:      6(int) IAdd 316 314
+             318:     53(ptr) AccessChain 10 46
+                              Store 318 317
+             319:     44(ptr) AccessChain 30(fp2D) 46
+             320:      6(int) Load 319
+             321:     53(ptr) AccessChain 10 68
+             322:      6(int) Load 321
+             323:      6(int) IAdd 322 320
+             324:     53(ptr) AccessChain 10 68
+                              Store 324 323
+             325:          15 Load 17(sample2D)
+             326:   19(fvec2) Load 21(P2)
+             327:   19(fvec2) Load 275(dx)
+             328:   19(fvec2) Load 277(dy)
+             329:   13(float) Load 125(lodClamp)
+             330:     11(int) Load 24(granularity)
+             332:331(ResType) ImageSampleFootprintNV 325 326 330 27 Grad MinLod 327 328 329
+             333:    7(ivec2) CompositeExtract 332 1
+             334:     34(ptr) AccessChain 30(fp2D) 12
+                              Store 334 333
+             335:    7(ivec2) CompositeExtract 332 2
+             336:     34(ptr) AccessChain 30(fp2D) 36
+                              Store 336 335
+             337:    7(ivec2) CompositeExtract 332 3
+             338:     34(ptr) AccessChain 30(fp2D) 39
+                              Store 338 337
+             339:      6(int) CompositeExtract 332 4
+             340:     44(ptr) AccessChain 30(fp2D) 42
+                              Store 340 339
+             341:      6(int) CompositeExtract 332 5
+             342:     44(ptr) AccessChain 30(fp2D) 46
+                              Store 342 341
+             343:    26(bool) CompositeExtract 332 0
+             344:      6(int) Select 343 50 51
+             345:     53(ptr) AccessChain 10 12
+                              Store 345 344
+             346:     34(ptr) AccessChain 30(fp2D) 12
+             347:    7(ivec2) Load 346
+             348:     57(ptr) AccessChain 10 36
+             349:    7(ivec2) Load 348
+             350:    7(ivec2) IAdd 349 347
+             351:     57(ptr) AccessChain 10 36
+                              Store 351 350
+             352:     34(ptr) AccessChain 30(fp2D) 36
+             353:    7(ivec2) Load 352
+             354:     57(ptr) AccessChain 10 39
+             355:    7(ivec2) Load 354
+             356:    7(ivec2) IAdd 355 353
+             357:     57(ptr) AccessChain 10 39
+                              Store 357 356
+             358:     34(ptr) AccessChain 30(fp2D) 39
+             359:    7(ivec2) Load 358
+             360:     57(ptr) AccessChain 10 42
+             361:    7(ivec2) Load 360
+             362:    7(ivec2) IAdd 361 359
+             363:     57(ptr) AccessChain 10 42
+                              Store 363 362
+             364:     44(ptr) AccessChain 30(fp2D) 42
+             365:      6(int) Load 364
+             366:     53(ptr) AccessChain 10 46
+             367:      6(int) Load 366
+             368:      6(int) IAdd 367 365
+             369:     53(ptr) AccessChain 10 46
+                              Store 369 368
+             370:     44(ptr) AccessChain 30(fp2D) 46
+             371:      6(int) Load 370
+             372:     53(ptr) AccessChain 10 68
+             373:      6(int) Load 372
+             374:      6(int) IAdd 373 371
+             375:     53(ptr) AccessChain 10 68
+                              Store 375 374
+             384:         381 Load 383(sample3D)
+             388:  385(fvec3) Load 387(P3)
+             389:     11(int) Load 24(granularity)
+             394:393(ResType) ImageSampleFootprintNV 384 388 389 27
+             395:  376(ivec3) CompositeExtract 394 1
+             397:    396(ptr) AccessChain 392(fp3D) 12
+                              Store 397 395
+             398:  376(ivec3) CompositeExtract 394 2
+             399:    396(ptr) AccessChain 392(fp3D) 36
+                              Store 399 398
+             400:    7(ivec2) CompositeExtract 394 3
+             401:     34(ptr) AccessChain 392(fp3D) 39
+                              Store 401 400
+             402:      6(int) CompositeExtract 394 4
+             403:     44(ptr) AccessChain 392(fp3D) 42
+                              Store 403 402
+             404:      6(int) CompositeExtract 394 5
+             405:     44(ptr) AccessChain 392(fp3D) 46
+                              Store 405 404
+             406:    26(bool) CompositeExtract 394 0
+             407:      6(int) Select 406 50 51
+             408:     53(ptr) AccessChain 379 12
+                              Store 408 407
+             409:    396(ptr) AccessChain 392(fp3D) 12
+             410:  376(ivec3) Load 409
+             412:    411(ptr) AccessChain 379 36
+                              Store 412 410
+             413:    396(ptr) AccessChain 392(fp3D) 36
+             414:  376(ivec3) Load 413
+             415:    411(ptr) AccessChain 379 39
+                              Store 415 414
+             416:     34(ptr) AccessChain 392(fp3D) 39
+             417:    7(ivec2) Load 416
+             418:     57(ptr) AccessChain 379 42
+                              Store 418 417
+             419:     44(ptr) AccessChain 392(fp3D) 42
+             420:      6(int) Load 419
+             421:     53(ptr) AccessChain 379 46
+                              Store 421 420
+             422:     44(ptr) AccessChain 392(fp3D) 46
+             423:      6(int) Load 422
+             424:     53(ptr) AccessChain 379 68
+                              Store 424 423
+             425:         381 Load 383(sample3D)
+             426:  385(fvec3) Load 387(P3)
+             427:     11(int) Load 24(granularity)
+             428:   13(float) Load 76(bias)
+             430:429(ResType) ImageSampleFootprintNV 425 426 427 27 Bias 428
+             431:  376(ivec3) CompositeExtract 430 1
+             432:    396(ptr) AccessChain 392(fp3D) 12
+                              Store 432 431
+             433:  376(ivec3) CompositeExtract 430 2
+             434:    396(ptr) AccessChain 392(fp3D) 36
+                              Store 434 433
+             435:    7(ivec2) CompositeExtract 430 3
+             436:     34(ptr) AccessChain 392(fp3D) 39
+                              Store 436 435
+             437:      6(int) CompositeExtract 430 4
+             438:     44(ptr) AccessChain 392(fp3D) 42
+                              Store 438 437
+             439:      6(int) CompositeExtract 430 5
+             440:     44(ptr) AccessChain 392(fp3D) 46
+                              Store 440 439
+             441:    26(bool) CompositeExtract 430 0
+             442:      6(int) Select 441 50 51
+             443:     53(ptr) AccessChain 379 12
+                              Store 443 442
+             444:    396(ptr) AccessChain 392(fp3D) 12
+             445:  376(ivec3) Load 444
+             446:    411(ptr) AccessChain 379 36
+             447:  376(ivec3) Load 446
+             448:  376(ivec3) IAdd 447 445
+             449:    411(ptr) AccessChain 379 36
+                              Store 449 448
+             450:    396(ptr) AccessChain 392(fp3D) 36
+             451:  376(ivec3) Load 450
+             452:    411(ptr) AccessChain 379 39
+             453:  376(ivec3) Load 452
+             454:  376(ivec3) IAdd 453 451
+             455:    411(ptr) AccessChain 379 39
+                              Store 455 454
+             456:     34(ptr) AccessChain 392(fp3D) 39
+             457:    7(ivec2) Load 456
+             458:     57(ptr) AccessChain 379 42
+             459:    7(ivec2) Load 458
+             460:    7(ivec2) IAdd 459 457
+             461:     57(ptr) AccessChain 379 42
+                              Store 461 460
+             462:     44(ptr) AccessChain 392(fp3D) 42
+             463:      6(int) Load 462
+             464:     53(ptr) AccessChain 379 46
+             465:      6(int) Load 464
+             466:      6(int) IAdd 465 463
+             467:     53(ptr) AccessChain 379 46
+                              Store 467 466
+             468:     44(ptr) AccessChain 392(fp3D) 46
+             469:      6(int) Load 468
+             470:     53(ptr) AccessChain 379 68
+             471:      6(int) Load 470
+             472:      6(int) IAdd 471 469
+             473:     53(ptr) AccessChain 379 68
+                              Store 473 472
+             474:         381 Load 383(sample3D)
+             475:  385(fvec3) Load 387(P3)
+             476:   13(float) Load 125(lodClamp)
+             477:     11(int) Load 24(granularity)
+             479:478(ResType) ImageSampleFootprintNV 474 475 477 27 MinLod 476
+             480:  376(ivec3) CompositeExtract 479 1
+             481:    396(ptr) AccessChain 392(fp3D) 12
+                              Store 481 480
+             482:  376(ivec3) CompositeExtract 479 2
+             483:    396(ptr) AccessChain 392(fp3D) 36
+                              Store 483 482
+             484:    7(ivec2) CompositeExtract 479 3
+             485:     34(ptr) AccessChain 392(fp3D) 39
+                              Store 485 484
+             486:      6(int) CompositeExtract 479 4
+             487:     44(ptr) AccessChain 392(fp3D) 42
+                              Store 487 486
+             488:      6(int) CompositeExtract 479 5
+             489:     44(ptr) AccessChain 392(fp3D) 46
+                              Store 489 488
+             490:    26(bool) CompositeExtract 479 0
+             491:      6(int) Select 490 50 51
+             492:     53(ptr) AccessChain 379 12
+                              Store 492 491
+             493:    396(ptr) AccessChain 392(fp3D) 12
+             494:  376(ivec3) Load 493
+             495:    411(ptr) AccessChain 379 36
+             496:  376(ivec3) Load 495
+             497:  376(ivec3) IAdd 496 494
+             498:    411(ptr) AccessChain 379 36
+                              Store 498 497
+             499:    396(ptr) AccessChain 392(fp3D) 36
+             500:  376(ivec3) Load 499
+             501:    411(ptr) AccessChain 379 39
+             502:  376(ivec3) Load 501
+             503:  376(ivec3) IAdd 502 500
+             504:    411(ptr) AccessChain 379 39
+                              Store 504 503
+             505:     34(ptr) AccessChain 392(fp3D) 39
+             506:    7(ivec2) Load 505
+             507:     57(ptr) AccessChain 379 42
+             508:    7(ivec2) Load 507
+             509:    7(ivec2) IAdd 508 506
+             510:     57(ptr) AccessChain 379 42
+                              Store 510 509
+             511:     44(ptr) AccessChain 392(fp3D) 42
+             512:      6(int) Load 511
+             513:     53(ptr) AccessChain 379 46
+             514:      6(int) Load 513
+             515:      6(int) IAdd 514 512
+             516:     53(ptr) AccessChain 379 46
+                              Store 516 515
+             517:     44(ptr) AccessChain 392(fp3D) 46
+             518:      6(int) Load 517
+             519:     53(ptr) AccessChain 379 68
+             520:      6(int) Load 519
+             521:      6(int) IAdd 520 518
+             522:     53(ptr) AccessChain 379 68
+                              Store 522 521
+             523:         381 Load 383(sample3D)
+             524:  385(fvec3) Load 387(P3)
+             525:   13(float) Load 125(lodClamp)
+             526:     11(int) Load 24(granularity)
+             527:   13(float) Load 76(bias)
+             529:528(ResType) ImageSampleFootprintNV 523 524 526 27 Bias MinLod 527 525
+             530:  376(ivec3) CompositeExtract 529 1
+             531:    396(ptr) AccessChain 392(fp3D) 12
+                              Store 531 530
+             532:  376(ivec3) CompositeExtract 529 2
+             533:    396(ptr) AccessChain 392(fp3D) 36
+                              Store 533 532
+             534:    7(ivec2) CompositeExtract 529 3
+             535:     34(ptr) AccessChain 392(fp3D) 39
+                              Store 535 534
+             536:      6(int) CompositeExtract 529 4
+             537:     44(ptr) AccessChain 392(fp3D) 42
+                              Store 537 536
+             538:      6(int) CompositeExtract 529 5
+             539:     44(ptr) AccessChain 392(fp3D) 46
+                              Store 539 538
+             540:    26(bool) CompositeExtract 529 0
+             541:      6(int) Select 540 50 51
+             542:     53(ptr) AccessChain 379 12
+                              Store 542 541
+             543:    396(ptr) AccessChain 392(fp3D) 12
+             544:  376(ivec3) Load 543
+             545:    411(ptr) AccessChain 379 36
+             546:  376(ivec3) Load 545
+             547:  376(ivec3) IAdd 546 544
+             548:    411(ptr) AccessChain 379 36
+                              Store 548 547
+             549:    396(ptr) AccessChain 392(fp3D) 36
+             550:  376(ivec3) Load 549
+             551:    411(ptr) AccessChain 379 39
+             552:  376(ivec3) Load 551
+             553:  376(ivec3) IAdd 552 550
+             554:    411(ptr) AccessChain 379 39
+                              Store 554 553
+             555:     34(ptr) AccessChain 392(fp3D) 39
+             556:    7(ivec2) Load 555
+             557:     57(ptr) AccessChain 379 42
+             558:    7(ivec2) Load 557
+             559:    7(ivec2) IAdd 558 556
+             560:     57(ptr) AccessChain 379 42
+                              Store 560 559
+             561:     44(ptr) AccessChain 392(fp3D) 42
+             562:      6(int) Load 561
+             563:     53(ptr) AccessChain 379 46
+             564:      6(int) Load 563
+             565:      6(int) IAdd 564 562
+             566:     53(ptr) AccessChain 379 46
+                              Store 566 565
+             567:     44(ptr) AccessChain 392(fp3D) 46
+             568:      6(int) Load 567
+             569:     53(ptr) AccessChain 379 68
+             570:      6(int) Load 569
+             571:      6(int) IAdd 570 568
+             572:     53(ptr) AccessChain 379 68
+                              Store 572 571
+             573:         381 Load 383(sample3D)
+             574:  385(fvec3) Load 387(P3)
+             575:   13(float) Load 225(lod)
+             576:     11(int) Load 24(granularity)
+             578:577(ResType) ImageSampleFootprintNV 573 574 576 27 Lod 575
+             579:  376(ivec3) CompositeExtract 578 1
+             580:    396(ptr) AccessChain 392(fp3D) 12
+                              Store 580 579
+             581:  376(ivec3) CompositeExtract 578 2
+             582:    396(ptr) AccessChain 392(fp3D) 36
+                              Store 582 581
+             583:    7(ivec2) CompositeExtract 578 3
+             584:     34(ptr) AccessChain 392(fp3D) 39
+                              Store 584 583
+             585:      6(int) CompositeExtract 578 4
+             586:     44(ptr) AccessChain 392(fp3D) 42
+                              Store 586 585
+             587:      6(int) CompositeExtract 578 5
+             588:     44(ptr) AccessChain 392(fp3D) 46
+                              Store 588 587
+             589:    26(bool) CompositeExtract 578 0
+             590:      6(int) Select 589 50 51
+             591:     53(ptr) AccessChain 379 12
+                              Store 591 590
+             592:    396(ptr) AccessChain 392(fp3D) 12
+             593:  376(ivec3) Load 592
+             594:    411(ptr) AccessChain 379 36
+             595:  376(ivec3) Load 594
+             596:  376(ivec3) IAdd 595 593
+             597:    411(ptr) AccessChain 379 36
+                              Store 597 596
+             598:    396(ptr) AccessChain 392(fp3D) 36
+             599:  376(ivec3) Load 598
+             600:    411(ptr) AccessChain 379 39
+             601:  376(ivec3) Load 600
+             602:  376(ivec3) IAdd 601 599
+             603:    411(ptr) AccessChain 379 39
+                              Store 603 602
+             604:     34(ptr) AccessChain 392(fp3D) 39
+             605:    7(ivec2) Load 604
+             606:     57(ptr) AccessChain 379 42
+             607:    7(ivec2) Load 606
+             608:    7(ivec2) IAdd 607 605
+             609:     57(ptr) AccessChain 379 42
+                              Store 609 608
+             610:     44(ptr) AccessChain 392(fp3D) 42
+             611:      6(int) Load 610
+             612:     53(ptr) AccessChain 379 46
+             613:      6(int) Load 612
+             614:      6(int) IAdd 613 611
+             615:     53(ptr) AccessChain 379 46
+                              Store 615 614
+             616:     44(ptr) AccessChain 392(fp3D) 46
+             617:      6(int) Load 616
+             618:     53(ptr) AccessChain 379 68
+             619:      6(int) Load 618
+             620:      6(int) IAdd 619 617
+             621:     53(ptr) AccessChain 379 68
+                              Store 621 620
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.shaderStencilExport.frag.out b/Test/baseResults/spv.shaderStencilExport.frag.out
new file mode 100644
index 0000000..8fc691e
--- /dev/null
+++ b/Test/baseResults/spv.shaderStencilExport.frag.out
@@ -0,0 +1,28 @@
+spv.shaderStencilExport.frag
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 10
+
+                              Capability Shader
+                              Capability StencilExportEXT
+                              Extension  "SPV_EXT_shader_stencil_export"
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 8
+                              ExecutionMode 4 OriginUpperLeft
+                              Source GLSL 450
+                              SourceExtension  "GL_ARB_shader_stencil_export"
+                              Name 4  "main"
+                              Name 8  "gl_FragStencilRefARB"
+                              Decorate 8(gl_FragStencilRefARB) BuiltIn FragStencilRefEXT
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeInt 32 1
+               7:             TypePointer Output 6(int)
+8(gl_FragStencilRefARB):      7(ptr) Variable Output
+               9:      6(int) Constant 100
+         4(main):           2 Function None 3
+               5:             Label
+                              Store 8(gl_FragStencilRefARB) 9
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.shadingRate.frag.out b/Test/baseResults/spv.shadingRate.frag.out
new file mode 100644
index 0000000..1147776
--- /dev/null
+++ b/Test/baseResults/spv.shadingRate.frag.out
@@ -0,0 +1,48 @@
+spv.shadingRate.frag
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 21
+
+                              Capability Shader
+                              Capability FragmentDensityEXT
+                              Extension  "SPV_NV_shading_rate"
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 9 13 17 19
+                              ExecutionMode 4 OriginUpperLeft
+                              Source GLSL 450
+                              SourceExtension  "GL_NV_shading_rate_image"
+                              Name 4  "main"
+                              Name 9  "FragmentSize"
+                              Name 13  "gl_FragmentSizeNV"
+                              Name 17  "InvocationsPerPixel"
+                              Name 19  "gl_InvocationsPerPixelNV"
+                              Decorate 9(FragmentSize) Location 0
+                              Decorate 13(gl_FragmentSizeNV) Flat
+                              Decorate 13(gl_FragmentSizeNV) BuiltIn FragSizeEXT
+                              Decorate 17(InvocationsPerPixel) Location 2
+                              Decorate 19(gl_InvocationsPerPixelNV) Flat
+                              Decorate 19(gl_InvocationsPerPixelNV) BuiltIn FragInvocationCountEXT
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 2
+               8:             TypePointer Output 7(fvec2)
+ 9(FragmentSize):      8(ptr) Variable Output
+              10:             TypeInt 32 1
+              11:             TypeVector 10(int) 2
+              12:             TypePointer Input 11(ivec2)
+13(gl_FragmentSizeNV):     12(ptr) Variable Input
+              16:             TypePointer Output 10(int)
+17(InvocationsPerPixel):     16(ptr) Variable Output
+              18:             TypePointer Input 10(int)
+19(gl_InvocationsPerPixelNV):     18(ptr) Variable Input
+         4(main):           2 Function None 3
+               5:             Label
+              14:   11(ivec2) Load 13(gl_FragmentSizeNV)
+              15:    7(fvec2) ConvertSToF 14
+                              Store 9(FragmentSize) 15
+              20:     10(int) Load 19(gl_InvocationsPerPixelNV)
+                              Store 17(InvocationsPerPixel) 20
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.shiftOps.frag.out b/Test/baseResults/spv.shiftOps.frag.out
index 498c287..3085a55 100644
--- a/Test/baseResults/spv.shiftOps.frag.out
+++ b/Test/baseResults/spv.shiftOps.frag.out
@@ -1,8 +1,6 @@
 spv.shiftOps.frag
-Warning, version 450 is not yet complete; most version-specific features are present, but some are missing.
-
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 38
 
                               Capability Shader
diff --git a/Test/baseResults/spv.shortCircuit.frag.out b/Test/baseResults/spv.shortCircuit.frag.out
index 7d5189a..d651824 100644
--- a/Test/baseResults/spv.shortCircuit.frag.out
+++ b/Test/baseResults/spv.shortCircuit.frag.out
@@ -1,8 +1,6 @@
 spv.shortCircuit.frag
-Warning, version 400 is not yet complete; most version-specific features are present, but some are missing.
-
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 147
 
                               Capability Shader
diff --git a/Test/baseResults/spv.simpleFunctionCall.frag.out b/Test/baseResults/spv.simpleFunctionCall.frag.out
old mode 100755
new mode 100644
index 2e6b671..627b31c
--- a/Test/baseResults/spv.simpleFunctionCall.frag.out
+++ b/Test/baseResults/spv.simpleFunctionCall.frag.out
@@ -1,6 +1,6 @@
 spv.simpleFunctionCall.frag
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 19
 
                               Capability Shader
@@ -13,6 +13,7 @@
                               Name 9  "foo("
                               Name 12  "BaseColor"
                               Name 17  "gl_FragColor"
+                              Decorate 17(gl_FragColor) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
diff --git a/Test/baseResults/spv.simpleMat.vert.out b/Test/baseResults/spv.simpleMat.vert.out
old mode 100755
new mode 100644
index 2cad631..8557458
--- a/Test/baseResults/spv.simpleMat.vert.out
+++ b/Test/baseResults/spv.simpleMat.vert.out
@@ -2,7 +2,7 @@
 WARNING: 0:3: varying deprecated in version 130; may be removed in future release
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 39
 
                               Capability Shader
diff --git a/Test/baseResults/spv.sparseTexture.frag.out b/Test/baseResults/spv.sparseTexture.frag.out
index 431ef15..78a2c2e 100644
--- a/Test/baseResults/spv.sparseTexture.frag.out
+++ b/Test/baseResults/spv.sparseTexture.frag.out
@@ -1,11 +1,15 @@
 spv.sparseTexture.frag
-Warning, version 450 is not yet complete; most version-specific features are present, but some are missing.
+error: SPIRV-Tools Validation Errors
+error: Capability SampledRect is not allowed by Vulkan 1.0 specification (or requires extension)
+  OpCapability SampledRect
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 438
 
                               Capability Shader
+                              Capability ImageGatherExtended
+                              Capability StorageImageMultisample
                               Capability SampledRect
                               Capability SparseResidency
                               Capability SampledCubeArray
@@ -183,14 +187,14 @@
       414(i2DMS):    413(ptr) Variable UniformConstant
              422:             TypePointer Output 11(fvec4)
    423(outColor):    422(ptr) Variable Output
-             426:             TypeBool
+             425:             TypeBool
          4(main):           2 Function None 3
                5:             Label
      8(resident):      7(ptr) Variable Function
        13(texel):     12(ptr) Variable Function
       18(itexel):     17(ptr) Variable Function
       23(utexel):     22(ptr) Variable Function
-             424:     12(ptr) Variable Function
+             427:     12(ptr) Variable Function
                               Store 8(resident) 9
                               Store 13(texel) 15
                               Store 18(itexel) 19
@@ -566,13 +570,13 @@
              420:      6(int) Load 8(resident)
              421:      6(int) BitwiseOr 420 419
                               Store 8(resident) 421
-             425:      6(int) Load 8(resident)
-             427:   426(bool) ImageSparseTexelsResident 425
+             424:      6(int) Load 8(resident)
+             426:   425(bool) ImageSparseTexelsResident 424
                               SelectionMerge 429 None
-                              BranchConditional 427 428 431
+                              BranchConditional 426 428 431
              428:               Label
              430:   11(fvec4)   Load 13(texel)
-                                Store 424 430
+                                Store 427 430
                                 Branch 429
              431:               Label
              432:   16(ivec4)   Load 18(itexel)
@@ -580,10 +584,10 @@
              434:   21(ivec4)   Load 23(utexel)
              435:   11(fvec4)   ConvertUToF 434
              436:   11(fvec4)   FAdd 433 435
-                                Store 424 436
+                                Store 427 436
                                 Branch 429
              429:             Label
-             437:   11(fvec4) Load 424
+             437:   11(fvec4) Load 427
                               Store 423(outColor) 437
                               Return
                               FunctionEnd
diff --git a/Test/baseResults/spv.sparseTextureClamp.frag.out b/Test/baseResults/spv.sparseTextureClamp.frag.out
index 175dc35..fe210f7 100644
--- a/Test/baseResults/spv.sparseTextureClamp.frag.out
+++ b/Test/baseResults/spv.sparseTextureClamp.frag.out
@@ -1,8 +1,10 @@
 spv.sparseTextureClamp.frag
-Warning, version 450 is not yet complete; most version-specific features are present, but some are missing.
+error: SPIRV-Tools Validation Errors
+error: Capability SampledRect is not allowed by Vulkan 1.0 specification (or requires extension)
+  OpCapability SampledRect
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 360
 
                               Capability Shader
@@ -147,14 +149,14 @@
              310:  157(ivec2) ConstantComposite 143 143
              344:             TypePointer Output 11(fvec4)
    345(outColor):    344(ptr) Variable Output
-             348:             TypeBool
+             347:             TypeBool
          4(main):           2 Function None 3
                5:             Label
      8(resident):      7(ptr) Variable Function
        13(texel):     12(ptr) Variable Function
       18(itexel):     17(ptr) Variable Function
       23(utexel):     22(ptr) Variable Function
-             346:     12(ptr) Variable Function
+             349:     12(ptr) Variable Function
                               Store 8(resident) 9
                               Store 13(texel) 15
                               Store 18(itexel) 19
@@ -444,13 +446,13 @@
              342:   16(ivec4) Load 18(itexel)
              343:   16(ivec4) IAdd 342 341
                               Store 18(itexel) 343
-             347:      6(int) Load 8(resident)
-             349:   348(bool) ImageSparseTexelsResident 347
+             346:      6(int) Load 8(resident)
+             348:   347(bool) ImageSparseTexelsResident 346
                               SelectionMerge 351 None
-                              BranchConditional 349 350 353
+                              BranchConditional 348 350 353
              350:               Label
              352:   11(fvec4)   Load 13(texel)
-                                Store 346 352
+                                Store 349 352
                                 Branch 351
              353:               Label
              354:   16(ivec4)   Load 18(itexel)
@@ -458,10 +460,10 @@
              356:   21(ivec4)   Load 23(utexel)
              357:   11(fvec4)   ConvertUToF 356
              358:   11(fvec4)   FAdd 355 357
-                                Store 346 358
+                                Store 349 358
                                 Branch 351
              351:             Label
-             359:   11(fvec4) Load 346
+             359:   11(fvec4) Load 349
                               Store 345(outColor) 359
                               Return
                               FunctionEnd
diff --git a/Test/baseResults/spv.specConst.vert.out b/Test/baseResults/spv.specConst.vert.out
old mode 100755
new mode 100644
index 5e2020f..70fbd09
--- a/Test/baseResults/spv.specConst.vert.out
+++ b/Test/baseResults/spv.specConst.vert.out
@@ -1,8 +1,6 @@
 spv.specConst.vert
-Warning, version 450 is not yet complete; most version-specific features are present, but some are missing.
-
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 27
 
                               Capability Shader
diff --git a/Test/baseResults/spv.specConstant.comp.out b/Test/baseResults/spv.specConstant.comp.out
index 481ed68..b8aa3dd 100644
--- a/Test/baseResults/spv.specConstant.comp.out
+++ b/Test/baseResults/spv.specConstant.comp.out
@@ -1,8 +1,6 @@
 spv.specConstant.comp
-Warning, version 450 is not yet complete; most version-specific features are present, but some are missing.
-
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 27
 
                               Capability Shader
diff --git a/Test/baseResults/spv.specConstant.vert.out b/Test/baseResults/spv.specConstant.vert.out
index ea4e542..0d47dce 100644
--- a/Test/baseResults/spv.specConstant.vert.out
+++ b/Test/baseResults/spv.specConstant.vert.out
@@ -1,8 +1,6 @@
 spv.specConstant.vert
-Warning, version 400 is not yet complete; most version-specific features are present, but some are missing.
-
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 81
 
                               Capability Shader
@@ -13,7 +11,7 @@
                               Source GLSL 400
                               Name 4  "main"
                               Name 9  "arraySize"
-                              Name 14  "foo(vf4[s1518];"
+                              Name 14  "foo(vf4[s2765];"
                               Name 13  "p"
                               Name 17  "builtin_spec_constant("
                               Name 20  "color"
@@ -66,18 +64,18 @@
               33:             TypeInt 32 0
        34(scale):     33(int) SpecConstant 2
               38:             TypeFloat 64
-    39(spDouble):   38(float) SpecConstant 1413754136 1074340347
+    39(spDouble):38(float64_t) SpecConstant 1413754136 1074340347
      40(spFloat):    6(float) SpecConstant 1078523331
-              41:   38(float) SpecConstantOp 115 40(spFloat)
+              41:38(float64_t) SpecConstantOp 115 40(spFloat)
 50(dupArraySize):      8(int) SpecConstant 12
               51:             TypeArray 7(fvec4) 50(dupArraySize)
               52:             TypePointer Input 51
      53(dupUcol):     52(ptr) Variable Input
    60(spDupBool):    29(bool) SpecConstantTrue
     63(dupScale):     33(int) SpecConstant 2
- 67(spDupDouble):   38(float) SpecConstant 1413754136 1074340347
+ 67(spDupDouble):38(float64_t) SpecConstant 1413754136 1074340347
   68(spDupFloat):    6(float) SpecConstant 1078523331
-              69:   38(float) SpecConstantOp 115 68(spDupFloat)
+              69:38(float64_t) SpecConstantOp 115 68(spDupFloat)
               75:             TypePointer Function 8(int)
 77(gl_MaxImageUnits):      8(int) SpecConstant 8
          4(main):           2 Function None 3
@@ -96,7 +94,7 @@
                                 Store 20(color) 37
                                 Branch 32
               32:             Label
-              42:   38(float) FDiv 39(spDouble) 41
+              42:38(float64_t) FDiv 39(spDouble) 41
               43:    6(float) FConvert 42
               44:    7(fvec4) Load 20(color)
               45:    7(fvec4) CompositeConstruct 43 43 43 43
@@ -104,10 +102,10 @@
                               Store 20(color) 46
               48:          10 Load 22(ucol)
                               Store 47(param) 48
-              49:           2 FunctionCall 14(foo(vf4[s1518];) 47(param)
+              49:           2 FunctionCall 14(foo(vf4[s2765];) 47(param)
                               Return
                               FunctionEnd
-14(foo(vf4[s1518];):           2 Function None 12
+14(foo(vf4[s2765];):           2 Function None 12
            13(p):     11(ptr) FunctionParameter
               15:             Label
               54:     24(ptr) AccessChain 53(dupUcol) 23
@@ -127,7 +125,7 @@
                                 Store 20(color) 66
                                 Branch 62
               62:             Label
-              70:   38(float) FDiv 67(spDupDouble) 69
+              70:38(float64_t) FDiv 67(spDupDouble) 69
               71:    6(float) FConvert 70
               72:    7(fvec4) Load 20(color)
               73:    7(fvec4) CompositeConstruct 71 71 71 71
diff --git a/Test/baseResults/spv.specConstantComposite.vert.out b/Test/baseResults/spv.specConstantComposite.vert.out
index 9079554..58d4b6a 100644
--- a/Test/baseResults/spv.specConstantComposite.vert.out
+++ b/Test/baseResults/spv.specConstantComposite.vert.out
@@ -1,8 +1,6 @@
 spv.specConstantComposite.vert
-Warning, version 450 is not yet complete; most version-specific features are present, but some are missing.
-
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 43
 
                               Capability Shader
@@ -43,7 +41,7 @@
               32:             TypePointer Function 14(int)
   37(spec_float):   24(float) SpecConstant 1078523331
               38:             TypeFloat 64
- 39(spec_double):   38(float) SpecConstant 1413754136 1074340347
+ 39(spec_double):38(float64_t) SpecConstant 1413754136 1074340347
               40:             TypeArray 25(fvec4) 28(spec_int)
               41:             TypePointer Input 40
 42(global_vec4_array_with_spec_length):     41(ptr) Variable Input
diff --git a/Test/baseResults/spv.specConstantOperations.vert.out b/Test/baseResults/spv.specConstantOperations.vert.out
index ab83e61..0f141e3 100644
--- a/Test/baseResults/spv.specConstantOperations.vert.out
+++ b/Test/baseResults/spv.specConstantOperations.vert.out
@@ -1,8 +1,6 @@
 spv.specConstantOperations.vert
-Warning, version 450 is not yet complete; most version-specific features are present, but some are missing.
-
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 162
 
                               Capability Shader
@@ -20,10 +18,68 @@
                               Name 42  "sp_uint"
                               Name 43  "sp_sint"
                               Name 45  "sp_double"
+                              Name 46  "float_from_double"
+                              Name 47  "double_from_float"
+                              Name 49  "bool_from_int"
+                              Name 50  "bool_from_uint"
+                              Name 51  "int_from_bool"
+                              Name 53  "uint_from_bool"
+                              Name 54  "sp_uint_from_sint"
+                              Name 55  "sp_sint_from_uint"
+                              Name 56  "negate_int"
+                              Name 57  "not_int"
+                              Name 58  "sp_int_add_two"
+                              Name 61  "sp_int_add_two_sub_three"
+                              Name 63  "sp_int_add_two_sub_four"
+                              Name 64  "sp_sint_mul_two"
+                              Name 66  "sp_uint_mul_two"
+                              Name 68  "sp_sint_mul_two_div_five"
+                              Name 70  "sp_uint_mul_two_div_five"
+                              Name 71  "sp_sint_rem_four"
+                              Name 73  "sp_uint_rem_four"
+                              Name 75  "sp_sint_mul_three_div_five"
+                              Name 77  "sp_sint_shift_right_arithmetic"
+                              Name 79  "sp_uint_shift_right_arithmetic"
+                              Name 80  "sp_sint_shift_left"
+                              Name 81  "sp_uint_shift_left"
+                              Name 83  "sp_sint_or_256"
+                              Name 85  "sp_uint_xor_512"
+                              Name 86  "sp_int_lt_sp_sint"
+                              Name 87  "sp_uint_equal_sp_uint"
+                              Name 88  "sp_int_gt_sp_sint"
+                              Name 91  "iv"
+                              Name 95  "uv"
+                              Name 98  "bv_from_iv"
+                              Name 99  "bv_from_uv"
+                              Name 102  "iv_from_bv"
+                              Name 104  "uv_from_bv"
+                              Name 105  "uv_from_iv"
+                              Name 106  "iv_from_uv"
+                              Name 107  "not_iv"
+                              Name 108  "negate_iv"
+                              Name 110  "iv_add_two"
+                              Name 113  "iv_add_two_sub_three"
+                              Name 115  "iv_add_two_sub_four"
+                              Name 116  "iv_mul_two"
+                              Name 118  "iv_mul_two_div_five"
+                              Name 119  "iv_rem_four"
+                              Name 121  "iv_shift_right_arithmetic"
+                              Name 122  "iv_shift_left"
+                              Name 125  "iv_or_1024"
+                              Name 128  "uv_xor_2048"
+                              Name 129  "iv_x"
+                              Name 131  "iv_yx"
+                              Name 133  "iv_zyx"
+                              Name 134  "iv_yzxw"
                               Name 135  "a"
                               Name 136  "b"
                               Name 137  "c"
                               Name 142  "ternayArray1"
+                              Name 145  "t1"
+                              Name 146  "t2"
+                              Name 148  "t3"
+                              Name 152  "t4"
+                              Name 161  "v2"
                               Decorate 19(sp_int) SpecId 201
                               Decorate 40(sp_float) SpecId 200
                               Decorate 42(sp_uint) SpecId 202
@@ -54,96 +110,96 @@
      42(sp_uint):     41(int) SpecConstant 100
      43(sp_sint):      6(int) SpecConstant 4294967286
               44:             TypeFloat 64
-   45(sp_double):   44(float) SpecConstant 2333366019 1074118410
-              46:   39(float) SpecConstantOp 115 45(sp_double)
-              47:   44(float) SpecConstantOp 115 40(sp_float)
+   45(sp_double):44(float64_t) SpecConstant 2333366019 1074118410
+46(float_from_double):   39(float) SpecConstantOp 115 45(sp_double)
+47(double_from_float):44(float64_t) SpecConstantOp 115 40(sp_float)
               48:     41(int) Constant 0
-              49:    22(bool) SpecConstantOp 171 19(sp_int) 48
-              50:    22(bool) SpecConstantOp 171 42(sp_uint) 48
-              51:      6(int) SpecConstantOp 169 49 32 12
+49(bool_from_int):    22(bool) SpecConstantOp 171 19(sp_int) 48
+50(bool_from_uint):    22(bool) SpecConstantOp 171 42(sp_uint) 48
+51(int_from_bool):      6(int) SpecConstantOp 169 49(bool_from_int) 32 12
               52:     41(int) Constant 1
-              53:     41(int) SpecConstantOp 169 49 52 48
-              54:     41(int) SpecConstantOp 128 43(sp_sint) 48
-              55:      6(int) SpecConstantOp 128 42(sp_uint) 48
-              56:      6(int) SpecConstantOp 126 19(sp_int)
-              57:      6(int) SpecConstantOp 200 19(sp_int)
-              58:      6(int) SpecConstantOp 128 19(sp_int) 20
+53(uint_from_bool):     41(int) SpecConstantOp 169 49(bool_from_int) 52 48
+54(sp_uint_from_sint):     41(int) SpecConstantOp 128 43(sp_sint) 48
+55(sp_sint_from_uint):      6(int) SpecConstantOp 128 42(sp_uint) 48
+  56(negate_int):      6(int) SpecConstantOp 126 19(sp_int)
+     57(not_int):      6(int) SpecConstantOp 200 19(sp_int)
+58(sp_int_add_two):      6(int) SpecConstantOp 128 19(sp_int) 20
               59:      6(int) SpecConstantOp 128 19(sp_int) 20
               60:      6(int) Constant 3
-              61:      6(int) SpecConstantOp 130 59 60
+61(sp_int_add_two_sub_three):      6(int) SpecConstantOp 130 59 60
               62:      6(int) Constant 4
-              63:      6(int) SpecConstantOp 130 58 62
-              64:      6(int) SpecConstantOp 132 43(sp_sint) 20
+63(sp_int_add_two_sub_four):      6(int) SpecConstantOp 130 58(sp_int_add_two) 62
+64(sp_sint_mul_two):      6(int) SpecConstantOp 132 43(sp_sint) 20
               65:     41(int) Constant 2
-              66:     41(int) SpecConstantOp 132 42(sp_uint) 65
+66(sp_uint_mul_two):     41(int) SpecConstantOp 132 42(sp_uint) 65
               67:      6(int) Constant 5
-              68:      6(int) SpecConstantOp 135 64 67
+68(sp_sint_mul_two_div_five):      6(int) SpecConstantOp 135 64(sp_sint_mul_two) 67
               69:     41(int) Constant 5
-              70:     41(int) SpecConstantOp 134 66 69
-              71:      6(int) SpecConstantOp 139 43(sp_sint) 62
+70(sp_uint_mul_two_div_five):     41(int) SpecConstantOp 134 66(sp_uint_mul_two) 69
+71(sp_sint_rem_four):      6(int) SpecConstantOp 139 43(sp_sint) 62
               72:     41(int) Constant 4
-              73:     41(int) SpecConstantOp 137 42(sp_uint) 72
+73(sp_uint_rem_four):     41(int) SpecConstantOp 137 42(sp_uint) 72
               74:      6(int) SpecConstantOp 132 43(sp_sint) 60
-              75:      6(int) SpecConstantOp 135 74 67
+75(sp_sint_mul_three_div_five):      6(int) SpecConstantOp 135 74 67
               76:      6(int) Constant 10
-              77:      6(int) SpecConstantOp 195 43(sp_sint) 76
+77(sp_sint_shift_right_arithmetic):      6(int) SpecConstantOp 195 43(sp_sint) 76
               78:      6(int) Constant 20
-              79:     41(int) SpecConstantOp 194 42(sp_uint) 78
-              80:      6(int) SpecConstantOp 196 43(sp_sint) 32
-              81:     41(int) SpecConstantOp 196 42(sp_uint) 20
+79(sp_uint_shift_right_arithmetic):     41(int) SpecConstantOp 194 42(sp_uint) 78
+80(sp_sint_shift_left):      6(int) SpecConstantOp 196 43(sp_sint) 32
+81(sp_uint_shift_left):     41(int) SpecConstantOp 196 42(sp_uint) 20
               82:      6(int) Constant 256
-              83:      6(int) SpecConstantOp 197 43(sp_sint) 82
+83(sp_sint_or_256):      6(int) SpecConstantOp 197 43(sp_sint) 82
               84:     41(int) Constant 512
-              85:     41(int) SpecConstantOp 198 42(sp_uint) 84
-              86:    22(bool) SpecConstantOp 177 19(sp_int) 43(sp_sint)
-              87:    22(bool) SpecConstantOp 170 42(sp_uint) 42(sp_uint)
-              88:    22(bool) SpecConstantOp 173 19(sp_int) 43(sp_sint)
+85(sp_uint_xor_512):     41(int) SpecConstantOp 198 42(sp_uint) 84
+86(sp_int_lt_sp_sint):    22(bool) SpecConstantOp 177 19(sp_int) 43(sp_sint)
+87(sp_uint_equal_sp_uint):    22(bool) SpecConstantOp 170 42(sp_uint) 42(sp_uint)
+88(sp_int_gt_sp_sint):    22(bool) SpecConstantOp 173 19(sp_int) 43(sp_sint)
               89:      6(int) Constant 30
               90:             TypeVector 6(int) 4
-              91:   90(ivec4) SpecConstantComposite 78 89 19(sp_int) 19(sp_int)
+          91(iv):   90(ivec4) SpecConstantComposite 78 89 19(sp_int) 19(sp_int)
               92:     41(int) Constant 4294967295
               93:     41(int) Constant 4294967294
               94:             TypeVector 41(int) 4
-              95:   94(ivec4) SpecConstantComposite 42(sp_uint) 42(sp_uint) 92 93
+          95(uv):   94(ivec4) SpecConstantComposite 42(sp_uint) 42(sp_uint) 92 93
               96:             TypeVector 22(bool) 4
               97:   94(ivec4) ConstantComposite 48 48 48 48
-              98:   96(bvec4) SpecConstantOp 171 91 97
-              99:   96(bvec4) SpecConstantOp 171 95 97
+  98(bv_from_iv):   96(bvec4) SpecConstantOp 171 91(iv) 97
+  99(bv_from_uv):   96(bvec4) SpecConstantOp 171 95(uv) 97
              100:   90(ivec4) ConstantComposite 12 12 12 12
              101:   90(ivec4) ConstantComposite 32 32 32 32
-             102:   90(ivec4) SpecConstantOp 169 98 101 100
+ 102(iv_from_bv):   90(ivec4) SpecConstantOp 169 98(bv_from_iv) 101 100
              103:   94(ivec4) ConstantComposite 52 52 52 52
-             104:   94(ivec4) SpecConstantOp 169 98 103 97
-             105:   94(ivec4) SpecConstantOp 128 91 97
-             106:   90(ivec4) SpecConstantOp 128 95 97
-             107:   90(ivec4) SpecConstantOp 200 91
-             108:   90(ivec4) SpecConstantOp 126 91
+ 104(uv_from_bv):   94(ivec4) SpecConstantOp 169 98(bv_from_iv) 103 97
+ 105(uv_from_iv):   94(ivec4) SpecConstantOp 128 91(iv) 97
+ 106(iv_from_uv):   90(ivec4) SpecConstantOp 128 95(uv) 97
+     107(not_iv):   90(ivec4) SpecConstantOp 200 91(iv)
+  108(negate_iv):   90(ivec4) SpecConstantOp 126 91(iv)
              109:   90(ivec4) ConstantComposite 20 20 20 20
-             110:   90(ivec4) SpecConstantOp 128 91 109
-             111:   90(ivec4) SpecConstantOp 128 91 109
+ 110(iv_add_two):   90(ivec4) SpecConstantOp 128 91(iv) 109
+             111:   90(ivec4) SpecConstantOp 128 91(iv) 109
              112:   90(ivec4) ConstantComposite 60 60 60 60
-             113:   90(ivec4) SpecConstantOp 130 111 112
+113(iv_add_two_sub_three):   90(ivec4) SpecConstantOp 130 111 112
              114:   90(ivec4) ConstantComposite 62 62 62 62
-             115:   90(ivec4) SpecConstantOp 130 113 114
-             116:   90(ivec4) SpecConstantOp 132 91 109
+115(iv_add_two_sub_four):   90(ivec4) SpecConstantOp 130 113(iv_add_two_sub_three) 114
+ 116(iv_mul_two):   90(ivec4) SpecConstantOp 132 91(iv) 109
              117:   90(ivec4) ConstantComposite 67 67 67 67
-             118:   90(ivec4) SpecConstantOp 135 116 117
-             119:   90(ivec4) SpecConstantOp 139 91 114
+118(iv_mul_two_div_five):   90(ivec4) SpecConstantOp 135 116(iv_mul_two) 117
+119(iv_rem_four):   90(ivec4) SpecConstantOp 139 91(iv) 114
              120:   90(ivec4) ConstantComposite 76 76 76 76
-             121:   90(ivec4) SpecConstantOp 195 91 120
-             122:   90(ivec4) SpecConstantOp 196 91 109
+121(iv_shift_right_arithmetic):   90(ivec4) SpecConstantOp 195 91(iv) 120
+122(iv_shift_left):   90(ivec4) SpecConstantOp 196 91(iv) 109
              123:      6(int) Constant 1024
              124:   90(ivec4) ConstantComposite 123 123 123 123
-             125:   90(ivec4) SpecConstantOp 197 91 124
+ 125(iv_or_1024):   90(ivec4) SpecConstantOp 197 91(iv) 124
              126:     41(int) Constant 2048
              127:   94(ivec4) ConstantComposite 126 126 126 126
-             128:   94(ivec4) SpecConstantOp 198 95 127
-             129:      6(int) SpecConstantOp 81 91 0
+128(uv_xor_2048):   94(ivec4) SpecConstantOp 198 95(uv) 127
+       129(iv_x):      6(int) SpecConstantOp 81 91(iv) 0
              130:             TypeVector 6(int) 2
-             131:  130(ivec2) SpecConstantOp 79 91 91 1(GLSL.std.450) 0
+      131(iv_yx):  130(ivec2) SpecConstantOp 79 91(iv) 91(iv) 1(GLSL.std.450) 0
              132:             TypeVector 6(int) 3
-             133:  132(ivec3) SpecConstantOp 79 91 91 2 1(GLSL.std.450) 0
-             134:   90(ivec4) SpecConstantOp 79 91 91 1(GLSL.std.450) 2 0 3
+     133(iv_zyx):  132(ivec3) SpecConstantOp 79 91(iv) 91(iv) 2 1(GLSL.std.450) 0
+    134(iv_yzxw):   90(ivec4) SpecConstantOp 79 91(iv) 91(iv) 1(GLSL.std.450) 2 0 3
           135(a):      6(int) SpecConstant 4
           136(b):      6(int) SpecConstant 6
           137(c):    22(bool) SpecConstantTrue
@@ -154,14 +210,14 @@
 142(ternayArray1):    141(ptr) Variable Private
              143:      6(int) Constant 13
              144:      6(int) Constant 17
-             145:      6(int) SpecConstantOp 169 137(c) 143 144
-             146:      6(int) SpecConstantOp 169 137(c) 135(a) 144
+         145(t1):      6(int) SpecConstantOp 169 137(c) 143 144
+         146(t2):      6(int) SpecConstantOp 169 137(c) 135(a) 144
              147:    22(bool) ConstantTrue
-             148:      6(int) SpecConstantOp 169 147 135(a) 144
+         148(t3):      6(int) SpecConstantOp 169 147 135(a) 144
              149:    22(bool) SpecConstantOp 173 135(a) 136(b)
              150:      6(int) SpecConstantOp 128 143 135(a)
              151:      6(int) SpecConstantOp 132 144 136(b)
-             152:      6(int) SpecConstantOp 169 149 150 151
+         152(t4):      6(int) SpecConstantOp 169 149 150 151
              153:    22(bool) SpecConstantOp 168 137(c)
              154:             TypeVector 39(float) 2
              155:   39(float) Constant 1065353216
@@ -170,7 +226,7 @@
              158:  154(fvec2) ConstantComposite 157 157
              159:             TypeVector 22(bool) 2
              160:  159(bvec2) SpecConstantComposite 153 153
-             161:  154(fvec2) SpecConstantOp 169 160 156 158
+         161(v2):  154(fvec2) SpecConstantOp 169 160 156 158
          4(main):           2 Function None 3
                5:             Label
                               Return
diff --git a/Test/baseResults/spv.ssbo.autoassign.frag.out b/Test/baseResults/spv.ssbo.autoassign.frag.out
index ca282c6..40afa15 100644
--- a/Test/baseResults/spv.ssbo.autoassign.frag.out
+++ b/Test/baseResults/spv.ssbo.autoassign.frag.out
@@ -1,6 +1,6 @@
 spv.ssbo.autoassign.frag
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 99
 
                               Capability Shader
@@ -30,9 +30,7 @@
                               Name 92  "pos"
                               Name 95  "@entryPointOutput"
                               Name 96  "param"
-                              MemberDecorate 14(BufType) 0 NonWritable
                               MemberDecorate 14(BufType) 0 Offset 0
-                              MemberDecorate 14(BufType) 1 NonWritable
                               MemberDecorate 14(BufType) 1 Offset 16
                               Decorate 15 ArrayStride 32
                               MemberDecorate 16(SB0) 0 NonWritable
diff --git a/Test/baseResults/spv.ssboAlias.frag.out b/Test/baseResults/spv.ssboAlias.frag.out
new file mode 100644
index 0000000..f03d2ca
--- /dev/null
+++ b/Test/baseResults/spv.ssboAlias.frag.out
@@ -0,0 +1,86 @@
+spv.ssboAlias.frag
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 44
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 41
+                              ExecutionMode 4 OriginUpperLeft
+                              Source HLSL 500
+                              Name 4  "main"
+                              Name 9  "@main("
+                              Name 13  "Buf1"
+                              MemberName 13(Buf1) 0  "@data"
+                              Name 15  "Buf1"
+                              Name 18  "Buf1@count"
+                              MemberName 18(Buf1@count) 0  "@count"
+                              Name 20  "Buf1@count"
+                              Name 28  "Buf2"
+                              Name 29  "Buf2@count"
+                              Name 41  "@entryPointOutput"
+                              Name 43  "Buf3"
+                              Decorate 12 ArrayStride 4
+                              MemberDecorate 13(Buf1) 0 Offset 0
+                              Decorate 13(Buf1) BufferBlock
+                              Decorate 15(Buf1) DescriptorSet 0
+                              Decorate 15(Buf1) Binding 84
+                              MemberDecorate 18(Buf1@count) 0 Offset 0
+                              Decorate 18(Buf1@count) BufferBlock
+                              Decorate 20(Buf1@count) DescriptorSet 0
+                              Decorate 20(Buf1@count) Binding 83
+                              Decorate 28(Buf2) DescriptorSet 0
+                              Decorate 28(Buf2) Binding 85
+                              Decorate 29(Buf2@count) DescriptorSet 0
+                              Decorate 29(Buf2@count) Binding 86
+                              Decorate 41(@entryPointOutput) Location 0
+                              Decorate 43(Buf3) DescriptorSet 0
+                              Decorate 43(Buf3) Binding 84
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+               8:             TypeFunction 7(fvec4)
+              11:             TypeInt 32 0
+              12:             TypeRuntimeArray 11(int)
+        13(Buf1):             TypeStruct 12
+              14:             TypePointer Uniform 13(Buf1)
+        15(Buf1):     14(ptr) Variable Uniform
+              16:             TypeInt 32 1
+              17:     16(int) Constant 0
+  18(Buf1@count):             TypeStruct 11(int)
+              19:             TypePointer Uniform 18(Buf1@count)
+  20(Buf1@count):     19(ptr) Variable Uniform
+              21:             TypePointer Uniform 11(int)
+              23:     11(int) Constant 1
+              24:     11(int) Constant 0
+              26:     11(int) Constant 10
+        28(Buf2):     14(ptr) Variable Uniform
+  29(Buf2@count):     19(ptr) Variable Uniform
+              32:     11(int) Constant 20
+              34:    6(float) Constant 1065353216
+              35:    6(float) Constant 1077936128
+              36:    6(float) Constant 1084227584
+              37:    7(fvec4) ConstantComposite 34 35 36 34
+              40:             TypePointer Output 7(fvec4)
+41(@entryPointOutput):     40(ptr) Variable Output
+        43(Buf3):     14(ptr) Variable Uniform
+         4(main):           2 Function None 3
+               5:             Label
+              42:    7(fvec4) FunctionCall 9(@main()
+                              Store 41(@entryPointOutput) 42
+                              Return
+                              FunctionEnd
+       9(@main():    7(fvec4) Function None 8
+              10:             Label
+              22:     21(ptr) AccessChain 20(Buf1@count) 17
+              25:     11(int) AtomicIAdd 22 23 24 23
+              27:     21(ptr) AccessChain 15(Buf1) 17 25
+                              Store 27 26
+              30:     21(ptr) AccessChain 29(Buf2@count) 17
+              31:     11(int) AtomicIAdd 30 23 24 23
+              33:     21(ptr) AccessChain 28(Buf2) 17 31
+                              Store 33 32
+                              ReturnValue 37
+                              FunctionEnd
diff --git a/Test/baseResults/spv.stereoViewRendering.tesc.out b/Test/baseResults/spv.stereoViewRendering.tesc.out
index 8fd6dd5..732e5b4 100644
--- a/Test/baseResults/spv.stereoViewRendering.tesc.out
+++ b/Test/baseResults/spv.stereoViewRendering.tesc.out
@@ -1,85 +1,90 @@
 spv.stereoViewRendering.tesc
-Warning, version 450 is not yet complete; most version-specific features are present, but some are missing.
+error: SPIRV-Tools Validation Errors
+error: When BuiltIn decoration is applied to a structure-type member, all members of that structure type must also be decorated with BuiltIn (No allowed mixing of built-in variables and non-built-in variables within a single structure). Structure id 27 does not meet this requirement.
+  %gl_PerVertex_0 = OpTypeStruct %v4float %float %_arr_float_uint_1 %_arr_float_uint_1 %v4float
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 38
 
+                              Capability Geometry
                               Capability Tessellation
+                              Capability ShaderViewportIndexLayerNV
                               Capability ShaderViewportMaskNV
                               Capability ShaderStereoViewNV
+                              Extension  "SPV_EXT_shader_viewport_index_layer"
                               Extension  "SPV_NV_stereo_view_rendering"
                               Extension  "SPV_NV_viewport_array2"
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint TessellationControl 4  "main" 16 18 32
+                              EntryPoint TessellationControl 4  "main" 16 18 31 37
                               ExecutionMode 4 OutputVertices 4
                               Source GLSL 450
                               SourceExtension  "GL_NV_stereo_view_rendering"
                               SourceExtension  "GL_NV_viewport_array2"
                               Name 4  "main"
                               Name 12  "gl_PerVertex"
-                              MemberName 12(gl_PerVertex) 0  "gl_Layer"
-                              MemberName 12(gl_PerVertex) 1  "gl_SecondaryPositionNV"
-                              MemberName 12(gl_PerVertex) 2  "gl_SecondaryViewportMaskNV"
+                              MemberName 12(gl_PerVertex) 0  "gl_SecondaryPositionNV"
+                              MemberName 12(gl_PerVertex) 1  "gl_SecondaryViewportMaskNV"
                               Name 16  "gl_out"
                               Name 18  "gl_InvocationID"
-                              Name 28  "gl_PerVertex"
-                              MemberName 28(gl_PerVertex) 0  "gl_Position"
-                              MemberName 28(gl_PerVertex) 1  "gl_PointSize"
-                              MemberName 28(gl_PerVertex) 2  "gl_ClipDistance"
-                              MemberName 28(gl_PerVertex) 3  "gl_CullDistance"
-                              MemberName 28(gl_PerVertex) 4  "gl_SecondaryPositionNV"
-                              Name 32  "gl_in"
-                              MemberDecorate 12(gl_PerVertex) 0 BuiltIn Layer
-                              MemberDecorate 12(gl_PerVertex) 0 ViewportRelativeNV
-                              MemberDecorate 12(gl_PerVertex) 0 SecondaryViewportRelativeNV 1
-                              MemberDecorate 12(gl_PerVertex) 1 BuiltIn SecondaryPositionNV
-                              MemberDecorate 12(gl_PerVertex) 2 BuiltIn SecondaryViewportMaskNV
+                              Name 27  "gl_PerVertex"
+                              MemberName 27(gl_PerVertex) 0  "gl_Position"
+                              MemberName 27(gl_PerVertex) 1  "gl_PointSize"
+                              MemberName 27(gl_PerVertex) 2  "gl_ClipDistance"
+                              MemberName 27(gl_PerVertex) 3  "gl_CullDistance"
+                              MemberName 27(gl_PerVertex) 4  "gl_SecondaryPositionNV"
+                              Name 31  "gl_in"
+                              Name 37  "gl_Layer"
+                              MemberDecorate 12(gl_PerVertex) 0 BuiltIn SecondaryPositionNV
+                              MemberDecorate 12(gl_PerVertex) 1 BuiltIn SecondaryViewportMaskNV
                               Decorate 12(gl_PerVertex) Block
                               Decorate 18(gl_InvocationID) BuiltIn InvocationId
-                              MemberDecorate 28(gl_PerVertex) 0 BuiltIn Position
-                              MemberDecorate 28(gl_PerVertex) 1 BuiltIn PointSize
-                              MemberDecorate 28(gl_PerVertex) 2 BuiltIn ClipDistance
-                              MemberDecorate 28(gl_PerVertex) 3 BuiltIn CullDistance
-                              Decorate 28(gl_PerVertex) Block
+                              MemberDecorate 27(gl_PerVertex) 0 BuiltIn Position
+                              MemberDecorate 27(gl_PerVertex) 1 BuiltIn PointSize
+                              MemberDecorate 27(gl_PerVertex) 2 BuiltIn ClipDistance
+                              MemberDecorate 27(gl_PerVertex) 3 BuiltIn CullDistance
+                              Decorate 27(gl_PerVertex) Block
+                              Decorate 37(gl_Layer) BuiltIn Layer
+                              Decorate 37(gl_Layer) ViewportRelativeNV
+                              Decorate 37(gl_Layer) SecondaryViewportRelativeNV 1
                2:             TypeVoid
                3:             TypeFunction 2
-               6:             TypeInt 32 1
-               7:             TypeFloat 32
-               8:             TypeVector 7(float) 4
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+               8:             TypeInt 32 1
                9:             TypeInt 32 0
               10:      9(int) Constant 2
-              11:             TypeArray 6(int) 10
-12(gl_PerVertex):             TypeStruct 6(int) 8(fvec4) 11
+              11:             TypeArray 8(int) 10
+12(gl_PerVertex):             TypeStruct 7(fvec4) 11
               13:      9(int) Constant 4
               14:             TypeArray 12(gl_PerVertex) 13
               15:             TypePointer Output 14
       16(gl_out):     15(ptr) Variable Output
-              17:             TypePointer Input 6(int)
+              17:             TypePointer Input 8(int)
 18(gl_InvocationID):     17(ptr) Variable Input
-              20:      6(int) Constant 2
-              21:      6(int) Constant 0
-              22:      6(int) Constant 1
-              23:             TypePointer Output 6(int)
-              26:      9(int) Constant 1
-              27:             TypeArray 7(float) 26
-28(gl_PerVertex):             TypeStruct 8(fvec4) 7(float) 27 27 8(fvec4)
-              29:      9(int) Constant 32
-              30:             TypeArray 28(gl_PerVertex) 29
-              31:             TypePointer Input 30
-       32(gl_in):     31(ptr) Variable Input
-              33:             TypePointer Input 8(fvec4)
-              36:             TypePointer Output 8(fvec4)
+              20:      8(int) Constant 1
+              21:      8(int) Constant 0
+              22:             TypePointer Output 8(int)
+              25:      9(int) Constant 1
+              26:             TypeArray 6(float) 25
+27(gl_PerVertex):             TypeStruct 7(fvec4) 6(float) 26 26 7(fvec4)
+              28:      9(int) Constant 32
+              29:             TypeArray 27(gl_PerVertex) 28
+              30:             TypePointer Input 29
+       31(gl_in):     30(ptr) Variable Input
+              32:             TypePointer Input 7(fvec4)
+              35:             TypePointer Output 7(fvec4)
+    37(gl_Layer):     22(ptr) Variable Output
          4(main):           2 Function None 3
                5:             Label
-              19:      6(int) Load 18(gl_InvocationID)
-              24:     23(ptr) AccessChain 16(gl_out) 19 20 21
-                              Store 24 22
-              25:      6(int) Load 18(gl_InvocationID)
-              34:     33(ptr) AccessChain 32(gl_in) 22 21
-              35:    8(fvec4) Load 34
-              37:     36(ptr) AccessChain 16(gl_out) 25 22
-                              Store 37 35
+              19:      8(int) Load 18(gl_InvocationID)
+              23:     22(ptr) AccessChain 16(gl_out) 19 20 21
+                              Store 23 20
+              24:      8(int) Load 18(gl_InvocationID)
+              33:     32(ptr) AccessChain 31(gl_in) 20 21
+              34:    7(fvec4) Load 33
+              36:     35(ptr) AccessChain 16(gl_out) 24 21
+                              Store 36 34
                               Return
                               FunctionEnd
diff --git a/Test/baseResults/spv.stereoViewRendering.vert.out b/Test/baseResults/spv.stereoViewRendering.vert.out
index d6c6956..afd8c75 100644
--- a/Test/baseResults/spv.stereoViewRendering.vert.out
+++ b/Test/baseResults/spv.stereoViewRendering.vert.out
@@ -1,8 +1,6 @@
 spv.stereoViewRendering.vert
-Warning, version 450 is not yet complete; most version-specific features are present, but some are missing.
-
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 27
 
                               Capability Shader
@@ -10,6 +8,7 @@
                               Capability ShaderViewportIndexLayerNV
                               Capability ShaderViewportMaskNV
                               Capability ShaderStereoViewNV
+                              Extension  "SPV_EXT_shader_viewport_index_layer"
                               Extension  "SPV_NV_stereo_view_rendering"
                               Extension  "SPV_NV_viewport_array2"
                1:             ExtInstImport  "GLSL.std.450"
diff --git a/Test/baseResults/spv.storageBuffer.vert.out b/Test/baseResults/spv.storageBuffer.vert.out
old mode 100755
new mode 100644
index fa08ca8..71c3bf2
--- a/Test/baseResults/spv.storageBuffer.vert.out
+++ b/Test/baseResults/spv.storageBuffer.vert.out
@@ -1,8 +1,6 @@
 spv.storageBuffer.vert
-Warning, version 450 is not yet complete; most version-specific features are present, but some are missing.
-
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 31
 
                               Capability Shader
diff --git a/Test/baseResults/spv.structAssignment.frag.out b/Test/baseResults/spv.structAssignment.frag.out
old mode 100755
new mode 100644
index eb796f7..ec771cc
--- a/Test/baseResults/spv.structAssignment.frag.out
+++ b/Test/baseResults/spv.structAssignment.frag.out
@@ -3,7 +3,7 @@
          "precision mediump int; precision highp float;" 
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 50
 
                               Capability Shader
@@ -36,6 +36,7 @@
                               MemberDecorate 9(lunarStruct2) 0 RelaxedPrecision
                               MemberDecorate 10(lunarStruct3) 1 RelaxedPrecision
                               Decorate 16 RelaxedPrecision
+                              Decorate 31(gl_FragColor) Location 0
                               Decorate 40(samp2D) DescriptorSet 0
                               Decorate 44(coord) RelaxedPrecision
                               Decorate 45 RelaxedPrecision
diff --git a/Test/baseResults/spv.structDeref.frag.out b/Test/baseResults/spv.structDeref.frag.out
old mode 100755
new mode 100644
index e60159f..a7915b4
--- a/Test/baseResults/spv.structDeref.frag.out
+++ b/Test/baseResults/spv.structDeref.frag.out
@@ -1,6 +1,6 @@
 spv.structDeref.frag
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 123
 
                               Capability Shader
@@ -40,6 +40,7 @@
                               Name 99  "gl_FragColor"
                               Name 116  "samp2D"
                               Name 122  "foo2"
+                              Decorate 99(gl_FragColor) Location 0
                               Decorate 116(samp2D) DescriptorSet 0
                2:             TypeVoid
                3:             TypeFunction 2
diff --git a/Test/baseResults/spv.structure.frag.out b/Test/baseResults/spv.structure.frag.out
old mode 100755
new mode 100644
index f7cb2d2..0592084
--- a/Test/baseResults/spv.structure.frag.out
+++ b/Test/baseResults/spv.structure.frag.out
@@ -1,6 +1,6 @@
 spv.structure.frag
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 60
 
                               Capability Shader
@@ -24,6 +24,7 @@
                               Name 50  "samp2D"
                               Name 54  "coord"
                               Name 59  "foo"
+                              Decorate 45(gl_FragColor) Location 0
                               Decorate 50(samp2D) DescriptorSet 0
                2:             TypeVoid
                3:             TypeFunction 2
diff --git a/Test/baseResults/spv.subgroup.frag.out b/Test/baseResults/spv.subgroup.frag.out
new file mode 100644
index 0000000..4dd636e
--- /dev/null
+++ b/Test/baseResults/spv.subgroup.frag.out
@@ -0,0 +1,44 @@
+spv.subgroup.frag
+// Module Version 10300
+// Generated by (magic number): 80007
+// Id's are bound by 17
+
+                              Capability Shader
+                              Capability GroupNonUniform
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 9 11 13
+                              ExecutionMode 4 OriginUpperLeft
+                              Source GLSL 450
+                              SourceExtension  "GL_KHR_shader_subgroup_basic"
+                              Name 4  "main"
+                              Name 9  "data"
+                              Name 11  "gl_SubgroupSize"
+                              Name 13  "gl_SubgroupInvocationID"
+                              Decorate 9(data) Location 0
+                              Decorate 11(gl_SubgroupSize) RelaxedPrecision
+                              Decorate 11(gl_SubgroupSize) Flat
+                              Decorate 11(gl_SubgroupSize) BuiltIn SubgroupSize
+                              Decorate 12 RelaxedPrecision
+                              Decorate 13(gl_SubgroupInvocationID) RelaxedPrecision
+                              Decorate 13(gl_SubgroupInvocationID) Flat
+                              Decorate 13(gl_SubgroupInvocationID) BuiltIn SubgroupLocalInvocationId
+                              Decorate 14 RelaxedPrecision
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeInt 32 0
+               7:             TypeVector 6(int) 4
+               8:             TypePointer Output 7(ivec4)
+         9(data):      8(ptr) Variable Output
+              10:             TypePointer Input 6(int)
+11(gl_SubgroupSize):     10(ptr) Variable Input
+13(gl_SubgroupInvocationID):     10(ptr) Variable Input
+              15:      6(int) Constant 0
+         4(main):           2 Function None 3
+               5:             Label
+              12:      6(int) Load 11(gl_SubgroupSize)
+              14:      6(int) Load 13(gl_SubgroupInvocationID)
+              16:    7(ivec4) CompositeConstruct 12 14 15 15
+                              Store 9(data) 16
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.subgroup.geom.out b/Test/baseResults/spv.subgroup.geom.out
new file mode 100644
index 0000000..a68343a
--- /dev/null
+++ b/Test/baseResults/spv.subgroup.geom.out
@@ -0,0 +1,62 @@
+spv.subgroup.geom
+// Module Version 10300
+// Generated by (magic number): 80007
+// Id's are bound by 26
+
+                              Capability Geometry
+                              Capability GroupNonUniform
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Geometry 4  "main" 15 18 20
+                              ExecutionMode 4 InputPoints
+                              ExecutionMode 4 Invocations 1
+                              ExecutionMode 4 OutputPoints
+                              ExecutionMode 4 OutputVertices 1
+                              Source GLSL 450
+                              SourceExtension  "GL_KHR_shader_subgroup_basic"
+                              Name 4  "main"
+                              Name 9  "Output"
+                              MemberName 9(Output) 0  "result"
+                              Name 11  ""
+                              Name 15  "gl_PrimitiveIDIn"
+                              Name 18  "gl_SubgroupSize"
+                              Name 20  "gl_SubgroupInvocationID"
+                              Decorate 8 ArrayStride 16
+                              MemberDecorate 9(Output) 0 Offset 0
+                              Decorate 9(Output) Block
+                              Decorate 11 DescriptorSet 0
+                              Decorate 11 Binding 0
+                              Decorate 15(gl_PrimitiveIDIn) BuiltIn PrimitiveId
+                              Decorate 18(gl_SubgroupSize) RelaxedPrecision
+                              Decorate 18(gl_SubgroupSize) BuiltIn SubgroupSize
+                              Decorate 19 RelaxedPrecision
+                              Decorate 20(gl_SubgroupInvocationID) RelaxedPrecision
+                              Decorate 20(gl_SubgroupInvocationID) BuiltIn SubgroupLocalInvocationId
+                              Decorate 21 RelaxedPrecision
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeInt 32 0
+               7:             TypeVector 6(int) 4
+               8:             TypeRuntimeArray 7(ivec4)
+       9(Output):             TypeStruct 8
+              10:             TypePointer StorageBuffer 9(Output)
+              11:     10(ptr) Variable StorageBuffer
+              12:             TypeInt 32 1
+              13:     12(int) Constant 0
+              14:             TypePointer Input 12(int)
+15(gl_PrimitiveIDIn):     14(ptr) Variable Input
+              17:             TypePointer Input 6(int)
+18(gl_SubgroupSize):     17(ptr) Variable Input
+20(gl_SubgroupInvocationID):     17(ptr) Variable Input
+              22:      6(int) Constant 0
+              24:             TypePointer StorageBuffer 7(ivec4)
+         4(main):           2 Function None 3
+               5:             Label
+              16:     12(int) Load 15(gl_PrimitiveIDIn)
+              19:      6(int) Load 18(gl_SubgroupSize)
+              21:      6(int) Load 20(gl_SubgroupInvocationID)
+              23:    7(ivec4) CompositeConstruct 19 21 22 22
+              25:     24(ptr) AccessChain 11 13 16
+                              Store 25 23
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.subgroup.tesc.out b/Test/baseResults/spv.subgroup.tesc.out
new file mode 100644
index 0000000..4e362e2
--- /dev/null
+++ b/Test/baseResults/spv.subgroup.tesc.out
@@ -0,0 +1,59 @@
+spv.subgroup.tesc
+// Module Version 10300
+// Generated by (magic number): 80007
+// Id's are bound by 26
+
+                              Capability Tessellation
+                              Capability GroupNonUniform
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint TessellationControl 4  "main" 15 18 20
+                              ExecutionMode 4 OutputVertices 1
+                              Source GLSL 450
+                              SourceExtension  "GL_KHR_shader_subgroup_basic"
+                              Name 4  "main"
+                              Name 9  "Output"
+                              MemberName 9(Output) 0  "result"
+                              Name 11  ""
+                              Name 15  "gl_PrimitiveID"
+                              Name 18  "gl_SubgroupSize"
+                              Name 20  "gl_SubgroupInvocationID"
+                              Decorate 8 ArrayStride 16
+                              MemberDecorate 9(Output) 0 Offset 0
+                              Decorate 9(Output) Block
+                              Decorate 11 DescriptorSet 0
+                              Decorate 11 Binding 0
+                              Decorate 15(gl_PrimitiveID) BuiltIn PrimitiveId
+                              Decorate 18(gl_SubgroupSize) RelaxedPrecision
+                              Decorate 18(gl_SubgroupSize) BuiltIn SubgroupSize
+                              Decorate 19 RelaxedPrecision
+                              Decorate 20(gl_SubgroupInvocationID) RelaxedPrecision
+                              Decorate 20(gl_SubgroupInvocationID) BuiltIn SubgroupLocalInvocationId
+                              Decorate 21 RelaxedPrecision
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeInt 32 0
+               7:             TypeVector 6(int) 4
+               8:             TypeRuntimeArray 7(ivec4)
+       9(Output):             TypeStruct 8
+              10:             TypePointer StorageBuffer 9(Output)
+              11:     10(ptr) Variable StorageBuffer
+              12:             TypeInt 32 1
+              13:     12(int) Constant 0
+              14:             TypePointer Input 12(int)
+15(gl_PrimitiveID):     14(ptr) Variable Input
+              17:             TypePointer Input 6(int)
+18(gl_SubgroupSize):     17(ptr) Variable Input
+20(gl_SubgroupInvocationID):     17(ptr) Variable Input
+              22:      6(int) Constant 0
+              24:             TypePointer StorageBuffer 7(ivec4)
+         4(main):           2 Function None 3
+               5:             Label
+              16:     12(int) Load 15(gl_PrimitiveID)
+              19:      6(int) Load 18(gl_SubgroupSize)
+              21:      6(int) Load 20(gl_SubgroupInvocationID)
+              23:    7(ivec4) CompositeConstruct 19 21 22 22
+              25:     24(ptr) AccessChain 11 13 16
+                              Store 25 23
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.subgroup.tese.out b/Test/baseResults/spv.subgroup.tese.out
new file mode 100644
index 0000000..e09f558
--- /dev/null
+++ b/Test/baseResults/spv.subgroup.tese.out
@@ -0,0 +1,61 @@
+spv.subgroup.tese
+// Module Version 10300
+// Generated by (magic number): 80007
+// Id's are bound by 26
+
+                              Capability Tessellation
+                              Capability GroupNonUniform
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint TessellationEvaluation 4  "main" 15 18 20
+                              ExecutionMode 4 Isolines
+                              ExecutionMode 4 SpacingEqual
+                              ExecutionMode 4 VertexOrderCcw
+                              Source GLSL 450
+                              SourceExtension  "GL_KHR_shader_subgroup_basic"
+                              Name 4  "main"
+                              Name 9  "Output"
+                              MemberName 9(Output) 0  "result"
+                              Name 11  ""
+                              Name 15  "gl_PrimitiveID"
+                              Name 18  "gl_SubgroupSize"
+                              Name 20  "gl_SubgroupInvocationID"
+                              Decorate 8 ArrayStride 16
+                              MemberDecorate 9(Output) 0 Offset 0
+                              Decorate 9(Output) Block
+                              Decorate 11 DescriptorSet 0
+                              Decorate 11 Binding 0
+                              Decorate 15(gl_PrimitiveID) BuiltIn PrimitiveId
+                              Decorate 18(gl_SubgroupSize) RelaxedPrecision
+                              Decorate 18(gl_SubgroupSize) BuiltIn SubgroupSize
+                              Decorate 19 RelaxedPrecision
+                              Decorate 20(gl_SubgroupInvocationID) RelaxedPrecision
+                              Decorate 20(gl_SubgroupInvocationID) BuiltIn SubgroupLocalInvocationId
+                              Decorate 21 RelaxedPrecision
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeInt 32 0
+               7:             TypeVector 6(int) 4
+               8:             TypeRuntimeArray 7(ivec4)
+       9(Output):             TypeStruct 8
+              10:             TypePointer StorageBuffer 9(Output)
+              11:     10(ptr) Variable StorageBuffer
+              12:             TypeInt 32 1
+              13:     12(int) Constant 0
+              14:             TypePointer Input 12(int)
+15(gl_PrimitiveID):     14(ptr) Variable Input
+              17:             TypePointer Input 6(int)
+18(gl_SubgroupSize):     17(ptr) Variable Input
+20(gl_SubgroupInvocationID):     17(ptr) Variable Input
+              22:      6(int) Constant 0
+              24:             TypePointer StorageBuffer 7(ivec4)
+         4(main):           2 Function None 3
+               5:             Label
+              16:     12(int) Load 15(gl_PrimitiveID)
+              19:      6(int) Load 18(gl_SubgroupSize)
+              21:      6(int) Load 20(gl_SubgroupInvocationID)
+              23:    7(ivec4) CompositeConstruct 19 21 22 22
+              25:     24(ptr) AccessChain 11 13 16
+                              Store 25 23
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.subgroup.vert.out b/Test/baseResults/spv.subgroup.vert.out
new file mode 100644
index 0000000..2fbc92b
--- /dev/null
+++ b/Test/baseResults/spv.subgroup.vert.out
@@ -0,0 +1,58 @@
+spv.subgroup.vert
+// Module Version 10300
+// Generated by (magic number): 80007
+// Id's are bound by 26
+
+                              Capability Shader
+                              Capability GroupNonUniform
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Vertex 4  "main" 15 18 20
+                              Source GLSL 450
+                              SourceExtension  "GL_KHR_shader_subgroup_basic"
+                              Name 4  "main"
+                              Name 9  "Output"
+                              MemberName 9(Output) 0  "result"
+                              Name 11  ""
+                              Name 15  "gl_VertexIndex"
+                              Name 18  "gl_SubgroupSize"
+                              Name 20  "gl_SubgroupInvocationID"
+                              Decorate 8 ArrayStride 16
+                              MemberDecorate 9(Output) 0 Offset 0
+                              Decorate 9(Output) Block
+                              Decorate 11 DescriptorSet 0
+                              Decorate 11 Binding 0
+                              Decorate 15(gl_VertexIndex) BuiltIn VertexIndex
+                              Decorate 18(gl_SubgroupSize) RelaxedPrecision
+                              Decorate 18(gl_SubgroupSize) BuiltIn SubgroupSize
+                              Decorate 19 RelaxedPrecision
+                              Decorate 20(gl_SubgroupInvocationID) RelaxedPrecision
+                              Decorate 20(gl_SubgroupInvocationID) BuiltIn SubgroupLocalInvocationId
+                              Decorate 21 RelaxedPrecision
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeInt 32 0
+               7:             TypeVector 6(int) 4
+               8:             TypeRuntimeArray 7(ivec4)
+       9(Output):             TypeStruct 8
+              10:             TypePointer StorageBuffer 9(Output)
+              11:     10(ptr) Variable StorageBuffer
+              12:             TypeInt 32 1
+              13:     12(int) Constant 0
+              14:             TypePointer Input 12(int)
+15(gl_VertexIndex):     14(ptr) Variable Input
+              17:             TypePointer Input 6(int)
+18(gl_SubgroupSize):     17(ptr) Variable Input
+20(gl_SubgroupInvocationID):     17(ptr) Variable Input
+              22:      6(int) Constant 0
+              24:             TypePointer StorageBuffer 7(ivec4)
+         4(main):           2 Function None 3
+               5:             Label
+              16:     12(int) Load 15(gl_VertexIndex)
+              19:      6(int) Load 18(gl_SubgroupSize)
+              21:      6(int) Load 20(gl_SubgroupInvocationID)
+              23:    7(ivec4) CompositeConstruct 19 21 22 22
+              25:     24(ptr) AccessChain 11 13 16
+                              Store 25 23
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.subgroupArithmetic.comp.out b/Test/baseResults/spv.subgroupArithmetic.comp.out
new file mode 100644
index 0000000..f4e251a
--- /dev/null
+++ b/Test/baseResults/spv.subgroupArithmetic.comp.out
@@ -0,0 +1,2428 @@
+spv.subgroupArithmetic.comp
+// Module Version 10300
+// Generated by (magic number): 80007
+// Id's are bound by 2085
+
+                              Capability Shader
+                              Capability Float64
+                              Capability GroupNonUniform
+                              Capability GroupNonUniformArithmetic
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint GLCompute 4  "main" 10 12
+                              ExecutionMode 4 LocalSize 8 1 1
+                              Source GLSL 450
+                              SourceExtension  "GL_KHR_shader_subgroup_arithmetic"
+                              SourceExtension  "GL_KHR_shader_subgroup_basic"
+                              Name 4  "main"
+                              Name 8  "invocation"
+                              Name 10  "gl_SubgroupInvocationID"
+                              Name 12  "gl_SubgroupSize"
+                              Name 24  "Buffers"
+                              MemberName 24(Buffers) 0  "f4"
+                              MemberName 24(Buffers) 1  "i4"
+                              MemberName 24(Buffers) 2  "u4"
+                              MemberName 24(Buffers) 3  "d4"
+                              Name 27  "data"
+                              Decorate 10(gl_SubgroupInvocationID) RelaxedPrecision
+                              Decorate 10(gl_SubgroupInvocationID) BuiltIn SubgroupLocalInvocationId
+                              Decorate 11 RelaxedPrecision
+                              Decorate 12(gl_SubgroupSize) RelaxedPrecision
+                              Decorate 12(gl_SubgroupSize) BuiltIn SubgroupSize
+                              Decorate 13 RelaxedPrecision
+                              Decorate 14 RelaxedPrecision
+                              Decorate 16 RelaxedPrecision
+                              MemberDecorate 24(Buffers) 0 Offset 0
+                              MemberDecorate 24(Buffers) 1 Offset 16
+                              MemberDecorate 24(Buffers) 2 Offset 32
+                              MemberDecorate 24(Buffers) 3 Offset 64
+                              Decorate 24(Buffers) Block
+                              Decorate 27(data) DescriptorSet 0
+                              Decorate 27(data) Binding 0
+                              Decorate 2084 BuiltIn WorkgroupSize
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeInt 32 0
+               7:             TypePointer Function 6(int)
+               9:             TypePointer Input 6(int)
+10(gl_SubgroupInvocationID):      9(ptr) Variable Input
+12(gl_SubgroupSize):      9(ptr) Variable Input
+              15:      6(int) Constant 4
+              17:             TypeFloat 32
+              18:             TypeVector 17(float) 4
+              19:             TypeInt 32 1
+              20:             TypeVector 19(int) 4
+              21:             TypeVector 6(int) 4
+              22:             TypeFloat 64
+              23:             TypeVector 22(float64_t) 4
+     24(Buffers):             TypeStruct 18(fvec4) 20(ivec4) 21(ivec4) 23(f64vec4)
+              25:             TypeArray 24(Buffers) 15
+              26:             TypePointer StorageBuffer 25
+        27(data):     26(ptr) Variable StorageBuffer
+              29:     19(int) Constant 0
+              30:      6(int) Constant 0
+              31:             TypePointer StorageBuffer 17(float)
+              34:      6(int) Constant 3
+              38:     19(int) Constant 1
+              39:             TypeVector 17(float) 2
+              40:             TypePointer StorageBuffer 18(fvec4)
+              49:     19(int) Constant 2
+              50:             TypeVector 17(float) 3
+              59:     19(int) Constant 3
+              65:             TypePointer StorageBuffer 19(int)
+              71:             TypeVector 19(int) 2
+              72:             TypePointer StorageBuffer 20(ivec4)
+              81:             TypeVector 19(int) 3
+              95:             TypePointer StorageBuffer 6(int)
+             101:             TypeVector 6(int) 2
+             102:             TypePointer StorageBuffer 21(ivec4)
+             111:             TypeVector 6(int) 3
+             125:             TypePointer StorageBuffer 22(float64_t)
+             131:             TypeVector 22(float64_t) 2
+             132:             TypePointer StorageBuffer 23(f64vec4)
+             141:             TypeVector 22(float64_t) 3
+             521:             TypeBool
+             530:   71(ivec2) ConstantComposite 29 29
+             531:             TypeVector 521(bool) 2
+             534:   71(ivec2) ConstantComposite 38 38
+             543:   81(ivec3) ConstantComposite 29 29 29
+             544:             TypeVector 521(bool) 3
+             547:   81(ivec3) ConstantComposite 38 38 38
+             555:   20(ivec4) ConstantComposite 29 29 29 29
+             556:             TypeVector 521(bool) 4
+             559:   20(ivec4) ConstantComposite 38 38 38 38
+            2082:      6(int) Constant 8
+            2083:      6(int) Constant 1
+            2084:  111(ivec3) ConstantComposite 2082 2083 2083
+         4(main):           2 Function None 3
+               5:             Label
+   8(invocation):      7(ptr) Variable Function
+              11:      6(int) Load 10(gl_SubgroupInvocationID)
+              13:      6(int) Load 12(gl_SubgroupSize)
+              14:      6(int) IAdd 11 13
+              16:      6(int) UMod 14 15
+                              Store 8(invocation) 16
+              28:      6(int) Load 8(invocation)
+              32:     31(ptr) AccessChain 27(data) 29 29 30
+              33:   17(float) Load 32
+              35:   17(float) GroupNonUniformFAdd 34 Reduce 33
+              36:     31(ptr) AccessChain 27(data) 28 29 30
+                              Store 36 35
+              37:      6(int) Load 8(invocation)
+              41:     40(ptr) AccessChain 27(data) 38 29
+              42:   18(fvec4) Load 41
+              43:   39(fvec2) VectorShuffle 42 42 0 1
+              44:   39(fvec2) GroupNonUniformFAdd 34 Reduce 43
+              45:     40(ptr) AccessChain 27(data) 37 29
+              46:   18(fvec4) Load 45
+              47:   18(fvec4) VectorShuffle 46 44 4 5 2 3
+                              Store 45 47
+              48:      6(int) Load 8(invocation)
+              51:     40(ptr) AccessChain 27(data) 49 29
+              52:   18(fvec4) Load 51
+              53:   50(fvec3) VectorShuffle 52 52 0 1 2
+              54:   50(fvec3) GroupNonUniformFAdd 34 Reduce 53
+              55:     40(ptr) AccessChain 27(data) 48 29
+              56:   18(fvec4) Load 55
+              57:   18(fvec4) VectorShuffle 56 54 4 5 6 3
+                              Store 55 57
+              58:      6(int) Load 8(invocation)
+              60:     40(ptr) AccessChain 27(data) 59 29
+              61:   18(fvec4) Load 60
+              62:   18(fvec4) GroupNonUniformFAdd 34 Reduce 61
+              63:     40(ptr) AccessChain 27(data) 58 29
+                              Store 63 62
+              64:      6(int) Load 8(invocation)
+              66:     65(ptr) AccessChain 27(data) 29 38 30
+              67:     19(int) Load 66
+              68:     19(int) GroupNonUniformIAdd 34 Reduce 67
+              69:     65(ptr) AccessChain 27(data) 64 38 30
+                              Store 69 68
+              70:      6(int) Load 8(invocation)
+              73:     72(ptr) AccessChain 27(data) 38 38
+              74:   20(ivec4) Load 73
+              75:   71(ivec2) VectorShuffle 74 74 0 1
+              76:   71(ivec2) GroupNonUniformIAdd 34 Reduce 75
+              77:     72(ptr) AccessChain 27(data) 70 38
+              78:   20(ivec4) Load 77
+              79:   20(ivec4) VectorShuffle 78 76 4 5 2 3
+                              Store 77 79
+              80:      6(int) Load 8(invocation)
+              82:     72(ptr) AccessChain 27(data) 49 38
+              83:   20(ivec4) Load 82
+              84:   81(ivec3) VectorShuffle 83 83 0 1 2
+              85:   81(ivec3) GroupNonUniformIAdd 34 Reduce 84
+              86:     72(ptr) AccessChain 27(data) 80 38
+              87:   20(ivec4) Load 86
+              88:   20(ivec4) VectorShuffle 87 85 4 5 6 3
+                              Store 86 88
+              89:      6(int) Load 8(invocation)
+              90:     72(ptr) AccessChain 27(data) 59 38
+              91:   20(ivec4) Load 90
+              92:   20(ivec4) GroupNonUniformIAdd 34 Reduce 91
+              93:     72(ptr) AccessChain 27(data) 89 38
+                              Store 93 92
+              94:      6(int) Load 8(invocation)
+              96:     95(ptr) AccessChain 27(data) 29 49 30
+              97:      6(int) Load 96
+              98:      6(int) GroupNonUniformIAdd 34 Reduce 97
+              99:     95(ptr) AccessChain 27(data) 94 49 30
+                              Store 99 98
+             100:      6(int) Load 8(invocation)
+             103:    102(ptr) AccessChain 27(data) 38 49
+             104:   21(ivec4) Load 103
+             105:  101(ivec2) VectorShuffle 104 104 0 1
+             106:  101(ivec2) GroupNonUniformIAdd 34 Reduce 105
+             107:    102(ptr) AccessChain 27(data) 100 49
+             108:   21(ivec4) Load 107
+             109:   21(ivec4) VectorShuffle 108 106 4 5 2 3
+                              Store 107 109
+             110:      6(int) Load 8(invocation)
+             112:    102(ptr) AccessChain 27(data) 49 49
+             113:   21(ivec4) Load 112
+             114:  111(ivec3) VectorShuffle 113 113 0 1 2
+             115:  111(ivec3) GroupNonUniformIAdd 34 Reduce 114
+             116:    102(ptr) AccessChain 27(data) 110 49
+             117:   21(ivec4) Load 116
+             118:   21(ivec4) VectorShuffle 117 115 4 5 6 3
+                              Store 116 118
+             119:      6(int) Load 8(invocation)
+             120:    102(ptr) AccessChain 27(data) 59 49
+             121:   21(ivec4) Load 120
+             122:   21(ivec4) GroupNonUniformIAdd 34 Reduce 121
+             123:    102(ptr) AccessChain 27(data) 119 49
+                              Store 123 122
+             124:      6(int) Load 8(invocation)
+             126:    125(ptr) AccessChain 27(data) 29 59 30
+             127:22(float64_t) Load 126
+             128:22(float64_t) GroupNonUniformFAdd 34 Reduce 127
+             129:    125(ptr) AccessChain 27(data) 124 59 30
+                              Store 129 128
+             130:      6(int) Load 8(invocation)
+             133:    132(ptr) AccessChain 27(data) 38 59
+             134: 23(f64vec4) Load 133
+             135:131(f64vec2) VectorShuffle 134 134 0 1
+             136:131(f64vec2) GroupNonUniformFAdd 34 Reduce 135
+             137:    132(ptr) AccessChain 27(data) 130 59
+             138: 23(f64vec4) Load 137
+             139: 23(f64vec4) VectorShuffle 138 136 4 5 2 3
+                              Store 137 139
+             140:      6(int) Load 8(invocation)
+             142:    132(ptr) AccessChain 27(data) 49 59
+             143: 23(f64vec4) Load 142
+             144:141(f64vec3) VectorShuffle 143 143 0 1 2
+             145:141(f64vec3) GroupNonUniformFAdd 34 Reduce 144
+             146:    132(ptr) AccessChain 27(data) 140 59
+             147: 23(f64vec4) Load 146
+             148: 23(f64vec4) VectorShuffle 147 145 4 5 6 3
+                              Store 146 148
+             149:      6(int) Load 8(invocation)
+             150:    132(ptr) AccessChain 27(data) 59 59
+             151: 23(f64vec4) Load 150
+             152: 23(f64vec4) GroupNonUniformFAdd 34 Reduce 151
+             153:    132(ptr) AccessChain 27(data) 149 59
+                              Store 153 152
+             154:      6(int) Load 8(invocation)
+             155:     31(ptr) AccessChain 27(data) 29 29 30
+             156:   17(float) Load 155
+             157:   17(float) GroupNonUniformFMul 34 Reduce 156
+             158:     31(ptr) AccessChain 27(data) 154 29 30
+                              Store 158 157
+             159:      6(int) Load 8(invocation)
+             160:     40(ptr) AccessChain 27(data) 38 29
+             161:   18(fvec4) Load 160
+             162:   39(fvec2) VectorShuffle 161 161 0 1
+             163:   39(fvec2) GroupNonUniformFMul 34 Reduce 162
+             164:     40(ptr) AccessChain 27(data) 159 29
+             165:   18(fvec4) Load 164
+             166:   18(fvec4) VectorShuffle 165 163 4 5 2 3
+                              Store 164 166
+             167:      6(int) Load 8(invocation)
+             168:     40(ptr) AccessChain 27(data) 49 29
+             169:   18(fvec4) Load 168
+             170:   50(fvec3) VectorShuffle 169 169 0 1 2
+             171:   50(fvec3) GroupNonUniformFMul 34 Reduce 170
+             172:     40(ptr) AccessChain 27(data) 167 29
+             173:   18(fvec4) Load 172
+             174:   18(fvec4) VectorShuffle 173 171 4 5 6 3
+                              Store 172 174
+             175:      6(int) Load 8(invocation)
+             176:     40(ptr) AccessChain 27(data) 59 29
+             177:   18(fvec4) Load 176
+             178:   18(fvec4) GroupNonUniformFMul 34 Reduce 177
+             179:     40(ptr) AccessChain 27(data) 175 29
+                              Store 179 178
+             180:      6(int) Load 8(invocation)
+             181:     65(ptr) AccessChain 27(data) 29 38 30
+             182:     19(int) Load 181
+             183:     19(int) GroupNonUniformIMul 34 Reduce 182
+             184:     65(ptr) AccessChain 27(data) 180 38 30
+                              Store 184 183
+             185:      6(int) Load 8(invocation)
+             186:     72(ptr) AccessChain 27(data) 38 38
+             187:   20(ivec4) Load 186
+             188:   71(ivec2) VectorShuffle 187 187 0 1
+             189:   71(ivec2) GroupNonUniformIMul 34 Reduce 188
+             190:     72(ptr) AccessChain 27(data) 185 38
+             191:   20(ivec4) Load 190
+             192:   20(ivec4) VectorShuffle 191 189 4 5 2 3
+                              Store 190 192
+             193:      6(int) Load 8(invocation)
+             194:     72(ptr) AccessChain 27(data) 49 38
+             195:   20(ivec4) Load 194
+             196:   81(ivec3) VectorShuffle 195 195 0 1 2
+             197:   81(ivec3) GroupNonUniformIMul 34 Reduce 196
+             198:     72(ptr) AccessChain 27(data) 193 38
+             199:   20(ivec4) Load 198
+             200:   20(ivec4) VectorShuffle 199 197 4 5 6 3
+                              Store 198 200
+             201:      6(int) Load 8(invocation)
+             202:     72(ptr) AccessChain 27(data) 59 38
+             203:   20(ivec4) Load 202
+             204:   20(ivec4) GroupNonUniformIMul 34 Reduce 203
+             205:     72(ptr) AccessChain 27(data) 201 38
+                              Store 205 204
+             206:      6(int) Load 8(invocation)
+             207:     95(ptr) AccessChain 27(data) 29 49 30
+             208:      6(int) Load 207
+             209:      6(int) GroupNonUniformIMul 34 Reduce 208
+             210:     95(ptr) AccessChain 27(data) 206 49 30
+                              Store 210 209
+             211:      6(int) Load 8(invocation)
+             212:    102(ptr) AccessChain 27(data) 38 49
+             213:   21(ivec4) Load 212
+             214:  101(ivec2) VectorShuffle 213 213 0 1
+             215:  101(ivec2) GroupNonUniformIMul 34 Reduce 214
+             216:    102(ptr) AccessChain 27(data) 211 49
+             217:   21(ivec4) Load 216
+             218:   21(ivec4) VectorShuffle 217 215 4 5 2 3
+                              Store 216 218
+             219:      6(int) Load 8(invocation)
+             220:    102(ptr) AccessChain 27(data) 49 49
+             221:   21(ivec4) Load 220
+             222:  111(ivec3) VectorShuffle 221 221 0 1 2
+             223:  111(ivec3) GroupNonUniformIMul 34 Reduce 222
+             224:    102(ptr) AccessChain 27(data) 219 49
+             225:   21(ivec4) Load 224
+             226:   21(ivec4) VectorShuffle 225 223 4 5 6 3
+                              Store 224 226
+             227:      6(int) Load 8(invocation)
+             228:    102(ptr) AccessChain 27(data) 59 49
+             229:   21(ivec4) Load 228
+             230:   21(ivec4) GroupNonUniformIMul 34 Reduce 229
+             231:    102(ptr) AccessChain 27(data) 227 49
+                              Store 231 230
+             232:      6(int) Load 8(invocation)
+             233:    125(ptr) AccessChain 27(data) 29 59 30
+             234:22(float64_t) Load 233
+             235:22(float64_t) GroupNonUniformFMul 34 Reduce 234
+             236:    125(ptr) AccessChain 27(data) 232 59 30
+                              Store 236 235
+             237:      6(int) Load 8(invocation)
+             238:    132(ptr) AccessChain 27(data) 38 59
+             239: 23(f64vec4) Load 238
+             240:131(f64vec2) VectorShuffle 239 239 0 1
+             241:131(f64vec2) GroupNonUniformFMul 34 Reduce 240
+             242:    132(ptr) AccessChain 27(data) 237 59
+             243: 23(f64vec4) Load 242
+             244: 23(f64vec4) VectorShuffle 243 241 4 5 2 3
+                              Store 242 244
+             245:      6(int) Load 8(invocation)
+             246:    132(ptr) AccessChain 27(data) 49 59
+             247: 23(f64vec4) Load 246
+             248:141(f64vec3) VectorShuffle 247 247 0 1 2
+             249:141(f64vec3) GroupNonUniformFMul 34 Reduce 248
+             250:    132(ptr) AccessChain 27(data) 245 59
+             251: 23(f64vec4) Load 250
+             252: 23(f64vec4) VectorShuffle 251 249 4 5 6 3
+                              Store 250 252
+             253:      6(int) Load 8(invocation)
+             254:    132(ptr) AccessChain 27(data) 59 59
+             255: 23(f64vec4) Load 254
+             256: 23(f64vec4) GroupNonUniformFMul 34 Reduce 255
+             257:    132(ptr) AccessChain 27(data) 253 59
+                              Store 257 256
+             258:      6(int) Load 8(invocation)
+             259:     31(ptr) AccessChain 27(data) 29 29 30
+             260:   17(float) Load 259
+             261:   17(float) GroupNonUniformFMin 34 Reduce 260
+             262:     31(ptr) AccessChain 27(data) 258 29 30
+                              Store 262 261
+             263:      6(int) Load 8(invocation)
+             264:     40(ptr) AccessChain 27(data) 38 29
+             265:   18(fvec4) Load 264
+             266:   39(fvec2) VectorShuffle 265 265 0 1
+             267:   39(fvec2) GroupNonUniformFMin 34 Reduce 266
+             268:     40(ptr) AccessChain 27(data) 263 29
+             269:   18(fvec4) Load 268
+             270:   18(fvec4) VectorShuffle 269 267 4 5 2 3
+                              Store 268 270
+             271:      6(int) Load 8(invocation)
+             272:     40(ptr) AccessChain 27(data) 49 29
+             273:   18(fvec4) Load 272
+             274:   50(fvec3) VectorShuffle 273 273 0 1 2
+             275:   50(fvec3) GroupNonUniformFMin 34 Reduce 274
+             276:     40(ptr) AccessChain 27(data) 271 29
+             277:   18(fvec4) Load 276
+             278:   18(fvec4) VectorShuffle 277 275 4 5 6 3
+                              Store 276 278
+             279:      6(int) Load 8(invocation)
+             280:     40(ptr) AccessChain 27(data) 59 29
+             281:   18(fvec4) Load 280
+             282:   18(fvec4) GroupNonUniformFMin 34 Reduce 281
+             283:     40(ptr) AccessChain 27(data) 279 29
+                              Store 283 282
+             284:      6(int) Load 8(invocation)
+             285:     65(ptr) AccessChain 27(data) 29 38 30
+             286:     19(int) Load 285
+             287:     19(int) GroupNonUniformSMin 34 Reduce 286
+             288:     65(ptr) AccessChain 27(data) 284 38 30
+                              Store 288 287
+             289:      6(int) Load 8(invocation)
+             290:     72(ptr) AccessChain 27(data) 38 38
+             291:   20(ivec4) Load 290
+             292:   71(ivec2) VectorShuffle 291 291 0 1
+             293:   71(ivec2) GroupNonUniformSMin 34 Reduce 292
+             294:     72(ptr) AccessChain 27(data) 289 38
+             295:   20(ivec4) Load 294
+             296:   20(ivec4) VectorShuffle 295 293 4 5 2 3
+                              Store 294 296
+             297:      6(int) Load 8(invocation)
+             298:     72(ptr) AccessChain 27(data) 49 38
+             299:   20(ivec4) Load 298
+             300:   81(ivec3) VectorShuffle 299 299 0 1 2
+             301:   81(ivec3) GroupNonUniformSMin 34 Reduce 300
+             302:     72(ptr) AccessChain 27(data) 297 38
+             303:   20(ivec4) Load 302
+             304:   20(ivec4) VectorShuffle 303 301 4 5 6 3
+                              Store 302 304
+             305:      6(int) Load 8(invocation)
+             306:     72(ptr) AccessChain 27(data) 59 38
+             307:   20(ivec4) Load 306
+             308:   20(ivec4) GroupNonUniformSMin 34 Reduce 307
+             309:     72(ptr) AccessChain 27(data) 305 38
+                              Store 309 308
+             310:      6(int) Load 8(invocation)
+             311:     95(ptr) AccessChain 27(data) 29 49 30
+             312:      6(int) Load 311
+             313:      6(int) GroupNonUniformUMin 34 Reduce 312
+             314:     95(ptr) AccessChain 27(data) 310 49 30
+                              Store 314 313
+             315:      6(int) Load 8(invocation)
+             316:    102(ptr) AccessChain 27(data) 38 49
+             317:   21(ivec4) Load 316
+             318:  101(ivec2) VectorShuffle 317 317 0 1
+             319:  101(ivec2) GroupNonUniformUMin 34 Reduce 318
+             320:    102(ptr) AccessChain 27(data) 315 49
+             321:   21(ivec4) Load 320
+             322:   21(ivec4) VectorShuffle 321 319 4 5 2 3
+                              Store 320 322
+             323:      6(int) Load 8(invocation)
+             324:    102(ptr) AccessChain 27(data) 49 49
+             325:   21(ivec4) Load 324
+             326:  111(ivec3) VectorShuffle 325 325 0 1 2
+             327:  111(ivec3) GroupNonUniformUMin 34 Reduce 326
+             328:    102(ptr) AccessChain 27(data) 323 49
+             329:   21(ivec4) Load 328
+             330:   21(ivec4) VectorShuffle 329 327 4 5 6 3
+                              Store 328 330
+             331:      6(int) Load 8(invocation)
+             332:    102(ptr) AccessChain 27(data) 59 49
+             333:   21(ivec4) Load 332
+             334:   21(ivec4) GroupNonUniformUMin 34 Reduce 333
+             335:    102(ptr) AccessChain 27(data) 331 49
+                              Store 335 334
+             336:      6(int) Load 8(invocation)
+             337:    125(ptr) AccessChain 27(data) 29 59 30
+             338:22(float64_t) Load 337
+             339:22(float64_t) GroupNonUniformFMin 34 Reduce 338
+             340:    125(ptr) AccessChain 27(data) 336 59 30
+                              Store 340 339
+             341:      6(int) Load 8(invocation)
+             342:    132(ptr) AccessChain 27(data) 38 59
+             343: 23(f64vec4) Load 342
+             344:131(f64vec2) VectorShuffle 343 343 0 1
+             345:131(f64vec2) GroupNonUniformFMin 34 Reduce 344
+             346:    132(ptr) AccessChain 27(data) 341 59
+             347: 23(f64vec4) Load 346
+             348: 23(f64vec4) VectorShuffle 347 345 4 5 2 3
+                              Store 346 348
+             349:      6(int) Load 8(invocation)
+             350:    132(ptr) AccessChain 27(data) 49 59
+             351: 23(f64vec4) Load 350
+             352:141(f64vec3) VectorShuffle 351 351 0 1 2
+             353:141(f64vec3) GroupNonUniformFMin 34 Reduce 352
+             354:    132(ptr) AccessChain 27(data) 349 59
+             355: 23(f64vec4) Load 354
+             356: 23(f64vec4) VectorShuffle 355 353 4 5 6 3
+                              Store 354 356
+             357:      6(int) Load 8(invocation)
+             358:    132(ptr) AccessChain 27(data) 59 59
+             359: 23(f64vec4) Load 358
+             360: 23(f64vec4) GroupNonUniformFMin 34 Reduce 359
+             361:    132(ptr) AccessChain 27(data) 357 59
+                              Store 361 360
+             362:      6(int) Load 8(invocation)
+             363:     31(ptr) AccessChain 27(data) 29 29 30
+             364:   17(float) Load 363
+             365:   17(float) GroupNonUniformFMax 34 Reduce 364
+             366:     31(ptr) AccessChain 27(data) 362 29 30
+                              Store 366 365
+             367:      6(int) Load 8(invocation)
+             368:     40(ptr) AccessChain 27(data) 38 29
+             369:   18(fvec4) Load 368
+             370:   39(fvec2) VectorShuffle 369 369 0 1
+             371:   39(fvec2) GroupNonUniformFMax 34 Reduce 370
+             372:     40(ptr) AccessChain 27(data) 367 29
+             373:   18(fvec4) Load 372
+             374:   18(fvec4) VectorShuffle 373 371 4 5 2 3
+                              Store 372 374
+             375:      6(int) Load 8(invocation)
+             376:     40(ptr) AccessChain 27(data) 49 29
+             377:   18(fvec4) Load 376
+             378:   50(fvec3) VectorShuffle 377 377 0 1 2
+             379:   50(fvec3) GroupNonUniformFMax 34 Reduce 378
+             380:     40(ptr) AccessChain 27(data) 375 29
+             381:   18(fvec4) Load 380
+             382:   18(fvec4) VectorShuffle 381 379 4 5 6 3
+                              Store 380 382
+             383:      6(int) Load 8(invocation)
+             384:     40(ptr) AccessChain 27(data) 59 29
+             385:   18(fvec4) Load 384
+             386:   18(fvec4) GroupNonUniformFMax 34 Reduce 385
+             387:     40(ptr) AccessChain 27(data) 383 29
+                              Store 387 386
+             388:      6(int) Load 8(invocation)
+             389:     65(ptr) AccessChain 27(data) 29 38 30
+             390:     19(int) Load 389
+             391:     19(int) GroupNonUniformSMax 34 Reduce 390
+             392:     65(ptr) AccessChain 27(data) 388 38 30
+                              Store 392 391
+             393:      6(int) Load 8(invocation)
+             394:     72(ptr) AccessChain 27(data) 38 38
+             395:   20(ivec4) Load 394
+             396:   71(ivec2) VectorShuffle 395 395 0 1
+             397:   71(ivec2) GroupNonUniformSMax 34 Reduce 396
+             398:     72(ptr) AccessChain 27(data) 393 38
+             399:   20(ivec4) Load 398
+             400:   20(ivec4) VectorShuffle 399 397 4 5 2 3
+                              Store 398 400
+             401:      6(int) Load 8(invocation)
+             402:     72(ptr) AccessChain 27(data) 49 38
+             403:   20(ivec4) Load 402
+             404:   81(ivec3) VectorShuffle 403 403 0 1 2
+             405:   81(ivec3) GroupNonUniformSMax 34 Reduce 404
+             406:     72(ptr) AccessChain 27(data) 401 38
+             407:   20(ivec4) Load 406
+             408:   20(ivec4) VectorShuffle 407 405 4 5 6 3
+                              Store 406 408
+             409:      6(int) Load 8(invocation)
+             410:     72(ptr) AccessChain 27(data) 59 38
+             411:   20(ivec4) Load 410
+             412:   20(ivec4) GroupNonUniformSMax 34 Reduce 411
+             413:     72(ptr) AccessChain 27(data) 409 38
+                              Store 413 412
+             414:      6(int) Load 8(invocation)
+             415:     95(ptr) AccessChain 27(data) 29 49 30
+             416:      6(int) Load 415
+             417:      6(int) GroupNonUniformUMax 34 Reduce 416
+             418:     95(ptr) AccessChain 27(data) 414 49 30
+                              Store 418 417
+             419:      6(int) Load 8(invocation)
+             420:    102(ptr) AccessChain 27(data) 38 49
+             421:   21(ivec4) Load 420
+             422:  101(ivec2) VectorShuffle 421 421 0 1
+             423:  101(ivec2) GroupNonUniformUMax 34 Reduce 422
+             424:    102(ptr) AccessChain 27(data) 419 49
+             425:   21(ivec4) Load 424
+             426:   21(ivec4) VectorShuffle 425 423 4 5 2 3
+                              Store 424 426
+             427:      6(int) Load 8(invocation)
+             428:    102(ptr) AccessChain 27(data) 49 49
+             429:   21(ivec4) Load 428
+             430:  111(ivec3) VectorShuffle 429 429 0 1 2
+             431:  111(ivec3) GroupNonUniformUMax 34 Reduce 430
+             432:    102(ptr) AccessChain 27(data) 427 49
+             433:   21(ivec4) Load 432
+             434:   21(ivec4) VectorShuffle 433 431 4 5 6 3
+                              Store 432 434
+             435:      6(int) Load 8(invocation)
+             436:    102(ptr) AccessChain 27(data) 59 49
+             437:   21(ivec4) Load 436
+             438:   21(ivec4) GroupNonUniformUMax 34 Reduce 437
+             439:    102(ptr) AccessChain 27(data) 435 49
+                              Store 439 438
+             440:      6(int) Load 8(invocation)
+             441:    125(ptr) AccessChain 27(data) 29 59 30
+             442:22(float64_t) Load 441
+             443:22(float64_t) GroupNonUniformFMax 34 Reduce 442
+             444:    125(ptr) AccessChain 27(data) 440 59 30
+                              Store 444 443
+             445:      6(int) Load 8(invocation)
+             446:    132(ptr) AccessChain 27(data) 38 59
+             447: 23(f64vec4) Load 446
+             448:131(f64vec2) VectorShuffle 447 447 0 1
+             449:131(f64vec2) GroupNonUniformFMax 34 Reduce 448
+             450:    132(ptr) AccessChain 27(data) 445 59
+             451: 23(f64vec4) Load 450
+             452: 23(f64vec4) VectorShuffle 451 449 4 5 2 3
+                              Store 450 452
+             453:      6(int) Load 8(invocation)
+             454:    132(ptr) AccessChain 27(data) 49 59
+             455: 23(f64vec4) Load 454
+             456:141(f64vec3) VectorShuffle 455 455 0 1 2
+             457:141(f64vec3) GroupNonUniformFMax 34 Reduce 456
+             458:    132(ptr) AccessChain 27(data) 453 59
+             459: 23(f64vec4) Load 458
+             460: 23(f64vec4) VectorShuffle 459 457 4 5 6 3
+                              Store 458 460
+             461:      6(int) Load 8(invocation)
+             462:    132(ptr) AccessChain 27(data) 59 59
+             463: 23(f64vec4) Load 462
+             464: 23(f64vec4) GroupNonUniformFMax 34 Reduce 463
+             465:    132(ptr) AccessChain 27(data) 461 59
+                              Store 465 464
+             466:      6(int) Load 8(invocation)
+             467:     65(ptr) AccessChain 27(data) 29 38 30
+             468:     19(int) Load 467
+             469:     19(int) GroupNonUniformBitwiseAnd 34 Reduce 468
+             470:     65(ptr) AccessChain 27(data) 466 38 30
+                              Store 470 469
+             471:      6(int) Load 8(invocation)
+             472:     72(ptr) AccessChain 27(data) 38 38
+             473:   20(ivec4) Load 472
+             474:   71(ivec2) VectorShuffle 473 473 0 1
+             475:   71(ivec2) GroupNonUniformBitwiseAnd 34 Reduce 474
+             476:     72(ptr) AccessChain 27(data) 471 38
+             477:   20(ivec4) Load 476
+             478:   20(ivec4) VectorShuffle 477 475 4 5 2 3
+                              Store 476 478
+             479:      6(int) Load 8(invocation)
+             480:     72(ptr) AccessChain 27(data) 49 38
+             481:   20(ivec4) Load 480
+             482:   81(ivec3) VectorShuffle 481 481 0 1 2
+             483:   81(ivec3) GroupNonUniformBitwiseAnd 34 Reduce 482
+             484:     72(ptr) AccessChain 27(data) 479 38
+             485:   20(ivec4) Load 484
+             486:   20(ivec4) VectorShuffle 485 483 4 5 6 3
+                              Store 484 486
+             487:      6(int) Load 8(invocation)
+             488:     72(ptr) AccessChain 27(data) 59 38
+             489:   20(ivec4) Load 488
+             490:   20(ivec4) GroupNonUniformBitwiseAnd 34 Reduce 489
+             491:     72(ptr) AccessChain 27(data) 487 38
+                              Store 491 490
+             492:      6(int) Load 8(invocation)
+             493:     95(ptr) AccessChain 27(data) 29 49 30
+             494:      6(int) Load 493
+             495:      6(int) GroupNonUniformBitwiseAnd 34 Reduce 494
+             496:     95(ptr) AccessChain 27(data) 492 49 30
+                              Store 496 495
+             497:      6(int) Load 8(invocation)
+             498:    102(ptr) AccessChain 27(data) 38 49
+             499:   21(ivec4) Load 498
+             500:  101(ivec2) VectorShuffle 499 499 0 1
+             501:  101(ivec2) GroupNonUniformBitwiseAnd 34 Reduce 500
+             502:    102(ptr) AccessChain 27(data) 497 49
+             503:   21(ivec4) Load 502
+             504:   21(ivec4) VectorShuffle 503 501 4 5 2 3
+                              Store 502 504
+             505:      6(int) Load 8(invocation)
+             506:    102(ptr) AccessChain 27(data) 49 49
+             507:   21(ivec4) Load 506
+             508:  111(ivec3) VectorShuffle 507 507 0 1 2
+             509:  111(ivec3) GroupNonUniformBitwiseAnd 34 Reduce 508
+             510:    102(ptr) AccessChain 27(data) 505 49
+             511:   21(ivec4) Load 510
+             512:   21(ivec4) VectorShuffle 511 509 4 5 6 3
+                              Store 510 512
+             513:      6(int) Load 8(invocation)
+             514:    102(ptr) AccessChain 27(data) 59 49
+             515:   21(ivec4) Load 514
+             516:   21(ivec4) GroupNonUniformBitwiseAnd 34 Reduce 515
+             517:    102(ptr) AccessChain 27(data) 513 49
+                              Store 517 516
+             518:      6(int) Load 8(invocation)
+             519:     65(ptr) AccessChain 27(data) 29 38 30
+             520:     19(int) Load 519
+             522:   521(bool) SLessThan 520 29
+             523:   521(bool) GroupNonUniformLogicalAnd 34 Reduce 522
+             524:     19(int) Select 523 38 29
+             525:     65(ptr) AccessChain 27(data) 518 38 30
+                              Store 525 524
+             526:      6(int) Load 8(invocation)
+             527:     72(ptr) AccessChain 27(data) 38 38
+             528:   20(ivec4) Load 527
+             529:   71(ivec2) VectorShuffle 528 528 0 1
+             532:  531(bvec2) SLessThan 529 530
+             533:  531(bvec2) GroupNonUniformLogicalAnd 34 Reduce 532
+             535:   71(ivec2) Select 533 534 530
+             536:     72(ptr) AccessChain 27(data) 526 38
+             537:   20(ivec4) Load 536
+             538:   20(ivec4) VectorShuffle 537 535 4 5 2 3
+                              Store 536 538
+             539:      6(int) Load 8(invocation)
+             540:     72(ptr) AccessChain 27(data) 38 38
+             541:   20(ivec4) Load 540
+             542:   81(ivec3) VectorShuffle 541 541 0 1 2
+             545:  544(bvec3) SLessThan 542 543
+             546:  544(bvec3) GroupNonUniformLogicalAnd 34 Reduce 545
+             548:   81(ivec3) Select 546 547 543
+             549:     72(ptr) AccessChain 27(data) 539 38
+             550:   20(ivec4) Load 549
+             551:   20(ivec4) VectorShuffle 550 548 4 5 6 3
+                              Store 549 551
+             552:      6(int) Load 8(invocation)
+             553:     72(ptr) AccessChain 27(data) 38 38
+             554:   20(ivec4) Load 553
+             557:  556(bvec4) SLessThan 554 555
+             558:  556(bvec4) GroupNonUniformLogicalAnd 34 Reduce 557
+             560:   20(ivec4) Select 558 559 555
+             561:     72(ptr) AccessChain 27(data) 552 38
+                              Store 561 560
+             562:      6(int) Load 8(invocation)
+             563:     65(ptr) AccessChain 27(data) 29 38 30
+             564:     19(int) Load 563
+             565:     19(int) GroupNonUniformBitwiseOr 34 Reduce 564
+             566:     65(ptr) AccessChain 27(data) 562 38 30
+                              Store 566 565
+             567:      6(int) Load 8(invocation)
+             568:     72(ptr) AccessChain 27(data) 38 38
+             569:   20(ivec4) Load 568
+             570:   71(ivec2) VectorShuffle 569 569 0 1
+             571:   71(ivec2) GroupNonUniformBitwiseOr 34 Reduce 570
+             572:     72(ptr) AccessChain 27(data) 567 38
+             573:   20(ivec4) Load 572
+             574:   20(ivec4) VectorShuffle 573 571 4 5 2 3
+                              Store 572 574
+             575:      6(int) Load 8(invocation)
+             576:     72(ptr) AccessChain 27(data) 49 38
+             577:   20(ivec4) Load 576
+             578:   81(ivec3) VectorShuffle 577 577 0 1 2
+             579:   81(ivec3) GroupNonUniformBitwiseOr 34 Reduce 578
+             580:     72(ptr) AccessChain 27(data) 575 38
+             581:   20(ivec4) Load 580
+             582:   20(ivec4) VectorShuffle 581 579 4 5 6 3
+                              Store 580 582
+             583:      6(int) Load 8(invocation)
+             584:     72(ptr) AccessChain 27(data) 59 38
+             585:   20(ivec4) Load 584
+             586:   20(ivec4) GroupNonUniformBitwiseOr 34 Reduce 585
+             587:     72(ptr) AccessChain 27(data) 583 38
+                              Store 587 586
+             588:      6(int) Load 8(invocation)
+             589:     95(ptr) AccessChain 27(data) 29 49 30
+             590:      6(int) Load 589
+             591:      6(int) GroupNonUniformBitwiseOr 34 Reduce 590
+             592:     95(ptr) AccessChain 27(data) 588 49 30
+                              Store 592 591
+             593:      6(int) Load 8(invocation)
+             594:    102(ptr) AccessChain 27(data) 38 49
+             595:   21(ivec4) Load 594
+             596:  101(ivec2) VectorShuffle 595 595 0 1
+             597:  101(ivec2) GroupNonUniformBitwiseOr 34 Reduce 596
+             598:    102(ptr) AccessChain 27(data) 593 49
+             599:   21(ivec4) Load 598
+             600:   21(ivec4) VectorShuffle 599 597 4 5 2 3
+                              Store 598 600
+             601:      6(int) Load 8(invocation)
+             602:    102(ptr) AccessChain 27(data) 49 49
+             603:   21(ivec4) Load 602
+             604:  111(ivec3) VectorShuffle 603 603 0 1 2
+             605:  111(ivec3) GroupNonUniformBitwiseOr 34 Reduce 604
+             606:    102(ptr) AccessChain 27(data) 601 49
+             607:   21(ivec4) Load 606
+             608:   21(ivec4) VectorShuffle 607 605 4 5 6 3
+                              Store 606 608
+             609:      6(int) Load 8(invocation)
+             610:    102(ptr) AccessChain 27(data) 59 49
+             611:   21(ivec4) Load 610
+             612:   21(ivec4) GroupNonUniformBitwiseOr 34 Reduce 611
+             613:    102(ptr) AccessChain 27(data) 609 49
+                              Store 613 612
+             614:      6(int) Load 8(invocation)
+             615:     65(ptr) AccessChain 27(data) 29 38 30
+             616:     19(int) Load 615
+             617:   521(bool) SLessThan 616 29
+             618:   521(bool) GroupNonUniformLogicalOr 34 Reduce 617
+             619:     19(int) Select 618 38 29
+             620:     65(ptr) AccessChain 27(data) 614 38 30
+                              Store 620 619
+             621:      6(int) Load 8(invocation)
+             622:     72(ptr) AccessChain 27(data) 38 38
+             623:   20(ivec4) Load 622
+             624:   71(ivec2) VectorShuffle 623 623 0 1
+             625:  531(bvec2) SLessThan 624 530
+             626:  531(bvec2) GroupNonUniformLogicalOr 34 Reduce 625
+             627:   71(ivec2) Select 626 534 530
+             628:     72(ptr) AccessChain 27(data) 621 38
+             629:   20(ivec4) Load 628
+             630:   20(ivec4) VectorShuffle 629 627 4 5 2 3
+                              Store 628 630
+             631:      6(int) Load 8(invocation)
+             632:     72(ptr) AccessChain 27(data) 38 38
+             633:   20(ivec4) Load 632
+             634:   81(ivec3) VectorShuffle 633 633 0 1 2
+             635:  544(bvec3) SLessThan 634 543
+             636:  544(bvec3) GroupNonUniformLogicalOr 34 Reduce 635
+             637:   81(ivec3) Select 636 547 543
+             638:     72(ptr) AccessChain 27(data) 631 38
+             639:   20(ivec4) Load 638
+             640:   20(ivec4) VectorShuffle 639 637 4 5 6 3
+                              Store 638 640
+             641:      6(int) Load 8(invocation)
+             642:     72(ptr) AccessChain 27(data) 38 38
+             643:   20(ivec4) Load 642
+             644:  556(bvec4) SLessThan 643 555
+             645:  556(bvec4) GroupNonUniformLogicalOr 34 Reduce 644
+             646:   20(ivec4) Select 645 559 555
+             647:     72(ptr) AccessChain 27(data) 641 38
+                              Store 647 646
+             648:      6(int) Load 8(invocation)
+             649:     65(ptr) AccessChain 27(data) 29 38 30
+             650:     19(int) Load 649
+             651:     19(int) GroupNonUniformBitwiseXor 34 Reduce 650
+             652:     65(ptr) AccessChain 27(data) 648 38 30
+                              Store 652 651
+             653:      6(int) Load 8(invocation)
+             654:     72(ptr) AccessChain 27(data) 38 38
+             655:   20(ivec4) Load 654
+             656:   71(ivec2) VectorShuffle 655 655 0 1
+             657:   71(ivec2) GroupNonUniformBitwiseXor 34 Reduce 656
+             658:     72(ptr) AccessChain 27(data) 653 38
+             659:   20(ivec4) Load 658
+             660:   20(ivec4) VectorShuffle 659 657 4 5 2 3
+                              Store 658 660
+             661:      6(int) Load 8(invocation)
+             662:     72(ptr) AccessChain 27(data) 49 38
+             663:   20(ivec4) Load 662
+             664:   81(ivec3) VectorShuffle 663 663 0 1 2
+             665:   81(ivec3) GroupNonUniformBitwiseXor 34 Reduce 664
+             666:     72(ptr) AccessChain 27(data) 661 38
+             667:   20(ivec4) Load 666
+             668:   20(ivec4) VectorShuffle 667 665 4 5 6 3
+                              Store 666 668
+             669:      6(int) Load 8(invocation)
+             670:     72(ptr) AccessChain 27(data) 59 38
+             671:   20(ivec4) Load 670
+             672:   20(ivec4) GroupNonUniformBitwiseXor 34 Reduce 671
+             673:     72(ptr) AccessChain 27(data) 669 38
+                              Store 673 672
+             674:      6(int) Load 8(invocation)
+             675:     95(ptr) AccessChain 27(data) 29 49 30
+             676:      6(int) Load 675
+             677:      6(int) GroupNonUniformBitwiseXor 34 Reduce 676
+             678:     95(ptr) AccessChain 27(data) 674 49 30
+                              Store 678 677
+             679:      6(int) Load 8(invocation)
+             680:    102(ptr) AccessChain 27(data) 38 49
+             681:   21(ivec4) Load 680
+             682:  101(ivec2) VectorShuffle 681 681 0 1
+             683:  101(ivec2) GroupNonUniformBitwiseXor 34 Reduce 682
+             684:    102(ptr) AccessChain 27(data) 679 49
+             685:   21(ivec4) Load 684
+             686:   21(ivec4) VectorShuffle 685 683 4 5 2 3
+                              Store 684 686
+             687:      6(int) Load 8(invocation)
+             688:    102(ptr) AccessChain 27(data) 49 49
+             689:   21(ivec4) Load 688
+             690:  111(ivec3) VectorShuffle 689 689 0 1 2
+             691:  111(ivec3) GroupNonUniformBitwiseXor 34 Reduce 690
+             692:    102(ptr) AccessChain 27(data) 687 49
+             693:   21(ivec4) Load 692
+             694:   21(ivec4) VectorShuffle 693 691 4 5 6 3
+                              Store 692 694
+             695:      6(int) Load 8(invocation)
+             696:    102(ptr) AccessChain 27(data) 59 49
+             697:   21(ivec4) Load 696
+             698:   21(ivec4) GroupNonUniformBitwiseXor 34 Reduce 697
+             699:    102(ptr) AccessChain 27(data) 695 49
+                              Store 699 698
+             700:      6(int) Load 8(invocation)
+             701:     65(ptr) AccessChain 27(data) 29 38 30
+             702:     19(int) Load 701
+             703:   521(bool) SLessThan 702 29
+             704:   521(bool) GroupNonUniformLogicalXor 34 Reduce 703
+             705:     19(int) Select 704 38 29
+             706:     65(ptr) AccessChain 27(data) 700 38 30
+                              Store 706 705
+             707:      6(int) Load 8(invocation)
+             708:     72(ptr) AccessChain 27(data) 38 38
+             709:   20(ivec4) Load 708
+             710:   71(ivec2) VectorShuffle 709 709 0 1
+             711:  531(bvec2) SLessThan 710 530
+             712:  531(bvec2) GroupNonUniformLogicalXor 34 Reduce 711
+             713:   71(ivec2) Select 712 534 530
+             714:     72(ptr) AccessChain 27(data) 707 38
+             715:   20(ivec4) Load 714
+             716:   20(ivec4) VectorShuffle 715 713 4 5 2 3
+                              Store 714 716
+             717:      6(int) Load 8(invocation)
+             718:     72(ptr) AccessChain 27(data) 38 38
+             719:   20(ivec4) Load 718
+             720:   81(ivec3) VectorShuffle 719 719 0 1 2
+             721:  544(bvec3) SLessThan 720 543
+             722:  544(bvec3) GroupNonUniformLogicalXor 34 Reduce 721
+             723:   81(ivec3) Select 722 547 543
+             724:     72(ptr) AccessChain 27(data) 717 38
+             725:   20(ivec4) Load 724
+             726:   20(ivec4) VectorShuffle 725 723 4 5 6 3
+                              Store 724 726
+             727:      6(int) Load 8(invocation)
+             728:     72(ptr) AccessChain 27(data) 38 38
+             729:   20(ivec4) Load 728
+             730:  556(bvec4) SLessThan 729 555
+             731:  556(bvec4) GroupNonUniformLogicalXor 34 Reduce 730
+             732:   20(ivec4) Select 731 559 555
+             733:     72(ptr) AccessChain 27(data) 727 38
+                              Store 733 732
+             734:      6(int) Load 8(invocation)
+             735:     31(ptr) AccessChain 27(data) 29 29 30
+             736:   17(float) Load 735
+             737:   17(float) GroupNonUniformFAdd 34 InclusiveScan 736
+             738:     31(ptr) AccessChain 27(data) 734 29 30
+                              Store 738 737
+             739:      6(int) Load 8(invocation)
+             740:     40(ptr) AccessChain 27(data) 38 29
+             741:   18(fvec4) Load 740
+             742:   39(fvec2) VectorShuffle 741 741 0 1
+             743:   39(fvec2) GroupNonUniformFAdd 34 InclusiveScan 742
+             744:     40(ptr) AccessChain 27(data) 739 29
+             745:   18(fvec4) Load 744
+             746:   18(fvec4) VectorShuffle 745 743 4 5 2 3
+                              Store 744 746
+             747:      6(int) Load 8(invocation)
+             748:     40(ptr) AccessChain 27(data) 49 29
+             749:   18(fvec4) Load 748
+             750:   50(fvec3) VectorShuffle 749 749 0 1 2
+             751:   50(fvec3) GroupNonUniformFAdd 34 InclusiveScan 750
+             752:     40(ptr) AccessChain 27(data) 747 29
+             753:   18(fvec4) Load 752
+             754:   18(fvec4) VectorShuffle 753 751 4 5 6 3
+                              Store 752 754
+             755:      6(int) Load 8(invocation)
+             756:     40(ptr) AccessChain 27(data) 59 29
+             757:   18(fvec4) Load 756
+             758:   18(fvec4) GroupNonUniformFAdd 34 InclusiveScan 757
+             759:     40(ptr) AccessChain 27(data) 755 29
+                              Store 759 758
+             760:      6(int) Load 8(invocation)
+             761:     65(ptr) AccessChain 27(data) 29 38 30
+             762:     19(int) Load 761
+             763:     19(int) GroupNonUniformIAdd 34 InclusiveScan 762
+             764:     65(ptr) AccessChain 27(data) 760 38 30
+                              Store 764 763
+             765:      6(int) Load 8(invocation)
+             766:     72(ptr) AccessChain 27(data) 38 38
+             767:   20(ivec4) Load 766
+             768:   71(ivec2) VectorShuffle 767 767 0 1
+             769:   71(ivec2) GroupNonUniformIAdd 34 InclusiveScan 768
+             770:     72(ptr) AccessChain 27(data) 765 38
+             771:   20(ivec4) Load 770
+             772:   20(ivec4) VectorShuffle 771 769 4 5 2 3
+                              Store 770 772
+             773:      6(int) Load 8(invocation)
+             774:     72(ptr) AccessChain 27(data) 49 38
+             775:   20(ivec4) Load 774
+             776:   81(ivec3) VectorShuffle 775 775 0 1 2
+             777:   81(ivec3) GroupNonUniformIAdd 34 InclusiveScan 776
+             778:     72(ptr) AccessChain 27(data) 773 38
+             779:   20(ivec4) Load 778
+             780:   20(ivec4) VectorShuffle 779 777 4 5 6 3
+                              Store 778 780
+             781:      6(int) Load 8(invocation)
+             782:     72(ptr) AccessChain 27(data) 59 38
+             783:   20(ivec4) Load 782
+             784:   20(ivec4) GroupNonUniformIAdd 34 InclusiveScan 783
+             785:     72(ptr) AccessChain 27(data) 781 38
+                              Store 785 784
+             786:      6(int) Load 8(invocation)
+             787:     95(ptr) AccessChain 27(data) 29 49 30
+             788:      6(int) Load 787
+             789:      6(int) GroupNonUniformIAdd 34 InclusiveScan 788
+             790:     95(ptr) AccessChain 27(data) 786 49 30
+                              Store 790 789
+             791:      6(int) Load 8(invocation)
+             792:    102(ptr) AccessChain 27(data) 38 49
+             793:   21(ivec4) Load 792
+             794:  101(ivec2) VectorShuffle 793 793 0 1
+             795:  101(ivec2) GroupNonUniformIAdd 34 InclusiveScan 794
+             796:    102(ptr) AccessChain 27(data) 791 49
+             797:   21(ivec4) Load 796
+             798:   21(ivec4) VectorShuffle 797 795 4 5 2 3
+                              Store 796 798
+             799:      6(int) Load 8(invocation)
+             800:    102(ptr) AccessChain 27(data) 49 49
+             801:   21(ivec4) Load 800
+             802:  111(ivec3) VectorShuffle 801 801 0 1 2
+             803:  111(ivec3) GroupNonUniformIAdd 34 InclusiveScan 802
+             804:    102(ptr) AccessChain 27(data) 799 49
+             805:   21(ivec4) Load 804
+             806:   21(ivec4) VectorShuffle 805 803 4 5 6 3
+                              Store 804 806
+             807:      6(int) Load 8(invocation)
+             808:    102(ptr) AccessChain 27(data) 59 49
+             809:   21(ivec4) Load 808
+             810:   21(ivec4) GroupNonUniformIAdd 34 InclusiveScan 809
+             811:    102(ptr) AccessChain 27(data) 807 49
+                              Store 811 810
+             812:      6(int) Load 8(invocation)
+             813:    125(ptr) AccessChain 27(data) 29 59 30
+             814:22(float64_t) Load 813
+             815:22(float64_t) GroupNonUniformFAdd 34 InclusiveScan 814
+             816:    125(ptr) AccessChain 27(data) 812 59 30
+                              Store 816 815
+             817:      6(int) Load 8(invocation)
+             818:    132(ptr) AccessChain 27(data) 38 59
+             819: 23(f64vec4) Load 818
+             820:131(f64vec2) VectorShuffle 819 819 0 1
+             821:131(f64vec2) GroupNonUniformFAdd 34 InclusiveScan 820
+             822:    132(ptr) AccessChain 27(data) 817 59
+             823: 23(f64vec4) Load 822
+             824: 23(f64vec4) VectorShuffle 823 821 4 5 2 3
+                              Store 822 824
+             825:      6(int) Load 8(invocation)
+             826:    132(ptr) AccessChain 27(data) 49 59
+             827: 23(f64vec4) Load 826
+             828:141(f64vec3) VectorShuffle 827 827 0 1 2
+             829:141(f64vec3) GroupNonUniformFAdd 34 InclusiveScan 828
+             830:    132(ptr) AccessChain 27(data) 825 59
+             831: 23(f64vec4) Load 830
+             832: 23(f64vec4) VectorShuffle 831 829 4 5 6 3
+                              Store 830 832
+             833:      6(int) Load 8(invocation)
+             834:    132(ptr) AccessChain 27(data) 59 59
+             835: 23(f64vec4) Load 834
+             836: 23(f64vec4) GroupNonUniformFAdd 34 InclusiveScan 835
+             837:    132(ptr) AccessChain 27(data) 833 59
+                              Store 837 836
+             838:      6(int) Load 8(invocation)
+             839:     31(ptr) AccessChain 27(data) 29 29 30
+             840:   17(float) Load 839
+             841:   17(float) GroupNonUniformFMul 34 InclusiveScan 840
+             842:     31(ptr) AccessChain 27(data) 838 29 30
+                              Store 842 841
+             843:      6(int) Load 8(invocation)
+             844:     40(ptr) AccessChain 27(data) 38 29
+             845:   18(fvec4) Load 844
+             846:   39(fvec2) VectorShuffle 845 845 0 1
+             847:   39(fvec2) GroupNonUniformFMul 34 InclusiveScan 846
+             848:     40(ptr) AccessChain 27(data) 843 29
+             849:   18(fvec4) Load 848
+             850:   18(fvec4) VectorShuffle 849 847 4 5 2 3
+                              Store 848 850
+             851:      6(int) Load 8(invocation)
+             852:     40(ptr) AccessChain 27(data) 49 29
+             853:   18(fvec4) Load 852
+             854:   50(fvec3) VectorShuffle 853 853 0 1 2
+             855:   50(fvec3) GroupNonUniformFMul 34 InclusiveScan 854
+             856:     40(ptr) AccessChain 27(data) 851 29
+             857:   18(fvec4) Load 856
+             858:   18(fvec4) VectorShuffle 857 855 4 5 6 3
+                              Store 856 858
+             859:      6(int) Load 8(invocation)
+             860:     40(ptr) AccessChain 27(data) 59 29
+             861:   18(fvec4) Load 860
+             862:   18(fvec4) GroupNonUniformFMul 34 InclusiveScan 861
+             863:     40(ptr) AccessChain 27(data) 859 29
+                              Store 863 862
+             864:      6(int) Load 8(invocation)
+             865:     65(ptr) AccessChain 27(data) 29 38 30
+             866:     19(int) Load 865
+             867:     19(int) GroupNonUniformIMul 34 InclusiveScan 866
+             868:     65(ptr) AccessChain 27(data) 864 38 30
+                              Store 868 867
+             869:      6(int) Load 8(invocation)
+             870:     72(ptr) AccessChain 27(data) 38 38
+             871:   20(ivec4) Load 870
+             872:   71(ivec2) VectorShuffle 871 871 0 1
+             873:   71(ivec2) GroupNonUniformIMul 34 InclusiveScan 872
+             874:     72(ptr) AccessChain 27(data) 869 38
+             875:   20(ivec4) Load 874
+             876:   20(ivec4) VectorShuffle 875 873 4 5 2 3
+                              Store 874 876
+             877:      6(int) Load 8(invocation)
+             878:     72(ptr) AccessChain 27(data) 49 38
+             879:   20(ivec4) Load 878
+             880:   81(ivec3) VectorShuffle 879 879 0 1 2
+             881:   81(ivec3) GroupNonUniformIMul 34 InclusiveScan 880
+             882:     72(ptr) AccessChain 27(data) 877 38
+             883:   20(ivec4) Load 882
+             884:   20(ivec4) VectorShuffle 883 881 4 5 6 3
+                              Store 882 884
+             885:      6(int) Load 8(invocation)
+             886:     72(ptr) AccessChain 27(data) 59 38
+             887:   20(ivec4) Load 886
+             888:   20(ivec4) GroupNonUniformIMul 34 InclusiveScan 887
+             889:     72(ptr) AccessChain 27(data) 885 38
+                              Store 889 888
+             890:      6(int) Load 8(invocation)
+             891:     95(ptr) AccessChain 27(data) 29 49 30
+             892:      6(int) Load 891
+             893:      6(int) GroupNonUniformIMul 34 InclusiveScan 892
+             894:     95(ptr) AccessChain 27(data) 890 49 30
+                              Store 894 893
+             895:      6(int) Load 8(invocation)
+             896:    102(ptr) AccessChain 27(data) 38 49
+             897:   21(ivec4) Load 896
+             898:  101(ivec2) VectorShuffle 897 897 0 1
+             899:  101(ivec2) GroupNonUniformIMul 34 InclusiveScan 898
+             900:    102(ptr) AccessChain 27(data) 895 49
+             901:   21(ivec4) Load 900
+             902:   21(ivec4) VectorShuffle 901 899 4 5 2 3
+                              Store 900 902
+             903:      6(int) Load 8(invocation)
+             904:    102(ptr) AccessChain 27(data) 49 49
+             905:   21(ivec4) Load 904
+             906:  111(ivec3) VectorShuffle 905 905 0 1 2
+             907:  111(ivec3) GroupNonUniformIMul 34 InclusiveScan 906
+             908:    102(ptr) AccessChain 27(data) 903 49
+             909:   21(ivec4) Load 908
+             910:   21(ivec4) VectorShuffle 909 907 4 5 6 3
+                              Store 908 910
+             911:      6(int) Load 8(invocation)
+             912:    102(ptr) AccessChain 27(data) 59 49
+             913:   21(ivec4) Load 912
+             914:   21(ivec4) GroupNonUniformIMul 34 InclusiveScan 913
+             915:    102(ptr) AccessChain 27(data) 911 49
+                              Store 915 914
+             916:      6(int) Load 8(invocation)
+             917:    125(ptr) AccessChain 27(data) 29 59 30
+             918:22(float64_t) Load 917
+             919:22(float64_t) GroupNonUniformFMul 34 InclusiveScan 918
+             920:    125(ptr) AccessChain 27(data) 916 59 30
+                              Store 920 919
+             921:      6(int) Load 8(invocation)
+             922:    132(ptr) AccessChain 27(data) 38 59
+             923: 23(f64vec4) Load 922
+             924:131(f64vec2) VectorShuffle 923 923 0 1
+             925:131(f64vec2) GroupNonUniformFMul 34 InclusiveScan 924
+             926:    132(ptr) AccessChain 27(data) 921 59
+             927: 23(f64vec4) Load 926
+             928: 23(f64vec4) VectorShuffle 927 925 4 5 2 3
+                              Store 926 928
+             929:      6(int) Load 8(invocation)
+             930:    132(ptr) AccessChain 27(data) 49 59
+             931: 23(f64vec4) Load 930
+             932:141(f64vec3) VectorShuffle 931 931 0 1 2
+             933:141(f64vec3) GroupNonUniformFMul 34 InclusiveScan 932
+             934:    132(ptr) AccessChain 27(data) 929 59
+             935: 23(f64vec4) Load 934
+             936: 23(f64vec4) VectorShuffle 935 933 4 5 6 3
+                              Store 934 936
+             937:      6(int) Load 8(invocation)
+             938:    132(ptr) AccessChain 27(data) 59 59
+             939: 23(f64vec4) Load 938
+             940: 23(f64vec4) GroupNonUniformFMul 34 InclusiveScan 939
+             941:    132(ptr) AccessChain 27(data) 937 59
+                              Store 941 940
+             942:      6(int) Load 8(invocation)
+             943:     31(ptr) AccessChain 27(data) 29 29 30
+             944:   17(float) Load 943
+             945:   17(float) GroupNonUniformFMin 34 InclusiveScan 944
+             946:     31(ptr) AccessChain 27(data) 942 29 30
+                              Store 946 945
+             947:      6(int) Load 8(invocation)
+             948:     40(ptr) AccessChain 27(data) 38 29
+             949:   18(fvec4) Load 948
+             950:   39(fvec2) VectorShuffle 949 949 0 1
+             951:   39(fvec2) GroupNonUniformFMin 34 InclusiveScan 950
+             952:     40(ptr) AccessChain 27(data) 947 29
+             953:   18(fvec4) Load 952
+             954:   18(fvec4) VectorShuffle 953 951 4 5 2 3
+                              Store 952 954
+             955:      6(int) Load 8(invocation)
+             956:     40(ptr) AccessChain 27(data) 49 29
+             957:   18(fvec4) Load 956
+             958:   50(fvec3) VectorShuffle 957 957 0 1 2
+             959:   50(fvec3) GroupNonUniformFMin 34 InclusiveScan 958
+             960:     40(ptr) AccessChain 27(data) 955 29
+             961:   18(fvec4) Load 960
+             962:   18(fvec4) VectorShuffle 961 959 4 5 6 3
+                              Store 960 962
+             963:      6(int) Load 8(invocation)
+             964:     40(ptr) AccessChain 27(data) 59 29
+             965:   18(fvec4) Load 964
+             966:   18(fvec4) GroupNonUniformFMin 34 InclusiveScan 965
+             967:     40(ptr) AccessChain 27(data) 963 29
+                              Store 967 966
+             968:      6(int) Load 8(invocation)
+             969:     65(ptr) AccessChain 27(data) 29 38 30
+             970:     19(int) Load 969
+             971:     19(int) GroupNonUniformSMin 34 InclusiveScan 970
+             972:     65(ptr) AccessChain 27(data) 968 38 30
+                              Store 972 971
+             973:      6(int) Load 8(invocation)
+             974:     72(ptr) AccessChain 27(data) 38 38
+             975:   20(ivec4) Load 974
+             976:   71(ivec2) VectorShuffle 975 975 0 1
+             977:   71(ivec2) GroupNonUniformSMin 34 InclusiveScan 976
+             978:     72(ptr) AccessChain 27(data) 973 38
+             979:   20(ivec4) Load 978
+             980:   20(ivec4) VectorShuffle 979 977 4 5 2 3
+                              Store 978 980
+             981:      6(int) Load 8(invocation)
+             982:     72(ptr) AccessChain 27(data) 49 38
+             983:   20(ivec4) Load 982
+             984:   81(ivec3) VectorShuffle 983 983 0 1 2
+             985:   81(ivec3) GroupNonUniformSMin 34 InclusiveScan 984
+             986:     72(ptr) AccessChain 27(data) 981 38
+             987:   20(ivec4) Load 986
+             988:   20(ivec4) VectorShuffle 987 985 4 5 6 3
+                              Store 986 988
+             989:      6(int) Load 8(invocation)
+             990:     72(ptr) AccessChain 27(data) 59 38
+             991:   20(ivec4) Load 990
+             992:   20(ivec4) GroupNonUniformSMin 34 InclusiveScan 991
+             993:     72(ptr) AccessChain 27(data) 989 38
+                              Store 993 992
+             994:      6(int) Load 8(invocation)
+             995:     95(ptr) AccessChain 27(data) 29 49 30
+             996:      6(int) Load 995
+             997:      6(int) GroupNonUniformUMin 34 InclusiveScan 996
+             998:     95(ptr) AccessChain 27(data) 994 49 30
+                              Store 998 997
+             999:      6(int) Load 8(invocation)
+            1000:    102(ptr) AccessChain 27(data) 38 49
+            1001:   21(ivec4) Load 1000
+            1002:  101(ivec2) VectorShuffle 1001 1001 0 1
+            1003:  101(ivec2) GroupNonUniformUMin 34 InclusiveScan 1002
+            1004:    102(ptr) AccessChain 27(data) 999 49
+            1005:   21(ivec4) Load 1004
+            1006:   21(ivec4) VectorShuffle 1005 1003 4 5 2 3
+                              Store 1004 1006
+            1007:      6(int) Load 8(invocation)
+            1008:    102(ptr) AccessChain 27(data) 49 49
+            1009:   21(ivec4) Load 1008
+            1010:  111(ivec3) VectorShuffle 1009 1009 0 1 2
+            1011:  111(ivec3) GroupNonUniformUMin 34 InclusiveScan 1010
+            1012:    102(ptr) AccessChain 27(data) 1007 49
+            1013:   21(ivec4) Load 1012
+            1014:   21(ivec4) VectorShuffle 1013 1011 4 5 6 3
+                              Store 1012 1014
+            1015:      6(int) Load 8(invocation)
+            1016:    102(ptr) AccessChain 27(data) 59 49
+            1017:   21(ivec4) Load 1016
+            1018:   21(ivec4) GroupNonUniformUMin 34 InclusiveScan 1017
+            1019:    102(ptr) AccessChain 27(data) 1015 49
+                              Store 1019 1018
+            1020:      6(int) Load 8(invocation)
+            1021:    125(ptr) AccessChain 27(data) 29 59 30
+            1022:22(float64_t) Load 1021
+            1023:22(float64_t) GroupNonUniformFMin 34 InclusiveScan 1022
+            1024:    125(ptr) AccessChain 27(data) 1020 59 30
+                              Store 1024 1023
+            1025:      6(int) Load 8(invocation)
+            1026:    132(ptr) AccessChain 27(data) 38 59
+            1027: 23(f64vec4) Load 1026
+            1028:131(f64vec2) VectorShuffle 1027 1027 0 1
+            1029:131(f64vec2) GroupNonUniformFMin 34 InclusiveScan 1028
+            1030:    132(ptr) AccessChain 27(data) 1025 59
+            1031: 23(f64vec4) Load 1030
+            1032: 23(f64vec4) VectorShuffle 1031 1029 4 5 2 3
+                              Store 1030 1032
+            1033:      6(int) Load 8(invocation)
+            1034:    132(ptr) AccessChain 27(data) 49 59
+            1035: 23(f64vec4) Load 1034
+            1036:141(f64vec3) VectorShuffle 1035 1035 0 1 2
+            1037:141(f64vec3) GroupNonUniformFMin 34 InclusiveScan 1036
+            1038:    132(ptr) AccessChain 27(data) 1033 59
+            1039: 23(f64vec4) Load 1038
+            1040: 23(f64vec4) VectorShuffle 1039 1037 4 5 6 3
+                              Store 1038 1040
+            1041:      6(int) Load 8(invocation)
+            1042:    132(ptr) AccessChain 27(data) 59 59
+            1043: 23(f64vec4) Load 1042
+            1044: 23(f64vec4) GroupNonUniformFMin 34 InclusiveScan 1043
+            1045:    132(ptr) AccessChain 27(data) 1041 59
+                              Store 1045 1044
+            1046:      6(int) Load 8(invocation)
+            1047:     31(ptr) AccessChain 27(data) 29 29 30
+            1048:   17(float) Load 1047
+            1049:   17(float) GroupNonUniformFMax 34 InclusiveScan 1048
+            1050:     31(ptr) AccessChain 27(data) 1046 29 30
+                              Store 1050 1049
+            1051:      6(int) Load 8(invocation)
+            1052:     40(ptr) AccessChain 27(data) 38 29
+            1053:   18(fvec4) Load 1052
+            1054:   39(fvec2) VectorShuffle 1053 1053 0 1
+            1055:   39(fvec2) GroupNonUniformFMax 34 InclusiveScan 1054
+            1056:     40(ptr) AccessChain 27(data) 1051 29
+            1057:   18(fvec4) Load 1056
+            1058:   18(fvec4) VectorShuffle 1057 1055 4 5 2 3
+                              Store 1056 1058
+            1059:      6(int) Load 8(invocation)
+            1060:     40(ptr) AccessChain 27(data) 49 29
+            1061:   18(fvec4) Load 1060
+            1062:   50(fvec3) VectorShuffle 1061 1061 0 1 2
+            1063:   50(fvec3) GroupNonUniformFMax 34 InclusiveScan 1062
+            1064:     40(ptr) AccessChain 27(data) 1059 29
+            1065:   18(fvec4) Load 1064
+            1066:   18(fvec4) VectorShuffle 1065 1063 4 5 6 3
+                              Store 1064 1066
+            1067:      6(int) Load 8(invocation)
+            1068:     40(ptr) AccessChain 27(data) 59 29
+            1069:   18(fvec4) Load 1068
+            1070:   18(fvec4) GroupNonUniformFMax 34 InclusiveScan 1069
+            1071:     40(ptr) AccessChain 27(data) 1067 29
+                              Store 1071 1070
+            1072:      6(int) Load 8(invocation)
+            1073:     65(ptr) AccessChain 27(data) 29 38 30
+            1074:     19(int) Load 1073
+            1075:     19(int) GroupNonUniformSMax 34 InclusiveScan 1074
+            1076:     65(ptr) AccessChain 27(data) 1072 38 30
+                              Store 1076 1075
+            1077:      6(int) Load 8(invocation)
+            1078:     72(ptr) AccessChain 27(data) 38 38
+            1079:   20(ivec4) Load 1078
+            1080:   71(ivec2) VectorShuffle 1079 1079 0 1
+            1081:   71(ivec2) GroupNonUniformSMax 34 InclusiveScan 1080
+            1082:     72(ptr) AccessChain 27(data) 1077 38
+            1083:   20(ivec4) Load 1082
+            1084:   20(ivec4) VectorShuffle 1083 1081 4 5 2 3
+                              Store 1082 1084
+            1085:      6(int) Load 8(invocation)
+            1086:     72(ptr) AccessChain 27(data) 49 38
+            1087:   20(ivec4) Load 1086
+            1088:   81(ivec3) VectorShuffle 1087 1087 0 1 2
+            1089:   81(ivec3) GroupNonUniformSMax 34 InclusiveScan 1088
+            1090:     72(ptr) AccessChain 27(data) 1085 38
+            1091:   20(ivec4) Load 1090
+            1092:   20(ivec4) VectorShuffle 1091 1089 4 5 6 3
+                              Store 1090 1092
+            1093:      6(int) Load 8(invocation)
+            1094:     72(ptr) AccessChain 27(data) 59 38
+            1095:   20(ivec4) Load 1094
+            1096:   20(ivec4) GroupNonUniformSMax 34 InclusiveScan 1095
+            1097:     72(ptr) AccessChain 27(data) 1093 38
+                              Store 1097 1096
+            1098:      6(int) Load 8(invocation)
+            1099:     95(ptr) AccessChain 27(data) 29 49 30
+            1100:      6(int) Load 1099
+            1101:      6(int) GroupNonUniformUMax 34 InclusiveScan 1100
+            1102:     95(ptr) AccessChain 27(data) 1098 49 30
+                              Store 1102 1101
+            1103:      6(int) Load 8(invocation)
+            1104:    102(ptr) AccessChain 27(data) 38 49
+            1105:   21(ivec4) Load 1104
+            1106:  101(ivec2) VectorShuffle 1105 1105 0 1
+            1107:  101(ivec2) GroupNonUniformUMax 34 InclusiveScan 1106
+            1108:    102(ptr) AccessChain 27(data) 1103 49
+            1109:   21(ivec4) Load 1108
+            1110:   21(ivec4) VectorShuffle 1109 1107 4 5 2 3
+                              Store 1108 1110
+            1111:      6(int) Load 8(invocation)
+            1112:    102(ptr) AccessChain 27(data) 49 49
+            1113:   21(ivec4) Load 1112
+            1114:  111(ivec3) VectorShuffle 1113 1113 0 1 2
+            1115:  111(ivec3) GroupNonUniformUMax 34 InclusiveScan 1114
+            1116:    102(ptr) AccessChain 27(data) 1111 49
+            1117:   21(ivec4) Load 1116
+            1118:   21(ivec4) VectorShuffle 1117 1115 4 5 6 3
+                              Store 1116 1118
+            1119:      6(int) Load 8(invocation)
+            1120:    102(ptr) AccessChain 27(data) 59 49
+            1121:   21(ivec4) Load 1120
+            1122:   21(ivec4) GroupNonUniformUMax 34 InclusiveScan 1121
+            1123:    102(ptr) AccessChain 27(data) 1119 49
+                              Store 1123 1122
+            1124:      6(int) Load 8(invocation)
+            1125:    125(ptr) AccessChain 27(data) 29 59 30
+            1126:22(float64_t) Load 1125
+            1127:22(float64_t) GroupNonUniformFMax 34 InclusiveScan 1126
+            1128:    125(ptr) AccessChain 27(data) 1124 59 30
+                              Store 1128 1127
+            1129:      6(int) Load 8(invocation)
+            1130:    132(ptr) AccessChain 27(data) 38 59
+            1131: 23(f64vec4) Load 1130
+            1132:131(f64vec2) VectorShuffle 1131 1131 0 1
+            1133:131(f64vec2) GroupNonUniformFMax 34 InclusiveScan 1132
+            1134:    132(ptr) AccessChain 27(data) 1129 59
+            1135: 23(f64vec4) Load 1134
+            1136: 23(f64vec4) VectorShuffle 1135 1133 4 5 2 3
+                              Store 1134 1136
+            1137:      6(int) Load 8(invocation)
+            1138:    132(ptr) AccessChain 27(data) 49 59
+            1139: 23(f64vec4) Load 1138
+            1140:141(f64vec3) VectorShuffle 1139 1139 0 1 2
+            1141:141(f64vec3) GroupNonUniformFMax 34 InclusiveScan 1140
+            1142:    132(ptr) AccessChain 27(data) 1137 59
+            1143: 23(f64vec4) Load 1142
+            1144: 23(f64vec4) VectorShuffle 1143 1141 4 5 6 3
+                              Store 1142 1144
+            1145:      6(int) Load 8(invocation)
+            1146:    132(ptr) AccessChain 27(data) 59 59
+            1147: 23(f64vec4) Load 1146
+            1148: 23(f64vec4) GroupNonUniformFMax 34 InclusiveScan 1147
+            1149:    132(ptr) AccessChain 27(data) 1145 59
+                              Store 1149 1148
+            1150:      6(int) Load 8(invocation)
+            1151:     65(ptr) AccessChain 27(data) 29 38 30
+            1152:     19(int) Load 1151
+            1153:     19(int) GroupNonUniformBitwiseAnd 34 InclusiveScan 1152
+            1154:     65(ptr) AccessChain 27(data) 1150 38 30
+                              Store 1154 1153
+            1155:      6(int) Load 8(invocation)
+            1156:     72(ptr) AccessChain 27(data) 38 38
+            1157:   20(ivec4) Load 1156
+            1158:   71(ivec2) VectorShuffle 1157 1157 0 1
+            1159:   71(ivec2) GroupNonUniformBitwiseAnd 34 InclusiveScan 1158
+            1160:     72(ptr) AccessChain 27(data) 1155 38
+            1161:   20(ivec4) Load 1160
+            1162:   20(ivec4) VectorShuffle 1161 1159 4 5 2 3
+                              Store 1160 1162
+            1163:      6(int) Load 8(invocation)
+            1164:     72(ptr) AccessChain 27(data) 49 38
+            1165:   20(ivec4) Load 1164
+            1166:   81(ivec3) VectorShuffle 1165 1165 0 1 2
+            1167:   81(ivec3) GroupNonUniformBitwiseAnd 34 InclusiveScan 1166
+            1168:     72(ptr) AccessChain 27(data) 1163 38
+            1169:   20(ivec4) Load 1168
+            1170:   20(ivec4) VectorShuffle 1169 1167 4 5 6 3
+                              Store 1168 1170
+            1171:      6(int) Load 8(invocation)
+            1172:     72(ptr) AccessChain 27(data) 59 38
+            1173:   20(ivec4) Load 1172
+            1174:   20(ivec4) GroupNonUniformBitwiseAnd 34 InclusiveScan 1173
+            1175:     72(ptr) AccessChain 27(data) 1171 38
+                              Store 1175 1174
+            1176:      6(int) Load 8(invocation)
+            1177:     95(ptr) AccessChain 27(data) 29 49 30
+            1178:      6(int) Load 1177
+            1179:      6(int) GroupNonUniformBitwiseAnd 34 InclusiveScan 1178
+            1180:     95(ptr) AccessChain 27(data) 1176 49 30
+                              Store 1180 1179
+            1181:      6(int) Load 8(invocation)
+            1182:    102(ptr) AccessChain 27(data) 38 49
+            1183:   21(ivec4) Load 1182
+            1184:  101(ivec2) VectorShuffle 1183 1183 0 1
+            1185:  101(ivec2) GroupNonUniformBitwiseAnd 34 InclusiveScan 1184
+            1186:    102(ptr) AccessChain 27(data) 1181 49
+            1187:   21(ivec4) Load 1186
+            1188:   21(ivec4) VectorShuffle 1187 1185 4 5 2 3
+                              Store 1186 1188
+            1189:      6(int) Load 8(invocation)
+            1190:    102(ptr) AccessChain 27(data) 49 49
+            1191:   21(ivec4) Load 1190
+            1192:  111(ivec3) VectorShuffle 1191 1191 0 1 2
+            1193:  111(ivec3) GroupNonUniformBitwiseAnd 34 InclusiveScan 1192
+            1194:    102(ptr) AccessChain 27(data) 1189 49
+            1195:   21(ivec4) Load 1194
+            1196:   21(ivec4) VectorShuffle 1195 1193 4 5 6 3
+                              Store 1194 1196
+            1197:      6(int) Load 8(invocation)
+            1198:    102(ptr) AccessChain 27(data) 59 49
+            1199:   21(ivec4) Load 1198
+            1200:   21(ivec4) GroupNonUniformBitwiseAnd 34 InclusiveScan 1199
+            1201:    102(ptr) AccessChain 27(data) 1197 49
+                              Store 1201 1200
+            1202:      6(int) Load 8(invocation)
+            1203:     65(ptr) AccessChain 27(data) 29 38 30
+            1204:     19(int) Load 1203
+            1205:   521(bool) SLessThan 1204 29
+            1206:   521(bool) GroupNonUniformLogicalAnd 34 InclusiveScan 1205
+            1207:     19(int) Select 1206 38 29
+            1208:     65(ptr) AccessChain 27(data) 1202 38 30
+                              Store 1208 1207
+            1209:      6(int) Load 8(invocation)
+            1210:     72(ptr) AccessChain 27(data) 38 38
+            1211:   20(ivec4) Load 1210
+            1212:   71(ivec2) VectorShuffle 1211 1211 0 1
+            1213:  531(bvec2) SLessThan 1212 530
+            1214:  531(bvec2) GroupNonUniformLogicalAnd 34 InclusiveScan 1213
+            1215:   71(ivec2) Select 1214 534 530
+            1216:     72(ptr) AccessChain 27(data) 1209 38
+            1217:   20(ivec4) Load 1216
+            1218:   20(ivec4) VectorShuffle 1217 1215 4 5 2 3
+                              Store 1216 1218
+            1219:      6(int) Load 8(invocation)
+            1220:     72(ptr) AccessChain 27(data) 38 38
+            1221:   20(ivec4) Load 1220
+            1222:   81(ivec3) VectorShuffle 1221 1221 0 1 2
+            1223:  544(bvec3) SLessThan 1222 543
+            1224:  544(bvec3) GroupNonUniformLogicalAnd 34 InclusiveScan 1223
+            1225:   81(ivec3) Select 1224 547 543
+            1226:     72(ptr) AccessChain 27(data) 1219 38
+            1227:   20(ivec4) Load 1226
+            1228:   20(ivec4) VectorShuffle 1227 1225 4 5 6 3
+                              Store 1226 1228
+            1229:      6(int) Load 8(invocation)
+            1230:     72(ptr) AccessChain 27(data) 38 38
+            1231:   20(ivec4) Load 1230
+            1232:  556(bvec4) SLessThan 1231 555
+            1233:  556(bvec4) GroupNonUniformLogicalAnd 34 InclusiveScan 1232
+            1234:   20(ivec4) Select 1233 559 555
+            1235:     72(ptr) AccessChain 27(data) 1229 38
+                              Store 1235 1234
+            1236:      6(int) Load 8(invocation)
+            1237:     65(ptr) AccessChain 27(data) 29 38 30
+            1238:     19(int) Load 1237
+            1239:     19(int) GroupNonUniformBitwiseOr 34 InclusiveScan 1238
+            1240:     65(ptr) AccessChain 27(data) 1236 38 30
+                              Store 1240 1239
+            1241:      6(int) Load 8(invocation)
+            1242:     72(ptr) AccessChain 27(data) 38 38
+            1243:   20(ivec4) Load 1242
+            1244:   71(ivec2) VectorShuffle 1243 1243 0 1
+            1245:   71(ivec2) GroupNonUniformBitwiseOr 34 InclusiveScan 1244
+            1246:     72(ptr) AccessChain 27(data) 1241 38
+            1247:   20(ivec4) Load 1246
+            1248:   20(ivec4) VectorShuffle 1247 1245 4 5 2 3
+                              Store 1246 1248
+            1249:      6(int) Load 8(invocation)
+            1250:     72(ptr) AccessChain 27(data) 49 38
+            1251:   20(ivec4) Load 1250
+            1252:   81(ivec3) VectorShuffle 1251 1251 0 1 2
+            1253:   81(ivec3) GroupNonUniformBitwiseOr 34 InclusiveScan 1252
+            1254:     72(ptr) AccessChain 27(data) 1249 38
+            1255:   20(ivec4) Load 1254
+            1256:   20(ivec4) VectorShuffle 1255 1253 4 5 6 3
+                              Store 1254 1256
+            1257:      6(int) Load 8(invocation)
+            1258:     72(ptr) AccessChain 27(data) 59 38
+            1259:   20(ivec4) Load 1258
+            1260:   20(ivec4) GroupNonUniformBitwiseOr 34 InclusiveScan 1259
+            1261:     72(ptr) AccessChain 27(data) 1257 38
+                              Store 1261 1260
+            1262:      6(int) Load 8(invocation)
+            1263:     95(ptr) AccessChain 27(data) 29 49 30
+            1264:      6(int) Load 1263
+            1265:      6(int) GroupNonUniformBitwiseOr 34 InclusiveScan 1264
+            1266:     95(ptr) AccessChain 27(data) 1262 49 30
+                              Store 1266 1265
+            1267:      6(int) Load 8(invocation)
+            1268:    102(ptr) AccessChain 27(data) 38 49
+            1269:   21(ivec4) Load 1268
+            1270:  101(ivec2) VectorShuffle 1269 1269 0 1
+            1271:  101(ivec2) GroupNonUniformBitwiseOr 34 InclusiveScan 1270
+            1272:    102(ptr) AccessChain 27(data) 1267 49
+            1273:   21(ivec4) Load 1272
+            1274:   21(ivec4) VectorShuffle 1273 1271 4 5 2 3
+                              Store 1272 1274
+            1275:      6(int) Load 8(invocation)
+            1276:    102(ptr) AccessChain 27(data) 49 49
+            1277:   21(ivec4) Load 1276
+            1278:  111(ivec3) VectorShuffle 1277 1277 0 1 2
+            1279:  111(ivec3) GroupNonUniformBitwiseOr 34 InclusiveScan 1278
+            1280:    102(ptr) AccessChain 27(data) 1275 49
+            1281:   21(ivec4) Load 1280
+            1282:   21(ivec4) VectorShuffle 1281 1279 4 5 6 3
+                              Store 1280 1282
+            1283:      6(int) Load 8(invocation)
+            1284:    102(ptr) AccessChain 27(data) 59 49
+            1285:   21(ivec4) Load 1284
+            1286:   21(ivec4) GroupNonUniformBitwiseOr 34 InclusiveScan 1285
+            1287:    102(ptr) AccessChain 27(data) 1283 49
+                              Store 1287 1286
+            1288:      6(int) Load 8(invocation)
+            1289:     65(ptr) AccessChain 27(data) 29 38 30
+            1290:     19(int) Load 1289
+            1291:   521(bool) SLessThan 1290 29
+            1292:   521(bool) GroupNonUniformLogicalOr 34 InclusiveScan 1291
+            1293:     19(int) Select 1292 38 29
+            1294:     65(ptr) AccessChain 27(data) 1288 38 30
+                              Store 1294 1293
+            1295:      6(int) Load 8(invocation)
+            1296:     72(ptr) AccessChain 27(data) 38 38
+            1297:   20(ivec4) Load 1296
+            1298:   71(ivec2) VectorShuffle 1297 1297 0 1
+            1299:  531(bvec2) SLessThan 1298 530
+            1300:  531(bvec2) GroupNonUniformLogicalOr 34 InclusiveScan 1299
+            1301:   71(ivec2) Select 1300 534 530
+            1302:     72(ptr) AccessChain 27(data) 1295 38
+            1303:   20(ivec4) Load 1302
+            1304:   20(ivec4) VectorShuffle 1303 1301 4 5 2 3
+                              Store 1302 1304
+            1305:      6(int) Load 8(invocation)
+            1306:     72(ptr) AccessChain 27(data) 38 38
+            1307:   20(ivec4) Load 1306
+            1308:   81(ivec3) VectorShuffle 1307 1307 0 1 2
+            1309:  544(bvec3) SLessThan 1308 543
+            1310:  544(bvec3) GroupNonUniformLogicalOr 34 InclusiveScan 1309
+            1311:   81(ivec3) Select 1310 547 543
+            1312:     72(ptr) AccessChain 27(data) 1305 38
+            1313:   20(ivec4) Load 1312
+            1314:   20(ivec4) VectorShuffle 1313 1311 4 5 6 3
+                              Store 1312 1314
+            1315:      6(int) Load 8(invocation)
+            1316:     72(ptr) AccessChain 27(data) 38 38
+            1317:   20(ivec4) Load 1316
+            1318:  556(bvec4) SLessThan 1317 555
+            1319:  556(bvec4) GroupNonUniformLogicalOr 34 InclusiveScan 1318
+            1320:   20(ivec4) Select 1319 559 555
+            1321:     72(ptr) AccessChain 27(data) 1315 38
+                              Store 1321 1320
+            1322:      6(int) Load 8(invocation)
+            1323:     65(ptr) AccessChain 27(data) 29 38 30
+            1324:     19(int) Load 1323
+            1325:     19(int) GroupNonUniformBitwiseXor 34 InclusiveScan 1324
+            1326:     65(ptr) AccessChain 27(data) 1322 38 30
+                              Store 1326 1325
+            1327:      6(int) Load 8(invocation)
+            1328:     72(ptr) AccessChain 27(data) 38 38
+            1329:   20(ivec4) Load 1328
+            1330:   71(ivec2) VectorShuffle 1329 1329 0 1
+            1331:   71(ivec2) GroupNonUniformBitwiseXor 34 InclusiveScan 1330
+            1332:     72(ptr) AccessChain 27(data) 1327 38
+            1333:   20(ivec4) Load 1332
+            1334:   20(ivec4) VectorShuffle 1333 1331 4 5 2 3
+                              Store 1332 1334
+            1335:      6(int) Load 8(invocation)
+            1336:     72(ptr) AccessChain 27(data) 49 38
+            1337:   20(ivec4) Load 1336
+            1338:   81(ivec3) VectorShuffle 1337 1337 0 1 2
+            1339:   81(ivec3) GroupNonUniformBitwiseXor 34 InclusiveScan 1338
+            1340:     72(ptr) AccessChain 27(data) 1335 38
+            1341:   20(ivec4) Load 1340
+            1342:   20(ivec4) VectorShuffle 1341 1339 4 5 6 3
+                              Store 1340 1342
+            1343:      6(int) Load 8(invocation)
+            1344:     72(ptr) AccessChain 27(data) 59 38
+            1345:   20(ivec4) Load 1344
+            1346:   20(ivec4) GroupNonUniformBitwiseXor 34 InclusiveScan 1345
+            1347:     72(ptr) AccessChain 27(data) 1343 38
+                              Store 1347 1346
+            1348:      6(int) Load 8(invocation)
+            1349:     95(ptr) AccessChain 27(data) 29 49 30
+            1350:      6(int) Load 1349
+            1351:      6(int) GroupNonUniformBitwiseXor 34 InclusiveScan 1350
+            1352:     95(ptr) AccessChain 27(data) 1348 49 30
+                              Store 1352 1351
+            1353:      6(int) Load 8(invocation)
+            1354:    102(ptr) AccessChain 27(data) 38 49
+            1355:   21(ivec4) Load 1354
+            1356:  101(ivec2) VectorShuffle 1355 1355 0 1
+            1357:  101(ivec2) GroupNonUniformBitwiseXor 34 InclusiveScan 1356
+            1358:    102(ptr) AccessChain 27(data) 1353 49
+            1359:   21(ivec4) Load 1358
+            1360:   21(ivec4) VectorShuffle 1359 1357 4 5 2 3
+                              Store 1358 1360
+            1361:      6(int) Load 8(invocation)
+            1362:    102(ptr) AccessChain 27(data) 49 49
+            1363:   21(ivec4) Load 1362
+            1364:  111(ivec3) VectorShuffle 1363 1363 0 1 2
+            1365:  111(ivec3) GroupNonUniformBitwiseXor 34 InclusiveScan 1364
+            1366:    102(ptr) AccessChain 27(data) 1361 49
+            1367:   21(ivec4) Load 1366
+            1368:   21(ivec4) VectorShuffle 1367 1365 4 5 6 3
+                              Store 1366 1368
+            1369:      6(int) Load 8(invocation)
+            1370:    102(ptr) AccessChain 27(data) 59 49
+            1371:   21(ivec4) Load 1370
+            1372:   21(ivec4) GroupNonUniformBitwiseXor 34 InclusiveScan 1371
+            1373:    102(ptr) AccessChain 27(data) 1369 49
+                              Store 1373 1372
+            1374:      6(int) Load 8(invocation)
+            1375:     65(ptr) AccessChain 27(data) 29 38 30
+            1376:     19(int) Load 1375
+            1377:   521(bool) SLessThan 1376 29
+            1378:   521(bool) GroupNonUniformLogicalXor 34 InclusiveScan 1377
+            1379:     19(int) Select 1378 38 29
+            1380:     65(ptr) AccessChain 27(data) 1374 38 30
+                              Store 1380 1379
+            1381:      6(int) Load 8(invocation)
+            1382:     72(ptr) AccessChain 27(data) 38 38
+            1383:   20(ivec4) Load 1382
+            1384:   71(ivec2) VectorShuffle 1383 1383 0 1
+            1385:  531(bvec2) SLessThan 1384 530
+            1386:  531(bvec2) GroupNonUniformLogicalXor 34 InclusiveScan 1385
+            1387:   71(ivec2) Select 1386 534 530
+            1388:     72(ptr) AccessChain 27(data) 1381 38
+            1389:   20(ivec4) Load 1388
+            1390:   20(ivec4) VectorShuffle 1389 1387 4 5 2 3
+                              Store 1388 1390
+            1391:      6(int) Load 8(invocation)
+            1392:     72(ptr) AccessChain 27(data) 38 38
+            1393:   20(ivec4) Load 1392
+            1394:   81(ivec3) VectorShuffle 1393 1393 0 1 2
+            1395:  544(bvec3) SLessThan 1394 543
+            1396:  544(bvec3) GroupNonUniformLogicalXor 34 InclusiveScan 1395
+            1397:   81(ivec3) Select 1396 547 543
+            1398:     72(ptr) AccessChain 27(data) 1391 38
+            1399:   20(ivec4) Load 1398
+            1400:   20(ivec4) VectorShuffle 1399 1397 4 5 6 3
+                              Store 1398 1400
+            1401:      6(int) Load 8(invocation)
+            1402:     72(ptr) AccessChain 27(data) 38 38
+            1403:   20(ivec4) Load 1402
+            1404:  556(bvec4) SLessThan 1403 555
+            1405:  556(bvec4) GroupNonUniformLogicalXor 34 InclusiveScan 1404
+            1406:   20(ivec4) Select 1405 559 555
+            1407:     72(ptr) AccessChain 27(data) 1401 38
+                              Store 1407 1406
+            1408:      6(int) Load 8(invocation)
+            1409:     31(ptr) AccessChain 27(data) 29 29 30
+            1410:   17(float) Load 1409
+            1411:   17(float) GroupNonUniformFAdd 34 ExclusiveScan 1410
+            1412:     31(ptr) AccessChain 27(data) 1408 29 30
+                              Store 1412 1411
+            1413:      6(int) Load 8(invocation)
+            1414:     40(ptr) AccessChain 27(data) 38 29
+            1415:   18(fvec4) Load 1414
+            1416:   39(fvec2) VectorShuffle 1415 1415 0 1
+            1417:   39(fvec2) GroupNonUniformFAdd 34 ExclusiveScan 1416
+            1418:     40(ptr) AccessChain 27(data) 1413 29
+            1419:   18(fvec4) Load 1418
+            1420:   18(fvec4) VectorShuffle 1419 1417 4 5 2 3
+                              Store 1418 1420
+            1421:      6(int) Load 8(invocation)
+            1422:     40(ptr) AccessChain 27(data) 49 29
+            1423:   18(fvec4) Load 1422
+            1424:   50(fvec3) VectorShuffle 1423 1423 0 1 2
+            1425:   50(fvec3) GroupNonUniformFAdd 34 ExclusiveScan 1424
+            1426:     40(ptr) AccessChain 27(data) 1421 29
+            1427:   18(fvec4) Load 1426
+            1428:   18(fvec4) VectorShuffle 1427 1425 4 5 6 3
+                              Store 1426 1428
+            1429:      6(int) Load 8(invocation)
+            1430:     40(ptr) AccessChain 27(data) 59 29
+            1431:   18(fvec4) Load 1430
+            1432:   18(fvec4) GroupNonUniformFAdd 34 ExclusiveScan 1431
+            1433:     40(ptr) AccessChain 27(data) 1429 29
+                              Store 1433 1432
+            1434:      6(int) Load 8(invocation)
+            1435:     65(ptr) AccessChain 27(data) 29 38 30
+            1436:     19(int) Load 1435
+            1437:     19(int) GroupNonUniformIAdd 34 ExclusiveScan 1436
+            1438:     65(ptr) AccessChain 27(data) 1434 38 30
+                              Store 1438 1437
+            1439:      6(int) Load 8(invocation)
+            1440:     72(ptr) AccessChain 27(data) 38 38
+            1441:   20(ivec4) Load 1440
+            1442:   71(ivec2) VectorShuffle 1441 1441 0 1
+            1443:   71(ivec2) GroupNonUniformIAdd 34 ExclusiveScan 1442
+            1444:     72(ptr) AccessChain 27(data) 1439 38
+            1445:   20(ivec4) Load 1444
+            1446:   20(ivec4) VectorShuffle 1445 1443 4 5 2 3
+                              Store 1444 1446
+            1447:      6(int) Load 8(invocation)
+            1448:     72(ptr) AccessChain 27(data) 49 38
+            1449:   20(ivec4) Load 1448
+            1450:   81(ivec3) VectorShuffle 1449 1449 0 1 2
+            1451:   81(ivec3) GroupNonUniformIAdd 34 ExclusiveScan 1450
+            1452:     72(ptr) AccessChain 27(data) 1447 38
+            1453:   20(ivec4) Load 1452
+            1454:   20(ivec4) VectorShuffle 1453 1451 4 5 6 3
+                              Store 1452 1454
+            1455:      6(int) Load 8(invocation)
+            1456:     72(ptr) AccessChain 27(data) 59 38
+            1457:   20(ivec4) Load 1456
+            1458:   20(ivec4) GroupNonUniformIAdd 34 ExclusiveScan 1457
+            1459:     72(ptr) AccessChain 27(data) 1455 38
+                              Store 1459 1458
+            1460:      6(int) Load 8(invocation)
+            1461:     95(ptr) AccessChain 27(data) 29 49 30
+            1462:      6(int) Load 1461
+            1463:      6(int) GroupNonUniformIAdd 34 ExclusiveScan 1462
+            1464:     95(ptr) AccessChain 27(data) 1460 49 30
+                              Store 1464 1463
+            1465:      6(int) Load 8(invocation)
+            1466:    102(ptr) AccessChain 27(data) 38 49
+            1467:   21(ivec4) Load 1466
+            1468:  101(ivec2) VectorShuffle 1467 1467 0 1
+            1469:  101(ivec2) GroupNonUniformIAdd 34 ExclusiveScan 1468
+            1470:    102(ptr) AccessChain 27(data) 1465 49
+            1471:   21(ivec4) Load 1470
+            1472:   21(ivec4) VectorShuffle 1471 1469 4 5 2 3
+                              Store 1470 1472
+            1473:      6(int) Load 8(invocation)
+            1474:    102(ptr) AccessChain 27(data) 49 49
+            1475:   21(ivec4) Load 1474
+            1476:  111(ivec3) VectorShuffle 1475 1475 0 1 2
+            1477:  111(ivec3) GroupNonUniformIAdd 34 ExclusiveScan 1476
+            1478:    102(ptr) AccessChain 27(data) 1473 49
+            1479:   21(ivec4) Load 1478
+            1480:   21(ivec4) VectorShuffle 1479 1477 4 5 6 3
+                              Store 1478 1480
+            1481:      6(int) Load 8(invocation)
+            1482:    102(ptr) AccessChain 27(data) 59 49
+            1483:   21(ivec4) Load 1482
+            1484:   21(ivec4) GroupNonUniformIAdd 34 ExclusiveScan 1483
+            1485:    102(ptr) AccessChain 27(data) 1481 49
+                              Store 1485 1484
+            1486:      6(int) Load 8(invocation)
+            1487:    125(ptr) AccessChain 27(data) 29 59 30
+            1488:22(float64_t) Load 1487
+            1489:22(float64_t) GroupNonUniformFAdd 34 ExclusiveScan 1488
+            1490:    125(ptr) AccessChain 27(data) 1486 59 30
+                              Store 1490 1489
+            1491:      6(int) Load 8(invocation)
+            1492:    132(ptr) AccessChain 27(data) 38 59
+            1493: 23(f64vec4) Load 1492
+            1494:131(f64vec2) VectorShuffle 1493 1493 0 1
+            1495:131(f64vec2) GroupNonUniformFAdd 34 ExclusiveScan 1494
+            1496:    132(ptr) AccessChain 27(data) 1491 59
+            1497: 23(f64vec4) Load 1496
+            1498: 23(f64vec4) VectorShuffle 1497 1495 4 5 2 3
+                              Store 1496 1498
+            1499:      6(int) Load 8(invocation)
+            1500:    132(ptr) AccessChain 27(data) 49 59
+            1501: 23(f64vec4) Load 1500
+            1502:141(f64vec3) VectorShuffle 1501 1501 0 1 2
+            1503:141(f64vec3) GroupNonUniformFAdd 34 ExclusiveScan 1502
+            1504:    132(ptr) AccessChain 27(data) 1499 59
+            1505: 23(f64vec4) Load 1504
+            1506: 23(f64vec4) VectorShuffle 1505 1503 4 5 6 3
+                              Store 1504 1506
+            1507:      6(int) Load 8(invocation)
+            1508:    132(ptr) AccessChain 27(data) 59 59
+            1509: 23(f64vec4) Load 1508
+            1510: 23(f64vec4) GroupNonUniformFAdd 34 ExclusiveScan 1509
+            1511:    132(ptr) AccessChain 27(data) 1507 59
+                              Store 1511 1510
+            1512:      6(int) Load 8(invocation)
+            1513:     31(ptr) AccessChain 27(data) 29 29 30
+            1514:   17(float) Load 1513
+            1515:   17(float) GroupNonUniformFMul 34 ExclusiveScan 1514
+            1516:     31(ptr) AccessChain 27(data) 1512 29 30
+                              Store 1516 1515
+            1517:      6(int) Load 8(invocation)
+            1518:     40(ptr) AccessChain 27(data) 38 29
+            1519:   18(fvec4) Load 1518
+            1520:   39(fvec2) VectorShuffle 1519 1519 0 1
+            1521:   39(fvec2) GroupNonUniformFMul 34 ExclusiveScan 1520
+            1522:     40(ptr) AccessChain 27(data) 1517 29
+            1523:   18(fvec4) Load 1522
+            1524:   18(fvec4) VectorShuffle 1523 1521 4 5 2 3
+                              Store 1522 1524
+            1525:      6(int) Load 8(invocation)
+            1526:     40(ptr) AccessChain 27(data) 49 29
+            1527:   18(fvec4) Load 1526
+            1528:   50(fvec3) VectorShuffle 1527 1527 0 1 2
+            1529:   50(fvec3) GroupNonUniformFMul 34 ExclusiveScan 1528
+            1530:     40(ptr) AccessChain 27(data) 1525 29
+            1531:   18(fvec4) Load 1530
+            1532:   18(fvec4) VectorShuffle 1531 1529 4 5 6 3
+                              Store 1530 1532
+            1533:      6(int) Load 8(invocation)
+            1534:     40(ptr) AccessChain 27(data) 59 29
+            1535:   18(fvec4) Load 1534
+            1536:   18(fvec4) GroupNonUniformFMul 34 ExclusiveScan 1535
+            1537:     40(ptr) AccessChain 27(data) 1533 29
+                              Store 1537 1536
+            1538:      6(int) Load 8(invocation)
+            1539:     65(ptr) AccessChain 27(data) 29 38 30
+            1540:     19(int) Load 1539
+            1541:     19(int) GroupNonUniformIMul 34 ExclusiveScan 1540
+            1542:     65(ptr) AccessChain 27(data) 1538 38 30
+                              Store 1542 1541
+            1543:      6(int) Load 8(invocation)
+            1544:     72(ptr) AccessChain 27(data) 38 38
+            1545:   20(ivec4) Load 1544
+            1546:   71(ivec2) VectorShuffle 1545 1545 0 1
+            1547:   71(ivec2) GroupNonUniformIMul 34 ExclusiveScan 1546
+            1548:     72(ptr) AccessChain 27(data) 1543 38
+            1549:   20(ivec4) Load 1548
+            1550:   20(ivec4) VectorShuffle 1549 1547 4 5 2 3
+                              Store 1548 1550
+            1551:      6(int) Load 8(invocation)
+            1552:     72(ptr) AccessChain 27(data) 49 38
+            1553:   20(ivec4) Load 1552
+            1554:   81(ivec3) VectorShuffle 1553 1553 0 1 2
+            1555:   81(ivec3) GroupNonUniformIMul 34 ExclusiveScan 1554
+            1556:     72(ptr) AccessChain 27(data) 1551 38
+            1557:   20(ivec4) Load 1556
+            1558:   20(ivec4) VectorShuffle 1557 1555 4 5 6 3
+                              Store 1556 1558
+            1559:      6(int) Load 8(invocation)
+            1560:     72(ptr) AccessChain 27(data) 59 38
+            1561:   20(ivec4) Load 1560
+            1562:   20(ivec4) GroupNonUniformIMul 34 ExclusiveScan 1561
+            1563:     72(ptr) AccessChain 27(data) 1559 38
+                              Store 1563 1562
+            1564:      6(int) Load 8(invocation)
+            1565:     95(ptr) AccessChain 27(data) 29 49 30
+            1566:      6(int) Load 1565
+            1567:      6(int) GroupNonUniformIMul 34 ExclusiveScan 1566
+            1568:     95(ptr) AccessChain 27(data) 1564 49 30
+                              Store 1568 1567
+            1569:      6(int) Load 8(invocation)
+            1570:    102(ptr) AccessChain 27(data) 38 49
+            1571:   21(ivec4) Load 1570
+            1572:  101(ivec2) VectorShuffle 1571 1571 0 1
+            1573:  101(ivec2) GroupNonUniformIMul 34 ExclusiveScan 1572
+            1574:    102(ptr) AccessChain 27(data) 1569 49
+            1575:   21(ivec4) Load 1574
+            1576:   21(ivec4) VectorShuffle 1575 1573 4 5 2 3
+                              Store 1574 1576
+            1577:      6(int) Load 8(invocation)
+            1578:    102(ptr) AccessChain 27(data) 49 49
+            1579:   21(ivec4) Load 1578
+            1580:  111(ivec3) VectorShuffle 1579 1579 0 1 2
+            1581:  111(ivec3) GroupNonUniformIMul 34 ExclusiveScan 1580
+            1582:    102(ptr) AccessChain 27(data) 1577 49
+            1583:   21(ivec4) Load 1582
+            1584:   21(ivec4) VectorShuffle 1583 1581 4 5 6 3
+                              Store 1582 1584
+            1585:      6(int) Load 8(invocation)
+            1586:    102(ptr) AccessChain 27(data) 59 49
+            1587:   21(ivec4) Load 1586
+            1588:   21(ivec4) GroupNonUniformIMul 34 ExclusiveScan 1587
+            1589:    102(ptr) AccessChain 27(data) 1585 49
+                              Store 1589 1588
+            1590:      6(int) Load 8(invocation)
+            1591:    125(ptr) AccessChain 27(data) 29 59 30
+            1592:22(float64_t) Load 1591
+            1593:22(float64_t) GroupNonUniformFMul 34 ExclusiveScan 1592
+            1594:    125(ptr) AccessChain 27(data) 1590 59 30
+                              Store 1594 1593
+            1595:      6(int) Load 8(invocation)
+            1596:    132(ptr) AccessChain 27(data) 38 59
+            1597: 23(f64vec4) Load 1596
+            1598:131(f64vec2) VectorShuffle 1597 1597 0 1
+            1599:131(f64vec2) GroupNonUniformFMul 34 ExclusiveScan 1598
+            1600:    132(ptr) AccessChain 27(data) 1595 59
+            1601: 23(f64vec4) Load 1600
+            1602: 23(f64vec4) VectorShuffle 1601 1599 4 5 2 3
+                              Store 1600 1602
+            1603:      6(int) Load 8(invocation)
+            1604:    132(ptr) AccessChain 27(data) 49 59
+            1605: 23(f64vec4) Load 1604
+            1606:141(f64vec3) VectorShuffle 1605 1605 0 1 2
+            1607:141(f64vec3) GroupNonUniformFMul 34 ExclusiveScan 1606
+            1608:    132(ptr) AccessChain 27(data) 1603 59
+            1609: 23(f64vec4) Load 1608
+            1610: 23(f64vec4) VectorShuffle 1609 1607 4 5 6 3
+                              Store 1608 1610
+            1611:      6(int) Load 8(invocation)
+            1612:    132(ptr) AccessChain 27(data) 59 59
+            1613: 23(f64vec4) Load 1612
+            1614: 23(f64vec4) GroupNonUniformFMul 34 ExclusiveScan 1613
+            1615:    132(ptr) AccessChain 27(data) 1611 59
+                              Store 1615 1614
+            1616:      6(int) Load 8(invocation)
+            1617:     31(ptr) AccessChain 27(data) 29 29 30
+            1618:   17(float) Load 1617
+            1619:   17(float) GroupNonUniformFMin 34 ExclusiveScan 1618
+            1620:     31(ptr) AccessChain 27(data) 1616 29 30
+                              Store 1620 1619
+            1621:      6(int) Load 8(invocation)
+            1622:     40(ptr) AccessChain 27(data) 38 29
+            1623:   18(fvec4) Load 1622
+            1624:   39(fvec2) VectorShuffle 1623 1623 0 1
+            1625:   39(fvec2) GroupNonUniformFMin 34 ExclusiveScan 1624
+            1626:     40(ptr) AccessChain 27(data) 1621 29
+            1627:   18(fvec4) Load 1626
+            1628:   18(fvec4) VectorShuffle 1627 1625 4 5 2 3
+                              Store 1626 1628
+            1629:      6(int) Load 8(invocation)
+            1630:     40(ptr) AccessChain 27(data) 49 29
+            1631:   18(fvec4) Load 1630
+            1632:   50(fvec3) VectorShuffle 1631 1631 0 1 2
+            1633:   50(fvec3) GroupNonUniformFMin 34 ExclusiveScan 1632
+            1634:     40(ptr) AccessChain 27(data) 1629 29
+            1635:   18(fvec4) Load 1634
+            1636:   18(fvec4) VectorShuffle 1635 1633 4 5 6 3
+                              Store 1634 1636
+            1637:      6(int) Load 8(invocation)
+            1638:     40(ptr) AccessChain 27(data) 59 29
+            1639:   18(fvec4) Load 1638
+            1640:   18(fvec4) GroupNonUniformFMin 34 ExclusiveScan 1639
+            1641:     40(ptr) AccessChain 27(data) 1637 29
+                              Store 1641 1640
+            1642:      6(int) Load 8(invocation)
+            1643:     65(ptr) AccessChain 27(data) 29 38 30
+            1644:     19(int) Load 1643
+            1645:     19(int) GroupNonUniformSMin 34 ExclusiveScan 1644
+            1646:     65(ptr) AccessChain 27(data) 1642 38 30
+                              Store 1646 1645
+            1647:      6(int) Load 8(invocation)
+            1648:     72(ptr) AccessChain 27(data) 38 38
+            1649:   20(ivec4) Load 1648
+            1650:   71(ivec2) VectorShuffle 1649 1649 0 1
+            1651:   71(ivec2) GroupNonUniformSMin 34 ExclusiveScan 1650
+            1652:     72(ptr) AccessChain 27(data) 1647 38
+            1653:   20(ivec4) Load 1652
+            1654:   20(ivec4) VectorShuffle 1653 1651 4 5 2 3
+                              Store 1652 1654
+            1655:      6(int) Load 8(invocation)
+            1656:     72(ptr) AccessChain 27(data) 49 38
+            1657:   20(ivec4) Load 1656
+            1658:   81(ivec3) VectorShuffle 1657 1657 0 1 2
+            1659:   81(ivec3) GroupNonUniformSMin 34 ExclusiveScan 1658
+            1660:     72(ptr) AccessChain 27(data) 1655 38
+            1661:   20(ivec4) Load 1660
+            1662:   20(ivec4) VectorShuffle 1661 1659 4 5 6 3
+                              Store 1660 1662
+            1663:      6(int) Load 8(invocation)
+            1664:     72(ptr) AccessChain 27(data) 59 38
+            1665:   20(ivec4) Load 1664
+            1666:   20(ivec4) GroupNonUniformSMin 34 ExclusiveScan 1665
+            1667:     72(ptr) AccessChain 27(data) 1663 38
+                              Store 1667 1666
+            1668:      6(int) Load 8(invocation)
+            1669:     95(ptr) AccessChain 27(data) 29 49 30
+            1670:      6(int) Load 1669
+            1671:      6(int) GroupNonUniformUMin 34 ExclusiveScan 1670
+            1672:     95(ptr) AccessChain 27(data) 1668 49 30
+                              Store 1672 1671
+            1673:      6(int) Load 8(invocation)
+            1674:    102(ptr) AccessChain 27(data) 38 49
+            1675:   21(ivec4) Load 1674
+            1676:  101(ivec2) VectorShuffle 1675 1675 0 1
+            1677:  101(ivec2) GroupNonUniformUMin 34 ExclusiveScan 1676
+            1678:    102(ptr) AccessChain 27(data) 1673 49
+            1679:   21(ivec4) Load 1678
+            1680:   21(ivec4) VectorShuffle 1679 1677 4 5 2 3
+                              Store 1678 1680
+            1681:      6(int) Load 8(invocation)
+            1682:    102(ptr) AccessChain 27(data) 49 49
+            1683:   21(ivec4) Load 1682
+            1684:  111(ivec3) VectorShuffle 1683 1683 0 1 2
+            1685:  111(ivec3) GroupNonUniformUMin 34 ExclusiveScan 1684
+            1686:    102(ptr) AccessChain 27(data) 1681 49
+            1687:   21(ivec4) Load 1686
+            1688:   21(ivec4) VectorShuffle 1687 1685 4 5 6 3
+                              Store 1686 1688
+            1689:      6(int) Load 8(invocation)
+            1690:    102(ptr) AccessChain 27(data) 59 49
+            1691:   21(ivec4) Load 1690
+            1692:   21(ivec4) GroupNonUniformUMin 34 ExclusiveScan 1691
+            1693:    102(ptr) AccessChain 27(data) 1689 49
+                              Store 1693 1692
+            1694:      6(int) Load 8(invocation)
+            1695:    125(ptr) AccessChain 27(data) 29 59 30
+            1696:22(float64_t) Load 1695
+            1697:22(float64_t) GroupNonUniformFMin 34 ExclusiveScan 1696
+            1698:    125(ptr) AccessChain 27(data) 1694 59 30
+                              Store 1698 1697
+            1699:      6(int) Load 8(invocation)
+            1700:    132(ptr) AccessChain 27(data) 38 59
+            1701: 23(f64vec4) Load 1700
+            1702:131(f64vec2) VectorShuffle 1701 1701 0 1
+            1703:131(f64vec2) GroupNonUniformFMin 34 ExclusiveScan 1702
+            1704:    132(ptr) AccessChain 27(data) 1699 59
+            1705: 23(f64vec4) Load 1704
+            1706: 23(f64vec4) VectorShuffle 1705 1703 4 5 2 3
+                              Store 1704 1706
+            1707:      6(int) Load 8(invocation)
+            1708:    132(ptr) AccessChain 27(data) 49 59
+            1709: 23(f64vec4) Load 1708
+            1710:141(f64vec3) VectorShuffle 1709 1709 0 1 2
+            1711:141(f64vec3) GroupNonUniformFMin 34 ExclusiveScan 1710
+            1712:    132(ptr) AccessChain 27(data) 1707 59
+            1713: 23(f64vec4) Load 1712
+            1714: 23(f64vec4) VectorShuffle 1713 1711 4 5 6 3
+                              Store 1712 1714
+            1715:      6(int) Load 8(invocation)
+            1716:    132(ptr) AccessChain 27(data) 59 59
+            1717: 23(f64vec4) Load 1716
+            1718: 23(f64vec4) GroupNonUniformFMin 34 ExclusiveScan 1717
+            1719:    132(ptr) AccessChain 27(data) 1715 59
+                              Store 1719 1718
+            1720:      6(int) Load 8(invocation)
+            1721:     31(ptr) AccessChain 27(data) 29 29 30
+            1722:   17(float) Load 1721
+            1723:   17(float) GroupNonUniformFMax 34 ExclusiveScan 1722
+            1724:     31(ptr) AccessChain 27(data) 1720 29 30
+                              Store 1724 1723
+            1725:      6(int) Load 8(invocation)
+            1726:     40(ptr) AccessChain 27(data) 38 29
+            1727:   18(fvec4) Load 1726
+            1728:   39(fvec2) VectorShuffle 1727 1727 0 1
+            1729:   39(fvec2) GroupNonUniformFMax 34 ExclusiveScan 1728
+            1730:     40(ptr) AccessChain 27(data) 1725 29
+            1731:   18(fvec4) Load 1730
+            1732:   18(fvec4) VectorShuffle 1731 1729 4 5 2 3
+                              Store 1730 1732
+            1733:      6(int) Load 8(invocation)
+            1734:     40(ptr) AccessChain 27(data) 49 29
+            1735:   18(fvec4) Load 1734
+            1736:   50(fvec3) VectorShuffle 1735 1735 0 1 2
+            1737:   50(fvec3) GroupNonUniformFMax 34 ExclusiveScan 1736
+            1738:     40(ptr) AccessChain 27(data) 1733 29
+            1739:   18(fvec4) Load 1738
+            1740:   18(fvec4) VectorShuffle 1739 1737 4 5 6 3
+                              Store 1738 1740
+            1741:      6(int) Load 8(invocation)
+            1742:     40(ptr) AccessChain 27(data) 59 29
+            1743:   18(fvec4) Load 1742
+            1744:   18(fvec4) GroupNonUniformFMax 34 ExclusiveScan 1743
+            1745:     40(ptr) AccessChain 27(data) 1741 29
+                              Store 1745 1744
+            1746:      6(int) Load 8(invocation)
+            1747:     65(ptr) AccessChain 27(data) 29 38 30
+            1748:     19(int) Load 1747
+            1749:     19(int) GroupNonUniformSMax 34 ExclusiveScan 1748
+            1750:     65(ptr) AccessChain 27(data) 1746 38 30
+                              Store 1750 1749
+            1751:      6(int) Load 8(invocation)
+            1752:     72(ptr) AccessChain 27(data) 38 38
+            1753:   20(ivec4) Load 1752
+            1754:   71(ivec2) VectorShuffle 1753 1753 0 1
+            1755:   71(ivec2) GroupNonUniformSMax 34 ExclusiveScan 1754
+            1756:     72(ptr) AccessChain 27(data) 1751 38
+            1757:   20(ivec4) Load 1756
+            1758:   20(ivec4) VectorShuffle 1757 1755 4 5 2 3
+                              Store 1756 1758
+            1759:      6(int) Load 8(invocation)
+            1760:     72(ptr) AccessChain 27(data) 49 38
+            1761:   20(ivec4) Load 1760
+            1762:   81(ivec3) VectorShuffle 1761 1761 0 1 2
+            1763:   81(ivec3) GroupNonUniformSMax 34 ExclusiveScan 1762
+            1764:     72(ptr) AccessChain 27(data) 1759 38
+            1765:   20(ivec4) Load 1764
+            1766:   20(ivec4) VectorShuffle 1765 1763 4 5 6 3
+                              Store 1764 1766
+            1767:      6(int) Load 8(invocation)
+            1768:     72(ptr) AccessChain 27(data) 59 38
+            1769:   20(ivec4) Load 1768
+            1770:   20(ivec4) GroupNonUniformSMax 34 ExclusiveScan 1769
+            1771:     72(ptr) AccessChain 27(data) 1767 38
+                              Store 1771 1770
+            1772:      6(int) Load 8(invocation)
+            1773:     95(ptr) AccessChain 27(data) 29 49 30
+            1774:      6(int) Load 1773
+            1775:      6(int) GroupNonUniformUMax 34 ExclusiveScan 1774
+            1776:     95(ptr) AccessChain 27(data) 1772 49 30
+                              Store 1776 1775
+            1777:      6(int) Load 8(invocation)
+            1778:    102(ptr) AccessChain 27(data) 38 49
+            1779:   21(ivec4) Load 1778
+            1780:  101(ivec2) VectorShuffle 1779 1779 0 1
+            1781:  101(ivec2) GroupNonUniformUMax 34 ExclusiveScan 1780
+            1782:    102(ptr) AccessChain 27(data) 1777 49
+            1783:   21(ivec4) Load 1782
+            1784:   21(ivec4) VectorShuffle 1783 1781 4 5 2 3
+                              Store 1782 1784
+            1785:      6(int) Load 8(invocation)
+            1786:    102(ptr) AccessChain 27(data) 49 49
+            1787:   21(ivec4) Load 1786
+            1788:  111(ivec3) VectorShuffle 1787 1787 0 1 2
+            1789:  111(ivec3) GroupNonUniformUMax 34 ExclusiveScan 1788
+            1790:    102(ptr) AccessChain 27(data) 1785 49
+            1791:   21(ivec4) Load 1790
+            1792:   21(ivec4) VectorShuffle 1791 1789 4 5 6 3
+                              Store 1790 1792
+            1793:      6(int) Load 8(invocation)
+            1794:    102(ptr) AccessChain 27(data) 59 49
+            1795:   21(ivec4) Load 1794
+            1796:   21(ivec4) GroupNonUniformUMax 34 ExclusiveScan 1795
+            1797:    102(ptr) AccessChain 27(data) 1793 49
+                              Store 1797 1796
+            1798:      6(int) Load 8(invocation)
+            1799:    125(ptr) AccessChain 27(data) 29 59 30
+            1800:22(float64_t) Load 1799
+            1801:22(float64_t) GroupNonUniformFMax 34 ExclusiveScan 1800
+            1802:    125(ptr) AccessChain 27(data) 1798 59 30
+                              Store 1802 1801
+            1803:      6(int) Load 8(invocation)
+            1804:    132(ptr) AccessChain 27(data) 38 59
+            1805: 23(f64vec4) Load 1804
+            1806:131(f64vec2) VectorShuffle 1805 1805 0 1
+            1807:131(f64vec2) GroupNonUniformFMax 34 ExclusiveScan 1806
+            1808:    132(ptr) AccessChain 27(data) 1803 59
+            1809: 23(f64vec4) Load 1808
+            1810: 23(f64vec4) VectorShuffle 1809 1807 4 5 2 3
+                              Store 1808 1810
+            1811:      6(int) Load 8(invocation)
+            1812:    132(ptr) AccessChain 27(data) 49 59
+            1813: 23(f64vec4) Load 1812
+            1814:141(f64vec3) VectorShuffle 1813 1813 0 1 2
+            1815:141(f64vec3) GroupNonUniformFMax 34 ExclusiveScan 1814
+            1816:    132(ptr) AccessChain 27(data) 1811 59
+            1817: 23(f64vec4) Load 1816
+            1818: 23(f64vec4) VectorShuffle 1817 1815 4 5 6 3
+                              Store 1816 1818
+            1819:      6(int) Load 8(invocation)
+            1820:    132(ptr) AccessChain 27(data) 59 59
+            1821: 23(f64vec4) Load 1820
+            1822: 23(f64vec4) GroupNonUniformFMax 34 ExclusiveScan 1821
+            1823:    132(ptr) AccessChain 27(data) 1819 59
+                              Store 1823 1822
+            1824:      6(int) Load 8(invocation)
+            1825:     65(ptr) AccessChain 27(data) 29 38 30
+            1826:     19(int) Load 1825
+            1827:     19(int) GroupNonUniformBitwiseAnd 34 ExclusiveScan 1826
+            1828:     65(ptr) AccessChain 27(data) 1824 38 30
+                              Store 1828 1827
+            1829:      6(int) Load 8(invocation)
+            1830:     72(ptr) AccessChain 27(data) 38 38
+            1831:   20(ivec4) Load 1830
+            1832:   71(ivec2) VectorShuffle 1831 1831 0 1
+            1833:   71(ivec2) GroupNonUniformBitwiseAnd 34 ExclusiveScan 1832
+            1834:     72(ptr) AccessChain 27(data) 1829 38
+            1835:   20(ivec4) Load 1834
+            1836:   20(ivec4) VectorShuffle 1835 1833 4 5 2 3
+                              Store 1834 1836
+            1837:      6(int) Load 8(invocation)
+            1838:     72(ptr) AccessChain 27(data) 49 38
+            1839:   20(ivec4) Load 1838
+            1840:   81(ivec3) VectorShuffle 1839 1839 0 1 2
+            1841:   81(ivec3) GroupNonUniformBitwiseAnd 34 ExclusiveScan 1840
+            1842:     72(ptr) AccessChain 27(data) 1837 38
+            1843:   20(ivec4) Load 1842
+            1844:   20(ivec4) VectorShuffle 1843 1841 4 5 6 3
+                              Store 1842 1844
+            1845:      6(int) Load 8(invocation)
+            1846:     72(ptr) AccessChain 27(data) 59 38
+            1847:   20(ivec4) Load 1846
+            1848:   20(ivec4) GroupNonUniformBitwiseAnd 34 ExclusiveScan 1847
+            1849:     72(ptr) AccessChain 27(data) 1845 38
+                              Store 1849 1848
+            1850:      6(int) Load 8(invocation)
+            1851:     95(ptr) AccessChain 27(data) 29 49 30
+            1852:      6(int) Load 1851
+            1853:      6(int) GroupNonUniformBitwiseAnd 34 ExclusiveScan 1852
+            1854:     95(ptr) AccessChain 27(data) 1850 49 30
+                              Store 1854 1853
+            1855:      6(int) Load 8(invocation)
+            1856:    102(ptr) AccessChain 27(data) 38 49
+            1857:   21(ivec4) Load 1856
+            1858:  101(ivec2) VectorShuffle 1857 1857 0 1
+            1859:  101(ivec2) GroupNonUniformBitwiseAnd 34 ExclusiveScan 1858
+            1860:    102(ptr) AccessChain 27(data) 1855 49
+            1861:   21(ivec4) Load 1860
+            1862:   21(ivec4) VectorShuffle 1861 1859 4 5 2 3
+                              Store 1860 1862
+            1863:      6(int) Load 8(invocation)
+            1864:    102(ptr) AccessChain 27(data) 49 49
+            1865:   21(ivec4) Load 1864
+            1866:  111(ivec3) VectorShuffle 1865 1865 0 1 2
+            1867:  111(ivec3) GroupNonUniformBitwiseAnd 34 ExclusiveScan 1866
+            1868:    102(ptr) AccessChain 27(data) 1863 49
+            1869:   21(ivec4) Load 1868
+            1870:   21(ivec4) VectorShuffle 1869 1867 4 5 6 3
+                              Store 1868 1870
+            1871:      6(int) Load 8(invocation)
+            1872:    102(ptr) AccessChain 27(data) 59 49
+            1873:   21(ivec4) Load 1872
+            1874:   21(ivec4) GroupNonUniformBitwiseAnd 34 ExclusiveScan 1873
+            1875:    102(ptr) AccessChain 27(data) 1871 49
+                              Store 1875 1874
+            1876:      6(int) Load 8(invocation)
+            1877:     65(ptr) AccessChain 27(data) 29 38 30
+            1878:     19(int) Load 1877
+            1879:   521(bool) SLessThan 1878 29
+            1880:   521(bool) GroupNonUniformLogicalAnd 34 ExclusiveScan 1879
+            1881:     19(int) Select 1880 38 29
+            1882:     65(ptr) AccessChain 27(data) 1876 38 30
+                              Store 1882 1881
+            1883:      6(int) Load 8(invocation)
+            1884:     72(ptr) AccessChain 27(data) 38 38
+            1885:   20(ivec4) Load 1884
+            1886:   71(ivec2) VectorShuffle 1885 1885 0 1
+            1887:  531(bvec2) SLessThan 1886 530
+            1888:  531(bvec2) GroupNonUniformLogicalAnd 34 ExclusiveScan 1887
+            1889:   71(ivec2) Select 1888 534 530
+            1890:     72(ptr) AccessChain 27(data) 1883 38
+            1891:   20(ivec4) Load 1890
+            1892:   20(ivec4) VectorShuffle 1891 1889 4 5 2 3
+                              Store 1890 1892
+            1893:      6(int) Load 8(invocation)
+            1894:     72(ptr) AccessChain 27(data) 38 38
+            1895:   20(ivec4) Load 1894
+            1896:   81(ivec3) VectorShuffle 1895 1895 0 1 2
+            1897:  544(bvec3) SLessThan 1896 543
+            1898:  544(bvec3) GroupNonUniformLogicalAnd 34 ExclusiveScan 1897
+            1899:   81(ivec3) Select 1898 547 543
+            1900:     72(ptr) AccessChain 27(data) 1893 38
+            1901:   20(ivec4) Load 1900
+            1902:   20(ivec4) VectorShuffle 1901 1899 4 5 6 3
+                              Store 1900 1902
+            1903:      6(int) Load 8(invocation)
+            1904:     72(ptr) AccessChain 27(data) 38 38
+            1905:   20(ivec4) Load 1904
+            1906:  556(bvec4) SLessThan 1905 555
+            1907:  556(bvec4) GroupNonUniformLogicalAnd 34 ExclusiveScan 1906
+            1908:   20(ivec4) Select 1907 559 555
+            1909:     72(ptr) AccessChain 27(data) 1903 38
+                              Store 1909 1908
+            1910:      6(int) Load 8(invocation)
+            1911:     65(ptr) AccessChain 27(data) 29 38 30
+            1912:     19(int) Load 1911
+            1913:     19(int) GroupNonUniformBitwiseOr 34 ExclusiveScan 1912
+            1914:     65(ptr) AccessChain 27(data) 1910 38 30
+                              Store 1914 1913
+            1915:      6(int) Load 8(invocation)
+            1916:     72(ptr) AccessChain 27(data) 38 38
+            1917:   20(ivec4) Load 1916
+            1918:   71(ivec2) VectorShuffle 1917 1917 0 1
+            1919:   71(ivec2) GroupNonUniformBitwiseOr 34 ExclusiveScan 1918
+            1920:     72(ptr) AccessChain 27(data) 1915 38
+            1921:   20(ivec4) Load 1920
+            1922:   20(ivec4) VectorShuffle 1921 1919 4 5 2 3
+                              Store 1920 1922
+            1923:      6(int) Load 8(invocation)
+            1924:     72(ptr) AccessChain 27(data) 49 38
+            1925:   20(ivec4) Load 1924
+            1926:   81(ivec3) VectorShuffle 1925 1925 0 1 2
+            1927:   81(ivec3) GroupNonUniformBitwiseOr 34 ExclusiveScan 1926
+            1928:     72(ptr) AccessChain 27(data) 1923 38
+            1929:   20(ivec4) Load 1928
+            1930:   20(ivec4) VectorShuffle 1929 1927 4 5 6 3
+                              Store 1928 1930
+            1931:      6(int) Load 8(invocation)
+            1932:     72(ptr) AccessChain 27(data) 59 38
+            1933:   20(ivec4) Load 1932
+            1934:   20(ivec4) GroupNonUniformBitwiseOr 34 ExclusiveScan 1933
+            1935:     72(ptr) AccessChain 27(data) 1931 38
+                              Store 1935 1934
+            1936:      6(int) Load 8(invocation)
+            1937:     95(ptr) AccessChain 27(data) 29 49 30
+            1938:      6(int) Load 1937
+            1939:      6(int) GroupNonUniformBitwiseOr 34 ExclusiveScan 1938
+            1940:     95(ptr) AccessChain 27(data) 1936 49 30
+                              Store 1940 1939
+            1941:      6(int) Load 8(invocation)
+            1942:    102(ptr) AccessChain 27(data) 38 49
+            1943:   21(ivec4) Load 1942
+            1944:  101(ivec2) VectorShuffle 1943 1943 0 1
+            1945:  101(ivec2) GroupNonUniformBitwiseOr 34 ExclusiveScan 1944
+            1946:    102(ptr) AccessChain 27(data) 1941 49
+            1947:   21(ivec4) Load 1946
+            1948:   21(ivec4) VectorShuffle 1947 1945 4 5 2 3
+                              Store 1946 1948
+            1949:      6(int) Load 8(invocation)
+            1950:    102(ptr) AccessChain 27(data) 49 49
+            1951:   21(ivec4) Load 1950
+            1952:  111(ivec3) VectorShuffle 1951 1951 0 1 2
+            1953:  111(ivec3) GroupNonUniformBitwiseOr 34 ExclusiveScan 1952
+            1954:    102(ptr) AccessChain 27(data) 1949 49
+            1955:   21(ivec4) Load 1954
+            1956:   21(ivec4) VectorShuffle 1955 1953 4 5 6 3
+                              Store 1954 1956
+            1957:      6(int) Load 8(invocation)
+            1958:    102(ptr) AccessChain 27(data) 59 49
+            1959:   21(ivec4) Load 1958
+            1960:   21(ivec4) GroupNonUniformBitwiseOr 34 ExclusiveScan 1959
+            1961:    102(ptr) AccessChain 27(data) 1957 49
+                              Store 1961 1960
+            1962:      6(int) Load 8(invocation)
+            1963:     65(ptr) AccessChain 27(data) 29 38 30
+            1964:     19(int) Load 1963
+            1965:   521(bool) SLessThan 1964 29
+            1966:   521(bool) GroupNonUniformLogicalOr 34 ExclusiveScan 1965
+            1967:     19(int) Select 1966 38 29
+            1968:     65(ptr) AccessChain 27(data) 1962 38 30
+                              Store 1968 1967
+            1969:      6(int) Load 8(invocation)
+            1970:     72(ptr) AccessChain 27(data) 38 38
+            1971:   20(ivec4) Load 1970
+            1972:   71(ivec2) VectorShuffle 1971 1971 0 1
+            1973:  531(bvec2) SLessThan 1972 530
+            1974:  531(bvec2) GroupNonUniformLogicalOr 34 ExclusiveScan 1973
+            1975:   71(ivec2) Select 1974 534 530
+            1976:     72(ptr) AccessChain 27(data) 1969 38
+            1977:   20(ivec4) Load 1976
+            1978:   20(ivec4) VectorShuffle 1977 1975 4 5 2 3
+                              Store 1976 1978
+            1979:      6(int) Load 8(invocation)
+            1980:     72(ptr) AccessChain 27(data) 38 38
+            1981:   20(ivec4) Load 1980
+            1982:   81(ivec3) VectorShuffle 1981 1981 0 1 2
+            1983:  544(bvec3) SLessThan 1982 543
+            1984:  544(bvec3) GroupNonUniformLogicalOr 34 ExclusiveScan 1983
+            1985:   81(ivec3) Select 1984 547 543
+            1986:     72(ptr) AccessChain 27(data) 1979 38
+            1987:   20(ivec4) Load 1986
+            1988:   20(ivec4) VectorShuffle 1987 1985 4 5 6 3
+                              Store 1986 1988
+            1989:      6(int) Load 8(invocation)
+            1990:     72(ptr) AccessChain 27(data) 38 38
+            1991:   20(ivec4) Load 1990
+            1992:  556(bvec4) SLessThan 1991 555
+            1993:  556(bvec4) GroupNonUniformLogicalOr 34 ExclusiveScan 1992
+            1994:   20(ivec4) Select 1993 559 555
+            1995:     72(ptr) AccessChain 27(data) 1989 38
+                              Store 1995 1994
+            1996:      6(int) Load 8(invocation)
+            1997:     65(ptr) AccessChain 27(data) 29 38 30
+            1998:     19(int) Load 1997
+            1999:     19(int) GroupNonUniformBitwiseXor 34 ExclusiveScan 1998
+            2000:     65(ptr) AccessChain 27(data) 1996 38 30
+                              Store 2000 1999
+            2001:      6(int) Load 8(invocation)
+            2002:     72(ptr) AccessChain 27(data) 38 38
+            2003:   20(ivec4) Load 2002
+            2004:   71(ivec2) VectorShuffle 2003 2003 0 1
+            2005:   71(ivec2) GroupNonUniformBitwiseXor 34 ExclusiveScan 2004
+            2006:     72(ptr) AccessChain 27(data) 2001 38
+            2007:   20(ivec4) Load 2006
+            2008:   20(ivec4) VectorShuffle 2007 2005 4 5 2 3
+                              Store 2006 2008
+            2009:      6(int) Load 8(invocation)
+            2010:     72(ptr) AccessChain 27(data) 49 38
+            2011:   20(ivec4) Load 2010
+            2012:   81(ivec3) VectorShuffle 2011 2011 0 1 2
+            2013:   81(ivec3) GroupNonUniformBitwiseXor 34 ExclusiveScan 2012
+            2014:     72(ptr) AccessChain 27(data) 2009 38
+            2015:   20(ivec4) Load 2014
+            2016:   20(ivec4) VectorShuffle 2015 2013 4 5 6 3
+                              Store 2014 2016
+            2017:      6(int) Load 8(invocation)
+            2018:     72(ptr) AccessChain 27(data) 59 38
+            2019:   20(ivec4) Load 2018
+            2020:   20(ivec4) GroupNonUniformBitwiseXor 34 ExclusiveScan 2019
+            2021:     72(ptr) AccessChain 27(data) 2017 38
+                              Store 2021 2020
+            2022:      6(int) Load 8(invocation)
+            2023:     95(ptr) AccessChain 27(data) 29 49 30
+            2024:      6(int) Load 2023
+            2025:      6(int) GroupNonUniformBitwiseXor 34 ExclusiveScan 2024
+            2026:     95(ptr) AccessChain 27(data) 2022 49 30
+                              Store 2026 2025
+            2027:      6(int) Load 8(invocation)
+            2028:    102(ptr) AccessChain 27(data) 38 49
+            2029:   21(ivec4) Load 2028
+            2030:  101(ivec2) VectorShuffle 2029 2029 0 1
+            2031:  101(ivec2) GroupNonUniformBitwiseXor 34 ExclusiveScan 2030
+            2032:    102(ptr) AccessChain 27(data) 2027 49
+            2033:   21(ivec4) Load 2032
+            2034:   21(ivec4) VectorShuffle 2033 2031 4 5 2 3
+                              Store 2032 2034
+            2035:      6(int) Load 8(invocation)
+            2036:    102(ptr) AccessChain 27(data) 49 49
+            2037:   21(ivec4) Load 2036
+            2038:  111(ivec3) VectorShuffle 2037 2037 0 1 2
+            2039:  111(ivec3) GroupNonUniformBitwiseXor 34 ExclusiveScan 2038
+            2040:    102(ptr) AccessChain 27(data) 2035 49
+            2041:   21(ivec4) Load 2040
+            2042:   21(ivec4) VectorShuffle 2041 2039 4 5 6 3
+                              Store 2040 2042
+            2043:      6(int) Load 8(invocation)
+            2044:    102(ptr) AccessChain 27(data) 59 49
+            2045:   21(ivec4) Load 2044
+            2046:   21(ivec4) GroupNonUniformBitwiseXor 34 ExclusiveScan 2045
+            2047:    102(ptr) AccessChain 27(data) 2043 49
+                              Store 2047 2046
+            2048:      6(int) Load 8(invocation)
+            2049:     65(ptr) AccessChain 27(data) 29 38 30
+            2050:     19(int) Load 2049
+            2051:   521(bool) SLessThan 2050 29
+            2052:   521(bool) GroupNonUniformLogicalXor 34 ExclusiveScan 2051
+            2053:     19(int) Select 2052 38 29
+            2054:     65(ptr) AccessChain 27(data) 2048 38 30
+                              Store 2054 2053
+            2055:      6(int) Load 8(invocation)
+            2056:     72(ptr) AccessChain 27(data) 38 38
+            2057:   20(ivec4) Load 2056
+            2058:   71(ivec2) VectorShuffle 2057 2057 0 1
+            2059:  531(bvec2) SLessThan 2058 530
+            2060:  531(bvec2) GroupNonUniformLogicalXor 34 ExclusiveScan 2059
+            2061:   71(ivec2) Select 2060 534 530
+            2062:     72(ptr) AccessChain 27(data) 2055 38
+            2063:   20(ivec4) Load 2062
+            2064:   20(ivec4) VectorShuffle 2063 2061 4 5 2 3
+                              Store 2062 2064
+            2065:      6(int) Load 8(invocation)
+            2066:     72(ptr) AccessChain 27(data) 38 38
+            2067:   20(ivec4) Load 2066
+            2068:   81(ivec3) VectorShuffle 2067 2067 0 1 2
+            2069:  544(bvec3) SLessThan 2068 543
+            2070:  544(bvec3) GroupNonUniformLogicalXor 34 ExclusiveScan 2069
+            2071:   81(ivec3) Select 2070 547 543
+            2072:     72(ptr) AccessChain 27(data) 2065 38
+            2073:   20(ivec4) Load 2072
+            2074:   20(ivec4) VectorShuffle 2073 2071 4 5 6 3
+                              Store 2072 2074
+            2075:      6(int) Load 8(invocation)
+            2076:     72(ptr) AccessChain 27(data) 38 38
+            2077:   20(ivec4) Load 2076
+            2078:  556(bvec4) SLessThan 2077 555
+            2079:  556(bvec4) GroupNonUniformLogicalXor 34 ExclusiveScan 2078
+            2080:   20(ivec4) Select 2079 559 555
+            2081:     72(ptr) AccessChain 27(data) 2075 38
+                              Store 2081 2080
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.subgroupBallot.comp.out b/Test/baseResults/spv.subgroupBallot.comp.out
new file mode 100644
index 0000000..ea152d9
--- /dev/null
+++ b/Test/baseResults/spv.subgroupBallot.comp.out
@@ -0,0 +1,505 @@
+spv.subgroupBallot.comp
+// Module Version 10300
+// Generated by (magic number): 80007
+// Id's are bound by 397
+
+                              Capability Shader
+                              Capability Float64
+                              Capability GroupNonUniform
+                              Capability GroupNonUniformBallot
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint GLCompute 4  "main" 10 12 21 23 26 29 32
+                              ExecutionMode 4 LocalSize 8 8 1
+                              Source GLSL 450
+                              SourceExtension  "GL_KHR_shader_subgroup_ballot"
+                              SourceExtension  "GL_KHR_shader_subgroup_basic"
+                              Name 4  "main"
+                              Name 8  "invocation"
+                              Name 10  "gl_SubgroupInvocationID"
+                              Name 12  "gl_SubgroupSize"
+                              Name 19  "relMask"
+                              Name 21  "gl_SubgroupEqMask"
+                              Name 23  "gl_SubgroupGeMask"
+                              Name 26  "gl_SubgroupGtMask"
+                              Name 29  "gl_SubgroupLeMask"
+                              Name 32  "gl_SubgroupLtMask"
+                              Name 35  "result"
+                              Name 46  "Buffers"
+                              MemberName 46(Buffers) 0  "f4"
+                              MemberName 46(Buffers) 1  "i4"
+                              MemberName 46(Buffers) 2  "u4"
+                              MemberName 46(Buffers) 3  "d4"
+                              Name 49  "data"
+                              Decorate 10(gl_SubgroupInvocationID) RelaxedPrecision
+                              Decorate 10(gl_SubgroupInvocationID) BuiltIn SubgroupLocalInvocationId
+                              Decorate 11 RelaxedPrecision
+                              Decorate 12(gl_SubgroupSize) RelaxedPrecision
+                              Decorate 12(gl_SubgroupSize) BuiltIn SubgroupSize
+                              Decorate 13 RelaxedPrecision
+                              Decorate 14 RelaxedPrecision
+                              Decorate 16 RelaxedPrecision
+                              Decorate 21(gl_SubgroupEqMask) BuiltIn SubgroupEqMaskKHR
+                              Decorate 23(gl_SubgroupGeMask) BuiltIn SubgroupGeMaskKHR
+                              Decorate 26(gl_SubgroupGtMask) BuiltIn SubgroupGtMaskKHR
+                              Decorate 29(gl_SubgroupLeMask) BuiltIn SubgroupLeMaskKHR
+                              Decorate 32(gl_SubgroupLtMask) BuiltIn SubgroupLtMaskKHR
+                              MemberDecorate 46(Buffers) 0 Offset 0
+                              MemberDecorate 46(Buffers) 1 Offset 16
+                              MemberDecorate 46(Buffers) 2 Offset 32
+                              MemberDecorate 46(Buffers) 3 Offset 64
+                              Decorate 46(Buffers) Block
+                              Decorate 49(data) DescriptorSet 0
+                              Decorate 49(data) Binding 0
+                              Decorate 396 BuiltIn WorkgroupSize
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeInt 32 0
+               7:             TypePointer Function 6(int)
+               9:             TypePointer Input 6(int)
+10(gl_SubgroupInvocationID):      9(ptr) Variable Input
+12(gl_SubgroupSize):      9(ptr) Variable Input
+              15:      6(int) Constant 4
+              17:             TypeVector 6(int) 4
+              18:             TypePointer Function 17(ivec4)
+              20:             TypePointer Input 17(ivec4)
+21(gl_SubgroupEqMask):     20(ptr) Variable Input
+23(gl_SubgroupGeMask):     20(ptr) Variable Input
+26(gl_SubgroupGtMask):     20(ptr) Variable Input
+29(gl_SubgroupLeMask):     20(ptr) Variable Input
+32(gl_SubgroupLtMask):     20(ptr) Variable Input
+              36:             TypeBool
+              37:    36(bool) ConstantTrue
+              38:      6(int) Constant 3
+              40:             TypeFloat 32
+              41:             TypeVector 40(float) 4
+              42:             TypeInt 32 1
+              43:             TypeVector 42(int) 4
+              44:             TypeFloat 64
+              45:             TypeVector 44(float64_t) 4
+     46(Buffers):             TypeStruct 41(fvec4) 43(ivec4) 17(ivec4) 45(f64vec4)
+              47:             TypeArray 46(Buffers) 15
+              48:             TypePointer StorageBuffer 47
+        49(data):     48(ptr) Variable StorageBuffer
+              51:     42(int) Constant 2
+              54:      6(int) Constant 0
+              55:             TypePointer StorageBuffer 6(int)
+              60:     42(int) Constant 1
+              61:     42(int) Constant 0
+              64:      6(int) Constant 1
+              72:      6(int) Constant 2
+              83:             TypeVector 36(bool) 4
+              88:             TypePointer StorageBuffer 17(ivec4)
+              96:             TypePointer StorageBuffer 40(float)
+             102:             TypeVector 40(float) 2
+             103:             TypePointer StorageBuffer 41(fvec4)
+             112:             TypeVector 40(float) 3
+             121:     42(int) Constant 3
+             127:             TypePointer StorageBuffer 42(int)
+             133:             TypeVector 42(int) 2
+             134:             TypePointer StorageBuffer 43(ivec4)
+             143:             TypeVector 42(int) 3
+             162:             TypeVector 6(int) 2
+             171:             TypeVector 6(int) 3
+             185:             TypePointer StorageBuffer 44(float64_t)
+             191:             TypeVector 44(float64_t) 2
+             192:             TypePointer StorageBuffer 45(f64vec4)
+             201:             TypeVector 44(float64_t) 3
+             225:  133(ivec2) ConstantComposite 61 61
+             226:             TypeVector 36(bool) 2
+             229:  133(ivec2) ConstantComposite 60 60
+             238:  143(ivec3) ConstantComposite 61 61 61
+             239:             TypeVector 36(bool) 3
+             242:  143(ivec3) ConstantComposite 60 60 60
+             250:   43(ivec4) ConstantComposite 61 61 61 61
+             253:   43(ivec4) ConstantComposite 60 60 60 60
+             395:      6(int) Constant 8
+             396:  171(ivec3) ConstantComposite 395 395 64
+         4(main):           2 Function None 3
+               5:             Label
+   8(invocation):      7(ptr) Variable Function
+     19(relMask):     18(ptr) Variable Function
+      35(result):     18(ptr) Variable Function
+              11:      6(int) Load 10(gl_SubgroupInvocationID)
+              13:      6(int) Load 12(gl_SubgroupSize)
+              14:      6(int) IAdd 11 13
+              16:      6(int) UMod 14 15
+                              Store 8(invocation) 16
+              22:   17(ivec4) Load 21(gl_SubgroupEqMask)
+              24:   17(ivec4) Load 23(gl_SubgroupGeMask)
+              25:   17(ivec4) IAdd 22 24
+              27:   17(ivec4) Load 26(gl_SubgroupGtMask)
+              28:   17(ivec4) IAdd 25 27
+              30:   17(ivec4) Load 29(gl_SubgroupLeMask)
+              31:   17(ivec4) IAdd 28 30
+              33:   17(ivec4) Load 32(gl_SubgroupLtMask)
+              34:   17(ivec4) IAdd 31 33
+                              Store 19(relMask) 34
+              39:   17(ivec4) GroupNonUniformBallot 38 37
+                              Store 35(result) 39
+              50:      6(int) Load 8(invocation)
+              52:   17(ivec4) Load 35(result)
+              53:      6(int) GroupNonUniformBallotBitCount 38 Reduce 52
+              56:     55(ptr) AccessChain 49(data) 50 51 54
+                              Store 56 53
+              57:      6(int) Load 8(invocation)
+              58:   17(ivec4) Load 35(result)
+              59:    36(bool) GroupNonUniformBallotBitExtract 38 58 54
+              62:     42(int) Select 59 60 61
+              63:      6(int) Bitcast 62
+              65:     55(ptr) AccessChain 49(data) 57 51 64
+                              Store 65 63
+              66:      6(int) Load 8(invocation)
+              67:   17(ivec4) Load 35(result)
+              68:      6(int) GroupNonUniformBallotBitCount 38 InclusiveScan 67
+              69:   17(ivec4) Load 35(result)
+              70:      6(int) GroupNonUniformBallotBitCount 38 ExclusiveScan 69
+              71:      6(int) IAdd 68 70
+              73:     55(ptr) AccessChain 49(data) 66 51 72
+                              Store 73 71
+              74:      6(int) Load 8(invocation)
+              75:   17(ivec4) Load 35(result)
+              76:      6(int) GroupNonUniformBallotFindLSB 38 75
+              77:   17(ivec4) Load 35(result)
+              78:      6(int) GroupNonUniformBallotFindMSB 38 77
+              79:      6(int) IAdd 76 78
+              80:     55(ptr) AccessChain 49(data) 74 51 38
+                              Store 80 79
+              81:   17(ivec4) Load 19(relMask)
+              82:   17(ivec4) Load 35(result)
+              84:   83(bvec4) IEqual 81 82
+              85:    36(bool) All 84
+                              SelectionMerge 87 None
+                              BranchConditional 85 86 87
+              86:               Label
+              89:     88(ptr)   AccessChain 49(data) 61 51
+              90:   17(ivec4)   Load 89
+              91:    36(bool)   GroupNonUniformInverseBallot 38 90
+                                Branch 87
+              87:             Label
+              92:    36(bool) Phi 85 5 91 86
+                              SelectionMerge 94 None
+                              BranchConditional 92 93 256
+              93:               Label
+              95:      6(int)   Load 8(invocation)
+              97:     96(ptr)   AccessChain 49(data) 61 61 54
+              98:   40(float)   Load 97
+              99:   40(float)   GroupNonUniformBroadcast 38 98 38
+             100:     96(ptr)   AccessChain 49(data) 95 61 54
+                                Store 100 99
+             101:      6(int)   Load 8(invocation)
+             104:    103(ptr)   AccessChain 49(data) 60 61
+             105:   41(fvec4)   Load 104
+             106:  102(fvec2)   VectorShuffle 105 105 0 1
+             107:  102(fvec2)   GroupNonUniformBroadcast 38 106 38
+             108:    103(ptr)   AccessChain 49(data) 101 61
+             109:   41(fvec4)   Load 108
+             110:   41(fvec4)   VectorShuffle 109 107 4 5 2 3
+                                Store 108 110
+             111:      6(int)   Load 8(invocation)
+             113:    103(ptr)   AccessChain 49(data) 51 61
+             114:   41(fvec4)   Load 113
+             115:  112(fvec3)   VectorShuffle 114 114 0 1 2
+             116:  112(fvec3)   GroupNonUniformBroadcast 38 115 38
+             117:    103(ptr)   AccessChain 49(data) 111 61
+             118:   41(fvec4)   Load 117
+             119:   41(fvec4)   VectorShuffle 118 116 4 5 6 3
+                                Store 117 119
+             120:      6(int)   Load 8(invocation)
+             122:    103(ptr)   AccessChain 49(data) 121 61
+             123:   41(fvec4)   Load 122
+             124:   41(fvec4)   GroupNonUniformBroadcast 38 123 38
+             125:    103(ptr)   AccessChain 49(data) 120 61
+                                Store 125 124
+             126:      6(int)   Load 8(invocation)
+             128:    127(ptr)   AccessChain 49(data) 61 60 54
+             129:     42(int)   Load 128
+             130:     42(int)   GroupNonUniformBroadcast 38 129 72
+             131:    127(ptr)   AccessChain 49(data) 126 60 54
+                                Store 131 130
+             132:      6(int)   Load 8(invocation)
+             135:    134(ptr)   AccessChain 49(data) 60 60
+             136:   43(ivec4)   Load 135
+             137:  133(ivec2)   VectorShuffle 136 136 0 1
+             138:  133(ivec2)   GroupNonUniformBroadcast 38 137 72
+             139:    134(ptr)   AccessChain 49(data) 132 60
+             140:   43(ivec4)   Load 139
+             141:   43(ivec4)   VectorShuffle 140 138 4 5 2 3
+                                Store 139 141
+             142:      6(int)   Load 8(invocation)
+             144:    134(ptr)   AccessChain 49(data) 51 60
+             145:   43(ivec4)   Load 144
+             146:  143(ivec3)   VectorShuffle 145 145 0 1 2
+             147:  143(ivec3)   GroupNonUniformBroadcast 38 146 72
+             148:    134(ptr)   AccessChain 49(data) 142 60
+             149:   43(ivec4)   Load 148
+             150:   43(ivec4)   VectorShuffle 149 147 4 5 6 3
+                                Store 148 150
+             151:      6(int)   Load 8(invocation)
+             152:    134(ptr)   AccessChain 49(data) 121 60
+             153:   43(ivec4)   Load 152
+             154:   43(ivec4)   GroupNonUniformBroadcast 38 153 72
+             155:    134(ptr)   AccessChain 49(data) 151 60
+                                Store 155 154
+             156:      6(int)   Load 8(invocation)
+             157:     55(ptr)   AccessChain 49(data) 61 51 54
+             158:      6(int)   Load 157
+             159:      6(int)   GroupNonUniformBroadcast 38 158 64
+             160:     55(ptr)   AccessChain 49(data) 156 51 54
+                                Store 160 159
+             161:      6(int)   Load 8(invocation)
+             163:     88(ptr)   AccessChain 49(data) 60 51
+             164:   17(ivec4)   Load 163
+             165:  162(ivec2)   VectorShuffle 164 164 0 1
+             166:  162(ivec2)   GroupNonUniformBroadcast 38 165 64
+             167:     88(ptr)   AccessChain 49(data) 161 51
+             168:   17(ivec4)   Load 167
+             169:   17(ivec4)   VectorShuffle 168 166 4 5 2 3
+                                Store 167 169
+             170:      6(int)   Load 8(invocation)
+             172:     88(ptr)   AccessChain 49(data) 51 51
+             173:   17(ivec4)   Load 172
+             174:  171(ivec3)   VectorShuffle 173 173 0 1 2
+             175:  171(ivec3)   GroupNonUniformBroadcast 38 174 64
+             176:     88(ptr)   AccessChain 49(data) 170 51
+             177:   17(ivec4)   Load 176
+             178:   17(ivec4)   VectorShuffle 177 175 4 5 6 3
+                                Store 176 178
+             179:      6(int)   Load 8(invocation)
+             180:     88(ptr)   AccessChain 49(data) 121 51
+             181:   17(ivec4)   Load 180
+             182:   17(ivec4)   GroupNonUniformBroadcast 38 181 64
+             183:     88(ptr)   AccessChain 49(data) 179 51
+                                Store 183 182
+             184:      6(int)   Load 8(invocation)
+             186:    185(ptr)   AccessChain 49(data) 61 121 54
+             187:44(float64_t)   Load 186
+             188:44(float64_t)   GroupNonUniformBroadcast 38 187 54
+             189:    185(ptr)   AccessChain 49(data) 184 121 54
+                                Store 189 188
+             190:      6(int)   Load 8(invocation)
+             193:    192(ptr)   AccessChain 49(data) 60 121
+             194: 45(f64vec4)   Load 193
+             195:191(f64vec2)   VectorShuffle 194 194 0 1
+             196:191(f64vec2)   GroupNonUniformBroadcast 38 195 54
+             197:    192(ptr)   AccessChain 49(data) 190 121
+             198: 45(f64vec4)   Load 197
+             199: 45(f64vec4)   VectorShuffle 198 196 4 5 2 3
+                                Store 197 199
+             200:      6(int)   Load 8(invocation)
+             202:    192(ptr)   AccessChain 49(data) 51 121
+             203: 45(f64vec4)   Load 202
+             204:201(f64vec3)   VectorShuffle 203 203 0 1 2
+             205:201(f64vec3)   GroupNonUniformBroadcast 38 204 54
+             206:    192(ptr)   AccessChain 49(data) 200 121
+             207: 45(f64vec4)   Load 206
+             208: 45(f64vec4)   VectorShuffle 207 205 4 5 6 3
+                                Store 206 208
+             209:      6(int)   Load 8(invocation)
+             210:    192(ptr)   AccessChain 49(data) 121 121
+             211: 45(f64vec4)   Load 210
+             212: 45(f64vec4)   GroupNonUniformBroadcast 38 211 54
+             213:    192(ptr)   AccessChain 49(data) 209 121
+                                Store 213 212
+             214:      6(int)   Load 8(invocation)
+             215:    127(ptr)   AccessChain 49(data) 61 60 54
+             216:     42(int)   Load 215
+             217:    36(bool)   SLessThan 216 61
+             218:    36(bool)   GroupNonUniformBroadcast 38 217 64
+             219:     42(int)   Select 218 60 61
+             220:    127(ptr)   AccessChain 49(data) 214 60 54
+                                Store 220 219
+             221:      6(int)   Load 8(invocation)
+             222:    134(ptr)   AccessChain 49(data) 60 60
+             223:   43(ivec4)   Load 222
+             224:  133(ivec2)   VectorShuffle 223 223 0 1
+             227:  226(bvec2)   SLessThan 224 225
+             228:  226(bvec2)   GroupNonUniformBroadcast 38 227 64
+             230:  133(ivec2)   Select 228 229 225
+             231:    134(ptr)   AccessChain 49(data) 221 60
+             232:   43(ivec4)   Load 231
+             233:   43(ivec4)   VectorShuffle 232 230 4 5 2 3
+                                Store 231 233
+             234:      6(int)   Load 8(invocation)
+             235:    134(ptr)   AccessChain 49(data) 60 60
+             236:   43(ivec4)   Load 235
+             237:  143(ivec3)   VectorShuffle 236 236 0 1 2
+             240:  239(bvec3)   SLessThan 237 238
+             241:  239(bvec3)   GroupNonUniformBroadcast 38 240 64
+             243:  143(ivec3)   Select 241 242 238
+             244:    134(ptr)   AccessChain 49(data) 234 60
+             245:   43(ivec4)   Load 244
+             246:   43(ivec4)   VectorShuffle 245 243 4 5 6 3
+                                Store 244 246
+             247:      6(int)   Load 8(invocation)
+             248:    134(ptr)   AccessChain 49(data) 60 60
+             249:   43(ivec4)   Load 248
+             251:   83(bvec4)   SLessThan 249 250
+             252:   83(bvec4)   GroupNonUniformBroadcast 38 251 64
+             254:   43(ivec4)   Select 252 253 250
+             255:    134(ptr)   AccessChain 49(data) 247 60
+                                Store 255 254
+                                Branch 94
+             256:               Label
+             257:      6(int)   Load 8(invocation)
+             258:     96(ptr)   AccessChain 49(data) 61 61 54
+             259:   40(float)   Load 258
+             260:   40(float)   GroupNonUniformBroadcastFirst 38 259
+             261:     96(ptr)   AccessChain 49(data) 257 61 54
+                                Store 261 260
+             262:      6(int)   Load 8(invocation)
+             263:    103(ptr)   AccessChain 49(data) 60 61
+             264:   41(fvec4)   Load 263
+             265:  102(fvec2)   VectorShuffle 264 264 0 1
+             266:  102(fvec2)   GroupNonUniformBroadcastFirst 38 265
+             267:    103(ptr)   AccessChain 49(data) 262 61
+             268:   41(fvec4)   Load 267
+             269:   41(fvec4)   VectorShuffle 268 266 4 5 2 3
+                                Store 267 269
+             270:      6(int)   Load 8(invocation)
+             271:    103(ptr)   AccessChain 49(data) 51 61
+             272:   41(fvec4)   Load 271
+             273:  112(fvec3)   VectorShuffle 272 272 0 1 2
+             274:  112(fvec3)   GroupNonUniformBroadcastFirst 38 273
+             275:    103(ptr)   AccessChain 49(data) 270 61
+             276:   41(fvec4)   Load 275
+             277:   41(fvec4)   VectorShuffle 276 274 4 5 6 3
+                                Store 275 277
+             278:      6(int)   Load 8(invocation)
+             279:    103(ptr)   AccessChain 49(data) 121 61
+             280:   41(fvec4)   Load 279
+             281:   41(fvec4)   GroupNonUniformBroadcastFirst 38 280
+             282:    103(ptr)   AccessChain 49(data) 278 61
+                                Store 282 281
+             283:      6(int)   Load 8(invocation)
+             284:    127(ptr)   AccessChain 49(data) 61 60 54
+             285:     42(int)   Load 284
+             286:     42(int)   GroupNonUniformBroadcastFirst 38 285
+             287:    127(ptr)   AccessChain 49(data) 283 60 54
+                                Store 287 286
+             288:      6(int)   Load 8(invocation)
+             289:    134(ptr)   AccessChain 49(data) 60 60
+             290:   43(ivec4)   Load 289
+             291:  133(ivec2)   VectorShuffle 290 290 0 1
+             292:  133(ivec2)   GroupNonUniformBroadcastFirst 38 291
+             293:    134(ptr)   AccessChain 49(data) 288 60
+             294:   43(ivec4)   Load 293
+             295:   43(ivec4)   VectorShuffle 294 292 4 5 2 3
+                                Store 293 295
+             296:      6(int)   Load 8(invocation)
+             297:    134(ptr)   AccessChain 49(data) 51 60
+             298:   43(ivec4)   Load 297
+             299:  143(ivec3)   VectorShuffle 298 298 0 1 2
+             300:  143(ivec3)   GroupNonUniformBroadcastFirst 38 299
+             301:    134(ptr)   AccessChain 49(data) 296 60
+             302:   43(ivec4)   Load 301
+             303:   43(ivec4)   VectorShuffle 302 300 4 5 6 3
+                                Store 301 303
+             304:      6(int)   Load 8(invocation)
+             305:    134(ptr)   AccessChain 49(data) 121 60
+             306:   43(ivec4)   Load 305
+             307:   43(ivec4)   GroupNonUniformBroadcastFirst 38 306
+             308:    134(ptr)   AccessChain 49(data) 304 60
+                                Store 308 307
+             309:      6(int)   Load 8(invocation)
+             310:     55(ptr)   AccessChain 49(data) 61 51 54
+             311:      6(int)   Load 310
+             312:      6(int)   GroupNonUniformBroadcastFirst 38 311
+             313:     55(ptr)   AccessChain 49(data) 309 51 54
+                                Store 313 312
+             314:      6(int)   Load 8(invocation)
+             315:     88(ptr)   AccessChain 49(data) 60 51
+             316:   17(ivec4)   Load 315
+             317:  162(ivec2)   VectorShuffle 316 316 0 1
+             318:  162(ivec2)   GroupNonUniformBroadcastFirst 38 317
+             319:     88(ptr)   AccessChain 49(data) 314 51
+             320:   17(ivec4)   Load 319
+             321:   17(ivec4)   VectorShuffle 320 318 4 5 2 3
+                                Store 319 321
+             322:      6(int)   Load 8(invocation)
+             323:     88(ptr)   AccessChain 49(data) 51 51
+             324:   17(ivec4)   Load 323
+             325:  171(ivec3)   VectorShuffle 324 324 0 1 2
+             326:  171(ivec3)   GroupNonUniformBroadcastFirst 38 325
+             327:     88(ptr)   AccessChain 49(data) 322 51
+             328:   17(ivec4)   Load 327
+             329:   17(ivec4)   VectorShuffle 328 326 4 5 6 3
+                                Store 327 329
+             330:      6(int)   Load 8(invocation)
+             331:     88(ptr)   AccessChain 49(data) 121 51
+             332:   17(ivec4)   Load 331
+             333:   17(ivec4)   GroupNonUniformBroadcastFirst 38 332
+             334:     88(ptr)   AccessChain 49(data) 330 51
+                                Store 334 333
+             335:      6(int)   Load 8(invocation)
+             336:    185(ptr)   AccessChain 49(data) 61 121 54
+             337:44(float64_t)   Load 336
+             338:44(float64_t)   GroupNonUniformBroadcastFirst 38 337
+             339:    185(ptr)   AccessChain 49(data) 335 121 54
+                                Store 339 338
+             340:      6(int)   Load 8(invocation)
+             341:    192(ptr)   AccessChain 49(data) 60 121
+             342: 45(f64vec4)   Load 341
+             343:191(f64vec2)   VectorShuffle 342 342 0 1
+             344:191(f64vec2)   GroupNonUniformBroadcastFirst 38 343
+             345:    192(ptr)   AccessChain 49(data) 340 121
+             346: 45(f64vec4)   Load 345
+             347: 45(f64vec4)   VectorShuffle 346 344 4 5 2 3
+                                Store 345 347
+             348:      6(int)   Load 8(invocation)
+             349:    192(ptr)   AccessChain 49(data) 51 121
+             350: 45(f64vec4)   Load 349
+             351:201(f64vec3)   VectorShuffle 350 350 0 1 2
+             352:201(f64vec3)   GroupNonUniformBroadcastFirst 38 351
+             353:    192(ptr)   AccessChain 49(data) 348 121
+             354: 45(f64vec4)   Load 353
+             355: 45(f64vec4)   VectorShuffle 354 352 4 5 6 3
+                                Store 353 355
+             356:      6(int)   Load 8(invocation)
+             357:    192(ptr)   AccessChain 49(data) 121 121
+             358: 45(f64vec4)   Load 357
+             359: 45(f64vec4)   GroupNonUniformBroadcastFirst 38 358
+             360:    192(ptr)   AccessChain 49(data) 356 121
+                                Store 360 359
+             361:      6(int)   Load 8(invocation)
+             362:    127(ptr)   AccessChain 49(data) 61 60 54
+             363:     42(int)   Load 362
+             364:    36(bool)   SLessThan 363 61
+             365:    36(bool)   GroupNonUniformBroadcastFirst 38 364
+             366:     42(int)   Select 365 60 61
+             367:    127(ptr)   AccessChain 49(data) 361 60 54
+                                Store 367 366
+             368:      6(int)   Load 8(invocation)
+             369:    134(ptr)   AccessChain 49(data) 60 60
+             370:   43(ivec4)   Load 369
+             371:  133(ivec2)   VectorShuffle 370 370 0 1
+             372:  226(bvec2)   SLessThan 371 225
+             373:  226(bvec2)   GroupNonUniformBroadcastFirst 38 372
+             374:  133(ivec2)   Select 373 229 225
+             375:    134(ptr)   AccessChain 49(data) 368 60
+             376:   43(ivec4)   Load 375
+             377:   43(ivec4)   VectorShuffle 376 374 4 5 2 3
+                                Store 375 377
+             378:      6(int)   Load 8(invocation)
+             379:    134(ptr)   AccessChain 49(data) 60 60
+             380:   43(ivec4)   Load 379
+             381:  143(ivec3)   VectorShuffle 380 380 0 1 2
+             382:  239(bvec3)   SLessThan 381 238
+             383:  239(bvec3)   GroupNonUniformBroadcastFirst 38 382
+             384:  143(ivec3)   Select 383 242 238
+             385:    134(ptr)   AccessChain 49(data) 378 60
+             386:   43(ivec4)   Load 385
+             387:   43(ivec4)   VectorShuffle 386 384 4 5 6 3
+                                Store 385 387
+             388:      6(int)   Load 8(invocation)
+             389:    134(ptr)   AccessChain 49(data) 60 60
+             390:   43(ivec4)   Load 389
+             391:   83(bvec4)   SLessThan 390 250
+             392:   83(bvec4)   GroupNonUniformBroadcastFirst 38 391
+             393:   43(ivec4)   Select 392 253 250
+             394:    134(ptr)   AccessChain 49(data) 388 60
+                                Store 394 393
+                                Branch 94
+              94:             Label
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.subgroupBallotNeg.comp.out b/Test/baseResults/spv.subgroupBallotNeg.comp.out
new file mode 100755
index 0000000..49b6b54
--- /dev/null
+++ b/Test/baseResults/spv.subgroupBallotNeg.comp.out
@@ -0,0 +1,6 @@
+spv.subgroupBallotNeg.comp
+ERROR: 0:32: 'id' : argument must be compile-time constant 
+ERROR: 1 compilation errors.  No code generated.
+
+
+SPIR-V is not generated for failed compile or link
diff --git a/Test/baseResults/spv.subgroupBasic.comp.out b/Test/baseResults/spv.subgroupBasic.comp.out
new file mode 100644
index 0000000..641534d
--- /dev/null
+++ b/Test/baseResults/spv.subgroupBasic.comp.out
@@ -0,0 +1,84 @@
+spv.subgroupBasic.comp
+// Module Version 10300
+// Generated by (magic number): 80007
+// Id's are bound by 40
+
+                              Capability Shader
+                              Capability GroupNonUniform
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint GLCompute 4  "main" 14 19 22 25
+                              ExecutionMode 4 LocalSize 8 8 1
+                              Source GLSL 450
+                              SourceExtension  "GL_KHR_shader_subgroup_basic"
+                              Name 4  "main"
+                              Name 8  "Buffer"
+                              MemberName 8(Buffer) 0  "a"
+                              Name 10  "data"
+                              Name 14  "gl_SubgroupSize"
+                              Name 19  "gl_SubgroupInvocationID"
+                              Name 22  "gl_NumSubgroups"
+                              Name 25  "gl_SubgroupID"
+                              Decorate 7 ArrayStride 4
+                              MemberDecorate 8(Buffer) 0 Offset 0
+                              Decorate 8(Buffer) Block
+                              Decorate 10(data) DescriptorSet 0
+                              Decorate 10(data) Binding 0
+                              Decorate 14(gl_SubgroupSize) RelaxedPrecision
+                              Decorate 14(gl_SubgroupSize) BuiltIn SubgroupSize
+                              Decorate 15 RelaxedPrecision
+                              Decorate 19(gl_SubgroupInvocationID) RelaxedPrecision
+                              Decorate 19(gl_SubgroupInvocationID) BuiltIn SubgroupLocalInvocationId
+                              Decorate 20 RelaxedPrecision
+                              Decorate 22(gl_NumSubgroups) BuiltIn NumSubgroups
+                              Decorate 25(gl_SubgroupID) BuiltIn SubgroupId
+                              Decorate 39 BuiltIn WorkgroupSize
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeInt 32 1
+               7:             TypeRuntimeArray 6(int)
+       8(Buffer):             TypeStruct 7
+               9:             TypePointer StorageBuffer 8(Buffer)
+        10(data):      9(ptr) Variable StorageBuffer
+              11:      6(int) Constant 0
+              12:             TypeInt 32 0
+              13:             TypePointer Input 12(int)
+14(gl_SubgroupSize):     13(ptr) Variable Input
+              16:      6(int) Constant 1
+              17:             TypePointer StorageBuffer 6(int)
+19(gl_SubgroupInvocationID):     13(ptr) Variable Input
+22(gl_NumSubgroups):     13(ptr) Variable Input
+25(gl_SubgroupID):     13(ptr) Variable Input
+              27:             TypeBool
+              28:     12(int) Constant 3
+              32:     12(int) Constant 3400
+              33:     12(int) Constant 72
+              34:     12(int) Constant 264
+              35:     12(int) Constant 2056
+              36:             TypeVector 12(int) 3
+              37:     12(int) Constant 8
+              38:     12(int) Constant 1
+              39:   36(ivec3) ConstantComposite 37 37 38
+         4(main):           2 Function None 3
+               5:             Label
+              15:     12(int) Load 14(gl_SubgroupSize)
+              18:     17(ptr) AccessChain 10(data) 11 15
+                              Store 18 16
+              20:     12(int) Load 19(gl_SubgroupInvocationID)
+              21:     17(ptr) AccessChain 10(data) 11 20
+                              Store 21 16
+              23:     12(int) Load 22(gl_NumSubgroups)
+              24:     17(ptr) AccessChain 10(data) 11 23
+                              Store 24 16
+              26:     12(int) Load 25(gl_SubgroupID)
+              29:    27(bool) GroupNonUniformElect 28
+              30:      6(int) Select 29 16 11
+              31:     17(ptr) AccessChain 10(data) 11 26
+                              Store 31 30
+                              ControlBarrier 28 28 32
+                              MemoryBarrier 28 32
+                              MemoryBarrier 28 33
+                              MemoryBarrier 28 34
+                              MemoryBarrier 28 35
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.subgroupClustered.comp.out b/Test/baseResults/spv.subgroupClustered.comp.out
new file mode 100644
index 0000000..150eb8a
--- /dev/null
+++ b/Test/baseResults/spv.subgroupClustered.comp.out
@@ -0,0 +1,880 @@
+spv.subgroupClustered.comp
+// Module Version 10300
+// Generated by (magic number): 80007
+// Id's are bound by 737
+
+                              Capability Shader
+                              Capability Float64
+                              Capability GroupNonUniform
+                              Capability GroupNonUniformClustered
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint GLCompute 4  "main" 10 12
+                              ExecutionMode 4 LocalSize 8 1 1
+                              Source GLSL 450
+                              SourceExtension  "GL_KHR_shader_subgroup_basic"
+                              SourceExtension  "GL_KHR_shader_subgroup_clustered"
+                              Name 4  "main"
+                              Name 8  "invocation"
+                              Name 10  "gl_SubgroupInvocationID"
+                              Name 12  "gl_SubgroupSize"
+                              Name 24  "Buffers"
+                              MemberName 24(Buffers) 0  "f4"
+                              MemberName 24(Buffers) 1  "i4"
+                              MemberName 24(Buffers) 2  "u4"
+                              MemberName 24(Buffers) 3  "d4"
+                              Name 27  "data"
+                              Decorate 10(gl_SubgroupInvocationID) RelaxedPrecision
+                              Decorate 10(gl_SubgroupInvocationID) BuiltIn SubgroupLocalInvocationId
+                              Decorate 11 RelaxedPrecision
+                              Decorate 12(gl_SubgroupSize) RelaxedPrecision
+                              Decorate 12(gl_SubgroupSize) BuiltIn SubgroupSize
+                              Decorate 13 RelaxedPrecision
+                              Decorate 14 RelaxedPrecision
+                              Decorate 16 RelaxedPrecision
+                              MemberDecorate 24(Buffers) 0 Offset 0
+                              MemberDecorate 24(Buffers) 1 Offset 16
+                              MemberDecorate 24(Buffers) 2 Offset 32
+                              MemberDecorate 24(Buffers) 3 Offset 64
+                              Decorate 24(Buffers) Block
+                              Decorate 27(data) DescriptorSet 0
+                              Decorate 27(data) Binding 0
+                              Decorate 736 BuiltIn WorkgroupSize
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeInt 32 0
+               7:             TypePointer Function 6(int)
+               9:             TypePointer Input 6(int)
+10(gl_SubgroupInvocationID):      9(ptr) Variable Input
+12(gl_SubgroupSize):      9(ptr) Variable Input
+              15:      6(int) Constant 4
+              17:             TypeFloat 32
+              18:             TypeVector 17(float) 4
+              19:             TypeInt 32 1
+              20:             TypeVector 19(int) 4
+              21:             TypeVector 6(int) 4
+              22:             TypeFloat 64
+              23:             TypeVector 22(float64_t) 4
+     24(Buffers):             TypeStruct 18(fvec4) 20(ivec4) 21(ivec4) 23(f64vec4)
+              25:             TypeArray 24(Buffers) 15
+              26:             TypePointer StorageBuffer 25
+        27(data):     26(ptr) Variable StorageBuffer
+              29:     19(int) Constant 0
+              30:      6(int) Constant 0
+              31:             TypePointer StorageBuffer 17(float)
+              34:      6(int) Constant 1
+              35:      6(int) Constant 3
+              39:     19(int) Constant 1
+              40:             TypeVector 17(float) 2
+              41:             TypePointer StorageBuffer 18(fvec4)
+              50:     19(int) Constant 2
+              51:             TypeVector 17(float) 3
+              60:     19(int) Constant 3
+              66:             TypePointer StorageBuffer 19(int)
+              72:             TypeVector 19(int) 2
+              73:             TypePointer StorageBuffer 20(ivec4)
+              82:             TypeVector 19(int) 3
+              96:             TypePointer StorageBuffer 6(int)
+             102:             TypeVector 6(int) 2
+             103:             TypePointer StorageBuffer 21(ivec4)
+             112:             TypeVector 6(int) 3
+             126:             TypePointer StorageBuffer 22(float64_t)
+             132:             TypeVector 22(float64_t) 2
+             133:             TypePointer StorageBuffer 23(f64vec4)
+             142:             TypeVector 22(float64_t) 3
+             522:             TypeBool
+             531:   72(ivec2) ConstantComposite 29 29
+             532:             TypeVector 522(bool) 2
+             535:   72(ivec2) ConstantComposite 39 39
+             544:   82(ivec3) ConstantComposite 29 29 29
+             545:             TypeVector 522(bool) 3
+             548:   82(ivec3) ConstantComposite 39 39 39
+             556:   20(ivec4) ConstantComposite 29 29 29 29
+             557:             TypeVector 522(bool) 4
+             560:   20(ivec4) ConstantComposite 39 39 39 39
+             735:      6(int) Constant 8
+             736:  112(ivec3) ConstantComposite 735 34 34
+         4(main):           2 Function None 3
+               5:             Label
+   8(invocation):      7(ptr) Variable Function
+              11:      6(int) Load 10(gl_SubgroupInvocationID)
+              13:      6(int) Load 12(gl_SubgroupSize)
+              14:      6(int) IAdd 11 13
+              16:      6(int) UMod 14 15
+                              Store 8(invocation) 16
+              28:      6(int) Load 8(invocation)
+              32:     31(ptr) AccessChain 27(data) 29 29 30
+              33:   17(float) Load 32
+              36:   17(float) GroupNonUniformFAdd 35 ClusteredReduce 33 34
+              37:     31(ptr) AccessChain 27(data) 28 29 30
+                              Store 37 36
+              38:      6(int) Load 8(invocation)
+              42:     41(ptr) AccessChain 27(data) 39 29
+              43:   18(fvec4) Load 42
+              44:   40(fvec2) VectorShuffle 43 43 0 1
+              45:   40(fvec2) GroupNonUniformFAdd 35 ClusteredReduce 44 34
+              46:     41(ptr) AccessChain 27(data) 38 29
+              47:   18(fvec4) Load 46
+              48:   18(fvec4) VectorShuffle 47 45 4 5 2 3
+                              Store 46 48
+              49:      6(int) Load 8(invocation)
+              52:     41(ptr) AccessChain 27(data) 50 29
+              53:   18(fvec4) Load 52
+              54:   51(fvec3) VectorShuffle 53 53 0 1 2
+              55:   51(fvec3) GroupNonUniformFAdd 35 ClusteredReduce 54 34
+              56:     41(ptr) AccessChain 27(data) 49 29
+              57:   18(fvec4) Load 56
+              58:   18(fvec4) VectorShuffle 57 55 4 5 6 3
+                              Store 56 58
+              59:      6(int) Load 8(invocation)
+              61:     41(ptr) AccessChain 27(data) 60 29
+              62:   18(fvec4) Load 61
+              63:   18(fvec4) GroupNonUniformFAdd 35 ClusteredReduce 62 34
+              64:     41(ptr) AccessChain 27(data) 59 29
+                              Store 64 63
+              65:      6(int) Load 8(invocation)
+              67:     66(ptr) AccessChain 27(data) 29 39 30
+              68:     19(int) Load 67
+              69:     19(int) GroupNonUniformIAdd 35 ClusteredReduce 68 34
+              70:     66(ptr) AccessChain 27(data) 65 39 30
+                              Store 70 69
+              71:      6(int) Load 8(invocation)
+              74:     73(ptr) AccessChain 27(data) 39 39
+              75:   20(ivec4) Load 74
+              76:   72(ivec2) VectorShuffle 75 75 0 1
+              77:   72(ivec2) GroupNonUniformIAdd 35 ClusteredReduce 76 34
+              78:     73(ptr) AccessChain 27(data) 71 39
+              79:   20(ivec4) Load 78
+              80:   20(ivec4) VectorShuffle 79 77 4 5 2 3
+                              Store 78 80
+              81:      6(int) Load 8(invocation)
+              83:     73(ptr) AccessChain 27(data) 50 39
+              84:   20(ivec4) Load 83
+              85:   82(ivec3) VectorShuffle 84 84 0 1 2
+              86:   82(ivec3) GroupNonUniformIAdd 35 ClusteredReduce 85 34
+              87:     73(ptr) AccessChain 27(data) 81 39
+              88:   20(ivec4) Load 87
+              89:   20(ivec4) VectorShuffle 88 86 4 5 6 3
+                              Store 87 89
+              90:      6(int) Load 8(invocation)
+              91:     73(ptr) AccessChain 27(data) 60 39
+              92:   20(ivec4) Load 91
+              93:   20(ivec4) GroupNonUniformIAdd 35 ClusteredReduce 92 34
+              94:     73(ptr) AccessChain 27(data) 90 39
+                              Store 94 93
+              95:      6(int) Load 8(invocation)
+              97:     96(ptr) AccessChain 27(data) 29 50 30
+              98:      6(int) Load 97
+              99:      6(int) GroupNonUniformIAdd 35 ClusteredReduce 98 34
+             100:     96(ptr) AccessChain 27(data) 95 50 30
+                              Store 100 99
+             101:      6(int) Load 8(invocation)
+             104:    103(ptr) AccessChain 27(data) 39 50
+             105:   21(ivec4) Load 104
+             106:  102(ivec2) VectorShuffle 105 105 0 1
+             107:  102(ivec2) GroupNonUniformIAdd 35 ClusteredReduce 106 34
+             108:    103(ptr) AccessChain 27(data) 101 50
+             109:   21(ivec4) Load 108
+             110:   21(ivec4) VectorShuffle 109 107 4 5 2 3
+                              Store 108 110
+             111:      6(int) Load 8(invocation)
+             113:    103(ptr) AccessChain 27(data) 50 50
+             114:   21(ivec4) Load 113
+             115:  112(ivec3) VectorShuffle 114 114 0 1 2
+             116:  112(ivec3) GroupNonUniformIAdd 35 ClusteredReduce 115 34
+             117:    103(ptr) AccessChain 27(data) 111 50
+             118:   21(ivec4) Load 117
+             119:   21(ivec4) VectorShuffle 118 116 4 5 6 3
+                              Store 117 119
+             120:      6(int) Load 8(invocation)
+             121:    103(ptr) AccessChain 27(data) 60 50
+             122:   21(ivec4) Load 121
+             123:   21(ivec4) GroupNonUniformIAdd 35 ClusteredReduce 122 34
+             124:    103(ptr) AccessChain 27(data) 120 50
+                              Store 124 123
+             125:      6(int) Load 8(invocation)
+             127:    126(ptr) AccessChain 27(data) 29 60 30
+             128:22(float64_t) Load 127
+             129:22(float64_t) GroupNonUniformFAdd 35 ClusteredReduce 128 34
+             130:    126(ptr) AccessChain 27(data) 125 60 30
+                              Store 130 129
+             131:      6(int) Load 8(invocation)
+             134:    133(ptr) AccessChain 27(data) 39 60
+             135: 23(f64vec4) Load 134
+             136:132(f64vec2) VectorShuffle 135 135 0 1
+             137:132(f64vec2) GroupNonUniformFAdd 35 ClusteredReduce 136 34
+             138:    133(ptr) AccessChain 27(data) 131 60
+             139: 23(f64vec4) Load 138
+             140: 23(f64vec4) VectorShuffle 139 137 4 5 2 3
+                              Store 138 140
+             141:      6(int) Load 8(invocation)
+             143:    133(ptr) AccessChain 27(data) 50 60
+             144: 23(f64vec4) Load 143
+             145:142(f64vec3) VectorShuffle 144 144 0 1 2
+             146:142(f64vec3) GroupNonUniformFAdd 35 ClusteredReduce 145 34
+             147:    133(ptr) AccessChain 27(data) 141 60
+             148: 23(f64vec4) Load 147
+             149: 23(f64vec4) VectorShuffle 148 146 4 5 6 3
+                              Store 147 149
+             150:      6(int) Load 8(invocation)
+             151:    133(ptr) AccessChain 27(data) 60 60
+             152: 23(f64vec4) Load 151
+             153: 23(f64vec4) GroupNonUniformFAdd 35 ClusteredReduce 152 34
+             154:    133(ptr) AccessChain 27(data) 150 60
+                              Store 154 153
+             155:      6(int) Load 8(invocation)
+             156:     31(ptr) AccessChain 27(data) 29 29 30
+             157:   17(float) Load 156
+             158:   17(float) GroupNonUniformFMul 35 ClusteredReduce 157 34
+             159:     31(ptr) AccessChain 27(data) 155 29 30
+                              Store 159 158
+             160:      6(int) Load 8(invocation)
+             161:     41(ptr) AccessChain 27(data) 39 29
+             162:   18(fvec4) Load 161
+             163:   40(fvec2) VectorShuffle 162 162 0 1
+             164:   40(fvec2) GroupNonUniformFMul 35 ClusteredReduce 163 34
+             165:     41(ptr) AccessChain 27(data) 160 29
+             166:   18(fvec4) Load 165
+             167:   18(fvec4) VectorShuffle 166 164 4 5 2 3
+                              Store 165 167
+             168:      6(int) Load 8(invocation)
+             169:     41(ptr) AccessChain 27(data) 50 29
+             170:   18(fvec4) Load 169
+             171:   51(fvec3) VectorShuffle 170 170 0 1 2
+             172:   51(fvec3) GroupNonUniformFMul 35 ClusteredReduce 171 34
+             173:     41(ptr) AccessChain 27(data) 168 29
+             174:   18(fvec4) Load 173
+             175:   18(fvec4) VectorShuffle 174 172 4 5 6 3
+                              Store 173 175
+             176:      6(int) Load 8(invocation)
+             177:     41(ptr) AccessChain 27(data) 60 29
+             178:   18(fvec4) Load 177
+             179:   18(fvec4) GroupNonUniformFMul 35 ClusteredReduce 178 34
+             180:     41(ptr) AccessChain 27(data) 176 29
+                              Store 180 179
+             181:      6(int) Load 8(invocation)
+             182:     66(ptr) AccessChain 27(data) 29 39 30
+             183:     19(int) Load 182
+             184:     19(int) GroupNonUniformIMul 35 ClusteredReduce 183 34
+             185:     66(ptr) AccessChain 27(data) 181 39 30
+                              Store 185 184
+             186:      6(int) Load 8(invocation)
+             187:     73(ptr) AccessChain 27(data) 39 39
+             188:   20(ivec4) Load 187
+             189:   72(ivec2) VectorShuffle 188 188 0 1
+             190:   72(ivec2) GroupNonUniformIMul 35 ClusteredReduce 189 34
+             191:     73(ptr) AccessChain 27(data) 186 39
+             192:   20(ivec4) Load 191
+             193:   20(ivec4) VectorShuffle 192 190 4 5 2 3
+                              Store 191 193
+             194:      6(int) Load 8(invocation)
+             195:     73(ptr) AccessChain 27(data) 50 39
+             196:   20(ivec4) Load 195
+             197:   82(ivec3) VectorShuffle 196 196 0 1 2
+             198:   82(ivec3) GroupNonUniformIMul 35 ClusteredReduce 197 34
+             199:     73(ptr) AccessChain 27(data) 194 39
+             200:   20(ivec4) Load 199
+             201:   20(ivec4) VectorShuffle 200 198 4 5 6 3
+                              Store 199 201
+             202:      6(int) Load 8(invocation)
+             203:     73(ptr) AccessChain 27(data) 60 39
+             204:   20(ivec4) Load 203
+             205:   20(ivec4) GroupNonUniformIMul 35 ClusteredReduce 204 34
+             206:     73(ptr) AccessChain 27(data) 202 39
+                              Store 206 205
+             207:      6(int) Load 8(invocation)
+             208:     96(ptr) AccessChain 27(data) 29 50 30
+             209:      6(int) Load 208
+             210:      6(int) GroupNonUniformIMul 35 ClusteredReduce 209 34
+             211:     96(ptr) AccessChain 27(data) 207 50 30
+                              Store 211 210
+             212:      6(int) Load 8(invocation)
+             213:    103(ptr) AccessChain 27(data) 39 50
+             214:   21(ivec4) Load 213
+             215:  102(ivec2) VectorShuffle 214 214 0 1
+             216:  102(ivec2) GroupNonUniformIMul 35 ClusteredReduce 215 34
+             217:    103(ptr) AccessChain 27(data) 212 50
+             218:   21(ivec4) Load 217
+             219:   21(ivec4) VectorShuffle 218 216 4 5 2 3
+                              Store 217 219
+             220:      6(int) Load 8(invocation)
+             221:    103(ptr) AccessChain 27(data) 50 50
+             222:   21(ivec4) Load 221
+             223:  112(ivec3) VectorShuffle 222 222 0 1 2
+             224:  112(ivec3) GroupNonUniformIMul 35 ClusteredReduce 223 34
+             225:    103(ptr) AccessChain 27(data) 220 50
+             226:   21(ivec4) Load 225
+             227:   21(ivec4) VectorShuffle 226 224 4 5 6 3
+                              Store 225 227
+             228:      6(int) Load 8(invocation)
+             229:    103(ptr) AccessChain 27(data) 60 50
+             230:   21(ivec4) Load 229
+             231:   21(ivec4) GroupNonUniformIMul 35 ClusteredReduce 230 34
+             232:    103(ptr) AccessChain 27(data) 228 50
+                              Store 232 231
+             233:      6(int) Load 8(invocation)
+             234:    126(ptr) AccessChain 27(data) 29 60 30
+             235:22(float64_t) Load 234
+             236:22(float64_t) GroupNonUniformFMul 35 ClusteredReduce 235 34
+             237:    126(ptr) AccessChain 27(data) 233 60 30
+                              Store 237 236
+             238:      6(int) Load 8(invocation)
+             239:    133(ptr) AccessChain 27(data) 39 60
+             240: 23(f64vec4) Load 239
+             241:132(f64vec2) VectorShuffle 240 240 0 1
+             242:132(f64vec2) GroupNonUniformFMul 35 ClusteredReduce 241 34
+             243:    133(ptr) AccessChain 27(data) 238 60
+             244: 23(f64vec4) Load 243
+             245: 23(f64vec4) VectorShuffle 244 242 4 5 2 3
+                              Store 243 245
+             246:      6(int) Load 8(invocation)
+             247:    133(ptr) AccessChain 27(data) 50 60
+             248: 23(f64vec4) Load 247
+             249:142(f64vec3) VectorShuffle 248 248 0 1 2
+             250:142(f64vec3) GroupNonUniformFMul 35 ClusteredReduce 249 34
+             251:    133(ptr) AccessChain 27(data) 246 60
+             252: 23(f64vec4) Load 251
+             253: 23(f64vec4) VectorShuffle 252 250 4 5 6 3
+                              Store 251 253
+             254:      6(int) Load 8(invocation)
+             255:    133(ptr) AccessChain 27(data) 60 60
+             256: 23(f64vec4) Load 255
+             257: 23(f64vec4) GroupNonUniformFMul 35 ClusteredReduce 256 34
+             258:    133(ptr) AccessChain 27(data) 254 60
+                              Store 258 257
+             259:      6(int) Load 8(invocation)
+             260:     31(ptr) AccessChain 27(data) 29 29 30
+             261:   17(float) Load 260
+             262:   17(float) GroupNonUniformFMin 35 ClusteredReduce 261 34
+             263:     31(ptr) AccessChain 27(data) 259 29 30
+                              Store 263 262
+             264:      6(int) Load 8(invocation)
+             265:     41(ptr) AccessChain 27(data) 39 29
+             266:   18(fvec4) Load 265
+             267:   40(fvec2) VectorShuffle 266 266 0 1
+             268:   40(fvec2) GroupNonUniformFMin 35 ClusteredReduce 267 34
+             269:     41(ptr) AccessChain 27(data) 264 29
+             270:   18(fvec4) Load 269
+             271:   18(fvec4) VectorShuffle 270 268 4 5 2 3
+                              Store 269 271
+             272:      6(int) Load 8(invocation)
+             273:     41(ptr) AccessChain 27(data) 50 29
+             274:   18(fvec4) Load 273
+             275:   51(fvec3) VectorShuffle 274 274 0 1 2
+             276:   51(fvec3) GroupNonUniformFMin 35 ClusteredReduce 275 34
+             277:     41(ptr) AccessChain 27(data) 272 29
+             278:   18(fvec4) Load 277
+             279:   18(fvec4) VectorShuffle 278 276 4 5 6 3
+                              Store 277 279
+             280:      6(int) Load 8(invocation)
+             281:     41(ptr) AccessChain 27(data) 60 29
+             282:   18(fvec4) Load 281
+             283:   18(fvec4) GroupNonUniformFMin 35 ClusteredReduce 282 34
+             284:     41(ptr) AccessChain 27(data) 280 29
+                              Store 284 283
+             285:      6(int) Load 8(invocation)
+             286:     66(ptr) AccessChain 27(data) 29 39 30
+             287:     19(int) Load 286
+             288:     19(int) GroupNonUniformSMin 35 ClusteredReduce 287 34
+             289:     66(ptr) AccessChain 27(data) 285 39 30
+                              Store 289 288
+             290:      6(int) Load 8(invocation)
+             291:     73(ptr) AccessChain 27(data) 39 39
+             292:   20(ivec4) Load 291
+             293:   72(ivec2) VectorShuffle 292 292 0 1
+             294:   72(ivec2) GroupNonUniformSMin 35 ClusteredReduce 293 34
+             295:     73(ptr) AccessChain 27(data) 290 39
+             296:   20(ivec4) Load 295
+             297:   20(ivec4) VectorShuffle 296 294 4 5 2 3
+                              Store 295 297
+             298:      6(int) Load 8(invocation)
+             299:     73(ptr) AccessChain 27(data) 50 39
+             300:   20(ivec4) Load 299
+             301:   82(ivec3) VectorShuffle 300 300 0 1 2
+             302:   82(ivec3) GroupNonUniformSMin 35 ClusteredReduce 301 34
+             303:     73(ptr) AccessChain 27(data) 298 39
+             304:   20(ivec4) Load 303
+             305:   20(ivec4) VectorShuffle 304 302 4 5 6 3
+                              Store 303 305
+             306:      6(int) Load 8(invocation)
+             307:     73(ptr) AccessChain 27(data) 60 39
+             308:   20(ivec4) Load 307
+             309:   20(ivec4) GroupNonUniformSMin 35 ClusteredReduce 308 34
+             310:     73(ptr) AccessChain 27(data) 306 39
+                              Store 310 309
+             311:      6(int) Load 8(invocation)
+             312:     96(ptr) AccessChain 27(data) 29 50 30
+             313:      6(int) Load 312
+             314:      6(int) GroupNonUniformUMin 35 ClusteredReduce 313 34
+             315:     96(ptr) AccessChain 27(data) 311 50 30
+                              Store 315 314
+             316:      6(int) Load 8(invocation)
+             317:    103(ptr) AccessChain 27(data) 39 50
+             318:   21(ivec4) Load 317
+             319:  102(ivec2) VectorShuffle 318 318 0 1
+             320:  102(ivec2) GroupNonUniformUMin 35 ClusteredReduce 319 34
+             321:    103(ptr) AccessChain 27(data) 316 50
+             322:   21(ivec4) Load 321
+             323:   21(ivec4) VectorShuffle 322 320 4 5 2 3
+                              Store 321 323
+             324:      6(int) Load 8(invocation)
+             325:    103(ptr) AccessChain 27(data) 50 50
+             326:   21(ivec4) Load 325
+             327:  112(ivec3) VectorShuffle 326 326 0 1 2
+             328:  112(ivec3) GroupNonUniformUMin 35 ClusteredReduce 327 34
+             329:    103(ptr) AccessChain 27(data) 324 50
+             330:   21(ivec4) Load 329
+             331:   21(ivec4) VectorShuffle 330 328 4 5 6 3
+                              Store 329 331
+             332:      6(int) Load 8(invocation)
+             333:    103(ptr) AccessChain 27(data) 60 50
+             334:   21(ivec4) Load 333
+             335:   21(ivec4) GroupNonUniformUMin 35 ClusteredReduce 334 34
+             336:    103(ptr) AccessChain 27(data) 332 50
+                              Store 336 335
+             337:      6(int) Load 8(invocation)
+             338:    126(ptr) AccessChain 27(data) 29 60 30
+             339:22(float64_t) Load 338
+             340:22(float64_t) GroupNonUniformFMin 35 ClusteredReduce 339 34
+             341:    126(ptr) AccessChain 27(data) 337 60 30
+                              Store 341 340
+             342:      6(int) Load 8(invocation)
+             343:    133(ptr) AccessChain 27(data) 39 60
+             344: 23(f64vec4) Load 343
+             345:132(f64vec2) VectorShuffle 344 344 0 1
+             346:132(f64vec2) GroupNonUniformFMin 35 ClusteredReduce 345 34
+             347:    133(ptr) AccessChain 27(data) 342 60
+             348: 23(f64vec4) Load 347
+             349: 23(f64vec4) VectorShuffle 348 346 4 5 2 3
+                              Store 347 349
+             350:      6(int) Load 8(invocation)
+             351:    133(ptr) AccessChain 27(data) 50 60
+             352: 23(f64vec4) Load 351
+             353:142(f64vec3) VectorShuffle 352 352 0 1 2
+             354:142(f64vec3) GroupNonUniformFMin 35 ClusteredReduce 353 34
+             355:    133(ptr) AccessChain 27(data) 350 60
+             356: 23(f64vec4) Load 355
+             357: 23(f64vec4) VectorShuffle 356 354 4 5 6 3
+                              Store 355 357
+             358:      6(int) Load 8(invocation)
+             359:    133(ptr) AccessChain 27(data) 60 60
+             360: 23(f64vec4) Load 359
+             361: 23(f64vec4) GroupNonUniformFMin 35 ClusteredReduce 360 34
+             362:    133(ptr) AccessChain 27(data) 358 60
+                              Store 362 361
+             363:      6(int) Load 8(invocation)
+             364:     31(ptr) AccessChain 27(data) 29 29 30
+             365:   17(float) Load 364
+             366:   17(float) GroupNonUniformFMax 35 ClusteredReduce 365 34
+             367:     31(ptr) AccessChain 27(data) 363 29 30
+                              Store 367 366
+             368:      6(int) Load 8(invocation)
+             369:     41(ptr) AccessChain 27(data) 39 29
+             370:   18(fvec4) Load 369
+             371:   40(fvec2) VectorShuffle 370 370 0 1
+             372:   40(fvec2) GroupNonUniformFMax 35 ClusteredReduce 371 34
+             373:     41(ptr) AccessChain 27(data) 368 29
+             374:   18(fvec4) Load 373
+             375:   18(fvec4) VectorShuffle 374 372 4 5 2 3
+                              Store 373 375
+             376:      6(int) Load 8(invocation)
+             377:     41(ptr) AccessChain 27(data) 50 29
+             378:   18(fvec4) Load 377
+             379:   51(fvec3) VectorShuffle 378 378 0 1 2
+             380:   51(fvec3) GroupNonUniformFMax 35 ClusteredReduce 379 34
+             381:     41(ptr) AccessChain 27(data) 376 29
+             382:   18(fvec4) Load 381
+             383:   18(fvec4) VectorShuffle 382 380 4 5 6 3
+                              Store 381 383
+             384:      6(int) Load 8(invocation)
+             385:     41(ptr) AccessChain 27(data) 60 29
+             386:   18(fvec4) Load 385
+             387:   18(fvec4) GroupNonUniformFMax 35 ClusteredReduce 386 34
+             388:     41(ptr) AccessChain 27(data) 384 29
+                              Store 388 387
+             389:      6(int) Load 8(invocation)
+             390:     66(ptr) AccessChain 27(data) 29 39 30
+             391:     19(int) Load 390
+             392:     19(int) GroupNonUniformSMax 35 ClusteredReduce 391 34
+             393:     66(ptr) AccessChain 27(data) 389 39 30
+                              Store 393 392
+             394:      6(int) Load 8(invocation)
+             395:     73(ptr) AccessChain 27(data) 39 39
+             396:   20(ivec4) Load 395
+             397:   72(ivec2) VectorShuffle 396 396 0 1
+             398:   72(ivec2) GroupNonUniformSMax 35 ClusteredReduce 397 34
+             399:     73(ptr) AccessChain 27(data) 394 39
+             400:   20(ivec4) Load 399
+             401:   20(ivec4) VectorShuffle 400 398 4 5 2 3
+                              Store 399 401
+             402:      6(int) Load 8(invocation)
+             403:     73(ptr) AccessChain 27(data) 50 39
+             404:   20(ivec4) Load 403
+             405:   82(ivec3) VectorShuffle 404 404 0 1 2
+             406:   82(ivec3) GroupNonUniformSMax 35 ClusteredReduce 405 34
+             407:     73(ptr) AccessChain 27(data) 402 39
+             408:   20(ivec4) Load 407
+             409:   20(ivec4) VectorShuffle 408 406 4 5 6 3
+                              Store 407 409
+             410:      6(int) Load 8(invocation)
+             411:     73(ptr) AccessChain 27(data) 60 39
+             412:   20(ivec4) Load 411
+             413:   20(ivec4) GroupNonUniformSMax 35 ClusteredReduce 412 34
+             414:     73(ptr) AccessChain 27(data) 410 39
+                              Store 414 413
+             415:      6(int) Load 8(invocation)
+             416:     96(ptr) AccessChain 27(data) 29 50 30
+             417:      6(int) Load 416
+             418:      6(int) GroupNonUniformUMax 35 ClusteredReduce 417 34
+             419:     96(ptr) AccessChain 27(data) 415 50 30
+                              Store 419 418
+             420:      6(int) Load 8(invocation)
+             421:    103(ptr) AccessChain 27(data) 39 50
+             422:   21(ivec4) Load 421
+             423:  102(ivec2) VectorShuffle 422 422 0 1
+             424:  102(ivec2) GroupNonUniformUMax 35 ClusteredReduce 423 34
+             425:    103(ptr) AccessChain 27(data) 420 50
+             426:   21(ivec4) Load 425
+             427:   21(ivec4) VectorShuffle 426 424 4 5 2 3
+                              Store 425 427
+             428:      6(int) Load 8(invocation)
+             429:    103(ptr) AccessChain 27(data) 50 50
+             430:   21(ivec4) Load 429
+             431:  112(ivec3) VectorShuffle 430 430 0 1 2
+             432:  112(ivec3) GroupNonUniformUMax 35 ClusteredReduce 431 34
+             433:    103(ptr) AccessChain 27(data) 428 50
+             434:   21(ivec4) Load 433
+             435:   21(ivec4) VectorShuffle 434 432 4 5 6 3
+                              Store 433 435
+             436:      6(int) Load 8(invocation)
+             437:    103(ptr) AccessChain 27(data) 60 50
+             438:   21(ivec4) Load 437
+             439:   21(ivec4) GroupNonUniformUMax 35 ClusteredReduce 438 34
+             440:    103(ptr) AccessChain 27(data) 436 50
+                              Store 440 439
+             441:      6(int) Load 8(invocation)
+             442:    126(ptr) AccessChain 27(data) 29 60 30
+             443:22(float64_t) Load 442
+             444:22(float64_t) GroupNonUniformFMax 35 ClusteredReduce 443 34
+             445:    126(ptr) AccessChain 27(data) 441 60 30
+                              Store 445 444
+             446:      6(int) Load 8(invocation)
+             447:    133(ptr) AccessChain 27(data) 39 60
+             448: 23(f64vec4) Load 447
+             449:132(f64vec2) VectorShuffle 448 448 0 1
+             450:132(f64vec2) GroupNonUniformFMax 35 ClusteredReduce 449 34
+             451:    133(ptr) AccessChain 27(data) 446 60
+             452: 23(f64vec4) Load 451
+             453: 23(f64vec4) VectorShuffle 452 450 4 5 2 3
+                              Store 451 453
+             454:      6(int) Load 8(invocation)
+             455:    133(ptr) AccessChain 27(data) 50 60
+             456: 23(f64vec4) Load 455
+             457:142(f64vec3) VectorShuffle 456 456 0 1 2
+             458:142(f64vec3) GroupNonUniformFMax 35 ClusteredReduce 457 34
+             459:    133(ptr) AccessChain 27(data) 454 60
+             460: 23(f64vec4) Load 459
+             461: 23(f64vec4) VectorShuffle 460 458 4 5 6 3
+                              Store 459 461
+             462:      6(int) Load 8(invocation)
+             463:    133(ptr) AccessChain 27(data) 60 60
+             464: 23(f64vec4) Load 463
+             465: 23(f64vec4) GroupNonUniformFMax 35 ClusteredReduce 464 34
+             466:    133(ptr) AccessChain 27(data) 462 60
+                              Store 466 465
+             467:      6(int) Load 8(invocation)
+             468:     66(ptr) AccessChain 27(data) 29 39 30
+             469:     19(int) Load 468
+             470:     19(int) GroupNonUniformBitwiseAnd 35 ClusteredReduce 469 34
+             471:     66(ptr) AccessChain 27(data) 467 39 30
+                              Store 471 470
+             472:      6(int) Load 8(invocation)
+             473:     73(ptr) AccessChain 27(data) 39 39
+             474:   20(ivec4) Load 473
+             475:   72(ivec2) VectorShuffle 474 474 0 1
+             476:   72(ivec2) GroupNonUniformBitwiseAnd 35 ClusteredReduce 475 34
+             477:     73(ptr) AccessChain 27(data) 472 39
+             478:   20(ivec4) Load 477
+             479:   20(ivec4) VectorShuffle 478 476 4 5 2 3
+                              Store 477 479
+             480:      6(int) Load 8(invocation)
+             481:     73(ptr) AccessChain 27(data) 50 39
+             482:   20(ivec4) Load 481
+             483:   82(ivec3) VectorShuffle 482 482 0 1 2
+             484:   82(ivec3) GroupNonUniformBitwiseAnd 35 ClusteredReduce 483 34
+             485:     73(ptr) AccessChain 27(data) 480 39
+             486:   20(ivec4) Load 485
+             487:   20(ivec4) VectorShuffle 486 484 4 5 6 3
+                              Store 485 487
+             488:      6(int) Load 8(invocation)
+             489:     73(ptr) AccessChain 27(data) 60 39
+             490:   20(ivec4) Load 489
+             491:   20(ivec4) GroupNonUniformBitwiseAnd 35 ClusteredReduce 490 34
+             492:     73(ptr) AccessChain 27(data) 488 39
+                              Store 492 491
+             493:      6(int) Load 8(invocation)
+             494:     96(ptr) AccessChain 27(data) 29 50 30
+             495:      6(int) Load 494
+             496:      6(int) GroupNonUniformBitwiseAnd 35 ClusteredReduce 495 34
+             497:     96(ptr) AccessChain 27(data) 493 50 30
+                              Store 497 496
+             498:      6(int) Load 8(invocation)
+             499:    103(ptr) AccessChain 27(data) 39 50
+             500:   21(ivec4) Load 499
+             501:  102(ivec2) VectorShuffle 500 500 0 1
+             502:  102(ivec2) GroupNonUniformBitwiseAnd 35 ClusteredReduce 501 34
+             503:    103(ptr) AccessChain 27(data) 498 50
+             504:   21(ivec4) Load 503
+             505:   21(ivec4) VectorShuffle 504 502 4 5 2 3
+                              Store 503 505
+             506:      6(int) Load 8(invocation)
+             507:    103(ptr) AccessChain 27(data) 50 50
+             508:   21(ivec4) Load 507
+             509:  112(ivec3) VectorShuffle 508 508 0 1 2
+             510:  112(ivec3) GroupNonUniformBitwiseAnd 35 ClusteredReduce 509 34
+             511:    103(ptr) AccessChain 27(data) 506 50
+             512:   21(ivec4) Load 511
+             513:   21(ivec4) VectorShuffle 512 510 4 5 6 3
+                              Store 511 513
+             514:      6(int) Load 8(invocation)
+             515:    103(ptr) AccessChain 27(data) 60 50
+             516:   21(ivec4) Load 515
+             517:   21(ivec4) GroupNonUniformBitwiseAnd 35 ClusteredReduce 516 34
+             518:    103(ptr) AccessChain 27(data) 514 50
+                              Store 518 517
+             519:      6(int) Load 8(invocation)
+             520:     66(ptr) AccessChain 27(data) 29 39 30
+             521:     19(int) Load 520
+             523:   522(bool) SLessThan 521 29
+             524:   522(bool) GroupNonUniformLogicalAnd 35 ClusteredReduce 523 34
+             525:     19(int) Select 524 39 29
+             526:     66(ptr) AccessChain 27(data) 519 39 30
+                              Store 526 525
+             527:      6(int) Load 8(invocation)
+             528:     73(ptr) AccessChain 27(data) 39 39
+             529:   20(ivec4) Load 528
+             530:   72(ivec2) VectorShuffle 529 529 0 1
+             533:  532(bvec2) SLessThan 530 531
+             534:  532(bvec2) GroupNonUniformLogicalAnd 35 ClusteredReduce 533 34
+             536:   72(ivec2) Select 534 535 531
+             537:     73(ptr) AccessChain 27(data) 527 39
+             538:   20(ivec4) Load 537
+             539:   20(ivec4) VectorShuffle 538 536 4 5 2 3
+                              Store 537 539
+             540:      6(int) Load 8(invocation)
+             541:     73(ptr) AccessChain 27(data) 39 39
+             542:   20(ivec4) Load 541
+             543:   82(ivec3) VectorShuffle 542 542 0 1 2
+             546:  545(bvec3) SLessThan 543 544
+             547:  545(bvec3) GroupNonUniformLogicalAnd 35 ClusteredReduce 546 34
+             549:   82(ivec3) Select 547 548 544
+             550:     73(ptr) AccessChain 27(data) 540 39
+             551:   20(ivec4) Load 550
+             552:   20(ivec4) VectorShuffle 551 549 4 5 6 3
+                              Store 550 552
+             553:      6(int) Load 8(invocation)
+             554:     73(ptr) AccessChain 27(data) 39 39
+             555:   20(ivec4) Load 554
+             558:  557(bvec4) SLessThan 555 556
+             559:  557(bvec4) GroupNonUniformLogicalAnd 35 ClusteredReduce 558 34
+             561:   20(ivec4) Select 559 560 556
+             562:     73(ptr) AccessChain 27(data) 553 39
+                              Store 562 561
+             563:      6(int) Load 8(invocation)
+             564:     66(ptr) AccessChain 27(data) 29 39 30
+             565:     19(int) Load 564
+             566:     19(int) GroupNonUniformBitwiseOr 35 ClusteredReduce 565 34
+             567:     66(ptr) AccessChain 27(data) 563 39 30
+                              Store 567 566
+             568:      6(int) Load 8(invocation)
+             569:     73(ptr) AccessChain 27(data) 39 39
+             570:   20(ivec4) Load 569
+             571:   72(ivec2) VectorShuffle 570 570 0 1
+             572:   72(ivec2) GroupNonUniformBitwiseOr 35 ClusteredReduce 571 34
+             573:     73(ptr) AccessChain 27(data) 568 39
+             574:   20(ivec4) Load 573
+             575:   20(ivec4) VectorShuffle 574 572 4 5 2 3
+                              Store 573 575
+             576:      6(int) Load 8(invocation)
+             577:     73(ptr) AccessChain 27(data) 50 39
+             578:   20(ivec4) Load 577
+             579:   82(ivec3) VectorShuffle 578 578 0 1 2
+             580:   82(ivec3) GroupNonUniformBitwiseOr 35 ClusteredReduce 579 34
+             581:     73(ptr) AccessChain 27(data) 576 39
+             582:   20(ivec4) Load 581
+             583:   20(ivec4) VectorShuffle 582 580 4 5 6 3
+                              Store 581 583
+             584:      6(int) Load 8(invocation)
+             585:     73(ptr) AccessChain 27(data) 60 39
+             586:   20(ivec4) Load 585
+             587:   20(ivec4) GroupNonUniformBitwiseOr 35 ClusteredReduce 586 34
+             588:     73(ptr) AccessChain 27(data) 584 39
+                              Store 588 587
+             589:      6(int) Load 8(invocation)
+             590:     96(ptr) AccessChain 27(data) 29 50 30
+             591:      6(int) Load 590
+             592:      6(int) GroupNonUniformBitwiseOr 35 ClusteredReduce 591 34
+             593:     96(ptr) AccessChain 27(data) 589 50 30
+                              Store 593 592
+             594:      6(int) Load 8(invocation)
+             595:    103(ptr) AccessChain 27(data) 39 50
+             596:   21(ivec4) Load 595
+             597:  102(ivec2) VectorShuffle 596 596 0 1
+             598:  102(ivec2) GroupNonUniformBitwiseOr 35 ClusteredReduce 597 34
+             599:    103(ptr) AccessChain 27(data) 594 50
+             600:   21(ivec4) Load 599
+             601:   21(ivec4) VectorShuffle 600 598 4 5 2 3
+                              Store 599 601
+             602:      6(int) Load 8(invocation)
+             603:    103(ptr) AccessChain 27(data) 50 50
+             604:   21(ivec4) Load 603
+             605:  112(ivec3) VectorShuffle 604 604 0 1 2
+             606:  112(ivec3) GroupNonUniformBitwiseOr 35 ClusteredReduce 605 34
+             607:    103(ptr) AccessChain 27(data) 602 50
+             608:   21(ivec4) Load 607
+             609:   21(ivec4) VectorShuffle 608 606 4 5 6 3
+                              Store 607 609
+             610:      6(int) Load 8(invocation)
+             611:    103(ptr) AccessChain 27(data) 60 50
+             612:   21(ivec4) Load 611
+             613:   21(ivec4) GroupNonUniformBitwiseOr 35 ClusteredReduce 612 34
+             614:    103(ptr) AccessChain 27(data) 610 50
+                              Store 614 613
+             615:      6(int) Load 8(invocation)
+             616:     66(ptr) AccessChain 27(data) 29 39 30
+             617:     19(int) Load 616
+             618:   522(bool) SLessThan 617 29
+             619:   522(bool) GroupNonUniformLogicalOr 35 ClusteredReduce 618 34
+             620:     19(int) Select 619 39 29
+             621:     66(ptr) AccessChain 27(data) 615 39 30
+                              Store 621 620
+             622:      6(int) Load 8(invocation)
+             623:     73(ptr) AccessChain 27(data) 39 39
+             624:   20(ivec4) Load 623
+             625:   72(ivec2) VectorShuffle 624 624 0 1
+             626:  532(bvec2) SLessThan 625 531
+             627:  532(bvec2) GroupNonUniformLogicalOr 35 ClusteredReduce 626 34
+             628:   72(ivec2) Select 627 535 531
+             629:     73(ptr) AccessChain 27(data) 622 39
+             630:   20(ivec4) Load 629
+             631:   20(ivec4) VectorShuffle 630 628 4 5 2 3
+                              Store 629 631
+             632:      6(int) Load 8(invocation)
+             633:     73(ptr) AccessChain 27(data) 39 39
+             634:   20(ivec4) Load 633
+             635:   82(ivec3) VectorShuffle 634 634 0 1 2
+             636:  545(bvec3) SLessThan 635 544
+             637:  545(bvec3) GroupNonUniformLogicalOr 35 ClusteredReduce 636 34
+             638:   82(ivec3) Select 637 548 544
+             639:     73(ptr) AccessChain 27(data) 632 39
+             640:   20(ivec4) Load 639
+             641:   20(ivec4) VectorShuffle 640 638 4 5 6 3
+                              Store 639 641
+             642:      6(int) Load 8(invocation)
+             643:     73(ptr) AccessChain 27(data) 39 39
+             644:   20(ivec4) Load 643
+             645:  557(bvec4) SLessThan 644 556
+             646:  557(bvec4) GroupNonUniformLogicalOr 35 ClusteredReduce 645 34
+             647:   20(ivec4) Select 646 560 556
+             648:     73(ptr) AccessChain 27(data) 642 39
+                              Store 648 647
+             649:      6(int) Load 8(invocation)
+             650:     66(ptr) AccessChain 27(data) 29 39 30
+             651:     19(int) Load 650
+             652:     19(int) GroupNonUniformBitwiseXor 35 ClusteredReduce 651 34
+             653:     66(ptr) AccessChain 27(data) 649 39 30
+                              Store 653 652
+             654:      6(int) Load 8(invocation)
+             655:     73(ptr) AccessChain 27(data) 39 39
+             656:   20(ivec4) Load 655
+             657:   72(ivec2) VectorShuffle 656 656 0 1
+             658:   72(ivec2) GroupNonUniformBitwiseXor 35 ClusteredReduce 657 34
+             659:     73(ptr) AccessChain 27(data) 654 39
+             660:   20(ivec4) Load 659
+             661:   20(ivec4) VectorShuffle 660 658 4 5 2 3
+                              Store 659 661
+             662:      6(int) Load 8(invocation)
+             663:     73(ptr) AccessChain 27(data) 50 39
+             664:   20(ivec4) Load 663
+             665:   82(ivec3) VectorShuffle 664 664 0 1 2
+             666:   82(ivec3) GroupNonUniformBitwiseXor 35 ClusteredReduce 665 34
+             667:     73(ptr) AccessChain 27(data) 662 39
+             668:   20(ivec4) Load 667
+             669:   20(ivec4) VectorShuffle 668 666 4 5 6 3
+                              Store 667 669
+             670:      6(int) Load 8(invocation)
+             671:     73(ptr) AccessChain 27(data) 60 39
+             672:   20(ivec4) Load 671
+             673:   20(ivec4) GroupNonUniformBitwiseXor 35 ClusteredReduce 672 34
+             674:     73(ptr) AccessChain 27(data) 670 39
+                              Store 674 673
+             675:      6(int) Load 8(invocation)
+             676:     96(ptr) AccessChain 27(data) 29 50 30
+             677:      6(int) Load 676
+             678:      6(int) GroupNonUniformBitwiseXor 35 ClusteredReduce 677 34
+             679:     96(ptr) AccessChain 27(data) 675 50 30
+                              Store 679 678
+             680:      6(int) Load 8(invocation)
+             681:    103(ptr) AccessChain 27(data) 39 50
+             682:   21(ivec4) Load 681
+             683:  102(ivec2) VectorShuffle 682 682 0 1
+             684:  102(ivec2) GroupNonUniformBitwiseXor 35 ClusteredReduce 683 34
+             685:    103(ptr) AccessChain 27(data) 680 50
+             686:   21(ivec4) Load 685
+             687:   21(ivec4) VectorShuffle 686 684 4 5 2 3
+                              Store 685 687
+             688:      6(int) Load 8(invocation)
+             689:    103(ptr) AccessChain 27(data) 50 50
+             690:   21(ivec4) Load 689
+             691:  112(ivec3) VectorShuffle 690 690 0 1 2
+             692:  112(ivec3) GroupNonUniformBitwiseXor 35 ClusteredReduce 691 34
+             693:    103(ptr) AccessChain 27(data) 688 50
+             694:   21(ivec4) Load 693
+             695:   21(ivec4) VectorShuffle 694 692 4 5 6 3
+                              Store 693 695
+             696:      6(int) Load 8(invocation)
+             697:    103(ptr) AccessChain 27(data) 60 50
+             698:   21(ivec4) Load 697
+             699:   21(ivec4) GroupNonUniformBitwiseXor 35 ClusteredReduce 698 34
+             700:    103(ptr) AccessChain 27(data) 696 50
+                              Store 700 699
+             701:      6(int) Load 8(invocation)
+             702:     66(ptr) AccessChain 27(data) 29 39 30
+             703:     19(int) Load 702
+             704:   522(bool) SLessThan 703 29
+             705:   522(bool) GroupNonUniformLogicalXor 35 ClusteredReduce 704 34
+             706:     19(int) Select 705 39 29
+             707:     66(ptr) AccessChain 27(data) 701 39 30
+                              Store 707 706
+             708:      6(int) Load 8(invocation)
+             709:     73(ptr) AccessChain 27(data) 39 39
+             710:   20(ivec4) Load 709
+             711:   72(ivec2) VectorShuffle 710 710 0 1
+             712:  532(bvec2) SLessThan 711 531
+             713:  532(bvec2) GroupNonUniformLogicalXor 35 ClusteredReduce 712 34
+             714:   72(ivec2) Select 713 535 531
+             715:     73(ptr) AccessChain 27(data) 708 39
+             716:   20(ivec4) Load 715
+             717:   20(ivec4) VectorShuffle 716 714 4 5 2 3
+                              Store 715 717
+             718:      6(int) Load 8(invocation)
+             719:     73(ptr) AccessChain 27(data) 39 39
+             720:   20(ivec4) Load 719
+             721:   82(ivec3) VectorShuffle 720 720 0 1 2
+             722:  545(bvec3) SLessThan 721 544
+             723:  545(bvec3) GroupNonUniformLogicalXor 35 ClusteredReduce 722 34
+             724:   82(ivec3) Select 723 548 544
+             725:     73(ptr) AccessChain 27(data) 718 39
+             726:   20(ivec4) Load 725
+             727:   20(ivec4) VectorShuffle 726 724 4 5 6 3
+                              Store 725 727
+             728:      6(int) Load 8(invocation)
+             729:     73(ptr) AccessChain 27(data) 39 39
+             730:   20(ivec4) Load 729
+             731:  557(bvec4) SLessThan 730 556
+             732:  557(bvec4) GroupNonUniformLogicalXor 35 ClusteredReduce 731 34
+             733:   20(ivec4) Select 732 560 556
+             734:     73(ptr) AccessChain 27(data) 728 39
+                              Store 734 733
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.subgroupClusteredNeg.comp.out b/Test/baseResults/spv.subgroupClusteredNeg.comp.out
new file mode 100644
index 0000000..911ff72
--- /dev/null
+++ b/Test/baseResults/spv.subgroupClusteredNeg.comp.out
@@ -0,0 +1,13 @@
+spv.subgroupClusteredNeg.comp
+ERROR: 0:22: 'cluster size' : argument must be at least 1 
+ERROR: 0:24: 'cluster size' : argument must be a power of 2 
+ERROR: 0:27: 'cluster size' : argument must be a power of 2 
+ERROR: 0:29: 'cluster size' : argument must be at least 1 
+ERROR: 0:31: 'cluster size' : argument must be at least 1 
+ERROR: 0:33: 'cluster size' : argument must be compile-time constant 
+ERROR: 0:36: 'cluster size' : argument must be compile-time constant 
+ERROR: 0:37: 'cluster size' : argument must be compile-time constant 
+ERROR: 8 compilation errors.  No code generated.
+
+
+SPIR-V is not generated for failed compile or link
diff --git a/Test/baseResults/spv.subgroupPartitioned.comp.out b/Test/baseResults/spv.subgroupPartitioned.comp.out
new file mode 100644
index 0000000..e967df4
--- /dev/null
+++ b/Test/baseResults/spv.subgroupPartitioned.comp.out
@@ -0,0 +1,2876 @@
+spv.subgroupPartitioned.comp
+error: SPIRV-Tools Validation Errors
+error: Opcode GroupNonUniformFAdd requires one of these capabilities: GroupNonUniformArithmetic GroupNonUniformClustered 
+  %179 = OpGroupNonUniformFAdd %float %uint_3 PartitionedReduceNV %176 %177
+
+// Module Version 10300
+// Generated by (magic number): 80007
+// Id's are bound by 2506
+
+                              Capability Shader
+                              Capability Float64
+                              Capability GroupNonUniform
+                              Capability GroupNonUniformPartitionedNV
+                              Extension  "SPV_NV_shader_subgroup_partitioned"
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint GLCompute 4  "main" 10 12
+                              ExecutionMode 4 LocalSize 8 1 1
+                              Source GLSL 450
+                              SourceExtension  "GL_KHR_shader_subgroup_basic"
+                              SourceExtension  "GL_NV_shader_subgroup_partitioned"
+                              Name 4  "main"
+                              Name 8  "invocation"
+                              Name 10  "gl_SubgroupInvocationID"
+                              Name 12  "gl_SubgroupSize"
+                              Name 19  "ballot"
+                              Name 28  "Buffers"
+                              MemberName 28(Buffers) 0  "f4"
+                              MemberName 28(Buffers) 1  "i4"
+                              MemberName 28(Buffers) 2  "u4"
+                              MemberName 28(Buffers) 3  "d4"
+                              Name 31  "data"
+                              Decorate 10(gl_SubgroupInvocationID) RelaxedPrecision
+                              Decorate 10(gl_SubgroupInvocationID) BuiltIn SubgroupLocalInvocationId
+                              Decorate 11 RelaxedPrecision
+                              Decorate 12(gl_SubgroupSize) RelaxedPrecision
+                              Decorate 12(gl_SubgroupSize) BuiltIn SubgroupSize
+                              Decorate 13 RelaxedPrecision
+                              Decorate 14 RelaxedPrecision
+                              Decorate 16 RelaxedPrecision
+                              MemberDecorate 28(Buffers) 0 Offset 0
+                              MemberDecorate 28(Buffers) 1 Offset 16
+                              MemberDecorate 28(Buffers) 2 Offset 32
+                              MemberDecorate 28(Buffers) 3 Offset 64
+                              Decorate 28(Buffers) Block
+                              Decorate 31(data) DescriptorSet 0
+                              Decorate 31(data) Binding 0
+                              Decorate 2505 BuiltIn WorkgroupSize
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeInt 32 0
+               7:             TypePointer Function 6(int)
+               9:             TypePointer Input 6(int)
+10(gl_SubgroupInvocationID):      9(ptr) Variable Input
+12(gl_SubgroupSize):      9(ptr) Variable Input
+              15:      6(int) Constant 4
+              17:             TypeVector 6(int) 4
+              18:             TypePointer Function 17(ivec4)
+              22:             TypeFloat 32
+              23:             TypeVector 22(float) 4
+              24:             TypeInt 32 1
+              25:             TypeVector 24(int) 4
+              26:             TypeFloat 64
+              27:             TypeVector 26(float64_t) 4
+     28(Buffers):             TypeStruct 23(fvec4) 25(ivec4) 17(ivec4) 27(f64vec4)
+              29:             TypeArray 28(Buffers) 15
+              30:             TypePointer StorageBuffer 29
+        31(data):     30(ptr) Variable StorageBuffer
+              33:     24(int) Constant 2
+              34:     24(int) Constant 0
+              35:      6(int) Constant 0
+              36:             TypePointer StorageBuffer 22(float)
+              40:             TypePointer StorageBuffer 17(ivec4)
+              43:             TypeVector 22(float) 2
+              44:             TypePointer StorageBuffer 23(fvec4)
+              51:             TypeVector 22(float) 3
+              63:     24(int) Constant 1
+              64:             TypePointer StorageBuffer 24(int)
+              70:             TypeVector 24(int) 2
+              71:             TypePointer StorageBuffer 25(ivec4)
+              78:             TypeVector 24(int) 3
+              90:             TypePointer StorageBuffer 6(int)
+              96:             TypeVector 6(int) 2
+             103:             TypeVector 6(int) 3
+             115:     24(int) Constant 3
+             116:             TypePointer StorageBuffer 26(float64_t)
+             122:             TypeVector 26(float64_t) 2
+             123:             TypePointer StorageBuffer 27(f64vec4)
+             130:             TypeVector 26(float64_t) 3
+             144:             TypeBool
+             152:             TypeVector 144(bool) 2
+             153:   96(ivec2) ConstantComposite 35 35
+             161:             TypeVector 144(bool) 3
+             162:  103(ivec3) ConstantComposite 35 35 35
+             169:             TypeVector 144(bool) 4
+             170:   17(ivec4) ConstantComposite 35 35 35 35
+             178:      6(int) Constant 3
+             727:   70(ivec2) ConstantComposite 34 34
+             731:   70(ivec2) ConstantComposite 63 63
+             740:   78(ivec3) ConstantComposite 34 34 34
+             744:   78(ivec3) ConstantComposite 63 63 63
+             752:   25(ivec4) ConstantComposite 34 34 34 34
+             756:   25(ivec4) ConstantComposite 63 63 63 63
+            2503:      6(int) Constant 8
+            2504:      6(int) Constant 1
+            2505:  103(ivec3) ConstantComposite 2503 2504 2504
+         4(main):           2 Function None 3
+               5:             Label
+   8(invocation):      7(ptr) Variable Function
+      19(ballot):     18(ptr) Variable Function
+              11:      6(int) Load 10(gl_SubgroupInvocationID)
+              13:      6(int) Load 12(gl_SubgroupSize)
+              14:      6(int) IAdd 11 13
+              16:      6(int) UMod 14 15
+                              Store 8(invocation) 16
+              20:      6(int) Load 8(invocation)
+              21:   17(ivec4) GroupNonUniformPartitionNV 20
+                              Store 19(ballot) 21
+              32:      6(int) Load 8(invocation)
+              37:     36(ptr) AccessChain 31(data) 34 34 35
+              38:   22(float) Load 37
+              39:   17(ivec4) GroupNonUniformPartitionNV 38
+              41:     40(ptr) AccessChain 31(data) 32 33
+                              Store 41 39
+              42:      6(int) Load 8(invocation)
+              45:     44(ptr) AccessChain 31(data) 34 34
+              46:   23(fvec4) Load 45
+              47:   43(fvec2) VectorShuffle 46 46 0 1
+              48:   17(ivec4) GroupNonUniformPartitionNV 47
+              49:     40(ptr) AccessChain 31(data) 42 33
+                              Store 49 48
+              50:      6(int) Load 8(invocation)
+              52:     44(ptr) AccessChain 31(data) 34 34
+              53:   23(fvec4) Load 52
+              54:   51(fvec3) VectorShuffle 53 53 0 1 2
+              55:   17(ivec4) GroupNonUniformPartitionNV 54
+              56:     40(ptr) AccessChain 31(data) 50 33
+                              Store 56 55
+              57:      6(int) Load 8(invocation)
+              58:     44(ptr) AccessChain 31(data) 34 34
+              59:   23(fvec4) Load 58
+              60:   17(ivec4) GroupNonUniformPartitionNV 59
+              61:     40(ptr) AccessChain 31(data) 57 33
+                              Store 61 60
+              62:      6(int) Load 8(invocation)
+              65:     64(ptr) AccessChain 31(data) 34 63 35
+              66:     24(int) Load 65
+              67:   17(ivec4) GroupNonUniformPartitionNV 66
+              68:     40(ptr) AccessChain 31(data) 62 33
+                              Store 68 67
+              69:      6(int) Load 8(invocation)
+              72:     71(ptr) AccessChain 31(data) 34 63
+              73:   25(ivec4) Load 72
+              74:   70(ivec2) VectorShuffle 73 73 0 1
+              75:   17(ivec4) GroupNonUniformPartitionNV 74
+              76:     40(ptr) AccessChain 31(data) 69 33
+                              Store 76 75
+              77:      6(int) Load 8(invocation)
+              79:     71(ptr) AccessChain 31(data) 34 63
+              80:   25(ivec4) Load 79
+              81:   78(ivec3) VectorShuffle 80 80 0 1 2
+              82:   17(ivec4) GroupNonUniformPartitionNV 81
+              83:     40(ptr) AccessChain 31(data) 77 33
+                              Store 83 82
+              84:      6(int) Load 8(invocation)
+              85:     71(ptr) AccessChain 31(data) 34 63
+              86:   25(ivec4) Load 85
+              87:   17(ivec4) GroupNonUniformPartitionNV 86
+              88:     40(ptr) AccessChain 31(data) 84 33
+                              Store 88 87
+              89:      6(int) Load 8(invocation)
+              91:     90(ptr) AccessChain 31(data) 34 33 35
+              92:      6(int) Load 91
+              93:   17(ivec4) GroupNonUniformPartitionNV 92
+              94:     40(ptr) AccessChain 31(data) 89 33
+                              Store 94 93
+              95:      6(int) Load 8(invocation)
+              97:     40(ptr) AccessChain 31(data) 34 33
+              98:   17(ivec4) Load 97
+              99:   96(ivec2) VectorShuffle 98 98 0 1
+             100:   17(ivec4) GroupNonUniformPartitionNV 99
+             101:     40(ptr) AccessChain 31(data) 95 33
+                              Store 101 100
+             102:      6(int) Load 8(invocation)
+             104:     40(ptr) AccessChain 31(data) 34 33
+             105:   17(ivec4) Load 104
+             106:  103(ivec3) VectorShuffle 105 105 0 1 2
+             107:   17(ivec4) GroupNonUniformPartitionNV 106
+             108:     40(ptr) AccessChain 31(data) 102 33
+                              Store 108 107
+             109:      6(int) Load 8(invocation)
+             110:     40(ptr) AccessChain 31(data) 34 33
+             111:   17(ivec4) Load 110
+             112:   17(ivec4) GroupNonUniformPartitionNV 111
+             113:     40(ptr) AccessChain 31(data) 109 33
+                              Store 113 112
+             114:      6(int) Load 8(invocation)
+             117:    116(ptr) AccessChain 31(data) 34 115 35
+             118:26(float64_t) Load 117
+             119:   17(ivec4) GroupNonUniformPartitionNV 118
+             120:     40(ptr) AccessChain 31(data) 114 33
+                              Store 120 119
+             121:      6(int) Load 8(invocation)
+             124:    123(ptr) AccessChain 31(data) 34 115
+             125: 27(f64vec4) Load 124
+             126:122(f64vec2) VectorShuffle 125 125 0 1
+             127:   17(ivec4) GroupNonUniformPartitionNV 126
+             128:     40(ptr) AccessChain 31(data) 121 33
+                              Store 128 127
+             129:      6(int) Load 8(invocation)
+             131:    123(ptr) AccessChain 31(data) 34 115
+             132: 27(f64vec4) Load 131
+             133:130(f64vec3) VectorShuffle 132 132 0 1 2
+             134:   17(ivec4) GroupNonUniformPartitionNV 133
+             135:     40(ptr) AccessChain 31(data) 129 33
+                              Store 135 134
+             136:      6(int) Load 8(invocation)
+             137:    123(ptr) AccessChain 31(data) 34 115
+             138: 27(f64vec4) Load 137
+             139:   17(ivec4) GroupNonUniformPartitionNV 138
+             140:     40(ptr) AccessChain 31(data) 136 33
+                              Store 140 139
+             141:      6(int) Load 8(invocation)
+             142:     64(ptr) AccessChain 31(data) 34 63 35
+             143:     24(int) Load 142
+             145:   144(bool) INotEqual 143 35
+             146:   17(ivec4) GroupNonUniformPartitionNV 145
+             147:     40(ptr) AccessChain 31(data) 141 33
+                              Store 147 146
+             148:      6(int) Load 8(invocation)
+             149:     71(ptr) AccessChain 31(data) 34 63
+             150:   25(ivec4) Load 149
+             151:   70(ivec2) VectorShuffle 150 150 0 1
+             154:  152(bvec2) INotEqual 151 153
+             155:   17(ivec4) GroupNonUniformPartitionNV 154
+             156:     40(ptr) AccessChain 31(data) 148 33
+                              Store 156 155
+             157:      6(int) Load 8(invocation)
+             158:     71(ptr) AccessChain 31(data) 34 63
+             159:   25(ivec4) Load 158
+             160:   78(ivec3) VectorShuffle 159 159 0 1 2
+             163:  161(bvec3) INotEqual 160 162
+             164:   17(ivec4) GroupNonUniformPartitionNV 163
+             165:     40(ptr) AccessChain 31(data) 157 33
+                              Store 165 164
+             166:      6(int) Load 8(invocation)
+             167:     71(ptr) AccessChain 31(data) 34 63
+             168:   25(ivec4) Load 167
+             171:  169(bvec4) INotEqual 168 170
+             172:   17(ivec4) GroupNonUniformPartitionNV 171
+             173:     40(ptr) AccessChain 31(data) 166 33
+                              Store 173 172
+             174:      6(int) Load 8(invocation)
+             175:     36(ptr) AccessChain 31(data) 34 34 35
+             176:   22(float) Load 175
+             177:   17(ivec4) Load 19(ballot)
+             179:   22(float) GroupNonUniformFAdd 178 PartitionedReduceNV 176 177
+             180:     36(ptr) AccessChain 31(data) 174 34 35
+                              Store 180 179
+             181:      6(int) Load 8(invocation)
+             182:     44(ptr) AccessChain 31(data) 63 34
+             183:   23(fvec4) Load 182
+             184:   43(fvec2) VectorShuffle 183 183 0 1
+             185:   17(ivec4) Load 19(ballot)
+             186:   43(fvec2) GroupNonUniformFAdd 178 PartitionedReduceNV 184 185
+             187:     44(ptr) AccessChain 31(data) 181 34
+             188:   23(fvec4) Load 187
+             189:   23(fvec4) VectorShuffle 188 186 4 5 2 3
+                              Store 187 189
+             190:      6(int) Load 8(invocation)
+             191:     44(ptr) AccessChain 31(data) 33 34
+             192:   23(fvec4) Load 191
+             193:   51(fvec3) VectorShuffle 192 192 0 1 2
+             194:   17(ivec4) Load 19(ballot)
+             195:   51(fvec3) GroupNonUniformFAdd 178 PartitionedReduceNV 193 194
+             196:     44(ptr) AccessChain 31(data) 190 34
+             197:   23(fvec4) Load 196
+             198:   23(fvec4) VectorShuffle 197 195 4 5 6 3
+                              Store 196 198
+             199:      6(int) Load 8(invocation)
+             200:     44(ptr) AccessChain 31(data) 115 34
+             201:   23(fvec4) Load 200
+             202:   17(ivec4) Load 19(ballot)
+             203:   23(fvec4) GroupNonUniformFAdd 178 PartitionedReduceNV 201 202
+             204:     44(ptr) AccessChain 31(data) 199 34
+                              Store 204 203
+             205:      6(int) Load 8(invocation)
+             206:     64(ptr) AccessChain 31(data) 34 63 35
+             207:     24(int) Load 206
+             208:   17(ivec4) Load 19(ballot)
+             209:     24(int) GroupNonUniformIAdd 178 PartitionedReduceNV 207 208
+             210:     64(ptr) AccessChain 31(data) 205 63 35
+                              Store 210 209
+             211:      6(int) Load 8(invocation)
+             212:     71(ptr) AccessChain 31(data) 63 63
+             213:   25(ivec4) Load 212
+             214:   70(ivec2) VectorShuffle 213 213 0 1
+             215:   17(ivec4) Load 19(ballot)
+             216:   70(ivec2) GroupNonUniformIAdd 178 PartitionedReduceNV 214 215
+             217:     71(ptr) AccessChain 31(data) 211 63
+             218:   25(ivec4) Load 217
+             219:   25(ivec4) VectorShuffle 218 216 4 5 2 3
+                              Store 217 219
+             220:      6(int) Load 8(invocation)
+             221:     71(ptr) AccessChain 31(data) 33 63
+             222:   25(ivec4) Load 221
+             223:   78(ivec3) VectorShuffle 222 222 0 1 2
+             224:   17(ivec4) Load 19(ballot)
+             225:   78(ivec3) GroupNonUniformIAdd 178 PartitionedReduceNV 223 224
+             226:     71(ptr) AccessChain 31(data) 220 63
+             227:   25(ivec4) Load 226
+             228:   25(ivec4) VectorShuffle 227 225 4 5 6 3
+                              Store 226 228
+             229:      6(int) Load 8(invocation)
+             230:     71(ptr) AccessChain 31(data) 115 63
+             231:   25(ivec4) Load 230
+             232:   17(ivec4) Load 19(ballot)
+             233:   25(ivec4) GroupNonUniformIAdd 178 PartitionedReduceNV 231 232
+             234:     71(ptr) AccessChain 31(data) 229 63
+                              Store 234 233
+             235:      6(int) Load 8(invocation)
+             236:     90(ptr) AccessChain 31(data) 34 33 35
+             237:      6(int) Load 236
+             238:   17(ivec4) Load 19(ballot)
+             239:      6(int) GroupNonUniformIAdd 178 PartitionedReduceNV 237 238
+             240:     90(ptr) AccessChain 31(data) 235 33 35
+                              Store 240 239
+             241:      6(int) Load 8(invocation)
+             242:     40(ptr) AccessChain 31(data) 63 33
+             243:   17(ivec4) Load 242
+             244:   96(ivec2) VectorShuffle 243 243 0 1
+             245:   17(ivec4) Load 19(ballot)
+             246:   96(ivec2) GroupNonUniformIAdd 178 PartitionedReduceNV 244 245
+             247:     40(ptr) AccessChain 31(data) 241 33
+             248:   17(ivec4) Load 247
+             249:   17(ivec4) VectorShuffle 248 246 4 5 2 3
+                              Store 247 249
+             250:      6(int) Load 8(invocation)
+             251:     40(ptr) AccessChain 31(data) 33 33
+             252:   17(ivec4) Load 251
+             253:  103(ivec3) VectorShuffle 252 252 0 1 2
+             254:   17(ivec4) Load 19(ballot)
+             255:  103(ivec3) GroupNonUniformIAdd 178 PartitionedReduceNV 253 254
+             256:     40(ptr) AccessChain 31(data) 250 33
+             257:   17(ivec4) Load 256
+             258:   17(ivec4) VectorShuffle 257 255 4 5 6 3
+                              Store 256 258
+             259:      6(int) Load 8(invocation)
+             260:     40(ptr) AccessChain 31(data) 115 33
+             261:   17(ivec4) Load 260
+             262:   17(ivec4) Load 19(ballot)
+             263:   17(ivec4) GroupNonUniformIAdd 178 PartitionedReduceNV 261 262
+             264:     40(ptr) AccessChain 31(data) 259 33
+                              Store 264 263
+             265:      6(int) Load 8(invocation)
+             266:    116(ptr) AccessChain 31(data) 34 115 35
+             267:26(float64_t) Load 266
+             268:   17(ivec4) Load 19(ballot)
+             269:26(float64_t) GroupNonUniformFAdd 178 PartitionedReduceNV 267 268
+             270:    116(ptr) AccessChain 31(data) 265 115 35
+                              Store 270 269
+             271:      6(int) Load 8(invocation)
+             272:    123(ptr) AccessChain 31(data) 63 115
+             273: 27(f64vec4) Load 272
+             274:122(f64vec2) VectorShuffle 273 273 0 1
+             275:   17(ivec4) Load 19(ballot)
+             276:122(f64vec2) GroupNonUniformFAdd 178 PartitionedReduceNV 274 275
+             277:    123(ptr) AccessChain 31(data) 271 115
+             278: 27(f64vec4) Load 277
+             279: 27(f64vec4) VectorShuffle 278 276 4 5 2 3
+                              Store 277 279
+             280:      6(int) Load 8(invocation)
+             281:    123(ptr) AccessChain 31(data) 33 115
+             282: 27(f64vec4) Load 281
+             283:130(f64vec3) VectorShuffle 282 282 0 1 2
+             284:   17(ivec4) Load 19(ballot)
+             285:130(f64vec3) GroupNonUniformFAdd 178 PartitionedReduceNV 283 284
+             286:    123(ptr) AccessChain 31(data) 280 115
+             287: 27(f64vec4) Load 286
+             288: 27(f64vec4) VectorShuffle 287 285 4 5 6 3
+                              Store 286 288
+             289:      6(int) Load 8(invocation)
+             290:    123(ptr) AccessChain 31(data) 115 115
+             291: 27(f64vec4) Load 290
+             292:   17(ivec4) Load 19(ballot)
+             293: 27(f64vec4) GroupNonUniformFAdd 178 PartitionedReduceNV 291 292
+             294:    123(ptr) AccessChain 31(data) 289 115
+                              Store 294 293
+             295:      6(int) Load 8(invocation)
+             296:     36(ptr) AccessChain 31(data) 34 34 35
+             297:   22(float) Load 296
+             298:   17(ivec4) Load 19(ballot)
+             299:   22(float) GroupNonUniformFMul 178 PartitionedReduceNV 297 298
+             300:     36(ptr) AccessChain 31(data) 295 34 35
+                              Store 300 299
+             301:      6(int) Load 8(invocation)
+             302:     44(ptr) AccessChain 31(data) 63 34
+             303:   23(fvec4) Load 302
+             304:   43(fvec2) VectorShuffle 303 303 0 1
+             305:   17(ivec4) Load 19(ballot)
+             306:   43(fvec2) GroupNonUniformFMul 178 PartitionedReduceNV 304 305
+             307:     44(ptr) AccessChain 31(data) 301 34
+             308:   23(fvec4) Load 307
+             309:   23(fvec4) VectorShuffle 308 306 4 5 2 3
+                              Store 307 309
+             310:      6(int) Load 8(invocation)
+             311:     44(ptr) AccessChain 31(data) 33 34
+             312:   23(fvec4) Load 311
+             313:   51(fvec3) VectorShuffle 312 312 0 1 2
+             314:   17(ivec4) Load 19(ballot)
+             315:   51(fvec3) GroupNonUniformFMul 178 PartitionedReduceNV 313 314
+             316:     44(ptr) AccessChain 31(data) 310 34
+             317:   23(fvec4) Load 316
+             318:   23(fvec4) VectorShuffle 317 315 4 5 6 3
+                              Store 316 318
+             319:      6(int) Load 8(invocation)
+             320:     44(ptr) AccessChain 31(data) 115 34
+             321:   23(fvec4) Load 320
+             322:   17(ivec4) Load 19(ballot)
+             323:   23(fvec4) GroupNonUniformFMul 178 PartitionedReduceNV 321 322
+             324:     44(ptr) AccessChain 31(data) 319 34
+                              Store 324 323
+             325:      6(int) Load 8(invocation)
+             326:     64(ptr) AccessChain 31(data) 34 63 35
+             327:     24(int) Load 326
+             328:   17(ivec4) Load 19(ballot)
+             329:     24(int) GroupNonUniformIMul 178 PartitionedReduceNV 327 328
+             330:     64(ptr) AccessChain 31(data) 325 63 35
+                              Store 330 329
+             331:      6(int) Load 8(invocation)
+             332:     71(ptr) AccessChain 31(data) 63 63
+             333:   25(ivec4) Load 332
+             334:   70(ivec2) VectorShuffle 333 333 0 1
+             335:   17(ivec4) Load 19(ballot)
+             336:   70(ivec2) GroupNonUniformIMul 178 PartitionedReduceNV 334 335
+             337:     71(ptr) AccessChain 31(data) 331 63
+             338:   25(ivec4) Load 337
+             339:   25(ivec4) VectorShuffle 338 336 4 5 2 3
+                              Store 337 339
+             340:      6(int) Load 8(invocation)
+             341:     71(ptr) AccessChain 31(data) 33 63
+             342:   25(ivec4) Load 341
+             343:   78(ivec3) VectorShuffle 342 342 0 1 2
+             344:   17(ivec4) Load 19(ballot)
+             345:   78(ivec3) GroupNonUniformIMul 178 PartitionedReduceNV 343 344
+             346:     71(ptr) AccessChain 31(data) 340 63
+             347:   25(ivec4) Load 346
+             348:   25(ivec4) VectorShuffle 347 345 4 5 6 3
+                              Store 346 348
+             349:      6(int) Load 8(invocation)
+             350:     71(ptr) AccessChain 31(data) 115 63
+             351:   25(ivec4) Load 350
+             352:   17(ivec4) Load 19(ballot)
+             353:   25(ivec4) GroupNonUniformIMul 178 PartitionedReduceNV 351 352
+             354:     71(ptr) AccessChain 31(data) 349 63
+                              Store 354 353
+             355:      6(int) Load 8(invocation)
+             356:     90(ptr) AccessChain 31(data) 34 33 35
+             357:      6(int) Load 356
+             358:   17(ivec4) Load 19(ballot)
+             359:      6(int) GroupNonUniformIMul 178 PartitionedReduceNV 357 358
+             360:     90(ptr) AccessChain 31(data) 355 33 35
+                              Store 360 359
+             361:      6(int) Load 8(invocation)
+             362:     40(ptr) AccessChain 31(data) 63 33
+             363:   17(ivec4) Load 362
+             364:   96(ivec2) VectorShuffle 363 363 0 1
+             365:   17(ivec4) Load 19(ballot)
+             366:   96(ivec2) GroupNonUniformIMul 178 PartitionedReduceNV 364 365
+             367:     40(ptr) AccessChain 31(data) 361 33
+             368:   17(ivec4) Load 367
+             369:   17(ivec4) VectorShuffle 368 366 4 5 2 3
+                              Store 367 369
+             370:      6(int) Load 8(invocation)
+             371:     40(ptr) AccessChain 31(data) 33 33
+             372:   17(ivec4) Load 371
+             373:  103(ivec3) VectorShuffle 372 372 0 1 2
+             374:   17(ivec4) Load 19(ballot)
+             375:  103(ivec3) GroupNonUniformIMul 178 PartitionedReduceNV 373 374
+             376:     40(ptr) AccessChain 31(data) 370 33
+             377:   17(ivec4) Load 376
+             378:   17(ivec4) VectorShuffle 377 375 4 5 6 3
+                              Store 376 378
+             379:      6(int) Load 8(invocation)
+             380:     40(ptr) AccessChain 31(data) 115 33
+             381:   17(ivec4) Load 380
+             382:   17(ivec4) Load 19(ballot)
+             383:   17(ivec4) GroupNonUniformIMul 178 PartitionedReduceNV 381 382
+             384:     40(ptr) AccessChain 31(data) 379 33
+                              Store 384 383
+             385:      6(int) Load 8(invocation)
+             386:    116(ptr) AccessChain 31(data) 34 115 35
+             387:26(float64_t) Load 386
+             388:   17(ivec4) Load 19(ballot)
+             389:26(float64_t) GroupNonUniformFMul 178 PartitionedReduceNV 387 388
+             390:    116(ptr) AccessChain 31(data) 385 115 35
+                              Store 390 389
+             391:      6(int) Load 8(invocation)
+             392:    123(ptr) AccessChain 31(data) 63 115
+             393: 27(f64vec4) Load 392
+             394:122(f64vec2) VectorShuffle 393 393 0 1
+             395:   17(ivec4) Load 19(ballot)
+             396:122(f64vec2) GroupNonUniformFMul 178 PartitionedReduceNV 394 395
+             397:    123(ptr) AccessChain 31(data) 391 115
+             398: 27(f64vec4) Load 397
+             399: 27(f64vec4) VectorShuffle 398 396 4 5 2 3
+                              Store 397 399
+             400:      6(int) Load 8(invocation)
+             401:    123(ptr) AccessChain 31(data) 33 115
+             402: 27(f64vec4) Load 401
+             403:130(f64vec3) VectorShuffle 402 402 0 1 2
+             404:   17(ivec4) Load 19(ballot)
+             405:130(f64vec3) GroupNonUniformFMul 178 PartitionedReduceNV 403 404
+             406:    123(ptr) AccessChain 31(data) 400 115
+             407: 27(f64vec4) Load 406
+             408: 27(f64vec4) VectorShuffle 407 405 4 5 6 3
+                              Store 406 408
+             409:      6(int) Load 8(invocation)
+             410:    123(ptr) AccessChain 31(data) 115 115
+             411: 27(f64vec4) Load 410
+             412:   17(ivec4) Load 19(ballot)
+             413: 27(f64vec4) GroupNonUniformFMul 178 PartitionedReduceNV 411 412
+             414:    123(ptr) AccessChain 31(data) 409 115
+                              Store 414 413
+             415:      6(int) Load 8(invocation)
+             416:     36(ptr) AccessChain 31(data) 34 34 35
+             417:   22(float) Load 416
+             418:   17(ivec4) Load 19(ballot)
+             419:   22(float) GroupNonUniformFMin 178 PartitionedReduceNV 417 418
+             420:     36(ptr) AccessChain 31(data) 415 34 35
+                              Store 420 419
+             421:      6(int) Load 8(invocation)
+             422:     44(ptr) AccessChain 31(data) 63 34
+             423:   23(fvec4) Load 422
+             424:   43(fvec2) VectorShuffle 423 423 0 1
+             425:   17(ivec4) Load 19(ballot)
+             426:   43(fvec2) GroupNonUniformFMin 178 PartitionedReduceNV 424 425
+             427:     44(ptr) AccessChain 31(data) 421 34
+             428:   23(fvec4) Load 427
+             429:   23(fvec4) VectorShuffle 428 426 4 5 2 3
+                              Store 427 429
+             430:      6(int) Load 8(invocation)
+             431:     44(ptr) AccessChain 31(data) 33 34
+             432:   23(fvec4) Load 431
+             433:   51(fvec3) VectorShuffle 432 432 0 1 2
+             434:   17(ivec4) Load 19(ballot)
+             435:   51(fvec3) GroupNonUniformFMin 178 PartitionedReduceNV 433 434
+             436:     44(ptr) AccessChain 31(data) 430 34
+             437:   23(fvec4) Load 436
+             438:   23(fvec4) VectorShuffle 437 435 4 5 6 3
+                              Store 436 438
+             439:      6(int) Load 8(invocation)
+             440:     44(ptr) AccessChain 31(data) 115 34
+             441:   23(fvec4) Load 440
+             442:   17(ivec4) Load 19(ballot)
+             443:   23(fvec4) GroupNonUniformFMin 178 PartitionedReduceNV 441 442
+             444:     44(ptr) AccessChain 31(data) 439 34
+                              Store 444 443
+             445:      6(int) Load 8(invocation)
+             446:     64(ptr) AccessChain 31(data) 34 63 35
+             447:     24(int) Load 446
+             448:   17(ivec4) Load 19(ballot)
+             449:     24(int) GroupNonUniformSMin 178 PartitionedReduceNV 447 448
+             450:     64(ptr) AccessChain 31(data) 445 63 35
+                              Store 450 449
+             451:      6(int) Load 8(invocation)
+             452:     71(ptr) AccessChain 31(data) 63 63
+             453:   25(ivec4) Load 452
+             454:   70(ivec2) VectorShuffle 453 453 0 1
+             455:   17(ivec4) Load 19(ballot)
+             456:   70(ivec2) GroupNonUniformSMin 178 PartitionedReduceNV 454 455
+             457:     71(ptr) AccessChain 31(data) 451 63
+             458:   25(ivec4) Load 457
+             459:   25(ivec4) VectorShuffle 458 456 4 5 2 3
+                              Store 457 459
+             460:      6(int) Load 8(invocation)
+             461:     71(ptr) AccessChain 31(data) 33 63
+             462:   25(ivec4) Load 461
+             463:   78(ivec3) VectorShuffle 462 462 0 1 2
+             464:   17(ivec4) Load 19(ballot)
+             465:   78(ivec3) GroupNonUniformSMin 178 PartitionedReduceNV 463 464
+             466:     71(ptr) AccessChain 31(data) 460 63
+             467:   25(ivec4) Load 466
+             468:   25(ivec4) VectorShuffle 467 465 4 5 6 3
+                              Store 466 468
+             469:      6(int) Load 8(invocation)
+             470:     71(ptr) AccessChain 31(data) 115 63
+             471:   25(ivec4) Load 470
+             472:   17(ivec4) Load 19(ballot)
+             473:   25(ivec4) GroupNonUniformSMin 178 PartitionedReduceNV 471 472
+             474:     71(ptr) AccessChain 31(data) 469 63
+                              Store 474 473
+             475:      6(int) Load 8(invocation)
+             476:     90(ptr) AccessChain 31(data) 34 33 35
+             477:      6(int) Load 476
+             478:   17(ivec4) Load 19(ballot)
+             479:      6(int) GroupNonUniformUMin 178 PartitionedReduceNV 477 478
+             480:     90(ptr) AccessChain 31(data) 475 33 35
+                              Store 480 479
+             481:      6(int) Load 8(invocation)
+             482:     40(ptr) AccessChain 31(data) 63 33
+             483:   17(ivec4) Load 482
+             484:   96(ivec2) VectorShuffle 483 483 0 1
+             485:   17(ivec4) Load 19(ballot)
+             486:   96(ivec2) GroupNonUniformUMin 178 PartitionedReduceNV 484 485
+             487:     40(ptr) AccessChain 31(data) 481 33
+             488:   17(ivec4) Load 487
+             489:   17(ivec4) VectorShuffle 488 486 4 5 2 3
+                              Store 487 489
+             490:      6(int) Load 8(invocation)
+             491:     40(ptr) AccessChain 31(data) 33 33
+             492:   17(ivec4) Load 491
+             493:  103(ivec3) VectorShuffle 492 492 0 1 2
+             494:   17(ivec4) Load 19(ballot)
+             495:  103(ivec3) GroupNonUniformUMin 178 PartitionedReduceNV 493 494
+             496:     40(ptr) AccessChain 31(data) 490 33
+             497:   17(ivec4) Load 496
+             498:   17(ivec4) VectorShuffle 497 495 4 5 6 3
+                              Store 496 498
+             499:      6(int) Load 8(invocation)
+             500:     40(ptr) AccessChain 31(data) 115 33
+             501:   17(ivec4) Load 500
+             502:   17(ivec4) Load 19(ballot)
+             503:   17(ivec4) GroupNonUniformUMin 178 PartitionedReduceNV 501 502
+             504:     40(ptr) AccessChain 31(data) 499 33
+                              Store 504 503
+             505:      6(int) Load 8(invocation)
+             506:    116(ptr) AccessChain 31(data) 34 115 35
+             507:26(float64_t) Load 506
+             508:   17(ivec4) Load 19(ballot)
+             509:26(float64_t) GroupNonUniformFMin 178 PartitionedReduceNV 507 508
+             510:    116(ptr) AccessChain 31(data) 505 115 35
+                              Store 510 509
+             511:      6(int) Load 8(invocation)
+             512:    123(ptr) AccessChain 31(data) 63 115
+             513: 27(f64vec4) Load 512
+             514:122(f64vec2) VectorShuffle 513 513 0 1
+             515:   17(ivec4) Load 19(ballot)
+             516:122(f64vec2) GroupNonUniformFMin 178 PartitionedReduceNV 514 515
+             517:    123(ptr) AccessChain 31(data) 511 115
+             518: 27(f64vec4) Load 517
+             519: 27(f64vec4) VectorShuffle 518 516 4 5 2 3
+                              Store 517 519
+             520:      6(int) Load 8(invocation)
+             521:    123(ptr) AccessChain 31(data) 33 115
+             522: 27(f64vec4) Load 521
+             523:130(f64vec3) VectorShuffle 522 522 0 1 2
+             524:   17(ivec4) Load 19(ballot)
+             525:130(f64vec3) GroupNonUniformFMin 178 PartitionedReduceNV 523 524
+             526:    123(ptr) AccessChain 31(data) 520 115
+             527: 27(f64vec4) Load 526
+             528: 27(f64vec4) VectorShuffle 527 525 4 5 6 3
+                              Store 526 528
+             529:      6(int) Load 8(invocation)
+             530:    123(ptr) AccessChain 31(data) 115 115
+             531: 27(f64vec4) Load 530
+             532:   17(ivec4) Load 19(ballot)
+             533: 27(f64vec4) GroupNonUniformFMin 178 PartitionedReduceNV 531 532
+             534:    123(ptr) AccessChain 31(data) 529 115
+                              Store 534 533
+             535:      6(int) Load 8(invocation)
+             536:     36(ptr) AccessChain 31(data) 34 34 35
+             537:   22(float) Load 536
+             538:   17(ivec4) Load 19(ballot)
+             539:   22(float) GroupNonUniformFMax 178 PartitionedReduceNV 537 538
+             540:     36(ptr) AccessChain 31(data) 535 34 35
+                              Store 540 539
+             541:      6(int) Load 8(invocation)
+             542:     44(ptr) AccessChain 31(data) 63 34
+             543:   23(fvec4) Load 542
+             544:   43(fvec2) VectorShuffle 543 543 0 1
+             545:   17(ivec4) Load 19(ballot)
+             546:   43(fvec2) GroupNonUniformFMax 178 PartitionedReduceNV 544 545
+             547:     44(ptr) AccessChain 31(data) 541 34
+             548:   23(fvec4) Load 547
+             549:   23(fvec4) VectorShuffle 548 546 4 5 2 3
+                              Store 547 549
+             550:      6(int) Load 8(invocation)
+             551:     44(ptr) AccessChain 31(data) 33 34
+             552:   23(fvec4) Load 551
+             553:   51(fvec3) VectorShuffle 552 552 0 1 2
+             554:   17(ivec4) Load 19(ballot)
+             555:   51(fvec3) GroupNonUniformFMax 178 PartitionedReduceNV 553 554
+             556:     44(ptr) AccessChain 31(data) 550 34
+             557:   23(fvec4) Load 556
+             558:   23(fvec4) VectorShuffle 557 555 4 5 6 3
+                              Store 556 558
+             559:      6(int) Load 8(invocation)
+             560:     44(ptr) AccessChain 31(data) 115 34
+             561:   23(fvec4) Load 560
+             562:   17(ivec4) Load 19(ballot)
+             563:   23(fvec4) GroupNonUniformFMax 178 PartitionedReduceNV 561 562
+             564:     44(ptr) AccessChain 31(data) 559 34
+                              Store 564 563
+             565:      6(int) Load 8(invocation)
+             566:     64(ptr) AccessChain 31(data) 34 63 35
+             567:     24(int) Load 566
+             568:   17(ivec4) Load 19(ballot)
+             569:     24(int) GroupNonUniformSMax 178 PartitionedReduceNV 567 568
+             570:     64(ptr) AccessChain 31(data) 565 63 35
+                              Store 570 569
+             571:      6(int) Load 8(invocation)
+             572:     71(ptr) AccessChain 31(data) 63 63
+             573:   25(ivec4) Load 572
+             574:   70(ivec2) VectorShuffle 573 573 0 1
+             575:   17(ivec4) Load 19(ballot)
+             576:   70(ivec2) GroupNonUniformSMax 178 PartitionedReduceNV 574 575
+             577:     71(ptr) AccessChain 31(data) 571 63
+             578:   25(ivec4) Load 577
+             579:   25(ivec4) VectorShuffle 578 576 4 5 2 3
+                              Store 577 579
+             580:      6(int) Load 8(invocation)
+             581:     71(ptr) AccessChain 31(data) 33 63
+             582:   25(ivec4) Load 581
+             583:   78(ivec3) VectorShuffle 582 582 0 1 2
+             584:   17(ivec4) Load 19(ballot)
+             585:   78(ivec3) GroupNonUniformSMax 178 PartitionedReduceNV 583 584
+             586:     71(ptr) AccessChain 31(data) 580 63
+             587:   25(ivec4) Load 586
+             588:   25(ivec4) VectorShuffle 587 585 4 5 6 3
+                              Store 586 588
+             589:      6(int) Load 8(invocation)
+             590:     71(ptr) AccessChain 31(data) 115 63
+             591:   25(ivec4) Load 590
+             592:   17(ivec4) Load 19(ballot)
+             593:   25(ivec4) GroupNonUniformSMax 178 PartitionedReduceNV 591 592
+             594:     71(ptr) AccessChain 31(data) 589 63
+                              Store 594 593
+             595:      6(int) Load 8(invocation)
+             596:     90(ptr) AccessChain 31(data) 34 33 35
+             597:      6(int) Load 596
+             598:   17(ivec4) Load 19(ballot)
+             599:      6(int) GroupNonUniformUMax 178 PartitionedReduceNV 597 598
+             600:     90(ptr) AccessChain 31(data) 595 33 35
+                              Store 600 599
+             601:      6(int) Load 8(invocation)
+             602:     40(ptr) AccessChain 31(data) 63 33
+             603:   17(ivec4) Load 602
+             604:   96(ivec2) VectorShuffle 603 603 0 1
+             605:   17(ivec4) Load 19(ballot)
+             606:   96(ivec2) GroupNonUniformUMax 178 PartitionedReduceNV 604 605
+             607:     40(ptr) AccessChain 31(data) 601 33
+             608:   17(ivec4) Load 607
+             609:   17(ivec4) VectorShuffle 608 606 4 5 2 3
+                              Store 607 609
+             610:      6(int) Load 8(invocation)
+             611:     40(ptr) AccessChain 31(data) 33 33
+             612:   17(ivec4) Load 611
+             613:  103(ivec3) VectorShuffle 612 612 0 1 2
+             614:   17(ivec4) Load 19(ballot)
+             615:  103(ivec3) GroupNonUniformUMax 178 PartitionedReduceNV 613 614
+             616:     40(ptr) AccessChain 31(data) 610 33
+             617:   17(ivec4) Load 616
+             618:   17(ivec4) VectorShuffle 617 615 4 5 6 3
+                              Store 616 618
+             619:      6(int) Load 8(invocation)
+             620:     40(ptr) AccessChain 31(data) 115 33
+             621:   17(ivec4) Load 620
+             622:   17(ivec4) Load 19(ballot)
+             623:   17(ivec4) GroupNonUniformUMax 178 PartitionedReduceNV 621 622
+             624:     40(ptr) AccessChain 31(data) 619 33
+                              Store 624 623
+             625:      6(int) Load 8(invocation)
+             626:    116(ptr) AccessChain 31(data) 34 115 35
+             627:26(float64_t) Load 626
+             628:   17(ivec4) Load 19(ballot)
+             629:26(float64_t) GroupNonUniformFMax 178 PartitionedReduceNV 627 628
+             630:    116(ptr) AccessChain 31(data) 625 115 35
+                              Store 630 629
+             631:      6(int) Load 8(invocation)
+             632:    123(ptr) AccessChain 31(data) 63 115
+             633: 27(f64vec4) Load 632
+             634:122(f64vec2) VectorShuffle 633 633 0 1
+             635:   17(ivec4) Load 19(ballot)
+             636:122(f64vec2) GroupNonUniformFMax 178 PartitionedReduceNV 634 635
+             637:    123(ptr) AccessChain 31(data) 631 115
+             638: 27(f64vec4) Load 637
+             639: 27(f64vec4) VectorShuffle 638 636 4 5 2 3
+                              Store 637 639
+             640:      6(int) Load 8(invocation)
+             641:    123(ptr) AccessChain 31(data) 33 115
+             642: 27(f64vec4) Load 641
+             643:130(f64vec3) VectorShuffle 642 642 0 1 2
+             644:   17(ivec4) Load 19(ballot)
+             645:130(f64vec3) GroupNonUniformFMax 178 PartitionedReduceNV 643 644
+             646:    123(ptr) AccessChain 31(data) 640 115
+             647: 27(f64vec4) Load 646
+             648: 27(f64vec4) VectorShuffle 647 645 4 5 6 3
+                              Store 646 648
+             649:      6(int) Load 8(invocation)
+             650:    123(ptr) AccessChain 31(data) 115 115
+             651: 27(f64vec4) Load 650
+             652:   17(ivec4) Load 19(ballot)
+             653: 27(f64vec4) GroupNonUniformFMax 178 PartitionedReduceNV 651 652
+             654:    123(ptr) AccessChain 31(data) 649 115
+                              Store 654 653
+             655:      6(int) Load 8(invocation)
+             656:     64(ptr) AccessChain 31(data) 34 63 35
+             657:     24(int) Load 656
+             658:   17(ivec4) Load 19(ballot)
+             659:     24(int) GroupNonUniformBitwiseAnd 178 PartitionedReduceNV 657 658
+             660:     64(ptr) AccessChain 31(data) 655 63 35
+                              Store 660 659
+             661:      6(int) Load 8(invocation)
+             662:     71(ptr) AccessChain 31(data) 63 63
+             663:   25(ivec4) Load 662
+             664:   70(ivec2) VectorShuffle 663 663 0 1
+             665:   17(ivec4) Load 19(ballot)
+             666:   70(ivec2) GroupNonUniformBitwiseAnd 178 PartitionedReduceNV 664 665
+             667:     71(ptr) AccessChain 31(data) 661 63
+             668:   25(ivec4) Load 667
+             669:   25(ivec4) VectorShuffle 668 666 4 5 2 3
+                              Store 667 669
+             670:      6(int) Load 8(invocation)
+             671:     71(ptr) AccessChain 31(data) 33 63
+             672:   25(ivec4) Load 671
+             673:   78(ivec3) VectorShuffle 672 672 0 1 2
+             674:   17(ivec4) Load 19(ballot)
+             675:   78(ivec3) GroupNonUniformBitwiseAnd 178 PartitionedReduceNV 673 674
+             676:     71(ptr) AccessChain 31(data) 670 63
+             677:   25(ivec4) Load 676
+             678:   25(ivec4) VectorShuffle 677 675 4 5 6 3
+                              Store 676 678
+             679:      6(int) Load 8(invocation)
+             680:     71(ptr) AccessChain 31(data) 115 63
+             681:   25(ivec4) Load 680
+             682:   17(ivec4) Load 19(ballot)
+             683:   25(ivec4) GroupNonUniformBitwiseAnd 178 PartitionedReduceNV 681 682
+             684:     71(ptr) AccessChain 31(data) 679 63
+                              Store 684 683
+             685:      6(int) Load 8(invocation)
+             686:     90(ptr) AccessChain 31(data) 34 33 35
+             687:      6(int) Load 686
+             688:   17(ivec4) Load 19(ballot)
+             689:      6(int) GroupNonUniformBitwiseAnd 178 PartitionedReduceNV 687 688
+             690:     90(ptr) AccessChain 31(data) 685 33 35
+                              Store 690 689
+             691:      6(int) Load 8(invocation)
+             692:     40(ptr) AccessChain 31(data) 63 33
+             693:   17(ivec4) Load 692
+             694:   96(ivec2) VectorShuffle 693 693 0 1
+             695:   17(ivec4) Load 19(ballot)
+             696:   96(ivec2) GroupNonUniformBitwiseAnd 178 PartitionedReduceNV 694 695
+             697:     40(ptr) AccessChain 31(data) 691 33
+             698:   17(ivec4) Load 697
+             699:   17(ivec4) VectorShuffle 698 696 4 5 2 3
+                              Store 697 699
+             700:      6(int) Load 8(invocation)
+             701:     40(ptr) AccessChain 31(data) 33 33
+             702:   17(ivec4) Load 701
+             703:  103(ivec3) VectorShuffle 702 702 0 1 2
+             704:   17(ivec4) Load 19(ballot)
+             705:  103(ivec3) GroupNonUniformBitwiseAnd 178 PartitionedReduceNV 703 704
+             706:     40(ptr) AccessChain 31(data) 700 33
+             707:   17(ivec4) Load 706
+             708:   17(ivec4) VectorShuffle 707 705 4 5 6 3
+                              Store 706 708
+             709:      6(int) Load 8(invocation)
+             710:     40(ptr) AccessChain 31(data) 115 33
+             711:   17(ivec4) Load 710
+             712:   17(ivec4) Load 19(ballot)
+             713:   17(ivec4) GroupNonUniformBitwiseAnd 178 PartitionedReduceNV 711 712
+             714:     40(ptr) AccessChain 31(data) 709 33
+                              Store 714 713
+             715:      6(int) Load 8(invocation)
+             716:     64(ptr) AccessChain 31(data) 34 63 35
+             717:     24(int) Load 716
+             718:   144(bool) SLessThan 717 34
+             719:   17(ivec4) Load 19(ballot)
+             720:   144(bool) GroupNonUniformLogicalAnd 178 PartitionedReduceNV 718 719
+             721:     24(int) Select 720 63 34
+             722:     64(ptr) AccessChain 31(data) 715 63 35
+                              Store 722 721
+             723:      6(int) Load 8(invocation)
+             724:     71(ptr) AccessChain 31(data) 63 63
+             725:   25(ivec4) Load 724
+             726:   70(ivec2) VectorShuffle 725 725 0 1
+             728:  152(bvec2) SLessThan 726 727
+             729:   17(ivec4) Load 19(ballot)
+             730:  152(bvec2) GroupNonUniformLogicalAnd 178 PartitionedReduceNV 728 729
+             732:   70(ivec2) Select 730 731 727
+             733:     71(ptr) AccessChain 31(data) 723 63
+             734:   25(ivec4) Load 733
+             735:   25(ivec4) VectorShuffle 734 732 4 5 2 3
+                              Store 733 735
+             736:      6(int) Load 8(invocation)
+             737:     71(ptr) AccessChain 31(data) 63 63
+             738:   25(ivec4) Load 737
+             739:   78(ivec3) VectorShuffle 738 738 0 1 2
+             741:  161(bvec3) SLessThan 739 740
+             742:   17(ivec4) Load 19(ballot)
+             743:  161(bvec3) GroupNonUniformLogicalAnd 178 PartitionedReduceNV 741 742
+             745:   78(ivec3) Select 743 744 740
+             746:     71(ptr) AccessChain 31(data) 736 63
+             747:   25(ivec4) Load 746
+             748:   25(ivec4) VectorShuffle 747 745 4 5 6 3
+                              Store 746 748
+             749:      6(int) Load 8(invocation)
+             750:     71(ptr) AccessChain 31(data) 63 63
+             751:   25(ivec4) Load 750
+             753:  169(bvec4) SLessThan 751 752
+             754:   17(ivec4) Load 19(ballot)
+             755:  169(bvec4) GroupNonUniformLogicalAnd 178 PartitionedReduceNV 753 754
+             757:   25(ivec4) Select 755 756 752
+             758:     71(ptr) AccessChain 31(data) 749 63
+                              Store 758 757
+             759:      6(int) Load 8(invocation)
+             760:     64(ptr) AccessChain 31(data) 34 63 35
+             761:     24(int) Load 760
+             762:   17(ivec4) Load 19(ballot)
+             763:     24(int) GroupNonUniformBitwiseOr 178 PartitionedReduceNV 761 762
+             764:     64(ptr) AccessChain 31(data) 759 63 35
+                              Store 764 763
+             765:      6(int) Load 8(invocation)
+             766:     71(ptr) AccessChain 31(data) 63 63
+             767:   25(ivec4) Load 766
+             768:   70(ivec2) VectorShuffle 767 767 0 1
+             769:   17(ivec4) Load 19(ballot)
+             770:   70(ivec2) GroupNonUniformBitwiseOr 178 PartitionedReduceNV 768 769
+             771:     71(ptr) AccessChain 31(data) 765 63
+             772:   25(ivec4) Load 771
+             773:   25(ivec4) VectorShuffle 772 770 4 5 2 3
+                              Store 771 773
+             774:      6(int) Load 8(invocation)
+             775:     71(ptr) AccessChain 31(data) 33 63
+             776:   25(ivec4) Load 775
+             777:   78(ivec3) VectorShuffle 776 776 0 1 2
+             778:   17(ivec4) Load 19(ballot)
+             779:   78(ivec3) GroupNonUniformBitwiseOr 178 PartitionedReduceNV 777 778
+             780:     71(ptr) AccessChain 31(data) 774 63
+             781:   25(ivec4) Load 780
+             782:   25(ivec4) VectorShuffle 781 779 4 5 6 3
+                              Store 780 782
+             783:      6(int) Load 8(invocation)
+             784:     71(ptr) AccessChain 31(data) 115 63
+             785:   25(ivec4) Load 784
+             786:   17(ivec4) Load 19(ballot)
+             787:   25(ivec4) GroupNonUniformBitwiseOr 178 PartitionedReduceNV 785 786
+             788:     71(ptr) AccessChain 31(data) 783 63
+                              Store 788 787
+             789:      6(int) Load 8(invocation)
+             790:     90(ptr) AccessChain 31(data) 34 33 35
+             791:      6(int) Load 790
+             792:   17(ivec4) Load 19(ballot)
+             793:      6(int) GroupNonUniformBitwiseOr 178 PartitionedReduceNV 791 792
+             794:     90(ptr) AccessChain 31(data) 789 33 35
+                              Store 794 793
+             795:      6(int) Load 8(invocation)
+             796:     40(ptr) AccessChain 31(data) 63 33
+             797:   17(ivec4) Load 796
+             798:   96(ivec2) VectorShuffle 797 797 0 1
+             799:   17(ivec4) Load 19(ballot)
+             800:   96(ivec2) GroupNonUniformBitwiseOr 178 PartitionedReduceNV 798 799
+             801:     40(ptr) AccessChain 31(data) 795 33
+             802:   17(ivec4) Load 801
+             803:   17(ivec4) VectorShuffle 802 800 4 5 2 3
+                              Store 801 803
+             804:      6(int) Load 8(invocation)
+             805:     40(ptr) AccessChain 31(data) 33 33
+             806:   17(ivec4) Load 805
+             807:  103(ivec3) VectorShuffle 806 806 0 1 2
+             808:   17(ivec4) Load 19(ballot)
+             809:  103(ivec3) GroupNonUniformBitwiseOr 178 PartitionedReduceNV 807 808
+             810:     40(ptr) AccessChain 31(data) 804 33
+             811:   17(ivec4) Load 810
+             812:   17(ivec4) VectorShuffle 811 809 4 5 6 3
+                              Store 810 812
+             813:      6(int) Load 8(invocation)
+             814:     40(ptr) AccessChain 31(data) 115 33
+             815:   17(ivec4) Load 814
+             816:   17(ivec4) Load 19(ballot)
+             817:   17(ivec4) GroupNonUniformBitwiseOr 178 PartitionedReduceNV 815 816
+             818:     40(ptr) AccessChain 31(data) 813 33
+                              Store 818 817
+             819:      6(int) Load 8(invocation)
+             820:     64(ptr) AccessChain 31(data) 34 63 35
+             821:     24(int) Load 820
+             822:   144(bool) SLessThan 821 34
+             823:   17(ivec4) Load 19(ballot)
+             824:   144(bool) GroupNonUniformLogicalOr 178 PartitionedReduceNV 822 823
+             825:     24(int) Select 824 63 34
+             826:     64(ptr) AccessChain 31(data) 819 63 35
+                              Store 826 825
+             827:      6(int) Load 8(invocation)
+             828:     71(ptr) AccessChain 31(data) 63 63
+             829:   25(ivec4) Load 828
+             830:   70(ivec2) VectorShuffle 829 829 0 1
+             831:  152(bvec2) SLessThan 830 727
+             832:   17(ivec4) Load 19(ballot)
+             833:  152(bvec2) GroupNonUniformLogicalOr 178 PartitionedReduceNV 831 832
+             834:   70(ivec2) Select 833 731 727
+             835:     71(ptr) AccessChain 31(data) 827 63
+             836:   25(ivec4) Load 835
+             837:   25(ivec4) VectorShuffle 836 834 4 5 2 3
+                              Store 835 837
+             838:      6(int) Load 8(invocation)
+             839:     71(ptr) AccessChain 31(data) 63 63
+             840:   25(ivec4) Load 839
+             841:   78(ivec3) VectorShuffle 840 840 0 1 2
+             842:  161(bvec3) SLessThan 841 740
+             843:   17(ivec4) Load 19(ballot)
+             844:  161(bvec3) GroupNonUniformLogicalOr 178 PartitionedReduceNV 842 843
+             845:   78(ivec3) Select 844 744 740
+             846:     71(ptr) AccessChain 31(data) 838 63
+             847:   25(ivec4) Load 846
+             848:   25(ivec4) VectorShuffle 847 845 4 5 6 3
+                              Store 846 848
+             849:      6(int) Load 8(invocation)
+             850:     71(ptr) AccessChain 31(data) 63 63
+             851:   25(ivec4) Load 850
+             852:  169(bvec4) SLessThan 851 752
+             853:   17(ivec4) Load 19(ballot)
+             854:  169(bvec4) GroupNonUniformLogicalOr 178 PartitionedReduceNV 852 853
+             855:   25(ivec4) Select 854 756 752
+             856:     71(ptr) AccessChain 31(data) 849 63
+                              Store 856 855
+             857:      6(int) Load 8(invocation)
+             858:     64(ptr) AccessChain 31(data) 34 63 35
+             859:     24(int) Load 858
+             860:   17(ivec4) Load 19(ballot)
+             861:     24(int) GroupNonUniformBitwiseXor 178 PartitionedReduceNV 859 860
+             862:     64(ptr) AccessChain 31(data) 857 63 35
+                              Store 862 861
+             863:      6(int) Load 8(invocation)
+             864:     71(ptr) AccessChain 31(data) 63 63
+             865:   25(ivec4) Load 864
+             866:   70(ivec2) VectorShuffle 865 865 0 1
+             867:   17(ivec4) Load 19(ballot)
+             868:   70(ivec2) GroupNonUniformBitwiseXor 178 PartitionedReduceNV 866 867
+             869:     71(ptr) AccessChain 31(data) 863 63
+             870:   25(ivec4) Load 869
+             871:   25(ivec4) VectorShuffle 870 868 4 5 2 3
+                              Store 869 871
+             872:      6(int) Load 8(invocation)
+             873:     71(ptr) AccessChain 31(data) 33 63
+             874:   25(ivec4) Load 873
+             875:   78(ivec3) VectorShuffle 874 874 0 1 2
+             876:   17(ivec4) Load 19(ballot)
+             877:   78(ivec3) GroupNonUniformBitwiseXor 178 PartitionedReduceNV 875 876
+             878:     71(ptr) AccessChain 31(data) 872 63
+             879:   25(ivec4) Load 878
+             880:   25(ivec4) VectorShuffle 879 877 4 5 6 3
+                              Store 878 880
+             881:      6(int) Load 8(invocation)
+             882:     71(ptr) AccessChain 31(data) 115 63
+             883:   25(ivec4) Load 882
+             884:   17(ivec4) Load 19(ballot)
+             885:   25(ivec4) GroupNonUniformBitwiseXor 178 PartitionedReduceNV 883 884
+             886:     71(ptr) AccessChain 31(data) 881 63
+                              Store 886 885
+             887:      6(int) Load 8(invocation)
+             888:     90(ptr) AccessChain 31(data) 34 33 35
+             889:      6(int) Load 888
+             890:   17(ivec4) Load 19(ballot)
+             891:      6(int) GroupNonUniformBitwiseXor 178 PartitionedReduceNV 889 890
+             892:     90(ptr) AccessChain 31(data) 887 33 35
+                              Store 892 891
+             893:      6(int) Load 8(invocation)
+             894:     40(ptr) AccessChain 31(data) 63 33
+             895:   17(ivec4) Load 894
+             896:   96(ivec2) VectorShuffle 895 895 0 1
+             897:   17(ivec4) Load 19(ballot)
+             898:   96(ivec2) GroupNonUniformBitwiseXor 178 PartitionedReduceNV 896 897
+             899:     40(ptr) AccessChain 31(data) 893 33
+             900:   17(ivec4) Load 899
+             901:   17(ivec4) VectorShuffle 900 898 4 5 2 3
+                              Store 899 901
+             902:      6(int) Load 8(invocation)
+             903:     40(ptr) AccessChain 31(data) 33 33
+             904:   17(ivec4) Load 903
+             905:  103(ivec3) VectorShuffle 904 904 0 1 2
+             906:   17(ivec4) Load 19(ballot)
+             907:  103(ivec3) GroupNonUniformBitwiseXor 178 PartitionedReduceNV 905 906
+             908:     40(ptr) AccessChain 31(data) 902 33
+             909:   17(ivec4) Load 908
+             910:   17(ivec4) VectorShuffle 909 907 4 5 6 3
+                              Store 908 910
+             911:      6(int) Load 8(invocation)
+             912:     40(ptr) AccessChain 31(data) 115 33
+             913:   17(ivec4) Load 912
+             914:   17(ivec4) Load 19(ballot)
+             915:   17(ivec4) GroupNonUniformBitwiseXor 178 PartitionedReduceNV 913 914
+             916:     40(ptr) AccessChain 31(data) 911 33
+                              Store 916 915
+             917:      6(int) Load 8(invocation)
+             918:     64(ptr) AccessChain 31(data) 34 63 35
+             919:     24(int) Load 918
+             920:   144(bool) SLessThan 919 34
+             921:   17(ivec4) Load 19(ballot)
+             922:   144(bool) GroupNonUniformLogicalXor 178 PartitionedReduceNV 920 921
+             923:     24(int) Select 922 63 34
+             924:     64(ptr) AccessChain 31(data) 917 63 35
+                              Store 924 923
+             925:      6(int) Load 8(invocation)
+             926:     71(ptr) AccessChain 31(data) 63 63
+             927:   25(ivec4) Load 926
+             928:   70(ivec2) VectorShuffle 927 927 0 1
+             929:  152(bvec2) SLessThan 928 727
+             930:   17(ivec4) Load 19(ballot)
+             931:  152(bvec2) GroupNonUniformLogicalXor 178 PartitionedReduceNV 929 930
+             932:   70(ivec2) Select 931 731 727
+             933:     71(ptr) AccessChain 31(data) 925 63
+             934:   25(ivec4) Load 933
+             935:   25(ivec4) VectorShuffle 934 932 4 5 2 3
+                              Store 933 935
+             936:      6(int) Load 8(invocation)
+             937:     71(ptr) AccessChain 31(data) 63 63
+             938:   25(ivec4) Load 937
+             939:   78(ivec3) VectorShuffle 938 938 0 1 2
+             940:  161(bvec3) SLessThan 939 740
+             941:   17(ivec4) Load 19(ballot)
+             942:  161(bvec3) GroupNonUniformLogicalXor 178 PartitionedReduceNV 940 941
+             943:   78(ivec3) Select 942 744 740
+             944:     71(ptr) AccessChain 31(data) 936 63
+             945:   25(ivec4) Load 944
+             946:   25(ivec4) VectorShuffle 945 943 4 5 6 3
+                              Store 944 946
+             947:      6(int) Load 8(invocation)
+             948:     71(ptr) AccessChain 31(data) 63 63
+             949:   25(ivec4) Load 948
+             950:  169(bvec4) SLessThan 949 752
+             951:   17(ivec4) Load 19(ballot)
+             952:  169(bvec4) GroupNonUniformLogicalXor 178 PartitionedReduceNV 950 951
+             953:   25(ivec4) Select 952 756 752
+             954:     71(ptr) AccessChain 31(data) 947 63
+                              Store 954 953
+             955:      6(int) Load 8(invocation)
+             956:     36(ptr) AccessChain 31(data) 34 34 35
+             957:   22(float) Load 956
+             958:   17(ivec4) Load 19(ballot)
+             959:   22(float) GroupNonUniformFAdd 178 PartitionedInclusiveScanNV 957 958
+             960:     36(ptr) AccessChain 31(data) 955 34 35
+                              Store 960 959
+             961:      6(int) Load 8(invocation)
+             962:     44(ptr) AccessChain 31(data) 63 34
+             963:   23(fvec4) Load 962
+             964:   43(fvec2) VectorShuffle 963 963 0 1
+             965:   17(ivec4) Load 19(ballot)
+             966:   43(fvec2) GroupNonUniformFAdd 178 PartitionedInclusiveScanNV 964 965
+             967:     44(ptr) AccessChain 31(data) 961 34
+             968:   23(fvec4) Load 967
+             969:   23(fvec4) VectorShuffle 968 966 4 5 2 3
+                              Store 967 969
+             970:      6(int) Load 8(invocation)
+             971:     44(ptr) AccessChain 31(data) 33 34
+             972:   23(fvec4) Load 971
+             973:   51(fvec3) VectorShuffle 972 972 0 1 2
+             974:   17(ivec4) Load 19(ballot)
+             975:   51(fvec3) GroupNonUniformFAdd 178 PartitionedInclusiveScanNV 973 974
+             976:     44(ptr) AccessChain 31(data) 970 34
+             977:   23(fvec4) Load 976
+             978:   23(fvec4) VectorShuffle 977 975 4 5 6 3
+                              Store 976 978
+             979:      6(int) Load 8(invocation)
+             980:     44(ptr) AccessChain 31(data) 115 34
+             981:   23(fvec4) Load 980
+             982:   17(ivec4) Load 19(ballot)
+             983:   23(fvec4) GroupNonUniformFAdd 178 PartitionedInclusiveScanNV 981 982
+             984:     44(ptr) AccessChain 31(data) 979 34
+                              Store 984 983
+             985:      6(int) Load 8(invocation)
+             986:     64(ptr) AccessChain 31(data) 34 63 35
+             987:     24(int) Load 986
+             988:   17(ivec4) Load 19(ballot)
+             989:     24(int) GroupNonUniformIAdd 178 PartitionedInclusiveScanNV 987 988
+             990:     64(ptr) AccessChain 31(data) 985 63 35
+                              Store 990 989
+             991:      6(int) Load 8(invocation)
+             992:     71(ptr) AccessChain 31(data) 63 63
+             993:   25(ivec4) Load 992
+             994:   70(ivec2) VectorShuffle 993 993 0 1
+             995:   17(ivec4) Load 19(ballot)
+             996:   70(ivec2) GroupNonUniformIAdd 178 PartitionedInclusiveScanNV 994 995
+             997:     71(ptr) AccessChain 31(data) 991 63
+             998:   25(ivec4) Load 997
+             999:   25(ivec4) VectorShuffle 998 996 4 5 2 3
+                              Store 997 999
+            1000:      6(int) Load 8(invocation)
+            1001:     71(ptr) AccessChain 31(data) 33 63
+            1002:   25(ivec4) Load 1001
+            1003:   78(ivec3) VectorShuffle 1002 1002 0 1 2
+            1004:   17(ivec4) Load 19(ballot)
+            1005:   78(ivec3) GroupNonUniformIAdd 178 PartitionedInclusiveScanNV 1003 1004
+            1006:     71(ptr) AccessChain 31(data) 1000 63
+            1007:   25(ivec4) Load 1006
+            1008:   25(ivec4) VectorShuffle 1007 1005 4 5 6 3
+                              Store 1006 1008
+            1009:      6(int) Load 8(invocation)
+            1010:     71(ptr) AccessChain 31(data) 115 63
+            1011:   25(ivec4) Load 1010
+            1012:   17(ivec4) Load 19(ballot)
+            1013:   25(ivec4) GroupNonUniformIAdd 178 PartitionedInclusiveScanNV 1011 1012
+            1014:     71(ptr) AccessChain 31(data) 1009 63
+                              Store 1014 1013
+            1015:      6(int) Load 8(invocation)
+            1016:     90(ptr) AccessChain 31(data) 34 33 35
+            1017:      6(int) Load 1016
+            1018:   17(ivec4) Load 19(ballot)
+            1019:      6(int) GroupNonUniformIAdd 178 PartitionedInclusiveScanNV 1017 1018
+            1020:     90(ptr) AccessChain 31(data) 1015 33 35
+                              Store 1020 1019
+            1021:      6(int) Load 8(invocation)
+            1022:     40(ptr) AccessChain 31(data) 63 33
+            1023:   17(ivec4) Load 1022
+            1024:   96(ivec2) VectorShuffle 1023 1023 0 1
+            1025:   17(ivec4) Load 19(ballot)
+            1026:   96(ivec2) GroupNonUniformIAdd 178 PartitionedInclusiveScanNV 1024 1025
+            1027:     40(ptr) AccessChain 31(data) 1021 33
+            1028:   17(ivec4) Load 1027
+            1029:   17(ivec4) VectorShuffle 1028 1026 4 5 2 3
+                              Store 1027 1029
+            1030:      6(int) Load 8(invocation)
+            1031:     40(ptr) AccessChain 31(data) 33 33
+            1032:   17(ivec4) Load 1031
+            1033:  103(ivec3) VectorShuffle 1032 1032 0 1 2
+            1034:   17(ivec4) Load 19(ballot)
+            1035:  103(ivec3) GroupNonUniformIAdd 178 PartitionedInclusiveScanNV 1033 1034
+            1036:     40(ptr) AccessChain 31(data) 1030 33
+            1037:   17(ivec4) Load 1036
+            1038:   17(ivec4) VectorShuffle 1037 1035 4 5 6 3
+                              Store 1036 1038
+            1039:      6(int) Load 8(invocation)
+            1040:     40(ptr) AccessChain 31(data) 115 33
+            1041:   17(ivec4) Load 1040
+            1042:   17(ivec4) Load 19(ballot)
+            1043:   17(ivec4) GroupNonUniformIAdd 178 PartitionedInclusiveScanNV 1041 1042
+            1044:     40(ptr) AccessChain 31(data) 1039 33
+                              Store 1044 1043
+            1045:      6(int) Load 8(invocation)
+            1046:    116(ptr) AccessChain 31(data) 34 115 35
+            1047:26(float64_t) Load 1046
+            1048:   17(ivec4) Load 19(ballot)
+            1049:26(float64_t) GroupNonUniformFAdd 178 PartitionedInclusiveScanNV 1047 1048
+            1050:    116(ptr) AccessChain 31(data) 1045 115 35
+                              Store 1050 1049
+            1051:      6(int) Load 8(invocation)
+            1052:    123(ptr) AccessChain 31(data) 63 115
+            1053: 27(f64vec4) Load 1052
+            1054:122(f64vec2) VectorShuffle 1053 1053 0 1
+            1055:   17(ivec4) Load 19(ballot)
+            1056:122(f64vec2) GroupNonUniformFAdd 178 PartitionedInclusiveScanNV 1054 1055
+            1057:    123(ptr) AccessChain 31(data) 1051 115
+            1058: 27(f64vec4) Load 1057
+            1059: 27(f64vec4) VectorShuffle 1058 1056 4 5 2 3
+                              Store 1057 1059
+            1060:      6(int) Load 8(invocation)
+            1061:    123(ptr) AccessChain 31(data) 33 115
+            1062: 27(f64vec4) Load 1061
+            1063:130(f64vec3) VectorShuffle 1062 1062 0 1 2
+            1064:   17(ivec4) Load 19(ballot)
+            1065:130(f64vec3) GroupNonUniformFAdd 178 PartitionedInclusiveScanNV 1063 1064
+            1066:    123(ptr) AccessChain 31(data) 1060 115
+            1067: 27(f64vec4) Load 1066
+            1068: 27(f64vec4) VectorShuffle 1067 1065 4 5 6 3
+                              Store 1066 1068
+            1069:      6(int) Load 8(invocation)
+            1070:    123(ptr) AccessChain 31(data) 115 115
+            1071: 27(f64vec4) Load 1070
+            1072:   17(ivec4) Load 19(ballot)
+            1073: 27(f64vec4) GroupNonUniformFAdd 178 PartitionedInclusiveScanNV 1071 1072
+            1074:    123(ptr) AccessChain 31(data) 1069 115
+                              Store 1074 1073
+            1075:      6(int) Load 8(invocation)
+            1076:     36(ptr) AccessChain 31(data) 34 34 35
+            1077:   22(float) Load 1076
+            1078:   17(ivec4) Load 19(ballot)
+            1079:   22(float) GroupNonUniformFMul 178 PartitionedInclusiveScanNV 1077 1078
+            1080:     36(ptr) AccessChain 31(data) 1075 34 35
+                              Store 1080 1079
+            1081:      6(int) Load 8(invocation)
+            1082:     44(ptr) AccessChain 31(data) 63 34
+            1083:   23(fvec4) Load 1082
+            1084:   43(fvec2) VectorShuffle 1083 1083 0 1
+            1085:   17(ivec4) Load 19(ballot)
+            1086:   43(fvec2) GroupNonUniformFMul 178 PartitionedInclusiveScanNV 1084 1085
+            1087:     44(ptr) AccessChain 31(data) 1081 34
+            1088:   23(fvec4) Load 1087
+            1089:   23(fvec4) VectorShuffle 1088 1086 4 5 2 3
+                              Store 1087 1089
+            1090:      6(int) Load 8(invocation)
+            1091:     44(ptr) AccessChain 31(data) 33 34
+            1092:   23(fvec4) Load 1091
+            1093:   51(fvec3) VectorShuffle 1092 1092 0 1 2
+            1094:   17(ivec4) Load 19(ballot)
+            1095:   51(fvec3) GroupNonUniformFMul 178 PartitionedInclusiveScanNV 1093 1094
+            1096:     44(ptr) AccessChain 31(data) 1090 34
+            1097:   23(fvec4) Load 1096
+            1098:   23(fvec4) VectorShuffle 1097 1095 4 5 6 3
+                              Store 1096 1098
+            1099:      6(int) Load 8(invocation)
+            1100:     44(ptr) AccessChain 31(data) 115 34
+            1101:   23(fvec4) Load 1100
+            1102:   17(ivec4) Load 19(ballot)
+            1103:   23(fvec4) GroupNonUniformFMul 178 PartitionedInclusiveScanNV 1101 1102
+            1104:     44(ptr) AccessChain 31(data) 1099 34
+                              Store 1104 1103
+            1105:      6(int) Load 8(invocation)
+            1106:     64(ptr) AccessChain 31(data) 34 63 35
+            1107:     24(int) Load 1106
+            1108:   17(ivec4) Load 19(ballot)
+            1109:     24(int) GroupNonUniformIMul 178 PartitionedInclusiveScanNV 1107 1108
+            1110:     64(ptr) AccessChain 31(data) 1105 63 35
+                              Store 1110 1109
+            1111:      6(int) Load 8(invocation)
+            1112:     71(ptr) AccessChain 31(data) 63 63
+            1113:   25(ivec4) Load 1112
+            1114:   70(ivec2) VectorShuffle 1113 1113 0 1
+            1115:   17(ivec4) Load 19(ballot)
+            1116:   70(ivec2) GroupNonUniformIMul 178 PartitionedInclusiveScanNV 1114 1115
+            1117:     71(ptr) AccessChain 31(data) 1111 63
+            1118:   25(ivec4) Load 1117
+            1119:   25(ivec4) VectorShuffle 1118 1116 4 5 2 3
+                              Store 1117 1119
+            1120:      6(int) Load 8(invocation)
+            1121:     71(ptr) AccessChain 31(data) 33 63
+            1122:   25(ivec4) Load 1121
+            1123:   78(ivec3) VectorShuffle 1122 1122 0 1 2
+            1124:   17(ivec4) Load 19(ballot)
+            1125:   78(ivec3) GroupNonUniformIMul 178 PartitionedInclusiveScanNV 1123 1124
+            1126:     71(ptr) AccessChain 31(data) 1120 63
+            1127:   25(ivec4) Load 1126
+            1128:   25(ivec4) VectorShuffle 1127 1125 4 5 6 3
+                              Store 1126 1128
+            1129:      6(int) Load 8(invocation)
+            1130:     71(ptr) AccessChain 31(data) 115 63
+            1131:   25(ivec4) Load 1130
+            1132:   17(ivec4) Load 19(ballot)
+            1133:   25(ivec4) GroupNonUniformIMul 178 PartitionedInclusiveScanNV 1131 1132
+            1134:     71(ptr) AccessChain 31(data) 1129 63
+                              Store 1134 1133
+            1135:      6(int) Load 8(invocation)
+            1136:     90(ptr) AccessChain 31(data) 34 33 35
+            1137:      6(int) Load 1136
+            1138:   17(ivec4) Load 19(ballot)
+            1139:      6(int) GroupNonUniformIMul 178 PartitionedInclusiveScanNV 1137 1138
+            1140:     90(ptr) AccessChain 31(data) 1135 33 35
+                              Store 1140 1139
+            1141:      6(int) Load 8(invocation)
+            1142:     40(ptr) AccessChain 31(data) 63 33
+            1143:   17(ivec4) Load 1142
+            1144:   96(ivec2) VectorShuffle 1143 1143 0 1
+            1145:   17(ivec4) Load 19(ballot)
+            1146:   96(ivec2) GroupNonUniformIMul 178 PartitionedInclusiveScanNV 1144 1145
+            1147:     40(ptr) AccessChain 31(data) 1141 33
+            1148:   17(ivec4) Load 1147
+            1149:   17(ivec4) VectorShuffle 1148 1146 4 5 2 3
+                              Store 1147 1149
+            1150:      6(int) Load 8(invocation)
+            1151:     40(ptr) AccessChain 31(data) 33 33
+            1152:   17(ivec4) Load 1151
+            1153:  103(ivec3) VectorShuffle 1152 1152 0 1 2
+            1154:   17(ivec4) Load 19(ballot)
+            1155:  103(ivec3) GroupNonUniformIMul 178 PartitionedInclusiveScanNV 1153 1154
+            1156:     40(ptr) AccessChain 31(data) 1150 33
+            1157:   17(ivec4) Load 1156
+            1158:   17(ivec4) VectorShuffle 1157 1155 4 5 6 3
+                              Store 1156 1158
+            1159:      6(int) Load 8(invocation)
+            1160:     40(ptr) AccessChain 31(data) 115 33
+            1161:   17(ivec4) Load 1160
+            1162:   17(ivec4) Load 19(ballot)
+            1163:   17(ivec4) GroupNonUniformIMul 178 PartitionedInclusiveScanNV 1161 1162
+            1164:     40(ptr) AccessChain 31(data) 1159 33
+                              Store 1164 1163
+            1165:      6(int) Load 8(invocation)
+            1166:    116(ptr) AccessChain 31(data) 34 115 35
+            1167:26(float64_t) Load 1166
+            1168:   17(ivec4) Load 19(ballot)
+            1169:26(float64_t) GroupNonUniformFMul 178 PartitionedInclusiveScanNV 1167 1168
+            1170:    116(ptr) AccessChain 31(data) 1165 115 35
+                              Store 1170 1169
+            1171:      6(int) Load 8(invocation)
+            1172:    123(ptr) AccessChain 31(data) 63 115
+            1173: 27(f64vec4) Load 1172
+            1174:122(f64vec2) VectorShuffle 1173 1173 0 1
+            1175:   17(ivec4) Load 19(ballot)
+            1176:122(f64vec2) GroupNonUniformFMul 178 PartitionedInclusiveScanNV 1174 1175
+            1177:    123(ptr) AccessChain 31(data) 1171 115
+            1178: 27(f64vec4) Load 1177
+            1179: 27(f64vec4) VectorShuffle 1178 1176 4 5 2 3
+                              Store 1177 1179
+            1180:      6(int) Load 8(invocation)
+            1181:    123(ptr) AccessChain 31(data) 33 115
+            1182: 27(f64vec4) Load 1181
+            1183:130(f64vec3) VectorShuffle 1182 1182 0 1 2
+            1184:   17(ivec4) Load 19(ballot)
+            1185:130(f64vec3) GroupNonUniformFMul 178 PartitionedInclusiveScanNV 1183 1184
+            1186:    123(ptr) AccessChain 31(data) 1180 115
+            1187: 27(f64vec4) Load 1186
+            1188: 27(f64vec4) VectorShuffle 1187 1185 4 5 6 3
+                              Store 1186 1188
+            1189:      6(int) Load 8(invocation)
+            1190:    123(ptr) AccessChain 31(data) 115 115
+            1191: 27(f64vec4) Load 1190
+            1192:   17(ivec4) Load 19(ballot)
+            1193: 27(f64vec4) GroupNonUniformFMul 178 PartitionedInclusiveScanNV 1191 1192
+            1194:    123(ptr) AccessChain 31(data) 1189 115
+                              Store 1194 1193
+            1195:      6(int) Load 8(invocation)
+            1196:     36(ptr) AccessChain 31(data) 34 34 35
+            1197:   22(float) Load 1196
+            1198:   17(ivec4) Load 19(ballot)
+            1199:   22(float) GroupNonUniformFMin 178 PartitionedInclusiveScanNV 1197 1198
+            1200:     36(ptr) AccessChain 31(data) 1195 34 35
+                              Store 1200 1199
+            1201:      6(int) Load 8(invocation)
+            1202:     44(ptr) AccessChain 31(data) 63 34
+            1203:   23(fvec4) Load 1202
+            1204:   43(fvec2) VectorShuffle 1203 1203 0 1
+            1205:   17(ivec4) Load 19(ballot)
+            1206:   43(fvec2) GroupNonUniformFMin 178 PartitionedInclusiveScanNV 1204 1205
+            1207:     44(ptr) AccessChain 31(data) 1201 34
+            1208:   23(fvec4) Load 1207
+            1209:   23(fvec4) VectorShuffle 1208 1206 4 5 2 3
+                              Store 1207 1209
+            1210:      6(int) Load 8(invocation)
+            1211:     44(ptr) AccessChain 31(data) 33 34
+            1212:   23(fvec4) Load 1211
+            1213:   51(fvec3) VectorShuffle 1212 1212 0 1 2
+            1214:   17(ivec4) Load 19(ballot)
+            1215:   51(fvec3) GroupNonUniformFMin 178 PartitionedInclusiveScanNV 1213 1214
+            1216:     44(ptr) AccessChain 31(data) 1210 34
+            1217:   23(fvec4) Load 1216
+            1218:   23(fvec4) VectorShuffle 1217 1215 4 5 6 3
+                              Store 1216 1218
+            1219:      6(int) Load 8(invocation)
+            1220:     44(ptr) AccessChain 31(data) 115 34
+            1221:   23(fvec4) Load 1220
+            1222:   17(ivec4) Load 19(ballot)
+            1223:   23(fvec4) GroupNonUniformFMin 178 PartitionedInclusiveScanNV 1221 1222
+            1224:     44(ptr) AccessChain 31(data) 1219 34
+                              Store 1224 1223
+            1225:      6(int) Load 8(invocation)
+            1226:     64(ptr) AccessChain 31(data) 34 63 35
+            1227:     24(int) Load 1226
+            1228:   17(ivec4) Load 19(ballot)
+            1229:     24(int) GroupNonUniformSMin 178 PartitionedInclusiveScanNV 1227 1228
+            1230:     64(ptr) AccessChain 31(data) 1225 63 35
+                              Store 1230 1229
+            1231:      6(int) Load 8(invocation)
+            1232:     71(ptr) AccessChain 31(data) 63 63
+            1233:   25(ivec4) Load 1232
+            1234:   70(ivec2) VectorShuffle 1233 1233 0 1
+            1235:   17(ivec4) Load 19(ballot)
+            1236:   70(ivec2) GroupNonUniformSMin 178 PartitionedInclusiveScanNV 1234 1235
+            1237:     71(ptr) AccessChain 31(data) 1231 63
+            1238:   25(ivec4) Load 1237
+            1239:   25(ivec4) VectorShuffle 1238 1236 4 5 2 3
+                              Store 1237 1239
+            1240:      6(int) Load 8(invocation)
+            1241:     71(ptr) AccessChain 31(data) 33 63
+            1242:   25(ivec4) Load 1241
+            1243:   78(ivec3) VectorShuffle 1242 1242 0 1 2
+            1244:   17(ivec4) Load 19(ballot)
+            1245:   78(ivec3) GroupNonUniformSMin 178 PartitionedInclusiveScanNV 1243 1244
+            1246:     71(ptr) AccessChain 31(data) 1240 63
+            1247:   25(ivec4) Load 1246
+            1248:   25(ivec4) VectorShuffle 1247 1245 4 5 6 3
+                              Store 1246 1248
+            1249:      6(int) Load 8(invocation)
+            1250:     71(ptr) AccessChain 31(data) 115 63
+            1251:   25(ivec4) Load 1250
+            1252:   17(ivec4) Load 19(ballot)
+            1253:   25(ivec4) GroupNonUniformSMin 178 PartitionedInclusiveScanNV 1251 1252
+            1254:     71(ptr) AccessChain 31(data) 1249 63
+                              Store 1254 1253
+            1255:      6(int) Load 8(invocation)
+            1256:     90(ptr) AccessChain 31(data) 34 33 35
+            1257:      6(int) Load 1256
+            1258:   17(ivec4) Load 19(ballot)
+            1259:      6(int) GroupNonUniformUMin 178 PartitionedInclusiveScanNV 1257 1258
+            1260:     90(ptr) AccessChain 31(data) 1255 33 35
+                              Store 1260 1259
+            1261:      6(int) Load 8(invocation)
+            1262:     40(ptr) AccessChain 31(data) 63 33
+            1263:   17(ivec4) Load 1262
+            1264:   96(ivec2) VectorShuffle 1263 1263 0 1
+            1265:   17(ivec4) Load 19(ballot)
+            1266:   96(ivec2) GroupNonUniformUMin 178 PartitionedInclusiveScanNV 1264 1265
+            1267:     40(ptr) AccessChain 31(data) 1261 33
+            1268:   17(ivec4) Load 1267
+            1269:   17(ivec4) VectorShuffle 1268 1266 4 5 2 3
+                              Store 1267 1269
+            1270:      6(int) Load 8(invocation)
+            1271:     40(ptr) AccessChain 31(data) 33 33
+            1272:   17(ivec4) Load 1271
+            1273:  103(ivec3) VectorShuffle 1272 1272 0 1 2
+            1274:   17(ivec4) Load 19(ballot)
+            1275:  103(ivec3) GroupNonUniformUMin 178 PartitionedInclusiveScanNV 1273 1274
+            1276:     40(ptr) AccessChain 31(data) 1270 33
+            1277:   17(ivec4) Load 1276
+            1278:   17(ivec4) VectorShuffle 1277 1275 4 5 6 3
+                              Store 1276 1278
+            1279:      6(int) Load 8(invocation)
+            1280:     40(ptr) AccessChain 31(data) 115 33
+            1281:   17(ivec4) Load 1280
+            1282:   17(ivec4) Load 19(ballot)
+            1283:   17(ivec4) GroupNonUniformUMin 178 PartitionedInclusiveScanNV 1281 1282
+            1284:     40(ptr) AccessChain 31(data) 1279 33
+                              Store 1284 1283
+            1285:      6(int) Load 8(invocation)
+            1286:    116(ptr) AccessChain 31(data) 34 115 35
+            1287:26(float64_t) Load 1286
+            1288:   17(ivec4) Load 19(ballot)
+            1289:26(float64_t) GroupNonUniformFMin 178 PartitionedInclusiveScanNV 1287 1288
+            1290:    116(ptr) AccessChain 31(data) 1285 115 35
+                              Store 1290 1289
+            1291:      6(int) Load 8(invocation)
+            1292:    123(ptr) AccessChain 31(data) 63 115
+            1293: 27(f64vec4) Load 1292
+            1294:122(f64vec2) VectorShuffle 1293 1293 0 1
+            1295:   17(ivec4) Load 19(ballot)
+            1296:122(f64vec2) GroupNonUniformFMin 178 PartitionedInclusiveScanNV 1294 1295
+            1297:    123(ptr) AccessChain 31(data) 1291 115
+            1298: 27(f64vec4) Load 1297
+            1299: 27(f64vec4) VectorShuffle 1298 1296 4 5 2 3
+                              Store 1297 1299
+            1300:      6(int) Load 8(invocation)
+            1301:    123(ptr) AccessChain 31(data) 33 115
+            1302: 27(f64vec4) Load 1301
+            1303:130(f64vec3) VectorShuffle 1302 1302 0 1 2
+            1304:   17(ivec4) Load 19(ballot)
+            1305:130(f64vec3) GroupNonUniformFMin 178 PartitionedInclusiveScanNV 1303 1304
+            1306:    123(ptr) AccessChain 31(data) 1300 115
+            1307: 27(f64vec4) Load 1306
+            1308: 27(f64vec4) VectorShuffle 1307 1305 4 5 6 3
+                              Store 1306 1308
+            1309:      6(int) Load 8(invocation)
+            1310:    123(ptr) AccessChain 31(data) 115 115
+            1311: 27(f64vec4) Load 1310
+            1312:   17(ivec4) Load 19(ballot)
+            1313: 27(f64vec4) GroupNonUniformFMin 178 PartitionedInclusiveScanNV 1311 1312
+            1314:    123(ptr) AccessChain 31(data) 1309 115
+                              Store 1314 1313
+            1315:      6(int) Load 8(invocation)
+            1316:     36(ptr) AccessChain 31(data) 34 34 35
+            1317:   22(float) Load 1316
+            1318:   17(ivec4) Load 19(ballot)
+            1319:   22(float) GroupNonUniformFMax 178 PartitionedInclusiveScanNV 1317 1318
+            1320:     36(ptr) AccessChain 31(data) 1315 34 35
+                              Store 1320 1319
+            1321:      6(int) Load 8(invocation)
+            1322:     44(ptr) AccessChain 31(data) 63 34
+            1323:   23(fvec4) Load 1322
+            1324:   43(fvec2) VectorShuffle 1323 1323 0 1
+            1325:   17(ivec4) Load 19(ballot)
+            1326:   43(fvec2) GroupNonUniformFMax 178 PartitionedInclusiveScanNV 1324 1325
+            1327:     44(ptr) AccessChain 31(data) 1321 34
+            1328:   23(fvec4) Load 1327
+            1329:   23(fvec4) VectorShuffle 1328 1326 4 5 2 3
+                              Store 1327 1329
+            1330:      6(int) Load 8(invocation)
+            1331:     44(ptr) AccessChain 31(data) 33 34
+            1332:   23(fvec4) Load 1331
+            1333:   51(fvec3) VectorShuffle 1332 1332 0 1 2
+            1334:   17(ivec4) Load 19(ballot)
+            1335:   51(fvec3) GroupNonUniformFMax 178 PartitionedInclusiveScanNV 1333 1334
+            1336:     44(ptr) AccessChain 31(data) 1330 34
+            1337:   23(fvec4) Load 1336
+            1338:   23(fvec4) VectorShuffle 1337 1335 4 5 6 3
+                              Store 1336 1338
+            1339:      6(int) Load 8(invocation)
+            1340:     44(ptr) AccessChain 31(data) 115 34
+            1341:   23(fvec4) Load 1340
+            1342:   17(ivec4) Load 19(ballot)
+            1343:   23(fvec4) GroupNonUniformFMax 178 PartitionedInclusiveScanNV 1341 1342
+            1344:     44(ptr) AccessChain 31(data) 1339 34
+                              Store 1344 1343
+            1345:      6(int) Load 8(invocation)
+            1346:     64(ptr) AccessChain 31(data) 34 63 35
+            1347:     24(int) Load 1346
+            1348:   17(ivec4) Load 19(ballot)
+            1349:     24(int) GroupNonUniformSMax 178 PartitionedInclusiveScanNV 1347 1348
+            1350:     64(ptr) AccessChain 31(data) 1345 63 35
+                              Store 1350 1349
+            1351:      6(int) Load 8(invocation)
+            1352:     71(ptr) AccessChain 31(data) 63 63
+            1353:   25(ivec4) Load 1352
+            1354:   70(ivec2) VectorShuffle 1353 1353 0 1
+            1355:   17(ivec4) Load 19(ballot)
+            1356:   70(ivec2) GroupNonUniformSMax 178 PartitionedInclusiveScanNV 1354 1355
+            1357:     71(ptr) AccessChain 31(data) 1351 63
+            1358:   25(ivec4) Load 1357
+            1359:   25(ivec4) VectorShuffle 1358 1356 4 5 2 3
+                              Store 1357 1359
+            1360:      6(int) Load 8(invocation)
+            1361:     71(ptr) AccessChain 31(data) 33 63
+            1362:   25(ivec4) Load 1361
+            1363:   78(ivec3) VectorShuffle 1362 1362 0 1 2
+            1364:   17(ivec4) Load 19(ballot)
+            1365:   78(ivec3) GroupNonUniformSMax 178 PartitionedInclusiveScanNV 1363 1364
+            1366:     71(ptr) AccessChain 31(data) 1360 63
+            1367:   25(ivec4) Load 1366
+            1368:   25(ivec4) VectorShuffle 1367 1365 4 5 6 3
+                              Store 1366 1368
+            1369:      6(int) Load 8(invocation)
+            1370:     71(ptr) AccessChain 31(data) 115 63
+            1371:   25(ivec4) Load 1370
+            1372:   17(ivec4) Load 19(ballot)
+            1373:   25(ivec4) GroupNonUniformSMax 178 PartitionedInclusiveScanNV 1371 1372
+            1374:     71(ptr) AccessChain 31(data) 1369 63
+                              Store 1374 1373
+            1375:      6(int) Load 8(invocation)
+            1376:     90(ptr) AccessChain 31(data) 34 33 35
+            1377:      6(int) Load 1376
+            1378:   17(ivec4) Load 19(ballot)
+            1379:      6(int) GroupNonUniformUMax 178 PartitionedInclusiveScanNV 1377 1378
+            1380:     90(ptr) AccessChain 31(data) 1375 33 35
+                              Store 1380 1379
+            1381:      6(int) Load 8(invocation)
+            1382:     40(ptr) AccessChain 31(data) 63 33
+            1383:   17(ivec4) Load 1382
+            1384:   96(ivec2) VectorShuffle 1383 1383 0 1
+            1385:   17(ivec4) Load 19(ballot)
+            1386:   96(ivec2) GroupNonUniformUMax 178 PartitionedInclusiveScanNV 1384 1385
+            1387:     40(ptr) AccessChain 31(data) 1381 33
+            1388:   17(ivec4) Load 1387
+            1389:   17(ivec4) VectorShuffle 1388 1386 4 5 2 3
+                              Store 1387 1389
+            1390:      6(int) Load 8(invocation)
+            1391:     40(ptr) AccessChain 31(data) 33 33
+            1392:   17(ivec4) Load 1391
+            1393:  103(ivec3) VectorShuffle 1392 1392 0 1 2
+            1394:   17(ivec4) Load 19(ballot)
+            1395:  103(ivec3) GroupNonUniformUMax 178 PartitionedInclusiveScanNV 1393 1394
+            1396:     40(ptr) AccessChain 31(data) 1390 33
+            1397:   17(ivec4) Load 1396
+            1398:   17(ivec4) VectorShuffle 1397 1395 4 5 6 3
+                              Store 1396 1398
+            1399:      6(int) Load 8(invocation)
+            1400:     40(ptr) AccessChain 31(data) 115 33
+            1401:   17(ivec4) Load 1400
+            1402:   17(ivec4) Load 19(ballot)
+            1403:   17(ivec4) GroupNonUniformUMax 178 PartitionedInclusiveScanNV 1401 1402
+            1404:     40(ptr) AccessChain 31(data) 1399 33
+                              Store 1404 1403
+            1405:      6(int) Load 8(invocation)
+            1406:    116(ptr) AccessChain 31(data) 34 115 35
+            1407:26(float64_t) Load 1406
+            1408:   17(ivec4) Load 19(ballot)
+            1409:26(float64_t) GroupNonUniformFMax 178 PartitionedInclusiveScanNV 1407 1408
+            1410:    116(ptr) AccessChain 31(data) 1405 115 35
+                              Store 1410 1409
+            1411:      6(int) Load 8(invocation)
+            1412:    123(ptr) AccessChain 31(data) 63 115
+            1413: 27(f64vec4) Load 1412
+            1414:122(f64vec2) VectorShuffle 1413 1413 0 1
+            1415:   17(ivec4) Load 19(ballot)
+            1416:122(f64vec2) GroupNonUniformFMax 178 PartitionedInclusiveScanNV 1414 1415
+            1417:    123(ptr) AccessChain 31(data) 1411 115
+            1418: 27(f64vec4) Load 1417
+            1419: 27(f64vec4) VectorShuffle 1418 1416 4 5 2 3
+                              Store 1417 1419
+            1420:      6(int) Load 8(invocation)
+            1421:    123(ptr) AccessChain 31(data) 33 115
+            1422: 27(f64vec4) Load 1421
+            1423:130(f64vec3) VectorShuffle 1422 1422 0 1 2
+            1424:   17(ivec4) Load 19(ballot)
+            1425:130(f64vec3) GroupNonUniformFMax 178 PartitionedInclusiveScanNV 1423 1424
+            1426:    123(ptr) AccessChain 31(data) 1420 115
+            1427: 27(f64vec4) Load 1426
+            1428: 27(f64vec4) VectorShuffle 1427 1425 4 5 6 3
+                              Store 1426 1428
+            1429:      6(int) Load 8(invocation)
+            1430:    123(ptr) AccessChain 31(data) 115 115
+            1431: 27(f64vec4) Load 1430
+            1432:   17(ivec4) Load 19(ballot)
+            1433: 27(f64vec4) GroupNonUniformFMax 178 PartitionedInclusiveScanNV 1431 1432
+            1434:    123(ptr) AccessChain 31(data) 1429 115
+                              Store 1434 1433
+            1435:      6(int) Load 8(invocation)
+            1436:     64(ptr) AccessChain 31(data) 34 63 35
+            1437:     24(int) Load 1436
+            1438:   17(ivec4) Load 19(ballot)
+            1439:     24(int) GroupNonUniformBitwiseAnd 178 PartitionedInclusiveScanNV 1437 1438
+            1440:     64(ptr) AccessChain 31(data) 1435 63 35
+                              Store 1440 1439
+            1441:      6(int) Load 8(invocation)
+            1442:     71(ptr) AccessChain 31(data) 63 63
+            1443:   25(ivec4) Load 1442
+            1444:   70(ivec2) VectorShuffle 1443 1443 0 1
+            1445:   17(ivec4) Load 19(ballot)
+            1446:   70(ivec2) GroupNonUniformBitwiseAnd 178 PartitionedInclusiveScanNV 1444 1445
+            1447:     71(ptr) AccessChain 31(data) 1441 63
+            1448:   25(ivec4) Load 1447
+            1449:   25(ivec4) VectorShuffle 1448 1446 4 5 2 3
+                              Store 1447 1449
+            1450:      6(int) Load 8(invocation)
+            1451:     71(ptr) AccessChain 31(data) 33 63
+            1452:   25(ivec4) Load 1451
+            1453:   78(ivec3) VectorShuffle 1452 1452 0 1 2
+            1454:   17(ivec4) Load 19(ballot)
+            1455:   78(ivec3) GroupNonUniformBitwiseAnd 178 PartitionedInclusiveScanNV 1453 1454
+            1456:     71(ptr) AccessChain 31(data) 1450 63
+            1457:   25(ivec4) Load 1456
+            1458:   25(ivec4) VectorShuffle 1457 1455 4 5 6 3
+                              Store 1456 1458
+            1459:      6(int) Load 8(invocation)
+            1460:     71(ptr) AccessChain 31(data) 115 63
+            1461:   25(ivec4) Load 1460
+            1462:   17(ivec4) Load 19(ballot)
+            1463:   25(ivec4) GroupNonUniformBitwiseAnd 178 PartitionedInclusiveScanNV 1461 1462
+            1464:     71(ptr) AccessChain 31(data) 1459 63
+                              Store 1464 1463
+            1465:      6(int) Load 8(invocation)
+            1466:     90(ptr) AccessChain 31(data) 34 33 35
+            1467:      6(int) Load 1466
+            1468:   17(ivec4) Load 19(ballot)
+            1469:      6(int) GroupNonUniformBitwiseAnd 178 PartitionedInclusiveScanNV 1467 1468
+            1470:     90(ptr) AccessChain 31(data) 1465 33 35
+                              Store 1470 1469
+            1471:      6(int) Load 8(invocation)
+            1472:     40(ptr) AccessChain 31(data) 63 33
+            1473:   17(ivec4) Load 1472
+            1474:   96(ivec2) VectorShuffle 1473 1473 0 1
+            1475:   17(ivec4) Load 19(ballot)
+            1476:   96(ivec2) GroupNonUniformBitwiseAnd 178 PartitionedInclusiveScanNV 1474 1475
+            1477:     40(ptr) AccessChain 31(data) 1471 33
+            1478:   17(ivec4) Load 1477
+            1479:   17(ivec4) VectorShuffle 1478 1476 4 5 2 3
+                              Store 1477 1479
+            1480:      6(int) Load 8(invocation)
+            1481:     40(ptr) AccessChain 31(data) 33 33
+            1482:   17(ivec4) Load 1481
+            1483:  103(ivec3) VectorShuffle 1482 1482 0 1 2
+            1484:   17(ivec4) Load 19(ballot)
+            1485:  103(ivec3) GroupNonUniformBitwiseAnd 178 PartitionedInclusiveScanNV 1483 1484
+            1486:     40(ptr) AccessChain 31(data) 1480 33
+            1487:   17(ivec4) Load 1486
+            1488:   17(ivec4) VectorShuffle 1487 1485 4 5 6 3
+                              Store 1486 1488
+            1489:      6(int) Load 8(invocation)
+            1490:     40(ptr) AccessChain 31(data) 115 33
+            1491:   17(ivec4) Load 1490
+            1492:   17(ivec4) Load 19(ballot)
+            1493:   17(ivec4) GroupNonUniformBitwiseAnd 178 PartitionedInclusiveScanNV 1491 1492
+            1494:     40(ptr) AccessChain 31(data) 1489 33
+                              Store 1494 1493
+            1495:      6(int) Load 8(invocation)
+            1496:     64(ptr) AccessChain 31(data) 34 63 35
+            1497:     24(int) Load 1496
+            1498:   144(bool) SLessThan 1497 34
+            1499:   17(ivec4) Load 19(ballot)
+            1500:   144(bool) GroupNonUniformLogicalAnd 178 PartitionedInclusiveScanNV 1498 1499
+            1501:     24(int) Select 1500 63 34
+            1502:     64(ptr) AccessChain 31(data) 1495 63 35
+                              Store 1502 1501
+            1503:      6(int) Load 8(invocation)
+            1504:     71(ptr) AccessChain 31(data) 63 63
+            1505:   25(ivec4) Load 1504
+            1506:   70(ivec2) VectorShuffle 1505 1505 0 1
+            1507:  152(bvec2) SLessThan 1506 727
+            1508:   17(ivec4) Load 19(ballot)
+            1509:  152(bvec2) GroupNonUniformLogicalAnd 178 PartitionedInclusiveScanNV 1507 1508
+            1510:   70(ivec2) Select 1509 731 727
+            1511:     71(ptr) AccessChain 31(data) 1503 63
+            1512:   25(ivec4) Load 1511
+            1513:   25(ivec4) VectorShuffle 1512 1510 4 5 2 3
+                              Store 1511 1513
+            1514:      6(int) Load 8(invocation)
+            1515:     71(ptr) AccessChain 31(data) 63 63
+            1516:   25(ivec4) Load 1515
+            1517:   78(ivec3) VectorShuffle 1516 1516 0 1 2
+            1518:  161(bvec3) SLessThan 1517 740
+            1519:   17(ivec4) Load 19(ballot)
+            1520:  161(bvec3) GroupNonUniformLogicalAnd 178 PartitionedInclusiveScanNV 1518 1519
+            1521:   78(ivec3) Select 1520 744 740
+            1522:     71(ptr) AccessChain 31(data) 1514 63
+            1523:   25(ivec4) Load 1522
+            1524:   25(ivec4) VectorShuffle 1523 1521 4 5 6 3
+                              Store 1522 1524
+            1525:      6(int) Load 8(invocation)
+            1526:     71(ptr) AccessChain 31(data) 63 63
+            1527:   25(ivec4) Load 1526
+            1528:  169(bvec4) SLessThan 1527 752
+            1529:   17(ivec4) Load 19(ballot)
+            1530:  169(bvec4) GroupNonUniformLogicalAnd 178 PartitionedInclusiveScanNV 1528 1529
+            1531:   25(ivec4) Select 1530 756 752
+            1532:     71(ptr) AccessChain 31(data) 1525 63
+                              Store 1532 1531
+            1533:      6(int) Load 8(invocation)
+            1534:     64(ptr) AccessChain 31(data) 34 63 35
+            1535:     24(int) Load 1534
+            1536:   17(ivec4) Load 19(ballot)
+            1537:     24(int) GroupNonUniformBitwiseOr 178 PartitionedInclusiveScanNV 1535 1536
+            1538:     64(ptr) AccessChain 31(data) 1533 63 35
+                              Store 1538 1537
+            1539:      6(int) Load 8(invocation)
+            1540:     71(ptr) AccessChain 31(data) 63 63
+            1541:   25(ivec4) Load 1540
+            1542:   70(ivec2) VectorShuffle 1541 1541 0 1
+            1543:   17(ivec4) Load 19(ballot)
+            1544:   70(ivec2) GroupNonUniformBitwiseOr 178 PartitionedInclusiveScanNV 1542 1543
+            1545:     71(ptr) AccessChain 31(data) 1539 63
+            1546:   25(ivec4) Load 1545
+            1547:   25(ivec4) VectorShuffle 1546 1544 4 5 2 3
+                              Store 1545 1547
+            1548:      6(int) Load 8(invocation)
+            1549:     71(ptr) AccessChain 31(data) 33 63
+            1550:   25(ivec4) Load 1549
+            1551:   78(ivec3) VectorShuffle 1550 1550 0 1 2
+            1552:   17(ivec4) Load 19(ballot)
+            1553:   78(ivec3) GroupNonUniformBitwiseOr 178 PartitionedInclusiveScanNV 1551 1552
+            1554:     71(ptr) AccessChain 31(data) 1548 63
+            1555:   25(ivec4) Load 1554
+            1556:   25(ivec4) VectorShuffle 1555 1553 4 5 6 3
+                              Store 1554 1556
+            1557:      6(int) Load 8(invocation)
+            1558:     71(ptr) AccessChain 31(data) 115 63
+            1559:   25(ivec4) Load 1558
+            1560:   17(ivec4) Load 19(ballot)
+            1561:   25(ivec4) GroupNonUniformBitwiseOr 178 PartitionedInclusiveScanNV 1559 1560
+            1562:     71(ptr) AccessChain 31(data) 1557 63
+                              Store 1562 1561
+            1563:      6(int) Load 8(invocation)
+            1564:     90(ptr) AccessChain 31(data) 34 33 35
+            1565:      6(int) Load 1564
+            1566:   17(ivec4) Load 19(ballot)
+            1567:      6(int) GroupNonUniformBitwiseOr 178 PartitionedInclusiveScanNV 1565 1566
+            1568:     90(ptr) AccessChain 31(data) 1563 33 35
+                              Store 1568 1567
+            1569:      6(int) Load 8(invocation)
+            1570:     40(ptr) AccessChain 31(data) 63 33
+            1571:   17(ivec4) Load 1570
+            1572:   96(ivec2) VectorShuffle 1571 1571 0 1
+            1573:   17(ivec4) Load 19(ballot)
+            1574:   96(ivec2) GroupNonUniformBitwiseOr 178 PartitionedInclusiveScanNV 1572 1573
+            1575:     40(ptr) AccessChain 31(data) 1569 33
+            1576:   17(ivec4) Load 1575
+            1577:   17(ivec4) VectorShuffle 1576 1574 4 5 2 3
+                              Store 1575 1577
+            1578:      6(int) Load 8(invocation)
+            1579:     40(ptr) AccessChain 31(data) 33 33
+            1580:   17(ivec4) Load 1579
+            1581:  103(ivec3) VectorShuffle 1580 1580 0 1 2
+            1582:   17(ivec4) Load 19(ballot)
+            1583:  103(ivec3) GroupNonUniformBitwiseOr 178 PartitionedInclusiveScanNV 1581 1582
+            1584:     40(ptr) AccessChain 31(data) 1578 33
+            1585:   17(ivec4) Load 1584
+            1586:   17(ivec4) VectorShuffle 1585 1583 4 5 6 3
+                              Store 1584 1586
+            1587:      6(int) Load 8(invocation)
+            1588:     40(ptr) AccessChain 31(data) 115 33
+            1589:   17(ivec4) Load 1588
+            1590:   17(ivec4) Load 19(ballot)
+            1591:   17(ivec4) GroupNonUniformBitwiseOr 178 PartitionedInclusiveScanNV 1589 1590
+            1592:     40(ptr) AccessChain 31(data) 1587 33
+                              Store 1592 1591
+            1593:      6(int) Load 8(invocation)
+            1594:     64(ptr) AccessChain 31(data) 34 63 35
+            1595:     24(int) Load 1594
+            1596:   144(bool) SLessThan 1595 34
+            1597:   17(ivec4) Load 19(ballot)
+            1598:   144(bool) GroupNonUniformLogicalOr 178 PartitionedInclusiveScanNV 1596 1597
+            1599:     24(int) Select 1598 63 34
+            1600:     64(ptr) AccessChain 31(data) 1593 63 35
+                              Store 1600 1599
+            1601:      6(int) Load 8(invocation)
+            1602:     71(ptr) AccessChain 31(data) 63 63
+            1603:   25(ivec4) Load 1602
+            1604:   70(ivec2) VectorShuffle 1603 1603 0 1
+            1605:  152(bvec2) SLessThan 1604 727
+            1606:   17(ivec4) Load 19(ballot)
+            1607:  152(bvec2) GroupNonUniformLogicalOr 178 PartitionedInclusiveScanNV 1605 1606
+            1608:   70(ivec2) Select 1607 731 727
+            1609:     71(ptr) AccessChain 31(data) 1601 63
+            1610:   25(ivec4) Load 1609
+            1611:   25(ivec4) VectorShuffle 1610 1608 4 5 2 3
+                              Store 1609 1611
+            1612:      6(int) Load 8(invocation)
+            1613:     71(ptr) AccessChain 31(data) 63 63
+            1614:   25(ivec4) Load 1613
+            1615:   78(ivec3) VectorShuffle 1614 1614 0 1 2
+            1616:  161(bvec3) SLessThan 1615 740
+            1617:   17(ivec4) Load 19(ballot)
+            1618:  161(bvec3) GroupNonUniformLogicalOr 178 PartitionedInclusiveScanNV 1616 1617
+            1619:   78(ivec3) Select 1618 744 740
+            1620:     71(ptr) AccessChain 31(data) 1612 63
+            1621:   25(ivec4) Load 1620
+            1622:   25(ivec4) VectorShuffle 1621 1619 4 5 6 3
+                              Store 1620 1622
+            1623:      6(int) Load 8(invocation)
+            1624:     71(ptr) AccessChain 31(data) 63 63
+            1625:   25(ivec4) Load 1624
+            1626:  169(bvec4) SLessThan 1625 752
+            1627:   17(ivec4) Load 19(ballot)
+            1628:  169(bvec4) GroupNonUniformLogicalOr 178 PartitionedInclusiveScanNV 1626 1627
+            1629:   25(ivec4) Select 1628 756 752
+            1630:     71(ptr) AccessChain 31(data) 1623 63
+                              Store 1630 1629
+            1631:      6(int) Load 8(invocation)
+            1632:     64(ptr) AccessChain 31(data) 34 63 35
+            1633:     24(int) Load 1632
+            1634:   17(ivec4) Load 19(ballot)
+            1635:     24(int) GroupNonUniformBitwiseXor 178 PartitionedInclusiveScanNV 1633 1634
+            1636:     64(ptr) AccessChain 31(data) 1631 63 35
+                              Store 1636 1635
+            1637:      6(int) Load 8(invocation)
+            1638:     71(ptr) AccessChain 31(data) 63 63
+            1639:   25(ivec4) Load 1638
+            1640:   70(ivec2) VectorShuffle 1639 1639 0 1
+            1641:   17(ivec4) Load 19(ballot)
+            1642:   70(ivec2) GroupNonUniformBitwiseXor 178 PartitionedInclusiveScanNV 1640 1641
+            1643:     71(ptr) AccessChain 31(data) 1637 63
+            1644:   25(ivec4) Load 1643
+            1645:   25(ivec4) VectorShuffle 1644 1642 4 5 2 3
+                              Store 1643 1645
+            1646:      6(int) Load 8(invocation)
+            1647:     71(ptr) AccessChain 31(data) 33 63
+            1648:   25(ivec4) Load 1647
+            1649:   78(ivec3) VectorShuffle 1648 1648 0 1 2
+            1650:   17(ivec4) Load 19(ballot)
+            1651:   78(ivec3) GroupNonUniformBitwiseXor 178 PartitionedInclusiveScanNV 1649 1650
+            1652:     71(ptr) AccessChain 31(data) 1646 63
+            1653:   25(ivec4) Load 1652
+            1654:   25(ivec4) VectorShuffle 1653 1651 4 5 6 3
+                              Store 1652 1654
+            1655:      6(int) Load 8(invocation)
+            1656:     71(ptr) AccessChain 31(data) 115 63
+            1657:   25(ivec4) Load 1656
+            1658:   17(ivec4) Load 19(ballot)
+            1659:   25(ivec4) GroupNonUniformBitwiseXor 178 PartitionedInclusiveScanNV 1657 1658
+            1660:     71(ptr) AccessChain 31(data) 1655 63
+                              Store 1660 1659
+            1661:      6(int) Load 8(invocation)
+            1662:     90(ptr) AccessChain 31(data) 34 33 35
+            1663:      6(int) Load 1662
+            1664:   17(ivec4) Load 19(ballot)
+            1665:      6(int) GroupNonUniformBitwiseXor 178 PartitionedInclusiveScanNV 1663 1664
+            1666:     90(ptr) AccessChain 31(data) 1661 33 35
+                              Store 1666 1665
+            1667:      6(int) Load 8(invocation)
+            1668:     40(ptr) AccessChain 31(data) 63 33
+            1669:   17(ivec4) Load 1668
+            1670:   96(ivec2) VectorShuffle 1669 1669 0 1
+            1671:   17(ivec4) Load 19(ballot)
+            1672:   96(ivec2) GroupNonUniformBitwiseXor 178 PartitionedInclusiveScanNV 1670 1671
+            1673:     40(ptr) AccessChain 31(data) 1667 33
+            1674:   17(ivec4) Load 1673
+            1675:   17(ivec4) VectorShuffle 1674 1672 4 5 2 3
+                              Store 1673 1675
+            1676:      6(int) Load 8(invocation)
+            1677:     40(ptr) AccessChain 31(data) 33 33
+            1678:   17(ivec4) Load 1677
+            1679:  103(ivec3) VectorShuffle 1678 1678 0 1 2
+            1680:   17(ivec4) Load 19(ballot)
+            1681:  103(ivec3) GroupNonUniformBitwiseXor 178 PartitionedInclusiveScanNV 1679 1680
+            1682:     40(ptr) AccessChain 31(data) 1676 33
+            1683:   17(ivec4) Load 1682
+            1684:   17(ivec4) VectorShuffle 1683 1681 4 5 6 3
+                              Store 1682 1684
+            1685:      6(int) Load 8(invocation)
+            1686:     40(ptr) AccessChain 31(data) 115 33
+            1687:   17(ivec4) Load 1686
+            1688:   17(ivec4) Load 19(ballot)
+            1689:   17(ivec4) GroupNonUniformBitwiseXor 178 PartitionedInclusiveScanNV 1687 1688
+            1690:     40(ptr) AccessChain 31(data) 1685 33
+                              Store 1690 1689
+            1691:      6(int) Load 8(invocation)
+            1692:     64(ptr) AccessChain 31(data) 34 63 35
+            1693:     24(int) Load 1692
+            1694:   144(bool) SLessThan 1693 34
+            1695:   17(ivec4) Load 19(ballot)
+            1696:   144(bool) GroupNonUniformLogicalXor 178 PartitionedInclusiveScanNV 1694 1695
+            1697:     24(int) Select 1696 63 34
+            1698:     64(ptr) AccessChain 31(data) 1691 63 35
+                              Store 1698 1697
+            1699:      6(int) Load 8(invocation)
+            1700:     71(ptr) AccessChain 31(data) 63 63
+            1701:   25(ivec4) Load 1700
+            1702:   70(ivec2) VectorShuffle 1701 1701 0 1
+            1703:  152(bvec2) SLessThan 1702 727
+            1704:   17(ivec4) Load 19(ballot)
+            1705:  152(bvec2) GroupNonUniformLogicalXor 178 PartitionedInclusiveScanNV 1703 1704
+            1706:   70(ivec2) Select 1705 731 727
+            1707:     71(ptr) AccessChain 31(data) 1699 63
+            1708:   25(ivec4) Load 1707
+            1709:   25(ivec4) VectorShuffle 1708 1706 4 5 2 3
+                              Store 1707 1709
+            1710:      6(int) Load 8(invocation)
+            1711:     71(ptr) AccessChain 31(data) 63 63
+            1712:   25(ivec4) Load 1711
+            1713:   78(ivec3) VectorShuffle 1712 1712 0 1 2
+            1714:  161(bvec3) SLessThan 1713 740
+            1715:   17(ivec4) Load 19(ballot)
+            1716:  161(bvec3) GroupNonUniformLogicalXor 178 PartitionedInclusiveScanNV 1714 1715
+            1717:   78(ivec3) Select 1716 744 740
+            1718:     71(ptr) AccessChain 31(data) 1710 63
+            1719:   25(ivec4) Load 1718
+            1720:   25(ivec4) VectorShuffle 1719 1717 4 5 6 3
+                              Store 1718 1720
+            1721:      6(int) Load 8(invocation)
+            1722:     71(ptr) AccessChain 31(data) 63 63
+            1723:   25(ivec4) Load 1722
+            1724:  169(bvec4) SLessThan 1723 752
+            1725:   17(ivec4) Load 19(ballot)
+            1726:  169(bvec4) GroupNonUniformLogicalXor 178 PartitionedInclusiveScanNV 1724 1725
+            1727:   25(ivec4) Select 1726 756 752
+            1728:     71(ptr) AccessChain 31(data) 1721 63
+                              Store 1728 1727
+            1729:      6(int) Load 8(invocation)
+            1730:     36(ptr) AccessChain 31(data) 34 34 35
+            1731:   22(float) Load 1730
+            1732:   17(ivec4) Load 19(ballot)
+            1733:   22(float) GroupNonUniformFAdd 178 PartitionedExclusiveScanNV 1731 1732
+            1734:     36(ptr) AccessChain 31(data) 1729 34 35
+                              Store 1734 1733
+            1735:      6(int) Load 8(invocation)
+            1736:     44(ptr) AccessChain 31(data) 63 34
+            1737:   23(fvec4) Load 1736
+            1738:   43(fvec2) VectorShuffle 1737 1737 0 1
+            1739:   17(ivec4) Load 19(ballot)
+            1740:   43(fvec2) GroupNonUniformFAdd 178 PartitionedExclusiveScanNV 1738 1739
+            1741:     44(ptr) AccessChain 31(data) 1735 34
+            1742:   23(fvec4) Load 1741
+            1743:   23(fvec4) VectorShuffle 1742 1740 4 5 2 3
+                              Store 1741 1743
+            1744:      6(int) Load 8(invocation)
+            1745:     44(ptr) AccessChain 31(data) 33 34
+            1746:   23(fvec4) Load 1745
+            1747:   51(fvec3) VectorShuffle 1746 1746 0 1 2
+            1748:   17(ivec4) Load 19(ballot)
+            1749:   51(fvec3) GroupNonUniformFAdd 178 PartitionedExclusiveScanNV 1747 1748
+            1750:     44(ptr) AccessChain 31(data) 1744 34
+            1751:   23(fvec4) Load 1750
+            1752:   23(fvec4) VectorShuffle 1751 1749 4 5 6 3
+                              Store 1750 1752
+            1753:      6(int) Load 8(invocation)
+            1754:     44(ptr) AccessChain 31(data) 115 34
+            1755:   23(fvec4) Load 1754
+            1756:   17(ivec4) Load 19(ballot)
+            1757:   23(fvec4) GroupNonUniformFAdd 178 PartitionedExclusiveScanNV 1755 1756
+            1758:     44(ptr) AccessChain 31(data) 1753 34
+                              Store 1758 1757
+            1759:      6(int) Load 8(invocation)
+            1760:     64(ptr) AccessChain 31(data) 34 63 35
+            1761:     24(int) Load 1760
+            1762:   17(ivec4) Load 19(ballot)
+            1763:     24(int) GroupNonUniformIAdd 178 PartitionedExclusiveScanNV 1761 1762
+            1764:     64(ptr) AccessChain 31(data) 1759 63 35
+                              Store 1764 1763
+            1765:      6(int) Load 8(invocation)
+            1766:     71(ptr) AccessChain 31(data) 63 63
+            1767:   25(ivec4) Load 1766
+            1768:   70(ivec2) VectorShuffle 1767 1767 0 1
+            1769:   17(ivec4) Load 19(ballot)
+            1770:   70(ivec2) GroupNonUniformIAdd 178 PartitionedExclusiveScanNV 1768 1769
+            1771:     71(ptr) AccessChain 31(data) 1765 63
+            1772:   25(ivec4) Load 1771
+            1773:   25(ivec4) VectorShuffle 1772 1770 4 5 2 3
+                              Store 1771 1773
+            1774:      6(int) Load 8(invocation)
+            1775:     71(ptr) AccessChain 31(data) 33 63
+            1776:   25(ivec4) Load 1775
+            1777:   78(ivec3) VectorShuffle 1776 1776 0 1 2
+            1778:   17(ivec4) Load 19(ballot)
+            1779:   78(ivec3) GroupNonUniformIAdd 178 PartitionedExclusiveScanNV 1777 1778
+            1780:     71(ptr) AccessChain 31(data) 1774 63
+            1781:   25(ivec4) Load 1780
+            1782:   25(ivec4) VectorShuffle 1781 1779 4 5 6 3
+                              Store 1780 1782
+            1783:      6(int) Load 8(invocation)
+            1784:     71(ptr) AccessChain 31(data) 115 63
+            1785:   25(ivec4) Load 1784
+            1786:   17(ivec4) Load 19(ballot)
+            1787:   25(ivec4) GroupNonUniformIAdd 178 PartitionedExclusiveScanNV 1785 1786
+            1788:     71(ptr) AccessChain 31(data) 1783 63
+                              Store 1788 1787
+            1789:      6(int) Load 8(invocation)
+            1790:     90(ptr) AccessChain 31(data) 34 33 35
+            1791:      6(int) Load 1790
+            1792:   17(ivec4) Load 19(ballot)
+            1793:      6(int) GroupNonUniformIAdd 178 PartitionedExclusiveScanNV 1791 1792
+            1794:     90(ptr) AccessChain 31(data) 1789 33 35
+                              Store 1794 1793
+            1795:      6(int) Load 8(invocation)
+            1796:     40(ptr) AccessChain 31(data) 63 33
+            1797:   17(ivec4) Load 1796
+            1798:   96(ivec2) VectorShuffle 1797 1797 0 1
+            1799:   17(ivec4) Load 19(ballot)
+            1800:   96(ivec2) GroupNonUniformIAdd 178 PartitionedExclusiveScanNV 1798 1799
+            1801:     40(ptr) AccessChain 31(data) 1795 33
+            1802:   17(ivec4) Load 1801
+            1803:   17(ivec4) VectorShuffle 1802 1800 4 5 2 3
+                              Store 1801 1803
+            1804:      6(int) Load 8(invocation)
+            1805:     40(ptr) AccessChain 31(data) 33 33
+            1806:   17(ivec4) Load 1805
+            1807:  103(ivec3) VectorShuffle 1806 1806 0 1 2
+            1808:   17(ivec4) Load 19(ballot)
+            1809:  103(ivec3) GroupNonUniformIAdd 178 PartitionedExclusiveScanNV 1807 1808
+            1810:     40(ptr) AccessChain 31(data) 1804 33
+            1811:   17(ivec4) Load 1810
+            1812:   17(ivec4) VectorShuffle 1811 1809 4 5 6 3
+                              Store 1810 1812
+            1813:      6(int) Load 8(invocation)
+            1814:     40(ptr) AccessChain 31(data) 115 33
+            1815:   17(ivec4) Load 1814
+            1816:   17(ivec4) Load 19(ballot)
+            1817:   17(ivec4) GroupNonUniformIAdd 178 PartitionedExclusiveScanNV 1815 1816
+            1818:     40(ptr) AccessChain 31(data) 1813 33
+                              Store 1818 1817
+            1819:      6(int) Load 8(invocation)
+            1820:    116(ptr) AccessChain 31(data) 34 115 35
+            1821:26(float64_t) Load 1820
+            1822:   17(ivec4) Load 19(ballot)
+            1823:26(float64_t) GroupNonUniformFAdd 178 PartitionedExclusiveScanNV 1821 1822
+            1824:    116(ptr) AccessChain 31(data) 1819 115 35
+                              Store 1824 1823
+            1825:      6(int) Load 8(invocation)
+            1826:    123(ptr) AccessChain 31(data) 63 115
+            1827: 27(f64vec4) Load 1826
+            1828:122(f64vec2) VectorShuffle 1827 1827 0 1
+            1829:   17(ivec4) Load 19(ballot)
+            1830:122(f64vec2) GroupNonUniformFAdd 178 PartitionedExclusiveScanNV 1828 1829
+            1831:    123(ptr) AccessChain 31(data) 1825 115
+            1832: 27(f64vec4) Load 1831
+            1833: 27(f64vec4) VectorShuffle 1832 1830 4 5 2 3
+                              Store 1831 1833
+            1834:      6(int) Load 8(invocation)
+            1835:    123(ptr) AccessChain 31(data) 33 115
+            1836: 27(f64vec4) Load 1835
+            1837:130(f64vec3) VectorShuffle 1836 1836 0 1 2
+            1838:   17(ivec4) Load 19(ballot)
+            1839:130(f64vec3) GroupNonUniformFAdd 178 PartitionedExclusiveScanNV 1837 1838
+            1840:    123(ptr) AccessChain 31(data) 1834 115
+            1841: 27(f64vec4) Load 1840
+            1842: 27(f64vec4) VectorShuffle 1841 1839 4 5 6 3
+                              Store 1840 1842
+            1843:      6(int) Load 8(invocation)
+            1844:    123(ptr) AccessChain 31(data) 115 115
+            1845: 27(f64vec4) Load 1844
+            1846:   17(ivec4) Load 19(ballot)
+            1847: 27(f64vec4) GroupNonUniformFAdd 178 PartitionedExclusiveScanNV 1845 1846
+            1848:    123(ptr) AccessChain 31(data) 1843 115
+                              Store 1848 1847
+            1849:      6(int) Load 8(invocation)
+            1850:     36(ptr) AccessChain 31(data) 34 34 35
+            1851:   22(float) Load 1850
+            1852:   17(ivec4) Load 19(ballot)
+            1853:   22(float) GroupNonUniformFMul 178 PartitionedExclusiveScanNV 1851 1852
+            1854:     36(ptr) AccessChain 31(data) 1849 34 35
+                              Store 1854 1853
+            1855:      6(int) Load 8(invocation)
+            1856:     44(ptr) AccessChain 31(data) 63 34
+            1857:   23(fvec4) Load 1856
+            1858:   43(fvec2) VectorShuffle 1857 1857 0 1
+            1859:   17(ivec4) Load 19(ballot)
+            1860:   43(fvec2) GroupNonUniformFMul 178 PartitionedExclusiveScanNV 1858 1859
+            1861:     44(ptr) AccessChain 31(data) 1855 34
+            1862:   23(fvec4) Load 1861
+            1863:   23(fvec4) VectorShuffle 1862 1860 4 5 2 3
+                              Store 1861 1863
+            1864:      6(int) Load 8(invocation)
+            1865:     44(ptr) AccessChain 31(data) 33 34
+            1866:   23(fvec4) Load 1865
+            1867:   51(fvec3) VectorShuffle 1866 1866 0 1 2
+            1868:   17(ivec4) Load 19(ballot)
+            1869:   51(fvec3) GroupNonUniformFMul 178 PartitionedExclusiveScanNV 1867 1868
+            1870:     44(ptr) AccessChain 31(data) 1864 34
+            1871:   23(fvec4) Load 1870
+            1872:   23(fvec4) VectorShuffle 1871 1869 4 5 6 3
+                              Store 1870 1872
+            1873:      6(int) Load 8(invocation)
+            1874:     44(ptr) AccessChain 31(data) 115 34
+            1875:   23(fvec4) Load 1874
+            1876:   17(ivec4) Load 19(ballot)
+            1877:   23(fvec4) GroupNonUniformFMul 178 PartitionedExclusiveScanNV 1875 1876
+            1878:     44(ptr) AccessChain 31(data) 1873 34
+                              Store 1878 1877
+            1879:      6(int) Load 8(invocation)
+            1880:     64(ptr) AccessChain 31(data) 34 63 35
+            1881:     24(int) Load 1880
+            1882:   17(ivec4) Load 19(ballot)
+            1883:     24(int) GroupNonUniformIMul 178 PartitionedExclusiveScanNV 1881 1882
+            1884:     64(ptr) AccessChain 31(data) 1879 63 35
+                              Store 1884 1883
+            1885:      6(int) Load 8(invocation)
+            1886:     71(ptr) AccessChain 31(data) 63 63
+            1887:   25(ivec4) Load 1886
+            1888:   70(ivec2) VectorShuffle 1887 1887 0 1
+            1889:   17(ivec4) Load 19(ballot)
+            1890:   70(ivec2) GroupNonUniformIMul 178 PartitionedExclusiveScanNV 1888 1889
+            1891:     71(ptr) AccessChain 31(data) 1885 63
+            1892:   25(ivec4) Load 1891
+            1893:   25(ivec4) VectorShuffle 1892 1890 4 5 2 3
+                              Store 1891 1893
+            1894:      6(int) Load 8(invocation)
+            1895:     71(ptr) AccessChain 31(data) 33 63
+            1896:   25(ivec4) Load 1895
+            1897:   78(ivec3) VectorShuffle 1896 1896 0 1 2
+            1898:   17(ivec4) Load 19(ballot)
+            1899:   78(ivec3) GroupNonUniformIMul 178 PartitionedExclusiveScanNV 1897 1898
+            1900:     71(ptr) AccessChain 31(data) 1894 63
+            1901:   25(ivec4) Load 1900
+            1902:   25(ivec4) VectorShuffle 1901 1899 4 5 6 3
+                              Store 1900 1902
+            1903:      6(int) Load 8(invocation)
+            1904:     71(ptr) AccessChain 31(data) 115 63
+            1905:   25(ivec4) Load 1904
+            1906:   17(ivec4) Load 19(ballot)
+            1907:   25(ivec4) GroupNonUniformIMul 178 PartitionedExclusiveScanNV 1905 1906
+            1908:     71(ptr) AccessChain 31(data) 1903 63
+                              Store 1908 1907
+            1909:      6(int) Load 8(invocation)
+            1910:     90(ptr) AccessChain 31(data) 34 33 35
+            1911:      6(int) Load 1910
+            1912:   17(ivec4) Load 19(ballot)
+            1913:      6(int) GroupNonUniformIMul 178 PartitionedExclusiveScanNV 1911 1912
+            1914:     90(ptr) AccessChain 31(data) 1909 33 35
+                              Store 1914 1913
+            1915:      6(int) Load 8(invocation)
+            1916:     40(ptr) AccessChain 31(data) 63 33
+            1917:   17(ivec4) Load 1916
+            1918:   96(ivec2) VectorShuffle 1917 1917 0 1
+            1919:   17(ivec4) Load 19(ballot)
+            1920:   96(ivec2) GroupNonUniformIMul 178 PartitionedExclusiveScanNV 1918 1919
+            1921:     40(ptr) AccessChain 31(data) 1915 33
+            1922:   17(ivec4) Load 1921
+            1923:   17(ivec4) VectorShuffle 1922 1920 4 5 2 3
+                              Store 1921 1923
+            1924:      6(int) Load 8(invocation)
+            1925:     40(ptr) AccessChain 31(data) 33 33
+            1926:   17(ivec4) Load 1925
+            1927:  103(ivec3) VectorShuffle 1926 1926 0 1 2
+            1928:   17(ivec4) Load 19(ballot)
+            1929:  103(ivec3) GroupNonUniformIMul 178 PartitionedExclusiveScanNV 1927 1928
+            1930:     40(ptr) AccessChain 31(data) 1924 33
+            1931:   17(ivec4) Load 1930
+            1932:   17(ivec4) VectorShuffle 1931 1929 4 5 6 3
+                              Store 1930 1932
+            1933:      6(int) Load 8(invocation)
+            1934:     40(ptr) AccessChain 31(data) 115 33
+            1935:   17(ivec4) Load 1934
+            1936:   17(ivec4) Load 19(ballot)
+            1937:   17(ivec4) GroupNonUniformIMul 178 PartitionedExclusiveScanNV 1935 1936
+            1938:     40(ptr) AccessChain 31(data) 1933 33
+                              Store 1938 1937
+            1939:      6(int) Load 8(invocation)
+            1940:    116(ptr) AccessChain 31(data) 34 115 35
+            1941:26(float64_t) Load 1940
+            1942:   17(ivec4) Load 19(ballot)
+            1943:26(float64_t) GroupNonUniformFMul 178 PartitionedExclusiveScanNV 1941 1942
+            1944:    116(ptr) AccessChain 31(data) 1939 115 35
+                              Store 1944 1943
+            1945:      6(int) Load 8(invocation)
+            1946:    123(ptr) AccessChain 31(data) 63 115
+            1947: 27(f64vec4) Load 1946
+            1948:122(f64vec2) VectorShuffle 1947 1947 0 1
+            1949:   17(ivec4) Load 19(ballot)
+            1950:122(f64vec2) GroupNonUniformFMul 178 PartitionedExclusiveScanNV 1948 1949
+            1951:    123(ptr) AccessChain 31(data) 1945 115
+            1952: 27(f64vec4) Load 1951
+            1953: 27(f64vec4) VectorShuffle 1952 1950 4 5 2 3
+                              Store 1951 1953
+            1954:      6(int) Load 8(invocation)
+            1955:    123(ptr) AccessChain 31(data) 33 115
+            1956: 27(f64vec4) Load 1955
+            1957:130(f64vec3) VectorShuffle 1956 1956 0 1 2
+            1958:   17(ivec4) Load 19(ballot)
+            1959:130(f64vec3) GroupNonUniformFMul 178 PartitionedExclusiveScanNV 1957 1958
+            1960:    123(ptr) AccessChain 31(data) 1954 115
+            1961: 27(f64vec4) Load 1960
+            1962: 27(f64vec4) VectorShuffle 1961 1959 4 5 6 3
+                              Store 1960 1962
+            1963:      6(int) Load 8(invocation)
+            1964:    123(ptr) AccessChain 31(data) 115 115
+            1965: 27(f64vec4) Load 1964
+            1966:   17(ivec4) Load 19(ballot)
+            1967: 27(f64vec4) GroupNonUniformFMul 178 PartitionedExclusiveScanNV 1965 1966
+            1968:    123(ptr) AccessChain 31(data) 1963 115
+                              Store 1968 1967
+            1969:      6(int) Load 8(invocation)
+            1970:     36(ptr) AccessChain 31(data) 34 34 35
+            1971:   22(float) Load 1970
+            1972:   17(ivec4) Load 19(ballot)
+            1973:   22(float) GroupNonUniformFMin 178 PartitionedExclusiveScanNV 1971 1972
+            1974:     36(ptr) AccessChain 31(data) 1969 34 35
+                              Store 1974 1973
+            1975:      6(int) Load 8(invocation)
+            1976:     44(ptr) AccessChain 31(data) 63 34
+            1977:   23(fvec4) Load 1976
+            1978:   43(fvec2) VectorShuffle 1977 1977 0 1
+            1979:   17(ivec4) Load 19(ballot)
+            1980:   43(fvec2) GroupNonUniformFMin 178 PartitionedExclusiveScanNV 1978 1979
+            1981:     44(ptr) AccessChain 31(data) 1975 34
+            1982:   23(fvec4) Load 1981
+            1983:   23(fvec4) VectorShuffle 1982 1980 4 5 2 3
+                              Store 1981 1983
+            1984:      6(int) Load 8(invocation)
+            1985:     44(ptr) AccessChain 31(data) 33 34
+            1986:   23(fvec4) Load 1985
+            1987:   51(fvec3) VectorShuffle 1986 1986 0 1 2
+            1988:   17(ivec4) Load 19(ballot)
+            1989:   51(fvec3) GroupNonUniformFMin 178 PartitionedExclusiveScanNV 1987 1988
+            1990:     44(ptr) AccessChain 31(data) 1984 34
+            1991:   23(fvec4) Load 1990
+            1992:   23(fvec4) VectorShuffle 1991 1989 4 5 6 3
+                              Store 1990 1992
+            1993:      6(int) Load 8(invocation)
+            1994:     44(ptr) AccessChain 31(data) 115 34
+            1995:   23(fvec4) Load 1994
+            1996:   17(ivec4) Load 19(ballot)
+            1997:   23(fvec4) GroupNonUniformFMin 178 PartitionedExclusiveScanNV 1995 1996
+            1998:     44(ptr) AccessChain 31(data) 1993 34
+                              Store 1998 1997
+            1999:      6(int) Load 8(invocation)
+            2000:     64(ptr) AccessChain 31(data) 34 63 35
+            2001:     24(int) Load 2000
+            2002:   17(ivec4) Load 19(ballot)
+            2003:     24(int) GroupNonUniformSMin 178 PartitionedExclusiveScanNV 2001 2002
+            2004:     64(ptr) AccessChain 31(data) 1999 63 35
+                              Store 2004 2003
+            2005:      6(int) Load 8(invocation)
+            2006:     71(ptr) AccessChain 31(data) 63 63
+            2007:   25(ivec4) Load 2006
+            2008:   70(ivec2) VectorShuffle 2007 2007 0 1
+            2009:   17(ivec4) Load 19(ballot)
+            2010:   70(ivec2) GroupNonUniformSMin 178 PartitionedExclusiveScanNV 2008 2009
+            2011:     71(ptr) AccessChain 31(data) 2005 63
+            2012:   25(ivec4) Load 2011
+            2013:   25(ivec4) VectorShuffle 2012 2010 4 5 2 3
+                              Store 2011 2013
+            2014:      6(int) Load 8(invocation)
+            2015:     71(ptr) AccessChain 31(data) 33 63
+            2016:   25(ivec4) Load 2015
+            2017:   78(ivec3) VectorShuffle 2016 2016 0 1 2
+            2018:   17(ivec4) Load 19(ballot)
+            2019:   78(ivec3) GroupNonUniformSMin 178 PartitionedExclusiveScanNV 2017 2018
+            2020:     71(ptr) AccessChain 31(data) 2014 63
+            2021:   25(ivec4) Load 2020
+            2022:   25(ivec4) VectorShuffle 2021 2019 4 5 6 3
+                              Store 2020 2022
+            2023:      6(int) Load 8(invocation)
+            2024:     71(ptr) AccessChain 31(data) 115 63
+            2025:   25(ivec4) Load 2024
+            2026:   17(ivec4) Load 19(ballot)
+            2027:   25(ivec4) GroupNonUniformSMin 178 PartitionedExclusiveScanNV 2025 2026
+            2028:     71(ptr) AccessChain 31(data) 2023 63
+                              Store 2028 2027
+            2029:      6(int) Load 8(invocation)
+            2030:     90(ptr) AccessChain 31(data) 34 33 35
+            2031:      6(int) Load 2030
+            2032:   17(ivec4) Load 19(ballot)
+            2033:      6(int) GroupNonUniformUMin 178 PartitionedExclusiveScanNV 2031 2032
+            2034:     90(ptr) AccessChain 31(data) 2029 33 35
+                              Store 2034 2033
+            2035:      6(int) Load 8(invocation)
+            2036:     40(ptr) AccessChain 31(data) 63 33
+            2037:   17(ivec4) Load 2036
+            2038:   96(ivec2) VectorShuffle 2037 2037 0 1
+            2039:   17(ivec4) Load 19(ballot)
+            2040:   96(ivec2) GroupNonUniformUMin 178 PartitionedExclusiveScanNV 2038 2039
+            2041:     40(ptr) AccessChain 31(data) 2035 33
+            2042:   17(ivec4) Load 2041
+            2043:   17(ivec4) VectorShuffle 2042 2040 4 5 2 3
+                              Store 2041 2043
+            2044:      6(int) Load 8(invocation)
+            2045:     40(ptr) AccessChain 31(data) 33 33
+            2046:   17(ivec4) Load 2045
+            2047:  103(ivec3) VectorShuffle 2046 2046 0 1 2
+            2048:   17(ivec4) Load 19(ballot)
+            2049:  103(ivec3) GroupNonUniformUMin 178 PartitionedExclusiveScanNV 2047 2048
+            2050:     40(ptr) AccessChain 31(data) 2044 33
+            2051:   17(ivec4) Load 2050
+            2052:   17(ivec4) VectorShuffle 2051 2049 4 5 6 3
+                              Store 2050 2052
+            2053:      6(int) Load 8(invocation)
+            2054:     40(ptr) AccessChain 31(data) 115 33
+            2055:   17(ivec4) Load 2054
+            2056:   17(ivec4) Load 19(ballot)
+            2057:   17(ivec4) GroupNonUniformUMin 178 PartitionedExclusiveScanNV 2055 2056
+            2058:     40(ptr) AccessChain 31(data) 2053 33
+                              Store 2058 2057
+            2059:      6(int) Load 8(invocation)
+            2060:    116(ptr) AccessChain 31(data) 34 115 35
+            2061:26(float64_t) Load 2060
+            2062:   17(ivec4) Load 19(ballot)
+            2063:26(float64_t) GroupNonUniformFMin 178 PartitionedExclusiveScanNV 2061 2062
+            2064:    116(ptr) AccessChain 31(data) 2059 115 35
+                              Store 2064 2063
+            2065:      6(int) Load 8(invocation)
+            2066:    123(ptr) AccessChain 31(data) 63 115
+            2067: 27(f64vec4) Load 2066
+            2068:122(f64vec2) VectorShuffle 2067 2067 0 1
+            2069:   17(ivec4) Load 19(ballot)
+            2070:122(f64vec2) GroupNonUniformFMin 178 PartitionedExclusiveScanNV 2068 2069
+            2071:    123(ptr) AccessChain 31(data) 2065 115
+            2072: 27(f64vec4) Load 2071
+            2073: 27(f64vec4) VectorShuffle 2072 2070 4 5 2 3
+                              Store 2071 2073
+            2074:      6(int) Load 8(invocation)
+            2075:    123(ptr) AccessChain 31(data) 33 115
+            2076: 27(f64vec4) Load 2075
+            2077:130(f64vec3) VectorShuffle 2076 2076 0 1 2
+            2078:   17(ivec4) Load 19(ballot)
+            2079:130(f64vec3) GroupNonUniformFMin 178 PartitionedExclusiveScanNV 2077 2078
+            2080:    123(ptr) AccessChain 31(data) 2074 115
+            2081: 27(f64vec4) Load 2080
+            2082: 27(f64vec4) VectorShuffle 2081 2079 4 5 6 3
+                              Store 2080 2082
+            2083:      6(int) Load 8(invocation)
+            2084:    123(ptr) AccessChain 31(data) 115 115
+            2085: 27(f64vec4) Load 2084
+            2086:   17(ivec4) Load 19(ballot)
+            2087: 27(f64vec4) GroupNonUniformFMin 178 PartitionedExclusiveScanNV 2085 2086
+            2088:    123(ptr) AccessChain 31(data) 2083 115
+                              Store 2088 2087
+            2089:      6(int) Load 8(invocation)
+            2090:     36(ptr) AccessChain 31(data) 34 34 35
+            2091:   22(float) Load 2090
+            2092:   17(ivec4) Load 19(ballot)
+            2093:   22(float) GroupNonUniformFMax 178 PartitionedExclusiveScanNV 2091 2092
+            2094:     36(ptr) AccessChain 31(data) 2089 34 35
+                              Store 2094 2093
+            2095:      6(int) Load 8(invocation)
+            2096:     44(ptr) AccessChain 31(data) 63 34
+            2097:   23(fvec4) Load 2096
+            2098:   43(fvec2) VectorShuffle 2097 2097 0 1
+            2099:   17(ivec4) Load 19(ballot)
+            2100:   43(fvec2) GroupNonUniformFMax 178 PartitionedExclusiveScanNV 2098 2099
+            2101:     44(ptr) AccessChain 31(data) 2095 34
+            2102:   23(fvec4) Load 2101
+            2103:   23(fvec4) VectorShuffle 2102 2100 4 5 2 3
+                              Store 2101 2103
+            2104:      6(int) Load 8(invocation)
+            2105:     44(ptr) AccessChain 31(data) 33 34
+            2106:   23(fvec4) Load 2105
+            2107:   51(fvec3) VectorShuffle 2106 2106 0 1 2
+            2108:   17(ivec4) Load 19(ballot)
+            2109:   51(fvec3) GroupNonUniformFMax 178 PartitionedExclusiveScanNV 2107 2108
+            2110:     44(ptr) AccessChain 31(data) 2104 34
+            2111:   23(fvec4) Load 2110
+            2112:   23(fvec4) VectorShuffle 2111 2109 4 5 6 3
+                              Store 2110 2112
+            2113:      6(int) Load 8(invocation)
+            2114:     44(ptr) AccessChain 31(data) 115 34
+            2115:   23(fvec4) Load 2114
+            2116:   17(ivec4) Load 19(ballot)
+            2117:   23(fvec4) GroupNonUniformFMax 178 PartitionedExclusiveScanNV 2115 2116
+            2118:     44(ptr) AccessChain 31(data) 2113 34
+                              Store 2118 2117
+            2119:      6(int) Load 8(invocation)
+            2120:     64(ptr) AccessChain 31(data) 34 63 35
+            2121:     24(int) Load 2120
+            2122:   17(ivec4) Load 19(ballot)
+            2123:     24(int) GroupNonUniformSMax 178 PartitionedExclusiveScanNV 2121 2122
+            2124:     64(ptr) AccessChain 31(data) 2119 63 35
+                              Store 2124 2123
+            2125:      6(int) Load 8(invocation)
+            2126:     71(ptr) AccessChain 31(data) 63 63
+            2127:   25(ivec4) Load 2126
+            2128:   70(ivec2) VectorShuffle 2127 2127 0 1
+            2129:   17(ivec4) Load 19(ballot)
+            2130:   70(ivec2) GroupNonUniformSMax 178 PartitionedExclusiveScanNV 2128 2129
+            2131:     71(ptr) AccessChain 31(data) 2125 63
+            2132:   25(ivec4) Load 2131
+            2133:   25(ivec4) VectorShuffle 2132 2130 4 5 2 3
+                              Store 2131 2133
+            2134:      6(int) Load 8(invocation)
+            2135:     71(ptr) AccessChain 31(data) 33 63
+            2136:   25(ivec4) Load 2135
+            2137:   78(ivec3) VectorShuffle 2136 2136 0 1 2
+            2138:   17(ivec4) Load 19(ballot)
+            2139:   78(ivec3) GroupNonUniformSMax 178 PartitionedExclusiveScanNV 2137 2138
+            2140:     71(ptr) AccessChain 31(data) 2134 63
+            2141:   25(ivec4) Load 2140
+            2142:   25(ivec4) VectorShuffle 2141 2139 4 5 6 3
+                              Store 2140 2142
+            2143:      6(int) Load 8(invocation)
+            2144:     71(ptr) AccessChain 31(data) 115 63
+            2145:   25(ivec4) Load 2144
+            2146:   17(ivec4) Load 19(ballot)
+            2147:   25(ivec4) GroupNonUniformSMax 178 PartitionedExclusiveScanNV 2145 2146
+            2148:     71(ptr) AccessChain 31(data) 2143 63
+                              Store 2148 2147
+            2149:      6(int) Load 8(invocation)
+            2150:     90(ptr) AccessChain 31(data) 34 33 35
+            2151:      6(int) Load 2150
+            2152:   17(ivec4) Load 19(ballot)
+            2153:      6(int) GroupNonUniformUMax 178 PartitionedExclusiveScanNV 2151 2152
+            2154:     90(ptr) AccessChain 31(data) 2149 33 35
+                              Store 2154 2153
+            2155:      6(int) Load 8(invocation)
+            2156:     40(ptr) AccessChain 31(data) 63 33
+            2157:   17(ivec4) Load 2156
+            2158:   96(ivec2) VectorShuffle 2157 2157 0 1
+            2159:   17(ivec4) Load 19(ballot)
+            2160:   96(ivec2) GroupNonUniformUMax 178 PartitionedExclusiveScanNV 2158 2159
+            2161:     40(ptr) AccessChain 31(data) 2155 33
+            2162:   17(ivec4) Load 2161
+            2163:   17(ivec4) VectorShuffle 2162 2160 4 5 2 3
+                              Store 2161 2163
+            2164:      6(int) Load 8(invocation)
+            2165:     40(ptr) AccessChain 31(data) 33 33
+            2166:   17(ivec4) Load 2165
+            2167:  103(ivec3) VectorShuffle 2166 2166 0 1 2
+            2168:   17(ivec4) Load 19(ballot)
+            2169:  103(ivec3) GroupNonUniformUMax 178 PartitionedExclusiveScanNV 2167 2168
+            2170:     40(ptr) AccessChain 31(data) 2164 33
+            2171:   17(ivec4) Load 2170
+            2172:   17(ivec4) VectorShuffle 2171 2169 4 5 6 3
+                              Store 2170 2172
+            2173:      6(int) Load 8(invocation)
+            2174:     40(ptr) AccessChain 31(data) 115 33
+            2175:   17(ivec4) Load 2174
+            2176:   17(ivec4) Load 19(ballot)
+            2177:   17(ivec4) GroupNonUniformUMax 178 PartitionedExclusiveScanNV 2175 2176
+            2178:     40(ptr) AccessChain 31(data) 2173 33
+                              Store 2178 2177
+            2179:      6(int) Load 8(invocation)
+            2180:    116(ptr) AccessChain 31(data) 34 115 35
+            2181:26(float64_t) Load 2180
+            2182:   17(ivec4) Load 19(ballot)
+            2183:26(float64_t) GroupNonUniformFMax 178 PartitionedExclusiveScanNV 2181 2182
+            2184:    116(ptr) AccessChain 31(data) 2179 115 35
+                              Store 2184 2183
+            2185:      6(int) Load 8(invocation)
+            2186:    123(ptr) AccessChain 31(data) 63 115
+            2187: 27(f64vec4) Load 2186
+            2188:122(f64vec2) VectorShuffle 2187 2187 0 1
+            2189:   17(ivec4) Load 19(ballot)
+            2190:122(f64vec2) GroupNonUniformFMax 178 PartitionedExclusiveScanNV 2188 2189
+            2191:    123(ptr) AccessChain 31(data) 2185 115
+            2192: 27(f64vec4) Load 2191
+            2193: 27(f64vec4) VectorShuffle 2192 2190 4 5 2 3
+                              Store 2191 2193
+            2194:      6(int) Load 8(invocation)
+            2195:    123(ptr) AccessChain 31(data) 33 115
+            2196: 27(f64vec4) Load 2195
+            2197:130(f64vec3) VectorShuffle 2196 2196 0 1 2
+            2198:   17(ivec4) Load 19(ballot)
+            2199:130(f64vec3) GroupNonUniformFMax 178 PartitionedExclusiveScanNV 2197 2198
+            2200:    123(ptr) AccessChain 31(data) 2194 115
+            2201: 27(f64vec4) Load 2200
+            2202: 27(f64vec4) VectorShuffle 2201 2199 4 5 6 3
+                              Store 2200 2202
+            2203:      6(int) Load 8(invocation)
+            2204:    123(ptr) AccessChain 31(data) 115 115
+            2205: 27(f64vec4) Load 2204
+            2206:   17(ivec4) Load 19(ballot)
+            2207: 27(f64vec4) GroupNonUniformFMax 178 PartitionedExclusiveScanNV 2205 2206
+            2208:    123(ptr) AccessChain 31(data) 2203 115
+                              Store 2208 2207
+            2209:      6(int) Load 8(invocation)
+            2210:     64(ptr) AccessChain 31(data) 34 63 35
+            2211:     24(int) Load 2210
+            2212:   17(ivec4) Load 19(ballot)
+            2213:     24(int) GroupNonUniformBitwiseAnd 178 PartitionedExclusiveScanNV 2211 2212
+            2214:     64(ptr) AccessChain 31(data) 2209 63 35
+                              Store 2214 2213
+            2215:      6(int) Load 8(invocation)
+            2216:     71(ptr) AccessChain 31(data) 63 63
+            2217:   25(ivec4) Load 2216
+            2218:   70(ivec2) VectorShuffle 2217 2217 0 1
+            2219:   17(ivec4) Load 19(ballot)
+            2220:   70(ivec2) GroupNonUniformBitwiseAnd 178 PartitionedExclusiveScanNV 2218 2219
+            2221:     71(ptr) AccessChain 31(data) 2215 63
+            2222:   25(ivec4) Load 2221
+            2223:   25(ivec4) VectorShuffle 2222 2220 4 5 2 3
+                              Store 2221 2223
+            2224:      6(int) Load 8(invocation)
+            2225:     71(ptr) AccessChain 31(data) 33 63
+            2226:   25(ivec4) Load 2225
+            2227:   78(ivec3) VectorShuffle 2226 2226 0 1 2
+            2228:   17(ivec4) Load 19(ballot)
+            2229:   78(ivec3) GroupNonUniformBitwiseAnd 178 PartitionedExclusiveScanNV 2227 2228
+            2230:     71(ptr) AccessChain 31(data) 2224 63
+            2231:   25(ivec4) Load 2230
+            2232:   25(ivec4) VectorShuffle 2231 2229 4 5 6 3
+                              Store 2230 2232
+            2233:      6(int) Load 8(invocation)
+            2234:     71(ptr) AccessChain 31(data) 115 63
+            2235:   25(ivec4) Load 2234
+            2236:   17(ivec4) Load 19(ballot)
+            2237:   25(ivec4) GroupNonUniformBitwiseAnd 178 PartitionedExclusiveScanNV 2235 2236
+            2238:     71(ptr) AccessChain 31(data) 2233 63
+                              Store 2238 2237
+            2239:      6(int) Load 8(invocation)
+            2240:     90(ptr) AccessChain 31(data) 34 33 35
+            2241:      6(int) Load 2240
+            2242:   17(ivec4) Load 19(ballot)
+            2243:      6(int) GroupNonUniformBitwiseAnd 178 PartitionedExclusiveScanNV 2241 2242
+            2244:     90(ptr) AccessChain 31(data) 2239 33 35
+                              Store 2244 2243
+            2245:      6(int) Load 8(invocation)
+            2246:     40(ptr) AccessChain 31(data) 63 33
+            2247:   17(ivec4) Load 2246
+            2248:   96(ivec2) VectorShuffle 2247 2247 0 1
+            2249:   17(ivec4) Load 19(ballot)
+            2250:   96(ivec2) GroupNonUniformBitwiseAnd 178 PartitionedExclusiveScanNV 2248 2249
+            2251:     40(ptr) AccessChain 31(data) 2245 33
+            2252:   17(ivec4) Load 2251
+            2253:   17(ivec4) VectorShuffle 2252 2250 4 5 2 3
+                              Store 2251 2253
+            2254:      6(int) Load 8(invocation)
+            2255:     40(ptr) AccessChain 31(data) 33 33
+            2256:   17(ivec4) Load 2255
+            2257:  103(ivec3) VectorShuffle 2256 2256 0 1 2
+            2258:   17(ivec4) Load 19(ballot)
+            2259:  103(ivec3) GroupNonUniformBitwiseAnd 178 PartitionedExclusiveScanNV 2257 2258
+            2260:     40(ptr) AccessChain 31(data) 2254 33
+            2261:   17(ivec4) Load 2260
+            2262:   17(ivec4) VectorShuffle 2261 2259 4 5 6 3
+                              Store 2260 2262
+            2263:      6(int) Load 8(invocation)
+            2264:     40(ptr) AccessChain 31(data) 115 33
+            2265:   17(ivec4) Load 2264
+            2266:   17(ivec4) Load 19(ballot)
+            2267:   17(ivec4) GroupNonUniformBitwiseAnd 178 PartitionedExclusiveScanNV 2265 2266
+            2268:     40(ptr) AccessChain 31(data) 2263 33
+                              Store 2268 2267
+            2269:      6(int) Load 8(invocation)
+            2270:     64(ptr) AccessChain 31(data) 34 63 35
+            2271:     24(int) Load 2270
+            2272:   144(bool) SLessThan 2271 34
+            2273:   17(ivec4) Load 19(ballot)
+            2274:   144(bool) GroupNonUniformLogicalAnd 178 PartitionedExclusiveScanNV 2272 2273
+            2275:     24(int) Select 2274 63 34
+            2276:     64(ptr) AccessChain 31(data) 2269 63 35
+                              Store 2276 2275
+            2277:      6(int) Load 8(invocation)
+            2278:     71(ptr) AccessChain 31(data) 63 63
+            2279:   25(ivec4) Load 2278
+            2280:   70(ivec2) VectorShuffle 2279 2279 0 1
+            2281:  152(bvec2) SLessThan 2280 727
+            2282:   17(ivec4) Load 19(ballot)
+            2283:  152(bvec2) GroupNonUniformLogicalAnd 178 PartitionedExclusiveScanNV 2281 2282
+            2284:   70(ivec2) Select 2283 731 727
+            2285:     71(ptr) AccessChain 31(data) 2277 63
+            2286:   25(ivec4) Load 2285
+            2287:   25(ivec4) VectorShuffle 2286 2284 4 5 2 3
+                              Store 2285 2287
+            2288:      6(int) Load 8(invocation)
+            2289:     71(ptr) AccessChain 31(data) 63 63
+            2290:   25(ivec4) Load 2289
+            2291:   78(ivec3) VectorShuffle 2290 2290 0 1 2
+            2292:  161(bvec3) SLessThan 2291 740
+            2293:   17(ivec4) Load 19(ballot)
+            2294:  161(bvec3) GroupNonUniformLogicalAnd 178 PartitionedExclusiveScanNV 2292 2293
+            2295:   78(ivec3) Select 2294 744 740
+            2296:     71(ptr) AccessChain 31(data) 2288 63
+            2297:   25(ivec4) Load 2296
+            2298:   25(ivec4) VectorShuffle 2297 2295 4 5 6 3
+                              Store 2296 2298
+            2299:      6(int) Load 8(invocation)
+            2300:     71(ptr) AccessChain 31(data) 63 63
+            2301:   25(ivec4) Load 2300
+            2302:  169(bvec4) SLessThan 2301 752
+            2303:   17(ivec4) Load 19(ballot)
+            2304:  169(bvec4) GroupNonUniformLogicalAnd 178 PartitionedExclusiveScanNV 2302 2303
+            2305:   25(ivec4) Select 2304 756 752
+            2306:     71(ptr) AccessChain 31(data) 2299 63
+                              Store 2306 2305
+            2307:      6(int) Load 8(invocation)
+            2308:     64(ptr) AccessChain 31(data) 34 63 35
+            2309:     24(int) Load 2308
+            2310:   17(ivec4) Load 19(ballot)
+            2311:     24(int) GroupNonUniformBitwiseOr 178 PartitionedExclusiveScanNV 2309 2310
+            2312:     64(ptr) AccessChain 31(data) 2307 63 35
+                              Store 2312 2311
+            2313:      6(int) Load 8(invocation)
+            2314:     71(ptr) AccessChain 31(data) 63 63
+            2315:   25(ivec4) Load 2314
+            2316:   70(ivec2) VectorShuffle 2315 2315 0 1
+            2317:   17(ivec4) Load 19(ballot)
+            2318:   70(ivec2) GroupNonUniformBitwiseOr 178 PartitionedExclusiveScanNV 2316 2317
+            2319:     71(ptr) AccessChain 31(data) 2313 63
+            2320:   25(ivec4) Load 2319
+            2321:   25(ivec4) VectorShuffle 2320 2318 4 5 2 3
+                              Store 2319 2321
+            2322:      6(int) Load 8(invocation)
+            2323:     71(ptr) AccessChain 31(data) 33 63
+            2324:   25(ivec4) Load 2323
+            2325:   78(ivec3) VectorShuffle 2324 2324 0 1 2
+            2326:   17(ivec4) Load 19(ballot)
+            2327:   78(ivec3) GroupNonUniformBitwiseOr 178 PartitionedExclusiveScanNV 2325 2326
+            2328:     71(ptr) AccessChain 31(data) 2322 63
+            2329:   25(ivec4) Load 2328
+            2330:   25(ivec4) VectorShuffle 2329 2327 4 5 6 3
+                              Store 2328 2330
+            2331:      6(int) Load 8(invocation)
+            2332:     71(ptr) AccessChain 31(data) 115 63
+            2333:   25(ivec4) Load 2332
+            2334:   17(ivec4) Load 19(ballot)
+            2335:   25(ivec4) GroupNonUniformBitwiseOr 178 PartitionedExclusiveScanNV 2333 2334
+            2336:     71(ptr) AccessChain 31(data) 2331 63
+                              Store 2336 2335
+            2337:      6(int) Load 8(invocation)
+            2338:     90(ptr) AccessChain 31(data) 34 33 35
+            2339:      6(int) Load 2338
+            2340:   17(ivec4) Load 19(ballot)
+            2341:      6(int) GroupNonUniformBitwiseOr 178 PartitionedExclusiveScanNV 2339 2340
+            2342:     90(ptr) AccessChain 31(data) 2337 33 35
+                              Store 2342 2341
+            2343:      6(int) Load 8(invocation)
+            2344:     40(ptr) AccessChain 31(data) 63 33
+            2345:   17(ivec4) Load 2344
+            2346:   96(ivec2) VectorShuffle 2345 2345 0 1
+            2347:   17(ivec4) Load 19(ballot)
+            2348:   96(ivec2) GroupNonUniformBitwiseOr 178 PartitionedExclusiveScanNV 2346 2347
+            2349:     40(ptr) AccessChain 31(data) 2343 33
+            2350:   17(ivec4) Load 2349
+            2351:   17(ivec4) VectorShuffle 2350 2348 4 5 2 3
+                              Store 2349 2351
+            2352:      6(int) Load 8(invocation)
+            2353:     40(ptr) AccessChain 31(data) 33 33
+            2354:   17(ivec4) Load 2353
+            2355:  103(ivec3) VectorShuffle 2354 2354 0 1 2
+            2356:   17(ivec4) Load 19(ballot)
+            2357:  103(ivec3) GroupNonUniformBitwiseOr 178 PartitionedExclusiveScanNV 2355 2356
+            2358:     40(ptr) AccessChain 31(data) 2352 33
+            2359:   17(ivec4) Load 2358
+            2360:   17(ivec4) VectorShuffle 2359 2357 4 5 6 3
+                              Store 2358 2360
+            2361:      6(int) Load 8(invocation)
+            2362:     40(ptr) AccessChain 31(data) 115 33
+            2363:   17(ivec4) Load 2362
+            2364:   17(ivec4) Load 19(ballot)
+            2365:   17(ivec4) GroupNonUniformBitwiseOr 178 PartitionedExclusiveScanNV 2363 2364
+            2366:     40(ptr) AccessChain 31(data) 2361 33
+                              Store 2366 2365
+            2367:      6(int) Load 8(invocation)
+            2368:     64(ptr) AccessChain 31(data) 34 63 35
+            2369:     24(int) Load 2368
+            2370:   144(bool) SLessThan 2369 34
+            2371:   17(ivec4) Load 19(ballot)
+            2372:   144(bool) GroupNonUniformLogicalOr 178 PartitionedExclusiveScanNV 2370 2371
+            2373:     24(int) Select 2372 63 34
+            2374:     64(ptr) AccessChain 31(data) 2367 63 35
+                              Store 2374 2373
+            2375:      6(int) Load 8(invocation)
+            2376:     71(ptr) AccessChain 31(data) 63 63
+            2377:   25(ivec4) Load 2376
+            2378:   70(ivec2) VectorShuffle 2377 2377 0 1
+            2379:  152(bvec2) SLessThan 2378 727
+            2380:   17(ivec4) Load 19(ballot)
+            2381:  152(bvec2) GroupNonUniformLogicalOr 178 PartitionedExclusiveScanNV 2379 2380
+            2382:   70(ivec2) Select 2381 731 727
+            2383:     71(ptr) AccessChain 31(data) 2375 63
+            2384:   25(ivec4) Load 2383
+            2385:   25(ivec4) VectorShuffle 2384 2382 4 5 2 3
+                              Store 2383 2385
+            2386:      6(int) Load 8(invocation)
+            2387:     71(ptr) AccessChain 31(data) 63 63
+            2388:   25(ivec4) Load 2387
+            2389:   78(ivec3) VectorShuffle 2388 2388 0 1 2
+            2390:  161(bvec3) SLessThan 2389 740
+            2391:   17(ivec4) Load 19(ballot)
+            2392:  161(bvec3) GroupNonUniformLogicalOr 178 PartitionedExclusiveScanNV 2390 2391
+            2393:   78(ivec3) Select 2392 744 740
+            2394:     71(ptr) AccessChain 31(data) 2386 63
+            2395:   25(ivec4) Load 2394
+            2396:   25(ivec4) VectorShuffle 2395 2393 4 5 6 3
+                              Store 2394 2396
+            2397:      6(int) Load 8(invocation)
+            2398:     71(ptr) AccessChain 31(data) 63 63
+            2399:   25(ivec4) Load 2398
+            2400:  169(bvec4) SLessThan 2399 752
+            2401:   17(ivec4) Load 19(ballot)
+            2402:  169(bvec4) GroupNonUniformLogicalOr 178 PartitionedExclusiveScanNV 2400 2401
+            2403:   25(ivec4) Select 2402 756 752
+            2404:     71(ptr) AccessChain 31(data) 2397 63
+                              Store 2404 2403
+            2405:      6(int) Load 8(invocation)
+            2406:     64(ptr) AccessChain 31(data) 34 63 35
+            2407:     24(int) Load 2406
+            2408:   17(ivec4) Load 19(ballot)
+            2409:     24(int) GroupNonUniformBitwiseXor 178 PartitionedExclusiveScanNV 2407 2408
+            2410:     64(ptr) AccessChain 31(data) 2405 63 35
+                              Store 2410 2409
+            2411:      6(int) Load 8(invocation)
+            2412:     71(ptr) AccessChain 31(data) 63 63
+            2413:   25(ivec4) Load 2412
+            2414:   70(ivec2) VectorShuffle 2413 2413 0 1
+            2415:   17(ivec4) Load 19(ballot)
+            2416:   70(ivec2) GroupNonUniformBitwiseXor 178 PartitionedExclusiveScanNV 2414 2415
+            2417:     71(ptr) AccessChain 31(data) 2411 63
+            2418:   25(ivec4) Load 2417
+            2419:   25(ivec4) VectorShuffle 2418 2416 4 5 2 3
+                              Store 2417 2419
+            2420:      6(int) Load 8(invocation)
+            2421:     71(ptr) AccessChain 31(data) 33 63
+            2422:   25(ivec4) Load 2421
+            2423:   78(ivec3) VectorShuffle 2422 2422 0 1 2
+            2424:   17(ivec4) Load 19(ballot)
+            2425:   78(ivec3) GroupNonUniformBitwiseXor 178 PartitionedExclusiveScanNV 2423 2424
+            2426:     71(ptr) AccessChain 31(data) 2420 63
+            2427:   25(ivec4) Load 2426
+            2428:   25(ivec4) VectorShuffle 2427 2425 4 5 6 3
+                              Store 2426 2428
+            2429:      6(int) Load 8(invocation)
+            2430:     71(ptr) AccessChain 31(data) 115 63
+            2431:   25(ivec4) Load 2430
+            2432:   17(ivec4) Load 19(ballot)
+            2433:   25(ivec4) GroupNonUniformBitwiseXor 178 PartitionedExclusiveScanNV 2431 2432
+            2434:     71(ptr) AccessChain 31(data) 2429 63
+                              Store 2434 2433
+            2435:      6(int) Load 8(invocation)
+            2436:     90(ptr) AccessChain 31(data) 34 33 35
+            2437:      6(int) Load 2436
+            2438:   17(ivec4) Load 19(ballot)
+            2439:      6(int) GroupNonUniformBitwiseXor 178 PartitionedExclusiveScanNV 2437 2438
+            2440:     90(ptr) AccessChain 31(data) 2435 33 35
+                              Store 2440 2439
+            2441:      6(int) Load 8(invocation)
+            2442:     40(ptr) AccessChain 31(data) 63 33
+            2443:   17(ivec4) Load 2442
+            2444:   96(ivec2) VectorShuffle 2443 2443 0 1
+            2445:   17(ivec4) Load 19(ballot)
+            2446:   96(ivec2) GroupNonUniformBitwiseXor 178 PartitionedExclusiveScanNV 2444 2445
+            2447:     40(ptr) AccessChain 31(data) 2441 33
+            2448:   17(ivec4) Load 2447
+            2449:   17(ivec4) VectorShuffle 2448 2446 4 5 2 3
+                              Store 2447 2449
+            2450:      6(int) Load 8(invocation)
+            2451:     40(ptr) AccessChain 31(data) 33 33
+            2452:   17(ivec4) Load 2451
+            2453:  103(ivec3) VectorShuffle 2452 2452 0 1 2
+            2454:   17(ivec4) Load 19(ballot)
+            2455:  103(ivec3) GroupNonUniformBitwiseXor 178 PartitionedExclusiveScanNV 2453 2454
+            2456:     40(ptr) AccessChain 31(data) 2450 33
+            2457:   17(ivec4) Load 2456
+            2458:   17(ivec4) VectorShuffle 2457 2455 4 5 6 3
+                              Store 2456 2458
+            2459:      6(int) Load 8(invocation)
+            2460:     40(ptr) AccessChain 31(data) 115 33
+            2461:   17(ivec4) Load 2460
+            2462:   17(ivec4) Load 19(ballot)
+            2463:   17(ivec4) GroupNonUniformBitwiseXor 178 PartitionedExclusiveScanNV 2461 2462
+            2464:     40(ptr) AccessChain 31(data) 2459 33
+                              Store 2464 2463
+            2465:      6(int) Load 8(invocation)
+            2466:     64(ptr) AccessChain 31(data) 34 63 35
+            2467:     24(int) Load 2466
+            2468:   144(bool) SLessThan 2467 34
+            2469:   17(ivec4) Load 19(ballot)
+            2470:   144(bool) GroupNonUniformLogicalXor 178 PartitionedExclusiveScanNV 2468 2469
+            2471:     24(int) Select 2470 63 34
+            2472:     64(ptr) AccessChain 31(data) 2465 63 35
+                              Store 2472 2471
+            2473:      6(int) Load 8(invocation)
+            2474:     71(ptr) AccessChain 31(data) 63 63
+            2475:   25(ivec4) Load 2474
+            2476:   70(ivec2) VectorShuffle 2475 2475 0 1
+            2477:  152(bvec2) SLessThan 2476 727
+            2478:   17(ivec4) Load 19(ballot)
+            2479:  152(bvec2) GroupNonUniformLogicalXor 178 PartitionedExclusiveScanNV 2477 2478
+            2480:   70(ivec2) Select 2479 731 727
+            2481:     71(ptr) AccessChain 31(data) 2473 63
+            2482:   25(ivec4) Load 2481
+            2483:   25(ivec4) VectorShuffle 2482 2480 4 5 2 3
+                              Store 2481 2483
+            2484:      6(int) Load 8(invocation)
+            2485:     71(ptr) AccessChain 31(data) 63 63
+            2486:   25(ivec4) Load 2485
+            2487:   78(ivec3) VectorShuffle 2486 2486 0 1 2
+            2488:  161(bvec3) SLessThan 2487 740
+            2489:   17(ivec4) Load 19(ballot)
+            2490:  161(bvec3) GroupNonUniformLogicalXor 178 PartitionedExclusiveScanNV 2488 2489
+            2491:   78(ivec3) Select 2490 744 740
+            2492:     71(ptr) AccessChain 31(data) 2484 63
+            2493:   25(ivec4) Load 2492
+            2494:   25(ivec4) VectorShuffle 2493 2491 4 5 6 3
+                              Store 2492 2494
+            2495:      6(int) Load 8(invocation)
+            2496:     71(ptr) AccessChain 31(data) 63 63
+            2497:   25(ivec4) Load 2496
+            2498:  169(bvec4) SLessThan 2497 752
+            2499:   17(ivec4) Load 19(ballot)
+            2500:  169(bvec4) GroupNonUniformLogicalXor 178 PartitionedExclusiveScanNV 2498 2499
+            2501:   25(ivec4) Select 2500 756 752
+            2502:     71(ptr) AccessChain 31(data) 2495 63
+                              Store 2502 2501
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.subgroupQuad.comp.out b/Test/baseResults/spv.subgroupQuad.comp.out
new file mode 100644
index 0000000..435c490
--- /dev/null
+++ b/Test/baseResults/spv.subgroupQuad.comp.out
@@ -0,0 +1,739 @@
+spv.subgroupQuad.comp
+// Module Version 10300
+// Generated by (magic number): 80007
+// Id's are bound by 616
+
+                              Capability Shader
+                              Capability Float64
+                              Capability GroupNonUniform
+                              Capability GroupNonUniformQuad
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint GLCompute 4  "main" 10 12
+                              ExecutionMode 4 LocalSize 8 1 1
+                              Source GLSL 450
+                              SourceExtension  "GL_KHR_shader_subgroup_basic"
+                              SourceExtension  "GL_KHR_shader_subgroup_quad"
+                              Name 4  "main"
+                              Name 8  "invocation"
+                              Name 10  "gl_SubgroupInvocationID"
+                              Name 12  "gl_SubgroupSize"
+                              Name 24  "Buffers"
+                              MemberName 24(Buffers) 0  "f4"
+                              MemberName 24(Buffers) 1  "i4"
+                              MemberName 24(Buffers) 2  "u4"
+                              MemberName 24(Buffers) 3  "d4"
+                              Name 27  "data"
+                              Decorate 10(gl_SubgroupInvocationID) RelaxedPrecision
+                              Decorate 10(gl_SubgroupInvocationID) BuiltIn SubgroupLocalInvocationId
+                              Decorate 11 RelaxedPrecision
+                              Decorate 12(gl_SubgroupSize) RelaxedPrecision
+                              Decorate 12(gl_SubgroupSize) BuiltIn SubgroupSize
+                              Decorate 13 RelaxedPrecision
+                              Decorate 14 RelaxedPrecision
+                              Decorate 16 RelaxedPrecision
+                              MemberDecorate 24(Buffers) 0 Offset 0
+                              MemberDecorate 24(Buffers) 1 Offset 16
+                              MemberDecorate 24(Buffers) 2 Offset 32
+                              MemberDecorate 24(Buffers) 3 Offset 64
+                              Decorate 24(Buffers) Block
+                              Decorate 27(data) DescriptorSet 0
+                              Decorate 27(data) Binding 0
+                              Decorate 615 BuiltIn WorkgroupSize
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeInt 32 0
+               7:             TypePointer Function 6(int)
+               9:             TypePointer Input 6(int)
+10(gl_SubgroupInvocationID):      9(ptr) Variable Input
+12(gl_SubgroupSize):      9(ptr) Variable Input
+              15:      6(int) Constant 4
+              17:             TypeFloat 32
+              18:             TypeVector 17(float) 4
+              19:             TypeInt 32 1
+              20:             TypeVector 19(int) 4
+              21:             TypeVector 6(int) 4
+              22:             TypeFloat 64
+              23:             TypeVector 22(float64_t) 4
+     24(Buffers):             TypeStruct 18(fvec4) 20(ivec4) 21(ivec4) 23(f64vec4)
+              25:             TypeArray 24(Buffers) 15
+              26:             TypePointer StorageBuffer 25
+        27(data):     26(ptr) Variable StorageBuffer
+              29:     19(int) Constant 0
+              30:      6(int) Constant 0
+              31:             TypePointer StorageBuffer 17(float)
+              34:      6(int) Constant 1
+              35:      6(int) Constant 3
+              39:     19(int) Constant 1
+              40:             TypeVector 17(float) 2
+              41:             TypePointer StorageBuffer 18(fvec4)
+              50:     19(int) Constant 2
+              51:             TypeVector 17(float) 3
+              60:     19(int) Constant 3
+              66:             TypePointer StorageBuffer 19(int)
+              72:             TypeVector 19(int) 2
+              73:             TypePointer StorageBuffer 20(ivec4)
+              82:             TypeVector 19(int) 3
+              96:             TypePointer StorageBuffer 6(int)
+             102:             TypeVector 6(int) 2
+             103:             TypePointer StorageBuffer 21(ivec4)
+             112:             TypeVector 6(int) 3
+             126:             TypePointer StorageBuffer 22(float64_t)
+             132:             TypeVector 22(float64_t) 2
+             133:             TypePointer StorageBuffer 23(f64vec4)
+             142:             TypeVector 22(float64_t) 3
+             158:             TypeBool
+             167:   72(ivec2) ConstantComposite 29 29
+             168:             TypeVector 158(bool) 2
+             171:   72(ivec2) ConstantComposite 39 39
+             180:   82(ivec3) ConstantComposite 29 29 29
+             181:             TypeVector 158(bool) 3
+             184:   82(ivec3) ConstantComposite 39 39 39
+             192:   20(ivec4) ConstantComposite 29 29 29 29
+             193:             TypeVector 158(bool) 4
+             196:   20(ivec4) ConstantComposite 39 39 39 39
+             478:      6(int) Constant 2
+             614:      6(int) Constant 8
+             615:  112(ivec3) ConstantComposite 614 34 34
+         4(main):           2 Function None 3
+               5:             Label
+   8(invocation):      7(ptr) Variable Function
+              11:      6(int) Load 10(gl_SubgroupInvocationID)
+              13:      6(int) Load 12(gl_SubgroupSize)
+              14:      6(int) IAdd 11 13
+              16:      6(int) UMod 14 15
+                              Store 8(invocation) 16
+              28:      6(int) Load 8(invocation)
+              32:     31(ptr) AccessChain 27(data) 29 29 30
+              33:   17(float) Load 32
+              36:   17(float) GroupNonUniformQuadBroadcast 35 33 34
+              37:     31(ptr) AccessChain 27(data) 28 29 30
+                              Store 37 36
+              38:      6(int) Load 8(invocation)
+              42:     41(ptr) AccessChain 27(data) 39 29
+              43:   18(fvec4) Load 42
+              44:   40(fvec2) VectorShuffle 43 43 0 1
+              45:   40(fvec2) GroupNonUniformQuadBroadcast 35 44 34
+              46:     41(ptr) AccessChain 27(data) 38 29
+              47:   18(fvec4) Load 46
+              48:   18(fvec4) VectorShuffle 47 45 4 5 2 3
+                              Store 46 48
+              49:      6(int) Load 8(invocation)
+              52:     41(ptr) AccessChain 27(data) 50 29
+              53:   18(fvec4) Load 52
+              54:   51(fvec3) VectorShuffle 53 53 0 1 2
+              55:   51(fvec3) GroupNonUniformQuadBroadcast 35 54 34
+              56:     41(ptr) AccessChain 27(data) 49 29
+              57:   18(fvec4) Load 56
+              58:   18(fvec4) VectorShuffle 57 55 4 5 6 3
+                              Store 56 58
+              59:      6(int) Load 8(invocation)
+              61:     41(ptr) AccessChain 27(data) 60 29
+              62:   18(fvec4) Load 61
+              63:   18(fvec4) GroupNonUniformQuadBroadcast 35 62 34
+              64:     41(ptr) AccessChain 27(data) 59 29
+                              Store 64 63
+              65:      6(int) Load 8(invocation)
+              67:     66(ptr) AccessChain 27(data) 29 39 30
+              68:     19(int) Load 67
+              69:     19(int) GroupNonUniformQuadBroadcast 35 68 34
+              70:     66(ptr) AccessChain 27(data) 65 39 30
+                              Store 70 69
+              71:      6(int) Load 8(invocation)
+              74:     73(ptr) AccessChain 27(data) 39 39
+              75:   20(ivec4) Load 74
+              76:   72(ivec2) VectorShuffle 75 75 0 1
+              77:   72(ivec2) GroupNonUniformQuadBroadcast 35 76 34
+              78:     73(ptr) AccessChain 27(data) 71 39
+              79:   20(ivec4) Load 78
+              80:   20(ivec4) VectorShuffle 79 77 4 5 2 3
+                              Store 78 80
+              81:      6(int) Load 8(invocation)
+              83:     73(ptr) AccessChain 27(data) 50 39
+              84:   20(ivec4) Load 83
+              85:   82(ivec3) VectorShuffle 84 84 0 1 2
+              86:   82(ivec3) GroupNonUniformQuadBroadcast 35 85 34
+              87:     73(ptr) AccessChain 27(data) 81 39
+              88:   20(ivec4) Load 87
+              89:   20(ivec4) VectorShuffle 88 86 4 5 6 3
+                              Store 87 89
+              90:      6(int) Load 8(invocation)
+              91:     73(ptr) AccessChain 27(data) 60 39
+              92:   20(ivec4) Load 91
+              93:   20(ivec4) GroupNonUniformQuadBroadcast 35 92 34
+              94:     73(ptr) AccessChain 27(data) 90 39
+                              Store 94 93
+              95:      6(int) Load 8(invocation)
+              97:     96(ptr) AccessChain 27(data) 29 50 30
+              98:      6(int) Load 97
+              99:      6(int) GroupNonUniformQuadBroadcast 35 98 34
+             100:     96(ptr) AccessChain 27(data) 95 50 30
+                              Store 100 99
+             101:      6(int) Load 8(invocation)
+             104:    103(ptr) AccessChain 27(data) 39 50
+             105:   21(ivec4) Load 104
+             106:  102(ivec2) VectorShuffle 105 105 0 1
+             107:  102(ivec2) GroupNonUniformQuadBroadcast 35 106 34
+             108:    103(ptr) AccessChain 27(data) 101 50
+             109:   21(ivec4) Load 108
+             110:   21(ivec4) VectorShuffle 109 107 4 5 2 3
+                              Store 108 110
+             111:      6(int) Load 8(invocation)
+             113:    103(ptr) AccessChain 27(data) 50 50
+             114:   21(ivec4) Load 113
+             115:  112(ivec3) VectorShuffle 114 114 0 1 2
+             116:  112(ivec3) GroupNonUniformQuadBroadcast 35 115 34
+             117:    103(ptr) AccessChain 27(data) 111 50
+             118:   21(ivec4) Load 117
+             119:   21(ivec4) VectorShuffle 118 116 4 5 6 3
+                              Store 117 119
+             120:      6(int) Load 8(invocation)
+             121:    103(ptr) AccessChain 27(data) 60 50
+             122:   21(ivec4) Load 121
+             123:   21(ivec4) GroupNonUniformQuadBroadcast 35 122 34
+             124:    103(ptr) AccessChain 27(data) 120 50
+                              Store 124 123
+             125:      6(int) Load 8(invocation)
+             127:    126(ptr) AccessChain 27(data) 29 60 30
+             128:22(float64_t) Load 127
+             129:22(float64_t) GroupNonUniformQuadBroadcast 35 128 34
+             130:    126(ptr) AccessChain 27(data) 125 60 30
+                              Store 130 129
+             131:      6(int) Load 8(invocation)
+             134:    133(ptr) AccessChain 27(data) 39 60
+             135: 23(f64vec4) Load 134
+             136:132(f64vec2) VectorShuffle 135 135 0 1
+             137:132(f64vec2) GroupNonUniformQuadBroadcast 35 136 34
+             138:    133(ptr) AccessChain 27(data) 131 60
+             139: 23(f64vec4) Load 138
+             140: 23(f64vec4) VectorShuffle 139 137 4 5 2 3
+                              Store 138 140
+             141:      6(int) Load 8(invocation)
+             143:    133(ptr) AccessChain 27(data) 50 60
+             144: 23(f64vec4) Load 143
+             145:142(f64vec3) VectorShuffle 144 144 0 1 2
+             146:142(f64vec3) GroupNonUniformQuadBroadcast 35 145 34
+             147:    133(ptr) AccessChain 27(data) 141 60
+             148: 23(f64vec4) Load 147
+             149: 23(f64vec4) VectorShuffle 148 146 4 5 6 3
+                              Store 147 149
+             150:      6(int) Load 8(invocation)
+             151:    133(ptr) AccessChain 27(data) 60 60
+             152: 23(f64vec4) Load 151
+             153: 23(f64vec4) GroupNonUniformQuadBroadcast 35 152 34
+             154:    133(ptr) AccessChain 27(data) 150 60
+                              Store 154 153
+             155:      6(int) Load 8(invocation)
+             156:     66(ptr) AccessChain 27(data) 29 39 30
+             157:     19(int) Load 156
+             159:   158(bool) SLessThan 157 29
+             160:   158(bool) GroupNonUniformQuadBroadcast 35 159 34
+             161:     19(int) Select 160 39 29
+             162:     66(ptr) AccessChain 27(data) 155 39 30
+                              Store 162 161
+             163:      6(int) Load 8(invocation)
+             164:     73(ptr) AccessChain 27(data) 39 39
+             165:   20(ivec4) Load 164
+             166:   72(ivec2) VectorShuffle 165 165 0 1
+             169:  168(bvec2) SLessThan 166 167
+             170:  168(bvec2) GroupNonUniformQuadBroadcast 35 169 34
+             172:   72(ivec2) Select 170 171 167
+             173:     73(ptr) AccessChain 27(data) 163 39
+             174:   20(ivec4) Load 173
+             175:   20(ivec4) VectorShuffle 174 172 4 5 2 3
+                              Store 173 175
+             176:      6(int) Load 8(invocation)
+             177:     73(ptr) AccessChain 27(data) 39 39
+             178:   20(ivec4) Load 177
+             179:   82(ivec3) VectorShuffle 178 178 0 1 2
+             182:  181(bvec3) SLessThan 179 180
+             183:  181(bvec3) GroupNonUniformQuadBroadcast 35 182 34
+             185:   82(ivec3) Select 183 184 180
+             186:     73(ptr) AccessChain 27(data) 176 39
+             187:   20(ivec4) Load 186
+             188:   20(ivec4) VectorShuffle 187 185 4 5 6 3
+                              Store 186 188
+             189:      6(int) Load 8(invocation)
+             190:     73(ptr) AccessChain 27(data) 39 39
+             191:   20(ivec4) Load 190
+             194:  193(bvec4) SLessThan 191 192
+             195:  193(bvec4) GroupNonUniformQuadBroadcast 35 194 34
+             197:   20(ivec4) Select 195 196 192
+             198:     73(ptr) AccessChain 27(data) 189 39
+                              Store 198 197
+             199:      6(int) Load 8(invocation)
+             200:     31(ptr) AccessChain 27(data) 29 29 30
+             201:   17(float) Load 200
+             202:   17(float) GroupNonUniformQuadSwap 35 201 30
+             203:     31(ptr) AccessChain 27(data) 199 29 30
+                              Store 203 202
+             204:      6(int) Load 8(invocation)
+             205:     41(ptr) AccessChain 27(data) 39 29
+             206:   18(fvec4) Load 205
+             207:   40(fvec2) VectorShuffle 206 206 0 1
+             208:   40(fvec2) GroupNonUniformQuadSwap 35 207 30
+             209:     41(ptr) AccessChain 27(data) 204 29
+             210:   18(fvec4) Load 209
+             211:   18(fvec4) VectorShuffle 210 208 4 5 2 3
+                              Store 209 211
+             212:      6(int) Load 8(invocation)
+             213:     41(ptr) AccessChain 27(data) 50 29
+             214:   18(fvec4) Load 213
+             215:   51(fvec3) VectorShuffle 214 214 0 1 2
+             216:   51(fvec3) GroupNonUniformQuadSwap 35 215 30
+             217:     41(ptr) AccessChain 27(data) 212 29
+             218:   18(fvec4) Load 217
+             219:   18(fvec4) VectorShuffle 218 216 4 5 6 3
+                              Store 217 219
+             220:      6(int) Load 8(invocation)
+             221:     41(ptr) AccessChain 27(data) 60 29
+             222:   18(fvec4) Load 221
+             223:   18(fvec4) GroupNonUniformQuadSwap 35 222 30
+             224:     41(ptr) AccessChain 27(data) 220 29
+                              Store 224 223
+             225:      6(int) Load 8(invocation)
+             226:     66(ptr) AccessChain 27(data) 29 39 30
+             227:     19(int) Load 226
+             228:     19(int) GroupNonUniformQuadSwap 35 227 30
+             229:     66(ptr) AccessChain 27(data) 225 39 30
+                              Store 229 228
+             230:      6(int) Load 8(invocation)
+             231:     73(ptr) AccessChain 27(data) 39 39
+             232:   20(ivec4) Load 231
+             233:   72(ivec2) VectorShuffle 232 232 0 1
+             234:   72(ivec2) GroupNonUniformQuadSwap 35 233 30
+             235:     73(ptr) AccessChain 27(data) 230 39
+             236:   20(ivec4) Load 235
+             237:   20(ivec4) VectorShuffle 236 234 4 5 2 3
+                              Store 235 237
+             238:      6(int) Load 8(invocation)
+             239:     73(ptr) AccessChain 27(data) 50 39
+             240:   20(ivec4) Load 239
+             241:   82(ivec3) VectorShuffle 240 240 0 1 2
+             242:   82(ivec3) GroupNonUniformQuadSwap 35 241 30
+             243:     73(ptr) AccessChain 27(data) 238 39
+             244:   20(ivec4) Load 243
+             245:   20(ivec4) VectorShuffle 244 242 4 5 6 3
+                              Store 243 245
+             246:      6(int) Load 8(invocation)
+             247:     73(ptr) AccessChain 27(data) 60 39
+             248:   20(ivec4) Load 247
+             249:   20(ivec4) GroupNonUniformQuadSwap 35 248 30
+             250:     73(ptr) AccessChain 27(data) 246 39
+                              Store 250 249
+             251:      6(int) Load 8(invocation)
+             252:     96(ptr) AccessChain 27(data) 29 50 30
+             253:      6(int) Load 252
+             254:      6(int) GroupNonUniformQuadSwap 35 253 30
+             255:     96(ptr) AccessChain 27(data) 251 50 30
+                              Store 255 254
+             256:      6(int) Load 8(invocation)
+             257:    103(ptr) AccessChain 27(data) 39 50
+             258:   21(ivec4) Load 257
+             259:  102(ivec2) VectorShuffle 258 258 0 1
+             260:  102(ivec2) GroupNonUniformQuadSwap 35 259 30
+             261:    103(ptr) AccessChain 27(data) 256 50
+             262:   21(ivec4) Load 261
+             263:   21(ivec4) VectorShuffle 262 260 4 5 2 3
+                              Store 261 263
+             264:      6(int) Load 8(invocation)
+             265:    103(ptr) AccessChain 27(data) 50 50
+             266:   21(ivec4) Load 265
+             267:  112(ivec3) VectorShuffle 266 266 0 1 2
+             268:  112(ivec3) GroupNonUniformQuadSwap 35 267 30
+             269:    103(ptr) AccessChain 27(data) 264 50
+             270:   21(ivec4) Load 269
+             271:   21(ivec4) VectorShuffle 270 268 4 5 6 3
+                              Store 269 271
+             272:      6(int) Load 8(invocation)
+             273:    103(ptr) AccessChain 27(data) 60 50
+             274:   21(ivec4) Load 273
+             275:   21(ivec4) GroupNonUniformQuadSwap 35 274 30
+             276:    103(ptr) AccessChain 27(data) 272 50
+                              Store 276 275
+             277:      6(int) Load 8(invocation)
+             278:    126(ptr) AccessChain 27(data) 29 60 30
+             279:22(float64_t) Load 278
+             280:22(float64_t) GroupNonUniformQuadSwap 35 279 30
+             281:    126(ptr) AccessChain 27(data) 277 60 30
+                              Store 281 280
+             282:      6(int) Load 8(invocation)
+             283:    133(ptr) AccessChain 27(data) 39 60
+             284: 23(f64vec4) Load 283
+             285:132(f64vec2) VectorShuffle 284 284 0 1
+             286:132(f64vec2) GroupNonUniformQuadSwap 35 285 30
+             287:    133(ptr) AccessChain 27(data) 282 60
+             288: 23(f64vec4) Load 287
+             289: 23(f64vec4) VectorShuffle 288 286 4 5 2 3
+                              Store 287 289
+             290:      6(int) Load 8(invocation)
+             291:    133(ptr) AccessChain 27(data) 50 60
+             292: 23(f64vec4) Load 291
+             293:142(f64vec3) VectorShuffle 292 292 0 1 2
+             294:142(f64vec3) GroupNonUniformQuadSwap 35 293 30
+             295:    133(ptr) AccessChain 27(data) 290 60
+             296: 23(f64vec4) Load 295
+             297: 23(f64vec4) VectorShuffle 296 294 4 5 6 3
+                              Store 295 297
+             298:      6(int) Load 8(invocation)
+             299:    133(ptr) AccessChain 27(data) 60 60
+             300: 23(f64vec4) Load 299
+             301: 23(f64vec4) GroupNonUniformQuadSwap 35 300 30
+             302:    133(ptr) AccessChain 27(data) 298 60
+                              Store 302 301
+             303:      6(int) Load 8(invocation)
+             304:     66(ptr) AccessChain 27(data) 29 39 30
+             305:     19(int) Load 304
+             306:   158(bool) SLessThan 305 29
+             307:   158(bool) GroupNonUniformQuadSwap 35 306 30
+             308:     19(int) Select 307 39 29
+             309:     66(ptr) AccessChain 27(data) 303 39 30
+                              Store 309 308
+             310:      6(int) Load 8(invocation)
+             311:     73(ptr) AccessChain 27(data) 39 39
+             312:   20(ivec4) Load 311
+             313:   72(ivec2) VectorShuffle 312 312 0 1
+             314:  168(bvec2) SLessThan 313 167
+             315:  168(bvec2) GroupNonUniformQuadSwap 35 314 30
+             316:   72(ivec2) Select 315 171 167
+             317:     73(ptr) AccessChain 27(data) 310 39
+             318:   20(ivec4) Load 317
+             319:   20(ivec4) VectorShuffle 318 316 4 5 2 3
+                              Store 317 319
+             320:      6(int) Load 8(invocation)
+             321:     73(ptr) AccessChain 27(data) 39 39
+             322:   20(ivec4) Load 321
+             323:   82(ivec3) VectorShuffle 322 322 0 1 2
+             324:  181(bvec3) SLessThan 323 180
+             325:  181(bvec3) GroupNonUniformQuadSwap 35 324 30
+             326:   82(ivec3) Select 325 184 180
+             327:     73(ptr) AccessChain 27(data) 320 39
+             328:   20(ivec4) Load 327
+             329:   20(ivec4) VectorShuffle 328 326 4 5 6 3
+                              Store 327 329
+             330:      6(int) Load 8(invocation)
+             331:     73(ptr) AccessChain 27(data) 39 39
+             332:   20(ivec4) Load 331
+             333:  193(bvec4) SLessThan 332 192
+             334:  193(bvec4) GroupNonUniformQuadSwap 35 333 30
+             335:   20(ivec4) Select 334 196 192
+             336:     73(ptr) AccessChain 27(data) 330 39
+                              Store 336 335
+             337:      6(int) Load 8(invocation)
+             338:     31(ptr) AccessChain 27(data) 29 29 30
+             339:   17(float) Load 338
+             340:   17(float) GroupNonUniformQuadSwap 35 339 34
+             341:     31(ptr) AccessChain 27(data) 337 29 30
+                              Store 341 340
+             342:      6(int) Load 8(invocation)
+             343:     41(ptr) AccessChain 27(data) 39 29
+             344:   18(fvec4) Load 343
+             345:   40(fvec2) VectorShuffle 344 344 0 1
+             346:   40(fvec2) GroupNonUniformQuadSwap 35 345 34
+             347:     41(ptr) AccessChain 27(data) 342 29
+             348:   18(fvec4) Load 347
+             349:   18(fvec4) VectorShuffle 348 346 4 5 2 3
+                              Store 347 349
+             350:      6(int) Load 8(invocation)
+             351:     41(ptr) AccessChain 27(data) 50 29
+             352:   18(fvec4) Load 351
+             353:   51(fvec3) VectorShuffle 352 352 0 1 2
+             354:   51(fvec3) GroupNonUniformQuadSwap 35 353 34
+             355:     41(ptr) AccessChain 27(data) 350 29
+             356:   18(fvec4) Load 355
+             357:   18(fvec4) VectorShuffle 356 354 4 5 6 3
+                              Store 355 357
+             358:      6(int) Load 8(invocation)
+             359:     41(ptr) AccessChain 27(data) 60 29
+             360:   18(fvec4) Load 359
+             361:   18(fvec4) GroupNonUniformQuadSwap 35 360 34
+             362:     41(ptr) AccessChain 27(data) 358 29
+                              Store 362 361
+             363:      6(int) Load 8(invocation)
+             364:     66(ptr) AccessChain 27(data) 29 39 30
+             365:     19(int) Load 364
+             366:     19(int) GroupNonUniformQuadSwap 35 365 34
+             367:     66(ptr) AccessChain 27(data) 363 39 30
+                              Store 367 366
+             368:      6(int) Load 8(invocation)
+             369:     73(ptr) AccessChain 27(data) 39 39
+             370:   20(ivec4) Load 369
+             371:   72(ivec2) VectorShuffle 370 370 0 1
+             372:   72(ivec2) GroupNonUniformQuadSwap 35 371 34
+             373:     73(ptr) AccessChain 27(data) 368 39
+             374:   20(ivec4) Load 373
+             375:   20(ivec4) VectorShuffle 374 372 4 5 2 3
+                              Store 373 375
+             376:      6(int) Load 8(invocation)
+             377:     73(ptr) AccessChain 27(data) 50 39
+             378:   20(ivec4) Load 377
+             379:   82(ivec3) VectorShuffle 378 378 0 1 2
+             380:   82(ivec3) GroupNonUniformQuadSwap 35 379 34
+             381:     73(ptr) AccessChain 27(data) 376 39
+             382:   20(ivec4) Load 381
+             383:   20(ivec4) VectorShuffle 382 380 4 5 6 3
+                              Store 381 383
+             384:      6(int) Load 8(invocation)
+             385:     73(ptr) AccessChain 27(data) 60 39
+             386:   20(ivec4) Load 385
+             387:   20(ivec4) GroupNonUniformQuadSwap 35 386 34
+             388:     73(ptr) AccessChain 27(data) 384 39
+                              Store 388 387
+             389:      6(int) Load 8(invocation)
+             390:     96(ptr) AccessChain 27(data) 29 50 30
+             391:      6(int) Load 390
+             392:      6(int) GroupNonUniformQuadSwap 35 391 34
+             393:     96(ptr) AccessChain 27(data) 389 50 30
+                              Store 393 392
+             394:      6(int) Load 8(invocation)
+             395:    103(ptr) AccessChain 27(data) 39 50
+             396:   21(ivec4) Load 395
+             397:  102(ivec2) VectorShuffle 396 396 0 1
+             398:  102(ivec2) GroupNonUniformQuadSwap 35 397 34
+             399:    103(ptr) AccessChain 27(data) 394 50
+             400:   21(ivec4) Load 399
+             401:   21(ivec4) VectorShuffle 400 398 4 5 2 3
+                              Store 399 401
+             402:      6(int) Load 8(invocation)
+             403:    103(ptr) AccessChain 27(data) 50 50
+             404:   21(ivec4) Load 403
+             405:  112(ivec3) VectorShuffle 404 404 0 1 2
+             406:  112(ivec3) GroupNonUniformQuadSwap 35 405 34
+             407:    103(ptr) AccessChain 27(data) 402 50
+             408:   21(ivec4) Load 407
+             409:   21(ivec4) VectorShuffle 408 406 4 5 6 3
+                              Store 407 409
+             410:      6(int) Load 8(invocation)
+             411:    103(ptr) AccessChain 27(data) 60 50
+             412:   21(ivec4) Load 411
+             413:   21(ivec4) GroupNonUniformQuadSwap 35 412 34
+             414:    103(ptr) AccessChain 27(data) 410 50
+                              Store 414 413
+             415:      6(int) Load 8(invocation)
+             416:    126(ptr) AccessChain 27(data) 29 60 30
+             417:22(float64_t) Load 416
+             418:22(float64_t) GroupNonUniformQuadSwap 35 417 34
+             419:    126(ptr) AccessChain 27(data) 415 60 30
+                              Store 419 418
+             420:      6(int) Load 8(invocation)
+             421:    133(ptr) AccessChain 27(data) 39 60
+             422: 23(f64vec4) Load 421
+             423:132(f64vec2) VectorShuffle 422 422 0 1
+             424:132(f64vec2) GroupNonUniformQuadSwap 35 423 34
+             425:    133(ptr) AccessChain 27(data) 420 60
+             426: 23(f64vec4) Load 425
+             427: 23(f64vec4) VectorShuffle 426 424 4 5 2 3
+                              Store 425 427
+             428:      6(int) Load 8(invocation)
+             429:    133(ptr) AccessChain 27(data) 50 60
+             430: 23(f64vec4) Load 429
+             431:142(f64vec3) VectorShuffle 430 430 0 1 2
+             432:142(f64vec3) GroupNonUniformQuadSwap 35 431 34
+             433:    133(ptr) AccessChain 27(data) 428 60
+             434: 23(f64vec4) Load 433
+             435: 23(f64vec4) VectorShuffle 434 432 4 5 6 3
+                              Store 433 435
+             436:      6(int) Load 8(invocation)
+             437:    133(ptr) AccessChain 27(data) 60 60
+             438: 23(f64vec4) Load 437
+             439: 23(f64vec4) GroupNonUniformQuadSwap 35 438 34
+             440:    133(ptr) AccessChain 27(data) 436 60
+                              Store 440 439
+             441:      6(int) Load 8(invocation)
+             442:     66(ptr) AccessChain 27(data) 29 39 30
+             443:     19(int) Load 442
+             444:   158(bool) SLessThan 443 29
+             445:   158(bool) GroupNonUniformQuadSwap 35 444 34
+             446:     19(int) Select 445 39 29
+             447:     66(ptr) AccessChain 27(data) 441 39 30
+                              Store 447 446
+             448:      6(int) Load 8(invocation)
+             449:     73(ptr) AccessChain 27(data) 39 39
+             450:   20(ivec4) Load 449
+             451:   72(ivec2) VectorShuffle 450 450 0 1
+             452:  168(bvec2) SLessThan 451 167
+             453:  168(bvec2) GroupNonUniformQuadSwap 35 452 34
+             454:   72(ivec2) Select 453 171 167
+             455:     73(ptr) AccessChain 27(data) 448 39
+             456:   20(ivec4) Load 455
+             457:   20(ivec4) VectorShuffle 456 454 4 5 2 3
+                              Store 455 457
+             458:      6(int) Load 8(invocation)
+             459:     73(ptr) AccessChain 27(data) 39 39
+             460:   20(ivec4) Load 459
+             461:   82(ivec3) VectorShuffle 460 460 0 1 2
+             462:  181(bvec3) SLessThan 461 180
+             463:  181(bvec3) GroupNonUniformQuadSwap 35 462 34
+             464:   82(ivec3) Select 463 184 180
+             465:     73(ptr) AccessChain 27(data) 458 39
+             466:   20(ivec4) Load 465
+             467:   20(ivec4) VectorShuffle 466 464 4 5 6 3
+                              Store 465 467
+             468:      6(int) Load 8(invocation)
+             469:     73(ptr) AccessChain 27(data) 39 39
+             470:   20(ivec4) Load 469
+             471:  193(bvec4) SLessThan 470 192
+             472:  193(bvec4) GroupNonUniformQuadSwap 35 471 34
+             473:   20(ivec4) Select 472 196 192
+             474:     73(ptr) AccessChain 27(data) 468 39
+                              Store 474 473
+             475:      6(int) Load 8(invocation)
+             476:     31(ptr) AccessChain 27(data) 29 29 30
+             477:   17(float) Load 476
+             479:   17(float) GroupNonUniformQuadSwap 35 477 478
+             480:     31(ptr) AccessChain 27(data) 475 29 30
+                              Store 480 479
+             481:      6(int) Load 8(invocation)
+             482:     41(ptr) AccessChain 27(data) 39 29
+             483:   18(fvec4) Load 482
+             484:   40(fvec2) VectorShuffle 483 483 0 1
+             485:   40(fvec2) GroupNonUniformQuadSwap 35 484 478
+             486:     41(ptr) AccessChain 27(data) 481 29
+             487:   18(fvec4) Load 486
+             488:   18(fvec4) VectorShuffle 487 485 4 5 2 3
+                              Store 486 488
+             489:      6(int) Load 8(invocation)
+             490:     41(ptr) AccessChain 27(data) 50 29
+             491:   18(fvec4) Load 490
+             492:   51(fvec3) VectorShuffle 491 491 0 1 2
+             493:   51(fvec3) GroupNonUniformQuadSwap 35 492 478
+             494:     41(ptr) AccessChain 27(data) 489 29
+             495:   18(fvec4) Load 494
+             496:   18(fvec4) VectorShuffle 495 493 4 5 6 3
+                              Store 494 496
+             497:      6(int) Load 8(invocation)
+             498:     41(ptr) AccessChain 27(data) 60 29
+             499:   18(fvec4) Load 498
+             500:   18(fvec4) GroupNonUniformQuadSwap 35 499 478
+             501:     41(ptr) AccessChain 27(data) 497 29
+                              Store 501 500
+             502:      6(int) Load 8(invocation)
+             503:     66(ptr) AccessChain 27(data) 29 39 30
+             504:     19(int) Load 503
+             505:     19(int) GroupNonUniformQuadSwap 35 504 478
+             506:     66(ptr) AccessChain 27(data) 502 39 30
+                              Store 506 505
+             507:      6(int) Load 8(invocation)
+             508:     73(ptr) AccessChain 27(data) 39 39
+             509:   20(ivec4) Load 508
+             510:   72(ivec2) VectorShuffle 509 509 0 1
+             511:   72(ivec2) GroupNonUniformQuadSwap 35 510 478
+             512:     73(ptr) AccessChain 27(data) 507 39
+             513:   20(ivec4) Load 512
+             514:   20(ivec4) VectorShuffle 513 511 4 5 2 3
+                              Store 512 514
+             515:      6(int) Load 8(invocation)
+             516:     73(ptr) AccessChain 27(data) 50 39
+             517:   20(ivec4) Load 516
+             518:   82(ivec3) VectorShuffle 517 517 0 1 2
+             519:   82(ivec3) GroupNonUniformQuadSwap 35 518 478
+             520:     73(ptr) AccessChain 27(data) 515 39
+             521:   20(ivec4) Load 520
+             522:   20(ivec4) VectorShuffle 521 519 4 5 6 3
+                              Store 520 522
+             523:      6(int) Load 8(invocation)
+             524:     73(ptr) AccessChain 27(data) 60 39
+             525:   20(ivec4) Load 524
+             526:   20(ivec4) GroupNonUniformQuadSwap 35 525 478
+             527:     73(ptr) AccessChain 27(data) 523 39
+                              Store 527 526
+             528:      6(int) Load 8(invocation)
+             529:     96(ptr) AccessChain 27(data) 29 50 30
+             530:      6(int) Load 529
+             531:      6(int) GroupNonUniformQuadSwap 35 530 478
+             532:     96(ptr) AccessChain 27(data) 528 50 30
+                              Store 532 531
+             533:      6(int) Load 8(invocation)
+             534:    103(ptr) AccessChain 27(data) 39 50
+             535:   21(ivec4) Load 534
+             536:  102(ivec2) VectorShuffle 535 535 0 1
+             537:  102(ivec2) GroupNonUniformQuadSwap 35 536 478
+             538:    103(ptr) AccessChain 27(data) 533 50
+             539:   21(ivec4) Load 538
+             540:   21(ivec4) VectorShuffle 539 537 4 5 2 3
+                              Store 538 540
+             541:      6(int) Load 8(invocation)
+             542:    103(ptr) AccessChain 27(data) 50 50
+             543:   21(ivec4) Load 542
+             544:  112(ivec3) VectorShuffle 543 543 0 1 2
+             545:  112(ivec3) GroupNonUniformQuadSwap 35 544 478
+             546:    103(ptr) AccessChain 27(data) 541 50
+             547:   21(ivec4) Load 546
+             548:   21(ivec4) VectorShuffle 547 545 4 5 6 3
+                              Store 546 548
+             549:      6(int) Load 8(invocation)
+             550:    103(ptr) AccessChain 27(data) 60 50
+             551:   21(ivec4) Load 550
+             552:   21(ivec4) GroupNonUniformQuadSwap 35 551 478
+             553:    103(ptr) AccessChain 27(data) 549 50
+                              Store 553 552
+             554:      6(int) Load 8(invocation)
+             555:    126(ptr) AccessChain 27(data) 29 60 30
+             556:22(float64_t) Load 555
+             557:22(float64_t) GroupNonUniformQuadSwap 35 556 478
+             558:    126(ptr) AccessChain 27(data) 554 60 30
+                              Store 558 557
+             559:      6(int) Load 8(invocation)
+             560:    133(ptr) AccessChain 27(data) 39 60
+             561: 23(f64vec4) Load 560
+             562:132(f64vec2) VectorShuffle 561 561 0 1
+             563:132(f64vec2) GroupNonUniformQuadSwap 35 562 478
+             564:    133(ptr) AccessChain 27(data) 559 60
+             565: 23(f64vec4) Load 564
+             566: 23(f64vec4) VectorShuffle 565 563 4 5 2 3
+                              Store 564 566
+             567:      6(int) Load 8(invocation)
+             568:    133(ptr) AccessChain 27(data) 50 60
+             569: 23(f64vec4) Load 568
+             570:142(f64vec3) VectorShuffle 569 569 0 1 2
+             571:142(f64vec3) GroupNonUniformQuadSwap 35 570 478
+             572:    133(ptr) AccessChain 27(data) 567 60
+             573: 23(f64vec4) Load 572
+             574: 23(f64vec4) VectorShuffle 573 571 4 5 6 3
+                              Store 572 574
+             575:      6(int) Load 8(invocation)
+             576:    133(ptr) AccessChain 27(data) 60 60
+             577: 23(f64vec4) Load 576
+             578: 23(f64vec4) GroupNonUniformQuadSwap 35 577 478
+             579:    133(ptr) AccessChain 27(data) 575 60
+                              Store 579 578
+             580:      6(int) Load 8(invocation)
+             581:     66(ptr) AccessChain 27(data) 29 39 30
+             582:     19(int) Load 581
+             583:   158(bool) SLessThan 582 29
+             584:   158(bool) GroupNonUniformQuadSwap 35 583 478
+             585:     19(int) Select 584 39 29
+             586:     66(ptr) AccessChain 27(data) 580 39 30
+                              Store 586 585
+             587:      6(int) Load 8(invocation)
+             588:     73(ptr) AccessChain 27(data) 39 39
+             589:   20(ivec4) Load 588
+             590:   72(ivec2) VectorShuffle 589 589 0 1
+             591:  168(bvec2) SLessThan 590 167
+             592:  168(bvec2) GroupNonUniformQuadSwap 35 591 478
+             593:   72(ivec2) Select 592 171 167
+             594:     73(ptr) AccessChain 27(data) 587 39
+             595:   20(ivec4) Load 594
+             596:   20(ivec4) VectorShuffle 595 593 4 5 2 3
+                              Store 594 596
+             597:      6(int) Load 8(invocation)
+             598:     73(ptr) AccessChain 27(data) 39 39
+             599:   20(ivec4) Load 598
+             600:   82(ivec3) VectorShuffle 599 599 0 1 2
+             601:  181(bvec3) SLessThan 600 180
+             602:  181(bvec3) GroupNonUniformQuadSwap 35 601 478
+             603:   82(ivec3) Select 602 184 180
+             604:     73(ptr) AccessChain 27(data) 597 39
+             605:   20(ivec4) Load 604
+             606:   20(ivec4) VectorShuffle 605 603 4 5 6 3
+                              Store 604 606
+             607:      6(int) Load 8(invocation)
+             608:     73(ptr) AccessChain 27(data) 39 39
+             609:   20(ivec4) Load 608
+             610:  193(bvec4) SLessThan 609 192
+             611:  193(bvec4) GroupNonUniformQuadSwap 35 610 478
+             612:   20(ivec4) Select 611 196 192
+             613:     73(ptr) AccessChain 27(data) 607 39
+                              Store 613 612
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.subgroupShuffle.comp.out b/Test/baseResults/spv.subgroupShuffle.comp.out
new file mode 100644
index 0000000..991c6fa
--- /dev/null
+++ b/Test/baseResults/spv.subgroupShuffle.comp.out
@@ -0,0 +1,462 @@
+spv.subgroupShuffle.comp
+// Module Version 10300
+// Generated by (magic number): 80007
+// Id's are bound by 379
+
+                              Capability Shader
+                              Capability Float64
+                              Capability GroupNonUniform
+                              Capability GroupNonUniformShuffle
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint GLCompute 4  "main" 10 12
+                              ExecutionMode 4 LocalSize 8 8 1
+                              Source GLSL 450
+                              SourceExtension  "GL_KHR_shader_subgroup_basic"
+                              SourceExtension  "GL_KHR_shader_subgroup_shuffle"
+                              Name 4  "main"
+                              Name 8  "invocation"
+                              Name 10  "gl_SubgroupInvocationID"
+                              Name 12  "gl_SubgroupSize"
+                              Name 24  "Buffers"
+                              MemberName 24(Buffers) 0  "f4"
+                              MemberName 24(Buffers) 1  "i4"
+                              MemberName 24(Buffers) 2  "u4"
+                              MemberName 24(Buffers) 3  "d4"
+                              Name 27  "data"
+                              Decorate 10(gl_SubgroupInvocationID) RelaxedPrecision
+                              Decorate 10(gl_SubgroupInvocationID) BuiltIn SubgroupLocalInvocationId
+                              Decorate 11 RelaxedPrecision
+                              Decorate 12(gl_SubgroupSize) RelaxedPrecision
+                              Decorate 12(gl_SubgroupSize) BuiltIn SubgroupSize
+                              Decorate 13 RelaxedPrecision
+                              Decorate 14 RelaxedPrecision
+                              Decorate 16 RelaxedPrecision
+                              MemberDecorate 24(Buffers) 0 Offset 0
+                              MemberDecorate 24(Buffers) 1 Offset 16
+                              MemberDecorate 24(Buffers) 2 Offset 32
+                              MemberDecorate 24(Buffers) 3 Offset 64
+                              Decorate 24(Buffers) Block
+                              Decorate 27(data) DescriptorSet 0
+                              Decorate 27(data) Binding 0
+                              Decorate 378 BuiltIn WorkgroupSize
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeInt 32 0
+               7:             TypePointer Function 6(int)
+               9:             TypePointer Input 6(int)
+10(gl_SubgroupInvocationID):      9(ptr) Variable Input
+12(gl_SubgroupSize):      9(ptr) Variable Input
+              15:      6(int) Constant 4
+              17:             TypeFloat 32
+              18:             TypeVector 17(float) 4
+              19:             TypeInt 32 1
+              20:             TypeVector 19(int) 4
+              21:             TypeVector 6(int) 4
+              22:             TypeFloat 64
+              23:             TypeVector 22(float64_t) 4
+     24(Buffers):             TypeStruct 18(fvec4) 20(ivec4) 21(ivec4) 23(f64vec4)
+              25:             TypeArray 24(Buffers) 15
+              26:             TypePointer StorageBuffer 25
+        27(data):     26(ptr) Variable StorageBuffer
+              29:     19(int) Constant 0
+              30:      6(int) Constant 0
+              31:             TypePointer StorageBuffer 17(float)
+              35:      6(int) Constant 3
+              39:     19(int) Constant 1
+              40:             TypeVector 17(float) 2
+              41:             TypePointer StorageBuffer 18(fvec4)
+              51:     19(int) Constant 2
+              52:             TypeVector 17(float) 3
+              62:     19(int) Constant 3
+              69:             TypePointer StorageBuffer 19(int)
+              76:             TypeVector 19(int) 2
+              77:             TypePointer StorageBuffer 20(ivec4)
+              87:             TypeVector 19(int) 3
+             103:             TypePointer StorageBuffer 6(int)
+             110:             TypeVector 6(int) 2
+             111:             TypePointer StorageBuffer 21(ivec4)
+             121:             TypeVector 6(int) 3
+             137:             TypePointer StorageBuffer 22(float64_t)
+             144:             TypeVector 22(float64_t) 2
+             145:             TypePointer StorageBuffer 23(f64vec4)
+             155:             TypeVector 22(float64_t) 3
+             173:             TypeBool
+             183:   76(ivec2) ConstantComposite 29 29
+             184:             TypeVector 173(bool) 2
+             188:   76(ivec2) ConstantComposite 39 39
+             197:   87(ivec3) ConstantComposite 29 29 29
+             198:             TypeVector 173(bool) 3
+             202:   87(ivec3) ConstantComposite 39 39 39
+             210:   20(ivec4) ConstantComposite 29 29 29 29
+             211:             TypeVector 173(bool) 4
+             215:   20(ivec4) ConstantComposite 39 39 39 39
+             376:      6(int) Constant 8
+             377:      6(int) Constant 1
+             378:  121(ivec3) ConstantComposite 376 376 377
+         4(main):           2 Function None 3
+               5:             Label
+   8(invocation):      7(ptr) Variable Function
+              11:      6(int) Load 10(gl_SubgroupInvocationID)
+              13:      6(int) Load 12(gl_SubgroupSize)
+              14:      6(int) IAdd 11 13
+              16:      6(int) UMod 14 15
+                              Store 8(invocation) 16
+              28:      6(int) Load 8(invocation)
+              32:     31(ptr) AccessChain 27(data) 29 29 30
+              33:   17(float) Load 32
+              34:      6(int) Load 8(invocation)
+              36:   17(float) GroupNonUniformShuffle 35 33 34
+              37:     31(ptr) AccessChain 27(data) 28 29 30
+                              Store 37 36
+              38:      6(int) Load 8(invocation)
+              42:     41(ptr) AccessChain 27(data) 39 29
+              43:   18(fvec4) Load 42
+              44:   40(fvec2) VectorShuffle 43 43 0 1
+              45:      6(int) Load 8(invocation)
+              46:   40(fvec2) GroupNonUniformShuffle 35 44 45
+              47:     41(ptr) AccessChain 27(data) 38 29
+              48:   18(fvec4) Load 47
+              49:   18(fvec4) VectorShuffle 48 46 4 5 2 3
+                              Store 47 49
+              50:      6(int) Load 8(invocation)
+              53:     41(ptr) AccessChain 27(data) 51 29
+              54:   18(fvec4) Load 53
+              55:   52(fvec3) VectorShuffle 54 54 0 1 2
+              56:      6(int) Load 8(invocation)
+              57:   52(fvec3) GroupNonUniformShuffle 35 55 56
+              58:     41(ptr) AccessChain 27(data) 50 29
+              59:   18(fvec4) Load 58
+              60:   18(fvec4) VectorShuffle 59 57 4 5 6 3
+                              Store 58 60
+              61:      6(int) Load 8(invocation)
+              63:     41(ptr) AccessChain 27(data) 62 29
+              64:   18(fvec4) Load 63
+              65:      6(int) Load 8(invocation)
+              66:   18(fvec4) GroupNonUniformShuffle 35 64 65
+              67:     41(ptr) AccessChain 27(data) 61 29
+                              Store 67 66
+              68:      6(int) Load 8(invocation)
+              70:     69(ptr) AccessChain 27(data) 29 39 30
+              71:     19(int) Load 70
+              72:      6(int) Load 8(invocation)
+              73:     19(int) GroupNonUniformShuffle 35 71 72
+              74:     69(ptr) AccessChain 27(data) 68 39 30
+                              Store 74 73
+              75:      6(int) Load 8(invocation)
+              78:     77(ptr) AccessChain 27(data) 39 39
+              79:   20(ivec4) Load 78
+              80:   76(ivec2) VectorShuffle 79 79 0 1
+              81:      6(int) Load 8(invocation)
+              82:   76(ivec2) GroupNonUniformShuffle 35 80 81
+              83:     77(ptr) AccessChain 27(data) 75 39
+              84:   20(ivec4) Load 83
+              85:   20(ivec4) VectorShuffle 84 82 4 5 2 3
+                              Store 83 85
+              86:      6(int) Load 8(invocation)
+              88:     77(ptr) AccessChain 27(data) 51 39
+              89:   20(ivec4) Load 88
+              90:   87(ivec3) VectorShuffle 89 89 0 1 2
+              91:      6(int) Load 8(invocation)
+              92:   87(ivec3) GroupNonUniformShuffle 35 90 91
+              93:     77(ptr) AccessChain 27(data) 86 39
+              94:   20(ivec4) Load 93
+              95:   20(ivec4) VectorShuffle 94 92 4 5 6 3
+                              Store 93 95
+              96:      6(int) Load 8(invocation)
+              97:     77(ptr) AccessChain 27(data) 62 39
+              98:   20(ivec4) Load 97
+              99:      6(int) Load 8(invocation)
+             100:   20(ivec4) GroupNonUniformShuffle 35 98 99
+             101:     77(ptr) AccessChain 27(data) 96 39
+                              Store 101 100
+             102:      6(int) Load 8(invocation)
+             104:    103(ptr) AccessChain 27(data) 29 51 30
+             105:      6(int) Load 104
+             106:      6(int) Load 8(invocation)
+             107:      6(int) GroupNonUniformShuffle 35 105 106
+             108:    103(ptr) AccessChain 27(data) 102 51 30
+                              Store 108 107
+             109:      6(int) Load 8(invocation)
+             112:    111(ptr) AccessChain 27(data) 39 51
+             113:   21(ivec4) Load 112
+             114:  110(ivec2) VectorShuffle 113 113 0 1
+             115:      6(int) Load 8(invocation)
+             116:  110(ivec2) GroupNonUniformShuffle 35 114 115
+             117:    111(ptr) AccessChain 27(data) 109 51
+             118:   21(ivec4) Load 117
+             119:   21(ivec4) VectorShuffle 118 116 4 5 2 3
+                              Store 117 119
+             120:      6(int) Load 8(invocation)
+             122:    111(ptr) AccessChain 27(data) 51 51
+             123:   21(ivec4) Load 122
+             124:  121(ivec3) VectorShuffle 123 123 0 1 2
+             125:      6(int) Load 8(invocation)
+             126:  121(ivec3) GroupNonUniformShuffle 35 124 125
+             127:    111(ptr) AccessChain 27(data) 120 51
+             128:   21(ivec4) Load 127
+             129:   21(ivec4) VectorShuffle 128 126 4 5 6 3
+                              Store 127 129
+             130:      6(int) Load 8(invocation)
+             131:    111(ptr) AccessChain 27(data) 62 51
+             132:   21(ivec4) Load 131
+             133:      6(int) Load 8(invocation)
+             134:   21(ivec4) GroupNonUniformShuffle 35 132 133
+             135:    111(ptr) AccessChain 27(data) 130 51
+                              Store 135 134
+             136:      6(int) Load 8(invocation)
+             138:    137(ptr) AccessChain 27(data) 29 62 30
+             139:22(float64_t) Load 138
+             140:      6(int) Load 8(invocation)
+             141:22(float64_t) GroupNonUniformShuffle 35 139 140
+             142:    137(ptr) AccessChain 27(data) 136 62 30
+                              Store 142 141
+             143:      6(int) Load 8(invocation)
+             146:    145(ptr) AccessChain 27(data) 39 62
+             147: 23(f64vec4) Load 146
+             148:144(f64vec2) VectorShuffle 147 147 0 1
+             149:      6(int) Load 8(invocation)
+             150:144(f64vec2) GroupNonUniformShuffle 35 148 149
+             151:    145(ptr) AccessChain 27(data) 143 62
+             152: 23(f64vec4) Load 151
+             153: 23(f64vec4) VectorShuffle 152 150 4 5 2 3
+                              Store 151 153
+             154:      6(int) Load 8(invocation)
+             156:    145(ptr) AccessChain 27(data) 51 62
+             157: 23(f64vec4) Load 156
+             158:155(f64vec3) VectorShuffle 157 157 0 1 2
+             159:      6(int) Load 8(invocation)
+             160:155(f64vec3) GroupNonUniformShuffle 35 158 159
+             161:    145(ptr) AccessChain 27(data) 154 62
+             162: 23(f64vec4) Load 161
+             163: 23(f64vec4) VectorShuffle 162 160 4 5 6 3
+                              Store 161 163
+             164:      6(int) Load 8(invocation)
+             165:    145(ptr) AccessChain 27(data) 62 62
+             166: 23(f64vec4) Load 165
+             167:      6(int) Load 8(invocation)
+             168: 23(f64vec4) GroupNonUniformShuffle 35 166 167
+             169:    145(ptr) AccessChain 27(data) 164 62
+                              Store 169 168
+             170:      6(int) Load 8(invocation)
+             171:     69(ptr) AccessChain 27(data) 29 39 30
+             172:     19(int) Load 171
+             174:   173(bool) SLessThan 172 29
+             175:      6(int) Load 8(invocation)
+             176:   173(bool) GroupNonUniformShuffle 35 174 175
+             177:     19(int) Select 176 39 29
+             178:     69(ptr) AccessChain 27(data) 170 39 30
+                              Store 178 177
+             179:      6(int) Load 8(invocation)
+             180:     77(ptr) AccessChain 27(data) 39 39
+             181:   20(ivec4) Load 180
+             182:   76(ivec2) VectorShuffle 181 181 0 1
+             185:  184(bvec2) SLessThan 182 183
+             186:      6(int) Load 8(invocation)
+             187:  184(bvec2) GroupNonUniformShuffle 35 185 186
+             189:   76(ivec2) Select 187 188 183
+             190:     77(ptr) AccessChain 27(data) 179 39
+             191:   20(ivec4) Load 190
+             192:   20(ivec4) VectorShuffle 191 189 4 5 2 3
+                              Store 190 192
+             193:      6(int) Load 8(invocation)
+             194:     77(ptr) AccessChain 27(data) 39 39
+             195:   20(ivec4) Load 194
+             196:   87(ivec3) VectorShuffle 195 195 0 1 2
+             199:  198(bvec3) SLessThan 196 197
+             200:      6(int) Load 8(invocation)
+             201:  198(bvec3) GroupNonUniformShuffle 35 199 200
+             203:   87(ivec3) Select 201 202 197
+             204:     77(ptr) AccessChain 27(data) 193 39
+             205:   20(ivec4) Load 204
+             206:   20(ivec4) VectorShuffle 205 203 4 5 6 3
+                              Store 204 206
+             207:      6(int) Load 8(invocation)
+             208:     77(ptr) AccessChain 27(data) 39 39
+             209:   20(ivec4) Load 208
+             212:  211(bvec4) SLessThan 209 210
+             213:      6(int) Load 8(invocation)
+             214:  211(bvec4) GroupNonUniformShuffle 35 212 213
+             216:   20(ivec4) Select 214 215 210
+             217:     77(ptr) AccessChain 27(data) 207 39
+                              Store 217 216
+             218:      6(int) Load 8(invocation)
+             219:     31(ptr) AccessChain 27(data) 29 29 30
+             220:   17(float) Load 219
+             221:      6(int) Load 8(invocation)
+             222:   17(float) GroupNonUniformShuffleXor 35 220 221
+             223:     31(ptr) AccessChain 27(data) 218 29 30
+                              Store 223 222
+             224:      6(int) Load 8(invocation)
+             225:     41(ptr) AccessChain 27(data) 39 29
+             226:   18(fvec4) Load 225
+             227:   40(fvec2) VectorShuffle 226 226 0 1
+             228:      6(int) Load 8(invocation)
+             229:   40(fvec2) GroupNonUniformShuffleXor 35 227 228
+             230:     41(ptr) AccessChain 27(data) 224 29
+             231:   18(fvec4) Load 230
+             232:   18(fvec4) VectorShuffle 231 229 4 5 2 3
+                              Store 230 232
+             233:      6(int) Load 8(invocation)
+             234:     41(ptr) AccessChain 27(data) 51 29
+             235:   18(fvec4) Load 234
+             236:   52(fvec3) VectorShuffle 235 235 0 1 2
+             237:      6(int) Load 8(invocation)
+             238:   52(fvec3) GroupNonUniformShuffleXor 35 236 237
+             239:     41(ptr) AccessChain 27(data) 233 29
+             240:   18(fvec4) Load 239
+             241:   18(fvec4) VectorShuffle 240 238 4 5 6 3
+                              Store 239 241
+             242:      6(int) Load 8(invocation)
+             243:     41(ptr) AccessChain 27(data) 62 29
+             244:   18(fvec4) Load 243
+             245:      6(int) Load 8(invocation)
+             246:   18(fvec4) GroupNonUniformShuffleXor 35 244 245
+             247:     41(ptr) AccessChain 27(data) 242 29
+                              Store 247 246
+             248:      6(int) Load 8(invocation)
+             249:     69(ptr) AccessChain 27(data) 29 39 30
+             250:     19(int) Load 249
+             251:      6(int) Load 8(invocation)
+             252:     19(int) GroupNonUniformShuffleXor 35 250 251
+             253:     69(ptr) AccessChain 27(data) 248 39 30
+                              Store 253 252
+             254:      6(int) Load 8(invocation)
+             255:     77(ptr) AccessChain 27(data) 39 39
+             256:   20(ivec4) Load 255
+             257:   76(ivec2) VectorShuffle 256 256 0 1
+             258:      6(int) Load 8(invocation)
+             259:   76(ivec2) GroupNonUniformShuffleXor 35 257 258
+             260:     77(ptr) AccessChain 27(data) 254 39
+             261:   20(ivec4) Load 260
+             262:   20(ivec4) VectorShuffle 261 259 4 5 2 3
+                              Store 260 262
+             263:      6(int) Load 8(invocation)
+             264:     77(ptr) AccessChain 27(data) 51 39
+             265:   20(ivec4) Load 264
+             266:   87(ivec3) VectorShuffle 265 265 0 1 2
+             267:      6(int) Load 8(invocation)
+             268:   87(ivec3) GroupNonUniformShuffleXor 35 266 267
+             269:     77(ptr) AccessChain 27(data) 263 39
+             270:   20(ivec4) Load 269
+             271:   20(ivec4) VectorShuffle 270 268 4 5 6 3
+                              Store 269 271
+             272:      6(int) Load 8(invocation)
+             273:     77(ptr) AccessChain 27(data) 62 39
+             274:   20(ivec4) Load 273
+             275:      6(int) Load 8(invocation)
+             276:   20(ivec4) GroupNonUniformShuffleXor 35 274 275
+             277:     77(ptr) AccessChain 27(data) 272 39
+                              Store 277 276
+             278:      6(int) Load 8(invocation)
+             279:    103(ptr) AccessChain 27(data) 29 51 30
+             280:      6(int) Load 279
+             281:      6(int) Load 8(invocation)
+             282:      6(int) GroupNonUniformShuffleXor 35 280 281
+             283:    103(ptr) AccessChain 27(data) 278 51 30
+                              Store 283 282
+             284:      6(int) Load 8(invocation)
+             285:    111(ptr) AccessChain 27(data) 39 51
+             286:   21(ivec4) Load 285
+             287:  110(ivec2) VectorShuffle 286 286 0 1
+             288:      6(int) Load 8(invocation)
+             289:  110(ivec2) GroupNonUniformShuffleXor 35 287 288
+             290:    111(ptr) AccessChain 27(data) 284 51
+             291:   21(ivec4) Load 290
+             292:   21(ivec4) VectorShuffle 291 289 4 5 2 3
+                              Store 290 292
+             293:      6(int) Load 8(invocation)
+             294:    111(ptr) AccessChain 27(data) 51 51
+             295:   21(ivec4) Load 294
+             296:  121(ivec3) VectorShuffle 295 295 0 1 2
+             297:      6(int) Load 8(invocation)
+             298:  121(ivec3) GroupNonUniformShuffleXor 35 296 297
+             299:    111(ptr) AccessChain 27(data) 293 51
+             300:   21(ivec4) Load 299
+             301:   21(ivec4) VectorShuffle 300 298 4 5 6 3
+                              Store 299 301
+             302:      6(int) Load 8(invocation)
+             303:    111(ptr) AccessChain 27(data) 62 51
+             304:   21(ivec4) Load 303
+             305:      6(int) Load 8(invocation)
+             306:   21(ivec4) GroupNonUniformShuffleXor 35 304 305
+             307:    111(ptr) AccessChain 27(data) 302 51
+                              Store 307 306
+             308:      6(int) Load 8(invocation)
+             309:    137(ptr) AccessChain 27(data) 29 62 30
+             310:22(float64_t) Load 309
+             311:      6(int) Load 8(invocation)
+             312:22(float64_t) GroupNonUniformShuffleXor 35 310 311
+             313:    137(ptr) AccessChain 27(data) 308 62 30
+                              Store 313 312
+             314:      6(int) Load 8(invocation)
+             315:    145(ptr) AccessChain 27(data) 39 62
+             316: 23(f64vec4) Load 315
+             317:144(f64vec2) VectorShuffle 316 316 0 1
+             318:      6(int) Load 8(invocation)
+             319:144(f64vec2) GroupNonUniformShuffleXor 35 317 318
+             320:    145(ptr) AccessChain 27(data) 314 62
+             321: 23(f64vec4) Load 320
+             322: 23(f64vec4) VectorShuffle 321 319 4 5 2 3
+                              Store 320 322
+             323:      6(int) Load 8(invocation)
+             324:    145(ptr) AccessChain 27(data) 51 62
+             325: 23(f64vec4) Load 324
+             326:155(f64vec3) VectorShuffle 325 325 0 1 2
+             327:      6(int) Load 8(invocation)
+             328:155(f64vec3) GroupNonUniformShuffleXor 35 326 327
+             329:    145(ptr) AccessChain 27(data) 323 62
+             330: 23(f64vec4) Load 329
+             331: 23(f64vec4) VectorShuffle 330 328 4 5 6 3
+                              Store 329 331
+             332:      6(int) Load 8(invocation)
+             333:    145(ptr) AccessChain 27(data) 62 62
+             334: 23(f64vec4) Load 333
+             335:      6(int) Load 8(invocation)
+             336: 23(f64vec4) GroupNonUniformShuffleXor 35 334 335
+             337:    145(ptr) AccessChain 27(data) 332 62
+                              Store 337 336
+             338:      6(int) Load 8(invocation)
+             339:     69(ptr) AccessChain 27(data) 29 39 30
+             340:     19(int) Load 339
+             341:   173(bool) SLessThan 340 29
+             342:      6(int) Load 8(invocation)
+             343:   173(bool) GroupNonUniformShuffleXor 35 341 342
+             344:     19(int) Select 343 39 29
+             345:     69(ptr) AccessChain 27(data) 338 39 30
+                              Store 345 344
+             346:      6(int) Load 8(invocation)
+             347:     77(ptr) AccessChain 27(data) 39 39
+             348:   20(ivec4) Load 347
+             349:   76(ivec2) VectorShuffle 348 348 0 1
+             350:  184(bvec2) SLessThan 349 183
+             351:      6(int) Load 8(invocation)
+             352:  184(bvec2) GroupNonUniformShuffleXor 35 350 351
+             353:   76(ivec2) Select 352 188 183
+             354:     77(ptr) AccessChain 27(data) 346 39
+             355:   20(ivec4) Load 354
+             356:   20(ivec4) VectorShuffle 355 353 4 5 2 3
+                              Store 354 356
+             357:      6(int) Load 8(invocation)
+             358:     77(ptr) AccessChain 27(data) 39 39
+             359:   20(ivec4) Load 358
+             360:   87(ivec3) VectorShuffle 359 359 0 1 2
+             361:  198(bvec3) SLessThan 360 197
+             362:      6(int) Load 8(invocation)
+             363:  198(bvec3) GroupNonUniformShuffleXor 35 361 362
+             364:   87(ivec3) Select 363 202 197
+             365:     77(ptr) AccessChain 27(data) 357 39
+             366:   20(ivec4) Load 365
+             367:   20(ivec4) VectorShuffle 366 364 4 5 6 3
+                              Store 365 367
+             368:      6(int) Load 8(invocation)
+             369:     77(ptr) AccessChain 27(data) 39 39
+             370:   20(ivec4) Load 369
+             371:  211(bvec4) SLessThan 370 210
+             372:      6(int) Load 8(invocation)
+             373:  211(bvec4) GroupNonUniformShuffleXor 35 371 372
+             374:   20(ivec4) Select 373 215 210
+             375:     77(ptr) AccessChain 27(data) 368 39
+                              Store 375 374
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.subgroupShuffleRelative.comp.out b/Test/baseResults/spv.subgroupShuffleRelative.comp.out
new file mode 100644
index 0000000..3aad760
--- /dev/null
+++ b/Test/baseResults/spv.subgroupShuffleRelative.comp.out
@@ -0,0 +1,462 @@
+spv.subgroupShuffleRelative.comp
+// Module Version 10300
+// Generated by (magic number): 80007
+// Id's are bound by 379
+
+                              Capability Shader
+                              Capability Float64
+                              Capability GroupNonUniform
+                              Capability GroupNonUniformShuffleRelative
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint GLCompute 4  "main" 10 12
+                              ExecutionMode 4 LocalSize 8 8 1
+                              Source GLSL 450
+                              SourceExtension  "GL_KHR_shader_subgroup_basic"
+                              SourceExtension  "GL_KHR_shader_subgroup_shuffle_relative"
+                              Name 4  "main"
+                              Name 8  "invocation"
+                              Name 10  "gl_SubgroupInvocationID"
+                              Name 12  "gl_SubgroupSize"
+                              Name 24  "Buffers"
+                              MemberName 24(Buffers) 0  "f4"
+                              MemberName 24(Buffers) 1  "i4"
+                              MemberName 24(Buffers) 2  "u4"
+                              MemberName 24(Buffers) 3  "d4"
+                              Name 27  "data"
+                              Decorate 10(gl_SubgroupInvocationID) RelaxedPrecision
+                              Decorate 10(gl_SubgroupInvocationID) BuiltIn SubgroupLocalInvocationId
+                              Decorate 11 RelaxedPrecision
+                              Decorate 12(gl_SubgroupSize) RelaxedPrecision
+                              Decorate 12(gl_SubgroupSize) BuiltIn SubgroupSize
+                              Decorate 13 RelaxedPrecision
+                              Decorate 14 RelaxedPrecision
+                              Decorate 16 RelaxedPrecision
+                              MemberDecorate 24(Buffers) 0 Offset 0
+                              MemberDecorate 24(Buffers) 1 Offset 16
+                              MemberDecorate 24(Buffers) 2 Offset 32
+                              MemberDecorate 24(Buffers) 3 Offset 64
+                              Decorate 24(Buffers) Block
+                              Decorate 27(data) DescriptorSet 0
+                              Decorate 27(data) Binding 0
+                              Decorate 378 BuiltIn WorkgroupSize
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeInt 32 0
+               7:             TypePointer Function 6(int)
+               9:             TypePointer Input 6(int)
+10(gl_SubgroupInvocationID):      9(ptr) Variable Input
+12(gl_SubgroupSize):      9(ptr) Variable Input
+              15:      6(int) Constant 4
+              17:             TypeFloat 32
+              18:             TypeVector 17(float) 4
+              19:             TypeInt 32 1
+              20:             TypeVector 19(int) 4
+              21:             TypeVector 6(int) 4
+              22:             TypeFloat 64
+              23:             TypeVector 22(float64_t) 4
+     24(Buffers):             TypeStruct 18(fvec4) 20(ivec4) 21(ivec4) 23(f64vec4)
+              25:             TypeArray 24(Buffers) 15
+              26:             TypePointer StorageBuffer 25
+        27(data):     26(ptr) Variable StorageBuffer
+              29:     19(int) Constant 0
+              30:      6(int) Constant 0
+              31:             TypePointer StorageBuffer 17(float)
+              35:      6(int) Constant 3
+              39:     19(int) Constant 1
+              40:             TypeVector 17(float) 2
+              41:             TypePointer StorageBuffer 18(fvec4)
+              51:     19(int) Constant 2
+              52:             TypeVector 17(float) 3
+              62:     19(int) Constant 3
+              69:             TypePointer StorageBuffer 19(int)
+              76:             TypeVector 19(int) 2
+              77:             TypePointer StorageBuffer 20(ivec4)
+              87:             TypeVector 19(int) 3
+             103:             TypePointer StorageBuffer 6(int)
+             110:             TypeVector 6(int) 2
+             111:             TypePointer StorageBuffer 21(ivec4)
+             121:             TypeVector 6(int) 3
+             137:             TypePointer StorageBuffer 22(float64_t)
+             144:             TypeVector 22(float64_t) 2
+             145:             TypePointer StorageBuffer 23(f64vec4)
+             155:             TypeVector 22(float64_t) 3
+             173:             TypeBool
+             183:   76(ivec2) ConstantComposite 29 29
+             184:             TypeVector 173(bool) 2
+             188:   76(ivec2) ConstantComposite 39 39
+             197:   87(ivec3) ConstantComposite 29 29 29
+             198:             TypeVector 173(bool) 3
+             202:   87(ivec3) ConstantComposite 39 39 39
+             210:   20(ivec4) ConstantComposite 29 29 29 29
+             211:             TypeVector 173(bool) 4
+             215:   20(ivec4) ConstantComposite 39 39 39 39
+             376:      6(int) Constant 8
+             377:      6(int) Constant 1
+             378:  121(ivec3) ConstantComposite 376 376 377
+         4(main):           2 Function None 3
+               5:             Label
+   8(invocation):      7(ptr) Variable Function
+              11:      6(int) Load 10(gl_SubgroupInvocationID)
+              13:      6(int) Load 12(gl_SubgroupSize)
+              14:      6(int) IAdd 11 13
+              16:      6(int) UMod 14 15
+                              Store 8(invocation) 16
+              28:      6(int) Load 8(invocation)
+              32:     31(ptr) AccessChain 27(data) 29 29 30
+              33:   17(float) Load 32
+              34:      6(int) Load 8(invocation)
+              36:   17(float) GroupNonUniformShuffleUp 35 33 34
+              37:     31(ptr) AccessChain 27(data) 28 29 30
+                              Store 37 36
+              38:      6(int) Load 8(invocation)
+              42:     41(ptr) AccessChain 27(data) 39 29
+              43:   18(fvec4) Load 42
+              44:   40(fvec2) VectorShuffle 43 43 0 1
+              45:      6(int) Load 8(invocation)
+              46:   40(fvec2) GroupNonUniformShuffleUp 35 44 45
+              47:     41(ptr) AccessChain 27(data) 38 29
+              48:   18(fvec4) Load 47
+              49:   18(fvec4) VectorShuffle 48 46 4 5 2 3
+                              Store 47 49
+              50:      6(int) Load 8(invocation)
+              53:     41(ptr) AccessChain 27(data) 51 29
+              54:   18(fvec4) Load 53
+              55:   52(fvec3) VectorShuffle 54 54 0 1 2
+              56:      6(int) Load 8(invocation)
+              57:   52(fvec3) GroupNonUniformShuffleUp 35 55 56
+              58:     41(ptr) AccessChain 27(data) 50 29
+              59:   18(fvec4) Load 58
+              60:   18(fvec4) VectorShuffle 59 57 4 5 6 3
+                              Store 58 60
+              61:      6(int) Load 8(invocation)
+              63:     41(ptr) AccessChain 27(data) 62 29
+              64:   18(fvec4) Load 63
+              65:      6(int) Load 8(invocation)
+              66:   18(fvec4) GroupNonUniformShuffleUp 35 64 65
+              67:     41(ptr) AccessChain 27(data) 61 29
+                              Store 67 66
+              68:      6(int) Load 8(invocation)
+              70:     69(ptr) AccessChain 27(data) 29 39 30
+              71:     19(int) Load 70
+              72:      6(int) Load 8(invocation)
+              73:     19(int) GroupNonUniformShuffleUp 35 71 72
+              74:     69(ptr) AccessChain 27(data) 68 39 30
+                              Store 74 73
+              75:      6(int) Load 8(invocation)
+              78:     77(ptr) AccessChain 27(data) 39 39
+              79:   20(ivec4) Load 78
+              80:   76(ivec2) VectorShuffle 79 79 0 1
+              81:      6(int) Load 8(invocation)
+              82:   76(ivec2) GroupNonUniformShuffleUp 35 80 81
+              83:     77(ptr) AccessChain 27(data) 75 39
+              84:   20(ivec4) Load 83
+              85:   20(ivec4) VectorShuffle 84 82 4 5 2 3
+                              Store 83 85
+              86:      6(int) Load 8(invocation)
+              88:     77(ptr) AccessChain 27(data) 51 39
+              89:   20(ivec4) Load 88
+              90:   87(ivec3) VectorShuffle 89 89 0 1 2
+              91:      6(int) Load 8(invocation)
+              92:   87(ivec3) GroupNonUniformShuffleUp 35 90 91
+              93:     77(ptr) AccessChain 27(data) 86 39
+              94:   20(ivec4) Load 93
+              95:   20(ivec4) VectorShuffle 94 92 4 5 6 3
+                              Store 93 95
+              96:      6(int) Load 8(invocation)
+              97:     77(ptr) AccessChain 27(data) 62 39
+              98:   20(ivec4) Load 97
+              99:      6(int) Load 8(invocation)
+             100:   20(ivec4) GroupNonUniformShuffleUp 35 98 99
+             101:     77(ptr) AccessChain 27(data) 96 39
+                              Store 101 100
+             102:      6(int) Load 8(invocation)
+             104:    103(ptr) AccessChain 27(data) 29 51 30
+             105:      6(int) Load 104
+             106:      6(int) Load 8(invocation)
+             107:      6(int) GroupNonUniformShuffleUp 35 105 106
+             108:    103(ptr) AccessChain 27(data) 102 51 30
+                              Store 108 107
+             109:      6(int) Load 8(invocation)
+             112:    111(ptr) AccessChain 27(data) 39 51
+             113:   21(ivec4) Load 112
+             114:  110(ivec2) VectorShuffle 113 113 0 1
+             115:      6(int) Load 8(invocation)
+             116:  110(ivec2) GroupNonUniformShuffleUp 35 114 115
+             117:    111(ptr) AccessChain 27(data) 109 51
+             118:   21(ivec4) Load 117
+             119:   21(ivec4) VectorShuffle 118 116 4 5 2 3
+                              Store 117 119
+             120:      6(int) Load 8(invocation)
+             122:    111(ptr) AccessChain 27(data) 51 51
+             123:   21(ivec4) Load 122
+             124:  121(ivec3) VectorShuffle 123 123 0 1 2
+             125:      6(int) Load 8(invocation)
+             126:  121(ivec3) GroupNonUniformShuffleUp 35 124 125
+             127:    111(ptr) AccessChain 27(data) 120 51
+             128:   21(ivec4) Load 127
+             129:   21(ivec4) VectorShuffle 128 126 4 5 6 3
+                              Store 127 129
+             130:      6(int) Load 8(invocation)
+             131:    111(ptr) AccessChain 27(data) 62 51
+             132:   21(ivec4) Load 131
+             133:      6(int) Load 8(invocation)
+             134:   21(ivec4) GroupNonUniformShuffleUp 35 132 133
+             135:    111(ptr) AccessChain 27(data) 130 51
+                              Store 135 134
+             136:      6(int) Load 8(invocation)
+             138:    137(ptr) AccessChain 27(data) 29 62 30
+             139:22(float64_t) Load 138
+             140:      6(int) Load 8(invocation)
+             141:22(float64_t) GroupNonUniformShuffleUp 35 139 140
+             142:    137(ptr) AccessChain 27(data) 136 62 30
+                              Store 142 141
+             143:      6(int) Load 8(invocation)
+             146:    145(ptr) AccessChain 27(data) 39 62
+             147: 23(f64vec4) Load 146
+             148:144(f64vec2) VectorShuffle 147 147 0 1
+             149:      6(int) Load 8(invocation)
+             150:144(f64vec2) GroupNonUniformShuffleUp 35 148 149
+             151:    145(ptr) AccessChain 27(data) 143 62
+             152: 23(f64vec4) Load 151
+             153: 23(f64vec4) VectorShuffle 152 150 4 5 2 3
+                              Store 151 153
+             154:      6(int) Load 8(invocation)
+             156:    145(ptr) AccessChain 27(data) 51 62
+             157: 23(f64vec4) Load 156
+             158:155(f64vec3) VectorShuffle 157 157 0 1 2
+             159:      6(int) Load 8(invocation)
+             160:155(f64vec3) GroupNonUniformShuffleUp 35 158 159
+             161:    145(ptr) AccessChain 27(data) 154 62
+             162: 23(f64vec4) Load 161
+             163: 23(f64vec4) VectorShuffle 162 160 4 5 6 3
+                              Store 161 163
+             164:      6(int) Load 8(invocation)
+             165:    145(ptr) AccessChain 27(data) 62 62
+             166: 23(f64vec4) Load 165
+             167:      6(int) Load 8(invocation)
+             168: 23(f64vec4) GroupNonUniformShuffleUp 35 166 167
+             169:    145(ptr) AccessChain 27(data) 164 62
+                              Store 169 168
+             170:      6(int) Load 8(invocation)
+             171:     69(ptr) AccessChain 27(data) 29 39 30
+             172:     19(int) Load 171
+             174:   173(bool) SLessThan 172 29
+             175:      6(int) Load 8(invocation)
+             176:   173(bool) GroupNonUniformShuffleUp 35 174 175
+             177:     19(int) Select 176 39 29
+             178:     69(ptr) AccessChain 27(data) 170 39 30
+                              Store 178 177
+             179:      6(int) Load 8(invocation)
+             180:     77(ptr) AccessChain 27(data) 39 39
+             181:   20(ivec4) Load 180
+             182:   76(ivec2) VectorShuffle 181 181 0 1
+             185:  184(bvec2) SLessThan 182 183
+             186:      6(int) Load 8(invocation)
+             187:  184(bvec2) GroupNonUniformShuffleUp 35 185 186
+             189:   76(ivec2) Select 187 188 183
+             190:     77(ptr) AccessChain 27(data) 179 39
+             191:   20(ivec4) Load 190
+             192:   20(ivec4) VectorShuffle 191 189 4 5 2 3
+                              Store 190 192
+             193:      6(int) Load 8(invocation)
+             194:     77(ptr) AccessChain 27(data) 39 39
+             195:   20(ivec4) Load 194
+             196:   87(ivec3) VectorShuffle 195 195 0 1 2
+             199:  198(bvec3) SLessThan 196 197
+             200:      6(int) Load 8(invocation)
+             201:  198(bvec3) GroupNonUniformShuffleUp 35 199 200
+             203:   87(ivec3) Select 201 202 197
+             204:     77(ptr) AccessChain 27(data) 193 39
+             205:   20(ivec4) Load 204
+             206:   20(ivec4) VectorShuffle 205 203 4 5 6 3
+                              Store 204 206
+             207:      6(int) Load 8(invocation)
+             208:     77(ptr) AccessChain 27(data) 39 39
+             209:   20(ivec4) Load 208
+             212:  211(bvec4) SLessThan 209 210
+             213:      6(int) Load 8(invocation)
+             214:  211(bvec4) GroupNonUniformShuffleUp 35 212 213
+             216:   20(ivec4) Select 214 215 210
+             217:     77(ptr) AccessChain 27(data) 207 39
+                              Store 217 216
+             218:      6(int) Load 8(invocation)
+             219:     31(ptr) AccessChain 27(data) 29 29 30
+             220:   17(float) Load 219
+             221:      6(int) Load 8(invocation)
+             222:   17(float) GroupNonUniformShuffleDown 35 220 221
+             223:     31(ptr) AccessChain 27(data) 218 29 30
+                              Store 223 222
+             224:      6(int) Load 8(invocation)
+             225:     41(ptr) AccessChain 27(data) 39 29
+             226:   18(fvec4) Load 225
+             227:   40(fvec2) VectorShuffle 226 226 0 1
+             228:      6(int) Load 8(invocation)
+             229:   40(fvec2) GroupNonUniformShuffleDown 35 227 228
+             230:     41(ptr) AccessChain 27(data) 224 29
+             231:   18(fvec4) Load 230
+             232:   18(fvec4) VectorShuffle 231 229 4 5 2 3
+                              Store 230 232
+             233:      6(int) Load 8(invocation)
+             234:     41(ptr) AccessChain 27(data) 51 29
+             235:   18(fvec4) Load 234
+             236:   52(fvec3) VectorShuffle 235 235 0 1 2
+             237:      6(int) Load 8(invocation)
+             238:   52(fvec3) GroupNonUniformShuffleDown 35 236 237
+             239:     41(ptr) AccessChain 27(data) 233 29
+             240:   18(fvec4) Load 239
+             241:   18(fvec4) VectorShuffle 240 238 4 5 6 3
+                              Store 239 241
+             242:      6(int) Load 8(invocation)
+             243:     41(ptr) AccessChain 27(data) 62 29
+             244:   18(fvec4) Load 243
+             245:      6(int) Load 8(invocation)
+             246:   18(fvec4) GroupNonUniformShuffleDown 35 244 245
+             247:     41(ptr) AccessChain 27(data) 242 29
+                              Store 247 246
+             248:      6(int) Load 8(invocation)
+             249:     69(ptr) AccessChain 27(data) 29 39 30
+             250:     19(int) Load 249
+             251:      6(int) Load 8(invocation)
+             252:     19(int) GroupNonUniformShuffleDown 35 250 251
+             253:     69(ptr) AccessChain 27(data) 248 39 30
+                              Store 253 252
+             254:      6(int) Load 8(invocation)
+             255:     77(ptr) AccessChain 27(data) 39 39
+             256:   20(ivec4) Load 255
+             257:   76(ivec2) VectorShuffle 256 256 0 1
+             258:      6(int) Load 8(invocation)
+             259:   76(ivec2) GroupNonUniformShuffleDown 35 257 258
+             260:     77(ptr) AccessChain 27(data) 254 39
+             261:   20(ivec4) Load 260
+             262:   20(ivec4) VectorShuffle 261 259 4 5 2 3
+                              Store 260 262
+             263:      6(int) Load 8(invocation)
+             264:     77(ptr) AccessChain 27(data) 51 39
+             265:   20(ivec4) Load 264
+             266:   87(ivec3) VectorShuffle 265 265 0 1 2
+             267:      6(int) Load 8(invocation)
+             268:   87(ivec3) GroupNonUniformShuffleDown 35 266 267
+             269:     77(ptr) AccessChain 27(data) 263 39
+             270:   20(ivec4) Load 269
+             271:   20(ivec4) VectorShuffle 270 268 4 5 6 3
+                              Store 269 271
+             272:      6(int) Load 8(invocation)
+             273:     77(ptr) AccessChain 27(data) 62 39
+             274:   20(ivec4) Load 273
+             275:      6(int) Load 8(invocation)
+             276:   20(ivec4) GroupNonUniformShuffleDown 35 274 275
+             277:     77(ptr) AccessChain 27(data) 272 39
+                              Store 277 276
+             278:      6(int) Load 8(invocation)
+             279:    103(ptr) AccessChain 27(data) 29 51 30
+             280:      6(int) Load 279
+             281:      6(int) Load 8(invocation)
+             282:      6(int) GroupNonUniformShuffleDown 35 280 281
+             283:    103(ptr) AccessChain 27(data) 278 51 30
+                              Store 283 282
+             284:      6(int) Load 8(invocation)
+             285:    111(ptr) AccessChain 27(data) 39 51
+             286:   21(ivec4) Load 285
+             287:  110(ivec2) VectorShuffle 286 286 0 1
+             288:      6(int) Load 8(invocation)
+             289:  110(ivec2) GroupNonUniformShuffleDown 35 287 288
+             290:    111(ptr) AccessChain 27(data) 284 51
+             291:   21(ivec4) Load 290
+             292:   21(ivec4) VectorShuffle 291 289 4 5 2 3
+                              Store 290 292
+             293:      6(int) Load 8(invocation)
+             294:    111(ptr) AccessChain 27(data) 51 51
+             295:   21(ivec4) Load 294
+             296:  121(ivec3) VectorShuffle 295 295 0 1 2
+             297:      6(int) Load 8(invocation)
+             298:  121(ivec3) GroupNonUniformShuffleDown 35 296 297
+             299:    111(ptr) AccessChain 27(data) 293 51
+             300:   21(ivec4) Load 299
+             301:   21(ivec4) VectorShuffle 300 298 4 5 6 3
+                              Store 299 301
+             302:      6(int) Load 8(invocation)
+             303:    111(ptr) AccessChain 27(data) 62 51
+             304:   21(ivec4) Load 303
+             305:      6(int) Load 8(invocation)
+             306:   21(ivec4) GroupNonUniformShuffleDown 35 304 305
+             307:    111(ptr) AccessChain 27(data) 302 51
+                              Store 307 306
+             308:      6(int) Load 8(invocation)
+             309:    137(ptr) AccessChain 27(data) 29 62 30
+             310:22(float64_t) Load 309
+             311:      6(int) Load 8(invocation)
+             312:22(float64_t) GroupNonUniformShuffleDown 35 310 311
+             313:    137(ptr) AccessChain 27(data) 308 62 30
+                              Store 313 312
+             314:      6(int) Load 8(invocation)
+             315:    145(ptr) AccessChain 27(data) 39 62
+             316: 23(f64vec4) Load 315
+             317:144(f64vec2) VectorShuffle 316 316 0 1
+             318:      6(int) Load 8(invocation)
+             319:144(f64vec2) GroupNonUniformShuffleDown 35 317 318
+             320:    145(ptr) AccessChain 27(data) 314 62
+             321: 23(f64vec4) Load 320
+             322: 23(f64vec4) VectorShuffle 321 319 4 5 2 3
+                              Store 320 322
+             323:      6(int) Load 8(invocation)
+             324:    145(ptr) AccessChain 27(data) 51 62
+             325: 23(f64vec4) Load 324
+             326:155(f64vec3) VectorShuffle 325 325 0 1 2
+             327:      6(int) Load 8(invocation)
+             328:155(f64vec3) GroupNonUniformShuffleDown 35 326 327
+             329:    145(ptr) AccessChain 27(data) 323 62
+             330: 23(f64vec4) Load 329
+             331: 23(f64vec4) VectorShuffle 330 328 4 5 6 3
+                              Store 329 331
+             332:      6(int) Load 8(invocation)
+             333:    145(ptr) AccessChain 27(data) 62 62
+             334: 23(f64vec4) Load 333
+             335:      6(int) Load 8(invocation)
+             336: 23(f64vec4) GroupNonUniformShuffleDown 35 334 335
+             337:    145(ptr) AccessChain 27(data) 332 62
+                              Store 337 336
+             338:      6(int) Load 8(invocation)
+             339:     69(ptr) AccessChain 27(data) 29 39 30
+             340:     19(int) Load 339
+             341:   173(bool) SLessThan 340 29
+             342:      6(int) Load 8(invocation)
+             343:   173(bool) GroupNonUniformShuffleDown 35 341 342
+             344:     19(int) Select 343 39 29
+             345:     69(ptr) AccessChain 27(data) 338 39 30
+                              Store 345 344
+             346:      6(int) Load 8(invocation)
+             347:     77(ptr) AccessChain 27(data) 39 39
+             348:   20(ivec4) Load 347
+             349:   76(ivec2) VectorShuffle 348 348 0 1
+             350:  184(bvec2) SLessThan 349 183
+             351:      6(int) Load 8(invocation)
+             352:  184(bvec2) GroupNonUniformShuffleDown 35 350 351
+             353:   76(ivec2) Select 352 188 183
+             354:     77(ptr) AccessChain 27(data) 346 39
+             355:   20(ivec4) Load 354
+             356:   20(ivec4) VectorShuffle 355 353 4 5 2 3
+                              Store 354 356
+             357:      6(int) Load 8(invocation)
+             358:     77(ptr) AccessChain 27(data) 39 39
+             359:   20(ivec4) Load 358
+             360:   87(ivec3) VectorShuffle 359 359 0 1 2
+             361:  198(bvec3) SLessThan 360 197
+             362:      6(int) Load 8(invocation)
+             363:  198(bvec3) GroupNonUniformShuffleDown 35 361 362
+             364:   87(ivec3) Select 363 202 197
+             365:     77(ptr) AccessChain 27(data) 357 39
+             366:   20(ivec4) Load 365
+             367:   20(ivec4) VectorShuffle 366 364 4 5 6 3
+                              Store 365 367
+             368:      6(int) Load 8(invocation)
+             369:     77(ptr) AccessChain 27(data) 39 39
+             370:   20(ivec4) Load 369
+             371:  211(bvec4) SLessThan 370 210
+             372:      6(int) Load 8(invocation)
+             373:  211(bvec4) GroupNonUniformShuffleDown 35 371 372
+             374:   20(ivec4) Select 373 215 210
+             375:     77(ptr) AccessChain 27(data) 368 39
+                              Store 375 374
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.subgroupVote.comp.out b/Test/baseResults/spv.subgroupVote.comp.out
new file mode 100644
index 0000000..4fdbb0b
--- /dev/null
+++ b/Test/baseResults/spv.subgroupVote.comp.out
@@ -0,0 +1,288 @@
+spv.subgroupVote.comp
+// Module Version 10300
+// Generated by (magic number): 80007
+// Id's are bound by 216
+
+                              Capability Shader
+                              Capability Float64
+                              Capability GroupNonUniform
+                              Capability GroupNonUniformVote
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint GLCompute 4  "main" 10 12
+                              ExecutionMode 4 LocalSize 8 8 1
+                              Source GLSL 450
+                              SourceExtension  "GL_KHR_shader_subgroup_basic"
+                              SourceExtension  "GL_KHR_shader_subgroup_vote"
+                              Name 4  "main"
+                              Name 8  "invocation"
+                              Name 10  "gl_SubgroupInvocationID"
+                              Name 12  "gl_SubgroupSize"
+                              Name 24  "Buffers"
+                              MemberName 24(Buffers) 0  "f4"
+                              MemberName 24(Buffers) 1  "i4"
+                              MemberName 24(Buffers) 2  "u4"
+                              MemberName 24(Buffers) 3  "d4"
+                              MemberName 24(Buffers) 4  "r"
+                              Name 27  "data"
+                              Decorate 10(gl_SubgroupInvocationID) RelaxedPrecision
+                              Decorate 10(gl_SubgroupInvocationID) BuiltIn SubgroupLocalInvocationId
+                              Decorate 11 RelaxedPrecision
+                              Decorate 12(gl_SubgroupSize) RelaxedPrecision
+                              Decorate 12(gl_SubgroupSize) BuiltIn SubgroupSize
+                              Decorate 13 RelaxedPrecision
+                              Decorate 14 RelaxedPrecision
+                              Decorate 16 RelaxedPrecision
+                              MemberDecorate 24(Buffers) 0 Offset 0
+                              MemberDecorate 24(Buffers) 1 Offset 16
+                              MemberDecorate 24(Buffers) 2 Offset 32
+                              MemberDecorate 24(Buffers) 3 Offset 64
+                              MemberDecorate 24(Buffers) 4 Offset 96
+                              Decorate 24(Buffers) Block
+                              Decorate 27(data) DescriptorSet 0
+                              Decorate 27(data) Binding 0
+                              Decorate 215 BuiltIn WorkgroupSize
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeInt 32 0
+               7:             TypePointer Function 6(int)
+               9:             TypePointer Input 6(int)
+10(gl_SubgroupInvocationID):      9(ptr) Variable Input
+12(gl_SubgroupSize):      9(ptr) Variable Input
+              15:      6(int) Constant 4
+              17:             TypeFloat 32
+              18:             TypeVector 17(float) 4
+              19:             TypeInt 32 1
+              20:             TypeVector 19(int) 4
+              21:             TypeVector 6(int) 4
+              22:             TypeFloat 64
+              23:             TypeVector 22(float64_t) 4
+     24(Buffers):             TypeStruct 18(fvec4) 20(ivec4) 21(ivec4) 23(f64vec4) 19(int)
+              25:             TypeArray 24(Buffers) 15
+              26:             TypePointer StorageBuffer 25
+        27(data):     26(ptr) Variable StorageBuffer
+              29:     19(int) Constant 4
+              30:             TypePointer StorageBuffer 19(int)
+              33:     19(int) Constant 0
+              34:             TypeBool
+              36:      6(int) Constant 3
+              41:      6(int) Constant 0
+              42:             TypePointer StorageBuffer 17(float)
+              46:     19(int) Constant 1
+              50:             TypeVector 17(float) 2
+              51:             TypePointer StorageBuffer 18(fvec4)
+              59:     19(int) Constant 2
+              60:             TypeVector 17(float) 3
+              68:     19(int) Constant 3
+              81:             TypeVector 19(int) 2
+              82:             TypePointer StorageBuffer 20(ivec4)
+              90:             TypeVector 19(int) 3
+             104:             TypePointer StorageBuffer 6(int)
+             111:             TypeVector 6(int) 2
+             112:             TypePointer StorageBuffer 21(ivec4)
+             120:             TypeVector 6(int) 3
+             142:             TypePointer StorageBuffer 22(float64_t)
+             149:             TypeVector 22(float64_t) 2
+             150:             TypePointer StorageBuffer 23(f64vec4)
+             158:             TypeVector 22(float64_t) 3
+             182:   81(ivec2) ConstantComposite 33 33
+             183:             TypeVector 34(bool) 2
+             194:   90(ivec3) ConstantComposite 33 33 33
+             195:             TypeVector 34(bool) 3
+             205:   20(ivec4) ConstantComposite 33 33 33 33
+             206:             TypeVector 34(bool) 4
+             213:      6(int) Constant 8
+             214:      6(int) Constant 1
+             215:  120(ivec3) ConstantComposite 213 213 214
+         4(main):           2 Function None 3
+               5:             Label
+   8(invocation):      7(ptr) Variable Function
+              11:      6(int) Load 10(gl_SubgroupInvocationID)
+              13:      6(int) Load 12(gl_SubgroupSize)
+              14:      6(int) IAdd 11 13
+              16:      6(int) UMod 14 15
+                              Store 8(invocation) 16
+              28:      6(int) Load 8(invocation)
+              31:     30(ptr) AccessChain 27(data) 28 29
+              32:     19(int) Load 31
+              35:    34(bool) SLessThan 32 33
+              37:    34(bool) GroupNonUniformAll 36 35
+                              SelectionMerge 39 None
+                              BranchConditional 37 38 133
+              38:               Label
+              40:      6(int)   Load 8(invocation)
+              43:     42(ptr)   AccessChain 27(data) 33 33 41
+              44:   17(float)   Load 43
+              45:    34(bool)   GroupNonUniformAllEqual 36 44
+              47:     19(int)   Select 45 46 33
+              48:     30(ptr)   AccessChain 27(data) 40 29
+                                Store 48 47
+              49:      6(int)   Load 8(invocation)
+              52:     51(ptr)   AccessChain 27(data) 46 33
+              53:   18(fvec4)   Load 52
+              54:   50(fvec2)   VectorShuffle 53 53 0 1
+              55:    34(bool)   GroupNonUniformAllEqual 36 54
+              56:     19(int)   Select 55 46 33
+              57:     30(ptr)   AccessChain 27(data) 49 29
+                                Store 57 56
+              58:      6(int)   Load 8(invocation)
+              61:     51(ptr)   AccessChain 27(data) 59 33
+              62:   18(fvec4)   Load 61
+              63:   60(fvec3)   VectorShuffle 62 62 0 1 2
+              64:    34(bool)   GroupNonUniformAllEqual 36 63
+              65:     19(int)   Select 64 46 33
+              66:     30(ptr)   AccessChain 27(data) 58 29
+                                Store 66 65
+              67:      6(int)   Load 8(invocation)
+              69:     51(ptr)   AccessChain 27(data) 68 33
+              70:   18(fvec4)   Load 69
+              71:    34(bool)   GroupNonUniformAllEqual 36 70
+              72:     19(int)   Select 71 46 33
+              73:     30(ptr)   AccessChain 27(data) 67 29
+                                Store 73 72
+              74:      6(int)   Load 8(invocation)
+              75:     30(ptr)   AccessChain 27(data) 33 46 41
+              76:     19(int)   Load 75
+              77:    34(bool)   GroupNonUniformAllEqual 36 76
+              78:     19(int)   Select 77 46 33
+              79:     30(ptr)   AccessChain 27(data) 74 29
+                                Store 79 78
+              80:      6(int)   Load 8(invocation)
+              83:     82(ptr)   AccessChain 27(data) 46 46
+              84:   20(ivec4)   Load 83
+              85:   81(ivec2)   VectorShuffle 84 84 0 1
+              86:    34(bool)   GroupNonUniformAllEqual 36 85
+              87:     19(int)   Select 86 46 33
+              88:     30(ptr)   AccessChain 27(data) 80 29
+                                Store 88 87
+              89:      6(int)   Load 8(invocation)
+              91:     82(ptr)   AccessChain 27(data) 59 46
+              92:   20(ivec4)   Load 91
+              93:   90(ivec3)   VectorShuffle 92 92 0 1 2
+              94:    34(bool)   GroupNonUniformAllEqual 36 93
+              95:     19(int)   Select 94 46 33
+              96:     30(ptr)   AccessChain 27(data) 89 29
+                                Store 96 95
+              97:      6(int)   Load 8(invocation)
+              98:     82(ptr)   AccessChain 27(data) 68 46
+              99:   20(ivec4)   Load 98
+             100:    34(bool)   GroupNonUniformAllEqual 36 99
+             101:     19(int)   Select 100 46 33
+             102:     30(ptr)   AccessChain 27(data) 97 29
+                                Store 102 101
+             103:      6(int)   Load 8(invocation)
+             105:    104(ptr)   AccessChain 27(data) 33 59 41
+             106:      6(int)   Load 105
+             107:    34(bool)   GroupNonUniformAllEqual 36 106
+             108:     19(int)   Select 107 46 33
+             109:     30(ptr)   AccessChain 27(data) 103 29
+                                Store 109 108
+             110:      6(int)   Load 8(invocation)
+             113:    112(ptr)   AccessChain 27(data) 46 59
+             114:   21(ivec4)   Load 113
+             115:  111(ivec2)   VectorShuffle 114 114 0 1
+             116:    34(bool)   GroupNonUniformAllEqual 36 115
+             117:     19(int)   Select 116 46 33
+             118:     30(ptr)   AccessChain 27(data) 110 29
+                                Store 118 117
+             119:      6(int)   Load 8(invocation)
+             121:    112(ptr)   AccessChain 27(data) 59 59
+             122:   21(ivec4)   Load 121
+             123:  120(ivec3)   VectorShuffle 122 122 0 1 2
+             124:    34(bool)   GroupNonUniformAllEqual 36 123
+             125:     19(int)   Select 124 46 33
+             126:     30(ptr)   AccessChain 27(data) 119 29
+                                Store 126 125
+             127:      6(int)   Load 8(invocation)
+             128:    112(ptr)   AccessChain 27(data) 68 59
+             129:   21(ivec4)   Load 128
+             130:    34(bool)   GroupNonUniformAllEqual 36 129
+             131:     19(int)   Select 130 46 33
+             132:     30(ptr)   AccessChain 27(data) 127 29
+                                Store 132 131
+                                Branch 39
+             133:               Label
+             134:      6(int)   Load 8(invocation)
+             135:     30(ptr)   AccessChain 27(data) 134 29
+             136:     19(int)   Load 135
+             137:    34(bool)   SLessThan 136 33
+             138:    34(bool)   GroupNonUniformAny 36 137
+                                SelectionMerge 140 None
+                                BranchConditional 138 139 140
+             139:                 Label
+             141:      6(int)     Load 8(invocation)
+             143:    142(ptr)     AccessChain 27(data) 33 68 41
+             144:22(float64_t)     Load 143
+             145:    34(bool)     GroupNonUniformAllEqual 36 144
+             146:     19(int)     Select 145 46 33
+             147:     30(ptr)     AccessChain 27(data) 141 29
+                                  Store 147 146
+             148:      6(int)     Load 8(invocation)
+             151:    150(ptr)     AccessChain 27(data) 46 68
+             152: 23(f64vec4)     Load 151
+             153:149(f64vec2)     VectorShuffle 152 152 0 1
+             154:    34(bool)     GroupNonUniformAllEqual 36 153
+             155:     19(int)     Select 154 46 33
+             156:     30(ptr)     AccessChain 27(data) 148 29
+                                  Store 156 155
+             157:      6(int)     Load 8(invocation)
+             159:    150(ptr)     AccessChain 27(data) 59 68
+             160: 23(f64vec4)     Load 159
+             161:158(f64vec3)     VectorShuffle 160 160 0 1 2
+             162:    34(bool)     GroupNonUniformAllEqual 36 161
+             163:     19(int)     Select 162 46 33
+             164:     30(ptr)     AccessChain 27(data) 157 29
+                                  Store 164 163
+             165:      6(int)     Load 8(invocation)
+             166:    150(ptr)     AccessChain 27(data) 68 68
+             167: 23(f64vec4)     Load 166
+             168:    34(bool)     GroupNonUniformAllEqual 36 167
+             169:     19(int)     Select 168 46 33
+             170:     30(ptr)     AccessChain 27(data) 165 29
+                                  Store 170 169
+             171:      6(int)     Load 8(invocation)
+             172:     30(ptr)     AccessChain 27(data) 33 46 41
+             173:     19(int)     Load 172
+             174:    34(bool)     SLessThan 173 33
+             175:    34(bool)     GroupNonUniformAllEqual 36 174
+             176:     19(int)     Select 175 46 33
+             177:     30(ptr)     AccessChain 27(data) 171 29
+                                  Store 177 176
+             178:      6(int)     Load 8(invocation)
+             179:     82(ptr)     AccessChain 27(data) 46 46
+             180:   20(ivec4)     Load 179
+             181:   81(ivec2)     VectorShuffle 180 180 0 1
+             184:  183(bvec2)     SLessThan 181 182
+             185:    34(bool)     GroupNonUniformAllEqual 36 184
+             186:     19(int)     Select 185 46 33
+             187:   81(ivec2)     CompositeConstruct 186 186
+             188:     19(int)     CompositeExtract 187 0
+             189:     30(ptr)     AccessChain 27(data) 178 29
+                                  Store 189 188
+             190:      6(int)     Load 8(invocation)
+             191:     82(ptr)     AccessChain 27(data) 46 46
+             192:   20(ivec4)     Load 191
+             193:   90(ivec3)     VectorShuffle 192 192 0 1 2
+             196:  195(bvec3)     SLessThan 193 194
+             197:    34(bool)     GroupNonUniformAllEqual 36 196
+             198:     19(int)     Select 197 46 33
+             199:   90(ivec3)     CompositeConstruct 198 198 198
+             200:     19(int)     CompositeExtract 199 0
+             201:     30(ptr)     AccessChain 27(data) 190 29
+                                  Store 201 200
+             202:      6(int)     Load 8(invocation)
+             203:     82(ptr)     AccessChain 27(data) 46 46
+             204:   20(ivec4)     Load 203
+             207:  206(bvec4)     SLessThan 204 205
+             208:    34(bool)     GroupNonUniformAllEqual 36 207
+             209:     19(int)     Select 208 46 33
+             210:   20(ivec4)     CompositeConstruct 209 209 209 209
+             211:     19(int)     CompositeExtract 210 0
+             212:     30(ptr)     AccessChain 27(data) 202 29
+                                  Store 212 211
+                                  Branch 140
+             140:               Label
+                                Branch 39
+              39:             Label
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.subpass.frag.out b/Test/baseResults/spv.subpass.frag.out
index c242111..044243e 100644
--- a/Test/baseResults/spv.subpass.frag.out
+++ b/Test/baseResults/spv.subpass.frag.out
@@ -1,8 +1,6 @@
 spv.subpass.frag
-Warning, version 400 is not yet complete; most version-specific features are present, but some are missing.
-
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 67
 
                               Capability Shader
diff --git a/Test/baseResults/spv.switch.frag.out b/Test/baseResults/spv.switch.frag.out
old mode 100755
new mode 100644
index 86acb6c..47cc5d4
--- a/Test/baseResults/spv.switch.frag.out
+++ b/Test/baseResults/spv.switch.frag.out
@@ -1,11 +1,10 @@
 spv.switch.frag
-Warning, version 310 is not yet complete; most version-specific features are present, but some are missing.
 WARNING: 0:121: 'switch' : last case/default label not followed by statements 
 WARNING: 0:134: 'switch' : last case/default label not followed by statements 
 WARNING: 0:139: 'switch' : last case/default label not followed by statements 
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 269
 
                               Capability Shader
diff --git a/Test/baseResults/spv.swizzle.frag.out b/Test/baseResults/spv.swizzle.frag.out
old mode 100755
new mode 100644
index 46978f8..2a132d5
--- a/Test/baseResults/spv.swizzle.frag.out
+++ b/Test/baseResults/spv.swizzle.frag.out
@@ -1,6 +1,6 @@
 spv.swizzle.frag
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 108
 
                               Capability Shader
@@ -24,6 +24,7 @@
                               Name 81  "c"
                               Name 83  "rep"
                               Name 107  "blend"
+                              Decorate 69(gl_FragColor) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
diff --git a/Test/baseResults/spv.swizzleInversion.frag.out b/Test/baseResults/spv.swizzleInversion.frag.out
old mode 100755
new mode 100644
index bf0699a..0aee7ae
--- a/Test/baseResults/spv.swizzleInversion.frag.out
+++ b/Test/baseResults/spv.swizzleInversion.frag.out
@@ -1,8 +1,6 @@
 spv.swizzleInversion.frag
-Warning, version 450 is not yet complete; most version-specific features are present, but some are missing.
-
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 46
 
                               Capability Shader
diff --git a/Test/baseResults/spv.test.frag.out b/Test/baseResults/spv.test.frag.out
index bf0135a..b5fccc3 100644
--- a/Test/baseResults/spv.test.frag.out
+++ b/Test/baseResults/spv.test.frag.out
@@ -1,8 +1,6 @@
 spv.test.frag
-Warning, version 400 is not yet complete; most version-specific features are present, but some are missing.
-
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 55
 
                               Capability Shader
@@ -25,6 +23,7 @@
                               Name 49  "blend"
                               Decorate 16(texSampler2D) DescriptorSet 0
                               Decorate 33(texSampler3D) DescriptorSet 0
+                              Decorate 43(gl_FragColor) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
diff --git a/Test/baseResults/spv.test.vert.out b/Test/baseResults/spv.test.vert.out
index 623d16b..3303c88 100644
--- a/Test/baseResults/spv.test.vert.out
+++ b/Test/baseResults/spv.test.vert.out
@@ -2,7 +2,7 @@
 WARNING: 0:5: attribute deprecated in version 130; may be removed in future release
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 24
 
                               Capability Shader
diff --git a/Test/baseResults/spv.texture.frag.out b/Test/baseResults/spv.texture.frag.out
old mode 100755
new mode 100644
index 467f254..e685018
--- a/Test/baseResults/spv.texture.frag.out
+++ b/Test/baseResults/spv.texture.frag.out
@@ -4,7 +4,7 @@
 WARNING: 0:12: varying deprecated in version 130; may be removed in future release
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 305
 
                               Capability Shader
@@ -45,6 +45,7 @@
                               Decorate 130(texSamplerCube) DescriptorSet 0
                               Decorate 145(shadowSampler1D) DescriptorSet 0
                               Decorate 164(shadowSampler2D) DescriptorSet 0
+                              Decorate 291(gl_FragColor) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
diff --git a/Test/baseResults/spv.texture.sampler.transform.frag.out b/Test/baseResults/spv.texture.sampler.transform.frag.out
new file mode 100644
index 0000000..ef8bbf6
--- /dev/null
+++ b/Test/baseResults/spv.texture.sampler.transform.frag.out
@@ -0,0 +1,37 @@
+spv.texture.sampler.transform.frag
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 20
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 9 17
+                              ExecutionMode 4 OriginUpperLeft
+                              Source GLSL 440
+                              Name 4  "main"
+                              Name 9  "color"
+                              Name 13  "tex"
+                              Name 17  "coord"
+                              Decorate 13(tex) DescriptorSet 0
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+               8:             TypePointer Output 7(fvec4)
+        9(color):      8(ptr) Variable Output
+              10:             TypeImage 6(float) 2D sampled format:Unknown
+              11:             TypeSampledImage 10
+              12:             TypePointer UniformConstant 11
+         13(tex):     12(ptr) Variable UniformConstant
+              15:             TypeVector 6(float) 2
+              16:             TypePointer Input 15(fvec2)
+       17(coord):     16(ptr) Variable Input
+         4(main):           2 Function None 3
+               5:             Label
+              14:          11 Load 13(tex)
+              18:   15(fvec2) Load 17(coord)
+              19:    7(fvec4) ImageSampleImplicitLod 14 18
+                              Store 9(color) 19
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.texture.vert.out b/Test/baseResults/spv.texture.vert.out
old mode 100755
new mode 100644
index c361549..0c1b7a1
--- a/Test/baseResults/spv.texture.vert.out
+++ b/Test/baseResults/spv.texture.vert.out
@@ -1,6 +1,6 @@
 spv.texture.vert
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 150
 
                               Capability Shader
diff --git a/Test/baseResults/spv.textureBuffer.vert.out b/Test/baseResults/spv.textureBuffer.vert.out
new file mode 100644
index 0000000..e327cb4
--- /dev/null
+++ b/Test/baseResults/spv.textureBuffer.vert.out
@@ -0,0 +1,64 @@
+spv.textureBuffer.vert
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 42
+
+                              Capability Shader
+                              Capability SampledBuffer
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Vertex 4  "main"
+                              Source GLSL 450
+                              Name 4  "main"
+                              Name 9  "tBuf"
+                              Name 13  "s"
+                              Name 23  "sBuf"
+                              Name 32  "utBuf"
+                              Name 38  "itBuf"
+                              Decorate 9(tBuf) DescriptorSet 0
+                              Decorate 13(s) DescriptorSet 0
+                              Decorate 23(sBuf) DescriptorSet 0
+                              Decorate 32(utBuf) DescriptorSet 0
+                              Decorate 38(itBuf) DescriptorSet 0
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeImage 6(float) Buffer sampled format:Unknown
+               8:             TypePointer UniformConstant 7
+         9(tBuf):      8(ptr) Variable UniformConstant
+              11:             TypeSampler
+              12:             TypePointer UniformConstant 11
+           13(s):     12(ptr) Variable UniformConstant
+              15:             TypeSampledImage 7
+              17:             TypeInt 32 1
+              18:     17(int) Constant 13
+              20:             TypeVector 6(float) 4
+              22:             TypePointer UniformConstant 15
+        23(sBuf):     22(ptr) Variable UniformConstant
+              29:             TypeInt 32 0
+              30:             TypeImage 29(int) Buffer sampled format:Unknown
+              31:             TypePointer UniformConstant 30
+       32(utBuf):     31(ptr) Variable UniformConstant
+              34:             TypeVector 29(int) 4
+              36:             TypeImage 17(int) Buffer sampled format:Unknown
+              37:             TypePointer UniformConstant 36
+       38(itBuf):     37(ptr) Variable UniformConstant
+              40:             TypeVector 17(int) 4
+         4(main):           2 Function None 3
+               5:             Label
+              10:           7 Load 9(tBuf)
+              14:          11 Load 13(s)
+              16:          15 SampledImage 10 14
+              19:           7 Image 16
+              21:   20(fvec4) ImageFetch 19 18
+              24:          15 Load 23(sBuf)
+              25:           7 Image 24
+              26:   20(fvec4) ImageFetch 25 18
+              27:           7 Load 9(tBuf)
+              28:   20(fvec4) ImageFetch 27 18
+              33:          30 Load 32(utBuf)
+              35:   34(ivec4) ImageFetch 33 18
+              39:          36 Load 38(itBuf)
+              41:   40(ivec4) ImageFetch 39 18
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.textureGatherBiasLod.frag.out b/Test/baseResults/spv.textureGatherBiasLod.frag.out
new file mode 100644
index 0000000..d01515d
--- /dev/null
+++ b/Test/baseResults/spv.textureGatherBiasLod.frag.out
@@ -0,0 +1,389 @@
+spv.textureGatherBiasLod.frag
+error: SPIRV-Tools Validation Errors
+error: Image Operand Bias can only be used with ImplicitLod opcodes
+  %27 = OpImageGather %v4float %17 %21 %int_0 Bias %26
+
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 298
+
+                              Capability Shader
+                              Capability ImageGatherExtended
+                              Capability SparseResidency
+                              Capability SampledCubeArray
+                              Capability ImageGatherBiasLodAMD
+                              Extension  "SPV_AMD_texture_gather_bias_lod"
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 20 25 37 61 176 296
+                              ExecutionMode 4 OriginUpperLeft
+                              Source GLSL 450
+                              SourceExtension  "GL_AMD_texture_gather_bias_lod"
+                              SourceExtension  "GL_ARB_sparse_texture2"
+                              Name 4  "main"
+                              Name 9  "texel"
+                              Name 12  "result"
+                              Name 16  "s2D"
+                              Name 20  "c2"
+                              Name 25  "bias"
+                              Name 33  "s2DArray"
+                              Name 37  "c3"
+                              Name 47  "sCube"
+                              Name 58  "sCubeArray"
+                              Name 61  "c4"
+                              Name 104  "ResType"
+                              Name 176  "lod"
+                              Name 296  "fragColor"
+                              Decorate 16(s2D) DescriptorSet 0
+                              Decorate 33(s2DArray) DescriptorSet 0
+                              Decorate 47(sCube) DescriptorSet 0
+                              Decorate 58(sCubeArray) DescriptorSet 0
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+               8:             TypePointer Function 7(fvec4)
+              10:    6(float) Constant 0
+              11:    7(fvec4) ConstantComposite 10 10 10 10
+              13:             TypeImage 6(float) 2D sampled format:Unknown
+              14:             TypeSampledImage 13
+              15:             TypePointer UniformConstant 14
+         16(s2D):     15(ptr) Variable UniformConstant
+              18:             TypeVector 6(float) 2
+              19:             TypePointer Input 18(fvec2)
+          20(c2):     19(ptr) Variable Input
+              22:             TypeInt 32 1
+              23:     22(int) Constant 0
+              24:             TypePointer Input 6(float)
+        25(bias):     24(ptr) Variable Input
+              30:             TypeImage 6(float) 2D array sampled format:Unknown
+              31:             TypeSampledImage 30
+              32:             TypePointer UniformConstant 31
+    33(s2DArray):     32(ptr) Variable UniformConstant
+              35:             TypeVector 6(float) 3
+              36:             TypePointer Input 35(fvec3)
+          37(c3):     36(ptr) Variable Input
+              39:     22(int) Constant 1
+              44:             TypeImage 6(float) Cube sampled format:Unknown
+              45:             TypeSampledImage 44
+              46:             TypePointer UniformConstant 45
+       47(sCube):     46(ptr) Variable UniformConstant
+              50:     22(int) Constant 2
+              55:             TypeImage 6(float) Cube array sampled format:Unknown
+              56:             TypeSampledImage 55
+              57:             TypePointer UniformConstant 56
+  58(sCubeArray):     57(ptr) Variable UniformConstant
+              60:             TypePointer Input 7(fvec4)
+          61(c4):     60(ptr) Variable Input
+              63:     22(int) Constant 3
+              70:             TypeVector 22(int) 2
+              71:   70(ivec2) ConstantComposite 23 23
+              78:   70(ivec2) ConstantComposite 23 39
+              85:             TypeInt 32 0
+              86:     85(int) Constant 4
+              87:             TypeArray 70(ivec2) 86
+              88:   70(ivec2) ConstantComposite 39 23
+              89:   70(ivec2) ConstantComposite 39 39
+              90:          87 ConstantComposite 71 78 88 89
+    104(ResType):             TypeStruct 22(int) 7(fvec4)
+        176(lod):     24(ptr) Variable Input
+             295:             TypePointer Output 7(fvec4)
+  296(fragColor):    295(ptr) Variable Output
+         4(main):           2 Function None 3
+               5:             Label
+        9(texel):      8(ptr) Variable Function
+      12(result):      8(ptr) Variable Function
+                              Store 9(texel) 11
+                              Store 12(result) 11
+              17:          14 Load 16(s2D)
+              21:   18(fvec2) Load 20(c2)
+              26:    6(float) Load 25(bias)
+              27:    7(fvec4) ImageGather 17 21 23 Bias 26
+              28:    7(fvec4) Load 9(texel)
+              29:    7(fvec4) FAdd 28 27
+                              Store 9(texel) 29
+              34:          31 Load 33(s2DArray)
+              38:   35(fvec3) Load 37(c3)
+              40:    6(float) Load 25(bias)
+              41:    7(fvec4) ImageGather 34 38 39 Bias 40
+              42:    7(fvec4) Load 9(texel)
+              43:    7(fvec4) FAdd 42 41
+                              Store 9(texel) 43
+              48:          45 Load 47(sCube)
+              49:   35(fvec3) Load 37(c3)
+              51:    6(float) Load 25(bias)
+              52:    7(fvec4) ImageGather 48 49 50 Bias 51
+              53:    7(fvec4) Load 9(texel)
+              54:    7(fvec4) FAdd 53 52
+                              Store 9(texel) 54
+              59:          56 Load 58(sCubeArray)
+              62:    7(fvec4) Load 61(c4)
+              64:    6(float) Load 25(bias)
+              65:    7(fvec4) ImageGather 59 62 63 Bias 64
+              66:    7(fvec4) Load 9(texel)
+              67:    7(fvec4) FAdd 66 65
+                              Store 9(texel) 67
+              68:          14 Load 16(s2D)
+              69:   18(fvec2) Load 20(c2)
+              72:    6(float) Load 25(bias)
+              73:    7(fvec4) ImageGather 68 69 23 Bias ConstOffset 72 71
+              74:    7(fvec4) Load 9(texel)
+              75:    7(fvec4) FAdd 74 73
+                              Store 9(texel) 75
+              76:          31 Load 33(s2DArray)
+              77:   35(fvec3) Load 37(c3)
+              79:    6(float) Load 25(bias)
+              80:    7(fvec4) ImageGather 76 77 39 Bias ConstOffset 79 78
+              81:    7(fvec4) Load 9(texel)
+              82:    7(fvec4) FAdd 81 80
+                              Store 9(texel) 82
+              83:          14 Load 16(s2D)
+              84:   18(fvec2) Load 20(c2)
+              91:    6(float) Load 25(bias)
+              92:    7(fvec4) ImageGather 83 84 23 Bias ConstOffsets 91 90
+              93:    7(fvec4) Load 9(texel)
+              94:    7(fvec4) FAdd 93 92
+                              Store 9(texel) 94
+              95:          31 Load 33(s2DArray)
+              96:   35(fvec3) Load 37(c3)
+              97:    6(float) Load 25(bias)
+              98:    7(fvec4) ImageGather 95 96 39 Bias ConstOffsets 97 90
+              99:    7(fvec4) Load 9(texel)
+             100:    7(fvec4) FAdd 99 98
+                              Store 9(texel) 100
+             101:          14 Load 16(s2D)
+             102:   18(fvec2) Load 20(c2)
+             103:    6(float) Load 25(bias)
+             105:104(ResType) ImageSparseGather 101 102 23 Bias 103
+             106:    7(fvec4) CompositeExtract 105 1
+                              Store 12(result) 106
+             107:     22(int) CompositeExtract 105 0
+             108:    7(fvec4) Load 12(result)
+             109:    7(fvec4) Load 9(texel)
+             110:    7(fvec4) FAdd 109 108
+                              Store 9(texel) 110
+             111:          31 Load 33(s2DArray)
+             112:   35(fvec3) Load 37(c3)
+             113:    6(float) Load 25(bias)
+             114:104(ResType) ImageSparseGather 111 112 39 Bias 113
+             115:    7(fvec4) CompositeExtract 114 1
+                              Store 12(result) 115
+             116:     22(int) CompositeExtract 114 0
+             117:    7(fvec4) Load 12(result)
+             118:    7(fvec4) Load 9(texel)
+             119:    7(fvec4) FAdd 118 117
+                              Store 9(texel) 119
+             120:          45 Load 47(sCube)
+             121:   35(fvec3) Load 37(c3)
+             122:    6(float) Load 25(bias)
+             123:104(ResType) ImageSparseGather 120 121 50 Bias 122
+             124:    7(fvec4) CompositeExtract 123 1
+                              Store 12(result) 124
+             125:     22(int) CompositeExtract 123 0
+             126:    7(fvec4) Load 12(result)
+             127:    7(fvec4) Load 9(texel)
+             128:    7(fvec4) FAdd 127 126
+                              Store 9(texel) 128
+             129:          56 Load 58(sCubeArray)
+             130:    7(fvec4) Load 61(c4)
+             131:    6(float) Load 25(bias)
+             132:104(ResType) ImageSparseGather 129 130 50 Bias 131
+             133:    7(fvec4) CompositeExtract 132 1
+                              Store 12(result) 133
+             134:     22(int) CompositeExtract 132 0
+             135:    7(fvec4) Load 12(result)
+             136:    7(fvec4) Load 9(texel)
+             137:    7(fvec4) FAdd 136 135
+                              Store 9(texel) 137
+             138:          14 Load 16(s2D)
+             139:   18(fvec2) Load 20(c2)
+             140:    6(float) Load 25(bias)
+             141:104(ResType) ImageSparseGather 138 139 23 Bias ConstOffset 140 71
+             142:    7(fvec4) CompositeExtract 141 1
+                              Store 12(result) 142
+             143:     22(int) CompositeExtract 141 0
+             144:    7(fvec4) Load 12(result)
+             145:    7(fvec4) Load 9(texel)
+             146:    7(fvec4) FAdd 145 144
+                              Store 9(texel) 146
+             147:          31 Load 33(s2DArray)
+             148:   35(fvec3) Load 37(c3)
+             149:    6(float) Load 25(bias)
+             150:104(ResType) ImageSparseGather 147 148 39 Bias ConstOffset 149 78
+             151:    7(fvec4) CompositeExtract 150 1
+                              Store 12(result) 151
+             152:     22(int) CompositeExtract 150 0
+             153:    7(fvec4) Load 12(result)
+             154:    7(fvec4) Load 9(texel)
+             155:    7(fvec4) FAdd 154 153
+                              Store 9(texel) 155
+             156:          14 Load 16(s2D)
+             157:   18(fvec2) Load 20(c2)
+             158:    6(float) Load 25(bias)
+             159:104(ResType) ImageSparseGather 156 157 23 Bias ConstOffsets 158 90
+             160:    7(fvec4) CompositeExtract 159 1
+                              Store 12(result) 160
+             161:     22(int) CompositeExtract 159 0
+             162:    7(fvec4) Load 12(result)
+             163:    7(fvec4) Load 9(texel)
+             164:    7(fvec4) FAdd 163 162
+                              Store 9(texel) 164
+             165:          31 Load 33(s2DArray)
+             166:   35(fvec3) Load 37(c3)
+             167:    6(float) Load 25(bias)
+             168:104(ResType) ImageSparseGather 165 166 39 Bias ConstOffsets 167 90
+             169:    7(fvec4) CompositeExtract 168 1
+                              Store 12(result) 169
+             170:     22(int) CompositeExtract 168 0
+             171:    7(fvec4) Load 12(result)
+             172:    7(fvec4) Load 9(texel)
+             173:    7(fvec4) FAdd 172 171
+                              Store 9(texel) 173
+             174:          14 Load 16(s2D)
+             175:   18(fvec2) Load 20(c2)
+             177:    6(float) Load 176(lod)
+             178:    7(fvec4) ImageGather 174 175 23 Lod 177
+             179:    7(fvec4) Load 9(texel)
+             180:    7(fvec4) FAdd 179 178
+                              Store 9(texel) 180
+             181:          31 Load 33(s2DArray)
+             182:   35(fvec3) Load 37(c3)
+             183:    6(float) Load 176(lod)
+             184:    7(fvec4) ImageGather 181 182 39 Lod 183
+             185:    7(fvec4) Load 9(texel)
+             186:    7(fvec4) FAdd 185 184
+                              Store 9(texel) 186
+             187:          45 Load 47(sCube)
+             188:   35(fvec3) Load 37(c3)
+             189:    6(float) Load 176(lod)
+             190:    7(fvec4) ImageGather 187 188 50 Lod 189
+             191:    7(fvec4) Load 9(texel)
+             192:    7(fvec4) FAdd 191 190
+                              Store 9(texel) 192
+             193:          56 Load 58(sCubeArray)
+             194:    7(fvec4) Load 61(c4)
+             195:    6(float) Load 176(lod)
+             196:    7(fvec4) ImageGather 193 194 63 Lod 195
+             197:    7(fvec4) Load 9(texel)
+             198:    7(fvec4) FAdd 197 196
+                              Store 9(texel) 198
+             199:          14 Load 16(s2D)
+             200:   18(fvec2) Load 20(c2)
+             201:    6(float) Load 176(lod)
+             202:    7(fvec4) ImageGather 199 200 23 Lod ConstOffset 201 71
+             203:    7(fvec4) Load 9(texel)
+             204:    7(fvec4) FAdd 203 202
+                              Store 9(texel) 204
+             205:          31 Load 33(s2DArray)
+             206:   35(fvec3) Load 37(c3)
+             207:    6(float) Load 176(lod)
+             208:    7(fvec4) ImageGather 205 206 39 Lod ConstOffset 207 78
+             209:    7(fvec4) Load 9(texel)
+             210:    7(fvec4) FAdd 209 208
+                              Store 9(texel) 210
+             211:          14 Load 16(s2D)
+             212:   18(fvec2) Load 20(c2)
+             213:    6(float) Load 176(lod)
+             214:    7(fvec4) ImageGather 211 212 23 Lod ConstOffsets 213 90
+             215:    7(fvec4) Load 9(texel)
+             216:    7(fvec4) FAdd 215 214
+                              Store 9(texel) 216
+             217:          31 Load 33(s2DArray)
+             218:   35(fvec3) Load 37(c3)
+             219:    6(float) Load 176(lod)
+             220:    7(fvec4) ImageGather 217 218 39 Lod ConstOffsets 219 90
+             221:    7(fvec4) Load 9(texel)
+             222:    7(fvec4) FAdd 221 220
+                              Store 9(texel) 222
+             223:          14 Load 16(s2D)
+             224:   18(fvec2) Load 20(c2)
+             225:    6(float) Load 176(lod)
+             226:104(ResType) ImageSparseGather 223 224 23 Lod 225
+             227:    7(fvec4) CompositeExtract 226 1
+                              Store 12(result) 227
+             228:     22(int) CompositeExtract 226 0
+             229:    7(fvec4) Load 12(result)
+             230:    7(fvec4) Load 9(texel)
+             231:    7(fvec4) FAdd 230 229
+                              Store 9(texel) 231
+             232:          31 Load 33(s2DArray)
+             233:   35(fvec3) Load 37(c3)
+             234:    6(float) Load 176(lod)
+             235:104(ResType) ImageSparseGather 232 233 39 Lod 234
+             236:    7(fvec4) CompositeExtract 235 1
+                              Store 12(result) 236
+             237:     22(int) CompositeExtract 235 0
+             238:    7(fvec4) Load 12(result)
+             239:    7(fvec4) Load 9(texel)
+             240:    7(fvec4) FAdd 239 238
+                              Store 9(texel) 240
+             241:          45 Load 47(sCube)
+             242:   35(fvec3) Load 37(c3)
+             243:    6(float) Load 176(lod)
+             244:104(ResType) ImageSparseGather 241 242 50 Lod 243
+             245:    7(fvec4) CompositeExtract 244 1
+                              Store 12(result) 245
+             246:     22(int) CompositeExtract 244 0
+             247:    7(fvec4) Load 12(result)
+             248:    7(fvec4) Load 9(texel)
+             249:    7(fvec4) FAdd 248 247
+                              Store 9(texel) 249
+             250:          56 Load 58(sCubeArray)
+             251:    7(fvec4) Load 61(c4)
+             252:    6(float) Load 176(lod)
+             253:104(ResType) ImageSparseGather 250 251 50 Lod 252
+             254:    7(fvec4) CompositeExtract 253 1
+                              Store 12(result) 254
+             255:     22(int) CompositeExtract 253 0
+             256:    7(fvec4) Load 12(result)
+             257:    7(fvec4) Load 9(texel)
+             258:    7(fvec4) FAdd 257 256
+                              Store 9(texel) 258
+             259:          14 Load 16(s2D)
+             260:   18(fvec2) Load 20(c2)
+             261:    6(float) Load 176(lod)
+             262:104(ResType) ImageSparseGather 259 260 23 Lod ConstOffset 261 71
+             263:    7(fvec4) CompositeExtract 262 1
+                              Store 12(result) 263
+             264:     22(int) CompositeExtract 262 0
+             265:    7(fvec4) Load 12(result)
+             266:    7(fvec4) Load 9(texel)
+             267:    7(fvec4) FAdd 266 265
+                              Store 9(texel) 267
+             268:          31 Load 33(s2DArray)
+             269:   35(fvec3) Load 37(c3)
+             270:    6(float) Load 176(lod)
+             271:104(ResType) ImageSparseGather 268 269 39 Lod ConstOffset 270 78
+             272:    7(fvec4) CompositeExtract 271 1
+                              Store 12(result) 272
+             273:     22(int) CompositeExtract 271 0
+             274:    7(fvec4) Load 12(result)
+             275:    7(fvec4) Load 9(texel)
+             276:    7(fvec4) FAdd 275 274
+                              Store 9(texel) 276
+             277:          14 Load 16(s2D)
+             278:   18(fvec2) Load 20(c2)
+             279:    6(float) Load 176(lod)
+             280:104(ResType) ImageSparseGather 277 278 23 Lod ConstOffsets 279 90
+             281:    7(fvec4) CompositeExtract 280 1
+                              Store 12(result) 281
+             282:     22(int) CompositeExtract 280 0
+             283:    7(fvec4) Load 12(result)
+             284:    7(fvec4) Load 9(texel)
+             285:    7(fvec4) FAdd 284 283
+                              Store 9(texel) 285
+             286:          31 Load 33(s2DArray)
+             287:   35(fvec3) Load 37(c3)
+             288:    6(float) Load 176(lod)
+             289:104(ResType) ImageSparseGather 286 287 39 Lod ConstOffsets 288 90
+             290:    7(fvec4) CompositeExtract 289 1
+                              Store 12(result) 290
+             291:     22(int) CompositeExtract 289 0
+             292:    7(fvec4) Load 12(result)
+             293:    7(fvec4) Load 9(texel)
+             294:    7(fvec4) FAdd 293 292
+                              Store 9(texel) 294
+             297:    7(fvec4) Load 9(texel)
+                              Store 296(fragColor) 297
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.types.frag.out b/Test/baseResults/spv.types.frag.out
old mode 100755
new mode 100644
index 9a2d8e3..e6fd3e0
--- a/Test/baseResults/spv.types.frag.out
+++ b/Test/baseResults/spv.types.frag.out
@@ -1,12 +1,12 @@
 spv.types.frag
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 260
 
                               Capability Shader
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "main" 91 93 100 102 109 111 118 120 127 129 136 138 145 147 154 156 160
+                              EntryPoint Fragment 4  "main" 96 98 105 107 114 116 123 125 132 134 141 143 150 152 159 161 165
                               ExecutionMode 4 OriginUpperLeft
                               Source GLSL 140
                               Name 4  "main"
@@ -15,46 +15,47 @@
                               Name 12  "i_b"
                               Name 17  "b2"
                               Name 19  "u_b2"
-                              Name 22  "i_b2"
-                              Name 35  "b3"
-                              Name 37  "u_b3"
-                              Name 40  "i_b3"
-                              Name 59  "b4"
-                              Name 61  "u_b4"
-                              Name 64  "i_b4"
-                              Name 89  "i"
-                              Name 91  "u_i"
-                              Name 93  "i_i"
-                              Name 98  "i2"
-                              Name 100  "u_i2"
-                              Name 102  "i_i2"
-                              Name 107  "i3"
-                              Name 109  "u_i3"
-                              Name 111  "i_i3"
-                              Name 116  "i4"
-                              Name 118  "u_i4"
-                              Name 120  "i_i4"
-                              Name 125  "f"
-                              Name 127  "u_f"
-                              Name 129  "i_f"
-                              Name 134  "f2"
-                              Name 136  "u_f2"
-                              Name 138  "i_f2"
-                              Name 143  "f3"
-                              Name 145  "u_f3"
-                              Name 147  "i_f3"
-                              Name 152  "f4"
-                              Name 154  "u_f4"
-                              Name 156  "i_f4"
-                              Name 160  "gl_FragColor"
-                              Decorate 91(u_i) Flat
-                              Decorate 93(i_i) Flat
-                              Decorate 100(u_i2) Flat
-                              Decorate 102(i_i2) Flat
-                              Decorate 109(u_i3) Flat
-                              Decorate 111(i_i3) Flat
-                              Decorate 118(u_i4) Flat
-                              Decorate 120(i_i4) Flat
+                              Name 24  "i_b2"
+                              Name 38  "b3"
+                              Name 40  "u_b3"
+                              Name 43  "i_b3"
+                              Name 63  "b4"
+                              Name 65  "u_b4"
+                              Name 68  "i_b4"
+                              Name 94  "i"
+                              Name 96  "u_i"
+                              Name 98  "i_i"
+                              Name 103  "i2"
+                              Name 105  "u_i2"
+                              Name 107  "i_i2"
+                              Name 112  "i3"
+                              Name 114  "u_i3"
+                              Name 116  "i_i3"
+                              Name 121  "i4"
+                              Name 123  "u_i4"
+                              Name 125  "i_i4"
+                              Name 130  "f"
+                              Name 132  "u_f"
+                              Name 134  "i_f"
+                              Name 139  "f2"
+                              Name 141  "u_f2"
+                              Name 143  "i_f2"
+                              Name 148  "f3"
+                              Name 150  "u_f3"
+                              Name 152  "i_f3"
+                              Name 157  "f4"
+                              Name 159  "u_f4"
+                              Name 161  "i_f4"
+                              Name 165  "gl_FragColor"
+                              Decorate 96(u_i) Flat
+                              Decorate 98(i_i) Flat
+                              Decorate 105(u_i2) Flat
+                              Decorate 107(i_i2) Flat
+                              Decorate 114(u_i3) Flat
+                              Decorate 116(i_i3) Flat
+                              Decorate 123(u_i4) Flat
+                              Decorate 125(i_i4) Flat
+                              Decorate 165(gl_FragColor) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeBool
@@ -66,271 +67,271 @@
               16:             TypePointer Function 15(bvec2)
               18:             TypePointer Private 15(bvec2)
         19(u_b2):     18(ptr) Variable Private
-        22(i_b2):     18(ptr) Variable Private
-              33:             TypeVector 6(bool) 3
-              34:             TypePointer Function 33(bvec3)
-              36:             TypePointer Private 33(bvec3)
-        37(u_b3):     36(ptr) Variable Private
-        40(i_b3):     36(ptr) Variable Private
-              57:             TypeVector 6(bool) 4
-              58:             TypePointer Function 57(bvec4)
-              60:             TypePointer Private 57(bvec4)
-        61(u_b4):     60(ptr) Variable Private
-        64(i_b4):     60(ptr) Variable Private
-              87:             TypeInt 32 1
-              88:             TypePointer Function 87(int)
-              90:             TypePointer Input 87(int)
-         91(u_i):     90(ptr) Variable Input
-         93(i_i):     90(ptr) Variable Input
-              96:             TypeVector 87(int) 2
-              97:             TypePointer Function 96(ivec2)
-              99:             TypePointer Input 96(ivec2)
-       100(u_i2):     99(ptr) Variable Input
-       102(i_i2):     99(ptr) Variable Input
-             105:             TypeVector 87(int) 3
-             106:             TypePointer Function 105(ivec3)
-             108:             TypePointer Input 105(ivec3)
-       109(u_i3):    108(ptr) Variable Input
-       111(i_i3):    108(ptr) Variable Input
-             114:             TypeVector 87(int) 4
-             115:             TypePointer Function 114(ivec4)
-             117:             TypePointer Input 114(ivec4)
-       118(u_i4):    117(ptr) Variable Input
-       120(i_i4):    117(ptr) Variable Input
-             123:             TypeFloat 32
-             124:             TypePointer Function 123(float)
-             126:             TypePointer Input 123(float)
-        127(u_f):    126(ptr) Variable Input
-        129(i_f):    126(ptr) Variable Input
-             132:             TypeVector 123(float) 2
-             133:             TypePointer Function 132(fvec2)
-             135:             TypePointer Input 132(fvec2)
-       136(u_f2):    135(ptr) Variable Input
-       138(i_f2):    135(ptr) Variable Input
-             141:             TypeVector 123(float) 3
-             142:             TypePointer Function 141(fvec3)
-             144:             TypePointer Input 141(fvec3)
-       145(u_f3):    144(ptr) Variable Input
-       147(i_f3):    144(ptr) Variable Input
-             150:             TypeVector 123(float) 4
-             151:             TypePointer Function 150(fvec4)
-             153:             TypePointer Input 150(fvec4)
-       154(u_f4):    153(ptr) Variable Input
-       156(i_f4):    153(ptr) Variable Input
-             159:             TypePointer Output 150(fvec4)
-160(gl_FragColor):    159(ptr) Variable Output
-             193:             TypeInt 32 0
-             194:    193(int) Constant 0
-             198:    193(int) Constant 1
-             208:    193(int) Constant 2
-             221:    193(int) Constant 3
-             257:  123(float) Constant 1065353216
-             258:  150(fvec4) ConstantComposite 257 257 257 257
+              20:             TypeInt 32 0
+              21:     20(int) Constant 0
+        24(i_b2):     18(ptr) Variable Private
+              28:     20(int) Constant 1
+              36:             TypeVector 6(bool) 3
+              37:             TypePointer Function 36(bvec3)
+              39:             TypePointer Private 36(bvec3)
+        40(u_b3):     39(ptr) Variable Private
+        43(i_b3):     39(ptr) Variable Private
+              53:     20(int) Constant 2
+              61:             TypeVector 6(bool) 4
+              62:             TypePointer Function 61(bvec4)
+              64:             TypePointer Private 61(bvec4)
+        65(u_b4):     64(ptr) Variable Private
+        68(i_b4):     64(ptr) Variable Private
+              84:     20(int) Constant 3
+              92:             TypeInt 32 1
+              93:             TypePointer Function 92(int)
+              95:             TypePointer Input 92(int)
+         96(u_i):     95(ptr) Variable Input
+         98(i_i):     95(ptr) Variable Input
+             101:             TypeVector 92(int) 2
+             102:             TypePointer Function 101(ivec2)
+             104:             TypePointer Input 101(ivec2)
+       105(u_i2):    104(ptr) Variable Input
+       107(i_i2):    104(ptr) Variable Input
+             110:             TypeVector 92(int) 3
+             111:             TypePointer Function 110(ivec3)
+             113:             TypePointer Input 110(ivec3)
+       114(u_i3):    113(ptr) Variable Input
+       116(i_i3):    113(ptr) Variable Input
+             119:             TypeVector 92(int) 4
+             120:             TypePointer Function 119(ivec4)
+             122:             TypePointer Input 119(ivec4)
+       123(u_i4):    122(ptr) Variable Input
+       125(i_i4):    122(ptr) Variable Input
+             128:             TypeFloat 32
+             129:             TypePointer Function 128(float)
+             131:             TypePointer Input 128(float)
+        132(u_f):    131(ptr) Variable Input
+        134(i_f):    131(ptr) Variable Input
+             137:             TypeVector 128(float) 2
+             138:             TypePointer Function 137(fvec2)
+             140:             TypePointer Input 137(fvec2)
+       141(u_f2):    140(ptr) Variable Input
+       143(i_f2):    140(ptr) Variable Input
+             146:             TypeVector 128(float) 3
+             147:             TypePointer Function 146(fvec3)
+             149:             TypePointer Input 146(fvec3)
+       150(u_f3):    149(ptr) Variable Input
+       152(i_f3):    149(ptr) Variable Input
+             155:             TypeVector 128(float) 4
+             156:             TypePointer Function 155(fvec4)
+             158:             TypePointer Input 155(fvec4)
+       159(u_f4):    158(ptr) Variable Input
+       161(i_f4):    158(ptr) Variable Input
+             164:             TypePointer Output 155(fvec4)
+165(gl_FragColor):    164(ptr) Variable Output
+             257:  128(float) Constant 1065353216
+             258:  155(fvec4) ConstantComposite 257 257 257 257
          4(main):           2 Function None 3
                5:             Label
             8(b):      7(ptr) Variable Function
           17(b2):     16(ptr) Variable Function
-          35(b3):     34(ptr) Variable Function
-          59(b4):     58(ptr) Variable Function
-           89(i):     88(ptr) Variable Function
-          98(i2):     97(ptr) Variable Function
-         107(i3):    106(ptr) Variable Function
-         116(i4):    115(ptr) Variable Function
-          125(f):    124(ptr) Variable Function
-         134(f2):    133(ptr) Variable Function
-         143(f3):    142(ptr) Variable Function
-         152(f4):    151(ptr) Variable Function
-             161:    151(ptr) Variable Function
+          38(b3):     37(ptr) Variable Function
+          63(b4):     62(ptr) Variable Function
+           94(i):     93(ptr) Variable Function
+         103(i2):    102(ptr) Variable Function
+         112(i3):    111(ptr) Variable Function
+         121(i4):    120(ptr) Variable Function
+          130(f):    129(ptr) Variable Function
+         139(f2):    138(ptr) Variable Function
+         148(f3):    147(ptr) Variable Function
+         157(f4):    156(ptr) Variable Function
+             194:    156(ptr) Variable Function
               11:     6(bool) Load 10(u_b)
               13:     6(bool) Load 12(i_b)
               14:     6(bool) LogicalAnd 11 13
                               Store 8(b) 14
-              20:   15(bvec2) Load 19(u_b2)
-              21:     6(bool) CompositeExtract 20 0
-              23:   15(bvec2) Load 22(i_b2)
-              24:     6(bool) CompositeExtract 23 0
-              25:     6(bool) LogicalAnd 21 24
-              26:   15(bvec2) Load 19(u_b2)
-              27:     6(bool) CompositeExtract 26 1
-              28:     6(bool) LogicalAnd 25 27
-              29:   15(bvec2) Load 22(i_b2)
-              30:     6(bool) CompositeExtract 29 1
-              31:     6(bool) LogicalAnd 28 30
-              32:   15(bvec2) CompositeConstruct 31 31
-                              Store 17(b2) 32
-              38:   33(bvec3) Load 37(u_b3)
-              39:     6(bool) CompositeExtract 38 0
-              41:   33(bvec3) Load 40(i_b3)
-              42:     6(bool) CompositeExtract 41 0
-              43:     6(bool) LogicalAnd 39 42
-              44:   33(bvec3) Load 37(u_b3)
-              45:     6(bool) CompositeExtract 44 1
-              46:     6(bool) LogicalAnd 43 45
-              47:   33(bvec3) Load 40(i_b3)
-              48:     6(bool) CompositeExtract 47 1
+              22:      9(ptr) AccessChain 19(u_b2) 21
+              23:     6(bool) Load 22
+              25:      9(ptr) AccessChain 24(i_b2) 21
+              26:     6(bool) Load 25
+              27:     6(bool) LogicalAnd 23 26
+              29:      9(ptr) AccessChain 19(u_b2) 28
+              30:     6(bool) Load 29
+              31:     6(bool) LogicalAnd 27 30
+              32:      9(ptr) AccessChain 24(i_b2) 28
+              33:     6(bool) Load 32
+              34:     6(bool) LogicalAnd 31 33
+              35:   15(bvec2) CompositeConstruct 34 34
+                              Store 17(b2) 35
+              41:      9(ptr) AccessChain 40(u_b3) 21
+              42:     6(bool) Load 41
+              44:      9(ptr) AccessChain 43(i_b3) 21
+              45:     6(bool) Load 44
+              46:     6(bool) LogicalAnd 42 45
+              47:      9(ptr) AccessChain 40(u_b3) 28
+              48:     6(bool) Load 47
               49:     6(bool) LogicalAnd 46 48
-              50:   33(bvec3) Load 37(u_b3)
-              51:     6(bool) CompositeExtract 50 2
+              50:      9(ptr) AccessChain 43(i_b3) 28
+              51:     6(bool) Load 50
               52:     6(bool) LogicalAnd 49 51
-              53:   33(bvec3) Load 40(i_b3)
-              54:     6(bool) CompositeExtract 53 2
-              55:     6(bool) LogicalAnd 52 54
-              56:   33(bvec3) CompositeConstruct 55 55 55
-                              Store 35(b3) 56
-              62:   57(bvec4) Load 61(u_b4)
-              63:     6(bool) CompositeExtract 62 0
-              65:   57(bvec4) Load 64(i_b4)
-              66:     6(bool) CompositeExtract 65 0
-              67:     6(bool) LogicalAnd 63 66
-              68:   57(bvec4) Load 61(u_b4)
-              69:     6(bool) CompositeExtract 68 1
-              70:     6(bool) LogicalAnd 67 69
-              71:   57(bvec4) Load 64(i_b4)
-              72:     6(bool) CompositeExtract 71 1
-              73:     6(bool) LogicalAnd 70 72
-              74:   57(bvec4) Load 61(u_b4)
-              75:     6(bool) CompositeExtract 74 2
-              76:     6(bool) LogicalAnd 73 75
-              77:   57(bvec4) Load 64(i_b4)
-              78:     6(bool) CompositeExtract 77 2
-              79:     6(bool) LogicalAnd 76 78
-              80:   57(bvec4) Load 61(u_b4)
-              81:     6(bool) CompositeExtract 80 3
-              82:     6(bool) LogicalAnd 79 81
-              83:   57(bvec4) Load 64(i_b4)
-              84:     6(bool) CompositeExtract 83 3
-              85:     6(bool) LogicalAnd 82 84
-              86:   57(bvec4) CompositeConstruct 85 85 85 85
-                              Store 59(b4) 86
-              92:     87(int) Load 91(u_i)
-              94:     87(int) Load 93(i_i)
-              95:     87(int) IAdd 92 94
-                              Store 89(i) 95
-             101:   96(ivec2) Load 100(u_i2)
-             103:   96(ivec2) Load 102(i_i2)
-             104:   96(ivec2) IAdd 101 103
-                              Store 98(i2) 104
-             110:  105(ivec3) Load 109(u_i3)
-             112:  105(ivec3) Load 111(i_i3)
-             113:  105(ivec3) IAdd 110 112
-                              Store 107(i3) 113
-             119:  114(ivec4) Load 118(u_i4)
-             121:  114(ivec4) Load 120(i_i4)
-             122:  114(ivec4) IAdd 119 121
-                              Store 116(i4) 122
-             128:  123(float) Load 127(u_f)
-             130:  123(float) Load 129(i_f)
-             131:  123(float) FAdd 128 130
-                              Store 125(f) 131
-             137:  132(fvec2) Load 136(u_f2)
-             139:  132(fvec2) Load 138(i_f2)
-             140:  132(fvec2) FAdd 137 139
-                              Store 134(f2) 140
-             146:  141(fvec3) Load 145(u_f3)
-             148:  141(fvec3) Load 147(i_f3)
-             149:  141(fvec3) FAdd 146 148
-                              Store 143(f3) 149
-             155:  150(fvec4) Load 154(u_f4)
-             157:  150(fvec4) Load 156(i_f4)
-             158:  150(fvec4) FAdd 155 157
-                              Store 152(f4) 158
-             162:     6(bool) Load 8(b)
-             163:   15(bvec2) Load 17(b2)
-             164:     6(bool) CompositeExtract 163 0
-             165:     6(bool) LogicalOr 162 164
-             166:   15(bvec2) Load 17(b2)
-             167:     6(bool) CompositeExtract 166 1
-             168:     6(bool) LogicalOr 165 167
-             169:   33(bvec3) Load 35(b3)
-             170:     6(bool) CompositeExtract 169 0
-             171:     6(bool) LogicalOr 168 170
-             172:   33(bvec3) Load 35(b3)
-             173:     6(bool) CompositeExtract 172 1
-             174:     6(bool) LogicalOr 171 173
-             175:   33(bvec3) Load 35(b3)
-             176:     6(bool) CompositeExtract 175 2
-             177:     6(bool) LogicalOr 174 176
-             178:   57(bvec4) Load 59(b4)
-             179:     6(bool) CompositeExtract 178 0
-             180:     6(bool) LogicalOr 177 179
-             181:   57(bvec4) Load 59(b4)
-             182:     6(bool) CompositeExtract 181 1
-             183:     6(bool) LogicalOr 180 182
-             184:   57(bvec4) Load 59(b4)
-             185:     6(bool) CompositeExtract 184 2
-             186:     6(bool) LogicalOr 183 185
-             187:   57(bvec4) Load 59(b4)
-             188:     6(bool) CompositeExtract 187 3
-             189:     6(bool) LogicalOr 186 188
-                              SelectionMerge 191 None
-                              BranchConditional 189 190 256
-             190:               Label
-             192:     87(int)   Load 89(i)
-             195:     88(ptr)   AccessChain 98(i2) 194
-             196:     87(int)   Load 195
-             197:     87(int)   IAdd 192 196
-             199:     88(ptr)   AccessChain 98(i2) 198
-             200:     87(int)   Load 199
-             201:     87(int)   IAdd 197 200
-             202:     88(ptr)   AccessChain 107(i3) 194
-             203:     87(int)   Load 202
-             204:     87(int)   IAdd 201 203
-             205:     88(ptr)   AccessChain 107(i3) 198
-             206:     87(int)   Load 205
-             207:     87(int)   IAdd 204 206
-             209:     88(ptr)   AccessChain 107(i3) 208
-             210:     87(int)   Load 209
-             211:     87(int)   IAdd 207 210
-             212:     88(ptr)   AccessChain 116(i4) 194
-             213:     87(int)   Load 212
-             214:     87(int)   IAdd 211 213
-             215:     88(ptr)   AccessChain 116(i4) 198
-             216:     87(int)   Load 215
-             217:     87(int)   IAdd 214 216
-             218:     88(ptr)   AccessChain 116(i4) 208
-             219:     87(int)   Load 218
-             220:     87(int)   IAdd 217 219
-             222:     88(ptr)   AccessChain 116(i4) 221
-             223:     87(int)   Load 222
-             224:     87(int)   IAdd 220 223
-             225:  123(float)   ConvertSToF 224
-             226:  123(float)   Load 125(f)
-             227:  123(float)   FAdd 225 226
-             228:    124(ptr)   AccessChain 134(f2) 194
-             229:  123(float)   Load 228
-             230:  123(float)   FAdd 227 229
-             231:    124(ptr)   AccessChain 134(f2) 198
-             232:  123(float)   Load 231
-             233:  123(float)   FAdd 230 232
-             234:    124(ptr)   AccessChain 143(f3) 194
-             235:  123(float)   Load 234
-             236:  123(float)   FAdd 233 235
-             237:    124(ptr)   AccessChain 143(f3) 198
-             238:  123(float)   Load 237
-             239:  123(float)   FAdd 236 238
-             240:    124(ptr)   AccessChain 143(f3) 208
-             241:  123(float)   Load 240
-             242:  123(float)   FAdd 239 241
-             243:    124(ptr)   AccessChain 152(f4) 194
-             244:  123(float)   Load 243
-             245:  123(float)   FAdd 242 244
-             246:    124(ptr)   AccessChain 152(f4) 198
-             247:  123(float)   Load 246
-             248:  123(float)   FAdd 245 247
-             249:    124(ptr)   AccessChain 152(f4) 208
-             250:  123(float)   Load 249
-             251:  123(float)   FAdd 248 250
-             252:    124(ptr)   AccessChain 152(f4) 221
-             253:  123(float)   Load 252
-             254:  123(float)   FAdd 251 253
-             255:  150(fvec4)   CompositeConstruct 254 254 254 254
-                                Store 161 255
-                                Branch 191
+              54:      9(ptr) AccessChain 40(u_b3) 53
+              55:     6(bool) Load 54
+              56:     6(bool) LogicalAnd 52 55
+              57:      9(ptr) AccessChain 43(i_b3) 53
+              58:     6(bool) Load 57
+              59:     6(bool) LogicalAnd 56 58
+              60:   36(bvec3) CompositeConstruct 59 59 59
+                              Store 38(b3) 60
+              66:      9(ptr) AccessChain 65(u_b4) 21
+              67:     6(bool) Load 66
+              69:      9(ptr) AccessChain 68(i_b4) 21
+              70:     6(bool) Load 69
+              71:     6(bool) LogicalAnd 67 70
+              72:      9(ptr) AccessChain 65(u_b4) 28
+              73:     6(bool) Load 72
+              74:     6(bool) LogicalAnd 71 73
+              75:      9(ptr) AccessChain 68(i_b4) 28
+              76:     6(bool) Load 75
+              77:     6(bool) LogicalAnd 74 76
+              78:      9(ptr) AccessChain 65(u_b4) 53
+              79:     6(bool) Load 78
+              80:     6(bool) LogicalAnd 77 79
+              81:      9(ptr) AccessChain 68(i_b4) 53
+              82:     6(bool) Load 81
+              83:     6(bool) LogicalAnd 80 82
+              85:      9(ptr) AccessChain 65(u_b4) 84
+              86:     6(bool) Load 85
+              87:     6(bool) LogicalAnd 83 86
+              88:      9(ptr) AccessChain 68(i_b4) 84
+              89:     6(bool) Load 88
+              90:     6(bool) LogicalAnd 87 89
+              91:   61(bvec4) CompositeConstruct 90 90 90 90
+                              Store 63(b4) 91
+              97:     92(int) Load 96(u_i)
+              99:     92(int) Load 98(i_i)
+             100:     92(int) IAdd 97 99
+                              Store 94(i) 100
+             106:  101(ivec2) Load 105(u_i2)
+             108:  101(ivec2) Load 107(i_i2)
+             109:  101(ivec2) IAdd 106 108
+                              Store 103(i2) 109
+             115:  110(ivec3) Load 114(u_i3)
+             117:  110(ivec3) Load 116(i_i3)
+             118:  110(ivec3) IAdd 115 117
+                              Store 112(i3) 118
+             124:  119(ivec4) Load 123(u_i4)
+             126:  119(ivec4) Load 125(i_i4)
+             127:  119(ivec4) IAdd 124 126
+                              Store 121(i4) 127
+             133:  128(float) Load 132(u_f)
+             135:  128(float) Load 134(i_f)
+             136:  128(float) FAdd 133 135
+                              Store 130(f) 136
+             142:  137(fvec2) Load 141(u_f2)
+             144:  137(fvec2) Load 143(i_f2)
+             145:  137(fvec2) FAdd 142 144
+                              Store 139(f2) 145
+             151:  146(fvec3) Load 150(u_f3)
+             153:  146(fvec3) Load 152(i_f3)
+             154:  146(fvec3) FAdd 151 153
+                              Store 148(f3) 154
+             160:  155(fvec4) Load 159(u_f4)
+             162:  155(fvec4) Load 161(i_f4)
+             163:  155(fvec4) FAdd 160 162
+                              Store 157(f4) 163
+             166:     6(bool) Load 8(b)
+             167:      7(ptr) AccessChain 17(b2) 21
+             168:     6(bool) Load 167
+             169:     6(bool) LogicalOr 166 168
+             170:      7(ptr) AccessChain 17(b2) 28
+             171:     6(bool) Load 170
+             172:     6(bool) LogicalOr 169 171
+             173:      7(ptr) AccessChain 38(b3) 21
+             174:     6(bool) Load 173
+             175:     6(bool) LogicalOr 172 174
+             176:      7(ptr) AccessChain 38(b3) 28
+             177:     6(bool) Load 176
+             178:     6(bool) LogicalOr 175 177
+             179:      7(ptr) AccessChain 38(b3) 53
+             180:     6(bool) Load 179
+             181:     6(bool) LogicalOr 178 180
+             182:      7(ptr) AccessChain 63(b4) 21
+             183:     6(bool) Load 182
+             184:     6(bool) LogicalOr 181 183
+             185:      7(ptr) AccessChain 63(b4) 28
+             186:     6(bool) Load 185
+             187:     6(bool) LogicalOr 184 186
+             188:      7(ptr) AccessChain 63(b4) 53
+             189:     6(bool) Load 188
+             190:     6(bool) LogicalOr 187 189
+             191:      7(ptr) AccessChain 63(b4) 84
+             192:     6(bool) Load 191
+             193:     6(bool) LogicalOr 190 192
+                              SelectionMerge 196 None
+                              BranchConditional 193 195 256
+             195:               Label
+             197:     92(int)   Load 94(i)
+             198:     93(ptr)   AccessChain 103(i2) 21
+             199:     92(int)   Load 198
+             200:     92(int)   IAdd 197 199
+             201:     93(ptr)   AccessChain 103(i2) 28
+             202:     92(int)   Load 201
+             203:     92(int)   IAdd 200 202
+             204:     93(ptr)   AccessChain 112(i3) 21
+             205:     92(int)   Load 204
+             206:     92(int)   IAdd 203 205
+             207:     93(ptr)   AccessChain 112(i3) 28
+             208:     92(int)   Load 207
+             209:     92(int)   IAdd 206 208
+             210:     93(ptr)   AccessChain 112(i3) 53
+             211:     92(int)   Load 210
+             212:     92(int)   IAdd 209 211
+             213:     93(ptr)   AccessChain 121(i4) 21
+             214:     92(int)   Load 213
+             215:     92(int)   IAdd 212 214
+             216:     93(ptr)   AccessChain 121(i4) 28
+             217:     92(int)   Load 216
+             218:     92(int)   IAdd 215 217
+             219:     93(ptr)   AccessChain 121(i4) 53
+             220:     92(int)   Load 219
+             221:     92(int)   IAdd 218 220
+             222:     93(ptr)   AccessChain 121(i4) 84
+             223:     92(int)   Load 222
+             224:     92(int)   IAdd 221 223
+             225:  128(float)   ConvertSToF 224
+             226:  128(float)   Load 130(f)
+             227:  128(float)   FAdd 225 226
+             228:    129(ptr)   AccessChain 139(f2) 21
+             229:  128(float)   Load 228
+             230:  128(float)   FAdd 227 229
+             231:    129(ptr)   AccessChain 139(f2) 28
+             232:  128(float)   Load 231
+             233:  128(float)   FAdd 230 232
+             234:    129(ptr)   AccessChain 148(f3) 21
+             235:  128(float)   Load 234
+             236:  128(float)   FAdd 233 235
+             237:    129(ptr)   AccessChain 148(f3) 28
+             238:  128(float)   Load 237
+             239:  128(float)   FAdd 236 238
+             240:    129(ptr)   AccessChain 148(f3) 53
+             241:  128(float)   Load 240
+             242:  128(float)   FAdd 239 241
+             243:    129(ptr)   AccessChain 157(f4) 21
+             244:  128(float)   Load 243
+             245:  128(float)   FAdd 242 244
+             246:    129(ptr)   AccessChain 157(f4) 28
+             247:  128(float)   Load 246
+             248:  128(float)   FAdd 245 247
+             249:    129(ptr)   AccessChain 157(f4) 53
+             250:  128(float)   Load 249
+             251:  128(float)   FAdd 248 250
+             252:    129(ptr)   AccessChain 157(f4) 84
+             253:  128(float)   Load 252
+             254:  128(float)   FAdd 251 253
+             255:  155(fvec4)   CompositeConstruct 254 254 254 254
+                                Store 194 255
+                                Branch 196
              256:               Label
-                                Store 161 258
-                                Branch 191
-             191:             Label
-             259:  150(fvec4) Load 161
-                              Store 160(gl_FragColor) 259
+                                Store 194 258
+                                Branch 196
+             196:             Label
+             259:  155(fvec4) Load 194
+                              Store 165(gl_FragColor) 259
                               Return
                               FunctionEnd
diff --git a/Test/baseResults/spv.uint.frag.out b/Test/baseResults/spv.uint.frag.out
old mode 100755
new mode 100644
index e9ba0ce..af0ad85
--- a/Test/baseResults/spv.uint.frag.out
+++ b/Test/baseResults/spv.uint.frag.out
@@ -1,8 +1,6 @@
 spv.uint.frag
-Warning, version 310 is not yet complete; most version-specific features are present, but some are missing.
-
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 213
 
                               Capability Shader
diff --git a/Test/baseResults/spv.uniformArray.frag.out b/Test/baseResults/spv.uniformArray.frag.out
index 447ad4f..ff5855c 100644
--- a/Test/baseResults/spv.uniformArray.frag.out
+++ b/Test/baseResults/spv.uniformArray.frag.out
@@ -1,6 +1,6 @@
 spv.uniformArray.frag
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 53
 
                               Capability Shader
@@ -16,6 +16,7 @@
                               Name 35  "alpha"
                               Name 47  "gl_FragColor"
                               Name 52  "texSampler2D"
+                              Decorate 47(gl_FragColor) Location 0
                               Decorate 52(texSampler2D) DescriptorSet 0
                2:             TypeVoid
                3:             TypeFunction 2
diff --git a/Test/baseResults/spv.unit1.frag.out b/Test/baseResults/spv.unit1.frag.out
new file mode 100644
index 0000000..d64d437
--- /dev/null
+++ b/Test/baseResults/spv.unit1.frag.out
@@ -0,0 +1,298 @@
+spv.unit1.frag
+Shader version: 460
+gl_FragCoord origin is upper left
+0:? Sequence
+0:10  Function Definition: main( ( global void)
+0:10    Function Parameters: 
+0:12    Sequence
+0:12      move second child to first child ( temp highp float)
+0:12        'f' ( global highp float)
+0:12        Constant:
+0:12          10.000000
+0:13      Sequence
+0:13        move second child to first child ( temp highp float)
+0:13          'g' ( temp highp float)
+0:13          Function Call: foo( ( global highp float)
+0:14      add second child into first child ( temp highp float)
+0:14        'f' ( global highp float)
+0:14        'g' ( temp highp float)
+0:15      add second child into first child ( temp highp float)
+0:15        'f' ( global highp float)
+0:15        direct index ( temp highp float)
+0:15          'gl_FragCoord' ( gl_FragCoord highp 4-component vector of float FragCoord)
+0:15          Constant:
+0:15            1 (const int)
+0:?   Linker Objects
+0:?     'f' ( global highp float)
+0:?     'a1' ( global highp float)
+0:?     'cout' ( out highp float)
+
+spv.unit2.frag
+Shader version: 410
+gl_FragCoord origin is upper left
+0:? Sequence
+0:12  Function Definition: foo( ( global highp float)
+0:12    Function Parameters: 
+0:14    Sequence
+0:14      Sequence
+0:14        move second child to first child ( temp highp float)
+0:14          'h2' ( temp highp float)
+0:14          add ( temp highp float)
+0:14            component-wise multiply ( temp highp float)
+0:14              Constant:
+0:14                2.000000
+0:14              'f' ( global highp float)
+0:14            'cin' ( smooth in highp float)
+0:15      Sequence
+0:15        move second child to first child ( temp highp float)
+0:15          'g2' ( temp highp float)
+0:15          Function Call: bar( ( global highp float)
+0:16      Branch: Return with expression
+0:16        add ( temp highp float)
+0:16          add ( temp highp float)
+0:16            'h2' ( temp highp float)
+0:16            'g2' ( temp highp float)
+0:16          direct index ( temp highp float)
+0:16            'gl_FragCoord' ( gl_FragCoord highp 4-component vector of float FragCoord)
+0:16            Constant:
+0:16              1 (const int)
+0:?   Linker Objects
+0:?     'a2' ( global highp float)
+0:?     'f' ( global highp float)
+0:?     'cout' ( out highp float)
+0:?     'cin' ( smooth in highp float)
+
+spv.unit3.frag
+Shader version: 460
+gl_FragCoord origin is upper left
+0:? Sequence
+0:4  Sequence
+0:4    move second child to first child ( temp highp float)
+0:4      'h3' ( global highp float)
+0:4      Constant:
+0:4        3.000000
+0:9  Function Definition: bar( ( global highp float)
+0:9    Function Parameters: 
+0:11    Sequence
+0:11      multiply second child into first child ( temp highp float)
+0:11        'h3' ( global highp float)
+0:11        'f' ( global highp float)
+0:12      Sequence
+0:12        move second child to first child ( temp highp float)
+0:12          'g3' ( temp highp float)
+0:12          component-wise multiply ( temp highp float)
+0:12            Constant:
+0:12              2.000000
+0:12            'h3' ( global highp float)
+0:13      move second child to first child ( temp highp float)
+0:13        'cout' ( out highp float)
+0:13        'g3' ( temp highp float)
+0:14      Branch: Return with expression
+0:14        add ( temp highp float)
+0:14          add ( temp highp float)
+0:14            'h3' ( global highp float)
+0:14            'g3' ( temp highp float)
+0:14          direct index ( temp highp float)
+0:14            'gl_FragCoord' ( gl_FragCoord highp 4-component vector of float FragCoord)
+0:14            Constant:
+0:14              1 (const int)
+0:?   Linker Objects
+0:?     'f' ( global highp float)
+0:?     'h3' ( global highp float)
+0:?     'cout' ( out highp float)
+0:?     'cin' ( smooth in highp float)
+
+
+Linked fragment stage:
+
+
+Shader version: 460
+gl_FragCoord origin is upper left
+0:? Sequence
+0:10  Function Definition: main( ( global void)
+0:10    Function Parameters: 
+0:12    Sequence
+0:12      move second child to first child ( temp highp float)
+0:12        'f' ( global highp float)
+0:12        Constant:
+0:12          10.000000
+0:13      Sequence
+0:13        move second child to first child ( temp highp float)
+0:13          'g' ( temp highp float)
+0:13          Function Call: foo( ( global highp float)
+0:14      add second child into first child ( temp highp float)
+0:14        'f' ( global highp float)
+0:14        'g' ( temp highp float)
+0:15      add second child into first child ( temp highp float)
+0:15        'f' ( global highp float)
+0:15        direct index ( temp highp float)
+0:15          'gl_FragCoord' ( gl_FragCoord highp 4-component vector of float FragCoord)
+0:15          Constant:
+0:15            1 (const int)
+0:12  Function Definition: foo( ( global highp float)
+0:12    Function Parameters: 
+0:14    Sequence
+0:14      Sequence
+0:14        move second child to first child ( temp highp float)
+0:14          'h2' ( temp highp float)
+0:14          add ( temp highp float)
+0:14            component-wise multiply ( temp highp float)
+0:14              Constant:
+0:14                2.000000
+0:14              'f' ( global highp float)
+0:14            'cin' ( smooth in highp float)
+0:15      Sequence
+0:15        move second child to first child ( temp highp float)
+0:15          'g2' ( temp highp float)
+0:15          Function Call: bar( ( global highp float)
+0:16      Branch: Return with expression
+0:16        add ( temp highp float)
+0:16          add ( temp highp float)
+0:16            'h2' ( temp highp float)
+0:16            'g2' ( temp highp float)
+0:16          direct index ( temp highp float)
+0:16            'gl_FragCoord' ( gl_FragCoord highp 4-component vector of float FragCoord)
+0:16            Constant:
+0:16              1 (const int)
+0:4  Sequence
+0:4    move second child to first child ( temp highp float)
+0:4      'h3' ( global highp float)
+0:4      Constant:
+0:4        3.000000
+0:9  Function Definition: bar( ( global highp float)
+0:9    Function Parameters: 
+0:11    Sequence
+0:11      multiply second child into first child ( temp highp float)
+0:11        'h3' ( global highp float)
+0:11        'f' ( global highp float)
+0:12      Sequence
+0:12        move second child to first child ( temp highp float)
+0:12          'g3' ( temp highp float)
+0:12          component-wise multiply ( temp highp float)
+0:12            Constant:
+0:12              2.000000
+0:12            'h3' ( global highp float)
+0:13      move second child to first child ( temp highp float)
+0:13        'cout' ( out highp float)
+0:13        'g3' ( temp highp float)
+0:14      Branch: Return with expression
+0:14        add ( temp highp float)
+0:14          add ( temp highp float)
+0:14            'h3' ( global highp float)
+0:14            'g3' ( temp highp float)
+0:14          direct index ( temp highp float)
+0:14            'gl_FragCoord' ( gl_FragCoord highp 4-component vector of float FragCoord)
+0:14            Constant:
+0:14              1 (const int)
+0:?   Linker Objects
+0:?     'f' ( global highp float)
+0:?     'a1' ( global highp float)
+0:?     'cout' ( out highp float)
+0:?     'a2' ( global highp float)
+0:?     'cin' ( smooth in highp float)
+0:?     'h3' ( global highp float)
+
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 69
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 25 37 57
+                              ExecutionMode 4 OriginUpperLeft
+                              Source GLSL 460
+                              Name 4  "main"
+                              Name 8  "foo("
+                              Name 10  "bar("
+                              Name 13  "h3"
+                              Name 15  "f"
+                              Name 18  "g"
+                              Name 25  "gl_FragCoord"
+                              Name 33  "h2"
+                              Name 37  "cin"
+                              Name 40  "g2"
+                              Name 53  "g3"
+                              Name 57  "cout"
+                              Name 67  "a1"
+                              Name 68  "a2"
+                              Decorate 25(gl_FragCoord) BuiltIn FragCoord
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeFunction 6(float)
+              12:             TypePointer Private 6(float)
+          13(h3):     12(ptr) Variable Private
+              14:    6(float) Constant 1077936128
+           15(f):     12(ptr) Variable Private
+              16:    6(float) Constant 1092616192
+              17:             TypePointer Function 6(float)
+              23:             TypeVector 6(float) 4
+              24:             TypePointer Input 23(fvec4)
+25(gl_FragCoord):     24(ptr) Variable Input
+              26:             TypeInt 32 0
+              27:     26(int) Constant 1
+              28:             TypePointer Input 6(float)
+              34:    6(float) Constant 1073741824
+         37(cin):     28(ptr) Variable Input
+              56:             TypePointer Output 6(float)
+        57(cout):     56(ptr) Variable Output
+          67(a1):     12(ptr) Variable Private
+          68(a2):     12(ptr) Variable Private
+         4(main):           2 Function None 3
+               5:             Label
+           18(g):     17(ptr) Variable Function
+                              Store 13(h3) 14
+                              Store 15(f) 16
+              19:    6(float) FunctionCall 8(foo()
+                              Store 18(g) 19
+              20:    6(float) Load 18(g)
+              21:    6(float) Load 15(f)
+              22:    6(float) FAdd 21 20
+                              Store 15(f) 22
+              29:     28(ptr) AccessChain 25(gl_FragCoord) 27
+              30:    6(float) Load 29
+              31:    6(float) Load 15(f)
+              32:    6(float) FAdd 31 30
+                              Store 15(f) 32
+                              Return
+                              FunctionEnd
+         8(foo():    6(float) Function None 7
+               9:             Label
+          33(h2):     17(ptr) Variable Function
+          40(g2):     17(ptr) Variable Function
+              35:    6(float) Load 15(f)
+              36:    6(float) FMul 34 35
+              38:    6(float) Load 37(cin)
+              39:    6(float) FAdd 36 38
+                              Store 33(h2) 39
+              41:    6(float) FunctionCall 10(bar()
+                              Store 40(g2) 41
+              42:    6(float) Load 33(h2)
+              43:    6(float) Load 40(g2)
+              44:    6(float) FAdd 42 43
+              45:     28(ptr) AccessChain 25(gl_FragCoord) 27
+              46:    6(float) Load 45
+              47:    6(float) FAdd 44 46
+                              ReturnValue 47
+                              FunctionEnd
+        10(bar():    6(float) Function None 7
+              11:             Label
+          53(g3):     17(ptr) Variable Function
+              50:    6(float) Load 15(f)
+              51:    6(float) Load 13(h3)
+              52:    6(float) FMul 51 50
+                              Store 13(h3) 52
+              54:    6(float) Load 13(h3)
+              55:    6(float) FMul 34 54
+                              Store 53(g3) 55
+              58:    6(float) Load 53(g3)
+                              Store 57(cout) 58
+              59:    6(float) Load 13(h3)
+              60:    6(float) Load 53(g3)
+              61:    6(float) FAdd 59 60
+              62:     28(ptr) AccessChain 25(gl_FragCoord) 27
+              63:    6(float) Load 62
+              64:    6(float) FAdd 61 63
+                              ReturnValue 64
+                              FunctionEnd
diff --git a/Test/baseResults/spv.variableArrayIndex.frag.out b/Test/baseResults/spv.variableArrayIndex.frag.out
old mode 100755
new mode 100644
index b4d3fe0..e0010df
--- a/Test/baseResults/spv.variableArrayIndex.frag.out
+++ b/Test/baseResults/spv.variableArrayIndex.frag.out
@@ -1,8 +1,6 @@
 spv.variableArrayIndex.frag
-Warning, version 400 is not yet complete; most version-specific features are present, but some are missing.
-
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 93
 
                               Capability Shader
@@ -38,6 +36,7 @@
                               Decorate 20(foo3) Flat
                               Decorate 34(foo2) Flat
                               Decorate 36(foo) Flat
+                              Decorate 54(gl_FragColor) Location 0
                               Decorate 59(samp2D) DescriptorSet 0
                2:             TypeVoid
                3:             TypeFunction 2
diff --git a/Test/baseResults/spv.varyingArray.frag.out b/Test/baseResults/spv.varyingArray.frag.out
old mode 100755
new mode 100644
index 58833ea..0acfdd9
--- a/Test/baseResults/spv.varyingArray.frag.out
+++ b/Test/baseResults/spv.varyingArray.frag.out
@@ -1,6 +1,6 @@
 spv.varyingArray.frag
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 61
 
                               Capability Shader
@@ -18,6 +18,7 @@
                               Name 45  "gl_FragColor"
                               Name 48  "foo"
                               Decorate 13(texSampler2D) DescriptorSet 0
+                              Decorate 45(gl_FragColor) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
diff --git a/Test/baseResults/spv.varyingArrayIndirect.frag.out b/Test/baseResults/spv.varyingArrayIndirect.frag.out
old mode 100755
new mode 100644
index 9c01840..ffe7859
--- a/Test/baseResults/spv.varyingArrayIndirect.frag.out
+++ b/Test/baseResults/spv.varyingArrayIndirect.frag.out
@@ -1,6 +1,6 @@
 spv.varyingArrayIndirect.frag
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 70
 
                               Capability Shader
@@ -22,6 +22,7 @@
                               Decorate 13(texSampler2D) DescriptorSet 0
                               Decorate 22(b) Flat
                               Decorate 31(a) Flat
+                              Decorate 56(gl_FragColor) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
diff --git a/Test/baseResults/spv.vecMatConstruct.frag.out b/Test/baseResults/spv.vecMatConstruct.frag.out
new file mode 100644
index 0000000..57ecd67
--- /dev/null
+++ b/Test/baseResults/spv.vecMatConstruct.frag.out
@@ -0,0 +1,87 @@
+spv.vecMatConstruct.frag
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 62
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main"
+                              ExecutionMode 4 OriginUpperLeft
+                              Source GLSL 450
+                              Name 4  "main"
+                              Name 9  "v2"
+                              Name 13  "m"
+                              Name 19  "v3"
+                              Name 27  "v4"
+                              Name 37  "iv2"
+                              Name 45  "iv3"
+                              Name 54  "iv4"
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 2
+               8:             TypePointer Function 7(fvec2)
+              10:             TypeVector 6(float) 3
+              11:             TypeMatrix 10(fvec3) 4
+              12:             TypePointer Function 11
+              18:             TypePointer Function 10(fvec3)
+              25:             TypeVector 6(float) 4
+              26:             TypePointer Function 25(fvec4)
+              34:             TypeInt 32 1
+              35:             TypeVector 34(int) 2
+              36:             TypePointer Function 35(ivec2)
+              43:             TypeVector 34(int) 3
+              44:             TypePointer Function 43(ivec3)
+              52:             TypeVector 34(int) 4
+              53:             TypePointer Function 52(ivec4)
+         4(main):           2 Function None 3
+               5:             Label
+           9(v2):      8(ptr) Variable Function
+           13(m):     12(ptr) Variable Function
+          19(v3):     18(ptr) Variable Function
+          27(v4):     26(ptr) Variable Function
+         37(iv2):     36(ptr) Variable Function
+         45(iv3):     44(ptr) Variable Function
+         54(iv4):     53(ptr) Variable Function
+              14:          11 Load 13(m)
+              15:    6(float) CompositeExtract 14 0 0
+              16:    6(float) CompositeExtract 14 0 1
+              17:    7(fvec2) CompositeConstruct 15 16
+                              Store 9(v2) 17
+              20:          11 Load 13(m)
+              21:    6(float) CompositeExtract 20 0 0
+              22:    6(float) CompositeExtract 20 0 1
+              23:    6(float) CompositeExtract 20 0 2
+              24:   10(fvec3) CompositeConstruct 21 22 23
+                              Store 19(v3) 24
+              28:          11 Load 13(m)
+              29:    6(float) CompositeExtract 28 0 0
+              30:    6(float) CompositeExtract 28 0 1
+              31:    6(float) CompositeExtract 28 0 2
+              32:    6(float) CompositeExtract 28 1 0
+              33:   25(fvec4) CompositeConstruct 29 30 31 32
+                              Store 27(v4) 33
+              38:          11 Load 13(m)
+              39:    6(float) CompositeExtract 38 0 0
+              40:    6(float) CompositeExtract 38 0 1
+              41:    7(fvec2) CompositeConstruct 39 40
+              42:   35(ivec2) ConvertFToS 41
+                              Store 37(iv2) 42
+              46:          11 Load 13(m)
+              47:    6(float) CompositeExtract 46 0 0
+              48:    6(float) CompositeExtract 46 0 1
+              49:    6(float) CompositeExtract 46 0 2
+              50:   10(fvec3) CompositeConstruct 47 48 49
+              51:   43(ivec3) ConvertFToS 50
+                              Store 45(iv3) 51
+              55:          11 Load 13(m)
+              56:    6(float) CompositeExtract 55 0 0
+              57:    6(float) CompositeExtract 55 0 1
+              58:    6(float) CompositeExtract 55 0 2
+              59:    6(float) CompositeExtract 55 1 0
+              60:   25(fvec4) CompositeConstruct 56 57 58 59
+              61:   52(ivec4) ConvertFToS 60
+                              Store 54(iv4) 61
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.viewportArray2.tesc.out b/Test/baseResults/spv.viewportArray2.tesc.out
index fdfa2b8..b14179e 100644
--- a/Test/baseResults/spv.viewportArray2.tesc.out
+++ b/Test/baseResults/spv.viewportArray2.tesc.out
@@ -1,58 +1,62 @@
 spv.viewportArray2.tesc
-Warning, version 450 is not yet complete; most version-specific features are present, but some are missing.
+error: SPIRV-Tools Validation Errors
+error: Vulkan spec allows BuiltIn ViewportIndex to be used only with Vertex, TessellationEvaluation, Geometry, or Fragment execution models. ID <0> (OpStore) is referencing ID <22> (OpVariable) which is decorated with BuiltIn ViewportIndex in function <4> called with execution model TessellationControl.
+  OpStore %gl_ViewportIndex %int_2
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 25
 
+                              Capability Geometry
                               Capability Tessellation
                               Capability MultiViewport
                               Capability ShaderViewportIndexLayerNV
                               Capability ShaderViewportMaskNV
+                              Extension  "SPV_EXT_shader_viewport_index_layer"
                               Extension  "SPV_NV_viewport_array2"
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint TessellationControl 4  "main" 14 16
+                              EntryPoint TessellationControl 4  "main" 14 16 22 24
                               ExecutionMode 4 OutputVertices 4
                               Source GLSL 450
                               SourceExtension  "GL_NV_viewport_array2"
                               Name 4  "main"
                               Name 10  "gl_PerVertex"
-                              MemberName 10(gl_PerVertex) 0  "gl_ViewportIndex"
-                              MemberName 10(gl_PerVertex) 1  "gl_Layer"
-                              MemberName 10(gl_PerVertex) 2  "gl_ViewportMask"
+                              MemberName 10(gl_PerVertex) 0  "gl_ViewportMask"
                               Name 14  "gl_out"
                               Name 16  "gl_InvocationID"
-                              MemberDecorate 10(gl_PerVertex) 0 BuiltIn ViewportIndex
-                              MemberDecorate 10(gl_PerVertex) 1 BuiltIn Layer
-                              MemberDecorate 10(gl_PerVertex) 1 ViewportRelativeNV
-                              MemberDecorate 10(gl_PerVertex) 2 BuiltIn ViewportMaskNV
+                              Name 22  "gl_ViewportIndex"
+                              Name 24  "gl_Layer"
+                              MemberDecorate 10(gl_PerVertex) 0 BuiltIn ViewportMaskNV
                               Decorate 10(gl_PerVertex) Block
                               Decorate 16(gl_InvocationID) BuiltIn InvocationId
+                              Decorate 22(gl_ViewportIndex) BuiltIn ViewportIndex
+                              Decorate 24(gl_Layer) BuiltIn Layer
+                              Decorate 24(gl_Layer) ViewportRelativeNV
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 32 1
                7:             TypeInt 32 0
                8:      7(int) Constant 2
                9:             TypeArray 6(int) 8
-10(gl_PerVertex):             TypeStruct 6(int) 6(int) 9
+10(gl_PerVertex):             TypeStruct 9
               11:      7(int) Constant 4
               12:             TypeArray 10(gl_PerVertex) 11
               13:             TypePointer Output 12
       14(gl_out):     13(ptr) Variable Output
               15:             TypePointer Input 6(int)
 16(gl_InvocationID):     15(ptr) Variable Input
-              18:      6(int) Constant 2
-              19:      6(int) Constant 0
-              20:      6(int) Constant 1
-              21:             TypePointer Output 6(int)
+              18:      6(int) Constant 0
+              19:      6(int) Constant 1
+              20:             TypePointer Output 6(int)
+22(gl_ViewportIndex):     20(ptr) Variable Output
+              23:      6(int) Constant 2
+    24(gl_Layer):     20(ptr) Variable Output
          4(main):           2 Function None 3
                5:             Label
               17:      6(int) Load 16(gl_InvocationID)
-              22:     21(ptr) AccessChain 14(gl_out) 17 18 19
-                              Store 22 20
-              23:      6(int) Load 16(gl_InvocationID)
-              24:     21(ptr) AccessChain 14(gl_out) 23 19
-                              Store 24 18
+              21:     20(ptr) AccessChain 14(gl_out) 17 18 18
+                              Store 21 19
+                              Store 22(gl_ViewportIndex) 23
                               Return
                               FunctionEnd
diff --git a/Test/baseResults/spv.viewportArray2.vert.out b/Test/baseResults/spv.viewportArray2.vert.out
index 766685f..df116cf 100644
--- a/Test/baseResults/spv.viewportArray2.vert.out
+++ b/Test/baseResults/spv.viewportArray2.vert.out
@@ -1,8 +1,6 @@
 spv.viewportArray2.vert
-Warning, version 450 is not yet complete; most version-specific features are present, but some are missing.
-
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 19
 
                               Capability Shader
@@ -10,6 +8,7 @@
                               Capability MultiViewport
                               Capability ShaderViewportIndexLayerNV
                               Capability ShaderViewportMaskNV
+                              Extension  "SPV_EXT_shader_viewport_index_layer"
                               Extension  "SPV_NV_viewport_array2"
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
diff --git a/Test/baseResults/spv.voidFunction.frag.out b/Test/baseResults/spv.voidFunction.frag.out
old mode 100755
new mode 100644
index 4434861..fbaee87
--- a/Test/baseResults/spv.voidFunction.frag.out
+++ b/Test/baseResults/spv.voidFunction.frag.out
@@ -1,8 +1,6 @@
 spv.voidFunction.frag
-Warning, version 400 is not yet complete; most version-specific features are present, but some are missing.
-
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 43
 
                               Capability Shader
@@ -20,6 +18,7 @@
                               Name 37  "gl_FragColor"
                               Name 40  "BaseColor"
                               Name 42  "d"
+                              Decorate 37(gl_FragColor) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
               10:             TypeFloat 32
diff --git a/Test/baseResults/spv.vulkan100.subgroupArithmetic.comp.out b/Test/baseResults/spv.vulkan100.subgroupArithmetic.comp.out
new file mode 100644
index 0000000..9955053
--- /dev/null
+++ b/Test/baseResults/spv.vulkan100.subgroupArithmetic.comp.out
@@ -0,0 +1,305 @@
+spv.vulkan100.subgroupArithmetic.comp
+ERROR: 0:19: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:20: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:21: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:22: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:24: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:25: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:26: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:27: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:29: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:30: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:31: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:32: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:34: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:35: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:36: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:37: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:39: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:40: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:41: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:42: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:44: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:45: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:46: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:47: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:49: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:50: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:51: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:52: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:54: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:55: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:56: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:57: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:59: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:60: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:61: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:62: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:64: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:65: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:66: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:67: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:69: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:70: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:71: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:72: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:74: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:75: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:76: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:77: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:79: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:80: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:81: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:82: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:84: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:85: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:86: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:87: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:89: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:90: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:91: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:92: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:94: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:95: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:96: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:97: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:99: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:100: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:101: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:102: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:104: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:105: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:106: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:107: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:109: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:110: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:111: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:112: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:114: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:115: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:116: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:117: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:119: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:120: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:121: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:122: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:124: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:125: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:126: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:127: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:129: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:130: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:131: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:132: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:134: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:135: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:136: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:137: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:139: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:140: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:141: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:142: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:144: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:145: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:146: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:147: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:149: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:150: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:151: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:152: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:154: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:155: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:156: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:157: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:159: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:160: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:161: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:162: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:164: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:165: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:166: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:167: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:169: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:170: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:171: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:172: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:174: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:175: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:176: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:177: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:179: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:180: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:181: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:182: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:184: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:185: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:186: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:187: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:189: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:190: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:191: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:192: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:194: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:195: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:196: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:197: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:199: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:200: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:201: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:202: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:204: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:205: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:206: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:207: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:209: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:210: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:211: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:212: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:214: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:215: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:216: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:217: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:219: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:220: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:221: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:222: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:224: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:225: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:226: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:227: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:229: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:230: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:231: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:232: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:234: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:235: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:236: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:237: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:239: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:240: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:241: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:242: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:244: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:245: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:246: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:247: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:249: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:250: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:251: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:252: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:254: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:255: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:256: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:257: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:259: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:260: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:261: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:262: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:264: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:265: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:266: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:267: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:269: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:270: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:271: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:272: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:274: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:275: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:276: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:277: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:279: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:280: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:281: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:282: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:284: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:285: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:286: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:287: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:289: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:290: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:291: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:292: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:294: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:295: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:296: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:297: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:299: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:300: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:301: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:302: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:304: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:305: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:306: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:307: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:309: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:310: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:311: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:312: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:314: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:315: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:316: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:317: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:319: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:320: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:321: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:322: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:324: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:325: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:326: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:327: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:329: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:330: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:331: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:332: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:334: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:335: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:336: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:337: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:339: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:340: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:341: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:342: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:344: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:345: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:346: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:347: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:349: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:350: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:351: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:352: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:354: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:355: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:356: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:357: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:359: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:360: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:361: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:362: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:364: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:365: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:366: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:367: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:369: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:370: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:371: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:372: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:374: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:375: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:376: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:377: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:379: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:380: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:381: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:382: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:384: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:385: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:386: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:387: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:389: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:390: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:391: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:392: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 300 compilation errors.  No code generated.
+
+
+SPIR-V is not generated for failed compile or link
diff --git a/Test/baseResults/spv.vulkan100.subgroupPartitioned.comp.out b/Test/baseResults/spv.vulkan100.subgroupPartitioned.comp.out
new file mode 100644
index 0000000..3116ac1
--- /dev/null
+++ b/Test/baseResults/spv.vulkan100.subgroupPartitioned.comp.out
@@ -0,0 +1,326 @@
+spv.vulkan100.subgroupPartitioned.comp
+ERROR: 0:19: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:21: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:22: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:23: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:24: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:26: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:27: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:28: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:29: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:31: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:32: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:33: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:34: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:36: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:37: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:38: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:39: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:41: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:42: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:43: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:44: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:46: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:47: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:48: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:49: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:51: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:52: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:53: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:54: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:56: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:57: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:58: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:59: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:61: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:62: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:63: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:64: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:66: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:67: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:68: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:69: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:71: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:72: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:73: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:74: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:76: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:77: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:78: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:79: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:81: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:82: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:83: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:84: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:86: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:87: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:88: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:89: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:91: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:92: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:93: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:94: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:96: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:97: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:98: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:99: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:101: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:102: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:103: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:104: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:106: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:107: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:108: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:109: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:111: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:112: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:113: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:114: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:116: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:117: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:118: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:119: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:121: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:122: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:123: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:124: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:126: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:127: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:128: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:129: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:131: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:132: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:133: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:134: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:136: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:137: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:138: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:139: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:141: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:142: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:143: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:144: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:146: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:147: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:148: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:149: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:151: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:152: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:153: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:154: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:156: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:157: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:158: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:159: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:161: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:162: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:163: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:164: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:166: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:167: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:168: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:169: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:171: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:172: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:173: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:174: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:176: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:177: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:178: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:179: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:181: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:182: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:183: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:184: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:186: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:187: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:188: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:189: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:191: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:192: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:193: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:194: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:196: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:197: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:198: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:199: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:201: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:202: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:203: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:204: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:206: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:207: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:208: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:209: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:211: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:212: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:213: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:214: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:216: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:217: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:218: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:219: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:221: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:222: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:223: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:224: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:226: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:227: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:228: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:229: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:231: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:232: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:233: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:234: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:236: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:237: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:238: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:239: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:241: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:242: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:243: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:244: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:246: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:247: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:248: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:249: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:251: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:252: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:253: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:254: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:256: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:257: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:258: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:259: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:261: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:262: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:263: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:264: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:266: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:267: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:268: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:269: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:271: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:272: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:273: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:274: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:276: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:277: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:278: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:279: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:281: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:282: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:283: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:284: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:286: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:287: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:288: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:289: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:291: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:292: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:293: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:294: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:296: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:297: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:298: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:299: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:301: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:302: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:303: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:304: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:306: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:307: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:308: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:309: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:311: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:312: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:313: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:314: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:316: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:317: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:318: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:319: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:321: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:322: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:323: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:324: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:326: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:327: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:328: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:329: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:331: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:332: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:333: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:334: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:336: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:337: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:338: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:339: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:341: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:342: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:343: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:344: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:346: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:347: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:348: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:349: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:351: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:352: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:353: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:354: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:356: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:357: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:358: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:359: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:361: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:362: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:363: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:364: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:366: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:367: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:368: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:369: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:371: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:372: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:373: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:374: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:376: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:377: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:378: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:379: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:381: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:382: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:383: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:384: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:386: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:387: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:388: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:389: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:391: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:392: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:393: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:394: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:396: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:397: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:398: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:399: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:401: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:402: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:403: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:404: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:406: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:407: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:408: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:409: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:411: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:412: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:413: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:414: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:416: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:417: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:418: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 0:419: 'subgroup op' : requires SPIR-V 1.3 
+ERROR: 321 compilation errors.  No code generated.
+
+
+SPIR-V is not generated for failed compile or link
diff --git a/Test/baseResults/spv.vulkan110.int16.frag.out b/Test/baseResults/spv.vulkan110.int16.frag.out
new file mode 100644
index 0000000..1a51c26
--- /dev/null
+++ b/Test/baseResults/spv.vulkan110.int16.frag.out
@@ -0,0 +1,745 @@
+spv.vulkan110.int16.frag
+error: SPIRV-Tools Validation Errors
+error: Capability Float16 is not allowed by Vulkan 1.1 specification (or requires extension)
+  OpCapability Float16
+
+// Module Version 10300
+// Generated by (magic number): 80007
+// Id's are bound by 523
+
+                              Capability Shader
+                              Capability Float16
+                              Capability Float64
+                              Capability Int64
+                              Capability Int16
+                              Capability Int8
+                              Capability StorageUniform16
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main"
+                              ExecutionMode 4 OriginUpperLeft
+                              Source GLSL 450
+                              SourceExtension  "GL_EXT_shader_explicit_arithmetic_types"
+                              SourceExtension  "GL_EXT_shader_explicit_arithmetic_types_float16"
+                              SourceExtension  "GL_EXT_shader_explicit_arithmetic_types_float32"
+                              SourceExtension  "GL_EXT_shader_explicit_arithmetic_types_float64"
+                              SourceExtension  "GL_EXT_shader_explicit_arithmetic_types_int16"
+                              SourceExtension  "GL_EXT_shader_explicit_arithmetic_types_int32"
+                              SourceExtension  "GL_EXT_shader_explicit_arithmetic_types_int64"
+                              SourceExtension  "GL_EXT_shader_explicit_arithmetic_types_int8"
+                              Name 4  "main"
+                              Name 6  "literal("
+                              Name 8  "typeCast16("
+                              Name 10  "operators("
+                              Name 12  "builtinFuncs("
+                              Name 16  "i16"
+                              Name 24  "Uniforms"
+                              MemberName 24(Uniforms) 0  "index"
+                              Name 26  ""
+                              Name 33  "indexable"
+                              Name 38  "u16"
+                              Name 46  "indexable"
+                              Name 51  "i32v"
+                              Name 54  "i16v"
+                              Name 59  "u16v"
+                              Name 67  "u32v"
+                              Name 74  "i64v"
+                              Name 80  "u64v"
+                              Name 94  "f16v"
+                              Name 100  "f32v"
+                              Name 106  "f64v"
+                              Name 154  "i8v"
+                              Name 163  "u8v"
+                              Name 176  "bv"
+                              Name 195  "u16v"
+                              Name 200  "i16"
+                              Name 220  "i"
+                              Name 227  "uv"
+                              Name 243  "i64"
+                              Name 281  "b"
+                              Name 343  "i16v"
+                              Name 346  "i16"
+                              Name 356  "u16v"
+                              Name 358  "u16"
+                              Name 428  "i32"
+                              Name 431  "i64"
+                              Name 434  "i16v4"
+                              Name 437  "u32"
+                              Name 438  "u16v2"
+                              Name 442  "u64"
+                              Name 445  "u16v4"
+                              Name 457  "bv"
+                              Name 518  "Block"
+                              MemberName 518(Block) 0  "i16"
+                              MemberName 518(Block) 1  "i16v2"
+                              MemberName 518(Block) 2  "i16v3"
+                              MemberName 518(Block) 3  "i16v4"
+                              MemberName 518(Block) 4  "u16"
+                              MemberName 518(Block) 5  "u16v2"
+                              MemberName 518(Block) 6  "u16v3"
+                              MemberName 518(Block) 7  "u16v4"
+                              Name 520  "block"
+                              Name 521  "si16"
+                              Name 522  "su16"
+                              MemberDecorate 24(Uniforms) 0 Offset 0
+                              Decorate 24(Uniforms) Block
+                              Decorate 26 DescriptorSet 0
+                              Decorate 26 Binding 0
+                              MemberDecorate 518(Block) 0 Offset 0
+                              MemberDecorate 518(Block) 1 Offset 4
+                              MemberDecorate 518(Block) 2 Offset 8
+                              MemberDecorate 518(Block) 3 Offset 16
+                              MemberDecorate 518(Block) 4 Offset 24
+                              MemberDecorate 518(Block) 5 Offset 28
+                              MemberDecorate 518(Block) 6 Offset 32
+                              MemberDecorate 518(Block) 7 Offset 40
+                              Decorate 518(Block) Block
+                              Decorate 520(block) DescriptorSet 0
+                              Decorate 520(block) Binding 1
+                              Decorate 521(si16) SpecId 100
+                              Decorate 522(su16) SpecId 101
+               2:             TypeVoid
+               3:             TypeFunction 2
+              14:             TypeInt 16 1
+              15:             TypePointer Function 14(int16_t)
+              17:             TypeInt 32 0
+              18:     17(int) Constant 3
+              19:             TypeArray 14(int16_t) 18
+              20: 14(int16_t) Constant 4294962927
+              21: 14(int16_t) Constant 4294967295
+              22: 14(int16_t) Constant 16384
+              23:          19 ConstantComposite 20 21 22
+    24(Uniforms):             TypeStruct 17(int)
+              25:             TypePointer Uniform 24(Uniforms)
+              26:     25(ptr) Variable Uniform
+              27:             TypeInt 32 1
+              28:     27(int) Constant 0
+              29:             TypePointer Uniform 17(int)
+              32:             TypePointer Function 19
+              36:             TypeInt 16 0
+              37:             TypePointer Function 36(int16_t)
+              39:             TypeArray 36(int16_t) 18
+              40: 36(int16_t) Constant 65535
+              41: 36(int16_t) Constant 32767
+              42:          39 ConstantComposite 40 40 41
+              45:             TypePointer Function 39
+              49:             TypeVector 27(int) 2
+              50:             TypePointer Function 49(ivec2)
+              52:             TypeVector 14(int16_t) 2
+              53:             TypePointer Function 52(i16vec2)
+              57:             TypeVector 36(int16_t) 2
+              58:             TypePointer Function 57(i16vec2)
+              61:             TypeVector 17(int) 2
+              66:             TypePointer Function 61(ivec2)
+              71:             TypeInt 64 1
+              72:             TypeVector 71(int64_t) 2
+              73:             TypePointer Function 72(i64vec2)
+              77:             TypeInt 64 0
+              78:             TypeVector 77(int64_t) 2
+              79:             TypePointer Function 78(i64vec2)
+              91:             TypeFloat 16
+              92:             TypeVector 91(float16_t) 2
+              93:             TypePointer Function 92(f16vec2)
+              97:             TypeFloat 32
+              98:             TypeVector 97(float) 2
+              99:             TypePointer Function 98(fvec2)
+             103:             TypeFloat 64
+             104:             TypeVector 103(float64_t) 2
+             105:             TypePointer Function 104(f64vec2)
+             151:             TypeInt 8 1
+             152:             TypeVector 151(int8_t) 2
+             153:             TypePointer Function 152(i8vec2)
+             158:             TypeInt 8 0
+             159:             TypeVector 158(int8_t) 2
+             162:             TypePointer Function 159(i8vec2)
+             173:             TypeBool
+             174:             TypeVector 173(bool) 2
+             175:             TypePointer Function 174(bvec2)
+             178: 14(int16_t) Constant 0
+             179: 14(int16_t) Constant 1
+             180: 52(i16vec2) ConstantComposite 178 178
+             181: 52(i16vec2) ConstantComposite 179 179
+             184: 36(int16_t) Constant 0
+             185: 36(int16_t) Constant 1
+             186: 57(i16vec2) ConstantComposite 184 184
+             187: 57(i16vec2) ConstantComposite 185 185
+             193:             TypeVector 36(int16_t) 3
+             194:             TypePointer Function 193(i16vec3)
+             197:             TypeVector 14(int16_t) 3
+             219:             TypePointer Function 27(int)
+             225:             TypeVector 17(int) 3
+             226:             TypePointer Function 225(ivec3)
+             242:             TypePointer Function 71(int64_t)
+             264:     17(int) Constant 1
+             270:     17(int) Constant 2
+             276:             TypeVector 27(int) 3
+             280:             TypePointer Function 173(bool)
+             282:     17(int) Constant 0
+             296:             TypePointer Function 17(int)
+             354: 52(i16vec2) ConstantComposite 21 21
+             363:193(i16vec3) ConstantComposite 184 184 184
+             405:   173(bool) ConstantTrue
+             412:   173(bool) ConstantFalse
+             413:  174(bvec2) ConstantComposite 412 412
+             425:             TypeVector 173(bool) 3
+             426:  425(bvec3) ConstantComposite 412 412 412
+             432:             TypeVector 14(int16_t) 4
+             433:             TypePointer Function 432(i16vec4)
+             441:             TypePointer Function 77(int64_t)
+             443:             TypeVector 36(int16_t) 4
+             444:             TypePointer Function 443(i16vec4)
+             456:             TypePointer Function 425(bvec3)
+      518(Block):             TypeStruct 14(int16_t) 52(i16vec2) 197(i16vec3) 432(i16vec4) 36(int16_t) 57(i16vec2) 193(i16vec3) 443(i16vec4)
+             519:             TypePointer Uniform 518(Block)
+      520(block):    519(ptr) Variable Uniform
+       521(si16): 14(int16_t) SpecConstant 4294967286
+       522(su16): 36(int16_t) SpecConstant 20
+         4(main):           2 Function None 3
+               5:             Label
+                              Return
+                              FunctionEnd
+     6(literal():           2 Function None 3
+               7:             Label
+         16(i16):     15(ptr) Variable Function
+   33(indexable):     32(ptr) Variable Function
+         38(u16):     37(ptr) Variable Function
+   46(indexable):     45(ptr) Variable Function
+              30:     29(ptr) AccessChain 26 28
+              31:     17(int) Load 30
+                              Store 33(indexable) 23
+              34:     15(ptr) AccessChain 33(indexable) 31
+              35: 14(int16_t) Load 34
+                              Store 16(i16) 35
+              43:     29(ptr) AccessChain 26 28
+              44:     17(int) Load 43
+                              Store 46(indexable) 42
+              47:     37(ptr) AccessChain 46(indexable) 44
+              48: 36(int16_t) Load 47
+                              Store 38(u16) 48
+                              Return
+                              FunctionEnd
+  8(typeCast16():           2 Function None 3
+               9:             Label
+        51(i32v):     50(ptr) Variable Function
+        54(i16v):     53(ptr) Variable Function
+        59(u16v):     58(ptr) Variable Function
+        67(u32v):     66(ptr) Variable Function
+        74(i64v):     73(ptr) Variable Function
+        80(u64v):     79(ptr) Variable Function
+        94(f16v):     93(ptr) Variable Function
+       100(f32v):     99(ptr) Variable Function
+       106(f64v):    105(ptr) Variable Function
+        154(i8v):    153(ptr) Variable Function
+        163(u8v):    162(ptr) Variable Function
+         176(bv):    175(ptr) Variable Function
+              55: 52(i16vec2) Load 54(i16v)
+              56:   49(ivec2) SConvert 55
+                              Store 51(i32v) 56
+              60: 57(i16vec2) Load 59(u16v)
+              62:   61(ivec2) UConvert 60
+              63:   49(ivec2) Bitcast 62
+                              Store 51(i32v) 63
+              64: 52(i16vec2) Load 54(i16v)
+              65: 57(i16vec2) Bitcast 64
+                              Store 59(u16v) 65
+              68: 52(i16vec2) Load 54(i16v)
+              69:   49(ivec2) SConvert 68
+              70:   61(ivec2) Bitcast 69
+                              Store 67(u32v) 70
+              75: 52(i16vec2) Load 54(i16v)
+              76: 72(i64vec2) SConvert 75
+                              Store 74(i64v) 76
+              81: 52(i16vec2) Load 54(i16v)
+              82: 72(i64vec2) SConvert 81
+              83: 78(i64vec2) Bitcast 82
+                              Store 80(u64v) 83
+              84: 57(i16vec2) Load 59(u16v)
+              85:   61(ivec2) UConvert 84
+                              Store 67(u32v) 85
+              86: 57(i16vec2) Load 59(u16v)
+              87: 78(i64vec2) UConvert 86
+              88: 72(i64vec2) Bitcast 87
+                              Store 74(i64v) 88
+              89: 57(i16vec2) Load 59(u16v)
+              90: 78(i64vec2) UConvert 89
+                              Store 80(u64v) 90
+              95: 52(i16vec2) Load 54(i16v)
+              96: 92(f16vec2) ConvertSToF 95
+                              Store 94(f16v) 96
+             101: 52(i16vec2) Load 54(i16v)
+             102:   98(fvec2) ConvertSToF 101
+                              Store 100(f32v) 102
+             107: 52(i16vec2) Load 54(i16v)
+             108:104(f64vec2) ConvertSToF 107
+                              Store 106(f64v) 108
+             109: 57(i16vec2) Load 59(u16v)
+             110: 92(f16vec2) ConvertUToF 109
+                              Store 94(f16v) 110
+             111: 57(i16vec2) Load 59(u16v)
+             112:   98(fvec2) ConvertUToF 111
+                              Store 100(f32v) 112
+             113: 57(i16vec2) Load 59(u16v)
+             114:104(f64vec2) ConvertUToF 113
+                              Store 106(f64v) 114
+             115: 52(i16vec2) Load 54(i16v)
+             116:   49(ivec2) SConvert 115
+                              Store 51(i32v) 116
+             117: 57(i16vec2) Load 59(u16v)
+             118:   61(ivec2) UConvert 117
+             119:   49(ivec2) Bitcast 118
+                              Store 51(i32v) 119
+             120: 52(i16vec2) Load 54(i16v)
+             121: 57(i16vec2) Bitcast 120
+                              Store 59(u16v) 121
+             122: 52(i16vec2) Load 54(i16v)
+             123:   49(ivec2) SConvert 122
+             124:   61(ivec2) Bitcast 123
+                              Store 67(u32v) 124
+             125: 52(i16vec2) Load 54(i16v)
+             126: 72(i64vec2) SConvert 125
+                              Store 74(i64v) 126
+             127: 52(i16vec2) Load 54(i16v)
+             128: 72(i64vec2) SConvert 127
+             129: 78(i64vec2) Bitcast 128
+                              Store 80(u64v) 129
+             130: 57(i16vec2) Load 59(u16v)
+             131:   61(ivec2) UConvert 130
+                              Store 67(u32v) 131
+             132: 57(i16vec2) Load 59(u16v)
+             133: 78(i64vec2) UConvert 132
+             134: 72(i64vec2) Bitcast 133
+                              Store 74(i64v) 134
+             135: 57(i16vec2) Load 59(u16v)
+             136: 78(i64vec2) UConvert 135
+             137: 72(i64vec2) Bitcast 136
+             138: 78(i64vec2) Bitcast 137
+                              Store 80(u64v) 138
+             139: 52(i16vec2) Load 54(i16v)
+             140: 92(f16vec2) ConvertSToF 139
+                              Store 94(f16v) 140
+             141: 52(i16vec2) Load 54(i16v)
+             142:   98(fvec2) ConvertSToF 141
+                              Store 100(f32v) 142
+             143: 52(i16vec2) Load 54(i16v)
+             144:104(f64vec2) ConvertSToF 143
+                              Store 106(f64v) 144
+             145: 57(i16vec2) Load 59(u16v)
+             146: 92(f16vec2) ConvertUToF 145
+                              Store 94(f16v) 146
+             147: 57(i16vec2) Load 59(u16v)
+             148:   98(fvec2) ConvertUToF 147
+                              Store 100(f32v) 148
+             149: 57(i16vec2) Load 59(u16v)
+             150:104(f64vec2) ConvertUToF 149
+                              Store 106(f64v) 150
+             155: 52(i16vec2) Load 54(i16v)
+             156: 152(i8vec2) SConvert 155
+                              Store 154(i8v) 156
+             157: 57(i16vec2) Load 59(u16v)
+             160: 159(i8vec2) UConvert 157
+             161: 152(i8vec2) Bitcast 160
+                              Store 154(i8v) 161
+             164: 52(i16vec2) Load 54(i16v)
+             165: 152(i8vec2) SConvert 164
+             166: 159(i8vec2) Bitcast 165
+                              Store 163(u8v) 166
+             167: 57(i16vec2) Load 59(u16v)
+             168: 159(i8vec2) UConvert 167
+                              Store 163(u8v) 168
+             169: 57(i16vec2) Load 59(u16v)
+             170: 159(i8vec2) UConvert 169
+             171: 57(i16vec2) UConvert 170
+             172: 52(i16vec2) Bitcast 171
+                              Store 54(i16v) 172
+             177:  174(bvec2) Load 176(bv)
+             182: 52(i16vec2) Select 177 181 180
+                              Store 54(i16v) 182
+             183:  174(bvec2) Load 176(bv)
+             188: 57(i16vec2) Select 183 187 186
+                              Store 59(u16v) 188
+             189: 52(i16vec2) Load 54(i16v)
+             190:  174(bvec2) INotEqual 189 186
+                              Store 176(bv) 190
+             191: 57(i16vec2) Load 59(u16v)
+             192:  174(bvec2) INotEqual 191 186
+                              Store 176(bv) 192
+                              Return
+                              FunctionEnd
+  10(operators():           2 Function None 3
+              11:             Label
+       195(u16v):    194(ptr) Variable Function
+        200(i16):     15(ptr) Variable Function
+          220(i):    219(ptr) Variable Function
+         227(uv):    226(ptr) Variable Function
+        243(i64):    242(ptr) Variable Function
+          281(b):    280(ptr) Variable Function
+             196:193(i16vec3) Load 195(u16v)
+             198:197(i16vec3) CompositeConstruct 179 179 179
+             199:193(i16vec3) IAdd 196 198
+                              Store 195(u16v) 199
+             201: 14(int16_t) Load 200(i16)
+             202: 14(int16_t) ISub 201 179
+                              Store 200(i16) 202
+             203: 14(int16_t) Load 200(i16)
+             204: 14(int16_t) IAdd 203 179
+                              Store 200(i16) 204
+             205:193(i16vec3) Load 195(u16v)
+             206:197(i16vec3) CompositeConstruct 179 179 179
+             207:193(i16vec3) ISub 205 206
+                              Store 195(u16v) 207
+             208:193(i16vec3) Load 195(u16v)
+             209:193(i16vec3) Not 208
+                              Store 195(u16v) 209
+             210: 14(int16_t) Load 200(i16)
+                              Store 200(i16) 210
+             211:193(i16vec3) Load 195(u16v)
+             212:193(i16vec3) SNegate 211
+                              Store 195(u16v) 212
+             213: 14(int16_t) Load 200(i16)
+             214: 14(int16_t) Load 200(i16)
+             215: 14(int16_t) IAdd 214 213
+                              Store 200(i16) 215
+             216:193(i16vec3) Load 195(u16v)
+             217:193(i16vec3) Load 195(u16v)
+             218:193(i16vec3) ISub 217 216
+                              Store 195(u16v) 218
+             221: 14(int16_t) Load 200(i16)
+             222:     27(int) SConvert 221
+             223:     27(int) Load 220(i)
+             224:     27(int) IMul 223 222
+                              Store 220(i) 224
+             228:193(i16vec3) Load 195(u16v)
+             229:  225(ivec3) UConvert 228
+             230:  225(ivec3) Load 227(uv)
+             231:  225(ivec3) UDiv 230 229
+                              Store 227(uv) 231
+             232: 14(int16_t) Load 200(i16)
+             233:     27(int) SConvert 232
+             234:     17(int) Bitcast 233
+             235:  225(ivec3) Load 227(uv)
+             236:  225(ivec3) CompositeConstruct 234 234 234
+             237:  225(ivec3) UMod 235 236
+                              Store 227(uv) 237
+             238:193(i16vec3) Load 195(u16v)
+             239:  225(ivec3) UConvert 238
+             240:  225(ivec3) Load 227(uv)
+             241:  225(ivec3) IAdd 239 240
+                              Store 227(uv) 241
+             244: 14(int16_t) Load 200(i16)
+             245: 71(int64_t) SConvert 244
+             246: 71(int64_t) Load 243(i64)
+             247: 71(int64_t) ISub 245 246
+                              Store 243(i64) 247
+             248:193(i16vec3) Load 195(u16v)
+             249:  225(ivec3) UConvert 248
+             250:  225(ivec3) Load 227(uv)
+             251:  225(ivec3) IMul 249 250
+                              Store 227(uv) 251
+             252: 14(int16_t) Load 200(i16)
+             253: 71(int64_t) SConvert 252
+             254: 71(int64_t) Load 243(i64)
+             255: 71(int64_t) IMul 253 254
+                              Store 243(i64) 255
+             256: 14(int16_t) Load 200(i16)
+             257:     27(int) SConvert 256
+             258:     27(int) Load 220(i)
+             259:     27(int) SMod 257 258
+                              Store 220(i) 259
+             260: 14(int16_t) Load 200(i16)
+             261:193(i16vec3) Load 195(u16v)
+             262:197(i16vec3) CompositeConstruct 260 260 260
+             263:193(i16vec3) ShiftLeftLogical 261 262
+                              Store 195(u16v) 263
+             265:     37(ptr) AccessChain 195(u16v) 264
+             266: 36(int16_t) Load 265
+             267: 14(int16_t) Load 200(i16)
+             268: 14(int16_t) ShiftRightArithmetic 267 266
+                              Store 200(i16) 268
+             269: 14(int16_t) Load 200(i16)
+             271:     37(ptr) AccessChain 195(u16v) 270
+             272: 36(int16_t) Load 271
+             273: 14(int16_t) ShiftLeftLogical 269 272
+                              Store 200(i16) 273
+             274:193(i16vec3) Load 195(u16v)
+             275:     27(int) Load 220(i)
+             277:  276(ivec3) CompositeConstruct 275 275 275
+             278:193(i16vec3) ShiftLeftLogical 274 277
+             279:  225(ivec3) UConvert 278
+                              Store 227(uv) 279
+             283:     37(ptr) AccessChain 195(u16v) 282
+             284: 36(int16_t) Load 283
+             285: 14(int16_t) Load 200(i16)
+             286: 36(int16_t) Bitcast 285
+             287:   173(bool) INotEqual 284 286
+                              Store 281(b) 287
+             288: 14(int16_t) Load 200(i16)
+             289: 36(int16_t) Bitcast 288
+             290:     37(ptr) AccessChain 195(u16v) 282
+             291: 36(int16_t) Load 290
+             292:   173(bool) IEqual 289 291
+                              Store 281(b) 292
+             293:     37(ptr) AccessChain 195(u16v) 282
+             294: 36(int16_t) Load 293
+             295:     17(int) UConvert 294
+             297:    296(ptr) AccessChain 227(uv) 264
+             298:     17(int) Load 297
+             299:   173(bool) UGreaterThan 295 298
+                              Store 281(b) 299
+             300: 14(int16_t) Load 200(i16)
+             301:     27(int) SConvert 300
+             302:     27(int) Load 220(i)
+             303:   173(bool) SLessThan 301 302
+                              Store 281(b) 303
+             304:     37(ptr) AccessChain 195(u16v) 264
+             305: 36(int16_t) Load 304
+             306:     17(int) UConvert 305
+             307:    296(ptr) AccessChain 227(uv) 282
+             308:     17(int) Load 307
+             309:   173(bool) UGreaterThanEqual 306 308
+                              Store 281(b) 309
+             310: 14(int16_t) Load 200(i16)
+             311:     27(int) SConvert 310
+             312:     27(int) Load 220(i)
+             313:   173(bool) SLessThanEqual 311 312
+                              Store 281(b) 313
+             314: 14(int16_t) Load 200(i16)
+             315:     27(int) SConvert 314
+             316:     17(int) Bitcast 315
+             317:  225(ivec3) Load 227(uv)
+             318:  225(ivec3) CompositeConstruct 316 316 316
+             319:  225(ivec3) BitwiseOr 317 318
+                              Store 227(uv) 319
+             320: 14(int16_t) Load 200(i16)
+             321:     27(int) SConvert 320
+             322:     27(int) Load 220(i)
+             323:     27(int) BitwiseOr 321 322
+                              Store 220(i) 323
+             324: 14(int16_t) Load 200(i16)
+             325: 71(int64_t) SConvert 324
+             326: 71(int64_t) Load 243(i64)
+             327: 71(int64_t) BitwiseAnd 326 325
+                              Store 243(i64) 327
+             328:193(i16vec3) Load 195(u16v)
+             329:  225(ivec3) UConvert 328
+             330:  225(ivec3) Load 227(uv)
+             331:  225(ivec3) BitwiseAnd 329 330
+                              Store 227(uv) 331
+             332: 14(int16_t) Load 200(i16)
+             333:     27(int) SConvert 332
+             334:     17(int) Bitcast 333
+             335:  225(ivec3) Load 227(uv)
+             336:  225(ivec3) CompositeConstruct 334 334 334
+             337:  225(ivec3) BitwiseXor 335 336
+                              Store 227(uv) 337
+             338:193(i16vec3) Load 195(u16v)
+             339: 14(int16_t) Load 200(i16)
+             340: 36(int16_t) Bitcast 339
+             341:193(i16vec3) CompositeConstruct 340 340 340
+             342:193(i16vec3) BitwiseXor 338 341
+                              Store 195(u16v) 342
+                              Return
+                              FunctionEnd
+12(builtinFuncs():           2 Function None 3
+              13:             Label
+       343(i16v):     53(ptr) Variable Function
+        346(i16):     15(ptr) Variable Function
+       356(u16v):    194(ptr) Variable Function
+        358(u16):     37(ptr) Variable Function
+        428(i32):    219(ptr) Variable Function
+        431(i64):    242(ptr) Variable Function
+      434(i16v4):    433(ptr) Variable Function
+        437(u32):    296(ptr) Variable Function
+      438(u16v2):     58(ptr) Variable Function
+        442(u64):    441(ptr) Variable Function
+      445(u16v4):    444(ptr) Variable Function
+         457(bv):    456(ptr) Variable Function
+             344: 52(i16vec2) Load 343(i16v)
+             345: 52(i16vec2) ExtInst 1(GLSL.std.450) 5(SAbs) 344
+                              Store 343(i16v) 345
+             347: 14(int16_t) Load 346(i16)
+             348: 14(int16_t) ExtInst 1(GLSL.std.450) 7(SSign) 347
+                              Store 346(i16) 348
+             349: 52(i16vec2) Load 343(i16v)
+             350: 14(int16_t) Load 346(i16)
+             351: 52(i16vec2) CompositeConstruct 350 350
+             352: 52(i16vec2) ExtInst 1(GLSL.std.450) 39(SMin) 349 351
+                              Store 343(i16v) 352
+             353: 52(i16vec2) Load 343(i16v)
+             355: 52(i16vec2) ExtInst 1(GLSL.std.450) 39(SMin) 353 354
+                              Store 343(i16v) 355
+             357:193(i16vec3) Load 356(u16v)
+             359: 36(int16_t) Load 358(u16)
+             360:193(i16vec3) CompositeConstruct 359 359 359
+             361:193(i16vec3) ExtInst 1(GLSL.std.450) 38(UMin) 357 360
+                              Store 356(u16v) 361
+             362:193(i16vec3) Load 356(u16v)
+             364:193(i16vec3) ExtInst 1(GLSL.std.450) 38(UMin) 362 363
+                              Store 356(u16v) 364
+             365: 52(i16vec2) Load 343(i16v)
+             366: 14(int16_t) Load 346(i16)
+             367: 52(i16vec2) CompositeConstruct 366 366
+             368: 52(i16vec2) ExtInst 1(GLSL.std.450) 42(SMax) 365 367
+                              Store 343(i16v) 368
+             369: 52(i16vec2) Load 343(i16v)
+             370: 52(i16vec2) ExtInst 1(GLSL.std.450) 42(SMax) 369 354
+                              Store 343(i16v) 370
+             371:193(i16vec3) Load 356(u16v)
+             372: 36(int16_t) Load 358(u16)
+             373:193(i16vec3) CompositeConstruct 372 372 372
+             374:193(i16vec3) ExtInst 1(GLSL.std.450) 41(UMax) 371 373
+                              Store 356(u16v) 374
+             375:193(i16vec3) Load 356(u16v)
+             376:193(i16vec3) ExtInst 1(GLSL.std.450) 41(UMax) 375 363
+                              Store 356(u16v) 376
+             377: 52(i16vec2) Load 343(i16v)
+             378: 14(int16_t) Load 346(i16)
+             379: 14(int16_t) SNegate 378
+             380: 14(int16_t) Load 346(i16)
+             381: 52(i16vec2) CompositeConstruct 379 379
+             382: 52(i16vec2) CompositeConstruct 380 380
+             383: 52(i16vec2) ExtInst 1(GLSL.std.450) 45(SClamp) 377 381 382
+                              Store 343(i16v) 383
+             384: 52(i16vec2) Load 343(i16v)
+             385: 52(i16vec2) Load 343(i16v)
+             386: 52(i16vec2) SNegate 385
+             387: 52(i16vec2) Load 343(i16v)
+             388: 52(i16vec2) ExtInst 1(GLSL.std.450) 45(SClamp) 384 386 387
+                              Store 343(i16v) 388
+             389:193(i16vec3) Load 356(u16v)
+             390: 36(int16_t) Load 358(u16)
+             391: 36(int16_t) SNegate 390
+             392: 36(int16_t) Load 358(u16)
+             393:193(i16vec3) CompositeConstruct 391 391 391
+             394:193(i16vec3) CompositeConstruct 392 392 392
+             395:193(i16vec3) ExtInst 1(GLSL.std.450) 44(UClamp) 389 393 394
+                              Store 356(u16v) 395
+             396:193(i16vec3) Load 356(u16v)
+             397:193(i16vec3) Load 356(u16v)
+             398:193(i16vec3) SNegate 397
+             399:193(i16vec3) Load 356(u16v)
+             400:193(i16vec3) ExtInst 1(GLSL.std.450) 44(UClamp) 396 398 399
+                              Store 356(u16v) 400
+             401:     15(ptr) AccessChain 343(i16v) 282
+             402: 14(int16_t) Load 401
+             403:     15(ptr) AccessChain 343(i16v) 264
+             404: 14(int16_t) Load 403
+             406: 14(int16_t) Select 405 404 402
+                              Store 346(i16) 406
+             407: 14(int16_t) Load 346(i16)
+             408: 52(i16vec2) CompositeConstruct 407 407
+             409: 14(int16_t) Load 346(i16)
+             410: 14(int16_t) SNegate 409
+             411: 52(i16vec2) CompositeConstruct 410 410
+             414: 52(i16vec2) Select 413 411 408
+                              Store 343(i16v) 414
+             415:     37(ptr) AccessChain 356(u16v) 282
+             416: 36(int16_t) Load 415
+             417:     37(ptr) AccessChain 356(u16v) 264
+             418: 36(int16_t) Load 417
+             419: 36(int16_t) Select 405 418 416
+                              Store 358(u16) 419
+             420: 36(int16_t) Load 358(u16)
+             421:193(i16vec3) CompositeConstruct 420 420 420
+             422: 36(int16_t) Load 358(u16)
+             423: 36(int16_t) SNegate 422
+             424:193(i16vec3) CompositeConstruct 423 423 423
+             427:193(i16vec3) Select 426 424 421
+                              Store 356(u16v) 427
+             429: 52(i16vec2) Load 343(i16v)
+             430:     27(int) Bitcast 429
+                              Store 428(i32) 430
+             435:432(i16vec4) Load 434(i16v4)
+             436: 71(int64_t) Bitcast 435
+                              Store 431(i64) 436
+             439: 57(i16vec2) Load 438(u16v2)
+             440:     17(int) Bitcast 439
+                              Store 437(u32) 440
+             446:443(i16vec4) Load 445(u16v4)
+             447: 77(int64_t) Bitcast 446
+                              Store 442(u64) 447
+             448:     27(int) Load 428(i32)
+             449: 52(i16vec2) Bitcast 448
+                              Store 343(i16v) 449
+             450: 71(int64_t) Load 431(i64)
+             451:432(i16vec4) Bitcast 450
+                              Store 434(i16v4) 451
+             452:     17(int) Load 437(u32)
+             453: 57(i16vec2) Bitcast 452
+                              Store 438(u16v2) 453
+             454: 77(int64_t) Load 442(u64)
+             455:443(i16vec4) Bitcast 454
+                              Store 445(u16v4) 455
+             458:193(i16vec3) Load 356(u16v)
+             459: 36(int16_t) Load 358(u16)
+             460:193(i16vec3) CompositeConstruct 459 459 459
+             461:  425(bvec3) ULessThan 458 460
+                              Store 457(bv) 461
+             462: 52(i16vec2) Load 343(i16v)
+             463: 14(int16_t) Load 346(i16)
+             464: 52(i16vec2) CompositeConstruct 463 463
+             465:  174(bvec2) SLessThan 462 464
+             466:  425(bvec3) Load 457(bv)
+             467:  425(bvec3) VectorShuffle 466 465 3 4 2
+                              Store 457(bv) 467
+             468:193(i16vec3) Load 356(u16v)
+             469: 36(int16_t) Load 358(u16)
+             470:193(i16vec3) CompositeConstruct 469 469 469
+             471:  425(bvec3) ULessThanEqual 468 470
+                              Store 457(bv) 471
+             472: 52(i16vec2) Load 343(i16v)
+             473: 14(int16_t) Load 346(i16)
+             474: 52(i16vec2) CompositeConstruct 473 473
+             475:  174(bvec2) SLessThanEqual 472 474
+             476:  425(bvec3) Load 457(bv)
+             477:  425(bvec3) VectorShuffle 476 475 3 4 2
+                              Store 457(bv) 477
+             478:193(i16vec3) Load 356(u16v)
+             479: 36(int16_t) Load 358(u16)
+             480:193(i16vec3) CompositeConstruct 479 479 479
+             481:  425(bvec3) UGreaterThan 478 480
+                              Store 457(bv) 481
+             482: 52(i16vec2) Load 343(i16v)
+             483: 14(int16_t) Load 346(i16)
+             484: 52(i16vec2) CompositeConstruct 483 483
+             485:  174(bvec2) SGreaterThan 482 484
+             486:  425(bvec3) Load 457(bv)
+             487:  425(bvec3) VectorShuffle 486 485 3 4 2
+                              Store 457(bv) 487
+             488:193(i16vec3) Load 356(u16v)
+             489: 36(int16_t) Load 358(u16)
+             490:193(i16vec3) CompositeConstruct 489 489 489
+             491:  425(bvec3) UGreaterThanEqual 488 490
+                              Store 457(bv) 491
+             492: 52(i16vec2) Load 343(i16v)
+             493: 14(int16_t) Load 346(i16)
+             494: 52(i16vec2) CompositeConstruct 493 493
+             495:  174(bvec2) SGreaterThanEqual 492 494
+             496:  425(bvec3) Load 457(bv)
+             497:  425(bvec3) VectorShuffle 496 495 3 4 2
+                              Store 457(bv) 497
+             498:193(i16vec3) Load 356(u16v)
+             499: 36(int16_t) Load 358(u16)
+             500:193(i16vec3) CompositeConstruct 499 499 499
+             501:  425(bvec3) IEqual 498 500
+                              Store 457(bv) 501
+             502: 52(i16vec2) Load 343(i16v)
+             503: 14(int16_t) Load 346(i16)
+             504: 52(i16vec2) CompositeConstruct 503 503
+             505:  174(bvec2) IEqual 502 504
+             506:  425(bvec3) Load 457(bv)
+             507:  425(bvec3) VectorShuffle 506 505 3 4 2
+                              Store 457(bv) 507
+             508:193(i16vec3) Load 356(u16v)
+             509: 36(int16_t) Load 358(u16)
+             510:193(i16vec3) CompositeConstruct 509 509 509
+             511:  425(bvec3) INotEqual 508 510
+                              Store 457(bv) 511
+             512: 52(i16vec2) Load 343(i16v)
+             513: 14(int16_t) Load 346(i16)
+             514: 52(i16vec2) CompositeConstruct 513 513
+             515:  174(bvec2) INotEqual 512 514
+             516:  425(bvec3) Load 457(bv)
+             517:  425(bvec3) VectorShuffle 516 515 3 4 2
+                              Store 457(bv) 517
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.vulkan110.storageBuffer.vert.out b/Test/baseResults/spv.vulkan110.storageBuffer.vert.out
new file mode 100644
index 0000000..77eafc2
--- /dev/null
+++ b/Test/baseResults/spv.vulkan110.storageBuffer.vert.out
@@ -0,0 +1,66 @@
+spv.vulkan110.storageBuffer.vert
+// Module Version 10300
+// Generated by (magic number): 80007
+// Id's are bound by 31
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Vertex 4  "main" 13
+                              Source GLSL 450
+                              Name 4  "main"
+                              Name 11  "gl_PerVertex"
+                              MemberName 11(gl_PerVertex) 0  "gl_Position"
+                              MemberName 11(gl_PerVertex) 1  "gl_PointSize"
+                              MemberName 11(gl_PerVertex) 2  "gl_ClipDistance"
+                              MemberName 11(gl_PerVertex) 3  "gl_CullDistance"
+                              Name 13  ""
+                              Name 16  "ub"
+                              MemberName 16(ub) 0  "a"
+                              Name 18  "ubi"
+                              Name 22  "bb"
+                              MemberName 22(bb) 0  "b"
+                              Name 24  "bbi"
+                              MemberDecorate 11(gl_PerVertex) 0 BuiltIn Position
+                              MemberDecorate 11(gl_PerVertex) 1 BuiltIn PointSize
+                              MemberDecorate 11(gl_PerVertex) 2 BuiltIn ClipDistance
+                              MemberDecorate 11(gl_PerVertex) 3 BuiltIn CullDistance
+                              Decorate 11(gl_PerVertex) Block
+                              MemberDecorate 16(ub) 0 Offset 0
+                              Decorate 16(ub) Block
+                              Decorate 18(ubi) DescriptorSet 0
+                              MemberDecorate 22(bb) 0 Offset 0
+                              Decorate 22(bb) Block
+                              Decorate 24(bbi) DescriptorSet 0
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+               8:             TypeInt 32 0
+               9:      8(int) Constant 1
+              10:             TypeArray 6(float) 9
+11(gl_PerVertex):             TypeStruct 7(fvec4) 6(float) 10 10
+              12:             TypePointer Output 11(gl_PerVertex)
+              13:     12(ptr) Variable Output
+              14:             TypeInt 32 1
+              15:     14(int) Constant 0
+          16(ub):             TypeStruct 7(fvec4)
+              17:             TypePointer Uniform 16(ub)
+         18(ubi):     17(ptr) Variable Uniform
+              19:             TypePointer Uniform 7(fvec4)
+          22(bb):             TypeStruct 7(fvec4)
+              23:             TypePointer StorageBuffer 22(bb)
+         24(bbi):     23(ptr) Variable StorageBuffer
+              25:             TypePointer StorageBuffer 7(fvec4)
+              29:             TypePointer Output 7(fvec4)
+         4(main):           2 Function None 3
+               5:             Label
+              20:     19(ptr) AccessChain 18(ubi) 15
+              21:    7(fvec4) Load 20
+              26:     25(ptr) AccessChain 24(bbi) 15
+              27:    7(fvec4) Load 26
+              28:    7(fvec4) FAdd 21 27
+              30:     29(ptr) AccessChain 13 15
+                              Store 30 28
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.while-continue-break.vert.out b/Test/baseResults/spv.while-continue-break.vert.out
index 73dc35c..d49bca0 100644
--- a/Test/baseResults/spv.while-continue-break.vert.out
+++ b/Test/baseResults/spv.while-continue-break.vert.out
@@ -1,8 +1,6 @@
 spv.while-continue-break.vert
-Warning, version 310 is not yet complete; most version-specific features are present, but some are missing.
-
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 41
 
                               Capability Shader
diff --git a/Test/baseResults/spv.while-simple.vert.out b/Test/baseResults/spv.while-simple.vert.out
old mode 100755
new mode 100644
index 82121dd..b507da3
--- a/Test/baseResults/spv.while-simple.vert.out
+++ b/Test/baseResults/spv.while-simple.vert.out
@@ -1,8 +1,6 @@
 spv.while-simple.vert
-Warning, version 310 is not yet complete; most version-specific features are present, but some are missing.
-
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 22
 
                               Capability Shader
diff --git a/Test/baseResults/spv.whileLoop.frag.out b/Test/baseResults/spv.whileLoop.frag.out
old mode 100755
new mode 100644
index ce1e195..e294972
--- a/Test/baseResults/spv.whileLoop.frag.out
+++ b/Test/baseResults/spv.whileLoop.frag.out
@@ -1,6 +1,6 @@
 spv.whileLoop.frag
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 35
 
                               Capability Shader
@@ -15,6 +15,7 @@
                               Name 24  "d"
                               Name 28  "bigColor"
                               Name 33  "gl_FragColor"
+                              Decorate 33(gl_FragColor) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
diff --git a/Test/baseResults/spv.xfb.vert.out b/Test/baseResults/spv.xfb.vert.out
new file mode 100644
index 0000000..3cd93d5
--- /dev/null
+++ b/Test/baseResults/spv.xfb.vert.out
@@ -0,0 +1,55 @@
+spv.xfb.vert
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 16
+
+                              Capability Shader
+                              Capability TransformFeedback
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Vertex 4  "main" 8 11 14 15
+                              ExecutionMode 4 Xfb
+                              Source GLSL 450
+                              Name 4  "main"
+                              Name 8  "out1"
+                              Name 9  "outXfb"
+                              MemberName 9(outXfb) 0  "out2"
+                              Name 11  ""
+                              Name 12  "outXfb2"
+                              MemberName 12(outXfb2) 0  "out3"
+                              Name 14  ""
+                              Name 15  "out4"
+                              Decorate 8(out1) Location 0
+                              Decorate 8(out1) XfbBuffer 3
+                              Decorate 8(out1) XfbStride 48
+                              Decorate 8(out1) Offset 12
+                              MemberDecorate 9(outXfb) 0 Offset 8
+                              Decorate 9(outXfb) Block
+                              Decorate 11 Location 1
+                              Decorate 11 XfbBuffer 2
+                              Decorate 11 XfbStride 32
+                              MemberDecorate 12(outXfb2) 0 Offset 60
+                              Decorate 12(outXfb2) Block
+                              Decorate 14 Location 3
+                              Decorate 14 XfbBuffer 1
+                              Decorate 14 XfbStride 64
+                              Decorate 15(out4) Location 4
+                              Decorate 15(out4) XfbBuffer 0
+                              Decorate 15(out4) XfbStride 8
+                              Decorate 15(out4) Offset 4
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypePointer Output 6(float)
+         8(out1):      7(ptr) Variable Output
+       9(outXfb):             TypeStruct 6(float)
+              10:             TypePointer Output 9(outXfb)
+              11:     10(ptr) Variable Output
+     12(outXfb2):             TypeStruct 6(float)
+              13:             TypePointer Output 12(outXfb2)
+              14:     13(ptr) Variable Output
+        15(out4):      7(ptr) Variable Output
+         4(main):           2 Function None 3
+               5:             Label
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.xfb2.vert.out b/Test/baseResults/spv.xfb2.vert.out
new file mode 100644
index 0000000..a8551a1
--- /dev/null
+++ b/Test/baseResults/spv.xfb2.vert.out
@@ -0,0 +1,68 @@
+spv.xfb2.vert
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 35
+
+                              Capability Shader
+                              Capability TransformFeedback
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Vertex 4  "main" 10 14
+                              ExecutionMode 4 Xfb
+                              Source GLSL 450
+                              Name 4  "main"
+                              Name 8  "gl_PerVertex"
+                              MemberName 8(gl_PerVertex) 0  "gl_Position"
+                              Name 10  ""
+                              Name 14  "position"
+                              Name 17  "ComponentsBlock"
+                              MemberName 17(ComponentsBlock) 0  "c1"
+                              MemberName 17(ComponentsBlock) 1  "c2"
+                              Name 19  "components"
+                              MemberDecorate 8(gl_PerVertex) 0 Offset 16
+                              MemberDecorate 8(gl_PerVertex) 0 BuiltIn Position
+                              Decorate 8(gl_PerVertex) Block
+                              Decorate 10 XfbBuffer 3
+                              Decorate 10 XfbStride 32
+                              Decorate 14(position) Location 0
+                              MemberDecorate 17(ComponentsBlock) 0 Offset 0
+                              MemberDecorate 17(ComponentsBlock) 1 Offset 16
+                              Decorate 17(ComponentsBlock) Block
+                              Decorate 19(components) DescriptorSet 0
+                              Decorate 19(components) Binding 5
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+ 8(gl_PerVertex):             TypeStruct 7(fvec4)
+               9:             TypePointer Output 8(gl_PerVertex)
+              10:      9(ptr) Variable Output
+              11:             TypeInt 32 1
+              12:     11(int) Constant 0
+              13:             TypePointer Input 7(fvec4)
+    14(position):     13(ptr) Variable Input
+              16:             TypeVector 6(float) 2
+17(ComponentsBlock):             TypeStruct 7(fvec4) 16(fvec2)
+              18:             TypePointer Uniform 17(ComponentsBlock)
+  19(components):     18(ptr) Variable Uniform
+              20:             TypePointer Uniform 7(fvec4)
+              24:     11(int) Constant 1
+              25:             TypePointer Uniform 16(fvec2)
+              28:    6(float) Constant 0
+              33:             TypePointer Output 7(fvec4)
+         4(main):           2 Function None 3
+               5:             Label
+              15:    7(fvec4) Load 14(position)
+              21:     20(ptr) AccessChain 19(components) 12
+              22:    7(fvec4) Load 21
+              23:    7(fvec4) FAdd 15 22
+              26:     25(ptr) AccessChain 19(components) 24
+              27:   16(fvec2) Load 26
+              29:    6(float) CompositeExtract 27 0
+              30:    6(float) CompositeExtract 27 1
+              31:    7(fvec4) CompositeConstruct 29 30 28 28
+              32:    7(fvec4) FAdd 23 31
+              34:     33(ptr) AccessChain 10 12
+                              Store 34 32
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.xfb3.vert.out b/Test/baseResults/spv.xfb3.vert.out
new file mode 100644
index 0000000..0218847
--- /dev/null
+++ b/Test/baseResults/spv.xfb3.vert.out
@@ -0,0 +1,68 @@
+spv.xfb3.vert
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 35
+
+                              Capability Shader
+                              Capability TransformFeedback
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Vertex 4  "main" 10 14
+                              ExecutionMode 4 Xfb
+                              Source GLSL 450
+                              Name 4  "main"
+                              Name 8  "gl_PerVertex"
+                              MemberName 8(gl_PerVertex) 0  "gl_Position"
+                              Name 10  ""
+                              Name 14  "position"
+                              Name 17  "ComponentsBlock"
+                              MemberName 17(ComponentsBlock) 0  "c1"
+                              MemberName 17(ComponentsBlock) 1  "c2"
+                              Name 19  "components"
+                              MemberDecorate 8(gl_PerVertex) 0 Offset 16
+                              MemberDecorate 8(gl_PerVertex) 0 BuiltIn Position
+                              Decorate 8(gl_PerVertex) Block
+                              Decorate 10 XfbBuffer 3
+                              Decorate 10 XfbStride 80
+                              Decorate 14(position) Location 0
+                              MemberDecorate 17(ComponentsBlock) 0 Offset 0
+                              MemberDecorate 17(ComponentsBlock) 1 Offset 16
+                              Decorate 17(ComponentsBlock) Block
+                              Decorate 19(components) DescriptorSet 0
+                              Decorate 19(components) Binding 5
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+ 8(gl_PerVertex):             TypeStruct 7(fvec4)
+               9:             TypePointer Output 8(gl_PerVertex)
+              10:      9(ptr) Variable Output
+              11:             TypeInt 32 1
+              12:     11(int) Constant 0
+              13:             TypePointer Input 7(fvec4)
+    14(position):     13(ptr) Variable Input
+              16:             TypeVector 6(float) 2
+17(ComponentsBlock):             TypeStruct 7(fvec4) 16(fvec2)
+              18:             TypePointer Uniform 17(ComponentsBlock)
+  19(components):     18(ptr) Variable Uniform
+              20:             TypePointer Uniform 7(fvec4)
+              24:     11(int) Constant 1
+              25:             TypePointer Uniform 16(fvec2)
+              28:    6(float) Constant 0
+              33:             TypePointer Output 7(fvec4)
+         4(main):           2 Function None 3
+               5:             Label
+              15:    7(fvec4) Load 14(position)
+              21:     20(ptr) AccessChain 19(components) 12
+              22:    7(fvec4) Load 21
+              23:    7(fvec4) FAdd 15 22
+              26:     25(ptr) AccessChain 19(components) 24
+              27:   16(fvec2) Load 26
+              29:    6(float) CompositeExtract 27 0
+              30:    6(float) CompositeExtract 27 1
+              31:    7(fvec4) CompositeConstruct 29 30 28 28
+              32:    7(fvec4) FAdd 23 31
+              34:     33(ptr) AccessChain 10 12
+                              Store 34 32
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.xfbOffsetOnBlockMembersAssignment.vert.out b/Test/baseResults/spv.xfbOffsetOnBlockMembersAssignment.vert.out
new file mode 100644
index 0000000..066aa3a
--- /dev/null
+++ b/Test/baseResults/spv.xfbOffsetOnBlockMembersAssignment.vert.out
@@ -0,0 +1,76 @@
+spv.xfbOffsetOnBlockMembersAssignment.vert
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 33
+
+                              Capability Shader
+                              Capability TransformFeedback
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Vertex 4  "main" 10 27 31 32
+                              ExecutionMode 4 Xfb
+                              Source GLSL 450
+                              Name 4  "main"
+                              Name 8  "block2"
+                              MemberName 8(block2) 0  "y1_out"
+                              MemberName 8(block2) 1  "y2_out"
+                              Name 10  ""
+                              Name 25  "gl_PerVertex"
+                              MemberName 25(gl_PerVertex) 0  "gl_Position"
+                              MemberName 25(gl_PerVertex) 1  "gl_PointSize"
+                              MemberName 25(gl_PerVertex) 2  "gl_ClipDistance"
+                              MemberName 25(gl_PerVertex) 3  "gl_CullDistance"
+                              Name 27  ""
+                              Name 31  "gl_VertexID"
+                              Name 32  "gl_InstanceID"
+                              MemberDecorate 8(block2) 0 Offset 0
+                              MemberDecorate 8(block2) 1 Offset 4
+                              Decorate 8(block2) Block
+                              Decorate 10 Location 5
+                              Decorate 10 XfbBuffer 2
+                              Decorate 10 XfbStride 20
+                              MemberDecorate 25(gl_PerVertex) 0 BuiltIn Position
+                              MemberDecorate 25(gl_PerVertex) 1 BuiltIn PointSize
+                              MemberDecorate 25(gl_PerVertex) 2 BuiltIn ClipDistance
+                              MemberDecorate 25(gl_PerVertex) 3 BuiltIn CullDistance
+                              Decorate 25(gl_PerVertex) Block
+                              Decorate 27 XfbBuffer 0
+                              Decorate 27 XfbStride 0
+                              Decorate 31(gl_VertexID) BuiltIn VertexId
+                              Decorate 32(gl_InstanceID) BuiltIn InstanceId
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+       8(block2):             TypeStruct 6(float) 7(fvec4)
+               9:             TypePointer Output 8(block2)
+              10:      9(ptr) Variable Output
+              11:             TypeInt 32 1
+              12:     11(int) Constant 0
+              13:    6(float) Constant 1088421888
+              14:             TypePointer Output 6(float)
+              16:     11(int) Constant 1
+              17:    6(float) Constant 1065353216
+              18:    6(float) Constant 0
+              19:    7(fvec4) ConstantComposite 17 18 18 17
+              20:             TypePointer Output 7(fvec4)
+              22:             TypeInt 32 0
+              23:     22(int) Constant 1
+              24:             TypeArray 6(float) 23
+25(gl_PerVertex):             TypeStruct 7(fvec4) 6(float) 24 24
+              26:             TypePointer Output 25(gl_PerVertex)
+              27:     26(ptr) Variable Output
+              28:    7(fvec4) ConstantComposite 18 18 18 18
+              30:             TypePointer Input 11(int)
+ 31(gl_VertexID):     30(ptr) Variable Input
+32(gl_InstanceID):     30(ptr) Variable Input
+         4(main):           2 Function None 3
+               5:             Label
+              15:     14(ptr) AccessChain 10 12
+                              Store 15 13
+              21:     20(ptr) AccessChain 10 16
+                              Store 21 19
+              29:     20(ptr) AccessChain 27 12
+                              Store 29 28
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.xfbOffsetOnStructMembersAssignment.vert.out b/Test/baseResults/spv.xfbOffsetOnStructMembersAssignment.vert.out
new file mode 100644
index 0000000..7eb4593
--- /dev/null
+++ b/Test/baseResults/spv.xfbOffsetOnStructMembersAssignment.vert.out
@@ -0,0 +1,93 @@
+spv.xfbOffsetOnStructMembersAssignment.vert
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 40
+
+                              Capability Shader
+                              Capability TransformFeedback
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Vertex 4  "main" 9 21 34 38 39
+                              ExecutionMode 4 Xfb
+                              Source GLSL 450
+                              Name 4  "main"
+                              Name 7  "S"
+                              MemberName 7(S) 0  "x1_out"
+                              MemberName 7(S) 1  "x2_out"
+                              Name 9  "s1"
+                              Name 19  "S2"
+                              MemberName 19(S2) 0  "y1_out"
+                              MemberName 19(S2) 1  "y2_out"
+                              Name 21  "s2"
+                              Name 32  "gl_PerVertex"
+                              MemberName 32(gl_PerVertex) 0  "gl_Position"
+                              MemberName 32(gl_PerVertex) 1  "gl_PointSize"
+                              MemberName 32(gl_PerVertex) 2  "gl_ClipDistance"
+                              MemberName 32(gl_PerVertex) 3  "gl_CullDistance"
+                              Name 34  ""
+                              Name 38  "gl_VertexID"
+                              Name 39  "gl_InstanceID"
+                              MemberDecorate 7(S) 0 Offset 16
+                              MemberDecorate 7(S) 1 Offset 20
+                              Decorate 9(s1) Location 0
+                              Decorate 9(s1) XfbBuffer 2
+                              Decorate 9(s1) XfbStride 24
+                              MemberDecorate 19(S2) 0 Offset 8
+                              MemberDecorate 19(S2) 1 Offset 12
+                              Decorate 21(s2) Location 5
+                              Decorate 21(s2) XfbBuffer 1
+                              Decorate 21(s2) XfbStride 28
+                              MemberDecorate 32(gl_PerVertex) 0 BuiltIn Position
+                              MemberDecorate 32(gl_PerVertex) 1 BuiltIn PointSize
+                              MemberDecorate 32(gl_PerVertex) 2 BuiltIn ClipDistance
+                              MemberDecorate 32(gl_PerVertex) 3 BuiltIn CullDistance
+                              Decorate 32(gl_PerVertex) Block
+                              Decorate 34 XfbBuffer 0
+                              Decorate 34 XfbStride 0
+                              Decorate 38(gl_VertexID) BuiltIn VertexId
+                              Decorate 39(gl_InstanceID) BuiltIn InstanceId
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+            7(S):             TypeStruct 6(float) 6(float)
+               8:             TypePointer Output 7(S)
+           9(s1):      8(ptr) Variable Output
+              10:             TypeInt 32 1
+              11:     10(int) Constant 0
+              12:    6(float) Constant 1084227584
+              13:             TypePointer Output 6(float)
+              15:     10(int) Constant 1
+              16:    6(float) Constant 1086324736
+              18:             TypeVector 6(float) 4
+          19(S2):             TypeStruct 6(float) 18(fvec4)
+              20:             TypePointer Output 19(S2)
+          21(s2):     20(ptr) Variable Output
+              22:    6(float) Constant 1088421888
+              24:    6(float) Constant 1065353216
+              25:    6(float) Constant 0
+              26:   18(fvec4) ConstantComposite 24 25 25 24
+              27:             TypePointer Output 18(fvec4)
+              29:             TypeInt 32 0
+              30:     29(int) Constant 1
+              31:             TypeArray 6(float) 30
+32(gl_PerVertex):             TypeStruct 18(fvec4) 6(float) 31 31
+              33:             TypePointer Output 32(gl_PerVertex)
+              34:     33(ptr) Variable Output
+              35:   18(fvec4) ConstantComposite 25 25 25 25
+              37:             TypePointer Input 10(int)
+ 38(gl_VertexID):     37(ptr) Variable Input
+39(gl_InstanceID):     37(ptr) Variable Input
+         4(main):           2 Function None 3
+               5:             Label
+              14:     13(ptr) AccessChain 9(s1) 11
+                              Store 14 12
+              17:     13(ptr) AccessChain 9(s1) 15
+                              Store 17 16
+              23:     13(ptr) AccessChain 21(s2) 11
+                              Store 23 22
+              28:     27(ptr) AccessChain 21(s2) 15
+                              Store 28 26
+              36:     27(ptr) AccessChain 34 11
+                              Store 36 35
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.xfbOverlapOffsetCheckWithBlockAndMember.vert.out b/Test/baseResults/spv.xfbOverlapOffsetCheckWithBlockAndMember.vert.out
new file mode 100644
index 0000000..ebc4962
--- /dev/null
+++ b/Test/baseResults/spv.xfbOverlapOffsetCheckWithBlockAndMember.vert.out
@@ -0,0 +1,88 @@
+spv.xfbOverlapOffsetCheckWithBlockAndMember.vert
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 39
+
+                              Capability Shader
+                              Capability TransformFeedback
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Vertex 4  "main" 10 33 37 38
+                              ExecutionMode 4 Xfb
+                              Source GLSL 450
+                              Name 4  "main"
+                              Name 8  "block2"
+                              MemberName 8(block2) 0  "v"
+                              MemberName 8(block2) 1  "u"
+                              MemberName 8(block2) 2  "w"
+                              MemberName 8(block2) 3  "x"
+                              Name 10  ""
+                              Name 31  "gl_PerVertex"
+                              MemberName 31(gl_PerVertex) 0  "gl_Position"
+                              MemberName 31(gl_PerVertex) 1  "gl_PointSize"
+                              MemberName 31(gl_PerVertex) 2  "gl_ClipDistance"
+                              MemberName 31(gl_PerVertex) 3  "gl_CullDistance"
+                              Name 33  ""
+                              Name 37  "gl_VertexID"
+                              Name 38  "gl_InstanceID"
+                              MemberDecorate 8(block2) 0 Offset 12
+                              MemberDecorate 8(block2) 1 Offset 28
+                              MemberDecorate 8(block2) 2 Offset 40
+                              MemberDecorate 8(block2) 3 Offset 56
+                              Decorate 8(block2) Block
+                              Decorate 10 Location 5
+                              Decorate 10 XfbBuffer 3
+                              Decorate 10 XfbStride 72
+                              MemberDecorate 31(gl_PerVertex) 0 BuiltIn Position
+                              MemberDecorate 31(gl_PerVertex) 1 BuiltIn PointSize
+                              MemberDecorate 31(gl_PerVertex) 2 BuiltIn ClipDistance
+                              MemberDecorate 31(gl_PerVertex) 3 BuiltIn CullDistance
+                              Decorate 31(gl_PerVertex) Block
+                              Decorate 33 XfbBuffer 0
+                              Decorate 33 XfbStride 0
+                              Decorate 37(gl_VertexID) BuiltIn VertexId
+                              Decorate 38(gl_InstanceID) BuiltIn InstanceId
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+       8(block2):             TypeStruct 7(fvec4) 6(float) 7(fvec4) 7(fvec4)
+               9:             TypePointer Output 8(block2)
+              10:      9(ptr) Variable Output
+              11:             TypeInt 32 1
+              12:     11(int) Constant 0
+              13:    6(float) Constant 1065353216
+              14:    6(float) Constant 0
+              15:    7(fvec4) ConstantComposite 13 14 13 14
+              16:             TypePointer Output 7(fvec4)
+              18:     11(int) Constant 1
+              19:    6(float) Constant 1084227584
+              20:             TypePointer Output 6(float)
+              22:     11(int) Constant 2
+              23:    7(fvec4) ConstantComposite 13 14 14 13
+              25:     11(int) Constant 3
+              26:    7(fvec4) ConstantComposite 19 14 14 14
+              28:             TypeInt 32 0
+              29:     28(int) Constant 1
+              30:             TypeArray 6(float) 29
+31(gl_PerVertex):             TypeStruct 7(fvec4) 6(float) 30 30
+              32:             TypePointer Output 31(gl_PerVertex)
+              33:     32(ptr) Variable Output
+              34:    7(fvec4) ConstantComposite 14 14 14 14
+              36:             TypePointer Input 11(int)
+ 37(gl_VertexID):     36(ptr) Variable Input
+38(gl_InstanceID):     36(ptr) Variable Input
+         4(main):           2 Function None 3
+               5:             Label
+              17:     16(ptr) AccessChain 10 12
+                              Store 17 15
+              21:     20(ptr) AccessChain 10 18
+                              Store 21 19
+              24:     16(ptr) AccessChain 10 22
+                              Store 24 23
+              27:     16(ptr) AccessChain 10 25
+                              Store 27 26
+              35:     16(ptr) AccessChain 33 12
+                              Store 35 34
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.xfbStrideJustOnce.vert.out b/Test/baseResults/spv.xfbStrideJustOnce.vert.out
new file mode 100644
index 0000000..9b459b5
--- /dev/null
+++ b/Test/baseResults/spv.xfbStrideJustOnce.vert.out
@@ -0,0 +1,74 @@
+spv.xfbStrideJustOnce.vert
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 33
+
+                              Capability Shader
+                              Capability TransformFeedback
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Vertex 4  "main" 10 27 31 32
+                              ExecutionMode 4 Xfb
+                              Source GLSL 450
+                              Name 4  "main"
+                              Name 8  "block"
+                              MemberName 8(block) 0  "y1_out"
+                              MemberName 8(block) 1  "y2_out"
+                              Name 10  ""
+                              Name 25  "gl_PerVertex"
+                              MemberName 25(gl_PerVertex) 0  "gl_Position"
+                              MemberName 25(gl_PerVertex) 1  "gl_PointSize"
+                              MemberName 25(gl_PerVertex) 2  "gl_ClipDistance"
+                              MemberName 25(gl_PerVertex) 3  "gl_CullDistance"
+                              Name 27  ""
+                              Name 31  "gl_VertexID"
+                              Name 32  "gl_InstanceID"
+                              Decorate 8(block) Block
+                              Decorate 10 Location 5
+                              Decorate 10 XfbBuffer 2
+                              Decorate 10 XfbStride 20
+                              MemberDecorate 25(gl_PerVertex) 0 BuiltIn Position
+                              MemberDecorate 25(gl_PerVertex) 1 BuiltIn PointSize
+                              MemberDecorate 25(gl_PerVertex) 2 BuiltIn ClipDistance
+                              MemberDecorate 25(gl_PerVertex) 3 BuiltIn CullDistance
+                              Decorate 25(gl_PerVertex) Block
+                              Decorate 27 XfbBuffer 0
+                              Decorate 27 XfbStride 0
+                              Decorate 31(gl_VertexID) BuiltIn VertexId
+                              Decorate 32(gl_InstanceID) BuiltIn InstanceId
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+        8(block):             TypeStruct 6(float) 7(fvec4)
+               9:             TypePointer Output 8(block)
+              10:      9(ptr) Variable Output
+              11:             TypeInt 32 1
+              12:     11(int) Constant 0
+              13:    6(float) Constant 1088421888
+              14:             TypePointer Output 6(float)
+              16:     11(int) Constant 1
+              17:    6(float) Constant 1065353216
+              18:    6(float) Constant 0
+              19:    7(fvec4) ConstantComposite 17 18 18 17
+              20:             TypePointer Output 7(fvec4)
+              22:             TypeInt 32 0
+              23:     22(int) Constant 1
+              24:             TypeArray 6(float) 23
+25(gl_PerVertex):             TypeStruct 7(fvec4) 6(float) 24 24
+              26:             TypePointer Output 25(gl_PerVertex)
+              27:     26(ptr) Variable Output
+              28:    7(fvec4) ConstantComposite 18 18 18 18
+              30:             TypePointer Input 11(int)
+ 31(gl_VertexID):     30(ptr) Variable Input
+32(gl_InstanceID):     30(ptr) Variable Input
+         4(main):           2 Function None 3
+               5:             Label
+              15:     14(ptr) AccessChain 10 12
+                              Store 15 13
+              21:     20(ptr) AccessChain 10 16
+                              Store 21 19
+              29:     20(ptr) AccessChain 27 12
+                              Store 29 28
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/stringToDouble.vert.out b/Test/baseResults/stringToDouble.vert.out
new file mode 100644
index 0000000..3829c70
--- /dev/null
+++ b/Test/baseResults/stringToDouble.vert.out
@@ -0,0 +1,1045 @@
+stringToDouble.vert
+Shader version: 460
+Requested GL_EXT_shader_explicit_arithmetic_types_float16
+0:? Sequence
+0:3  Function Definition: main( ( global void)
+0:3    Function Parameters: 
+0:5    Sequence
+0:5      Sequence
+0:5        move second child to first child ( temp float)
+0:5          'w1' ( temp float)
+0:5          Constant:
+0:5            0.000000
+0:6      Sequence
+0:6        move second child to first child ( temp float)
+0:6          'w2' ( temp float)
+0:6          Constant:
+0:6            1.000000
+0:7      Sequence
+0:7        move second child to first child ( temp float)
+0:7          'w3' ( temp float)
+0:7          Constant:
+0:7            7.000000
+0:8      Sequence
+0:8        move second child to first child ( temp float)
+0:8          'w4' ( temp float)
+0:8          Constant:
+0:8            130000.000000
+0:9      Sequence
+0:9        move second child to first child ( temp float)
+0:9          'w5' ( temp float)
+0:9          Constant:
+0:9            123456789.000000
+0:10      Sequence
+0:10        move second child to first child ( temp double)
+0:10          'w6' ( temp double)
+0:10          Constant:
+0:10            1.2345678901235e+15
+0:11      Sequence
+0:11        move second child to first child ( temp double)
+0:11          'w7' ( temp double)
+0:11          Constant:
+0:11            1.2345678901235e+16
+0:12      Sequence
+0:12        move second child to first child ( temp double)
+0:12          'w8' ( temp double)
+0:12          Constant:
+0:12            1.2345678901235e+17
+0:13      Sequence
+0:13        move second child to first child ( temp double)
+0:13          'w9' ( temp double)
+0:13          Constant:
+0:13            1.2345678901235e+19
+0:14      Sequence
+0:14        move second child to first child ( temp double)
+0:14          'w10' ( temp double)
+0:14          Constant:
+0:14            1.2345678901235e+24
+0:16      Sequence
+0:16        move second child to first child ( temp float)
+0:16          'e1' ( temp float)
+0:16          Constant:
+0:16            0.000000
+0:17      Sequence
+0:17        move second child to first child ( temp float)
+0:17          'e2' ( temp float)
+0:17          Constant:
+0:17            1.000000
+0:18      Sequence
+0:18        move second child to first child ( temp float)
+0:18          'e3' ( temp float)
+0:18          Constant:
+0:18            0.000000
+0:19      Sequence
+0:19        move second child to first child ( temp float)
+0:19          'e4' ( temp float)
+0:19          Constant:
+0:19            1.0000000000000e+15
+0:20      Sequence
+0:20        move second child to first child ( temp float)
+0:20          'e5' ( temp float)
+0:20          Constant:
+0:20            1.0000000000000e+16
+0:21      Sequence
+0:21        move second child to first child ( temp float)
+0:21          'e6' ( temp float)
+0:21          Constant:
+0:21            0.000000
+0:22      Sequence
+0:22        move second child to first child ( temp float)
+0:22          'e7' ( temp float)
+0:22          Constant:
+0:22            1.0000000000000e-15
+0:23      Sequence
+0:23        move second child to first child ( temp float)
+0:23          'e8' ( temp float)
+0:23          Constant:
+0:23            1.0000000000000e-16
+0:24      Sequence
+0:24        move second child to first child ( temp double)
+0:24          'e9' ( temp double)
+0:24          Constant:
+0:24            1.0000000000000e+100
+0:25      Sequence
+0:25        move second child to first child ( temp double)
+0:25          'e10' ( temp double)
+0:25          Constant:
+0:25            1.0000000000000e+308
+0:26      Sequence
+0:26        move second child to first child ( temp double)
+0:26          'e11' ( temp double)
+0:26          Constant:
+0:26            1.0000000000000e-307
+0:27      Sequence
+0:27        move second child to first child ( temp double)
+0:27          'e12' ( temp double)
+0:27          Constant:
+0:27            +1.#INF
+0:28      Sequence
+0:28        move second child to first child ( temp double)
+0:28          'e13' ( temp double)
+0:28          Constant:
+0:28            0.000000
+0:29      Sequence
+0:29        move second child to first child ( temp double)
+0:29          'e24' ( temp double)
+0:29          Constant:
+0:29            +1.#INF
+0:30      Sequence
+0:30        move second child to first child ( temp double)
+0:30          'e25' ( temp double)
+0:30          Constant:
+0:30            0.000000
+0:32      Sequence
+0:32        move second child to first child ( temp double)
+0:32          'f1' ( temp double)
+0:32          Constant:
+0:32            0.500000
+0:33      Sequence
+0:33        move second child to first child ( temp double)
+0:33          'f2' ( temp double)
+0:33          Constant:
+0:33            0.125000
+0:34      Sequence
+0:34        move second child to first child ( temp double)
+0:34          'f31' ( temp double)
+0:34          Constant:
+0:34            0.100000
+0:35      Sequence
+0:35        move second child to first child ( temp double)
+0:35          'f32' ( temp double)
+0:35          Constant:
+0:35            0.200000
+0:36      Sequence
+0:36        move second child to first child ( temp double)
+0:36          'f33' ( temp double)
+0:36          Constant:
+0:36            0.300000
+0:37      Sequence
+0:37        move second child to first child ( temp double)
+0:37          'f34' ( temp double)
+0:37          Constant:
+0:37            0.400000
+0:38      Sequence
+0:38        move second child to first child ( temp double)
+0:38          'f35' ( temp double)
+0:38          Constant:
+0:38            0.500000
+0:39      Sequence
+0:39        move second child to first child ( temp double)
+0:39          'f36' ( temp double)
+0:39          Constant:
+0:39            0.600000
+0:40      Sequence
+0:40        move second child to first child ( temp double)
+0:40          'f37' ( temp double)
+0:40          Constant:
+0:40            0.700000
+0:41      Sequence
+0:41        move second child to first child ( temp double)
+0:41          'f38' ( temp double)
+0:41          Constant:
+0:41            0.800000
+0:42      Sequence
+0:42        move second child to first child ( temp double)
+0:42          'f39' ( temp double)
+0:42          Constant:
+0:42            0.900000
+0:43      Sequence
+0:43        move second child to first child ( temp double)
+0:43          'f4' ( temp double)
+0:43          Constant:
+0:43            0.333333
+0:44      Sequence
+0:44        move second child to first child ( temp double)
+0:44          'f51' ( temp double)
+0:44          Constant:
+0:44            7.8347500000000e-37
+0:45      Sequence
+0:45        move second child to first child ( temp double)
+0:45          'f52' ( temp double)
+0:45          Constant:
+0:45            7.8347500000000e-37
+0:46      Sequence
+0:46        move second child to first child ( temp double)
+0:46          'f53' ( temp double)
+0:46          Constant:
+0:46            7.8347500000000e-37
+0:47      Sequence
+0:47        move second child to first child ( temp double)
+0:47          'f54' ( temp double)
+0:47          Constant:
+0:47            7.8347500000000e-37
+0:48      Sequence
+0:48        move second child to first child ( temp double)
+0:48          'f61' ( temp double)
+0:48          Constant:
+0:48            4.000000
+0:49      Sequence
+0:49        move second child to first child ( temp double)
+0:49          'f62' ( temp double)
+0:49          Constant:
+0:49            40.000000
+0:50      Sequence
+0:50        move second child to first child ( temp double)
+0:50          'f63' ( temp double)
+0:50          Constant:
+0:50            0.000000
+0:51      Sequence
+0:51        move second child to first child ( temp double)
+0:51          'f64' ( temp double)
+0:51          Constant:
+0:51            4.000000
+0:52      Sequence
+0:52        move second child to first child ( temp double)
+0:52          'f65' ( temp double)
+0:52          Constant:
+0:52            0.000000
+0:53      Sequence
+0:53        move second child to first child ( temp double)
+0:53          'f66' ( temp double)
+0:53          Constant:
+0:53            0.004000
+0:54      Sequence
+0:54        move second child to first child ( temp double)
+0:54          'f67' ( temp double)
+0:54          Constant:
+0:54            0.400000
+0:55      Sequence
+0:55        move second child to first child ( temp double)
+0:55          'f68' ( temp double)
+0:55          Constant:
+0:55            0.040000
+0:57      Sequence
+0:57        move second child to first child ( temp double)
+0:57          'c1' ( temp double)
+0:57          Constant:
+0:57            0.000810
+0:58      Sequence
+0:58        move second child to first child ( temp double)
+0:58          'c2' ( temp double)
+0:58          Constant:
+0:58            7.300000
+0:59      Sequence
+0:59        move second child to first child ( temp double)
+0:59          'c3' ( temp double)
+0:59          Constant:
+0:59            3.450000
+0:60      Sequence
+0:60        move second child to first child ( temp double)
+0:60          'c4' ( temp double)
+0:60          Constant:
+0:60            0.003570
+0:61      Sequence
+0:61        move second child to first child ( temp double)
+0:61          'c5' ( temp double)
+0:61          Constant:
+0:61            439.000000
+0:62      Sequence
+0:62        move second child to first child ( temp double)
+0:62          'c6' ( temp double)
+0:62          Constant:
+0:62            522000.000000
+0:63      Sequence
+0:63        move second child to first child ( temp double)
+0:63          'c7' ( temp double)
+0:63          Constant:
+0:63            61000000.000000
+0:64      Sequence
+0:64        move second child to first child ( temp double)
+0:64          'c8' ( temp double)
+0:64          Constant:
+0:64            0.610000
+0:65      Sequence
+0:65        move second child to first child ( temp double)
+0:65          'c9' ( temp double)
+0:65          Constant:
+0:65            1.2345678901235e+18
+0:66      Sequence
+0:66        move second child to first child ( temp double)
+0:66          'c10' ( temp double)
+0:66          Constant:
+0:66            1.0000000000000e+21
+0:67      Sequence
+0:67        move second child to first child ( temp double)
+0:67          'c11' ( temp double)
+0:67          Constant:
+0:67            1230000.004560
+0:68      Sequence
+0:68        move second child to first child ( temp double)
+0:68          'c12' ( temp double)
+0:68          Constant:
+0:68            1230.000004
+0:69      Sequence
+0:69        move second child to first child ( temp double)
+0:69          'c13' ( temp double)
+0:69          Constant:
+0:69            123.000000
+0:70      Sequence
+0:70        move second child to first child ( temp double)
+0:70          'c14' ( temp double)
+0:70          Constant:
+0:70            102.300000
+0:71      Sequence
+0:71        move second child to first child ( temp double)
+0:71          'c15' ( temp double)
+0:71          Constant:
+0:71            1.2003000000456e+12
+0:72      Sequence
+0:72        move second child to first child ( temp double)
+0:72          'c16' ( temp double)
+0:72          Constant:
+0:72            123000000456.000000
+0:73      Sequence
+0:73        move second child to first child ( temp double)
+0:73          'c17' ( temp double)
+0:73          Constant:
+0:73            1.2300000045600e+12
+0:74      Sequence
+0:74        move second child to first child ( temp double)
+0:74          'c18' ( temp double)
+0:74          Constant:
+0:74            1.2300000045601e+12
+0:76      Sequence
+0:76        move second child to first child ( temp double)
+0:76          'b11' ( temp double)
+0:76          Constant:
+0:76            7.2057594037928e+16
+0:77      Sequence
+0:77        move second child to first child ( temp double)
+0:77          'b12' ( temp double)
+0:77          Constant:
+0:77            7.2057594037928e+16
+0:78      Sequence
+0:78        move second child to first child ( temp double)
+0:78          'b13' ( temp double)
+0:78          Constant:
+0:78            7.2057594037928e+16
+0:79      Sequence
+0:79        move second child to first child ( temp double)
+0:79          'b14' ( temp double)
+0:79          Constant:
+0:79            7.2057594037928e+16
+0:80      Sequence
+0:80        move second child to first child ( temp double)
+0:80          'b15' ( temp double)
+0:80          Constant:
+0:80            7.2057594037928e+16
+0:81      Sequence
+0:81        move second child to first child ( temp double)
+0:81          'b21' ( temp double)
+0:81          Constant:
+0:81            9.2233720368548e+18
+0:82      Sequence
+0:82        move second child to first child ( temp double)
+0:82          'b22' ( temp double)
+0:82          Constant:
+0:82            9.2233720368548e+18
+0:83      Sequence
+0:83        move second child to first child ( temp double)
+0:83          'b23' ( temp double)
+0:83          Constant:
+0:83            9.2233720368548e+18
+0:84      Sequence
+0:84        move second child to first child ( temp double)
+0:84          'b24' ( temp double)
+0:84          Constant:
+0:84            9.2233720368548e+18
+0:85      Sequence
+0:85        move second child to first child ( temp double)
+0:85          'b25' ( temp double)
+0:85          Constant:
+0:85            9.2233720368548e+18
+0:86      Sequence
+0:86        move second child to first child ( temp double)
+0:86          'b31' ( temp double)
+0:86          Constant:
+0:86            1.0141204801826e+31
+0:87      Sequence
+0:87        move second child to first child ( temp double)
+0:87          'b32' ( temp double)
+0:87          Constant:
+0:87            1.0141204801826e+31
+0:88      Sequence
+0:88        move second child to first child ( temp double)
+0:88          'b33' ( temp double)
+0:88          Constant:
+0:88            1.0141204801826e+31
+0:89      Sequence
+0:89        move second child to first child ( temp double)
+0:89          'b34' ( temp double)
+0:89          Constant:
+0:89            1.0141204801826e+31
+0:90      Sequence
+0:90        move second child to first child ( temp double)
+0:90          'b35' ( temp double)
+0:90          Constant:
+0:90            1.0141204801826e+31
+0:91      Sequence
+0:91        move second child to first child ( temp double)
+0:91          'b41' ( temp double)
+0:91          Constant:
+0:91            5.7089907708238e+45
+0:92      Sequence
+0:92        move second child to first child ( temp double)
+0:92          'b42' ( temp double)
+0:92          Constant:
+0:92            5.7089907708238e+45
+0:93      Sequence
+0:93        move second child to first child ( temp double)
+0:93          'b43' ( temp double)
+0:93          Constant:
+0:93            5.7089907708238e+45
+0:94      Sequence
+0:94        move second child to first child ( temp double)
+0:94          'b44' ( temp double)
+0:94          Constant:
+0:94            5.7089907708238e+45
+0:95      Sequence
+0:95        move second child to first child ( temp double)
+0:95          'b45' ( temp double)
+0:95          Constant:
+0:95            5.7089907708238e+45
+0:97      Sequence
+0:97        move second child to first child ( temp float)
+0:97          'pi1' ( temp float)
+0:97          Constant:
+0:97            3.141593
+0:98      Sequence
+0:98        move second child to first child ( temp float)
+0:98          'pi2' ( temp float)
+0:98          Constant:
+0:98            3.141593
+0:99      Sequence
+0:99        move second child to first child ( temp float)
+0:99          'pi3' ( temp float)
+0:99          Constant:
+0:99            3.141593
+0:101      Sequence
+0:101        move second child to first child ( temp double)
+0:101          'dpi1' ( temp double)
+0:101          Constant:
+0:101            3.141593
+0:102      Sequence
+0:102        move second child to first child ( temp double)
+0:102          'dpi2' ( temp double)
+0:102          Constant:
+0:102            3.141593
+0:103      Sequence
+0:103        move second child to first child ( temp double)
+0:103          'dpi3' ( temp double)
+0:103          Constant:
+0:103            3.141593
+0:105      Sequence
+0:105        move second child to first child ( temp float)
+0:105          'dfpi1' ( temp float)
+0:105          Constant:
+0:105            3.141593
+0:106      Sequence
+0:106        move second child to first child ( temp float)
+0:106          'dfpi2' ( temp float)
+0:106          Constant:
+0:106            3.141593
+0:107      Sequence
+0:107        move second child to first child ( temp float)
+0:107          'dfpi3' ( temp float)
+0:107          Constant:
+0:107            3.141593
+0:109      Sequence
+0:109        move second child to first child ( temp double)
+0:109          'lfpi1' ( temp double)
+0:109          Constant:
+0:109            3.141593
+0:110      Sequence
+0:110        move second child to first child ( temp double)
+0:110          'lfpi2' ( temp double)
+0:110          Constant:
+0:110            3.141593
+0:111      Sequence
+0:111        move second child to first child ( temp double)
+0:111          'lfpi3' ( temp double)
+0:111          Constant:
+0:111            3.141593
+0:113      Sequence
+0:113        move second child to first child ( temp double)
+0:113          'hfpi1' ( temp double)
+0:113          Constant:
+0:113            3.141593
+0:114      Sequence
+0:114        move second child to first child ( temp double)
+0:114          'hfpi2' ( temp double)
+0:114          Constant:
+0:114            3.141593
+0:115      Sequence
+0:115        move second child to first child ( temp double)
+0:115          'hfpi3' ( temp double)
+0:115          Constant:
+0:115            3.141593
+0:?   Linker Objects
+0:?     'gl_VertexID' ( gl_VertexId int VertexId)
+0:?     'gl_InstanceID' ( gl_InstanceId int InstanceId)
+
+
+Linked vertex stage:
+
+
+Shader version: 460
+Requested GL_EXT_shader_explicit_arithmetic_types_float16
+0:? Sequence
+0:3  Function Definition: main( ( global void)
+0:3    Function Parameters: 
+0:5    Sequence
+0:5      Sequence
+0:5        move second child to first child ( temp float)
+0:5          'w1' ( temp float)
+0:5          Constant:
+0:5            0.000000
+0:6      Sequence
+0:6        move second child to first child ( temp float)
+0:6          'w2' ( temp float)
+0:6          Constant:
+0:6            1.000000
+0:7      Sequence
+0:7        move second child to first child ( temp float)
+0:7          'w3' ( temp float)
+0:7          Constant:
+0:7            7.000000
+0:8      Sequence
+0:8        move second child to first child ( temp float)
+0:8          'w4' ( temp float)
+0:8          Constant:
+0:8            130000.000000
+0:9      Sequence
+0:9        move second child to first child ( temp float)
+0:9          'w5' ( temp float)
+0:9          Constant:
+0:9            123456789.000000
+0:10      Sequence
+0:10        move second child to first child ( temp double)
+0:10          'w6' ( temp double)
+0:10          Constant:
+0:10            1.2345678901235e+15
+0:11      Sequence
+0:11        move second child to first child ( temp double)
+0:11          'w7' ( temp double)
+0:11          Constant:
+0:11            1.2345678901235e+16
+0:12      Sequence
+0:12        move second child to first child ( temp double)
+0:12          'w8' ( temp double)
+0:12          Constant:
+0:12            1.2345678901235e+17
+0:13      Sequence
+0:13        move second child to first child ( temp double)
+0:13          'w9' ( temp double)
+0:13          Constant:
+0:13            1.2345678901235e+19
+0:14      Sequence
+0:14        move second child to first child ( temp double)
+0:14          'w10' ( temp double)
+0:14          Constant:
+0:14            1.2345678901235e+24
+0:16      Sequence
+0:16        move second child to first child ( temp float)
+0:16          'e1' ( temp float)
+0:16          Constant:
+0:16            0.000000
+0:17      Sequence
+0:17        move second child to first child ( temp float)
+0:17          'e2' ( temp float)
+0:17          Constant:
+0:17            1.000000
+0:18      Sequence
+0:18        move second child to first child ( temp float)
+0:18          'e3' ( temp float)
+0:18          Constant:
+0:18            0.000000
+0:19      Sequence
+0:19        move second child to first child ( temp float)
+0:19          'e4' ( temp float)
+0:19          Constant:
+0:19            1.0000000000000e+15
+0:20      Sequence
+0:20        move second child to first child ( temp float)
+0:20          'e5' ( temp float)
+0:20          Constant:
+0:20            1.0000000000000e+16
+0:21      Sequence
+0:21        move second child to first child ( temp float)
+0:21          'e6' ( temp float)
+0:21          Constant:
+0:21            0.000000
+0:22      Sequence
+0:22        move second child to first child ( temp float)
+0:22          'e7' ( temp float)
+0:22          Constant:
+0:22            1.0000000000000e-15
+0:23      Sequence
+0:23        move second child to first child ( temp float)
+0:23          'e8' ( temp float)
+0:23          Constant:
+0:23            1.0000000000000e-16
+0:24      Sequence
+0:24        move second child to first child ( temp double)
+0:24          'e9' ( temp double)
+0:24          Constant:
+0:24            1.0000000000000e+100
+0:25      Sequence
+0:25        move second child to first child ( temp double)
+0:25          'e10' ( temp double)
+0:25          Constant:
+0:25            1.0000000000000e+308
+0:26      Sequence
+0:26        move second child to first child ( temp double)
+0:26          'e11' ( temp double)
+0:26          Constant:
+0:26            1.0000000000000e-307
+0:27      Sequence
+0:27        move second child to first child ( temp double)
+0:27          'e12' ( temp double)
+0:27          Constant:
+0:27            +1.#INF
+0:28      Sequence
+0:28        move second child to first child ( temp double)
+0:28          'e13' ( temp double)
+0:28          Constant:
+0:28            0.000000
+0:29      Sequence
+0:29        move second child to first child ( temp double)
+0:29          'e24' ( temp double)
+0:29          Constant:
+0:29            +1.#INF
+0:30      Sequence
+0:30        move second child to first child ( temp double)
+0:30          'e25' ( temp double)
+0:30          Constant:
+0:30            0.000000
+0:32      Sequence
+0:32        move second child to first child ( temp double)
+0:32          'f1' ( temp double)
+0:32          Constant:
+0:32            0.500000
+0:33      Sequence
+0:33        move second child to first child ( temp double)
+0:33          'f2' ( temp double)
+0:33          Constant:
+0:33            0.125000
+0:34      Sequence
+0:34        move second child to first child ( temp double)
+0:34          'f31' ( temp double)
+0:34          Constant:
+0:34            0.100000
+0:35      Sequence
+0:35        move second child to first child ( temp double)
+0:35          'f32' ( temp double)
+0:35          Constant:
+0:35            0.200000
+0:36      Sequence
+0:36        move second child to first child ( temp double)
+0:36          'f33' ( temp double)
+0:36          Constant:
+0:36            0.300000
+0:37      Sequence
+0:37        move second child to first child ( temp double)
+0:37          'f34' ( temp double)
+0:37          Constant:
+0:37            0.400000
+0:38      Sequence
+0:38        move second child to first child ( temp double)
+0:38          'f35' ( temp double)
+0:38          Constant:
+0:38            0.500000
+0:39      Sequence
+0:39        move second child to first child ( temp double)
+0:39          'f36' ( temp double)
+0:39          Constant:
+0:39            0.600000
+0:40      Sequence
+0:40        move second child to first child ( temp double)
+0:40          'f37' ( temp double)
+0:40          Constant:
+0:40            0.700000
+0:41      Sequence
+0:41        move second child to first child ( temp double)
+0:41          'f38' ( temp double)
+0:41          Constant:
+0:41            0.800000
+0:42      Sequence
+0:42        move second child to first child ( temp double)
+0:42          'f39' ( temp double)
+0:42          Constant:
+0:42            0.900000
+0:43      Sequence
+0:43        move second child to first child ( temp double)
+0:43          'f4' ( temp double)
+0:43          Constant:
+0:43            0.333333
+0:44      Sequence
+0:44        move second child to first child ( temp double)
+0:44          'f51' ( temp double)
+0:44          Constant:
+0:44            7.8347500000000e-37
+0:45      Sequence
+0:45        move second child to first child ( temp double)
+0:45          'f52' ( temp double)
+0:45          Constant:
+0:45            7.8347500000000e-37
+0:46      Sequence
+0:46        move second child to first child ( temp double)
+0:46          'f53' ( temp double)
+0:46          Constant:
+0:46            7.8347500000000e-37
+0:47      Sequence
+0:47        move second child to first child ( temp double)
+0:47          'f54' ( temp double)
+0:47          Constant:
+0:47            7.8347500000000e-37
+0:48      Sequence
+0:48        move second child to first child ( temp double)
+0:48          'f61' ( temp double)
+0:48          Constant:
+0:48            4.000000
+0:49      Sequence
+0:49        move second child to first child ( temp double)
+0:49          'f62' ( temp double)
+0:49          Constant:
+0:49            40.000000
+0:50      Sequence
+0:50        move second child to first child ( temp double)
+0:50          'f63' ( temp double)
+0:50          Constant:
+0:50            0.000000
+0:51      Sequence
+0:51        move second child to first child ( temp double)
+0:51          'f64' ( temp double)
+0:51          Constant:
+0:51            4.000000
+0:52      Sequence
+0:52        move second child to first child ( temp double)
+0:52          'f65' ( temp double)
+0:52          Constant:
+0:52            0.000000
+0:53      Sequence
+0:53        move second child to first child ( temp double)
+0:53          'f66' ( temp double)
+0:53          Constant:
+0:53            0.004000
+0:54      Sequence
+0:54        move second child to first child ( temp double)
+0:54          'f67' ( temp double)
+0:54          Constant:
+0:54            0.400000
+0:55      Sequence
+0:55        move second child to first child ( temp double)
+0:55          'f68' ( temp double)
+0:55          Constant:
+0:55            0.040000
+0:57      Sequence
+0:57        move second child to first child ( temp double)
+0:57          'c1' ( temp double)
+0:57          Constant:
+0:57            0.000810
+0:58      Sequence
+0:58        move second child to first child ( temp double)
+0:58          'c2' ( temp double)
+0:58          Constant:
+0:58            7.300000
+0:59      Sequence
+0:59        move second child to first child ( temp double)
+0:59          'c3' ( temp double)
+0:59          Constant:
+0:59            3.450000
+0:60      Sequence
+0:60        move second child to first child ( temp double)
+0:60          'c4' ( temp double)
+0:60          Constant:
+0:60            0.003570
+0:61      Sequence
+0:61        move second child to first child ( temp double)
+0:61          'c5' ( temp double)
+0:61          Constant:
+0:61            439.000000
+0:62      Sequence
+0:62        move second child to first child ( temp double)
+0:62          'c6' ( temp double)
+0:62          Constant:
+0:62            522000.000000
+0:63      Sequence
+0:63        move second child to first child ( temp double)
+0:63          'c7' ( temp double)
+0:63          Constant:
+0:63            61000000.000000
+0:64      Sequence
+0:64        move second child to first child ( temp double)
+0:64          'c8' ( temp double)
+0:64          Constant:
+0:64            0.610000
+0:65      Sequence
+0:65        move second child to first child ( temp double)
+0:65          'c9' ( temp double)
+0:65          Constant:
+0:65            1.2345678901235e+18
+0:66      Sequence
+0:66        move second child to first child ( temp double)
+0:66          'c10' ( temp double)
+0:66          Constant:
+0:66            1.0000000000000e+21
+0:67      Sequence
+0:67        move second child to first child ( temp double)
+0:67          'c11' ( temp double)
+0:67          Constant:
+0:67            1230000.004560
+0:68      Sequence
+0:68        move second child to first child ( temp double)
+0:68          'c12' ( temp double)
+0:68          Constant:
+0:68            1230.000004
+0:69      Sequence
+0:69        move second child to first child ( temp double)
+0:69          'c13' ( temp double)
+0:69          Constant:
+0:69            123.000000
+0:70      Sequence
+0:70        move second child to first child ( temp double)
+0:70          'c14' ( temp double)
+0:70          Constant:
+0:70            102.300000
+0:71      Sequence
+0:71        move second child to first child ( temp double)
+0:71          'c15' ( temp double)
+0:71          Constant:
+0:71            1.2003000000456e+12
+0:72      Sequence
+0:72        move second child to first child ( temp double)
+0:72          'c16' ( temp double)
+0:72          Constant:
+0:72            123000000456.000000
+0:73      Sequence
+0:73        move second child to first child ( temp double)
+0:73          'c17' ( temp double)
+0:73          Constant:
+0:73            1.2300000045600e+12
+0:74      Sequence
+0:74        move second child to first child ( temp double)
+0:74          'c18' ( temp double)
+0:74          Constant:
+0:74            1.2300000045601e+12
+0:76      Sequence
+0:76        move second child to first child ( temp double)
+0:76          'b11' ( temp double)
+0:76          Constant:
+0:76            7.2057594037928e+16
+0:77      Sequence
+0:77        move second child to first child ( temp double)
+0:77          'b12' ( temp double)
+0:77          Constant:
+0:77            7.2057594037928e+16
+0:78      Sequence
+0:78        move second child to first child ( temp double)
+0:78          'b13' ( temp double)
+0:78          Constant:
+0:78            7.2057594037928e+16
+0:79      Sequence
+0:79        move second child to first child ( temp double)
+0:79          'b14' ( temp double)
+0:79          Constant:
+0:79            7.2057594037928e+16
+0:80      Sequence
+0:80        move second child to first child ( temp double)
+0:80          'b15' ( temp double)
+0:80          Constant:
+0:80            7.2057594037928e+16
+0:81      Sequence
+0:81        move second child to first child ( temp double)
+0:81          'b21' ( temp double)
+0:81          Constant:
+0:81            9.2233720368548e+18
+0:82      Sequence
+0:82        move second child to first child ( temp double)
+0:82          'b22' ( temp double)
+0:82          Constant:
+0:82            9.2233720368548e+18
+0:83      Sequence
+0:83        move second child to first child ( temp double)
+0:83          'b23' ( temp double)
+0:83          Constant:
+0:83            9.2233720368548e+18
+0:84      Sequence
+0:84        move second child to first child ( temp double)
+0:84          'b24' ( temp double)
+0:84          Constant:
+0:84            9.2233720368548e+18
+0:85      Sequence
+0:85        move second child to first child ( temp double)
+0:85          'b25' ( temp double)
+0:85          Constant:
+0:85            9.2233720368548e+18
+0:86      Sequence
+0:86        move second child to first child ( temp double)
+0:86          'b31' ( temp double)
+0:86          Constant:
+0:86            1.0141204801826e+31
+0:87      Sequence
+0:87        move second child to first child ( temp double)
+0:87          'b32' ( temp double)
+0:87          Constant:
+0:87            1.0141204801826e+31
+0:88      Sequence
+0:88        move second child to first child ( temp double)
+0:88          'b33' ( temp double)
+0:88          Constant:
+0:88            1.0141204801826e+31
+0:89      Sequence
+0:89        move second child to first child ( temp double)
+0:89          'b34' ( temp double)
+0:89          Constant:
+0:89            1.0141204801826e+31
+0:90      Sequence
+0:90        move second child to first child ( temp double)
+0:90          'b35' ( temp double)
+0:90          Constant:
+0:90            1.0141204801826e+31
+0:91      Sequence
+0:91        move second child to first child ( temp double)
+0:91          'b41' ( temp double)
+0:91          Constant:
+0:91            5.7089907708238e+45
+0:92      Sequence
+0:92        move second child to first child ( temp double)
+0:92          'b42' ( temp double)
+0:92          Constant:
+0:92            5.7089907708238e+45
+0:93      Sequence
+0:93        move second child to first child ( temp double)
+0:93          'b43' ( temp double)
+0:93          Constant:
+0:93            5.7089907708238e+45
+0:94      Sequence
+0:94        move second child to first child ( temp double)
+0:94          'b44' ( temp double)
+0:94          Constant:
+0:94            5.7089907708238e+45
+0:95      Sequence
+0:95        move second child to first child ( temp double)
+0:95          'b45' ( temp double)
+0:95          Constant:
+0:95            5.7089907708238e+45
+0:97      Sequence
+0:97        move second child to first child ( temp float)
+0:97          'pi1' ( temp float)
+0:97          Constant:
+0:97            3.141593
+0:98      Sequence
+0:98        move second child to first child ( temp float)
+0:98          'pi2' ( temp float)
+0:98          Constant:
+0:98            3.141593
+0:99      Sequence
+0:99        move second child to first child ( temp float)
+0:99          'pi3' ( temp float)
+0:99          Constant:
+0:99            3.141593
+0:101      Sequence
+0:101        move second child to first child ( temp double)
+0:101          'dpi1' ( temp double)
+0:101          Constant:
+0:101            3.141593
+0:102      Sequence
+0:102        move second child to first child ( temp double)
+0:102          'dpi2' ( temp double)
+0:102          Constant:
+0:102            3.141593
+0:103      Sequence
+0:103        move second child to first child ( temp double)
+0:103          'dpi3' ( temp double)
+0:103          Constant:
+0:103            3.141593
+0:105      Sequence
+0:105        move second child to first child ( temp float)
+0:105          'dfpi1' ( temp float)
+0:105          Constant:
+0:105            3.141593
+0:106      Sequence
+0:106        move second child to first child ( temp float)
+0:106          'dfpi2' ( temp float)
+0:106          Constant:
+0:106            3.141593
+0:107      Sequence
+0:107        move second child to first child ( temp float)
+0:107          'dfpi3' ( temp float)
+0:107          Constant:
+0:107            3.141593
+0:109      Sequence
+0:109        move second child to first child ( temp double)
+0:109          'lfpi1' ( temp double)
+0:109          Constant:
+0:109            3.141593
+0:110      Sequence
+0:110        move second child to first child ( temp double)
+0:110          'lfpi2' ( temp double)
+0:110          Constant:
+0:110            3.141593
+0:111      Sequence
+0:111        move second child to first child ( temp double)
+0:111          'lfpi3' ( temp double)
+0:111          Constant:
+0:111            3.141593
+0:113      Sequence
+0:113        move second child to first child ( temp double)
+0:113          'hfpi1' ( temp double)
+0:113          Constant:
+0:113            3.141593
+0:114      Sequence
+0:114        move second child to first child ( temp double)
+0:114          'hfpi2' ( temp double)
+0:114          Constant:
+0:114            3.141593
+0:115      Sequence
+0:115        move second child to first child ( temp double)
+0:115          'hfpi3' ( temp double)
+0:115          Constant:
+0:115            3.141593
+0:?   Linker Objects
+0:?     'gl_VertexID' ( gl_VertexId int VertexId)
+0:?     'gl_InstanceID' ( gl_InstanceId int InstanceId)
+
diff --git a/Test/baseResults/test.conf b/Test/baseResults/test.conf
index f156c5c..cff7716 100644
--- a/Test/baseResults/test.conf
+++ b/Test/baseResults/test.conf
@@ -81,6 +81,15 @@
 MaxCullDistances 8
 MaxCombinedClipAndCullDistances 8
 MaxSamples 4
+MaxMeshOutputVerticesNV 256
+MaxMeshOutputPrimitivesNV 512
+MaxMeshWorkGroupSizeX_NV 32
+MaxMeshWorkGroupSizeY_NV 1
+MaxMeshWorkGroupSizeZ_NV 1
+MaxTaskWorkGroupSizeX_NV 32
+MaxTaskWorkGroupSizeY_NV 1
+MaxTaskWorkGroupSizeZ_NV 1
+MaxMeshViewCountNV 4
 nonInductiveForLoops 1
 whileLoops 1
 doWhileLoops 1
diff --git a/Test/baseResults/tokenLength.vert.out b/Test/baseResults/tokenLength.vert.out
index c473858..8c31da9 100644
--- a/Test/baseResults/tokenLength.vert.out
+++ b/Test/baseResults/tokenLength.vert.out
@@ -51,7 +51,7 @@
 0:13    move second child to first child ( temp highp int)
 0:13      'OE' ( global highp int)
 0:13      Constant:
-0:13        1073741823 (const int)
+0:13        -1 (const int)
 0:14  Sequence
 0:14    move second child to first child ( temp highp int)
 0:14      'HE' ( global highp int)
@@ -92,7 +92,7 @@
 0:34    move second child to first child ( temp highp int)
 0:34      'superO' ( global highp int)
 0:34      Constant:
-0:34        1073741823 (const int)
+0:34        -1 (const int)
 0:35  Sequence
 0:35    move second child to first child ( temp highp int)
 0:35      'superI' ( global highp int)
@@ -147,7 +147,7 @@
 0:13    move second child to first child ( temp highp int)
 0:13      'OE' ( global highp int)
 0:13      Constant:
-0:13        1073741823 (const int)
+0:13        -1 (const int)
 0:14  Sequence
 0:14    move second child to first child ( temp highp int)
 0:14      'HE' ( global highp int)
@@ -188,7 +188,7 @@
 0:34    move second child to first child ( temp highp int)
 0:34      'superO' ( global highp int)
 0:34      Constant:
-0:34        1073741823 (const int)
+0:34        -1 (const int)
 0:35  Sequence
 0:35    move second child to first child ( temp highp int)
 0:35      'superI' ( global highp int)
diff --git a/Test/baseResults/tokenPaste.vert.out b/Test/baseResults/tokenPaste.vert.out
old mode 100755
new mode 100644
index acc2ced..b5ba9a5
--- a/Test/baseResults/tokenPaste.vert.out
+++ b/Test/baseResults/tokenPaste.vert.out
@@ -1,5 +1,4 @@
 tokenPaste.vert
-Warning, version 450 is not yet complete; most version-specific features are present, but some are missing.
 ERROR: 0:38: '##' : unexpected location 
 ERROR: 0:40: '##' : unexpected location; end of replacement list 
 ERROR: 0:49: '##' : combined tokens are too long 
diff --git a/Test/baseResults/versionsClean.vert.out b/Test/baseResults/versionsClean.vert.out
index cd9da12..4b098be 100644
--- a/Test/baseResults/versionsClean.vert.out
+++ b/Test/baseResults/versionsClean.vert.out
@@ -1,6 +1,4 @@
 versionsClean.vert
-Warning, version 420 is not yet complete; most version-specific features are present, but some are missing.
-
 Shader version: 420
 0:? Sequence
 0:40  Function Definition: main( ( global void)
@@ -8,7 +6,7 @@
 0:42    Sequence
 0:42      move second child to first child ( temp 4-component vector of float)
 0:42        gl_Position: direct index for structure ( gl_Position 4-component vector of float Position)
-0:42          'anon@0' ( out block{ gl_Position 4-component vector of float Position gl_Position,  gl_PointSize float PointSize gl_PointSize,  out implicitly-sized array of float ClipDistance gl_ClipDistance,  gl_ClipVertex 4-component vector of float ClipVertex gl_ClipVertex,  out 4-component vector of float FrontColor gl_FrontColor,  out 4-component vector of float BackColor gl_BackColor,  out 4-component vector of float FrontSecondaryColor gl_FrontSecondaryColor,  out 4-component vector of float BackSecondaryColor gl_BackSecondaryColor,  out implicitly-sized array of 4-component vector of float TexCoord gl_TexCoord,  out float FogFragCoord gl_FogFragCoord})
+0:42          'anon@0' ( out block{ gl_Position 4-component vector of float Position gl_Position,  gl_PointSize float PointSize gl_PointSize,  out unsized 1-element array of float ClipDistance gl_ClipDistance,  gl_ClipVertex 4-component vector of float ClipVertex gl_ClipVertex,  out 4-component vector of float FrontColor gl_FrontColor,  out 4-component vector of float BackColor gl_BackColor,  out 4-component vector of float FrontSecondaryColor gl_FrontSecondaryColor,  out 4-component vector of float BackSecondaryColor gl_BackSecondaryColor,  out unsized 1-element array of 4-component vector of float TexCoord gl_TexCoord,  out float FogFragCoord gl_FogFragCoord})
 0:42          Constant:
 0:42            0 (const uint)
 0:42        Construct vec4 ( temp 4-component vector of float)
@@ -18,7 +16,7 @@
 0:?   Linker Objects
 0:?     'color' ( in 3-component vector of float)
 0:?     'foo' ( uniform sampler2DRect)
-0:?     'anon@0' ( out block{ gl_Position 4-component vector of float Position gl_Position,  gl_PointSize float PointSize gl_PointSize,  out implicitly-sized array of float ClipDistance gl_ClipDistance,  gl_ClipVertex 4-component vector of float ClipVertex gl_ClipVertex,  out 4-component vector of float FrontColor gl_FrontColor,  out 4-component vector of float BackColor gl_BackColor,  out 4-component vector of float FrontSecondaryColor gl_FrontSecondaryColor,  out 4-component vector of float BackSecondaryColor gl_BackSecondaryColor,  out implicitly-sized array of 4-component vector of float TexCoord gl_TexCoord,  out float FogFragCoord gl_FogFragCoord})
+0:?     'anon@0' ( out block{ gl_Position 4-component vector of float Position gl_Position,  gl_PointSize float PointSize gl_PointSize,  out unsized 1-element array of float ClipDistance gl_ClipDistance,  gl_ClipVertex 4-component vector of float ClipVertex gl_ClipVertex,  out 4-component vector of float FrontColor gl_FrontColor,  out 4-component vector of float BackColor gl_BackColor,  out 4-component vector of float FrontSecondaryColor gl_FrontSecondaryColor,  out 4-component vector of float BackSecondaryColor gl_BackSecondaryColor,  out unsized 1-element array of 4-component vector of float TexCoord gl_TexCoord,  out float FogFragCoord gl_FogFragCoord})
 0:?     'gl_VertexID' ( gl_VertexId int VertexId)
 0:?     'gl_InstanceID' ( gl_InstanceId int InstanceId)
 
diff --git a/Test/baseResults/versionsErrors.vert.out b/Test/baseResults/versionsErrors.vert.out
index 0d37136..6551364 100644
--- a/Test/baseResults/versionsErrors.vert.out
+++ b/Test/baseResults/versionsErrors.vert.out
@@ -1,5 +1,4 @@
 versionsErrors.vert
-Warning, version 420 is not yet complete; most version-specific features are present, but some are missing.
 WARNING: 0:38: attribute deprecated in version 130; may be removed in future release
 ERROR: 0:38: 'attribute' : no longer supported in core profile; removed in version 420
 ERROR: 0:45: 'discard' : not supported in this stage: vertex
@@ -14,7 +13,7 @@
 0:44    Sequence
 0:44      move second child to first child ( temp 4-component vector of float)
 0:44        gl_Position: direct index for structure ( gl_Position 4-component vector of float Position)
-0:44          'anon@0' ( out block{ gl_Position 4-component vector of float Position gl_Position,  gl_PointSize float PointSize gl_PointSize,  out implicitly-sized array of float ClipDistance gl_ClipDistance,  gl_ClipVertex 4-component vector of float ClipVertex gl_ClipVertex,  out 4-component vector of float FrontColor gl_FrontColor,  out 4-component vector of float BackColor gl_BackColor,  out 4-component vector of float FrontSecondaryColor gl_FrontSecondaryColor,  out 4-component vector of float BackSecondaryColor gl_BackSecondaryColor,  out implicitly-sized array of 4-component vector of float TexCoord gl_TexCoord,  out float FogFragCoord gl_FogFragCoord})
+0:44          'anon@0' ( out block{ gl_Position 4-component vector of float Position gl_Position,  gl_PointSize float PointSize gl_PointSize,  out unsized 1-element array of float ClipDistance gl_ClipDistance,  gl_ClipVertex 4-component vector of float ClipVertex gl_ClipVertex,  out 4-component vector of float FrontColor gl_FrontColor,  out 4-component vector of float BackColor gl_BackColor,  out 4-component vector of float FrontSecondaryColor gl_FrontSecondaryColor,  out 4-component vector of float BackSecondaryColor gl_BackSecondaryColor,  out unsized 1-element array of 4-component vector of float TexCoord gl_TexCoord,  out float FogFragCoord gl_FogFragCoord})
 0:44          Constant:
 0:44            0 (const uint)
 0:44        Construct vec4 ( temp 4-component vector of float)
@@ -25,7 +24,7 @@
 0:?   Linker Objects
 0:?     'color' ( in 3-component vector of float)
 0:?     'foo' ( uniform sampler2DRect)
-0:?     'anon@0' ( out block{ gl_Position 4-component vector of float Position gl_Position,  gl_PointSize float PointSize gl_PointSize,  out implicitly-sized array of float ClipDistance gl_ClipDistance,  gl_ClipVertex 4-component vector of float ClipVertex gl_ClipVertex,  out 4-component vector of float FrontColor gl_FrontColor,  out 4-component vector of float BackColor gl_BackColor,  out 4-component vector of float FrontSecondaryColor gl_FrontSecondaryColor,  out 4-component vector of float BackSecondaryColor gl_BackSecondaryColor,  out implicitly-sized array of 4-component vector of float TexCoord gl_TexCoord,  out float FogFragCoord gl_FogFragCoord})
+0:?     'anon@0' ( out block{ gl_Position 4-component vector of float Position gl_Position,  gl_PointSize float PointSize gl_PointSize,  out unsized 1-element array of float ClipDistance gl_ClipDistance,  gl_ClipVertex 4-component vector of float ClipVertex gl_ClipVertex,  out 4-component vector of float FrontColor gl_FrontColor,  out 4-component vector of float BackColor gl_BackColor,  out 4-component vector of float FrontSecondaryColor gl_FrontSecondaryColor,  out 4-component vector of float BackSecondaryColor gl_BackSecondaryColor,  out unsized 1-element array of 4-component vector of float TexCoord gl_TexCoord,  out float FogFragCoord gl_FogFragCoord})
 0:?     'gl_VertexID' ( gl_VertexId int VertexId)
 0:?     'gl_InstanceID' ( gl_InstanceId int InstanceId)
 
diff --git a/Test/baseResults/vulkan.ast.vert.out b/Test/baseResults/vulkan.ast.vert.out
old mode 100755
new mode 100644
index bfc38c0..72a4570
--- a/Test/baseResults/vulkan.ast.vert.out
+++ b/Test/baseResults/vulkan.ast.vert.out
@@ -1,6 +1,4 @@
 vulkan.ast.vert
-Warning, version 450 is not yet complete; most version-specific features are present, but some are missing.
-
 Shader version: 450
 0:? Sequence
 0:7  Function Definition: main( ( global void)
@@ -260,7 +258,7 @@
 0:?       2 (const int)
 
 // Module Version 10000
-// Generated by (magic number): 80001
+// Generated by (magic number): 80007
 // Id's are bound by 50
 
                               Capability Shader
diff --git a/Test/baseResults/vulkan.comp.out b/Test/baseResults/vulkan.comp.out
index 5eb4c5b..e56dca4 100644
--- a/Test/baseResults/vulkan.comp.out
+++ b/Test/baseResults/vulkan.comp.out
@@ -1,5 +1,4 @@
 vulkan.comp
-Warning, version 450 is not yet complete; most version-specific features are present, but some are missing.
 ERROR: 0:5: 'local_size' : cannot change previously set size 
 ERROR: 1 compilation errors.  No code generated.
 
diff --git a/Test/baseResults/vulkan.frag.out b/Test/baseResults/vulkan.frag.out
index 27edff9..c81ed25 100644
--- a/Test/baseResults/vulkan.frag.out
+++ b/Test/baseResults/vulkan.frag.out
@@ -1,5 +1,11 @@
 vulkan.frag
-Warning, version 450 is not yet complete; most version-specific features are present, but some are missing.
+ERROR: 0:3: 'binding' : sampler/texture/image requires layout(binding=X) 
+ERROR: 0:4: 'binding' : sampler/texture/image requires layout(binding=X) 
+ERROR: 0:5: 'binding' : sampler/texture/image requires layout(binding=X) 
+ERROR: 0:6: 'binding' : sampler/texture/image requires layout(binding=X) 
+ERROR: 0:8: 'binding' : sampler/texture/image requires layout(binding=X) 
+ERROR: 0:9: 'binding' : sampler/texture/image requires layout(binding=X) 
+ERROR: 0:10: 'binding' : sampler/texture/image requires layout(binding=X) 
 ERROR: 0:14: 'sampler2D' : sampler-constructor requires two arguments 
 ERROR: 0:15: 'sampler2D' : sampler-constructor first argument must be a scalar textureXXX type 
 ERROR: 0:16: 'sampler2D' : sampler-constructor first argument must be a scalar textureXXX type 
@@ -9,26 +15,30 @@
 ERROR: 0:21: 'sampler3D' : sampler-constructor cannot make an array of samplers 
 ERROR: 0:22: 'sampler2D' : sampler-constructor first argument must be a scalar textureXXX type 
 ERROR: 0:23: 'sampler2D' : sampler-constructor first argument must match type and dimensionality of constructor type 
-ERROR: 0:24: 'sampler2D' : sampler-constructor second argument presence of shadow must match constructor presence of shadow 
-ERROR: 0:25: 'sampler2DShadow' : sampler-constructor second argument presence of shadow must match constructor presence of shadow 
 ERROR: 0:28: 'sampler2D' : sampler/image types can only be used in uniform variables or function parameters: s2D
 ERROR: 0:29: 'sampler3D' : sampler-constructor cannot make an array of samplers 
 ERROR: 0:29: 'sampler3D' : sampler/image types can only be used in uniform variables or function parameters: s3d
 ERROR: 0:29: '=' :  cannot convert from ' const float' to ' global 4-element array of highp sampler3D'
+ERROR: 0:31: 'location' : SPIR-V requires location for user input/output 
 ERROR: 0:39: 'push_constant' : can only be used with a uniform 
 ERROR: 0:43: 'non-opaque uniforms outside a block' : not allowed when using GLSL for Vulkan 
 ERROR: 0:43: 'push_constant' : can only be used with a block 
 ERROR: 0:45: 'push_constant' : cannot declare a default, can only be used on a block 
+ERROR: 0:51: 'binding' : sampler/texture/image requires layout(binding=X) 
+ERROR: 0:52: 'binding' : sampler/texture/image requires layout(binding=X) 
 ERROR: 0:52: 'input_attachment_index' : can only be used with a subpass 
+ERROR: 0:53: 'binding' : sampler/texture/image requires layout(binding=X) 
 ERROR: 0:53: 'input_attachment_index' : can only be used with a subpass 
+ERROR: 0:54: 'binding' : sampler/texture/image requires layout(binding=X) 
 ERROR: 0:54: 'subpass' : requires an input_attachment_index layout qualifier 
+ERROR: 0:55: 'binding' : sampler/texture/image requires layout(binding=X) 
 ERROR: 0:60: 'subpassLoadMS' : no matching overloaded function found 
 ERROR: 0:61: 'subpassLoad' : no matching overloaded function found 
 ERROR: 0:63: 'subpassLoadMS' : no matching overloaded function found 
 ERROR: 0:66: 'subroutine' : not allowed when generating SPIR-V 
-ERROR: 0:66: 'non-opaque uniforms outside a block' : not allowed when using GLSL for Vulkan 
+ERROR: 0:66: 'subroutine' : feature not yet implemented 
 ERROR: 0:67: 'subroutine' : not allowed when generating SPIR-V 
-ERROR: 0:67: 'uniform' : no qualifiers allowed for function return 
+ERROR: 0:67: 'subroutine' : feature not yet implemented 
 ERROR: 0:69: 'non-opaque uniforms outside a block' : not allowed when using GLSL for Vulkan 
 ERROR: 0:73: 'texture' : no matching overloaded function found 
 ERROR: 0:74: 'imageStore' : no matching overloaded function found 
@@ -40,7 +50,11 @@
 ERROR: 0:94: ':' :  wrong operand types: no operation ':' exists that takes a left-hand operand of type ' temp sampler2D' and a right operand of type ' temp sampler2D' (or there is no acceptable conversion)
 ERROR: 0:94: 'call argument' : sampler constructor must appear at point of use 
 ERROR: 0:96: 'gl_NumSamples' : undeclared identifier 
-ERROR: 38 compilation errors.  No code generated.
+ERROR: 0:101: 'noise1' : no matching overloaded function found 
+ERROR: 0:102: 'noise2' : no matching overloaded function found 
+ERROR: 0:103: 'noise3' : no matching overloaded function found 
+ERROR: 0:104: 'noise4' : no matching overloaded function found 
+ERROR: 53 compilation errors.  No code generated.
 
 
 ERROR: Linking fragment stage: Only one push_constant block is allowed per stage
diff --git a/Test/baseResults/vulkan.vert.out b/Test/baseResults/vulkan.vert.out
index 1e74417..19fdade 100644
--- a/Test/baseResults/vulkan.vert.out
+++ b/Test/baseResults/vulkan.vert.out
@@ -1,13 +1,20 @@
 vulkan.vert
-Warning, version 450 is not yet complete; most version-specific features are present, but some are missing.
 ERROR: 0:3: 'subpass input' : not supported in this stage: vertex
+ERROR: 0:3: 'binding' : sampler/texture/image requires layout(binding=X) 
 ERROR: 0:4: 'subpass input' : not supported in this stage: vertex
+ERROR: 0:4: 'binding' : sampler/texture/image requires layout(binding=X) 
 ERROR: 0:5: 'subpass input' : not supported in this stage: vertex
+ERROR: 0:5: 'binding' : sampler/texture/image requires layout(binding=X) 
 ERROR: 0:6: 'subpass input' : not supported in this stage: vertex
+ERROR: 0:6: 'binding' : sampler/texture/image requires layout(binding=X) 
 ERROR: 0:7: 'subpass input' : not supported in this stage: vertex
+ERROR: 0:7: 'binding' : sampler/texture/image requires layout(binding=X) 
 ERROR: 0:8: 'subpass input' : not supported in this stage: vertex
+ERROR: 0:8: 'binding' : sampler/texture/image requires layout(binding=X) 
+ERROR: 0:10: 'location' : SPIR-V requires location for user input/output 
 ERROR: 0:12: 'constant_id' : can only be applied to a scalar 
 ERROR: 0:13: 'constant_id' : specialization-constant id already used 
+ERROR: 0:13: 'binding' : sampler/texture/image requires layout(binding=X) 
 ERROR: 0:13: 'constant_id' : can only be applied to 'const'-qualified scalar 
 ERROR: 0:13: 'constant_id' : cannot be applied to this type 
 ERROR: 0:14: 'constant_id' : specialization-constant id is too large 
@@ -23,7 +30,14 @@
 ERROR: 0:34: '=' : can't use with types containing arrays sized with a specialization constant 
 ERROR: 0:35: '==' : can't use with types containing arrays sized with a specialization constant 
 ERROR: 0:39: 'set' : cannot be used with push_constant 
-ERROR: 23 compilation errors.  No code generated.
+ERROR: 0:49: '[]' : only outermost dimension of an array of arrays can be a specialization constant 
+ERROR: 0:50: '[]' : only outermost dimension of an array of arrays can be a specialization constant 
+ERROR: 0:51: '[]' : only outermost dimension of an array of arrays can be a specialization constant 
+ERROR: 0:54: '[]' : only outermost dimension of an array of arrays can be a specialization constant 
+ERROR: 0:54: 'location' : SPIR-V requires location for user input/output 
+ERROR: 0:58: 'location' : SPIR-V requires location for user input/output 
+ERROR: 0:65: 'location' : overlapping use of location 10
+ERROR: 38 compilation errors.  No code generated.
 
 
 SPIR-V is not generated for failed compile or link
diff --git a/Test/bump b/Test/bump
index f23be33..03df632 100755
--- a/Test/bump
+++ b/Test/bump
@@ -1,2 +1,3 @@
+#!/usr/bin/env bash
 cp localResults/* baseResults/
 
diff --git a/Test/compoundsuffix.frag.hlsl b/Test/compoundsuffix.frag.hlsl
new file mode 100644
index 0000000..59322ac
--- /dev/null
+++ b/Test/compoundsuffix.frag.hlsl
@@ -0,0 +1,6 @@
+void main(out float4 fragColor : SV_TARGET0)

+{

+    fragColor = 1;

+}

+

+

diff --git a/Test/compoundsuffix.vert.glsl b/Test/compoundsuffix.vert.glsl
new file mode 100644
index 0000000..26862ff
--- /dev/null
+++ b/Test/compoundsuffix.vert.glsl
@@ -0,0 +1,4 @@
+void main()

+{

+    gl_Position = vec4(1.0);

+}
\ No newline at end of file
diff --git a/Test/constFold.frag b/Test/constFold.frag
index 7306078..daecaa2 100644
--- a/Test/constFold.frag
+++ b/Test/constFold.frag
@@ -81,7 +81,7 @@
     a[0] = s.m[1].z;     // 7.0
     b % 0;  // int
     b / 0;
-    e / 0;
+    e / 0;  -e / 0;  0.0 / 0.0;
     const uint ua = 5;
     const uvec2 ub = uvec2(6, 7);
     const uint uc = 8;
diff --git a/Test/constFoldIntMin.frag b/Test/constFoldIntMin.frag
new file mode 100644
index 0000000..6861832
--- /dev/null
+++ b/Test/constFoldIntMin.frag
@@ -0,0 +1,12 @@
+#version 460 core
+#extension GL_AMD_gpu_shader_int16 : enable
+#extension GL_ARB_gpu_shader_int64 : enable
+
+void a(){
+    int16_t u = -32768S / -1S; // SHRT_MIN
+    int v = -2147483648 / -1; // INT_MIN
+    int64_t w = -9223372036854775808L / -1L; // LLONG_MIN
+    int16_t x = -32768S % -1S; // SHRT_MIN
+    int y = -2147483648 % -1; // INT_MIN
+    int64_t z = -9223372036854775808L % -1L; // LLONG_MIN
+}
\ No newline at end of file
diff --git a/Test/constantUnaryConversion.comp b/Test/constantUnaryConversion.comp
new file mode 100644
index 0000000..3c479ae
--- /dev/null
+++ b/Test/constantUnaryConversion.comp
@@ -0,0 +1,48 @@
+#version 450

+

+#extension GL_EXT_shader_explicit_arithmetic_types : require

+

+const bool bool_init = true;

+const int8_t int8_t_init = int8_t(-1);

+const int16_t int16_t_init = int16_t(-2);

+const int32_t int32_t_init = int32_t(-3);

+const int64_t int64_t_init = int64_t(-4);

+const uint8_t uint8_t_init = uint8_t(1);

+const uint16_t uint16_t_init = uint16_t(2);

+const uint32_t uint32_t_init = uint32_t(3);

+const uint64_t uint64_t_init = uint64_t(4);

+const float16_t float16_t_init = float16_t(42.0);

+const float32_t float32_t_init = float32_t(13.0);

+const float64_t float64_t_init = float64_t(-4.0);

+

+#define TYPE_TO_TYPE(x, y) \

+    const x y##_to_##x = x(y##_init)

+

+#define TYPE_TO(x)              \

+    TYPE_TO_TYPE(x, bool);      \

+    TYPE_TO_TYPE(x, int8_t);    \

+    TYPE_TO_TYPE(x, int16_t);   \

+    TYPE_TO_TYPE(x, int32_t);   \

+    TYPE_TO_TYPE(x, int64_t);   \

+    TYPE_TO_TYPE(x, uint8_t);   \

+    TYPE_TO_TYPE(x, uint16_t);  \

+    TYPE_TO_TYPE(x, uint32_t);  \

+    TYPE_TO_TYPE(x, uint64_t);  \

+    TYPE_TO_TYPE(x, float16_t); \

+    TYPE_TO_TYPE(x, float32_t); \

+    TYPE_TO_TYPE(x, float64_t)

+

+TYPE_TO(bool);

+TYPE_TO(int8_t);

+TYPE_TO(int16_t);

+TYPE_TO(int32_t);

+TYPE_TO(int64_t);

+TYPE_TO(uint8_t);

+TYPE_TO(uint16_t);

+TYPE_TO(uint32_t);

+TYPE_TO(uint64_t);

+TYPE_TO(float16_t);

+TYPE_TO(float32_t);

+TYPE_TO(float64_t);

+

+void main() {}

diff --git a/Test/cppBad.vert b/Test/cppBad.vert
index 49600f9..0044c44 100644
--- a/Test/cppBad.vert
+++ b/Test/cppBad.vert
@@ -1,5 +1,5 @@
 #define m#0#

 #if m

-

+#endif

 #define n()

 int n"
\ No newline at end of file
diff --git a/Test/cppBad2.vert b/Test/cppBad2.vert
old mode 100755
new mode 100644
diff --git a/Test/cppDeepNest.frag b/Test/cppDeepNest.frag
new file mode 100644
index 0000000..51c436e
--- /dev/null
+++ b/Test/cppDeepNest.frag
@@ -0,0 +1,117 @@
+#ifdef O

+#if

+#if

+#if

+#if

+#if

+#if

+#if

+#if

+#if

+#if

+#if

+#if

+#if

+#if

+#if

+#if

+#if

+#if

+#if

+#if

+#if

+#if

+#if

+#if

+#if

+#if

+#if

+#if

+#if

+#if

+#if

+#if

+#if

+#if

+#if

+#if

+#if

+#if

+#if

+#if

+#if

+#if

+#if

+#if

+#if

+#if

+#if

+#if

+#if

+#if

+#if

+#if

+#if

+#if

+#if

+#if

+#if

+#if

+#if

+#if

+#if

+#if

+#if

+#if

+#if

+#if

+#if

+#if

+#if

+#if

+#if

+#if

+#if

+#if

+#if

+#if

+#if

+#if

+#if

+#if

+#if

+#if

+#if

+#if

+#if

+#if

+#if

+#if

+#if

+#if

+#if

+#if

+#if

+#if

+#if

+#if

+#if

+#if

+#if

+#if

+#if

+#if

+#if

+#if

+#if

+#if

+#if

+#if

+#if

+#if

+#if

+#if

+#if

+#if

+#if

+#endif

diff --git a/Test/cppIntMinOverNegativeOne.frag b/Test/cppIntMinOverNegativeOne.frag
new file mode 100644
index 0000000..b7e0a95
--- /dev/null
+++ b/Test/cppIntMinOverNegativeOne.frag
@@ -0,0 +1,6 @@
+#if (-2147483648 / -1) != 0
+#error INT_MIN / -1 should yield 0, something went wrong.
+#endif
+#if (-2147483648 % -1) != 0
+#error INT_MIN % -1 should yield 0, something went wrong.
+#endif
\ No newline at end of file
diff --git a/Test/cppPassMacroName.frag b/Test/cppPassMacroName.frag
new file mode 100644
index 0000000..046629f
--- /dev/null
+++ b/Test/cppPassMacroName.frag
@@ -0,0 +1,30 @@
+#define f1(i) ((i)*(i))
+#define I2(f, n) f(n) + f(n+1)
+#define I3(f, n) I2(f, n) + f(n+2)
+
+#define FL_f1(i) ((i)*(i))
+#define FL_I2(f, n) f(n) + f(n+0.2)
+#define FL_I3(f, n) FL_I2(f, n) + f(n+0.5)
+
+void main()
+{
+    int f1 = 4;
+    int f2 = f1;
+    int f3 = f1(3);
+    int f4 = I2(f1, 0);
+    int f5 = I3(f1, 0);
+
+    highp float fl_f5 = FL_I3(FL_f1, 0.1);
+}
+
+// f5 = I3(f1, 0)
+//    = I2(f1, 0) + f1(0 + 2)
+//    = f1(0) + f1(0+1) + f1(0+2)
+//    = 0*0 + 1*1 + 2*2
+//    = 5
+
+// fl_f5 = FL_I3(FL_f1, 0.1)
+//       = FL_I2(FL_f1, 0.1) + FL_f1(0.1 + 0.5)
+//       = FL_f1(0.1) + FL_f1(0.1 + 0.2) + FL_f1(0.1 + 0.5)
+//       = 0.1*0.1 + 0.3*0.3 + 0.6*0.6
+//       = 0.46
diff --git a/Test/cppRelaxSkipTokensErrors.vert b/Test/cppRelaxSkipTokensErrors.vert
new file mode 100644
index 0000000..b30af0c
--- /dev/null
+++ b/Test/cppRelaxSkipTokensErrors.vert
@@ -0,0 +1,14 @@
+#version 110

+

+#if 0

+3.5L

+3.5h

+2034h

+1.#INF

+0x1234567812345L

+12323394203923879234L

+0123s;

+123s;

+0123456712345671234L

+"string"

+#endif

diff --git a/Test/cppSimple.vert b/Test/cppSimple.vert
old mode 100644
new mode 100755
index 198203a..2f7de30
--- a/Test/cppSimple.vert
+++ b/Test/cppSimple.vert
@@ -170,7 +170,7 @@
 
 // ERROR
 #define m4(b)
-#define m4 (b)
+#define m4
 
 // ERROR
 #define m5 (b)
@@ -178,7 +178,7 @@
 
 // ERROR
 #define m6(a)
-#define m6
+#define m6(a,b)
 
 // ERROR (whitespace)
 #define m7 (a)
@@ -337,6 +337,16 @@
 #error \ 376
 #error \377
 
+// ERROR for macro expansion to yield 'defined'
+#line 9600
+#define DEF_MAC
+#define DEF_DEFINED defined
+#if DEF_DEFINED DEF_MAC
+#error DEF_DEFINED then
+#else
+#error DEF_DEFINED else
+#endif
+
 #line 10000
 #if 1
 #else
diff --git a/Test/findFunction.frag b/Test/findFunction.frag
new file mode 100644
index 0000000..41c0915
--- /dev/null
+++ b/Test/findFunction.frag
@@ -0,0 +1,46 @@
+#version 450
+
+#extension GL_EXT_shader_explicit_arithmetic_types: enable
+
+int64_t func(int8_t a, int16_t b, int16_t c)
+{
+    return int64_t(a | b + c);
+}
+
+int64_t func(int8_t a, int16_t b, int32_t c)
+{
+    return int64_t(a | b - c);
+}
+
+int64_t func(int32_t a, int32_t b, int32_t c)
+{
+    return int64_t(a / b + c);
+}
+
+int64_t func(float16_t a, float16_t b, float32_t c)
+{
+    return int64_t(a - b * c);
+}
+
+int64_t func(float16_t a, int16_t b, float32_t c)
+{
+    return int64_t(a - b * c);
+}
+
+void main()
+{
+    int8_t  x;
+    int16_t y;
+    int32_t z;
+    int64_t w;
+    float16_t f16;
+    float64_t f64;
+    int64_t b1 = func(x, y, z);
+    int64_t b2 = func(y, y, z); // tie
+    int64_t b3 = func(y, y, w); // No match
+    int64_t b4 = func(y, z, f16); // No match
+    int64_t b5 = func(y, y, f16);
+    int64_t b7 = func(f16, f16, y);
+    int64_t b8 = func(f16, f16, f64); // No match
+    int64_t b9 = func(f16, x, f16); // tie
+}
diff --git a/Test/foo.h b/Test/foo.h
new file mode 100644
index 0000000..7f79340
--- /dev/null
+++ b/Test/foo.h
@@ -0,0 +1 @@
+#error should not be included
\ No newline at end of file
diff --git a/Test/glsl.-D-U.frag b/Test/glsl.-D-U.frag
new file mode 100644
index 0000000..4d2325f
--- /dev/null
+++ b/Test/glsl.-D-U.frag
@@ -0,0 +1,32 @@
+#version 450
+
+#define IN_SHADER
+
+layout(location=0) out vec4 color;
+
+void main()
+{
+#if FOO==200
+    color = vec4(1.0);
+#else
+    #error expected FOO 200
+#endif
+
+#ifdef IN_SHADER
+    color++;
+#else
+    #error IN_SHADER was undef
+#endif
+
+#ifdef UNDEFED
+    #error UNDEFED defined
+#else
+    color *= 3.0;
+#endif
+
+#if MUL == 400
+    color *= MUL;
+#else
+    #error bad MUL
+#endif
+}
diff --git a/Test/glsl.entryPointRename.vert b/Test/glsl.entryPointRename.vert
new file mode 100644
index 0000000..7fc6b7a
--- /dev/null
+++ b/Test/glsl.entryPointRename.vert
@@ -0,0 +1,11 @@
+#version 460

+

+void bar()

+{

+    gl_Position = vec4(1);

+}

+

+void main()

+{

+    gl_Position = vec4(1);

+}

diff --git a/Test/glsl.entryPointRename2.vert b/Test/glsl.entryPointRename2.vert
new file mode 100644
index 0000000..0473e9b
--- /dev/null
+++ b/Test/glsl.entryPointRename2.vert
@@ -0,0 +1,6 @@
+#version 460

+

+void bar()

+{

+    gl_Position = vec4(1);

+}

diff --git a/Test/glspv.frag b/Test/glspv.frag
index cea8e13..7a73cb8 100644
--- a/Test/glspv.frag
+++ b/Test/glspv.frag
@@ -1,4 +1,4 @@
-#version 330

+#version 450

 

 #ifdef GL_SPIRV

 #error GL_SPIRV is set ( correct, not an error )

@@ -11,4 +11,18 @@
 {

 }

 

+uniform float f;                           // ERROR, no location

+layout(location = 2) uniform float g;

+uniform sampler2D s1;                      // ERROR, no binding

+layout(location = 3) uniform sampler2D s2; // ERROR, no binding

+

+void noise()

+{

+    noise1(vec4(1));

+    noise2(4.0);

+    noise3(vec2(3));

+    noise4(1);

+}

+

+uniform atomic_uint atomic;                // ERROR, no binding

 layout(input_attachment_index = 1) uniform subpassInput sub; // ERROR, no inputs

diff --git a/Test/glspv.vert b/Test/glspv.vert
index d2724ca..b448146 100644
--- a/Test/glspv.vert
+++ b/Test/glspv.vert
@@ -5,8 +5,8 @@
 layout(set = 0, binding = 0, std140) uniform Bt1 { int a; } bt1;

 layout(set = 1, binding = 0, std140) uniform Bt2 { int a; } bt2;  // ERROR, set has to be 0

 

-layout(shared) uniform Bt3 { int a; } bt3;                        // ERROR, no shared

-layout(packed) uniform Bt4 { int a; } bt4;                        // ERROR, no shared

+layout(shared) uniform Bt3 { int a; } bt3;                        // ERROR, no shared, no binding

+layout(packed) uniform Bt4 { int a; } bt4;                        // ERROR, no shared, no binding

 

 void main()

 {

diff --git a/Test/hlsl.-D-U.frag b/Test/hlsl.-D-U.frag
new file mode 100644
index 0000000..0a02222
--- /dev/null
+++ b/Test/hlsl.-D-U.frag
@@ -0,0 +1,31 @@
+
+#define IN_SHADER
+
+static float4 color;
+
+void main()
+{
+#if FOO==200
+    color = 1.0;
+#else
+    #error expected FOO 200
+#endif
+
+#ifdef FOO
+    color -= 5.0;
+#else
+    #error expected FOO 200
+#endif
+
+#ifdef IN_SHADER
+    color++;
+#else
+    #error IN_SHADER was undef
+#endif
+
+#ifdef UNDEFED
+    #error UNDEFED defined
+#else
+    color *= 3.0;
+#endif
+}
diff --git a/Test/hlsl.PointSize.geom b/Test/hlsl.PointSize.geom
new file mode 100644
index 0000000..ef66fc8
--- /dev/null
+++ b/Test/hlsl.PointSize.geom
@@ -0,0 +1,11 @@
+struct S {
+    [[vk::builtin("PointSize")]] float ps : PSIZE;
+};
+
+[maxvertexcount(4)]
+void main([[vk::builtin("PointSize")]] triangle in uint ps[3],
+       inout LineStream<S> OutputStream)
+{
+    S s;
+    OutputStream.Append(s);
+}
diff --git a/Test/hlsl.PointSize.vert b/Test/hlsl.PointSize.vert
new file mode 100644
index 0000000..4b357e0
--- /dev/null
+++ b/Test/hlsl.PointSize.vert
@@ -0,0 +1,4 @@
+[[vk::builtin("PointSize")]] float main() 

+{

+    return 2.3;

+}
\ No newline at end of file
diff --git a/Test/hlsl.aliasOpaque.frag b/Test/hlsl.aliasOpaque.frag
new file mode 100644
index 0000000..8b1ccef
--- /dev/null
+++ b/Test/hlsl.aliasOpaque.frag
@@ -0,0 +1,29 @@
+struct OS {

+    SamplerState ss;

+    float a;

+    Texture2D tex;

+};

+

+SamplerState gss;

+SamplerState gss2;

+Texture2D gtex;

+

+float4 osCall(OS s)

+{

+    return s.a * s.tex.Sample(s.ss, float2(0.2, 0.3));

+}

+

+float4 main() : SV_TARGET0

+{

+    OS os;

+    os.ss = gss2;

+    os.ss = gss;

+    os.tex = gtex;

+    os.a = 3.0;

+

+    // this should give an error

+    //SamplerState localss;

+    //localss = gss2;

+

+    return osCall(os);

+}

diff --git a/Test/hlsl.amend.frag b/Test/hlsl.amend.frag
old mode 100755
new mode 100644
diff --git a/Test/hlsl.array.frag b/Test/hlsl.array.frag
index 1abba89..ff0004f 100644
--- a/Test/hlsl.array.frag
+++ b/Test/hlsl.array.frag
@@ -4,8 +4,15 @@
     float4 m[7];
 } s[11];
 
-float4 PixelShaderFunction(int i, float4 input[3]) : COLOR0
+static float4 C = float4(1,2,3,4);
+float4 a1[1] = { float4(1,2,3,4) };
+float4 a2[2] = { float4(1,2,3,4), float4(5,2,3,4), };
+const float4 c1[1] = { float4(1,2,3,4) };
+static const float4 c2[2] = { C, float4(1,2,3,4), };
+
+float4 PixelShaderFunction(int i : sem1, float4 input[3] : sem2) : SV_TARGET0
 {
-    float4 b[10];
-    return a[1] + a[i] + input[2] + input[i] + b[5] + b[i] + s[i].m[i];
-}
\ No newline at end of file
+    float4 b[10] = { C, C, C, C, C, C, C, C, C, C };
+    float4 tmp = C + a1[0] + c1[0] + a2[i] + c2[i];
+    return a[1] + a[i] + input[2] + input[i] + b[5] + b[i] + s[i].m[i] + tmp;
+}
diff --git a/Test/hlsl.attributeC11.frag b/Test/hlsl.attributeC11.frag
new file mode 100644
index 0000000..336511f
--- /dev/null
+++ b/Test/hlsl.attributeC11.frag
@@ -0,0 +1,22 @@
+struct S {

+    float2 f;

+};

+

+[[vk::binding(1)]]

+StructuredBuffer<S> buffer1;

+

+[[vk::binding(3, 2)]]

+StructuredBuffer<S> buffer3;

+

+[[vk::input_attachment_index(4)]]

+Texture2D<float4> attach;

+

+[[vk::constant_id(13)]] const int ci = 11;

+

+[[vk::push_constant]] cbuffer pcBuf { int a; };

+

+[[vk::location(7)]] float4

+main([[vk::location(8)]] float4 input: A) : B

+{

+    return input + attach.Load(float2(0.5));// * a;

+}

diff --git a/Test/hlsl.attributeGlobalBuffer.frag b/Test/hlsl.attributeGlobalBuffer.frag
new file mode 100644
index 0000000..a1177da
--- /dev/null
+++ b/Test/hlsl.attributeGlobalBuffer.frag
@@ -0,0 +1,8 @@
+[[vk::global_cbuffer_binding(5, 2)]]

+float4 u1;

+float4 u2;

+

+float4 main() : SV_Target0

+{

+    return u1 + u2;

+}
\ No newline at end of file
diff --git a/Test/hlsl.boolConv.vert b/Test/hlsl.boolConv.vert
old mode 100755
new mode 100644
index 7efe20b..6182b29
--- a/Test/hlsl.boolConv.vert
+++ b/Test/hlsl.boolConv.vert
@@ -1,20 +1,20 @@
-static bool a, b = true;

-float4 main() : SV_Position

-{

-    int r = 0;

-

-    r += a + b;

-    r += a - b;

-    r += a * b;

-    r += a / b;

-    r += a % b;

-

-    r += a & b;

-    r += a | b;

-    r += a ^ b;

-

-    r += a << b;

-    r += a >> b;

-

-    return r;

-}
\ No newline at end of file
+static bool a, b = true;
+float4 main() : SV_Position
+{
+    int r = 0;
+
+    r += a + b;
+    r += a - b;
+    r += a * b;
+    r += a / b;
+    r += a % b;
+
+    r += a & b;
+    r += a | b;
+    r += a ^ b;
+
+    r += a << b;
+    r += a >> b;
+
+    return r;
+}
diff --git a/Test/hlsl.buffer.frag b/Test/hlsl.buffer.frag
index 1604ea4..73f42e8 100644
--- a/Test/hlsl.buffer.frag
+++ b/Test/hlsl.buffer.frag
@@ -1,17 +1,17 @@
-cbuffer {
+cbuffer buf1 {
     float4 v1;
-};
+}; // extraneous ;
 
-tbuffer {
+tbuffer buf2 {
     float4 v2;
-};
+}; // extraneous ;
 
-cbuffer cbufName : register(b2, space10) {
-    float4 v3;
-    int i3 : packoffset(c1.y);
-} // no semicolon is okay
+cbuffer cbufName {
+    float4 v3 : packoffset(c0);
+    int i3    : packoffset(c1.y);
+}
 
-tbuffer tbufName : register(b8) {
+tbuffer tbufName : register(t8) {
     float4 v4 : packoffset(c1);
     int i4    : packoffset(c3);
     float f1  : packoffset(c3.w);
@@ -19,14 +19,29 @@
     float f4  : packoffset(c4.y);
     float f5  : packoffset(c4.z);
     float f6  : packoffset(c);
-    float f7;
-                 float3x4 m1;
-       row_major float3x4 m2;
-    column_major float3x4 m3;
-                 float3x4 m4;
-}  // no semicolon is okay
+    float f7  : packoffset(c8);
+                 float3x4 m1 : packoffset(c7);
+       row_major float3x4 m2 : packoffset(c11);
+    column_major float3x4 m3 : packoffset(c15);
+                 float3x4 m4 : packoffset(c19);
+}
 
-float4 PixelShaderFunction(float4 input) : COLOR0
+float foo() // float looks like identifier, but can't be part of tbuffer
 {
-    return input + v1 + v2 + v3 + v4;
+    return 1.0;
+}
+
+struct id {
+    float4 a;
+};
+
+cbuffer cbufName2 {
+    float4 v24;
+}
+
+id PixelShaderFunction(float4 input : SV_POSITION) : SV_TARGET0  // id looks like id for cbuffer name, but can't be
+{
+    id ret;
+    ret.a = v24 + (input + v1 + v2 + v3 + v4) * foo();
+    return ret;
 }
diff --git a/Test/hlsl.cbuffer-identifier.vert b/Test/hlsl.cbuffer-identifier.vert
new file mode 100644
index 0000000..8362f5c
--- /dev/null
+++ b/Test/hlsl.cbuffer-identifier.vert
@@ -0,0 +1,32 @@
+
+cbuffer ConstantBuffer : register( b0 )
+{
+    matrix World;
+    matrix View;
+    matrix Projection;
+};
+
+struct VS_INPUT
+{
+    float4 Pos : POSITION;
+    float3 Norm : NORMAL;
+};
+
+struct PS_INPUT
+{
+    float4 Pos : SV_POSITION;
+    float3 Norm : TEXCOORD0;
+};
+
+PS_INPUT main( VS_INPUT input )
+{
+    int ConstantBuffer = 42;  // test ConstantBuffer as an identifier
+
+    PS_INPUT output = (PS_INPUT)0;
+    output.Pos = mul( input.Pos, World );
+    output.Pos = mul( output.Pos, View );
+    output.Pos = mul( output.Pos, Projection );
+    output.Norm = mul( input.Norm, World );  // Work when output.Norm = mul( input.Norm, (float3x3)World );
+
+    return output;
+}
diff --git a/Test/hlsl.charLit.vert b/Test/hlsl.charLit.vert
old mode 100755
new mode 100644
diff --git a/Test/hlsl.clipdistance-1.frag b/Test/hlsl.clipdistance-1.frag
new file mode 100644
index 0000000..10813b3
--- /dev/null
+++ b/Test/hlsl.clipdistance-1.frag
@@ -0,0 +1,6 @@
+float4 main(in float4 pos : SV_Position, 
+            in float clip : SV_ClipDistance,
+            in float cull : SV_CullDistance) : SV_Target0
+{
+    return pos + clip + cull;
+}
diff --git a/Test/hlsl.clipdistance-1.geom b/Test/hlsl.clipdistance-1.geom
new file mode 100644
index 0000000..76c34b3
--- /dev/null
+++ b/Test/hlsl.clipdistance-1.geom
@@ -0,0 +1,19 @@
+struct S {
+    float4 pos     : SV_Position;
+    float2 clip    : SV_ClipDistance0;
+};
+
+[maxvertexcount(3)]
+void main(triangle in float4 pos[3] : SV_Position, 
+          triangle in uint VertexID[3] : VertexID,
+          inout LineStream<S> OutputStream,
+          triangle in float4 clip[3] : SV_ClipDistance)   // externally: an array 3 of array 4 (not vec4!) of float.
+{
+    S s;
+
+    s.pos = pos[0];
+    s.clip = clip[0].xy;
+
+    OutputStream.Append(s);
+}
+
diff --git a/Test/hlsl.clipdistance-1.vert b/Test/hlsl.clipdistance-1.vert
new file mode 100644
index 0000000..bcebafc
--- /dev/null
+++ b/Test/hlsl.clipdistance-1.vert
@@ -0,0 +1,8 @@
+void main(out float4 pos : SV_Position, 
+          out float clip : SV_ClipDistance,  // scalar float
+          out float cull : SV_CullDistance)  // scalar float
+{
+    pos = 1.0f.xxxx;
+    clip = 0.5f;
+    cull = 0.51f;
+}
diff --git a/Test/hlsl.clipdistance-2.frag b/Test/hlsl.clipdistance-2.frag
new file mode 100644
index 0000000..b6f88d5
--- /dev/null
+++ b/Test/hlsl.clipdistance-2.frag
@@ -0,0 +1,7 @@
+float4 main(in float4 pos : SV_Position,
+            in float2 clip[2] : SV_ClipDistance,               // array of vector float
+            in float2 cull[2] : SV_CullDistance)  : SV_Target0 // array of vector float
+{
+
+    return pos + clip[0][0] + cull[0][0];
+}
diff --git a/Test/hlsl.clipdistance-2.geom b/Test/hlsl.clipdistance-2.geom
new file mode 100644
index 0000000..90f047f
--- /dev/null
+++ b/Test/hlsl.clipdistance-2.geom
@@ -0,0 +1,19 @@
+struct S {
+    float4 pos     : SV_Position;
+    float2 clip[2] : SV_ClipDistance0;
+};
+
+[maxvertexcount(3)]
+void main(triangle in float4 pos[3] : SV_Position, 
+          triangle in uint VertexID[3] : VertexID,
+          inout LineStream<S> OutputStream,
+          triangle in float2 clip[3][2] : SV_ClipDistance) // externally: an array 3 of array 4 of float.
+{
+    S s;
+
+    s.pos = pos[0];
+    s.clip[0] = clip[0][0];
+    s.clip[1] = clip[0][1];
+
+    OutputStream.Append(s);
+}
diff --git a/Test/hlsl.clipdistance-2.vert b/Test/hlsl.clipdistance-2.vert
new file mode 100644
index 0000000..bf8c0ee
--- /dev/null
+++ b/Test/hlsl.clipdistance-2.vert
@@ -0,0 +1,15 @@
+void main(out float4 pos : SV_Position,
+          out float2 clip[2] : SV_ClipDistance,  // array of vector float
+          out float2 cull[2] : SV_CullDistance)  // array of vector float
+{
+    pos = 1.0f.xxxx;
+    clip[0].x = 0.5f;
+    clip[0].y = 0.6f;
+    clip[1].x = 0.7f;
+    clip[1].y = 0.8f;
+
+    cull[0].x = 0.525f;
+    cull[0].y = 0.625f;
+    cull[1].x = 0.725f;
+    cull[1].y = 0.825f;
+}
diff --git a/Test/hlsl.clipdistance-3.frag b/Test/hlsl.clipdistance-3.frag
new file mode 100644
index 0000000..e2b6b86
--- /dev/null
+++ b/Test/hlsl.clipdistance-3.frag
@@ -0,0 +1,6 @@
+float4 main(in float4 pos : SV_Position,
+            in float clip[2] : SV_ClipDistance,              // array of scalar float
+            in float cull[2] : SV_CullDistance) : SV_Target0 // array of scalar float
+{
+    return pos + clip[0] + cull[0];
+}
diff --git a/Test/hlsl.clipdistance-3.geom b/Test/hlsl.clipdistance-3.geom
new file mode 100644
index 0000000..2aa4cd4
--- /dev/null
+++ b/Test/hlsl.clipdistance-3.geom
@@ -0,0 +1,20 @@
+struct S {
+    float4 pos     : SV_Position;
+    float2 clip0   : SV_ClipDistance0;  // clip0 and clip1 form an array of float[4] externally.
+    float2 clip1   : SV_ClipDistance1;
+};
+
+[maxvertexcount(3)]
+void main(triangle in float4 pos[3] : SV_Position, 
+          triangle in uint VertexID[3] : VertexID,
+          inout LineStream<S> OutputStream,
+          triangle in float4 clip[3] : SV_ClipDistance)   // externally: an array 3 of array 4 (not vec4!) of float.
+{
+    S s;
+
+    s.pos = pos[0];
+    s.clip0 = clip[0].xy;
+    s.clip1 = clip[0].zw;
+
+    OutputStream.Append(s);
+}
diff --git a/Test/hlsl.clipdistance-3.vert b/Test/hlsl.clipdistance-3.vert
new file mode 100644
index 0000000..a759a9c
--- /dev/null
+++ b/Test/hlsl.clipdistance-3.vert
@@ -0,0 +1,13 @@
+void main(out float4 pos : SV_Position,
+          out float clip[2] : SV_ClipDistance, // array of scalar float
+          out float cull[2] : SV_CullDistance) // array of scalar float
+{
+    pos = 1.0f.xxxx;
+    clip[0] = 0.5f;
+    clip[1] = 0.6f;
+
+    cull[0] = 0.525f;
+    cull[1] = 0.625f;
+}
+
+
diff --git a/Test/hlsl.clipdistance-4.frag b/Test/hlsl.clipdistance-4.frag
new file mode 100644
index 0000000..6144160
--- /dev/null
+++ b/Test/hlsl.clipdistance-4.frag
@@ -0,0 +1,9 @@
+struct VS_OUTPUT        {
+    float4 Position             : SV_Position;
+    float4 ClipRect             : SV_ClipDistance0;  // vector in split struct
+};
+
+float4 main(const VS_OUTPUT v) : SV_Target0
+{
+    return v.Position + v.ClipRect;
+}
diff --git a/Test/hlsl.clipdistance-4.geom b/Test/hlsl.clipdistance-4.geom
new file mode 100644
index 0000000..ff296a8
--- /dev/null
+++ b/Test/hlsl.clipdistance-4.geom
@@ -0,0 +1,21 @@
+struct S {
+    float4 pos     : SV_Position;
+    float2 clip0   : SV_ClipDistance0;  // clip0 and clip1 form an array of float[4] externally.
+    float2 clip1   : SV_ClipDistance1;
+};
+
+[maxvertexcount(3)]
+void main(triangle in float4 pos[3] : SV_Position, 
+          triangle in uint VertexID[3] : VertexID,
+          inout LineStream<S> OutputStream,
+          triangle in float2 clip0[3] : SV_ClipDistance0,  // test input arrayed semantic vars
+          triangle in float2 clip1[3] : SV_ClipDistance1)
+{
+    S s;
+
+    s.pos = pos[0];
+    s.clip0 = clip0[0];
+    s.clip1 = clip1[0];
+
+    OutputStream.Append(s);
+}
diff --git a/Test/hlsl.clipdistance-4.vert b/Test/hlsl.clipdistance-4.vert
new file mode 100644
index 0000000..5e0d082
--- /dev/null
+++ b/Test/hlsl.clipdistance-4.vert
@@ -0,0 +1,21 @@
+struct VS_INPUT         {
+    float4 Position             : POSITION;
+};
+
+struct VS_OUTPUT        {
+    float4 Position             : SV_Position;
+    float4 ClipRect             : SV_ClipDistance0;  // vector in split struct
+};
+
+VS_OUTPUT main(const VS_INPUT v)
+{
+    VS_OUTPUT           Output;
+    Output.Position     = 0;
+
+    Output.ClipRect.x = 1;
+    Output.ClipRect.y = 2;
+    Output.ClipRect.z = 3;
+    Output.ClipRect.w = 4;
+
+    return Output;
+}
diff --git a/Test/hlsl.clipdistance-5.frag b/Test/hlsl.clipdistance-5.frag
new file mode 100644
index 0000000..4722999
--- /dev/null
+++ b/Test/hlsl.clipdistance-5.frag
@@ -0,0 +1,9 @@
+struct VS_OUTPUT        {
+    float4 Position             : SV_Position;
+    float2 ClipRect[2]          : SV_ClipDistance0;  // array of float2 in split struct
+};
+
+float4 main(const VS_OUTPUT v) : SV_Target0
+{
+    return v.Position + v.ClipRect[0].x + v.ClipRect[1].x;
+}
diff --git a/Test/hlsl.clipdistance-5.vert b/Test/hlsl.clipdistance-5.vert
new file mode 100644
index 0000000..02fb862
--- /dev/null
+++ b/Test/hlsl.clipdistance-5.vert
@@ -0,0 +1,21 @@
+struct VS_INPUT         {
+    float4 Position             : POSITION;
+};
+
+struct VS_OUTPUT        {
+    float4 Position             : SV_Position;
+    float2 ClipRect[2]          : SV_ClipDistance0;  // array of float2 in split struct
+};
+
+VS_OUTPUT main(const VS_INPUT v)
+{
+    VS_OUTPUT           Output;
+    Output.Position     = 0;
+
+    Output.ClipRect[0].x = 1;
+    Output.ClipRect[0].y = 2;
+    Output.ClipRect[1].x = 3;
+    Output.ClipRect[1].y = 4;
+
+    return Output;
+}
diff --git a/Test/hlsl.clipdistance-6.frag b/Test/hlsl.clipdistance-6.frag
new file mode 100644
index 0000000..646197b
--- /dev/null
+++ b/Test/hlsl.clipdistance-6.frag
@@ -0,0 +1,10 @@
+struct VS_OUTPUT        {
+    float4 Position             : SV_Position;
+    float4 clip0                : SV_ClipDistance0;  // multiple semantic IDs, two vec4s (no extra packing)
+    float4 clip1                : SV_ClipDistance1;  // ...
+};
+
+float4 main(VS_OUTPUT v) : SV_Target0
+{
+    return v.Position + v.clip0 + v.clip1;
+}
diff --git a/Test/hlsl.clipdistance-6.vert b/Test/hlsl.clipdistance-6.vert
new file mode 100644
index 0000000..d68c225
--- /dev/null
+++ b/Test/hlsl.clipdistance-6.vert
@@ -0,0 +1,23 @@
+struct VS_OUTPUT        {
+    float4 Position             : SV_Position;
+    float4 clip0                : SV_ClipDistance0;  // multiple semantic IDs, two vec4s (no extra packing)
+    float4 clip1                : SV_ClipDistance1;  // ...
+};
+
+VS_OUTPUT main()
+{
+    VS_OUTPUT           Output;
+    Output.Position     = 0;
+
+    Output.clip0.x = 0;
+    Output.clip0.y = 1;
+    Output.clip0.z = 2;
+    Output.clip0.w = 3;
+
+    Output.clip1.x = 4;
+    Output.clip1.y = 5;
+    Output.clip1.z = 6;
+    Output.clip1.w = 7;
+
+    return Output;
+}
diff --git a/Test/hlsl.clipdistance-7.frag b/Test/hlsl.clipdistance-7.frag
new file mode 100644
index 0000000..1a26df8
--- /dev/null
+++ b/Test/hlsl.clipdistance-7.frag
@@ -0,0 +1,10 @@
+struct VS_OUTPUT        {
+    float4 Position             : SV_Position;
+    float3 clip0                : SV_ClipDistance0;  // multiple semantic IDs, vec3+vec4 (skip)
+    float4 clip1                : SV_ClipDistance1;  // ...
+};
+
+float4 main(VS_OUTPUT v) : SV_Target0
+{
+    return v.Position + v.clip0.x + v.clip1.x;
+}
diff --git a/Test/hlsl.clipdistance-7.vert b/Test/hlsl.clipdistance-7.vert
new file mode 100644
index 0000000..c615d1f
--- /dev/null
+++ b/Test/hlsl.clipdistance-7.vert
@@ -0,0 +1,23 @@
+struct VS_OUTPUT        {
+    float4 Position             : SV_Position;
+    float3 clip0                : SV_ClipDistance0;  // multiple semantic IDs, vec3+vec4 (skip)
+    float4 clip1                : SV_ClipDistance1;  // ...
+};
+
+VS_OUTPUT main()
+{
+    VS_OUTPUT           Output;
+    Output.Position     = 0;
+
+    Output.clip0.x = 0;
+    Output.clip0.y = 1;
+    Output.clip0.z = 2;
+    // Position 3 is skipped
+
+    Output.clip1.x = 4;
+    Output.clip1.y = 5;
+    Output.clip1.z = 6;
+    Output.clip1.w = 7;
+
+    return Output;
+}
diff --git a/Test/hlsl.clipdistance-8.frag b/Test/hlsl.clipdistance-8.frag
new file mode 100644
index 0000000..2edf194
--- /dev/null
+++ b/Test/hlsl.clipdistance-8.frag
@@ -0,0 +1,10 @@
+struct VS_OUTPUT        {
+    float4 Position             : SV_Position;
+    float3 clip0                : SV_ClipDistance0;  // multiple semantic IDs, vec3+float (pack)
+    float  clip1                : SV_ClipDistance1;  // ...
+};
+
+float4 main(VS_OUTPUT v) : SV_Target0
+{
+    return v.Position + v.clip0.x + v.clip1;
+}
diff --git a/Test/hlsl.clipdistance-8.vert b/Test/hlsl.clipdistance-8.vert
new file mode 100644
index 0000000..c6377d2
--- /dev/null
+++ b/Test/hlsl.clipdistance-8.vert
@@ -0,0 +1,20 @@
+struct VS_OUTPUT        {
+    float4 Position             : SV_Position;
+    float3 clip0                : SV_ClipDistance0;  // multiple semantic IDs, vec3+float (pack)
+    float  clip1                : SV_ClipDistance1;  // ...
+};
+
+VS_OUTPUT main()
+{
+    VS_OUTPUT           Output;
+    Output.Position     = 0;
+
+    Output.clip0.x = 0;
+    Output.clip0.y = 1;
+    Output.clip0.z = 2;
+
+    // Position 3 is packed from clip1's float
+    Output.clip1   = 3;
+
+    return Output;
+}
diff --git a/Test/hlsl.clipdistance-9.frag b/Test/hlsl.clipdistance-9.frag
new file mode 100644
index 0000000..cbe940a
--- /dev/null
+++ b/Test/hlsl.clipdistance-9.frag
@@ -0,0 +1,8 @@
+
+// Test packing 0 and 1 semantics into single array[4], from in fn params.
+float4 main(in float4 Position : SV_Position,
+            in float3 clip0 : SV_ClipDistance0,
+            in float clip1 : SV_ClipDistance1) : SV_Target0
+{
+    return Position + clip0.x + clip1;
+}
diff --git a/Test/hlsl.clipdistance-9.vert b/Test/hlsl.clipdistance-9.vert
new file mode 100644
index 0000000..d488307
--- /dev/null
+++ b/Test/hlsl.clipdistance-9.vert
@@ -0,0 +1,19 @@
+struct VS_OUTPUT        {
+    float4 Position             : SV_Position;
+};
+
+// Test packing 0 and 1 semantics into single array[4] output, from out fn params.
+VS_OUTPUT main(out float3 clip0 : SV_ClipDistance0, out float clip1 : SV_ClipDistance1)
+{
+    VS_OUTPUT           Output;
+    Output.Position     = 0;
+
+    clip0.x = 0;
+    clip0.y = 1;
+    clip0.z = 2;
+
+    // Position 3 is packed from clip1's float
+    clip1   = 3;
+
+    return Output;
+}
diff --git a/Test/hlsl.color.hull.tesc b/Test/hlsl.color.hull.tesc
new file mode 100644
index 0000000..73d9ad0
--- /dev/null
+++ b/Test/hlsl.color.hull.tesc
@@ -0,0 +1,74 @@
+/////////////
+// GLOBALS //
+/////////////
+cbuffer TessellationBuffer : register(b0)
+{
+    float tessellationAmount;
+    float3 padding;
+};
+
+
+//////////////
+// TYPEDEFS //
+//////////////
+struct HullInputType
+{
+    float3 position : POSITION;
+    float4 color : COLOR;
+};
+
+struct ConstantOutputType
+{
+    float edges[3] : SV_TessFactor;
+    float inside : SV_InsideTessFactor;
+};
+
+struct HullOutputType
+{
+    float3 position : POSITION;
+    float4 color : COLOR;
+};
+
+
+////////////////////////////////////////////////////////////////////////////////
+// Patch Constant Function
+////////////////////////////////////////////////////////////////////////////////
+ConstantOutputType ColorPatchConstantFunction(InputPatch<HullInputType, 3> inputPatch, uint patchId : SV_PrimitiveID)
+{
+    ConstantOutputType output;
+
+
+	// Set the tessellation factors for the three edges of the triangle.
+    output.edges[0] = tessellationAmount;
+    output.edges[1] = tessellationAmount;
+    output.edges[2] = tessellationAmount;
+
+	// Set the tessellation factor for tessallating inside the triangle.
+    output.inside = tessellationAmount;
+
+    return output;
+}
+
+
+////////////////////////////////////////////////////////////////////////////////
+// Hull Shader
+////////////////////////////////////////////////////////////////////////////////
+[domain("tri")]
+[partitioning("integer")]
+[outputtopology("triangle_cw")]
+[outputcontrolpoints(3)]
+[patchconstantfunc("ColorPatchConstantFunction")]
+
+HullOutputType main(InputPatch<HullInputType, 3> patch, uint pointId : SV_OutputControlPointID, uint patchId : SV_PrimitiveID)
+{
+    HullOutputType output;
+
+    // Set the position for this control point as the output position.
+    output.position = patch[pointId].position;
+
+	// Set the input color as the output color.
+    output.color = patch[pointId].color;
+
+    return output;
+}
+
diff --git a/Test/hlsl.constantbuffer.frag b/Test/hlsl.constantbuffer.frag
index d7a6ef5..c2b3a00 100644
--- a/Test/hlsl.constantbuffer.frag
+++ b/Test/hlsl.constantbuffer.frag
@@ -21,6 +21,6 @@
     if (cb3[1][2].x)
         return cb1.x + cb2[1].y + c1;
     else
-        return cb3[2][3].y;
+        return cb3[1][3].y;
 }
 
diff --git a/Test/hlsl.constructArray.vert b/Test/hlsl.constructArray.vert
new file mode 100644
index 0000000..52c4b6f
--- /dev/null
+++ b/Test/hlsl.constructArray.vert
@@ -0,0 +1,10 @@
+float4 main() :  SV_POSITION 
+{
+    int4 int4_array[3];
+    float4 float4_array_times[2] = (float4[2])int4_array;
+    float2 float2_array_times2[4] = (float2[4])int4_array;
+    int4 int4_array2[2] = (int4[2])int4_array;
+    int int1_array[2] = (int[2])int4_array;
+
+    return (float4)0.0;
+}
diff --git a/Test/hlsl.constructimat.frag b/Test/hlsl.constructimat.frag
new file mode 100644
index 0000000..f320ba1
--- /dev/null
+++ b/Test/hlsl.constructimat.frag
@@ -0,0 +1,52 @@
+int main() : SV_TARGET
+{
+    // integer mat constructors
+    const int4x4 var441 = { 0,1,0,0, 1,1,0,0, 1,0,0,0, 0,0,0,0 };
+    const int4x4 var442 = int4x4( 0,1,0,0, 1,1,0,0, 1,0,0,0, 0,0,0,0 );
+    int4x4 var443 = { 0,1,0,0, 1,1,0,0, 1,0,0,0, 0,0,0,0 };
+    int4x4 var444 = int4x4( 0,1,0,0, 1,1,0,0, 1,0,0,0, 0,0,0,0 );
+
+    const int4x2 var421 = { 0,1, 1,1, 1,0, 0,0 };
+    const int4x2 var422 = int4x2( 0,1, 1,1, 1,0, 0,0 );
+    int4x2 var423 = { 0,1, 1,1, 1,0, 0,0 };
+    int4x2 var424 = int4x2( 0,1, 1,1, 1,0, 0,0 );
+
+    const int3x2 var321 = { 0,1, 1,1, 1,0 };
+    const int3x2 var322 = int3x2( 0,1, 1,1, 1,0 );
+    int3x2 var323 = { 0,1, 1,1, 1,0 };
+    int3x2 var234 = int3x2( 0,1, 1,1, 1,0);
+
+    // unsigned integer mat constructors
+    const uint4x4 uvar441 = { 0,1,0,0, 1,1,0,0, 1,0,0,0, 0,0,0,0 };
+    const uint4x4 uvar442 = uint4x4( 0,1,0,0, 1,1,0,0, 1,0,0,0, 0,0,0,0 );
+    uint4x4 uvar443 = { 0,1,0,0, 1,1,0,0, 1,0,0,0, 0,0,0,0 };
+    uint4x4 uvar444 = uint4x4( 0,1,0,0, 1,1,0,0, 1,0,0,0, 0,0,0,0 );
+
+    const uint4x2 uvar421 = { 0,1, 1,1, 1,0, 0,0 };
+    const uint4x2 uvar422 = uint4x2( 0,1, 1,1, 1,0, 0,0 );
+    uint4x2 uvar423 = { 0,1, 1,1, 1,0, 0,0 };
+    uint4x2 uvar424 = uint4x2( 0,1, 1,1, 1,0, 0,0 );
+
+    const uint3x2 uvar321 = { 0,1, 1,1, 1,0 };
+    const uint3x2 uvar322 = uint3x2( 0,1, 1,1, 1,0 );
+    uint3x2 uvar323 = { 0,1, 1,1, 1,0 };
+    uint3x2 uvar234 = uint3x2( 0,1, 1,1, 1,0);
+
+    // boolean mat constructors
+    const bool4x4 bvar441 = { 0,1,0,0, 1,1,0,0, 1,0,0,0, 0,0,0,0 };
+    const bool4x4 bvar442 = bool4x4( 0,1,0,0, 1,1,0,0, 1,0,0,0, 0,0,0,0 );
+    bool4x4 bvar443 = { 0,1,0,0, 1,1,0,0, 1,0,0,0, 0,0,0,0 };
+    bool4x4 bvar444 = bool4x4( 0,1,0,0, 1,1,0,0, 1,0,0,0, 0,0,0,0 );
+
+    const bool4x2 bvar421 = { 0,1, 1,1, 1,0, 0,0 };
+    const bool4x2 bvar422 = bool4x2( 0,1, 1,1, 1,0, 0,0 );
+    bool4x2 bvar423 = { 0,1, 1,1, 1,0, 0,0 };
+    bool4x2 bvar424 = bool4x2( 0,1, 1,1, 1,0, 0,0 );
+
+    const bool3x2 bvar321 = { 0,1, 1,1, 1,0 };
+    const bool3x2 bvar322 = bool3x2( 0,1, 1,1, 1,0 );
+    bool3x2 bvar323 = { 0,1, 1,1, 1,0 };
+    bool3x2 bvar234 = bool3x2( 0,1, 1,1, 1,0);
+
+    return 0;
+}
diff --git a/Test/hlsl.coverage.frag b/Test/hlsl.coverage.frag
new file mode 100644
index 0000000..c6cd019
--- /dev/null
+++ b/Test/hlsl.coverage.frag
@@ -0,0 +1,20 @@
+
+// Verify that coverage mask is an array, as required by SPIR-V.
+
+struct PS_INPUT
+{
+};
+
+struct PS_OUTPUT
+{
+    float4 vColor : SV_Target0;
+    uint nCoverageMask : SV_Coverage;
+};
+
+PS_OUTPUT main( PS_INPUT i )
+{
+    PS_OUTPUT o;
+    o.vColor = float4(1.0, 0.0, 0.0, 1.0);
+    o.nCoverageMask = 0;
+    return o;
+}
diff --git a/Test/hlsl.dashI.vert b/Test/hlsl.dashI.vert
new file mode 100644
index 0000000..a432be5
--- /dev/null
+++ b/Test/hlsl.dashI.vert
@@ -0,0 +1,13 @@
+// For -Iinc1/path1 -Iinc1/path2
+// bar.h from local directory will define i1, while the ones from inc1/path1 and inc1/path2 will not.
+// notHere.h is only in inc1/path1 and inc2/path2, and only inc1/path1 defines p1, p2, and p3
+// parent.h is local again, and defines i4
+
+#include "bar.h"
+#include "notHere.h"
+#include "parent.h"
+
+float4 main() : SV_Position
+{
+    return i1 + i4 + p1 + p2 + p3;
+}
diff --git a/Test/hlsl.domain.1.tese b/Test/hlsl.domain.1.tese
index 5039410..7366e9b 100644
--- a/Test/hlsl.domain.1.tese
+++ b/Test/hlsl.domain.1.tese
@@ -18,11 +18,11 @@
 }; 
 
 [domain ( "tri" )] 
-gs_in_t main (const OutputPatch <ds_in_t, 3> i, float3 tesscoord : SV_DomainLocation, pcf_in_t pcf_data ) 
+gs_in_t main (const OutputPatch <ds_in_t, 3> i, float f : msem, float3 tesscoord : SV_DomainLocation, pcf_in_t pcf_data ) 
 { 
     gs_in_t o; 
 
-    o.pos  = i[0].pos + tesscoord.x;
+    o.pos  = i[0].pos + tesscoord.x * f;
     o.norm = i[0].norm + tesscoord.y;
 
     tesscoord.z;
diff --git a/Test/hlsl.explicitDescriptorSet.frag b/Test/hlsl.explicitDescriptorSet.frag
new file mode 100644
index 0000000..1cff8d3
--- /dev/null
+++ b/Test/hlsl.explicitDescriptorSet.frag
@@ -0,0 +1,15 @@
+SamplerState       g_sSamp : register(s1);
+
+Texture1D <float4> g_tTex1df4 : register(t0);
+
+SamplerState       g_sSamp2_amb;
+uniform float      floatval_amb;
+
+Buffer<float>      floatbuff;
+
+float4 main() : SV_Target0
+{
+    g_sSamp2_amb;
+
+    return 0;
+}
diff --git a/Test/hlsl.flattenOpaque.frag b/Test/hlsl.flattenOpaque.frag
new file mode 100644
index 0000000..279be8a
--- /dev/null
+++ b/Test/hlsl.flattenOpaque.frag
@@ -0,0 +1,40 @@
+struct os {

+    sampler2D s2D;

+};

+

+struct os2 {

+    sampler2D s2D;

+    Texture2D tex;

+};

+

+Texture2D tex;

+os s;

+os2 s2;

+

+float4 osCall1(os s)

+{

+    return tex.Sample(s.s2D, float2(0.2, 0.3));

+}

+

+float4 osCall2(os s, float2 f2)

+{

+    return tex.Sample(s.s2D, f2);

+}

+

+float4 os2Call1(os2 s)

+{

+    return s.tex.Sample(s.s2D, float2(0.2, 0.3));

+}

+

+float4 os2Call2(os2 s, float2 f2)

+{

+    return s.tex.Sample(s.s2D, f2);

+}

+

+float4 main() : SV_TARGET0

+{

+    return osCall1(s) +

+           osCall2(s, float2(0.2, 0.3)) +

+           os2Call1(s2) +

+           os2Call2(s2, float2(0.2, 0.3));

+}

diff --git a/Test/hlsl.flattenOpaqueInit.vert b/Test/hlsl.flattenOpaqueInit.vert
new file mode 100644
index 0000000..9ed8bc7
--- /dev/null
+++ b/Test/hlsl.flattenOpaqueInit.vert
@@ -0,0 +1,27 @@
+struct FxaaTex { SamplerState smpl; Texture2D tex; };

+SamplerState g_tInputTexture_sampler; Texture2D g_tInputTexture;

+

+float4 lookUp(FxaaTex tex)

+{

+    return tex.tex.Sample(tex.smpl, float2(0.3, 0.4));

+}

+

+FxaaTex fillOpaque()

+{

+    FxaaTex t;

+    t.smpl = g_tInputTexture_sampler;

+    t.tex = g_tInputTexture;

+    return t;

+}

+

+float4 main() : SV_TARGET0

+{

+    FxaaTex tex1 = { g_tInputTexture_sampler, g_tInputTexture };

+    float4 res = lookUp(tex1);

+    FxaaTex tex2 = fillOpaque();

+    res += lookUp(tex2);

+    FxaaTex tex3 = tex1;
+    res += lookUp(tex3);
+

+    return res;

+}
diff --git a/Test/hlsl.flattenOpaqueInitMix.vert b/Test/hlsl.flattenOpaqueInitMix.vert
new file mode 100644
index 0000000..2e712ee
--- /dev/null
+++ b/Test/hlsl.flattenOpaqueInitMix.vert
@@ -0,0 +1,13 @@
+struct FxaaTex { SamplerState smpl; Texture2D tex; float f; };

+SamplerState g_tInputTexture_sampler; Texture2D g_tInputTexture;

+

+float4 lookUp(FxaaTex tex)

+{

+    return tex.tex.Sample(tex.smpl, float2(tex.f, tex.f));

+}

+

+float4 main() : SV_TARGET0

+{

+    FxaaTex tex = { g_tInputTexture_sampler, g_tInputTexture, 0.5 };

+    return lookUp(tex);

+}
\ No newline at end of file
diff --git a/Test/hlsl.flattenSubset.frag b/Test/hlsl.flattenSubset.frag
new file mode 100644
index 0000000..c80e093
--- /dev/null
+++ b/Test/hlsl.flattenSubset.frag
@@ -0,0 +1,36 @@
+struct S0

+{

+    int x;

+    int y;

+    SamplerState ss;

+};

+

+struct S1

+{

+    float b;

+    SamplerState samplerState;

+    S0 s0;

+    int a;

+};

+

+struct S2

+{

+    int a1;

+    int a2;

+    int a3;

+    int a4;

+    int a5;

+    S1 resources;

+};

+

+SamplerState samp;

+Texture2D tex;

+

+float4 main(float4 vpos : VPOS) : COLOR0

+{

+    S1 s1;

+    S2 s2;

+    s1.s0.ss = samp;

+    s2.resources = s1;

+    return tex.Sample(s2.resources.s0.ss, float2(0.5));

+}

diff --git a/Test/hlsl.flattenSubset2.frag b/Test/hlsl.flattenSubset2.frag
new file mode 100644
index 0000000..753475d
--- /dev/null
+++ b/Test/hlsl.flattenSubset2.frag
@@ -0,0 +1,24 @@
+struct Nested { float y; Texture2D texNested; };

+struct A { Nested n; float x; };

+struct B { Nested n; Texture2D tex; };

+

+Texture2D someTex;

+

+float4 main(float4 vpos : VPOS) : COLOR0

+{

+    A a1, a2;

+    B b;

+

+    // Assignment of nested structs to nested structs

+    a1.n = a2.n;

+    b .n = a1.n;

+

+    // Assignment of nested struct to standalone

+    Nested n = b.n; 

+

+    // Assignment to nestested struct members

+    a2.n.texNested = someTex;

+    a1.n.y = 1.0;

+

+    return float4(0,0,0,0);

+}

diff --git a/Test/hlsl.forLoop.frag b/Test/hlsl.forLoop.frag
index 9378996..9cf60ee 100644
--- a/Test/hlsl.forLoop.frag
+++ b/Test/hlsl.forLoop.frag
@@ -5,9 +5,13 @@
     [unroll] for (; any(input != input); ) {}
     for (; any(input != input); ) { return -input; }
     for (--input; any(input != input); input += 2) { return -input; }
-	for (;;) if (input.x > 2.0) break;
-	for (;;) if (input.x > 2.0) continue;
-	float ii;
-	for (int ii = -1; ii < 3; ++ii) if (ii == 2) continue;
-	--ii;
+    for (;;) if (input.x > 2.0) break;
+    for (;;) if (input.x > 2.0) continue;
+    float ii;
+    for (int ii = -1; ii < 3; ++ii) if (ii == 2) continue;
+    --ii;
+    for (int first = 0, second = 1; ;) first + second;
+    for ( int i = 0, count = int(ii); i < count; i++ );
+    for (float first = 0, second[2], third; first < second[0]; ++second[1]) first + second[1] + third;
+    for (--ii, --ii, --ii;;) ii;
 }
diff --git a/Test/hlsl.fraggeom.frag b/Test/hlsl.fraggeom.frag
new file mode 100644
index 0000000..5592e85
--- /dev/null
+++ b/Test/hlsl.fraggeom.frag
@@ -0,0 +1,17 @@
+// test geometry shader in fragment shader.  GS attributes should be successfully ignored.
+
+struct myVertex {
+    float4 pos : SV_Position;
+};
+
+[maxvertexcount(1)]
+void GS_Draw(point myVertex IN, inout PointStream<myVertex> OutputStream)
+{
+    OutputStream.Append(IN);
+    OutputStream.RestartStrip();
+}
+
+float4 main() : SV_TARGET
+{
+    return 0;
+}
diff --git a/Test/hlsl.function.frag b/Test/hlsl.function.frag
new file mode 100644
index 0000000..5834b31
--- /dev/null
+++ b/Test/hlsl.function.frag
@@ -0,0 +1,25 @@
+float4 fun0()

+{

+    return 1.0f;

+}

+

+uint fun2(float4 col)

+{

+    return 7;

+}

+

+float4 fun4(uint id1, uniform uint id2)

+{

+    return id1 * id2;

+}

+

+float4 fun1(int index)

+{

+    uint entityId = fun2(fun0());

+    return fun4(entityId, entityId);

+}

+

+int main() : SV_TARGET

+{

+    return fun1;

+}
\ No newline at end of file
diff --git a/Test/hlsl.global-const-init.frag b/Test/hlsl.global-const-init.frag
new file mode 100644
index 0000000..d8f36c9
--- /dev/null
+++ b/Test/hlsl.global-const-init.frag
@@ -0,0 +1,14 @@
+
+cbuffer CB {
+    float4 foo;
+};
+
+static const float4 bar = foo; // test const (in the immutable sense) initializer from non-const.
+
+static const float2 a1[2] = { { 1, 2 }, { foo.x, 4 } }; // not entirely constant
+static const float2 a2[2] = { { 5, 6 }, { 7, 8 } };     // entirely constant
+
+float4 main() : SV_Target0
+{
+    return bar;
+}
diff --git a/Test/hlsl.groupid.comp b/Test/hlsl.groupid.comp
new file mode 100644
index 0000000..e5b0de4
--- /dev/null
+++ b/Test/hlsl.groupid.comp
@@ -0,0 +1,9 @@
+RWTexture2D < float4 > OutputTexture;
+
+// Test conversion between SPIR-V required uint3 group id, and sub-vec3 shader declaration.
+
+[ numthreads ( 8 , 8 , 1 ) ] 
+void main ( uint2 vGroupId : SV_GroupID ) 
+{ 
+    OutputTexture[ vGroupId . xy ] = float4(1.0, 0.0, 0.0, 1.0); 
+}
diff --git a/Test/hlsl.gs-hs-mix.tesc b/Test/hlsl.gs-hs-mix.tesc
new file mode 100644
index 0000000..4519696
--- /dev/null
+++ b/Test/hlsl.gs-hs-mix.tesc
@@ -0,0 +1,119 @@
+cbuffer UniformBlock0 : register(b0)

+{

+  float4x4 model_view_matrix;

+  float4x4 proj_matrix;

+  float4x4 model_view_proj_matrix;

+  float3x3 normal_matrix;

+  float3   color;

+  float3   view_dir;

+  float3   tess_factor;

+};

+

+// =============================================================================

+// Hull Shader

+// =============================================================================

+struct HSInput {

+  float3 PositionWS : POSITION;

+  float3 NormalWS   : NORMAL;

+};

+

+struct HSOutput {

+  float3 PositionWS : POSITION;

+};

+

+struct HSTrianglePatchConstant {

+  float  EdgeTessFactor[3] : SV_TessFactor;

+  float  InsideTessFactor  : SV_InsideTessFactor;

+  float3 NormalWS[3]       : NORMAL;

+};

+

+HSTrianglePatchConstant HSPatchConstant(InputPatch<HSInput, 3> patch)

+{

+  float3 roundedEdgeTessFactor = tess_factor;

+  float  roundedInsideTessFactor = 3;

+  float  insideTessFactor = 1;

+

+  HSTrianglePatchConstant result;

+

+  // Edge and inside tessellation factors

+  result.EdgeTessFactor[0] = roundedEdgeTessFactor.x;

+  result.EdgeTessFactor[1] = roundedEdgeTessFactor.y;

+  result.EdgeTessFactor[2] = roundedEdgeTessFactor.z;

+  result.InsideTessFactor  = roundedInsideTessFactor;

+

+  // Constant data

+  result.NormalWS[0] = patch[0].NormalWS;

+  result.NormalWS[1] = patch[1].NormalWS;

+  result.NormalWS[2] = patch[2].NormalWS;

+

+  return result;

+}

+

+[domain("tri")]

+[partitioning("fractional_odd")]

+[outputtopology("triangle_ccw")]

+[outputcontrolpoints(3)]

+[patchconstantfunc("HSPatchConstant")]

+HSOutput HSMain(

+  InputPatch<HSInput, 3>  patch,

+  uint                    id : SV_OutputControlPointID

+)

+{

+  HSOutput output;

+  output.PositionWS = patch[id].PositionWS;

+  return output;

+}

+

+// =============================================================================

+// Geometry Shader

+// =============================================================================

+struct GSVertexInput {

+  float3 PositionWS : POSITION;

+  float3 NormalWS   : NORMAL;

+};

+

+struct GSVertexOutput {

+  float4 PositionCS : SV_POSITION;

+};

+

+[maxvertexcount(6)]

+void GSMain(

+  triangle GSVertexInput            input[3],

+  inout LineStream<GSVertexOutput>  output

+)

+{

+

+  float3 P0 = input[0].PositionWS.xyz;

+  float3 P1 = input[1].PositionWS.xyz;

+  float3 P2 = input[2].PositionWS.xyz;

+

+  GSVertexOutput vertex;

+  // Totally hacky...

+  P0.z += 0.001;

+  P1.z += 0.001;

+  P2.z += 0.001;

+  float4 Q0 = mul(proj_matrix, float4(P0, 1.0));

+  float4 Q1 = mul(proj_matrix, float4(P1, 1.0));

+  float4 Q2 = mul(proj_matrix, float4(P2, 1.0));

+

+  // Edge 0

+  vertex.PositionCS = Q0;

+  output.Append(vertex);

+  vertex.PositionCS = Q1;

+  output.Append(vertex);

+  output.RestartStrip();

+

+  // Edge 1

+  vertex.PositionCS = Q1;

+  output.Append(vertex);

+  vertex.PositionCS = Q2;

+  output.Append(vertex);

+  output.RestartStrip();

+

+  // Edge 2

+  vertex.PositionCS = Q2;

+  output.Append(vertex);

+  vertex.PositionCS = Q0;

+  output.Append(vertex);

+  output.RestartStrip();

+}

diff --git a/Test/hlsl.hlslOffset.vert b/Test/hlsl.hlslOffset.vert
old mode 100755
new mode 100644
diff --git a/Test/hlsl.hull.3.tesc b/Test/hlsl.hull.3.tesc
new file mode 100644
index 0000000..8509dca
--- /dev/null
+++ b/Test/hlsl.hull.3.tesc
@@ -0,0 +1,39 @@
+// *** 
+// invocation ID coming from synthesized variable
+// ***
+
+struct VS_OUT
+{
+    float3 cpoint : CPOINT;
+};
+
+struct HS_CONSTANT_OUT
+{
+    float edges[2] : SV_TessFactor;
+};
+
+struct HS_OUT
+{
+    float3 cpoint : CPOINT;
+};
+
+[domain("tri")]
+[partitioning("integer")]
+[outputtopology("point")]
+[outputcontrolpoints(4)]
+[patchconstantfunc("PCF")]
+HS_OUT main(InputPatch<VS_OUT, 4> ip)
+{
+    HS_OUT output;
+    output.cpoint = ip[0].cpoint;
+    return output;
+}
+
+HS_CONSTANT_OUT PCF(uint pid : SV_PrimitiveId, float4 pos : SV_Position)
+{
+    HS_CONSTANT_OUT output;
+    
+    output.edges[0] = 2.0f;
+    output.edges[1] = 8.0f;
+    return output;
+}
diff --git a/Test/hlsl.hull.4.tesc b/Test/hlsl.hull.4.tesc
new file mode 100644
index 0000000..cd2b094
--- /dev/null
+++ b/Test/hlsl.hull.4.tesc
@@ -0,0 +1,43 @@
+
+// Test mixed InputPatch structure: user and builtin members.  Hull shaders involve extra
+// logic in this case due to patch constant function call synthesis.
+
+// This example tests the main EP and the PCF EP both having an input patch.
+
+struct HS_Main_Output
+{ 
+    float4 m_Position : SV_POSITION ; 
+}; 
+
+struct HS_Output 
+{ 
+    float fTessFactor [ 3 ] : SV_TessFactor ; 
+    float fInsideTessFactor : SV_InsideTessFactor ; 
+}; 
+
+struct HS_Input 
+{ 
+    float4 m_Position : SV_POSITION; 
+    float4 m_Normal   : TEXCOORD2; 
+}; 
+
+HS_Output HS_ConstFunc ( InputPatch < HS_Input , 3 > I ) 
+{ 
+    HS_Output O = (HS_Output)0;
+
+    O.fInsideTessFactor = I [ 0 ].m_Position.w + I [ 0 ].m_Normal.w;
+
+    return O;
+} 
+
+[ domain ( "tri" ) ] 
+[ partitioning ( "fractional_odd" ) ] 
+[ outputtopology ( "triangle_cw" ) ] 
+[ patchconstantfunc ( "HS_ConstFunc" ) ] 
+[ outputcontrolpoints ( 3 ) ] 
+HS_Main_Output main( InputPatch < HS_Input , 3 > I , uint cpid : SV_OutputControlPointID ) 
+{ 
+    HS_Main_Output output = ( HS_Main_Output ) 0 ; 
+    output.m_Position = 0;
+    return output ; 
+}
diff --git a/Test/hlsl.hull.5.tesc b/Test/hlsl.hull.5.tesc
new file mode 100644
index 0000000..c9e511e
--- /dev/null
+++ b/Test/hlsl.hull.5.tesc
@@ -0,0 +1,43 @@
+
+// Test mixed InputPatch structure: user and builtin members.  Hull shaders involve extra
+// logic in this case due to patch constant function call synthesis.
+
+// This example tests the PCF EP having an InputPatch, but the main EP does not.
+
+struct HS_Main_Output
+{ 
+    float4 m_Position : SV_POSITION ; 
+}; 
+
+struct HS_Output 
+{ 
+    float fTessFactor [ 3 ] : SV_TessFactor ; 
+    float fInsideTessFactor : SV_InsideTessFactor ; 
+}; 
+
+struct HS_Input 
+{ 
+    float4 m_Position : SV_POSITION; 
+    float4 m_Normal   : TEXCOORD2; 
+}; 
+
+HS_Output HS_ConstFunc ( InputPatch < HS_Input , 3 > I ) 
+{ 
+    HS_Output O = (HS_Output)0;
+
+    O.fInsideTessFactor = I [ 0 ].m_Position.w + I [ 0 ].m_Normal.w;
+
+    return O;
+} 
+
+[ domain ( "tri" ) ] 
+[ partitioning ( "fractional_odd" ) ] 
+[ outputtopology ( "triangle_cw" ) ] 
+[ patchconstantfunc ( "HS_ConstFunc" ) ] 
+[ outputcontrolpoints ( 3 ) ] 
+HS_Main_Output main( uint cpid : SV_OutputControlPointID ) 
+{ 
+    HS_Main_Output output = ( HS_Main_Output ) 0 ; 
+    output.m_Position = 0;
+    return output ; 
+}
diff --git a/Test/hlsl.hull.void.tesc b/Test/hlsl.hull.void.tesc
index 971d613..c96ecb4 100644
--- a/Test/hlsl.hull.void.tesc
+++ b/Test/hlsl.hull.void.tesc
@@ -19,7 +19,7 @@
 
 [domain("tri")]
 [partitioning("fractional_even")]
-[outputtopology("line")]
+[outputtopology("triangle_ccw")]
 [outputcontrolpoints(3)]
 [patchconstantfunc("PCF")]
 HS_OUT main(InputPatch<VS_OUT, 3> ip)
diff --git a/Test/hlsl.imagefetch-subvec4.comp b/Test/hlsl.imagefetch-subvec4.comp
new file mode 100644
index 0000000..2a83dd2
--- /dev/null
+++ b/Test/hlsl.imagefetch-subvec4.comp
@@ -0,0 +1,8 @@
+Texture3D<int> IN: register(t0);
+RWTexture3D<uint> OUT: register(u1);
+
+[numthreads(8,8,8)]
+void main(uint3 tid: SV_DispatchThreadID)
+{
+    OUT[tid] = IN[tid];
+}
diff --git a/Test/hlsl.implicitBool.frag b/Test/hlsl.implicitBool.frag
old mode 100755
new mode 100644
diff --git a/Test/hlsl.include.vert b/Test/hlsl.include.vert
new file mode 100644
index 0000000..683398e
--- /dev/null
+++ b/Test/hlsl.include.vert
@@ -0,0 +1,8 @@
+#include "bar.h"
+#include "./inc1/bar.h"
+#include "inc2\bar.h"
+
+float4 main() : SV_Position
+{
+    return i1 + i2 + i3 + i4 + i5 + i6;
+}
diff --git a/Test/hlsl.includeNegative.vert b/Test/hlsl.includeNegative.vert
new file mode 100644
index 0000000..64d31fa
--- /dev/null
+++ b/Test/hlsl.includeNegative.vert
@@ -0,0 +1,8 @@
+#include "foo.h"
+#include "inc2/../foo.h"
+#include "inc1/badInc.h"
+
+float4 main() : SV_Position
+{
+#error in main
+}
diff --git a/Test/hlsl.inf.vert b/Test/hlsl.inf.vert
old mode 100755
new mode 100644
diff --git a/Test/hlsl.inoutquals.frag b/Test/hlsl.inoutquals.frag
index 9328dfb..6a124f8 100644
--- a/Test/hlsl.inoutquals.frag
+++ b/Test/hlsl.inoutquals.frag
@@ -4,11 +4,12 @@
     float  Depth : SV_Depth;
 };
 
-inline void MyFunc(in float x, out float y, inout float z)
+inline void MyFunc(in float x, out float y, inout float z, in out float w)
 {
     y = x;
     z = y;
     x = -1; // no effect since x = in param
+    w *= 1;
 }
 
 PS_OUTPUT main(noperspective in float4 inpos : SV_Position, out int sampleMask : SV_Coverage)
@@ -16,7 +17,7 @@
    PS_OUTPUT psout;
 
    float x = 7, y, z = 3;
-   MyFunc(x, y, z);
+   MyFunc(x, y, z, inpos.w);
 
    psout.Color = float4(x, y, z, 1);
    psout.Depth = inpos.w;
diff --git a/Test/hlsl.int.dot.frag b/Test/hlsl.int.dot.frag
new file mode 100644
index 0000000..c293dc1
--- /dev/null
+++ b/Test/hlsl.int.dot.frag
@@ -0,0 +1,14 @@
+float4 main() : SV_Target {

+  int i = 1;

+  int1 i2 = 2;

+  int2 i3 = 3;

+  int3 i4 = 4;

+  int4 i5 = 5;

+

+  i = dot(i, i);

+  i2 = dot(i2, i2);

+  i3 = dot(i3, i3);

+  i4 = dot(i4, i4);

+  i5 = dot(i5, i5);

+  return i + i2.xxxx + i3.xyxy + i4.xyzx + i5;

+}
\ No newline at end of file
diff --git a/Test/hlsl.intrinsics.frag b/Test/hlsl.intrinsics.frag
index 029b156..ffa3c25 100644
--- a/Test/hlsl.intrinsics.frag
+++ b/Test/hlsl.intrinsics.frag
@@ -13,7 +13,7 @@
 groupshared uint4 gs_ub4;
 groupshared uint4 gs_uc4;
 
-float PixelShaderFunctionS(float inF0, float inF1, float inF2, uint inU0, uint inU1)
+float PixelShaderFunctionS(float inF0, float inF1, float inF2, uint inU0, int inU1)
 {
     uint out_u1;
 
@@ -23,7 +23,7 @@
     bool r003 = any(inF0);
     float r004 = asin(inF0);
     int r005 = asint(inF0);
-    uint r006 = asuint(inF0);
+    uint r006 = asuint(inU1);
     float r007 = asfloat(inU0);
     // asdouble(inU0, inU1);  // TODO: enable when HLSL parser used for intrinsics
     float r009 = atan(inF0);
@@ -31,6 +31,7 @@
     float r011 = ceil(inF0);
     float r012 = clamp(inF0, inF1, inF2);
     clip(inF0);
+    clip(r005);
     float r014 = cos(inF0);
     float r015 = cosh(inF0);
     int r016 = countbits(7);
@@ -41,6 +42,7 @@
     float r021 = ddy_coarse(inF0);
     float r022 = ddy_fine(inF0);
     float r023 = degrees(inF0);
+    float r024 = distance(inF0, inF1);
     // EvaluateAttributeAtCentroid(inF0);
     // EvaluateAttributeAtSample(inF0, 0);
     // TODO: EvaluateAttributeSnapped(inF0, int2(1,2));
@@ -108,6 +110,7 @@
     float2 r011 = ceil(inF0);
     float2 r012 = clamp(inF0, inF1, inF2);
     clip(inF0);
+    clip(inU0);
     float2 r013 = cos(inF0);
     float2 r015 = cosh(inF0);
     int2 r016 = countbits(int2(7,3));
@@ -190,6 +193,7 @@
     float3 r011 = ceil(inF0);
     float3 r012 = clamp(inF0, inF1, inF2);
     clip(inF0);
+    clip(inU0);
     float3 r013 = cos(inF0);
     float3 r014 = cosh(inF0);
     uint3 r015 = countbits(uint3(7,3,5));
@@ -271,6 +275,7 @@
     float4 r011 = ceil(inF0);
     float4 r012 = clamp(inF0, inF1, inF2);
     clip(inF0);
+    clip(inU0);
     float4 r013 = cos(inF0);
     float4 r014 = cosh(inF0);
     uint4 r015 = countbits(uint4(7,3,5,2));
diff --git a/Test/hlsl.layout.frag b/Test/hlsl.layout.frag
index 4c2f7ce..a4fa5af 100644
--- a/Test/hlsl.layout.frag
+++ b/Test/hlsl.layout.frag
@@ -14,5 +14,6 @@
 
 float4 PixelShaderFunction(float4 input) : COLOR0
 {
-    return input + v1 + v5 + v1PostLayout;
+    float4 layout = 2.0;
+    return input + v1 + v5 + v1PostLayout * layout;
 }
diff --git a/Test/hlsl.layoutOverride.vert b/Test/hlsl.layoutOverride.vert
new file mode 100644
index 0000000..4c00601
--- /dev/null
+++ b/Test/hlsl.layoutOverride.vert
@@ -0,0 +1,7 @@
+layout(set=2,binding=0) Texture2D tex : register(t16);

+SamplerState samp;

+

+float4 main() : SV_Position 

+{

+    return tex.Sample(samp, float2(0.2, 0.3));

+}
\ No newline at end of file
diff --git a/Test/hlsl.localStructuredBuffer.comp b/Test/hlsl.localStructuredBuffer.comp
new file mode 100644
index 0000000..34e06e0
--- /dev/null
+++ b/Test/hlsl.localStructuredBuffer.comp
@@ -0,0 +1,4 @@
+RWStructuredBuffer<uint> srt0;

+void main() {

+    RWStructuredBuffer<uint> srt0Local = srt0;

+}
\ No newline at end of file
diff --git a/Test/hlsl.logicalConvert.frag b/Test/hlsl.logicalConvert.frag
old mode 100755
new mode 100644
index 2977206..b353eb1
--- a/Test/hlsl.logicalConvert.frag
+++ b/Test/hlsl.logicalConvert.frag
@@ -12,4 +12,12 @@
 		return 0.0.xxxx;

 	if (!1)

 		return 0.0.xxxx;

+    if (0 || 1)

+		return 0.0.xxxx;

+    if (1 && 0)

+		return 0.0.xxxx;

+    if (1 || false)

+		return 0.0.xxxx;

+    if (true && 1)

+		return 0.0.xxxx;

 }
\ No newline at end of file
diff --git a/Test/hlsl.matpack-1.frag b/Test/hlsl.matpack-1.frag
new file mode 100644
index 0000000..5d02a3e
--- /dev/null
+++ b/Test/hlsl.matpack-1.frag
@@ -0,0 +1,27 @@
+struct MyBuffer1
+{
+    column_major float4x4 mat1;
+    row_major    float4x4 mat2;
+    float4 vec1;
+    float  foo;
+};
+
+struct MyBuffer2
+{
+    row_major float4x4 mat1;
+    float4 vec1;
+};
+
+cbuffer Example
+{
+    MyBuffer1 g_MyBuffer1;
+    MyBuffer2 g_MyBuffer2;
+    column_major float4x4 mat1a;
+};
+
+float4 main() : SV_Target0
+{
+    return mul(g_MyBuffer1.mat1, g_MyBuffer1.vec1) +
+           mul(g_MyBuffer2.mat1, g_MyBuffer2.vec1);
+}
+
diff --git a/Test/hlsl.matpack-pragma.frag b/Test/hlsl.matpack-pragma.frag
new file mode 100644
index 0000000..a9a2833
--- /dev/null
+++ b/Test/hlsl.matpack-pragma.frag
@@ -0,0 +1,33 @@
+#pragma pack_matrix(row_major)
+
+struct MyBuffer1
+{
+    column_major float4x4 mat1;
+    row_major    float4x4 mat2;
+    /*floating*/ float4x4 mat3;
+};
+
+#pragma pack_matrix(column_major)
+
+struct MyBuffer2
+{
+    column_major float4x4 mat1;
+    row_major    float4x4 mat2;
+    /*floating*/ float4x4 mat3;
+};
+
+#pragma pack_matrix(random_string_foo)
+
+cbuffer Example
+{
+    MyBuffer1 g_MyBuffer1;
+    MyBuffer2 g_MyBuffer2;
+    column_major float4x4 mat1a;
+};
+
+float4 main() : SV_Target0
+{
+    return 
+        g_MyBuffer1.mat1[0] + g_MyBuffer1.mat2[0] + g_MyBuffer1.mat3[0] +
+        g_MyBuffer2.mat1[0] + g_MyBuffer2.mat2[0] + g_MyBuffer2.mat3[0];
+}
diff --git a/Test/hlsl.memberFunCall.frag b/Test/hlsl.memberFunCall.frag
new file mode 100644
index 0000000..27d3f6e
--- /dev/null
+++ b/Test/hlsl.memberFunCall.frag
@@ -0,0 +1,16 @@
+float method3(float a) { return 1.0; }

+

+struct myContext {

+    float method1() { return method2(); }

+    float method2() { return method3(1.0); }

+    float method3(float a) { return method4(a, a); }

+    float method4(float a, float b) { return a + b + f; }

+    float f;

+};

+

+float4 main() : SV_TARGET0

+{

+    myContext context;

+    context.f = 3.0;

+    return (float4)context.method1();

+}

diff --git a/Test/hlsl.mip.negative.frag b/Test/hlsl.mip.negative.frag
new file mode 100644
index 0000000..900d385
--- /dev/null
+++ b/Test/hlsl.mip.negative.frag
@@ -0,0 +1,9 @@
+Texture2D          g_tTex2df4;
+
+float4 main() : SV_Target0
+{
+    g_tTex2df4.mips.mips[2][uint2(3, 4)]; // error to chain like this
+
+    return 0;
+}
+    
diff --git a/Test/hlsl.mip.negative2.frag b/Test/hlsl.mip.negative2.frag
new file mode 100644
index 0000000..c07179e
--- /dev/null
+++ b/Test/hlsl.mip.negative2.frag
@@ -0,0 +1,9 @@
+Texture2D          g_tTex2df4;
+
+float4 main() : SV_Target0
+{
+    g_tTex2df4.r[2][uint2(3, 4)]; // '.r' not valid on texture object
+
+    return 0;
+}
+    
diff --git a/Test/hlsl.mip.operator.frag b/Test/hlsl.mip.operator.frag
new file mode 100644
index 0000000..af4f150
--- /dev/null
+++ b/Test/hlsl.mip.operator.frag
@@ -0,0 +1,14 @@
+Texture2DArray     g_tTex2df4a;
+Texture2D          g_tTex2df4;
+
+float4 main() : SV_Target0
+{
+    return g_tTex2df4.mips[2][uint2(3, 4)] +
+
+        // test float->uint cast on the mip arg
+        g_tTex2df4a.mips[5.2][uint3(6, 7, 8)] +
+
+        // Test nesting involving .mips operators:
+        //               ....outer operator mip level......     .....outer operator coordinate....
+        g_tTex2df4.mips[ g_tTex2df4.mips[9][uint2(10,11)][0] ][ g_tTex2df4.mips[13][uint2(14,15)].xy ];
+}
diff --git a/Test/hlsl.mul-truncate.frag b/Test/hlsl.mul-truncate.frag
new file mode 100644
index 0000000..7ce2c22
--- /dev/null
+++ b/Test/hlsl.mul-truncate.frag
@@ -0,0 +1,38 @@
+
+// Test v*v, v*m, m*v, and m*m argument clamping.
+
+cbuffer Matrix
+{
+    float4x4  m44;
+    float4x3  m43;
+    float3x4  m34;
+    float3x3  m33;
+    float2x4  m24;
+    float4x2  m42;
+    float4    v4;
+    float3    v3;
+    float2    v2;
+}
+
+float4 main() : SV_Target0
+{
+    // v*v:
+    float  r00 = mul(v2, v3);  // float = float2*float3; // clamp to float2 dot product
+    float  r01 = mul(v4, v2);  // float = float4*float2; // clamp to float2 dot product
+
+    // v*m
+    float4 r10 = mul(v3, m44); // float4 = float3 * float4x4;  // clamp mat to float3x4;
+    float4 r11 = mul(v4, m34); // truncate vector to vec3
+
+    // m*v
+    float4 r20 = mul(m44, v3); // float4 = float4x4 * float3;  // clamp mat to float4x3;
+    float4 r21 = mul(m43, v4); // truncate vector to vec3
+
+    // m*m
+    float2x3 r30 = mul(m24, m33);  // float2x3 = float2x4 * float3x3;
+    float3x4 r31 = mul(m33, m24);  // float3x4 = float3x3 * float2x4;
+    float3x2 r32 = mul(m33, m42);  // float3x2 = float3x3 * float4x2;
+    float4x3 r33 = mul(m42, m33);  // float4x3 = float4x2 * float3x3;
+
+    return r10 + r11 + r20 + r21 + r00 + r01 + r30[0].x + r31[0] + r32[0].x + transpose(r33)[0];
+}
diff --git a/Test/hlsl.multiDescriptorSet.frag b/Test/hlsl.multiDescriptorSet.frag
new file mode 100644
index 0000000..6c4be21
--- /dev/null
+++ b/Test/hlsl.multiDescriptorSet.frag
@@ -0,0 +1,45 @@
+Texture2D txDiffuseA : register( t0 );

+Texture2D txDiffuseB : register( t1 );

+

+SamplerState samLinearA : register( s0 );

+SamplerState samLinearB : register( s1 );

+

+cbuffer cbNeverChanges : register( b0 )

+{

+    matrix View;

+};

+

+cbuffer cbChangeOnResize : register( b1 )

+{

+    matrix Projection;

+};

+

+cbuffer cbChangesEveryFrame : register( b2 )

+{

+    matrix World;

+    float4 vMeshColor;

+};

+

+

+struct VS_INPUT

+{

+    float4 Pos : POSITION;

+    float2 Tex : TEXCOORD0;

+};

+

+struct PS_INPUT

+{

+    float4 Pos : SV_POSITION;

+    float2 Tex : TEXCOORD0;

+};

+

+

+float4 main( PS_INPUT input) : SV_Target

+{

+    PS_INPUT output = (PS_INPUT)0;

+    output.Pos = mul( input.Pos, World );

+    output.Pos = mul( output.Pos, View );

+    output.Pos = mul( output.Pos, Projection );

+    output.Tex = input.Tex;

+    return txDiffuseA.Sample( samLinearA, output.Tex ) * vMeshColor;

+}

diff --git a/Test/hlsl.multiEntry.vert b/Test/hlsl.multiEntry.vert
old mode 100755
new mode 100644
diff --git a/Test/hlsl.multiReturn.frag b/Test/hlsl.multiReturn.frag
old mode 100755
new mode 100644
diff --git a/Test/hlsl.namespace.frag b/Test/hlsl.namespace.frag
old mode 100755
new mode 100644
diff --git a/Test/hlsl.noSemantic.functionality1.comp b/Test/hlsl.noSemantic.functionality1.comp
new file mode 100644
index 0000000..ac9a7a9
--- /dev/null
+++ b/Test/hlsl.noSemantic.functionality1.comp
@@ -0,0 +1,7 @@
+AppendStructuredBuffer<float4> Buf : register(u0);

+

+[numthreads(1, 1, 1)]

+void main()

+{

+	Buf.Append(1.0f.xxxx);

+}
\ No newline at end of file
diff --git a/Test/hlsl.nonstaticMemberFunction.frag b/Test/hlsl.nonstaticMemberFunction.frag
old mode 100755
new mode 100644
diff --git a/Test/hlsl.numthreads.comp b/Test/hlsl.numthreads.comp
index fcc97f3..0871d3f 100644
--- a/Test/hlsl.numthreads.comp
+++ b/Test/hlsl.numthreads.comp
@@ -4,11 +4,8 @@
 {
 }
 
-[numTHreaDs(4,4,2)]  // case insensitive
-void main_aux1(uint3 tid : SV_DispatchThreadID )
+[numthreads(1,4,8)]
+void main_aux2(uint3 tid : SV_DispatchThreadID )
 {
 }
 
-[numthreads(1,4,8)]
-void main_aux2(uint3 tid : SV_DispatchThreadID );
-
diff --git a/Test/hlsl.opaque-type-bug.frag b/Test/hlsl.opaque-type-bug.frag
new file mode 100644
index 0000000..f4ccaea
--- /dev/null
+++ b/Test/hlsl.opaque-type-bug.frag
@@ -0,0 +1,16 @@
+
+Texture2D      MyTexture : register(t0);
+
+//----------------------------------------------------------------------------------------
+void TexFunc(in const Texture2D t2D, out float3 RGB)
+{    
+    RGB = 0;
+}
+
+//-----------------------------------------------------------------------------------
+void main() 
+{
+    float3 final_RGB;
+
+    TexFunc(MyTexture, final_RGB);
+}
diff --git a/Test/hlsl.partialFlattenLocal.vert b/Test/hlsl.partialFlattenLocal.vert
new file mode 100644
index 0000000..9d6cdc9
--- /dev/null
+++ b/Test/hlsl.partialFlattenLocal.vert
@@ -0,0 +1,27 @@
+Texture2D tex;

+

+struct Packed {

+  Texture2D     tex;

+  float3        pos[3];

+  float2        uv[2];

+  float         x;

+  int           n;

+};

+

+float4 main(float4 pos : POSITION) : SV_POSITION

+{

+  Packed packed;

+  packed.tex    = tex;

+  packed.pos[0] = float3(0, 0, 0);

+  packed.uv[0]  = float2(0, 1);

+  packed.x      = 1.0;

+  packed.n      = 3;

+

+  for (int i = 0; i < 1; ++i) {

+    packed.pos[i].xy += packed.uv[i];

+  }

+

+  Packed packed2 = packed;

+

+  return pos + float4(packed2.pos[0], 0);

+}
\ No newline at end of file
diff --git a/Test/hlsl.partialFlattenMixed.vert b/Test/hlsl.partialFlattenMixed.vert
new file mode 100644
index 0000000..3fc9d68
--- /dev/null
+++ b/Test/hlsl.partialFlattenMixed.vert
@@ -0,0 +1,16 @@
+Texture2D tex[2];

+

+struct Packed {

+    int a;

+    Texture2D     membTex[2];

+    int b;

+};

+

+float4 main(float4 pos : POSITION) : SV_POSITION

+{

+    Packed packed;

+

+    packed.membTex = tex;

+

+    return pos;

+}
\ No newline at end of file
diff --git a/Test/hlsl.partialInit.frag b/Test/hlsl.partialInit.frag
old mode 100755
new mode 100644
diff --git a/Test/hlsl.pp.expand.frag b/Test/hlsl.pp.expand.frag
new file mode 100755
index 0000000..d5318a0
--- /dev/null
+++ b/Test/hlsl.pp.expand.frag
@@ -0,0 +1,18 @@
+#define EMP1(a)

+#define EMP2(a, b)

+

+#define EXP1(a) = a

+#define EXP2(a, b) = a, b

+

+struct A

+{

+    float4 a EMP1({1,2,3,4});                           // No PP arg errors

+    float4 b EMP2({({{(({1,2,3,4}))}})}, {{1,2,3,4}});  // No PP arg errors

+    float4 c EXP1({1,2,3,4});                           // ERROR: No PP arg errors, but init error

+    float4 d EXP2({({{(({1,2,3,4}))}})}, {{1,2,3,4}});  // ERROR: No PP arg errors, but init error

+};

+

+void main()

+{

+    "a string"

+}

diff --git a/Test/hlsl.pp.vert b/Test/hlsl.pp.vert
new file mode 100644
index 0000000..4b0a451
--- /dev/null
+++ b/Test/hlsl.pp.vert
@@ -0,0 +1,17 @@
+#define A defined(B)
+
+#if A
+int badGlobal1;
+#else
+int goodGlobal1;
+#endif
+
+#define B
+
+#if A
+int goodGlobal2;
+#else
+int badGlobal2;
+#endif
+
+void main() {}
diff --git a/Test/hlsl.preprocessor.frag b/Test/hlsl.preprocessor.frag
new file mode 100644
index 0000000..dba341e
--- /dev/null
+++ b/Test/hlsl.preprocessor.frag
@@ -0,0 +1,13 @@
+#define DEFINE_TEXTURE(name) Texture2D name; SamplerState name##_ss;
+#define SAMPLE_TEXTURE(name, uv) name.Sample(name##_ss, (uv).xy)
+
+#define test_texture2 test_texture
+
+DEFINE_TEXTURE(test_texture)
+
+float4 main(float4 input : TEXCOORD0) : SV_TARGET
+{
+    float4 tex = SAMPLE_TEXTURE(test_texture2, input.xy);
+    return tex;
+}
+
diff --git a/Test/hlsl.reflection.vert b/Test/hlsl.reflection.vert
index 21cc810..06207c7 100644
--- a/Test/hlsl.reflection.vert
+++ b/Test/hlsl.reflection.vert
@@ -19,27 +19,10 @@
     float4 c_anonMember3;

 };

 

-cbuffer named {

-    float3 deadMember1;

-    int scalar;

-    float4 member2;

-    float4 member3;

-    float2 memfloat2;

-    float memf1;

-    bool  memf2;

-    int   memf3;

-    float2 memfloat2a;

-    float2x2 m22[7];

-} ablock;

-

 cbuffer namelessdead {

     int a;

 };

 

-cbuffer namedDead {

-    int b;

-} bblock;

-

 struct N1 {

     float a;

 };

@@ -57,7 +40,7 @@
 

 cbuffer nested {

     N3 foo;

-} nest;

+}

 

 struct TS {

     int a;

@@ -89,16 +72,12 @@
     int3 v3;

 };

 

-

-

-

 uniform deep3 deepA[2], deepB[2], deepC[3], deepD[2];

 

 const bool control = true;

 

 void deadFunction()

 {

-    float3 v3 = ablock.deadMember1;

     float4 v = anonDeadMember2;

     float f = ufDead4;

 }

@@ -110,12 +89,12 @@
 }

 

 tbuffer abl {

-    float foo;

-} arrBl;

+    float foo1;

+}

 

 tbuffer abl2 {

-    float foo;

-} arrBl2;

+    float foo2;

+}

 

 void flizv(in float attributeFloat, in float2 attributeFloat2, in float3 attributeFloat3, in float4 attributeFloat4, in float4x4 attributeMat4)

 {

@@ -130,22 +109,16 @@
         liveFunction2();

         f = anonMember3.z;

         f = s.a;

-        f = ablock.scalar;

         f = m23[1].y + scalarAfterm23;

         f = c_m23[1].y + c_scalarAfterm23;

         f += scalarBeforeArray;

         f += floatArray[2];

         f += floatArray[4];

         f += scalarAfterArray;

-        f += ablock.memfloat2.x;

-        f += ablock.memf1;

-        f += float(ablock.memf2);

-        f += ablock.memf3;

-        f += ablock.memfloat2a.y;

-        f += ablock.m22[i][1][0];

+        f += m22[i][1][0];

         f += dm22[3][0][1];

         f += m22[2][1].y;

-        f += nest.foo.n1.a + nest.foo.n2.b + nest.foo.n2.c + nest.foo.n2.d;

+        f += foo.n1.a + foo.n2.b + foo.n2.c + foo.n2.d;

         f += deepA[i].d2.d1[2].va[1].x;

         f += deepB[1].d2.d1[i].va[1].x;

         f += deepB[i].d2.d1[i].va[1].x;

@@ -154,8 +127,8 @@
     } else

         f = ufDead3;

 

-    f += arrBl.foo + arrBl.foo;

-    f += arrBl2.foo;

+    f += foo1 + foo2;

+    f += foo2;

 

     f += attributeFloat;

     f += attributeFloat2.x;

diff --git a/Test/hlsl.samplecmp.dualmode.frag b/Test/hlsl.samplecmp.dualmode.frag
new file mode 100644
index 0000000..5b600f3
--- /dev/null
+++ b/Test/hlsl.samplecmp.dualmode.frag
@@ -0,0 +1,14 @@
+SamplerState g_sSamp : register(s0);
+SamplerComparisonState g_sSampCmp : register(s1);
+
+uniform Texture1D <float4> g_tTex : register(t3);
+
+float4 main() : SV_Target0
+{
+    // This texture is used with both shadow modes.  It will need post-compilation
+    // legalization.
+    g_tTex.SampleCmp(g_sSampCmp, 0.1, 0.75);
+    g_tTex.Sample(g_sSamp, 0.1);
+
+    return 0;
+}
diff --git a/Test/hlsl.samplecmp.negative.frag b/Test/hlsl.samplecmp.negative.frag
index cea87bd..8851982 100644
--- a/Test/hlsl.samplecmp.negative.frag
+++ b/Test/hlsl.samplecmp.negative.frag
@@ -1,4 +1,5 @@
 
+Texture2D g_nonShadowTex;
 Texture2D g_shadowTex;
 SamplerState g_shadowSampler;
 SamplerComparisonState g_shadowSamplerComp;
@@ -6,7 +7,7 @@
 float4 main() : SV_Target0
 {
     g_shadowTex.SampleCmp(g_shadowSamplerComp, float2(0,0), 0); // OK
-    g_shadowTex.SampleCmp(g_shadowSampler, float2(0,0), 0);     // ERROR (should be comparison sampler)
+    g_nonShadowTex.SampleCmp(g_shadowSampler, float2(0,0), 0);     // ERROR (should be comparison sampler)
 
     return 0;
 }
diff --git a/Test/hlsl.scalar2matrix.frag b/Test/hlsl.scalar2matrix.frag
new file mode 100644
index 0000000..4068875
--- /dev/null
+++ b/Test/hlsl.scalar2matrix.frag
@@ -0,0 +1,28 @@
+
+void Fn1(float4x4 p) { }
+
+float4 main() : SV_TARGET
+{
+    const float4x4 mat1c = 0.20;
+    const float4x4 mat2c = {2, 2.1, 2.2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+    const float4x4 mat3c = (float4x4)float1(0.1);
+
+    float4x4 mat1 = 0.25;
+    float4x4 mat2 = {3, 3.1, 3.2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+    float4x4 mat3 = (float4x4)0.375;
+    // float4x4 mat5 = (float4x4)Fn2(); // TODO: enable when compex rvalue handling is in place
+
+    float4x4 mat4;
+    mat4 = 0.75;
+    mat4 = float4x4(4, 4.1, 4.2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+    mat4 = (float4x4)0.5;
+
+    mat4 *= 0.75;
+    mat4 += 0.75;
+    mat4 -= 0.5;
+    mat4 /= 2.0;
+
+    Fn1(5.0); // test calling fn accepting matrix with scalar type
+
+    return mat1c[0] + mat3c[0] + mat1[1] + mat4[2];
+}
diff --git a/Test/hlsl.scalarCast.vert b/Test/hlsl.scalarCast.vert
old mode 100755
new mode 100644
diff --git a/Test/hlsl.self_cast.frag b/Test/hlsl.self_cast.frag
new file mode 100644
index 0000000..8ef4027
--- /dev/null
+++ b/Test/hlsl.self_cast.frag
@@ -0,0 +1,25 @@
+struct Test0 {};
+struct Test1 { float f; };
+
+void main()
+{
+    {
+        Test0 a;
+        Test0 b = (Test0)a;
+    }
+
+    {
+        Test1 a;
+        Test1 b = (Test1)a;
+    }
+
+    {
+        Test0 a[2];
+        Test0 b[2] = (Test0[2])a;
+    }
+
+    {
+        Test1 a[2];
+        Test1 b[2] = (Test1[2])a;
+    }
+}
diff --git a/Test/hlsl.semantic-1.vert b/Test/hlsl.semantic-1.vert
new file mode 100644
index 0000000..ec92428
--- /dev/null
+++ b/Test/hlsl.semantic-1.vert
@@ -0,0 +1,24 @@
+#define DLAYER 3
+
+#define DMACRO1 TEXCOORD1
+#define DMACRO(num) TEXCOORD##num
+
+struct S {
+	float4 pos	: POSITION;
+	float2 UV0    	: TEXCOORD0;
+	float2 UV1	: DMACRO1;
+	float2 UV2	: DMACRO(2);
+	float2 UV3	: DMACRO(DLAYER);
+};
+
+
+S main(float4 v : POSITION)
+{
+    S s;
+    s.pos = v;
+    s.UV0 = float2(v.x,v.x);
+    s.UV1 = float2(v.y,v.y);
+    s.UV2 = float2(v.z,v.z);
+    s.UV3 = float2(v.w,v.w);
+    return s;
+}
diff --git a/Test/hlsl.semantic.geom b/Test/hlsl.semantic.geom
index c4d7aba..fc6a53a 100644
--- a/Test/hlsl.semantic.geom
+++ b/Test/hlsl.semantic.geom
@@ -1,4 +1,5 @@
 struct S {
+    float clip0 : SV_Position;
     float clip0 : SV_ClipDistance0;
     float cull0 : SV_CullDistance0;
     uint vpai   : SV_ViewportArrayIndex;
@@ -7,9 +8,9 @@
 };
 
 [maxvertexcount(4)]
-S main(triangle in uint VertexID[3] : VertexID,
+void main(triangle in uint VertexID[3] : VertexID,
        inout LineStream<S> OutputStream)
 {
     S s;
-    return s;
+    OutputStream.Append(s);
 }
diff --git a/Test/hlsl.semantic.vert b/Test/hlsl.semantic.vert
index 16bba37..1845dc3 100644
--- a/Test/hlsl.semantic.vert
+++ b/Test/hlsl.semantic.vert
@@ -1,10 +1,8 @@
 struct S {
-    float clip  : SV_ClipDistance;
     float clip0 : SV_ClipDistance0;
-    float clip7 : SV_ClipDistance7;
-    float cull  : SV_CullDistance;
-    float cull2 : SV_CullDistance2;
-    float cull5 : SV_CullDistance5;
+    float clip1 : SV_ClipDistance1;
+    float cull0 : SV_CullDistance0;
+    float cull1 : SV_CullDistance1;
     int ii      : SV_InstanceID;
 };
 
diff --git a/Test/hlsl.shapeConvRet.frag b/Test/hlsl.shapeConvRet.frag
old mode 100755
new mode 100644
diff --git a/Test/hlsl.shift.per-set.frag b/Test/hlsl.shift.per-set.frag
new file mode 100755
index 0000000..d7c0243
--- /dev/null
+++ b/Test/hlsl.shift.per-set.frag
@@ -0,0 +1,60 @@
+// Test register class offsets for different resource types
+
+SamplerState       s1 : register(s1, space1);
+SamplerComparisonState s2 : register(s2, space2);
+
+Texture1D <float4> t1 : register(t1, space1);
+Texture2D <float4> t2 : register(t2, space1);
+Texture3D <float4> t3 : register(t1, space2);
+Texture3D <float4> ts6 : register(t1, space6);
+StructuredBuffer<float4> t4 : register(t1, space3);
+
+ByteAddressBuffer t5 : register(t2, space3);
+Buffer<float4> t6 : register(t3, space3);
+
+RWTexture1D <float4> u1 : register(u1, space1);
+RWTexture2D <float4> u2 : register(u2, space2);
+RWTexture3D <float4> u3 : register(u3, space2);
+
+RWBuffer <float> u4 : register(u4, space1);
+RWByteAddressBuffer u5 : register(u4, space2);
+RWStructuredBuffer<float> u6 : register(u4, space3);
+AppendStructuredBuffer<float> u7 : register(u4, space4);
+ConsumeStructuredBuffer<float> u8 : register(u4, space5);
+
+cbuffer cb : register(b1, space6) {
+    int cb1;
+};
+
+tbuffer tb : register(t7) {
+    int tb1;
+};
+
+float4 main() : SV_Target0
+{
+    t1;
+    t2;
+    t3;
+    t4[0];
+    t5.Load(0);
+    t6;
+
+    s1;
+    s2;
+
+    u1;
+    u2;
+    u3;
+
+    u4[0];
+    u5.Load(0);
+    u6[0];
+    u7;
+    u8;
+
+    cb1;
+    tb1;
+    ts6;
+
+    return 0;
+}
diff --git a/Test/hlsl.snorm.uav.comp b/Test/hlsl.snorm.uav.comp
new file mode 100644
index 0000000..c6cafeb
--- /dev/null
+++ b/Test/hlsl.snorm.uav.comp
@@ -0,0 +1,15 @@
+
+unorm float4 uf4;
+
+Texture3D<unorm float4> ResultInU: register(t0);
+RWTexture3D<unorm float4> ResultOutU: register(u0);
+
+Texture3D<snorm float4> ResultInS: register(t1);
+RWTexture3D<snorm float4> ResultOutS: register(u1);
+
+[numthreads(16, 16, 1)]
+void main(uint3 tid: SV_DispatchThreadID)
+{
+    ResultOutS[tid] = ResultInS[tid] + uf4;
+    ResultOutU[tid] = ResultInU[tid];
+}
diff --git a/Test/hlsl.staticFuncInit.frag b/Test/hlsl.staticFuncInit.frag
new file mode 100644
index 0000000..f61c566
--- /dev/null
+++ b/Test/hlsl.staticFuncInit.frag
@@ -0,0 +1,20 @@
+static float x = 1.0;
+
+float f1()
+{
+    static float x = 2.0;
+    x += 10.0;
+    return x;
+}
+
+float f2(float p)
+{
+    static float x = 7.0;
+    x += p;
+    return x;
+}
+
+float4 main() : SV_TARGET
+{
+    return x + f1() + f1() + f2(5.0) + f2(x);
+}
diff --git a/Test/hlsl.staticMemberFunction.frag b/Test/hlsl.staticMemberFunction.frag
old mode 100755
new mode 100644
diff --git a/Test/hlsl.store.rwbyteaddressbuffer.type.comp b/Test/hlsl.store.rwbyteaddressbuffer.type.comp
new file mode 100644
index 0000000..5400d81
--- /dev/null
+++ b/Test/hlsl.store.rwbyteaddressbuffer.type.comp
@@ -0,0 +1,8 @@
+RWByteAddressBuffer buffer;
+
+[numthreads(64, 1, 1)]
+void main( uint3 dispatchThreadID : SV_DispatchThreadID)
+{
+    if(dispatchThreadID.x == 0)
+        buffer.Store(0, 2);
+}
\ No newline at end of file
diff --git a/Test/hlsl.string.frag b/Test/hlsl.string.frag
old mode 100755
new mode 100644
diff --git a/Test/hlsl.struct.split.assign.frag b/Test/hlsl.struct.split.assign.frag
index e7fe028..d9921f3 100644
--- a/Test/hlsl.struct.split.assign.frag
+++ b/Test/hlsl.struct.split.assign.frag
@@ -8,5 +8,5 @@
     S a[3];
     input = a;
 
-    return float3(1.0);
+    return a[1].pos;
 }
diff --git a/Test/hlsl.struct.split.nested.geom b/Test/hlsl.struct.split.nested.geom
index 03bf38f..8bcc5b9 100644
--- a/Test/hlsl.struct.split.nested.geom
+++ b/Test/hlsl.struct.split.nested.geom
@@ -1,8 +1,8 @@
 
 struct STRUCT_WITH_NO_BUILTIN_INTERSTAGE_IO
 {
-    float m0_array[2];
-    int   m1;
+    float m0_array[2] : mysemA;
+    int   m1 : mysemB;
 };
 
 struct PS_IN 
@@ -26,6 +26,9 @@
 
     o.psIn.pos = float4(1,2,3,4);
     o.psIn.tc  = float2(5,6);
+    o.contains_no_builtin_io.m0_array[0] = 2.3;
+    o.contains_no_builtin_io.m0_array[1] = 2.3;
+    o.contains_no_builtin_io.m1 = 2;
 
     ts.Append(o);
 }
diff --git a/Test/hlsl.structIoFourWay.frag b/Test/hlsl.structIoFourWay.frag
old mode 100755
new mode 100644
diff --git a/Test/hlsl.structStructName.frag b/Test/hlsl.structStructName.frag
old mode 100755
new mode 100644
diff --git a/Test/hlsl.structbuffer.append.fn.frag b/Test/hlsl.structbuffer.append.fn.frag
new file mode 100644
index 0000000..668bc1e
--- /dev/null
+++ b/Test/hlsl.structbuffer.append.fn.frag
@@ -0,0 +1,23 @@
+
+// float4 Fn1(ConsumeStructuredBuffer<float4> arg_c)
+// {
+//     return arg_c.Consume();
+// }
+
+float4 Fn2(AppendStructuredBuffer<float4> arg_a, ConsumeStructuredBuffer<float4> arg_c)
+{
+    arg_a.Append(float4(1,2,3,4));
+    return arg_c.Consume();
+}
+
+AppendStructuredBuffer<float4>  sbuf_a;
+ConsumeStructuredBuffer<float4> sbuf_c;
+
+AppendStructuredBuffer<float4>  sbuf_unused;
+
+float4 main(uint pos : FOO) : SV_Target0
+{
+    // Fn1(sbuf_c);
+
+    return Fn2(sbuf_a, sbuf_c);
+}
diff --git a/Test/hlsl.structbuffer.frag b/Test/hlsl.structbuffer.frag
index 4eb6912..dd522a6 100644
--- a/Test/hlsl.structbuffer.frag
+++ b/Test/hlsl.structbuffer.frag
@@ -5,7 +5,7 @@
     bool   test2;
 }; // stride = 20
 
-StructuredBuffer<sb_t>  sbuf : register(c10);
+StructuredBuffer<sb_t>  sbuf : register(t10);
 StructuredBuffer<float> sbuf2;
 
 float4 main(uint pos : FOO) : SV_Target0
diff --git a/Test/hlsl.structin.vert b/Test/hlsl.structin.vert
index 43d0cfd..20a26dd 100644
--- a/Test/hlsl.structin.vert
+++ b/Test/hlsl.structin.vert
@@ -1,14 +1,17 @@
 struct VI {
-    float4 m[2];
-    uint2 coord;
-    linear float4 b;
+    float4 m[2] : mysemA;
+    float4 coord : SV_POSITION;
+    linear float4 b : mysemB;
 };
 
-VI main(float4 d, VI vi, float4 e) : SV_POSITION
+VI main(float4 d : mysem, VI vi, float4 e : mysem)
 {
     VI local;
 
-    local.b = vi.m[1] + vi.m[0] + float4(vi.coord.x) + d + e;
+    local.b = vi.m[1] + vi.m[0] + (float4)vi.coord.x + d + e;
+    local.coord = (float4)1;
+    local.m[0] = (float4)2;
+    local.m[1] = (float4)3;
 
     return local;
 }
diff --git a/Test/hlsl.subpass.frag b/Test/hlsl.subpass.frag
new file mode 100644
index 0000000..20a717f
--- /dev/null
+++ b/Test/hlsl.subpass.frag
@@ -0,0 +1,113 @@
+
+layout(input_attachment_index = 1) SubpassInput<float4> subpass_f4 : register(t1);
+layout(input_attachment_index = 2) SubpassInput<int4>   subpass_i4;
+layout(input_attachment_index = 3) SubpassInput<uint4>  subpass_u4;
+
+layout(input_attachment_index = 4) SubpassInputMS<float4> subpass_ms_f4;
+layout(input_attachment_index = 5) SubpassInputMS<int4>   subpass_ms_i4;
+layout(input_attachment_index = 6) SubpassInputMS<uint4>  subpass_ms_u4;
+
+layout(input_attachment_index = 1) SubpassInput<float3> subpass_f3;
+layout(input_attachment_index = 2) SubpassInput<int3>   subpass_i3;
+layout(input_attachment_index = 3) SubpassInput<uint3>  subpass_u3;
+
+layout(input_attachment_index = 4) SubpassInputMS<float3> subpass_ms_f3;
+layout(input_attachment_index = 5) SubpassInputMS<int3>   subpass_ms_i3;
+layout(input_attachment_index = 6) SubpassInputMS<uint3>  subpass_ms_u3;
+
+layout(input_attachment_index = 1) SubpassInput<float2> subpass_f2;
+layout(input_attachment_index = 2) SubpassInput<int2>   subpass_i2;
+layout(input_attachment_index = 3) SubpassInput<uint2>  subpass_u2;
+
+layout(input_attachment_index = 4) SubpassInputMS<float2> subpass_ms_f2;
+layout(input_attachment_index = 5) SubpassInputMS<int2>   subpass_ms_i2;
+layout(input_attachment_index = 6) SubpassInputMS<uint2>  subpass_ms_u2;
+
+layout(input_attachment_index = 1) SubpassInput<float> subpass_f;
+layout(input_attachment_index = 2) SubpassInput<int>   subpass_i;
+layout(input_attachment_index = 3) SubpassInput<uint>  subpass_u;
+
+layout(input_attachment_index = 4) SubpassInputMS<float> subpass_ms_f;
+layout(input_attachment_index = 5) SubpassInputMS<int>   subpass_ms_i;
+layout(input_attachment_index = 6) SubpassInputMS<uint>  subpass_ms_u;
+
+[[vk::input_attachment_index(7)]] SubpassInput subpass_2;
+
+struct mystruct_f_t
+{
+    float  c0;
+    float2 c1;
+    float  c2;
+};
+
+struct mystruct_i_t
+{
+    int  c0;
+    int2 c1;
+    int  c2;
+};
+
+struct mystruct_u_t
+{
+    uint  c0;
+    uint2 c1;
+    uint  c2;
+};
+
+// TODO: ...
+// layout(input_attachment_index = 7) SubpassInput<mystruct_f_t>    subpass_fs;
+// layout(input_attachment_index = 8) SubpassInputMS<mystruct_f_t>  subpass_ms_fs;
+
+// layout(input_attachment_index = 7) SubpassInput<mystruct_i_t>    subpass_is;
+// layout(input_attachment_index = 8) SubpassInputMS<mystruct_i_t>  subpass_ms_is;
+
+// layout(input_attachment_index = 7) SubpassInput<mystruct_u_t>    subpass_us;
+// layout(input_attachment_index = 8) SubpassInputMS<mystruct_u_t>  subpass_ms_us;
+
+float4 main() : SV_Target0
+{
+    float4 result00 = subpass_f4.SubpassLoad();
+    int4   result01 = subpass_i4.SubpassLoad();
+    uint4  result02 = subpass_u4.SubpassLoad();
+
+    float4 result10 = subpass_ms_f4.SubpassLoad(3);
+    int4   result11 = subpass_ms_i4.SubpassLoad(3);
+    uint4  result12 = subpass_ms_u4.SubpassLoad(3);
+
+    float3 result20 = subpass_f3.SubpassLoad();
+    int3   result21 = subpass_i3.SubpassLoad();
+    uint3  result22 = subpass_u3.SubpassLoad();
+
+    float3 result30 = subpass_ms_f3.SubpassLoad(3);
+    int3   result31 = subpass_ms_i3.SubpassLoad(3);
+    uint3  result32 = subpass_ms_u3.SubpassLoad(3);
+
+    float2 result40 = subpass_f2.SubpassLoad();
+    int2   result41 = subpass_i2.SubpassLoad();
+    uint2  result42 = subpass_u2.SubpassLoad();
+
+    float2 result50 = subpass_ms_f2.SubpassLoad(2);
+    int2   result51 = subpass_ms_i2.SubpassLoad(2);
+    uint2  result52 = subpass_ms_u2.SubpassLoad(2);
+
+    float  result60 = subpass_f.SubpassLoad();
+    int    result61 = subpass_i.SubpassLoad();
+    uint   result62 = subpass_u.SubpassLoad();
+
+    float  result70 = subpass_ms_f.SubpassLoad(2);
+    int    result71 = subpass_ms_i.SubpassLoad(2);
+    uint   result72 = subpass_ms_u.SubpassLoad(2);
+
+    float4 result73 = subpass_2.SubpassLoad();
+
+    // TODO: 
+    // mystruct_f_t result80 = subpass_fs.SubpassLoad();
+    // mystruct_i_t result81 = subpass_is.SubpassLoad();
+    // mystruct_u_t result82 = subpass_us.SubpassLoad();
+
+    // mystruct_f_t result90 = subpass_ms_sf.SubpassLoad(2);
+    // mystruct_i_t result91 = subpass_ms_if.SubpassLoad(2);
+    // mystruct_u_t result92 = subpass_ms_uf.SubpassLoad(2);
+
+    return 0;
+}
diff --git a/Test/hlsl.switch.frag b/Test/hlsl.switch.frag
index 88239c2..78ebfef 100644
--- a/Test/hlsl.switch.frag
+++ b/Test/hlsl.switch.frag
@@ -18,7 +18,7 @@
         break;
     }
 
-    switch (c) {
+    [branch] switch (c) {
     case 1:
         ++input;
         break;
diff --git a/Test/hlsl.synthesizeInput.frag b/Test/hlsl.synthesizeInput.frag
new file mode 100644
index 0000000..c4b2fa4
--- /dev/null
+++ b/Test/hlsl.synthesizeInput.frag
@@ -0,0 +1,9 @@
+struct PSInput {

+  float interp;

+  uint no_interp;

+};

+

+float4 main(PSInput input : INPUT) : SV_TARGET

+{

+  return float4(float(input.no_interp), input.interp, 0, 1);

+}
\ No newline at end of file
diff --git a/Test/hlsl.target.frag b/Test/hlsl.target.frag
new file mode 100644
index 0000000..5317236
--- /dev/null
+++ b/Test/hlsl.target.frag
@@ -0,0 +1,10 @@
+struct PSInput {

+  float interp;

+  uint no_interp;

+};

+

+void main(PSInput input : INPUT, out float4 out1 : SV_TARGET1, out float4 out2 : SV_TARGET3)

+{

+    out1 = 1;

+    out2 = 0;

+}
\ No newline at end of file
diff --git a/Test/hlsl.targetStruct1.frag b/Test/hlsl.targetStruct1.frag
new file mode 100644
index 0000000..7fcc082
--- /dev/null
+++ b/Test/hlsl.targetStruct1.frag
@@ -0,0 +1,19 @@
+struct PSInput {

+  float interp;

+  uint no_interp;

+};

+

+struct PSOutput {

+    float4 o1 : SV_TARGET2;

+    float4 o2 : SV_TARGET1;

+};

+

+PSOutput main(PSInput input : INPUT, out float4 po : SV_TARGET0)

+{

+    PSOutput pso;

+    pso.o1 = float4(float(input.no_interp), input.interp, 0, 1);

+    pso.o2 = 1;

+    po = 0;

+

+    return pso;

+}
\ No newline at end of file
diff --git a/Test/hlsl.targetStruct2.frag b/Test/hlsl.targetStruct2.frag
new file mode 100644
index 0000000..e62ba0f
--- /dev/null
+++ b/Test/hlsl.targetStruct2.frag
@@ -0,0 +1,19 @@
+struct PSInput {

+  float interp;

+  uint no_interp;

+};

+

+struct PSOutput {

+    float4 o1 : SV_TARGET1;

+    float4 o2 : SV_TARGET0;

+};

+

+PSOutput main(PSInput input : INPUT, out float4 po : SV_TARGET0) : SV_TARGET2

+{

+    PSOutput pso;

+    pso.o1 = float4(float(input.no_interp), input.interp, 0, 1);

+    pso.o2 = 1;

+    po = 0;

+

+    return pso;

+}
\ No newline at end of file
diff --git a/Test/hlsl.texture.struct.frag b/Test/hlsl.texture.struct.frag
new file mode 100644
index 0000000..461469c
--- /dev/null
+++ b/Test/hlsl.texture.struct.frag
@@ -0,0 +1,55 @@
+struct s1_t {
+    float  c0;
+    float2 c1;
+    float  c2;
+};
+
+struct s2_t {
+    float  c0;
+    float3 c1;
+};
+
+struct s3_t {
+    float2  c0;
+    float1  c1;
+};
+
+struct s4_t {
+    int  c0;
+    int2 c1;
+    int  c2;
+};
+
+struct s5_t {
+    uint c0;
+    uint c1;
+};
+
+SamplerState g_sSamp;
+Texture2D <s1_t>   g_tTex2s1;
+Texture2D <s2_t>   g_tTex2s2;
+Texture2D <s3_t>   g_tTex2s3;
+Texture2D <s4_t>   g_tTex2s4;
+Texture2D <s5_t>   g_tTex2s5;
+
+Texture2D <s1_t>   g_tTex2s1a; // same type as g_tTex2s1, to test fn signature matching.
+
+// function overloading to test name mangling with textures templatized on structs
+s1_t fn1(Texture2D <s1_t> t1) { return t1 . Sample(g_sSamp, float2(0.6, 0.61)); }
+s2_t fn1(Texture2D <s2_t> t2) { return t2 . Sample(g_sSamp, float2(0.6, 0.61)); }
+
+float4 main() : SV_Target0
+{
+    s1_t s1 = g_tTex2s1 . Sample(g_sSamp, float2(0.1, 0.11));
+    s2_t s2 = g_tTex2s2 . Sample(g_sSamp, float2(0.2, 0.21));
+    s3_t s3 = g_tTex2s3 . Sample(g_sSamp, float2(0.3, 0.31));
+    s4_t s4 = g_tTex2s4 . Sample(g_sSamp, float2(0.4, 0.41));
+    s5_t s5 = g_tTex2s5 . Sample(g_sSamp, float2(0.5, 0.51));
+
+    s1_t r0 = fn1(g_tTex2s1);
+    s2_t r1 = fn1(g_tTex2s2);
+    s1_t r2 = fn1(g_tTex2s1a);
+
+    return 0;
+}
+
diff --git a/Test/hlsl.texture.subvec4.frag b/Test/hlsl.texture.subvec4.frag
new file mode 100644
index 0000000..56fd410
--- /dev/null
+++ b/Test/hlsl.texture.subvec4.frag
@@ -0,0 +1,41 @@
+
+Texture2DMS <float>  g_tTex2dmsf1;
+Texture2DMS <float2> g_tTex2dmsf2;
+Texture2DMS <float3> g_tTex2dmsf3;
+Texture2DMS <float4> g_tTex2dmsf4;
+
+Texture2D <float>  g_tTex2df1;
+Texture2D <float2> g_tTex2df2;
+Texture2D <float3> g_tTex2df3;
+Texture2D <float4> g_tTex2df4;
+
+SamplerState g_sSamp;
+
+float4 main() : SV_Target0
+{
+    uint MipLevel;
+    uint WidthU;
+    uint HeightU;
+    uint ElementsU;
+    uint DepthU;
+    uint NumberOfLevelsU;
+    uint NumberOfSamplesU;
+
+    g_tTex2dmsf1 . GetDimensions(WidthU, HeightU, NumberOfSamplesU);
+    g_tTex2dmsf2 . GetDimensions(WidthU, HeightU, NumberOfSamplesU);
+    g_tTex2dmsf3 . GetDimensions(WidthU, HeightU, NumberOfSamplesU);
+    g_tTex2dmsf4 . GetDimensions(WidthU, HeightU, NumberOfSamplesU);
+
+    g_tTex2dmsf1 . Load(int2(1,2), 3);
+    g_tTex2dmsf2 . Load(int2(1,2), 3);
+    g_tTex2dmsf3 . Load(int2(1,2), 3);
+    g_tTex2dmsf4 . Load(int2(1,2), 3);
+
+    g_tTex2df1 . Sample(g_sSamp, float2(.1, .2));
+    g_tTex2df2 . Sample(g_sSamp, float2(.1, .2));
+    g_tTex2df3 . Sample(g_sSamp, float2(.1, .2));
+    g_tTex2df4 . Sample(g_sSamp, float2(.1, .2));
+    
+    return 0;
+}
+
diff --git a/Test/hlsl.texturebuffer.frag b/Test/hlsl.texturebuffer.frag
new file mode 100644
index 0000000..d069746
--- /dev/null
+++ b/Test/hlsl.texturebuffer.frag
@@ -0,0 +1,17 @@
+
+struct Data {
+    float4  f;
+    int4    i;
+};
+
+TextureBuffer<Data> TextureBuffer_var : register(t0);
+
+tbuffer tbuf2 {
+    float4 f2;
+    int4   i2;
+};
+
+float4 main(float4 pos : SV_POSITION) : SV_TARGET
+{
+    return TextureBuffer_var.f + f2;
+}
diff --git a/Test/hlsl.this.frag b/Test/hlsl.this.frag
old mode 100755
new mode 100644
diff --git a/Test/hlsl.tristream-append.geom b/Test/hlsl.tristream-append.geom
new file mode 100644
index 0000000..208607d
--- /dev/null
+++ b/Test/hlsl.tristream-append.geom
@@ -0,0 +1,18 @@
+struct GSPS_INPUT
+{
+};
+
+// Test Append() method appearing before declaration of entry point's stream output.
+
+void EmitVertex(in GSPS_INPUT output, inout TriangleStream<GSPS_INPUT> TriStream)
+{
+    TriStream.Append( output );
+}
+
+[maxvertexcount(3)]
+void main( triangle GSPS_INPUT input[3], inout TriangleStream<GSPS_INPUT> TriStream )
+{
+    EmitVertex(input[0], TriStream);
+    EmitVertex(input[1], TriStream);
+    EmitVertex(input[2], TriStream);
+}
diff --git a/Test/hlsl.tx.overload.frag b/Test/hlsl.tx.overload.frag
new file mode 100644
index 0000000..8b83ddf
--- /dev/null
+++ b/Test/hlsl.tx.overload.frag
@@ -0,0 +1,17 @@
+
+Texture2D<float>  tf1;
+Texture2D<float4> tf4;
+
+RWTexture2D<float>  twf1;
+RWTexture2D<float4> twf4;
+
+float Func(Texture2D<float> DummyTex) { return 1.0f; }
+float4 Func(Texture2D<float4> DummyTex) { return float4(0,0,0,0); }
+
+float Func(RWTexture2D<float> DummyTex) { return 1.0f; }
+float4 Func(RWTexture2D<float4> DummyTex) { return float4(0,0,0,0); }
+
+float4 main() : SV_TARGET
+{
+    return Func(tf1) + Func(tf4) + Func(twf1) + Func(twf4);
+}
diff --git a/Test/hlsl.type.half.frag b/Test/hlsl.type.half.frag
index f082039..a78afab 100644
--- a/Test/hlsl.type.half.frag
+++ b/Test/hlsl.type.half.frag
@@ -7,5 +7,22 @@
     half3 h3 = 3;
     half4 h4 = 4;
 
-    return 0.0;
+    half1x1 h11;

+    half1x2 h12;

+    half1x3 h13;

+    half1x4 h14;

+    half2x1 h21;

+    half2x2 h22 = half2x2(1,2,3,4);

+    half2x3 h23 = (half2x3)4.9;

+    half2x4 h24;

+    half3x1 h31;

+    half3x2 h32;

+    half3x3 h33;

+    half3x4 h34;

+    half4x1 h41;

+    half4x2 h42;

+    half4x3 h43;

+    half4x4 h44;
+
+    return h23._11 + h4.y + h0;
 }
diff --git a/Test/hlsl.type.identifier.frag b/Test/hlsl.type.identifier.frag
index 25ba457..4e53a82 100644
--- a/Test/hlsl.type.identifier.frag
+++ b/Test/hlsl.type.identifier.frag
@@ -24,5 +24,8 @@
 
     float = float + int + uint + min16float + min10float + (bool[0] ? int : float) + fn(float);
 
-    return float;
+    half2x3 half2x3;
+    half2x3._11 = (float) * float;
+
+    return float + half2x3._11;
 }
diff --git a/Test/hlsl.type.type.conversion.all.frag b/Test/hlsl.type.type.conversion.all.frag
new file mode 100644
index 0000000..1883b01
--- /dev/null
+++ b/Test/hlsl.type.type.conversion.all.frag
@@ -0,0 +1,190 @@
+#define zeros 0

+#define zeros1 0

+#define zeros2 0, 0

+#define zeros3 0, 0, 0

+#define zeros4 0, 0, 0, 0

+#define zeros5 0, 0, 0, 0, 0

+#define zeros6 0, 0, 0, 0, 0, 0

+#define zeros7 0, 0, 0, 0, 0, 0, 0

+#define zeros8 0, 0, 0, 0, 0, 0, 0, 0

+#define zeros9 0, 0, 0, 0, 0, 0, 0, 0, 0

+#define zeros10 0, 0, 0, 0, 0, 0, 0, 0, 0, 0

+#define zeros11 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0

+#define zeros12 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0

+#define zeros13 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0

+#define zeros14 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0

+#define zeros15 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0

+#define zeros16 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0

+float4 main() : SV_Target {

+  float var0 = float(zeros1);

+  float2 var13 = float(zeros1);

+  float2 var14 = float2(zeros2);

+  float3 var26 = float(zeros1);

+  float3 var28 = float3(zeros3);

+  float4 var39 = float(zeros1);

+  float4 var42 = float4(zeros4);

+  float4 var43 = float2x2(zeros4);

+  float2x2 var52 = float(zeros1);

+  float2x2 var55 = float4(zeros4);

+  float2x2 var56 = float2x2(zeros4);

+  float2x3 var65 = float(zeros1);

+  float2x3 var70 = float2x3(zeros6);

+  float2x4 var78 = float(zeros1);

+  float2x4 var84 = float2x4(zeros8);

+  float3x2 var91 = float(zeros1);

+  float3x2 var98 = float3x2(zeros6);

+  float3x3 var104 = float(zeros1);

+  float3x3 var112 = float3x3(zeros9);

+  float3x4 var117 = float(zeros1);

+  float3x4 var126 = float3x4(zeros12);

+  float4x2 var130 = float(zeros1);

+  float4x2 var140 = float4x2(zeros8);

+  float4x3 var143 = float(zeros1);

+  float4x3 var154 = float4x3(zeros12);

+  float4x4 var156 = float(zeros1);

+  float4x4 var168 = float4x4(zeros16);

+  float var1 = float2(zeros2);// warning X3206: implicit truncation of vector type

+  float var2 = float3(zeros3);// warning X3206: implicit truncation of vector type

+  float var3 = float4(zeros4);// warning X3206: implicit truncation of vector type

+  float var4 = float2x2(zeros4);// warning X3206: implicit truncation of vector type

+  float var5 = float2x3(zeros6);// warning X3206: implicit truncation of vector type

+  float var6 = float2x4(zeros8);// warning X3206: implicit truncation of vector type

+  float var7 = float3x2(zeros6);// warning X3206: implicit truncation of vector type

+  float var8 = float3x3(zeros9);// warning X3206: implicit truncation of vector type

+  float var9 = float3x4(zeros12);// warning X3206: implicit truncation of vector type

+  float var10 = float4x2(zeros8);// warning X3206: implicit truncation of vector type

+  float var11 = float4x3(zeros12);// warning X3206: implicit truncation of vector type

+  float var12 = float4x4(zeros16);// warning X3206: implicit truncation of vector type

+  float2 var15 = float3(zeros3);// warning X3206: implicit truncation of vector type

+  float2 var16 = float4(zeros4);// warning X3206: implicit truncation of vector type

+  float3 var29 = float4(zeros4);// warning X3206: implicit truncation of vector type

+  float2x2 var57 = float2x3(zeros6);// warning X3206: implicit truncation of vector type

+  float2x2 var58 = float2x4(zeros8);// warning X3206: implicit truncation of vector type

+  float2x2 var59 = float3x2(zeros6);// warning X3206: implicit truncation of vector type

+  float2x2 var60 = float3x3(zeros9);// warning X3206: implicit truncation of vector type

+  float2x2 var61 = float3x4(zeros12);// warning X3206: implicit truncation of vector type

+  float2x2 var62 = float4x2(zeros8);// warning X3206: implicit truncation of vector type

+  float2x2 var63 = float4x3(zeros12);// warning X3206: implicit truncation of vector type

+  float2x2 var64 = float4x4(zeros16);// warning X3206: implicit truncation of vector type

+  float2x3 var71 = float2x4(zeros8);// warning X3206: implicit truncation of vector type

+  float2x3 var73 = float3x3(zeros9);// warning X3206: implicit truncation of vector type

+  float2x3 var74 = float3x4(zeros12);// warning X3206: implicit truncation of vector type

+  float2x3 var76 = float4x3(zeros12);// warning X3206: implicit truncation of vector type

+  float2x3 var77 = float4x4(zeros16);// warning X3206: implicit truncation of vector type

+  float2x4 var87 = float3x4(zeros12);// warning X3206: implicit truncation of vector type

+  float2x4 var90 = float4x4(zeros16);// warning X3206: implicit truncation of vector type

+  float3x2 var99 = float3x3(zeros9);// warning X3206: implicit truncation of vector type

+  float3x2 var100 = float3x4(zeros12);// warning X3206: implicit truncation of vector type

+  float3x2 var101 = float4x2(zeros8);// warning X3206: implicit truncation of vector type

+  float3x2 var102 = float4x3(zeros12);// warning X3206: implicit truncation of vector type

+  float3x2 var103 = float4x4(zeros16);// warning X3206: implicit truncation of vector type

+  float3x3 var113 = float3x4(zeros12);// warning X3206: implicit truncation of vector type

+  float3x3 var115 = float4x3(zeros12);// warning X3206: implicit truncation of vector type

+  float3x3 var116 = float4x4(zeros16);// warning X3206: implicit truncation of vector type

+  float3x4 var129 = float4x4(zeros16);// warning X3206: implicit truncation of vector type

+  float4x2 var141 = float4x3(zeros12);// warning X3206: implicit truncation of vector type

+  float4x2 var142 = float4x4(zeros16);// warning X3206: implicit truncation of vector type

+  float4x3 var155 = float4x4(zeros16);// warning X3206: implicit truncation of vector type

+  float2 var17 = float2x2(zeros4);// Compilation failed because: error X3017: cannot implicitly convert from 'const float2x2' to 'float2'

+  float2 var18 = float2x3(zeros6);// Compilation failed because: error X3017: cannot implicitly convert from 'const float2x3' to 'float2'

+  float2 var19 = float2x4(zeros8);// Compilation failed because: error X3017: cannot implicitly convert from 'const float2x4' to 'float2'

+  float2 var20 = float3x2(zeros6);// Compilation failed because: error X3017: cannot implicitly convert from 'const float3x2' to 'float2'

+  float2 var21 = float3x3(zeros9);// Compilation failed because: error X3017: cannot implicitly convert from 'const float3x3' to 'float2'

+  float2 var22 = float3x4(zeros12);// Compilation failed because: error X3017: cannot implicitly convert from 'const float3x4' to 'float2'

+  float2 var23 = float4x2(zeros8);// Compilation failed because: error X3017: cannot implicitly convert from 'const float4x2' to 'float2'

+  float2 var24 = float4x3(zeros12);// Compilation failed because: error X3017: cannot implicitly convert from 'const float4x3' to 'float2'

+  float2 var25 = float4x4(zeros16);// Compilation failed because: error X3017: cannot implicitly convert from 'const float4x4' to 'float2'

+  float3 var27 = float2(zeros2);// Compilation failed because: error X3017: cannot implicitly convert from 'const float2' to 'float3'

+  float3 var30 = float2x2(zeros4);// Compilation failed because: error X3017: cannot implicitly convert from 'const float2x2' to 'float3'

+  float3 var31 = float2x3(zeros6);// Compilation failed because: error X3017: cannot implicitly convert from 'const float2x3' to 'float3'

+  float3 var32 = float2x4(zeros8);// Compilation failed because: error X3017: cannot implicitly convert from 'const float2x4' to 'float3'

+  float3 var33 = float3x2(zeros6);// Compilation failed because: error X3017: cannot implicitly convert from 'const float3x2' to 'float3'

+  float3 var34 = float3x3(zeros9);// Compilation failed because: error X3017: cannot implicitly convert from 'const float3x3' to 'float3'

+  float3 var35 = float3x4(zeros12);// Compilation failed because: error X3017: cannot implicitly convert from 'const float3x4' to 'float3'

+  float3 var36 = float4x2(zeros8);// Compilation failed because: error X3017: cannot implicitly convert from 'const float4x2' to 'float3'

+  float3 var37 = float4x3(zeros12);// Compilation failed because: error X3017: cannot implicitly convert from 'const float4x3' to 'float3'

+  float3 var38 = float4x4(zeros16);// Compilation failed because: error X3017: cannot implicitly convert from 'const float4x4' to 'float3'

+  float4 var40 = float2(zeros2);// Compilation failed because: error X3017: cannot implicitly convert from 'const float2' to 'float4'

+  float4 var41 = float3(zeros3);// Compilation failed because: error X3017: cannot implicitly convert from 'const float3' to 'float4'

+  float4 var44 = float2x3(zeros6);// Compilation failed because: error X3017: cannot implicitly convert from 'const float2x3' to 'float4'

+  float4 var45 = float2x4(zeros8);// Compilation failed because: error X3017: cannot implicitly convert from 'const float2x4' to 'float4'

+  float4 var46 = float3x2(zeros6);// Compilation failed because: error X3017: cannot implicitly convert from 'const float3x2' to 'float4'

+  float4 var47 = float3x3(zeros9);// Compilation failed because: error X3017: cannot implicitly convert from 'const float3x3' to 'float4'

+  float4 var48 = float3x4(zeros12);// Compilation failed because: error X3017: cannot implicitly convert from 'const float3x4' to 'float4'

+  float4 var49 = float4x2(zeros8);// Compilation failed because: error X3017: cannot implicitly convert from 'const float4x2' to 'float4'

+  float4 var50 = float4x3(zeros12);// Compilation failed because: error X3017: cannot implicitly convert from 'const float4x3' to 'float4'

+  float4 var51 = float4x4(zeros16);// Compilation failed because: error X3017: cannot implicitly convert from 'const float4x4' to 'float4'

+  float2x2 var53 = float2(zeros2);// Compilation failed because: error X3017: cannot implicitly convert from 'const float2' to 'float2x2'

+  float2x2 var54 = float3(zeros3);// Compilation failed because: error X3017: cannot implicitly convert from 'const float3' to 'float2x2'

+  float2x3 var66 = float2(zeros2);// Compilation failed because: error X3017: cannot implicitly convert from 'const float2' to 'float2x3'

+  float2x3 var67 = float3(zeros3);// Compilation failed because: error X3017: cannot implicitly convert from 'const float3' to 'float2x3'

+  float2x3 var68 = float4(zeros4);// Compilation failed because: error X3017: cannot implicitly convert from 'const float4' to 'float2x3'

+  float2x3 var69 = float2x2(zeros4);// Compilation failed because: error X3017: cannot implicitly convert from 'const float2x2' to 'float2x3'

+  float2x3 var72 = float3x2(zeros6);// Compilation failed because: error X3017: cannot implicitly convert from 'const float3x2' to 'float2x3'

+  float2x3 var75 = float4x2(zeros8);// Compilation failed because: error X3017: cannot implicitly convert from 'const float4x2' to 'float2x3'

+  float2x4 var79 = float2(zeros2);// Compilation failed because: error X3017: cannot implicitly convert from 'const float2' to 'float2x4'

+  float2x4 var80 = float3(zeros3);// Compilation failed because: error X3017: cannot implicitly convert from 'const float3' to 'float2x4'

+  float2x4 var81 = float4(zeros4);// Compilation failed because: error X3017: cannot implicitly convert from 'const float4' to 'float2x4'

+  float2x4 var82 = float2x2(zeros4);// Compilation failed because: error X3017: cannot implicitly convert from 'const float2x2' to 'float2x4'

+  float2x4 var83 = float2x3(zeros6);// Compilation failed because: error X3017: cannot implicitly convert from 'const float2x3' to 'float2x4'

+  float2x4 var85 = float3x2(zeros6);// Compilation failed because: error X3017: cannot implicitly convert from 'const float3x2' to 'float2x4'

+  float2x4 var86 = float3x3(zeros9);// Compilation failed because: error X3017: cannot implicitly convert from 'const float3x3' to 'float2x4'

+  float2x4 var88 = float4x2(zeros8);// Compilation failed because: error X3017: cannot implicitly convert from 'const float4x2' to 'float2x4'

+  float2x4 var89 = float4x3(zeros12);// Compilation failed because: error X3017: cannot implicitly convert from 'const float4x3' to 'float2x4'

+  float3x2 var92 = float2(zeros2);// Compilation failed because: error X3017: cannot implicitly convert from 'const float2' to 'float3x2'

+  float3x2 var93 = float3(zeros3);// Compilation failed because: error X3017: cannot implicitly convert from 'const float3' to 'float3x2'

+  float3x2 var94 = float4(zeros4);// Compilation failed because: error X3017: cannot implicitly convert from 'const float4' to 'float3x2'

+  float3x2 var95 = float2x2(zeros4);// Compilation failed because: error X3017: cannot implicitly convert from 'const float2x2' to 'float3x2'

+  float3x2 var96 = float2x3(zeros6);// Compilation failed because: error X3017: cannot implicitly convert from 'const float2x3' to 'float3x2'

+  float3x2 var97 = float2x4(zeros8);// Compilation failed because: error X3017: cannot implicitly convert from 'const float2x4' to 'float3x2'

+  float3x3 var105 = float2(zeros2);// Compilation failed because: error X3017: cannot implicitly convert from 'const float2' to 'float3x3'

+  float3x3 var106 = float3(zeros3);// Compilation failed because: error X3017: cannot implicitly convert from 'const float3' to 'float3x3'

+  float3x3 var107 = float4(zeros4);// Compilation failed because: error X3017: cannot implicitly convert from 'const float4' to 'float3x3'

+  float3x3 var108 = float2x2(zeros4);// Compilation failed because: error X3017: cannot implicitly convert from 'const float2x2' to 'float3x3'

+  float3x3 var109 = float2x3(zeros6);// Compilation failed because: error X3017: cannot implicitly convert from 'const float2x3' to 'float3x3'

+  float3x3 var110 = float2x4(zeros8);// Compilation failed because: error X3017: cannot implicitly convert from 'const float2x4' to 'float3x3'

+  float3x3 var111 = float3x2(zeros6);// Compilation failed because: error X3017: cannot implicitly convert from 'const float3x2' to 'float3x3'

+  float3x3 var114 = float4x2(zeros8);// Compilation failed because: error X3017: cannot implicitly convert from 'const float4x2' to 'float3x3'

+  float3x4 var118 = float2(zeros2);// Compilation failed because: error X3017: cannot implicitly convert from 'const float2' to 'float3x4'

+  float3x4 var119 = float3(zeros3);// Compilation failed because: error X3017: cannot implicitly convert from 'const float3' to 'float3x4'

+  float3x4 var120 = float4(zeros4);// Compilation failed because: error X3017: cannot implicitly convert from 'const float4' to 'float3x4'

+  float3x4 var121 = float2x2(zeros4);// Compilation failed because: error X3017: cannot implicitly convert from 'const float2x2' to 'float3x4'

+  float3x4 var122 = float2x3(zeros6);// Compilation failed because: error X3017: cannot implicitly convert from 'const float2x3' to 'float3x4'

+  float3x4 var123 = float2x4(zeros8);// Compilation failed because: error X3017: cannot implicitly convert from 'const float2x4' to 'float3x4'

+  float3x4 var124 = float3x2(zeros6);// Compilation failed because: error X3017: cannot implicitly convert from 'const float3x2' to 'float3x4'

+  float3x4 var125 = float3x3(zeros9);// Compilation failed because: error X3017: cannot implicitly convert from 'const float3x3' to 'float3x4'

+  float3x4 var127 = float4x2(zeros8);// Compilation failed because: error X3017: cannot implicitly convert from 'const float4x2' to 'float3x4'

+  float3x4 var128 = float4x3(zeros12);// Compilation failed because: error X3017: cannot implicitly convert from 'const float4x3' to 'float3x4'

+  float4x2 var131 = float2(zeros2);// Compilation failed because: error X3017: cannot implicitly convert from 'const float2' to 'float4x2'

+  float4x2 var132 = float3(zeros3);// Compilation failed because: error X3017: cannot implicitly convert from 'const float3' to 'float4x2'

+  float4x2 var133 = float4(zeros4);// Compilation failed because: error X3017: cannot implicitly convert from 'const float4' to 'float4x2'

+  float4x2 var134 = float2x2(zeros4);// Compilation failed because: error X3017: cannot implicitly convert from 'const float2x2' to 'float4x2'

+  float4x2 var135 = float2x3(zeros6);// Compilation failed because: error X3017: cannot implicitly convert from 'const float2x3' to 'float4x2'

+  float4x2 var136 = float2x4(zeros8);// Compilation failed because: error X3017: cannot implicitly convert from 'const float2x4' to 'float4x2'

+  float4x2 var137 = float3x2(zeros6);// Compilation failed because: error X3017: cannot implicitly convert from 'const float3x2' to 'float4x2'

+  float4x2 var138 = float3x3(zeros9);// Compilation failed because: error X3017: cannot implicitly convert from 'const float3x3' to 'float4x2'

+  float4x2 var139 = float3x4(zeros12);// Compilation failed because: error X3017: cannot implicitly convert from 'const float3x4' to 'float4x2'

+  float4x3 var144 = float2(zeros2);// Compilation failed because: error X3017: cannot implicitly convert from 'const float2' to 'float4x3'

+  float4x3 var145 = float3(zeros3);// Compilation failed because: error X3017: cannot implicitly convert from 'const float3' to 'float4x3'

+  float4x3 var146 = float4(zeros4);// Compilation failed because: error X3017: cannot implicitly convert from 'const float4' to 'float4x3'

+  float4x3 var147 = float2x2(zeros4);// Compilation failed because: error X3017: cannot implicitly convert from 'const float2x2' to 'float4x3'

+  float4x3 var148 = float2x3(zeros6);// Compilation failed because: error X3017: cannot implicitly convert from 'const float2x3' to 'float4x3'

+  float4x3 var149 = float2x4(zeros8);// Compilation failed because: error X3017: cannot implicitly convert from 'const float2x4' to 'float4x3'

+  float4x3 var150 = float3x2(zeros6);// Compilation failed because: error X3017: cannot implicitly convert from 'const float3x2' to 'float4x3'

+  float4x3 var151 = float3x3(zeros9);// Compilation failed because: error X3017: cannot implicitly convert from 'const float3x3' to 'float4x3'

+  float4x3 var152 = float3x4(zeros12);// Compilation failed because: error X3017: cannot implicitly convert from 'const float3x4' to 'float4x3'

+  float4x3 var153 = float4x2(zeros8);// Compilation failed because: error X3017: cannot implicitly convert from 'const float4x2' to 'float4x3'

+  float4x4 var157 = float2(zeros2);// Compilation failed because: error X3017: cannot implicitly convert from 'const float2' to 'float4x4'

+  float4x4 var158 = float3(zeros3);// Compilation failed because: error X3017: cannot implicitly convert from 'const float3' to 'float4x4'

+  float4x4 var159 = float4(zeros4);// Compilation failed because: error X3017: cannot implicitly convert from 'const float4' to 'float4x4'

+  float4x4 var160 = float2x2(zeros4);// Compilation failed because: error X3017: cannot implicitly convert from 'const float2x2' to 'float4x4'

+  float4x4 var161 = float2x3(zeros6);// Compilation failed because: error X3017: cannot implicitly convert from 'const float2x3' to 'float4x4'

+  float4x4 var162 = float2x4(zeros8);// Compilation failed because: error X3017: cannot implicitly convert from 'const float2x4' to 'float4x4'

+  float4x4 var163 = float3x2(zeros6);// Compilation failed because: error X3017: cannot implicitly convert from 'const float3x2' to 'float4x4'

+  float4x4 var164 = float3x3(zeros9);// Compilation failed because: error X3017: cannot implicitly convert from 'const float3x3' to 'float4x4'

+  float4x4 var165 = float3x4(zeros12);// Compilation failed because: error X3017: cannot implicitly convert from 'const float3x4' to 'float4x4'

+  float4x4 var166 = float4x2(zeros8);// Compilation failed because: error X3017: cannot implicitly convert from 'const float4x2' to 'float4x4'

+  float4x4 var167 = float4x3(zeros12);// Compilation failed because: error X3017: cannot implicitly convert from 'const float4x3' to 'float4x4'

+  return 0;

+}

+

diff --git a/Test/hlsl.type.type.conversion.valid.frag b/Test/hlsl.type.type.conversion.valid.frag
new file mode 100644
index 0000000..114edbc
--- /dev/null
+++ b/Test/hlsl.type.type.conversion.valid.frag
@@ -0,0 +1,90 @@
+#define zeros 0

+#define zeros1 0

+#define zeros2 0, 0

+#define zeros3 0, 0, 0

+#define zeros4 0, 0, 0, 0

+#define zeros5 0, 0, 0, 0, 0

+#define zeros6 0, 0, 0, 0, 0, 0

+#define zeros7 0, 0, 0, 0, 0, 0, 0

+#define zeros8 0, 0, 0, 0, 0, 0, 0, 0

+#define zeros9 0, 0, 0, 0, 0, 0, 0, 0, 0

+#define zeros10 0, 0, 0, 0, 0, 0, 0, 0, 0, 0

+#define zeros11 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0

+#define zeros12 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0

+#define zeros13 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0

+#define zeros14 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0

+#define zeros15 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0

+#define zeros16 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0

+float4 main() : SV_Target {

+  float var0 = float(zeros1);

+  float2 var13 = float(zeros1);

+  float2 var14 = float2(zeros2);

+  float3 var26 = float(zeros1);

+  float3 var28 = float3(zeros3);

+  float4 var39 = float(zeros1);

+  float4 var42 = float4(zeros4);

+  float4 var43 = float2x2(zeros4);

+  float2x2 var52 = float(zeros1);

+  float2x2 var55 = float4(zeros4);

+  float2x2 var56 = float2x2(zeros4);

+  float2x3 var65 = float(zeros1);

+  float2x3 var70 = float2x3(zeros6);

+  float2x4 var78 = float(zeros1);

+  float2x4 var84 = float2x4(zeros8);

+  float3x2 var91 = float(zeros1);

+  float3x2 var98 = float3x2(zeros6);

+  float3x3 var104 = float(zeros1);

+  float3x3 var112 = float3x3(zeros9);

+  float3x4 var117 = float(zeros1);

+  float3x4 var126 = float3x4(zeros12);

+  float4x2 var130 = float(zeros1);

+  float4x2 var140 = float4x2(zeros8);

+  float4x3 var143 = float(zeros1);

+  float4x3 var154 = float4x3(zeros12);

+  float4x4 var156 = float(zeros1);

+  float4x4 var168 = float4x4(zeros16);

+  float var1 = float2(zeros2);// warning X3206: implicit truncation of vector type

+  float var2 = float3(zeros3);// warning X3206: implicit truncation of vector type

+  float var3 = float4(zeros4);// warning X3206: implicit truncation of vector type

+  float var4 = float2x2(zeros4);// warning X3206: implicit truncation of vector type

+  float var5 = float2x3(zeros6);// warning X3206: implicit truncation of vector type

+  float var6 = float2x4(zeros8);// warning X3206: implicit truncation of vector type

+  float var7 = float3x2(zeros6);// warning X3206: implicit truncation of vector type

+  float var8 = float3x3(zeros9);// warning X3206: implicit truncation of vector type

+  float var9 = float3x4(zeros12);// warning X3206: implicit truncation of vector type

+  float var10 = float4x2(zeros8);// warning X3206: implicit truncation of vector type

+  float var11 = float4x3(zeros12);// warning X3206: implicit truncation of vector type

+  float var12 = float4x4(zeros16);// warning X3206: implicit truncation of vector type

+  float2 var15 = float3(zeros3);// warning X3206: implicit truncation of vector type

+  float2 var16 = float4(zeros4);// warning X3206: implicit truncation of vector type

+  float3 var29 = float4(zeros4);// warning X3206: implicit truncation of vector type

+  float2x2 var57 = float2x3(zeros6);// warning X3206: implicit truncation of vector type

+  float2x2 var58 = float2x4(zeros8);// warning X3206: implicit truncation of vector type

+  float2x2 var59 = float3x2(zeros6);// warning X3206: implicit truncation of vector type

+  float2x2 var60 = float3x3(zeros9);// warning X3206: implicit truncation of vector type

+  float2x2 var61 = float3x4(zeros12);// warning X3206: implicit truncation of vector type

+  float2x2 var62 = float4x2(zeros8);// warning X3206: implicit truncation of vector type

+  float2x2 var63 = float4x3(zeros12);// warning X3206: implicit truncation of vector type

+  float2x2 var64 = float4x4(zeros16);// warning X3206: implicit truncation of vector type

+  float2x3 var71 = float2x4(zeros8);// warning X3206: implicit truncation of vector type

+  float2x3 var73 = float3x3(zeros9);// warning X3206: implicit truncation of vector type

+  float2x3 var74 = float3x4(zeros12);// warning X3206: implicit truncation of vector type

+  float2x3 var76 = float4x3(zeros12);// warning X3206: implicit truncation of vector type

+  float2x3 var77 = float4x4(zeros16);// warning X3206: implicit truncation of vector type

+  float2x4 var87 = float3x4(zeros12);// warning X3206: implicit truncation of vector type

+  float2x4 var90 = float4x4(zeros16);// warning X3206: implicit truncation of vector type

+  float3x2 var99 = float3x3(zeros9);// warning X3206: implicit truncation of vector type

+  float3x2 var100 = float3x4(zeros12);// warning X3206: implicit truncation of vector type

+  float3x2 var101 = float4x2(zeros8);// warning X3206: implicit truncation of vector type

+  float3x2 var102 = float4x3(zeros12);// warning X3206: implicit truncation of vector type

+  float3x2 var103 = float4x4(zeros16);// warning X3206: implicit truncation of vector type

+  float3x3 var113 = float3x4(zeros12);// warning X3206: implicit truncation of vector type

+  float3x3 var115 = float4x3(zeros12);// warning X3206: implicit truncation of vector type

+  float3x3 var116 = float4x4(zeros16);// warning X3206: implicit truncation of vector type

+  float3x4 var129 = float4x4(zeros16);// warning X3206: implicit truncation of vector type

+  float4x2 var141 = float4x3(zeros12);// warning X3206: implicit truncation of vector type

+  float4x2 var142 = float4x4(zeros16);// warning X3206: implicit truncation of vector type

+  float4x3 var155 = float4x4(zeros16);// warning X3206: implicit truncation of vector type

+  return 0;

+}

+

diff --git a/Test/hlsl.wavebroadcast.comp b/Test/hlsl.wavebroadcast.comp
new file mode 100644
index 0000000..4498305
--- /dev/null
+++ b/Test/hlsl.wavebroadcast.comp
@@ -0,0 +1,53 @@
+struct Types

+{

+	uint4 u;

+	int4 i;

+	float4 f;

+	double4 d;

+};

+

+RWStructuredBuffer<Types> data;

+

+[numthreads(32, 16, 1)]

+void CSMain(uint3 dti : SV_DispatchThreadID)

+{

+	data[dti.x].u = WaveReadLaneAt(data[dti.x].u, 13);

+	data[dti.x].u.x = WaveReadLaneAt(data[dti.x].u.x, 13);

+	data[dti.x].u.xy = WaveReadLaneAt(data[dti.x].u.xy, 13);

+	data[dti.x].u.xyz = WaveReadLaneAt(data[dti.x].u.xyz, 13);

+

+	data[dti.x].i = WaveReadLaneAt(data[dti.x].i, 13);

+	data[dti.x].i.x = WaveReadLaneAt(data[dti.x].i.x, 13);

+	data[dti.x].i.xy = WaveReadLaneAt(data[dti.x].i.xy, 13);

+	data[dti.x].i.xyz = WaveReadLaneAt(data[dti.x].i.xyz, 13);

+

+	data[dti.x].f = WaveReadLaneAt(data[dti.x].f, 13);

+	data[dti.x].f.x = WaveReadLaneAt(data[dti.x].f.x, 13);

+	data[dti.x].f.xy = WaveReadLaneAt(data[dti.x].f.xy, 13);

+	data[dti.x].f.xyz = WaveReadLaneAt(data[dti.x].f.xyz, 13);

+

+	data[dti.x].d = WaveReadLaneFirst(data[dti.x].d);

+	data[dti.x].d.x = WaveReadLaneFirst(data[dti.x].d.x);

+	data[dti.x].d.xy = WaveReadLaneFirst(data[dti.x].d.xy);

+	data[dti.x].d.xyz = WaveReadLaneFirst(data[dti.x].d.xyz);

+

+	data[dti.x].u = WaveReadLaneFirst(data[dti.x].u);

+	data[dti.x].u.x = WaveReadLaneFirst(data[dti.x].u.x);

+	data[dti.x].u.xy = WaveReadLaneFirst(data[dti.x].u.xy);

+	data[dti.x].u.xyz = WaveReadLaneFirst(data[dti.x].u.xyz);

+

+	data[dti.x].i = WaveReadLaneFirst(data[dti.x].i);

+	data[dti.x].i.x = WaveReadLaneFirst(data[dti.x].i.x);

+	data[dti.x].i.xy = WaveReadLaneFirst(data[dti.x].i.xy);

+	data[dti.x].i.xyz = WaveReadLaneFirst(data[dti.x].i.xyz);

+

+	data[dti.x].f = WaveReadLaneFirst(data[dti.x].f);

+	data[dti.x].f.x = WaveReadLaneFirst(data[dti.x].f.x);

+	data[dti.x].f.xy = WaveReadLaneFirst(data[dti.x].f.xy);

+	data[dti.x].f.xyz = WaveReadLaneFirst(data[dti.x].f.xyz);

+

+	data[dti.x].d = WaveReadLaneFirst(data[dti.x].d);

+	data[dti.x].d.x = WaveReadLaneFirst(data[dti.x].d.x);

+	data[dti.x].d.xy = WaveReadLaneFirst(data[dti.x].d.xy);

+	data[dti.x].d.xyz = WaveReadLaneFirst(data[dti.x].d.xyz);

+}

diff --git a/Test/hlsl.waveprefix.comp b/Test/hlsl.waveprefix.comp
new file mode 100644
index 0000000..e4b4367
--- /dev/null
+++ b/Test/hlsl.waveprefix.comp
@@ -0,0 +1,55 @@
+struct Types

+{

+	uint4 u;

+	int4 i;

+	float4 f;

+	double4 d;

+};

+

+RWStructuredBuffer<Types> data;

+

+[numthreads(32, 16, 1)]

+void CSMain(uint3 dti : SV_DispatchThreadID)

+{

+	data[dti.x].u = WavePrefixSum(data[dti.x].u);

+	data[dti.x].u.x = WavePrefixSum(data[dti.x].u.x);

+	data[dti.x].u.xy = WavePrefixSum(data[dti.x].u.xy);

+	data[dti.x].u.xyz = WavePrefixSum(data[dti.x].u.xyz);

+

+	data[dti.x].i = WavePrefixSum(data[dti.x].i);

+	data[dti.x].i.x = WavePrefixSum(data[dti.x].i.x);

+	data[dti.x].i.xy = WavePrefixSum(data[dti.x].i.xy);

+	data[dti.x].i.xyz = WavePrefixSum(data[dti.x].i.xyz);

+

+	data[dti.x].f = WavePrefixSum(data[dti.x].f);

+	data[dti.x].f.x = WavePrefixSum(data[dti.x].f.x);

+	data[dti.x].f.xy = WavePrefixSum(data[dti.x].f.xy);

+	data[dti.x].f.xyz = WavePrefixSum(data[dti.x].f.xyz);

+

+	data[dti.x].d = WavePrefixSum(data[dti.x].d);

+	data[dti.x].d.x = WavePrefixSum(data[dti.x].d.x);

+	data[dti.x].d.xy = WavePrefixSum(data[dti.x].d.xy);

+	data[dti.x].d.xyz = WavePrefixSum(data[dti.x].d.xyz);

+

+	data[dti.x].u = WavePrefixProduct(data[dti.x].u);

+	data[dti.x].u.x = WavePrefixProduct(data[dti.x].u.x);

+	data[dti.x].u.xy = WavePrefixProduct(data[dti.x].u.xy);

+	data[dti.x].u.xyz = WavePrefixProduct(data[dti.x].u.xyz);

+

+	data[dti.x].i = WavePrefixProduct(data[dti.x].i);

+	data[dti.x].i.x = WavePrefixProduct(data[dti.x].i.x);

+	data[dti.x].i.xy = WavePrefixProduct(data[dti.x].i.xy);

+	data[dti.x].i.xyz = WavePrefixProduct(data[dti.x].i.xyz);

+

+	data[dti.x].f = WavePrefixProduct(data[dti.x].f);

+	data[dti.x].f.x = WavePrefixProduct(data[dti.x].f.x);

+	data[dti.x].f.xy = WavePrefixProduct(data[dti.x].f.xy);

+	data[dti.x].f.xyz = WavePrefixProduct(data[dti.x].f.xyz);

+

+	data[dti.x].d = WavePrefixProduct(data[dti.x].d);

+	data[dti.x].d.x = WavePrefixProduct(data[dti.x].d.x);

+	data[dti.x].d.xy = WavePrefixProduct(data[dti.x].d.xy);

+	data[dti.x].d.xyz = WavePrefixProduct(data[dti.x].d.xyz);

+

+	data[dti.x].u.x = WavePrefixCountBits(data[dti.x].u.x == 0);

+}

diff --git a/Test/hlsl.wavequad.comp b/Test/hlsl.wavequad.comp
new file mode 100644
index 0000000..34e8b78
--- /dev/null
+++ b/Test/hlsl.wavequad.comp
@@ -0,0 +1,153 @@
+struct Types

+{

+	uint4 u;

+	int4 i;

+	float4 f;

+	double4 d;

+};

+

+RWStructuredBuffer<Types> data;

+

+[numthreads(32, 16, 1)]

+void CSMain(uint3 dti : SV_DispatchThreadID)

+{

+	data[dti.x].u = QuadReadLaneAt(data[dti.x].u, 0);

+	data[dti.x].u.x = QuadReadLaneAt(data[dti.x].u.x, 0);

+	data[dti.x].u.xy = QuadReadLaneAt(data[dti.x].u.xy, 0);

+	data[dti.x].u.xyz = QuadReadLaneAt(data[dti.x].u.xyz, 0);

+

+	data[dti.x].i = QuadReadLaneAt(data[dti.x].i, 0);

+	data[dti.x].i.x = QuadReadLaneAt(data[dti.x].i.x, 0);

+	data[dti.x].i.xy = QuadReadLaneAt(data[dti.x].i.xy, 0);

+	data[dti.x].i.xyz = QuadReadLaneAt(data[dti.x].i.xyz, 0);

+

+	data[dti.x].f = QuadReadLaneAt(data[dti.x].f, 0);

+	data[dti.x].f.x = QuadReadLaneAt(data[dti.x].f.x, 0);

+	data[dti.x].f.xy = QuadReadLaneAt(data[dti.x].f.xy, 0);

+	data[dti.x].f.xyz = QuadReadLaneAt(data[dti.x].f.xyz, 0);

+

+	data[dti.x].d = QuadReadLaneAt(data[dti.x].d, 0);

+	data[dti.x].d.x = QuadReadLaneAt(data[dti.x].d.x, 0);

+	data[dti.x].d.xy = QuadReadLaneAt(data[dti.x].d.xy, 0);

+	data[dti.x].d.xyz = QuadReadLaneAt(data[dti.x].d.xyz, 0);

+

+	data[dti.x].u = QuadReadLaneAt(data[dti.x].u, 1);

+	data[dti.x].u.x = QuadReadLaneAt(data[dti.x].u.x, 1);

+	data[dti.x].u.xy = QuadReadLaneAt(data[dti.x].u.xy, 1);

+	data[dti.x].u.xyz = QuadReadLaneAt(data[dti.x].u.xyz, 1);

+

+	data[dti.x].i = QuadReadLaneAt(data[dti.x].i, 1);

+	data[dti.x].i.x = QuadReadLaneAt(data[dti.x].i.x, 1);

+	data[dti.x].i.xy = QuadReadLaneAt(data[dti.x].i.xy, 1);

+	data[dti.x].i.xyz = QuadReadLaneAt(data[dti.x].i.xyz, 1);

+

+	data[dti.x].f = QuadReadLaneAt(data[dti.x].f, 1);

+	data[dti.x].f.x = QuadReadLaneAt(data[dti.x].f.x, 1);

+	data[dti.x].f.xy = QuadReadLaneAt(data[dti.x].f.xy, 1);

+	data[dti.x].f.xyz = QuadReadLaneAt(data[dti.x].f.xyz, 1);

+

+	data[dti.x].d = QuadReadLaneAt(data[dti.x].d, 1);

+	data[dti.x].d.x = QuadReadLaneAt(data[dti.x].d.x, 1);

+	data[dti.x].d.xy = QuadReadLaneAt(data[dti.x].d.xy, 1);

+	data[dti.x].d.xyz = QuadReadLaneAt(data[dti.x].d.xyz, 1);

+

+	data[dti.x].u = QuadReadLaneAt(data[dti.x].u, 2);

+	data[dti.x].u.x = QuadReadLaneAt(data[dti.x].u.x, 2);

+	data[dti.x].u.xy = QuadReadLaneAt(data[dti.x].u.xy, 2);

+	data[dti.x].u.xyz = QuadReadLaneAt(data[dti.x].u.xyz, 2);

+

+	data[dti.x].i = QuadReadLaneAt(data[dti.x].i, 2);

+	data[dti.x].i.x = QuadReadLaneAt(data[dti.x].i.x, 2);

+	data[dti.x].i.xy = QuadReadLaneAt(data[dti.x].i.xy, 2);

+	data[dti.x].i.xyz = QuadReadLaneAt(data[dti.x].i.xyz, 2);

+

+	data[dti.x].f = QuadReadLaneAt(data[dti.x].f, 2);

+	data[dti.x].f.x = QuadReadLaneAt(data[dti.x].f.x, 2);

+	data[dti.x].f.xy = QuadReadLaneAt(data[dti.x].f.xy, 2);

+	data[dti.x].f.xyz = QuadReadLaneAt(data[dti.x].f.xyz, 2);

+

+	data[dti.x].d = QuadReadLaneAt(data[dti.x].d, 2);

+	data[dti.x].d.x = QuadReadLaneAt(data[dti.x].d.x, 2);

+	data[dti.x].d.xy = QuadReadLaneAt(data[dti.x].d.xy, 2);

+	data[dti.x].d.xyz = QuadReadLaneAt(data[dti.x].d.xyz, 2);

+

+	data[dti.x].u = QuadReadLaneAt(data[dti.x].u, 3);

+	data[dti.x].u.x = QuadReadLaneAt(data[dti.x].u.x, 3);

+	data[dti.x].u.xy = QuadReadLaneAt(data[dti.x].u.xy, 3);

+	data[dti.x].u.xyz = QuadReadLaneAt(data[dti.x].u.xyz, 3);

+

+	data[dti.x].i = QuadReadLaneAt(data[dti.x].i, 3);

+	data[dti.x].i.x = QuadReadLaneAt(data[dti.x].i.x, 3);

+	data[dti.x].i.xy = QuadReadLaneAt(data[dti.x].i.xy, 3);

+	data[dti.x].i.xyz = QuadReadLaneAt(data[dti.x].i.xyz, 3);

+

+	data[dti.x].f = QuadReadLaneAt(data[dti.x].f, 3);

+	data[dti.x].f.x = QuadReadLaneAt(data[dti.x].f.x, 3);

+	data[dti.x].f.xy = QuadReadLaneAt(data[dti.x].f.xy, 3);

+	data[dti.x].f.xyz = QuadReadLaneAt(data[dti.x].f.xyz, 3);

+

+	data[dti.x].d = QuadReadLaneAt(data[dti.x].d, 3);

+	data[dti.x].d.x = QuadReadLaneAt(data[dti.x].d.x, 3);

+	data[dti.x].d.xy = QuadReadLaneAt(data[dti.x].d.xy, 3);

+	data[dti.x].d.xyz = QuadReadLaneAt(data[dti.x].d.xyz, 3);

+

+	data[dti.x].u = QuadReadAcrossX(data[dti.x].u);

+	data[dti.x].u.x = QuadReadAcrossX(data[dti.x].u.x);

+	data[dti.x].u.xy = QuadReadAcrossX(data[dti.x].u.xy);

+	data[dti.x].u.xyz = QuadReadAcrossX(data[dti.x].u.xyz);

+

+	data[dti.x].i = QuadReadAcrossX(data[dti.x].i);

+	data[dti.x].i.x = QuadReadAcrossX(data[dti.x].i.x);

+	data[dti.x].i.xy = QuadReadAcrossX(data[dti.x].i.xy);

+	data[dti.x].i.xyz = QuadReadAcrossX(data[dti.x].i.xyz);

+

+	data[dti.x].f = QuadReadAcrossX(data[dti.x].f);

+	data[dti.x].f.x = QuadReadAcrossX(data[dti.x].f.x);

+	data[dti.x].f.xy = QuadReadAcrossX(data[dti.x].f.xy);

+	data[dti.x].f.xyz = QuadReadAcrossX(data[dti.x].f.xyz);

+

+	data[dti.x].d = QuadReadAcrossX(data[dti.x].d);

+	data[dti.x].d.x = QuadReadAcrossX(data[dti.x].d.x);

+	data[dti.x].d.xy = QuadReadAcrossX(data[dti.x].d.xy);

+	data[dti.x].d.xyz = QuadReadAcrossX(data[dti.x].d.xyz);

+

+	data[dti.x].u = QuadReadAcrossY(data[dti.x].u);

+	data[dti.x].u.x = QuadReadAcrossY(data[dti.x].u.x);

+	data[dti.x].u.xy = QuadReadAcrossY(data[dti.x].u.xy);

+	data[dti.x].u.xyz = QuadReadAcrossY(data[dti.x].u.xyz);

+

+	data[dti.x].i = QuadReadAcrossY(data[dti.x].i);

+	data[dti.x].i.x = QuadReadAcrossY(data[dti.x].i.x);

+	data[dti.x].i.xy = QuadReadAcrossY(data[dti.x].i.xy);

+	data[dti.x].i.xyz = QuadReadAcrossY(data[dti.x].i.xyz);

+

+	data[dti.x].f = QuadReadAcrossY(data[dti.x].f);

+	data[dti.x].f.x = QuadReadAcrossY(data[dti.x].f.x);

+	data[dti.x].f.xy = QuadReadAcrossY(data[dti.x].f.xy);

+	data[dti.x].f.xyz = QuadReadAcrossY(data[dti.x].f.xyz);

+

+	data[dti.x].d = QuadReadAcrossY(data[dti.x].d);

+	data[dti.x].d.x = QuadReadAcrossY(data[dti.x].d.x);

+	data[dti.x].d.xy = QuadReadAcrossY(data[dti.x].d.xy);

+	data[dti.x].d.xyz = QuadReadAcrossY(data[dti.x].d.xyz);

+

+	data[dti.x].u = QuadReadAcrossDiagonal(data[dti.x].u);

+	data[dti.x].u.x = QuadReadAcrossDiagonal(data[dti.x].u.x);

+	data[dti.x].u.xy = QuadReadAcrossDiagonal(data[dti.x].u.xy);

+	data[dti.x].u.xyz = QuadReadAcrossDiagonal(data[dti.x].u.xyz);

+

+	data[dti.x].i = QuadReadAcrossDiagonal(data[dti.x].i);

+	data[dti.x].i.x = QuadReadAcrossDiagonal(data[dti.x].i.x);

+	data[dti.x].i.xy = QuadReadAcrossDiagonal(data[dti.x].i.xy);

+	data[dti.x].i.xyz = QuadReadAcrossDiagonal(data[dti.x].i.xyz);

+

+	data[dti.x].f = QuadReadAcrossDiagonal(data[dti.x].f);

+	data[dti.x].f.x = QuadReadAcrossDiagonal(data[dti.x].f.x);

+	data[dti.x].f.xy = QuadReadAcrossDiagonal(data[dti.x].f.xy);

+	data[dti.x].f.xyz = QuadReadAcrossDiagonal(data[dti.x].f.xyz);

+

+	data[dti.x].d = QuadReadAcrossDiagonal(data[dti.x].d);

+	data[dti.x].d.x = QuadReadAcrossDiagonal(data[dti.x].d.x);

+	data[dti.x].d.xy = QuadReadAcrossDiagonal(data[dti.x].d.xy);

+	data[dti.x].d.xyz = QuadReadAcrossDiagonal(data[dti.x].d.xyz);

+}

diff --git a/Test/hlsl.wavequery.comp b/Test/hlsl.wavequery.comp
new file mode 100644
index 0000000..a689e11
--- /dev/null
+++ b/Test/hlsl.wavequery.comp
@@ -0,0 +1,7 @@
+RWStructuredBuffer<uint> data;

+

+[numthreads(32, 16, 1)]

+void CSMain()

+{

+    data[WaveGetLaneIndex()] = (WaveIsFirstLane()) ? WaveGetLaneCount() : 0;

+}

diff --git a/Test/hlsl.wavequery.frag b/Test/hlsl.wavequery.frag
new file mode 100644
index 0000000..d1437f0
--- /dev/null
+++ b/Test/hlsl.wavequery.frag
@@ -0,0 +1,11 @@
+float4 PixelShaderFunction() : COLOR0

+{

+    if (WaveIsFirstLane())

+    {

+        return float4(1, 2, 3, 4);

+    }

+    else

+    {

+        return float4(4, 3, 2, 1);

+    }

+}

diff --git a/Test/hlsl.wavereduction.comp b/Test/hlsl.wavereduction.comp
new file mode 100644
index 0000000..b7604ad
--- /dev/null
+++ b/Test/hlsl.wavereduction.comp
@@ -0,0 +1,125 @@
+struct Types

+{

+	uint4 u;

+	int4 i;

+	float4 f;

+	double4 d;

+};

+

+RWStructuredBuffer<Types> data;

+

+[numthreads(32, 16, 1)]

+void CSMain(uint3 dti : SV_DispatchThreadID)

+{

+	data[dti.x].u = WaveActiveSum(data[dti.x].u);

+	data[dti.x].u.x = WaveActiveSum(data[dti.x].u.x);

+	data[dti.x].u.xy = WaveActiveSum(data[dti.x].u.xy);

+	data[dti.x].u.xyz = WaveActiveSum(data[dti.x].u.xyz);

+

+	data[dti.x].i = WaveActiveSum(data[dti.x].i);

+	data[dti.x].i.x = WaveActiveSum(data[dti.x].i.x);

+	data[dti.x].i.xy = WaveActiveSum(data[dti.x].i.xy);

+	data[dti.x].i.xyz = WaveActiveSum(data[dti.x].i.xyz);

+

+	data[dti.x].f = WaveActiveSum(data[dti.x].f);

+	data[dti.x].f.x = WaveActiveSum(data[dti.x].f.x);

+	data[dti.x].f.xy = WaveActiveSum(data[dti.x].f.xy);

+	data[dti.x].f.xyz = WaveActiveSum(data[dti.x].f.xyz);

+

+	data[dti.x].d = WaveActiveSum(data[dti.x].d);

+	data[dti.x].d.x = WaveActiveSum(data[dti.x].d.x);

+	data[dti.x].d.xy = WaveActiveSum(data[dti.x].d.xy);

+	data[dti.x].d.xyz = WaveActiveSum(data[dti.x].d.xyz);

+

+	data[dti.x].u = WaveActiveProduct(data[dti.x].u);

+	data[dti.x].u.x = WaveActiveProduct(data[dti.x].u.x);

+	data[dti.x].u.xy = WaveActiveProduct(data[dti.x].u.xy);

+	data[dti.x].u.xyz = WaveActiveProduct(data[dti.x].u.xyz);

+

+	data[dti.x].i = WaveActiveProduct(data[dti.x].i);

+	data[dti.x].i.x = WaveActiveProduct(data[dti.x].i.x);

+	data[dti.x].i.xy = WaveActiveProduct(data[dti.x].i.xy);

+	data[dti.x].i.xyz = WaveActiveProduct(data[dti.x].i.xyz);

+

+	data[dti.x].f = WaveActiveProduct(data[dti.x].f);

+	data[dti.x].f.x = WaveActiveProduct(data[dti.x].f.x);

+	data[dti.x].f.xy = WaveActiveProduct(data[dti.x].f.xy);

+	data[dti.x].f.xyz = WaveActiveProduct(data[dti.x].f.xyz);

+

+	data[dti.x].d = WaveActiveProduct(data[dti.x].d);

+	data[dti.x].d.x = WaveActiveProduct(data[dti.x].d.x);

+	data[dti.x].d.xy = WaveActiveProduct(data[dti.x].d.xy);

+	data[dti.x].d.xyz = WaveActiveProduct(data[dti.x].d.xyz);

+

+	data[dti.x].u = WaveActiveMin(data[dti.x].u);

+	data[dti.x].u.x = WaveActiveMin(data[dti.x].u.x);

+	data[dti.x].u.xy = WaveActiveMin(data[dti.x].u.xy);

+	data[dti.x].u.xyz = WaveActiveMin(data[dti.x].u.xyz);

+

+	data[dti.x].i = WaveActiveMin(data[dti.x].i);

+	data[dti.x].i.x = WaveActiveMin(data[dti.x].i.x);

+	data[dti.x].i.xy = WaveActiveMin(data[dti.x].i.xy);

+	data[dti.x].i.xyz = WaveActiveMin(data[dti.x].i.xyz);

+

+	data[dti.x].f = WaveActiveMin(data[dti.x].f);

+	data[dti.x].f.x = WaveActiveMin(data[dti.x].f.x);

+	data[dti.x].f.xy = WaveActiveMin(data[dti.x].f.xy);

+	data[dti.x].f.xyz = WaveActiveMin(data[dti.x].f.xyz);

+

+	data[dti.x].d = WaveActiveMin(data[dti.x].d);

+	data[dti.x].d.x = WaveActiveMin(data[dti.x].d.x);

+	data[dti.x].d.xy = WaveActiveMin(data[dti.x].d.xy);

+	data[dti.x].d.xyz = WaveActiveMin(data[dti.x].d.xyz);

+

+	data[dti.x].u = WaveActiveMax(data[dti.x].u);

+	data[dti.x].u.x = WaveActiveMax(data[dti.x].u.x);

+	data[dti.x].u.xy = WaveActiveMax(data[dti.x].u.xy);

+	data[dti.x].u.xyz = WaveActiveMax(data[dti.x].u.xyz);

+

+	data[dti.x].i = WaveActiveMax(data[dti.x].i);

+	data[dti.x].i.x = WaveActiveMax(data[dti.x].i.x);

+	data[dti.x].i.xy = WaveActiveMax(data[dti.x].i.xy);

+	data[dti.x].i.xyz = WaveActiveMax(data[dti.x].i.xyz);

+

+	data[dti.x].f = WaveActiveMax(data[dti.x].f);

+	data[dti.x].f.x = WaveActiveMax(data[dti.x].f.x);

+	data[dti.x].f.xy = WaveActiveMax(data[dti.x].f.xy);

+	data[dti.x].f.xyz = WaveActiveMax(data[dti.x].f.xyz);

+

+	data[dti.x].d = WaveActiveMax(data[dti.x].d);

+	data[dti.x].d.x = WaveActiveMax(data[dti.x].d.x);

+	data[dti.x].d.xy = WaveActiveMax(data[dti.x].d.xy);

+	data[dti.x].d.xyz = WaveActiveMax(data[dti.x].d.xyz);

+

+	data[dti.x].u = WaveActiveBitAnd(data[dti.x].u);

+	data[dti.x].u.x = WaveActiveBitAnd(data[dti.x].u.x);

+	data[dti.x].u.xy = WaveActiveBitAnd(data[dti.x].u.xy);

+	data[dti.x].u.xyz = WaveActiveBitAnd(data[dti.x].u.xyz);

+

+	data[dti.x].i = WaveActiveBitAnd(data[dti.x].i);

+	data[dti.x].i.x = WaveActiveBitAnd(data[dti.x].i.x);

+	data[dti.x].i.xy = WaveActiveBitAnd(data[dti.x].i.xy);

+	data[dti.x].i.xyz = WaveActiveBitAnd(data[dti.x].i.xyz);

+

+	data[dti.x].u = WaveActiveBitOr(data[dti.x].u);

+	data[dti.x].u.x = WaveActiveBitOr(data[dti.x].u.x);

+	data[dti.x].u.xy = WaveActiveBitOr(data[dti.x].u.xy);

+	data[dti.x].u.xyz = WaveActiveBitOr(data[dti.x].u.xyz);

+

+	data[dti.x].i = WaveActiveBitOr(data[dti.x].i);

+	data[dti.x].i.x = WaveActiveBitOr(data[dti.x].i.x);

+	data[dti.x].i.xy = WaveActiveBitOr(data[dti.x].i.xy);

+	data[dti.x].i.xyz = WaveActiveBitOr(data[dti.x].i.xyz);

+

+	data[dti.x].u = WaveActiveBitXor(data[dti.x].u);

+	data[dti.x].u.x = WaveActiveBitXor(data[dti.x].u.x);

+	data[dti.x].u.xy = WaveActiveBitXor(data[dti.x].u.xy);

+	data[dti.x].u.xyz = WaveActiveBitXor(data[dti.x].u.xyz);

+

+	data[dti.x].i = WaveActiveBitXor(data[dti.x].i);

+	data[dti.x].i.x = WaveActiveBitXor(data[dti.x].i.x);

+	data[dti.x].i.xy = WaveActiveBitXor(data[dti.x].i.xy);

+	data[dti.x].i.xyz = WaveActiveBitXor(data[dti.x].i.xyz);

+

+	data[dti.x].u.x = WaveActiveCountBits(data[dti.x].u.x == 0);

+}

diff --git a/Test/hlsl.wavevote.comp b/Test/hlsl.wavevote.comp
new file mode 100644
index 0000000..0370e69
--- /dev/null
+++ b/Test/hlsl.wavevote.comp
@@ -0,0 +1,10 @@
+RWStructuredBuffer<uint64_t> data;

+

+[numthreads(32, 16, 1)]

+void CSMain(uint3 dti : SV_DispatchThreadID)

+{

+	data[dti.x] = WaveActiveBallot(WaveActiveAnyTrue(dti.x == 0));

+	data[dti.y] = WaveActiveBallot(WaveActiveAllTrue(dti.y == 0));

+	data[dti.z] = WaveActiveBallot(WaveActiveAllEqualBool(dti.z == 0));

+	data[dti.z] = WaveActiveBallot(WaveActiveAllEqual(dti.z));

+}

diff --git a/Test/hlsl.y-negate-1.vert b/Test/hlsl.y-negate-1.vert
new file mode 100644
index 0000000..ee62ec2
--- /dev/null
+++ b/Test/hlsl.y-negate-1.vert
@@ -0,0 +1,9 @@
+
+// Test Y negation from entry point return
+
+float4 pos;
+
+float4 main() : SV_Position
+{
+    return pos;
+}
diff --git a/Test/hlsl.y-negate-2.vert b/Test/hlsl.y-negate-2.vert
new file mode 100644
index 0000000..01fa6ce
--- /dev/null
+++ b/Test/hlsl.y-negate-2.vert
@@ -0,0 +1,8 @@
+// Test Y negation from entry point out parameter
+
+float4 pos;
+
+void main(out float4 position : SV_Position)
+{
+    position = pos;
+}
diff --git a/Test/hlsl.y-negate-3.vert b/Test/hlsl.y-negate-3.vert
new file mode 100644
index 0000000..a0c4a8d
--- /dev/null
+++ b/Test/hlsl.y-negate-3.vert
@@ -0,0 +1,18 @@
+// Test Y negation from entry point out parameter
+
+float4 position;
+
+struct VS_OUT {
+    float4 pos : SV_Position;
+    int somethingelse;
+};
+
+VS_OUT main()
+{
+    VS_OUT vsout;
+
+    vsout.pos = position;
+    vsout.somethingelse = 42;
+
+    return vsout;
+}
diff --git a/Test/implicitInnerAtomicUint.frag b/Test/implicitInnerAtomicUint.frag
new file mode 100644
index 0000000..bb76516
--- /dev/null
+++ b/Test/implicitInnerAtomicUint.frag
@@ -0,0 +1,2 @@
+#version 460
+layout(binding = 0) uniform atomic_uint c[1][];
\ No newline at end of file
diff --git a/Test/inc1/badInc.h b/Test/inc1/badInc.h
new file mode 100644
index 0000000..a771355
--- /dev/null
+++ b/Test/inc1/badInc.h
@@ -0,0 +1 @@
+#include "parentBad"
diff --git a/Test/inc1/bar.h b/Test/inc1/bar.h
new file mode 100644
index 0000000..1a650fb
--- /dev/null
+++ b/Test/inc1/bar.h
@@ -0,0 +1,3 @@
+float4 i2;
+
+#include "foo.h"
diff --git a/Test/inc1/foo.h b/Test/inc1/foo.h
new file mode 100644
index 0000000..1819034
--- /dev/null
+++ b/Test/inc1/foo.h
@@ -0,0 +1,3 @@
+#include "parent.h"
+
+float4 i3;
diff --git a/Test/inc1/path1/bar.h b/Test/inc1/path1/bar.h
new file mode 100644
index 0000000..46141dd
--- /dev/null
+++ b/Test/inc1/path1/bar.h
@@ -0,0 +1 @@
+float4 i9991;
diff --git a/Test/inc1/path1/local.h b/Test/inc1/path1/local.h
new file mode 100644
index 0000000..b3aac8e
--- /dev/null
+++ b/Test/inc1/path1/local.h
@@ -0,0 +1 @@
+float4 p2;
diff --git a/Test/inc1/path1/notHere.h b/Test/inc1/path1/notHere.h
new file mode 100644
index 0000000..2e7d56a
--- /dev/null
+++ b/Test/inc1/path1/notHere.h
@@ -0,0 +1,4 @@
+float4 p1;
+
+#include "local.h"
+#include "remote.h"
diff --git a/Test/inc1/path2/bar.h b/Test/inc1/path2/bar.h
new file mode 100644
index 0000000..46141dd
--- /dev/null
+++ b/Test/inc1/path2/bar.h
@@ -0,0 +1 @@
+float4 i9991;
diff --git a/Test/inc1/path2/notHere.h b/Test/inc1/path2/notHere.h
new file mode 100644
index 0000000..63f4ca4
--- /dev/null
+++ b/Test/inc1/path2/notHere.h
@@ -0,0 +1 @@
+float4 paoeu1;
diff --git a/Test/inc1/path2/remote.h b/Test/inc1/path2/remote.h
new file mode 100644
index 0000000..c925d27
--- /dev/null
+++ b/Test/inc1/path2/remote.h
@@ -0,0 +1 @@
+float4 p3;
diff --git a/Test/inc2/bar.h b/Test/inc2/bar.h
new file mode 100644
index 0000000..901c058
--- /dev/null
+++ b/Test/inc2/bar.h
@@ -0,0 +1,2 @@
+#include "foo.h"
+float4 i5;
diff --git a/Test/inc2/foo.h b/Test/inc2/foo.h
new file mode 100644
index 0000000..fd09e80
--- /dev/null
+++ b/Test/inc2/foo.h
@@ -0,0 +1 @@
+float4 i6;
\ No newline at end of file
diff --git a/Test/include.vert b/Test/include.vert
new file mode 100644
index 0000000..192a489
--- /dev/null
+++ b/Test/include.vert
@@ -0,0 +1,16 @@
+#version 450
+
+#extension GL_GOOGLE_include_directive : enable
+
+#define float4 vec4
+
+#include "bar.h"
+#include "./inc1/bar.h"
+#include "inc2\bar.h"
+
+out vec4 color;
+
+void main()
+{
+    color = i1 + i2 + i3 + i4 + i5 + i6;
+}
diff --git a/Test/invalidSwizzle.vert b/Test/invalidSwizzle.vert
new file mode 100644
index 0000000..799ff87
--- /dev/null
+++ b/Test/invalidSwizzle.vert
@@ -0,0 +1,10 @@
+#version 420
+
+void f();
+uniform sampler2D s;
+
+void main() {
+    vec2 v = s.rr; // Swizzles do not apply to samplers
+    f().xx; // Scalar swizzle does not apply to void
+    f().xy; // Vector swizzle does not apply either
+}
\ No newline at end of file
diff --git a/Test/link1.vk.frag b/Test/link1.vk.frag
index 443a320..167e78e 100644
--- a/Test/link1.vk.frag
+++ b/Test/link1.vk.frag
@@ -2,9 +2,23 @@
 

 vec4 getColor();

 

-out vec4 color;

+layout(location=0) out vec4 color;

+

+int a1[];  // max size from link1

+int a2[];  // max size from link2

+int b[5];

+int c[];

+int i;

+

+buffer bnameRuntime  { float r[]; };

+buffer bnameImplicit { float m[]; };

 

 void main()

 {

     color = getColor();

+

+    a1[8] = 1;

+    a2[1] = 1;

+    b[i] = 1;

+    c[3] = 1;

 }

diff --git a/Test/link2.vk.frag b/Test/link2.vk.frag
index b1630cb..b80402c 100644
--- a/Test/link2.vk.frag
+++ b/Test/link2.vk.frag
@@ -1,8 +1,23 @@
 #version 450

 

-uniform sampler2D s2D;

+layout(binding=1) uniform sampler2D s2D;

+

+int a1[];  // max size from link1

+int a2[];  // max size from link2

+int b[];

+int c[7];

+int i;

+

+buffer bnameRuntime  { float r[]; };

+buffer bnameImplicit { float m[4]; };

 

 vec4 getColor()

 {

-  return texture(s2D, vec2(0.5));

+    a1[2] = 1;

+    a2[9] = 1;

+    b[2] = 1;

+    c[3] = 1;

+    c[i] = 1;

+

+    return texture(s2D, vec2(0.5));

 }

diff --git a/Test/matrix2.frag b/Test/matrix2.frag
index eb2c53c..df65804 100644
--- a/Test/matrix2.frag
+++ b/Test/matrix2.frag
@@ -47,4 +47,5 @@
     FragColor *= inv4;

 

     FragColor = vec4(FragColor * matrixCompMult(un34, un34), FragColor.w);

+    m34 *= colorTransform;

 }

diff --git a/Test/matrixError.vert b/Test/matrixError.vert
index 3c8cc11..0ad145b 100644
--- a/Test/matrixError.vert
+++ b/Test/matrixError.vert
@@ -19,4 +19,6 @@
     m23.xy;            // ERROR, can't use .
 
     gl_Position = vec4(m23 * m32 * v3, m24[2][4]);  // ERROR, 2 and 4 are out of range
+    m23 *= m23;        // ERROR, right side needs to be square
+    m23 *= m32;        // ERROR, left columns must match right rows
 }
diff --git a/Test/mixedArrayDecls.frag b/Test/mixedArrayDecls.frag
new file mode 100644
index 0000000..aff4f78
--- /dev/null
+++ b/Test/mixedArrayDecls.frag
@@ -0,0 +1,30 @@
+#version 450

+

+struct S {

+    int[3] a[2], b[5];

+};

+

+S s;

+

+int[5] c[4], d[8];

+int[9] e[], f[];

+int e[11][9];

+int f[13][9];

+

+int[14] g[], h[];

+

+int [14][15][6] foo(int[6] p[14][15]) { return p; }

+

+void main()

+{

+    g[3];

+    h[2];

+}

+

+float[4][3][2] bar() { float[3][2] a[4]; return a; }

+

+in inbname {

+    float[7] f[8][9];

+} inbinst[4][5][6];

+

+float[3][2] barm[4]() { float[3][2] a[4]; return a; }  // ERROR

diff --git a/Test/nonuniform.frag b/Test/nonuniform.frag
new file mode 100644
index 0000000..3f3dd67
--- /dev/null
+++ b/Test/nonuniform.frag
@@ -0,0 +1,33 @@
+#version 450

+

+int nonuniformEXT;

+

+#extension GL_EXT_nonuniform_qualifier : enable

+

+nonuniformEXT in vec4 nu_inv4;

+nonuniformEXT float nu_gf;

+

+nonuniformEXT out vec4 nu_outv4;           // ERROR, out

+nonuniformEXT uniform vec4 nu_uv4;         // ERROR, uniform

+nonuniformEXT const float nu_constf = 1.0; // ERROR, const

+

+nonuniformEXT int foo(nonuniformEXT int nupi, nonuniformEXT out int f)

+{

+    return nupi;

+}

+

+void main()

+{

+    nonuniformEXT int nu_li;

+    nonuniformEXT const int nu_ci = 2; // ERROR, const

+

+    foo(nu_li, nu_li);

+

+    int a;

+    nu_li = nonuniformEXT(a) + nonuniformEXT(a * 2);

+    nu_li = nonuniformEXT(a, a);       // ERROR, too many arguments

+    nu_li = nonuniformEXT();           // ERROR, no arguments

+}

+

+layout(location=1) in struct S { float a; nonuniformEXT float b; } ins;  // ERROR, not on member

+layout(location=3) in inbName { float a; nonuniformEXT float b; } inb;   // ERROR, not on member

diff --git a/Test/nosuffix b/Test/nosuffix
old mode 100755
new mode 100644
diff --git a/Test/numeral.frag b/Test/numeral.frag
index cc0862c..39814f4 100644
--- a/Test/numeral.frag
+++ b/Test/numeral.frag
@@ -101,3 +101,6 @@
 int g4 = 4294967296;   // ERROR, too big

 int g5 = 4294967295;

 int g6 = 4294967294;

+float inf1 = -1.#INF;

+float inf2 =  1.#INF;

+float inf3 = +1.#INF;

diff --git a/Test/nvShaderNoperspectiveInterpolation.frag b/Test/nvShaderNoperspectiveInterpolation.frag
new file mode 100644
index 0000000..15c191d
--- /dev/null
+++ b/Test/nvShaderNoperspectiveInterpolation.frag
@@ -0,0 +1,15 @@
+#version 300 es
+
+precision mediump float;
+
+noperspective in vec4 bad; // ERROR
+
+#extension GL_NV_shader_noperspective_interpolation : enable
+
+noperspective in vec4 color;
+
+out vec4 fragColor;
+
+void main() {
+    fragColor = color;
+}
\ No newline at end of file
diff --git a/Test/overlongLiteral.frag b/Test/overlongLiteral.frag
new file mode 100644
index 0000000..c351ed6
--- /dev/null
+++ b/Test/overlongLiteral.frag
@@ -0,0 +1 @@
+0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000;
diff --git a/Test/parent.h b/Test/parent.h
new file mode 100644
index 0000000..9ef68e0
--- /dev/null
+++ b/Test/parent.h
@@ -0,0 +1 @@
+float4 i4;
diff --git a/Test/parentBad b/Test/parentBad
new file mode 100644
index 0000000..e54c10d
--- /dev/null
+++ b/Test/parentBad
@@ -0,0 +1,3 @@
+int a;

+

+#error bad parent

diff --git a/Test/preprocessor.bad_arg.vert b/Test/preprocessor.bad_arg.vert
new file mode 100644
index 0000000..344fc4b
--- /dev/null
+++ b/Test/preprocessor.bad_arg.vert
@@ -0,0 +1,8 @@
+#define M(a) a

+int M(aou

+    = 2)  // Okay, one argument, split across newline

+    ;

+

+// end of file during an argument

+#define EXP2(a, b)

+EXP2(((((1,2,3,4))), );

diff --git a/Test/preprocessor.pragma.vert b/Test/preprocessor.pragma.vert
index 79f5600..0ae7ee2 100644
--- a/Test/preprocessor.pragma.vert
+++ b/Test/preprocessor.pragma.vert
@@ -7,5 +7,7 @@
 

 #pragma undefined_pragma(x, 4)

 

+#pragma once

+

 int main() {

 }

diff --git a/Test/preprocessor.simple.vert b/Test/preprocessor.simple.vert
old mode 100644
new mode 100755
index 3522271..788df76
--- a/Test/preprocessor.simple.vert
+++ b/Test/preprocessor.simple.vert
@@ -27,3 +27,39 @@
   += -= *= /= %= <<= >>= &= |= ^=

   1.2 2E10 5u -5lf

 }

+

+struct S {

+    int member1;

+    float member2;

+    vec4 member3;

+};

+

+#define xyz xxyz

+#define yzy() yyz

+

+#define FUN_MAC() \

+	vec3 a = vec3(0); \

+	vec3 b = a.zxyz;  \

+	vec3 b = a.xyz;   \

+	vec3 b = a.yzy();   \

+	vec3 b = a.xyz();   \

+	vec3 b = a.yzy;   \

+	vec3 b = a.z;

+

+void foo()

+{

+    S s;

+    s.member2 + s.member1;

+    s.member3.zyx;

+    s.member2.xyz;

+    s.member2.yzy();

+    s.member2.xyz();

+    s.member2.yzy;

+    FUN_MAC()

+    yzy

+

+    ();

+    yzy

+

+

+}

diff --git a/Test/reflection.vert b/Test/reflection.vert
index be49822..7549f08 100644
--- a/Test/reflection.vert
+++ b/Test/reflection.vert
@@ -133,6 +133,26 @@
     float foo;

 } arrBl2[4];

 

+buffer buf1 {

+    float scalar;

+    float runtimeArray[];

+} buf1i;

+

+buffer buf2 {

+    float scalar;

+    N2 runtimeArray[];

+} buf2i;

+

+buffer buf3 {

+    float scalar;

+    float runtimeArray[];

+} buf3i;

+

+buffer buf4 {

+    float scalar;

+    N2 runtimeArray[];

+} buf4i;

+

 void main()

 {

     liveFunction1(image_ui2D, sampler_2D, sampler_2DMSArray);

@@ -179,4 +199,8 @@
     f += attributeFloat3.x;

     f += attributeFloat4.x;

     f += attributeMat4[0][1];

+    f += buf1i.runtimeArray[3];

+    f += buf2i.runtimeArray[3].c;

+    f += buf3i.runtimeArray[gl_InstanceID];

+    f += buf4i.runtimeArray[gl_InstanceID].c;

 }

diff --git a/Test/remap.invalid-spirv-1.spv b/Test/remap.invalid-spirv-1.spv
new file mode 100644
index 0000000..e5d59d4
--- /dev/null
+++ b/Test/remap.invalid-spirv-1.spv
Binary files differ
diff --git a/Test/remap.invalid-spirv-2.spv b/Test/remap.invalid-spirv-2.spv
new file mode 100644
index 0000000..df8c96d
--- /dev/null
+++ b/Test/remap.invalid-spirv-2.spv
Binary files differ
diff --git a/Test/remap.specconst.comp b/Test/remap.specconst.comp
new file mode 100644
index 0000000..52ac07a
--- /dev/null
+++ b/Test/remap.specconst.comp
@@ -0,0 +1,7 @@
+#version 450
+
+layout (local_size_x_id = 0, local_size_y_id = 1, local_size_z_id = 2) in;
+
+shared int foo[gl_WorkGroupSize.x + gl_WorkGroupSize.y * gl_WorkGroupSize.z];
+
+void main () {}
diff --git a/Test/runtests b/Test/runtests
index 176e73f..8cc8b7a 100755
--- a/Test/runtests
+++ b/Test/runtests
@@ -3,6 +3,7 @@
 TARGETDIR=localResults
 BASEDIR=baseResults
 EXE=../build/install/bin/glslangValidator
+REMAPEXE=../build/install/bin/spirv-remap
 HASERROR=0
 mkdir -p localResults
 
@@ -31,11 +32,11 @@
 echo Running reflection...
 $EXE -l -q -C reflection.vert > $TARGETDIR/reflection.vert.out
 diff -b $BASEDIR/reflection.vert.out $TARGETDIR/reflection.vert.out || HASERROR=1
-$EXE -D -e flizv -l -q -C -V hlsl.reflection.vert > $TARGETDIR/hlsl.reflection.vert.out
+$EXE -D -Od -e flizv -l -q -C -V -Od hlsl.reflection.vert > $TARGETDIR/hlsl.reflection.vert.out
 diff -b $BASEDIR/hlsl.reflection.vert.out $TARGETDIR/hlsl.reflection.vert.out || HASERROR=1
-$EXE -D -e main -l -q -C -V hlsl.reflection.binding.frag > $TARGETDIR/hlsl.reflection.binding.frag.out
+$EXE -D -Od -e main -l -q -C -V -Od hlsl.reflection.binding.frag > $TARGETDIR/hlsl.reflection.binding.frag.out
 diff -b $BASEDIR/hlsl.reflection.binding.frag.out $TARGETDIR/hlsl.reflection.binding.frag.out || HASERROR=1
-$EXE -D -e main -l -q --hlsl-iomap --auto-map-bindings --stb 10 --sbb 20 --ssb 30 --suavb 40 --scb 50 -D -V -e main hlsl.automap.frag > $TARGETDIR/hlsl.automap.frag.out
+$EXE -D -Od -e main -l -q --hlsl-iomap --auto-map-bindings --stb 10 --sbb 20 --ssb 30 --suavb 40 --scb 50 -D -V -e main -Od hlsl.automap.frag > $TARGETDIR/hlsl.automap.frag.out
 diff -b $BASEDIR/hlsl.automap.frag.out $TARGETDIR/hlsl.automap.frag.out || HASERROR=1
 
 #
@@ -45,19 +46,24 @@
 $EXE -i -C *.vert *.geom *.frag *.tes* *.comp > singleThread.out
 $EXE -i -C *.vert *.geom *.frag *.tes* *.comp -t > multiThread.out
 diff singleThread.out multiThread.out || HASERROR=1
+if [ $HASERROR -eq 0 ]
+then
+    rm singleThread.out
+    rm multiThread.out
+fi
 
 #
 # entry point renaming tests
 #
 echo Running entry-point renaming tests
-$EXE -i -H -V -D -e main_in_spv --ku --source-entrypoint main hlsl.entry.rename.frag > $TARGETDIR/hlsl.entry.rename.frag.out
+$EXE -i -H -V -D -Od --entry-point main_in_spv --ku --source-entrypoint main -Od hlsl.entry.rename.frag > $TARGETDIR/hlsl.entry.rename.frag.out
 diff -b $BASEDIR/hlsl.entry.rename.frag.out $TARGETDIR/hlsl.entry.rename.frag.out || HASERROR=1
 
 #
 # Testing ill-defined uncalled function
 #
 echo Running ill-defined uncalled function
-$EXE -D -e main -H hlsl.deadFunctionMissingBody.vert > $TARGETDIR/hlsl.deadFunctionMissingBody.vert.out
+$EXE -D -Od -e main -H -Od hlsl.deadFunctionMissingBody.vert > $TARGETDIR/hlsl.deadFunctionMissingBody.vert.out
 diff -b $BASEDIR/hlsl.deadFunctionMissingBody.vert.out $TARGETDIR/hlsl.deadFunctionMissingBody.vert.out || HASERROR=1
 
 if [ $HASERROR -eq 0 ]
@@ -68,11 +74,15 @@
 fi
 
 #
-# Testing -S
+# Testing -S and compound suffixes
 #
-echo Running explicit stage test
-$EXE -i -S vert nosuffix > $TARGETDIR/nosuffix.out
+echo Running explicit stage test and compound suffix tests
+$EXE -Od -i -S vert nosuffix > $TARGETDIR/nosuffix.out
 diff -b $BASEDIR/nosuffix.out $TARGETDIR/nosuffix.out || HASERROR=1
+$EXE -Od -i compoundsuffix.vert.glsl > $TARGETDIR/compoundsuffix.vert.glsl
+diff -b $BASEDIR/compoundsuffix.vert.glsl $TARGETDIR/compoundsuffix.vert.glsl || HASERROR=1
+$EXE -Od -e main -H compoundsuffix.frag.hlsl > $TARGETDIR/compoundsuffix.frag.hlsl
+diff -b $BASEDIR/compoundsuffix.frag.hlsl $TARGETDIR/compoundsuffix.frag.hlsl || HASERROR=1
 
 #
 # Testing --hlsl-offsets
@@ -82,10 +92,140 @@
 diff -b $BASEDIR/spv.hlslOffsets.vert.out $TARGETDIR/spv.hlslOffsets.vert.out || HASERROR=1
 
 echo Running hlsl offsets
-$EXE -i  --hlsl-offsets -D -e main -H hlsl.hlslOffset.vert > $TARGETDIR/hlsl.hlslOffset.vert.out
+$EXE -i  --hlsl-offsets -D -Od -e main -H -Od hlsl.hlslOffset.vert > $TARGETDIR/hlsl.hlslOffset.vert.out
 diff -b $BASEDIR/hlsl.hlslOffset.vert.out $TARGETDIR/hlsl.hlslOffset.vert.out || HASERROR=1
 
 #
+# Testing --resource-set-binding
+#
+echo Configuring HLSL descriptor set and binding number manually
+$EXE -V -D -Od -e main -H -Od hlsl.multiDescriptorSet.frag --rsb frag t0 0 0 t1 1 0 s0 0 1 s1 1 1 b0 2 0 b1 2 1 b2 2 2 > $TARGETDIR/hlsl.multiDescriptorSet.frag.out
+diff -b $BASEDIR/hlsl.multiDescriptorSet.frag.out $TARGETDIR/hlsl.multiDescriptorSet.frag.out || HASERROR=1
+
+$EXE -V -D -Od -e main -H -Od hlsl.explicitDescriptorSet.frag --hlsl-iomap --amb --ssb 10 --stb 20 --rsb 4 > $TARGETDIR/hlsl.explicitDescriptorSet.frag.out
+diff -b $BASEDIR/hlsl.explicitDescriptorSet.frag.out $TARGETDIR/hlsl.explicitDescriptorSet.frag.out || HASERROR=1
+
+$EXE -V -D -Od -e main -H -Od hlsl.explicitDescriptorSet.frag --hlsl-iomap --amb --ssb 10 --stb 20 --rsb frag 3 > $TARGETDIR/hlsl.explicitDescriptorSet-2.frag.out
+diff -b $BASEDIR/hlsl.explicitDescriptorSet-2.frag.out $TARGETDIR/hlsl.explicitDescriptorSet-2.frag.out || HASERROR=1
+
+#
+# Testing per-descriptor-set IO map shift
+#
+echo 'Testing per-descriptor-set IO map shift'
+$EXE -e main --hlsl-iomap --ssb 10 1 15 2 --stb 20 --stb 25 2 --stb 70 6 --suavb 30 --suavb 40 2 --sub 50 6 -i -q -D -Od -V hlsl.shift.per-set.frag > $TARGETDIR/hlsl.shift.per-set.frag.out || HASERROR=1
+diff -b $BASEDIR/hlsl.shift.per-set.frag.out $TARGETDIR/hlsl.shift.per-set.frag.out || HASERROR=1
+
+#
+# Testing location error
+#
+echo Testing SPV no location
+$EXE -V -C spv.noLocation.vert > $TARGETDIR/spv.noLocation.vert.out
+diff -b $BASEDIR/spv.noLocation.vert.out $TARGETDIR/spv.noLocation.vert.out || HASERROR=1
+$EXE -G -H --aml spv.noBuiltInLoc.vert > $TARGETDIR/spv.noBuiltInLoc.vert.out
+diff -b $BASEDIR/spv.noBuiltInLoc.vert.out $TARGETDIR/spv.noBuiltInLoc.vert.out || HASERROR=1
+$EXE -G spv.looseUniformNoLoc.vert > $TARGETDIR/spv.looseUniformNoLoc.vert.out
+diff -b $BASEDIR/spv.looseUniformNoLoc.vert.out $TARGETDIR/spv.looseUniformNoLoc.vert.out || HASERROR=1
+
+#
+# Testing debug information
+#
+echo Testing SPV Debug Information
+$EXE -g --relaxed-errors --suppress-warnings --aml --amb --hlsl-offsets --nsf --spirv-val \
+     -G -H spv.debugInfo.frag --rsb frag 3 > $TARGETDIR/spv.debugInfo.frag.out
+diff -b $BASEDIR/spv.debugInfo.frag.out $TARGETDIR/spv.debugInfo.frag.out || HASERROR=1
+$EXE -g -Od --target-env vulkan1.1 --relaxed-errors --suppress-warnings --aml --hlsl-offsets --nsf --spirv-val \
+     -G -H spv.debugInfo.frag --rsb frag 3 > $TARGETDIR/spv.debugInfo.1.1.frag.out
+diff -b $BASEDIR/spv.debugInfo.1.1.frag.out $TARGETDIR/spv.debugInfo.1.1.frag.out || HASERROR=1
+$EXE -g -D -Od -e newMain -g --amb --aml --fua --hlsl-iomap --nsf --spirv-val --sib 1 --ssb 2 --sbb 3 --stb 4 --suavb 5 --sub 6 \
+     --sep origMain -H -Od spv.hlslDebugInfo.vert --rsb vert t0 0 0 > $TARGETDIR/spv.hlslDebugInfo.frag.out
+diff -b $BASEDIR/spv.hlslDebugInfo.frag.out $TARGETDIR/spv.hlslDebugInfo.frag.out || HASERROR=1
+
+#
+# Testing Includer
+#
+echo Testing Includer
+$EXE -D -Od -e main -H -Od ../Test/hlsl.include.vert > $TARGETDIR/hlsl.include.vert.out
+diff -b $BASEDIR/hlsl.include.vert.out $TARGETDIR/hlsl.include.vert.out || HASERROR=1
+$EXE -D -Od -e main -H -Od hlsl.includeNegative.vert > $TARGETDIR/hlsl.includeNegative.vert.out
+diff -b $BASEDIR/hlsl.includeNegative.vert.out $TARGETDIR/hlsl.includeNegative.vert.out || HASERROR=1
+$EXE -l -i include.vert > $TARGETDIR/include.vert.out
+diff -b $BASEDIR/include.vert.out $TARGETDIR/include.vert.out || HASERROR=1
+$EXE -D -Od -e main -H -Od -Iinc1/path1 -Iinc1/path2 hlsl.dashI.vert > $TARGETDIR/hlsl.dashI.vert.out
+diff -b $BASEDIR/hlsl.dashI.vert.out $TARGETDIR/hlsl.dashI.vert.out || HASERROR=1
+
+#
+# Testing -D and -U
+#
+echo "Testing -D and -U"
+$EXE -DUNDEFED -UIN_SHADER -DFOO=200 -i -l -UUNDEFED -DMUL=FOO*2 glsl.-D-U.frag > $TARGETDIR/glsl.-D-U.frag.out
+diff -b $BASEDIR/glsl.-D-U.frag.out $TARGETDIR/glsl.-D-U.frag.out || HASERROR=1
+$EXE -D -Od -e main -V -i -DUNDEFED -UIN_SHADER -DFOO=200 -UUNDEFED -Od hlsl.-D-U.frag > $TARGETDIR/hlsl.-D-U.frag.out
+diff -b $BASEDIR/hlsl.-D-U.frag.out $TARGETDIR/hlsl.-D-U.frag.out || HASERROR=1
+
+#
+# Test --client and --target-env
+#
+echo "Testing --client and --target-env"
+$EXE --client vulkan100       spv.targetVulkan.vert || HASERROR=1
+$EXE --client opengl100       spv.targetOpenGL.vert || HASERROR=1
+$EXE --target-env vulkan1.0   spv.targetVulkan.vert || HASERROR=1
+$EXE --target-env vulkan1.1   spv.targetVulkan.vert || HASERROR=1
+$EXE --target-env opengl      spv.targetOpenGL.vert || HASERROR=1
+$EXE -V100                    spv.targetVulkan.vert || HASERROR=1
+$EXE -G100                    spv.targetOpenGL.vert || HASERROR=1
+$EXE --target-env spirv1.2 -V spv.targetVulkan.vert || HASERROR=1
+
+#
+# Testing GLSL entry point rename
+#
+echo "Testing GLSL entry point rename"
+$EXE -H -e foo --source-entrypoint main glsl.entryPointRename.vert > $TARGETDIR/glsl.entryPointRename.vert.out
+diff -b $BASEDIR/glsl.entryPointRename.vert.out $TARGETDIR/glsl.entryPointRename.vert.out || HASERROR=1
+$EXE -H -e foo --source-entrypoint bar glsl.entryPointRename.vert > $TARGETDIR/glsl.entryPointRename.vert.bad.out
+diff -b $BASEDIR/glsl.entryPointRename.vert.bad.out $TARGETDIR/glsl.entryPointRename.vert.bad.out || HASERROR=1
+$EXE -H -e foo --source-entrypoint main glsl.entryPointRename2.vert > $TARGETDIR/glsl.entryPointRename2.vert.out
+diff -b $BASEDIR/glsl.entryPointRename2.vert.out $TARGETDIR/glsl.entryPointRename2.vert.out || HASERROR=1
+
+#
+# Testing remapper error handling
+#
+echo "Testing remapper error handling"
+$REMAPEXE --do-everything -i remap.invalid-spirv-1.spv -o $TARGETDIR > $TARGETDIR/remap.invalid-spirv-1.out && HASERROR=1
+diff -b $BASEDIR/remap.invalid-spirv-1.out $TARGETDIR/remap.invalid-spirv-1.out || HASERROR=1
+$REMAPEXE --do-everything -i remap.invalid-spirv-2.spv -o $TARGETDIR > $TARGETDIR/remap.invalid-spirv-2.out && HASERROR=1
+diff -b $BASEDIR/remap.invalid-spirv-2.out $TARGETDIR/remap.invalid-spirv-2.out || HASERROR=1
+
+#
+# Testing position Y inversion
+#
+echo "Testing position Y inversion"
+$EXE -H -e main -V -D -Od -H -i --iy hlsl.y-negate-1.vert > $TARGETDIR/hlsl.y-negate-1.vert.out
+diff -b $BASEDIR/hlsl.y-negate-1.vert.out $TARGETDIR/hlsl.y-negate-1.vert.out || HASERROR=1
+$EXE -H -e main -V -D -Od -H -i --invert-y hlsl.y-negate-2.vert > $TARGETDIR/hlsl.y-negate-2.vert.out
+diff -b $BASEDIR/hlsl.y-negate-2.vert.out $TARGETDIR/hlsl.y-negate-2.vert.out || HASERROR=1
+$EXE -H -e main -V -D -Od -H -i --invert-y hlsl.y-negate-3.vert > $TARGETDIR/hlsl.y-negate-3.vert.out
+diff -b $BASEDIR/hlsl.y-negate-3.vert.out $TARGETDIR/hlsl.y-negate-3.vert.out || HASERROR=1
+
+#
+# Testing hlsl_functionality1
+#
+echo "Testing hlsl_functionality1"
+$EXE -H -e main -D -Od -fhlsl_functionality1 hlsl.structbuffer.incdec.frag > \
+    $TARGETDIR/hlsl.structbuffer.incdec.frag.hlslfun1.out
+diff -b $BASEDIR/hlsl.structbuffer.incdec.frag.hlslfun1.out $TARGETDIR/hlsl.structbuffer.incdec.frag.hlslfun1.out || HASERROR=1
+$EXE -H -e main -D -Od -fhlsl_functionality1 hlsl.noSemantic.functionality1.comp > \
+    $TARGETDIR/hlsl.noSemantic.functionality1.comp.out
+diff -b $BASEDIR/hlsl.noSemantic.functionality1.comp.out $TARGETDIR/hlsl.noSemantic.functionality1.comp.out || HASERROR=1
+
+#
+# Testing HLSL-specific PP feature expansion
+#
+echo "Testing HLSL-specific PP feature expansion"
+$EXE -D -E hlsl.pp.expand.frag > $TARGETDIR/hlsl.pp.expand.frag.out 2> $TARGETDIR/hlsl.pp.expand.frag.err
+diff -b $BASEDIR/hlsl.pp.expand.frag.out $TARGETDIR/hlsl.pp.expand.frag.out || HASERROR=1
+diff -b $BASEDIR/hlsl.pp.expand.frag.err $TARGETDIR/hlsl.pp.expand.frag.err || HASERROR=1
+
+#
 # Final checking
 #
 if [ $HASERROR -eq 0 ]
@@ -95,4 +235,6 @@
     echo Tests Failed.
 fi
 
+rm -f comp.spv frag.spv geom.spv tesc.spv tese.spv vert.spv
+
 exit $HASERROR
diff --git a/Test/runtimeArray.vert b/Test/runtimeArray.vert
new file mode 100644
index 0000000..a5da4f4
--- /dev/null
+++ b/Test/runtimeArray.vert
@@ -0,0 +1,110 @@
+#version 450 core

+

+buffer bn {

+    int a[];

+    float b[];

+} buf;

+

+uniform un {

+    int a[];

+    float b[];

+} ubuf;

+

+buffer bna {

+    int a[];

+    float b[];

+} bufa[4];

+

+uniform una {

+    int a[];

+    float b[];

+} ubufa[4];

+

+buffer abn {

+    int aba[];

+    float abb[];

+};

+

+uniform aun {

+    int aua[];

+    float aub[];

+};

+

+layout(binding=1)                             uniform samplerBuffer       uniformTexelBufferDyn[];

+layout(binding=2, r32f)                       uniform imageBuffer         storageTexelBufferDyn[];

+layout(binding=3)                             uniform uname { float a; }  uniformBuffer[];

+layout(binding=4)                             buffer  bname { float b; }  storageBuffer[];

+layout(binding=5)                             uniform sampler2D           sampledImage[];

+layout(binding=6, r32f)                       uniform image2D             storageImage[];

+layout(binding=8)                             uniform samplerBuffer       uniformTexelBuffer[];

+layout(binding=9, r32f)                       uniform imageBuffer         storageTexelBuffer[];

+

+int i;

+

+void main()

+{

+    ubuf.a[3];

+    ubuf.b[3];

+    buf.a[3];

+    buf.b[3];

+

+    ubufa[3].a[3];

+    ubufa[3].b[3];

+    bufa[3].a[3];

+    bufa[3].b[3];

+

+    aua[3];

+    aub[3];

+    aba[3];

+    abb[3];

+

+    ubuf.a[i];             // ERROR

+    ubuf.b[i];             // ERROR

+    buf.a[i];              // ERROR

+    buf.b[i];

+

+    ubuf.a.length();       // ERROR

+    ubuf.b.length();       // ERROR

+    buf.a.length();        // ERROR

+    buf.b.length();

+

+    ubufa[1].a[i];         // ERROR

+    ubufa[1].b[i];         // ERROR

+    bufa[1].a[i];          // ERROR

+    bufa[1].b[i];

+

+    ubufa[1].a.length();   // ERROR

+    ubufa[1].b.length();   // ERROR

+    bufa[1].a.length();    // ERROR

+    bufa[1].b.length();

+

+    aua[i];                // ERROR

+    aub[i];                // ERROR

+    aba[i];                // ERROR

+    abb[i];

+

+    aua.length();          // ERROR

+    aub.length();          // ERROR

+    aba.length();          // ERROR

+    abb.length();

+

+    uniformTexelBufferDyn[1];

+    storageTexelBufferDyn[1];

+    uniformBuffer[1];

+    storageBuffer[1];

+    sampledImage[1];

+    storageImage[1];

+    uniformTexelBuffer[1];

+    storageTexelBuffer[1];

+

+    uniformTexelBufferDyn[i];  // ERROR, need extension

+    storageTexelBufferDyn[i];  // ERROR, need extension

+    uniformBuffer[i];          // ERROR, need extension

+    storageBuffer[i];          // ERROR, need extension

+    sampledImage[i];           // ERROR, need extension

+    storageImage[i];           // ERROR, need extension

+    uniformTexelBuffer[i];     // ERROR, need extension

+    storageTexelBuffer[i];     // ERROR, need extension

+

+    float local[] = ubuf.b;    // ERROR, can initialize with runtime-sized array

+}

diff --git a/Test/samplerlessTextureFunctions.frag b/Test/samplerlessTextureFunctions.frag
new file mode 100644
index 0000000..0926850
--- /dev/null
+++ b/Test/samplerlessTextureFunctions.frag
@@ -0,0 +1,46 @@
+#version 450 core
+
+layout(binding = 1) uniform texture2D tex2D;
+layout(binding = 1) uniform texture2DMS texMS;
+layout(binding = 0) uniform textureBuffer buf;
+
+void testBad()
+{
+    vec4 tex2DFetch = texelFetch(tex2D, ivec2(0, 0), 0);
+    vec4 texMSFetch = texelFetch(texMS, ivec2(0, 0), 0);
+
+    // Allowed by KHR_vulkan_glsl without the extension. All others should
+    // error.
+    vec4 bufFetch = texelFetch(buf, 0);
+
+    vec4 tex2DFetchOffset = texelFetchOffset(tex2D, ivec2(0, 0), 0, ivec2(0, 0));
+
+    ivec2 tex2DSize = textureSize(tex2D, 0);
+    ivec2 texMSSize = textureSize(texMS);
+    int bufSize = textureSize(buf);
+
+    int tex2DLevels = textureQueryLevels(tex2D);
+
+    int texMSSamples = textureSamples(texMS);
+}
+
+#extension GL_EXT_samplerless_texture_functions : enable
+
+void main()
+{
+    // These should all succeed.
+
+    vec4 tex2DFetch = texelFetch(tex2D, ivec2(0, 0), 0);
+    vec4 texMSFetch = texelFetch(texMS, ivec2(0, 0), 0);
+    vec4 bufFetch = texelFetch(buf, 0);
+
+    vec4 tex2DFetchOffset = texelFetchOffset(tex2D, ivec2(0, 0), 0, ivec2(0, 0));
+
+    ivec2 tex2DSize = textureSize(tex2D, 0);
+    ivec2 texMSSize = textureSize(texMS);
+    int bufSize = textureSize(buf);
+
+    int tex2DLevels = textureQueryLevels(tex2D);
+
+    int texMSSamples = textureSamples(texMS);
+}
diff --git a/Test/spv.1.3.8bitstorage-ssbo.vert b/Test/spv.1.3.8bitstorage-ssbo.vert
new file mode 100644
index 0000000..61ba7bf
--- /dev/null
+++ b/Test/spv.1.3.8bitstorage-ssbo.vert
@@ -0,0 +1,15 @@
+#version 450

+

+#extension GL_EXT_shader_8bit_storage: require

+

+layout(binding = 0) readonly buffer Vertices

+{

+    uint8_t vertices[];

+};

+

+layout(location = 0) out vec4 color;

+

+void main()

+{

+    color = vec4(int(vertices[gl_VertexIndex]));

+}

diff --git a/Test/spv.1.3.8bitstorage-ubo.vert b/Test/spv.1.3.8bitstorage-ubo.vert
new file mode 100644
index 0000000..5c49a24
--- /dev/null
+++ b/Test/spv.1.3.8bitstorage-ubo.vert
@@ -0,0 +1,15 @@
+#version 450

+

+#extension GL_EXT_shader_8bit_storage: require

+

+layout(binding = 0) readonly uniform Vertices

+{

+    uint8_t vertices[512];

+};

+

+layout(location = 0) out vec4 color;

+

+void main()

+{

+    color = vec4(int(vertices[gl_VertexIndex]));

+}

diff --git a/Test/spv.16bitstorage-int.frag b/Test/spv.16bitstorage-int.frag
new file mode 100644
index 0000000..57be67e
--- /dev/null
+++ b/Test/spv.16bitstorage-int.frag
@@ -0,0 +1,90 @@
+#version 450 core

+

+#extension GL_EXT_shader_16bit_storage : enable

+

+struct S

+{

+    int16_t  x;

+    i16vec2    y;

+    i16vec3    z;

+};

+

+layout(column_major, std140) uniform B1

+{

+    int16_t  a;

+    i16vec2    b;

+    i16vec3    c;

+    int16_t  d[2];

+    S          g;

+    S          h[2];

+    int        j;

+} b1;

+

+layout(row_major, std430) buffer B2

+{

+    int16_t  o;

+    i16vec2    p;

+    i16vec3    q;

+    int16_t  r[2];

+    S          u;

+    S          v[2];

+    i16vec2    x[100];

+    int16_t  w[];

+} b2;

+

+layout(row_major, std140) uniform B5

+{

+    int16_t  o;

+    i16vec2    p;

+    i16vec3    q;

+    int16_t  r[2];

+    S          u;

+    S          v[2];

+    i16vec2    x[100];

+    int16_t  w[100];

+} b5;

+

+struct S2 {

+    mat4x4 x;

+    int16_t y;

+    int z;

+};

+

+struct S3 {

+    S2 x;

+};

+

+layout(row_major, std430) buffer B3

+{

+    S2 x;

+} b3;

+

+layout(column_major, std430) buffer B4

+{

+    S2 x;

+    S3 y;

+} b4;

+

+void main()

+{

+    b2.o = b1.a;

+    b2.p = i16vec2(ivec3(b2.q).xy);

+    b2.p = i16vec2(ivec3(b5.q).xy);

+    b2.r[0] = b2.r[0];

+    b2.r[1] = b5.r[1];

+    b2.p = b2.p;

+    int x0 = int(b1.a);

+    ivec4 x1 = ivec4(b1.a, b2.p, 1);

+    b4.x.x = b3.x.x;

+    b2.o = int16_t(ivec2(b2.p).x);

+    b2.p = b2.v[1].y;

+    ivec3 v3 = ivec3(b2.w[b1.j], b2.w[b1.j+1], b2.w[b1.j+2]);

+    ivec3 u3 = ivec3(b5.w[b1.j], b5.w[b1.j+1], b5.w[b1.j+2]);

+    b2.x[0] = b2.x[0];

+    b2.x[1] = b5.x[1];

+    b2.p.x = b1.a;

+    b2.o = b2.p.x;

+    b2.p = i16vec2(ivec2(1, 2));

+    b2.o = int16_t(3);

+}

+

diff --git a/Test/spv.16bitstorage-uint.frag b/Test/spv.16bitstorage-uint.frag
new file mode 100644
index 0000000..aeecd04
--- /dev/null
+++ b/Test/spv.16bitstorage-uint.frag
@@ -0,0 +1,90 @@
+#version 450 core

+

+#extension GL_EXT_shader_16bit_storage : enable

+

+struct S

+{

+    uint16_t  x;

+    u16vec2    y;

+    u16vec3    z;

+};

+

+layout(column_major, std140) uniform B1

+{

+    uint16_t  a;

+    u16vec2    b;

+    u16vec3    c;

+    uint16_t  d[2];

+    S          g;

+    S          h[2];

+    uint        j;

+} b1;

+

+layout(row_major, std430) buffer B2

+{

+    uint16_t  o;

+    u16vec2    p;

+    u16vec3    q;

+    uint16_t  r[2];

+    S          u;

+    S          v[2];

+    u16vec2    x[100];

+    uint16_t  w[];

+} b2;

+

+layout(row_major, std140) uniform B5

+{

+    uint16_t  o;

+    u16vec2    p;

+    u16vec3    q;

+    uint16_t  r[2];

+    S          u;

+    S          v[2];

+    u16vec2    x[100];

+    uint16_t  w[100];

+} b5;

+

+struct S2 {

+    mat4x4 x;

+    uint16_t y;

+    uint z;

+};

+

+struct S3 {

+    S2 x;

+};

+

+layout(row_major, std430) buffer B3

+{

+    S2 x;

+} b3;

+

+layout(column_major, std430) buffer B4

+{

+    S2 x;

+    S3 y;

+} b4;

+

+void main()

+{

+    b2.o = b1.a;

+    b2.p = u16vec2(uvec3(b2.q).xy);

+    b2.p = u16vec2(uvec3(b5.q).xy);

+    b2.r[0] = b2.r[0];

+    b2.r[1] = b5.r[1];

+    b2.p = b2.p;

+    uint x0 = uint(b1.a);

+    uvec4 x1 = uvec4(b1.a, b2.p, 1);

+    b4.x.x = b3.x.x;

+    b2.o = uint16_t(uvec2(b2.p).x);

+    b2.p = b2.v[1].y;

+    uvec3 v3 = uvec3(b2.w[b1.j], b2.w[b1.j+1], b2.w[b1.j+2]);

+    uvec3 u3 = uvec3(b5.w[b1.j], b5.w[b1.j+1], b5.w[b1.j+2]);

+    b2.x[0] = b2.x[0];

+    b2.x[1] = b5.x[1];

+    b2.p.x = b1.a;

+    b2.o = b2.p.x;

+    b2.p = u16vec2(uvec2(1, 2));

+    b2.o = uint16_t(3u);

+}

+

diff --git a/Test/spv.16bitstorage.frag b/Test/spv.16bitstorage.frag
new file mode 100644
index 0000000..b821be1
--- /dev/null
+++ b/Test/spv.16bitstorage.frag
@@ -0,0 +1,90 @@
+#version 450 core

+

+#extension GL_EXT_shader_16bit_storage : enable

+

+struct S

+{

+    float16_t  x;

+    f16vec2    y;

+    f16vec3    z;

+};

+

+layout(column_major, std140) uniform B1

+{

+    float16_t  a;

+    f16vec2    b;

+    f16vec3    c;

+    float16_t  d[2];

+    S          g;

+    S          h[2];

+    int        j;

+} b1;

+

+layout(row_major, std430) buffer B2

+{

+    float16_t  o;

+    f16vec2    p;

+    f16vec3    q;

+    float16_t  r[2];

+    S          u;

+    S          v[2];

+    f16vec2    x[100];

+    float16_t  w[];

+} b2;

+

+layout(row_major, std140) uniform B5

+{

+    float16_t  o;

+    f16vec2    p;

+    f16vec3    q;

+    float16_t  r[2];

+    S          u;

+    S          v[2];

+    f16vec2    x[100];

+    float16_t  w[100];

+} b5;

+

+struct S2 {

+    mat4x4 x;

+    float16_t y;

+    float z;

+};

+

+struct S3 {

+    S2 x;

+};

+

+layout(row_major, std430) buffer B3

+{

+    S2 x;

+} b3;

+

+layout(column_major, std430) buffer B4

+{

+    S2 x;

+    S3 y;

+} b4;

+

+void main()

+{

+    b2.o = b1.a;

+    b2.p = f16vec2(vec3(b2.q).xy);

+    b2.p = f16vec2(vec3(b5.q).xy);

+    b2.r[0] = b2.r[0];

+    b2.r[1] = b5.r[1];

+    b2.p = b2.p;

+    float x0 = float(b1.a);

+    vec4 x1 = vec4(b1.a, b2.p, 1.0);

+    b4.x.x = b3.x.x;

+    b2.o = float16_t(vec2(b2.p).x);

+    b2.p = b2.v[1].y;

+    vec3 v3 = vec3(b2.w[b1.j], b2.w[b1.j+1], b2.w[b1.j+2]);

+    vec3 u3 = vec3(b5.w[b1.j], b5.w[b1.j+1], b5.w[b1.j+2]);

+    b2.x[0] = b2.x[0];

+    b2.x[1] = b5.x[1];

+    b2.p.x = b1.a;

+    b2.o = b2.p.x;

+    b2.p = f16vec2(vec2(1.0, 2.0));

+    b2.o = float16_t(3.0);

+}

+

diff --git a/Test/spv.16bitstorage_Error-int.frag b/Test/spv.16bitstorage_Error-int.frag
new file mode 100644
index 0000000..1897b02
--- /dev/null
+++ b/Test/spv.16bitstorage_Error-int.frag
@@ -0,0 +1,101 @@
+#version 450 core

+

+#extension GL_EXT_shader_16bit_storage : enable

+

+struct S

+{

+    int16_t  x;

+    i16vec2    y;

+    i16vec3    z;

+};

+

+layout(column_major, std140) uniform B1

+{

+    int16_t  a;

+    i16vec2    b;

+    i16vec3    c;

+    int16_t  d[2];

+    S          g;

+    S          h[2];

+    int        j;

+} b1;

+

+layout(row_major, std430) buffer B2

+{

+    int16_t  o;

+    i16vec2    p;

+    i16vec3    q;

+    int16_t  r[2];

+    S          u;

+    S          v[2];

+    int16_t  w[];

+} b2;

+

+struct S2 {

+    mat4x4 x;

+    int16_t y;

+    int z;

+};

+

+struct S3 {

+    S2 x;

+};

+

+layout(row_major, std430) buffer B3

+{

+    S2 x;

+} b3;

+

+layout(column_major, std430) buffer B4

+{

+    S2 x;

+} b4;

+

+void func3(S2 x) {

+}

+

+S2 func4() {

+    return b4.x;

+}

+

+int func(int16_t a) {

+    return 0;

+}

+

+struct S4 {

+    int x;

+    int16_t y;

+};

+

+int func2(int a) { return 0; }

+

+void main()

+{

+    b2.o = b2.q[1];

+    b2.p = b2.q.xy;

+    b2.o = max(b1.a, b1.a);

+    bvec2 bv = lessThan(b2.p, b2.p);

+    b2.o = b1.a + b1.a;

+    b2.o = -b1.a;

+    b2.o = b1.a + 1;

+    b2.p = b2.p.yx;

+    b4.x = b3.x;

+    int16_t f0;

+    S2 f1;

+    S3 f2;

+    if (b1.a == b1.a) {}

+    b2.r = b2.r;

+    b2.p = i16vec2(3, 4);

+    i16vec2[2](i16vec2(ivec2(1,2)), i16vec2(ivec2(3,4)));

+    // NOT ERRORING YET

+    b3.x;

+    S4(0, int16_t(0));

+    func2(b1.a);

+}

+

+

+layout(column_major, std140) uniform B6

+{

+    i16mat2x3  e;

+} b6;

+

diff --git a/Test/spv.16bitstorage_Error-uint.frag b/Test/spv.16bitstorage_Error-uint.frag
new file mode 100644
index 0000000..5f32a3b
--- /dev/null
+++ b/Test/spv.16bitstorage_Error-uint.frag
@@ -0,0 +1,101 @@
+#version 450 core

+

+#extension GL_EXT_shader_16bit_storage : enable

+

+struct S

+{

+    uint16_t  x;

+    u16vec2    y;

+    u16vec3    z;

+};

+

+layout(column_major, std140) uniform B1

+{

+    uint16_t  a;

+    u16vec2    b;

+    u16vec3    c;

+    uint16_t  d[2];

+    S          g;

+    S          h[2];

+    uint        j;

+} b1;

+

+layout(row_major, std430) buffer B2

+{

+    uint16_t  o;

+    u16vec2    p;

+    u16vec3    q;

+    uint16_t  r[2];

+    S          u;

+    S          v[2];

+    uint16_t  w[];

+} b2;

+

+struct S2 {

+    mat4x4 x;

+    uint16_t y;

+    uint z;

+};

+

+struct S3 {

+    S2 x;

+};

+

+layout(row_major, std430) buffer B3

+{

+    S2 x;

+} b3;

+

+layout(column_major, std430) buffer B4

+{

+    S2 x;

+} b4;

+

+void func3(S2 x) {

+}

+

+S2 func4() {

+    return b4.x;

+}

+

+uint func(uint16_t a) {

+    return 0;

+}

+

+struct S4 {

+    uint x;

+    uint16_t y;

+};

+

+uint func2(uint a) { return 0; }

+

+void main()

+{

+    b2.o = b2.q[1];

+    b2.p = b2.q.xy;

+    b2.o = max(b1.a, b1.a);

+    bvec2 bv = lessThan(b2.p, b2.p);

+    b2.o = b1.a + b1.a;

+    b2.o = -b1.a;

+    b2.o = b1.a + 1;

+    b2.p = b2.p.yx;

+    b4.x = b3.x;

+    uint16_t f0;

+    S2 f1;

+    S3 f2;

+    if (b1.a == b1.a) {}

+    b2.r = b2.r;

+    b2.p = u16vec2(3, 4);

+    u16vec2[2](u16vec2(uvec2(1,2)), u16vec2(uvec2(3,4)));

+    // NOT ERRORING YET

+    b3.x;

+    S4(0u, uint16_t(0u));

+    func2(b1.a);

+}

+

+

+layout(column_major, std140) uniform B6

+{

+    u16mat2x3  e;

+} b6;

+

diff --git a/Test/spv.16bitstorage_Error.frag b/Test/spv.16bitstorage_Error.frag
new file mode 100644
index 0000000..7a61a97
--- /dev/null
+++ b/Test/spv.16bitstorage_Error.frag
@@ -0,0 +1,102 @@
+#version 450 core

+

+#extension GL_EXT_shader_16bit_storage : enable

+

+struct S

+{

+    float16_t  x;

+    f16vec2    y;

+    f16vec3    z;

+};

+

+layout(column_major, std140) uniform B1

+{

+    float16_t  a;

+    f16vec2    b;

+    f16vec3    c;

+    float16_t  d[2];

+    S          g;

+    S          h[2];

+    int        j;

+} b1;

+

+layout(row_major, std430) buffer B2

+{

+    float16_t  o;

+    f16vec2    p;

+    f16vec3    q;

+    float16_t  r[2];

+    S          u;

+    S          v[2];

+    float16_t  w[];

+} b2;

+

+struct S2 {

+    mat4x4 x;

+    float16_t y;

+    float z;

+};

+

+struct S3 {

+    S2 x;

+};

+

+layout(row_major, std430) buffer B3

+{

+    S2 x;

+} b3;

+

+layout(column_major, std430) buffer B4

+{

+    S2 x;

+} b4;

+

+void func3(S2 x) {

+}

+

+S2 func4() {

+    return b4.x;

+}

+

+float func(float16_t a) {

+    return 0.0;

+}

+

+struct S4 {

+    float x;

+    float16_t y;

+};

+

+float func2(float a) { return 0.0; }

+

+void main()

+{

+    b2.o = b2.q[1];

+    b2.p = b2.q.xy;

+    b2.o = max(b1.a, b1.a);

+    bvec2 bv = lessThan(b2.p, b2.p);

+    b2.o = b1.a + b1.a;

+    b2.o = -b1.a;

+    b2.o = b1.a + 1.0;

+    b2.p = b2.p.yx;

+    b4.x = b3.x;

+    float16_t f0;

+    S2 f1;

+    S3 f2;

+    if (b1.a == b1.a) {}

+    b2.r = b2.r;

+    b2.o = 1.0HF;

+    b2.p = f16vec2(3.0, 4.0);

+    f16vec2[2](f16vec2(vec2(1.0,2.0)), f16vec2(vec2(3.0,4.0)));

+    // NOT ERRORING YET

+    b3.x;

+    S4(0.0, float16_t(0.0));

+    func2(b1.a);

+}

+

+

+layout(column_major, std140) uniform B6

+{

+    f16mat2x3  e;

+} b6;

+

diff --git a/Test/spv.310.comp b/Test/spv.310.comp
index 6cbb043..53117dd 100644
--- a/Test/spv.310.comp
+++ b/Test/spv.310.comp
@@ -37,4 +37,6 @@
     outnames.va[gl_LocalInvocationID.x] = vec4(s);
     outnames.s = outbname.uns.length();
     gl_DeviceIndex;
+    memoryBarrierShared();
+    groupMemoryBarrier();
 }
diff --git a/Test/spv.320.meshShaderUserDefined.mesh b/Test/spv.320.meshShaderUserDefined.mesh
new file mode 100644
index 0000000..60a1452
--- /dev/null
+++ b/Test/spv.320.meshShaderUserDefined.mesh
@@ -0,0 +1,59 @@
+#version 320 es
+
+#define MAX_VER  81
+#define MAX_PRIM 32
+
+#define BARRIER() \
+    memoryBarrierShared(); \
+    barrier();
+
+#extension GL_NV_mesh_shader : enable
+
+layout(local_size_x = 32) in;
+
+layout(max_vertices=MAX_VER) out;
+layout(max_primitives=MAX_PRIM) out;
+layout(triangles) out;
+
+// test use of user defined interface out blocks:
+
+// per-primitive block
+perprimitiveNV layout(location=0) out myblock {
+    float f;
+    float fArr[4];
+    vec3 pos;
+    vec4 posArr[4];
+    mat4 m;
+    mat3 mArr[2];
+} blk[];
+
+// per-vertex block
+layout(location=20) out myblock2 {
+    float f;
+    vec4 pos;
+    mat4 m;
+} blk2[];
+
+void main()
+{
+    int iid = int(gl_LocalInvocationID.x);
+    int gid = int(gl_WorkGroupID.x);
+
+    blk[iid].f               = 11.0;
+    blk[iid+1].fArr[gid]     = blk[iid].f;
+    blk[iid/2].pos.yzx       = vec3(14.0, 15.0, 13.0);
+    blk[iid*2].posArr[1].yzw = blk[iid/2].pos;
+    blk[iid/4].m[2].wzyx     = vec4(13.0, 14.0, 15.0, 16.0);
+    blk[iid].mArr[0][1][1]   = blk[iid/4].m[2].w;
+    blk[iid*4].mArr[1][gid]  = vec3(17.0, 18.0, 19.0);
+
+    BARRIER();
+
+    blk2[iid].f           = blk2[iid-1].f + 20.0;
+    blk2[iid].pos         = vec4(21.0, 22.0, 23.0, 24.0);
+    blk2[iid+1].m[gid]    = blk2[iid].pos;
+    blk2[iid+1].m[gid][2] = 29.0;
+    blk2[iid+2].m[3]      = blk2[iid+1].m[gid];
+
+    BARRIER();
+}
diff --git a/Test/spv.450.geom b/Test/spv.450.geom
index 8aefe50..3489a88 100644
--- a/Test/spv.450.geom
+++ b/Test/spv.450.geom
@@ -9,4 +9,6 @@
 void main()

 {

     gl_PointSize = gl_in[1].gl_PointSize;

+    gl_Layer = 2;

+    gl_ViewportIndex = 3;

 }

diff --git a/Test/spv.450.tesc b/Test/spv.450.tesc
index c3719f9..47b9a40 100644
--- a/Test/spv.450.tesc
+++ b/Test/spv.450.tesc
@@ -2,7 +2,7 @@
 

 layout(vertices = 4) out;

 

-patch out vec4 patchOut;

+layout(location=1) patch out vec4 patchOut;

 

 struct S {

     float sMem1;  // should not see a patch decoration

@@ -17,6 +17,7 @@
 

 void main()

 {

+    gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;
 }

 

 layout(location = 2) patch out SingleBlock {

diff --git a/Test/spv.460.comp b/Test/spv.460.comp
new file mode 100644
index 0000000..eb671a3
--- /dev/null
+++ b/Test/spv.460.comp
@@ -0,0 +1,9 @@
+#version 460

+

+void main()

+{

+    bool b1;

+    b1 = anyInvocation(b1);

+    b1 = allInvocations(b1);

+    b1 = allInvocationsEqual(b1);

+}

diff --git a/Test/spv.460.frag b/Test/spv.460.frag
new file mode 100644
index 0000000..9eb8bf4
--- /dev/null
+++ b/Test/spv.460.frag
@@ -0,0 +1,17 @@
+#version 460 core

+

+layout(binding = 0) uniform atomic_uint aui;

+uint ui;

+

+void main()

+{

+    atomicCounterAdd(aui, ui);

+    atomicCounterSubtract(aui, ui);

+    atomicCounterMin(aui, ui);

+    atomicCounterMax(aui, ui);

+    atomicCounterAnd(aui, ui);

+    atomicCounterOr(aui, ui);

+    atomicCounterXor(aui, ui);

+    atomicCounterExchange(aui, ui);

+    atomicCounterCompSwap(aui, ui, ui);

+}

diff --git a/Test/spv.460.vert b/Test/spv.460.vert
new file mode 100644
index 0000000..72d4e77
--- /dev/null
+++ b/Test/spv.460.vert
@@ -0,0 +1,6 @@
+#version 460

+

+void main()

+{

+    int a = gl_BaseVertex + gl_BaseInstance + gl_DrawID;

+}

diff --git a/Test/spv.8bitstorage-int.frag b/Test/spv.8bitstorage-int.frag
new file mode 100644
index 0000000..93203c3
--- /dev/null
+++ b/Test/spv.8bitstorage-int.frag
@@ -0,0 +1,90 @@
+#version 450 core

+

+#extension GL_EXT_shader_8bit_storage : enable

+

+struct S

+{

+    int8_t  x;

+    i8vec2    y;

+    i8vec3    z;

+};

+

+layout(column_major, std140) uniform B1

+{

+    int8_t  a;

+    i8vec2    b;

+    i8vec3    c;

+    int8_t  d[2];

+    S          g;

+    S          h[2];

+    int        j;

+} b1;

+

+layout(row_major, std430) buffer B2

+{

+    int8_t  o;

+    i8vec2    p;

+    i8vec3    q;

+    int8_t  r[2];

+    S          u;

+    S          v[2];

+    i8vec2    x[100];

+    int8_t  w[];

+} b2;

+

+layout(row_major, std140) uniform B5

+{

+    int8_t  o;

+    i8vec2    p;

+    i8vec3    q;

+    int8_t  r[2];

+    S          u;

+    S          v[2];

+    i8vec2    x[100];

+    int8_t  w[100];

+} b5;

+

+struct S2 {

+    mat4x4 x;

+    int8_t y;

+    int z;

+};

+

+struct S3 {

+    S2 x;

+};

+

+layout(row_major, std430) buffer B3

+{

+    S2 x;

+} b3;

+

+layout(column_major, std430) buffer B4

+{

+    S2 x;

+    S3 y;

+} b4;

+

+void main()

+{

+    b2.o = b1.a;

+    b2.p = i8vec2(ivec3(b2.q).xy);

+    b2.p = i8vec2(ivec3(b5.q).xy);

+    b2.r[0] = b2.r[0];

+    b2.r[1] = b5.r[1];

+    b2.p = b2.p;

+    int x0 = int(b1.a);

+    ivec4 x1 = ivec4(b1.a, b2.p, 1);

+    b4.x.x = b3.x.x;

+    b2.o = int8_t(ivec2(b2.p).x);

+    b2.p = b2.v[1].y;

+    ivec3 v3 = ivec3(b2.w[b1.j], b2.w[b1.j+1], b2.w[b1.j+2]);

+    ivec3 u3 = ivec3(b5.w[b1.j], b5.w[b1.j+1], b5.w[b1.j+2]);

+    b2.x[0] = b2.x[0];

+    b2.x[1] = b5.x[1];

+    b2.p.x = b1.a;

+    b2.o = b2.p.x;

+    b2.p = i8vec2(ivec2(1, 2));

+    b2.o = int8_t(3);

+}

+

diff --git a/Test/spv.8bitstorage-ssbo.vert b/Test/spv.8bitstorage-ssbo.vert
new file mode 100644
index 0000000..61ba7bf
--- /dev/null
+++ b/Test/spv.8bitstorage-ssbo.vert
@@ -0,0 +1,15 @@
+#version 450

+

+#extension GL_EXT_shader_8bit_storage: require

+

+layout(binding = 0) readonly buffer Vertices

+{

+    uint8_t vertices[];

+};

+

+layout(location = 0) out vec4 color;

+

+void main()

+{

+    color = vec4(int(vertices[gl_VertexIndex]));

+}

diff --git a/Test/spv.8bitstorage-ubo.vert b/Test/spv.8bitstorage-ubo.vert
new file mode 100644
index 0000000..5c49a24
--- /dev/null
+++ b/Test/spv.8bitstorage-ubo.vert
@@ -0,0 +1,15 @@
+#version 450

+

+#extension GL_EXT_shader_8bit_storage: require

+

+layout(binding = 0) readonly uniform Vertices

+{

+    uint8_t vertices[512];

+};

+

+layout(location = 0) out vec4 color;

+

+void main()

+{

+    color = vec4(int(vertices[gl_VertexIndex]));

+}

diff --git a/Test/spv.8bitstorage-uint.frag b/Test/spv.8bitstorage-uint.frag
new file mode 100644
index 0000000..574d088
--- /dev/null
+++ b/Test/spv.8bitstorage-uint.frag
@@ -0,0 +1,90 @@
+#version 450 core

+

+#extension GL_EXT_shader_8bit_storage : enable

+

+struct S

+{

+    uint8_t  x;

+    u8vec2    y;

+    u8vec3    z;

+};

+

+layout(column_major, std140) uniform B1

+{

+    uint8_t  a;

+    u8vec2    b;

+    u8vec3    c;

+    uint8_t  d[2];

+    S          g;

+    S          h[2];

+    uint        j;

+} b1;

+

+layout(row_major, std430) buffer B2

+{

+    uint8_t  o;

+    u8vec2    p;

+    u8vec3    q;

+    uint8_t  r[2];

+    S          u;

+    S          v[2];

+    u8vec2    x[100];

+    uint8_t  w[];

+} b2;

+

+layout(row_major, std140) uniform B5

+{

+    uint8_t  o;

+    u8vec2    p;

+    u8vec3    q;

+    uint8_t  r[2];

+    S          u;

+    S          v[2];

+    u8vec2    x[100];

+    uint8_t  w[100];

+} b5;

+

+struct S2 {

+    mat4x4 x;

+    uint8_t y;

+    uint z;

+};

+

+struct S3 {

+    S2 x;

+};

+

+layout(row_major, std430) buffer B3

+{

+    S2 x;

+} b3;

+

+layout(column_major, std430) buffer B4

+{

+    S2 x;

+    S3 y;

+} b4;

+

+void main()

+{

+    b2.o = b1.a;

+    b2.p = u8vec2(uvec3(b2.q).xy);

+    b2.p = u8vec2(uvec3(b5.q).xy);

+    b2.r[0] = b2.r[0];

+    b2.r[1] = b5.r[1];

+    b2.p = b2.p;

+    uint x0 = uint(b1.a);

+    uvec4 x1 = uvec4(b1.a, b2.p, 1);

+    b4.x.x = b3.x.x;

+    b2.o = uint8_t(uvec2(b2.p).x);

+    b2.p = b2.v[1].y;

+    uvec3 v3 = uvec3(b2.w[b1.j], b2.w[b1.j+1], b2.w[b1.j+2]);

+    uvec3 u3 = uvec3(b5.w[b1.j], b5.w[b1.j+1], b5.w[b1.j+2]);

+    b2.x[0] = b2.x[0];

+    b2.x[1] = b5.x[1];

+    b2.p.x = b1.a;

+    b2.o = b2.p.x;

+    b2.p = u8vec2(uvec2(1, 2));

+    b2.o = uint8_t(3u);

+}

+

diff --git a/Test/spv.8bitstorage_Error-int.frag b/Test/spv.8bitstorage_Error-int.frag
new file mode 100644
index 0000000..35fe182
--- /dev/null
+++ b/Test/spv.8bitstorage_Error-int.frag
@@ -0,0 +1,101 @@
+#version 450 core

+

+#extension GL_EXT_shader_8bit_storage : enable

+

+struct S

+{

+    int8_t  x;

+    i8vec2    y;

+    i8vec3    z;

+};

+

+layout(column_major, std140) uniform B1

+{

+    int8_t  a;

+    i8vec2    b;

+    i8vec3    c;

+    int8_t  d[2];

+    S          g;

+    S          h[2];

+    int        j;

+} b1;

+

+layout(row_major, std430) buffer B2

+{

+    int8_t  o;

+    i8vec2    p;

+    i8vec3    q;

+    int8_t  r[2];

+    S          u;

+    S          v[2];

+    int8_t  w[];

+} b2;

+

+struct S2 {

+    mat4x4 x;

+    int8_t y;

+    int z;

+};

+

+struct S3 {

+    S2 x;

+};

+

+layout(row_major, std430) buffer B3

+{

+    S2 x;

+} b3;

+

+layout(column_major, std430) buffer B4

+{

+    S2 x;

+} b4;

+

+void func3(S2 x) {

+}

+

+S2 func4() {

+    return b4.x;

+}

+

+int func(int8_t a) {

+    return 0;

+}

+

+struct S4 {

+    int x;

+    int8_t y;

+};

+

+int func2(int a) { return 0; }

+

+void main()

+{

+    b2.o = b2.q[1];

+    b2.p = b2.q.xy;

+    b2.o = max(b1.a, b1.a);

+    bvec2 bv = lessThan(b2.p, b2.p);

+    b2.o = b1.a + b1.a;

+    b2.o = -b1.a;

+    b2.o = b1.a + 1;

+    b2.p = b2.p.yx;

+    b4.x = b3.x;

+    int8_t f0;

+    S2 f1;

+    S3 f2;

+    if (b1.a == b1.a) {}

+    b2.r = b2.r;

+    b2.p = i8vec2(3, 4);

+    i8vec2[2](i8vec2(ivec2(1,2)), i8vec2(ivec2(3,4)));

+    // NOT ERRORING YET

+    b3.x;

+    S4(0, int8_t(0));

+    func2(b1.a);

+}

+

+

+layout(column_major, std140) uniform B6

+{

+    i8mat2x3  e;

+} b6;

+

diff --git a/Test/spv.8bitstorage_Error-uint.frag b/Test/spv.8bitstorage_Error-uint.frag
new file mode 100644
index 0000000..5d0209f
--- /dev/null
+++ b/Test/spv.8bitstorage_Error-uint.frag
@@ -0,0 +1,101 @@
+#version 450 core

+

+#extension GL_EXT_shader_8bit_storage : enable

+

+struct S

+{

+    uint8_t  x;

+    u8vec2    y;

+    u8vec3    z;

+};

+

+layout(column_major, std140) uniform B1

+{

+    uint8_t  a;

+    u8vec2    b;

+    u8vec3    c;

+    uint8_t  d[2];

+    S          g;

+    S          h[2];

+    uint        j;

+} b1;

+

+layout(row_major, std430) buffer B2

+{

+    uint8_t  o;

+    u8vec2    p;

+    u8vec3    q;

+    uint8_t  r[2];

+    S          u;

+    S          v[2];

+    uint8_t  w[];

+} b2;

+

+struct S2 {

+    mat4x4 x;

+    uint8_t y;

+    uint z;

+};

+

+struct S3 {

+    S2 x;

+};

+

+layout(row_major, std430) buffer B3

+{

+    S2 x;

+} b3;

+

+layout(column_major, std430) buffer B4

+{

+    S2 x;

+} b4;

+

+void func3(S2 x) {

+}

+

+S2 func4() {

+    return b4.x;

+}

+

+uint func(uint8_t a) {

+    return 0;

+}

+

+struct S4 {

+    uint x;

+    uint8_t y;

+};

+

+uint func2(uint a) { return 0; }

+

+void main()

+{

+    b2.o = b2.q[1];

+    b2.p = b2.q.xy;

+    b2.o = max(b1.a, b1.a);

+    bvec2 bv = lessThan(b2.p, b2.p);

+    b2.o = b1.a + b1.a;

+    b2.o = -b1.a;

+    b2.o = b1.a + 1;

+    b2.p = b2.p.yx;

+    b4.x = b3.x;

+    uint8_t f0;

+    S2 f1;

+    S3 f2;

+    if (b1.a == b1.a) {}

+    b2.r = b2.r;

+    b2.p = u8vec2(3, 4);

+    u8vec2[2](u8vec2(uvec2(1,2)), u8vec2(uvec2(3,4)));

+    // NOT ERRORING YET

+    b3.x;

+    S4(0u, uint8_t(0u));

+    func2(b1.a);

+}

+

+

+layout(column_major, std140) uniform B6

+{

+    u8mat2x3  e;

+} b6;

+

diff --git a/Test/spv.AnyHitShader.rahit b/Test/spv.AnyHitShader.rahit
new file mode 100644
index 0000000..c03cc2f
--- /dev/null
+++ b/Test/spv.AnyHitShader.rahit
@@ -0,0 +1,26 @@
+#version 460
+#extension GL_NV_ray_tracing : enable
+layout(location = 1) rayPayloadInNV vec4 incomingPayload;
+void main()
+{
+	uvec3 v0 = gl_LaunchIDNV;
+	uvec3 v1 = gl_LaunchSizeNV;
+	int v2 = gl_PrimitiveID;
+	int v3 = gl_InstanceID;
+	int v4 = gl_InstanceCustomIndexNV;
+	vec3 v5 = gl_WorldRayOriginNV;
+	vec3 v6 = gl_WorldRayDirectionNV;
+	vec3 v7 = gl_ObjectRayOriginNV;
+	vec3 v8 = gl_ObjectRayDirectionNV;
+	float v9 = gl_RayTminNV;
+	float v10 = gl_RayTmaxNV;
+	float v11 = gl_HitTNV;
+	uint v12 = gl_HitKindNV;
+	mat4x3 v13 = gl_ObjectToWorldNV;
+	mat4x3 v14 = gl_WorldToObjectNV;
+	incomingPayload = vec4(0.5f);
+	if (v2 == 1)
+	    ignoreIntersectionNV();
+	else
+	    terminateRayNV();
+}
diff --git a/Test/spv.AnyHitShader_Errors.rahit b/Test/spv.AnyHitShader_Errors.rahit
new file mode 100644
index 0000000..952461e
--- /dev/null
+++ b/Test/spv.AnyHitShader_Errors.rahit
@@ -0,0 +1,11 @@
+#version 460
+#extension GL_NV_ray_tracing : enable
+hitAttributeNV vec4 payload;                               
+layout(binding = 0, set = 0) uniform accelerationStructureNV accNV;
+
+void main()
+{
+    payload.x = 1.0f;                                       // ERROR, cannot write to hitattributeNV in stage
+    reportIntersectionNV(1.0, 1U);                          // ERROR, unsupported builtin in stage
+    traceNV(accNV, 0, 0, 1, 1, 0, vec3(0.0f), 0.5f, vec3(1.0f), 0.75f, 0); // ERROR, unsupported builtin in stage
+}
diff --git a/Test/spv.ClosestHitShader.rchit b/Test/spv.ClosestHitShader.rchit
new file mode 100644
index 0000000..7a09b80
--- /dev/null
+++ b/Test/spv.ClosestHitShader.rchit
@@ -0,0 +1,24 @@
+#version 460
+#extension GL_NV_ray_tracing : enable
+layout(binding = 0, set = 0) uniform accelerationStructureNV accNV;
+layout(location = 0) rayPayloadNV vec4 localPayload;
+layout(location = 1) rayPayloadInNV vec4 incomingPayload;
+void main()
+{
+	uvec3 v0 = gl_LaunchIDNV;
+	uvec3 v1 = gl_LaunchSizeNV;
+	int v2 = gl_PrimitiveID;
+	int v3 = gl_InstanceID;
+	int v4 = gl_InstanceCustomIndexNV;
+	vec3 v5 = gl_WorldRayOriginNV;
+	vec3 v6 = gl_WorldRayDirectionNV;
+	vec3 v7 = gl_ObjectRayOriginNV;
+	vec3 v8 = gl_ObjectRayDirectionNV;
+	float v9 = gl_RayTminNV;
+	float v10 = gl_RayTmaxNV;
+	float v11 = gl_HitTNV;
+	uint v12 = gl_HitKindNV;
+	mat4x3 v13 = gl_ObjectToWorldNV;
+	mat4x3 v14 = gl_WorldToObjectNV;
+	traceNV(accNV, 0u, 1u, 2u, 3u, 0u, vec3(0.5f), 0.5f, vec3(1.0f), 0.75f, 1);
+}
diff --git a/Test/spv.ClosestHitShader_Errors.rchit b/Test/spv.ClosestHitShader_Errors.rchit
new file mode 100644
index 0000000..b7b421e
--- /dev/null
+++ b/Test/spv.ClosestHitShader_Errors.rchit
@@ -0,0 +1,12 @@
+#version 460
+#extension GL_NV_ray_tracing : enable
+hitAttributeNV vec4 payload;
+layout(binding = 0, set = 0) uniform accelerationStructureNV accNV;
+
+void main()
+{
+    payload.x = 1.0f;                                       // ERROR, cannot write to hitattributeNV in stage
+    reportIntersectionNV(1.0, 1U);                          // ERROR, unsupported builtin in stage 
+    terminateRayNV();
+    ignoreIntersectionNV();
+}
diff --git a/Test/spv.IntersectShader.rint b/Test/spv.IntersectShader.rint
new file mode 100644
index 0000000..85ec319
--- /dev/null
+++ b/Test/spv.IntersectShader.rint
@@ -0,0 +1,21 @@
+#version 460
+#extension GL_NV_ray_tracing : enable
+hitAttributeNV vec4 iAttr;
+void main()
+{
+	uvec3 v0 = gl_LaunchIDNV;
+	uvec3 v1 = gl_LaunchSizeNV;
+	int v2 = gl_PrimitiveID;
+	int v3 = gl_InstanceID;
+	int v4 = gl_InstanceCustomIndexNV;
+	vec3 v5 = gl_WorldRayOriginNV;
+	vec3 v6 = gl_WorldRayDirectionNV;
+	vec3 v7 = gl_ObjectRayOriginNV;
+	vec3 v8 = gl_ObjectRayDirectionNV;
+	float v9 = gl_RayTminNV;
+	float v10 = gl_RayTmaxNV;
+	mat4x3 v11 = gl_ObjectToWorldNV;
+	mat4x3 v12 = gl_WorldToObjectNV;
+	iAttr = vec4(0.5f,0.5f,0.0f,1.0f);
+	reportIntersectionNV(0.5, 1U);
+}
diff --git a/Test/spv.IntersectShader_Errors.rint b/Test/spv.IntersectShader_Errors.rint
new file mode 100644
index 0000000..fbc6846
--- /dev/null
+++ b/Test/spv.IntersectShader_Errors.rint
@@ -0,0 +1,11 @@
+#version 460
+#extension GL_NV_ray_tracing : enable
+rayPayloadInNV vec4 payloadIn;                             // ERROR, rayPayloadIn unsupported in this stage
+rayPayloadNV vec4 payload;                                 // ERROR, rayPayload unsuppoted in this stage
+uniform accelerationStructureNV accNV;
+void main()
+{
+    float e12 = gl_HitTNV;                                 // ERROR, unsupported builtin in stage
+    float e13 = gl_HitKindNV;                              // ERROR, unsupported builtin in stage
+    traceNV(accNV, 0, 0, 1, 1, 0, vec3(0.0f), 0.5f, vec3(1.0f), 0.75f, 0); // ERROR, unsupported
+}
diff --git a/Test/spv.MissShader.rmiss b/Test/spv.MissShader.rmiss
new file mode 100644
index 0000000..06113de
--- /dev/null
+++ b/Test/spv.MissShader.rmiss
@@ -0,0 +1,17 @@
+#version 460
+#extension GL_NV_ray_tracing : enable
+layout(binding = 0, set = 0) uniform accelerationStructureNV accNV;
+layout(location = 0) rayPayloadNV vec4 localPayload;
+layout(location = 1) rayPayloadInNV vec4 incomingPayload;
+void main()
+{
+	uvec3 v0 = gl_LaunchIDNV;
+	uvec3 v1 = gl_LaunchSizeNV;
+	vec3 v2 = gl_WorldRayOriginNV;
+	vec3 v3 = gl_WorldRayDirectionNV;
+	vec3 v4 = gl_ObjectRayOriginNV;
+	vec3 v5 = gl_ObjectRayDirectionNV;
+	float v6 = gl_RayTminNV;
+	float v7 = gl_RayTmaxNV;
+	traceNV(accNV, 0u, 1u, 2u, 3u, 0u, vec3(0.5f), 0.5f, vec3(1.0f), 0.75f, 1);
+}
diff --git a/Test/spv.MissShader_Errors.rmiss b/Test/spv.MissShader_Errors.rmiss
new file mode 100644
index 0000000..a7f7c59
--- /dev/null
+++ b/Test/spv.MissShader_Errors.rmiss
@@ -0,0 +1,16 @@
+#version 460
+#extension GL_NV_ray_tracing : enable
+hitAttributeNV vec4 payload;                               // ERROR, hitattributeNV unsupported in this stage 
+void main()
+{
+    int e0 = gl_PrimitiveID;                               // ERROR, unsupported builtin in stage
+    int e1 = gl_InstanceID;                                // ERROR, unsupported builtin in stage
+    int e3 = gl_InstanceCustomIndexNV;                     // ERROR, unsupported builtin in stage
+    mat4x3 e10 = gl_ObjectToWorldNV;                       // ERROR, unsupported builtin in stage
+    mat4x3 e11 = gl_WorldToObjectNV;                       // ERROR, unsupported builtin in stage
+    float e12 = gl_HitTNV;                                 // ERROR, unsupported builtin in stage
+    float e13 = gl_HitKindNV;                              // ERROR, unsupported builtin in stage
+    reportIntersectionNV(1.0, 1U);                         // ERROR, unsupported builtin in stage
+    ignoreIntersectionNV();                                // ERROR, unsupported builtin in stage
+    terminateRayNV();                                      // ERROR, unsupported builtin in stage
+}
diff --git a/Test/spv.OVR_multiview.vert b/Test/spv.OVR_multiview.vert
new file mode 100644
index 0000000..c81a4d9
--- /dev/null
+++ b/Test/spv.OVR_multiview.vert
@@ -0,0 +1,9 @@
+#version 330
+
+#extension GL_OVR_multiview : enable
+
+layout(num_views = 2) in;
+
+void main() {
+    gl_Position = vec4(gl_ViewID_OVR, 0, 0, 0);
+}
diff --git a/Test/spv.RayCallable.rcall b/Test/spv.RayCallable.rcall
new file mode 100644
index 0000000..12f2884
--- /dev/null
+++ b/Test/spv.RayCallable.rcall
@@ -0,0 +1,15 @@
+#version 460
+#extension GL_NV_ray_tracing : enable
+layout(location = 0) callableDataNV vec4 data0;
+layout(location = 1) callableDataInNV dataBlock {
+	uint data1;
+};
+void main()
+{
+	uvec3 id = gl_LaunchIDNV;
+	uvec3 size = gl_LaunchSizeNV;
+    uint curFlags = gl_IncomingRayFlagsNV;
+	curFlags = curFlags & gl_RayFlagsOpaqueNV;
+	data1 = 256U;
+	executeCallableNV(2,1);
+}
diff --git a/Test/spv.RayCallable_Errors.rcall b/Test/spv.RayCallable_Errors.rcall
new file mode 100644
index 0000000..7339682
--- /dev/null
+++ b/Test/spv.RayCallable_Errors.rcall
@@ -0,0 +1,25 @@
+#version 460
+#extension GL_NV_ray_tracing : enable
+hitAttributeNV vec4 hitattr;                                // ERROR, hitattributeNV unsupported in this stage 
+rayPayloadNV vec4 payload;                                  // ERROR, rayPayloadNV unsupported in this stage
+rayPayloadInNV vec4 payloadIn;                              // ERROR, rayPayloadInNV unsupported in this stage
+
+void main()
+{
+    int e0 = gl_PrimitiveID;                                // ERROR, unsupported builtin in stage
+    int e1 = gl_InstanceID;                                 // ERROR, unsupported builtin in stage
+    int e3 = gl_InstanceCustomIndexNV;                      // ERROR, unsupported builtin in stage
+    vec3 e4 = gl_WorldRayOriginNV;                          // ERROR, unsupported builtin in stage
+    vec3 e5 = gl_WorldRayDirectionNV;                       // ERROR, unsupported builtin in stage
+    vec3 e6 = gl_ObjectRayOriginNV;                         // ERROR, unsupported builtin in stage
+    vec3 e7 = gl_ObjectRayDirectionNV;                      // ERROR, unsupported builtin in stage
+    float e8 = gl_RayTminNV;                                // ERROR, unsupported builtin in stage
+    float e9 = gl_RayTmaxNV;                                // ERROR, unsupported builtin in stage
+    mat4x3 e10 = gl_ObjectToWorldNV;                        // ERROR, unsupported builtin in stage
+    mat4x3 e11 = gl_WorldToObjectNV;                        // ERROR, unsupported builtin in stage
+    float e12 = gl_HitTNV;                                  // ERROR, unsupported builtin in stage
+    float e13 = gl_HitKindNV;                               // ERROR, unsupported builtin in stage
+    reportIntersectionNV(1.0, 1U);                          // ERROR, unsupported builtin in stage
+    ignoreIntersectionNV();                                 // ERROR, unsupported builtin in stage
+    terminateRayNV();                                       // ERROR, unsupported builtin in stage
+}
diff --git a/Test/spv.RayConstants.rgen b/Test/spv.RayConstants.rgen
new file mode 100644
index 0000000..b8ff5d5
--- /dev/null
+++ b/Test/spv.RayConstants.rgen
@@ -0,0 +1,15 @@
+#version 460
+#extension GL_NV_ray_tracing : enable
+layout(binding = 0, set = 0) uniform accelerationStructureNV accNV;
+layout(location = 0) rayPayloadNV vec4 payload;
+void main()
+{
+    const uint rayFlags = gl_RayFlagsNoneNV | gl_RayFlagsOpaqueNV |
+                          gl_RayFlagsNoOpaqueNV | gl_RayFlagsTerminateOnFirstHitNV |
+                          gl_RayFlagsSkipClosestHitShaderNV | gl_RayFlagsCullBackFacingTrianglesNV |
+                          gl_RayFlagsCullFrontFacingTrianglesNV | gl_RayFlagsCullOpaqueNV | 
+                          gl_RayFlagsCullNoOpaqueNV;
+
+    const int payloadId = 1;
+    traceNV(accNV, rayFlags, 0, 1, 1, 0, vec3(0.0f), 0.5f, vec3(1.0f), 0.75f, payloadId);
+}
diff --git a/Test/spv.RayGenShader.rgen b/Test/spv.RayGenShader.rgen
new file mode 100644
index 0000000..68f92b2
--- /dev/null
+++ b/Test/spv.RayGenShader.rgen
@@ -0,0 +1,19 @@
+#version 460
+#extension GL_NV_ray_tracing : enable
+layout(binding = 0, set = 0) uniform accelerationStructureNV accNV;
+layout(location = 0) rayPayloadNV vec4 payload;
+layout(shaderRecordNV) buffer block
+{
+	float arr[4];
+	vec4 pad;
+};
+void main()
+{
+    uint lx = gl_LaunchIDNV.x;
+    uint ly = gl_LaunchIDNV.y;
+    uint sx = gl_LaunchSizeNV.x;
+    uint sy = gl_LaunchSizeNV.y;
+    traceNV(accNV, lx, ly, sx, sy, 0u, vec3(0.0f), 0.5f, vec3(1.0f), 0.75f, 1);
+    arr[3] = 1.0f;
+    pad = payload;
+}
diff --git a/Test/spv.RayGenShader_Errors.rgen b/Test/spv.RayGenShader_Errors.rgen
new file mode 100644
index 0000000..d61ac21
--- /dev/null
+++ b/Test/spv.RayGenShader_Errors.rgen
@@ -0,0 +1,40 @@
+#version 460
+#extension GL_NV_ray_tracing : enable
+hitAttributeNV vec4 payload;                                // ERROR, hitattributeNV unsupported in this stage 
+rayPayloadInNV vec4 payloadIn;                              // ERROR, rayPayloadIn unsupported in this stage
+layout(shaderRecordNV) uniform ublock                       // ERROR, shaderRecordNV unsupported on uniform blocks
+{
+    float a;
+};
+layout(binding = 0, shaderRecordNV) buffer bblock {         // ERROR, binding unsupported on shaderRecordNV blocks
+    float b;
+};
+layout(set = 0, shaderRecordNV) buffer bblock2 {            // ERROR, set unsupported on shaderRecordNV blocks
+    float c;
+};
+layout(shaderRecordNV) buffer bblock3 {
+    float d;
+};
+layout(shaderRecordNV) buffer bblock4 {                     // ERROR, cannot have more than one shaderRecordNVX block
+    float e;
+};
+void main()
+{
+    accelerationStructureNV a = 0;
+    int e0 = gl_PrimitiveID;                                // ERROR, unsupported builtin in stage
+    int e1 = gl_InstanceID;                                 // ERROR, unsupported builtin in stage
+    int e3 = gl_InstanceCustomIndexNV;                      // ERROR, unsupported builtin in stage
+    vec3 e4 = gl_WorldRayOriginNV;                          // ERROR, unsupported builtin in stage
+    vec3 e5 = gl_WorldRayDirectionNV;                       // ERROR, unsupported builtin in stage
+    vec3 e6 = gl_ObjectRayOriginNV;                         // ERROR, unsupported builtin in stage
+    vec3 e7 = gl_ObjectRayDirectionNV;                      // ERROR, unsupported builtin in stage
+    float e8 = gl_RayTminNV;                                // ERROR, unsupported builtin in stage
+    float e9 = gl_RayTmaxNV;                                // ERROR, unsupported builtin in stage
+    mat4x3 e10 = gl_ObjectToWorldNV;                        // ERROR, unsupported builtin in stage
+    mat4x3 e11 = gl_WorldToObjectNV;                        // ERROR, unsupported builtin in stage
+    float e12 = gl_HitTNV;                                  // ERROR, unsupported builtin in stage
+    float e13 = gl_HitKindNV;                               // ERROR, unsupported builtin in stage
+    reportIntersectionNV(1.0, 1U);                          // ERROR, unsupported builtin in stage
+    ignoreIntersectionNV();                                 // ERROR, unsupported builtin in stage
+    terminateRayNV();                                       // ERROR, unsupported builtin in stage
+}
diff --git a/Test/spv.accessChain.frag b/Test/spv.accessChain.frag
index c7f805b..3f4929b 100644
--- a/Test/spv.accessChain.frag
+++ b/Test/spv.accessChain.frag
@@ -74,6 +74,11 @@
     OutColor.zy[comp] += i.color.x;

 }

 

+void GetColor14(const S i, int comp)

+{ 

+    OutColor.zyx[comp] = i.color.x;

+}

+

 void main()

 {

     S s;

@@ -91,4 +96,5 @@
     GetColor11(s, u);

     GetColor12(s, u);

     GetColor13(s, u);

+    GetColor14(s, u);

 }

diff --git a/Test/spv.arbPostDepthCoverage.frag b/Test/spv.arbPostDepthCoverage.frag
new file mode 100644
index 0000000..03b61cb
--- /dev/null
+++ b/Test/spv.arbPostDepthCoverage.frag
@@ -0,0 +1,13 @@
+#version 450

+

+#extension GL_ARB_post_depth_coverage : enable

+#extension GL_EXT_post_depth_coverage : enable //according to ARB_post_depth_coverage, 

+                                               //if both enabled, this one should be ignored

+precision highp int;

+layout(post_depth_coverage) in;

+

+layout (location = 0) out int readSampleMaskIn;

+

+void main () {

+    readSampleMaskIn = gl_SampleMaskIn[0];

+}

diff --git a/Test/spv.arbPostDepthCoverage_Error.frag b/Test/spv.arbPostDepthCoverage_Error.frag
new file mode 100644
index 0000000..652933b
--- /dev/null
+++ b/Test/spv.arbPostDepthCoverage_Error.frag
@@ -0,0 +1,12 @@
+#version 310 es

+

+#extension GL_ARB_post_depth_coverage : enable

+

+precision highp float;

+

+layout(post_depth_coverage, location = 0) in float a;  // should fail since post_depth_coverage may only

+                                                       // be declared on in only (not with variable declarations)

+

+void main () {

+

+}

diff --git a/Test/spv.atomicInt64.comp b/Test/spv.atomicInt64.comp
new file mode 100644
index 0000000..baca4ce
--- /dev/null
+++ b/Test/spv.atomicInt64.comp
@@ -0,0 +1,79 @@
+#version 450 core

+

+#extension GL_ARB_gpu_shader_int64: enable

+#extension GL_NV_shader_atomic_int64: enable

+

+layout(local_size_x = 16, local_size_y = 16) in;

+

+layout(binding = 0) buffer Buffer

+{

+    int64_t  i64;

+    uint64_t u64;

+} buf;

+

+struct Struct

+{

+    int64_t  i64;

+    uint64_t u64;

+};

+

+shared Struct s;

+

+void main()

+{

+    const int64_t  i64c = -24;

+    const uint64_t u64c = 0xF00000000Ful; 

+

+    // Test shader storage block

+    int64_t  i64 = 0;

+    uint64_t u64 = 0;

+

+    i64 += atomicMin(buf.i64, i64c);

+    u64 += atomicMin(buf.u64, u64c);

+

+    i64 += atomicMax(buf.i64, i64c);

+    u64 += atomicMax(buf.u64, u64c);

+

+    i64 += atomicAnd(buf.i64, i64c);

+    u64 += atomicAnd(buf.u64, u64c);

+

+    i64 += atomicOr(buf.i64, i64c);

+    u64 += atomicOr(buf.u64, u64c);

+

+    i64 += atomicXor(buf.i64, i64c);

+    u64 += atomicXor(buf.u64, u64c);

+

+    i64 += atomicAdd(buf.i64, i64c);

+    i64 += atomicExchange(buf.i64, i64c);

+    i64 += atomicCompSwap(buf.i64, i64c, i64);

+

+    buf.i64 = i64;

+    buf.u64 = u64;

+

+    // Test shared variable

+    i64 = 0;

+    u64 = 0;

+

+    i64 += atomicMin(s.i64, i64c);

+    u64 += atomicMin(s.u64, u64c);

+

+    i64 += atomicMax(s.i64, i64c);

+    u64 += atomicMax(s.u64, u64c);

+

+    i64 += atomicAnd(s.i64, i64c);

+    u64 += atomicAnd(s.u64, u64c);

+

+    i64 += atomicOr(s.i64, i64c);

+    u64 += atomicOr(s.u64, u64c);

+

+    i64 += atomicXor(s.i64, i64c);

+    u64 += atomicXor(s.u64, u64c);

+

+    i64 += atomicAdd(s.i64, i64c);

+    i64 += atomicExchange(s.i64, i64c);

+    i64 += atomicCompSwap(s.i64, i64c, i64);

+

+    s.i64 = i64;

+    s.u64 = u64;

+}

+

diff --git a/Test/spv.barrier.vert b/Test/spv.barrier.vert
new file mode 100644
index 0000000..c7828ce
--- /dev/null
+++ b/Test/spv.barrier.vert
@@ -0,0 +1,15 @@
+#version 450

+

+layout(location=0) out vec4 c0;

+layout(location=1) out vec4 c1;

+

+void main()

+{

+    c0 = vec4(1.0);

+    memoryBarrier();

+    c1 = vec4(1.0);

+    memoryBarrierBuffer();

+    ++c0;

+    memoryBarrierImage();

+    ++c0;

+}
\ No newline at end of file
diff --git a/Test/spv.builtInXFB.vert b/Test/spv.builtInXFB.vert
new file mode 100644
index 0000000..619bc1e
--- /dev/null
+++ b/Test/spv.builtInXFB.vert
@@ -0,0 +1,15 @@
+#version 450

+

+layout(xfb_buffer = 1, xfb_stride = 64) out;

+

+layout (xfb_buffer = 1, xfb_offset = 16) out gl_PerVertex

+{

+    float gl_PointSize;

+    vec4 gl_Position;

+};

+

+void main()

+{

+    gl_Position = vec4(1.0);

+    gl_PointSize = 2.0;

+}
\ No newline at end of file
diff --git a/Test/spv.computeShaderDerivatives.comp b/Test/spv.computeShaderDerivatives.comp
new file mode 100644
index 0000000..884f14d
--- /dev/null
+++ b/Test/spv.computeShaderDerivatives.comp
@@ -0,0 +1,106 @@
+#version 450
+#extension GL_NV_compute_shader_derivatives : require
+
+layout (local_size_x = 2, local_size_y = 4) in;
+layout(derivative_group_quadsNV) in;
+
+buffer block {
+  float fDerivativeX;
+  float fDerivativeY;
+  float fDerivativeWidth;
+  float fCoarseDerivativeX;
+  float fCoarseDerivativeY;
+  float fCoarseDerivativeWidth;
+  float fFineDerivativeX;
+  float fFineDerivativeY;
+  float fFineDerivativeWidth;
+  
+  float fX;
+  float fY;
+  
+  
+  vec2 v2DerivativeX;
+  vec2 v2DerivativeY;
+  vec2 v2DerivativeWidth;
+  vec2 v2CoarseDerivativeX;
+  vec2 v2CoarseDerivativeY;
+  vec2 v2CoarseDerivativeWidth;
+  vec2 v2FineDerivativeX;
+  vec2 v2FineDerivativeY;
+  vec2 v2FineDerivativeWidth;
+  
+  vec2 v2X;
+  vec2 v2Y;
+  
+  
+  vec3 v3DerivativeX;
+  vec3 v3DerivativeY;
+  vec3 v3DerivativeWidth;
+  vec3 v3CoarseDerivativeX;
+  vec3 v3CoarseDerivativeY;
+  vec3 v3CoarseDerivativeWidth;
+  vec3 v3FineDerivativeX;
+  vec3 v3FineDerivativeY;
+  vec3 v3FineDerivativeWidth;
+  
+  vec3 v3X;
+  vec3 v3Y;
+  
+  
+  vec4 v4DerivativeX;
+  vec4 v4DerivativeY;
+  vec4 v4DerivativeWidth;
+  vec4 v4CoarseDerivativeX;
+  vec4 v4CoarseDerivativeY;
+  vec4 v4CoarseDerivativeWidth;
+  vec4 v4FineDerivativeX;
+  vec4 v4FineDerivativeY;
+  vec4 v4FineDerivativeWidth;
+  
+  vec4 v4X;
+  vec4 v4Y;
+};
+
+void main(){
+    fDerivativeX = dFdx(fX);
+    fDerivativeY = dFdy(fY);
+    fDerivativeWidth = fwidth(fX);
+    fCoarseDerivativeX = dFdxCoarse(fX);
+    fCoarseDerivativeY = dFdyCoarse(fY);
+    fCoarseDerivativeWidth = fwidthCoarse(fX);
+    fFineDerivativeX = dFdxFine(fX);
+    fFineDerivativeY = dFdyFine(fY);
+    fFineDerivativeWidth = fwidthFine(fX);
+
+    v2DerivativeX = dFdx(v2X);
+    v2DerivativeY = dFdy(v2Y);
+    v2DerivativeWidth = fwidth(v2X);
+    v2CoarseDerivativeX = dFdxCoarse(v2X);
+    v2CoarseDerivativeY = dFdyCoarse(v2Y);
+    v2CoarseDerivativeWidth = fwidthCoarse(v2X);
+    v2FineDerivativeX = dFdxFine(v2X);
+    v2FineDerivativeY = dFdyFine(v2Y);
+    v2FineDerivativeWidth = fwidthFine(v2X);
+
+
+    v3DerivativeX = dFdx(v3X);
+    v3DerivativeY = dFdy(v3Y);
+    v3DerivativeWidth = fwidth(v3X);
+    v3CoarseDerivativeX = dFdxCoarse(v3X);
+    v3CoarseDerivativeY = dFdyCoarse(v3Y);
+    v3CoarseDerivativeWidth = fwidthCoarse(v3X);
+    v3FineDerivativeX = dFdxFine(v3X);
+    v3FineDerivativeY = dFdyFine(v3Y);
+    v3FineDerivativeWidth = fwidthFine(v3X);
+
+
+    v4DerivativeX = dFdx(v4X);
+    v4DerivativeY = dFdy(v4Y);
+    v4DerivativeWidth = fwidth(v4X);
+    v4CoarseDerivativeX = dFdxCoarse(v4X);
+    v4CoarseDerivativeY = dFdyCoarse(v4Y);
+    v4CoarseDerivativeWidth = fwidthCoarse(v4X);
+    v4FineDerivativeX = dFdxFine(v4X);
+    v4FineDerivativeY = dFdyFine(v4Y);
+    v4FineDerivativeWidth = fwidthFine(v4X);
+}
diff --git a/Test/spv.computeShaderDerivatives2.comp b/Test/spv.computeShaderDerivatives2.comp
new file mode 100644
index 0000000..f964fdd
--- /dev/null
+++ b/Test/spv.computeShaderDerivatives2.comp
@@ -0,0 +1,106 @@
+#version 320 es
+#extension GL_NV_compute_shader_derivatives : require
+
+layout (local_size_x = 2, local_size_y = 4) in;
+layout(derivative_group_linearNV) in;
+
+buffer block {
+  float fDerivativeX;
+  float fDerivativeY;
+  float fDerivativeWidth;
+  float fCoarseDerivativeX;
+  float fCoarseDerivativeY;
+  float fCoarseDerivativeWidth;
+  float fFineDerivativeX;
+  float fFineDerivativeY;
+  float fFineDerivativeWidth;
+  
+  float fX;
+  float fY;
+  
+  
+  vec2 v2DerivativeX;
+  vec2 v2DerivativeY;
+  vec2 v2DerivativeWidth;
+  vec2 v2CoarseDerivativeX;
+  vec2 v2CoarseDerivativeY;
+  vec2 v2CoarseDerivativeWidth;
+  vec2 v2FineDerivativeX;
+  vec2 v2FineDerivativeY;
+  vec2 v2FineDerivativeWidth;
+  
+  vec2 v2X;
+  vec2 v2Y;
+  
+  
+  vec3 v3DerivativeX;
+  vec3 v3DerivativeY;
+  vec3 v3DerivativeWidth;
+  vec3 v3CoarseDerivativeX;
+  vec3 v3CoarseDerivativeY;
+  vec3 v3CoarseDerivativeWidth;
+  vec3 v3FineDerivativeX;
+  vec3 v3FineDerivativeY;
+  vec3 v3FineDerivativeWidth;
+  
+  vec3 v3X;
+  vec3 v3Y;
+  
+  
+  vec4 v4DerivativeX;
+  vec4 v4DerivativeY;
+  vec4 v4DerivativeWidth;
+  vec4 v4CoarseDerivativeX;
+  vec4 v4CoarseDerivativeY;
+  vec4 v4CoarseDerivativeWidth;
+  vec4 v4FineDerivativeX;
+  vec4 v4FineDerivativeY;
+  vec4 v4FineDerivativeWidth;
+  
+  vec4 v4X;
+  vec4 v4Y;
+};
+
+void main(){
+    fDerivativeX = dFdx(fX);
+    fDerivativeY = dFdy(fY);
+    fDerivativeWidth = fwidth(fX);
+    fCoarseDerivativeX = dFdxCoarse(fX);
+    fCoarseDerivativeY = dFdyCoarse(fY);
+    fCoarseDerivativeWidth = fwidthCoarse(fX);
+    fFineDerivativeX = dFdxFine(fX);
+    fFineDerivativeY = dFdyFine(fY);
+    fFineDerivativeWidth = fwidthFine(fX);
+
+    v2DerivativeX = dFdx(v2X);
+    v2DerivativeY = dFdy(v2Y);
+    v2DerivativeWidth = fwidth(v2X);
+    v2CoarseDerivativeX = dFdxCoarse(v2X);
+    v2CoarseDerivativeY = dFdyCoarse(v2Y);
+    v2CoarseDerivativeWidth = fwidthCoarse(v2X);
+    v2FineDerivativeX = dFdxFine(v2X);
+    v2FineDerivativeY = dFdyFine(v2Y);
+    v2FineDerivativeWidth = fwidthFine(v2X);
+
+
+    v3DerivativeX = dFdx(v3X);
+    v3DerivativeY = dFdy(v3Y);
+    v3DerivativeWidth = fwidth(v3X);
+    v3CoarseDerivativeX = dFdxCoarse(v3X);
+    v3CoarseDerivativeY = dFdyCoarse(v3Y);
+    v3CoarseDerivativeWidth = fwidthCoarse(v3X);
+    v3FineDerivativeX = dFdxFine(v3X);
+    v3FineDerivativeY = dFdyFine(v3Y);
+    v3FineDerivativeWidth = fwidthFine(v3X);
+
+
+    v4DerivativeX = dFdx(v4X);
+    v4DerivativeY = dFdy(v4Y);
+    v4DerivativeWidth = fwidth(v4X);
+    v4CoarseDerivativeX = dFdxCoarse(v4X);
+    v4CoarseDerivativeY = dFdyCoarse(v4Y);
+    v4CoarseDerivativeWidth = fwidthCoarse(v4X);
+    v4FineDerivativeX = dFdxFine(v4X);
+    v4FineDerivativeY = dFdyFine(v4Y);
+    v4FineDerivativeWidth = fwidthFine(v4X);
+}
diff --git a/Test/spv.constStruct.vert b/Test/spv.constStruct.vert
new file mode 100644
index 0000000..d5dd8da
--- /dev/null
+++ b/Test/spv.constStruct.vert
@@ -0,0 +1,22 @@
+#version 450

+

+precision highp float;

+

+struct U {

+    mat2 m;

+};

+

+struct T {

+    mat2 m;

+};

+

+struct S {

+    T t;

+    U u;

+};

+

+void main()

+{

+    S s1 = S(T(mat2(1.0)), U(mat2(1.0)));

+    S s2 = S(T(mat2(1.0)), U(mat2(1.0)));

+}

diff --git a/Test/spv.controlFlowAttributes.frag b/Test/spv.controlFlowAttributes.frag
new file mode 100644
index 0000000..6d90c0d
--- /dev/null
+++ b/Test/spv.controlFlowAttributes.frag
@@ -0,0 +1,39 @@
+#version 450
+
+#extension GL_EXT_control_flow_attributes : enable
+
+bool cond;
+
+void main()
+{
+        [[unroll]]                 for (int i = 0; i < 8; ++i) { }
+        [[loop]]                   for (;;) { }
+        [[dont_unroll]]            while(true) {  }
+        [[dependency_infinite]]    do {  } while(true);
+        [[dependency_length(1+3)]] for (int i = 0; i < 8; ++i) { }
+        [[flatten]]                if (cond) { } else { }
+        [[branch]]                 if (cond) cond = false;
+        [[dont_flatten]]           switch(3) {  }                      // dropped
+        [[dont_flatten]]           switch(3) { case 3: break; }
+
+        // warnings on all these
+        [[unroll(2)]]              for (int i = 0; i < 8; ++i) { }
+        [[dont_unroll(-2)]]        while(true) {  }
+        [[dependency_infinite(3)]] do {  } while(true);
+        [[dependency_length]]      for (int i = 0; i < 8; ++i) { }
+        [[flatten(3)]]             if (cond) { } else { }
+        [[branch(5.2)]]            if (cond) cond = false;
+        [[dont_flatten(3 + 7)]]    switch(3) { case 3: break; }
+
+        // other valid uses
+        [[ unroll, dont_unroll, dependency_length(2) ]]  while(cond) {  }
+        [ [ dont_flatten , branch ] ]                    switch(3) { case 3: break; }
+        [
+            // attribute
+            [
+                // here
+                flatten
+            ]
+        ]                       if (cond) { } else { }
+        [[ dependency_length(2), dependency_infinite ]]  while(cond) {  }
+}
diff --git a/Test/spv.debugInfo.frag b/Test/spv.debugInfo.frag
new file mode 100644
index 0000000..3b6cd27
--- /dev/null
+++ b/Test/spv.debugInfo.frag
@@ -0,0 +1,52 @@
+#version 450

+

+struct S {

+    int a;

+};

+

+uniform ubuf {

+    S s;

+};

+

+uniform sampler2D s2d;

+

+layout(location = 0) in vec4 inv;

+layout(location = 0) out vec4 outv;

+

+vec4 foo(S s)

+{

+    vec4 r = s.a * inv;

+    ++r;

+    if (r.x > 3.0)

+        --r;

+    else

+        r *= 2;

+

+    return r;

+}

+

+void main()

+{

+    outv = foo(s);

+    outv += texture(s2d, vec2(0.5));

+

+    switch (s.a) {

+    case 10:

+        ++outv;

+        break;

+    case 20:

+        outv = 2 * outv;

+        ++outv;

+        break;

+    default:

+        --outv;

+        break;

+    }

+

+    for (int i = 0; i < 10; ++i)

+        outv *= 3.0;

+

+    outv.x < 10.0 ?

+        outv = sin(outv) :

+        outv = cos(outv);

+}
\ No newline at end of file
diff --git a/Test/spv.explicittypes.frag b/Test/spv.explicittypes.frag
new file mode 100644
index 0000000..9941ea0
--- /dev/null
+++ b/Test/spv.explicittypes.frag
@@ -0,0 +1,334 @@
+#version 450
+
+#extension GL_EXT_shader_explicit_arithmetic_types: enable
+#extension GL_EXT_shader_explicit_arithmetic_types_int8: require
+#extension GL_EXT_shader_explicit_arithmetic_types_int16: require
+#extension GL_EXT_shader_explicit_arithmetic_types_int32: require
+#extension GL_EXT_shader_explicit_arithmetic_types_int64: require
+#extension GL_EXT_shader_explicit_arithmetic_types_float16: require
+#extension GL_EXT_shader_explicit_arithmetic_types_float32: require
+#extension GL_EXT_shader_explicit_arithmetic_types_float64: require
+
+layout(binding = 0) uniform Uniforms
+{
+    uint index;
+};
+
+layout(std140, binding = 1) uniform Block
+{
+    int16_t   i16;
+    i16vec2   i16v2;
+    i16vec3   i16v3;
+    i16vec4   i16v4;
+    uint16_t  u16;
+    u16vec2   u16v2;
+    u16vec3   u16v3;
+    u16vec4   u16v4;
+
+    int32_t   i32;
+    i32vec2   i32v2;
+    i32vec3   i32v3;
+    i32vec4   i32v4;
+    uint32_t  u32;
+    u32vec2   u32v2;
+    u32vec3   u32v3;
+    u32vec4   u32v4;
+} block;
+
+void main()
+{
+}
+
+void literal()
+{
+    const int64_t i64Const[3] =
+    {
+        -0x1111111111111111l,   // Hex
+        -1l,                    // Dec
+        040000000000l,          // Oct
+    };
+
+    int64_t i64 = i64Const[index];
+
+    const uint64_t u64Const[] =
+    {
+        0xFFFFFFFFFFFFFFFFul,   // Hex
+        4294967296UL,           // Dec
+        077777777777ul,         // Oct
+    };
+
+    uint64_t u64 = u64Const[index];
+
+    const int32_t i32Const[3] =
+    {
+        -0x11111111,           // Hex
+        -1,                    // Dec
+        04000000000,           // Oct
+    };
+
+    int32_t i32 = i32Const[index];
+
+    const uint32_t u32Const[] =
+    {
+        0xFFFFFFFF,             // Hex
+        4294967295,             // Dec
+        017777777777,           // Oct
+    };
+
+    uint32_t u32 = u32Const[index];
+
+    const int16_t i16Const[3] =
+    {
+        int16_t(-0x1111),           // Hex
+        int16_t(-1),                // Dec
+        int16_t(040000),            // Oct
+    };
+
+    int16_t i16 = i16Const[index];
+
+    const uint16_t u16Const[] =
+    {
+        uint16_t(0xFFFF),             // Hex
+        uint16_t(65535),              // Dec
+        uint16_t(077777),             // Oct
+    };
+
+    uint16_t u16 = u16Const[index];
+
+    const int8_t i8Const[3] =
+    {
+        int8_t(-0x11),           // Hex
+        int8_t(-1),              // Dec
+        int8_t(0400),            // Oct
+    };
+
+    int8_t i8 = i8Const[index];
+
+    const uint8_t u8Const[] =
+    {
+        uint8_t(0xFF),             // Hex
+        uint8_t(255),              // Dec
+        uint8_t(0177),             // Oct
+    };
+
+    uint8_t u8 = u8Const[index];
+}
+
+void typeCast8()
+{
+    i8vec2 i8v;
+    u8vec2 u8v;
+    i16vec2 i16v;
+    u16vec2 u16v;
+    i32vec2 i32v;
+    u32vec2 u32v;
+    i64vec2 i64v;
+    u64vec2 u64v;
+    f16vec2 f16v;
+    f32vec2 f32v;
+    f64vec2 f64v;
+    bvec2   bv;
+
+    u8v = i8v;      // int8_t  ->  uint8_t
+    i16v = i8v;     // int8_t  ->   int16_t
+    i16v = u8v;     // uint8_t ->   int16_t
+    i32v = i8v;     // int8_t  ->   int32_t
+    i32v = u8v;     // uint8_t ->   int32_t
+    u32v = i8v;     // int8_t  ->  uint32_t
+    i64v = i8v;     // int8_t  ->   int64_t
+    u64v = i8v;     // int8_t  ->  uint64_t
+    u32v = u8v;     // uint8_t ->  uint32_t
+    i64v = u8v;     // uint8_t ->   int64_t
+    u64v = u8v;     // uint8_t ->  uint64_t
+    f16v = i8v;     // int8_t  ->  float16_t
+    f32v = i8v;     // int8_t  ->  float32_t
+    f64v = i8v;     // int8_t  ->  float64_t
+    f16v = u8v;     // uint8_t ->  float16_t
+    f32v = u8v;     // uint8_t ->  float32_t
+    f64v = u8v;     // uint8_t ->  float64_t
+
+    i8v =  i8vec2(u8v);       // uint8_t  ->   int8_t
+    i16v = i16vec2(i8v);      // int8_t   ->   int16_t
+    i16v = i16vec2(u8v);      // uint8_t  ->   int16_t
+    i32v = i32vec2(i8v);      // int8_t   ->   int32_t
+    i32v = i32vec2(u8v);      // uint8_t  ->   int32_t
+    i64v = i64vec2(i8v);      // int8_t   ->   int64_t
+    u64v = i64vec2(i8v);      // int8_t   ->  uint64_t
+    u16v = u16vec2(i8v);      // int8_t   ->  uint16_t
+    u16v = u16vec2(u8v);      // uint8_t  ->  uint16_t
+    u32v = u32vec2(u8v);      // uint8_t  ->  uint32_t
+    i64v = i64vec2(u8v);      // uint8_t  ->   int64_t
+    u64v = i64vec2(u8v);      // uint8_t  ->  uint64_t
+    f16v = f16vec2(i8v);      // int8_t   ->  float16_t
+    f32v = f32vec2(i8v);      // int8_t   ->  float32_t
+    f64v = f64vec2(i8v);      // int8_t   ->  float64_t
+    f16v = f16vec2(u8v);      // uint8_t  ->  float16_t
+    f32v = f32vec2(u8v);      // uint8_t  ->  float32_t
+    f64v = f64vec2(u8v);      // uint8_t  ->  float64_t
+
+    i8v = i8vec2(bv);       // bool     ->   int8
+    u8v = u8vec2(bv);       // bool     ->   uint8
+    bv  = bvec2(i8v);       // int8    ->   bool
+    bv  = bvec2(u8v);       // uint8   ->   bool
+}
+
+void typeCast16()
+{
+    i8vec2 i8v;
+    u8vec2 u8v;
+    i16vec2 i16v;
+    u16vec2 u16v;
+    i32vec2 i32v;
+    u32vec2 u32v;
+    i64vec2 i64v;
+    u64vec2 u64v;
+    f16vec2 f16v;
+    f32vec2 f32v;
+    f64vec2 f64v;
+    bvec2   bv;
+
+    i32v = i16v;     // int16_t  ->   int32_t
+    i32v = u16v;     // uint16_t ->   int32_t
+    u16v = i16v;     // int16_t  ->  uint16_t
+    u32v = i16v;     // int16_t  ->  uint32_t
+    i64v = i16v;     // int16_t  ->   int64_t
+    u64v = i16v;     // int16_t  ->  uint64_t
+    u32v = u16v;     // uint16_t ->  uint32_t
+    i64v = u16v;     // uint16_t ->   int64_t
+    u64v = u16v;     // uint16_t ->  uint64_t
+    f16v = i16v;     // int16_t  ->  float16_t
+    f32v = i16v;     // int16_t  ->  float32_t
+    f64v = i16v;     // int16_t  ->  float64_t
+    f16v = u16v;     // uint16_t ->  float16_t
+    f32v = u16v;     // uint16_t ->  float32_t
+    f64v = u16v;     // uint16_t ->  float64_t
+
+    i32v = i32vec2(i16v);     // int16_t  ->   int32_t
+    i32v = i32vec2(u16v);     // uint16_t ->   int32_t
+    u16v = u16vec2(i16v);     // int16_t  ->  uint16_t
+    u32v = u32vec2(i16v);     // int16_t  ->  uint32_t
+    i64v = i64vec2(i16v);     // int16_t  ->   int64_t
+    u64v = i64vec2(i16v);     // int16_t  ->  uint64_t
+    u32v = u32vec2(u16v);     // uint16_t ->  uint32_t
+    i64v = i64vec2(u16v);     // uint16_t ->   int64_t
+    u64v = i64vec2(u16v);     // uint16_t ->  uint64_t
+    f16v = f16vec2(i16v);     // int16_t  ->  float16_t
+    f32v = f32vec2(i16v);     // int16_t  ->  float32_t
+    f64v = f64vec2(i16v);     // int16_t  ->  float64_t
+    f16v = f16vec2(u16v);     // uint16_t ->  float16_t
+    f32v = f32vec2(u16v);     // uint16_t ->  float32_t
+    f64v = f64vec2(u16v);     // uint16_t ->  float64_t
+
+    i8v  = i8vec2(i16v);      // int16_t  ->   int8_t
+    i8v  = i8vec2(u16v);      // uint16_t ->   int8_t
+    u8v  = u8vec2(i16v);      // int16_t  ->  uint8_t
+    u8v  = u8vec2(u16v);      // uint16_t ->  uint8_t
+    i16v = u8vec2(u16v);      // uint16_t ->   int16_t
+    i16v = i16vec2(bv);       // bool     ->   int16
+    u16v = u16vec2(bv);       // bool     ->   uint16
+    bv   = bvec2(i16v);       // int16    ->   bool
+    bv   = bvec2(u16v);       // uint16   ->   bool
+}
+
+void typeCast32()
+{
+    i8vec2 i8v;
+    u8vec2 u8v;
+    i16vec2 i16v;
+    u16vec2 u16v;
+    i32vec2 i32v;
+    u32vec2 u32v;
+    i64vec2 i64v;
+    u64vec2 u64v;
+    f16vec2 f16v;
+    f32vec2 f32v;
+    f64vec2 f64v;
+    bvec2   bv;
+
+    u32v = i32v;     // int32_t  ->  uint32_t
+    i64v = i32v;     // int32_t  ->   int64_t
+    u64v = i32v;     // int32_t  ->  uint64_t
+    i64v = u32v;     // uint32_t ->   int64_t
+    u64v = u32v;     // uint32_t ->  uint64_t
+    f32v = i32v;     // int32_t  ->  float32_t
+    f64v = i32v;     // int32_t  ->  float64_t
+    f32v = u32v;     // uint32_t ->  float32_t
+    f64v = u32v;     // uint32_t ->  float64_t
+
+    i8v =  i8vec2(i32v);       // int32_t   ->   int8_t
+    i8v =  i8vec2(u32v);       // uint32_t  ->   int8_t
+    i16v = i16vec2(i32v);      // int32_t   ->   int16_t
+    i16v = i16vec2(u32v);      // uint32_t  ->   int16_t
+    i32v = i32vec2(i32v);      // int32_t   ->   int32_t
+    i32v = i32vec2(u32v);      // uint32_t  ->   int32_t
+    i64v = i64vec2(i32v);      // int32_t   ->   int64_t
+	i64v = i64vec2(u32v);      // uint32_t  ->   int64_t
+	u8v =  u8vec2(i32v);       // int32_t   ->   uint8_t
+    u8v =  u8vec2(u32v);       // uint32_t  ->   uint8_t
+    u16v = u16vec2(i32v);      // int32_t   ->   uint16_t
+    u16v = u16vec2(u32v);      // uint32_t  ->   uint16_t
+    u32v = u32vec2(i32v);      // int32_t   ->   uint32_t
+    u32v = u32vec2(u32v);      // uint32_t  ->   uint32_t
+    u64v = u64vec2(i32v);      // int32_t   ->   uint64_t
+    u64v = u64vec2(u32v);      // uint32_t  ->   uint64_t
+
+    f16v = f16vec2(i32v);      // int32_t   ->  float16_t
+    f32v = f32vec2(i32v);      // int32_t   ->  float32_t
+    f64v = f64vec2(i32v);      // int32_t   ->  float64_t
+    f16v = f16vec2(u32v);      // uint32_t  ->  float16_t
+    f32v = f32vec2(u32v);      // uint32_t  ->  float32_t
+    f64v = f64vec2(u32v);      // uint32_t  ->  float64_t
+
+    i32v = i32vec2(bv);       // bool     ->   int32
+    u32v = u32vec2(bv);       // bool     ->   uint32
+    bv   = bvec2(i32v);       // int32    ->   bool
+    bv   = bvec2(u32v);       // uint32   ->   bool
+}
+
+void typeCast64()
+{
+    i8vec2 i8v;
+    u8vec2 u8v;
+    i16vec2 i16v;
+    u16vec2 u16v;
+    i32vec2 i32v;
+    u32vec2 u32v;
+    i64vec2 i64v;
+    u64vec2 u64v;
+    f16vec2 f16v;
+    f32vec2 f32v;
+    f64vec2 f64v;
+    bvec2   bv;
+
+    u64v = i64v;     // int64_t  ->  uint64_t
+    f64v = i64v;     // int64_t  ->  float64_t
+    f64v = u64v;     // uint64_t ->  float64_t
+
+    i8v =  i8vec2(i64v);       // int64_t   ->   int8_t
+    i8v =  i8vec2(u64v);       // uint64_t  ->   int8_t
+    i16v = i16vec2(i64v);      // int64_t   ->   int16_t
+    i16v = i16vec2(u64v);      // uint64_t  ->   int16_t
+    i32v = i32vec2(i64v);      // int64_t   ->   int32_t
+    i32v = i32vec2(u64v);      // uint64_t  ->   int32_t
+	i64v = i64vec2(u64v);      // uint64_t  ->   int64_t
+	u8v =  u8vec2(i64v);       // int64_t   ->   uint8_t
+    u8v =  u8vec2(u64v);       // uint64_t  ->   uint8_t
+    u16v = u16vec2(i64v);      // int64_t   ->   uint16_t
+    u16v = u16vec2(u64v);      // uint64_t  ->   uint16_t
+    u32v = u32vec2(i64v);      // int64_t   ->   uint32_t
+    u32v = u32vec2(u64v);      // uint64_t  ->   uint32_t
+    u64v = u64vec2(i64v);      // int64_t   ->   uint64_t
+    u64v = u64vec2(u64v);      // uint64_t  ->   uint64_t
+
+    f16v = f16vec2(i64v);      // int64_t   ->  float16_t
+    f32v = f32vec2(i64v);      // int64_t   ->  float32_t
+    f64v = f64vec2(i64v);      // int64_t   ->  float64_t
+    f16v = f16vec2(u64v);      // uint64_t  ->  float16_t
+    f32v = f32vec2(u64v);      // uint64_t  ->  float32_t
+    f64v = f64vec2(u64v);      // uint64_t  ->  float64_t
+
+    i64v = i64vec2(bv);       // bool     ->   int64
+    u64v = u64vec2(bv);       // bool     ->   uint64
+    bv   = bvec2(i64v);       // int64    ->   bool
+    bv   = bvec2(u64v);       // uint64   ->   bool
+}
diff --git a/Test/spv.extPostDepthCoverage.frag b/Test/spv.extPostDepthCoverage.frag
new file mode 100644
index 0000000..20aebc3
--- /dev/null
+++ b/Test/spv.extPostDepthCoverage.frag
@@ -0,0 +1,9 @@
+#version 310 es

+

+#extension GL_EXT_post_depth_coverage : enable

+

+layout(post_depth_coverage) in;

+layout(early_fragment_tests) in;

+

+void main () {

+}

diff --git a/Test/spv.extPostDepthCoverage_Error.frag b/Test/spv.extPostDepthCoverage_Error.frag
new file mode 100644
index 0000000..25ce2e2
--- /dev/null
+++ b/Test/spv.extPostDepthCoverage_Error.frag
@@ -0,0 +1,9 @@
+#version 450

+

+#extension GL_EXT_post_depth_coverage : enable

+

+layout(post_depth_coverage) in; // should fail since for GL_EXT_post_depth_coverage

+                                // explicit declaration of early_fragment_tests is required

+

+void main () {

+}

diff --git a/Test/spv.float16Fetch.frag b/Test/spv.float16Fetch.frag
new file mode 100644
index 0000000..b1ba98c
--- /dev/null
+++ b/Test/spv.float16Fetch.frag
@@ -0,0 +1,1273 @@
+#version 450 core

+

+#extension GL_ARB_sparse_texture2: enable

+#extension GL_ARB_sparse_texture_clamp: enable

+#extension GL_AMD_gpu_shader_half_float: enable

+#extension GL_AMD_gpu_shader_half_float_fetch: enable

+#extension GL_AMD_texture_gather_bias_lod: enable

+

+layout(set = 0, binding =  0) uniform f16sampler1D            s1D;

+layout(set = 0, binding =  1) uniform f16sampler2D            s2D;

+layout(set = 0, binding =  2) uniform f16sampler3D            s3D;

+layout(set = 0, binding =  3) uniform f16sampler2DRect        s2DRect;

+layout(set = 0, binding =  4) uniform f16samplerCube          sCube;

+layout(set = 0, binding =  5) uniform f16samplerBuffer        sBuffer;

+layout(set = 0, binding =  6) uniform f16sampler2DMS          s2DMS;

+layout(set = 0, binding =  7) uniform f16sampler1DArray       s1DArray;

+layout(set = 0, binding =  8) uniform f16sampler2DArray       s2DArray;

+layout(set = 0, binding =  9) uniform f16samplerCubeArray     sCubeArray;

+layout(set = 0, binding = 10) uniform f16sampler2DMSArray     s2DMSArray;

+

+layout(set = 0, binding = 11) uniform f16sampler1DShadow          s1DShadow;

+layout(set = 0, binding = 12) uniform f16sampler2DShadow          s2DShadow;

+layout(set = 0, binding = 13) uniform f16sampler2DRectShadow      s2DRectShadow;

+layout(set = 0, binding = 14) uniform f16samplerCubeShadow        sCubeShadow;

+layout(set = 0, binding = 15) uniform f16sampler1DArrayShadow     s1DArrayShadow;

+layout(set = 0, binding = 16) uniform f16sampler2DArrayShadow     s2DArrayShadow;

+layout(set = 0, binding = 17) uniform f16samplerCubeArrayShadow   sCubeArrayShadow;

+

+layout(set = 1, binding =  0) layout(rgba16f) uniform f16image1D          i1D;

+layout(set = 1, binding =  1) layout(rgba16f) uniform f16image2D          i2D;

+layout(set = 1, binding =  2) layout(rgba16f) uniform f16image3D          i3D;

+layout(set = 1, binding =  3) layout(rgba16f) uniform f16image2DRect      i2DRect;

+layout(set = 1, binding =  4) layout(rgba16f) uniform f16imageCube        iCube;

+layout(set = 1, binding =  5) layout(rgba16f) uniform f16image1DArray     i1DArray;

+layout(set = 1, binding =  6) layout(rgba16f) uniform f16image2DArray     i2DArray;

+layout(set = 1, binding =  7) layout(rgba16f) uniform f16imageCubeArray   iCubeArray;

+layout(set = 1, binding =  8) layout(rgba16f) uniform f16imageBuffer      iBuffer;

+layout(set = 1, binding =  9) layout(rgba16f) uniform f16image2DMS        i2DMS;

+layout(set = 1, binding = 10) layout(rgba16f) uniform f16image2DMSArray   i2DMSArray;

+

+layout(set = 2, binding =  0) uniform f16texture1D           t1D;

+layout(set = 2, binding =  1) uniform f16texture2D           t2D;

+layout(set = 2, binding =  2) uniform f16texture3D           t3D;

+layout(set = 2, binding =  3) uniform f16texture2DRect       t2DRect;

+layout(set = 2, binding =  4) uniform f16textureCube         tCube;

+layout(set = 2, binding =  5) uniform f16texture1DArray      t1DArray;

+layout(set = 2, binding =  6) uniform f16texture2DArray      t2DArray;

+layout(set = 2, binding =  7) uniform f16textureCubeArray    tCubeArray;

+layout(set = 2, binding =  8) uniform f16textureBuffer       tBuffer;

+layout(set = 2, binding =  9) uniform f16texture2DMS         t2DMS;

+layout(set = 2, binding = 10) uniform f16texture2DMSArray    t2DMSArray;

+

+layout(set = 2, binding = 11) uniform sampler s;

+layout(set = 2, binding = 12) uniform samplerShadow sShadow;

+

+layout(set = 3, binding = 0, input_attachment_index = 0) uniform f16subpassInput   subpass;

+layout(set = 3, binding = 1, input_attachment_index = 0) uniform f16subpassInputMS subpassMS;

+

+layout(location =  0) in float c1;

+layout(location =  1) in vec2  c2;

+layout(location =  2) in vec3  c3;

+layout(location =  3) in vec4  c4;

+

+layout(location =  4) in float compare;

+layout(location =  5) in float lod;

+layout(location =  6) in float bias;

+layout(location =  7) in float lodClamp;

+

+layout(location =  8) in float dPdxy1;

+layout(location =  9) in vec2  dPdxy2;

+layout(location = 10) in vec3  dPdxy3;

+

+layout(location = 11) in float16_t f16c1;

+layout(location = 12) in f16vec2   f16c2;

+layout(location = 13) in f16vec3   f16c3;

+layout(location = 14) in f16vec4   f16c4;

+

+layout(location = 15) in float16_t f16lod;

+layout(location = 16) in float16_t f16bias;

+layout(location = 17) in float16_t f16lodClamp;

+

+layout(location = 18) in float16_t f16dPdxy1;

+layout(location = 19) in f16vec2   f16dPdxy2;

+layout(location = 20) in f16vec3   f16dPdxy3;

+

+const int   offset1 = 1;

+const ivec2 offset2 = ivec2(1);

+const ivec3 offset3 = ivec3(1);

+const ivec2 offsets[4] = { offset2, offset2, offset2, offset2 };

+

+layout(location = 0) out vec4 fragColor;

+

+f16vec4 testTexture()

+{

+    f16vec4 texel = f16vec4(0.0hf);

+

+    texel   += texture(s1D, c1);

+    texel   += texture(s1D, f16c1, f16bias);

+    texel   += texture(s2D, c2);

+    texel   += texture(s2D, f16c2, f16bias);

+    texel   += texture(s3D, c3);

+    texel   += texture(s3D, f16c3, f16bias);

+    texel   += texture(sCube, c3);

+    texel   += texture(sCube, f16c3, f16bias);

+    texel.x += texture(s1DShadow, c3);

+    texel.x += texture(s1DShadow, f16c2, compare, f16bias);

+    texel.x += texture(s2DShadow, c3);

+    texel.x += texture(s2DShadow, f16c2, compare, f16bias);

+    texel.x += texture(sCubeShadow, c4);

+    texel.x += texture(sCubeShadow, f16c3, compare, f16bias);

+    texel   += texture(s1DArray, c2);

+    texel   += texture(s1DArray, f16c2, f16bias);

+    texel   += texture(s2DArray, c3);

+    texel   += texture(s2DArray, f16c3, f16bias);

+    texel   += texture(sCubeArray, c4);

+    texel   += texture(sCubeArray, f16c4, f16bias);

+    texel.x += texture(s1DArrayShadow, c3);

+    texel.x += texture(s1DArrayShadow, f16c2, compare, f16bias);

+    texel.x += texture(s2DArrayShadow, c4);

+    texel.x += texture(s2DArrayShadow, f16c3, compare);

+    texel   += texture(s2DRect, c2);

+    texel   += texture(s2DRect, f16c2);

+    texel.x += texture(s2DRectShadow, c3);

+    texel.x += texture(s2DRectShadow, f16c2, compare);

+    texel.x += texture(sCubeArrayShadow, c4, compare);

+    texel.x += texture(sCubeArrayShadow, f16c4, compare);

+

+    return texel;

+}

+

+f16vec4 testTextureProj()

+{

+    f16vec4 texel = f16vec4(0.0hf);

+

+    texel   += textureProj(s1D, c2);

+    texel   += textureProj(s1D, f16c2, f16bias);

+    texel   += textureProj(s1D, c4);

+    texel   += textureProj(s1D, f16c4, f16bias);

+    texel   += textureProj(s2D, c3);

+    texel   += textureProj(s2D, f16c3, f16bias);

+    texel   += textureProj(s2D, c4);

+    texel   += textureProj(s2D, f16c4, f16bias);

+    texel   += textureProj(s3D, c4);

+    texel   += textureProj(s3D, f16c4, f16bias);

+    texel.x += textureProj(s1DShadow, c4);

+    texel.x += textureProj(s1DShadow, f16c3, compare, f16bias);

+    texel.x += textureProj(s2DShadow, c4);

+    texel.x += textureProj(s2DShadow, f16c3, compare, f16bias);

+    texel   += textureProj(s2DRect, c3);

+    texel   += textureProj(s2DRect, f16c3);

+    texel   += textureProj(s2DRect, c4);

+    texel   += textureProj(s2DRect, f16c4);

+    texel.x += textureProj(s2DRectShadow, c4);

+    texel.x += textureProj(s2DRectShadow, f16c3, compare);

+

+    return texel;

+}

+

+f16vec4 testTextureLod()

+{

+    f16vec4 texel = f16vec4(0.0hf);

+

+    texel   += textureLod(s1D, c1, lod);

+    texel   += textureLod(s1D, f16c1, f16lod);

+    texel   += textureLod(s2D, c2, lod);

+    texel   += textureLod(s2D, f16c2, f16lod);

+    texel   += textureLod(s3D, c3, lod);

+    texel   += textureLod(s3D, f16c3, f16lod);

+    texel   += textureLod(sCube, c3, lod);

+    texel   += textureLod(sCube, f16c3, f16lod);

+    texel.x += textureLod(s1DShadow, c3, lod);

+    texel.x += textureLod(s1DShadow, f16c2, compare, f16lod);

+    texel.x += textureLod(s2DShadow, c3, lod);

+    texel.x += textureLod(s2DShadow, f16c2, compare, f16lod);

+    texel   += textureLod(s1DArray, c2, lod);

+    texel   += textureLod(s1DArray, f16c2, f16lod);

+    texel   += textureLod(s2DArray, c3, lod);

+    texel   += textureLod(s2DArray, f16c3, f16lod);

+    texel.x += textureLod(s1DArrayShadow, c3, lod);

+    texel.x += textureLod(s1DArrayShadow, f16c2, compare, f16lod);

+    texel   += textureLod(sCubeArray, c4, lod);

+    texel   += textureLod(sCubeArray, f16c4, f16lod);

+

+    return texel;

+}

+

+f16vec4 testTextureOffset()

+{

+    f16vec4 texel = f16vec4(0.0hf);

+

+    texel   += textureOffset(s1D, c1, offset1);

+    texel   += textureOffset(s1D, f16c1, offset1, f16bias);

+    texel   += textureOffset(s2D, c2, offset2);

+    texel   += textureOffset(s2D, f16c2, offset2, f16bias);

+    texel   += textureOffset(s3D, c3, offset3);

+    texel   += textureOffset(s3D, f16c3, offset3, f16bias);

+    texel   += textureOffset(s2DRect, c2, offset2);

+    texel   += textureOffset(s2DRect, f16c2, offset2);

+    texel.x += textureOffset(s2DRectShadow, c3, offset2);

+    texel.x += textureOffset(s2DRectShadow, f16c2, compare, offset2);

+    texel.x += textureOffset(s1DShadow, c3, offset1);

+    texel.x += textureOffset(s1DShadow, f16c2, compare, offset1, f16bias);

+    texel.x += textureOffset(s2DShadow, c3, offset2);

+    texel.x += textureOffset(s2DShadow, f16c2, compare, offset2, f16bias);

+    texel   += textureOffset(s1DArray, c2, offset1);

+    texel   += textureOffset(s1DArray, f16c2, offset1, f16bias);

+    texel   += textureOffset(s2DArray, c3, offset2);

+    texel   += textureOffset(s2DArray, f16c3, offset2, f16bias);

+    texel.x += textureOffset(s1DArrayShadow, c3, offset1);

+    texel.x += textureOffset(s1DArrayShadow, f16c2, compare, offset1, f16bias);

+    texel.x += textureOffset(s2DArrayShadow, c4, offset2);

+    texel.x += textureOffset(s2DArrayShadow, f16c3, compare, offset2);

+

+    return texel;

+}

+

+f16vec4 testTextureProjOffset()

+{

+    f16vec4 texel = f16vec4(0.0hf);

+

+    texel   += textureProjOffset(s1D, c2, offset1);

+    texel   += textureProjOffset(s1D, f16c2, offset1, f16bias);

+    texel   += textureProjOffset(s1D, c4, offset1);

+    texel   += textureProjOffset(s1D, f16c4, offset1, f16bias);

+    texel   += textureProjOffset(s2D, c3, offset2);

+    texel   += textureProjOffset(s2D, f16c3, offset2, f16bias);

+    texel   += textureProjOffset(s2D, c4, offset2);

+    texel   += textureProjOffset(s2D, f16c4, offset2, f16bias);

+    texel   += textureProjOffset(s3D, c4, offset3);

+    texel   += textureProjOffset(s3D, f16c4, offset3, f16bias);

+    texel   += textureProjOffset(s2DRect, c3, offset2);

+    texel   += textureProjOffset(s2DRect, f16c3, offset2);

+    texel   += textureProjOffset(s2DRect, c4, offset2);

+    texel   += textureProjOffset(s2DRect, f16c4, offset2);

+    texel.x += textureProjOffset(s2DRectShadow, c4, offset2);

+    texel.x += textureProjOffset(s2DRectShadow, f16c3, compare, offset2);

+    texel.x += textureProjOffset(s1DShadow, c4, offset1);

+    texel.x += textureProjOffset(s1DShadow, f16c3, compare, offset1, f16bias);

+    texel.x += textureProjOffset(s2DShadow, c4, offset2);

+    texel.x += textureProjOffset(s2DShadow, f16c3, compare, offset2, f16bias); 

+

+    return texel;

+}

+

+f16vec4 testTextureLodOffset()

+{

+    f16vec4 texel = f16vec4(0.0hf);

+

+    texel   += textureLodOffset(s1D, c1, lod, offset1);

+    texel   += textureLodOffset(s1D, f16c1, f16lod, offset1);

+    texel   += textureLodOffset(s2D, c2, lod, offset2);

+    texel   += textureLodOffset(s2D, f16c2, f16lod, offset2);

+    texel   += textureLodOffset(s3D, c3, lod, offset3);

+    texel   += textureLodOffset(s3D, f16c3, f16lod, offset3);

+    texel.x += textureLodOffset(s1DShadow, c3, lod, offset1);

+    texel.x += textureLodOffset(s1DShadow, f16c2, compare, f16lod, offset1);

+    texel.x += textureLodOffset(s2DShadow, c3, lod, offset2);

+    texel.x += textureLodOffset(s2DShadow, f16c2, compare, f16lod, offset2);

+    texel   += textureLodOffset(s1DArray, c2, lod, offset1);

+    texel   += textureLodOffset(s1DArray, f16c2, f16lod, offset1);

+    texel   += textureLodOffset(s2DArray, c3, lod, offset2);

+    texel   += textureLodOffset(s2DArray, f16c3, f16lod, offset2);

+    texel.x += textureLodOffset(s1DArrayShadow, c3, lod, offset1);

+    texel.x += textureLodOffset(s1DArrayShadow, f16c2, compare, f16lod, offset1);

+

+    return texel;

+}

+

+f16vec4 testTextureProjLodOffset()

+{

+    f16vec4 texel = f16vec4(0.0hf);

+

+    texel   += textureProjLodOffset(s1D, c2, lod, offset1);

+    texel   += textureProjLodOffset(s1D, f16c2, f16lod, offset1);

+    texel   += textureProjLodOffset(s1D, c4, lod, offset1);

+    texel   += textureProjLodOffset(s1D, f16c4, f16lod, offset1);

+    texel   += textureProjLodOffset(s2D, c3, lod, offset2);

+    texel   += textureProjLodOffset(s2D, f16c3, f16lod, offset2);

+    texel   += textureProjLodOffset(s2D, c4, lod, offset2);

+    texel   += textureProjLodOffset(s2D, f16c4, f16lod, offset2);

+    texel   += textureProjLodOffset(s3D, c4, lod, offset3);

+    texel   += textureProjLodOffset(s3D, f16c4, f16lod, offset3);

+    texel.x += textureProjLodOffset(s1DShadow, c4, lod, offset1);

+    texel.x += textureProjLodOffset(s1DShadow, f16c3, compare, f16lod, offset1);

+    texel.x += textureProjLodOffset(s2DShadow, c4, lod, offset2);

+    texel.x += textureProjLodOffset(s2DShadow, f16c3, compare, f16lod, offset2);

+

+    return texel;

+}

+

+f16vec4 testTexelFetch()

+{

+    f16vec4 texel = f16vec4(0.0hf);

+

+    texel   += texelFetch(s1D, int(c1), int(lod));

+    texel   += texelFetch(s2D, ivec2(c2), int(lod));

+    texel   += texelFetch(s3D, ivec3(c3), int(lod));

+    texel   += texelFetch(s2DRect, ivec2(c2));

+    texel   += texelFetch(s1DArray, ivec2(c2), int(lod));

+    texel   += texelFetch(s2DArray, ivec3(c3), int(lod));

+    texel   += texelFetch(sBuffer, int(c1));

+    texel   += texelFetch(s2DMS, ivec2(c2), 1);

+    texel   += texelFetch(s2DMSArray, ivec3(c3), 2);

+

+    return texel;

+}

+

+f16vec4 testTexelFetchOffset()

+{

+    f16vec4 texel = f16vec4(0.0hf);

+

+    texel   += texelFetchOffset(s1D, int(c1), int(lod), offset1);

+    texel   += texelFetchOffset(s2D, ivec2(c2), int(lod), offset2);

+    texel   += texelFetchOffset(s3D, ivec3(c3), int(lod), offset3);

+    texel   += texelFetchOffset(s2DRect, ivec2(c2), offset2);

+    texel   += texelFetchOffset(s1DArray, ivec2(c2), int(lod), offset1);

+    texel   += texelFetchOffset(s2DArray, ivec3(c3), int(lod), offset2);

+

+    return texel;

+}

+

+f16vec4 testTextureGrad()

+{

+    f16vec4 texel = f16vec4(0.0hf);

+

+    texel   += textureGrad(s1D, c1, dPdxy1, dPdxy1);

+    texel   += textureGrad(s1D, f16c1, f16dPdxy1, f16dPdxy1);

+    texel   += textureGrad(s2D, c2, dPdxy2, dPdxy2);

+    texel   += textureGrad(s2D, f16c2, f16dPdxy2, f16dPdxy2);

+    texel   += textureGrad(s3D, c3, dPdxy3, dPdxy3);

+    texel   += textureGrad(s3D, f16c3, f16dPdxy3, f16dPdxy3);

+    texel   += textureGrad(sCube, c3, dPdxy3, dPdxy3);

+    texel   += textureGrad(sCube, f16c3, f16dPdxy3, f16dPdxy3);

+    texel   += textureGrad(s2DRect, c2, dPdxy2, dPdxy2);

+    texel   += textureGrad(s2DRect, f16c2, f16dPdxy2, f16dPdxy2);

+    texel.x += textureGrad(s2DRectShadow, c3, dPdxy2, dPdxy2);

+    texel.x += textureGrad(s2DRectShadow, f16c2, compare, f16dPdxy2, f16dPdxy2);

+    texel.x += textureGrad(s1DShadow, c3, dPdxy1, dPdxy1);

+    texel.x += textureGrad(s1DShadow, f16c2, compare, f16dPdxy1, f16dPdxy1);

+    texel.x += textureGrad(s2DShadow, c3, dPdxy2, dPdxy2);

+    texel.x += textureGrad(s2DShadow, f16c2, compare, f16dPdxy2, f16dPdxy2);

+    texel.x += textureGrad(sCubeShadow, c4, dPdxy3, dPdxy3);

+    texel.x += textureGrad(sCubeShadow, f16c3, compare, f16dPdxy3, f16dPdxy3);

+    texel   += textureGrad(s1DArray, c2, dPdxy1, dPdxy1);

+    texel   += textureGrad(s1DArray, f16c2, f16dPdxy1, f16dPdxy1);

+    texel   += textureGrad(s2DArray, c3, dPdxy2, dPdxy2);

+    texel   += textureGrad(s2DArray, f16c3, f16dPdxy2, f16dPdxy2);

+    texel.x += textureGrad(s1DArrayShadow, c3, dPdxy1, dPdxy1);

+    texel.x += textureGrad(s1DArrayShadow, f16c2, compare, f16dPdxy1, f16dPdxy1);

+    texel.x += textureGrad(s2DArrayShadow, c4, dPdxy2, dPdxy2);

+    texel.x += textureGrad(s2DArrayShadow, f16c3, compare, f16dPdxy2, f16dPdxy2);

+    texel   += textureGrad(sCubeArray, c4, dPdxy3, dPdxy3);

+    texel   += textureGrad(sCubeArray, f16c4, f16dPdxy3, f16dPdxy3);

+

+    return texel;

+}

+

+f16vec4 testTextureGradOffset()

+{

+    f16vec4 texel = f16vec4(0.0hf);

+

+    texel   += textureGradOffset(s1D, c1, dPdxy1, dPdxy1, offset1);

+    texel   += textureGradOffset(s1D, f16c1, f16dPdxy1, f16dPdxy1, offset1);

+    texel   += textureGradOffset(s2D, c2, dPdxy2, dPdxy2, offset2);

+    texel   += textureGradOffset(s2D, f16c2, f16dPdxy2, f16dPdxy2, offset2);

+    texel   += textureGradOffset(s3D, c3, dPdxy3, dPdxy3, offset3);

+    texel   += textureGradOffset(s3D, f16c3, f16dPdxy3, f16dPdxy3, offset3);

+    texel   += textureGradOffset(s2DRect, c2, dPdxy2, dPdxy2, offset2);

+    texel   += textureGradOffset(s2DRect, f16c2, f16dPdxy2, f16dPdxy2, offset2);

+    texel.x += textureGradOffset(s2DRectShadow, c3, dPdxy2, dPdxy2, offset2);

+    texel.x += textureGradOffset(s2DRectShadow, f16c2, compare, f16dPdxy2, f16dPdxy2, offset2);

+    texel.x += textureGradOffset(s1DShadow, c3, dPdxy1, dPdxy1, offset1);

+    texel.x += textureGradOffset(s1DShadow, f16c2, compare, f16dPdxy1, f16dPdxy1, offset1);

+    texel.x += textureGradOffset(s2DShadow, c3, dPdxy2, dPdxy2, offset2);

+    texel.x += textureGradOffset(s2DShadow, f16c2, compare, f16dPdxy2, f16dPdxy2, offset2);

+    texel   += textureGradOffset(s1DArray, c2, dPdxy1, dPdxy1, offset1);

+    texel   += textureGradOffset(s1DArray, f16c2, f16dPdxy1, f16dPdxy1, offset1);

+    texel   += textureGradOffset(s2DArray, c3, dPdxy2, dPdxy2, offset2);

+    texel   += textureGradOffset(s2DArray, f16c3, f16dPdxy2, f16dPdxy2, offset2);

+    texel.x += textureGradOffset(s1DArrayShadow, c3, dPdxy1, dPdxy1, offset1);

+    texel.x += textureGradOffset(s1DArrayShadow, f16c2, compare, f16dPdxy1, f16dPdxy1, offset1);

+    texel.x += textureGradOffset(s2DArrayShadow, c4, dPdxy2, dPdxy2, offset2);

+    texel.x += textureGradOffset(s2DArrayShadow, f16c3, compare, f16dPdxy2, f16dPdxy2, offset2);

+

+    return texel;

+}

+

+f16vec4 testTextureProjGrad()

+{

+    f16vec4 texel = f16vec4(0.0hf);

+

+    texel   += textureProjGrad(s1D, c2, dPdxy1, dPdxy1);

+    texel   += textureProjGrad(s1D, f16c2, f16dPdxy1, f16dPdxy1);

+    texel   += textureProjGrad(s1D, c4, dPdxy1, dPdxy1);

+    texel   += textureProjGrad(s1D, f16c4, f16dPdxy1, f16dPdxy1);

+    texel   += textureProjGrad(s2D, c3, dPdxy2, dPdxy2);

+    texel   += textureProjGrad(s2D, f16c3, f16dPdxy2, f16dPdxy2);

+    texel   += textureProjGrad(s2D, c4, dPdxy2, dPdxy2);

+    texel   += textureProjGrad(s2D, f16c4, f16dPdxy2, f16dPdxy2);

+    texel   += textureProjGrad(s3D, c4, dPdxy3, dPdxy3);

+    texel   += textureProjGrad(s3D, f16c4, f16dPdxy3, f16dPdxy3);

+    texel   += textureProjGrad(s2DRect, c3, dPdxy2, dPdxy2);

+    texel   += textureProjGrad(s2DRect, f16c3, f16dPdxy2, f16dPdxy2);

+    texel   += textureProjGrad(s2DRect, c4, dPdxy2, dPdxy2);

+    texel   += textureProjGrad(s2DRect, f16c4, f16dPdxy2, f16dPdxy2);

+    texel.x += textureProjGrad(s2DRectShadow, c4, dPdxy2, dPdxy2);

+    texel.x += textureProjGrad(s2DRectShadow, f16c3, compare, f16dPdxy2, f16dPdxy2);

+    texel.x += textureProjGrad(s1DShadow, c4, dPdxy1, dPdxy1);

+    texel.x += textureProjGrad(s1DShadow, f16c3, compare, f16dPdxy1, f16dPdxy1);

+    texel.x += textureProjGrad(s2DShadow, c4, dPdxy2, dPdxy2);

+    texel.x += textureProjGrad(s2DShadow, f16c3, compare, f16dPdxy2, f16dPdxy2);

+

+    return texel;

+}

+

+f16vec4 testTextureProjGradoffset()

+{

+    f16vec4 texel = f16vec4(0.0hf);

+

+    texel   += textureProjGradOffset(s1D, c2, dPdxy1, dPdxy1, offset1);

+    texel   += textureProjGradOffset(s1D, f16c2, f16dPdxy1, f16dPdxy1, offset1);

+    texel   += textureProjGradOffset(s1D, c4, dPdxy1, dPdxy1, offset1);

+    texel   += textureProjGradOffset(s1D, f16c4, f16dPdxy1, f16dPdxy1, offset1);

+    texel   += textureProjGradOffset(s2D, c3, dPdxy2, dPdxy2, offset2);

+    texel   += textureProjGradOffset(s2D, f16c3, f16dPdxy2, f16dPdxy2, offset2);

+    texel   += textureProjGradOffset(s2D, c4, dPdxy2, dPdxy2, offset2);

+    texel   += textureProjGradOffset(s2D, f16c4, f16dPdxy2, f16dPdxy2, offset2);

+    texel   += textureProjGradOffset(s2DRect, c3, dPdxy2, dPdxy2, offset2);

+    texel   += textureProjGradOffset(s2DRect, f16c3, f16dPdxy2, f16dPdxy2, offset2);

+    texel   += textureProjGradOffset(s2DRect, c4, dPdxy2, dPdxy2, offset2);

+    texel   += textureProjGradOffset(s2DRect, f16c4, f16dPdxy2, f16dPdxy2, offset2);

+    texel.x += textureProjGradOffset(s2DRectShadow, c4, dPdxy2, dPdxy2, offset2);

+    texel.x += textureProjGradOffset(s2DRectShadow, f16c3, compare, f16dPdxy2, f16dPdxy2, offset2);

+    texel   += textureProjGradOffset(s3D, c4, dPdxy3, dPdxy3, offset3);

+    texel   += textureProjGradOffset(s3D, f16c4, f16dPdxy3, f16dPdxy3, offset3);

+    texel.x += textureProjGradOffset(s1DShadow, c4, dPdxy1, dPdxy1, offset1);

+    texel.x += textureProjGradOffset(s1DShadow, f16c3, compare, f16dPdxy1, f16dPdxy1, offset1);

+    texel.x += textureProjGradOffset(s2DShadow, c4, dPdxy2, dPdxy2, offset2);

+    texel.x += textureProjGradOffset(s2DShadow, f16c3, compare, f16dPdxy2, f16dPdxy2, offset2);

+

+    return texel;

+}

+

+f16vec4 testTextureGather()

+{

+    f16vec4 texel = f16vec4(0.0hf);

+

+    texel   += textureGather(s2D, c2, 0);

+    texel   += textureGather(s2D, f16c2, 0, f16bias);

+    texel   += textureGather(s2DArray, c3, 0);

+    texel   += textureGather(s2DArray, f16c3, 0, f16bias);

+    texel   += textureGather(sCube, c3, 0);

+    texel   += textureGather(sCube, f16c3, 0, f16bias);

+    texel   += textureGather(sCubeArray, c4, 0);

+    texel   += textureGather(sCubeArray, f16c4, 0, f16bias);

+    texel   += textureGather(s2DRect, c2, 0);

+    texel   += textureGather(s2DRect, f16c2, 0);

+    texel   += textureGather(s2DShadow, c2, compare);

+    texel   += textureGather(s2DShadow, f16c2, compare);

+    texel   += textureGather(s2DArrayShadow, c3, compare);

+    texel   += textureGather(s2DArrayShadow, f16c3, compare);

+    texel   += textureGather(sCubeShadow, c3, compare);

+    texel   += textureGather(sCubeShadow, f16c3, compare);

+    texel   += textureGather(sCubeArrayShadow, c4, compare);

+    texel   += textureGather(sCubeArrayShadow, f16c4, compare);

+    texel   += textureGather(s2DRectShadow, c2, compare);

+    texel   += textureGather(s2DRectShadow, f16c2, compare);

+

+    return texel;

+}

+

+f16vec4 testTextureGatherOffset()

+{

+    f16vec4 texel = f16vec4(0.0hf);

+

+    texel   += textureGatherOffset(s2D, c2, offset2, 0);

+    texel   += textureGatherOffset(s2D, f16c2, offset2, 0, f16bias);

+    texel   += textureGatherOffset(s2DArray, c3, offset2, 0);

+    texel   += textureGatherOffset(s2DArray, f16c3, offset2, 0, f16bias);

+    texel   += textureGatherOffset(s2DRect, c2, offset2, 0);

+    texel   += textureGatherOffset(s2DRect, f16c2, offset2, 0);

+    texel   += textureGatherOffset(s2DShadow, c2, compare, offset2);

+    texel   += textureGatherOffset(s2DShadow, f16c2, compare, offset2);

+    texel   += textureGatherOffset(s2DArrayShadow, c3, compare, offset2);

+    texel   += textureGatherOffset(s2DArrayShadow, f16c3, compare, offset2);

+    texel   += textureGatherOffset(s2DRectShadow, c2, compare, offset2);

+    texel   += textureGatherOffset(s2DRectShadow, f16c2, compare, offset2);

+

+    return texel;

+}

+

+f16vec4 testTextureGatherOffsets()

+{

+    f16vec4 texel = f16vec4(0.0hf);

+

+    texel   += textureGatherOffsets(s2D, c2, offsets, 0);

+    texel   += textureGatherOffsets(s2D, f16c2, offsets, 0, f16bias);

+    texel   += textureGatherOffsets(s2DArray, c3, offsets, 0);

+    texel   += textureGatherOffsets(s2DArray, f16c3, offsets, 0, f16bias);

+    texel   += textureGatherOffsets(s2DRect, c2, offsets, 0);

+    texel   += textureGatherOffsets(s2DRect, f16c2, offsets, 0);

+    texel   += textureGatherOffsets(s2DShadow, c2, compare, offsets);

+    texel   += textureGatherOffsets(s2DShadow, f16c2, compare, offsets);

+    texel   += textureGatherOffsets(s2DArrayShadow, c3, compare, offsets);

+    texel   += textureGatherOffsets(s2DArrayShadow, f16c3, compare, offsets);

+    texel   += textureGatherOffsets(s2DRectShadow, c2, compare, offsets);

+    texel   += textureGatherOffsets(s2DRectShadow, f16c2, compare, offsets);

+

+    return texel;

+}

+

+f16vec4 testTextureGatherLod()

+{

+    f16vec4 texel = f16vec4(0.0hf);

+

+    texel   += textureGatherLodAMD(s2D, c2, lod, 0);

+    texel   += textureGatherLodAMD(s2D, f16c2, f16lod, 0);

+    texel   += textureGatherLodAMD(s2DArray, c3, lod, 0);

+    texel   += textureGatherLodAMD(s2DArray, f16c3, f16lod, 0);

+    texel   += textureGatherLodAMD(sCube, c3, lod, 0);

+    texel   += textureGatherLodAMD(sCube, f16c3, f16lod, 0);

+    texel   += textureGatherLodAMD(sCubeArray, c4, lod, 0);

+    texel   += textureGatherLodAMD(sCubeArray, f16c4, f16lod, 0);

+

+    return texel;

+}

+

+f16vec4 testTextureGatherLodOffset()

+{

+    f16vec4 texel = f16vec4(0.0hf);

+

+    texel   += textureGatherLodOffsetAMD(s2D, c2, lod, offset2, 0);

+    texel   += textureGatherLodOffsetAMD(s2D, f16c2, f16lod, offset2, 0);

+    texel   += textureGatherLodOffsetAMD(s2DArray, c3, lod, offset2, 0);

+    texel   += textureGatherLodOffsetAMD(s2DArray, f16c3, f16lod, offset2, 0);

+

+    return texel;

+}

+

+f16vec4 testTextureGatherLodOffsets()

+{

+    f16vec4 texel = f16vec4(0.0hf);

+

+    texel   += textureGatherLodOffsetsAMD(s2D, c2, lod, offsets, 0);

+    texel   += textureGatherLodOffsetsAMD(s2D, f16c2, f16lod, offsets, 0);

+    texel   += textureGatherLodOffsetsAMD(s2DArray, c3, lod, offsets, 0);

+    texel   += textureGatherLodOffsetsAMD(s2DArray, f16c3, f16lod, offsets, 0);

+

+    return texel;

+}

+

+ivec4 testTextureSize()

+{

+    ivec4 size = ivec4(0);

+

+    size.x      += textureSize(s1D, int(lod));

+    size.xy     += textureSize(s2D, int(lod));

+    size.xyz    += textureSize(s3D, int(lod));

+    size.xy     += textureSize(sCube, int(lod));

+    size.x      += textureSize(s1DShadow, int(lod));

+    size.xy     += textureSize(s2DShadow, int(lod));

+    size.xy     += textureSize(sCubeShadow, int(lod));

+    size.xyz    += textureSize(sCubeArray, int(lod));

+    size.xyz    += textureSize(sCubeArrayShadow, int(lod));

+    size.xy     += textureSize(s2DRect);

+    size.xy     += textureSize(s2DRectShadow);

+    size.xy     += textureSize(s1DArray, int(lod));

+    size.xyz    += textureSize(s2DArray, int(lod));

+    size.xy     += textureSize(s1DArrayShadow, int(lod));

+    size.xyz    += textureSize(s2DArrayShadow, int(lod));

+    size.x      += textureSize(sBuffer);

+    size.xy     += textureSize(s2DMS);

+    size.xyz    += textureSize(s2DMSArray);

+

+    return size;

+}

+

+vec2 testTextureQueryLod()

+{

+    vec2 lod = vec2(0.0);

+

+    lod  += textureQueryLod(s1D, c1);

+    lod  += textureQueryLod(s1D, f16c1);

+    lod  += textureQueryLod(s2D, c2);

+    lod  += textureQueryLod(s2D, f16c2);

+    lod  += textureQueryLod(s3D, c3);

+    lod  += textureQueryLod(s3D, f16c3);

+    lod  += textureQueryLod(sCube, c3);

+    lod  += textureQueryLod(sCube, f16c3);

+    lod  += textureQueryLod(s1DArray, c1);

+    lod  += textureQueryLod(s1DArray, f16c1);

+    lod  += textureQueryLod(s2DArray, c2);

+    lod  += textureQueryLod(s2DArray, f16c2);

+    lod  += textureQueryLod(sCubeArray, c3);

+    lod  += textureQueryLod(sCubeArray, f16c3);

+    lod  += textureQueryLod(s1DShadow, c1);

+    lod  += textureQueryLod(s1DShadow, f16c1);

+    lod  += textureQueryLod(s2DShadow, c2);

+    lod  += textureQueryLod(s2DShadow, f16c2);

+    lod  += textureQueryLod(sCubeArrayShadow, c3);

+    lod  += textureQueryLod(sCubeArrayShadow, f16c3);

+    lod  += textureQueryLod(s1DArrayShadow, c1);

+    lod  += textureQueryLod(s1DArrayShadow, f16c1);

+    lod  += textureQueryLod(s2DArrayShadow, c2);

+    lod  += textureQueryLod(s2DArrayShadow, f16c2);

+    lod  += textureQueryLod(sCubeArrayShadow, c3);

+    lod  += textureQueryLod(sCubeArrayShadow, f16c3);

+

+    return lod;

+}

+

+int testTextureQueryLevels()

+{

+    int levels = 0;

+

+    levels  += textureQueryLevels(s1D);

+    levels  += textureQueryLevels(s2D);

+    levels  += textureQueryLevels(s3D);

+    levels  += textureQueryLevels(sCube);

+    levels  += textureQueryLevels(s1DShadow);

+    levels  += textureQueryLevels(s2DShadow);

+    levels  += textureQueryLevels(sCubeShadow);

+    levels  += textureQueryLevels(sCubeArray);

+    levels  += textureQueryLevels(sCubeArrayShadow);

+    levels  += textureQueryLevels(s1DArray);

+    levels  += textureQueryLevels(s2DArray);

+    levels  += textureQueryLevels(s1DArrayShadow);

+    levels  += textureQueryLevels(s2DArrayShadow);

+

+    return levels;

+}

+

+int testTextureSamples()

+{

+    int samples = 0;

+

+    samples += textureSamples(s2DMS);

+    samples += textureSamples(s2DMSArray);

+

+    return samples;

+}

+

+f16vec4 testImageLoad()

+{

+    f16vec4 texel = f16vec4(0.0hf);

+

+    texel += imageLoad(i1D, int(c1));

+    texel += imageLoad(i2D, ivec2(c2));

+    texel += imageLoad(i3D, ivec3(c3));

+    texel += imageLoad(i2DRect, ivec2(c2));

+    texel += imageLoad(iCube, ivec3(c3));

+    texel += imageLoad(iBuffer, int(c1));

+    texel += imageLoad(i1DArray, ivec2(c2));

+    texel += imageLoad(i2DArray, ivec3(c3));

+    texel += imageLoad(iCubeArray, ivec3(c3));

+    texel += imageLoad(i2DMS, ivec2(c2), 1);

+    texel += imageLoad(i2DMSArray, ivec3(c3), 1);

+

+    return texel;

+}

+

+void testImageStore(f16vec4 data)

+{

+    imageStore(i1D, int(c1), data);

+    imageStore(i2D, ivec2(c2), data);

+    imageStore(i3D, ivec3(c3), data);

+    imageStore(i2DRect, ivec2(c2), data);

+    imageStore(iCube, ivec3(c3), data);

+    imageStore(iBuffer, int(c1), data);

+    imageStore(i1DArray, ivec2(c2), data);

+    imageStore(i2DArray, ivec3(c3), data);

+    imageStore(iCubeArray, ivec3(c3), data);

+    imageStore(i2DMS, ivec2(c2), 1, data);

+    imageStore(i2DMSArray, ivec3(c3), 1, data);

+}

+

+f16vec4 testSparseTexture()

+{

+    f16vec4 texel = f16vec4(0.0hf);

+

+    sparseTextureARB(s2D, c2, texel);

+    sparseTextureARB(s2D, f16c2, texel, f16bias);

+    sparseTextureARB(s3D, c3, texel);

+    sparseTextureARB(s3D, f16c3, texel, f16bias);

+    sparseTextureARB(sCube, c3, texel);

+    sparseTextureARB(sCube, f16c3, texel, f16bias);

+    sparseTextureARB(s2DShadow, c3, texel.x);

+    sparseTextureARB(s2DShadow, f16c2, compare, texel.x, f16bias);

+    sparseTextureARB(sCubeShadow, c4, texel.x);

+    sparseTextureARB(sCubeShadow, f16c3, compare, texel.x, f16bias);

+    sparseTextureARB(s2DArray, c3, texel);

+    sparseTextureARB(s2DArray, f16c3, texel, f16bias);

+    sparseTextureARB(sCubeArray, c4, texel);

+    sparseTextureARB(sCubeArray, f16c4, texel, f16bias);

+    sparseTextureARB(s2DArrayShadow, c4, texel.x);

+    sparseTextureARB(s2DArrayShadow, f16c3, compare, texel.x);

+    sparseTextureARB(s2DRect, c2, texel);

+    sparseTextureARB(s2DRect, f16c2, texel);

+    sparseTextureARB(s2DRectShadow, c3, texel.x);

+    sparseTextureARB(s2DRectShadow, f16c2, compare, texel.x);

+    sparseTextureARB(sCubeArrayShadow, c4, compare, texel.x);

+    sparseTextureARB(sCubeArrayShadow, f16c4, compare, texel.x);

+

+    return texel;

+}

+

+f16vec4 testSparseTextureLod()

+{

+    f16vec4 texel = f16vec4(0.0hf);

+

+    sparseTextureLodARB(s2D, c2, lod, texel);

+    sparseTextureLodARB(s2D, f16c2, f16lod, texel);

+    sparseTextureLodARB(s3D, c3, lod, texel);

+    sparseTextureLodARB(s3D, f16c3, f16lod, texel);

+    sparseTextureLodARB(sCube, c3, lod, texel);

+    sparseTextureLodARB(sCube, f16c3, f16lod, texel);

+    sparseTextureLodARB(s2DShadow, c3, lod, texel.x);

+    sparseTextureLodARB(s2DShadow, f16c2, compare, f16lod, texel.x);

+    sparseTextureLodARB(s2DArray, c3, lod, texel);

+    sparseTextureLodARB(s2DArray, f16c3, f16lod, texel);

+    sparseTextureLodARB(sCubeArray, c4, lod, texel);

+    sparseTextureLodARB(sCubeArray, f16c4, f16lod, texel);

+

+    return texel;

+}

+

+f16vec4 testSparseTextureOffset()

+{

+    f16vec4 texel = f16vec4(0.0hf);

+

+    sparseTextureOffsetARB(s2D, c2, offset2, texel);

+    sparseTextureOffsetARB(s2D, f16c2, offset2, texel, f16bias);

+    sparseTextureOffsetARB(s3D, c3, offset3, texel);

+    sparseTextureOffsetARB(s3D, f16c3, offset3, texel, f16bias);

+    sparseTextureOffsetARB(s2DRect, c2, offset2, texel);

+    sparseTextureOffsetARB(s2DRect, f16c2, offset2, texel);

+    sparseTextureOffsetARB(s2DRectShadow, c3, offset2, texel.x);

+    sparseTextureOffsetARB(s2DRectShadow, f16c2, compare, offset2, texel.x);

+    sparseTextureOffsetARB(s2DShadow, c3, offset2, texel.x);

+    sparseTextureOffsetARB(s2DShadow, f16c2, compare, offset2, texel.x, f16bias);

+    sparseTextureOffsetARB(s2DArray, c3, offset2, texel);

+    sparseTextureOffsetARB(s2DArray, f16c3, offset2, texel, f16bias);

+    sparseTextureOffsetARB(s2DArrayShadow, c4, offset2, texel.x);

+    sparseTextureOffsetARB(s2DArrayShadow, f16c3, compare, offset2, texel.x);

+

+    return texel;

+}

+

+f16vec4 testSparseTextureLodOffset()

+{

+    f16vec4 texel = f16vec4(0.0hf);

+

+    sparseTextureLodOffsetARB(s2D, c2, lod, offset2, texel);

+    sparseTextureLodOffsetARB(s2D, f16c2, f16lod, offset2, texel);

+    sparseTextureLodOffsetARB(s3D, c3, lod, offset3, texel);

+    sparseTextureLodOffsetARB(s3D, f16c3, f16lod, offset3, texel);

+    sparseTextureLodOffsetARB(s2DShadow, c3, lod, offset2, texel.x);

+    sparseTextureLodOffsetARB(s2DShadow, f16c2, compare, f16lod, offset2, texel.x);

+    sparseTextureLodOffsetARB(s2DArray, c3, lod, offset2, texel);

+    sparseTextureLodOffsetARB(s2DArray, f16c3, f16lod, offset2, texel);

+

+    return texel;

+}

+

+f16vec4 testSparseTextureGrad()

+{

+    f16vec4 texel = f16vec4(0.0hf);

+

+    sparseTextureGradARB(s2D, c2, dPdxy2, dPdxy2, texel);

+    sparseTextureGradARB(s2D, f16c2, f16dPdxy2, f16dPdxy2, texel);

+    sparseTextureGradARB(s3D, c3, dPdxy3, dPdxy3, texel);

+    sparseTextureGradARB(s3D, f16c3, f16dPdxy3, f16dPdxy3, texel);

+    sparseTextureGradARB(sCube, c3, dPdxy3, dPdxy3, texel);

+    sparseTextureGradARB(sCube, f16c3, f16dPdxy3, f16dPdxy3, texel);

+    sparseTextureGradARB(s2DRect, c2, dPdxy2, dPdxy2, texel);

+    sparseTextureGradARB(s2DRect, f16c2, f16dPdxy2, f16dPdxy2, texel);

+    sparseTextureGradARB(s2DRectShadow, c3, dPdxy2, dPdxy2, texel.x);

+    sparseTextureGradARB(s2DRectShadow, f16c2, compare, f16dPdxy2, f16dPdxy2, texel.x);

+    sparseTextureGradARB(s2DShadow, c3, dPdxy2, dPdxy2, texel.x);

+    sparseTextureGradARB(s2DShadow, f16c2, compare, f16dPdxy2, f16dPdxy2, texel.x);

+    sparseTextureGradARB(sCubeShadow, c4, dPdxy3, dPdxy3, texel.x);

+    sparseTextureGradARB(sCubeShadow, f16c3, compare, f16dPdxy3, f16dPdxy3, texel.x);

+    sparseTextureGradARB(s2DArray, c3, dPdxy2, dPdxy2, texel);

+    sparseTextureGradARB(s2DArray, f16c3, f16dPdxy2, f16dPdxy2, texel);

+    sparseTextureGradARB(s2DArrayShadow, c4, dPdxy2, dPdxy2, texel.x);

+    sparseTextureGradARB(s2DArrayShadow, f16c3, compare, f16dPdxy2, f16dPdxy2, texel.x);

+    sparseTextureGradARB(sCubeArray, c4, dPdxy3, dPdxy3, texel);

+    sparseTextureGradARB(sCubeArray, f16c4, f16dPdxy3, f16dPdxy3, texel);

+

+    return texel;

+}

+

+f16vec4 testSparseTextureGradOffset()

+{

+    f16vec4 texel = f16vec4(0.0hf);

+

+    sparseTextureGradOffsetARB(s2D, c2, dPdxy2, dPdxy2, offset2, texel);

+    sparseTextureGradOffsetARB(s2D, f16c2, f16dPdxy2, f16dPdxy2, offset2, texel);

+    sparseTextureGradOffsetARB(s3D, c3, dPdxy3, dPdxy3, offset3, texel);

+    sparseTextureGradOffsetARB(s3D, f16c3, f16dPdxy3, f16dPdxy3, offset3, texel);

+    sparseTextureGradOffsetARB(s2DRect, c2, dPdxy2, dPdxy2, offset2, texel);

+    sparseTextureGradOffsetARB(s2DRect, f16c2, f16dPdxy2, f16dPdxy2, offset2, texel);

+    sparseTextureGradOffsetARB(s2DRectShadow, c3, dPdxy2, dPdxy2, offset2, texel.x);

+    sparseTextureGradOffsetARB(s2DRectShadow, f16c2, compare, f16dPdxy2, f16dPdxy2, offset2, texel.x);

+    sparseTextureGradOffsetARB(s2DShadow, c3, dPdxy2, dPdxy2, offset2, texel.x);

+    sparseTextureGradOffsetARB(s2DShadow, f16c2, compare, f16dPdxy2, f16dPdxy2, offset2, texel.x);

+    sparseTextureGradOffsetARB(s2DArray, c3, dPdxy2, dPdxy2, offset2, texel);

+    sparseTextureGradOffsetARB(s2DArray, f16c3, f16dPdxy2, f16dPdxy2, offset2, texel);

+    sparseTextureGradOffsetARB(s2DArrayShadow, c4, dPdxy2, dPdxy2, offset2, texel.x);

+    sparseTextureGradOffsetARB(s2DArrayShadow, f16c3, compare, f16dPdxy2, f16dPdxy2, offset2, texel.x);

+

+    return texel;

+}

+

+f16vec4 testSparseTexelFetch()

+{

+    f16vec4 texel = f16vec4(0.0hf);

+

+    sparseTexelFetchARB(s2D, ivec2(c2), int(lod), texel);

+    sparseTexelFetchARB(s3D, ivec3(c3), int(lod), texel);

+    sparseTexelFetchARB(s2DRect, ivec2(c2), texel);

+    sparseTexelFetchARB(s2DArray, ivec3(c3), int(lod), texel);

+    sparseTexelFetchARB(s2DMS, ivec2(c2), 1, texel);

+    sparseTexelFetchARB(s2DMSArray, ivec3(c3), 2, texel);

+

+    return texel;

+}

+

+f16vec4 testSparseTexelFetchOffset()

+{

+    f16vec4 texel = f16vec4(0.0hf);

+

+    sparseTexelFetchOffsetARB(s2D, ivec2(c2), int(lod), offset2, texel);

+    sparseTexelFetchOffsetARB(s3D, ivec3(c3), int(lod), offset3, texel);

+    sparseTexelFetchOffsetARB(s2DRect, ivec2(c2), offset2, texel);

+    sparseTexelFetchOffsetARB(s2DArray, ivec3(c3), int(lod), offset2, texel);

+

+    return texel;

+}

+

+f16vec4 testSparseTextureGather()

+{

+    f16vec4 texel = f16vec4(0.0hf);

+

+    sparseTextureGatherARB(s2D, c2, texel, 0);

+    sparseTextureGatherARB(s2D, f16c2, texel, 0, f16bias);

+    sparseTextureGatherARB(s2DArray, c3, texel, 0);

+    sparseTextureGatherARB(s2DArray, f16c3, texel, 0, f16bias);

+    sparseTextureGatherARB(sCube, c3, texel, 0);

+    sparseTextureGatherARB(sCube, f16c3, texel, 0, f16bias);

+    sparseTextureGatherARB(sCubeArray, c4, texel, 0);

+    sparseTextureGatherARB(sCubeArray, f16c4, texel, 0, f16bias);

+    sparseTextureGatherARB(s2DRect, c2, texel, 0);

+    sparseTextureGatherARB(s2DRect, f16c2, texel, 0);

+    sparseTextureGatherARB(s2DShadow, c2, compare, texel);

+    sparseTextureGatherARB(s2DShadow, f16c2, compare, texel);

+    sparseTextureGatherARB(s2DArrayShadow, c3, compare, texel);

+    sparseTextureGatherARB(s2DArrayShadow, f16c3, compare, texel);

+    sparseTextureGatherARB(sCubeShadow, c3, compare, texel);

+    sparseTextureGatherARB(sCubeShadow, f16c3, compare, texel);

+    sparseTextureGatherARB(sCubeArrayShadow, c4, compare, texel);

+    sparseTextureGatherARB(sCubeArrayShadow, f16c4, compare, texel);

+    sparseTextureGatherARB(s2DRectShadow, c2, compare, texel);

+    sparseTextureGatherARB(s2DRectShadow, f16c2, compare, texel);

+

+    return texel;

+}

+

+f16vec4 testSparseTextureGatherOffset()

+{

+    f16vec4 texel = f16vec4(0.0hf);

+

+    sparseTextureGatherOffsetARB(s2D, c2, offset2, texel, 0);

+    sparseTextureGatherOffsetARB(s2D, f16c2, offset2, texel, 0, f16bias);

+    sparseTextureGatherOffsetARB(s2DArray, c3, offset2, texel, 0);

+    sparseTextureGatherOffsetARB(s2DArray, f16c3, offset2, texel, 0, f16bias);

+    sparseTextureGatherOffsetARB(s2DRect, c2, offset2, texel, 0);

+    sparseTextureGatherOffsetARB(s2DRect, f16c2, offset2, texel, 0);

+    sparseTextureGatherOffsetARB(s2DShadow, c2, compare, offset2, texel);

+    sparseTextureGatherOffsetARB(s2DShadow, f16c2, compare, offset2, texel);

+    sparseTextureGatherOffsetARB(s2DArrayShadow, c3, compare, offset2, texel);

+    sparseTextureGatherOffsetARB(s2DArrayShadow, f16c3, compare, offset2, texel);

+    sparseTextureGatherOffsetARB(s2DRectShadow, c2, compare, offset2, texel);

+    sparseTextureGatherOffsetARB(s2DRectShadow, f16c2, compare, offset2, texel);

+

+    return texel;

+}

+

+f16vec4 testSparseTextureGatherOffsets()

+{

+    f16vec4 texel = f16vec4(0.0hf);

+

+    sparseTextureGatherOffsetsARB(s2D, c2, offsets, texel, 0);

+    sparseTextureGatherOffsetsARB(s2D, f16c2, offsets, texel, 0, f16bias);

+    sparseTextureGatherOffsetsARB(s2DArray, c3, offsets, texel, 0);

+    sparseTextureGatherOffsetsARB(s2DArray, f16c3, offsets, texel, 0, f16bias);

+    sparseTextureGatherOffsetsARB(s2DRect, c2, offsets, texel, 0);

+    sparseTextureGatherOffsetsARB(s2DRect, f16c2, offsets, texel, 0);

+    sparseTextureGatherOffsetsARB(s2DShadow, c2, compare, offsets, texel);

+    sparseTextureGatherOffsetsARB(s2DShadow, f16c2, compare, offsets, texel);

+    sparseTextureGatherOffsetsARB(s2DArrayShadow, c3, compare, offsets, texel);

+    sparseTextureGatherOffsetsARB(s2DArrayShadow, f16c3, compare, offsets, texel);

+    sparseTextureGatherOffsetsARB(s2DRectShadow, c2, compare, offsets, texel);

+    sparseTextureGatherOffsetsARB(s2DRectShadow, f16c2, compare, offsets, texel);

+

+    return texel;

+}

+

+f16vec4 testSparseTextureGatherLod()

+{

+    f16vec4 texel = f16vec4(0.0hf);

+

+    sparseTextureGatherLodAMD(s2D, c2, lod, texel, 0);

+    sparseTextureGatherLodAMD(s2D, f16c2, f16lod, texel, 0);

+    sparseTextureGatherLodAMD(s2DArray, c3, lod, texel, 0);

+    sparseTextureGatherLodAMD(s2DArray, f16c3, f16lod, texel, 0);

+    sparseTextureGatherLodAMD(sCube, c3, lod, texel, 0);

+    sparseTextureGatherLodAMD(sCube, f16c3, f16lod, texel, 0);

+    sparseTextureGatherLodAMD(sCubeArray, c4, lod, texel, 0);

+    sparseTextureGatherLodAMD(sCubeArray, f16c4, f16lod, texel, 0);

+

+    return texel;

+}

+

+f16vec4 testSparseTextureGatherLodOffset()

+{

+    f16vec4 texel = f16vec4(0.0hf);

+

+    sparseTextureGatherLodOffsetAMD(s2D, c2, lod, offset2, texel, 0);

+    sparseTextureGatherLodOffsetAMD(s2D, f16c2, f16lod, offset2, texel, 0);

+    sparseTextureGatherLodOffsetAMD(s2DArray, c3, lod, offset2, texel, 0);

+    sparseTextureGatherLodOffsetAMD(s2DArray, f16c3, f16lod, offset2, texel, 0);

+

+    return texel;

+}

+

+f16vec4 testSparseTextureGatherLodOffsets()

+{

+    f16vec4 texel = f16vec4(0.0hf);

+

+    sparseTextureGatherLodOffsetsAMD(s2D, c2, lod, offsets, texel, 0);

+    sparseTextureGatherLodOffsetsAMD(s2D, f16c2, f16lod, offsets, texel, 0);

+    sparseTextureGatherLodOffsetsAMD(s2DArray, c3, lod, offsets, texel, 0);

+    sparseTextureGatherLodOffsetsAMD(s2DArray, f16c3, f16lod, offsets, texel, 0);

+

+    return texel;

+}

+

+f16vec4 testSparseImageLoad()

+{

+    f16vec4 texel = f16vec4(0.0hf);

+

+    sparseImageLoadARB(i2D, ivec2(c2), texel);

+    sparseImageLoadARB(i3D, ivec3(c3), texel);

+    sparseImageLoadARB(i2DRect, ivec2(c2), texel);

+    sparseImageLoadARB(iCube, ivec3(c3), texel);

+    sparseImageLoadARB(i2DArray, ivec3(c3), texel);

+    sparseImageLoadARB(iCubeArray, ivec3(c3), texel);

+    sparseImageLoadARB(i2DMS, ivec2(c2), 1, texel);

+    sparseImageLoadARB(i2DMSArray, ivec3(c3), 2, texel);

+

+    return texel;

+}

+

+f16vec4 testSparseTextureClamp()

+{

+    f16vec4 texel = f16vec4(0.0hf);

+

+    sparseTextureClampARB(s2D, c2, lodClamp, texel);

+    sparseTextureClampARB(s2D, f16c2, f16lodClamp, texel, f16bias);

+    sparseTextureClampARB(s3D, c3, lodClamp, texel);

+    sparseTextureClampARB(s3D, f16c3, f16lodClamp, texel, f16bias);

+    sparseTextureClampARB(sCube, c3, lodClamp, texel);

+    sparseTextureClampARB(sCube, f16c3, f16lodClamp, texel, f16bias);

+    sparseTextureClampARB(s2DShadow, c3, lodClamp, texel.x);

+    sparseTextureClampARB(s2DShadow, f16c2, compare, f16lodClamp, texel.x, f16bias);

+    sparseTextureClampARB(sCubeShadow, c4, lodClamp, texel.x);

+    sparseTextureClampARB(sCubeShadow, f16c3, compare, f16lodClamp, texel.x, f16bias);

+    sparseTextureClampARB(s2DArray, c3, lodClamp, texel);

+    sparseTextureClampARB(s2DArray, f16c3, f16lodClamp, texel, f16bias);

+    sparseTextureClampARB(sCubeArray, c4, lodClamp, texel);

+    sparseTextureClampARB(sCubeArray, f16c4, f16lodClamp, texel, f16bias);

+    sparseTextureClampARB(s2DArrayShadow, c4, lodClamp, texel.x);

+    sparseTextureClampARB(s2DArrayShadow, f16c3, compare, f16lodClamp, texel.x);

+    sparseTextureClampARB(sCubeArrayShadow, c4, compare, lodClamp, texel.x);

+    sparseTextureClampARB(sCubeArrayShadow, f16c4, compare, f16lodClamp, texel.x);

+

+    return texel;

+}

+

+f16vec4 testTextureClamp()

+{

+    f16vec4 texel = f16vec4(0.0hf);

+

+    texel   += textureClampARB(s1D, c1, lodClamp);

+    texel   += textureClampARB(s1D, f16c1, f16lodClamp, f16bias);

+    texel   += textureClampARB(s2D, c2, lodClamp);

+    texel   += textureClampARB(s2D, f16c2, f16lodClamp, f16bias);

+    texel   += textureClampARB(s3D, c3, lodClamp);

+    texel   += textureClampARB(s3D, f16c3, f16lodClamp, f16bias);

+    texel   += textureClampARB(sCube, c3, lodClamp);

+    texel   += textureClampARB(sCube, f16c3, f16lodClamp, f16bias);

+    texel.x += textureClampARB(s1DShadow, c3, lodClamp);

+    texel.x += textureClampARB(s1DShadow, f16c2, compare, f16lodClamp, f16bias);

+    texel.x += textureClampARB(s2DShadow, c3, lodClamp);

+    texel.x += textureClampARB(s2DShadow, f16c2, compare, f16lodClamp, f16bias);

+    texel.x += textureClampARB(sCubeShadow, c4, lodClamp);

+    texel.x += textureClampARB(sCubeShadow, f16c3, compare, f16lodClamp, f16bias);

+    texel   += textureClampARB(s1DArray, c2, lodClamp);

+    texel   += textureClampARB(s1DArray, f16c2, f16lodClamp, f16bias);

+    texel   += textureClampARB(s2DArray, c3, lodClamp);

+    texel   += textureClampARB(s2DArray, f16c3, f16lodClamp, f16bias);

+    texel   += textureClampARB(sCubeArray, c4, lodClamp);

+    texel   += textureClampARB(sCubeArray, f16c4, f16lodClamp, f16bias);

+    texel.x += textureClampARB(s1DArrayShadow, c3, lodClamp);

+    texel.x += textureClampARB(s1DArrayShadow, f16c2, compare, f16lodClamp, f16bias);

+    texel.x += textureClampARB(s2DArrayShadow, c4, lodClamp);

+    texel.x += textureClampARB(s2DArrayShadow, f16c3, compare, f16lodClamp);

+    texel.x += textureClampARB(sCubeArrayShadow, c4, compare, lodClamp);

+    texel.x += textureClampARB(sCubeArrayShadow, f16c4, compare, f16lodClamp);

+

+    return texel;

+}

+

+f16vec4 testSparseTextureOffsetClamp()

+{

+    f16vec4 texel = f16vec4(0.0hf);

+

+    sparseTextureOffsetClampARB(s2D, c2, offset2, lodClamp, texel);

+    sparseTextureOffsetClampARB(s2D, f16c2, offset2, f16lodClamp, texel, f16bias);

+    sparseTextureOffsetClampARB(s3D, c3, offset3, lodClamp, texel);

+    sparseTextureOffsetClampARB(s3D, f16c3, offset3, f16lodClamp, texel, f16bias);

+    sparseTextureOffsetClampARB(s2DShadow, c3, offset2, lodClamp, texel.x);

+    sparseTextureOffsetClampARB(s2DShadow, f16c2, compare, offset2, f16lodClamp, texel.x, f16bias);

+    sparseTextureOffsetClampARB(s2DArray, c3, offset2, lodClamp, texel);

+    sparseTextureOffsetClampARB(s2DArray, f16c3, offset2, f16lodClamp, texel, f16bias);

+    sparseTextureOffsetClampARB(s2DArrayShadow, c4, offset2, lodClamp, texel.x);

+    sparseTextureOffsetClampARB(s2DArrayShadow, f16c3, compare, offset2, f16lodClamp, texel.x);

+

+    return texel;

+}

+

+f16vec4 testTextureOffsetClamp()

+{

+    f16vec4 texel = f16vec4(0.0hf);

+

+    texel   += textureOffsetClampARB(s1D, c1, offset1, lodClamp);

+    texel   += textureOffsetClampARB(s1D, f16c1, offset1, f16lodClamp, f16bias);

+    texel   += textureOffsetClampARB(s2D, c2, offset2, lodClamp);

+    texel   += textureOffsetClampARB(s2D, f16c2, offset2, f16lodClamp, f16bias);

+    texel   += textureOffsetClampARB(s3D, c3, offset3, lodClamp);

+    texel   += textureOffsetClampARB(s3D, f16c3, offset3, f16lodClamp, f16bias);

+    texel.x += textureOffsetClampARB(s1DShadow, c3, offset1, lodClamp);

+    texel.x += textureOffsetClampARB(s1DShadow, f16c2, compare, offset1, f16lodClamp, f16bias);

+    texel.x += textureOffsetClampARB(s2DShadow, c3, offset2, lodClamp);

+    texel.x += textureOffsetClampARB(s2DShadow, f16c2, compare, offset2, f16lodClamp, f16bias);

+    texel   += textureOffsetClampARB(s1DArray, c2, offset1, lodClamp);

+    texel   += textureOffsetClampARB(s1DArray, f16c2, offset1, f16lodClamp, f16bias);

+    texel   += textureOffsetClampARB(s2DArray, c3, offset2, lodClamp);

+    texel   += textureOffsetClampARB(s2DArray, f16c3, offset2, f16lodClamp, f16bias);

+    texel.x += textureOffsetClampARB(s1DArrayShadow, c3, offset1, lodClamp);

+    texel.x += textureOffsetClampARB(s1DArrayShadow, f16c2, compare, offset1, f16lodClamp, f16bias);

+    texel.x += textureOffsetClampARB(s2DArrayShadow, c4, offset2, lodClamp);

+    texel.x += textureOffsetClampARB(s2DArrayShadow, f16c3, compare, offset2, f16lodClamp);

+    

+    return texel;

+}

+

+f16vec4 testSparseTextureGradClamp()

+{

+    f16vec4 texel = f16vec4(0.0hf);

+

+    sparseTextureGradClampARB(s2D, c2, dPdxy2, dPdxy2, lodClamp, texel);

+    sparseTextureGradClampARB(s2D, f16c2, f16dPdxy2, f16dPdxy2, f16lodClamp, texel);

+    sparseTextureGradClampARB(s3D, c3, dPdxy3, dPdxy3, lodClamp, texel);

+    sparseTextureGradClampARB(s3D, f16c3, f16dPdxy3, f16dPdxy3, f16lodClamp, texel);

+    sparseTextureGradClampARB(sCube, c3, dPdxy3, dPdxy3, lodClamp, texel);

+    sparseTextureGradClampARB(sCube, f16c3, f16dPdxy3, f16dPdxy3, f16lodClamp, texel);

+    sparseTextureGradClampARB(s2DShadow, c3, dPdxy2, dPdxy2, lodClamp, texel.x);

+    sparseTextureGradClampARB(s2DShadow, f16c2, compare, f16dPdxy2, f16dPdxy2, f16lodClamp, texel.x);

+    sparseTextureGradClampARB(sCubeShadow, c4, dPdxy3, dPdxy3, lodClamp, texel.x);

+    sparseTextureGradClampARB(sCubeShadow, f16c3, compare, f16dPdxy3, f16dPdxy3, f16lodClamp, texel.x);

+    sparseTextureGradClampARB(s2DArray, c3, dPdxy2, dPdxy2, lodClamp, texel);

+    sparseTextureGradClampARB(s2DArray, f16c3, f16dPdxy2, f16dPdxy2, f16lodClamp, texel);

+    sparseTextureGradClampARB(s2DArrayShadow, c4, dPdxy2, dPdxy2, lodClamp, texel.x);

+    sparseTextureGradClampARB(s2DArrayShadow, f16c3, compare, f16dPdxy2, f16dPdxy2, f16lodClamp, texel.x);

+    sparseTextureGradClampARB(sCubeArray, c4, dPdxy3, dPdxy3, lodClamp, texel);

+    sparseTextureGradClampARB(sCubeArray, f16c4, f16dPdxy3, f16dPdxy3, f16lodClamp, texel);

+

+    return texel;

+}

+

+f16vec4 testTextureGradClamp()

+{

+    f16vec4 texel = f16vec4(0.0hf);

+

+    texel   += textureGradClampARB(s1D, c1, dPdxy1, dPdxy1, lodClamp);

+    texel   += textureGradClampARB(s1D, f16c1, f16dPdxy1, f16dPdxy1, f16lodClamp);

+    texel   += textureGradClampARB(s2D, c2, dPdxy2, dPdxy2, lodClamp);

+    texel   += textureGradClampARB(s2D, f16c2, f16dPdxy2, f16dPdxy2, f16lodClamp);

+    texel   += textureGradClampARB(s3D, c3, dPdxy3, dPdxy3, lodClamp);

+    texel   += textureGradClampARB(s3D, f16c3, f16dPdxy3, f16dPdxy3, f16lodClamp);

+    texel   += textureGradClampARB(sCube, c3, dPdxy3, dPdxy3, lodClamp);

+    texel   += textureGradClampARB(sCube, f16c3, f16dPdxy3, f16dPdxy3, f16lodClamp);

+    texel.x += textureGradClampARB(s1DShadow, c3, dPdxy1, dPdxy1, lodClamp);

+    texel.x += textureGradClampARB(s1DShadow, f16c2, compare, f16dPdxy1, f16dPdxy1, f16lodClamp);

+    texel.x += textureGradClampARB(s2DShadow, c3, dPdxy2, dPdxy2, lodClamp);

+    texel.x += textureGradClampARB(s2DShadow, f16c2, compare, f16dPdxy2, f16dPdxy2, f16lodClamp);

+    texel.x += textureGradClampARB(sCubeShadow, c4, dPdxy3, dPdxy3, lodClamp);

+    texel.x += textureGradClampARB(sCubeShadow, f16c3, compare, f16dPdxy3, f16dPdxy3, f16lodClamp);

+    texel   += textureGradClampARB(s1DArray, c2, dPdxy1, dPdxy1, lodClamp);

+    texel   += textureGradClampARB(s1DArray, f16c2, f16dPdxy1, f16dPdxy1, f16lodClamp);

+    texel   += textureGradClampARB(s2DArray, c3, dPdxy2, dPdxy2, lodClamp);

+    texel   += textureGradClampARB(s2DArray, f16c3, f16dPdxy2, f16dPdxy2, f16lodClamp);

+    texel.x += textureGradClampARB(s1DArrayShadow, c3, dPdxy1, dPdxy1, lodClamp);

+    texel.x += textureGradClampARB(s1DArrayShadow, f16c2, compare, f16dPdxy1, f16dPdxy1, f16lodClamp);

+    texel.x += textureGradClampARB(s2DArrayShadow, c4, dPdxy2, dPdxy2, lodClamp);

+    texel.x += textureGradClampARB(s2DArrayShadow, f16c3, compare, f16dPdxy2, f16dPdxy2, f16lodClamp);

+    texel   += textureGradClampARB(sCubeArray, c4, dPdxy3, dPdxy3, lodClamp);

+    texel   += textureGradClampARB(sCubeArray, f16c4, f16dPdxy3, f16dPdxy3, f16lodClamp);

+

+    return texel;

+}

+

+f16vec4 testSparseTextureGradOffsetClamp()

+{

+    f16vec4 texel = f16vec4(0.0hf);

+

+    sparseTextureGradOffsetClampARB(s2D, c2, dPdxy2, dPdxy2, offset2, lodClamp, texel);

+    sparseTextureGradOffsetClampARB(s2D, f16c2, f16dPdxy2, f16dPdxy2, offset2, f16lodClamp, texel);

+    sparseTextureGradOffsetClampARB(s3D, c3, dPdxy3, dPdxy3, offset3, lodClamp, texel);

+    sparseTextureGradOffsetClampARB(s3D, f16c3, f16dPdxy3, f16dPdxy3, offset3, f16lodClamp, texel);

+    sparseTextureGradOffsetClampARB(s2DShadow, c3, dPdxy2, dPdxy2, offset2, lodClamp, texel.x);

+    sparseTextureGradOffsetClampARB(s2DShadow, f16c2, compare, f16dPdxy2, f16dPdxy2, offset2, f16lodClamp, texel.x);

+    sparseTextureGradOffsetClampARB(s2DArray, c3, dPdxy2, dPdxy2, offset2, lodClamp, texel);

+    sparseTextureGradOffsetClampARB(s2DArray, f16c3, f16dPdxy2, f16dPdxy2, offset2, f16lodClamp, texel);

+    sparseTextureGradOffsetClampARB(s2DArrayShadow, c4, dPdxy2, dPdxy2, offset2, lodClamp, texel.x);

+    sparseTextureGradOffsetClampARB(s2DArrayShadow, f16c3, compare, f16dPdxy2, f16dPdxy2, offset2, f16lodClamp, texel.x);

+

+    return texel;

+}

+

+f16vec4 testTextureGradOffsetClamp()

+{

+    f16vec4 texel = f16vec4(0.0hf);

+

+    texel   += textureGradOffsetClampARB(s1D, c1, dPdxy1, dPdxy1, offset1, lodClamp);

+    texel   += textureGradOffsetClampARB(s1D, f16c1, f16dPdxy1, f16dPdxy1, offset1, f16lodClamp);

+    texel   += textureGradOffsetClampARB(s2D, c2, dPdxy2, dPdxy2, offset2, lodClamp);

+    texel   += textureGradOffsetClampARB(s2D, f16c2, f16dPdxy2, f16dPdxy2, offset2, f16lodClamp);

+    texel   += textureGradOffsetClampARB(s3D, c3, dPdxy3, dPdxy3, offset3, lodClamp);

+    texel   += textureGradOffsetClampARB(s3D, f16c3, f16dPdxy3, f16dPdxy3, offset3, f16lodClamp);

+    texel.x += textureGradOffsetClampARB(s1DShadow, c3, dPdxy1, dPdxy1, offset1, lodClamp);

+    texel.x += textureGradOffsetClampARB(s1DShadow, f16c2, compare, f16dPdxy1, f16dPdxy1, offset1, f16lodClamp);

+    texel.x += textureGradOffsetClampARB(s2DShadow, c3, dPdxy2, dPdxy2, offset2, lodClamp);

+    texel.x += textureGradOffsetClampARB(s2DShadow, f16c2, compare, f16dPdxy2, f16dPdxy2, offset2, f16lodClamp);

+    texel   += textureGradOffsetClampARB(s1DArray, c2, dPdxy1, dPdxy1, offset1, lodClamp);

+    texel   += textureGradOffsetClampARB(s1DArray, f16c2, f16dPdxy1, f16dPdxy1, offset1, f16lodClamp);

+    texel   += textureGradOffsetClampARB(s2DArray, c3, dPdxy2, dPdxy2, offset2, lodClamp);

+    texel   += textureGradOffsetClampARB(s2DArray, f16c3, f16dPdxy2, f16dPdxy2, offset2, f16lodClamp);

+    texel.x += textureGradOffsetClampARB(s1DArrayShadow, c3, dPdxy1, dPdxy1, offset1, lodClamp);

+    texel.x += textureGradOffsetClampARB(s1DArrayShadow, f16c2, compare, f16dPdxy1, f16dPdxy1, offset1, f16lodClamp);

+    texel.x += textureGradOffsetClampARB(s2DArrayShadow, c4, dPdxy2, dPdxy2, offset2, lodClamp);

+    texel.x += textureGradOffsetClampARB(s2DArrayShadow, f16c3, compare, f16dPdxy2, f16dPdxy2, offset2, f16lodClamp);

+

+    return texel;

+}

+

+f16vec4 testCombinedTextureSampler()

+{

+    f16vec4 texel = f16vec4(0.0hf);

+

+    texel   += texture(f16sampler1D(t1D, s), c1);

+    texel   += texture(f16sampler1D(t1D, s), f16c1, f16bias);

+    texel   += texture(f16sampler2D(t2D, s), c2);

+    texel   += texture(f16sampler2D(t2D, s), f16c2, f16bias);

+    texel   += texture(f16sampler3D(t3D, s), c3);

+    texel   += texture(f16sampler3D(t3D, s), f16c3, f16bias);

+    texel   += texture(f16samplerCube(tCube, s), c3);

+    texel   += texture(f16samplerCube(tCube, s), f16c3, f16bias);

+    texel.x += texture(f16sampler1DShadow(t1D, sShadow), c3);

+    texel.x += texture(f16sampler1DShadow(t1D, sShadow), f16c2, compare, f16bias);

+    texel.x += texture(f16sampler2DShadow(t2D, sShadow), c3);

+    texel.x += texture(f16sampler2DShadow(t2D, sShadow), f16c2, compare, f16bias);

+    texel.x += texture(f16samplerCubeShadow(tCube, sShadow), c4);

+    texel.x += texture(f16samplerCubeShadow(tCube, sShadow), f16c3, compare, f16bias);

+    texel   += texture(f16sampler1DArray(t1DArray, s), c2);

+    texel   += texture(f16sampler1DArray(t1DArray, s), f16c2, f16bias);

+    texel   += texture(f16sampler2DArray(t2DArray, s), c3);

+    texel   += texture(f16sampler2DArray(t2DArray, s), f16c3, f16bias);

+    texel   += texture(f16samplerCubeArray(tCubeArray, s), c4);

+    texel   += texture(f16samplerCubeArray(tCubeArray, s), f16c4, f16bias);

+    texel.x += texture(f16sampler1DArrayShadow(t1DArray, sShadow), c3);

+    texel.x += texture(f16sampler1DArrayShadow(t1DArray, sShadow), f16c2, compare, f16bias);

+    texel.x += texture(f16sampler2DArrayShadow(t2DArray, sShadow), c4);

+    texel.x += texture(f16sampler2DArrayShadow(t2DArray, sShadow), f16c3, compare);

+    texel   += texture(f16sampler2DRect(t2DRect, s), c2);

+    texel   += texture(f16sampler2DRect(t2DRect, s), f16c2);

+    texel.x += texture(f16sampler2DRectShadow(t2DRect, sShadow), c3);

+    texel.x += texture(f16sampler2DRectShadow(t2DRect, sShadow), f16c2, compare);

+    texel.x += texture(f16samplerCubeArrayShadow(tCubeArray, sShadow), c4, compare);

+    texel.x += texture(f16samplerCubeArrayShadow(tCubeArray, sShadow), f16c4, compare);

+

+    return texel;

+}

+

+f16vec4 testSubpassLoad()

+{

+    return subpassLoad(subpass) + subpassLoad(subpassMS, 2);

+}

+

+void main()

+{

+    f16vec4 result = f16vec4(0.0hf);

+

+    result  += testTexture();

+    result  += testTextureProj();

+    result  += testTextureLod();

+    result  += testTextureOffset();

+    result  += testTextureLodOffset();

+    result  += testTextureProjLodOffset();

+    result  += testTexelFetch();

+    result  += testTexelFetchOffset();

+    result  += testTextureGrad();

+    result  += testTextureGradOffset();

+    result  += testTextureProjGrad();

+    result  += testTextureProjGradoffset();

+    result  += testTextureGather();

+    result  += testTextureGatherOffset();

+    result  += testTextureGatherOffsets();

+    result  += testTextureGatherLod();

+    result  += testTextureGatherLodOffset();

+    result  += testTextureGatherLodOffsets();

+

+    result    += f16vec4(testTextureSize());

+    result.xy += f16vec2(testTextureQueryLod());

+    result.x  += float16_t(testTextureQueryLevels());

+    result.x  += float16_t(testTextureSamples());

+

+    result  += testImageLoad();

+    testImageStore(result);

+

+    result += testSparseTexture();

+    result += testSparseTextureLod();

+    result += testSparseTextureOffset();

+    result += testSparseTextureLodOffset();

+    result += testSparseTextureGrad();

+    result += testSparseTextureGradOffset();

+    result += testSparseTexelFetch();

+    result += testSparseTexelFetchOffset();

+    result += testSparseTextureGather();

+    result += testSparseTextureGatherOffset();

+    result += testSparseTextureGatherOffsets();

+    result += testSparseTextureGatherLod();

+    result += testSparseTextureGatherLodOffset();

+    result += testSparseTextureGatherLodOffsets();

+

+    result += testSparseImageLoad();

+

+    result += testSparseTextureClamp();

+    result += testTextureClamp();

+    result += testSparseTextureOffsetClamp();

+    result += testTextureOffsetClamp();

+    result += testSparseTextureGrad();

+    result += testTextureGrad();

+    result += testSparseTextureGradOffsetClamp();

+    result += testTextureGradOffsetClamp();

+

+    result += testCombinedTextureSampler();

+    result += testSubpassLoad();

+

+    fragColor = result;

+}

diff --git a/Test/spv.float32.frag b/Test/spv.float32.frag
new file mode 100644
index 0000000..f45dccd
--- /dev/null
+++ b/Test/spv.float32.frag
@@ -0,0 +1,277 @@
+#version 450
+
+#extension GL_EXT_shader_explicit_arithmetic_types: enable
+#extension GL_EXT_shader_explicit_arithmetic_types_int8: require
+#extension GL_EXT_shader_explicit_arithmetic_types_int16: require
+#extension GL_EXT_shader_explicit_arithmetic_types_int32: require
+#extension GL_EXT_shader_explicit_arithmetic_types_int64: require
+#extension GL_EXT_shader_explicit_arithmetic_types_float16: require
+#extension GL_EXT_shader_explicit_arithmetic_types_float32: require
+#extension GL_EXT_shader_explicit_arithmetic_types_float64: require
+
+void main()
+{
+}
+
+// Single float literals
+void literal()
+{
+    const float32_t f32c  = 0.000001f;
+    const f32vec2   f32cv = f32vec2(-0.25F, 0.03f);
+
+    f32vec2 f32v;
+    f32v.x  = f32c;
+    f32v   += f32cv;
+}
+
+// Block memory layout
+struct S
+{
+    float32_t  x;
+    f32vec2    y;
+    f32vec3    z;
+};
+
+layout(column_major, std140) uniform B1
+{
+    float32_t  a;
+    f32vec2    b;
+    f32vec3    c;
+    float32_t  d[2];
+    f32mat2x3  e;
+    f32mat2x3  f[2];
+    S          g;
+    S          h[2];
+};
+
+// Specialization constant
+layout(constant_id = 100) const float16_t sf16 = 0.125hf;
+layout(constant_id = 101) const float32_t sf   = 0.25;
+layout(constant_id = 102) const float64_t sd   = 0.5lf;
+
+const float  f16_to_f = float(sf16);
+const double f16_to_d = float(sf16);
+
+const float16_t f_to_f16 = float16_t(sf);
+const float16_t d_to_f16 = float16_t(sd);
+
+void operators()
+{
+    float32_t f32;
+    f32vec2   f32v;
+    f32mat2x2 f32m;
+    bool      b;
+
+    // Arithmetic
+    f32v += f32v;
+    f32v -= f32v;
+    f32v *= f32v;
+    f32v /= f32v;
+    f32v++;
+    f32v--;
+    ++f32m;
+    --f32m;
+    f32v = -f32v;
+    f32m = -f32m;
+
+    f32 = f32v.x + f32v.y;
+    f32 = f32v.x - f32v.y;
+    f32 = f32v.x * f32v.y;
+    f32 = f32v.x / f32v.y;
+
+    // Relational
+    b = (f32v.x != f32);
+    b = (f32v.y == f32);
+    b = (f32v.x >  f32);
+    b = (f32v.y <  f32);
+    b = (f32v.x >= f32);
+    b = (f32v.y <= f32);
+
+    // Vector/matrix operations
+    f32v = f32v * f32;
+    f32m = f32m * f32;
+    f32v = f32m * f32v;
+    f32v = f32v * f32m;
+    f32m = f32m * f32m;
+}
+
+void typeCast()
+{
+    bvec3   bv;
+    f32vec3   f32v;
+    f64vec3   f64v;
+    i8vec3    i8v;
+    u8vec3    u8v;
+    i16vec3   i16v;
+    u16vec3   u16v;
+    i32vec3   i32v;
+    u32vec3   u32v;
+    i64vec3   i64v;
+    u64vec3   u64v;
+    f16vec3   f16v;
+
+    f64v = f32v;            // float32_t -> float64_t
+
+    f32v = f32vec3(bv);     // bool -> float32
+    bv   = bvec3(f32v);     // float32 -> bool
+
+    f32v = f32vec3(f64v);   // double -> float32
+    f64v = f64vec3(f32v);   // float32 -> double
+
+    f32v = f32vec3(f16v);   // float16 -> float32
+    f16v = f16vec3(f32v);   // float32 -> float16
+
+    i8v  = i8vec3(f32v);    //  float32 -> int8
+    i16v = i16vec3(f32v);    // float32 -> int16
+    i32v = i32vec3(f32v);    // float32 -> int32
+    i64v = i64vec3(f32v);    // float32 -> int64
+
+    u8v  = u8vec3(f32v);    //  float32 -> uint8
+    u16v = u16vec3(f32v);    // float32 -> uint16
+    u32v = u32vec3(f32v);    // float32 -> uint32
+    u64v = u64vec3(f32v);    // float32 -> uint64
+}
+
+void builtinAngleTrigFuncs()
+{
+    f32vec4 f32v1, f32v2;
+
+    f32v2 = radians(f32v1);
+    f32v2 = degrees(f32v1);
+    f32v2 = sin(f32v1);
+    f32v2 = cos(f32v1);
+    f32v2 = tan(f32v1);
+    f32v2 = asin(f32v1);
+    f32v2 = acos(f32v1);
+    f32v2 = atan(f32v1, f32v2);
+    f32v2 = atan(f32v1);
+    f32v2 = sinh(f32v1);
+    f32v2 = cosh(f32v1);
+    f32v2 = tanh(f32v1);
+    f32v2 = asinh(f32v1);
+    f32v2 = acosh(f32v1);
+    f32v2 = atanh(f32v1);
+}
+
+void builtinExpFuncs()
+{
+    f32vec2 f32v1, f32v2;
+
+    f32v2 = pow(f32v1, f32v2);
+    f32v2 = exp(f32v1);
+    f32v2 = log(f32v1);
+    f32v2 = exp2(f32v1);
+    f32v2 = log2(f32v1);
+    f32v2 = sqrt(f32v1);
+    f32v2 = inversesqrt(f32v1);
+}
+
+void builtinCommonFuncs()
+{
+    f32vec3   f32v1, f32v2, f32v3;
+    float32_t f32;
+    bool  b;
+    bvec3 bv;
+    ivec3 iv;
+
+    f32v2 = abs(f32v1);
+    f32v2 = sign(f32v1);
+    f32v2 = floor(f32v1);
+    f32v2 = trunc(f32v1);
+    f32v2 = round(f32v1);
+    f32v2 = roundEven(f32v1);
+    f32v2 = ceil(f32v1);
+    f32v2 = fract(f32v1);
+    f32v2 = mod(f32v1, f32v2);
+    f32v2 = mod(f32v1, f32);
+    f32v3 = modf(f32v1, f32v2);
+    f32v3 = min(f32v1, f32v2);
+    f32v3 = min(f32v1, f32);
+    f32v3 = max(f32v1, f32v2);
+    f32v3 = max(f32v1, f32);
+    f32v3 = clamp(f32v1, f32, f32v2.x);
+    f32v3 = clamp(f32v1, f32v2, f32vec3(f32));
+    f32v3 = mix(f32v1, f32v2, f32);
+    f32v3 = mix(f32v1, f32v2, f32v3);
+    f32v3 = mix(f32v1, f32v2, bv);
+    f32v3 = step(f32v1, f32v2);
+    f32v3 = step(f32, f32v3);
+    f32v3 = smoothstep(f32v1, f32v2, f32v3);
+    f32v3 = smoothstep(f32, f32v1.x, f32v2);
+    b     = isnan(f32);
+    bv    = isinf(f32v1);
+    f32v3 = fma(f32v1, f32v2, f32v3);
+    f32v2 = frexp(f32v1, iv);
+    f32v2 = ldexp(f32v1, iv);
+}
+
+void builtinGeometryFuncs()
+{
+    float32_t f32;
+    f32vec3   f32v1, f32v2, f32v3;
+
+    f32   = length(f32v1);
+    f32   = distance(f32v1, f32v2);
+    f32   = dot(f32v1, f32v2);
+    f32v3 = cross(f32v1, f32v2);
+    f32v2 = normalize(f32v1);
+    f32v3 = faceforward(f32v1, f32v2, f32v3);
+    f32v3 = reflect(f32v1, f32v2);
+    f32v3 = refract(f32v1, f32v2, f32);
+}
+
+void builtinMatrixFuncs()
+{
+    f32mat2x3 f32m1, f32m2, f32m3;
+    f32mat3x2 f32m4;
+    f32mat3   f32m5;
+    f32mat4   f32m6, f32m7;
+
+    f32vec3 f32v1;
+    f32vec2 f32v2;
+
+    float32_t f32;
+
+    f32m3 = matrixCompMult(f32m1, f32m2);
+    f32m1 = outerProduct(f32v1, f32v2);
+    f32m4 = transpose(f32m1);
+    f32   = determinant(f32m5);
+    f32m6 = inverse(f32m7);
+}
+
+void builtinVecRelFuncs()
+{
+    f32vec3 f32v1, f32v2;
+    bvec3   bv;
+
+    bv = lessThan(f32v1, f32v2);
+    bv = lessThanEqual(f32v1, f32v2);
+    bv = greaterThan(f32v1, f32v2);
+    bv = greaterThanEqual(f32v1, f32v2);
+    bv = equal(f32v1, f32v2);
+    bv = notEqual(f32v1, f32v2);
+}
+
+in f32vec3 if32v;
+
+void builtinFragProcFuncs()
+{
+    f32vec3 f32v;
+
+    // Derivative
+    f32v.x  = dFdx(if32v.x);
+    f32v.y  = dFdy(if32v.y);
+    f32v.xy = dFdxFine(if32v.xy);
+    f32v.xy = dFdyFine(if32v.xy);
+    f32v    = dFdxCoarse(if32v);
+    f32v    = dFdxCoarse(if32v);
+
+    f32v.x  = fwidth(if32v.x);
+    f32v.xy = fwidthFine(if32v.xy);
+    f32v    = fwidthCoarse(if32v);
+
+    // Interpolation
+    f32v.x  = interpolateAtCentroid(if32v.x);
+    f32v.xy = interpolateAtSample(if32v.xy, 1);
+    f32v    = interpolateAtOffset(if32v, f32vec2(0.5f));
+}
diff --git a/Test/spv.float64.frag b/Test/spv.float64.frag
new file mode 100644
index 0000000..faaac23
--- /dev/null
+++ b/Test/spv.float64.frag
@@ -0,0 +1,272 @@
+#version 450
+
+#extension GL_EXT_shader_explicit_arithmetic_types: enable
+#extension GL_EXT_shader_explicit_arithmetic_types_int8: require
+#extension GL_EXT_shader_explicit_arithmetic_types_int16: require
+#extension GL_EXT_shader_explicit_arithmetic_types_int32: require
+#extension GL_EXT_shader_explicit_arithmetic_types_int64: require
+#extension GL_EXT_shader_explicit_arithmetic_types_float16: require
+#extension GL_EXT_shader_explicit_arithmetic_types_float32: require
+#extension GL_EXT_shader_explicit_arithmetic_types_float64: require
+
+void main()
+{
+}
+
+// Single float literals
+void literal()
+{
+    const float64_t f64c  = 0.000001LF;
+    const f64vec2   f64cv = f64vec2(-0.25lF, 0.03Lf);
+
+    f64vec2 f64v;
+    f64v.x  = f64c;
+    f64v   += f64cv;
+}
+
+// Block memory layout
+struct S
+{
+    float64_t  x;
+    f64vec2    y;
+    f64vec3    z;
+};
+
+layout(column_major, std140) uniform B1
+{
+    float64_t  a;
+    f64vec2    b;
+    f64vec3    c;
+    float64_t  d[2];
+    f64mat2x3  e;
+    f64mat2x3  f[2];
+    S          g;
+    S          h[2];
+};
+
+// Specialization constant
+layout(constant_id = 100) const float16_t sf16 = 0.125hf;
+layout(constant_id = 101) const float32_t sf   = 0.25;
+layout(constant_id = 102) const float64_t sd   = 0.5lf;
+
+const float  f16_to_f = float(sf16);
+const double f16_to_d = float(sf16);
+
+const float16_t f_to_f16 = float16_t(sf);
+const float16_t d_to_f16 = float16_t(sd);
+
+void operators()
+{
+    float64_t f64;
+    f64vec2   f64v;
+    f64mat2x2 f64m;
+    bool      b;
+
+    // Arithmetic
+    f64v += f64v;
+    f64v -= f64v;
+    f64v *= f64v;
+    f64v /= f64v;
+    f64v++;
+    f64v--;
+    ++f64m;
+    --f64m;
+    f64v = -f64v;
+    f64m = -f64m;
+
+    f64 = f64v.x + f64v.y;
+    f64 = f64v.x - f64v.y;
+    f64 = f64v.x * f64v.y;
+    f64 = f64v.x / f64v.y;
+
+    // Relational
+    b = (f64v.x != f64);
+    b = (f64v.y == f64);
+    b = (f64v.x >  f64);
+    b = (f64v.y <  f64);
+    b = (f64v.x >= f64);
+    b = (f64v.y <= f64);
+
+    // Vector/matrix operations
+    f64v = f64v * f64;
+    f64m = f64m * f64;
+    f64v = f64m * f64v;
+    f64v = f64v * f64m;
+    f64m = f64m * f64m;
+}
+
+void typeCast()
+{
+    bvec3   bv;
+    f32vec3   f32v;
+    f64vec3   f64v;
+    i8vec3    i8v;
+    u8vec3    u8v;
+    i16vec3   i16v;
+    u16vec3   u16v;
+    i32vec3   i32v;
+    u32vec3   u32v;
+    i64vec3   i64v;
+    u64vec3   u64v;
+    f16vec3   f16v;
+
+    f64v = f64vec3(bv);     // bool -> float64
+    bv   = bvec3(f64v);     // float64 -> bool
+
+    f64v = f64vec3(f16v);   // float16 -> float64
+    f16v = f16vec3(f64v);   // float64 -> float16
+
+    i8v  = i8vec3(f64v);    //  float64 -> int8
+    i16v = i16vec3(f64v);    // float64 -> int16
+    i32v = i32vec3(f64v);    // float64 -> int32
+    i64v = i64vec3(f64v);    // float64 -> int64
+
+    u8v  = u8vec3(f64v);    //  float64 -> uint8
+    u16v = u16vec3(f64v);    // float64 -> uint16
+    u32v = u32vec3(f64v);    // float64 -> uint32
+    u64v = u64vec3(f64v);    // float64 -> uint64
+}
+
+void builtinAngleTrigFuncs()
+{
+    f64vec4 f64v1, f64v2;
+
+    f64v2 = radians(f64v1);
+    f64v2 = degrees(f64v1);
+    f64v2 = sin(f64v1);
+    f64v2 = cos(f64v1);
+    f64v2 = tan(f64v1);
+    f64v2 = asin(f64v1);
+    f64v2 = acos(f64v1);
+    f64v2 = atan(f64v1, f64v2);
+    f64v2 = atan(f64v1);
+    f64v2 = sinh(f64v1);
+    f64v2 = cosh(f64v1);
+    f64v2 = tanh(f64v1);
+    f64v2 = asinh(f64v1);
+    f64v2 = acosh(f64v1);
+    f64v2 = atanh(f64v1);
+}
+
+void builtinExpFuncs()
+{
+    f64vec2 f64v1, f64v2;
+
+    f64v2 = pow(f64v1, f64v2);
+    f64v2 = exp(f64v1);
+    f64v2 = log(f64v1);
+    f64v2 = exp2(f64v1);
+    f64v2 = log2(f64v1);
+    f64v2 = sqrt(f64v1);
+    f64v2 = inversesqrt(f64v1);
+}
+
+void builtinCommonFuncs()
+{
+    f64vec3   f64v1, f64v2, f64v3;
+    float64_t f64;
+    bool  b;
+    bvec3 bv;
+    ivec3 iv;
+
+    f64v2 = abs(f64v1);
+    f64v2 = sign(f64v1);
+    f64v2 = floor(f64v1);
+    f64v2 = trunc(f64v1);
+    f64v2 = round(f64v1);
+    f64v2 = roundEven(f64v1);
+    f64v2 = ceil(f64v1);
+    f64v2 = fract(f64v1);
+    f64v2 = mod(f64v1, f64v2);
+    f64v2 = mod(f64v1, f64);
+    f64v3 = modf(f64v1, f64v2);
+    f64v3 = min(f64v1, f64v2);
+    f64v3 = min(f64v1, f64);
+    f64v3 = max(f64v1, f64v2);
+    f64v3 = max(f64v1, f64);
+    f64v3 = clamp(f64v1, f64, f64v2.x);
+    f64v3 = clamp(f64v1, f64v2, f64vec3(f64));
+    f64v3 = mix(f64v1, f64v2, f64);
+    f64v3 = mix(f64v1, f64v2, f64v3);
+    f64v3 = mix(f64v1, f64v2, bv);
+    f64v3 = step(f64v1, f64v2);
+    f64v3 = step(f64, f64v3);
+    f64v3 = smoothstep(f64v1, f64v2, f64v3);
+    f64v3 = smoothstep(f64, f64v1.x, f64v2);
+    b     = isnan(f64);
+    bv    = isinf(f64v1);
+    f64v3 = fma(f64v1, f64v2, f64v3);
+    f64v2 = frexp(f64v1, iv);
+    f64v2 = ldexp(f64v1, iv);
+}
+
+void builtinGeometryFuncs()
+{
+    float64_t f64;
+    f64vec3   f64v1, f64v2, f64v3;
+
+    f64   = length(f64v1);
+    f64   = distance(f64v1, f64v2);
+    f64   = dot(f64v1, f64v2);
+    f64v3 = cross(f64v1, f64v2);
+    f64v2 = normalize(f64v1);
+    f64v3 = faceforward(f64v1, f64v2, f64v3);
+    f64v3 = reflect(f64v1, f64v2);
+    f64v3 = refract(f64v1, f64v2, f64);
+}
+
+void builtinMatrixFuncs()
+{
+    f64mat2x3 f64m1, f64m2, f64m3;
+    f64mat3x2 f64m4;
+    f64mat3   f64m5;
+    f64mat4   f64m6, f64m7;
+
+    f64vec3 f64v1;
+    f64vec2 f64v2;
+
+    float64_t f64;
+
+    f64m3 = matrixCompMult(f64m1, f64m2);
+    f64m1 = outerProduct(f64v1, f64v2);
+    f64m4 = transpose(f64m1);
+    f64   = determinant(f64m5);
+    f64m6 = inverse(f64m7);
+}
+
+void builtinVecRelFuncs()
+{
+    f64vec3 f64v1, f64v2;
+    bvec3   bv;
+
+    bv = lessThan(f64v1, f64v2);
+    bv = lessThanEqual(f64v1, f64v2);
+    bv = greaterThan(f64v1, f64v2);
+    bv = greaterThanEqual(f64v1, f64v2);
+    bv = equal(f64v1, f64v2);
+    bv = notEqual(f64v1, f64v2);
+}
+
+in flat f64vec3 if64v;
+
+void builtinFragProcFuncs()
+{
+    f64vec3 f64v;
+
+    // Derivative
+    f64v.x  = dFdx(if64v.x);
+    f64v.y  = dFdy(if64v.y);
+    f64v.xy = dFdxFine(if64v.xy);
+    f64v.xy = dFdyFine(if64v.xy);
+    f64v    = dFdxCoarse(if64v);
+    f64v    = dFdxCoarse(if64v);
+
+    f64v.x  = fwidth(if64v.x);
+    f64v.xy = fwidthFine(if64v.xy);
+    f64v    = fwidthCoarse(if64v);
+
+    // Interpolation
+    f64v.x  = interpolateAtCentroid(if64v.x);
+    f64v.xy = interpolateAtSample(if64v.xy, 1);
+    f64v    = interpolateAtOffset(if64v, f64vec2(0.5f));
+}
diff --git a/Test/spv.fragmentDensity-es.frag b/Test/spv.fragmentDensity-es.frag
new file mode 100644
index 0000000..35fb96e
--- /dev/null
+++ b/Test/spv.fragmentDensity-es.frag
@@ -0,0 +1,11 @@
+#version 310 es
+
+#extension GL_EXT_fragment_invocation_density : require
+
+layout (location = 0) out highp ivec2 FragSize;
+layout (location = 2) out highp int FragInvocationCount;
+
+void main () {
+    FragSize = gl_FragSizeEXT;
+    FragInvocationCount = gl_FragInvocationCountEXT;
+}
diff --git a/Test/spv.fragmentDensity-neg.frag b/Test/spv.fragmentDensity-neg.frag
new file mode 100644
index 0000000..68e736c
--- /dev/null
+++ b/Test/spv.fragmentDensity-neg.frag
@@ -0,0 +1,12 @@
+#version 450
+
+//make sure the builtins don't exist if the extension isn't enabled.
+//#extension GL_EXT_fragment_invocation_density : require
+
+layout (location = 0) out vec2 FragSize;
+layout (location = 2) out int FragInvocationCount;
+
+void main () {
+    FragSize = gl_FragSizeEXT;
+    FragInvocationCount = gl_FragInvocationCountEXT;
+}
diff --git a/Test/spv.fragmentDensity.frag b/Test/spv.fragmentDensity.frag
new file mode 100644
index 0000000..9b37ba4
--- /dev/null
+++ b/Test/spv.fragmentDensity.frag
@@ -0,0 +1,11 @@
+#version 450
+
+#extension GL_EXT_fragment_invocation_density : require
+
+layout (location = 0) out vec2 FragSize;
+layout (location = 2) out int FragInvocationCount;
+
+void main () {
+    FragSize = gl_FragSizeEXT;
+    FragInvocationCount = gl_FragInvocationCountEXT;
+}
diff --git a/Test/spv.fragmentDensity.vert b/Test/spv.fragmentDensity.vert
new file mode 100644
index 0000000..eaef72d
--- /dev/null
+++ b/Test/spv.fragmentDensity.vert
@@ -0,0 +1,12 @@
+#version 450
+
+// try using a fragment-only extension in a vertex shader
+#extension GL_EXT_fragment_invocation_density : require
+
+layout (location = 0) out uvec2 FragSize;
+layout (location = 2) out int FragInvocationCount;
+
+void main () {
+    FragSize = gl_FragSizeEXT;
+    FragInvocationCount = gl_FragInvocationCountEXT;
+}
diff --git a/Test/spv.fragmentShaderBarycentric.frag b/Test/spv.fragmentShaderBarycentric.frag
new file mode 100644
index 0000000..c923aca
--- /dev/null
+++ b/Test/spv.fragmentShaderBarycentric.frag
@@ -0,0 +1,15 @@
+#version 450
+#extension GL_NV_fragment_shader_barycentric : require
+
+layout(location = 0) pervertexNV in vertices {
+    float attrib;
+    } v[];   
+      
+layout(location = 1) out float value;
+      
+void main () {
+    value = (gl_BaryCoordNV.x * v[0].attrib +
+             gl_BaryCoordNV.y * v[1].attrib +
+             gl_BaryCoordNV.z * v[2].attrib);
+
+}
diff --git a/Test/spv.fragmentShaderBarycentric2.frag b/Test/spv.fragmentShaderBarycentric2.frag
new file mode 100644
index 0000000..4682e4e
--- /dev/null
+++ b/Test/spv.fragmentShaderBarycentric2.frag
@@ -0,0 +1,15 @@
+#version 320 es
+#extension GL_NV_fragment_shader_barycentric : require
+
+precision highp float;
+
+layout(location = 0) pervertexNV in float vertexIDs[3];
+      
+layout(location = 1) out float value;
+      
+void main () {
+    value = (gl_BaryCoordNoPerspNV.x * vertexIDs[0] +
+             gl_BaryCoordNoPerspNV.y * vertexIDs[1] +
+             gl_BaryCoordNoPerspNV.z * vertexIDs[2]);
+
+}
diff --git a/Test/spv.fullyCovered.frag b/Test/spv.fullyCovered.frag
new file mode 100644
index 0000000..c7f3085
--- /dev/null
+++ b/Test/spv.fullyCovered.frag
@@ -0,0 +1,9 @@
+#version 450
+
+#extension GL_NV_conservative_raster_underestimation : enable
+
+out vec4 color;
+
+void main() {
+    color = vec4(gl_FragFullyCoveredNV, 0, 0, 0);
+}
diff --git a/Test/spv.functionNestedOpaque.vert b/Test/spv.functionNestedOpaque.vert
old mode 100755
new mode 100644
diff --git a/Test/spv.glsl.register.noautoassign.frag b/Test/spv.glsl.register.noautoassign.frag
index f754d8a..c385fbb 100644
--- a/Test/spv.glsl.register.noautoassign.frag
+++ b/Test/spv.glsl.register.noautoassign.frag
@@ -1,23 +1,23 @@
 #version 450
 
 uniform layout(binding=0) sampler       g_sSamp1;
-uniform sampler       g_sSamp2;
+uniform layout(binding=1) sampler       g_sSamp2;
 uniform layout(binding=2) sampler       g_sSamp3[2];
-uniform sampler       g_sSamp4[3];
-uniform sampler       g_sSamp5;
+uniform layout(binding=3) sampler       g_sSamp4[3];
+uniform layout(binding=4) sampler       g_sSamp5;
 
-uniform sampler       g_sSamp_unused1;
-uniform sampler       g_sSamp_unused2;
+uniform layout(binding=5) sampler       g_sSamp_unused1;
+uniform layout(binding=6) sampler       g_sSamp_unused2;
 
-uniform layout(binding=1) texture1D          g_tTex1;
-uniform texture1D  g_tTex2;
-uniform layout(binding=3) texture1D          g_tTex3[2];
-uniform texture1D          g_tTex4[3];
-uniform texture1D          g_tTex5;
+uniform layout(binding=7) texture1D          g_tTex1;
+uniform layout(binding=8) texture1D          g_tTex2;
+uniform layout(binding=9) texture1D          g_tTex3[2];
+uniform layout(binding=10) texture1D          g_tTex4[3];
+uniform layout(binding=11) texture1D          g_tTex5;
 
-uniform layout(binding=0)  texture1D          g_tTex_unused1;
-uniform layout(binding=2)  texture1D          g_tTex_unused2;
-uniform texture1D          g_tTex_unused3;
+uniform layout(binding=12) texture1D          g_tTex_unused1;
+uniform layout(binding=13) texture1D          g_tTex_unused2;
+uniform layout(binding=14) texture1D          g_tTex_unused3;
 
 struct MyStruct_t {
     int a;
diff --git a/Test/spv.hlslDebugInfo.vert b/Test/spv.hlslDebugInfo.vert
new file mode 100644
index 0000000..b2bc187
--- /dev/null
+++ b/Test/spv.hlslDebugInfo.vert
@@ -0,0 +1,4 @@
+float4 origMain() : SV_Position

+{

+    return (float4)0;

+}

diff --git a/Test/spv.hlslOffsets.vert b/Test/spv.hlslOffsets.vert
old mode 100755
new mode 100644
diff --git a/Test/spv.image.frag b/Test/spv.image.frag
index 30b339c..d9305ef 100644
--- a/Test/spv.image.frag
+++ b/Test/spv.image.frag
@@ -14,6 +14,8 @@
 

 layout(r32i,    binding = 11)   uniform iimage1D        ii1D;

 layout(r32ui,   binding = 12)   uniform uimage2D        ui2D;

+layout(r32i,    binding = 13)   uniform iimage2DMS      ii2DMS;

+layout(r32ui,   binding = 14)   uniform uimage2DMSArray ui2DMSArray;

 

 flat in int     ic1D;

 flat in ivec2   ic2D;

@@ -85,6 +87,8 @@
     ui      += imageAtomicExchange(ui2D, ic2D, value);

     iv.x    += imageAtomicCompSwap(ii1D, ic1D, 18, 17);

     ui      += imageAtomicCompSwap(ui2D, ic2D, 19u, value);

+    iv.x    += imageAtomicCompSwap(ii2DMS, ic2D, 2, 18, 17);

+    ui      += imageAtomicCompSwap(ui2DMSArray, ic3D, 3, 19u, value);

 

     imageStore(wo2D, ic2D, v);

 

diff --git a/Test/spv.imageLoadStoreLod.frag b/Test/spv.imageLoadStoreLod.frag
new file mode 100644
index 0000000..0da1da1
--- /dev/null
+++ b/Test/spv.imageLoadStoreLod.frag
@@ -0,0 +1,36 @@
+#version 450 core

+

+#extension GL_AMD_shader_image_load_store_lod: enable

+

+layout(rgba32f,  binding = 0) uniform image1D         i1D;

+layout(rgba32f,  binding = 1) uniform image2D         i2D;

+layout(rgba32f,  binding = 2) uniform image3D         i3D;

+layout(rgba32i,  binding = 3) uniform iimageCube      iiCube;

+layout(rgba32i,  binding = 4) uniform iimage1DArray   ii1DArray;

+layout(rgba32ui, binding = 5) uniform uimage2DArray   ui2DArray;

+layout(rgba32ui, binding = 6) uniform uimageCubeArray uiCubeArray;

+

+layout(location = 0) out vec4 fragColor;

+

+void main()

+{

+    const int c1 = 1;

+    const ivec2 c2 = ivec2(2, 3);

+    const ivec3 c3 = ivec3(4, 5, 6);

+

+    const int lod = 3;

+

+    vec4 f4 = vec4(0.0);

+    f4 += imageLoadLodAMD(i1D, c1, lod);

+    f4 += imageLoadLodAMD(i2D, c2, lod);

+    f4 += imageLoadLodAMD(i3D, c3, lod);

+

+    imageStoreLodAMD(iiCube, c3, lod, ivec4(f4));

+    imageStoreLodAMD(ii1DArray, c2, lod, ivec4(f4));

+

+    uvec4 u4;

+    sparseImageLoadLodAMD(ui2DArray, c3, lod, u4);

+    sparseImageLoadLodAMD(uiCubeArray, c3, lod, u4);

+

+    fragColor = f4 + vec4(u4);

+}
\ No newline at end of file
diff --git a/Test/spv.int16.amd.frag b/Test/spv.int16.amd.frag
new file mode 100644
index 0000000..818e6d8
--- /dev/null
+++ b/Test/spv.int16.amd.frag
@@ -0,0 +1,314 @@
+#version 450 core
+
+#extension GL_ARB_gpu_shader_int64: enable
+#extension GL_AMD_gpu_shader_half_float: enable
+#extension GL_AMD_gpu_shader_int16: enable
+
+layout(binding = 0) uniform Uniforms
+{
+    uint i;
+};
+
+// int16/uint16 in block
+layout(std140, binding = 1) uniform Block
+{
+    i16vec3  i16v;
+    uint16_t u16;
+} block;
+
+// int16/uint16 for input
+layout(location = 0) in flat u16vec3 iu16v;
+layout(location = 1) in flat int16_t ii16;
+
+void literal()
+{
+    const int16_t i16c[3] =
+    {
+        0x111S,         // Hex
+        -2s,            // Dec
+        0400s,          // Oct
+    };
+
+    const uint16_t u16c[] =
+    {
+        0xFFFFus,       // Hex
+        65535US,        // Dec
+        0177777us,      // Oct
+    };
+
+    uint16_t u16 = i16c[i] + u16c[i];
+}
+
+void operators()
+{
+    u16vec3  u16v;
+    int16_t  i16;
+    uint16_t u16;
+    int      i;
+    uint     u;
+    bool     b;
+
+    // Unary
+    u16v++;
+    i16--;
+    ++i16;
+    --u16v;
+
+    u16v = ~u16v;
+
+    i16 = +i16;
+    u16v = -u16v;
+
+    // Arithmetic
+    u16  += i16;
+    u16v -= u16v;
+    i16  *= i16;
+    u16v /= u16v;
+    u16v %= i16;
+
+    u16v = u16v + u16v;
+    u16  = i16 - u16;
+    u16v = u16v * i16;
+    i16  = i16 * i16;
+    i16  = i16 % i16;
+
+    // Shift
+    u16v <<= i16;
+    i16  >>= u16v.y;
+
+    i16  = i16 << u16v.z;
+    u16v = u16v << i16;
+
+    // Relational
+    b = (u16v.x != i16);
+    b = (i16 == u16v.x);
+    b = (u16v.x > u16v.y);
+    b = (i16 < u);
+    b = (u16v.y >= u16v.x);
+    b = (i16 <= i);
+
+    // Bitwise
+    u16v |= i16;
+    u16  = i16 | u16;
+    i16  &= i16;
+    u16v = u16v & u16v;
+    u16v ^= i16;
+    u16v = u16v ^ i16;
+}
+
+void typeCast()
+{
+    bvec2 bv;
+    ivec2 iv;
+    uvec2 uv;
+    vec2  fv;
+    dvec2 dv;
+
+    f16vec2 f16v;
+    i64vec2 i64v;
+    u64vec2 u64v;
+    i16vec2 i16v;
+    u16vec2 u16v;
+
+    i16v = i16vec2(bv);   // bool -> int16
+    u16v = u16vec2(bv);   // bool -> uint16
+    bv   = bvec2(i16v);   // int16  -> bool
+    bv   = bvec2(u16v);   // uint16 -> bool
+
+    i16v = i16vec2(iv);   // int -> int16
+    u16v = u16vec2(iv);   // int -> uint16
+    iv   = i16v;          // int16  -> int
+    iv   = ivec2(u16v);   // uint16 -> int
+
+    i16v = i16vec2(uv);   // uint -> int16
+    u16v = u16vec2(uv);   // uint -> uint16
+    uv   = i16v;          // int16  -> uint
+    uv   = u16v;          // uint16 -> uint
+
+    i16v = i16vec2(fv);   // float -> int16
+    u16v = u16vec2(fv);   // float -> uint16
+    fv   = i16v;          // int16  -> float
+    fv   = u16v;          // uint16 -> float
+
+    i16v = i16vec2(dv);   // double -> int16
+    u16v = u16vec2(dv);   // double -> uint16
+    dv   = i16v;          // int16  -> double
+    dv   = u16v;          // uint16 -> double
+
+    i16v = i16vec2(f16v); // float16 -> int16
+    u16v = u16vec2(f16v); // float16 -> uint16
+    f16v = i16v;          // int16  -> float16
+    f16v = u16v;          // uint16 -> float16
+
+    i16v = i16vec2(i64v); // int64 -> int16
+    u16v = u16vec2(i64v); // int64 -> uint16
+    i64v = i16v;          // int16  -> int64
+    i64v = i64vec2(u16v); // uint16 -> int64
+
+    i16v = i16vec2(u64v); // uint64 -> int16
+    u16v = u16vec2(u64v); // uint64 -> uint16
+    u64v = i16v;          // int16  -> uint64
+    u64v = u16v;          // uint16 -> uint64
+
+    i16v = i16vec2(u16v); // uint16 -> int16
+    u16v = i16v;          // int16 -> uint16
+}
+
+void builtinFuncs()
+{
+    i16vec2  i16v;
+    u16vec3  u16v;
+    f16vec3  f16v;
+    bvec3    bv;
+
+    int16_t  i16;
+    uint16_t u16;
+
+    // abs()
+    i16v = abs(i16v);
+
+    // sign()
+    i16v  = sign(i16v);
+
+    // min()
+    i16v = min(i16v, i16);
+    i16v = min(i16v, i16vec2(-1s));
+    u16v = min(u16v, u16);
+    u16v = min(u16v, u16vec3(0us));
+
+    // max()
+    i16v = max(i16v, i16);
+    i16v = max(i16v, i16vec2(-1s));
+    u16v = max(u16v, u16);
+    u16v = max(u16v, u16vec3(0us));
+
+    // clamp()
+    i16v = clamp(i16v, -i16, i16);
+    i16v = clamp(i16v, -i16v, i16v);
+    u16v = clamp(u16v, -u16, u16);
+    u16v = clamp(u16v, -u16v, u16v);
+
+    // mix()
+    i16  = mix(i16v.x, i16v.y, true);
+    i16v = mix(i16vec2(i16), i16vec2(-i16), bvec2(false));
+    u16  = mix(u16v.x, u16v.y, true);
+    u16v = mix(u16vec3(u16), u16vec3(-u16), bvec3(false));
+
+    // frexp()
+    i16vec3 exp;
+    f16v = frexp(f16v, exp);
+
+    // ldexp()
+    f16v = ldexp(f16v, exp);
+
+    // float16BitsToInt16()
+    i16v = float16BitsToInt16(f16v.xy);
+
+    // float16BitsToUint16()
+    u16v.x = float16BitsToUint16(f16v.z);
+
+    // int16BitsToFloat16()
+    f16v.xy = int16BitsToFloat16(i16v);
+
+    // uint16BitsToFloat16()
+    f16v = uint16BitsToFloat16(u16v);
+
+    // packInt2x16()
+    int packi = packInt2x16(i16v);
+
+    // unpackInt2x16()
+    i16v = unpackInt2x16(packi);
+
+    // packUint2x16()
+    uint packu = packUint2x16(u16v.xy);
+
+    // unpackUint2x16()
+    u16v.xy = unpackUint2x16(packu);
+
+    // packInt4x16()
+    int64_t packi64 = packInt4x16(i16vec4(i16));
+
+    // unpackInt4x16()
+    i16v = unpackInt4x16(packi64).xy;
+
+    // packUint4x16()
+    uint64_t packu64 = packUint4x16(u16vec4(u16));
+
+    // unpackUint4x16()
+    u16v = unpackUint4x16(packu64).xyz;
+
+    // lessThan()
+    bv    = lessThan(u16v, u16vec3(u16));
+    bv.xy = lessThan(i16v, i16vec2(i16));
+
+    // lessThanEqual()
+    bv    = lessThanEqual(u16v, u16vec3(u16));
+    bv.xy = lessThanEqual(i16v, i16vec2(i16));
+
+    // greaterThan()
+    bv    = greaterThan(u16v, u16vec3(u16));
+    bv.xy = greaterThan(i16v, i16vec2(i16));
+
+    // greaterThanEqual()
+    bv    = greaterThanEqual(u16v, u16vec3(u16));
+    bv.xy = greaterThanEqual(i16v, i16vec2(i16));
+
+    // equal()
+    bv    = equal(u16v, u16vec3(u16));
+    bv.xy = equal(i16v, i16vec2(i16));
+
+    // notEqual()
+    bv    = notEqual(u16v, u16vec3(u16));
+    bv.xy = notEqual(i16v, i16vec2(i16));
+}
+
+// Type conversion for specialization constant
+layout(constant_id = 100) const int64_t  si64 = -10L;
+layout(constant_id = 101) const uint64_t su64 = 20UL;
+layout(constant_id = 102) const int  si = -5;
+layout(constant_id = 103) const uint su = 4;
+layout(constant_id = 104) const bool sb = true;
+layout(constant_id = 105) const int16_t si16 = -5S;
+layout(constant_id = 106) const uint16_t su16 = 4US;
+
+// bool <-> int16/uint16
+const bool i16_to_b = bool(si16);
+const bool u16_to_b = bool(su16);
+const int16_t  b_to_i16 = int16_t(sb);
+const uint16_t b_to_u16 = uint16_t(sb);
+
+// int <-> int16/uint16
+const int i16_to_i = int(si16);
+const int u16_to_i = int(su16);
+const int16_t  i_to_i16 = int16_t(si);
+const uint16_t i_to_u16 = uint16_t(si);
+
+// uint <-> int16/uint16
+const uint i16_to_u = uint(si16);
+const uint u16_to_u = uint(su16);
+const int16_t  u_to_i16 = int16_t(su);
+const uint16_t u_to_u16 = uint16_t(su);
+
+// int64 <-> int16/uint16
+const int64_t i16_to_i64 = int64_t(si16);
+const int64_t u16_to_i64 = int64_t(su16);
+const int16_t  i64_to_i16 = int16_t(si64);
+const uint16_t i64_to_u16 = uint16_t(si64);
+
+// uint64 <-> int16/uint16
+const uint64_t i16_to_u64 = uint64_t(si16);
+const uint64_t u16_to_u64 = uint64_t(su16);
+const int16_t  u64_to_i16 = int16_t(su64);
+const uint16_t u64_to_u16 = uint16_t(su64);
+
+// int16 <-> uint16
+const uint16_t i16_to_u16 = uint16_t(si16);
+const int16_t  u16_to_i16 = int16_t(su16);
+
+void main()
+{
+    literal();
+    operators();
+    typeCast();
+    builtinFuncs();
+}
diff --git a/Test/spv.int16.frag b/Test/spv.int16.frag
new file mode 100644
index 0000000..2feff4f
--- /dev/null
+++ b/Test/spv.int16.frag
@@ -0,0 +1,251 @@
+#version 450
+
+#extension GL_EXT_shader_explicit_arithmetic_types: enable
+#extension GL_EXT_shader_explicit_arithmetic_types_int8: require
+#extension GL_EXT_shader_explicit_arithmetic_types_int16: require
+#extension GL_EXT_shader_explicit_arithmetic_types_int32: require
+#extension GL_EXT_shader_explicit_arithmetic_types_int64: require
+#extension GL_EXT_shader_explicit_arithmetic_types_float16: require
+#extension GL_EXT_shader_explicit_arithmetic_types_float32: require
+#extension GL_EXT_shader_explicit_arithmetic_types_float64: require
+
+layout(binding = 0) uniform Uniforms
+{
+    uint index;
+};
+
+layout(std140, binding = 1) uniform Block
+{
+    int16_t   i16;
+    i16vec2   i16v2;
+    i16vec3   i16v3;
+    i16vec4   i16v4;
+    uint16_t  u16;
+    u16vec2   u16v2;
+    u16vec3   u16v3;
+    u16vec4   u16v4;
+} block;
+
+void main()
+{
+}
+
+void literal()
+{
+    const int16_t i16Const[3] =
+    {
+        int16_t(-0x1111),           // Hex
+        int16_t(-1),                // Dec
+        int16_t(040000),            // Oct
+    };
+
+    int16_t i16 = i16Const[index];
+
+    const uint16_t u16Const[] =
+    {
+        uint16_t(0xFFFF),             // Hex
+        uint16_t(65535),              // Dec
+        uint16_t(077777),             // Oct
+    };
+
+    uint16_t u16 = u16Const[index];
+}
+
+void typeCast16()
+{
+    i8vec2 i8v;
+    u8vec2 u8v;
+    i16vec2 i16v;
+    u16vec2 u16v;
+    i32vec2 i32v;
+    u32vec2 u32v;
+    i64vec2 i64v;
+    u64vec2 u64v;
+    f16vec2 f16v;
+    f32vec2 f32v;
+    f64vec2 f64v;
+    bvec2   bv;
+
+    i32v = i16v;     // int16_t  ->   int32_t
+    i32v = u16v;     // uint16_t ->   int32_t
+    u16v = i16v;     // int16_t  ->  uint16_t
+    u32v = i16v;     // int16_t  ->  uint32_t
+    i64v = i16v;     // int16_t  ->   int64_t
+    u64v = i16v;     // int16_t  ->  uint64_t
+    u32v = u16v;     // uint16_t ->  uint32_t
+    i64v = u16v;     // uint16_t ->   int64_t
+    u64v = u16v;     // uint16_t ->  uint64_t
+    f16v = i16v;     // int16_t  ->  float16_t
+    f32v = i16v;     // int16_t  ->  float32_t
+    f64v = i16v;     // int16_t  ->  float64_t
+    f16v = u16v;     // uint16_t ->  float16_t
+    f32v = u16v;     // uint16_t ->  float32_t
+    f64v = u16v;     // uint16_t ->  float64_t
+
+    i32v = i32vec2(i16v);     // int16_t  ->   int32_t
+    i32v = i32vec2(u16v);     // uint16_t ->   int32_t
+    u16v = u16vec2(i16v);     // int16_t  ->  uint16_t
+    u32v = u32vec2(i16v);     // int16_t  ->  uint32_t
+    i64v = i64vec2(i16v);     // int16_t  ->   int64_t
+    u64v = i64vec2(i16v);     // int16_t  ->  uint64_t
+    u32v = u32vec2(u16v);     // uint16_t ->  uint32_t
+    i64v = i64vec2(u16v);     // uint16_t ->   int64_t
+    u64v = i64vec2(u16v);     // uint16_t ->  uint64_t
+    f16v = f16vec2(i16v);     // int16_t  ->  float16_t
+    f32v = f32vec2(i16v);     // int16_t  ->  float32_t
+    f64v = f64vec2(i16v);     // int16_t  ->  float64_t
+    f16v = f16vec2(u16v);     // uint16_t ->  float16_t
+    f32v = f32vec2(u16v);     // uint16_t ->  float32_t
+    f64v = f64vec2(u16v);     // uint16_t ->  float64_t
+
+    i8v  = i8vec2(i16v);      // int16_t  ->   int8_t
+    i8v  = i8vec2(u16v);      // uint16_t ->   int8_t
+    u8v  = u8vec2(i16v);      // int16_t  ->  uint8_t
+    u8v  = u8vec2(u16v);      // uint16_t ->  uint8_t
+    i16v = u8vec2(u16v);      // uint16_t ->   int16_t
+    i16v = i16vec2(bv);       // bool     ->   int16
+    u16v = u16vec2(bv);       // bool     ->   uint16
+    bv   = bvec2(i16v);       // int16    ->   bool
+    bv   = bvec2(u16v);       // uint16   ->   bool
+}
+void operators()
+{
+    u16vec3 u16v;
+    int16_t i16;
+    uvec3   uv;
+    int32_t i;
+    int64_t i64;
+    bool    b;
+
+    // Unary
+    u16v++;
+    i16--;
+    ++i16;
+    --u16v;
+
+    u16v = ~u16v;
+
+    i16 = +i16;
+    u16v = -u16v;
+
+    // Arithmetic
+    i16  += i16;
+    u16v -= u16v;
+    i  *= i16;
+    uv /= u16v;
+    uv %= i16;
+
+    uv = u16v + uv;
+    i64  = i16 - i64;
+    uv = u16v * uv;
+    i64  = i16 * i64;
+    i  = i16 % i;
+
+    // Shift
+    u16v <<= i16;
+    i16  >>= u16v.y;
+
+    i16  = i16 << u16v.z;
+    uv = u16v << i;
+
+    // Relational
+    b = (u16v.x != i16);
+    b = (i16 == u16v.x);
+    b = (u16v.x > uv.y);
+    b = (i16 < i);
+    b = (u16v.y >= uv.x);
+    b = (i16 <= i);
+
+    // Bitwise
+    uv |= i16;
+    i  = i16 | i;
+    i64  &= i16;
+    uv = u16v & uv;
+    uv ^= i16;
+    u16v = u16v ^ i16;
+}
+
+void builtinFuncs()
+{
+    i16vec2  i16v;
+    i16vec4  i16v4;
+    u16vec3  u16v;
+    u16vec2  u16v2;
+    u16vec4  u16v4;
+    bvec3   bv;
+    int16_t i16;
+    uint16_t u16;
+    int32_t i32;
+    uint32_t u32;
+    int64_t i64;
+    uint64_t u64;
+
+    // abs()
+    i16v = abs(i16v);
+
+    // sign()
+    i16  = sign(i16);
+
+    // min()
+    i16v = min(i16v, i16);
+    i16v = min(i16v, i16vec2(-1));
+    u16v = min(u16v, u16);
+    u16v = min(u16v, u16vec3(0));
+
+    // max()
+    i16v = max(i16v, i16);
+    i16v = max(i16v, i16vec2(-1));
+    u16v = max(u16v, u16);
+    u16v = max(u16v, u16vec3(0));
+
+    // clamp()
+    i16v = clamp(i16v, -i16, i16);
+    i16v = clamp(i16v, -i16v, i16v);
+    u16v = clamp(u16v, -u16, u16);
+    u16v = clamp(u16v, -u16v, u16v);
+
+    // mix()
+    i16  = mix(i16v.x, i16v.y, true);
+    i16v = mix(i16vec2(i16), i16vec2(-i16), bvec2(false));
+    u16  = mix(u16v.x, u16v.y, true);
+    u16v = mix(u16vec3(u16), u16vec3(-u16), bvec3(false));
+
+    //pack
+    i32 = pack32(i16v);
+    i64 = pack64(i16v4);
+    u32 = pack32(u16v2);
+    u64 = pack64(u16v4);
+
+    i16v  = unpack16(i32);
+    i16v4 = unpack16(i64);
+    u16v2 = unpack16(u32);
+    u16v4 = unpack16(u64);
+
+    // lessThan()
+    bv    = lessThan(u16v, u16vec3(u16));
+    bv.xy = lessThan(i16v, i16vec2(i16));
+
+    // lessThanEqual()
+    bv    = lessThanEqual(u16v, u16vec3(u16));
+    bv.xy = lessThanEqual(i16v, i16vec2(i16));
+
+    // greaterThan()
+    bv    = greaterThan(u16v, u16vec3(u16));
+    bv.xy = greaterThan(i16v, i16vec2(i16));
+
+    // greaterThanEqual()
+    bv    = greaterThanEqual(u16v, u16vec3(u16));
+    bv.xy = greaterThanEqual(i16v, i16vec2(i16));
+
+    // equal()
+    bv    = equal(u16v, u16vec3(u16));
+    bv.xy = equal(i16v, i16vec2(i16));
+
+    // notEqual()
+    bv    = notEqual(u16v, u16vec3(u16));
+    bv.xy = notEqual(i16v, i16vec2(i16));
+}
+
+// Type conversion for specialization constant
+layout(constant_id = 100) const int16_t  si16 = int16_t(-10);
+layout(constant_id = 101) const uint16_t su16 = uint16_t(20);
diff --git a/Test/spv.int32.frag b/Test/spv.int32.frag
new file mode 100644
index 0000000..0a39ecd
--- /dev/null
+++ b/Test/spv.int32.frag
@@ -0,0 +1,256 @@
+#version 450
+
+#extension GL_EXT_shader_explicit_arithmetic_types: enable
+#extension GL_EXT_shader_explicit_arithmetic_types_int8: require
+#extension GL_EXT_shader_explicit_arithmetic_types_int16: require
+#extension GL_EXT_shader_explicit_arithmetic_types_int32: require
+#extension GL_EXT_shader_explicit_arithmetic_types_int64: require
+#extension GL_EXT_shader_explicit_arithmetic_types_float16: require
+#extension GL_EXT_shader_explicit_arithmetic_types_float32: require
+#extension GL_EXT_shader_explicit_arithmetic_types_float64: require
+
+layout(binding = 0) uniform Uniforms
+{
+    uint index;
+};
+
+layout(std140, binding = 1) uniform Block
+{
+    int32_t   i32;
+    i32vec2   i32v2;
+    i32vec3   i32v3;
+    i32vec4   i32v4;
+    uint32_t  u32;
+    u32vec2   u32v2;
+    u32vec3   u32v3;
+    u32vec4   u32v4;
+} block;
+
+void main()
+{
+}
+
+void literal()
+{
+
+    const int32_t i32Const[3] =
+    {
+        -0x11111111,           // Hex
+        -1,                    // Dec
+        04000000000,           // Oct
+    };
+
+    int32_t i32 = i32Const[index];
+
+    const uint32_t u32Const[] =
+    {
+        0xFFFFFFFF,             // Hex
+        4294967295,             // Dec
+        017777777777,           // Oct
+    };
+
+    uint32_t u32 = u32Const[index];
+}
+
+void typeCast32()
+{
+    i8vec2 i8v;
+    u8vec2 u8v;
+    i16vec2 i16v;
+    u16vec2 u16v;
+    i32vec2 i32v;
+    u32vec2 u32v;
+    i64vec2 i64v;
+    u64vec2 u64v;
+    f16vec2 f16v;
+    f32vec2 f32v;
+    f64vec2 f64v;
+    bvec2   bv;
+
+    u32v = i32v;     // int32_t  ->  uint32_t
+    i64v = i32v;     // int32_t  ->   int64_t
+    u64v = i32v;     // int32_t  ->  uint64_t
+    i64v = u32v;     // uint32_t ->   int64_t
+    u64v = u32v;     // uint32_t ->  uint64_t
+    f32v = i32v;     // int32_t  ->  float32_t
+    f64v = i32v;     // int32_t  ->  float64_t
+    f32v = u32v;     // uint32_t ->  float32_t
+    f64v = u32v;     // uint32_t ->  float64_t
+
+    i8v =  i8vec2(i32v);       // int32_t   ->   int8_t
+    i8v =  i8vec2(u32v);       // uint32_t  ->   int8_t
+    i16v = i16vec2(i32v);      // int32_t   ->   int16_t
+    i16v = i16vec2(u32v);      // uint32_t  ->   int16_t
+    i32v = i32vec2(i32v);      // int32_t   ->   int32_t
+    i32v = i32vec2(u32v);      // uint32_t  ->   int32_t
+    i64v = i64vec2(i32v);      // int32_t   ->   int64_t
+	i64v = i64vec2(u32v);      // uint32_t  ->   int64_t
+	u8v =  u8vec2(i32v);       // int32_t   ->   uint8_t
+    u8v =  u8vec2(u32v);       // uint32_t  ->   uint8_t
+    u16v = u16vec2(i32v);      // int32_t   ->   uint16_t
+    u16v = u16vec2(u32v);      // uint32_t  ->   uint16_t
+    u32v = u32vec2(i32v);      // int32_t   ->   uint32_t
+    u32v = u32vec2(u32v);      // uint32_t  ->   uint32_t
+    u64v = u64vec2(i32v);      // int32_t   ->   uint64_t
+    u64v = u64vec2(u32v);      // uint32_t  ->   uint64_t
+
+    f16v = f16vec2(i32v);      // int32_t   ->  float16_t
+    f32v = f32vec2(i32v);      // int32_t   ->  float32_t
+    f64v = f64vec2(i32v);      // int32_t   ->  float64_t
+    f16v = f16vec2(u32v);      // uint32_t  ->  float16_t
+    f32v = f32vec2(u32v);      // uint32_t  ->  float32_t
+    f64v = f64vec2(u32v);      // uint32_t  ->  float64_t
+
+    i32v = i32vec2(bv);       // bool     ->   int32
+    u32v = u32vec2(bv);       // bool     ->   uint32
+    bv   = bvec2(i32v);       // int32    ->   bool
+    bv   = bvec2(u32v);       // uint32   ->   bool
+}
+
+void operators()
+{
+    u32vec3 u32v;
+    int32_t i32;
+    uvec3   uv;
+    int32_t i;
+    int64_t i64;
+    bool    b;
+
+    // Unary
+    u32v++;
+    i32--;
+    ++i32;
+    --u32v;
+
+    u32v = ~u32v;
+
+    i32 = +i32;
+    u32v = -u32v;
+
+    // Arithmetic
+    i32  += i32;
+    u32v -= u32v;
+    i  *= i32;
+    uv /= u32v;
+    uv %= i32;
+
+    uv = u32v + uv;
+    i64  = i32 - i64;
+    uv = u32v * uv;
+    i64  = i32 * i64;
+    i  = i32 % i;
+
+    // Shift
+    u32v <<= i32;
+    i32  >>= u32v.y;
+
+    i64  = i64 << u32v.z;
+    uv = u32v << i;
+
+    // Relational
+    b = (u32v.x != i32);
+    b = (i32 == u32v.x);
+    b = (u32v.x > uv.y);
+    b = (i32 < i);
+    b = (u32v.y >= uv.x);
+    b = (i32 <= i);
+
+    // Bitwise
+    uv |= i32;
+    i  = i32 | i;
+    i64  &= i32;
+    uv = u32v & uv;
+    uv ^= i32;
+    u32v = u32v ^ i32;
+}
+
+void builtinFuncs()
+{
+    i32vec2  i32v;
+    i32vec4  i32v4;
+    u32vec3  u32v;
+    u32vec2  u32v2;
+    u32vec4  u32v4;
+    bvec3   bv;
+    int32_t i32;
+    uint32_t u32;
+    int64_t i64;
+    uint64_t u64;
+    i8vec4  i8v4;
+    u8vec4  u8v4;
+    i16vec2  i16v2;
+    u16vec2  u16v2;
+
+    // abs()
+    i32v = abs(i32v);
+
+    // sign()
+    i32  = sign(i32);
+
+    // min()
+    i32v = min(i32v, i32);
+    i32v = min(i32v, i32vec2(-1));
+    u32v = min(u32v, u32);
+    u32v = min(u32v, u32vec3(0));
+
+    // max()
+    i32v = max(i32v, i32);
+    i32v = max(i32v, i32vec2(-1));
+    u32v = max(u32v, u32);
+    u32v = max(u32v, u32vec3(0));
+
+    // clamp()
+    i32v = clamp(i32v, -i32, i32);
+    i32v = clamp(i32v, -i32v, i32v);
+    u32v = clamp(u32v, -u32, u32);
+    u32v = clamp(u32v, -u32v, u32v);
+
+    // mix()
+    i32  = mix(i32v.x, i32v.y, true);
+    i32v = mix(i32vec2(i32), i32vec2(-i32), bvec2(false));
+    u32  = mix(u32v.x, u32v.y, true);
+    u32v = mix(u32vec3(u32), u32vec3(-u32), bvec3(false));
+
+    //pack
+    i32 = pack32(i8v4);
+    i32 = pack32(i16v2);
+    u32 = pack32(u8v4);
+    u32 = pack32(u16v2);
+
+    i32v  = unpack32(i64);
+    u32v2  = unpack32(u64);
+
+    // lessThan()
+    bv    = lessThan(u32v, u32vec3(u32));
+    bv.xy = lessThan(i32v, i32vec2(i32));
+
+    // lessThanEqual()
+    bv    = lessThanEqual(u32v, u32vec3(u32));
+    bv.xy = lessThanEqual(i32v, i32vec2(i32));
+
+    // greaterThan()
+    bv    = greaterThan(u32v, u32vec3(u32));
+    bv.xy = greaterThan(i32v, i32vec2(i32));
+
+    // greaterThanEqual()
+    bv    = greaterThanEqual(u32v, u32vec3(u32));
+    bv.xy = greaterThanEqual(i32v, i32vec2(i32));
+
+    // equal()
+    bv    = equal(u32v, u32vec3(u32));
+    bv.xy = equal(i32v, i32vec2(i32));
+
+    // notEqual()
+    bv    = notEqual(u32v, u32vec3(u32));
+    bv.xy = notEqual(i32v, i32vec2(i32));
+}
+
+// Type conversion for specialization constant
+layout(constant_id = 100) const int32_t  si32 = -10;
+layout(constant_id = 101) const uint32_t su32 = 20U;
+layout(constant_id = 102) const int  si = -5;
+layout(constant_id = 103) const uint su = 4;
+layout(constant_id = 104) const bool sb = true;
+
+#define UINT32_MAX  4294967295u
+uint32_t u32Max = UINT32_MAX;
diff --git a/Test/spv.int64.frag b/Test/spv.int64.frag
index 8021b7e..5390fb7 100644
--- a/Test/spv.int64.frag
+++ b/Test/spv.int64.frag
@@ -1,6 +1,7 @@
 #version 450

 

 #extension GL_ARB_gpu_shader_int64: enable

+#extension GL_EXT_shader_explicit_arithmetic_types_int64: require

 

 layout(binding = 0) uniform Uniforms

 {

@@ -115,6 +116,8 @@
     i64  = i64 % i;

 

     // Shift

+    u64v = u64v << i;

+    i64 = i64 >> uv.y;

     u64v <<= i;

     i64  >>= uv.y;

 

@@ -233,6 +236,7 @@
 layout(constant_id = 102) const int  si = -5;

 layout(constant_id = 103) const uint su = 4;

 layout(constant_id = 104) const bool sb = true;

+layout(constant_id = 105) const uint64_t su64inc = su64 + 1UL;

 

 // bool <-> int64/uint64

 const bool i64_to_b = bool(si64);

diff --git a/Test/spv.int8.frag b/Test/spv.int8.frag
new file mode 100644
index 0000000..80702b7
--- /dev/null
+++ b/Test/spv.int8.frag
@@ -0,0 +1,253 @@
+#version 450
+
+#extension GL_EXT_shader_explicit_arithmetic_types: enable
+#extension GL_EXT_shader_explicit_arithmetic_types_int8: require
+#extension GL_EXT_shader_explicit_arithmetic_types_int16: require
+#extension GL_EXT_shader_explicit_arithmetic_types_int32: require
+#extension GL_EXT_shader_explicit_arithmetic_types_int64: require
+#extension GL_EXT_shader_explicit_arithmetic_types_float16: require
+#extension GL_EXT_shader_explicit_arithmetic_types_float32: require
+#extension GL_EXT_shader_explicit_arithmetic_types_float64: require
+
+layout(binding = 0) uniform Uniforms
+{
+    uint index;
+};
+
+layout(std140, binding = 1) uniform Block
+{
+    int8_t   i8;
+    i8vec2   i8v2;
+    i8vec3   i8v3;
+    i8vec4   i8v4;
+    uint8_t  u8;
+    u8vec2   u8v2;
+    u8vec3   u8v3;
+    u8vec4   u8v4;
+} block;
+
+void main()
+{
+}
+
+void literal()
+{
+    const int8_t i8Const[3] =
+    {
+        int8_t(-0x11),           // Hex
+        int8_t(-1),              // Dec
+        int8_t(0400),            // Oct
+    };
+
+    int8_t i8 = i8Const[index];
+
+    const uint8_t u8Const[] =
+    {
+        uint8_t(0xFF),             // Hex
+        uint8_t(255),              // Dec
+        uint8_t(0177),             // Oct
+    };
+
+    uint8_t u8 = u8Const[index];
+}
+
+void typeCast8()
+{
+    i8vec2 i8v;
+    u8vec2 u8v;
+    i16vec2 i16v;
+    u16vec2 u16v;
+    i32vec2 i32v;
+    u32vec2 u32v;
+    i64vec2 i64v;
+    u64vec2 u64v;
+    f16vec2 f16v;
+    f32vec2 f32v;
+    f64vec2 f64v;
+    bvec2   bv;
+
+    u8v = i8v;      // int8_t  ->  uint8_t
+    i16v = i8v;     // int8_t  ->   int16_t
+    i16v = u8v;     // uint8_t ->   int16_t
+    i32v = i8v;     // int8_t  ->   int32_t
+    i32v = u8v;     // uint8_t ->   int32_t
+    u32v = i8v;     // int8_t  ->  uint32_t
+    i64v = i8v;     // int8_t  ->   int64_t
+    u64v = i8v;     // int8_t  ->  uint64_t
+    u32v = u8v;     // uint8_t ->  uint32_t
+    i64v = u8v;     // uint8_t ->   int64_t
+    u64v = u8v;     // uint8_t ->  uint64_t
+    f16v = i8v;     // int8_t  ->  float16_t
+    f32v = i8v;     // int8_t  ->  float32_t
+    f64v = i8v;     // int8_t  ->  float64_t
+    f16v = u8v;     // uint8_t ->  float16_t
+    f32v = u8v;     // uint8_t ->  float32_t
+    f64v = u8v;     // uint8_t ->  float64_t
+
+    i8v =  i8vec2(u8v);       // uint8_t  ->   int8_t
+    i16v = i16vec2(i8v);      // int8_t   ->   int16_t
+    i16v = i16vec2(u8v);      // uint8_t  ->   int16_t
+    i32v = i32vec2(i8v);      // int8_t   ->   int32_t
+    i32v = i32vec2(u8v);      // uint8_t  ->   int32_t
+    i64v = i64vec2(i8v);      // int8_t   ->   int64_t
+    u64v = i64vec2(i8v);      // int8_t   ->  uint64_t
+    u16v = u16vec2(i8v);      // int8_t   ->  uint16_t
+    u16v = u16vec2(u8v);      // uint8_t  ->  uint16_t
+    u32v = u32vec2(u8v);      // uint8_t  ->  uint32_t
+    i64v = i64vec2(u8v);      // uint8_t  ->   int64_t
+    u64v = i64vec2(u8v);      // uint8_t  ->  uint64_t
+    f16v = f16vec2(i8v);      // int8_t   ->  float16_t
+    f32v = f32vec2(i8v);      // int8_t   ->  float32_t
+    f64v = f64vec2(i8v);      // int8_t   ->  float64_t
+    f16v = f16vec2(u8v);      // uint8_t  ->  float16_t
+    f32v = f32vec2(u8v);      // uint8_t  ->  float32_t
+    f64v = f64vec2(u8v);      // uint8_t  ->  float64_t
+
+    i8v = i8vec2(bv);       // bool     ->   int8
+    u8v = u8vec2(bv);       // bool     ->   uint8
+    bv  = bvec2(i8v);       // int8    ->   bool
+    bv  = bvec2(u8v);       // uint8   ->   bool
+}
+
+void operators()
+{
+    u8vec3 u8v;
+    int8_t i8;
+    uvec3   uv;
+    int32_t i;
+    int16_t i16;
+    bool    b;
+
+    // Unary
+    u8v++;
+    i8--;
+    ++i8;
+    --u8v;
+
+    u8v = ~u8v;
+
+    i8 = +i8;
+    u8v = -u8v;
+
+    // Arithmetic
+    i8  += i8;
+    u8v -= u8v;
+    i  *= i8;
+    uv /= u8v;
+    uv %= i8;
+
+    uv = u8v + uv;
+    i16  = i8 - i16;
+    uv = u8v * uv;
+    i16  = i8 * i16;
+    i  = i8 % i;
+
+    // Shift
+    u8v <<= i8;
+    i8  >>= u8v.y;
+
+    i8  = i8 << u8v.z;
+    u8v = u8v << i8;
+
+    // Relational
+    b = (u8v.x != i8);
+    b = (i8 == u8v.x);
+    b = (u8v.x > uv.y);
+    b = (i8 < i);
+    b = (u8v.y >= uv.x);
+    b = (i8 <= i);
+
+    // Bitwise
+    uv |= i8;
+    i  = i8 | i;
+    i16  &= i8;
+    uv = u8v & uv;
+    uv ^= i8;
+    u8v = u8v ^ i8;
+}
+
+void builtinFuncs()
+{
+    i8vec2  i8v;
+    i8vec4  i8v4;
+    u8vec3  u8v;
+    u8vec2  u8v2;
+    u8vec4  u8v4;
+    bvec3   bv;
+    int16_t i16;
+    int32_t i32;
+    uint16_t u16;
+    uint32_t u32;
+
+    int8_t  i8;
+    uint8_t u8;
+
+    // abs()
+    i8v = abs(i8v);
+
+    // sign()
+    i8  = sign(i8);
+
+    // min()
+    i8v = min(i8v, i8);
+    i8v = min(i8v, i8vec2(-1));
+    u8v = min(u8v, u8);
+    u8v = min(u8v, u8vec3(0));
+
+    // max()
+    i8v = max(i8v, i8);
+    i8v = max(i8v, i8vec2(-1));
+    u8v = max(u8v, u8);
+    u8v = max(u8v, u8vec3(0));
+
+    // clamp()
+    i8v = clamp(i8v, -i8, i8);
+    i8v = clamp(i8v, -i8v, i8v);
+    u8v = clamp(u8v, -u8, u8);
+    u8v = clamp(u8v, -u8v, u8v);
+
+    // mix()
+    i8  = mix(i8v.x, i8v.y, true);
+    i8v = mix(i8vec2(i8), i8vec2(-i8), bvec2(false));
+    u8  = mix(u8v.x, u8v.y, true);
+    u8v = mix(u8vec3(u8), u8vec3(-u8), bvec3(false));
+
+    //pack
+    i16 = pack16(i8v);
+    i32 = pack32(i8v4);
+    u16 = pack16(u8v2);
+    u32 = pack32(u8v4);
+
+    i8v  = unpack8(i16);
+    i8v4 = unpack8(i32);
+    u8v2 = unpack8(u16);
+    u8v4 = unpack8(u32);
+
+    // lessThan()
+    bv    = lessThan(u8v, u8vec3(u8));
+    bv.xy = lessThan(i8v, i8vec2(i8));
+
+    // lessThanEqual()
+    bv    = lessThanEqual(u8v, u8vec3(u8));
+    bv.xy = lessThanEqual(i8v, i8vec2(i8));
+
+    // greaterThan()
+    bv    = greaterThan(u8v, u8vec3(u8));
+    bv.xy = greaterThan(i8v, i8vec2(i8));
+
+    // greaterThanEqual()
+    bv    = greaterThanEqual(u8v, u8vec3(u8));
+    bv.xy = greaterThanEqual(i8v, i8vec2(i8));
+
+    // equal()
+    bv    = equal(u8v, u8vec3(u8));
+    bv.xy = equal(i8v, i8vec2(i8));
+
+    // notEqual()
+    bv    = notEqual(u8v, u8vec3(u8));
+    bv.xy = notEqual(i8v, i8vec2(i8));
+}
+
+// Type conversion for specialization constant
+layout(constant_id = 100) const int8_t  si8 = int8_t(-10);
+layout(constant_id = 101) const uint8_t su8 = uint8_t(20);
diff --git a/Test/spv.looseUniformNoLoc.vert b/Test/spv.looseUniformNoLoc.vert
new file mode 100644
index 0000000..e887359
--- /dev/null
+++ b/Test/spv.looseUniformNoLoc.vert
@@ -0,0 +1,15 @@
+#version 450 core

+

+layout(location = 0)

+in  vec4 foo;

+

+layout(location = 0)

+out vec4 bar;

+

+uniform vec4 uv;

+

+void main()

+{

+    bar = foo;

+    gl_Position = foo;

+}
\ No newline at end of file
diff --git a/Test/spv.memoryScopeSemantics.comp b/Test/spv.memoryScopeSemantics.comp
new file mode 100644
index 0000000..c03c123
--- /dev/null
+++ b/Test/spv.memoryScopeSemantics.comp
@@ -0,0 +1,61 @@
+#version 450

+#extension GL_KHR_memory_scope_semantics : require

+#extension GL_ARB_gpu_shader_int64 : require

+

+#pragma use_vulkan_memory_model

+

+shared uint value;

+shared int atomi;

+shared uint atomu;

+layout(binding = 0, r32ui) workgroupcoherent uniform uimage2D imageu;

+layout(binding = 1, r32i) volatile coherent uniform iimage2D imagei;

+layout(binding = 5, r32i) nonprivate uniform iimage2D imagej[2];

+layout (binding = 2) buffer BufferU { workgroupcoherent uint x; } bufferu;

+layout (binding = 3) coherent buffer BufferI { uint x; } bufferi;

+struct A { uint x[2]; };

+layout (binding = 4) volatile buffer BufferJ { subgroupcoherent A a; } bufferj[2];

+layout (binding = 6) nonprivate uniform sampler2D samp[2];

+layout (binding = 7) nonprivate uniform BufferK { uint x; } bufferk;

+shared uint64_t atomu64;

+shared int64_t atomi64;

+

+

+void main()

+{

+    int origi = atomicAdd(atomi, 3, gl_ScopeDevice, gl_StorageSemanticsBuffer | gl_StorageSemanticsShared, gl_SemanticsRelease);

+    uint origu = atomicAnd(atomu, value);

+    origi = atomicLoad(atomi, gl_ScopeDevice, gl_StorageSemanticsBuffer, gl_SemanticsAcquire);

+    atomicStore(atomu, value, gl_ScopeDevice, gl_StorageSemanticsBuffer, gl_SemanticsRelease);

+    origi = imageAtomicLoad(imagei, ivec2(0,0), gl_ScopeDevice, gl_StorageSemanticsBuffer, gl_SemanticsAcquire);

+    origu = imageAtomicAdd(imageu, ivec2(0,0), 3u, gl_ScopeDevice, gl_StorageSemanticsBuffer, gl_SemanticsAcquire);

+    imageAtomicStore(imageu, ivec2(0,0), 4u, gl_ScopeDevice, gl_StorageSemanticsBuffer, gl_SemanticsRelease);

+    origu = atomicOr(atomu, 7u, gl_ScopeDevice, 0, 0);

+    origu = atomicXor(atomu, 7u, gl_ScopeDevice, 0, 0);

+    origu = atomicMin(atomu, value, gl_ScopeDevice, 0, 0);

+    origi = atomicMax(atomi, 7, gl_ScopeDevice, 0, 0);

+    origi = atomicExchange(atomi, origi, gl_ScopeDevice, 0, 0);

+    origu = atomicCompSwap(atomu, 10u, value, gl_ScopeDevice, gl_StorageSemanticsBuffer | gl_StorageSemanticsShared, gl_SemanticsAcquire, gl_StorageSemanticsBuffer | gl_StorageSemanticsShared, gl_SemanticsAcquire);

+    atomicAdd(bufferu.x, 1, gl_ScopeDevice, gl_StorageSemanticsBuffer | gl_StorageSemanticsShared, gl_SemanticsRelease);

+    memoryBarrier(gl_ScopeWorkgroup, gl_StorageSemanticsBuffer | gl_StorageSemanticsShared, gl_SemanticsRelease);

+    controlBarrier(gl_ScopeWorkgroup, gl_ScopeWorkgroup, gl_StorageSemanticsBuffer | gl_StorageSemanticsShared, gl_SemanticsAcquire);

+    controlBarrier(gl_ScopeWorkgroup, gl_ScopeWorkgroup, 0, 0);

+

+    uint y;

+    y = bufferu.x;

+    bufferu.x = y;

+    y = bufferi.x;

+    y = bufferj[0].a.x[1];

+    bufferi.x = y;

+    bufferj[0].a.x[1] = y;

+    bufferj[0].a = bufferj[1].a;

+    bufferi.x = bufferk.x;

+

+    imageLoad(imagei, ivec2(0,0));

+    imageLoad(imagej[0], ivec2(0,0));

+    imageStore(imagej[1], ivec2(0,0), ivec4(0,0,0,0));

+    texture(samp[0], vec2(0,0));

+

+    atomu64 = atomicMax(atomu64, uint64_t(7), gl_ScopeDevice, 0, 0);

+    atomicCompSwap(atomi64, int64_t(10), int64_t(atomu64), gl_ScopeDevice, gl_StorageSemanticsBuffer | gl_StorageSemanticsShared, gl_SemanticsAcquire, gl_StorageSemanticsBuffer | gl_StorageSemanticsShared, gl_SemanticsAcquire);

+}

+

diff --git a/Test/spv.memoryScopeSemantics_Error.comp b/Test/spv.memoryScopeSemantics_Error.comp
new file mode 100644
index 0000000..4e18b2e
--- /dev/null
+++ b/Test/spv.memoryScopeSemantics_Error.comp
@@ -0,0 +1,28 @@
+#version 450

+#extension GL_KHR_memory_scope_semantics : require

+

+

+shared uint value;

+shared int atomi;

+shared uint atomu;

+layout(binding = 0, r32ui) workgroupcoherent uniform uimage2D imageu;

+layout(binding = 1, r32i) coherent uniform iimage2D imagei;

+layout (binding = 2) buffer BufferU { workgroupcoherent uint x; } bufferu;

+layout (binding = 3) subgroupcoherent buffer BufferI { uint x; } bufferi;

+

+void main()

+{

+    atomicStore(atomu, value, gl_ScopeDevice, gl_StorageSemanticsBuffer, gl_SemanticsAcquire);

+    int origi = imageAtomicLoad(imagei, ivec2(0,0), gl_ScopeDevice, gl_StorageSemanticsBuffer, gl_SemanticsRelease);

+    atomicStore(atomu, value, gl_ScopeDevice, gl_StorageSemanticsBuffer, gl_SemanticsAcquireRelease);

+    atomicStore(atomu, value, gl_ScopeDevice, gl_StorageSemanticsBuffer, gl_StorageSemanticsBuffer);

+    origi = imageAtomicLoad(imagei, ivec2(0,0), gl_ScopeDevice, gl_SemanticsAcquire, gl_SemanticsAcquire);

+    memoryBarrier(gl_ScopeWorkgroup, gl_StorageSemanticsBuffer | gl_StorageSemanticsShared, 0);

+    memoryBarrier(gl_ScopeWorkgroup, 0, gl_SemanticsRelease);

+    memoryBarrier(gl_ScopeWorkgroup, gl_StorageSemanticsBuffer | gl_StorageSemanticsShared, gl_SemanticsRelease | gl_SemanticsAcquire);

+    atomicAdd(atomu, value, gl_ScopeDevice, gl_StorageSemanticsBuffer, gl_SemanticsRelease | gl_SemanticsAcquire);

+    uint origu = atomicCompSwap(atomu, 10u, value, gl_ScopeDevice, gl_StorageSemanticsBuffer | gl_StorageSemanticsShared, gl_SemanticsAcquire, gl_StorageSemanticsBuffer | gl_StorageSemanticsShared, gl_SemanticsAcquireRelease);

+    memoryBarrier(gl_ScopeWorkgroup, gl_StorageSemanticsBuffer, gl_SemanticsRelease | gl_SemanticsMakeVisible);

+    memoryBarrier(gl_ScopeWorkgroup, gl_StorageSemanticsBuffer, gl_SemanticsAcquire | gl_SemanticsMakeAvailable);

+}

+

diff --git a/Test/spv.meshShaderBuiltins.mesh b/Test/spv.meshShaderBuiltins.mesh
new file mode 100644
index 0000000..8adff3d
--- /dev/null
+++ b/Test/spv.meshShaderBuiltins.mesh
@@ -0,0 +1,63 @@
+#version 460
+
+#define MAX_VER  81
+#define MAX_PRIM 32
+
+#define BARRIER() \
+    memoryBarrierShared(); \
+    barrier();
+
+#extension GL_NV_mesh_shader : enable
+
+layout(local_size_x = 32) in;
+
+layout(max_vertices=MAX_VER) out;
+layout(max_primitives=MAX_PRIM) out;
+layout(triangles) out;
+
+// test use of builtins in mesh shaders:
+
+void main()
+{
+    uint iid = gl_LocalInvocationID.x;
+    uint gid = gl_WorkGroupID.x;
+
+    gl_MeshVerticesNV[iid].gl_Position = vec4(1.0);
+    gl_MeshVerticesNV[iid].gl_PointSize = 2.0;
+    gl_MeshVerticesNV[iid].gl_ClipDistance[3] = 3.0;
+    gl_MeshVerticesNV[iid].gl_CullDistance[2] = 4.0;
+
+    BARRIER();
+
+    gl_MeshVerticesNV[iid+1].gl_Position = gl_MeshVerticesNV[iid].gl_Position;
+    gl_MeshVerticesNV[iid+1].gl_PointSize = gl_MeshVerticesNV[iid].gl_PointSize;
+    gl_MeshVerticesNV[iid+1].gl_ClipDistance[3] = gl_MeshVerticesNV[iid].gl_ClipDistance[3];
+    gl_MeshVerticesNV[iid+1].gl_CullDistance[2] = gl_MeshVerticesNV[iid].gl_CullDistance[2];
+
+    BARRIER();
+
+    gl_MeshPrimitivesNV[iid].gl_PrimitiveID = 6;
+    gl_MeshPrimitivesNV[iid].gl_Layer = 7;
+    gl_MeshPrimitivesNV[iid].gl_ViewportIndex = 8;
+    gl_MeshPrimitivesNV[iid].gl_ViewportMask[0] = 9;
+
+    BARRIER();
+
+    gl_MeshPrimitivesNV[iid+1].gl_PrimitiveID = gl_MeshPrimitivesNV[iid].gl_PrimitiveID;
+    gl_MeshPrimitivesNV[iid+1].gl_Layer = gl_MeshPrimitivesNV[iid].gl_Layer;
+    gl_MeshPrimitivesNV[iid+1].gl_ViewportIndex = gl_MeshPrimitivesNV[iid].gl_ViewportIndex;
+    gl_MeshPrimitivesNV[iid+1].gl_ViewportMask[0] = gl_MeshPrimitivesNV[iid].gl_ViewportMask[0];
+
+    BARRIER();
+
+    // should truncate 257 -> 1
+    gl_PrimitiveIndicesNV[0] = 257;
+    gl_PrimitiveIndicesNV[gid] = gl_PrimitiveIndicesNV[gid-1];
+
+    // writes 4 indices at offset gl_DrawID
+    writePackedPrimitiveIndices4x8NV(gl_DrawID, 0x01020304);
+
+    gl_PrimitiveCountNV = MAX_PRIM * 3;
+
+    BARRIER();
+}
diff --git a/Test/spv.meshShaderPerViewBuiltins.mesh b/Test/spv.meshShaderPerViewBuiltins.mesh
new file mode 100644
index 0000000..54fb744
--- /dev/null
+++ b/Test/spv.meshShaderPerViewBuiltins.mesh
@@ -0,0 +1,42 @@
+#version 450
+
+#define MAX_VER  81
+#define MAX_PRIM 32
+#define MAX_VIEWS gl_MaxMeshViewCountNV
+
+#define BARRIER() \
+    memoryBarrierShared(); \
+    barrier();
+
+#extension GL_NV_mesh_shader : enable
+
+layout(local_size_x = 32) in;
+
+layout(max_vertices=MAX_VER) out;
+layout(max_primitives=MAX_PRIM) out;
+layout(triangles) out;
+
+// test use of per-view builtin attributes
+
+void main()
+{
+    uint iid = gl_LocalInvocationID.x;
+    uint viewID = gl_MeshViewIndicesNV[gl_MeshViewCountNV%MAX_VIEWS];
+
+    gl_MeshVerticesNV[iid].gl_PositionPerViewNV[viewID]          = vec4(1.0, 2.0, 3.0, 4.0);
+    gl_MeshVerticesNV[iid].gl_ClipDistancePerViewNV[viewID][2]   = 5.0;
+    gl_MeshVerticesNV[iid].gl_CullDistancePerViewNV[viewID][3]   = 6.0;
+    gl_MeshPrimitivesNV[iid].gl_LayerPerViewNV[viewID]           = 7;
+    gl_MeshPrimitivesNV[iid].gl_ViewportMaskPerViewNV[viewID][0] = 8;
+
+    BARRIER();
+
+    gl_MeshVerticesNV[iid+1].gl_PositionPerViewNV[viewID]          = gl_MeshVerticesNV[iid].gl_PositionPerViewNV[viewID];
+    gl_MeshVerticesNV[iid+1].gl_ClipDistancePerViewNV[viewID][2]   = gl_MeshVerticesNV[iid].gl_ClipDistancePerViewNV[viewID][2];
+    gl_MeshVerticesNV[iid+1].gl_CullDistancePerViewNV[viewID][3]   = gl_MeshVerticesNV[iid].gl_CullDistancePerViewNV[viewID][3];
+    gl_MeshPrimitivesNV[iid+1].gl_LayerPerViewNV[viewID]           = gl_MeshPrimitivesNV[iid].gl_LayerPerViewNV[viewID];
+    gl_MeshPrimitivesNV[iid+1].gl_ViewportMaskPerViewNV[viewID][0] = gl_MeshPrimitivesNV[iid].gl_ViewportMaskPerViewNV[viewID][0];
+
+    BARRIER();
+}
+
diff --git a/Test/spv.meshShaderPerViewUserDefined.mesh b/Test/spv.meshShaderPerViewUserDefined.mesh
new file mode 100644
index 0000000..4a316eb
--- /dev/null
+++ b/Test/spv.meshShaderPerViewUserDefined.mesh
@@ -0,0 +1,56 @@
+#version 450
+
+#define MAX_VER  81
+#define MAX_PRIM 32
+#define MAX_VIEWS gl_MaxMeshViewCountNV
+
+#define BARRIER() \
+    memoryBarrierShared(); \
+    barrier();
+
+#extension GL_NV_mesh_shader : enable
+
+layout(local_size_x = 32) in;
+
+layout(max_vertices=MAX_VER) out;
+layout(max_primitives=MAX_PRIM) out;
+layout(triangles) out;
+
+// test use of user-defined per-view attributes
+
+// mix of single-view and per-view attributes
+layout(location=0) out block {
+    perprimitiveNV perviewNV vec4 color1[][3];  // Implicitly sized
+    perprimitiveNV vec4 color2[3];
+    perviewNV vec4 color3[MAX_VIEWS][3];          // Explicitly sized
+    vec4 color4;
+} b[];
+
+// per-view block
+perviewNV layout(location=10) out perviewBlock {
+    perprimitiveNV vec4 color5[];              // Implicitly sized
+    perprimitiveNV vec4 color6[MAX_VIEWS][3];  // Explicitly sized
+    vec4 color7[][3];                            // Implicitly sized
+    vec4 color8[MAX_VIEWS];                      // Explicitly sized
+} b2[];
+
+void main()
+{
+    uint iid = gl_LocalInvocationID.x;
+    uint viewID = gl_MeshViewIndicesNV[gl_MeshViewCountNV%MAX_VIEWS];
+
+    b[iid].color1[viewID][2] = vec4(1.0);
+    b[iid].color2[1]         = vec4(2.0);
+    b[iid].color3[viewID][2] = vec4(3.0);
+    b[iid].color4            = vec4(4.0);
+
+    BARRIER();
+
+    b2[iid].color5[viewID]    = vec4(5.0);
+    b2[iid].color6[viewID][1] = vec4(6.0);
+    b2[iid].color7[viewID][2] = vec4(7.0);
+    b2[iid].color8[viewID]    = vec4(8.0);
+
+    BARRIER();
+}
+
diff --git a/Test/spv.meshShaderRedeclBuiltins.mesh b/Test/spv.meshShaderRedeclBuiltins.mesh
new file mode 100644
index 0000000..38107b2
--- /dev/null
+++ b/Test/spv.meshShaderRedeclBuiltins.mesh
@@ -0,0 +1,66 @@
+#version 460
+
+#define MAX_VER  81
+#define MAX_PRIM 32
+
+#define BARRIER() \
+    memoryBarrierShared(); \
+    barrier();
+
+#extension GL_NV_mesh_shader : enable
+
+layout(local_size_x = 32) in;
+
+layout(max_vertices=MAX_VER) out;
+layout(max_primitives=MAX_PRIM) out;
+layout(triangles) out;
+
+// test use of redeclared single-view builtins in mesh shaders:
+
+out gl_MeshPerVertexNV {
+    vec4 gl_Position;
+    float gl_PointSize;
+    float gl_ClipDistance[4];
+    float gl_CullDistance[4];
+} gl_MeshVerticesNV[];
+
+perprimitiveNV out gl_MeshPerPrimitiveNV {
+    int gl_PrimitiveID;
+    int gl_Layer;
+    int gl_ViewportIndex;
+    int gl_ViewportMask[];
+} gl_MeshPrimitivesNV[];
+
+void main()
+{
+    uint iid = gl_LocalInvocationID.x;
+    uint gid = gl_WorkGroupID.x;
+
+    gl_MeshVerticesNV[iid].gl_Position = vec4(1.0);
+    gl_MeshVerticesNV[iid].gl_PointSize = 2.0;
+    gl_MeshVerticesNV[iid].gl_ClipDistance[3] = 3.0;
+    gl_MeshVerticesNV[iid].gl_CullDistance[2] = 4.0;
+
+    BARRIER();
+
+    gl_MeshVerticesNV[iid+1].gl_Position = gl_MeshVerticesNV[iid].gl_Position;
+    gl_MeshVerticesNV[iid+1].gl_PointSize = gl_MeshVerticesNV[iid].gl_PointSize;
+    gl_MeshVerticesNV[iid+1].gl_ClipDistance[3] = gl_MeshVerticesNV[iid].gl_ClipDistance[3];
+    gl_MeshVerticesNV[iid+1].gl_CullDistance[2] = gl_MeshVerticesNV[iid].gl_CullDistance[2];
+
+    BARRIER();
+
+    gl_MeshPrimitivesNV[iid].gl_PrimitiveID = 6;
+    gl_MeshPrimitivesNV[iid].gl_Layer = 7;
+    gl_MeshPrimitivesNV[iid].gl_ViewportIndex = 8;
+    gl_MeshPrimitivesNV[iid].gl_ViewportMask[0] = 9;
+
+    BARRIER();
+
+    gl_MeshPrimitivesNV[iid+1].gl_PrimitiveID = gl_MeshPrimitivesNV[iid].gl_PrimitiveID;
+    gl_MeshPrimitivesNV[iid+1].gl_Layer = gl_MeshPrimitivesNV[iid].gl_Layer;
+    gl_MeshPrimitivesNV[iid+1].gl_ViewportIndex = gl_MeshPrimitivesNV[iid].gl_ViewportIndex;
+    gl_MeshPrimitivesNV[iid+1].gl_ViewportMask[0] = gl_MeshPrimitivesNV[iid].gl_ViewportMask[0];
+
+    BARRIER();
+}
diff --git a/Test/spv.meshShaderRedeclPerViewBuiltins.mesh b/Test/spv.meshShaderRedeclPerViewBuiltins.mesh
new file mode 100644
index 0000000..3b75b55
--- /dev/null
+++ b/Test/spv.meshShaderRedeclPerViewBuiltins.mesh
@@ -0,0 +1,53 @@
+#version 450

+

+#define MAX_VER  81

+#define MAX_PRIM 32

+#define MAX_VIEWS gl_MaxMeshViewCountNV

+

+#define BARRIER() \

+    memoryBarrierShared(); \

+    barrier();

+

+#extension GL_NV_mesh_shader : enable

+

+layout(local_size_x = 32) in;

+

+layout(max_vertices=MAX_VER) out;

+layout(max_primitives=MAX_PRIM) out;

+layout(triangles) out;

+

+// test use of redeclared per-view builtin attributes

+

+out gl_MeshPerVertexNV {

+    perviewNV vec4 gl_PositionPerViewNV[MAX_VIEWS];         // explicitly sized view dim

+    perviewNV float gl_ClipDistancePerViewNV[MAX_VIEWS][4]; // explicitly sized view dim

+    perviewNV float gl_CullDistancePerViewNV[MAX_VIEWS][4]; // explicitly sized view dim

+} gl_MeshVerticesNV[];

+

+perprimitiveNV out gl_MeshPerPrimitiveNV {

+    perviewNV int gl_LayerPerViewNV[];                      // implicitly sized view dim

+    perviewNV int gl_ViewportMaskPerViewNV[][1];            // implicitly sized view dim

+} gl_MeshPrimitivesNV[];

+

+void main()

+{

+    uint iid = gl_LocalInvocationID.x;

+    uint viewID = gl_MeshViewIndicesNV[gl_MeshViewCountNV%MAX_VIEWS];

+

+    gl_MeshVerticesNV[iid].gl_PositionPerViewNV[viewID]          = vec4(1.0, 2.0, 3.0, 4.0);

+    gl_MeshVerticesNV[iid].gl_ClipDistancePerViewNV[viewID][2]   = 5.0;

+    gl_MeshVerticesNV[iid].gl_CullDistancePerViewNV[viewID][3]   = 6.0;

+    gl_MeshPrimitivesNV[iid].gl_LayerPerViewNV[viewID]           = 7;

+    gl_MeshPrimitivesNV[iid].gl_ViewportMaskPerViewNV[viewID][0] = 8;

+

+    BARRIER();

+

+    gl_MeshVerticesNV[iid+1].gl_PositionPerViewNV[viewID]          = gl_MeshVerticesNV[iid].gl_PositionPerViewNV[viewID];

+    gl_MeshVerticesNV[iid+1].gl_ClipDistancePerViewNV[viewID][2]   = gl_MeshVerticesNV[iid].gl_ClipDistancePerViewNV[viewID][2];

+    gl_MeshVerticesNV[iid+1].gl_CullDistancePerViewNV[viewID][3]   = gl_MeshVerticesNV[iid].gl_CullDistancePerViewNV[viewID][3];

+    gl_MeshPrimitivesNV[iid+1].gl_LayerPerViewNV[viewID]           = gl_MeshPrimitivesNV[iid].gl_LayerPerViewNV[viewID];

+    gl_MeshPrimitivesNV[iid+1].gl_ViewportMaskPerViewNV[viewID][0] = gl_MeshPrimitivesNV[iid].gl_ViewportMaskPerViewNV[viewID][0];

+

+    BARRIER();

+}

+

diff --git a/Test/spv.meshShaderSharedMem.mesh b/Test/spv.meshShaderSharedMem.mesh
new file mode 100644
index 0000000..b9d2f6d
--- /dev/null
+++ b/Test/spv.meshShaderSharedMem.mesh
@@ -0,0 +1,39 @@
+#version 450
+
+#define MAX_VER  81
+#define MAX_PRIM 32
+
+#define BARRIER() \
+    memoryBarrierShared(); \
+    barrier();
+
+#extension GL_NV_mesh_shader : enable
+
+layout(local_size_x = 32) in;
+
+layout(max_vertices=MAX_VER) out;
+layout(max_primitives=MAX_PRIM) out;
+layout(triangles) out;
+
+// test use of shared memory in mesh shaders:
+
+writeonly uniform image2D uni_image;
+uniform block0 {
+    uint    uni_value;
+};
+
+shared vec4 mem[10];
+
+void main()
+{
+    uint iid = gl_LocalInvocationID.x;
+    uint gid = gl_WorkGroupID.x;
+
+    for (uint i = 0; i < 10; ++i) {
+        mem[i] = vec4(i+uni_value);
+    }
+    imageStore(uni_image, ivec2(iid), mem[gid]);
+    imageStore(uni_image, ivec2(iid), mem[gid+1]);
+
+    BARRIER();
+}
diff --git a/Test/spv.meshShaderTaskMem.mesh b/Test/spv.meshShaderTaskMem.mesh
new file mode 100644
index 0000000..5ce5bed
--- /dev/null
+++ b/Test/spv.meshShaderTaskMem.mesh
@@ -0,0 +1,41 @@
+#version 450
+
+#define MAX_VER  81
+#define MAX_PRIM 32
+
+#define BARRIER() \
+    memoryBarrierShared(); \
+    barrier();
+
+#extension GL_NV_mesh_shader : enable
+
+layout(local_size_x = 32) in;
+
+layout(max_vertices=MAX_VER) out;
+layout(max_primitives=MAX_PRIM) out;
+layout(triangles) out;
+
+// test use of task memory in mesh shaders:
+
+taskNV in taskBlock {
+    float gid1[2];
+    vec4 gid2;
+} mytask;
+
+buffer bufferBlock {
+    float gid3[2];
+    vec4 gid4;
+} mybuf;
+
+layout(location=0) out outBlock {
+    float gid5;
+    vec4 gid6;
+} myblk[];
+
+void main()
+{
+    uint iid = gl_LocalInvocationID.x;
+
+    myblk[iid].gid5 = mytask.gid1[1] + mybuf.gid3[1];
+    myblk[iid].gid6 = mytask.gid2    + mybuf.gid4;
+}
diff --git a/Test/spv.meshShaderUserDefined.mesh b/Test/spv.meshShaderUserDefined.mesh
new file mode 100644
index 0000000..8b0937d
--- /dev/null
+++ b/Test/spv.meshShaderUserDefined.mesh
@@ -0,0 +1,59 @@
+#version 450
+
+#define MAX_VER  81
+#define MAX_PRIM 32
+
+#define BARRIER() \
+    memoryBarrierShared(); \
+    barrier();
+
+#extension GL_NV_mesh_shader : enable
+
+layout(local_size_x = 32) in;
+
+layout(max_vertices=MAX_VER) out;
+layout(max_primitives=MAX_PRIM) out;
+layout(triangles) out;
+
+// test use of user defined interface out blocks:
+
+// per-primitive block
+perprimitiveNV layout(location=0) out myblock {
+    float f;
+    float fArr[4];
+    vec3 pos;
+    vec4 posArr[4];
+    mat4 m;
+    mat3 mArr[2];
+} blk[];
+
+// per-vertex block
+layout(location=20) out myblock2 {
+    float f;
+    vec4 pos;
+    mat4 m;
+} blk2[];
+
+void main()
+{
+    uint iid = gl_LocalInvocationID.x;
+    uint gid = gl_WorkGroupID.x;
+
+    blk[iid].f               = 11.0;
+    blk[iid+1].fArr[gid]     = blk[iid].f;
+    blk[iid/2].pos.yzx       = vec3(14.0, 15.0, 13.0);
+    blk[iid*2].posArr[1].yzw = blk[iid/2].pos;
+    blk[iid/4].m[2].wzyx     = vec4(13.0, 14.0, 15.0, 16.0);
+    blk[iid].mArr[0][1][1]   = blk[iid/4].m[2].w;
+    blk[iid*4].mArr[1][gid]  = vec3(17.0, 18.0, 19.0);
+
+    BARRIER();
+
+    blk2[iid].f           = blk2[iid-1].f + 20.0;
+    blk2[iid].pos         = vec4(21.0, 22.0, 23.0, 24.0);
+    blk2[iid+1].m[gid]    = blk2[iid].pos;
+    blk2[iid+1].m[gid][2] = 29.0;
+    blk2[iid+2].m[3]      = blk2[iid+1].m[gid];
+
+    BARRIER();
+}
diff --git a/Test/spv.meshTaskShader.task b/Test/spv.meshTaskShader.task
new file mode 100644
index 0000000..c12b3bd
--- /dev/null
+++ b/Test/spv.meshTaskShader.task
@@ -0,0 +1,49 @@
+#version 450
+
+#define BARRIER() \
+    memoryBarrierShared(); \
+    barrier();
+
+#extension GL_NV_mesh_shader : enable
+
+layout(local_size_x = 32) in;
+
+// test use of shared memory in task shaders:
+layout(binding=0) writeonly uniform image2D uni_image;
+uniform block0 {
+    uint uni_value;
+};
+shared vec4 mem[10];
+
+// test use of task memory in task shaders:
+taskNV out Task {
+    vec2 dummy;
+    vec2 submesh[3];
+} mytask;
+
+void main()
+{
+    uint iid = gl_LocalInvocationID.x;
+    uint gid = gl_WorkGroupID.x;
+
+    // 1. shared memory load and stores
+    for (uint i = 0; i < 10; ++i) {
+        mem[i] = vec4(i + uni_value);
+    }
+    imageStore(uni_image, ivec2(iid), mem[gid]);
+    imageStore(uni_image, ivec2(iid), mem[gid+1]);
+
+    BARRIER();
+
+    // 2. task memory stores
+
+    mytask.dummy      = vec2(30.0, 31.0);
+    mytask.submesh[0] = vec2(32.0, 33.0);
+    mytask.submesh[1] = vec2(34.0, 35.0);
+    mytask.submesh[2] = mytask.submesh[gid%2];
+
+    BARRIER();
+
+    // 3. set task count
+    gl_TaskCountNV = 3;
+}
diff --git a/Test/spv.multiStructFuncall.frag b/Test/spv.multiStructFuncall.frag
old mode 100755
new mode 100644
diff --git a/Test/spv.noBuiltInLoc.vert b/Test/spv.noBuiltInLoc.vert
new file mode 100644
index 0000000..4087ab3
--- /dev/null
+++ b/Test/spv.noBuiltInLoc.vert
@@ -0,0 +1,19 @@
+#version 450 core

+

+layout(location = 0)

+in  vec4 foo;

+

+layout(location = 0)

+out vec4 bar;

+

+uniform vec4 uv1;

+uniform float uv2;

+uniform vec3 uv3;

+

+layout(binding = 0) uniform atomic_uint a_uint;

+

+void main()

+{

+    bar = foo;

+    gl_Position = foo;

+}
\ No newline at end of file
diff --git a/Test/spv.noLocation.vert b/Test/spv.noLocation.vert
new file mode 100644
index 0000000..4399852
--- /dev/null
+++ b/Test/spv.noLocation.vert
@@ -0,0 +1,39 @@
+#version 450

+

+layout(location = 1) in vec4 in1;

+in vec4 in2;                        // ERROR

+layout(location = 3) in vec4 in3;

+

+layout(location = 1) out vec4 out1;

+out vec4 out2;                      // ERROR

+layout(location = 3) out vec4 out3;

+

+layout(location = 10) out inb1 { 

+    vec4 a;

+    vec4 b;

+} inbi1;

+out inb2 { 

+    layout(location = 12) vec4 a;

+    layout(location = 13) vec4 b;

+} inbi2;

+out inb3 {                          // ERROR

+    vec4 a;

+    vec4 b;

+} inbi3;

+

+layout(location = 14) out struct S1 { vec4 a; } s1;

+out struct S2 { vec4 a; } s2;       // ERROR

+

+struct SS { int a; };

+out layout(location = 15) SS ss1;

+out SS ss2;                         // ERROR

+

+out gl_PerVertex {

+    vec4 gl_Position;

+    float gl_ClipDistance[2];

+};

+

+void main()

+{

+    gl_ClipDistance[0] = 1.0;

+}

diff --git a/Test/spv.nonuniform.frag b/Test/spv.nonuniform.frag
new file mode 100644
index 0000000..d3b05a5
--- /dev/null
+++ b/Test/spv.nonuniform.frag
@@ -0,0 +1,55 @@
+#version 450

+

+#extension GL_EXT_nonuniform_qualifier : enable

+

+layout(location=0) nonuniformEXT in vec4 nu_inv4;

+nonuniformEXT float nu_gf;

+layout(location=1) in nonuniformEXT flat int nu_ii;

+

+layout(binding=0, input_attachment_index = 0) uniform subpassInput        inputAttachmentDyn[];

+layout(binding=1)                             uniform samplerBuffer       uniformTexelBufferDyn[];

+layout(binding=2, r32f)                       uniform imageBuffer         storageTexelBufferDyn[];

+layout(binding=3)                             uniform uname { float a; }  uniformBuffer[];

+layout(binding=4)                             buffer  bname { float b; }  storageBuffer[];

+layout(binding=5)                             uniform sampler2D           sampledImage[];

+layout(binding=6, r32f)                       uniform image2D             storageImage[];

+layout(binding=7, input_attachment_index = 1) uniform subpassInput        inputAttachment[];

+layout(binding=8)                             uniform samplerBuffer       uniformTexelBuffer[];

+layout(binding=9, r32f)                       uniform imageBuffer         storageTexelBuffer[];

+

+nonuniformEXT int foo(nonuniformEXT int nupi, nonuniformEXT out int f)

+{

+    return nupi;

+}

+

+void main()

+{

+    nonuniformEXT int nu_li;

+    int dyn_i;

+

+    int a = foo(nu_li, nu_li);

+    nu_li = nonuniformEXT(a) + nonuniformEXT(a * 2);

+

+    float b;

+    b = nu_inv4.x * nu_gf;

+    b += subpassLoad(inputAttachmentDyn[dyn_i]).x;

+    b += texelFetch(uniformTexelBufferDyn[dyn_i], 1).x;

+    b += imageLoad(storageTexelBufferDyn[dyn_i], 1).x;

+    b += uniformBuffer[nu_ii].a;

+    b += storageBuffer[nu_ii].b;

+    b += texture(sampledImage[nu_ii], vec2(0.5)).x;

+    b += imageLoad(storageImage[nu_ii], ivec2(1)).x;

+    b += subpassLoad(inputAttachment[nu_ii]).x;

+    b += texelFetch(uniformTexelBuffer[nu_ii], 1).x;

+    b += imageLoad(storageTexelBuffer[nu_ii], 1).x;

+

+    nonuniformEXT ivec4 v;

+    nonuniformEXT mat4 m;

+    nonuniformEXT struct S { int a; } s;

+    ivec4 uv;

+    b += uniformBuffer[v.y].a;

+    b += uniformBuffer[v[2]].a;

+    b += uniformBuffer[uv[nu_ii]].a;

+    b += uniformBuffer[int(m[2].z)].a;

+    b += uniformBuffer[s.a].a;

+}

diff --git a/Test/spv.offsets.frag b/Test/spv.offsets.frag
old mode 100755
new mode 100644
diff --git a/Test/spv.paramMemory.frag b/Test/spv.paramMemory.frag
new file mode 100644
index 0000000..79d2fe5
--- /dev/null
+++ b/Test/spv.paramMemory.frag
@@ -0,0 +1,30 @@
+#version 310 es
+
+readonly coherent uniform layout(set = 0, binding = 0, rgba32f) highp image2D image1;
+readonly uniform layout(set = 0, binding = 2, rgba16f) highp image2D image2;
+writeonly coherent uniform layout(set = 0, binding = 1, rgba32f) highp image2D image3;
+writeonly uniform layout(set = 0, binding = 3, rgba16f) highp image2D image4;
+
+flat in layout(location = 0) highp ivec2 in_coords;
+out layout(location = 0) highp vec4 out_color;
+
+highp vec4 image_load(readonly coherent highp image2D image, highp ivec2 coords)
+{
+	return imageLoad(image, in_coords);
+}
+
+void image_store(writeonly coherent highp image2D image, highp ivec2 coords, highp vec4 data)
+{
+	imageStore(image, in_coords, data);
+}
+
+void main()
+{
+	highp vec4 read1 = image_load(image1, in_coords);
+	highp vec4 read2 = image_load(image2, in_coords);
+	
+	image_store(image3, in_coords, read1*0.5);
+	image_store(image4, in_coords, read2*2.0);
+
+	out_color = vec4(0.0);
+}
diff --git a/Test/spv.perprimitiveNV.frag b/Test/spv.perprimitiveNV.frag
new file mode 100644
index 0000000..56e00f5
--- /dev/null
+++ b/Test/spv.perprimitiveNV.frag
@@ -0,0 +1,21 @@
+#version 460

+

+#extension GL_NV_mesh_shader: require

+

+layout(location=0) 

+in B {

+    perprimitiveNV float f;

+};

+

+layout(location=4) 

+in C {

+    flat centroid float h;

+};

+

+layout(location=8) 

+out float g;

+

+void main()

+{

+    g = f + h;

+}

diff --git a/Test/spv.precisionNonESSamp.frag b/Test/spv.precisionNonESSamp.frag
new file mode 100644
index 0000000..8abf839
--- /dev/null
+++ b/Test/spv.precisionNonESSamp.frag
@@ -0,0 +1,24 @@
+#version 450

+

+precision lowp sampler2D;

+precision lowp int;

+precision lowp float;

+

+uniform lowp sampler2D s;

+uniform highp sampler3D t;

+layout(rgba32f) uniform lowp image2D i1;

+layout(rgba32f) uniform highp image2D i2;

+

+layout(location = 0) in lowp vec2 v2;

+layout(location = 1) in lowp vec3 v3;

+layout(location = 3) flat in lowp ivec2 iv2;

+

+layout(location = 0) out lowp vec4 color;

+

+void main()

+{

+    color = texture(s, v2);

+    color = texture(t, v3);

+    lowp vec4 vi1 = imageLoad(i1, iv2);

+    lowp vec4 vi2 = imageLoad(i2, iv2);

+}

diff --git a/Test/spv.rankShift.comp b/Test/spv.rankShift.comp
new file mode 100644
index 0000000..1761ad1
--- /dev/null
+++ b/Test/spv.rankShift.comp
@@ -0,0 +1,15 @@
+#version 450

+#extension GL_ARB_gpu_shader_int64 : require

+

+layout(local_size_x = 54) in;

+

+layout(location=4) uniform int64_t arg0;

+layout(location=5) uniform uint arg1;

+

+void main()

+{

+    uint64_t result = arg0 << arg1;

+    result = arg0 >> arg1;

+    result <<= arg1;

+    result >>= arg1;

+}
\ No newline at end of file
diff --git a/Test/spv.register.subpass.frag b/Test/spv.register.subpass.frag
new file mode 100644
index 0000000..281c2f7
--- /dev/null
+++ b/Test/spv.register.subpass.frag
@@ -0,0 +1,15 @@
+
+// Test binding autoassignment and offset for SubpassInput objects
+
+layout(input_attachment_index = 1) SubpassInput<float4> subpass_f4 : register(t1);
+layout(input_attachment_index = 4) SubpassInputMS<float4> subpass_ms_f4;
+[[vk::input_attachment_index(7)]] SubpassInput subpass_2;
+
+float4 main() : SV_Target0
+{
+    float4 result00 = subpass_f4.SubpassLoad();
+    float4 result10 = subpass_ms_f4.SubpassLoad(3);
+    float4 result73 = subpass_2.SubpassLoad();
+
+    return 0;
+}
diff --git a/Test/spv.sample.frag b/Test/spv.sample.frag
new file mode 100644
index 0000000..b62afe2
--- /dev/null
+++ b/Test/spv.sample.frag
@@ -0,0 +1,9 @@
+#version 450
+
+layout(location = 0) in sample vec4 samp;
+layout(location = 0) out vec4 color;
+
+void main()
+{
+    color = samp;
+}
\ No newline at end of file
diff --git a/Test/spv.sampleId.frag b/Test/spv.sampleId.frag
new file mode 100644
index 0000000..d5473f7
--- /dev/null
+++ b/Test/spv.sampleId.frag
@@ -0,0 +1,12 @@
+#version 450
+
+layout(location = 0) in vec4 samp;
+layout(location = 0) out vec4 color;
+
+void main()
+{
+    if (gl_SampleID < 3)
+        color = samp;
+    else
+        color = 2 * samp;
+}
\ No newline at end of file
diff --git a/Test/spv.samplePosition.frag b/Test/spv.samplePosition.frag
new file mode 100644
index 0000000..b73dd61
--- /dev/null
+++ b/Test/spv.samplePosition.frag
@@ -0,0 +1,12 @@
+#version 450
+
+layout(location = 0) in vec4 samp;
+layout(location = 0) out vec4 color;
+
+void main()
+{
+    if (gl_SamplePosition.y < 0.5)
+        color = samp;
+    else
+        color = 2 * samp;
+}
\ No newline at end of file
diff --git a/Test/spv.samplerlessTextureFunctions.frag b/Test/spv.samplerlessTextureFunctions.frag
new file mode 100644
index 0000000..3043b39
--- /dev/null
+++ b/Test/spv.samplerlessTextureFunctions.frag
@@ -0,0 +1,23 @@
+#version 450 core
+#extension GL_EXT_samplerless_texture_functions : enable
+
+layout(binding = 1) uniform texture2D tex2D;
+layout(binding = 1) uniform texture2DMS texMS;
+layout(binding = 0) uniform textureBuffer buf;
+
+void main()
+{
+    vec4 tex2DFetch = texelFetch(tex2D, ivec2(0, 0), 0);
+    vec4 texMSFetch = texelFetch(texMS, ivec2(0, 0), 0);
+    vec4 bufFetch = texelFetch(buf, 0);
+
+    vec4 tex2DFetchOffset = texelFetchOffset(tex2D, ivec2(0, 0), 0, ivec2(0, 0));
+
+    ivec2 tex2DSize = textureSize(tex2D, 0);
+    ivec2 texMSSize = textureSize(texMS);
+    int bufSize = textureSize(buf);
+
+    int tex2DLevels = textureQueryLevels(tex2D);
+
+    int texMSSamples = textureSamples(texMS);
+}
diff --git a/Test/spv.scalarlayout.frag b/Test/spv.scalarlayout.frag
new file mode 100644
index 0000000..c7ecf50
--- /dev/null
+++ b/Test/spv.scalarlayout.frag
@@ -0,0 +1,32 @@
+#version 450 core

+

+#extension GL_EXT_scalar_block_layout : enable

+

+// Block memory layout

+struct S

+{

+    float      a;   // offset 0

+    vec2       b;   // offset 4

+    double     c;   // offset 16

+    float      d;   // offset 24

+    vec3       e;   // offset 28

+    float      f;   // offset 40

+    // size = 44, align = 8

+};

+

+layout(column_major, scalar) uniform B1

+{

+    float      a;     // offset = 0

+    vec2       b;     // offset = 4

+    vec3       c;     // offset = 12

+    float      d[2];  // offset = 24

+    mat2x3     e;     // offset = 32, takes 24 bytes, matrixstride = 12

+    mat2x3     f[2];  // offset = 56, takes 48 bytes, matrixstride = 12, arraystride = 24

+    float      g;     // offset = 104

+    S          h;     // offset = 112 (aligned to multiple of 8)

+    S          i[2];  // offset = 160 (aligned to multiple of 8) stride = 48

+};

+

+void main()

+{

+}

diff --git a/Test/spv.scalarlayoutfloat16.frag b/Test/spv.scalarlayoutfloat16.frag
new file mode 100644
index 0000000..ff87097
--- /dev/null
+++ b/Test/spv.scalarlayoutfloat16.frag
@@ -0,0 +1,31 @@
+#version 450 core

+

+#extension GL_EXT_shader_16bit_storage: enable

+#extension GL_EXT_scalar_block_layout : enable

+

+// Block memory layout

+struct S

+{

+    float16_t      a;   // offset 0

+    f16vec2        b;   // offset 2

+    double         c;   // offset 8

+    float16_t      d;   // offset 16

+    f16vec3        e;   // offset 18

+    float16_t      f;   // offset 24

+    // size = 26, align = 8

+};

+

+layout(column_major, scalar) uniform B1

+{

+    float16_t      a;     // offset = 0

+    f16vec2        b;     // offset = 2

+    f16vec3        c;     // offset = 6

+    float16_t      d[2];  // offset = 12 stride = 2

+    float16_t      g;     // offset = 16

+    S              h;     // offset = 24 (aligned to multiple of 8)

+    S              i[2];  // offset = 56 (aligned to multiple of 8) stride = 32

+};

+

+void main()

+{

+}

diff --git a/Test/spv.shaderBallotAMD.comp b/Test/spv.shaderBallotAMD.comp
index d6d370a..9cf9546 100644
--- a/Test/spv.shaderBallotAMD.comp
+++ b/Test/spv.shaderBallotAMD.comp
@@ -2,6 +2,7 @@
 

 #extension GL_ARB_gpu_shader_int64: enable

 #extension GL_AMD_gpu_shader_half_float: enable

+#extension GL_AMD_gpu_shader_int16: enable

 #extension GL_AMD_shader_ballot: enable

 

 layout (local_size_x = 8, local_size_y = 8, local_size_z = 1) in;

@@ -15,17 +16,21 @@
     int64_t i64;

     u64vec2 u64v;

     f16vec3 f16v;

+    i16vec4 i16v;

+    uint16_t u16;

 };

 

 void main()

 {

-	i    = minInvocationsAMD(i);

+    i    = minInvocationsAMD(i);

     uv   = minInvocationsAMD(uv);

     fv   = minInvocationsAMD(fv);

     dv   = minInvocationsAMD(dv);

     i64  = minInvocationsAMD(i64);

     u64v = minInvocationsAMD(u64v);

     f16v = minInvocationsAMD(f16v);

+    i16v = minInvocationsAMD(i16v);

+    u16  = minInvocationsAMD(u16);

 

     i    = maxInvocationsAMD(i);

     uv   = maxInvocationsAMD(uv);

@@ -34,6 +39,8 @@
     i64  = maxInvocationsAMD(i64);

     u64v = maxInvocationsAMD(u64v);

     f16v = maxInvocationsAMD(f16v);

+    i16v = maxInvocationsAMD(i16v);

+    u16  = maxInvocationsAMD(u16);

 

     i    = addInvocationsAMD(i);

     uv   = addInvocationsAMD(uv);

@@ -42,6 +49,8 @@
     i64  = addInvocationsAMD(i64);

     u64v = addInvocationsAMD(u64v);

     f16v = addInvocationsAMD(f16v);

+    i16v = addInvocationsAMD(i16v);

+    u16  = addInvocationsAMD(u16);

 

 	i    = minInvocationsNonUniformAMD(i);

     uv   = minInvocationsNonUniformAMD(uv);

@@ -50,6 +59,8 @@
     i64  = minInvocationsNonUniformAMD(i64);

     u64v = minInvocationsNonUniformAMD(u64v);

     f16v = minInvocationsNonUniformAMD(f16v);

+    i16v = minInvocationsNonUniformAMD(i16v);

+    u16  = minInvocationsNonUniformAMD(u16);

 

     i    = maxInvocationsNonUniformAMD(i);

     uv   = maxInvocationsNonUniformAMD(uv);

@@ -58,6 +69,8 @@
     i64  = maxInvocationsNonUniformAMD(i64);

     u64v = maxInvocationsNonUniformAMD(u64v);

     f16v = maxInvocationsNonUniformAMD(f16v);

+    i16v = maxInvocationsNonUniformAMD(i16v);

+    u16  = maxInvocationsNonUniformAMD(u16);

 

     i    = addInvocationsNonUniformAMD(i);

     uv   = addInvocationsNonUniformAMD(uv);

@@ -66,6 +79,8 @@
     i64  = addInvocationsNonUniformAMD(i64);

     u64v = addInvocationsNonUniformAMD(u64v);

     f16v = addInvocationsNonUniformAMD(f16v);

+    i16v = addInvocationsNonUniformAMD(i16v);

+    u16  = addInvocationsNonUniformAMD(u16);

 

     i    = minInvocationsInclusiveScanAMD(i);

     uv   = minInvocationsInclusiveScanAMD(uv);

@@ -74,6 +89,8 @@
     i64  = minInvocationsInclusiveScanAMD(i64);

     u64v = minInvocationsInclusiveScanAMD(u64v);

     f16v = minInvocationsInclusiveScanAMD(f16v);

+    i16v = minInvocationsInclusiveScanAMD(i16v);

+    u16  = minInvocationsInclusiveScanAMD(u16);

 

     i    = maxInvocationsInclusiveScanAMD(i);

     uv   = maxInvocationsInclusiveScanAMD(uv);

@@ -82,6 +99,8 @@
     i64  = maxInvocationsInclusiveScanAMD(i64);

     u64v = maxInvocationsInclusiveScanAMD(u64v);

     f16v = maxInvocationsInclusiveScanAMD(f16v);

+    i16v = maxInvocationsInclusiveScanAMD(i16v);

+    u16  = maxInvocationsInclusiveScanAMD(u16);

 

     i    = addInvocationsInclusiveScanAMD(i);

     uv   = addInvocationsInclusiveScanAMD(uv);

@@ -90,6 +109,8 @@
     i64  = addInvocationsInclusiveScanAMD(i64);

     u64v = addInvocationsInclusiveScanAMD(u64v);

     f16v = addInvocationsInclusiveScanAMD(f16v);

+    i16v = addInvocationsInclusiveScanAMD(i16v);

+    u16  = addInvocationsInclusiveScanAMD(u16);

 

     i    = minInvocationsExclusiveScanAMD(i);

     uv   = minInvocationsExclusiveScanAMD(uv);

@@ -98,6 +119,8 @@
     i64  = minInvocationsExclusiveScanAMD(i64);

     u64v = minInvocationsExclusiveScanAMD(u64v);

     f16v = minInvocationsExclusiveScanAMD(f16v);

+    i16v = minInvocationsExclusiveScanAMD(i16v);

+    u16  = minInvocationsExclusiveScanAMD(u16);

 

     i    = maxInvocationsExclusiveScanAMD(i);

     uv   = maxInvocationsExclusiveScanAMD(uv);

@@ -106,6 +129,8 @@
     i64  = maxInvocationsExclusiveScanAMD(i64);

     u64v = maxInvocationsExclusiveScanAMD(u64v);

     f16v = maxInvocationsExclusiveScanAMD(f16v);

+    i16v = maxInvocationsExclusiveScanAMD(i16v);

+    u16  = maxInvocationsExclusiveScanAMD(u16);

 

     i    = addInvocationsExclusiveScanAMD(i);

     uv   = addInvocationsExclusiveScanAMD(uv);

@@ -114,6 +139,8 @@
     i64  = addInvocationsExclusiveScanAMD(i64);

     u64v = addInvocationsExclusiveScanAMD(u64v);

     f16v = addInvocationsExclusiveScanAMD(f16v);

+    i16v = addInvocationsExclusiveScanAMD(i16v);

+    u16  = addInvocationsExclusiveScanAMD(u16);

 

     i    = minInvocationsInclusiveScanNonUniformAMD(i);

     uv   = minInvocationsInclusiveScanNonUniformAMD(uv);

@@ -122,6 +149,8 @@
     i64  = minInvocationsInclusiveScanNonUniformAMD(i64);

     u64v = minInvocationsInclusiveScanNonUniformAMD(u64v);

     f16v = minInvocationsInclusiveScanNonUniformAMD(f16v);

+    i16v = minInvocationsInclusiveScanNonUniformAMD(i16v);

+    u16  = minInvocationsInclusiveScanNonUniformAMD(u16);

 

     i    = maxInvocationsInclusiveScanNonUniformAMD(i);

     uv   = maxInvocationsInclusiveScanNonUniformAMD(uv);

@@ -130,6 +159,8 @@
     i64  = maxInvocationsInclusiveScanNonUniformAMD(i64);

     u64v = maxInvocationsInclusiveScanNonUniformAMD(u64v);

     f16v = maxInvocationsInclusiveScanNonUniformAMD(f16v);

+    i16v = maxInvocationsInclusiveScanNonUniformAMD(i16v);

+    u16  = maxInvocationsInclusiveScanNonUniformAMD(u16);

 

     i    = addInvocationsInclusiveScanNonUniformAMD(i);

     uv   = addInvocationsInclusiveScanNonUniformAMD(uv);

@@ -138,6 +169,8 @@
     i64  = addInvocationsInclusiveScanNonUniformAMD(i64);

     u64v = addInvocationsInclusiveScanNonUniformAMD(u64v);

     f16v = addInvocationsInclusiveScanNonUniformAMD(f16v);

+    i16v = addInvocationsInclusiveScanNonUniformAMD(i16v);

+    u16  = addInvocationsInclusiveScanNonUniformAMD(u16);

 

     i    = minInvocationsExclusiveScanNonUniformAMD(i);

     uv   = minInvocationsExclusiveScanNonUniformAMD(uv);

@@ -146,6 +179,8 @@
     i64  = minInvocationsExclusiveScanNonUniformAMD(i64);

     u64v = minInvocationsExclusiveScanNonUniformAMD(u64v);

     f16v = minInvocationsExclusiveScanNonUniformAMD(f16v);

+    i16v = minInvocationsExclusiveScanNonUniformAMD(i16v);

+    u16  = minInvocationsExclusiveScanNonUniformAMD(u16);

 

     i    = maxInvocationsExclusiveScanNonUniformAMD(i);

     uv   = maxInvocationsExclusiveScanNonUniformAMD(uv);

@@ -154,6 +189,8 @@
     i64  = maxInvocationsExclusiveScanNonUniformAMD(i64);

     u64v = maxInvocationsExclusiveScanNonUniformAMD(u64v);

     f16v = maxInvocationsExclusiveScanNonUniformAMD(f16v);

+    i16v = maxInvocationsExclusiveScanNonUniformAMD(i16v);

+    u16  = maxInvocationsExclusiveScanNonUniformAMD(u16);

 

     i    = addInvocationsExclusiveScanNonUniformAMD(i);

     uv   = addInvocationsExclusiveScanNonUniformAMD(uv);

@@ -162,4 +199,6 @@
     i64  = addInvocationsExclusiveScanNonUniformAMD(i64);

     u64v = addInvocationsExclusiveScanNonUniformAMD(u64v);

     f16v = addInvocationsExclusiveScanNonUniformAMD(f16v);

+    i16v = addInvocationsExclusiveScanNonUniformAMD(i16v);

+    u16  = addInvocationsExclusiveScanNonUniformAMD(u16);

 }

diff --git a/Test/spv.shaderFragMaskAMD.frag b/Test/spv.shaderFragMaskAMD.frag
new file mode 100644
index 0000000..b9e8ab0
--- /dev/null
+++ b/Test/spv.shaderFragMaskAMD.frag
@@ -0,0 +1,29 @@
+#version 450 core

+

+#extension GL_AMD_shader_fragment_mask: enable

+

+layout(binding = 0) uniform sampler2DMS       s2DMS;

+layout(binding = 1) uniform isampler2DMSArray is2DMSArray;

+

+layout(binding = 2, input_attachment_index = 0) uniform usubpassInputMS usubpassMS;

+

+layout(location = 0) out vec4 fragColor;

+

+void main()

+{

+    vec4 f4 = vec4(0.0);

+

+    uint fragMask = fragmentMaskFetchAMD(s2DMS, ivec2(2, 3));

+    uint fragIndex = (fragMask & 0xF0) >> 4;

+    f4 += fragmentFetchAMD(s2DMS, ivec2(2, 3), 1);

+

+    fragMask = fragmentMaskFetchAMD(is2DMSArray, ivec3(2, 3, 1));

+    fragIndex = (fragMask & 0xF0) >> 4;

+    f4 += fragmentFetchAMD(is2DMSArray, ivec3(2, 3, 1), fragIndex);

+

+    fragMask = fragmentMaskFetchAMD(usubpassMS);

+    fragIndex = (fragMask & 0xF0) >> 4;

+    f4 += fragmentFetchAMD(usubpassMS, fragIndex);

+

+    fragColor = f4;

+}
\ No newline at end of file
diff --git a/Test/spv.shaderImageFootprint.frag b/Test/spv.shaderImageFootprint.frag
new file mode 100644
index 0000000..efde370
--- /dev/null
+++ b/Test/spv.shaderImageFootprint.frag
@@ -0,0 +1,123 @@
+#version 450
+
+#extension GL_NV_shader_texture_footprint : require
+
+
+layout (location = 0) in vec2 P2;
+layout (location = 2) in vec3 P3;
+layout (location = 3) in flat int granularity;
+layout (location = 4) in float lodClamp;
+layout (location = 5) in float lod;
+layout (location = 6) in vec2 dx;
+layout (location = 8) in vec2 dy;
+layout (location = 9) in float bias;
+
+uniform sampler2D sample2D;
+uniform sampler3D sample3D;
+
+buffer result2D {
+    bool ret2D;
+    uvec2 anchor2D;
+    uvec2 offset2D;
+    uvec2 mask2D;
+    uint lod2D;
+    uint granularity2D;
+};
+
+buffer result3D {
+    bool ret3D;
+    uvec3 anchor3D;
+    uvec3 offset3D;
+    uvec2 mask3D;
+    uint lod3D;
+    uint granularity3D;
+};
+
+void main() {
+ gl_TextureFootprint2DNV fp2D;
+ gl_TextureFootprint3DNV fp3D;
+ 
+ ret2D = textureFootprintNV(sample2D, P2, granularity, true, fp2D);
+ anchor2D = fp2D.anchor;
+ offset2D = fp2D.offset;
+ mask2D = fp2D.mask;
+ lod2D = fp2D.lod;
+ granularity2D = fp2D.granularity;
+ 
+ ret2D = textureFootprintNV(sample2D, P2, granularity, true, fp2D, bias);
+ anchor2D += fp2D.anchor;
+ offset2D += fp2D.offset;
+ mask2D += fp2D.mask;
+ lod2D += fp2D.lod;
+ granularity2D += fp2D.granularity;
+ 
+ ret2D = textureFootprintClampNV(sample2D, P2, lodClamp, granularity, true, fp2D);
+ anchor2D += fp2D.anchor;
+ offset2D += fp2D.offset;
+ mask2D += fp2D.mask;
+ lod2D += fp2D.lod;
+ granularity2D += fp2D.granularity;
+ 
+ ret2D = textureFootprintClampNV(sample2D, P2, lodClamp, granularity, true, fp2D, bias);
+ anchor2D += fp2D.anchor;
+ offset2D += fp2D.offset;
+ mask2D += fp2D.mask;
+ lod2D += fp2D.lod;
+ granularity2D += fp2D.granularity;
+ 
+ ret2D = textureFootprintLodNV(sample2D, P2, lod, granularity, true, fp2D);
+ anchor2D += fp2D.anchor;
+ offset2D += fp2D.offset;
+ mask2D += fp2D.mask;
+ lod2D += fp2D.lod;
+ granularity2D += fp2D.granularity;
+ 
+ ret2D = textureFootprintGradNV(sample2D, P2, dx, dy, granularity, true, fp2D);
+ anchor2D += fp2D.anchor;
+ offset2D += fp2D.offset;
+ mask2D += fp2D.mask;
+ lod2D += fp2D.lod;
+ granularity2D += fp2D.granularity;
+ 
+ ret2D = textureFootprintGradClampNV(sample2D, P2, dx, dy, lodClamp, granularity, true, fp2D);
+ anchor2D += fp2D.anchor;
+ offset2D += fp2D.offset;
+ mask2D += fp2D.mask;
+ lod2D += fp2D.lod;
+ granularity2D += fp2D.granularity;
+ 
+ ret3D = textureFootprintNV(sample3D, P3, granularity, true, fp3D);
+ anchor3D = fp3D.anchor;
+ offset3D = fp3D.offset;
+ mask3D = fp3D.mask;
+ lod3D = fp3D.lod;
+ granularity3D = fp3D.granularity;
+ 
+ ret3D = textureFootprintNV(sample3D, P3, granularity, true, fp3D, bias);
+ anchor3D += fp3D.anchor;
+ offset3D += fp3D.offset;
+ mask3D += fp3D.mask;
+ lod3D += fp3D.lod;
+ granularity3D += fp3D.granularity;
+ 
+ ret3D = textureFootprintClampNV(sample3D, P3, lodClamp, granularity, true, fp3D);
+ anchor3D += fp3D.anchor;
+ offset3D += fp3D.offset;
+ mask3D += fp3D.mask;
+ lod3D += fp3D.lod;
+ granularity3D += fp3D.granularity;
+ 
+ ret3D = textureFootprintClampNV(sample3D, P3, lodClamp, granularity, true, fp3D, bias);
+ anchor3D += fp3D.anchor;
+ offset3D += fp3D.offset;
+ mask3D += fp3D.mask;
+ lod3D += fp3D.lod;
+ granularity3D += fp3D.granularity;
+ 
+ ret3D = textureFootprintLodNV(sample3D, P3, lod, granularity, true, fp3D);
+ anchor3D += fp3D.anchor;
+ offset3D += fp3D.offset;
+ mask3D += fp3D.mask;
+ lod3D += fp3D.lod;
+ granularity3D += fp3D.granularity;
+}
\ No newline at end of file
diff --git a/Test/spv.shaderStencilExport.frag b/Test/spv.shaderStencilExport.frag
new file mode 100644
index 0000000..e3ad4d6
--- /dev/null
+++ b/Test/spv.shaderStencilExport.frag
@@ -0,0 +1,10 @@
+#version 450 core

+

+#extension GL_ARB_shader_stencil_export: enable

+

+out int gl_FragStencilRefARB;

+

+void main()

+{

+    gl_FragStencilRefARB = 100;

+}

diff --git a/Test/spv.shadingRate.frag b/Test/spv.shadingRate.frag
new file mode 100644
index 0000000..8fbd4ba
--- /dev/null
+++ b/Test/spv.shadingRate.frag
@@ -0,0 +1,11 @@
+#version 450
+
+#extension GL_NV_shading_rate_image : require
+
+layout (location = 0) out vec2 FragmentSize;
+layout (location = 2) out int InvocationsPerPixel;
+
+void main () {
+    FragmentSize = gl_FragmentSizeNV;
+    InvocationsPerPixel = gl_InvocationsPerPixelNV;
+}
\ No newline at end of file
diff --git a/Test/spv.shortCircuit.frag b/Test/spv.shortCircuit.frag
old mode 100755
new mode 100644
diff --git a/Test/spv.ssboAlias.frag b/Test/spv.ssboAlias.frag
new file mode 100644
index 0000000..ed3d3e7
--- /dev/null
+++ b/Test/spv.ssboAlias.frag
@@ -0,0 +1,10 @@
+AppendStructuredBuffer<uint> Buf1 : register(u1);
+AppendStructuredBuffer<uint> Buf2 : register(u2);
+AppendStructuredBuffer<uint> Buf3 : register(u1);
+
+float4 main() : SV_Target
+{
+	Buf1.Append(10u);
+	Buf2.Append(20u);
+	return float4(1.0, 3.0, 5.0, 1.0);
+}
\ No newline at end of file
diff --git a/Test/spv.stereoViewRendering.tesc b/Test/spv.stereoViewRendering.tesc
index 62fc956..e8cfe00 100644
--- a/Test/spv.stereoViewRendering.tesc
+++ b/Test/spv.stereoViewRendering.tesc
@@ -8,9 +8,10 @@
 out gl_PerVertex {

     int gl_SecondaryViewportMaskNV[2];

     vec4 gl_SecondaryPositionNV;

-    layout (viewport_relative, secondary_view_offset = 1) out highp int gl_Layer;

 } gl_out[4];

 

+layout (viewport_relative, secondary_view_offset = 1) out highp int gl_Layer;

+

 void main()

 {

     gl_out[gl_InvocationID].gl_SecondaryViewportMaskNV[0]            = 1;

diff --git a/Test/spv.subgroup.frag b/Test/spv.subgroup.frag
new file mode 100644
index 0000000..520052f
--- /dev/null
+++ b/Test/spv.subgroup.frag
@@ -0,0 +1,7 @@
+#version 450

+#extension GL_KHR_shader_subgroup_basic: enable

+layout(location = 0) out uvec4 data;

+void main (void)

+{

+  data = uvec4(gl_SubgroupSize, gl_SubgroupInvocationID, 0, 0);

+}

diff --git a/Test/spv.subgroup.geom b/Test/spv.subgroup.geom
new file mode 100644
index 0000000..70e9dd4
--- /dev/null
+++ b/Test/spv.subgroup.geom
@@ -0,0 +1,13 @@
+#version 450

+#extension GL_KHR_shader_subgroup_basic: enable

+layout(points) in;

+layout(points, max_vertices = 1) out;

+layout(set = 0, binding = 0, std430) buffer Output

+{

+  uvec4 result[];

+};

+

+void main (void)

+{

+  result[gl_PrimitiveIDIn] = uvec4(gl_SubgroupSize, gl_SubgroupInvocationID, 0, 0);

+}

diff --git a/Test/spv.subgroup.tesc b/Test/spv.subgroup.tesc
new file mode 100644
index 0000000..63bf5e5
--- /dev/null
+++ b/Test/spv.subgroup.tesc
@@ -0,0 +1,12 @@
+#version 450

+#extension GL_KHR_shader_subgroup_basic: enable

+layout(vertices=1) out;

+layout(set = 0, binding = 0, std430) buffer Output

+{

+  uvec4 result[];

+};

+

+void main (void)

+{

+  result[gl_PrimitiveID] = uvec4(gl_SubgroupSize, gl_SubgroupInvocationID, 0, 0);

+}

diff --git a/Test/spv.subgroup.tese b/Test/spv.subgroup.tese
new file mode 100644
index 0000000..e504df7
--- /dev/null
+++ b/Test/spv.subgroup.tese
@@ -0,0 +1,12 @@
+#version 450

+#extension GL_KHR_shader_subgroup_basic: enable

+layout(isolines) in;

+layout(set = 0, binding = 0, std430) buffer Output

+{

+  uvec4 result[];

+};

+

+void main (void)

+{

+  result[gl_PrimitiveID] = uvec4(gl_SubgroupSize, gl_SubgroupInvocationID, 0, 0);

+}

diff --git a/Test/spv.subgroup.vert b/Test/spv.subgroup.vert
new file mode 100644
index 0000000..779b758
--- /dev/null
+++ b/Test/spv.subgroup.vert
@@ -0,0 +1,11 @@
+#version 450

+#extension GL_KHR_shader_subgroup_basic: enable

+layout(set = 0, binding = 0, std430) buffer Output

+{

+  uvec4 result[];

+};

+

+void main (void)

+{

+  result[gl_VertexIndex] = uvec4(gl_SubgroupSize, gl_SubgroupInvocationID, 0, 0);

+}

diff --git a/Test/spv.subgroupArithmetic.comp b/Test/spv.subgroupArithmetic.comp
new file mode 100644
index 0000000..6cc9337
--- /dev/null
+++ b/Test/spv.subgroupArithmetic.comp
@@ -0,0 +1,393 @@
+#version 450

+

+#extension GL_KHR_shader_subgroup_arithmetic: enable

+

+layout (local_size_x = 8) in;

+

+layout(binding = 0) buffer Buffers

+{

+    vec4  f4;

+    ivec4 i4;

+    uvec4 u4;

+    dvec4 d4;

+} data[4];

+

+void main()

+{

+    uint invocation = (gl_SubgroupInvocationID + gl_SubgroupSize) % 4;

+

+    data[invocation].f4.x   = subgroupAdd(data[0].f4.x);

+    data[invocation].f4.xy  = subgroupAdd(data[1].f4.xy);

+    data[invocation].f4.xyz = subgroupAdd(data[2].f4.xyz);

+    data[invocation].f4     = subgroupAdd(data[3].f4);

+

+    data[invocation].i4.x   = subgroupAdd(data[0].i4.x);

+    data[invocation].i4.xy  = subgroupAdd(data[1].i4.xy);

+    data[invocation].i4.xyz = subgroupAdd(data[2].i4.xyz);

+    data[invocation].i4     = subgroupAdd(data[3].i4);

+

+    data[invocation].u4.x   = subgroupAdd(data[0].u4.x);

+    data[invocation].u4.xy  = subgroupAdd(data[1].u4.xy);

+    data[invocation].u4.xyz = subgroupAdd(data[2].u4.xyz);

+    data[invocation].u4     = subgroupAdd(data[3].u4);

+

+    data[invocation].d4.x   = subgroupAdd(data[0].d4.x);

+    data[invocation].d4.xy  = subgroupAdd(data[1].d4.xy);

+    data[invocation].d4.xyz = subgroupAdd(data[2].d4.xyz);

+    data[invocation].d4     = subgroupAdd(data[3].d4);

+

+    data[invocation].f4.x   = subgroupMul(data[0].f4.x);

+    data[invocation].f4.xy  = subgroupMul(data[1].f4.xy);

+    data[invocation].f4.xyz = subgroupMul(data[2].f4.xyz);

+    data[invocation].f4     = subgroupMul(data[3].f4);

+

+    data[invocation].i4.x   = subgroupMul(data[0].i4.x);

+    data[invocation].i4.xy  = subgroupMul(data[1].i4.xy);

+    data[invocation].i4.xyz = subgroupMul(data[2].i4.xyz);

+    data[invocation].i4     = subgroupMul(data[3].i4);

+

+    data[invocation].u4.x   = subgroupMul(data[0].u4.x);

+    data[invocation].u4.xy  = subgroupMul(data[1].u4.xy);

+    data[invocation].u4.xyz = subgroupMul(data[2].u4.xyz);

+    data[invocation].u4     = subgroupMul(data[3].u4);

+

+    data[invocation].d4.x   = subgroupMul(data[0].d4.x);

+    data[invocation].d4.xy  = subgroupMul(data[1].d4.xy);

+    data[invocation].d4.xyz = subgroupMul(data[2].d4.xyz);

+    data[invocation].d4     = subgroupMul(data[3].d4);

+

+    data[invocation].f4.x   = subgroupMin(data[0].f4.x);

+    data[invocation].f4.xy  = subgroupMin(data[1].f4.xy);

+    data[invocation].f4.xyz = subgroupMin(data[2].f4.xyz);

+    data[invocation].f4     = subgroupMin(data[3].f4);

+

+    data[invocation].i4.x   = subgroupMin(data[0].i4.x);

+    data[invocation].i4.xy  = subgroupMin(data[1].i4.xy);

+    data[invocation].i4.xyz = subgroupMin(data[2].i4.xyz);

+    data[invocation].i4     = subgroupMin(data[3].i4);

+

+    data[invocation].u4.x   = subgroupMin(data[0].u4.x);

+    data[invocation].u4.xy  = subgroupMin(data[1].u4.xy);

+    data[invocation].u4.xyz = subgroupMin(data[2].u4.xyz);

+    data[invocation].u4     = subgroupMin(data[3].u4);

+

+    data[invocation].d4.x   = subgroupMin(data[0].d4.x);

+    data[invocation].d4.xy  = subgroupMin(data[1].d4.xy);

+    data[invocation].d4.xyz = subgroupMin(data[2].d4.xyz);

+    data[invocation].d4     = subgroupMin(data[3].d4);

+

+    data[invocation].f4.x   = subgroupMax(data[0].f4.x);

+    data[invocation].f4.xy  = subgroupMax(data[1].f4.xy);

+    data[invocation].f4.xyz = subgroupMax(data[2].f4.xyz);

+    data[invocation].f4     = subgroupMax(data[3].f4);

+

+    data[invocation].i4.x   = subgroupMax(data[0].i4.x);

+    data[invocation].i4.xy  = subgroupMax(data[1].i4.xy);

+    data[invocation].i4.xyz = subgroupMax(data[2].i4.xyz);

+    data[invocation].i4     = subgroupMax(data[3].i4);

+

+    data[invocation].u4.x   = subgroupMax(data[0].u4.x);

+    data[invocation].u4.xy  = subgroupMax(data[1].u4.xy);

+    data[invocation].u4.xyz = subgroupMax(data[2].u4.xyz);

+    data[invocation].u4     = subgroupMax(data[3].u4);

+

+    data[invocation].d4.x   = subgroupMax(data[0].d4.x);

+    data[invocation].d4.xy  = subgroupMax(data[1].d4.xy);

+    data[invocation].d4.xyz = subgroupMax(data[2].d4.xyz);

+    data[invocation].d4     = subgroupMax(data[3].d4);

+

+    data[invocation].i4.x   = subgroupAnd(data[0].i4.x);

+    data[invocation].i4.xy  = subgroupAnd(data[1].i4.xy);

+    data[invocation].i4.xyz = subgroupAnd(data[2].i4.xyz);

+    data[invocation].i4     = subgroupAnd(data[3].i4);

+

+    data[invocation].u4.x   = subgroupAnd(data[0].u4.x);

+    data[invocation].u4.xy  = subgroupAnd(data[1].u4.xy);

+    data[invocation].u4.xyz = subgroupAnd(data[2].u4.xyz);

+    data[invocation].u4     = subgroupAnd(data[3].u4);

+

+    data[invocation].i4.x   =   int(subgroupAnd(data[0].i4.x < 0));

+    data[invocation].i4.xy  = ivec2(subgroupAnd(lessThan(data[1].i4.xy, ivec2(0))));

+    data[invocation].i4.xyz = ivec3(subgroupAnd(lessThan(data[1].i4.xyz, ivec3(0))));

+    data[invocation].i4     = ivec4(subgroupAnd(lessThan(data[1].i4, ivec4(0))));

+

+    data[invocation].i4.x   = subgroupOr(data[0].i4.x);

+    data[invocation].i4.xy  = subgroupOr(data[1].i4.xy);

+    data[invocation].i4.xyz = subgroupOr(data[2].i4.xyz);

+    data[invocation].i4     = subgroupOr(data[3].i4);

+

+    data[invocation].u4.x   = subgroupOr(data[0].u4.x);

+    data[invocation].u4.xy  = subgroupOr(data[1].u4.xy);

+    data[invocation].u4.xyz = subgroupOr(data[2].u4.xyz);

+    data[invocation].u4     = subgroupOr(data[3].u4);

+

+    data[invocation].i4.x   =   int(subgroupOr(data[0].i4.x < 0));

+    data[invocation].i4.xy  = ivec2(subgroupOr(lessThan(data[1].i4.xy, ivec2(0))));

+    data[invocation].i4.xyz = ivec3(subgroupOr(lessThan(data[1].i4.xyz, ivec3(0))));

+    data[invocation].i4     = ivec4(subgroupOr(lessThan(data[1].i4, ivec4(0))));

+

+    data[invocation].i4.x   = subgroupXor(data[0].i4.x);

+    data[invocation].i4.xy  = subgroupXor(data[1].i4.xy);

+    data[invocation].i4.xyz = subgroupXor(data[2].i4.xyz);

+    data[invocation].i4     = subgroupXor(data[3].i4);

+

+    data[invocation].u4.x   = subgroupXor(data[0].u4.x);

+    data[invocation].u4.xy  = subgroupXor(data[1].u4.xy);

+    data[invocation].u4.xyz = subgroupXor(data[2].u4.xyz);

+    data[invocation].u4     = subgroupXor(data[3].u4);

+

+    data[invocation].i4.x   =   int(subgroupXor(data[0].i4.x < 0));

+    data[invocation].i4.xy  = ivec2(subgroupXor(lessThan(data[1].i4.xy, ivec2(0))));

+    data[invocation].i4.xyz = ivec3(subgroupXor(lessThan(data[1].i4.xyz, ivec3(0))));

+    data[invocation].i4     = ivec4(subgroupXor(lessThan(data[1].i4, ivec4(0))));

+

+    data[invocation].f4.x   = subgroupInclusiveAdd(data[0].f4.x);

+    data[invocation].f4.xy  = subgroupInclusiveAdd(data[1].f4.xy);

+    data[invocation].f4.xyz = subgroupInclusiveAdd(data[2].f4.xyz);

+    data[invocation].f4     = subgroupInclusiveAdd(data[3].f4);

+

+    data[invocation].i4.x   = subgroupInclusiveAdd(data[0].i4.x);

+    data[invocation].i4.xy  = subgroupInclusiveAdd(data[1].i4.xy);

+    data[invocation].i4.xyz = subgroupInclusiveAdd(data[2].i4.xyz);

+    data[invocation].i4     = subgroupInclusiveAdd(data[3].i4);

+

+    data[invocation].u4.x   = subgroupInclusiveAdd(data[0].u4.x);

+    data[invocation].u4.xy  = subgroupInclusiveAdd(data[1].u4.xy);

+    data[invocation].u4.xyz = subgroupInclusiveAdd(data[2].u4.xyz);

+    data[invocation].u4     = subgroupInclusiveAdd(data[3].u4);

+

+    data[invocation].d4.x   = subgroupInclusiveAdd(data[0].d4.x);

+    data[invocation].d4.xy  = subgroupInclusiveAdd(data[1].d4.xy);

+    data[invocation].d4.xyz = subgroupInclusiveAdd(data[2].d4.xyz);

+    data[invocation].d4     = subgroupInclusiveAdd(data[3].d4);

+

+    data[invocation].f4.x   = subgroupInclusiveMul(data[0].f4.x);

+    data[invocation].f4.xy  = subgroupInclusiveMul(data[1].f4.xy);

+    data[invocation].f4.xyz = subgroupInclusiveMul(data[2].f4.xyz);

+    data[invocation].f4     = subgroupInclusiveMul(data[3].f4);

+

+    data[invocation].i4.x   = subgroupInclusiveMul(data[0].i4.x);

+    data[invocation].i4.xy  = subgroupInclusiveMul(data[1].i4.xy);

+    data[invocation].i4.xyz = subgroupInclusiveMul(data[2].i4.xyz);

+    data[invocation].i4     = subgroupInclusiveMul(data[3].i4);

+

+    data[invocation].u4.x   = subgroupInclusiveMul(data[0].u4.x);

+    data[invocation].u4.xy  = subgroupInclusiveMul(data[1].u4.xy);

+    data[invocation].u4.xyz = subgroupInclusiveMul(data[2].u4.xyz);

+    data[invocation].u4     = subgroupInclusiveMul(data[3].u4);

+

+    data[invocation].d4.x   = subgroupInclusiveMul(data[0].d4.x);

+    data[invocation].d4.xy  = subgroupInclusiveMul(data[1].d4.xy);

+    data[invocation].d4.xyz = subgroupInclusiveMul(data[2].d4.xyz);

+    data[invocation].d4     = subgroupInclusiveMul(data[3].d4);

+

+    data[invocation].f4.x   = subgroupInclusiveMin(data[0].f4.x);

+    data[invocation].f4.xy  = subgroupInclusiveMin(data[1].f4.xy);

+    data[invocation].f4.xyz = subgroupInclusiveMin(data[2].f4.xyz);

+    data[invocation].f4     = subgroupInclusiveMin(data[3].f4);

+

+    data[invocation].i4.x   = subgroupInclusiveMin(data[0].i4.x);

+    data[invocation].i4.xy  = subgroupInclusiveMin(data[1].i4.xy);

+    data[invocation].i4.xyz = subgroupInclusiveMin(data[2].i4.xyz);

+    data[invocation].i4     = subgroupInclusiveMin(data[3].i4);

+

+    data[invocation].u4.x   = subgroupInclusiveMin(data[0].u4.x);

+    data[invocation].u4.xy  = subgroupInclusiveMin(data[1].u4.xy);

+    data[invocation].u4.xyz = subgroupInclusiveMin(data[2].u4.xyz);

+    data[invocation].u4     = subgroupInclusiveMin(data[3].u4);

+

+    data[invocation].d4.x   = subgroupInclusiveMin(data[0].d4.x);

+    data[invocation].d4.xy  = subgroupInclusiveMin(data[1].d4.xy);

+    data[invocation].d4.xyz = subgroupInclusiveMin(data[2].d4.xyz);

+    data[invocation].d4     = subgroupInclusiveMin(data[3].d4);

+

+    data[invocation].f4.x   = subgroupInclusiveMax(data[0].f4.x);

+    data[invocation].f4.xy  = subgroupInclusiveMax(data[1].f4.xy);

+    data[invocation].f4.xyz = subgroupInclusiveMax(data[2].f4.xyz);

+    data[invocation].f4     = subgroupInclusiveMax(data[3].f4);

+

+    data[invocation].i4.x   = subgroupInclusiveMax(data[0].i4.x);

+    data[invocation].i4.xy  = subgroupInclusiveMax(data[1].i4.xy);

+    data[invocation].i4.xyz = subgroupInclusiveMax(data[2].i4.xyz);

+    data[invocation].i4     = subgroupInclusiveMax(data[3].i4);

+

+    data[invocation].u4.x   = subgroupInclusiveMax(data[0].u4.x);

+    data[invocation].u4.xy  = subgroupInclusiveMax(data[1].u4.xy);

+    data[invocation].u4.xyz = subgroupInclusiveMax(data[2].u4.xyz);

+    data[invocation].u4     = subgroupInclusiveMax(data[3].u4);

+

+    data[invocation].d4.x   = subgroupInclusiveMax(data[0].d4.x);

+    data[invocation].d4.xy  = subgroupInclusiveMax(data[1].d4.xy);

+    data[invocation].d4.xyz = subgroupInclusiveMax(data[2].d4.xyz);

+    data[invocation].d4     = subgroupInclusiveMax(data[3].d4);

+

+    data[invocation].i4.x   = subgroupInclusiveAnd(data[0].i4.x);

+    data[invocation].i4.xy  = subgroupInclusiveAnd(data[1].i4.xy);

+    data[invocation].i4.xyz = subgroupInclusiveAnd(data[2].i4.xyz);

+    data[invocation].i4     = subgroupInclusiveAnd(data[3].i4);

+

+    data[invocation].u4.x   = subgroupInclusiveAnd(data[0].u4.x);

+    data[invocation].u4.xy  = subgroupInclusiveAnd(data[1].u4.xy);

+    data[invocation].u4.xyz = subgroupInclusiveAnd(data[2].u4.xyz);

+    data[invocation].u4     = subgroupInclusiveAnd(data[3].u4);

+

+    data[invocation].i4.x   =   int(subgroupInclusiveAnd(data[0].i4.x < 0));

+    data[invocation].i4.xy  = ivec2(subgroupInclusiveAnd(lessThan(data[1].i4.xy, ivec2(0))));

+    data[invocation].i4.xyz = ivec3(subgroupInclusiveAnd(lessThan(data[1].i4.xyz, ivec3(0))));

+    data[invocation].i4     = ivec4(subgroupInclusiveAnd(lessThan(data[1].i4, ivec4(0))));

+

+    data[invocation].i4.x   = subgroupInclusiveOr(data[0].i4.x);

+    data[invocation].i4.xy  = subgroupInclusiveOr(data[1].i4.xy);

+    data[invocation].i4.xyz = subgroupInclusiveOr(data[2].i4.xyz);

+    data[invocation].i4     = subgroupInclusiveOr(data[3].i4);

+

+    data[invocation].u4.x   = subgroupInclusiveOr(data[0].u4.x);

+    data[invocation].u4.xy  = subgroupInclusiveOr(data[1].u4.xy);

+    data[invocation].u4.xyz = subgroupInclusiveOr(data[2].u4.xyz);

+    data[invocation].u4     = subgroupInclusiveOr(data[3].u4);

+

+    data[invocation].i4.x   =   int(subgroupInclusiveOr(data[0].i4.x < 0));

+    data[invocation].i4.xy  = ivec2(subgroupInclusiveOr(lessThan(data[1].i4.xy, ivec2(0))));

+    data[invocation].i4.xyz = ivec3(subgroupInclusiveOr(lessThan(data[1].i4.xyz, ivec3(0))));

+    data[invocation].i4     = ivec4(subgroupInclusiveOr(lessThan(data[1].i4, ivec4(0))));

+

+    data[invocation].i4.x   = subgroupInclusiveXor(data[0].i4.x);

+    data[invocation].i4.xy  = subgroupInclusiveXor(data[1].i4.xy);

+    data[invocation].i4.xyz = subgroupInclusiveXor(data[2].i4.xyz);

+    data[invocation].i4     = subgroupInclusiveXor(data[3].i4);

+

+    data[invocation].u4.x   = subgroupInclusiveXor(data[0].u4.x);

+    data[invocation].u4.xy  = subgroupInclusiveXor(data[1].u4.xy);

+    data[invocation].u4.xyz = subgroupInclusiveXor(data[2].u4.xyz);

+    data[invocation].u4     = subgroupInclusiveXor(data[3].u4);

+

+    data[invocation].i4.x   =   int(subgroupInclusiveXor(data[0].i4.x < 0));

+    data[invocation].i4.xy  = ivec2(subgroupInclusiveXor(lessThan(data[1].i4.xy, ivec2(0))));

+    data[invocation].i4.xyz = ivec3(subgroupInclusiveXor(lessThan(data[1].i4.xyz, ivec3(0))));

+    data[invocation].i4     = ivec4(subgroupInclusiveXor(lessThan(data[1].i4, ivec4(0))));

+

+    data[invocation].f4.x   = subgroupExclusiveAdd(data[0].f4.x);

+    data[invocation].f4.xy  = subgroupExclusiveAdd(data[1].f4.xy);

+    data[invocation].f4.xyz = subgroupExclusiveAdd(data[2].f4.xyz);

+    data[invocation].f4     = subgroupExclusiveAdd(data[3].f4);

+

+    data[invocation].i4.x   = subgroupExclusiveAdd(data[0].i4.x);

+    data[invocation].i4.xy  = subgroupExclusiveAdd(data[1].i4.xy);

+    data[invocation].i4.xyz = subgroupExclusiveAdd(data[2].i4.xyz);

+    data[invocation].i4     = subgroupExclusiveAdd(data[3].i4);

+

+    data[invocation].u4.x   = subgroupExclusiveAdd(data[0].u4.x);

+    data[invocation].u4.xy  = subgroupExclusiveAdd(data[1].u4.xy);

+    data[invocation].u4.xyz = subgroupExclusiveAdd(data[2].u4.xyz);

+    data[invocation].u4     = subgroupExclusiveAdd(data[3].u4);

+

+    data[invocation].d4.x   = subgroupExclusiveAdd(data[0].d4.x);

+    data[invocation].d4.xy  = subgroupExclusiveAdd(data[1].d4.xy);

+    data[invocation].d4.xyz = subgroupExclusiveAdd(data[2].d4.xyz);

+    data[invocation].d4     = subgroupExclusiveAdd(data[3].d4);

+

+    data[invocation].f4.x   = subgroupExclusiveMul(data[0].f4.x);

+    data[invocation].f4.xy  = subgroupExclusiveMul(data[1].f4.xy);

+    data[invocation].f4.xyz = subgroupExclusiveMul(data[2].f4.xyz);

+    data[invocation].f4     = subgroupExclusiveMul(data[3].f4);

+

+    data[invocation].i4.x   = subgroupExclusiveMul(data[0].i4.x);

+    data[invocation].i4.xy  = subgroupExclusiveMul(data[1].i4.xy);

+    data[invocation].i4.xyz = subgroupExclusiveMul(data[2].i4.xyz);

+    data[invocation].i4     = subgroupExclusiveMul(data[3].i4);

+

+    data[invocation].u4.x   = subgroupExclusiveMul(data[0].u4.x);

+    data[invocation].u4.xy  = subgroupExclusiveMul(data[1].u4.xy);

+    data[invocation].u4.xyz = subgroupExclusiveMul(data[2].u4.xyz);

+    data[invocation].u4     = subgroupExclusiveMul(data[3].u4);

+

+    data[invocation].d4.x   = subgroupExclusiveMul(data[0].d4.x);

+    data[invocation].d4.xy  = subgroupExclusiveMul(data[1].d4.xy);

+    data[invocation].d4.xyz = subgroupExclusiveMul(data[2].d4.xyz);

+    data[invocation].d4     = subgroupExclusiveMul(data[3].d4);

+

+    data[invocation].f4.x   = subgroupExclusiveMin(data[0].f4.x);

+    data[invocation].f4.xy  = subgroupExclusiveMin(data[1].f4.xy);

+    data[invocation].f4.xyz = subgroupExclusiveMin(data[2].f4.xyz);

+    data[invocation].f4     = subgroupExclusiveMin(data[3].f4);

+

+    data[invocation].i4.x   = subgroupExclusiveMin(data[0].i4.x);

+    data[invocation].i4.xy  = subgroupExclusiveMin(data[1].i4.xy);

+    data[invocation].i4.xyz = subgroupExclusiveMin(data[2].i4.xyz);

+    data[invocation].i4     = subgroupExclusiveMin(data[3].i4);

+

+    data[invocation].u4.x   = subgroupExclusiveMin(data[0].u4.x);

+    data[invocation].u4.xy  = subgroupExclusiveMin(data[1].u4.xy);

+    data[invocation].u4.xyz = subgroupExclusiveMin(data[2].u4.xyz);

+    data[invocation].u4     = subgroupExclusiveMin(data[3].u4);

+

+    data[invocation].d4.x   = subgroupExclusiveMin(data[0].d4.x);

+    data[invocation].d4.xy  = subgroupExclusiveMin(data[1].d4.xy);

+    data[invocation].d4.xyz = subgroupExclusiveMin(data[2].d4.xyz);

+    data[invocation].d4     = subgroupExclusiveMin(data[3].d4);

+

+    data[invocation].f4.x   = subgroupExclusiveMax(data[0].f4.x);

+    data[invocation].f4.xy  = subgroupExclusiveMax(data[1].f4.xy);

+    data[invocation].f4.xyz = subgroupExclusiveMax(data[2].f4.xyz);

+    data[invocation].f4     = subgroupExclusiveMax(data[3].f4);

+

+    data[invocation].i4.x   = subgroupExclusiveMax(data[0].i4.x);

+    data[invocation].i4.xy  = subgroupExclusiveMax(data[1].i4.xy);

+    data[invocation].i4.xyz = subgroupExclusiveMax(data[2].i4.xyz);

+    data[invocation].i4     = subgroupExclusiveMax(data[3].i4);

+

+    data[invocation].u4.x   = subgroupExclusiveMax(data[0].u4.x);

+    data[invocation].u4.xy  = subgroupExclusiveMax(data[1].u4.xy);

+    data[invocation].u4.xyz = subgroupExclusiveMax(data[2].u4.xyz);

+    data[invocation].u4     = subgroupExclusiveMax(data[3].u4);

+

+    data[invocation].d4.x   = subgroupExclusiveMax(data[0].d4.x);

+    data[invocation].d4.xy  = subgroupExclusiveMax(data[1].d4.xy);

+    data[invocation].d4.xyz = subgroupExclusiveMax(data[2].d4.xyz);

+    data[invocation].d4     = subgroupExclusiveMax(data[3].d4);

+

+    data[invocation].i4.x   = subgroupExclusiveAnd(data[0].i4.x);

+    data[invocation].i4.xy  = subgroupExclusiveAnd(data[1].i4.xy);

+    data[invocation].i4.xyz = subgroupExclusiveAnd(data[2].i4.xyz);

+    data[invocation].i4     = subgroupExclusiveAnd(data[3].i4);

+

+    data[invocation].u4.x   = subgroupExclusiveAnd(data[0].u4.x);

+    data[invocation].u4.xy  = subgroupExclusiveAnd(data[1].u4.xy);

+    data[invocation].u4.xyz = subgroupExclusiveAnd(data[2].u4.xyz);

+    data[invocation].u4     = subgroupExclusiveAnd(data[3].u4);

+

+    data[invocation].i4.x   =   int(subgroupExclusiveAnd(data[0].i4.x < 0));

+    data[invocation].i4.xy  = ivec2(subgroupExclusiveAnd(lessThan(data[1].i4.xy, ivec2(0))));

+    data[invocation].i4.xyz = ivec3(subgroupExclusiveAnd(lessThan(data[1].i4.xyz, ivec3(0))));

+    data[invocation].i4     = ivec4(subgroupExclusiveAnd(lessThan(data[1].i4, ivec4(0))));

+

+    data[invocation].i4.x   = subgroupExclusiveOr(data[0].i4.x);

+    data[invocation].i4.xy  = subgroupExclusiveOr(data[1].i4.xy);

+    data[invocation].i4.xyz = subgroupExclusiveOr(data[2].i4.xyz);

+    data[invocation].i4     = subgroupExclusiveOr(data[3].i4);

+

+    data[invocation].u4.x   = subgroupExclusiveOr(data[0].u4.x);

+    data[invocation].u4.xy  = subgroupExclusiveOr(data[1].u4.xy);

+    data[invocation].u4.xyz = subgroupExclusiveOr(data[2].u4.xyz);

+    data[invocation].u4     = subgroupExclusiveOr(data[3].u4);

+

+    data[invocation].i4.x   =   int(subgroupExclusiveOr(data[0].i4.x < 0));

+    data[invocation].i4.xy  = ivec2(subgroupExclusiveOr(lessThan(data[1].i4.xy, ivec2(0))));

+    data[invocation].i4.xyz = ivec3(subgroupExclusiveOr(lessThan(data[1].i4.xyz, ivec3(0))));

+    data[invocation].i4     = ivec4(subgroupExclusiveOr(lessThan(data[1].i4, ivec4(0))));

+

+    data[invocation].i4.x   = subgroupExclusiveXor(data[0].i4.x);

+    data[invocation].i4.xy  = subgroupExclusiveXor(data[1].i4.xy);

+    data[invocation].i4.xyz = subgroupExclusiveXor(data[2].i4.xyz);

+    data[invocation].i4     = subgroupExclusiveXor(data[3].i4);

+

+    data[invocation].u4.x   = subgroupExclusiveXor(data[0].u4.x);

+    data[invocation].u4.xy  = subgroupExclusiveXor(data[1].u4.xy);

+    data[invocation].u4.xyz = subgroupExclusiveXor(data[2].u4.xyz);

+    data[invocation].u4     = subgroupExclusiveXor(data[3].u4);

+

+    data[invocation].i4.x   =   int(subgroupExclusiveXor(data[0].i4.x < 0));

+    data[invocation].i4.xy  = ivec2(subgroupExclusiveXor(lessThan(data[1].i4.xy, ivec2(0))));

+    data[invocation].i4.xyz = ivec3(subgroupExclusiveXor(lessThan(data[1].i4.xyz, ivec3(0))));

+    data[invocation].i4     = ivec4(subgroupExclusiveXor(lessThan(data[1].i4, ivec4(0))));

+}

diff --git a/Test/spv.subgroupBallot.comp b/Test/spv.subgroupBallot.comp
new file mode 100755
index 0000000..bb9dc3e
--- /dev/null
+++ b/Test/spv.subgroupBallot.comp
@@ -0,0 +1,86 @@
+#version 450

+

+#extension GL_KHR_shader_subgroup_ballot: enable

+

+layout (local_size_x = 8, local_size_y = 8, local_size_z = 1) in;

+

+layout(binding = 0) buffer Buffers

+{

+    vec4  f4;

+    ivec4 i4;

+    uvec4 u4;

+    dvec4 d4;

+} data[4];

+

+void main()

+{

+    uint invocation = (gl_SubgroupInvocationID + gl_SubgroupSize) % 4;

+

+    uvec4 relMask = gl_SubgroupEqMask +

+                       gl_SubgroupGeMask +

+                       gl_SubgroupGtMask +

+                       gl_SubgroupLeMask +

+                       gl_SubgroupLtMask;

+

+    uvec4 result = subgroupBallot(true);

+

+    data[invocation].u4.x = subgroupBallotBitCount(result);

+    data[invocation].u4.y = subgroupBallotBitExtract(result, 0) ? 1 : 0;

+    data[invocation].u4.z = subgroupBallotInclusiveBitCount(result) + subgroupBallotExclusiveBitCount(result);

+    data[invocation].u4.w = subgroupBallotFindLSB(result) + subgroupBallotFindMSB(result);

+

+    if ((relMask == result) && subgroupInverseBallot(data[0].u4))

+    {

+        data[invocation].f4.x   = subgroupBroadcast(data[0].f4.x,    3);

+        data[invocation].f4.xy  = subgroupBroadcast(data[1].f4.xy,   3);

+        data[invocation].f4.xyz = subgroupBroadcast(data[2].f4.xyz,  3);

+        data[invocation].f4     = subgroupBroadcast(data[3].f4,      3);

+

+        data[invocation].i4.x   = subgroupBroadcast(data[0].i4.x,    2);

+        data[invocation].i4.xy  = subgroupBroadcast(data[1].i4.xy,   2);

+        data[invocation].i4.xyz = subgroupBroadcast(data[2].i4.xyz,  2);

+        data[invocation].i4     = subgroupBroadcast(data[3].i4,      2);

+

+        data[invocation].u4.x   = subgroupBroadcast(data[0].u4.x,    1);

+        data[invocation].u4.xy  = subgroupBroadcast(data[1].u4.xy,   1);

+        data[invocation].u4.xyz = subgroupBroadcast(data[2].u4.xyz,  1);

+        data[invocation].u4     = subgroupBroadcast(data[3].u4,      1);

+

+        data[invocation].d4.x   = subgroupBroadcast(data[0].d4.x,    0);

+        data[invocation].d4.xy  = subgroupBroadcast(data[1].d4.xy,   0);

+        data[invocation].d4.xyz = subgroupBroadcast(data[2].d4.xyz,  0);

+        data[invocation].d4     = subgroupBroadcast(data[3].d4,      0);

+

+        data[invocation].i4.x   = int(subgroupBroadcast(data[0].i4.x < 0,            1));

+        data[invocation].i4.xy  = ivec2(subgroupBroadcast(lessThan(data[1].i4.xy, ivec2(0)), 1));

+        data[invocation].i4.xyz = ivec3(subgroupBroadcast(lessThan(data[1].i4.xyz, ivec3(0)), 1));

+        data[invocation].i4     = ivec4(subgroupBroadcast(lessThan(data[1].i4, ivec4(0)), 1));

+    }

+    else

+    {

+        data[invocation].f4.x   = subgroupBroadcastFirst(data[0].f4.x);

+        data[invocation].f4.xy  = subgroupBroadcastFirst(data[1].f4.xy);

+        data[invocation].f4.xyz = subgroupBroadcastFirst(data[2].f4.xyz);

+        data[invocation].f4     = subgroupBroadcastFirst(data[3].f4);

+

+        data[invocation].i4.x   = subgroupBroadcastFirst(data[0].i4.x);

+        data[invocation].i4.xy  = subgroupBroadcastFirst(data[1].i4.xy);

+        data[invocation].i4.xyz = subgroupBroadcastFirst(data[2].i4.xyz);

+        data[invocation].i4     = subgroupBroadcastFirst(data[3].i4);

+

+        data[invocation].u4.x   = subgroupBroadcastFirst(data[0].u4.x);

+        data[invocation].u4.xy  = subgroupBroadcastFirst(data[1].u4.xy);

+        data[invocation].u4.xyz = subgroupBroadcastFirst(data[2].u4.xyz);

+        data[invocation].u4     = subgroupBroadcastFirst(data[3].u4);

+

+        data[invocation].d4.x   = subgroupBroadcastFirst(data[0].d4.x);

+        data[invocation].d4.xy  = subgroupBroadcastFirst(data[1].d4.xy);

+        data[invocation].d4.xyz = subgroupBroadcastFirst(data[2].d4.xyz);

+        data[invocation].d4     = subgroupBroadcastFirst(data[3].d4);

+

+        data[invocation].i4.x   = int(subgroupBroadcastFirst(data[0].i4.x < 0));

+        data[invocation].i4.xy  = ivec2(subgroupBroadcastFirst(lessThan(data[1].i4.xy, ivec2(0))));

+        data[invocation].i4.xyz = ivec3(subgroupBroadcastFirst(lessThan(data[1].i4.xyz, ivec3(0))));

+        data[invocation].i4     = ivec4(subgroupBroadcastFirst(lessThan(data[1].i4, ivec4(0))));

+    }

+}

diff --git a/Test/spv.subgroupBallotNeg.comp b/Test/spv.subgroupBallotNeg.comp
new file mode 100755
index 0000000..4020adf
--- /dev/null
+++ b/Test/spv.subgroupBallotNeg.comp
@@ -0,0 +1,33 @@
+#version 450

+

+#extension GL_KHR_shader_subgroup_ballot: enable

+

+layout (local_size_x = 8, local_size_y = 8, local_size_z = 1) in;

+

+layout(binding = 0) buffer Buffers

+{

+    vec4  f4;

+    ivec4 i4;

+    uvec4 u4;

+    dvec4 d4;

+} data[4];

+

+void main()

+{

+    uint invocation = (gl_SubgroupInvocationID + gl_SubgroupSize) % 4;

+

+    uvec4 relMask = gl_SubgroupEqMask +

+                       gl_SubgroupGeMask +

+                       gl_SubgroupGtMask +

+                       gl_SubgroupLeMask +

+                       gl_SubgroupLtMask;

+

+    uvec4 result = subgroupBallot(true);

+

+    data[invocation].u4.x = subgroupBallotBitCount(result);

+    data[invocation].u4.y = subgroupBallotBitExtract(result, 0) ? 1 : 0;

+    data[invocation].u4.z = subgroupBallotInclusiveBitCount(result) + subgroupBallotExclusiveBitCount(result);

+    data[invocation].u4.w = subgroupBallotFindLSB(result) + subgroupBallotFindMSB(result);

+

+    data[invocation].f4.x   = subgroupBroadcast(data[0].f4.x,    invocation);  // ERROR: not constant

+}

diff --git a/Test/spv.subgroupBasic.comp b/Test/spv.subgroupBasic.comp
new file mode 100644
index 0000000..4801c10
--- /dev/null
+++ b/Test/spv.subgroupBasic.comp
@@ -0,0 +1,23 @@
+#version 450

+

+#extension GL_KHR_shader_subgroup_basic: enable

+

+layout (local_size_x = 8, local_size_y = 8, local_size_z = 1) in;

+

+layout(binding = 0) buffer Buffer

+{

+    int a[];

+} data;

+

+void main()

+{

+    data.a[gl_SubgroupSize] = 1;

+    data.a[gl_SubgroupInvocationID] = 1;

+    data.a[gl_NumSubgroups] = 1;

+    data.a[gl_SubgroupID] = (subgroupElect()) ? 1 : 0;

+    subgroupBarrier();

+    subgroupMemoryBarrier();

+    subgroupMemoryBarrierBuffer();

+    subgroupMemoryBarrierShared();

+    subgroupMemoryBarrierImage();

+}

diff --git a/Test/spv.subgroupClustered.comp b/Test/spv.subgroupClustered.comp
new file mode 100644
index 0000000..128a24c
--- /dev/null
+++ b/Test/spv.subgroupClustered.comp
@@ -0,0 +1,143 @@
+#version 450

+

+#extension GL_KHR_shader_subgroup_clustered: enable

+

+layout (local_size_x = 8) in;

+

+layout(binding = 0) buffer Buffers

+{

+    vec4  f4;

+    ivec4 i4;

+    uvec4 u4;

+    dvec4 d4;

+} data[4];

+

+void main()

+{

+    uint invocation = (gl_SubgroupInvocationID + gl_SubgroupSize) % 4;

+

+    data[invocation].f4.x   = subgroupClusteredAdd(data[0].f4.x, 1);

+    data[invocation].f4.xy  = subgroupClusteredAdd(data[1].f4.xy, 1);

+    data[invocation].f4.xyz = subgroupClusteredAdd(data[2].f4.xyz, 1);

+    data[invocation].f4     = subgroupClusteredAdd(data[3].f4, 1);

+

+    data[invocation].i4.x   = subgroupClusteredAdd(data[0].i4.x, 1);

+    data[invocation].i4.xy  = subgroupClusteredAdd(data[1].i4.xy, 1);

+    data[invocation].i4.xyz = subgroupClusteredAdd(data[2].i4.xyz, 1);

+    data[invocation].i4     = subgroupClusteredAdd(data[3].i4, 1);

+

+    data[invocation].u4.x   = subgroupClusteredAdd(data[0].u4.x, 1);

+    data[invocation].u4.xy  = subgroupClusteredAdd(data[1].u4.xy, 1);

+    data[invocation].u4.xyz = subgroupClusteredAdd(data[2].u4.xyz, 1);

+    data[invocation].u4     = subgroupClusteredAdd(data[3].u4, 1);

+

+    data[invocation].d4.x   = subgroupClusteredAdd(data[0].d4.x, 1);

+    data[invocation].d4.xy  = subgroupClusteredAdd(data[1].d4.xy, 1);

+    data[invocation].d4.xyz = subgroupClusteredAdd(data[2].d4.xyz, 1);

+    data[invocation].d4     = subgroupClusteredAdd(data[3].d4, 1);

+

+    data[invocation].f4.x   = subgroupClusteredMul(data[0].f4.x, 1);

+    data[invocation].f4.xy  = subgroupClusteredMul(data[1].f4.xy, 1);

+    data[invocation].f4.xyz = subgroupClusteredMul(data[2].f4.xyz, 1);

+    data[invocation].f4     = subgroupClusteredMul(data[3].f4, 1);

+

+    data[invocation].i4.x   = subgroupClusteredMul(data[0].i4.x, 1);

+    data[invocation].i4.xy  = subgroupClusteredMul(data[1].i4.xy, 1);

+    data[invocation].i4.xyz = subgroupClusteredMul(data[2].i4.xyz, 1);

+    data[invocation].i4     = subgroupClusteredMul(data[3].i4, 1);

+

+    data[invocation].u4.x   = subgroupClusteredMul(data[0].u4.x, 1);

+    data[invocation].u4.xy  = subgroupClusteredMul(data[1].u4.xy, 1);

+    data[invocation].u4.xyz = subgroupClusteredMul(data[2].u4.xyz, 1);

+    data[invocation].u4     = subgroupClusteredMul(data[3].u4, 1);

+

+    data[invocation].d4.x   = subgroupClusteredMul(data[0].d4.x, 1);

+    data[invocation].d4.xy  = subgroupClusteredMul(data[1].d4.xy, 1);

+    data[invocation].d4.xyz = subgroupClusteredMul(data[2].d4.xyz, 1);

+    data[invocation].d4     = subgroupClusteredMul(data[3].d4, 1);

+

+    data[invocation].f4.x   = subgroupClusteredMin(data[0].f4.x, 1);

+    data[invocation].f4.xy  = subgroupClusteredMin(data[1].f4.xy, 1);

+    data[invocation].f4.xyz = subgroupClusteredMin(data[2].f4.xyz, 1);

+    data[invocation].f4     = subgroupClusteredMin(data[3].f4, 1);

+

+    data[invocation].i4.x   = subgroupClusteredMin(data[0].i4.x, 1);

+    data[invocation].i4.xy  = subgroupClusteredMin(data[1].i4.xy, 1);

+    data[invocation].i4.xyz = subgroupClusteredMin(data[2].i4.xyz, 1);

+    data[invocation].i4     = subgroupClusteredMin(data[3].i4, 1);

+

+    data[invocation].u4.x   = subgroupClusteredMin(data[0].u4.x, 1);

+    data[invocation].u4.xy  = subgroupClusteredMin(data[1].u4.xy, 1);

+    data[invocation].u4.xyz = subgroupClusteredMin(data[2].u4.xyz, 1);

+    data[invocation].u4     = subgroupClusteredMin(data[3].u4, 1);

+

+    data[invocation].d4.x   = subgroupClusteredMin(data[0].d4.x, 1);

+    data[invocation].d4.xy  = subgroupClusteredMin(data[1].d4.xy, 1);

+    data[invocation].d4.xyz = subgroupClusteredMin(data[2].d4.xyz, 1);

+    data[invocation].d4     = subgroupClusteredMin(data[3].d4, 1);

+

+    data[invocation].f4.x   = subgroupClusteredMax(data[0].f4.x, 1);

+    data[invocation].f4.xy  = subgroupClusteredMax(data[1].f4.xy, 1);

+    data[invocation].f4.xyz = subgroupClusteredMax(data[2].f4.xyz, 1);

+    data[invocation].f4     = subgroupClusteredMax(data[3].f4, 1);

+

+    data[invocation].i4.x   = subgroupClusteredMax(data[0].i4.x, 1);

+    data[invocation].i4.xy  = subgroupClusteredMax(data[1].i4.xy, 1);

+    data[invocation].i4.xyz = subgroupClusteredMax(data[2].i4.xyz, 1);

+    data[invocation].i4     = subgroupClusteredMax(data[3].i4, 1);

+

+    data[invocation].u4.x   = subgroupClusteredMax(data[0].u4.x, 1);

+    data[invocation].u4.xy  = subgroupClusteredMax(data[1].u4.xy, 1);

+    data[invocation].u4.xyz = subgroupClusteredMax(data[2].u4.xyz, 1);

+    data[invocation].u4     = subgroupClusteredMax(data[3].u4, 1);

+

+    data[invocation].d4.x   = subgroupClusteredMax(data[0].d4.x, 1);

+    data[invocation].d4.xy  = subgroupClusteredMax(data[1].d4.xy, 1);

+    data[invocation].d4.xyz = subgroupClusteredMax(data[2].d4.xyz, 1);

+    data[invocation].d4     = subgroupClusteredMax(data[3].d4, 1);

+

+    data[invocation].i4.x   = subgroupClusteredAnd(data[0].i4.x, 1);

+    data[invocation].i4.xy  = subgroupClusteredAnd(data[1].i4.xy, 1);

+    data[invocation].i4.xyz = subgroupClusteredAnd(data[2].i4.xyz, 1);

+    data[invocation].i4     = subgroupClusteredAnd(data[3].i4, 1);

+

+    data[invocation].u4.x   = subgroupClusteredAnd(data[0].u4.x, 1);

+    data[invocation].u4.xy  = subgroupClusteredAnd(data[1].u4.xy, 1);

+    data[invocation].u4.xyz = subgroupClusteredAnd(data[2].u4.xyz, 1);

+    data[invocation].u4     = subgroupClusteredAnd(data[3].u4, 1);

+

+    data[invocation].i4.x   =   int(subgroupClusteredAnd(data[0].i4.x < 0, 1));

+    data[invocation].i4.xy  = ivec2(subgroupClusteredAnd(lessThan(data[1].i4.xy, ivec2(0)), 1));

+    data[invocation].i4.xyz = ivec3(subgroupClusteredAnd(lessThan(data[1].i4.xyz, ivec3(0)), 1));

+    data[invocation].i4     = ivec4(subgroupClusteredAnd(lessThan(data[1].i4, ivec4(0)), 1));

+

+    data[invocation].i4.x   = subgroupClusteredOr(data[0].i4.x, 1);

+    data[invocation].i4.xy  = subgroupClusteredOr(data[1].i4.xy, 1);

+    data[invocation].i4.xyz = subgroupClusteredOr(data[2].i4.xyz, 1);

+    data[invocation].i4     = subgroupClusteredOr(data[3].i4, 1);

+

+    data[invocation].u4.x   = subgroupClusteredOr(data[0].u4.x, 1);

+    data[invocation].u4.xy  = subgroupClusteredOr(data[1].u4.xy, 1);

+    data[invocation].u4.xyz = subgroupClusteredOr(data[2].u4.xyz, 1);

+    data[invocation].u4     = subgroupClusteredOr(data[3].u4, 1);

+

+    data[invocation].i4.x   =   int(subgroupClusteredOr(data[0].i4.x < 0, 1));

+    data[invocation].i4.xy  = ivec2(subgroupClusteredOr(lessThan(data[1].i4.xy, ivec2(0)), 1));

+    data[invocation].i4.xyz = ivec3(subgroupClusteredOr(lessThan(data[1].i4.xyz, ivec3(0)), 1));

+    data[invocation].i4     = ivec4(subgroupClusteredOr(lessThan(data[1].i4, ivec4(0)), 1));

+

+    data[invocation].i4.x   = subgroupClusteredXor(data[0].i4.x, 1);

+    data[invocation].i4.xy  = subgroupClusteredXor(data[1].i4.xy, 1);

+    data[invocation].i4.xyz = subgroupClusteredXor(data[2].i4.xyz, 1);

+    data[invocation].i4     = subgroupClusteredXor(data[3].i4, 1);

+

+    data[invocation].u4.x   = subgroupClusteredXor(data[0].u4.x, 1);

+    data[invocation].u4.xy  = subgroupClusteredXor(data[1].u4.xy, 1);

+    data[invocation].u4.xyz = subgroupClusteredXor(data[2].u4.xyz, 1);

+    data[invocation].u4     = subgroupClusteredXor(data[3].u4, 1);

+

+    data[invocation].i4.x   =   int(subgroupClusteredXor(data[0].i4.x < 0, 1));

+    data[invocation].i4.xy  = ivec2(subgroupClusteredXor(lessThan(data[1].i4.xy, ivec2(0)), 1));

+    data[invocation].i4.xyz = ivec3(subgroupClusteredXor(lessThan(data[1].i4.xyz, ivec3(0)), 1));

+    data[invocation].i4     = ivec4(subgroupClusteredXor(lessThan(data[1].i4, ivec4(0)), 1));

+}

diff --git a/Test/spv.subgroupClusteredNeg.comp b/Test/spv.subgroupClusteredNeg.comp
new file mode 100644
index 0000000..ec15413
--- /dev/null
+++ b/Test/spv.subgroupClusteredNeg.comp
@@ -0,0 +1,39 @@
+#version 450

+

+#extension GL_KHR_shader_subgroup_clustered: enable

+

+layout (local_size_x = 8) in;

+

+layout(binding = 0) buffer Buffers

+{

+    vec4  f4;

+    ivec4 i4;

+    uvec4 u4;

+    dvec4 d4;

+} data[4];

+

+void main()

+{

+    int a = 1;

+    const int aConst = 1;

+

+    uint invocation = (gl_SubgroupInvocationID + gl_SubgroupSize) % 4;

+

+    data[invocation].f4.xy  = subgroupClusteredAdd(data[1].f4.xy, 0);          // ERROR, less than 1

+

+    data[invocation].f4.x   = subgroupClusteredMul(data[0].f4.x, 3);           // ERROR, not a power of 2

+

+    data[invocation].i4.xy  = subgroupClusteredMin(data[1].i4.xy, 8);

+    data[invocation].i4.xyz = subgroupClusteredMin(data[2].i4.xyz, 6);         // ERROR, not a power of 2

+

+    data[invocation].f4.x   = subgroupClusteredMax(data[0].f4.x, -1);          // ERROR, less than 1

+

+    data[invocation].i4     = subgroupClusteredAnd(data[3].i4, -3);            // ERROR, less than 1

+

+    data[invocation].i4.x   = subgroupClusteredOr(data[0].i4.x, a);            // ERROR, not constant

+    data[invocation].i4.xy  = subgroupClusteredOr(data[1].i4.xy, aConst);

+

+    data[invocation].i4.x   = subgroupClusteredXor(data[0].i4.x, 1 + a);       // ERROR, not constant

+    data[invocation].i4.xy  = subgroupClusteredXor(data[1].i4.xy, aConst + a); // ERROR, not constant

+    data[invocation].i4.xyz = subgroupClusteredXor(data[2].i4.xyz, 1 + aConst);

+}

diff --git a/Test/spv.subgroupPartitioned.comp b/Test/spv.subgroupPartitioned.comp
new file mode 100644
index 0000000..604833e
--- /dev/null
+++ b/Test/spv.subgroupPartitioned.comp
@@ -0,0 +1,420 @@
+#version 450

+

+#extension GL_NV_shader_subgroup_partitioned: enable

+

+layout (local_size_x = 8) in;

+

+layout(binding = 0) buffer Buffers

+{

+    vec4  f4;

+    ivec4 i4;

+    uvec4 u4;

+    dvec4 d4;

+} data[4];

+

+void main()

+{

+    uint invocation = (gl_SubgroupInvocationID + gl_SubgroupSize) % 4;

+

+    uvec4 ballot = subgroupPartitionNV(invocation);

+

+    data[invocation].u4 = subgroupPartitionNV(data[0].f4.x);

+    data[invocation].u4 = subgroupPartitionNV(data[0].f4.xy);

+    data[invocation].u4 = subgroupPartitionNV(data[0].f4.xyz);

+    data[invocation].u4 = subgroupPartitionNV(data[0].f4);

+

+    data[invocation].u4 = subgroupPartitionNV(data[0].i4.x);

+    data[invocation].u4 = subgroupPartitionNV(data[0].i4.xy);

+    data[invocation].u4 = subgroupPartitionNV(data[0].i4.xyz);

+    data[invocation].u4 = subgroupPartitionNV(data[0].i4);

+

+    data[invocation].u4 = subgroupPartitionNV(data[0].u4.x);

+    data[invocation].u4 = subgroupPartitionNV(data[0].u4.xy);

+    data[invocation].u4 = subgroupPartitionNV(data[0].u4.xyz);

+    data[invocation].u4 = subgroupPartitionNV(data[0].u4);

+

+    data[invocation].u4 = subgroupPartitionNV(data[0].d4.x);

+    data[invocation].u4 = subgroupPartitionNV(data[0].d4.xy);

+    data[invocation].u4 = subgroupPartitionNV(data[0].d4.xyz);

+    data[invocation].u4 = subgroupPartitionNV(data[0].d4);

+

+    data[invocation].u4 = subgroupPartitionNV(bool(data[0].i4.x));

+    data[invocation].u4 = subgroupPartitionNV(bvec2(data[0].i4.xy));

+    data[invocation].u4 = subgroupPartitionNV(bvec3(data[0].i4.xyz));

+    data[invocation].u4 = subgroupPartitionNV(bvec4(data[0].i4));

+

+    data[invocation].f4.x   = subgroupPartitionedAddNV(data[0].f4.x, ballot);

+    data[invocation].f4.xy  = subgroupPartitionedAddNV(data[1].f4.xy, ballot);

+    data[invocation].f4.xyz = subgroupPartitionedAddNV(data[2].f4.xyz, ballot);

+    data[invocation].f4     = subgroupPartitionedAddNV(data[3].f4, ballot);

+

+    data[invocation].i4.x   = subgroupPartitionedAddNV(data[0].i4.x, ballot);

+    data[invocation].i4.xy  = subgroupPartitionedAddNV(data[1].i4.xy, ballot);

+    data[invocation].i4.xyz = subgroupPartitionedAddNV(data[2].i4.xyz, ballot);

+    data[invocation].i4     = subgroupPartitionedAddNV(data[3].i4, ballot);

+

+    data[invocation].u4.x   = subgroupPartitionedAddNV(data[0].u4.x, ballot);

+    data[invocation].u4.xy  = subgroupPartitionedAddNV(data[1].u4.xy, ballot);

+    data[invocation].u4.xyz = subgroupPartitionedAddNV(data[2].u4.xyz, ballot);

+    data[invocation].u4     = subgroupPartitionedAddNV(data[3].u4, ballot);

+

+    data[invocation].d4.x   = subgroupPartitionedAddNV(data[0].d4.x, ballot);

+    data[invocation].d4.xy  = subgroupPartitionedAddNV(data[1].d4.xy, ballot);

+    data[invocation].d4.xyz = subgroupPartitionedAddNV(data[2].d4.xyz, ballot);

+    data[invocation].d4     = subgroupPartitionedAddNV(data[3].d4, ballot);

+

+    data[invocation].f4.x   = subgroupPartitionedMulNV(data[0].f4.x, ballot);

+    data[invocation].f4.xy  = subgroupPartitionedMulNV(data[1].f4.xy, ballot);

+    data[invocation].f4.xyz = subgroupPartitionedMulNV(data[2].f4.xyz, ballot);

+    data[invocation].f4     = subgroupPartitionedMulNV(data[3].f4, ballot);

+

+    data[invocation].i4.x   = subgroupPartitionedMulNV(data[0].i4.x, ballot);

+    data[invocation].i4.xy  = subgroupPartitionedMulNV(data[1].i4.xy, ballot);

+    data[invocation].i4.xyz = subgroupPartitionedMulNV(data[2].i4.xyz, ballot);

+    data[invocation].i4     = subgroupPartitionedMulNV(data[3].i4, ballot);

+

+    data[invocation].u4.x   = subgroupPartitionedMulNV(data[0].u4.x, ballot);

+    data[invocation].u4.xy  = subgroupPartitionedMulNV(data[1].u4.xy, ballot);

+    data[invocation].u4.xyz = subgroupPartitionedMulNV(data[2].u4.xyz, ballot);

+    data[invocation].u4     = subgroupPartitionedMulNV(data[3].u4, ballot);

+

+    data[invocation].d4.x   = subgroupPartitionedMulNV(data[0].d4.x, ballot);

+    data[invocation].d4.xy  = subgroupPartitionedMulNV(data[1].d4.xy, ballot);

+    data[invocation].d4.xyz = subgroupPartitionedMulNV(data[2].d4.xyz, ballot);

+    data[invocation].d4     = subgroupPartitionedMulNV(data[3].d4, ballot);

+

+    data[invocation].f4.x   = subgroupPartitionedMinNV(data[0].f4.x, ballot);

+    data[invocation].f4.xy  = subgroupPartitionedMinNV(data[1].f4.xy, ballot);

+    data[invocation].f4.xyz = subgroupPartitionedMinNV(data[2].f4.xyz, ballot);

+    data[invocation].f4     = subgroupPartitionedMinNV(data[3].f4, ballot);

+

+    data[invocation].i4.x   = subgroupPartitionedMinNV(data[0].i4.x, ballot);

+    data[invocation].i4.xy  = subgroupPartitionedMinNV(data[1].i4.xy, ballot);

+    data[invocation].i4.xyz = subgroupPartitionedMinNV(data[2].i4.xyz, ballot);

+    data[invocation].i4     = subgroupPartitionedMinNV(data[3].i4, ballot);

+

+    data[invocation].u4.x   = subgroupPartitionedMinNV(data[0].u4.x, ballot);

+    data[invocation].u4.xy  = subgroupPartitionedMinNV(data[1].u4.xy, ballot);

+    data[invocation].u4.xyz = subgroupPartitionedMinNV(data[2].u4.xyz, ballot);

+    data[invocation].u4     = subgroupPartitionedMinNV(data[3].u4, ballot);

+

+    data[invocation].d4.x   = subgroupPartitionedMinNV(data[0].d4.x, ballot);

+    data[invocation].d4.xy  = subgroupPartitionedMinNV(data[1].d4.xy, ballot);

+    data[invocation].d4.xyz = subgroupPartitionedMinNV(data[2].d4.xyz, ballot);

+    data[invocation].d4     = subgroupPartitionedMinNV(data[3].d4, ballot);

+

+    data[invocation].f4.x   = subgroupPartitionedMaxNV(data[0].f4.x, ballot);

+    data[invocation].f4.xy  = subgroupPartitionedMaxNV(data[1].f4.xy, ballot);

+    data[invocation].f4.xyz = subgroupPartitionedMaxNV(data[2].f4.xyz, ballot);

+    data[invocation].f4     = subgroupPartitionedMaxNV(data[3].f4, ballot);

+

+    data[invocation].i4.x   = subgroupPartitionedMaxNV(data[0].i4.x, ballot);

+    data[invocation].i4.xy  = subgroupPartitionedMaxNV(data[1].i4.xy, ballot);

+    data[invocation].i4.xyz = subgroupPartitionedMaxNV(data[2].i4.xyz, ballot);

+    data[invocation].i4     = subgroupPartitionedMaxNV(data[3].i4, ballot);

+

+    data[invocation].u4.x   = subgroupPartitionedMaxNV(data[0].u4.x, ballot);

+    data[invocation].u4.xy  = subgroupPartitionedMaxNV(data[1].u4.xy, ballot);

+    data[invocation].u4.xyz = subgroupPartitionedMaxNV(data[2].u4.xyz, ballot);

+    data[invocation].u4     = subgroupPartitionedMaxNV(data[3].u4, ballot);

+

+    data[invocation].d4.x   = subgroupPartitionedMaxNV(data[0].d4.x, ballot);

+    data[invocation].d4.xy  = subgroupPartitionedMaxNV(data[1].d4.xy, ballot);

+    data[invocation].d4.xyz = subgroupPartitionedMaxNV(data[2].d4.xyz, ballot);

+    data[invocation].d4     = subgroupPartitionedMaxNV(data[3].d4, ballot);

+

+    data[invocation].i4.x   = subgroupPartitionedAndNV(data[0].i4.x, ballot);

+    data[invocation].i4.xy  = subgroupPartitionedAndNV(data[1].i4.xy, ballot);

+    data[invocation].i4.xyz = subgroupPartitionedAndNV(data[2].i4.xyz, ballot);

+    data[invocation].i4     = subgroupPartitionedAndNV(data[3].i4, ballot);

+

+    data[invocation].u4.x   = subgroupPartitionedAndNV(data[0].u4.x, ballot);

+    data[invocation].u4.xy  = subgroupPartitionedAndNV(data[1].u4.xy, ballot);

+    data[invocation].u4.xyz = subgroupPartitionedAndNV(data[2].u4.xyz, ballot);

+    data[invocation].u4     = subgroupPartitionedAndNV(data[3].u4, ballot);

+

+    data[invocation].i4.x   =   int(subgroupPartitionedAndNV(data[0].i4.x < 0, ballot));

+    data[invocation].i4.xy  = ivec2(subgroupPartitionedAndNV(lessThan(data[1].i4.xy, ivec2(0)), ballot));

+    data[invocation].i4.xyz = ivec3(subgroupPartitionedAndNV(lessThan(data[1].i4.xyz, ivec3(0)), ballot));

+    data[invocation].i4     = ivec4(subgroupPartitionedAndNV(lessThan(data[1].i4, ivec4(0)), ballot));

+

+    data[invocation].i4.x   = subgroupPartitionedOrNV(data[0].i4.x, ballot);

+    data[invocation].i4.xy  = subgroupPartitionedOrNV(data[1].i4.xy, ballot);

+    data[invocation].i4.xyz = subgroupPartitionedOrNV(data[2].i4.xyz, ballot);

+    data[invocation].i4     = subgroupPartitionedOrNV(data[3].i4, ballot);

+

+    data[invocation].u4.x   = subgroupPartitionedOrNV(data[0].u4.x, ballot);

+    data[invocation].u4.xy  = subgroupPartitionedOrNV(data[1].u4.xy, ballot);

+    data[invocation].u4.xyz = subgroupPartitionedOrNV(data[2].u4.xyz, ballot);

+    data[invocation].u4     = subgroupPartitionedOrNV(data[3].u4, ballot);

+

+    data[invocation].i4.x   =   int(subgroupPartitionedOrNV(data[0].i4.x < 0, ballot));

+    data[invocation].i4.xy  = ivec2(subgroupPartitionedOrNV(lessThan(data[1].i4.xy, ivec2(0)), ballot));

+    data[invocation].i4.xyz = ivec3(subgroupPartitionedOrNV(lessThan(data[1].i4.xyz, ivec3(0)), ballot));

+    data[invocation].i4     = ivec4(subgroupPartitionedOrNV(lessThan(data[1].i4, ivec4(0)), ballot));

+

+    data[invocation].i4.x   = subgroupPartitionedXorNV(data[0].i4.x, ballot);

+    data[invocation].i4.xy  = subgroupPartitionedXorNV(data[1].i4.xy, ballot);

+    data[invocation].i4.xyz = subgroupPartitionedXorNV(data[2].i4.xyz, ballot);

+    data[invocation].i4     = subgroupPartitionedXorNV(data[3].i4, ballot);

+

+    data[invocation].u4.x   = subgroupPartitionedXorNV(data[0].u4.x, ballot);

+    data[invocation].u4.xy  = subgroupPartitionedXorNV(data[1].u4.xy, ballot);

+    data[invocation].u4.xyz = subgroupPartitionedXorNV(data[2].u4.xyz, ballot);

+    data[invocation].u4     = subgroupPartitionedXorNV(data[3].u4, ballot);

+

+    data[invocation].i4.x   =   int(subgroupPartitionedXorNV(data[0].i4.x < 0, ballot));

+    data[invocation].i4.xy  = ivec2(subgroupPartitionedXorNV(lessThan(data[1].i4.xy, ivec2(0)), ballot));

+    data[invocation].i4.xyz = ivec3(subgroupPartitionedXorNV(lessThan(data[1].i4.xyz, ivec3(0)), ballot));

+    data[invocation].i4     = ivec4(subgroupPartitionedXorNV(lessThan(data[1].i4, ivec4(0)), ballot));

+

+    data[invocation].f4.x   = subgroupPartitionedInclusiveAddNV(data[0].f4.x, ballot);

+    data[invocation].f4.xy  = subgroupPartitionedInclusiveAddNV(data[1].f4.xy, ballot);

+    data[invocation].f4.xyz = subgroupPartitionedInclusiveAddNV(data[2].f4.xyz, ballot);

+    data[invocation].f4     = subgroupPartitionedInclusiveAddNV(data[3].f4, ballot);

+

+    data[invocation].i4.x   = subgroupPartitionedInclusiveAddNV(data[0].i4.x, ballot);

+    data[invocation].i4.xy  = subgroupPartitionedInclusiveAddNV(data[1].i4.xy, ballot);

+    data[invocation].i4.xyz = subgroupPartitionedInclusiveAddNV(data[2].i4.xyz, ballot);

+    data[invocation].i4     = subgroupPartitionedInclusiveAddNV(data[3].i4, ballot);

+

+    data[invocation].u4.x   = subgroupPartitionedInclusiveAddNV(data[0].u4.x, ballot);

+    data[invocation].u4.xy  = subgroupPartitionedInclusiveAddNV(data[1].u4.xy, ballot);

+    data[invocation].u4.xyz = subgroupPartitionedInclusiveAddNV(data[2].u4.xyz, ballot);

+    data[invocation].u4     = subgroupPartitionedInclusiveAddNV(data[3].u4, ballot);

+

+    data[invocation].d4.x   = subgroupPartitionedInclusiveAddNV(data[0].d4.x, ballot);

+    data[invocation].d4.xy  = subgroupPartitionedInclusiveAddNV(data[1].d4.xy, ballot);

+    data[invocation].d4.xyz = subgroupPartitionedInclusiveAddNV(data[2].d4.xyz, ballot);

+    data[invocation].d4     = subgroupPartitionedInclusiveAddNV(data[3].d4, ballot);

+

+    data[invocation].f4.x   = subgroupPartitionedInclusiveMulNV(data[0].f4.x, ballot);

+    data[invocation].f4.xy  = subgroupPartitionedInclusiveMulNV(data[1].f4.xy, ballot);

+    data[invocation].f4.xyz = subgroupPartitionedInclusiveMulNV(data[2].f4.xyz, ballot);

+    data[invocation].f4     = subgroupPartitionedInclusiveMulNV(data[3].f4, ballot);

+

+    data[invocation].i4.x   = subgroupPartitionedInclusiveMulNV(data[0].i4.x, ballot);

+    data[invocation].i4.xy  = subgroupPartitionedInclusiveMulNV(data[1].i4.xy, ballot);

+    data[invocation].i4.xyz = subgroupPartitionedInclusiveMulNV(data[2].i4.xyz, ballot);

+    data[invocation].i4     = subgroupPartitionedInclusiveMulNV(data[3].i4, ballot);

+

+    data[invocation].u4.x   = subgroupPartitionedInclusiveMulNV(data[0].u4.x, ballot);

+    data[invocation].u4.xy  = subgroupPartitionedInclusiveMulNV(data[1].u4.xy, ballot);

+    data[invocation].u4.xyz = subgroupPartitionedInclusiveMulNV(data[2].u4.xyz, ballot);

+    data[invocation].u4     = subgroupPartitionedInclusiveMulNV(data[3].u4, ballot);

+

+    data[invocation].d4.x   = subgroupPartitionedInclusiveMulNV(data[0].d4.x, ballot);

+    data[invocation].d4.xy  = subgroupPartitionedInclusiveMulNV(data[1].d4.xy, ballot);

+    data[invocation].d4.xyz = subgroupPartitionedInclusiveMulNV(data[2].d4.xyz, ballot);

+    data[invocation].d4     = subgroupPartitionedInclusiveMulNV(data[3].d4, ballot);

+

+    data[invocation].f4.x   = subgroupPartitionedInclusiveMinNV(data[0].f4.x, ballot);

+    data[invocation].f4.xy  = subgroupPartitionedInclusiveMinNV(data[1].f4.xy, ballot);

+    data[invocation].f4.xyz = subgroupPartitionedInclusiveMinNV(data[2].f4.xyz, ballot);

+    data[invocation].f4     = subgroupPartitionedInclusiveMinNV(data[3].f4, ballot);

+

+    data[invocation].i4.x   = subgroupPartitionedInclusiveMinNV(data[0].i4.x, ballot);

+    data[invocation].i4.xy  = subgroupPartitionedInclusiveMinNV(data[1].i4.xy, ballot);

+    data[invocation].i4.xyz = subgroupPartitionedInclusiveMinNV(data[2].i4.xyz, ballot);

+    data[invocation].i4     = subgroupPartitionedInclusiveMinNV(data[3].i4, ballot);

+

+    data[invocation].u4.x   = subgroupPartitionedInclusiveMinNV(data[0].u4.x, ballot);

+    data[invocation].u4.xy  = subgroupPartitionedInclusiveMinNV(data[1].u4.xy, ballot);

+    data[invocation].u4.xyz = subgroupPartitionedInclusiveMinNV(data[2].u4.xyz, ballot);

+    data[invocation].u4     = subgroupPartitionedInclusiveMinNV(data[3].u4, ballot);

+

+    data[invocation].d4.x   = subgroupPartitionedInclusiveMinNV(data[0].d4.x, ballot);

+    data[invocation].d4.xy  = subgroupPartitionedInclusiveMinNV(data[1].d4.xy, ballot);

+    data[invocation].d4.xyz = subgroupPartitionedInclusiveMinNV(data[2].d4.xyz, ballot);

+    data[invocation].d4     = subgroupPartitionedInclusiveMinNV(data[3].d4, ballot);

+

+    data[invocation].f4.x   = subgroupPartitionedInclusiveMaxNV(data[0].f4.x, ballot);

+    data[invocation].f4.xy  = subgroupPartitionedInclusiveMaxNV(data[1].f4.xy, ballot);

+    data[invocation].f4.xyz = subgroupPartitionedInclusiveMaxNV(data[2].f4.xyz, ballot);

+    data[invocation].f4     = subgroupPartitionedInclusiveMaxNV(data[3].f4, ballot);

+

+    data[invocation].i4.x   = subgroupPartitionedInclusiveMaxNV(data[0].i4.x, ballot);

+    data[invocation].i4.xy  = subgroupPartitionedInclusiveMaxNV(data[1].i4.xy, ballot);

+    data[invocation].i4.xyz = subgroupPartitionedInclusiveMaxNV(data[2].i4.xyz, ballot);

+    data[invocation].i4     = subgroupPartitionedInclusiveMaxNV(data[3].i4, ballot);

+

+    data[invocation].u4.x   = subgroupPartitionedInclusiveMaxNV(data[0].u4.x, ballot);

+    data[invocation].u4.xy  = subgroupPartitionedInclusiveMaxNV(data[1].u4.xy, ballot);

+    data[invocation].u4.xyz = subgroupPartitionedInclusiveMaxNV(data[2].u4.xyz, ballot);

+    data[invocation].u4     = subgroupPartitionedInclusiveMaxNV(data[3].u4, ballot);

+

+    data[invocation].d4.x   = subgroupPartitionedInclusiveMaxNV(data[0].d4.x, ballot);

+    data[invocation].d4.xy  = subgroupPartitionedInclusiveMaxNV(data[1].d4.xy, ballot);

+    data[invocation].d4.xyz = subgroupPartitionedInclusiveMaxNV(data[2].d4.xyz, ballot);

+    data[invocation].d4     = subgroupPartitionedInclusiveMaxNV(data[3].d4, ballot);

+

+    data[invocation].i4.x   = subgroupPartitionedInclusiveAndNV(data[0].i4.x, ballot);

+    data[invocation].i4.xy  = subgroupPartitionedInclusiveAndNV(data[1].i4.xy, ballot);

+    data[invocation].i4.xyz = subgroupPartitionedInclusiveAndNV(data[2].i4.xyz, ballot);

+    data[invocation].i4     = subgroupPartitionedInclusiveAndNV(data[3].i4, ballot);

+

+    data[invocation].u4.x   = subgroupPartitionedInclusiveAndNV(data[0].u4.x, ballot);

+    data[invocation].u4.xy  = subgroupPartitionedInclusiveAndNV(data[1].u4.xy, ballot);

+    data[invocation].u4.xyz = subgroupPartitionedInclusiveAndNV(data[2].u4.xyz, ballot);

+    data[invocation].u4     = subgroupPartitionedInclusiveAndNV(data[3].u4, ballot);

+

+    data[invocation].i4.x   =   int(subgroupPartitionedInclusiveAndNV(data[0].i4.x < 0, ballot));

+    data[invocation].i4.xy  = ivec2(subgroupPartitionedInclusiveAndNV(lessThan(data[1].i4.xy, ivec2(0)), ballot));

+    data[invocation].i4.xyz = ivec3(subgroupPartitionedInclusiveAndNV(lessThan(data[1].i4.xyz, ivec3(0)), ballot));

+    data[invocation].i4     = ivec4(subgroupPartitionedInclusiveAndNV(lessThan(data[1].i4, ivec4(0)), ballot));

+

+    data[invocation].i4.x   = subgroupPartitionedInclusiveOrNV(data[0].i4.x, ballot);

+    data[invocation].i4.xy  = subgroupPartitionedInclusiveOrNV(data[1].i4.xy, ballot);

+    data[invocation].i4.xyz = subgroupPartitionedInclusiveOrNV(data[2].i4.xyz, ballot);

+    data[invocation].i4     = subgroupPartitionedInclusiveOrNV(data[3].i4, ballot);

+

+    data[invocation].u4.x   = subgroupPartitionedInclusiveOrNV(data[0].u4.x, ballot);

+    data[invocation].u4.xy  = subgroupPartitionedInclusiveOrNV(data[1].u4.xy, ballot);

+    data[invocation].u4.xyz = subgroupPartitionedInclusiveOrNV(data[2].u4.xyz, ballot);

+    data[invocation].u4     = subgroupPartitionedInclusiveOrNV(data[3].u4, ballot);

+

+    data[invocation].i4.x   =   int(subgroupPartitionedInclusiveOrNV(data[0].i4.x < 0, ballot));

+    data[invocation].i4.xy  = ivec2(subgroupPartitionedInclusiveOrNV(lessThan(data[1].i4.xy, ivec2(0)), ballot));

+    data[invocation].i4.xyz = ivec3(subgroupPartitionedInclusiveOrNV(lessThan(data[1].i4.xyz, ivec3(0)), ballot));

+    data[invocation].i4     = ivec4(subgroupPartitionedInclusiveOrNV(lessThan(data[1].i4, ivec4(0)), ballot));

+

+    data[invocation].i4.x   = subgroupPartitionedInclusiveXorNV(data[0].i4.x, ballot);

+    data[invocation].i4.xy  = subgroupPartitionedInclusiveXorNV(data[1].i4.xy, ballot);

+    data[invocation].i4.xyz = subgroupPartitionedInclusiveXorNV(data[2].i4.xyz, ballot);

+    data[invocation].i4     = subgroupPartitionedInclusiveXorNV(data[3].i4, ballot);

+

+    data[invocation].u4.x   = subgroupPartitionedInclusiveXorNV(data[0].u4.x, ballot);

+    data[invocation].u4.xy  = subgroupPartitionedInclusiveXorNV(data[1].u4.xy, ballot);

+    data[invocation].u4.xyz = subgroupPartitionedInclusiveXorNV(data[2].u4.xyz, ballot);

+    data[invocation].u4     = subgroupPartitionedInclusiveXorNV(data[3].u4, ballot);

+

+    data[invocation].i4.x   =   int(subgroupPartitionedInclusiveXorNV(data[0].i4.x < 0, ballot));

+    data[invocation].i4.xy  = ivec2(subgroupPartitionedInclusiveXorNV(lessThan(data[1].i4.xy, ivec2(0)), ballot));

+    data[invocation].i4.xyz = ivec3(subgroupPartitionedInclusiveXorNV(lessThan(data[1].i4.xyz, ivec3(0)), ballot));

+    data[invocation].i4     = ivec4(subgroupPartitionedInclusiveXorNV(lessThan(data[1].i4, ivec4(0)), ballot));

+

+    data[invocation].f4.x   = subgroupPartitionedExclusiveAddNV(data[0].f4.x, ballot);

+    data[invocation].f4.xy  = subgroupPartitionedExclusiveAddNV(data[1].f4.xy, ballot);

+    data[invocation].f4.xyz = subgroupPartitionedExclusiveAddNV(data[2].f4.xyz, ballot);

+    data[invocation].f4     = subgroupPartitionedExclusiveAddNV(data[3].f4, ballot);

+

+    data[invocation].i4.x   = subgroupPartitionedExclusiveAddNV(data[0].i4.x, ballot);

+    data[invocation].i4.xy  = subgroupPartitionedExclusiveAddNV(data[1].i4.xy, ballot);

+    data[invocation].i4.xyz = subgroupPartitionedExclusiveAddNV(data[2].i4.xyz, ballot);

+    data[invocation].i4     = subgroupPartitionedExclusiveAddNV(data[3].i4, ballot);

+

+    data[invocation].u4.x   = subgroupPartitionedExclusiveAddNV(data[0].u4.x, ballot);

+    data[invocation].u4.xy  = subgroupPartitionedExclusiveAddNV(data[1].u4.xy, ballot);

+    data[invocation].u4.xyz = subgroupPartitionedExclusiveAddNV(data[2].u4.xyz, ballot);

+    data[invocation].u4     = subgroupPartitionedExclusiveAddNV(data[3].u4, ballot);

+

+    data[invocation].d4.x   = subgroupPartitionedExclusiveAddNV(data[0].d4.x, ballot);

+    data[invocation].d4.xy  = subgroupPartitionedExclusiveAddNV(data[1].d4.xy, ballot);

+    data[invocation].d4.xyz = subgroupPartitionedExclusiveAddNV(data[2].d4.xyz, ballot);

+    data[invocation].d4     = subgroupPartitionedExclusiveAddNV(data[3].d4, ballot);

+

+    data[invocation].f4.x   = subgroupPartitionedExclusiveMulNV(data[0].f4.x, ballot);

+    data[invocation].f4.xy  = subgroupPartitionedExclusiveMulNV(data[1].f4.xy, ballot);

+    data[invocation].f4.xyz = subgroupPartitionedExclusiveMulNV(data[2].f4.xyz, ballot);

+    data[invocation].f4     = subgroupPartitionedExclusiveMulNV(data[3].f4, ballot);

+

+    data[invocation].i4.x   = subgroupPartitionedExclusiveMulNV(data[0].i4.x, ballot);

+    data[invocation].i4.xy  = subgroupPartitionedExclusiveMulNV(data[1].i4.xy, ballot);

+    data[invocation].i4.xyz = subgroupPartitionedExclusiveMulNV(data[2].i4.xyz, ballot);

+    data[invocation].i4     = subgroupPartitionedExclusiveMulNV(data[3].i4, ballot);

+

+    data[invocation].u4.x   = subgroupPartitionedExclusiveMulNV(data[0].u4.x, ballot);

+    data[invocation].u4.xy  = subgroupPartitionedExclusiveMulNV(data[1].u4.xy, ballot);

+    data[invocation].u4.xyz = subgroupPartitionedExclusiveMulNV(data[2].u4.xyz, ballot);

+    data[invocation].u4     = subgroupPartitionedExclusiveMulNV(data[3].u4, ballot);

+

+    data[invocation].d4.x   = subgroupPartitionedExclusiveMulNV(data[0].d4.x, ballot);

+    data[invocation].d4.xy  = subgroupPartitionedExclusiveMulNV(data[1].d4.xy, ballot);

+    data[invocation].d4.xyz = subgroupPartitionedExclusiveMulNV(data[2].d4.xyz, ballot);

+    data[invocation].d4     = subgroupPartitionedExclusiveMulNV(data[3].d4, ballot);

+

+    data[invocation].f4.x   = subgroupPartitionedExclusiveMinNV(data[0].f4.x, ballot);

+    data[invocation].f4.xy  = subgroupPartitionedExclusiveMinNV(data[1].f4.xy, ballot);

+    data[invocation].f4.xyz = subgroupPartitionedExclusiveMinNV(data[2].f4.xyz, ballot);

+    data[invocation].f4     = subgroupPartitionedExclusiveMinNV(data[3].f4, ballot);

+

+    data[invocation].i4.x   = subgroupPartitionedExclusiveMinNV(data[0].i4.x, ballot);

+    data[invocation].i4.xy  = subgroupPartitionedExclusiveMinNV(data[1].i4.xy, ballot);

+    data[invocation].i4.xyz = subgroupPartitionedExclusiveMinNV(data[2].i4.xyz, ballot);

+    data[invocation].i4     = subgroupPartitionedExclusiveMinNV(data[3].i4, ballot);

+

+    data[invocation].u4.x   = subgroupPartitionedExclusiveMinNV(data[0].u4.x, ballot);

+    data[invocation].u4.xy  = subgroupPartitionedExclusiveMinNV(data[1].u4.xy, ballot);

+    data[invocation].u4.xyz = subgroupPartitionedExclusiveMinNV(data[2].u4.xyz, ballot);

+    data[invocation].u4     = subgroupPartitionedExclusiveMinNV(data[3].u4, ballot);

+

+    data[invocation].d4.x   = subgroupPartitionedExclusiveMinNV(data[0].d4.x, ballot);

+    data[invocation].d4.xy  = subgroupPartitionedExclusiveMinNV(data[1].d4.xy, ballot);

+    data[invocation].d4.xyz = subgroupPartitionedExclusiveMinNV(data[2].d4.xyz, ballot);

+    data[invocation].d4     = subgroupPartitionedExclusiveMinNV(data[3].d4, ballot);

+

+    data[invocation].f4.x   = subgroupPartitionedExclusiveMaxNV(data[0].f4.x, ballot);

+    data[invocation].f4.xy  = subgroupPartitionedExclusiveMaxNV(data[1].f4.xy, ballot);

+    data[invocation].f4.xyz = subgroupPartitionedExclusiveMaxNV(data[2].f4.xyz, ballot);

+    data[invocation].f4     = subgroupPartitionedExclusiveMaxNV(data[3].f4, ballot);

+

+    data[invocation].i4.x   = subgroupPartitionedExclusiveMaxNV(data[0].i4.x, ballot);

+    data[invocation].i4.xy  = subgroupPartitionedExclusiveMaxNV(data[1].i4.xy, ballot);

+    data[invocation].i4.xyz = subgroupPartitionedExclusiveMaxNV(data[2].i4.xyz, ballot);

+    data[invocation].i4     = subgroupPartitionedExclusiveMaxNV(data[3].i4, ballot);

+

+    data[invocation].u4.x   = subgroupPartitionedExclusiveMaxNV(data[0].u4.x, ballot);

+    data[invocation].u4.xy  = subgroupPartitionedExclusiveMaxNV(data[1].u4.xy, ballot);

+    data[invocation].u4.xyz = subgroupPartitionedExclusiveMaxNV(data[2].u4.xyz, ballot);

+    data[invocation].u4     = subgroupPartitionedExclusiveMaxNV(data[3].u4, ballot);

+

+    data[invocation].d4.x   = subgroupPartitionedExclusiveMaxNV(data[0].d4.x, ballot);

+    data[invocation].d4.xy  = subgroupPartitionedExclusiveMaxNV(data[1].d4.xy, ballot);

+    data[invocation].d4.xyz = subgroupPartitionedExclusiveMaxNV(data[2].d4.xyz, ballot);

+    data[invocation].d4     = subgroupPartitionedExclusiveMaxNV(data[3].d4, ballot);

+

+    data[invocation].i4.x   = subgroupPartitionedExclusiveAndNV(data[0].i4.x, ballot);

+    data[invocation].i4.xy  = subgroupPartitionedExclusiveAndNV(data[1].i4.xy, ballot);

+    data[invocation].i4.xyz = subgroupPartitionedExclusiveAndNV(data[2].i4.xyz, ballot);

+    data[invocation].i4     = subgroupPartitionedExclusiveAndNV(data[3].i4, ballot);

+

+    data[invocation].u4.x   = subgroupPartitionedExclusiveAndNV(data[0].u4.x, ballot);

+    data[invocation].u4.xy  = subgroupPartitionedExclusiveAndNV(data[1].u4.xy, ballot);

+    data[invocation].u4.xyz = subgroupPartitionedExclusiveAndNV(data[2].u4.xyz, ballot);

+    data[invocation].u4     = subgroupPartitionedExclusiveAndNV(data[3].u4, ballot);

+

+    data[invocation].i4.x   =   int(subgroupPartitionedExclusiveAndNV(data[0].i4.x < 0, ballot));

+    data[invocation].i4.xy  = ivec2(subgroupPartitionedExclusiveAndNV(lessThan(data[1].i4.xy, ivec2(0)), ballot));

+    data[invocation].i4.xyz = ivec3(subgroupPartitionedExclusiveAndNV(lessThan(data[1].i4.xyz, ivec3(0)), ballot));

+    data[invocation].i4     = ivec4(subgroupPartitionedExclusiveAndNV(lessThan(data[1].i4, ivec4(0)), ballot));

+

+    data[invocation].i4.x   = subgroupPartitionedExclusiveOrNV(data[0].i4.x, ballot);

+    data[invocation].i4.xy  = subgroupPartitionedExclusiveOrNV(data[1].i4.xy, ballot);

+    data[invocation].i4.xyz = subgroupPartitionedExclusiveOrNV(data[2].i4.xyz, ballot);

+    data[invocation].i4     = subgroupPartitionedExclusiveOrNV(data[3].i4, ballot);

+

+    data[invocation].u4.x   = subgroupPartitionedExclusiveOrNV(data[0].u4.x, ballot);

+    data[invocation].u4.xy  = subgroupPartitionedExclusiveOrNV(data[1].u4.xy, ballot);

+    data[invocation].u4.xyz = subgroupPartitionedExclusiveOrNV(data[2].u4.xyz, ballot);

+    data[invocation].u4     = subgroupPartitionedExclusiveOrNV(data[3].u4, ballot);

+

+    data[invocation].i4.x   =   int(subgroupPartitionedExclusiveOrNV(data[0].i4.x < 0, ballot));

+    data[invocation].i4.xy  = ivec2(subgroupPartitionedExclusiveOrNV(lessThan(data[1].i4.xy, ivec2(0)), ballot));

+    data[invocation].i4.xyz = ivec3(subgroupPartitionedExclusiveOrNV(lessThan(data[1].i4.xyz, ivec3(0)), ballot));

+    data[invocation].i4     = ivec4(subgroupPartitionedExclusiveOrNV(lessThan(data[1].i4, ivec4(0)), ballot));

+

+    data[invocation].i4.x   = subgroupPartitionedExclusiveXorNV(data[0].i4.x, ballot);

+    data[invocation].i4.xy  = subgroupPartitionedExclusiveXorNV(data[1].i4.xy, ballot);

+    data[invocation].i4.xyz = subgroupPartitionedExclusiveXorNV(data[2].i4.xyz, ballot);

+    data[invocation].i4     = subgroupPartitionedExclusiveXorNV(data[3].i4, ballot);

+

+    data[invocation].u4.x   = subgroupPartitionedExclusiveXorNV(data[0].u4.x, ballot);

+    data[invocation].u4.xy  = subgroupPartitionedExclusiveXorNV(data[1].u4.xy, ballot);

+    data[invocation].u4.xyz = subgroupPartitionedExclusiveXorNV(data[2].u4.xyz, ballot);

+    data[invocation].u4     = subgroupPartitionedExclusiveXorNV(data[3].u4, ballot);

+

+    data[invocation].i4.x   =   int(subgroupPartitionedExclusiveXorNV(data[0].i4.x < 0, ballot));

+    data[invocation].i4.xy  = ivec2(subgroupPartitionedExclusiveXorNV(lessThan(data[1].i4.xy, ivec2(0)), ballot));

+    data[invocation].i4.xyz = ivec3(subgroupPartitionedExclusiveXorNV(lessThan(data[1].i4.xyz, ivec3(0)), ballot));

+    data[invocation].i4     = ivec4(subgroupPartitionedExclusiveXorNV(lessThan(data[1].i4, ivec4(0)), ballot));

+}

diff --git a/Test/spv.subgroupQuad.comp b/Test/spv.subgroupQuad.comp
new file mode 100644
index 0000000..223a7cd
--- /dev/null
+++ b/Test/spv.subgroupQuad.comp
@@ -0,0 +1,118 @@
+#version 450

+

+#extension GL_KHR_shader_subgroup_quad: enable

+

+layout (local_size_x = 8) in;

+

+layout(binding = 0) buffer Buffers

+{

+    vec4  f4;

+    ivec4 i4;

+    uvec4 u4;

+    dvec4 d4;

+} data[4];

+

+void main()

+{

+    uint invocation = (gl_SubgroupInvocationID + gl_SubgroupSize) % 4;

+

+    data[invocation].f4.x   = subgroupQuadBroadcast(data[0].f4.x, 1);

+    data[invocation].f4.xy  = subgroupQuadBroadcast(data[1].f4.xy, 1);

+    data[invocation].f4.xyz = subgroupQuadBroadcast(data[2].f4.xyz, 1);

+    data[invocation].f4     = subgroupQuadBroadcast(data[3].f4, 1);

+

+    data[invocation].i4.x   = subgroupQuadBroadcast(data[0].i4.x, 1);

+    data[invocation].i4.xy  = subgroupQuadBroadcast(data[1].i4.xy, 1);

+    data[invocation].i4.xyz = subgroupQuadBroadcast(data[2].i4.xyz, 1);

+    data[invocation].i4     = subgroupQuadBroadcast(data[3].i4, 1);

+

+    data[invocation].u4.x   = subgroupQuadBroadcast(data[0].u4.x, 1);

+    data[invocation].u4.xy  = subgroupQuadBroadcast(data[1].u4.xy, 1);

+    data[invocation].u4.xyz = subgroupQuadBroadcast(data[2].u4.xyz, 1);

+    data[invocation].u4     = subgroupQuadBroadcast(data[3].u4, 1);

+

+    data[invocation].d4.x   = subgroupQuadBroadcast(data[0].d4.x, 1);

+    data[invocation].d4.xy  = subgroupQuadBroadcast(data[1].d4.xy, 1);

+    data[invocation].d4.xyz = subgroupQuadBroadcast(data[2].d4.xyz, 1);

+    data[invocation].d4     = subgroupQuadBroadcast(data[3].d4, 1);

+

+    data[invocation].i4.x   =   int(subgroupQuadBroadcast(data[0].i4.x < 0, 1));

+    data[invocation].i4.xy  = ivec2(subgroupQuadBroadcast(lessThan(data[1].i4.xy, ivec2(0)), 1));

+    data[invocation].i4.xyz = ivec3(subgroupQuadBroadcast(lessThan(data[1].i4.xyz, ivec3(0)), 1));

+    data[invocation].i4     = ivec4(subgroupQuadBroadcast(lessThan(data[1].i4, ivec4(0)), 1));

+

+    data[invocation].f4.x   = subgroupQuadSwapHorizontal(data[0].f4.x);

+    data[invocation].f4.xy  = subgroupQuadSwapHorizontal(data[1].f4.xy);

+    data[invocation].f4.xyz = subgroupQuadSwapHorizontal(data[2].f4.xyz);

+    data[invocation].f4     = subgroupQuadSwapHorizontal(data[3].f4);

+

+    data[invocation].i4.x   = subgroupQuadSwapHorizontal(data[0].i4.x);

+    data[invocation].i4.xy  = subgroupQuadSwapHorizontal(data[1].i4.xy);

+    data[invocation].i4.xyz = subgroupQuadSwapHorizontal(data[2].i4.xyz);

+    data[invocation].i4     = subgroupQuadSwapHorizontal(data[3].i4);

+

+    data[invocation].u4.x   = subgroupQuadSwapHorizontal(data[0].u4.x);

+    data[invocation].u4.xy  = subgroupQuadSwapHorizontal(data[1].u4.xy);

+    data[invocation].u4.xyz = subgroupQuadSwapHorizontal(data[2].u4.xyz);

+    data[invocation].u4     = subgroupQuadSwapHorizontal(data[3].u4);

+

+    data[invocation].d4.x   = subgroupQuadSwapHorizontal(data[0].d4.x);

+    data[invocation].d4.xy  = subgroupQuadSwapHorizontal(data[1].d4.xy);

+    data[invocation].d4.xyz = subgroupQuadSwapHorizontal(data[2].d4.xyz);

+    data[invocation].d4     = subgroupQuadSwapHorizontal(data[3].d4);

+

+    data[invocation].i4.x   =   int(subgroupQuadSwapHorizontal(data[0].i4.x < 0));

+    data[invocation].i4.xy  = ivec2(subgroupQuadSwapHorizontal(lessThan(data[1].i4.xy, ivec2(0))));

+    data[invocation].i4.xyz = ivec3(subgroupQuadSwapHorizontal(lessThan(data[1].i4.xyz, ivec3(0))));

+    data[invocation].i4     = ivec4(subgroupQuadSwapHorizontal(lessThan(data[1].i4, ivec4(0))));

+

+    data[invocation].f4.x   = subgroupQuadSwapVertical(data[0].f4.x);

+    data[invocation].f4.xy  = subgroupQuadSwapVertical(data[1].f4.xy);

+    data[invocation].f4.xyz = subgroupQuadSwapVertical(data[2].f4.xyz);

+    data[invocation].f4     = subgroupQuadSwapVertical(data[3].f4);

+

+    data[invocation].i4.x   = subgroupQuadSwapVertical(data[0].i4.x);

+    data[invocation].i4.xy  = subgroupQuadSwapVertical(data[1].i4.xy);

+    data[invocation].i4.xyz = subgroupQuadSwapVertical(data[2].i4.xyz);

+    data[invocation].i4     = subgroupQuadSwapVertical(data[3].i4);

+

+    data[invocation].u4.x   = subgroupQuadSwapVertical(data[0].u4.x);

+    data[invocation].u4.xy  = subgroupQuadSwapVertical(data[1].u4.xy);

+    data[invocation].u4.xyz = subgroupQuadSwapVertical(data[2].u4.xyz);

+    data[invocation].u4     = subgroupQuadSwapVertical(data[3].u4);

+

+    data[invocation].d4.x   = subgroupQuadSwapVertical(data[0].d4.x);

+    data[invocation].d4.xy  = subgroupQuadSwapVertical(data[1].d4.xy);

+    data[invocation].d4.xyz = subgroupQuadSwapVertical(data[2].d4.xyz);

+    data[invocation].d4     = subgroupQuadSwapVertical(data[3].d4);

+

+    data[invocation].i4.x   =   int(subgroupQuadSwapVertical(data[0].i4.x < 0));

+    data[invocation].i4.xy  = ivec2(subgroupQuadSwapVertical(lessThan(data[1].i4.xy, ivec2(0))));

+    data[invocation].i4.xyz = ivec3(subgroupQuadSwapVertical(lessThan(data[1].i4.xyz, ivec3(0))));

+    data[invocation].i4     = ivec4(subgroupQuadSwapVertical(lessThan(data[1].i4, ivec4(0))));

+

+    data[invocation].f4.x   = subgroupQuadSwapDiagonal(data[0].f4.x);

+    data[invocation].f4.xy  = subgroupQuadSwapDiagonal(data[1].f4.xy);

+    data[invocation].f4.xyz = subgroupQuadSwapDiagonal(data[2].f4.xyz);

+    data[invocation].f4     = subgroupQuadSwapDiagonal(data[3].f4);

+

+    data[invocation].i4.x   = subgroupQuadSwapDiagonal(data[0].i4.x);

+    data[invocation].i4.xy  = subgroupQuadSwapDiagonal(data[1].i4.xy);

+    data[invocation].i4.xyz = subgroupQuadSwapDiagonal(data[2].i4.xyz);

+    data[invocation].i4     = subgroupQuadSwapDiagonal(data[3].i4);

+

+    data[invocation].u4.x   = subgroupQuadSwapDiagonal(data[0].u4.x);

+    data[invocation].u4.xy  = subgroupQuadSwapDiagonal(data[1].u4.xy);

+    data[invocation].u4.xyz = subgroupQuadSwapDiagonal(data[2].u4.xyz);

+    data[invocation].u4     = subgroupQuadSwapDiagonal(data[3].u4);

+

+    data[invocation].d4.x   = subgroupQuadSwapDiagonal(data[0].d4.x);

+    data[invocation].d4.xy  = subgroupQuadSwapDiagonal(data[1].d4.xy);

+    data[invocation].d4.xyz = subgroupQuadSwapDiagonal(data[2].d4.xyz);

+    data[invocation].d4     = subgroupQuadSwapDiagonal(data[3].d4);

+

+    data[invocation].i4.x   =   int(subgroupQuadSwapDiagonal(data[0].i4.x < 0));

+    data[invocation].i4.xy  = ivec2(subgroupQuadSwapDiagonal(lessThan(data[1].i4.xy, ivec2(0))));

+    data[invocation].i4.xyz = ivec3(subgroupQuadSwapDiagonal(lessThan(data[1].i4.xyz, ivec3(0))));

+    data[invocation].i4     = ivec4(subgroupQuadSwapDiagonal(lessThan(data[1].i4, ivec4(0))));

+}

diff --git a/Test/spv.subgroupShuffle.comp b/Test/spv.subgroupShuffle.comp
new file mode 100644
index 0000000..6d26488
--- /dev/null
+++ b/Test/spv.subgroupShuffle.comp
@@ -0,0 +1,68 @@
+#version 450

+

+#extension GL_KHR_shader_subgroup_shuffle: enable

+

+layout (local_size_x = 8, local_size_y = 8, local_size_z = 1) in;

+

+layout(binding = 0) buffer Buffers

+{

+    vec4  f4;

+    ivec4 i4;

+    uvec4 u4;

+    dvec4 d4;

+} data[4];

+

+void main()

+{

+    uint invocation = (gl_SubgroupInvocationID + gl_SubgroupSize) % 4;

+

+    data[invocation].f4.x   = subgroupShuffle(data[0].f4.x,    invocation);

+    data[invocation].f4.xy  = subgroupShuffle(data[1].f4.xy,   invocation);

+    data[invocation].f4.xyz = subgroupShuffle(data[2].f4.xyz,  invocation);

+    data[invocation].f4     = subgroupShuffle(data[3].f4,      invocation);

+

+    data[invocation].i4.x   = subgroupShuffle(data[0].i4.x,    invocation);

+    data[invocation].i4.xy  = subgroupShuffle(data[1].i4.xy,   invocation);

+    data[invocation].i4.xyz = subgroupShuffle(data[2].i4.xyz,  invocation);

+    data[invocation].i4     = subgroupShuffle(data[3].i4,      invocation);

+

+    data[invocation].u4.x   = subgroupShuffle(data[0].u4.x,    invocation);

+    data[invocation].u4.xy  = subgroupShuffle(data[1].u4.xy,   invocation);

+    data[invocation].u4.xyz = subgroupShuffle(data[2].u4.xyz,  invocation);

+    data[invocation].u4     = subgroupShuffle(data[3].u4,      invocation);

+

+    data[invocation].d4.x   = subgroupShuffle(data[0].d4.x,    invocation);

+    data[invocation].d4.xy  = subgroupShuffle(data[1].d4.xy,   invocation);

+    data[invocation].d4.xyz = subgroupShuffle(data[2].d4.xyz,  invocation);

+    data[invocation].d4     = subgroupShuffle(data[3].d4,      invocation);

+

+    data[invocation].i4.x   =   int(subgroupShuffle(data[0].i4.x < 0,                   invocation));

+    data[invocation].i4.xy  = ivec2(subgroupShuffle(lessThan(data[1].i4.xy, ivec2(0)),  invocation));

+    data[invocation].i4.xyz = ivec3(subgroupShuffle(lessThan(data[1].i4.xyz, ivec3(0)), invocation));

+    data[invocation].i4     = ivec4(subgroupShuffle(lessThan(data[1].i4, ivec4(0)),     invocation));

+

+    data[invocation].f4.x   = subgroupShuffleXor(data[0].f4.x,    invocation);

+    data[invocation].f4.xy  = subgroupShuffleXor(data[1].f4.xy,   invocation);

+    data[invocation].f4.xyz = subgroupShuffleXor(data[2].f4.xyz,  invocation);

+    data[invocation].f4     = subgroupShuffleXor(data[3].f4,      invocation);

+

+    data[invocation].i4.x   = subgroupShuffleXor(data[0].i4.x,    invocation);

+    data[invocation].i4.xy  = subgroupShuffleXor(data[1].i4.xy,   invocation);

+    data[invocation].i4.xyz = subgroupShuffleXor(data[2].i4.xyz,  invocation);

+    data[invocation].i4     = subgroupShuffleXor(data[3].i4,      invocation);

+

+    data[invocation].u4.x   = subgroupShuffleXor(data[0].u4.x,    invocation);

+    data[invocation].u4.xy  = subgroupShuffleXor(data[1].u4.xy,   invocation);

+    data[invocation].u4.xyz = subgroupShuffleXor(data[2].u4.xyz,  invocation);

+    data[invocation].u4     = subgroupShuffleXor(data[3].u4,      invocation);

+

+    data[invocation].d4.x   = subgroupShuffleXor(data[0].d4.x,    invocation);

+    data[invocation].d4.xy  = subgroupShuffleXor(data[1].d4.xy,   invocation);

+    data[invocation].d4.xyz = subgroupShuffleXor(data[2].d4.xyz,  invocation);

+    data[invocation].d4     = subgroupShuffleXor(data[3].d4,      invocation);

+

+    data[invocation].i4.x   =   int(subgroupShuffleXor(data[0].i4.x < 0,                   invocation));

+    data[invocation].i4.xy  = ivec2(subgroupShuffleXor(lessThan(data[1].i4.xy, ivec2(0)),  invocation));

+    data[invocation].i4.xyz = ivec3(subgroupShuffleXor(lessThan(data[1].i4.xyz, ivec3(0)), invocation));

+    data[invocation].i4     = ivec4(subgroupShuffleXor(lessThan(data[1].i4, ivec4(0)),     invocation));

+}

diff --git a/Test/spv.subgroupShuffleRelative.comp b/Test/spv.subgroupShuffleRelative.comp
new file mode 100644
index 0000000..1864de1
--- /dev/null
+++ b/Test/spv.subgroupShuffleRelative.comp
@@ -0,0 +1,68 @@
+#version 450

+

+#extension GL_KHR_shader_subgroup_shuffle_relative: enable

+

+layout (local_size_x = 8, local_size_y = 8, local_size_z = 1) in;

+

+layout(binding = 0) buffer Buffers

+{

+    vec4  f4;

+    ivec4 i4;

+    uvec4 u4;

+    dvec4 d4;

+} data[4];

+

+void main()

+{

+    uint invocation = (gl_SubgroupInvocationID + gl_SubgroupSize) % 4;

+

+    data[invocation].f4.x   = subgroupShuffleUp(data[0].f4.x,    invocation);

+    data[invocation].f4.xy  = subgroupShuffleUp(data[1].f4.xy,   invocation);

+    data[invocation].f4.xyz = subgroupShuffleUp(data[2].f4.xyz,  invocation);

+    data[invocation].f4     = subgroupShuffleUp(data[3].f4,      invocation);

+

+    data[invocation].i4.x   = subgroupShuffleUp(data[0].i4.x,    invocation);

+    data[invocation].i4.xy  = subgroupShuffleUp(data[1].i4.xy,   invocation);

+    data[invocation].i4.xyz = subgroupShuffleUp(data[2].i4.xyz,  invocation);

+    data[invocation].i4     = subgroupShuffleUp(data[3].i4,      invocation);

+

+    data[invocation].u4.x   = subgroupShuffleUp(data[0].u4.x,    invocation);

+    data[invocation].u4.xy  = subgroupShuffleUp(data[1].u4.xy,   invocation);

+    data[invocation].u4.xyz = subgroupShuffleUp(data[2].u4.xyz,  invocation);

+    data[invocation].u4     = subgroupShuffleUp(data[3].u4,      invocation);

+

+    data[invocation].d4.x   = subgroupShuffleUp(data[0].d4.x,    invocation);

+    data[invocation].d4.xy  = subgroupShuffleUp(data[1].d4.xy,   invocation);

+    data[invocation].d4.xyz = subgroupShuffleUp(data[2].d4.xyz,  invocation);

+    data[invocation].d4     = subgroupShuffleUp(data[3].d4,      invocation);

+

+    data[invocation].i4.x   =   int(subgroupShuffleUp(data[0].i4.x < 0,                   invocation));

+    data[invocation].i4.xy  = ivec2(subgroupShuffleUp(lessThan(data[1].i4.xy, ivec2(0)),  invocation));

+    data[invocation].i4.xyz = ivec3(subgroupShuffleUp(lessThan(data[1].i4.xyz, ivec3(0)), invocation));

+    data[invocation].i4     = ivec4(subgroupShuffleUp(lessThan(data[1].i4, ivec4(0)),     invocation));

+

+    data[invocation].f4.x   = subgroupShuffleDown(data[0].f4.x,    invocation);

+    data[invocation].f4.xy  = subgroupShuffleDown(data[1].f4.xy,   invocation);

+    data[invocation].f4.xyz = subgroupShuffleDown(data[2].f4.xyz,  invocation);

+    data[invocation].f4     = subgroupShuffleDown(data[3].f4,      invocation);

+

+    data[invocation].i4.x   = subgroupShuffleDown(data[0].i4.x,    invocation);

+    data[invocation].i4.xy  = subgroupShuffleDown(data[1].i4.xy,   invocation);

+    data[invocation].i4.xyz = subgroupShuffleDown(data[2].i4.xyz,  invocation);

+    data[invocation].i4     = subgroupShuffleDown(data[3].i4,      invocation);

+

+    data[invocation].u4.x   = subgroupShuffleDown(data[0].u4.x,    invocation);

+    data[invocation].u4.xy  = subgroupShuffleDown(data[1].u4.xy,   invocation);

+    data[invocation].u4.xyz = subgroupShuffleDown(data[2].u4.xyz,  invocation);

+    data[invocation].u4     = subgroupShuffleDown(data[3].u4,      invocation);

+

+    data[invocation].d4.x   = subgroupShuffleDown(data[0].d4.x,    invocation);

+    data[invocation].d4.xy  = subgroupShuffleDown(data[1].d4.xy,   invocation);

+    data[invocation].d4.xyz = subgroupShuffleDown(data[2].d4.xyz,  invocation);

+    data[invocation].d4     = subgroupShuffleDown(data[3].d4,      invocation);

+

+    data[invocation].i4.x   =   int(subgroupShuffleDown(data[0].i4.x < 0,                   invocation));

+    data[invocation].i4.xy  = ivec2(subgroupShuffleDown(lessThan(data[1].i4.xy, ivec2(0)),  invocation));

+    data[invocation].i4.xyz = ivec3(subgroupShuffleDown(lessThan(data[1].i4.xyz, ivec3(0)), invocation));

+    data[invocation].i4     = ivec4(subgroupShuffleDown(lessThan(data[1].i4, ivec4(0)),     invocation));

+}

diff --git a/Test/spv.subgroupVote.comp b/Test/spv.subgroupVote.comp
new file mode 100644
index 0000000..c1c877a
--- /dev/null
+++ b/Test/spv.subgroupVote.comp
@@ -0,0 +1,49 @@
+#version 450

+

+#extension GL_KHR_shader_subgroup_vote: enable

+

+layout (local_size_x = 8, local_size_y = 8, local_size_z = 1) in;

+

+layout(binding = 0) buffer Buffers

+{

+    vec4  f4;

+    ivec4 i4;

+    uvec4 u4;

+    dvec4 d4;

+    int r;

+} data[4];

+

+void main()

+{

+    uint invocation = (gl_SubgroupInvocationID + gl_SubgroupSize) % 4;

+

+    if (subgroupAll(data[invocation].r < 0))

+    {

+        data[invocation].r = int(subgroupAllEqual(data[0].f4.x));

+        data[invocation].r = int(subgroupAllEqual(data[1].f4.xy));

+        data[invocation].r = int(subgroupAllEqual(data[2].f4.xyz));

+        data[invocation].r = int(subgroupAllEqual(data[3].f4));

+

+        data[invocation].r = int(subgroupAllEqual(data[0].i4.x));

+        data[invocation].r = int(subgroupAllEqual(data[1].i4.xy));

+        data[invocation].r = int(subgroupAllEqual(data[2].i4.xyz));

+        data[invocation].r = int(subgroupAllEqual(data[3].i4));

+

+        data[invocation].r = int(subgroupAllEqual(data[0].u4.x));

+        data[invocation].r = int(subgroupAllEqual(data[1].u4.xy));

+        data[invocation].r = int(subgroupAllEqual(data[2].u4.xyz));

+        data[invocation].r = int(subgroupAllEqual(data[3].u4));

+    }

+    else if (subgroupAny(data[invocation].r < 0))

+    {

+        data[invocation].r = int(subgroupAllEqual(data[0].d4.x));

+        data[invocation].r = int(subgroupAllEqual(data[1].d4.xy));

+        data[invocation].r = int(subgroupAllEqual(data[2].d4.xyz));

+        data[invocation].r = int(subgroupAllEqual(data[3].d4));

+

+        data[invocation].r = int(int(subgroupAllEqual(data[0].i4.x < 0)));

+        data[invocation].r = int(ivec2(subgroupAllEqual(lessThan(data[1].i4.xy, ivec2(0)))));

+        data[invocation].r = int(ivec3(subgroupAllEqual(lessThan(data[1].i4.xyz, ivec3(0)))));

+        data[invocation].r = int(ivec4(subgroupAllEqual(lessThan(data[1].i4, ivec4(0)))));

+    }

+}

diff --git a/Test/spv.targetOpenGL.vert b/Test/spv.targetOpenGL.vert
new file mode 100644
index 0000000..501a3e5
--- /dev/null
+++ b/Test/spv.targetOpenGL.vert
@@ -0,0 +1,10 @@
+#version 450

+

+layout(constant_id = 3) const int a = 2;

+layout(location = 2) uniform float f;

+layout(location = 4, binding = 1) uniform sampler2D s1;

+layout(binding = 2) uniform sampler2D s2;

+

+void main()

+{

+}

diff --git a/Test/spv.targetVulkan.vert b/Test/spv.targetVulkan.vert
new file mode 100644
index 0000000..d879122
--- /dev/null
+++ b/Test/spv.targetVulkan.vert
@@ -0,0 +1,9 @@
+#version 450

+

+layout(constant_id = 3) const int a = 2;

+

+layout(push_constant) uniform pc { float f; };

+

+void main()

+{

+}

diff --git a/Test/spv.texture.sampler.transform.frag b/Test/spv.texture.sampler.transform.frag
new file mode 100644
index 0000000..872d9b0
--- /dev/null
+++ b/Test/spv.texture.sampler.transform.frag
@@ -0,0 +1,13 @@
+#version 440

+

+uniform sampler smp;

+uniform texture2D tex;

+

+in vec2 coord;

+

+out vec4 color;

+

+void main()

+{

+  color = texture(sampler2D(tex, smp), coord);

+}

diff --git a/Test/spv.textureBuffer.vert b/Test/spv.textureBuffer.vert
new file mode 100644
index 0000000..fc6fa3a
--- /dev/null
+++ b/Test/spv.textureBuffer.vert
@@ -0,0 +1,17 @@
+#version 450

+

+uniform textureBuffer tBuf;

+uniform sampler s;

+uniform samplerBuffer sBuf;

+

+uniform utextureBuffer utBuf;

+uniform itextureBuffer itBuf;

+

+void main()

+{

+    texelFetch(samplerBuffer(tBuf, s), 13);

+    texelFetch(sBuf, 13);

+    texelFetch(tBuf, 13);

+    texelFetch(utBuf, 13);

+    texelFetch(itBuf, 13);

+}

diff --git a/Test/spv.textureGatherBiasLod.frag b/Test/spv.textureGatherBiasLod.frag
new file mode 100644
index 0000000..35bd035
--- /dev/null
+++ b/Test/spv.textureGatherBiasLod.frag
@@ -0,0 +1,88 @@
+#version 450 core

+

+#extension GL_ARB_sparse_texture2: enable

+#extension GL_AMD_texture_gather_bias_lod: enable

+

+uniform sampler2D           s2D;

+uniform sampler2DArray      s2DArray;

+uniform samplerCube         sCube;

+uniform samplerCubeArray    sCubeArray;

+

+in vec2 c2;

+in vec3 c3;

+in vec4 c4;

+

+in float lod;

+in float bias;

+

+out vec4 fragColor;

+

+void main()

+{

+    vec4 texel  = vec4(0.0);

+    vec4 result = vec4(0.0);

+

+    const ivec2 offsets[4] = { ivec2(0, 0), ivec2(0, 1), ivec2(1, 0), ivec2(1, 1) };

+

+    texel += textureGather(s2D,        c2, 0, bias);

+    texel += textureGather(s2DArray,   c3, 1, bias);

+    texel += textureGather(sCube,      c3, 2, bias);

+    texel += textureGather(sCubeArray, c4, 3, bias);

+

+    texel += textureGatherOffset(s2D,        c2, offsets[0], 0, bias);

+    texel += textureGatherOffset(s2DArray,   c3, offsets[1], 1, bias);

+

+    texel += textureGatherOffsets(s2D,        c2, offsets, 0, bias);

+    texel += textureGatherOffsets(s2DArray,   c3, offsets, 1, bias);

+

+    sparseTextureGatherARB(s2D,        c2, result, 0, bias);

+    texel += result;

+    sparseTextureGatherARB(s2DArray,   c3, result, 1, bias);

+    texel += result;

+    sparseTextureGatherARB(sCube,      c3, result, 2, bias);

+    texel += result;

+    sparseTextureGatherARB(sCubeArray, c4, result, 2, bias);

+    texel += result;

+

+    sparseTextureGatherOffsetARB(s2D,      c2, offsets[0], result, 0, bias);

+    texel += result;

+    sparseTextureGatherOffsetARB(s2DArray, c3, offsets[1], result, 1, bias);

+    texel += result;

+

+    sparseTextureGatherOffsetsARB(s2D,      c2, offsets, result, 0, bias);

+    texel += result;

+    sparseTextureGatherOffsetsARB(s2DArray, c3, offsets, result, 1, bias);

+    texel += result;

+

+    texel += textureGatherLodAMD(s2D,        c2, lod);

+    texel += textureGatherLodAMD(s2DArray,   c3, lod, 1);

+    texel += textureGatherLodAMD(sCube,      c3, lod, 2);

+    texel += textureGatherLodAMD(sCubeArray, c4, lod, 3);

+

+    texel += textureGatherLodOffsetAMD(s2D,        c2, lod, offsets[0]);

+    texel += textureGatherLodOffsetAMD(s2DArray,   c3, lod, offsets[1], 1);

+

+    texel += textureGatherLodOffsetsAMD(s2D,       c2, lod, offsets);

+    texel += textureGatherLodOffsetsAMD(s2DArray,  c3, lod, offsets, 1);

+

+    sparseTextureGatherLodAMD(s2D,        c2, lod, result);

+    texel += result;

+    sparseTextureGatherLodAMD(s2DArray,   c3, lod, result, 1);

+    texel += result;

+    sparseTextureGatherLodAMD(sCube,      c3, lod, result, 2);

+    texel += result;

+    sparseTextureGatherLodAMD(sCubeArray, c4, lod, result, 2);

+    texel += result;

+

+    sparseTextureGatherLodOffsetAMD(s2D,      c2, lod, offsets[0], result);

+    texel += result;

+    sparseTextureGatherLodOffsetAMD(s2DArray, c3, lod, offsets[1], result, 1);

+    texel += result;

+

+    sparseTextureGatherLodOffsetsAMD(s2D,      c2, lod, offsets, result);

+    texel += result;

+    sparseTextureGatherLodOffsetsAMD(s2DArray, c3, lod, offsets, result, 1);

+    texel += result;

+

+    fragColor = texel;

+}

diff --git a/Test/spv.unit1.frag b/Test/spv.unit1.frag
new file mode 100644
index 0000000..d84f821
--- /dev/null
+++ b/Test/spv.unit1.frag
@@ -0,0 +1,16 @@
+#version 460
+
+float f;
+float a1;
+
+float foo();
+
+out float cout;
+
+void main()
+{
+    f = 10;
+    float g = foo();
+    f += g;
+    f += gl_FragCoord.y;
+}
\ No newline at end of file
diff --git a/Test/spv.unit2.frag b/Test/spv.unit2.frag
new file mode 100644
index 0000000..d17e7e7
--- /dev/null
+++ b/Test/spv.unit2.frag
@@ -0,0 +1,17 @@
+#version 410
+// a different version number makes different id's for the same shared symbol
+
+float a2;
+float f;
+
+float bar();
+
+out float cout;
+in float cin;
+
+float foo()
+{
+    float h2 = 2 * f + cin;
+    float g2 = bar();
+    return h2 + g2 + gl_FragCoord.y;
+}
\ No newline at end of file
diff --git a/Test/spv.unit3.frag b/Test/spv.unit3.frag
new file mode 100644
index 0000000..4c96597
--- /dev/null
+++ b/Test/spv.unit3.frag
@@ -0,0 +1,15 @@
+#version 460
+
+float f;
+float h3 = 3.0;
+
+out float cout;
+in float cin;
+
+float bar()
+{
+    h3 *= f;
+    float g3 = 2 * h3;
+    cout = g3;
+    return h3 + g3 + gl_FragCoord.y;
+}
diff --git a/Test/spv.vecMatConstruct.frag b/Test/spv.vecMatConstruct.frag
new file mode 100644
index 0000000..54a0017
--- /dev/null
+++ b/Test/spv.vecMatConstruct.frag
@@ -0,0 +1,14 @@
+#version 450

+

+void main()

+{

+    mat4x3 m;

+

+    vec2 v2 = vec2(m);

+    vec3 v3 = vec3(m);

+    vec4 v4 = vec4(m);

+

+    ivec2 iv2 = ivec2(m);

+    ivec3 iv3 = ivec3(m);

+    ivec4 iv4 = ivec4(m);

+}

diff --git a/Test/spv.viewportArray2.tesc b/Test/spv.viewportArray2.tesc
index f629b43..7fc208a 100644
--- a/Test/spv.viewportArray2.tesc
+++ b/Test/spv.viewportArray2.tesc
@@ -5,12 +5,12 @@
 

 out gl_PerVertex {

     int gl_ViewportMask[2];

-    int gl_ViewportIndex;

-    layout (viewport_relative) out highp int gl_Layer;

 } gl_out[4];

 

+layout (viewport_relative) out highp int gl_Layer;

+

 void main()

 {

-    gl_out[gl_InvocationID].gl_ViewportMask[0]                  = 1;

-    gl_out[gl_InvocationID].gl_ViewportIndex                    = 2;

+    gl_out[gl_InvocationID].gl_ViewportMask[0] = 1;

+    gl_ViewportIndex = 2;

 }

diff --git a/Test/spv.vulkan100.subgroupArithmetic.comp b/Test/spv.vulkan100.subgroupArithmetic.comp
new file mode 100644
index 0000000..6cc9337
--- /dev/null
+++ b/Test/spv.vulkan100.subgroupArithmetic.comp
@@ -0,0 +1,393 @@
+#version 450

+

+#extension GL_KHR_shader_subgroup_arithmetic: enable

+

+layout (local_size_x = 8) in;

+

+layout(binding = 0) buffer Buffers

+{

+    vec4  f4;

+    ivec4 i4;

+    uvec4 u4;

+    dvec4 d4;

+} data[4];

+

+void main()

+{

+    uint invocation = (gl_SubgroupInvocationID + gl_SubgroupSize) % 4;

+

+    data[invocation].f4.x   = subgroupAdd(data[0].f4.x);

+    data[invocation].f4.xy  = subgroupAdd(data[1].f4.xy);

+    data[invocation].f4.xyz = subgroupAdd(data[2].f4.xyz);

+    data[invocation].f4     = subgroupAdd(data[3].f4);

+

+    data[invocation].i4.x   = subgroupAdd(data[0].i4.x);

+    data[invocation].i4.xy  = subgroupAdd(data[1].i4.xy);

+    data[invocation].i4.xyz = subgroupAdd(data[2].i4.xyz);

+    data[invocation].i4     = subgroupAdd(data[3].i4);

+

+    data[invocation].u4.x   = subgroupAdd(data[0].u4.x);

+    data[invocation].u4.xy  = subgroupAdd(data[1].u4.xy);

+    data[invocation].u4.xyz = subgroupAdd(data[2].u4.xyz);

+    data[invocation].u4     = subgroupAdd(data[3].u4);

+

+    data[invocation].d4.x   = subgroupAdd(data[0].d4.x);

+    data[invocation].d4.xy  = subgroupAdd(data[1].d4.xy);

+    data[invocation].d4.xyz = subgroupAdd(data[2].d4.xyz);

+    data[invocation].d4     = subgroupAdd(data[3].d4);

+

+    data[invocation].f4.x   = subgroupMul(data[0].f4.x);

+    data[invocation].f4.xy  = subgroupMul(data[1].f4.xy);

+    data[invocation].f4.xyz = subgroupMul(data[2].f4.xyz);

+    data[invocation].f4     = subgroupMul(data[3].f4);

+

+    data[invocation].i4.x   = subgroupMul(data[0].i4.x);

+    data[invocation].i4.xy  = subgroupMul(data[1].i4.xy);

+    data[invocation].i4.xyz = subgroupMul(data[2].i4.xyz);

+    data[invocation].i4     = subgroupMul(data[3].i4);

+

+    data[invocation].u4.x   = subgroupMul(data[0].u4.x);

+    data[invocation].u4.xy  = subgroupMul(data[1].u4.xy);

+    data[invocation].u4.xyz = subgroupMul(data[2].u4.xyz);

+    data[invocation].u4     = subgroupMul(data[3].u4);

+

+    data[invocation].d4.x   = subgroupMul(data[0].d4.x);

+    data[invocation].d4.xy  = subgroupMul(data[1].d4.xy);

+    data[invocation].d4.xyz = subgroupMul(data[2].d4.xyz);

+    data[invocation].d4     = subgroupMul(data[3].d4);

+

+    data[invocation].f4.x   = subgroupMin(data[0].f4.x);

+    data[invocation].f4.xy  = subgroupMin(data[1].f4.xy);

+    data[invocation].f4.xyz = subgroupMin(data[2].f4.xyz);

+    data[invocation].f4     = subgroupMin(data[3].f4);

+

+    data[invocation].i4.x   = subgroupMin(data[0].i4.x);

+    data[invocation].i4.xy  = subgroupMin(data[1].i4.xy);

+    data[invocation].i4.xyz = subgroupMin(data[2].i4.xyz);

+    data[invocation].i4     = subgroupMin(data[3].i4);

+

+    data[invocation].u4.x   = subgroupMin(data[0].u4.x);

+    data[invocation].u4.xy  = subgroupMin(data[1].u4.xy);

+    data[invocation].u4.xyz = subgroupMin(data[2].u4.xyz);

+    data[invocation].u4     = subgroupMin(data[3].u4);

+

+    data[invocation].d4.x   = subgroupMin(data[0].d4.x);

+    data[invocation].d4.xy  = subgroupMin(data[1].d4.xy);

+    data[invocation].d4.xyz = subgroupMin(data[2].d4.xyz);

+    data[invocation].d4     = subgroupMin(data[3].d4);

+

+    data[invocation].f4.x   = subgroupMax(data[0].f4.x);

+    data[invocation].f4.xy  = subgroupMax(data[1].f4.xy);

+    data[invocation].f4.xyz = subgroupMax(data[2].f4.xyz);

+    data[invocation].f4     = subgroupMax(data[3].f4);

+

+    data[invocation].i4.x   = subgroupMax(data[0].i4.x);

+    data[invocation].i4.xy  = subgroupMax(data[1].i4.xy);

+    data[invocation].i4.xyz = subgroupMax(data[2].i4.xyz);

+    data[invocation].i4     = subgroupMax(data[3].i4);

+

+    data[invocation].u4.x   = subgroupMax(data[0].u4.x);

+    data[invocation].u4.xy  = subgroupMax(data[1].u4.xy);

+    data[invocation].u4.xyz = subgroupMax(data[2].u4.xyz);

+    data[invocation].u4     = subgroupMax(data[3].u4);

+

+    data[invocation].d4.x   = subgroupMax(data[0].d4.x);

+    data[invocation].d4.xy  = subgroupMax(data[1].d4.xy);

+    data[invocation].d4.xyz = subgroupMax(data[2].d4.xyz);

+    data[invocation].d4     = subgroupMax(data[3].d4);

+

+    data[invocation].i4.x   = subgroupAnd(data[0].i4.x);

+    data[invocation].i4.xy  = subgroupAnd(data[1].i4.xy);

+    data[invocation].i4.xyz = subgroupAnd(data[2].i4.xyz);

+    data[invocation].i4     = subgroupAnd(data[3].i4);

+

+    data[invocation].u4.x   = subgroupAnd(data[0].u4.x);

+    data[invocation].u4.xy  = subgroupAnd(data[1].u4.xy);

+    data[invocation].u4.xyz = subgroupAnd(data[2].u4.xyz);

+    data[invocation].u4     = subgroupAnd(data[3].u4);

+

+    data[invocation].i4.x   =   int(subgroupAnd(data[0].i4.x < 0));

+    data[invocation].i4.xy  = ivec2(subgroupAnd(lessThan(data[1].i4.xy, ivec2(0))));

+    data[invocation].i4.xyz = ivec3(subgroupAnd(lessThan(data[1].i4.xyz, ivec3(0))));

+    data[invocation].i4     = ivec4(subgroupAnd(lessThan(data[1].i4, ivec4(0))));

+

+    data[invocation].i4.x   = subgroupOr(data[0].i4.x);

+    data[invocation].i4.xy  = subgroupOr(data[1].i4.xy);

+    data[invocation].i4.xyz = subgroupOr(data[2].i4.xyz);

+    data[invocation].i4     = subgroupOr(data[3].i4);

+

+    data[invocation].u4.x   = subgroupOr(data[0].u4.x);

+    data[invocation].u4.xy  = subgroupOr(data[1].u4.xy);

+    data[invocation].u4.xyz = subgroupOr(data[2].u4.xyz);

+    data[invocation].u4     = subgroupOr(data[3].u4);

+

+    data[invocation].i4.x   =   int(subgroupOr(data[0].i4.x < 0));

+    data[invocation].i4.xy  = ivec2(subgroupOr(lessThan(data[1].i4.xy, ivec2(0))));

+    data[invocation].i4.xyz = ivec3(subgroupOr(lessThan(data[1].i4.xyz, ivec3(0))));

+    data[invocation].i4     = ivec4(subgroupOr(lessThan(data[1].i4, ivec4(0))));

+

+    data[invocation].i4.x   = subgroupXor(data[0].i4.x);

+    data[invocation].i4.xy  = subgroupXor(data[1].i4.xy);

+    data[invocation].i4.xyz = subgroupXor(data[2].i4.xyz);

+    data[invocation].i4     = subgroupXor(data[3].i4);

+

+    data[invocation].u4.x   = subgroupXor(data[0].u4.x);

+    data[invocation].u4.xy  = subgroupXor(data[1].u4.xy);

+    data[invocation].u4.xyz = subgroupXor(data[2].u4.xyz);

+    data[invocation].u4     = subgroupXor(data[3].u4);

+

+    data[invocation].i4.x   =   int(subgroupXor(data[0].i4.x < 0));

+    data[invocation].i4.xy  = ivec2(subgroupXor(lessThan(data[1].i4.xy, ivec2(0))));

+    data[invocation].i4.xyz = ivec3(subgroupXor(lessThan(data[1].i4.xyz, ivec3(0))));

+    data[invocation].i4     = ivec4(subgroupXor(lessThan(data[1].i4, ivec4(0))));

+

+    data[invocation].f4.x   = subgroupInclusiveAdd(data[0].f4.x);

+    data[invocation].f4.xy  = subgroupInclusiveAdd(data[1].f4.xy);

+    data[invocation].f4.xyz = subgroupInclusiveAdd(data[2].f4.xyz);

+    data[invocation].f4     = subgroupInclusiveAdd(data[3].f4);

+

+    data[invocation].i4.x   = subgroupInclusiveAdd(data[0].i4.x);

+    data[invocation].i4.xy  = subgroupInclusiveAdd(data[1].i4.xy);

+    data[invocation].i4.xyz = subgroupInclusiveAdd(data[2].i4.xyz);

+    data[invocation].i4     = subgroupInclusiveAdd(data[3].i4);

+

+    data[invocation].u4.x   = subgroupInclusiveAdd(data[0].u4.x);

+    data[invocation].u4.xy  = subgroupInclusiveAdd(data[1].u4.xy);

+    data[invocation].u4.xyz = subgroupInclusiveAdd(data[2].u4.xyz);

+    data[invocation].u4     = subgroupInclusiveAdd(data[3].u4);

+

+    data[invocation].d4.x   = subgroupInclusiveAdd(data[0].d4.x);

+    data[invocation].d4.xy  = subgroupInclusiveAdd(data[1].d4.xy);

+    data[invocation].d4.xyz = subgroupInclusiveAdd(data[2].d4.xyz);

+    data[invocation].d4     = subgroupInclusiveAdd(data[3].d4);

+

+    data[invocation].f4.x   = subgroupInclusiveMul(data[0].f4.x);

+    data[invocation].f4.xy  = subgroupInclusiveMul(data[1].f4.xy);

+    data[invocation].f4.xyz = subgroupInclusiveMul(data[2].f4.xyz);

+    data[invocation].f4     = subgroupInclusiveMul(data[3].f4);

+

+    data[invocation].i4.x   = subgroupInclusiveMul(data[0].i4.x);

+    data[invocation].i4.xy  = subgroupInclusiveMul(data[1].i4.xy);

+    data[invocation].i4.xyz = subgroupInclusiveMul(data[2].i4.xyz);

+    data[invocation].i4     = subgroupInclusiveMul(data[3].i4);

+

+    data[invocation].u4.x   = subgroupInclusiveMul(data[0].u4.x);

+    data[invocation].u4.xy  = subgroupInclusiveMul(data[1].u4.xy);

+    data[invocation].u4.xyz = subgroupInclusiveMul(data[2].u4.xyz);

+    data[invocation].u4     = subgroupInclusiveMul(data[3].u4);

+

+    data[invocation].d4.x   = subgroupInclusiveMul(data[0].d4.x);

+    data[invocation].d4.xy  = subgroupInclusiveMul(data[1].d4.xy);

+    data[invocation].d4.xyz = subgroupInclusiveMul(data[2].d4.xyz);

+    data[invocation].d4     = subgroupInclusiveMul(data[3].d4);

+

+    data[invocation].f4.x   = subgroupInclusiveMin(data[0].f4.x);

+    data[invocation].f4.xy  = subgroupInclusiveMin(data[1].f4.xy);

+    data[invocation].f4.xyz = subgroupInclusiveMin(data[2].f4.xyz);

+    data[invocation].f4     = subgroupInclusiveMin(data[3].f4);

+

+    data[invocation].i4.x   = subgroupInclusiveMin(data[0].i4.x);

+    data[invocation].i4.xy  = subgroupInclusiveMin(data[1].i4.xy);

+    data[invocation].i4.xyz = subgroupInclusiveMin(data[2].i4.xyz);

+    data[invocation].i4     = subgroupInclusiveMin(data[3].i4);

+

+    data[invocation].u4.x   = subgroupInclusiveMin(data[0].u4.x);

+    data[invocation].u4.xy  = subgroupInclusiveMin(data[1].u4.xy);

+    data[invocation].u4.xyz = subgroupInclusiveMin(data[2].u4.xyz);

+    data[invocation].u4     = subgroupInclusiveMin(data[3].u4);

+

+    data[invocation].d4.x   = subgroupInclusiveMin(data[0].d4.x);

+    data[invocation].d4.xy  = subgroupInclusiveMin(data[1].d4.xy);

+    data[invocation].d4.xyz = subgroupInclusiveMin(data[2].d4.xyz);

+    data[invocation].d4     = subgroupInclusiveMin(data[3].d4);

+

+    data[invocation].f4.x   = subgroupInclusiveMax(data[0].f4.x);

+    data[invocation].f4.xy  = subgroupInclusiveMax(data[1].f4.xy);

+    data[invocation].f4.xyz = subgroupInclusiveMax(data[2].f4.xyz);

+    data[invocation].f4     = subgroupInclusiveMax(data[3].f4);

+

+    data[invocation].i4.x   = subgroupInclusiveMax(data[0].i4.x);

+    data[invocation].i4.xy  = subgroupInclusiveMax(data[1].i4.xy);

+    data[invocation].i4.xyz = subgroupInclusiveMax(data[2].i4.xyz);

+    data[invocation].i4     = subgroupInclusiveMax(data[3].i4);

+

+    data[invocation].u4.x   = subgroupInclusiveMax(data[0].u4.x);

+    data[invocation].u4.xy  = subgroupInclusiveMax(data[1].u4.xy);

+    data[invocation].u4.xyz = subgroupInclusiveMax(data[2].u4.xyz);

+    data[invocation].u4     = subgroupInclusiveMax(data[3].u4);

+

+    data[invocation].d4.x   = subgroupInclusiveMax(data[0].d4.x);

+    data[invocation].d4.xy  = subgroupInclusiveMax(data[1].d4.xy);

+    data[invocation].d4.xyz = subgroupInclusiveMax(data[2].d4.xyz);

+    data[invocation].d4     = subgroupInclusiveMax(data[3].d4);

+

+    data[invocation].i4.x   = subgroupInclusiveAnd(data[0].i4.x);

+    data[invocation].i4.xy  = subgroupInclusiveAnd(data[1].i4.xy);

+    data[invocation].i4.xyz = subgroupInclusiveAnd(data[2].i4.xyz);

+    data[invocation].i4     = subgroupInclusiveAnd(data[3].i4);

+

+    data[invocation].u4.x   = subgroupInclusiveAnd(data[0].u4.x);

+    data[invocation].u4.xy  = subgroupInclusiveAnd(data[1].u4.xy);

+    data[invocation].u4.xyz = subgroupInclusiveAnd(data[2].u4.xyz);

+    data[invocation].u4     = subgroupInclusiveAnd(data[3].u4);

+

+    data[invocation].i4.x   =   int(subgroupInclusiveAnd(data[0].i4.x < 0));

+    data[invocation].i4.xy  = ivec2(subgroupInclusiveAnd(lessThan(data[1].i4.xy, ivec2(0))));

+    data[invocation].i4.xyz = ivec3(subgroupInclusiveAnd(lessThan(data[1].i4.xyz, ivec3(0))));

+    data[invocation].i4     = ivec4(subgroupInclusiveAnd(lessThan(data[1].i4, ivec4(0))));

+

+    data[invocation].i4.x   = subgroupInclusiveOr(data[0].i4.x);

+    data[invocation].i4.xy  = subgroupInclusiveOr(data[1].i4.xy);

+    data[invocation].i4.xyz = subgroupInclusiveOr(data[2].i4.xyz);

+    data[invocation].i4     = subgroupInclusiveOr(data[3].i4);

+

+    data[invocation].u4.x   = subgroupInclusiveOr(data[0].u4.x);

+    data[invocation].u4.xy  = subgroupInclusiveOr(data[1].u4.xy);

+    data[invocation].u4.xyz = subgroupInclusiveOr(data[2].u4.xyz);

+    data[invocation].u4     = subgroupInclusiveOr(data[3].u4);

+

+    data[invocation].i4.x   =   int(subgroupInclusiveOr(data[0].i4.x < 0));

+    data[invocation].i4.xy  = ivec2(subgroupInclusiveOr(lessThan(data[1].i4.xy, ivec2(0))));

+    data[invocation].i4.xyz = ivec3(subgroupInclusiveOr(lessThan(data[1].i4.xyz, ivec3(0))));

+    data[invocation].i4     = ivec4(subgroupInclusiveOr(lessThan(data[1].i4, ivec4(0))));

+

+    data[invocation].i4.x   = subgroupInclusiveXor(data[0].i4.x);

+    data[invocation].i4.xy  = subgroupInclusiveXor(data[1].i4.xy);

+    data[invocation].i4.xyz = subgroupInclusiveXor(data[2].i4.xyz);

+    data[invocation].i4     = subgroupInclusiveXor(data[3].i4);

+

+    data[invocation].u4.x   = subgroupInclusiveXor(data[0].u4.x);

+    data[invocation].u4.xy  = subgroupInclusiveXor(data[1].u4.xy);

+    data[invocation].u4.xyz = subgroupInclusiveXor(data[2].u4.xyz);

+    data[invocation].u4     = subgroupInclusiveXor(data[3].u4);

+

+    data[invocation].i4.x   =   int(subgroupInclusiveXor(data[0].i4.x < 0));

+    data[invocation].i4.xy  = ivec2(subgroupInclusiveXor(lessThan(data[1].i4.xy, ivec2(0))));

+    data[invocation].i4.xyz = ivec3(subgroupInclusiveXor(lessThan(data[1].i4.xyz, ivec3(0))));

+    data[invocation].i4     = ivec4(subgroupInclusiveXor(lessThan(data[1].i4, ivec4(0))));

+

+    data[invocation].f4.x   = subgroupExclusiveAdd(data[0].f4.x);

+    data[invocation].f4.xy  = subgroupExclusiveAdd(data[1].f4.xy);

+    data[invocation].f4.xyz = subgroupExclusiveAdd(data[2].f4.xyz);

+    data[invocation].f4     = subgroupExclusiveAdd(data[3].f4);

+

+    data[invocation].i4.x   = subgroupExclusiveAdd(data[0].i4.x);

+    data[invocation].i4.xy  = subgroupExclusiveAdd(data[1].i4.xy);

+    data[invocation].i4.xyz = subgroupExclusiveAdd(data[2].i4.xyz);

+    data[invocation].i4     = subgroupExclusiveAdd(data[3].i4);

+

+    data[invocation].u4.x   = subgroupExclusiveAdd(data[0].u4.x);

+    data[invocation].u4.xy  = subgroupExclusiveAdd(data[1].u4.xy);

+    data[invocation].u4.xyz = subgroupExclusiveAdd(data[2].u4.xyz);

+    data[invocation].u4     = subgroupExclusiveAdd(data[3].u4);

+

+    data[invocation].d4.x   = subgroupExclusiveAdd(data[0].d4.x);

+    data[invocation].d4.xy  = subgroupExclusiveAdd(data[1].d4.xy);

+    data[invocation].d4.xyz = subgroupExclusiveAdd(data[2].d4.xyz);

+    data[invocation].d4     = subgroupExclusiveAdd(data[3].d4);

+

+    data[invocation].f4.x   = subgroupExclusiveMul(data[0].f4.x);

+    data[invocation].f4.xy  = subgroupExclusiveMul(data[1].f4.xy);

+    data[invocation].f4.xyz = subgroupExclusiveMul(data[2].f4.xyz);

+    data[invocation].f4     = subgroupExclusiveMul(data[3].f4);

+

+    data[invocation].i4.x   = subgroupExclusiveMul(data[0].i4.x);

+    data[invocation].i4.xy  = subgroupExclusiveMul(data[1].i4.xy);

+    data[invocation].i4.xyz = subgroupExclusiveMul(data[2].i4.xyz);

+    data[invocation].i4     = subgroupExclusiveMul(data[3].i4);

+

+    data[invocation].u4.x   = subgroupExclusiveMul(data[0].u4.x);

+    data[invocation].u4.xy  = subgroupExclusiveMul(data[1].u4.xy);

+    data[invocation].u4.xyz = subgroupExclusiveMul(data[2].u4.xyz);

+    data[invocation].u4     = subgroupExclusiveMul(data[3].u4);

+

+    data[invocation].d4.x   = subgroupExclusiveMul(data[0].d4.x);

+    data[invocation].d4.xy  = subgroupExclusiveMul(data[1].d4.xy);

+    data[invocation].d4.xyz = subgroupExclusiveMul(data[2].d4.xyz);

+    data[invocation].d4     = subgroupExclusiveMul(data[3].d4);

+

+    data[invocation].f4.x   = subgroupExclusiveMin(data[0].f4.x);

+    data[invocation].f4.xy  = subgroupExclusiveMin(data[1].f4.xy);

+    data[invocation].f4.xyz = subgroupExclusiveMin(data[2].f4.xyz);

+    data[invocation].f4     = subgroupExclusiveMin(data[3].f4);

+

+    data[invocation].i4.x   = subgroupExclusiveMin(data[0].i4.x);

+    data[invocation].i4.xy  = subgroupExclusiveMin(data[1].i4.xy);

+    data[invocation].i4.xyz = subgroupExclusiveMin(data[2].i4.xyz);

+    data[invocation].i4     = subgroupExclusiveMin(data[3].i4);

+

+    data[invocation].u4.x   = subgroupExclusiveMin(data[0].u4.x);

+    data[invocation].u4.xy  = subgroupExclusiveMin(data[1].u4.xy);

+    data[invocation].u4.xyz = subgroupExclusiveMin(data[2].u4.xyz);

+    data[invocation].u4     = subgroupExclusiveMin(data[3].u4);

+

+    data[invocation].d4.x   = subgroupExclusiveMin(data[0].d4.x);

+    data[invocation].d4.xy  = subgroupExclusiveMin(data[1].d4.xy);

+    data[invocation].d4.xyz = subgroupExclusiveMin(data[2].d4.xyz);

+    data[invocation].d4     = subgroupExclusiveMin(data[3].d4);

+

+    data[invocation].f4.x   = subgroupExclusiveMax(data[0].f4.x);

+    data[invocation].f4.xy  = subgroupExclusiveMax(data[1].f4.xy);

+    data[invocation].f4.xyz = subgroupExclusiveMax(data[2].f4.xyz);

+    data[invocation].f4     = subgroupExclusiveMax(data[3].f4);

+

+    data[invocation].i4.x   = subgroupExclusiveMax(data[0].i4.x);

+    data[invocation].i4.xy  = subgroupExclusiveMax(data[1].i4.xy);

+    data[invocation].i4.xyz = subgroupExclusiveMax(data[2].i4.xyz);

+    data[invocation].i4     = subgroupExclusiveMax(data[3].i4);

+

+    data[invocation].u4.x   = subgroupExclusiveMax(data[0].u4.x);

+    data[invocation].u4.xy  = subgroupExclusiveMax(data[1].u4.xy);

+    data[invocation].u4.xyz = subgroupExclusiveMax(data[2].u4.xyz);

+    data[invocation].u4     = subgroupExclusiveMax(data[3].u4);

+

+    data[invocation].d4.x   = subgroupExclusiveMax(data[0].d4.x);

+    data[invocation].d4.xy  = subgroupExclusiveMax(data[1].d4.xy);

+    data[invocation].d4.xyz = subgroupExclusiveMax(data[2].d4.xyz);

+    data[invocation].d4     = subgroupExclusiveMax(data[3].d4);

+

+    data[invocation].i4.x   = subgroupExclusiveAnd(data[0].i4.x);

+    data[invocation].i4.xy  = subgroupExclusiveAnd(data[1].i4.xy);

+    data[invocation].i4.xyz = subgroupExclusiveAnd(data[2].i4.xyz);

+    data[invocation].i4     = subgroupExclusiveAnd(data[3].i4);

+

+    data[invocation].u4.x   = subgroupExclusiveAnd(data[0].u4.x);

+    data[invocation].u4.xy  = subgroupExclusiveAnd(data[1].u4.xy);

+    data[invocation].u4.xyz = subgroupExclusiveAnd(data[2].u4.xyz);

+    data[invocation].u4     = subgroupExclusiveAnd(data[3].u4);

+

+    data[invocation].i4.x   =   int(subgroupExclusiveAnd(data[0].i4.x < 0));

+    data[invocation].i4.xy  = ivec2(subgroupExclusiveAnd(lessThan(data[1].i4.xy, ivec2(0))));

+    data[invocation].i4.xyz = ivec3(subgroupExclusiveAnd(lessThan(data[1].i4.xyz, ivec3(0))));

+    data[invocation].i4     = ivec4(subgroupExclusiveAnd(lessThan(data[1].i4, ivec4(0))));

+

+    data[invocation].i4.x   = subgroupExclusiveOr(data[0].i4.x);

+    data[invocation].i4.xy  = subgroupExclusiveOr(data[1].i4.xy);

+    data[invocation].i4.xyz = subgroupExclusiveOr(data[2].i4.xyz);

+    data[invocation].i4     = subgroupExclusiveOr(data[3].i4);

+

+    data[invocation].u4.x   = subgroupExclusiveOr(data[0].u4.x);

+    data[invocation].u4.xy  = subgroupExclusiveOr(data[1].u4.xy);

+    data[invocation].u4.xyz = subgroupExclusiveOr(data[2].u4.xyz);

+    data[invocation].u4     = subgroupExclusiveOr(data[3].u4);

+

+    data[invocation].i4.x   =   int(subgroupExclusiveOr(data[0].i4.x < 0));

+    data[invocation].i4.xy  = ivec2(subgroupExclusiveOr(lessThan(data[1].i4.xy, ivec2(0))));

+    data[invocation].i4.xyz = ivec3(subgroupExclusiveOr(lessThan(data[1].i4.xyz, ivec3(0))));

+    data[invocation].i4     = ivec4(subgroupExclusiveOr(lessThan(data[1].i4, ivec4(0))));

+

+    data[invocation].i4.x   = subgroupExclusiveXor(data[0].i4.x);

+    data[invocation].i4.xy  = subgroupExclusiveXor(data[1].i4.xy);

+    data[invocation].i4.xyz = subgroupExclusiveXor(data[2].i4.xyz);

+    data[invocation].i4     = subgroupExclusiveXor(data[3].i4);

+

+    data[invocation].u4.x   = subgroupExclusiveXor(data[0].u4.x);

+    data[invocation].u4.xy  = subgroupExclusiveXor(data[1].u4.xy);

+    data[invocation].u4.xyz = subgroupExclusiveXor(data[2].u4.xyz);

+    data[invocation].u4     = subgroupExclusiveXor(data[3].u4);

+

+    data[invocation].i4.x   =   int(subgroupExclusiveXor(data[0].i4.x < 0));

+    data[invocation].i4.xy  = ivec2(subgroupExclusiveXor(lessThan(data[1].i4.xy, ivec2(0))));

+    data[invocation].i4.xyz = ivec3(subgroupExclusiveXor(lessThan(data[1].i4.xyz, ivec3(0))));

+    data[invocation].i4     = ivec4(subgroupExclusiveXor(lessThan(data[1].i4, ivec4(0))));

+}

diff --git a/Test/spv.vulkan100.subgroupPartitioned.comp b/Test/spv.vulkan100.subgroupPartitioned.comp
new file mode 100644
index 0000000..604833e
--- /dev/null
+++ b/Test/spv.vulkan100.subgroupPartitioned.comp
@@ -0,0 +1,420 @@
+#version 450

+

+#extension GL_NV_shader_subgroup_partitioned: enable

+

+layout (local_size_x = 8) in;

+

+layout(binding = 0) buffer Buffers

+{

+    vec4  f4;

+    ivec4 i4;

+    uvec4 u4;

+    dvec4 d4;

+} data[4];

+

+void main()

+{

+    uint invocation = (gl_SubgroupInvocationID + gl_SubgroupSize) % 4;

+

+    uvec4 ballot = subgroupPartitionNV(invocation);

+

+    data[invocation].u4 = subgroupPartitionNV(data[0].f4.x);

+    data[invocation].u4 = subgroupPartitionNV(data[0].f4.xy);

+    data[invocation].u4 = subgroupPartitionNV(data[0].f4.xyz);

+    data[invocation].u4 = subgroupPartitionNV(data[0].f4);

+

+    data[invocation].u4 = subgroupPartitionNV(data[0].i4.x);

+    data[invocation].u4 = subgroupPartitionNV(data[0].i4.xy);

+    data[invocation].u4 = subgroupPartitionNV(data[0].i4.xyz);

+    data[invocation].u4 = subgroupPartitionNV(data[0].i4);

+

+    data[invocation].u4 = subgroupPartitionNV(data[0].u4.x);

+    data[invocation].u4 = subgroupPartitionNV(data[0].u4.xy);

+    data[invocation].u4 = subgroupPartitionNV(data[0].u4.xyz);

+    data[invocation].u4 = subgroupPartitionNV(data[0].u4);

+

+    data[invocation].u4 = subgroupPartitionNV(data[0].d4.x);

+    data[invocation].u4 = subgroupPartitionNV(data[0].d4.xy);

+    data[invocation].u4 = subgroupPartitionNV(data[0].d4.xyz);

+    data[invocation].u4 = subgroupPartitionNV(data[0].d4);

+

+    data[invocation].u4 = subgroupPartitionNV(bool(data[0].i4.x));

+    data[invocation].u4 = subgroupPartitionNV(bvec2(data[0].i4.xy));

+    data[invocation].u4 = subgroupPartitionNV(bvec3(data[0].i4.xyz));

+    data[invocation].u4 = subgroupPartitionNV(bvec4(data[0].i4));

+

+    data[invocation].f4.x   = subgroupPartitionedAddNV(data[0].f4.x, ballot);

+    data[invocation].f4.xy  = subgroupPartitionedAddNV(data[1].f4.xy, ballot);

+    data[invocation].f4.xyz = subgroupPartitionedAddNV(data[2].f4.xyz, ballot);

+    data[invocation].f4     = subgroupPartitionedAddNV(data[3].f4, ballot);

+

+    data[invocation].i4.x   = subgroupPartitionedAddNV(data[0].i4.x, ballot);

+    data[invocation].i4.xy  = subgroupPartitionedAddNV(data[1].i4.xy, ballot);

+    data[invocation].i4.xyz = subgroupPartitionedAddNV(data[2].i4.xyz, ballot);

+    data[invocation].i4     = subgroupPartitionedAddNV(data[3].i4, ballot);

+

+    data[invocation].u4.x   = subgroupPartitionedAddNV(data[0].u4.x, ballot);

+    data[invocation].u4.xy  = subgroupPartitionedAddNV(data[1].u4.xy, ballot);

+    data[invocation].u4.xyz = subgroupPartitionedAddNV(data[2].u4.xyz, ballot);

+    data[invocation].u4     = subgroupPartitionedAddNV(data[3].u4, ballot);

+

+    data[invocation].d4.x   = subgroupPartitionedAddNV(data[0].d4.x, ballot);

+    data[invocation].d4.xy  = subgroupPartitionedAddNV(data[1].d4.xy, ballot);

+    data[invocation].d4.xyz = subgroupPartitionedAddNV(data[2].d4.xyz, ballot);

+    data[invocation].d4     = subgroupPartitionedAddNV(data[3].d4, ballot);

+

+    data[invocation].f4.x   = subgroupPartitionedMulNV(data[0].f4.x, ballot);

+    data[invocation].f4.xy  = subgroupPartitionedMulNV(data[1].f4.xy, ballot);

+    data[invocation].f4.xyz = subgroupPartitionedMulNV(data[2].f4.xyz, ballot);

+    data[invocation].f4     = subgroupPartitionedMulNV(data[3].f4, ballot);

+

+    data[invocation].i4.x   = subgroupPartitionedMulNV(data[0].i4.x, ballot);

+    data[invocation].i4.xy  = subgroupPartitionedMulNV(data[1].i4.xy, ballot);

+    data[invocation].i4.xyz = subgroupPartitionedMulNV(data[2].i4.xyz, ballot);

+    data[invocation].i4     = subgroupPartitionedMulNV(data[3].i4, ballot);

+

+    data[invocation].u4.x   = subgroupPartitionedMulNV(data[0].u4.x, ballot);

+    data[invocation].u4.xy  = subgroupPartitionedMulNV(data[1].u4.xy, ballot);

+    data[invocation].u4.xyz = subgroupPartitionedMulNV(data[2].u4.xyz, ballot);

+    data[invocation].u4     = subgroupPartitionedMulNV(data[3].u4, ballot);

+

+    data[invocation].d4.x   = subgroupPartitionedMulNV(data[0].d4.x, ballot);

+    data[invocation].d4.xy  = subgroupPartitionedMulNV(data[1].d4.xy, ballot);

+    data[invocation].d4.xyz = subgroupPartitionedMulNV(data[2].d4.xyz, ballot);

+    data[invocation].d4     = subgroupPartitionedMulNV(data[3].d4, ballot);

+

+    data[invocation].f4.x   = subgroupPartitionedMinNV(data[0].f4.x, ballot);

+    data[invocation].f4.xy  = subgroupPartitionedMinNV(data[1].f4.xy, ballot);

+    data[invocation].f4.xyz = subgroupPartitionedMinNV(data[2].f4.xyz, ballot);

+    data[invocation].f4     = subgroupPartitionedMinNV(data[3].f4, ballot);

+

+    data[invocation].i4.x   = subgroupPartitionedMinNV(data[0].i4.x, ballot);

+    data[invocation].i4.xy  = subgroupPartitionedMinNV(data[1].i4.xy, ballot);

+    data[invocation].i4.xyz = subgroupPartitionedMinNV(data[2].i4.xyz, ballot);

+    data[invocation].i4     = subgroupPartitionedMinNV(data[3].i4, ballot);

+

+    data[invocation].u4.x   = subgroupPartitionedMinNV(data[0].u4.x, ballot);

+    data[invocation].u4.xy  = subgroupPartitionedMinNV(data[1].u4.xy, ballot);

+    data[invocation].u4.xyz = subgroupPartitionedMinNV(data[2].u4.xyz, ballot);

+    data[invocation].u4     = subgroupPartitionedMinNV(data[3].u4, ballot);

+

+    data[invocation].d4.x   = subgroupPartitionedMinNV(data[0].d4.x, ballot);

+    data[invocation].d4.xy  = subgroupPartitionedMinNV(data[1].d4.xy, ballot);

+    data[invocation].d4.xyz = subgroupPartitionedMinNV(data[2].d4.xyz, ballot);

+    data[invocation].d4     = subgroupPartitionedMinNV(data[3].d4, ballot);

+

+    data[invocation].f4.x   = subgroupPartitionedMaxNV(data[0].f4.x, ballot);

+    data[invocation].f4.xy  = subgroupPartitionedMaxNV(data[1].f4.xy, ballot);

+    data[invocation].f4.xyz = subgroupPartitionedMaxNV(data[2].f4.xyz, ballot);

+    data[invocation].f4     = subgroupPartitionedMaxNV(data[3].f4, ballot);

+

+    data[invocation].i4.x   = subgroupPartitionedMaxNV(data[0].i4.x, ballot);

+    data[invocation].i4.xy  = subgroupPartitionedMaxNV(data[1].i4.xy, ballot);

+    data[invocation].i4.xyz = subgroupPartitionedMaxNV(data[2].i4.xyz, ballot);

+    data[invocation].i4     = subgroupPartitionedMaxNV(data[3].i4, ballot);

+

+    data[invocation].u4.x   = subgroupPartitionedMaxNV(data[0].u4.x, ballot);

+    data[invocation].u4.xy  = subgroupPartitionedMaxNV(data[1].u4.xy, ballot);

+    data[invocation].u4.xyz = subgroupPartitionedMaxNV(data[2].u4.xyz, ballot);

+    data[invocation].u4     = subgroupPartitionedMaxNV(data[3].u4, ballot);

+

+    data[invocation].d4.x   = subgroupPartitionedMaxNV(data[0].d4.x, ballot);

+    data[invocation].d4.xy  = subgroupPartitionedMaxNV(data[1].d4.xy, ballot);

+    data[invocation].d4.xyz = subgroupPartitionedMaxNV(data[2].d4.xyz, ballot);

+    data[invocation].d4     = subgroupPartitionedMaxNV(data[3].d4, ballot);

+

+    data[invocation].i4.x   = subgroupPartitionedAndNV(data[0].i4.x, ballot);

+    data[invocation].i4.xy  = subgroupPartitionedAndNV(data[1].i4.xy, ballot);

+    data[invocation].i4.xyz = subgroupPartitionedAndNV(data[2].i4.xyz, ballot);

+    data[invocation].i4     = subgroupPartitionedAndNV(data[3].i4, ballot);

+

+    data[invocation].u4.x   = subgroupPartitionedAndNV(data[0].u4.x, ballot);

+    data[invocation].u4.xy  = subgroupPartitionedAndNV(data[1].u4.xy, ballot);

+    data[invocation].u4.xyz = subgroupPartitionedAndNV(data[2].u4.xyz, ballot);

+    data[invocation].u4     = subgroupPartitionedAndNV(data[3].u4, ballot);

+

+    data[invocation].i4.x   =   int(subgroupPartitionedAndNV(data[0].i4.x < 0, ballot));

+    data[invocation].i4.xy  = ivec2(subgroupPartitionedAndNV(lessThan(data[1].i4.xy, ivec2(0)), ballot));

+    data[invocation].i4.xyz = ivec3(subgroupPartitionedAndNV(lessThan(data[1].i4.xyz, ivec3(0)), ballot));

+    data[invocation].i4     = ivec4(subgroupPartitionedAndNV(lessThan(data[1].i4, ivec4(0)), ballot));

+

+    data[invocation].i4.x   = subgroupPartitionedOrNV(data[0].i4.x, ballot);

+    data[invocation].i4.xy  = subgroupPartitionedOrNV(data[1].i4.xy, ballot);

+    data[invocation].i4.xyz = subgroupPartitionedOrNV(data[2].i4.xyz, ballot);

+    data[invocation].i4     = subgroupPartitionedOrNV(data[3].i4, ballot);

+

+    data[invocation].u4.x   = subgroupPartitionedOrNV(data[0].u4.x, ballot);

+    data[invocation].u4.xy  = subgroupPartitionedOrNV(data[1].u4.xy, ballot);

+    data[invocation].u4.xyz = subgroupPartitionedOrNV(data[2].u4.xyz, ballot);

+    data[invocation].u4     = subgroupPartitionedOrNV(data[3].u4, ballot);

+

+    data[invocation].i4.x   =   int(subgroupPartitionedOrNV(data[0].i4.x < 0, ballot));

+    data[invocation].i4.xy  = ivec2(subgroupPartitionedOrNV(lessThan(data[1].i4.xy, ivec2(0)), ballot));

+    data[invocation].i4.xyz = ivec3(subgroupPartitionedOrNV(lessThan(data[1].i4.xyz, ivec3(0)), ballot));

+    data[invocation].i4     = ivec4(subgroupPartitionedOrNV(lessThan(data[1].i4, ivec4(0)), ballot));

+

+    data[invocation].i4.x   = subgroupPartitionedXorNV(data[0].i4.x, ballot);

+    data[invocation].i4.xy  = subgroupPartitionedXorNV(data[1].i4.xy, ballot);

+    data[invocation].i4.xyz = subgroupPartitionedXorNV(data[2].i4.xyz, ballot);

+    data[invocation].i4     = subgroupPartitionedXorNV(data[3].i4, ballot);

+

+    data[invocation].u4.x   = subgroupPartitionedXorNV(data[0].u4.x, ballot);

+    data[invocation].u4.xy  = subgroupPartitionedXorNV(data[1].u4.xy, ballot);

+    data[invocation].u4.xyz = subgroupPartitionedXorNV(data[2].u4.xyz, ballot);

+    data[invocation].u4     = subgroupPartitionedXorNV(data[3].u4, ballot);

+

+    data[invocation].i4.x   =   int(subgroupPartitionedXorNV(data[0].i4.x < 0, ballot));

+    data[invocation].i4.xy  = ivec2(subgroupPartitionedXorNV(lessThan(data[1].i4.xy, ivec2(0)), ballot));

+    data[invocation].i4.xyz = ivec3(subgroupPartitionedXorNV(lessThan(data[1].i4.xyz, ivec3(0)), ballot));

+    data[invocation].i4     = ivec4(subgroupPartitionedXorNV(lessThan(data[1].i4, ivec4(0)), ballot));

+

+    data[invocation].f4.x   = subgroupPartitionedInclusiveAddNV(data[0].f4.x, ballot);

+    data[invocation].f4.xy  = subgroupPartitionedInclusiveAddNV(data[1].f4.xy, ballot);

+    data[invocation].f4.xyz = subgroupPartitionedInclusiveAddNV(data[2].f4.xyz, ballot);

+    data[invocation].f4     = subgroupPartitionedInclusiveAddNV(data[3].f4, ballot);

+

+    data[invocation].i4.x   = subgroupPartitionedInclusiveAddNV(data[0].i4.x, ballot);

+    data[invocation].i4.xy  = subgroupPartitionedInclusiveAddNV(data[1].i4.xy, ballot);

+    data[invocation].i4.xyz = subgroupPartitionedInclusiveAddNV(data[2].i4.xyz, ballot);

+    data[invocation].i4     = subgroupPartitionedInclusiveAddNV(data[3].i4, ballot);

+

+    data[invocation].u4.x   = subgroupPartitionedInclusiveAddNV(data[0].u4.x, ballot);

+    data[invocation].u4.xy  = subgroupPartitionedInclusiveAddNV(data[1].u4.xy, ballot);

+    data[invocation].u4.xyz = subgroupPartitionedInclusiveAddNV(data[2].u4.xyz, ballot);

+    data[invocation].u4     = subgroupPartitionedInclusiveAddNV(data[3].u4, ballot);

+

+    data[invocation].d4.x   = subgroupPartitionedInclusiveAddNV(data[0].d4.x, ballot);

+    data[invocation].d4.xy  = subgroupPartitionedInclusiveAddNV(data[1].d4.xy, ballot);

+    data[invocation].d4.xyz = subgroupPartitionedInclusiveAddNV(data[2].d4.xyz, ballot);

+    data[invocation].d4     = subgroupPartitionedInclusiveAddNV(data[3].d4, ballot);

+

+    data[invocation].f4.x   = subgroupPartitionedInclusiveMulNV(data[0].f4.x, ballot);

+    data[invocation].f4.xy  = subgroupPartitionedInclusiveMulNV(data[1].f4.xy, ballot);

+    data[invocation].f4.xyz = subgroupPartitionedInclusiveMulNV(data[2].f4.xyz, ballot);

+    data[invocation].f4     = subgroupPartitionedInclusiveMulNV(data[3].f4, ballot);

+

+    data[invocation].i4.x   = subgroupPartitionedInclusiveMulNV(data[0].i4.x, ballot);

+    data[invocation].i4.xy  = subgroupPartitionedInclusiveMulNV(data[1].i4.xy, ballot);

+    data[invocation].i4.xyz = subgroupPartitionedInclusiveMulNV(data[2].i4.xyz, ballot);

+    data[invocation].i4     = subgroupPartitionedInclusiveMulNV(data[3].i4, ballot);

+

+    data[invocation].u4.x   = subgroupPartitionedInclusiveMulNV(data[0].u4.x, ballot);

+    data[invocation].u4.xy  = subgroupPartitionedInclusiveMulNV(data[1].u4.xy, ballot);

+    data[invocation].u4.xyz = subgroupPartitionedInclusiveMulNV(data[2].u4.xyz, ballot);

+    data[invocation].u4     = subgroupPartitionedInclusiveMulNV(data[3].u4, ballot);

+

+    data[invocation].d4.x   = subgroupPartitionedInclusiveMulNV(data[0].d4.x, ballot);

+    data[invocation].d4.xy  = subgroupPartitionedInclusiveMulNV(data[1].d4.xy, ballot);

+    data[invocation].d4.xyz = subgroupPartitionedInclusiveMulNV(data[2].d4.xyz, ballot);

+    data[invocation].d4     = subgroupPartitionedInclusiveMulNV(data[3].d4, ballot);

+

+    data[invocation].f4.x   = subgroupPartitionedInclusiveMinNV(data[0].f4.x, ballot);

+    data[invocation].f4.xy  = subgroupPartitionedInclusiveMinNV(data[1].f4.xy, ballot);

+    data[invocation].f4.xyz = subgroupPartitionedInclusiveMinNV(data[2].f4.xyz, ballot);

+    data[invocation].f4     = subgroupPartitionedInclusiveMinNV(data[3].f4, ballot);

+

+    data[invocation].i4.x   = subgroupPartitionedInclusiveMinNV(data[0].i4.x, ballot);

+    data[invocation].i4.xy  = subgroupPartitionedInclusiveMinNV(data[1].i4.xy, ballot);

+    data[invocation].i4.xyz = subgroupPartitionedInclusiveMinNV(data[2].i4.xyz, ballot);

+    data[invocation].i4     = subgroupPartitionedInclusiveMinNV(data[3].i4, ballot);

+

+    data[invocation].u4.x   = subgroupPartitionedInclusiveMinNV(data[0].u4.x, ballot);

+    data[invocation].u4.xy  = subgroupPartitionedInclusiveMinNV(data[1].u4.xy, ballot);

+    data[invocation].u4.xyz = subgroupPartitionedInclusiveMinNV(data[2].u4.xyz, ballot);

+    data[invocation].u4     = subgroupPartitionedInclusiveMinNV(data[3].u4, ballot);

+

+    data[invocation].d4.x   = subgroupPartitionedInclusiveMinNV(data[0].d4.x, ballot);

+    data[invocation].d4.xy  = subgroupPartitionedInclusiveMinNV(data[1].d4.xy, ballot);

+    data[invocation].d4.xyz = subgroupPartitionedInclusiveMinNV(data[2].d4.xyz, ballot);

+    data[invocation].d4     = subgroupPartitionedInclusiveMinNV(data[3].d4, ballot);

+

+    data[invocation].f4.x   = subgroupPartitionedInclusiveMaxNV(data[0].f4.x, ballot);

+    data[invocation].f4.xy  = subgroupPartitionedInclusiveMaxNV(data[1].f4.xy, ballot);

+    data[invocation].f4.xyz = subgroupPartitionedInclusiveMaxNV(data[2].f4.xyz, ballot);

+    data[invocation].f4     = subgroupPartitionedInclusiveMaxNV(data[3].f4, ballot);

+

+    data[invocation].i4.x   = subgroupPartitionedInclusiveMaxNV(data[0].i4.x, ballot);

+    data[invocation].i4.xy  = subgroupPartitionedInclusiveMaxNV(data[1].i4.xy, ballot);

+    data[invocation].i4.xyz = subgroupPartitionedInclusiveMaxNV(data[2].i4.xyz, ballot);

+    data[invocation].i4     = subgroupPartitionedInclusiveMaxNV(data[3].i4, ballot);

+

+    data[invocation].u4.x   = subgroupPartitionedInclusiveMaxNV(data[0].u4.x, ballot);

+    data[invocation].u4.xy  = subgroupPartitionedInclusiveMaxNV(data[1].u4.xy, ballot);

+    data[invocation].u4.xyz = subgroupPartitionedInclusiveMaxNV(data[2].u4.xyz, ballot);

+    data[invocation].u4     = subgroupPartitionedInclusiveMaxNV(data[3].u4, ballot);

+

+    data[invocation].d4.x   = subgroupPartitionedInclusiveMaxNV(data[0].d4.x, ballot);

+    data[invocation].d4.xy  = subgroupPartitionedInclusiveMaxNV(data[1].d4.xy, ballot);

+    data[invocation].d4.xyz = subgroupPartitionedInclusiveMaxNV(data[2].d4.xyz, ballot);

+    data[invocation].d4     = subgroupPartitionedInclusiveMaxNV(data[3].d4, ballot);

+

+    data[invocation].i4.x   = subgroupPartitionedInclusiveAndNV(data[0].i4.x, ballot);

+    data[invocation].i4.xy  = subgroupPartitionedInclusiveAndNV(data[1].i4.xy, ballot);

+    data[invocation].i4.xyz = subgroupPartitionedInclusiveAndNV(data[2].i4.xyz, ballot);

+    data[invocation].i4     = subgroupPartitionedInclusiveAndNV(data[3].i4, ballot);

+

+    data[invocation].u4.x   = subgroupPartitionedInclusiveAndNV(data[0].u4.x, ballot);

+    data[invocation].u4.xy  = subgroupPartitionedInclusiveAndNV(data[1].u4.xy, ballot);

+    data[invocation].u4.xyz = subgroupPartitionedInclusiveAndNV(data[2].u4.xyz, ballot);

+    data[invocation].u4     = subgroupPartitionedInclusiveAndNV(data[3].u4, ballot);

+

+    data[invocation].i4.x   =   int(subgroupPartitionedInclusiveAndNV(data[0].i4.x < 0, ballot));

+    data[invocation].i4.xy  = ivec2(subgroupPartitionedInclusiveAndNV(lessThan(data[1].i4.xy, ivec2(0)), ballot));

+    data[invocation].i4.xyz = ivec3(subgroupPartitionedInclusiveAndNV(lessThan(data[1].i4.xyz, ivec3(0)), ballot));

+    data[invocation].i4     = ivec4(subgroupPartitionedInclusiveAndNV(lessThan(data[1].i4, ivec4(0)), ballot));

+

+    data[invocation].i4.x   = subgroupPartitionedInclusiveOrNV(data[0].i4.x, ballot);

+    data[invocation].i4.xy  = subgroupPartitionedInclusiveOrNV(data[1].i4.xy, ballot);

+    data[invocation].i4.xyz = subgroupPartitionedInclusiveOrNV(data[2].i4.xyz, ballot);

+    data[invocation].i4     = subgroupPartitionedInclusiveOrNV(data[3].i4, ballot);

+

+    data[invocation].u4.x   = subgroupPartitionedInclusiveOrNV(data[0].u4.x, ballot);

+    data[invocation].u4.xy  = subgroupPartitionedInclusiveOrNV(data[1].u4.xy, ballot);

+    data[invocation].u4.xyz = subgroupPartitionedInclusiveOrNV(data[2].u4.xyz, ballot);

+    data[invocation].u4     = subgroupPartitionedInclusiveOrNV(data[3].u4, ballot);

+

+    data[invocation].i4.x   =   int(subgroupPartitionedInclusiveOrNV(data[0].i4.x < 0, ballot));

+    data[invocation].i4.xy  = ivec2(subgroupPartitionedInclusiveOrNV(lessThan(data[1].i4.xy, ivec2(0)), ballot));

+    data[invocation].i4.xyz = ivec3(subgroupPartitionedInclusiveOrNV(lessThan(data[1].i4.xyz, ivec3(0)), ballot));

+    data[invocation].i4     = ivec4(subgroupPartitionedInclusiveOrNV(lessThan(data[1].i4, ivec4(0)), ballot));

+

+    data[invocation].i4.x   = subgroupPartitionedInclusiveXorNV(data[0].i4.x, ballot);

+    data[invocation].i4.xy  = subgroupPartitionedInclusiveXorNV(data[1].i4.xy, ballot);

+    data[invocation].i4.xyz = subgroupPartitionedInclusiveXorNV(data[2].i4.xyz, ballot);

+    data[invocation].i4     = subgroupPartitionedInclusiveXorNV(data[3].i4, ballot);

+

+    data[invocation].u4.x   = subgroupPartitionedInclusiveXorNV(data[0].u4.x, ballot);

+    data[invocation].u4.xy  = subgroupPartitionedInclusiveXorNV(data[1].u4.xy, ballot);

+    data[invocation].u4.xyz = subgroupPartitionedInclusiveXorNV(data[2].u4.xyz, ballot);

+    data[invocation].u4     = subgroupPartitionedInclusiveXorNV(data[3].u4, ballot);

+

+    data[invocation].i4.x   =   int(subgroupPartitionedInclusiveXorNV(data[0].i4.x < 0, ballot));

+    data[invocation].i4.xy  = ivec2(subgroupPartitionedInclusiveXorNV(lessThan(data[1].i4.xy, ivec2(0)), ballot));

+    data[invocation].i4.xyz = ivec3(subgroupPartitionedInclusiveXorNV(lessThan(data[1].i4.xyz, ivec3(0)), ballot));

+    data[invocation].i4     = ivec4(subgroupPartitionedInclusiveXorNV(lessThan(data[1].i4, ivec4(0)), ballot));

+

+    data[invocation].f4.x   = subgroupPartitionedExclusiveAddNV(data[0].f4.x, ballot);

+    data[invocation].f4.xy  = subgroupPartitionedExclusiveAddNV(data[1].f4.xy, ballot);

+    data[invocation].f4.xyz = subgroupPartitionedExclusiveAddNV(data[2].f4.xyz, ballot);

+    data[invocation].f4     = subgroupPartitionedExclusiveAddNV(data[3].f4, ballot);

+

+    data[invocation].i4.x   = subgroupPartitionedExclusiveAddNV(data[0].i4.x, ballot);

+    data[invocation].i4.xy  = subgroupPartitionedExclusiveAddNV(data[1].i4.xy, ballot);

+    data[invocation].i4.xyz = subgroupPartitionedExclusiveAddNV(data[2].i4.xyz, ballot);

+    data[invocation].i4     = subgroupPartitionedExclusiveAddNV(data[3].i4, ballot);

+

+    data[invocation].u4.x   = subgroupPartitionedExclusiveAddNV(data[0].u4.x, ballot);

+    data[invocation].u4.xy  = subgroupPartitionedExclusiveAddNV(data[1].u4.xy, ballot);

+    data[invocation].u4.xyz = subgroupPartitionedExclusiveAddNV(data[2].u4.xyz, ballot);

+    data[invocation].u4     = subgroupPartitionedExclusiveAddNV(data[3].u4, ballot);

+

+    data[invocation].d4.x   = subgroupPartitionedExclusiveAddNV(data[0].d4.x, ballot);

+    data[invocation].d4.xy  = subgroupPartitionedExclusiveAddNV(data[1].d4.xy, ballot);

+    data[invocation].d4.xyz = subgroupPartitionedExclusiveAddNV(data[2].d4.xyz, ballot);

+    data[invocation].d4     = subgroupPartitionedExclusiveAddNV(data[3].d4, ballot);

+

+    data[invocation].f4.x   = subgroupPartitionedExclusiveMulNV(data[0].f4.x, ballot);

+    data[invocation].f4.xy  = subgroupPartitionedExclusiveMulNV(data[1].f4.xy, ballot);

+    data[invocation].f4.xyz = subgroupPartitionedExclusiveMulNV(data[2].f4.xyz, ballot);

+    data[invocation].f4     = subgroupPartitionedExclusiveMulNV(data[3].f4, ballot);

+

+    data[invocation].i4.x   = subgroupPartitionedExclusiveMulNV(data[0].i4.x, ballot);

+    data[invocation].i4.xy  = subgroupPartitionedExclusiveMulNV(data[1].i4.xy, ballot);

+    data[invocation].i4.xyz = subgroupPartitionedExclusiveMulNV(data[2].i4.xyz, ballot);

+    data[invocation].i4     = subgroupPartitionedExclusiveMulNV(data[3].i4, ballot);

+

+    data[invocation].u4.x   = subgroupPartitionedExclusiveMulNV(data[0].u4.x, ballot);

+    data[invocation].u4.xy  = subgroupPartitionedExclusiveMulNV(data[1].u4.xy, ballot);

+    data[invocation].u4.xyz = subgroupPartitionedExclusiveMulNV(data[2].u4.xyz, ballot);

+    data[invocation].u4     = subgroupPartitionedExclusiveMulNV(data[3].u4, ballot);

+

+    data[invocation].d4.x   = subgroupPartitionedExclusiveMulNV(data[0].d4.x, ballot);

+    data[invocation].d4.xy  = subgroupPartitionedExclusiveMulNV(data[1].d4.xy, ballot);

+    data[invocation].d4.xyz = subgroupPartitionedExclusiveMulNV(data[2].d4.xyz, ballot);

+    data[invocation].d4     = subgroupPartitionedExclusiveMulNV(data[3].d4, ballot);

+

+    data[invocation].f4.x   = subgroupPartitionedExclusiveMinNV(data[0].f4.x, ballot);

+    data[invocation].f4.xy  = subgroupPartitionedExclusiveMinNV(data[1].f4.xy, ballot);

+    data[invocation].f4.xyz = subgroupPartitionedExclusiveMinNV(data[2].f4.xyz, ballot);

+    data[invocation].f4     = subgroupPartitionedExclusiveMinNV(data[3].f4, ballot);

+

+    data[invocation].i4.x   = subgroupPartitionedExclusiveMinNV(data[0].i4.x, ballot);

+    data[invocation].i4.xy  = subgroupPartitionedExclusiveMinNV(data[1].i4.xy, ballot);

+    data[invocation].i4.xyz = subgroupPartitionedExclusiveMinNV(data[2].i4.xyz, ballot);

+    data[invocation].i4     = subgroupPartitionedExclusiveMinNV(data[3].i4, ballot);

+

+    data[invocation].u4.x   = subgroupPartitionedExclusiveMinNV(data[0].u4.x, ballot);

+    data[invocation].u4.xy  = subgroupPartitionedExclusiveMinNV(data[1].u4.xy, ballot);

+    data[invocation].u4.xyz = subgroupPartitionedExclusiveMinNV(data[2].u4.xyz, ballot);

+    data[invocation].u4     = subgroupPartitionedExclusiveMinNV(data[3].u4, ballot);

+

+    data[invocation].d4.x   = subgroupPartitionedExclusiveMinNV(data[0].d4.x, ballot);

+    data[invocation].d4.xy  = subgroupPartitionedExclusiveMinNV(data[1].d4.xy, ballot);

+    data[invocation].d4.xyz = subgroupPartitionedExclusiveMinNV(data[2].d4.xyz, ballot);

+    data[invocation].d4     = subgroupPartitionedExclusiveMinNV(data[3].d4, ballot);

+

+    data[invocation].f4.x   = subgroupPartitionedExclusiveMaxNV(data[0].f4.x, ballot);

+    data[invocation].f4.xy  = subgroupPartitionedExclusiveMaxNV(data[1].f4.xy, ballot);

+    data[invocation].f4.xyz = subgroupPartitionedExclusiveMaxNV(data[2].f4.xyz, ballot);

+    data[invocation].f4     = subgroupPartitionedExclusiveMaxNV(data[3].f4, ballot);

+

+    data[invocation].i4.x   = subgroupPartitionedExclusiveMaxNV(data[0].i4.x, ballot);

+    data[invocation].i4.xy  = subgroupPartitionedExclusiveMaxNV(data[1].i4.xy, ballot);

+    data[invocation].i4.xyz = subgroupPartitionedExclusiveMaxNV(data[2].i4.xyz, ballot);

+    data[invocation].i4     = subgroupPartitionedExclusiveMaxNV(data[3].i4, ballot);

+

+    data[invocation].u4.x   = subgroupPartitionedExclusiveMaxNV(data[0].u4.x, ballot);

+    data[invocation].u4.xy  = subgroupPartitionedExclusiveMaxNV(data[1].u4.xy, ballot);

+    data[invocation].u4.xyz = subgroupPartitionedExclusiveMaxNV(data[2].u4.xyz, ballot);

+    data[invocation].u4     = subgroupPartitionedExclusiveMaxNV(data[3].u4, ballot);

+

+    data[invocation].d4.x   = subgroupPartitionedExclusiveMaxNV(data[0].d4.x, ballot);

+    data[invocation].d4.xy  = subgroupPartitionedExclusiveMaxNV(data[1].d4.xy, ballot);

+    data[invocation].d4.xyz = subgroupPartitionedExclusiveMaxNV(data[2].d4.xyz, ballot);

+    data[invocation].d4     = subgroupPartitionedExclusiveMaxNV(data[3].d4, ballot);

+

+    data[invocation].i4.x   = subgroupPartitionedExclusiveAndNV(data[0].i4.x, ballot);

+    data[invocation].i4.xy  = subgroupPartitionedExclusiveAndNV(data[1].i4.xy, ballot);

+    data[invocation].i4.xyz = subgroupPartitionedExclusiveAndNV(data[2].i4.xyz, ballot);

+    data[invocation].i4     = subgroupPartitionedExclusiveAndNV(data[3].i4, ballot);

+

+    data[invocation].u4.x   = subgroupPartitionedExclusiveAndNV(data[0].u4.x, ballot);

+    data[invocation].u4.xy  = subgroupPartitionedExclusiveAndNV(data[1].u4.xy, ballot);

+    data[invocation].u4.xyz = subgroupPartitionedExclusiveAndNV(data[2].u4.xyz, ballot);

+    data[invocation].u4     = subgroupPartitionedExclusiveAndNV(data[3].u4, ballot);

+

+    data[invocation].i4.x   =   int(subgroupPartitionedExclusiveAndNV(data[0].i4.x < 0, ballot));

+    data[invocation].i4.xy  = ivec2(subgroupPartitionedExclusiveAndNV(lessThan(data[1].i4.xy, ivec2(0)), ballot));

+    data[invocation].i4.xyz = ivec3(subgroupPartitionedExclusiveAndNV(lessThan(data[1].i4.xyz, ivec3(0)), ballot));

+    data[invocation].i4     = ivec4(subgroupPartitionedExclusiveAndNV(lessThan(data[1].i4, ivec4(0)), ballot));

+

+    data[invocation].i4.x   = subgroupPartitionedExclusiveOrNV(data[0].i4.x, ballot);

+    data[invocation].i4.xy  = subgroupPartitionedExclusiveOrNV(data[1].i4.xy, ballot);

+    data[invocation].i4.xyz = subgroupPartitionedExclusiveOrNV(data[2].i4.xyz, ballot);

+    data[invocation].i4     = subgroupPartitionedExclusiveOrNV(data[3].i4, ballot);

+

+    data[invocation].u4.x   = subgroupPartitionedExclusiveOrNV(data[0].u4.x, ballot);

+    data[invocation].u4.xy  = subgroupPartitionedExclusiveOrNV(data[1].u4.xy, ballot);

+    data[invocation].u4.xyz = subgroupPartitionedExclusiveOrNV(data[2].u4.xyz, ballot);

+    data[invocation].u4     = subgroupPartitionedExclusiveOrNV(data[3].u4, ballot);

+

+    data[invocation].i4.x   =   int(subgroupPartitionedExclusiveOrNV(data[0].i4.x < 0, ballot));

+    data[invocation].i4.xy  = ivec2(subgroupPartitionedExclusiveOrNV(lessThan(data[1].i4.xy, ivec2(0)), ballot));

+    data[invocation].i4.xyz = ivec3(subgroupPartitionedExclusiveOrNV(lessThan(data[1].i4.xyz, ivec3(0)), ballot));

+    data[invocation].i4     = ivec4(subgroupPartitionedExclusiveOrNV(lessThan(data[1].i4, ivec4(0)), ballot));

+

+    data[invocation].i4.x   = subgroupPartitionedExclusiveXorNV(data[0].i4.x, ballot);

+    data[invocation].i4.xy  = subgroupPartitionedExclusiveXorNV(data[1].i4.xy, ballot);

+    data[invocation].i4.xyz = subgroupPartitionedExclusiveXorNV(data[2].i4.xyz, ballot);

+    data[invocation].i4     = subgroupPartitionedExclusiveXorNV(data[3].i4, ballot);

+

+    data[invocation].u4.x   = subgroupPartitionedExclusiveXorNV(data[0].u4.x, ballot);

+    data[invocation].u4.xy  = subgroupPartitionedExclusiveXorNV(data[1].u4.xy, ballot);

+    data[invocation].u4.xyz = subgroupPartitionedExclusiveXorNV(data[2].u4.xyz, ballot);

+    data[invocation].u4     = subgroupPartitionedExclusiveXorNV(data[3].u4, ballot);

+

+    data[invocation].i4.x   =   int(subgroupPartitionedExclusiveXorNV(data[0].i4.x < 0, ballot));

+    data[invocation].i4.xy  = ivec2(subgroupPartitionedExclusiveXorNV(lessThan(data[1].i4.xy, ivec2(0)), ballot));

+    data[invocation].i4.xyz = ivec3(subgroupPartitionedExclusiveXorNV(lessThan(data[1].i4.xyz, ivec3(0)), ballot));

+    data[invocation].i4     = ivec4(subgroupPartitionedExclusiveXorNV(lessThan(data[1].i4, ivec4(0)), ballot));

+}

diff --git a/Test/spv.vulkan110.int16.frag b/Test/spv.vulkan110.int16.frag
new file mode 100644
index 0000000..2feff4f
--- /dev/null
+++ b/Test/spv.vulkan110.int16.frag
@@ -0,0 +1,251 @@
+#version 450
+
+#extension GL_EXT_shader_explicit_arithmetic_types: enable
+#extension GL_EXT_shader_explicit_arithmetic_types_int8: require
+#extension GL_EXT_shader_explicit_arithmetic_types_int16: require
+#extension GL_EXT_shader_explicit_arithmetic_types_int32: require
+#extension GL_EXT_shader_explicit_arithmetic_types_int64: require
+#extension GL_EXT_shader_explicit_arithmetic_types_float16: require
+#extension GL_EXT_shader_explicit_arithmetic_types_float32: require
+#extension GL_EXT_shader_explicit_arithmetic_types_float64: require
+
+layout(binding = 0) uniform Uniforms
+{
+    uint index;
+};
+
+layout(std140, binding = 1) uniform Block
+{
+    int16_t   i16;
+    i16vec2   i16v2;
+    i16vec3   i16v3;
+    i16vec4   i16v4;
+    uint16_t  u16;
+    u16vec2   u16v2;
+    u16vec3   u16v3;
+    u16vec4   u16v4;
+} block;
+
+void main()
+{
+}
+
+void literal()
+{
+    const int16_t i16Const[3] =
+    {
+        int16_t(-0x1111),           // Hex
+        int16_t(-1),                // Dec
+        int16_t(040000),            // Oct
+    };
+
+    int16_t i16 = i16Const[index];
+
+    const uint16_t u16Const[] =
+    {
+        uint16_t(0xFFFF),             // Hex
+        uint16_t(65535),              // Dec
+        uint16_t(077777),             // Oct
+    };
+
+    uint16_t u16 = u16Const[index];
+}
+
+void typeCast16()
+{
+    i8vec2 i8v;
+    u8vec2 u8v;
+    i16vec2 i16v;
+    u16vec2 u16v;
+    i32vec2 i32v;
+    u32vec2 u32v;
+    i64vec2 i64v;
+    u64vec2 u64v;
+    f16vec2 f16v;
+    f32vec2 f32v;
+    f64vec2 f64v;
+    bvec2   bv;
+
+    i32v = i16v;     // int16_t  ->   int32_t
+    i32v = u16v;     // uint16_t ->   int32_t
+    u16v = i16v;     // int16_t  ->  uint16_t
+    u32v = i16v;     // int16_t  ->  uint32_t
+    i64v = i16v;     // int16_t  ->   int64_t
+    u64v = i16v;     // int16_t  ->  uint64_t
+    u32v = u16v;     // uint16_t ->  uint32_t
+    i64v = u16v;     // uint16_t ->   int64_t
+    u64v = u16v;     // uint16_t ->  uint64_t
+    f16v = i16v;     // int16_t  ->  float16_t
+    f32v = i16v;     // int16_t  ->  float32_t
+    f64v = i16v;     // int16_t  ->  float64_t
+    f16v = u16v;     // uint16_t ->  float16_t
+    f32v = u16v;     // uint16_t ->  float32_t
+    f64v = u16v;     // uint16_t ->  float64_t
+
+    i32v = i32vec2(i16v);     // int16_t  ->   int32_t
+    i32v = i32vec2(u16v);     // uint16_t ->   int32_t
+    u16v = u16vec2(i16v);     // int16_t  ->  uint16_t
+    u32v = u32vec2(i16v);     // int16_t  ->  uint32_t
+    i64v = i64vec2(i16v);     // int16_t  ->   int64_t
+    u64v = i64vec2(i16v);     // int16_t  ->  uint64_t
+    u32v = u32vec2(u16v);     // uint16_t ->  uint32_t
+    i64v = i64vec2(u16v);     // uint16_t ->   int64_t
+    u64v = i64vec2(u16v);     // uint16_t ->  uint64_t
+    f16v = f16vec2(i16v);     // int16_t  ->  float16_t
+    f32v = f32vec2(i16v);     // int16_t  ->  float32_t
+    f64v = f64vec2(i16v);     // int16_t  ->  float64_t
+    f16v = f16vec2(u16v);     // uint16_t ->  float16_t
+    f32v = f32vec2(u16v);     // uint16_t ->  float32_t
+    f64v = f64vec2(u16v);     // uint16_t ->  float64_t
+
+    i8v  = i8vec2(i16v);      // int16_t  ->   int8_t
+    i8v  = i8vec2(u16v);      // uint16_t ->   int8_t
+    u8v  = u8vec2(i16v);      // int16_t  ->  uint8_t
+    u8v  = u8vec2(u16v);      // uint16_t ->  uint8_t
+    i16v = u8vec2(u16v);      // uint16_t ->   int16_t
+    i16v = i16vec2(bv);       // bool     ->   int16
+    u16v = u16vec2(bv);       // bool     ->   uint16
+    bv   = bvec2(i16v);       // int16    ->   bool
+    bv   = bvec2(u16v);       // uint16   ->   bool
+}
+void operators()
+{
+    u16vec3 u16v;
+    int16_t i16;
+    uvec3   uv;
+    int32_t i;
+    int64_t i64;
+    bool    b;
+
+    // Unary
+    u16v++;
+    i16--;
+    ++i16;
+    --u16v;
+
+    u16v = ~u16v;
+
+    i16 = +i16;
+    u16v = -u16v;
+
+    // Arithmetic
+    i16  += i16;
+    u16v -= u16v;
+    i  *= i16;
+    uv /= u16v;
+    uv %= i16;
+
+    uv = u16v + uv;
+    i64  = i16 - i64;
+    uv = u16v * uv;
+    i64  = i16 * i64;
+    i  = i16 % i;
+
+    // Shift
+    u16v <<= i16;
+    i16  >>= u16v.y;
+
+    i16  = i16 << u16v.z;
+    uv = u16v << i;
+
+    // Relational
+    b = (u16v.x != i16);
+    b = (i16 == u16v.x);
+    b = (u16v.x > uv.y);
+    b = (i16 < i);
+    b = (u16v.y >= uv.x);
+    b = (i16 <= i);
+
+    // Bitwise
+    uv |= i16;
+    i  = i16 | i;
+    i64  &= i16;
+    uv = u16v & uv;
+    uv ^= i16;
+    u16v = u16v ^ i16;
+}
+
+void builtinFuncs()
+{
+    i16vec2  i16v;
+    i16vec4  i16v4;
+    u16vec3  u16v;
+    u16vec2  u16v2;
+    u16vec4  u16v4;
+    bvec3   bv;
+    int16_t i16;
+    uint16_t u16;
+    int32_t i32;
+    uint32_t u32;
+    int64_t i64;
+    uint64_t u64;
+
+    // abs()
+    i16v = abs(i16v);
+
+    // sign()
+    i16  = sign(i16);
+
+    // min()
+    i16v = min(i16v, i16);
+    i16v = min(i16v, i16vec2(-1));
+    u16v = min(u16v, u16);
+    u16v = min(u16v, u16vec3(0));
+
+    // max()
+    i16v = max(i16v, i16);
+    i16v = max(i16v, i16vec2(-1));
+    u16v = max(u16v, u16);
+    u16v = max(u16v, u16vec3(0));
+
+    // clamp()
+    i16v = clamp(i16v, -i16, i16);
+    i16v = clamp(i16v, -i16v, i16v);
+    u16v = clamp(u16v, -u16, u16);
+    u16v = clamp(u16v, -u16v, u16v);
+
+    // mix()
+    i16  = mix(i16v.x, i16v.y, true);
+    i16v = mix(i16vec2(i16), i16vec2(-i16), bvec2(false));
+    u16  = mix(u16v.x, u16v.y, true);
+    u16v = mix(u16vec3(u16), u16vec3(-u16), bvec3(false));
+
+    //pack
+    i32 = pack32(i16v);
+    i64 = pack64(i16v4);
+    u32 = pack32(u16v2);
+    u64 = pack64(u16v4);
+
+    i16v  = unpack16(i32);
+    i16v4 = unpack16(i64);
+    u16v2 = unpack16(u32);
+    u16v4 = unpack16(u64);
+
+    // lessThan()
+    bv    = lessThan(u16v, u16vec3(u16));
+    bv.xy = lessThan(i16v, i16vec2(i16));
+
+    // lessThanEqual()
+    bv    = lessThanEqual(u16v, u16vec3(u16));
+    bv.xy = lessThanEqual(i16v, i16vec2(i16));
+
+    // greaterThan()
+    bv    = greaterThan(u16v, u16vec3(u16));
+    bv.xy = greaterThan(i16v, i16vec2(i16));
+
+    // greaterThanEqual()
+    bv    = greaterThanEqual(u16v, u16vec3(u16));
+    bv.xy = greaterThanEqual(i16v, i16vec2(i16));
+
+    // equal()
+    bv    = equal(u16v, u16vec3(u16));
+    bv.xy = equal(i16v, i16vec2(i16));
+
+    // notEqual()
+    bv    = notEqual(u16v, u16vec3(u16));
+    bv.xy = notEqual(i16v, i16vec2(i16));
+}
+
+// Type conversion for specialization constant
+layout(constant_id = 100) const int16_t  si16 = int16_t(-10);
+layout(constant_id = 101) const uint16_t su16 = uint16_t(20);
diff --git a/Test/spv.vulkan110.storageBuffer.vert b/Test/spv.vulkan110.storageBuffer.vert
new file mode 100644
index 0000000..6dd629e
--- /dev/null
+++ b/Test/spv.vulkan110.storageBuffer.vert
@@ -0,0 +1,16 @@
+#version 450

+

+#pragma use_storage_buffer

+

+uniform ub {

+    vec4 a;

+} ubi;

+

+buffer bb {

+    vec4 b;

+} bbi;

+

+void main()

+{

+    gl_Position = ubi.a + bbi.b;

+}

diff --git a/Test/spv.xfb.vert b/Test/spv.xfb.vert
new file mode 100644
index 0000000..ad762bc
--- /dev/null
+++ b/Test/spv.xfb.vert
@@ -0,0 +1,20 @@
+#version 450

+

+layout(xfb_buffer = 3) out;

+layout(xfb_stride = 48) out;

+layout(xfb_offset = 12, location = 0) out float out1;

+

+layout(xfb_buffer = 2) out;

+layout(location=1) out outXfb {

+    layout(xfb_buffer = 2, xfb_stride = 32, xfb_offset = 8) float out2;

+};

+

+layout(xfb_buffer = 1, location=3) out outXfb2 {

+    layout(xfb_stride = 64, xfb_offset = 60) float out3;

+};

+

+layout(location = 4, xfb_buffer = 0, xfb_offset = 4) out float out4;

+

+void main()

+{

+}
\ No newline at end of file
diff --git a/Test/spv.xfb2.vert b/Test/spv.xfb2.vert
new file mode 100644
index 0000000..895666d
--- /dev/null
+++ b/Test/spv.xfb2.vert
@@ -0,0 +1,18 @@
+#version 450

+

+layout (location = 0) in vec4 position;

+layout (binding = 5) uniform ComponentsBlock

+{

+    vec4 c1;

+    vec2 c2;

+} components;

+

+layout (xfb_buffer = 3, xfb_offset = 16) out gl_PerVertex

+{

+    vec4 gl_Position;

+};

+

+void main()

+{

+    gl_Position = position + components.c1 + vec4(components.c2, 0.0, 0.0);

+}
\ No newline at end of file
diff --git a/Test/spv.xfb3.vert b/Test/spv.xfb3.vert
new file mode 100644
index 0000000..2eae7c9
--- /dev/null
+++ b/Test/spv.xfb3.vert
@@ -0,0 +1,18 @@
+#version 450

+

+layout (location = 0) in vec4 position;

+layout (binding = 5) uniform ComponentsBlock

+{

+    vec4 c1;

+    vec2 c2;

+} components;

+

+layout (xfb_buffer = 3, xfb_offset = 16) out gl_PerVertex

+{

+    layout(xfb_stride = 80) vec4 gl_Position;

+};

+

+void main()

+{

+    gl_Position = position + components.c1 + vec4(components.c2, 0.0, 0.0);

+}
\ No newline at end of file
diff --git a/Test/spv.xfbOffsetOnBlockMembersAssignment.vert b/Test/spv.xfbOffsetOnBlockMembersAssignment.vert
new file mode 100644
index 0000000..40943f7
--- /dev/null
+++ b/Test/spv.xfbOffsetOnBlockMembersAssignment.vert
@@ -0,0 +1,13 @@
+#version 450
+
+layout(xfb_buffer=2) out;
+layout(location=5, xfb_offset=0) out block2 {
+   float y1_out;
+   vec4 y2_out;
+};
+
+void main() {
+   y1_out = 7.0;
+   y2_out = vec4(1.0, 0.0, 0.0, 1.0);
+   gl_Position = vec4(0.0);
+}
diff --git a/Test/spv.xfbOffsetOnStructMembersAssignment.vert b/Test/spv.xfbOffsetOnStructMembersAssignment.vert
new file mode 100644
index 0000000..e6619c5
--- /dev/null
+++ b/Test/spv.xfbOffsetOnStructMembersAssignment.vert
@@ -0,0 +1,23 @@
+#version 450
+
+layout(xfb_buffer=2) out;
+
+struct S {
+   float x1_out;
+   float x2_out;
+};
+
+layout(location=0, xfb_offset = 16) out S s1;
+
+layout(location=5, xfb_buffer=1, xfb_offset=8) out struct S2 {
+   float y1_out;
+   vec4 y2_out;
+}s2;
+
+void main() {
+   s1.x1_out = 5.0;
+   s1.x2_out = 6.0;
+   s2.y1_out = 7.0;
+   s2.y2_out = vec4(1.0, 0.0, 0.0, 1.0);
+   gl_Position = vec4(0.0);
+}
diff --git a/Test/spv.xfbOverlapOffsetCheckWithBlockAndMember.vert b/Test/spv.xfbOverlapOffsetCheckWithBlockAndMember.vert
new file mode 100644
index 0000000..3f493dc
--- /dev/null
+++ b/Test/spv.xfbOverlapOffsetCheckWithBlockAndMember.vert
@@ -0,0 +1,19 @@
+#version 450
+
+/* block definition from GLSL spec 4.60, section 4.4.2, Output Layout Qualifiers */
+
+layout(location=5, xfb_buffer = 3, xfb_offset = 12) out block2 {
+   vec4 v; // v will be written to byte offsets 12 through 27 of buffer
+   float u; // u will be written to offset 28
+   layout(xfb_offset = 40) vec4 w;
+   vec4 x; // x will be written to offset 56, the next available offset
+};
+
+void main() {
+   v = vec4(1.0, 0.0, 1.0, 0.0);
+   u = 5.0;
+   w = vec4(1.0, 0.0, 0.0, 1.0);
+   x = vec4(5.0, 0.0, 0.0, 0.0);
+
+   gl_Position = vec4(0.0);
+}
diff --git a/Test/spv.xfbStrideJustOnce.vert b/Test/spv.xfbStrideJustOnce.vert
new file mode 100644
index 0000000..2798c6a
--- /dev/null
+++ b/Test/spv.xfbStrideJustOnce.vert
@@ -0,0 +1,14 @@
+#version 450
+
+layout(xfb_buffer=2) out;
+
+layout(location=5, xfb_stride=20) out block {
+   float y1_out;
+   vec4 y2_out;
+};
+
+void main() {
+   y1_out = 7.0;
+   y2_out = vec4(1.0, 0.0, 0.0, 1.0);
+   gl_Position = vec4(0.0);
+}
diff --git a/Test/stringToDouble.vert b/Test/stringToDouble.vert
new file mode 100644
index 0000000..a8de3b4
--- /dev/null
+++ b/Test/stringToDouble.vert
@@ -0,0 +1,116 @@
+#version 460
+#extension GL_EXT_shader_explicit_arithmetic_types_float16 : enable
+void main()
+{
+    float w1   = 00000.000;
+    float w2   = 1.0;
+    float w3   = 007.00;
+    float w4   = 000130000.0;
+    float w5   = 123456789.0000;
+    double w6  = 1234567890123456.0;
+    double w7  = 12345678901234567.0;
+    double w8  = 123456789012345678.0;
+    double w9  = 12345678901234567893.0;
+    double w10 = 1234567890123456789012345.0;
+
+    float e1 = 0e0;
+    float e2 = 1e0;
+    float e3 = 0e14;
+    float e4 = 1e15;
+    float e5 = 1e16;
+    float e6 = 0e-14;
+    float e7 = 1e-15;
+    float e8 = 1e-16;
+    double e9 = 1e100;
+    double e10 = 1e+308;
+    double e11 = 1e-307; // Was 1e-323, but that's flushed to zero sometimes. 1e-308 can be flushed to 0.
+    double e12 = 1e+309;
+    double e13 = 1e-324;
+    double e24 = 1e+999;
+    double e25 = 1e-999;
+
+    double f1 = 0.5;
+    double f2 = 0.125;
+    double f31 = 0.1;
+    double f32 = 0.2;
+    double f33 = 0.3;
+    double f34 = 0.4;
+    double f35 = 0.5;
+    double f36 = 0.6;
+    double f37 = 0.7;
+    double f38 = 0.8;
+    double f39 = 0.9;
+    double f4 = 0.33333333333333333333333333333333333333333333333333333333333333333333333333333;
+    double f51 = 0.000000000000000000000000000000000000783475;
+    double f52 = 0.0000000000000000000000000000000000007834750;
+    double f53 = .00000000000000000000000000000000000078347500;
+    double f54 = 0.000000000000000000000000000000000000783475000000;
+    double f61 = 4.;
+    double f62 = 40.;
+    double f63 = 0.;
+    double f64 = 04.;
+    double f65 = .0;
+    double f66 = .004;
+    double f67 = .400;
+    double f68 = .04000;
+
+    double c1  = .081e-2;
+    double c2  = .073e2;
+    double c3  = 34.5e-1;
+    double c4  = 35.7e-4;
+    double c5  = 43.9e1;
+    double c6  = 52.2e4;
+    double c7  = 000610000e2;
+    double c8  = 000610000e-6;
+    double c9  = 000001234567890123450000.0;
+    double c10 = 000999999999999999999000.0;
+    double c11 = 0001230000.0045600000;
+    double c12 = 0001230000.00405600000e-3;
+    double c13 = 0001230000.004500600000e-4;
+    double c14 = 00010230000.0045600000e-5;
+    double c15 = 000120030000.0045600000e4;
+    double c16 = 0001230000.0045600000e5;
+    double c17 = 0001230000.0045600000e6;
+    double c18 = 0001230000.00456007e6;
+
+    double b11 = 72057594037927928.0;
+    double b12 = 72057594037927936.0;
+    double b13 = 72057594037927932.0;
+    double b14 = 7205759403792793199999e-5;
+    double b15 = 7205759403792793200001e-5;
+    double b21 = 9223372036854774784.0;
+    double b22 = 9223372036854775808.0;
+    double b23 = 9223372036854775296.0;
+    double b24 = 922337203685477529599999e-5;
+    double b25 = 922337203685477529600001e-5;
+    double b31 = 10141204801825834086073718800384.0;
+    double b32 = 10141204801825835211973625643008.0;
+    double b33 = 10141204801825834649023672221696.0;
+    double b34 = 1014120480182583464902367222169599999e-5;
+    double b35 = 1014120480182583464902367222169600001e-5;
+    double b41 = 5708990770823838890407843763683279797179383808.0;
+    double b42 = 5708990770823839524233143877797980545530986496.0;
+    double b43 = 5708990770823839207320493820740630171355185152.0;
+    double b44 = 5708990770823839207320493820740630171355185151999e-3;
+    double b45 = 5708990770823839207320493820740630171355185152001e-3;
+
+    float pi1 = 3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679f;
+    float pi2 = 3.14159265358979f;
+    float pi3 = 3.141592653589793f;
+
+    double dpi1 = 3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679;
+    double dpi2 = 3.14159265358979;
+    double dpi3 = 3.141592653589793;
+
+    float dfpi1 = 3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679f;
+    float dfpi2 = 3.14159265358979f;
+    float dfpi3 = 3.141592653589793f;
+
+    double lfpi1 = 3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679LF;
+    double lfpi2 = 3.14159265358979Lf;
+    double lfpi3 = 3.141592653589793lF;
+
+    double hfpi1 = 3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679hF;
+    double hfpi2 = 3.14159265358979hF;
+    double hfpi3 = 3.141592653589793hf;
+}
diff --git a/Test/tokenLength.vert b/Test/tokenLength.vert
index 691b104..21d446f 100644
--- a/Test/tokenLength.vert
+++ b/Test/tokenLength.vert
@@ -1,5 +1,5 @@
 #version 300 es
-
+//#pragma glslang_binary_double_output
 // 1023 characters
 in float BCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789;
 
diff --git a/Test/validate-shaders.sh b/Test/validate-shaders.sh
new file mode 100755
index 0000000..89dc955
--- /dev/null
+++ b/Test/validate-shaders.sh
@@ -0,0 +1,269 @@
+#!/bin/bash
+
+# This script validates shaders (if successfully compiled) using spirv-val.
+# It is not meant to preclude the possible addition of the validator to
+# glslang.
+
+declare -r EXE='../build/install/bin/glslangValidator'
+
+# search common locations for spirv-tools: keep first one
+for toolsdir in '../External/spirv-tools/build/tools' '../../SPIRV-Tools/build/tools/bin' '/usr/local/bin'; do
+    [[ -z "$VAL" && -x "${toolsdir}/spirv-val" ]] && declare -r VAL="${toolsdir}/spirv-val"
+    [[ -z "$DIS" && -x "${toolsdir}/spirv-dis" ]] && declare -r DIS="${toolsdir}/spirv-dis"
+done
+
+declare -r gtests='../gtests/Hlsl.FromFile.cpp ../gtests/Spv.FromFile.cpp'
+
+declare -r targetenv='vulkan1.0'
+
+function fatal() { echo "ERROR: $@"; exit 5; }
+
+function usage
+{
+    echo
+    echo "Usage: $(basename $0) [options...] shaders..."
+    echo
+    echo "   Validates shaders (if successfully compiled) through spirv-val."
+    echo
+    echo "General options:"
+    echo "   --help          prints this text"
+    echo "   --no-color      disables output colorization"
+    echo "   --dump-asm      dumps all successfully compiled shader assemblies"
+    echo "   --dump-val      dumps all validation results"
+    echo "   --dump-comp     dumps all compilation logs"
+    echo "Spam reduction options:"
+    echo "   --no-summary    disables result summaries"
+    echo "   --skip-ok       do not print successful validations"
+    echo "   --skip-comperr  do not print compilation errors"
+    echo "   --skip-valerr   do not print validation errors"
+    echo "   --quiet         synonym for --skip-ok --skip-comperr --skip-valerr --no-summary"
+    echo "   --terse         print terse single line progress summary"
+    echo "Disassembly options:"
+    echo "   --raw-id        uses raw ids for disassembly"
+    echo
+    echo "Usage examples.  Note most non-hlsl tests fail to compile for expected reasons."
+    echo "   Exercise all hlsl.* files:"
+    echo "       $(basename $0) hlsl.*"
+    echo "   Exercise all hlsl.* files, tersely:"
+    echo "       $(basename $0) --terse hlsl.*"
+    echo "   Print validator output for myfile.frag:"
+    echo "       $(basename $0) --quiet --dump-val myfile.frag"
+    echo "   Exercise hlsl.* files, only printing validation errors:"
+    echo "       $(basename $0) --skip-ok --skip-comperr hlsl.*"
+
+    exit 5
+}
+
+function status()
+{
+    printf "%-40s: %b\n" "$1" "$2"
+}
+
+# make sure we can find glslang
+[[ -x "$EXE" ]] || fatal "Unable to locate $(basename "$EXE") executable"
+[[ -x "$VAL" ]] || fatal "Unable to locate spirv-val executable"
+[[ -x "$DIS" ]] || fatal "Unable to locate spirv-dis executable"
+
+for gtest in $gtests; do
+    [[ -r "$gtest" ]] || fatal "Unable to locate source file: $(basename $gtest)"
+done
+
+# temp files
+declare -r spvfile='out.spv' \
+        complog='comp.out' \
+        vallog='val.out' \
+        dislog='dis.out' \
+
+# options
+declare opt_vallog=false \
+        opt_complog=false \
+        opt_dislog=false \
+        opt_summary=true \
+        opt_stat_comperr=true \
+        opt_stat_ok=true \
+        opt_stat_valerr=true \
+        opt_color=true \
+        opt_raw_id=false \
+        opt_quiet=false \
+        opt_terse=false
+
+# clean up on exit
+trap "rm -f ${spvfile} ${complog} ${vallog} ${dislog}" EXIT
+
+# Language guesser: there is no fixed mapping from filenames to language,
+# so this examines the file and return one of:
+#     hlsl
+#     glsl
+#     bin
+#     unknown
+# This is easier WRT future expansion than a big explicit list.
+function FindLanguage()
+{
+    local test="$1"
+
+    # If it starts with hlsl, assume it's hlsl.
+    if [[ "$test" == *hlsl.* ]]; then
+        echo hlsl
+        return
+    fi
+
+    if [[ "$test" == *.spv ]]; then
+        echo bin
+        return;
+    fi
+
+    # If it doesn't start with spv., assume it's GLSL.
+    if [[ ! "$test" == spv.* && ! "$test" == remap.* ]]; then
+        echo glsl
+        return
+    fi
+
+    # Otherwise, attempt to guess from shader contents, since there's no
+    # fixed mapping of filenames to languages.
+    local contents="$(cat "$test")"
+
+    if [[ "$contents" == *#version* ]]; then
+        echo glsl
+        return
+    fi
+
+    if [[ "$contents" == *SamplerState* ||
+          "$contents" == *cbuffer* ||
+          "$contents" == *SV_* ]]; then
+        echo hlsl
+        return
+    fi
+
+    echo unknown
+}
+
+# Attempt to discover entry point
+function FindEntryPoint()
+{
+    local test="$1"
+
+    # if it's not hlsl, always use main
+    if [[ "$language" != 'hlsl' ]]; then
+        echo 'main'
+        return
+    fi
+
+    # Try to find it in test sources
+    awk -F '[ (){",]+' -e "\$2 == \"${test}\" { print \$3; found=1; } END { if (found==0) print \"main\"; } " $gtests
+}
+
+# command line options
+while [ $# -gt 0 ]
+do
+    case "$1" in
+        # -c) glslang="$2"; shift 2;;
+        --help|-?)      usage;;
+        --no-color)     opt_color=false;        shift;;
+        --no-summary)   opt_summary=false;      shift;;
+        --skip-ok)      opt_stat_ok=false;      shift;;
+        --skip-comperr) opt_stat_comperr=false; shift;;
+        --skip-valerr)  opt_stat_valerr=false;  shift;;
+        --dump-asm)     opt_dislog=true;        shift;;
+        --dump-val)     opt_vallog=true;        shift;;
+        --dump-comp)    opt_complog=true;       shift;;
+        --raw-id)       opt_raw_id=true;        shift;;
+        --quiet)        opt_quiet=true;         shift;;
+        --terse)        opt_quiet=true
+                        opt_terse=true
+                        shift;;
+        --*)            fatal "Unknown command line option: $1";;
+        *) break;;
+    esac
+done
+
+# this is what quiet means
+if $opt_quiet; then
+    opt_stat_ok=false
+    opt_stat_comperr=false
+    opt_stat_valerr=false
+    $opt_terse || opt_summary=false
+fi
+
+if $opt_color; then
+    declare -r white="\e[1;37m" cyan="\e[1;36m" red="\e[0;31m" no_color="\e[0m"
+else
+    declare -r white="" cyan="" red="" no_color=""
+fi
+
+# stats
+declare -i count_ok=0 count_err=0 count_nocomp=0 count_total=0
+
+declare -r dashsep='------------------------------------------------------------------------'
+
+testfiles=(${@})
+# if no shaders given, look for everything in current directory
+[[ ${#testfiles[*]} == 0 ]] && testfiles=(*.frag *.vert *.tesc *.tese *.geom *.comp)
+
+$opt_summary && printf "\nValidating: ${#testfiles[*]} shaders\n\n"
+
+# Loop through the shaders we were given, compiling them if we can.
+for test in ${testfiles[*]}
+do
+    if [[ ! -r "$test" ]]; then
+        $opt_quiet || status "$test" "${red}FILE NOT FOUND${no_color}"
+        continue
+    fi
+
+    ((++count_total))
+
+    $opt_terse && printf "\r[%-3d/%-3d : ${white}comperr=%-3d ${red}valerr=%-3d ${cyan}ok=%-3d${no_color}]" \
+                         ${count_total} ${#testfiles[*]} ${count_nocomp} ${count_err} ${count_ok}
+
+    language="$(FindLanguage $test)"
+    entry="$(FindEntryPoint $test)"
+    langops=''
+
+    case "$language" in
+        hlsl) langops='-D --hlsl-iomap --hlsl-offsets';;
+        glsl) ;;
+        bin) continue;;   # skip binaries
+        *) $opt_quiet || status "$test" "${red}UNKNOWN LANGUAGE${no_color}"; continue;;
+    esac
+
+    # compile the test file
+    if compout=$("$EXE" -e "$entry" $langops -V -o "$spvfile" "$test" 2>&1)
+    then
+        # successful compilation: validate
+        if valout=$("$VAL" --target-env ${targetenv} "$spvfile" 2>&1)
+        then
+            # validated OK
+            $opt_stat_ok && status "$test" "${cyan}OK${no_color}"
+            ((++count_ok))
+        else
+            # validation failure
+            $opt_stat_valerr && status "$test" "${red}VAL ERROR${no_color}"
+            printf "%s\n%s:\n%s\n" "$dashsep" "$test" "$valout" >> "$vallog"
+            ((++count_err))
+        fi
+
+        if $opt_dislog; then
+            printf "%s\n%s:\n" "$dashsep" "$test" >> "$dislog"
+            $opt_raw_id && id_opt=--raw-id
+            "$DIS" ${id_opt} "$spvfile" >> "$dislog"
+        fi
+    else
+        # compile failure
+        $opt_stat_comperr && status "$test" "${white}COMP ERROR${no_color}"
+        printf "%s\n%s\n" "$dashsep" "$compout" >> "$complog"
+        ((++count_nocomp))
+    fi
+done
+
+$opt_terse && echo
+
+# summarize
+$opt_summary && printf "\nSummary: ${white}${count_nocomp} compile errors${no_color}, ${red}${count_err} validation errors${no_color}, ${cyan}${count_ok} successes${no_color}\n"
+
+# dump logs
+$opt_vallog  && [[ -r $vallog ]]  && cat "$vallog"
+$opt_complog && [[ -r $complog ]] && cat "$complog"
+$opt_dislog  && [[ -r $dislog ]]  && cat "$dislog"
+
+# exit code
+[[ ${count_err} -gt 0 ]] && exit 1
+exit 0
diff --git a/Test/vulkan.frag b/Test/vulkan.frag
index 2b686eb..46c14f3 100644
--- a/Test/vulkan.frag
+++ b/Test/vulkan.frag
@@ -1,9 +1,9 @@
 #version 450

 

-uniform sampler s;

-uniform sampler sA[4];

-uniform texture2D t2d;

-uniform texture3D t3d[4];

+uniform sampler s;         // ERROR, no binding

+uniform sampler sA[4];     // ERROR, no binding

+uniform texture2D t2d;     // ERROR, no binding

+uniform texture3D t3d[4];  // ERROR, no binding

 int i;

 uniform samplerShadow sShadow;

 uniform texture3D t3d5[5];

@@ -21,14 +21,14 @@
     sampler3D[4](t3d5, sA[2]);    // ERROR, can't make array

     sampler2D(i2d, s);            // ERROR, image instead of texture

     sampler2D(t3d[1], s);         // ERROR, 3D not 2D

-    sampler2D(t2d, sShadow);      // ERROR, shadow mismatch

-    sampler2DShadow(t2d, s);      // ERROR, shadow mismatch

+    sampler2D(t2d, sShadow);

+    sampler2DShadow(t2d, s);

 }

 

 sampler2D s2D = sampler2D(t2d, s);            // ERROR, no sampler constructor

 sampler3D s3d[4] = sampler3D[4](t3d, sA[2]);  // ERROR, no sampler constructor

 

-out vec4 color;

+out vec4 color; // ERROR, no location

 

 void main()

 {

@@ -43,7 +43,7 @@
 layout(push_constant) uniform float pcfloat;  // ERROR 2X: not on a non-block, and non-opaque outside block

 

 layout(push_constant) uniform;                // ERROR, needs an object

-

+layout(std430, push_constant) uniform pcb1 { int a; } pcb1inst;

 layout(push_constant) uniform pcb2 {

     int a;

 };                                            // Okay now to have no instance name

@@ -95,3 +95,11 @@
 

     gl_NumSamples;   // ERROR, not for Vulkan

 }

+

+void noise()

+{

+    noise1(dv4);

+    noise2(4.0);

+    noise3(vec2(3));

+    noise4(dv4);

+}

diff --git a/Test/vulkan.vert b/Test/vulkan.vert
index b234c75..a6af2d5 100644
--- a/Test/vulkan.vert
+++ b/Test/vulkan.vert
@@ -45,3 +45,21 @@
 #if VULKAN != 100

 #error VULKAN should be 100

 #endif

+

+float AofA0[2][arraySize];              // ERROR, only outer dimension

+float AofA1[arraySize][arraySize];      // ERROR, only outer dimension

+float AofA2[arraySize][2 + arraySize];  // ERROR, only outer dimension

+float AofA3[arraySize][2];

+

+out ban1 {                              // ERROR, only outer dimension

+    float f;

+} bai1[2][arraySize];

+

+out ban2 {

+    float f;

+} bai2[arraySize][2];

+

+layout(binding = 3000) uniform sampler2D s3000;

+layout(binding = 3001) uniform b3001 { int a; };

+layout(location = 10) in vec4 in1;

+layout(location = 10) in vec4 in2;  // ERROR, no location aliasing

diff --git a/build_overrides/glslang.gni b/build_overrides/glslang.gni
new file mode 100644
index 0000000..500578c
--- /dev/null
+++ b/build_overrides/glslang.gni
@@ -0,0 +1,37 @@
+# Copyright (C) 2018 Google, Inc.
+#
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+#    Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+#
+#    Redistributions in binary form must reproduce the above
+#    copyright notice, this list of conditions and the following
+#    disclaimer in the documentation and/or other materials provided
+#    with the distribution.
+#
+#    Neither the name of Google Inc. nor the names of its
+#    contributors may be used to endorse or promote products derived
+#    from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+
+# These are variables that are overridable by projects that include glslang.
+
+# The path to glslang dependencies.
+glslang_spirv_tools_dir = "//Externals/spirv-tools"
diff --git a/glslang/CMakeLists.txt b/glslang/CMakeLists.txt
index 8b9c2ad..656a4ed 100644
--- a/glslang/CMakeLists.txt
+++ b/glslang/CMakeLists.txt
@@ -1,6 +1,6 @@
 if(WIN32)
     add_subdirectory(OSDependent/Windows)
-elseif(UNIX)
+elseif(UNIX OR "${CMAKE_SYSTEM_NAME}" STREQUAL "Fuchsia")
     add_subdirectory(OSDependent/Unix)
 else(WIN32)
     message("unknown platform")
@@ -9,6 +9,7 @@
 set(SOURCES
     MachineIndependent/glslang.y
     MachineIndependent/glslang_tab.cpp
+    MachineIndependent/attribute.cpp
     MachineIndependent/Constant.cpp
     MachineIndependent/iomapper.cpp
     MachineIndependent/InfoSink.cpp
@@ -31,9 +32,7 @@
     MachineIndependent/preprocessor/Pp.cpp
     MachineIndependent/preprocessor/PpAtom.cpp
     MachineIndependent/preprocessor/PpContext.cpp
-    MachineIndependent/preprocessor/PpMemory.cpp
     MachineIndependent/preprocessor/PpScanner.cpp
-    MachineIndependent/preprocessor/PpSymbols.cpp
     MachineIndependent/preprocessor/PpTokens.cpp
     MachineIndependent/propagateNoContraction.cpp
     GenericCodeGen/CodeGen.cpp
@@ -53,6 +52,7 @@
     Include/revision.h
     Include/ShHandle.h
     Include/Types.h
+    MachineIndependent/attribute.h
     MachineIndependent/glslang_tab.cpp.h
     MachineIndependent/gl_types.h
     MachineIndependent/Initialize.h
@@ -80,9 +80,18 @@
 #                    WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
 # set(BISON_GLSLParser_OUTPUT_SOURCE ${CMAKE_CURRENT_SOURCE_DIR}/MachineIndependent/glslang_tab.cpp)
 
-add_library(glslang STATIC ${BISON_GLSLParser_OUTPUT_SOURCE} ${SOURCES} ${HEADERS})
-set_property(TARGET glslang PROPERTY FOLDER glslang POSITION_INDEPENDENT_CODE ON)
+glslang_pch(SOURCES MachineIndependent/pch.cpp)
+
+add_library(glslang ${LIB_TYPE} ${BISON_GLSLParser_OUTPUT_SOURCE} ${SOURCES} ${HEADERS})
+set_property(TARGET glslang PROPERTY FOLDER glslang)
+set_property(TARGET glslang PROPERTY POSITION_INDEPENDENT_CODE ON)
 target_link_libraries(glslang OGLCompiler OSDependent)
+target_include_directories(glslang PUBLIC ..)
+
+if(WIN32 AND BUILD_SHARED_LIBS)
+    set_target_properties(glslang PROPERTIES PREFIX "")
+endif()
+
 if(ENABLE_HLSL)
     target_link_libraries(glslang HLSL)
 endif()
@@ -95,10 +104,20 @@
     source_group("MachineIndependent\\Preprocessor" REGULAR_EXPRESSION "MachineIndependent/preprocessor/*")
 endif(WIN32)
 
-install(TARGETS glslang
-        ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
+if(ENABLE_GLSLANG_INSTALL)
+    if(BUILD_SHARED_LIBS)
+        install(TARGETS glslang
+                ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
+                LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR})
+    else()
+        install(TARGETS glslang
+                ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
+    endif()
+endif(ENABLE_GLSLANG_INSTALL)
 
-foreach(file ${HEADERS})
-    get_filename_component(dir ${file} DIRECTORY)
-    install(FILES ${file} DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/glslang/${dir})
-endforeach()
+if(ENABLE_GLSLANG_INSTALL)
+    foreach(file ${HEADERS})
+        get_filename_component(dir ${file} DIRECTORY)
+        install(FILES ${file} DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/glslang/${dir})
+    endforeach()
+endif(ENABLE_GLSLANG_INSTALL)
diff --git a/glslang/Include/BaseTypes.h b/glslang/Include/BaseTypes.h
index abac512..fabd613 100644
--- a/glslang/Include/BaseTypes.h
+++ b/glslang/Include/BaseTypes.h
@@ -1,6 +1,7 @@
 //
 // Copyright (C) 2002-2005  3Dlabs Inc. Ltd.
 // Copyright (C) 2012-2013 LunarG, Inc.
+// Copyright (C) 2017 ARM Limited.
 //
 // All rights reserved.
 //
@@ -46,9 +47,11 @@
     EbtVoid,
     EbtFloat,
     EbtDouble,
-#ifdef AMD_EXTENSIONS
     EbtFloat16,
-#endif
+    EbtInt8,
+    EbtUint8,
+    EbtInt16,
+    EbtUint16,
     EbtInt,
     EbtUint,
     EbtInt64,
@@ -59,6 +62,10 @@
     EbtStruct,
     EbtBlock,
 
+#ifdef NV_EXTENSIONS
+    EbtAccStructNV,
+#endif
+
     // HLSL types that live only temporarily.
     EbtString,
 
@@ -85,6 +92,14 @@
     EvqBuffer,        // read/write, shared with app
     EvqShared,        // compute shader's read/write 'shared' qualifier
 
+#ifdef NV_EXTENSIONS
+    EvqPayloadNV,
+    EvqPayloadInNV,
+    EvqHitAttrNV,
+    EvqCallableDataNV,
+    EvqCallableDataInNV,
+#endif
+
     // parameters
     EvqIn,            // also, for 'in' in the grammar before we know if it's a pipeline input or an 'in' parameter
     EvqOut,           // also, for 'out' in the grammar before we know if it's a pipeline output or an 'out' parameter
@@ -137,6 +152,8 @@
     EbvLocalInvocationId,
     EbvGlobalInvocationId,
     EbvLocalInvocationIndex,
+    EbvNumSubgroups,
+    EbvSubgroupID,
     EbvSubGroupSize,
     EbvSubGroupInvocation,
     EbvSubGroupEqMask,
@@ -144,6 +161,13 @@
     EbvSubGroupGtMask,
     EbvSubGroupLeMask,
     EbvSubGroupLtMask,
+    EbvSubgroupSize2,
+    EbvSubgroupInvocation2,
+    EbvSubgroupEqMask2,
+    EbvSubgroupGeMask2,
+    EbvSubgroupGtMask2,
+    EbvSubgroupLeMask2,
+    EbvSubgroupLtMask2,
     EbvVertexId,
     EbvInstanceId,
     EbvVertexIndex,
@@ -189,10 +213,12 @@
     EbvFragColor,
     EbvFragData,
     EbvFragDepth,
+    EbvFragStencilRef,
     EbvSampleId,
     EbvSamplePosition,
     EbvSampleMask,
     EbvHelperInvocation,
+
 #ifdef AMD_EXTENSIONS
     EbvBaryCoordNoPersp,
     EbvBaryCoordNoPerspCentroid,
@@ -206,19 +232,49 @@
     EbvViewIndex,
     EbvDeviceIndex,
 
+    EbvFragSizeEXT,
+    EbvFragInvocationCountEXT,
+
 #ifdef NV_EXTENSIONS
     EbvViewportMaskNV,
     EbvSecondaryPositionNV,
     EbvSecondaryViewportMaskNV,
     EbvPositionPerViewNV,
     EbvViewportMaskPerViewNV,
+    EbvFragFullyCoveredNV,
+    EbvFragmentSizeNV,
+    EbvInvocationsPerPixelNV,
+    // raytracing
+    EbvLaunchIdNV,
+    EbvLaunchSizeNV,
+    EbvInstanceCustomIndexNV,
+    EbvWorldRayOriginNV,
+    EbvWorldRayDirectionNV,
+    EbvObjectRayOriginNV,
+    EbvObjectRayDirectionNV,
+    EbvRayTminNV,
+    EbvRayTmaxNV,
+    EbvHitTNV,
+    EbvHitKindNV,
+    EbvObjectToWorldNV,
+    EbvWorldToObjectNV,
+    EbvIncomingRayFlagsNV,
+    EbvBaryCoordNV,
+    EbvBaryCoordNoPerspNV,
+    EbvTaskCountNV,
+    EbvPrimitiveCountNV,
+    EbvPrimitiveIndicesNV,
+    EbvClipDistancePerViewNV,
+    EbvCullDistancePerViewNV,
+    EbvLayerPerViewNV,
+    EbvMeshViewCountNV,
+    EbvMeshViewIndicesNV,
 #endif 
 
     // HLSL built-ins that live only temporarily, until they get remapped
     // to one of the above.
     EbvFragDepthGreater,
     EbvFragDepthLesser,
-    EbvStencilRef,
     EbvGsOutputStream,
     EbvOutputPatch,
     EbvInputPatch,
@@ -259,6 +315,13 @@
     case EvqPointCoord:     return "gl_PointCoord";  break;
     case EvqFragColor:      return "fragColor";      break;
     case EvqFragDepth:      return "gl_FragDepth";   break;
+#ifdef NV_EXTENSIONS
+    case EvqPayloadNV:        return "rayPayloadNV";     break;
+    case EvqPayloadInNV:      return "rayPayloadInNV";   break;
+    case EvqHitAttrNV:        return "hitAttributeNV";   break;
+    case EvqCallableDataNV:   return "callableDataNV";   break;
+    case EvqCallableDataInNV: return "callableDataInNV"; break;
+#endif
     default:                return "unknown qualifier";
     }
 }
@@ -325,10 +388,12 @@
     case EbvFragColor:            return "FragColor";
     case EbvFragData:             return "FragData";
     case EbvFragDepth:            return "FragDepth";
+    case EbvFragStencilRef:       return "FragStencilRef";
     case EbvSampleId:             return "SampleId";
     case EbvSamplePosition:       return "SamplePosition";
     case EbvSampleMask:           return "SampleMaskIn";
     case EbvHelperInvocation:     return "HelperInvocation";
+
 #ifdef AMD_EXTENSIONS
     case EbvBaryCoordNoPersp:           return "BaryCoordNoPersp";
     case EbvBaryCoordNoPerspCentroid:   return "BaryCoordNoPerspCentroid";
@@ -342,12 +407,43 @@
     case EbvViewIndex:                  return "ViewIndex";
     case EbvDeviceIndex:                return "DeviceIndex";
 
+    case EbvFragSizeEXT:                return "FragSizeEXT";
+    case EbvFragInvocationCountEXT:     return "FragInvocationCountEXT";
+
 #ifdef NV_EXTENSIONS
     case EbvViewportMaskNV:             return "ViewportMaskNV";
     case EbvSecondaryPositionNV:        return "SecondaryPositionNV";
     case EbvSecondaryViewportMaskNV:    return "SecondaryViewportMaskNV";
     case EbvPositionPerViewNV:          return "PositionPerViewNV";
     case EbvViewportMaskPerViewNV:      return "ViewportMaskPerViewNV";
+    case EbvFragFullyCoveredNV:         return "FragFullyCoveredNV";
+    case EbvFragmentSizeNV:             return "FragmentSizeNV";
+    case EbvInvocationsPerPixelNV:      return "InvocationsPerPixelNV";
+    case EbvLaunchIdNV:                 return "LaunchIdNV";
+    case EbvLaunchSizeNV:               return "LaunchSizeNV";
+    case EbvInstanceCustomIndexNV:      return "InstanceCustomIndexNV";
+    case EbvWorldRayOriginNV:           return "WorldRayOriginNV";
+    case EbvWorldRayDirectionNV:        return "WorldRayDirectionNV";
+    case EbvObjectRayOriginNV:          return "ObjectRayOriginNV";
+    case EbvObjectRayDirectionNV:       return "ObjectRayDirectionNV";
+    case EbvRayTminNV:                  return "ObjectRayTminNV";
+    case EbvRayTmaxNV:                  return "ObjectRayTmaxNV";
+    case EbvHitTNV:                     return "HitTNV";
+    case EbvHitKindNV:                  return "HitKindNV";
+    case EbvIncomingRayFlagsNV:         return "IncomingRayFlagsNV";
+    case EbvObjectToWorldNV:            return "ObjectToWorldNV";
+    case EbvWorldToObjectNV:            return "WorldToObjectNV";
+
+    case EbvBaryCoordNV:                return "BaryCoordNV";
+    case EbvBaryCoordNoPerspNV:         return "BaryCoordNoPerspNV";
+    case EbvTaskCountNV:                return "TaskCountNV";
+    case EbvPrimitiveCountNV:           return "PrimitiveCountNV";
+    case EbvPrimitiveIndicesNV:         return "PrimitiveIndicesNV";
+    case EbvClipDistancePerViewNV:      return "ClipDistancePerViewNV";
+    case EbvCullDistancePerViewNV:      return "CullDistancePerViewNV";
+    case EbvLayerPerViewNV:             return "LayerPerViewNV";
+    case EbvMeshViewCountNV:            return "MeshViewCountNV";
+    case EbvMeshViewIndicesNV:          return "MeshViewIndicesNV";
 #endif 
     default:                      return "unknown built-in variable";
     }
@@ -364,7 +460,7 @@
 
 __inline const char* GetPrecisionQualifierString(TPrecisionQualifier p)
 {
-    switch(p) {
+    switch (p) {
     case EpqNone:   return "";        break;
     case EpqLow:    return "lowp";    break;
     case EpqMedium: return "mediump"; break;
@@ -373,6 +469,75 @@
     }
 }
 
+__inline bool isTypeSignedInt(TBasicType type)
+{
+    switch (type) {
+    case EbtInt8:
+    case EbtInt16:
+    case EbtInt:
+    case EbtInt64:
+        return true;
+    default:
+        return false;
+    }
+}
+
+__inline bool isTypeUnsignedInt(TBasicType type)
+{
+    switch (type) {
+    case EbtUint8:
+    case EbtUint16:
+    case EbtUint:
+    case EbtUint64:
+        return true;
+    default:
+        return false;
+    }
+}
+
+__inline bool isTypeInt(TBasicType type)
+{
+    return isTypeSignedInt(type) || isTypeUnsignedInt(type);
+}
+
+__inline bool isTypeFloat(TBasicType type)
+{
+    switch (type) {
+    case EbtFloat:
+    case EbtDouble:
+    case EbtFloat16:
+        return true;
+    default:
+        return false;
+    }
+}
+
+__inline int getTypeRank(TBasicType type) {
+    int res = -1;
+    switch(type) {
+    case EbtInt8:
+    case EbtUint8:
+        res = 0;
+        break;
+    case EbtInt16:
+    case EbtUint16:
+        res = 1;
+        break;
+    case EbtInt:
+    case EbtUint:
+        res = 2;
+        break;
+    case EbtInt64:
+    case EbtUint64:
+        res = 3;
+        break;
+    default:
+        assert(false);
+        break;
+    }
+    return res;
+}
+
 } // end namespace glslang
 
 #endif // _BASICTYPES_INCLUDED_
diff --git a/glslang/Include/Common.h b/glslang/Include/Common.h
index 0f2c908..35eaa31 100644
--- a/glslang/Include/Common.h
+++ b/glslang/Include/Common.h
@@ -37,19 +37,6 @@
 #ifndef _COMMON_INCLUDED_
 #define _COMMON_INCLUDED_
 
-#if (defined(_MSC_VER) && _MSC_VER < 1900 /*vs2015*/) || defined MINGW_HAS_SECURE_API
-    #include <basetsd.h>
-    #define snprintf sprintf_s
-    #define safe_vsprintf(buf,max,format,args) vsnprintf_s((buf), (max), (max), (format), (args))
-#elif defined (solaris)
-    #define safe_vsprintf(buf,max,format,args) vsnprintf((buf), (max), (format), (args))
-    #include <sys/int_types.h>
-    #define UINT_PTR uintptr_t
-#else
-    #define safe_vsprintf(buf,max,format,args) vsnprintf((buf), (max), (format), (args))
-    #include <stdint.h>
-    #define UINT_PTR uintptr_t
-#endif
 
 #if defined(__ANDROID__) || _MSC_VER < 1700
 #include <sstream>
@@ -63,19 +50,40 @@
 }
 #endif
 
-#if defined(_MSC_VER) && _MSC_VER < 1700
-inline long long int strtoll (const char* str, char** endptr, int base)
-{
-  return _strtoi64(str, endptr, base);
-}
-inline unsigned long long int strtoull (const char* str, char** endptr, int base)
-{
-  return _strtoui64(str, endptr, base);
-}
-inline long long int atoll (const char* str)
-{
-  return strtoll(str, NULL, 10);
-}
+#if (defined(_MSC_VER) && _MSC_VER < 1900 /*vs2015*/) || defined MINGW_HAS_SECURE_API
+    #include <basetsd.h>
+    #ifndef snprintf
+    #define snprintf sprintf_s
+    #endif
+    #define safe_vsprintf(buf,max,format,args) vsnprintf_s((buf), (max), (max), (format), (args))
+#elif defined (solaris)
+    #define safe_vsprintf(buf,max,format,args) vsnprintf((buf), (max), (format), (args))
+    #include <sys/int_types.h>
+    #define UINT_PTR uintptr_t
+#else
+    #define safe_vsprintf(buf,max,format,args) vsnprintf((buf), (max), (format), (args))
+    #include <stdint.h>
+    #define UINT_PTR uintptr_t
+#endif
+
+#if defined(_MSC_VER) && _MSC_VER < 1800
+    #include <stdlib.h>
+    inline long long int strtoll (const char* str, char** endptr, int base)
+    {
+        return _strtoi64(str, endptr, base);
+    }
+    inline unsigned long long int strtoull (const char* str, char** endptr, int base)
+    {
+        return _strtoui64(str, endptr, base);
+    }
+    inline long long int atoll (const char* str)
+    {
+        return strtoll(str, NULL, 10);
+    }
+#endif
+
+#if defined(_MSC_VER)
+#define strdup _strdup
 #endif
 
 /* windows only pragma */
@@ -151,7 +159,7 @@
     return new(memory) TString(s);
 }
 
-template<class T> inline T* NewPoolObject(T)
+template<class T> inline T* NewPoolObject(T*)
 {
     return new(GetThreadPoolAllocator().allocate(sizeof(T))) T;
 }
@@ -222,6 +230,7 @@
 
 struct TSourceLoc {
     void init() { name = nullptr; string = 0; line = 0; column = 0; }
+    void init(int stringNum) { init(); string = stringNum; }
     // Returns the name if it exists. Otherwise, returns the string number.
     std::string getStringNameOrNum(bool quoteStringName = true) const
     {
@@ -235,7 +244,10 @@
     int column;
 };
 
-typedef TMap<TString, TString> TPragmaTable;
+class TPragmaTable : public TMap<TString, TString> {
+public:
+    POOL_ALLOCATOR_NEW_DELETE(GetThreadPoolAllocator())
+};
 
 const int MaxTokenLength = 1024;
 
diff --git a/glslang/Include/ConstantUnion.h b/glslang/Include/ConstantUnion.h
index f66a7ff..3e93340 100644
--- a/glslang/Include/ConstantUnion.h
+++ b/glslang/Include/ConstantUnion.h
@@ -1,6 +1,7 @@
 //
 // Copyright (C) 2002-2005  3Dlabs Inc. Ltd.
 // Copyright (C) 2013 LunarG, Inc.
+// Copyright (C) 2017 ARM Limited.
 //
 // All rights reserved.
 //
@@ -37,6 +38,9 @@
 #ifndef _CONSTANT_UNION_INCLUDED_
 #define _CONSTANT_UNION_INCLUDED_
 
+#include "../Include/Common.h"
+#include "../Include/BaseTypes.h"
+
 namespace glslang {
 
 class TConstUnion {
@@ -45,6 +49,30 @@
 
     TConstUnion() : iConst(0), type(EbtInt) { }
 
+    void setI8Const(signed char i)
+    {
+       i8Const = i;
+       type = EbtInt8;
+    }
+
+    void setU8Const(unsigned char u)
+    {
+       u8Const = u;
+       type = EbtUint8;
+    }
+
+    void setI16Const(signed short i)
+    {
+       i16Const = i;
+       type = EbtInt16;
+    }
+
+    void setU16Const(unsigned short u)
+    {
+       u16Const = u;
+       type = EbtUint16;
+    }
+
     void setIConst(int i)
     {
         iConst = i;
@@ -87,6 +115,10 @@
         type = EbtString;
     }
 
+    signed char        getI8Const() const  { return i8Const; }
+    unsigned char      getU8Const() const  { return u8Const; }
+    signed short       getI16Const() const { return i16Const; }
+    unsigned short     getU16Const() const { return u16Const; }
     int                getIConst() const   { return iConst; }
     unsigned int       getUConst() const   { return uConst; }
     long long          getI64Const() const { return i64Const; }
@@ -95,6 +127,38 @@
     bool               getBConst() const   { return bConst; }
     const TString*     getSConst() const   { return sConst; }
 
+    bool operator==(const signed char i) const
+    {
+        if (i == i8Const)
+            return true;
+
+        return false;
+    }
+
+    bool operator==(const unsigned char u) const
+    {
+        if (u == u8Const)
+            return true;
+
+        return false;
+    }
+
+   bool operator==(const signed short i) const
+    {
+        if (i == i16Const)
+            return true;
+
+        return false;
+    }
+
+    bool operator==(const unsigned short u) const
+    {
+        if (u == u16Const)
+            return true;
+
+        return false;
+    }
+
     bool operator==(const int i) const
     {
         if (i == iConst)
@@ -149,6 +213,26 @@
             return false;
 
         switch (type) {
+        case EbtInt16:
+            if (constant.i16Const == i16Const)
+                return true;
+
+            break;
+         case EbtUint16:
+            if (constant.u16Const == u16Const)
+                return true;
+
+            break;
+        case EbtInt8:
+            if (constant.i8Const == i8Const)
+                return true;
+
+            break;
+         case EbtUint8:
+            if (constant.u8Const == u8Const)
+                return true;
+
+            break;
         case EbtInt:
             if (constant.iConst == iConst)
                 return true;
@@ -186,6 +270,26 @@
         return false;
     }
 
+    bool operator!=(const signed char i) const
+    {
+        return !operator==(i);
+    }
+
+    bool operator!=(const unsigned char u) const
+    {
+        return !operator==(u);
+    }
+
+    bool operator!=(const signed short i) const
+    {
+        return !operator==(i);
+    }
+
+    bool operator!=(const unsigned short u) const
+    {
+        return !operator==(u);
+    }
+
     bool operator!=(const int i) const
     {
         return !operator==(i);
@@ -225,6 +329,26 @@
     {
         assert(type == constant.type);
         switch (type) {
+        case EbtInt8:
+            if (i8Const > constant.i8Const)
+                return true;
+
+            return false;
+        case EbtUint8:
+            if (u8Const > constant.u8Const)
+                return true;
+
+            return false;
+        case EbtInt16:
+            if (i16Const > constant.i16Const)
+                return true;
+
+            return false;
+        case EbtUint16:
+            if (u16Const > constant.u16Const)
+                return true;
+
+            return false;
         case EbtInt:
             if (iConst > constant.iConst)
                 return true;
@@ -260,6 +384,26 @@
     {
         assert(type == constant.type);
         switch (type) {
+        case EbtInt8:
+            if (i8Const < constant.i8Const)
+                return true;
+
+            return false;
+        case EbtUint8:
+            if (u8Const < constant.u8Const)
+                return true;
+
+            return false;
+       case EbtInt16:
+            if (i16Const < constant.i16Const)
+                return true;
+
+            return false;
+        case EbtUint16:
+            if (u16Const < constant.u16Const)
+                return true;
+
+            return false;
         case EbtInt:
             if (iConst < constant.iConst)
                 return true;
@@ -296,9 +440,13 @@
         TConstUnion returnValue;
         assert(type == constant.type);
         switch (type) {
-        case EbtInt: returnValue.setIConst(iConst + constant.iConst); break;
-        case EbtInt64: returnValue.setI64Const(i64Const + constant.i64Const); break;
-        case EbtUint: returnValue.setUConst(uConst + constant.uConst); break;
+        case EbtInt8:   returnValue.setI8Const(i8Const + constant.i8Const); break;
+        case EbtInt16:  returnValue.setI16Const(i16Const + constant.i16Const); break;
+        case EbtInt:    returnValue.setIConst(iConst + constant.iConst); break;
+        case EbtInt64:  returnValue.setI64Const(i64Const + constant.i64Const); break;
+        case EbtUint8:  returnValue.setU8Const(u8Const + constant.u8Const); break;
+        case EbtUint16: returnValue.setU16Const(u16Const + constant.u16Const); break;
+        case EbtUint:   returnValue.setUConst(uConst + constant.uConst); break;
         case EbtUint64: returnValue.setU64Const(u64Const + constant.u64Const); break;
         case EbtDouble: returnValue.setDConst(dConst + constant.dConst); break;
         default: assert(false && "Default missing");
@@ -312,9 +460,13 @@
         TConstUnion returnValue;
         assert(type == constant.type);
         switch (type) {
-        case EbtInt: returnValue.setIConst(iConst - constant.iConst); break;
-        case EbtInt64: returnValue.setI64Const(i64Const - constant.i64Const); break;
-        case EbtUint: returnValue.setUConst(uConst - constant.uConst); break;
+        case EbtInt8:   returnValue.setI8Const(i8Const - constant.i8Const); break;
+        case EbtInt16:  returnValue.setI16Const(i16Const - constant.i16Const); break;
+        case EbtInt:    returnValue.setIConst(iConst - constant.iConst); break;
+        case EbtInt64:  returnValue.setI64Const(i64Const - constant.i64Const); break;
+        case EbtUint8:  returnValue.setU8Const(u8Const - constant.u8Const); break;
+        case EbtUint16: returnValue.setU16Const(u16Const - constant.u16Const); break;
+        case EbtUint:   returnValue.setUConst(uConst - constant.uConst); break;
         case EbtUint64: returnValue.setU64Const(u64Const - constant.u64Const); break;
         case EbtDouble: returnValue.setDConst(dConst - constant.dConst); break;
         default: assert(false && "Default missing");
@@ -328,9 +480,13 @@
         TConstUnion returnValue;
         assert(type == constant.type);
         switch (type) {
-        case EbtInt: returnValue.setIConst(iConst * constant.iConst); break;
-        case EbtInt64: returnValue.setI64Const(i64Const * constant.i64Const); break;
-        case EbtUint: returnValue.setUConst(uConst * constant.uConst); break;
+        case EbtInt8:   returnValue.setI8Const(i8Const * constant.i8Const); break;
+        case EbtInt16:  returnValue.setI16Const(i16Const * constant.i16Const); break;
+        case EbtInt:    returnValue.setIConst(iConst * constant.iConst); break;
+        case EbtInt64:  returnValue.setI64Const(i64Const * constant.i64Const); break;
+        case EbtUint8:  returnValue.setU8Const(u8Const * constant.u8Const); break;
+        case EbtUint16: returnValue.setU16Const(u16Const * constant.u16Const); break;
+        case EbtUint:   returnValue.setUConst(uConst * constant.uConst); break;
         case EbtUint64: returnValue.setU64Const(u64Const * constant.u64Const); break;
         case EbtDouble: returnValue.setDConst(dConst * constant.dConst); break;
         default: assert(false && "Default missing");
@@ -344,9 +500,13 @@
         TConstUnion returnValue;
         assert(type == constant.type);
         switch (type) {
-        case EbtInt: returnValue.setIConst(iConst % constant.iConst); break;
-        case EbtInt64: returnValue.setI64Const(i64Const % constant.i64Const); break;
-        case EbtUint: returnValue.setUConst(uConst % constant.uConst); break;
+        case EbtInt8:   returnValue.setI8Const(i8Const % constant.i8Const); break;
+        case EbtInt16:  returnValue.setI8Const(i8Const % constant.i16Const); break;
+        case EbtInt:    returnValue.setIConst(iConst % constant.iConst); break;
+        case EbtInt64:  returnValue.setI64Const(i64Const % constant.i64Const); break;
+        case EbtUint8:  returnValue.setU8Const(u8Const % constant.u8Const); break;
+        case EbtUint16: returnValue.setU16Const(u16Const % constant.u16Const); break;
+        case EbtUint:   returnValue.setUConst(uConst % constant.uConst); break;
         case EbtUint64: returnValue.setU64Const(u64Const % constant.u64Const); break;
         default:     assert(false && "Default missing");
         }
@@ -358,8 +518,64 @@
     {
         TConstUnion returnValue;
         switch (type) {
+        case EbtInt8:
+            switch (constant.type) {
+            case EbtInt8:   returnValue.setI8Const(i8Const >> constant.i8Const);  break;
+            case EbtUint8:  returnValue.setI8Const(i8Const >> constant.u8Const);  break;
+            case EbtInt16:  returnValue.setI8Const(i8Const >> constant.i16Const); break;
+            case EbtUint16: returnValue.setI8Const(i8Const >> constant.u16Const); break;
+            case EbtInt:    returnValue.setI8Const(i8Const >> constant.iConst);   break;
+            case EbtUint:   returnValue.setI8Const(i8Const >> constant.uConst);   break;
+            case EbtInt64:  returnValue.setI8Const(i8Const >> constant.i64Const); break;
+            case EbtUint64: returnValue.setI8Const(i8Const >> constant.u64Const); break;
+            default:       assert(false && "Default missing");
+            }
+            break;
+        case EbtUint8:
+            switch (constant.type) {
+            case EbtInt8:   returnValue.setU8Const(u8Const >> constant.i8Const);  break;
+            case EbtUint8:  returnValue.setU8Const(u8Const >> constant.u8Const);  break;
+            case EbtInt16:  returnValue.setU8Const(u8Const >> constant.i16Const); break;
+            case EbtUint16: returnValue.setU8Const(u8Const >> constant.u16Const); break;
+            case EbtInt:    returnValue.setU8Const(u8Const >> constant.iConst);   break;
+            case EbtUint:   returnValue.setU8Const(u8Const >> constant.uConst);   break;
+            case EbtInt64:  returnValue.setU8Const(u8Const >> constant.i64Const); break;
+            case EbtUint64: returnValue.setU8Const(u8Const >> constant.u64Const); break;
+            default:       assert(false && "Default missing");
+            }
+            break;
+        case EbtInt16:
+            switch (constant.type) {
+            case EbtInt8:   returnValue.setI16Const(i16Const >> constant.i8Const);  break;
+            case EbtUint8:  returnValue.setI16Const(i16Const >> constant.u8Const);  break;
+            case EbtInt16:  returnValue.setI16Const(i16Const >> constant.i16Const); break;
+            case EbtUint16: returnValue.setI16Const(i16Const >> constant.u16Const); break;
+            case EbtInt:    returnValue.setI16Const(i16Const >> constant.iConst);   break;
+            case EbtUint:   returnValue.setI16Const(i16Const >> constant.uConst);   break;
+            case EbtInt64:  returnValue.setI16Const(i16Const >> constant.i64Const); break;
+            case EbtUint64: returnValue.setI16Const(i16Const >> constant.u64Const); break;
+            default:       assert(false && "Default missing");
+            }
+            break;
+        case EbtUint16:
+            switch (constant.type) {
+            case EbtInt8:   returnValue.setU16Const(u16Const >> constant.i8Const);  break;
+            case EbtUint8:  returnValue.setU16Const(u16Const >> constant.u8Const);  break;
+            case EbtInt16:  returnValue.setU16Const(u16Const >> constant.i16Const); break;
+            case EbtUint16: returnValue.setU16Const(u16Const >> constant.u16Const); break;
+            case EbtInt:    returnValue.setU16Const(u16Const >> constant.iConst);   break;
+            case EbtUint:   returnValue.setU16Const(u16Const >> constant.uConst);   break;
+            case EbtInt64:  returnValue.setU16Const(u16Const >> constant.i64Const); break;
+            case EbtUint64: returnValue.setU16Const(u16Const >> constant.u64Const); break;
+            default:       assert(false && "Default missing");
+            }
+            break;
         case EbtInt:
             switch (constant.type) {
+            case EbtInt8:   returnValue.setIConst(iConst >> constant.i8Const);  break;
+            case EbtUint8:  returnValue.setIConst(iConst >> constant.u8Const);  break;
+            case EbtInt16:  returnValue.setIConst(iConst >> constant.i16Const); break;
+            case EbtUint16: returnValue.setIConst(iConst >> constant.u16Const); break;
             case EbtInt:    returnValue.setIConst(iConst >> constant.iConst);   break;
             case EbtUint:   returnValue.setIConst(iConst >> constant.uConst);   break;
             case EbtInt64:  returnValue.setIConst(iConst >> constant.i64Const); break;
@@ -369,6 +585,10 @@
             break;
         case EbtUint:
             switch (constant.type) {
+            case EbtInt8:   returnValue.setUConst(uConst >> constant.i8Const);  break;
+            case EbtUint8:  returnValue.setUConst(uConst >> constant.u8Const);  break;
+            case EbtInt16:  returnValue.setUConst(uConst >> constant.i16Const); break;
+            case EbtUint16: returnValue.setUConst(uConst >> constant.u16Const); break;
             case EbtInt:    returnValue.setUConst(uConst >> constant.iConst);   break;
             case EbtUint:   returnValue.setUConst(uConst >> constant.uConst);   break;
             case EbtInt64:  returnValue.setUConst(uConst >> constant.i64Const); break;
@@ -378,6 +598,10 @@
             break;
          case EbtInt64:
             switch (constant.type) {
+            case EbtInt8:   returnValue.setI64Const(i64Const >> constant.i8Const);  break;
+            case EbtUint8:  returnValue.setI64Const(i64Const >> constant.u8Const);  break;
+            case EbtInt16:  returnValue.setI64Const(i64Const >> constant.i16Const); break;
+            case EbtUint16: returnValue.setI64Const(i64Const >> constant.u16Const); break;
             case EbtInt:    returnValue.setI64Const(i64Const >> constant.iConst);   break;
             case EbtUint:   returnValue.setI64Const(i64Const >> constant.uConst);   break;
             case EbtInt64:  returnValue.setI64Const(i64Const >> constant.i64Const); break;
@@ -387,6 +611,10 @@
             break;
         case EbtUint64:
             switch (constant.type) {
+            case EbtInt8:   returnValue.setU64Const(u64Const >> constant.i8Const);  break;
+            case EbtUint8:  returnValue.setU64Const(u64Const >> constant.u8Const);  break;
+            case EbtInt16:  returnValue.setU64Const(u64Const >> constant.i16Const); break;
+            case EbtUint16: returnValue.setU64Const(u64Const >> constant.u16Const); break;
             case EbtInt:    returnValue.setU64Const(u64Const >> constant.iConst);   break;
             case EbtUint:   returnValue.setU64Const(u64Const >> constant.uConst);   break;
             case EbtInt64:  returnValue.setU64Const(u64Const >> constant.i64Const); break;
@@ -404,8 +632,64 @@
     {
         TConstUnion returnValue;
         switch (type) {
+        case EbtInt8:
+            switch (constant.type) {
+            case EbtInt8:   returnValue.setI8Const(i8Const << constant.i8Const);  break;
+            case EbtUint8:  returnValue.setI8Const(i8Const << constant.u8Const);  break;
+            case EbtInt16:  returnValue.setI8Const(i8Const << constant.i16Const); break;
+            case EbtUint16: returnValue.setI8Const(i8Const << constant.u16Const); break;
+            case EbtInt:    returnValue.setI8Const(i8Const << constant.iConst);   break;
+            case EbtUint:   returnValue.setI8Const(i8Const << constant.uConst);   break;
+            case EbtInt64:  returnValue.setI8Const(i8Const << constant.i64Const); break;
+            case EbtUint64: returnValue.setI8Const(i8Const << constant.u64Const); break;
+            default:       assert(false && "Default missing");
+            }
+            break;
+        case EbtUint8:
+            switch (constant.type) {
+            case EbtInt8:   returnValue.setU8Const(u8Const << constant.i8Const);  break;
+            case EbtUint8:  returnValue.setU8Const(u8Const << constant.u8Const);  break;
+            case EbtInt16:  returnValue.setU8Const(u8Const << constant.i16Const); break;
+            case EbtUint16: returnValue.setU8Const(u8Const << constant.u16Const); break;
+            case EbtInt:    returnValue.setU8Const(u8Const << constant.iConst);   break;
+            case EbtUint:   returnValue.setU8Const(u8Const << constant.uConst);   break;
+            case EbtInt64:  returnValue.setU8Const(u8Const << constant.i64Const); break;
+            case EbtUint64: returnValue.setU8Const(u8Const << constant.u64Const); break;
+            default:       assert(false && "Default missing");
+            }
+            break;
+        case EbtInt16:
+            switch (constant.type) {
+            case EbtInt8:   returnValue.setI16Const(i16Const << constant.i8Const);  break;
+            case EbtUint8:  returnValue.setI16Const(i16Const << constant.u8Const);  break;
+            case EbtInt16:  returnValue.setI16Const(i16Const << constant.i16Const); break;
+            case EbtUint16: returnValue.setI16Const(i16Const << constant.u16Const); break;
+            case EbtInt:    returnValue.setI16Const(i16Const << constant.iConst);   break;
+            case EbtUint:   returnValue.setI16Const(i16Const << constant.uConst);   break;
+            case EbtInt64:  returnValue.setI16Const(i16Const << constant.i64Const); break;
+            case EbtUint64: returnValue.setI16Const(i16Const << constant.u64Const); break;
+            default:       assert(false && "Default missing");
+            }
+            break;
+        case EbtUint16:
+            switch (constant.type) {
+            case EbtInt8:   returnValue.setU16Const(u16Const << constant.i8Const);  break;
+            case EbtUint8:  returnValue.setU16Const(u16Const << constant.u8Const);  break;
+            case EbtInt16:  returnValue.setU16Const(u16Const << constant.i16Const); break;
+            case EbtUint16: returnValue.setU16Const(u16Const << constant.u16Const); break;
+            case EbtInt:    returnValue.setU16Const(u16Const << constant.iConst);   break;
+            case EbtUint:   returnValue.setU16Const(u16Const << constant.uConst);   break;
+            case EbtInt64:  returnValue.setU16Const(u16Const << constant.i64Const); break;
+            case EbtUint64: returnValue.setU16Const(u16Const << constant.u64Const); break;
+            default:       assert(false && "Default missing");
+            }
+            break;
         case EbtInt:
             switch (constant.type) {
+            case EbtInt8:   returnValue.setIConst(iConst << constant.i8Const);  break;
+            case EbtUint8:  returnValue.setIConst(iConst << constant.u8Const);  break;
+            case EbtInt16:  returnValue.setIConst(iConst << constant.i16Const); break;
+            case EbtUint16: returnValue.setIConst(iConst << constant.u16Const); break;
             case EbtInt:    returnValue.setIConst(iConst << constant.iConst);   break;
             case EbtUint:   returnValue.setIConst(iConst << constant.uConst);   break;
             case EbtInt64:  returnValue.setIConst(iConst << constant.i64Const); break;
@@ -415,6 +699,10 @@
             break;
         case EbtUint:
             switch (constant.type) {
+            case EbtInt8:   returnValue.setUConst(uConst << constant.i8Const);  break;
+            case EbtUint8:  returnValue.setUConst(uConst << constant.u8Const);  break;
+            case EbtInt16:  returnValue.setUConst(uConst << constant.i16Const); break;
+            case EbtUint16: returnValue.setUConst(uConst << constant.u16Const); break;
             case EbtInt:    returnValue.setUConst(uConst << constant.iConst);   break;
             case EbtUint:   returnValue.setUConst(uConst << constant.uConst);   break;
             case EbtInt64:  returnValue.setUConst(uConst << constant.i64Const); break;
@@ -422,8 +710,12 @@
             default:       assert(false && "Default missing");
             }
             break;
-        case EbtInt64:
+         case EbtInt64:
             switch (constant.type) {
+            case EbtInt8:   returnValue.setI64Const(i64Const << constant.i8Const);  break;
+            case EbtUint8:  returnValue.setI64Const(i64Const << constant.u8Const);  break;
+            case EbtInt16:  returnValue.setI64Const(i64Const << constant.i16Const); break;
+            case EbtUint16: returnValue.setI64Const(i64Const << constant.u16Const); break;
             case EbtInt:    returnValue.setI64Const(i64Const << constant.iConst);   break;
             case EbtUint:   returnValue.setI64Const(i64Const << constant.uConst);   break;
             case EbtInt64:  returnValue.setI64Const(i64Const << constant.i64Const); break;
@@ -433,6 +725,10 @@
             break;
         case EbtUint64:
             switch (constant.type) {
+            case EbtInt8:   returnValue.setU64Const(u64Const << constant.i8Const);  break;
+            case EbtUint8:  returnValue.setU64Const(u64Const << constant.u8Const);  break;
+            case EbtInt16:  returnValue.setU64Const(u64Const << constant.i16Const); break;
+            case EbtUint16: returnValue.setU64Const(u64Const << constant.u16Const); break;
             case EbtInt:    returnValue.setU64Const(u64Const << constant.iConst);   break;
             case EbtUint:   returnValue.setU64Const(u64Const << constant.uConst);   break;
             case EbtInt64:  returnValue.setU64Const(u64Const << constant.i64Const); break;
@@ -451,8 +747,12 @@
         TConstUnion returnValue;
         assert(type == constant.type);
         switch (type) {
-        case EbtInt:  returnValue.setIConst(iConst & constant.iConst); break;
-        case EbtUint: returnValue.setUConst(uConst & constant.uConst); break;
+        case EbtInt8:   returnValue.setI8Const(i8Const & constant.i8Const); break;
+        case EbtUint8:  returnValue.setU8Const(u8Const & constant.u8Const); break;
+        case EbtInt16:  returnValue.setI16Const(i16Const & constant.i16Const); break;
+        case EbtUint16: returnValue.setU16Const(u16Const & constant.u16Const); break;
+        case EbtInt:    returnValue.setIConst(iConst & constant.iConst); break;
+        case EbtUint:   returnValue.setUConst(uConst & constant.uConst); break;
         case EbtInt64:  returnValue.setI64Const(i64Const & constant.i64Const); break;
         case EbtUint64: returnValue.setU64Const(u64Const & constant.u64Const); break;
         default:     assert(false && "Default missing");
@@ -466,8 +766,12 @@
         TConstUnion returnValue;
         assert(type == constant.type);
         switch (type) {
-        case EbtInt:  returnValue.setIConst(iConst | constant.iConst); break;
-        case EbtUint: returnValue.setUConst(uConst | constant.uConst); break;
+        case EbtInt8:   returnValue.setI8Const(i8Const | constant.i8Const); break;
+        case EbtUint8:  returnValue.setU8Const(u8Const | constant.u8Const); break;
+        case EbtInt16:  returnValue.setI16Const(i16Const | constant.i16Const); break;
+        case EbtUint16: returnValue.setU16Const(u16Const | constant.u16Const); break;
+        case EbtInt:    returnValue.setIConst(iConst | constant.iConst); break;
+        case EbtUint:   returnValue.setUConst(uConst | constant.uConst); break;
         case EbtInt64:  returnValue.setI64Const(i64Const | constant.i64Const); break;
         case EbtUint64: returnValue.setU64Const(u64Const | constant.u64Const); break;
         default:     assert(false && "Default missing");
@@ -481,8 +785,12 @@
         TConstUnion returnValue;
         assert(type == constant.type);
         switch (type) {
-        case EbtInt:  returnValue.setIConst(iConst ^ constant.iConst); break;
-        case EbtUint: returnValue.setUConst(uConst ^ constant.uConst); break;
+        case EbtInt8:   returnValue.setI8Const(i8Const ^ constant.i8Const); break;
+        case EbtUint8:  returnValue.setU8Const(u8Const ^ constant.u8Const); break;
+        case EbtInt16:  returnValue.setI16Const(i16Const ^ constant.i16Const); break;
+        case EbtUint16: returnValue.setU16Const(u16Const ^ constant.u16Const); break;
+        case EbtInt:    returnValue.setIConst(iConst ^ constant.iConst); break;
+        case EbtUint:   returnValue.setUConst(uConst ^ constant.uConst); break;
         case EbtInt64:  returnValue.setI64Const(i64Const ^ constant.i64Const); break;
         case EbtUint64: returnValue.setU64Const(u64Const ^ constant.u64Const); break;
         default:     assert(false && "Default missing");
@@ -495,8 +803,12 @@
     {
         TConstUnion returnValue;
         switch (type) {
-        case EbtInt:  returnValue.setIConst(~iConst); break;
-        case EbtUint: returnValue.setUConst(~uConst); break;
+        case EbtInt8:   returnValue.setI8Const(~i8Const); break;
+        case EbtUint8:  returnValue.setU8Const(~u8Const); break;
+        case EbtInt16:  returnValue.setI16Const(~i16Const); break;
+        case EbtUint16: returnValue.setU16Const(~u16Const); break;
+        case EbtInt:    returnValue.setIConst(~iConst); break;
+        case EbtUint:   returnValue.setUConst(~uConst); break;
         case EbtInt64:  returnValue.setI64Const(~i64Const); break;
         case EbtUint64: returnValue.setU64Const(~u64Const); break;
         default:     assert(false && "Default missing");
@@ -533,6 +845,10 @@
 
 private:
     union  {
+        signed char        i8Const;     // used for i8vec, scalar int8s
+        unsigned char      u8Const;     // used for u8vec, scalar uint8s
+        signed short       i16Const;    // used for i16vec, scalar int16s
+        unsigned short     u16Const;    // used for u16vec, scalar uint16s
         int                iConst;      // used for ivec, scalar ints
         unsigned int       uConst;      // used for uvec, scalar uints
         long long          i64Const;    // used for i64vec, scalar int64s
@@ -595,9 +911,6 @@
         if (! unionArray || ! rhs.unionArray)
             return false;
 
-        if (! unionArray || ! rhs.unionArray)
-            return false;
-
         return *unionArray == *rhs.unionArray;
     }
     bool operator!=(const TConstUnionArray& rhs) const { return ! operator==(rhs); }
diff --git a/glslang/Include/InitializeGlobals.h b/glslang/Include/InitializeGlobals.h
index 4cf2dca..95d0a40 100644
--- a/glslang/Include/InitializeGlobals.h
+++ b/glslang/Include/InitializeGlobals.h
@@ -37,10 +37,7 @@
 
 namespace glslang {
 
-void InitializeMemoryPools();
-void FreeGlobalPools();
 bool InitializePoolIndex();
-void FreePoolIndex();
 
 } // end namespace glslang
 
diff --git a/glslang/Include/PoolAlloc.h b/glslang/Include/PoolAlloc.h
index 69bacb1..0e237a6 100644
--- a/glslang/Include/PoolAlloc.h
+++ b/glslang/Include/PoolAlloc.h
@@ -250,15 +250,8 @@
 // different times.  But a simple use is to have a global pop
 // with everyone using the same global allocator.
 //
-typedef TPoolAllocator* PoolAllocatorPointer;
 extern TPoolAllocator& GetThreadPoolAllocator();
-
-struct TThreadMemoryPools
-{
-    TPoolAllocator* threadPoolAllocator;
-};
-
-void SetThreadPoolAllocator(TPoolAllocator& poolAllocator);
+void SetThreadPoolAllocator(TPoolAllocator* poolAllocator);
 
 //
 // This STL compatible allocator is intended to be used as the allocator
diff --git a/glslang/Include/ResourceLimits.h b/glslang/Include/ResourceLimits.h
index 0d07b8c..106b21d 100644
--- a/glslang/Include/ResourceLimits.h
+++ b/glslang/Include/ResourceLimits.h
@@ -133,6 +133,15 @@
     int maxCullDistances;
     int maxCombinedClipAndCullDistances;
     int maxSamples;
+    int maxMeshOutputVerticesNV;
+    int maxMeshOutputPrimitivesNV;
+    int maxMeshWorkGroupSizeX_NV;
+    int maxMeshWorkGroupSizeY_NV;
+    int maxMeshWorkGroupSizeZ_NV;
+    int maxTaskWorkGroupSizeX_NV;
+    int maxTaskWorkGroupSizeY_NV;
+    int maxTaskWorkGroupSizeZ_NV;
+    int maxMeshViewCountNV;
 
     TLimits limits;
 };
diff --git a/glslang/Include/ShHandle.h b/glslang/Include/ShHandle.h
index 64ba6d6..df07bd8 100644
--- a/glslang/Include/ShHandle.h
+++ b/glslang/Include/ShHandle.h
@@ -56,11 +56,14 @@
 //
 class TShHandleBase {
 public:
-    TShHandleBase() { }
-    virtual ~TShHandleBase() { }
+    TShHandleBase() { pool = new glslang::TPoolAllocator; }
+    virtual ~TShHandleBase() { delete pool; }
     virtual TCompiler* getAsCompiler() { return 0; }
     virtual TLinker* getAsLinker() { return 0; }
     virtual TUniformMap* getAsUniformMap() { return 0; }
+    virtual glslang::TPoolAllocator* getPool() const { return pool; }
+private:
+    glslang::TPoolAllocator* pool;
 };
 
 //
diff --git a/glslang/Include/Types.h b/glslang/Include/Types.h
old mode 100644
new mode 100755
index 6f58a52..30fc8ce
--- a/glslang/Include/Types.h
+++ b/glslang/Include/Types.h
@@ -2,6 +2,7 @@
 // Copyright (C) 2002-2005  3Dlabs Inc. Ltd.
 // Copyright (C) 2012-2016 LunarG, Inc.
 // Copyright (C) 2015-2016 Google, Inc.
+// Copyright (C) 2017 ARM Limited.
 //
 // All rights reserved.
 //
@@ -80,7 +81,19 @@
     bool   combined : 1;  // true means texture is combined with a sampler, false means texture with no sampler
     bool    sampler : 1;  // true means a pure sampler, other fields should be clear()
     bool   external : 1;  // GL_OES_EGL_image_external
-    unsigned int vectorSize : 3;  // return vector size.  TODO: support arbitrary types.
+    unsigned int vectorSize : 3;  // vector return type size.
+
+    // Some languages support structures as sample results.  Storing the whole structure in the
+    // TSampler is too large, so there is an index to a separate table.
+    static const unsigned structReturnIndexBits = 4;                        // number of index bits to use.
+    static const unsigned structReturnSlots = (1<<structReturnIndexBits)-1; // number of valid values
+    static const unsigned noReturnStruct = structReturnSlots;               // value if no return struct type.
+
+    // Index into a language specific table of texture return structures.
+    unsigned int structReturnIndex : structReturnIndexBits;
+
+    // Encapsulate getting members' vector sizes packed into the vectorSize bitfield.
+    unsigned int getVectorSize() const { return vectorSize; }
 
     bool isImage()       const { return image && dim != EsdSubpass; }
     bool isSubpass()     const { return dim == EsdSubpass; }
@@ -90,6 +103,7 @@
     bool isShadow()      const { return shadow; }
     bool isArrayed()     const { return arrayed; }
     bool isMultiSample() const { return ms; }
+    bool hasReturnStruct() const { return structReturnIndex != noReturnStruct; }
 
     void clear()
     {
@@ -102,6 +116,9 @@
         combined = false;
         sampler = false;
         external = false;
+        structReturnIndex = noReturnStruct;
+
+        // by default, returns a single vec4;
         vectorSize = 4;
     }
 
@@ -160,16 +177,17 @@
 
     bool operator==(const TSampler& right) const
     {
-        return type == right.type &&
-                dim == right.dim &&
-            arrayed == right.arrayed &&
-             shadow == right.shadow &&
-                 ms == right.ms &&
-              image == right.image &&
-           combined == right.combined &&
-            sampler == right.sampler &&
-           external == right.external &&
-         vectorSize == right.vectorSize;
+        return      type == right.type &&
+                     dim == right.dim &&
+                 arrayed == right.arrayed &&
+                  shadow == right.shadow &&
+                      ms == right.ms &&
+                   image == right.image &&
+                combined == right.combined &&
+                 sampler == right.sampler &&
+                external == right.external &&
+              vectorSize == right.vectorSize &&
+       structReturnIndex == right.structReturnIndex;            
     }
 
     bool operator!=(const TSampler& right) const
@@ -187,9 +205,16 @@
         }
 
         switch (type) {
-        case EbtFloat:               break;
-        case EbtInt:  s.append("i"); break;
-        case EbtUint: s.append("u"); break;
+        case EbtFloat:                   break;
+#ifdef AMD_EXTENSIONS
+        case EbtFloat16: s.append("f16"); break;
+#endif
+        case EbtInt8:   s.append("i8");  break;
+        case EbtUint16: s.append("u8");  break;
+        case EbtInt16:  s.append("i16"); break;
+        case EbtUint8:  s.append("u16"); break;
+        case EbtInt:    s.append("i");   break;
+        case EbtUint:   s.append("u");   break;
         case EbtInt64:  s.append("i64"); break;
         case EbtUint64: s.append("u64"); break;
         default:  break;  // some compilers want this
@@ -252,6 +277,7 @@
     ElpStd140,
     ElpStd430,
     ElpPacked,
+    ElpScalar,
     ElpCount        // If expanding, see bitfield width below
 };
 
@@ -400,6 +426,7 @@
         invariant = false;
         noContraction = false;
         makeTemporary();
+        declaredBuiltIn = EbvNone;
     }
 
     // drop qualifiers that don't belong in a temporary variable
@@ -411,6 +438,7 @@
         clearInterstage();
         clearMemory();
         specConstant = false;
+        nonUniform = false;
         clearLayout();
     }
 
@@ -430,11 +458,22 @@
 #ifdef AMD_EXTENSIONS
         explicitInterp = false;
 #endif
+#ifdef NV_EXTENSIONS
+        pervertexNV = false;
+        perPrimitiveNV = false;
+        perViewNV = false;
+        perTaskNV = false;
+#endif
     }
 
     void clearMemory()
     {
         coherent     = false;
+        devicecoherent = false;
+        queuefamilycoherent = false;
+        workgroupcoherent = false;
+        subgroupcoherent  = false;
+        nonprivate = false;
         volatil      = false;
         restrict     = false;
         readonly     = false;
@@ -444,7 +483,7 @@
     // Drop just the storage qualification, which perhaps should
     // never be done, as it is fundamentally inconsistent, but need to
     // explore what downstream consumers need.
-    // E.g., in a deference, it is an inconsistency between:
+    // E.g., in a dereference, it is an inconsistency between:
     // A) partially dereferenced resource is still in the storage class it started in
     // B) partially dereferenced resource is a new temporary object
     // If A, then nothing should change, if B, then everything should change, but this is half way.
@@ -452,11 +491,13 @@
     {
         storage      = EvqTemporary;
         specConstant = false;
+        nonUniform   = false;
     }
 
     const char*         semanticName;
     TStorageQualifier   storage   : 6;
     TBuiltInVariable    builtIn   : 8;
+    TBuiltInVariable    declaredBuiltIn : 8;
     TPrecisionQualifier precision : 3;
     bool invariant    : 1; // require canonical treatment for cross-shader invariance
     bool noContraction: 1; // prevent contraction and reassociation, e.g., for 'precise' keyword, and expressions it affects
@@ -467,19 +508,36 @@
 #ifdef AMD_EXTENSIONS
     bool explicitInterp : 1;
 #endif
+#ifdef NV_EXTENSIONS
+    bool pervertexNV  : 1;
+    bool perPrimitiveNV : 1;
+    bool perViewNV : 1;
+    bool perTaskNV : 1;
+#endif
     bool patch        : 1;
     bool sample       : 1;
     bool coherent     : 1;
+    bool devicecoherent : 1;
+    bool queuefamilycoherent : 1;
+    bool workgroupcoherent : 1;
+    bool subgroupcoherent  : 1;
+    bool nonprivate   : 1;
     bool volatil      : 1;
     bool restrict     : 1;
     bool readonly     : 1;
     bool writeonly    : 1;
     bool specConstant : 1;  // having a constant_id is not sufficient: expressions have no id, but are still specConstant
+    bool nonUniform   : 1;
 
     bool isMemory() const
     {
-        return coherent || volatil || restrict || readonly || writeonly;
+        return subgroupcoherent || workgroupcoherent || queuefamilycoherent || devicecoherent || coherent || volatil || restrict || readonly || writeonly || nonprivate;
     }
+    bool isMemoryQualifierImageAndSSBOOnly() const
+    {
+        return subgroupcoherent || workgroupcoherent || queuefamilycoherent || devicecoherent || coherent || volatil || restrict || readonly || writeonly;
+    }
+
     bool isInterpolation() const
     {
 #ifdef AMD_EXTENSIONS
@@ -488,9 +546,21 @@
         return flat || smooth || nopersp;
 #endif
     }
+
+#ifdef AMD_EXTENSIONS
+    bool isExplicitInterpolation() const
+    {
+        return explicitInterp;
+    }
+#endif
+
     bool isAuxiliary() const
     {
+#ifdef NV_EXTENSIONS
+        return centroid || patch || sample || pervertexNV;
+#else
         return centroid || patch || sample;
+#endif
     }
 
     bool isPipeInput() const
@@ -557,6 +627,33 @@
         }
     }
 
+    bool isPerPrimitive() const
+    {
+#ifdef NV_EXTENSIONS
+        return perPrimitiveNV;
+#else
+        return false;
+#endif
+    }
+
+    bool isPerView() const
+    {
+#ifdef NV_EXTENSIONS
+        return perViewNV;
+#else
+        return false;
+#endif
+    }
+
+    bool isTaskMemory() const
+    {
+#ifdef NV_EXTENSIONS
+        return perTaskNV;
+#else
+        return false;
+#endif
+    }
+
     bool isIo() const
     {
         switch (storage) {
@@ -580,6 +677,22 @@
         }
     }
 
+    // non-built-in symbols that might link between compilation units
+    bool isLinkable() const
+    {
+        switch (storage) {
+        case EvqGlobal:
+        case EvqVaryingIn:
+        case EvqVaryingOut:
+        case EvqUniform:
+        case EvqBuffer:
+        case EvqShared:
+            return true;
+        default:
+            return false;
+        }
+    }
+
     // True if this type of IO is supposed to be arrayed with extra level for per-vertex data
     bool isArrayedIo(EShLanguage language) const
     {
@@ -590,6 +703,13 @@
             return ! patch && (isPipeInput() || isPipeOutput());
         case EShLangTessEvaluation:
             return ! patch && isPipeInput();
+#ifdef NV_EXTENSIONS
+        case EShLangFragment:
+            return pervertexNV && isPipeInput();
+        case EShLangMeshNV:
+            return ! perTaskNV && isPipeOutput();
+#endif
+
         default:
             return false;
         }
@@ -606,6 +726,7 @@
         layoutViewportRelative = false;
         // -2048 as the default value indicating layoutSecondaryViewportRelative is not set
         layoutSecondaryViewportRelativeOffset = -2048;
+        layoutShaderRecordNV = false;
 #endif
 
         clearInterstageLayout();
@@ -633,54 +754,61 @@
         layoutXfbOffset = layoutXfbOffsetEnd;
     }
 
-    bool hasLayout() const
+    bool hasNonXfbLayout() const
     {
         return hasUniformLayout() ||
                hasAnyLocation() ||
                hasStream() ||
-               hasXfb() ||
                hasFormat() ||
+#ifdef NV_EXTENSIONS
+               layoutShaderRecordNV ||
+#endif
                layoutPushConstant;
     }
+    bool hasLayout() const
+    {
+        return hasNonXfbLayout() ||
+               hasXfb();
+    }
     TLayoutMatrix  layoutMatrix  : 3;
     TLayoutPacking layoutPacking : 4;
     int layoutOffset;
     int layoutAlign;
 
-                 unsigned int layoutLocation            :12;
-    static const unsigned int layoutLocationEnd    =  0xFFF;
+                 unsigned int layoutLocation             : 12;
+    static const unsigned int layoutLocationEnd      =  0xFFF;
 
-                 unsigned int layoutComponent           : 3;
-    static const unsigned int layoutComponentEnd    =     4;
+                 unsigned int layoutComponent            :  3;
+    static const unsigned int layoutComponentEnd      =     4;
 
-                 unsigned int layoutSet                 : 7;
-    static const unsigned int layoutSetEnd         =   0x3F;
+                 unsigned int layoutSet                  :  7;
+    static const unsigned int layoutSetEnd           =   0x3F;
 
-                 unsigned int layoutBinding            : 16;
-    static const unsigned int layoutBindingEnd    =  0xFFFF;
+                 unsigned int layoutBinding              : 16;
+    static const unsigned int layoutBindingEnd      =  0xFFFF;
 
-                 unsigned int layoutIndex              :  8;
-    static const unsigned int layoutIndexEnd    =      0xFF;
+                 unsigned int layoutIndex                :  8;
+    static const unsigned int layoutIndexEnd      =      0xFF;
 
-                 unsigned int layoutStream              : 8;
-    static const unsigned int layoutStreamEnd    =     0xFF;
+                 unsigned int layoutStream               :  8;
+    static const unsigned int layoutStreamEnd      =     0xFF;
 
-                 unsigned int layoutXfbBuffer           : 4;
-    static const unsigned int layoutXfbBufferEnd    =   0xF;
+                 unsigned int layoutXfbBuffer            :  4;
+    static const unsigned int layoutXfbBufferEnd      =   0xF;
 
-                 unsigned int layoutXfbStride          : 10;
-    static const unsigned int layoutXfbStrideEnd    = 0x3FF;
+                 unsigned int layoutXfbStride            : 14;
+    static const unsigned int layoutXfbStrideEnd     = 0x3FFF;
 
-                 unsigned int layoutXfbOffset          : 10;
-    static const unsigned int layoutXfbOffsetEnd    = 0x3FF;
+                 unsigned int layoutXfbOffset            : 13;
+    static const unsigned int layoutXfbOffsetEnd     = 0x1FFF;
 
-                 unsigned int layoutAttachment          : 8;  // for input_attachment_index
-    static const unsigned int layoutAttachmentEnd    = 0XFF;
+                 unsigned int layoutAttachment           :  8;  // for input_attachment_index
+    static const unsigned int layoutAttachmentEnd      = 0XFF;
 
                  unsigned int layoutSpecConstantId       : 11;
     static const unsigned int layoutSpecConstantIdEnd = 0x7FF;
 
-    TLayoutFormat layoutFormat                         :  8;
+    TLayoutFormat layoutFormat                           :  8;
 
     bool layoutPushConstant;
 
@@ -688,6 +816,7 @@
     bool layoutPassthrough;
     bool layoutViewportRelative;
     int layoutSecondaryViewportRelativeOffset;
+    bool layoutShaderRecordNV;
 #endif
 
     bool hasUniformLayout() const
@@ -796,6 +925,10 @@
         // true front-end constant.
         return specConstant;
     }
+    bool isNonUniform() const
+    {
+        return nonUniform;
+    }
     bool isFrontEndConstant() const
     {
         // True if the front-end knows the final constant value.
@@ -819,6 +952,7 @@
         case ElpShared:   return "shared";
         case ElpStd140:   return "std140";
         case ElpStd430:   return "std430";
+        case ElpScalar:   return "scalar";
         default:          return "none";
         }
     }
@@ -961,18 +1095,23 @@
     bool pixelCenterInteger;  // fragment shader
     bool originUpperLeft;     // fragment shader
     int invocations;
-    int vertices;             // both for tessellation "vertices" and geometry "max_vertices"
+    int vertices;             // for tessellation "vertices", geometry & mesh "max_vertices"
     TVertexSpacing spacing;
     TVertexOrder order;
     bool pointMode;
     int localSize[3];         // compute shader
     int localSizeSpecId[3];   // compute shader specialization id for gl_WorkGroupSize
     bool earlyFragmentTests;  // fragment input
+    bool postDepthCoverage;   // fragment input
     TLayoutDepth layoutDepth;
     bool blendEquation;       // true if any blend equation was specified
+    int numViews;             // multiview extenstions
 
 #ifdef NV_EXTENSIONS
-    bool layoutOverrideCoverage;    // true if layout override_coverage set
+    bool layoutOverrideCoverage;        // true if layout override_coverage set
+    bool layoutDerivativeGroupQuads;    // true if layout derivative_group_quadsNV set
+    bool layoutDerivativeGroupLinear;   // true if layout derivative_group_linearNV set
+    int primitives;                     // mesh shader "max_primitives"DerivativeGroupLinear;   // true if layout derivative_group_linearNV set
 #endif
 
     void init()
@@ -992,10 +1131,15 @@
         localSizeSpecId[1] = TQualifier::layoutNotSet;
         localSizeSpecId[2] = TQualifier::layoutNotSet;
         earlyFragmentTests = false;
+        postDepthCoverage = false;
         layoutDepth = EldNone;
         blendEquation = false;
+        numViews = TQualifier::layoutNotSet;
 #ifdef NV_EXTENSIONS
-        layoutOverrideCoverage = false;
+        layoutOverrideCoverage      = false;
+        layoutDerivativeGroupQuads  = false;
+        layoutDerivativeGroupLinear = false;
+        primitives                  = TQualifier::layoutNotSet;
 #endif
     }
 
@@ -1029,13 +1173,23 @@
         }
         if (src.earlyFragmentTests)
             earlyFragmentTests = true;
+        if (src.postDepthCoverage)
+            postDepthCoverage = true;
         if (src.layoutDepth)
             layoutDepth = src.layoutDepth;
         if (src.blendEquation)
             blendEquation = src.blendEquation;
+        if (src.numViews != TQualifier::layoutNotSet)
+            numViews = src.numViews;
 #ifdef NV_EXTENSIONS
         if (src.layoutOverrideCoverage)
             layoutOverrideCoverage = src.layoutOverrideCoverage;
+        if (src.layoutDerivativeGroupQuads)
+            layoutDerivativeGroupQuads = src.layoutDerivativeGroupQuads;
+        if (src.layoutDerivativeGroupLinear)
+            layoutDerivativeGroupLinear = src.layoutDerivativeGroupLinear;
+        if (src.primitives != TQualifier::layoutNotSet)
+            primitives = src.primitives;
 #endif
     }
 };
@@ -1127,6 +1281,7 @@
                                 sampler.clear();
                                 qualifier.clear();
                                 qualifier.storage = q;
+                                assert(!(isMatrix() && vectorSize != 0));  // prevent vectorSize != 0 on matrices
                             }
     // for explicit precision qualifier
     TType(TBasicType t, TStorageQualifier q, TPrecisionQualifier p, int vs = 1, int mc = 0, int mr = 0,
@@ -1139,6 +1294,7 @@
                                 qualifier.storage = q;
                                 qualifier.precision = p;
                                 assert(p >= EpqNone && p <= EpqHigh);
+                                assert(!(isMatrix() && vectorSize != 0));  // prevent vectorSize != 0 on matrices
                             }
     // for turning a TPublicType into a TType, using a shallow copy
     explicit TType(const TPublicType& p) :
@@ -1268,31 +1424,9 @@
 
     void makeVector() { vector1 = true; }
 
-    // Merge type from parent, where a parentType is at the beginning of a declaration,
-    // establishing some characteristics for all subsequent names, while this type
-    // is on the individual names.
-    void mergeType(const TPublicType& parentType)
-    {
-        // arrayness is currently the only child aspect that has to be preserved
-        basicType = parentType.basicType;
-        vectorSize = parentType.vectorSize;
-        matrixCols = parentType.matrixCols;
-        matrixRows = parentType.matrixRows;
-        vector1 = false;                      // TPublicType is only GLSL which so far has no vec1
-        qualifier = parentType.qualifier;
-        sampler = parentType.sampler;
-        if (parentType.arraySizes)
-            newArraySizes(*parentType.arraySizes);
-        if (parentType.userDef) {
-            structure = parentType.userDef->getWritableStruct();
-            setTypeName(parentType.userDef->getTypeName());
-        }
-    }
-
     virtual void hideMember() { basicType = EbtVoid; vectorSize = 1; }
     virtual bool hiddenMember() const { return basicType == EbtVoid; }
 
-    virtual void setTypeName(const TString& n) { typeName = NewPoolTString(n.c_str()); }
     virtual void setFieldName(const TString& n) { fieldName = NewPoolTString(n.c_str()); }
     virtual const TString& getTypeName() const
     {
@@ -1308,6 +1442,7 @@
 
     virtual TBasicType getBasicType() const { return basicType; }
     virtual const TSampler& getSampler() const { return sampler; }
+    virtual TSampler& getSampler() { return sampler; }
 
     virtual       TQualifier& getQualifier()       { return qualifier; }
     virtual const TQualifier& getQualifier() const { return qualifier; }
@@ -1321,71 +1456,52 @@
     virtual bool isArrayOfArrays() const { return arraySizes != nullptr && arraySizes->getNumDims() > 1; }
     virtual int getImplicitArraySize() const { return arraySizes->getImplicitSize(); }
     virtual const TArraySizes* getArraySizes() const { return arraySizes; }
-    virtual       TArraySizes& getArraySizes()       { assert(arraySizes != nullptr); return *arraySizes; }
+    virtual       TArraySizes* getArraySizes()       { return arraySizes; }
 
     virtual bool isScalar() const { return ! isVector() && ! isMatrix() && ! isStruct() && ! isArray(); }
     virtual bool isScalarOrVec1() const { return isScalar() || vector1; }
     virtual bool isVector() const { return vectorSize > 1 || vector1; }
     virtual bool isMatrix() const { return matrixCols ? true : false; }
     virtual bool isArray()  const { return arraySizes != nullptr; }
-    virtual bool isExplicitlySizedArray() const { return isArray() && getOuterArraySize() != UnsizedArraySize; }
-    virtual bool isImplicitlySizedArray() const { return isArray() && getOuterArraySize() == UnsizedArraySize && qualifier.storage != EvqBuffer; }
-    virtual bool isRuntimeSizedArray()    const { return isArray() && getOuterArraySize() == UnsizedArraySize && qualifier.storage == EvqBuffer; }
+    virtual bool isSizedArray() const { return isArray() && arraySizes->isSized(); }
+    virtual bool isUnsizedArray() const { return isArray() && !arraySizes->isSized(); }
+    virtual bool isArrayVariablyIndexed() const { assert(isArray()); return arraySizes->isVariablyIndexed(); }
+    virtual void setArrayVariablyIndexed() { assert(isArray()); arraySizes->setVariablyIndexed(); }
+    virtual void updateImplicitArraySize(int size) { assert(isArray()); arraySizes->updateImplicitSize(size); }
     virtual bool isStruct() const { return structure != nullptr; }
-#ifdef AMD_EXTENSIONS
     virtual bool isFloatingDomain() const { return basicType == EbtFloat || basicType == EbtDouble || basicType == EbtFloat16; }
-#else
-    virtual bool isFloatingDomain() const { return basicType == EbtFloat || basicType == EbtDouble; }
-#endif
-
-    virtual bool isOpaque() const { return basicType == EbtSampler || basicType == EbtAtomicUint; }
-
-    // "Image" is a superset of "Subpass"
-    virtual bool isImage() const   { return basicType == EbtSampler && getSampler().isImage(); }
-    virtual bool isSubpass() const { return basicType == EbtSampler && getSampler().isSubpass(); }
-
-    virtual bool isBuiltInInterstageIO(EShLanguage language) const
+    virtual bool isIntegerDomain() const
     {
-        return isPerVertexAndBuiltIn(language) || isLooseAndBuiltIn(language);
-    }
-
-    // Return true if this is an interstage IO builtin
-    virtual bool isPerVertexAndBuiltIn(EShLanguage language) const
-    {
-        if (language == EShLangFragment)
-            return false;
-
-        // Any non-fragment stage
-        switch (getQualifier().builtIn) {
-        case EbvPosition:
-        case EbvPointSize:
-        case EbvClipDistance:
-        case EbvCullDistance:
-#ifdef NV_EXTENSIONS
-        case EbvLayer:
-        case EbvViewportMaskNV:
-        case EbvSecondaryPositionNV:
-        case EbvSecondaryViewportMaskNV:
-        case EbvPositionPerViewNV:
-        case EbvViewportMaskPerViewNV:
-#endif
+        switch (basicType) {
+        case EbtInt8:
+        case EbtUint8:
+        case EbtInt16:
+        case EbtUint16:
+        case EbtInt:
+        case EbtUint:
+        case EbtInt64:
+        case EbtUint64:
+        case EbtAtomicUint:
             return true;
         default:
-            return false;
+            break;
         }
+        return false;
     }
+    virtual bool isOpaque() const { return basicType == EbtSampler || basicType == EbtAtomicUint
+#ifdef NV_EXTENSIONS
+        || basicType == EbtAccStructNV
+#endif
+        ; }
+    virtual bool isBuiltIn() const { return getQualifier().builtIn != EbvNone; }
 
-    // Return true if this is a loose builtin
-    virtual bool isLooseAndBuiltIn(EShLanguage language) const
-    {
-        if (getQualifier().builtIn == EbvNone)
-            return false;
+    // "Image" is a superset of "Subpass"
+    virtual bool isImage()   const { return basicType == EbtSampler && getSampler().isImage(); }
+    virtual bool isSubpass() const { return basicType == EbtSampler && getSampler().isSubpass(); }
+    virtual bool isTexture() const { return basicType == EbtSampler && getSampler().isTexture(); }
 
-        return !isPerVertexAndBuiltIn(language);
-    }
-    
     // return true if this type contains any subtype which satisfies the given predicate.
-    template <typename P> 
+    template <typename P>
     bool contains(P predicate) const
     {
         if (predicate(this))
@@ -1414,10 +1530,10 @@
         return contains([this](const TType* t) { return t != this && t->isStruct(); } );
     }
 
-    // Recursively check the structure for any implicitly-sized arrays, needed for triggering a copyUp().
-    virtual bool containsImplicitlySizedArray() const
+    // Recursively check the structure for any unsized arrays, needed for triggering a copyUp().
+    virtual bool containsUnsizedArray() const
     {
-        return contains([](const TType* t) { return t->isImplicitlySizedArray(); } );
+        return contains([](const TType* t) { return t->isUnsizedArray(); } );
     }
 
     virtual bool containsOpaque() const
@@ -1425,10 +1541,10 @@
         return contains([](const TType* t) { return t->isOpaque(); } );
     }
 
-    // Recursively checks if the type contains an interstage IO builtin
-    virtual bool containsBuiltInInterstageIO(EShLanguage language) const
+    // Recursively checks if the type contains a built-in variable
+    virtual bool containsBuiltIn() const
     {
-        return contains([language](const TType* t) { return t->isBuiltInInterstageIO(language); } );
+        return contains([](const TType* t) { return t->isBuiltIn(); } );
     }
 
     virtual bool containsNonOpaque() const
@@ -1438,17 +1554,19 @@
             case EbtVoid:
             case EbtFloat:
             case EbtDouble:
-#ifdef AMD_EXTENSIONS
             case EbtFloat16:
-#endif
+            case EbtInt8:
+            case EbtUint8:
+            case EbtInt16:
+            case EbtUint16:
             case EbtInt:
             case EbtUint:
             case EbtInt64:
             case EbtUint64:
             case EbtBool:
-            return true;
+                return true;
             default:
-            return false;
+                return false;
             }
         };
 
@@ -1457,7 +1575,17 @@
 
     virtual bool containsSpecializationSize() const
     {
-        return contains([](const TType* t) { return t->isArray() && t->arraySizes->containsNode(); } );
+        return contains([](const TType* t) { return t->isArray() && t->arraySizes->isOuterSpecialization(); } );
+    }
+
+    virtual bool contains16BitInt() const
+    {
+        return containsBasicType(EbtInt16) || containsBasicType(EbtUint16);
+    }
+
+    virtual bool contains8BitInt() const
+    {
+        return containsBasicType(EbtInt8) || containsBasicType(EbtUint8);
     }
 
     // Array editing methods.  Array descriptors can be shared across
@@ -1479,34 +1607,56 @@
         assert(type.arraySizes != nullptr);
         *arraySizes = *type.arraySizes;
     }
-    void newArraySizes(const TArraySizes& s)
+    void copyArraySizes(const TArraySizes& s)
     {
         // For setting a fresh new set of array sizes, not yet worrying about sharing.
         arraySizes = new TArraySizes;
         *arraySizes = s;
     }
+    void transferArraySizes(TArraySizes* s)
+    {
+        // For setting an already allocated set of sizes that this type can use
+        // (no copy made).
+        arraySizes = s;
+    }
     void clearArraySizes()
     {
-        arraySizes = 0;
+        arraySizes = nullptr;
     }
-    void addArrayOuterSizes(const TArraySizes& s)
+
+    // Add inner array sizes, to any existing sizes, via copy; the
+    // sizes passed in can still be reused for other purposes.
+    void copyArrayInnerSizes(const TArraySizes* s)
     {
-        if (arraySizes == nullptr)
-            newArraySizes(s);
-        else
-            arraySizes->addOuterSizes(s);
+        if (s != nullptr) {
+            if (arraySizes == nullptr)
+                copyArraySizes(*s);
+            else
+                arraySizes->addInnerSizes(*s);
+        }
     }
     void changeOuterArraySize(int s) { arraySizes->changeOuterSize(s); }
-    void setImplicitArraySize(int s) { arraySizes->setImplicitSize(s); }
 
-    // Recursively make the implicit array size the explicit array size, through the type tree.
-    void adoptImplicitArraySizes()
+    // Recursively make the implicit array size the explicit array size.
+    // Expicit arrays are compile-time or link-time sized, never run-time sized.
+    // Sometimes, policy calls for an array to be run-time sized even if it was
+    // never variably indexed: Don't turn a 'skipNonvariablyIndexed' array into
+    // an explicit array.
+    void adoptImplicitArraySizes(bool skipNonvariablyIndexed)
     {
-        if (isImplicitlySizedArray())
+        if (isUnsizedArray() && !(skipNonvariablyIndexed || isArrayVariablyIndexed()))
             changeOuterArraySize(getImplicitArraySize());
-        if (isStruct()) {
-            for (int i = 0; i < (int)structure->size(); ++i)
-                (*structure)[i].type->adoptImplicitArraySizes();
+#ifdef NV_EXTENSIONS
+        // For multi-dim per-view arrays, set unsized inner dimension size to 1
+        if (qualifier.isPerView() && arraySizes && arraySizes->isInnerUnsized())
+            arraySizes->clearInnerUnsized();
+#endif
+        if (isStruct() && structure->size() > 0) {
+            int lastMember = (int)structure->size() - 1;
+            for (int i = 0; i < lastMember; ++i)
+                (*structure)[i].type->adoptImplicitArraySizes(false);
+            // implement the "last member of an SSBO" policy
+            (*structure)[lastMember].type->adoptImplicitArraySizes(getQualifier().storage == EvqBuffer);
         }
     }
 
@@ -1521,9 +1671,11 @@
         case EbtVoid:              return "void";
         case EbtFloat:             return "float";
         case EbtDouble:            return "double";
-#ifdef AMD_EXTENSIONS
         case EbtFloat16:           return "float16_t";
-#endif
+        case EbtInt8:              return "int8_t";
+        case EbtUint8:             return "uint8_t";
+        case EbtInt16:             return "int16_t";
+        case EbtUint16:            return "uint16_t";
         case EbtInt:               return "int";
         case EbtUint:              return "uint";
         case EbtInt64:             return "int64_t";
@@ -1533,6 +1685,9 @@
         case EbtSampler:           return "sampler/image";
         case EbtStruct:            return "structure";
         case EbtBlock:             return "block";
+#ifdef NV_EXTENSIONS
+        case EbtAccStructNV:       return "accelerationStructureNV";
+#endif
         default:                   return "unknown type";
         }
     }
@@ -1628,6 +1783,8 @@
                     appendStr(" layoutSecondaryViewportRelativeOffset=");
                     appendInt(qualifier.layoutSecondaryViewportRelativeOffset);
                 }
+                if (qualifier.layoutShaderRecordNV)
+                    appendStr(" shaderRecordNV");
 #endif
 
                 appendStr(")");
@@ -1650,12 +1807,32 @@
         if (qualifier.explicitInterp)
             appendStr(" __explicitInterpAMD");
 #endif
+#ifdef NV_EXTENSIONS
+        if (qualifier.pervertexNV)
+            appendStr(" pervertexNV");
+        if (qualifier.perPrimitiveNV)
+            appendStr(" perprimitiveNV");
+        if (qualifier.perViewNV)
+            appendStr(" perviewNV");
+        if (qualifier.perTaskNV)
+            appendStr(" taskNV");
+#endif
         if (qualifier.patch)
             appendStr(" patch");
         if (qualifier.sample)
             appendStr(" sample");
         if (qualifier.coherent)
             appendStr(" coherent");
+        if (qualifier.devicecoherent)
+            appendStr(" devicecoherent");
+        if (qualifier.queuefamilycoherent)
+            appendStr(" queuefamilycoherent");
+        if (qualifier.workgroupcoherent)
+            appendStr(" workgroupcoherent");
+        if (qualifier.subgroupcoherent)
+            appendStr(" subgroupcoherent");
+        if (qualifier.nonprivate)
+            appendStr(" nonprivate");
         if (qualifier.volatil)
             appendStr(" volatile");
         if (qualifier.restrict)
@@ -1666,16 +1843,26 @@
             appendStr(" writeonly");
         if (qualifier.specConstant)
             appendStr(" specialization-constant");
+        if (qualifier.nonUniform)
+            appendStr(" nonuniform");
         appendStr(" ");
         appendStr(getStorageQualifierString());
         if (isArray()) {
             for(int i = 0; i < (int)arraySizes->getNumDims(); ++i) {
                 int size = arraySizes->getDimSize(i);
-                if (size == 0)
-                    appendStr(" implicitly-sized array of");
+                if (size == UnsizedArraySize && i == 0 && arraySizes->isVariablyIndexed())
+                    appendStr(" runtime-sized array of");
                 else {
-                    appendStr(" ");
-                    appendInt(arraySizes->getDimSize(i));
+                    if (size == UnsizedArraySize) {
+                        appendStr(" unsized");
+                        if (i == 0) {
+                            appendStr(" ");
+                            appendInt(arraySizes->getImplicitSize());
+                        }
+                    } else {
+                        appendStr(" ");
+                        appendInt(arraySizes->getDimSize(i));
+                    }
                     appendStr("-element array of");
                 }
             }
diff --git a/glslang/Include/arrays.h b/glslang/Include/arrays.h
index b6b5e47..af8f560 100644
--- a/glslang/Include/arrays.h
+++ b/glslang/Include/arrays.h
@@ -41,6 +41,8 @@
 #ifndef _ARRAYS_INCLUDED
 #define _ARRAYS_INCLUDED
 
+#include <algorithm>
+
 namespace glslang {
 
 // This is used to mean there is no size yet (unsized), it is waiting to get a size from somewhere else.
@@ -130,10 +132,10 @@
         sizes->push_back(pair);
     }
 
-    void push_front(const TSmallArrayVector& newDims)
+    void push_back(const TSmallArrayVector& newDims)
     {
         alloc();
-        sizes->insert(sizes->begin(), newDims.sizes->begin(), newDims.sizes->end());
+        sizes->insert(sizes->end(), newDims.sizes->begin(), newDims.sizes->end());
     }
 
     void pop_front()
@@ -220,12 +222,13 @@
 struct TArraySizes {
     POOL_ALLOCATOR_NEW_DELETE(GetThreadPoolAllocator())
 
-    TArraySizes() : implicitArraySize(1) { }
+    TArraySizes() : implicitArraySize(1), variablyIndexed(false) { }
 
     // For breaking into two non-shared copies, independently modifiable.
     TArraySizes& operator=(const TArraySizes& from)
     {
         implicitArraySize = from.implicitArraySize;
+        variablyIndexed = from.variablyIndexed;
         sizes = from.sizes;
 
         return *this;
@@ -252,10 +255,11 @@
     void addInnerSize(int s) { addInnerSize((unsigned)s, nullptr); }
     void addInnerSize(int s, TIntermTyped* n) { sizes.push_back((unsigned)s, n); }
     void addInnerSize(TArraySize pair) { sizes.push_back(pair.size, pair.node); }
+    void addInnerSizes(const TArraySizes& s) { sizes.push_back(s.sizes); }
     void changeOuterSize(int s) { sizes.changeFront((unsigned)s); }
-    int getImplicitSize() const { return (int)implicitArraySize; }
-    void setImplicitSize(int s) { implicitArraySize = s; }
-    bool isInnerImplicit() const
+    int getImplicitSize() const { return implicitArraySize; }
+    void updateImplicitSize(int s) { implicitArraySize = std::max(implicitArraySize, s); }
+    bool isInnerUnsized() const
     {
         for (int d = 1; d < sizes.size(); ++d) {
             if (sizes.getDimSize(d) == (unsigned)UnsizedArraySize)
@@ -264,8 +268,31 @@
 
         return false;
     }
-    bool isImplicit() const { return getOuterSize() == UnsizedArraySize || isInnerImplicit(); }
-    void addOuterSizes(const TArraySizes& s) { sizes.push_front(s.sizes); }
+    bool clearInnerUnsized()
+    {
+        for (int d = 1; d < sizes.size(); ++d) {
+            if (sizes.getDimSize(d) == (unsigned)UnsizedArraySize)
+                setDimSize(d, 1);
+        }
+
+        return false;
+    }
+    bool isInnerSpecialization() const
+    {
+        for (int d = 1; d < sizes.size(); ++d) {
+            if (sizes.getDimNode(d) != nullptr)
+                return true;
+        }
+
+        return false;
+    }
+    bool isOuterSpecialization()
+    {
+        return sizes.getDimNode(0) != nullptr;
+    }
+
+    bool hasUnsized() const { return getOuterSize() == UnsizedArraySize || isInnerUnsized(); }
+    bool isSized() const { return getOuterSize() != UnsizedArraySize; }
     void dereference() { sizes.pop_front(); }
     void copyDereferenced(const TArraySizes& rhs)
     {
@@ -288,17 +315,8 @@
         return true;
     }
 
-    // Returns true if any of the dimensions of the array is sized with a node
-    // instead of a front-end compile-time constant.
-    bool containsNode()
-    {
-        for (int d = 0; d < sizes.size(); ++d) {
-            if (sizes.getDimNode(d) != nullptr)
-                return true;
-        }
-
-        return false;
-    }
+    void setVariablyIndexed() { variablyIndexed = true; }
+    bool isVariablyIndexed() const { return variablyIndexed; }
 
     bool operator==(const TArraySizes& rhs) { return sizes == rhs.sizes; }
     bool operator!=(const TArraySizes& rhs) { return sizes != rhs.sizes; }
@@ -308,9 +326,12 @@
 
     TArraySizes(const TArraySizes&);
 
-    // for tracking maximum referenced index, before an explicit size is given
-    // applies only to the outer-most dimension
+    // For tracking maximum referenced compile-time constant index.
+    // Applies only to the outer-most dimension. Potentially becomes
+    // the implicit size of the array, if not variably indexed and
+    // otherwise legal.
     int implicitArraySize;
+    bool variablyIndexed;  // true if array is indexed with a non compile-time constant
 };
 
 } // end namespace glslang
diff --git a/glslang/Include/intermediate.h b/glslang/Include/intermediate.h
index d9b6d05..2725007 100644
--- a/glslang/Include/intermediate.h
+++ b/glslang/Include/intermediate.h
@@ -1,6 +1,7 @@
 //
 // Copyright (C) 2002-2005  3Dlabs Inc. Ltd.
 // Copyright (C) 2012-2016 LunarG, Inc.
+// Copyright (C) 2017 ARM Limited.
 //
 // All rights reserved.
 //
@@ -46,7 +47,7 @@
 #ifndef __INTERMEDIATE_H
 #define __INTERMEDIATE_H
 
-#if _MSC_VER >= 1900
+#if defined(_MSC_VER) && _MSC_VER >= 1900
     #pragma warning(disable : 4464) // relative include path contains '..'
     #pragma warning(disable : 5026) // 'glslang::TIntermUnary': move constructor was implicitly defined as deleted
 #endif
@@ -84,64 +85,189 @@
     EOpPreIncrement,
     EOpPreDecrement,
 
+    // (u)int* -> bool
+    EOpConvInt8ToBool,
+    EOpConvUint8ToBool,
+    EOpConvInt16ToBool,
+    EOpConvUint16ToBool,
     EOpConvIntToBool,
     EOpConvUintToBool,
-    EOpConvFloatToBool,
-    EOpConvDoubleToBool,
     EOpConvInt64ToBool,
     EOpConvUint64ToBool,
-    EOpConvBoolToFloat,
-    EOpConvIntToFloat,
-    EOpConvUintToFloat,
-    EOpConvDoubleToFloat,
-    EOpConvInt64ToFloat,
-    EOpConvUint64ToFloat,
-    EOpConvUintToInt,
-    EOpConvFloatToInt,
-    EOpConvBoolToInt,
-    EOpConvDoubleToInt,
-    EOpConvInt64ToInt,
-    EOpConvUint64ToInt,
-    EOpConvIntToUint,
-    EOpConvFloatToUint,
-    EOpConvBoolToUint,
-    EOpConvDoubleToUint,
-    EOpConvInt64ToUint,
-    EOpConvUint64ToUint,
-    EOpConvIntToDouble,
-    EOpConvUintToDouble,
-    EOpConvFloatToDouble,
-    EOpConvBoolToDouble,
-    EOpConvInt64ToDouble,
-    EOpConvUint64ToDouble,
-    EOpConvBoolToInt64,
-    EOpConvIntToInt64,
-    EOpConvUintToInt64,
-    EOpConvFloatToInt64,
-    EOpConvDoubleToInt64,
-    EOpConvUint64ToInt64,
-    EOpConvBoolToUint64,
-    EOpConvIntToUint64,
-    EOpConvUintToUint64,
-    EOpConvFloatToUint64,
-    EOpConvDoubleToUint64,
-    EOpConvInt64ToUint64,
-#ifdef AMD_EXTENSIONS
-    EOpConvBoolToFloat16,
-    EOpConvIntToFloat16,
-    EOpConvUintToFloat16,
-    EOpConvFloatToFloat16,
-    EOpConvDoubleToFloat16,
-    EOpConvInt64ToFloat16,
-    EOpConvUint64ToFloat16,
+
+    // float* -> bool
     EOpConvFloat16ToBool,
+    EOpConvFloatToBool,
+    EOpConvDoubleToBool,
+
+    // bool -> (u)int*
+    EOpConvBoolToInt8,
+    EOpConvBoolToUint8,
+    EOpConvBoolToInt16,
+    EOpConvBoolToUint16,
+    EOpConvBoolToInt,
+    EOpConvBoolToUint,
+    EOpConvBoolToInt64,
+    EOpConvBoolToUint64,
+
+    // bool -> float*
+    EOpConvBoolToFloat16,
+    EOpConvBoolToFloat,
+    EOpConvBoolToDouble,
+
+    // int8_t -> (u)int*
+    EOpConvInt8ToInt16,
+    EOpConvInt8ToInt,
+    EOpConvInt8ToInt64,
+    EOpConvInt8ToUint8,
+    EOpConvInt8ToUint16,
+    EOpConvInt8ToUint,
+    EOpConvInt8ToUint64,
+
+    // uint8_t -> (u)int*
+    EOpConvUint8ToInt8,
+    EOpConvUint8ToInt16,
+    EOpConvUint8ToInt,
+    EOpConvUint8ToInt64,
+    EOpConvUint8ToUint16,
+    EOpConvUint8ToUint,
+    EOpConvUint8ToUint64,
+
+    // int8_t -> float*
+    EOpConvInt8ToFloat16,
+    EOpConvInt8ToFloat,
+    EOpConvInt8ToDouble,
+
+    // uint8_t -> float*
+    EOpConvUint8ToFloat16,
+    EOpConvUint8ToFloat,
+    EOpConvUint8ToDouble,
+
+    // int16_t -> (u)int*
+    EOpConvInt16ToInt8,
+    EOpConvInt16ToInt,
+    EOpConvInt16ToInt64,
+    EOpConvInt16ToUint8,
+    EOpConvInt16ToUint16,
+    EOpConvInt16ToUint,
+    EOpConvInt16ToUint64,
+
+    // uint16_t -> (u)int*
+    EOpConvUint16ToInt8,
+    EOpConvUint16ToInt16,
+    EOpConvUint16ToInt,
+    EOpConvUint16ToInt64,
+    EOpConvUint16ToUint8,
+    EOpConvUint16ToUint,
+    EOpConvUint16ToUint64,
+
+    // int16_t -> float*
+    EOpConvInt16ToFloat16,
+    EOpConvInt16ToFloat,
+    EOpConvInt16ToDouble,
+
+    // uint16_t -> float*
+    EOpConvUint16ToFloat16,
+    EOpConvUint16ToFloat,
+    EOpConvUint16ToDouble,
+
+    // int32_t -> (u)int*
+    EOpConvIntToInt8,
+    EOpConvIntToInt16,
+    EOpConvIntToInt64,
+    EOpConvIntToUint8,
+    EOpConvIntToUint16,
+    EOpConvIntToUint,
+    EOpConvIntToUint64,
+
+    // uint32_t -> (u)int*
+    EOpConvUintToInt8,
+    EOpConvUintToInt16,
+    EOpConvUintToInt,
+    EOpConvUintToInt64,
+    EOpConvUintToUint8,
+    EOpConvUintToUint16,
+    EOpConvUintToUint64,
+
+    // int32_t -> float*
+    EOpConvIntToFloat16,
+    EOpConvIntToFloat,
+    EOpConvIntToDouble,
+
+    // uint32_t -> float*
+    EOpConvUintToFloat16,
+    EOpConvUintToFloat,
+    EOpConvUintToDouble,
+
+    // int64_t -> (u)int*
+    EOpConvInt64ToInt8,
+    EOpConvInt64ToInt16,
+    EOpConvInt64ToInt,
+    EOpConvInt64ToUint8,
+    EOpConvInt64ToUint16,
+    EOpConvInt64ToUint,
+    EOpConvInt64ToUint64,
+
+    // uint64_t -> (u)int*
+    EOpConvUint64ToInt8,
+    EOpConvUint64ToInt16,
+    EOpConvUint64ToInt,
+    EOpConvUint64ToInt64,
+    EOpConvUint64ToUint8,
+    EOpConvUint64ToUint16,
+    EOpConvUint64ToUint,
+
+    // int64_t -> float*
+    EOpConvInt64ToFloat16,
+    EOpConvInt64ToFloat,
+    EOpConvInt64ToDouble,
+
+    // uint64_t -> float*
+    EOpConvUint64ToFloat16,
+    EOpConvUint64ToFloat,
+    EOpConvUint64ToDouble,
+
+    // float16_t -> (u)int*
+    EOpConvFloat16ToInt8,
+    EOpConvFloat16ToInt16,
     EOpConvFloat16ToInt,
+    EOpConvFloat16ToInt64,
+    EOpConvFloat16ToUint8,
+    EOpConvFloat16ToUint16,
     EOpConvFloat16ToUint,
+    EOpConvFloat16ToUint64,
+
+    // float16_t -> float*
     EOpConvFloat16ToFloat,
     EOpConvFloat16ToDouble,
-    EOpConvFloat16ToInt64,
-    EOpConvFloat16ToUint64,
-#endif
+
+    // float -> (u)int*
+    EOpConvFloatToInt8,
+    EOpConvFloatToInt16,
+    EOpConvFloatToInt,
+    EOpConvFloatToInt64,
+    EOpConvFloatToUint8,
+    EOpConvFloatToUint16,
+    EOpConvFloatToUint,
+    EOpConvFloatToUint64,
+
+    // float -> float*
+    EOpConvFloatToFloat16,
+    EOpConvFloatToDouble,
+
+    // float64 _t-> (u)int*
+    EOpConvDoubleToInt8,
+    EOpConvDoubleToInt16,
+    EOpConvDoubleToInt,
+    EOpConvDoubleToInt64,
+    EOpConvDoubleToUint8,
+    EOpConvDoubleToUint16,
+    EOpConvDoubleToUint,
+    EOpConvDoubleToUint64,
+
+    // float64_t -> float*
+    EOpConvDoubleToFloat16,
+    EOpConvDoubleToFloat,
 
     //
     // binary operations
@@ -244,6 +370,10 @@
     EOpDoubleBitsToUint64,
     EOpInt64BitsToDouble,
     EOpUint64BitsToDouble,
+    EOpFloat16BitsToInt16,
+    EOpFloat16BitsToUint16,
+    EOpInt16BitsToFloat16,
+    EOpUint16BitsToFloat16,
     EOpPackSnorm2x16,
     EOpUnpackSnorm2x16,
     EOpPackUnorm2x16,
@@ -260,10 +390,22 @@
     EOpUnpackInt2x32,
     EOpPackUint2x32,
     EOpUnpackUint2x32,
-#ifdef AMD_EXTENSIONS
     EOpPackFloat2x16,
     EOpUnpackFloat2x16,
-#endif
+    EOpPackInt2x16,
+    EOpUnpackInt2x16,
+    EOpPackUint2x16,
+    EOpUnpackUint2x16,
+    EOpPackInt4x16,
+    EOpUnpackInt4x16,
+    EOpPackUint4x16,
+    EOpUnpackUint4x16,
+    EOpPack16,
+    EOpPack32,
+    EOpPack64,
+    EOpUnpack32,
+    EOpUnpack16,
+    EOpUnpack8,
 
     EOpLength,
     EOpDistance,
@@ -329,6 +471,90 @@
     EOpAllInvocations,
     EOpAllInvocationsEqual,
 
+    EOpSubgroupGuardStart,
+    EOpSubgroupBarrier,
+    EOpSubgroupMemoryBarrier,
+    EOpSubgroupMemoryBarrierBuffer,
+    EOpSubgroupMemoryBarrierImage,
+    EOpSubgroupMemoryBarrierShared, // compute only
+    EOpSubgroupElect,
+    EOpSubgroupAll,
+    EOpSubgroupAny,
+    EOpSubgroupAllEqual,
+    EOpSubgroupBroadcast,
+    EOpSubgroupBroadcastFirst,
+    EOpSubgroupBallot,
+    EOpSubgroupInverseBallot,
+    EOpSubgroupBallotBitExtract,
+    EOpSubgroupBallotBitCount,
+    EOpSubgroupBallotInclusiveBitCount,
+    EOpSubgroupBallotExclusiveBitCount,
+    EOpSubgroupBallotFindLSB,
+    EOpSubgroupBallotFindMSB,
+    EOpSubgroupShuffle,
+    EOpSubgroupShuffleXor,
+    EOpSubgroupShuffleUp,
+    EOpSubgroupShuffleDown,
+    EOpSubgroupAdd,
+    EOpSubgroupMul,
+    EOpSubgroupMin,
+    EOpSubgroupMax,
+    EOpSubgroupAnd,
+    EOpSubgroupOr,
+    EOpSubgroupXor,
+    EOpSubgroupInclusiveAdd,
+    EOpSubgroupInclusiveMul,
+    EOpSubgroupInclusiveMin,
+    EOpSubgroupInclusiveMax,
+    EOpSubgroupInclusiveAnd,
+    EOpSubgroupInclusiveOr,
+    EOpSubgroupInclusiveXor,
+    EOpSubgroupExclusiveAdd,
+    EOpSubgroupExclusiveMul,
+    EOpSubgroupExclusiveMin,
+    EOpSubgroupExclusiveMax,
+    EOpSubgroupExclusiveAnd,
+    EOpSubgroupExclusiveOr,
+    EOpSubgroupExclusiveXor,
+    EOpSubgroupClusteredAdd,
+    EOpSubgroupClusteredMul,
+    EOpSubgroupClusteredMin,
+    EOpSubgroupClusteredMax,
+    EOpSubgroupClusteredAnd,
+    EOpSubgroupClusteredOr,
+    EOpSubgroupClusteredXor,
+    EOpSubgroupQuadBroadcast,
+    EOpSubgroupQuadSwapHorizontal,
+    EOpSubgroupQuadSwapVertical,
+    EOpSubgroupQuadSwapDiagonal,
+
+#ifdef NV_EXTENSIONS
+    EOpSubgroupPartition,
+    EOpSubgroupPartitionedAdd,
+    EOpSubgroupPartitionedMul,
+    EOpSubgroupPartitionedMin,
+    EOpSubgroupPartitionedMax,
+    EOpSubgroupPartitionedAnd,
+    EOpSubgroupPartitionedOr,
+    EOpSubgroupPartitionedXor,
+    EOpSubgroupPartitionedInclusiveAdd,
+    EOpSubgroupPartitionedInclusiveMul,
+    EOpSubgroupPartitionedInclusiveMin,
+    EOpSubgroupPartitionedInclusiveMax,
+    EOpSubgroupPartitionedInclusiveAnd,
+    EOpSubgroupPartitionedInclusiveOr,
+    EOpSubgroupPartitionedInclusiveXor,
+    EOpSubgroupPartitionedExclusiveAdd,
+    EOpSubgroupPartitionedExclusiveMul,
+    EOpSubgroupPartitionedExclusiveMin,
+    EOpSubgroupPartitionedExclusiveMax,
+    EOpSubgroupPartitionedExclusiveAnd,
+    EOpSubgroupPartitionedExclusiveOr,
+    EOpSubgroupPartitionedExclusiveXor,
+#endif
+
+    EOpSubgroupGuardStop,
+
 #ifdef AMD_EXTENSIONS
     EOpMinInvocations,
     EOpMaxInvocations,
@@ -366,10 +592,21 @@
     EOpAtomicXor,
     EOpAtomicExchange,
     EOpAtomicCompSwap,
+    EOpAtomicLoad,
+    EOpAtomicStore,
 
-    EOpAtomicCounterIncrement,
-    EOpAtomicCounterDecrement,
+    EOpAtomicCounterIncrement, // results in pre-increment value
+    EOpAtomicCounterDecrement, // results in post-decrement value
     EOpAtomicCounter,
+    EOpAtomicCounterAdd,
+    EOpAtomicCounterSubtract,
+    EOpAtomicCounterMin,
+    EOpAtomicCounterMax,
+    EOpAtomicCounterAnd,
+    EOpAtomicCounterOr,
+    EOpAtomicCounterXor,
+    EOpAtomicCounterExchange,
+    EOpAtomicCounterCompSwap,
 
     EOpAny,
     EOpAll,
@@ -392,6 +629,10 @@
     EOpConstructGuardStart,
     EOpConstructInt,          // these first scalar forms also identify what implicit conversion is needed
     EOpConstructUint,
+    EOpConstructInt8,
+    EOpConstructUint8,
+    EOpConstructInt16,
+    EOpConstructUint16,
     EOpConstructInt64,
     EOpConstructUint64,
     EOpConstructBool,
@@ -406,6 +647,18 @@
     EOpConstructBVec2,
     EOpConstructBVec3,
     EOpConstructBVec4,
+    EOpConstructI8Vec2,
+    EOpConstructI8Vec3,
+    EOpConstructI8Vec4,
+    EOpConstructU8Vec2,
+    EOpConstructU8Vec3,
+    EOpConstructU8Vec4,
+    EOpConstructI16Vec2,
+    EOpConstructI16Vec3,
+    EOpConstructI16Vec4,
+    EOpConstructU16Vec2,
+    EOpConstructU16Vec3,
+    EOpConstructU16Vec4,
     EOpConstructIVec2,
     EOpConstructIVec3,
     EOpConstructIVec4,
@@ -436,7 +689,33 @@
     EOpConstructDMat4x2,
     EOpConstructDMat4x3,
     EOpConstructDMat4x4,
-#ifdef AMD_EXTENSIONS
+    EOpConstructIMat2x2,
+    EOpConstructIMat2x3,
+    EOpConstructIMat2x4,
+    EOpConstructIMat3x2,
+    EOpConstructIMat3x3,
+    EOpConstructIMat3x4,
+    EOpConstructIMat4x2,
+    EOpConstructIMat4x3,
+    EOpConstructIMat4x4,
+    EOpConstructUMat2x2,
+    EOpConstructUMat2x3,
+    EOpConstructUMat2x4,
+    EOpConstructUMat3x2,
+    EOpConstructUMat3x3,
+    EOpConstructUMat3x4,
+    EOpConstructUMat4x2,
+    EOpConstructUMat4x3,
+    EOpConstructUMat4x4,
+    EOpConstructBMat2x2,
+    EOpConstructBMat2x3,
+    EOpConstructBMat2x4,
+    EOpConstructBMat3x2,
+    EOpConstructBMat3x3,
+    EOpConstructBMat3x4,
+    EOpConstructBMat4x2,
+    EOpConstructBMat4x3,
+    EOpConstructBMat4x4,
     EOpConstructFloat16,
     EOpConstructF16Vec2,
     EOpConstructF16Vec3,
@@ -450,9 +729,9 @@
     EOpConstructF16Mat4x2,
     EOpConstructF16Mat4x3,
     EOpConstructF16Mat4x4,
-#endif
     EOpConstructStruct,
     EOpConstructTextureSampler,
+    EOpConstructNonuniform,     // expected to be transformed away, not present in final AST
     EOpConstructGuardEnd,
 
     //
@@ -479,7 +758,11 @@
     // Array operators
     //
 
-    EOpArrayLength,      // "Array" distinguishes from length(v) built-in function, but it applies to vectors and matrices as well.
+    // Can apply to arrays, vectors, or matrices.
+    // Can be decomposed to a constant at compile time, but this does not always happen,
+    // due to link-time effects. So, consumer can expect either a link-time sized or
+    // run-time sized array.
+    EOpArrayLength,
 
     //
     // Image operations
@@ -491,6 +774,10 @@
     EOpImageQuerySamples,
     EOpImageLoad,
     EOpImageStore,
+#ifdef AMD_EXTENSIONS
+    EOpImageLoadLod,
+    EOpImageStoreLod,
+#endif
     EOpImageAtomicAdd,
     EOpImageAtomicMin,
     EOpImageAtomicMax,
@@ -499,10 +786,15 @@
     EOpImageAtomicXor,
     EOpImageAtomicExchange,
     EOpImageAtomicCompSwap,
+    EOpImageAtomicLoad,
+    EOpImageAtomicStore,
 
     EOpSubpassLoad,
     EOpSubpassLoadMS,
     EOpSparseImageLoad,
+#ifdef AMD_EXTENSIONS
+    EOpSparseImageLoadLod,
+#endif
 
     EOpImageGuardEnd,
 
@@ -540,6 +832,13 @@
     EOpTextureOffsetClamp,
     EOpTextureGradClamp,
     EOpTextureGradOffsetClamp,
+#ifdef AMD_EXTENSIONS
+    EOpTextureGatherLod,
+    EOpTextureGatherLodOffset,
+    EOpTextureGatherLodOffsets,
+    EOpFragmentMaskFetch,
+    EOpFragmentFetch,
+#endif
 
     EOpSparseTextureGuardBegin,
 
@@ -559,8 +858,23 @@
     EOpSparseTextureOffsetClamp,
     EOpSparseTextureGradClamp,
     EOpSparseTextureGradOffsetClamp,
+#ifdef AMD_EXTENSIONS
+    EOpSparseTextureGatherLod,
+    EOpSparseTextureGatherLodOffset,
+    EOpSparseTextureGatherLodOffsets,
+#endif
 
     EOpSparseTextureGuardEnd,
+
+#ifdef NV_EXTENSIONS
+    EOpImageFootprintGuardBegin,
+    EOpImageSampleFootprintNV,
+    EOpImageSampleFootprintClampNV,
+    EOpImageSampleFootprintLodNV,
+    EOpImageSampleFootprintGradNV,
+    EOpImageSampleFootprintGradClampNV,
+    EOpImageFootprintGuardEnd,
+#endif
     EOpSamplingGuardEnd,
     EOpTextureGuardEnd,
 
@@ -579,6 +893,14 @@
     EOpFindLSB,
     EOpFindMSB,
 
+#ifdef NV_EXTENSIONS
+    EOpTraceNV,
+    EOpReportIntersectionNV,
+    EOpIgnoreIntersectionNV,
+    EOpTerminateRayNV,
+    EOpExecuteCallableNV,
+    EOpWritePackedPrimitiveIndices4x8NV,
+#endif
     //
     // HLSL operations
     //
@@ -601,7 +923,8 @@
     EOpInterlockedOr,       // ...
     EOpInterlockedXor,      // ...
     EOpAllMemoryBarrierWithGroupSync,    // memory barriers without non-hlsl AST equivalents
-    EOpGroupMemoryBarrierWithGroupSync,  // ...
+    EOpDeviceMemoryBarrier,              // ...
+    EOpDeviceMemoryBarrierWithGroupSync, // ...
     EOpWorkgroupMemoryBarrier,           // ...
     EOpWorkgroupMemoryBarrierWithGroupSync, // ...
     EOpEvaluateAttributeSnapped,         // InterpolateAtOffset with int position on 16x16 grid
@@ -655,6 +978,12 @@
 
     // matrix
     EOpMatrixSwizzle,                    // select multiple matrix components (non-column)
+
+    // SM6 wave ops
+    EOpWaveGetLaneCount,                 // Will decompose to gl_SubgroupSize.
+    EOpWaveGetLaneIndex,                 // Will decompose to gl_SubgroupInvocationID.
+    EOpWaveActiveCountBits,              // Will decompose to subgroupBallotBitCount(subgroupBallot()).
+    EOpWavePrefixCountBits,              // Will decompose to subgroupBallotInclusiveBitCount(subgroupBallot()).
 };
 
 class TIntermTraverser;
@@ -669,6 +998,7 @@
 class TIntermTyped;
 class TIntermMethod;
 class TIntermSymbol;
+class TIntermLoop;
 
 } // end namespace glslang
 
@@ -696,6 +1026,7 @@
     virtual       glslang::TIntermMethod*        getAsMethodNode()          { return 0; }
     virtual       glslang::TIntermSymbol*        getAsSymbolNode()          { return 0; }
     virtual       glslang::TIntermBranch*        getAsBranchNode()          { return 0; }
+    virtual       glslang::TIntermLoop*          getAsLoopNode()            { return 0; }
 
     virtual const glslang::TIntermTyped*         getAsTyped()         const { return 0; }
     virtual const glslang::TIntermOperator*      getAsOperator()      const { return 0; }
@@ -708,6 +1039,7 @@
     virtual const glslang::TIntermMethod*        getAsMethodNode()    const { return 0; }
     virtual const glslang::TIntermSymbol*        getAsSymbolNode()    const { return 0; }
     virtual const glslang::TIntermBranch*        getAsBranchNode()    const { return 0; }
+    virtual const glslang::TIntermLoop*          getAsLoopNode()      const { return 0; }
     virtual ~TIntermNode() { }
 
 protected:
@@ -751,6 +1083,8 @@
     virtual bool isVector() const { return type.isVector(); }
     virtual bool isScalar() const { return type.isScalar(); }
     virtual bool isStruct() const { return type.isStruct(); }
+    virtual bool isFloatingDomain() const { return type.isFloatingDomain(); }
+    virtual bool isIntegerDomain() const { return type.isIntegerDomain(); }
     TString getCompleteString() const { return type.getCompleteString(); }
 
 protected:
@@ -759,15 +1093,6 @@
 };
 
 //
-// Loop control hints
-//
-enum TLoopControl {
-    ELoopControlNone,
-    ELoopControlUnroll,
-    ELoopControlDontUnroll,
-};
-
-//
 // Handle for, do-while, and while loops.
 //
 class TIntermLoop : public TIntermNode {
@@ -777,24 +1102,36 @@
         test(aTest),
         terminal(aTerminal),
         first(testFirst),
-        control(ELoopControlNone)
+        unroll(false),
+        dontUnroll(false),
+        dependency(0)
     { }
 
+    virtual       TIntermLoop* getAsLoopNode() { return this; }
+    virtual const TIntermLoop* getAsLoopNode() const { return this; }
     virtual void traverse(TIntermTraverser*);
     TIntermNode*  getBody() const { return body; }
     TIntermTyped* getTest() const { return test; }
     TIntermTyped* getTerminal() const { return terminal; }
     bool testFirst() const { return first; }
 
-    void setLoopControl(TLoopControl c) { control = c; }
-    TLoopControl getLoopControl() const { return control; }
+    void setUnroll()     { unroll = true; }
+    void setDontUnroll() { dontUnroll = true; }
+    bool getUnroll()     const { return unroll; }
+    bool getDontUnroll() const { return dontUnroll; }
+
+    static const unsigned int dependencyInfinite = 0xFFFFFFFF;
+    void setLoopDependency(int d) { dependency = d; }
+    int getLoopDependency() const { return dependency; }
 
 protected:
     TIntermNode* body;       // code to loop over
     TIntermTyped* test;      // exit condition associated with loop, could be 0 for 'for' loops
     TIntermTyped* terminal;  // exists for for-loops
     bool first;              // true for while and for, not for do-while
-    TLoopControl control;    // loop control hint
+    bool unroll;             // true if unroll requested
+    bool dontUnroll;         // true if request to not unroll
+    unsigned int dependency; // loop dependency hint; 0 means not set or unknown
 };
 
 //
@@ -842,9 +1179,14 @@
     // per process threadPoolAllocator, then it causes increased memory usage per compile
     // it is essential to use "symbol = sym" to assign to symbol
     TIntermSymbol(int i, const TString& n, const TType& t)
-        : TIntermTyped(t), id(i), constSubtree(nullptr)
+        : TIntermTyped(t), id(i),
+#ifdef ENABLE_HLSL
+        flattenSubset(-1),
+#endif
+        constSubtree(nullptr)
           { name = n; }
     virtual int getId() const { return id; }
+    virtual void changeId(int i) { id = i; }
     virtual const TString& getName() const { return name; }
     virtual void traverse(TIntermTraverser*);
     virtual       TIntermSymbol* getAsSymbolNode()       { return this; }
@@ -853,9 +1195,20 @@
     const TConstUnionArray& getConstArray() const { return constArray; }
     void setConstSubtree(TIntermTyped* subtree) { constSubtree = subtree; }
     TIntermTyped* getConstSubtree() const { return constSubtree; }
+#ifdef ENABLE_HLSL
+    void setFlattenSubset(int subset) { flattenSubset = subset; }
+    int getFlattenSubset() const { return flattenSubset; } // -1 means full object
+#endif
+
+    // This is meant for cases where a node has already been constructed, and
+    // later on, it becomes necessary to switch to a different symbol.
+    virtual void switchId(int newId) { id = newId; }
 
 protected:
     int id;                      // the unique id of the symbol this node represents
+#ifdef ENABLE_HLSL
+    int flattenSubset;           // how deeply the flattened object rooted at id has been dereferenced
+#endif
     TString name;                // the name of the symbol this node represents
     TConstUnionArray constArray; // if the symbol is a front-end compile-time constant, this is its value
     TIntermTyped* constSubtree;
@@ -893,6 +1246,9 @@
     bool grad;
     bool subpass;
     bool lodClamp;
+#ifdef AMD_EXTENSIONS
+    bool fragMask;
+#endif
 };
 
 //
@@ -910,6 +1266,9 @@
     bool isSampling() const { return op > EOpSamplingGuardBegin && op < EOpSamplingGuardEnd; }
     bool isImage()    const { return op > EOpImageGuardBegin    && op < EOpImageGuardEnd; }
     bool isSparseTexture() const { return op > EOpSparseTextureGuardBegin && op < EOpSparseTextureGuardEnd; }
+#ifdef NV_EXTENSIONS
+    bool isImageFootprint() const { return op > EOpImageFootprintGuardBegin && op < EOpImageFootprintGuardEnd; }
+#endif
     bool isSparseImage()   const { return op == EOpSparseImageLoad; }
 
     void setOperationPrecision(TPrecisionQualifier p) { operationPrecision = p; }
@@ -940,6 +1299,9 @@
         cracked.grad = false;
         cracked.subpass = false;
         cracked.lodClamp = false;
+#ifdef AMD_EXTENSIONS
+        cracked.fragMask = false;
+#endif
 
         switch (op) {
         case EOpImageQuerySize:
@@ -1048,6 +1410,55 @@
             cracked.gather = true;
             cracked.offsets = true;
             break;
+#ifdef AMD_EXTENSIONS
+        case EOpTextureGatherLod:
+        case EOpSparseTextureGatherLod:
+            cracked.gather = true;
+            cracked.lod    = true;
+            break;
+        case EOpTextureGatherLodOffset:
+        case EOpSparseTextureGatherLodOffset:
+            cracked.gather = true;
+            cracked.offset = true;
+            cracked.lod    = true;
+            break;
+        case EOpTextureGatherLodOffsets:
+        case EOpSparseTextureGatherLodOffsets:
+            cracked.gather  = true;
+            cracked.offsets = true;
+            cracked.lod     = true;
+            break;
+        case EOpImageLoadLod:
+        case EOpImageStoreLod:
+        case EOpSparseImageLoadLod:
+            cracked.lod = true;
+            break;
+        case EOpFragmentMaskFetch:
+            cracked.subpass = sampler.dim == EsdSubpass;
+            cracked.fragMask = true;
+            break;
+        case EOpFragmentFetch:
+            cracked.subpass = sampler.dim == EsdSubpass;
+            cracked.fragMask = true;
+            break;
+#endif
+#ifdef NV_EXTENSIONS
+        case EOpImageSampleFootprintNV:
+            break;
+        case EOpImageSampleFootprintClampNV:
+            cracked.lodClamp = true;
+            break;
+        case EOpImageSampleFootprintLodNV:
+            cracked.lod = true;
+            break;
+        case EOpImageSampleFootprintGradNV:
+            cracked.grad = true;
+            break;
+        case EOpImageSampleFootprintGradClampNV:
+            cracked.lodClamp = true;
+            cracked.grad = true;
+            break;
+#endif
         case EOpSubpassLoad:
         case EOpSubpassLoadMS:
             cracked.subpass = true;
@@ -1107,14 +1518,14 @@
 };
 
 typedef TVector<TIntermNode*> TIntermSequence;
-typedef TVector<int> TQualifierList;
+typedef TVector<TStorageQualifier> TQualifierList;
 //
 // Nodes that operate on an arbitrary sized set of children.
 //
 class TIntermAggregate : public TIntermOperator {
 public:
-    TIntermAggregate() : TIntermOperator(EOpNull), userDefined(false), pragmaTable(0) { }
-    TIntermAggregate(TOperator o) : TIntermOperator(o), pragmaTable(0) { }
+    TIntermAggregate() : TIntermOperator(EOpNull), userDefined(false), pragmaTable(nullptr) { }
+    TIntermAggregate(TOperator o) : TIntermOperator(o), pragmaTable(nullptr) { }
     ~TIntermAggregate() { delete pragmaTable; }
     virtual       TIntermAggregate* getAsAggregate()       { return this; }
     virtual const TIntermAggregate* getAsAggregate() const { return this; }
@@ -1132,7 +1543,7 @@
     void setDebug(bool d) { debug = d; }
     bool getOptimize() const { return optimize; }
     bool getDebug() const { return debug; }
-    void addToPragmaTable(const TPragmaTable& pTable);
+    void setPragmaTable(const TPragmaTable& pTable);
     const TPragmaTable& getPragmaTable() const { return *pragmaTable; }
 protected:
     TIntermAggregate(const TIntermAggregate&); // disallow copy constructor
@@ -1152,19 +1563,35 @@
 class TIntermSelection : public TIntermTyped {
 public:
     TIntermSelection(TIntermTyped* cond, TIntermNode* trueB, TIntermNode* falseB) :
-        TIntermTyped(EbtVoid), condition(cond), trueBlock(trueB), falseBlock(falseB) {}
+        TIntermTyped(EbtVoid), condition(cond), trueBlock(trueB), falseBlock(falseB),
+        shortCircuit(true),
+        flatten(false), dontFlatten(false) {}
     TIntermSelection(TIntermTyped* cond, TIntermNode* trueB, TIntermNode* falseB, const TType& type) :
-        TIntermTyped(type), condition(cond), trueBlock(trueB), falseBlock(falseB) {}
+        TIntermTyped(type), condition(cond), trueBlock(trueB), falseBlock(falseB),
+        shortCircuit(true),
+        flatten(false), dontFlatten(false) {}
     virtual void traverse(TIntermTraverser*);
     virtual TIntermTyped* getCondition() const { return condition; }
     virtual TIntermNode* getTrueBlock() const { return trueBlock; }
     virtual TIntermNode* getFalseBlock() const { return falseBlock; }
     virtual       TIntermSelection* getAsSelectionNode()       { return this; }
     virtual const TIntermSelection* getAsSelectionNode() const { return this; }
+
+    void setNoShortCircuit() { shortCircuit = false; }
+    bool getShortCircuit() const { return shortCircuit; }
+
+    void setFlatten()     { flatten = true; }
+    void setDontFlatten() { dontFlatten = true; }
+    bool getFlatten()     const { return flatten; }
+    bool getDontFlatten() const { return dontFlatten; }
+
 protected:
     TIntermTyped* condition;
     TIntermNode* trueBlock;
     TIntermNode* falseBlock;
+    bool shortCircuit; // normally all if-then-else and all GLSL ?: short-circuit, but HLSL ?: does not
+    bool flatten;      // true if flatten requested
+    bool dontFlatten;  // true if requested to not flatten
 };
 
 //
@@ -1175,15 +1602,24 @@
 //
 class TIntermSwitch : public TIntermNode {
 public:
-    TIntermSwitch(TIntermTyped* cond, TIntermAggregate* b) : condition(cond), body(b) { }
+    TIntermSwitch(TIntermTyped* cond, TIntermAggregate* b) : condition(cond), body(b),
+        flatten(false), dontFlatten(false) {}
     virtual void traverse(TIntermTraverser*);
     virtual TIntermNode* getCondition() const { return condition; }
     virtual TIntermAggregate* getBody() const { return body; }
     virtual       TIntermSwitch* getAsSwitchNode()       { return this; }
     virtual const TIntermSwitch* getAsSwitchNode() const { return this; }
+
+    void setFlatten()     { flatten = true; }
+    void setDontFlatten() { dontFlatten = true; }
+    bool getFlatten()     const { return flatten; }
+    bool getDontFlatten() const { return dontFlatten; }
+
 protected:
     TIntermTyped* condition;
     TIntermAggregate* body;
+    bool flatten;     // true if flatten requested
+    bool dontFlatten; // true if requested to not flatten
 };
 
 enum TVisit
diff --git a/glslang/Include/revision.h b/glslang/Include/revision.h
index 218f8b6..e0c42c8 100644
--- a/glslang/Include/revision.h
+++ b/glslang/Include/revision.h
@@ -1,6 +1,3 @@
 // This header is generated by the make-revision script.
-// For the version, it uses the latest git tag followed by the number of commits.
-// For the date, it uses the current date (when then script is run).
 
-#define GLSLANG_REVISION "Overload400-PrecQual.2000"
-#define GLSLANG_DATE "12-Apr-2017"
+#define GLSLANG_PATCH_LEVEL 3009
diff --git a/glslang/MachineIndependent/Constant.cpp b/glslang/MachineIndependent/Constant.cpp
old mode 100644
new mode 100755
index fff8fd2..8d4987b
--- a/glslang/MachineIndependent/Constant.cpp
+++ b/glslang/MachineIndependent/Constant.cpp
@@ -1,6 +1,7 @@
 //
 // Copyright (C) 2002-2005  3Dlabs Inc. Ltd.
 // Copyright (C) 2012-2013 LunarG, Inc.
+// Copyright (C) 2017 ARM Limited.
 //
 // All rights reserved.
 //
@@ -38,6 +39,7 @@
 #include <cmath>
 #include <cfloat>
 #include <cstdlib>
+#include <climits>
 
 namespace {
 
@@ -176,41 +178,77 @@
             switch (getType().getBasicType()) {
             case EbtDouble:
             case EbtFloat:
-#ifdef AMD_EXTENSIONS
             case EbtFloat16:
-#endif
-                newConstArray[i].setDConst(leftUnionArray[i].getDConst() / rightUnionArray[i].getDConst());
+                if (rightUnionArray[i].getDConst() != 0.0)
+                    newConstArray[i].setDConst(leftUnionArray[i].getDConst() / rightUnionArray[i].getDConst());
+                else if (leftUnionArray[i].getDConst() > 0.0)
+                    newConstArray[i].setDConst((double)INFINITY);
+                else if (leftUnionArray[i].getDConst() < 0.0)
+                    newConstArray[i].setDConst(-(double)INFINITY);
+                else
+                    newConstArray[i].setDConst((double)NAN);
+                break;
+            case EbtInt8:
+                if (rightUnionArray[i] == (signed char)0)
+                    newConstArray[i].setI8Const((signed char)0x7F);
+                else if (rightUnionArray[i].getI8Const() == (signed char)-1 && leftUnionArray[i].getI8Const() == (signed char)-0x80)
+                    newConstArray[i].setI8Const((signed char)-0x80);
+                else
+                    newConstArray[i].setI8Const(leftUnionArray[i].getI8Const() / rightUnionArray[i].getI8Const());
+                break;
+
+            case EbtUint8:
+                if (rightUnionArray[i] == (unsigned char)0u)
+                    newConstArray[i].setU8Const((unsigned char)0xFFu);
+                else
+                    newConstArray[i].setU8Const(leftUnionArray[i].getU8Const() / rightUnionArray[i].getU8Const());
+                break;
+
+           case EbtInt16:
+                if (rightUnionArray[i] == (signed short)0)
+                    newConstArray[i].setI16Const((signed short)0x7FFF);
+                else if (rightUnionArray[i].getI16Const() == (signed short)-1 && leftUnionArray[i].getI16Const() == (signed short)-0x8000)
+                    newConstArray[i].setI16Const((signed short)-0x8000);
+                else
+                    newConstArray[i].setI16Const(leftUnionArray[i].getI16Const() / rightUnionArray[i].getI16Const());
+                break;
+
+            case EbtUint16:
+                if (rightUnionArray[i] == (unsigned short)0u)
+                    newConstArray[i].setU16Const((unsigned short)0xFFFFu);
+                else
+                    newConstArray[i].setU16Const(leftUnionArray[i].getU16Const() / rightUnionArray[i].getU16Const());
                 break;
 
             case EbtInt:
                 if (rightUnionArray[i] == 0)
                     newConstArray[i].setIConst(0x7FFFFFFF);
-                else if (rightUnionArray[i].getIConst() == -1 && leftUnionArray[i].getIConst() == (int)0x80000000)
-                    newConstArray[i].setIConst(0x80000000);
+                else if (rightUnionArray[i].getIConst() == -1 && leftUnionArray[i].getIConst() == (int)-0x80000000ll)
+                    newConstArray[i].setIConst((int)-0x80000000ll);
                 else
                     newConstArray[i].setIConst(leftUnionArray[i].getIConst() / rightUnionArray[i].getIConst());
                 break;
 
             case EbtUint:
-                if (rightUnionArray[i] == 0) {
-                    newConstArray[i].setUConst(0xFFFFFFFF);
-                } else
+                if (rightUnionArray[i] == 0u)
+                    newConstArray[i].setUConst(0xFFFFFFFFu);
+                else
                     newConstArray[i].setUConst(leftUnionArray[i].getUConst() / rightUnionArray[i].getUConst());
                 break;
 
             case EbtInt64:
-                if (rightUnionArray[i] == 0)
+                if (rightUnionArray[i] == 0ll)
                     newConstArray[i].setI64Const(0x7FFFFFFFFFFFFFFFll);
-                else if (rightUnionArray[i].getI64Const() == -1 && leftUnionArray[i].getI64Const() == (long long)0x8000000000000000)
-                    newConstArray[i].setI64Const(0x8000000000000000);
+                else if (rightUnionArray[i].getI64Const() == -1 && leftUnionArray[i].getI64Const() == (long long)-0x8000000000000000ll)
+                    newConstArray[i].setI64Const((long long)-0x8000000000000000ll);
                 else
                     newConstArray[i].setI64Const(leftUnionArray[i].getI64Const() / rightUnionArray[i].getI64Const());
                 break;
 
             case EbtUint64:
-                if (rightUnionArray[i] == 0) {
+                if (rightUnionArray[i] == 0ull)
                     newConstArray[i].setU64Const(0xFFFFFFFFFFFFFFFFull);
-                } else
+                else
                     newConstArray[i].setU64Const(leftUnionArray[i].getU64Const() / rightUnionArray[i].getU64Const());
                 break;
             default:
@@ -246,8 +284,31 @@
         for (int i = 0; i < newComps; i++) {
             if (rightUnionArray[i] == 0)
                 newConstArray[i] = leftUnionArray[i];
-            else
-                newConstArray[i] = leftUnionArray[i] % rightUnionArray[i];
+            else {
+                switch (getType().getBasicType()) {
+                case EbtInt:
+                    if (rightUnionArray[i].getIConst() == -1 && leftUnionArray[i].getIConst() == INT_MIN) {
+                        newConstArray[i].setIConst(0);
+                        break;
+                    } else goto modulo_default;
+
+                case EbtInt64:
+                    if (rightUnionArray[i].getI64Const() == -1 && leftUnionArray[i].getI64Const() == LLONG_MIN) {
+                        newConstArray[i].setI64Const(0);
+                        break;
+                    } else goto modulo_default;
+#ifdef AMD_EXTENSIONS
+                case EbtInt16:
+                    if (rightUnionArray[i].getIConst() == -1 && leftUnionArray[i].getIConst() == SHRT_MIN) {
+                        newConstArray[i].setIConst(0);
+                        break;
+                    } else goto modulo_default;
+#endif
+                default:
+                modulo_default:
+                    newConstArray[i] = leftUnionArray[i] % rightUnionArray[i];
+                }
+            }
         }
         break;
 
@@ -370,6 +431,12 @@
         resultSize = 2;
         break;
 
+    case EOpPack16:
+    case EOpPack32:
+    case EOpPack64:
+    case EOpUnpack32:
+    case EOpUnpack16:
+    case EOpUnpack8:
     case EOpNormalize:
         componentWise = false;
         resultSize = objectSize;
@@ -428,6 +495,12 @@
     case EOpPackSnorm2x16:
     case EOpPackUnorm2x16:
     case EOpPackHalf2x16:
+    case EOpPack16:
+    case EOpPack32:
+    case EOpPack64:
+    case EOpUnpack32:
+    case EOpUnpack16:
+    case EOpUnpack8:
 
     case EOpUnpackSnorm2x16:
     case EOpUnpackUnorm2x16:
@@ -453,14 +526,16 @@
         case EOpNegative:
             switch (getType().getBasicType()) {
             case EbtDouble:
-#ifdef AMD_EXTENSIONS
             case EbtFloat16:
-#endif
             case EbtFloat: newConstArray[i].setDConst(-unionArray[i].getDConst()); break;
+            case EbtInt8:  newConstArray[i].setI8Const(-unionArray[i].getI8Const()); break;
+            case EbtUint8: newConstArray[i].setU8Const(static_cast<unsigned int>(-static_cast<signed int>(unionArray[i].getU8Const())));  break;
+            case EbtInt16: newConstArray[i].setI16Const(-unionArray[i].getI16Const()); break;
+            case EbtUint16:newConstArray[i].setU16Const(static_cast<unsigned int>(-static_cast<signed int>(unionArray[i].getU16Const())));  break;
             case EbtInt:   newConstArray[i].setIConst(-unionArray[i].getIConst()); break;
             case EbtUint:  newConstArray[i].setUConst(static_cast<unsigned int>(-static_cast<int>(unionArray[i].getUConst())));  break;
             case EbtInt64: newConstArray[i].setI64Const(-unionArray[i].getI64Const()); break;
-            case EbtUint64: newConstArray[i].setU64Const(static_cast<unsigned int>(-static_cast<int>(unionArray[i].getU64Const())));  break;
+            case EbtUint64: newConstArray[i].setU64Const(static_cast<unsigned long long>(-static_cast<long long>(unionArray[i].getU64Const())));  break;
             default:
                 return 0;
             }
@@ -595,6 +670,279 @@
             break;
         }
 
+        case EOpConvInt8ToBool:
+            newConstArray[i].setBConst(unionArray[i].getI8Const() != 0); break;
+        case EOpConvUint8ToBool:
+            newConstArray[i].setBConst(unionArray[i].getU8Const() != 0); break;
+        case EOpConvInt16ToBool:
+            newConstArray[i].setBConst(unionArray[i].getI16Const() != 0); break;
+        case EOpConvUint16ToBool:
+            newConstArray[i].setBConst(unionArray[i].getU16Const() != 0); break;
+        case EOpConvIntToBool:
+            newConstArray[i].setBConst(unionArray[i].getIConst() != 0); break;
+        case EOpConvUintToBool:
+            newConstArray[i].setBConst(unionArray[i].getUConst() != 0); break;
+        case EOpConvInt64ToBool:
+            newConstArray[i].setBConst(unionArray[i].getI64Const() != 0); break;
+        case EOpConvUint64ToBool:
+            newConstArray[i].setBConst(unionArray[i].getI64Const() != 0); break;
+        case EOpConvFloat16ToBool:
+            newConstArray[i].setBConst(unionArray[i].getDConst() != 0); break;
+        case EOpConvFloatToBool:
+            newConstArray[i].setBConst(unionArray[i].getDConst() != 0); break;
+        case EOpConvDoubleToBool:
+            newConstArray[i].setBConst(unionArray[i].getDConst() != 0); break;
+
+        case EOpConvBoolToInt8:
+            newConstArray[i].setI8Const(unionArray[i].getBConst()); break;
+        case EOpConvBoolToUint8:
+            newConstArray[i].setU8Const(unionArray[i].getBConst()); break;
+        case EOpConvBoolToInt16:
+            newConstArray[i].setI16Const(unionArray[i].getBConst()); break;
+        case EOpConvBoolToUint16:
+            newConstArray[i].setU16Const(unionArray[i].getBConst()); break;
+        case EOpConvBoolToInt:
+            newConstArray[i].setIConst(unionArray[i].getBConst()); break;
+        case EOpConvBoolToUint:
+            newConstArray[i].setUConst(unionArray[i].getBConst()); break;
+        case EOpConvBoolToInt64:
+            newConstArray[i].setI64Const(unionArray[i].getBConst()); break;
+        case EOpConvBoolToUint64:
+            newConstArray[i].setU64Const(unionArray[i].getBConst()); break;
+        case EOpConvBoolToFloat16:
+            newConstArray[i].setDConst(unionArray[i].getBConst()); break;
+        case EOpConvBoolToFloat:
+            newConstArray[i].setDConst(unionArray[i].getBConst()); break;
+        case EOpConvBoolToDouble:
+            newConstArray[i].setDConst(unionArray[i].getBConst()); break;
+
+        case EOpConvInt8ToInt16:
+            newConstArray[i].setI16Const(unionArray[i].getI8Const()); break;
+        case EOpConvInt8ToInt:
+            newConstArray[i].setIConst(unionArray[i].getI8Const()); break;
+        case EOpConvInt8ToInt64:
+            newConstArray[i].setI64Const(unionArray[i].getI8Const()); break;
+        case EOpConvInt8ToUint8:
+            newConstArray[i].setU8Const(unionArray[i].getI8Const()); break;
+        case EOpConvInt8ToUint16:
+            newConstArray[i].setU16Const(unionArray[i].getI8Const()); break;
+        case EOpConvInt8ToUint:
+            newConstArray[i].setUConst(unionArray[i].getI8Const()); break;
+        case EOpConvInt8ToUint64:
+            newConstArray[i].setU64Const(unionArray[i].getI8Const()); break;
+        case EOpConvUint8ToInt8:
+            newConstArray[i].setI8Const(unionArray[i].getU8Const()); break;
+        case EOpConvUint8ToInt16:
+            newConstArray[i].setI16Const(unionArray[i].getU8Const()); break;
+        case EOpConvUint8ToInt:
+            newConstArray[i].setIConst(unionArray[i].getU8Const()); break;
+        case EOpConvUint8ToInt64:
+            newConstArray[i].setI64Const(unionArray[i].getU8Const()); break;
+        case EOpConvUint8ToUint16:
+            newConstArray[i].setU16Const(unionArray[i].getU8Const()); break;
+        case EOpConvUint8ToUint:
+            newConstArray[i].setUConst(unionArray[i].getU8Const()); break;
+        case EOpConvUint8ToUint64:
+            newConstArray[i].setU64Const(unionArray[i].getU8Const()); break;
+        case EOpConvInt8ToFloat16:
+            newConstArray[i].setDConst(unionArray[i].getI8Const()); break;
+        case EOpConvInt8ToFloat:
+            newConstArray[i].setDConst(unionArray[i].getI8Const()); break;
+        case EOpConvInt8ToDouble:
+            newConstArray[i].setDConst(unionArray[i].getI8Const()); break;
+        case EOpConvUint8ToFloat16:
+            newConstArray[i].setDConst(unionArray[i].getU8Const()); break;
+        case EOpConvUint8ToFloat:
+            newConstArray[i].setDConst(unionArray[i].getU8Const()); break;
+        case EOpConvUint8ToDouble:
+            newConstArray[i].setDConst(unionArray[i].getU8Const()); break;
+
+        case EOpConvInt16ToInt8:
+            newConstArray[i].setI8Const(static_cast<int8_t>(unionArray[i].getI16Const())); break;
+        case EOpConvInt16ToInt:
+            newConstArray[i].setIConst(unionArray[i].getI16Const()); break;
+        case EOpConvInt16ToInt64:
+            newConstArray[i].setI64Const(unionArray[i].getI16Const()); break;
+        case EOpConvInt16ToUint8:
+            newConstArray[i].setU8Const(static_cast<uint8_t>(unionArray[i].getI16Const())); break;
+        case EOpConvInt16ToUint16:
+            newConstArray[i].setU16Const(unionArray[i].getI16Const()); break;
+        case EOpConvInt16ToUint:
+            newConstArray[i].setUConst(unionArray[i].getI16Const()); break;
+        case EOpConvInt16ToUint64:
+            newConstArray[i].setU64Const(unionArray[i].getI16Const()); break;
+        case EOpConvUint16ToInt8:
+            newConstArray[i].setI8Const(static_cast<int8_t>(unionArray[i].getU16Const())); break;
+        case EOpConvUint16ToInt16:
+            newConstArray[i].setI16Const(unionArray[i].getU16Const()); break;
+        case EOpConvUint16ToInt:
+            newConstArray[i].setIConst(unionArray[i].getU16Const()); break;
+        case EOpConvUint16ToInt64:
+            newConstArray[i].setI64Const(unionArray[i].getU16Const()); break;
+        case EOpConvUint16ToUint8:
+            newConstArray[i].setU8Const(static_cast<uint8_t>(unionArray[i].getU16Const())); break;
+
+        case EOpConvUint16ToUint:
+            newConstArray[i].setUConst(unionArray[i].getU16Const()); break;
+        case EOpConvUint16ToUint64:
+            newConstArray[i].setU64Const(unionArray[i].getU16Const()); break;
+        case EOpConvInt16ToFloat16:
+            newConstArray[i].setDConst(unionArray[i].getI16Const()); break;
+        case EOpConvInt16ToFloat:
+            newConstArray[i].setDConst(unionArray[i].getI16Const()); break;
+        case EOpConvInt16ToDouble:
+            newConstArray[i].setDConst(unionArray[i].getI16Const()); break;
+        case EOpConvUint16ToFloat16:
+            newConstArray[i].setDConst(unionArray[i].getU16Const()); break;
+        case EOpConvUint16ToFloat:
+            newConstArray[i].setDConst(unionArray[i].getU16Const()); break;
+        case EOpConvUint16ToDouble:
+            newConstArray[i].setDConst(unionArray[i].getU16Const()); break;
+
+        case EOpConvIntToInt8:
+            newConstArray[i].setI8Const(unionArray[i].getIConst()); break;
+        case EOpConvIntToInt16:
+            newConstArray[i].setI16Const(unionArray[i].getIConst()); break;
+        case EOpConvIntToInt64:
+            newConstArray[i].setI64Const(unionArray[i].getIConst()); break;
+        case EOpConvIntToUint8:
+            newConstArray[i].setU8Const(unionArray[i].getIConst()); break;
+        case EOpConvIntToUint16:
+            newConstArray[i].setU16Const(unionArray[i].getIConst()); break;
+        case EOpConvIntToUint:
+            newConstArray[i].setUConst(unionArray[i].getIConst()); break;
+        case EOpConvIntToUint64:
+            newConstArray[i].setU64Const(unionArray[i].getIConst()); break;
+
+        case EOpConvUintToInt8:
+            newConstArray[i].setI8Const(unionArray[i].getUConst()); break;
+        case EOpConvUintToInt16:
+            newConstArray[i].setI16Const(unionArray[i].getUConst()); break;
+        case EOpConvUintToInt:
+            newConstArray[i].setIConst(unionArray[i].getUConst()); break;
+        case EOpConvUintToInt64:
+            newConstArray[i].setI64Const(unionArray[i].getUConst()); break;
+        case EOpConvUintToUint8:
+            newConstArray[i].setU8Const(unionArray[i].getUConst()); break;
+        case EOpConvUintToUint16:
+            newConstArray[i].setU16Const(unionArray[i].getUConst()); break;
+        case EOpConvUintToUint64:
+            newConstArray[i].setU64Const(unionArray[i].getUConst()); break;
+        case EOpConvIntToFloat16:
+            newConstArray[i].setDConst(unionArray[i].getIConst()); break;
+        case EOpConvIntToFloat:
+            newConstArray[i].setDConst(unionArray[i].getIConst()); break;
+        case EOpConvIntToDouble:
+            newConstArray[i].setDConst(unionArray[i].getIConst()); break;
+        case EOpConvUintToFloat16:
+            newConstArray[i].setDConst(unionArray[i].getUConst()); break;
+        case EOpConvUintToFloat:
+            newConstArray[i].setDConst(unionArray[i].getUConst()); break;
+        case EOpConvUintToDouble:
+            newConstArray[i].setDConst(unionArray[i].getUConst()); break;
+        case EOpConvInt64ToInt8:
+            newConstArray[i].setI8Const(static_cast<int8_t>(unionArray[i].getI64Const())); break;
+        case EOpConvInt64ToInt16:
+            newConstArray[i].setI16Const(static_cast<int16_t>(unionArray[i].getI64Const())); break;
+        case EOpConvInt64ToInt:
+            newConstArray[i].setIConst(static_cast<int32_t>(unionArray[i].getI64Const())); break;
+        case EOpConvInt64ToUint8:
+            newConstArray[i].setU8Const(static_cast<uint8_t>(unionArray[i].getI64Const())); break;
+        case EOpConvInt64ToUint16:
+            newConstArray[i].setU16Const(static_cast<uint16_t>(unionArray[i].getI64Const())); break;
+        case EOpConvInt64ToUint:
+            newConstArray[i].setUConst(static_cast<uint32_t>(unionArray[i].getI64Const())); break;
+        case EOpConvInt64ToUint64:
+            newConstArray[i].setU64Const(unionArray[i].getI64Const()); break;
+        case EOpConvUint64ToInt8:
+            newConstArray[i].setI8Const(static_cast<int8_t>(unionArray[i].getU64Const())); break;
+        case EOpConvUint64ToInt16:
+            newConstArray[i].setI16Const(static_cast<int16_t>(unionArray[i].getU64Const())); break;
+        case EOpConvUint64ToInt:
+            newConstArray[i].setIConst(static_cast<int32_t>(unionArray[i].getU64Const())); break;
+        case EOpConvUint64ToInt64:
+            newConstArray[i].setI64Const(unionArray[i].getU64Const()); break;
+        case EOpConvUint64ToUint8:
+            newConstArray[i].setU8Const(static_cast<uint8_t>(unionArray[i].getU64Const())); break;
+        case EOpConvUint64ToUint16:
+            newConstArray[i].setU16Const(static_cast<uint16_t>(unionArray[i].getU64Const())); break;
+        case EOpConvUint64ToUint:
+            newConstArray[i].setUConst(static_cast<uint32_t>(unionArray[i].getU64Const())); break;
+        case EOpConvInt64ToFloat16:
+            newConstArray[i].setDConst(static_cast<double>(unionArray[i].getI64Const())); break;
+        case EOpConvInt64ToFloat:
+            newConstArray[i].setDConst(static_cast<double>(unionArray[i].getI64Const())); break;
+        case EOpConvInt64ToDouble:
+            newConstArray[i].setDConst(static_cast<double>(unionArray[i].getI64Const())); break;
+        case EOpConvUint64ToFloat16:
+            newConstArray[i].setDConst(static_cast<double>(unionArray[i].getU64Const())); break;
+        case EOpConvUint64ToFloat:
+            newConstArray[i].setDConst(static_cast<double>(unionArray[i].getU64Const())); break;
+        case EOpConvUint64ToDouble:
+            newConstArray[i].setDConst(static_cast<double>(unionArray[i].getU64Const())); break;
+        case EOpConvFloat16ToInt8:
+            newConstArray[i].setI8Const(static_cast<int8_t>(unionArray[i].getDConst())); break;
+        case EOpConvFloat16ToInt16:
+            newConstArray[i].setI16Const(static_cast<int16_t>(unionArray[i].getDConst())); break;
+        case EOpConvFloat16ToInt:
+            newConstArray[i].setIConst(static_cast<int32_t>(unionArray[i].getDConst())); break;
+        case EOpConvFloat16ToInt64:
+            newConstArray[i].setI64Const(static_cast<int64_t>(unionArray[i].getDConst())); break;
+        case EOpConvFloat16ToUint8:
+            newConstArray[i].setU8Const(static_cast<uint8_t>(unionArray[i].getDConst())); break;
+        case EOpConvFloat16ToUint16:
+            newConstArray[i].setU16Const(static_cast<uint16_t>(unionArray[i].getDConst())); break;
+        case EOpConvFloat16ToUint:
+            newConstArray[i].setUConst(static_cast<uint32_t>(unionArray[i].getDConst())); break;
+        case EOpConvFloat16ToUint64:
+            newConstArray[i].setU64Const(static_cast<uint64_t>(unionArray[i].getDConst())); break;
+        case EOpConvFloat16ToFloat:
+            newConstArray[i].setDConst(unionArray[i].getDConst()); break;
+        case EOpConvFloat16ToDouble:
+            newConstArray[i].setDConst(unionArray[i].getDConst()); break;
+        case EOpConvFloatToInt8:
+            newConstArray[i].setI8Const(static_cast<int8_t>(unionArray[i].getDConst())); break;
+        case EOpConvFloatToInt16:
+            newConstArray[i].setI16Const(static_cast<int16_t>(unionArray[i].getDConst())); break;
+        case EOpConvFloatToInt:
+            newConstArray[i].setIConst(static_cast<int32_t>(unionArray[i].getDConst())); break;
+        case EOpConvFloatToInt64:
+            newConstArray[i].setI64Const(static_cast<int64_t>(unionArray[i].getDConst())); break;
+        case EOpConvFloatToUint8:
+            newConstArray[i].setU8Const(static_cast<uint8_t>(unionArray[i].getDConst())); break;
+        case EOpConvFloatToUint16:
+            newConstArray[i].setU16Const(static_cast<uint16_t>(unionArray[i].getDConst())); break;
+        case EOpConvFloatToUint:
+            newConstArray[i].setUConst(static_cast<uint32_t>(unionArray[i].getDConst())); break;
+        case EOpConvFloatToUint64:
+            newConstArray[i].setU64Const(static_cast<uint64_t>(unionArray[i].getDConst())); break;
+        case EOpConvFloatToFloat16:
+            newConstArray[i].setDConst(unionArray[i].getDConst()); break;
+        case EOpConvFloatToDouble:
+            newConstArray[i].setDConst(unionArray[i].getDConst()); break;
+        case EOpConvDoubleToInt8:
+            newConstArray[i].setI8Const(static_cast<int8_t>(unionArray[i].getDConst())); break;
+        case EOpConvDoubleToInt16:
+            newConstArray[i].setI16Const(static_cast<int16_t>(unionArray[i].getDConst())); break;
+        case EOpConvDoubleToInt:
+            newConstArray[i].setIConst(static_cast<int32_t>(unionArray[i].getDConst())); break;
+        case EOpConvDoubleToInt64:
+            newConstArray[i].setI64Const(static_cast<int64_t>(unionArray[i].getDConst())); break;
+        case EOpConvDoubleToUint8:
+            newConstArray[i].setU8Const(static_cast<uint8_t>(unionArray[i].getDConst())); break;
+        case EOpConvDoubleToUint16:
+            newConstArray[i].setU16Const(static_cast<uint16_t>(unionArray[i].getDConst())); break;
+        case EOpConvDoubleToUint:
+            newConstArray[i].setUConst(static_cast<uint32_t>(unionArray[i].getDConst())); break;
+        case EOpConvDoubleToUint64:
+            newConstArray[i].setU64Const(static_cast<uint64_t>(unionArray[i].getDConst())); break;
+        case EOpConvDoubleToFloat16:
+            newConstArray[i].setDConst(unionArray[i].getDConst()); break;
+        case EOpConvDoubleToFloat:
+            newConstArray[i].setDConst(unionArray[i].getDConst()); break;
+
+
+
         // TODO: 3.0 Functionality: unary constant folding: the rest of the ops have to be fleshed out
 
         case EOpSinh:
@@ -610,7 +958,12 @@
         case EOpUintBitsToFloat:
         case EOpDoubleBitsToInt64:
         case EOpDoubleBitsToUint64:
-
+        case EOpInt64BitsToDouble:
+        case EOpUint64BitsToDouble:
+        case EOpFloat16BitsToInt16:
+        case EOpFloat16BitsToUint16:
+        case EOpInt16BitsToFloat16:
+        case EOpUint16BitsToFloat16:
         default:
             return 0;
         }
@@ -694,17 +1047,6 @@
     for (unsigned int arg = 0; arg < children.size(); ++arg)
         childConstUnions.push_back(children[arg]->getAsConstantUnion()->getConstArray());
 
-    // Second, do the actual folding
-
-    bool isFloatingPoint = children[0]->getAsTyped()->getBasicType() == EbtFloat ||
-#ifdef AMD_EXTENSIONS
-                           children[0]->getAsTyped()->getBasicType() == EbtFloat16 ||
-#endif
-                           children[0]->getAsTyped()->getBasicType() == EbtDouble;
-    bool isSigned = children[0]->getAsTyped()->getBasicType() == EbtInt ||
-                    children[0]->getAsTyped()->getBasicType() == EbtInt64;
-    bool isInt64 = children[0]->getAsTyped()->getBasicType() == EbtInt64 ||
-                   children[0]->getAsTyped()->getBasicType() == EbtUint64;
     if (componentwise) {
         for (int comp = 0; comp < objectSize; comp++) {
 
@@ -725,53 +1067,114 @@
                 newConstArray[comp].setDConst(pow(childConstUnions[0][arg0comp].getDConst(), childConstUnions[1][arg1comp].getDConst()));
                 break;
             case EOpMin:
-                if (isFloatingPoint)
+                switch(children[0]->getAsTyped()->getBasicType()) {
+                case EbtFloat16:
+                case EbtFloat:
+                case EbtDouble:
                     newConstArray[comp].setDConst(std::min(childConstUnions[0][arg0comp].getDConst(), childConstUnions[1][arg1comp].getDConst()));
-                else if (isSigned) {
-                    if (isInt64)
-                        newConstArray[comp].setI64Const(std::min(childConstUnions[0][arg0comp].getI64Const(), childConstUnions[1][arg1comp].getI64Const()));
-                    else
-                        newConstArray[comp].setIConst(std::min(childConstUnions[0][arg0comp].getIConst(), childConstUnions[1][arg1comp].getIConst()));
-                } else {
-                    if (isInt64)
-                        newConstArray[comp].setU64Const(std::min(childConstUnions[0][arg0comp].getU64Const(), childConstUnions[1][arg1comp].getU64Const()));
-                    else
-                        newConstArray[comp].setUConst(std::min(childConstUnions[0][arg0comp].getUConst(), childConstUnions[1][arg1comp].getUConst()));
+                    break;
+                case EbtInt8:
+                    newConstArray[comp].setI8Const(std::min(childConstUnions[0][arg0comp].getI8Const(), childConstUnions[1][arg1comp].getI8Const()));
+                    break;
+                case EbtUint8:
+                    newConstArray[comp].setU8Const(std::min(childConstUnions[0][arg0comp].getU8Const(), childConstUnions[1][arg1comp].getU8Const()));
+                    break;
+                case EbtInt16:
+                    newConstArray[comp].setI16Const(std::min(childConstUnions[0][arg0comp].getI16Const(), childConstUnions[1][arg1comp].getI16Const()));
+                    break;
+                case EbtUint16:
+                    newConstArray[comp].setU16Const(std::min(childConstUnions[0][arg0comp].getU16Const(), childConstUnions[1][arg1comp].getU16Const()));
+                    break;
+                case EbtInt:
+                    newConstArray[comp].setIConst(std::min(childConstUnions[0][arg0comp].getIConst(), childConstUnions[1][arg1comp].getIConst()));
+                    break;
+                case EbtUint:
+                    newConstArray[comp].setUConst(std::min(childConstUnions[0][arg0comp].getUConst(), childConstUnions[1][arg1comp].getUConst()));
+                    break;
+                case EbtInt64:
+                    newConstArray[comp].setI64Const(std::min(childConstUnions[0][arg0comp].getI64Const(), childConstUnions[1][arg1comp].getI64Const()));
+                    break;
+                case EbtUint64:
+                    newConstArray[comp].setU64Const(std::min(childConstUnions[0][arg0comp].getU64Const(), childConstUnions[1][arg1comp].getU64Const()));
+                    break;
+                default: assert(false && "Default missing");
                 }
                 break;
             case EOpMax:
-                if (isFloatingPoint)
+                switch(children[0]->getAsTyped()->getBasicType()) {
+                case EbtFloat16:
+                case EbtFloat:
+                case EbtDouble:
                     newConstArray[comp].setDConst(std::max(childConstUnions[0][arg0comp].getDConst(), childConstUnions[1][arg1comp].getDConst()));
-                else if (isSigned) {
-                    if (isInt64)
-                        newConstArray[comp].setI64Const(std::max(childConstUnions[0][arg0comp].getI64Const(), childConstUnions[1][arg1comp].getI64Const()));
-                    else
-                        newConstArray[comp].setIConst(std::max(childConstUnions[0][arg0comp].getIConst(), childConstUnions[1][arg1comp].getIConst()));
-                } else {
-                    if (isInt64)
-                        newConstArray[comp].setU64Const(std::max(childConstUnions[0][arg0comp].getU64Const(), childConstUnions[1][arg1comp].getU64Const()));
-                    else
-                        newConstArray[comp].setUConst(std::max(childConstUnions[0][arg0comp].getUConst(), childConstUnions[1][arg1comp].getUConst()));
+                    break;
+                case EbtInt8:
+                    newConstArray[comp].setI8Const(std::max(childConstUnions[0][arg0comp].getI8Const(), childConstUnions[1][arg1comp].getI8Const()));
+                    break;
+                case EbtUint8:
+                    newConstArray[comp].setU8Const(std::max(childConstUnions[0][arg0comp].getU8Const(), childConstUnions[1][arg1comp].getU8Const()));
+                    break;
+                case EbtInt16:
+                    newConstArray[comp].setI16Const(std::max(childConstUnions[0][arg0comp].getI16Const(), childConstUnions[1][arg1comp].getI16Const()));
+                    break;
+                case EbtUint16:
+                    newConstArray[comp].setU16Const(std::max(childConstUnions[0][arg0comp].getU16Const(), childConstUnions[1][arg1comp].getU16Const()));
+                    break;
+                case EbtInt:
+                    newConstArray[comp].setIConst(std::max(childConstUnions[0][arg0comp].getIConst(), childConstUnions[1][arg1comp].getIConst()));
+                    break;
+                case EbtUint:
+                    newConstArray[comp].setUConst(std::max(childConstUnions[0][arg0comp].getUConst(), childConstUnions[1][arg1comp].getUConst()));
+                    break;
+                case EbtInt64:
+                    newConstArray[comp].setI64Const(std::max(childConstUnions[0][arg0comp].getI64Const(), childConstUnions[1][arg1comp].getI64Const()));
+                    break;
+                case EbtUint64:
+                    newConstArray[comp].setU64Const(std::max(childConstUnions[0][arg0comp].getU64Const(), childConstUnions[1][arg1comp].getU64Const()));
+                    break;
+                default: assert(false && "Default missing");
                 }
                 break;
             case EOpClamp:
-                if (isFloatingPoint)
+                switch(children[0]->getAsTyped()->getBasicType()) {
+                case EbtFloat16:
+                case EbtFloat:
+                case EbtDouble:
                     newConstArray[comp].setDConst(std::min(std::max(childConstUnions[0][arg0comp].getDConst(), childConstUnions[1][arg1comp].getDConst()),
                                                                                                                childConstUnions[2][arg2comp].getDConst()));
-                else if (isSigned) {
-                    if (isInt64)
-                        newConstArray[comp].setI64Const(std::min(std::max(childConstUnions[0][arg0comp].getI64Const(), childConstUnions[1][arg1comp].getI64Const()),
-                                                                                                                       childConstUnions[2][arg2comp].getI64Const()));
-                    else
-                        newConstArray[comp].setIConst(std::min(std::max(childConstUnions[0][arg0comp].getIConst(), childConstUnions[1][arg1comp].getIConst()),
+                    break;
+                case EbtInt8:
+                    newConstArray[comp].setI8Const(std::min(std::max(childConstUnions[0][arg0comp].getI8Const(), childConstUnions[1][arg1comp].getI8Const()),
+                                                                                                                   childConstUnions[2][arg2comp].getI8Const()));
+                    break;
+                case EbtUint8:
+                     newConstArray[comp].setU8Const(std::min(std::max(childConstUnions[0][arg0comp].getU8Const(), childConstUnions[1][arg1comp].getU8Const()),
+                                                                                                                   childConstUnions[2][arg2comp].getU8Const()));
+                    break;
+                case EbtInt16:
+                    newConstArray[comp].setI16Const(std::min(std::max(childConstUnions[0][arg0comp].getI16Const(), childConstUnions[1][arg1comp].getI16Const()),
+                                                                                                                   childConstUnions[2][arg2comp].getI16Const()));
+                    break;
+                case EbtUint16:
+                    newConstArray[comp].setU16Const(std::min(std::max(childConstUnions[0][arg0comp].getU16Const(), childConstUnions[1][arg1comp].getU16Const()),
+                                                                                                                   childConstUnions[2][arg2comp].getU16Const()));
+                    break;
+                case EbtInt:
+                    newConstArray[comp].setIConst(std::min(std::max(childConstUnions[0][arg0comp].getIConst(), childConstUnions[1][arg1comp].getIConst()),
                                                                                                                    childConstUnions[2][arg2comp].getIConst()));
-                } else {
-                    if (isInt64)
-                        newConstArray[comp].setU64Const(std::min(std::max(childConstUnions[0][arg0comp].getU64Const(), childConstUnions[1][arg1comp].getU64Const()),
-                                                                                                                       childConstUnions[2][arg2comp].getU64Const()));
-                    else
-                        newConstArray[comp].setUConst(std::min(std::max(childConstUnions[0][arg0comp].getUConst(), childConstUnions[1][arg1comp].getUConst()),
+                    break;
+                case EbtUint:
+                    newConstArray[comp].setUConst(std::min(std::max(childConstUnions[0][arg0comp].getUConst(), childConstUnions[1][arg1comp].getUConst()),
                                                                                                                    childConstUnions[2][arg2comp].getUConst()));
+                    break;
+                case EbtInt64:
+                    newConstArray[comp].setI64Const(std::min(std::max(childConstUnions[0][arg0comp].getI64Const(), childConstUnions[1][arg1comp].getI64Const()),
+                                                                                                                       childConstUnions[2][arg2comp].getI64Const()));
+                    break;
+                case EbtUint64:
+                    newConstArray[comp].setU64Const(std::min(std::max(childConstUnions[0][arg0comp].getU64Const(), childConstUnions[1][arg1comp].getU64Const()),
+                                                                                                                       childConstUnions[2][arg2comp].getU64Const()));
+                    break;
+                default: assert(false && "Default missing");
                 }
                 break;
             case EOpLessThan:
diff --git a/glslang/MachineIndependent/Initialize.cpp b/glslang/MachineIndependent/Initialize.cpp
index 2c46e4f..7118d06 100644
--- a/glslang/MachineIndependent/Initialize.cpp
+++ b/glslang/MachineIndependent/Initialize.cpp
@@ -1,7 +1,8 @@
 //
 // Copyright (C) 2002-2005  3Dlabs Inc. Ltd.
 // Copyright (C) 2012-2016 LunarG, Inc.
-// Copyright (C) 2015-2016 Google, Inc.
+// Copyright (C) 2015-2017 Google, Inc.
+// Copyright (C) 2017 ARM Limited.
 //
 // All rights reserved.
 //
@@ -83,10 +84,15 @@
     // Set up textual representations for making all the permutations
     // of texturing/imaging functions.
     prefixes[EbtFloat] =  "";
+#ifdef AMD_EXTENSIONS
+    prefixes[EbtFloat16] = "f16";
+#endif
+    prefixes[EbtInt8]  = "i8";
+    prefixes[EbtUint8] = "u8";
+    prefixes[EbtInt16]  = "i16";
+    prefixes[EbtUint16] = "u16";
     prefixes[EbtInt]   = "i";
     prefixes[EbtUint]  = "u";
-    prefixes[EbtInt64]  = "i64";
-    prefixes[EbtUint64] = "u64";
     postfixes[2] = "2";
     postfixes[3] = "3";
     postfixes[4] = "4";
@@ -118,6 +124,158 @@
 {
     //============================================================================
     //
+    // Prototypes for built-in functions used repeatly by different shaders
+    //
+    //============================================================================
+
+    //
+    // Derivatives Functions.
+    //
+    TString derivatives (
+        "float dFdx(float p);"
+        "vec2  dFdx(vec2  p);"
+        "vec3  dFdx(vec3  p);"
+        "vec4  dFdx(vec4  p);"
+
+        "float dFdy(float p);"
+        "vec2  dFdy(vec2  p);"
+        "vec3  dFdy(vec3  p);"
+        "vec4  dFdy(vec4  p);"
+
+        "float fwidth(float p);"
+        "vec2  fwidth(vec2  p);"
+        "vec3  fwidth(vec3  p);"
+        "vec4  fwidth(vec4  p);"
+    );
+
+    TString derivativeControls (
+        "float dFdxFine(float p);"
+        "vec2  dFdxFine(vec2  p);"
+        "vec3  dFdxFine(vec3  p);"
+        "vec4  dFdxFine(vec4  p);"
+
+        "float dFdyFine(float p);"
+        "vec2  dFdyFine(vec2  p);"
+        "vec3  dFdyFine(vec3  p);"
+        "vec4  dFdyFine(vec4  p);"
+
+        "float fwidthFine(float p);"
+        "vec2  fwidthFine(vec2  p);"
+        "vec3  fwidthFine(vec3  p);"
+        "vec4  fwidthFine(vec4  p);"
+
+        "float dFdxCoarse(float p);"
+        "vec2  dFdxCoarse(vec2  p);"
+        "vec3  dFdxCoarse(vec3  p);"
+        "vec4  dFdxCoarse(vec4  p);"
+
+        "float dFdyCoarse(float p);"
+        "vec2  dFdyCoarse(vec2  p);"
+        "vec3  dFdyCoarse(vec3  p);"
+        "vec4  dFdyCoarse(vec4  p);"
+
+        "float fwidthCoarse(float p);"
+        "vec2  fwidthCoarse(vec2  p);"
+        "vec3  fwidthCoarse(vec3  p);"
+        "vec4  fwidthCoarse(vec4  p);"
+    );
+
+    TString derivativesAndControl16bits (
+        "float16_t dFdx(float16_t);"
+        "f16vec2   dFdx(f16vec2);"
+        "f16vec3   dFdx(f16vec3);"
+        "f16vec4   dFdx(f16vec4);"
+
+        "float16_t dFdy(float16_t);"
+        "f16vec2   dFdy(f16vec2);"
+        "f16vec3   dFdy(f16vec3);"
+        "f16vec4   dFdy(f16vec4);"
+
+        "float16_t dFdxFine(float16_t);"
+        "f16vec2   dFdxFine(f16vec2);"
+        "f16vec3   dFdxFine(f16vec3);"
+        "f16vec4   dFdxFine(f16vec4);"
+
+        "float16_t dFdyFine(float16_t);"
+        "f16vec2   dFdyFine(f16vec2);"
+        "f16vec3   dFdyFine(f16vec3);"
+        "f16vec4   dFdyFine(f16vec4);"
+
+        "float16_t dFdxCoarse(float16_t);"
+        "f16vec2   dFdxCoarse(f16vec2);"
+        "f16vec3   dFdxCoarse(f16vec3);"
+        "f16vec4   dFdxCoarse(f16vec4);"
+
+        "float16_t dFdyCoarse(float16_t);"
+        "f16vec2   dFdyCoarse(f16vec2);"
+        "f16vec3   dFdyCoarse(f16vec3);"
+        "f16vec4   dFdyCoarse(f16vec4);"
+
+        "float16_t fwidth(float16_t);"
+        "f16vec2   fwidth(f16vec2);"
+        "f16vec3   fwidth(f16vec3);"
+        "f16vec4   fwidth(f16vec4);"
+
+        "float16_t fwidthFine(float16_t);"
+        "f16vec2   fwidthFine(f16vec2);"
+        "f16vec3   fwidthFine(f16vec3);"
+        "f16vec4   fwidthFine(f16vec4);"
+
+        "float16_t fwidthCoarse(float16_t);"
+        "f16vec2   fwidthCoarse(f16vec2);"
+        "f16vec3   fwidthCoarse(f16vec3);"
+        "f16vec4   fwidthCoarse(f16vec4);"
+    );
+
+    TString derivativesAndControl64bits (
+        "float64_t dFdx(float64_t);"
+        "f64vec2   dFdx(f64vec2);"
+        "f64vec3   dFdx(f64vec3);"
+        "f64vec4   dFdx(f64vec4);"
+
+        "float64_t dFdy(float64_t);"
+        "f64vec2   dFdy(f64vec2);"
+        "f64vec3   dFdy(f64vec3);"
+        "f64vec4   dFdy(f64vec4);"
+
+        "float64_t dFdxFine(float64_t);"
+        "f64vec2   dFdxFine(f64vec2);"
+        "f64vec3   dFdxFine(f64vec3);"
+        "f64vec4   dFdxFine(f64vec4);"
+
+        "float64_t dFdyFine(float64_t);"
+        "f64vec2   dFdyFine(f64vec2);"
+        "f64vec3   dFdyFine(f64vec3);"
+        "f64vec4   dFdyFine(f64vec4);"
+
+        "float64_t dFdxCoarse(float64_t);"
+        "f64vec2   dFdxCoarse(f64vec2);"
+        "f64vec3   dFdxCoarse(f64vec3);"
+        "f64vec4   dFdxCoarse(f64vec4);"
+
+        "float64_t dFdyCoarse(float64_t);"
+        "f64vec2   dFdyCoarse(f64vec2);"
+        "f64vec3   dFdyCoarse(f64vec3);"
+        "f64vec4   dFdyCoarse(f64vec4);"
+
+        "float64_t fwidth(float64_t);"
+        "f64vec2   fwidth(f64vec2);"
+        "f64vec3   fwidth(f64vec3);"
+        "f64vec4   fwidth(f64vec4);"
+
+        "float64_t fwidthFine(float64_t);"
+        "f64vec2   fwidthFine(f64vec2);"
+        "f64vec3   fwidthFine(f64vec3);"
+        "f64vec4   fwidthFine(f64vec4);"
+
+        "float64_t fwidthCoarse(float64_t);"
+        "f64vec2   fwidthCoarse(f64vec2);"
+        "f64vec3   fwidthCoarse(f64vec3);"
+        "f64vec4   fwidthCoarse(f64vec4);"
+    );
+
+    //============================================================================
+    //
     // Prototypes for built-in functions seen by both vertex and fragment shaders.
     //
     //============================================================================
@@ -801,7 +959,6 @@
             "bvec3 notEqual(u64vec3, u64vec3);"
             "bvec4 notEqual(u64vec4, u64vec4);"
 
-#ifdef AMD_EXTENSIONS
             "int   findLSB(int64_t);"
             "ivec2 findLSB(i64vec2);"
             "ivec3 findLSB(i64vec3);"
@@ -821,7 +978,7 @@
             "ivec2 findMSB(u64vec2);"
             "ivec3 findMSB(u64vec3);"
             "ivec4 findMSB(u64vec4);"
-#endif
+
             "\n"
         );
     }
@@ -890,6 +1047,36 @@
             "f16vec3   mid3(f16vec3,   f16vec3,   f16vec3);"
             "f16vec4   mid3(f16vec4,   f16vec4,   f16vec4);"
 
+            "int16_t   min3(int16_t,   int16_t,   int16_t);"
+            "i16vec2   min3(i16vec2,   i16vec2,   i16vec2);"
+            "i16vec3   min3(i16vec3,   i16vec3,   i16vec3);"
+            "i16vec4   min3(i16vec4,   i16vec4,   i16vec4);"
+
+            "int16_t   max3(int16_t,   int16_t,   int16_t);"
+            "i16vec2   max3(i16vec2,   i16vec2,   i16vec2);"
+            "i16vec3   max3(i16vec3,   i16vec3,   i16vec3);"
+            "i16vec4   max3(i16vec4,   i16vec4,   i16vec4);"
+
+            "int16_t   mid3(int16_t,   int16_t,   int16_t);"
+            "i16vec2   mid3(i16vec2,   i16vec2,   i16vec2);"
+            "i16vec3   mid3(i16vec3,   i16vec3,   i16vec3);"
+            "i16vec4   mid3(i16vec4,   i16vec4,   i16vec4);"
+
+            "uint16_t  min3(uint16_t,  uint16_t,  uint16_t);"
+            "u16vec2   min3(u16vec2,   u16vec2,   u16vec2);"
+            "u16vec3   min3(u16vec3,   u16vec3,   u16vec3);"
+            "u16vec4   min3(u16vec4,   u16vec4,   u16vec4);"
+
+            "uint16_t  max3(uint16_t,  uint16_t,  uint16_t);"
+            "u16vec2   max3(u16vec2,   u16vec2,   u16vec2);"
+            "u16vec3   max3(u16vec3,   u16vec3,   u16vec3);"
+            "u16vec4   max3(u16vec4,   u16vec4,   u16vec4);"
+
+            "uint16_t  mid3(uint16_t,  uint16_t,  uint16_t);"
+            "u16vec2   mid3(u16vec2,   u16vec2,   u16vec2);"
+            "u16vec3   mid3(u16vec3,   u16vec3,   u16vec3);"
+            "u16vec4   mid3(u16vec4,   u16vec4,   u16vec4);"
+
             "\n"
         );
     }
@@ -900,28 +1087,100 @@
         commonBuiltins.append(
             "uint atomicAdd(coherent volatile inout uint, uint);"
             " int atomicAdd(coherent volatile inout  int,  int);"
+            "uint atomicAdd(coherent volatile inout uint, uint, int, int, int);"
+            " int atomicAdd(coherent volatile inout  int,  int, int, int, int);"
 
             "uint atomicMin(coherent volatile inout uint, uint);"
             " int atomicMin(coherent volatile inout  int,  int);"
+            "uint atomicMin(coherent volatile inout uint, uint, int, int, int);"
+            " int atomicMin(coherent volatile inout  int,  int, int, int, int);"
 
             "uint atomicMax(coherent volatile inout uint, uint);"
             " int atomicMax(coherent volatile inout  int,  int);"
+            "uint atomicMax(coherent volatile inout uint, uint, int, int, int);"
+            " int atomicMax(coherent volatile inout  int,  int, int, int, int);"
 
             "uint atomicAnd(coherent volatile inout uint, uint);"
             " int atomicAnd(coherent volatile inout  int,  int);"
+            "uint atomicAnd(coherent volatile inout uint, uint, int, int, int);"
+            " int atomicAnd(coherent volatile inout  int,  int, int, int, int);"
 
             "uint atomicOr (coherent volatile inout uint, uint);"
             " int atomicOr (coherent volatile inout  int,  int);"
+            "uint atomicOr (coherent volatile inout uint, uint, int, int, int);"
+            " int atomicOr (coherent volatile inout  int,  int, int, int, int);"
 
             "uint atomicXor(coherent volatile inout uint, uint);"
             " int atomicXor(coherent volatile inout  int,  int);"
+            "uint atomicXor(coherent volatile inout uint, uint, int, int, int);"
+            " int atomicXor(coherent volatile inout  int,  int, int, int, int);"
 
             "uint atomicExchange(coherent volatile inout uint, uint);"
             " int atomicExchange(coherent volatile inout  int,  int);"
+            "uint atomicExchange(coherent volatile inout uint, uint, int, int, int);"
+            " int atomicExchange(coherent volatile inout  int,  int, int, int, int);"
 
             "uint atomicCompSwap(coherent volatile inout uint, uint, uint);"
             " int atomicCompSwap(coherent volatile inout  int,  int,  int);"
+            "uint atomicCompSwap(coherent volatile inout uint, uint, uint, int, int, int, int, int);"
+            " int atomicCompSwap(coherent volatile inout  int,  int,  int, int, int, int, int, int);"
 
+            "uint atomicLoad(coherent volatile in uint, int, int, int);"
+            " int atomicLoad(coherent volatile in  int, int, int, int);"
+
+            "void atomicStore(coherent volatile out uint, uint, int, int, int);"
+            "void atomicStore(coherent volatile out  int,  int, int, int, int);"
+
+            "\n");
+    }
+
+    if (profile != EEsProfile && version >= 440) {
+        commonBuiltins.append(
+            "uint64_t atomicMin(coherent volatile inout uint64_t, uint64_t);"
+            " int64_t atomicMin(coherent volatile inout  int64_t,  int64_t);"
+            "uint64_t atomicMin(coherent volatile inout uint64_t, uint64_t, int, int, int);"
+            " int64_t atomicMin(coherent volatile inout  int64_t,  int64_t, int, int, int);"
+
+            "uint64_t atomicMax(coherent volatile inout uint64_t, uint64_t);"
+            " int64_t atomicMax(coherent volatile inout  int64_t,  int64_t);"
+            "uint64_t atomicMax(coherent volatile inout uint64_t, uint64_t, int, int, int);"
+            " int64_t atomicMax(coherent volatile inout  int64_t,  int64_t, int, int, int);"
+
+            "uint64_t atomicAnd(coherent volatile inout uint64_t, uint64_t);"
+            " int64_t atomicAnd(coherent volatile inout  int64_t,  int64_t);"
+            "uint64_t atomicAnd(coherent volatile inout uint64_t, uint64_t, int, int, int);"
+            " int64_t atomicAnd(coherent volatile inout  int64_t,  int64_t, int, int, int);"
+
+            "uint64_t atomicOr (coherent volatile inout uint64_t, uint64_t);"
+            " int64_t atomicOr (coherent volatile inout  int64_t,  int64_t);"
+            "uint64_t atomicOr (coherent volatile inout uint64_t, uint64_t, int, int, int);"
+            " int64_t atomicOr (coherent volatile inout  int64_t,  int64_t, int, int, int);"
+
+            "uint64_t atomicXor(coherent volatile inout uint64_t, uint64_t);"
+            " int64_t atomicXor(coherent volatile inout  int64_t,  int64_t);"
+            "uint64_t atomicXor(coherent volatile inout uint64_t, uint64_t, int, int, int);"
+            " int64_t atomicXor(coherent volatile inout  int64_t,  int64_t, int, int, int);"
+
+            "uint64_t atomicAdd(coherent volatile inout uint64_t, uint64_t);"
+            " int64_t atomicAdd(coherent volatile inout  int64_t,  int64_t);"
+            "uint64_t atomicAdd(coherent volatile inout uint64_t, uint64_t, int, int, int);"
+            " int64_t atomicAdd(coherent volatile inout  int64_t,  int64_t, int, int, int);"
+
+            "uint64_t atomicExchange(coherent volatile inout uint64_t, uint64_t);"
+            " int64_t atomicExchange(coherent volatile inout  int64_t,  int64_t);"
+            "uint64_t atomicExchange(coherent volatile inout uint64_t, uint64_t, int, int, int);"
+            " int64_t atomicExchange(coherent volatile inout  int64_t,  int64_t, int, int, int);"
+
+            "uint64_t atomicCompSwap(coherent volatile inout uint64_t, uint64_t, uint64_t);"
+            " int64_t atomicCompSwap(coherent volatile inout  int64_t,  int64_t,  int64_t);"
+            "uint64_t atomicCompSwap(coherent volatile inout uint64_t, uint64_t, uint64_t, int, int, int, int, int);"
+            " int64_t atomicCompSwap(coherent volatile inout  int64_t,  int64_t,  int64_t, int, int, int, int, int);"
+
+            "uint64_t atomicLoad(coherent volatile in uint64_t, int, int, int);"
+            " int64_t atomicLoad(coherent volatile in  int64_t, int, int, int);"
+
+            "void atomicStore(coherent volatile out uint64_t, uint64_t, int, int, int);"
+            "void atomicStore(coherent volatile out  int64_t,  int64_t, int, int, int);"
             "\n");
     }
 
@@ -1326,15 +1585,33 @@
 
     if (profile == EEsProfile) {
         if (spvVersion.spv == 0) {
+            if (version < 300) {
+                commonBuiltins.append(
+                    "vec4 texture2D(samplerExternalOES, vec2 coord);" // GL_OES_EGL_image_external
+                    "vec4 texture2DProj(samplerExternalOES, vec3);"   // GL_OES_EGL_image_external
+                    "vec4 texture2DProj(samplerExternalOES, vec4);"   // GL_OES_EGL_image_external
+                "\n");
+            } else {
+                commonBuiltins.append(
+                    "highp ivec2 textureSize(samplerExternalOES, int lod);"   // GL_OES_EGL_image_external_essl3
+                    "vec4 texture(samplerExternalOES, vec2);"                 // GL_OES_EGL_image_external_essl3
+                    "vec4 texture(samplerExternalOES, vec2, float bias);"     // GL_OES_EGL_image_external_essl3
+                    "vec4 textureProj(samplerExternalOES, vec3);"             // GL_OES_EGL_image_external_essl3
+                    "vec4 textureProj(samplerExternalOES, vec3, float bias);" // GL_OES_EGL_image_external_essl3
+                    "vec4 textureProj(samplerExternalOES, vec4);"             // GL_OES_EGL_image_external_essl3
+                    "vec4 textureProj(samplerExternalOES, vec4, float bias);" // GL_OES_EGL_image_external_essl3
+                    "vec4 texelFetch(samplerExternalOES, ivec2, int lod);"    // GL_OES_EGL_image_external_essl3
+                "\n");
+            }
             commonBuiltins.append(
-                "vec4 texture2D(samplerExternalOES, vec2 coord);"  // GL_OES_EGL_image_external, caught by keyword check
-                "vec4 texture2DProj(samplerExternalOES, vec3);"    // GL_OES_EGL_image_external, caught by keyword check
-                "vec4 texture2DProj(samplerExternalOES, vec4);"    // GL_OES_EGL_image_external, caught by keyword check
                 "vec4 texture2DGradEXT(sampler2D, vec2, vec2, vec2);"      // GL_EXT_shader_texture_lod
                 "vec4 texture2DProjGradEXT(sampler2D, vec3, vec2, vec2);"  // GL_EXT_shader_texture_lod
                 "vec4 texture2DProjGradEXT(sampler2D, vec4, vec2, vec2);"  // GL_EXT_shader_texture_lod
                 "vec4 textureCubeGradEXT(samplerCube, vec3, vec3, vec3);"  // GL_EXT_shader_texture_lod
 
+                "float shadow2DEXT(sampler2DShadow, vec3);"     // GL_EXT_shadow_samplers
+                "float shadow2DProjEXT(sampler2DShadow, vec4);" // GL_EXT_shadow_samplers
+
                 "\n");
         }
     }
@@ -1342,7 +1619,7 @@
     //
     // Noise functions.
     //
-    if (profile != EEsProfile) {
+    if (spvVersion.spv == 0 && profile != EEsProfile) {
         commonBuiltins.append(
             "float noise1(float x);"
             "float noise1(vec2  x);"
@@ -1374,9 +1651,23 @@
         if ((profile != EEsProfile && version >= 300) ||
             (profile == EEsProfile && version >= 310)) {
             commonBuiltins.append(
-                "uint atomicCounterIncrement(atomic_uint x);"
-                "uint atomicCounterDecrement(atomic_uint x);"
-                "uint atomicCounter(atomic_uint x);"
+                "uint atomicCounterIncrement(atomic_uint);"
+                "uint atomicCounterDecrement(atomic_uint);"
+                "uint atomicCounter(atomic_uint);"
+
+                "\n");
+        }
+        if (profile != EEsProfile && version >= 460) {
+            commonBuiltins.append(
+                "uint atomicCounterAdd(atomic_uint, uint);"
+                "uint atomicCounterSubtract(atomic_uint, uint);"
+                "uint atomicCounterMin(atomic_uint, uint);"
+                "uint atomicCounterMax(atomic_uint, uint);"
+                "uint atomicCounterAnd(atomic_uint, uint);"
+                "uint atomicCounterOr(atomic_uint, uint);"
+                "uint atomicCounterXor(atomic_uint, uint);"
+                "uint atomicCounterExchange(atomic_uint, uint);"
+                "uint atomicCounterCompSwap(atomic_uint, uint, uint);"
 
                 "\n");
         }
@@ -1561,7 +1852,7 @@
             "\n");
     }
 
-        // GL_ARB_shader_group_vote
+    // GL_ARB_shader_group_vote
     if (profile != EEsProfile && version >= 430) {
         commonBuiltins.append(
             "bool anyInvocationARB(bool);"
@@ -1571,6 +1862,1106 @@
             "\n");
     }
 
+    // GL_KHR_shader_subgroup
+    if (spvVersion.vulkan > 0) {
+        commonBuiltins.append(
+            "void subgroupBarrier();"
+            "void subgroupMemoryBarrier();"
+            "void subgroupMemoryBarrierBuffer();"
+            "void subgroupMemoryBarrierImage();"
+            "bool subgroupElect();"
+
+            "bool   subgroupAll(bool);\n"
+            "bool   subgroupAny(bool);\n"
+
+            "bool   subgroupAllEqual(float);\n"
+            "bool   subgroupAllEqual(vec2);\n"
+            "bool   subgroupAllEqual(vec3);\n"
+            "bool   subgroupAllEqual(vec4);\n"
+            "bool   subgroupAllEqual(int);\n"
+            "bool   subgroupAllEqual(ivec2);\n"
+            "bool   subgroupAllEqual(ivec3);\n"
+            "bool   subgroupAllEqual(ivec4);\n"
+            "bool   subgroupAllEqual(uint);\n"
+            "bool   subgroupAllEqual(uvec2);\n"
+            "bool   subgroupAllEqual(uvec3);\n"
+            "bool   subgroupAllEqual(uvec4);\n"
+            "bool   subgroupAllEqual(bool);\n"
+            "bool   subgroupAllEqual(bvec2);\n"
+            "bool   subgroupAllEqual(bvec3);\n"
+            "bool   subgroupAllEqual(bvec4);\n"
+
+            "float  subgroupBroadcast(float, uint);\n"
+            "vec2   subgroupBroadcast(vec2, uint);\n"
+            "vec3   subgroupBroadcast(vec3, uint);\n"
+            "vec4   subgroupBroadcast(vec4, uint);\n"
+            "int    subgroupBroadcast(int, uint);\n"
+            "ivec2  subgroupBroadcast(ivec2, uint);\n"
+            "ivec3  subgroupBroadcast(ivec3, uint);\n"
+            "ivec4  subgroupBroadcast(ivec4, uint);\n"
+            "uint   subgroupBroadcast(uint, uint);\n"
+            "uvec2  subgroupBroadcast(uvec2, uint);\n"
+            "uvec3  subgroupBroadcast(uvec3, uint);\n"
+            "uvec4  subgroupBroadcast(uvec4, uint);\n"
+            "bool   subgroupBroadcast(bool, uint);\n"
+            "bvec2  subgroupBroadcast(bvec2, uint);\n"
+            "bvec3  subgroupBroadcast(bvec3, uint);\n"
+            "bvec4  subgroupBroadcast(bvec4, uint);\n"
+
+            "float  subgroupBroadcastFirst(float);\n"
+            "vec2   subgroupBroadcastFirst(vec2);\n"
+            "vec3   subgroupBroadcastFirst(vec3);\n"
+            "vec4   subgroupBroadcastFirst(vec4);\n"
+            "int    subgroupBroadcastFirst(int);\n"
+            "ivec2  subgroupBroadcastFirst(ivec2);\n"
+            "ivec3  subgroupBroadcastFirst(ivec3);\n"
+            "ivec4  subgroupBroadcastFirst(ivec4);\n"
+            "uint   subgroupBroadcastFirst(uint);\n"
+            "uvec2  subgroupBroadcastFirst(uvec2);\n"
+            "uvec3  subgroupBroadcastFirst(uvec3);\n"
+            "uvec4  subgroupBroadcastFirst(uvec4);\n"
+            "bool   subgroupBroadcastFirst(bool);\n"
+            "bvec2  subgroupBroadcastFirst(bvec2);\n"
+            "bvec3  subgroupBroadcastFirst(bvec3);\n"
+            "bvec4  subgroupBroadcastFirst(bvec4);\n"
+
+            "uvec4  subgroupBallot(bool);\n"
+            "bool   subgroupInverseBallot(uvec4);\n"
+            "bool   subgroupBallotBitExtract(uvec4, uint);\n"
+            "uint   subgroupBallotBitCount(uvec4);\n"
+            "uint   subgroupBallotInclusiveBitCount(uvec4);\n"
+            "uint   subgroupBallotExclusiveBitCount(uvec4);\n"
+            "uint   subgroupBallotFindLSB(uvec4);\n"
+            "uint   subgroupBallotFindMSB(uvec4);\n"
+
+            "float  subgroupShuffle(float, uint);\n"
+            "vec2   subgroupShuffle(vec2, uint);\n"
+            "vec3   subgroupShuffle(vec3, uint);\n"
+            "vec4   subgroupShuffle(vec4, uint);\n"
+            "int    subgroupShuffle(int, uint);\n"
+            "ivec2  subgroupShuffle(ivec2, uint);\n"
+            "ivec3  subgroupShuffle(ivec3, uint);\n"
+            "ivec4  subgroupShuffle(ivec4, uint);\n"
+            "uint   subgroupShuffle(uint, uint);\n"
+            "uvec2  subgroupShuffle(uvec2, uint);\n"
+            "uvec3  subgroupShuffle(uvec3, uint);\n"
+            "uvec4  subgroupShuffle(uvec4, uint);\n"
+            "bool   subgroupShuffle(bool, uint);\n"
+            "bvec2  subgroupShuffle(bvec2, uint);\n"
+            "bvec3  subgroupShuffle(bvec3, uint);\n"
+            "bvec4  subgroupShuffle(bvec4, uint);\n"
+
+            "float  subgroupShuffleXor(float, uint);\n"
+            "vec2   subgroupShuffleXor(vec2, uint);\n"
+            "vec3   subgroupShuffleXor(vec3, uint);\n"
+            "vec4   subgroupShuffleXor(vec4, uint);\n"
+            "int    subgroupShuffleXor(int, uint);\n"
+            "ivec2  subgroupShuffleXor(ivec2, uint);\n"
+            "ivec3  subgroupShuffleXor(ivec3, uint);\n"
+            "ivec4  subgroupShuffleXor(ivec4, uint);\n"
+            "uint   subgroupShuffleXor(uint, uint);\n"
+            "uvec2  subgroupShuffleXor(uvec2, uint);\n"
+            "uvec3  subgroupShuffleXor(uvec3, uint);\n"
+            "uvec4  subgroupShuffleXor(uvec4, uint);\n"
+            "bool   subgroupShuffleXor(bool, uint);\n"
+            "bvec2  subgroupShuffleXor(bvec2, uint);\n"
+            "bvec3  subgroupShuffleXor(bvec3, uint);\n"
+            "bvec4  subgroupShuffleXor(bvec4, uint);\n"
+
+            "float  subgroupShuffleUp(float, uint delta);\n"
+            "vec2   subgroupShuffleUp(vec2, uint delta);\n"
+            "vec3   subgroupShuffleUp(vec3, uint delta);\n"
+            "vec4   subgroupShuffleUp(vec4, uint delta);\n"
+            "int    subgroupShuffleUp(int, uint delta);\n"
+            "ivec2  subgroupShuffleUp(ivec2, uint delta);\n"
+            "ivec3  subgroupShuffleUp(ivec3, uint delta);\n"
+            "ivec4  subgroupShuffleUp(ivec4, uint delta);\n"
+            "uint   subgroupShuffleUp(uint, uint delta);\n"
+            "uvec2  subgroupShuffleUp(uvec2, uint delta);\n"
+            "uvec3  subgroupShuffleUp(uvec3, uint delta);\n"
+            "uvec4  subgroupShuffleUp(uvec4, uint delta);\n"
+            "bool   subgroupShuffleUp(bool, uint delta);\n"
+            "bvec2  subgroupShuffleUp(bvec2, uint delta);\n"
+            "bvec3  subgroupShuffleUp(bvec3, uint delta);\n"
+            "bvec4  subgroupShuffleUp(bvec4, uint delta);\n"
+
+            "float  subgroupShuffleDown(float, uint delta);\n"
+            "vec2   subgroupShuffleDown(vec2, uint delta);\n"
+            "vec3   subgroupShuffleDown(vec3, uint delta);\n"
+            "vec4   subgroupShuffleDown(vec4, uint delta);\n"
+            "int    subgroupShuffleDown(int, uint delta);\n"
+            "ivec2  subgroupShuffleDown(ivec2, uint delta);\n"
+            "ivec3  subgroupShuffleDown(ivec3, uint delta);\n"
+            "ivec4  subgroupShuffleDown(ivec4, uint delta);\n"
+            "uint   subgroupShuffleDown(uint, uint delta);\n"
+            "uvec2  subgroupShuffleDown(uvec2, uint delta);\n"
+            "uvec3  subgroupShuffleDown(uvec3, uint delta);\n"
+            "uvec4  subgroupShuffleDown(uvec4, uint delta);\n"
+            "bool   subgroupShuffleDown(bool, uint delta);\n"
+            "bvec2  subgroupShuffleDown(bvec2, uint delta);\n"
+            "bvec3  subgroupShuffleDown(bvec3, uint delta);\n"
+            "bvec4  subgroupShuffleDown(bvec4, uint delta);\n"
+
+            "float  subgroupAdd(float);\n"
+            "vec2   subgroupAdd(vec2);\n"
+            "vec3   subgroupAdd(vec3);\n"
+            "vec4   subgroupAdd(vec4);\n"
+            "int    subgroupAdd(int);\n"
+            "ivec2  subgroupAdd(ivec2);\n"
+            "ivec3  subgroupAdd(ivec3);\n"
+            "ivec4  subgroupAdd(ivec4);\n"
+            "uint   subgroupAdd(uint);\n"
+            "uvec2  subgroupAdd(uvec2);\n"
+            "uvec3  subgroupAdd(uvec3);\n"
+            "uvec4  subgroupAdd(uvec4);\n"
+
+            "float  subgroupMul(float);\n"
+            "vec2   subgroupMul(vec2);\n"
+            "vec3   subgroupMul(vec3);\n"
+            "vec4   subgroupMul(vec4);\n"
+            "int    subgroupMul(int);\n"
+            "ivec2  subgroupMul(ivec2);\n"
+            "ivec3  subgroupMul(ivec3);\n"
+            "ivec4  subgroupMul(ivec4);\n"
+            "uint   subgroupMul(uint);\n"
+            "uvec2  subgroupMul(uvec2);\n"
+            "uvec3  subgroupMul(uvec3);\n"
+            "uvec4  subgroupMul(uvec4);\n"
+
+            "float  subgroupMin(float);\n"
+            "vec2   subgroupMin(vec2);\n"
+            "vec3   subgroupMin(vec3);\n"
+            "vec4   subgroupMin(vec4);\n"
+            "int    subgroupMin(int);\n"
+            "ivec2  subgroupMin(ivec2);\n"
+            "ivec3  subgroupMin(ivec3);\n"
+            "ivec4  subgroupMin(ivec4);\n"
+            "uint   subgroupMin(uint);\n"
+            "uvec2  subgroupMin(uvec2);\n"
+            "uvec3  subgroupMin(uvec3);\n"
+            "uvec4  subgroupMin(uvec4);\n"
+
+            "float  subgroupMax(float);\n"
+            "vec2   subgroupMax(vec2);\n"
+            "vec3   subgroupMax(vec3);\n"
+            "vec4   subgroupMax(vec4);\n"
+            "int    subgroupMax(int);\n"
+            "ivec2  subgroupMax(ivec2);\n"
+            "ivec3  subgroupMax(ivec3);\n"
+            "ivec4  subgroupMax(ivec4);\n"
+            "uint   subgroupMax(uint);\n"
+            "uvec2  subgroupMax(uvec2);\n"
+            "uvec3  subgroupMax(uvec3);\n"
+            "uvec4  subgroupMax(uvec4);\n"
+
+            "int    subgroupAnd(int);\n"
+            "ivec2  subgroupAnd(ivec2);\n"
+            "ivec3  subgroupAnd(ivec3);\n"
+            "ivec4  subgroupAnd(ivec4);\n"
+            "uint   subgroupAnd(uint);\n"
+            "uvec2  subgroupAnd(uvec2);\n"
+            "uvec3  subgroupAnd(uvec3);\n"
+            "uvec4  subgroupAnd(uvec4);\n"
+            "bool   subgroupAnd(bool);\n"
+            "bvec2  subgroupAnd(bvec2);\n"
+            "bvec3  subgroupAnd(bvec3);\n"
+            "bvec4  subgroupAnd(bvec4);\n"
+
+            "int    subgroupOr(int);\n"
+            "ivec2  subgroupOr(ivec2);\n"
+            "ivec3  subgroupOr(ivec3);\n"
+            "ivec4  subgroupOr(ivec4);\n"
+            "uint   subgroupOr(uint);\n"
+            "uvec2  subgroupOr(uvec2);\n"
+            "uvec3  subgroupOr(uvec3);\n"
+            "uvec4  subgroupOr(uvec4);\n"
+            "bool   subgroupOr(bool);\n"
+            "bvec2  subgroupOr(bvec2);\n"
+            "bvec3  subgroupOr(bvec3);\n"
+            "bvec4  subgroupOr(bvec4);\n"
+
+            "int    subgroupXor(int);\n"
+            "ivec2  subgroupXor(ivec2);\n"
+            "ivec3  subgroupXor(ivec3);\n"
+            "ivec4  subgroupXor(ivec4);\n"
+            "uint   subgroupXor(uint);\n"
+            "uvec2  subgroupXor(uvec2);\n"
+            "uvec3  subgroupXor(uvec3);\n"
+            "uvec4  subgroupXor(uvec4);\n"
+            "bool   subgroupXor(bool);\n"
+            "bvec2  subgroupXor(bvec2);\n"
+            "bvec3  subgroupXor(bvec3);\n"
+            "bvec4  subgroupXor(bvec4);\n"
+
+            "float  subgroupInclusiveAdd(float);\n"
+            "vec2   subgroupInclusiveAdd(vec2);\n"
+            "vec3   subgroupInclusiveAdd(vec3);\n"
+            "vec4   subgroupInclusiveAdd(vec4);\n"
+            "int    subgroupInclusiveAdd(int);\n"
+            "ivec2  subgroupInclusiveAdd(ivec2);\n"
+            "ivec3  subgroupInclusiveAdd(ivec3);\n"
+            "ivec4  subgroupInclusiveAdd(ivec4);\n"
+            "uint   subgroupInclusiveAdd(uint);\n"
+            "uvec2  subgroupInclusiveAdd(uvec2);\n"
+            "uvec3  subgroupInclusiveAdd(uvec3);\n"
+            "uvec4  subgroupInclusiveAdd(uvec4);\n"
+
+            "float  subgroupInclusiveMul(float);\n"
+            "vec2   subgroupInclusiveMul(vec2);\n"
+            "vec3   subgroupInclusiveMul(vec3);\n"
+            "vec4   subgroupInclusiveMul(vec4);\n"
+            "int    subgroupInclusiveMul(int);\n"
+            "ivec2  subgroupInclusiveMul(ivec2);\n"
+            "ivec3  subgroupInclusiveMul(ivec3);\n"
+            "ivec4  subgroupInclusiveMul(ivec4);\n"
+            "uint   subgroupInclusiveMul(uint);\n"
+            "uvec2  subgroupInclusiveMul(uvec2);\n"
+            "uvec3  subgroupInclusiveMul(uvec3);\n"
+            "uvec4  subgroupInclusiveMul(uvec4);\n"
+
+            "float  subgroupInclusiveMin(float);\n"
+            "vec2   subgroupInclusiveMin(vec2);\n"
+            "vec3   subgroupInclusiveMin(vec3);\n"
+            "vec4   subgroupInclusiveMin(vec4);\n"
+            "int    subgroupInclusiveMin(int);\n"
+            "ivec2  subgroupInclusiveMin(ivec2);\n"
+            "ivec3  subgroupInclusiveMin(ivec3);\n"
+            "ivec4  subgroupInclusiveMin(ivec4);\n"
+            "uint   subgroupInclusiveMin(uint);\n"
+            "uvec2  subgroupInclusiveMin(uvec2);\n"
+            "uvec3  subgroupInclusiveMin(uvec3);\n"
+            "uvec4  subgroupInclusiveMin(uvec4);\n"
+
+            "float  subgroupInclusiveMax(float);\n"
+            "vec2   subgroupInclusiveMax(vec2);\n"
+            "vec3   subgroupInclusiveMax(vec3);\n"
+            "vec4   subgroupInclusiveMax(vec4);\n"
+            "int    subgroupInclusiveMax(int);\n"
+            "ivec2  subgroupInclusiveMax(ivec2);\n"
+            "ivec3  subgroupInclusiveMax(ivec3);\n"
+            "ivec4  subgroupInclusiveMax(ivec4);\n"
+            "uint   subgroupInclusiveMax(uint);\n"
+            "uvec2  subgroupInclusiveMax(uvec2);\n"
+            "uvec3  subgroupInclusiveMax(uvec3);\n"
+            "uvec4  subgroupInclusiveMax(uvec4);\n"
+
+            "int    subgroupInclusiveAnd(int);\n"
+            "ivec2  subgroupInclusiveAnd(ivec2);\n"
+            "ivec3  subgroupInclusiveAnd(ivec3);\n"
+            "ivec4  subgroupInclusiveAnd(ivec4);\n"
+            "uint   subgroupInclusiveAnd(uint);\n"
+            "uvec2  subgroupInclusiveAnd(uvec2);\n"
+            "uvec3  subgroupInclusiveAnd(uvec3);\n"
+            "uvec4  subgroupInclusiveAnd(uvec4);\n"
+            "bool   subgroupInclusiveAnd(bool);\n"
+            "bvec2  subgroupInclusiveAnd(bvec2);\n"
+            "bvec3  subgroupInclusiveAnd(bvec3);\n"
+            "bvec4  subgroupInclusiveAnd(bvec4);\n"
+
+            "int    subgroupInclusiveOr(int);\n"
+            "ivec2  subgroupInclusiveOr(ivec2);\n"
+            "ivec3  subgroupInclusiveOr(ivec3);\n"
+            "ivec4  subgroupInclusiveOr(ivec4);\n"
+            "uint   subgroupInclusiveOr(uint);\n"
+            "uvec2  subgroupInclusiveOr(uvec2);\n"
+            "uvec3  subgroupInclusiveOr(uvec3);\n"
+            "uvec4  subgroupInclusiveOr(uvec4);\n"
+            "bool   subgroupInclusiveOr(bool);\n"
+            "bvec2  subgroupInclusiveOr(bvec2);\n"
+            "bvec3  subgroupInclusiveOr(bvec3);\n"
+            "bvec4  subgroupInclusiveOr(bvec4);\n"
+
+            "int    subgroupInclusiveXor(int);\n"
+            "ivec2  subgroupInclusiveXor(ivec2);\n"
+            "ivec3  subgroupInclusiveXor(ivec3);\n"
+            "ivec4  subgroupInclusiveXor(ivec4);\n"
+            "uint   subgroupInclusiveXor(uint);\n"
+            "uvec2  subgroupInclusiveXor(uvec2);\n"
+            "uvec3  subgroupInclusiveXor(uvec3);\n"
+            "uvec4  subgroupInclusiveXor(uvec4);\n"
+            "bool   subgroupInclusiveXor(bool);\n"
+            "bvec2  subgroupInclusiveXor(bvec2);\n"
+            "bvec3  subgroupInclusiveXor(bvec3);\n"
+            "bvec4  subgroupInclusiveXor(bvec4);\n"
+
+            "float  subgroupExclusiveAdd(float);\n"
+            "vec2   subgroupExclusiveAdd(vec2);\n"
+            "vec3   subgroupExclusiveAdd(vec3);\n"
+            "vec4   subgroupExclusiveAdd(vec4);\n"
+            "int    subgroupExclusiveAdd(int);\n"
+            "ivec2  subgroupExclusiveAdd(ivec2);\n"
+            "ivec3  subgroupExclusiveAdd(ivec3);\n"
+            "ivec4  subgroupExclusiveAdd(ivec4);\n"
+            "uint   subgroupExclusiveAdd(uint);\n"
+            "uvec2  subgroupExclusiveAdd(uvec2);\n"
+            "uvec3  subgroupExclusiveAdd(uvec3);\n"
+            "uvec4  subgroupExclusiveAdd(uvec4);\n"
+
+            "float  subgroupExclusiveMul(float);\n"
+            "vec2   subgroupExclusiveMul(vec2);\n"
+            "vec3   subgroupExclusiveMul(vec3);\n"
+            "vec4   subgroupExclusiveMul(vec4);\n"
+            "int    subgroupExclusiveMul(int);\n"
+            "ivec2  subgroupExclusiveMul(ivec2);\n"
+            "ivec3  subgroupExclusiveMul(ivec3);\n"
+            "ivec4  subgroupExclusiveMul(ivec4);\n"
+            "uint   subgroupExclusiveMul(uint);\n"
+            "uvec2  subgroupExclusiveMul(uvec2);\n"
+            "uvec3  subgroupExclusiveMul(uvec3);\n"
+            "uvec4  subgroupExclusiveMul(uvec4);\n"
+
+            "float  subgroupExclusiveMin(float);\n"
+            "vec2   subgroupExclusiveMin(vec2);\n"
+            "vec3   subgroupExclusiveMin(vec3);\n"
+            "vec4   subgroupExclusiveMin(vec4);\n"
+            "int    subgroupExclusiveMin(int);\n"
+            "ivec2  subgroupExclusiveMin(ivec2);\n"
+            "ivec3  subgroupExclusiveMin(ivec3);\n"
+            "ivec4  subgroupExclusiveMin(ivec4);\n"
+            "uint   subgroupExclusiveMin(uint);\n"
+            "uvec2  subgroupExclusiveMin(uvec2);\n"
+            "uvec3  subgroupExclusiveMin(uvec3);\n"
+            "uvec4  subgroupExclusiveMin(uvec4);\n"
+
+            "float  subgroupExclusiveMax(float);\n"
+            "vec2   subgroupExclusiveMax(vec2);\n"
+            "vec3   subgroupExclusiveMax(vec3);\n"
+            "vec4   subgroupExclusiveMax(vec4);\n"
+            "int    subgroupExclusiveMax(int);\n"
+            "ivec2  subgroupExclusiveMax(ivec2);\n"
+            "ivec3  subgroupExclusiveMax(ivec3);\n"
+            "ivec4  subgroupExclusiveMax(ivec4);\n"
+            "uint   subgroupExclusiveMax(uint);\n"
+            "uvec2  subgroupExclusiveMax(uvec2);\n"
+            "uvec3  subgroupExclusiveMax(uvec3);\n"
+            "uvec4  subgroupExclusiveMax(uvec4);\n"
+
+            "int    subgroupExclusiveAnd(int);\n"
+            "ivec2  subgroupExclusiveAnd(ivec2);\n"
+            "ivec3  subgroupExclusiveAnd(ivec3);\n"
+            "ivec4  subgroupExclusiveAnd(ivec4);\n"
+            "uint   subgroupExclusiveAnd(uint);\n"
+            "uvec2  subgroupExclusiveAnd(uvec2);\n"
+            "uvec3  subgroupExclusiveAnd(uvec3);\n"
+            "uvec4  subgroupExclusiveAnd(uvec4);\n"
+            "bool   subgroupExclusiveAnd(bool);\n"
+            "bvec2  subgroupExclusiveAnd(bvec2);\n"
+            "bvec3  subgroupExclusiveAnd(bvec3);\n"
+            "bvec4  subgroupExclusiveAnd(bvec4);\n"
+
+            "int    subgroupExclusiveOr(int);\n"
+            "ivec2  subgroupExclusiveOr(ivec2);\n"
+            "ivec3  subgroupExclusiveOr(ivec3);\n"
+            "ivec4  subgroupExclusiveOr(ivec4);\n"
+            "uint   subgroupExclusiveOr(uint);\n"
+            "uvec2  subgroupExclusiveOr(uvec2);\n"
+            "uvec3  subgroupExclusiveOr(uvec3);\n"
+            "uvec4  subgroupExclusiveOr(uvec4);\n"
+            "bool   subgroupExclusiveOr(bool);\n"
+            "bvec2  subgroupExclusiveOr(bvec2);\n"
+            "bvec3  subgroupExclusiveOr(bvec3);\n"
+            "bvec4  subgroupExclusiveOr(bvec4);\n"
+
+            "int    subgroupExclusiveXor(int);\n"
+            "ivec2  subgroupExclusiveXor(ivec2);\n"
+            "ivec3  subgroupExclusiveXor(ivec3);\n"
+            "ivec4  subgroupExclusiveXor(ivec4);\n"
+            "uint   subgroupExclusiveXor(uint);\n"
+            "uvec2  subgroupExclusiveXor(uvec2);\n"
+            "uvec3  subgroupExclusiveXor(uvec3);\n"
+            "uvec4  subgroupExclusiveXor(uvec4);\n"
+            "bool   subgroupExclusiveXor(bool);\n"
+            "bvec2  subgroupExclusiveXor(bvec2);\n"
+            "bvec3  subgroupExclusiveXor(bvec3);\n"
+            "bvec4  subgroupExclusiveXor(bvec4);\n"
+
+            "float  subgroupClusteredAdd(float, uint);\n"
+            "vec2   subgroupClusteredAdd(vec2, uint);\n"
+            "vec3   subgroupClusteredAdd(vec3, uint);\n"
+            "vec4   subgroupClusteredAdd(vec4, uint);\n"
+            "int    subgroupClusteredAdd(int, uint);\n"
+            "ivec2  subgroupClusteredAdd(ivec2, uint);\n"
+            "ivec3  subgroupClusteredAdd(ivec3, uint);\n"
+            "ivec4  subgroupClusteredAdd(ivec4, uint);\n"
+            "uint   subgroupClusteredAdd(uint, uint);\n"
+            "uvec2  subgroupClusteredAdd(uvec2, uint);\n"
+            "uvec3  subgroupClusteredAdd(uvec3, uint);\n"
+            "uvec4  subgroupClusteredAdd(uvec4, uint);\n"
+
+            "float  subgroupClusteredMul(float, uint);\n"
+            "vec2   subgroupClusteredMul(vec2, uint);\n"
+            "vec3   subgroupClusteredMul(vec3, uint);\n"
+            "vec4   subgroupClusteredMul(vec4, uint);\n"
+            "int    subgroupClusteredMul(int, uint);\n"
+            "ivec2  subgroupClusteredMul(ivec2, uint);\n"
+            "ivec3  subgroupClusteredMul(ivec3, uint);\n"
+            "ivec4  subgroupClusteredMul(ivec4, uint);\n"
+            "uint   subgroupClusteredMul(uint, uint);\n"
+            "uvec2  subgroupClusteredMul(uvec2, uint);\n"
+            "uvec3  subgroupClusteredMul(uvec3, uint);\n"
+            "uvec4  subgroupClusteredMul(uvec4, uint);\n"
+
+            "float  subgroupClusteredMin(float, uint);\n"
+            "vec2   subgroupClusteredMin(vec2, uint);\n"
+            "vec3   subgroupClusteredMin(vec3, uint);\n"
+            "vec4   subgroupClusteredMin(vec4, uint);\n"
+            "int    subgroupClusteredMin(int, uint);\n"
+            "ivec2  subgroupClusteredMin(ivec2, uint);\n"
+            "ivec3  subgroupClusteredMin(ivec3, uint);\n"
+            "ivec4  subgroupClusteredMin(ivec4, uint);\n"
+            "uint   subgroupClusteredMin(uint, uint);\n"
+            "uvec2  subgroupClusteredMin(uvec2, uint);\n"
+            "uvec3  subgroupClusteredMin(uvec3, uint);\n"
+            "uvec4  subgroupClusteredMin(uvec4, uint);\n"
+
+            "float  subgroupClusteredMax(float, uint);\n"
+            "vec2   subgroupClusteredMax(vec2, uint);\n"
+            "vec3   subgroupClusteredMax(vec3, uint);\n"
+            "vec4   subgroupClusteredMax(vec4, uint);\n"
+            "int    subgroupClusteredMax(int, uint);\n"
+            "ivec2  subgroupClusteredMax(ivec2, uint);\n"
+            "ivec3  subgroupClusteredMax(ivec3, uint);\n"
+            "ivec4  subgroupClusteredMax(ivec4, uint);\n"
+            "uint   subgroupClusteredMax(uint, uint);\n"
+            "uvec2  subgroupClusteredMax(uvec2, uint);\n"
+            "uvec3  subgroupClusteredMax(uvec3, uint);\n"
+            "uvec4  subgroupClusteredMax(uvec4, uint);\n"
+
+            "int    subgroupClusteredAnd(int, uint);\n"
+            "ivec2  subgroupClusteredAnd(ivec2, uint);\n"
+            "ivec3  subgroupClusteredAnd(ivec3, uint);\n"
+            "ivec4  subgroupClusteredAnd(ivec4, uint);\n"
+            "uint   subgroupClusteredAnd(uint, uint);\n"
+            "uvec2  subgroupClusteredAnd(uvec2, uint);\n"
+            "uvec3  subgroupClusteredAnd(uvec3, uint);\n"
+            "uvec4  subgroupClusteredAnd(uvec4, uint);\n"
+            "bool   subgroupClusteredAnd(bool, uint);\n"
+            "bvec2  subgroupClusteredAnd(bvec2, uint);\n"
+            "bvec3  subgroupClusteredAnd(bvec3, uint);\n"
+            "bvec4  subgroupClusteredAnd(bvec4, uint);\n"
+
+            "int    subgroupClusteredOr(int, uint);\n"
+            "ivec2  subgroupClusteredOr(ivec2, uint);\n"
+            "ivec3  subgroupClusteredOr(ivec3, uint);\n"
+            "ivec4  subgroupClusteredOr(ivec4, uint);\n"
+            "uint   subgroupClusteredOr(uint, uint);\n"
+            "uvec2  subgroupClusteredOr(uvec2, uint);\n"
+            "uvec3  subgroupClusteredOr(uvec3, uint);\n"
+            "uvec4  subgroupClusteredOr(uvec4, uint);\n"
+            "bool   subgroupClusteredOr(bool, uint);\n"
+            "bvec2  subgroupClusteredOr(bvec2, uint);\n"
+            "bvec3  subgroupClusteredOr(bvec3, uint);\n"
+            "bvec4  subgroupClusteredOr(bvec4, uint);\n"
+
+            "int    subgroupClusteredXor(int, uint);\n"
+            "ivec2  subgroupClusteredXor(ivec2, uint);\n"
+            "ivec3  subgroupClusteredXor(ivec3, uint);\n"
+            "ivec4  subgroupClusteredXor(ivec4, uint);\n"
+            "uint   subgroupClusteredXor(uint, uint);\n"
+            "uvec2  subgroupClusteredXor(uvec2, uint);\n"
+            "uvec3  subgroupClusteredXor(uvec3, uint);\n"
+            "uvec4  subgroupClusteredXor(uvec4, uint);\n"
+            "bool   subgroupClusteredXor(bool, uint);\n"
+            "bvec2  subgroupClusteredXor(bvec2, uint);\n"
+            "bvec3  subgroupClusteredXor(bvec3, uint);\n"
+            "bvec4  subgroupClusteredXor(bvec4, uint);\n"
+
+            "float  subgroupQuadBroadcast(float, uint);\n"
+            "vec2   subgroupQuadBroadcast(vec2, uint);\n"
+            "vec3   subgroupQuadBroadcast(vec3, uint);\n"
+            "vec4   subgroupQuadBroadcast(vec4, uint);\n"
+            "int    subgroupQuadBroadcast(int, uint);\n"
+            "ivec2  subgroupQuadBroadcast(ivec2, uint);\n"
+            "ivec3  subgroupQuadBroadcast(ivec3, uint);\n"
+            "ivec4  subgroupQuadBroadcast(ivec4, uint);\n"
+            "uint   subgroupQuadBroadcast(uint, uint);\n"
+            "uvec2  subgroupQuadBroadcast(uvec2, uint);\n"
+            "uvec3  subgroupQuadBroadcast(uvec3, uint);\n"
+            "uvec4  subgroupQuadBroadcast(uvec4, uint);\n"
+            "bool   subgroupQuadBroadcast(bool, uint);\n"
+            "bvec2  subgroupQuadBroadcast(bvec2, uint);\n"
+            "bvec3  subgroupQuadBroadcast(bvec3, uint);\n"
+            "bvec4  subgroupQuadBroadcast(bvec4, uint);\n"
+
+            "float  subgroupQuadSwapHorizontal(float);\n"
+            "vec2   subgroupQuadSwapHorizontal(vec2);\n"
+            "vec3   subgroupQuadSwapHorizontal(vec3);\n"
+            "vec4   subgroupQuadSwapHorizontal(vec4);\n"
+            "int    subgroupQuadSwapHorizontal(int);\n"
+            "ivec2  subgroupQuadSwapHorizontal(ivec2);\n"
+            "ivec3  subgroupQuadSwapHorizontal(ivec3);\n"
+            "ivec4  subgroupQuadSwapHorizontal(ivec4);\n"
+            "uint   subgroupQuadSwapHorizontal(uint);\n"
+            "uvec2  subgroupQuadSwapHorizontal(uvec2);\n"
+            "uvec3  subgroupQuadSwapHorizontal(uvec3);\n"
+            "uvec4  subgroupQuadSwapHorizontal(uvec4);\n"
+            "bool   subgroupQuadSwapHorizontal(bool);\n"
+            "bvec2  subgroupQuadSwapHorizontal(bvec2);\n"
+            "bvec3  subgroupQuadSwapHorizontal(bvec3);\n"
+            "bvec4  subgroupQuadSwapHorizontal(bvec4);\n"
+
+            "float  subgroupQuadSwapVertical(float);\n"
+            "vec2   subgroupQuadSwapVertical(vec2);\n"
+            "vec3   subgroupQuadSwapVertical(vec3);\n"
+            "vec4   subgroupQuadSwapVertical(vec4);\n"
+            "int    subgroupQuadSwapVertical(int);\n"
+            "ivec2  subgroupQuadSwapVertical(ivec2);\n"
+            "ivec3  subgroupQuadSwapVertical(ivec3);\n"
+            "ivec4  subgroupQuadSwapVertical(ivec4);\n"
+            "uint   subgroupQuadSwapVertical(uint);\n"
+            "uvec2  subgroupQuadSwapVertical(uvec2);\n"
+            "uvec3  subgroupQuadSwapVertical(uvec3);\n"
+            "uvec4  subgroupQuadSwapVertical(uvec4);\n"
+            "bool   subgroupQuadSwapVertical(bool);\n"
+            "bvec2  subgroupQuadSwapVertical(bvec2);\n"
+            "bvec3  subgroupQuadSwapVertical(bvec3);\n"
+            "bvec4  subgroupQuadSwapVertical(bvec4);\n"
+
+            "float  subgroupQuadSwapDiagonal(float);\n"
+            "vec2   subgroupQuadSwapDiagonal(vec2);\n"
+            "vec3   subgroupQuadSwapDiagonal(vec3);\n"
+            "vec4   subgroupQuadSwapDiagonal(vec4);\n"
+            "int    subgroupQuadSwapDiagonal(int);\n"
+            "ivec2  subgroupQuadSwapDiagonal(ivec2);\n"
+            "ivec3  subgroupQuadSwapDiagonal(ivec3);\n"
+            "ivec4  subgroupQuadSwapDiagonal(ivec4);\n"
+            "uint   subgroupQuadSwapDiagonal(uint);\n"
+            "uvec2  subgroupQuadSwapDiagonal(uvec2);\n"
+            "uvec3  subgroupQuadSwapDiagonal(uvec3);\n"
+            "uvec4  subgroupQuadSwapDiagonal(uvec4);\n"
+            "bool   subgroupQuadSwapDiagonal(bool);\n"
+            "bvec2  subgroupQuadSwapDiagonal(bvec2);\n"
+            "bvec3  subgroupQuadSwapDiagonal(bvec3);\n"
+            "bvec4  subgroupQuadSwapDiagonal(bvec4);\n"
+
+#ifdef NV_EXTENSIONS
+            "uvec4  subgroupPartitionNV(float);\n"
+            "uvec4  subgroupPartitionNV(vec2);\n"
+            "uvec4  subgroupPartitionNV(vec3);\n"
+            "uvec4  subgroupPartitionNV(vec4);\n"
+            "uvec4  subgroupPartitionNV(int);\n"
+            "uvec4  subgroupPartitionNV(ivec2);\n"
+            "uvec4  subgroupPartitionNV(ivec3);\n"
+            "uvec4  subgroupPartitionNV(ivec4);\n"
+            "uvec4  subgroupPartitionNV(uint);\n"
+            "uvec4  subgroupPartitionNV(uvec2);\n"
+            "uvec4  subgroupPartitionNV(uvec3);\n"
+            "uvec4  subgroupPartitionNV(uvec4);\n"
+            "uvec4  subgroupPartitionNV(bool);\n"
+            "uvec4  subgroupPartitionNV(bvec2);\n"
+            "uvec4  subgroupPartitionNV(bvec3);\n"
+            "uvec4  subgroupPartitionNV(bvec4);\n"
+
+            "float  subgroupPartitionedAddNV(float, uvec4 ballot);\n"
+            "vec2   subgroupPartitionedAddNV(vec2, uvec4 ballot);\n"
+            "vec3   subgroupPartitionedAddNV(vec3, uvec4 ballot);\n"
+            "vec4   subgroupPartitionedAddNV(vec4, uvec4 ballot);\n"
+            "int    subgroupPartitionedAddNV(int, uvec4 ballot);\n"
+            "ivec2  subgroupPartitionedAddNV(ivec2, uvec4 ballot);\n"
+            "ivec3  subgroupPartitionedAddNV(ivec3, uvec4 ballot);\n"
+            "ivec4  subgroupPartitionedAddNV(ivec4, uvec4 ballot);\n"
+            "uint   subgroupPartitionedAddNV(uint, uvec4 ballot);\n"
+            "uvec2  subgroupPartitionedAddNV(uvec2, uvec4 ballot);\n"
+            "uvec3  subgroupPartitionedAddNV(uvec3, uvec4 ballot);\n"
+            "uvec4  subgroupPartitionedAddNV(uvec4, uvec4 ballot);\n"
+
+            "float  subgroupPartitionedMulNV(float, uvec4 ballot);\n"
+            "vec2   subgroupPartitionedMulNV(vec2, uvec4 ballot);\n"
+            "vec3   subgroupPartitionedMulNV(vec3, uvec4 ballot);\n"
+            "vec4   subgroupPartitionedMulNV(vec4, uvec4 ballot);\n"
+            "int    subgroupPartitionedMulNV(int, uvec4 ballot);\n"
+            "ivec2  subgroupPartitionedMulNV(ivec2, uvec4 ballot);\n"
+            "ivec3  subgroupPartitionedMulNV(ivec3, uvec4 ballot);\n"
+            "ivec4  subgroupPartitionedMulNV(ivec4, uvec4 ballot);\n"
+            "uint   subgroupPartitionedMulNV(uint, uvec4 ballot);\n"
+            "uvec2  subgroupPartitionedMulNV(uvec2, uvec4 ballot);\n"
+            "uvec3  subgroupPartitionedMulNV(uvec3, uvec4 ballot);\n"
+            "uvec4  subgroupPartitionedMulNV(uvec4, uvec4 ballot);\n"
+
+            "float  subgroupPartitionedMinNV(float, uvec4 ballot);\n"
+            "vec2   subgroupPartitionedMinNV(vec2, uvec4 ballot);\n"
+            "vec3   subgroupPartitionedMinNV(vec3, uvec4 ballot);\n"
+            "vec4   subgroupPartitionedMinNV(vec4, uvec4 ballot);\n"
+            "int    subgroupPartitionedMinNV(int, uvec4 ballot);\n"
+            "ivec2  subgroupPartitionedMinNV(ivec2, uvec4 ballot);\n"
+            "ivec3  subgroupPartitionedMinNV(ivec3, uvec4 ballot);\n"
+            "ivec4  subgroupPartitionedMinNV(ivec4, uvec4 ballot);\n"
+            "uint   subgroupPartitionedMinNV(uint, uvec4 ballot);\n"
+            "uvec2  subgroupPartitionedMinNV(uvec2, uvec4 ballot);\n"
+            "uvec3  subgroupPartitionedMinNV(uvec3, uvec4 ballot);\n"
+            "uvec4  subgroupPartitionedMinNV(uvec4, uvec4 ballot);\n"
+
+            "float  subgroupPartitionedMaxNV(float, uvec4 ballot);\n"
+            "vec2   subgroupPartitionedMaxNV(vec2, uvec4 ballot);\n"
+            "vec3   subgroupPartitionedMaxNV(vec3, uvec4 ballot);\n"
+            "vec4   subgroupPartitionedMaxNV(vec4, uvec4 ballot);\n"
+            "int    subgroupPartitionedMaxNV(int, uvec4 ballot);\n"
+            "ivec2  subgroupPartitionedMaxNV(ivec2, uvec4 ballot);\n"
+            "ivec3  subgroupPartitionedMaxNV(ivec3, uvec4 ballot);\n"
+            "ivec4  subgroupPartitionedMaxNV(ivec4, uvec4 ballot);\n"
+            "uint   subgroupPartitionedMaxNV(uint, uvec4 ballot);\n"
+            "uvec2  subgroupPartitionedMaxNV(uvec2, uvec4 ballot);\n"
+            "uvec3  subgroupPartitionedMaxNV(uvec3, uvec4 ballot);\n"
+            "uvec4  subgroupPartitionedMaxNV(uvec4, uvec4 ballot);\n"
+
+            "int    subgroupPartitionedAndNV(int, uvec4 ballot);\n"
+            "ivec2  subgroupPartitionedAndNV(ivec2, uvec4 ballot);\n"
+            "ivec3  subgroupPartitionedAndNV(ivec3, uvec4 ballot);\n"
+            "ivec4  subgroupPartitionedAndNV(ivec4, uvec4 ballot);\n"
+            "uint   subgroupPartitionedAndNV(uint, uvec4 ballot);\n"
+            "uvec2  subgroupPartitionedAndNV(uvec2, uvec4 ballot);\n"
+            "uvec3  subgroupPartitionedAndNV(uvec3, uvec4 ballot);\n"
+            "uvec4  subgroupPartitionedAndNV(uvec4, uvec4 ballot);\n"
+            "bool   subgroupPartitionedAndNV(bool, uvec4 ballot);\n"
+            "bvec2  subgroupPartitionedAndNV(bvec2, uvec4 ballot);\n"
+            "bvec3  subgroupPartitionedAndNV(bvec3, uvec4 ballot);\n"
+            "bvec4  subgroupPartitionedAndNV(bvec4, uvec4 ballot);\n"
+
+            "int    subgroupPartitionedOrNV(int, uvec4 ballot);\n"
+            "ivec2  subgroupPartitionedOrNV(ivec2, uvec4 ballot);\n"
+            "ivec3  subgroupPartitionedOrNV(ivec3, uvec4 ballot);\n"
+            "ivec4  subgroupPartitionedOrNV(ivec4, uvec4 ballot);\n"
+            "uint   subgroupPartitionedOrNV(uint, uvec4 ballot);\n"
+            "uvec2  subgroupPartitionedOrNV(uvec2, uvec4 ballot);\n"
+            "uvec3  subgroupPartitionedOrNV(uvec3, uvec4 ballot);\n"
+            "uvec4  subgroupPartitionedOrNV(uvec4, uvec4 ballot);\n"
+            "bool   subgroupPartitionedOrNV(bool, uvec4 ballot);\n"
+            "bvec2  subgroupPartitionedOrNV(bvec2, uvec4 ballot);\n"
+            "bvec3  subgroupPartitionedOrNV(bvec3, uvec4 ballot);\n"
+            "bvec4  subgroupPartitionedOrNV(bvec4, uvec4 ballot);\n"
+
+            "int    subgroupPartitionedXorNV(int, uvec4 ballot);\n"
+            "ivec2  subgroupPartitionedXorNV(ivec2, uvec4 ballot);\n"
+            "ivec3  subgroupPartitionedXorNV(ivec3, uvec4 ballot);\n"
+            "ivec4  subgroupPartitionedXorNV(ivec4, uvec4 ballot);\n"
+            "uint   subgroupPartitionedXorNV(uint, uvec4 ballot);\n"
+            "uvec2  subgroupPartitionedXorNV(uvec2, uvec4 ballot);\n"
+            "uvec3  subgroupPartitionedXorNV(uvec3, uvec4 ballot);\n"
+            "uvec4  subgroupPartitionedXorNV(uvec4, uvec4 ballot);\n"
+            "bool   subgroupPartitionedXorNV(bool, uvec4 ballot);\n"
+            "bvec2  subgroupPartitionedXorNV(bvec2, uvec4 ballot);\n"
+            "bvec3  subgroupPartitionedXorNV(bvec3, uvec4 ballot);\n"
+            "bvec4  subgroupPartitionedXorNV(bvec4, uvec4 ballot);\n"
+
+            "float  subgroupPartitionedInclusiveAddNV(float, uvec4 ballot);\n"
+            "vec2   subgroupPartitionedInclusiveAddNV(vec2, uvec4 ballot);\n"
+            "vec3   subgroupPartitionedInclusiveAddNV(vec3, uvec4 ballot);\n"
+            "vec4   subgroupPartitionedInclusiveAddNV(vec4, uvec4 ballot);\n"
+            "int    subgroupPartitionedInclusiveAddNV(int, uvec4 ballot);\n"
+            "ivec2  subgroupPartitionedInclusiveAddNV(ivec2, uvec4 ballot);\n"
+            "ivec3  subgroupPartitionedInclusiveAddNV(ivec3, uvec4 ballot);\n"
+            "ivec4  subgroupPartitionedInclusiveAddNV(ivec4, uvec4 ballot);\n"
+            "uint   subgroupPartitionedInclusiveAddNV(uint, uvec4 ballot);\n"
+            "uvec2  subgroupPartitionedInclusiveAddNV(uvec2, uvec4 ballot);\n"
+            "uvec3  subgroupPartitionedInclusiveAddNV(uvec3, uvec4 ballot);\n"
+            "uvec4  subgroupPartitionedInclusiveAddNV(uvec4, uvec4 ballot);\n"
+
+            "float  subgroupPartitionedInclusiveMulNV(float, uvec4 ballot);\n"
+            "vec2   subgroupPartitionedInclusiveMulNV(vec2, uvec4 ballot);\n"
+            "vec3   subgroupPartitionedInclusiveMulNV(vec3, uvec4 ballot);\n"
+            "vec4   subgroupPartitionedInclusiveMulNV(vec4, uvec4 ballot);\n"
+            "int    subgroupPartitionedInclusiveMulNV(int, uvec4 ballot);\n"
+            "ivec2  subgroupPartitionedInclusiveMulNV(ivec2, uvec4 ballot);\n"
+            "ivec3  subgroupPartitionedInclusiveMulNV(ivec3, uvec4 ballot);\n"
+            "ivec4  subgroupPartitionedInclusiveMulNV(ivec4, uvec4 ballot);\n"
+            "uint   subgroupPartitionedInclusiveMulNV(uint, uvec4 ballot);\n"
+            "uvec2  subgroupPartitionedInclusiveMulNV(uvec2, uvec4 ballot);\n"
+            "uvec3  subgroupPartitionedInclusiveMulNV(uvec3, uvec4 ballot);\n"
+            "uvec4  subgroupPartitionedInclusiveMulNV(uvec4, uvec4 ballot);\n"
+
+            "float  subgroupPartitionedInclusiveMinNV(float, uvec4 ballot);\n"
+            "vec2   subgroupPartitionedInclusiveMinNV(vec2, uvec4 ballot);\n"
+            "vec3   subgroupPartitionedInclusiveMinNV(vec3, uvec4 ballot);\n"
+            "vec4   subgroupPartitionedInclusiveMinNV(vec4, uvec4 ballot);\n"
+            "int    subgroupPartitionedInclusiveMinNV(int, uvec4 ballot);\n"
+            "ivec2  subgroupPartitionedInclusiveMinNV(ivec2, uvec4 ballot);\n"
+            "ivec3  subgroupPartitionedInclusiveMinNV(ivec3, uvec4 ballot);\n"
+            "ivec4  subgroupPartitionedInclusiveMinNV(ivec4, uvec4 ballot);\n"
+            "uint   subgroupPartitionedInclusiveMinNV(uint, uvec4 ballot);\n"
+            "uvec2  subgroupPartitionedInclusiveMinNV(uvec2, uvec4 ballot);\n"
+            "uvec3  subgroupPartitionedInclusiveMinNV(uvec3, uvec4 ballot);\n"
+            "uvec4  subgroupPartitionedInclusiveMinNV(uvec4, uvec4 ballot);\n"
+
+            "float  subgroupPartitionedInclusiveMaxNV(float, uvec4 ballot);\n"
+            "vec2   subgroupPartitionedInclusiveMaxNV(vec2, uvec4 ballot);\n"
+            "vec3   subgroupPartitionedInclusiveMaxNV(vec3, uvec4 ballot);\n"
+            "vec4   subgroupPartitionedInclusiveMaxNV(vec4, uvec4 ballot);\n"
+            "int    subgroupPartitionedInclusiveMaxNV(int, uvec4 ballot);\n"
+            "ivec2  subgroupPartitionedInclusiveMaxNV(ivec2, uvec4 ballot);\n"
+            "ivec3  subgroupPartitionedInclusiveMaxNV(ivec3, uvec4 ballot);\n"
+            "ivec4  subgroupPartitionedInclusiveMaxNV(ivec4, uvec4 ballot);\n"
+            "uint   subgroupPartitionedInclusiveMaxNV(uint, uvec4 ballot);\n"
+            "uvec2  subgroupPartitionedInclusiveMaxNV(uvec2, uvec4 ballot);\n"
+            "uvec3  subgroupPartitionedInclusiveMaxNV(uvec3, uvec4 ballot);\n"
+            "uvec4  subgroupPartitionedInclusiveMaxNV(uvec4, uvec4 ballot);\n"
+
+            "int    subgroupPartitionedInclusiveAndNV(int, uvec4 ballot);\n"
+            "ivec2  subgroupPartitionedInclusiveAndNV(ivec2, uvec4 ballot);\n"
+            "ivec3  subgroupPartitionedInclusiveAndNV(ivec3, uvec4 ballot);\n"
+            "ivec4  subgroupPartitionedInclusiveAndNV(ivec4, uvec4 ballot);\n"
+            "uint   subgroupPartitionedInclusiveAndNV(uint, uvec4 ballot);\n"
+            "uvec2  subgroupPartitionedInclusiveAndNV(uvec2, uvec4 ballot);\n"
+            "uvec3  subgroupPartitionedInclusiveAndNV(uvec3, uvec4 ballot);\n"
+            "uvec4  subgroupPartitionedInclusiveAndNV(uvec4, uvec4 ballot);\n"
+            "bool   subgroupPartitionedInclusiveAndNV(bool, uvec4 ballot);\n"
+            "bvec2  subgroupPartitionedInclusiveAndNV(bvec2, uvec4 ballot);\n"
+            "bvec3  subgroupPartitionedInclusiveAndNV(bvec3, uvec4 ballot);\n"
+            "bvec4  subgroupPartitionedInclusiveAndNV(bvec4, uvec4 ballot);\n"
+
+            "int    subgroupPartitionedInclusiveOrNV(int, uvec4 ballot);\n"
+            "ivec2  subgroupPartitionedInclusiveOrNV(ivec2, uvec4 ballot);\n"
+            "ivec3  subgroupPartitionedInclusiveOrNV(ivec3, uvec4 ballot);\n"
+            "ivec4  subgroupPartitionedInclusiveOrNV(ivec4, uvec4 ballot);\n"
+            "uint   subgroupPartitionedInclusiveOrNV(uint, uvec4 ballot);\n"
+            "uvec2  subgroupPartitionedInclusiveOrNV(uvec2, uvec4 ballot);\n"
+            "uvec3  subgroupPartitionedInclusiveOrNV(uvec3, uvec4 ballot);\n"
+            "uvec4  subgroupPartitionedInclusiveOrNV(uvec4, uvec4 ballot);\n"
+            "bool   subgroupPartitionedInclusiveOrNV(bool, uvec4 ballot);\n"
+            "bvec2  subgroupPartitionedInclusiveOrNV(bvec2, uvec4 ballot);\n"
+            "bvec3  subgroupPartitionedInclusiveOrNV(bvec3, uvec4 ballot);\n"
+            "bvec4  subgroupPartitionedInclusiveOrNV(bvec4, uvec4 ballot);\n"
+
+            "int    subgroupPartitionedInclusiveXorNV(int, uvec4 ballot);\n"
+            "ivec2  subgroupPartitionedInclusiveXorNV(ivec2, uvec4 ballot);\n"
+            "ivec3  subgroupPartitionedInclusiveXorNV(ivec3, uvec4 ballot);\n"
+            "ivec4  subgroupPartitionedInclusiveXorNV(ivec4, uvec4 ballot);\n"
+            "uint   subgroupPartitionedInclusiveXorNV(uint, uvec4 ballot);\n"
+            "uvec2  subgroupPartitionedInclusiveXorNV(uvec2, uvec4 ballot);\n"
+            "uvec3  subgroupPartitionedInclusiveXorNV(uvec3, uvec4 ballot);\n"
+            "uvec4  subgroupPartitionedInclusiveXorNV(uvec4, uvec4 ballot);\n"
+            "bool   subgroupPartitionedInclusiveXorNV(bool, uvec4 ballot);\n"
+            "bvec2  subgroupPartitionedInclusiveXorNV(bvec2, uvec4 ballot);\n"
+            "bvec3  subgroupPartitionedInclusiveXorNV(bvec3, uvec4 ballot);\n"
+            "bvec4  subgroupPartitionedInclusiveXorNV(bvec4, uvec4 ballot);\n"
+
+            "float  subgroupPartitionedExclusiveAddNV(float, uvec4 ballot);\n"
+            "vec2   subgroupPartitionedExclusiveAddNV(vec2, uvec4 ballot);\n"
+            "vec3   subgroupPartitionedExclusiveAddNV(vec3, uvec4 ballot);\n"
+            "vec4   subgroupPartitionedExclusiveAddNV(vec4, uvec4 ballot);\n"
+            "int    subgroupPartitionedExclusiveAddNV(int, uvec4 ballot);\n"
+            "ivec2  subgroupPartitionedExclusiveAddNV(ivec2, uvec4 ballot);\n"
+            "ivec3  subgroupPartitionedExclusiveAddNV(ivec3, uvec4 ballot);\n"
+            "ivec4  subgroupPartitionedExclusiveAddNV(ivec4, uvec4 ballot);\n"
+            "uint   subgroupPartitionedExclusiveAddNV(uint, uvec4 ballot);\n"
+            "uvec2  subgroupPartitionedExclusiveAddNV(uvec2, uvec4 ballot);\n"
+            "uvec3  subgroupPartitionedExclusiveAddNV(uvec3, uvec4 ballot);\n"
+            "uvec4  subgroupPartitionedExclusiveAddNV(uvec4, uvec4 ballot);\n"
+
+            "float  subgroupPartitionedExclusiveMulNV(float, uvec4 ballot);\n"
+            "vec2   subgroupPartitionedExclusiveMulNV(vec2, uvec4 ballot);\n"
+            "vec3   subgroupPartitionedExclusiveMulNV(vec3, uvec4 ballot);\n"
+            "vec4   subgroupPartitionedExclusiveMulNV(vec4, uvec4 ballot);\n"
+            "int    subgroupPartitionedExclusiveMulNV(int, uvec4 ballot);\n"
+            "ivec2  subgroupPartitionedExclusiveMulNV(ivec2, uvec4 ballot);\n"
+            "ivec3  subgroupPartitionedExclusiveMulNV(ivec3, uvec4 ballot);\n"
+            "ivec4  subgroupPartitionedExclusiveMulNV(ivec4, uvec4 ballot);\n"
+            "uint   subgroupPartitionedExclusiveMulNV(uint, uvec4 ballot);\n"
+            "uvec2  subgroupPartitionedExclusiveMulNV(uvec2, uvec4 ballot);\n"
+            "uvec3  subgroupPartitionedExclusiveMulNV(uvec3, uvec4 ballot);\n"
+            "uvec4  subgroupPartitionedExclusiveMulNV(uvec4, uvec4 ballot);\n"
+
+            "float  subgroupPartitionedExclusiveMinNV(float, uvec4 ballot);\n"
+            "vec2   subgroupPartitionedExclusiveMinNV(vec2, uvec4 ballot);\n"
+            "vec3   subgroupPartitionedExclusiveMinNV(vec3, uvec4 ballot);\n"
+            "vec4   subgroupPartitionedExclusiveMinNV(vec4, uvec4 ballot);\n"
+            "int    subgroupPartitionedExclusiveMinNV(int, uvec4 ballot);\n"
+            "ivec2  subgroupPartitionedExclusiveMinNV(ivec2, uvec4 ballot);\n"
+            "ivec3  subgroupPartitionedExclusiveMinNV(ivec3, uvec4 ballot);\n"
+            "ivec4  subgroupPartitionedExclusiveMinNV(ivec4, uvec4 ballot);\n"
+            "uint   subgroupPartitionedExclusiveMinNV(uint, uvec4 ballot);\n"
+            "uvec2  subgroupPartitionedExclusiveMinNV(uvec2, uvec4 ballot);\n"
+            "uvec3  subgroupPartitionedExclusiveMinNV(uvec3, uvec4 ballot);\n"
+            "uvec4  subgroupPartitionedExclusiveMinNV(uvec4, uvec4 ballot);\n"
+
+            "float  subgroupPartitionedExclusiveMaxNV(float, uvec4 ballot);\n"
+            "vec2   subgroupPartitionedExclusiveMaxNV(vec2, uvec4 ballot);\n"
+            "vec3   subgroupPartitionedExclusiveMaxNV(vec3, uvec4 ballot);\n"
+            "vec4   subgroupPartitionedExclusiveMaxNV(vec4, uvec4 ballot);\n"
+            "int    subgroupPartitionedExclusiveMaxNV(int, uvec4 ballot);\n"
+            "ivec2  subgroupPartitionedExclusiveMaxNV(ivec2, uvec4 ballot);\n"
+            "ivec3  subgroupPartitionedExclusiveMaxNV(ivec3, uvec4 ballot);\n"
+            "ivec4  subgroupPartitionedExclusiveMaxNV(ivec4, uvec4 ballot);\n"
+            "uint   subgroupPartitionedExclusiveMaxNV(uint, uvec4 ballot);\n"
+            "uvec2  subgroupPartitionedExclusiveMaxNV(uvec2, uvec4 ballot);\n"
+            "uvec3  subgroupPartitionedExclusiveMaxNV(uvec3, uvec4 ballot);\n"
+            "uvec4  subgroupPartitionedExclusiveMaxNV(uvec4, uvec4 ballot);\n"
+
+            "int    subgroupPartitionedExclusiveAndNV(int, uvec4 ballot);\n"
+            "ivec2  subgroupPartitionedExclusiveAndNV(ivec2, uvec4 ballot);\n"
+            "ivec3  subgroupPartitionedExclusiveAndNV(ivec3, uvec4 ballot);\n"
+            "ivec4  subgroupPartitionedExclusiveAndNV(ivec4, uvec4 ballot);\n"
+            "uint   subgroupPartitionedExclusiveAndNV(uint, uvec4 ballot);\n"
+            "uvec2  subgroupPartitionedExclusiveAndNV(uvec2, uvec4 ballot);\n"
+            "uvec3  subgroupPartitionedExclusiveAndNV(uvec3, uvec4 ballot);\n"
+            "uvec4  subgroupPartitionedExclusiveAndNV(uvec4, uvec4 ballot);\n"
+            "bool   subgroupPartitionedExclusiveAndNV(bool, uvec4 ballot);\n"
+            "bvec2  subgroupPartitionedExclusiveAndNV(bvec2, uvec4 ballot);\n"
+            "bvec3  subgroupPartitionedExclusiveAndNV(bvec3, uvec4 ballot);\n"
+            "bvec4  subgroupPartitionedExclusiveAndNV(bvec4, uvec4 ballot);\n"
+
+            "int    subgroupPartitionedExclusiveOrNV(int, uvec4 ballot);\n"
+            "ivec2  subgroupPartitionedExclusiveOrNV(ivec2, uvec4 ballot);\n"
+            "ivec3  subgroupPartitionedExclusiveOrNV(ivec3, uvec4 ballot);\n"
+            "ivec4  subgroupPartitionedExclusiveOrNV(ivec4, uvec4 ballot);\n"
+            "uint   subgroupPartitionedExclusiveOrNV(uint, uvec4 ballot);\n"
+            "uvec2  subgroupPartitionedExclusiveOrNV(uvec2, uvec4 ballot);\n"
+            "uvec3  subgroupPartitionedExclusiveOrNV(uvec3, uvec4 ballot);\n"
+            "uvec4  subgroupPartitionedExclusiveOrNV(uvec4, uvec4 ballot);\n"
+            "bool   subgroupPartitionedExclusiveOrNV(bool, uvec4 ballot);\n"
+            "bvec2  subgroupPartitionedExclusiveOrNV(bvec2, uvec4 ballot);\n"
+            "bvec3  subgroupPartitionedExclusiveOrNV(bvec3, uvec4 ballot);\n"
+            "bvec4  subgroupPartitionedExclusiveOrNV(bvec4, uvec4 ballot);\n"
+
+            "int    subgroupPartitionedExclusiveXorNV(int, uvec4 ballot);\n"
+            "ivec2  subgroupPartitionedExclusiveXorNV(ivec2, uvec4 ballot);\n"
+            "ivec3  subgroupPartitionedExclusiveXorNV(ivec3, uvec4 ballot);\n"
+            "ivec4  subgroupPartitionedExclusiveXorNV(ivec4, uvec4 ballot);\n"
+            "uint   subgroupPartitionedExclusiveXorNV(uint, uvec4 ballot);\n"
+            "uvec2  subgroupPartitionedExclusiveXorNV(uvec2, uvec4 ballot);\n"
+            "uvec3  subgroupPartitionedExclusiveXorNV(uvec3, uvec4 ballot);\n"
+            "uvec4  subgroupPartitionedExclusiveXorNV(uvec4, uvec4 ballot);\n"
+            "bool   subgroupPartitionedExclusiveXorNV(bool, uvec4 ballot);\n"
+            "bvec2  subgroupPartitionedExclusiveXorNV(bvec2, uvec4 ballot);\n"
+            "bvec3  subgroupPartitionedExclusiveXorNV(bvec3, uvec4 ballot);\n"
+            "bvec4  subgroupPartitionedExclusiveXorNV(bvec4, uvec4 ballot);\n"
+#endif
+
+            "\n");
+
+        if (profile != EEsProfile && version >= 400) {
+            commonBuiltins.append(
+                "bool   subgroupAllEqual(double);\n"
+                "bool   subgroupAllEqual(dvec2);\n"
+                "bool   subgroupAllEqual(dvec3);\n"
+                "bool   subgroupAllEqual(dvec4);\n"
+
+                "double subgroupBroadcast(double, uint);\n"
+                "dvec2  subgroupBroadcast(dvec2, uint);\n"
+                "dvec3  subgroupBroadcast(dvec3, uint);\n"
+                "dvec4  subgroupBroadcast(dvec4, uint);\n"
+
+                "double subgroupBroadcastFirst(double);\n"
+                "dvec2  subgroupBroadcastFirst(dvec2);\n"
+                "dvec3  subgroupBroadcastFirst(dvec3);\n"
+                "dvec4  subgroupBroadcastFirst(dvec4);\n"
+
+                "double subgroupShuffle(double, uint);\n"
+                "dvec2  subgroupShuffle(dvec2, uint);\n"
+                "dvec3  subgroupShuffle(dvec3, uint);\n"
+                "dvec4  subgroupShuffle(dvec4, uint);\n"
+
+                "double subgroupShuffleXor(double, uint);\n"
+                "dvec2  subgroupShuffleXor(dvec2, uint);\n"
+                "dvec3  subgroupShuffleXor(dvec3, uint);\n"
+                "dvec4  subgroupShuffleXor(dvec4, uint);\n"
+
+                "double subgroupShuffleUp(double, uint delta);\n"
+                "dvec2  subgroupShuffleUp(dvec2, uint delta);\n"
+                "dvec3  subgroupShuffleUp(dvec3, uint delta);\n"
+                "dvec4  subgroupShuffleUp(dvec4, uint delta);\n"
+
+                "double subgroupShuffleDown(double, uint delta);\n"
+                "dvec2  subgroupShuffleDown(dvec2, uint delta);\n"
+                "dvec3  subgroupShuffleDown(dvec3, uint delta);\n"
+                "dvec4  subgroupShuffleDown(dvec4, uint delta);\n"
+
+                "double subgroupAdd(double);\n"
+                "dvec2  subgroupAdd(dvec2);\n"
+                "dvec3  subgroupAdd(dvec3);\n"
+                "dvec4  subgroupAdd(dvec4);\n"
+
+                "double subgroupMul(double);\n"
+                "dvec2  subgroupMul(dvec2);\n"
+                "dvec3  subgroupMul(dvec3);\n"
+                "dvec4  subgroupMul(dvec4);\n"
+
+                "double subgroupMin(double);\n"
+                "dvec2  subgroupMin(dvec2);\n"
+                "dvec3  subgroupMin(dvec3);\n"
+                "dvec4  subgroupMin(dvec4);\n"
+
+                "double subgroupMax(double);\n"
+                "dvec2  subgroupMax(dvec2);\n"
+                "dvec3  subgroupMax(dvec3);\n"
+                "dvec4  subgroupMax(dvec4);\n"
+
+                "double subgroupInclusiveAdd(double);\n"
+                "dvec2  subgroupInclusiveAdd(dvec2);\n"
+                "dvec3  subgroupInclusiveAdd(dvec3);\n"
+                "dvec4  subgroupInclusiveAdd(dvec4);\n"
+
+                "double subgroupInclusiveMul(double);\n"
+                "dvec2  subgroupInclusiveMul(dvec2);\n"
+                "dvec3  subgroupInclusiveMul(dvec3);\n"
+                "dvec4  subgroupInclusiveMul(dvec4);\n"
+
+                "double subgroupInclusiveMin(double);\n"
+                "dvec2  subgroupInclusiveMin(dvec2);\n"
+                "dvec3  subgroupInclusiveMin(dvec3);\n"
+                "dvec4  subgroupInclusiveMin(dvec4);\n"
+
+                "double subgroupInclusiveMax(double);\n"
+                "dvec2  subgroupInclusiveMax(dvec2);\n"
+                "dvec3  subgroupInclusiveMax(dvec3);\n"
+                "dvec4  subgroupInclusiveMax(dvec4);\n"
+
+                "double subgroupExclusiveAdd(double);\n"
+                "dvec2  subgroupExclusiveAdd(dvec2);\n"
+                "dvec3  subgroupExclusiveAdd(dvec3);\n"
+                "dvec4  subgroupExclusiveAdd(dvec4);\n"
+
+                "double subgroupExclusiveMul(double);\n"
+                "dvec2  subgroupExclusiveMul(dvec2);\n"
+                "dvec3  subgroupExclusiveMul(dvec3);\n"
+                "dvec4  subgroupExclusiveMul(dvec4);\n"
+
+                "double subgroupExclusiveMin(double);\n"
+                "dvec2  subgroupExclusiveMin(dvec2);\n"
+                "dvec3  subgroupExclusiveMin(dvec3);\n"
+                "dvec4  subgroupExclusiveMin(dvec4);\n"
+
+                "double subgroupExclusiveMax(double);\n"
+                "dvec2  subgroupExclusiveMax(dvec2);\n"
+                "dvec3  subgroupExclusiveMax(dvec3);\n"
+                "dvec4  subgroupExclusiveMax(dvec4);\n"
+
+                "double subgroupClusteredAdd(double, uint);\n"
+                "dvec2  subgroupClusteredAdd(dvec2, uint);\n"
+                "dvec3  subgroupClusteredAdd(dvec3, uint);\n"
+                "dvec4  subgroupClusteredAdd(dvec4, uint);\n"
+
+                "double subgroupClusteredMul(double, uint);\n"
+                "dvec2  subgroupClusteredMul(dvec2, uint);\n"
+                "dvec3  subgroupClusteredMul(dvec3, uint);\n"
+                "dvec4  subgroupClusteredMul(dvec4, uint);\n"
+
+                "double subgroupClusteredMin(double, uint);\n"
+                "dvec2  subgroupClusteredMin(dvec2, uint);\n"
+                "dvec3  subgroupClusteredMin(dvec3, uint);\n"
+                "dvec4  subgroupClusteredMin(dvec4, uint);\n"
+
+                "double subgroupClusteredMax(double, uint);\n"
+                "dvec2  subgroupClusteredMax(dvec2, uint);\n"
+                "dvec3  subgroupClusteredMax(dvec3, uint);\n"
+                "dvec4  subgroupClusteredMax(dvec4, uint);\n"
+
+                "double subgroupQuadBroadcast(double, uint);\n"
+                "dvec2  subgroupQuadBroadcast(dvec2, uint);\n"
+                "dvec3  subgroupQuadBroadcast(dvec3, uint);\n"
+                "dvec4  subgroupQuadBroadcast(dvec4, uint);\n"
+
+                "double subgroupQuadSwapHorizontal(double);\n"
+                "dvec2  subgroupQuadSwapHorizontal(dvec2);\n"
+                "dvec3  subgroupQuadSwapHorizontal(dvec3);\n"
+                "dvec4  subgroupQuadSwapHorizontal(dvec4);\n"
+
+                "double subgroupQuadSwapVertical(double);\n"
+                "dvec2  subgroupQuadSwapVertical(dvec2);\n"
+                "dvec3  subgroupQuadSwapVertical(dvec3);\n"
+                "dvec4  subgroupQuadSwapVertical(dvec4);\n"
+
+                "double subgroupQuadSwapDiagonal(double);\n"
+                "dvec2  subgroupQuadSwapDiagonal(dvec2);\n"
+                "dvec3  subgroupQuadSwapDiagonal(dvec3);\n"
+                "dvec4  subgroupQuadSwapDiagonal(dvec4);\n"
+
+
+#ifdef NV_EXTENSIONS
+                "uvec4  subgroupPartitionNV(double);\n"
+                "uvec4  subgroupPartitionNV(dvec2);\n"
+                "uvec4  subgroupPartitionNV(dvec3);\n"
+                "uvec4  subgroupPartitionNV(dvec4);\n"
+
+                "double subgroupPartitionedAddNV(double, uvec4 ballot);\n"
+                "dvec2  subgroupPartitionedAddNV(dvec2, uvec4 ballot);\n"
+                "dvec3  subgroupPartitionedAddNV(dvec3, uvec4 ballot);\n"
+                "dvec4  subgroupPartitionedAddNV(dvec4, uvec4 ballot);\n"
+
+                "double subgroupPartitionedMulNV(double, uvec4 ballot);\n"
+                "dvec2  subgroupPartitionedMulNV(dvec2, uvec4 ballot);\n"
+                "dvec3  subgroupPartitionedMulNV(dvec3, uvec4 ballot);\n"
+                "dvec4  subgroupPartitionedMulNV(dvec4, uvec4 ballot);\n"
+
+                "double subgroupPartitionedMinNV(double, uvec4 ballot);\n"
+                "dvec2  subgroupPartitionedMinNV(dvec2, uvec4 ballot);\n"
+                "dvec3  subgroupPartitionedMinNV(dvec3, uvec4 ballot);\n"
+                "dvec4  subgroupPartitionedMinNV(dvec4, uvec4 ballot);\n"
+
+                "double subgroupPartitionedMaxNV(double, uvec4 ballot);\n"
+                "dvec2  subgroupPartitionedMaxNV(dvec2, uvec4 ballot);\n"
+                "dvec3  subgroupPartitionedMaxNV(dvec3, uvec4 ballot);\n"
+                "dvec4  subgroupPartitionedMaxNV(dvec4, uvec4 ballot);\n"
+
+                "double subgroupPartitionedInclusiveAddNV(double, uvec4 ballot);\n"
+                "dvec2  subgroupPartitionedInclusiveAddNV(dvec2, uvec4 ballot);\n"
+                "dvec3  subgroupPartitionedInclusiveAddNV(dvec3, uvec4 ballot);\n"
+                "dvec4  subgroupPartitionedInclusiveAddNV(dvec4, uvec4 ballot);\n"
+
+                "double subgroupPartitionedInclusiveMulNV(double, uvec4 ballot);\n"
+                "dvec2  subgroupPartitionedInclusiveMulNV(dvec2, uvec4 ballot);\n"
+                "dvec3  subgroupPartitionedInclusiveMulNV(dvec3, uvec4 ballot);\n"
+                "dvec4  subgroupPartitionedInclusiveMulNV(dvec4, uvec4 ballot);\n"
+
+                "double subgroupPartitionedInclusiveMinNV(double, uvec4 ballot);\n"
+                "dvec2  subgroupPartitionedInclusiveMinNV(dvec2, uvec4 ballot);\n"
+                "dvec3  subgroupPartitionedInclusiveMinNV(dvec3, uvec4 ballot);\n"
+                "dvec4  subgroupPartitionedInclusiveMinNV(dvec4, uvec4 ballot);\n"
+
+                "double subgroupPartitionedInclusiveMaxNV(double, uvec4 ballot);\n"
+                "dvec2  subgroupPartitionedInclusiveMaxNV(dvec2, uvec4 ballot);\n"
+                "dvec3  subgroupPartitionedInclusiveMaxNV(dvec3, uvec4 ballot);\n"
+                "dvec4  subgroupPartitionedInclusiveMaxNV(dvec4, uvec4 ballot);\n"
+
+                "double subgroupPartitionedExclusiveAddNV(double, uvec4 ballot);\n"
+                "dvec2  subgroupPartitionedExclusiveAddNV(dvec2, uvec4 ballot);\n"
+                "dvec3  subgroupPartitionedExclusiveAddNV(dvec3, uvec4 ballot);\n"
+                "dvec4  subgroupPartitionedExclusiveAddNV(dvec4, uvec4 ballot);\n"
+
+                "double subgroupPartitionedExclusiveMulNV(double, uvec4 ballot);\n"
+                "dvec2  subgroupPartitionedExclusiveMulNV(dvec2, uvec4 ballot);\n"
+                "dvec3  subgroupPartitionedExclusiveMulNV(dvec3, uvec4 ballot);\n"
+                "dvec4  subgroupPartitionedExclusiveMulNV(dvec4, uvec4 ballot);\n"
+
+                "double subgroupPartitionedExclusiveMinNV(double, uvec4 ballot);\n"
+                "dvec2  subgroupPartitionedExclusiveMinNV(dvec2, uvec4 ballot);\n"
+                "dvec3  subgroupPartitionedExclusiveMinNV(dvec3, uvec4 ballot);\n"
+                "dvec4  subgroupPartitionedExclusiveMinNV(dvec4, uvec4 ballot);\n"
+
+                "double subgroupPartitionedExclusiveMaxNV(double, uvec4 ballot);\n"
+                "dvec2  subgroupPartitionedExclusiveMaxNV(dvec2, uvec4 ballot);\n"
+                "dvec3  subgroupPartitionedExclusiveMaxNV(dvec3, uvec4 ballot);\n"
+                "dvec4  subgroupPartitionedExclusiveMaxNV(dvec4, uvec4 ballot);\n"
+#endif
+
+                "\n");
+            }
+
+        stageBuiltins[EShLangCompute].append(
+            "void subgroupMemoryBarrierShared();"
+
+            "\n"
+            );
+#ifdef NV_EXTENSIONS
+        stageBuiltins[EShLangMeshNV].append(
+            "void subgroupMemoryBarrierShared();"
+            "\n"
+            );
+        stageBuiltins[EShLangTaskNV].append(
+            "void subgroupMemoryBarrierShared();"
+            "\n"
+            );
+#endif
+    }
+
+    if (profile != EEsProfile && version >= 460) {
+        commonBuiltins.append(
+            "bool anyInvocation(bool);"
+            "bool allInvocations(bool);"
+            "bool allInvocationsEqual(bool);"
+
+            "\n");
+    }
+
 #ifdef AMD_EXTENSIONS
     // GL_AMD_shader_ballot
     if (profile != EEsProfile && version >= 450) {
@@ -1610,6 +3001,16 @@
             "f16vec3   minInvocationsAMD(f16vec3);"
             "f16vec4   minInvocationsAMD(f16vec4);"
 
+            "int16_t minInvocationsAMD(int16_t);"
+            "i16vec2 minInvocationsAMD(i16vec2);"
+            "i16vec3 minInvocationsAMD(i16vec3);"
+            "i16vec4 minInvocationsAMD(i16vec4);"
+
+            "uint16_t minInvocationsAMD(uint16_t);"
+            "u16vec2  minInvocationsAMD(u16vec2);"
+            "u16vec3  minInvocationsAMD(u16vec3);"
+            "u16vec4  minInvocationsAMD(u16vec4);"
+
             "float minInvocationsInclusiveScanAMD(float);"
             "vec2  minInvocationsInclusiveScanAMD(vec2);"
             "vec3  minInvocationsInclusiveScanAMD(vec3);"
@@ -1645,6 +3046,16 @@
             "f16vec3   minInvocationsInclusiveScanAMD(f16vec3);"
             "f16vec4   minInvocationsInclusiveScanAMD(f16vec4);"
 
+            "int16_t minInvocationsInclusiveScanAMD(int16_t);"
+            "i16vec2 minInvocationsInclusiveScanAMD(i16vec2);"
+            "i16vec3 minInvocationsInclusiveScanAMD(i16vec3);"
+            "i16vec4 minInvocationsInclusiveScanAMD(i16vec4);"
+
+            "uint16_t minInvocationsInclusiveScanAMD(uint16_t);"
+            "u16vec2  minInvocationsInclusiveScanAMD(u16vec2);"
+            "u16vec3  minInvocationsInclusiveScanAMD(u16vec3);"
+            "u16vec4  minInvocationsInclusiveScanAMD(u16vec4);"
+
             "float minInvocationsExclusiveScanAMD(float);"
             "vec2  minInvocationsExclusiveScanAMD(vec2);"
             "vec3  minInvocationsExclusiveScanAMD(vec3);"
@@ -1680,6 +3091,16 @@
             "f16vec3   minInvocationsExclusiveScanAMD(f16vec3);"
             "f16vec4   minInvocationsExclusiveScanAMD(f16vec4);"
 
+            "int16_t minInvocationsExclusiveScanAMD(int16_t);"
+            "i16vec2 minInvocationsExclusiveScanAMD(i16vec2);"
+            "i16vec3 minInvocationsExclusiveScanAMD(i16vec3);"
+            "i16vec4 minInvocationsExclusiveScanAMD(i16vec4);"
+
+            "uint16_t minInvocationsExclusiveScanAMD(uint16_t);"
+            "u16vec2  minInvocationsExclusiveScanAMD(u16vec2);"
+            "u16vec3  minInvocationsExclusiveScanAMD(u16vec3);"
+            "u16vec4  minInvocationsExclusiveScanAMD(u16vec4);"
+
             "float maxInvocationsAMD(float);"
             "vec2  maxInvocationsAMD(vec2);"
             "vec3  maxInvocationsAMD(vec3);"
@@ -1715,6 +3136,16 @@
             "f16vec3   maxInvocationsAMD(f16vec3);"
             "f16vec4   maxInvocationsAMD(f16vec4);"
 
+            "int16_t maxInvocationsAMD(int16_t);"
+            "i16vec2 maxInvocationsAMD(i16vec2);"
+            "i16vec3 maxInvocationsAMD(i16vec3);"
+            "i16vec4 maxInvocationsAMD(i16vec4);"
+
+            "uint16_t maxInvocationsAMD(uint16_t);"
+            "u16vec2  maxInvocationsAMD(u16vec2);"
+            "u16vec3  maxInvocationsAMD(u16vec3);"
+            "u16vec4  maxInvocationsAMD(u16vec4);"
+
             "float maxInvocationsInclusiveScanAMD(float);"
             "vec2  maxInvocationsInclusiveScanAMD(vec2);"
             "vec3  maxInvocationsInclusiveScanAMD(vec3);"
@@ -1750,6 +3181,16 @@
             "f16vec3   maxInvocationsInclusiveScanAMD(f16vec3);"
             "f16vec4   maxInvocationsInclusiveScanAMD(f16vec4);"
 
+            "int16_t maxInvocationsInclusiveScanAMD(int16_t);"
+            "i16vec2 maxInvocationsInclusiveScanAMD(i16vec2);"
+            "i16vec3 maxInvocationsInclusiveScanAMD(i16vec3);"
+            "i16vec4 maxInvocationsInclusiveScanAMD(i16vec4);"
+
+            "uint16_t maxInvocationsInclusiveScanAMD(uint16_t);"
+            "u16vec2  maxInvocationsInclusiveScanAMD(u16vec2);"
+            "u16vec3  maxInvocationsInclusiveScanAMD(u16vec3);"
+            "u16vec4  maxInvocationsInclusiveScanAMD(u16vec4);"
+
             "float maxInvocationsExclusiveScanAMD(float);"
             "vec2  maxInvocationsExclusiveScanAMD(vec2);"
             "vec3  maxInvocationsExclusiveScanAMD(vec3);"
@@ -1785,6 +3226,16 @@
             "f16vec3   maxInvocationsExclusiveScanAMD(f16vec3);"
             "f16vec4   maxInvocationsExclusiveScanAMD(f16vec4);"
 
+            "int16_t maxInvocationsExclusiveScanAMD(int16_t);"
+            "i16vec2 maxInvocationsExclusiveScanAMD(i16vec2);"
+            "i16vec3 maxInvocationsExclusiveScanAMD(i16vec3);"
+            "i16vec4 maxInvocationsExclusiveScanAMD(i16vec4);"
+
+            "uint16_t maxInvocationsExclusiveScanAMD(uint16_t);"
+            "u16vec2  maxInvocationsExclusiveScanAMD(u16vec2);"
+            "u16vec3  maxInvocationsExclusiveScanAMD(u16vec3);"
+            "u16vec4  maxInvocationsExclusiveScanAMD(u16vec4);"
+
             "float addInvocationsAMD(float);"
             "vec2  addInvocationsAMD(vec2);"
             "vec3  addInvocationsAMD(vec3);"
@@ -1820,6 +3271,16 @@
             "f16vec3   addInvocationsAMD(f16vec3);"
             "f16vec4   addInvocationsAMD(f16vec4);"
 
+            "int16_t addInvocationsAMD(int16_t);"
+            "i16vec2 addInvocationsAMD(i16vec2);"
+            "i16vec3 addInvocationsAMD(i16vec3);"
+            "i16vec4 addInvocationsAMD(i16vec4);"
+
+            "uint16_t addInvocationsAMD(uint16_t);"
+            "u16vec2  addInvocationsAMD(u16vec2);"
+            "u16vec3  addInvocationsAMD(u16vec3);"
+            "u16vec4  addInvocationsAMD(u16vec4);"
+
             "float addInvocationsInclusiveScanAMD(float);"
             "vec2  addInvocationsInclusiveScanAMD(vec2);"
             "vec3  addInvocationsInclusiveScanAMD(vec3);"
@@ -1855,6 +3316,16 @@
             "f16vec3   addInvocationsInclusiveScanAMD(f16vec3);"
             "f16vec4   addInvocationsInclusiveScanAMD(f16vec4);"
 
+            "int16_t addInvocationsInclusiveScanAMD(int16_t);"
+            "i16vec2 addInvocationsInclusiveScanAMD(i16vec2);"
+            "i16vec3 addInvocationsInclusiveScanAMD(i16vec3);"
+            "i16vec4 addInvocationsInclusiveScanAMD(i16vec4);"
+
+            "uint16_t addInvocationsInclusiveScanAMD(uint16_t);"
+            "u16vec2  addInvocationsInclusiveScanAMD(u16vec2);"
+            "u16vec3  addInvocationsInclusiveScanAMD(u16vec3);"
+            "u16vec4  addInvocationsInclusiveScanAMD(u16vec4);"
+
             "float addInvocationsExclusiveScanAMD(float);"
             "vec2  addInvocationsExclusiveScanAMD(vec2);"
             "vec3  addInvocationsExclusiveScanAMD(vec3);"
@@ -1890,6 +3361,16 @@
             "f16vec3   addInvocationsExclusiveScanAMD(f16vec3);"
             "f16vec4   addInvocationsExclusiveScanAMD(f16vec4);"
 
+            "int16_t addInvocationsExclusiveScanAMD(int16_t);"
+            "i16vec2 addInvocationsExclusiveScanAMD(i16vec2);"
+            "i16vec3 addInvocationsExclusiveScanAMD(i16vec3);"
+            "i16vec4 addInvocationsExclusiveScanAMD(i16vec4);"
+
+            "uint16_t addInvocationsExclusiveScanAMD(uint16_t);"
+            "u16vec2  addInvocationsExclusiveScanAMD(u16vec2);"
+            "u16vec3  addInvocationsExclusiveScanAMD(u16vec3);"
+            "u16vec4  addInvocationsExclusiveScanAMD(u16vec4);"
+
             "float minInvocationsNonUniformAMD(float);"
             "vec2  minInvocationsNonUniformAMD(vec2);"
             "vec3  minInvocationsNonUniformAMD(vec3);"
@@ -1925,6 +3406,16 @@
             "f16vec3   minInvocationsNonUniformAMD(f16vec3);"
             "f16vec4   minInvocationsNonUniformAMD(f16vec4);"
 
+            "int16_t minInvocationsNonUniformAMD(int16_t);"
+            "i16vec2 minInvocationsNonUniformAMD(i16vec2);"
+            "i16vec3 minInvocationsNonUniformAMD(i16vec3);"
+            "i16vec4 minInvocationsNonUniformAMD(i16vec4);"
+
+            "uint16_t minInvocationsNonUniformAMD(uint16_t);"
+            "u16vec2  minInvocationsNonUniformAMD(u16vec2);"
+            "u16vec3  minInvocationsNonUniformAMD(u16vec3);"
+            "u16vec4  minInvocationsNonUniformAMD(u16vec4);"
+
             "float minInvocationsInclusiveScanNonUniformAMD(float);"
             "vec2  minInvocationsInclusiveScanNonUniformAMD(vec2);"
             "vec3  minInvocationsInclusiveScanNonUniformAMD(vec3);"
@@ -1960,6 +3451,16 @@
             "f16vec3   minInvocationsInclusiveScanNonUniformAMD(f16vec3);"
             "f16vec4   minInvocationsInclusiveScanNonUniformAMD(f16vec4);"
 
+            "int16_t minInvocationsInclusiveScanNonUniformAMD(int16_t);"
+            "i16vec2 minInvocationsInclusiveScanNonUniformAMD(i16vec2);"
+            "i16vec3 minInvocationsInclusiveScanNonUniformAMD(i16vec3);"
+            "i16vec4 minInvocationsInclusiveScanNonUniformAMD(i16vec4);"
+
+            "uint16_t minInvocationsInclusiveScanNonUniformAMD(uint16_t);"
+            "u16vec2  minInvocationsInclusiveScanNonUniformAMD(u16vec2);"
+            "u16vec3  minInvocationsInclusiveScanNonUniformAMD(u16vec3);"
+            "u16vec4  minInvocationsInclusiveScanNonUniformAMD(u16vec4);"
+
             "float minInvocationsExclusiveScanNonUniformAMD(float);"
             "vec2  minInvocationsExclusiveScanNonUniformAMD(vec2);"
             "vec3  minInvocationsExclusiveScanNonUniformAMD(vec3);"
@@ -1995,6 +3496,16 @@
             "f16vec3   minInvocationsExclusiveScanNonUniformAMD(f16vec3);"
             "f16vec4   minInvocationsExclusiveScanNonUniformAMD(f16vec4);"
 
+            "int16_t minInvocationsExclusiveScanNonUniformAMD(int16_t);"
+            "i16vec2 minInvocationsExclusiveScanNonUniformAMD(i16vec2);"
+            "i16vec3 minInvocationsExclusiveScanNonUniformAMD(i16vec3);"
+            "i16vec4 minInvocationsExclusiveScanNonUniformAMD(i16vec4);"
+
+            "uint16_t minInvocationsExclusiveScanNonUniformAMD(uint16_t);"
+            "u16vec2  minInvocationsExclusiveScanNonUniformAMD(u16vec2);"
+            "u16vec3  minInvocationsExclusiveScanNonUniformAMD(u16vec3);"
+            "u16vec4  minInvocationsExclusiveScanNonUniformAMD(u16vec4);"
+
             "float maxInvocationsNonUniformAMD(float);"
             "vec2  maxInvocationsNonUniformAMD(vec2);"
             "vec3  maxInvocationsNonUniformAMD(vec3);"
@@ -2030,6 +3541,16 @@
             "f16vec3   maxInvocationsNonUniformAMD(f16vec3);"
             "f16vec4   maxInvocationsNonUniformAMD(f16vec4);"
 
+            "int16_t maxInvocationsNonUniformAMD(int16_t);"
+            "i16vec2 maxInvocationsNonUniformAMD(i16vec2);"
+            "i16vec3 maxInvocationsNonUniformAMD(i16vec3);"
+            "i16vec4 maxInvocationsNonUniformAMD(i16vec4);"
+
+            "uint16_t maxInvocationsNonUniformAMD(uint16_t);"
+            "u16vec2  maxInvocationsNonUniformAMD(u16vec2);"
+            "u16vec3  maxInvocationsNonUniformAMD(u16vec3);"
+            "u16vec4  maxInvocationsNonUniformAMD(u16vec4);"
+
             "float maxInvocationsInclusiveScanNonUniformAMD(float);"
             "vec2  maxInvocationsInclusiveScanNonUniformAMD(vec2);"
             "vec3  maxInvocationsInclusiveScanNonUniformAMD(vec3);"
@@ -2065,6 +3586,16 @@
             "f16vec3   maxInvocationsInclusiveScanNonUniformAMD(f16vec3);"
             "f16vec4   maxInvocationsInclusiveScanNonUniformAMD(f16vec4);"
 
+            "int16_t maxInvocationsInclusiveScanNonUniformAMD(int16_t);"
+            "i16vec2 maxInvocationsInclusiveScanNonUniformAMD(i16vec2);"
+            "i16vec3 maxInvocationsInclusiveScanNonUniformAMD(i16vec3);"
+            "i16vec4 maxInvocationsInclusiveScanNonUniformAMD(i16vec4);"
+
+            "uint16_t maxInvocationsInclusiveScanNonUniformAMD(uint16_t);"
+            "u16vec2  maxInvocationsInclusiveScanNonUniformAMD(u16vec2);"
+            "u16vec3  maxInvocationsInclusiveScanNonUniformAMD(u16vec3);"
+            "u16vec4  maxInvocationsInclusiveScanNonUniformAMD(u16vec4);"
+
             "float maxInvocationsExclusiveScanNonUniformAMD(float);"
             "vec2  maxInvocationsExclusiveScanNonUniformAMD(vec2);"
             "vec3  maxInvocationsExclusiveScanNonUniformAMD(vec3);"
@@ -2100,6 +3631,16 @@
             "f16vec3   maxInvocationsExclusiveScanNonUniformAMD(f16vec3);"
             "f16vec4   maxInvocationsExclusiveScanNonUniformAMD(f16vec4);"
 
+            "int16_t maxInvocationsExclusiveScanNonUniformAMD(int16_t);"
+            "i16vec2 maxInvocationsExclusiveScanNonUniformAMD(i16vec2);"
+            "i16vec3 maxInvocationsExclusiveScanNonUniformAMD(i16vec3);"
+            "i16vec4 maxInvocationsExclusiveScanNonUniformAMD(i16vec4);"
+
+            "uint16_t maxInvocationsExclusiveScanNonUniformAMD(uint16_t);"
+            "u16vec2  maxInvocationsExclusiveScanNonUniformAMD(u16vec2);"
+            "u16vec3  maxInvocationsExclusiveScanNonUniformAMD(u16vec3);"
+            "u16vec4  maxInvocationsExclusiveScanNonUniformAMD(u16vec4);"
+
             "float addInvocationsNonUniformAMD(float);"
             "vec2  addInvocationsNonUniformAMD(vec2);"
             "vec3  addInvocationsNonUniformAMD(vec3);"
@@ -2135,6 +3676,16 @@
             "f16vec3   addInvocationsNonUniformAMD(f16vec3);"
             "f16vec4   addInvocationsNonUniformAMD(f16vec4);"
 
+            "int16_t addInvocationsNonUniformAMD(int16_t);"
+            "i16vec2 addInvocationsNonUniformAMD(i16vec2);"
+            "i16vec3 addInvocationsNonUniformAMD(i16vec3);"
+            "i16vec4 addInvocationsNonUniformAMD(i16vec4);"
+
+            "uint16_t addInvocationsNonUniformAMD(uint16_t);"
+            "u16vec2  addInvocationsNonUniformAMD(u16vec2);"
+            "u16vec3  addInvocationsNonUniformAMD(u16vec3);"
+            "u16vec4  addInvocationsNonUniformAMD(u16vec4);"
+
             "float addInvocationsInclusiveScanNonUniformAMD(float);"
             "vec2  addInvocationsInclusiveScanNonUniformAMD(vec2);"
             "vec3  addInvocationsInclusiveScanNonUniformAMD(vec3);"
@@ -2170,6 +3721,16 @@
             "f16vec3   addInvocationsInclusiveScanNonUniformAMD(f16vec3);"
             "f16vec4   addInvocationsInclusiveScanNonUniformAMD(f16vec4);"
 
+            "int16_t addInvocationsInclusiveScanNonUniformAMD(int16_t);"
+            "i16vec2 addInvocationsInclusiveScanNonUniformAMD(i16vec2);"
+            "i16vec3 addInvocationsInclusiveScanNonUniformAMD(i16vec3);"
+            "i16vec4 addInvocationsInclusiveScanNonUniformAMD(i16vec4);"
+
+            "uint16_t addInvocationsInclusiveScanNonUniformAMD(uint16_t);"
+            "u16vec2  addInvocationsInclusiveScanNonUniformAMD(u16vec2);"
+            "u16vec3  addInvocationsInclusiveScanNonUniformAMD(u16vec3);"
+            "u16vec4  addInvocationsInclusiveScanNonUniformAMD(u16vec4);"
+
             "float addInvocationsExclusiveScanNonUniformAMD(float);"
             "vec2  addInvocationsExclusiveScanNonUniformAMD(vec2);"
             "vec3  addInvocationsExclusiveScanNonUniformAMD(vec3);"
@@ -2205,6 +3766,16 @@
             "f16vec3   addInvocationsExclusiveScanNonUniformAMD(f16vec3);"
             "f16vec4   addInvocationsExclusiveScanNonUniformAMD(f16vec4);"
 
+            "int16_t addInvocationsExclusiveScanNonUniformAMD(int16_t);"
+            "i16vec2 addInvocationsExclusiveScanNonUniformAMD(i16vec2);"
+            "i16vec3 addInvocationsExclusiveScanNonUniformAMD(i16vec3);"
+            "i16vec4 addInvocationsExclusiveScanNonUniformAMD(i16vec4);"
+
+            "uint16_t addInvocationsExclusiveScanNonUniformAMD(uint16_t);"
+            "u16vec2  addInvocationsExclusiveScanNonUniformAMD(u16vec2);"
+            "u16vec3  addInvocationsExclusiveScanNonUniformAMD(u16vec3);"
+            "u16vec4  addInvocationsExclusiveScanNonUniformAMD(u16vec4);"
+
             "float swizzleInvocationsAMD(float, uvec4);"
             "vec2  swizzleInvocationsAMD(vec2,  uvec4);"
             "vec3  swizzleInvocationsAMD(vec3,  uvec4);"
@@ -2259,13 +3830,73 @@
     if (profile != EEsProfile && version >= 450) {
         commonBuiltins.append(
             "float cubeFaceIndexAMD(vec3);"
-            "vec2 cubeFaceCoordAMD(vec3);"
+            "vec2  cubeFaceCoordAMD(vec3);"
             "uint64_t timeAMD();"
 
             "\n");
     }
 
-    // GL_AMD_gpu_shader_half_float
+    // GL_AMD_shader_fragment_mask
+    if (profile != EEsProfile && version >= 450) {
+        commonBuiltins.append(
+            "uint fragmentMaskFetchAMD(sampler2DMS,       ivec2);"
+            "uint fragmentMaskFetchAMD(isampler2DMS,      ivec2);"
+            "uint fragmentMaskFetchAMD(usampler2DMS,      ivec2);"
+
+            "uint fragmentMaskFetchAMD(sampler2DMSArray,  ivec3);"
+            "uint fragmentMaskFetchAMD(isampler2DMSArray, ivec3);"
+            "uint fragmentMaskFetchAMD(usampler2DMSArray, ivec3);"
+
+            "vec4  fragmentFetchAMD(sampler2DMS,       ivec2, uint);"
+            "ivec4 fragmentFetchAMD(isampler2DMS,      ivec2, uint);"
+            "uvec4 fragmentFetchAMD(usampler2DMS,      ivec2, uint);"
+
+            "vec4  fragmentFetchAMD(sampler2DMSArray,  ivec3, uint);"
+            "ivec4 fragmentFetchAMD(isampler2DMSArray, ivec3, uint);"
+            "uvec4 fragmentFetchAMD(usampler2DMSArray, ivec3, uint);"
+
+            "\n");
+    }
+
+#endif  // AMD_EXTENSIONS
+
+
+#ifdef NV_EXTENSIONS
+    if ((profile != EEsProfile && version >= 450) || 
+        (profile == EEsProfile && version >= 320)) {
+        commonBuiltins.append(
+            "struct gl_TextureFootprint2DNV {"
+                "uvec2 anchor;"
+                "uvec2 offset;"
+                "uvec2 mask;"
+                "uint lod;"
+                "uint granularity;"
+            "};"
+
+            "struct gl_TextureFootprint3DNV {"
+                "uvec3 anchor;"
+                "uvec3 offset;"
+                "uvec2 mask;"
+                "uint lod;"
+                "uint granularity;"
+            "};"
+            "bool textureFootprintNV(sampler2D, vec2, int, bool, out gl_TextureFootprint2DNV);"
+            "bool textureFootprintNV(sampler3D, vec3, int, bool, out gl_TextureFootprint3DNV);"
+            "bool textureFootprintNV(sampler2D, vec2, int, bool, out gl_TextureFootprint2DNV, float);"
+            "bool textureFootprintNV(sampler3D, vec3, int, bool, out gl_TextureFootprint3DNV, float);"
+            "bool textureFootprintClampNV(sampler2D, vec2, float, int, bool, out gl_TextureFootprint2DNV);"
+            "bool textureFootprintClampNV(sampler3D, vec3, float, int, bool, out gl_TextureFootprint3DNV);"
+            "bool textureFootprintClampNV(sampler2D, vec2, float, int, bool, out gl_TextureFootprint2DNV, float);"
+            "bool textureFootprintClampNV(sampler3D, vec3, float, int, bool, out gl_TextureFootprint3DNV, float);"
+            "bool textureFootprintLodNV(sampler2D, vec2, float, int, bool, out gl_TextureFootprint2DNV);"
+            "bool textureFootprintLodNV(sampler3D, vec3, float, int, bool, out gl_TextureFootprint3DNV);"
+            "bool textureFootprintGradNV(sampler2D, vec2, vec2, vec2, int, bool, out gl_TextureFootprint2DNV);"
+            "bool textureFootprintGradClampNV(sampler2D, vec2, vec2, vec2, float, int, bool, out gl_TextureFootprint2DNV);"
+            "\n");
+    }
+
+#endif // NV_EXTENSIONS
+    // GL_AMD_gpu_shader_half_float/Explicit types
     if (profile != EEsProfile && version >= 450) {
         commonBuiltins.append(
             "float16_t radians(float16_t);"
@@ -2612,7 +4243,531 @@
 
             "\n");
     }
-#endif
+
+    // Explicit types
+    if (profile != EEsProfile && version >= 450) {
+        commonBuiltins.append(
+            "int8_t abs(int8_t);"
+            "i8vec2 abs(i8vec2);"
+            "i8vec3 abs(i8vec3);"
+            "i8vec4 abs(i8vec4);"
+
+            "int8_t sign(int8_t);"
+            "i8vec2 sign(i8vec2);"
+            "i8vec3 sign(i8vec3);"
+            "i8vec4 sign(i8vec4);"
+
+            "int8_t min(int8_t x, int8_t y);"
+            "i8vec2 min(i8vec2 x, int8_t y);"
+            "i8vec3 min(i8vec3 x, int8_t y);"
+            "i8vec4 min(i8vec4 x, int8_t y);"
+            "i8vec2 min(i8vec2 x, i8vec2 y);"
+            "i8vec3 min(i8vec3 x, i8vec3 y);"
+            "i8vec4 min(i8vec4 x, i8vec4 y);"
+
+            "uint8_t min(uint8_t x, uint8_t y);"
+            "u8vec2 min(u8vec2 x, uint8_t y);"
+            "u8vec3 min(u8vec3 x, uint8_t y);"
+            "u8vec4 min(u8vec4 x, uint8_t y);"
+            "u8vec2 min(u8vec2 x, u8vec2 y);"
+            "u8vec3 min(u8vec3 x, u8vec3 y);"
+            "u8vec4 min(u8vec4 x, u8vec4 y);"
+
+            "int8_t max(int8_t x, int8_t y);"
+            "i8vec2 max(i8vec2 x, int8_t y);"
+            "i8vec3 max(i8vec3 x, int8_t y);"
+            "i8vec4 max(i8vec4 x, int8_t y);"
+            "i8vec2 max(i8vec2 x, i8vec2 y);"
+            "i8vec3 max(i8vec3 x, i8vec3 y);"
+            "i8vec4 max(i8vec4 x, i8vec4 y);"
+
+            "uint8_t max(uint8_t x, uint8_t y);"
+            "u8vec2 max(u8vec2 x, uint8_t y);"
+            "u8vec3 max(u8vec3 x, uint8_t y);"
+            "u8vec4 max(u8vec4 x, uint8_t y);"
+            "u8vec2 max(u8vec2 x, u8vec2 y);"
+            "u8vec3 max(u8vec3 x, u8vec3 y);"
+            "u8vec4 max(u8vec4 x, u8vec4 y);"
+
+            "int8_t    clamp(int8_t x, int8_t minVal, int8_t maxVal);"
+            "i8vec2  clamp(i8vec2  x, int8_t minVal, int8_t maxVal);"
+            "i8vec3  clamp(i8vec3  x, int8_t minVal, int8_t maxVal);"
+            "i8vec4  clamp(i8vec4  x, int8_t minVal, int8_t maxVal);"
+            "i8vec2  clamp(i8vec2  x, i8vec2  minVal, i8vec2  maxVal);"
+            "i8vec3  clamp(i8vec3  x, i8vec3  minVal, i8vec3  maxVal);"
+            "i8vec4  clamp(i8vec4  x, i8vec4  minVal, i8vec4  maxVal);"
+
+            "uint8_t   clamp(uint8_t x, uint8_t minVal, uint8_t maxVal);"
+            "u8vec2  clamp(u8vec2  x, uint8_t minVal, uint8_t maxVal);"
+            "u8vec3  clamp(u8vec3  x, uint8_t minVal, uint8_t maxVal);"
+            "u8vec4  clamp(u8vec4  x, uint8_t minVal, uint8_t maxVal);"
+            "u8vec2  clamp(u8vec2  x, u8vec2  minVal, u8vec2  maxVal);"
+            "u8vec3  clamp(u8vec3  x, u8vec3  minVal, u8vec3  maxVal);"
+            "u8vec4  clamp(u8vec4  x, u8vec4  minVal, u8vec4  maxVal);"
+
+            "int8_t  mix(int8_t,  int8_t,  bool);"
+            "i8vec2  mix(i8vec2,  i8vec2,  bvec2);"
+            "i8vec3  mix(i8vec3,  i8vec3,  bvec3);"
+            "i8vec4  mix(i8vec4,  i8vec4,  bvec4);"
+            "uint8_t mix(uint8_t, uint8_t, bool);"
+            "u8vec2  mix(u8vec2,  u8vec2,  bvec2);"
+            "u8vec3  mix(u8vec3,  u8vec3,  bvec3);"
+            "u8vec4  mix(u8vec4,  u8vec4,  bvec4);"
+
+            "bvec2 lessThan(i8vec2, i8vec2);"
+            "bvec3 lessThan(i8vec3, i8vec3);"
+            "bvec4 lessThan(i8vec4, i8vec4);"
+            "bvec2 lessThan(u8vec2, u8vec2);"
+            "bvec3 lessThan(u8vec3, u8vec3);"
+            "bvec4 lessThan(u8vec4, u8vec4);"
+
+            "bvec2 lessThanEqual(i8vec2, i8vec2);"
+            "bvec3 lessThanEqual(i8vec3, i8vec3);"
+            "bvec4 lessThanEqual(i8vec4, i8vec4);"
+            "bvec2 lessThanEqual(u8vec2, u8vec2);"
+            "bvec3 lessThanEqual(u8vec3, u8vec3);"
+            "bvec4 lessThanEqual(u8vec4, u8vec4);"
+
+            "bvec2 greaterThan(i8vec2, i8vec2);"
+            "bvec3 greaterThan(i8vec3, i8vec3);"
+            "bvec4 greaterThan(i8vec4, i8vec4);"
+            "bvec2 greaterThan(u8vec2, u8vec2);"
+            "bvec3 greaterThan(u8vec3, u8vec3);"
+            "bvec4 greaterThan(u8vec4, u8vec4);"
+
+            "bvec2 greaterThanEqual(i8vec2, i8vec2);"
+            "bvec3 greaterThanEqual(i8vec3, i8vec3);"
+            "bvec4 greaterThanEqual(i8vec4, i8vec4);"
+            "bvec2 greaterThanEqual(u8vec2, u8vec2);"
+            "bvec3 greaterThanEqual(u8vec3, u8vec3);"
+            "bvec4 greaterThanEqual(u8vec4, u8vec4);"
+
+            "bvec2 equal(i8vec2, i8vec2);"
+            "bvec3 equal(i8vec3, i8vec3);"
+            "bvec4 equal(i8vec4, i8vec4);"
+            "bvec2 equal(u8vec2, u8vec2);"
+            "bvec3 equal(u8vec3, u8vec3);"
+            "bvec4 equal(u8vec4, u8vec4);"
+
+            "bvec2 notEqual(i8vec2, i8vec2);"
+            "bvec3 notEqual(i8vec3, i8vec3);"
+            "bvec4 notEqual(i8vec4, i8vec4);"
+            "bvec2 notEqual(u8vec2, u8vec2);"
+            "bvec3 notEqual(u8vec3, u8vec3);"
+            "bvec4 notEqual(u8vec4, u8vec4);"
+
+            "  int8_t bitfieldExtract(  int8_t, int8_t, int8_t);"
+            "i8vec2 bitfieldExtract(i8vec2, int8_t, int8_t);"
+            "i8vec3 bitfieldExtract(i8vec3, int8_t, int8_t);"
+            "i8vec4 bitfieldExtract(i8vec4, int8_t, int8_t);"
+
+            " uint8_t bitfieldExtract( uint8_t, int8_t, int8_t);"
+            "u8vec2 bitfieldExtract(u8vec2, int8_t, int8_t);"
+            "u8vec3 bitfieldExtract(u8vec3, int8_t, int8_t);"
+            "u8vec4 bitfieldExtract(u8vec4, int8_t, int8_t);"
+
+            "  int8_t bitfieldInsert(  int8_t base,   int8_t, int8_t, int8_t);"
+            "i8vec2 bitfieldInsert(i8vec2 base, i8vec2, int8_t, int8_t);"
+            "i8vec3 bitfieldInsert(i8vec3 base, i8vec3, int8_t, int8_t);"
+            "i8vec4 bitfieldInsert(i8vec4 base, i8vec4, int8_t, int8_t);"
+
+            " uint8_t bitfieldInsert( uint8_t base,  uint8_t, int8_t, int8_t);"
+            "u8vec2 bitfieldInsert(u8vec2 base, u8vec2, int8_t, int8_t);"
+            "u8vec3 bitfieldInsert(u8vec3 base, u8vec3, int8_t, int8_t);"
+            "u8vec4 bitfieldInsert(u8vec4 base, u8vec4, int8_t, int8_t);"
+
+            "  int8_t bitCount(  int8_t);"
+            "i8vec2 bitCount(i8vec2);"
+            "i8vec3 bitCount(i8vec3);"
+            "i8vec4 bitCount(i8vec4);"
+
+            "  int8_t bitCount( uint8_t);"
+            "i8vec2 bitCount(u8vec2);"
+            "i8vec3 bitCount(u8vec3);"
+            "i8vec4 bitCount(u8vec4);"
+
+            "  int8_t findLSB(  int8_t);"
+            "i8vec2 findLSB(i8vec2);"
+            "i8vec3 findLSB(i8vec3);"
+            "i8vec4 findLSB(i8vec4);"
+
+            "  int8_t findLSB( uint8_t);"
+            "i8vec2 findLSB(u8vec2);"
+            "i8vec3 findLSB(u8vec3);"
+            "i8vec4 findLSB(u8vec4);"
+
+            "  int8_t findMSB(  int8_t);"
+            "i8vec2 findMSB(i8vec2);"
+            "i8vec3 findMSB(i8vec3);"
+            "i8vec4 findMSB(i8vec4);"
+
+            "  int8_t findMSB( uint8_t);"
+            "i8vec2 findMSB(u8vec2);"
+            "i8vec3 findMSB(u8vec3);"
+            "i8vec4 findMSB(u8vec4);"
+
+            "int16_t abs(int16_t);"
+            "i16vec2 abs(i16vec2);"
+            "i16vec3 abs(i16vec3);"
+            "i16vec4 abs(i16vec4);"
+
+            "int16_t sign(int16_t);"
+            "i16vec2 sign(i16vec2);"
+            "i16vec3 sign(i16vec3);"
+            "i16vec4 sign(i16vec4);"
+
+            "int16_t min(int16_t x, int16_t y);"
+            "i16vec2 min(i16vec2 x, int16_t y);"
+            "i16vec3 min(i16vec3 x, int16_t y);"
+            "i16vec4 min(i16vec4 x, int16_t y);"
+            "i16vec2 min(i16vec2 x, i16vec2 y);"
+            "i16vec3 min(i16vec3 x, i16vec3 y);"
+            "i16vec4 min(i16vec4 x, i16vec4 y);"
+
+            "uint16_t min(uint16_t x, uint16_t y);"
+            "u16vec2 min(u16vec2 x, uint16_t y);"
+            "u16vec3 min(u16vec3 x, uint16_t y);"
+            "u16vec4 min(u16vec4 x, uint16_t y);"
+            "u16vec2 min(u16vec2 x, u16vec2 y);"
+            "u16vec3 min(u16vec3 x, u16vec3 y);"
+            "u16vec4 min(u16vec4 x, u16vec4 y);"
+
+            "int16_t max(int16_t x, int16_t y);"
+            "i16vec2 max(i16vec2 x, int16_t y);"
+            "i16vec3 max(i16vec3 x, int16_t y);"
+            "i16vec4 max(i16vec4 x, int16_t y);"
+            "i16vec2 max(i16vec2 x, i16vec2 y);"
+            "i16vec3 max(i16vec3 x, i16vec3 y);"
+            "i16vec4 max(i16vec4 x, i16vec4 y);"
+
+            "uint16_t max(uint16_t x, uint16_t y);"
+            "u16vec2 max(u16vec2 x, uint16_t y);"
+            "u16vec3 max(u16vec3 x, uint16_t y);"
+            "u16vec4 max(u16vec4 x, uint16_t y);"
+            "u16vec2 max(u16vec2 x, u16vec2 y);"
+            "u16vec3 max(u16vec3 x, u16vec3 y);"
+            "u16vec4 max(u16vec4 x, u16vec4 y);"
+
+            "int16_t    clamp(int16_t x, int16_t minVal, int16_t maxVal);"
+            "i16vec2  clamp(i16vec2  x, int16_t minVal, int16_t maxVal);"
+            "i16vec3  clamp(i16vec3  x, int16_t minVal, int16_t maxVal);"
+            "i16vec4  clamp(i16vec4  x, int16_t minVal, int16_t maxVal);"
+            "i16vec2  clamp(i16vec2  x, i16vec2  minVal, i16vec2  maxVal);"
+            "i16vec3  clamp(i16vec3  x, i16vec3  minVal, i16vec3  maxVal);"
+            "i16vec4  clamp(i16vec4  x, i16vec4  minVal, i16vec4  maxVal);"
+
+            "uint16_t   clamp(uint16_t x, uint16_t minVal, uint16_t maxVal);"
+            "u16vec2  clamp(u16vec2  x, uint16_t minVal, uint16_t maxVal);"
+            "u16vec3  clamp(u16vec3  x, uint16_t minVal, uint16_t maxVal);"
+            "u16vec4  clamp(u16vec4  x, uint16_t minVal, uint16_t maxVal);"
+            "u16vec2  clamp(u16vec2  x, u16vec2  minVal, u16vec2  maxVal);"
+            "u16vec3  clamp(u16vec3  x, u16vec3  minVal, u16vec3  maxVal);"
+            "u16vec4  clamp(u16vec4  x, u16vec4  minVal, u16vec4  maxVal);"
+
+            "int16_t  mix(int16_t,  int16_t,  bool);"
+            "i16vec2  mix(i16vec2,  i16vec2,  bvec2);"
+            "i16vec3  mix(i16vec3,  i16vec3,  bvec3);"
+            "i16vec4  mix(i16vec4,  i16vec4,  bvec4);"
+            "uint16_t mix(uint16_t, uint16_t, bool);"
+            "u16vec2  mix(u16vec2,  u16vec2,  bvec2);"
+            "u16vec3  mix(u16vec3,  u16vec3,  bvec3);"
+            "u16vec4  mix(u16vec4,  u16vec4,  bvec4);"
+
+            "float16_t frexp(float16_t, out int16_t);"
+            "f16vec2   frexp(f16vec2,   out i16vec2);"
+            "f16vec3   frexp(f16vec3,   out i16vec3);"
+            "f16vec4   frexp(f16vec4,   out i16vec4);"
+
+            "float16_t ldexp(float16_t, int16_t);"
+            "f16vec2   ldexp(f16vec2,   i16vec2);"
+            "f16vec3   ldexp(f16vec3,   i16vec3);"
+            "f16vec4   ldexp(f16vec4,   i16vec4);"
+
+            "int16_t halfBitsToInt16(float16_t);"
+            "i16vec2 halfBitsToInt16(f16vec2);"
+            "i16vec3 halhBitsToInt16(f16vec3);"
+            "i16vec4 halfBitsToInt16(f16vec4);"
+
+            "uint16_t halfBitsToUint16(float16_t);"
+            "u16vec2  halfBitsToUint16(f16vec2);"
+            "u16vec3  halfBitsToUint16(f16vec3);"
+            "u16vec4  halfBitsToUint16(f16vec4);"
+
+            "int16_t float16BitsToInt16(float16_t);"
+            "i16vec2 float16BitsToInt16(f16vec2);"
+            "i16vec3 float16BitsToInt16(f16vec3);"
+            "i16vec4 float16BitsToInt16(f16vec4);"
+
+            "uint16_t float16BitsToUint16(float16_t);"
+            "u16vec2  float16BitsToUint16(f16vec2);"
+            "u16vec3  float16BitsToUint16(f16vec3);"
+            "u16vec4  float16BitsToUint16(f16vec4);"
+
+            "float16_t int16BitsToFloat16(int16_t);"
+            "f16vec2   int16BitsToFloat16(i16vec2);"
+            "f16vec3   int16BitsToFloat16(i16vec3);"
+            "f16vec4   int16BitsToFloat16(i16vec4);"
+
+            "float16_t uint16BitsToFloat16(uint16_t);"
+            "f16vec2   uint16BitsToFloat16(u16vec2);"
+            "f16vec3   uint16BitsToFloat16(u16vec3);"
+            "f16vec4   uint16BitsToFloat16(u16vec4);"
+
+            "float16_t int16BitsToHalf(int16_t);"
+            "f16vec2   int16BitsToHalf(i16vec2);"
+            "f16vec3   int16BitsToHalf(i16vec3);"
+            "f16vec4   int16BitsToHalf(i16vec4);"
+
+            "float16_t uint16BitsToHalf(uint16_t);"
+            "f16vec2   uint16BitsToHalf(u16vec2);"
+            "f16vec3   uint16BitsToHalf(u16vec3);"
+            "f16vec4   uint16BitsToHalf(u16vec4);"
+
+            "int      packInt2x16(i16vec2);"
+            "uint     packUint2x16(u16vec2);"
+            "int64_t  packInt4x16(i16vec4);"
+            "uint64_t packUint4x16(u16vec4);"
+            "i16vec2  unpackInt2x16(int);"
+            "u16vec2  unpackUint2x16(uint);"
+            "i16vec4  unpackInt4x16(int64_t);"
+            "u16vec4  unpackUint4x16(uint64_t);"
+
+            "bvec2 lessThan(i16vec2, i16vec2);"
+            "bvec3 lessThan(i16vec3, i16vec3);"
+            "bvec4 lessThan(i16vec4, i16vec4);"
+            "bvec2 lessThan(u16vec2, u16vec2);"
+            "bvec3 lessThan(u16vec3, u16vec3);"
+            "bvec4 lessThan(u16vec4, u16vec4);"
+
+            "bvec2 lessThanEqual(i16vec2, i16vec2);"
+            "bvec3 lessThanEqual(i16vec3, i16vec3);"
+            "bvec4 lessThanEqual(i16vec4, i16vec4);"
+            "bvec2 lessThanEqual(u16vec2, u16vec2);"
+            "bvec3 lessThanEqual(u16vec3, u16vec3);"
+            "bvec4 lessThanEqual(u16vec4, u16vec4);"
+
+            "bvec2 greaterThan(i16vec2, i16vec2);"
+            "bvec3 greaterThan(i16vec3, i16vec3);"
+            "bvec4 greaterThan(i16vec4, i16vec4);"
+            "bvec2 greaterThan(u16vec2, u16vec2);"
+            "bvec3 greaterThan(u16vec3, u16vec3);"
+            "bvec4 greaterThan(u16vec4, u16vec4);"
+
+            "bvec2 greaterThanEqual(i16vec2, i16vec2);"
+            "bvec3 greaterThanEqual(i16vec3, i16vec3);"
+            "bvec4 greaterThanEqual(i16vec4, i16vec4);"
+            "bvec2 greaterThanEqual(u16vec2, u16vec2);"
+            "bvec3 greaterThanEqual(u16vec3, u16vec3);"
+            "bvec4 greaterThanEqual(u16vec4, u16vec4);"
+
+            "bvec2 equal(i16vec2, i16vec2);"
+            "bvec3 equal(i16vec3, i16vec3);"
+            "bvec4 equal(i16vec4, i16vec4);"
+            "bvec2 equal(u16vec2, u16vec2);"
+            "bvec3 equal(u16vec3, u16vec3);"
+            "bvec4 equal(u16vec4, u16vec4);"
+
+            "bvec2 notEqual(i16vec2, i16vec2);"
+            "bvec3 notEqual(i16vec3, i16vec3);"
+            "bvec4 notEqual(i16vec4, i16vec4);"
+            "bvec2 notEqual(u16vec2, u16vec2);"
+            "bvec3 notEqual(u16vec3, u16vec3);"
+            "bvec4 notEqual(u16vec4, u16vec4);"
+
+            "  int16_t bitfieldExtract(  int16_t, int16_t, int16_t);"
+            "i16vec2 bitfieldExtract(i16vec2, int16_t, int16_t);"
+            "i16vec3 bitfieldExtract(i16vec3, int16_t, int16_t);"
+            "i16vec4 bitfieldExtract(i16vec4, int16_t, int16_t);"
+
+            " uint16_t bitfieldExtract( uint16_t, int16_t, int16_t);"
+            "u16vec2 bitfieldExtract(u16vec2, int16_t, int16_t);"
+            "u16vec3 bitfieldExtract(u16vec3, int16_t, int16_t);"
+            "u16vec4 bitfieldExtract(u16vec4, int16_t, int16_t);"
+
+            "  int16_t bitfieldInsert(  int16_t base,   int16_t, int16_t, int16_t);"
+            "i16vec2 bitfieldInsert(i16vec2 base, i16vec2, int16_t, int16_t);"
+            "i16vec3 bitfieldInsert(i16vec3 base, i16vec3, int16_t, int16_t);"
+            "i16vec4 bitfieldInsert(i16vec4 base, i16vec4, int16_t, int16_t);"
+
+            " uint16_t bitfieldInsert( uint16_t base,  uint16_t, int16_t, int16_t);"
+            "u16vec2 bitfieldInsert(u16vec2 base, u16vec2, int16_t, int16_t);"
+            "u16vec3 bitfieldInsert(u16vec3 base, u16vec3, int16_t, int16_t);"
+            "u16vec4 bitfieldInsert(u16vec4 base, u16vec4, int16_t, int16_t);"
+
+            "  int16_t bitCount(  int16_t);"
+            "i16vec2 bitCount(i16vec2);"
+            "i16vec3 bitCount(i16vec3);"
+            "i16vec4 bitCount(i16vec4);"
+
+            "  int16_t bitCount( uint16_t);"
+            "i16vec2 bitCount(u16vec2);"
+            "i16vec3 bitCount(u16vec3);"
+            "i16vec4 bitCount(u16vec4);"
+
+            "  int16_t findLSB(  int16_t);"
+            "i16vec2 findLSB(i16vec2);"
+            "i16vec3 findLSB(i16vec3);"
+            "i16vec4 findLSB(i16vec4);"
+
+            "  int16_t findLSB( uint16_t);"
+            "i16vec2 findLSB(u16vec2);"
+            "i16vec3 findLSB(u16vec3);"
+            "i16vec4 findLSB(u16vec4);"
+
+            "  int16_t findMSB(  int16_t);"
+            "i16vec2 findMSB(i16vec2);"
+            "i16vec3 findMSB(i16vec3);"
+            "i16vec4 findMSB(i16vec4);"
+
+            "  int16_t findMSB( uint16_t);"
+            "i16vec2 findMSB(u16vec2);"
+            "i16vec3 findMSB(u16vec3);"
+            "i16vec4 findMSB(u16vec4);"
+
+            "int16_t  pack16(i8vec2);"
+            "uint16_t pack16(u8vec2);"
+            "int32_t  pack32(i8vec4);"
+            "uint32_t pack32(u8vec4);"
+            "int32_t  pack32(i16vec2);"
+            "uint32_t pack32(u16vec2);"
+            "int64_t  pack64(i16vec4);"
+            "uint64_t pack64(u16vec4);"
+            "int64_t  pack64(i32vec2);"
+            "uint64_t pack64(u32vec2);"
+
+            "i8vec2   unpack8(int16_t);"
+            "u8vec2   unpack8(uint16_t);"
+            "i8vec4   unpack8(int32_t);"
+            "u8vec4   unpack8(uint32_t);"
+            "i16vec2  unpack16(int32_t);"
+            "u16vec2  unpack16(uint32_t);"
+            "i16vec4  unpack16(int64_t);"
+            "u16vec4  unpack16(uint64_t);"
+            "i32vec2  unpack32(int64_t);"
+            "u32vec2  unpack32(uint64_t);"
+
+            "float64_t radians(float64_t);"
+            "f64vec2   radians(f64vec2);"
+            "f64vec3   radians(f64vec3);"
+            "f64vec4   radians(f64vec4);"
+
+            "float64_t degrees(float64_t);"
+            "f64vec2   degrees(f64vec2);"
+            "f64vec3   degrees(f64vec3);"
+            "f64vec4   degrees(f64vec4);"
+
+            "float64_t sin(float64_t);"
+            "f64vec2   sin(f64vec2);"
+            "f64vec3   sin(f64vec3);"
+            "f64vec4   sin(f64vec4);"
+
+            "float64_t cos(float64_t);"
+            "f64vec2   cos(f64vec2);"
+            "f64vec3   cos(f64vec3);"
+            "f64vec4   cos(f64vec4);"
+
+            "float64_t tan(float64_t);"
+            "f64vec2   tan(f64vec2);"
+            "f64vec3   tan(f64vec3);"
+            "f64vec4   tan(f64vec4);"
+
+            "float64_t asin(float64_t);"
+            "f64vec2   asin(f64vec2);"
+            "f64vec3   asin(f64vec3);"
+            "f64vec4   asin(f64vec4);"
+
+            "float64_t acos(float64_t);"
+            "f64vec2   acos(f64vec2);"
+            "f64vec3   acos(f64vec3);"
+            "f64vec4   acos(f64vec4);"
+
+            "float64_t atan(float64_t, float64_t);"
+            "f64vec2   atan(f64vec2,   f64vec2);"
+            "f64vec3   atan(f64vec3,   f64vec3);"
+            "f64vec4   atan(f64vec4,   f64vec4);"
+
+            "float64_t atan(float64_t);"
+            "f64vec2   atan(f64vec2);"
+            "f64vec3   atan(f64vec3);"
+            "f64vec4   atan(f64vec4);"
+
+            "float64_t sinh(float64_t);"
+            "f64vec2   sinh(f64vec2);"
+            "f64vec3   sinh(f64vec3);"
+            "f64vec4   sinh(f64vec4);"
+
+            "float64_t cosh(float64_t);"
+            "f64vec2   cosh(f64vec2);"
+            "f64vec3   cosh(f64vec3);"
+            "f64vec4   cosh(f64vec4);"
+
+            "float64_t tanh(float64_t);"
+            "f64vec2   tanh(f64vec2);"
+            "f64vec3   tanh(f64vec3);"
+            "f64vec4   tanh(f64vec4);"
+
+            "float64_t asinh(float64_t);"
+            "f64vec2   asinh(f64vec2);"
+            "f64vec3   asinh(f64vec3);"
+            "f64vec4   asinh(f64vec4);"
+
+            "float64_t acosh(float64_t);"
+            "f64vec2   acosh(f64vec2);"
+            "f64vec3   acosh(f64vec3);"
+            "f64vec4   acosh(f64vec4);"
+
+            "float64_t atanh(float64_t);"
+            "f64vec2   atanh(f64vec2);"
+            "f64vec3   atanh(f64vec3);"
+            "f64vec4   atanh(f64vec4);"
+
+            "float64_t pow(float64_t, float64_t);"
+            "f64vec2   pow(f64vec2,   f64vec2);"
+            "f64vec3   pow(f64vec3,   f64vec3);"
+            "f64vec4   pow(f64vec4,   f64vec4);"
+
+            "float64_t exp(float64_t);"
+            "f64vec2   exp(f64vec2);"
+            "f64vec3   exp(f64vec3);"
+            "f64vec4   exp(f64vec4);"
+
+            "float64_t log(float64_t);"
+            "f64vec2   log(f64vec2);"
+            "f64vec3   log(f64vec3);"
+            "f64vec4   log(f64vec4);"
+
+            "float64_t exp2(float64_t);"
+            "f64vec2   exp2(f64vec2);"
+            "f64vec3   exp2(f64vec3);"
+            "f64vec4   exp2(f64vec4);"
+
+            "float64_t log2(float64_t);"
+            "f64vec2   log2(f64vec2);"
+            "f64vec3   log2(f64vec3);"
+            "f64vec4   log2(f64vec4);"
+            "\n");
+        }
+        if (profile != EEsProfile && version >= 450) {
+            stageBuiltins[EShLangFragment].append(derivativesAndControl64bits);
+            stageBuiltins[EShLangFragment].append(
+                "float64_t interpolateAtCentroid(float64_t);"
+                "f64vec2   interpolateAtCentroid(f64vec2);"
+                "f64vec3   interpolateAtCentroid(f64vec3);"
+                "f64vec4   interpolateAtCentroid(f64vec4);"
+
+                "float64_t interpolateAtSample(float64_t, int);"
+                "f64vec2   interpolateAtSample(f64vec2,   int);"
+                "f64vec3   interpolateAtSample(f64vec3,   int);"
+                "f64vec4   interpolateAtSample(f64vec4,   int);"
+
+                "float64_t interpolateAtOffset(float64_t, f64vec2);"
+                "f64vec2   interpolateAtOffset(f64vec2,   f64vec2);"
+                "f64vec3   interpolateAtOffset(f64vec3,   f64vec2);"
+                "f64vec4   interpolateAtOffset(f64vec4,   f64vec2);"
+
+                "\n");
+
+    }
 
     //============================================================================
     //
@@ -2722,6 +4877,16 @@
         stageBuiltins[EShLangCompute].append(
             "void barrier();"
             );
+#ifdef NV_EXTENSIONS
+    if ((profile != EEsProfile && version >= 450) || (profile == EEsProfile && version >= 320)) {
+        stageBuiltins[EShLangMeshNV].append(
+            "void barrier();"
+            );
+        stageBuiltins[EShLangTaskNV].append(
+            "void barrier();"
+            );
+    }
+#endif
     if ((profile != EEsProfile && version >= 130) || esBarrier)
         commonBuiltins.append(
             "void memoryBarrier();"
@@ -2737,6 +4902,21 @@
             "void groupMemoryBarrier();"
             );
     }
+#ifdef NV_EXTENSIONS
+    if ((profile != EEsProfile && version >= 450) || (profile == EEsProfile && version >= 320)) {
+        stageBuiltins[EShLangMeshNV].append(
+            "void memoryBarrierShared();"
+            "void groupMemoryBarrier();"
+        );
+        stageBuiltins[EShLangTaskNV].append(
+            "void memoryBarrierShared();"
+            "void groupMemoryBarrier();"
+        );
+    }
+#endif
+
+    commonBuiltins.append("void controlBarrier(int, int, int, int);\n"
+                          "void memoryBarrier(int, int, int);\n");
 
     //============================================================================
     //
@@ -2780,61 +4960,13 @@
             "\n");
     }
 
-    stageBuiltins[EShLangFragment].append(
-        "float dFdx(float p);"
-        "vec2  dFdx(vec2  p);"
-        "vec3  dFdx(vec3  p);"
-        "vec4  dFdx(vec4  p);"
-
-        "float dFdy(float p);"
-        "vec2  dFdy(vec2  p);"
-        "vec3  dFdy(vec3  p);"
-        "vec4  dFdy(vec4  p);"
-
-        "float fwidth(float p);"
-        "vec2  fwidth(vec2  p);"
-        "vec3  fwidth(vec3  p);"
-        "vec4  fwidth(vec4  p);"
-
-        "\n");
+    stageBuiltins[EShLangFragment].append(derivatives);
+    stageBuiltins[EShLangFragment].append("\n");
 
     // GL_ARB_derivative_control
     if (profile != EEsProfile && version >= 400) {
-        stageBuiltins[EShLangFragment].append(
-            "float dFdxFine(float p);"
-            "vec2  dFdxFine(vec2  p);"
-            "vec3  dFdxFine(vec3  p);"
-            "vec4  dFdxFine(vec4  p);"
-
-            "float dFdyFine(float p);"
-            "vec2  dFdyFine(vec2  p);"
-            "vec3  dFdyFine(vec3  p);"
-            "vec4  dFdyFine(vec4  p);"
-
-            "float fwidthFine(float p);"
-            "vec2  fwidthFine(vec2  p);"
-            "vec3  fwidthFine(vec3  p);"
-            "vec4  fwidthFine(vec4  p);"
-
-            "\n");
-
-        stageBuiltins[EShLangFragment].append(
-            "float dFdxCoarse(float p);"
-            "vec2  dFdxCoarse(vec2  p);"
-            "vec3  dFdxCoarse(vec3  p);"
-            "vec4  dFdxCoarse(vec4  p);"
-
-            "float dFdyCoarse(float p);"
-            "vec2  dFdyCoarse(vec2  p);"
-            "vec3  dFdyCoarse(vec3  p);"
-            "vec4  dFdyCoarse(vec4  p);"
-
-            "float fwidthCoarse(float p);"
-            "vec2  fwidthCoarse(vec2  p);"
-            "vec3  fwidthCoarse(vec3  p);"
-            "vec4  fwidthCoarse(vec4  p);"
-
-            "\n");
+        stageBuiltins[EShLangFragment].append(derivativeControls);
+        stageBuiltins[EShLangFragment].append("\n");
     }
 
     // GL_OES_shader_multisample_interpolation
@@ -2888,52 +5020,10 @@
 
     // GL_AMD_gpu_shader_half_float
     if (profile != EEsProfile && version >= 450) {
+        stageBuiltins[EShLangFragment].append(derivativesAndControl16bits);
+        stageBuiltins[EShLangFragment].append("\n");
+
         stageBuiltins[EShLangFragment].append(
-            "float16_t dFdx(float16_t);"
-            "f16vec2   dFdx(f16vec2);"
-            "f16vec3   dFdx(f16vec3);"
-            "f16vec4   dFdx(f16vec4);"
-
-            "float16_t dFdy(float16_t);"
-            "f16vec2   dFdy(f16vec2);"
-            "f16vec3   dFdy(f16vec3);"
-            "f16vec4   dFdy(f16vec4);"
-
-            "float16_t dFdxFine(float16_t);"
-            "f16vec2   dFdxFine(f16vec2);"
-            "f16vec3   dFdxFine(f16vec3);"
-            "f16vec4   dFdxFine(f16vec4);"
-
-            "float16_t dFdyFine(float16_t);"
-            "f16vec2   dFdyFine(f16vec2);"
-            "f16vec3   dFdyFine(f16vec3);"
-            "f16vec4   dFdyFine(f16vec4);"
-
-            "float16_t dFdxCoarse(float16_t);"
-            "f16vec2   dFdxCoarse(f16vec2);"
-            "f16vec3   dFdxCoarse(f16vec3);"
-            "f16vec4   dFdxCoarse(f16vec4);"
-
-            "float16_t dFdyCoarse(float16_t);"
-            "f16vec2   dFdyCoarse(f16vec2);"
-            "f16vec3   dFdyCoarse(f16vec3);"
-            "f16vec4   dFdyCoarse(f16vec4);"
-
-            "float16_t fwidth(float16_t);"
-            "f16vec2   fwidth(f16vec2);"
-            "f16vec3   fwidth(f16vec3);"
-            "f16vec4   fwidth(f16vec4);"
-
-            "float16_t fwidthFine(float16_t);"
-            "f16vec2   fwidthFine(f16vec2);"
-            "f16vec3   fwidthFine(f16vec3);"
-            "f16vec4   fwidthFine(f16vec4);"
-
-            "float16_t fwidthCoarse(float16_t);"
-            "f16vec2   fwidthCoarse(f16vec2);"
-            "f16vec3   fwidthCoarse(f16vec3);"
-            "f16vec4   fwidthCoarse(f16vec4);"
-
             "float16_t interpolateAtCentroid(float16_t);"
             "f16vec2   interpolateAtCentroid(f16vec2);"
             "f16vec3   interpolateAtCentroid(f16vec3);"
@@ -2951,6 +5041,70 @@
 
             "\n");
     }
+
+    // GL_AMD_shader_fragment_mask
+    if (profile != EEsProfile && version >= 450 && spvVersion.vulkan > 0) {
+        stageBuiltins[EShLangFragment].append(
+            "uint fragmentMaskFetchAMD(subpassInputMS);"
+            "uint fragmentMaskFetchAMD(isubpassInputMS);"
+            "uint fragmentMaskFetchAMD(usubpassInputMS);"
+
+            "vec4  fragmentFetchAMD(subpassInputMS,  uint);"
+            "ivec4 fragmentFetchAMD(isubpassInputMS, uint);"
+            "uvec4 fragmentFetchAMD(usubpassInputMS, uint);"
+
+            "\n");
+        }
+#endif
+
+#ifdef NV_EXTENSIONS
+
+    // Builtins for GL_NV_ray_tracing
+    if (profile != EEsProfile && version >= 460) {
+        stageBuiltins[EShLangRayGenNV].append(
+            "void traceNV(accelerationStructureNV,uint,uint,uint,uint,uint,vec3,float,vec3,float,int);"
+            "void executeCallableNV(uint, int);"
+            "\n");
+        stageBuiltins[EShLangIntersectNV].append(
+            "bool reportIntersectionNV(float, uint);"
+            "\n");
+        stageBuiltins[EShLangAnyHitNV].append(
+            "void ignoreIntersectionNV();"
+            "void terminateRayNV();"
+            "\n");
+        stageBuiltins[EShLangClosestHitNV].append(
+            "void traceNV(accelerationStructureNV,uint,uint,uint,uint,uint,vec3,float,vec3,float,int);"
+            "void executeCallableNV(uint, int);"
+            "\n");
+        stageBuiltins[EShLangMissNV].append(
+            "void traceNV(accelerationStructureNV,uint,uint,uint,uint,uint,vec3,float,vec3,float,int);"
+            "void executeCallableNV(uint, int);"
+            "\n");
+        stageBuiltins[EShLangCallableNV].append(
+            "void executeCallableNV(uint, int);"
+            "\n");
+    }
+
+    //E_SPV_NV_compute_shader_derivatives
+    
+    stageBuiltins[EShLangCompute].append(derivatives);
+    stageBuiltins[EShLangCompute].append(derivativeControls);
+    stageBuiltins[EShLangCompute].append("\n");
+    
+
+    if (profile != EEsProfile && version >= 450) {
+
+        stageBuiltins[EShLangCompute].append(derivativesAndControl16bits);
+        stageBuiltins[EShLangCompute].append(derivativesAndControl64bits);
+        stageBuiltins[EShLangCompute].append("\n");
+    }
+
+    // Builtins for GL_NV_mesh_shader
+    if ((profile != EEsProfile && version >= 450) || (profile == EEsProfile && version >= 320)) {
+        stageBuiltins[EShLangMeshNV].append(
+            "void writePackedPrimitiveIndices4x8NV(uint, uint);"
+            "\n");   
+    }
 #endif
 
     //============================================================================
@@ -3132,6 +5286,93 @@
             "\n");
     }
 
+#ifdef NV_EXTENSIONS
+    //============================================================================
+    //
+    // Define the interface to the mesh/task shader.
+    //
+    //============================================================================
+
+    if ((profile != EEsProfile && version >= 450) || (profile == EEsProfile && version >= 320)) {
+        // per-vertex attributes
+        stageBuiltins[EShLangMeshNV].append(
+            "out gl_MeshPerVertexNV {"
+                "vec4 gl_Position;"
+                "float gl_PointSize;"
+                "float gl_ClipDistance[];"
+                "float gl_CullDistance[];"
+                "perviewNV vec4 gl_PositionPerViewNV[];"
+                "perviewNV float gl_ClipDistancePerViewNV[][];"
+                "perviewNV float gl_CullDistancePerViewNV[][];"
+            "} gl_MeshVerticesNV[];"
+        );
+
+        // per-primitive attributes
+        stageBuiltins[EShLangMeshNV].append(
+            "perprimitiveNV out gl_MeshPerPrimitiveNV {"
+                "int gl_PrimitiveID;"
+                "int gl_Layer;"
+                "int gl_ViewportIndex;"
+                "int gl_ViewportMask[];"
+                "perviewNV int gl_LayerPerViewNV[];"
+                "perviewNV int gl_ViewportMaskPerViewNV[][];"
+            "} gl_MeshPrimitivesNV[];"
+        );
+
+        stageBuiltins[EShLangMeshNV].append(
+            "out uint gl_PrimitiveCountNV;"
+            "out uint gl_PrimitiveIndicesNV[];"
+
+            "in uint gl_MeshViewCountNV;"
+            "in uint gl_MeshViewIndicesNV[4];"
+
+            "const highp uvec3 gl_WorkGroupSize = uvec3(1,1,1);"
+
+            "in highp uvec3 gl_WorkGroupID;"
+            "in highp uvec3 gl_LocalInvocationID;"
+
+            "in highp uvec3 gl_GlobalInvocationID;"
+            "in highp uint gl_LocalInvocationIndex;"
+
+            "\n");
+
+        stageBuiltins[EShLangTaskNV].append(
+            "out uint gl_TaskCountNV;"
+
+            "const highp uvec3 gl_WorkGroupSize = uvec3(1,1,1);"
+
+            "in highp uvec3 gl_WorkGroupID;"
+            "in highp uvec3 gl_LocalInvocationID;"
+
+            "in highp uvec3 gl_GlobalInvocationID;"
+            "in highp uint gl_LocalInvocationIndex;"
+
+            "\n");
+    }
+
+    if (profile != EEsProfile && version >= 450) {
+        stageBuiltins[EShLangMeshNV].append(
+            "in highp int gl_DeviceIndex;"     // GL_EXT_device_group
+            "in int gl_DrawIDARB;"             // GL_ARB_shader_draw_parameters
+            "\n");
+
+        stageBuiltins[EShLangTaskNV].append(
+            "in highp int gl_DeviceIndex;"     // GL_EXT_device_group
+            "in int gl_DrawIDARB;"             // GL_ARB_shader_draw_parameters
+            "\n");
+
+        if (version >= 460) {
+            stageBuiltins[EShLangMeshNV].append(
+                "in int gl_DrawID;"
+                "\n");
+
+            stageBuiltins[EShLangTaskNV].append(
+                "in int gl_DrawID;"
+                "\n");
+        }
+    }
+#endif
+
     //============================================================================
     //
     // Define the interface to the vertex shader.
@@ -3238,7 +5479,7 @@
             stageBuiltins[EShLangVertex].append(
                 "int gl_InstanceID;"          // needs qualifier fixed later
                 );
-        if (spvVersion.vulkan >= 100 && version >= 140)
+        if (spvVersion.vulkan > 0 && version >= 140)
             stageBuiltins[EShLangVertex].append(
                 "in int gl_VertexIndex;"
                 "in int gl_InstanceIndex;"
@@ -3250,12 +5491,23 @@
                 "in int gl_DrawIDARB;"
                 );
         }
+        if (version >= 410) {
+            stageBuiltins[EShLangVertex].append(
+                "out int gl_ViewportIndex;"
+                "out int gl_Layer;"
+                );
+        }
+        if (version >= 460) {
+            stageBuiltins[EShLangVertex].append(
+                "in int gl_BaseVertex;"
+                "in int gl_BaseInstance;"
+                "in int gl_DrawID;"
+                );
+        }
 
 #ifdef NV_EXTENSIONS
         if (version >= 450)
             stageBuiltins[EShLangVertex].append(
-                "out int gl_ViewportIndex;"
-                "out int gl_Layer;"
                 "out int gl_ViewportMask[];"             // GL_NV_viewport_array2
                 "out int gl_SecondaryViewportMaskNV[];"  // GL_NV_stereo_view_rendering
                 "out vec4 gl_SecondaryPositionNV;"       // GL_NV_stereo_view_rendering
@@ -3277,7 +5529,7 @@
                     "in highp int gl_VertexID;"      // needs qualifier fixed later
                     "in highp int gl_InstanceID;"    // needs qualifier fixed later
                     );
-            if (spvVersion.vulkan >= 100)
+            if (spvVersion.vulkan > 0)
                 stageBuiltins[EShLangVertex].append(
                     "in highp int gl_VertexIndex;"
                     "in highp int gl_InstanceIndex;"
@@ -3305,6 +5557,12 @@
             "\n");
     }
 
+    if (version >= 300 /* both ES and non-ES */) {
+        stageBuiltins[EShLangVertex].append(
+            "in highp uint gl_ViewID_OVR;"     // GL_OVR_multiview, GL_OVR_multiview2
+            "\n");
+    }
+
 
     //============================================================================
     //
@@ -3366,6 +5624,11 @@
             "out int gl_PrimitiveID;"
             "out int gl_Layer;");
 
+        if (version >= 150)
+            stageBuiltins[EShLangGeometry].append(
+            "out int gl_ViewportIndex;"
+            );
+
         if (profile == ECompatibilityProfile && version < 400)
             stageBuiltins[EShLangGeometry].append(
             "out vec4 gl_ClipVertex;"
@@ -3375,11 +5638,6 @@
             stageBuiltins[EShLangGeometry].append(
             "in int gl_InvocationID;"
             );
-        // GL_ARB_viewport_array
-        if (version >= 150)
-            stageBuiltins[EShLangGeometry].append(
-            "out int gl_ViewportIndex;"
-            );
 
 #ifdef NV_EXTENSIONS
         if (version >= 450)
@@ -3456,8 +5714,6 @@
             stageBuiltins[EShLangTessControl].append(
                 "float gl_CullDistance[];"
 #ifdef NV_EXTENSIONS
-                "int  gl_ViewportIndex;"
-                "int  gl_Layer;"
                 "int  gl_ViewportMask[];"             // GL_NV_viewport_array2
                 "vec4 gl_SecondaryPositionNV;"        // GL_NV_stereo_view_rendering
                 "int  gl_SecondaryViewportMaskNV[];"  // GL_NV_stereo_view_rendering
@@ -3471,6 +5727,13 @@
             "patch out float gl_TessLevelOuter[4];"
             "patch out float gl_TessLevelInner[2];"
             "\n");
+
+        if (version >= 410)
+            stageBuiltins[EShLangTessControl].append(
+                "out int gl_ViewportIndex;"
+                "out int gl_Layer;"
+                "\n");
+
     } else {
         // Note:  "in gl_PerVertex {...} gl_in[gl_MaxPatchVertices];" is declared in initialize() below,
         // as it depends on the resource sizing of gl_MaxPatchVertices.
@@ -3542,11 +5805,15 @@
             "};"
             "\n");
 
+        if (version >= 410)
+            stageBuiltins[EShLangTessEvaluation].append(
+                "out int gl_ViewportIndex;"
+                "out int gl_Layer;"
+                "\n");
+
 #ifdef NV_EXTENSIONS
         if (version >= 450)
             stageBuiltins[EShLangTessEvaluation].append(
-                "out int  gl_ViewportIndex;"
-                "out int  gl_Layer;"
                 "out int  gl_ViewportMask[];"             // GL_NV_viewport_array2
                 "out vec4 gl_SecondaryPositionNV;"        // GL_NV_stereo_view_rendering
                 "out int  gl_SecondaryViewportMaskNV[];"  // GL_NV_stereo_view_rendering
@@ -3601,6 +5868,10 @@
             stageBuiltins[EShLangFragment].append(
                 "vec2 gl_PointCoord;"  // needs qualifier fixed later
                 );
+        if (version >= 140)
+            stageBuiltins[EShLangFragment].append(
+                "out int gl_FragStencilRefARB;"
+                );
         if (IncludeLegacy(version, profile, spvVersion) || (! ForwardCompatibility && version < 420))
             stageBuiltins[EShLangFragment].append(
                 "vec4 gl_FragColor;"   // needs qualifier fixed later
@@ -3668,6 +5939,12 @@
                 "bool gl_HelperInvocation;"     // needs qualifier fixed later
                 );
 
+        if (version >= 450)
+            stageBuiltins[EShLangFragment].append( // GL_EXT_fragment_invocation_density
+                "flat in ivec2 gl_FragSizeEXT;"
+                "flat in int   gl_FragInvocationCountEXT;"
+                );
+
 #ifdef AMD_EXTENSIONS
         if (version >= 450)
             stageBuiltins[EShLangFragment].append(
@@ -3680,6 +5957,21 @@
                 "in vec3 gl_BaryCoordPullModelAMD;"
                 );
 #endif
+
+#ifdef NV_EXTENSIONS
+        if (version >= 430)
+            stageBuiltins[EShLangFragment].append(
+                "in bool gl_FragFullyCoveredNV;"
+                );
+        if (version >= 450)
+            stageBuiltins[EShLangFragment].append(
+                "flat in ivec2 gl_FragmentSizeNV;"          // GL_NV_shading_rate_image
+                "flat in int   gl_InvocationsPerPixelNV;"
+                "in vec3 gl_BaryCoordNV;"                   // GL_NV_fragment_shader_barycentric
+                "in vec3 gl_BaryCoordNoPerspNV;"
+                );
+
+#endif
     } else {
         // ES profile
 
@@ -3720,6 +6012,25 @@
         stageBuiltins[EShLangFragment].append(
             "highp float gl_FragDepthEXT;"       // GL_EXT_frag_depth
             );
+
+        if (version >= 310)
+            stageBuiltins[EShLangFragment].append( // GL_EXT_fragment_invocation_density
+                "flat in ivec2 gl_FragSizeEXT;"
+                "flat in int   gl_FragInvocationCountEXT;"
+            );
+#ifdef NV_EXTENSIONS
+        if (version >= 320)
+            stageBuiltins[EShLangFragment].append( // GL_NV_shading_rate_image
+                "flat in ivec2 gl_FragmentSizeNV;"
+                "flat in int   gl_InvocationsPerPixelNV;"
+            );
+        if (version >= 320)
+            stageBuiltins[EShLangFragment].append(
+                "in vec3 gl_BaryCoordNV;"
+                "in vec3 gl_BaryCoordNoPerspNV;"
+                );
+#endif
+
     }
     stageBuiltins[EShLangFragment].append("\n");
 
@@ -3728,17 +6039,34 @@
 
     // GL_ARB_shader_ballot
     if (profile != EEsProfile && version >= 450) {
-        commonBuiltins.append(
+        const char* ballotDecls = 
             "uniform uint gl_SubGroupSizeARB;"
-
             "in uint     gl_SubGroupInvocationARB;"
             "in uint64_t gl_SubGroupEqMaskARB;"
             "in uint64_t gl_SubGroupGeMaskARB;"
             "in uint64_t gl_SubGroupGtMaskARB;"
             "in uint64_t gl_SubGroupLeMaskARB;"
             "in uint64_t gl_SubGroupLtMaskARB;"
-
-            "\n");
+            "\n";
+        const char* fragmentBallotDecls = 
+            "uniform uint gl_SubGroupSizeARB;"
+            "flat in uint     gl_SubGroupInvocationARB;"
+            "flat in uint64_t gl_SubGroupEqMaskARB;"
+            "flat in uint64_t gl_SubGroupGeMaskARB;"
+            "flat in uint64_t gl_SubGroupGtMaskARB;"
+            "flat in uint64_t gl_SubGroupLeMaskARB;"
+            "flat in uint64_t gl_SubGroupLtMaskARB;"
+            "\n";
+        stageBuiltins[EShLangVertex]        .append(ballotDecls);
+        stageBuiltins[EShLangTessControl]   .append(ballotDecls);
+        stageBuiltins[EShLangTessEvaluation].append(ballotDecls);
+        stageBuiltins[EShLangGeometry]      .append(ballotDecls);
+        stageBuiltins[EShLangCompute]       .append(ballotDecls);
+        stageBuiltins[EShLangFragment]      .append(fragmentBallotDecls);
+#ifdef NV_EXTENSIONS
+        stageBuiltins[EShLangMeshNV]        .append(ballotDecls);
+        stageBuiltins[EShLangTaskNV]        .append(ballotDecls);
+#endif
     }
 
     if ((profile != EEsProfile && version >= 140) ||
@@ -3749,6 +6077,184 @@
             "\n");
     }
 
+    // GL_KHR_shader_subgroup
+    if (spvVersion.vulkan > 0) {
+        const char* ballotDecls = 
+            "in mediump uint  gl_SubgroupSize;"
+            "in mediump uint  gl_SubgroupInvocationID;"
+            "in highp   uvec4 gl_SubgroupEqMask;"
+            "in highp   uvec4 gl_SubgroupGeMask;"
+            "in highp   uvec4 gl_SubgroupGtMask;"
+            "in highp   uvec4 gl_SubgroupLeMask;"
+            "in highp   uvec4 gl_SubgroupLtMask;"
+            "\n";
+        const char* fragmentBallotDecls = 
+            "flat in mediump uint  gl_SubgroupSize;"
+            "flat in mediump uint  gl_SubgroupInvocationID;"
+            "flat in highp   uvec4 gl_SubgroupEqMask;"
+            "flat in highp   uvec4 gl_SubgroupGeMask;"
+            "flat in highp   uvec4 gl_SubgroupGtMask;"
+            "flat in highp   uvec4 gl_SubgroupLeMask;"
+            "flat in highp   uvec4 gl_SubgroupLtMask;"
+            "\n";
+        stageBuiltins[EShLangVertex]        .append(ballotDecls);
+        stageBuiltins[EShLangTessControl]   .append(ballotDecls);
+        stageBuiltins[EShLangTessEvaluation].append(ballotDecls);
+        stageBuiltins[EShLangGeometry]      .append(ballotDecls);
+        stageBuiltins[EShLangCompute]       .append(ballotDecls);
+        stageBuiltins[EShLangFragment]      .append(fragmentBallotDecls);
+#ifdef NV_EXTENSIONS
+        stageBuiltins[EShLangMeshNV]        .append(ballotDecls);
+        stageBuiltins[EShLangTaskNV]        .append(ballotDecls);
+#endif
+
+        stageBuiltins[EShLangCompute].append(
+            "highp   in uint  gl_NumSubgroups;"
+            "highp   in uint  gl_SubgroupID;"
+            "\n");
+#ifdef NV_EXTENSIONS
+        stageBuiltins[EShLangMeshNV].append(
+            "highp   in uint  gl_NumSubgroups;"
+            "highp   in uint  gl_SubgroupID;"
+            "\n");
+        stageBuiltins[EShLangTaskNV].append(
+            "highp   in uint  gl_NumSubgroups;"
+            "highp   in uint  gl_SubgroupID;"
+            "\n");
+#endif
+    }
+
+#ifdef NV_EXTENSIONS
+    // GL_NV_ray_tracing
+    if (profile != EEsProfile && version >= 460) {
+
+        const char *constRayFlags =
+            "const uint gl_RayFlagsNoneNV = 0U;"
+            "const uint gl_RayFlagsOpaqueNV = 1U;"
+            "const uint gl_RayFlagsNoOpaqueNV = 2U;"
+            "const uint gl_RayFlagsTerminateOnFirstHitNV = 4U;"
+            "const uint gl_RayFlagsSkipClosestHitShaderNV = 8U;"
+            "const uint gl_RayFlagsCullBackFacingTrianglesNV = 16U;"
+            "const uint gl_RayFlagsCullFrontFacingTrianglesNV = 32U;"
+            "const uint gl_RayFlagsCullOpaqueNV = 64U;"
+            "const uint gl_RayFlagsCullNoOpaqueNV = 128U;"
+            "\n";
+        const char *rayGenDecls =
+            "in    uvec3  gl_LaunchIDNV;"
+            "in    uvec3  gl_LaunchSizeNV;"
+            "\n";
+        const char *intersectDecls =
+            "in    uvec3  gl_LaunchIDNV;"
+            "in    uvec3  gl_LaunchSizeNV;"
+            "in     int   gl_PrimitiveID;"
+            "in     int   gl_InstanceID;"
+            "in     int   gl_InstanceCustomIndexNV;"
+            "in    vec3   gl_WorldRayOriginNV;"
+            "in    vec3   gl_WorldRayDirectionNV;"
+            "in    vec3   gl_ObjectRayOriginNV;"
+            "in    vec3   gl_ObjectRayDirectionNV;"
+            "in    float  gl_RayTminNV;"
+            "in    float  gl_RayTmaxNV;"
+            "in    mat4x3 gl_ObjectToWorldNV;"
+            "in    mat4x3 gl_WorldToObjectNV;"
+            "in    uint   gl_IncomingRayFlagsNV;"
+            "\n";
+        const char *hitDecls =
+            "in    uvec3  gl_LaunchIDNV;"
+            "in    uvec3  gl_LaunchSizeNV;"
+            "in     int   gl_PrimitiveID;"
+            "in     int   gl_InstanceID;"
+            "in     int   gl_InstanceCustomIndexNV;"
+            "in    vec3   gl_WorldRayOriginNV;"
+            "in    vec3   gl_WorldRayDirectionNV;"
+            "in    vec3   gl_ObjectRayOriginNV;"
+            "in    vec3   gl_ObjectRayDirectionNV;"
+            "in    float  gl_RayTminNV;"
+            "in    float  gl_RayTmaxNV;"
+            "in    float  gl_HitTNV;"
+            "in    uint   gl_HitKindNV;"
+            "in    mat4x3 gl_ObjectToWorldNV;"
+            "in    mat4x3 gl_WorldToObjectNV;"
+            "in    uint   gl_IncomingRayFlagsNV;"
+            "\n";
+        const char *missDecls =
+            "in    uvec3  gl_LaunchIDNV;"
+            "in    uvec3  gl_LaunchSizeNV;"
+            "in    vec3   gl_WorldRayOriginNV;"
+            "in    vec3   gl_WorldRayDirectionNV;"
+            "in    vec3   gl_ObjectRayOriginNV;"
+            "in    vec3   gl_ObjectRayDirectionNV;"
+            "in    float  gl_RayTminNV;"
+            "in    float  gl_RayTmaxNV;"
+            "in    uint   gl_IncomingRayFlagsNV;"
+            "\n";
+
+        const char *callableDecls =
+            "in    uvec3  gl_LaunchIDNV;"
+            "in    uvec3  gl_LaunchSizeNV;"
+            "in    uint   gl_IncomingRayFlagsNV;"
+            "\n";
+
+        stageBuiltins[EShLangRayGenNV].append(rayGenDecls);
+        stageBuiltins[EShLangRayGenNV].append(constRayFlags);
+
+        stageBuiltins[EShLangIntersectNV].append(intersectDecls);
+        stageBuiltins[EShLangIntersectNV].append(constRayFlags);
+
+        stageBuiltins[EShLangAnyHitNV].append(hitDecls);
+        stageBuiltins[EShLangAnyHitNV].append(constRayFlags);
+
+        stageBuiltins[EShLangClosestHitNV].append(hitDecls);
+        stageBuiltins[EShLangClosestHitNV].append(constRayFlags);
+
+        stageBuiltins[EShLangMissNV].append(missDecls);
+        stageBuiltins[EShLangMissNV].append(constRayFlags);
+
+        stageBuiltins[EShLangCallableNV].append(callableDecls);
+        stageBuiltins[EShLangCallableNV].append(constRayFlags);
+
+    }
+    if ((profile != EEsProfile && version >= 140)) {
+        const char *deviceIndex =
+            "in highp int gl_DeviceIndex;"     // GL_EXT_device_group
+            "\n";
+
+        stageBuiltins[EShLangRayGenNV].append(deviceIndex);
+        stageBuiltins[EShLangIntersectNV].append(deviceIndex);
+        stageBuiltins[EShLangAnyHitNV].append(deviceIndex);
+        stageBuiltins[EShLangClosestHitNV].append(deviceIndex);
+        stageBuiltins[EShLangMissNV].append(deviceIndex);
+    }
+#endif
+
+    if (version >= 300 /* both ES and non-ES */) {
+        stageBuiltins[EShLangFragment].append(
+            "flat in highp uint gl_ViewID_OVR;"     // GL_OVR_multiview, GL_OVR_multiview2
+            "\n");
+    }
+
+    if ((profile != EEsProfile && version >= 420) ||
+        (profile == EEsProfile && version >= 310)) {
+        commonBuiltins.append("const int gl_ScopeDevice      = 1;\n");
+        commonBuiltins.append("const int gl_ScopeWorkgroup   = 2;\n");
+        commonBuiltins.append("const int gl_ScopeSubgroup    = 3;\n");
+        commonBuiltins.append("const int gl_ScopeInvocation  = 4;\n");
+        commonBuiltins.append("const int gl_ScopeQueueFamily = 5;\n");
+
+        commonBuiltins.append("const int gl_SemanticsRelaxed         = 0x0;\n");
+        commonBuiltins.append("const int gl_SemanticsAcquire         = 0x2;\n");
+        commonBuiltins.append("const int gl_SemanticsRelease         = 0x4;\n");
+        commonBuiltins.append("const int gl_SemanticsAcquireRelease  = 0x8;\n");
+        commonBuiltins.append("const int gl_SemanticsMakeAvailable   = 0x2000;\n");
+        commonBuiltins.append("const int gl_SemanticsMakeVisible     = 0x4000;\n");
+
+        commonBuiltins.append("const int gl_StorageSemanticsNone     = 0x0;\n");
+        commonBuiltins.append("const int gl_StorageSemanticsBuffer   = 0x40;\n");
+        commonBuiltins.append("const int gl_StorageSemanticsShared   = 0x100;\n");
+        commonBuiltins.append("const int gl_StorageSemanticsImage    = 0x800;\n");
+        commonBuiltins.append("const int gl_StorageSemanticsOutput   = 0x1000;\n");
+    }
+
     // printf("%s\n", commonBuiltins.c_str());
     // printf("%s\n", stageBuiltins[EShLangFragment].c_str());
 }
@@ -3763,8 +6269,11 @@
     // In this function proper, enumerate the types, then calls the next set of functions
     // to enumerate all the uses for that type.
     //
-
+#ifdef AMD_EXTENSIONS
+    TBasicType bTypes[4] = { EbtFloat, EbtFloat16, EbtInt, EbtUint };
+#else
     TBasicType bTypes[3] = { EbtFloat, EbtInt, EbtUint };
+#endif
     bool skipBuffer = (profile == EEsProfile && version < 310) || (profile != EEsProfile && version < 140);
     bool skipCubeArrayed = (profile == EEsProfile && version < 310) || (profile != EEsProfile && version < 130);
 
@@ -3804,12 +6313,20 @@
                             continue;
                         if (ms && arrayed && profile == EEsProfile && version < 310)
                             continue;
+#ifdef AMD_EXTENSIONS
+                        for (int bType = 0; bType < 4; ++bType) { // float, float16, int, uint results
 
+                            if (shadow && bType > 1)
+                                continue;
+
+                            if (bTypes[bType] == EbtFloat16 && (profile == EEsProfile ||version < 450))
+                                continue;
+#else
                         for (int bType = 0; bType < 3; ++bType) { // float, int, uint results
 
                             if (shadow && bType > 0)
                                 continue;
-
+#endif
                             if (dim == EsdRect && version < 140 && bType > 0)
                                 continue;
 
@@ -3844,6 +6361,21 @@
                             else {
                                 addSamplingFunctions(sampler, typeName, version, profile);
                                 addGatherFunctions(sampler, typeName, version, profile);
+
+                                if (spvVersion.vulkan > 0 && sampler.isCombined() && !sampler.shadow) {
+                                    // Base Vulkan allows texelFetch() for
+                                    // textureBuffer (i.e. without sampler).
+                                    //
+                                    // GL_EXT_samplerless_texture_functions
+                                    // allows texelFetch() and query functions
+                                    // (other than textureQueryLod()) for all
+                                    // texture types.
+                                    sampler.setTexture(sampler.type, sampler.dim, sampler.arrayed, sampler.shadow,
+                                                       sampler.ms);
+                                    TString textureTypeName = sampler.getString();
+                                    addSamplingFunctions(sampler, textureTypeName, version, profile);
+                                    addQueryFunctions(sampler, textureTypeName, version, profile);
+                                }
                             }
                         }
                     }
@@ -3867,7 +6399,7 @@
 //
 // Add all the query functions for the given type.
 //
-void TBuiltIns::addQueryFunctions(TSampler sampler, TString& typeName, int version, EProfile profile)
+void TBuiltIns::addQueryFunctions(TSampler sampler, const TString& typeName, int version, EProfile profile)
 {
     if (sampler.image && ((profile == EEsProfile && version < 310) || (profile != EEsProfile && version < 430)))
         return;
@@ -3915,16 +6447,50 @@
     // textureQueryLod(), fragment stage only
     //
 
-    if (profile != EEsProfile && version >= 400 && ! sampler.image && sampler.dim != EsdRect && ! sampler.ms && sampler.dim != EsdBuffer) {
-        stageBuiltins[EShLangFragment].append("vec2 textureQueryLod(");
-        stageBuiltins[EShLangFragment].append(typeName);
-        if (dimMap[sampler.dim] == 1)
-            stageBuiltins[EShLangFragment].append(", float");
-        else {
-            stageBuiltins[EShLangFragment].append(", vec");
-            stageBuiltins[EShLangFragment].append(postfixes[dimMap[sampler.dim]]);
+    if (profile != EEsProfile && version >= 400 && sampler.combined && sampler.dim != EsdRect && ! sampler.ms && sampler.dim != EsdBuffer) {
+#ifdef AMD_EXTENSIONS
+        for (int f16TexAddr = 0; f16TexAddr < 2; ++f16TexAddr) {
+            if (f16TexAddr && sampler.type != EbtFloat16)
+                continue;
+#endif
+            stageBuiltins[EShLangFragment].append("vec2 textureQueryLod(");
+            stageBuiltins[EShLangFragment].append(typeName);
+            if (dimMap[sampler.dim] == 1)
+#ifdef AMD_EXTENSIONS
+                if (f16TexAddr)
+                    stageBuiltins[EShLangFragment].append(", float16_t");
+                else
+                    stageBuiltins[EShLangFragment].append(", float");
+#else
+                stageBuiltins[EShLangFragment].append(", float");
+#endif
+            else {
+#ifdef AMD_EXTENSIONS
+                if (f16TexAddr)
+                    stageBuiltins[EShLangFragment].append(", f16vec");
+                else
+                    stageBuiltins[EShLangFragment].append(", vec");
+#else
+                stageBuiltins[EShLangFragment].append(", vec");
+#endif
+                stageBuiltins[EShLangFragment].append(postfixes[dimMap[sampler.dim]]);
+            }
+            stageBuiltins[EShLangFragment].append(");\n");
+#ifdef AMD_EXTENSIONS
         }
-        stageBuiltins[EShLangFragment].append(");\n");
+#endif
+
+#ifdef NV_EXTENSIONS
+        stageBuiltins[EShLangCompute].append("vec2 textureQueryLod(");
+        stageBuiltins[EShLangCompute].append(typeName);
+        if (dimMap[sampler.dim] == 1)
+            stageBuiltins[EShLangCompute].append(", float");
+        else {
+            stageBuiltins[EShLangCompute].append(", vec");
+            stageBuiltins[EShLangCompute].append(postfixes[dimMap[sampler.dim]]);
+        }
+        stageBuiltins[EShLangCompute].append(");\n");
+#endif
     }
 
     //
@@ -3944,7 +6510,7 @@
 //
 // Add all the image access functions for the given type.
 //
-void TBuiltIns::addImageFunctions(TSampler sampler, TString& typeName, int version, EProfile profile)
+void TBuiltIns::addImageFunctions(TSampler sampler, const TString& typeName, int version, EProfile profile)
 {
     int dims = dimMap[sampler.dim];
     // most things with an array add a dimension, except for cubemaps
@@ -4000,23 +6566,44 @@
                 " imageAtomicExchange(volatile coherent "
             };
 
-            for (size_t i = 0; i < numBuiltins; ++i) {
+            // Loop twice to add prototypes with/without scope/semantics
+            for (int j = 0; j < 2; ++j) {
+                for (size_t i = 0; i < numBuiltins; ++i) {
+                    commonBuiltins.append(dataType);
+                    commonBuiltins.append(atomicFunc[i]);
+                    commonBuiltins.append(imageParams);
+                    commonBuiltins.append(", ");
+                    commonBuiltins.append(dataType);
+                    if (j == 1) {
+                        commonBuiltins.append(", int, int, int");
+                    }
+                    commonBuiltins.append(");\n");
+                }
+
                 commonBuiltins.append(dataType);
-                commonBuiltins.append(atomicFunc[i]);
+                commonBuiltins.append(" imageAtomicCompSwap(volatile coherent ");
                 commonBuiltins.append(imageParams);
                 commonBuiltins.append(", ");
                 commonBuiltins.append(dataType);
+                commonBuiltins.append(", ");
+                commonBuiltins.append(dataType);
+                if (j == 1) {
+                    commonBuiltins.append(", int, int, int, int, int");
+                }
                 commonBuiltins.append(");\n");
             }
 
             commonBuiltins.append(dataType);
-            commonBuiltins.append(" imageAtomicCompSwap(volatile coherent ");
+            commonBuiltins.append(" imageAtomicLoad(volatile coherent ");
+            commonBuiltins.append(imageParams);
+            commonBuiltins.append(", int, int, int);\n");
+
+            commonBuiltins.append("void imageAtomicStore(volatile coherent ");
             commonBuiltins.append(imageParams);
             commonBuiltins.append(", ");
             commonBuiltins.append(dataType);
-            commonBuiltins.append(", ");
-            commonBuiltins.append(dataType);
-            commonBuiltins.append(");\n");
+            commonBuiltins.append(", int, int, int);\n");
+
         } else {
             // not int or uint
             // GL_ARB_ES3_1_compatibility
@@ -4029,6 +6616,43 @@
             }
         }
     }
+
+#ifdef AMD_EXTENSIONS
+    if (sampler.dim == EsdRect || sampler.dim == EsdBuffer || sampler.shadow || sampler.ms)
+        return;
+
+    if (profile == EEsProfile || version < 450)
+        return;
+
+    TString imageLodParams = typeName;
+    if (dims == 1)
+        imageLodParams.append(", int");
+    else {
+        imageLodParams.append(", ivec");
+        imageLodParams.append(postfixes[dims]);
+    }
+    imageLodParams.append(", int");
+
+    commonBuiltins.append(prefixes[sampler.type]);
+    commonBuiltins.append("vec4 imageLoadLodAMD(readonly volatile coherent ");
+    commonBuiltins.append(imageLodParams);
+    commonBuiltins.append(");\n");
+
+    commonBuiltins.append("void imageStoreLodAMD(writeonly volatile coherent ");
+    commonBuiltins.append(imageLodParams);
+    commonBuiltins.append(", ");
+    commonBuiltins.append(prefixes[sampler.type]);
+    commonBuiltins.append("vec4);\n");
+
+    if (sampler.dim != Esd1D) {
+        commonBuiltins.append("int sparseImageLoadLodAMD(readonly volatile coherent ");
+        commonBuiltins.append(imageLodParams);
+        commonBuiltins.append(", out ");
+        commonBuiltins.append(prefixes[sampler.type]);
+        commonBuiltins.append("vec4");
+        commonBuiltins.append(");\n");
+    }
+#endif
 }
 
 //
@@ -4037,7 +6661,7 @@
 //
 // Add all the subpass access functions for the given type.
 //
-void TBuiltIns::addSubpassSampling(TSampler sampler, TString& typeName, int /*version*/, EProfile /*profile*/)
+void TBuiltIns::addSubpassSampling(TSampler sampler, const TString& typeName, int /*version*/, EProfile /*profile*/)
 {
     stageBuiltins[EShLangFragment].append(prefixes[sampler.type]);
     stageBuiltins[EShLangFragment].append("vec4 subpassLoad");
@@ -4054,19 +6678,19 @@
 //
 // Add all the texture lookup functions for the given type.
 //
-void TBuiltIns::addSamplingFunctions(TSampler sampler, TString& typeName, int version, EProfile profile)
+void TBuiltIns::addSamplingFunctions(TSampler sampler, const TString& typeName, int version, EProfile profile)
 {
     //
     // texturing
     //
     for (int proj = 0; proj <= 1; ++proj) { // loop over "bool" projective or not
 
-        if (proj && (sampler.dim == EsdCube || sampler.dim == EsdBuffer || sampler.arrayed || sampler.ms))
+        if (proj && (sampler.dim == EsdCube || sampler.dim == EsdBuffer || sampler.arrayed || sampler.ms || !sampler.combined))
             continue;
 
         for (int lod = 0; lod <= 1; ++lod) {
 
-            if (lod && (sampler.dim == EsdBuffer || sampler.dim == EsdRect || sampler.ms))
+            if (lod && (sampler.dim == EsdBuffer || sampler.dim == EsdRect || sampler.ms || !sampler.combined))
                 continue;
             if (lod && sampler.dim == Esd2D && sampler.arrayed && sampler.shadow)
                 continue;
@@ -4075,9 +6699,9 @@
 
             for (int bias = 0; bias <= 1; ++bias) {
 
-                if (bias && (lod || sampler.ms))
+                if (bias && (lod || sampler.ms || !sampler.combined))
                     continue;
-                if (bias && sampler.dim == Esd2D && sampler.shadow && sampler.arrayed)
+                if (bias && (sampler.dim == Esd2D || sampler.dim == EsdCube) && sampler.shadow && sampler.arrayed)
                     continue;
                 if (bias && (sampler.dim == EsdRect || sampler.dim == EsdBuffer))
                     continue;
@@ -4097,12 +6721,12 @@
                             continue;
                         if (fetch && (sampler.shadow || sampler.dim == EsdCube))
                             continue;
-                        if (fetch == 0 && (sampler.ms || sampler.dim == EsdBuffer))
+                        if (fetch == 0 && (sampler.ms || sampler.dim == EsdBuffer || !sampler.combined))
                             continue;
 
                         for (int grad = 0; grad <= 1; ++grad) { // loop over "bool" grad or not
 
-                            if (grad && (lod || bias || sampler.ms))
+                            if (grad && (lod || bias || sampler.ms || !sampler.combined))
                                 continue;
                             if (grad && sampler.dim == EsdBuffer)
                                 continue;
@@ -4124,151 +6748,242 @@
 
                                 if (extraProj && ! proj)
                                     continue;
-                                if (extraProj && (sampler.dim == Esd3D || sampler.shadow))
+                                if (extraProj && (sampler.dim == Esd3D || sampler.shadow || !sampler.combined))
                                     continue;
+#ifdef AMD_EXTENSIONS
+                                for (int f16TexAddr = 0; f16TexAddr <= 1; ++f16TexAddr) { // loop over 16-bit floating-point texel addressing
 
-                                for (int lodClamp = 0; lodClamp <= 1 ;++lodClamp) { // loop over "bool" lod clamp
-
-                                    if (lodClamp && (profile == EEsProfile || version < 450))
+                                    if (f16TexAddr && sampler.type != EbtFloat16)
                                         continue;
-                                    if (lodClamp && (proj || lod || fetch))
-                                        continue;
-
-                                    for (int sparse = 0; sparse <= 1; ++sparse) { // loop over "bool" sparse or not
-
-                                        if (sparse && (profile == EEsProfile || version < 450))
-                                            continue;
-                                        // Sparse sampling is not for 1D/1D array texture, buffer texture, and projective texture
-                                        if (sparse && (sampler.dim == Esd1D || sampler.dim == EsdBuffer || proj))
-                                            continue;
-
-                                        TString s;
-
-                                        // return type
-                                        if (sparse)
-                                            s.append("int ");
-                                        else {
-                                            if (sampler.shadow)
-                                                s.append("float ");
-                                            else {
-                                                s.append(prefixes[sampler.type]);
-                                                s.append("vec4 ");
-                                            }
-                                        }
-
-                                        // name
-                                        if (sparse) {
-                                            if (fetch)
-                                                s.append("sparseTexel");
-                                            else
-                                                s.append("sparseTexture");
-                                        } else {
-                                            if (fetch)
-                                                s.append("texel");
-                                            else
-                                                s.append("texture");
-                                        }
-                                        if (proj)
-                                            s.append("Proj");
-                                        if (lod)
-                                            s.append("Lod");
-                                        if (grad)
-                                            s.append("Grad");
-                                        if (fetch)
-                                            s.append("Fetch");
-                                        if (offset)
-                                            s.append("Offset");
-                                        if (lodClamp)
-                                            s.append("Clamp");
-                                        if (lodClamp || sparse)
-                                            s.append("ARB");
-                                        s.append("(");
-
-                                        // sampler type
-                                        s.append(typeName);
-
-                                        // P coordinate
-                                        if (extraProj)
-                                            s.append(",vec4");
-                                        else {
-                                            s.append(",");
-                                            TBasicType t = fetch ? EbtInt : EbtFloat;
-                                            if (totalDims == 1)
-                                                s.append(TType::getBasicString(t));
-                                            else {
-                                                s.append(prefixes[t]);
-                                                s.append("vec");
-                                                s.append(postfixes[totalDims]);
-                                            }
-                                        }
-
-                                        if (bias && compare)
-                                            continue;
-
-                                        // non-optional lod argument (lod that's not driven by lod loop) or sample
-                                        if ((fetch && sampler.dim != EsdBuffer && sampler.dim != EsdRect && !sampler.ms) ||
-                                            (sampler.ms && fetch))
-                                            s.append(",int");
-
-                                        // non-optional lod
-                                        if (lod)
-                                            s.append(",float");
-
-                                        // gradient arguments
-                                        if (grad) {
-                                            if (dimMap[sampler.dim] == 1)
-                                                s.append(",float,float");
-                                            else {
-                                                s.append(",vec");
-                                                s.append(postfixes[dimMap[sampler.dim]]);
-                                                s.append(",vec");
-                                                s.append(postfixes[dimMap[sampler.dim]]);
-                                            }
-                                        }
-
-                                        // offset
-                                        if (offset) {
-                                            if (dimMap[sampler.dim] == 1)
-                                                s.append(",int");
-                                            else {
-                                                s.append(",ivec");
-                                                s.append(postfixes[dimMap[sampler.dim]]);
-                                            }
-                                        }
-
-                                        // non-optional compare
-                                        if (compare)
-                                            s.append(",float");
-
-                                        // lod clamp
-                                        if (lodClamp)
-                                            s.append(",float");
-
-                                        // texel out (for sparse texture)
-                                        if (sparse) {
-                                            s.append(",out ");
-                                            if (sampler.shadow)
-                                                s.append("float ");
-                                            else {
-                                                s.append(prefixes[sampler.type]);
-                                                s.append("vec4 ");
-                                            }
-                                        }
-
-                                        // optional bias
-                                        if (bias)
-                                            s.append(",float");
-
-                                        s.append(");\n");
-
-                                        // Add to the per-language set of built-ins
-
-                                        if (bias || lodClamp)
-                                            stageBuiltins[EShLangFragment].append(s);
-                                        else
-                                            commonBuiltins.append(s);
+                                    if (f16TexAddr && sampler.shadow && ! compare) {
+                                        compare = true; // compare argument is always present
+                                        totalDims--;
                                     }
+#endif
+                                    for (int lodClamp = 0; lodClamp <= 1 ;++lodClamp) { // loop over "bool" lod clamp
+
+                                        if (lodClamp && (profile == EEsProfile || version < 450))
+                                            continue;
+                                        if (lodClamp && (proj || lod || fetch))
+                                            continue;
+
+                                        for (int sparse = 0; sparse <= 1; ++sparse) { // loop over "bool" sparse or not
+
+                                            if (sparse && (profile == EEsProfile || version < 450))
+                                                continue;
+                                            // Sparse sampling is not for 1D/1D array texture, buffer texture, and projective texture
+                                            if (sparse && (sampler.dim == Esd1D || sampler.dim == EsdBuffer || proj))
+                                                continue;
+
+                                            TString s;
+
+                                            // return type
+                                            if (sparse)
+                                                s.append("int ");
+                                            else {
+                                                if (sampler.shadow)
+#ifdef AMD_EXTENSIONS
+                                                    if (sampler.type == EbtFloat16)
+                                                        s.append("float16_t ");
+                                                    else
+                                                        s.append("float ");
+#else
+                                                    s.append("float ");
+#endif
+                                                else {
+                                                    s.append(prefixes[sampler.type]);
+                                                    s.append("vec4 ");
+                                                }
+                                            }
+
+                                            // name
+                                            if (sparse) {
+                                                if (fetch)
+                                                    s.append("sparseTexel");
+                                                else
+                                                    s.append("sparseTexture");
+                                            }
+                                            else {
+                                                if (fetch)
+                                                    s.append("texel");
+                                                else
+                                                    s.append("texture");
+                                            }
+                                            if (proj)
+                                                s.append("Proj");
+                                            if (lod)
+                                                s.append("Lod");
+                                            if (grad)
+                                                s.append("Grad");
+                                            if (fetch)
+                                                s.append("Fetch");
+                                            if (offset)
+                                                s.append("Offset");
+                                            if (lodClamp)
+                                                s.append("Clamp");
+                                            if (lodClamp || sparse)
+                                                s.append("ARB");
+                                            s.append("(");
+
+                                            // sampler type
+                                            s.append(typeName);
+#ifdef AMD_EXTENSIONS
+                                            // P coordinate
+                                            if (extraProj) {
+                                                if (f16TexAddr)
+                                                    s.append(",f16vec4");
+                                                else
+                                                    s.append(",vec4");
+                                            } else {
+                                                s.append(",");
+                                                TBasicType t = fetch ? EbtInt : (f16TexAddr ? EbtFloat16 : EbtFloat);
+                                                if (totalDims == 1)
+                                                    s.append(TType::getBasicString(t));
+                                                else {
+                                                    s.append(prefixes[t]);
+                                                    s.append("vec");
+                                                    s.append(postfixes[totalDims]);
+                                                }
+                                            }
+#else
+                                            // P coordinate
+                                            if (extraProj)
+                                                s.append(",vec4");
+                                            else {
+                                                s.append(",");
+                                                TBasicType t = fetch ? EbtInt : EbtFloat;
+                                                if (totalDims == 1)
+                                                    s.append(TType::getBasicString(t));
+                                                else {
+                                                    s.append(prefixes[t]);
+                                                    s.append("vec");
+                                                    s.append(postfixes[totalDims]);
+                                                }
+                                            }
+#endif
+                                            // non-optional compare
+                                            if (compare)
+                                                s.append(",float");
+
+                                            // non-optional lod argument (lod that's not driven by lod loop) or sample
+                                            if ((fetch && sampler.dim != EsdBuffer && sampler.dim != EsdRect && !sampler.ms) ||
+                                                (sampler.ms && fetch))
+                                                s.append(",int");
+#ifdef AMD_EXTENSIONS
+                                            // non-optional lod
+                                            if (lod) {
+                                                if (f16TexAddr)
+                                                    s.append(",float16_t");
+                                                else
+                                                    s.append(",float");
+                                            }
+
+                                            // gradient arguments
+                                            if (grad) {
+                                                if (dimMap[sampler.dim] == 1) {
+                                                    if (f16TexAddr)
+                                                        s.append(",float16_t,float16_t");
+                                                    else
+                                                        s.append(",float,float");
+                                                } else {
+                                                    if (f16TexAddr)
+                                                        s.append(",f16vec");
+                                                    else
+                                                        s.append(",vec");
+                                                    s.append(postfixes[dimMap[sampler.dim]]);
+                                                    if (f16TexAddr)
+                                                        s.append(",f16vec");
+                                                    else
+                                                        s.append(",vec");
+                                                    s.append(postfixes[dimMap[sampler.dim]]);
+                                                }
+                                            }
+#else
+                                            // non-optional lod
+                                            if (lod)
+                                                s.append(",float");
+
+                                            // gradient arguments
+                                            if (grad) {
+                                                if (dimMap[sampler.dim] == 1)
+                                                    s.append(",float,float");
+                                                else {
+                                                    s.append(",vec");
+                                                    s.append(postfixes[dimMap[sampler.dim]]);
+                                                    s.append(",vec");
+                                                    s.append(postfixes[dimMap[sampler.dim]]);
+                                                }
+                                            }
+#endif
+                                            // offset
+                                            if (offset) {
+                                                if (dimMap[sampler.dim] == 1)
+                                                    s.append(",int");
+                                                else {
+                                                    s.append(",ivec");
+                                                    s.append(postfixes[dimMap[sampler.dim]]);
+                                                }
+                                            }
+
+#ifdef AMD_EXTENSIONS
+                                            // lod clamp
+                                            if (lodClamp) {
+                                                if (f16TexAddr)
+                                                    s.append(",float16_t");
+                                                else
+                                                    s.append(",float");
+                                            }
+#else
+                                            // lod clamp
+                                            if (lodClamp)
+                                                s.append(",float");
+#endif
+                                            // texel out (for sparse texture)
+                                            if (sparse) {
+                                                s.append(",out ");
+                                                if (sampler.shadow)
+#ifdef AMD_EXTENSIONS
+                                                    if (sampler.type == EbtFloat16)
+                                                        s.append("float16_t");
+                                                    else
+                                                        s.append("float");
+#else
+                                                    s.append("float");
+#endif
+                                                else {
+                                                    s.append(prefixes[sampler.type]);
+                                                    s.append("vec4");
+                                                }
+                                            }
+#ifdef AMD_EXTENSIONS
+                                            // optional bias
+                                            if (bias) {
+                                                if (f16TexAddr)
+                                                    s.append(",float16_t");
+                                                else
+                                                    s.append(",float");
+                                            }
+#else
+                                            // optional bias
+                                            if (bias)
+                                                s.append(",float");
+#endif
+                                            s.append(");\n");
+
+                                            // Add to the per-language set of built-ins
+                                            if (bias || lodClamp) {
+                                                stageBuiltins[EShLangFragment].append(s);
+#ifdef NV_EXTENSIONS
+                                                stageBuiltins[EShLangCompute].append(s);
+#endif
+                                            } else
+                                                commonBuiltins.append(s);
+
+                                        }
+                                    }
+#ifdef AMD_EXTENSIONS
                                 }
+#endif
                             }
                         }
                     }
@@ -4284,7 +6999,7 @@
 //
 // Add all the texture gather functions for the given type.
 //
-void TBuiltIns::addGatherFunctions(TSampler sampler, TString& typeName, int version, EProfile profile)
+void TBuiltIns::addGatherFunctions(TSampler sampler, const TString& typeName, int version, EProfile profile)
 {
     switch (sampler.dim) {
     case Esd2D:
@@ -4301,83 +7016,228 @@
     if (version < 140 && sampler.dim == EsdRect && sampler.type != EbtFloat)
         return;
 
-    for (int offset = 0; offset < 3; ++offset) { // loop over three forms of offset in the call name:  none, Offset, and Offsets
+#ifdef AMD_EXTENSIONS
+    for (int f16TexAddr = 0; f16TexAddr <= 1; ++f16TexAddr) { // loop over 16-bit floating-point texel addressing
 
-        for (int comp = 0; comp < 2; ++comp) { // loop over presence of comp argument
+        if (f16TexAddr && sampler.type != EbtFloat16)
+            continue;
+#endif
+        for (int offset = 0; offset < 3; ++offset) { // loop over three forms of offset in the call name:  none, Offset, and Offsets
 
-            if (comp > 0 && sampler.shadow)
-                continue;
+            for (int comp = 0; comp < 2; ++comp) { // loop over presence of comp argument
 
-            if (offset > 0 && sampler.dim == EsdCube)
-                continue;
-
-            for (int sparse = 0; sparse <= 1; ++sparse) { // loop over "bool" sparse or not
-                if (sparse && (profile == EEsProfile || version < 450))
+                if (comp > 0 && sampler.shadow)
                     continue;
 
-                TString s;
+                if (offset > 0 && sampler.dim == EsdCube)
+                    continue;
 
-                // return type
-                if (sparse)
-                    s.append("int ");
-                else {
-                    s.append(prefixes[sampler.type]);
-                    s.append("vec4 ");
+                for (int sparse = 0; sparse <= 1; ++sparse) { // loop over "bool" sparse or not
+                    if (sparse && (profile == EEsProfile || version < 450))
+                        continue;
+
+                    TString s;
+
+                    // return type
+                    if (sparse)
+                        s.append("int ");
+                    else {
+                        s.append(prefixes[sampler.type]);
+                        s.append("vec4 ");
+                    }
+
+                    // name
+                    if (sparse)
+                        s.append("sparseTextureGather");
+                    else
+                        s.append("textureGather");
+                    switch (offset) {
+                    case 1:
+                        s.append("Offset");
+                        break;
+                    case 2:
+                        s.append("Offsets");
+                        break;
+                    default:
+                        break;
+                    }
+                    if (sparse)
+                        s.append("ARB");
+                    s.append("(");
+
+                    // sampler type argument
+                    s.append(typeName);
+
+                    // P coordinate argument
+#ifdef AMD_EXTENSIONS
+                    if (f16TexAddr)
+                        s.append(",f16vec");
+                    else
+                        s.append(",vec");
+#else
+                    s.append(",vec");
+#endif
+                    int totalDims = dimMap[sampler.dim] + (sampler.arrayed ? 1 : 0);
+                    s.append(postfixes[totalDims]);
+
+                    // refZ argument
+                    if (sampler.shadow)
+                        s.append(",float");
+
+                    // offset argument
+                    if (offset > 0) {
+                        s.append(",ivec2");
+                        if (offset == 2)
+                            s.append("[4]");
+                    }
+
+                    // texel out (for sparse texture)
+                    if (sparse) {
+                        s.append(",out ");
+                        s.append(prefixes[sampler.type]);
+                        s.append("vec4 ");
+                    }
+
+                    // comp argument
+                    if (comp)
+                        s.append(",int");
+
+                    s.append(");\n");
+                    commonBuiltins.append(s);
+#ifdef AMD_EXTENSIONS
                 }
-
-                // name
-                if (sparse)
-                    s.append("sparseTextureGather");
-                else
-                    s.append("textureGather");
-                switch (offset) {
-                case 1:
-                    s.append("Offset");
-                    break;
-                case 2:
-                    s.append("Offsets");
-                default:
-                    break;
-                }
-                if (sparse)
-                    s.append("ARB");
-                s.append("(");
-
-                // sampler type argument
-                s.append(typeName);
-
-                // P coordinate argument
-                s.append(",vec");
-                int totalDims = dimMap[sampler.dim] + (sampler.arrayed ? 1 : 0);
-                s.append(postfixes[totalDims]);
-
-                // refZ argument
-                if (sampler.shadow)
-                    s.append(",float");
-
-                // offset argument
-                if (offset > 0) {
-                    s.append(",ivec2");
-                    if (offset == 2)
-                        s.append("[4]");
-                }
-
-                // texel out (for sparse texture)
-                if (sparse) {
-                    s.append(",out ");
-                    s.append(prefixes[sampler.type]);
-                    s.append("vec4 ");
-                }
-
-                // comp argument
-                if (comp)
-                    s.append(",int");
-
-                s.append(");\n");
-                commonBuiltins.append(s);
+#endif
             }
         }
     }
+
+#ifdef AMD_EXTENSIONS
+    if (sampler.dim == EsdRect || sampler.shadow)
+        return;
+
+    if (profile == EEsProfile || version < 450)
+        return;
+
+    for (int bias = 0; bias < 2; ++bias) { // loop over presence of bias argument
+
+        for (int lod = 0; lod < 2; ++lod) { // loop over presence of lod argument
+
+            if ((lod && bias) || (lod == 0 && bias == 0))
+                continue;
+
+            for (int f16TexAddr = 0; f16TexAddr <= 1; ++f16TexAddr) { // loop over 16-bit floating-point texel addressing
+
+                if (f16TexAddr && sampler.type != EbtFloat16)
+                    continue;
+
+                for (int offset = 0; offset < 3; ++offset) { // loop over three forms of offset in the call name:  none, Offset, and Offsets
+
+                    for (int comp = 0; comp < 2; ++comp) { // loop over presence of comp argument
+
+                        if (comp == 0 && bias)
+                            continue;
+
+                        if (offset > 0 && sampler.dim == EsdCube)
+                            continue;
+
+                        for (int sparse = 0; sparse <= 1; ++sparse) { // loop over "bool" sparse or not
+                            if (sparse && (profile == EEsProfile || version < 450))
+                                continue;
+
+                            TString s;
+
+                            // return type
+                            if (sparse)
+                                s.append("int ");
+                            else {
+                                s.append(prefixes[sampler.type]);
+                                s.append("vec4 ");
+                            }
+
+                            // name
+                            if (sparse)
+                                s.append("sparseTextureGather");
+                            else
+                                s.append("textureGather");
+
+                            if (lod)
+                                s.append("Lod");
+
+                            switch (offset) {
+                            case 1:
+                                s.append("Offset");
+                                break;
+                            case 2:
+                                s.append("Offsets");
+                                break;
+                            default:
+                                break;
+                            }
+
+                            if (lod)
+                                s.append("AMD");
+                            else if (sparse)
+                                s.append("ARB");
+
+                            s.append("(");
+
+                            // sampler type argument
+                            s.append(typeName);
+
+                            // P coordinate argument
+                            if (f16TexAddr)
+                                s.append(",f16vec");
+                            else
+                                s.append(",vec");
+                            int totalDims = dimMap[sampler.dim] + (sampler.arrayed ? 1 : 0);
+                            s.append(postfixes[totalDims]);
+
+                            // lod argument
+                            if (lod) {
+                                if (f16TexAddr)
+                                    s.append(",float16_t");
+                                else
+                                    s.append(",float");
+                            }
+
+                            // offset argument
+                            if (offset > 0) {
+                                s.append(",ivec2");
+                                if (offset == 2)
+                                    s.append("[4]");
+                            }
+
+                            // texel out (for sparse texture)
+                            if (sparse) {
+                                s.append(",out ");
+                                s.append(prefixes[sampler.type]);
+                                s.append("vec4 ");
+                            }
+
+                            // comp argument
+                            if (comp)
+                                s.append(",int");
+
+                            // bias argument
+                            if (bias) {
+                                if (f16TexAddr)
+                                    s.append(",float16_t");
+                                else
+                                    s.append(",float");
+                            }
+
+                            s.append(");\n");
+                            if (bias)
+                                stageBuiltins[EShLangFragment].append(s);
+                            else
+                                commonBuiltins.append(s);
+                        }
+                    }
+                }
+            }
+        }
+    }
+#endif
 }
 
 //
@@ -4833,6 +7693,31 @@
     }
 #endif
 
+#ifdef NV_EXTENSIONS
+    // SPV_NV_mesh_shader
+    if ((profile != EEsProfile && version >= 450) || (profile == EEsProfile && version >= 320)) {
+        snprintf(builtInConstant, maxSize, "const int gl_MaxMeshOutputVerticesNV = %d;", resources.maxMeshOutputVerticesNV);
+        s.append(builtInConstant);
+
+        snprintf(builtInConstant, maxSize, "const int gl_MaxMeshOutputPrimitivesNV = %d;", resources.maxMeshOutputPrimitivesNV);
+        s.append(builtInConstant);
+
+        snprintf(builtInConstant, maxSize, "const ivec3 gl_MaxMeshWorkGroupSizeNV = ivec3(%d,%d,%d);", resources.maxMeshWorkGroupSizeX_NV,
+                                                                                                       resources.maxMeshWorkGroupSizeY_NV,
+                                                                                                       resources.maxMeshWorkGroupSizeZ_NV);
+        s.append(builtInConstant);
+        snprintf(builtInConstant, maxSize, "const ivec3 gl_MaxTaskWorkGroupSizeNV = ivec3(%d,%d,%d);", resources.maxTaskWorkGroupSizeX_NV,
+                                                                                                       resources.maxTaskWorkGroupSizeY_NV,
+                                                                                                       resources.maxTaskWorkGroupSizeZ_NV);
+        s.append(builtInConstant);
+
+        snprintf(builtInConstant, maxSize, "const int gl_MaxMeshViewCountNV = %d;", resources.maxMeshViewCountNV);
+        s.append(builtInConstant);
+
+        s.append("\n");
+    }
+#endif
+
     s.append("\n");
 }
 
@@ -4926,16 +7811,19 @@
     switch(language) {
     case EShLangVertex:
         if (profile != EEsProfile) {
-            symbolTable.setVariableExtensions("gl_BaseVertexARB",   1, &E_GL_ARB_shader_draw_parameters);
-            symbolTable.setVariableExtensions("gl_BaseInstanceARB", 1, &E_GL_ARB_shader_draw_parameters);
-            symbolTable.setVariableExtensions("gl_DrawIDARB",       1, &E_GL_ARB_shader_draw_parameters);
-
-            BuiltInVariable("gl_BaseVertexARB",   EbvBaseVertex,   symbolTable);
-            BuiltInVariable("gl_BaseInstanceARB", EbvBaseInstance, symbolTable);
-            BuiltInVariable("gl_DrawIDARB",       EbvDrawId,       symbolTable);
-        }
-
-        if (profile != EEsProfile) {
+            if (version >= 440) {
+                symbolTable.setVariableExtensions("gl_BaseVertexARB",   1, &E_GL_ARB_shader_draw_parameters);
+                symbolTable.setVariableExtensions("gl_BaseInstanceARB", 1, &E_GL_ARB_shader_draw_parameters);
+                symbolTable.setVariableExtensions("gl_DrawIDARB",       1, &E_GL_ARB_shader_draw_parameters);
+                BuiltInVariable("gl_BaseVertexARB",   EbvBaseVertex,   symbolTable);
+                BuiltInVariable("gl_BaseInstanceARB", EbvBaseInstance, symbolTable);
+                BuiltInVariable("gl_DrawIDARB",       EbvDrawId,       symbolTable);
+            }
+            if (version >= 460) {
+                BuiltInVariable("gl_BaseVertex",   EbvBaseVertex,   symbolTable);
+                BuiltInVariable("gl_BaseInstance", EbvBaseInstance, symbolTable);
+                BuiltInVariable("gl_DrawID",       EbvDrawId,       symbolTable);
+            }
             symbolTable.setVariableExtensions("gl_SubGroupSizeARB",       1, &E_GL_ARB_shader_ballot);
             symbolTable.setVariableExtensions("gl_SubGroupInvocationARB", 1, &E_GL_ARB_shader_ballot);
             symbolTable.setVariableExtensions("gl_SubGroupEqMaskARB",     1, &E_GL_ARB_shader_ballot);
@@ -4955,13 +7843,17 @@
             BuiltInVariable("gl_SubGroupLeMaskARB",     EbvSubGroupLeMask,     symbolTable);
             BuiltInVariable("gl_SubGroupLtMaskARB",     EbvSubGroupLtMask,     symbolTable);
 
-            if (spvVersion.vulkan >= 100)
+            if (spvVersion.vulkan > 0)
                 // Treat "gl_SubGroupSizeARB" as shader input instead of uniform for Vulkan
                 SpecialQualifier("gl_SubGroupSizeARB", EvqVaryingIn, EbvSubGroupSize, symbolTable);
+            else
+                BuiltInVariable("gl_SubGroupSizeARB", EbvSubGroupSize, symbolTable);
 
-            symbolTable.setFunctionExtensions("anyInvocationARB",       1, &E_GL_ARB_shader_group_vote);
-            symbolTable.setFunctionExtensions("allInvocationsARB",      1, &E_GL_ARB_shader_group_vote);
-            symbolTable.setFunctionExtensions("allInvocationsEqualARB", 1, &E_GL_ARB_shader_group_vote);
+            if (version >= 430) {
+                symbolTable.setFunctionExtensions("anyInvocationARB",       1, &E_GL_ARB_shader_group_vote);
+                symbolTable.setFunctionExtensions("allInvocationsARB",      1, &E_GL_ARB_shader_group_vote);
+                symbolTable.setFunctionExtensions("allInvocationsEqualARB", 1, &E_GL_ARB_shader_group_vote);
+            }
         }
 
 #ifdef AMD_EXTENSIONS
@@ -5002,8 +7894,20 @@
             symbolTable.setFunctionExtensions("cubeFaceCoordAMD", 1, &E_GL_AMD_gcn_shader);
             symbolTable.setFunctionExtensions("timeAMD",          1, &E_GL_AMD_gcn_shader);
         }
+
+        if (profile != EEsProfile) {
+            symbolTable.setFunctionExtensions("fragmentMaskFetchAMD", 1, &E_GL_AMD_shader_fragment_mask);
+            symbolTable.setFunctionExtensions("fragmentFetchAMD",     1, &E_GL_AMD_shader_fragment_mask);
+        }
 #endif
 
+#ifdef NV_EXTENSIONS
+        symbolTable.setFunctionExtensions("textureFootprintNV",          1, &E_GL_NV_shader_texture_footprint);
+        symbolTable.setFunctionExtensions("textureFootprintClampNV",     1, &E_GL_NV_shader_texture_footprint);
+        symbolTable.setFunctionExtensions("textureFootprintLodNV",       1, &E_GL_NV_shader_texture_footprint);
+        symbolTable.setFunctionExtensions("textureFootprintGradNV",      1, &E_GL_NV_shader_texture_footprint);
+        symbolTable.setFunctionExtensions("textureFootprintGradClampNV", 1, &E_GL_NV_shader_texture_footprint);
+#endif
         // Compatibility variables, vertex only
         if (spvVersion.spv == 0) {
             BuiltInVariable("gl_Color",          EbvColor,          symbolTable);
@@ -5026,13 +7930,14 @@
                 symbolTable.setFunctionExtensions("texture2DGradEXT",     1, &E_GL_EXT_shader_texture_lod);
                 symbolTable.setFunctionExtensions("texture2DProjGradEXT", 1, &E_GL_EXT_shader_texture_lod);
                 symbolTable.setFunctionExtensions("textureCubeGradEXT",   1, &E_GL_EXT_shader_texture_lod);
-                symbolTable.setFunctionExtensions("textureGatherOffsets", Num_AEP_gpu_shader5, AEP_gpu_shader5);
+                if (version == 310)
+                    symbolTable.setFunctionExtensions("textureGatherOffsets", Num_AEP_gpu_shader5, AEP_gpu_shader5);
             }
-            if (version >= 310)
+            if (version == 310)
                 symbolTable.setFunctionExtensions("fma", Num_AEP_gpu_shader5, AEP_gpu_shader5);
         }
 
-        if (profile == EEsProfile) {
+        if (profile == EEsProfile && version < 320) {
             symbolTable.setFunctionExtensions("imageAtomicAdd",      1, &E_GL_OES_shader_image_atomic);
             symbolTable.setFunctionExtensions("imageAtomicMin",      1, &E_GL_OES_shader_image_atomic);
             symbolTable.setFunctionExtensions("imageAtomicMax",      1, &E_GL_OES_shader_image_atomic);
@@ -5048,17 +7953,29 @@
             SpecialQualifier("gl_InstanceID", EvqInstanceId, EbvInstanceId, symbolTable);
         }
 
-        if (spvVersion.vulkan >= 100) {
+        if (spvVersion.vulkan > 0) {
             BuiltInVariable("gl_VertexIndex",   EbvVertexIndex,   symbolTable);
             BuiltInVariable("gl_InstanceIndex", EbvInstanceIndex, symbolTable);
         }
 
+        if (version >= 300 /* both ES and non-ES */) {
+            symbolTable.setVariableExtensions("gl_ViewID_OVR", Num_OVR_multiview_EXTs, OVR_multiview_EXTs);
+            BuiltInVariable("gl_ViewID_OVR", EbvViewIndex, symbolTable);
+        }
+
+        if (profile == EEsProfile) {
+            symbolTable.setFunctionExtensions("shadow2DEXT",        1, &E_GL_EXT_shadow_samplers);
+            symbolTable.setFunctionExtensions("shadow2DProjEXT",    1, &E_GL_EXT_shadow_samplers);
+        }
+
         // Fall through
 
     case EShLangTessControl:
         if (profile == EEsProfile && version >= 310) {
-            symbolTable.setVariableExtensions("gl_BoundingBoxOES", Num_AEP_primitive_bounding_box, AEP_primitive_bounding_box);
             BuiltInVariable("gl_BoundingBoxOES", EbvBoundingBox, symbolTable);
+            if (version < 320)
+                symbolTable.setVariableExtensions("gl_BoundingBoxOES", Num_AEP_primitive_bounding_box,
+                                                  AEP_primitive_bounding_box);
         }
 
         // Fall through
@@ -5092,6 +8009,14 @@
             symbolTable.setVariableExtensions("gl_Layer",         Num_viewportEXTs, viewportEXTs);
             symbolTable.setVariableExtensions("gl_ViewportIndex", Num_viewportEXTs, viewportEXTs);
         }
+#else
+        if (language != EShLangGeometry && version >= 410) {
+            symbolTable.setVariableExtensions("gl_Layer",         1, &E_GL_ARB_shader_viewport_layer_array);
+            symbolTable.setVariableExtensions("gl_ViewportIndex", 1, &E_GL_ARB_shader_viewport_layer_array);
+        }
+#endif
+
+#ifdef NV_EXTENSIONS
         symbolTable.setVariableExtensions("gl_ViewportMask",            1, &E_GL_NV_viewport_array2);
         symbolTable.setVariableExtensions("gl_SecondaryPositionNV",     1, &E_GL_NV_stereo_view_rendering);
         symbolTable.setVariableExtensions("gl_SecondaryViewportMaskNV", 1, &E_GL_NV_stereo_view_rendering);
@@ -5108,8 +8033,6 @@
             BuiltInVariable("gl_in", "gl_SecondaryPositionNV", EbvSecondaryPositionNV, symbolTable);
             BuiltInVariable("gl_in", "gl_PositionPerViewNV",   EbvPositionPerViewNV,   symbolTable);
         }
-        BuiltInVariable("gl_out", "gl_Layer",                   EbvLayer,                   symbolTable);
-        BuiltInVariable("gl_out", "gl_ViewportIndex",           EbvViewportIndex,           symbolTable);
         BuiltInVariable("gl_out", "gl_ViewportMask",            EbvViewportMaskNV,          symbolTable);
         BuiltInVariable("gl_out", "gl_SecondaryPositionNV",     EbvSecondaryPositionNV,     symbolTable);
         BuiltInVariable("gl_out", "gl_SecondaryViewportMaskNV", EbvSecondaryViewportMaskNV, symbolTable);
@@ -5170,6 +8093,25 @@
             symbolTable.setVariableExtensions("gl_ViewIndex", 1, &E_GL_EXT_multiview);
             BuiltInVariable("gl_ViewIndex", EbvViewIndex, symbolTable);
         }
+        
+        // GL_KHR_shader_subgroup
+        if (spvVersion.vulkan > 0) {
+            symbolTable.setVariableExtensions("gl_SubgroupSize",         1, &E_GL_KHR_shader_subgroup_basic);
+            symbolTable.setVariableExtensions("gl_SubgroupInvocationID", 1, &E_GL_KHR_shader_subgroup_basic);
+            symbolTable.setVariableExtensions("gl_SubgroupEqMask",       1, &E_GL_KHR_shader_subgroup_ballot);
+            symbolTable.setVariableExtensions("gl_SubgroupGeMask",       1, &E_GL_KHR_shader_subgroup_ballot);
+            symbolTable.setVariableExtensions("gl_SubgroupGtMask",       1, &E_GL_KHR_shader_subgroup_ballot);
+            symbolTable.setVariableExtensions("gl_SubgroupLeMask",       1, &E_GL_KHR_shader_subgroup_ballot);
+            symbolTable.setVariableExtensions("gl_SubgroupLtMask",       1, &E_GL_KHR_shader_subgroup_ballot);
+
+            BuiltInVariable("gl_SubgroupSize",         EbvSubgroupSize2,       symbolTable);
+            BuiltInVariable("gl_SubgroupInvocationID", EbvSubgroupInvocation2, symbolTable);
+            BuiltInVariable("gl_SubgroupEqMask",       EbvSubgroupEqMask2,     symbolTable);
+            BuiltInVariable("gl_SubgroupGeMask",       EbvSubgroupGeMask2,     symbolTable);
+            BuiltInVariable("gl_SubgroupGtMask",       EbvSubgroupGtMask2,     symbolTable);
+            BuiltInVariable("gl_SubgroupLeMask",       EbvSubgroupLeMask2,     symbolTable);
+            BuiltInVariable("gl_SubgroupLtMask",       EbvSubgroupLtMask2,     symbolTable);
+        }
 
         break;
 
@@ -5177,7 +8119,15 @@
         SpecialQualifier("gl_FrontFacing",      EvqFace,       EbvFace,             symbolTable);
         SpecialQualifier("gl_FragCoord",        EvqFragCoord,  EbvFragCoord,        symbolTable);
         SpecialQualifier("gl_PointCoord",       EvqPointCoord, EbvPointCoord,       symbolTable);
-        SpecialQualifier("gl_FragColor",        EvqFragColor,  EbvFragColor,        symbolTable);
+        if (spvVersion.spv == 0)
+            SpecialQualifier("gl_FragColor",    EvqFragColor,  EbvFragColor,        symbolTable);
+        else {
+            TSymbol* symbol = symbolTable.find("gl_FragColor");
+            if (symbol) {
+                symbol->getWritableType().getQualifier().storage = EvqVaryingOut;
+                symbol->getWritableType().getQualifier().layoutLocation = 0;
+            }
+        }
         SpecialQualifier("gl_FragDepth",        EvqFragDepth,  EbvFragDepth,        symbolTable);
         SpecialQualifier("gl_FragDepthEXT",     EvqFragDepth,  EbvFragDepth,        symbolTable);
         SpecialQualifier("gl_HelperInvocation", EvqVaryingIn,  EbvHelperInvocation, symbolTable);
@@ -5186,13 +8136,18 @@
         BuiltInVariable("gl_CullDistance",    EbvCullDistance,   symbolTable);
         BuiltInVariable("gl_PrimitiveID",     EbvPrimitiveId,    symbolTable);
 
+        if (profile != EEsProfile && version >= 140) {
+            symbolTable.setVariableExtensions("gl_FragStencilRefARB", 1, &E_GL_ARB_shader_stencil_export);
+            BuiltInVariable("gl_FragStencilRefARB", EbvFragStencilRef, symbolTable);
+        }
+
         if ((profile != EEsProfile && version >= 400) ||
             (profile == EEsProfile && version >= 310)) {
             BuiltInVariable("gl_SampleID",        EbvSampleId,       symbolTable);
             BuiltInVariable("gl_SamplePosition",  EbvSamplePosition, symbolTable);
             BuiltInVariable("gl_SampleMaskIn",    EbvSampleMask,     symbolTable);
             BuiltInVariable("gl_SampleMask",      EbvSampleMask,     symbolTable);
-            if (profile == EEsProfile) {
+            if (profile == EEsProfile && version < 320) {
                 symbolTable.setVariableExtensions("gl_SampleID",       1, &E_GL_OES_sample_variables);
                 symbolTable.setVariableExtensions("gl_SamplePosition", 1, &E_GL_OES_sample_variables);
                 symbolTable.setVariableExtensions("gl_SampleMaskIn",   1, &E_GL_OES_sample_variables);
@@ -5226,14 +8181,15 @@
                 symbolTable.setFunctionExtensions("texture2DGradEXT",     1, &E_GL_EXT_shader_texture_lod);
                 symbolTable.setFunctionExtensions("texture2DProjGradEXT", 1, &E_GL_EXT_shader_texture_lod);
                 symbolTable.setFunctionExtensions("textureCubeGradEXT",   1, &E_GL_EXT_shader_texture_lod);
-                symbolTable.setFunctionExtensions("textureGatherOffsets", Num_AEP_gpu_shader5, AEP_gpu_shader5);
+                if (version < 320)
+                    symbolTable.setFunctionExtensions("textureGatherOffsets", Num_AEP_gpu_shader5, AEP_gpu_shader5);
             }
             if (version == 100) {
                 symbolTable.setFunctionExtensions("dFdx",   1, &E_GL_OES_standard_derivatives);
                 symbolTable.setFunctionExtensions("dFdy",   1, &E_GL_OES_standard_derivatives);
                 symbolTable.setFunctionExtensions("fwidth", 1, &E_GL_OES_standard_derivatives);
             }
-            if (version >= 310) {
+            if (version == 310) {
                 symbolTable.setFunctionExtensions("fma", Num_AEP_gpu_shader5, AEP_gpu_shader5);
                 symbolTable.setFunctionExtensions("interpolateAtCentroid", 1, &E_GL_OES_shader_multisample_interpolation);
                 symbolTable.setFunctionExtensions("interpolateAtSample",   1, &E_GL_OES_shader_multisample_interpolation);
@@ -5348,16 +8304,72 @@
             BuiltInVariable("gl_BaryCoordSmoothSampleAMD",      EbvBaryCoordSmoothSample,    symbolTable);
             BuiltInVariable("gl_BaryCoordPullModelAMD",         EbvBaryCoordPullModel,       symbolTable);
         }
+
+        // E_GL_AMD_texture_gather_bias_lod
+        if (profile != EEsProfile) {
+            symbolTable.setFunctionExtensions("textureGatherLodAMD",                1, &E_GL_AMD_texture_gather_bias_lod);
+            symbolTable.setFunctionExtensions("textureGatherLodOffsetAMD",          1, &E_GL_AMD_texture_gather_bias_lod);
+            symbolTable.setFunctionExtensions("textureGatherLodOffsetsAMD",         1, &E_GL_AMD_texture_gather_bias_lod);
+            symbolTable.setFunctionExtensions("sparseTextureGatherLodAMD",          1, &E_GL_AMD_texture_gather_bias_lod);
+            symbolTable.setFunctionExtensions("sparseTextureGatherLodOffsetAMD",    1, &E_GL_AMD_texture_gather_bias_lod);
+            symbolTable.setFunctionExtensions("sparseTextureGatherLodOffsetsAMD",   1, &E_GL_AMD_texture_gather_bias_lod);
+        }
+
+        // E_GL_AMD_shader_image_load_store_lod
+        if (profile != EEsProfile) {
+            symbolTable.setFunctionExtensions("imageLoadLodAMD",        1, &E_GL_AMD_shader_image_load_store_lod);
+            symbolTable.setFunctionExtensions("imageStoreLodAMD",       1, &E_GL_AMD_shader_image_load_store_lod);
+            symbolTable.setFunctionExtensions("sparseImageLoadLodAMD",  1, &E_GL_AMD_shader_image_load_store_lod);
+        }
 #endif
 
+#ifdef NV_EXTENSIONS
+        if (profile != EEsProfile && version >= 430) {
+            symbolTable.setVariableExtensions("gl_FragFullyCoveredNV", 1, &E_GL_NV_conservative_raster_underestimation);
+            BuiltInVariable("gl_FragFullyCoveredNV", EbvFragFullyCoveredNV, symbolTable);
+        }
+        if ((profile != EEsProfile && version >= 450) ||
+            (profile == EEsProfile && version >= 320)) {
+            symbolTable.setVariableExtensions("gl_FragmentSizeNV",        1, &E_GL_NV_shading_rate_image);
+            symbolTable.setVariableExtensions("gl_InvocationsPerPixelNV", 1, &E_GL_NV_shading_rate_image);
+            BuiltInVariable("gl_FragmentSizeNV",        EbvFragmentSizeNV, symbolTable);
+            BuiltInVariable("gl_InvocationsPerPixelNV", EbvInvocationsPerPixelNV, symbolTable);
+            symbolTable.setVariableExtensions("gl_BaryCoordNV",        1, &E_GL_NV_fragment_shader_barycentric);
+            symbolTable.setVariableExtensions("gl_BaryCoordNoPerspNV", 1, &E_GL_NV_fragment_shader_barycentric);
+            BuiltInVariable("gl_BaryCoordNV",        EbvBaryCoordNV,        symbolTable);
+            BuiltInVariable("gl_BaryCoordNoPerspNV", EbvBaryCoordNoPerspNV, symbolTable);
+        }
+        if (((profile != EEsProfile && version >= 450) ||
+            (profile == EEsProfile && version >= 320)) &&
+            language == EShLangCompute) {
+            symbolTable.setFunctionExtensions("dFdx",                   1, &E_GL_NV_compute_shader_derivatives);
+            symbolTable.setFunctionExtensions("dFdy",                   1, &E_GL_NV_compute_shader_derivatives);
+            symbolTable.setFunctionExtensions("fwidth",                 1, &E_GL_NV_compute_shader_derivatives);
+            symbolTable.setFunctionExtensions("dFdxFine",               1, &E_GL_NV_compute_shader_derivatives);
+            symbolTable.setFunctionExtensions("dFdyFine",               1, &E_GL_NV_compute_shader_derivatives);
+            symbolTable.setFunctionExtensions("fwidthFine",             1, &E_GL_NV_compute_shader_derivatives);
+            symbolTable.setFunctionExtensions("dFdxCoarse",             1, &E_GL_NV_compute_shader_derivatives);
+            symbolTable.setFunctionExtensions("dFdyCoarse",             1, &E_GL_NV_compute_shader_derivatives);
+            symbolTable.setFunctionExtensions("fwidthCoarse",           1, &E_GL_NV_compute_shader_derivatives);
+        }
+#endif
+
+        if ((profile != EEsProfile && version >= 450) ||
+            (profile == EEsProfile && version >= 310)) {
+            symbolTable.setVariableExtensions("gl_FragSizeEXT",            1, &E_GL_EXT_fragment_invocation_density);
+            symbolTable.setVariableExtensions("gl_FragInvocationCountEXT", 1, &E_GL_EXT_fragment_invocation_density);
+            BuiltInVariable("gl_FragSizeEXT",            EbvFragSizeEXT, symbolTable);
+            BuiltInVariable("gl_FragInvocationCountEXT", EbvFragInvocationCountEXT, symbolTable);
+        }
+
         symbolTable.setVariableExtensions("gl_FragDepthEXT", 1, &E_GL_EXT_frag_depth);
 
-        if (profile == EEsProfile) {
+        if (profile == EEsProfile && version < 320) {
             symbolTable.setVariableExtensions("gl_PrimitiveID",  Num_AEP_geometry_shader, AEP_geometry_shader);
             symbolTable.setVariableExtensions("gl_Layer",        Num_AEP_geometry_shader, AEP_geometry_shader);
         }
 
-        if (profile == EEsProfile) {
+        if (profile == EEsProfile && version < 320) {
             symbolTable.setFunctionExtensions("imageAtomicAdd",      1, &E_GL_OES_shader_image_atomic);
             symbolTable.setFunctionExtensions("imageAtomicMin",      1, &E_GL_OES_shader_image_atomic);
             symbolTable.setFunctionExtensions("imageAtomicMax",      1, &E_GL_OES_shader_image_atomic);
@@ -5372,6 +8384,159 @@
         BuiltInVariable("gl_DeviceIndex", EbvDeviceIndex, symbolTable);
         symbolTable.setVariableExtensions("gl_ViewIndex", 1, &E_GL_EXT_multiview);
         BuiltInVariable("gl_ViewIndex", EbvViewIndex, symbolTable);
+        if (version >= 300 /* both ES and non-ES */) {
+            symbolTable.setVariableExtensions("gl_ViewID_OVR", Num_OVR_multiview_EXTs, OVR_multiview_EXTs);
+            BuiltInVariable("gl_ViewID_OVR", EbvViewIndex, symbolTable);
+        }
+
+        // GL_ARB_shader_ballot
+        if (profile != EEsProfile) {
+            symbolTable.setVariableExtensions("gl_SubGroupSizeARB",       1, &E_GL_ARB_shader_ballot);
+            symbolTable.setVariableExtensions("gl_SubGroupInvocationARB", 1, &E_GL_ARB_shader_ballot);
+            symbolTable.setVariableExtensions("gl_SubGroupEqMaskARB",     1, &E_GL_ARB_shader_ballot);
+            symbolTable.setVariableExtensions("gl_SubGroupGeMaskARB",     1, &E_GL_ARB_shader_ballot);
+            symbolTable.setVariableExtensions("gl_SubGroupGtMaskARB",     1, &E_GL_ARB_shader_ballot);
+            symbolTable.setVariableExtensions("gl_SubGroupLeMaskARB",     1, &E_GL_ARB_shader_ballot);
+            symbolTable.setVariableExtensions("gl_SubGroupLtMaskARB",     1, &E_GL_ARB_shader_ballot);
+
+            BuiltInVariable("gl_SubGroupInvocationARB", EbvSubGroupInvocation, symbolTable);
+            BuiltInVariable("gl_SubGroupEqMaskARB",     EbvSubGroupEqMask,     symbolTable);
+            BuiltInVariable("gl_SubGroupGeMaskARB",     EbvSubGroupGeMask,     symbolTable);
+            BuiltInVariable("gl_SubGroupGtMaskARB",     EbvSubGroupGtMask,     symbolTable);
+            BuiltInVariable("gl_SubGroupLeMaskARB",     EbvSubGroupLeMask,     symbolTable);
+            BuiltInVariable("gl_SubGroupLtMaskARB",     EbvSubGroupLtMask,     symbolTable);
+
+            if (spvVersion.vulkan > 0)
+                // Treat "gl_SubGroupSizeARB" as shader input instead of uniform for Vulkan
+                SpecialQualifier("gl_SubGroupSizeARB", EvqVaryingIn, EbvSubGroupSize, symbolTable);
+            else
+                BuiltInVariable("gl_SubGroupSizeARB", EbvSubGroupSize, symbolTable);
+        }
+
+        // GL_KHR_shader_subgroup
+        if (spvVersion.vulkan > 0) {
+            symbolTable.setVariableExtensions("gl_SubgroupSize",         1, &E_GL_KHR_shader_subgroup_basic);
+            symbolTable.setVariableExtensions("gl_SubgroupInvocationID", 1, &E_GL_KHR_shader_subgroup_basic);
+            symbolTable.setVariableExtensions("gl_SubgroupEqMask",       1, &E_GL_KHR_shader_subgroup_ballot);
+            symbolTable.setVariableExtensions("gl_SubgroupGeMask",       1, &E_GL_KHR_shader_subgroup_ballot);
+            symbolTable.setVariableExtensions("gl_SubgroupGtMask",       1, &E_GL_KHR_shader_subgroup_ballot);
+            symbolTable.setVariableExtensions("gl_SubgroupLeMask",       1, &E_GL_KHR_shader_subgroup_ballot);
+            symbolTable.setVariableExtensions("gl_SubgroupLtMask",       1, &E_GL_KHR_shader_subgroup_ballot);
+
+            BuiltInVariable("gl_SubgroupSize",         EbvSubgroupSize2,       symbolTable);
+            BuiltInVariable("gl_SubgroupInvocationID", EbvSubgroupInvocation2, symbolTable);
+            BuiltInVariable("gl_SubgroupEqMask",       EbvSubgroupEqMask2,     symbolTable);
+            BuiltInVariable("gl_SubgroupGeMask",       EbvSubgroupGeMask2,     symbolTable);
+            BuiltInVariable("gl_SubgroupGtMask",       EbvSubgroupGtMask2,     symbolTable);
+            BuiltInVariable("gl_SubgroupLeMask",       EbvSubgroupLeMask2,     symbolTable);
+            BuiltInVariable("gl_SubgroupLtMask",       EbvSubgroupLtMask2,     symbolTable);
+
+            symbolTable.setFunctionExtensions("subgroupBarrier",                 1, &E_GL_KHR_shader_subgroup_basic);
+            symbolTable.setFunctionExtensions("subgroupMemoryBarrier",           1, &E_GL_KHR_shader_subgroup_basic);
+            symbolTable.setFunctionExtensions("subgroupMemoryBarrierBuffer",     1, &E_GL_KHR_shader_subgroup_basic);
+            symbolTable.setFunctionExtensions("subgroupMemoryBarrierImage",      1, &E_GL_KHR_shader_subgroup_basic);
+            symbolTable.setFunctionExtensions("subgroupElect",                   1, &E_GL_KHR_shader_subgroup_basic);
+            symbolTable.setFunctionExtensions("subgroupAll",                     1, &E_GL_KHR_shader_subgroup_vote);
+            symbolTable.setFunctionExtensions("subgroupAny",                     1, &E_GL_KHR_shader_subgroup_vote);
+            symbolTable.setFunctionExtensions("subgroupAllEqual",                1, &E_GL_KHR_shader_subgroup_vote);
+            symbolTable.setFunctionExtensions("subgroupBroadcast",               1, &E_GL_KHR_shader_subgroup_ballot);
+            symbolTable.setFunctionExtensions("subgroupBroadcastFirst",          1, &E_GL_KHR_shader_subgroup_ballot);
+            symbolTable.setFunctionExtensions("subgroupBallot",                  1, &E_GL_KHR_shader_subgroup_ballot);
+            symbolTable.setFunctionExtensions("subgroupInverseBallot",           1, &E_GL_KHR_shader_subgroup_ballot);
+            symbolTable.setFunctionExtensions("subgroupBallotBitExtract",        1, &E_GL_KHR_shader_subgroup_ballot);
+            symbolTable.setFunctionExtensions("subgroupBallotBitCount",          1, &E_GL_KHR_shader_subgroup_ballot);
+            symbolTable.setFunctionExtensions("subgroupBallotInclusiveBitCount", 1, &E_GL_KHR_shader_subgroup_ballot);
+            symbolTable.setFunctionExtensions("subgroupBallotExclusiveBitCount", 1, &E_GL_KHR_shader_subgroup_ballot);
+            symbolTable.setFunctionExtensions("subgroupBallotFindLSB",           1, &E_GL_KHR_shader_subgroup_ballot);
+            symbolTable.setFunctionExtensions("subgroupBallotFindMSB",           1, &E_GL_KHR_shader_subgroup_ballot);
+            symbolTable.setFunctionExtensions("subgroupShuffle",                 1, &E_GL_KHR_shader_subgroup_shuffle);
+            symbolTable.setFunctionExtensions("subgroupShuffleXor",              1, &E_GL_KHR_shader_subgroup_shuffle);
+            symbolTable.setFunctionExtensions("subgroupShuffleUp",               1, &E_GL_KHR_shader_subgroup_shuffle_relative);
+            symbolTable.setFunctionExtensions("subgroupShuffleDown",             1, &E_GL_KHR_shader_subgroup_shuffle_relative);
+            symbolTable.setFunctionExtensions("subgroupAdd",                     1, &E_GL_KHR_shader_subgroup_arithmetic);
+            symbolTable.setFunctionExtensions("subgroupMul",                     1, &E_GL_KHR_shader_subgroup_arithmetic);
+            symbolTable.setFunctionExtensions("subgroupMin",                     1, &E_GL_KHR_shader_subgroup_arithmetic);
+            symbolTable.setFunctionExtensions("subgroupMax",                     1, &E_GL_KHR_shader_subgroup_arithmetic);
+            symbolTable.setFunctionExtensions("subgroupAnd",                     1, &E_GL_KHR_shader_subgroup_arithmetic);
+            symbolTable.setFunctionExtensions("subgroupOr",                      1, &E_GL_KHR_shader_subgroup_arithmetic);
+            symbolTable.setFunctionExtensions("subgroupXor",                     1, &E_GL_KHR_shader_subgroup_arithmetic);
+            symbolTable.setFunctionExtensions("subgroupInclusiveAdd",            1, &E_GL_KHR_shader_subgroup_arithmetic);
+            symbolTable.setFunctionExtensions("subgroupInclusiveMul",            1, &E_GL_KHR_shader_subgroup_arithmetic);
+            symbolTable.setFunctionExtensions("subgroupInclusiveMin",            1, &E_GL_KHR_shader_subgroup_arithmetic);
+            symbolTable.setFunctionExtensions("subgroupInclusiveMax",            1, &E_GL_KHR_shader_subgroup_arithmetic);
+            symbolTable.setFunctionExtensions("subgroupInclusiveAnd",            1, &E_GL_KHR_shader_subgroup_arithmetic);
+            symbolTable.setFunctionExtensions("subgroupInclusiveOr",             1, &E_GL_KHR_shader_subgroup_arithmetic);
+            symbolTable.setFunctionExtensions("subgroupInclusiveXor",            1, &E_GL_KHR_shader_subgroup_arithmetic);
+            symbolTable.setFunctionExtensions("subgroupExclusiveAdd",            1, &E_GL_KHR_shader_subgroup_arithmetic);
+            symbolTable.setFunctionExtensions("subgroupExclusiveMul",            1, &E_GL_KHR_shader_subgroup_arithmetic);
+            symbolTable.setFunctionExtensions("subgroupExclusiveMin",            1, &E_GL_KHR_shader_subgroup_arithmetic);
+            symbolTable.setFunctionExtensions("subgroupExclusiveMax",            1, &E_GL_KHR_shader_subgroup_arithmetic);
+            symbolTable.setFunctionExtensions("subgroupExclusiveAnd",            1, &E_GL_KHR_shader_subgroup_arithmetic);
+            symbolTable.setFunctionExtensions("subgroupExclusiveOr",             1, &E_GL_KHR_shader_subgroup_arithmetic);
+            symbolTable.setFunctionExtensions("subgroupExclusiveXor",            1, &E_GL_KHR_shader_subgroup_arithmetic);
+            symbolTable.setFunctionExtensions("subgroupClusteredAdd",            1, &E_GL_KHR_shader_subgroup_clustered);
+            symbolTable.setFunctionExtensions("subgroupClusteredMul",            1, &E_GL_KHR_shader_subgroup_clustered);
+            symbolTable.setFunctionExtensions("subgroupClusteredMin",            1, &E_GL_KHR_shader_subgroup_clustered);
+            symbolTable.setFunctionExtensions("subgroupClusteredMax",            1, &E_GL_KHR_shader_subgroup_clustered);
+            symbolTable.setFunctionExtensions("subgroupClusteredAnd",            1, &E_GL_KHR_shader_subgroup_clustered);
+            symbolTable.setFunctionExtensions("subgroupClusteredOr",             1, &E_GL_KHR_shader_subgroup_clustered);
+            symbolTable.setFunctionExtensions("subgroupClusteredXor",            1, &E_GL_KHR_shader_subgroup_clustered);
+            symbolTable.setFunctionExtensions("subgroupQuadBroadcast",           1, &E_GL_KHR_shader_subgroup_quad);
+            symbolTable.setFunctionExtensions("subgroupQuadSwapHorizontal",      1, &E_GL_KHR_shader_subgroup_quad);
+            symbolTable.setFunctionExtensions("subgroupQuadSwapVertical",        1, &E_GL_KHR_shader_subgroup_quad);
+            symbolTable.setFunctionExtensions("subgroupQuadSwapDiagonal",        1, &E_GL_KHR_shader_subgroup_quad);
+
+#ifdef NV_EXTENSIONS
+            symbolTable.setFunctionExtensions("subgroupPartitionNV",                          1, &E_GL_NV_shader_subgroup_partitioned);
+            symbolTable.setFunctionExtensions("subgroupPartitionedAddNV",                     1, &E_GL_NV_shader_subgroup_partitioned);
+            symbolTable.setFunctionExtensions("subgroupPartitionedMulNV",                     1, &E_GL_NV_shader_subgroup_partitioned);
+            symbolTable.setFunctionExtensions("subgroupPartitionedMinNV",                     1, &E_GL_NV_shader_subgroup_partitioned);
+            symbolTable.setFunctionExtensions("subgroupPartitionedMaxNV",                     1, &E_GL_NV_shader_subgroup_partitioned);
+            symbolTable.setFunctionExtensions("subgroupPartitionedAndNV",                     1, &E_GL_NV_shader_subgroup_partitioned);
+            symbolTable.setFunctionExtensions("subgroupPartitionedOrNV",                      1, &E_GL_NV_shader_subgroup_partitioned);
+            symbolTable.setFunctionExtensions("subgroupPartitionedXorNV",                     1, &E_GL_NV_shader_subgroup_partitioned);
+            symbolTable.setFunctionExtensions("subgroupPartitionedInclusiveAddNV",            1, &E_GL_NV_shader_subgroup_partitioned);
+            symbolTable.setFunctionExtensions("subgroupPartitionedInclusiveMulNV",            1, &E_GL_NV_shader_subgroup_partitioned);
+            symbolTable.setFunctionExtensions("subgroupPartitionedInclusiveMinNV",            1, &E_GL_NV_shader_subgroup_partitioned);
+            symbolTable.setFunctionExtensions("subgroupPartitionedInclusiveMaxNV",            1, &E_GL_NV_shader_subgroup_partitioned);
+            symbolTable.setFunctionExtensions("subgroupPartitionedInclusiveAndNV",            1, &E_GL_NV_shader_subgroup_partitioned);
+            symbolTable.setFunctionExtensions("subgroupPartitionedInclusiveOrNV",             1, &E_GL_NV_shader_subgroup_partitioned);
+            symbolTable.setFunctionExtensions("subgroupPartitionedInclusiveXorNV",            1, &E_GL_NV_shader_subgroup_partitioned);
+            symbolTable.setFunctionExtensions("subgroupPartitionedExclusiveAddNV",            1, &E_GL_NV_shader_subgroup_partitioned);
+            symbolTable.setFunctionExtensions("subgroupPartitionedExclusiveMulNV",            1, &E_GL_NV_shader_subgroup_partitioned);
+            symbolTable.setFunctionExtensions("subgroupPartitionedExclusiveMinNV",            1, &E_GL_NV_shader_subgroup_partitioned);
+            symbolTable.setFunctionExtensions("subgroupPartitionedExclusiveMaxNV",            1, &E_GL_NV_shader_subgroup_partitioned);
+            symbolTable.setFunctionExtensions("subgroupPartitionedExclusiveAndNV",            1, &E_GL_NV_shader_subgroup_partitioned);
+            symbolTable.setFunctionExtensions("subgroupPartitionedExclusiveOrNV",             1, &E_GL_NV_shader_subgroup_partitioned);
+            symbolTable.setFunctionExtensions("subgroupPartitionedExclusiveXorNV",            1, &E_GL_NV_shader_subgroup_partitioned);
+#endif
+
+        }
+
+        if (profile == EEsProfile) {
+            symbolTable.setFunctionExtensions("shadow2DEXT",        1, &E_GL_EXT_shadow_samplers);
+            symbolTable.setFunctionExtensions("shadow2DProjEXT",    1, &E_GL_EXT_shadow_samplers);
+        }
+
+        if (spvVersion.vulkan > 0) {
+            symbolTable.setVariableExtensions("gl_ScopeDevice",             1, &E_GL_KHR_memory_scope_semantics);
+            symbolTable.setVariableExtensions("gl_ScopeWorkgroup",          1, &E_GL_KHR_memory_scope_semantics);
+            symbolTable.setVariableExtensions("gl_ScopeSubgroup",           1, &E_GL_KHR_memory_scope_semantics);
+            symbolTable.setVariableExtensions("gl_ScopeInvocation",         1, &E_GL_KHR_memory_scope_semantics);
+
+            symbolTable.setVariableExtensions("gl_SemanticsRelaxed",        1, &E_GL_KHR_memory_scope_semantics);
+            symbolTable.setVariableExtensions("gl_SemanticsAcquire",        1, &E_GL_KHR_memory_scope_semantics);
+            symbolTable.setVariableExtensions("gl_SemanticsRelease",        1, &E_GL_KHR_memory_scope_semantics);
+            symbolTable.setVariableExtensions("gl_SemanticsAcquireRelease", 1, &E_GL_KHR_memory_scope_semantics);
+            symbolTable.setVariableExtensions("gl_SemanticsMakeAvailable",  1, &E_GL_KHR_memory_scope_semantics);
+            symbolTable.setVariableExtensions("gl_SemanticsMakeVisible",    1, &E_GL_KHR_memory_scope_semantics);
+
+            symbolTable.setVariableExtensions("gl_StorageSemanticsNone",    1, &E_GL_KHR_memory_scope_semantics);
+            symbolTable.setVariableExtensions("gl_StorageSemanticsBuffer",  1, &E_GL_KHR_memory_scope_semantics);
+            symbolTable.setVariableExtensions("gl_StorageSemanticsShared",  1, &E_GL_KHR_memory_scope_semantics);
+            symbolTable.setVariableExtensions("gl_StorageSemanticsImage",   1, &E_GL_KHR_memory_scope_semantics);
+            symbolTable.setVariableExtensions("gl_StorageSemanticsOutput",  1, &E_GL_KHR_memory_scope_semantics);
+        }
         break;
 
     case EShLangCompute:
@@ -5406,6 +8571,51 @@
             symbolTable.setFunctionExtensions("groupMemoryBarrier",         1, &E_GL_ARB_compute_shader);
         }
 
+        symbolTable.setFunctionExtensions("controlBarrier",                 1, &E_GL_KHR_memory_scope_semantics);
+
+        // GL_ARB_shader_ballot
+        if (profile != EEsProfile) {
+            symbolTable.setVariableExtensions("gl_SubGroupSizeARB",       1, &E_GL_ARB_shader_ballot);
+            symbolTable.setVariableExtensions("gl_SubGroupInvocationARB", 1, &E_GL_ARB_shader_ballot);
+            symbolTable.setVariableExtensions("gl_SubGroupEqMaskARB",     1, &E_GL_ARB_shader_ballot);
+            symbolTable.setVariableExtensions("gl_SubGroupGeMaskARB",     1, &E_GL_ARB_shader_ballot);
+            symbolTable.setVariableExtensions("gl_SubGroupGtMaskARB",     1, &E_GL_ARB_shader_ballot);
+            symbolTable.setVariableExtensions("gl_SubGroupLeMaskARB",     1, &E_GL_ARB_shader_ballot);
+            symbolTable.setVariableExtensions("gl_SubGroupLtMaskARB",     1, &E_GL_ARB_shader_ballot);
+
+            BuiltInVariable("gl_SubGroupInvocationARB", EbvSubGroupInvocation, symbolTable);
+            BuiltInVariable("gl_SubGroupEqMaskARB",     EbvSubGroupEqMask,     symbolTable);
+            BuiltInVariable("gl_SubGroupGeMaskARB",     EbvSubGroupGeMask,     symbolTable);
+            BuiltInVariable("gl_SubGroupGtMaskARB",     EbvSubGroupGtMask,     symbolTable);
+            BuiltInVariable("gl_SubGroupLeMaskARB",     EbvSubGroupLeMask,     symbolTable);
+            BuiltInVariable("gl_SubGroupLtMaskARB",     EbvSubGroupLtMask,     symbolTable);
+
+            if (spvVersion.vulkan > 0)
+                // Treat "gl_SubGroupSizeARB" as shader input instead of uniform for Vulkan
+                SpecialQualifier("gl_SubGroupSizeARB", EvqVaryingIn, EbvSubGroupSize, symbolTable);
+            else
+                BuiltInVariable("gl_SubGroupSizeARB", EbvSubGroupSize, symbolTable);
+        }
+
+        // GL_KHR_shader_subgroup
+        if (spvVersion.vulkan > 0) {
+            symbolTable.setVariableExtensions("gl_SubgroupSize",         1, &E_GL_KHR_shader_subgroup_basic);
+            symbolTable.setVariableExtensions("gl_SubgroupInvocationID", 1, &E_GL_KHR_shader_subgroup_basic);
+            symbolTable.setVariableExtensions("gl_SubgroupEqMask",       1, &E_GL_KHR_shader_subgroup_ballot);
+            symbolTable.setVariableExtensions("gl_SubgroupGeMask",       1, &E_GL_KHR_shader_subgroup_ballot);
+            symbolTable.setVariableExtensions("gl_SubgroupGtMask",       1, &E_GL_KHR_shader_subgroup_ballot);
+            symbolTable.setVariableExtensions("gl_SubgroupLeMask",       1, &E_GL_KHR_shader_subgroup_ballot);
+            symbolTable.setVariableExtensions("gl_SubgroupLtMask",       1, &E_GL_KHR_shader_subgroup_ballot);
+
+            BuiltInVariable("gl_SubgroupSize",         EbvSubgroupSize2,       symbolTable);
+            BuiltInVariable("gl_SubgroupInvocationID", EbvSubgroupInvocation2, symbolTable);
+            BuiltInVariable("gl_SubgroupEqMask",       EbvSubgroupEqMask2,     symbolTable);
+            BuiltInVariable("gl_SubgroupGeMask",       EbvSubgroupGeMask2,     symbolTable);
+            BuiltInVariable("gl_SubgroupGtMask",       EbvSubgroupGtMask2,     symbolTable);
+            BuiltInVariable("gl_SubgroupLeMask",       EbvSubgroupLeMask2,     symbolTable);
+            BuiltInVariable("gl_SubgroupLtMask",       EbvSubgroupLtMask2,     symbolTable);
+        }
+
         if ((profile != EEsProfile && version >= 140) ||
             (profile == EEsProfile && version >= 310)) {
             symbolTable.setVariableExtensions("gl_DeviceIndex",  1, &E_GL_EXT_device_group);
@@ -5414,7 +8624,259 @@
             BuiltInVariable("gl_ViewIndex", EbvViewIndex, symbolTable);
         }
 
+        // GL_KHR_shader_subgroup
+        if (spvVersion.vulkan > 0) {
+            symbolTable.setVariableExtensions("gl_NumSubgroups", 1, &E_GL_KHR_shader_subgroup_basic);
+            symbolTable.setVariableExtensions("gl_SubgroupID",   1, &E_GL_KHR_shader_subgroup_basic);
+
+            BuiltInVariable("gl_NumSubgroups", EbvNumSubgroups, symbolTable);
+            BuiltInVariable("gl_SubgroupID",   EbvSubgroupID,   symbolTable);
+
+            symbolTable.setFunctionExtensions("subgroupMemoryBarrierShared", 1, &E_GL_KHR_shader_subgroup_basic);
+        }
         break;
+#ifdef NV_EXTENSIONS
+    case EShLangRayGenNV:
+    case EShLangIntersectNV:
+    case EShLangAnyHitNV:
+    case EShLangClosestHitNV:
+    case EShLangMissNV:
+    case EShLangCallableNV:
+        if (profile != EEsProfile && version >= 460) {
+            symbolTable.setVariableExtensions("gl_LaunchIDNV", 1, &E_GL_NV_ray_tracing);
+            symbolTable.setVariableExtensions("gl_LaunchSizeNV", 1, &E_GL_NV_ray_tracing);
+            symbolTable.setVariableExtensions("gl_PrimitiveID", 1, &E_GL_NV_ray_tracing);
+            symbolTable.setVariableExtensions("gl_InstanceID", 1, &E_GL_NV_ray_tracing);
+            symbolTable.setVariableExtensions("gl_InstanceCustomIndexNV", 1, &E_GL_NV_ray_tracing);
+            symbolTable.setVariableExtensions("gl_WorldRayOriginNV", 1, &E_GL_NV_ray_tracing);
+            symbolTable.setVariableExtensions("gl_WorldRayDirectionNV", 1, &E_GL_NV_ray_tracing);
+            symbolTable.setVariableExtensions("gl_ObjectRayOriginNV", 1, &E_GL_NV_ray_tracing);
+            symbolTable.setVariableExtensions("gl_ObjectRayDirectionNV", 1, &E_GL_NV_ray_tracing);
+            symbolTable.setVariableExtensions("gl_RayTminNV", 1, &E_GL_NV_ray_tracing);
+            symbolTable.setVariableExtensions("gl_RayTmaxNV", 1, &E_GL_NV_ray_tracing);
+            symbolTable.setVariableExtensions("gl_HitTNV", 1, &E_GL_NV_ray_tracing);
+            symbolTable.setVariableExtensions("gl_HitKindNV", 1, &E_GL_NV_ray_tracing);
+            symbolTable.setVariableExtensions("gl_ObjectToWorldNV", 1, &E_GL_NV_ray_tracing);
+            symbolTable.setVariableExtensions("gl_WorldToObjectNV", 1, &E_GL_NV_ray_tracing);
+            symbolTable.setVariableExtensions("gl_IncomingRayFlagsNV", 1, &E_GL_NV_ray_tracing);
+
+            symbolTable.setVariableExtensions("gl_DeviceIndex", 1, &E_GL_EXT_device_group);
+
+            BuiltInVariable("gl_LaunchIDNV",            EbvLaunchIdNV,           symbolTable);
+            BuiltInVariable("gl_LaunchSizeNV",          EbvLaunchSizeNV,         symbolTable);
+            BuiltInVariable("gl_PrimitiveID",           EbvPrimitiveId,          symbolTable);
+            BuiltInVariable("gl_InstanceID",            EbvInstanceId,           symbolTable);
+            BuiltInVariable("gl_InstanceCustomIndexNV", EbvInstanceCustomIndexNV,symbolTable);
+            BuiltInVariable("gl_WorldRayOriginNV",      EbvWorldRayOriginNV,     symbolTable);
+            BuiltInVariable("gl_WorldRayDirectionNV",   EbvWorldRayDirectionNV,  symbolTable);
+            BuiltInVariable("gl_ObjectRayOriginNV",     EbvObjectRayOriginNV,    symbolTable);
+            BuiltInVariable("gl_ObjectRayDirectionNV",  EbvObjectRayDirectionNV, symbolTable);
+            BuiltInVariable("gl_RayTminNV",             EbvRayTminNV,            symbolTable);
+            BuiltInVariable("gl_RayTmaxNV",             EbvRayTmaxNV,            symbolTable);
+            BuiltInVariable("gl_HitTNV",                EbvHitTNV,               symbolTable);
+            BuiltInVariable("gl_HitKindNV",             EbvHitKindNV,            symbolTable);
+            BuiltInVariable("gl_ObjectToWorldNV",       EbvObjectToWorldNV,      symbolTable);
+            BuiltInVariable("gl_WorldToObjectNV",       EbvWorldToObjectNV,      symbolTable);
+            BuiltInVariable("gl_IncomingRayFlagsNV",    EbvIncomingRayFlagsNV,   symbolTable);
+            BuiltInVariable("gl_DeviceIndex",           EbvDeviceIndex,          symbolTable);
+        } 
+        break;
+    case EShLangMeshNV:
+        if ((profile != EEsProfile && version >= 450) || (profile == EEsProfile && version >= 320)) {
+            // Per-vertex builtins
+            BuiltInVariable("gl_MeshVerticesNV", "gl_Position",     EbvPosition,     symbolTable);
+            BuiltInVariable("gl_MeshVerticesNV", "gl_PointSize",    EbvPointSize,    symbolTable);
+            BuiltInVariable("gl_MeshVerticesNV", "gl_ClipDistance", EbvClipDistance, symbolTable);
+            BuiltInVariable("gl_MeshVerticesNV", "gl_CullDistance", EbvCullDistance, symbolTable);
+            // Per-view builtins
+            BuiltInVariable("gl_MeshVerticesNV", "gl_PositionPerViewNV",     EbvPositionPerViewNV,     symbolTable);
+            BuiltInVariable("gl_MeshVerticesNV", "gl_ClipDistancePerViewNV", EbvClipDistancePerViewNV, symbolTable);
+            BuiltInVariable("gl_MeshVerticesNV", "gl_CullDistancePerViewNV", EbvCullDistancePerViewNV, symbolTable);
+
+            // Per-primitive builtins
+            BuiltInVariable("gl_MeshPrimitivesNV", "gl_PrimitiveID",   EbvPrimitiveId,    symbolTable);
+            BuiltInVariable("gl_MeshPrimitivesNV", "gl_Layer",         EbvLayer,          symbolTable);
+            BuiltInVariable("gl_MeshPrimitivesNV", "gl_ViewportIndex", EbvViewportIndex,  symbolTable);
+            BuiltInVariable("gl_MeshPrimitivesNV", "gl_ViewportMask",  EbvViewportMaskNV, symbolTable);
+            // Per-view builtins
+            BuiltInVariable("gl_MeshPrimitivesNV", "gl_LayerPerViewNV",        EbvLayerPerViewNV,        symbolTable);
+            BuiltInVariable("gl_MeshPrimitivesNV", "gl_ViewportMaskPerViewNV", EbvViewportMaskPerViewNV, symbolTable);
+
+            symbolTable.setVariableExtensions("gl_PrimitiveCountNV",     1, &E_GL_NV_mesh_shader);
+            symbolTable.setVariableExtensions("gl_PrimitiveIndicesNV",   1, &E_GL_NV_mesh_shader);
+            symbolTable.setVariableExtensions("gl_MeshViewCountNV",      1, &E_GL_NV_mesh_shader);
+            symbolTable.setVariableExtensions("gl_MeshViewIndicesNV",    1, &E_GL_NV_mesh_shader);
+            symbolTable.setVariableExtensions("gl_WorkGroupSize",        1, &E_GL_NV_mesh_shader);
+            symbolTable.setVariableExtensions("gl_WorkGroupID",          1, &E_GL_NV_mesh_shader);
+            symbolTable.setVariableExtensions("gl_LocalInvocationID",    1, &E_GL_NV_mesh_shader);
+            symbolTable.setVariableExtensions("gl_GlobalInvocationID",   1, &E_GL_NV_mesh_shader);
+            symbolTable.setVariableExtensions("gl_LocalInvocationIndex", 1, &E_GL_NV_mesh_shader);
+
+            BuiltInVariable("gl_PrimitiveCountNV",     EbvPrimitiveCountNV,     symbolTable);
+            BuiltInVariable("gl_PrimitiveIndicesNV",   EbvPrimitiveIndicesNV,   symbolTable);
+            BuiltInVariable("gl_MeshViewCountNV",      EbvMeshViewCountNV,      symbolTable);
+            BuiltInVariable("gl_MeshViewIndicesNV",    EbvMeshViewIndicesNV,    symbolTable);
+            BuiltInVariable("gl_WorkGroupSize",        EbvWorkGroupSize,        symbolTable);
+            BuiltInVariable("gl_WorkGroupID",          EbvWorkGroupId,          symbolTable);
+            BuiltInVariable("gl_LocalInvocationID",    EbvLocalInvocationId,    symbolTable);
+            BuiltInVariable("gl_GlobalInvocationID",   EbvGlobalInvocationId,   symbolTable);
+            BuiltInVariable("gl_LocalInvocationIndex", EbvLocalInvocationIndex, symbolTable);
+
+            symbolTable.setVariableExtensions("gl_MaxMeshOutputVerticesNV",   1, &E_GL_NV_mesh_shader);
+            symbolTable.setVariableExtensions("gl_MaxMeshOutputPrimitivesNV", 1, &E_GL_NV_mesh_shader);
+            symbolTable.setVariableExtensions("gl_MaxMeshWorkGroupSizeNV",    1, &E_GL_NV_mesh_shader);
+            symbolTable.setVariableExtensions("gl_MaxMeshViewCountNV",        1, &E_GL_NV_mesh_shader);
+
+            symbolTable.setFunctionExtensions("barrier",                      1, &E_GL_NV_mesh_shader);
+            symbolTable.setFunctionExtensions("memoryBarrierShared",          1, &E_GL_NV_mesh_shader);
+            symbolTable.setFunctionExtensions("groupMemoryBarrier",           1, &E_GL_NV_mesh_shader);
+        }
+
+        if (profile != EEsProfile && version >= 450) {
+            // GL_EXT_device_group
+            symbolTable.setVariableExtensions("gl_DeviceIndex", 1, &E_GL_EXT_device_group);
+            BuiltInVariable("gl_DeviceIndex", EbvDeviceIndex, symbolTable);
+
+            // GL_ARB_shader_draw_parameters
+            symbolTable.setVariableExtensions("gl_DrawIDARB", 1, &E_GL_ARB_shader_draw_parameters);
+            BuiltInVariable("gl_DrawIDARB", EbvDrawId, symbolTable);
+            if (version >= 460) {
+                BuiltInVariable("gl_DrawID", EbvDrawId, symbolTable);
+            }
+
+            // GL_ARB_shader_ballot
+            symbolTable.setVariableExtensions("gl_SubGroupSizeARB",       1, &E_GL_ARB_shader_ballot);
+            symbolTable.setVariableExtensions("gl_SubGroupInvocationARB", 1, &E_GL_ARB_shader_ballot);
+            symbolTable.setVariableExtensions("gl_SubGroupEqMaskARB",     1, &E_GL_ARB_shader_ballot);
+            symbolTable.setVariableExtensions("gl_SubGroupGeMaskARB",     1, &E_GL_ARB_shader_ballot);
+            symbolTable.setVariableExtensions("gl_SubGroupGtMaskARB",     1, &E_GL_ARB_shader_ballot);
+            symbolTable.setVariableExtensions("gl_SubGroupLeMaskARB",     1, &E_GL_ARB_shader_ballot);
+            symbolTable.setVariableExtensions("gl_SubGroupLtMaskARB",     1, &E_GL_ARB_shader_ballot);
+
+            BuiltInVariable("gl_SubGroupInvocationARB", EbvSubGroupInvocation, symbolTable);
+            BuiltInVariable("gl_SubGroupEqMaskARB",     EbvSubGroupEqMask,     symbolTable);
+            BuiltInVariable("gl_SubGroupGeMaskARB",     EbvSubGroupGeMask,     symbolTable);
+            BuiltInVariable("gl_SubGroupGtMaskARB",     EbvSubGroupGtMask,     symbolTable);
+            BuiltInVariable("gl_SubGroupLeMaskARB",     EbvSubGroupLeMask,     symbolTable);
+            BuiltInVariable("gl_SubGroupLtMaskARB",     EbvSubGroupLtMask,     symbolTable);
+
+            if (spvVersion.vulkan > 0)
+                // Treat "gl_SubGroupSizeARB" as shader input instead of uniform for Vulkan
+                SpecialQualifier("gl_SubGroupSizeARB", EvqVaryingIn, EbvSubGroupSize, symbolTable);
+            else
+                BuiltInVariable("gl_SubGroupSizeARB", EbvSubGroupSize, symbolTable);
+        }
+
+        // GL_KHR_shader_subgroup
+        if (spvVersion.vulkan > 0) {
+            symbolTable.setVariableExtensions("gl_NumSubgroups",         1, &E_GL_KHR_shader_subgroup_basic);
+            symbolTable.setVariableExtensions("gl_SubgroupID",           1, &E_GL_KHR_shader_subgroup_basic);
+            symbolTable.setVariableExtensions("gl_SubgroupSize",         1, &E_GL_KHR_shader_subgroup_basic);
+            symbolTable.setVariableExtensions("gl_SubgroupInvocationID", 1, &E_GL_KHR_shader_subgroup_basic);
+            symbolTable.setVariableExtensions("gl_SubgroupEqMask",       1, &E_GL_KHR_shader_subgroup_ballot);
+            symbolTable.setVariableExtensions("gl_SubgroupGeMask",       1, &E_GL_KHR_shader_subgroup_ballot);
+            symbolTable.setVariableExtensions("gl_SubgroupGtMask",       1, &E_GL_KHR_shader_subgroup_ballot);
+            symbolTable.setVariableExtensions("gl_SubgroupLeMask",       1, &E_GL_KHR_shader_subgroup_ballot);
+            symbolTable.setVariableExtensions("gl_SubgroupLtMask",       1, &E_GL_KHR_shader_subgroup_ballot);
+
+            BuiltInVariable("gl_NumSubgroups",         EbvNumSubgroups,        symbolTable);
+            BuiltInVariable("gl_SubgroupID",           EbvSubgroupID,          symbolTable);
+            BuiltInVariable("gl_SubgroupSize",         EbvSubgroupSize2,       symbolTable);
+            BuiltInVariable("gl_SubgroupInvocationID", EbvSubgroupInvocation2, symbolTable);
+            BuiltInVariable("gl_SubgroupEqMask",       EbvSubgroupEqMask2,     symbolTable);
+            BuiltInVariable("gl_SubgroupGeMask",       EbvSubgroupGeMask2,     symbolTable);
+            BuiltInVariable("gl_SubgroupGtMask",       EbvSubgroupGtMask2,     symbolTable);
+            BuiltInVariable("gl_SubgroupLeMask",       EbvSubgroupLeMask2,     symbolTable);
+            BuiltInVariable("gl_SubgroupLtMask",       EbvSubgroupLtMask2,     symbolTable);
+
+            symbolTable.setFunctionExtensions("subgroupMemoryBarrierShared", 1, &E_GL_KHR_shader_subgroup_basic);
+        }
+        break;
+
+    case EShLangTaskNV:
+        if ((profile != EEsProfile && version >= 450) || (profile == EEsProfile && version >= 320)) {
+            symbolTable.setVariableExtensions("gl_TaskCountNV",          1, &E_GL_NV_mesh_shader);
+            symbolTable.setVariableExtensions("gl_WorkGroupSize",        1, &E_GL_NV_mesh_shader);
+            symbolTable.setVariableExtensions("gl_WorkGroupID",          1, &E_GL_NV_mesh_shader);
+            symbolTable.setVariableExtensions("gl_LocalInvocationID",    1, &E_GL_NV_mesh_shader);
+            symbolTable.setVariableExtensions("gl_GlobalInvocationID",   1, &E_GL_NV_mesh_shader);
+            symbolTable.setVariableExtensions("gl_LocalInvocationIndex", 1, &E_GL_NV_mesh_shader);
+
+            BuiltInVariable("gl_TaskCountNV",          EbvTaskCountNV,          symbolTable);
+            BuiltInVariable("gl_WorkGroupSize",        EbvWorkGroupSize,        symbolTable);
+            BuiltInVariable("gl_WorkGroupID",          EbvWorkGroupId,          symbolTable);
+            BuiltInVariable("gl_LocalInvocationID",    EbvLocalInvocationId,    symbolTable);
+            BuiltInVariable("gl_GlobalInvocationID",   EbvGlobalInvocationId,   symbolTable);
+            BuiltInVariable("gl_LocalInvocationIndex", EbvLocalInvocationIndex, symbolTable);
+
+            symbolTable.setVariableExtensions("gl_MaxTaskWorkGroupSizeNV", 1, &E_GL_NV_mesh_shader);
+
+            symbolTable.setFunctionExtensions("barrier",                   1, &E_GL_NV_mesh_shader);
+            symbolTable.setFunctionExtensions("memoryBarrierShared",       1, &E_GL_NV_mesh_shader);
+            symbolTable.setFunctionExtensions("groupMemoryBarrier",        1, &E_GL_NV_mesh_shader);
+        }
+
+        if (profile != EEsProfile && version >= 450) {
+            // GL_EXT_device_group
+            symbolTable.setVariableExtensions("gl_DeviceIndex", 1, &E_GL_EXT_device_group);
+            BuiltInVariable("gl_DeviceIndex", EbvDeviceIndex, symbolTable);
+
+            // GL_ARB_shader_draw_parameters
+            symbolTable.setVariableExtensions("gl_DrawIDARB", 1, &E_GL_ARB_shader_draw_parameters);
+            BuiltInVariable("gl_DrawIDARB", EbvDrawId, symbolTable);
+            if (version >= 460) {
+                BuiltInVariable("gl_DrawID", EbvDrawId, symbolTable);
+            }
+
+            // GL_ARB_shader_ballot
+            symbolTable.setVariableExtensions("gl_SubGroupSizeARB",       1, &E_GL_ARB_shader_ballot);
+            symbolTable.setVariableExtensions("gl_SubGroupInvocationARB", 1, &E_GL_ARB_shader_ballot);
+            symbolTable.setVariableExtensions("gl_SubGroupEqMaskARB",     1, &E_GL_ARB_shader_ballot);
+            symbolTable.setVariableExtensions("gl_SubGroupGeMaskARB",     1, &E_GL_ARB_shader_ballot);
+            symbolTable.setVariableExtensions("gl_SubGroupGtMaskARB",     1, &E_GL_ARB_shader_ballot);
+            symbolTable.setVariableExtensions("gl_SubGroupLeMaskARB",     1, &E_GL_ARB_shader_ballot);
+            symbolTable.setVariableExtensions("gl_SubGroupLtMaskARB",     1, &E_GL_ARB_shader_ballot);
+
+            BuiltInVariable("gl_SubGroupInvocationARB", EbvSubGroupInvocation, symbolTable);
+            BuiltInVariable("gl_SubGroupEqMaskARB",     EbvSubGroupEqMask,     symbolTable);
+            BuiltInVariable("gl_SubGroupGeMaskARB",     EbvSubGroupGeMask,     symbolTable);
+            BuiltInVariable("gl_SubGroupGtMaskARB",     EbvSubGroupGtMask,     symbolTable);
+            BuiltInVariable("gl_SubGroupLeMaskARB",     EbvSubGroupLeMask,     symbolTable);
+            BuiltInVariable("gl_SubGroupLtMaskARB",     EbvSubGroupLtMask,     symbolTable);
+
+            if (spvVersion.vulkan > 0)
+                // Treat "gl_SubGroupSizeARB" as shader input instead of uniform for Vulkan
+                SpecialQualifier("gl_SubGroupSizeARB", EvqVaryingIn, EbvSubGroupSize, symbolTable);
+            else
+                BuiltInVariable("gl_SubGroupSizeARB", EbvSubGroupSize, symbolTable);
+        }
+
+        // GL_KHR_shader_subgroup
+        if (spvVersion.vulkan > 0) {
+            symbolTable.setVariableExtensions("gl_NumSubgroups",         1, &E_GL_KHR_shader_subgroup_basic);
+            symbolTable.setVariableExtensions("gl_SubgroupID",           1, &E_GL_KHR_shader_subgroup_basic);
+            symbolTable.setVariableExtensions("gl_SubgroupSize",         1, &E_GL_KHR_shader_subgroup_basic);
+            symbolTable.setVariableExtensions("gl_SubgroupInvocationID", 1, &E_GL_KHR_shader_subgroup_basic);
+            symbolTable.setVariableExtensions("gl_SubgroupEqMask",       1, &E_GL_KHR_shader_subgroup_ballot);
+            symbolTable.setVariableExtensions("gl_SubgroupGeMask",       1, &E_GL_KHR_shader_subgroup_ballot);
+            symbolTable.setVariableExtensions("gl_SubgroupGtMask",       1, &E_GL_KHR_shader_subgroup_ballot);
+            symbolTable.setVariableExtensions("gl_SubgroupLeMask",       1, &E_GL_KHR_shader_subgroup_ballot);
+            symbolTable.setVariableExtensions("gl_SubgroupLtMask",       1, &E_GL_KHR_shader_subgroup_ballot);
+
+            BuiltInVariable("gl_NumSubgroups",         EbvNumSubgroups,        symbolTable);
+            BuiltInVariable("gl_SubgroupID",           EbvSubgroupID,          symbolTable);
+            BuiltInVariable("gl_SubgroupSize",         EbvSubgroupSize2,       symbolTable);
+            BuiltInVariable("gl_SubgroupInvocationID", EbvSubgroupInvocation2, symbolTable);
+            BuiltInVariable("gl_SubgroupEqMask",       EbvSubgroupEqMask2,     symbolTable);
+            BuiltInVariable("gl_SubgroupGeMask",       EbvSubgroupGeMask2,     symbolTable);
+            BuiltInVariable("gl_SubgroupGtMask",       EbvSubgroupGtMask2,     symbolTable);
+            BuiltInVariable("gl_SubgroupLeMask",       EbvSubgroupLeMask2,     symbolTable);
+            BuiltInVariable("gl_SubgroupLtMask",       EbvSubgroupLtMask2,     symbolTable);
+
+            symbolTable.setFunctionExtensions("subgroupMemoryBarrierShared", 1, &E_GL_KHR_shader_subgroup_basic);
+        }
+        break;
+#endif
 
     default:
         assert(false && "Language not supported");
@@ -5499,6 +8961,15 @@
     symbolTable.relateToOperator("doubleBitsToUint64", EOpDoubleBitsToUint64);
     symbolTable.relateToOperator("int64BitsToDouble",  EOpInt64BitsToDouble);
     symbolTable.relateToOperator("uint64BitsToDouble", EOpUint64BitsToDouble);
+    symbolTable.relateToOperator("halfBitsToInt16",  EOpFloat16BitsToInt16);
+    symbolTable.relateToOperator("halfBitsToUint16", EOpFloat16BitsToUint16);
+    symbolTable.relateToOperator("float16BitsToInt16",  EOpFloat16BitsToInt16);
+    symbolTable.relateToOperator("float16BitsToUint16", EOpFloat16BitsToUint16);
+    symbolTable.relateToOperator("int16BitsToFloat16",  EOpInt16BitsToFloat16);
+    symbolTable.relateToOperator("uint16BitsToFloat16", EOpUint16BitsToFloat16);
+
+    symbolTable.relateToOperator("int16BitsToHalf",  EOpInt16BitsToFloat16);
+    symbolTable.relateToOperator("uint16BitsToHalf", EOpUint16BitsToFloat16);
 
     symbolTable.relateToOperator("packSnorm2x16",   EOpPackSnorm2x16);
     symbolTable.relateToOperator("unpackSnorm2x16", EOpUnpackSnorm2x16);
@@ -5521,10 +8992,25 @@
     symbolTable.relateToOperator("packUint2x32",    EOpPackUint2x32);
     symbolTable.relateToOperator("unpackUint2x32",  EOpUnpackUint2x32);
 
-#ifdef AMD_EXTENSIONS
+    symbolTable.relateToOperator("packInt2x16",     EOpPackInt2x16);
+    symbolTable.relateToOperator("unpackInt2x16",   EOpUnpackInt2x16);
+    symbolTable.relateToOperator("packUint2x16",    EOpPackUint2x16);
+    symbolTable.relateToOperator("unpackUint2x16",  EOpUnpackUint2x16);
+
+    symbolTable.relateToOperator("packInt4x16",     EOpPackInt4x16);
+    symbolTable.relateToOperator("unpackInt4x16",   EOpUnpackInt4x16);
+    symbolTable.relateToOperator("packUint4x16",    EOpPackUint4x16);
+    symbolTable.relateToOperator("unpackUint4x16",  EOpUnpackUint4x16);
     symbolTable.relateToOperator("packFloat2x16",   EOpPackFloat2x16);
     symbolTable.relateToOperator("unpackFloat2x16", EOpUnpackFloat2x16);
-#endif
+
+    symbolTable.relateToOperator("pack16",          EOpPack16);
+    symbolTable.relateToOperator("pack32",          EOpPack32);
+    symbolTable.relateToOperator("pack64",          EOpPack64);
+
+    symbolTable.relateToOperator("unpack32",        EOpUnpack32);
+    symbolTable.relateToOperator("unpack16",        EOpUnpack16);
+    symbolTable.relateToOperator("unpack8",         EOpUnpack8);
 
     symbolTable.relateToOperator("length",       EOpLength);
     symbolTable.relateToOperator("distance",     EOpDistance);
@@ -5539,6 +9025,7 @@
     symbolTable.relateToOperator("all",          EOpAll);
 
     symbolTable.relateToOperator("barrier",                    EOpBarrier);
+    symbolTable.relateToOperator("controlBarrier",             EOpBarrier);
     symbolTable.relateToOperator("memoryBarrier",              EOpMemoryBarrier);
     symbolTable.relateToOperator("memoryBarrierAtomicCounter", EOpMemoryBarrierAtomicCounter);
     symbolTable.relateToOperator("memoryBarrierBuffer",        EOpMemoryBarrierBuffer);
@@ -5552,11 +9039,25 @@
     symbolTable.relateToOperator("atomicXor",      EOpAtomicXor);
     symbolTable.relateToOperator("atomicExchange", EOpAtomicExchange);
     symbolTable.relateToOperator("atomicCompSwap", EOpAtomicCompSwap);
+    symbolTable.relateToOperator("atomicLoad",     EOpAtomicLoad);
+    symbolTable.relateToOperator("atomicStore",    EOpAtomicStore);
 
     symbolTable.relateToOperator("atomicCounterIncrement", EOpAtomicCounterIncrement);
     symbolTable.relateToOperator("atomicCounterDecrement", EOpAtomicCounterDecrement);
     symbolTable.relateToOperator("atomicCounter",          EOpAtomicCounter);
 
+    if (profile != EEsProfile && version >= 460) {
+        symbolTable.relateToOperator("atomicCounterAdd",      EOpAtomicCounterAdd);
+        symbolTable.relateToOperator("atomicCounterSubtract", EOpAtomicCounterSubtract);
+        symbolTable.relateToOperator("atomicCounterMin",      EOpAtomicCounterMin);
+        symbolTable.relateToOperator("atomicCounterMax",      EOpAtomicCounterMax);
+        symbolTable.relateToOperator("atomicCounterAnd",      EOpAtomicCounterAnd);
+        symbolTable.relateToOperator("atomicCounterOr",       EOpAtomicCounterOr);
+        symbolTable.relateToOperator("atomicCounterXor",      EOpAtomicCounterXor);
+        symbolTable.relateToOperator("atomicCounterExchange", EOpAtomicCounterExchange);
+        symbolTable.relateToOperator("atomicCounterCompSwap", EOpAtomicCounterCompSwap);
+    }
+
     symbolTable.relateToOperator("fma",               EOpFma);
     symbolTable.relateToOperator("frexp",             EOpFrexp);
     symbolTable.relateToOperator("ldexp",             EOpLdexp);
@@ -5584,6 +9085,8 @@
         symbolTable.relateToOperator("imageAtomicXor",          EOpImageAtomicXor);
         symbolTable.relateToOperator("imageAtomicExchange",     EOpImageAtomicExchange);
         symbolTable.relateToOperator("imageAtomicCompSwap",     EOpImageAtomicCompSwap);
+        symbolTable.relateToOperator("imageAtomicLoad",         EOpImageAtomicLoad);
+        symbolTable.relateToOperator("imageAtomicStore",        EOpImageAtomicStore);
 
         symbolTable.relateToOperator("subpassLoad",             EOpSubpassLoad);
         symbolTable.relateToOperator("subpassLoadMS",           EOpSubpassLoadMS);
@@ -5615,6 +9118,14 @@
         symbolTable.relateToOperator("noise3", EOpNoise);
         symbolTable.relateToOperator("noise4", EOpNoise);
 
+#ifdef NV_EXTENSIONS
+        symbolTable.relateToOperator("textureFootprintNV",          EOpImageSampleFootprintNV);
+        symbolTable.relateToOperator("textureFootprintClampNV",     EOpImageSampleFootprintClampNV);
+        symbolTable.relateToOperator("textureFootprintLodNV",       EOpImageSampleFootprintLodNV);
+        symbolTable.relateToOperator("textureFootprintGradNV",      EOpImageSampleFootprintGradNV);
+        symbolTable.relateToOperator("textureFootprintGradClampNV", EOpImageSampleFootprintGradClampNV);
+#endif
+
         if (spvVersion.spv == 0 && (IncludeLegacy(version, profile, spvVersion) ||
             (profile == EEsProfile && version == 100))) {
             symbolTable.relateToOperator("ftransform",               EOpFtransform);
@@ -5699,10 +9210,16 @@
             symbolTable.relateToOperator("readInvocationARB",               EOpReadInvocation);
             symbolTable.relateToOperator("readFirstInvocationARB",          EOpReadFirstInvocation);
 
-            symbolTable.relateToOperator("anyInvocationARB",                EOpAnyInvocation);
-            symbolTable.relateToOperator("allInvocationsARB",               EOpAllInvocations);
-            symbolTable.relateToOperator("allInvocationsEqualARB",          EOpAllInvocationsEqual);
-
+            if (version >= 430) {
+                symbolTable.relateToOperator("anyInvocationARB",            EOpAnyInvocation);
+                symbolTable.relateToOperator("allInvocationsARB",           EOpAllInvocations);
+                symbolTable.relateToOperator("allInvocationsEqualARB",      EOpAllInvocationsEqual);
+            }
+            if (version >= 460) {
+                symbolTable.relateToOperator("anyInvocation",               EOpAnyInvocation);
+                symbolTable.relateToOperator("allInvocations",              EOpAllInvocations);
+                symbolTable.relateToOperator("allInvocationsEqual",         EOpAllInvocationsEqual);
+            }
 #ifdef AMD_EXTENSIONS
             symbolTable.relateToOperator("minInvocationsAMD",                           EOpMinInvocations);
             symbolTable.relateToOperator("maxInvocationsAMD",                           EOpMaxInvocations);
@@ -5734,8 +9251,110 @@
             symbolTable.relateToOperator("cubeFaceIndexAMD",    EOpCubeFaceIndex);
             symbolTable.relateToOperator("cubeFaceCoordAMD",    EOpCubeFaceCoord);
             symbolTable.relateToOperator("timeAMD",             EOpTime);
+
+            symbolTable.relateToOperator("textureGatherLodAMD",                 EOpTextureGatherLod);
+            symbolTable.relateToOperator("textureGatherLodOffsetAMD",           EOpTextureGatherLodOffset);
+            symbolTable.relateToOperator("textureGatherLodOffsetsAMD",          EOpTextureGatherLodOffsets);
+            symbolTable.relateToOperator("sparseTextureGatherLodAMD",           EOpSparseTextureGatherLod);
+            symbolTable.relateToOperator("sparseTextureGatherLodOffsetAMD",     EOpSparseTextureGatherLodOffset);
+            symbolTable.relateToOperator("sparseTextureGatherLodOffsetsAMD",    EOpSparseTextureGatherLodOffsets);
+
+            symbolTable.relateToOperator("imageLoadLodAMD",                     EOpImageLoadLod);
+            symbolTable.relateToOperator("imageStoreLodAMD",                    EOpImageStoreLod);
+            symbolTable.relateToOperator("sparseImageLoadLodAMD",               EOpSparseImageLoadLod);
+
+            symbolTable.relateToOperator("fragmentMaskFetchAMD",                EOpFragmentMaskFetch);
+            symbolTable.relateToOperator("fragmentFetchAMD",                    EOpFragmentFetch);
 #endif
         }
+
+        // GL_KHR_shader_subgroup
+        if (spvVersion.vulkan > 0) {
+            symbolTable.relateToOperator("subgroupBarrier",                 EOpSubgroupBarrier);
+            symbolTable.relateToOperator("subgroupMemoryBarrier",           EOpSubgroupMemoryBarrier);
+            symbolTable.relateToOperator("subgroupMemoryBarrierBuffer",     EOpSubgroupMemoryBarrierBuffer);
+            symbolTable.relateToOperator("subgroupMemoryBarrierImage",      EOpSubgroupMemoryBarrierImage);
+            symbolTable.relateToOperator("subgroupElect",                   EOpSubgroupElect);
+            symbolTable.relateToOperator("subgroupAll",                     EOpSubgroupAll);
+            symbolTable.relateToOperator("subgroupAny",                     EOpSubgroupAny);
+            symbolTable.relateToOperator("subgroupAllEqual",                EOpSubgroupAllEqual);
+            symbolTable.relateToOperator("subgroupBroadcast",               EOpSubgroupBroadcast);
+            symbolTable.relateToOperator("subgroupBroadcastFirst",          EOpSubgroupBroadcastFirst);
+            symbolTable.relateToOperator("subgroupBallot",                  EOpSubgroupBallot);
+            symbolTable.relateToOperator("subgroupInverseBallot",           EOpSubgroupInverseBallot);
+            symbolTable.relateToOperator("subgroupBallotBitExtract",        EOpSubgroupBallotBitExtract);
+            symbolTable.relateToOperator("subgroupBallotBitCount",          EOpSubgroupBallotBitCount);
+            symbolTable.relateToOperator("subgroupBallotInclusiveBitCount", EOpSubgroupBallotInclusiveBitCount);
+            symbolTable.relateToOperator("subgroupBallotExclusiveBitCount", EOpSubgroupBallotExclusiveBitCount);
+            symbolTable.relateToOperator("subgroupBallotFindLSB",           EOpSubgroupBallotFindLSB);
+            symbolTable.relateToOperator("subgroupBallotFindMSB",           EOpSubgroupBallotFindMSB);
+            symbolTable.relateToOperator("subgroupShuffle",                 EOpSubgroupShuffle);
+            symbolTable.relateToOperator("subgroupShuffleXor",              EOpSubgroupShuffleXor);
+            symbolTable.relateToOperator("subgroupShuffleUp",               EOpSubgroupShuffleUp);
+            symbolTable.relateToOperator("subgroupShuffleDown",             EOpSubgroupShuffleDown);
+            symbolTable.relateToOperator("subgroupAdd",                     EOpSubgroupAdd);
+            symbolTable.relateToOperator("subgroupMul",                     EOpSubgroupMul);
+            symbolTable.relateToOperator("subgroupMin",                     EOpSubgroupMin);
+            symbolTable.relateToOperator("subgroupMax",                     EOpSubgroupMax);
+            symbolTable.relateToOperator("subgroupAnd",                     EOpSubgroupAnd);
+            symbolTable.relateToOperator("subgroupOr",                      EOpSubgroupOr);
+            symbolTable.relateToOperator("subgroupXor",                     EOpSubgroupXor);
+            symbolTable.relateToOperator("subgroupInclusiveAdd",            EOpSubgroupInclusiveAdd);
+            symbolTable.relateToOperator("subgroupInclusiveMul",            EOpSubgroupInclusiveMul);
+            symbolTable.relateToOperator("subgroupInclusiveMin",            EOpSubgroupInclusiveMin);
+            symbolTable.relateToOperator("subgroupInclusiveMax",            EOpSubgroupInclusiveMax);
+            symbolTable.relateToOperator("subgroupInclusiveAnd",            EOpSubgroupInclusiveAnd);
+            symbolTable.relateToOperator("subgroupInclusiveOr",             EOpSubgroupInclusiveOr);
+            symbolTable.relateToOperator("subgroupInclusiveXor",            EOpSubgroupInclusiveXor);
+            symbolTable.relateToOperator("subgroupExclusiveAdd",            EOpSubgroupExclusiveAdd);
+            symbolTable.relateToOperator("subgroupExclusiveMul",            EOpSubgroupExclusiveMul);
+            symbolTable.relateToOperator("subgroupExclusiveMin",            EOpSubgroupExclusiveMin);
+            symbolTable.relateToOperator("subgroupExclusiveMax",            EOpSubgroupExclusiveMax);
+            symbolTable.relateToOperator("subgroupExclusiveAnd",            EOpSubgroupExclusiveAnd);
+            symbolTable.relateToOperator("subgroupExclusiveOr",             EOpSubgroupExclusiveOr);
+            symbolTable.relateToOperator("subgroupExclusiveXor",            EOpSubgroupExclusiveXor);
+            symbolTable.relateToOperator("subgroupClusteredAdd",            EOpSubgroupClusteredAdd);
+            symbolTable.relateToOperator("subgroupClusteredMul",            EOpSubgroupClusteredMul);
+            symbolTable.relateToOperator("subgroupClusteredMin",            EOpSubgroupClusteredMin);
+            symbolTable.relateToOperator("subgroupClusteredMax",            EOpSubgroupClusteredMax);
+            symbolTable.relateToOperator("subgroupClusteredAnd",            EOpSubgroupClusteredAnd);
+            symbolTable.relateToOperator("subgroupClusteredOr",             EOpSubgroupClusteredOr);
+            symbolTable.relateToOperator("subgroupClusteredXor",            EOpSubgroupClusteredXor);
+            symbolTable.relateToOperator("subgroupQuadBroadcast",           EOpSubgroupQuadBroadcast);
+            symbolTable.relateToOperator("subgroupQuadSwapHorizontal",      EOpSubgroupQuadSwapHorizontal);
+            symbolTable.relateToOperator("subgroupQuadSwapVertical",        EOpSubgroupQuadSwapVertical);
+            symbolTable.relateToOperator("subgroupQuadSwapDiagonal",        EOpSubgroupQuadSwapDiagonal);
+
+#ifdef NV_EXTENSIONS
+            symbolTable.relateToOperator("subgroupPartitionNV",                          EOpSubgroupPartition);
+            symbolTable.relateToOperator("subgroupPartitionedAddNV",                     EOpSubgroupPartitionedAdd);
+            symbolTable.relateToOperator("subgroupPartitionedMulNV",                     EOpSubgroupPartitionedMul);
+            symbolTable.relateToOperator("subgroupPartitionedMinNV",                     EOpSubgroupPartitionedMin);
+            symbolTable.relateToOperator("subgroupPartitionedMaxNV",                     EOpSubgroupPartitionedMax);
+            symbolTable.relateToOperator("subgroupPartitionedAndNV",                     EOpSubgroupPartitionedAnd);
+            symbolTable.relateToOperator("subgroupPartitionedOrNV",                      EOpSubgroupPartitionedOr);
+            symbolTable.relateToOperator("subgroupPartitionedXorNV",                     EOpSubgroupPartitionedXor);
+            symbolTable.relateToOperator("subgroupPartitionedInclusiveAddNV",            EOpSubgroupPartitionedInclusiveAdd);
+            symbolTable.relateToOperator("subgroupPartitionedInclusiveMulNV",            EOpSubgroupPartitionedInclusiveMul);
+            symbolTable.relateToOperator("subgroupPartitionedInclusiveMinNV",            EOpSubgroupPartitionedInclusiveMin);
+            symbolTable.relateToOperator("subgroupPartitionedInclusiveMaxNV",            EOpSubgroupPartitionedInclusiveMax);
+            symbolTable.relateToOperator("subgroupPartitionedInclusiveAndNV",            EOpSubgroupPartitionedInclusiveAnd);
+            symbolTable.relateToOperator("subgroupPartitionedInclusiveOrNV",             EOpSubgroupPartitionedInclusiveOr);
+            symbolTable.relateToOperator("subgroupPartitionedInclusiveXorNV",            EOpSubgroupPartitionedInclusiveXor);
+            symbolTable.relateToOperator("subgroupPartitionedExclusiveAddNV",            EOpSubgroupPartitionedExclusiveAdd);
+            symbolTable.relateToOperator("subgroupPartitionedExclusiveMulNV",            EOpSubgroupPartitionedExclusiveMul);
+            symbolTable.relateToOperator("subgroupPartitionedExclusiveMinNV",            EOpSubgroupPartitionedExclusiveMin);
+            symbolTable.relateToOperator("subgroupPartitionedExclusiveMaxNV",            EOpSubgroupPartitionedExclusiveMax);
+            symbolTable.relateToOperator("subgroupPartitionedExclusiveAndNV",            EOpSubgroupPartitionedExclusiveAnd);
+            symbolTable.relateToOperator("subgroupPartitionedExclusiveOrNV",             EOpSubgroupPartitionedExclusiveOr);
+            symbolTable.relateToOperator("subgroupPartitionedExclusiveXorNV",            EOpSubgroupPartitionedExclusiveXor);
+#endif
+        }
+
+        if (profile == EEsProfile) {
+            symbolTable.relateToOperator("shadow2DEXT",              EOpTexture);
+            symbolTable.relateToOperator("shadow2DProjEXT",          EOpTextureProj);
+        }
     }
 
     switch(language) {
@@ -5772,14 +9391,66 @@
 #ifdef AMD_EXTENSIONS
         if (profile != EEsProfile)
             symbolTable.relateToOperator("interpolateAtVertexAMD", EOpInterpolateAtVertex);
-        break;
 #endif
+        break;
 
     case EShLangCompute:
-        symbolTable.relateToOperator("memoryBarrierShared",     EOpMemoryBarrierShared);
-        symbolTable.relateToOperator("groupMemoryBarrier",      EOpGroupMemoryBarrier);
+        symbolTable.relateToOperator("memoryBarrierShared",         EOpMemoryBarrierShared);
+        symbolTable.relateToOperator("groupMemoryBarrier",          EOpGroupMemoryBarrier);
+        symbolTable.relateToOperator("subgroupMemoryBarrierShared", EOpSubgroupMemoryBarrierShared);
+#ifdef NV_EXTENSIONS
+        if ((profile != EEsProfile && version >= 450) ||
+            (profile == EEsProfile && version >= 320)) {
+            symbolTable.relateToOperator("dFdx",        EOpDPdx);
+            symbolTable.relateToOperator("dFdy",        EOpDPdy);
+            symbolTable.relateToOperator("fwidth",      EOpFwidth);
+            symbolTable.relateToOperator("dFdxFine",    EOpDPdxFine);
+            symbolTable.relateToOperator("dFdyFine",    EOpDPdyFine);
+            symbolTable.relateToOperator("fwidthFine",  EOpFwidthFine);
+            symbolTable.relateToOperator("dFdxCoarse",  EOpDPdxCoarse);
+            symbolTable.relateToOperator("dFdyCoarse",  EOpDPdyCoarse);
+            symbolTable.relateToOperator("fwidthCoarse",EOpFwidthCoarse);
+        }
+#endif
         break;
 
+#ifdef NV_EXTENSIONS
+    case EShLangRayGenNV:
+    case EShLangClosestHitNV:
+    case EShLangMissNV:
+        if (profile != EEsProfile && version >= 460) {
+            symbolTable.relateToOperator("traceNV", EOpTraceNV);
+            symbolTable.relateToOperator("executeCallableNV", EOpExecuteCallableNV);
+        }
+        break;
+    case EShLangIntersectNV:
+        if (profile != EEsProfile && version >= 460)
+            symbolTable.relateToOperator("reportIntersectionNV", EOpReportIntersectionNV);
+        break;
+    case EShLangAnyHitNV:
+        if (profile != EEsProfile && version >= 460) {
+            symbolTable.relateToOperator("ignoreIntersectionNV", EOpIgnoreIntersectionNV);
+            symbolTable.relateToOperator("terminateRayNV", EOpTerminateRayNV);
+        }
+        break;
+    case EShLangCallableNV:
+        if (profile != EEsProfile && version >= 460) {
+            symbolTable.relateToOperator("executeCallableNV", EOpExecuteCallableNV);
+        }
+        break;
+    case EShLangMeshNV:
+        if ((profile != EEsProfile && version >= 450) || (profile == EEsProfile && version >= 320)) {
+            symbolTable.relateToOperator("writePackedPrimitiveIndices4x8NV", EOpWritePackedPrimitiveIndices4x8NV);
+        }
+        // fall through
+    case EShLangTaskNV:
+        if ((profile != EEsProfile && version >= 450) || (profile == EEsProfile && version >= 320)) {
+            symbolTable.relateToOperator("memoryBarrierShared", EOpMemoryBarrierShared);
+            symbolTable.relateToOperator("groupMemoryBarrier", EOpGroupMemoryBarrier);
+        }
+        break;
+#endif
+
     default:
         assert(false && "Language not supported");
     }
@@ -5813,9 +9484,9 @@
         if (version == 100 || IncludeLegacy(version, profile, spvVersion) || (! ForwardCompatibility && profile != EEsProfile && version < 420)) {
             TPrecisionQualifier pq = profile == EEsProfile ? EpqMedium : EpqNone;
             TType fragData(EbtFloat, EvqFragColor, pq, 4);
-            TArraySizes& arraySizes = *new TArraySizes;
-            arraySizes.addInnerSize(resources.maxDrawBuffers);
-            fragData.newArraySizes(arraySizes);
+            TArraySizes* arraySizes = new TArraySizes;
+            arraySizes->addInnerSize(resources.maxDrawBuffers);
+            fragData.transferArraySizes(arraySizes);
             symbolTable.insert(*new TVariable(NewPoolTString("gl_FragData"), fragData));
             SpecialQualifier("gl_FragData", EvqFragColor, EbvFragData, symbolTable);
         }
diff --git a/glslang/MachineIndependent/Initialize.h b/glslang/MachineIndependent/Initialize.h
index 45b4395..b5de324 100644
--- a/glslang/MachineIndependent/Initialize.h
+++ b/glslang/MachineIndependent/Initialize.h
@@ -67,7 +67,6 @@
     virtual const TString& getStageString(EShLanguage language) const { return stageBuiltins[language]; }
 
     virtual void identifyBuiltIns(int version, EProfile profile, const SpvVersion& spvVersion, EShLanguage language, TSymbolTable& symbolTable) = 0;
-
     virtual void identifyBuiltIns(int version, EProfile profile, const SpvVersion& spvVersion, EShLanguage language, TSymbolTable& symbolTable, const TBuiltInResource &resources) = 0;
 
 protected:
@@ -89,16 +88,15 @@
     void initialize(const TBuiltInResource& resources, int version, EProfile, const SpvVersion& spvVersion, EShLanguage);
 
     void identifyBuiltIns(int version, EProfile profile, const SpvVersion& spvVersion, EShLanguage language, TSymbolTable& symbolTable);
-
     void identifyBuiltIns(int version, EProfile profile, const SpvVersion& spvVersion, EShLanguage language, TSymbolTable& symbolTable, const TBuiltInResource &resources);
 
 protected:
     void add2ndGenerationSamplingImaging(int version, EProfile profile, const SpvVersion& spvVersion);
-    void addSubpassSampling(TSampler, TString& typeName, int version, EProfile profile);
-    void addQueryFunctions(TSampler, TString& typeName, int version, EProfile profile);
-    void addImageFunctions(TSampler, TString& typeName, int version, EProfile profile);
-    void addSamplingFunctions(TSampler, TString& typeName, int version, EProfile profile);
-    void addGatherFunctions(TSampler, TString& typeName, int version, EProfile profile);
+    void addSubpassSampling(TSampler, const TString& typeName, int version, EProfile profile);
+    void addQueryFunctions(TSampler, const TString& typeName, int version, EProfile profile);
+    void addImageFunctions(TSampler, const TString& typeName, int version, EProfile profile);
+    void addSamplingFunctions(TSampler, const TString& typeName, int version, EProfile profile);
+    void addGatherFunctions(TSampler, const TString& typeName, int version, EProfile profile);
 
     // Helpers for making textual representations of the permutations
     // of texturing/imaging functions.
diff --git a/glslang/MachineIndependent/Intermediate.cpp b/glslang/MachineIndependent/Intermediate.cpp
index fe0651a..5ebb2e0 100644
--- a/glslang/MachineIndependent/Intermediate.cpp
+++ b/glslang/MachineIndependent/Intermediate.cpp
@@ -2,6 +2,7 @@
 // Copyright (C) 2002-2005  3Dlabs Inc. Ltd.
 // Copyright (C) 2012-2015 LunarG, Inc.
 // Copyright (C) 2015-2016 Google, Inc.
+// Copyright (C) 2017 ARM Limited.
 //
 // All rights reserved.
 //
@@ -46,6 +47,7 @@
 
 #include <cfloat>
 #include <utility>
+#include <tuple>
 
 namespace glslang {
 
@@ -118,16 +120,12 @@
         return nullptr;
 
     // Try converting the children's base types to compatible types.
-    TIntermTyped* child = addConversion(op, left->getType(), right);
-    if (child)
-        right = child;
-    else {
-        child = addConversion(op, right->getType(), left);
-        if (child)
-            left = child;
-        else
-            return nullptr;
-    }
+    auto children = addConversion(op, left, right);
+    left = std::get<0>(children);
+    right = std::get<1>(children);
+
+    if (left == nullptr || right == nullptr)
+        return nullptr;
 
     // Convert the children's type shape to be compatible.
     addBiShapeConversion(op, left, right);
@@ -148,8 +146,8 @@
     // If they are both (non-specialization) constants, they must be folded.
     // (Unless it's the sequence (comma) operator, but that's handled in addComma().)
     //
-    TIntermConstantUnion *leftTempConstant = left->getAsConstantUnion();
-    TIntermConstantUnion *rightTempConstant = right->getAsConstantUnion();
+    TIntermConstantUnion *leftTempConstant = node->getLeft()->getAsConstantUnion();
+    TIntermConstantUnion *rightTempConstant = node->getRight()->getAsConstantUnion();
     if (leftTempConstant && rightTempConstant) {
         TIntermTyped* folded = leftTempConstant->fold(node->getOp(), rightTempConstant);
         if (folded)
@@ -158,9 +156,14 @@
 
     // If can propagate spec-constantness and if the operation is an allowed
     // specialization-constant operation, make a spec-constant.
-    if (specConstantPropagates(*left, *right) && isSpecializationOperation(*node))
+    if (specConstantPropagates(*node->getLeft(), *node->getRight()) && isSpecializationOperation(*node))
         node->getWritableType().getQualifier().makeSpecConstant();
 
+    // If must propagate nonuniform, make a nonuniform.
+    if ((node->getLeft()->getQualifier().nonUniform || node->getRight()->getQualifier().nonUniform) &&
+            isNonuniformPropagating(node->getOp()))
+        node->getWritableType().getQualifier().nonUniform = true;
+
     return node;
 }
 
@@ -304,6 +307,10 @@
     //
     TBasicType newType = EbtVoid;
     switch (op) {
+    case EOpConstructInt8:   newType = EbtInt8;   break;
+    case EOpConstructUint8:  newType = EbtUint8;  break;
+    case EOpConstructInt16:  newType = EbtInt16;    break;
+    case EOpConstructUint16: newType = EbtUint16;   break;
     case EOpConstructInt:    newType = EbtInt;    break;
     case EOpConstructUint:   newType = EbtUint;   break;
     case EOpConstructInt64:  newType = EbtInt64;  break;
@@ -311,9 +318,7 @@
     case EOpConstructBool:   newType = EbtBool;   break;
     case EOpConstructFloat:  newType = EbtFloat;  break;
     case EOpConstructDouble: newType = EbtDouble; break;
-#ifdef AMD_EXTENSIONS
     case EOpConstructFloat16: newType = EbtFloat16; break;
-#endif
     default: break; // some compilers want this
     }
 
@@ -332,6 +337,10 @@
     // TODO: but, did this bypass constant folding?
     //
     switch (op) {
+    case EOpConstructInt8:
+    case EOpConstructUint8:
+    case EOpConstructInt16:
+    case EOpConstructUint16:
     case EOpConstructInt:
     case EOpConstructUint:
     case EOpConstructInt64:
@@ -339,9 +348,7 @@
     case EOpConstructBool:
     case EOpConstructFloat:
     case EOpConstructDouble:
-#ifdef AMD_EXTENSIONS
     case EOpConstructFloat16:
-#endif
         return child;
     default: break; // some compilers want this
     }
@@ -365,10 +372,15 @@
     if (node->getOperand()->getType().getQualifier().isSpecConstant() && isSpecializationOperation(*node))
         node->getWritableType().getQualifier().makeSpecConstant();
 
+    // If must propagate nonuniform, make a nonuniform.
+    if (node->getOperand()->getQualifier().nonUniform && isNonuniformPropagating(node->getOp()))
+        node->getWritableType().getQualifier().nonUniform = true;
+
     return node;
 }
 
-TIntermTyped* TIntermediate::addBuiltInFunctionCall(const TSourceLoc& loc, TOperator op, bool unary, TIntermNode* childNode, const TType& returnType)
+TIntermTyped* TIntermediate::addBuiltInFunctionCall(const TSourceLoc& loc, TOperator op, bool unary,
+    TIntermNode* childNode, const TType& returnType)
 {
     if (unary) {
         //
@@ -412,7 +424,7 @@
     //
     // Make sure we have an aggregate.  If not turn it into one.
     //
-    if (node) {
+    if (node != nullptr) {
         aggNode = node->getAsAggregate();
         if (aggNode == nullptr || aggNode->getOp() != EOpNull) {
             //
@@ -438,29 +450,19 @@
     return fold(aggNode);
 }
 
-//
-// Convert the node's type to the given type, as allowed by the operation involved: 'op'.
-// For implicit conversions, 'op' is not the requested conversion, it is the explicit
-// operation requiring the implicit conversion.
-//
-// Returns a node representing the conversion, which could be the same
-// node passed in if no conversion was needed.
-//
-// Generally, this is focused on basic type conversion, not shape conversion.
-// See addShapeConversion().
-//
-// Return nullptr if a conversion can't be done.
-//
-TIntermTyped* TIntermediate::addConversion(TOperator op, const TType& type, TIntermTyped* node) const
+bool TIntermediate::isConversionAllowed(TOperator op, TIntermTyped* node) const
 {
     //
     // Does the base type even allow the operation?
     //
     switch (node->getBasicType()) {
     case EbtVoid:
-        return nullptr;
+        return false;
     case EbtAtomicUint:
     case EbtSampler:
+#ifdef NV_EXTENSIONS
+    case EbtAccStructNV:
+#endif
         // opaque types can be passed to functions
         if (op == EOpFunction)
             break;
@@ -476,60 +478,285 @@
             break;
 
         // otherwise, opaque types can't even be operated on, let alone converted
-        return nullptr;
+        return false;
     default:
         break;
     }
 
-    // Otherwise, if types are identical, no problem
-    if (type == node->getType())
-        return node;
+    return true;
+}
 
-    // If one's a structure, then no conversions.
-    if (type.isStruct() || node->isStruct())
+// This is 'mechanism' here, it does any conversion told.
+// It is about basic type, not about shape.
+// The policy comes from the shader or the calling code.
+TIntermTyped* TIntermediate::createConversion(TBasicType convertTo, TIntermTyped* node) const
+{
+    //
+    // Add a new newNode for the conversion.
+    //
+    TIntermUnary* newNode = nullptr;
+
+    TOperator newOp = EOpNull;
+
+    switch (convertTo) {
+    case EbtDouble:
+        switch (node->getBasicType()) {
+        case EbtInt8:    newOp = EOpConvInt8ToDouble;    break;
+        case EbtUint8:   newOp = EOpConvUint8ToDouble;   break;
+        case EbtInt16:   newOp = EOpConvInt16ToDouble;   break;
+        case EbtUint16:  newOp = EOpConvUint16ToDouble;  break;
+        case EbtInt:     newOp = EOpConvIntToDouble;     break;
+        case EbtUint:    newOp = EOpConvUintToDouble;    break;
+        case EbtBool:    newOp = EOpConvBoolToDouble;    break;
+        case EbtFloat:   newOp = EOpConvFloatToDouble;   break;
+        case EbtFloat16: newOp = EOpConvFloat16ToDouble; break;
+        case EbtInt64:   newOp = EOpConvInt64ToDouble;   break;
+        case EbtUint64:  newOp = EOpConvUint64ToDouble;  break;
+        default:
+            return nullptr;
+        }
+        break;
+    case EbtFloat:
+        switch (node->getBasicType()) {
+        case EbtInt8:    newOp = EOpConvInt8ToFloat;    break;
+        case EbtUint8:   newOp = EOpConvUint8ToFloat;   break;
+        case EbtInt16:   newOp = EOpConvInt16ToFloat;   break;
+        case EbtUint16:  newOp = EOpConvUint16ToFloat;  break;
+        case EbtInt:     newOp = EOpConvIntToFloat;     break;
+        case EbtUint:    newOp = EOpConvUintToFloat;    break;
+        case EbtBool:    newOp = EOpConvBoolToFloat;    break;
+        case EbtDouble:  newOp = EOpConvDoubleToFloat;  break;
+        case EbtFloat16: newOp = EOpConvFloat16ToFloat; break;
+        case EbtInt64:   newOp = EOpConvInt64ToFloat;   break;
+        case EbtUint64:  newOp = EOpConvUint64ToFloat;  break;
+        default:
+            return nullptr;
+        }
+        break;
+    case EbtFloat16:
+        switch (node->getBasicType()) {
+        case EbtInt8:   newOp = EOpConvInt8ToFloat16;   break;
+        case EbtUint8:  newOp = EOpConvUint8ToFloat16;  break;
+        case EbtInt16:  newOp = EOpConvInt16ToFloat16;  break;
+        case EbtUint16: newOp = EOpConvUint16ToFloat16; break;
+        case EbtInt:    newOp = EOpConvIntToFloat16;    break;
+        case EbtUint:   newOp = EOpConvUintToFloat16;   break;
+        case EbtBool:   newOp = EOpConvBoolToFloat16;   break;
+        case EbtFloat:  newOp = EOpConvFloatToFloat16;  break;
+        case EbtDouble: newOp = EOpConvDoubleToFloat16; break;
+        case EbtInt64:  newOp = EOpConvInt64ToFloat16;  break;
+        case EbtUint64: newOp = EOpConvUint64ToFloat16; break;
+        default:
+            return nullptr;
+        }
+        break;
+    case EbtBool:
+        switch (node->getBasicType()) {
+        case EbtInt8:    newOp = EOpConvInt8ToBool;    break;
+        case EbtUint8:   newOp = EOpConvUint8ToBool;   break;
+        case EbtInt16:   newOp = EOpConvInt16ToBool;   break;
+        case EbtUint16:  newOp = EOpConvUint16ToBool;  break;
+        case EbtInt:     newOp = EOpConvIntToBool;     break;
+        case EbtUint:    newOp = EOpConvUintToBool;    break;
+        case EbtFloat:   newOp = EOpConvFloatToBool;   break;
+        case EbtDouble:  newOp = EOpConvDoubleToBool;  break;
+        case EbtFloat16: newOp = EOpConvFloat16ToBool; break;
+        case EbtInt64:   newOp = EOpConvInt64ToBool;   break;
+        case EbtUint64:  newOp = EOpConvUint64ToBool;  break;
+        default:
+            return nullptr;
+        }
+        break;
+    case EbtInt8:
+        switch (node->getBasicType()) {
+        case EbtUint8:   newOp = EOpConvUint8ToInt8;   break;
+        case EbtInt16:   newOp = EOpConvInt16ToInt8;   break;
+        case EbtUint16:  newOp = EOpConvUint16ToInt8;  break;
+        case EbtInt:     newOp = EOpConvIntToInt8;     break;
+        case EbtUint:    newOp = EOpConvUintToInt8;    break;
+        case EbtInt64:   newOp = EOpConvInt64ToInt8;   break;
+        case EbtUint64:  newOp = EOpConvUint64ToInt8;  break;
+        case EbtBool:    newOp = EOpConvBoolToInt8;    break;
+        case EbtFloat:   newOp = EOpConvFloatToInt8;   break;
+        case EbtDouble:  newOp = EOpConvDoubleToInt8;  break;
+        case EbtFloat16: newOp = EOpConvFloat16ToInt8; break;
+        default:
+            return nullptr;
+        }
+        break;
+    case EbtUint8:
+        switch (node->getBasicType()) {
+        case EbtInt8:    newOp = EOpConvInt8ToUint8;    break;
+        case EbtInt16:   newOp = EOpConvInt16ToUint8;   break;
+        case EbtUint16:  newOp = EOpConvUint16ToUint8;  break;
+        case EbtInt:     newOp = EOpConvIntToUint8;     break;
+        case EbtUint:    newOp = EOpConvUintToUint8;    break;
+        case EbtInt64:   newOp = EOpConvInt64ToUint8;   break;
+        case EbtUint64:  newOp = EOpConvUint64ToUint8;  break;
+        case EbtBool:    newOp = EOpConvBoolToUint8;    break;
+        case EbtFloat:   newOp = EOpConvFloatToUint8;   break;
+        case EbtDouble:  newOp = EOpConvDoubleToUint8;  break;
+        case EbtFloat16: newOp = EOpConvFloat16ToUint8; break;
+        default:
+            return nullptr;
+        }
+        break;
+
+    case EbtInt16:
+        switch (node->getBasicType()) {
+        case EbtUint8:   newOp = EOpConvUint8ToInt16;   break;
+        case EbtInt8:    newOp = EOpConvInt8ToInt16;    break;
+        case EbtUint16:  newOp = EOpConvUint16ToInt16;  break;
+        case EbtInt:     newOp = EOpConvIntToInt16;     break;
+        case EbtUint:    newOp = EOpConvUintToInt16;    break;
+        case EbtInt64:   newOp = EOpConvInt64ToInt16;   break;
+        case EbtUint64:  newOp = EOpConvUint64ToInt16;  break;
+        case EbtBool:    newOp = EOpConvBoolToInt16;    break;
+        case EbtFloat:   newOp = EOpConvFloatToInt16;   break;
+        case EbtDouble:  newOp = EOpConvDoubleToInt16;  break;
+        case EbtFloat16: newOp = EOpConvFloat16ToInt16; break;
+        default:
+            return nullptr;
+        }
+        break;
+    case EbtUint16:
+        switch (node->getBasicType()) {
+        case EbtInt8:    newOp = EOpConvInt8ToUint16;    break;
+        case EbtUint8:   newOp = EOpConvUint8ToUint16;   break;
+        case EbtInt16:   newOp = EOpConvInt16ToUint16;   break;
+        case EbtInt:     newOp = EOpConvIntToUint16;     break;
+        case EbtUint:    newOp = EOpConvUintToUint16;    break;
+        case EbtInt64:   newOp = EOpConvInt64ToUint16;   break;
+        case EbtUint64:  newOp = EOpConvUint64ToUint16;  break;
+        case EbtBool:    newOp = EOpConvBoolToUint16;    break;
+        case EbtFloat:   newOp = EOpConvFloatToUint16;   break;
+        case EbtDouble:  newOp = EOpConvDoubleToUint16;  break;
+        case EbtFloat16: newOp = EOpConvFloat16ToUint16; break;
+        default:
+            return nullptr;
+        }
+        break;
+
+    case EbtInt:
+        switch (node->getBasicType()) {
+        case EbtInt8:    newOp = EOpConvInt8ToInt;    break;
+        case EbtUint8:   newOp = EOpConvUint8ToInt;   break;
+        case EbtInt16:   newOp = EOpConvInt16ToInt;   break;
+        case EbtUint16:  newOp = EOpConvUint16ToInt;  break;
+        case EbtUint:    newOp = EOpConvUintToInt;    break;
+        case EbtBool:    newOp = EOpConvBoolToInt;    break;
+        case EbtFloat:   newOp = EOpConvFloatToInt;   break;
+        case EbtDouble:  newOp = EOpConvDoubleToInt;  break;
+        case EbtFloat16: newOp = EOpConvFloat16ToInt; break;
+        case EbtInt64:   newOp = EOpConvInt64ToInt;   break;
+        case EbtUint64:  newOp = EOpConvUint64ToInt;  break;
+        default:
+            return nullptr;
+        }
+        break;
+    case EbtUint:
+        switch (node->getBasicType()) {
+        case EbtInt8:    newOp = EOpConvInt8ToUint;    break;
+        case EbtUint8:   newOp = EOpConvUint8ToUint;   break;
+        case EbtInt16:   newOp = EOpConvInt16ToUint;   break;
+        case EbtUint16:  newOp = EOpConvUint16ToUint;  break;
+        case EbtInt:     newOp = EOpConvIntToUint;     break;
+        case EbtBool:    newOp = EOpConvBoolToUint;    break;
+        case EbtFloat:   newOp = EOpConvFloatToUint;   break;
+        case EbtDouble:  newOp = EOpConvDoubleToUint;  break;
+        case EbtFloat16: newOp = EOpConvFloat16ToUint; break;
+        case EbtInt64:   newOp = EOpConvInt64ToUint;   break;
+        case EbtUint64:  newOp = EOpConvUint64ToUint;  break;
+        default:
+            return nullptr;
+        }
+        break;
+    case EbtInt64:
+        switch (node->getBasicType()) {
+        case EbtInt8:    newOp = EOpConvInt8ToInt64;    break;
+        case EbtUint8:   newOp = EOpConvUint8ToInt64;   break;
+        case EbtInt16:   newOp = EOpConvInt16ToInt64;   break;
+        case EbtUint16:  newOp = EOpConvUint16ToInt64;  break;
+        case EbtInt:     newOp = EOpConvIntToInt64;     break;
+        case EbtUint:    newOp = EOpConvUintToInt64;    break;
+        case EbtBool:    newOp = EOpConvBoolToInt64;    break;
+        case EbtFloat:   newOp = EOpConvFloatToInt64;   break;
+        case EbtDouble:  newOp = EOpConvDoubleToInt64;  break;
+        case EbtFloat16: newOp = EOpConvFloat16ToInt64; break;
+        case EbtUint64:  newOp = EOpConvUint64ToInt64;  break;
+        default:
+            return nullptr;
+        }
+        break;
+    case EbtUint64:
+        switch (node->getBasicType()) {
+        case EbtInt8:    newOp = EOpConvInt8ToUint64;    break;
+        case EbtUint8:   newOp = EOpConvUint8ToUint64;   break;
+        case EbtInt16:   newOp = EOpConvInt16ToUint64;   break;
+        case EbtUint16:  newOp = EOpConvUint16ToUint64;  break;
+        case EbtInt:     newOp = EOpConvIntToUint64;     break;
+        case EbtUint:    newOp = EOpConvUintToUint64;    break;
+        case EbtBool:    newOp = EOpConvBoolToUint64;    break;
+        case EbtFloat:   newOp = EOpConvFloatToUint64;   break;
+        case EbtDouble:  newOp = EOpConvDoubleToUint64;  break;
+        case EbtFloat16: newOp = EOpConvFloat16ToUint64; break;
+        case EbtInt64:   newOp = EOpConvInt64ToUint64;   break;
+        default:
+            return nullptr;
+        }
+        break;
+    default:
         return nullptr;
+    }
 
-    // If one's an array, then no conversions.
-    if (type.isArray() || node->getType().isArray())
-        return nullptr;
+    TType newType(convertTo, EvqTemporary, node->getVectorSize(), node->getMatrixCols(), node->getMatrixRows());
+    newNode = addUnaryNode(newOp, node, node->getLoc(), newType);
 
-    // Note: callers are responsible for other aspects of shape,
-    // like vector and matrix sizes.
+    if (node->getAsConstantUnion()) {
+        TIntermTyped* folded = node->getAsConstantUnion()->fold(newOp, newType);
+        if (folded)
+            return folded;
+    }
 
-    TBasicType promoteTo;
+    // Propagate specialization-constant-ness, if allowed
+    if (node->getType().getQualifier().isSpecConstant() && isSpecializationOperation(*newNode))
+        newNode->getWritableType().getQualifier().makeSpecConstant();
+
+    return newNode;
+}
+
+// For converting a pair of operands to a binary operation to compatible
+// types with each other, relative to the operation in 'op'.
+// This does not cover assignment operations, which is asymmetric in that the
+// left type is not changeable.
+// See addConversion(op, type, node) for assignments and unary operation
+// conversions.
+//
+// Generally, this is focused on basic type conversion, not shape conversion.
+// See addShapeConversion() for shape conversions.
+//
+// Returns the converted pair of nodes.
+// Returns <nullptr, nullptr> when there is no conversion.
+std::tuple<TIntermTyped*, TIntermTyped*>
+TIntermediate::addConversion(TOperator op, TIntermTyped* node0, TIntermTyped* node1) const
+{
+    if (!isConversionAllowed(op, node0) || !isConversionAllowed(op, node1))
+        return std::make_tuple(nullptr, nullptr);
+
+    if (node0->getType() != node1->getType()) {
+        // If differing structure, then no conversions.
+        if (node0->isStruct() || node1->isStruct())
+            return std::make_tuple(nullptr, nullptr);
+
+        // If differing arrays, then no conversions.
+        if (node0->getType().isArray() || node1->getType().isArray())
+            return std::make_tuple(nullptr, nullptr);
+    }
+
+    auto promoteTo = std::make_tuple(EbtNumTypes, EbtNumTypes);
 
     switch (op) {
     //
-    // Explicit conversions (unary operations)
-    //
-    case EOpConstructBool:
-        promoteTo = EbtBool;
-        break;
-    case EOpConstructFloat:
-        promoteTo = EbtFloat;
-        break;
-    case EOpConstructDouble:
-        promoteTo = EbtDouble;
-        break;
-#ifdef AMD_EXTENSIONS
-    case EOpConstructFloat16:
-        promoteTo = EbtFloat16;
-        break;
-#endif
-    case EOpConstructInt:
-        promoteTo = EbtInt;
-        break;
-    case EOpConstructUint:
-        promoteTo = EbtUint;
-        break;
-    case EOpConstructInt64:
-        promoteTo = EbtInt64;
-        break;
-    case EOpConstructUint64:
-        promoteTo = EbtUint64;
-        break;
-
-    //
     // List all the binary ops that can implicitly convert one operand to the other's type;
     // This implements the 'policy' for implicit type conversion.
     //
@@ -554,15 +781,172 @@
     case EOpAnd:
     case EOpInclusiveOr:
     case EOpExclusiveOr:
-    case EOpAndAssign:
-    case EOpInclusiveOrAssign:
-    case EOpExclusiveOrAssign:
-    case EOpLogicalNot:
+
+    case EOpSequence:          // used by ?:
+
+        if (node0->getBasicType() == node1->getBasicType())
+            return std::make_tuple(node0, node1);
+
+        promoteTo = getConversionDestinatonType(node0->getBasicType(), node1->getBasicType(), op);
+        if (std::get<0>(promoteTo) == EbtNumTypes || std::get<1>(promoteTo) == EbtNumTypes)
+            return std::make_tuple(nullptr, nullptr);
+
+        break;
+
     case EOpLogicalAnd:
     case EOpLogicalOr:
     case EOpLogicalXor:
+        if (source == EShSourceHlsl)
+            promoteTo = std::make_tuple(EbtBool, EbtBool);
+        else
+            return std::make_tuple(node0, node1);
+        break;
+
+    // There are no conversions needed for GLSL; the shift amount just needs to be an
+    // integer type, as does the base.
+    // HLSL can promote bools to ints to make this work.
+    case EOpLeftShift:
+    case EOpRightShift:
+        if (source == EShSourceHlsl) {
+            TBasicType node0BasicType = node0->getBasicType();
+            if (node0BasicType == EbtBool)
+                node0BasicType = EbtInt;
+            if (node1->getBasicType() == EbtBool)
+                promoteTo = std::make_tuple(node0BasicType, EbtInt);
+            else
+                promoteTo = std::make_tuple(node0BasicType, node1->getBasicType());
+        } else {
+            if (isTypeInt(node0->getBasicType()) && isTypeInt(node1->getBasicType()))
+                return std::make_tuple(node0, node1);
+            else
+                return std::make_tuple(nullptr, nullptr);
+        }
+        break;
+
+    default:
+        if (node0->getType() == node1->getType())
+            return std::make_tuple(node0, node1);
+
+        return std::make_tuple(nullptr, nullptr);
+    }
+
+    TIntermTyped* newNode0;
+    TIntermTyped* newNode1;
+
+    if (std::get<0>(promoteTo) != node0->getType().getBasicType()) {
+        if (node0->getAsConstantUnion())
+            newNode0 = promoteConstantUnion(std::get<0>(promoteTo), node0->getAsConstantUnion());
+        else
+            newNode0 = createConversion(std::get<0>(promoteTo), node0);
+    } else
+        newNode0 = node0;
+
+    if (std::get<1>(promoteTo) != node1->getType().getBasicType()) {
+        if (node1->getAsConstantUnion())
+            newNode1 = promoteConstantUnion(std::get<1>(promoteTo), node1->getAsConstantUnion());
+        else
+            newNode1 = createConversion(std::get<1>(promoteTo), node1);
+    } else
+        newNode1 = node1;
+
+    return std::make_tuple(newNode0, newNode1);
+}
+
+//
+// Convert the node's type to the given type, as allowed by the operation involved: 'op'.
+// For implicit conversions, 'op' is not the requested conversion, it is the explicit
+// operation requiring the implicit conversion.
+//
+// Binary operation conversions should be handled by addConversion(op, node, node), not here.
+//
+// Returns a node representing the conversion, which could be the same
+// node passed in if no conversion was needed.
+//
+// Generally, this is focused on basic type conversion, not shape conversion.
+// See addShapeConversion() for shape conversions.
+//
+// Return nullptr if a conversion can't be done.
+//
+TIntermTyped* TIntermediate::addConversion(TOperator op, const TType& type, TIntermTyped* node) const
+{
+    if (!isConversionAllowed(op, node))
+        return nullptr;
+
+    // Otherwise, if types are identical, no problem
+    if (type == node->getType())
+        return node;
+
+    // If one's a structure, then no conversions.
+    if (type.isStruct() || node->isStruct())
+        return nullptr;
+
+    // If one's an array, then no conversions.
+    if (type.isArray() || node->getType().isArray())
+        return nullptr;
+
+    // Note: callers are responsible for other aspects of shape,
+    // like vector and matrix sizes.
+
+    TBasicType promoteTo;
+    // GL_EXT_shader_16bit_storage can't do OpConstantComposite with
+    // 16-bit types, so disable promotion for those types.
+    bool canPromoteConstant = true;
+
+    switch (op) {
+    //
+    // Explicit conversions (unary operations)
+    //
+    case EOpConstructBool:
+        promoteTo = EbtBool;
+        break;
+    case EOpConstructFloat:
+        promoteTo = EbtFloat;
+        break;
+    case EOpConstructDouble:
+        promoteTo = EbtDouble;
+        break;
+    case EOpConstructFloat16:
+        promoteTo = EbtFloat16;
+        canPromoteConstant = extensionRequested(E_GL_EXT_shader_explicit_arithmetic_types) ||
+                             extensionRequested(E_GL_EXT_shader_explicit_arithmetic_types_float16);
+        break;
+    case EOpConstructInt8:
+        promoteTo = EbtInt8;
+        canPromoteConstant = extensionRequested(E_GL_EXT_shader_explicit_arithmetic_types) ||
+                             extensionRequested(E_GL_EXT_shader_explicit_arithmetic_types_int8);
+        break;
+    case EOpConstructUint8:
+        promoteTo = EbtUint8;
+        canPromoteConstant = extensionRequested(E_GL_EXT_shader_explicit_arithmetic_types) ||
+                             extensionRequested(E_GL_EXT_shader_explicit_arithmetic_types_int8);
+        break;
+    case EOpConstructInt16:
+        promoteTo = EbtInt16;
+        canPromoteConstant = extensionRequested(E_GL_EXT_shader_explicit_arithmetic_types) ||
+                             extensionRequested(E_GL_EXT_shader_explicit_arithmetic_types_int16);
+        break;
+    case EOpConstructUint16:
+        promoteTo = EbtUint16;
+        canPromoteConstant = extensionRequested(E_GL_EXT_shader_explicit_arithmetic_types) ||
+                             extensionRequested(E_GL_EXT_shader_explicit_arithmetic_types_int16);
+        break;
+    case EOpConstructInt:
+        promoteTo = EbtInt;
+        break;
+    case EOpConstructUint:
+        promoteTo = EbtUint;
+        break;
+    case EOpConstructInt64:
+        promoteTo = EbtInt64;
+        break;
+    case EOpConstructUint64:
+        promoteTo = EbtUint64;
+        break;
+
+    case EOpLogicalNot:
 
     case EOpFunctionCall:
+
     case EOpReturn:
     case EOpAssign:
     case EOpAddAssign:
@@ -572,6 +956,9 @@
     case EOpMatrixTimesScalarAssign:
     case EOpDivAssign:
     case EOpModAssign:
+    case EOpAndAssign:
+    case EOpInclusiveOrAssign:
+    case EOpExclusiveOrAssign:
 
     case EOpAtan:
     case EOpClamp:
@@ -600,35 +987,28 @@
         if (type.getBasicType() == node->getType().getBasicType())
             return node;
 
-        if (canImplicitlyPromote(node->getType().getBasicType(), type.getBasicType(), op))
+        if (canImplicitlyPromote(node->getBasicType(), type.getBasicType(), op))
             promoteTo = type.getBasicType();
         else
-            return nullptr;
-
+           return nullptr;
         break;
 
-    // Shifts can have mixed types as long as they are integer, without converting.
-    // It's the left operand's type that determines the resulting type, so no issue
-    // with assign shift ops either.
-    case EOpLeftShift:
-    case EOpRightShift:
+    // For GLSL, there are no conversions needed; the shift amount just needs to be an
+    // integer type, as do the base/result.
+    // HLSL can convert the shift from a bool to an int.
     case EOpLeftShiftAssign:
     case EOpRightShiftAssign:
-        if ((type.getBasicType() == EbtInt ||
-             type.getBasicType() == EbtUint ||
-             type.getBasicType() == EbtInt64 ||
-             type.getBasicType() == EbtUint64) &&
-            (node->getType().getBasicType() == EbtInt ||
-             node->getType().getBasicType() == EbtUint ||
-             node->getType().getBasicType() == EbtInt64 ||
-             node->getType().getBasicType() == EbtUint64))
-
-            return node;
-        else if (source == EShSourceHlsl && node->getType().getBasicType() == EbtBool) {
+    {
+        if (source == EShSourceHlsl && node->getType().getBasicType() == EbtBool)
             promoteTo = type.getBasicType();
-            break;
-        } else
-            return nullptr;
+        else {
+            if (isTypeInt(type.getBasicType()) && isTypeInt(node->getBasicType()))
+                return node;
+            else
+                return nullptr;
+        }
+        break;
+    }
 
     default:
         // default is to require a match; all exceptions should have case statements above
@@ -639,151 +1019,13 @@
             return nullptr;
     }
 
-    if (node->getAsConstantUnion())
+    if (canPromoteConstant && node->getAsConstantUnion())
         return promoteConstantUnion(promoteTo, node->getAsConstantUnion());
 
     //
     // Add a new newNode for the conversion.
     //
-    TIntermUnary* newNode = nullptr;
-
-    TOperator newOp = EOpNull;
-
-    // This is 'mechanism' here, it does any conversion told.  The policy comes
-    // from the shader or the above code.
-    switch (promoteTo) {
-    case EbtDouble:
-        switch (node->getBasicType()) {
-        case EbtInt:   newOp = EOpConvIntToDouble;   break;
-        case EbtUint:  newOp = EOpConvUintToDouble;  break;
-        case EbtBool:  newOp = EOpConvBoolToDouble;  break;
-        case EbtFloat: newOp = EOpConvFloatToDouble; break;
-#ifdef AMD_EXTENSIONS
-        case EbtFloat16: newOp = EOpConvFloat16ToDouble; break;
-#endif
-        case EbtInt64: newOp = EOpConvInt64ToDouble; break;
-        case EbtUint64: newOp = EOpConvUint64ToDouble; break;
-        default:
-            return nullptr;
-        }
-        break;
-    case EbtFloat:
-        switch (node->getBasicType()) {
-        case EbtInt:    newOp = EOpConvIntToFloat;    break;
-        case EbtUint:   newOp = EOpConvUintToFloat;   break;
-        case EbtBool:   newOp = EOpConvBoolToFloat;   break;
-        case EbtDouble: newOp = EOpConvDoubleToFloat; break;
-#ifdef AMD_EXTENSIONS
-        case EbtFloat16: newOp = EOpConvFloat16ToFloat; break;
-#endif
-        case EbtInt64:  newOp = EOpConvInt64ToFloat;  break;
-        case EbtUint64: newOp = EOpConvUint64ToFloat; break;
-        default:
-            return nullptr;
-        }
-        break;
-#ifdef AMD_EXTENSIONS
-    case EbtFloat16:
-        switch (node->getBasicType()) {
-        case EbtInt:    newOp = EOpConvIntToFloat16;    break;
-        case EbtUint:   newOp = EOpConvUintToFloat16;   break;
-        case EbtBool:   newOp = EOpConvBoolToFloat16;   break;
-        case EbtFloat:  newOp = EOpConvFloatToFloat16;  break;
-        case EbtDouble: newOp = EOpConvDoubleToFloat16; break;
-        case EbtInt64:  newOp = EOpConvInt64ToFloat16;  break;
-        case EbtUint64: newOp = EOpConvUint64ToFloat16; break;
-        default:
-            return nullptr;
-        }
-        break;
-#endif
-    case EbtBool:
-        switch (node->getBasicType()) {
-        case EbtInt:    newOp = EOpConvIntToBool;    break;
-        case EbtUint:   newOp = EOpConvUintToBool;   break;
-        case EbtFloat:  newOp = EOpConvFloatToBool;  break;
-        case EbtDouble: newOp = EOpConvDoubleToBool; break;
-#ifdef AMD_EXTENSIONS
-        case EbtFloat16: newOp = EOpConvFloat16ToBool; break;
-#endif
-        case EbtInt64:  newOp = EOpConvInt64ToBool;  break;
-        case EbtUint64: newOp = EOpConvUint64ToBool; break;
-        default:
-            return nullptr;
-        }
-        break;
-    case EbtInt:
-        switch (node->getBasicType()) {
-        case EbtUint:   newOp = EOpConvUintToInt;   break;
-        case EbtBool:   newOp = EOpConvBoolToInt;   break;
-        case EbtFloat:  newOp = EOpConvFloatToInt;  break;
-        case EbtDouble: newOp = EOpConvDoubleToInt; break;
-#ifdef AMD_EXTENSIONS
-        case EbtFloat16: newOp = EOpConvFloat16ToInt; break;
-#endif
-        case EbtInt64:  newOp = EOpConvInt64ToInt;  break;
-        case EbtUint64: newOp = EOpConvUint64ToInt; break;
-        default:
-            return nullptr;
-        }
-        break;
-    case EbtUint:
-        switch (node->getBasicType()) {
-        case EbtInt:    newOp = EOpConvIntToUint;    break;
-        case EbtBool:   newOp = EOpConvBoolToUint;   break;
-        case EbtFloat:  newOp = EOpConvFloatToUint;  break;
-        case EbtDouble: newOp = EOpConvDoubleToUint; break;
-#ifdef AMD_EXTENSIONS
-        case EbtFloat16: newOp = EOpConvFloat16ToUint; break;
-#endif
-        case EbtInt64:  newOp = EOpConvInt64ToUint;  break;
-        case EbtUint64: newOp = EOpConvUint64ToUint; break;
-        default:
-            return nullptr;
-        }
-        break;
-    case EbtInt64:
-        switch (node->getBasicType()) {
-        case EbtInt:    newOp = EOpConvIntToInt64;    break;
-        case EbtUint:   newOp = EOpConvUintToInt64;   break;
-        case EbtBool:   newOp = EOpConvBoolToInt64;   break;
-        case EbtFloat:  newOp = EOpConvFloatToInt64;  break;
-        case EbtDouble: newOp = EOpConvDoubleToInt64; break;
-#ifdef AMD_EXTENSIONS
-        case EbtFloat16: newOp = EOpConvFloat16ToInt64; break;
-#endif
-        case EbtUint64: newOp = EOpConvUint64ToInt64; break;
-        default:
-            return nullptr;
-        }
-        break;
-    case EbtUint64:
-        switch (node->getBasicType()) {
-        case EbtInt:    newOp = EOpConvIntToUint64;    break;
-        case EbtUint:   newOp = EOpConvUintToUint64;   break;
-        case EbtBool:   newOp = EOpConvBoolToUint64;   break;
-        case EbtFloat:  newOp = EOpConvFloatToUint64;  break;
-        case EbtDouble: newOp = EOpConvDoubleToUint64; break;
-#ifdef AMD_EXTENSIONS
-        case EbtFloat16: newOp = EOpConvFloat16ToUint64; break;
-#endif
-        case EbtInt64:  newOp = EOpConvInt64ToUint64;  break;
-        default:
-            return nullptr;
-        }
-        break;
-    default:
-        return nullptr;
-    }
-
-    TType newType(promoteTo, EvqTemporary, node->getVectorSize(), node->getMatrixCols(), node->getMatrixRows());
-    newNode = addUnaryNode(newOp, node, node->getLoc(), newType);
-
-    // TODO: it seems that some unary folding operations should occur here, but are not
-
-    // Propagate specialization-constant-ness, if allowed
-    if (node->getType().getQualifier().isSpecConstant() && isSpecializationOperation(*newNode))
-        newNode->getWritableType().getQualifier().makeSpecConstant();
+    TIntermTyped* newNode = createConversion(promoteTo, node);
 
     return newNode;
 }
@@ -881,9 +1123,12 @@
         rhsNode = addUniShapeConversion(op, lhsNode->getType(), rhsNode);
         return;
 
+    case EOpMul:
+        // matrix multiply does not change shapes
+        if (lhsNode->isMatrix() && rhsNode->isMatrix())
+            return;
     case EOpAdd:
     case EOpSub:
-    case EOpMul:
     case EOpDiv:
         // want to support vector * scalar native ops in AST and lower, not smear, similarly for
         // matrix * vector, etc.
@@ -933,12 +1178,11 @@
     rhsNode = addShapeConversion(lhsNode->getType(), rhsNode);
 }
 
-// Convert the node's shape of type for the given type. It's not necessarily
-// an error if they are different and not converted, as some operations accept
-// mixed types.  Promotion will do final shape checking.
+// Convert the node's shape of type for the given type, as allowed by the
+// operation involved: 'op'.
 //
-// If there is a chance of two nodes, with conversions possible in each direction,
-// the policy for what to ask for must be in the caller; this will do what is asked.
+// Generally, the AST represents allowed GLSL shapes, so this isn't needed
+// for GLSL.  Bad shapes are caught in conversion or promotion.
 //
 // Return 'node' if no conversion was done. Promotion handles final shape
 // checking.
@@ -957,6 +1201,74 @@
     // The new node that handles the conversion
     TOperator constructorOp = mapTypeToConstructorOp(type);
 
+    if (source == EShSourceHlsl) {
+        // HLSL rules for scalar, vector and matrix conversions:
+        // 1) scalar can become anything, initializing every component with its value
+        // 2) vector and matrix can become scalar, first element is used (warning: truncation)
+        // 3) matrix can become matrix with less rows and/or columns (warning: truncation)
+        // 4) vector can become vector with less rows size (warning: truncation)
+        // 5a) vector 4 can become 2x2 matrix (special case) (same packing layout, its a reinterpret)
+        // 5b) 2x2 matrix can become vector 4 (special case) (same packing layout, its a reinterpret)
+
+        const TType &sourceType = node->getType();
+
+        // rule 1 for scalar to matrix is special
+        if (sourceType.isScalarOrVec1() && type.isMatrix()) {
+
+            // HLSL semantics: the scalar (or vec1) is replicated to every component of the matrix.  Left to its
+            // own devices, the constructor from a scalar would populate the diagonal.  This forces replication
+            // to every matrix element.
+
+            // Note that if the node is complex (e.g, a function call), we don't want to duplicate it here
+            // repeatedly, so we copy it to a temp, then use the temp.
+            const int matSize = type.computeNumComponents();
+            TIntermAggregate* rhsAggregate = new TIntermAggregate();
+
+            const bool isSimple = (node->getAsSymbolNode() != nullptr) || (node->getAsConstantUnion() != nullptr);
+
+            if (!isSimple) {
+                assert(0); // TODO: use node replicator service when available.
+            }
+
+            for (int x = 0; x < matSize; ++x)
+                rhsAggregate->getSequence().push_back(node);
+
+            return setAggregateOperator(rhsAggregate, constructorOp, type, node->getLoc());
+        }
+
+        // rule 1 and 2
+        if ((sourceType.isScalar() && !type.isScalar()) || (!sourceType.isScalar() && type.isScalar()))
+            return setAggregateOperator(makeAggregate(node), constructorOp, type, node->getLoc());
+
+        // rule 3 and 5b
+        if (sourceType.isMatrix()) {
+            // rule 3
+            if (type.isMatrix()) {
+                if ((sourceType.getMatrixCols() != type.getMatrixCols() || sourceType.getMatrixRows() != type.getMatrixRows()) &&
+                    sourceType.getMatrixCols() >= type.getMatrixCols() && sourceType.getMatrixRows() >= type.getMatrixRows())
+                    return setAggregateOperator(makeAggregate(node), constructorOp, type, node->getLoc());
+            // rule 5b
+            } else if (type.isVector()) {
+                if (type.getVectorSize() == 4 && sourceType.getMatrixCols() == 2 && sourceType.getMatrixRows() == 2)
+                    return setAggregateOperator(makeAggregate(node), constructorOp, type, node->getLoc());
+            }
+        }
+
+        // rule 4 and 5a
+        if (sourceType.isVector()) {
+            // rule 4
+            if (type.isVector())
+            {
+                if (sourceType.getVectorSize() > type.getVectorSize())
+                    return setAggregateOperator(makeAggregate(node), constructorOp, type, node->getLoc());
+            // rule 5a
+            } else if (type.isMatrix()) {
+                if (sourceType.getVectorSize() == 4 && type.getMatrixCols() == 2 && type.getMatrixRows() == 2)
+                    return setAggregateOperator(makeAggregate(node), constructorOp, type, node->getLoc());
+            }
+        }
+    }
+
     // scalar -> vector or vec1 -> vector or
     // vector -> scalar or
     // bigger vector -> smaller vector
@@ -968,6 +1280,166 @@
     return node;
 }
 
+bool TIntermediate::isIntegralPromotion(TBasicType from, TBasicType to) const
+{
+    // integral promotions
+    if (to == EbtInt) {
+        switch(from) {
+        case EbtInt8:
+        case EbtInt16:
+        case EbtUint8:
+        case EbtUint16:
+            return true;
+        default:
+            break;
+        }
+    }
+    return false;
+}
+
+bool TIntermediate::isFPPromotion(TBasicType from, TBasicType to) const
+{
+    // floating-point promotions
+    if (to == EbtDouble) {
+        switch(from) {
+        case EbtFloat16:
+        case EbtFloat:
+            return true;
+        default:
+            break;
+        }
+    }
+    return false;
+}
+
+bool TIntermediate::isIntegralConversion(TBasicType from, TBasicType to) const
+{
+    switch (from) {
+    case EbtInt8:
+        switch (to) {
+        case EbtUint8:
+        case EbtInt16:
+        case EbtUint16:
+        case EbtUint:
+        case EbtInt64:
+        case EbtUint64:
+            return true;
+        default:
+            break;
+        }
+        break;
+    case EbtUint8:
+        switch (to) {
+        case EbtInt16:
+        case EbtUint16:
+        case EbtUint:
+        case EbtInt64:
+        case EbtUint64:
+            return true;
+        default:
+            break;
+        }
+        break;
+    case EbtInt16:
+        switch(to) {
+        case EbtUint16:
+        case EbtUint:
+        case EbtInt64:
+        case EbtUint64:
+            return true;
+        default:
+            break;
+        }
+        break;
+    case EbtUint16:
+        switch(to) {
+        case EbtUint:
+        case EbtInt64:
+        case EbtUint64:
+            return true;
+        default:
+            break;
+        }
+        break;
+    case EbtInt:
+        switch(to) {
+        case EbtUint:
+            return version >= 400 || (source == EShSourceHlsl);
+        case EbtInt64:
+        case EbtUint64:
+            return true;
+        default:
+            break;
+        }
+        break;
+    case EbtUint:
+        switch(to) {
+        case EbtInt64:
+        case EbtUint64:
+            return true;
+        default:
+            break;
+        }
+        break;
+    case EbtInt64:
+        if (to == EbtUint64) {
+            return true;
+        }
+        break;
+    default:
+        break;
+    }
+    return false;
+}
+
+bool TIntermediate::isFPConversion(TBasicType from, TBasicType to) const
+{
+    if (to == EbtFloat && from == EbtFloat16) {
+        return true;
+    } else {
+        return false;
+    }
+}
+
+bool TIntermediate::isFPIntegralConversion(TBasicType from, TBasicType to) const
+{
+    switch (from) {
+    case EbtInt8:
+    case EbtUint8:
+    case EbtInt16:
+    case EbtUint16:
+        switch (to) {
+        case EbtFloat16:
+        case EbtFloat:
+        case EbtDouble:
+            return true;
+        default:
+            break;
+        }
+        break;
+    case EbtInt:
+    case EbtUint:
+        switch(to) {
+        case EbtFloat:
+        case EbtDouble:
+            return true;
+        default:
+            break;
+        }
+        break;
+    case EbtInt64:
+    case EbtUint64:
+        if (to == EbtDouble) {
+            return true;
+        }
+        break;
+
+    default:
+        break;
+    }
+    return false;
+}
+
 //
 // See if the 'from' type is allowed to be implicitly converted to the
 // 'to' type.  This is not about vector/array/struct, only about basic type.
@@ -1013,79 +1485,350 @@
         }
     }
 
-    switch (to) {
-    case EbtDouble:
-        switch (from) {
-        case EbtInt:
-        case EbtUint:
-        case EbtInt64:
-        case EbtUint64:
-        case EbtFloat:
+    bool explicitTypesEnabled = extensionRequested(E_GL_EXT_shader_explicit_arithmetic_types) ||
+                                extensionRequested(E_GL_EXT_shader_explicit_arithmetic_types_int8) ||
+                                extensionRequested(E_GL_EXT_shader_explicit_arithmetic_types_int16) ||
+                                extensionRequested(E_GL_EXT_shader_explicit_arithmetic_types_int32) ||
+                                extensionRequested(E_GL_EXT_shader_explicit_arithmetic_types_int64) ||
+                                extensionRequested(E_GL_EXT_shader_explicit_arithmetic_types_float16) ||
+                                extensionRequested(E_GL_EXT_shader_explicit_arithmetic_types_float32) ||
+                                extensionRequested(E_GL_EXT_shader_explicit_arithmetic_types_float64);
+
+    if (explicitTypesEnabled) {
+        // integral promotions
+        if (isIntegralPromotion(from, to)) {
+            return true;
+        }
+
+        // floating-point promotions
+        if (isFPPromotion(from, to)) {
+            return true;
+        }
+
+        // integral conversions
+        if (isIntegralConversion(from, to)) {
+            return true;
+        }
+
+        // floating-point conversions
+        if (isFPConversion(from, to)) {
+           return true;
+        }
+
+        // floating-integral conversions
+        if (isFPIntegralConversion(from, to)) {
+           return true;
+        }
+
+        // hlsl supported conversions
+        if (source == EShSourceHlsl) {
+            if (from == EbtBool && (to == EbtInt || to == EbtUint || to == EbtFloat))
+                return true;
+        }
+    } else {
+        switch (to) {
         case EbtDouble:
+            switch (from) {
+            case EbtInt:
+            case EbtUint:
+            case EbtInt64:
+            case EbtUint64:
+            case EbtFloat:
+            case EbtDouble:
+                return true;
 #ifdef AMD_EXTENSIONS
-        case EbtFloat16:
+            case EbtInt16:
+            case EbtUint16:
+                return extensionRequested(E_GL_AMD_gpu_shader_int16);
+            case EbtFloat16:
+                return extensionRequested(E_GL_AMD_gpu_shader_half_float);
 #endif
-            return true;
-        default:
-            return false;
-        }
-    case EbtFloat:
-        switch (from) {
-        case EbtInt:
-        case EbtUint:
+            default:
+                return false;
+           }
         case EbtFloat:
+            switch (from) {
+            case EbtInt:
+            case EbtUint:
+            case EbtFloat:
+                 return true;
+            case EbtBool:
+                 return (source == EShSourceHlsl);
 #ifdef AMD_EXTENSIONS
-        case EbtFloat16:
+            case EbtInt16:
+            case EbtUint16:
+                return extensionRequested(E_GL_AMD_gpu_shader_int16);
 #endif
-            return true;
-        case EbtBool:
-            return (source == EShSourceHlsl);
-        default:
-            return false;
-        }
-    case EbtUint:
-        switch (from) {
-        case EbtInt:
-            return version >= 400 || (source == EShSourceHlsl);
+            case EbtFloat16:
+                return 
+#ifdef AMD_EXTENSIONS
+                    extensionRequested(E_GL_AMD_gpu_shader_half_float) ||
+#endif
+                    (source == EShSourceHlsl);
+            default:
+                 return false;
+            }
         case EbtUint:
-            return true;
-        case EbtBool:
-            return (source == EShSourceHlsl);
-        default:
-            return false;
-        }
-    case EbtInt:
-        switch (from) {
+            switch (from) {
+            case EbtInt:
+                 return version >= 400 || (source == EShSourceHlsl);
+            case EbtUint:
+                return true;
+            case EbtBool:
+                return (source == EShSourceHlsl);
+#ifdef AMD_EXTENSIONS
+            case EbtInt16:
+            case EbtUint16:
+                return extensionRequested(E_GL_AMD_gpu_shader_int16);
+#endif
+            default:
+                return false;
+            }
         case EbtInt:
-            return true;
-        case EbtBool:
-            return (source == EShSourceHlsl);
-        default:
-            return false;
-        }
-    case EbtUint64:
-        switch (from) {
-        case EbtInt:
-        case EbtUint:
-        case EbtInt64:
+            switch (from) {
+            case EbtInt:
+                return true;
+            case EbtBool:
+                return (source == EShSourceHlsl);
+#ifdef AMD_EXTENSIONS
+            case EbtInt16:
+                return extensionRequested(E_GL_AMD_gpu_shader_int16);
+#endif
+            default:
+                return false;
+            }
         case EbtUint64:
-            return true;
-        default:
-            return false;
-        }
-    case EbtInt64:
-        switch (from) {
-        case EbtInt:
+            switch (from) {
+            case EbtInt:
+            case EbtUint:
+            case EbtInt64:
+            case EbtUint64:
+                return true;
+#ifdef AMD_EXTENSIONS
+            case EbtInt16:
+            case EbtUint16:
+                return extensionRequested(E_GL_AMD_gpu_shader_int16);
+#endif
+            default:
+                return false;
+            }
         case EbtInt64:
-            return true;
+            switch (from) {
+            case EbtInt:
+            case EbtInt64:
+                return true;
+#ifdef AMD_EXTENSIONS
+            case EbtInt16:
+                return extensionRequested(E_GL_AMD_gpu_shader_int16);
+#endif
+            default:
+                return false;
+            }
+        case EbtFloat16:
+#ifdef AMD_EXTENSIONS
+            switch (from) {
+            case EbtInt16:
+            case EbtUint16:
+                return extensionRequested(E_GL_AMD_gpu_shader_int16);
+            case EbtFloat16:
+                return extensionRequested(E_GL_AMD_gpu_shader_half_float);
+            default:
+                break;
+            }
+#endif
+            return false;
+        case EbtUint16:
+#ifdef AMD_EXTENSIONS
+            switch (from) {
+            case EbtInt16:
+            case EbtUint16:
+                return extensionRequested(E_GL_AMD_gpu_shader_int16);
+            default:
+                break;
+            }
+#endif
+            return false;
         default:
             return false;
         }
+    }
+
+    return false;
+}
+
+static bool canSignedIntTypeRepresentAllUnsignedValues(TBasicType sintType, TBasicType uintType) {
+    switch(sintType) {
+    case EbtInt8:
+        switch(uintType) {
+        case EbtUint8:
+        case EbtUint16:
+        case EbtUint:
+        case EbtUint64:
+            return false;
+        default:
+            assert(false);
+            return false;
+        }
+        break;
+    case EbtInt16:
+        switch(uintType) {
+        case EbtUint8:
+            return true;
+        case EbtUint16:
+        case EbtUint:
+        case EbtUint64:
+            return false;
+        default:
+            assert(false);
+            return false;
+        }
+        break;
+    case EbtInt:
+        switch(uintType) {
+        case EbtUint8:
+        case EbtUint16:
+            return true;
+        case EbtUint:
+            return false;
+        default:
+            assert(false);
+            return false;
+        }
+        break;
+    case EbtInt64:
+        switch(uintType) {
+        case EbtUint8:
+        case EbtUint16:
+        case EbtUint:
+            return true;
+        case EbtUint64:
+            return false;
+        default:
+            assert(false);
+            return false;
+        }
+        break;
     default:
+        assert(false);
         return false;
     }
 }
 
+
+static TBasicType getCorrespondingUnsignedType(TBasicType type) {
+    switch(type) {
+    case EbtInt8:
+        return EbtUint8;
+    case EbtInt16:
+        return EbtUint16;
+    case EbtInt:
+        return EbtUint;
+    case EbtInt64:
+        return EbtUint64;
+    default:
+        assert(false);
+        return EbtNumTypes;
+    }
+}
+
+// Implements the following rules
+//    - If either operand has type float64_t or derived from float64_t,
+//      the other shall be converted to float64_t or derived type.
+//    - Otherwise, if either operand has type float32_t or derived from
+//      float32_t, the other shall be converted to float32_t or derived type.
+//    - Otherwise, if either operand has type float16_t or derived from
+//      float16_t, the other shall be converted to float16_t or derived type.
+//    - Otherwise, if both operands have integer types the following rules
+//      shall be applied to the operands:
+//      - If both operands have the same type, no further conversion
+//        is needed.
+//      - Otherwise, if both operands have signed integer types or both
+//        have unsigned integer types, the operand with the type of lesser
+//        integer conversion rank shall be converted to the type of the
+//        operand with greater rank.
+//      - Otherwise, if the operand that has unsigned integer type has rank
+//        greater than or equal to the rank of the type of the other
+//        operand, the operand with signed integer type shall be converted
+//        to the type of the operand with unsigned integer type.
+//      - Otherwise, if the type of the operand with signed integer type can
+//        represent all of the values of the type of the operand with
+//        unsigned integer type, the operand with unsigned integer type
+//        shall be converted to the type of the operand with signed
+//        integer type.
+//      - Otherwise, both operands shall be converted to the unsigned
+//        integer type corresponding to the type of the operand with signed
+//        integer type.
+
+std::tuple<TBasicType, TBasicType> TIntermediate::getConversionDestinatonType(TBasicType type0, TBasicType type1, TOperator op) const
+{
+    TBasicType res0 = EbtNumTypes;
+    TBasicType res1 = EbtNumTypes;
+
+    if (profile == EEsProfile || version == 110)
+        return std::make_tuple(res0, res1);;
+
+    if (source == EShSourceHlsl) {
+        if (canImplicitlyPromote(type1, type0, op)) {
+            res0 = type0;
+            res1 = type0;
+        } else if (canImplicitlyPromote(type0, type1, op)) {
+            res0 = type1;
+            res1 = type1;
+        }
+        return std::make_tuple(res0, res1);
+    }
+
+    if ((type0 == EbtDouble && canImplicitlyPromote(type1, EbtDouble, op)) ||
+        (type1 == EbtDouble && canImplicitlyPromote(type0, EbtDouble, op)) ) {
+        res0 = EbtDouble;
+        res1 = EbtDouble;
+    } else if ((type0 == EbtFloat && canImplicitlyPromote(type1, EbtFloat, op)) ||
+               (type1 == EbtFloat && canImplicitlyPromote(type0, EbtFloat, op)) ) {
+        res0 = EbtFloat;
+        res1 = EbtFloat;
+    } else if ((type0 == EbtFloat16 && canImplicitlyPromote(type1, EbtFloat16, op)) ||
+               (type1 == EbtFloat16 && canImplicitlyPromote(type0, EbtFloat16, op)) ) {
+        res0 = EbtFloat16;
+        res1 = EbtFloat16;
+    } else if (isTypeInt(type0) && isTypeInt(type1) &&
+               (canImplicitlyPromote(type0, type1, op) || canImplicitlyPromote(type1, type0, op))) {
+        if ((isTypeSignedInt(type0) && isTypeSignedInt(type1)) ||
+            (isTypeUnsignedInt(type0) && isTypeUnsignedInt(type1))) {
+            if (getTypeRank(type0) < getTypeRank(type1)) {
+                res0 = type1;
+                res1 = type1;
+            } else {
+                res0 = type0;
+                res1 = type0;
+            }
+        } else if (isTypeUnsignedInt(type0) && (getTypeRank(type0) > getTypeRank(type1))) {
+            res0 = type0;
+            res1 = type0;
+        } else if (isTypeUnsignedInt(type1) && (getTypeRank(type1) > getTypeRank(type0))) {
+            res0 = type1;
+            res1 = type1;
+        } else if (isTypeSignedInt(type0)) {
+            if (canSignedIntTypeRepresentAllUnsignedValues(type0, type1)) {
+                res0 = type0;
+                res1 = type0;
+            } else {
+                res0 = getCorrespondingUnsignedType(type0);
+                res1 = getCorrespondingUnsignedType(type0);
+            }
+        } else if (isTypeSignedInt(type1)) {
+            if (canSignedIntTypeRepresentAllUnsignedValues(type1, type0)) {
+                res0 = type1;
+                res1 = type1;
+            } else {
+                res0 = getCorrespondingUnsignedType(type1);
+                res1 = getCorrespondingUnsignedType(type1);
+            }
+        }
+    }
+
+    return std::make_tuple(res0, res1);
+}
+
 //
 // Given a type, find what operation would fully construct it.
 //
@@ -1093,6 +1836,9 @@
 {
     TOperator op = EOpNull;
 
+    if (type.getQualifier().nonUniform)
+        return EOpConstructNonuniform;
+
     switch (type.getBasicType()) {
     case EbtStruct:
         op = EOpConstructStruct;
@@ -1178,7 +1924,6 @@
             }
         }
         break;
-#ifdef AMD_EXTENSIONS
     case EbtFloat16:
         if (type.getMatrixCols()) {
             switch (type.getMatrixCols()) {
@@ -1218,25 +1963,118 @@
             }
         }
         break;
-#endif
-    case EbtInt:
+    case EbtInt8:
         switch(type.getVectorSize()) {
-        case 1: op = EOpConstructInt;   break;
-        case 2: op = EOpConstructIVec2; break;
-        case 3: op = EOpConstructIVec3; break;
-        case 4: op = EOpConstructIVec4; break;
+        case 1: op = EOpConstructInt8;   break;
+        case 2: op = EOpConstructI8Vec2; break;
+        case 3: op = EOpConstructI8Vec3; break;
+        case 4: op = EOpConstructI8Vec4; break;
         default: break; // some compilers want this
         }
         break;
-    case EbtUint:
+    case EbtUint8:
         switch(type.getVectorSize()) {
-        case 1: op = EOpConstructUint;  break;
-        case 2: op = EOpConstructUVec2; break;
-        case 3: op = EOpConstructUVec3; break;
-        case 4: op = EOpConstructUVec4; break;
+        case 1: op = EOpConstructUint8;  break;
+        case 2: op = EOpConstructU8Vec2; break;
+        case 3: op = EOpConstructU8Vec3; break;
+        case 4: op = EOpConstructU8Vec4; break;
         default: break; // some compilers want this
         }
         break;
+    case EbtInt16:
+        switch(type.getVectorSize()) {
+        case 1: op = EOpConstructInt16;   break;
+        case 2: op = EOpConstructI16Vec2; break;
+        case 3: op = EOpConstructI16Vec3; break;
+        case 4: op = EOpConstructI16Vec4; break;
+        default: break; // some compilers want this
+        }
+        break;
+    case EbtUint16:
+        switch(type.getVectorSize()) {
+        case 1: op = EOpConstructUint16;  break;
+        case 2: op = EOpConstructU16Vec2; break;
+        case 3: op = EOpConstructU16Vec3; break;
+        case 4: op = EOpConstructU16Vec4; break;
+        default: break; // some compilers want this
+        }
+        break;
+    case EbtInt:
+        if (type.getMatrixCols()) {
+            switch (type.getMatrixCols()) {
+            case 2:
+                switch (type.getMatrixRows()) {
+                case 2: op = EOpConstructIMat2x2; break;
+                case 3: op = EOpConstructIMat2x3; break;
+                case 4: op = EOpConstructIMat2x4; break;
+                default: break; // some compilers want this
+                }
+                break;
+            case 3:
+                switch (type.getMatrixRows()) {
+                case 2: op = EOpConstructIMat3x2; break;
+                case 3: op = EOpConstructIMat3x3; break;
+                case 4: op = EOpConstructIMat3x4; break;
+                default: break; // some compilers want this
+                }
+                break;
+            case 4:
+                switch (type.getMatrixRows()) {
+                case 2: op = EOpConstructIMat4x2; break;
+                case 3: op = EOpConstructIMat4x3; break;
+                case 4: op = EOpConstructIMat4x4; break;
+                default: break; // some compilers want this
+                }
+                break;
+            }
+        } else {
+            switch(type.getVectorSize()) {
+            case 1: op = EOpConstructInt;   break;
+            case 2: op = EOpConstructIVec2; break;
+            case 3: op = EOpConstructIVec3; break;
+            case 4: op = EOpConstructIVec4; break;
+            default: break; // some compilers want this
+            }
+        }
+        break;
+    case EbtUint:
+        if (type.getMatrixCols()) {
+            switch (type.getMatrixCols()) {
+            case 2:
+                switch (type.getMatrixRows()) {
+                case 2: op = EOpConstructUMat2x2; break;
+                case 3: op = EOpConstructUMat2x3; break;
+                case 4: op = EOpConstructUMat2x4; break;
+                default: break; // some compilers want this
+                }
+                break;
+            case 3:
+                switch (type.getMatrixRows()) {
+                case 2: op = EOpConstructUMat3x2; break;
+                case 3: op = EOpConstructUMat3x3; break;
+                case 4: op = EOpConstructUMat3x4; break;
+                default: break; // some compilers want this
+                }
+                break;
+            case 4:
+                switch (type.getMatrixRows()) {
+                case 2: op = EOpConstructUMat4x2; break;
+                case 3: op = EOpConstructUMat4x3; break;
+                case 4: op = EOpConstructUMat4x4; break;
+                default: break; // some compilers want this
+                }
+                break;
+            }
+        } else {
+            switch(type.getVectorSize()) {
+            case 1: op = EOpConstructUint;  break;
+            case 2: op = EOpConstructUVec2; break;
+            case 3: op = EOpConstructUVec3; break;
+            case 4: op = EOpConstructUVec4; break;
+            default: break; // some compilers want this
+            }
+        }
+        break;
     case EbtInt64:
         switch(type.getVectorSize()) {
         case 1: op = EOpConstructInt64;   break;
@@ -1256,12 +2094,41 @@
         }
         break;
     case EbtBool:
-        switch(type.getVectorSize()) {
-        case 1:  op = EOpConstructBool;  break;
-        case 2:  op = EOpConstructBVec2; break;
-        case 3:  op = EOpConstructBVec3; break;
-        case 4:  op = EOpConstructBVec4; break;
-        default: break; // some compilers want this
+        if (type.getMatrixCols()) {
+            switch (type.getMatrixCols()) {
+            case 2:
+                switch (type.getMatrixRows()) {
+                case 2: op = EOpConstructBMat2x2; break;
+                case 3: op = EOpConstructBMat2x3; break;
+                case 4: op = EOpConstructBMat2x4; break;
+                default: break; // some compilers want this
+                }
+                break;
+            case 3:
+                switch (type.getMatrixRows()) {
+                case 2: op = EOpConstructBMat3x2; break;
+                case 3: op = EOpConstructBMat3x3; break;
+                case 4: op = EOpConstructBMat3x4; break;
+                default: break; // some compilers want this
+                }
+                break;
+            case 4:
+                switch (type.getMatrixRows()) {
+                case 2: op = EOpConstructBMat4x2; break;
+                case 3: op = EOpConstructBMat4x3; break;
+                case 4: op = EOpConstructBMat4x4; break;
+                default: break; // some compilers want this
+                }
+                break;
+            }
+        } else {
+            switch(type.getVectorSize()) {
+            case 1:  op = EOpConstructBool;  break;
+            case 2:  op = EOpConstructBVec2; break;
+            case 3:  op = EOpConstructBVec3; break;
+            case 4:  op = EOpConstructBVec4; break;
+            default: break; // some compilers want this
+            }
         }
         break;
     default:
@@ -1354,7 +2221,7 @@
 //
 // Returns the selection node created.
 //
-TIntermTyped* TIntermediate::addSelection(TIntermTyped* cond, TIntermNodePair nodePair, const TSourceLoc& loc)
+TIntermSelection* TIntermediate::addSelection(TIntermTyped* cond, TIntermNodePair nodePair, const TSourceLoc& loc)
 {
     //
     // Don't prune the false path for compile-time constants; it's needed
@@ -1405,27 +2272,28 @@
 //
 // Returns the selection node created, or nullptr if one could not be.
 //
-TIntermTyped* TIntermediate::addSelection(TIntermTyped* cond, TIntermTyped* trueBlock, TIntermTyped* falseBlock, const TSourceLoc& loc)
+TIntermTyped* TIntermediate::addSelection(TIntermTyped* cond, TIntermTyped* trueBlock, TIntermTyped* falseBlock,
+                                          const TSourceLoc& loc)
 {
     // If it's void, go to the if-then-else selection()
     if (trueBlock->getBasicType() == EbtVoid && falseBlock->getBasicType() == EbtVoid) {
         TIntermNodePair pair = { trueBlock, falseBlock };
-        return addSelection(cond, pair, loc);
+        TIntermSelection* selection = addSelection(cond, pair, loc);
+        if (getSource() == EShSourceHlsl)
+            selection->setNoShortCircuit();
+
+        return selection;
     }
 
     //
     // Get compatible types.
     //
-    TIntermTyped* child = addConversion(EOpSequence, trueBlock->getType(), falseBlock);
-    if (child)
-        falseBlock = child;
-    else {
-        child = addConversion(EOpSequence, falseBlock->getType(), trueBlock);
-        if (child)
-            trueBlock = child;
-        else
-            return nullptr;
-    }
+    auto children = addConversion(EOpSequence, trueBlock, falseBlock);
+    trueBlock = std::get<0>(children);
+    falseBlock = std::get<1>(children);
+
+    if (trueBlock == nullptr || falseBlock == nullptr)
+        return nullptr;
 
     // Handle a vector condition as a mix
     if (!cond->getType().isScalarOrVec1()) {
@@ -1481,6 +2349,9 @@
     else
         node->getQualifier().makeTemporary();
 
+    if (getSource() == EShSourceHlsl)
+        node->setNoShortCircuit();
+
     return node;
 }
 
@@ -1500,6 +2371,37 @@
 
     return node;
 }
+TIntermConstantUnion* TIntermediate::addConstantUnion(signed char i8, const TSourceLoc& loc, bool literal) const
+{
+    TConstUnionArray unionArray(1);
+    unionArray[0].setI8Const(i8);
+
+    return addConstantUnion(unionArray, TType(EbtInt8, EvqConst), loc, literal);
+}
+
+TIntermConstantUnion* TIntermediate::addConstantUnion(unsigned char u8, const TSourceLoc& loc, bool literal) const
+{
+    TConstUnionArray unionArray(1);
+    unionArray[0].setUConst(u8);
+
+    return addConstantUnion(unionArray, TType(EbtUint8, EvqConst), loc, literal);
+}
+
+TIntermConstantUnion* TIntermediate::addConstantUnion(signed short i16, const TSourceLoc& loc, bool literal) const
+{
+    TConstUnionArray unionArray(1);
+    unionArray[0].setI16Const(i16);
+
+    return addConstantUnion(unionArray, TType(EbtInt16, EvqConst), loc, literal);
+}
+
+TIntermConstantUnion* TIntermediate::addConstantUnion(unsigned short u16, const TSourceLoc& loc, bool literal) const
+{
+    TConstUnionArray unionArray(1);
+    unionArray[0].setU16Const(u16);
+
+    return addConstantUnion(unionArray, TType(EbtUint16, EvqConst), loc, literal);
+}
 
 TIntermConstantUnion* TIntermediate::addConstantUnion(int i, const TSourceLoc& loc, bool literal) const
 {
@@ -1543,11 +2445,7 @@
 
 TIntermConstantUnion* TIntermediate::addConstantUnion(double d, TBasicType baseType, const TSourceLoc& loc, bool literal) const
 {
-#ifdef AMD_EXTENSIONS
     assert(baseType == EbtFloat || baseType == EbtDouble || baseType == EbtFloat16);
-#else
-    assert(baseType == EbtFloat || baseType == EbtDouble);
-#endif
 
     TConstUnionArray unionArray(1);
     unionArray[0].setDConst(d);
@@ -1630,11 +2528,11 @@
 //
 // Create while and do-while loop nodes.
 //
-TIntermLoop* TIntermediate::addLoop(TIntermNode* body, TIntermTyped* test, TIntermTyped* terminal, bool testFirst, const TSourceLoc& loc, TLoopControl control)
+TIntermLoop* TIntermediate::addLoop(TIntermNode* body, TIntermTyped* test, TIntermTyped* terminal, bool testFirst,
+    const TSourceLoc& loc)
 {
     TIntermLoop* node = new TIntermLoop(body, test, terminal, testFirst);
     node->setLoc(loc);
-    node->setLoopControl(control);
 
     return node;
 }
@@ -1642,14 +2540,19 @@
 //
 // Create a for-loop sequence.
 //
-TIntermAggregate* TIntermediate::addForLoop(TIntermNode* body, TIntermNode* initializer, TIntermTyped* test, TIntermTyped* terminal, bool testFirst, const TSourceLoc& loc, TLoopControl control)
+TIntermAggregate* TIntermediate::addForLoop(TIntermNode* body, TIntermNode* initializer, TIntermTyped* test,
+    TIntermTyped* terminal, bool testFirst, const TSourceLoc& loc, TIntermLoop*& node)
 {
-    TIntermLoop* node = new TIntermLoop(body, test, terminal, testFirst);
+    node = new TIntermLoop(body, test, terminal, testFirst);
     node->setLoc(loc);
-    node->setLoopControl(control);
 
-    // make a sequence of the initializer and statement
-    TIntermAggregate* loopSequence = makeAggregate(initializer, loc);
+    // make a sequence of the initializer and statement, but try to reuse the
+    // aggregate already created for whatever is in the initializer, if there is one
+    TIntermAggregate* loopSequence = (initializer == nullptr ||
+                                      initializer->getAsAggregate() == nullptr) ? makeAggregate(initializer, loc)
+                                                                                : initializer->getAsAggregate();
+    if (loopSequence != nullptr && loopSequence->getOp() == EOpSequence)
+        loopSequence->setOp(EOpNull);
     loopSequence = growAggregate(loopSequence, node);
     loopSequence->setOperator(EOpSequence);
 
@@ -1689,6 +2592,14 @@
     // Propagate 'noContraction' label in backward from 'precise' variables.
     glslang::PropagateNoContraction(*this);
 
+    switch (textureSamplerTransformMode) {
+    case EShTexSampTransKeep:
+        break;
+    case EShTexSampTransUpgradeTextureRemoveSampler:
+        performTextureUpgradeAndSamplerRemovalTransformation(root);
+        break;
+    }
+
     return true;
 }
 
@@ -1829,12 +2740,10 @@
         case EOpVectorSwizzle:
         case EOpConvFloatToDouble:
         case EOpConvDoubleToFloat:
-#ifdef AMD_EXTENSIONS
         case EOpConvFloat16ToFloat:
         case EOpConvFloatToFloat16:
         case EOpConvFloat16ToDouble:
         case EOpConvDoubleToFloat16:
-#endif
             return true;
         default:
             return false;
@@ -1858,28 +2767,98 @@
     case EOpIndexDirectStruct:
     case EOpVectorSwizzle:
 
-    // conversion constructors
+    // (u)int* -> bool
+    case EOpConvInt8ToBool:
+    case EOpConvInt16ToBool:
     case EOpConvIntToBool:
-    case EOpConvUintToBool:
-    case EOpConvUintToInt:
-    case EOpConvBoolToInt:
-    case EOpConvIntToUint:
-    case EOpConvBoolToUint:
     case EOpConvInt64ToBool:
-    case EOpConvBoolToInt64:
+    case EOpConvUint8ToBool:
+    case EOpConvUint16ToBool:
+    case EOpConvUintToBool:
     case EOpConvUint64ToBool:
+
+    // bool -> (u)int*
+    case EOpConvBoolToInt8:
+    case EOpConvBoolToInt16:
+    case EOpConvBoolToInt:
+    case EOpConvBoolToInt64:
+    case EOpConvBoolToUint8:
+    case EOpConvBoolToUint16:
+    case EOpConvBoolToUint:
     case EOpConvBoolToUint64:
-    case EOpConvInt64ToInt:
+
+    // int8_t -> (u)int*
+    case EOpConvInt8ToInt16:
+    case EOpConvInt8ToInt:
+    case EOpConvInt8ToInt64:
+    case EOpConvInt8ToUint8:
+    case EOpConvInt8ToUint16:
+    case EOpConvInt8ToUint:
+    case EOpConvInt8ToUint64:
+
+    // int16_t -> (u)int*
+    case EOpConvInt16ToInt8:
+    case EOpConvInt16ToInt:
+    case EOpConvInt16ToInt64:
+    case EOpConvInt16ToUint8:
+    case EOpConvInt16ToUint16:
+    case EOpConvInt16ToUint:
+    case EOpConvInt16ToUint64:
+
+    // int32_t -> (u)int*
+    case EOpConvIntToInt8:
+    case EOpConvIntToInt16:
     case EOpConvIntToInt64:
-    case EOpConvUint64ToUint:
-    case EOpConvUintToUint64:
-    case EOpConvInt64ToUint64:
-    case EOpConvUint64ToInt64:
-    case EOpConvInt64ToUint:
-    case EOpConvUintToInt64:
-    case EOpConvUint64ToInt:
+    case EOpConvIntToUint8:
+    case EOpConvIntToUint16:
+    case EOpConvIntToUint:
     case EOpConvIntToUint64:
 
+    // int64_t -> (u)int*
+    case EOpConvInt64ToInt8:
+    case EOpConvInt64ToInt16:
+    case EOpConvInt64ToInt:
+    case EOpConvInt64ToUint8:
+    case EOpConvInt64ToUint16:
+    case EOpConvInt64ToUint:
+    case EOpConvInt64ToUint64:
+
+    // uint8_t -> (u)int*
+    case EOpConvUint8ToInt8:
+    case EOpConvUint8ToInt16:
+    case EOpConvUint8ToInt:
+    case EOpConvUint8ToInt64:
+    case EOpConvUint8ToUint16:
+    case EOpConvUint8ToUint:
+    case EOpConvUint8ToUint64:
+
+    // uint16_t -> (u)int*
+    case EOpConvUint16ToInt8:
+    case EOpConvUint16ToInt16:
+    case EOpConvUint16ToInt:
+    case EOpConvUint16ToInt64:
+    case EOpConvUint16ToUint8:
+    case EOpConvUint16ToUint:
+    case EOpConvUint16ToUint64:
+
+    // uint32_t -> (u)int*
+    case EOpConvUintToInt8:
+    case EOpConvUintToInt16:
+    case EOpConvUintToInt:
+    case EOpConvUintToInt64:
+    case EOpConvUintToUint8:
+    case EOpConvUintToUint16:
+    case EOpConvUintToUint64:
+
+    // uint64_t -> (u)int*
+    case EOpConvUint64ToInt8:
+    case EOpConvUint64ToInt16:
+    case EOpConvUint64ToInt:
+    case EOpConvUint64ToInt64:
+    case EOpConvUint64ToUint8:
+    case EOpConvUint64ToUint16:
+    case EOpConvUint64ToUint:
+
     // unary operations
     case EOpNegative:
     case EOpLogicalNot:
@@ -1912,6 +2891,64 @@
     }
 }
 
+// Is the operation one that must propagate nonuniform?
+bool TIntermediate::isNonuniformPropagating(TOperator op) const
+{
+    // "* All Operators in Section 5.1 (Operators), except for assignment,
+    //    arithmetic assignment, and sequence
+    //  * Component selection in Section 5.5
+    //  * Matrix components in Section 5.6
+    //  * Structure and Array Operations in Section 5.7, except for the length
+    //    method."
+    switch (op) {
+    case EOpPostIncrement:
+    case EOpPostDecrement:
+    case EOpPreIncrement:
+    case EOpPreDecrement:
+
+    case EOpNegative:
+    case EOpLogicalNot:
+    case EOpVectorLogicalNot:
+    case EOpBitwiseNot:
+
+    case EOpAdd:
+    case EOpSub:
+    case EOpMul:
+    case EOpDiv:
+    case EOpMod:
+    case EOpRightShift:
+    case EOpLeftShift:
+    case EOpAnd:
+    case EOpInclusiveOr:
+    case EOpExclusiveOr:
+    case EOpEqual:
+    case EOpNotEqual:
+    case EOpLessThan:
+    case EOpGreaterThan:
+    case EOpLessThanEqual:
+    case EOpGreaterThanEqual:
+    case EOpVectorTimesScalar:
+    case EOpVectorTimesMatrix:
+    case EOpMatrixTimesVector:
+    case EOpMatrixTimesScalar:
+
+    case EOpLogicalOr:
+    case EOpLogicalXor:
+    case EOpLogicalAnd:
+
+    case EOpIndexDirect:
+    case EOpIndexIndirect:
+    case EOpIndexDirectStruct:
+    case EOpVectorSwizzle:
+        return true;
+
+    default:
+        break;
+    }
+
+    return false;
+}
+
 ////////////////////////////////////////////////////////////////
 //
 // Member functions of the nodes used for building the tree.
@@ -1996,7 +3033,7 @@
         // Convert operand to a boolean type
         if (operand->getBasicType() != EbtBool) {
             // Add constructor to boolean type. If that fails, we can't do it, so return false.
-            TIntermTyped* converted = convertToBasicType(op, EbtBool, operand);
+            TIntermTyped* converted = addConversion(op, TType(EbtBool), operand);
             if (converted == nullptr)
                 return false;
 
@@ -2005,11 +3042,7 @@
         }
         break;
     case EOpBitwiseNot:
-        if (operand->getBasicType() != EbtInt &&
-            operand->getBasicType() != EbtUint &&
-            operand->getBasicType() != EbtInt64 &&
-            operand->getBasicType() != EbtUint64)
-
+        if (!isTypeInt(operand->getBasicType()))
             return false;
         break;
     case EOpNegative:
@@ -2017,14 +3050,9 @@
     case EOpPostDecrement:
     case EOpPreIncrement:
     case EOpPreDecrement:
-        if (operand->getBasicType() != EbtInt &&
-            operand->getBasicType() != EbtUint &&
-            operand->getBasicType() != EbtInt64 &&
-            operand->getBasicType() != EbtUint64 &&
+        if (!isTypeInt(operand->getBasicType()) &&
             operand->getBasicType() != EbtFloat &&
-#ifdef AMD_EXTENSIONS
             operand->getBasicType() != EbtFloat16 &&
-#endif
             operand->getBasicType() != EbtDouble)
 
             return false;
@@ -2044,34 +3072,12 @@
 
 void TIntermUnary::updatePrecision()
 {
-#ifdef AMD_EXTENSIONS
     if (getBasicType() == EbtInt || getBasicType() == EbtUint || getBasicType() == EbtFloat || getBasicType() == EbtFloat16) {
-#else
-    if (getBasicType() == EbtInt || getBasicType() == EbtUint || getBasicType() == EbtFloat) {
-#endif
         if (operand->getQualifier().precision > getQualifier().precision)
             getQualifier().precision = operand->getQualifier().precision;
     }
 }
 
-// If it is not already, convert this node to the given basic type.
-TIntermTyped* TIntermediate::convertToBasicType(TOperator op, TBasicType basicType, TIntermTyped* node) const
-{
-    if (node == nullptr)
-        return nullptr;
-
-    // It's already this basic type: nothing needs to be done, so use the node directly.
-    if (node->getBasicType() == basicType)
-        return node;
-
-    const TType& type = node->getType();
-    const TType newType(basicType, type.getQualifier().storage,
-                        type.getVectorSize(), type.getMatrixCols(), type.getMatrixRows(), type.isVector());
-
-    // Add constructor to the right vectorness of the right type. If that fails, we can't do it, so return nullptr.
-    return addConversion(op, newType, node);
-}
-
 //
 // See TIntermediate::promote
 //
@@ -2144,12 +3150,19 @@
         case EOpSub:
         case EOpDiv:
         case EOpMul:
-            left = addConversion(op, TType(EbtInt, EvqTemporary, left->getVectorSize()), left);
-            right = addConversion(op, TType(EbtInt, EvqTemporary, right->getVectorSize()), right);
+            if (left->getBasicType() == EbtBool)
+                left  = createConversion(EbtInt, left);
+            if (right->getBasicType() == EbtBool)
+                right = createConversion(EbtInt, right);
             if (left == nullptr || right == nullptr)
                 return false;
             node.setLeft(left);
             node.setRight(right);
+
+            // Update the original base assumption on result type..
+            node.setType(left->getType());
+            node.getWritableType().getQualifier().clear();
+
             break;
 
         default:
@@ -2191,21 +3204,17 @@
     case EOpLogicalAnd:
     case EOpLogicalOr:
     case EOpLogicalXor:
-        if (getSource() == EShSourceHlsl) {
-            TIntermTyped* convertedL = convertToBasicType(op, EbtBool, left);
-            TIntermTyped* convertedR = convertToBasicType(op, EbtBool, right);
-            if (convertedL == nullptr || convertedR == nullptr)
+        // logical ops operate only on Booleans or vectors of Booleans.
+        if (left->getBasicType() != EbtBool || left->isMatrix())
                 return false;
-            node.setLeft(left = convertedL);   // also updates stack variable
-            node.setRight(right = convertedR); // also updates stack variable
-        } else {
+
+        if (getSource() == EShSourceGlsl) {
             // logical ops operate only on scalar Booleans and will promote to scalar Boolean.
-            if (left->getBasicType() != EbtBool || left->isVector() || left->isMatrix())
+            if (left->isVector())
                 return false;
         }
 
         node.setType(TType(EbtBool, EvqTemporary, left->getVectorSize()));
-
         break;
 
     case EOpRightShift:
@@ -2226,10 +3235,7 @@
             break;
 
         // Check for integer-only operands.
-        if ((left->getBasicType() != EbtInt &&  left->getBasicType() != EbtUint &&
-             left->getBasicType() != EbtInt64 &&  left->getBasicType() != EbtUint64) ||
-            (right->getBasicType() != EbtInt && right->getBasicType() != EbtUint &&
-             right->getBasicType() != EbtInt64 && right->getBasicType() != EbtUint64))
+        if (!isTypeInt(left->getBasicType()) && !isTypeInt(right->getBasicType()))
             return false;
         if (left->isMatrix() || right->isMatrix())
             return false;
@@ -2370,7 +3376,7 @@
                 node.setOp(op = EOpMatrixTimesScalarAssign);
             }
         } else if (left->isMatrix() && right->isMatrix()) {
-            if (left->getMatrixCols() != left->getMatrixRows() || left->getMatrixCols() != right->getMatrixCols() || left->getMatrixCols() != right->getMatrixRows())
+            if (left->getMatrixCols() != right->getMatrixCols() || left->getMatrixCols() != right->getMatrixRows())
                 return false;
             node.setOp(op = EOpMatrixTimesMatrixAssign);
         } else if (!left->isMatrix() && !right->isMatrix()) {
@@ -2530,11 +3536,7 @@
 
 void TIntermBinary::updatePrecision()
 {
-#ifdef AMD_EXTENSIONS
     if (getBasicType() == EbtInt || getBasicType() == EbtUint || getBasicType() == EbtFloat || getBasicType() == EbtFloat16) {
-#else
-    if (getBasicType() == EbtInt || getBasicType() == EbtUint || getBasicType() == EbtFloat) {
-#endif
         getQualifier().precision = std::max(right->getQualifier().precision, left->getQualifier().precision);
         if (getQualifier().precision != EpqNone) {
             left->propagatePrecision(getQualifier().precision);
@@ -2545,11 +3547,7 @@
 
 void TIntermTyped::propagatePrecision(TPrecisionQualifier newPrecision)
 {
-#ifdef AMD_EXTENSIONS
     if (getQualifier().precision != EpqNone || (getBasicType() != EbtInt && getBasicType() != EbtUint && getBasicType() != EbtFloat && getBasicType() != EbtFloat16))
-#else
-    if (getQualifier().precision != EpqNone || (getBasicType() != EbtInt && getBasicType() != EbtUint && getBasicType() != EbtFloat))
-#endif
         return;
 
     getQualifier().precision = newPrecision;
@@ -2624,9 +3622,7 @@
                 break;
             case EbtFloat:
             case EbtDouble:
-#ifdef AMD_EXTENSIONS
             case EbtFloat16:
-#endif
                 leftUnionArray[i] = rightUnionArray[i];
                 break;
             default:
@@ -2652,16 +3648,13 @@
                 break;
             case EbtFloat:
             case EbtDouble:
-#ifdef AMD_EXTENSIONS
             case EbtFloat16:
-#endif
                 leftUnionArray[i] = rightUnionArray[i];
                 break;
             default:
                 return node;
             }
             break;
-#ifdef AMD_EXTENSIONS
         case EbtFloat16:
             switch (node->getType().getBasicType()) {
             case EbtInt:
@@ -2688,7 +3681,6 @@
                 return node;
             }
             break;
-#endif
         case EbtInt:
             switch (node->getType().getBasicType()) {
             case EbtInt:
@@ -2708,9 +3700,7 @@
                 break;
             case EbtFloat:
             case EbtDouble:
-#ifdef AMD_EXTENSIONS
             case EbtFloat16:
-#endif
                 leftUnionArray[i].setIConst(static_cast<int>(rightUnionArray[i].getDConst()));
                 break;
             default:
@@ -2736,9 +3726,7 @@
                 break;
             case EbtFloat:
             case EbtDouble:
-#ifdef AMD_EXTENSIONS
             case EbtFloat16:
-#endif
                 leftUnionArray[i].setUConst(static_cast<unsigned int>(rightUnionArray[i].getDConst()));
                 break;
             default:
@@ -2764,9 +3752,7 @@
                 break;
             case EbtFloat:
             case EbtDouble:
-#ifdef AMD_EXTENSIONS
             case EbtFloat16:
-#endif
                 leftUnionArray[i].setBConst(rightUnionArray[i].getDConst() != 0.0);
                 break;
             default:
@@ -2792,9 +3778,7 @@
                 break;
             case EbtFloat:
             case EbtDouble:
-#ifdef AMD_EXTENSIONS
             case EbtFloat16:
-#endif
                 leftUnionArray[i].setI64Const(static_cast<long long>(rightUnionArray[i].getDConst()));
                 break;
             default:
@@ -2820,9 +3804,7 @@
                 break;
             case EbtFloat:
             case EbtDouble:
-#ifdef AMD_EXTENSIONS
             case EbtFloat16:
-#endif
                 leftUnionArray[i].setU64Const(static_cast<unsigned long long>(rightUnionArray[i].getDConst()));
                 break;
             default:
@@ -2840,10 +3822,10 @@
                             node->getLoc());
 }
 
-void TIntermAggregate::addToPragmaTable(const TPragmaTable& pTable)
+void TIntermAggregate::setPragmaTable(const TPragmaTable& pTable)
 {
-    assert(!pragmaTable);
-    pragmaTable = new TPragmaTable();
+    assert(pragmaTable == nullptr);
+    pragmaTable = new TPragmaTable;
     *pragmaTable = pTable;
 }
 
@@ -2856,4 +3838,72 @@
            (node2.getType().getQualifier().isSpecConstant() && node1.getType().getQualifier().isConstant());
 }
 
+struct TextureUpgradeAndSamplerRemovalTransform : public TIntermTraverser {
+    void visitSymbol(TIntermSymbol* symbol) override {
+        if (symbol->getBasicType() == EbtSampler && symbol->getType().getSampler().isTexture()) {
+            symbol->getWritableType().getSampler().combined = true;
+        }
+    }
+    bool visitAggregate(TVisit, TIntermAggregate* ag) override {
+        using namespace std;
+        TIntermSequence& seq = ag->getSequence();
+        TQualifierList& qual = ag->getQualifierList();
+
+        // qual and seq are indexed using the same indices, so we have to modify both in lock-step
+        assert(seq.size() == qual.size() || qual.empty());
+
+        size_t write = 0;
+        for (size_t i = 0; i < seq.size(); ++i) {
+            TIntermSymbol* symbol = seq[i]->getAsSymbolNode();
+            if (symbol && symbol->getBasicType() == EbtSampler && symbol->getType().getSampler().isPureSampler()) {
+                // remove pure sampler variables
+                continue;
+            }
+
+            TIntermNode* result = seq[i];
+
+            // replace constructors with sampler/textures
+            TIntermAggregate *constructor = seq[i]->getAsAggregate();
+            if (constructor && constructor->getOp() == EOpConstructTextureSampler) {
+                if (!constructor->getSequence().empty())
+                    result = constructor->getSequence()[0];
+            }
+
+            // write new node & qualifier
+            seq[write] = result;
+            if (!qual.empty())
+                qual[write] = qual[i];
+            write++;
+        }
+
+        seq.resize(write);
+        if (!qual.empty())
+            qual.resize(write);
+
+        return true;
+    }
+};
+
+void TIntermediate::performTextureUpgradeAndSamplerRemovalTransformation(TIntermNode* root)
+{
+    TextureUpgradeAndSamplerRemovalTransform transform;
+    root->traverse(&transform);
+}
+
+const char* TIntermediate::getResourceName(TResourceType res)
+{
+    switch (res) {
+    case EResSampler: return "shift-sampler-binding";
+    case EResTexture: return "shift-texture-binding";
+    case EResImage:   return "shift-image-binding";
+    case EResUbo:     return "shift-UBO-binding";
+    case EResSsbo:    return "shift-ssbo-binding";
+    case EResUav:     return "shift-uav-binding";
+    default:
+        assert(0); // internal error: should only be called with valid resource types.
+        return nullptr;
+    }
+}
+
+
 } // end namespace glslang
diff --git a/glslang/MachineIndependent/LiveTraverser.h b/glslang/MachineIndependent/LiveTraverser.h
index 029c24a..7333bc9 100644
--- a/glslang/MachineIndependent/LiveTraverser.h
+++ b/glslang/MachineIndependent/LiveTraverser.h
@@ -33,6 +33,8 @@
 // POSSIBILITY OF SUCH DAMAGE.
 //
 
+#pragma once
+
 #include "../Include/Common.h"
 #include "reflection.h"
 #include "localintermediate.h"
diff --git a/glslang/MachineIndependent/ParseContextBase.cpp b/glslang/MachineIndependent/ParseContextBase.cpp
index 44fc0b4..7a968ce 100644
--- a/glslang/MachineIndependent/ParseContextBase.cpp
+++ b/glslang/MachineIndependent/ParseContextBase.cpp
@@ -153,6 +153,12 @@
         if (node->getQualifier().readonly)
             message = "can't modify a readonly buffer";
         break;
+#ifdef NV_EXTENSIONS
+    case EvqHitAttrNV:
+        if (language != EShLangIntersectNV)
+            message = "cannot modify hitAttributeNV in this stage";
+        break;
+#endif
 
     default:
         //
@@ -168,6 +174,11 @@
         case EbtVoid:
             message = "can't modify void";
             break;
+#ifdef NV_EXTENSIONS
+        case EbtAccStructNV:
+            message = "can't modify accelerationStructureNV";
+            break;
+#endif
         default:
             break;
         }
@@ -228,12 +239,38 @@
 // must still be valid.
 // It is okay if the symbol's type will be subsequently edited;
 // the modifications will be tracked.
+// Order is preserved, to avoid creating novel forward references.
 void TParseContextBase::trackLinkage(TSymbol& symbol)
 {
     if (!parsingBuiltins)
         linkageSymbols.push_back(&symbol);
 }
 
+// Ensure index is in bounds, correct if necessary.
+// Give an error if not.
+void TParseContextBase::checkIndex(const TSourceLoc& loc, const TType& type, int& index)
+{
+    if (index < 0) {
+        error(loc, "", "[", "index out of range '%d'", index);
+        index = 0;
+    } else if (type.isArray()) {
+        if (type.isSizedArray() && index >= type.getOuterArraySize()) {
+            error(loc, "", "[", "array index out of range '%d'", index);
+            index = type.getOuterArraySize() - 1;
+        }
+    } else if (type.isVector()) {
+        if (index >= type.getVectorSize()) {
+            error(loc, "", "[", "vector index out of range '%d'", index);
+            index = type.getVectorSize() - 1;
+        }
+    } else if (type.isMatrix()) {
+        if (index >= type.getMatrixCols()) {
+            error(loc, "", "[", "matrix index out of range '%d'", index);
+            index = type.getMatrixCols() - 1;
+        }
+    }
+}
+
 // Make a shared symbol have a non-shared version that can be edited by the current
 // compile, such that editing its type will not change the shared version and will
 // effect all nodes already sharing it (non-shallow type),
@@ -544,6 +581,10 @@
         firstNewMember = 0;
     }
 
+    // Update with binding and set
+    globalUniformBlock->getWritableType().getQualifier().layoutBinding = globalUniformBinding;
+    globalUniformBlock->getWritableType().getQualifier().layoutSet = globalUniformSet;
+
     // Add the requested member as a member to the global block.
     TType* type = new TType;
     type->shallowCopy(memberType);
@@ -573,7 +614,7 @@
     if (parsingBuiltins)
         return;
 
-    // Transfer the linkage symbols to AST nodes
+    // Transfer the linkage symbols to AST nodes, preserving order.
     TIntermAggregate* linkage = new TIntermAggregate;
     for (auto i = linkageSymbols.begin(); i != linkageSymbols.end(); ++i)
         intermediate.addSymbolLinkageNode(linkage, **i);
diff --git a/glslang/MachineIndependent/ParseHelper.cpp b/glslang/MachineIndependent/ParseHelper.cpp
old mode 100644
new mode 100755
index b7240ea..b32315b
--- a/glslang/MachineIndependent/ParseHelper.cpp
+++ b/glslang/MachineIndependent/ParseHelper.cpp
@@ -2,6 +2,7 @@
 // Copyright (C) 2002-2005  3Dlabs Inc. Ltd.
 // Copyright (C) 2012-2015 LunarG, Inc.
 // Copyright (C) 2015-2016 Google, Inc.
+// Copyright (C) 2017 ARM Limited.
 //
 // All rights reserved.
 //
@@ -49,10 +50,12 @@
 
 TParseContext::TParseContext(TSymbolTable& symbolTable, TIntermediate& interm, bool parsingBuiltins,
                              int version, EProfile profile, const SpvVersion& spvVersion, EShLanguage language,
-                             TInfoSink& infoSink, bool forwardCompatible, EShMessages messages) :
-            TParseContextBase(symbolTable, interm, parsingBuiltins, version, profile, spvVersion, language, infoSink, forwardCompatible, messages),
-            contextPragma(true, false), loopNestingLevel(0), structNestingLevel(0), controlFlowNestingLevel(0), statementNestingLevel(0),
-            inMain(false), postMainReturn(false), currentFunctionType(nullptr), blockName(nullptr),
+                             TInfoSink& infoSink, bool forwardCompatible, EShMessages messages,
+                             const TString* entryPoint) :
+            TParseContextBase(symbolTable, interm, parsingBuiltins, version, profile, spvVersion, language,
+                              infoSink, forwardCompatible, messages, entryPoint),
+            inMain(false),
+            blockName(nullptr),
             limits(resources.limits),
             atomicUintOffsets(nullptr), anyIndexLimits(false)
 {
@@ -73,6 +76,10 @@
     globalBufferDefaults.layoutMatrix = ElmColumnMajor;
     globalBufferDefaults.layoutPacking = spvVersion.spv != 0 ? ElpStd430 : ElpShared;
 
+    // use storage buffer on SPIR-V 1.3 and up
+    if (spvVersion.spv >= EShTargetSpv_1_3)
+        intermediate.setUseStorageBuffer();
+
     globalInputDefaults.clear();
     globalOutputDefaults.clear();
 
@@ -87,6 +94,9 @@
 
     if (language == EShLangGeometry)
         globalOutputDefaults.layoutStream = 0;
+
+    if (entryPoint != nullptr && entryPoint->size() > 0 && *entryPoint != "main")
+        infoSink.info.message(EPrefixError, "Source entry point must be \"main\"");
 }
 
 TParseContext::~TParseContext()
@@ -121,11 +131,6 @@
             sampler.set(EbtFloat, Esd2D);
             sampler.external = true;
             defaultSamplerPrecision[computeSamplerTypeIndex(sampler)] = EpqLow;
-        } else {
-            // Non-ES profile
-            // All default to highp.
-            for (int type = 0; type < maxSamplerIndex; ++type)
-                defaultSamplerPrecision[type] = EpqHigh;
         }
 
         // If we are parsing built-in computational variables/functions, it is meaningful to record
@@ -141,6 +146,13 @@
                 defaultPrecision[EbtUint] = EpqHigh;
                 defaultPrecision[EbtFloat] = EpqHigh;
             }
+
+            if (profile != EEsProfile) {
+                // Non-ES profile
+                // All sampler precisions default to highp.
+                for (int type = 0; type < maxSamplerIndex; ++type)
+                    defaultSamplerPrecision[type] = EpqHigh;
+            }
         }
 
         defaultPrecision[EbtSampler] = EpqLow;
@@ -259,7 +271,14 @@
         if (tokens.size() != 1)
             error(loc, "extra tokens", "#pragma", "");
         intermediate.setUseStorageBuffer();
-    }
+    } else if (spvVersion.spv > 0 && tokens[0].compare("use_vulkan_memory_model") == 0) {
+        if (tokens.size() != 1)
+            error(loc, "extra tokens", "#pragma", "");
+        intermediate.setUseVulkanMemoryModel();
+    } else if (tokens[0].compare("once") == 0) {
+        warn(loc, "not implemented", "#pragma once", "");
+    } else if (tokens[0].compare("glslang_binary_double_output") == 0)
+        intermediate.setBinaryDoubleOutput();
 }
 
 //
@@ -274,17 +293,17 @@
         requireExtensions(loc, symbol->getNumExtensions(), symbol->getExtensions(), symbol->getName().c_str());
 
     if (symbol && symbol->isReadOnly()) {
-        // All shared things containing an implicitly sized array must be copied up
+        // All shared things containing an unsized array must be copied up
         // on first use, so that all future references will share its array structure,
         // so that editing the implicit size will effect all nodes consuming it,
         // and so that editing the implicit size won't change the shared one.
         //
         // If this is a variable or a block, check it and all it contains, but if this
         // is a member of an anonymous block, check the whole block, as the whole block
-        // will need to be copied up if it contains an implicitly-sized array.
-        if (symbol->getType().containsImplicitlySizedArray() ||
+        // will need to be copied up if it contains an unsized array.
+        if (symbol->getType().containsUnsizedArray() ||
             (symbol->getAsAnonMember() &&
-             symbol->getAsAnonMember()->getAnonContainer().getType().containsImplicitlySizedArray()))
+             symbol->getAsAnonMember()->getAnonContainer().getType().containsUnsizedArray()))
             makeEditable(symbol);
     }
 
@@ -343,109 +362,121 @@
 //
 TIntermTyped* TParseContext::handleBracketDereference(const TSourceLoc& loc, TIntermTyped* base, TIntermTyped* index)
 {
-    TIntermTyped* result = nullptr;
-
     int indexValue = 0;
     if (index->getQualifier().isFrontEndConstant())
         indexValue = index->getAsConstantUnion()->getConstArray()[0].getIConst();
 
+    // basic type checks...
     variableCheck(base);
+
     if (! base->isArray() && ! base->isMatrix() && ! base->isVector()) {
         if (base->getAsSymbolNode())
             error(loc, " left of '[' is not of type array, matrix, or vector ", base->getAsSymbolNode()->getName().c_str(), "");
         else
             error(loc, " left of '[' is not of type array, matrix, or vector ", "expression", "");
-    } else if (base->getType().getQualifier().isFrontEndConstant() && index->getQualifier().isFrontEndConstant()) {
+
+        // Insert dummy error-recovery result
+        return intermediate.addConstantUnion(0.0, EbtFloat, loc);
+    }
+
+    if (!base->isArray() && base->isVector()) {
+        if (base->getType().containsBasicType(EbtFloat16))
+            requireFloat16Arithmetic(loc, "[", "does not operate on types containing float16");
+        if (base->getType().contains16BitInt())
+            requireInt16Arithmetic(loc, "[", "does not operate on types containing (u)int16");
+        if (base->getType().contains8BitInt())
+            requireInt8Arithmetic(loc, "[", "does not operate on types containing (u)int8");
+    }
+
+    // check for constant folding
+    if (base->getType().getQualifier().isFrontEndConstant() && index->getQualifier().isFrontEndConstant()) {
         // both base and index are front-end constants
         checkIndex(loc, base->getType(), indexValue);
         return intermediate.foldDereference(base, indexValue, loc);
-    } else {
-        // at least one of base and index is not a front-end constant variable...
+    }
 
-        if (base->getAsSymbolNode() && isIoResizeArray(base->getType()))
-            handleIoResizeArrayAccess(loc, base);
+    // at least one of base and index is not a front-end constant variable...
+    TIntermTyped* result = nullptr;
+    if (index->getQualifier().isFrontEndConstant())
+        checkIndex(loc, base->getType(), indexValue);
 
-        if (index->getQualifier().isFrontEndConstant()) {
-            if (base->getType().isImplicitlySizedArray())
-                updateImplicitArraySize(loc, base, indexValue);
-            else
-                checkIndex(loc, base->getType(), indexValue);
-            result = intermediate.addIndex(EOpIndexDirect, base, index, loc);
-        } else {
-            if (base->getType().isImplicitlySizedArray()) {
-                if (base->getAsSymbolNode() && isIoResizeArray(base->getType()))
-                    error(loc, "", "[", "array must be sized by a redeclaration or layout qualifier before being indexed with a variable");
-                else
-                    error(loc, "", "[", "array must be redeclared with a size before being indexed with a variable");
-            }
-            if (base->getBasicType() == EbtBlock) {
-                if (base->getQualifier().storage == EvqBuffer)
-                    requireProfile(base->getLoc(), ~EEsProfile, "variable indexing buffer block array");
-                else if (base->getQualifier().storage == EvqUniform)
-                    profileRequires(base->getLoc(), EEsProfile, 0, Num_AEP_gpu_shader5, AEP_gpu_shader5, "variable indexing uniform block array");
-                else {
-                    // input/output blocks either don't exist or can be variable indexed
+    if (base->getAsSymbolNode() && isIoResizeArray(base->getType()))
+        handleIoResizeArrayAccess(loc, base);
+
+    if (index->getQualifier().isFrontEndConstant()) {
+        if (base->getType().isUnsizedArray()) {
+            base->getWritableType().updateImplicitArraySize(indexValue + 1);
+#ifdef NV_EXTENSIONS
+            // For 2D per-view builtin arrays, update the inner dimension size in parent type
+            if (base->getQualifier().isPerView() && base->getQualifier().builtIn != EbvNone) {
+                TIntermBinary* binaryNode = base->getAsBinaryNode();
+                if (binaryNode) {
+                    TType& leftType = binaryNode->getLeft()->getWritableType();
+                    TArraySizes& arraySizes = *leftType.getArraySizes();
+                    assert(arraySizes.getNumDims() == 2);
+                    arraySizes.setDimSize(1, std::max(arraySizes.getDimSize(1), indexValue + 1));
                 }
-            } else if (language == EShLangFragment && base->getQualifier().isPipeOutput())
-                requireProfile(base->getLoc(), ~EEsProfile, "variable indexing fragment shader output array");
-            else if (base->getBasicType() == EbtSampler && version >= 130) {
-                const char* explanation = "variable indexing sampler array";
-                requireProfile(base->getLoc(), EEsProfile | ECoreProfile | ECompatibilityProfile, explanation);
-                profileRequires(base->getLoc(), EEsProfile, 0, Num_AEP_gpu_shader5, AEP_gpu_shader5, explanation);
-                profileRequires(base->getLoc(), ECoreProfile | ECompatibilityProfile, 400, nullptr, explanation);
             }
-
-            result = intermediate.addIndex(EOpIndexIndirect, base, index, loc);
-        }
-    }
-
-    if (result == nullptr) {
-        // Insert dummy error-recovery result
-        result = intermediate.addConstantUnion(0.0, EbtFloat, loc);
+#endif
+        } else
+            checkIndex(loc, base->getType(), indexValue);
+        result = intermediate.addIndex(EOpIndexDirect, base, index, loc);
     } else {
-        // Insert valid dereferenced result
-        TType newType(base->getType(), 0);  // dereferenced type
-        if (base->getType().getQualifier().isConstant() && index->getQualifier().isConstant()) {
-            newType.getQualifier().storage = EvqConst;
-            // If base or index is a specialization constant, the result should also be a specialization constant.
-            if (base->getType().getQualifier().isSpecConstant() || index->getQualifier().isSpecConstant()) {
-                newType.getQualifier().makeSpecConstant();
+        if (base->getType().isUnsizedArray()) {
+            // we have a variable index into an unsized array, which is okay,
+            // depending on the situation
+            if (base->getAsSymbolNode() && isIoResizeArray(base->getType()))
+                error(loc, "", "[", "array must be sized by a redeclaration or layout qualifier before being indexed with a variable");
+            else {
+                // it is okay for a run-time sized array
+                checkRuntimeSizable(loc, *base);
             }
-        } else {
-            newType.getQualifier().makePartialTemporary();
+            base->getWritableType().setArrayVariablyIndexed();
         }
-        result->setType(newType);
+        if (base->getBasicType() == EbtBlock) {
+            if (base->getQualifier().storage == EvqBuffer)
+                requireProfile(base->getLoc(), ~EEsProfile, "variable indexing buffer block array");
+            else if (base->getQualifier().storage == EvqUniform)
+                profileRequires(base->getLoc(), EEsProfile, 320, Num_AEP_gpu_shader5, AEP_gpu_shader5,
+                                "variable indexing uniform block array");
+            else {
+                // input/output blocks either don't exist or can be variable indexed
+            }
+        } else if (language == EShLangFragment && base->getQualifier().isPipeOutput())
+            requireProfile(base->getLoc(), ~EEsProfile, "variable indexing fragment shader output array");
+        else if (base->getBasicType() == EbtSampler && version >= 130) {
+            const char* explanation = "variable indexing sampler array";
+            requireProfile(base->getLoc(), EEsProfile | ECoreProfile | ECompatibilityProfile, explanation);
+            profileRequires(base->getLoc(), EEsProfile, 320, Num_AEP_gpu_shader5, AEP_gpu_shader5, explanation);
+            profileRequires(base->getLoc(), ECoreProfile | ECompatibilityProfile, 400, nullptr, explanation);
+        }
 
-        if (anyIndexLimits)
-            handleIndexLimits(loc, base, index);
+        result = intermediate.addIndex(EOpIndexIndirect, base, index, loc);
     }
 
+    // Insert valid dereferenced result
+    TType newType(base->getType(), 0);  // dereferenced type
+    if (base->getType().getQualifier().isConstant() && index->getQualifier().isConstant()) {
+        newType.getQualifier().storage = EvqConst;
+        // If base or index is a specialization constant, the result should also be a specialization constant.
+        if (base->getType().getQualifier().isSpecConstant() || index->getQualifier().isSpecConstant()) {
+            newType.getQualifier().makeSpecConstant();
+        }
+    } else {
+        newType.getQualifier().makePartialTemporary();
+    }
+    result->setType(newType);
+
+    // Propagate nonuniform
+    if (base->getQualifier().isNonUniform() || index->getQualifier().isNonUniform())
+        result->getWritableType().getQualifier().nonUniform = true;
+
+    if (anyIndexLimits)
+        handleIndexLimits(loc, base, index);
+
     return result;
 }
 
-void TParseContext::checkIndex(const TSourceLoc& loc, const TType& type, int& index)
-{
-    if (index < 0) {
-        error(loc, "", "[", "index out of range '%d'", index);
-        index = 0;
-    } else if (type.isArray()) {
-        if (type.isExplicitlySizedArray() && index >= type.getOuterArraySize()) {
-            error(loc, "", "[", "array index out of range '%d'", index);
-            index = type.getOuterArraySize() - 1;
-        }
-    } else if (type.isVector()) {
-        if (index >= type.getVectorSize()) {
-            error(loc, "", "[", "vector index out of range '%d'", index);
-            index = type.getVectorSize() - 1;
-        }
-    } else if (type.isMatrix()) {
-        if (index >= type.getMatrixCols()) {
-            error(loc, "", "[", "matrix index out of range '%d'", index);
-            index = type.getMatrixCols() - 1;
-        }
-    }
-}
-
 // for ES 2.0 (version 100) limitations for almost all index operations except vertex-shader uniforms
 void TParseContext::handleIndexLimits(const TSourceLoc& /*loc*/, TIntermTyped* base, TIntermTyped* index)
 {
@@ -476,12 +507,20 @@
         ioArraySymbolResizeList.push_back(symbol);
 }
 
-// Return true if this is a geometry shader input array or tessellation control output array.
+// Return true if this is a geometry shader input array or tessellation control output array
+// or mesh shader output array.
 bool TParseContext::isIoResizeArray(const TType& type) const
 {
     return type.isArray() &&
            ((language == EShLangGeometry    && type.getQualifier().storage == EvqVaryingIn) ||
-            (language == EShLangTessControl && type.getQualifier().storage == EvqVaryingOut && ! type.getQualifier().patch));
+            (language == EShLangTessControl && type.getQualifier().storage == EvqVaryingOut && ! type.getQualifier().patch)
+#ifdef NV_EXTENSIONS
+            ||
+            (language == EShLangFragment && type.getQualifier().storage == EvqVaryingIn &&  type.getQualifier().pervertexNV) ||
+            (language == EShLangMeshNV && type.getQualifier().storage == EvqVaryingOut && !type.getQualifier().perTaskNV)
+
+#endif
+            );
 }
 
 // If an array is not isIoResizeArray() but is an io array, make sure it has the right size
@@ -497,7 +536,7 @@
 
     if (language == EShLangTessControl || language == EShLangTessEvaluation) {
         if (type.getOuterArraySize() != resources.maxPatchVertices) {
-            if (type.isExplicitlySizedArray())
+            if (type.isSizedArray())
                 error(loc, "tessellation input array size must be gl_MaxPatchVertices or implicitly sized", "[]", "");
             type.changeOuterArraySize(resources.maxPatchVertices);
         }
@@ -530,8 +569,8 @@
         return;
 
     // fix array size, if it can be fixed and needs to be fixed (will allow variable indexing)
-    if (symbolNode->getType().isImplicitlySizedArray()) {
-        int newSize = getIoArrayImplicitSize();
+    if (symbolNode->getType().isUnsizedArray()) {
+        int newSize = getIoArrayImplicitSize(symbolNode->getType().getQualifier().isPerPrimitive());
         if (newSize > 0)
             symbolNode->getWritableType().changeOuterArraySize(newSize);
     }
@@ -545,17 +584,27 @@
 // Types without an array size will be given one.
 // Types already having a size that is wrong will get an error.
 //
-void TParseContext::checkIoArraysConsistency(const TSourceLoc& loc, bool tailOnly)
+void TParseContext::checkIoArraysConsistency(const TSourceLoc& loc, bool tailOnly, bool isPerPrimitive)
 {
-    int requiredSize = getIoArrayImplicitSize();
+    int requiredSize = getIoArrayImplicitSize(isPerPrimitive);
     if (requiredSize == 0)
         return;
 
     const char* feature;
     if (language == EShLangGeometry)
         feature = TQualifier::getGeometryString(intermediate.getInputPrimitive());
-    else if (language == EShLangTessControl)
+    else if (language == EShLangTessControl
+#ifdef NV_EXTENSIONS
+          || language == EShLangFragment
+#endif
+        )
+
         feature = "vertices";
+#ifdef NV_EXTENSIONS
+     else if (language == EShLangMeshNV) {
+        feature = isPerPrimitive ? "max_primitives" : "max_vertices";
+     }
+#endif
     else
         feature = "unknown";
 
@@ -568,25 +617,45 @@
         checkIoArrayConsistency(loc, requiredSize, feature, ioArraySymbolResizeList[i]->getWritableType(), ioArraySymbolResizeList[i]->getName());
 }
 
-int TParseContext::getIoArrayImplicitSize() const
+int TParseContext::getIoArrayImplicitSize(bool isPerPrimitive) const
 {
     if (language == EShLangGeometry)
         return TQualifier::mapGeometryToSize(intermediate.getInputPrimitive());
     else if (language == EShLangTessControl)
         return intermediate.getVertices() != TQualifier::layoutNotSet ? intermediate.getVertices() : 0;
+#ifdef NV_EXTENSIONS
+    else if (language == EShLangFragment)
+        return 3; //Number of vertices for Fragment shader is always three.
+    else if (language == EShLangMeshNV) {
+        if (isPerPrimitive) {
+            return intermediate.getPrimitives() != TQualifier::layoutNotSet ? intermediate.getPrimitives() : 0;
+        } else {
+            return intermediate.getVertices() != TQualifier::layoutNotSet ? intermediate.getVertices() : 0;
+        }
+    }
+#endif
+
     else
         return 0;
 }
 
 void TParseContext::checkIoArrayConsistency(const TSourceLoc& loc, int requiredSize, const char* feature, TType& type, const TString& name)
 {
-    if (type.isImplicitlySizedArray())
+    if (type.isUnsizedArray())
         type.changeOuterArraySize(requiredSize);
     else if (type.getOuterArraySize() != requiredSize) {
         if (language == EShLangGeometry)
             error(loc, "inconsistent input primitive for array size of", feature, name.c_str());
         else if (language == EShLangTessControl)
             error(loc, "inconsistent output number of vertices for array size of", feature, name.c_str());
+#ifdef NV_EXTENSIONS
+        else if (language == EShLangFragment) {
+            if (type.getOuterArraySize() > requiredSize)
+                error(loc, " cannot be greater than 3 for pervertexNV", feature, name.c_str());
+        }
+        else if (language == EShLangMeshNV)
+            error(loc, "inconsistent output array size of", feature, name.c_str());
+#endif
         else
             assert(0);
     }
@@ -614,6 +683,12 @@
         break;
     }
 
+    if (((left->getType().containsBasicType(EbtFloat16) || right->getType().containsBasicType(EbtFloat16)) && !float16Arithmetic()) ||
+        ((left->getType().contains16BitInt() || right->getType().contains16BitInt()) && !int16Arithmetic()) ||
+        ((left->getType().contains8BitInt() || right->getType().contains8BitInt()) && !int8Arithmetic())) {
+        allowed = false;
+    }
+
     TIntermTyped* result = nullptr;
     if (allowed)
         result = intermediate.addBinaryMath(op, left, right, loc);
@@ -629,7 +704,17 @@
 {
     rValueErrorCheck(loc, str, childNode);
 
-    TIntermTyped* result = intermediate.addUnaryMath(op, childNode, loc);
+    bool allowed = true;
+    if ((childNode->getType().containsBasicType(EbtFloat16) && !float16Arithmetic()) ||
+        (childNode->getType().contains16BitInt() && !int16Arithmetic()) ||
+        (childNode->getType().contains8BitInt() && !int8Arithmetic())) {
+        allowed = false;
+    }
+
+    TIntermTyped* result = nullptr;
+    
+    if (allowed)
+        result = intermediate.addUnaryMath(op, childNode, loc);
 
     if (result)
         return result;
@@ -680,7 +765,8 @@
     // leaving swizzles and struct/block dereferences.
 
     TIntermTyped* result = base;
-    if (base->isVector() || base->isScalar()) {
+    if ((base->isVector() || base->isScalar()) &&
+        (base->isFloatingDomain() || base->isIntegerDomain() || base->getBasicType() == EbtBool)) {
         if (base->isScalar()) {
             const char* dotFeature = "scalar swizzle";
             requireProfile(loc, ~EEsProfile, dotFeature);
@@ -690,6 +776,13 @@
         TSwizzleSelectors<TVectorSelector> selectors;
         parseSwizzleSelector(loc, field, base->getVectorSize(), selectors);
 
+        if (base->isVector() && selectors.size() != 1 && base->getType().containsBasicType(EbtFloat16))
+            requireFloat16Arithmetic(loc, ".", "can't swizzle types containing float16");
+        if (base->isVector() && selectors.size() != 1 && base->getType().contains16BitInt())
+            requireInt16Arithmetic(loc, ".", "can't swizzle types containing (u)int16");
+        if (base->isVector() && selectors.size() != 1 && base->getType().contains8BitInt())
+            requireInt8Arithmetic(loc, ".", "can't swizzle types containing (u)int8");
+
         if (base->isScalar()) {
             if (selectors.size() == 1)
                 return result;
@@ -736,6 +829,8 @@
                 TIntermTyped* index = intermediate.addConstantUnion(member, loc);
                 result = intermediate.addIndex(EOpIndexDirectStruct, base, index, loc);
                 result->setType(*(*fields)[member].type);
+                if ((*fields)[member].type->getQualifier().isIo())
+                    intermediate.addIoAccessed(field);
             }
         } else
             error(loc, "no such field in structure", field.c_str(), "");
@@ -746,6 +841,10 @@
     if (base->getQualifier().noContraction)
         result->getWritableType().getQualifier().noContraction = true;
 
+    // Propagate nonuniform
+    if (base->getQualifier().isNonUniform())
+        result->getWritableType().getQualifier().nonUniform = true;
+
     return result;
 }
 
@@ -790,7 +889,7 @@
         if (prevDec->isPrototyped() && prototype)
             profileRequires(loc, EEsProfile, 300, nullptr, "multiple prototypes for same function");
         if (prevDec->getType() != function.getType())
-            error(loc, "overloaded functions must have the same return type", function.getType().getBasicTypeString().c_str(), "");
+            error(loc, "overloaded functions must have the same return type", function.getName().c_str(), "");
         for (int i = 0; i < prevDec->getParamCount(); ++i) {
             if ((*prevDec)[i].type->getQualifier().storage != function[i].type->getQualifier().storage)
                 error(loc, "overloaded functions must have the same parameter storage qualifiers for argument", function[i].type->getStorageQualifierString(), "%d", i+1);
@@ -912,7 +1011,7 @@
     loopNestingLevel = 0;
     statementNestingLevel = 0;
     controlFlowNestingLevel = 0;
-    postMainReturn = false;
+    postEntryPointReturn = false;
 
     return paramNodes;
 }
@@ -964,7 +1063,14 @@
             if (builtIn && fnCandidate->getNumExtensions())
                 requireExtensions(loc, fnCandidate->getNumExtensions(), fnCandidate->getExtensions(), fnCandidate->getName().c_str());
 
-            if (arguments) {
+            if (builtIn && fnCandidate->getType().containsBasicType(EbtFloat16))
+                requireFloat16Arithmetic(loc, "built-in function", "float16 types can only be in uniform block or buffer storage");
+            if (builtIn && fnCandidate->getType().contains16BitInt())
+                requireInt16Arithmetic(loc, "built-in function", "(u)int16 types can only be in uniform block or buffer storage");
+            if (builtIn && fnCandidate->getType().contains8BitInt())
+                requireInt8Arithmetic(loc, "built-in function", "(u)int8 types can only be in uniform block or buffer storage");
+
+            if (arguments != nullptr) {
                 // Make sure qualifications work for these arguments.
                 TIntermAggregate* aggregate = arguments->getAsAggregate();
                 for (int i = 0; i < fnCandidate->getParamCount(); ++i) {
@@ -982,13 +1088,29 @@
                         const char* message = "argument cannot drop memory qualifier when passed to formal parameter";
                         if (argQualifier.volatil && ! formalQualifier.volatil)
                             error(arguments->getLoc(), message, "volatile", "");
-                        if (argQualifier.coherent && ! formalQualifier.coherent)
+                        if (argQualifier.coherent && ! (formalQualifier.devicecoherent || formalQualifier.coherent))
                             error(arguments->getLoc(), message, "coherent", "");
+                        if (argQualifier.devicecoherent && ! (formalQualifier.devicecoherent || formalQualifier.coherent))
+                            error(arguments->getLoc(), message, "devicecoherent", "");
+                        if (argQualifier.queuefamilycoherent && ! (formalQualifier.queuefamilycoherent || formalQualifier.devicecoherent || formalQualifier.coherent))
+                            error(arguments->getLoc(), message, "queuefamilycoherent", "");
+                        if (argQualifier.workgroupcoherent && ! (formalQualifier.workgroupcoherent || formalQualifier.queuefamilycoherent || formalQualifier.devicecoherent || formalQualifier.coherent))
+                            error(arguments->getLoc(), message, "workgroupcoherent", "");
+                        if (argQualifier.subgroupcoherent && ! (formalQualifier.subgroupcoherent || formalQualifier.workgroupcoherent || formalQualifier.queuefamilycoherent || formalQualifier.devicecoherent || formalQualifier.coherent))
+                            error(arguments->getLoc(), message, "subgroupcoherent", "");
                         if (argQualifier.readonly && ! formalQualifier.readonly)
                             error(arguments->getLoc(), message, "readonly", "");
                         if (argQualifier.writeonly && ! formalQualifier.writeonly)
                             error(arguments->getLoc(), message, "writeonly", "");
                     }
+
+                    if (builtIn && arg->getAsTyped()->getType().containsBasicType(EbtFloat16))
+                        requireFloat16Arithmetic(arguments->getLoc(), "built-in function", "float16 types can only be in uniform block or buffer storage");
+                    if (builtIn && arg->getAsTyped()->getType().contains16BitInt())
+                        requireInt16Arithmetic(arguments->getLoc(), "built-in function", "(u)int16 types can only be in uniform block or buffer storage");
+                    if (builtIn && arg->getAsTyped()->getType().contains8BitInt())
+                        requireInt8Arithmetic(arguments->getLoc(), "built-in function", "(u)int8 types can only be in uniform block or buffer storage");
+
                     // TODO 4.5 functionality:  A shader will fail to compile
                     // if the value passed to the memargument of an atomic memory function does not correspond to a buffer or
                     // shared variable. It is acceptable to pass an element of an array or a single component of a vector to the
@@ -1002,7 +1124,7 @@
 
             if (builtIn && fnCandidate->getBuiltInOp() != EOpNull) {
                 // A function call mapped to a built-in operation.
-                result = handleBuiltInFunctionCall(loc, *arguments, *fnCandidate);
+                result = handleBuiltInFunctionCall(loc, arguments, *fnCandidate);
             } else {
                 // This is a function call not mapped to built-in operator.
                 // It could still be a built-in function, but only if PureOperatorBuiltins == false.
@@ -1050,20 +1172,24 @@
     return result;
 }
 
-TIntermTyped* TParseContext::handleBuiltInFunctionCall(TSourceLoc loc, TIntermNode& arguments,
+TIntermTyped* TParseContext::handleBuiltInFunctionCall(TSourceLoc loc, TIntermNode* arguments,
                                                        const TFunction& function)
 {
     checkLocation(loc, function.getBuiltInOp());
     TIntermTyped *result = intermediate.addBuiltInFunctionCall(loc, function.getBuiltInOp(),
                                                                function.getParamCount() == 1,
-                                                               &arguments, function.getType());
+                                                               arguments, function.getType());
     if (obeyPrecisionQualifiers())
         computeBuiltinPrecisions(*result, function);
 
-    if (result == nullptr)  {
-        error(arguments.getLoc(), " wrong operand type", "Internal Error",
-                                  "built in unary operator function.  Type: %s",
-                                  static_cast<TIntermTyped*>(&arguments)->getCompleteString().c_str());
+    if (result == nullptr) {
+        if (arguments == nullptr)
+            error(loc, " wrong operand type", "Internal Error",
+                                      "built in unary operator function.  Type: %s", "");
+        else
+            error(arguments->getLoc(), " wrong operand type", "Internal Error",
+                                      "built in unary operator function.  Type: %s",
+                                      static_cast<TIntermTyped*>(arguments)->getCompleteString().c_str());
     } else if (result->getAsOperator())
         builtInOpCheck(loc, function, *result->getAsOperator());
 
@@ -1142,7 +1268,13 @@
             operationPrecision = std::max(operationPrecision, function[arg].type->getQualifier().precision);
         }
         // compute the result precision
+#ifdef AMD_EXTENSIONS
+        if (agg->isSampling() ||
+            agg->getOp() == EOpImageLoad || agg->getOp() == EOpImageStore ||
+            agg->getOp() == EOpImageLoadLod || agg->getOp() == EOpImageStoreLod)
+#else
         if (agg->isSampling() || agg->getOp() == EOpImageLoad || agg->getOp() == EOpImageStore)
+#endif
             resultPrecision = sequence[0]->getAsTyped()->getQualifier().precision;
         else if (function.getType().getBasicType() != EbtBool)
             resultPrecision = function.getType().getQualifier().precision == EpqNone ?
@@ -1163,6 +1295,8 @@
 
 TIntermNode* TParseContext::handleReturnValue(const TSourceLoc& loc, TIntermTyped* value)
 {
+    storage16BitAssignmentCheck(loc, value->getType(), "return");
+
     functionReturnsValue = true;
     if (currentFunctionType->getBasicType() == EbtVoid) {
         error(loc, "void function cannot return a value", "return", "");
@@ -1193,7 +1327,7 @@
                 error(loc, "tessellation control barrier() cannot be placed within flow control", "", "");
             if (! inMain)
                 error(loc, "tessellation control barrier() must be in main()", "", "");
-            else if (postMainReturn)
+            else if (postEntryPointReturn)
                 error(loc, "tessellation control barrier() cannot be placed after a return from main()", "", "");
         }
         break;
@@ -1216,23 +1350,30 @@
     else {
         const TType& type = intermNode->getAsTyped()->getType();
         if (type.isArray()) {
-            if (type.isRuntimeSizedArray()) {
-                // Create a unary op and let the back end handle it
-                return intermediate.addBuiltInFunctionCall(loc, EOpArrayLength, true, intermNode, TType(EbtInt));
-            } else if (type.isImplicitlySizedArray()) {
+            if (type.isUnsizedArray()) {
                 if (intermNode->getAsSymbolNode() && isIoResizeArray(type)) {
                     // We could be between a layout declaration that gives a built-in io array implicit size and
                     // a user redeclaration of that array, meaning we have to substitute its implicit size here
                     // without actually redeclaring the array.  (It is an error to use a member before the
                     // redeclaration, but not an error to use the array name itself.)
                     const TString& name = intermNode->getAsSymbolNode()->getName();
-                    if (name == "gl_in" || name == "gl_out")
-                        length = getIoArrayImplicitSize();
+                    if (name == "gl_in" || name == "gl_out"
+#ifdef NV_EXTENSIONS
+                        || name == "gl_MeshVerticesNV"
+                        || name == "gl_MeshPrimitivesNV"
+#endif
+                        )
+                    {
+                        length = getIoArrayImplicitSize(type.getQualifier().isPerPrimitive());
+                    }
                 }
                 if (length == 0) {
                     if (intermNode->getAsSymbolNode() && isIoResizeArray(type))
                         error(loc, "", function->getName().c_str(), "array must first be sized by a redeclaration or layout qualifier");
-                    else
+                    else if (isRuntimeLength(*intermNode->getAsTyped())) {
+                        // Create a unary op and let the back end handle it
+                        return intermediate.addBuiltInFunctionCall(loc, EOpArrayLength, true, intermNode, TType(EbtInt));
+                    } else
                         error(loc, "", function->getName().c_str(), "array must be declared with a size before using this method");
                 }
             } else if (type.getOuterArrayNode()) {
@@ -1362,6 +1503,161 @@
     return conversionTree;
 }
 
+void TParseContext::memorySemanticsCheck(const TSourceLoc& loc, const TFunction& fnCandidate, const TIntermOperator& callNode)
+{
+    const TIntermSequence* argp = &callNode.getAsAggregate()->getSequence();
+
+    //const int gl_SemanticsRelaxed         = 0x0;
+    const int gl_SemanticsAcquire         = 0x2;
+    const int gl_SemanticsRelease         = 0x4;
+    const int gl_SemanticsAcquireRelease  = 0x8;
+    const int gl_SemanticsMakeAvailable   = 0x2000;
+    const int gl_SemanticsMakeVisible     = 0x4000;
+
+    //const int gl_StorageSemanticsNone     = 0x0;
+    const int gl_StorageSemanticsBuffer   = 0x40;
+    const int gl_StorageSemanticsShared   = 0x100;
+    const int gl_StorageSemanticsImage    = 0x800;
+    const int gl_StorageSemanticsOutput   = 0x1000;
+
+
+    unsigned int semantics = 0, storageClassSemantics = 0;
+    unsigned int semantics2 = 0, storageClassSemantics2 = 0;
+
+    // Grab the semantics and storage class semantics from the operands, based on opcode
+    switch (callNode.getOp()) {
+    case EOpAtomicAdd:
+    case EOpAtomicMin:
+    case EOpAtomicMax:
+    case EOpAtomicAnd:
+    case EOpAtomicOr:
+    case EOpAtomicXor:
+    case EOpAtomicExchange:
+    case EOpAtomicStore:
+        storageClassSemantics = (*argp)[3]->getAsConstantUnion()->getConstArray()[0].getIConst();
+        semantics = (*argp)[4]->getAsConstantUnion()->getConstArray()[0].getIConst();
+        break;
+    case EOpAtomicLoad:
+        storageClassSemantics = (*argp)[2]->getAsConstantUnion()->getConstArray()[0].getIConst();
+        semantics = (*argp)[3]->getAsConstantUnion()->getConstArray()[0].getIConst();
+        break;
+    case EOpAtomicCompSwap:
+        storageClassSemantics = (*argp)[4]->getAsConstantUnion()->getConstArray()[0].getIConst();
+        semantics = (*argp)[5]->getAsConstantUnion()->getConstArray()[0].getIConst();
+        storageClassSemantics2 = (*argp)[6]->getAsConstantUnion()->getConstArray()[0].getIConst();
+        semantics2 = (*argp)[7]->getAsConstantUnion()->getConstArray()[0].getIConst();
+        break;
+
+    case EOpImageAtomicAdd:
+    case EOpImageAtomicMin:
+    case EOpImageAtomicMax:
+    case EOpImageAtomicAnd:
+    case EOpImageAtomicOr:
+    case EOpImageAtomicXor:
+    case EOpImageAtomicExchange:
+    case EOpImageAtomicStore:
+        storageClassSemantics = (*argp)[4]->getAsConstantUnion()->getConstArray()[0].getIConst();
+        semantics = (*argp)[5]->getAsConstantUnion()->getConstArray()[0].getIConst();
+        break;
+    case EOpImageAtomicLoad:
+        storageClassSemantics = (*argp)[3]->getAsConstantUnion()->getConstArray()[0].getIConst();
+        semantics = (*argp)[4]->getAsConstantUnion()->getConstArray()[0].getIConst();
+        break;
+    case EOpImageAtomicCompSwap:
+        storageClassSemantics = (*argp)[5]->getAsConstantUnion()->getConstArray()[0].getIConst();
+        semantics = (*argp)[6]->getAsConstantUnion()->getConstArray()[0].getIConst();
+        storageClassSemantics2 = (*argp)[7]->getAsConstantUnion()->getConstArray()[0].getIConst();
+        semantics2 = (*argp)[8]->getAsConstantUnion()->getConstArray()[0].getIConst();
+        break;
+
+    case EOpBarrier:
+        storageClassSemantics = (*argp)[2]->getAsConstantUnion()->getConstArray()[0].getIConst();
+        semantics = (*argp)[3]->getAsConstantUnion()->getConstArray()[0].getIConst();
+        break;
+    case EOpMemoryBarrier:
+        storageClassSemantics = (*argp)[1]->getAsConstantUnion()->getConstArray()[0].getIConst();
+        semantics = (*argp)[2]->getAsConstantUnion()->getConstArray()[0].getIConst();
+        break;
+    default:
+        break;
+    }
+
+    if ((semantics & gl_SemanticsAcquire) && 
+        (callNode.getOp() == EOpAtomicStore || callNode.getOp() == EOpImageAtomicStore)) {
+        error(loc, "gl_SemanticsAcquire must not be used with (image) atomic store",
+              fnCandidate.getName().c_str(), "");
+    }
+    if ((semantics & gl_SemanticsRelease) && 
+        (callNode.getOp() == EOpAtomicLoad || callNode.getOp() == EOpImageAtomicLoad)) {
+        error(loc, "gl_SemanticsRelease must not be used with (image) atomic load",
+              fnCandidate.getName().c_str(), "");
+    }
+    if ((semantics & gl_SemanticsAcquireRelease) && 
+        (callNode.getOp() == EOpAtomicStore || callNode.getOp() == EOpImageAtomicStore || 
+         callNode.getOp() == EOpAtomicLoad  || callNode.getOp() == EOpImageAtomicLoad)) {
+        error(loc, "gl_SemanticsAcquireRelease must not be used with (image) atomic load/store",
+              fnCandidate.getName().c_str(), "");
+    }
+    if (((semantics | semantics2) & ~(gl_SemanticsAcquire |
+                                      gl_SemanticsRelease |
+                                      gl_SemanticsAcquireRelease |
+                                      gl_SemanticsMakeAvailable |
+                                      gl_SemanticsMakeVisible))) {
+        error(loc, "Invalid semantics value", fnCandidate.getName().c_str(), "");
+    }
+    if (((storageClassSemantics | storageClassSemantics2) & ~(gl_StorageSemanticsBuffer |
+                                                              gl_StorageSemanticsShared |
+                                                              gl_StorageSemanticsImage |
+                                                              gl_StorageSemanticsOutput))) {
+        error(loc, "Invalid storage class semantics value", fnCandidate.getName().c_str(), "");
+    }
+
+    if (callNode.getOp() == EOpMemoryBarrier) {
+        if (!IsPow2(semantics & (gl_SemanticsAcquire | gl_SemanticsRelease | gl_SemanticsAcquireRelease))) {
+            error(loc, "Semantics must include exactly one of gl_SemanticsRelease, gl_SemanticsAcquire, or "
+                       "gl_SemanticsAcquireRelease", fnCandidate.getName().c_str(), "");
+        }
+    } else {
+        if (semantics & (gl_SemanticsAcquire | gl_SemanticsRelease | gl_SemanticsAcquireRelease)) {
+            if (!IsPow2(semantics & (gl_SemanticsAcquire | gl_SemanticsRelease | gl_SemanticsAcquireRelease))) {
+                error(loc, "Semantics must not include multiple of gl_SemanticsRelease, gl_SemanticsAcquire, or "
+                           "gl_SemanticsAcquireRelease", fnCandidate.getName().c_str(), "");
+            }
+        }
+        if (semantics2 & (gl_SemanticsAcquire | gl_SemanticsRelease | gl_SemanticsAcquireRelease)) {
+            if (!IsPow2(semantics2 & (gl_SemanticsAcquire | gl_SemanticsRelease | gl_SemanticsAcquireRelease))) {
+                error(loc, "semUnequal must not include multiple of gl_SemanticsRelease, gl_SemanticsAcquire, or "
+                           "gl_SemanticsAcquireRelease", fnCandidate.getName().c_str(), "");
+            }
+        }
+    }
+    if (callNode.getOp() == EOpMemoryBarrier) {
+        if (storageClassSemantics == 0) {
+            error(loc, "Storage class semantics must not be zero", fnCandidate.getName().c_str(), "");
+        }
+    }
+    if (callNode.getOp() == EOpBarrier && semantics != 0 && storageClassSemantics == 0) {
+        error(loc, "Storage class semantics must not be zero", fnCandidate.getName().c_str(), "");
+    }
+    if ((callNode.getOp() == EOpAtomicCompSwap || callNode.getOp() == EOpImageAtomicCompSwap) &&
+        (semantics2 & (gl_SemanticsRelease | gl_SemanticsAcquireRelease))) {
+        error(loc, "semUnequal must not be gl_SemanticsRelease or gl_SemanticsAcquireRelease",
+              fnCandidate.getName().c_str(), "");
+    }
+    if ((semantics & gl_SemanticsMakeAvailable) &&
+        !(semantics & (gl_SemanticsRelease | gl_SemanticsAcquireRelease))) {
+        error(loc, "gl_SemanticsMakeAvailable requires gl_SemanticsRelease or gl_SemanticsAcquireRelease",
+              fnCandidate.getName().c_str(), "");
+    }
+    if ((semantics & gl_SemanticsMakeVisible) &&
+        !(semantics & (gl_SemanticsAcquire | gl_SemanticsAcquireRelease))) {
+        error(loc, "gl_SemanticsMakeVisible requires gl_SemanticsAcquire or gl_SemanticsAcquireRelease",
+              fnCandidate.getName().c_str(), "");
+    }
+
+}
+
+
 //
 // Do additional checking of built-in function calls that is not caught
 // by normal semantic checks on argument type, extension tagging, etc.
@@ -1385,8 +1681,9 @@
         unaryArg = callNode.getAsUnaryNode()->getOperand();
         arg0 = unaryArg;
     }
-    const TIntermSequence& aggArgs = *argp;  // only valid when unaryArg is nullptr
 
+    TString featureString;
+    const char* feature = nullptr;
     switch (callNode.getOp()) {
     case EOpTextureGather:
     case EOpTextureGatherOffset:
@@ -1395,8 +1692,9 @@
         // Figure out which variants are allowed by what extensions,
         // and what arguments must be constant for which situations.
 
-        TString featureString = fnCandidate.getName() + "(...)";
-        const char* feature = featureString.c_str();
+        featureString = fnCandidate.getName();
+        featureString += "(...)";
+        feature = featureString.c_str();
         profileRequires(loc, EEsProfile, 310, nullptr, feature);
         int compArg = -1;  // track which argument, if any, is the constant component argument
         switch (callNode.getOp()) {
@@ -1416,8 +1714,9 @@
                 profileRequires(loc, ~EEsProfile, 400, E_GL_ARB_texture_gather, feature);
             else
                 profileRequires(loc, ~EEsProfile, 400, E_GL_ARB_gpu_shader5, feature);
-            if (! aggArgs[fnCandidate[0].type->getSampler().shadow ? 3 : 2]->getAsConstantUnion())
-                profileRequires(loc, EEsProfile, 0, Num_AEP_gpu_shader5, AEP_gpu_shader5, "non-constant offset argument");
+            if (! (*argp)[fnCandidate[0].type->getSampler().shadow ? 3 : 2]->getAsConstantUnion())
+                profileRequires(loc, EEsProfile, 320, Num_AEP_gpu_shader5, AEP_gpu_shader5,
+                                "non-constant offset argument");
             if (! fnCandidate[0].type->getSampler().shadow)
                 compArg = 3;
             break;
@@ -1426,7 +1725,7 @@
             if (! fnCandidate[0].type->getSampler().shadow)
                 compArg = 3;
             // check for constant offsets
-            if (! aggArgs[fnCandidate[0].type->getSampler().shadow ? 3 : 2]->getAsConstantUnion())
+            if (! (*argp)[fnCandidate[0].type->getSampler().shadow ? 3 : 2]->getAsConstantUnion())
                 error(loc, "must be a compile-time constant:", feature, "offsets argument");
             break;
         default:
@@ -1434,17 +1733,99 @@
         }
 
         if (compArg > 0 && compArg < fnCandidate.getParamCount()) {
-            if (aggArgs[compArg]->getAsConstantUnion()) {
-                int value = aggArgs[compArg]->getAsConstantUnion()->getConstArray()[0].getIConst();
+            if ((*argp)[compArg]->getAsConstantUnion()) {
+                int value = (*argp)[compArg]->getAsConstantUnion()->getConstArray()[0].getIConst();
                 if (value < 0 || value > 3)
                     error(loc, "must be 0, 1, 2, or 3:", feature, "component argument");
             } else
                 error(loc, "must be a compile-time constant:", feature, "component argument");
         }
 
+#ifdef AMD_EXTENSIONS
+        bool bias = false;
+        if (callNode.getOp() == EOpTextureGather)
+            bias = fnCandidate.getParamCount() > 3;
+        else if (callNode.getOp() == EOpTextureGatherOffset ||
+                 callNode.getOp() == EOpTextureGatherOffsets)
+            bias = fnCandidate.getParamCount() > 4;
+
+        if (bias) {
+            featureString = fnCandidate.getName();
+            featureString += "with bias argument";
+            feature = featureString.c_str();
+            profileRequires(loc, ~EEsProfile, 450, nullptr, feature);
+            requireExtensions(loc, 1, &E_GL_AMD_texture_gather_bias_lod, feature);
+        }
+#endif
+
         break;
     }
 
+#ifdef AMD_EXTENSIONS
+    case EOpSparseTextureGather:
+    case EOpSparseTextureGatherOffset:
+    case EOpSparseTextureGatherOffsets:
+    {
+        bool bias = false;
+        if (callNode.getOp() == EOpSparseTextureGather)
+            bias = fnCandidate.getParamCount() > 4;
+        else if (callNode.getOp() == EOpSparseTextureGatherOffset ||
+                 callNode.getOp() == EOpSparseTextureGatherOffsets)
+            bias = fnCandidate.getParamCount() > 5;
+
+        if (bias) {
+            featureString = fnCandidate.getName();
+            featureString += "with bias argument";
+            feature = featureString.c_str();
+            profileRequires(loc, ~EEsProfile, 450, nullptr, feature);
+            requireExtensions(loc, 1, &E_GL_AMD_texture_gather_bias_lod, feature);
+        }
+
+        break;
+    }
+
+    case EOpSparseTextureGatherLod:
+    case EOpSparseTextureGatherLodOffset:
+    case EOpSparseTextureGatherLodOffsets:
+    {
+        requireExtensions(loc, 1, &E_GL_ARB_sparse_texture2, fnCandidate.getName().c_str());
+        break;
+    }
+
+    case EOpSwizzleInvocations:
+    {
+        if (! (*argp)[1]->getAsConstantUnion())
+            error(loc, "argument must be compile-time constant", "offset", "");
+        else {
+            unsigned offset[4] = {};
+            offset[0] = (*argp)[1]->getAsConstantUnion()->getConstArray()[0].getUConst();
+            offset[1] = (*argp)[1]->getAsConstantUnion()->getConstArray()[1].getUConst();
+            offset[2] = (*argp)[1]->getAsConstantUnion()->getConstArray()[2].getUConst();
+            offset[3] = (*argp)[1]->getAsConstantUnion()->getConstArray()[3].getUConst();
+            if (offset[0] > 3 || offset[1] > 3 || offset[2] > 3 || offset[3] > 3)
+                error(loc, "components must be in the range [0, 3]", "offset", "");
+        }
+
+        break;
+    }
+
+    case EOpSwizzleInvocationsMasked:
+    {
+        if (! (*argp)[1]->getAsConstantUnion())
+            error(loc, "argument must be compile-time constant", "mask", "");
+        else {
+            unsigned mask[3] = {};
+            mask[0] = (*argp)[1]->getAsConstantUnion()->getConstArray()[0].getUConst();
+            mask[1] = (*argp)[1]->getAsConstantUnion()->getConstArray()[1].getUConst();
+            mask[2] = (*argp)[1]->getAsConstantUnion()->getConstArray()[2].getUConst();
+            if (mask[0] > 31 || mask[1] > 31 || mask[2] > 31)
+                error(loc, "components must be in the range [0, 31]", "mask", "");
+        }
+
+        break;
+    }
+#endif
+
     case EOpTextureOffset:
     case EOpTextureFetchOffset:
     case EOpTextureProjOffset:
@@ -1470,12 +1851,18 @@
         }
 
         if (arg > 0) {
-            if (! aggArgs[arg]->getAsConstantUnion())
+
+#ifdef AMD_EXTENSIONS
+            bool f16ShadowCompare = (*argp)[1]->getAsTyped()->getBasicType() == EbtFloat16 && arg0->getType().getSampler().shadow;
+            if (f16ShadowCompare)
+                ++arg;
+#endif
+            if (! (*argp)[arg]->getAsConstantUnion())
                 error(loc, "argument must be compile-time constant", "texel offset", "");
             else {
-                const TType& type = aggArgs[arg]->getAsTyped()->getType();
+                const TType& type = (*argp)[arg]->getAsTyped()->getType();
                 for (int c = 0; c < type.getVectorSize(); ++c) {
-                    int offset = aggArgs[arg]->getAsConstantUnion()->getConstArray()[c].getIConst();
+                    int offset = (*argp)[arg]->getAsConstantUnion()->getConstArray()[c].getIConst();
                     if (offset > resources.maxProgramTexelOffset || offset < resources.minProgramTexelOffset)
                         error(loc, "value is out of range:", "texel offset", "[gl_MinProgramTexelOffset, gl_MaxProgramTexelOffset]");
                 }
@@ -1485,6 +1872,17 @@
         break;
     }
 
+#ifdef NV_EXTENSIONS
+    case EOpTraceNV:
+        if (!(*argp)[10]->getAsConstantUnion())
+            error(loc, "argument must be compile-time constant", "payload number", "");
+        break;
+    case EOpExecuteCallableNV:
+        if (!(*argp)[1]->getAsConstantUnion())
+            error(loc, "argument must be compile-time constant", "callable data number", "");
+        break;
+#endif
+
     case EOpTextureQuerySamples:
     case EOpImageQuerySamples:
         // GL_ARB_shader_texture_image_samples
@@ -1499,6 +1897,8 @@
     case EOpImageAtomicXor:
     case EOpImageAtomicExchange:
     case EOpImageAtomicCompSwap:
+    case EOpImageAtomicLoad:
+    case EOpImageAtomicStore:
     {
         // Make sure the image types have the correct layout() format and correct argument types
         const TType& imageType = arg0->getType();
@@ -1512,12 +1912,47 @@
                 error(loc, "only supported on image with format r32f", fnCandidate.getName().c_str(), "");
         }
 
+        const size_t maxArgs = imageType.getSampler().isMultiSample() ? 5 : 4;
+        if (argp->size() > maxArgs) {
+            requireExtensions(loc, 1, &E_GL_KHR_memory_scope_semantics, fnCandidate.getName().c_str());
+            memorySemanticsCheck(loc, fnCandidate, callNode);
+        }
+
+        break;
+    }
+
+    case EOpAtomicAdd:
+    case EOpAtomicMin:
+    case EOpAtomicMax:
+    case EOpAtomicAnd:
+    case EOpAtomicOr:
+    case EOpAtomicXor:
+    case EOpAtomicExchange:
+    case EOpAtomicCompSwap:
+    case EOpAtomicLoad:
+    case EOpAtomicStore:
+    {
+        if (argp->size() > 3) {
+            requireExtensions(loc, 1, &E_GL_KHR_memory_scope_semantics, fnCandidate.getName().c_str());
+            memorySemanticsCheck(loc, fnCandidate, callNode);
+        } else if (arg0->getType().getBasicType() == EbtInt64 || arg0->getType().getBasicType() == EbtUint64) {
+#ifdef NV_EXTENSIONS
+            const char* const extensions[2] = { E_GL_NV_shader_atomic_int64,
+                                                E_GL_EXT_shader_atomic_int64 };
+            requireExtensions(loc, 2, extensions, fnCandidate.getName().c_str());
+#else
+            requireExtensions(loc, 1, &E_GL_EXT_shader_atomic_int64, fnCandidate.getName().c_str());
+#endif
+        }
         break;
     }
 
     case EOpInterpolateAtCentroid:
     case EOpInterpolateAtSample:
     case EOpInterpolateAtOffset:
+#ifdef AMD_EXTENSIONS
+    case EOpInterpolateAtVertex:
+#endif
         // Make sure the first argument is an interpolant, or an array element of an interpolant
         if (arg0->getType().getQualifier().storage != EvqVaryingIn) {
             // It might still be an array element.
@@ -1532,6 +1967,23 @@
             if (base == nullptr || base->getType().getQualifier().storage != EvqVaryingIn)
                 error(loc, "first argument must be an interpolant, or interpolant-array element", fnCandidate.getName().c_str(), "");
         }
+
+#ifdef AMD_EXTENSIONS
+        if (callNode.getOp() == EOpInterpolateAtVertex) {
+            if (!arg0->getType().getQualifier().isExplicitInterpolation())
+                error(loc, "argument must be qualified as __explicitInterpAMD in", "interpolant", "");
+            else {
+                if (! (*argp)[1]->getAsConstantUnion())
+                    error(loc, "argument must be compile-time constant", "vertex index", "");
+                else {
+                    unsigned vertexIdx = (*argp)[1]->getAsConstantUnion()->getConstArray()[0].getUConst();
+                    if (vertexIdx > 2)
+                        error(loc, "must be in the range [0, 2]", "vertex index", "");
+                }
+            }
+        }
+#endif
+
         break;
 
     case EOpEmitStreamVertex:
@@ -1539,9 +1991,76 @@
         intermediate.setMultiStream();
         break;
 
+    case EOpSubgroupClusteredAdd:
+    case EOpSubgroupClusteredMul:
+    case EOpSubgroupClusteredMin:
+    case EOpSubgroupClusteredMax:
+    case EOpSubgroupClusteredAnd:
+    case EOpSubgroupClusteredOr:
+    case EOpSubgroupClusteredXor:
+        // The <clusterSize> as used in the subgroupClustered<op>() operations must be:
+        // - An integral constant expression.
+        // - At least 1.
+        // - A power of 2.
+        if ((*argp)[1]->getAsConstantUnion() == nullptr)
+            error(loc, "argument must be compile-time constant", "cluster size", "");
+        else {
+            int size = (*argp)[1]->getAsConstantUnion()->getConstArray()[0].getIConst();
+            if (size < 1)
+                error(loc, "argument must be at least 1", "cluster size", "");
+            else if (!IsPow2(size))
+                error(loc, "argument must be a power of 2", "cluster size", "");
+        }
+        break;
+
+    case EOpSubgroupBroadcast:
+        // <id> must be an integral constant expression.
+        if ((*argp)[1]->getAsConstantUnion() == nullptr)
+            error(loc, "argument must be compile-time constant", "id", "");
+        break;
+
+    case EOpBarrier:
+    case EOpMemoryBarrier:
+        if (argp->size() > 0) {
+            requireExtensions(loc, 1, &E_GL_KHR_memory_scope_semantics, fnCandidate.getName().c_str());
+            memorySemanticsCheck(loc, fnCandidate, callNode);
+        }
+        break;
+
     default:
         break;
     }
+
+    // Texture operations on texture objects (aside from texelFetch on a
+    // textureBuffer) require EXT_samplerless_texture_functions.
+    switch (callNode.getOp()) {
+    case EOpTextureQuerySize:
+    case EOpTextureQueryLevels:
+    case EOpTextureQuerySamples:
+    case EOpTextureFetch:
+    case EOpTextureFetchOffset:
+    {
+        const TSampler& sampler = fnCandidate[0].type->getSampler();
+
+        const bool isTexture = sampler.isTexture() && !sampler.isCombined();
+        const bool isBuffer = sampler.dim == EsdBuffer;
+        const bool isFetch = callNode.getOp() == EOpTextureFetch || callNode.getOp() == EOpTextureFetchOffset;
+
+        if (isTexture && (!isBuffer || !isFetch))
+            requireExtensions(loc, 1, &E_GL_EXT_samplerless_texture_functions, fnCandidate.getName().c_str());
+
+        break;
+    }
+
+    default:
+        break;
+    }
+
+    if (callNode.getOp() > EOpSubgroupGuardStart && callNode.getOp() < EOpSubgroupGuardStop) {
+        // these require SPIR-V 1.3
+        if (spvVersion.spv > 0 && spvVersion.spv < EShTargetSpv_1_3)
+            error(loc, "requires SPIR-V 1.3", "subgroup op", "");
+    }
 }
 
 extern bool PureOperatorBuiltins;
@@ -1584,7 +2103,8 @@
                     profileRequires(loc, ~EEsProfile, 400, E_GL_ARB_gpu_shader5, feature);
                 int offsetArg = fnCandidate[0].type->getSampler().shadow ? 3 : 2;
                 if (! callNode.getSequence()[offsetArg]->getAsConstantUnion())
-                    profileRequires(loc, EEsProfile, 0, Num_AEP_gpu_shader5, AEP_gpu_shader5, "non-constant offset argument");
+                    profileRequires(loc, EEsProfile, 320, Num_AEP_gpu_shader5, AEP_gpu_shader5,
+                                    "non-constant offset argument");
                 if (! fnCandidate[0].type->getSampler().shadow)
                     compArg = 3;
             } else if (fnCandidate.getName().compare("textureGatherOffsets") == 0) {
@@ -2102,6 +2622,15 @@
     case EOpConstructDMat4x2:
     case EOpConstructDMat4x3:
     case EOpConstructDMat4x4:
+    case EOpConstructF16Mat2x2:
+    case EOpConstructF16Mat2x3:
+    case EOpConstructF16Mat2x4:
+    case EOpConstructF16Mat3x2:
+    case EOpConstructF16Mat3x3:
+    case EOpConstructF16Mat3x4:
+    case EOpConstructF16Mat4x2:
+    case EOpConstructF16Mat4x3:
+    case EOpConstructF16Mat4x4:
         constructingMatrix = true;
         break;
     default:
@@ -2122,7 +2651,7 @@
     bool floatArgument = false;
     for (int arg = 0; arg < function.getParamCount(); ++arg) {
         if (function[arg].type->isArray()) {
-            if (! function[arg].type->isExplicitlySizedArray()) {
+            if (function[arg].type->isUnsizedArray()) {
                 // Can't construct from an unsized array.
                 error(loc, "array argument must be sized", "constructor", "");
                 return true;
@@ -2150,6 +2679,59 @@
             specConstType = true;
         if (function[arg].type->isFloatingDomain())
             floatArgument = true;
+        if (type.isStruct()) {
+            if (function[arg].type->containsBasicType(EbtFloat16)) {
+                requireFloat16Arithmetic(loc, "constructor", "can't construct structure containing 16-bit type");
+            }
+            if (function[arg].type->containsBasicType(EbtUint16) ||
+                function[arg].type->containsBasicType(EbtInt16)) {
+                requireInt16Arithmetic(loc, "constructor", "can't construct structure containing 16-bit type");
+            }
+            if (function[arg].type->containsBasicType(EbtUint8) ||
+                function[arg].type->containsBasicType(EbtInt8)) {
+                requireInt8Arithmetic(loc, "constructor", "can't construct structure containing 8-bit type");
+            }
+        }
+    }
+
+    switch (op) {
+    case EOpConstructFloat16:
+    case EOpConstructF16Vec2:
+    case EOpConstructF16Vec3:
+    case EOpConstructF16Vec4:
+        if (type.isArray())
+            requireFloat16Arithmetic(loc, "constructor", "16-bit arrays not supported");
+        if (type.isVector() && function.getParamCount() != 1)
+            requireFloat16Arithmetic(loc, "constructor", "16-bit vectors only take vector types");
+        break;
+    case EOpConstructUint16:
+    case EOpConstructU16Vec2:
+    case EOpConstructU16Vec3:
+    case EOpConstructU16Vec4:
+    case EOpConstructInt16:
+    case EOpConstructI16Vec2:
+    case EOpConstructI16Vec3:
+    case EOpConstructI16Vec4:
+        if (type.isArray())
+            requireInt16Arithmetic(loc, "constructor", "16-bit arrays not supported");
+        if (type.isVector() && function.getParamCount() != 1)
+            requireInt16Arithmetic(loc, "constructor", "16-bit vectors only take vector types");
+        break;
+    case EOpConstructUint8:
+    case EOpConstructU8Vec2:
+    case EOpConstructU8Vec3:
+    case EOpConstructU8Vec4:
+    case EOpConstructInt8:
+    case EOpConstructI8Vec2:
+    case EOpConstructI8Vec3:
+    case EOpConstructI8Vec4:
+        if (type.isArray())
+            requireInt8Arithmetic(loc, "constructor", "8-bit arrays not supported");
+        if (type.isVector() && function.getParamCount() != 1)
+            requireInt8Arithmetic(loc, "constructor", "8-bit vectors only take vector types");
+        break;
+    default:
+        break;
     }
 
     // inherit constness from children
@@ -2158,6 +2740,10 @@
         // Finish pinning down spec-const semantics
         if (specConstType) {
             switch (op) {
+            case EOpConstructInt8:
+            case EOpConstructUint8:
+            case EOpConstructInt16:
+            case EOpConstructUint16:
             case EOpConstructInt:
             case EOpConstructUint:
             case EOpConstructInt64:
@@ -2166,6 +2752,18 @@
             case EOpConstructBVec2:
             case EOpConstructBVec3:
             case EOpConstructBVec4:
+            case EOpConstructI8Vec2:
+            case EOpConstructI8Vec3:
+            case EOpConstructI8Vec4:
+            case EOpConstructU8Vec2:
+            case EOpConstructU8Vec3:
+            case EOpConstructU8Vec4:
+            case EOpConstructI16Vec2:
+            case EOpConstructI16Vec3:
+            case EOpConstructI16Vec4:
+            case EOpConstructU16Vec2:
+            case EOpConstructU16Vec3:
+            case EOpConstructU16Vec4:
             case EOpConstructIVec2:
             case EOpConstructIVec3:
             case EOpConstructIVec4:
@@ -2204,7 +2802,7 @@
             return true;
         }
 
-        if (type.isImplicitlySizedArray()) {
+        if (type.isUnsizedArray()) {
             // auto adapt the constructor type to the number of arguments
             type.changeOuterArraySize(function.getParamCount());
         } else if (type.getOuterArraySize() != function.getParamCount()) {
@@ -2216,20 +2814,21 @@
             // Types have to match, but we're still making the type.
             // Finish making the type, and the comparison is done later
             // when checking for conversion.
-            TArraySizes& arraySizes = type.getArraySizes();
+            TArraySizes& arraySizes = *type.getArraySizes();
 
             // At least the dimensionalities have to match.
-            if (! function[0].type->isArray() || arraySizes.getNumDims() != function[0].type->getArraySizes().getNumDims() + 1) {
+            if (! function[0].type->isArray() ||
+                    arraySizes.getNumDims() != function[0].type->getArraySizes()->getNumDims() + 1) {
                 error(loc, "array constructor argument not correct type to construct array element", "constructor", "");
                 return true;
             }
 
-            if (arraySizes.isInnerImplicit()) {
+            if (arraySizes.isInnerUnsized()) {
                 // "Arrays of arrays ..., and the size for any dimension is optional"
                 // That means we need to adopt (from the first argument) the other array sizes into the type.
                 for (int d = 1; d < arraySizes.getNumDims(); ++d) {
                     if (arraySizes.getDimSize(d) == UnsizedArraySize) {
-                        arraySizes.setDimSize(d, function[0].type->getArraySizes().getDimSize(d - 1));
+                        arraySizes.setDimSize(d, function[0].type->getArraySizes()->getDimSize(d - 1));
                     }
                 }
             }
@@ -2332,18 +2931,12 @@
     // second argument
     //   * the constructor's second argument must be a scalar of type
     //     *sampler* or *samplerShadow*
-    //   * the presence or absence of depth comparison (Shadow) must match
-    //     between the constructed sampler type and the type of the second argument
     if (  function[1].type->getBasicType() != EbtSampler ||
         ! function[1].type->getSampler().isPureSampler() ||
           function[1].type->isArray()) {
         error(loc, "sampler-constructor second argument must be a scalar type 'sampler'", token, "");
         return true;
     }
-    if (function.getType().getSampler().shadow != function[1].type->getSampler().shadow) {
-        error(loc, "sampler-constructor second argument presence of shadow must match constructor presence of shadow", token, "");
-        return true;
-    }
 
     return false;
 }
@@ -2378,6 +2971,16 @@
 
 void TParseContext::samplerCheck(const TSourceLoc& loc, const TType& type, const TString& identifier, TIntermTyped* /*initializer*/)
 {
+    // Check that the appropriate extension is enabled if external sampler is used.
+    // There are two extensions. The correct one must be used based on GLSL version.
+    if (type.getBasicType() == EbtSampler && type.getSampler().external) {
+        if (version < 300) {
+            requireExtensions(loc, 1, &E_GL_OES_EGL_image_external, "samplerExternalOES");
+        } else {
+            requireExtensions(loc, 1, &E_GL_OES_EGL_image_external_essl3, "samplerExternalOES");
+        }
+    }
+
     if (type.getQualifier().storage == EvqUniform)
         return;
 
@@ -2401,17 +3004,50 @@
     else if (type.getBasicType() == EbtAtomicUint && type.getQualifier().storage != EvqUniform)
         error(loc, "atomic_uints can only be used in uniform variables or function parameters:", type.getBasicTypeString().c_str(), identifier.c_str());
 }
+#ifdef NV_EXTENSIONS
+void TParseContext::accStructNVCheck(const TSourceLoc& loc, const TType& type, const TString& identifier)
+{
+    if (type.getQualifier().storage == EvqUniform)
+        return;
 
-void TParseContext::transparentCheck(const TSourceLoc& loc, const TType& type, const TString& /*identifier*/)
+    if (type.getBasicType() == EbtStruct && containsFieldWithBasicType(type, EbtAccStructNV))
+        error(loc, "non-uniform struct contains an accelerationStructureNV:", type.getBasicTypeString().c_str(), identifier.c_str());
+    else if (type.getBasicType() == EbtAccStructNV && type.getQualifier().storage != EvqUniform)
+        error(loc, "accelerationStructureNV can only be used in uniform variables or function parameters:",
+            type.getBasicTypeString().c_str(), identifier.c_str());
+
+}
+#endif
+
+void TParseContext::transparentOpaqueCheck(const TSourceLoc& loc, const TType& type, const TString& identifier)
 {
     if (parsingBuiltins)
         return;
 
-    // Vulkan doesn't allow transparent uniforms outside of blocks
-    if (spvVersion.vulkan == 0 || type.getQualifier().storage != EvqUniform)
+    if (type.getQualifier().storage != EvqUniform)
         return;
-    if (type.containsNonOpaque())
-        vulkanRemoved(loc, "non-opaque uniforms outside a block");
+
+    if (type.containsNonOpaque()) {
+        // Vulkan doesn't allow transparent uniforms outside of blocks
+        if (spvVersion.vulkan > 0)
+            vulkanRemoved(loc, "non-opaque uniforms outside a block");
+        // OpenGL wants locations on these (unless they are getting automapped)
+        if (spvVersion.openGl > 0 && !type.getQualifier().hasLocation() && !intermediate.getAutoMapLocations())
+            error(loc, "non-opaque uniform variables need a layout(location=L)", identifier.c_str(), "");
+    }
+}
+
+//
+// Qualifier checks knowing the qualifier and that it is a member of a struct/block.
+//
+void TParseContext::memberQualifierCheck(glslang::TPublicType& publicType)
+{
+    globalQualifierFixCheck(publicType.loc, publicType.qualifier);
+    checkNoShaderLayouts(publicType.loc, publicType.shaderQualifiers);
+    if (publicType.qualifier.isNonUniform()) {
+        error(publicType.loc, "not allowed on block or structure members", "nonuniformEXT", "");
+        publicType.qualifier.nonUniform = false;
+    }
 }
 
 //
@@ -2419,12 +3055,15 @@
 //
 void TParseContext::globalQualifierFixCheck(const TSourceLoc& loc, TQualifier& qualifier)
 {
+    bool nonuniformOkay = false;
+
     // move from parameter/unknown qualifiers to pipeline in/out qualifiers
     switch (qualifier.storage) {
     case EvqIn:
         profileRequires(loc, ENoProfile, 130, nullptr, "in for stage inputs");
         profileRequires(loc, EEsProfile, 300, nullptr, "in for stage inputs");
         qualifier.storage = EvqVaryingIn;
+        nonuniformOkay = true;
         break;
     case EvqOut:
         profileRequires(loc, ENoProfile, 130, nullptr, "out for stage outputs");
@@ -2435,10 +3074,17 @@
         qualifier.storage = EvqVaryingIn;
         error(loc, "cannot use 'inout' at global scope", "", "");
         break;
+    case EvqGlobal:
+    case EvqTemporary:
+        nonuniformOkay = true;
+        break;
     default:
         break;
     }
 
+    if (!nonuniformOkay && qualifier.nonUniform)
+        error(loc, "for non-parameter, can only apply to 'in' or no storage qualifier", "nonuniformEXT", "");
+
     invariantCheck(loc, qualifier);
 }
 
@@ -2450,8 +3096,11 @@
     if (! symbolTable.atGlobalLevel())
         return;
 
-    if (qualifier.isMemory() && ! publicType.isImage() && publicType.qualifier.storage != EvqBuffer)
+    if (qualifier.isMemoryQualifierImageAndSSBOOnly() && ! publicType.isImage() && publicType.qualifier.storage != EvqBuffer) {
         error(loc, "memory qualifiers cannot be used on this type", "", "");
+    } else if (qualifier.isMemory() && (publicType.basicType != EbtSampler) && !publicType.qualifier.isUniformOrBuffer()) {
+        error(loc, "memory qualifiers cannot be used on this type", "", "");
+    }
 
     if (qualifier.storage == EvqBuffer && publicType.basicType != EbtBlock)
         error(loc, "buffers can be declared only as blocks", "buffer", "");
@@ -2464,25 +3113,29 @@
 
     // now, knowing it is a shader in/out, do all the in/out semantic checks
 
-    if (publicType.basicType == EbtBool) {
+    if (publicType.basicType == EbtBool && !parsingBuiltins) {
         error(loc, "cannot be bool", GetStorageQualifierString(qualifier.storage), "");
         return;
     }
 
-    if (publicType.basicType == EbtInt   || publicType.basicType == EbtUint   ||
-        publicType.basicType == EbtInt64 || publicType.basicType == EbtUint64 ||
-        publicType.basicType == EbtDouble)
+    if (isTypeInt(publicType.basicType) || publicType.basicType == EbtDouble)
         profileRequires(loc, EEsProfile, 300, nullptr, "shader input/output");
 
+    if (!qualifier.flat
 #ifdef AMD_EXTENSIONS
-    if (! qualifier.flat && ! qualifier.explicitInterp) {
-#else
-    if (!qualifier.flat) {
+        && !qualifier.explicitInterp
 #endif
-        if (publicType.basicType == EbtInt    || publicType.basicType == EbtUint   ||
-            publicType.basicType == EbtInt64  || publicType.basicType == EbtUint64 ||
+#ifdef NV_EXTENSIONS
+        && !qualifier.pervertexNV
+#endif
+        ) {
+        if (isTypeInt(publicType.basicType) ||
             publicType.basicType == EbtDouble ||
-            (publicType.userDef && (publicType.userDef->containsBasicType(EbtInt)    ||
+            (publicType.userDef && (publicType.userDef->containsBasicType(EbtInt8)   ||
+                                    publicType.userDef->containsBasicType(EbtUint8)  ||
+                                    publicType.userDef->containsBasicType(EbtInt16)  ||
+                                    publicType.userDef->containsBasicType(EbtUint16) ||
+                                    publicType.userDef->containsBasicType(EbtInt)    ||
                                     publicType.userDef->containsBasicType(EbtUint)   ||
                                     publicType.userDef->containsBasicType(EbtInt64)  ||
                                     publicType.userDef->containsBasicType(EbtUint64) ||
@@ -2497,6 +3150,11 @@
     if (qualifier.patch && qualifier.isInterpolation())
         error(loc, "cannot use interpolation qualifiers with patch", "patch", "");
 
+#ifdef NV_EXTENSIONS
+    if (qualifier.perTaskNV && publicType.basicType != EbtBlock)
+        error(loc, "taskNV variables can be declared only as blocks", "taskNV", "");
+#endif
+
     if (qualifier.storage == EvqVaryingIn) {
         switch (language) {
         case EShLangVertex:
@@ -2584,8 +3242,8 @@
                 error(loc, "can't use auxiliary qualifier on a fragment output", "centroid/sample/patch", "");
             if (qualifier.isInterpolation())
                 error(loc, "can't use interpolation qualifier on a fragment output", "flat/smooth/noperspective", "");
-            if (publicType.basicType == EbtDouble)
-                error(loc, "cannot contain a double", GetStorageQualifierString(qualifier.storage), "");
+            if (publicType.basicType == EbtDouble || publicType.basicType == EbtInt64 || publicType.basicType == EbtUint64)
+                error(loc, "cannot contain a double, int64, or uint64", GetStorageQualifierString(qualifier.storage), "");
         break;
 
         case EShLangCompute:
@@ -2663,6 +3321,13 @@
     if (dst.precision == EpqNone || (force && src.precision != EpqNone))
         dst.precision = src.precision;
 
+    if (!force && ((src.coherent && (dst.devicecoherent || dst.queuefamilycoherent || dst.workgroupcoherent || dst.subgroupcoherent)) ||
+                   (src.devicecoherent && (dst.coherent || dst.queuefamilycoherent || dst.workgroupcoherent || dst.subgroupcoherent)) ||
+                   (src.queuefamilycoherent && (dst.coherent || dst.devicecoherent || dst.workgroupcoherent || dst.subgroupcoherent)) ||
+                   (src.workgroupcoherent && (dst.coherent || dst.devicecoherent || dst.queuefamilycoherent || dst.subgroupcoherent)) ||
+                   (src.subgroupcoherent  && (dst.coherent || dst.devicecoherent || dst.queuefamilycoherent || dst.workgroupcoherent)))) {
+        error(loc, "only one coherent/devicecoherent/queuefamilycoherent/workgroupcoherent/subgroupcoherent qualifier allowed", GetPrecisionQualifierString(src.precision), "");
+    }
     // Layout qualifiers
     mergeObjectLayoutQualifiers(dst, src, false);
 
@@ -2678,14 +3343,25 @@
 #ifdef AMD_EXTENSIONS
     MERGE_SINGLETON(explicitInterp);
 #endif
+#ifdef NV_EXTENSIONS
+    MERGE_SINGLETON(perPrimitiveNV);
+    MERGE_SINGLETON(perViewNV);
+    MERGE_SINGLETON(perTaskNV);
+#endif
     MERGE_SINGLETON(patch);
     MERGE_SINGLETON(sample);
     MERGE_SINGLETON(coherent);
+    MERGE_SINGLETON(devicecoherent);
+    MERGE_SINGLETON(queuefamilycoherent);
+    MERGE_SINGLETON(workgroupcoherent);
+    MERGE_SINGLETON(subgroupcoherent);
+    MERGE_SINGLETON(nonprivate);
     MERGE_SINGLETON(volatil);
     MERGE_SINGLETON(restrict);
     MERGE_SINGLETON(readonly);
     MERGE_SINGLETON(writeonly);
     MERGE_SINGLETON(specConstant);
+    MERGE_SINGLETON(nonUniform);
 
     if (repeated)
         error(loc, "replicated qualifiers", "", "");
@@ -2776,6 +3452,13 @@
 {
     if ((qualifier == EvqOut || qualifier == EvqInOut) && type.isOpaque())
         error(loc, "samplers and atomic_uints cannot be output parameters", type.getBasicTypeString().c_str(), "");
+
+    if (!parsingBuiltins && type.containsBasicType(EbtFloat16))
+        requireFloat16Arithmetic(loc, type.getBasicTypeString().c_str(), "float16 types can only be in uniform block or buffer storage");
+    if (!parsingBuiltins && type.contains16BitInt())
+        requireInt16Arithmetic(loc, type.getBasicTypeString().c_str(), "(u)int16 types can only be in uniform block or buffer storage");
+    if (!parsingBuiltins && type.contains8BitInt())
+        requireInt8Arithmetic(loc, type.getBasicTypeString().c_str(), "(u)int8 types can only be in uniform block or buffer storage");
 }
 
 bool TParseContext::containsFieldWithBasicType(const TType& type, TBasicType basicType)
@@ -2886,7 +3569,7 @@
 //
 void TParseContext::arraySizeRequiredCheck(const TSourceLoc& loc, const TArraySizes& arraySizes)
 {
-    if (arraySizes.isImplicit())
+    if (arraySizes.hasUnsized())
         error(loc, "array size required", "", "");
 }
 
@@ -2900,7 +3583,8 @@
     }
 }
 
-void TParseContext::arrayUnsizedCheck(const TSourceLoc& loc, const TQualifier& qualifier, const TArraySizes* arraySizes, bool initializer, bool lastMember)
+void TParseContext::arraySizesCheck(const TSourceLoc& loc, const TQualifier& qualifier, TArraySizes* arraySizes,
+    const TIntermTyped* initializer, bool lastMember)
 {
     assert(arraySizes);
 
@@ -2908,13 +3592,22 @@
     if (parsingBuiltins)
         return;
 
-    // always allow an initializer to set any unknown array sizes
-    if (initializer)
+    // initializer must be a sized array, in which case
+    // allow the initializer to set any unknown array sizes
+    if (initializer != nullptr) {
+        if (initializer->getType().isUnsizedArray())
+            error(loc, "array initializer must be sized", "[]", "");
         return;
+    }
 
-    // No environment lets any non-outer-dimension that's to be implicitly sized
-    if (arraySizes->isInnerImplicit())
+    // No environment allows any non-outer-dimension to be implicitly sized
+    if (arraySizes->isInnerUnsized()) {
         error(loc, "only outermost dimension of an array of arrays can be implicitly sized", "[]", "");
+        arraySizes->clearInnerUnsized();
+    }
+
+    if (arraySizes->isInnerSpecialization())
+        error(loc, "only outermost dimension of an array of arrays can be a specialization constant", "[]", "");
 
     // desktop always allows outer-dimension-unsized variable arrays,
     if (profile != EEsProfile)
@@ -2931,21 +3624,32 @@
     switch (language) {
     case EShLangGeometry:
         if (qualifier.storage == EvqVaryingIn)
-            if (extensionsTurnedOn(Num_AEP_geometry_shader, AEP_geometry_shader))
+            if ((profile == EEsProfile && version >= 320) ||
+                extensionsTurnedOn(Num_AEP_geometry_shader, AEP_geometry_shader))
                 return;
         break;
     case EShLangTessControl:
         if ( qualifier.storage == EvqVaryingIn ||
             (qualifier.storage == EvqVaryingOut && ! qualifier.patch))
-            if (extensionsTurnedOn(Num_AEP_tessellation_shader, AEP_tessellation_shader))
+            if ((profile == EEsProfile && version >= 320) ||
+                extensionsTurnedOn(Num_AEP_tessellation_shader, AEP_tessellation_shader))
                 return;
         break;
     case EShLangTessEvaluation:
         if ((qualifier.storage == EvqVaryingIn && ! qualifier.patch) ||
              qualifier.storage == EvqVaryingOut)
-            if (extensionsTurnedOn(Num_AEP_tessellation_shader, AEP_tessellation_shader))
+            if ((profile == EEsProfile && version >= 320) ||
+                extensionsTurnedOn(Num_AEP_tessellation_shader, AEP_tessellation_shader))
                 return;
         break;
+#ifdef NV_EXTENSIONS
+    case EShLangMeshNV:
+        if (qualifier.storage == EvqVaryingOut)
+            if ((profile == EEsProfile && version >= 320) ||
+                extensionTurnedOn(E_GL_NV_mesh_shader))
+                return;
+        break;
+#endif
     default:
         break;
     }
@@ -2953,8 +3657,11 @@
     arraySizeRequiredCheck(loc, *arraySizes);
 }
 
-void TParseContext::arrayOfArrayVersionCheck(const TSourceLoc& loc)
+void TParseContext::arrayOfArrayVersionCheck(const TSourceLoc& loc, const TArraySizes* sizes)
 {
+    if (sizes == nullptr || sizes->getNumDims() == 1)
+        return;
+
     const char* feature = "arrays of arrays";
 
     requireProfile(loc, EEsProfile | ECoreProfile | ECompatibilityProfile, feature);
@@ -2962,36 +3669,6 @@
     profileRequires(loc, ECoreProfile | ECompatibilityProfile, 430, nullptr, feature);
 }
 
-void TParseContext::arrayDimCheck(const TSourceLoc& loc, const TArraySizes* sizes1, const TArraySizes* sizes2)
-{
-    if ((sizes1 && sizes2) ||
-        (sizes1 && sizes1->getNumDims() > 1) ||
-        (sizes2 && sizes2->getNumDims() > 1))
-        arrayOfArrayVersionCheck(loc);
-}
-
-void TParseContext::arrayDimCheck(const TSourceLoc& loc, const TType* type, const TArraySizes* sizes2)
-{
-    // skip checking for multiple dimensions on the type; it was caught earlier
-    if ((type && type->isArray() && sizes2) ||
-        (sizes2 && sizes2->getNumDims() > 1))
-        arrayOfArrayVersionCheck(loc);
-}
-
-// Merge array dimensions listed in 'sizes' onto the type's array dimensions.
-//
-// From the spec: "vec4[2] a[3]; // size-3 array of size-2 array of vec4"
-//
-// That means, the 'sizes' go in front of the 'type' as outermost sizes.
-// 'type' is the type part of the declaration (to the left)
-// 'sizes' is the arrayness tagged on the identifier (to the right)
-//
-void TParseContext::arrayDimMerge(TType& type, const TArraySizes* sizes)
-{
-    if (sizes)
-        type.addArrayOuterSizes(*sizes);
-}
-
 //
 // Do all the semantic checking for declaring or redeclaring an array, with and
 // without a size, and make the right changes to the symbol table.
@@ -3020,7 +3697,7 @@
             if (! symbolTable.atBuiltInLevel()) {
                 if (isIoResizeArray(type)) {
                     ioArraySymbolResizeList.push_back(symbol);
-                    checkIoArraysConsistency(loc, true);
+                    checkIoArraysConsistency(loc, true, type.getQualifier().isPerPrimitive());
                 } else
                     fixIoArraySize(loc, symbol->getWritableType());
             }
@@ -3061,7 +3738,7 @@
         return;
     }
 
-    if (existingType.isExplicitlySizedArray()) {
+    if (existingType.isSizedArray()) {
         // be more leniant for input arrays to geometry shaders and tessellation control outputs, where the redeclaration is the same size
         if (! (isIoResizeArray(type) && existingType.getOuterArraySize() == type.getOuterArraySize()))
             error(loc, "redeclaration of array with size", identifier.c_str(), "");
@@ -3073,69 +3750,64 @@
     existingType.updateArraySizes(type);
 
     if (isIoResizeArray(type))
-        checkIoArraysConsistency(loc);
+        checkIoArraysConsistency(loc, false, type.getQualifier().isPerPrimitive());
 }
 
-void TParseContext::updateImplicitArraySize(const TSourceLoc& loc, TIntermNode *node, int index)
+// Policy and error check for needing a runtime sized array.
+void TParseContext::checkRuntimeSizable(const TSourceLoc& loc, const TIntermTyped& base)
 {
-    // maybe there is nothing to do...
-    TIntermTyped* typedNode = node->getAsTyped();
-    if (typedNode->getType().getImplicitArraySize() > index)
+    // runtime length implies runtime sizeable, so no problem
+    if (isRuntimeLength(base))
         return;
 
-    // something to do...
-
-    // Figure out what symbol to lookup, as we will use its type to edit for the size change,
-    // as that type will be shared through shallow copies for future references.
-    TSymbol* symbol = nullptr;
-    int blockIndex = -1;
-    const TString* lookupName = nullptr;
-    if (node->getAsSymbolNode())
-        lookupName = &node->getAsSymbolNode()->getName();
-    else if (node->getAsBinaryNode()) {
-        const TIntermBinary* deref = node->getAsBinaryNode();
-        // This has to be the result of a block dereference, unless it's bad shader code
-        // If it's a uniform block, then an error will be issued elsewhere, but
-        // return early now to avoid crashing later in this function.
-        if (deref->getLeft()->getBasicType() != EbtBlock ||
-            deref->getLeft()->getType().getQualifier().storage == EvqUniform ||
-            deref->getRight()->getAsConstantUnion() == nullptr)
-            return;
-
-        const TIntermTyped* left  = deref->getLeft();
-        const TIntermTyped* right = deref->getRight();
-
-        if (left->getAsBinaryNode()) {
-            left = left->getAsBinaryNode()->getLeft(); // Block array access
-            assert(left->isArray());
-        }
-
-        if (! left->getAsSymbolNode())
-            return;
-
-        blockIndex = right->getAsConstantUnion()->getConstArray()[0].getIConst();
-
-        lookupName = &left->getAsSymbolNode()->getName();
-        if (IsAnonymous(*lookupName))
-            lookupName = &(*left->getType().getStruct())[blockIndex].type->getFieldName();
-    }
-
-    // Lookup the symbol, should only fail if shader code is incorrect
-    symbol = symbolTable.find(*lookupName);
-    if (symbol == nullptr)
-        return;
-
-    if (symbol->getAsFunction()) {
-        error(loc, "array variable name expected", symbol->getName().c_str(), "");
-        return;
-    }
-
-    if (symbol->getType().isStruct() && blockIndex != -1)
-        (*symbol->getWritableType().getStruct())[blockIndex].type->setImplicitArraySize(index + 1);
+    // check for additional things allowed by GL_EXT_nonuniform_qualifier
+    if (base.getBasicType() == EbtSampler ||
+            (base.getBasicType() == EbtBlock && base.getType().getQualifier().isUniformOrBuffer()))
+        requireExtensions(loc, 1, &E_GL_EXT_nonuniform_qualifier, "variable index");
     else
-        symbol->getWritableType().setImplicitArraySize(index + 1);
+        error(loc, "", "[", "array must be redeclared with a size before being indexed with a variable");
 }
 
+// Policy decision for whether a run-time .length() is allowed.
+bool TParseContext::isRuntimeLength(const TIntermTyped& base) const
+{
+    if (base.getType().getQualifier().storage == EvqBuffer) {
+        // in a buffer block
+        const TIntermBinary* binary = base.getAsBinaryNode();
+        if (binary != nullptr && binary->getOp() == EOpIndexDirectStruct) {
+            // is it the last member?
+            const int index = binary->getRight()->getAsConstantUnion()->getConstArray()[0].getIConst();
+            const int memberCount = (int)binary->getLeft()->getType().getStruct()->size();
+            if (index == memberCount - 1)
+                return true;
+        }
+    }
+
+    return false;
+}
+
+#ifdef NV_EXTENSIONS
+// Fix mesh view output array dimension
+void TParseContext::resizeMeshViewDimension(const TSourceLoc& loc, TType& type)
+{
+    // see if member is a per-view attribute
+    if (type.getQualifier().isPerView()) {
+        // since we don't have the maxMeshViewCountNV set during parsing builtins, we hardcode the value
+        int maxViewCount = parsingBuiltins ? 4 : resources.maxMeshViewCountNV;
+
+        if (! type.isArray()) {
+            error(loc, "requires an view array dimension", "perviewNV", "");
+        }
+        else if (!type.isUnsizedArray() && type.getOuterArraySize() != maxViewCount) {
+            error(loc, "mesh view output array size must be gl_MaxMeshViewCountNV or implicitly sized", "[]", "");
+        }
+        else if (type.isUnsizedArray()) {
+            type.changeOuterArraySize(maxViewCount);
+        }
+    }
+}
+#endif
+
 // Returns true if the first argument to the #line directive is the line number for the next line.
 //
 // Desktop, pre-version 3.30:  "After processing this directive
@@ -3182,7 +3854,8 @@
         return nullptr;
 
     bool nonEsRedecls = (profile != EEsProfile && (version >= 130 || identifier == "gl_TexCoord"));
-    bool    esRedecls = (profile == EEsProfile && extensionsTurnedOn(Num_AEP_shader_io_blocks, AEP_shader_io_blocks));
+    bool    esRedecls = (profile == EEsProfile &&
+                         (version >= 320 || extensionsTurnedOn(Num_AEP_shader_io_blocks, AEP_shader_io_blocks)));
     if (! esRedecls && ! nonEsRedecls)
         return nullptr;
 
@@ -3209,6 +3882,8 @@
          identifier == "gl_BackSecondaryColor"                                                      ||
          identifier == "gl_SecondaryColor"                                                          ||
         (identifier == "gl_Color"               && language == EShLangFragment)                     ||
+        (identifier == "gl_FragStencilRefARB"   && (nonEsRedecls && version >= 140)
+                                                && language == EShLangFragment)                     ||
 #ifdef NV_EXTENSIONS
          identifier == "gl_SampleMask"                                                              ||
          identifier == "gl_Layer"                                                                   ||
@@ -3291,6 +3966,12 @@
                     error(loc, "all redeclarations must use the same depth layout on", "redeclaration", symbol->getName().c_str());
             }
         }
+        else if (identifier == "gl_FragStencilRefARB") {
+            if (qualifier.hasLayout())
+                error(loc, "cannot apply layout qualifier to", "redeclaration", symbol->getName().c_str());
+            if (qualifier.storage != EvqVaryingOut)
+                error(loc, "cannot change output storage qualification of", "redeclaration", symbol->getName().c_str());
+        }
 #ifdef NV_EXTENSIONS
         else if (identifier == "gl_SampleMask") {
             if (!publicType.layoutOverrideCoverage) {
@@ -3318,13 +3999,19 @@
 // Either redeclare the requested block, or give an error message why it can't be done.
 //
 // TODO: functionality: explicitly sizing members of redeclared blocks is not giving them an explicit size
-void TParseContext::redeclareBuiltinBlock(const TSourceLoc& loc, TTypeList& newTypeList, const TString& blockName, const TString* instanceName, TArraySizes* arraySizes)
+void TParseContext::redeclareBuiltinBlock(const TSourceLoc& loc, TTypeList& newTypeList, const TString& blockName,
+    const TString* instanceName, TArraySizes* arraySizes)
 {
     const char* feature = "built-in block redeclaration";
-    profileRequires(loc, EEsProfile, 0, Num_AEP_shader_io_blocks, AEP_shader_io_blocks, feature);
+    profileRequires(loc, EEsProfile, 320, Num_AEP_shader_io_blocks, AEP_shader_io_blocks, feature);
     profileRequires(loc, ~EEsProfile, 410, E_GL_ARB_separate_shader_objects, feature);
 
-    if (blockName != "gl_PerVertex" && blockName != "gl_PerFragment") {
+    if (blockName != "gl_PerVertex" && blockName != "gl_PerFragment"
+#ifdef NV_EXTENSIONS
+        && blockName != "gl_MeshPerVertexNV" && blockName != "gl_MeshPerPrimitiveNV"
+#endif
+       )
+    {
         error(loc, "cannot redeclare block: ", "block declaration", blockName.c_str());
         return;
     }
@@ -3367,17 +4054,25 @@
         return;
     }
 
+    // Fix XFB stuff up, it applies to the order of the redeclaration, not
+    // the order of the original members.
+    if (currentBlockQualifier.storage == EvqVaryingOut && globalOutputDefaults.hasXfbBuffer()) {
+        if (!currentBlockQualifier.hasXfbBuffer())
+            currentBlockQualifier.layoutXfbBuffer = globalOutputDefaults.layoutXfbBuffer;
+        fixXfbOffsets(currentBlockQualifier, newTypeList);
+    }
+
     // Edit and error check the container against the redeclaration
     //  - remove unused members
     //  - ensure remaining qualifiers/types match
+
     TType& type = block->getWritableType();
 
 #ifdef NV_EXTENSIONS
     // if gl_PerVertex is redeclared for the purpose of passing through "gl_Position"
-    // for passthrough purpose, the redclared block should have the same qualifers as
+    // for passthrough purpose, the redeclared block should have the same qualifers as
     // the current one
-    if (currentBlockQualifier.layoutPassthrough)
-    {
+    if (currentBlockQualifier.layoutPassthrough) {
         type.getQualifier().layoutPassthrough = currentBlockQualifier.layoutPassthrough;
         type.getQualifier().storage = currentBlockQualifier.storage;
         type.getQualifier().layoutStream = currentBlockQualifier.layoutStream;
@@ -3412,16 +4107,40 @@
                 error(memberLoc, "cannot redeclare block member with a different type", member->type->getFieldName().c_str(), "");
             if (oldType.isArray() != newType.isArray())
                 error(memberLoc, "cannot change arrayness of redeclared block member", member->type->getFieldName().c_str(), "");
-            else if (! oldType.sameArrayness(newType) && oldType.isExplicitlySizedArray())
+            else if (! oldType.getQualifier().isPerView() && ! oldType.sameArrayness(newType) && oldType.isSizedArray())
                 error(memberLoc, "cannot change array size of redeclared block member", member->type->getFieldName().c_str(), "");
-            else if (newType.isArray())
+            else if (! oldType.getQualifier().isPerView() && newType.isArray())
                 arrayLimitCheck(loc, member->type->getFieldName(), newType.getOuterArraySize());
+#ifdef NV_EXTENSIONS
+            if (oldType.getQualifier().isPerView() && ! newType.getQualifier().isPerView())
+                error(memberLoc, "missing perviewNV qualifier to redeclared block member", member->type->getFieldName().c_str(), "");
+            else if (! oldType.getQualifier().isPerView() && newType.getQualifier().isPerView())
+                error(memberLoc, "cannot add perviewNV qualifier to redeclared block member", member->type->getFieldName().c_str(), "");
+            else if (newType.getQualifier().isPerView()) {
+                if (oldType.getArraySizes()->getNumDims() != newType.getArraySizes()->getNumDims())
+                    error(memberLoc, "cannot change arrayness of redeclared block member", member->type->getFieldName().c_str(), "");
+                else if (! newType.isUnsizedArray() && newType.getOuterArraySize() != resources.maxMeshViewCountNV)
+                    error(loc, "mesh view output array size must be gl_MaxMeshViewCountNV or implicitly sized", "[]", "");
+                else if (newType.getArraySizes()->getNumDims() == 2) {
+                    int innerDimSize = newType.getArraySizes()->getDimSize(1);
+                    arrayLimitCheck(memberLoc, member->type->getFieldName(), innerDimSize);
+                    oldType.getArraySizes()->setDimSize(1, innerDimSize);
+                }
+            }
+            if (oldType.getQualifier().isPerPrimitive() && ! newType.getQualifier().isPerPrimitive())
+                error(memberLoc, "missing perprimitiveNV qualifier to redeclared block member", member->type->getFieldName().c_str(), "");
+            else if (! oldType.getQualifier().isPerPrimitive() && newType.getQualifier().isPerPrimitive())
+                error(memberLoc, "cannot add perprimitiveNV qualifier to redeclared block member", member->type->getFieldName().c_str(), "");
+#endif
             if (newType.getQualifier().isMemory())
                 error(memberLoc, "cannot add memory qualifier to redeclared block member", member->type->getFieldName().c_str(), "");
-            if (newType.getQualifier().hasLayout())
-                error(memberLoc, "cannot add layout to redeclared block member", member->type->getFieldName().c_str(), "");
+            if (newType.getQualifier().hasNonXfbLayout())
+                error(memberLoc, "cannot add non-XFB layout to redeclared block member", member->type->getFieldName().c_str(), "");
             if (newType.getQualifier().patch)
                 error(memberLoc, "cannot add patch to redeclared block member", member->type->getFieldName().c_str(), "");
+            if (newType.getQualifier().hasXfbBuffer() &&
+                newType.getQualifier().layoutXfbBuffer != currentBlockQualifier.layoutXfbBuffer)
+                error(memberLoc, "member cannot contradict block (or what block inherited from global)", "xfb_buffer", "");
             oldType.getQualifier().centroid = newType.getQualifier().centroid;
             oldType.getQualifier().sample = newType.getQualifier().sample;
             oldType.getQualifier().invariant = newType.getQualifier().invariant;
@@ -3429,18 +4148,21 @@
             oldType.getQualifier().smooth = newType.getQualifier().smooth;
             oldType.getQualifier().flat = newType.getQualifier().flat;
             oldType.getQualifier().nopersp = newType.getQualifier().nopersp;
-
-#ifdef NV_EXTENSIONS
-            if (member->type->getFieldName() == "gl_Layer") {
-                if (!newType.getQualifier().layoutViewportRelative && newType.getQualifier().layoutSecondaryViewportRelativeOffset == -2048)
-                    error(loc, "redeclaration only allowed for viewport_relative or secondary_view_offset layout", "redeclaration", member->type->getFieldName().c_str());
-                oldType.getQualifier().layoutViewportRelative = newType.getQualifier().layoutViewportRelative;
-                oldType.getQualifier().layoutSecondaryViewportRelativeOffset = newType.getQualifier().layoutSecondaryViewportRelativeOffset;
+            oldType.getQualifier().layoutXfbOffset = newType.getQualifier().layoutXfbOffset;
+            oldType.getQualifier().layoutXfbBuffer = newType.getQualifier().layoutXfbBuffer;
+            oldType.getQualifier().layoutXfbStride = newType.getQualifier().layoutXfbStride;
+            if (oldType.getQualifier().layoutXfbOffset != TQualifier::layoutXfbBufferEnd) {
+                // if any member as an xfb_offset, then the block's xfb_buffer inherents current xfb_buffer,
+                // and for xfb processing, the member needs it as well, along with xfb_stride
+                type.getQualifier().layoutXfbBuffer = currentBlockQualifier.layoutXfbBuffer;
+                oldType.getQualifier().layoutXfbBuffer = currentBlockQualifier.layoutXfbBuffer;
             }
-#endif
-            if (oldType.isImplicitlySizedArray() && newType.isExplicitlySizedArray())
+            if (oldType.isUnsizedArray() && newType.isSizedArray())
                 oldType.changeOuterArraySize(newType.getOuterArraySize());
 
+            //  check and process the member's type, which will include managing xfb information
+            layoutTypeCheck(loc, oldType);
+
             // go to next member
             ++member;
         } else {
@@ -3458,15 +4180,24 @@
 
     if (numOriginalMembersFound < newTypeList.size())
         error(loc, "block redeclaration has extra members", blockName.c_str(), "");
-    if (type.isArray() != (arraySizes != nullptr))
+    if (type.isArray() != (arraySizes != nullptr) ||
+        (type.isArray() && arraySizes != nullptr && type.getArraySizes()->getNumDims() != arraySizes->getNumDims()))
         error(loc, "cannot change arrayness of redeclared block", blockName.c_str(), "");
     else if (type.isArray()) {
-        if (type.isExplicitlySizedArray() && arraySizes->getOuterSize() == UnsizedArraySize)
-            error(loc, "block already declared with size, can't redeclare as implicitly-sized", blockName.c_str(), "");
-        else if (type.isExplicitlySizedArray() && type.getArraySizes() != *arraySizes)
-            error(loc, "cannot change array size of redeclared block", blockName.c_str(), "");
-        else if (type.isImplicitlySizedArray() && arraySizes->getOuterSize() != UnsizedArraySize)
+        // At this point, we know both are arrays and both have the same number of dimensions.
+
+        // It is okay for a built-in block redeclaration to be unsized, and keep the size of the
+        // original block declaration.
+        if (!arraySizes->isSized() && type.isSizedArray())
+            arraySizes->changeOuterSize(type.getOuterArraySize());
+
+        // And, okay to be giving a size to the array, by the redeclaration
+        if (!type.isSizedArray() && arraySizes->isSized())
             type.changeOuterArraySize(arraySizes->getOuterSize());
+
+        // Now, they must match in all dimensions.
+        if (type.isSizedArray() && *type.getArraySizes() != *arraySizes)
+            error(loc, "cannot change array size of redeclared block", blockName.c_str(), "");
     }
 
     symbolTable.insert(*block);
@@ -3477,7 +4208,7 @@
     // Tracking for implicit sizing of array
     if (isIoResizeArray(block->getType())) {
         ioArraySymbolResizeList.push_back(block);
-        checkIoArraysConsistency(loc, true);
+        checkIoArraysConsistency(loc, true, block->getType().getQualifier().isPerPrimitive());
     } else if (block->getType().isArray())
         fixIoArraySize(loc, block->getWritableType());
 
@@ -3485,7 +4216,7 @@
     trackLinkage(*block);
 }
 
-void TParseContext::paramCheckFix(const TSourceLoc& loc, const TStorageQualifier& qualifier, TType& type)
+void TParseContext::paramCheckFixStorage(const TSourceLoc& loc, const TStorageQualifier& qualifier, TType& type)
 {
     switch (qualifier) {
     case EvqConst:
@@ -3513,6 +4244,11 @@
     if (qualifier.isMemory()) {
         type.getQualifier().volatil   = qualifier.volatil;
         type.getQualifier().coherent  = qualifier.coherent;
+        type.getQualifier().devicecoherent  = qualifier.devicecoherent ;
+        type.getQualifier().queuefamilycoherent  = qualifier.queuefamilycoherent;
+        type.getQualifier().workgroupcoherent  = qualifier.workgroupcoherent;
+        type.getQualifier().subgroupcoherent  = qualifier.subgroupcoherent;
+        type.getQualifier().nonprivate = qualifier.nonprivate;
         type.getQualifier().readonly  = qualifier.readonly;
         type.getQualifier().writeonly = qualifier.writeonly;
         type.getQualifier().restrict  = qualifier.restrict;
@@ -3531,8 +4267,10 @@
         else
             warn(loc, "qualifier has no effect on non-output parameters", "precise", "");
     }
+    if (qualifier.isNonUniform())
+        type.getQualifier().nonUniform = qualifier.nonUniform;
 
-    paramCheckFix(loc, qualifier.storage, type);
+    paramCheckFixStorage(loc, qualifier.storage, type);
 }
 
 void TParseContext::nestedBlockCheck(const TSourceLoc& loc)
@@ -3564,6 +4302,39 @@
         error(loc, "can't use with samplers or structs containing samplers", op, "");
 }
 
+void TParseContext::storage16BitAssignmentCheck(const TSourceLoc& loc, const TType& type, const char* op)
+{
+    if (type.getBasicType() == EbtStruct && containsFieldWithBasicType(type, EbtFloat16))
+        requireFloat16Arithmetic(loc, op, "can't use with structs containing float16");
+
+    if (type.isArray() && type.getBasicType() == EbtFloat16)
+        requireFloat16Arithmetic(loc, op, "can't use with arrays containing float16");
+
+    if (type.getBasicType() == EbtStruct && containsFieldWithBasicType(type, EbtInt16))
+        requireInt16Arithmetic(loc, op, "can't use with structs containing int16");
+
+    if (type.isArray() && type.getBasicType() == EbtInt16)
+        requireInt16Arithmetic(loc, op, "can't use with arrays containing int16");
+
+    if (type.getBasicType() == EbtStruct && containsFieldWithBasicType(type, EbtUint16))
+        requireInt16Arithmetic(loc, op, "can't use with structs containing uint16");
+
+    if (type.isArray() && type.getBasicType() == EbtUint16)
+        requireInt16Arithmetic(loc, op, "can't use with arrays containing uint16");
+
+    if (type.getBasicType() == EbtStruct && containsFieldWithBasicType(type, EbtInt8))
+        requireInt8Arithmetic(loc, op, "can't use with structs containing int8");
+
+    if (type.isArray() && type.getBasicType() == EbtInt8)
+        requireInt8Arithmetic(loc, op, "can't use with arrays containing int8");
+
+    if (type.getBasicType() == EbtStruct && containsFieldWithBasicType(type, EbtUint8))
+        requireInt8Arithmetic(loc, op, "can't use with structs containing uint8");
+
+    if (type.isArray() && type.getBasicType() == EbtUint8)
+        requireInt8Arithmetic(loc, op, "can't use with arrays containing uint8");
+}
+
 void TParseContext::specializationCheck(const TSourceLoc& loc, const TType& type, const char* op)
 {
     if (type.containsSpecializationSize())
@@ -3719,6 +4490,12 @@
         limitCheck(loc, size, "gl_MaxClipDistances", "gl_ClipDistance array size");
     else if (identifier.compare("gl_CullDistance") == 0)
         limitCheck(loc, size, "gl_MaxCullDistances", "gl_CullDistance array size");
+#ifdef NV_EXTENSIONS
+    else if (identifier.compare("gl_ClipDistancePerViewNV") == 0)
+        limitCheck(loc, size, "gl_MaxClipDistances", "gl_ClipDistancePerViewNV array size");
+    else if (identifier.compare("gl_CullDistancePerViewNV") == 0)
+        limitCheck(loc, size, "gl_MaxCullDistances", "gl_CullDistancePerViewNV array size");
+#endif
 }
 
 // See if the provided value is less than or equal to the symbol indicated by limit,
@@ -3768,9 +4545,39 @@
         if (profile != EEsProfile && version < 430)
             requireExtensions(getCurrentLoc(), 1, &E_GL_ARB_compute_shader, "compute shaders");
         break;
+#ifdef NV_EXTENSIONS
+    case EShLangTaskNV:
+        requireExtensions(getCurrentLoc(), 1, &E_GL_NV_mesh_shader, "task shaders");
+        break;
+    case EShLangMeshNV:
+        requireExtensions(getCurrentLoc(), 1, &E_GL_NV_mesh_shader, "mesh shaders");
+        break;
+#endif
     default:
         break;
     }
+
+#ifdef NV_EXTENSIONS
+    // Set default outputs for GL_NV_geometry_shader_passthrough
+    if (language == EShLangGeometry && extensionTurnedOn(E_SPV_NV_geometry_shader_passthrough)) {
+        if (intermediate.getOutputPrimitive() == ElgNone) {
+            switch (intermediate.getInputPrimitive()) {
+            case ElgPoints:      intermediate.setOutputPrimitive(ElgPoints);    break;
+            case ElgLines:       intermediate.setOutputPrimitive(ElgLineStrip); break;
+            case ElgTriangles:   intermediate.setOutputPrimitive(ElgTriangleStrip); break;
+            default: break;
+            }
+        }
+        if (intermediate.getVertices() == TQualifier::layoutNotSet) {
+            switch (intermediate.getInputPrimitive()) {
+            case ElgPoints:      intermediate.setVertices(1); break;
+            case ElgLines:       intermediate.setVertices(2); break;
+            case ElgTriangles:   intermediate.setVertices(3); break;
+            default: break;
+            }
+        }
+    }
+#endif
 }
 
 //
@@ -3814,6 +4621,12 @@
         publicType.qualifier.layoutPacking = ElpStd430;
         return;
     }
+    if (id == TQualifier::getLayoutPackingString(ElpScalar)) {
+        requireVulkan(loc, "scalar");
+        requireExtensions(loc, 1, &E_GL_EXT_scalar_block_layout, "scalar block layout");
+        publicType.qualifier.layoutPacking = ElpScalar;
+        return;
+    }
     // TODO: compile-time performance: may need to stop doing linear searches
     for (TLayoutFormat format = (TLayoutFormat)(ElfNone + 1); format < ElfCount; format = (TLayoutFormat)(format + 1)) {
         if (id == TQualifier::getLayoutFormatString(format)) {
@@ -3832,44 +4645,57 @@
         publicType.qualifier.layoutPushConstant = true;
         return;
     }
-    if (language == EShLangGeometry || language == EShLangTessEvaluation) {
+    if (language == EShLangGeometry || language == EShLangTessEvaluation
+#ifdef NV_EXTENSIONS
+        || language == EShLangMeshNV
+#endif
+       ) {
         if (id == TQualifier::getGeometryString(ElgTriangles)) {
             publicType.shaderQualifiers.geometry = ElgTriangles;
             return;
         }
-        if (language == EShLangGeometry) {
+        if (language == EShLangGeometry
+#ifdef NV_EXTENSIONS
+            || language == EShLangMeshNV
+#endif
+           ) {
             if (id == TQualifier::getGeometryString(ElgPoints)) {
                 publicType.shaderQualifiers.geometry = ElgPoints;
                 return;
             }
-            if (id == TQualifier::getGeometryString(ElgLineStrip)) {
-                publicType.shaderQualifiers.geometry = ElgLineStrip;
-                return;
-            }
             if (id == TQualifier::getGeometryString(ElgLines)) {
                 publicType.shaderQualifiers.geometry = ElgLines;
                 return;
             }
-            if (id == TQualifier::getGeometryString(ElgLinesAdjacency)) {
-                publicType.shaderQualifiers.geometry = ElgLinesAdjacency;
-                return;
-            }
-            if (id == TQualifier::getGeometryString(ElgTrianglesAdjacency)) {
-                publicType.shaderQualifiers.geometry = ElgTrianglesAdjacency;
-                return;
-            }
-            if (id == TQualifier::getGeometryString(ElgTriangleStrip)) {
-                publicType.shaderQualifiers.geometry = ElgTriangleStrip;
-                return;
-            }
 #ifdef NV_EXTENSIONS
-            if (id == "passthrough") {
-               requireExtensions(loc, 1, &E_SPV_NV_geometry_shader_passthrough, "geometry shader passthrough");
-               publicType.qualifier.layoutPassthrough = true;
-               intermediate.setGeoPassthroughEXT();
-               return;
-            }
+            if (language == EShLangGeometry)
 #endif
+            {
+                if (id == TQualifier::getGeometryString(ElgLineStrip)) {
+                    publicType.shaderQualifiers.geometry = ElgLineStrip;
+                    return;
+                }
+                if (id == TQualifier::getGeometryString(ElgLinesAdjacency)) {
+                    publicType.shaderQualifiers.geometry = ElgLinesAdjacency;
+                    return;
+                }
+                if (id == TQualifier::getGeometryString(ElgTrianglesAdjacency)) {
+                    publicType.shaderQualifiers.geometry = ElgTrianglesAdjacency;
+                    return;
+                }
+                if (id == TQualifier::getGeometryString(ElgTriangleStrip)) {
+                    publicType.shaderQualifiers.geometry = ElgTriangleStrip;
+                    return;
+                }
+#ifdef NV_EXTENSIONS
+                if (id == "passthrough") {
+                    requireExtensions(loc, 1, &E_SPV_NV_geometry_shader_passthrough, "geometry shader passthrough");
+                    publicType.qualifier.layoutPassthrough = true;
+                    intermediate.setGeoPassthroughEXT();
+                    return;
+                }
+#endif
+            }
         } else {
             assert(language == EShLangTessEvaluation);
 
@@ -3935,6 +4761,14 @@
             publicType.shaderQualifiers.earlyFragmentTests = true;
             return;
         }
+        if (id == "post_depth_coverage") {
+            requireExtensions(loc, Num_post_depth_coverageEXTs, post_depth_coverageEXTs, "post depth coverage");
+            if (extensionTurnedOn(E_GL_ARB_post_depth_coverage)) {
+                publicType.shaderQualifiers.earlyFragmentTests = true;
+            }
+            publicType.shaderQualifiers.postDepthCoverage = true;
+            return;
+        }
         for (TLayoutDepth depth = (TLayoutDepth)(EldNone + 1); depth < EldCount; depth = (TLayoutDepth)(depth+1)) {
             if (id == TQualifier::getLayoutDepthString(depth)) {
                 requireProfile(loc, ECoreProfile | ECompatibilityProfile, "depth layout qualifier");
@@ -3947,7 +4781,8 @@
             bool found = false;
             for (TBlendEquationShift be = (TBlendEquationShift)0; be < EBlendCount; be = (TBlendEquationShift)(be + 1)) {
                 if (id == TQualifier::getBlendEquationString(be)) {
-                    requireExtensions(loc, 1, &E_GL_KHR_blend_equation_advanced, "blend equation");
+                    profileRequires(loc, EEsProfile, 320, E_GL_KHR_blend_equation_advanced, "blend equation");
+                    profileRequires(loc, ~EEsProfile, 0, E_GL_KHR_blend_equation_advanced, "blend equation");
                     intermediate.addBlendEquation(be);
                     publicType.shaderQualifiers.blendEquation = true;
                     found = true;
@@ -3974,6 +4809,27 @@
             publicType.qualifier.layoutViewportRelative = true;
             return;
         }
+    } else {
+        if (language == EShLangRayGenNV || language == EShLangIntersectNV ||
+        language == EShLangAnyHitNV || language == EShLangClosestHitNV ||
+        language == EShLangMissNV || language == EShLangCallableNV) {
+            if (id == "shaderrecordnv") {
+                publicType.qualifier.layoutShaderRecordNV = true;
+                return;
+            }
+        }
+    }
+    if (language == EShLangCompute) {
+        if (id.compare(0, 17, "derivative_group_") == 0) {
+            requireExtensions(loc, 1, &E_GL_NV_compute_shader_derivatives, "compute shader derivatives");
+            if (id == "derivative_group_quadsnv") {
+                publicType.shaderQualifiers.layoutDerivativeGroupQuads = true;
+                return;
+            } else if (id == "derivative_group_linearnv") {
+                publicType.shaderQualifiers.layoutDerivativeGroupLinear = true;
+                return;
+            }
+        }
     }
 #else
     }
@@ -4096,11 +4952,13 @@
         } else if (id == "xfb_stride") {
             // "The resulting stride (implicit or explicit), when divided by 4, must be less than or equal to the
             // implementation-dependent constant gl_MaxTransformFeedbackInterleavedComponents."
-            if (value > 4 * resources.maxTransformFeedbackInterleavedComponents)
-                error(loc, "1/4 stride is too large:", id.c_str(), "gl_MaxTransformFeedbackInterleavedComponents is %d", resources.maxTransformFeedbackInterleavedComponents);
-            else if (value >= (int)TQualifier::layoutXfbStrideEnd)
+            if (value > 4 * resources.maxTransformFeedbackInterleavedComponents) {
+                error(loc, "1/4 stride is too large:", id.c_str(), "gl_MaxTransformFeedbackInterleavedComponents is %d",
+                    resources.maxTransformFeedbackInterleavedComponents);
+            }
+            if (value >= (int)TQualifier::layoutXfbStrideEnd)
                 error(loc, "stride is too large:", id.c_str(), "internal max is %d", TQualifier::layoutXfbStrideEnd-1);
-            if (value < (int)TQualifier::layoutXfbStrideEnd)
+            else
                 publicType.qualifier.layoutXfbStride = value;
             return;
         }
@@ -4126,6 +4984,11 @@
         }
         return;
     }
+    if (id == "num_views") {
+        requireExtensions(loc, Num_OVR_multiview_EXTs, OVR_multiview_EXTs, "num_views");
+        publicType.shaderQualifiers.numViews = value;
+        return;
+    }
 
 #if NV_EXTENSIONS
     if (language == EShLangVertex ||
@@ -4198,10 +5061,43 @@
         }
         break;
 
+#ifdef NV_EXTENSIONS
+    case EShLangMeshNV:
+        if (id == "max_vertices") {
+            requireExtensions(loc, 1, &E_GL_NV_mesh_shader, "max_vertices");
+            publicType.shaderQualifiers.vertices = value;
+            if (value > resources.maxMeshOutputVerticesNV)
+                error(loc, "too large, must be less than gl_MaxMeshOutputVerticesNV", "max_vertices", "");
+            return;
+        }
+        if (id == "max_primitives") {
+            requireExtensions(loc, 1, &E_GL_NV_mesh_shader, "max_primitives");
+            publicType.shaderQualifiers.primitives = value;
+            if (value > resources.maxMeshOutputPrimitivesNV)
+                error(loc, "too large, must be less than gl_MaxMeshOutputPrimitivesNV", "max_primitives", "");
+            return;
+        }
+        // Fall through
+
+    case EShLangTaskNV:
+        // Fall through
+#endif
     case EShLangCompute:
         if (id.compare(0, 11, "local_size_") == 0) {
-            profileRequires(loc, EEsProfile, 310, 0, "gl_WorkGroupSize");
-            profileRequires(loc, ~EEsProfile, 430, E_GL_ARB_compute_shader, "gl_WorkGroupSize");
+#ifdef NV_EXTENSIONS
+            if (language == EShLangMeshNV || language == EShLangTaskNV) {
+                requireExtensions(loc, 1, &E_GL_NV_mesh_shader, "gl_WorkGroupSize");
+            }
+            else
+#endif
+            {
+                profileRequires(loc, EEsProfile, 310, 0, "gl_WorkGroupSize");
+                profileRequires(loc, ~EEsProfile, 430, E_GL_ARB_compute_shader, "gl_WorkGroupSize");
+            }
+            if (id.size() == 12 && value == 0) {
+                error(loc, "must be at least 1", id.c_str(), "");
+                return;
+            }
             if (id == "local_size_x") {
                 publicType.shaderQualifiers.localSize[0] = value;
                 return;
@@ -4252,7 +5148,6 @@
 // This is also true for overriding layout-qualifier-names, where one
 // overrides the other (e.g., row_major vs. column_major); only the last
 // occurrence has any effect."
-//
 void TParseContext::mergeObjectLayoutQualifiers(TQualifier& dst, const TQualifier& src, bool inheritOnly)
 {
     if (src.hasMatrix())
@@ -4307,6 +5202,10 @@
             dst.layoutViewportRelative = true;
         if (src.layoutSecondaryViewportRelativeOffset != -2048)
             dst.layoutSecondaryViewportRelativeOffset = src.layoutSecondaryViewportRelativeOffset;
+        if (src.layoutShaderRecordNV)
+            dst.layoutShaderRecordNV = true;
+        if (src.pervertexNV)
+            dst.pervertexNV = true;
 #endif
     }
 }
@@ -4334,6 +5233,26 @@
         }
     }
 
+    // user-variable location check, which are required for SPIR-V in/out:
+    //  - variables have it directly,
+    //  - blocks have it on each member (already enforced), so check first one
+    if (spvVersion.spv > 0 && !parsingBuiltins && qualifier.builtIn == EbvNone &&
+        !qualifier.hasLocation() && !intermediate.getAutoMapLocations()) {
+
+        switch (qualifier.storage) {
+        case EvqVaryingIn:
+        case EvqVaryingOut:
+            if (!type.getQualifier().isTaskMemory() &&
+                (type.getBasicType() != EbtBlock ||
+                 (!(*type.getStruct())[0].type->getQualifier().hasLocation() &&
+                   (*type.getStruct())[0].type->getQualifier().builtIn == EbvNone)))
+                error(loc, "SPIR-V requires location for user input/output", "location", "");
+            break;
+        default:
+            break;
+        }
+    }
+
     // Check packing and matrix
     if (qualifier.hasUniformLayout()) {
         switch (qualifier.storage) {
@@ -4352,6 +5271,10 @@
                     error(loc, "cannot specify on a variable declaration", "align", "");
                 if (qualifier.layoutPushConstant)
                     error(loc, "can only specify on a uniform block", "push_constant", "");
+#ifdef NV_EXTENSIONS
+                if (qualifier.layoutShaderRecordNV)
+                    error(loc, "can only specify on a buffer block", "shaderRecordNV", "");
+#endif
             }
             break;
         default:
@@ -4361,6 +5284,23 @@
     }
 }
 
+// "For some blocks declared as arrays, the location can only be applied at the block level:
+// When a block is declared as an array where additional locations are needed for each member
+// for each block array element, it is a compile-time error to specify locations on the block
+// members.  That is, when locations would be under specified by applying them on block members,
+// they are not allowed on block members.  For arrayed interfaces (those generally having an
+// extra level of arrayness due to interface expansion), the outer array is stripped before
+// applying this rule."
+void TParseContext::layoutMemberLocationArrayCheck(const TSourceLoc& loc, bool memberWithLocation,
+    TArraySizes* arraySizes)
+{
+    if (memberWithLocation && arraySizes != nullptr) {
+        if (arraySizes->getNumDims() > (currentBlockQualifier.isArrayedIo(language) ? 1 : 0))
+            error(loc, "cannot use in a block array where new locations are needed for each block element",
+                       "location", "");
+    }
+}
+
 // Do layout error checking with respect to a type.
 void TParseContext::layoutTypeCheck(const TSourceLoc& loc, const TType& type)
 {
@@ -4398,10 +5338,24 @@
         case EvqVaryingOut:
             if (type.getBasicType() == EbtBlock)
                 profileRequires(loc, ECoreProfile | ECompatibilityProfile, 440, E_GL_ARB_enhanced_layouts, "location qualifier on in/out block");
+#ifdef NV_EXTENSIONS
+            if (type.getQualifier().isTaskMemory())
+                error(loc, "cannot apply to taskNV in/out blocks", "location", "");
+#endif
             break;
         case EvqUniform:
         case EvqBuffer:
+            if (type.getBasicType() == EbtBlock)
+                error(loc, "cannot apply to uniform or buffer block", "location", "");
             break;
+#ifdef NV_EXTENSIONS
+        case EvqPayloadNV:
+        case EvqPayloadInNV:
+        case EvqHitAttrNV:
+        case EvqCallableDataNV:
+        case EvqCallableDataInNV:
+            break;
+#endif
         default:
             error(loc, "can only apply to uniform, buffer, in, or out storage qualifiers", "location", "");
             break;
@@ -4427,11 +5381,9 @@
         // containing a double, the offset must also be a multiple of 8..."
         if (type.containsBasicType(EbtDouble) && ! IsMultipleOfPow2(qualifier.layoutXfbOffset, 8))
             error(loc, "type contains double; xfb_offset must be a multiple of 8", "xfb_offset", "");
-#ifdef AMD_EXTENSIONS
         // ..., if applied to an aggregate containing a float16_t, the offset must also be a multiple of 2..."
         else if (type.containsBasicType(EbtFloat16) && !IsMultipleOfPow2(qualifier.layoutXfbOffset, 2))
             error(loc, "type contains half float; xfb_offset must be a multiple of 2", "xfb_offset", "");
-#endif
         else if (! IsMultipleOfPow2(qualifier.layoutXfbOffset, 4))
             error(loc, "must be a multiple of size of first component", "xfb_offset", "");
     }
@@ -4455,13 +5407,19 @@
         if (type.getBasicType() == EbtSampler) {
             int lastBinding = qualifier.layoutBinding;
             if (type.isArray()) {
-                if (type.isImplicitlySizedArray()) {
+                if (spvVersion.vulkan > 0)
                     lastBinding += 1;
-                    warn(loc, "assuming array size of one for compile-time checking of binding numbers for implicitly-sized array", "[]", "");
-                } else
-                    lastBinding += type.getCumulativeArraySize();
+                else {
+                    if (type.isSizedArray())
+                        lastBinding += type.getCumulativeArraySize();
+                    else {
+                        lastBinding += 1;
+                        if (spvVersion.vulkan == 0)
+                            warn(loc, "assuming binding count of one for compile-time checking of binding numbers for unsized array", "[]", "");
+                    }
+                }
             }
-            if (lastBinding >= resources.maxCombinedTextureImageUnits)
+            if (spvVersion.vulkan == 0 && lastBinding >= resources.maxCombinedTextureImageUnits)
                 error(loc, "sampler binding not less than gl_MaxCombinedTextureImageUnits", "binding", type.isArray() ? "(using array)" : "");
         }
         if (type.getBasicType() == EbtAtomicUint) {
@@ -4470,12 +5428,34 @@
                 return;
             }
         }
+    } else if (!intermediate.getAutoMapBindings()) {
+        // some types require bindings
+
+        // atomic_uint
+        if (type.getBasicType() == EbtAtomicUint)
+            error(loc, "layout(binding=X) is required", "atomic_uint", "");
+
+        // SPIR-V
+        if (spvVersion.spv > 0) {
+            if (qualifier.isUniformOrBuffer()) {
+                if (type.getBasicType() == EbtBlock && !qualifier.layoutPushConstant &&
+#ifdef NV_EXTENSIONS
+                       !qualifier.layoutShaderRecordNV &&
+#endif
+                       !qualifier.layoutAttachment)
+                    error(loc, "uniform/buffer blocks require layout(binding=X)", "binding", "");
+                else if (spvVersion.vulkan > 0 && type.getBasicType() == EbtSampler)
+                    error(loc, "sampler/texture/image requires layout(binding=X)", "binding", "");
+            }
+        }
     }
 
-    // atomic_uint
-    if (type.getBasicType() == EbtAtomicUint) {
-        if (! type.getQualifier().hasBinding())
-            error(loc, "layout(binding=X) is required", "atomic_uint", "");
+    // some things can't have arrays of arrays
+    if (type.isArrayOfArrays()) {
+        if (spvVersion.vulkan > 0) {
+            if (type.isOpaque() || (type.getQualifier().isUniformOrBuffer() && type.getBasicType() == EbtBlock))
+                warn(loc, "Generating SPIR-V array-of-arrays, but Vulkan only supports single array level for this resource", "[][]", "");
+        }
     }
 
     // "The offset qualifier can only be used on block members of blocks..."
@@ -4506,7 +5486,7 @@
             }
         }
     } else if (type.isImage() && ! qualifier.writeonly) {
-        const char *explanation = "image variables declared 'writeonly' without a format layout qualifier";
+        const char *explanation = "image variables not declared 'writeonly' and without a format layout qualifier";
         requireProfile(loc, ECoreProfile | ECompatibilityProfile, explanation);
         profileRequires(loc, ECoreProfile | ECompatibilityProfile, 0, E_GL_EXT_shader_image_load_formatted, explanation);
     }
@@ -4514,6 +5494,11 @@
     if (qualifier.layoutPushConstant && type.getBasicType() != EbtBlock)
         error(loc, "can only be used with a block", "push_constant", "");
 
+#ifdef NV_EXTENSIONS
+    if (qualifier.layoutShaderRecordNV && type.getBasicType() != EbtBlock)
+        error(loc, "can only be used with a block", "shaderRecordNV", "");
+#endif
+
     // input attachment
     if (type.isSubpass()) {
         if (! qualifier.hasAttachment())
@@ -4531,6 +5516,10 @@
             error(loc, "can only be applied to a scalar", "constant_id", "");
         switch (type.getBasicType())
         {
+        case EbtInt8:
+        case EbtUint8:
+        case EbtInt16:
+        case EbtUint16:
         case EbtInt:
         case EbtUint:
         case EbtInt64:
@@ -4538,9 +5527,7 @@
         case EbtBool:
         case EbtFloat:
         case EbtDouble:
-#ifdef AMD_EXTENSIONS
         case EbtFloat16:
-#endif
             break;
         default:
             error(loc, "cannot be applied to this type", "constant_id", "");
@@ -4622,19 +5609,19 @@
     }
 
     if (qualifier.hasBinding()) {
-        if (! qualifier.isUniformOrBuffer())
+        if (! qualifier.isUniformOrBuffer() && !qualifier.isTaskMemory())
             error(loc, "requires uniform or buffer storage qualifier", "binding", "");
     }
     if (qualifier.hasStream()) {
-        if (qualifier.storage != EvqVaryingOut)
+        if (!qualifier.isPipeOutput())
             error(loc, "can only be used on an output", "stream", "");
     }
     if (qualifier.hasXfb()) {
-        if (qualifier.storage != EvqVaryingOut)
+        if (!qualifier.isPipeOutput())
             error(loc, "can only be used on an output", "xfb layout qualifier", "");
     }
     if (qualifier.hasUniformLayout()) {
-        if (! qualifier.isUniformOrBuffer()) {
+        if (! qualifier.isUniformOrBuffer() && !qualifier.isTaskMemory()) {
             if (qualifier.hasMatrix() || qualifier.hasPacking())
                 error(loc, "matrix or packing qualifiers can only be used on a uniform or buffer", "layout", "");
             if (qualifier.hasOffset() || qualifier.hasAlign())
@@ -4647,6 +5634,20 @@
         if (qualifier.hasSet())
             error(loc, "cannot be used with push_constant", "set", "");
     }
+#ifdef NV_EXTENSIONS
+    if (qualifier.layoutShaderRecordNV) {
+        if (qualifier.storage != EvqBuffer)
+            error(loc, "can only be used with a buffer", "shaderRecordNV", "");
+        if (qualifier.hasBinding())
+            error(loc, "cannot be used with shaderRecordNV", "binding", "");
+        if (qualifier.hasSet())
+            error(loc, "cannot be used with shaderRecordNV", "set", "");
+
+    }
+    if (qualifier.storage == EvqHitAttrNV && qualifier.hasLayout()) {
+        error(loc, "cannot apply layout qualifiers to hitAttributeNV variable", "hitAttributeNV", "");
+    }
+#endif
 }
 
 // For places that can't have shader-level layout qualifiers
@@ -4656,25 +5657,48 @@
 
     if (shaderQualifiers.geometry != ElgNone)
         error(loc, message, TQualifier::getGeometryString(shaderQualifiers.geometry), "");
+    if (shaderQualifiers.spacing != EvsNone)
+        error(loc, message, TQualifier::getVertexSpacingString(shaderQualifiers.spacing), "");
+    if (shaderQualifiers.order != EvoNone)
+        error(loc, message, TQualifier::getVertexOrderString(shaderQualifiers.order), "");
+    if (shaderQualifiers.pointMode)
+        error(loc, message, "point_mode", "");
     if (shaderQualifiers.invocations != TQualifier::layoutNotSet)
         error(loc, message, "invocations", "");
-    if (shaderQualifiers.vertices != TQualifier::layoutNotSet) {
-        if (language == EShLangGeometry)
-            error(loc, message, "max_vertices", "");
-        else if (language == EShLangTessControl)
-            error(loc, message, "vertices", "");
-        else
-            assert(0);
-    }
+    if (shaderQualifiers.earlyFragmentTests)
+        error(loc, message, "early_fragment_tests", "");
+    if (shaderQualifiers.postDepthCoverage)
+        error(loc, message, "post_depth_coverage", "");
     for (int i = 0; i < 3; ++i) {
         if (shaderQualifiers.localSize[i] > 1)
             error(loc, message, "local_size", "");
         if (shaderQualifiers.localSizeSpecId[i] != TQualifier::layoutNotSet)
             error(loc, message, "local_size id", "");
     }
+    if (shaderQualifiers.vertices != TQualifier::layoutNotSet) {
+        if (language == EShLangGeometry
+#ifdef NV_EXTENSIONS
+            || language == EShLangMeshNV
+#endif
+           )
+            error(loc, message, "max_vertices", "");
+        else if (language == EShLangTessControl)
+            error(loc, message, "vertices", "");
+        else
+            assert(0);
+    }
+#ifdef NV_EXTENSIONS
+    if (shaderQualifiers.primitives != TQualifier::layoutNotSet) {
+        if (language == EShLangMeshNV)
+            error(loc, message, "max_primitives", "");
+        else
+            assert(0);
+    }
+#endif
     if (shaderQualifiers.blendEquation)
         error(loc, message, "blend equation", "");
-    // TBD: correctness: are any of these missing?  pixelCenterInteger, originUpperLeft, spacing, order, pointmode, earlyfragment, depth
+    if (shaderQualifiers.numViews != TQualifier::layoutNotSet)
+        error(loc, message, "num_views", "");
 }
 
 // Correct and/or advance an object's offset layout qualifier.
@@ -4695,15 +5719,11 @@
             // Check for overlap
             int numOffsets = 4;
             if (symbol.getType().isArray()) {
-                if (symbol.getType().isExplicitlySizedArray())
+                if (symbol.getType().isSizedArray() && !symbol.getType().getArraySizes()->isInnerUnsized())
                     numOffsets *= symbol.getType().getCumulativeArraySize();
                 else {
-                    // TODO: functionality: implicitly-sized atomic_uint arrays.
-                    // We don't know the full size until later.  This might
-                    // be a specification problem, will report to Khronos.  For the
-                    // cases that is not true, the rest of the checking would need
-                    // to be done at link time instead of compile time.
-                    warn(loc, "implicitly sized atomic_uint array treated as having one element for tracking the default offset", "atomic_uint", "");
+                    // "It is a compile-time error to declare an unsized array of atomic_uint."
+                    error(loc, "array must be explicitly sized", "atomic_uint", "");
                 }
             }
             int repeated = intermediate.addUsedOffsets(qualifier.layoutBinding, offset, numOffsets);
@@ -4730,10 +5750,21 @@
         return nullptr;
     }
 
+    bool explicitTypesEnabled = extensionTurnedOn(E_GL_EXT_shader_explicit_arithmetic_types) ||
+                                extensionTurnedOn(E_GL_EXT_shader_explicit_arithmetic_types_int8) ||
+                                extensionTurnedOn(E_GL_EXT_shader_explicit_arithmetic_types_int16) ||
+                                extensionTurnedOn(E_GL_EXT_shader_explicit_arithmetic_types_int32) ||
+                                extensionTurnedOn(E_GL_EXT_shader_explicit_arithmetic_types_int64) ||
+                                extensionTurnedOn(E_GL_EXT_shader_explicit_arithmetic_types_float16) ||
+                                extensionTurnedOn(E_GL_EXT_shader_explicit_arithmetic_types_float32) ||
+                                extensionTurnedOn(E_GL_EXT_shader_explicit_arithmetic_types_float64);
+
     if (profile == EEsProfile || version < 120)
         function = findFunctionExact(loc, call, builtIn);
     else if (version < 400)
         function = findFunction120(loc, call, builtIn);
+    else if (explicitTypesEnabled)
+        function = findFunctionExplicitTypes(loc, call, builtIn);
     else
         function = findFunction400(loc, call, builtIn);
 
@@ -4918,6 +5949,85 @@
     return bestMatch;
 }
 
+// "To determine whether the conversion for a single argument in one match
+//  is better than that for another match, the conversion is assigned of the
+//  three ranks ordered from best to worst:
+//   1. Exact match: no conversion.
+//    2. Promotion: integral or floating-point promotion.
+//    3. Conversion: integral conversion, floating-point conversion,
+//       floating-integral conversion.
+//  A conversion C1 is better than a conversion C2 if the rank of C1 is
+//  better than the rank of C2."
+const TFunction* TParseContext::findFunctionExplicitTypes(const TSourceLoc& loc, const TFunction& call, bool& builtIn)
+{
+    // first, look for an exact match
+    TSymbol* symbol = symbolTable.find(call.getMangledName(), &builtIn);
+    if (symbol)
+        return symbol->getAsFunction();
+
+    // no exact match, use the generic selector, parameterized by the GLSL rules
+
+    // create list of candidates to send
+    TVector<const TFunction*> candidateList;
+    symbolTable.findFunctionNameList(call.getMangledName(), candidateList, builtIn);
+
+    // can 'from' convert to 'to'?
+    const auto convertible = [this](const TType& from, const TType& to, TOperator, int) -> bool {
+        if (from == to)
+            return true;
+        if (from.isArray() || to.isArray() || ! from.sameElementShape(to))
+            return false;
+        return intermediate.canImplicitlyPromote(from.getBasicType(), to.getBasicType());
+    };
+
+    // Is 'to2' a better conversion than 'to1'?
+    // Ties should not be considered as better.
+    // Assumes 'convertible' already said true.
+    const auto better = [this](const TType& from, const TType& to1, const TType& to2) -> bool {
+        // 1. exact match
+        if (from == to2)
+            return from != to1;
+        if (from == to1)
+            return false;
+
+        // 2. Promotion (integral, floating-point) is better
+        TBasicType from_type = from.getBasicType();
+        TBasicType to1_type = to1.getBasicType();
+        TBasicType to2_type = to2.getBasicType();
+        bool isPromotion1 = (intermediate.isIntegralPromotion(from_type, to1_type) ||
+                             intermediate.isFPPromotion(from_type, to1_type));
+        bool isPromotion2 = (intermediate.isIntegralPromotion(from_type, to2_type) ||
+                             intermediate.isFPPromotion(from_type, to2_type));
+        if (isPromotion2)
+            return !isPromotion1;
+        if(isPromotion1)
+            return false;
+
+        // 3. Conversion (integral, floating-point , floating-integral)
+        bool isConversion1 = (intermediate.isIntegralConversion(from_type, to1_type) ||
+                              intermediate.isFPConversion(from_type, to1_type) ||
+                              intermediate.isFPIntegralConversion(from_type, to1_type));
+        bool isConversion2 = (intermediate.isIntegralConversion(from_type, to2_type) ||
+                              intermediate.isFPConversion(from_type, to2_type) ||
+                              intermediate.isFPIntegralConversion(from_type, to2_type));
+
+        return isConversion2 && !isConversion1;
+    };
+
+    // for ambiguity reporting
+    bool tie = false;
+
+    // send to the generic selector
+    const TFunction* bestMatch = selectFunction(candidateList, call, convertible, better, tie);
+
+    if (bestMatch == nullptr)
+        error(loc, "no matching overloaded function found", call.getName().c_str(), "");
+    else if (tie)
+        error(loc, "ambiguous best function under implicit type conversion", call.getName().c_str(), "");
+
+    return bestMatch;
+}
+
 // When a declaration includes a type, but not a variable name, it can be
 // to establish defaults.
 void TParseContext::declareTypeDefaults(const TSourceLoc& loc, const TPublicType& publicType)
@@ -4946,15 +6056,15 @@
 // 'publicType' is the type part of the declaration (to the left)
 // 'arraySizes' is the arrayness tagged on the identifier (to the right)
 //
-TIntermNode* TParseContext::declareVariable(const TSourceLoc& loc, TString& identifier, const TPublicType& publicType, TArraySizes* arraySizes, TIntermTyped* initializer)
+TIntermNode* TParseContext::declareVariable(const TSourceLoc& loc, TString& identifier, const TPublicType& publicType,
+    TArraySizes* arraySizes, TIntermTyped* initializer)
 {
-    TType type(publicType);  // shallow copy; 'type' shares the arrayness and structure definition with 'publicType'
-    if (type.isImplicitlySizedArray()) {
-        // Because "int[] a = int[2](...), b = int[3](...)" makes two arrays a and b
-        // of different sizes, for this case sharing the shallow copy of arrayness
-        // with the publicType oversubscribes it, so get a deep copy of the arrayness.
-        type.newArraySizes(*publicType.arraySizes);
-    }
+    // Make a fresh type that combines the characteristics from the individual
+    // identifier syntax and the declaration-type syntax.
+    TType type(publicType);
+    type.transferArraySizes(arraySizes);
+    type.copyArrayInnerSizes(publicType.arraySizes);
+    arrayOfArrayVersionCheck(loc, type.getArraySizes());
 
     if (voidErrorCheck(loc, identifier, type.getBasicType()))
         return nullptr;
@@ -4966,7 +6076,19 @@
 
     samplerCheck(loc, type, identifier, initializer);
     atomicUintCheck(loc, type, identifier);
-    transparentCheck(loc, type, identifier);
+    transparentOpaqueCheck(loc, type, identifier);
+#ifdef NV_EXTENSIONS
+    accStructNVCheck(loc, type, identifier);
+#endif
+
+    if (type.getQualifier().storage != EvqUniform && type.getQualifier().storage != EvqBuffer) {
+        if (type.containsBasicType(EbtFloat16))
+            requireFloat16Arithmetic(loc, "qualifier", "float16 types can only be in uniform block or buffer storage");
+        if (type.contains16BitInt())
+            requireInt16Arithmetic(loc, "qualifier", "(u)int16 types can only be in uniform block or buffer storage");
+        if (type.contains8BitInt())
+            requireInt8Arithmetic(loc, "qualifier", "(u)int8 types can only be in uniform block or buffer storage");
+    }
 
     if (identifier != "gl_FragCoord" && (publicType.shaderQualifiers.originUpperLeft || publicType.shaderQualifiers.pixelCenterInteger))
         error(loc, "can only apply origin_upper_left and pixel_center_origin to gl_FragCoord", "layout qualifier", "");
@@ -4981,15 +6103,9 @@
     inheritGlobalDefaults(type.getQualifier());
 
     // Declare the variable
-    if (arraySizes || type.isArray()) {
-        // Arrayness is potentially coming both from the type and from the
-        // variable: "int[] a[];" or just one or the other.
-        // Merge it all to the type, so all arrayness is part of the type.
-        arrayDimCheck(loc, &type, arraySizes);
-        arrayDimMerge(type, arraySizes);
-
+    if (type.isArray()) {
         // Check that implicit sizing is only where allowed.
-        arrayUnsizedCheck(loc, type.getQualifier(), &type.getArraySizes(), initializer != nullptr, false);
+        arraySizesCheck(loc, type.getQualifier(), type.getArraySizes(), initializer, false);
 
         if (! arrayQualifierError(loc, type.getQualifier()) && ! arrayError(loc, type))
             declareArray(loc, identifier, type, symbol);
@@ -5022,8 +6138,15 @@
 
     // look for errors in layout qualifier use
     layoutObjectCheck(loc, *symbol);
+
+    // fix up
     fixOffset(loc, *symbol);
 
+    if (symbol->getType().getBasicType() == EbtStruct) {
+       fixXfbOffsets(symbol->getWritableType().getQualifier(),
+                     *(symbol->getWritableType().getWritableStruct()));
+    }
+
     return initNode;
 }
 
@@ -5118,8 +6241,7 @@
     }
 
     // Fix outer arrayness if variable is unsized, getting size from the initializer
-    if (initializer->getType().isExplicitlySizedArray() &&
-        variable->getType().isImplicitlySizedArray())
+    if (initializer->getType().isSizedArray() && variable->getType().isUnsizedArray())
         variable->getWritableType().changeOuterArraySize(initializer->getType().getOuterArraySize());
 
     // Inner arrayness can also get set by an initializer
@@ -5128,8 +6250,10 @@
            variable->getType().getArraySizes()->getNumDims()) {
         // adopt unsized sizes from the initializer's sizes
         for (int d = 1; d < variable->getType().getArraySizes()->getNumDims(); ++d) {
-            if (variable->getType().getArraySizes()->getDimSize(d) == UnsizedArraySize)
-                variable->getWritableType().getArraySizes().setDimSize(d, initializer->getType().getArraySizes()->getDimSize(d));
+            if (variable->getType().getArraySizes()->getDimSize(d) == UnsizedArraySize) {
+                variable->getWritableType().getArraySizes()->setDimSize(d,
+                    initializer->getType().getArraySizes()->getDimSize(d));
+            }
         }
     }
 
@@ -5240,16 +6364,16 @@
         // Later on, initializer execution code will deal with array size logic.
         TType arrayType;
         arrayType.shallowCopy(type);                     // sharing struct stuff is fine
-        arrayType.newArraySizes(*type.getArraySizes());  // but get a fresh copy of the array information, to edit below
+        arrayType.copyArraySizes(*type.getArraySizes());  // but get a fresh copy of the array information, to edit below
 
         // edit array sizes to fill in unsized dimensions
         arrayType.changeOuterArraySize((int)initList->getSequence().size());
         TIntermTyped* firstInit = initList->getSequence()[0]->getAsTyped();
         if (arrayType.isArrayOfArrays() && firstInit->getType().isArray() &&
-            arrayType.getArraySizes().getNumDims() == firstInit->getType().getArraySizes()->getNumDims() + 1) {
-            for (int d = 1; d < arrayType.getArraySizes().getNumDims(); ++d) {
-                if (arrayType.getArraySizes().getDimSize(d) == UnsizedArraySize)
-                    arrayType.getArraySizes().setDimSize(d, firstInit->getType().getArraySizes()->getDimSize(d - 1));
+            arrayType.getArraySizes()->getNumDims() == firstInit->getType().getArraySizes()->getNumDims() + 1) {
+            for (int d = 1; d < arrayType.getArraySizes()->getNumDims(); ++d) {
+                if (arrayType.getArraySizes()->getDimSize(d) == UnsizedArraySize)
+                    arrayType.getArraySizes()->setDimSize(d, firstInit->getType().getArraySizes()->getDimSize(d - 1));
             }
         }
 
@@ -5306,6 +6430,9 @@
 // Test for the correctness of the parameters passed to various constructor functions
 // and also convert them to the right data type, if allowed and required.
 //
+// 'node' is what to construct from.
+// 'type' is what type to construct.
+//
 // Returns nullptr for an error or the constructed node (aggregate or typed) for no error.
 //
 TIntermTyped* TParseContext::addConstructor(const TSourceLoc& loc, TIntermNode* node, const TType& type)
@@ -5319,8 +6446,14 @@
 
     // Combined texture-sampler constructors are completely semantic checked
     // in constructorTextureSamplerError()
-    if (op == EOpConstructTextureSampler)
+    if (op == EOpConstructTextureSampler) {
+        if (aggrNode->getSequence()[1]->getAsTyped()->getType().getSampler().shadow) {
+            // Transfer depth into the texture (SPIR-V image) type, as a hint
+            // for tools to know this texture/image is a depth image.
+            aggrNode->getSequence()[0]->getAsTyped()->getWritableType().getSampler().shadow = true;
+        }
         return intermediate.setAggregateOperator(aggrNode, op, type, loc);
+    }
 
     TTypeList::const_iterator memberTypes;
     if (op == EOpConstructStruct)
@@ -5335,7 +6468,7 @@
 
     bool singleArg;
     if (aggrNode) {
-        if (aggrNode->getOp() != EOpNull || aggrNode->getSequence().size() == 1)
+        if (aggrNode->getOp() != EOpNull)
             singleArg = true;
         else
             singleArg = false;
@@ -5396,8 +6529,22 @@
 //
 // Returns nullptr for an error or the constructed node.
 //
-TIntermTyped* TParseContext::constructBuiltIn(const TType& type, TOperator op, TIntermTyped* node, const TSourceLoc& loc, bool subset)
+TIntermTyped* TParseContext::constructBuiltIn(const TType& type, TOperator op, TIntermTyped* node, const TSourceLoc& loc,
+    bool subset)
 {
+    // If we are changing a matrix in both domain of basic type and to a non matrix,
+    // do the shape change first (by default, below, basic type is changed before shape).
+    // This avoids requesting a matrix of a new type that is going to be discarded anyway.
+    // TODO: This could be generalized to more type combinations, but that would require
+    // more extensive testing and full algorithm rework. For now, the need to do two changes makes
+    // the recursive call work, and avoids the most aggregious case of creating integer matrices.
+    if (node->getType().isMatrix() && (type.isScalar() || type.isVector()) &&
+            type.isFloatingDomain() != node->getType().isFloatingDomain()) {
+        TType transitionType(node->getBasicType(), glslang::EvqTemporary, type.getVectorSize(), 0, 0, node->isVector());
+        TOperator transitionOp = intermediate.mapTypeToConstructorOp(transitionType);
+        node = constructBuiltIn(transitionType, transitionOp, node, loc, false);
+    }
+
     TIntermTyped* newNode;
     TOperator basicOp;
 
@@ -5437,7 +6584,6 @@
         basicOp = EOpConstructDouble;
         break;
 
-#ifdef AMD_EXTENSIONS
     case EOpConstructF16Vec2:
     case EOpConstructF16Vec3:
     case EOpConstructF16Vec4:
@@ -5453,7 +6599,34 @@
     case EOpConstructFloat16:
         basicOp = EOpConstructFloat16;
         break;
-#endif
+
+    case EOpConstructI8Vec2:
+    case EOpConstructI8Vec3:
+    case EOpConstructI8Vec4:
+    case EOpConstructInt8:
+        basicOp = EOpConstructInt8;
+        break;
+
+    case EOpConstructU8Vec2:
+    case EOpConstructU8Vec3:
+    case EOpConstructU8Vec4:
+    case EOpConstructUint8:
+        basicOp = EOpConstructUint8;
+        break;
+
+    case EOpConstructI16Vec2:
+    case EOpConstructI16Vec3:
+    case EOpConstructI16Vec4:
+    case EOpConstructInt16:
+        basicOp = EOpConstructInt16;
+        break;
+
+    case EOpConstructU16Vec2:
+    case EOpConstructU16Vec3:
+    case EOpConstructU16Vec4:
+    case EOpConstructUint16:
+        basicOp = EOpConstructUint16;
+        break;
 
     case EOpConstructIVec2:
     case EOpConstructIVec3:
@@ -5490,6 +6663,11 @@
         basicOp = EOpConstructBool;
         break;
 
+    case EOpConstructNonuniform:
+        node->getWritableType().getQualifier().nonUniform = true;
+        return node;
+        break;
+
     default:
         error(loc, "unsupported construction", "", "");
 
@@ -5534,13 +6712,14 @@
 //
 // Do everything needed to add an interface block.
 //
-void TParseContext::declareBlock(const TSourceLoc& loc, TTypeList& typeList, const TString* instanceName, TArraySizes* arraySizes)
+void TParseContext::declareBlock(const TSourceLoc& loc, TTypeList& typeList, const TString* instanceName,
+    TArraySizes* arraySizes)
 {
     blockStageIoCheck(loc, currentBlockQualifier);
     blockQualifierCheck(loc, currentBlockQualifier, instanceName != nullptr);
-    if (arraySizes) {
-        arrayUnsizedCheck(loc, currentBlockQualifier, arraySizes, false, false);
-        arrayDimCheck(loc, arraySizes, 0);
+    if (arraySizes != nullptr) {
+        arraySizesCheck(loc, currentBlockQualifier, arraySizes, nullptr, false);
+        arrayOfArrayVersionCheck(loc, arraySizes);
         if (arraySizes->getNumDims() > 1)
             requireProfile(loc, ~EEsProfile, "array-of-array of block");
     }
@@ -5554,10 +6733,18 @@
         if (memberQualifier.storage != EvqTemporary && memberQualifier.storage != EvqGlobal && memberQualifier.storage != currentBlockQualifier.storage)
             error(memberLoc, "member storage qualifier cannot contradict block storage qualifier", memberType.getFieldName().c_str(), "");
         memberQualifier.storage = currentBlockQualifier.storage;
+#ifdef NV_EXTENSIONS
+        if (currentBlockQualifier.perPrimitiveNV)
+            memberQualifier.perPrimitiveNV = currentBlockQualifier.perPrimitiveNV;
+        if (currentBlockQualifier.perViewNV)
+            memberQualifier.perViewNV = currentBlockQualifier.perViewNV;
+        if (currentBlockQualifier.perTaskNV)
+            memberQualifier.perTaskNV = currentBlockQualifier.perTaskNV;
+#endif
         if ((currentBlockQualifier.storage == EvqUniform || currentBlockQualifier.storage == EvqBuffer) && (memberQualifier.isInterpolation() || memberQualifier.isAuxiliary()))
             error(memberLoc, "member of uniform or buffer block cannot have an auxiliary or interpolation qualifier", memberType.getFieldName().c_str(), "");
         if (memberType.isArray())
-            arrayUnsizedCheck(memberLoc, currentBlockQualifier, &memberType.getArraySizes(), false, member == typeList.size() - 1);
+            arraySizesCheck(memberLoc, currentBlockQualifier, memberType.getArraySizes(), nullptr, member == typeList.size() - 1);
         if (memberQualifier.hasOffset()) {
             if (spvVersion.spv == 0) {
                 requireProfile(memberLoc, ~EEsProfile, "offset on block member");
@@ -5596,23 +6783,38 @@
 
     // Special case for "push_constant uniform", which has a default of std430,
     // contrary to normal uniform defaults, and can't have a default tracked for it.
-    if (currentBlockQualifier.layoutPushConstant && !currentBlockQualifier.hasPacking())
+    if ((currentBlockQualifier.layoutPushConstant && !currentBlockQualifier.hasPacking())
+#ifdef NV_EXTENSIONS
+        || (currentBlockQualifier.layoutShaderRecordNV && !currentBlockQualifier.hasPacking())
+#endif
+       )
         currentBlockQualifier.layoutPacking = ElpStd430;
 
+#ifdef NV_EXTENSIONS
+    // Special case for "taskNV in/out", which has a default of std430,
+    if (currentBlockQualifier.perTaskNV && !currentBlockQualifier.hasPacking())
+        currentBlockQualifier.layoutPacking = ElpStd430;
+#endif
+
     // fix and check for member layout qualifiers
 
     mergeObjectLayoutQualifiers(defaultQualification, currentBlockQualifier, true);
 
     // "The align qualifier can only be used on blocks or block members, and only for blocks declared with std140 or std430 layouts."
     if (currentBlockQualifier.hasAlign()) {
-        if (defaultQualification.layoutPacking != ElpStd140 && defaultQualification.layoutPacking != ElpStd430) {
-            error(loc, "can only be used with std140 or std430 layout packing", "align", "");
+        if (defaultQualification.layoutPacking != ElpStd140 &&
+            defaultQualification.layoutPacking != ElpStd430 &&
+            defaultQualification.layoutPacking != ElpScalar) {
+            error(loc, "can only be used with std140, std430, or scalar layout packing", "align", "");
             defaultQualification.layoutAlign = -1;
         }
     }
 
     bool memberWithLocation = false;
     bool memberWithoutLocation = false;
+#ifdef NV_EXTENSIONS
+    bool memberWithPerViewQualifier = false;
+#endif
     for (unsigned int member = 0; member < typeList.size(); ++member) {
         TQualifier& memberQualifier = typeList[member].type->getQualifier();
         const TSourceLoc& memberLoc = typeList[member].loc;
@@ -5639,7 +6841,7 @@
             case EvqVaryingOut:
                 requireProfile(memberLoc, ECoreProfile | ECompatibilityProfile | EEsProfile, feature);
                 profileRequires(memberLoc, ECoreProfile | ECompatibilityProfile, 440, E_GL_ARB_enhanced_layouts, feature);
-                profileRequires(memberLoc, EEsProfile, 0, Num_AEP_shader_io_blocks, AEP_shader_io_blocks, feature);
+                profileRequires(memberLoc, EEsProfile, 320, Num_AEP_shader_io_blocks, AEP_shader_io_blocks, feature);
                 memberWithLocation = true;
                 break;
             default:
@@ -5652,22 +6854,50 @@
         // "The offset qualifier can only be used on block members of blocks declared with std140 or std430 layouts."
         // "The align qualifier can only be used on blocks or block members, and only for blocks declared with std140 or std430 layouts."
         if (memberQualifier.hasAlign() || memberQualifier.hasOffset()) {
-            if (defaultQualification.layoutPacking != ElpStd140 && defaultQualification.layoutPacking != ElpStd430)
-                error(memberLoc, "can only be used with std140 or std430 layout packing", "offset/align", "");
+            if (defaultQualification.layoutPacking != ElpStd140 &&
+                defaultQualification.layoutPacking != ElpStd430 &&
+                defaultQualification.layoutPacking != ElpScalar)
+                error(memberLoc, "can only be used with std140, std430, or scalar layout packing", "offset/align", "");
         }
 
+#ifdef NV_EXTENSIONS
+        if (memberQualifier.isPerView()) {
+            memberWithPerViewQualifier = true;
+        }
+#endif
+
         TQualifier newMemberQualification = defaultQualification;
         mergeQualifiers(memberLoc, newMemberQualification, memberQualifier, false);
         memberQualifier = newMemberQualification;
     }
 
+    layoutMemberLocationArrayCheck(loc, memberWithLocation, arraySizes);
+
+    // Ensure that the block has an XfbBuffer assigned. This is needed
+    // because if the block has a XfbOffset assigned, then it is
+    // assumed that it has implicitly assigned the current global
+    // XfbBuffer, and because it's members need to be assigned a
+    // XfbOffset if they lack it.
+    if (currentBlockQualifier.storage == EvqVaryingOut && globalOutputDefaults.hasXfbBuffer()) {
+       if (!currentBlockQualifier.hasXfbBuffer() && currentBlockQualifier.hasXfbOffset())
+          currentBlockQualifier.layoutXfbBuffer = globalOutputDefaults.layoutXfbBuffer;
+    }
+
     // Process the members
     fixBlockLocations(loc, currentBlockQualifier, typeList, memberWithLocation, memberWithoutLocation);
-    fixBlockXfbOffsets(currentBlockQualifier, typeList);
+    fixXfbOffsets(currentBlockQualifier, typeList);
     fixBlockUniformOffsets(currentBlockQualifier, typeList);
     for (unsigned int member = 0; member < typeList.size(); ++member)
         layoutTypeCheck(typeList[member].loc, *typeList[member].type);
 
+#ifdef NV_EXTENSIONS
+    if (memberWithPerViewQualifier) {
+        for (unsigned int member = 0; member < typeList.size(); ++member) {
+            resizeMeshViewDimension(typeList[member].loc, *typeList[member].type);
+        }
+    }
+#endif
+
     // reverse merge, so that currentBlockQualifier now has all layout information
     // (can't use defaultQualification directly, it's missing other non-layout-default-class qualifiers)
     mergeObjectLayoutQualifiers(currentBlockQualifier, defaultQualification, true);
@@ -5677,8 +6907,8 @@
     //
 
     TType blockType(&typeList, *blockName, currentBlockQualifier);
-    if (arraySizes)
-        blockType.newArraySizes(*arraySizes);
+    if (arraySizes != nullptr)
+        blockType.transferArraySizes(arraySizes);
     else
         ioArrayCheck(loc, blockType, instanceName ? *instanceName : *blockName);
 
@@ -5728,9 +6958,10 @@
     // Check for general layout qualifier errors
     layoutObjectCheck(loc, variable);
 
+    // fix up
     if (isIoResizeArray(blockType)) {
         ioArraySymbolResizeList.push_back(&variable);
-        checkIoArraysConsistency(loc, true);
+        checkIoArraysConsistency(loc, true, blockType.getQualifier().isPerPrimitive());
     } else
         fixIoArraySize(loc, variable.getWritableType());
 
@@ -5747,7 +6978,7 @@
         profileRequires(loc, EEsProfile, 300, nullptr, "uniform block");
         profileRequires(loc, ENoProfile, 140, nullptr, "uniform block");
         if (currentBlockQualifier.layoutPacking == ElpStd430 && ! currentBlockQualifier.layoutPushConstant)
-            error(loc, "requires the 'buffer' storage qualifier", "std430", "");
+            requireExtensions(loc, 1, &E_GL_EXT_scalar_block_layout, "std430 requires the buffer storage qualifier");
         break;
     case EvqBuffer:
         requireProfile(loc, EEsProfile | ECoreProfile | ECompatibilityProfile, "buffer block");
@@ -5758,17 +6989,65 @@
         profileRequires(loc, ~EEsProfile, 150, E_GL_ARB_separate_shader_objects, "input block");
         // It is a compile-time error to have an input block in a vertex shader or an output block in a fragment shader
         // "Compute shaders do not permit user-defined input variables..."
-        requireStage(loc, (EShLanguageMask)(EShLangTessControlMask|EShLangTessEvaluationMask|EShLangGeometryMask|EShLangFragmentMask), "input block");
-        if (language == EShLangFragment)
-            profileRequires(loc, EEsProfile, 0, Num_AEP_shader_io_blocks, AEP_shader_io_blocks, "fragment input block");
+        requireStage(loc, (EShLanguageMask)(EShLangTessControlMask|EShLangTessEvaluationMask|EShLangGeometryMask|EShLangFragmentMask
+#ifdef NV_EXTENSIONS
+                                            |EShLangMeshNVMask
+#endif
+                                           ), "input block");
+        if (language == EShLangFragment) {
+            profileRequires(loc, EEsProfile, 320, Num_AEP_shader_io_blocks, AEP_shader_io_blocks, "fragment input block");
+        }
+#ifdef NV_EXTENSIONS
+        else if (language == EShLangMeshNV && ! qualifier.isTaskMemory()) {
+            error(loc, "input blocks cannot be used in a mesh shader", "out", "");
+        }
+#endif
         break;
     case EvqVaryingOut:
         profileRequires(loc, ~EEsProfile, 150, E_GL_ARB_separate_shader_objects, "output block");
-        requireStage(loc, (EShLanguageMask)(EShLangVertexMask|EShLangTessControlMask|EShLangTessEvaluationMask|EShLangGeometryMask), "output block");
+        requireStage(loc, (EShLanguageMask)(EShLangVertexMask|EShLangTessControlMask|EShLangTessEvaluationMask|EShLangGeometryMask
+#ifdef NV_EXTENSIONS
+                                            |EShLangMeshNVMask|EShLangTaskNVMask
+#endif
+                                           ), "output block");
         // ES 310 can have a block before shader_io is turned on, so skip this test for built-ins
-        if (language == EShLangVertex && ! parsingBuiltins)
-            profileRequires(loc, EEsProfile, 0, Num_AEP_shader_io_blocks, AEP_shader_io_blocks, "vertex output block");
+        if (language == EShLangVertex && ! parsingBuiltins) {
+            profileRequires(loc, EEsProfile, 320, Num_AEP_shader_io_blocks, AEP_shader_io_blocks, "vertex output block");
+        }
+#ifdef NV_EXTENSIONS
+        else if (language == EShLangMeshNV && qualifier.isTaskMemory()) {
+            error(loc, "can only use on input blocks in mesh shader", "taskNV", "");
+        }
+        else if (language == EShLangTaskNV && ! qualifier.isTaskMemory()) {
+            error(loc, "output blocks cannot be used in a task shader", "out", "");
+        }
+#endif
         break;
+#ifdef NV_EXTENSIONS
+    case EvqPayloadNV:
+        profileRequires(loc, ~EEsProfile, 460, E_GL_NV_ray_tracing, "rayPayloadNV block");
+        requireStage(loc, (EShLanguageMask)(EShLangRayGenNVMask | EShLangAnyHitNVMask | EShLangClosestHitNVMask | EShLangMissNVMask),
+            "rayPayloadNV block");
+        break;
+    case EvqPayloadInNV:
+        profileRequires(loc, ~EEsProfile, 460, E_GL_NV_ray_tracing, "rayPayloadInNV block");
+        requireStage(loc, (EShLanguageMask)(EShLangAnyHitNVMask | EShLangClosestHitNVMask | EShLangMissNVMask),
+            "rayPayloadInNV block");
+        break;
+    case EvqHitAttrNV:
+        profileRequires(loc, ~EEsProfile, 460, E_GL_NV_ray_tracing, "hitAttributeNV block");
+        requireStage(loc, (EShLanguageMask)(EShLangIntersectNVMask | EShLangAnyHitNVMask | EShLangClosestHitNVMask), "hitAttributeNV block");
+        break;
+    case EvqCallableDataNV:
+        profileRequires(loc, ~EEsProfile, 460, E_GL_NV_ray_tracing, "callableDataNV block");
+        requireStage(loc, (EShLanguageMask)(EShLangRayGenNVMask | EShLangClosestHitNVMask | EShLangMissNVMask | EShLangCallableNVMask),
+            "callableDataNV block");
+        break;
+    case EvqCallableDataInNV:
+        profileRequires(loc, ~EEsProfile, 460, E_GL_NV_ray_tracing, "callableDataInNV block");
+        requireStage(loc, (EShLanguageMask)(EShLangCallableNVMask), "callableDataInNV block");
+        break;
+#endif
     default:
         error(loc, "only uniform, buffer, in, or out blocks are supported", blockName->c_str(), "");
         break;
@@ -5805,6 +7084,12 @@
         error(loc, "cannot use invariant qualifier on an interface block", "invariant", "");
     if (qualifier.layoutPushConstant)
         intermediate.addPushConstantCount();
+#ifdef NV_EXTENSIONS
+    if (qualifier.layoutShaderRecordNV)
+        intermediate.addShaderRecordNVCount();
+    if (qualifier.perTaskNV)
+        intermediate.addTaskNVCount();
+#endif
 }
 
 //
@@ -5842,15 +7127,16 @@
                     if (nextLocation >= (int)TQualifier::layoutLocationEnd)
                         error(memberLoc, "location is too large", "location", "");
                     memberQualifier.layoutLocation = nextLocation;
-                    memberQualifier.layoutComponent = 0;
+                    memberQualifier.layoutComponent = TQualifier::layoutComponentEnd;
                 }
-                nextLocation = memberQualifier.layoutLocation + intermediate.computeTypeLocationSize(*typeList[member].type);
+                nextLocation = memberQualifier.layoutLocation + intermediate.computeTypeLocationSize(
+                                    *typeList[member].type, language);
             }
         }
     }
 }
 
-void TParseContext::fixBlockXfbOffsets(TQualifier& qualifier, TTypeList& typeList)
+void TParseContext::fixXfbOffsets(TQualifier& qualifier, TTypeList& typeList)
 {
     // "If a block is qualified with xfb_offset, all its
     // members are assigned transform feedback buffer offsets. If a block is not qualified with xfb_offset, any
@@ -5889,9 +7175,9 @@
 //
 void TParseContext::fixBlockUniformOffsets(TQualifier& qualifier, TTypeList& typeList)
 {
-    if (! qualifier.isUniformOrBuffer())
+    if (!qualifier.isUniformOrBuffer() && !qualifier.isTaskMemory())
         return;
-    if (qualifier.layoutPacking != ElpStd140 && qualifier.layoutPacking != ElpStd430)
+    if (qualifier.layoutPacking != ElpStd140 && qualifier.layoutPacking != ElpStd430 && qualifier.layoutPacking != ElpScalar)
         return;
 
     int offset = 0;
@@ -5905,8 +7191,8 @@
         // modify just the children's view of matrix layout, if there is one for this member
         TLayoutMatrix subMatrixLayout = typeList[member].type->getQualifier().layoutMatrix;
         int dummyStride;
-        int memberAlignment = intermediate.getBaseAlignment(*typeList[member].type, memberSize, dummyStride, qualifier.layoutPacking == ElpStd140,
-                                                            subMatrixLayout != ElmNone ? subMatrixLayout == ElmRowMajor : qualifier.layoutMatrix == ElmRowMajor);
+        int memberAlignment = intermediate.getMemberAlignment(*typeList[member].type, memberSize, dummyStride, qualifier.layoutPacking,
+                                                              subMatrixLayout != ElmNone ? subMatrixLayout == ElmRowMajor : qualifier.layoutMatrix == ElmRowMajor);
         if (memberQualifier.hasOffset()) {
             // "The specified offset must be a multiple
             // of the base alignment of the type of the block member it qualifies, or a compile-time error results."
@@ -6021,7 +7307,11 @@
 void TParseContext::updateStandaloneQualifierDefaults(const TSourceLoc& loc, const TPublicType& publicType)
 {
     if (publicType.shaderQualifiers.vertices != TQualifier::layoutNotSet) {
+#ifdef NV_EXTENSIONS
+        assert(language == EShLangTessControl || language == EShLangGeometry || language == EShLangMeshNV);
+#else
         assert(language == EShLangTessControl || language == EShLangGeometry);
+#endif
         const char* id = (language == EShLangTessControl) ? "vertices" : "max_vertices";
 
         if (publicType.qualifier.storage != EvqVaryingOut)
@@ -6032,6 +7322,17 @@
         if (language == EShLangTessControl)
             checkIoArraysConsistency(loc);
     }
+#ifdef NV_EXTENSIONS
+    if (publicType.shaderQualifiers.primitives != TQualifier::layoutNotSet) {
+        assert(language == EShLangMeshNV);
+        const char* id = "max_primitives";
+
+        if (publicType.qualifier.storage != EvqVaryingOut)
+            error(loc, "can only apply to 'out'", id, "");
+        if (! intermediate.setPrimitives(publicType.shaderQualifiers.primitives))
+            error(loc, "cannot change previously set layout value", id, "");
+    }
+#endif
     if (publicType.shaderQualifiers.invocations != TQualifier::layoutNotSet) {
         if (publicType.qualifier.storage != EvqVaryingIn)
             error(loc, "can only apply to 'in'", "invocations", "");
@@ -6048,6 +7349,12 @@
             case ElgTrianglesAdjacency:
             case ElgQuads:
             case ElgIsolines:
+#ifdef NV_EXTENSIONS
+                if (language == EShLangMeshNV) {
+                    error(loc, "cannot apply to input", TQualifier::getGeometryString(publicType.shaderQualifiers.geometry), "");
+                    break;
+                }
+#endif
                 if (intermediate.setInputPrimitive(publicType.shaderQualifiers.geometry)) {
                     if (language == EShLangGeometry)
                         checkIoArraysConsistency(loc);
@@ -6059,6 +7366,15 @@
             }
         } else if (publicType.qualifier.storage == EvqVaryingOut) {
             switch (publicType.shaderQualifiers.geometry) {
+#ifdef NV_EXTENSIONS
+            case ElgLines:
+            case ElgTriangles:
+                if (language != EShLangMeshNV) {
+                    error(loc, "cannot apply to 'out'", TQualifier::getGeometryString(publicType.shaderQualifiers.geometry), "");
+                    break;
+                }
+#endif
+                // Fall through
             case ElgPoints:
             case ElgLineStrip:
             case ElgTriangleStrip:
@@ -6098,14 +7414,41 @@
                     error(loc, "cannot change previously set size", "local_size", "");
                 else {
                     int max = 0;
-                    switch (i) {
-                    case 0: max = resources.maxComputeWorkGroupSizeX; break;
-                    case 1: max = resources.maxComputeWorkGroupSizeY; break;
-                    case 2: max = resources.maxComputeWorkGroupSizeZ; break;
-                    default: break;
+                    if (language == EShLangCompute) {
+                        switch (i) {
+                        case 0: max = resources.maxComputeWorkGroupSizeX; break;
+                        case 1: max = resources.maxComputeWorkGroupSizeY; break;
+                        case 2: max = resources.maxComputeWorkGroupSizeZ; break;
+                        default: break;
+                        }
+                        if (intermediate.getLocalSize(i) > (unsigned int)max)
+                            error(loc, "too large; see gl_MaxComputeWorkGroupSize", "local_size", "");
                     }
-                    if (intermediate.getLocalSize(i) > (unsigned int)max)
-                        error(loc, "too large; see gl_MaxComputeWorkGroupSize", "local_size", "");
+#ifdef NV_EXTENSIONS
+                    else if (language == EShLangMeshNV) {
+                        switch (i) {
+                        case 0: max = resources.maxMeshWorkGroupSizeX_NV; break;
+                        case 1: max = resources.maxMeshWorkGroupSizeY_NV; break;
+                        case 2: max = resources.maxMeshWorkGroupSizeZ_NV; break;
+                        default: break;
+                        }
+                        if (intermediate.getLocalSize(i) > (unsigned int)max)
+                            error(loc, "too large; see gl_MaxMeshWorkGroupSizeNV", "local_size", "");
+                    }
+                    else if (language == EShLangTaskNV) {
+                        switch (i) {
+                        case 0: max = resources.maxTaskWorkGroupSizeX_NV; break;
+                        case 1: max = resources.maxTaskWorkGroupSizeY_NV; break;
+                        case 2: max = resources.maxTaskWorkGroupSizeZ_NV; break;
+                        default: break;
+                        }
+                        if (intermediate.getLocalSize(i) > (unsigned int)max)
+                            error(loc, "too large; see gl_MaxTaskWorkGroupSizeNV", "local_size", "");
+                    }
+#endif
+                    else {
+                        assert(0);
+                    }
 
                     // Fix the existing constant gl_WorkGroupSize with this new information.
                     TVariable* workGroupSize = getEditableVariable("gl_WorkGroupSize");
@@ -6133,11 +7476,47 @@
         else
             error(loc, "can only apply to 'in'", "early_fragment_tests", "");
     }
+    if (publicType.shaderQualifiers.postDepthCoverage) {
+        if (publicType.qualifier.storage == EvqVaryingIn)
+            intermediate.setPostDepthCoverage();
+        else
+            error(loc, "can only apply to 'in'", "post_coverage_coverage", "");
+    }
     if (publicType.shaderQualifiers.blendEquation) {
         if (publicType.qualifier.storage != EvqVaryingOut)
             error(loc, "can only apply to 'out'", "blend equation", "");
     }
 
+#ifdef NV_EXTENSIONS
+    if (publicType.shaderQualifiers.layoutDerivativeGroupQuads &&
+        publicType.shaderQualifiers.layoutDerivativeGroupLinear) {
+        error(loc, "cannot be both specified", "derivative_group_quadsNV and derivative_group_linearNV", "");
+    }
+
+    if (publicType.shaderQualifiers.layoutDerivativeGroupQuads) {
+        if (publicType.qualifier.storage == EvqVaryingIn) {
+            if ((intermediate.getLocalSize(0) & 1) ||
+                (intermediate.getLocalSize(1) & 1))
+                error(loc, "requires local_size_x and local_size_y to be multiple of two", "derivative_group_quadsNV", "");
+            else
+                intermediate.setLayoutDerivativeMode(LayoutDerivativeGroupQuads);
+        }
+        else
+            error(loc, "can only apply to 'in'", "derivative_group_quadsNV", "");
+    }
+    if (publicType.shaderQualifiers.layoutDerivativeGroupLinear) {
+        if (publicType.qualifier.storage == EvqVaryingIn) {
+            if((intermediate.getLocalSize(0) *
+                intermediate.getLocalSize(1) *
+                intermediate.getLocalSize(2)) % 4 != 0)
+                error(loc, "requires total group size to be multiple of four", "derivative_group_linearNV", "");
+            else
+                intermediate.setLayoutDerivativeMode(LayoutDerivativeGroupLinear);
+        }
+        else
+            error(loc, "can only apply to 'in'", "derivative_group_linearNV", "");
+    }
+#endif 
     const TQualifier& qualifier = publicType.qualifier;
 
     if (qualifier.isAuxiliary() ||
@@ -6193,6 +7572,10 @@
         error(loc, "cannot declare a default, can only be used on a block", "push_constant", "");
     if (qualifier.hasSpecConstantId())
         error(loc, "cannot declare a default, can only be used on a scalar", "constant_id", "");
+#ifdef NV_EXTENSIONS
+    if (qualifier.layoutShaderRecordNV)
+        error(loc, "cannot declare a default, can only be used on a block", "shaderRecordNV", "");
+#endif
 }
 
 //
diff --git a/glslang/MachineIndependent/ParseHelper.h b/glslang/MachineIndependent/ParseHelper.h
index dc9dc6a..14421a2 100644
--- a/glslang/MachineIndependent/ParseHelper.h
+++ b/glslang/MachineIndependent/ParseHelper.h
@@ -44,13 +44,15 @@
 #ifndef _PARSER_HELPER_INCLUDED_
 #define _PARSER_HELPER_INCLUDED_
 
+#include <cstdarg>
+#include <functional>
+
 #include "parseVersions.h"
 #include "../Include/ShHandle.h"
 #include "SymbolTable.h"
 #include "localintermediate.h"
 #include "Scan.h"
-#include <cstdarg>
-#include <functional>
+#include "attribute.h"
 
 namespace glslang {
 
@@ -74,12 +76,23 @@
 public:
     TParseContextBase(TSymbolTable& symbolTable, TIntermediate& interm, bool parsingBuiltins, int version,
                       EProfile profile, const SpvVersion& spvVersion, EShLanguage language,
-                      TInfoSink& infoSink, bool forwardCompatible, EShMessages messages)
+                      TInfoSink& infoSink, bool forwardCompatible, EShMessages messages,
+                      const TString* entryPoint = nullptr)
           : TParseVersions(interm, version, profile, spvVersion, language, infoSink, forwardCompatible, messages),
+            scopeMangler("::"),
             symbolTable(symbolTable),
+            statementNestingLevel(0), loopNestingLevel(0), structNestingLevel(0), controlFlowNestingLevel(0),
+            postEntryPointReturn(false),
+            contextPragma(true, false),
             parsingBuiltins(parsingBuiltins), scanContext(nullptr), ppContext(nullptr),
-            globalUniformBlock(nullptr)
-    { }
+            limits(resources.limits),
+            globalUniformBlock(nullptr),
+            globalUniformBinding(TQualifier::layoutBindingEnd),
+            globalUniformSet(TQualifier::layoutSetEnd)
+    {
+        if (entryPoint != nullptr)
+            sourceEntryPointName = *entryPoint;
+    }
     virtual ~TParseContextBase() { }
 
     virtual void C_DECL   error(const TSourceLoc&, const char* szReason, const char* szToken,
@@ -93,6 +106,8 @@
 
     virtual void setLimits(const TBuiltInResource&) = 0;
 
+    void checkIndex(const TSourceLoc&, const TType&, int& index);
+
     EShLanguage getLanguage() const { return language; }
     void setScanContext(TScanContext* c) { scanContext = c; }
     TScanContext* getScanContext() const { return scanContext; }
@@ -133,24 +148,51 @@
             extensionCallback(line, extension, behavior);
     }
 
-    TSymbolTable& symbolTable;   // symbol table that goes with the current language, version, and profile
-
     // Manage the global uniform block (default uniforms in GLSL, $Global in HLSL)
     virtual void growGlobalUniformBlock(const TSourceLoc&, TType&, const TString& memberName, TTypeList* typeList = nullptr);
 
+    // Potentially rename shader entry point function
+    void renameShaderFunction(TString*& name) const
+    {
+        // Replace the entry point name given in the shader with the real entry point name,
+        // if there is a substitution.
+        if (name != nullptr && *name == sourceEntryPointName && intermediate.getEntryPointName().size() > 0)
+            name = NewPoolTString(intermediate.getEntryPointName().c_str());
+    }
+
     virtual bool lValueErrorCheck(const TSourceLoc&, const char* op, TIntermTyped*);
     virtual void rValueErrorCheck(const TSourceLoc&, const char* op, TIntermTyped*);
 
-    const char* const scopeMangler = "::";
+    const char* const scopeMangler;
+
+    // Basic parsing state, easily accessible to the grammar
+
+    TSymbolTable& symbolTable;        // symbol table that goes with the current language, version, and profile
+    int statementNestingLevel;        // 0 if outside all flow control or compound statements
+    int loopNestingLevel;             // 0 if outside all loops
+    int structNestingLevel;           // 0 if outside blocks and structures
+    int controlFlowNestingLevel;      // 0 if outside all flow control
+    const TType* currentFunctionType; // the return type of the function that's currently being parsed
+    bool functionReturnsValue;        // true if a non-void function has a return
+    // if inside a function, true if the function is the entry point and this is after a return statement
+    bool postEntryPointReturn;
+    // case, node, case, case, node, ...; ensure only one node between cases;   stack of them for nesting
+    TList<TIntermSequence*> switchSequenceStack;
+    // the statementNestingLevel the current switch statement is at, which must match the level of its case statements
+    TList<int> switchLevel;
+    struct TPragma contextPragma;
 
 protected:
     TParseContextBase(TParseContextBase&);
     TParseContextBase& operator=(TParseContextBase&);
 
     const bool parsingBuiltins;       // true if parsing built-in symbols/functions
-    TVector<TSymbol*> linkageSymbols; // these need to be transferred to 'linkage', after all editing is done
+    TVector<TSymbol*> linkageSymbols; // will be transferred to 'linkage', after all editing is done, order preserving
     TScanContext* scanContext;
     TPpContext* ppContext;
+    TBuiltInResource resources;
+    TLimits& limits;
+    TString sourceEntryPointName;
 
     // These, if set, will be called when a line, pragma ... is preprocessed.
     // They will be called with any parameters to the original directive.
@@ -170,8 +212,10 @@
                                       TSwizzleSelectors<TVectorSelector>&);
 
     // Manage the global uniform block (default uniforms in GLSL, $Global in HLSL)
-    TVariable* globalUniformBlock;   // the actual block, inserted into the symbol table
-    int firstNewMember;              // the index of the first member not yet inserted into the symbol table
+    TVariable* globalUniformBlock;     // the actual block, inserted into the symbol table
+    unsigned int globalUniformBinding; // the block's binding number
+    unsigned int globalUniformSet;     // the block's set number
+    int firstNewMember;                // the index of the first member not yet inserted into the symbol table
     // override this to set the language-specific name
     virtual const char* getGlobalUniformBlockName() const { return ""; }
     virtual void setUniformBlockDefaults(TType&) const { }
@@ -227,7 +271,8 @@
 class TParseContext : public TParseContextBase {
 public:
     TParseContext(TSymbolTable&, TIntermediate&, bool parsingBuiltins, int version, EProfile, const SpvVersion& spvVersion, EShLanguage, TInfoSink&,
-                  bool forwardCompatible = false, EShMessages messages = EShMsgDefault);
+                  bool forwardCompatible = false, EShMessages messages = EShMsgDefault,
+                  const TString* entryPoint = nullptr);
     virtual ~TParseContext();
 
     bool obeyPrecisionQualifiers() const { return precisionManager.respectingPrecisionQualifiers(); };
@@ -246,7 +291,6 @@
     void handlePragma(const TSourceLoc&, const TVector<TString>&) override;
     TIntermTyped* handleVariable(const TSourceLoc&, TSymbol* symbol, const TString* string);
     TIntermTyped* handleBracketDereference(const TSourceLoc&, TIntermTyped* base, TIntermTyped* index);
-    void checkIndex(const TSourceLoc&, const TType&, int& index);
     void handleIndexLimits(const TSourceLoc&, TIntermTyped* base, TIntermTyped* index);
 
     void makeEditable(TSymbol*&) override;
@@ -254,8 +298,8 @@
     void fixIoArraySize(const TSourceLoc&, TType&);
     void ioArrayCheck(const TSourceLoc&, const TType&, const TString& identifier);
     void handleIoResizeArrayAccess(const TSourceLoc&, TIntermTyped* base);
-    void checkIoArraysConsistency(const TSourceLoc&, bool tailOnly = false);
-    int getIoArrayImplicitSize() const;
+    void checkIoArraysConsistency(const TSourceLoc&, bool tailOnly = false, bool isPerPrimitive = false);
+    int getIoArrayImplicitSize(bool isPerPrimitive = false) const;
     void checkIoArrayConsistency(const TSourceLoc&, int requiredSize, const char* feature, TType&, const TString&);
 
     TIntermTyped* handleBinaryMath(const TSourceLoc&, const char* str, TOperator op, TIntermTyped* left, TIntermTyped* right);
@@ -265,7 +309,7 @@
     TFunction* handleFunctionDeclarator(const TSourceLoc&, TFunction& function, bool prototype);
     TIntermAggregate* handleFunctionDefinition(const TSourceLoc&, TFunction&);
     TIntermTyped* handleFunctionCall(const TSourceLoc&, TFunction*, TIntermNode*);
-    TIntermTyped* handleBuiltInFunctionCall(TSourceLoc, TIntermNode& arguments, const TFunction& function);
+    TIntermTyped* handleBuiltInFunctionCall(TSourceLoc, TIntermNode* arguments, const TFunction& function);
     void computeBuiltinPrecisions(TIntermTyped&, const TFunction&);
     TIntermNode* handleReturnValue(const TSourceLoc&, TIntermTyped*);
     void checkLocation(const TSourceLoc&, TOperator);
@@ -279,6 +323,7 @@
     TFunction* handleConstructorCall(const TSourceLoc&, const TPublicType&);
     void handlePrecisionQualifier(const TSourceLoc&, TQualifier&, TPrecisionQualifier);
     void checkPrecisionQualifier(const TSourceLoc&, TPrecisionQualifier);
+    void memorySemanticsCheck(const TSourceLoc&, const TFunction&, const TIntermOperator& callNode);
 
     void assignError(const TSourceLoc&, const char* op, TString left, TString right);
     void unaryOpError(const TSourceLoc&, const char* op, TString operand);
@@ -296,17 +341,16 @@
     bool arrayError(const TSourceLoc&, const TType&);
     void arraySizeRequiredCheck(const TSourceLoc&, const TArraySizes&);
     void structArrayCheck(const TSourceLoc&, const TType& structure);
-    void arrayUnsizedCheck(const TSourceLoc&, const TQualifier&, const TArraySizes*, bool initializer, bool lastMember);
-    void arrayOfArrayVersionCheck(const TSourceLoc&);
-    void arrayDimCheck(const TSourceLoc&, const TArraySizes* sizes1, const TArraySizes* sizes2);
-    void arrayDimCheck(const TSourceLoc&, const TType*, const TArraySizes*);
-    void arrayDimMerge(TType& type, const TArraySizes* sizes);
+    void arraySizesCheck(const TSourceLoc&, const TQualifier&, TArraySizes*, const TIntermTyped* initializer, bool lastMember);
+    void arrayOfArrayVersionCheck(const TSourceLoc&, const TArraySizes*);
     bool voidErrorCheck(const TSourceLoc&, const TString&, TBasicType);
     void boolCheck(const TSourceLoc&, const TIntermTyped*);
     void boolCheck(const TSourceLoc&, const TPublicType&);
     void samplerCheck(const TSourceLoc&, const TType&, const TString& identifier, TIntermTyped* initializer);
     void atomicUintCheck(const TSourceLoc&, const TType&, const TString& identifier);
-    void transparentCheck(const TSourceLoc&, const TType&, const TString& identifier);
+    void accStructNVCheck(const TSourceLoc & loc, const TType & type, const TString & identifier);
+    void transparentOpaqueCheck(const TSourceLoc&, const TType&, const TString& identifier);
+    void memberQualifierCheck(glslang::TPublicType&);
     void globalQualifierFixCheck(const TSourceLoc&, TQualifier&);
     void globalQualifierTypeCheck(const TSourceLoc&, const TQualifier&, const TPublicType&);
     bool structQualifierErrorCheck(const TSourceLoc&, const TPublicType& pType);
@@ -319,12 +363,13 @@
     bool containsFieldWithBasicType(const TType& type ,TBasicType basicType);
     TSymbol* redeclareBuiltinVariable(const TSourceLoc&, const TString&, const TQualifier&, const TShaderQualifiers&);
     void redeclareBuiltinBlock(const TSourceLoc&, TTypeList& typeList, const TString& blockName, const TString* instanceName, TArraySizes* arraySizes);
-    void paramCheckFix(const TSourceLoc&, const TStorageQualifier&, TType& type);
+    void paramCheckFixStorage(const TSourceLoc&, const TStorageQualifier&, TType& type);
     void paramCheckFix(const TSourceLoc&, const TQualifier&, TType& type);
     void nestedBlockCheck(const TSourceLoc&);
     void nestedStructCheck(const TSourceLoc&);
     void arrayObjectCheck(const TSourceLoc&, const TType&, const char* op);
     void opaqueCheck(const TSourceLoc&, const TType&, const char* op);
+    void storage16BitAssignmentCheck(const TSourceLoc&, const TType&, const char* op);
     void specializationCheck(const TSourceLoc&, const TType&, const char* op);
     void structTypeCheck(const TSourceLoc&, TPublicType&);
     void inductiveLoopCheck(const TSourceLoc&, TIntermNode* init, TIntermLoop* loop);
@@ -338,6 +383,7 @@
     void setLayoutQualifier(const TSourceLoc&, TPublicType&, TString&, const TIntermTyped*);
     void mergeObjectLayoutQualifiers(TQualifier& dest, const TQualifier& src, bool inheritOnly);
     void layoutObjectCheck(const TSourceLoc&, const TSymbol&);
+    void layoutMemberLocationArrayCheck(const TSourceLoc&, bool memberWithLocation, TArraySizes* arraySizes);
     void layoutTypeCheck(const TSourceLoc&, const TType&);
     void layoutQualifierCheck(const TSourceLoc&, const TQualifier&);
     void checkNoShaderLayouts(const TSourceLoc&, const TShaderQualifiers&);
@@ -347,6 +393,7 @@
     const TFunction* findFunctionExact(const TSourceLoc& loc, const TFunction& call, bool& builtIn);
     const TFunction* findFunction120(const TSourceLoc& loc, const TFunction& call, bool& builtIn);
     const TFunction* findFunction400(const TSourceLoc& loc, const TFunction& call, bool& builtIn);
+    const TFunction* findFunctionExplicitTypes(const TSourceLoc& loc, const TFunction& call, bool& builtIn);
     void declareTypeDefaults(const TSourceLoc&, const TPublicType&);
     TIntermNode* declareVariable(const TSourceLoc&, TString& identifier, const TPublicType&, TArraySizes* typeArray = 0, TIntermTyped* initializer = 0);
     TIntermTyped* addConstructor(const TSourceLoc&, TIntermNode*, const TType&);
@@ -356,7 +403,7 @@
     void blockStageIoCheck(const TSourceLoc&, const TQualifier&);
     void blockQualifierCheck(const TSourceLoc&, const TQualifier&, bool instanceName);
     void fixBlockLocations(const TSourceLoc&, TQualifier&, TTypeList&, bool memberWithLocation, bool memberWithoutLocation);
-    void fixBlockXfbOffsets(TQualifier&, TTypeList&);
+    void fixXfbOffsets(TQualifier&, TTypeList&);
     void fixBlockUniformOffsets(TQualifier&, TTypeList&);
     void addQualifierToExisting(const TSourceLoc&, TQualifier, const TString& identifier);
     void addQualifierToExisting(const TSourceLoc&, TQualifier, TIdentifierList&);
@@ -365,7 +412,19 @@
     void wrapupSwitchSubsequence(TIntermAggregate* statements, TIntermNode* branchNode);
     TIntermNode* addSwitch(const TSourceLoc&, TIntermTyped* expression, TIntermAggregate* body);
 
-    void updateImplicitArraySize(const TSourceLoc&, TIntermNode*, int index);
+    TAttributeType attributeFromName(const TString& name) const;
+    TAttributes* makeAttributes(const TString& identifier) const;
+    TAttributes* makeAttributes(const TString& identifier, TIntermNode* node) const;
+    TAttributes* mergeAttributes(TAttributes*, TAttributes*) const;
+
+    // Determine selection control from attributes
+    void handleSelectionAttributes(const TAttributes& attributes, TIntermNode*);
+    void handleSwitchAttributes(const TAttributes& attributes, TIntermNode*);
+
+    // Determine loop control from attributes
+    void handleLoopAttributes(const TAttributes& attributes, TIntermNode*);
+
+    void resizeMeshViewDimension(const TSourceLoc&, TType&);
 
 protected:
     void nonInitConstCheck(const TSourceLoc&, TString& identifier, TType& type);
@@ -373,6 +432,8 @@
     TVariable* makeInternalVariable(const char* name, const TType&) const;
     TVariable* declareNonArray(const TSourceLoc&, const TString& identifier, const TType&);
     void declareArray(const TSourceLoc&, const TString& identifier, const TType&, TSymbol*&);
+    void checkRuntimeSizable(const TSourceLoc&, const TIntermTyped&);
+    bool isRuntimeLength(const TIntermTyped&) const;
     TIntermNode* executeInitializer(const TSourceLoc&, TIntermTyped* initializer, TVariable* variable);
     TIntermTyped* convertInitializerList(const TSourceLoc&, const TType&, TIntermTyped* initializer);
     void finish() override;
@@ -383,17 +444,7 @@
     //
 
     // Current state of parsing
-    struct TPragma contextPragma;
-    int loopNestingLevel;        // 0 if outside all loops
-    int structNestingLevel;      // 0 if outside blocks and structures
-    int controlFlowNestingLevel; // 0 if outside all flow control
-    int statementNestingLevel;   // 0 if outside all flow control or compound statements
-    TList<TIntermSequence*> switchSequenceStack;  // case, node, case, case, node, ...; ensure only one node between cases;   stack of them for nesting
-    TList<int> switchLevel;      // the statementNestingLevel the current switch statement is at, which must match the level of its case statements
     bool inMain;                 // if inside a function, true if the function is main
-    bool postMainReturn;         // if inside a function, true if the function is main and this is after a return statement
-    const TType* currentFunctionType;  // the return type of the function that's currently being parsed
-    bool functionReturnsValue;   // true if a non-void function has a return
     const TString* blockName;
     TQualifier currentBlockQualifier;
     TPrecisionQualifier defaultPrecision[EbtNumTypes];
diff --git a/glslang/MachineIndependent/PoolAlloc.cpp b/glslang/MachineIndependent/PoolAlloc.cpp
index 4007c38..84c40f4 100644
--- a/glslang/MachineIndependent/PoolAlloc.cpp
+++ b/glslang/MachineIndependent/PoolAlloc.cpp
@@ -40,35 +40,22 @@
 
 namespace glslang {
 
+// Process-wide TLS index
 OS_TLSIndex PoolIndex;
 
-void InitializeMemoryPools()
+// Return the thread-specific current pool.
+TPoolAllocator& GetThreadPoolAllocator()
 {
-    TThreadMemoryPools* pools = static_cast<TThreadMemoryPools*>(OS_GetTLSValue(PoolIndex));
-    if (pools)
-        return;
-
-    TPoolAllocator *threadPoolAllocator = new TPoolAllocator();
-
-    TThreadMemoryPools* threadData = new TThreadMemoryPools();
-
-    threadData->threadPoolAllocator = threadPoolAllocator;
-
-    OS_SetTLSValue(PoolIndex, threadData);
+    return *static_cast<TPoolAllocator*>(OS_GetTLSValue(PoolIndex));
 }
 
-void FreeGlobalPools()
+// Set the thread-specific current pool.
+void SetThreadPoolAllocator(TPoolAllocator* poolAllocator)
 {
-    // Release the allocated memory for this thread.
-    TThreadMemoryPools* globalPools = static_cast<TThreadMemoryPools*>(OS_GetTLSValue(PoolIndex));
-    if (! globalPools)
-        return;
-
-    GetThreadPoolAllocator().popAll();
-    delete &GetThreadPoolAllocator();
-    delete globalPools;
+    OS_SetTLSValue(PoolIndex, poolAllocator);
 }
 
+// Process-wide set up of the TLS pool storage.
 bool InitializePoolIndex()
 {
     // Allocate a TLS index.
@@ -78,26 +65,6 @@
     return true;
 }
 
-void FreePoolIndex()
-{
-    // Release the TLS index.
-    OS_FreeTLSIndex(PoolIndex);
-}
-
-TPoolAllocator& GetThreadPoolAllocator()
-{
-    TThreadMemoryPools* threadData = static_cast<TThreadMemoryPools*>(OS_GetTLSValue(PoolIndex));
-
-    return *threadData->threadPoolAllocator;
-}
-
-void SetThreadPoolAllocator(TPoolAllocator& poolAllocator)
-{
-    TThreadMemoryPools* threadData = static_cast<TThreadMemoryPools*>(OS_GetTLSValue(PoolIndex));
-
-    threadData->threadPoolAllocator = &poolAllocator;
-}
-
 //
 // Implement the functionality of the TPoolAllocator class, which
 // is documented in PoolAlloc.h.
@@ -234,13 +201,16 @@
     currentPageOffset = stack.back().offset;
 
     while (inUseList != page) {
-        // invoke destructor to free allocation list
-        inUseList->~tHeader();
-
         tHeader* nextInUse = inUseList->nextPage;
-        if (inUseList->pageCount > 1)
+        size_t pageCount = inUseList->pageCount;
+
+        // This technically ends the lifetime of the header as C++ object,
+        // but we will still control the memory and reuse it.
+        inUseList->~tHeader(); // currently, just a debug allocation checker
+
+        if (pageCount > 1) {
             delete [] reinterpret_cast<char*>(inUseList);
-        else {
+        } else {
             inUseList->nextPage = freeList;
             freeList = inUseList;
         }
diff --git a/glslang/MachineIndependent/RemoveTree.h b/glslang/MachineIndependent/RemoveTree.h
index 507307e..1ed0156 100644
--- a/glslang/MachineIndependent/RemoveTree.h
+++ b/glslang/MachineIndependent/RemoveTree.h
@@ -32,6 +32,8 @@
 // POSSIBILITY OF SUCH DAMAGE.
 //
 
+#pragma once
+
 namespace glslang {
 
 void RemoveAllTreeNodes(TIntermNode*);
diff --git a/glslang/MachineIndependent/Scan.cpp b/glslang/MachineIndependent/Scan.cpp
index f61439f..2247250 100644
--- a/glslang/MachineIndependent/Scan.cpp
+++ b/glslang/MachineIndependent/Scan.cpp
@@ -1,6 +1,7 @@
 //
 // Copyright (C) 2002-2005  3Dlabs Inc. Ltd.
 // Copyright (C) 2013 LunarG, Inc.
+// Copyright (C) 2017 ARM Limited.
 //
 // All rights reserved.
 //
@@ -45,6 +46,7 @@
 #include "../Include/Types.h"
 #include "SymbolTable.h"
 #include "ParseHelper.h"
+#include "attribute.h"
 #include "glslang_tab.cpp.h"
 #include "ScanContext.h"
 #include "Scan.h"
@@ -339,6 +341,7 @@
 
     (*KeywordMap)["const"] =                   CONST;
     (*KeywordMap)["uniform"] =                 UNIFORM;
+    (*KeywordMap)["nonuniformEXT"] =           NONUNIFORM;
     (*KeywordMap)["in"] =                      IN;
     (*KeywordMap)["out"] =                     OUT;
     (*KeywordMap)["inout"] =                   INOUT;
@@ -377,6 +380,11 @@
     (*KeywordMap)["varying"] =                 VARYING;
     (*KeywordMap)["buffer"] =                  BUFFER;
     (*KeywordMap)["coherent"] =                COHERENT;
+    (*KeywordMap)["devicecoherent"] =          DEVICECOHERENT;
+    (*KeywordMap)["queuefamilycoherent"] =     QUEUEFAMILYCOHERENT;
+    (*KeywordMap)["workgroupcoherent"] =       WORKGROUPCOHERENT;
+    (*KeywordMap)["subgroupcoherent"] =        SUBGROUPCOHERENT;
+    (*KeywordMap)["nonprivate"] =              NONPRIVATE;
     (*KeywordMap)["restrict"] =                RESTRICT;
     (*KeywordMap)["readonly"] =                READONLY;
     (*KeywordMap)["writeonly"] =               WRITEONLY;
@@ -463,7 +471,34 @@
     (*KeywordMap)["u64vec3"] =                 U64VEC3;
     (*KeywordMap)["u64vec4"] =                 U64VEC4;
 
-#ifdef AMD_EXTENSIONS
+    // GL_EXT_shader_explicit_arithmetic_types
+    (*KeywordMap)["int8_t"] =                  INT8_T;
+    (*KeywordMap)["i8vec2"] =                  I8VEC2;
+    (*KeywordMap)["i8vec3"] =                  I8VEC3;
+    (*KeywordMap)["i8vec4"] =                  I8VEC4;
+    (*KeywordMap)["uint8_t"] =                 UINT8_T;
+    (*KeywordMap)["u8vec2"] =                  U8VEC2;
+    (*KeywordMap)["u8vec3"] =                  U8VEC3;
+    (*KeywordMap)["u8vec4"] =                  U8VEC4;
+
+    (*KeywordMap)["int16_t"] =                 INT16_T;
+    (*KeywordMap)["i16vec2"] =                 I16VEC2;
+    (*KeywordMap)["i16vec3"] =                 I16VEC3;
+    (*KeywordMap)["i16vec4"] =                 I16VEC4;
+    (*KeywordMap)["uint16_t"] =                UINT16_T;
+    (*KeywordMap)["u16vec2"] =                 U16VEC2;
+    (*KeywordMap)["u16vec3"] =                 U16VEC3;
+    (*KeywordMap)["u16vec4"] =                 U16VEC4;
+
+    (*KeywordMap)["int32_t"] =                 INT32_T;
+    (*KeywordMap)["i32vec2"] =                 I32VEC2;
+    (*KeywordMap)["i32vec3"] =                 I32VEC3;
+    (*KeywordMap)["i32vec4"] =                 I32VEC4;
+    (*KeywordMap)["uint32_t"] =                UINT32_T;
+    (*KeywordMap)["u32vec2"] =                 U32VEC2;
+    (*KeywordMap)["u32vec3"] =                 U32VEC3;
+    (*KeywordMap)["u32vec4"] =                 U32VEC4;
+
     (*KeywordMap)["float16_t"] =               FLOAT16_T;
     (*KeywordMap)["f16vec2"] =                 F16VEC2;
     (*KeywordMap)["f16vec3"] =                 F16VEC3;
@@ -480,7 +515,39 @@
     (*KeywordMap)["f16mat4x2"] =               F16MAT4X2;
     (*KeywordMap)["f16mat4x3"] =               F16MAT4X3;
     (*KeywordMap)["f16mat4x4"] =               F16MAT4X4;
-#endif
+
+    (*KeywordMap)["float32_t"] =               FLOAT32_T;
+    (*KeywordMap)["f32vec2"] =                 F32VEC2;
+    (*KeywordMap)["f32vec3"] =                 F32VEC3;
+    (*KeywordMap)["f32vec4"] =                 F32VEC4;
+    (*KeywordMap)["f32mat2"] =                 F32MAT2;
+    (*KeywordMap)["f32mat3"] =                 F32MAT3;
+    (*KeywordMap)["f32mat4"] =                 F32MAT4;
+    (*KeywordMap)["f32mat2x2"] =               F32MAT2X2;
+    (*KeywordMap)["f32mat2x3"] =               F32MAT2X3;
+    (*KeywordMap)["f32mat2x4"] =               F32MAT2X4;
+    (*KeywordMap)["f32mat3x2"] =               F32MAT3X2;
+    (*KeywordMap)["f32mat3x3"] =               F32MAT3X3;
+    (*KeywordMap)["f32mat3x4"] =               F32MAT3X4;
+    (*KeywordMap)["f32mat4x2"] =               F32MAT4X2;
+    (*KeywordMap)["f32mat4x3"] =               F32MAT4X3;
+    (*KeywordMap)["f32mat4x4"] =               F32MAT4X4;
+    (*KeywordMap)["float64_t"] =               FLOAT64_T;
+    (*KeywordMap)["f64vec2"] =                 F64VEC2;
+    (*KeywordMap)["f64vec3"] =                 F64VEC3;
+    (*KeywordMap)["f64vec4"] =                 F64VEC4;
+    (*KeywordMap)["f64mat2"] =                 F64MAT2;
+    (*KeywordMap)["f64mat3"] =                 F64MAT3;
+    (*KeywordMap)["f64mat4"] =                 F64MAT4;
+    (*KeywordMap)["f64mat2x2"] =               F64MAT2X2;
+    (*KeywordMap)["f64mat2x3"] =               F64MAT2X3;
+    (*KeywordMap)["f64mat2x4"] =               F64MAT2X4;
+    (*KeywordMap)["f64mat3x2"] =               F64MAT3X2;
+    (*KeywordMap)["f64mat3x3"] =               F64MAT3X3;
+    (*KeywordMap)["f64mat3x4"] =               F64MAT3X4;
+    (*KeywordMap)["f64mat4x2"] =               F64MAT4X2;
+    (*KeywordMap)["f64mat4x3"] =               F64MAT4X3;
+    (*KeywordMap)["f64mat4x4"] =               F64MAT4X4;
 
     (*KeywordMap)["sampler2D"] =               SAMPLER2D;
     (*KeywordMap)["samplerCube"] =             SAMPLERCUBE;
@@ -569,19 +636,82 @@
     (*KeywordMap)["usubpassInput"] =           USUBPASSINPUT;
     (*KeywordMap)["usubpassInputMS"] =         USUBPASSINPUTMS;
 
+#ifdef AMD_EXTENSIONS
+    (*KeywordMap)["f16sampler1D"] =                 F16SAMPLER1D;
+    (*KeywordMap)["f16sampler2D"] =                 F16SAMPLER2D;
+    (*KeywordMap)["f16sampler3D"] =                 F16SAMPLER3D;
+    (*KeywordMap)["f16sampler2DRect"] =             F16SAMPLER2DRECT;
+    (*KeywordMap)["f16samplerCube"] =               F16SAMPLERCUBE;
+    (*KeywordMap)["f16sampler1DArray"] =            F16SAMPLER1DARRAY;
+    (*KeywordMap)["f16sampler2DArray"] =            F16SAMPLER2DARRAY;
+    (*KeywordMap)["f16samplerCubeArray"] =          F16SAMPLERCUBEARRAY;
+    (*KeywordMap)["f16samplerBuffer"] =             F16SAMPLERBUFFER;
+    (*KeywordMap)["f16sampler2DMS"] =               F16SAMPLER2DMS;
+    (*KeywordMap)["f16sampler2DMSArray"] =          F16SAMPLER2DMSARRAY;
+    (*KeywordMap)["f16sampler1DShadow"] =           F16SAMPLER1DSHADOW;
+    (*KeywordMap)["f16sampler2DShadow"] =           F16SAMPLER2DSHADOW;
+    (*KeywordMap)["f16sampler2DRectShadow"] =       F16SAMPLER2DRECTSHADOW;
+    (*KeywordMap)["f16samplerCubeShadow"] =         F16SAMPLERCUBESHADOW;
+    (*KeywordMap)["f16sampler1DArrayShadow"] =      F16SAMPLER1DARRAYSHADOW;
+    (*KeywordMap)["f16sampler2DArrayShadow"] =      F16SAMPLER2DARRAYSHADOW;
+    (*KeywordMap)["f16samplerCubeArrayShadow"] =    F16SAMPLERCUBEARRAYSHADOW;
+
+    (*KeywordMap)["f16image1D"] =                   F16IMAGE1D;
+    (*KeywordMap)["f16image2D"] =                   F16IMAGE2D;
+    (*KeywordMap)["f16image3D"] =                   F16IMAGE3D;
+    (*KeywordMap)["f16image2DRect"] =               F16IMAGE2DRECT;
+    (*KeywordMap)["f16imageCube"] =                 F16IMAGECUBE;
+    (*KeywordMap)["f16image1DArray"] =              F16IMAGE1DARRAY;
+    (*KeywordMap)["f16image2DArray"] =              F16IMAGE2DARRAY;
+    (*KeywordMap)["f16imageCubeArray"] =            F16IMAGECUBEARRAY;
+    (*KeywordMap)["f16imageBuffer"] =               F16IMAGEBUFFER;
+    (*KeywordMap)["f16image2DMS"] =                 F16IMAGE2DMS;
+    (*KeywordMap)["f16image2DMSArray"] =            F16IMAGE2DMSARRAY;
+
+    (*KeywordMap)["f16texture1D"] =                 F16TEXTURE1D;
+    (*KeywordMap)["f16texture2D"] =                 F16TEXTURE2D;
+    (*KeywordMap)["f16texture3D"] =                 F16TEXTURE3D;
+    (*KeywordMap)["f16texture2DRect"] =             F16TEXTURE2DRECT;
+    (*KeywordMap)["f16textureCube"] =               F16TEXTURECUBE;
+    (*KeywordMap)["f16texture1DArray"] =            F16TEXTURE1DARRAY;
+    (*KeywordMap)["f16texture2DArray"] =            F16TEXTURE2DARRAY;
+    (*KeywordMap)["f16textureCubeArray"] =          F16TEXTURECUBEARRAY;
+    (*KeywordMap)["f16textureBuffer"] =             F16TEXTUREBUFFER;
+    (*KeywordMap)["f16texture2DMS"] =               F16TEXTURE2DMS;
+    (*KeywordMap)["f16texture2DMSArray"] =          F16TEXTURE2DMSARRAY;
+
+    (*KeywordMap)["f16subpassInput"] =              F16SUBPASSINPUT;
+    (*KeywordMap)["f16subpassInputMS"] =            F16SUBPASSINPUTMS;
+#endif
+
     (*KeywordMap)["noperspective"] =           NOPERSPECTIVE;
     (*KeywordMap)["smooth"] =                  SMOOTH;
     (*KeywordMap)["flat"] =                    FLAT;
 #ifdef AMD_EXTENSIONS
-    (*KeywordMap)["__explicitInterpAMD"] =     __EXPLICITINTERPAMD;
+    (*KeywordMap)["__explicitInterpAMD"] =     EXPLICITINTERPAMD;
 #endif
     (*KeywordMap)["centroid"] =                CENTROID;
+#ifdef NV_EXTENSIONS
+    (*KeywordMap)["pervertexNV"] =             PERVERTEXNV;
+#endif
     (*KeywordMap)["precise"] =                 PRECISE;
     (*KeywordMap)["invariant"] =               INVARIANT;
     (*KeywordMap)["packed"] =                  PACKED;
     (*KeywordMap)["resource"] =                RESOURCE;
     (*KeywordMap)["superp"] =                  SUPERP;
 
+#ifdef NV_EXTENSIONS
+    (*KeywordMap)["rayPayloadNV"] =            PAYLOADNV;
+    (*KeywordMap)["rayPayloadInNV"] =          PAYLOADINNV;
+    (*KeywordMap)["hitAttributeNV"] =          HITATTRNV;
+    (*KeywordMap)["callableDataNV"] =          CALLDATANV;
+    (*KeywordMap)["callableDataInNV"] =        CALLDATAINNV;
+    (*KeywordMap)["accelerationStructureNV"] = ACCSTRUCTNV;
+    (*KeywordMap)["perprimitiveNV"] =          PERPRIMITIVENV;
+    (*KeywordMap)["perviewNV"] =               PERVIEWNV;
+    (*KeywordMap)["taskNV"] =                  PERTASKNV;
+#endif
+
     ReservedSet = new std::unordered_set<const char*, str_hash, str_eq>;
 
     ReservedSet->insert("common");
@@ -668,7 +798,7 @@
         case '?':                       return QUESTION;
         case '[':                       return LEFT_BRACKET;
         case ']':                       return RIGHT_BRACKET;
-        case '{':                       return LEFT_BRACE;
+        case '{':  afterStruct = false; return LEFT_BRACE;
         case '}':                       return RIGHT_BRACE;
         case '\\':
             parseContext.error(loc, "illegal use of escape character", "\\", "");
@@ -705,15 +835,15 @@
             parseContext.error(loc, "not supported", "::", "");
             break;
 
-        case PpAtomConstInt:           parserToken->sType.lex.i   = ppToken.ival;       return INTCONSTANT;
-        case PpAtomConstUint:          parserToken->sType.lex.i   = ppToken.ival;       return UINTCONSTANT;
-        case PpAtomConstInt64:         parserToken->sType.lex.i64 = ppToken.i64val;     return INT64CONSTANT;
-        case PpAtomConstUint64:        parserToken->sType.lex.i64 = ppToken.i64val;     return UINT64CONSTANT;
-        case PpAtomConstFloat:         parserToken->sType.lex.d   = ppToken.dval;       return FLOATCONSTANT;
-        case PpAtomConstDouble:        parserToken->sType.lex.d   = ppToken.dval;       return DOUBLECONSTANT;
-#ifdef AMD_EXTENSIONS
-        case PpAtomConstFloat16:       parserToken->sType.lex.d   = ppToken.dval;       return FLOAT16CONSTANT;
-#endif
+        case PpAtomConstInt:           parserToken->sType.lex.i    = ppToken.ival;       return INTCONSTANT;
+        case PpAtomConstUint:          parserToken->sType.lex.i    = ppToken.ival;       return UINTCONSTANT;
+        case PpAtomConstInt16:         parserToken->sType.lex.i    = ppToken.ival;       return INT16CONSTANT;
+        case PpAtomConstUint16:        parserToken->sType.lex.i    = ppToken.ival;       return UINT16CONSTANT;
+        case PpAtomConstInt64:         parserToken->sType.lex.i64  = ppToken.i64val;     return INT64CONSTANT;
+        case PpAtomConstUint64:        parserToken->sType.lex.i64  = ppToken.i64val;     return UINT64CONSTANT;
+        case PpAtomConstFloat:         parserToken->sType.lex.d    = ppToken.dval;       return FLOATCONSTANT;
+        case PpAtomConstDouble:        parserToken->sType.lex.d    = ppToken.dval;       return DOUBLECONSTANT;
+        case PpAtomConstFloat16:       parserToken->sType.lex.d    = ppToken.dval;       return FLOAT16CONSTANT;
         case PpAtomIdentifier:
         {
             int token = tokenizeIdentifier();
@@ -751,7 +881,6 @@
     case IN:
     case OUT:
     case INOUT:
-    case STRUCT:
     case BREAK:
     case CONTINUE:
     case DO:
@@ -764,6 +893,16 @@
     case CASE:
         return keyword;
 
+    case STRUCT:
+        afterStruct = true;
+        return keyword;
+
+    case NONUNIFORM:
+        if (parseContext.extensionTurnedOn(E_GL_EXT_nonuniform_qualifier))
+            return keyword;
+        else
+            return identifierOrType();
+
     case SWITCH:
     case DEFAULT:
         if ((parseContext.profile == EEsProfile && parseContext.version < 300) ||
@@ -811,6 +950,20 @@
             return identifierOrType();
         return keyword;
 
+#ifdef NV_EXTENSIONS
+    case PAYLOADNV:
+    case PAYLOADINNV:
+    case HITATTRNV:
+    case CALLDATANV:
+    case CALLDATAINNV:
+    case ACCSTRUCTNV:
+        if (parseContext.symbolTable.atBuiltInLevel() ||
+            (parseContext.profile != EEsProfile && parseContext.version >= 460
+                 && parseContext.extensionTurnedOn(E_GL_NV_ray_tracing)))
+            return keyword;
+        return identifierOrType();
+#endif
+
     case ATOMIC_UINT:
         if ((parseContext.profile == EEsProfile && parseContext.version >= 310) ||
             parseContext.extensionTurnedOn(E_GL_ARB_shader_atomic_counters))
@@ -818,6 +971,11 @@
         return es30ReservedFromGLSL(420);
 
     case COHERENT:
+    case DEVICECOHERENT:
+    case QUEUEFAMILYCOHERENT:
+    case WORKGROUPCOHERENT:
+    case SUBGROUPCOHERENT:
+    case NONPRIVATE:
     case RESTRICT:
     case READONLY:
     case WRITEONLY:
@@ -828,7 +986,8 @@
     case VOLATILE:
         if (parseContext.profile == EEsProfile && parseContext.version >= 310)
             return keyword;
-        if (! parseContext.symbolTable.atBuiltInLevel() && (parseContext.profile == EEsProfile || (parseContext.version < 420 && ! parseContext.extensionTurnedOn(E_GL_ARB_shader_image_load_store))))
+        if (! parseContext.symbolTable.atBuiltInLevel() && (parseContext.profile == EEsProfile ||
+            (parseContext.version < 420 && ! parseContext.extensionTurnedOn(E_GL_ARB_shader_image_load_store))))
             reservedWord();
         return keyword;
 
@@ -851,14 +1010,17 @@
 
     case PATCH:
         if (parseContext.symbolTable.atBuiltInLevel() ||
-            (parseContext.profile == EEsProfile && parseContext.extensionsTurnedOn(Num_AEP_tessellation_shader, AEP_tessellation_shader)) ||
+            (parseContext.profile == EEsProfile &&
+             (parseContext.version >= 320 ||
+              parseContext.extensionsTurnedOn(Num_AEP_tessellation_shader, AEP_tessellation_shader))) ||
             (parseContext.profile != EEsProfile && parseContext.extensionTurnedOn(E_GL_ARB_tessellation_shader)))
             return keyword;
 
         return es30ReservedFromGLSL(400);
 
     case SAMPLE:
-        if (parseContext.extensionsTurnedOn(1, &E_GL_OES_shader_multisample_interpolation))
+        if ((parseContext.profile == EEsProfile && parseContext.version >= 320) ||
+            parseContext.extensionsTurnedOn(1, &E_GL_OES_shader_multisample_interpolation))
             return keyword;
         return es30ReservedFromGLSL(400);
 
@@ -912,7 +1074,8 @@
     case IIMAGEBUFFER:
     case UIMAGEBUFFER:
         afterType = true;
-        if (parseContext.extensionsTurnedOn(Num_AEP_texture_buffer, AEP_texture_buffer))
+        if ((parseContext.profile == EEsProfile && parseContext.version >= 320) ||
+            parseContext.extensionsTurnedOn(Num_AEP_texture_buffer, AEP_texture_buffer))
             return keyword;
         return firstGenerationImage(false);
 
@@ -935,7 +1098,8 @@
     case IIMAGECUBEARRAY:
     case UIMAGECUBEARRAY:
         afterType = true;
-        if (parseContext.extensionsTurnedOn(Num_AEP_texture_cube_map_array, AEP_texture_cube_map_array))
+        if ((parseContext.profile == EEsProfile && parseContext.version >= 320) ||
+            parseContext.extensionsTurnedOn(Num_AEP_texture_cube_map_array, AEP_texture_cube_map_array))
             return keyword;
         return secondGenerationImage();
 
@@ -967,16 +1131,131 @@
     case U64VEC4:
         afterType = true;
         if (parseContext.symbolTable.atBuiltInLevel() ||
-            (parseContext.extensionTurnedOn(E_GL_ARB_gpu_shader_int64) &&
-             parseContext.profile != EEsProfile && parseContext.version >= 450))
+            (parseContext.profile != EEsProfile && parseContext.version >= 450 &&
+             (parseContext.extensionTurnedOn(E_GL_ARB_gpu_shader_int64) ||
+              parseContext.extensionTurnedOn(E_GL_EXT_shader_explicit_arithmetic_types) ||
+              parseContext.extensionTurnedOn(E_GL_EXT_shader_explicit_arithmetic_types_int64))))
             return keyword;
         return identifierOrType();
 
+    case INT8_T:
+    case UINT8_T:
+    case I8VEC2:
+    case I8VEC3:
+    case I8VEC4:
+    case U8VEC2:
+    case U8VEC3:
+    case U8VEC4:
+        afterType = true;
+        if (parseContext.symbolTable.atBuiltInLevel() ||
+            ((parseContext.extensionTurnedOn(E_GL_EXT_shader_explicit_arithmetic_types) ||
+              parseContext.extensionTurnedOn(E_GL_EXT_shader_8bit_storage) ||
+              parseContext.extensionTurnedOn(E_GL_EXT_shader_explicit_arithmetic_types_int8)) &&
+              parseContext.profile != EEsProfile && parseContext.version >= 450))
+            return keyword;
+        return identifierOrType();
+
+    case INT16_T:
+    case UINT16_T:
+    case I16VEC2:
+    case I16VEC3:
+    case I16VEC4:
+    case U16VEC2:
+    case U16VEC3:
+    case U16VEC4:
+        afterType = true;
+        if (parseContext.symbolTable.atBuiltInLevel() ||
+            (parseContext.profile != EEsProfile && parseContext.version >= 450 &&
+             (
 #ifdef AMD_EXTENSIONS
+              parseContext.extensionTurnedOn(E_GL_AMD_gpu_shader_int16) ||
+#endif
+              parseContext.extensionTurnedOn(E_GL_EXT_shader_16bit_storage) ||
+              parseContext.extensionTurnedOn(E_GL_EXT_shader_explicit_arithmetic_types) ||
+              parseContext.extensionTurnedOn(E_GL_EXT_shader_explicit_arithmetic_types_int16))))
+            return keyword;
+        return identifierOrType();
+    case INT32_T:
+    case UINT32_T:
+    case I32VEC2:
+    case I32VEC3:
+    case I32VEC4:
+    case U32VEC2:
+    case U32VEC3:
+    case U32VEC4:
+        afterType = true;
+        if (parseContext.symbolTable.atBuiltInLevel() ||
+           ((parseContext.extensionTurnedOn(E_GL_EXT_shader_explicit_arithmetic_types) ||
+             parseContext.extensionTurnedOn(E_GL_EXT_shader_explicit_arithmetic_types_int32)) &&
+             parseContext.profile != EEsProfile && parseContext.version >= 450))
+            return keyword;
+        return identifierOrType();
+    case FLOAT32_T:
+    case F32VEC2:
+    case F32VEC3:
+    case F32VEC4:
+    case F32MAT2:
+    case F32MAT3:
+    case F32MAT4:
+    case F32MAT2X2:
+    case F32MAT2X3:
+    case F32MAT2X4:
+    case F32MAT3X2:
+    case F32MAT3X3:
+    case F32MAT3X4:
+    case F32MAT4X2:
+    case F32MAT4X3:
+    case F32MAT4X4:
+        afterType = true;
+        if (parseContext.symbolTable.atBuiltInLevel() ||
+            ((parseContext.extensionTurnedOn(E_GL_EXT_shader_explicit_arithmetic_types) ||
+              parseContext.extensionTurnedOn(E_GL_EXT_shader_explicit_arithmetic_types_float32)) &&
+              parseContext.profile != EEsProfile && parseContext.version >= 450))
+            return keyword;
+        return identifierOrType();
+
+    case FLOAT64_T:
+    case F64VEC2:
+    case F64VEC3:
+    case F64VEC4:
+    case F64MAT2:
+    case F64MAT3:
+    case F64MAT4:
+    case F64MAT2X2:
+    case F64MAT2X3:
+    case F64MAT2X4:
+    case F64MAT3X2:
+    case F64MAT3X3:
+    case F64MAT3X4:
+    case F64MAT4X2:
+    case F64MAT4X3:
+    case F64MAT4X4:
+        afterType = true;
+        if (parseContext.symbolTable.atBuiltInLevel() ||
+            ((parseContext.extensionTurnedOn(E_GL_EXT_shader_explicit_arithmetic_types) ||
+              parseContext.extensionTurnedOn(E_GL_EXT_shader_explicit_arithmetic_types_float64)) &&
+              parseContext.profile != EEsProfile && parseContext.version >= 450))
+            return keyword;
+        return identifierOrType();
+
     case FLOAT16_T:
     case F16VEC2:
     case F16VEC3:
     case F16VEC4:
+        afterType = true;
+        if (parseContext.symbolTable.atBuiltInLevel() ||
+            (parseContext.profile != EEsProfile && parseContext.version >= 450 &&
+             (
+#ifdef AMD_EXTENSIONS
+              parseContext.extensionTurnedOn(E_GL_AMD_gpu_shader_half_float) ||
+#endif
+              parseContext.extensionTurnedOn(E_GL_EXT_shader_16bit_storage) ||
+              parseContext.extensionTurnedOn(E_GL_EXT_shader_explicit_arithmetic_types) ||
+              parseContext.extensionTurnedOn(E_GL_EXT_shader_explicit_arithmetic_types_float16))))
+            return keyword;
+
+        return identifierOrType();
+
     case F16MAT2:
     case F16MAT3:
     case F16MAT4:
@@ -991,18 +1270,24 @@
     case F16MAT4X4:
         afterType = true;
         if (parseContext.symbolTable.atBuiltInLevel() ||
-            (parseContext.extensionTurnedOn(E_GL_AMD_gpu_shader_half_float) &&
-             parseContext.profile != EEsProfile && parseContext.version >= 450))
-            return keyword;
-        return identifierOrType();
+            (parseContext.profile != EEsProfile && parseContext.version >= 450 &&
+             (
+#ifdef AMD_EXTENSIONS
+              parseContext.extensionTurnedOn(E_GL_AMD_gpu_shader_half_float) ||
 #endif
+              parseContext.extensionTurnedOn(E_GL_EXT_shader_explicit_arithmetic_types) ||
+              parseContext.extensionTurnedOn(E_GL_EXT_shader_explicit_arithmetic_types_float16))))
+            return keyword;
+
+        return identifierOrType();
 
     case SAMPLERCUBEARRAY:
     case SAMPLERCUBEARRAYSHADOW:
     case ISAMPLERCUBEARRAY:
     case USAMPLERCUBEARRAY:
         afterType = true;
-        if (parseContext.extensionsTurnedOn(Num_AEP_texture_cube_map_array, AEP_texture_cube_map_array))
+        if ((parseContext.profile == EEsProfile && parseContext.version >= 320) ||
+            parseContext.extensionsTurnedOn(Num_AEP_texture_cube_map_array, AEP_texture_cube_map_array))
             return keyword;
         if (parseContext.profile == EEsProfile || (parseContext.version < 400 && ! parseContext.extensionTurnedOn(E_GL_ARB_texture_cube_map_array)))
             reservedWord();
@@ -1041,14 +1326,16 @@
 
     case SAMPLERBUFFER:
         afterType = true;
-        if (parseContext.extensionsTurnedOn(Num_AEP_texture_buffer, AEP_texture_buffer))
+        if ((parseContext.profile == EEsProfile && parseContext.version >= 320) ||
+            parseContext.extensionsTurnedOn(Num_AEP_texture_buffer, AEP_texture_buffer))
             return keyword;
         return es30ReservedFromGLSL(130);
 
     case ISAMPLERBUFFER:
     case USAMPLERBUFFER:
         afterType = true;
-        if (parseContext.extensionsTurnedOn(Num_AEP_texture_buffer, AEP_texture_buffer))
+        if ((parseContext.profile == EEsProfile && parseContext.version >= 320) ||
+            parseContext.extensionsTurnedOn(Num_AEP_texture_buffer, AEP_texture_buffer))
             return keyword;
         return es30ReservedFromGLSL(140);
 
@@ -1064,7 +1351,8 @@
     case ISAMPLER2DMSARRAY:
     case USAMPLER2DMSARRAY:
         afterType = true;
-        if (parseContext.extensionsTurnedOn(1, &E_GL_OES_texture_storage_multisample_2d_array))
+        if ((parseContext.profile == EEsProfile && parseContext.version >= 320) ||
+            parseContext.extensionsTurnedOn(1, &E_GL_OES_texture_storage_multisample_2d_array))
             return keyword;
         return es30ReservedFromGLSL(150);
 
@@ -1078,15 +1366,17 @@
     case SAMPLER3D:
         afterType = true;
         if (parseContext.profile == EEsProfile && parseContext.version < 300) {
-            if (! parseContext.extensionTurnedOn(E_GL_OES_texture_3D))
+            if (!parseContext.extensionTurnedOn(E_GL_OES_texture_3D))
                 reservedWord();
         }
         return keyword;
 
     case SAMPLER2DSHADOW:
         afterType = true;
-        if (parseContext.profile == EEsProfile && parseContext.version < 300)
-            reservedWord();
+        if (parseContext.profile == EEsProfile && parseContext.version < 300) {
+            if (!parseContext.extensionTurnedOn(E_GL_EXT_shadow_samplers))
+                reservedWord();
+        }
         return keyword;
 
     case SAMPLER2DRECT:
@@ -1113,7 +1403,9 @@
 
     case SAMPLEREXTERNALOES:
         afterType = true;
-        if (parseContext.symbolTable.atBuiltInLevel() || parseContext.extensionTurnedOn(E_GL_OES_EGL_image_external))
+        if (parseContext.symbolTable.atBuiltInLevel() ||
+            parseContext.extensionTurnedOn(E_GL_OES_EGL_image_external) ||
+            parseContext.extensionTurnedOn(E_GL_OES_EGL_image_external_essl3))
             return keyword;
         return identifierOrType();
 
@@ -1152,7 +1444,7 @@
     case TEXTURE1DARRAY:
     case SAMPLER:
     case SAMPLERSHADOW:
-        if (parseContext.spvVersion.vulkan >= 100)
+        if (parseContext.spvVersion.vulkan > 0)
             return keyword;
         else
             return identifierOrType();
@@ -1163,12 +1455,71 @@
     case ISUBPASSINPUTMS:
     case USUBPASSINPUT:
     case USUBPASSINPUTMS:
-        if (parseContext.spvVersion.vulkan >= 100)
+        if (parseContext.spvVersion.vulkan > 0)
             return keyword;
         else
             return identifierOrType();
 
+#ifdef AMD_EXTENSIONS
+    case F16SAMPLER1D:
+    case F16SAMPLER2D:
+    case F16SAMPLER3D:
+    case F16SAMPLER2DRECT:
+    case F16SAMPLERCUBE:
+    case F16SAMPLER1DARRAY:
+    case F16SAMPLER2DARRAY:
+    case F16SAMPLERCUBEARRAY:
+    case F16SAMPLERBUFFER:
+    case F16SAMPLER2DMS:
+    case F16SAMPLER2DMSARRAY:
+    case F16SAMPLER1DSHADOW:
+    case F16SAMPLER2DSHADOW:
+    case F16SAMPLER1DARRAYSHADOW:
+    case F16SAMPLER2DARRAYSHADOW:
+    case F16SAMPLER2DRECTSHADOW:
+    case F16SAMPLERCUBESHADOW:
+    case F16SAMPLERCUBEARRAYSHADOW:
+
+    case F16IMAGE1D:
+    case F16IMAGE2D:
+    case F16IMAGE3D:
+    case F16IMAGE2DRECT:
+    case F16IMAGECUBE:
+    case F16IMAGE1DARRAY:
+    case F16IMAGE2DARRAY:
+    case F16IMAGECUBEARRAY:
+    case F16IMAGEBUFFER:
+    case F16IMAGE2DMS:
+    case F16IMAGE2DMSARRAY:
+
+    case F16TEXTURE1D:
+    case F16TEXTURE2D:
+    case F16TEXTURE3D:
+    case F16TEXTURE2DRECT:
+    case F16TEXTURECUBE:
+    case F16TEXTURE1DARRAY:
+    case F16TEXTURE2DARRAY:
+    case F16TEXTURECUBEARRAY:
+    case F16TEXTUREBUFFER:
+    case F16TEXTURE2DMS:
+    case F16TEXTURE2DMSARRAY:
+
+    case F16SUBPASSINPUT:
+    case F16SUBPASSINPUTMS:
+        afterType = true;
+        if (parseContext.symbolTable.atBuiltInLevel() ||
+            (parseContext.extensionTurnedOn(E_GL_AMD_gpu_shader_half_float_fetch) &&
+             parseContext.profile != EEsProfile && parseContext.version >= 450))
+            return keyword;
+        return identifierOrType();
+#endif
+
     case NOPERSPECTIVE:
+#ifdef NV_EXTENSIONS
+        if (parseContext.profile == EEsProfile && parseContext.version >= 300 &&
+            parseContext.extensionTurnedOn(E_GL_NV_shader_noperspective_interpolation))
+            return keyword;
+#endif
         return es30ReservedFromGLSL(130);
 
     case SMOOTH:
@@ -1178,13 +1529,22 @@
         return keyword;
 
 #ifdef AMD_EXTENSIONS
-    case __EXPLICITINTERPAMD:
+    case EXPLICITINTERPAMD:
         if (parseContext.profile != EEsProfile && parseContext.version >= 450 &&
             parseContext.extensionTurnedOn(E_GL_AMD_shader_explicit_vertex_parameter))
             return keyword;
         return identifierOrType();
 #endif
 
+#ifdef NV_EXTENSIONS
+    case PERVERTEXNV:
+        if (((parseContext.profile != EEsProfile && parseContext.version >= 450) ||
+            (parseContext.profile == EEsProfile && parseContext.version >= 320)) &&
+            parseContext.extensionTurnedOn(E_GL_NV_fragment_shader_barycentric))
+            return keyword;
+        return identifierOrType();
+#endif
+
     case FLAT:
         if (parseContext.profile == EEsProfile && parseContext.version < 300)
             reservedWord();
@@ -1198,7 +1558,8 @@
         return keyword;
 
     case PRECISE:
-        if ((parseContext.profile == EEsProfile && parseContext.extensionsTurnedOn(Num_AEP_gpu_shader5, AEP_gpu_shader5)) ||
+        if ((parseContext.profile == EEsProfile &&
+             (parseContext.version >= 320 || parseContext.extensionsTurnedOn(Num_AEP_gpu_shader5, AEP_gpu_shader5))) ||
             (parseContext.profile != EEsProfile && parseContext.version >= 400))
             return keyword;
         if (parseContext.profile == EEsProfile && parseContext.version == 310) {
@@ -1230,6 +1591,17 @@
         return identifierOrReserved(reserved);
     }
 
+#ifdef NV_EXTENSIONS
+    case PERPRIMITIVENV:
+    case PERVIEWNV:
+    case PERTASKNV:
+        if ((parseContext.profile != EEsProfile && parseContext.version >= 450) ||
+            (parseContext.profile == EEsProfile && parseContext.version >= 320) ||
+            parseContext.extensionTurnedOn(E_GL_NV_mesh_shader))
+            return keyword;
+        return identifierOrType();
+#endif
+
     default:
         parseContext.infoSink.info.message(EPrefixInternalError, "Unknown glslang keyword", loc);
         return 0;
@@ -1243,7 +1615,7 @@
         return IDENTIFIER;
 
     parserToken->sType.lex.symbol = parseContext.symbolTable.find(*parserToken->sType.lex.string);
-    if (afterType == false && parserToken->sType.lex.symbol) {
+    if ((afterType == false && afterStruct == false) && parserToken->sType.lex.symbol != nullptr) {
         if (const TVariable* variable = parserToken->sType.lex.symbol->getAsVariable()) {
             if (variable->isUserType()) {
                 afterType = true;
@@ -1361,7 +1733,8 @@
 int TScanContext::firstGenerationImage(bool inEs310)
 {
     if (parseContext.symbolTable.atBuiltInLevel() ||
-        (parseContext.profile != EEsProfile && (parseContext.version >= 420 || parseContext.extensionTurnedOn(E_GL_ARB_shader_image_load_store))) ||
+        (parseContext.profile != EEsProfile && (parseContext.version >= 420 ||
+         parseContext.extensionTurnedOn(E_GL_ARB_shader_image_load_store))) ||
         (inEs310 && parseContext.profile == EEsProfile && parseContext.version >= 310))
         return keyword;
 
diff --git a/glslang/MachineIndependent/Scan.h b/glslang/MachineIndependent/Scan.h
index 9b8f2d4..2c26c2e 100644
--- a/glslang/MachineIndependent/Scan.h
+++ b/glslang/MachineIndependent/Scan.h
@@ -51,25 +51,24 @@
 //
 class TInputScanner {
 public:
-    TInputScanner(int n, const char* const s[], size_t L[], const char* const* names = nullptr, int b = 0, int f = 0, bool single = false) :
+    TInputScanner(int n, const char* const s[], size_t L[], const char* const* names = nullptr,
+                  int b = 0, int f = 0, bool single = false) :
         numSources(n),
-        sources(reinterpret_cast<const unsigned char* const *>(s)), // up to this point, common usage is "char*", but now we need positive 8-bit characters
-        lengths(L), currentSource(0), currentChar(0), stringBias(b), finale(f), singleLogical(single), endOfFileReached(false)
+         // up to this point, common usage is "char*", but now we need positive 8-bit characters
+        sources(reinterpret_cast<const unsigned char* const *>(s)),
+        lengths(L), currentSource(0), currentChar(0), stringBias(b), finale(f), singleLogical(single),
+        endOfFileReached(false)
     {
         loc = new TSourceLoc[numSources];
         for (int i = 0; i < numSources; ++i) {
-            loc[i].init();
+            loc[i].init(i - stringBias);
         }
         if (names != nullptr) {
             for (int i = 0; i < numSources; ++i)
                 loc[i].name = names[i];
         }
-        loc[currentSource].string = -stringBias;
         loc[currentSource].line = 1;
-        loc[currentSource].column = 0;
-        logicalSourceLoc.string = 0;
-        logicalSourceLoc.line = 1;
-        logicalSourceLoc.column = 0;
+        logicalSourceLoc.init(1);
         logicalSourceLoc.name = loc[0].name;
     }
 
diff --git a/glslang/MachineIndependent/ScanContext.h b/glslang/MachineIndependent/ScanContext.h
index 1d86348..0cc7ea0 100644
--- a/glslang/MachineIndependent/ScanContext.h
+++ b/glslang/MachineIndependent/ScanContext.h
@@ -38,6 +38,8 @@
 // sits between the preprocessor scanner and parser.
 //
 
+#pragma once
+
 #include "ParseHelper.h"
 
 namespace glslang {
@@ -48,7 +50,10 @@
 
 class TScanContext {
 public:
-    explicit TScanContext(TParseContextBase& pc) : parseContext(pc), afterType(false), field(false) { }
+    explicit TScanContext(TParseContextBase& pc) :
+        parseContext(pc),
+        afterType(false), afterStruct(false),
+        field(false) { }
     virtual ~TScanContext() { }
 
     static void fillInKeywordMap();
@@ -74,6 +79,7 @@
 
     TParseContextBase& parseContext;
     bool afterType;           // true if we've recognized a type, so can only be looking for an identifier
+    bool afterStruct;         // true if we've recognized the STRUCT keyword, so can only be looking for an identifier
     bool field;               // true if we're on a field, right after a '.'
     TSourceLoc loc;
     TParserToken* parserToken;
diff --git a/glslang/MachineIndependent/ShaderLang.cpp b/glslang/MachineIndependent/ShaderLang.cpp
old mode 100644
new mode 100755
index de8dd6a..3c847d2
--- a/glslang/MachineIndependent/ShaderLang.cpp
+++ b/glslang/MachineIndependent/ShaderLang.cpp
@@ -1,7 +1,7 @@
 //
 // Copyright (C) 2002-2005  3Dlabs Inc. Ltd.
 // Copyright (C) 2013-2016 LunarG, Inc.
-// Copyright (C) 2015-2016 Google, Inc.
+// Copyright (C) 2015-2017 Google, Inc.
 //
 // All rights reserved.
 //
@@ -67,8 +67,17 @@
 #include "iomapper.h"
 #include "Initialize.h"
 
+// TODO: this really shouldn't be here, it is only because of the trial addition
+// of printing pre-processed tokens, which requires knowing the string literal
+// token to print ", but none of that seems appropriate for this file.
+#include "preprocessor/PpTokens.h"
+
 namespace { // anonymous namespace for file-local functions and symbols
 
+// Total number of successful initializers of glslang: a refcount
+// Shared global; access should be protected by a global mutex/critical section.
+int NumberOfClients = 0;
+
 using namespace glslang;
 
 // Create a language specific version of parseables.
@@ -91,18 +100,16 @@
                                       int version, EProfile profile, EShSource source,
                                       EShLanguage language, TInfoSink& infoSink,
                                       SpvVersion spvVersion, bool forwardCompatible, EShMessages messages,
-                                      bool parsingBuiltIns, const std::string sourceEntryPointName = "")
+                                      bool parsingBuiltIns, std::string sourceEntryPointName = "")
 {
-#ifndef ENABLE_HLSL
-    (void)sourceEntryPointName; // Unused argument.
-#endif
-
     switch (source) {
-    case EShSourceGlsl:
-        intermediate.setEntryPointName("main");
+    case EShSourceGlsl: {
+        if (sourceEntryPointName.size() == 0)
+            intermediate.setEntryPointName("main");
+        TString entryPoint = sourceEntryPointName.c_str();
         return new TParseContext(symbolTable, intermediate, parsingBuiltIns, version, profile, spvVersion,
-                                 language, infoSink, forwardCompatible, messages);
-
+                                 language, infoSink, forwardCompatible, messages, &entryPoint);
+    }
 #ifdef ENABLE_HLSL
     case EShSourceHlsl:
         return new HlslParseContext(symbolTable, intermediate, parsingBuiltIns, version, profile, spvVersion,
@@ -116,7 +123,7 @@
 
 // Local mapping functions for making arrays of symbol tables....
 
-const int VersionCount = 15;  // index range in MapVersionToIndex
+const int VersionCount = 17;  // index range in MapVersionToIndex
 
 int MapVersionToIndex(int version)
 {
@@ -138,7 +145,10 @@
     case 440: index = 12; break;
     case 310: index = 13; break;
     case 450: index = 14; break;
-    default:              break;
+    case 500: index =  0; break; // HLSL
+    case 320: index = 15; break;
+    case 460: index = 16; break;
+    default:  assert(0);  break;
     }
 
     assert(index < VersionCount);
@@ -216,7 +226,7 @@
 TSymbolTable* CommonSymbolTable[VersionCount][SpvVersionCount][ProfileCount][SourceCount][EPcCount] = {};
 TSymbolTable* SharedSymbolTables[VersionCount][SpvVersionCount][ProfileCount][SourceCount][EShLangCount] = {};
 
-TPoolAllocator* PerProcessGPA = 0;
+TPoolAllocator* PerProcessGPA = nullptr;
 
 //
 // Parse and add to the given symbol table the content of the given shader string.
@@ -337,6 +347,36 @@
         InitializeStageSymbolTable(*builtInParseables, version, profile, spvVersion, EShLangCompute, source,
                                    infoSink, commonTable, symbolTables);
 
+#ifdef NV_EXTENSIONS
+    // check for ray tracing stages
+    if (profile != EEsProfile && version >= 450) {
+        InitializeStageSymbolTable(*builtInParseables, version, profile, spvVersion, EShLangRayGenNV, source,
+            infoSink, commonTable, symbolTables);
+        InitializeStageSymbolTable(*builtInParseables, version, profile, spvVersion, EShLangIntersectNV, source,
+            infoSink, commonTable, symbolTables);
+        InitializeStageSymbolTable(*builtInParseables, version, profile, spvVersion, EShLangAnyHitNV, source,
+            infoSink, commonTable, symbolTables);
+        InitializeStageSymbolTable(*builtInParseables, version, profile, spvVersion, EShLangClosestHitNV, source,
+            infoSink, commonTable, symbolTables);
+        InitializeStageSymbolTable(*builtInParseables, version, profile, spvVersion, EShLangMissNV, source,
+            infoSink, commonTable, symbolTables);
+        InitializeStageSymbolTable(*builtInParseables, version, profile, spvVersion, EShLangCallableNV, source,
+            infoSink, commonTable, symbolTables);
+    }
+
+    // check for mesh
+    if ((profile != EEsProfile && version >= 450) ||
+        (profile == EEsProfile && version >= 320))
+        InitializeStageSymbolTable(*builtInParseables, version, profile, spvVersion, EShLangMeshNV, source,
+                                   infoSink, commonTable, symbolTables);
+
+    // check for task
+    if ((profile != EEsProfile && version >= 450) ||
+        (profile == EEsProfile && version >= 320))
+        InitializeStageSymbolTable(*builtInParseables, version, profile, spvVersion, EShLangTaskNV, source,
+                                   infoSink, commonTable, symbolTables);
+#endif
+
     return true;
 }
 
@@ -360,7 +400,7 @@
 // pool allocator intact, so:
 //  - Switch to a new pool for parsing the built-ins
 //  - Do the parsing, which builds the symbol table, using the new pool
-//  - Switch to the process-global pool to save a copy the resulting symbol table
+//  - Switch to the process-global pool to save a copy of the resulting symbol table
 //  - Free up the new pool used to parse the built-ins
 //  - Switch back to the original thread's pool
 //
@@ -387,8 +427,8 @@
 
     // Switch to a new pool
     TPoolAllocator& previousAllocator = GetThreadPoolAllocator();
-    TPoolAllocator* builtInPoolAllocator = new TPoolAllocator();
-    SetThreadPoolAllocator(*builtInPoolAllocator);
+    TPoolAllocator* builtInPoolAllocator = new TPoolAllocator;
+    SetThreadPoolAllocator(builtInPoolAllocator);
 
     // Dynamically allocate the local symbol tables so we can control when they are deallocated WRT when the pool is popped.
     TSymbolTable* commonTable[EPcCount];
@@ -402,7 +442,7 @@
     InitializeSymbolTables(infoSink, commonTable, stageTables, version, profile, spvVersion, source);
 
     // Switch to the process-global pool
-    SetThreadPoolAllocator(*PerProcessGPA);
+    SetThreadPoolAllocator(PerProcessGPA);
 
     // Copy the local symbol tables from the new pool to the global tables using the process-global pool
     for (int precClass = 0; precClass < EPcCount; ++precClass) {
@@ -429,7 +469,7 @@
         delete stageTables[stage];
 
     delete builtInPoolAllocator;
-    SetThreadPoolAllocator(previousAllocator);
+    SetThreadPoolAllocator(&previousAllocator);
 
     glslang::ReleaseGlobalLock();
 }
@@ -447,7 +487,7 @@
         return correct;
     }
 
-    // Get a good version...
+    // Get a version...
     if (version == 0) {
         version = defaultVersion;
         // infoSink.info.message(EPrefixWarning, "#version: statement missing; use #version on first line of shader");
@@ -455,9 +495,9 @@
 
     // Get a good profile...
     if (profile == ENoProfile) {
-        if (version == 300 || version == 310) {
+        if (version == 300 || version == 310 || version == 320) {
             correct = false;
-            infoSink.info.message(EPrefixError, "#version: versions 300 and 310 require specifying the 'es' profile");
+            infoSink.info.message(EPrefixError, "#version: versions 300, 310, and 320 require specifying the 'es' profile");
             profile = EEsProfile;
         } else if (version == 100)
             profile = EEsProfile;
@@ -474,16 +514,16 @@
                 profile = EEsProfile;
             else
                 profile = ENoProfile;
-        } else if (version == 300 || version == 310) {
+        } else if (version == 300 || version == 310 || version == 320) {
             if (profile != EEsProfile) {
                 correct = false;
-                infoSink.info.message(EPrefixError, "#version: versions 300 and 310 support only the es profile");
+                infoSink.info.message(EPrefixError, "#version: versions 300, 310, and 320 support only the es profile");
             }
             profile = EEsProfile;
         } else {
             if (profile == EEsProfile) {
                 correct = false;
-                infoSink.info.message(EPrefixError, "#version: only version 300 and 310 support the es profile");
+                infoSink.info.message(EPrefixError, "#version: only version 300, 310, and 320 support the es profile");
                 if (version >= FirstProfileVersion)
                     profile = ECoreProfile;
                 else
@@ -493,6 +533,42 @@
         }
     }
 
+    // Fix version...
+    switch (version) {
+    // ES versions
+    case 100: break;
+    case 300: break;
+    case 310: break;
+    case 320: break;
+
+    // desktop versions
+    case 110: break;
+    case 120: break;
+    case 130: break;
+    case 140: break;
+    case 150: break;
+    case 330: break;
+    case 400: break;
+    case 410: break;
+    case 420: break;
+    case 430: break;
+    case 440: break;
+    case 450: break;
+    case 460: break;
+
+    // unknown version
+    default:
+        correct = false;
+        infoSink.info.message(EPrefixError, "version not supported");
+        if (profile == EEsProfile)
+            version = 310;
+        else {
+            version = 450;
+            profile = ECoreProfile;
+        }
+        break;
+    }
+
     // Correct for stage type...
     switch (stage) {
     case EShLangGeometry:
@@ -524,6 +600,28 @@
             version = profile == EEsProfile ? 310 : 420;
         }
         break;
+#ifdef NV_EXTENSIONS
+    case EShLangRayGenNV:
+    case EShLangIntersectNV:
+    case EShLangAnyHitNV:
+    case EShLangClosestHitNV:
+    case EShLangMissNV:
+    case EShLangCallableNV:
+        if (profile == EEsProfile || version < 460) {
+            correct = false;
+            infoSink.info.message(EPrefixError, "#version: ray tracing shaders require non-es profile with version 460 or above");
+            version = 460;
+        }
+        break;
+    case EShLangMeshNV:
+    case EShLangTaskNV:
+        if ((profile == EEsProfile && version < 320) ||
+            (profile != EEsProfile && version < 450)) {
+            correct = false;
+            infoSink.info.message(EPrefixError, "#version: mesh/task shaders require es profile with version 320 or above, or non-es profile with version 450 or above");
+            version = profile == EEsProfile ? 320 : 450;
+        }
+#endif
     default:
         break;
     }
@@ -537,7 +635,7 @@
     if (spvVersion.spv != 0) {
         switch (profile) {
         case  EEsProfile:
-            if (spvVersion.vulkan >= 100 && version < 310) {
+            if (spvVersion.vulkan > 0 && version < 310) {
                 correct = false;
                 infoSink.info.message(EPrefixError, "#version: ES shaders for Vulkan SPIR-V require version 310 or higher");
                 version = 310;
@@ -552,7 +650,7 @@
             infoSink.info.message(EPrefixError, "#version: compilation for SPIR-V does not support the compatibility profile");
             break;
         default:
-            if (spvVersion.vulkan >= 100 && version < 140) {
+            if (spvVersion.vulkan > 0 && version < 140) {
                 correct = false;
                 infoSink.info.message(EPrefixError, "#version: Desktop shaders for Vulkan SPIR-V require version 140 or higher");
                 version = 140;
@@ -566,44 +664,92 @@
         }
     }
 
-    // A meta check on the condition of the compiler itself...
-    switch (version) {
-
-    // ES versions
-    case 100:
-    case 300:
-        // versions are complete
-        break;
-
-    // Desktop versions
-    case 110:
-    case 120:
-    case 130:
-    case 140:
-    case 150:
-    case 330:
-        // versions are complete
-        break;
-
-    case 310:
-    case 400:
-    case 410:
-    case 420:
-    case 430:
-    case 440:
-    case 450:
-        infoSink.info << "Warning, version " << version << " is not yet complete; most version-specific features are present, but some are missing.\n";
-        break;
-
-    default:
-        infoSink.info << "Warning, version " << version << " is unknown.\n";
-        break;
-
-    }
-
     return correct;
 }
 
+// There are multiple paths in for setting environment stuff.
+// TEnvironment takes precedence, for what it sets, so sort all this out.
+// Ideally, the internal code could be made to use TEnvironment, but for
+// now, translate it to the historically used parameters.
+void TranslateEnvironment(const TEnvironment* environment, EShMessages& messages, EShSource& source,
+                          EShLanguage& stage, SpvVersion& spvVersion)
+{
+    // Set up environmental defaults, first ignoring 'environment'.
+    if (messages & EShMsgSpvRules)
+        spvVersion.spv = EShTargetSpv_1_0;
+    if (messages & EShMsgVulkanRules) {
+        spvVersion.vulkan = EShTargetVulkan_1_0;
+        spvVersion.vulkanGlsl = 100;
+    } else if (spvVersion.spv != 0)
+        spvVersion.openGl = 100;
+
+    // Now, override, based on any content set in 'environment'.
+    // 'environment' must be cleared to ESh*None settings when items
+    // are not being set.
+    if (environment != nullptr) {
+        // input language
+        if (environment->input.languageFamily != EShSourceNone) {
+            stage = environment->input.stage;
+            switch (environment->input.dialect) {
+            case EShClientNone:
+                break;
+            case EShClientVulkan:
+                spvVersion.vulkanGlsl = environment->input.dialectVersion;
+                break;
+            case EShClientOpenGL:
+                spvVersion.openGl = environment->input.dialectVersion;
+                break;
+            }
+            switch (environment->input.languageFamily) {
+            case EShSourceNone:
+                break;
+            case EShSourceGlsl:
+                source = EShSourceGlsl;
+                messages = static_cast<EShMessages>(messages & ~EShMsgReadHlsl);
+                break;
+            case EShSourceHlsl:
+                source = EShSourceHlsl;
+                messages = static_cast<EShMessages>(messages | EShMsgReadHlsl);
+                break;
+            }
+        }
+
+        // client
+        switch (environment->client.client) {
+        case EShClientVulkan:
+            spvVersion.vulkan = environment->client.version;
+            break;
+        default:
+            break;
+        }
+
+        // generated code
+        switch (environment->target.language) {
+        case EshTargetSpv:
+            spvVersion.spv = environment->target.version;
+            break;
+        default:
+            break;
+        }
+    }
+}
+
+// Most processes are recorded when set in the intermediate representation,
+// These are the few that are not.
+void RecordProcesses(TIntermediate& intermediate, EShMessages messages, const std::string& sourceEntryPointName)
+{
+    if ((messages & EShMsgRelaxedErrors) != 0)
+        intermediate.addProcess("relaxed-errors");
+    if ((messages & EShMsgSuppressWarnings) != 0)
+        intermediate.addProcess("suppress-warnings");
+    if ((messages & EShMsgKeepUncalled) != 0)
+        intermediate.addProcess("keep-uncalled");
+    if (sourceEntryPointName.size() > 0) {
+        intermediate.addProcess("source-entrypoint");
+        intermediate.addProcessArgument(sourceEntryPointName);
+    }
+}
+
 // This is the common setup and cleanup code for PreprocessDeferred and
 // CompileDeferred.
 // It takes any callable with a signature of
@@ -623,7 +769,7 @@
     const char* customPreamble,
     const EShOptimizationLevel optLevel,
     const TBuiltInResource* resources,
-    int defaultVersion,         // use 100 for ES environment, 110 for desktop; this is the GLSL version, not SPIR-V or Vulkan
+    int defaultVersion,  // use 100 for ES environment, 110 for desktop; this is the GLSL version, not SPIR-V or Vulkan
     EProfile defaultProfile,
     // set version/profile to defaultVersion/defaultProfile regardless of the #version
     // directive in the source code
@@ -634,12 +780,9 @@
     ProcessingContext& processingContext,
     bool requireNonempty,
     TShader::Includer& includer,
-    const std::string sourceEntryPointName = ""
-    )
+    const std::string sourceEntryPointName = "",
+    const TEnvironment* environment = nullptr)  // optional way of fully setting all versions, overriding the above
 {
-    if (! InitThread())
-        return false;
-
     // This must be undone (.pop()) by the caller, after it finishes consuming the created tree.
     GetThreadPoolAllocator().push();
 
@@ -658,12 +801,12 @@
     const int numPre = 2;
     const int numPost = requireNonempty? 1 : 0;
     const int numTotal = numPre + numStrings + numPost;
-    size_t* lengths = new size_t[numTotal];
-    const char** strings = new const char*[numTotal];
-    const char** names = new const char*[numTotal];
+    std::unique_ptr<size_t[]> lengths(new size_t[numTotal]);
+    std::unique_ptr<const char*[]> strings(new const char*[numTotal]);
+    std::unique_ptr<const char*[]> names(new const char*[numTotal]);
     for (int s = 0; s < numStrings; ++s) {
         strings[s + numPre] = shaderStrings[s];
-        if (inputLengths == 0 || inputLengths[s] < 0)
+        if (inputLengths == nullptr || inputLengths[s] < 0)
             lengths[s + numPre] = strlen(shaderStrings[s]);
         else
             lengths[s + numPre] = inputLengths[s];
@@ -676,16 +819,27 @@
             names[s + numPre] = nullptr;
     }
 
+    // Get all the stages, languages, clients, and other environment
+    // stuff sorted out.
+    EShSource source = (messages & EShMsgReadHlsl) != 0 ? EShSourceHlsl : EShSourceGlsl;
+    SpvVersion spvVersion;
+    EShLanguage stage = compiler->getLanguage();
+    TranslateEnvironment(environment, messages, source, stage, spvVersion);
+    if (environment != nullptr && environment->target.hlslFunctionality1)
+        intermediate.setHlslFunctionality1();
+
     // First, without using the preprocessor or parser, find the #version, so we know what
     // symbol tables, processing rules, etc. to set up.  This does not need the extra strings
-    // outlined above, just the user shader.
-    glslang::TInputScanner userInput(numStrings, &strings[numPre], &lengths[numPre]);  // no preamble
+    // outlined above, just the user shader, after the system and user preambles.
+    glslang::TInputScanner userInput(numStrings, &strings[numPre], &lengths[numPre]);
     int version = 0;
     EProfile profile = ENoProfile;
     bool versionNotFirstToken = false;
-    bool versionNotFirst = (messages & EShMsgReadHlsl) ? true : userInput.scanVersion(version, profile, versionNotFirstToken);
+    bool versionNotFirst = (source == EShSourceHlsl)
+                                ? true
+                                : userInput.scanVersion(version, profile, versionNotFirstToken);
     bool versionNotFound = version == 0;
-    if (forceDefaultVersionAndProfile && (messages & EShMsgReadHlsl) == 0) {
+    if (forceDefaultVersionAndProfile && source == EShSourceGlsl) {
         if (! (messages & EShMsgSuppressWarnings) && ! versionNotFound &&
             (version != defaultVersion || profile != defaultProfile)) {
             compiler->infoSink.info << "Warning, (version, profile) forced to be ("
@@ -702,15 +856,9 @@
         version = defaultVersion;
         profile = defaultProfile;
     }
-    SpvVersion spvVersion;
-    if (messages & EShMsgSpvRules)
-        spvVersion.spv = 0x00010000;    // TODO: eventually have this come from the outside
-    EShSource source = (messages & EShMsgReadHlsl) ? EShSourceHlsl : EShSourceGlsl;
-    if (messages & EShMsgVulkanRules)
-        spvVersion.vulkan = 100;     // TODO: eventually have this come from the outside
-    else if (spvVersion.spv != 0)
-        spvVersion.openGl = 100;     // TODO: eventually have this come from the outside
-    bool goodVersion = DeduceVersionProfile(compiler->infoSink, compiler->getLanguage(), versionNotFirst, defaultVersion, source, version, profile, spvVersion);
+
+    bool goodVersion = DeduceVersionProfile(compiler->infoSink, stage,
+                                            versionNotFirst, defaultVersion, source, version, profile, spvVersion);
     bool versionWillBeError = (versionNotFound || (profile == EEsProfile && version >= 300 && versionNotFirst));
     bool warnVersionNotFirst = false;
     if (! versionWillBeError && versionNotFirstToken) {
@@ -724,43 +872,48 @@
     intermediate.setVersion(version);
     intermediate.setProfile(profile);
     intermediate.setSpv(spvVersion);
-    if (spvVersion.vulkan >= 100)
+    RecordProcesses(intermediate, messages, sourceEntryPointName);
+    if (spvVersion.vulkan > 0)
         intermediate.setOriginUpperLeft();
-    if ((messages & EShMsgHlslOffsets) || (messages & EShMsgReadHlsl))
+    if ((messages & EShMsgHlslOffsets) || source == EShSourceHlsl)
         intermediate.setHlslOffsets();
+    if (messages & EShMsgDebugInfo) {
+        intermediate.setSourceFile(names[numPre]);
+        for (int s = 0; s < numStrings; ++s)
+            intermediate.addSourceText(strings[numPre + s]);
+    }
     SetupBuiltinSymbolTable(version, profile, spvVersion, source);
 
     TSymbolTable* cachedTable = SharedSymbolTables[MapVersionToIndex(version)]
                                                   [MapSpvVersionToIndex(spvVersion)]
                                                   [MapProfileToIndex(profile)]
                                                   [MapSourceToIndex(source)]
-                                                  [compiler->getLanguage()];
+                                                  [stage];
 
     // Dynamically allocate the symbol table so we can control when it is deallocated WRT the pool.
-    TSymbolTable* symbolTableMemory = new TSymbolTable;
-    TSymbolTable& symbolTable = *symbolTableMemory;
+    std::unique_ptr<TSymbolTable> symbolTable(new TSymbolTable);
     if (cachedTable)
-        symbolTable.adoptLevels(*cachedTable);
+        symbolTable->adoptLevels(*cachedTable);
 
     // Add built-in symbols that are potentially context dependent;
     // they get popped again further down.
-    if (! AddContextSpecificSymbols(resources, compiler->infoSink, symbolTable, version, profile, spvVersion,
-                                    compiler->getLanguage(), source))
+    if (! AddContextSpecificSymbols(resources, compiler->infoSink, *symbolTable, version, profile, spvVersion,
+                                    stage, source)) {
         return false;
+    }
 
     //
     // Now we can process the full shader under proper symbols and rules.
     //
 
-    TParseContextBase* parseContext = CreateParseContext(symbolTable, intermediate, version, profile, source,
-                                                         compiler->getLanguage(), compiler->infoSink,
-                                                         spvVersion, forwardCompatible, messages, false, sourceEntryPointName);
-
-    TPpContext ppContext(*parseContext, names[numPre]? names[numPre]: "", includer);
+    std::unique_ptr<TParseContextBase> parseContext(CreateParseContext(*symbolTable, intermediate, version, profile, source,
+                                                    stage, compiler->infoSink,
+                                                    spvVersion, forwardCompatible, messages, false, sourceEntryPointName));
+    TPpContext ppContext(*parseContext, names[numPre] ? names[numPre] : "", includer);
 
     // only GLSL (bison triggered, really) needs an externally set scan context
     glslang::TScanContext scanContext(*parseContext);
-    if ((messages & EShMsgReadHlsl) == 0)
+    if (source == EShSourceGlsl)
         parseContext->setScanContext(&scanContext);
 
     parseContext->setPpContext(&ppContext);
@@ -791,23 +944,14 @@
         lengths[postIndex] = strlen(strings[numStrings + numPre]);
         names[postIndex] = nullptr;
     }
-    TInputScanner fullInput(numStrings + numPre + numPost, strings, lengths, names, numPre, numPost);
+    TInputScanner fullInput(numStrings + numPre + numPost, strings.get(), lengths.get(), names.get(), numPre, numPost);
 
     // Push a new symbol allocation scope that will get used for the shader's globals.
-    symbolTable.push();
+    symbolTable->push();
 
     bool success = processingContext(*parseContext, ppContext, fullInput,
-                                     versionWillBeError, symbolTable,
+                                     versionWillBeError, *symbolTable,
                                      intermediate, optLevel, messages);
-
-    // Clean up the symbol table. The AST is self-sufficient now.
-    delete symbolTableMemory;
-
-    delete parseContext;
-    delete [] lengths;
-    delete [] strings;
-    delete [] names;
-
     return success;
 }
 
@@ -817,7 +961,7 @@
 class SourceLineSynchronizer {
 public:
     SourceLineSynchronizer(const std::function<int()>& lastSourceIndex,
-                           std::stringstream* output)
+                           std::string* output)
       : getLastSourceIndex(lastSourceIndex), output(output), lastSource(-1), lastLine(0) {}
 //    SourceLineSynchronizer(const SourceLineSynchronizer&) = delete;
 //    SourceLineSynchronizer& operator=(const SourceLineSynchronizer&) = delete;
@@ -832,7 +976,7 @@
             // used. We also need to output a newline to separate the output
             // from the previous source string (if there is one).
             if (lastSource != -1 || lastLine != 0)
-                *output << std::endl;
+                *output += '\n';
             lastSource = getLastSourceIndex();
             lastLine = -1;
             return true;
@@ -847,7 +991,7 @@
         syncToMostRecentString();
         const bool newLineStarted = lastLine < tokenLine;
         for (; lastLine < tokenLine; ++lastLine) {
-            if (lastLine > 0) *output << std::endl;
+            if (lastLine > 0) *output += '\n';
         }
         return newLineStarted;
     }
@@ -861,8 +1005,8 @@
     // A function for getting the index of the last valid source string we've
     // read tokens from.
     const std::function<int()> getLastSourceIndex;
-    // output stream for newlines.
-    std::stringstream* output;
+    // output string for newlines.
+    std::string* output;
     // lastSource is the source string index (starting from 0) of the last token
     // processed. It is tracked in order for newlines to be inserted when a new
     // source string starts. -1 means we haven't started processing any source
@@ -878,6 +1022,8 @@
 // DoPreprocessing is a valid ProcessingContext template argument,
 // which only performs the preprocessing step of compilation.
 // It places the result in the "string" argument to its constructor.
+//
+// This is not an officially supported or fully working path.
 struct DoPreprocessing {
     explicit DoPreprocessing(std::string* string): outputString(string) {}
     bool operator()(TParseContextBase& parseContext, TPpContext& ppContext,
@@ -893,27 +1039,33 @@
         parseContext.setScanner(&input);
         ppContext.setInput(input, versionWillBeError);
 
-        std::stringstream outputStream;
+        std::string outputBuffer;
         SourceLineSynchronizer lineSync(
-            std::bind(&TInputScanner::getLastValidSourceIndex, &input), &outputStream);
+            std::bind(&TInputScanner::getLastValidSourceIndex, &input), &outputBuffer);
 
-        parseContext.setExtensionCallback([&lineSync, &outputStream](
+        parseContext.setExtensionCallback([&lineSync, &outputBuffer](
             int line, const char* extension, const char* behavior) {
                 lineSync.syncToLine(line);
-                outputStream << "#extension " << extension << " : " << behavior;
+                outputBuffer += "#extension ";
+                outputBuffer += extension;
+                outputBuffer += " : ";
+                outputBuffer += behavior;
         });
 
-        parseContext.setLineCallback([&lineSync, &outputStream, &parseContext](
+        parseContext.setLineCallback([&lineSync, &outputBuffer, &parseContext](
             int curLineNum, int newLineNum, bool hasSource, int sourceNum, const char* sourceName) {
             // SourceNum is the number of the source-string that is being parsed.
             lineSync.syncToLine(curLineNum);
-            outputStream << "#line " << newLineNum;
+            outputBuffer += "#line ";
+            outputBuffer += std::to_string(newLineNum);
             if (hasSource) {
-                outputStream << " ";
+                outputBuffer += ' ';
                 if (sourceName != nullptr) {
-                    outputStream << "\"" << sourceName << "\"";
+                    outputBuffer += '\"';
+                    outputBuffer += sourceName;
+                    outputBuffer += '\"';
                 } else {
-                    outputStream << sourceNum;
+                    outputBuffer += std::to_string(sourceNum);
                 }
             }
             if (parseContext.lineDirectiveShouldSetNextLine()) {
@@ -921,33 +1073,36 @@
                 // directive. So the new line number for the current line is
                 newLineNum -= 1;
             }
-            outputStream << std::endl;
+            outputBuffer += '\n';
             // And we are at the next line of the #line directive now.
             lineSync.setLineNum(newLineNum + 1);
         });
 
         parseContext.setVersionCallback(
-            [&lineSync, &outputStream](int line, int version, const char* str) {
+            [&lineSync, &outputBuffer](int line, int version, const char* str) {
                 lineSync.syncToLine(line);
-                outputStream << "#version " << version;
+                outputBuffer += "#version ";
+                outputBuffer += std::to_string(version);
                 if (str) {
-                    outputStream << " " << str;
+                    outputBuffer += ' ';
+                    outputBuffer += str;
                 }
             });
 
-        parseContext.setPragmaCallback([&lineSync, &outputStream](
+        parseContext.setPragmaCallback([&lineSync, &outputBuffer](
             int line, const glslang::TVector<glslang::TString>& ops) {
                 lineSync.syncToLine(line);
-                outputStream << "#pragma ";
+                outputBuffer += "#pragma ";
                 for(size_t i = 0; i < ops.size(); ++i) {
-                    outputStream << ops[i];
+                    outputBuffer += ops[i].c_str();
                 }
         });
 
-        parseContext.setErrorCallback([&lineSync, &outputStream](
+        parseContext.setErrorCallback([&lineSync, &outputBuffer](
             int line, const char* errorMessage) {
                 lineSync.syncToLine(line);
-                outputStream << "#error " << errorMessage;
+                outputBuffer += "#error ";
+                outputBuffer += errorMessage;
         });
 
         int lastToken = EndOfInput; // lastToken records the last token processed.
@@ -963,7 +1118,7 @@
                 // Don't emit whitespace onto empty lines.
                 // Copy any whitespace characters at the start of a line
                 // from the input to the output.
-                outputStream << std::string(ppToken.loc.column - 1, ' ');
+                outputBuffer += std::string(ppToken.loc.column - 1, ' ');
             }
 
             // Output a space in between tokens, but not at the start of a line,
@@ -973,13 +1128,17 @@
                 (unNeededSpaceTokens.find((char)token) == std::string::npos) &&
                 (unNeededSpaceTokens.find((char)lastToken) == std::string::npos) &&
                 (noSpaceBeforeTokens.find((char)token) == std::string::npos)) {
-                outputStream << " ";
+                outputBuffer += ' ';
             }
             lastToken = token;
-            outputStream << ppToken.name;
+            if (token == PpAtomConstString)
+                outputBuffer += "\"";
+            outputBuffer += ppToken.name;
+            if (token == PpAtomConstString)
+                outputBuffer += "\"";
         } while (true);
-        outputStream << std::endl;
-        *outputString = outputStream.str();
+        outputBuffer += '\n';
+        *outputString = std::move(outputBuffer);
 
         bool success = true;
         if (parseContext.getNumErrors() > 0) {
@@ -1026,6 +1185,9 @@
 // Return: True if there were no issues found in preprocessing,
 //         False if during preprocessing any unknown version, pragmas or
 //         extensions were found.
+//
+// NOTE: Doing just preprocessing to obtain a correct preprocessed shader string
+// is not an officially supported or fully working path.
 bool PreprocessDeferred(
     TCompiler* compiler,
     const char* const shaderStrings[],
@@ -1079,14 +1241,15 @@
     EShMessages messages,       // warnings/errors/AST; things to print out
     TIntermediate& intermediate,// returned tree, etc.
     TShader::Includer& includer,
-    const std::string sourceEntryPointName = "")
+    const std::string sourceEntryPointName = "",
+    TEnvironment* environment = nullptr)
 {
     DoFullParse parser;
     return ProcessDeferred(compiler, shaderStrings, numStrings, inputLengths, stringNames,
                            preamble, optLevel, resources, defaultVersion,
                            defaultProfile, forceDefaultVersionAndProfile,
                            forwardCompatible, messages, intermediate, parser,
-                           true, includer, sourceEntryPointName);
+                           true, includer, sourceEntryPointName, environment);
 }
 
 } // end anonymous namespace for local functions
@@ -1101,7 +1264,11 @@
     if (! InitProcess())
         return 0;
 
-    if (! PerProcessGPA)
+    glslang::GetGlobalLock();
+    ++NumberOfClients;
+    glslang::ReleaseGlobalLock();
+
+    if (PerProcessGPA == nullptr)
         PerProcessGPA = new TPoolAllocator();
 
     glslang::TScanContext::fillInKeywordMap();
@@ -1167,6 +1334,14 @@
 //
 int __fastcall ShFinalize()
 {
+    glslang::GetGlobalLock();
+    --NumberOfClients;
+    assert(NumberOfClients >= 0);
+    bool finalize = NumberOfClients == 0;
+    glslang::ReleaseGlobalLock();
+    if (! finalize)
+        return 1;
+
     for (int version = 0; version < VersionCount; ++version) {
         for (int spvVersion = 0; spvVersion < SpvVersionCount; ++spvVersion) {
             for (int p = 0; p < ProfileCount; ++p) {
@@ -1193,10 +1368,9 @@
         }
     }
 
-    if (PerProcessGPA) {
-        PerProcessGPA->popAll();
+    if (PerProcessGPA != nullptr) {
         delete PerProcessGPA;
-        PerProcessGPA = 0;
+        PerProcessGPA = nullptr;
     }
 
     glslang::TScanContext::deleteKeywordMap();
@@ -1237,6 +1411,8 @@
     if (compiler == 0)
         return 0;
 
+    SetThreadPoolAllocator(compiler->getPool());
+
     compiler->infoSink.info.erase();
     compiler->infoSink.debug.erase();
 
@@ -1294,6 +1470,8 @@
     TShHandleBase* base = reinterpret_cast<TShHandleBase*>(linkHandle);
     TLinker* linker = static_cast<TLinker*>(base->getAsLinker());
 
+    SetThreadPoolAllocator(linker->getPool());
+
     if (linker == 0)
         return 0;
 
@@ -1328,9 +1506,6 @@
 //
 const char* ShGetInfoLog(const ShHandle handle)
 {
-    if (!InitThread())
-        return 0;
-
     if (handle == 0)
         return 0;
 
@@ -1354,9 +1529,6 @@
 //
 const void* ShGetExecutable(const ShHandle handle)
 {
-    if (!InitThread())
-        return 0;
-
     if (handle == 0)
         return 0;
 
@@ -1379,9 +1551,6 @@
 //
 int ShSetVirtualAttributeBindings(const ShHandle handle, const ShBindingTable* table)
 {
-    if (!InitThread())
-        return 0;
-
     if (handle == 0)
         return 0;
 
@@ -1401,9 +1570,6 @@
 //
 int ShSetFixedAttributeBindings(const ShHandle handle, const ShBindingTable* table)
 {
-    if (!InitThread())
-        return 0;
-
     if (handle == 0)
         return 0;
 
@@ -1422,9 +1588,6 @@
 //
 int ShExcludeAttributes(const ShHandle handle, int *attributes, int count)
 {
-    if (!InitThread())
-        return 0;
-
     if (handle == 0)
         return 0;
 
@@ -1446,9 +1609,6 @@
 //
 int ShGetUniformLocation(const ShHandle handle, const char* name)
 {
-    if (!InitThread())
-        return 0;
-
     if (handle == 0)
         return -1;
 
@@ -1475,14 +1635,17 @@
 
 #include "../Include/revision.h"
 
+#define QUOTE(s) #s
+#define STR(n) QUOTE(n)
+
 const char* GetEsslVersionString()
 {
-    return "OpenGL ES GLSL 3.00 glslang LunarG Khronos." GLSLANG_REVISION " " GLSLANG_DATE;
+    return "OpenGL ES GLSL 3.20 glslang Khronos. " STR(GLSLANG_MINOR_VERSION) "." STR(GLSLANG_PATCH_LEVEL);
 }
 
 const char* GetGlslVersionString()
 {
-    return "4.20 glslang LunarG Khronos." GLSLANG_REVISION " " GLSLANG_DATE;
+    return "4.60 glslang Khronos. " STR(GLSLANG_MINOR_VERSION) "." STR(GLSLANG_PATCH_LEVEL);
 }
 
 int GetKhronosToolId()
@@ -1507,11 +1670,19 @@
 };
 
 TShader::TShader(EShLanguage s)
-    : pool(0), stage(s), lengths(nullptr), stringNames(nullptr), preamble("")
+    : stage(s), lengths(nullptr), stringNames(nullptr), preamble("")
 {
+    pool = new TPoolAllocator;
     infoSink = new TInfoSink;
     compiler = new TDeferredCompiler(stage, *infoSink);
     intermediate = new TIntermediate(s);
+
+    // clear environment (avoid constructors in them for use in a C interface)
+    environment.input.languageFamily = EShSourceNone;
+    environment.input.dialect = EShClientNone;
+    environment.client.client = EShClientNone;
+    environment.target.language = EShTargetNone;
+    environment.target.hlslFunctionality1 = false;
 }
 
 TShader::~TShader()
@@ -1555,26 +1726,55 @@
     sourceEntryPointName = name;
 }
 
+void TShader::addProcesses(const std::vector<std::string>& p)
+{
+    intermediate->addProcesses(p);
+}
+
+// Set binding base for given resource type
+void TShader::setShiftBinding(TResourceType res, unsigned int base) {
+    intermediate->setShiftBinding(res, base);
+}
+
+// Set binding base for given resource type for a given binding set.
+void TShader::setShiftBindingForSet(TResourceType res, unsigned int base, unsigned int set) {
+    intermediate->setShiftBindingForSet(res, base, set);
+}
+
 // Set binding base for sampler types
-void TShader::setShiftSamplerBinding(unsigned int base) { intermediate->setShiftSamplerBinding(base); }
+void TShader::setShiftSamplerBinding(unsigned int base) { setShiftBinding(EResSampler, base); }
 // Set binding base for texture types (SRV)
-void TShader::setShiftTextureBinding(unsigned int base) { intermediate->setShiftTextureBinding(base); }
+void TShader::setShiftTextureBinding(unsigned int base) { setShiftBinding(EResTexture, base); }
 // Set binding base for image types
-void TShader::setShiftImageBinding(unsigned int base)   { intermediate->setShiftImageBinding(base); }
+void TShader::setShiftImageBinding(unsigned int base)   { setShiftBinding(EResImage, base); }
 // Set binding base for uniform buffer objects (CBV)
-void TShader::setShiftUboBinding(unsigned int base)     { intermediate->setShiftUboBinding(base); }
+void TShader::setShiftUboBinding(unsigned int base)     { setShiftBinding(EResUbo, base); }
 // Synonym for setShiftUboBinding, to match HLSL language.
-void TShader::setShiftCbufferBinding(unsigned int base) { intermediate->setShiftUboBinding(base); }
+void TShader::setShiftCbufferBinding(unsigned int base) { setShiftBinding(EResUbo, base); }
 // Set binding base for UAV (unordered access view)
-void TShader::setShiftUavBinding(unsigned int base)     { intermediate->setShiftUavBinding(base); }
+void TShader::setShiftUavBinding(unsigned int base)     { setShiftBinding(EResUav, base); }
 // Set binding base for SSBOs
-void TShader::setShiftSsboBinding(unsigned int base)    { intermediate->setShiftSsboBinding(base); }
+void TShader::setShiftSsboBinding(unsigned int base)    { setShiftBinding(EResSsbo, base); }
 // Enables binding automapping using TIoMapper
 void TShader::setAutoMapBindings(bool map)              { intermediate->setAutoMapBindings(map); }
+// Enables position.Y output negation in vertex shader
+void TShader::setInvertY(bool invert)                   { intermediate->setInvertY(invert); }
+// Fragile: currently within one stage: simple auto-assignment of location
+void TShader::setAutoMapLocations(bool map)             { intermediate->setAutoMapLocations(map); }
+void TShader::addUniformLocationOverride(const char* name, int loc)
+{
+    intermediate->addUniformLocationOverride(name, loc);
+}
+void TShader::setUniformLocationBase(int base)
+{
+    intermediate->setUniformLocationBase(base);
+}
 // See comment above TDefaultHlslIoMapper in iomapper.cpp:
 void TShader::setHlslIoMapping(bool hlslIoMap)          { intermediate->setHlslIoMapping(hlslIoMap); }
 void TShader::setFlattenUniformArrays(bool flatten)     { intermediate->setFlattenUniformArrays(flatten); }
 void TShader::setNoStorageFormat(bool useUnknownFormat) { intermediate->setNoStorageFormat(useUnknownFormat); }
+void TShader::setResourceSetBinding(const std::vector<std::string>& base)   { intermediate->setResourceSetBinding(base); }
+void TShader::setTextureSamplerTransformMode(EShTextureSamplerTransformMode mode) { intermediate->setTextureSamplerTransformMode(mode); }
 
 //
 // Turn the shader strings into a parse tree in the TIntermediate.
@@ -1586,25 +1786,23 @@
 {
     if (! InitThread())
         return false;
+    SetThreadPoolAllocator(pool);
 
-    pool = new TPoolAllocator();
-    SetThreadPoolAllocator(*pool);
     if (! preamble)
         preamble = "";
 
     return CompileDeferred(compiler, strings, numStrings, lengths, stringNames,
                            preamble, EShOptNone, builtInResources, defaultVersion,
                            defaultProfile, forceDefaultVersionAndProfile,
-                           forwardCompatible, messages, *intermediate, includer, sourceEntryPointName);
-}
-
-bool TShader::parse(const TBuiltInResource* builtInResources, int defaultVersion, bool forwardCompatible, EShMessages messages)
-{
-    return parse(builtInResources, defaultVersion, ENoProfile, false, forwardCompatible, messages);
+                           forwardCompatible, messages, *intermediate, includer, sourceEntryPointName,
+                           &environment);
 }
 
 // Fill in a string with the result of preprocessing ShaderStrings
 // Returns true if all extensions, pragmas and version strings were valid.
+//
+// NOTE: Doing just preprocessing to obtain a correct preprocessed shader string
+// is not an officially supported or fully working path.
 bool TShader::preprocess(const TBuiltInResource* builtInResources,
                          int defaultVersion, EProfile defaultProfile,
                          bool forceDefaultVersionAndProfile,
@@ -1614,9 +1812,8 @@
 {
     if (! InitThread())
         return false;
+    SetThreadPoolAllocator(pool);
 
-    pool = new TPoolAllocator();
-    SetThreadPoolAllocator(*pool);
     if (! preamble)
         preamble = "";
 
@@ -1636,8 +1833,9 @@
     return infoSink->debug.c_str();
 }
 
-TProgram::TProgram() : pool(0), reflection(0), ioMapper(nullptr), linked(false)
+TProgram::TProgram() : reflection(0), ioMapper(nullptr), linked(false)
 {
+    pool = new TPoolAllocator;
     infoSink = new TInfoSink;
     for (int s = 0; s < EShLangCount; ++s) {
         intermediate[s] = 0;
@@ -1672,8 +1870,7 @@
 
     bool error = false;
 
-    pool = new TPoolAllocator();
-    SetThreadPoolAllocator(*pool);
+    SetThreadPoolAllocator(pool);
 
     for (int s = 0; s < EShLangCount; ++s) {
         if (! linkStage((EShLanguage)s, messages))
@@ -1789,6 +1986,9 @@
 const char* TProgram::getUniformBlockName(int index) const   { return reflection->getUniformBlock(index).name.c_str(); }
 int TProgram::getUniformBlockSize(int index) const           { return reflection->getUniformBlock(index).size; }
 int TProgram::getUniformIndex(const char* name) const        { return reflection->getIndex(name); }
+int TProgram::getUniformBinding(int index) const             { return reflection->getUniform(index).getBinding(); }
+EShLanguageMask TProgram::getUniformStages(int index) const  { return reflection->getUniform(index).stages; }
+int TProgram::getUniformBlockBinding(int index) const        { return reflection->getUniformBlock(index).getBinding(); }
 int TProgram::getUniformBlockIndex(int index) const          { return reflection->getUniform(index).index; }
 int TProgram::getUniformBlockCounterIndex(int index) const   { return reflection->getUniformBlock(index).counterIndex; }
 int TProgram::getUniformType(int index) const                { return reflection->getUniform(index).glDefineType; }
diff --git a/glslang/MachineIndependent/SymbolTable.cpp b/glslang/MachineIndependent/SymbolTable.cpp
index 790b76b..bd7d5aa 100644
--- a/glslang/MachineIndependent/SymbolTable.cpp
+++ b/glslang/MachineIndependent/SymbolTable.cpp
@@ -1,6 +1,7 @@
 //
 // Copyright (C) 2002-2005  3Dlabs Inc. Ltd.
 // Copyright (C) 2012-2013 LunarG, Inc.
+// Copyright (C) 2017 ARM Limited.
 //
 // All rights reserved.
 //
@@ -60,17 +61,25 @@
     switch (basicType) {
     case EbtFloat:              mangledName += 'f';      break;
     case EbtDouble:             mangledName += 'd';      break;
-#ifdef AMD_EXTENSIONS
     case EbtFloat16:            mangledName += "f16";    break;
-#endif
     case EbtInt:                mangledName += 'i';      break;
     case EbtUint:               mangledName += 'u';      break;
+    case EbtInt8:               mangledName += "i8";     break;
+    case EbtUint8:              mangledName += "u8";     break;
+    case EbtInt16:              mangledName += "i16";    break;
+    case EbtUint16:             mangledName += "u16";    break;
     case EbtInt64:              mangledName += "i64";    break;
     case EbtUint64:             mangledName += "u64";    break;
     case EbtBool:               mangledName += 'b';      break;
     case EbtAtomicUint:         mangledName += "au";     break;
+#ifdef NV_EXTENSIONS
+    case EbtAccStructNV:        mangledName += "asnv";   break;
+#endif
     case EbtSampler:
         switch (sampler.type) {
+#ifdef AMD_EXTENSIONS
+        case EbtFloat16: mangledName += "f16"; break;
+#endif
         case EbtInt:   mangledName += "i"; break;
         case EbtUint:  mangledName += "u"; break;
         default: break; // some compilers want this
@@ -99,6 +108,23 @@
         case EsdSubpass:  mangledName += "P";  break;
         default: break; // some compilers want this
         }
+
+        if (sampler.hasReturnStruct()) {
+            // Name mangle for sampler return struct uses struct table index.
+            mangledName += "-tx-struct";
+
+            char text[16]; // plenty enough space for the small integers.
+            snprintf(text, sizeof(text), "%d-", sampler.structReturnIndex);
+            mangledName += text;
+        } else {
+            switch (sampler.getVectorSize()) {
+            case 1: mangledName += "1"; break;
+            case 2: mangledName += "2"; break;
+            case 3: mangledName += "3"; break;
+            case 4: break; // default to prior name mangle behavior
+            }
+        }
+
         if (sampler.ms)
             mangledName += "M";
         break;
diff --git a/glslang/MachineIndependent/SymbolTable.h b/glslang/MachineIndependent/SymbolTable.h
index 8dc154c..f928b7a 100644
--- a/glslang/MachineIndependent/SymbolTable.h
+++ b/glslang/MachineIndependent/SymbolTable.h
@@ -198,7 +198,6 @@
     TString *name;
     TType* type;
     TIntermTyped* defaultValue;
-    TBuiltInVariable declaredBuiltIn;
     void copyParam(const TParameter& param)
     {
         if (param.name)
@@ -207,8 +206,8 @@
             name = 0;
         type = param.type->clone();
         defaultValue = param.defaultValue;
-        declaredBuiltIn = param.declaredBuiltIn;
     }
+    TBuiltInVariable getDeclaredBuiltIn() const { return type->getQualifier().declaredBuiltIn; }
 };
 
 //
@@ -241,7 +240,6 @@
     virtual void addParameter(TParameter& p)
     {
         assert(writable);
-        p.declaredBuiltIn = p.type->getQualifier().builtIn;
         parameters.push_back(p);
         p.type->appendMangledName(mangledName);
 
@@ -264,6 +262,12 @@
         mangledName.insert(0, prefix);
     }
 
+    virtual void removePrefix(const TString& prefix)
+    {
+        assert(mangledName.compare(0, prefix.size(), prefix) == 0);
+        mangledName.erase(0, prefix.size());
+    }
+
     virtual const TString& getMangledName() const override { return mangledName; }
     virtual const TType& getType() const override { return returnType; }
     virtual TBuiltInVariable getDeclaredBuiltInType() const { return declaredBuiltIn; }
@@ -688,19 +692,27 @@
 
     // Normal find of a symbol, that can optionally say whether the symbol was found
     // at a built-in level or the current top-scope level.
-    TSymbol* find(const TString& name, bool* builtIn = 0, bool *currentScope = 0)
+    TSymbol* find(const TString& name, bool* builtIn = 0, bool* currentScope = 0, int* thisDepthP = 0)
     {
         int level = currentLevel();
         TSymbol* symbol;
+        int thisDepth = 0;
         do {
+            if (table[level]->isThisLevel())
+                ++thisDepth;
             symbol = table[level]->find(name);
             --level;
-        } while (symbol == 0 && level >= 0);
+        } while (symbol == nullptr && level >= 0);
         level++;
         if (builtIn)
             *builtIn = isBuiltInLevel(level);
         if (currentScope)
             *currentScope = isGlobalLevel(currentLevel()) || level == currentLevel();  // consider shared levels as "current scope" WRT user globals
+        if (thisDepthP != nullptr) {
+            if (! table[level]->isThisLevel())
+                thisDepth = 0;
+            *thisDepthP = thisDepth;
+        }
 
         return symbol;
     }
diff --git a/glslang/MachineIndependent/Versions.cpp b/glslang/MachineIndependent/Versions.cpp
index 528333f..f40b9f4 100644
--- a/glslang/MachineIndependent/Versions.cpp
+++ b/glslang/MachineIndependent/Versions.cpp
@@ -1,6 +1,7 @@
 //
 // Copyright (C) 2002-2005  3Dlabs Inc. Ltd.
 // Copyright (C) 2012-2013 LunarG, Inc.
+// Copyright (C) 2017 ARM Limited.
 //
 // All rights reserved.
 //
@@ -154,8 +155,9 @@
     extensionBehavior[E_GL_OES_standard_derivatives]         = EBhDisable;
     extensionBehavior[E_GL_EXT_frag_depth]                   = EBhDisable;
     extensionBehavior[E_GL_OES_EGL_image_external]           = EBhDisable;
+    extensionBehavior[E_GL_OES_EGL_image_external_essl3]     = EBhDisable;
     extensionBehavior[E_GL_EXT_shader_texture_lod]           = EBhDisable;
-
+    extensionBehavior[E_GL_EXT_shadow_samplers]              = EBhDisable;
     extensionBehavior[E_GL_ARB_texture_rectangle]            = EBhDisable;
     extensionBehavior[E_GL_3DL_array_objects]                = EBhDisable;
     extensionBehavior[E_GL_ARB_shading_language_420pack]     = EBhDisable;
@@ -179,10 +181,34 @@
     extensionBehavior[E_GL_ARB_shader_ballot]                = EBhDisable;
     extensionBehavior[E_GL_ARB_sparse_texture2]              = EBhDisable;
     extensionBehavior[E_GL_ARB_sparse_texture_clamp]         = EBhDisable;
+    extensionBehavior[E_GL_ARB_shader_stencil_export]        = EBhDisable;
 //    extensionBehavior[E_GL_ARB_cull_distance]                = EBhDisable;    // present for 4.5, but need extension control over block members
+    extensionBehavior[E_GL_ARB_post_depth_coverage]          = EBhDisable;
+    extensionBehavior[E_GL_ARB_shader_viewport_layer_array]  = EBhDisable;
+
+    extensionBehavior[E_GL_KHR_shader_subgroup_basic]            = EBhDisable;
+    extensionBehavior[E_GL_KHR_shader_subgroup_vote]             = EBhDisable;
+    extensionBehavior[E_GL_KHR_shader_subgroup_arithmetic]       = EBhDisable;
+    extensionBehavior[E_GL_KHR_shader_subgroup_ballot]           = EBhDisable;
+    extensionBehavior[E_GL_KHR_shader_subgroup_shuffle]          = EBhDisable;
+    extensionBehavior[E_GL_KHR_shader_subgroup_shuffle_relative] = EBhDisable;
+    extensionBehavior[E_GL_KHR_shader_subgroup_clustered]        = EBhDisable;
+    extensionBehavior[E_GL_KHR_shader_subgroup_quad]             = EBhDisable;
+    extensionBehavior[E_GL_KHR_memory_scope_semantics]           = EBhDisable;
+
+    extensionBehavior[E_GL_EXT_shader_atomic_int64]              = EBhDisable;
 
     extensionBehavior[E_GL_EXT_shader_non_constant_global_initializers] = EBhDisable;
-    extensionBehavior[E_GL_EXT_shader_image_load_formatted]  = EBhDisable;
+    extensionBehavior[E_GL_EXT_shader_image_load_formatted]             = EBhDisable;
+    extensionBehavior[E_GL_EXT_post_depth_coverage]                     = EBhDisable;
+    extensionBehavior[E_GL_EXT_control_flow_attributes]                 = EBhDisable;
+    extensionBehavior[E_GL_EXT_nonuniform_qualifier]                    = EBhDisable;
+    extensionBehavior[E_GL_EXT_samplerless_texture_functions]           = EBhDisable;
+    extensionBehavior[E_GL_EXT_scalar_block_layout]                     = EBhDisable;
+    extensionBehavior[E_GL_EXT_fragment_invocation_density]             = EBhDisable;
+
+    extensionBehavior[E_GL_EXT_shader_16bit_storage]                    = EBhDisable;
+    extensionBehavior[E_GL_EXT_shader_8bit_storage]                     = EBhDisable;
 
     // #line and #include
     extensionBehavior[E_GL_GOOGLE_cpp_style_line_directive]          = EBhDisable;
@@ -194,15 +220,29 @@
     extensionBehavior[E_GL_AMD_shader_explicit_vertex_parameter]     = EBhDisable;
     extensionBehavior[E_GL_AMD_gcn_shader]                           = EBhDisable;
     extensionBehavior[E_GL_AMD_gpu_shader_half_float]                = EBhDisable;
+    extensionBehavior[E_GL_AMD_texture_gather_bias_lod]              = EBhDisable;
+    extensionBehavior[E_GL_AMD_gpu_shader_int16]                     = EBhDisable;
+    extensionBehavior[E_GL_AMD_shader_image_load_store_lod]          = EBhDisable;
+    extensionBehavior[E_GL_AMD_shader_fragment_mask]                 = EBhDisable;
+    extensionBehavior[E_GL_AMD_gpu_shader_half_float_fetch]          = EBhDisable;
 #endif
 
 #ifdef NV_EXTENSIONS
     extensionBehavior[E_GL_NV_sample_mask_override_coverage]         = EBhDisable;
     extensionBehavior[E_SPV_NV_geometry_shader_passthrough]          = EBhDisable;
-    extensionBehavior[E_GL_ARB_shader_viewport_layer_array]          = EBhDisable;
     extensionBehavior[E_GL_NV_viewport_array2]                       = EBhDisable;
     extensionBehavior[E_GL_NV_stereo_view_rendering]                 = EBhDisable;
     extensionBehavior[E_GL_NVX_multiview_per_view_attributes]        = EBhDisable;
+    extensionBehavior[E_GL_NV_shader_atomic_int64]                   = EBhDisable;
+    extensionBehavior[E_GL_NV_conservative_raster_underestimation]   = EBhDisable;
+    extensionBehavior[E_GL_NV_shader_noperspective_interpolation]    = EBhDisable;
+    extensionBehavior[E_GL_NV_shader_subgroup_partitioned]           = EBhDisable;
+    extensionBehavior[E_GL_NV_shading_rate_image]                    = EBhDisable;
+    extensionBehavior[E_GL_NV_ray_tracing]                           = EBhDisable;
+    extensionBehavior[E_GL_NV_fragment_shader_barycentric]           = EBhDisable;
+    extensionBehavior[E_GL_NV_compute_shader_derivatives]            = EBhDisable;
+    extensionBehavior[E_GL_NV_shader_texture_footprint]              = EBhDisable;
+    extensionBehavior[E_GL_NV_mesh_shader]                           = EBhDisable;
 #endif
 
     // AEP
@@ -236,6 +276,20 @@
     // EXT extensions
     extensionBehavior[E_GL_EXT_device_group]             = EBhDisable;
     extensionBehavior[E_GL_EXT_multiview]                = EBhDisable;
+
+    // OVR extensions
+    extensionBehavior[E_GL_OVR_multiview]                = EBhDisable;
+    extensionBehavior[E_GL_OVR_multiview2]               = EBhDisable;
+
+    // explicit types
+    extensionBehavior[E_GL_EXT_shader_explicit_arithmetic_types]         = EBhDisable;
+    extensionBehavior[E_GL_EXT_shader_explicit_arithmetic_types_int8]    = EBhDisable;
+    extensionBehavior[E_GL_EXT_shader_explicit_arithmetic_types_int16]   = EBhDisable;
+    extensionBehavior[E_GL_EXT_shader_explicit_arithmetic_types_int32]   = EBhDisable;
+    extensionBehavior[E_GL_EXT_shader_explicit_arithmetic_types_int64]   = EBhDisable;
+    extensionBehavior[E_GL_EXT_shader_explicit_arithmetic_types_float16] = EBhDisable;
+    extensionBehavior[E_GL_EXT_shader_explicit_arithmetic_types_float32] = EBhDisable;
+    extensionBehavior[E_GL_EXT_shader_explicit_arithmetic_types_float64] = EBhDisable;
 }
 
 // Get code that is not part of a shared symbol table, is specific to this shader,
@@ -250,7 +304,9 @@
             "#define GL_OES_standard_derivatives 1\n"
             "#define GL_EXT_frag_depth 1\n"
             "#define GL_OES_EGL_image_external 1\n"
+            "#define GL_OES_EGL_image_external_essl3 1\n"
             "#define GL_EXT_shader_texture_lod 1\n"
+            "#define GL_EXT_shadow_samplers 1\n"
 
             // AEP
             "#define GL_ANDROID_extension_pack_es31a 1\n"
@@ -281,6 +337,13 @@
             "#define GL_OES_texture_cube_map_array 1\n"
             "#define GL_EXT_shader_non_constant_global_initializers 1\n"
             ;
+
+#ifdef NV_EXTENSIONS
+            if (profile == EEsProfile && version >= 300) {
+                preamble += "#define GL_NV_shader_noperspective_interpolation 1\n";
+            }
+#endif
+
     } else {
         preamble =
             "#define GL_FRAGMENT_PRECISION_HIGH 1\n"
@@ -306,9 +369,31 @@
             "#define GL_ARB_shader_ballot 1\n"
             "#define GL_ARB_sparse_texture2 1\n"
             "#define GL_ARB_sparse_texture_clamp 1\n"
+            "#define GL_ARB_shader_stencil_export 1\n"
 //            "#define GL_ARB_cull_distance 1\n"    // present for 4.5, but need extension control over block members
+            "#define GL_ARB_post_depth_coverage 1\n"
             "#define GL_EXT_shader_non_constant_global_initializers 1\n"
             "#define GL_EXT_shader_image_load_formatted 1\n"
+            "#define GL_EXT_post_depth_coverage 1\n"
+            "#define GL_EXT_control_flow_attributes 1\n"
+            "#define GL_EXT_nonuniform_qualifier 1\n"
+            "#define GL_EXT_shader_16bit_storage 1\n"
+            "#define GL_EXT_shader_8bit_storage 1\n"
+            "#define GL_EXT_samplerless_texture_functions 1\n"
+            "#define GL_EXT_scalar_block_layout 1\n"
+            "#define GL_EXT_fragment_invocation_density 1\n"
+
+            // GL_KHR_shader_subgroup
+            "#define GL_KHR_shader_subgroup_basic 1\n"
+            "#define GL_KHR_shader_subgroup_vote 1\n"
+            "#define GL_KHR_shader_subgroup_arithmetic 1\n"
+            "#define GL_KHR_shader_subgroup_ballot 1\n"
+            "#define GL_KHR_shader_subgroup_shuffle 1\n"
+            "#define GL_KHR_shader_subgroup_shuffle_relative 1\n"
+            "#define GL_KHR_shader_subgroup_clustered 1\n"
+            "#define GL_KHR_shader_subgroup_quad 1\n"
+
+            "#define E_GL_EXT_shader_atomic_int64 1\n"
 
 #ifdef AMD_EXTENSIONS
             "#define GL_AMD_shader_ballot 1\n"
@@ -316,13 +401,35 @@
             "#define GL_AMD_shader_explicit_vertex_parameter 1\n"
             "#define GL_AMD_gcn_shader 1\n"
             "#define GL_AMD_gpu_shader_half_float 1\n"
+            "#define GL_AMD_texture_gather_bias_lod 1\n"
+            "#define GL_AMD_gpu_shader_int16 1\n"
+            "#define GL_AMD_shader_image_load_store_lod 1\n"
+            "#define GL_AMD_shader_fragment_mask 1\n"
+            "#define GL_AMD_gpu_shader_half_float_fetch 1\n"
 #endif
 
 #ifdef NV_EXTENSIONS
             "#define GL_NV_sample_mask_override_coverage 1\n"
             "#define GL_NV_geometry_shader_passthrough 1\n"
             "#define GL_NV_viewport_array2 1\n"
+            "#define GL_NV_shader_atomic_int64 1\n"
+            "#define GL_NV_conservative_raster_underestimation 1\n"
+            "#define GL_NV_shader_subgroup_partitioned 1\n"
+            "#define GL_NV_shading_rate_image 1\n"
+            "#define GL_NV_ray_tracing 1\n"
+            "#define GL_NV_fragment_shader_barycentric 1\n"
+            "#define GL_NV_compute_shader_derivatives 1\n"
+            "#define GL_NV_shader_texture_footprint 1\n"
+            "#define GL_NV_mesh_shader 1\n"
 #endif
+            "#define GL_EXT_shader_explicit_arithmetic_types 1\n"
+            "#define GL_EXT_shader_explicit_arithmetic_types_int8 1\n"
+            "#define GL_EXT_shader_explicit_arithmetic_types_int16 1\n"
+            "#define GL_EXT_shader_explicit_arithmetic_types_int32 1\n"
+            "#define GL_EXT_shader_explicit_arithmetic_types_int64 1\n"
+            "#define GL_EXT_shader_explicit_arithmetic_types_float16 1\n"
+            "#define GL_EXT_shader_explicit_arithmetic_types_float32 1\n"
+            "#define GL_EXT_shader_explicit_arithmetic_types_float64 1\n"
             ;
 
         if (version >= 150) {
@@ -336,12 +443,19 @@
 
     if ((profile != EEsProfile && version >= 140) ||
         (profile == EEsProfile && version >= 310)) {
-        preamble += 
+        preamble +=
             "#define GL_EXT_device_group 1\n"
             "#define GL_EXT_multiview 1\n"
             ;
     }
 
+    if (version >= 300 /* both ES and non-ES */) {
+        preamble +=
+            "#define GL_OVR_multiview 1\n"
+            "#define GL_OVR_multiview2 1\n"
+            ;
+    }
+
     // #line and #include
     preamble +=
             "#define GL_GOOGLE_cpp_style_line_directive 1\n"
@@ -351,9 +465,9 @@
     // #define VULKAN XXXX
     const int numberBufSize = 12;
     char numberBuf[numberBufSize];
-    if (spvVersion.vulkan > 0) {
+    if (spvVersion.vulkanGlsl > 0) {
         preamble += "#define VULKAN ";
-        snprintf(numberBuf, numberBufSize, "%d", spvVersion.vulkan);
+        snprintf(numberBuf, numberBufSize, "%d", spvVersion.vulkanGlsl);
         preamble += numberBuf;
         preamble += "\n";
     }
@@ -394,6 +508,16 @@
     case EShLangGeometry:       return "geometry";
     case EShLangFragment:       return "fragment";
     case EShLangCompute:        return "compute";
+#ifdef NV_EXTENSIONS
+    case EShLangRayGenNV:       return "ray-generation";
+    case EShLangIntersectNV:    return "intersection";
+    case EShLangAnyHitNV:       return "any-hit";
+    case EShLangClosestHitNV:   return "closest-hit";
+    case EShLangMissNV:         return "miss";
+    case EShLangCallableNV:     return "callable";
+    case EShLangMeshNV:         return "mesh";
+    case EShLangTaskNV:         return "task";
+#endif
     default:                    return "unknown stage";
     }
 }
@@ -498,6 +622,11 @@
     }
 }
 
+void TParseVersions::unimplemented(const TSourceLoc& loc, const char* featureDesc)
+{
+    error(loc, "feature not yet implemented", featureDesc, "");
+}
+
 // Returns true if at least one of the extensions in the extensions parameter is requested. Otherwise, returns false.
 // Warns appropriately if the requested behavior of an extension is "warn".
 bool TParseVersions::checkExtensionsRequested(const TSourceLoc& loc, int numExtensions, const char* const extensions[], const char* featureDesc)
@@ -533,7 +662,8 @@
 //
 void TParseVersions::requireExtensions(const TSourceLoc& loc, int numExtensions, const char* const extensions[], const char* featureDesc)
 {
-    if (checkExtensionsRequested(loc, numExtensions, extensions, featureDesc)) return;
+    if (checkExtensionsRequested(loc, numExtensions, extensions, featureDesc))
+        return;
 
     // If we get this far, give errors explaining what extensions are needed
     if (numExtensions == 1)
@@ -551,7 +681,8 @@
 //
 void TParseVersions::ppRequireExtensions(const TSourceLoc& loc, int numExtensions, const char* const extensions[], const char* featureDesc)
 {
-    if (checkExtensionsRequested(loc, numExtensions, extensions, featureDesc)) return;
+    if (checkExtensionsRequested(loc, numExtensions, extensions, featureDesc))
+        return;
 
     // If we get this far, give errors explaining what extensions are needed
     if (numExtensions == 1)
@@ -589,7 +720,8 @@
 bool TParseVersions::extensionsTurnedOn(int numExtensions, const char* const extensions[])
 {
     for (int i = 0; i < numExtensions; ++i) {
-        if (extensionTurnedOn(extensions[i])) return true;
+        if (extensionTurnedOn(extensions[i]))
+            return true;
     }
     return false;
 }
@@ -614,6 +746,9 @@
         return;
     }
 
+    // check if extension is used with correct shader stage
+    checkExtensionStage(getCurrentLoc(), extension);
+
     // update the requested extension
     updateExtensionBehavior(extension, behavior);
 
@@ -645,6 +780,25 @@
         updateExtensionBehavior(line, "GL_OES_shader_io_blocks", behaviorString);
     else if (strcmp(extension, "GL_GOOGLE_include_directive") == 0)
         updateExtensionBehavior(line, "GL_GOOGLE_cpp_style_line_directive", behaviorString);
+    // subgroup_* to subgroup_basic
+    else if (strcmp(extension, "GL_KHR_shader_subgroup_vote") == 0)
+        updateExtensionBehavior(line, "GL_KHR_shader_subgroup_basic", behaviorString);
+    else if (strcmp(extension, "GL_KHR_shader_subgroup_arithmetic") == 0)
+        updateExtensionBehavior(line, "GL_KHR_shader_subgroup_basic", behaviorString);
+    else if (strcmp(extension, "GL_KHR_shader_subgroup_ballot") == 0)
+        updateExtensionBehavior(line, "GL_KHR_shader_subgroup_basic", behaviorString);
+    else if (strcmp(extension, "GL_KHR_shader_subgroup_shuffle") == 0)
+        updateExtensionBehavior(line, "GL_KHR_shader_subgroup_basic", behaviorString);
+    else if (strcmp(extension, "GL_KHR_shader_subgroup_shuffle_relative") == 0)
+        updateExtensionBehavior(line, "GL_KHR_shader_subgroup_basic", behaviorString);
+    else if (strcmp(extension, "GL_KHR_shader_subgroup_clustered") == 0)
+        updateExtensionBehavior(line, "GL_KHR_shader_subgroup_basic", behaviorString);
+    else if (strcmp(extension, "GL_KHR_shader_subgroup_quad") == 0)
+        updateExtensionBehavior(line, "GL_KHR_shader_subgroup_basic", behaviorString);
+#ifdef NV_EXTENSIONS
+    else if (strcmp(extension, "GL_NV_shader_subgroup_partitioned") == 0)
+        updateExtensionBehavior(line, "GL_KHR_shader_subgroup_basic", behaviorString);
+#endif
 }
 
 void TParseVersions::updateExtensionBehavior(const char* extension, TExtensionBehavior behavior)
@@ -687,6 +841,20 @@
     }
 }
 
+// Check if extension is used with correct shader stage.
+void TParseVersions::checkExtensionStage(const TSourceLoc& loc, const char * const extension)
+{
+#ifdef NV_EXTENSIONS
+    // GL_NV_mesh_shader extension is only allowed in task/mesh shaders
+    if (strcmp(extension, "GL_NV_mesh_shader") == 0) {
+        requireStage(loc, (EShLanguageMask)(EShLangTaskNVMask | EShLangMeshNVMask | EShLangFragmentMask),
+                     "#extension GL_NV_mesh_shader");
+        profileRequires(loc, ECoreProfile, 450, 0, "#extension GL_NV_mesh_shader");
+        profileRequires(loc, EEsProfile, 320, 0, "#extension GL_NV_mesh_shader");
+    }
+#endif
+}
+
 // Call for any operation needing full GLSL integer data-type support.
 void TParseVersions::fullIntegerCheck(const TSourceLoc& loc, const char* op)
 {
@@ -698,31 +866,215 @@
 void TParseVersions::doubleCheck(const TSourceLoc& loc, const char* op)
 {
     requireProfile(loc, ECoreProfile | ECompatibilityProfile, op);
-    profileRequires(loc, ECoreProfile, 400, nullptr, op);
-    profileRequires(loc, ECompatibilityProfile, 400, nullptr, op);
+    profileRequires(loc, ECoreProfile | ECompatibilityProfile, 400, nullptr, op);
 }
 
-#ifdef AMD_EXTENSIONS
-// Call for any operation needing float16 data-type support.
+// Call for any operation needing GLSL float16 data-type support.
 void TParseVersions::float16Check(const TSourceLoc& loc, const char* op, bool builtIn)
 {
     if (!builtIn) {
-        requireExtensions(loc, 1, &E_GL_AMD_gpu_shader_half_float, "shader half float");
+        const char* const extensions[] = {
+#if AMD_EXTENSIONS
+                                           E_GL_AMD_gpu_shader_half_float,
+#endif
+                                           E_GL_EXT_shader_explicit_arithmetic_types,
+                                           E_GL_EXT_shader_explicit_arithmetic_types_float16};
+        requireExtensions(loc, sizeof(extensions)/sizeof(extensions[0]), extensions, op);
+    }
+}
+
+bool TParseVersions::float16Arithmetic()
+{
+    const char* const extensions[] = {
+#if AMD_EXTENSIONS
+                                       E_GL_AMD_gpu_shader_half_float,
+#endif
+                                       E_GL_EXT_shader_explicit_arithmetic_types,
+                                       E_GL_EXT_shader_explicit_arithmetic_types_float16};
+    return extensionsTurnedOn(sizeof(extensions)/sizeof(extensions[0]), extensions);
+}
+
+bool TParseVersions::int16Arithmetic()
+{
+    const char* const extensions[] = {
+#if AMD_EXTENSIONS
+                                       E_GL_AMD_gpu_shader_int16,
+#endif
+                                       E_GL_EXT_shader_explicit_arithmetic_types,
+                                       E_GL_EXT_shader_explicit_arithmetic_types_int16};
+    return extensionsTurnedOn(sizeof(extensions)/sizeof(extensions[0]), extensions);
+}
+
+bool TParseVersions::int8Arithmetic()
+{
+    const char* const extensions[] = {
+                                       E_GL_EXT_shader_explicit_arithmetic_types,
+                                       E_GL_EXT_shader_explicit_arithmetic_types_int8};
+    return extensionsTurnedOn(sizeof(extensions)/sizeof(extensions[0]), extensions);
+}
+
+void TParseVersions::requireFloat16Arithmetic(const TSourceLoc& loc, const char* op, const char* featureDesc)
+{
+    TString combined;
+    combined = op;
+    combined += ": ";
+    combined += featureDesc;
+
+    const char* const extensions[] = {
+#if AMD_EXTENSIONS
+                                       E_GL_AMD_gpu_shader_half_float,
+#endif
+                                       E_GL_EXT_shader_explicit_arithmetic_types,
+                                       E_GL_EXT_shader_explicit_arithmetic_types_float16};
+    requireExtensions(loc, sizeof(extensions)/sizeof(extensions[0]), extensions, combined.c_str());
+}
+
+void TParseVersions::requireInt16Arithmetic(const TSourceLoc& loc, const char* op, const char* featureDesc)
+{
+    TString combined;
+    combined = op;
+    combined += ": ";
+    combined += featureDesc;
+
+    const char* const extensions[] = {
+#if AMD_EXTENSIONS
+                                       E_GL_AMD_gpu_shader_int16,
+#endif
+                                       E_GL_EXT_shader_explicit_arithmetic_types,
+                                       E_GL_EXT_shader_explicit_arithmetic_types_int16};
+    requireExtensions(loc, sizeof(extensions)/sizeof(extensions[0]), extensions, combined.c_str());
+}
+
+void TParseVersions::requireInt8Arithmetic(const TSourceLoc& loc, const char* op, const char* featureDesc)
+{
+    TString combined;
+    combined = op;
+    combined += ": ";
+    combined += featureDesc;
+
+    const char* const extensions[] = {
+                                       E_GL_EXT_shader_explicit_arithmetic_types,
+                                       E_GL_EXT_shader_explicit_arithmetic_types_int8};
+    requireExtensions(loc, sizeof(extensions)/sizeof(extensions[0]), extensions, combined.c_str());
+}
+
+void TParseVersions::float16ScalarVectorCheck(const TSourceLoc& loc, const char* op, bool builtIn)
+{
+    if (!builtIn) {
+        const char* const extensions[] = {
+#if AMD_EXTENSIONS
+                                           E_GL_AMD_gpu_shader_half_float,
+#endif
+                                           E_GL_EXT_shader_16bit_storage,
+                                           E_GL_EXT_shader_explicit_arithmetic_types,
+                                           E_GL_EXT_shader_explicit_arithmetic_types_float16};
+        requireExtensions(loc, sizeof(extensions)/sizeof(extensions[0]), extensions, op);
+    }
+}
+
+// Call for any operation needing GLSL float32 data-type support.
+void TParseVersions::explicitFloat32Check(const TSourceLoc& loc, const char* op, bool builtIn)
+{
+    if (!builtIn) {
+        const char* const extensions[2] = {E_GL_EXT_shader_explicit_arithmetic_types,
+                                           E_GL_EXT_shader_explicit_arithmetic_types_float32};
+        requireExtensions(loc, 2, extensions, op);
+    }
+}
+
+// Call for any operation needing GLSL float64 data-type support.
+void TParseVersions::explicitFloat64Check(const TSourceLoc& loc, const char* op, bool builtIn)
+{
+    if (!builtIn) {
+        const char* const extensions[2] = {E_GL_EXT_shader_explicit_arithmetic_types,
+                                           E_GL_EXT_shader_explicit_arithmetic_types_float64};
+        requireExtensions(loc, 2, extensions, op);
         requireProfile(loc, ECoreProfile | ECompatibilityProfile, op);
-        profileRequires(loc, ECoreProfile, 450, nullptr, op);
-        profileRequires(loc, ECompatibilityProfile, 450, nullptr, op);
+        profileRequires(loc, ECoreProfile | ECompatibilityProfile, 400, nullptr, op);
+    }
+}
+
+// Call for any operation needing GLSL explicit int8 data-type support.
+void TParseVersions::explicitInt8Check(const TSourceLoc& loc, const char* op, bool builtIn)
+{
+    if (! builtIn) {
+        const char* const extensions[2] = {E_GL_EXT_shader_explicit_arithmetic_types,
+                                           E_GL_EXT_shader_explicit_arithmetic_types_int8};
+        requireExtensions(loc, 2, extensions, op);
+    }
+}
+
+#ifdef AMD_EXTENSIONS
+// Call for any operation needing GLSL float16 opaque-type support
+void TParseVersions::float16OpaqueCheck(const TSourceLoc& loc, const char* op, bool builtIn)
+{
+    if (! builtIn) {
+        requireExtensions(loc, 1, &E_GL_AMD_gpu_shader_half_float_fetch, op);
+        requireProfile(loc, ECoreProfile | ECompatibilityProfile, op);
+        profileRequires(loc, ECoreProfile | ECompatibilityProfile, 400, nullptr, op);
     }
 }
 #endif
 
+// Call for any operation needing GLSL explicit int16 data-type support.
+void TParseVersions::explicitInt16Check(const TSourceLoc& loc, const char* op, bool builtIn)
+{
+    if (! builtIn) {
+    	const char* const extensions[] = {
+#if AMD_EXTENSIONS
+                                           E_GL_AMD_gpu_shader_int16,
+#endif
+                                           E_GL_EXT_shader_explicit_arithmetic_types,
+                                           E_GL_EXT_shader_explicit_arithmetic_types_int16};
+        requireExtensions(loc, sizeof(extensions)/sizeof(extensions[0]), extensions, op);
+    }
+}
+
+void TParseVersions::int16ScalarVectorCheck(const TSourceLoc& loc, const char* op, bool builtIn)
+{
+    if (! builtIn) {
+    	const char* const extensions[] = {
+#if AMD_EXTENSIONS
+                                           E_GL_AMD_gpu_shader_int16,
+#endif
+                                           E_GL_EXT_shader_16bit_storage,
+                                           E_GL_EXT_shader_explicit_arithmetic_types,
+                                           E_GL_EXT_shader_explicit_arithmetic_types_int16};
+        requireExtensions(loc, sizeof(extensions)/sizeof(extensions[0]), extensions, op);
+    }
+}
+
+void TParseVersions::int8ScalarVectorCheck(const TSourceLoc& loc, const char* op, bool builtIn)
+{
+    if (! builtIn) {
+    	const char* const extensions[] = {
+                                           E_GL_EXT_shader_8bit_storage,
+                                           E_GL_EXT_shader_explicit_arithmetic_types,
+                                           E_GL_EXT_shader_explicit_arithmetic_types_int8};
+        requireExtensions(loc, sizeof(extensions)/sizeof(extensions[0]), extensions, op);
+    }
+}
+
+// Call for any operation needing GLSL explicit int32 data-type support.
+void TParseVersions::explicitInt32Check(const TSourceLoc& loc, const char* op, bool builtIn)
+{
+    if (! builtIn) {
+        const char* const extensions[2] = {E_GL_EXT_shader_explicit_arithmetic_types,
+                                           E_GL_EXT_shader_explicit_arithmetic_types_int32};
+        requireExtensions(loc, 2, extensions, op);
+    }
+}
+
 // Call for any operation needing GLSL 64-bit integer data-type support.
 void TParseVersions::int64Check(const TSourceLoc& loc, const char* op, bool builtIn)
 {
     if (! builtIn) {
-        requireExtensions(loc, 1, &E_GL_ARB_gpu_shader_int64, "shader int64");
+        const char* const extensions[3] = {E_GL_ARB_gpu_shader_int64,
+                                           E_GL_EXT_shader_explicit_arithmetic_types,
+                                           E_GL_EXT_shader_explicit_arithmetic_types_int64};
+        requireExtensions(loc, 3, extensions, op);
         requireProfile(loc, ECoreProfile | ECompatibilityProfile, op);
-        profileRequires(loc, ECoreProfile, 450, nullptr, op);
-        profileRequires(loc, ECompatibilityProfile, 450, nullptr, op);
+        profileRequires(loc, ECoreProfile | ECompatibilityProfile, 400, nullptr, op);
     }
 }
 
@@ -736,7 +1088,7 @@
 // Call for any operation removed because Vulkan SPIR-V is being generated.
 void TParseVersions::vulkanRemoved(const TSourceLoc& loc, const char* op)
 {
-    if (spvVersion.vulkan >= 100)
+    if (spvVersion.vulkan > 0)
         error(loc, "not allowed when using GLSL for Vulkan", op, "");
 }
 
diff --git a/glslang/MachineIndependent/Versions.h b/glslang/MachineIndependent/Versions.h
index 7f5d33d..3f704f3 100644
--- a/glslang/MachineIndependent/Versions.h
+++ b/glslang/MachineIndependent/Versions.h
@@ -1,6 +1,7 @@
 //
 // Copyright (C) 2002-2005  3Dlabs Inc. Ltd.
 // Copyright (C) 2012-2013 LunarG, Inc.
+// Copyright (C) 2017 ARM Limited.
 //
 // All rights reserved.
 //
@@ -72,14 +73,19 @@
 }
 
 //
-// SPIR-V has versions for multiple things; tie them together.
-// 0 means a target or rule set is not enabled.
+// What source rules, validation rules, target language, etc. are needed
+// desired for SPIR-V?
+//
+// 0 means a target or rule set is not enabled (ignore rules from that entity).
+// Non-0 means to apply semantic rules arising from that version of its rule set.
+// The union of all requested rule sets will be applied.
 //
 struct SpvVersion {
-    SpvVersion() : spv(0), vulkan(0), openGl(0) {}
-    unsigned int spv; // the version of the targeted SPIR-V, as defined by SPIR-V in word 1 of the SPIR-V binary header
-    int vulkan;       // the version of semantics for Vulkan; e.g., for GLSL from KHR_vulkan_glsl "#define VULKAN"
-    int openGl;       // the version of semantics for OpenGL; e.g., for GLSL from KHR_vulkan_glsl "#define GL_SPIRV"
+    SpvVersion() : spv(0), vulkanGlsl(0), vulkan(0), openGl(0) {}
+    unsigned int spv; // the version of SPIR-V to target, as defined by "word 1" of the SPIR-V binary header
+    int vulkanGlsl;   // the version of GLSL semantics for Vulkan, from GL_KHR_vulkan_glsl, for "#define VULKAN XXX"
+    int vulkan;       // the version of Vulkan, for which SPIR-V execution environment rules to use
+    int openGl;       // the version of GLSL semantics for OpenGL, from GL_ARB_gl_spirv, for "#define GL_SPIRV XXX"
 };
 
 //
@@ -102,7 +108,9 @@
 const char* const E_GL_OES_standard_derivatives         = "GL_OES_standard_derivatives";
 const char* const E_GL_EXT_frag_depth                   = "GL_EXT_frag_depth";
 const char* const E_GL_OES_EGL_image_external           = "GL_OES_EGL_image_external";
+const char* const E_GL_OES_EGL_image_external_essl3     = "GL_OES_EGL_image_external_essl3";
 const char* const E_GL_EXT_shader_texture_lod           = "GL_EXT_shader_texture_lod";
+const char* const E_GL_EXT_shadow_samplers              = "GL_EXT_shadow_samplers";
 
 const char* const E_GL_ARB_texture_rectangle            = "GL_ARB_texture_rectangle";
 const char* const E_GL_3DL_array_objects                = "GL_3DL_array_objects";
@@ -127,14 +135,51 @@
 const char* const E_GL_ARB_shader_ballot                = "GL_ARB_shader_ballot";
 const char* const E_GL_ARB_sparse_texture2              = "GL_ARB_sparse_texture2";
 const char* const E_GL_ARB_sparse_texture_clamp         = "GL_ARB_sparse_texture_clamp";
+const char* const E_GL_ARB_shader_stencil_export        = "GL_ARB_shader_stencil_export";
 // const char* const E_GL_ARB_cull_distance            = "GL_ARB_cull_distance";  // present for 4.5, but need extension control over block members
+const char* const E_GL_ARB_post_depth_coverage          = "GL_ARB_post_depth_coverage";
+const char* const E_GL_ARB_shader_viewport_layer_array  = "GL_ARB_shader_viewport_layer_array";
+
+const char* const E_GL_KHR_shader_subgroup_basic            = "GL_KHR_shader_subgroup_basic";
+const char* const E_GL_KHR_shader_subgroup_vote             = "GL_KHR_shader_subgroup_vote";
+const char* const E_GL_KHR_shader_subgroup_arithmetic       = "GL_KHR_shader_subgroup_arithmetic";
+const char* const E_GL_KHR_shader_subgroup_ballot           = "GL_KHR_shader_subgroup_ballot";
+const char* const E_GL_KHR_shader_subgroup_shuffle          = "GL_KHR_shader_subgroup_shuffle";
+const char* const E_GL_KHR_shader_subgroup_shuffle_relative = "GL_KHR_shader_subgroup_shuffle_relative";
+const char* const E_GL_KHR_shader_subgroup_clustered        = "GL_KHR_shader_subgroup_clustered";
+const char* const E_GL_KHR_shader_subgroup_quad             = "GL_KHR_shader_subgroup_quad";
+const char* const E_GL_KHR_memory_scope_semantics           = "GL_KHR_memory_scope_semantics";
+
+const char* const E_GL_EXT_shader_atomic_int64              = "GL_EXT_shader_atomic_int64";
 
 const char* const E_GL_EXT_shader_non_constant_global_initializers = "GL_EXT_shader_non_constant_global_initializers";
 const char* const E_GL_EXT_shader_image_load_formatted = "GL_EXT_shader_image_load_formatted";
 
+const char* const E_GL_EXT_shader_16bit_storage             = "GL_EXT_shader_16bit_storage";
+const char* const E_GL_EXT_shader_8bit_storage              = "GL_EXT_shader_8bit_storage";
+
+
 // EXT extensions
-const char* const E_GL_EXT_device_group                 = "GL_EXT_device_group";
-const char* const E_GL_EXT_multiview                    = "GL_EXT_multiview";
+const char* const E_GL_EXT_device_group                     = "GL_EXT_device_group";
+const char* const E_GL_EXT_multiview                        = "GL_EXT_multiview";
+const char* const E_GL_EXT_post_depth_coverage              = "GL_EXT_post_depth_coverage";
+const char* const E_GL_EXT_control_flow_attributes          = "GL_EXT_control_flow_attributes";
+const char* const E_GL_EXT_nonuniform_qualifier             = "GL_EXT_nonuniform_qualifier";
+const char* const E_GL_EXT_samplerless_texture_functions    = "GL_EXT_samplerless_texture_functions";
+const char* const E_GL_EXT_scalar_block_layout              = "GL_EXT_scalar_block_layout";
+const char* const E_GL_EXT_fragment_invocation_density      = "GL_EXT_fragment_invocation_density";
+
+// Arrays of extensions for the above viewportEXTs duplications
+
+const char* const post_depth_coverageEXTs[] = { E_GL_ARB_post_depth_coverage, E_GL_EXT_post_depth_coverage };
+const int Num_post_depth_coverageEXTs = sizeof(post_depth_coverageEXTs) / sizeof(post_depth_coverageEXTs[0]);
+
+// OVR extensions
+const char* const E_GL_OVR_multiview                    = "GL_OVR_multiview";
+const char* const E_GL_OVR_multiview2                   = "GL_OVR_multiview2";
+
+const char* const OVR_multiview_EXTs[] = { E_GL_OVR_multiview, E_GL_OVR_multiview2 };
+const int Num_OVR_multiview_EXTs = sizeof(OVR_multiview_EXTs) / sizeof(OVR_multiview_EXTs[0]);
 
 // #line and #include
 const char* const E_GL_GOOGLE_cpp_style_line_directive          = "GL_GOOGLE_cpp_style_line_directive";
@@ -146,15 +191,30 @@
 const char* const E_GL_AMD_shader_explicit_vertex_parameter     = "GL_AMD_shader_explicit_vertex_parameter";
 const char* const E_GL_AMD_gcn_shader                           = "GL_AMD_gcn_shader";
 const char* const E_GL_AMD_gpu_shader_half_float                = "GL_AMD_gpu_shader_half_float";
+const char* const E_GL_AMD_texture_gather_bias_lod              = "GL_AMD_texture_gather_bias_lod";
+const char* const E_GL_AMD_gpu_shader_int16                     = "GL_AMD_gpu_shader_int16";
+const char* const E_GL_AMD_shader_image_load_store_lod          = "GL_AMD_shader_image_load_store_lod";
+const char* const E_GL_AMD_shader_fragment_mask                 = "GL_AMD_shader_fragment_mask";
+const char* const E_GL_AMD_gpu_shader_half_float_fetch          = "GL_AMD_gpu_shader_half_float_fetch";
 #endif
+
 #ifdef NV_EXTENSIONS
 
 const char* const E_GL_NV_sample_mask_override_coverage         = "GL_NV_sample_mask_override_coverage";
 const char* const E_SPV_NV_geometry_shader_passthrough          = "GL_NV_geometry_shader_passthrough";
-const char* const E_GL_ARB_shader_viewport_layer_array          = "GL_ARB_shader_viewport_layer_array";
 const char* const E_GL_NV_viewport_array2                       = "GL_NV_viewport_array2";
 const char* const E_GL_NV_stereo_view_rendering                 = "GL_NV_stereo_view_rendering";
 const char* const E_GL_NVX_multiview_per_view_attributes        = "GL_NVX_multiview_per_view_attributes";
+const char* const E_GL_NV_shader_atomic_int64                   = "GL_NV_shader_atomic_int64";
+const char* const E_GL_NV_conservative_raster_underestimation   = "GL_NV_conservative_raster_underestimation";
+const char* const E_GL_NV_shader_noperspective_interpolation    = "GL_NV_shader_noperspective_interpolation";
+const char* const E_GL_NV_shader_subgroup_partitioned           = "GL_NV_shader_subgroup_partitioned";
+const char* const E_GL_NV_shading_rate_image                    = "GL_NV_shading_rate_image";
+const char* const E_GL_NV_ray_tracing                           = "GL_NV_ray_tracing";
+const char* const E_GL_NV_fragment_shader_barycentric           = "GL_NV_fragment_shader_barycentric";
+const char* const E_GL_NV_compute_shader_derivatives            = "GL_NV_compute_shader_derivatives";
+const char* const E_GL_NV_shader_texture_footprint              = "GL_NV_shader_texture_footprint";
+const char* const E_GL_NV_mesh_shader                           = "GL_NV_mesh_shader";
 
 // Arrays of extensions for the above viewportEXTs duplications
 
@@ -190,6 +250,16 @@
 const char* const E_GL_OES_texture_buffer                       = "GL_OES_texture_buffer";
 const char* const E_GL_OES_texture_cube_map_array               = "GL_OES_texture_cube_map_array";
 
+// KHX
+const char* const E_GL_EXT_shader_explicit_arithmetic_types          = "GL_EXT_shader_explicit_arithmetic_types";
+const char* const E_GL_EXT_shader_explicit_arithmetic_types_int8     = "GL_EXT_shader_explicit_arithmetic_types_int8";
+const char* const E_GL_EXT_shader_explicit_arithmetic_types_int16    = "GL_EXT_shader_explicit_arithmetic_types_int16";
+const char* const E_GL_EXT_shader_explicit_arithmetic_types_int32    = "GL_EXT_shader_explicit_arithmetic_types_int32";
+const char* const E_GL_EXT_shader_explicit_arithmetic_types_int64    = "GL_EXT_shader_explicit_arithmetic_types_int64";
+const char* const E_GL_EXT_shader_explicit_arithmetic_types_float16  = "GL_EXT_shader_explicit_arithmetic_types_float16";
+const char* const E_GL_EXT_shader_explicit_arithmetic_types_float32  = "GL_EXT_shader_explicit_arithmetic_types_float32";
+const char* const E_GL_EXT_shader_explicit_arithmetic_types_float64  = "GL_EXT_shader_explicit_arithmetic_types_float64";
+
 // Arrays of extensions for the above AEP duplications
 
 const char* const AEP_geometry_shader[] = { E_GL_EXT_geometry_shader, E_GL_OES_geometry_shader };
diff --git a/glslang/MachineIndependent/attribute.cpp b/glslang/MachineIndependent/attribute.cpp
new file mode 100644
index 0000000..73b665d
--- /dev/null
+++ b/glslang/MachineIndependent/attribute.cpp
@@ -0,0 +1,257 @@
+//
+// Copyright (C) 2017 LunarG, Inc.
+// Copyright (C) 2018 Google, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+//
+//    Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//    Redistributions in binary form must reproduce the above
+//    copyright notice, this list of conditions and the following
+//    disclaimer in the documentation and/or other materials provided
+//    with the distribution.
+//
+//    Neither the name of Google, Inc., nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+// POSSIBILITY OF SUCH DAMAGE.
+//
+
+#include "attribute.h"
+#include "../Include/intermediate.h"
+#include "ParseHelper.h"
+
+namespace glslang {
+
+// extract integers out of attribute arguments stored in attribute aggregate
+bool TAttributeArgs::getInt(int& value, int argNum) const 
+{
+    const TConstUnion* intConst = getConstUnion(EbtInt, argNum);
+
+    if (intConst == nullptr)
+        return false;
+
+    value = intConst->getIConst();
+    return true;
+}
+
+// extract strings out of attribute arguments stored in attribute aggregate.
+// convert to lower case if converToLower is true (for case-insensitive compare convenience)
+bool TAttributeArgs::getString(TString& value, int argNum, bool convertToLower) const 
+{
+    const TConstUnion* stringConst = getConstUnion(EbtString, argNum);
+
+    if (stringConst == nullptr)
+        return false;
+
+    value = *stringConst->getSConst();
+
+    // Convenience.
+    if (convertToLower)
+        std::transform(value.begin(), value.end(), value.begin(), ::tolower);
+
+    return true;
+}
+
+// How many arguments were supplied?
+int TAttributeArgs::size() const
+{
+    return args == nullptr ? 0 : (int)args->getSequence().size();
+}
+
+// Helper to get attribute const union.  Returns nullptr on failure.
+const TConstUnion* TAttributeArgs::getConstUnion(TBasicType basicType, int argNum) const
+{
+    if (args == nullptr)
+        return nullptr;
+
+    if (argNum >= (int)args->getSequence().size())
+        return nullptr;
+
+    const TConstUnion* constVal = &args->getSequence()[argNum]->getAsConstantUnion()->getConstArray()[0];
+    if (constVal == nullptr || constVal->getType() != basicType)
+        return nullptr;
+
+    return constVal;
+}
+
+// Implementation of TParseContext parts of attributes
+TAttributeType TParseContext::attributeFromName(const TString& name) const
+{
+    if (name == "branch" || name == "dont_flatten")
+        return EatBranch;
+    else if (name == "flatten")
+        return EatFlatten;
+    else if (name == "unroll")
+        return EatUnroll;
+    else if (name == "loop" || name == "dont_unroll")
+        return EatLoop;
+    else if (name == "dependency_infinite")
+        return EatDependencyInfinite;
+    else if (name == "dependency_length")
+        return EatDependencyLength;
+    else
+        return EatNone;
+}
+
+// Make an initial leaf for the grammar from a no-argument attribute
+TAttributes* TParseContext::makeAttributes(const TString& identifier) const
+{
+    TAttributes *attributes = nullptr;
+    attributes = NewPoolObject(attributes);
+    TAttributeArgs args = { attributeFromName(identifier), nullptr };
+    attributes->push_back(args);
+    return attributes;
+}
+
+// Make an initial leaf for the grammar from a one-argument attribute
+TAttributes* TParseContext::makeAttributes(const TString& identifier, TIntermNode* node) const
+{
+    TAttributes *attributes = nullptr;
+    attributes = NewPoolObject(attributes);
+
+    // for now, node is always a simple single expression, but other code expects
+    // a list, so make it so
+    TIntermAggregate* agg = intermediate.makeAggregate(node);
+    TAttributeArgs args = { attributeFromName(identifier), agg };
+    attributes->push_back(args);
+    return attributes;
+}
+
+// Merge two sets of attributes into a single set.
+// The second argument is destructively consumed.
+TAttributes* TParseContext::mergeAttributes(TAttributes* attr1, TAttributes* attr2) const
+{
+    attr1->splice(attr1->end(), *attr2);
+    return attr1;
+}
+
+//
+// Selection attributes
+//
+void TParseContext::handleSelectionAttributes(const TAttributes& attributes, TIntermNode* node)
+{
+    TIntermSelection* selection = node->getAsSelectionNode();
+    if (selection == nullptr)
+        return;
+
+    for (auto it = attributes.begin(); it != attributes.end(); ++it) {
+        if (it->size() > 0) {
+            warn(node->getLoc(), "attribute with arguments not recognized, skipping", "", "");
+            continue;
+        }
+
+        switch (it->name) {
+        case EatFlatten:
+            selection->setFlatten();
+            break;
+        case EatBranch:
+            selection->setDontFlatten();
+            break;
+        default:
+            warn(node->getLoc(), "attribute does not apply to a selection", "", "");
+            break;
+        }
+    }
+}
+
+//
+// Switch attributes
+//
+void TParseContext::handleSwitchAttributes(const TAttributes& attributes, TIntermNode* node)
+{
+    TIntermSwitch* selection = node->getAsSwitchNode();
+    if (selection == nullptr)
+        return;
+
+    for (auto it = attributes.begin(); it != attributes.end(); ++it) {
+        if (it->size() > 0) {
+            warn(node->getLoc(), "attribute with arguments not recognized, skipping", "", "");
+            continue;
+        }
+
+        switch (it->name) {
+        case EatFlatten:
+            selection->setFlatten();
+            break;
+        case EatBranch:
+            selection->setDontFlatten();
+            break;
+        default:
+            warn(node->getLoc(), "attribute does not apply to a switch", "", "");
+            break;
+        }
+    }
+}
+
+//
+// Loop attributes
+//
+void TParseContext::handleLoopAttributes(const TAttributes& attributes, TIntermNode* node)
+{
+    TIntermLoop* loop = node->getAsLoopNode();
+    if (loop == nullptr) {
+        // the actual loop might be part of a sequence
+        TIntermAggregate* agg = node->getAsAggregate();
+        if (agg == nullptr)
+            return;
+        for (auto it = agg->getSequence().begin(); it != agg->getSequence().end(); ++it) {
+            loop = (*it)->getAsLoopNode();
+            if (loop != nullptr)
+                break;
+        }
+        if (loop == nullptr)
+            return;
+    }
+
+    for (auto it = attributes.begin(); it != attributes.end(); ++it) {
+        if (it->name != EatDependencyLength && it->size() > 0) {
+            warn(node->getLoc(), "attribute with arguments not recognized, skipping", "", "");
+            continue;
+        }
+
+        int value;
+        switch (it->name) {
+        case EatUnroll:
+            loop->setUnroll();
+            break;
+        case EatLoop:
+            loop->setDontUnroll();
+            break;
+        case EatDependencyInfinite:
+            loop->setLoopDependency(TIntermLoop::dependencyInfinite);
+            break;
+        case EatDependencyLength:
+            if (it->size() == 1 && it->getInt(value)) {
+                if (value <= 0)
+                    error(node->getLoc(), "must be positive", "dependency_length", "");
+                loop->setLoopDependency(value);
+            } else
+                warn(node->getLoc(), "expected a single integer argument", "dependency_length", "");
+            break;
+        default:
+            warn(node->getLoc(), "attribute does not apply to a loop", "", "");
+            break;
+        }
+    }
+}
+
+
+} // end namespace glslang
diff --git a/glslang/MachineIndependent/attribute.h b/glslang/MachineIndependent/attribute.h
new file mode 100644
index 0000000..8d0c5bc
--- /dev/null
+++ b/glslang/MachineIndependent/attribute.h
@@ -0,0 +1,102 @@
+//
+// Copyright (C) 2017 LunarG, Inc.
+// Copyright (C) 2018 Google, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+//
+//    Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//    Redistributions in binary form must reproduce the above
+//    copyright notice, this list of conditions and the following
+//    disclaimer in the documentation and/or other materials provided
+//    with the distribution.
+//
+//    Neither the name of 3Dlabs Inc. Ltd. nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+// POSSIBILITY OF SUCH DAMAGE.
+//
+
+#ifndef _ATTRIBUTE_INCLUDED_
+#define _ATTRIBUTE_INCLUDED_
+
+#include "../Include/Common.h"
+#include "../Include/ConstantUnion.h"
+
+namespace glslang {
+
+    enum TAttributeType {
+        EatNone,
+        EatAllow_uav_condition,
+        EatBranch,
+        EatCall,
+        EatDomain,
+        EatEarlyDepthStencil,
+        EatFastOpt,
+        EatFlatten,
+        EatForceCase,
+        EatInstance,
+        EatMaxTessFactor,
+        EatNumThreads,
+        EatMaxVertexCount,
+        EatOutputControlPoints,
+        EatOutputTopology,
+        EatPartitioning,
+        EatPatchConstantFunc,
+        EatPatchSize,
+        EatUnroll,
+        EatLoop,
+        EatBinding,
+        EatGlobalBinding,
+        EatLocation,
+        EatInputAttachment,
+        EatBuiltIn,
+        EatPushConstant,
+        EatConstantId,
+        EatDependencyInfinite,
+        EatDependencyLength
+    };
+
+    class TIntermAggregate;
+
+    struct TAttributeArgs {
+        TAttributeType name;
+        const TIntermAggregate* args;
+
+        // Obtain attribute as integer
+        // Return false if it cannot be obtained
+        bool getInt(int& value, int argNum = 0) const;
+
+        // Obtain attribute as string, with optional to-lower transform
+        // Return false if it cannot be obtained
+        bool getString(TString& value, int argNum = 0, bool convertToLower = true) const;
+
+        // How many arguments were provided to the attribute?
+        int size() const;
+
+    protected:
+        const TConstUnion* getConstUnion(TBasicType basicType, int argNum) const;
+    };
+
+    typedef TList<TAttributeArgs> TAttributes;
+
+} // end namespace glslang
+
+#endif // _ATTRIBUTE_INCLUDED_
diff --git a/glslang/MachineIndependent/gl_types.h b/glslang/MachineIndependent/gl_types.h
index d7cb31f..c9fee9e 100644
--- a/glslang/MachineIndependent/gl_types.h
+++ b/glslang/MachineIndependent/gl_types.h
@@ -21,6 +21,8 @@
 ** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
 */
 
+#pragma once
+
 #define GL_FLOAT                          0x1406
 #define GL_FLOAT_VEC2                     0x8B50
 #define GL_FLOAT_VEC3                     0x8B51
@@ -115,6 +117,40 @@
 #define GL_SAMPLER_CUBE_MAP_ARRAY_ARB     0x900C
 #define GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW_ARB 0x900D
 
+#ifdef AMD_EXTENSIONS
+#define GL_FLOAT16_SAMPLER_1D_AMD                       0x91CE
+#define GL_FLOAT16_SAMPLER_2D_AMD                       0x91CF
+#define GL_FLOAT16_SAMPLER_3D_AMD                       0x91D0
+#define GL_FLOAT16_SAMPLER_CUBE_AMD                     0x91D1
+#define GL_FLOAT16_SAMPLER_2D_RECT_AMD                  0x91D2
+#define GL_FLOAT16_SAMPLER_1D_ARRAY_AMD                 0x91D3
+#define GL_FLOAT16_SAMPLER_2D_ARRAY_AMD                 0x91D4
+#define GL_FLOAT16_SAMPLER_CUBE_MAP_ARRAY_AMD           0x91D5
+#define GL_FLOAT16_SAMPLER_BUFFER_AMD                   0x91D6
+#define GL_FLOAT16_SAMPLER_2D_MULTISAMPLE_AMD           0x91D7
+#define GL_FLOAT16_SAMPLER_2D_MULTISAMPLE_ARRAY_AMD     0x91D8
+
+#define GL_FLOAT16_SAMPLER_1D_SHADOW_AMD                0x91D9
+#define GL_FLOAT16_SAMPLER_2D_SHADOW_AMD                0x91DA
+#define GL_FLOAT16_SAMPLER_2D_RECT_SHADOW_AMD           0x91DB
+#define GL_FLOAT16_SAMPLER_1D_ARRAY_SHADOW_AMD          0x91DC
+#define GL_FLOAT16_SAMPLER_2D_ARRAY_SHADOW_AMD          0x91DD
+#define GL_FLOAT16_SAMPLER_CUBE_SHADOW_AMD              0x91DE
+#define GL_FLOAT16_SAMPLER_CUBE_MAP_ARRAY_SHADOW_AMD    0x91DF
+
+#define GL_FLOAT16_IMAGE_1D_AMD                         0x91E0
+#define GL_FLOAT16_IMAGE_2D_AMD                         0x91E1
+#define GL_FLOAT16_IMAGE_3D_AMD                         0x91E2
+#define GL_FLOAT16_IMAGE_2D_RECT_AMD                    0x91E3
+#define GL_FLOAT16_IMAGE_CUBE_AMD                       0x91E4
+#define GL_FLOAT16_IMAGE_1D_ARRAY_AMD                   0x91E5
+#define GL_FLOAT16_IMAGE_2D_ARRAY_AMD                   0x91E6
+#define GL_FLOAT16_IMAGE_CUBE_MAP_ARRAY_AMD             0x91E7
+#define GL_FLOAT16_IMAGE_BUFFER_AMD                     0x91E8
+#define GL_FLOAT16_IMAGE_2D_MULTISAMPLE_AMD             0x91E9
+#define GL_FLOAT16_IMAGE_2D_MULTISAMPLE_ARRAY_AMD       0x91EA
+#endif
+
 #define GL_INT_SAMPLER_1D                 0x8DC9
 #define GL_INT_SAMPLER_2D                 0x8DCA
 #define GL_INT_SAMPLER_3D                 0x8DCB
diff --git a/glslang/MachineIndependent/glslang.y b/glslang/MachineIndependent/glslang.y
index 958cd6e..3634f16 100644
--- a/glslang/MachineIndependent/glslang.y
+++ b/glslang/MachineIndependent/glslang.y
@@ -1,6 +1,7 @@
 //
 // Copyright (C) 2002-2005  3Dlabs Inc. Ltd.
 // Copyright (C) 2012-2013 LunarG, Inc.
+// Copyright (C) 2017 ARM Limited.
 //
 // All rights reserved.
 //
@@ -58,6 +59,7 @@
 #include "SymbolTable.h"
 #include "ParseHelper.h"
 #include "../Public/ShaderLang.h"
+#include "attribute.h"
 
 using namespace glslang;
 
@@ -86,6 +88,7 @@
             TIntermNode* intermNode;
             glslang::TIntermNodePair nodePair;
             glslang::TIntermTyped* intermTypedNode;
+            glslang::TAttributes* attributes;
         };
         union {
             glslang::TPublicType type;
@@ -121,15 +124,29 @@
 %expect 1     // One shift reduce conflict because of if | else
 
 %token <lex> ATTRIBUTE VARYING
-%token <lex> CONST BOOL FLOAT DOUBLE INT UINT INT64_T UINT64_T FLOAT16_T
+%token <lex> FLOAT16_T FLOAT FLOAT32_T DOUBLE FLOAT64_T
+%token <lex> CONST BOOL INT UINT INT64_T UINT64_T INT32_T UINT32_T INT16_T UINT16_T INT8_T UINT8_T
 %token <lex> BREAK CONTINUE DO ELSE FOR IF DISCARD RETURN SWITCH CASE DEFAULT SUBROUTINE
-%token <lex> BVEC2 BVEC3 BVEC4 IVEC2 IVEC3 IVEC4 I64VEC2 I64VEC3 I64VEC4 UVEC2 UVEC3 UVEC4 U64VEC2 U64VEC3 U64VEC4 VEC2 VEC3 VEC4
+%token <lex> BVEC2 BVEC3 BVEC4
+%token <lex> IVEC2 IVEC3 IVEC4
+%token <lex> UVEC2 UVEC3 UVEC4
+%token <lex> I64VEC2 I64VEC3 I64VEC4
+%token <lex> U64VEC2 U64VEC3 U64VEC4
+%token <lex> I32VEC2 I32VEC3 I32VEC4
+%token <lex> U32VEC2 U32VEC3 U32VEC4
+%token <lex> I16VEC2 I16VEC3 I16VEC4
+%token <lex> U16VEC2 U16VEC3 U16VEC4
+%token <lex> I8VEC2  I8VEC3  I8VEC4
+%token <lex> U8VEC2  U8VEC3  U8VEC4
+%token <lex> VEC2 VEC3 VEC4
 %token <lex> MAT2 MAT3 MAT4 CENTROID IN OUT INOUT
-%token <lex> UNIFORM PATCH SAMPLE BUFFER SHARED
-%token <lex> COHERENT VOLATILE RESTRICT READONLY WRITEONLY
+%token <lex> UNIFORM PATCH SAMPLE BUFFER SHARED NONUNIFORM PAYLOADNV PAYLOADINNV HITATTRNV CALLDATANV CALLDATAINNV
+%token <lex> COHERENT VOLATILE RESTRICT READONLY WRITEONLY DEVICECOHERENT QUEUEFAMILYCOHERENT WORKGROUPCOHERENT SUBGROUPCOHERENT NONPRIVATE
 %token <lex> DVEC2 DVEC3 DVEC4 DMAT2 DMAT3 DMAT4
 %token <lex> F16VEC2 F16VEC3 F16VEC4 F16MAT2 F16MAT3 F16MAT4
-%token <lex> NOPERSPECTIVE FLAT SMOOTH LAYOUT __EXPLICITINTERPAMD
+%token <lex> F32VEC2 F32VEC3 F32VEC4 F32MAT2 F32MAT3 F32MAT4
+%token <lex> F64VEC2 F64VEC3 F64VEC4 F64MAT2 F64MAT3 F64MAT4
+%token <lex> NOPERSPECTIVE FLAT SMOOTH LAYOUT EXPLICITINTERPAMD PERVERTEXNV PERPRIMITIVENV PERVIEWNV PERTASKNV
 
 %token <lex> MAT2X2 MAT2X3 MAT2X4
 %token <lex> MAT3X2 MAT3X3 MAT3X4
@@ -140,7 +157,14 @@
 %token <lex> F16MAT2X2 F16MAT2X3 F16MAT2X4
 %token <lex> F16MAT3X2 F16MAT3X3 F16MAT3X4
 %token <lex> F16MAT4X2 F16MAT4X3 F16MAT4X4
+%token <lex> F32MAT2X2 F32MAT2X3 F32MAT2X4
+%token <lex> F32MAT3X2 F32MAT3X3 F32MAT3X4
+%token <lex> F32MAT4X2 F32MAT4X3 F32MAT4X4
+%token <lex> F64MAT2X2 F64MAT2X3 F64MAT2X4
+%token <lex> F64MAT3X2 F64MAT3X3 F64MAT3X4
+%token <lex> F64MAT4X2 F64MAT4X3 F64MAT4X4
 %token <lex> ATOMIC_UINT
+%token <lex> ACCSTRUCTNV
 
 // combined image/sampler
 %token <lex> SAMPLER1D SAMPLER2D SAMPLER3D SAMPLERCUBE SAMPLER1DSHADOW SAMPLER2DSHADOW
@@ -156,6 +180,12 @@
 %token <lex> SAMPLER2DMSARRAY ISAMPLER2DMSARRAY USAMPLER2DMSARRAY
 %token <lex> SAMPLEREXTERNALOES
 
+%token <lex> F16SAMPLER1D F16SAMPLER2D F16SAMPLER3D F16SAMPLER2DRECT F16SAMPLERCUBE
+%token <lex> F16SAMPLER1DARRAY F16SAMPLER2DARRAY F16SAMPLERCUBEARRAY
+%token <lex> F16SAMPLERBUFFER F16SAMPLER2DMS F16SAMPLER2DMSARRAY
+%token <lex> F16SAMPLER1DSHADOW F16SAMPLER2DSHADOW F16SAMPLER1DARRAYSHADOW F16SAMPLER2DARRAYSHADOW
+%token <lex> F16SAMPLER2DRECTSHADOW F16SAMPLERCUBESHADOW F16SAMPLERCUBEARRAYSHADOW
+
 // pure sampler
 %token <lex> SAMPLER SAMPLERSHADOW
 
@@ -171,8 +201,13 @@
 %token <lex> TEXTURE2DMS ITEXTURE2DMS UTEXTURE2DMS
 %token <lex> TEXTURE2DMSARRAY ITEXTURE2DMSARRAY UTEXTURE2DMSARRAY
 
+%token <lex> F16TEXTURE1D F16TEXTURE2D F16TEXTURE3D F16TEXTURE2DRECT F16TEXTURECUBE
+%token <lex> F16TEXTURE1DARRAY F16TEXTURE2DARRAY F16TEXTURECUBEARRAY
+%token <lex> F16TEXTUREBUFFER F16TEXTURE2DMS F16TEXTURE2DMSARRAY
+
 // input attachments
 %token <lex> SUBPASSINPUT SUBPASSINPUTMS ISUBPASSINPUT ISUBPASSINPUTMS USUBPASSINPUT USUBPASSINPUTMS
+%token <lex> F16SUBPASSINPUT F16SUBPASSINPUTMS
 
 %token <lex> IMAGE1D IIMAGE1D UIMAGE1D IMAGE2D IIMAGE2D
 %token <lex> UIMAGE2D IMAGE3D IIMAGE3D UIMAGE3D
@@ -185,10 +220,14 @@
 %token <lex> IMAGE2DMS IIMAGE2DMS UIMAGE2DMS
 %token <lex> IMAGE2DMSARRAY IIMAGE2DMSARRAY UIMAGE2DMSARRAY
 
+%token <lex> F16IMAGE1D F16IMAGE2D F16IMAGE3D F16IMAGE2DRECT
+%token <lex> F16IMAGECUBE F16IMAGE1DARRAY F16IMAGE2DARRAY F16IMAGECUBEARRAY
+%token <lex> F16IMAGEBUFFER F16IMAGE2DMS F16IMAGE2DMSARRAY
+
 %token <lex> STRUCT VOID WHILE
 
 %token <lex> IDENTIFIER TYPE_NAME
-%token <lex> FLOATCONSTANT DOUBLECONSTANT INTCONSTANT UINTCONSTANT INT64CONSTANT UINT64CONSTANT BOOLCONSTANT FLOAT16CONSTANT
+%token <lex> FLOATCONSTANT DOUBLECONSTANT INT16CONSTANT UINT16CONSTANT INT32CONSTANT UINT32CONSTANT INTCONSTANT UINTCONSTANT INT64CONSTANT UINT64CONSTANT BOOLCONSTANT FLOAT16CONSTANT
 %token <lex> LEFT_OP RIGHT_OP
 %token <lex> INC_OP DEC_OP LE_OP GE_OP EQ_OP NE_OP
 %token <lex> AND_OP OR_OP XOR_OP MUL_ASSIGN DIV_ASSIGN ADD_ASSIGN
@@ -217,12 +256,12 @@
 %type <interm.intermNode> translation_unit function_definition
 %type <interm.intermNode> statement simple_statement
 %type <interm.intermNode> statement_list switch_statement_list compound_statement
-%type <interm.intermNode> declaration_statement selection_statement expression_statement
-%type <interm.intermNode> switch_statement case_label
+%type <interm.intermNode> declaration_statement selection_statement selection_statement_nonattributed expression_statement
+%type <interm.intermNode> switch_statement switch_statement_nonattributed case_label
 %type <interm.intermNode> declaration external_declaration
 %type <interm.intermNode> for_init_statement compound_statement_no_new_scope
 %type <interm.nodePair> selection_rest_statement for_rest_statement
-%type <interm.intermNode> iteration_statement jump_statement statement_no_new_scope statement_scoped
+%type <interm.intermNode> iteration_statement iteration_statement_nonattributed jump_statement statement_no_new_scope statement_scoped
 %type <interm> single_declaration init_declarator_list
 
 %type <interm> parameter_declaration parameter_declarator parameter_type_specifier
@@ -230,6 +269,7 @@
 %type <interm> array_specifier
 %type <interm.type> precise_qualifier invariant_qualifier interpolation_qualifier storage_qualifier precision_qualifier
 %type <interm.type> layout_qualifier layout_qualifier_id_list layout_qualifier_id
+%type <interm.type> non_uniform_qualifier
 
 %type <interm.type> type_qualifier fully_specified_type type_specifier
 %type <interm.type> single_type_qualifier
@@ -245,6 +285,8 @@
 
 %type <interm.identifierList> identifier_list
 
+%type <interm.attributes> attribute attribute_list single_attribute
+
 %start translation_unit
 %%
 
@@ -258,6 +300,14 @@
     : variable_identifier {
         $$ = $1;
     }
+    | INT32CONSTANT {
+        parseContext.explicitInt32Check($1.loc, "32-bit signed literal");
+        $$ = parseContext.intermediate.addConstantUnion($1.i, $1.loc, true);
+    }
+    | UINT32CONSTANT {
+        parseContext.explicitInt32Check($1.loc, "32-bit signed literal");
+        $$ = parseContext.intermediate.addConstantUnion($1.u, $1.loc, true);
+    }
     | INTCONSTANT {
         $$ = parseContext.intermediate.addConstantUnion($1.i, $1.loc, true);
     }
@@ -273,6 +323,14 @@
         parseContext.int64Check($1.loc, "64-bit unsigned integer literal");
         $$ = parseContext.intermediate.addConstantUnion($1.u64, $1.loc, true);
     }
+    | INT16CONSTANT {
+        parseContext.explicitInt16Check($1.loc, "16-bit integer literal");
+        $$ = parseContext.intermediate.addConstantUnion((short)$1.i, $1.loc, true);
+    }
+    | UINT16CONSTANT {
+        parseContext.explicitInt16Check($1.loc, "16-bit unsigned integer literal");
+        $$ = parseContext.intermediate.addConstantUnion((unsigned short)$1.u, $1.loc, true);
+    }
     | FLOATCONSTANT {
         $$ = parseContext.intermediate.addConstantUnion($1.d, EbtFloat, $1.loc, true);
     }
@@ -281,10 +339,8 @@
         $$ = parseContext.intermediate.addConstantUnion($1.d, EbtDouble, $1.loc, true);
     }
     | FLOAT16CONSTANT {
-#ifdef AMD_EXTENSIONS
         parseContext.float16Check($1.loc, "half float literal");
         $$ = parseContext.intermediate.addConstantUnion($1.d, EbtFloat16, $1.loc, true);
-#endif
     }
     | BOOLCONSTANT {
         $$ = parseContext.intermediate.addConstantUnion($1.b, $1.loc, true);
@@ -419,6 +475,11 @@
             $$.function = new TFunction(&empty, TType(EbtVoid), EOpNull);
         }
     }
+    | non_uniform_qualifier {
+        // Constructor
+        $$.intermNode = 0;
+        $$.function = parseContext.handleConstructorCall($1.loc, $1);
+    }
     ;
 
 unary_expression
@@ -639,6 +700,7 @@
     | unary_expression assignment_operator assignment_expression {
         parseContext.arrayObjectCheck($2.loc, $1->getType(), "array assignment");
         parseContext.opaqueCheck($2.loc, $1->getType(), "=");
+        parseContext.storage16BitAssignmentCheck($2.loc, $1->getType(), "=");
         parseContext.specializationCheck($2.loc, $1->getType(), "=");
         parseContext.lValueErrorCheck($2.loc, "assign", $1);
         parseContext.rValueErrorCheck($2.loc, "assign", $3);
@@ -847,6 +909,11 @@
         // Add the function as a prototype after parsing it (we do not support recursion)
         TFunction *function;
         TType type($1);
+
+        // Potentially rename shader entry point function.  No-op most of the time.
+        parseContext.renameShaderFunction($2.string);
+
+        // Make the function
         function = new TFunction($2.string, type);
         $$ = function;
     }
@@ -875,14 +942,16 @@
             parseContext.profileRequires($1.loc, EEsProfile, 300, 0, "arrayed type");
             parseContext.arraySizeRequiredCheck($1.loc, *$1.arraySizes);
         }
-        parseContext.arrayDimCheck($2.loc, $1.arraySizes, $3.arraySizes);
+        TType* type = new TType($1);
+        type->transferArraySizes($3.arraySizes);
+        type->copyArrayInnerSizes($1.arraySizes);
 
+        parseContext.arrayOfArrayVersionCheck($2.loc, type->getArraySizes());
         parseContext.arraySizeRequiredCheck($3.loc, *$3.arraySizes);
         parseContext.reservedErrorCheck($2.loc, *$2.string);
 
-        $1.arraySizes = $3.arraySizes;
+        TParameter param = { $2.string, type };
 
-        TParameter param = { $2.string, new TType($1)};
         $$.loc = $2.loc;
         $$.param = param;
     }
@@ -907,7 +976,7 @@
         $$ = $1;
 
         parseContext.parameterTypeCheck($1.loc, EvqIn, *$1.param.type);
-        parseContext.paramCheckFix($1.loc, EvqTemporary, *$$.param.type);
+        parseContext.paramCheckFixStorage($1.loc, EvqTemporary, *$$.param.type);
         parseContext.precisionQualifierCheck($$.loc, $$.param.type->getBasicType(), $$.param.type->getQualifier());
     }
     //
@@ -927,7 +996,7 @@
         $$ = $1;
 
         parseContext.parameterTypeCheck($1.loc, EvqIn, *$1.param.type);
-        parseContext.paramCheckFix($1.loc, EvqTemporary, *$$.param.type);
+        parseContext.paramCheckFixStorage($1.loc, EvqTemporary, *$$.param.type);
         parseContext.precisionQualifierCheck($$.loc, $$.param.type->getBasicType(), $$.param.type->getQualifier());
     }
     ;
@@ -1016,7 +1085,7 @@
         }
 
         if ($2.arraySizes && parseContext.arrayQualifierError($2.loc, $1.qualifier))
-            $2.arraySizes = 0;
+            $2.arraySizes = nullptr;
 
         parseContext.checkNoShaderLayouts($2.loc, $1.shaderQualifiers);
         $2.shaderQualifiers.merge($1.shaderQualifiers);
@@ -1058,12 +1127,16 @@
     }
     | NOPERSPECTIVE {
         parseContext.globalCheck($1.loc, "noperspective");
+#ifdef NV_EXTENSIONS
+        parseContext.profileRequires($1.loc, EEsProfile, 0, E_GL_NV_shader_noperspective_interpolation, "noperspective");
+#else
         parseContext.requireProfile($1.loc, ~EEsProfile, "noperspective");
+#endif
         parseContext.profileRequires($1.loc, ENoProfile, 130, 0, "noperspective");
         $$.init($1.loc);
         $$.qualifier.nopersp = true;
     }
-    | __EXPLICITINTERPAMD {
+    | EXPLICITINTERPAMD {
 #ifdef AMD_EXTENSIONS
         parseContext.globalCheck($1.loc, "__explicitInterpAMD");
         parseContext.profileRequires($1.loc, ECoreProfile, 450, E_GL_AMD_shader_explicit_vertex_parameter, "explicit interpolation");
@@ -1072,6 +1145,46 @@
         $$.qualifier.explicitInterp = true;
 #endif
     }
+    | PERVERTEXNV {
+#ifdef NV_EXTENSIONS
+        parseContext.globalCheck($1.loc, "pervertexNV");
+        parseContext.profileRequires($1.loc, ECoreProfile, 0, E_GL_NV_fragment_shader_barycentric, "fragment shader barycentric");
+        parseContext.profileRequires($1.loc, ECompatibilityProfile, 0, E_GL_NV_fragment_shader_barycentric, "fragment shader barycentric");
+        parseContext.profileRequires($1.loc, EEsProfile, 0, E_GL_NV_fragment_shader_barycentric, "fragment shader barycentric");
+        $$.init($1.loc);
+        $$.qualifier.pervertexNV = true;
+#endif
+    }
+    | PERPRIMITIVENV {
+#ifdef NV_EXTENSIONS
+        // No need for profile version or extension check. Shader stage already checks both.
+        parseContext.globalCheck($1.loc, "perprimitiveNV");
+        parseContext.requireStage($1.loc, (EShLanguageMask)(EShLangFragmentMask | EShLangMeshNVMask), "perprimitiveNV");
+        // Fragment shader stage doesn't check for extension. So we explicitly add below extension check.
+        if (parseContext.language == EShLangFragment)
+            parseContext.requireExtensions($1.loc, 1, &E_GL_NV_mesh_shader, "perprimitiveNV");
+        $$.init($1.loc);
+        $$.qualifier.perPrimitiveNV = true;
+#endif
+    }
+    | PERVIEWNV {
+#ifdef NV_EXTENSIONS
+        // No need for profile version or extension check. Shader stage already checks both.
+        parseContext.globalCheck($1.loc, "perviewNV");
+        parseContext.requireStage($1.loc, EShLangMeshNV, "perviewNV");
+        $$.init($1.loc);
+        $$.qualifier.perViewNV = true;
+#endif
+    }
+    | PERTASKNV {
+#ifdef NV_EXTENSIONS
+        // No need for profile version or extension check. Shader stage already checks both.
+        parseContext.globalCheck($1.loc, "taskNV");
+        parseContext.requireStage($1.loc, (EShLanguageMask)(EShLangTaskNVMask | EShLangMeshNVMask), "taskNV");
+        $$.init($1.loc);
+        $$.qualifier.perTaskNV = true;
+#endif
+    }
     ;
 
 layout_qualifier
@@ -1152,6 +1265,9 @@
         // allow inheritance of storage qualifier from block declaration
         $$ = $1;
     }
+    | non_uniform_qualifier {
+        $$ = $1;
+    }
     ;
 
 storage_qualifier
@@ -1230,10 +1346,64 @@
         $$.init($1.loc);
         $$.qualifier.storage = EvqBuffer;
     }
+    | HITATTRNV {
+#ifdef NV_EXTENSIONS
+        parseContext.globalCheck($1.loc, "hitAttributeNV");
+        parseContext.requireStage($1.loc, (EShLanguageMask)(EShLangIntersectNVMask | EShLangClosestHitNVMask
+            | EShLangAnyHitNVMask), "hitAttributeNV");
+        parseContext.profileRequires($1.loc, ECoreProfile, 460, E_GL_NV_ray_tracing, "hitAttributeNV");
+        $$.init($1.loc);
+        $$.qualifier.storage = EvqHitAttrNV;
+#endif
+    }
+    | PAYLOADNV {
+#ifdef NV_EXTENSIONS
+        parseContext.globalCheck($1.loc, "rayPayloadNV");
+        parseContext.requireStage($1.loc, (EShLanguageMask)(EShLangRayGenNVMask | EShLangClosestHitNVMask |
+            EShLangAnyHitNVMask | EShLangMissNVMask), "rayPayloadNV");
+        parseContext.profileRequires($1.loc, ECoreProfile, 460, E_GL_NV_ray_tracing, "rayPayloadNV");
+        $$.init($1.loc);
+        $$.qualifier.storage = EvqPayloadNV;
+#endif
+    }
+    | PAYLOADINNV {
+#ifdef NV_EXTENSIONS
+        parseContext.globalCheck($1.loc, "rayPayloadInNV");
+        parseContext.requireStage($1.loc, (EShLanguageMask)(EShLangClosestHitNVMask |
+            EShLangAnyHitNVMask | EShLangMissNVMask), "rayPayloadInNV");
+        parseContext.profileRequires($1.loc, ECoreProfile, 460, E_GL_NV_ray_tracing, "rayPayloadInNV");
+        $$.init($1.loc);
+        $$.qualifier.storage = EvqPayloadInNV;
+#endif
+    }
+    | CALLDATANV {
+#ifdef NV_EXTENSIONS
+        parseContext.globalCheck($1.loc, "callableDataNV");
+        parseContext.requireStage($1.loc, (EShLanguageMask)(EShLangRayGenNVMask |
+            EShLangClosestHitNVMask | EShLangMissNVMask | EShLangCallableNVMask), "callableDataNV");
+        parseContext.profileRequires($1.loc, ECoreProfile, 460, E_GL_NV_ray_tracing, "callableDataNV");
+        $$.init($1.loc);
+        $$.qualifier.storage = EvqCallableDataNV;
+#endif
+    }
+    | CALLDATAINNV {
+#ifdef NV_EXTENSIONS
+        parseContext.globalCheck($1.loc, "callableDataInNV");
+        parseContext.requireStage($1.loc, (EShLanguageMask)(EShLangCallableNVMask), "callableDataInNV");
+        parseContext.profileRequires($1.loc, ECoreProfile, 460, E_GL_NV_ray_tracing, "callableDataInNV");
+        $$.init($1.loc);
+        $$.qualifier.storage = EvqCallableDataInNV;
+#endif
+    }
     | SHARED {
+        parseContext.globalCheck($1.loc, "shared");
         parseContext.profileRequires($1.loc, ECoreProfile | ECompatibilityProfile, 430, E_GL_ARB_compute_shader, "shared");
         parseContext.profileRequires($1.loc, EEsProfile, 310, 0, "shared");
+#ifdef NV_EXTENSIONS
+        parseContext.requireStage($1.loc, (EShLanguageMask)(EShLangComputeMask | EShLangMeshNVMask | EShLangTaskNVMask), "shared");
+#else
         parseContext.requireStage($1.loc, EShLangCompute, "shared");
+#endif
         $$.init($1.loc);
         $$.qualifier.storage = EvqShared;
     }
@@ -1241,6 +1411,31 @@
         $$.init($1.loc);
         $$.qualifier.coherent = true;
     }
+    | DEVICECOHERENT {
+        $$.init($1.loc);
+        parseContext.requireExtensions($1.loc, 1, &E_GL_KHR_memory_scope_semantics, "devicecoherent");
+        $$.qualifier.devicecoherent = true;
+    }
+    | QUEUEFAMILYCOHERENT {
+        $$.init($1.loc);
+        parseContext.requireExtensions($1.loc, 1, &E_GL_KHR_memory_scope_semantics, "queuefamilycoherent");
+        $$.qualifier.queuefamilycoherent = true;
+    }
+    | WORKGROUPCOHERENT {
+        $$.init($1.loc);
+        parseContext.requireExtensions($1.loc, 1, &E_GL_KHR_memory_scope_semantics, "workgroupcoherent");
+        $$.qualifier.workgroupcoherent = true;
+    }
+    | SUBGROUPCOHERENT {
+        $$.init($1.loc);
+        parseContext.requireExtensions($1.loc, 1, &E_GL_KHR_memory_scope_semantics, "subgroupcoherent");
+        $$.qualifier.subgroupcoherent = true;
+    }
+    | NONPRIVATE {
+        $$.init($1.loc);
+        parseContext.requireExtensions($1.loc, 1, &E_GL_KHR_memory_scope_semantics, "nonprivate");
+        $$.qualifier.nonprivate = true;
+    }
     | VOLATILE {
         $$.init($1.loc);
         $$.qualifier.volatil = true;
@@ -1260,25 +1455,32 @@
     | SUBROUTINE {
         parseContext.spvRemoved($1.loc, "subroutine");
         parseContext.globalCheck($1.loc, "subroutine");
+        parseContext.unimplemented($1.loc, "subroutine");
         $$.init($1.loc);
-        $$.qualifier.storage = EvqUniform;
     }
     | SUBROUTINE LEFT_PAREN type_name_list RIGHT_PAREN {
         parseContext.spvRemoved($1.loc, "subroutine");
         parseContext.globalCheck($1.loc, "subroutine");
+        parseContext.unimplemented($1.loc, "subroutine");
         $$.init($1.loc);
-        $$.qualifier.storage = EvqUniform;
-        // TODO: 4.0 semantics: subroutines
-        // 1) make sure each identifier is a type declared earlier with SUBROUTINE
-        // 2) save all of the identifiers for future comparison with the declared function
+    }
+    ;
+
+non_uniform_qualifier
+    : NONUNIFORM {
+        $$.init($1.loc);
+        $$.qualifier.nonUniform = true;
     }
     ;
 
 type_name_list
-    : TYPE_NAME {
-        // TODO: 4.0 functionality: subroutine type to list
+    : IDENTIFIER {
+        // TODO
     }
-    | type_name_list COMMA TYPE_NAME {
+    | type_name_list COMMA IDENTIFIER {
+        // TODO: 4.0 semantics: subroutines
+        // 1) make sure each identifier is a type declared earlier with SUBROUTINE
+        // 2) save all of the identifiers for future comparison with the declared function
     }
     ;
 
@@ -1288,7 +1490,7 @@
         $$.qualifier.precision = parseContext.getDefaultPrecision($$);
     }
     | type_specifier_nonarray array_specifier {
-        parseContext.arrayDimCheck($2.loc, $2.arraySizes, 0);
+        parseContext.arrayOfArrayVersionCheck($2.loc, $2.arraySizes);
         $$ = $1;
         $$.qualifier.precision = parseContext.getDefaultPrecision($$);
         $$.arraySizes = $2.arraySizes;
@@ -1337,11 +1539,19 @@
         $$.basicType = EbtDouble;
     }
     | FLOAT16_T {
-#ifdef AMD_EXTENSIONS
-        parseContext.float16Check($1.loc, "half float", parseContext.symbolTable.atBuiltInLevel());
+        parseContext.float16ScalarVectorCheck($1.loc, "float16_t", parseContext.symbolTable.atBuiltInLevel());
         $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
         $$.basicType = EbtFloat16;
-#endif
+    }
+    | FLOAT32_T {
+        parseContext.explicitFloat32Check($1.loc, "float32_t", parseContext.symbolTable.atBuiltInLevel());
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtFloat;
+    }
+    | FLOAT64_T {
+        parseContext.explicitFloat64Check($1.loc, "float64_t", parseContext.symbolTable.atBuiltInLevel());
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtDouble;
     }
     | INT {
         $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
@@ -1352,6 +1562,36 @@
         $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
         $$.basicType = EbtUint;
     }
+    | INT8_T {
+        parseContext.int8ScalarVectorCheck($1.loc, "8-bit signed integer", parseContext.symbolTable.atBuiltInLevel());
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtInt8;
+    }
+    | UINT8_T {
+        parseContext.int8ScalarVectorCheck($1.loc, "8-bit unsigned integer", parseContext.symbolTable.atBuiltInLevel());
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtUint8;
+    }
+    | INT16_T {
+        parseContext.int16ScalarVectorCheck($1.loc, "16-bit signed integer", parseContext.symbolTable.atBuiltInLevel());
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtInt16;
+    }
+    | UINT16_T {
+        parseContext.int16ScalarVectorCheck($1.loc, "16-bit unsigned integer", parseContext.symbolTable.atBuiltInLevel());
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtUint16;
+    }
+    | INT32_T {
+        parseContext.explicitInt32Check($1.loc, "32-bit signed integer", parseContext.symbolTable.atBuiltInLevel());
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtInt;
+    }
+    | UINT32_T {
+        parseContext.explicitInt32Check($1.loc, "32-bit unsigned integer", parseContext.symbolTable.atBuiltInLevel());
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtUint;
+    }
     | INT64_T {
         parseContext.int64Check($1.loc, "64-bit integer", parseContext.symbolTable.atBuiltInLevel());
         $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
@@ -1400,28 +1640,58 @@
         $$.setVector(4);
     }
     | F16VEC2 {
-#ifdef AMD_EXTENSIONS
-        parseContext.float16Check($1.loc, "half float vector", parseContext.symbolTable.atBuiltInLevel());
+        parseContext.float16ScalarVectorCheck($1.loc, "half float vector", parseContext.symbolTable.atBuiltInLevel());
         $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
         $$.basicType = EbtFloat16;
         $$.setVector(2);
-#endif
     }
     | F16VEC3 {
-#ifdef AMD_EXTENSIONS
-        parseContext.float16Check($1.loc, "half float vector", parseContext.symbolTable.atBuiltInLevel());
+        parseContext.float16ScalarVectorCheck($1.loc, "half float vector", parseContext.symbolTable.atBuiltInLevel());
         $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
         $$.basicType = EbtFloat16;
         $$.setVector(3);
-#endif
     }
     | F16VEC4 {
-#ifdef AMD_EXTENSIONS
-        parseContext.float16Check($1.loc, "half float vector", parseContext.symbolTable.atBuiltInLevel());
+        parseContext.float16ScalarVectorCheck($1.loc, "half float vector", parseContext.symbolTable.atBuiltInLevel());
         $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
         $$.basicType = EbtFloat16;
         $$.setVector(4);
-#endif
+    }
+    | F32VEC2 {
+        parseContext.explicitFloat32Check($1.loc, "float32_t vector", parseContext.symbolTable.atBuiltInLevel());
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtFloat;
+        $$.setVector(2);
+    }
+    | F32VEC3 {
+        parseContext.explicitFloat32Check($1.loc, "float32_t vector", parseContext.symbolTable.atBuiltInLevel());
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtFloat;
+        $$.setVector(3);
+    }
+    | F32VEC4 {
+        parseContext.explicitFloat32Check($1.loc, "float32_t vector", parseContext.symbolTable.atBuiltInLevel());
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtFloat;
+        $$.setVector(4);
+    }
+    | F64VEC2 {
+        parseContext.explicitFloat64Check($1.loc, "float64_t vector", parseContext.symbolTable.atBuiltInLevel());
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtDouble;
+        $$.setVector(2);
+    }
+    | F64VEC3 {
+        parseContext.explicitFloat64Check($1.loc, "float64_t vector", parseContext.symbolTable.atBuiltInLevel());
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtDouble;
+        $$.setVector(3);
+    }
+    | F64VEC4 {
+        parseContext.explicitFloat64Check($1.loc, "float64_t vector", parseContext.symbolTable.atBuiltInLevel());
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtDouble;
+        $$.setVector(4);
     }
     | BVEC2 {
         $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
@@ -1453,6 +1723,60 @@
         $$.basicType = EbtInt;
         $$.setVector(4);
     }
+    | I8VEC2 {
+        parseContext.int8ScalarVectorCheck($1.loc, "8-bit signed integer vector", parseContext.symbolTable.atBuiltInLevel());
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtInt8;
+        $$.setVector(2);
+    }
+    | I8VEC3 {
+        parseContext.int8ScalarVectorCheck($1.loc, "8-bit signed integer vector", parseContext.symbolTable.atBuiltInLevel());
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtInt8;
+        $$.setVector(3);
+    }
+    | I8VEC4 {
+        parseContext.int8ScalarVectorCheck($1.loc, "8-bit signed integer vector", parseContext.symbolTable.atBuiltInLevel());
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtInt8;
+        $$.setVector(4);
+    }
+    | I16VEC2 {
+        parseContext.int16ScalarVectorCheck($1.loc, "16-bit signed integer vector", parseContext.symbolTable.atBuiltInLevel());
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtInt16;
+        $$.setVector(2);
+    }
+    | I16VEC3 {
+        parseContext.int16ScalarVectorCheck($1.loc, "16-bit signed integer vector", parseContext.symbolTable.atBuiltInLevel());
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtInt16;
+        $$.setVector(3);
+    }
+    | I16VEC4 {
+        parseContext.int16ScalarVectorCheck($1.loc, "16-bit signed integer vector", parseContext.symbolTable.atBuiltInLevel());
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtInt16;
+        $$.setVector(4);
+    }
+    | I32VEC2 {
+        parseContext.explicitInt32Check($1.loc, "32-bit signed integer vector", parseContext.symbolTable.atBuiltInLevel());
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtInt;
+        $$.setVector(2);
+    }
+    | I32VEC3 {
+        parseContext.explicitInt32Check($1.loc, "32-bit signed integer vector", parseContext.symbolTable.atBuiltInLevel());
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtInt;
+        $$.setVector(3);
+    }
+    | I32VEC4 {
+        parseContext.explicitInt32Check($1.loc, "32-bit signed integer vector", parseContext.symbolTable.atBuiltInLevel());
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtInt;
+        $$.setVector(4);
+    }
     | I64VEC2 {
         parseContext.int64Check($1.loc, "64-bit integer vector", parseContext.symbolTable.atBuiltInLevel());
         $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
@@ -1489,6 +1813,60 @@
         $$.basicType = EbtUint;
         $$.setVector(4);
     }
+    | U8VEC2 {
+        parseContext.int8ScalarVectorCheck($1.loc, "8-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel());
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtUint8;
+        $$.setVector(2);
+    }
+    | U8VEC3 {
+        parseContext.int8ScalarVectorCheck($1.loc, "8-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel());
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtUint8;
+        $$.setVector(3);
+    }
+    | U8VEC4 {
+        parseContext.int8ScalarVectorCheck($1.loc, "8-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel());
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtUint8;
+        $$.setVector(4);
+    }
+    | U16VEC2 {
+        parseContext.int16ScalarVectorCheck($1.loc, "16-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel());
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtUint16;
+        $$.setVector(2);
+    }
+    | U16VEC3 {
+        parseContext.int16ScalarVectorCheck($1.loc, "16-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel());
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtUint16;
+        $$.setVector(3);
+    }
+    | U16VEC4 {
+        parseContext.int16ScalarVectorCheck($1.loc, "16-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel());
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtUint16;
+        $$.setVector(4);
+    }
+    | U32VEC2 {
+        parseContext.explicitInt32Check($1.loc, "32-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel());
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtUint;
+        $$.setVector(2);
+    }
+    | U32VEC3 {
+        parseContext.explicitInt32Check($1.loc, "32-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel());
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtUint;
+        $$.setVector(3);
+    }
+    | U32VEC4 {
+        parseContext.explicitInt32Check($1.loc, "32-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel());
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtUint;
+        $$.setVector(4);
+    }
     | U64VEC2 {
         parseContext.int64Check($1.loc, "64-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel());
         $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
@@ -1640,99 +2018,225 @@
         $$.setMatrix(4, 4);
     }
     | F16MAT2 {
-#ifdef AMD_EXTENSIONS
         parseContext.float16Check($1.loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel());
         $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
         $$.basicType = EbtFloat16;
         $$.setMatrix(2, 2);
-#endif
     }
     | F16MAT3 {
-#ifdef AMD_EXTENSIONS
         parseContext.float16Check($1.loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel());
         $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
         $$.basicType = EbtFloat16;
         $$.setMatrix(3, 3);
-#endif
     }
     | F16MAT4 {
-#ifdef AMD_EXTENSIONS
         parseContext.float16Check($1.loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel());
         $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
         $$.basicType = EbtFloat16;
         $$.setMatrix(4, 4);
-#endif
     }
     | F16MAT2X2 {
-#ifdef AMD_EXTENSIONS
         parseContext.float16Check($1.loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel());
         $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
         $$.basicType = EbtFloat16;
         $$.setMatrix(2, 2);
-#endif
     }
     | F16MAT2X3 {
-#ifdef AMD_EXTENSIONS
         parseContext.float16Check($1.loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel());
         $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
         $$.basicType = EbtFloat16;
         $$.setMatrix(2, 3);
-#endif
     }
     | F16MAT2X4 {
-#ifdef AMD_EXTENSIONS
         parseContext.float16Check($1.loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel());
         $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
         $$.basicType = EbtFloat16;
         $$.setMatrix(2, 4);
-#endif
     }
     | F16MAT3X2 {
-#ifdef AMD_EXTENSIONS
         parseContext.float16Check($1.loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel());
         $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
         $$.basicType = EbtFloat16;
         $$.setMatrix(3, 2);
-#endif
     }
     | F16MAT3X3 {
-#ifdef AMD_EXTENSIONS
         parseContext.float16Check($1.loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel());
         $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
         $$.basicType = EbtFloat16;
         $$.setMatrix(3, 3);
-#endif
     }
     | F16MAT3X4 {
-#ifdef AMD_EXTENSIONS
         parseContext.float16Check($1.loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel());
         $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
         $$.basicType = EbtFloat16;
         $$.setMatrix(3, 4);
-#endif
     }
     | F16MAT4X2 {
-#ifdef AMD_EXTENSIONS
         parseContext.float16Check($1.loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel());
         $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
         $$.basicType = EbtFloat16;
         $$.setMatrix(4, 2);
-#endif
     }
     | F16MAT4X3 {
-#ifdef AMD_EXTENSIONS
         parseContext.float16Check($1.loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel());
         $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
         $$.basicType = EbtFloat16;
         $$.setMatrix(4, 3);
-#endif
     }
     | F16MAT4X4 {
-#ifdef AMD_EXTENSIONS
         parseContext.float16Check($1.loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel());
         $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
         $$.basicType = EbtFloat16;
         $$.setMatrix(4, 4);
+    }
+    | F32MAT2 {
+        parseContext.explicitFloat32Check($1.loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel());
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtFloat;
+        $$.setMatrix(2, 2);
+    }
+    | F32MAT3 {
+        parseContext.explicitFloat32Check($1.loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel());
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtFloat;
+        $$.setMatrix(3, 3);
+    }
+    | F32MAT4 {
+        parseContext.explicitFloat32Check($1.loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel());
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtFloat;
+        $$.setMatrix(4, 4);
+    }
+    | F32MAT2X2 {
+        parseContext.explicitFloat32Check($1.loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel());
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtFloat;
+        $$.setMatrix(2, 2);
+    }
+    | F32MAT2X3 {
+        parseContext.explicitFloat32Check($1.loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel());
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtFloat;
+        $$.setMatrix(2, 3);
+    }
+    | F32MAT2X4 {
+        parseContext.explicitFloat32Check($1.loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel());
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtFloat;
+        $$.setMatrix(2, 4);
+    }
+    | F32MAT3X2 {
+        parseContext.explicitFloat32Check($1.loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel());
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtFloat;
+        $$.setMatrix(3, 2);
+    }
+    | F32MAT3X3 {
+        parseContext.explicitFloat32Check($1.loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel());
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtFloat;
+        $$.setMatrix(3, 3);
+    }
+    | F32MAT3X4 {
+        parseContext.explicitFloat32Check($1.loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel());
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtFloat;
+        $$.setMatrix(3, 4);
+    }
+    | F32MAT4X2 {
+        parseContext.explicitFloat32Check($1.loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel());
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtFloat;
+        $$.setMatrix(4, 2);
+    }
+    | F32MAT4X3 {
+        parseContext.explicitFloat32Check($1.loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel());
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtFloat;
+        $$.setMatrix(4, 3);
+    }
+    | F32MAT4X4 {
+        parseContext.explicitFloat32Check($1.loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel());
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtFloat;
+        $$.setMatrix(4, 4);
+    }
+    | F64MAT2 {
+        parseContext.explicitFloat64Check($1.loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel());
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtDouble;
+        $$.setMatrix(2, 2);
+    }
+    | F64MAT3 {
+        parseContext.explicitFloat64Check($1.loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel());
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtDouble;
+        $$.setMatrix(3, 3);
+    }
+    | F64MAT4 {
+        parseContext.explicitFloat64Check($1.loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel());
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtDouble;
+        $$.setMatrix(4, 4);
+    }
+    | F64MAT2X2 {
+        parseContext.explicitFloat64Check($1.loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel());
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtDouble;
+        $$.setMatrix(2, 2);
+    }
+    | F64MAT2X3 {
+        parseContext.explicitFloat64Check($1.loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel());
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtDouble;
+        $$.setMatrix(2, 3);
+    }
+    | F64MAT2X4 {
+        parseContext.explicitFloat64Check($1.loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel());
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtDouble;
+        $$.setMatrix(2, 4);
+    }
+    | F64MAT3X2 {
+        parseContext.explicitFloat64Check($1.loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel());
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtDouble;
+        $$.setMatrix(3, 2);
+    }
+    | F64MAT3X3 {
+        parseContext.explicitFloat64Check($1.loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel());
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtDouble;
+        $$.setMatrix(3, 3);
+    }
+    | F64MAT3X4 {
+        parseContext.explicitFloat64Check($1.loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel());
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtDouble;
+        $$.setMatrix(3, 4);
+    }
+    | F64MAT4X2 {
+        parseContext.explicitFloat64Check($1.loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel());
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtDouble;
+        $$.setMatrix(4, 2);
+    }
+    | F64MAT4X3 {
+        parseContext.explicitFloat64Check($1.loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel());
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtDouble;
+        $$.setMatrix(4, 3);
+    }
+    | F64MAT4X4 {
+        parseContext.explicitFloat64Check($1.loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel());
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtDouble;
+        $$.setMatrix(4, 4);
+    }
+    | ACCSTRUCTNV {
+#ifdef NV_EXTENSIONS
+       $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+       $$.basicType = EbtAccStructNV;
 #endif
     }
     | ATOMIC_UINT {
@@ -1805,6 +2309,110 @@
         $$.basicType = EbtSampler;
         $$.sampler.set(EbtFloat, EsdCube, true, true);
     }
+    | F16SAMPLER1D {
+#ifdef AMD_EXTENSIONS
+        parseContext.float16OpaqueCheck($1.loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel());
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtSampler;
+        $$.sampler.set(EbtFloat16, Esd1D);
+#endif
+    }
+    | F16SAMPLER2D {
+#ifdef AMD_EXTENSIONS
+        parseContext.float16OpaqueCheck($1.loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel());
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtSampler;
+        $$.sampler.set(EbtFloat16, Esd2D);
+#endif
+    }
+    | F16SAMPLER3D {
+#ifdef AMD_EXTENSIONS
+        parseContext.float16OpaqueCheck($1.loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel());
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtSampler;
+        $$.sampler.set(EbtFloat16, Esd3D);
+#endif
+    }
+    | F16SAMPLERCUBE {
+#ifdef AMD_EXTENSIONS
+        parseContext.float16OpaqueCheck($1.loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel());
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtSampler;
+        $$.sampler.set(EbtFloat16, EsdCube);
+#endif
+    }
+    | F16SAMPLER1DSHADOW {
+#ifdef AMD_EXTENSIONS
+        parseContext.float16OpaqueCheck($1.loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel());
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtSampler;
+        $$.sampler.set(EbtFloat16, Esd1D, false, true);
+#endif
+    }
+    | F16SAMPLER2DSHADOW {
+#ifdef AMD_EXTENSIONS
+        parseContext.float16OpaqueCheck($1.loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel());
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtSampler;
+        $$.sampler.set(EbtFloat16, Esd2D, false, true);
+#endif
+    }
+    | F16SAMPLERCUBESHADOW {
+#ifdef AMD_EXTENSIONS
+        parseContext.float16OpaqueCheck($1.loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel());
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtSampler;
+        $$.sampler.set(EbtFloat16, EsdCube, false, true);
+#endif
+    }
+    | F16SAMPLER1DARRAY {
+#ifdef AMD_EXTENSIONS
+        parseContext.float16OpaqueCheck($1.loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel());
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtSampler;
+        $$.sampler.set(EbtFloat16, Esd1D, true);
+#endif
+    }
+    | F16SAMPLER2DARRAY {
+#ifdef AMD_EXTENSIONS
+        parseContext.float16OpaqueCheck($1.loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel());
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtSampler;
+        $$.sampler.set(EbtFloat16, Esd2D, true);
+#endif
+    }
+    | F16SAMPLER1DARRAYSHADOW {
+#ifdef AMD_EXTENSIONS
+        parseContext.float16OpaqueCheck($1.loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel());
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtSampler;
+        $$.sampler.set(EbtFloat16, Esd1D, true, true);
+#endif
+    }
+    | F16SAMPLER2DARRAYSHADOW {
+#ifdef AMD_EXTENSIONS
+        parseContext.float16OpaqueCheck($1.loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel());
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtSampler;
+        $$.sampler.set(EbtFloat16, Esd2D, true, true);
+#endif
+    }
+    | F16SAMPLERCUBEARRAY {
+#ifdef AMD_EXTENSIONS
+        parseContext.float16OpaqueCheck($1.loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel());
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtSampler;
+        $$.sampler.set(EbtFloat16, EsdCube, true);
+#endif
+    }
+    | F16SAMPLERCUBEARRAYSHADOW {
+#ifdef AMD_EXTENSIONS
+        parseContext.float16OpaqueCheck($1.loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel());
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtSampler;
+        $$.sampler.set(EbtFloat16, EsdCube, true, true);
+#endif
+    }
     | ISAMPLER1D {
         $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
         $$.basicType = EbtSampler;
@@ -1885,6 +2493,22 @@
         $$.basicType = EbtSampler;
         $$.sampler.set(EbtFloat, EsdRect, false, true);
     }
+    | F16SAMPLER2DRECT {
+#ifdef AMD_EXTENSIONS
+        parseContext.float16OpaqueCheck($1.loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel());
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtSampler;
+        $$.sampler.set(EbtFloat16, EsdRect);
+#endif
+    }
+    | F16SAMPLER2DRECTSHADOW {
+#ifdef AMD_EXTENSIONS
+        parseContext.float16OpaqueCheck($1.loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel());
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtSampler;
+        $$.sampler.set(EbtFloat16, EsdRect, false, true);
+#endif
+    }
     | ISAMPLER2DRECT {
         $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
         $$.basicType = EbtSampler;
@@ -1900,6 +2524,14 @@
         $$.basicType = EbtSampler;
         $$.sampler.set(EbtFloat, EsdBuffer);
     }
+    | F16SAMPLERBUFFER {
+#ifdef AMD_EXTENSIONS
+        parseContext.float16OpaqueCheck($1.loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel());
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtSampler;
+        $$.sampler.set(EbtFloat16, EsdBuffer);
+#endif
+    }
     | ISAMPLERBUFFER {
         $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
         $$.basicType = EbtSampler;
@@ -1915,6 +2547,14 @@
         $$.basicType = EbtSampler;
         $$.sampler.set(EbtFloat, Esd2D, false, false, true);
     }
+    | F16SAMPLER2DMS {
+#ifdef AMD_EXTENSIONS
+        parseContext.float16OpaqueCheck($1.loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel());
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtSampler;
+        $$.sampler.set(EbtFloat16, Esd2D, false, false, true);
+#endif
+    }
     | ISAMPLER2DMS {
         $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
         $$.basicType = EbtSampler;
@@ -1930,6 +2570,14 @@
         $$.basicType = EbtSampler;
         $$.sampler.set(EbtFloat, Esd2D, true, false, true);
     }
+    | F16SAMPLER2DMSARRAY {
+#ifdef AMD_EXTENSIONS
+        parseContext.float16OpaqueCheck($1.loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel());
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtSampler;
+        $$.sampler.set(EbtFloat16, Esd2D, true, false, true);
+#endif
+    }
     | ISAMPLER2DMSARRAY {
         $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
         $$.basicType = EbtSampler;
@@ -1955,36 +2603,92 @@
         $$.basicType = EbtSampler;
         $$.sampler.setTexture(EbtFloat, Esd1D);
     }
+    | F16TEXTURE1D {
+#ifdef AMD_EXTENSIONS
+        parseContext.float16OpaqueCheck($1.loc, "half float texture", parseContext.symbolTable.atBuiltInLevel());
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtSampler;
+        $$.sampler.setTexture(EbtFloat16, Esd1D);
+#endif
+    }
     | TEXTURE2D {
         $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
         $$.basicType = EbtSampler;
         $$.sampler.setTexture(EbtFloat, Esd2D);
     }
+    | F16TEXTURE2D {
+#ifdef AMD_EXTENSIONS
+        parseContext.float16OpaqueCheck($1.loc, "half float texture", parseContext.symbolTable.atBuiltInLevel());
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtSampler;
+        $$.sampler.setTexture(EbtFloat16, Esd2D);
+#endif
+    }
     | TEXTURE3D {
         $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
         $$.basicType = EbtSampler;
         $$.sampler.setTexture(EbtFloat, Esd3D);
     }
+    | F16TEXTURE3D {
+#ifdef AMD_EXTENSIONS
+        parseContext.float16OpaqueCheck($1.loc, "half float texture", parseContext.symbolTable.atBuiltInLevel());
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtSampler;
+        $$.sampler.setTexture(EbtFloat16, Esd3D);
+#endif
+    }
     | TEXTURECUBE {
         $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
         $$.basicType = EbtSampler;
         $$.sampler.setTexture(EbtFloat, EsdCube);
     }
+    | F16TEXTURECUBE {
+#ifdef AMD_EXTENSIONS
+        parseContext.float16OpaqueCheck($1.loc, "half float texture", parseContext.symbolTable.atBuiltInLevel());
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtSampler;
+        $$.sampler.setTexture(EbtFloat16, EsdCube);
+#endif
+    }
     | TEXTURE1DARRAY {
         $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
         $$.basicType = EbtSampler;
         $$.sampler.setTexture(EbtFloat, Esd1D, true);
     }
+    | F16TEXTURE1DARRAY {
+#ifdef AMD_EXTENSIONS
+        parseContext.float16OpaqueCheck($1.loc, "half float texture", parseContext.symbolTable.atBuiltInLevel());
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtSampler;
+        $$.sampler.setTexture(EbtFloat16, Esd1D, true);
+#endif
+    }
     | TEXTURE2DARRAY {
         $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
         $$.basicType = EbtSampler;
         $$.sampler.setTexture(EbtFloat, Esd2D, true);
     }
+    | F16TEXTURE2DARRAY {
+#ifdef AMD_EXTENSIONS
+        parseContext.float16OpaqueCheck($1.loc, "half float texture", parseContext.symbolTable.atBuiltInLevel());
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtSampler;
+        $$.sampler.setTexture(EbtFloat16, Esd2D, true);
+#endif
+    }
     | TEXTURECUBEARRAY {
         $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
         $$.basicType = EbtSampler;
         $$.sampler.setTexture(EbtFloat, EsdCube, true);
     }
+    | F16TEXTURECUBEARRAY {
+#ifdef AMD_EXTENSIONS
+        parseContext.float16OpaqueCheck($1.loc, "half float texture", parseContext.symbolTable.atBuiltInLevel());
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtSampler;
+        $$.sampler.setTexture(EbtFloat16, EsdCube, true);
+#endif
+    }
     | ITEXTURE1D {
         $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
         $$.basicType = EbtSampler;
@@ -2060,6 +2764,14 @@
         $$.basicType = EbtSampler;
         $$.sampler.setTexture(EbtFloat, EsdRect);
     }
+    | F16TEXTURE2DRECT {
+#ifdef AMD_EXTENSIONS
+        parseContext.float16OpaqueCheck($1.loc, "half float texture", parseContext.symbolTable.atBuiltInLevel());
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtSampler;
+        $$.sampler.setTexture(EbtFloat16, EsdRect);
+#endif
+    }
     | ITEXTURE2DRECT {
         $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
         $$.basicType = EbtSampler;
@@ -2075,6 +2787,14 @@
         $$.basicType = EbtSampler;
         $$.sampler.setTexture(EbtFloat, EsdBuffer);
     }
+    | F16TEXTUREBUFFER {
+#ifdef AMD_EXTENSIONS
+        parseContext.float16OpaqueCheck($1.loc, "half float texture", parseContext.symbolTable.atBuiltInLevel());
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtSampler;
+        $$.sampler.setTexture(EbtFloat16, EsdBuffer);
+#endif
+    }
     | ITEXTUREBUFFER {
         $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
         $$.basicType = EbtSampler;
@@ -2090,6 +2810,14 @@
         $$.basicType = EbtSampler;
         $$.sampler.setTexture(EbtFloat, Esd2D, false, false, true);
     }
+    | F16TEXTURE2DMS {
+#ifdef AMD_EXTENSIONS
+        parseContext.float16OpaqueCheck($1.loc, "half float texture", parseContext.symbolTable.atBuiltInLevel());
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtSampler;
+        $$.sampler.setTexture(EbtFloat16, Esd2D, false, false, true);
+#endif
+    }
     | ITEXTURE2DMS {
         $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
         $$.basicType = EbtSampler;
@@ -2105,6 +2833,14 @@
         $$.basicType = EbtSampler;
         $$.sampler.setTexture(EbtFloat, Esd2D, true, false, true);
     }
+    | F16TEXTURE2DMSARRAY {
+#ifdef AMD_EXTENSIONS
+        parseContext.float16OpaqueCheck($1.loc, "half float texture", parseContext.symbolTable.atBuiltInLevel());
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtSampler;
+        $$.sampler.setTexture(EbtFloat16, Esd2D, true, false, true);
+#endif
+    }
     | ITEXTURE2DMSARRAY {
         $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
         $$.basicType = EbtSampler;
@@ -2120,6 +2856,14 @@
         $$.basicType = EbtSampler;
         $$.sampler.setImage(EbtFloat, Esd1D);
     }
+    | F16IMAGE1D {
+#ifdef AMD_EXTENSIONS
+        parseContext.float16OpaqueCheck($1.loc, "half float image", parseContext.symbolTable.atBuiltInLevel());
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtSampler;
+        $$.sampler.setImage(EbtFloat16, Esd1D);
+#endif
+    }
     | IIMAGE1D {
         $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
         $$.basicType = EbtSampler;
@@ -2135,6 +2879,14 @@
         $$.basicType = EbtSampler;
         $$.sampler.setImage(EbtFloat, Esd2D);
     }
+    | F16IMAGE2D {
+#ifdef AMD_EXTENSIONS
+        parseContext.float16OpaqueCheck($1.loc, "half float image", parseContext.symbolTable.atBuiltInLevel());
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtSampler;
+        $$.sampler.setImage(EbtFloat16, Esd2D);
+#endif
+    }
     | IIMAGE2D {
         $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
         $$.basicType = EbtSampler;
@@ -2150,6 +2902,14 @@
         $$.basicType = EbtSampler;
         $$.sampler.setImage(EbtFloat, Esd3D);
     }
+    | F16IMAGE3D {
+#ifdef AMD_EXTENSIONS
+        parseContext.float16OpaqueCheck($1.loc, "half float image", parseContext.symbolTable.atBuiltInLevel());
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtSampler;
+        $$.sampler.setImage(EbtFloat16, Esd3D);
+#endif
+    }
     | IIMAGE3D {
         $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
         $$.basicType = EbtSampler;
@@ -2165,6 +2925,14 @@
         $$.basicType = EbtSampler;
         $$.sampler.setImage(EbtFloat, EsdRect);
     }
+    | F16IMAGE2DRECT {
+#ifdef AMD_EXTENSIONS
+        parseContext.float16OpaqueCheck($1.loc, "half float image", parseContext.symbolTable.atBuiltInLevel());
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtSampler;
+        $$.sampler.setImage(EbtFloat16, EsdRect);
+#endif
+    }
     | IIMAGE2DRECT {
         $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
         $$.basicType = EbtSampler;
@@ -2180,6 +2948,14 @@
         $$.basicType = EbtSampler;
         $$.sampler.setImage(EbtFloat, EsdCube);
     }
+    | F16IMAGECUBE {
+#ifdef AMD_EXTENSIONS
+        parseContext.float16OpaqueCheck($1.loc, "half float image", parseContext.symbolTable.atBuiltInLevel());
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtSampler;
+        $$.sampler.setImage(EbtFloat16, EsdCube);
+#endif
+    }
     | IIMAGECUBE {
         $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
         $$.basicType = EbtSampler;
@@ -2195,6 +2971,14 @@
         $$.basicType = EbtSampler;
         $$.sampler.setImage(EbtFloat, EsdBuffer);
     }
+    | F16IMAGEBUFFER {
+#ifdef AMD_EXTENSIONS
+        parseContext.float16OpaqueCheck($1.loc, "half float image", parseContext.symbolTable.atBuiltInLevel());
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtSampler;
+        $$.sampler.setImage(EbtFloat16, EsdBuffer);
+#endif
+    }
     | IIMAGEBUFFER {
         $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
         $$.basicType = EbtSampler;
@@ -2210,6 +2994,14 @@
         $$.basicType = EbtSampler;
         $$.sampler.setImage(EbtFloat, Esd1D, true);
     }
+    | F16IMAGE1DARRAY {
+#ifdef AMD_EXTENSIONS
+        parseContext.float16OpaqueCheck($1.loc, "half float image", parseContext.symbolTable.atBuiltInLevel());
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtSampler;
+        $$.sampler.setImage(EbtFloat16, Esd1D, true);
+#endif
+    }
     | IIMAGE1DARRAY {
         $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
         $$.basicType = EbtSampler;
@@ -2225,6 +3017,14 @@
         $$.basicType = EbtSampler;
         $$.sampler.setImage(EbtFloat, Esd2D, true);
     }
+    | F16IMAGE2DARRAY {
+#ifdef AMD_EXTENSIONS
+        parseContext.float16OpaqueCheck($1.loc, "half float image", parseContext.symbolTable.atBuiltInLevel());
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtSampler;
+        $$.sampler.setImage(EbtFloat16, Esd2D, true);
+#endif
+    }
     | IIMAGE2DARRAY {
         $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
         $$.basicType = EbtSampler;
@@ -2240,6 +3040,14 @@
         $$.basicType = EbtSampler;
         $$.sampler.setImage(EbtFloat, EsdCube, true);
     }
+    | F16IMAGECUBEARRAY {
+#ifdef AMD_EXTENSIONS
+        parseContext.float16OpaqueCheck($1.loc, "half float image", parseContext.symbolTable.atBuiltInLevel());
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtSampler;
+        $$.sampler.setImage(EbtFloat16, EsdCube, true);
+#endif
+    }
     | IIMAGECUBEARRAY {
         $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
         $$.basicType = EbtSampler;
@@ -2255,6 +3063,14 @@
         $$.basicType = EbtSampler;
         $$.sampler.setImage(EbtFloat, Esd2D, false, false, true);
     }
+    | F16IMAGE2DMS {
+#ifdef AMD_EXTENSIONS
+        parseContext.float16OpaqueCheck($1.loc, "half float image", parseContext.symbolTable.atBuiltInLevel());
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtSampler;
+        $$.sampler.setImage(EbtFloat16, Esd2D, false, false, true);
+#endif
+    }
     | IIMAGE2DMS {
         $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
         $$.basicType = EbtSampler;
@@ -2270,6 +3086,14 @@
         $$.basicType = EbtSampler;
         $$.sampler.setImage(EbtFloat, Esd2D, true, false, true);
     }
+    | F16IMAGE2DMSARRAY {
+#ifdef AMD_EXTENSIONS
+        parseContext.float16OpaqueCheck($1.loc, "half float image", parseContext.symbolTable.atBuiltInLevel());
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtSampler;
+        $$.sampler.setImage(EbtFloat16, Esd2D, true, false, true);
+#endif
+    }
     | IIMAGE2DMSARRAY {
         $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
         $$.basicType = EbtSampler;
@@ -2298,6 +3122,24 @@
         $$.basicType = EbtSampler;
         $$.sampler.setSubpass(EbtFloat, true);
     }
+    | F16SUBPASSINPUT {
+#ifdef AMD_EXTENSIONS
+        parseContext.float16OpaqueCheck($1.loc, "half float subpass input", parseContext.symbolTable.atBuiltInLevel());
+        parseContext.requireStage($1.loc, EShLangFragment, "subpass input");
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtSampler;
+        $$.sampler.setSubpass(EbtFloat16);
+#endif
+    }
+    | F16SUBPASSINPUTMS {
+#ifdef AMD_EXTENSIONS
+        parseContext.float16OpaqueCheck($1.loc, "half float subpass input", parseContext.symbolTable.atBuiltInLevel());
+        parseContext.requireStage($1.loc, EShLangFragment, "subpass input");
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtSampler;
+        $$.sampler.setSubpass(EbtFloat16, true);
+#endif
+    }
     | ISUBPASSINPUT {
         parseContext.requireStage($1.loc, EShLangFragment, "subpass input");
         $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
@@ -2412,12 +3254,15 @@
         parseContext.precisionQualifierCheck($1.loc, $1.basicType, $1.qualifier);
 
         for (unsigned int i = 0; i < $$->size(); ++i) {
-            parseContext.arrayDimCheck($1.loc, (*$$)[i].type, $1.arraySizes);
-            (*$$)[i].type->mergeType($1);
+            TType type($1);
+            type.setFieldName((*$$)[i].type->getFieldName());
+            type.transferArraySizes((*$$)[i].type->getArraySizes());
+            type.copyArrayInnerSizes($1.arraySizes);
+            parseContext.arrayOfArrayVersionCheck((*$$)[i].loc, type.getArraySizes());
+            (*$$)[i].type->shallowCopy(type);
         }
     }
     | type_qualifier type_specifier struct_declarator_list SEMICOLON {
-        parseContext.globalQualifierFixCheck($1.loc, $1.qualifier);
         if ($2.arraySizes) {
             parseContext.profileRequires($2.loc, ENoProfile, 120, E_GL_3DL_array_objects, "arrayed type");
             parseContext.profileRequires($2.loc, EEsProfile, 300, 0, "arrayed type");
@@ -2427,14 +3272,18 @@
 
         $$ = $3;
 
-        parseContext.checkNoShaderLayouts($1.loc, $1.shaderQualifiers);
+        parseContext.memberQualifierCheck($1);
         parseContext.voidErrorCheck($2.loc, (*$3)[0].type->getFieldName(), $2.basicType);
         parseContext.mergeQualifiers($2.loc, $2.qualifier, $1.qualifier, true);
         parseContext.precisionQualifierCheck($2.loc, $2.basicType, $2.qualifier);
 
         for (unsigned int i = 0; i < $$->size(); ++i) {
-            parseContext.arrayDimCheck($1.loc, (*$$)[i].type, $2.arraySizes);
-            (*$$)[i].type->mergeType($2);
+            TType type($2);
+            type.setFieldName((*$$)[i].type->getFieldName());
+            type.transferArraySizes((*$$)[i].type->getArraySizes());
+            type.copyArrayInnerSizes($2.arraySizes);
+            parseContext.arrayOfArrayVersionCheck((*$$)[i].loc, type.getArraySizes());
+            (*$$)[i].type->shallowCopy(type);
         }
     }
     ;
@@ -2456,12 +3305,12 @@
         $$.type->setFieldName(*$1.string);
     }
     | IDENTIFIER array_specifier {
-        parseContext.arrayDimCheck($1.loc, $2.arraySizes, 0);
+        parseContext.arrayOfArrayVersionCheck($1.loc, $2.arraySizes);
 
         $$.type = new TType(EbtVoid);
         $$.loc = $1.loc;
         $$.type->setFieldName(*$1.string);
-        $$.type->newArraySizes(*$2.arraySizes);
+        $$.type->transferArraySizes($2.arraySizes);
     }
     ;
 
@@ -2592,6 +3441,15 @@
     ;
 
 selection_statement
+    : selection_statement_nonattributed {
+        $$ = $1;
+    }
+    | attribute selection_statement_nonattributed {
+        parseContext.handleSelectionAttributes(*$1, $2);
+        $$ = $2;
+    }
+
+selection_statement_nonattributed
     : IF LEFT_PAREN expression RIGHT_PAREN selection_rest_statement {
         parseContext.boolCheck($1.loc, $3);
         $$ = parseContext.intermediate.addSelection($3, $5, $1.loc);
@@ -2628,6 +3486,15 @@
     ;
 
 switch_statement
+    : switch_statement_nonattributed {
+        $$ = $1;
+    }
+    | attribute switch_statement_nonattributed {
+        parseContext.handleSwitchAttributes(*$1, $2);
+        $$ = $2;
+    }
+
+switch_statement_nonattributed
     : SWITCH LEFT_PAREN expression RIGHT_PAREN {
         // start new switch sequence on the switch stack
         ++parseContext.controlFlowNestingLevel;
@@ -2681,6 +3548,15 @@
     ;
 
 iteration_statement
+    : iteration_statement_nonattributed {
+        $$ = $1;
+    }
+    | attribute iteration_statement_nonattributed {
+        parseContext.handleLoopAttributes(*$1, $2);
+        $$ = $2;
+    }
+
+iteration_statement_nonattributed
     : WHILE LEFT_PAREN {
         if (! parseContext.limits.whileLoops)
             parseContext.error($1.loc, "while loops not available", "limitation", "");
@@ -2777,7 +3653,7 @@
         if (parseContext.currentFunctionType->getBasicType() != EbtVoid)
             parseContext.error($1.loc, "non-void function must return a value", "return", "");
         if (parseContext.inMain)
-            parseContext.postMainReturn = true;
+            parseContext.postEntryPointReturn = true;
     }
     | RETURN expression SEMICOLON {
         $$ = parseContext.handleReturnValue($1.loc, $2);
@@ -2796,8 +3672,10 @@
         parseContext.intermediate.setTreeRoot($$);
     }
     | translation_unit external_declaration {
-        $$ = parseContext.intermediate.growAggregate($1, $2);
-        parseContext.intermediate.setTreeRoot($$);
+        if ($2 != nullptr) {
+            $$ = parseContext.intermediate.growAggregate($1, $2);
+            parseContext.intermediate.setTreeRoot($$);
+        }
     }
     ;
 
@@ -2808,6 +3686,11 @@
     | declaration {
         $$ = $1;
     }
+    | SEMICOLON {
+        parseContext.requireProfile($1.loc, ~EEsProfile, "extraneous semicolon");
+        parseContext.profileRequires($1.loc, ~EEsProfile, 460, nullptr, "extraneous semicolon");
+        $$ = nullptr;
+    }
     ;
 
 function_definition
@@ -2828,8 +3711,30 @@
         // information. This information can be queried from the parse tree
         $$->getAsAggregate()->setOptimize(parseContext.contextPragma.optimize);
         $$->getAsAggregate()->setDebug(parseContext.contextPragma.debug);
-        $$->getAsAggregate()->addToPragmaTable(parseContext.contextPragma.pragmaTable);
+        $$->getAsAggregate()->setPragmaTable(parseContext.contextPragma.pragmaTable);
     }
     ;
 
+attribute
+    : LEFT_BRACKET LEFT_BRACKET attribute_list RIGHT_BRACKET RIGHT_BRACKET {
+        $$ = $3;
+        parseContext.requireExtensions($1.loc, 1, &E_GL_EXT_control_flow_attributes, "attribute");
+    }
+
+attribute_list
+    : single_attribute {
+        $$ = $1;
+    }
+    | attribute_list COMMA single_attribute {
+        $$ = parseContext.mergeAttributes($1, $3);
+    }
+
+single_attribute
+    : IDENTIFIER {
+        $$ = parseContext.makeAttributes(*$1.string);
+    }
+    | IDENTIFIER LEFT_PAREN constant_expression RIGHT_PAREN {
+        $$ = parseContext.makeAttributes(*$1.string, $3);
+    }
+
 %%
diff --git a/glslang/MachineIndependent/glslang_tab.cpp b/glslang/MachineIndependent/glslang_tab.cpp
index b83e34b..e57edb5 100644
--- a/glslang/MachineIndependent/glslang_tab.cpp
+++ b/glslang/MachineIndependent/glslang_tab.cpp
@@ -62,7 +62,7 @@
 
 
 /* Copy the first part of user declarations.  */
-#line 41 "MachineIndependent/glslang.y" /* yacc.c:339  */
+#line 42 "MachineIndependent/glslang.y" /* yacc.c:339  */
 
 
 /* Based on:
@@ -83,11 +83,12 @@
 #include "SymbolTable.h"
 #include "ParseHelper.h"
 #include "../Public/ShaderLang.h"
+#include "attribute.h"
 
 using namespace glslang;
 
 
-#line 91 "MachineIndependent/glslang_tab.cpp" /* yacc.c:339  */
+#line 92 "MachineIndependent/glslang_tab.cpp" /* yacc.c:339  */
 
 # ifndef YY_NULLPTR
 #  if defined __cplusplus && 201103L <= __cplusplus
@@ -124,289 +125,407 @@
   {
     ATTRIBUTE = 258,
     VARYING = 259,
-    CONST = 260,
-    BOOL = 261,
-    FLOAT = 262,
+    FLOAT16_T = 260,
+    FLOAT = 261,
+    FLOAT32_T = 262,
     DOUBLE = 263,
-    INT = 264,
-    UINT = 265,
-    INT64_T = 266,
-    UINT64_T = 267,
-    FLOAT16_T = 268,
-    BREAK = 269,
-    CONTINUE = 270,
-    DO = 271,
-    ELSE = 272,
-    FOR = 273,
-    IF = 274,
-    DISCARD = 275,
-    RETURN = 276,
-    SWITCH = 277,
-    CASE = 278,
-    DEFAULT = 279,
-    SUBROUTINE = 280,
-    BVEC2 = 281,
-    BVEC3 = 282,
-    BVEC4 = 283,
-    IVEC2 = 284,
-    IVEC3 = 285,
-    IVEC4 = 286,
-    I64VEC2 = 287,
-    I64VEC3 = 288,
-    I64VEC4 = 289,
-    UVEC2 = 290,
-    UVEC3 = 291,
-    UVEC4 = 292,
-    U64VEC2 = 293,
-    U64VEC3 = 294,
-    U64VEC4 = 295,
-    VEC2 = 296,
-    VEC3 = 297,
-    VEC4 = 298,
-    MAT2 = 299,
-    MAT3 = 300,
-    MAT4 = 301,
-    CENTROID = 302,
-    IN = 303,
-    OUT = 304,
-    INOUT = 305,
-    UNIFORM = 306,
-    PATCH = 307,
-    SAMPLE = 308,
-    BUFFER = 309,
-    SHARED = 310,
-    COHERENT = 311,
-    VOLATILE = 312,
-    RESTRICT = 313,
-    READONLY = 314,
-    WRITEONLY = 315,
-    DVEC2 = 316,
-    DVEC3 = 317,
-    DVEC4 = 318,
-    DMAT2 = 319,
-    DMAT3 = 320,
-    DMAT4 = 321,
-    F16VEC2 = 322,
-    F16VEC3 = 323,
-    F16VEC4 = 324,
-    F16MAT2 = 325,
-    F16MAT3 = 326,
-    F16MAT4 = 327,
-    NOPERSPECTIVE = 328,
-    FLAT = 329,
-    SMOOTH = 330,
-    LAYOUT = 331,
-    __EXPLICITINTERPAMD = 332,
-    MAT2X2 = 333,
-    MAT2X3 = 334,
-    MAT2X4 = 335,
-    MAT3X2 = 336,
-    MAT3X3 = 337,
-    MAT3X4 = 338,
-    MAT4X2 = 339,
-    MAT4X3 = 340,
-    MAT4X4 = 341,
-    DMAT2X2 = 342,
-    DMAT2X3 = 343,
-    DMAT2X4 = 344,
-    DMAT3X2 = 345,
-    DMAT3X3 = 346,
-    DMAT3X4 = 347,
-    DMAT4X2 = 348,
-    DMAT4X3 = 349,
-    DMAT4X4 = 350,
-    F16MAT2X2 = 351,
-    F16MAT2X3 = 352,
-    F16MAT2X4 = 353,
-    F16MAT3X2 = 354,
-    F16MAT3X3 = 355,
-    F16MAT3X4 = 356,
-    F16MAT4X2 = 357,
-    F16MAT4X3 = 358,
-    F16MAT4X4 = 359,
-    ATOMIC_UINT = 360,
-    SAMPLER1D = 361,
-    SAMPLER2D = 362,
-    SAMPLER3D = 363,
-    SAMPLERCUBE = 364,
-    SAMPLER1DSHADOW = 365,
-    SAMPLER2DSHADOW = 366,
-    SAMPLERCUBESHADOW = 367,
-    SAMPLER1DARRAY = 368,
-    SAMPLER2DARRAY = 369,
-    SAMPLER1DARRAYSHADOW = 370,
-    SAMPLER2DARRAYSHADOW = 371,
-    ISAMPLER1D = 372,
-    ISAMPLER2D = 373,
-    ISAMPLER3D = 374,
-    ISAMPLERCUBE = 375,
-    ISAMPLER1DARRAY = 376,
-    ISAMPLER2DARRAY = 377,
-    USAMPLER1D = 378,
-    USAMPLER2D = 379,
-    USAMPLER3D = 380,
-    USAMPLERCUBE = 381,
-    USAMPLER1DARRAY = 382,
-    USAMPLER2DARRAY = 383,
-    SAMPLER2DRECT = 384,
-    SAMPLER2DRECTSHADOW = 385,
-    ISAMPLER2DRECT = 386,
-    USAMPLER2DRECT = 387,
-    SAMPLERBUFFER = 388,
-    ISAMPLERBUFFER = 389,
-    USAMPLERBUFFER = 390,
-    SAMPLERCUBEARRAY = 391,
-    SAMPLERCUBEARRAYSHADOW = 392,
-    ISAMPLERCUBEARRAY = 393,
-    USAMPLERCUBEARRAY = 394,
-    SAMPLER2DMS = 395,
-    ISAMPLER2DMS = 396,
-    USAMPLER2DMS = 397,
-    SAMPLER2DMSARRAY = 398,
-    ISAMPLER2DMSARRAY = 399,
-    USAMPLER2DMSARRAY = 400,
-    SAMPLEREXTERNALOES = 401,
-    SAMPLER = 402,
-    SAMPLERSHADOW = 403,
-    TEXTURE1D = 404,
-    TEXTURE2D = 405,
-    TEXTURE3D = 406,
-    TEXTURECUBE = 407,
-    TEXTURE1DARRAY = 408,
-    TEXTURE2DARRAY = 409,
-    ITEXTURE1D = 410,
-    ITEXTURE2D = 411,
-    ITEXTURE3D = 412,
-    ITEXTURECUBE = 413,
-    ITEXTURE1DARRAY = 414,
-    ITEXTURE2DARRAY = 415,
-    UTEXTURE1D = 416,
-    UTEXTURE2D = 417,
-    UTEXTURE3D = 418,
-    UTEXTURECUBE = 419,
-    UTEXTURE1DARRAY = 420,
-    UTEXTURE2DARRAY = 421,
-    TEXTURE2DRECT = 422,
-    ITEXTURE2DRECT = 423,
-    UTEXTURE2DRECT = 424,
-    TEXTUREBUFFER = 425,
-    ITEXTUREBUFFER = 426,
-    UTEXTUREBUFFER = 427,
-    TEXTURECUBEARRAY = 428,
-    ITEXTURECUBEARRAY = 429,
-    UTEXTURECUBEARRAY = 430,
-    TEXTURE2DMS = 431,
-    ITEXTURE2DMS = 432,
-    UTEXTURE2DMS = 433,
-    TEXTURE2DMSARRAY = 434,
-    ITEXTURE2DMSARRAY = 435,
-    UTEXTURE2DMSARRAY = 436,
-    SUBPASSINPUT = 437,
-    SUBPASSINPUTMS = 438,
-    ISUBPASSINPUT = 439,
-    ISUBPASSINPUTMS = 440,
-    USUBPASSINPUT = 441,
-    USUBPASSINPUTMS = 442,
-    IMAGE1D = 443,
-    IIMAGE1D = 444,
-    UIMAGE1D = 445,
-    IMAGE2D = 446,
-    IIMAGE2D = 447,
-    UIMAGE2D = 448,
-    IMAGE3D = 449,
-    IIMAGE3D = 450,
-    UIMAGE3D = 451,
-    IMAGE2DRECT = 452,
-    IIMAGE2DRECT = 453,
-    UIMAGE2DRECT = 454,
-    IMAGECUBE = 455,
-    IIMAGECUBE = 456,
-    UIMAGECUBE = 457,
-    IMAGEBUFFER = 458,
-    IIMAGEBUFFER = 459,
-    UIMAGEBUFFER = 460,
-    IMAGE1DARRAY = 461,
-    IIMAGE1DARRAY = 462,
-    UIMAGE1DARRAY = 463,
-    IMAGE2DARRAY = 464,
-    IIMAGE2DARRAY = 465,
-    UIMAGE2DARRAY = 466,
-    IMAGECUBEARRAY = 467,
-    IIMAGECUBEARRAY = 468,
-    UIMAGECUBEARRAY = 469,
-    IMAGE2DMS = 470,
-    IIMAGE2DMS = 471,
-    UIMAGE2DMS = 472,
-    IMAGE2DMSARRAY = 473,
-    IIMAGE2DMSARRAY = 474,
-    UIMAGE2DMSARRAY = 475,
-    STRUCT = 476,
-    VOID = 477,
-    WHILE = 478,
-    IDENTIFIER = 479,
-    TYPE_NAME = 480,
-    FLOATCONSTANT = 481,
-    DOUBLECONSTANT = 482,
-    INTCONSTANT = 483,
-    UINTCONSTANT = 484,
-    INT64CONSTANT = 485,
-    UINT64CONSTANT = 486,
-    BOOLCONSTANT = 487,
-    FLOAT16CONSTANT = 488,
-    LEFT_OP = 489,
-    RIGHT_OP = 490,
-    INC_OP = 491,
-    DEC_OP = 492,
-    LE_OP = 493,
-    GE_OP = 494,
-    EQ_OP = 495,
-    NE_OP = 496,
-    AND_OP = 497,
-    OR_OP = 498,
-    XOR_OP = 499,
-    MUL_ASSIGN = 500,
-    DIV_ASSIGN = 501,
-    ADD_ASSIGN = 502,
-    MOD_ASSIGN = 503,
-    LEFT_ASSIGN = 504,
-    RIGHT_ASSIGN = 505,
-    AND_ASSIGN = 506,
-    XOR_ASSIGN = 507,
-    OR_ASSIGN = 508,
-    SUB_ASSIGN = 509,
-    LEFT_PAREN = 510,
-    RIGHT_PAREN = 511,
-    LEFT_BRACKET = 512,
-    RIGHT_BRACKET = 513,
-    LEFT_BRACE = 514,
-    RIGHT_BRACE = 515,
-    DOT = 516,
-    COMMA = 517,
-    COLON = 518,
-    EQUAL = 519,
-    SEMICOLON = 520,
-    BANG = 521,
-    DASH = 522,
-    TILDE = 523,
-    PLUS = 524,
-    STAR = 525,
-    SLASH = 526,
-    PERCENT = 527,
-    LEFT_ANGLE = 528,
-    RIGHT_ANGLE = 529,
-    VERTICAL_BAR = 530,
-    CARET = 531,
-    AMPERSAND = 532,
-    QUESTION = 533,
-    INVARIANT = 534,
-    PRECISE = 535,
-    HIGH_PRECISION = 536,
-    MEDIUM_PRECISION = 537,
-    LOW_PRECISION = 538,
-    PRECISION = 539,
-    PACKED = 540,
-    RESOURCE = 541,
-    SUPERP = 542
+    FLOAT64_T = 264,
+    CONST = 265,
+    BOOL = 266,
+    INT = 267,
+    UINT = 268,
+    INT64_T = 269,
+    UINT64_T = 270,
+    INT32_T = 271,
+    UINT32_T = 272,
+    INT16_T = 273,
+    UINT16_T = 274,
+    INT8_T = 275,
+    UINT8_T = 276,
+    BREAK = 277,
+    CONTINUE = 278,
+    DO = 279,
+    ELSE = 280,
+    FOR = 281,
+    IF = 282,
+    DISCARD = 283,
+    RETURN = 284,
+    SWITCH = 285,
+    CASE = 286,
+    DEFAULT = 287,
+    SUBROUTINE = 288,
+    BVEC2 = 289,
+    BVEC3 = 290,
+    BVEC4 = 291,
+    IVEC2 = 292,
+    IVEC3 = 293,
+    IVEC4 = 294,
+    UVEC2 = 295,
+    UVEC3 = 296,
+    UVEC4 = 297,
+    I64VEC2 = 298,
+    I64VEC3 = 299,
+    I64VEC4 = 300,
+    U64VEC2 = 301,
+    U64VEC3 = 302,
+    U64VEC4 = 303,
+    I32VEC2 = 304,
+    I32VEC3 = 305,
+    I32VEC4 = 306,
+    U32VEC2 = 307,
+    U32VEC3 = 308,
+    U32VEC4 = 309,
+    I16VEC2 = 310,
+    I16VEC3 = 311,
+    I16VEC4 = 312,
+    U16VEC2 = 313,
+    U16VEC3 = 314,
+    U16VEC4 = 315,
+    I8VEC2 = 316,
+    I8VEC3 = 317,
+    I8VEC4 = 318,
+    U8VEC2 = 319,
+    U8VEC3 = 320,
+    U8VEC4 = 321,
+    VEC2 = 322,
+    VEC3 = 323,
+    VEC4 = 324,
+    MAT2 = 325,
+    MAT3 = 326,
+    MAT4 = 327,
+    CENTROID = 328,
+    IN = 329,
+    OUT = 330,
+    INOUT = 331,
+    UNIFORM = 332,
+    PATCH = 333,
+    SAMPLE = 334,
+    BUFFER = 335,
+    SHARED = 336,
+    NONUNIFORM = 337,
+    PAYLOADNV = 338,
+    PAYLOADINNV = 339,
+    HITATTRNV = 340,
+    CALLDATANV = 341,
+    CALLDATAINNV = 342,
+    COHERENT = 343,
+    VOLATILE = 344,
+    RESTRICT = 345,
+    READONLY = 346,
+    WRITEONLY = 347,
+    DEVICECOHERENT = 348,
+    QUEUEFAMILYCOHERENT = 349,
+    WORKGROUPCOHERENT = 350,
+    SUBGROUPCOHERENT = 351,
+    NONPRIVATE = 352,
+    DVEC2 = 353,
+    DVEC3 = 354,
+    DVEC4 = 355,
+    DMAT2 = 356,
+    DMAT3 = 357,
+    DMAT4 = 358,
+    F16VEC2 = 359,
+    F16VEC3 = 360,
+    F16VEC4 = 361,
+    F16MAT2 = 362,
+    F16MAT3 = 363,
+    F16MAT4 = 364,
+    F32VEC2 = 365,
+    F32VEC3 = 366,
+    F32VEC4 = 367,
+    F32MAT2 = 368,
+    F32MAT3 = 369,
+    F32MAT4 = 370,
+    F64VEC2 = 371,
+    F64VEC3 = 372,
+    F64VEC4 = 373,
+    F64MAT2 = 374,
+    F64MAT3 = 375,
+    F64MAT4 = 376,
+    NOPERSPECTIVE = 377,
+    FLAT = 378,
+    SMOOTH = 379,
+    LAYOUT = 380,
+    EXPLICITINTERPAMD = 381,
+    PERVERTEXNV = 382,
+    PERPRIMITIVENV = 383,
+    PERVIEWNV = 384,
+    PERTASKNV = 385,
+    MAT2X2 = 386,
+    MAT2X3 = 387,
+    MAT2X4 = 388,
+    MAT3X2 = 389,
+    MAT3X3 = 390,
+    MAT3X4 = 391,
+    MAT4X2 = 392,
+    MAT4X3 = 393,
+    MAT4X4 = 394,
+    DMAT2X2 = 395,
+    DMAT2X3 = 396,
+    DMAT2X4 = 397,
+    DMAT3X2 = 398,
+    DMAT3X3 = 399,
+    DMAT3X4 = 400,
+    DMAT4X2 = 401,
+    DMAT4X3 = 402,
+    DMAT4X4 = 403,
+    F16MAT2X2 = 404,
+    F16MAT2X3 = 405,
+    F16MAT2X4 = 406,
+    F16MAT3X2 = 407,
+    F16MAT3X3 = 408,
+    F16MAT3X4 = 409,
+    F16MAT4X2 = 410,
+    F16MAT4X3 = 411,
+    F16MAT4X4 = 412,
+    F32MAT2X2 = 413,
+    F32MAT2X3 = 414,
+    F32MAT2X4 = 415,
+    F32MAT3X2 = 416,
+    F32MAT3X3 = 417,
+    F32MAT3X4 = 418,
+    F32MAT4X2 = 419,
+    F32MAT4X3 = 420,
+    F32MAT4X4 = 421,
+    F64MAT2X2 = 422,
+    F64MAT2X3 = 423,
+    F64MAT2X4 = 424,
+    F64MAT3X2 = 425,
+    F64MAT3X3 = 426,
+    F64MAT3X4 = 427,
+    F64MAT4X2 = 428,
+    F64MAT4X3 = 429,
+    F64MAT4X4 = 430,
+    ATOMIC_UINT = 431,
+    ACCSTRUCTNV = 432,
+    SAMPLER1D = 433,
+    SAMPLER2D = 434,
+    SAMPLER3D = 435,
+    SAMPLERCUBE = 436,
+    SAMPLER1DSHADOW = 437,
+    SAMPLER2DSHADOW = 438,
+    SAMPLERCUBESHADOW = 439,
+    SAMPLER1DARRAY = 440,
+    SAMPLER2DARRAY = 441,
+    SAMPLER1DARRAYSHADOW = 442,
+    SAMPLER2DARRAYSHADOW = 443,
+    ISAMPLER1D = 444,
+    ISAMPLER2D = 445,
+    ISAMPLER3D = 446,
+    ISAMPLERCUBE = 447,
+    ISAMPLER1DARRAY = 448,
+    ISAMPLER2DARRAY = 449,
+    USAMPLER1D = 450,
+    USAMPLER2D = 451,
+    USAMPLER3D = 452,
+    USAMPLERCUBE = 453,
+    USAMPLER1DARRAY = 454,
+    USAMPLER2DARRAY = 455,
+    SAMPLER2DRECT = 456,
+    SAMPLER2DRECTSHADOW = 457,
+    ISAMPLER2DRECT = 458,
+    USAMPLER2DRECT = 459,
+    SAMPLERBUFFER = 460,
+    ISAMPLERBUFFER = 461,
+    USAMPLERBUFFER = 462,
+    SAMPLERCUBEARRAY = 463,
+    SAMPLERCUBEARRAYSHADOW = 464,
+    ISAMPLERCUBEARRAY = 465,
+    USAMPLERCUBEARRAY = 466,
+    SAMPLER2DMS = 467,
+    ISAMPLER2DMS = 468,
+    USAMPLER2DMS = 469,
+    SAMPLER2DMSARRAY = 470,
+    ISAMPLER2DMSARRAY = 471,
+    USAMPLER2DMSARRAY = 472,
+    SAMPLEREXTERNALOES = 473,
+    F16SAMPLER1D = 474,
+    F16SAMPLER2D = 475,
+    F16SAMPLER3D = 476,
+    F16SAMPLER2DRECT = 477,
+    F16SAMPLERCUBE = 478,
+    F16SAMPLER1DARRAY = 479,
+    F16SAMPLER2DARRAY = 480,
+    F16SAMPLERCUBEARRAY = 481,
+    F16SAMPLERBUFFER = 482,
+    F16SAMPLER2DMS = 483,
+    F16SAMPLER2DMSARRAY = 484,
+    F16SAMPLER1DSHADOW = 485,
+    F16SAMPLER2DSHADOW = 486,
+    F16SAMPLER1DARRAYSHADOW = 487,
+    F16SAMPLER2DARRAYSHADOW = 488,
+    F16SAMPLER2DRECTSHADOW = 489,
+    F16SAMPLERCUBESHADOW = 490,
+    F16SAMPLERCUBEARRAYSHADOW = 491,
+    SAMPLER = 492,
+    SAMPLERSHADOW = 493,
+    TEXTURE1D = 494,
+    TEXTURE2D = 495,
+    TEXTURE3D = 496,
+    TEXTURECUBE = 497,
+    TEXTURE1DARRAY = 498,
+    TEXTURE2DARRAY = 499,
+    ITEXTURE1D = 500,
+    ITEXTURE2D = 501,
+    ITEXTURE3D = 502,
+    ITEXTURECUBE = 503,
+    ITEXTURE1DARRAY = 504,
+    ITEXTURE2DARRAY = 505,
+    UTEXTURE1D = 506,
+    UTEXTURE2D = 507,
+    UTEXTURE3D = 508,
+    UTEXTURECUBE = 509,
+    UTEXTURE1DARRAY = 510,
+    UTEXTURE2DARRAY = 511,
+    TEXTURE2DRECT = 512,
+    ITEXTURE2DRECT = 513,
+    UTEXTURE2DRECT = 514,
+    TEXTUREBUFFER = 515,
+    ITEXTUREBUFFER = 516,
+    UTEXTUREBUFFER = 517,
+    TEXTURECUBEARRAY = 518,
+    ITEXTURECUBEARRAY = 519,
+    UTEXTURECUBEARRAY = 520,
+    TEXTURE2DMS = 521,
+    ITEXTURE2DMS = 522,
+    UTEXTURE2DMS = 523,
+    TEXTURE2DMSARRAY = 524,
+    ITEXTURE2DMSARRAY = 525,
+    UTEXTURE2DMSARRAY = 526,
+    F16TEXTURE1D = 527,
+    F16TEXTURE2D = 528,
+    F16TEXTURE3D = 529,
+    F16TEXTURE2DRECT = 530,
+    F16TEXTURECUBE = 531,
+    F16TEXTURE1DARRAY = 532,
+    F16TEXTURE2DARRAY = 533,
+    F16TEXTURECUBEARRAY = 534,
+    F16TEXTUREBUFFER = 535,
+    F16TEXTURE2DMS = 536,
+    F16TEXTURE2DMSARRAY = 537,
+    SUBPASSINPUT = 538,
+    SUBPASSINPUTMS = 539,
+    ISUBPASSINPUT = 540,
+    ISUBPASSINPUTMS = 541,
+    USUBPASSINPUT = 542,
+    USUBPASSINPUTMS = 543,
+    F16SUBPASSINPUT = 544,
+    F16SUBPASSINPUTMS = 545,
+    IMAGE1D = 546,
+    IIMAGE1D = 547,
+    UIMAGE1D = 548,
+    IMAGE2D = 549,
+    IIMAGE2D = 550,
+    UIMAGE2D = 551,
+    IMAGE3D = 552,
+    IIMAGE3D = 553,
+    UIMAGE3D = 554,
+    IMAGE2DRECT = 555,
+    IIMAGE2DRECT = 556,
+    UIMAGE2DRECT = 557,
+    IMAGECUBE = 558,
+    IIMAGECUBE = 559,
+    UIMAGECUBE = 560,
+    IMAGEBUFFER = 561,
+    IIMAGEBUFFER = 562,
+    UIMAGEBUFFER = 563,
+    IMAGE1DARRAY = 564,
+    IIMAGE1DARRAY = 565,
+    UIMAGE1DARRAY = 566,
+    IMAGE2DARRAY = 567,
+    IIMAGE2DARRAY = 568,
+    UIMAGE2DARRAY = 569,
+    IMAGECUBEARRAY = 570,
+    IIMAGECUBEARRAY = 571,
+    UIMAGECUBEARRAY = 572,
+    IMAGE2DMS = 573,
+    IIMAGE2DMS = 574,
+    UIMAGE2DMS = 575,
+    IMAGE2DMSARRAY = 576,
+    IIMAGE2DMSARRAY = 577,
+    UIMAGE2DMSARRAY = 578,
+    F16IMAGE1D = 579,
+    F16IMAGE2D = 580,
+    F16IMAGE3D = 581,
+    F16IMAGE2DRECT = 582,
+    F16IMAGECUBE = 583,
+    F16IMAGE1DARRAY = 584,
+    F16IMAGE2DARRAY = 585,
+    F16IMAGECUBEARRAY = 586,
+    F16IMAGEBUFFER = 587,
+    F16IMAGE2DMS = 588,
+    F16IMAGE2DMSARRAY = 589,
+    STRUCT = 590,
+    VOID = 591,
+    WHILE = 592,
+    IDENTIFIER = 593,
+    TYPE_NAME = 594,
+    FLOATCONSTANT = 595,
+    DOUBLECONSTANT = 596,
+    INT16CONSTANT = 597,
+    UINT16CONSTANT = 598,
+    INT32CONSTANT = 599,
+    UINT32CONSTANT = 600,
+    INTCONSTANT = 601,
+    UINTCONSTANT = 602,
+    INT64CONSTANT = 603,
+    UINT64CONSTANT = 604,
+    BOOLCONSTANT = 605,
+    FLOAT16CONSTANT = 606,
+    LEFT_OP = 607,
+    RIGHT_OP = 608,
+    INC_OP = 609,
+    DEC_OP = 610,
+    LE_OP = 611,
+    GE_OP = 612,
+    EQ_OP = 613,
+    NE_OP = 614,
+    AND_OP = 615,
+    OR_OP = 616,
+    XOR_OP = 617,
+    MUL_ASSIGN = 618,
+    DIV_ASSIGN = 619,
+    ADD_ASSIGN = 620,
+    MOD_ASSIGN = 621,
+    LEFT_ASSIGN = 622,
+    RIGHT_ASSIGN = 623,
+    AND_ASSIGN = 624,
+    XOR_ASSIGN = 625,
+    OR_ASSIGN = 626,
+    SUB_ASSIGN = 627,
+    LEFT_PAREN = 628,
+    RIGHT_PAREN = 629,
+    LEFT_BRACKET = 630,
+    RIGHT_BRACKET = 631,
+    LEFT_BRACE = 632,
+    RIGHT_BRACE = 633,
+    DOT = 634,
+    COMMA = 635,
+    COLON = 636,
+    EQUAL = 637,
+    SEMICOLON = 638,
+    BANG = 639,
+    DASH = 640,
+    TILDE = 641,
+    PLUS = 642,
+    STAR = 643,
+    SLASH = 644,
+    PERCENT = 645,
+    LEFT_ANGLE = 646,
+    RIGHT_ANGLE = 647,
+    VERTICAL_BAR = 648,
+    CARET = 649,
+    AMPERSAND = 650,
+    QUESTION = 651,
+    INVARIANT = 652,
+    PRECISE = 653,
+    HIGH_PRECISION = 654,
+    MEDIUM_PRECISION = 655,
+    LOW_PRECISION = 656,
+    PRECISION = 657,
+    PACKED = 658,
+    RESOURCE = 659,
+    SUPERP = 660
   };
 #endif
 
@@ -415,7 +534,7 @@
 
 union YYSTYPE
 {
-#line 68 "MachineIndependent/glslang.y" /* yacc.c:355  */
+#line 70 "MachineIndependent/glslang.y" /* yacc.c:355  */
 
     struct {
         glslang::TSourceLoc loc;
@@ -437,6 +556,7 @@
             TIntermNode* intermNode;
             glslang::TIntermNodePair nodePair;
             glslang::TIntermTyped* intermTypedNode;
+            glslang::TAttributes* attributes;
         };
         union {
             glslang::TPublicType type;
@@ -449,7 +569,7 @@
         };
     } interm;
 
-#line 453 "MachineIndependent/glslang_tab.cpp" /* yacc.c:355  */
+#line 573 "MachineIndependent/glslang_tab.cpp" /* yacc.c:355  */
 };
 
 typedef union YYSTYPE YYSTYPE;
@@ -464,7 +584,7 @@
 #endif /* !YY_YY_MACHINEINDEPENDENT_GLSLANG_TAB_CPP_H_INCLUDED  */
 
 /* Copy the second part of user declarations.  */
-#line 102 "MachineIndependent/glslang.y" /* yacc.c:358  */
+#line 105 "MachineIndependent/glslang.y" /* yacc.c:358  */
 
 
 /* windows only pragma */
@@ -480,7 +600,7 @@
 extern int yylex(YYSTYPE*, TParseContext&);
 
 
-#line 484 "MachineIndependent/glslang_tab.cpp" /* yacc.c:358  */
+#line 604 "MachineIndependent/glslang_tab.cpp" /* yacc.c:358  */
 
 #ifdef short
 # undef short
@@ -720,23 +840,23 @@
 #endif /* !YYCOPY_NEEDED */
 
 /* YYFINAL -- State number of the termination state.  */
-#define YYFINAL  265
+#define YYFINAL  381
 /* YYLAST -- Last index in YYTABLE.  */
-#define YYLAST   6373
+#define YYLAST   9294
 
 /* YYNTOKENS -- Number of terminals.  */
-#define YYNTOKENS  288
+#define YYNTOKENS  406
 /* YYNNTS -- Number of nonterminals.  */
-#define YYNNTS  100
+#define YYNNTS  107
 /* YYNRULES -- Number of rules.  */
-#define YYNRULES  439
+#define YYNRULES  571
 /* YYNSTATES -- Number of states.  */
-#define YYNSTATES  571
+#define YYNSTATES  712
 
 /* YYTRANSLATE[YYX] -- Symbol number corresponding to YYX as returned
    by yylex, with out-of-bounds checking.  */
 #define YYUNDEFTOK  2
-#define YYMAXUTOK   542
+#define YYMAXUTOK   660
 
 #define YYTRANSLATE(YYX)                                                \
   ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
@@ -799,57 +919,83 @@
      255,   256,   257,   258,   259,   260,   261,   262,   263,   264,
      265,   266,   267,   268,   269,   270,   271,   272,   273,   274,
      275,   276,   277,   278,   279,   280,   281,   282,   283,   284,
-     285,   286,   287
+     285,   286,   287,   288,   289,   290,   291,   292,   293,   294,
+     295,   296,   297,   298,   299,   300,   301,   302,   303,   304,
+     305,   306,   307,   308,   309,   310,   311,   312,   313,   314,
+     315,   316,   317,   318,   319,   320,   321,   322,   323,   324,
+     325,   326,   327,   328,   329,   330,   331,   332,   333,   334,
+     335,   336,   337,   338,   339,   340,   341,   342,   343,   344,
+     345,   346,   347,   348,   349,   350,   351,   352,   353,   354,
+     355,   356,   357,   358,   359,   360,   361,   362,   363,   364,
+     365,   366,   367,   368,   369,   370,   371,   372,   373,   374,
+     375,   376,   377,   378,   379,   380,   381,   382,   383,   384,
+     385,   386,   387,   388,   389,   390,   391,   392,   393,   394,
+     395,   396,   397,   398,   399,   400,   401,   402,   403,   404,
+     405
 };
 
 #if YYDEBUG
   /* YYRLINE[YYN] -- Source line where rule number YYN was defined.  */
 static const yytype_uint16 yyrline[] =
 {
-       0,   252,   252,   258,   261,   264,   268,   272,   276,   279,
-     283,   289,   292,   300,   303,   306,   309,   312,   317,   325,
-     332,   339,   345,   349,   356,   359,   365,   372,   382,   390,
-     395,   425,   431,   435,   439,   459,   460,   461,   462,   468,
-     469,   474,   479,   488,   489,   494,   502,   503,   509,   518,
-     519,   524,   529,   534,   542,   543,   551,   562,   563,   572,
-     573,   582,   583,   592,   593,   601,   602,   610,   611,   619,
-     620,   620,   638,   639,   654,   658,   662,   666,   671,   675,
-     679,   683,   687,   691,   695,   702,   705,   716,   723,   728,
-     733,   741,   745,   749,   753,   758,   763,   772,   772,   783,
-     787,   794,   801,   804,   811,   819,   839,   857,   872,   895,
-     906,   916,   926,   936,   945,   948,   952,   956,   961,   969,
-     974,   979,   984,   989,   998,  1009,  1036,  1045,  1052,  1059,
-    1066,  1078,  1084,  1087,  1094,  1098,  1102,  1110,  1119,  1122,
-    1133,  1136,  1139,  1143,  1147,  1151,  1158,  1162,  1174,  1188,
-    1193,  1199,  1205,  1212,  1218,  1223,  1228,  1233,  1240,  1244,
-    1248,  1252,  1256,  1260,  1266,  1278,  1281,  1286,  1290,  1299,
-    1304,  1312,  1316,  1326,  1330,  1334,  1339,  1346,  1350,  1355,
-    1360,  1365,  1369,  1374,  1379,  1384,  1390,  1396,  1402,  1410,
-    1418,  1426,  1431,  1436,  1441,  1446,  1451,  1456,  1462,  1468,
-    1474,  1480,  1486,  1492,  1498,  1504,  1510,  1515,  1520,  1525,
-    1530,  1535,  1540,  1545,  1550,  1555,  1560,  1565,  1570,  1576,
-    1582,  1588,  1594,  1600,  1606,  1612,  1618,  1624,  1630,  1636,
-    1642,  1650,  1658,  1666,  1674,  1682,  1690,  1698,  1706,  1714,
-    1722,  1730,  1738,  1743,  1748,  1753,  1758,  1763,  1768,  1773,
-    1778,  1783,  1788,  1793,  1798,  1803,  1808,  1813,  1818,  1823,
-    1828,  1833,  1838,  1843,  1848,  1853,  1858,  1863,  1868,  1873,
-    1878,  1883,  1888,  1893,  1898,  1903,  1908,  1913,  1918,  1923,
-    1928,  1933,  1938,  1943,  1948,  1953,  1958,  1963,  1968,  1973,
-    1978,  1983,  1988,  1993,  1998,  2003,  2008,  2013,  2018,  2023,
-    2028,  2033,  2038,  2043,  2048,  2053,  2058,  2063,  2068,  2073,
-    2078,  2083,  2088,  2093,  2098,  2103,  2108,  2113,  2118,  2123,
-    2128,  2133,  2138,  2143,  2148,  2153,  2158,  2163,  2168,  2173,
-    2178,  2183,  2188,  2193,  2198,  2203,  2208,  2213,  2218,  2223,
-    2228,  2233,  2238,  2243,  2248,  2253,  2258,  2263,  2268,  2273,
-    2278,  2283,  2289,  2295,  2301,  2307,  2313,  2319,  2325,  2330,
-    2346,  2351,  2356,  2364,  2364,  2375,  2375,  2385,  2388,  2401,
-    2419,  2443,  2447,  2453,  2458,  2469,  2472,  2478,  2487,  2490,
-    2496,  2500,  2501,  2507,  2508,  2509,  2510,  2511,  2512,  2513,
-    2517,  2518,  2522,  2518,  2534,  2535,  2539,  2539,  2546,  2546,
-    2560,  2563,  2571,  2579,  2590,  2591,  2595,  2602,  2606,  2614,
-    2618,  2631,  2631,  2651,  2654,  2660,  2672,  2684,  2684,  2699,
-    2699,  2715,  2715,  2736,  2739,  2745,  2748,  2754,  2758,  2765,
-    2770,  2775,  2782,  2785,  2794,  2798,  2805,  2808,  2814,  2814
+       0,   294,   294,   300,   303,   307,   311,   314,   318,   322,
+     326,   330,   334,   337,   341,   345,   348,   356,   359,   362,
+     365,   368,   373,   381,   388,   395,   401,   405,   412,   415,
+     421,   428,   438,   446,   451,   478,   486,   492,   496,   500,
+     520,   521,   522,   523,   529,   530,   535,   540,   549,   550,
+     555,   563,   564,   570,   579,   580,   585,   590,   595,   603,
+     604,   612,   623,   624,   633,   634,   643,   644,   653,   654,
+     662,   663,   671,   672,   680,   681,   681,   699,   700,   716,
+     720,   724,   728,   733,   737,   741,   745,   749,   753,   757,
+     764,   767,   778,   785,   790,   795,   803,   807,   811,   815,
+     820,   825,   834,   834,   845,   849,   856,   863,   866,   873,
+     881,   901,   924,   939,   964,   975,   985,   995,  1005,  1014,
+    1017,  1021,  1025,  1030,  1038,  1043,  1048,  1053,  1058,  1067,
+    1078,  1105,  1114,  1121,  1128,  1139,  1148,  1158,  1170,  1179,
+    1191,  1197,  1200,  1207,  1211,  1215,  1223,  1232,  1235,  1246,
+    1249,  1252,  1256,  1260,  1264,  1268,  1274,  1278,  1290,  1304,
+    1309,  1315,  1321,  1328,  1334,  1339,  1344,  1349,  1359,  1369,
+    1379,  1389,  1398,  1410,  1414,  1419,  1424,  1429,  1434,  1439,
+    1443,  1447,  1451,  1455,  1461,  1470,  1477,  1480,  1488,  1492,
+    1501,  1506,  1514,  1518,  1528,  1532,  1536,  1541,  1546,  1551,
+    1556,  1560,  1565,  1570,  1575,  1580,  1585,  1590,  1595,  1600,
+    1605,  1609,  1614,  1619,  1624,  1630,  1636,  1642,  1648,  1654,
+    1660,  1666,  1672,  1678,  1684,  1690,  1696,  1701,  1706,  1711,
+    1716,  1721,  1726,  1732,  1738,  1744,  1750,  1756,  1762,  1768,
+    1774,  1780,  1786,  1792,  1798,  1804,  1810,  1816,  1822,  1828,
+    1834,  1840,  1846,  1852,  1858,  1864,  1870,  1876,  1882,  1888,
+    1893,  1898,  1903,  1908,  1913,  1918,  1923,  1928,  1933,  1938,
+    1943,  1948,  1954,  1960,  1966,  1972,  1978,  1984,  1990,  1996,
+    2002,  2008,  2014,  2020,  2026,  2032,  2038,  2044,  2050,  2056,
+    2062,  2068,  2074,  2080,  2086,  2092,  2098,  2104,  2110,  2116,
+    2122,  2128,  2134,  2140,  2146,  2152,  2158,  2164,  2170,  2176,
+    2182,  2188,  2194,  2200,  2206,  2212,  2218,  2224,  2230,  2236,
+    2242,  2247,  2252,  2257,  2262,  2267,  2272,  2277,  2282,  2287,
+    2292,  2297,  2302,  2307,  2312,  2320,  2328,  2336,  2344,  2352,
+    2360,  2368,  2376,  2384,  2392,  2400,  2408,  2416,  2421,  2426,
+    2431,  2436,  2441,  2446,  2451,  2456,  2461,  2466,  2471,  2476,
+    2481,  2486,  2491,  2496,  2504,  2512,  2517,  2522,  2527,  2535,
+    2540,  2545,  2550,  2558,  2563,  2568,  2573,  2581,  2586,  2591,
+    2596,  2601,  2606,  2614,  2619,  2627,  2632,  2640,  2645,  2653,
+    2658,  2666,  2671,  2679,  2684,  2692,  2697,  2702,  2707,  2712,
+    2717,  2722,  2727,  2732,  2737,  2742,  2747,  2752,  2757,  2762,
+    2767,  2775,  2780,  2785,  2790,  2798,  2803,  2808,  2813,  2821,
+    2826,  2831,  2836,  2844,  2849,  2854,  2859,  2867,  2872,  2877,
+    2882,  2890,  2895,  2900,  2905,  2913,  2918,  2923,  2928,  2936,
+    2941,  2946,  2951,  2959,  2964,  2969,  2974,  2982,  2987,  2992,
+    2997,  3005,  3010,  3015,  3020,  3028,  3033,  3038,  3043,  3051,
+    3056,  3061,  3066,  3074,  3079,  3084,  3089,  3097,  3102,  3107,
+    3113,  3119,  3125,  3134,  3143,  3149,  3155,  3161,  3167,  3172,
+    3188,  3193,  3198,  3206,  3206,  3217,  3217,  3227,  3230,  3243,
+    3265,  3292,  3296,  3302,  3307,  3318,  3321,  3327,  3336,  3339,
+    3345,  3349,  3350,  3356,  3357,  3358,  3359,  3360,  3361,  3362,
+    3366,  3367,  3371,  3367,  3383,  3384,  3388,  3388,  3395,  3395,
+    3409,  3412,  3420,  3428,  3439,  3440,  3444,  3447,  3453,  3460,
+    3464,  3472,  3476,  3489,  3492,  3498,  3498,  3518,  3521,  3527,
+    3539,  3551,  3554,  3560,  3560,  3575,  3575,  3591,  3591,  3612,
+    3615,  3621,  3624,  3630,  3634,  3641,  3646,  3651,  3658,  3661,
+    3670,  3674,  3683,  3686,  3689,  3697,  3697,  3719,  3725,  3728,
+    3733,  3736
 };
 #endif
 
@@ -858,22 +1004,36 @@
    First, the terminals, then, starting at YYNTOKENS, nonterminals.  */
 static const char *const yytname[] =
 {
-  "$end", "error", "$undefined", "ATTRIBUTE", "VARYING", "CONST", "BOOL",
-  "FLOAT", "DOUBLE", "INT", "UINT", "INT64_T", "UINT64_T", "FLOAT16_T",
-  "BREAK", "CONTINUE", "DO", "ELSE", "FOR", "IF", "DISCARD", "RETURN",
-  "SWITCH", "CASE", "DEFAULT", "SUBROUTINE", "BVEC2", "BVEC3", "BVEC4",
-  "IVEC2", "IVEC3", "IVEC4", "I64VEC2", "I64VEC3", "I64VEC4", "UVEC2",
-  "UVEC3", "UVEC4", "U64VEC2", "U64VEC3", "U64VEC4", "VEC2", "VEC3",
-  "VEC4", "MAT2", "MAT3", "MAT4", "CENTROID", "IN", "OUT", "INOUT",
-  "UNIFORM", "PATCH", "SAMPLE", "BUFFER", "SHARED", "COHERENT", "VOLATILE",
-  "RESTRICT", "READONLY", "WRITEONLY", "DVEC2", "DVEC3", "DVEC4", "DMAT2",
-  "DMAT3", "DMAT4", "F16VEC2", "F16VEC3", "F16VEC4", "F16MAT2", "F16MAT3",
-  "F16MAT4", "NOPERSPECTIVE", "FLAT", "SMOOTH", "LAYOUT",
-  "__EXPLICITINTERPAMD", "MAT2X2", "MAT2X3", "MAT2X4", "MAT3X2", "MAT3X3",
-  "MAT3X4", "MAT4X2", "MAT4X3", "MAT4X4", "DMAT2X2", "DMAT2X3", "DMAT2X4",
-  "DMAT3X2", "DMAT3X3", "DMAT3X4", "DMAT4X2", "DMAT4X3", "DMAT4X4",
-  "F16MAT2X2", "F16MAT2X3", "F16MAT2X4", "F16MAT3X2", "F16MAT3X3",
-  "F16MAT3X4", "F16MAT4X2", "F16MAT4X3", "F16MAT4X4", "ATOMIC_UINT",
+  "$end", "error", "$undefined", "ATTRIBUTE", "VARYING", "FLOAT16_T",
+  "FLOAT", "FLOAT32_T", "DOUBLE", "FLOAT64_T", "CONST", "BOOL", "INT",
+  "UINT", "INT64_T", "UINT64_T", "INT32_T", "UINT32_T", "INT16_T",
+  "UINT16_T", "INT8_T", "UINT8_T", "BREAK", "CONTINUE", "DO", "ELSE",
+  "FOR", "IF", "DISCARD", "RETURN", "SWITCH", "CASE", "DEFAULT",
+  "SUBROUTINE", "BVEC2", "BVEC3", "BVEC4", "IVEC2", "IVEC3", "IVEC4",
+  "UVEC2", "UVEC3", "UVEC4", "I64VEC2", "I64VEC3", "I64VEC4", "U64VEC2",
+  "U64VEC3", "U64VEC4", "I32VEC2", "I32VEC3", "I32VEC4", "U32VEC2",
+  "U32VEC3", "U32VEC4", "I16VEC2", "I16VEC3", "I16VEC4", "U16VEC2",
+  "U16VEC3", "U16VEC4", "I8VEC2", "I8VEC3", "I8VEC4", "U8VEC2", "U8VEC3",
+  "U8VEC4", "VEC2", "VEC3", "VEC4", "MAT2", "MAT3", "MAT4", "CENTROID",
+  "IN", "OUT", "INOUT", "UNIFORM", "PATCH", "SAMPLE", "BUFFER", "SHARED",
+  "NONUNIFORM", "PAYLOADNV", "PAYLOADINNV", "HITATTRNV", "CALLDATANV",
+  "CALLDATAINNV", "COHERENT", "VOLATILE", "RESTRICT", "READONLY",
+  "WRITEONLY", "DEVICECOHERENT", "QUEUEFAMILYCOHERENT",
+  "WORKGROUPCOHERENT", "SUBGROUPCOHERENT", "NONPRIVATE", "DVEC2", "DVEC3",
+  "DVEC4", "DMAT2", "DMAT3", "DMAT4", "F16VEC2", "F16VEC3", "F16VEC4",
+  "F16MAT2", "F16MAT3", "F16MAT4", "F32VEC2", "F32VEC3", "F32VEC4",
+  "F32MAT2", "F32MAT3", "F32MAT4", "F64VEC2", "F64VEC3", "F64VEC4",
+  "F64MAT2", "F64MAT3", "F64MAT4", "NOPERSPECTIVE", "FLAT", "SMOOTH",
+  "LAYOUT", "EXPLICITINTERPAMD", "PERVERTEXNV", "PERPRIMITIVENV",
+  "PERVIEWNV", "PERTASKNV", "MAT2X2", "MAT2X3", "MAT2X4", "MAT3X2",
+  "MAT3X3", "MAT3X4", "MAT4X2", "MAT4X3", "MAT4X4", "DMAT2X2", "DMAT2X3",
+  "DMAT2X4", "DMAT3X2", "DMAT3X3", "DMAT3X4", "DMAT4X2", "DMAT4X3",
+  "DMAT4X4", "F16MAT2X2", "F16MAT2X3", "F16MAT2X4", "F16MAT3X2",
+  "F16MAT3X3", "F16MAT3X4", "F16MAT4X2", "F16MAT4X3", "F16MAT4X4",
+  "F32MAT2X2", "F32MAT2X3", "F32MAT2X4", "F32MAT3X2", "F32MAT3X3",
+  "F32MAT3X4", "F32MAT4X2", "F32MAT4X3", "F32MAT4X4", "F64MAT2X2",
+  "F64MAT2X3", "F64MAT2X4", "F64MAT3X2", "F64MAT3X3", "F64MAT3X4",
+  "F64MAT4X2", "F64MAT4X3", "F64MAT4X4", "ATOMIC_UINT", "ACCSTRUCTNV",
   "SAMPLER1D", "SAMPLER2D", "SAMPLER3D", "SAMPLERCUBE", "SAMPLER1DSHADOW",
   "SAMPLER2DSHADOW", "SAMPLERCUBESHADOW", "SAMPLER1DARRAY",
   "SAMPLER2DARRAY", "SAMPLER1DARRAYSHADOW", "SAMPLER2DARRAYSHADOW",
@@ -885,40 +1045,54 @@
   "SAMPLERCUBEARRAY", "SAMPLERCUBEARRAYSHADOW", "ISAMPLERCUBEARRAY",
   "USAMPLERCUBEARRAY", "SAMPLER2DMS", "ISAMPLER2DMS", "USAMPLER2DMS",
   "SAMPLER2DMSARRAY", "ISAMPLER2DMSARRAY", "USAMPLER2DMSARRAY",
-  "SAMPLEREXTERNALOES", "SAMPLER", "SAMPLERSHADOW", "TEXTURE1D",
-  "TEXTURE2D", "TEXTURE3D", "TEXTURECUBE", "TEXTURE1DARRAY",
-  "TEXTURE2DARRAY", "ITEXTURE1D", "ITEXTURE2D", "ITEXTURE3D",
-  "ITEXTURECUBE", "ITEXTURE1DARRAY", "ITEXTURE2DARRAY", "UTEXTURE1D",
-  "UTEXTURE2D", "UTEXTURE3D", "UTEXTURECUBE", "UTEXTURE1DARRAY",
-  "UTEXTURE2DARRAY", "TEXTURE2DRECT", "ITEXTURE2DRECT", "UTEXTURE2DRECT",
-  "TEXTUREBUFFER", "ITEXTUREBUFFER", "UTEXTUREBUFFER", "TEXTURECUBEARRAY",
-  "ITEXTURECUBEARRAY", "UTEXTURECUBEARRAY", "TEXTURE2DMS", "ITEXTURE2DMS",
-  "UTEXTURE2DMS", "TEXTURE2DMSARRAY", "ITEXTURE2DMSARRAY",
-  "UTEXTURE2DMSARRAY", "SUBPASSINPUT", "SUBPASSINPUTMS", "ISUBPASSINPUT",
-  "ISUBPASSINPUTMS", "USUBPASSINPUT", "USUBPASSINPUTMS", "IMAGE1D",
-  "IIMAGE1D", "UIMAGE1D", "IMAGE2D", "IIMAGE2D", "UIMAGE2D", "IMAGE3D",
-  "IIMAGE3D", "UIMAGE3D", "IMAGE2DRECT", "IIMAGE2DRECT", "UIMAGE2DRECT",
-  "IMAGECUBE", "IIMAGECUBE", "UIMAGECUBE", "IMAGEBUFFER", "IIMAGEBUFFER",
-  "UIMAGEBUFFER", "IMAGE1DARRAY", "IIMAGE1DARRAY", "UIMAGE1DARRAY",
-  "IMAGE2DARRAY", "IIMAGE2DARRAY", "UIMAGE2DARRAY", "IMAGECUBEARRAY",
-  "IIMAGECUBEARRAY", "UIMAGECUBEARRAY", "IMAGE2DMS", "IIMAGE2DMS",
-  "UIMAGE2DMS", "IMAGE2DMSARRAY", "IIMAGE2DMSARRAY", "UIMAGE2DMSARRAY",
-  "STRUCT", "VOID", "WHILE", "IDENTIFIER", "TYPE_NAME", "FLOATCONSTANT",
-  "DOUBLECONSTANT", "INTCONSTANT", "UINTCONSTANT", "INT64CONSTANT",
-  "UINT64CONSTANT", "BOOLCONSTANT", "FLOAT16CONSTANT", "LEFT_OP",
-  "RIGHT_OP", "INC_OP", "DEC_OP", "LE_OP", "GE_OP", "EQ_OP", "NE_OP",
-  "AND_OP", "OR_OP", "XOR_OP", "MUL_ASSIGN", "DIV_ASSIGN", "ADD_ASSIGN",
-  "MOD_ASSIGN", "LEFT_ASSIGN", "RIGHT_ASSIGN", "AND_ASSIGN", "XOR_ASSIGN",
-  "OR_ASSIGN", "SUB_ASSIGN", "LEFT_PAREN", "RIGHT_PAREN", "LEFT_BRACKET",
-  "RIGHT_BRACKET", "LEFT_BRACE", "RIGHT_BRACE", "DOT", "COMMA", "COLON",
-  "EQUAL", "SEMICOLON", "BANG", "DASH", "TILDE", "PLUS", "STAR", "SLASH",
-  "PERCENT", "LEFT_ANGLE", "RIGHT_ANGLE", "VERTICAL_BAR", "CARET",
-  "AMPERSAND", "QUESTION", "INVARIANT", "PRECISE", "HIGH_PRECISION",
-  "MEDIUM_PRECISION", "LOW_PRECISION", "PRECISION", "PACKED", "RESOURCE",
-  "SUPERP", "$accept", "variable_identifier", "primary_expression",
-  "postfix_expression", "integer_expression", "function_call",
-  "function_call_or_method", "function_call_generic",
-  "function_call_header_no_parameters",
+  "SAMPLEREXTERNALOES", "F16SAMPLER1D", "F16SAMPLER2D", "F16SAMPLER3D",
+  "F16SAMPLER2DRECT", "F16SAMPLERCUBE", "F16SAMPLER1DARRAY",
+  "F16SAMPLER2DARRAY", "F16SAMPLERCUBEARRAY", "F16SAMPLERBUFFER",
+  "F16SAMPLER2DMS", "F16SAMPLER2DMSARRAY", "F16SAMPLER1DSHADOW",
+  "F16SAMPLER2DSHADOW", "F16SAMPLER1DARRAYSHADOW",
+  "F16SAMPLER2DARRAYSHADOW", "F16SAMPLER2DRECTSHADOW",
+  "F16SAMPLERCUBESHADOW", "F16SAMPLERCUBEARRAYSHADOW", "SAMPLER",
+  "SAMPLERSHADOW", "TEXTURE1D", "TEXTURE2D", "TEXTURE3D", "TEXTURECUBE",
+  "TEXTURE1DARRAY", "TEXTURE2DARRAY", "ITEXTURE1D", "ITEXTURE2D",
+  "ITEXTURE3D", "ITEXTURECUBE", "ITEXTURE1DARRAY", "ITEXTURE2DARRAY",
+  "UTEXTURE1D", "UTEXTURE2D", "UTEXTURE3D", "UTEXTURECUBE",
+  "UTEXTURE1DARRAY", "UTEXTURE2DARRAY", "TEXTURE2DRECT", "ITEXTURE2DRECT",
+  "UTEXTURE2DRECT", "TEXTUREBUFFER", "ITEXTUREBUFFER", "UTEXTUREBUFFER",
+  "TEXTURECUBEARRAY", "ITEXTURECUBEARRAY", "UTEXTURECUBEARRAY",
+  "TEXTURE2DMS", "ITEXTURE2DMS", "UTEXTURE2DMS", "TEXTURE2DMSARRAY",
+  "ITEXTURE2DMSARRAY", "UTEXTURE2DMSARRAY", "F16TEXTURE1D", "F16TEXTURE2D",
+  "F16TEXTURE3D", "F16TEXTURE2DRECT", "F16TEXTURECUBE",
+  "F16TEXTURE1DARRAY", "F16TEXTURE2DARRAY", "F16TEXTURECUBEARRAY",
+  "F16TEXTUREBUFFER", "F16TEXTURE2DMS", "F16TEXTURE2DMSARRAY",
+  "SUBPASSINPUT", "SUBPASSINPUTMS", "ISUBPASSINPUT", "ISUBPASSINPUTMS",
+  "USUBPASSINPUT", "USUBPASSINPUTMS", "F16SUBPASSINPUT",
+  "F16SUBPASSINPUTMS", "IMAGE1D", "IIMAGE1D", "UIMAGE1D", "IMAGE2D",
+  "IIMAGE2D", "UIMAGE2D", "IMAGE3D", "IIMAGE3D", "UIMAGE3D", "IMAGE2DRECT",
+  "IIMAGE2DRECT", "UIMAGE2DRECT", "IMAGECUBE", "IIMAGECUBE", "UIMAGECUBE",
+  "IMAGEBUFFER", "IIMAGEBUFFER", "UIMAGEBUFFER", "IMAGE1DARRAY",
+  "IIMAGE1DARRAY", "UIMAGE1DARRAY", "IMAGE2DARRAY", "IIMAGE2DARRAY",
+  "UIMAGE2DARRAY", "IMAGECUBEARRAY", "IIMAGECUBEARRAY", "UIMAGECUBEARRAY",
+  "IMAGE2DMS", "IIMAGE2DMS", "UIMAGE2DMS", "IMAGE2DMSARRAY",
+  "IIMAGE2DMSARRAY", "UIMAGE2DMSARRAY", "F16IMAGE1D", "F16IMAGE2D",
+  "F16IMAGE3D", "F16IMAGE2DRECT", "F16IMAGECUBE", "F16IMAGE1DARRAY",
+  "F16IMAGE2DARRAY", "F16IMAGECUBEARRAY", "F16IMAGEBUFFER", "F16IMAGE2DMS",
+  "F16IMAGE2DMSARRAY", "STRUCT", "VOID", "WHILE", "IDENTIFIER",
+  "TYPE_NAME", "FLOATCONSTANT", "DOUBLECONSTANT", "INT16CONSTANT",
+  "UINT16CONSTANT", "INT32CONSTANT", "UINT32CONSTANT", "INTCONSTANT",
+  "UINTCONSTANT", "INT64CONSTANT", "UINT64CONSTANT", "BOOLCONSTANT",
+  "FLOAT16CONSTANT", "LEFT_OP", "RIGHT_OP", "INC_OP", "DEC_OP", "LE_OP",
+  "GE_OP", "EQ_OP", "NE_OP", "AND_OP", "OR_OP", "XOR_OP", "MUL_ASSIGN",
+  "DIV_ASSIGN", "ADD_ASSIGN", "MOD_ASSIGN", "LEFT_ASSIGN", "RIGHT_ASSIGN",
+  "AND_ASSIGN", "XOR_ASSIGN", "OR_ASSIGN", "SUB_ASSIGN", "LEFT_PAREN",
+  "RIGHT_PAREN", "LEFT_BRACKET", "RIGHT_BRACKET", "LEFT_BRACE",
+  "RIGHT_BRACE", "DOT", "COMMA", "COLON", "EQUAL", "SEMICOLON", "BANG",
+  "DASH", "TILDE", "PLUS", "STAR", "SLASH", "PERCENT", "LEFT_ANGLE",
+  "RIGHT_ANGLE", "VERTICAL_BAR", "CARET", "AMPERSAND", "QUESTION",
+  "INVARIANT", "PRECISE", "HIGH_PRECISION", "MEDIUM_PRECISION",
+  "LOW_PRECISION", "PRECISION", "PACKED", "RESOURCE", "SUPERP", "$accept",
+  "variable_identifier", "primary_expression", "postfix_expression",
+  "integer_expression", "function_call", "function_call_or_method",
+  "function_call_generic", "function_call_header_no_parameters",
   "function_call_header_with_parameters", "function_call_header",
   "function_identifier", "unary_expression", "unary_operator",
   "multiplicative_expression", "additive_expression", "shift_expression",
@@ -935,20 +1109,24 @@
   "fully_specified_type", "invariant_qualifier", "interpolation_qualifier",
   "layout_qualifier", "layout_qualifier_id_list", "layout_qualifier_id",
   "precise_qualifier", "type_qualifier", "single_type_qualifier",
-  "storage_qualifier", "type_name_list", "type_specifier",
-  "array_specifier", "type_specifier_nonarray", "precision_qualifier",
-  "struct_specifier", "$@3", "$@4", "struct_declaration_list",
-  "struct_declaration", "struct_declarator_list", "struct_declarator",
-  "initializer", "initializer_list", "declaration_statement", "statement",
+  "storage_qualifier", "non_uniform_qualifier", "type_name_list",
+  "type_specifier", "array_specifier", "type_specifier_nonarray",
+  "precision_qualifier", "struct_specifier", "$@3", "$@4",
+  "struct_declaration_list", "struct_declaration",
+  "struct_declarator_list", "struct_declarator", "initializer",
+  "initializer_list", "declaration_statement", "statement",
   "simple_statement", "compound_statement", "$@5", "$@6",
   "statement_no_new_scope", "statement_scoped", "$@7", "$@8",
   "compound_statement_no_new_scope", "statement_list",
   "expression_statement", "selection_statement",
-  "selection_rest_statement", "condition", "switch_statement", "$@9",
-  "switch_statement_list", "case_label", "iteration_statement", "$@10",
-  "$@11", "$@12", "for_init_statement", "conditionopt",
-  "for_rest_statement", "jump_statement", "translation_unit",
-  "external_declaration", "function_definition", "$@13", YY_NULLPTR
+  "selection_statement_nonattributed", "selection_rest_statement",
+  "condition", "switch_statement", "switch_statement_nonattributed", "$@9",
+  "switch_statement_list", "case_label", "iteration_statement",
+  "iteration_statement_nonattributed", "$@10", "$@11", "$@12",
+  "for_init_statement", "conditionopt", "for_rest_statement",
+  "jump_statement", "translation_unit", "external_declaration",
+  "function_definition", "$@13", "attribute", "attribute_list",
+  "single_attribute", YY_NULLPTR
 };
 #endif
 
@@ -985,16 +1163,28 @@
      505,   506,   507,   508,   509,   510,   511,   512,   513,   514,
      515,   516,   517,   518,   519,   520,   521,   522,   523,   524,
      525,   526,   527,   528,   529,   530,   531,   532,   533,   534,
-     535,   536,   537,   538,   539,   540,   541,   542
+     535,   536,   537,   538,   539,   540,   541,   542,   543,   544,
+     545,   546,   547,   548,   549,   550,   551,   552,   553,   554,
+     555,   556,   557,   558,   559,   560,   561,   562,   563,   564,
+     565,   566,   567,   568,   569,   570,   571,   572,   573,   574,
+     575,   576,   577,   578,   579,   580,   581,   582,   583,   584,
+     585,   586,   587,   588,   589,   590,   591,   592,   593,   594,
+     595,   596,   597,   598,   599,   600,   601,   602,   603,   604,
+     605,   606,   607,   608,   609,   610,   611,   612,   613,   614,
+     615,   616,   617,   618,   619,   620,   621,   622,   623,   624,
+     625,   626,   627,   628,   629,   630,   631,   632,   633,   634,
+     635,   636,   637,   638,   639,   640,   641,   642,   643,   644,
+     645,   646,   647,   648,   649,   650,   651,   652,   653,   654,
+     655,   656,   657,   658,   659,   660
 };
 # endif
 
-#define YYPACT_NINF -512
+#define YYPACT_NINF -649
 
 #define yypact_value_is_default(Yystate) \
-  (!!((Yystate) == (-512)))
+  (!!((Yystate) == (-649)))
 
-#define YYTABLE_NINF -397
+#define YYTABLE_NINF -517
 
 #define yytable_value_is_error(Yytable_value) \
   0
@@ -1003,64 +1193,78 @@
      STATE-NUM.  */
 static const yytype_int16 yypact[] =
 {
-    2538,  -512,  -512,  -512,  -512,  -512,  -512,  -512,  -512,  -512,
-    -512,  -512,  -235,  -512,  -512,  -512,  -512,  -512,  -512,  -512,
-    -512,  -512,  -512,  -512,  -512,  -512,  -512,  -512,  -512,  -512,
-    -512,  -512,  -512,  -512,  -512,  -512,  -512,  -512,  -512,  -512,
-    -512,  -512,  -512,  -512,  -512,  -512,  -512,  -512,  -512,  -512,
-    -512,  -512,  -512,  -512,  -512,  -512,  -512,  -512,  -512,  -512,
-    -512,  -512,  -512,  -201,  -512,  -512,  -512,  -512,  -512,  -512,
-    -512,  -512,  -512,  -512,  -512,  -512,  -512,  -512,  -512,  -512,
-    -512,  -512,  -512,  -512,  -512,  -512,  -512,  -512,  -512,  -512,
-    -512,  -512,  -512,  -512,  -512,  -512,  -512,  -512,  -512,  -512,
-    -512,  -512,  -512,  -512,  -512,  -512,  -512,  -512,  -512,  -512,
-    -512,  -512,  -512,  -512,  -512,  -512,  -512,  -512,  -512,  -512,
-    -512,  -512,  -512,  -512,  -512,  -512,  -512,  -512,  -512,  -512,
-    -512,  -512,  -512,  -512,  -512,  -512,  -512,  -512,  -512,  -512,
-    -512,  -512,  -512,  -512,  -512,  -512,  -512,  -512,  -512,  -512,
-    -512,  -512,  -512,  -512,  -512,  -512,  -512,  -512,  -512,  -512,
-    -512,  -512,  -512,  -512,  -512,  -512,  -512,  -512,  -512,  -512,
-    -512,  -512,  -512,  -512,  -512,  -512,  -512,  -512,  -512,  -512,
-    -512,  -512,  -512,  -512,  -512,  -512,  -512,  -512,  -512,  -512,
-    -512,  -512,  -512,  -512,  -512,  -512,  -512,  -512,  -512,  -512,
-    -512,  -512,  -512,  -512,  -512,  -512,  -512,  -512,  -203,  -512,
-    -512,  -512,  -512,  -512,  -512,  -512,  -153,  -512,  -210,  -220,
-    -152,  -189,  4119,  -160,  -512,  -128,  -512,  -512,  -512,  -512,
-    3079,  -512,  -512,  -512,  -122,  -512,  -512,   564,  -512,  -512,
-     -72,   -46,  -105,  -512,  6148,  -216,  -512,  -512,  -102,  -512,
-    4119,  -512,  -512,  -512,  4119,   -68,   -66,  -512,  -225,  -187,
-    -512,  -512,  -512,  4606,   -98,  -512,  -512,  -512,  -179,  -512,
-    -104,  -172,  -512,  -512,  4119,  -101,  -512,  -186,   846,  -512,
-    -512,  -512,  -512,  -122,  -233,  -512,  4870,  -217,  -512,   -63,
-    -512,  -151,  -512,  -512,  -512,  -512,  -512,  -512,  -512,  -512,
-    -512,  5648,  5648,  5648,  -512,  -512,  -512,  -512,  -512,  -512,
-    -512,  -209,  -512,  -512,  -512,   -94,  -170,  5898,   -92,  -512,
-    5648,  -139,  -133,  -109,  -223,  -103,  -111,  -108,  -106,   -71,
-     -74,  -218,   -86,  -512,  5134,  -512,   -52,  5648,  -512,   -46,
-    4119,  4119,   -50,  3342,  -512,  -512,  -512,   -90,   -89,  -512,
-     -78,   -76,   -85,  5398,   -70,  5648,   -80,   -69,   -64,  -512,
-    -512,  -184,  -512,  -512,  -150,  -512,  -220,   -67,  -512,  -512,
-    -512,  -512,  1128,  -512,  -512,  -512,  -512,  -512,  -512,   -98,
-    4870,  -183,  4870,  -512,  -512,  4870,  4119,  -512,   -40,  -512,
-    -512,  -512,  -169,  -512,  -512,  5648,   -35,  -512,  -512,  5648,
-     -65,  -512,  -512,  -512,  5648,  5648,  5648,  5648,  5648,  5648,
-    5648,  5648,  5648,  5648,  5648,  5648,  5648,  5648,  5648,  5648,
-    5648,  5648,  5648,  -512,  -512,  -512,   -61,  -512,  -512,  -512,
-    -512,  3601,   -50,  -122,  -144,  -512,  -512,  -512,  -512,  -512,
-    1410,  -512,  5648,  -512,  -512,  -142,  5648,  -123,  -512,  -512,
-    -512,  1410,  -512,  -512,  -512,  -512,  -512,  -512,  -512,  -512,
-    -512,  -512,  -512,  5648,  5648,  -512,  -512,  -512,  -512,  4870,
-    -512,  -226,  -512,  3860,  -512,  -512,   -60,   -62,  -512,  -512,
-    -512,  -512,  -512,  -139,  -139,  -133,  -133,  -109,  -109,  -109,
-    -109,  -223,  -223,  -103,  -111,  -108,  -106,   -71,   -74,  5648,
-    -512,  -512,  -138,   -98,   -50,  -512,   -33,  2256,  -168,  -512,
-    -167,  -512,  2798,  1410,  -512,  -512,  -512,  -512,  4342,  -512,
-    -512,  -121,  -512,  -512,   -56,  -512,  -512,  2798,   -58,  -512,
-     -62,   -32,  4119,   -49,   -51,  -512,  -512,  5648,  5648,  -512,
-     -57,   -45,   177,   -55,  1974,  -512,   -47,   -44,  1692,  -512,
-    -512,  -165,  5648,  1692,   -58,  -512,  -512,  1410,  4870,  -512,
-    -512,  -512,   -48,   -62,  -512,  -512,  1410,   -42,  -512,  -512,
-    -512
+    3511,  -649,  -649,  -649,  -649,  -649,  -649,  -649,  -649,  -649,
+    -649,  -649,  -649,  -649,  -649,  -649,  -649,  -649,  -649,  -649,
+    -326,  -649,  -649,  -649,  -649,  -649,  -649,  -649,  -649,  -649,
+    -649,  -649,  -649,  -649,  -649,  -649,  -649,  -649,  -649,  -649,
+    -649,  -649,  -649,  -649,  -649,  -649,  -649,  -649,  -649,  -649,
+    -649,  -649,  -649,  -649,  -649,  -649,  -649,  -649,  -649,  -649,
+    -649,  -649,  -649,  -649,  -649,  -649,  -649,  -649,  -649,  -649,
+    -649,  -649,  -649,  -649,  -649,  -649,  -649,  -649,  -649,  -649,
+    -649,  -649,  -649,  -649,  -649,  -649,  -649,  -649,  -649,  -649,
+    -649,  -649,  -649,  -649,  -649,  -649,  -649,  -649,  -649,  -649,
+    -649,  -649,  -649,  -649,  -649,  -649,  -649,  -649,  -649,  -649,
+    -649,  -649,  -310,  -649,  -649,  -649,  -649,  -649,  -649,  -649,
+    -649,  -649,  -649,  -649,  -649,  -649,  -649,  -649,  -649,  -649,
+    -649,  -649,  -649,  -649,  -649,  -649,  -649,  -649,  -649,  -649,
+    -649,  -649,  -649,  -649,  -649,  -649,  -649,  -649,  -649,  -649,
+    -649,  -649,  -649,  -649,  -649,  -649,  -649,  -649,  -649,  -649,
+    -649,  -649,  -649,  -649,  -649,  -649,  -649,  -649,  -649,  -649,
+    -649,  -649,  -649,  -649,  -649,  -649,  -649,  -649,  -649,  -649,
+    -649,  -649,  -649,  -649,  -649,  -649,  -649,  -649,  -649,  -649,
+    -649,  -649,  -649,  -649,  -649,  -649,  -649,  -649,  -649,  -649,
+    -649,  -649,  -649,  -649,  -649,  -649,  -649,  -649,  -649,  -649,
+    -649,  -649,  -649,  -649,  -649,  -649,  -649,  -649,  -649,  -649,
+    -649,  -649,  -649,  -649,  -649,  -649,  -649,  -649,  -649,  -649,
+    -649,  -649,  -649,  -649,  -649,  -649,  -649,  -649,  -649,  -649,
+    -649,  -649,  -649,  -649,  -649,  -649,  -649,  -649,  -649,  -649,
+    -649,  -649,  -649,  -649,  -649,  -649,  -649,  -649,  -649,  -649,
+    -649,  -649,  -649,  -649,  -649,  -649,  -649,  -649,  -649,  -649,
+    -649,  -649,  -649,  -649,  -649,  -649,  -649,  -649,  -649,  -649,
+    -649,  -649,  -649,  -649,  -649,  -649,  -649,  -649,  -649,  -649,
+    -649,  -649,  -649,  -649,  -649,  -649,  -649,  -649,  -649,  -649,
+    -649,  -649,  -649,  -649,  -649,  -649,  -649,  -649,  -649,  -649,
+    -649,  -649,  -649,  -649,  -649,  -649,  -649,  -649,  -649,  -649,
+    -649,  -649,  -316,  -649,  -649,  -649,  -649,  -649,  -649,  -649,
+    -649,  -256,  -649,  -317,  -357,  -305,  -269,  5906,  -315,  -649,
+    -225,  -649,  -649,  -649,  -649,  4310,  -649,  -649,  -649,  -649,
+    -234,  -649,  -649,   711,  -649,  -649,  -204,   -69,  -222,  -649,
+    8955,  -335,  -649,  -649,  -218,  -649,  5906,  -649,  -649,  -649,
+    5906,  -170,  -169,  -649,  -339,  -303,  -649,  -649,  -649,  6657,
+    -205,  -649,  -649,  -649,  -307,  -649,  -211,  -302,  -649,  -649,
+    5906,  -210,  -649,  -321,  1111,  -649,  -649,  -649,  -649,  -234,
+    -340,  -649,  7040,  -325,  -649,  -166,  -649,  -292,  -649,  -649,
+    -649,  -649,  -649,  -649,  -649,  -649,  -649,  -649,  -649,  -649,
+    -649,  8189,  8189,  8189,  -649,  -649,  -649,  -649,  -649,  -649,
+    -649,  -324,  -649,  -649,  -649,  -200,  -298,  8572,  -198,  -649,
+    8189,  -242,  -278,  -314,  -333,  -209,  -219,  -217,  -215,  -180,
+    -181,  -336,  -194,  -649,  -649,  7423,  -649,  -155,  8189,  -649,
+     -69,  5906,  5906,  -154,  4709,  -649,  -649,  -649,  -197,  -195,
+    -649,  -188,  -184,  -193,  7806,  -179,  8189,  -189,  -178,  -182,
+    -177,  -649,  -649,  -267,  -649,  -649,  -252,  -649,  -357,  -176,
+    -173,  -649,  -649,  -649,  -649,  1511,  -649,  -649,  -649,  -649,
+    -649,  -649,  -649,  -649,  -649,   -19,  -205,  7040,  -311,  7040,
+    -649,  -649,  7040,  5906,  -649,  -142,  -649,  -649,  -649,  -293,
+    -649,  -649,  8189,  -136,  -649,  -649,  8189,  -171,  -649,  -649,
+    -649,  8189,  8189,  8189,  8189,  8189,  8189,  8189,  8189,  8189,
+    8189,  8189,  8189,  8189,  8189,  8189,  8189,  8189,  8189,  8189,
+    -649,  -649,  -649,  -172,  -649,  -649,  -649,  -649,  5108,  -154,
+    -234,  -251,  -649,  -649,  -649,  -649,  -649,  1911,  -649,  8189,
+    -649,  -649,  -245,  8189,  -228,  -649,  -649,  -133,  -649,  1911,
+    -649,  -649,  -649,  -649,  -649,  -649,  -649,  -649,  -649,  -649,
+    -649,  8189,  8189,  -649,  -649,  -649,  -649,  -649,  -649,  -649,
+    7040,  -649,  -285,  -649,  5507,  -649,  -649,  -168,  -165,  -649,
+    -649,  -649,  -649,  -649,  -242,  -242,  -278,  -278,  -314,  -314,
+    -314,  -314,  -333,  -333,  -209,  -219,  -217,  -215,  -180,  -181,
+    8189,  -649,  -649,  -241,  -205,  -154,  -649,  -128,  3111,  -290,
+    -649,  -268,  -649,  3911,  -163,  -297,  -649,  1911,  -649,  -649,
+    -649,  -649,  6274,  -649,  -649,  -223,  -649,  -649,  -162,  -649,
+    -649,  3911,  -161,  -649,  -165,  -126,  5906,  -160,  8189,  -159,
+    -133,  -158,  -649,  -649,  8189,  8189,  -649,  -164,  -156,   196,
+    -151,  2711,  -649,  -131,  -135,  2311,  -152,  -649,  -649,  -649,
+    -649,  -254,  8189,  2311,  -161,  -649,  -649,  1911,  7040,  -649,
+    -649,  -649,  -649,  -134,  -165,  -649,  -649,  1911,  -127,  -649,
+    -649,  -649
 };
 
   /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM.
@@ -1068,94 +1272,110 @@
      means the default is an error.  */
 static const yytype_uint16 yydefact[] =
 {
-       0,   147,   148,   146,   181,   174,   175,   177,   178,   179,
-     180,   176,   163,   191,   192,   193,   194,   195,   196,   197,
-     198,   199,   200,   201,   202,   203,   204,   205,   182,   183,
-     184,   206,   207,   208,   152,   150,   151,   149,   155,   153,
-     154,   156,   157,   158,   159,   160,   161,   162,   185,   186,
-     187,   218,   219,   220,   188,   189,   190,   230,   231,   232,
-     129,   128,   127,     0,   130,   209,   210,   211,   212,   213,
-     214,   215,   216,   217,   221,   222,   223,   224,   225,   226,
-     227,   228,   229,   233,   234,   235,   236,   237,   238,   239,
-     240,   241,   242,   243,   244,   245,   246,   247,   248,   249,
-     250,   251,   252,   253,   256,   257,   258,   259,   260,   261,
-     263,   264,   265,   266,   267,   268,   270,   271,   272,   273,
-     274,   275,   276,   254,   255,   262,   269,   277,   278,   279,
-     280,   281,   282,   351,   283,   284,   285,   286,   287,   288,
-     289,   290,   292,   293,   294,   295,   296,   297,   299,   300,
-     301,   302,   303,   304,   306,   307,   308,   309,   310,   311,
-     291,   298,   305,   312,   313,   314,   315,   316,   317,   352,
-     353,   354,   355,   356,   357,   318,   319,   320,   321,   322,
-     323,   324,   325,   326,   327,   328,   329,   330,   331,   332,
-     333,   334,   335,   336,   337,   338,   339,   340,   341,   342,
-     343,   344,   345,   346,   347,   348,   349,   350,     0,   173,
-     359,   126,   137,   360,   361,   362,     0,   437,     0,   438,
-       0,   103,   102,     0,   114,   119,   144,   143,   141,   145,
-       0,   138,   140,   124,   167,   142,   358,     0,   434,   436,
-       0,     0,     0,   365,     0,     0,    91,    88,     0,   101,
-       0,   110,   104,   112,     0,   113,     0,    89,   120,     0,
-      94,   139,   125,     0,   168,     1,   435,   165,     0,   136,
-     134,     0,   132,   363,     0,     0,    92,     0,     0,   439,
-     105,   109,   111,   107,   115,   106,     0,   121,    97,     0,
-      95,     0,     2,     8,     9,     4,     5,     6,     7,    11,
-      10,     0,     0,     0,   169,    37,    36,    38,    35,     3,
-      13,    31,    15,    20,    21,     0,     0,    25,     0,    39,
-       0,    43,    46,    49,    54,    57,    59,    61,    63,    65,
-      67,    69,     0,    29,     0,   164,     0,     0,   131,     0,
-       0,     0,     0,     0,   367,    90,    93,     0,     0,   419,
-       0,     0,     0,     0,     0,     0,     0,     0,   391,   400,
-     404,    39,    72,    85,     0,   380,     0,   124,   383,   402,
-     382,   381,     0,   384,   385,   386,   387,   388,   389,   108,
-       0,   116,     0,   375,   123,     0,     0,    99,     0,    96,
-      32,    33,     0,    17,    18,     0,     0,    23,    22,     0,
-     173,    26,    28,    34,     0,     0,     0,     0,     0,     0,
+       0,   157,   158,   197,   195,   198,   196,   199,   156,   210,
+     200,   201,   208,   209,   206,   207,   204,   205,   202,   203,
+     183,   226,   227,   228,   229,   230,   231,   244,   245,   246,
+     241,   242,   243,   256,   257,   258,   238,   239,   240,   253,
+     254,   255,   235,   236,   237,   250,   251,   252,   232,   233,
+     234,   247,   248,   249,   211,   212,   213,   259,   260,   261,
+     162,   160,   161,   159,   165,   163,   164,   166,   172,   185,
+     168,   169,   167,   170,   171,   173,   179,   180,   181,   182,
+     174,   175,   176,   177,   178,   214,   215,   216,   271,   272,
+     273,   217,   218,   219,   283,   284,   285,   220,   221,   222,
+     295,   296,   297,   223,   224,   225,   307,   308,   309,   134,
+     133,   132,     0,   135,   136,   137,   138,   139,   262,   263,
+     264,   265,   266,   267,   268,   269,   270,   274,   275,   276,
+     277,   278,   279,   280,   281,   282,   286,   287,   288,   289,
+     290,   291,   292,   293,   294,   298,   299,   300,   301,   302,
+     303,   304,   305,   306,   310,   311,   312,   313,   314,   315,
+     316,   317,   318,   320,   319,   321,   322,   323,   324,   325,
+     326,   327,   328,   329,   330,   331,   347,   348,   349,   350,
+     351,   352,   354,   355,   356,   357,   358,   359,   361,   362,
+     365,   366,   367,   369,   370,   332,   333,   353,   360,   371,
+     373,   374,   375,   377,   378,   469,   334,   335,   336,   363,
+     337,   341,   342,   345,   368,   372,   376,   338,   339,   343,
+     344,   364,   340,   346,   379,   380,   381,   383,   385,   387,
+     389,   391,   395,   396,   397,   398,   399,   400,   402,   403,
+     404,   405,   406,   407,   409,   411,   412,   413,   415,   416,
+     393,   401,   408,   417,   419,   420,   421,   423,   424,   382,
+     384,   386,   410,   388,   390,   392,   394,   414,   418,   422,
+     470,   471,   474,   475,   476,   477,   472,   473,   425,   427,
+     428,   429,   431,   432,   433,   435,   436,   437,   439,   440,
+     441,   443,   444,   445,   447,   448,   449,   451,   452,   453,
+     455,   456,   457,   459,   460,   461,   463,   464,   465,   467,
+     468,   426,   430,   434,   438,   442,   450,   454,   458,   446,
+     462,   466,     0,   194,   479,   564,   131,   146,   480,   481,
+     482,     0,   563,     0,   565,     0,   108,   107,     0,   119,
+     124,   153,   152,   150,   154,     0,   147,   149,   155,   129,
+     188,   151,   478,     0,   560,   562,     0,     0,     0,   485,
+       0,     0,    96,    93,     0,   106,     0,   115,   109,   117,
+       0,   118,     0,    94,   125,     0,    99,   148,   130,     0,
+     189,     1,   561,   186,     0,   145,   143,     0,   141,   483,
+       0,     0,    97,     0,     0,   566,   110,   114,   116,   112,
+     120,   111,     0,   126,   102,     0,   100,     0,     2,    12,
+      13,    10,    11,     4,     5,     6,     7,     8,     9,    15,
+      14,     0,     0,     0,   190,    42,    41,    43,    40,     3,
+      17,    36,    19,    24,    25,     0,     0,    29,     0,    44,
+       0,    48,    51,    54,    59,    62,    64,    66,    68,    70,
+      72,    74,     0,    35,    33,     0,   184,     0,     0,   140,
+       0,     0,     0,     0,     0,   487,    95,    98,     0,     0,
+     545,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+     511,   520,   524,    44,    77,    90,     0,   500,     0,   155,
+     129,   503,   522,   502,   501,     0,   504,   505,   526,   506,
+     533,   507,   508,   541,   509,     0,   113,     0,   121,     0,
+     495,   128,     0,     0,   104,     0,   101,    37,    38,     0,
+      21,    22,     0,     0,    27,    26,     0,   194,    30,    32,
+      39,     0,     0,     0,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,    70,   170,   171,     0,   166,    87,   135,
-     133,     0,     0,   373,     0,   371,   366,   368,   430,   429,
-       0,   421,     0,   433,   431,     0,     0,     0,   416,   417,
-     390,     0,    75,    76,    78,    77,    80,    81,    82,    83,
-      84,    79,    74,     0,     0,   405,   401,   403,   118,     0,
-     378,     0,   122,     0,   100,    12,     0,    19,    16,    27,
-      40,    41,    42,    45,    44,    47,    48,    52,    53,    50,
-      51,    55,    56,    58,    60,    62,    64,    66,    68,     0,
-     172,   364,     0,   374,     0,   369,     0,     0,     0,   432,
-       0,   415,     0,   392,    73,    86,   117,   376,     0,    98,
-      14,     0,   370,   372,     0,   424,   423,   426,   398,   411,
-     409,     0,     0,     0,     0,   377,   379,     0,     0,   425,
-       0,     0,   408,     0,     0,   406,     0,     0,     0,   393,
-      71,     0,   427,     0,   398,   397,   399,   413,     0,   395,
-     418,   394,     0,   428,   422,   407,   414,     0,   410,   420,
-     412
+      75,   191,   192,     0,   187,    92,   144,   142,     0,     0,
+     493,     0,   491,   486,   488,   556,   555,     0,   547,     0,
+     559,   557,     0,     0,     0,   540,   543,     0,   510,     0,
+      80,    81,    83,    82,    85,    86,    87,    88,    89,    84,
+      79,     0,     0,   525,   521,   523,   527,   534,   542,   123,
+       0,   498,     0,   127,     0,   105,    16,     0,    23,    20,
+      31,    45,    46,    47,    50,    49,    52,    53,    57,    58,
+      55,    56,    60,    61,    63,    65,    67,    69,    71,    73,
+       0,   193,   484,     0,   494,     0,   489,     0,     0,     0,
+     558,     0,   539,     0,   570,     0,   568,   512,    78,    91,
+     122,   496,     0,   103,    18,     0,   490,   492,     0,   550,
+     549,   552,   518,   535,   531,     0,     0,     0,     0,     0,
+       0,     0,   497,   499,     0,     0,   551,     0,     0,   530,
+       0,     0,   528,     0,     0,     0,     0,   567,   569,   513,
+      76,     0,   553,     0,   518,   517,   519,   537,     0,   515,
+     544,   514,   571,     0,   554,   548,   529,   538,     0,   532,
+     546,   536
 };
 
   /* YYPGOTO[NTERM-NUM].  */
 static const yytype_int16 yypgoto[] =
 {
-    -512,  -512,  -512,  -512,  -512,  -512,  -512,  -512,  -512,  -512,
-    -512,  -512,   -96,  -512,  -263,  -262,  -304,  -264,  -204,  -199,
-    -205,  -197,  -206,  -196,  -512,  -252,  -512,  -282,  -512,  -296,
-    -512,     3,  -512,  -512,  -512,     6,  -512,  -512,  -512,   -29,
-     -23,   -26,  -512,  -512,  -489,  -512,  -512,  -512,  -512,  -118,
-    -512,  -221,  -228,  -512,  -512,     0,  -240,  -512,    13,  -512,
-    -512,  -512,  -328,  -330,  -200,  -271,  -363,  -512,  -273,  -364,
-    -511,  -308,  -512,  -512,  -314,  -309,  -512,  -512,    -2,  -441,
-    -260,  -512,  -512,  -279,  -512,  -512,  -512,  -512,  -512,  -512,
-    -512,  -512,  -512,  -512,  -512,  -512,  -512,    12,  -512,  -512
+    -649,  -649,  -649,  -649,  -649,  -649,  -649,  -649,  -649,  -649,
+    -649,  -649,  -304,  -649,  -373,  -370,  -416,  -379,  -294,  -322,
+    -291,  -295,  -288,  -296,  -649,  -369,  -649,  -393,  -649,  -382,
+    -414,     1,  -649,  -649,  -649,     2,  -649,  -649,  -649,  -114,
+    -109,  -112,  -649,  -649,  -615,  -649,  -649,  -649,  -649,  -196,
+    -649,  -334,  -341,  -649,     6,  -649,     0,  -347,  -649,   -68,
+    -649,  -649,  -649,  -443,  -448,  -287,  -368,  -492,  -649,  -376,
+    -482,  -648,  -415,  -649,  -649,  -427,  -426,  -649,  -649,   -93,
+    -560,  -365,  -649,  -231,  -649,  -386,  -649,  -229,  -649,  -649,
+    -649,  -649,  -227,  -649,  -649,  -649,  -649,  -649,  -649,  -649,
+    -649,   -76,  -649,  -649,  -649,  -649,  -390
 };
 
   /* YYDEFGOTO[NTERM-NUM].  */
 static const yytype_int16 yydefgoto[] =
 {
-      -1,   309,   310,   311,   476,   312,   313,   314,   315,   316,
-     317,   318,   361,   320,   321,   322,   323,   324,   325,   326,
-     327,   328,   329,   330,   331,   362,   499,   363,   463,   364,
-     429,   365,   218,   386,   291,   366,   220,   221,   222,   251,
-     252,   253,   223,   224,   225,   226,   227,   228,   271,   272,
-     229,   230,   231,   232,   268,   333,   264,   234,   235,   236,
-     340,   274,   343,   344,   434,   435,   384,   471,   368,   369,
-     370,   371,   451,   534,   560,   542,   543,   544,   561,   372,
-     373,   374,   545,   533,   375,   546,   567,   376,   377,   512,
-     440,   507,   527,   540,   541,   378,   237,   238,   239,   248
+      -1,   429,   430,   431,   607,   432,   433,   434,   435,   436,
+     437,   438,   483,   440,   441,   442,   443,   444,   445,   446,
+     447,   448,   449,   450,   451,   484,   630,   485,   591,   486,
+     556,   487,   333,   513,   407,   488,   335,   336,   337,   367,
+     368,   369,   338,   339,   340,   341,   342,   343,   387,   388,
+     344,   345,   346,   347,   453,   384,   454,   380,   350,   351,
+     352,   461,   390,   464,   465,   561,   562,   511,   602,   491,
+     492,   493,   494,   579,   671,   700,   679,   680,   681,   701,
+     495,   496,   497,   498,   682,   667,   499,   500,   683,   708,
+     501,   502,   503,   643,   567,   638,   661,   677,   678,   504,
+     353,   354,   355,   364,   505,   645,   646
 };
 
   /* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM.  If
@@ -1163,707 +1383,81 @@
      number is the opposite.  If YYTABLE_NINF, syntax error.  */
 static const yytype_int16 yytable[] =
 {
-     233,   254,   261,   217,   383,   277,   219,   392,   467,   269,
-     513,   332,   431,   437,   245,   411,   412,   468,   287,   470,
-     240,   242,   472,   531,   263,   422,   261,   393,   394,   254,
-     285,   380,   263,   556,   517,   401,   518,   559,   531,   286,
-     334,   263,   559,   379,   381,   247,   -30,   385,   395,   276,
-     413,   414,   396,   341,   241,   246,   243,   445,   473,   447,
-     423,   452,   453,   454,   455,   456,   457,   458,   459,   460,
-     461,   334,   288,   250,   334,   289,   506,   335,   290,   346,
-     462,   469,   426,   336,   338,   428,   398,   475,   528,   529,
-     339,   562,   399,   464,   464,   464,   258,   464,   383,   477,
-     383,   437,   256,   383,   249,   257,   516,   487,   488,   489,
-     490,   388,   464,   261,   389,   465,   566,   479,   504,   341,
-     464,   505,   341,   509,   504,   409,   410,   522,   213,   214,
-     215,   404,   405,   406,   407,   263,   408,   415,   416,   464,
-     511,   464,   537,   437,   483,   484,   508,   485,   486,   467,
-     510,   491,   492,   267,   273,   536,   283,   278,   284,   334,
-     337,   387,   397,   402,   345,   341,   417,   319,   418,   419,
-     421,   420,   424,   427,   433,   438,   439,   441,   270,   442,
-     443,   514,   515,   448,   474,   446,   449,   383,   -29,   478,
-     524,   -24,   547,   503,   554,   568,   450,   500,   520,   538,
-     464,  -396,   467,   521,   358,   390,   391,   548,   552,   549,
-     341,   553,   557,   493,   495,   497,   530,   569,   570,   494,
-     558,   430,   255,   496,   403,   281,   498,   280,   282,   244,
-     262,   530,   502,   523,   525,   555,   383,   233,   319,   564,
-     217,   319,   551,   219,   275,   565,   279,   526,   539,   266,
-     255,     0,   341,     0,   255,   550,   563,     0,     0,     0,
+     349,   332,   334,   370,   377,   470,   348,   471,   472,   510,
+     452,   475,   385,   595,   393,   599,   564,   601,   558,   647,
+     603,   361,   358,   538,   539,   549,   363,   403,   665,   377,
+     520,   521,   370,   696,   401,   379,   379,   699,   536,   537,
+     379,   519,   507,   402,   528,   699,   665,   356,   392,   -34,
+     455,   522,   506,   508,   455,   523,   462,   512,   540,   541,
+     550,   359,   467,   357,   455,   372,   362,   456,   373,   365,
+     604,   600,   459,   457,   404,   439,   525,   405,   460,   669,
+     406,   606,   526,   670,   662,   637,   553,   592,   515,   555,
+     592,   516,   572,   651,   574,   652,   580,   581,   582,   583,
+     584,   585,   586,   587,   588,   589,   663,   534,   650,   535,
+     564,   366,   592,   374,   510,   590,   510,   517,   518,   510,
+     703,   377,   618,   619,   620,   621,   592,   462,   592,   635,
+     462,   593,   636,   610,   383,   592,   530,   707,   640,   635,
+     608,   379,   656,   328,   329,   330,   531,   532,   533,   542,
+     543,   439,   592,   642,   439,   389,   564,   592,   674,   394,
+     673,   614,   615,   622,   623,   595,   616,   617,   399,   400,
+     455,   458,   514,   466,   524,   529,   544,   545,   546,   462,
+     547,   548,   551,   554,   560,   568,   565,   639,   566,   569,
+     570,   641,   575,   577,   573,   576,   605,   -35,   648,   649,
+     -33,   578,   609,   -28,   631,   644,   709,   510,   654,   658,
+     668,   675,   684,   634,   685,   592,  -516,   687,   693,   692,
+     689,   694,   702,   625,   462,   595,   480,   611,   612,   613,
+     439,   439,   439,   439,   439,   439,   439,   439,   439,   439,
+     439,   439,   439,   439,   439,   439,   697,   698,   655,   710,
+     624,   711,   627,   629,   686,   626,   397,   396,   398,   510,
+     628,   664,   659,   360,   557,   695,   705,   657,   706,   386,
+     462,   395,   633,   660,   596,   676,   597,   382,   598,   664,
+     688,   690,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,   691,     0,     0,     0,     0,     0,   555,
+       0,     0,     0,     0,     0,   510,     0,     0,     0,   666,
+     704,     0,     0,     0,     0,     0,     0,     0,   478,     0,
+       0,     0,     0,     0,     0,   377,     0,   666,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,   371,     0,     0,
+       0,     0,     0,   348,     0,   378,     0,     0,     0,     0,
+       0,   348,     0,   349,   332,   334,     0,     0,     0,   348,
+     391,     0,     0,     0,   439,     0,   371,     0,     0,     0,
+     371,     0,   348,     0,     0,     0,   348,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,   342,     0,   383,     0,   367,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,   532,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,   261,     0,   532,     0,   480,   481,
-     482,   319,   319,   319,   319,   319,   319,   319,   319,   319,
-     319,   319,   319,   319,   319,   319,   319,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-     342,   432,     0,   342,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,   367,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,   342,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,   342,     0,     0,     0,     0,     0,     0,     0,     0,
-     367,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,   367,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,   342,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,   367,     0,     0,
-       0,     0,   367,   367,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,   367,     0,     0,
-       0,     0,   262,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,   367,     0,     0,     0,   367,     0,
-       0,     0,     0,   367,     0,     0,     0,   367,     0,     0,
-       0,     0,     0,     0,   265,     0,   367,     1,     2,     3,
-       4,     5,     6,     7,     8,     9,    10,    11,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,    12,
-      13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
-      23,    24,    25,    26,    27,    28,    29,    30,    31,    32,
-      33,    34,    35,    36,    37,    38,    39,    40,    41,    42,
-      43,    44,    45,    46,    47,    48,    49,    50,    51,    52,
-      53,    54,    55,    56,    57,    58,    59,    60,    61,    62,
-      63,    64,    65,    66,    67,    68,    69,    70,    71,    72,
-      73,    74,    75,    76,    77,    78,    79,    80,    81,    82,
-      83,    84,    85,    86,    87,    88,    89,    90,    91,    92,
-      93,    94,    95,    96,    97,    98,    99,   100,   101,   102,
-     103,   104,   105,   106,   107,   108,   109,   110,   111,   112,
-     113,   114,   115,   116,   117,   118,   119,   120,   121,   122,
-     123,   124,   125,   126,   127,   128,   129,   130,   131,   132,
-     133,   134,   135,   136,   137,   138,   139,   140,   141,   142,
-     143,   144,   145,   146,   147,   148,   149,   150,   151,   152,
-     153,   154,   155,   156,   157,   158,   159,   160,   161,   162,
-     163,   164,   165,   166,   167,   168,   169,   170,   171,   172,
-     173,   174,   175,   176,   177,   178,   179,   180,   181,   182,
-     183,   184,   185,   186,   187,   188,   189,   190,   191,   192,
-     193,   194,   195,   196,   197,   198,   199,   200,   201,   202,
-     203,   204,   205,   206,   207,   208,   209,     0,     0,   210,
+     463,     0,     0,     0,   490,     0,   348,     0,     0,     0,
+     489,     0,     0,     0,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,   211,   212,   213,   214,   215,   216,     1,
-       2,     3,     4,     5,     6,     7,     8,     9,    10,    11,
-     347,   348,   349,     0,   350,   351,   352,   353,   354,   355,
-     356,    12,    13,    14,    15,    16,    17,    18,    19,    20,
-      21,    22,    23,    24,    25,    26,    27,    28,    29,    30,
-      31,    32,    33,    34,    35,    36,    37,    38,    39,    40,
-      41,    42,    43,    44,    45,    46,    47,    48,    49,    50,
-      51,    52,    53,    54,    55,    56,    57,    58,    59,    60,
-      61,    62,    63,    64,    65,    66,    67,    68,    69,    70,
-      71,    72,    73,    74,    75,    76,    77,    78,    79,    80,
-      81,    82,    83,    84,    85,    86,    87,    88,    89,    90,
-      91,    92,    93,    94,    95,    96,    97,    98,    99,   100,
-     101,   102,   103,   104,   105,   106,   107,   108,   109,   110,
-     111,   112,   113,   114,   115,   116,   117,   118,   119,   120,
-     121,   122,   123,   124,   125,   126,   127,   128,   129,   130,
-     131,   132,   133,   134,   135,   136,   137,   138,   139,   140,
-     141,   142,   143,   144,   145,   146,   147,   148,   149,   150,
-     151,   152,   153,   154,   155,   156,   157,   158,   159,   160,
-     161,   162,   163,   164,   165,   166,   167,   168,   169,   170,
-     171,   172,   173,   174,   175,   176,   177,   178,   179,   180,
-     181,   182,   183,   184,   185,   186,   187,   188,   189,   190,
-     191,   192,   193,   194,   195,   196,   197,   198,   199,   200,
-     201,   202,   203,   204,   205,   206,   207,   208,   209,   357,
-     292,   210,   293,   294,   295,   296,   297,   298,   299,   300,
-       0,     0,   301,   302,     0,     0,     0,     0,     0,     0,
+       0,   463,   559,     0,   463,     0,     0,   348,   348,     0,
+     348,     0,     0,     0,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,   303,     0,     0,     0,   358,   359,     0,     0,     0,
-       0,   360,   305,   306,   307,   308,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,   211,   212,   213,   214,   215,
-     216,     1,     2,     3,     4,     5,     6,     7,     8,     9,
-      10,    11,   347,   348,   349,     0,   350,   351,   352,   353,
-     354,   355,   356,    12,    13,    14,    15,    16,    17,    18,
-      19,    20,    21,    22,    23,    24,    25,    26,    27,    28,
-      29,    30,    31,    32,    33,    34,    35,    36,    37,    38,
-      39,    40,    41,    42,    43,    44,    45,    46,    47,    48,
-      49,    50,    51,    52,    53,    54,    55,    56,    57,    58,
-      59,    60,    61,    62,    63,    64,    65,    66,    67,    68,
-      69,    70,    71,    72,    73,    74,    75,    76,    77,    78,
-      79,    80,    81,    82,    83,    84,    85,    86,    87,    88,
-      89,    90,    91,    92,    93,    94,    95,    96,    97,    98,
-      99,   100,   101,   102,   103,   104,   105,   106,   107,   108,
-     109,   110,   111,   112,   113,   114,   115,   116,   117,   118,
-     119,   120,   121,   122,   123,   124,   125,   126,   127,   128,
-     129,   130,   131,   132,   133,   134,   135,   136,   137,   138,
-     139,   140,   141,   142,   143,   144,   145,   146,   147,   148,
-     149,   150,   151,   152,   153,   154,   155,   156,   157,   158,
-     159,   160,   161,   162,   163,   164,   165,   166,   167,   168,
-     169,   170,   171,   172,   173,   174,   175,   176,   177,   178,
-     179,   180,   181,   182,   183,   184,   185,   186,   187,   188,
-     189,   190,   191,   192,   193,   194,   195,   196,   197,   198,
-     199,   200,   201,   202,   203,   204,   205,   206,   207,   208,
-     209,   357,   292,   210,   293,   294,   295,   296,   297,   298,
-     299,   300,     0,     0,   301,   302,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,   303,     0,     0,     0,   358,   466,     0,
-       0,     0,     0,   360,   305,   306,   307,   308,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,   211,   212,   213,
-     214,   215,   216,     1,     2,     3,     4,     5,     6,     7,
-       8,     9,    10,    11,   347,   348,   349,     0,   350,   351,
-     352,   353,   354,   355,   356,    12,    13,    14,    15,    16,
-      17,    18,    19,    20,    21,    22,    23,    24,    25,    26,
-      27,    28,    29,    30,    31,    32,    33,    34,    35,    36,
-      37,    38,    39,    40,    41,    42,    43,    44,    45,    46,
-      47,    48,    49,    50,    51,    52,    53,    54,    55,    56,
-      57,    58,    59,    60,    61,    62,    63,    64,    65,    66,
-      67,    68,    69,    70,    71,    72,    73,    74,    75,    76,
-      77,    78,    79,    80,    81,    82,    83,    84,    85,    86,
-      87,    88,    89,    90,    91,    92,    93,    94,    95,    96,
-      97,    98,    99,   100,   101,   102,   103,   104,   105,   106,
-     107,   108,   109,   110,   111,   112,   113,   114,   115,   116,
-     117,   118,   119,   120,   121,   122,   123,   124,   125,   126,
-     127,   128,   129,   130,   131,   132,   133,   134,   135,   136,
-     137,   138,   139,   140,   141,   142,   143,   144,   145,   146,
-     147,   148,   149,   150,   151,   152,   153,   154,   155,   156,
-     157,   158,   159,   160,   161,   162,   163,   164,   165,   166,
-     167,   168,   169,   170,   171,   172,   173,   174,   175,   176,
-     177,   178,   179,   180,   181,   182,   183,   184,   185,   186,
-     187,   188,   189,   190,   191,   192,   193,   194,   195,   196,
-     197,   198,   199,   200,   201,   202,   203,   204,   205,   206,
-     207,   208,   209,   357,   292,   210,   293,   294,   295,   296,
-     297,   298,   299,   300,     0,     0,   301,   302,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,   303,     0,     0,     0,   358,
-       0,     0,     0,     0,     0,   360,   305,   306,   307,   308,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,   211,
-     212,   213,   214,   215,   216,     1,     2,     3,     4,     5,
-       6,     7,     8,     9,    10,    11,   347,   348,   349,     0,
-     350,   351,   352,   353,   354,   355,   356,    12,    13,    14,
-      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
-      25,    26,    27,    28,    29,    30,    31,    32,    33,    34,
-      35,    36,    37,    38,    39,    40,    41,    42,    43,    44,
-      45,    46,    47,    48,    49,    50,    51,    52,    53,    54,
-      55,    56,    57,    58,    59,    60,    61,    62,    63,    64,
-      65,    66,    67,    68,    69,    70,    71,    72,    73,    74,
-      75,    76,    77,    78,    79,    80,    81,    82,    83,    84,
-      85,    86,    87,    88,    89,    90,    91,    92,    93,    94,
-      95,    96,    97,    98,    99,   100,   101,   102,   103,   104,
-     105,   106,   107,   108,   109,   110,   111,   112,   113,   114,
-     115,   116,   117,   118,   119,   120,   121,   122,   123,   124,
-     125,   126,   127,   128,   129,   130,   131,   132,   133,   134,
-     135,   136,   137,   138,   139,   140,   141,   142,   143,   144,
-     145,   146,   147,   148,   149,   150,   151,   152,   153,   154,
-     155,   156,   157,   158,   159,   160,   161,   162,   163,   164,
-     165,   166,   167,   168,   169,   170,   171,   172,   173,   174,
-     175,   176,   177,   178,   179,   180,   181,   182,   183,   184,
-     185,   186,   187,   188,   189,   190,   191,   192,   193,   194,
-     195,   196,   197,   198,   199,   200,   201,   202,   203,   204,
-     205,   206,   207,   208,   209,   357,   292,   210,   293,   294,
-     295,   296,   297,   298,   299,   300,     0,     0,   301,   302,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,   303,     0,     0,
-       0,   278,     0,     0,     0,     0,     0,   360,   305,   306,
-     307,   308,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,   211,   212,   213,   214,   215,   216,     1,     2,     3,
-       4,     5,     6,     7,     8,     9,    10,    11,   347,   348,
-     349,     0,   350,   351,   352,   353,   354,   355,   356,    12,
-      13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
-      23,    24,    25,    26,    27,    28,    29,    30,    31,    32,
-      33,    34,    35,    36,    37,    38,    39,    40,    41,    42,
-      43,    44,    45,    46,    47,    48,    49,    50,    51,    52,
-      53,    54,    55,    56,    57,    58,    59,    60,    61,    62,
-      63,    64,    65,    66,    67,    68,    69,    70,    71,    72,
-      73,    74,    75,    76,    77,    78,    79,    80,    81,    82,
-      83,    84,    85,    86,    87,    88,    89,    90,    91,    92,
-      93,    94,    95,    96,    97,    98,    99,   100,   101,   102,
-     103,   104,   105,   106,   107,   108,   109,   110,   111,   112,
-     113,   114,   115,   116,   117,   118,   119,   120,   121,   122,
-     123,   124,   125,   126,   127,   128,   129,   130,   131,   132,
-     133,   134,   135,   136,   137,   138,   139,   140,   141,   142,
-     143,   144,   145,   146,   147,   148,   149,   150,   151,   152,
-     153,   154,   155,   156,   157,   158,   159,   160,   161,   162,
-     163,   164,   165,   166,   167,   168,   169,   170,   171,   172,
-     173,   174,   175,   176,   177,   178,   179,   180,   181,   182,
-     183,   184,   185,   186,   187,   188,   189,   190,   191,   192,
-     193,   194,   195,   196,   197,   198,   199,   200,   201,   202,
-     203,   204,   205,   206,   207,   208,   209,   357,   292,   210,
-     293,   294,   295,   296,   297,   298,   299,   300,     0,     0,
-     301,   302,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,   303,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,   360,
-     305,   306,   307,   308,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,   211,   212,   213,   214,   215,   216,     1,
-       2,     3,     4,     5,     6,     7,     8,     9,    10,    11,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,    12,    13,    14,    15,    16,    17,    18,    19,    20,
-      21,    22,    23,    24,    25,    26,    27,    28,    29,    30,
-      31,    32,    33,    34,    35,    36,    37,    38,    39,    40,
-      41,    42,    43,    44,    45,    46,    47,    48,    49,    50,
-      51,    52,    53,    54,    55,    56,    57,    58,    59,    60,
-      61,    62,    63,    64,    65,    66,    67,    68,    69,    70,
-      71,    72,    73,    74,    75,    76,    77,    78,    79,    80,
-      81,    82,    83,    84,    85,    86,    87,    88,    89,    90,
-      91,    92,    93,    94,    95,    96,    97,    98,    99,   100,
-     101,   102,   103,   104,   105,   106,   107,   108,   109,   110,
-     111,   112,   113,   114,   115,   116,   117,   118,   119,   120,
-     121,   122,   123,   124,   125,   126,   127,   128,   129,   130,
-     131,   132,   133,   134,   135,   136,   137,   138,   139,   140,
-     141,   142,   143,   144,   145,   146,   147,   148,   149,   150,
-     151,   152,   153,   154,   155,   156,   157,   158,   159,   160,
-     161,   162,   163,   164,   165,   166,   167,   168,   169,   170,
-     171,   172,   173,   174,   175,   176,   177,   178,   179,   180,
-     181,   182,   183,   184,   185,   186,   187,   188,   189,   190,
-     191,   192,   193,   194,   195,   196,   197,   198,   199,   200,
-     201,   202,   203,   204,   205,   206,   207,   208,   209,     0,
-     292,   210,   293,   294,   295,   296,   297,   298,   299,   300,
-       0,     0,   301,   302,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,   303,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,   360,   305,   306,   307,   308,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,   211,   212,   213,   214,   215,
-     216,     1,     2,     3,     4,     5,     6,     7,     8,     9,
-      10,    11,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,    12,    13,    14,    15,    16,    17,    18,
-      19,    20,    21,    22,    23,    24,    25,    26,    27,    28,
-      29,    30,    31,    32,    33,    34,    35,    36,    37,    38,
-      39,    40,    41,    42,    43,    44,    45,    46,    47,    48,
-      49,    50,    51,    52,    53,    54,    55,    56,    57,    58,
-      59,    60,    61,    62,    63,    64,    65,    66,    67,    68,
-      69,    70,    71,    72,    73,    74,    75,    76,    77,    78,
-      79,    80,    81,    82,    83,    84,    85,    86,    87,    88,
-      89,    90,    91,    92,    93,    94,    95,    96,    97,    98,
-      99,   100,   101,   102,   103,   104,   105,   106,   107,   108,
-     109,   110,   111,   112,   113,   114,   115,   116,   117,   118,
-     119,   120,   121,   122,   123,   124,   125,   126,   127,   128,
-     129,   130,   131,   132,   133,   134,   135,   136,   137,   138,
-     139,   140,   141,   142,   143,   144,   145,   146,   147,   148,
-     149,   150,   151,   152,   153,   154,   155,   156,   157,   158,
-     159,   160,   161,   162,   163,   164,   165,   166,   167,   168,
-     169,   170,   171,   172,   173,   174,   175,   176,   177,   178,
-     179,   180,   181,   182,   183,   184,   185,   186,   187,   188,
-     189,   190,   191,   192,   193,   194,   195,   196,   197,   198,
-     199,   200,   201,   202,   203,   204,   205,   206,   207,   208,
-     209,     0,     0,   210,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,   490,     0,     0,     0,     0,
+       0,   489,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,   463,     0,     0,     0,     0,     0,   348,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     1,     2,     3,     4,     5,     6,     7,     8,     9,
-      10,    11,     0,     0,     0,     0,     0,   211,   212,   213,
-     214,   215,   216,    12,    13,    14,    15,    16,    17,    18,
-      19,    20,    21,    22,    23,    24,    25,    26,    27,    28,
-      29,    30,    31,    32,    33,    34,    35,    36,    37,    38,
-      39,    40,    41,    42,    43,    44,    45,    46,    47,    48,
-      49,    50,    51,    52,    53,    54,    55,    56,    57,    58,
-      59,    60,    61,    62,    63,    64,    65,    66,    67,    68,
-      69,    70,    71,    72,    73,    74,    75,    76,    77,    78,
-      79,    80,    81,    82,    83,    84,    85,    86,    87,    88,
-      89,    90,    91,    92,    93,    94,    95,    96,    97,    98,
-      99,   100,   101,   102,   103,   104,   105,   106,   107,   108,
-     109,   110,   111,   112,   113,   114,   115,   116,   117,   118,
-     119,   120,   121,   122,   123,   124,   125,   126,   127,   128,
-     129,   130,   131,   132,   133,   134,   135,   136,   137,   138,
-     139,   140,   141,   142,   143,   144,   145,   146,   147,   148,
-     149,   150,   151,   152,   153,   154,   155,   156,   157,   158,
-     159,   160,   161,   162,   163,   164,   165,   166,   167,   168,
-     169,   170,   171,   172,   173,   174,   175,   176,   177,   178,
-     179,   180,   181,   182,   183,   184,   185,   186,   187,   188,
-     189,   190,   191,   192,   193,   194,   195,   196,   197,   198,
-     199,   200,   201,   202,   203,   204,   205,   206,   207,   208,
-     209,     0,   292,   210,   293,   294,   295,   296,   297,   298,
-     299,   300,     0,     0,   301,   302,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,   463,     0,
+       0,     0,     0,     0,   348,     0,     0,   490,     0,     0,
+       0,     0,     0,   489,     0,     0,     0,     0,     0,   490,
+       0,     0,     0,     0,     0,   489,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,   303,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,   305,   306,   307,   308,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,   211,   212,   213,
-     214,   215,     1,     2,     3,     4,     5,     6,     7,     8,
-       9,    10,    11,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,    12,    13,    14,    15,    16,    17,
-      18,    19,    20,    21,    22,    23,    24,    25,    26,    27,
-      28,    29,    30,    31,    32,    33,    34,    35,    36,    37,
-      38,    39,    40,    41,    42,    43,    44,    45,    46,    47,
-      48,    49,    50,    51,    52,    53,    54,    55,    56,    57,
-      58,    59,    60,    61,    62,    63,    64,    65,    66,    67,
-      68,    69,    70,    71,    72,    73,    74,    75,    76,    77,
-      78,    79,    80,    81,    82,    83,    84,    85,    86,    87,
-      88,    89,    90,    91,    92,    93,    94,    95,    96,    97,
-      98,    99,   100,   101,   102,   103,   104,   105,   106,   107,
-     108,   109,   110,   111,   112,   113,   114,   115,   116,   117,
-     118,   119,   120,   121,   122,   123,   124,   125,   126,   127,
-     128,   129,   130,   131,   132,   133,   134,   135,   136,   137,
-     138,   139,   140,   141,   142,   143,   144,   145,   146,   147,
-     148,   149,   150,   151,   152,   153,   154,   155,   156,   157,
-     158,   159,   160,   161,   162,   163,   164,   165,   166,   167,
-     168,   169,   170,   171,   172,   173,   174,   175,   176,   177,
-     178,   179,   180,   181,   182,   183,   184,   185,   186,   187,
-     188,   189,   190,   191,   192,   193,   194,   195,   196,   197,
-     198,   199,   200,   201,   202,   203,   204,   205,   206,   207,
-     208,   209,     0,   259,   210,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,   463,     0,     0,     0,     0,     0,
+     348,     0,     0,     0,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,   260,     1,     2,     3,     4,     5,
-       6,     7,     8,     9,    10,    11,     0,     0,   211,   212,
-     213,   214,   215,     0,     0,     0,     0,    12,    13,    14,
-      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
-      25,    26,    27,    28,    29,    30,    31,    32,    33,    34,
-      35,    36,    37,    38,    39,    40,    41,    42,    43,    44,
-      45,    46,    47,    48,    49,    50,    51,    52,    53,    54,
-      55,    56,    57,    58,    59,    60,    61,    62,    63,    64,
-      65,    66,    67,    68,    69,    70,    71,    72,    73,    74,
-      75,    76,    77,    78,    79,    80,    81,    82,    83,    84,
-      85,    86,    87,    88,    89,    90,    91,    92,    93,    94,
-      95,    96,    97,    98,    99,   100,   101,   102,   103,   104,
-     105,   106,   107,   108,   109,   110,   111,   112,   113,   114,
-     115,   116,   117,   118,   119,   120,   121,   122,   123,   124,
-     125,   126,   127,   128,   129,   130,   131,   132,   133,   134,
-     135,   136,   137,   138,   139,   140,   141,   142,   143,   144,
-     145,   146,   147,   148,   149,   150,   151,   152,   153,   154,
-     155,   156,   157,   158,   159,   160,   161,   162,   163,   164,
-     165,   166,   167,   168,   169,   170,   171,   172,   173,   174,
-     175,   176,   177,   178,   179,   180,   181,   182,   183,   184,
-     185,   186,   187,   188,   189,   190,   191,   192,   193,   194,
-     195,   196,   197,   198,   199,   200,   201,   202,   203,   204,
-     205,   206,   207,   208,   209,     0,     0,   210,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,   436,     0,     1,     2,     3,     4,     5,     6,
-       7,     8,     9,    10,    11,     0,     0,     0,     0,     0,
-       0,   211,   212,   213,   214,   215,    12,    13,    14,    15,
-      16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
-      26,    27,    28,    29,    30,    31,    32,    33,    34,    35,
-      36,    37,    38,    39,    40,    41,    42,    43,    44,    45,
-      46,    47,    48,    49,    50,    51,    52,    53,    54,    55,
-      56,    57,    58,    59,    60,    61,    62,    63,    64,    65,
-      66,    67,    68,    69,    70,    71,    72,    73,    74,    75,
-      76,    77,    78,    79,    80,    81,    82,    83,    84,    85,
-      86,    87,    88,    89,    90,    91,    92,    93,    94,    95,
-      96,    97,    98,    99,   100,   101,   102,   103,   104,   105,
-     106,   107,   108,   109,   110,   111,   112,   113,   114,   115,
-     116,   117,   118,   119,   120,   121,   122,   123,   124,   125,
-     126,   127,   128,   129,   130,   131,   132,   133,   134,   135,
-     136,   137,   138,   139,   140,   141,   142,   143,   144,   145,
-     146,   147,   148,   149,   150,   151,   152,   153,   154,   155,
-     156,   157,   158,   159,   160,   161,   162,   163,   164,   165,
-     166,   167,   168,   169,   170,   171,   172,   173,   174,   175,
-     176,   177,   178,   179,   180,   181,   182,   183,   184,   185,
-     186,   187,   188,   189,   190,   191,   192,   193,   194,   195,
-     196,   197,   198,   199,   200,   201,   202,   203,   204,   205,
-     206,   207,   208,   209,     0,     0,   210,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,   501,     0,     1,     2,     3,     4,     5,     6,     7,
-       8,     9,    10,    11,     0,     0,     0,     0,     0,     0,
-     211,   212,   213,   214,   215,    12,    13,    14,    15,    16,
-      17,    18,    19,    20,    21,    22,    23,    24,    25,    26,
-      27,    28,    29,    30,    31,    32,    33,    34,    35,    36,
-      37,    38,    39,    40,    41,    42,    43,    44,    45,    46,
-      47,    48,    49,    50,    51,    52,    53,    54,    55,    56,
-      57,    58,    59,    60,    61,    62,    63,    64,    65,    66,
-      67,    68,    69,    70,    71,    72,    73,    74,    75,    76,
-      77,    78,    79,    80,    81,    82,    83,    84,    85,    86,
-      87,    88,    89,    90,    91,    92,    93,    94,    95,    96,
-      97,    98,    99,   100,   101,   102,   103,   104,   105,   106,
-     107,   108,   109,   110,   111,   112,   113,   114,   115,   116,
-     117,   118,   119,   120,   121,   122,   123,   124,   125,   126,
-     127,   128,   129,   130,   131,   132,   133,   134,   135,   136,
-     137,   138,   139,   140,   141,   142,   143,   144,   145,   146,
-     147,   148,   149,   150,   151,   152,   153,   154,   155,   156,
-     157,   158,   159,   160,   161,   162,   163,   164,   165,   166,
-     167,   168,   169,   170,   171,   172,   173,   174,   175,   176,
-     177,   178,   179,   180,   181,   182,   183,   184,   185,   186,
-     187,   188,   189,   190,   191,   192,   193,   194,   195,   196,
-     197,   198,   199,   200,   201,   202,   203,   204,   205,   206,
-     207,   208,   209,     0,     0,   210,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-     519,     0,     1,     2,     3,     4,     5,     6,     7,     8,
-       9,    10,    11,     0,     0,     0,     0,     0,     0,   211,
-     212,   213,   214,   215,    12,    13,    14,    15,    16,    17,
-      18,    19,    20,    21,    22,    23,    24,    25,    26,    27,
-      28,    29,    30,    31,    32,    33,    34,    35,    36,    37,
-      38,    39,    40,    41,    42,    43,    44,    45,    46,    47,
-      48,    49,    50,    51,    52,    53,    54,    55,    56,    57,
-      58,    59,    60,    61,    62,    63,    64,    65,    66,    67,
-      68,    69,    70,    71,    72,    73,    74,    75,    76,    77,
-      78,    79,    80,    81,    82,    83,    84,    85,    86,    87,
-      88,    89,    90,    91,    92,    93,    94,    95,    96,    97,
-      98,    99,   100,   101,   102,   103,   104,   105,   106,   107,
-     108,   109,   110,   111,   112,   113,   114,   115,   116,   117,
-     118,   119,   120,   121,   122,   123,   124,   125,   126,   127,
-     128,   129,   130,   131,   132,   133,   134,   135,   136,   137,
-     138,   139,   140,   141,   142,   143,   144,   145,   146,   147,
-     148,   149,   150,   151,   152,   153,   154,   155,   156,   157,
-     158,   159,   160,   161,   162,   163,   164,   165,   166,   167,
-     168,   169,   170,   171,   172,   173,   174,   175,   176,   177,
-     178,   179,   180,   181,   182,   183,   184,   185,   186,   187,
-     188,   189,   190,   191,   192,   193,   194,   195,   196,   197,
-     198,   199,   200,   201,   202,   203,   204,   205,   206,   207,
-     208,   209,     0,     0,   210,     0,     0,     0,     4,     5,
-       6,     7,     8,     9,    10,    11,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,    13,    14,
-      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
-      25,    26,    27,    28,    29,    30,    31,    32,    33,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,   211,   212,
-     213,   214,   215,    48,    49,    50,    51,    52,    53,    54,
-      55,    56,    57,    58,    59,     0,     0,     0,     0,     0,
-      65,    66,    67,    68,    69,    70,    71,    72,    73,    74,
-      75,    76,    77,    78,    79,    80,    81,    82,    83,    84,
-      85,    86,    87,    88,    89,    90,    91,    92,    93,    94,
-      95,    96,    97,    98,    99,   100,   101,   102,   103,   104,
-     105,   106,   107,   108,   109,   110,   111,   112,   113,   114,
-     115,   116,   117,   118,   119,   120,   121,   122,   123,   124,
-     125,   126,   127,   128,   129,   130,   131,   132,   133,   134,
-     135,   136,   137,   138,   139,   140,   141,   142,   143,   144,
-     145,   146,   147,   148,   149,   150,   151,   152,   153,   154,
-     155,   156,   157,   158,   159,   160,   161,   162,   163,   164,
-     165,   166,   167,   168,   169,   170,   171,   172,   173,   174,
-     175,   176,   177,   178,   179,   180,   181,   182,   183,   184,
-     185,   186,   187,   188,   189,   190,   191,   192,   193,   194,
-     195,   196,   197,   198,   199,   200,   201,   202,   203,   204,
-     205,   206,   207,   208,   209,     0,   292,   210,   293,   294,
-     295,   296,   297,   298,   299,   300,     0,     0,   301,   302,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,   303,     0,     0,
-       0,   382,   535,     0,     0,     0,     0,     0,   305,   306,
-     307,   308,     4,     5,     6,     7,     8,     9,    10,    11,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,    13,    14,    15,    16,    17,    18,    19,    20,
-      21,    22,    23,    24,    25,    26,    27,    28,    29,    30,
-      31,    32,    33,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,    48,    49,    50,
-      51,    52,    53,    54,    55,    56,    57,    58,    59,     0,
-       0,     0,     0,     0,    65,    66,    67,    68,    69,    70,
-      71,    72,    73,    74,    75,    76,    77,    78,    79,    80,
-      81,    82,    83,    84,    85,    86,    87,    88,    89,    90,
-      91,    92,    93,    94,    95,    96,    97,    98,    99,   100,
-     101,   102,   103,   104,   105,   106,   107,   108,   109,   110,
-     111,   112,   113,   114,   115,   116,   117,   118,   119,   120,
-     121,   122,   123,   124,   125,   126,   127,   128,   129,   130,
-     131,   132,   133,   134,   135,   136,   137,   138,   139,   140,
-     141,   142,   143,   144,   145,   146,   147,   148,   149,   150,
-     151,   152,   153,   154,   155,   156,   157,   158,   159,   160,
-     161,   162,   163,   164,   165,   166,   167,   168,   169,   170,
-     171,   172,   173,   174,   175,   176,   177,   178,   179,   180,
-     181,   182,   183,   184,   185,   186,   187,   188,   189,   190,
-     191,   192,   193,   194,   195,   196,   197,   198,   199,   200,
-     201,   202,   203,   204,   205,   206,   207,   208,   209,     0,
-     292,   210,   293,   294,   295,   296,   297,   298,   299,   300,
-       0,     0,   301,   302,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,   303,     0,     0,   304,     0,     0,     0,     0,     0,
-       0,     0,   305,   306,   307,   308,     4,     5,     6,     7,
-       8,     9,    10,    11,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,    13,    14,    15,    16,
-      17,    18,    19,    20,    21,    22,    23,    24,    25,    26,
-      27,    28,    29,    30,    31,    32,    33,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,    48,    49,    50,    51,    52,    53,    54,    55,    56,
-      57,    58,    59,     0,     0,     0,     0,     0,    65,    66,
-      67,    68,    69,    70,    71,    72,    73,    74,    75,    76,
-      77,    78,    79,    80,    81,    82,    83,    84,    85,    86,
-      87,    88,    89,    90,    91,    92,    93,    94,    95,    96,
-      97,    98,    99,   100,   101,   102,   103,   104,   105,   106,
-     107,   108,   109,   110,   111,   112,   113,   114,   115,   116,
-     117,   118,   119,   120,   121,   122,   123,   124,   125,   126,
-     127,   128,   129,   130,   131,   132,   133,   134,   135,   136,
-     137,   138,   139,   140,   141,   142,   143,   144,   145,   146,
-     147,   148,   149,   150,   151,   152,   153,   154,   155,   156,
-     157,   158,   159,   160,   161,   162,   163,   164,   165,   166,
-     167,   168,   169,   170,   171,   172,   173,   174,   175,   176,
-     177,   178,   179,   180,   181,   182,   183,   184,   185,   186,
-     187,   188,   189,   190,   191,   192,   193,   194,   195,   196,
-     197,   198,   199,   200,   201,   202,   203,   204,   205,   206,
-     207,   208,   209,     0,   292,   210,   293,   294,   295,   296,
-     297,   298,   299,   300,     0,     0,   301,   302,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,   303,     0,     0,     0,   382,
-       0,     0,     0,     0,     0,     0,   305,   306,   307,   308,
-       4,     5,     6,     7,     8,     9,    10,    11,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-      13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
-      23,    24,    25,    26,    27,    28,    29,    30,    31,    32,
-      33,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,    48,    49,    50,    51,    52,
-      53,    54,    55,    56,    57,    58,    59,     0,     0,     0,
-       0,     0,    65,    66,    67,    68,    69,    70,    71,    72,
-      73,    74,    75,    76,    77,    78,    79,    80,    81,    82,
-      83,    84,    85,    86,    87,    88,    89,    90,    91,    92,
-      93,    94,    95,    96,    97,    98,    99,   100,   101,   102,
-     103,   104,   105,   106,   107,   108,   109,   110,   111,   112,
-     113,   114,   115,   116,   117,   118,   119,   120,   121,   122,
-     123,   124,   125,   126,   127,   128,   129,   130,   131,   132,
-     133,   134,   135,   136,   137,   138,   139,   140,   141,   142,
-     143,   144,   145,   146,   147,   148,   149,   150,   151,   152,
-     153,   154,   155,   156,   157,   158,   159,   160,   161,   162,
-     163,   164,   165,   166,   167,   168,   169,   170,   171,   172,
-     173,   174,   175,   176,   177,   178,   179,   180,   181,   182,
-     183,   184,   185,   186,   187,   188,   189,   190,   191,   192,
-     193,   194,   195,   196,   197,   198,   199,   200,   201,   202,
-     203,   204,   205,   206,   207,   208,   209,     0,   292,   210,
-     293,   294,   295,   296,   297,   298,   299,   300,     0,     0,
-     301,   302,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,   303,
-       0,     0,   425,     0,     0,     0,     0,     0,     0,     0,
-     305,   306,   307,   308,     4,     5,     6,     7,     8,     9,
-      10,    11,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,    13,    14,    15,    16,    17,    18,
-      19,    20,    21,    22,    23,    24,    25,    26,    27,    28,
-      29,    30,    31,    32,    33,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,    48,
-      49,    50,    51,    52,    53,    54,    55,    56,    57,    58,
-      59,     0,     0,     0,     0,     0,    65,    66,    67,    68,
-      69,    70,    71,    72,    73,    74,    75,    76,    77,    78,
-      79,    80,    81,    82,    83,    84,    85,    86,    87,    88,
-      89,    90,    91,    92,    93,    94,    95,    96,    97,    98,
-      99,   100,   101,   102,   103,   104,   105,   106,   107,   108,
-     109,   110,   111,   112,   113,   114,   115,   116,   117,   118,
-     119,   120,   121,   122,   123,   124,   125,   126,   127,   128,
-     129,   130,   131,   132,   133,   134,   135,   136,   137,   138,
-     139,   140,   141,   142,   143,   144,   145,   146,   147,   148,
-     149,   150,   151,   152,   153,   154,   155,   156,   157,   158,
-     159,   160,   161,   162,   163,   164,   165,   166,   167,   168,
-     169,   170,   171,   172,   173,   174,   175,   176,   177,   178,
-     179,   180,   181,   182,   183,   184,   185,   186,   187,   188,
-     189,   190,   191,   192,   193,   194,   195,   196,   197,   198,
-     199,   200,   201,   202,   203,   204,   205,   206,   207,   208,
-     209,     0,   292,   210,   293,   294,   295,   296,   297,   298,
-     299,   300,     0,     0,   301,   302,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,   303,     4,     5,     6,     7,     8,     9,
-      10,    11,     0,   444,   305,   306,   307,   308,     0,     0,
-       0,     0,     0,     0,    13,    14,    15,    16,    17,    18,
-      19,    20,    21,    22,    23,    24,    25,    26,    27,    28,
-      29,    30,    31,    32,    33,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,    48,
-      49,    50,    51,    52,    53,    54,    55,    56,    57,    58,
-      59,     0,     0,     0,     0,     0,    65,    66,    67,    68,
-      69,    70,    71,    72,    73,    74,    75,    76,    77,    78,
-      79,    80,    81,    82,    83,    84,    85,    86,    87,    88,
-      89,    90,    91,    92,    93,    94,    95,    96,    97,    98,
-      99,   100,   101,   102,   103,   104,   105,   106,   107,   108,
-     109,   110,   111,   112,   113,   114,   115,   116,   117,   118,
-     119,   120,   121,   122,   123,   124,   125,   126,   127,   128,
-     129,   130,   131,   132,   133,   134,   135,   136,   137,   138,
-     139,   140,   141,   142,   143,   144,   145,   146,   147,   148,
-     149,   150,   151,   152,   153,   154,   155,   156,   157,   158,
-     159,   160,   161,   162,   163,   164,   165,   166,   167,   168,
-     169,   170,   171,   172,   173,   174,   175,   176,   177,   178,
-     179,   180,   181,   182,   183,   184,   185,   186,   187,   188,
-     189,   190,   191,   192,   193,   194,   195,   196,   197,   198,
-     199,   200,   201,   202,   203,   204,   205,   206,   207,   208,
-     209,     0,   292,   210,   293,   294,   295,   296,   297,   298,
-     299,   300,     0,     0,   301,   302,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,   303,     4,     5,     6,     7,     8,     9,
-      10,    11,     0,     0,   305,   306,   307,   308,     0,     0,
-       0,     0,     0,     0,    13,    14,    15,    16,    17,    18,
-      19,    20,    21,    22,    23,    24,    25,    26,    27,    28,
-      29,    30,    31,    32,    33,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,    48,
-      49,    50,    51,    52,    53,    54,    55,    56,    57,    58,
-      59,     0,     0,     0,     0,     0,    65,    66,    67,    68,
-      69,    70,    71,    72,    73,    74,    75,    76,    77,    78,
-      79,    80,    81,    82,    83,    84,    85,    86,    87,    88,
-      89,    90,    91,    92,    93,    94,    95,    96,    97,    98,
-      99,   100,   101,   102,   103,   104,   105,   106,   107,   108,
-     109,   110,   111,   112,   113,   114,   115,   116,   117,   118,
-     119,   120,   121,   122,   123,   124,   125,   126,   127,   128,
-     129,   130,   131,   132,   133,   134,   135,   136,   137,   138,
-     139,   140,   141,   142,   143,   144,   145,   146,   147,   148,
-     149,   150,   151,   152,   153,   154,   155,   156,   157,   158,
-     159,   160,   161,   162,   163,   164,   165,   166,   167,   168,
-     169,   170,   171,   172,   173,   174,   175,   176,   177,   178,
-     179,   180,   181,   182,   183,   184,   185,   186,   187,   188,
-     189,   190,   191,   192,   193,   194,   195,   196,   197,   198,
-     199,   200,   201,   202,   203,   204,   205,   206,   207,   208,
-     400,     0,   292,   210,   293,   294,   295,   296,   297,   298,
-     299,   300,     0,     0,   301,   302,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,   303,     4,     5,     6,     7,     8,     9,
-      10,    11,     0,     0,   305,   306,   307,   308,     0,     0,
-       0,     0,     0,     0,    13,    14,    15,    16,    17,    18,
-      19,    20,    21,    22,    23,    24,    25,    26,    27,    28,
-      29,    30,    31,    32,    33,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,    48,
-      49,    50,    51,    52,    53,    54,    55,    56,    57,    58,
-      59,     0,     0,     0,     0,     0,    65,    66,    67,    68,
-      69,    70,    71,    72,    73,    74,    75,    76,    77,    78,
-      79,    80,    81,    82,    83,    84,    85,    86,    87,    88,
-      89,    90,    91,    92,    93,    94,    95,    96,    97,    98,
-      99,   100,   101,   102,   103,   104,   105,   106,   107,   108,
-     109,   110,   111,   112,   113,   114,   115,   116,   117,   118,
-     119,   120,   121,   122,   123,   124,   125,   126,   127,   128,
-     129,   130,   131,   132,   133,   134,   135,   136,   137,   138,
-     139,   140,   141,   142,   143,   144,   145,   146,   147,   148,
-     149,   150,   151,   152,   153,   154,   155,   156,   157,   158,
-     159,   160,   161,   162,   163,   164,   165,   166,   167,   168,
-     169,   170,   171,   172,   173,   174,   175,   176,   177,   178,
-     179,   180,   181,   182,   183,   184,   185,   186,   187,   188,
-     189,   190,   191,   192,   193,   194,   195,   196,   197,   198,
-     199,   200,   201,   202,   203,   204,   205,   206,   207,   208,
-     209,     0,     0,   210
-};
-
-static const yytype_int16 yycheck[] =
-{
-       0,   222,   230,     0,   286,   245,     0,   303,   372,    55,
-     451,   263,   340,   343,   224,   238,   239,   380,   258,   382,
-     255,   224,   385,   512,   257,   243,   254,   236,   237,   250,
-     255,   264,   257,   544,   260,   317,   262,   548,   527,   264,
-     257,   257,   553,   283,   284,   265,   255,   264,   257,   265,
-     273,   274,   261,   274,   255,   265,   259,   353,   386,   355,
-     278,   245,   246,   247,   248,   249,   250,   251,   252,   253,
-     254,   257,   259,   262,   257,   262,   440,   256,   265,   265,
-     264,   264,   334,   262,   256,   337,   256,   256,   256,   256,
-     262,   256,   262,   262,   262,   262,   224,   262,   380,   395,
-     382,   431,   262,   385,   256,   265,   469,   411,   412,   413,
-     414,   262,   262,   341,   265,   265,   557,   399,   262,   340,
-     262,   265,   343,   265,   262,   234,   235,   265,   281,   282,
-     283,   270,   271,   272,   267,   257,   269,   240,   241,   262,
-     263,   262,   263,   473,   407,   408,   442,   409,   410,   513,
-     446,   415,   416,   225,   259,   518,   224,   259,   224,   257,
-     264,   224,   256,   255,   265,   386,   277,   263,   276,   275,
-     244,   242,   258,   225,   224,   265,   265,   255,   224,   255,
-     265,   463,   464,   263,   224,   255,   255,   469,   255,   224,
-     223,   256,   224,   433,    17,   558,   260,   258,   258,   255,
-     262,   259,   566,   499,   259,   301,   302,   256,   265,   260,
-     431,   256,   259,   417,   419,   421,   512,   265,   260,   418,
-     264,   339,   222,   420,   320,   254,   422,   250,   254,   216,
-     230,   527,   432,   504,   507,   543,   518,   237,   334,   553,
-     237,   337,   538,   237,   244,   554,   248,   507,   527,   237,
-     250,    -1,   473,    -1,   254,   537,   552,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,   274,    -1,   558,    -1,   278,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,   512,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,   532,    -1,   527,    -1,   404,   405,
-     406,   407,   408,   409,   410,   411,   412,   413,   414,   415,
-     416,   417,   418,   419,   420,   421,   422,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-     340,   341,    -1,   343,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,   372,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,   386,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,   431,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-     440,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,   451,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,   473,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,   507,    -1,    -1,
-      -1,    -1,   512,   513,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,   527,    -1,    -1,
-      -1,    -1,   532,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,   544,    -1,    -1,    -1,   548,    -1,
-      -1,    -1,    -1,   553,    -1,    -1,    -1,   557,    -1,    -1,
-      -1,    -1,    -1,    -1,     0,    -1,   566,     3,     4,     5,
-       6,     7,     8,     9,    10,    11,    12,    13,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    25,
+       0,     0,     0,     0,     0,     0,     0,     0,   490,     0,
+       0,     0,     0,   490,   489,     0,     0,   490,     0,   489,
+       0,     0,     0,   489,     0,     0,     0,     0,     0,     0,
+       0,   490,     0,     0,     0,     0,   378,   489,     0,     0,
+       0,     0,   348,     0,     0,     0,     0,     0,     0,     0,
+       0,   490,     0,     0,     0,   490,     0,   489,     0,     0,
+       0,   489,     0,   490,     0,     0,     0,   490,     0,   489,
+       0,     0,     0,   489,     0,     0,     0,   490,     0,     0,
+       0,   381,     0,   489,     1,     2,     3,     4,     5,     6,
+       7,     8,     9,    10,    11,    12,    13,    14,    15,    16,
+      17,    18,    19,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,    20,    21,    22,    23,    24,    25,
       26,    27,    28,    29,    30,    31,    32,    33,    34,    35,
       36,    37,    38,    39,    40,    41,    42,    43,    44,    45,
       46,    47,    48,    49,    50,    51,    52,    53,    54,    55,
@@ -1883,71 +1477,466 @@
      186,   187,   188,   189,   190,   191,   192,   193,   194,   195,
      196,   197,   198,   199,   200,   201,   202,   203,   204,   205,
      206,   207,   208,   209,   210,   211,   212,   213,   214,   215,
-     216,   217,   218,   219,   220,   221,   222,    -1,    -1,   225,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,   279,   280,   281,   282,   283,   284,     3,
-       4,     5,     6,     7,     8,     9,    10,    11,    12,    13,
-      14,    15,    16,    -1,    18,    19,    20,    21,    22,    23,
-      24,    25,    26,    27,    28,    29,    30,    31,    32,    33,
-      34,    35,    36,    37,    38,    39,    40,    41,    42,    43,
-      44,    45,    46,    47,    48,    49,    50,    51,    52,    53,
-      54,    55,    56,    57,    58,    59,    60,    61,    62,    63,
-      64,    65,    66,    67,    68,    69,    70,    71,    72,    73,
-      74,    75,    76,    77,    78,    79,    80,    81,    82,    83,
-      84,    85,    86,    87,    88,    89,    90,    91,    92,    93,
-      94,    95,    96,    97,    98,    99,   100,   101,   102,   103,
-     104,   105,   106,   107,   108,   109,   110,   111,   112,   113,
-     114,   115,   116,   117,   118,   119,   120,   121,   122,   123,
-     124,   125,   126,   127,   128,   129,   130,   131,   132,   133,
-     134,   135,   136,   137,   138,   139,   140,   141,   142,   143,
-     144,   145,   146,   147,   148,   149,   150,   151,   152,   153,
-     154,   155,   156,   157,   158,   159,   160,   161,   162,   163,
-     164,   165,   166,   167,   168,   169,   170,   171,   172,   173,
-     174,   175,   176,   177,   178,   179,   180,   181,   182,   183,
-     184,   185,   186,   187,   188,   189,   190,   191,   192,   193,
-     194,   195,   196,   197,   198,   199,   200,   201,   202,   203,
-     204,   205,   206,   207,   208,   209,   210,   211,   212,   213,
-     214,   215,   216,   217,   218,   219,   220,   221,   222,   223,
-     224,   225,   226,   227,   228,   229,   230,   231,   232,   233,
-      -1,    -1,   236,   237,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,   255,    -1,    -1,    -1,   259,   260,    -1,    -1,    -1,
-      -1,   265,   266,   267,   268,   269,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,   279,   280,   281,   282,   283,
-     284,     3,     4,     5,     6,     7,     8,     9,    10,    11,
-      12,    13,    14,    15,    16,    -1,    18,    19,    20,    21,
-      22,    23,    24,    25,    26,    27,    28,    29,    30,    31,
-      32,    33,    34,    35,    36,    37,    38,    39,    40,    41,
-      42,    43,    44,    45,    46,    47,    48,    49,    50,    51,
-      52,    53,    54,    55,    56,    57,    58,    59,    60,    61,
-      62,    63,    64,    65,    66,    67,    68,    69,    70,    71,
-      72,    73,    74,    75,    76,    77,    78,    79,    80,    81,
-      82,    83,    84,    85,    86,    87,    88,    89,    90,    91,
-      92,    93,    94,    95,    96,    97,    98,    99,   100,   101,
-     102,   103,   104,   105,   106,   107,   108,   109,   110,   111,
-     112,   113,   114,   115,   116,   117,   118,   119,   120,   121,
-     122,   123,   124,   125,   126,   127,   128,   129,   130,   131,
-     132,   133,   134,   135,   136,   137,   138,   139,   140,   141,
-     142,   143,   144,   145,   146,   147,   148,   149,   150,   151,
-     152,   153,   154,   155,   156,   157,   158,   159,   160,   161,
-     162,   163,   164,   165,   166,   167,   168,   169,   170,   171,
-     172,   173,   174,   175,   176,   177,   178,   179,   180,   181,
-     182,   183,   184,   185,   186,   187,   188,   189,   190,   191,
-     192,   193,   194,   195,   196,   197,   198,   199,   200,   201,
-     202,   203,   204,   205,   206,   207,   208,   209,   210,   211,
-     212,   213,   214,   215,   216,   217,   218,   219,   220,   221,
-     222,   223,   224,   225,   226,   227,   228,   229,   230,   231,
-     232,   233,    -1,    -1,   236,   237,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,   255,    -1,    -1,    -1,   259,   260,    -1,
-      -1,    -1,    -1,   265,   266,   267,   268,   269,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,   279,   280,   281,
-     282,   283,   284,     3,     4,     5,     6,     7,     8,     9,
-      10,    11,    12,    13,    14,    15,    16,    -1,    18,    19,
+     216,   217,   218,   219,   220,   221,   222,   223,   224,   225,
+     226,   227,   228,   229,   230,   231,   232,   233,   234,   235,
+     236,   237,   238,   239,   240,   241,   242,   243,   244,   245,
+     246,   247,   248,   249,   250,   251,   252,   253,   254,   255,
+     256,   257,   258,   259,   260,   261,   262,   263,   264,   265,
+     266,   267,   268,   269,   270,   271,   272,   273,   274,   275,
+     276,   277,   278,   279,   280,   281,   282,   283,   284,   285,
+     286,   287,   288,   289,   290,   291,   292,   293,   294,   295,
+     296,   297,   298,   299,   300,   301,   302,   303,   304,   305,
+     306,   307,   308,   309,   310,   311,   312,   313,   314,   315,
+     316,   317,   318,   319,   320,   321,   322,   323,     0,     0,
+     324,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,   325,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,   326,   327,
+     328,   329,   330,   331,     1,     2,     3,     4,     5,     6,
+       7,     8,     9,    10,    11,    12,    13,    14,    15,    16,
+      17,    18,    19,   468,   469,   470,     0,   471,   472,   473,
+     474,   475,   476,   477,    20,    21,    22,    23,    24,    25,
+      26,    27,    28,    29,    30,    31,    32,    33,    34,    35,
+      36,    37,    38,    39,    40,    41,    42,    43,    44,    45,
+      46,    47,    48,    49,    50,    51,    52,    53,    54,    55,
+      56,    57,    58,    59,    60,    61,    62,    63,    64,    65,
+      66,    67,    68,    69,    70,    71,    72,    73,    74,    75,
+      76,    77,    78,    79,    80,    81,    82,    83,    84,    85,
+      86,    87,    88,    89,    90,    91,    92,    93,    94,    95,
+      96,    97,    98,    99,   100,   101,   102,   103,   104,   105,
+     106,   107,   108,   109,   110,   111,   112,   113,   114,   115,
+     116,   117,   118,   119,   120,   121,   122,   123,   124,   125,
+     126,   127,   128,   129,   130,   131,   132,   133,   134,   135,
+     136,   137,   138,   139,   140,   141,   142,   143,   144,   145,
+     146,   147,   148,   149,   150,   151,   152,   153,   154,   155,
+     156,   157,   158,   159,   160,   161,   162,   163,   164,   165,
+     166,   167,   168,   169,   170,   171,   172,   173,   174,   175,
+     176,   177,   178,   179,   180,   181,   182,   183,   184,   185,
+     186,   187,   188,   189,   190,   191,   192,   193,   194,   195,
+     196,   197,   198,   199,   200,   201,   202,   203,   204,   205,
+     206,   207,   208,   209,   210,   211,   212,   213,   214,   215,
+     216,   217,   218,   219,   220,   221,   222,   223,   224,   225,
+     226,   227,   228,   229,   230,   231,   232,   233,   234,   235,
+     236,   237,   238,   239,   240,   241,   242,   243,   244,   245,
+     246,   247,   248,   249,   250,   251,   252,   253,   254,   255,
+     256,   257,   258,   259,   260,   261,   262,   263,   264,   265,
+     266,   267,   268,   269,   270,   271,   272,   273,   274,   275,
+     276,   277,   278,   279,   280,   281,   282,   283,   284,   285,
+     286,   287,   288,   289,   290,   291,   292,   293,   294,   295,
+     296,   297,   298,   299,   300,   301,   302,   303,   304,   305,
+     306,   307,   308,   309,   310,   311,   312,   313,   314,   315,
+     316,   317,   318,   319,   320,   321,   322,   323,   478,   408,
+     324,   409,   410,   411,   412,   413,   414,   415,   416,   417,
+     418,   419,   420,     0,     0,   421,   422,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,   423,     0,   479,     0,   480,   481,
+       0,     0,     0,     0,   482,   425,   426,   427,   428,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,   326,   327,
+     328,   329,   330,   331,     1,     2,     3,     4,     5,     6,
+       7,     8,     9,    10,    11,    12,    13,    14,    15,    16,
+      17,    18,    19,   468,   469,   470,     0,   471,   472,   473,
+     474,   475,   476,   477,    20,    21,    22,    23,    24,    25,
+      26,    27,    28,    29,    30,    31,    32,    33,    34,    35,
+      36,    37,    38,    39,    40,    41,    42,    43,    44,    45,
+      46,    47,    48,    49,    50,    51,    52,    53,    54,    55,
+      56,    57,    58,    59,    60,    61,    62,    63,    64,    65,
+      66,    67,    68,    69,    70,    71,    72,    73,    74,    75,
+      76,    77,    78,    79,    80,    81,    82,    83,    84,    85,
+      86,    87,    88,    89,    90,    91,    92,    93,    94,    95,
+      96,    97,    98,    99,   100,   101,   102,   103,   104,   105,
+     106,   107,   108,   109,   110,   111,   112,   113,   114,   115,
+     116,   117,   118,   119,   120,   121,   122,   123,   124,   125,
+     126,   127,   128,   129,   130,   131,   132,   133,   134,   135,
+     136,   137,   138,   139,   140,   141,   142,   143,   144,   145,
+     146,   147,   148,   149,   150,   151,   152,   153,   154,   155,
+     156,   157,   158,   159,   160,   161,   162,   163,   164,   165,
+     166,   167,   168,   169,   170,   171,   172,   173,   174,   175,
+     176,   177,   178,   179,   180,   181,   182,   183,   184,   185,
+     186,   187,   188,   189,   190,   191,   192,   193,   194,   195,
+     196,   197,   198,   199,   200,   201,   202,   203,   204,   205,
+     206,   207,   208,   209,   210,   211,   212,   213,   214,   215,
+     216,   217,   218,   219,   220,   221,   222,   223,   224,   225,
+     226,   227,   228,   229,   230,   231,   232,   233,   234,   235,
+     236,   237,   238,   239,   240,   241,   242,   243,   244,   245,
+     246,   247,   248,   249,   250,   251,   252,   253,   254,   255,
+     256,   257,   258,   259,   260,   261,   262,   263,   264,   265,
+     266,   267,   268,   269,   270,   271,   272,   273,   274,   275,
+     276,   277,   278,   279,   280,   281,   282,   283,   284,   285,
+     286,   287,   288,   289,   290,   291,   292,   293,   294,   295,
+     296,   297,   298,   299,   300,   301,   302,   303,   304,   305,
+     306,   307,   308,   309,   310,   311,   312,   313,   314,   315,
+     316,   317,   318,   319,   320,   321,   322,   323,   478,   408,
+     324,   409,   410,   411,   412,   413,   414,   415,   416,   417,
+     418,   419,   420,     0,     0,   421,   422,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,   423,     0,   479,     0,   480,   594,
+       0,     0,     0,     0,   482,   425,   426,   427,   428,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,   326,   327,
+     328,   329,   330,   331,     1,     2,     3,     4,     5,     6,
+       7,     8,     9,    10,    11,    12,    13,    14,    15,    16,
+      17,    18,    19,   468,   469,   470,     0,   471,   472,   473,
+     474,   475,   476,   477,    20,    21,    22,    23,    24,    25,
+      26,    27,    28,    29,    30,    31,    32,    33,    34,    35,
+      36,    37,    38,    39,    40,    41,    42,    43,    44,    45,
+      46,    47,    48,    49,    50,    51,    52,    53,    54,    55,
+      56,    57,    58,    59,    60,    61,    62,    63,    64,    65,
+      66,    67,    68,    69,    70,    71,    72,    73,    74,    75,
+      76,    77,    78,    79,    80,    81,    82,    83,    84,    85,
+      86,    87,    88,    89,    90,    91,    92,    93,    94,    95,
+      96,    97,    98,    99,   100,   101,   102,   103,   104,   105,
+     106,   107,   108,   109,   110,   111,   112,   113,   114,   115,
+     116,   117,   118,   119,   120,   121,   122,   123,   124,   125,
+     126,   127,   128,   129,   130,   131,   132,   133,   134,   135,
+     136,   137,   138,   139,   140,   141,   142,   143,   144,   145,
+     146,   147,   148,   149,   150,   151,   152,   153,   154,   155,
+     156,   157,   158,   159,   160,   161,   162,   163,   164,   165,
+     166,   167,   168,   169,   170,   171,   172,   173,   174,   175,
+     176,   177,   178,   179,   180,   181,   182,   183,   184,   185,
+     186,   187,   188,   189,   190,   191,   192,   193,   194,   195,
+     196,   197,   198,   199,   200,   201,   202,   203,   204,   205,
+     206,   207,   208,   209,   210,   211,   212,   213,   214,   215,
+     216,   217,   218,   219,   220,   221,   222,   223,   224,   225,
+     226,   227,   228,   229,   230,   231,   232,   233,   234,   235,
+     236,   237,   238,   239,   240,   241,   242,   243,   244,   245,
+     246,   247,   248,   249,   250,   251,   252,   253,   254,   255,
+     256,   257,   258,   259,   260,   261,   262,   263,   264,   265,
+     266,   267,   268,   269,   270,   271,   272,   273,   274,   275,
+     276,   277,   278,   279,   280,   281,   282,   283,   284,   285,
+     286,   287,   288,   289,   290,   291,   292,   293,   294,   295,
+     296,   297,   298,   299,   300,   301,   302,   303,   304,   305,
+     306,   307,   308,   309,   310,   311,   312,   313,   314,   315,
+     316,   317,   318,   319,   320,   321,   322,   323,   478,   408,
+     324,   409,   410,   411,   412,   413,   414,   415,   416,   417,
+     418,   419,   420,     0,     0,   421,   422,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,   423,     0,   479,     0,   480,     0,
+       0,     0,     0,     0,   482,   425,   426,   427,   428,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,   326,   327,
+     328,   329,   330,   331,     1,     2,     3,     4,     5,     6,
+       7,     8,     9,    10,    11,    12,    13,    14,    15,    16,
+      17,    18,    19,   468,   469,   470,     0,   471,   472,   473,
+     474,   475,   476,   477,    20,    21,    22,    23,    24,    25,
+      26,    27,    28,    29,    30,    31,    32,    33,    34,    35,
+      36,    37,    38,    39,    40,    41,    42,    43,    44,    45,
+      46,    47,    48,    49,    50,    51,    52,    53,    54,    55,
+      56,    57,    58,    59,    60,    61,    62,    63,    64,    65,
+      66,    67,    68,    69,    70,    71,    72,    73,    74,    75,
+      76,    77,    78,    79,    80,    81,    82,    83,    84,    85,
+      86,    87,    88,    89,    90,    91,    92,    93,    94,    95,
+      96,    97,    98,    99,   100,   101,   102,   103,   104,   105,
+     106,   107,   108,   109,   110,   111,   112,   113,   114,   115,
+     116,   117,   118,   119,   120,   121,   122,   123,   124,   125,
+     126,   127,   128,   129,   130,   131,   132,   133,   134,   135,
+     136,   137,   138,   139,   140,   141,   142,   143,   144,   145,
+     146,   147,   148,   149,   150,   151,   152,   153,   154,   155,
+     156,   157,   158,   159,   160,   161,   162,   163,   164,   165,
+     166,   167,   168,   169,   170,   171,   172,   173,   174,   175,
+     176,   177,   178,   179,   180,   181,   182,   183,   184,   185,
+     186,   187,   188,   189,   190,   191,   192,   193,   194,   195,
+     196,   197,   198,   199,   200,   201,   202,   203,   204,   205,
+     206,   207,   208,   209,   210,   211,   212,   213,   214,   215,
+     216,   217,   218,   219,   220,   221,   222,   223,   224,   225,
+     226,   227,   228,   229,   230,   231,   232,   233,   234,   235,
+     236,   237,   238,   239,   240,   241,   242,   243,   244,   245,
+     246,   247,   248,   249,   250,   251,   252,   253,   254,   255,
+     256,   257,   258,   259,   260,   261,   262,   263,   264,   265,
+     266,   267,   268,   269,   270,   271,   272,   273,   274,   275,
+     276,   277,   278,   279,   280,   281,   282,   283,   284,   285,
+     286,   287,   288,   289,   290,   291,   292,   293,   294,   295,
+     296,   297,   298,   299,   300,   301,   302,   303,   304,   305,
+     306,   307,   308,   309,   310,   311,   312,   313,   314,   315,
+     316,   317,   318,   319,   320,   321,   322,   323,   478,   408,
+     324,   409,   410,   411,   412,   413,   414,   415,   416,   417,
+     418,   419,   420,     0,     0,   421,   422,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,   423,     0,   479,     0,   394,     0,
+       0,     0,     0,     0,   482,   425,   426,   427,   428,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,   326,   327,
+     328,   329,   330,   331,     1,     2,     3,     4,     5,     6,
+       7,     8,     9,    10,    11,    12,    13,    14,    15,    16,
+      17,    18,    19,   468,   469,   470,     0,   471,   472,   473,
+     474,   475,   476,   477,    20,    21,    22,    23,    24,    25,
+      26,    27,    28,    29,    30,    31,    32,    33,    34,    35,
+      36,    37,    38,    39,    40,    41,    42,    43,    44,    45,
+      46,    47,    48,    49,    50,    51,    52,    53,    54,    55,
+      56,    57,    58,    59,    60,    61,    62,    63,    64,    65,
+      66,    67,    68,    69,    70,    71,    72,    73,    74,    75,
+      76,    77,    78,    79,    80,    81,    82,    83,    84,    85,
+      86,    87,    88,    89,    90,    91,    92,    93,    94,    95,
+      96,    97,    98,    99,   100,   101,   102,   103,   104,   105,
+     106,   107,   108,   109,   110,   111,   112,   113,   114,   115,
+     116,   117,   118,   119,   120,   121,   122,   123,   124,   125,
+     126,   127,   128,   129,   130,   131,   132,   133,   134,   135,
+     136,   137,   138,   139,   140,   141,   142,   143,   144,   145,
+     146,   147,   148,   149,   150,   151,   152,   153,   154,   155,
+     156,   157,   158,   159,   160,   161,   162,   163,   164,   165,
+     166,   167,   168,   169,   170,   171,   172,   173,   174,   175,
+     176,   177,   178,   179,   180,   181,   182,   183,   184,   185,
+     186,   187,   188,   189,   190,   191,   192,   193,   194,   195,
+     196,   197,   198,   199,   200,   201,   202,   203,   204,   205,
+     206,   207,   208,   209,   210,   211,   212,   213,   214,   215,
+     216,   217,   218,   219,   220,   221,   222,   223,   224,   225,
+     226,   227,   228,   229,   230,   231,   232,   233,   234,   235,
+     236,   237,   238,   239,   240,   241,   242,   243,   244,   245,
+     246,   247,   248,   249,   250,   251,   252,   253,   254,   255,
+     256,   257,   258,   259,   260,   261,   262,   263,   264,   265,
+     266,   267,   268,   269,   270,   271,   272,   273,   274,   275,
+     276,   277,   278,   279,   280,   281,   282,   283,   284,   285,
+     286,   287,   288,   289,   290,   291,   292,   293,   294,   295,
+     296,   297,   298,   299,   300,   301,   302,   303,   304,   305,
+     306,   307,   308,   309,   310,   311,   312,   313,   314,   315,
+     316,   317,   318,   319,   320,   321,   322,   323,   478,   408,
+     324,   409,   410,   411,   412,   413,   414,   415,   416,   417,
+     418,   419,   420,     0,     0,   421,   422,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,   423,     0,   479,     0,     0,     0,
+       0,     0,     0,     0,   482,   425,   426,   427,   428,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,   326,   327,
+     328,   329,   330,   331,     1,     2,     3,     4,     5,     6,
+       7,     8,     9,    10,    11,    12,    13,    14,    15,    16,
+      17,    18,    19,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,    20,    21,    22,    23,    24,    25,
+      26,    27,    28,    29,    30,    31,    32,    33,    34,    35,
+      36,    37,    38,    39,    40,    41,    42,    43,    44,    45,
+      46,    47,    48,    49,    50,    51,    52,    53,    54,    55,
+      56,    57,    58,    59,    60,    61,    62,    63,    64,    65,
+      66,    67,    68,    69,    70,    71,    72,    73,    74,    75,
+      76,    77,    78,    79,    80,    81,    82,    83,    84,    85,
+      86,    87,    88,    89,    90,    91,    92,    93,    94,    95,
+      96,    97,    98,    99,   100,   101,   102,   103,   104,   105,
+     106,   107,   108,   109,   110,   111,   112,   113,   114,   115,
+     116,   117,   118,   119,   120,   121,   122,   123,   124,   125,
+     126,   127,   128,   129,   130,   131,   132,   133,   134,   135,
+     136,   137,   138,   139,   140,   141,   142,   143,   144,   145,
+     146,   147,   148,   149,   150,   151,   152,   153,   154,   155,
+     156,   157,   158,   159,   160,   161,   162,   163,   164,   165,
+     166,   167,   168,   169,   170,   171,   172,   173,   174,   175,
+     176,   177,   178,   179,   180,   181,   182,   183,   184,   185,
+     186,   187,   188,   189,   190,   191,   192,   193,   194,   195,
+     196,   197,   198,   199,   200,   201,   202,   203,   204,   205,
+     206,   207,   208,   209,   210,   211,   212,   213,   214,   215,
+     216,   217,   218,   219,   220,   221,   222,   223,   224,   225,
+     226,   227,   228,   229,   230,   231,   232,   233,   234,   235,
+     236,   237,   238,   239,   240,   241,   242,   243,   244,   245,
+     246,   247,   248,   249,   250,   251,   252,   253,   254,   255,
+     256,   257,   258,   259,   260,   261,   262,   263,   264,   265,
+     266,   267,   268,   269,   270,   271,   272,   273,   274,   275,
+     276,   277,   278,   279,   280,   281,   282,   283,   284,   285,
+     286,   287,   288,   289,   290,   291,   292,   293,   294,   295,
+     296,   297,   298,   299,   300,   301,   302,   303,   304,   305,
+     306,   307,   308,   309,   310,   311,   312,   313,   314,   315,
+     316,   317,   318,   319,   320,   321,   322,   323,     0,   408,
+     324,   409,   410,   411,   412,   413,   414,   415,   416,   417,
+     418,   419,   420,     0,     0,   421,   422,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,   423,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,   482,   425,   426,   427,   428,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,   326,   327,
+     328,   329,   330,   331,     1,     2,     3,     4,     5,     6,
+       7,     8,     9,    10,    11,    12,    13,    14,    15,    16,
+      17,    18,    19,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,    20,    21,    22,    23,    24,    25,
+      26,    27,    28,    29,    30,    31,    32,    33,    34,    35,
+      36,    37,    38,    39,    40,    41,    42,    43,    44,    45,
+      46,    47,    48,    49,    50,    51,    52,    53,    54,    55,
+      56,    57,    58,    59,    60,    61,    62,    63,    64,    65,
+      66,    67,    68,    69,    70,    71,    72,    73,    74,    75,
+      76,    77,    78,    79,    80,    81,    82,    83,    84,    85,
+      86,    87,    88,    89,    90,    91,    92,    93,    94,    95,
+      96,    97,    98,    99,   100,   101,   102,   103,   104,   105,
+     106,   107,   108,   109,   110,   111,   112,   113,   114,   115,
+     116,   117,   118,   119,   120,   121,   122,   123,   124,   125,
+     126,   127,   128,   129,   130,   131,   132,   133,   134,   135,
+     136,   137,   138,   139,   140,   141,   142,   143,   144,   145,
+     146,   147,   148,   149,   150,   151,   152,   153,   154,   155,
+     156,   157,   158,   159,   160,   161,   162,   163,   164,   165,
+     166,   167,   168,   169,   170,   171,   172,   173,   174,   175,
+     176,   177,   178,   179,   180,   181,   182,   183,   184,   185,
+     186,   187,   188,   189,   190,   191,   192,   193,   194,   195,
+     196,   197,   198,   199,   200,   201,   202,   203,   204,   205,
+     206,   207,   208,   209,   210,   211,   212,   213,   214,   215,
+     216,   217,   218,   219,   220,   221,   222,   223,   224,   225,
+     226,   227,   228,   229,   230,   231,   232,   233,   234,   235,
+     236,   237,   238,   239,   240,   241,   242,   243,   244,   245,
+     246,   247,   248,   249,   250,   251,   252,   253,   254,   255,
+     256,   257,   258,   259,   260,   261,   262,   263,   264,   265,
+     266,   267,   268,   269,   270,   271,   272,   273,   274,   275,
+     276,   277,   278,   279,   280,   281,   282,   283,   284,   285,
+     286,   287,   288,   289,   290,   291,   292,   293,   294,   295,
+     296,   297,   298,   299,   300,   301,   302,   303,   304,   305,
+     306,   307,   308,   309,   310,   311,   312,   313,   314,   315,
+     316,   317,   318,   319,   320,   321,   322,   323,     0,     0,
+     324,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,   325,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,   326,   327,
+     328,   329,   330,   331,     1,     2,     3,     4,     5,     6,
+       7,     8,     9,    10,    11,    12,    13,    14,    15,    16,
+      17,    18,    19,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,    20,    21,    22,    23,    24,    25,
+      26,    27,    28,    29,    30,    31,    32,    33,    34,    35,
+      36,    37,    38,    39,    40,    41,    42,    43,    44,    45,
+      46,    47,    48,    49,    50,    51,    52,    53,    54,    55,
+      56,    57,    58,    59,    60,    61,    62,    63,    64,    65,
+      66,    67,    68,    69,    70,    71,    72,    73,    74,    75,
+      76,    77,    78,    79,    80,    81,    82,    83,    84,    85,
+      86,    87,    88,    89,    90,    91,    92,    93,    94,    95,
+      96,    97,    98,    99,   100,   101,   102,   103,   104,   105,
+     106,   107,   108,   109,   110,   111,   112,   113,   114,   115,
+     116,   117,   118,   119,   120,   121,   122,   123,   124,   125,
+     126,   127,   128,   129,   130,   131,   132,   133,   134,   135,
+     136,   137,   138,   139,   140,   141,   142,   143,   144,   145,
+     146,   147,   148,   149,   150,   151,   152,   153,   154,   155,
+     156,   157,   158,   159,   160,   161,   162,   163,   164,   165,
+     166,   167,   168,   169,   170,   171,   172,   173,   174,   175,
+     176,   177,   178,   179,   180,   181,   182,   183,   184,   185,
+     186,   187,   188,   189,   190,   191,   192,   193,   194,   195,
+     196,   197,   198,   199,   200,   201,   202,   203,   204,   205,
+     206,   207,   208,   209,   210,   211,   212,   213,   214,   215,
+     216,   217,   218,   219,   220,   221,   222,   223,   224,   225,
+     226,   227,   228,   229,   230,   231,   232,   233,   234,   235,
+     236,   237,   238,   239,   240,   241,   242,   243,   244,   245,
+     246,   247,   248,   249,   250,   251,   252,   253,   254,   255,
+     256,   257,   258,   259,   260,   261,   262,   263,   264,   265,
+     266,   267,   268,   269,   270,   271,   272,   273,   274,   275,
+     276,   277,   278,   279,   280,   281,   282,   283,   284,   285,
+     286,   287,   288,   289,   290,   291,   292,   293,   294,   295,
+     296,   297,   298,   299,   300,   301,   302,   303,   304,   305,
+     306,   307,   308,   309,   310,   311,   312,   313,   314,   315,
+     316,   317,   318,   319,   320,   321,   322,   323,     0,   408,
+     324,   409,   410,   411,   412,   413,   414,   415,   416,   417,
+     418,   419,   420,     0,     0,   421,   422,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,   423,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,   425,   426,   427,   428,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,   326,   327,
+     328,   329,   330,     1,     2,     3,     4,     5,     6,     7,
+       8,     9,    10,    11,    12,    13,    14,    15,    16,    17,
+      18,    19,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,    20,    21,    22,    23,    24,    25,    26,
+      27,    28,    29,    30,    31,    32,    33,    34,    35,    36,
+      37,    38,    39,    40,    41,    42,    43,    44,    45,    46,
+      47,    48,    49,    50,    51,    52,    53,    54,    55,    56,
+      57,    58,    59,    60,    61,    62,    63,    64,    65,    66,
+      67,    68,    69,    70,    71,    72,    73,    74,    75,    76,
+      77,    78,    79,    80,    81,    82,    83,    84,    85,    86,
+      87,    88,    89,    90,    91,    92,    93,    94,    95,    96,
+      97,    98,    99,   100,   101,   102,   103,   104,   105,   106,
+     107,   108,   109,   110,   111,   112,   113,   114,   115,   116,
+     117,   118,   119,   120,   121,   122,   123,   124,   125,   126,
+     127,   128,   129,   130,   131,   132,   133,   134,   135,   136,
+     137,   138,   139,   140,   141,   142,   143,   144,   145,   146,
+     147,   148,   149,   150,   151,   152,   153,   154,   155,   156,
+     157,   158,   159,   160,   161,   162,   163,   164,   165,   166,
+     167,   168,   169,   170,   171,   172,   173,   174,   175,   176,
+     177,   178,   179,   180,   181,   182,   183,   184,   185,   186,
+     187,   188,   189,   190,   191,   192,   193,   194,   195,   196,
+     197,   198,   199,   200,   201,   202,   203,   204,   205,   206,
+     207,   208,   209,   210,   211,   212,   213,   214,   215,   216,
+     217,   218,   219,   220,   221,   222,   223,   224,   225,   226,
+     227,   228,   229,   230,   231,   232,   233,   234,   235,   236,
+     237,   238,   239,   240,   241,   242,   243,   244,   245,   246,
+     247,   248,   249,   250,   251,   252,   253,   254,   255,   256,
+     257,   258,   259,   260,   261,   262,   263,   264,   265,   266,
+     267,   268,   269,   270,   271,   272,   273,   274,   275,   276,
+     277,   278,   279,   280,   281,   282,   283,   284,   285,   286,
+     287,   288,   289,   290,   291,   292,   293,   294,   295,   296,
+     297,   298,   299,   300,   301,   302,   303,   304,   305,   306,
+     307,   308,   309,   310,   311,   312,   313,   314,   315,   316,
+     317,   318,   319,   320,   321,   322,   323,     0,   375,   324,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,   376,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,   326,   327,   328,
+     329,   330,     1,     2,     3,     4,     5,     6,     7,     8,
+       9,    10,    11,    12,    13,    14,    15,    16,    17,    18,
+      19,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,    20,    21,    22,    23,    24,    25,    26,    27,
+      28,    29,    30,    31,    32,    33,    34,    35,    36,    37,
+      38,    39,    40,    41,    42,    43,    44,    45,    46,    47,
+      48,    49,    50,    51,    52,    53,    54,    55,    56,    57,
+      58,    59,    60,    61,    62,    63,    64,    65,    66,    67,
+      68,    69,    70,    71,    72,    73,    74,    75,    76,    77,
+      78,    79,    80,    81,    82,    83,    84,    85,    86,    87,
+      88,    89,    90,    91,    92,    93,    94,    95,    96,    97,
+      98,    99,   100,   101,   102,   103,   104,   105,   106,   107,
+     108,   109,   110,   111,   112,   113,   114,   115,   116,   117,
+     118,   119,   120,   121,   122,   123,   124,   125,   126,   127,
+     128,   129,   130,   131,   132,   133,   134,   135,   136,   137,
+     138,   139,   140,   141,   142,   143,   144,   145,   146,   147,
+     148,   149,   150,   151,   152,   153,   154,   155,   156,   157,
+     158,   159,   160,   161,   162,   163,   164,   165,   166,   167,
+     168,   169,   170,   171,   172,   173,   174,   175,   176,   177,
+     178,   179,   180,   181,   182,   183,   184,   185,   186,   187,
+     188,   189,   190,   191,   192,   193,   194,   195,   196,   197,
+     198,   199,   200,   201,   202,   203,   204,   205,   206,   207,
+     208,   209,   210,   211,   212,   213,   214,   215,   216,   217,
+     218,   219,   220,   221,   222,   223,   224,   225,   226,   227,
+     228,   229,   230,   231,   232,   233,   234,   235,   236,   237,
+     238,   239,   240,   241,   242,   243,   244,   245,   246,   247,
+     248,   249,   250,   251,   252,   253,   254,   255,   256,   257,
+     258,   259,   260,   261,   262,   263,   264,   265,   266,   267,
+     268,   269,   270,   271,   272,   273,   274,   275,   276,   277,
+     278,   279,   280,   281,   282,   283,   284,   285,   286,   287,
+     288,   289,   290,   291,   292,   293,   294,   295,   296,   297,
+     298,   299,   300,   301,   302,   303,   304,   305,   306,   307,
+     308,   309,   310,   311,   312,   313,   314,   315,   316,   317,
+     318,   319,   320,   321,   322,   323,     0,     0,   324,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,   563,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,   326,   327,   328,   329,
+     330,     1,     2,     3,     4,     5,     6,     7,     8,     9,
+      10,    11,    12,    13,    14,    15,    16,    17,    18,    19,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,    20,    21,    22,    23,    24,    25,    26,    27,    28,
+      29,    30,    31,    32,    33,    34,    35,    36,    37,    38,
+      39,    40,    41,    42,    43,    44,    45,    46,    47,    48,
+      49,    50,    51,    52,    53,    54,    55,    56,    57,    58,
+      59,    60,    61,    62,    63,    64,    65,    66,    67,    68,
+      69,    70,    71,    72,    73,    74,    75,    76,    77,    78,
+      79,    80,    81,    82,    83,    84,    85,    86,    87,    88,
+      89,    90,    91,    92,    93,    94,    95,    96,    97,    98,
+      99,   100,   101,   102,   103,   104,   105,   106,   107,   108,
+     109,   110,   111,   112,   113,   114,   115,   116,   117,   118,
+     119,   120,   121,   122,   123,   124,   125,   126,   127,   128,
+     129,   130,   131,   132,   133,   134,   135,   136,   137,   138,
+     139,   140,   141,   142,   143,   144,   145,   146,   147,   148,
+     149,   150,   151,   152,   153,   154,   155,   156,   157,   158,
+     159,   160,   161,   162,   163,   164,   165,   166,   167,   168,
+     169,   170,   171,   172,   173,   174,   175,   176,   177,   178,
+     179,   180,   181,   182,   183,   184,   185,   186,   187,   188,
+     189,   190,   191,   192,   193,   194,   195,   196,   197,   198,
+     199,   200,   201,   202,   203,   204,   205,   206,   207,   208,
+     209,   210,   211,   212,   213,   214,   215,   216,   217,   218,
+     219,   220,   221,   222,   223,   224,   225,   226,   227,   228,
+     229,   230,   231,   232,   233,   234,   235,   236,   237,   238,
+     239,   240,   241,   242,   243,   244,   245,   246,   247,   248,
+     249,   250,   251,   252,   253,   254,   255,   256,   257,   258,
+     259,   260,   261,   262,   263,   264,   265,   266,   267,   268,
+     269,   270,   271,   272,   273,   274,   275,   276,   277,   278,
+     279,   280,   281,   282,   283,   284,   285,   286,   287,   288,
+     289,   290,   291,   292,   293,   294,   295,   296,   297,   298,
+     299,   300,   301,   302,   303,   304,   305,   306,   307,   308,
+     309,   310,   311,   312,   313,   314,   315,   316,   317,   318,
+     319,   320,   321,   322,   323,     0,     0,   324,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,   632,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,   326,   327,   328,   329,   330,
+       1,     2,     3,     4,     5,     6,     7,     8,     9,    10,
+      11,    12,    13,    14,    15,    16,    17,    18,    19,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
       20,    21,    22,    23,    24,    25,    26,    27,    28,    29,
       30,    31,    32,    33,    34,    35,    36,    37,    38,    39,
       40,    41,    42,    43,    44,    45,    46,    47,    48,    49,
@@ -1969,153 +1958,26 @@
      200,   201,   202,   203,   204,   205,   206,   207,   208,   209,
      210,   211,   212,   213,   214,   215,   216,   217,   218,   219,
      220,   221,   222,   223,   224,   225,   226,   227,   228,   229,
-     230,   231,   232,   233,    -1,    -1,   236,   237,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,   255,    -1,    -1,    -1,   259,
-      -1,    -1,    -1,    -1,    -1,   265,   266,   267,   268,   269,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   279,
-     280,   281,   282,   283,   284,     3,     4,     5,     6,     7,
-       8,     9,    10,    11,    12,    13,    14,    15,    16,    -1,
-      18,    19,    20,    21,    22,    23,    24,    25,    26,    27,
-      28,    29,    30,    31,    32,    33,    34,    35,    36,    37,
-      38,    39,    40,    41,    42,    43,    44,    45,    46,    47,
-      48,    49,    50,    51,    52,    53,    54,    55,    56,    57,
-      58,    59,    60,    61,    62,    63,    64,    65,    66,    67,
-      68,    69,    70,    71,    72,    73,    74,    75,    76,    77,
-      78,    79,    80,    81,    82,    83,    84,    85,    86,    87,
-      88,    89,    90,    91,    92,    93,    94,    95,    96,    97,
-      98,    99,   100,   101,   102,   103,   104,   105,   106,   107,
-     108,   109,   110,   111,   112,   113,   114,   115,   116,   117,
-     118,   119,   120,   121,   122,   123,   124,   125,   126,   127,
-     128,   129,   130,   131,   132,   133,   134,   135,   136,   137,
-     138,   139,   140,   141,   142,   143,   144,   145,   146,   147,
-     148,   149,   150,   151,   152,   153,   154,   155,   156,   157,
-     158,   159,   160,   161,   162,   163,   164,   165,   166,   167,
-     168,   169,   170,   171,   172,   173,   174,   175,   176,   177,
-     178,   179,   180,   181,   182,   183,   184,   185,   186,   187,
-     188,   189,   190,   191,   192,   193,   194,   195,   196,   197,
-     198,   199,   200,   201,   202,   203,   204,   205,   206,   207,
-     208,   209,   210,   211,   212,   213,   214,   215,   216,   217,
-     218,   219,   220,   221,   222,   223,   224,   225,   226,   227,
-     228,   229,   230,   231,   232,   233,    -1,    -1,   236,   237,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,   255,    -1,    -1,
-      -1,   259,    -1,    -1,    -1,    -1,    -1,   265,   266,   267,
-     268,   269,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,   279,   280,   281,   282,   283,   284,     3,     4,     5,
-       6,     7,     8,     9,    10,    11,    12,    13,    14,    15,
-      16,    -1,    18,    19,    20,    21,    22,    23,    24,    25,
-      26,    27,    28,    29,    30,    31,    32,    33,    34,    35,
-      36,    37,    38,    39,    40,    41,    42,    43,    44,    45,
-      46,    47,    48,    49,    50,    51,    52,    53,    54,    55,
-      56,    57,    58,    59,    60,    61,    62,    63,    64,    65,
-      66,    67,    68,    69,    70,    71,    72,    73,    74,    75,
-      76,    77,    78,    79,    80,    81,    82,    83,    84,    85,
-      86,    87,    88,    89,    90,    91,    92,    93,    94,    95,
-      96,    97,    98,    99,   100,   101,   102,   103,   104,   105,
-     106,   107,   108,   109,   110,   111,   112,   113,   114,   115,
-     116,   117,   118,   119,   120,   121,   122,   123,   124,   125,
-     126,   127,   128,   129,   130,   131,   132,   133,   134,   135,
-     136,   137,   138,   139,   140,   141,   142,   143,   144,   145,
-     146,   147,   148,   149,   150,   151,   152,   153,   154,   155,
-     156,   157,   158,   159,   160,   161,   162,   163,   164,   165,
-     166,   167,   168,   169,   170,   171,   172,   173,   174,   175,
-     176,   177,   178,   179,   180,   181,   182,   183,   184,   185,
-     186,   187,   188,   189,   190,   191,   192,   193,   194,   195,
-     196,   197,   198,   199,   200,   201,   202,   203,   204,   205,
-     206,   207,   208,   209,   210,   211,   212,   213,   214,   215,
-     216,   217,   218,   219,   220,   221,   222,   223,   224,   225,
-     226,   227,   228,   229,   230,   231,   232,   233,    -1,    -1,
-     236,   237,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   255,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   265,
-     266,   267,   268,   269,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,   279,   280,   281,   282,   283,   284,     3,
-       4,     5,     6,     7,     8,     9,    10,    11,    12,    13,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    25,    26,    27,    28,    29,    30,    31,    32,    33,
-      34,    35,    36,    37,    38,    39,    40,    41,    42,    43,
-      44,    45,    46,    47,    48,    49,    50,    51,    52,    53,
-      54,    55,    56,    57,    58,    59,    60,    61,    62,    63,
-      64,    65,    66,    67,    68,    69,    70,    71,    72,    73,
-      74,    75,    76,    77,    78,    79,    80,    81,    82,    83,
-      84,    85,    86,    87,    88,    89,    90,    91,    92,    93,
-      94,    95,    96,    97,    98,    99,   100,   101,   102,   103,
-     104,   105,   106,   107,   108,   109,   110,   111,   112,   113,
-     114,   115,   116,   117,   118,   119,   120,   121,   122,   123,
-     124,   125,   126,   127,   128,   129,   130,   131,   132,   133,
-     134,   135,   136,   137,   138,   139,   140,   141,   142,   143,
-     144,   145,   146,   147,   148,   149,   150,   151,   152,   153,
-     154,   155,   156,   157,   158,   159,   160,   161,   162,   163,
-     164,   165,   166,   167,   168,   169,   170,   171,   172,   173,
-     174,   175,   176,   177,   178,   179,   180,   181,   182,   183,
-     184,   185,   186,   187,   188,   189,   190,   191,   192,   193,
-     194,   195,   196,   197,   198,   199,   200,   201,   202,   203,
-     204,   205,   206,   207,   208,   209,   210,   211,   212,   213,
-     214,   215,   216,   217,   218,   219,   220,   221,   222,    -1,
-     224,   225,   226,   227,   228,   229,   230,   231,   232,   233,
-      -1,    -1,   236,   237,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,   255,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,   265,   266,   267,   268,   269,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,   279,   280,   281,   282,   283,
-     284,     3,     4,     5,     6,     7,     8,     9,    10,    11,
-      12,    13,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    25,    26,    27,    28,    29,    30,    31,
-      32,    33,    34,    35,    36,    37,    38,    39,    40,    41,
-      42,    43,    44,    45,    46,    47,    48,    49,    50,    51,
-      52,    53,    54,    55,    56,    57,    58,    59,    60,    61,
-      62,    63,    64,    65,    66,    67,    68,    69,    70,    71,
-      72,    73,    74,    75,    76,    77,    78,    79,    80,    81,
-      82,    83,    84,    85,    86,    87,    88,    89,    90,    91,
-      92,    93,    94,    95,    96,    97,    98,    99,   100,   101,
-     102,   103,   104,   105,   106,   107,   108,   109,   110,   111,
-     112,   113,   114,   115,   116,   117,   118,   119,   120,   121,
-     122,   123,   124,   125,   126,   127,   128,   129,   130,   131,
-     132,   133,   134,   135,   136,   137,   138,   139,   140,   141,
-     142,   143,   144,   145,   146,   147,   148,   149,   150,   151,
-     152,   153,   154,   155,   156,   157,   158,   159,   160,   161,
-     162,   163,   164,   165,   166,   167,   168,   169,   170,   171,
-     172,   173,   174,   175,   176,   177,   178,   179,   180,   181,
-     182,   183,   184,   185,   186,   187,   188,   189,   190,   191,
-     192,   193,   194,   195,   196,   197,   198,   199,   200,   201,
-     202,   203,   204,   205,   206,   207,   208,   209,   210,   211,
-     212,   213,   214,   215,   216,   217,   218,   219,   220,   221,
-     222,    -1,    -1,   225,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,     3,     4,     5,     6,     7,     8,     9,    10,    11,
-      12,    13,    -1,    -1,    -1,    -1,    -1,   279,   280,   281,
-     282,   283,   284,    25,    26,    27,    28,    29,    30,    31,
-      32,    33,    34,    35,    36,    37,    38,    39,    40,    41,
-      42,    43,    44,    45,    46,    47,    48,    49,    50,    51,
-      52,    53,    54,    55,    56,    57,    58,    59,    60,    61,
-      62,    63,    64,    65,    66,    67,    68,    69,    70,    71,
-      72,    73,    74,    75,    76,    77,    78,    79,    80,    81,
-      82,    83,    84,    85,    86,    87,    88,    89,    90,    91,
-      92,    93,    94,    95,    96,    97,    98,    99,   100,   101,
-     102,   103,   104,   105,   106,   107,   108,   109,   110,   111,
-     112,   113,   114,   115,   116,   117,   118,   119,   120,   121,
-     122,   123,   124,   125,   126,   127,   128,   129,   130,   131,
-     132,   133,   134,   135,   136,   137,   138,   139,   140,   141,
-     142,   143,   144,   145,   146,   147,   148,   149,   150,   151,
-     152,   153,   154,   155,   156,   157,   158,   159,   160,   161,
-     162,   163,   164,   165,   166,   167,   168,   169,   170,   171,
-     172,   173,   174,   175,   176,   177,   178,   179,   180,   181,
-     182,   183,   184,   185,   186,   187,   188,   189,   190,   191,
-     192,   193,   194,   195,   196,   197,   198,   199,   200,   201,
-     202,   203,   204,   205,   206,   207,   208,   209,   210,   211,
-     212,   213,   214,   215,   216,   217,   218,   219,   220,   221,
-     222,    -1,   224,   225,   226,   227,   228,   229,   230,   231,
-     232,   233,    -1,    -1,   236,   237,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,   255,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,   266,   267,   268,   269,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,   279,   280,   281,
-     282,   283,     3,     4,     5,     6,     7,     8,     9,    10,
-      11,    12,    13,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    25,    26,    27,    28,    29,    30,
+     230,   231,   232,   233,   234,   235,   236,   237,   238,   239,
+     240,   241,   242,   243,   244,   245,   246,   247,   248,   249,
+     250,   251,   252,   253,   254,   255,   256,   257,   258,   259,
+     260,   261,   262,   263,   264,   265,   266,   267,   268,   269,
+     270,   271,   272,   273,   274,   275,   276,   277,   278,   279,
+     280,   281,   282,   283,   284,   285,   286,   287,   288,   289,
+     290,   291,   292,   293,   294,   295,   296,   297,   298,   299,
+     300,   301,   302,   303,   304,   305,   306,   307,   308,   309,
+     310,   311,   312,   313,   314,   315,   316,   317,   318,   319,
+     320,   321,   322,   323,     0,     0,   324,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,   653,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,   326,   327,   328,   329,   330,     1,
+       2,     3,     4,     5,     6,     7,     8,     9,    10,    11,
+      12,    13,    14,    15,    16,    17,    18,    19,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,    20,
+      21,    22,    23,    24,    25,    26,    27,    28,    29,    30,
       31,    32,    33,    34,    35,    36,    37,    38,    39,    40,
       41,    42,    43,    44,    45,    46,    47,    48,    49,    50,
       51,    52,    53,    54,    55,    56,    57,    58,    59,    60,
@@ -2135,22 +1997,224 @@
      191,   192,   193,   194,   195,   196,   197,   198,   199,   200,
      201,   202,   203,   204,   205,   206,   207,   208,   209,   210,
      211,   212,   213,   214,   215,   216,   217,   218,   219,   220,
-     221,   222,    -1,   224,   225,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,   265,     3,     4,     5,     6,     7,
-       8,     9,    10,    11,    12,    13,    -1,    -1,   279,   280,
-     281,   282,   283,    -1,    -1,    -1,    -1,    25,    26,    27,
+     221,   222,   223,   224,   225,   226,   227,   228,   229,   230,
+     231,   232,   233,   234,   235,   236,   237,   238,   239,   240,
+     241,   242,   243,   244,   245,   246,   247,   248,   249,   250,
+     251,   252,   253,   254,   255,   256,   257,   258,   259,   260,
+     261,   262,   263,   264,   265,   266,   267,   268,   269,   270,
+     271,   272,   273,   274,   275,   276,   277,   278,   279,   280,
+     281,   282,   283,   284,   285,   286,   287,   288,   289,   290,
+     291,   292,   293,   294,   295,   296,   297,   298,   299,   300,
+     301,   302,   303,   304,   305,   306,   307,   308,   309,   310,
+     311,   312,   313,   314,   315,   316,   317,   318,   319,   320,
+     321,   322,   323,     0,     0,   324,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     3,
+       4,     5,     6,     7,     0,     9,    10,    11,    12,    13,
+      14,    15,    16,    17,    18,    19,     0,     0,     0,     0,
+       0,     0,     0,   326,   327,   328,   329,   330,    21,    22,
+      23,    24,    25,    26,    27,    28,    29,    30,    31,    32,
+      33,    34,    35,    36,    37,    38,    39,    40,    41,    42,
+      43,    44,    45,    46,    47,    48,    49,    50,    51,    52,
+      53,    54,    55,    56,    57,    58,    59,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,    69,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,    85,    86,    87,    88,    89,    90,    91,    92,
+      93,    94,    95,    96,    97,    98,    99,   100,   101,   102,
+     103,   104,   105,   106,   107,   108,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,   118,   119,   120,   121,   122,
+     123,   124,   125,   126,   127,   128,   129,   130,   131,   132,
+     133,   134,   135,   136,   137,   138,   139,   140,   141,   142,
+     143,   144,   145,   146,   147,   148,   149,   150,   151,   152,
+     153,   154,   155,   156,   157,   158,   159,   160,   161,   162,
+     163,   164,   165,   166,   167,   168,   169,   170,   171,   172,
+     173,   174,   175,   176,   177,   178,   179,   180,   181,   182,
+     183,   184,   185,   186,   187,   188,   189,   190,   191,   192,
+     193,   194,   195,   196,   197,   198,   199,   200,   201,   202,
+     203,   204,   205,   206,   207,   208,   209,   210,   211,   212,
+     213,   214,   215,   216,   217,   218,   219,   220,   221,   222,
+     223,   224,   225,   226,   227,   228,   229,   230,   231,   232,
+     233,   234,   235,   236,   237,   238,   239,   240,   241,   242,
+     243,   244,   245,   246,   247,   248,   249,   250,   251,   252,
+     253,   254,   255,   256,   257,   258,   259,   260,   261,   262,
+     263,   264,   265,   266,   267,   268,   269,   270,   271,   272,
+     273,   274,   275,   276,   277,   278,   279,   280,   281,   282,
+     283,   284,   285,   286,   287,   288,   289,   290,   291,   292,
+     293,   294,   295,   296,   297,   298,   299,   300,   301,   302,
+     303,   304,   305,   306,   307,   308,   309,   310,   311,   312,
+     313,   314,   315,   316,   317,   318,   319,   320,   321,   322,
+     323,     0,   408,   324,   409,   410,   411,   412,   413,   414,
+     415,   416,   417,   418,   419,   420,     0,     0,   421,   422,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,   423,     0,     0,
+       0,   509,   672,     0,     0,     0,     0,     0,   425,   426,
+     427,   428,     3,     4,     5,     6,     7,     0,     9,    10,
+      11,    12,    13,    14,    15,    16,    17,    18,    19,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,    21,    22,    23,    24,    25,    26,    27,    28,    29,
+      30,    31,    32,    33,    34,    35,    36,    37,    38,    39,
+      40,    41,    42,    43,    44,    45,    46,    47,    48,    49,
+      50,    51,    52,    53,    54,    55,    56,    57,    58,    59,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,    69,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,    85,    86,    87,    88,    89,
+      90,    91,    92,    93,    94,    95,    96,    97,    98,    99,
+     100,   101,   102,   103,   104,   105,   106,   107,   108,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,   118,   119,
+     120,   121,   122,   123,   124,   125,   126,   127,   128,   129,
+     130,   131,   132,   133,   134,   135,   136,   137,   138,   139,
+     140,   141,   142,   143,   144,   145,   146,   147,   148,   149,
+     150,   151,   152,   153,   154,   155,   156,   157,   158,   159,
+     160,   161,   162,   163,   164,   165,   166,   167,   168,   169,
+     170,   171,   172,   173,   174,   175,   176,   177,   178,   179,
+     180,   181,   182,   183,   184,   185,   186,   187,   188,   189,
+     190,   191,   192,   193,   194,   195,   196,   197,   198,   199,
+     200,   201,   202,   203,   204,   205,   206,   207,   208,   209,
+     210,   211,   212,   213,   214,   215,   216,   217,   218,   219,
+     220,   221,   222,   223,   224,   225,   226,   227,   228,   229,
+     230,   231,   232,   233,   234,   235,   236,   237,   238,   239,
+     240,   241,   242,   243,   244,   245,   246,   247,   248,   249,
+     250,   251,   252,   253,   254,   255,   256,   257,   258,   259,
+     260,   261,   262,   263,   264,   265,   266,   267,   268,   269,
+     270,   271,   272,   273,   274,   275,   276,   277,   278,   279,
+     280,   281,   282,   283,   284,   285,   286,   287,   288,   289,
+     290,   291,   292,   293,   294,   295,   296,   297,   298,   299,
+     300,   301,   302,   303,   304,   305,   306,   307,   308,   309,
+     310,   311,   312,   313,   314,   315,   316,   317,   318,   319,
+     320,   321,   322,   323,     0,   408,   324,   409,   410,   411,
+     412,   413,   414,   415,   416,   417,   418,   419,   420,     0,
+       0,   421,   422,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+     423,     0,     0,   424,     0,     0,     0,     0,     0,     0,
+       0,   425,   426,   427,   428,     3,     4,     5,     6,     7,
+       0,     9,    10,    11,    12,    13,    14,    15,    16,    17,
+      18,    19,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,    21,    22,    23,    24,    25,    26,
+      27,    28,    29,    30,    31,    32,    33,    34,    35,    36,
+      37,    38,    39,    40,    41,    42,    43,    44,    45,    46,
+      47,    48,    49,    50,    51,    52,    53,    54,    55,    56,
+      57,    58,    59,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,    69,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,    85,    86,
+      87,    88,    89,    90,    91,    92,    93,    94,    95,    96,
+      97,    98,    99,   100,   101,   102,   103,   104,   105,   106,
+     107,   108,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,   118,   119,   120,   121,   122,   123,   124,   125,   126,
+     127,   128,   129,   130,   131,   132,   133,   134,   135,   136,
+     137,   138,   139,   140,   141,   142,   143,   144,   145,   146,
+     147,   148,   149,   150,   151,   152,   153,   154,   155,   156,
+     157,   158,   159,   160,   161,   162,   163,   164,   165,   166,
+     167,   168,   169,   170,   171,   172,   173,   174,   175,   176,
+     177,   178,   179,   180,   181,   182,   183,   184,   185,   186,
+     187,   188,   189,   190,   191,   192,   193,   194,   195,   196,
+     197,   198,   199,   200,   201,   202,   203,   204,   205,   206,
+     207,   208,   209,   210,   211,   212,   213,   214,   215,   216,
+     217,   218,   219,   220,   221,   222,   223,   224,   225,   226,
+     227,   228,   229,   230,   231,   232,   233,   234,   235,   236,
+     237,   238,   239,   240,   241,   242,   243,   244,   245,   246,
+     247,   248,   249,   250,   251,   252,   253,   254,   255,   256,
+     257,   258,   259,   260,   261,   262,   263,   264,   265,   266,
+     267,   268,   269,   270,   271,   272,   273,   274,   275,   276,
+     277,   278,   279,   280,   281,   282,   283,   284,   285,   286,
+     287,   288,   289,   290,   291,   292,   293,   294,   295,   296,
+     297,   298,   299,   300,   301,   302,   303,   304,   305,   306,
+     307,   308,   309,   310,   311,   312,   313,   314,   315,   316,
+     317,   318,   319,   320,   321,   322,   323,     0,   408,   324,
+     409,   410,   411,   412,   413,   414,   415,   416,   417,   418,
+     419,   420,     0,     0,   421,   422,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,   423,     0,     0,     0,   509,     0,     0,
+       0,     0,     0,     0,   425,   426,   427,   428,     3,     4,
+       5,     6,     7,     0,     9,    10,    11,    12,    13,    14,
+      15,    16,    17,    18,    19,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,    21,    22,    23,
+      24,    25,    26,    27,    28,    29,    30,    31,    32,    33,
+      34,    35,    36,    37,    38,    39,    40,    41,    42,    43,
+      44,    45,    46,    47,    48,    49,    50,    51,    52,    53,
+      54,    55,    56,    57,    58,    59,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,    69,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,    85,    86,    87,    88,    89,    90,    91,    92,    93,
+      94,    95,    96,    97,    98,    99,   100,   101,   102,   103,
+     104,   105,   106,   107,   108,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,   118,   119,   120,   121,   122,   123,
+     124,   125,   126,   127,   128,   129,   130,   131,   132,   133,
+     134,   135,   136,   137,   138,   139,   140,   141,   142,   143,
+     144,   145,   146,   147,   148,   149,   150,   151,   152,   153,
+     154,   155,   156,   157,   158,   159,   160,   161,   162,   163,
+     164,   165,   166,   167,   168,   169,   170,   171,   172,   173,
+     174,   175,   176,   177,   178,   179,   180,   181,   182,   183,
+     184,   185,   186,   187,   188,   189,   190,   191,   192,   193,
+     194,   195,   196,   197,   198,   199,   200,   201,   202,   203,
+     204,   205,   206,   207,   208,   209,   210,   211,   212,   213,
+     214,   215,   216,   217,   218,   219,   220,   221,   222,   223,
+     224,   225,   226,   227,   228,   229,   230,   231,   232,   233,
+     234,   235,   236,   237,   238,   239,   240,   241,   242,   243,
+     244,   245,   246,   247,   248,   249,   250,   251,   252,   253,
+     254,   255,   256,   257,   258,   259,   260,   261,   262,   263,
+     264,   265,   266,   267,   268,   269,   270,   271,   272,   273,
+     274,   275,   276,   277,   278,   279,   280,   281,   282,   283,
+     284,   285,   286,   287,   288,   289,   290,   291,   292,   293,
+     294,   295,   296,   297,   298,   299,   300,   301,   302,   303,
+     304,   305,   306,   307,   308,   309,   310,   311,   312,   313,
+     314,   315,   316,   317,   318,   319,   320,   321,   322,   323,
+       0,   408,   324,   409,   410,   411,   412,   413,   414,   415,
+     416,   417,   418,   419,   420,     0,     0,   421,   422,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,   423,     0,     0,   552,
+       0,     0,     0,     0,     0,     0,     0,   425,   426,   427,
+     428,     3,     4,     5,     6,     7,     0,     9,    10,    11,
+      12,    13,    14,    15,    16,    17,    18,    19,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+      21,    22,    23,    24,    25,    26,    27,    28,    29,    30,
+      31,    32,    33,    34,    35,    36,    37,    38,    39,    40,
+      41,    42,    43,    44,    45,    46,    47,    48,    49,    50,
+      51,    52,    53,    54,    55,    56,    57,    58,    59,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,    69,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,    85,    86,    87,    88,    89,    90,
+      91,    92,    93,    94,    95,    96,    97,    98,    99,   100,
+     101,   102,   103,   104,   105,   106,   107,   108,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,   118,   119,   120,
+     121,   122,   123,   124,   125,   126,   127,   128,   129,   130,
+     131,   132,   133,   134,   135,   136,   137,   138,   139,   140,
+     141,   142,   143,   144,   145,   146,   147,   148,   149,   150,
+     151,   152,   153,   154,   155,   156,   157,   158,   159,   160,
+     161,   162,   163,   164,   165,   166,   167,   168,   169,   170,
+     171,   172,   173,   174,   175,   176,   177,   178,   179,   180,
+     181,   182,   183,   184,   185,   186,   187,   188,   189,   190,
+     191,   192,   193,   194,   195,   196,   197,   198,   199,   200,
+     201,   202,   203,   204,   205,   206,   207,   208,   209,   210,
+     211,   212,   213,   214,   215,   216,   217,   218,   219,   220,
+     221,   222,   223,   224,   225,   226,   227,   228,   229,   230,
+     231,   232,   233,   234,   235,   236,   237,   238,   239,   240,
+     241,   242,   243,   244,   245,   246,   247,   248,   249,   250,
+     251,   252,   253,   254,   255,   256,   257,   258,   259,   260,
+     261,   262,   263,   264,   265,   266,   267,   268,   269,   270,
+     271,   272,   273,   274,   275,   276,   277,   278,   279,   280,
+     281,   282,   283,   284,   285,   286,   287,   288,   289,   290,
+     291,   292,   293,   294,   295,   296,   297,   298,   299,   300,
+     301,   302,   303,   304,   305,   306,   307,   308,   309,   310,
+     311,   312,   313,   314,   315,   316,   317,   318,   319,   320,
+     321,   322,   323,     0,   408,   324,   409,   410,   411,   412,
+     413,   414,   415,   416,   417,   418,   419,   420,     0,     0,
+     421,   422,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,   423,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,   571,
+     425,   426,   427,   428,     3,     4,     5,     6,     7,     0,
+       9,    10,    11,    12,    13,    14,    15,    16,    17,    18,
+      19,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,    21,    22,    23,    24,    25,    26,    27,
       28,    29,    30,    31,    32,    33,    34,    35,    36,    37,
       38,    39,    40,    41,    42,    43,    44,    45,    46,    47,
       48,    49,    50,    51,    52,    53,    54,    55,    56,    57,
-      58,    59,    60,    61,    62,    63,    64,    65,    66,    67,
-      68,    69,    70,    71,    72,    73,    74,    75,    76,    77,
-      78,    79,    80,    81,    82,    83,    84,    85,    86,    87,
+      58,    59,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,    69,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,    85,    86,    87,
       88,    89,    90,    91,    92,    93,    94,    95,    96,    97,
       98,    99,   100,   101,   102,   103,   104,   105,   106,   107,
-     108,   109,   110,   111,   112,   113,   114,   115,   116,   117,
+     108,     0,     0,     0,     0,     0,     0,     0,     0,     0,
      118,   119,   120,   121,   122,   123,   124,   125,   126,   127,
      128,   129,   130,   131,   132,   133,   134,   135,   136,   137,
      138,   139,   140,   141,   142,   143,   144,   145,   146,   147,
@@ -2161,13 +2225,212 @@
      188,   189,   190,   191,   192,   193,   194,   195,   196,   197,
      198,   199,   200,   201,   202,   203,   204,   205,   206,   207,
      208,   209,   210,   211,   212,   213,   214,   215,   216,   217,
-     218,   219,   220,   221,   222,    -1,    -1,   225,    -1,    -1,
+     218,   219,   220,   221,   222,   223,   224,   225,   226,   227,
+     228,   229,   230,   231,   232,   233,   234,   235,   236,   237,
+     238,   239,   240,   241,   242,   243,   244,   245,   246,   247,
+     248,   249,   250,   251,   252,   253,   254,   255,   256,   257,
+     258,   259,   260,   261,   262,   263,   264,   265,   266,   267,
+     268,   269,   270,   271,   272,   273,   274,   275,   276,   277,
+     278,   279,   280,   281,   282,   283,   284,   285,   286,   287,
+     288,   289,   290,   291,   292,   293,   294,   295,   296,   297,
+     298,   299,   300,   301,   302,   303,   304,   305,   306,   307,
+     308,   309,   310,   311,   312,   313,   314,   315,   316,   317,
+     318,   319,   320,   321,   322,   323,     0,   408,   324,   409,
+     410,   411,   412,   413,   414,   415,   416,   417,   418,   419,
+     420,     0,     0,   421,   422,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,   423,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,   425,   426,   427,   428,     3,     4,     5,
+       6,     7,     0,     9,    10,    11,    12,    13,    14,    15,
+      16,    17,    18,    19,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,    21,    22,    23,    24,
+      25,    26,    27,    28,    29,    30,    31,    32,    33,    34,
+      35,    36,    37,    38,    39,    40,    41,    42,    43,    44,
+      45,    46,    47,    48,    49,    50,    51,    52,    53,    54,
+      55,    56,    57,    58,    59,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,    69,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+      85,    86,    87,    88,    89,    90,    91,    92,    93,    94,
+      95,    96,    97,    98,    99,   100,   101,   102,   103,   104,
+     105,   106,   107,   108,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,   118,   119,   120,   121,   122,   123,   124,
+     125,   126,   127,   128,   129,   130,   131,   132,   133,   134,
+     135,   136,   137,   138,   139,   140,   141,   142,   143,   144,
+     145,   146,   147,   148,   149,   150,   151,   152,   153,   154,
+     155,   156,   157,   158,   159,   160,   161,   162,   163,   164,
+     165,   166,   167,   168,   169,   170,   171,   172,   173,   174,
+     175,   176,   177,   178,   179,   180,   181,   182,   183,   184,
+     185,   186,   187,   188,   189,   190,   191,   192,   193,   194,
+     195,   196,   197,   198,   199,   200,   201,   202,   203,   204,
+     205,   206,   207,   208,   209,   210,   211,   212,   213,   214,
+     215,   216,   217,   218,   219,   220,   221,   222,   223,   224,
+     225,   226,   227,   228,   229,   230,   231,   232,   233,   234,
+     235,   236,   237,   238,   239,   240,   241,   242,   243,   244,
+     245,   246,   247,   248,   249,   250,   251,   252,   253,   254,
+     255,   256,   257,   258,   259,   260,   261,   262,   263,   264,
+     265,   266,   267,   268,   269,   270,   271,   272,   273,   274,
+     275,   276,   277,   278,   279,   280,   281,   282,   283,   284,
+     285,   286,   287,   288,   289,   290,   291,   292,   293,   294,
+     295,   296,   297,   298,   299,   300,   301,   302,   303,   304,
+     305,   306,   307,   308,   309,   310,   311,   312,   313,   314,
+     315,   316,   317,   318,   319,   320,   321,   322,   527,     0,
+     408,   324,   409,   410,   411,   412,   413,   414,   415,   416,
+     417,   418,   419,   420,     0,     0,   421,   422,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,   423,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,   425,   426,   427,   428,
+       3,     4,     5,     6,     7,     0,     9,    10,    11,    12,
+      13,    14,    15,    16,    17,    18,    19,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,    21,
+      22,    23,    24,    25,    26,    27,    28,    29,    30,    31,
+      32,    33,    34,    35,    36,    37,    38,    39,    40,    41,
+      42,    43,    44,    45,    46,    47,    48,    49,    50,    51,
+      52,    53,    54,    55,    56,    57,    58,    59,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,    85,    86,    87,    88,    89,    90,    91,
+      92,    93,    94,    95,    96,    97,    98,    99,   100,   101,
+     102,   103,   104,   105,   106,   107,   108,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,   118,   119,   120,   121,
+     122,   123,   124,   125,   126,   127,   128,   129,   130,   131,
+     132,   133,   134,   135,   136,   137,   138,   139,   140,   141,
+     142,   143,   144,   145,   146,   147,   148,   149,   150,   151,
+     152,   153,   154,   155,   156,   157,   158,   159,   160,   161,
+     162,   163,   164,   165,   166,   167,   168,   169,   170,   171,
+     172,   173,   174,   175,   176,   177,   178,   179,   180,   181,
+     182,   183,   184,   185,   186,   187,   188,   189,   190,   191,
+     192,   193,   194,   195,   196,   197,   198,   199,   200,   201,
+     202,   203,   204,   205,   206,   207,   208,   209,   210,   211,
+     212,   213,   214,   215,   216,   217,   218,   219,   220,   221,
+     222,   223,   224,   225,   226,   227,   228,   229,   230,   231,
+     232,   233,   234,   235,   236,   237,   238,   239,   240,   241,
+     242,   243,   244,   245,   246,   247,   248,   249,   250,   251,
+     252,   253,   254,   255,   256,   257,   258,   259,   260,   261,
+     262,   263,   264,   265,   266,   267,   268,   269,   270,   271,
+     272,   273,   274,   275,   276,   277,   278,   279,   280,   281,
+     282,   283,   284,   285,   286,   287,   288,   289,   290,   291,
+     292,   293,   294,   295,   296,   297,   298,   299,   300,   301,
+     302,   303,   304,   305,   306,   307,   308,   309,   310,   311,
+     312,   313,   314,   315,   316,   317,   318,   319,   320,   321,
+     322,   323,     0,     0,   324
+};
+
+static const yytype_int16 yycheck[] =
+{
+       0,     0,     0,   337,   345,    24,     0,    26,    27,   402,
+     379,    30,    81,   495,   361,   507,   464,   509,   461,   579,
+     512,   338,   338,   356,   357,   361,   383,   374,   643,   370,
+     354,   355,   366,   681,   373,   375,   375,   685,   352,   353,
+     375,   423,   382,   382,   437,   693,   661,   373,   383,   373,
+     375,   375,   399,   400,   375,   379,   390,   382,   391,   392,
+     396,   377,   383,   373,   375,   380,   383,   374,   383,   374,
+     513,   382,   374,   380,   377,   379,   374,   380,   380,   376,
+     383,   374,   380,   380,   374,   567,   455,   380,   380,   458,
+     380,   383,   474,   378,   476,   380,   363,   364,   365,   366,
+     367,   368,   369,   370,   371,   372,   374,   385,   600,   387,
+     558,   380,   380,   338,   507,   382,   509,   421,   422,   512,
+     374,   462,   538,   539,   540,   541,   380,   461,   380,   380,
+     464,   383,   383,   526,   338,   380,   440,   697,   383,   380,
+     522,   375,   383,   399,   400,   401,   388,   389,   390,   358,
+     359,   455,   380,   381,   458,   377,   604,   380,   381,   377,
+     652,   534,   535,   542,   543,   647,   536,   537,   338,   338,
+     375,   382,   338,   383,   374,   373,   395,   394,   393,   513,
+     360,   362,   376,   338,   338,   373,   383,   569,   383,   373,
+     383,   573,   381,   375,   373,   373,   338,   373,   591,   592,
+     373,   378,   338,   374,   376,   338,   698,   600,   376,   337,
+     373,   373,   338,   560,   374,   380,   377,   376,   374,   383,
+     378,    25,   374,   545,   558,   707,   377,   531,   532,   533,
+     534,   535,   536,   537,   538,   539,   540,   541,   542,   543,
+     544,   545,   546,   547,   548,   549,   377,   382,   630,   383,
+     544,   378,   547,   549,   668,   546,   370,   366,   370,   652,
+     548,   643,   638,   331,   460,   680,   693,   635,   694,   338,
+     604,   364,   559,   638,   505,   661,   505,   353,   505,   661,
+     670,   674,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,   675,    -1,    -1,    -1,    -1,    -1,   668,
+      -1,    -1,    -1,    -1,    -1,   698,    -1,    -1,    -1,   643,
+     692,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   337,    -1,
+      -1,    -1,    -1,    -1,    -1,   666,    -1,   661,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,   337,    -1,    -1,
+      -1,    -1,    -1,   337,    -1,   345,    -1,    -1,    -1,    -1,
+      -1,   345,    -1,   353,   353,   353,    -1,    -1,    -1,   353,
+     360,    -1,    -1,    -1,   668,    -1,   366,    -1,    -1,    -1,
+     370,    -1,   366,    -1,    -1,    -1,   370,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+     390,    -1,    -1,    -1,   394,    -1,   390,    -1,    -1,    -1,
+     394,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,   260,    -1,     3,     4,     5,     6,     7,     8,
-       9,    10,    11,    12,    13,    -1,    -1,    -1,    -1,    -1,
-      -1,   279,   280,   281,   282,   283,    25,    26,    27,    28,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,   461,   462,    -1,   464,    -1,    -1,   461,   462,    -1,
+     464,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,   495,    -1,    -1,    -1,    -1,
+      -1,   495,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,   513,    -1,    -1,    -1,    -1,    -1,   513,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   558,    -1,
+      -1,    -1,    -1,    -1,   558,    -1,    -1,   567,    -1,    -1,
+      -1,    -1,    -1,   567,    -1,    -1,    -1,    -1,    -1,   579,
+      -1,    -1,    -1,    -1,    -1,   579,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,   604,    -1,    -1,    -1,    -1,    -1,
+     604,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   638,    -1,
+      -1,    -1,    -1,   643,   638,    -1,    -1,   647,    -1,   643,
+      -1,    -1,    -1,   647,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,   661,    -1,    -1,    -1,    -1,   666,   661,    -1,    -1,
+      -1,    -1,   666,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,   681,    -1,    -1,    -1,   685,    -1,   681,    -1,    -1,
+      -1,   685,    -1,   693,    -1,    -1,    -1,   697,    -1,   693,
+      -1,    -1,    -1,   697,    -1,    -1,    -1,   707,    -1,    -1,
+      -1,     0,    -1,   707,     3,     4,     5,     6,     7,     8,
+       9,    10,    11,    12,    13,    14,    15,    16,    17,    18,
+      19,    20,    21,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    33,    34,    35,    36,    37,    38,
+      39,    40,    41,    42,    43,    44,    45,    46,    47,    48,
+      49,    50,    51,    52,    53,    54,    55,    56,    57,    58,
+      59,    60,    61,    62,    63,    64,    65,    66,    67,    68,
+      69,    70,    71,    72,    73,    74,    75,    76,    77,    78,
+      79,    80,    81,    82,    83,    84,    85,    86,    87,    88,
+      89,    90,    91,    92,    93,    94,    95,    96,    97,    98,
+      99,   100,   101,   102,   103,   104,   105,   106,   107,   108,
+     109,   110,   111,   112,   113,   114,   115,   116,   117,   118,
+     119,   120,   121,   122,   123,   124,   125,   126,   127,   128,
+     129,   130,   131,   132,   133,   134,   135,   136,   137,   138,
+     139,   140,   141,   142,   143,   144,   145,   146,   147,   148,
+     149,   150,   151,   152,   153,   154,   155,   156,   157,   158,
+     159,   160,   161,   162,   163,   164,   165,   166,   167,   168,
+     169,   170,   171,   172,   173,   174,   175,   176,   177,   178,
+     179,   180,   181,   182,   183,   184,   185,   186,   187,   188,
+     189,   190,   191,   192,   193,   194,   195,   196,   197,   198,
+     199,   200,   201,   202,   203,   204,   205,   206,   207,   208,
+     209,   210,   211,   212,   213,   214,   215,   216,   217,   218,
+     219,   220,   221,   222,   223,   224,   225,   226,   227,   228,
+     229,   230,   231,   232,   233,   234,   235,   236,   237,   238,
+     239,   240,   241,   242,   243,   244,   245,   246,   247,   248,
+     249,   250,   251,   252,   253,   254,   255,   256,   257,   258,
+     259,   260,   261,   262,   263,   264,   265,   266,   267,   268,
+     269,   270,   271,   272,   273,   274,   275,   276,   277,   278,
+     279,   280,   281,   282,   283,   284,   285,   286,   287,   288,
+     289,   290,   291,   292,   293,   294,   295,   296,   297,   298,
+     299,   300,   301,   302,   303,   304,   305,   306,   307,   308,
+     309,   310,   311,   312,   313,   314,   315,   316,   317,   318,
+     319,   320,   321,   322,   323,   324,   325,   326,   327,   328,
+     329,   330,   331,   332,   333,   334,   335,   336,    -1,    -1,
+     339,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,   383,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   397,   398,
+     399,   400,   401,   402,     3,     4,     5,     6,     7,     8,
+       9,    10,    11,    12,    13,    14,    15,    16,    17,    18,
+      19,    20,    21,    22,    23,    24,    -1,    26,    27,    28,
       29,    30,    31,    32,    33,    34,    35,    36,    37,    38,
       39,    40,    41,    42,    43,    44,    45,    46,    47,    48,
       49,    50,    51,    52,    53,    54,    55,    56,    57,    58,
@@ -2187,14 +2450,308 @@
      189,   190,   191,   192,   193,   194,   195,   196,   197,   198,
      199,   200,   201,   202,   203,   204,   205,   206,   207,   208,
      209,   210,   211,   212,   213,   214,   215,   216,   217,   218,
-     219,   220,   221,   222,    -1,    -1,   225,    -1,    -1,    -1,
+     219,   220,   221,   222,   223,   224,   225,   226,   227,   228,
+     229,   230,   231,   232,   233,   234,   235,   236,   237,   238,
+     239,   240,   241,   242,   243,   244,   245,   246,   247,   248,
+     249,   250,   251,   252,   253,   254,   255,   256,   257,   258,
+     259,   260,   261,   262,   263,   264,   265,   266,   267,   268,
+     269,   270,   271,   272,   273,   274,   275,   276,   277,   278,
+     279,   280,   281,   282,   283,   284,   285,   286,   287,   288,
+     289,   290,   291,   292,   293,   294,   295,   296,   297,   298,
+     299,   300,   301,   302,   303,   304,   305,   306,   307,   308,
+     309,   310,   311,   312,   313,   314,   315,   316,   317,   318,
+     319,   320,   321,   322,   323,   324,   325,   326,   327,   328,
+     329,   330,   331,   332,   333,   334,   335,   336,   337,   338,
+     339,   340,   341,   342,   343,   344,   345,   346,   347,   348,
+     349,   350,   351,    -1,    -1,   354,   355,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,   373,    -1,   375,    -1,   377,   378,
+      -1,    -1,    -1,    -1,   383,   384,   385,   386,   387,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   397,   398,
+     399,   400,   401,   402,     3,     4,     5,     6,     7,     8,
+       9,    10,    11,    12,    13,    14,    15,    16,    17,    18,
+      19,    20,    21,    22,    23,    24,    -1,    26,    27,    28,
+      29,    30,    31,    32,    33,    34,    35,    36,    37,    38,
+      39,    40,    41,    42,    43,    44,    45,    46,    47,    48,
+      49,    50,    51,    52,    53,    54,    55,    56,    57,    58,
+      59,    60,    61,    62,    63,    64,    65,    66,    67,    68,
+      69,    70,    71,    72,    73,    74,    75,    76,    77,    78,
+      79,    80,    81,    82,    83,    84,    85,    86,    87,    88,
+      89,    90,    91,    92,    93,    94,    95,    96,    97,    98,
+      99,   100,   101,   102,   103,   104,   105,   106,   107,   108,
+     109,   110,   111,   112,   113,   114,   115,   116,   117,   118,
+     119,   120,   121,   122,   123,   124,   125,   126,   127,   128,
+     129,   130,   131,   132,   133,   134,   135,   136,   137,   138,
+     139,   140,   141,   142,   143,   144,   145,   146,   147,   148,
+     149,   150,   151,   152,   153,   154,   155,   156,   157,   158,
+     159,   160,   161,   162,   163,   164,   165,   166,   167,   168,
+     169,   170,   171,   172,   173,   174,   175,   176,   177,   178,
+     179,   180,   181,   182,   183,   184,   185,   186,   187,   188,
+     189,   190,   191,   192,   193,   194,   195,   196,   197,   198,
+     199,   200,   201,   202,   203,   204,   205,   206,   207,   208,
+     209,   210,   211,   212,   213,   214,   215,   216,   217,   218,
+     219,   220,   221,   222,   223,   224,   225,   226,   227,   228,
+     229,   230,   231,   232,   233,   234,   235,   236,   237,   238,
+     239,   240,   241,   242,   243,   244,   245,   246,   247,   248,
+     249,   250,   251,   252,   253,   254,   255,   256,   257,   258,
+     259,   260,   261,   262,   263,   264,   265,   266,   267,   268,
+     269,   270,   271,   272,   273,   274,   275,   276,   277,   278,
+     279,   280,   281,   282,   283,   284,   285,   286,   287,   288,
+     289,   290,   291,   292,   293,   294,   295,   296,   297,   298,
+     299,   300,   301,   302,   303,   304,   305,   306,   307,   308,
+     309,   310,   311,   312,   313,   314,   315,   316,   317,   318,
+     319,   320,   321,   322,   323,   324,   325,   326,   327,   328,
+     329,   330,   331,   332,   333,   334,   335,   336,   337,   338,
+     339,   340,   341,   342,   343,   344,   345,   346,   347,   348,
+     349,   350,   351,    -1,    -1,   354,   355,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,   373,    -1,   375,    -1,   377,   378,
+      -1,    -1,    -1,    -1,   383,   384,   385,   386,   387,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   397,   398,
+     399,   400,   401,   402,     3,     4,     5,     6,     7,     8,
+       9,    10,    11,    12,    13,    14,    15,    16,    17,    18,
+      19,    20,    21,    22,    23,    24,    -1,    26,    27,    28,
+      29,    30,    31,    32,    33,    34,    35,    36,    37,    38,
+      39,    40,    41,    42,    43,    44,    45,    46,    47,    48,
+      49,    50,    51,    52,    53,    54,    55,    56,    57,    58,
+      59,    60,    61,    62,    63,    64,    65,    66,    67,    68,
+      69,    70,    71,    72,    73,    74,    75,    76,    77,    78,
+      79,    80,    81,    82,    83,    84,    85,    86,    87,    88,
+      89,    90,    91,    92,    93,    94,    95,    96,    97,    98,
+      99,   100,   101,   102,   103,   104,   105,   106,   107,   108,
+     109,   110,   111,   112,   113,   114,   115,   116,   117,   118,
+     119,   120,   121,   122,   123,   124,   125,   126,   127,   128,
+     129,   130,   131,   132,   133,   134,   135,   136,   137,   138,
+     139,   140,   141,   142,   143,   144,   145,   146,   147,   148,
+     149,   150,   151,   152,   153,   154,   155,   156,   157,   158,
+     159,   160,   161,   162,   163,   164,   165,   166,   167,   168,
+     169,   170,   171,   172,   173,   174,   175,   176,   177,   178,
+     179,   180,   181,   182,   183,   184,   185,   186,   187,   188,
+     189,   190,   191,   192,   193,   194,   195,   196,   197,   198,
+     199,   200,   201,   202,   203,   204,   205,   206,   207,   208,
+     209,   210,   211,   212,   213,   214,   215,   216,   217,   218,
+     219,   220,   221,   222,   223,   224,   225,   226,   227,   228,
+     229,   230,   231,   232,   233,   234,   235,   236,   237,   238,
+     239,   240,   241,   242,   243,   244,   245,   246,   247,   248,
+     249,   250,   251,   252,   253,   254,   255,   256,   257,   258,
+     259,   260,   261,   262,   263,   264,   265,   266,   267,   268,
+     269,   270,   271,   272,   273,   274,   275,   276,   277,   278,
+     279,   280,   281,   282,   283,   284,   285,   286,   287,   288,
+     289,   290,   291,   292,   293,   294,   295,   296,   297,   298,
+     299,   300,   301,   302,   303,   304,   305,   306,   307,   308,
+     309,   310,   311,   312,   313,   314,   315,   316,   317,   318,
+     319,   320,   321,   322,   323,   324,   325,   326,   327,   328,
+     329,   330,   331,   332,   333,   334,   335,   336,   337,   338,
+     339,   340,   341,   342,   343,   344,   345,   346,   347,   348,
+     349,   350,   351,    -1,    -1,   354,   355,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,   373,    -1,   375,    -1,   377,    -1,
+      -1,    -1,    -1,    -1,   383,   384,   385,   386,   387,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   397,   398,
+     399,   400,   401,   402,     3,     4,     5,     6,     7,     8,
+       9,    10,    11,    12,    13,    14,    15,    16,    17,    18,
+      19,    20,    21,    22,    23,    24,    -1,    26,    27,    28,
+      29,    30,    31,    32,    33,    34,    35,    36,    37,    38,
+      39,    40,    41,    42,    43,    44,    45,    46,    47,    48,
+      49,    50,    51,    52,    53,    54,    55,    56,    57,    58,
+      59,    60,    61,    62,    63,    64,    65,    66,    67,    68,
+      69,    70,    71,    72,    73,    74,    75,    76,    77,    78,
+      79,    80,    81,    82,    83,    84,    85,    86,    87,    88,
+      89,    90,    91,    92,    93,    94,    95,    96,    97,    98,
+      99,   100,   101,   102,   103,   104,   105,   106,   107,   108,
+     109,   110,   111,   112,   113,   114,   115,   116,   117,   118,
+     119,   120,   121,   122,   123,   124,   125,   126,   127,   128,
+     129,   130,   131,   132,   133,   134,   135,   136,   137,   138,
+     139,   140,   141,   142,   143,   144,   145,   146,   147,   148,
+     149,   150,   151,   152,   153,   154,   155,   156,   157,   158,
+     159,   160,   161,   162,   163,   164,   165,   166,   167,   168,
+     169,   170,   171,   172,   173,   174,   175,   176,   177,   178,
+     179,   180,   181,   182,   183,   184,   185,   186,   187,   188,
+     189,   190,   191,   192,   193,   194,   195,   196,   197,   198,
+     199,   200,   201,   202,   203,   204,   205,   206,   207,   208,
+     209,   210,   211,   212,   213,   214,   215,   216,   217,   218,
+     219,   220,   221,   222,   223,   224,   225,   226,   227,   228,
+     229,   230,   231,   232,   233,   234,   235,   236,   237,   238,
+     239,   240,   241,   242,   243,   244,   245,   246,   247,   248,
+     249,   250,   251,   252,   253,   254,   255,   256,   257,   258,
+     259,   260,   261,   262,   263,   264,   265,   266,   267,   268,
+     269,   270,   271,   272,   273,   274,   275,   276,   277,   278,
+     279,   280,   281,   282,   283,   284,   285,   286,   287,   288,
+     289,   290,   291,   292,   293,   294,   295,   296,   297,   298,
+     299,   300,   301,   302,   303,   304,   305,   306,   307,   308,
+     309,   310,   311,   312,   313,   314,   315,   316,   317,   318,
+     319,   320,   321,   322,   323,   324,   325,   326,   327,   328,
+     329,   330,   331,   332,   333,   334,   335,   336,   337,   338,
+     339,   340,   341,   342,   343,   344,   345,   346,   347,   348,
+     349,   350,   351,    -1,    -1,   354,   355,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,   373,    -1,   375,    -1,   377,    -1,
+      -1,    -1,    -1,    -1,   383,   384,   385,   386,   387,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   397,   398,
+     399,   400,   401,   402,     3,     4,     5,     6,     7,     8,
+       9,    10,    11,    12,    13,    14,    15,    16,    17,    18,
+      19,    20,    21,    22,    23,    24,    -1,    26,    27,    28,
+      29,    30,    31,    32,    33,    34,    35,    36,    37,    38,
+      39,    40,    41,    42,    43,    44,    45,    46,    47,    48,
+      49,    50,    51,    52,    53,    54,    55,    56,    57,    58,
+      59,    60,    61,    62,    63,    64,    65,    66,    67,    68,
+      69,    70,    71,    72,    73,    74,    75,    76,    77,    78,
+      79,    80,    81,    82,    83,    84,    85,    86,    87,    88,
+      89,    90,    91,    92,    93,    94,    95,    96,    97,    98,
+      99,   100,   101,   102,   103,   104,   105,   106,   107,   108,
+     109,   110,   111,   112,   113,   114,   115,   116,   117,   118,
+     119,   120,   121,   122,   123,   124,   125,   126,   127,   128,
+     129,   130,   131,   132,   133,   134,   135,   136,   137,   138,
+     139,   140,   141,   142,   143,   144,   145,   146,   147,   148,
+     149,   150,   151,   152,   153,   154,   155,   156,   157,   158,
+     159,   160,   161,   162,   163,   164,   165,   166,   167,   168,
+     169,   170,   171,   172,   173,   174,   175,   176,   177,   178,
+     179,   180,   181,   182,   183,   184,   185,   186,   187,   188,
+     189,   190,   191,   192,   193,   194,   195,   196,   197,   198,
+     199,   200,   201,   202,   203,   204,   205,   206,   207,   208,
+     209,   210,   211,   212,   213,   214,   215,   216,   217,   218,
+     219,   220,   221,   222,   223,   224,   225,   226,   227,   228,
+     229,   230,   231,   232,   233,   234,   235,   236,   237,   238,
+     239,   240,   241,   242,   243,   244,   245,   246,   247,   248,
+     249,   250,   251,   252,   253,   254,   255,   256,   257,   258,
+     259,   260,   261,   262,   263,   264,   265,   266,   267,   268,
+     269,   270,   271,   272,   273,   274,   275,   276,   277,   278,
+     279,   280,   281,   282,   283,   284,   285,   286,   287,   288,
+     289,   290,   291,   292,   293,   294,   295,   296,   297,   298,
+     299,   300,   301,   302,   303,   304,   305,   306,   307,   308,
+     309,   310,   311,   312,   313,   314,   315,   316,   317,   318,
+     319,   320,   321,   322,   323,   324,   325,   326,   327,   328,
+     329,   330,   331,   332,   333,   334,   335,   336,   337,   338,
+     339,   340,   341,   342,   343,   344,   345,   346,   347,   348,
+     349,   350,   351,    -1,    -1,   354,   355,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,   373,    -1,   375,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,   383,   384,   385,   386,   387,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   397,   398,
+     399,   400,   401,   402,     3,     4,     5,     6,     7,     8,
+       9,    10,    11,    12,    13,    14,    15,    16,    17,    18,
+      19,    20,    21,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    33,    34,    35,    36,    37,    38,
+      39,    40,    41,    42,    43,    44,    45,    46,    47,    48,
+      49,    50,    51,    52,    53,    54,    55,    56,    57,    58,
+      59,    60,    61,    62,    63,    64,    65,    66,    67,    68,
+      69,    70,    71,    72,    73,    74,    75,    76,    77,    78,
+      79,    80,    81,    82,    83,    84,    85,    86,    87,    88,
+      89,    90,    91,    92,    93,    94,    95,    96,    97,    98,
+      99,   100,   101,   102,   103,   104,   105,   106,   107,   108,
+     109,   110,   111,   112,   113,   114,   115,   116,   117,   118,
+     119,   120,   121,   122,   123,   124,   125,   126,   127,   128,
+     129,   130,   131,   132,   133,   134,   135,   136,   137,   138,
+     139,   140,   141,   142,   143,   144,   145,   146,   147,   148,
+     149,   150,   151,   152,   153,   154,   155,   156,   157,   158,
+     159,   160,   161,   162,   163,   164,   165,   166,   167,   168,
+     169,   170,   171,   172,   173,   174,   175,   176,   177,   178,
+     179,   180,   181,   182,   183,   184,   185,   186,   187,   188,
+     189,   190,   191,   192,   193,   194,   195,   196,   197,   198,
+     199,   200,   201,   202,   203,   204,   205,   206,   207,   208,
+     209,   210,   211,   212,   213,   214,   215,   216,   217,   218,
+     219,   220,   221,   222,   223,   224,   225,   226,   227,   228,
+     229,   230,   231,   232,   233,   234,   235,   236,   237,   238,
+     239,   240,   241,   242,   243,   244,   245,   246,   247,   248,
+     249,   250,   251,   252,   253,   254,   255,   256,   257,   258,
+     259,   260,   261,   262,   263,   264,   265,   266,   267,   268,
+     269,   270,   271,   272,   273,   274,   275,   276,   277,   278,
+     279,   280,   281,   282,   283,   284,   285,   286,   287,   288,
+     289,   290,   291,   292,   293,   294,   295,   296,   297,   298,
+     299,   300,   301,   302,   303,   304,   305,   306,   307,   308,
+     309,   310,   311,   312,   313,   314,   315,   316,   317,   318,
+     319,   320,   321,   322,   323,   324,   325,   326,   327,   328,
+     329,   330,   331,   332,   333,   334,   335,   336,    -1,   338,
+     339,   340,   341,   342,   343,   344,   345,   346,   347,   348,
+     349,   350,   351,    -1,    -1,   354,   355,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,   373,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,   383,   384,   385,   386,   387,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   397,   398,
+     399,   400,   401,   402,     3,     4,     5,     6,     7,     8,
+       9,    10,    11,    12,    13,    14,    15,    16,    17,    18,
+      19,    20,    21,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    33,    34,    35,    36,    37,    38,
+      39,    40,    41,    42,    43,    44,    45,    46,    47,    48,
+      49,    50,    51,    52,    53,    54,    55,    56,    57,    58,
+      59,    60,    61,    62,    63,    64,    65,    66,    67,    68,
+      69,    70,    71,    72,    73,    74,    75,    76,    77,    78,
+      79,    80,    81,    82,    83,    84,    85,    86,    87,    88,
+      89,    90,    91,    92,    93,    94,    95,    96,    97,    98,
+      99,   100,   101,   102,   103,   104,   105,   106,   107,   108,
+     109,   110,   111,   112,   113,   114,   115,   116,   117,   118,
+     119,   120,   121,   122,   123,   124,   125,   126,   127,   128,
+     129,   130,   131,   132,   133,   134,   135,   136,   137,   138,
+     139,   140,   141,   142,   143,   144,   145,   146,   147,   148,
+     149,   150,   151,   152,   153,   154,   155,   156,   157,   158,
+     159,   160,   161,   162,   163,   164,   165,   166,   167,   168,
+     169,   170,   171,   172,   173,   174,   175,   176,   177,   178,
+     179,   180,   181,   182,   183,   184,   185,   186,   187,   188,
+     189,   190,   191,   192,   193,   194,   195,   196,   197,   198,
+     199,   200,   201,   202,   203,   204,   205,   206,   207,   208,
+     209,   210,   211,   212,   213,   214,   215,   216,   217,   218,
+     219,   220,   221,   222,   223,   224,   225,   226,   227,   228,
+     229,   230,   231,   232,   233,   234,   235,   236,   237,   238,
+     239,   240,   241,   242,   243,   244,   245,   246,   247,   248,
+     249,   250,   251,   252,   253,   254,   255,   256,   257,   258,
+     259,   260,   261,   262,   263,   264,   265,   266,   267,   268,
+     269,   270,   271,   272,   273,   274,   275,   276,   277,   278,
+     279,   280,   281,   282,   283,   284,   285,   286,   287,   288,
+     289,   290,   291,   292,   293,   294,   295,   296,   297,   298,
+     299,   300,   301,   302,   303,   304,   305,   306,   307,   308,
+     309,   310,   311,   312,   313,   314,   315,   316,   317,   318,
+     319,   320,   321,   322,   323,   324,   325,   326,   327,   328,
+     329,   330,   331,   332,   333,   334,   335,   336,    -1,    -1,
+     339,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,   260,    -1,     3,     4,     5,     6,     7,     8,     9,
-      10,    11,    12,    13,    -1,    -1,    -1,    -1,    -1,    -1,
-     279,   280,   281,   282,   283,    25,    26,    27,    28,    29,
-      30,    31,    32,    33,    34,    35,    36,    37,    38,    39,
+      -1,    -1,    -1,    -1,   383,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   397,   398,
+     399,   400,   401,   402,     3,     4,     5,     6,     7,     8,
+       9,    10,    11,    12,    13,    14,    15,    16,    17,    18,
+      19,    20,    21,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    33,    34,    35,    36,    37,    38,
+      39,    40,    41,    42,    43,    44,    45,    46,    47,    48,
+      49,    50,    51,    52,    53,    54,    55,    56,    57,    58,
+      59,    60,    61,    62,    63,    64,    65,    66,    67,    68,
+      69,    70,    71,    72,    73,    74,    75,    76,    77,    78,
+      79,    80,    81,    82,    83,    84,    85,    86,    87,    88,
+      89,    90,    91,    92,    93,    94,    95,    96,    97,    98,
+      99,   100,   101,   102,   103,   104,   105,   106,   107,   108,
+     109,   110,   111,   112,   113,   114,   115,   116,   117,   118,
+     119,   120,   121,   122,   123,   124,   125,   126,   127,   128,
+     129,   130,   131,   132,   133,   134,   135,   136,   137,   138,
+     139,   140,   141,   142,   143,   144,   145,   146,   147,   148,
+     149,   150,   151,   152,   153,   154,   155,   156,   157,   158,
+     159,   160,   161,   162,   163,   164,   165,   166,   167,   168,
+     169,   170,   171,   172,   173,   174,   175,   176,   177,   178,
+     179,   180,   181,   182,   183,   184,   185,   186,   187,   188,
+     189,   190,   191,   192,   193,   194,   195,   196,   197,   198,
+     199,   200,   201,   202,   203,   204,   205,   206,   207,   208,
+     209,   210,   211,   212,   213,   214,   215,   216,   217,   218,
+     219,   220,   221,   222,   223,   224,   225,   226,   227,   228,
+     229,   230,   231,   232,   233,   234,   235,   236,   237,   238,
+     239,   240,   241,   242,   243,   244,   245,   246,   247,   248,
+     249,   250,   251,   252,   253,   254,   255,   256,   257,   258,
+     259,   260,   261,   262,   263,   264,   265,   266,   267,   268,
+     269,   270,   271,   272,   273,   274,   275,   276,   277,   278,
+     279,   280,   281,   282,   283,   284,   285,   286,   287,   288,
+     289,   290,   291,   292,   293,   294,   295,   296,   297,   298,
+     299,   300,   301,   302,   303,   304,   305,   306,   307,   308,
+     309,   310,   311,   312,   313,   314,   315,   316,   317,   318,
+     319,   320,   321,   322,   323,   324,   325,   326,   327,   328,
+     329,   330,   331,   332,   333,   334,   335,   336,    -1,   338,
+     339,   340,   341,   342,   343,   344,   345,   346,   347,   348,
+     349,   350,   351,    -1,    -1,   354,   355,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,   373,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,   384,   385,   386,   387,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   397,   398,
+     399,   400,   401,     3,     4,     5,     6,     7,     8,     9,
+      10,    11,    12,    13,    14,    15,    16,    17,    18,    19,
+      20,    21,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    33,    34,    35,    36,    37,    38,    39,
       40,    41,    42,    43,    44,    45,    46,    47,    48,    49,
       50,    51,    52,    53,    54,    55,    56,    57,    58,    59,
       60,    61,    62,    63,    64,    65,    66,    67,    68,    69,
@@ -2213,14 +2770,28 @@
      190,   191,   192,   193,   194,   195,   196,   197,   198,   199,
      200,   201,   202,   203,   204,   205,   206,   207,   208,   209,
      210,   211,   212,   213,   214,   215,   216,   217,   218,   219,
-     220,   221,   222,    -1,    -1,   225,    -1,    -1,    -1,    -1,
+     220,   221,   222,   223,   224,   225,   226,   227,   228,   229,
+     230,   231,   232,   233,   234,   235,   236,   237,   238,   239,
+     240,   241,   242,   243,   244,   245,   246,   247,   248,   249,
+     250,   251,   252,   253,   254,   255,   256,   257,   258,   259,
+     260,   261,   262,   263,   264,   265,   266,   267,   268,   269,
+     270,   271,   272,   273,   274,   275,   276,   277,   278,   279,
+     280,   281,   282,   283,   284,   285,   286,   287,   288,   289,
+     290,   291,   292,   293,   294,   295,   296,   297,   298,   299,
+     300,   301,   302,   303,   304,   305,   306,   307,   308,   309,
+     310,   311,   312,   313,   314,   315,   316,   317,   318,   319,
+     320,   321,   322,   323,   324,   325,   326,   327,   328,   329,
+     330,   331,   332,   333,   334,   335,   336,    -1,   338,   339,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-     260,    -1,     3,     4,     5,     6,     7,     8,     9,    10,
-      11,    12,    13,    -1,    -1,    -1,    -1,    -1,    -1,   279,
-     280,   281,   282,   283,    25,    26,    27,    28,    29,    30,
-      31,    32,    33,    34,    35,    36,    37,    38,    39,    40,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,   383,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,   397,   398,   399,
+     400,   401,     3,     4,     5,     6,     7,     8,     9,    10,
+      11,    12,    13,    14,    15,    16,    17,    18,    19,    20,
+      21,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    33,    34,    35,    36,    37,    38,    39,    40,
       41,    42,    43,    44,    45,    46,    47,    48,    49,    50,
       51,    52,    53,    54,    55,    56,    57,    58,    59,    60,
       61,    62,    63,    64,    65,    66,    67,    68,    69,    70,
@@ -2239,120 +2810,32 @@
      191,   192,   193,   194,   195,   196,   197,   198,   199,   200,
      201,   202,   203,   204,   205,   206,   207,   208,   209,   210,
      211,   212,   213,   214,   215,   216,   217,   218,   219,   220,
-     221,   222,    -1,    -1,   225,    -1,    -1,    -1,     6,     7,
-       8,     9,    10,    11,    12,    13,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    26,    27,
-      28,    29,    30,    31,    32,    33,    34,    35,    36,    37,
-      38,    39,    40,    41,    42,    43,    44,    45,    46,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   279,   280,
-     281,   282,   283,    61,    62,    63,    64,    65,    66,    67,
-      68,    69,    70,    71,    72,    -1,    -1,    -1,    -1,    -1,
-      78,    79,    80,    81,    82,    83,    84,    85,    86,    87,
-      88,    89,    90,    91,    92,    93,    94,    95,    96,    97,
-      98,    99,   100,   101,   102,   103,   104,   105,   106,   107,
-     108,   109,   110,   111,   112,   113,   114,   115,   116,   117,
-     118,   119,   120,   121,   122,   123,   124,   125,   126,   127,
-     128,   129,   130,   131,   132,   133,   134,   135,   136,   137,
-     138,   139,   140,   141,   142,   143,   144,   145,   146,   147,
-     148,   149,   150,   151,   152,   153,   154,   155,   156,   157,
-     158,   159,   160,   161,   162,   163,   164,   165,   166,   167,
-     168,   169,   170,   171,   172,   173,   174,   175,   176,   177,
-     178,   179,   180,   181,   182,   183,   184,   185,   186,   187,
-     188,   189,   190,   191,   192,   193,   194,   195,   196,   197,
-     198,   199,   200,   201,   202,   203,   204,   205,   206,   207,
-     208,   209,   210,   211,   212,   213,   214,   215,   216,   217,
-     218,   219,   220,   221,   222,    -1,   224,   225,   226,   227,
-     228,   229,   230,   231,   232,   233,    -1,    -1,   236,   237,
+     221,   222,   223,   224,   225,   226,   227,   228,   229,   230,
+     231,   232,   233,   234,   235,   236,   237,   238,   239,   240,
+     241,   242,   243,   244,   245,   246,   247,   248,   249,   250,
+     251,   252,   253,   254,   255,   256,   257,   258,   259,   260,
+     261,   262,   263,   264,   265,   266,   267,   268,   269,   270,
+     271,   272,   273,   274,   275,   276,   277,   278,   279,   280,
+     281,   282,   283,   284,   285,   286,   287,   288,   289,   290,
+     291,   292,   293,   294,   295,   296,   297,   298,   299,   300,
+     301,   302,   303,   304,   305,   306,   307,   308,   309,   310,
+     311,   312,   313,   314,   315,   316,   317,   318,   319,   320,
+     321,   322,   323,   324,   325,   326,   327,   328,   329,   330,
+     331,   332,   333,   334,   335,   336,    -1,    -1,   339,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,   255,    -1,    -1,
-      -1,   259,   260,    -1,    -1,    -1,    -1,    -1,   266,   267,
-     268,   269,     6,     7,     8,     9,    10,    11,    12,    13,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    26,    27,    28,    29,    30,    31,    32,    33,
-      34,    35,    36,    37,    38,    39,    40,    41,    42,    43,
-      44,    45,    46,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    61,    62,    63,
-      64,    65,    66,    67,    68,    69,    70,    71,    72,    -1,
-      -1,    -1,    -1,    -1,    78,    79,    80,    81,    82,    83,
-      84,    85,    86,    87,    88,    89,    90,    91,    92,    93,
-      94,    95,    96,    97,    98,    99,   100,   101,   102,   103,
-     104,   105,   106,   107,   108,   109,   110,   111,   112,   113,
-     114,   115,   116,   117,   118,   119,   120,   121,   122,   123,
-     124,   125,   126,   127,   128,   129,   130,   131,   132,   133,
-     134,   135,   136,   137,   138,   139,   140,   141,   142,   143,
-     144,   145,   146,   147,   148,   149,   150,   151,   152,   153,
-     154,   155,   156,   157,   158,   159,   160,   161,   162,   163,
-     164,   165,   166,   167,   168,   169,   170,   171,   172,   173,
-     174,   175,   176,   177,   178,   179,   180,   181,   182,   183,
-     184,   185,   186,   187,   188,   189,   190,   191,   192,   193,
-     194,   195,   196,   197,   198,   199,   200,   201,   202,   203,
-     204,   205,   206,   207,   208,   209,   210,   211,   212,   213,
-     214,   215,   216,   217,   218,   219,   220,   221,   222,    -1,
-     224,   225,   226,   227,   228,   229,   230,   231,   232,   233,
-      -1,    -1,   236,   237,    -1,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,   255,    -1,    -1,   258,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,   266,   267,   268,   269,     6,     7,     8,     9,
-      10,    11,    12,    13,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    26,    27,    28,    29,
-      30,    31,    32,    33,    34,    35,    36,    37,    38,    39,
-      40,    41,    42,    43,    44,    45,    46,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,   378,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    61,    62,    63,    64,    65,    66,    67,    68,    69,
-      70,    71,    72,    -1,    -1,    -1,    -1,    -1,    78,    79,
-      80,    81,    82,    83,    84,    85,    86,    87,    88,    89,
-      90,    91,    92,    93,    94,    95,    96,    97,    98,    99,
-     100,   101,   102,   103,   104,   105,   106,   107,   108,   109,
-     110,   111,   112,   113,   114,   115,   116,   117,   118,   119,
-     120,   121,   122,   123,   124,   125,   126,   127,   128,   129,
-     130,   131,   132,   133,   134,   135,   136,   137,   138,   139,
-     140,   141,   142,   143,   144,   145,   146,   147,   148,   149,
-     150,   151,   152,   153,   154,   155,   156,   157,   158,   159,
-     160,   161,   162,   163,   164,   165,   166,   167,   168,   169,
-     170,   171,   172,   173,   174,   175,   176,   177,   178,   179,
-     180,   181,   182,   183,   184,   185,   186,   187,   188,   189,
-     190,   191,   192,   193,   194,   195,   196,   197,   198,   199,
-     200,   201,   202,   203,   204,   205,   206,   207,   208,   209,
-     210,   211,   212,   213,   214,   215,   216,   217,   218,   219,
-     220,   221,   222,    -1,   224,   225,   226,   227,   228,   229,
-     230,   231,   232,   233,    -1,    -1,   236,   237,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,   397,   398,   399,   400,
+     401,     3,     4,     5,     6,     7,     8,     9,    10,    11,
+      12,    13,    14,    15,    16,    17,    18,    19,    20,    21,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,   255,    -1,    -1,    -1,   259,
-      -1,    -1,    -1,    -1,    -1,    -1,   266,   267,   268,   269,
-       6,     7,     8,     9,    10,    11,    12,    13,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      26,    27,    28,    29,    30,    31,    32,    33,    34,    35,
-      36,    37,    38,    39,    40,    41,    42,    43,    44,    45,
-      46,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    61,    62,    63,    64,    65,
-      66,    67,    68,    69,    70,    71,    72,    -1,    -1,    -1,
-      -1,    -1,    78,    79,    80,    81,    82,    83,    84,    85,
-      86,    87,    88,    89,    90,    91,    92,    93,    94,    95,
-      96,    97,    98,    99,   100,   101,   102,   103,   104,   105,
-     106,   107,   108,   109,   110,   111,   112,   113,   114,   115,
-     116,   117,   118,   119,   120,   121,   122,   123,   124,   125,
-     126,   127,   128,   129,   130,   131,   132,   133,   134,   135,
-     136,   137,   138,   139,   140,   141,   142,   143,   144,   145,
-     146,   147,   148,   149,   150,   151,   152,   153,   154,   155,
-     156,   157,   158,   159,   160,   161,   162,   163,   164,   165,
-     166,   167,   168,   169,   170,   171,   172,   173,   174,   175,
-     176,   177,   178,   179,   180,   181,   182,   183,   184,   185,
-     186,   187,   188,   189,   190,   191,   192,   193,   194,   195,
-     196,   197,   198,   199,   200,   201,   202,   203,   204,   205,
-     206,   207,   208,   209,   210,   211,   212,   213,   214,   215,
-     216,   217,   218,   219,   220,   221,   222,    -1,   224,   225,
-     226,   227,   228,   229,   230,   231,   232,   233,    -1,    -1,
-     236,   237,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   255,
-      -1,    -1,   258,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-     266,   267,   268,   269,     6,     7,     8,     9,    10,    11,
-      12,    13,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    26,    27,    28,    29,    30,    31,
-      32,    33,    34,    35,    36,    37,    38,    39,    40,    41,
-      42,    43,    44,    45,    46,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    61,
+      -1,    33,    34,    35,    36,    37,    38,    39,    40,    41,
+      42,    43,    44,    45,    46,    47,    48,    49,    50,    51,
+      52,    53,    54,    55,    56,    57,    58,    59,    60,    61,
       62,    63,    64,    65,    66,    67,    68,    69,    70,    71,
-      72,    -1,    -1,    -1,    -1,    -1,    78,    79,    80,    81,
+      72,    73,    74,    75,    76,    77,    78,    79,    80,    81,
       82,    83,    84,    85,    86,    87,    88,    89,    90,    91,
       92,    93,    94,    95,    96,    97,    98,    99,   100,   101,
      102,   103,   104,   105,   106,   107,   108,   109,   110,   111,
@@ -2367,90 +2850,27 @@
      192,   193,   194,   195,   196,   197,   198,   199,   200,   201,
      202,   203,   204,   205,   206,   207,   208,   209,   210,   211,
      212,   213,   214,   215,   216,   217,   218,   219,   220,   221,
-     222,    -1,   224,   225,   226,   227,   228,   229,   230,   231,
-     232,   233,    -1,    -1,   236,   237,    -1,    -1,    -1,    -1,
+     222,   223,   224,   225,   226,   227,   228,   229,   230,   231,
+     232,   233,   234,   235,   236,   237,   238,   239,   240,   241,
+     242,   243,   244,   245,   246,   247,   248,   249,   250,   251,
+     252,   253,   254,   255,   256,   257,   258,   259,   260,   261,
+     262,   263,   264,   265,   266,   267,   268,   269,   270,   271,
+     272,   273,   274,   275,   276,   277,   278,   279,   280,   281,
+     282,   283,   284,   285,   286,   287,   288,   289,   290,   291,
+     292,   293,   294,   295,   296,   297,   298,   299,   300,   301,
+     302,   303,   304,   305,   306,   307,   308,   309,   310,   311,
+     312,   313,   314,   315,   316,   317,   318,   319,   320,   321,
+     322,   323,   324,   325,   326,   327,   328,   329,   330,   331,
+     332,   333,   334,   335,   336,    -1,    -1,   339,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,   255,     6,     7,     8,     9,    10,    11,
-      12,    13,    -1,   265,   266,   267,   268,   269,    -1,    -1,
-      -1,    -1,    -1,    -1,    26,    27,    28,    29,    30,    31,
-      32,    33,    34,    35,    36,    37,    38,    39,    40,    41,
-      42,    43,    44,    45,    46,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    61,
-      62,    63,    64,    65,    66,    67,    68,    69,    70,    71,
-      72,    -1,    -1,    -1,    -1,    -1,    78,    79,    80,    81,
-      82,    83,    84,    85,    86,    87,    88,    89,    90,    91,
-      92,    93,    94,    95,    96,    97,    98,    99,   100,   101,
-     102,   103,   104,   105,   106,   107,   108,   109,   110,   111,
-     112,   113,   114,   115,   116,   117,   118,   119,   120,   121,
-     122,   123,   124,   125,   126,   127,   128,   129,   130,   131,
-     132,   133,   134,   135,   136,   137,   138,   139,   140,   141,
-     142,   143,   144,   145,   146,   147,   148,   149,   150,   151,
-     152,   153,   154,   155,   156,   157,   158,   159,   160,   161,
-     162,   163,   164,   165,   166,   167,   168,   169,   170,   171,
-     172,   173,   174,   175,   176,   177,   178,   179,   180,   181,
-     182,   183,   184,   185,   186,   187,   188,   189,   190,   191,
-     192,   193,   194,   195,   196,   197,   198,   199,   200,   201,
-     202,   203,   204,   205,   206,   207,   208,   209,   210,   211,
-     212,   213,   214,   215,   216,   217,   218,   219,   220,   221,
-     222,    -1,   224,   225,   226,   227,   228,   229,   230,   231,
-     232,   233,    -1,    -1,   236,   237,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,   255,     6,     7,     8,     9,    10,    11,
-      12,    13,    -1,    -1,   266,   267,   268,   269,    -1,    -1,
-      -1,    -1,    -1,    -1,    26,    27,    28,    29,    30,    31,
-      32,    33,    34,    35,    36,    37,    38,    39,    40,    41,
-      42,    43,    44,    45,    46,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    61,
-      62,    63,    64,    65,    66,    67,    68,    69,    70,    71,
-      72,    -1,    -1,    -1,    -1,    -1,    78,    79,    80,    81,
-      82,    83,    84,    85,    86,    87,    88,    89,    90,    91,
-      92,    93,    94,    95,    96,    97,    98,    99,   100,   101,
-     102,   103,   104,   105,   106,   107,   108,   109,   110,   111,
-     112,   113,   114,   115,   116,   117,   118,   119,   120,   121,
-     122,   123,   124,   125,   126,   127,   128,   129,   130,   131,
-     132,   133,   134,   135,   136,   137,   138,   139,   140,   141,
-     142,   143,   144,   145,   146,   147,   148,   149,   150,   151,
-     152,   153,   154,   155,   156,   157,   158,   159,   160,   161,
-     162,   163,   164,   165,   166,   167,   168,   169,   170,   171,
-     172,   173,   174,   175,   176,   177,   178,   179,   180,   181,
-     182,   183,   184,   185,   186,   187,   188,   189,   190,   191,
-     192,   193,   194,   195,   196,   197,   198,   199,   200,   201,
-     202,   203,   204,   205,   206,   207,   208,   209,   210,   211,
-     212,   213,   214,   215,   216,   217,   218,   219,   220,   221,
-     222,    -1,   224,   225,   226,   227,   228,   229,   230,   231,
-     232,   233,    -1,    -1,   236,   237,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,   255,     6,     7,     8,     9,    10,    11,
-      12,    13,    -1,    -1,   266,   267,   268,   269,    -1,    -1,
-      -1,    -1,    -1,    -1,    26,    27,    28,    29,    30,    31,
-      32,    33,    34,    35,    36,    37,    38,    39,    40,    41,
-      42,    43,    44,    45,    46,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    61,
-      62,    63,    64,    65,    66,    67,    68,    69,    70,    71,
-      72,    -1,    -1,    -1,    -1,    -1,    78,    79,    80,    81,
-      82,    83,    84,    85,    86,    87,    88,    89,    90,    91,
-      92,    93,    94,    95,    96,    97,    98,    99,   100,   101,
-     102,   103,   104,   105,   106,   107,   108,   109,   110,   111,
-     112,   113,   114,   115,   116,   117,   118,   119,   120,   121,
-     122,   123,   124,   125,   126,   127,   128,   129,   130,   131,
-     132,   133,   134,   135,   136,   137,   138,   139,   140,   141,
-     142,   143,   144,   145,   146,   147,   148,   149,   150,   151,
-     152,   153,   154,   155,   156,   157,   158,   159,   160,   161,
-     162,   163,   164,   165,   166,   167,   168,   169,   170,   171,
-     172,   173,   174,   175,   176,   177,   178,   179,   180,   181,
-     182,   183,   184,   185,   186,   187,   188,   189,   190,   191,
-     192,   193,   194,   195,   196,   197,   198,   199,   200,   201,
-     202,   203,   204,   205,   206,   207,   208,   209,   210,   211,
-     212,   213,   214,   215,   216,   217,   218,   219,   220,   221,
-     222,    -1,    -1,   225
-};
-
-  /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
-     symbol of state STATE-NUM.  */
-static const yytype_uint16 yystos[] =
-{
-       0,     3,     4,     5,     6,     7,     8,     9,    10,    11,
-      12,    13,    25,    26,    27,    28,    29,    30,    31,    32,
+      -1,    -1,    -1,    -1,    -1,    -1,   378,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,   397,   398,   399,   400,   401,
+       3,     4,     5,     6,     7,     8,     9,    10,    11,    12,
+      13,    14,    15,    16,    17,    18,    19,    20,    21,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
       33,    34,    35,    36,    37,    38,    39,    40,    41,    42,
       43,    44,    45,    46,    47,    48,    49,    50,    51,    52,
       53,    54,    55,    56,    57,    58,    59,    60,    61,    62,
@@ -2470,115 +2890,539 @@
      193,   194,   195,   196,   197,   198,   199,   200,   201,   202,
      203,   204,   205,   206,   207,   208,   209,   210,   211,   212,
      213,   214,   215,   216,   217,   218,   219,   220,   221,   222,
-     225,   279,   280,   281,   282,   283,   284,   319,   320,   323,
-     324,   325,   326,   330,   331,   332,   333,   334,   335,   338,
-     339,   340,   341,   343,   345,   346,   347,   384,   385,   386,
-     255,   255,   224,   259,   346,   224,   265,   265,   387,   256,
-     262,   327,   328,   329,   339,   343,   262,   265,   224,   224,
-     265,   340,   343,   257,   344,     0,   385,   225,   342,    55,
-     224,   336,   337,   259,   349,   343,   265,   344,   259,   366,
-     328,   327,   329,   224,   224,   255,   264,   344,   259,   262,
-     265,   322,   224,   226,   227,   228,   229,   230,   231,   232,
-     233,   236,   237,   255,   258,   266,   267,   268,   269,   289,
-     290,   291,   293,   294,   295,   296,   297,   298,   299,   300,
+     223,   224,   225,   226,   227,   228,   229,   230,   231,   232,
+     233,   234,   235,   236,   237,   238,   239,   240,   241,   242,
+     243,   244,   245,   246,   247,   248,   249,   250,   251,   252,
+     253,   254,   255,   256,   257,   258,   259,   260,   261,   262,
+     263,   264,   265,   266,   267,   268,   269,   270,   271,   272,
+     273,   274,   275,   276,   277,   278,   279,   280,   281,   282,
+     283,   284,   285,   286,   287,   288,   289,   290,   291,   292,
+     293,   294,   295,   296,   297,   298,   299,   300,   301,   302,
+     303,   304,   305,   306,   307,   308,   309,   310,   311,   312,
+     313,   314,   315,   316,   317,   318,   319,   320,   321,   322,
+     323,   324,   325,   326,   327,   328,   329,   330,   331,   332,
+     333,   334,   335,   336,    -1,    -1,   339,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,   378,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,   397,   398,   399,   400,   401,     3,
+       4,     5,     6,     7,     8,     9,    10,    11,    12,    13,
+      14,    15,    16,    17,    18,    19,    20,    21,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    33,
+      34,    35,    36,    37,    38,    39,    40,    41,    42,    43,
+      44,    45,    46,    47,    48,    49,    50,    51,    52,    53,
+      54,    55,    56,    57,    58,    59,    60,    61,    62,    63,
+      64,    65,    66,    67,    68,    69,    70,    71,    72,    73,
+      74,    75,    76,    77,    78,    79,    80,    81,    82,    83,
+      84,    85,    86,    87,    88,    89,    90,    91,    92,    93,
+      94,    95,    96,    97,    98,    99,   100,   101,   102,   103,
+     104,   105,   106,   107,   108,   109,   110,   111,   112,   113,
+     114,   115,   116,   117,   118,   119,   120,   121,   122,   123,
+     124,   125,   126,   127,   128,   129,   130,   131,   132,   133,
+     134,   135,   136,   137,   138,   139,   140,   141,   142,   143,
+     144,   145,   146,   147,   148,   149,   150,   151,   152,   153,
+     154,   155,   156,   157,   158,   159,   160,   161,   162,   163,
+     164,   165,   166,   167,   168,   169,   170,   171,   172,   173,
+     174,   175,   176,   177,   178,   179,   180,   181,   182,   183,
+     184,   185,   186,   187,   188,   189,   190,   191,   192,   193,
+     194,   195,   196,   197,   198,   199,   200,   201,   202,   203,
+     204,   205,   206,   207,   208,   209,   210,   211,   212,   213,
+     214,   215,   216,   217,   218,   219,   220,   221,   222,   223,
+     224,   225,   226,   227,   228,   229,   230,   231,   232,   233,
+     234,   235,   236,   237,   238,   239,   240,   241,   242,   243,
+     244,   245,   246,   247,   248,   249,   250,   251,   252,   253,
+     254,   255,   256,   257,   258,   259,   260,   261,   262,   263,
+     264,   265,   266,   267,   268,   269,   270,   271,   272,   273,
+     274,   275,   276,   277,   278,   279,   280,   281,   282,   283,
+     284,   285,   286,   287,   288,   289,   290,   291,   292,   293,
+     294,   295,   296,   297,   298,   299,   300,   301,   302,   303,
+     304,   305,   306,   307,   308,   309,   310,   311,   312,   313,
+     314,   315,   316,   317,   318,   319,   320,   321,   322,   323,
+     324,   325,   326,   327,   328,   329,   330,   331,   332,   333,
+     334,   335,   336,    -1,    -1,   339,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,     5,
+       6,     7,     8,     9,    -1,    11,    12,    13,    14,    15,
+      16,    17,    18,    19,    20,    21,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,   397,   398,   399,   400,   401,    34,    35,
+      36,    37,    38,    39,    40,    41,    42,    43,    44,    45,
+      46,    47,    48,    49,    50,    51,    52,    53,    54,    55,
+      56,    57,    58,    59,    60,    61,    62,    63,    64,    65,
+      66,    67,    68,    69,    70,    71,    72,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    82,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    98,    99,   100,   101,   102,   103,   104,   105,
+     106,   107,   108,   109,   110,   111,   112,   113,   114,   115,
+     116,   117,   118,   119,   120,   121,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,   131,   132,   133,   134,   135,
+     136,   137,   138,   139,   140,   141,   142,   143,   144,   145,
+     146,   147,   148,   149,   150,   151,   152,   153,   154,   155,
+     156,   157,   158,   159,   160,   161,   162,   163,   164,   165,
+     166,   167,   168,   169,   170,   171,   172,   173,   174,   175,
+     176,   177,   178,   179,   180,   181,   182,   183,   184,   185,
+     186,   187,   188,   189,   190,   191,   192,   193,   194,   195,
+     196,   197,   198,   199,   200,   201,   202,   203,   204,   205,
+     206,   207,   208,   209,   210,   211,   212,   213,   214,   215,
+     216,   217,   218,   219,   220,   221,   222,   223,   224,   225,
+     226,   227,   228,   229,   230,   231,   232,   233,   234,   235,
+     236,   237,   238,   239,   240,   241,   242,   243,   244,   245,
+     246,   247,   248,   249,   250,   251,   252,   253,   254,   255,
+     256,   257,   258,   259,   260,   261,   262,   263,   264,   265,
+     266,   267,   268,   269,   270,   271,   272,   273,   274,   275,
+     276,   277,   278,   279,   280,   281,   282,   283,   284,   285,
+     286,   287,   288,   289,   290,   291,   292,   293,   294,   295,
+     296,   297,   298,   299,   300,   301,   302,   303,   304,   305,
+     306,   307,   308,   309,   310,   311,   312,   313,   314,   315,
+     316,   317,   318,   319,   320,   321,   322,   323,   324,   325,
+     326,   327,   328,   329,   330,   331,   332,   333,   334,   335,
+     336,    -1,   338,   339,   340,   341,   342,   343,   344,   345,
+     346,   347,   348,   349,   350,   351,    -1,    -1,   354,   355,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,   373,    -1,    -1,
+      -1,   377,   378,    -1,    -1,    -1,    -1,    -1,   384,   385,
+     386,   387,     5,     6,     7,     8,     9,    -1,    11,    12,
+      13,    14,    15,    16,    17,    18,    19,    20,    21,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    34,    35,    36,    37,    38,    39,    40,    41,    42,
+      43,    44,    45,    46,    47,    48,    49,    50,    51,    52,
+      53,    54,    55,    56,    57,    58,    59,    60,    61,    62,
+      63,    64,    65,    66,    67,    68,    69,    70,    71,    72,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    82,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    98,    99,   100,   101,   102,
+     103,   104,   105,   106,   107,   108,   109,   110,   111,   112,
+     113,   114,   115,   116,   117,   118,   119,   120,   121,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   131,   132,
+     133,   134,   135,   136,   137,   138,   139,   140,   141,   142,
+     143,   144,   145,   146,   147,   148,   149,   150,   151,   152,
+     153,   154,   155,   156,   157,   158,   159,   160,   161,   162,
+     163,   164,   165,   166,   167,   168,   169,   170,   171,   172,
+     173,   174,   175,   176,   177,   178,   179,   180,   181,   182,
+     183,   184,   185,   186,   187,   188,   189,   190,   191,   192,
+     193,   194,   195,   196,   197,   198,   199,   200,   201,   202,
+     203,   204,   205,   206,   207,   208,   209,   210,   211,   212,
+     213,   214,   215,   216,   217,   218,   219,   220,   221,   222,
+     223,   224,   225,   226,   227,   228,   229,   230,   231,   232,
+     233,   234,   235,   236,   237,   238,   239,   240,   241,   242,
+     243,   244,   245,   246,   247,   248,   249,   250,   251,   252,
+     253,   254,   255,   256,   257,   258,   259,   260,   261,   262,
+     263,   264,   265,   266,   267,   268,   269,   270,   271,   272,
+     273,   274,   275,   276,   277,   278,   279,   280,   281,   282,
+     283,   284,   285,   286,   287,   288,   289,   290,   291,   292,
+     293,   294,   295,   296,   297,   298,   299,   300,   301,   302,
+     303,   304,   305,   306,   307,   308,   309,   310,   311,   312,
+     313,   314,   315,   316,   317,   318,   319,   320,   321,   322,
+     323,   324,   325,   326,   327,   328,   329,   330,   331,   332,
+     333,   334,   335,   336,    -1,   338,   339,   340,   341,   342,
+     343,   344,   345,   346,   347,   348,   349,   350,   351,    -1,
+      -1,   354,   355,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+     373,    -1,    -1,   376,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,   384,   385,   386,   387,     5,     6,     7,     8,     9,
+      -1,    11,    12,    13,    14,    15,    16,    17,    18,    19,
+      20,    21,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    34,    35,    36,    37,    38,    39,
+      40,    41,    42,    43,    44,    45,    46,    47,    48,    49,
+      50,    51,    52,    53,    54,    55,    56,    57,    58,    59,
+      60,    61,    62,    63,    64,    65,    66,    67,    68,    69,
+      70,    71,    72,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    82,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    98,    99,
+     100,   101,   102,   103,   104,   105,   106,   107,   108,   109,
+     110,   111,   112,   113,   114,   115,   116,   117,   118,   119,
+     120,   121,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,   131,   132,   133,   134,   135,   136,   137,   138,   139,
+     140,   141,   142,   143,   144,   145,   146,   147,   148,   149,
+     150,   151,   152,   153,   154,   155,   156,   157,   158,   159,
+     160,   161,   162,   163,   164,   165,   166,   167,   168,   169,
+     170,   171,   172,   173,   174,   175,   176,   177,   178,   179,
+     180,   181,   182,   183,   184,   185,   186,   187,   188,   189,
+     190,   191,   192,   193,   194,   195,   196,   197,   198,   199,
+     200,   201,   202,   203,   204,   205,   206,   207,   208,   209,
+     210,   211,   212,   213,   214,   215,   216,   217,   218,   219,
+     220,   221,   222,   223,   224,   225,   226,   227,   228,   229,
+     230,   231,   232,   233,   234,   235,   236,   237,   238,   239,
+     240,   241,   242,   243,   244,   245,   246,   247,   248,   249,
+     250,   251,   252,   253,   254,   255,   256,   257,   258,   259,
+     260,   261,   262,   263,   264,   265,   266,   267,   268,   269,
+     270,   271,   272,   273,   274,   275,   276,   277,   278,   279,
+     280,   281,   282,   283,   284,   285,   286,   287,   288,   289,
+     290,   291,   292,   293,   294,   295,   296,   297,   298,   299,
+     300,   301,   302,   303,   304,   305,   306,   307,   308,   309,
+     310,   311,   312,   313,   314,   315,   316,   317,   318,   319,
+     320,   321,   322,   323,   324,   325,   326,   327,   328,   329,
+     330,   331,   332,   333,   334,   335,   336,    -1,   338,   339,
+     340,   341,   342,   343,   344,   345,   346,   347,   348,   349,
+     350,   351,    -1,    -1,   354,   355,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,   373,    -1,    -1,    -1,   377,    -1,    -1,
+      -1,    -1,    -1,    -1,   384,   385,   386,   387,     5,     6,
+       7,     8,     9,    -1,    11,    12,    13,    14,    15,    16,
+      17,    18,    19,    20,    21,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    34,    35,    36,
+      37,    38,    39,    40,    41,    42,    43,    44,    45,    46,
+      47,    48,    49,    50,    51,    52,    53,    54,    55,    56,
+      57,    58,    59,    60,    61,    62,    63,    64,    65,    66,
+      67,    68,    69,    70,    71,    72,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    82,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    98,    99,   100,   101,   102,   103,   104,   105,   106,
+     107,   108,   109,   110,   111,   112,   113,   114,   115,   116,
+     117,   118,   119,   120,   121,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,   131,   132,   133,   134,   135,   136,
+     137,   138,   139,   140,   141,   142,   143,   144,   145,   146,
+     147,   148,   149,   150,   151,   152,   153,   154,   155,   156,
+     157,   158,   159,   160,   161,   162,   163,   164,   165,   166,
+     167,   168,   169,   170,   171,   172,   173,   174,   175,   176,
+     177,   178,   179,   180,   181,   182,   183,   184,   185,   186,
+     187,   188,   189,   190,   191,   192,   193,   194,   195,   196,
+     197,   198,   199,   200,   201,   202,   203,   204,   205,   206,
+     207,   208,   209,   210,   211,   212,   213,   214,   215,   216,
+     217,   218,   219,   220,   221,   222,   223,   224,   225,   226,
+     227,   228,   229,   230,   231,   232,   233,   234,   235,   236,
+     237,   238,   239,   240,   241,   242,   243,   244,   245,   246,
+     247,   248,   249,   250,   251,   252,   253,   254,   255,   256,
+     257,   258,   259,   260,   261,   262,   263,   264,   265,   266,
+     267,   268,   269,   270,   271,   272,   273,   274,   275,   276,
+     277,   278,   279,   280,   281,   282,   283,   284,   285,   286,
+     287,   288,   289,   290,   291,   292,   293,   294,   295,   296,
+     297,   298,   299,   300,   301,   302,   303,   304,   305,   306,
+     307,   308,   309,   310,   311,   312,   313,   314,   315,   316,
+     317,   318,   319,   320,   321,   322,   323,   324,   325,   326,
+     327,   328,   329,   330,   331,   332,   333,   334,   335,   336,
+      -1,   338,   339,   340,   341,   342,   343,   344,   345,   346,
+     347,   348,   349,   350,   351,    -1,    -1,   354,   355,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,   373,    -1,    -1,   376,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,   384,   385,   386,
+     387,     5,     6,     7,     8,     9,    -1,    11,    12,    13,
+      14,    15,    16,    17,    18,    19,    20,    21,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      34,    35,    36,    37,    38,    39,    40,    41,    42,    43,
+      44,    45,    46,    47,    48,    49,    50,    51,    52,    53,
+      54,    55,    56,    57,    58,    59,    60,    61,    62,    63,
+      64,    65,    66,    67,    68,    69,    70,    71,    72,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    82,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    98,    99,   100,   101,   102,   103,
+     104,   105,   106,   107,   108,   109,   110,   111,   112,   113,
+     114,   115,   116,   117,   118,   119,   120,   121,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,   131,   132,   133,
+     134,   135,   136,   137,   138,   139,   140,   141,   142,   143,
+     144,   145,   146,   147,   148,   149,   150,   151,   152,   153,
+     154,   155,   156,   157,   158,   159,   160,   161,   162,   163,
+     164,   165,   166,   167,   168,   169,   170,   171,   172,   173,
+     174,   175,   176,   177,   178,   179,   180,   181,   182,   183,
+     184,   185,   186,   187,   188,   189,   190,   191,   192,   193,
+     194,   195,   196,   197,   198,   199,   200,   201,   202,   203,
+     204,   205,   206,   207,   208,   209,   210,   211,   212,   213,
+     214,   215,   216,   217,   218,   219,   220,   221,   222,   223,
+     224,   225,   226,   227,   228,   229,   230,   231,   232,   233,
+     234,   235,   236,   237,   238,   239,   240,   241,   242,   243,
+     244,   245,   246,   247,   248,   249,   250,   251,   252,   253,
+     254,   255,   256,   257,   258,   259,   260,   261,   262,   263,
+     264,   265,   266,   267,   268,   269,   270,   271,   272,   273,
+     274,   275,   276,   277,   278,   279,   280,   281,   282,   283,
+     284,   285,   286,   287,   288,   289,   290,   291,   292,   293,
+     294,   295,   296,   297,   298,   299,   300,   301,   302,   303,
+     304,   305,   306,   307,   308,   309,   310,   311,   312,   313,
+     314,   315,   316,   317,   318,   319,   320,   321,   322,   323,
+     324,   325,   326,   327,   328,   329,   330,   331,   332,   333,
+     334,   335,   336,    -1,   338,   339,   340,   341,   342,   343,
+     344,   345,   346,   347,   348,   349,   350,   351,    -1,    -1,
+     354,   355,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   373,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   383,
+     384,   385,   386,   387,     5,     6,     7,     8,     9,    -1,
+      11,    12,    13,    14,    15,    16,    17,    18,    19,    20,
+      21,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    34,    35,    36,    37,    38,    39,    40,
+      41,    42,    43,    44,    45,    46,    47,    48,    49,    50,
+      51,    52,    53,    54,    55,    56,    57,    58,    59,    60,
+      61,    62,    63,    64,    65,    66,    67,    68,    69,    70,
+      71,    72,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    82,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    98,    99,   100,
+     101,   102,   103,   104,   105,   106,   107,   108,   109,   110,
+     111,   112,   113,   114,   115,   116,   117,   118,   119,   120,
+     121,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+     131,   132,   133,   134,   135,   136,   137,   138,   139,   140,
+     141,   142,   143,   144,   145,   146,   147,   148,   149,   150,
+     151,   152,   153,   154,   155,   156,   157,   158,   159,   160,
+     161,   162,   163,   164,   165,   166,   167,   168,   169,   170,
+     171,   172,   173,   174,   175,   176,   177,   178,   179,   180,
+     181,   182,   183,   184,   185,   186,   187,   188,   189,   190,
+     191,   192,   193,   194,   195,   196,   197,   198,   199,   200,
+     201,   202,   203,   204,   205,   206,   207,   208,   209,   210,
+     211,   212,   213,   214,   215,   216,   217,   218,   219,   220,
+     221,   222,   223,   224,   225,   226,   227,   228,   229,   230,
+     231,   232,   233,   234,   235,   236,   237,   238,   239,   240,
+     241,   242,   243,   244,   245,   246,   247,   248,   249,   250,
+     251,   252,   253,   254,   255,   256,   257,   258,   259,   260,
+     261,   262,   263,   264,   265,   266,   267,   268,   269,   270,
+     271,   272,   273,   274,   275,   276,   277,   278,   279,   280,
+     281,   282,   283,   284,   285,   286,   287,   288,   289,   290,
+     291,   292,   293,   294,   295,   296,   297,   298,   299,   300,
      301,   302,   303,   304,   305,   306,   307,   308,   309,   310,
-     311,   312,   313,   343,   257,   256,   262,   264,   256,   262,
-     348,   339,   343,   350,   351,   265,   265,    14,    15,    16,
-      18,    19,    20,    21,    22,    23,    24,   223,   259,   260,
-     265,   300,   313,   315,   317,   319,   323,   343,   356,   357,
-     358,   359,   367,   368,   369,   372,   375,   376,   383,   344,
-     264,   344,   259,   315,   354,   264,   321,   224,   262,   265,
-     300,   300,   317,   236,   237,   257,   261,   256,   256,   262,
-     222,   315,   255,   300,   270,   271,   272,   267,   269,   234,
-     235,   238,   239,   273,   274,   240,   241,   277,   276,   275,
-     242,   244,   243,   278,   258,   258,   313,   225,   313,   318,
-     337,   350,   343,   224,   352,   353,   260,   351,   265,   265,
-     378,   255,   255,   265,   265,   317,   255,   317,   263,   255,
-     260,   360,   245,   246,   247,   248,   249,   250,   251,   252,
-     253,   254,   264,   316,   262,   265,   260,   357,   354,   264,
-     354,   355,   354,   350,   224,   256,   292,   317,   224,   315,
-     300,   300,   300,   302,   302,   303,   303,   304,   304,   304,
-     304,   305,   305,   306,   307,   308,   309,   310,   311,   314,
-     258,   260,   352,   344,   262,   265,   357,   379,   317,   265,
-     317,   263,   377,   367,   315,   315,   354,   260,   262,   260,
-     258,   317,   265,   353,   223,   356,   368,   380,   256,   256,
-     317,   332,   339,   371,   361,   260,   354,   263,   255,   371,
-     381,   382,   363,   364,   365,   370,   373,   224,   256,   260,
-     315,   317,   265,   256,    17,   359,   358,   259,   264,   358,
-     362,   366,   256,   317,   362,   363,   367,   374,   354,   265,
-     260
+     311,   312,   313,   314,   315,   316,   317,   318,   319,   320,
+     321,   322,   323,   324,   325,   326,   327,   328,   329,   330,
+     331,   332,   333,   334,   335,   336,    -1,   338,   339,   340,
+     341,   342,   343,   344,   345,   346,   347,   348,   349,   350,
+     351,    -1,    -1,   354,   355,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,   373,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,   384,   385,   386,   387,     5,     6,     7,
+       8,     9,    -1,    11,    12,    13,    14,    15,    16,    17,
+      18,    19,    20,    21,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    34,    35,    36,    37,
+      38,    39,    40,    41,    42,    43,    44,    45,    46,    47,
+      48,    49,    50,    51,    52,    53,    54,    55,    56,    57,
+      58,    59,    60,    61,    62,    63,    64,    65,    66,    67,
+      68,    69,    70,    71,    72,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    82,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      98,    99,   100,   101,   102,   103,   104,   105,   106,   107,
+     108,   109,   110,   111,   112,   113,   114,   115,   116,   117,
+     118,   119,   120,   121,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,   131,   132,   133,   134,   135,   136,   137,
+     138,   139,   140,   141,   142,   143,   144,   145,   146,   147,
+     148,   149,   150,   151,   152,   153,   154,   155,   156,   157,
+     158,   159,   160,   161,   162,   163,   164,   165,   166,   167,
+     168,   169,   170,   171,   172,   173,   174,   175,   176,   177,
+     178,   179,   180,   181,   182,   183,   184,   185,   186,   187,
+     188,   189,   190,   191,   192,   193,   194,   195,   196,   197,
+     198,   199,   200,   201,   202,   203,   204,   205,   206,   207,
+     208,   209,   210,   211,   212,   213,   214,   215,   216,   217,
+     218,   219,   220,   221,   222,   223,   224,   225,   226,   227,
+     228,   229,   230,   231,   232,   233,   234,   235,   236,   237,
+     238,   239,   240,   241,   242,   243,   244,   245,   246,   247,
+     248,   249,   250,   251,   252,   253,   254,   255,   256,   257,
+     258,   259,   260,   261,   262,   263,   264,   265,   266,   267,
+     268,   269,   270,   271,   272,   273,   274,   275,   276,   277,
+     278,   279,   280,   281,   282,   283,   284,   285,   286,   287,
+     288,   289,   290,   291,   292,   293,   294,   295,   296,   297,
+     298,   299,   300,   301,   302,   303,   304,   305,   306,   307,
+     308,   309,   310,   311,   312,   313,   314,   315,   316,   317,
+     318,   319,   320,   321,   322,   323,   324,   325,   326,   327,
+     328,   329,   330,   331,   332,   333,   334,   335,   336,    -1,
+     338,   339,   340,   341,   342,   343,   344,   345,   346,   347,
+     348,   349,   350,   351,    -1,    -1,   354,   355,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,   373,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,   384,   385,   386,   387,
+       5,     6,     7,     8,     9,    -1,    11,    12,    13,    14,
+      15,    16,    17,    18,    19,    20,    21,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    34,
+      35,    36,    37,    38,    39,    40,    41,    42,    43,    44,
+      45,    46,    47,    48,    49,    50,    51,    52,    53,    54,
+      55,    56,    57,    58,    59,    60,    61,    62,    63,    64,
+      65,    66,    67,    68,    69,    70,    71,    72,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    98,    99,   100,   101,   102,   103,   104,
+     105,   106,   107,   108,   109,   110,   111,   112,   113,   114,
+     115,   116,   117,   118,   119,   120,   121,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,   131,   132,   133,   134,
+     135,   136,   137,   138,   139,   140,   141,   142,   143,   144,
+     145,   146,   147,   148,   149,   150,   151,   152,   153,   154,
+     155,   156,   157,   158,   159,   160,   161,   162,   163,   164,
+     165,   166,   167,   168,   169,   170,   171,   172,   173,   174,
+     175,   176,   177,   178,   179,   180,   181,   182,   183,   184,
+     185,   186,   187,   188,   189,   190,   191,   192,   193,   194,
+     195,   196,   197,   198,   199,   200,   201,   202,   203,   204,
+     205,   206,   207,   208,   209,   210,   211,   212,   213,   214,
+     215,   216,   217,   218,   219,   220,   221,   222,   223,   224,
+     225,   226,   227,   228,   229,   230,   231,   232,   233,   234,
+     235,   236,   237,   238,   239,   240,   241,   242,   243,   244,
+     245,   246,   247,   248,   249,   250,   251,   252,   253,   254,
+     255,   256,   257,   258,   259,   260,   261,   262,   263,   264,
+     265,   266,   267,   268,   269,   270,   271,   272,   273,   274,
+     275,   276,   277,   278,   279,   280,   281,   282,   283,   284,
+     285,   286,   287,   288,   289,   290,   291,   292,   293,   294,
+     295,   296,   297,   298,   299,   300,   301,   302,   303,   304,
+     305,   306,   307,   308,   309,   310,   311,   312,   313,   314,
+     315,   316,   317,   318,   319,   320,   321,   322,   323,   324,
+     325,   326,   327,   328,   329,   330,   331,   332,   333,   334,
+     335,   336,    -1,    -1,   339
+};
+
+  /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
+     symbol of state STATE-NUM.  */
+static const yytype_uint16 yystos[] =
+{
+       0,     3,     4,     5,     6,     7,     8,     9,    10,    11,
+      12,    13,    14,    15,    16,    17,    18,    19,    20,    21,
+      33,    34,    35,    36,    37,    38,    39,    40,    41,    42,
+      43,    44,    45,    46,    47,    48,    49,    50,    51,    52,
+      53,    54,    55,    56,    57,    58,    59,    60,    61,    62,
+      63,    64,    65,    66,    67,    68,    69,    70,    71,    72,
+      73,    74,    75,    76,    77,    78,    79,    80,    81,    82,
+      83,    84,    85,    86,    87,    88,    89,    90,    91,    92,
+      93,    94,    95,    96,    97,    98,    99,   100,   101,   102,
+     103,   104,   105,   106,   107,   108,   109,   110,   111,   112,
+     113,   114,   115,   116,   117,   118,   119,   120,   121,   122,
+     123,   124,   125,   126,   127,   128,   129,   130,   131,   132,
+     133,   134,   135,   136,   137,   138,   139,   140,   141,   142,
+     143,   144,   145,   146,   147,   148,   149,   150,   151,   152,
+     153,   154,   155,   156,   157,   158,   159,   160,   161,   162,
+     163,   164,   165,   166,   167,   168,   169,   170,   171,   172,
+     173,   174,   175,   176,   177,   178,   179,   180,   181,   182,
+     183,   184,   185,   186,   187,   188,   189,   190,   191,   192,
+     193,   194,   195,   196,   197,   198,   199,   200,   201,   202,
+     203,   204,   205,   206,   207,   208,   209,   210,   211,   212,
+     213,   214,   215,   216,   217,   218,   219,   220,   221,   222,
+     223,   224,   225,   226,   227,   228,   229,   230,   231,   232,
+     233,   234,   235,   236,   237,   238,   239,   240,   241,   242,
+     243,   244,   245,   246,   247,   248,   249,   250,   251,   252,
+     253,   254,   255,   256,   257,   258,   259,   260,   261,   262,
+     263,   264,   265,   266,   267,   268,   269,   270,   271,   272,
+     273,   274,   275,   276,   277,   278,   279,   280,   281,   282,
+     283,   284,   285,   286,   287,   288,   289,   290,   291,   292,
+     293,   294,   295,   296,   297,   298,   299,   300,   301,   302,
+     303,   304,   305,   306,   307,   308,   309,   310,   311,   312,
+     313,   314,   315,   316,   317,   318,   319,   320,   321,   322,
+     323,   324,   325,   326,   327,   328,   329,   330,   331,   332,
+     333,   334,   335,   336,   339,   383,   397,   398,   399,   400,
+     401,   402,   437,   438,   441,   442,   443,   444,   448,   449,
+     450,   451,   452,   453,   456,   457,   458,   459,   460,   462,
+     464,   465,   466,   506,   507,   508,   373,   373,   338,   377,
+     465,   338,   383,   383,   509,   374,   380,   445,   446,   447,
+     457,   462,   380,   383,   338,   338,   383,   458,   462,   375,
+     463,     0,   507,   338,   461,    81,   338,   454,   455,   377,
+     468,   462,   383,   463,   377,   485,   446,   445,   447,   338,
+     338,   373,   382,   463,   377,   380,   383,   440,   338,   340,
+     341,   342,   343,   344,   345,   346,   347,   348,   349,   350,
+     351,   354,   355,   373,   376,   384,   385,   386,   387,   407,
+     408,   409,   411,   412,   413,   414,   415,   416,   417,   418,
+     419,   420,   421,   422,   423,   424,   425,   426,   427,   428,
+     429,   430,   431,   460,   462,   375,   374,   380,   382,   374,
+     380,   467,   457,   462,   469,   470,   383,   383,    22,    23,
+      24,    26,    27,    28,    29,    30,    31,    32,   337,   375,
+     377,   378,   383,   418,   431,   433,   435,   437,   441,   460,
+     462,   475,   476,   477,   478,   486,   487,   488,   489,   492,
+     493,   496,   497,   498,   505,   510,   463,   382,   463,   377,
+     433,   473,   382,   439,   338,   380,   383,   418,   418,   435,
+     354,   355,   375,   379,   374,   374,   380,   336,   433,   373,
+     418,   388,   389,   390,   385,   387,   352,   353,   356,   357,
+     391,   392,   358,   359,   395,   394,   393,   360,   362,   361,
+     396,   376,   376,   431,   338,   431,   436,   455,   469,   462,
+     338,   471,   472,   378,   470,   383,   383,   500,   373,   373,
+     383,   383,   435,   373,   435,   381,   373,   375,   378,   479,
+     363,   364,   365,   366,   367,   368,   369,   370,   371,   372,
+     382,   434,   380,   383,   378,   476,   489,   493,   498,   473,
+     382,   473,   474,   473,   469,   338,   374,   410,   435,   338,
+     433,   418,   418,   418,   420,   420,   421,   421,   422,   422,
+     422,   422,   423,   423,   424,   425,   426,   427,   428,   429,
+     432,   376,   378,   471,   463,   380,   383,   476,   501,   435,
+     383,   435,   381,   499,   338,   511,   512,   486,   433,   433,
+     473,   378,   380,   378,   376,   435,   383,   472,   337,   475,
+     487,   502,   374,   374,   435,   450,   457,   491,   373,   376,
+     380,   480,   378,   473,   381,   373,   491,   503,   504,   482,
+     483,   484,   490,   494,   338,   374,   436,   376,   512,   378,
+     433,   435,   383,   374,    25,   478,   477,   377,   382,   477,
+     481,   485,   374,   374,   435,   481,   482,   486,   495,   473,
+     383,   378
 };
 
   /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives.  */
 static const yytype_uint16 yyr1[] =
 {
-       0,   288,   289,   290,   290,   290,   290,   290,   290,   290,
-     290,   290,   290,   291,   291,   291,   291,   291,   291,   292,
-     293,   294,   295,   295,   296,   296,   297,   297,   298,   299,
-     299,   300,   300,   300,   300,   301,   301,   301,   301,   302,
-     302,   302,   302,   303,   303,   303,   304,   304,   304,   305,
-     305,   305,   305,   305,   306,   306,   306,   307,   307,   308,
-     308,   309,   309,   310,   310,   311,   311,   312,   312,   313,
-     314,   313,   315,   315,   316,   316,   316,   316,   316,   316,
-     316,   316,   316,   316,   316,   317,   317,   318,   319,   319,
-     319,   319,   319,   319,   319,   319,   319,   321,   320,   322,
-     322,   323,   324,   324,   325,   325,   326,   327,   327,   328,
-     328,   328,   328,   329,   330,   330,   330,   330,   330,   331,
-     331,   331,   331,   331,   332,   332,   333,   334,   334,   334,
-     334,   335,   336,   336,   337,   337,   337,   338,   339,   339,
-     340,   340,   340,   340,   340,   340,   341,   341,   341,   341,
-     341,   341,   341,   341,   341,   341,   341,   341,   341,   341,
-     341,   341,   341,   341,   341,   342,   342,   343,   343,   344,
-     344,   344,   344,   345,   345,   345,   345,   345,   345,   345,
-     345,   345,   345,   345,   345,   345,   345,   345,   345,   345,
-     345,   345,   345,   345,   345,   345,   345,   345,   345,   345,
-     345,   345,   345,   345,   345,   345,   345,   345,   345,   345,
-     345,   345,   345,   345,   345,   345,   345,   345,   345,   345,
-     345,   345,   345,   345,   345,   345,   345,   345,   345,   345,
-     345,   345,   345,   345,   345,   345,   345,   345,   345,   345,
-     345,   345,   345,   345,   345,   345,   345,   345,   345,   345,
-     345,   345,   345,   345,   345,   345,   345,   345,   345,   345,
-     345,   345,   345,   345,   345,   345,   345,   345,   345,   345,
-     345,   345,   345,   345,   345,   345,   345,   345,   345,   345,
-     345,   345,   345,   345,   345,   345,   345,   345,   345,   345,
-     345,   345,   345,   345,   345,   345,   345,   345,   345,   345,
-     345,   345,   345,   345,   345,   345,   345,   345,   345,   345,
-     345,   345,   345,   345,   345,   345,   345,   345,   345,   345,
-     345,   345,   345,   345,   345,   345,   345,   345,   345,   345,
-     345,   345,   345,   345,   345,   345,   345,   345,   345,   345,
-     345,   345,   345,   345,   345,   345,   345,   345,   345,   345,
-     345,   345,   345,   345,   345,   345,   345,   345,   345,   345,
-     346,   346,   346,   348,   347,   349,   347,   350,   350,   351,
-     351,   352,   352,   353,   353,   354,   354,   354,   355,   355,
-     356,   357,   357,   358,   358,   358,   358,   358,   358,   358,
-     359,   360,   361,   359,   362,   362,   364,   363,   365,   363,
-     366,   366,   367,   367,   368,   368,   369,   370,   370,   371,
-     371,   373,   372,   374,   374,   375,   375,   377,   376,   378,
-     376,   379,   376,   380,   380,   381,   381,   382,   382,   383,
-     383,   383,   383,   383,   384,   384,   385,   385,   387,   386
+       0,   406,   407,   408,   408,   408,   408,   408,   408,   408,
+     408,   408,   408,   408,   408,   408,   408,   409,   409,   409,
+     409,   409,   409,   410,   411,   412,   413,   413,   414,   414,
+     415,   415,   416,   417,   417,   417,   418,   418,   418,   418,
+     419,   419,   419,   419,   420,   420,   420,   420,   421,   421,
+     421,   422,   422,   422,   423,   423,   423,   423,   423,   424,
+     424,   424,   425,   425,   426,   426,   427,   427,   428,   428,
+     429,   429,   430,   430,   431,   432,   431,   433,   433,   434,
+     434,   434,   434,   434,   434,   434,   434,   434,   434,   434,
+     435,   435,   436,   437,   437,   437,   437,   437,   437,   437,
+     437,   437,   439,   438,   440,   440,   441,   442,   442,   443,
+     443,   444,   445,   445,   446,   446,   446,   446,   447,   448,
+     448,   448,   448,   448,   449,   449,   449,   449,   449,   450,
+     450,   451,   452,   452,   452,   452,   452,   452,   452,   452,
+     453,   454,   454,   455,   455,   455,   456,   457,   457,   458,
+     458,   458,   458,   458,   458,   458,   459,   459,   459,   459,
+     459,   459,   459,   459,   459,   459,   459,   459,   459,   459,
+     459,   459,   459,   459,   459,   459,   459,   459,   459,   459,
+     459,   459,   459,   459,   459,   460,   461,   461,   462,   462,
+     463,   463,   463,   463,   464,   464,   464,   464,   464,   464,
+     464,   464,   464,   464,   464,   464,   464,   464,   464,   464,
+     464,   464,   464,   464,   464,   464,   464,   464,   464,   464,
+     464,   464,   464,   464,   464,   464,   464,   464,   464,   464,
+     464,   464,   464,   464,   464,   464,   464,   464,   464,   464,
+     464,   464,   464,   464,   464,   464,   464,   464,   464,   464,
+     464,   464,   464,   464,   464,   464,   464,   464,   464,   464,
+     464,   464,   464,   464,   464,   464,   464,   464,   464,   464,
+     464,   464,   464,   464,   464,   464,   464,   464,   464,   464,
+     464,   464,   464,   464,   464,   464,   464,   464,   464,   464,
+     464,   464,   464,   464,   464,   464,   464,   464,   464,   464,
+     464,   464,   464,   464,   464,   464,   464,   464,   464,   464,
+     464,   464,   464,   464,   464,   464,   464,   464,   464,   464,
+     464,   464,   464,   464,   464,   464,   464,   464,   464,   464,
+     464,   464,   464,   464,   464,   464,   464,   464,   464,   464,
+     464,   464,   464,   464,   464,   464,   464,   464,   464,   464,
+     464,   464,   464,   464,   464,   464,   464,   464,   464,   464,
+     464,   464,   464,   464,   464,   464,   464,   464,   464,   464,
+     464,   464,   464,   464,   464,   464,   464,   464,   464,   464,
+     464,   464,   464,   464,   464,   464,   464,   464,   464,   464,
+     464,   464,   464,   464,   464,   464,   464,   464,   464,   464,
+     464,   464,   464,   464,   464,   464,   464,   464,   464,   464,
+     464,   464,   464,   464,   464,   464,   464,   464,   464,   464,
+     464,   464,   464,   464,   464,   464,   464,   464,   464,   464,
+     464,   464,   464,   464,   464,   464,   464,   464,   464,   464,
+     464,   464,   464,   464,   464,   464,   464,   464,   464,   464,
+     464,   464,   464,   464,   464,   464,   464,   464,   464,   464,
+     464,   464,   464,   464,   464,   464,   464,   464,   464,   464,
+     464,   464,   464,   464,   464,   464,   464,   464,   464,   464,
+     465,   465,   465,   467,   466,   468,   466,   469,   469,   470,
+     470,   471,   471,   472,   472,   473,   473,   473,   474,   474,
+     475,   476,   476,   477,   477,   477,   477,   477,   477,   477,
+     478,   479,   480,   478,   481,   481,   483,   482,   484,   482,
+     485,   485,   486,   486,   487,   487,   488,   488,   489,   490,
+     490,   491,   491,   492,   492,   494,   493,   495,   495,   496,
+     496,   497,   497,   499,   498,   500,   498,   501,   498,   502,
+     502,   503,   503,   504,   504,   505,   505,   505,   505,   505,
+     506,   506,   507,   507,   507,   509,   508,   510,   511,   511,
+     512,   512
 };
 
   /* YYR2[YYN] -- Number of symbols on the right hand side of rule YYN.  */
 static const yytype_uint8 yyr2[] =
 {
        0,     2,     1,     1,     1,     1,     1,     1,     1,     1,
-       1,     1,     3,     1,     4,     1,     3,     2,     2,     1,
-       1,     1,     2,     2,     2,     1,     2,     3,     2,     1,
-       1,     1,     2,     2,     2,     1,     1,     1,     1,     1,
-       3,     3,     3,     1,     3,     3,     1,     3,     3,     1,
-       3,     3,     3,     3,     1,     3,     3,     1,     3,     1,
-       3,     1,     3,     1,     3,     1,     3,     1,     3,     1,
-       0,     6,     1,     3,     1,     1,     1,     1,     1,     1,
-       1,     1,     1,     1,     1,     1,     3,     1,     2,     2,
-       4,     2,     3,     4,     2,     3,     4,     0,     6,     2,
-       3,     2,     1,     1,     2,     3,     3,     2,     3,     2,
-       1,     2,     1,     1,     1,     3,     4,     6,     5,     1,
-       2,     3,     5,     4,     1,     2,     1,     1,     1,     1,
-       1,     4,     1,     3,     1,     3,     1,     1,     1,     2,
+       1,     1,     1,     1,     1,     1,     3,     1,     4,     1,
+       3,     2,     2,     1,     1,     1,     2,     2,     2,     1,
+       2,     3,     2,     1,     1,     1,     1,     2,     2,     2,
+       1,     1,     1,     1,     1,     3,     3,     3,     1,     3,
+       3,     1,     3,     3,     1,     3,     3,     3,     3,     1,
+       3,     3,     1,     3,     1,     3,     1,     3,     1,     3,
+       1,     3,     1,     3,     1,     0,     6,     1,     3,     1,
+       1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
+       1,     3,     1,     2,     2,     4,     2,     3,     4,     2,
+       3,     4,     0,     6,     2,     3,     2,     1,     1,     2,
+       3,     3,     2,     3,     2,     1,     2,     1,     1,     1,
+       3,     4,     6,     5,     1,     2,     3,     5,     4,     1,
+       2,     1,     1,     1,     1,     1,     1,     1,     1,     1,
+       4,     1,     3,     1,     3,     1,     1,     1,     2,     1,
        1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
        1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
-       1,     1,     1,     1,     4,     1,     3,     1,     2,     2,
-       3,     3,     4,     1,     1,     1,     1,     1,     1,     1,
+       1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
+       1,     1,     1,     1,     4,     1,     1,     3,     1,     2,
+       2,     3,     3,     4,     1,     1,     1,     1,     1,     1,
+       1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
+       1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
+       1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
+       1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
+       1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
+       1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
+       1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
+       1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
+       1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
+       1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
        1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
        1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
        1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
@@ -2601,10 +3445,12 @@
        4,     1,     3,     1,     2,     1,     3,     4,     1,     3,
        1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
        2,     0,     0,     5,     1,     1,     0,     2,     0,     2,
-       2,     3,     1,     2,     1,     2,     5,     3,     1,     1,
-       4,     0,     8,     0,     1,     3,     2,     0,     6,     0,
-       8,     0,     7,     1,     1,     1,     0,     2,     3,     2,
-       2,     2,     3,     2,     1,     2,     1,     1,     0,     3
+       2,     3,     1,     2,     1,     2,     1,     2,     5,     3,
+       1,     1,     4,     1,     2,     0,     8,     0,     1,     3,
+       2,     1,     2,     0,     6,     0,     8,     0,     7,     1,
+       1,     1,     0,     2,     3,     2,     2,     2,     3,     2,
+       1,     2,     1,     1,     1,     0,     3,     5,     1,     3,
+       1,     4
 };
 
 
@@ -3287,216 +4133,250 @@
   switch (yyn)
     {
         case 2:
-#line 252 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 294 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.intermTypedNode) = parseContext.handleVariable((yyvsp[0].lex).loc, (yyvsp[0].lex).symbol, (yyvsp[0].lex).string);
     }
-#line 3295 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4141 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 3:
-#line 258 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 300 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode);
     }
-#line 3303 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4149 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 4:
-#line 261 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 303 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
+        parseContext.explicitInt32Check((yyvsp[0].lex).loc, "32-bit signed literal");
         (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion((yyvsp[0].lex).i, (yyvsp[0].lex).loc, true);
     }
-#line 3311 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4158 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 5:
-#line 264 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 307 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+        parseContext.explicitInt32Check((yyvsp[0].lex).loc, "32-bit signed literal");
+        (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion((yyvsp[0].lex).u, (yyvsp[0].lex).loc, true);
+    }
+#line 4167 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 6:
+#line 311 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+        (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion((yyvsp[0].lex).i, (yyvsp[0].lex).loc, true);
+    }
+#line 4175 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 7:
+#line 314 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.fullIntegerCheck((yyvsp[0].lex).loc, "unsigned literal");
         (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion((yyvsp[0].lex).u, (yyvsp[0].lex).loc, true);
     }
-#line 3320 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4184 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 6:
-#line 268 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 8:
+#line 318 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.int64Check((yyvsp[0].lex).loc, "64-bit integer literal");
         (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion((yyvsp[0].lex).i64, (yyvsp[0].lex).loc, true);
     }
-#line 3329 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4193 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 7:
-#line 272 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 9:
+#line 322 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.int64Check((yyvsp[0].lex).loc, "64-bit unsigned integer literal");
         (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion((yyvsp[0].lex).u64, (yyvsp[0].lex).loc, true);
     }
-#line 3338 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4202 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 8:
-#line 276 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 10:
+#line 326 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+        parseContext.explicitInt16Check((yyvsp[0].lex).loc, "16-bit integer literal");
+        (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion((short)(yyvsp[0].lex).i, (yyvsp[0].lex).loc, true);
+    }
+#line 4211 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 11:
+#line 330 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+        parseContext.explicitInt16Check((yyvsp[0].lex).loc, "16-bit unsigned integer literal");
+        (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion((unsigned short)(yyvsp[0].lex).u, (yyvsp[0].lex).loc, true);
+    }
+#line 4220 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 12:
+#line 334 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion((yyvsp[0].lex).d, EbtFloat, (yyvsp[0].lex).loc, true);
     }
-#line 3346 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4228 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 9:
-#line 279 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 13:
+#line 337 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.doubleCheck((yyvsp[0].lex).loc, "double literal");
         (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion((yyvsp[0].lex).d, EbtDouble, (yyvsp[0].lex).loc, true);
     }
-#line 3355 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4237 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 10:
-#line 283 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 14:
+#line 341 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
-#ifdef AMD_EXTENSIONS
         parseContext.float16Check((yyvsp[0].lex).loc, "half float literal");
         (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion((yyvsp[0].lex).d, EbtFloat16, (yyvsp[0].lex).loc, true);
-#endif
     }
-#line 3366 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4246 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 11:
-#line 289 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 15:
+#line 345 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion((yyvsp[0].lex).b, (yyvsp[0].lex).loc, true);
     }
-#line 3374 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4254 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 12:
-#line 292 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 16:
+#line 348 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.intermTypedNode) = (yyvsp[-1].interm.intermTypedNode);
         if ((yyval.interm.intermTypedNode)->getAsConstantUnion())
             (yyval.interm.intermTypedNode)->getAsConstantUnion()->setExpression();
     }
-#line 3384 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
-    break;
-
-  case 13:
-#line 300 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
-        (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode);
-    }
-#line 3392 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
-    break;
-
-  case 14:
-#line 303 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
-        (yyval.interm.intermTypedNode) = parseContext.handleBracketDereference((yyvsp[-2].lex).loc, (yyvsp[-3].interm.intermTypedNode), (yyvsp[-1].interm.intermTypedNode));
-    }
-#line 3400 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
-    break;
-
-  case 15:
-#line 306 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
-        (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode);
-    }
-#line 3408 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
-    break;
-
-  case 16:
-#line 309 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
-        (yyval.interm.intermTypedNode) = parseContext.handleDotDereference((yyvsp[0].lex).loc, (yyvsp[-2].interm.intermTypedNode), *(yyvsp[0].lex).string);
-    }
-#line 3416 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4264 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 17:
-#line 312 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 356 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+        (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode);
+    }
+#line 4272 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 18:
+#line 359 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+        (yyval.interm.intermTypedNode) = parseContext.handleBracketDereference((yyvsp[-2].lex).loc, (yyvsp[-3].interm.intermTypedNode), (yyvsp[-1].interm.intermTypedNode));
+    }
+#line 4280 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 19:
+#line 362 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+        (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode);
+    }
+#line 4288 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 20:
+#line 365 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+        (yyval.interm.intermTypedNode) = parseContext.handleDotDereference((yyvsp[0].lex).loc, (yyvsp[-2].interm.intermTypedNode), *(yyvsp[0].lex).string);
+    }
+#line 4296 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 21:
+#line 368 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.variableCheck((yyvsp[-1].interm.intermTypedNode));
         parseContext.lValueErrorCheck((yyvsp[0].lex).loc, "++", (yyvsp[-1].interm.intermTypedNode));
         (yyval.interm.intermTypedNode) = parseContext.handleUnaryMath((yyvsp[0].lex).loc, "++", EOpPostIncrement, (yyvsp[-1].interm.intermTypedNode));
     }
-#line 3426 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4306 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 18:
-#line 317 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 22:
+#line 373 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.variableCheck((yyvsp[-1].interm.intermTypedNode));
         parseContext.lValueErrorCheck((yyvsp[0].lex).loc, "--", (yyvsp[-1].interm.intermTypedNode));
         (yyval.interm.intermTypedNode) = parseContext.handleUnaryMath((yyvsp[0].lex).loc, "--", EOpPostDecrement, (yyvsp[-1].interm.intermTypedNode));
     }
-#line 3436 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4316 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 19:
-#line 325 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 23:
+#line 381 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.integerCheck((yyvsp[0].interm.intermTypedNode), "[]");
         (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode);
     }
-#line 3445 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4325 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 20:
-#line 332 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 24:
+#line 388 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.intermTypedNode) = parseContext.handleFunctionCall((yyvsp[0].interm).loc, (yyvsp[0].interm).function, (yyvsp[0].interm).intermNode);
         delete (yyvsp[0].interm).function;
     }
-#line 3454 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
-    break;
-
-  case 21:
-#line 339 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
-        (yyval.interm) = (yyvsp[0].interm);
-    }
-#line 3462 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
-    break;
-
-  case 22:
-#line 345 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
-        (yyval.interm) = (yyvsp[-1].interm);
-        (yyval.interm).loc = (yyvsp[0].lex).loc;
-    }
-#line 3471 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
-    break;
-
-  case 23:
-#line 349 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
-        (yyval.interm) = (yyvsp[-1].interm);
-        (yyval.interm).loc = (yyvsp[0].lex).loc;
-    }
-#line 3480 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
-    break;
-
-  case 24:
-#line 356 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
-        (yyval.interm) = (yyvsp[-1].interm);
-    }
-#line 3488 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4334 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 25:
-#line 359 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 395 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm) = (yyvsp[0].interm);
     }
-#line 3496 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4342 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 26:
-#line 365 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 401 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+        (yyval.interm) = (yyvsp[-1].interm);
+        (yyval.interm).loc = (yyvsp[0].lex).loc;
+    }
+#line 4351 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 27:
+#line 405 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+        (yyval.interm) = (yyvsp[-1].interm);
+        (yyval.interm).loc = (yyvsp[0].lex).loc;
+    }
+#line 4360 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 28:
+#line 412 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+        (yyval.interm) = (yyvsp[-1].interm);
+    }
+#line 4368 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 29:
+#line 415 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+        (yyval.interm) = (yyvsp[0].interm);
+    }
+#line 4376 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 30:
+#line 421 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         TParameter param = { 0, new TType };
         param.type->shallowCopy((yyvsp[0].interm.intermTypedNode)->getType());
@@ -3504,11 +4384,11 @@
         (yyval.interm).function = (yyvsp[-1].interm).function;
         (yyval.interm).intermNode = (yyvsp[0].interm.intermTypedNode);
     }
-#line 3508 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4388 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 27:
-#line 372 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 31:
+#line 428 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         TParameter param = { 0, new TType };
         param.type->shallowCopy((yyvsp[0].interm.intermTypedNode)->getType());
@@ -3516,29 +4396,29 @@
         (yyval.interm).function = (yyvsp[-2].interm).function;
         (yyval.interm).intermNode = parseContext.intermediate.growAggregate((yyvsp[-2].interm).intermNode, (yyvsp[0].interm.intermTypedNode), (yyvsp[-1].lex).loc);
     }
-#line 3520 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4400 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 28:
-#line 382 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 32:
+#line 438 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm) = (yyvsp[-1].interm);
     }
-#line 3528 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4408 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 29:
-#line 390 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 33:
+#line 446 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         // Constructor
         (yyval.interm).intermNode = 0;
         (yyval.interm).function = parseContext.handleConstructorCall((yyvsp[0].interm.type).loc, (yyvsp[0].interm.type));
     }
-#line 3538 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4418 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 30:
-#line 395 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 34:
+#line 451 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         //
         // Should be a method or subroutine call, but we haven't recognized the arguments yet.
@@ -3566,40 +4446,50 @@
             (yyval.interm).function = new TFunction(&empty, TType(EbtVoid), EOpNull);
         }
     }
-#line 3570 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4450 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 31:
-#line 425 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 35:
+#line 478 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+        // Constructor
+        (yyval.interm).intermNode = 0;
+        (yyval.interm).function = parseContext.handleConstructorCall((yyvsp[0].interm.type).loc, (yyvsp[0].interm.type));
+    }
+#line 4460 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 36:
+#line 486 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.variableCheck((yyvsp[0].interm.intermTypedNode));
         (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode);
         if (TIntermMethod* method = (yyvsp[0].interm.intermTypedNode)->getAsMethodNode())
             parseContext.error((yyvsp[0].interm.intermTypedNode)->getLoc(), "incomplete method syntax", method->getMethodName().c_str(), "");
     }
-#line 3581 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4471 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 32:
-#line 431 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 37:
+#line 492 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.lValueErrorCheck((yyvsp[-1].lex).loc, "++", (yyvsp[0].interm.intermTypedNode));
         (yyval.interm.intermTypedNode) = parseContext.handleUnaryMath((yyvsp[-1].lex).loc, "++", EOpPreIncrement, (yyvsp[0].interm.intermTypedNode));
     }
-#line 3590 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4480 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 33:
-#line 435 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 38:
+#line 496 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.lValueErrorCheck((yyvsp[-1].lex).loc, "--", (yyvsp[0].interm.intermTypedNode));
         (yyval.interm.intermTypedNode) = parseContext.handleUnaryMath((yyvsp[-1].lex).loc, "--", EOpPreDecrement, (yyvsp[0].interm.intermTypedNode));
     }
-#line 3599 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4489 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 34:
-#line 439 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 39:
+#line 500 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         if ((yyvsp[-1].interm).op != EOpNull) {
             char errorOp[2] = {0, 0};
@@ -3616,179 +4506,179 @@
                 (yyval.interm.intermTypedNode)->getAsConstantUnion()->setExpression();
         }
     }
-#line 3620 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
-    break;
-
-  case 35:
-#line 459 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    { (yyval.interm).loc = (yyvsp[0].lex).loc; (yyval.interm).op = EOpNull; }
-#line 3626 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
-    break;
-
-  case 36:
-#line 460 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    { (yyval.interm).loc = (yyvsp[0].lex).loc; (yyval.interm).op = EOpNegative; }
-#line 3632 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
-    break;
-
-  case 37:
-#line 461 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    { (yyval.interm).loc = (yyvsp[0].lex).loc; (yyval.interm).op = EOpLogicalNot; }
-#line 3638 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
-    break;
-
-  case 38:
-#line 462 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    { (yyval.interm).loc = (yyvsp[0].lex).loc; (yyval.interm).op = EOpBitwiseNot;
-              parseContext.fullIntegerCheck((yyvsp[0].lex).loc, "bitwise not"); }
-#line 3645 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
-    break;
-
-  case 39:
-#line 468 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); }
-#line 3651 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4510 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 40:
-#line 469 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 520 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    { (yyval.interm).loc = (yyvsp[0].lex).loc; (yyval.interm).op = EOpNull; }
+#line 4516 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 41:
+#line 521 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    { (yyval.interm).loc = (yyvsp[0].lex).loc; (yyval.interm).op = EOpNegative; }
+#line 4522 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 42:
+#line 522 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    { (yyval.interm).loc = (yyvsp[0].lex).loc; (yyval.interm).op = EOpLogicalNot; }
+#line 4528 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 43:
+#line 523 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    { (yyval.interm).loc = (yyvsp[0].lex).loc; (yyval.interm).op = EOpBitwiseNot;
+              parseContext.fullIntegerCheck((yyvsp[0].lex).loc, "bitwise not"); }
+#line 4535 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 44:
+#line 529 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); }
+#line 4541 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 45:
+#line 530 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.intermTypedNode) = parseContext.handleBinaryMath((yyvsp[-1].lex).loc, "*", EOpMul, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode));
         if ((yyval.interm.intermTypedNode) == 0)
             (yyval.interm.intermTypedNode) = (yyvsp[-2].interm.intermTypedNode);
     }
-#line 3661 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4551 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 41:
-#line 474 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 46:
+#line 535 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.intermTypedNode) = parseContext.handleBinaryMath((yyvsp[-1].lex).loc, "/", EOpDiv, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode));
         if ((yyval.interm.intermTypedNode) == 0)
             (yyval.interm.intermTypedNode) = (yyvsp[-2].interm.intermTypedNode);
     }
-#line 3671 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4561 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 42:
-#line 479 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 47:
+#line 540 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.fullIntegerCheck((yyvsp[-1].lex).loc, "%");
         (yyval.interm.intermTypedNode) = parseContext.handleBinaryMath((yyvsp[-1].lex).loc, "%", EOpMod, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode));
         if ((yyval.interm.intermTypedNode) == 0)
             (yyval.interm.intermTypedNode) = (yyvsp[-2].interm.intermTypedNode);
     }
-#line 3682 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4572 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 43:
-#line 488 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 48:
+#line 549 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); }
-#line 3688 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4578 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 44:
-#line 489 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 49:
+#line 550 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.intermTypedNode) = parseContext.handleBinaryMath((yyvsp[-1].lex).loc, "+", EOpAdd, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode));
         if ((yyval.interm.intermTypedNode) == 0)
             (yyval.interm.intermTypedNode) = (yyvsp[-2].interm.intermTypedNode);
     }
-#line 3698 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4588 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 45:
-#line 494 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 50:
+#line 555 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.intermTypedNode) = parseContext.handleBinaryMath((yyvsp[-1].lex).loc, "-", EOpSub, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode));
         if ((yyval.interm.intermTypedNode) == 0)
             (yyval.interm.intermTypedNode) = (yyvsp[-2].interm.intermTypedNode);
     }
-#line 3708 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4598 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 46:
-#line 502 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 51:
+#line 563 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); }
-#line 3714 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4604 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 47:
-#line 503 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 52:
+#line 564 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.fullIntegerCheck((yyvsp[-1].lex).loc, "bit shift left");
         (yyval.interm.intermTypedNode) = parseContext.handleBinaryMath((yyvsp[-1].lex).loc, "<<", EOpLeftShift, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode));
         if ((yyval.interm.intermTypedNode) == 0)
             (yyval.interm.intermTypedNode) = (yyvsp[-2].interm.intermTypedNode);
     }
-#line 3725 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4615 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 48:
-#line 509 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 53:
+#line 570 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.fullIntegerCheck((yyvsp[-1].lex).loc, "bit shift right");
         (yyval.interm.intermTypedNode) = parseContext.handleBinaryMath((yyvsp[-1].lex).loc, ">>", EOpRightShift, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode));
         if ((yyval.interm.intermTypedNode) == 0)
             (yyval.interm.intermTypedNode) = (yyvsp[-2].interm.intermTypedNode);
     }
-#line 3736 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4626 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 49:
-#line 518 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 54:
+#line 579 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); }
-#line 3742 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4632 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 50:
-#line 519 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 55:
+#line 580 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.intermTypedNode) = parseContext.handleBinaryMath((yyvsp[-1].lex).loc, "<", EOpLessThan, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode));
         if ((yyval.interm.intermTypedNode) == 0)
             (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion(false, (yyvsp[-1].lex).loc);
     }
-#line 3752 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4642 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 51:
-#line 524 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 56:
+#line 585 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.intermTypedNode) = parseContext.handleBinaryMath((yyvsp[-1].lex).loc, ">", EOpGreaterThan, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode));
         if ((yyval.interm.intermTypedNode) == 0)
             (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion(false, (yyvsp[-1].lex).loc);
     }
-#line 3762 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4652 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 52:
-#line 529 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 57:
+#line 590 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.intermTypedNode) = parseContext.handleBinaryMath((yyvsp[-1].lex).loc, "<=", EOpLessThanEqual, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode));
         if ((yyval.interm.intermTypedNode) == 0)
             (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion(false, (yyvsp[-1].lex).loc);
     }
-#line 3772 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4662 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 53:
-#line 534 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 58:
+#line 595 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.intermTypedNode) = parseContext.handleBinaryMath((yyvsp[-1].lex).loc, ">=", EOpGreaterThanEqual, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode));
         if ((yyval.interm.intermTypedNode) == 0)
             (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion(false, (yyvsp[-1].lex).loc);
     }
-#line 3782 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4672 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 54:
-#line 542 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 59:
+#line 603 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); }
-#line 3788 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4678 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 55:
-#line 543 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 60:
+#line 604 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.arrayObjectCheck((yyvsp[-1].lex).loc, (yyvsp[-2].interm.intermTypedNode)->getType(), "array comparison");
         parseContext.opaqueCheck((yyvsp[-1].lex).loc, (yyvsp[-2].interm.intermTypedNode)->getType(), "==");
@@ -3797,11 +4687,11 @@
         if ((yyval.interm.intermTypedNode) == 0)
             (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion(false, (yyvsp[-1].lex).loc);
     }
-#line 3801 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4691 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 56:
-#line 551 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 61:
+#line 612 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.arrayObjectCheck((yyvsp[-1].lex).loc, (yyvsp[-2].interm.intermTypedNode)->getType(), "array comparison");
         parseContext.opaqueCheck((yyvsp[-1].lex).loc, (yyvsp[-2].interm.intermTypedNode)->getType(), "!=");
@@ -3810,124 +4700,124 @@
         if ((yyval.interm.intermTypedNode) == 0)
             (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion(false, (yyvsp[-1].lex).loc);
     }
-#line 3814 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4704 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 57:
-#line 562 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 62:
+#line 623 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); }
-#line 3820 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4710 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 58:
-#line 563 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 63:
+#line 624 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.fullIntegerCheck((yyvsp[-1].lex).loc, "bitwise and");
         (yyval.interm.intermTypedNode) = parseContext.handleBinaryMath((yyvsp[-1].lex).loc, "&", EOpAnd, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode));
         if ((yyval.interm.intermTypedNode) == 0)
             (yyval.interm.intermTypedNode) = (yyvsp[-2].interm.intermTypedNode);
     }
-#line 3831 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4721 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 59:
-#line 572 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 64:
+#line 633 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); }
-#line 3837 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4727 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 60:
-#line 573 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 65:
+#line 634 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.fullIntegerCheck((yyvsp[-1].lex).loc, "bitwise exclusive or");
         (yyval.interm.intermTypedNode) = parseContext.handleBinaryMath((yyvsp[-1].lex).loc, "^", EOpExclusiveOr, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode));
         if ((yyval.interm.intermTypedNode) == 0)
             (yyval.interm.intermTypedNode) = (yyvsp[-2].interm.intermTypedNode);
     }
-#line 3848 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4738 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 61:
-#line 582 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 66:
+#line 643 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); }
-#line 3854 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4744 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 62:
-#line 583 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 67:
+#line 644 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.fullIntegerCheck((yyvsp[-1].lex).loc, "bitwise inclusive or");
         (yyval.interm.intermTypedNode) = parseContext.handleBinaryMath((yyvsp[-1].lex).loc, "|", EOpInclusiveOr, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode));
         if ((yyval.interm.intermTypedNode) == 0)
             (yyval.interm.intermTypedNode) = (yyvsp[-2].interm.intermTypedNode);
     }
-#line 3865 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4755 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 63:
-#line 592 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 68:
+#line 653 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); }
-#line 3871 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4761 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 64:
-#line 593 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 69:
+#line 654 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.intermTypedNode) = parseContext.handleBinaryMath((yyvsp[-1].lex).loc, "&&", EOpLogicalAnd, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode));
         if ((yyval.interm.intermTypedNode) == 0)
             (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion(false, (yyvsp[-1].lex).loc);
     }
-#line 3881 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4771 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 65:
-#line 601 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 70:
+#line 662 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); }
-#line 3887 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4777 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 66:
-#line 602 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 71:
+#line 663 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.intermTypedNode) = parseContext.handleBinaryMath((yyvsp[-1].lex).loc, "^^", EOpLogicalXor, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode));
         if ((yyval.interm.intermTypedNode) == 0)
             (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion(false, (yyvsp[-1].lex).loc);
     }
-#line 3897 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4787 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 67:
-#line 610 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 72:
+#line 671 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); }
-#line 3903 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4793 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 68:
-#line 611 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 73:
+#line 672 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.intermTypedNode) = parseContext.handleBinaryMath((yyvsp[-1].lex).loc, "||", EOpLogicalOr, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode));
         if ((yyval.interm.intermTypedNode) == 0)
             (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion(false, (yyvsp[-1].lex).loc);
     }
-#line 3913 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4803 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 69:
-#line 619 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 74:
+#line 680 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); }
-#line 3919 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4809 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 70:
-#line 620 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 75:
+#line 681 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         ++parseContext.controlFlowNestingLevel;
     }
-#line 3927 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4817 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 71:
-#line 623 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 76:
+#line 684 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         --parseContext.controlFlowNestingLevel;
         parseContext.boolCheck((yyvsp[-4].lex).loc, (yyvsp[-5].interm.intermTypedNode));
@@ -3940,20 +4830,21 @@
             (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode);
         }
     }
-#line 3944 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4834 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 72:
-#line 638 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 77:
+#line 699 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); }
-#line 3950 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4840 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 73:
-#line 639 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 78:
+#line 700 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.arrayObjectCheck((yyvsp[-1].interm).loc, (yyvsp[-2].interm.intermTypedNode)->getType(), "array assignment");
         parseContext.opaqueCheck((yyvsp[-1].interm).loc, (yyvsp[-2].interm.intermTypedNode)->getType(), "=");
+        parseContext.storage16BitAssignmentCheck((yyvsp[-1].interm).loc, (yyvsp[-2].interm.intermTypedNode)->getType(), "=");
         parseContext.specializationCheck((yyvsp[-1].interm).loc, (yyvsp[-2].interm.intermTypedNode)->getType(), "=");
         parseContext.lValueErrorCheck((yyvsp[-1].interm).loc, "assign", (yyvsp[-2].interm.intermTypedNode));
         parseContext.rValueErrorCheck((yyvsp[-1].interm).loc, "assign", (yyvsp[0].interm.intermTypedNode));
@@ -3963,119 +4854,119 @@
             (yyval.interm.intermTypedNode) = (yyvsp[-2].interm.intermTypedNode);
         }
     }
-#line 3967 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4858 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 74:
-#line 654 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 79:
+#line 716 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm).loc = (yyvsp[0].lex).loc;
         (yyval.interm).op = EOpAssign;
     }
-#line 3976 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4867 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 75:
-#line 658 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 80:
+#line 720 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm).loc = (yyvsp[0].lex).loc;
         (yyval.interm).op = EOpMulAssign;
     }
-#line 3985 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4876 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 76:
-#line 662 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 81:
+#line 724 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm).loc = (yyvsp[0].lex).loc;
         (yyval.interm).op = EOpDivAssign;
     }
-#line 3994 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4885 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 77:
-#line 666 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 82:
+#line 728 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.fullIntegerCheck((yyvsp[0].lex).loc, "%=");
         (yyval.interm).loc = (yyvsp[0].lex).loc;
         (yyval.interm).op = EOpModAssign;
     }
-#line 4004 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4895 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 78:
-#line 671 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 83:
+#line 733 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm).loc = (yyvsp[0].lex).loc;
         (yyval.interm).op = EOpAddAssign;
     }
-#line 4013 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4904 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 79:
-#line 675 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 84:
+#line 737 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm).loc = (yyvsp[0].lex).loc;
         (yyval.interm).op = EOpSubAssign;
     }
-#line 4022 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4913 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 80:
-#line 679 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 85:
+#line 741 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.fullIntegerCheck((yyvsp[0].lex).loc, "bit-shift left assign");
         (yyval.interm).loc = (yyvsp[0].lex).loc; (yyval.interm).op = EOpLeftShiftAssign;
     }
-#line 4031 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4922 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 81:
-#line 683 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 86:
+#line 745 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.fullIntegerCheck((yyvsp[0].lex).loc, "bit-shift right assign");
         (yyval.interm).loc = (yyvsp[0].lex).loc; (yyval.interm).op = EOpRightShiftAssign;
     }
-#line 4040 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4931 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 82:
-#line 687 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 87:
+#line 749 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.fullIntegerCheck((yyvsp[0].lex).loc, "bitwise-and assign");
         (yyval.interm).loc = (yyvsp[0].lex).loc; (yyval.interm).op = EOpAndAssign;
     }
-#line 4049 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4940 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 83:
-#line 691 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 88:
+#line 753 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.fullIntegerCheck((yyvsp[0].lex).loc, "bitwise-xor assign");
         (yyval.interm).loc = (yyvsp[0].lex).loc; (yyval.interm).op = EOpExclusiveOrAssign;
     }
-#line 4058 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4949 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 84:
-#line 695 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 89:
+#line 757 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.fullIntegerCheck((yyvsp[0].lex).loc, "bitwise-or assign");
         (yyval.interm).loc = (yyvsp[0].lex).loc; (yyval.interm).op = EOpInclusiveOrAssign;
     }
-#line 4067 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4958 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 85:
-#line 702 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 90:
+#line 764 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode);
     }
-#line 4075 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4966 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 86:
-#line 705 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 91:
+#line 767 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.samplerConstructorLocationCheck((yyvsp[-1].lex).loc, ",", (yyvsp[0].interm.intermTypedNode));
         (yyval.interm.intermTypedNode) = parseContext.intermediate.addComma((yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode), (yyvsp[-1].lex).loc);
@@ -4084,40 +4975,40 @@
             (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode);
         }
     }
-#line 4088 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4979 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 87:
-#line 716 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 92:
+#line 778 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.constantValueCheck((yyvsp[0].interm.intermTypedNode), "");
         (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode);
     }
-#line 4097 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4988 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 88:
-#line 723 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 93:
+#line 785 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.handleFunctionDeclarator((yyvsp[-1].interm).loc, *(yyvsp[-1].interm).function, true /* prototype */);
         (yyval.interm.intermNode) = 0;
         // TODO: 4.0 functionality: subroutines: make the identifier a user type for this signature
     }
-#line 4107 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4998 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 89:
-#line 728 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 94:
+#line 790 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         if ((yyvsp[-1].interm).intermNode && (yyvsp[-1].interm).intermNode->getAsAggregate())
             (yyvsp[-1].interm).intermNode->getAsAggregate()->setOperator(EOpSequence);
         (yyval.interm.intermNode) = (yyvsp[-1].interm).intermNode;
     }
-#line 4117 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5008 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 90:
-#line 733 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 95:
+#line 795 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.profileRequires((yyvsp[-3].lex).loc, ENoProfile, 130, 0, "precision statement");
 
@@ -4126,75 +5017,75 @@
         parseContext.setDefaultPrecision((yyvsp[-3].lex).loc, (yyvsp[-1].interm.type), (yyvsp[-2].interm.type).qualifier.precision);
         (yyval.interm.intermNode) = 0;
     }
-#line 4130 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5021 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 91:
-#line 741 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 96:
+#line 803 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.declareBlock((yyvsp[-1].interm).loc, *(yyvsp[-1].interm).typeList);
         (yyval.interm.intermNode) = 0;
     }
-#line 4139 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5030 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 92:
-#line 745 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 97:
+#line 807 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.declareBlock((yyvsp[-2].interm).loc, *(yyvsp[-2].interm).typeList, (yyvsp[-1].lex).string);
         (yyval.interm.intermNode) = 0;
     }
-#line 4148 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5039 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 93:
-#line 749 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 98:
+#line 811 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.declareBlock((yyvsp[-3].interm).loc, *(yyvsp[-3].interm).typeList, (yyvsp[-2].lex).string, (yyvsp[-1].interm).arraySizes);
         (yyval.interm.intermNode) = 0;
     }
-#line 4157 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5048 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 94:
-#line 753 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 99:
+#line 815 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.globalQualifierFixCheck((yyvsp[-1].interm.type).loc, (yyvsp[-1].interm.type).qualifier);
         parseContext.updateStandaloneQualifierDefaults((yyvsp[-1].interm.type).loc, (yyvsp[-1].interm.type));
         (yyval.interm.intermNode) = 0;
     }
-#line 4167 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5058 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 95:
-#line 758 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 100:
+#line 820 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.checkNoShaderLayouts((yyvsp[-2].interm.type).loc, (yyvsp[-2].interm.type).shaderQualifiers);
         parseContext.addQualifierToExisting((yyvsp[-2].interm.type).loc, (yyvsp[-2].interm.type).qualifier, *(yyvsp[-1].lex).string);
         (yyval.interm.intermNode) = 0;
     }
-#line 4177 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5068 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 96:
-#line 763 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 101:
+#line 825 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.checkNoShaderLayouts((yyvsp[-3].interm.type).loc, (yyvsp[-3].interm.type).shaderQualifiers);
         (yyvsp[-1].interm.identifierList)->push_back((yyvsp[-2].lex).string);
         parseContext.addQualifierToExisting((yyvsp[-3].interm.type).loc, (yyvsp[-3].interm.type).qualifier, *(yyvsp[-1].interm.identifierList));
         (yyval.interm.intermNode) = 0;
     }
-#line 4188 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5079 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 97:
-#line 772 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 102:
+#line 834 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     { parseContext.nestedBlockCheck((yyvsp[-2].interm.type).loc); }
-#line 4194 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5085 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 98:
-#line 772 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 103:
+#line 834 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         --parseContext.structNestingLevel;
         parseContext.blockName = (yyvsp[-4].lex).string;
@@ -4204,54 +5095,54 @@
         (yyval.interm).loc = (yyvsp[-5].interm.type).loc;
         (yyval.interm).typeList = (yyvsp[-1].interm.typeList);
     }
-#line 4208 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5099 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 99:
-#line 783 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 104:
+#line 845 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.identifierList) = new TIdentifierList;
         (yyval.interm.identifierList)->push_back((yyvsp[0].lex).string);
     }
-#line 4217 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5108 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 100:
-#line 787 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 105:
+#line 849 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.identifierList) = (yyvsp[-2].interm.identifierList);
         (yyval.interm.identifierList)->push_back((yyvsp[0].lex).string);
     }
-#line 4226 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5117 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 101:
-#line 794 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 106:
+#line 856 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm).function = (yyvsp[-1].interm.function);
         (yyval.interm).loc = (yyvsp[0].lex).loc;
     }
-#line 4235 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5126 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 102:
-#line 801 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 107:
+#line 863 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.function) = (yyvsp[0].interm.function);
     }
-#line 4243 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5134 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 103:
-#line 804 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 108:
+#line 866 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.function) = (yyvsp[0].interm.function);
     }
-#line 4251 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5142 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 104:
-#line 811 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 109:
+#line 873 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         // Add the parameter
         (yyval.interm.function) = (yyvsp[-1].interm.function);
@@ -4260,11 +5151,11 @@
         else
             delete (yyvsp[0].interm).param.type;
     }
-#line 4264 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5155 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 105:
-#line 819 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 110:
+#line 881 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         //
         // Only first parameter of one-parameter functions can be void
@@ -4282,11 +5173,11 @@
             (yyvsp[-2].interm.function)->addParameter((yyvsp[0].interm).param);
         }
     }
-#line 4286 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5177 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 106:
-#line 839 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 111:
+#line 901 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         if ((yyvsp[-2].interm.type).qualifier.storage != EvqGlobal && (yyvsp[-2].interm.type).qualifier.storage != EvqTemporary) {
             parseContext.error((yyvsp[-1].lex).loc, "no qualifiers allowed for function return",
@@ -4298,14 +5189,19 @@
         // Add the function as a prototype after parsing it (we do not support recursion)
         TFunction *function;
         TType type((yyvsp[-2].interm.type));
+
+        // Potentially rename shader entry point function.  No-op most of the time.
+        parseContext.renameShaderFunction((yyvsp[-1].lex).string);
+
+        // Make the function
         function = new TFunction((yyvsp[-1].lex).string, type);
         (yyval.interm.function) = function;
     }
-#line 4305 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5201 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 107:
-#line 857 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 112:
+#line 924 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         if ((yyvsp[-1].interm.type).arraySizes) {
             parseContext.profileRequires((yyvsp[-1].interm.type).loc, ENoProfile, 120, E_GL_3DL_array_objects, "arrayed type");
@@ -4321,33 +5217,35 @@
         (yyval.interm).loc = (yyvsp[0].lex).loc;
         (yyval.interm).param = param;
     }
-#line 4325 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5221 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 108:
-#line 872 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 113:
+#line 939 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         if ((yyvsp[-2].interm.type).arraySizes) {
             parseContext.profileRequires((yyvsp[-2].interm.type).loc, ENoProfile, 120, E_GL_3DL_array_objects, "arrayed type");
             parseContext.profileRequires((yyvsp[-2].interm.type).loc, EEsProfile, 300, 0, "arrayed type");
             parseContext.arraySizeRequiredCheck((yyvsp[-2].interm.type).loc, *(yyvsp[-2].interm.type).arraySizes);
         }
-        parseContext.arrayDimCheck((yyvsp[-1].lex).loc, (yyvsp[-2].interm.type).arraySizes, (yyvsp[0].interm).arraySizes);
+        TType* type = new TType((yyvsp[-2].interm.type));
+        type->transferArraySizes((yyvsp[0].interm).arraySizes);
+        type->copyArrayInnerSizes((yyvsp[-2].interm.type).arraySizes);
 
+        parseContext.arrayOfArrayVersionCheck((yyvsp[-1].lex).loc, type->getArraySizes());
         parseContext.arraySizeRequiredCheck((yyvsp[0].interm).loc, *(yyvsp[0].interm).arraySizes);
         parseContext.reservedErrorCheck((yyvsp[-1].lex).loc, *(yyvsp[-1].lex).string);
 
-        (yyvsp[-2].interm.type).arraySizes = (yyvsp[0].interm).arraySizes;
+        TParameter param = { (yyvsp[-1].lex).string, type };
 
-        TParameter param = { (yyvsp[-1].lex).string, new TType((yyvsp[-2].interm.type))};
         (yyval.interm).loc = (yyvsp[-1].lex).loc;
         (yyval.interm).param = param;
     }
-#line 4347 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5245 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 109:
-#line 895 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 114:
+#line 964 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm) = (yyvsp[0].interm);
         if ((yyvsp[-1].interm.type).qualifier.precision != EpqNone)
@@ -4359,23 +5257,23 @@
         parseContext.paramCheckFix((yyvsp[-1].interm.type).loc, (yyvsp[-1].interm.type).qualifier, *(yyval.interm).param.type);
 
     }
-#line 4363 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5261 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 110:
-#line 906 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 115:
+#line 975 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm) = (yyvsp[0].interm);
 
         parseContext.parameterTypeCheck((yyvsp[0].interm).loc, EvqIn, *(yyvsp[0].interm).param.type);
-        parseContext.paramCheckFix((yyvsp[0].interm).loc, EvqTemporary, *(yyval.interm).param.type);
+        parseContext.paramCheckFixStorage((yyvsp[0].interm).loc, EvqTemporary, *(yyval.interm).param.type);
         parseContext.precisionQualifierCheck((yyval.interm).loc, (yyval.interm).param.type->getBasicType(), (yyval.interm).param.type->getQualifier());
     }
-#line 4375 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5273 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 111:
-#line 916 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 116:
+#line 985 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm) = (yyvsp[0].interm);
         if ((yyvsp[-1].interm.type).qualifier.precision != EpqNone)
@@ -4386,130 +5284,130 @@
         parseContext.parameterTypeCheck((yyvsp[0].interm).loc, (yyvsp[-1].interm.type).qualifier.storage, *(yyval.interm).param.type);
         parseContext.paramCheckFix((yyvsp[-1].interm.type).loc, (yyvsp[-1].interm.type).qualifier, *(yyval.interm).param.type);
     }
-#line 4390 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5288 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 112:
-#line 926 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 117:
+#line 995 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm) = (yyvsp[0].interm);
 
         parseContext.parameterTypeCheck((yyvsp[0].interm).loc, EvqIn, *(yyvsp[0].interm).param.type);
-        parseContext.paramCheckFix((yyvsp[0].interm).loc, EvqTemporary, *(yyval.interm).param.type);
+        parseContext.paramCheckFixStorage((yyvsp[0].interm).loc, EvqTemporary, *(yyval.interm).param.type);
         parseContext.precisionQualifierCheck((yyval.interm).loc, (yyval.interm).param.type->getBasicType(), (yyval.interm).param.type->getQualifier());
     }
-#line 4402 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5300 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 113:
-#line 936 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 118:
+#line 1005 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         TParameter param = { 0, new TType((yyvsp[0].interm.type)) };
         (yyval.interm).param = param;
         if ((yyvsp[0].interm.type).arraySizes)
             parseContext.arraySizeRequiredCheck((yyvsp[0].interm.type).loc, *(yyvsp[0].interm.type).arraySizes);
     }
-#line 4413 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5311 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 114:
-#line 945 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 119:
+#line 1014 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm) = (yyvsp[0].interm);
     }
-#line 4421 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5319 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 115:
-#line 948 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 120:
+#line 1017 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm) = (yyvsp[-2].interm);
         parseContext.declareVariable((yyvsp[0].lex).loc, *(yyvsp[0].lex).string, (yyvsp[-2].interm).type);
     }
-#line 4430 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5328 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 116:
-#line 952 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 121:
+#line 1021 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm) = (yyvsp[-3].interm);
         parseContext.declareVariable((yyvsp[-1].lex).loc, *(yyvsp[-1].lex).string, (yyvsp[-3].interm).type, (yyvsp[0].interm).arraySizes);
     }
-#line 4439 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5337 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 117:
-#line 956 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 122:
+#line 1025 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm).type = (yyvsp[-5].interm).type;
         TIntermNode* initNode = parseContext.declareVariable((yyvsp[-3].lex).loc, *(yyvsp[-3].lex).string, (yyvsp[-5].interm).type, (yyvsp[-2].interm).arraySizes, (yyvsp[0].interm.intermTypedNode));
         (yyval.interm).intermNode = parseContext.intermediate.growAggregate((yyvsp[-5].interm).intermNode, initNode, (yyvsp[-1].lex).loc);
     }
-#line 4449 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5347 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 118:
-#line 961 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 123:
+#line 1030 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm).type = (yyvsp[-4].interm).type;
         TIntermNode* initNode = parseContext.declareVariable((yyvsp[-2].lex).loc, *(yyvsp[-2].lex).string, (yyvsp[-4].interm).type, 0, (yyvsp[0].interm.intermTypedNode));
         (yyval.interm).intermNode = parseContext.intermediate.growAggregate((yyvsp[-4].interm).intermNode, initNode, (yyvsp[-1].lex).loc);
     }
-#line 4459 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5357 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 119:
-#line 969 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 124:
+#line 1038 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm).type = (yyvsp[0].interm.type);
         (yyval.interm).intermNode = 0;
         parseContext.declareTypeDefaults((yyval.interm).loc, (yyval.interm).type);
     }
-#line 4469 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5367 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 120:
-#line 974 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 125:
+#line 1043 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm).type = (yyvsp[-1].interm.type);
         (yyval.interm).intermNode = 0;
         parseContext.declareVariable((yyvsp[0].lex).loc, *(yyvsp[0].lex).string, (yyvsp[-1].interm.type));
     }
-#line 4479 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5377 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 121:
-#line 979 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 126:
+#line 1048 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm).type = (yyvsp[-2].interm.type);
         (yyval.interm).intermNode = 0;
         parseContext.declareVariable((yyvsp[-1].lex).loc, *(yyvsp[-1].lex).string, (yyvsp[-2].interm.type), (yyvsp[0].interm).arraySizes);
     }
-#line 4489 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5387 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 122:
-#line 984 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 127:
+#line 1053 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm).type = (yyvsp[-4].interm.type);
         TIntermNode* initNode = parseContext.declareVariable((yyvsp[-3].lex).loc, *(yyvsp[-3].lex).string, (yyvsp[-4].interm.type), (yyvsp[-2].interm).arraySizes, (yyvsp[0].interm.intermTypedNode));
         (yyval.interm).intermNode = parseContext.intermediate.growAggregate(0, initNode, (yyvsp[-1].lex).loc);
     }
-#line 4499 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5397 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 123:
-#line 989 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 128:
+#line 1058 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm).type = (yyvsp[-3].interm.type);
         TIntermNode* initNode = parseContext.declareVariable((yyvsp[-2].lex).loc, *(yyvsp[-2].lex).string, (yyvsp[-3].interm.type), 0, (yyvsp[0].interm.intermTypedNode));
         (yyval.interm).intermNode = parseContext.intermediate.growAggregate(0, initNode, (yyvsp[-1].lex).loc);
     }
-#line 4509 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5407 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 124:
-#line 998 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 129:
+#line 1067 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type) = (yyvsp[0].interm.type);
 
@@ -4521,11 +5419,11 @@
 
         parseContext.precisionQualifierCheck((yyval.interm.type).loc, (yyval.interm.type).basicType, (yyval.interm.type).qualifier);
     }
-#line 4525 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5423 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 125:
-#line 1009 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 130:
+#line 1078 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.globalQualifierFixCheck((yyvsp[-1].interm.type).loc, (yyvsp[-1].interm.type).qualifier);
         parseContext.globalQualifierTypeCheck((yyvsp[-1].interm.type).loc, (yyvsp[-1].interm.type).qualifier, (yyvsp[0].interm.type));
@@ -4536,7 +5434,7 @@
         }
 
         if ((yyvsp[0].interm.type).arraySizes && parseContext.arrayQualifierError((yyvsp[0].interm.type).loc, (yyvsp[-1].interm.type).qualifier))
-            (yyvsp[0].interm.type).arraySizes = 0;
+            (yyvsp[0].interm.type).arraySizes = nullptr;
 
         parseContext.checkNoShaderLayouts((yyvsp[0].interm.type).loc, (yyvsp[-1].interm.type).shaderQualifiers);
         (yyvsp[0].interm.type).shaderQualifiers.merge((yyvsp[-1].interm.type).shaderQualifiers);
@@ -4550,22 +5448,22 @@
              (parseContext.language == EShLangFragment && (yyval.interm.type).qualifier.storage == EvqVaryingIn)))
             (yyval.interm.type).qualifier.smooth = true;
     }
-#line 4554 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5452 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 126:
-#line 1036 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 131:
+#line 1105 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.globalCheck((yyvsp[0].lex).loc, "invariant");
         parseContext.profileRequires((yyval.interm.type).loc, ENoProfile, 120, 0, "invariant");
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         (yyval.interm.type).qualifier.invariant = true;
     }
-#line 4565 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5463 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 127:
-#line 1045 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 132:
+#line 1114 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.globalCheck((yyvsp[0].lex).loc, "smooth");
         parseContext.profileRequires((yyvsp[0].lex).loc, ENoProfile, 130, 0, "smooth");
@@ -4573,11 +5471,11 @@
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         (yyval.interm.type).qualifier.smooth = true;
     }
-#line 4577 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5475 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 128:
-#line 1052 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 133:
+#line 1121 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.globalCheck((yyvsp[0].lex).loc, "flat");
         parseContext.profileRequires((yyvsp[0].lex).loc, ENoProfile, 130, 0, "flat");
@@ -4585,23 +5483,27 @@
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         (yyval.interm.type).qualifier.flat = true;
     }
-#line 4589 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5487 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 129:
-#line 1059 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 134:
+#line 1128 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.globalCheck((yyvsp[0].lex).loc, "noperspective");
+#ifdef NV_EXTENSIONS
+        parseContext.profileRequires((yyvsp[0].lex).loc, EEsProfile, 0, E_GL_NV_shader_noperspective_interpolation, "noperspective");
+#else
         parseContext.requireProfile((yyvsp[0].lex).loc, ~EEsProfile, "noperspective");
+#endif
         parseContext.profileRequires((yyvsp[0].lex).loc, ENoProfile, 130, 0, "noperspective");
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         (yyval.interm.type).qualifier.nopersp = true;
     }
-#line 4601 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5503 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 130:
-#line 1066 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 135:
+#line 1139 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
 #ifdef AMD_EXTENSIONS
         parseContext.globalCheck((yyvsp[0].lex).loc, "__explicitInterpAMD");
@@ -4611,84 +5513,144 @@
         (yyval.interm.type).qualifier.explicitInterp = true;
 #endif
     }
-#line 4615 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5517 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 131:
-#line 1078 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 136:
+#line 1148 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+#ifdef NV_EXTENSIONS
+        parseContext.globalCheck((yyvsp[0].lex).loc, "pervertexNV");
+        parseContext.profileRequires((yyvsp[0].lex).loc, ECoreProfile, 0, E_GL_NV_fragment_shader_barycentric, "fragment shader barycentric");
+        parseContext.profileRequires((yyvsp[0].lex).loc, ECompatibilityProfile, 0, E_GL_NV_fragment_shader_barycentric, "fragment shader barycentric");
+        parseContext.profileRequires((yyvsp[0].lex).loc, EEsProfile, 0, E_GL_NV_fragment_shader_barycentric, "fragment shader barycentric");
+        (yyval.interm.type).init((yyvsp[0].lex).loc);
+        (yyval.interm.type).qualifier.pervertexNV = true;
+#endif
+    }
+#line 5532 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 137:
+#line 1158 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+#ifdef NV_EXTENSIONS
+        // No need for profile version or extension check. Shader stage already checks both.
+        parseContext.globalCheck((yyvsp[0].lex).loc, "perprimitiveNV");
+        parseContext.requireStage((yyvsp[0].lex).loc, (EShLanguageMask)(EShLangFragmentMask | EShLangMeshNVMask), "perprimitiveNV");
+        // Fragment shader stage doesn't check for extension. So we explicitly add below extension check.
+        if (parseContext.language == EShLangFragment)
+            parseContext.requireExtensions((yyvsp[0].lex).loc, 1, &E_GL_NV_mesh_shader, "perprimitiveNV");
+        (yyval.interm.type).init((yyvsp[0].lex).loc);
+        (yyval.interm.type).qualifier.perPrimitiveNV = true;
+#endif
+    }
+#line 5549 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 138:
+#line 1170 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+#ifdef NV_EXTENSIONS
+        // No need for profile version or extension check. Shader stage already checks both.
+        parseContext.globalCheck((yyvsp[0].lex).loc, "perviewNV");
+        parseContext.requireStage((yyvsp[0].lex).loc, EShLangMeshNV, "perviewNV");
+        (yyval.interm.type).init((yyvsp[0].lex).loc);
+        (yyval.interm.type).qualifier.perViewNV = true;
+#endif
+    }
+#line 5563 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 139:
+#line 1179 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+#ifdef NV_EXTENSIONS
+        // No need for profile version or extension check. Shader stage already checks both.
+        parseContext.globalCheck((yyvsp[0].lex).loc, "taskNV");
+        parseContext.requireStage((yyvsp[0].lex).loc, (EShLanguageMask)(EShLangTaskNVMask | EShLangMeshNVMask), "taskNV");
+        (yyval.interm.type).init((yyvsp[0].lex).loc);
+        (yyval.interm.type).qualifier.perTaskNV = true;
+#endif
+    }
+#line 5577 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 140:
+#line 1191 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type) = (yyvsp[-1].interm.type);
     }
-#line 4623 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5585 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 132:
-#line 1084 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 141:
+#line 1197 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type) = (yyvsp[0].interm.type);
     }
-#line 4631 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5593 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 133:
-#line 1087 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 142:
+#line 1200 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type) = (yyvsp[-2].interm.type);
         (yyval.interm.type).shaderQualifiers.merge((yyvsp[0].interm.type).shaderQualifiers);
         parseContext.mergeObjectLayoutQualifiers((yyval.interm.type).qualifier, (yyvsp[0].interm.type).qualifier, false);
     }
-#line 4641 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5603 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 134:
-#line 1094 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 143:
+#line 1207 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         parseContext.setLayoutQualifier((yyvsp[0].lex).loc, (yyval.interm.type), *(yyvsp[0].lex).string);
     }
-#line 4650 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5612 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 135:
-#line 1098 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 144:
+#line 1211 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[-2].lex).loc);
         parseContext.setLayoutQualifier((yyvsp[-2].lex).loc, (yyval.interm.type), *(yyvsp[-2].lex).string, (yyvsp[0].interm.intermTypedNode));
     }
-#line 4659 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5621 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 136:
-#line 1102 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 145:
+#line 1215 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     { // because "shared" is both an identifier and a keyword
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         TString strShared("shared");
         parseContext.setLayoutQualifier((yyvsp[0].lex).loc, (yyval.interm.type), strShared);
     }
-#line 4669 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5631 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 137:
-#line 1110 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 146:
+#line 1223 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.profileRequires((yyval.interm.type).loc, ECoreProfile | ECompatibilityProfile, 400, E_GL_ARB_gpu_shader5, "precise");
         parseContext.profileRequires((yyvsp[0].lex).loc, EEsProfile, 320, Num_AEP_gpu_shader5, AEP_gpu_shader5, "precise");
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         (yyval.interm.type).qualifier.noContraction = true;
     }
-#line 4680 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5642 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 138:
-#line 1119 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 147:
+#line 1232 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type) = (yyvsp[0].interm.type);
     }
-#line 4688 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5650 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 139:
-#line 1122 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 148:
+#line 1235 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type) = (yyvsp[-1].interm.type);
         if ((yyval.interm.type).basicType == EbtVoid)
@@ -4697,72 +5659,80 @@
         (yyval.interm.type).shaderQualifiers.merge((yyvsp[0].interm.type).shaderQualifiers);
         parseContext.mergeQualifiers((yyval.interm.type).loc, (yyval.interm.type).qualifier, (yyvsp[0].interm.type).qualifier, false);
     }
-#line 4701 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5663 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 140:
-#line 1133 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 149:
+#line 1246 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type) = (yyvsp[0].interm.type);
     }
-#line 4709 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5671 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 141:
-#line 1136 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 150:
+#line 1249 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type) = (yyvsp[0].interm.type);
     }
-#line 4717 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5679 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 142:
-#line 1139 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 151:
+#line 1252 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.checkPrecisionQualifier((yyvsp[0].interm.type).loc, (yyvsp[0].interm.type).qualifier.precision);
         (yyval.interm.type) = (yyvsp[0].interm.type);
     }
-#line 4726 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5688 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 143:
-#line 1143 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 152:
+#line 1256 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         // allow inheritance of storage qualifier from block declaration
         (yyval.interm.type) = (yyvsp[0].interm.type);
     }
-#line 4735 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5697 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 144:
-#line 1147 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 153:
+#line 1260 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         // allow inheritance of storage qualifier from block declaration
         (yyval.interm.type) = (yyvsp[0].interm.type);
     }
-#line 4744 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5706 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 145:
-#line 1151 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 154:
+#line 1264 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         // allow inheritance of storage qualifier from block declaration
         (yyval.interm.type) = (yyvsp[0].interm.type);
     }
-#line 4753 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5715 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 146:
-#line 1158 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 155:
+#line 1268 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+        (yyval.interm.type) = (yyvsp[0].interm.type);
+    }
+#line 5723 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 156:
+#line 1274 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         (yyval.interm.type).qualifier.storage = EvqConst;  // will later turn into EvqConstReadOnly, if the initializer is not constant
     }
-#line 4762 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5732 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 147:
-#line 1162 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 157:
+#line 1278 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.requireStage((yyvsp[0].lex).loc, EShLangVertex, "attribute");
         parseContext.checkDeprecated((yyvsp[0].lex).loc, ECoreProfile, 130, "attribute");
@@ -4775,11 +5745,11 @@
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         (yyval.interm.type).qualifier.storage = EvqVaryingIn;
     }
-#line 4779 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5749 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 148:
-#line 1174 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 158:
+#line 1290 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.checkDeprecated((yyvsp[0].lex).loc, ENoProfile, 130, "varying");
         parseContext.checkDeprecated((yyvsp[0].lex).loc, ECoreProfile, 130, "varying");
@@ -4794,43 +5764,43 @@
         else
             (yyval.interm.type).qualifier.storage = EvqVaryingIn;
     }
-#line 4798 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5768 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 149:
-#line 1188 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 159:
+#line 1304 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.globalCheck((yyvsp[0].lex).loc, "inout");
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         (yyval.interm.type).qualifier.storage = EvqInOut;
     }
-#line 4808 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5778 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 150:
-#line 1193 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 160:
+#line 1309 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.globalCheck((yyvsp[0].lex).loc, "in");
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         // whether this is a parameter "in" or a pipeline "in" will get sorted out a bit later
         (yyval.interm.type).qualifier.storage = EvqIn;
     }
-#line 4819 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5789 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 151:
-#line 1199 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 161:
+#line 1315 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.globalCheck((yyvsp[0].lex).loc, "out");
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         // whether this is a parameter "out" or a pipeline "out" will get sorted out a bit later
         (yyval.interm.type).qualifier.storage = EvqOut;
     }
-#line 4830 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5800 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 152:
-#line 1205 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 162:
+#line 1321 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.profileRequires((yyvsp[0].lex).loc, ENoProfile, 120, 0, "centroid");
         parseContext.profileRequires((yyvsp[0].lex).loc, EEsProfile, 300, 0, "centroid");
@@ -4838,179 +5808,317 @@
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         (yyval.interm.type).qualifier.centroid = true;
     }
-#line 4842 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5812 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 153:
-#line 1212 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 163:
+#line 1328 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.globalCheck((yyvsp[0].lex).loc, "patch");
         parseContext.requireStage((yyvsp[0].lex).loc, (EShLanguageMask)(EShLangTessControlMask | EShLangTessEvaluationMask), "patch");
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         (yyval.interm.type).qualifier.patch = true;
     }
-#line 4853 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5823 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 154:
-#line 1218 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 164:
+#line 1334 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.globalCheck((yyvsp[0].lex).loc, "sample");
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         (yyval.interm.type).qualifier.sample = true;
     }
-#line 4863 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5833 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 155:
-#line 1223 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 165:
+#line 1339 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.globalCheck((yyvsp[0].lex).loc, "uniform");
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         (yyval.interm.type).qualifier.storage = EvqUniform;
     }
-#line 4873 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5843 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 156:
-#line 1228 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 166:
+#line 1344 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.globalCheck((yyvsp[0].lex).loc, "buffer");
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         (yyval.interm.type).qualifier.storage = EvqBuffer;
     }
-#line 4883 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5853 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 157:
-#line 1233 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 167:
+#line 1349 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
+#ifdef NV_EXTENSIONS
+        parseContext.globalCheck((yyvsp[0].lex).loc, "hitAttributeNV");
+        parseContext.requireStage((yyvsp[0].lex).loc, (EShLanguageMask)(EShLangIntersectNVMask | EShLangClosestHitNVMask
+            | EShLangAnyHitNVMask), "hitAttributeNV");
+        parseContext.profileRequires((yyvsp[0].lex).loc, ECoreProfile, 460, E_GL_NV_ray_tracing, "hitAttributeNV");
+        (yyval.interm.type).init((yyvsp[0].lex).loc);
+        (yyval.interm.type).qualifier.storage = EvqHitAttrNV;
+#endif
+    }
+#line 5868 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 168:
+#line 1359 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+#ifdef NV_EXTENSIONS
+        parseContext.globalCheck((yyvsp[0].lex).loc, "rayPayloadNV");
+        parseContext.requireStage((yyvsp[0].lex).loc, (EShLanguageMask)(EShLangRayGenNVMask | EShLangClosestHitNVMask |
+            EShLangAnyHitNVMask | EShLangMissNVMask), "rayPayloadNV");
+        parseContext.profileRequires((yyvsp[0].lex).loc, ECoreProfile, 460, E_GL_NV_ray_tracing, "rayPayloadNV");
+        (yyval.interm.type).init((yyvsp[0].lex).loc);
+        (yyval.interm.type).qualifier.storage = EvqPayloadNV;
+#endif
+    }
+#line 5883 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 169:
+#line 1369 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+#ifdef NV_EXTENSIONS
+        parseContext.globalCheck((yyvsp[0].lex).loc, "rayPayloadInNV");
+        parseContext.requireStage((yyvsp[0].lex).loc, (EShLanguageMask)(EShLangClosestHitNVMask |
+            EShLangAnyHitNVMask | EShLangMissNVMask), "rayPayloadInNV");
+        parseContext.profileRequires((yyvsp[0].lex).loc, ECoreProfile, 460, E_GL_NV_ray_tracing, "rayPayloadInNV");
+        (yyval.interm.type).init((yyvsp[0].lex).loc);
+        (yyval.interm.type).qualifier.storage = EvqPayloadInNV;
+#endif
+    }
+#line 5898 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 170:
+#line 1379 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+#ifdef NV_EXTENSIONS
+        parseContext.globalCheck((yyvsp[0].lex).loc, "callableDataNV");
+        parseContext.requireStage((yyvsp[0].lex).loc, (EShLanguageMask)(EShLangRayGenNVMask |
+            EShLangClosestHitNVMask | EShLangMissNVMask | EShLangCallableNVMask), "callableDataNV");
+        parseContext.profileRequires((yyvsp[0].lex).loc, ECoreProfile, 460, E_GL_NV_ray_tracing, "callableDataNV");
+        (yyval.interm.type).init((yyvsp[0].lex).loc);
+        (yyval.interm.type).qualifier.storage = EvqCallableDataNV;
+#endif
+    }
+#line 5913 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 171:
+#line 1389 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+#ifdef NV_EXTENSIONS
+        parseContext.globalCheck((yyvsp[0].lex).loc, "callableDataInNV");
+        parseContext.requireStage((yyvsp[0].lex).loc, (EShLanguageMask)(EShLangCallableNVMask), "callableDataInNV");
+        parseContext.profileRequires((yyvsp[0].lex).loc, ECoreProfile, 460, E_GL_NV_ray_tracing, "callableDataInNV");
+        (yyval.interm.type).init((yyvsp[0].lex).loc);
+        (yyval.interm.type).qualifier.storage = EvqCallableDataInNV;
+#endif
+    }
+#line 5927 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 172:
+#line 1398 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+        parseContext.globalCheck((yyvsp[0].lex).loc, "shared");
         parseContext.profileRequires((yyvsp[0].lex).loc, ECoreProfile | ECompatibilityProfile, 430, E_GL_ARB_compute_shader, "shared");
         parseContext.profileRequires((yyvsp[0].lex).loc, EEsProfile, 310, 0, "shared");
+#ifdef NV_EXTENSIONS
+        parseContext.requireStage((yyvsp[0].lex).loc, (EShLanguageMask)(EShLangComputeMask | EShLangMeshNVMask | EShLangTaskNVMask), "shared");
+#else
         parseContext.requireStage((yyvsp[0].lex).loc, EShLangCompute, "shared");
+#endif
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         (yyval.interm.type).qualifier.storage = EvqShared;
     }
-#line 4895 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5944 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 158:
-#line 1240 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 173:
+#line 1410 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         (yyval.interm.type).qualifier.coherent = true;
     }
-#line 4904 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5953 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 159:
-#line 1244 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 174:
+#line 1414 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+        (yyval.interm.type).init((yyvsp[0].lex).loc);
+        parseContext.requireExtensions((yyvsp[0].lex).loc, 1, &E_GL_KHR_memory_scope_semantics, "devicecoherent");
+        (yyval.interm.type).qualifier.devicecoherent = true;
+    }
+#line 5963 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 175:
+#line 1419 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+        (yyval.interm.type).init((yyvsp[0].lex).loc);
+        parseContext.requireExtensions((yyvsp[0].lex).loc, 1, &E_GL_KHR_memory_scope_semantics, "queuefamilycoherent");
+        (yyval.interm.type).qualifier.queuefamilycoherent = true;
+    }
+#line 5973 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 176:
+#line 1424 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+        (yyval.interm.type).init((yyvsp[0].lex).loc);
+        parseContext.requireExtensions((yyvsp[0].lex).loc, 1, &E_GL_KHR_memory_scope_semantics, "workgroupcoherent");
+        (yyval.interm.type).qualifier.workgroupcoherent = true;
+    }
+#line 5983 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 177:
+#line 1429 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+        (yyval.interm.type).init((yyvsp[0].lex).loc);
+        parseContext.requireExtensions((yyvsp[0].lex).loc, 1, &E_GL_KHR_memory_scope_semantics, "subgroupcoherent");
+        (yyval.interm.type).qualifier.subgroupcoherent = true;
+    }
+#line 5993 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 178:
+#line 1434 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+        (yyval.interm.type).init((yyvsp[0].lex).loc);
+        parseContext.requireExtensions((yyvsp[0].lex).loc, 1, &E_GL_KHR_memory_scope_semantics, "nonprivate");
+        (yyval.interm.type).qualifier.nonprivate = true;
+    }
+#line 6003 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 179:
+#line 1439 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         (yyval.interm.type).qualifier.volatil = true;
     }
-#line 4913 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6012 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 160:
-#line 1248 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 180:
+#line 1443 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         (yyval.interm.type).qualifier.restrict = true;
     }
-#line 4922 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6021 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 161:
-#line 1252 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 181:
+#line 1447 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         (yyval.interm.type).qualifier.readonly = true;
     }
-#line 4931 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6030 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 162:
-#line 1256 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 182:
+#line 1451 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         (yyval.interm.type).qualifier.writeonly = true;
     }
-#line 4940 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6039 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 163:
-#line 1260 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 183:
+#line 1455 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.spvRemoved((yyvsp[0].lex).loc, "subroutine");
         parseContext.globalCheck((yyvsp[0].lex).loc, "subroutine");
+        parseContext.unimplemented((yyvsp[0].lex).loc, "subroutine");
         (yyval.interm.type).init((yyvsp[0].lex).loc);
-        (yyval.interm.type).qualifier.storage = EvqUniform;
     }
-#line 4951 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6050 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 164:
-#line 1266 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 184:
+#line 1461 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.spvRemoved((yyvsp[-3].lex).loc, "subroutine");
         parseContext.globalCheck((yyvsp[-3].lex).loc, "subroutine");
+        parseContext.unimplemented((yyvsp[-3].lex).loc, "subroutine");
         (yyval.interm.type).init((yyvsp[-3].lex).loc);
-        (yyval.interm.type).qualifier.storage = EvqUniform;
+    }
+#line 6061 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 185:
+#line 1470 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+        (yyval.interm.type).init((yyvsp[0].lex).loc);
+        (yyval.interm.type).qualifier.nonUniform = true;
+    }
+#line 6070 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 186:
+#line 1477 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+        // TODO
+    }
+#line 6078 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 187:
+#line 1480 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
         // TODO: 4.0 semantics: subroutines
         // 1) make sure each identifier is a type declared earlier with SUBROUTINE
         // 2) save all of the identifiers for future comparison with the declared function
     }
-#line 4965 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6088 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 165:
-#line 1278 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
-        // TODO: 4.0 functionality: subroutine type to list
-    }
-#line 4973 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
-    break;
-
-  case 166:
-#line 1281 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
-    }
-#line 4980 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
-    break;
-
-  case 167:
-#line 1286 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 188:
+#line 1488 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type) = (yyvsp[0].interm.type);
         (yyval.interm.type).qualifier.precision = parseContext.getDefaultPrecision((yyval.interm.type));
     }
-#line 4989 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6097 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 168:
-#line 1290 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 189:
+#line 1492 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
-        parseContext.arrayDimCheck((yyvsp[0].interm).loc, (yyvsp[0].interm).arraySizes, 0);
+        parseContext.arrayOfArrayVersionCheck((yyvsp[0].interm).loc, (yyvsp[0].interm).arraySizes);
         (yyval.interm.type) = (yyvsp[-1].interm.type);
         (yyval.interm.type).qualifier.precision = parseContext.getDefaultPrecision((yyval.interm.type));
         (yyval.interm.type).arraySizes = (yyvsp[0].interm).arraySizes;
     }
-#line 5000 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6108 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 169:
-#line 1299 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 190:
+#line 1501 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm).loc = (yyvsp[-1].lex).loc;
         (yyval.interm).arraySizes = new TArraySizes;
         (yyval.interm).arraySizes->addInnerSize();
     }
-#line 5010 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6118 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 170:
-#line 1304 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 191:
+#line 1506 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm).loc = (yyvsp[-2].lex).loc;
         (yyval.interm).arraySizes = new TArraySizes;
@@ -5019,20 +6127,20 @@
         parseContext.arraySizeCheck((yyvsp[-1].interm.intermTypedNode)->getLoc(), (yyvsp[-1].interm.intermTypedNode), size);
         (yyval.interm).arraySizes->addInnerSize(size);
     }
-#line 5023 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6131 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 171:
-#line 1312 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 192:
+#line 1514 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm) = (yyvsp[-2].interm);
         (yyval.interm).arraySizes->addInnerSize();
     }
-#line 5032 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6140 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 172:
-#line 1316 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 193:
+#line 1518 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm) = (yyvsp[-3].interm);
 
@@ -5040,1945 +6148,3080 @@
         parseContext.arraySizeCheck((yyvsp[-1].interm.intermTypedNode)->getLoc(), (yyvsp[-1].interm.intermTypedNode), size);
         (yyval.interm).arraySizes->addInnerSize(size);
     }
-#line 5044 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6152 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 173:
-#line 1326 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 194:
+#line 1528 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtVoid;
     }
-#line 5053 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6161 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 174:
-#line 1330 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 195:
+#line 1532 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat;
     }
-#line 5062 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6170 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 175:
-#line 1334 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 196:
+#line 1536 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.doubleCheck((yyvsp[0].lex).loc, "double");
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtDouble;
     }
-#line 5072 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6180 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 176:
-#line 1339 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 197:
+#line 1541 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
-#ifdef AMD_EXTENSIONS
-        parseContext.float16Check((yyvsp[0].lex).loc, "half float", parseContext.symbolTable.atBuiltInLevel());
+        parseContext.float16ScalarVectorCheck((yyvsp[0].lex).loc, "float16_t", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat16;
-#endif
     }
-#line 5084 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6190 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 177:
-#line 1346 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 198:
+#line 1546 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+        parseContext.explicitFloat32Check((yyvsp[0].lex).loc, "float32_t", parseContext.symbolTable.atBuiltInLevel());
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtFloat;
+    }
+#line 6200 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 199:
+#line 1551 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+        parseContext.explicitFloat64Check((yyvsp[0].lex).loc, "float64_t", parseContext.symbolTable.atBuiltInLevel());
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtDouble;
+    }
+#line 6210 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 200:
+#line 1556 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtInt;
     }
-#line 5093 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6219 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 178:
-#line 1350 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 201:
+#line 1560 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.fullIntegerCheck((yyvsp[0].lex).loc, "unsigned integer");
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtUint;
     }
-#line 5103 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6229 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 179:
-#line 1355 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 202:
+#line 1565 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+        parseContext.int8ScalarVectorCheck((yyvsp[0].lex).loc, "8-bit signed integer", parseContext.symbolTable.atBuiltInLevel());
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtInt8;
+    }
+#line 6239 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 203:
+#line 1570 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+        parseContext.int8ScalarVectorCheck((yyvsp[0].lex).loc, "8-bit unsigned integer", parseContext.symbolTable.atBuiltInLevel());
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtUint8;
+    }
+#line 6249 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 204:
+#line 1575 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+        parseContext.int16ScalarVectorCheck((yyvsp[0].lex).loc, "16-bit signed integer", parseContext.symbolTable.atBuiltInLevel());
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtInt16;
+    }
+#line 6259 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 205:
+#line 1580 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+        parseContext.int16ScalarVectorCheck((yyvsp[0].lex).loc, "16-bit unsigned integer", parseContext.symbolTable.atBuiltInLevel());
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtUint16;
+    }
+#line 6269 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 206:
+#line 1585 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+        parseContext.explicitInt32Check((yyvsp[0].lex).loc, "32-bit signed integer", parseContext.symbolTable.atBuiltInLevel());
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtInt;
+    }
+#line 6279 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 207:
+#line 1590 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+        parseContext.explicitInt32Check((yyvsp[0].lex).loc, "32-bit unsigned integer", parseContext.symbolTable.atBuiltInLevel());
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtUint;
+    }
+#line 6289 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 208:
+#line 1595 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.int64Check((yyvsp[0].lex).loc, "64-bit integer", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtInt64;
     }
-#line 5113 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6299 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 180:
-#line 1360 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 209:
+#line 1600 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.int64Check((yyvsp[0].lex).loc, "64-bit unsigned integer", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtUint64;
     }
-#line 5123 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
-    break;
-
-  case 181:
-#line 1365 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
-        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
-        (yyval.interm.type).basicType = EbtBool;
-    }
-#line 5132 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
-    break;
-
-  case 182:
-#line 1369 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
-        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
-        (yyval.interm.type).basicType = EbtFloat;
-        (yyval.interm.type).setVector(2);
-    }
-#line 5142 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
-    break;
-
-  case 183:
-#line 1374 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
-        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
-        (yyval.interm.type).basicType = EbtFloat;
-        (yyval.interm.type).setVector(3);
-    }
-#line 5152 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
-    break;
-
-  case 184:
-#line 1379 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
-        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
-        (yyval.interm.type).basicType = EbtFloat;
-        (yyval.interm.type).setVector(4);
-    }
-#line 5162 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
-    break;
-
-  case 185:
-#line 1384 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
-        parseContext.doubleCheck((yyvsp[0].lex).loc, "double vector");
-        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
-        (yyval.interm.type).basicType = EbtDouble;
-        (yyval.interm.type).setVector(2);
-    }
-#line 5173 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
-    break;
-
-  case 186:
-#line 1390 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
-        parseContext.doubleCheck((yyvsp[0].lex).loc, "double vector");
-        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
-        (yyval.interm.type).basicType = EbtDouble;
-        (yyval.interm.type).setVector(3);
-    }
-#line 5184 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
-    break;
-
-  case 187:
-#line 1396 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
-        parseContext.doubleCheck((yyvsp[0].lex).loc, "double vector");
-        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
-        (yyval.interm.type).basicType = EbtDouble;
-        (yyval.interm.type).setVector(4);
-    }
-#line 5195 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
-    break;
-
-  case 188:
-#line 1402 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
-#ifdef AMD_EXTENSIONS
-        parseContext.float16Check((yyvsp[0].lex).loc, "half float vector", parseContext.symbolTable.atBuiltInLevel());
-        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
-        (yyval.interm.type).basicType = EbtFloat16;
-        (yyval.interm.type).setVector(2);
-#endif
-    }
-#line 5208 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
-    break;
-
-  case 189:
-#line 1410 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
-#ifdef AMD_EXTENSIONS
-        parseContext.float16Check((yyvsp[0].lex).loc, "half float vector", parseContext.symbolTable.atBuiltInLevel());
-        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
-        (yyval.interm.type).basicType = EbtFloat16;
-        (yyval.interm.type).setVector(3);
-#endif
-    }
-#line 5221 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
-    break;
-
-  case 190:
-#line 1418 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
-#ifdef AMD_EXTENSIONS
-        parseContext.float16Check((yyvsp[0].lex).loc, "half float vector", parseContext.symbolTable.atBuiltInLevel());
-        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
-        (yyval.interm.type).basicType = EbtFloat16;
-        (yyval.interm.type).setVector(4);
-#endif
-    }
-#line 5234 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
-    break;
-
-  case 191:
-#line 1426 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
-        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
-        (yyval.interm.type).basicType = EbtBool;
-        (yyval.interm.type).setVector(2);
-    }
-#line 5244 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
-    break;
-
-  case 192:
-#line 1431 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
-        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
-        (yyval.interm.type).basicType = EbtBool;
-        (yyval.interm.type).setVector(3);
-    }
-#line 5254 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
-    break;
-
-  case 193:
-#line 1436 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
-        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
-        (yyval.interm.type).basicType = EbtBool;
-        (yyval.interm.type).setVector(4);
-    }
-#line 5264 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
-    break;
-
-  case 194:
-#line 1441 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
-        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
-        (yyval.interm.type).basicType = EbtInt;
-        (yyval.interm.type).setVector(2);
-    }
-#line 5274 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
-    break;
-
-  case 195:
-#line 1446 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
-        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
-        (yyval.interm.type).basicType = EbtInt;
-        (yyval.interm.type).setVector(3);
-    }
-#line 5284 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
-    break;
-
-  case 196:
-#line 1451 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
-        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
-        (yyval.interm.type).basicType = EbtInt;
-        (yyval.interm.type).setVector(4);
-    }
-#line 5294 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
-    break;
-
-  case 197:
-#line 1456 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
-        parseContext.int64Check((yyvsp[0].lex).loc, "64-bit integer vector", parseContext.symbolTable.atBuiltInLevel());
-        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
-        (yyval.interm.type).basicType = EbtInt64;
-        (yyval.interm.type).setVector(2);
-    }
-#line 5305 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
-    break;
-
-  case 198:
-#line 1462 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
-        parseContext.int64Check((yyvsp[0].lex).loc, "64-bit integer vector", parseContext.symbolTable.atBuiltInLevel());
-        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
-        (yyval.interm.type).basicType = EbtInt64;
-        (yyval.interm.type).setVector(3);
-    }
-#line 5316 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
-    break;
-
-  case 199:
-#line 1468 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
-        parseContext.int64Check((yyvsp[0].lex).loc, "64-bit integer vector", parseContext.symbolTable.atBuiltInLevel());
-        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
-        (yyval.interm.type).basicType = EbtInt64;
-        (yyval.interm.type).setVector(4);
-    }
-#line 5327 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
-    break;
-
-  case 200:
-#line 1474 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
-        parseContext.fullIntegerCheck((yyvsp[0].lex).loc, "unsigned integer vector");
-        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
-        (yyval.interm.type).basicType = EbtUint;
-        (yyval.interm.type).setVector(2);
-    }
-#line 5338 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
-    break;
-
-  case 201:
-#line 1480 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
-        parseContext.fullIntegerCheck((yyvsp[0].lex).loc, "unsigned integer vector");
-        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
-        (yyval.interm.type).basicType = EbtUint;
-        (yyval.interm.type).setVector(3);
-    }
-#line 5349 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
-    break;
-
-  case 202:
-#line 1486 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
-        parseContext.fullIntegerCheck((yyvsp[0].lex).loc, "unsigned integer vector");
-        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
-        (yyval.interm.type).basicType = EbtUint;
-        (yyval.interm.type).setVector(4);
-    }
-#line 5360 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
-    break;
-
-  case 203:
-#line 1492 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
-        parseContext.int64Check((yyvsp[0].lex).loc, "64-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel());
-        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
-        (yyval.interm.type).basicType = EbtUint64;
-        (yyval.interm.type).setVector(2);
-    }
-#line 5371 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
-    break;
-
-  case 204:
-#line 1498 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
-        parseContext.int64Check((yyvsp[0].lex).loc, "64-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel());
-        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
-        (yyval.interm.type).basicType = EbtUint64;
-        (yyval.interm.type).setVector(3);
-    }
-#line 5382 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
-    break;
-
-  case 205:
-#line 1504 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
-        parseContext.int64Check((yyvsp[0].lex).loc, "64-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel());
-        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
-        (yyval.interm.type).basicType = EbtUint64;
-        (yyval.interm.type).setVector(4);
-    }
-#line 5393 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
-    break;
-
-  case 206:
-#line 1510 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
-        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
-        (yyval.interm.type).basicType = EbtFloat;
-        (yyval.interm.type).setMatrix(2, 2);
-    }
-#line 5403 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
-    break;
-
-  case 207:
-#line 1515 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
-        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
-        (yyval.interm.type).basicType = EbtFloat;
-        (yyval.interm.type).setMatrix(3, 3);
-    }
-#line 5413 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
-    break;
-
-  case 208:
-#line 1520 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
-        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
-        (yyval.interm.type).basicType = EbtFloat;
-        (yyval.interm.type).setMatrix(4, 4);
-    }
-#line 5423 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
-    break;
-
-  case 209:
-#line 1525 "MachineIndependent/glslang.y" /* yacc.c:1646  */
-    {
-        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
-        (yyval.interm.type).basicType = EbtFloat;
-        (yyval.interm.type).setMatrix(2, 2);
-    }
-#line 5433 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6309 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 210:
-#line 1530 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1605 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
-        (yyval.interm.type).basicType = EbtFloat;
-        (yyval.interm.type).setMatrix(2, 3);
+        (yyval.interm.type).basicType = EbtBool;
     }
-#line 5443 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6318 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 211:
-#line 1535 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1609 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat;
-        (yyval.interm.type).setMatrix(2, 4);
+        (yyval.interm.type).setVector(2);
     }
-#line 5453 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6328 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 212:
-#line 1540 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1614 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat;
-        (yyval.interm.type).setMatrix(3, 2);
+        (yyval.interm.type).setVector(3);
     }
-#line 5463 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6338 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 213:
-#line 1545 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1619 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat;
-        (yyval.interm.type).setMatrix(3, 3);
+        (yyval.interm.type).setVector(4);
     }
-#line 5473 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6348 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 214:
-#line 1550 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1624 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
+        parseContext.doubleCheck((yyvsp[0].lex).loc, "double vector");
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
-        (yyval.interm.type).basicType = EbtFloat;
-        (yyval.interm.type).setMatrix(3, 4);
+        (yyval.interm.type).basicType = EbtDouble;
+        (yyval.interm.type).setVector(2);
     }
-#line 5483 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6359 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 215:
-#line 1555 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1630 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
+        parseContext.doubleCheck((yyvsp[0].lex).loc, "double vector");
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
-        (yyval.interm.type).basicType = EbtFloat;
-        (yyval.interm.type).setMatrix(4, 2);
+        (yyval.interm.type).basicType = EbtDouble;
+        (yyval.interm.type).setVector(3);
     }
-#line 5493 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6370 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 216:
-#line 1560 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1636 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
+        parseContext.doubleCheck((yyvsp[0].lex).loc, "double vector");
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
-        (yyval.interm.type).basicType = EbtFloat;
-        (yyval.interm.type).setMatrix(4, 3);
+        (yyval.interm.type).basicType = EbtDouble;
+        (yyval.interm.type).setVector(4);
     }
-#line 5503 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6381 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 217:
-#line 1565 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1642 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+        parseContext.float16ScalarVectorCheck((yyvsp[0].lex).loc, "half float vector", parseContext.symbolTable.atBuiltInLevel());
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtFloat16;
+        (yyval.interm.type).setVector(2);
+    }
+#line 6392 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 218:
+#line 1648 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+        parseContext.float16ScalarVectorCheck((yyvsp[0].lex).loc, "half float vector", parseContext.symbolTable.atBuiltInLevel());
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtFloat16;
+        (yyval.interm.type).setVector(3);
+    }
+#line 6403 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 219:
+#line 1654 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+        parseContext.float16ScalarVectorCheck((yyvsp[0].lex).loc, "half float vector", parseContext.symbolTable.atBuiltInLevel());
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtFloat16;
+        (yyval.interm.type).setVector(4);
+    }
+#line 6414 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 220:
+#line 1660 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+        parseContext.explicitFloat32Check((yyvsp[0].lex).loc, "float32_t vector", parseContext.symbolTable.atBuiltInLevel());
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtFloat;
+        (yyval.interm.type).setVector(2);
+    }
+#line 6425 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 221:
+#line 1666 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+        parseContext.explicitFloat32Check((yyvsp[0].lex).loc, "float32_t vector", parseContext.symbolTable.atBuiltInLevel());
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtFloat;
+        (yyval.interm.type).setVector(3);
+    }
+#line 6436 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 222:
+#line 1672 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+        parseContext.explicitFloat32Check((yyvsp[0].lex).loc, "float32_t vector", parseContext.symbolTable.atBuiltInLevel());
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtFloat;
+        (yyval.interm.type).setVector(4);
+    }
+#line 6447 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 223:
+#line 1678 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+        parseContext.explicitFloat64Check((yyvsp[0].lex).loc, "float64_t vector", parseContext.symbolTable.atBuiltInLevel());
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtDouble;
+        (yyval.interm.type).setVector(2);
+    }
+#line 6458 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 224:
+#line 1684 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+        parseContext.explicitFloat64Check((yyvsp[0].lex).loc, "float64_t vector", parseContext.symbolTable.atBuiltInLevel());
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtDouble;
+        (yyval.interm.type).setVector(3);
+    }
+#line 6469 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 225:
+#line 1690 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+        parseContext.explicitFloat64Check((yyvsp[0].lex).loc, "float64_t vector", parseContext.symbolTable.atBuiltInLevel());
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtDouble;
+        (yyval.interm.type).setVector(4);
+    }
+#line 6480 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 226:
+#line 1696 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtBool;
+        (yyval.interm.type).setVector(2);
+    }
+#line 6490 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 227:
+#line 1701 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtBool;
+        (yyval.interm.type).setVector(3);
+    }
+#line 6500 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 228:
+#line 1706 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtBool;
+        (yyval.interm.type).setVector(4);
+    }
+#line 6510 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 229:
+#line 1711 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtInt;
+        (yyval.interm.type).setVector(2);
+    }
+#line 6520 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 230:
+#line 1716 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtInt;
+        (yyval.interm.type).setVector(3);
+    }
+#line 6530 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 231:
+#line 1721 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtInt;
+        (yyval.interm.type).setVector(4);
+    }
+#line 6540 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 232:
+#line 1726 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+        parseContext.int8ScalarVectorCheck((yyvsp[0].lex).loc, "8-bit signed integer vector", parseContext.symbolTable.atBuiltInLevel());
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtInt8;
+        (yyval.interm.type).setVector(2);
+    }
+#line 6551 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 233:
+#line 1732 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+        parseContext.int8ScalarVectorCheck((yyvsp[0].lex).loc, "8-bit signed integer vector", parseContext.symbolTable.atBuiltInLevel());
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtInt8;
+        (yyval.interm.type).setVector(3);
+    }
+#line 6562 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 234:
+#line 1738 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+        parseContext.int8ScalarVectorCheck((yyvsp[0].lex).loc, "8-bit signed integer vector", parseContext.symbolTable.atBuiltInLevel());
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtInt8;
+        (yyval.interm.type).setVector(4);
+    }
+#line 6573 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 235:
+#line 1744 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+        parseContext.int16ScalarVectorCheck((yyvsp[0].lex).loc, "16-bit signed integer vector", parseContext.symbolTable.atBuiltInLevel());
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtInt16;
+        (yyval.interm.type).setVector(2);
+    }
+#line 6584 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 236:
+#line 1750 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+        parseContext.int16ScalarVectorCheck((yyvsp[0].lex).loc, "16-bit signed integer vector", parseContext.symbolTable.atBuiltInLevel());
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtInt16;
+        (yyval.interm.type).setVector(3);
+    }
+#line 6595 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 237:
+#line 1756 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+        parseContext.int16ScalarVectorCheck((yyvsp[0].lex).loc, "16-bit signed integer vector", parseContext.symbolTable.atBuiltInLevel());
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtInt16;
+        (yyval.interm.type).setVector(4);
+    }
+#line 6606 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 238:
+#line 1762 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+        parseContext.explicitInt32Check((yyvsp[0].lex).loc, "32-bit signed integer vector", parseContext.symbolTable.atBuiltInLevel());
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtInt;
+        (yyval.interm.type).setVector(2);
+    }
+#line 6617 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 239:
+#line 1768 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+        parseContext.explicitInt32Check((yyvsp[0].lex).loc, "32-bit signed integer vector", parseContext.symbolTable.atBuiltInLevel());
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtInt;
+        (yyval.interm.type).setVector(3);
+    }
+#line 6628 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 240:
+#line 1774 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+        parseContext.explicitInt32Check((yyvsp[0].lex).loc, "32-bit signed integer vector", parseContext.symbolTable.atBuiltInLevel());
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtInt;
+        (yyval.interm.type).setVector(4);
+    }
+#line 6639 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 241:
+#line 1780 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+        parseContext.int64Check((yyvsp[0].lex).loc, "64-bit integer vector", parseContext.symbolTable.atBuiltInLevel());
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtInt64;
+        (yyval.interm.type).setVector(2);
+    }
+#line 6650 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 242:
+#line 1786 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+        parseContext.int64Check((yyvsp[0].lex).loc, "64-bit integer vector", parseContext.symbolTable.atBuiltInLevel());
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtInt64;
+        (yyval.interm.type).setVector(3);
+    }
+#line 6661 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 243:
+#line 1792 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+        parseContext.int64Check((yyvsp[0].lex).loc, "64-bit integer vector", parseContext.symbolTable.atBuiltInLevel());
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtInt64;
+        (yyval.interm.type).setVector(4);
+    }
+#line 6672 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 244:
+#line 1798 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+        parseContext.fullIntegerCheck((yyvsp[0].lex).loc, "unsigned integer vector");
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtUint;
+        (yyval.interm.type).setVector(2);
+    }
+#line 6683 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 245:
+#line 1804 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+        parseContext.fullIntegerCheck((yyvsp[0].lex).loc, "unsigned integer vector");
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtUint;
+        (yyval.interm.type).setVector(3);
+    }
+#line 6694 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 246:
+#line 1810 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+        parseContext.fullIntegerCheck((yyvsp[0].lex).loc, "unsigned integer vector");
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtUint;
+        (yyval.interm.type).setVector(4);
+    }
+#line 6705 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 247:
+#line 1816 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+        parseContext.int8ScalarVectorCheck((yyvsp[0].lex).loc, "8-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel());
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtUint8;
+        (yyval.interm.type).setVector(2);
+    }
+#line 6716 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 248:
+#line 1822 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+        parseContext.int8ScalarVectorCheck((yyvsp[0].lex).loc, "8-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel());
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtUint8;
+        (yyval.interm.type).setVector(3);
+    }
+#line 6727 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 249:
+#line 1828 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+        parseContext.int8ScalarVectorCheck((yyvsp[0].lex).loc, "8-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel());
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtUint8;
+        (yyval.interm.type).setVector(4);
+    }
+#line 6738 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 250:
+#line 1834 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+        parseContext.int16ScalarVectorCheck((yyvsp[0].lex).loc, "16-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel());
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtUint16;
+        (yyval.interm.type).setVector(2);
+    }
+#line 6749 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 251:
+#line 1840 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+        parseContext.int16ScalarVectorCheck((yyvsp[0].lex).loc, "16-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel());
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtUint16;
+        (yyval.interm.type).setVector(3);
+    }
+#line 6760 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 252:
+#line 1846 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+        parseContext.int16ScalarVectorCheck((yyvsp[0].lex).loc, "16-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel());
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtUint16;
+        (yyval.interm.type).setVector(4);
+    }
+#line 6771 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 253:
+#line 1852 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+        parseContext.explicitInt32Check((yyvsp[0].lex).loc, "32-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel());
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtUint;
+        (yyval.interm.type).setVector(2);
+    }
+#line 6782 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 254:
+#line 1858 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+        parseContext.explicitInt32Check((yyvsp[0].lex).loc, "32-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel());
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtUint;
+        (yyval.interm.type).setVector(3);
+    }
+#line 6793 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 255:
+#line 1864 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+        parseContext.explicitInt32Check((yyvsp[0].lex).loc, "32-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel());
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtUint;
+        (yyval.interm.type).setVector(4);
+    }
+#line 6804 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 256:
+#line 1870 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+        parseContext.int64Check((yyvsp[0].lex).loc, "64-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel());
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtUint64;
+        (yyval.interm.type).setVector(2);
+    }
+#line 6815 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 257:
+#line 1876 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+        parseContext.int64Check((yyvsp[0].lex).loc, "64-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel());
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtUint64;
+        (yyval.interm.type).setVector(3);
+    }
+#line 6826 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 258:
+#line 1882 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+        parseContext.int64Check((yyvsp[0].lex).loc, "64-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel());
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtUint64;
+        (yyval.interm.type).setVector(4);
+    }
+#line 6837 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 259:
+#line 1888 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtFloat;
+        (yyval.interm.type).setMatrix(2, 2);
+    }
+#line 6847 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 260:
+#line 1893 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtFloat;
+        (yyval.interm.type).setMatrix(3, 3);
+    }
+#line 6857 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 261:
+#line 1898 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat;
         (yyval.interm.type).setMatrix(4, 4);
     }
-#line 5513 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6867 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 218:
-#line 1570 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 262:
+#line 1903 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtFloat;
+        (yyval.interm.type).setMatrix(2, 2);
+    }
+#line 6877 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 263:
+#line 1908 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtFloat;
+        (yyval.interm.type).setMatrix(2, 3);
+    }
+#line 6887 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 264:
+#line 1913 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtFloat;
+        (yyval.interm.type).setMatrix(2, 4);
+    }
+#line 6897 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 265:
+#line 1918 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtFloat;
+        (yyval.interm.type).setMatrix(3, 2);
+    }
+#line 6907 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 266:
+#line 1923 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtFloat;
+        (yyval.interm.type).setMatrix(3, 3);
+    }
+#line 6917 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 267:
+#line 1928 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtFloat;
+        (yyval.interm.type).setMatrix(3, 4);
+    }
+#line 6927 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 268:
+#line 1933 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtFloat;
+        (yyval.interm.type).setMatrix(4, 2);
+    }
+#line 6937 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 269:
+#line 1938 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtFloat;
+        (yyval.interm.type).setMatrix(4, 3);
+    }
+#line 6947 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 270:
+#line 1943 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtFloat;
+        (yyval.interm.type).setMatrix(4, 4);
+    }
+#line 6957 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 271:
+#line 1948 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.doubleCheck((yyvsp[0].lex).loc, "double matrix");
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtDouble;
         (yyval.interm.type).setMatrix(2, 2);
     }
-#line 5524 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6968 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 219:
-#line 1576 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 272:
+#line 1954 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.doubleCheck((yyvsp[0].lex).loc, "double matrix");
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtDouble;
         (yyval.interm.type).setMatrix(3, 3);
     }
-#line 5535 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6979 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 220:
-#line 1582 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 273:
+#line 1960 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.doubleCheck((yyvsp[0].lex).loc, "double matrix");
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtDouble;
         (yyval.interm.type).setMatrix(4, 4);
     }
-#line 5546 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6990 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 221:
-#line 1588 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 274:
+#line 1966 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.doubleCheck((yyvsp[0].lex).loc, "double matrix");
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtDouble;
         (yyval.interm.type).setMatrix(2, 2);
     }
-#line 5557 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7001 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 222:
-#line 1594 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 275:
+#line 1972 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.doubleCheck((yyvsp[0].lex).loc, "double matrix");
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtDouble;
         (yyval.interm.type).setMatrix(2, 3);
     }
-#line 5568 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7012 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 223:
-#line 1600 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 276:
+#line 1978 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.doubleCheck((yyvsp[0].lex).loc, "double matrix");
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtDouble;
         (yyval.interm.type).setMatrix(2, 4);
     }
-#line 5579 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7023 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 224:
-#line 1606 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 277:
+#line 1984 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.doubleCheck((yyvsp[0].lex).loc, "double matrix");
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtDouble;
         (yyval.interm.type).setMatrix(3, 2);
     }
-#line 5590 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7034 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 225:
-#line 1612 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 278:
+#line 1990 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.doubleCheck((yyvsp[0].lex).loc, "double matrix");
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtDouble;
         (yyval.interm.type).setMatrix(3, 3);
     }
-#line 5601 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7045 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 226:
-#line 1618 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 279:
+#line 1996 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.doubleCheck((yyvsp[0].lex).loc, "double matrix");
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtDouble;
         (yyval.interm.type).setMatrix(3, 4);
     }
-#line 5612 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7056 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 227:
-#line 1624 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 280:
+#line 2002 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.doubleCheck((yyvsp[0].lex).loc, "double matrix");
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtDouble;
         (yyval.interm.type).setMatrix(4, 2);
     }
-#line 5623 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7067 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 228:
-#line 1630 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 281:
+#line 2008 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.doubleCheck((yyvsp[0].lex).loc, "double matrix");
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtDouble;
         (yyval.interm.type).setMatrix(4, 3);
     }
-#line 5634 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7078 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 229:
-#line 1636 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 282:
+#line 2014 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.doubleCheck((yyvsp[0].lex).loc, "double matrix");
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtDouble;
         (yyval.interm.type).setMatrix(4, 4);
     }
-#line 5645 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7089 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 230:
-#line 1642 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 283:
+#line 2020 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
-#ifdef AMD_EXTENSIONS
         parseContext.float16Check((yyvsp[0].lex).loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat16;
         (yyval.interm.type).setMatrix(2, 2);
-#endif
     }
-#line 5658 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7100 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 231:
-#line 1650 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 284:
+#line 2026 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
-#ifdef AMD_EXTENSIONS
         parseContext.float16Check((yyvsp[0].lex).loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat16;
         (yyval.interm.type).setMatrix(3, 3);
-#endif
     }
-#line 5671 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7111 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 232:
-#line 1658 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 285:
+#line 2032 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
-#ifdef AMD_EXTENSIONS
         parseContext.float16Check((yyvsp[0].lex).loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat16;
         (yyval.interm.type).setMatrix(4, 4);
-#endif
     }
-#line 5684 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7122 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 233:
-#line 1666 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 286:
+#line 2038 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
-#ifdef AMD_EXTENSIONS
         parseContext.float16Check((yyvsp[0].lex).loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat16;
         (yyval.interm.type).setMatrix(2, 2);
-#endif
     }
-#line 5697 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7133 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 234:
-#line 1674 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 287:
+#line 2044 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
-#ifdef AMD_EXTENSIONS
         parseContext.float16Check((yyvsp[0].lex).loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat16;
         (yyval.interm.type).setMatrix(2, 3);
-#endif
     }
-#line 5710 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7144 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 235:
-#line 1682 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 288:
+#line 2050 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
-#ifdef AMD_EXTENSIONS
         parseContext.float16Check((yyvsp[0].lex).loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat16;
         (yyval.interm.type).setMatrix(2, 4);
-#endif
     }
-#line 5723 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7155 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 236:
-#line 1690 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 289:
+#line 2056 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
-#ifdef AMD_EXTENSIONS
         parseContext.float16Check((yyvsp[0].lex).loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat16;
         (yyval.interm.type).setMatrix(3, 2);
-#endif
     }
-#line 5736 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7166 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 237:
-#line 1698 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 290:
+#line 2062 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
-#ifdef AMD_EXTENSIONS
         parseContext.float16Check((yyvsp[0].lex).loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat16;
         (yyval.interm.type).setMatrix(3, 3);
-#endif
     }
-#line 5749 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7177 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 238:
-#line 1706 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 291:
+#line 2068 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
-#ifdef AMD_EXTENSIONS
         parseContext.float16Check((yyvsp[0].lex).loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat16;
         (yyval.interm.type).setMatrix(3, 4);
-#endif
     }
-#line 5762 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7188 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 239:
-#line 1714 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 292:
+#line 2074 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
-#ifdef AMD_EXTENSIONS
         parseContext.float16Check((yyvsp[0].lex).loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat16;
         (yyval.interm.type).setMatrix(4, 2);
-#endif
     }
-#line 5775 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7199 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 240:
-#line 1722 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 293:
+#line 2080 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
-#ifdef AMD_EXTENSIONS
         parseContext.float16Check((yyvsp[0].lex).loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat16;
         (yyval.interm.type).setMatrix(4, 3);
-#endif
     }
-#line 5788 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7210 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 241:
-#line 1730 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 294:
+#line 2086 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
-#ifdef AMD_EXTENSIONS
         parseContext.float16Check((yyvsp[0].lex).loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat16;
         (yyval.interm.type).setMatrix(4, 4);
-#endif
     }
-#line 5801 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7221 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 242:
-#line 1738 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 295:
+#line 2092 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+        parseContext.explicitFloat32Check((yyvsp[0].lex).loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel());
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtFloat;
+        (yyval.interm.type).setMatrix(2, 2);
+    }
+#line 7232 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 296:
+#line 2098 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+        parseContext.explicitFloat32Check((yyvsp[0].lex).loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel());
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtFloat;
+        (yyval.interm.type).setMatrix(3, 3);
+    }
+#line 7243 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 297:
+#line 2104 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+        parseContext.explicitFloat32Check((yyvsp[0].lex).loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel());
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtFloat;
+        (yyval.interm.type).setMatrix(4, 4);
+    }
+#line 7254 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 298:
+#line 2110 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+        parseContext.explicitFloat32Check((yyvsp[0].lex).loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel());
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtFloat;
+        (yyval.interm.type).setMatrix(2, 2);
+    }
+#line 7265 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 299:
+#line 2116 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+        parseContext.explicitFloat32Check((yyvsp[0].lex).loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel());
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtFloat;
+        (yyval.interm.type).setMatrix(2, 3);
+    }
+#line 7276 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 300:
+#line 2122 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+        parseContext.explicitFloat32Check((yyvsp[0].lex).loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel());
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtFloat;
+        (yyval.interm.type).setMatrix(2, 4);
+    }
+#line 7287 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 301:
+#line 2128 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+        parseContext.explicitFloat32Check((yyvsp[0].lex).loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel());
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtFloat;
+        (yyval.interm.type).setMatrix(3, 2);
+    }
+#line 7298 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 302:
+#line 2134 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+        parseContext.explicitFloat32Check((yyvsp[0].lex).loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel());
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtFloat;
+        (yyval.interm.type).setMatrix(3, 3);
+    }
+#line 7309 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 303:
+#line 2140 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+        parseContext.explicitFloat32Check((yyvsp[0].lex).loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel());
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtFloat;
+        (yyval.interm.type).setMatrix(3, 4);
+    }
+#line 7320 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 304:
+#line 2146 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+        parseContext.explicitFloat32Check((yyvsp[0].lex).loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel());
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtFloat;
+        (yyval.interm.type).setMatrix(4, 2);
+    }
+#line 7331 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 305:
+#line 2152 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+        parseContext.explicitFloat32Check((yyvsp[0].lex).loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel());
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtFloat;
+        (yyval.interm.type).setMatrix(4, 3);
+    }
+#line 7342 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 306:
+#line 2158 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+        parseContext.explicitFloat32Check((yyvsp[0].lex).loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel());
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtFloat;
+        (yyval.interm.type).setMatrix(4, 4);
+    }
+#line 7353 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 307:
+#line 2164 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+        parseContext.explicitFloat64Check((yyvsp[0].lex).loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel());
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtDouble;
+        (yyval.interm.type).setMatrix(2, 2);
+    }
+#line 7364 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 308:
+#line 2170 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+        parseContext.explicitFloat64Check((yyvsp[0].lex).loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel());
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtDouble;
+        (yyval.interm.type).setMatrix(3, 3);
+    }
+#line 7375 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 309:
+#line 2176 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+        parseContext.explicitFloat64Check((yyvsp[0].lex).loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel());
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtDouble;
+        (yyval.interm.type).setMatrix(4, 4);
+    }
+#line 7386 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 310:
+#line 2182 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+        parseContext.explicitFloat64Check((yyvsp[0].lex).loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel());
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtDouble;
+        (yyval.interm.type).setMatrix(2, 2);
+    }
+#line 7397 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 311:
+#line 2188 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+        parseContext.explicitFloat64Check((yyvsp[0].lex).loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel());
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtDouble;
+        (yyval.interm.type).setMatrix(2, 3);
+    }
+#line 7408 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 312:
+#line 2194 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+        parseContext.explicitFloat64Check((yyvsp[0].lex).loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel());
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtDouble;
+        (yyval.interm.type).setMatrix(2, 4);
+    }
+#line 7419 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 313:
+#line 2200 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+        parseContext.explicitFloat64Check((yyvsp[0].lex).loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel());
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtDouble;
+        (yyval.interm.type).setMatrix(3, 2);
+    }
+#line 7430 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 314:
+#line 2206 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+        parseContext.explicitFloat64Check((yyvsp[0].lex).loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel());
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtDouble;
+        (yyval.interm.type).setMatrix(3, 3);
+    }
+#line 7441 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 315:
+#line 2212 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+        parseContext.explicitFloat64Check((yyvsp[0].lex).loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel());
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtDouble;
+        (yyval.interm.type).setMatrix(3, 4);
+    }
+#line 7452 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 316:
+#line 2218 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+        parseContext.explicitFloat64Check((yyvsp[0].lex).loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel());
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtDouble;
+        (yyval.interm.type).setMatrix(4, 2);
+    }
+#line 7463 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 317:
+#line 2224 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+        parseContext.explicitFloat64Check((yyvsp[0].lex).loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel());
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtDouble;
+        (yyval.interm.type).setMatrix(4, 3);
+    }
+#line 7474 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 318:
+#line 2230 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+        parseContext.explicitFloat64Check((yyvsp[0].lex).loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel());
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtDouble;
+        (yyval.interm.type).setMatrix(4, 4);
+    }
+#line 7485 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 319:
+#line 2236 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+#ifdef NV_EXTENSIONS
+       (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+       (yyval.interm.type).basicType = EbtAccStructNV;
+#endif
+    }
+#line 7496 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 320:
+#line 2242 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.vulkanRemoved((yyvsp[0].lex).loc, "atomic counter types");
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtAtomicUint;
     }
-#line 5811 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7506 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 243:
-#line 1743 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 321:
+#line 2247 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtFloat, Esd1D);
     }
-#line 5821 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7516 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 244:
-#line 1748 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 322:
+#line 2252 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtFloat, Esd2D);
     }
-#line 5831 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7526 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 245:
-#line 1753 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 323:
+#line 2257 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtFloat, Esd3D);
     }
-#line 5841 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7536 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 246:
-#line 1758 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 324:
+#line 2262 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtFloat, EsdCube);
     }
-#line 5851 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7546 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 247:
-#line 1763 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 325:
+#line 2267 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtFloat, Esd1D, false, true);
     }
-#line 5861 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7556 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 248:
-#line 1768 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 326:
+#line 2272 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtFloat, Esd2D, false, true);
     }
-#line 5871 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7566 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 249:
-#line 1773 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 327:
+#line 2277 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtFloat, EsdCube, false, true);
     }
-#line 5881 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7576 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 250:
-#line 1778 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 328:
+#line 2282 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtFloat, Esd1D, true);
     }
-#line 5891 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7586 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 251:
-#line 1783 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 329:
+#line 2287 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtFloat, Esd2D, true);
     }
-#line 5901 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7596 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 252:
-#line 1788 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 330:
+#line 2292 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtFloat, Esd1D, true, true);
     }
-#line 5911 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7606 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 253:
-#line 1793 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 331:
+#line 2297 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtFloat, Esd2D, true, true);
     }
-#line 5921 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7616 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 254:
-#line 1798 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 332:
+#line 2302 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtFloat, EsdCube, true);
     }
-#line 5931 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7626 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 255:
-#line 1803 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 333:
+#line 2307 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtFloat, EsdCube, true, true);
     }
-#line 5941 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7636 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 256:
-#line 1808 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 334:
+#line 2312 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+#ifdef AMD_EXTENSIONS
+        parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel());
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtSampler;
+        (yyval.interm.type).sampler.set(EbtFloat16, Esd1D);
+#endif
+    }
+#line 7649 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 335:
+#line 2320 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+#ifdef AMD_EXTENSIONS
+        parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel());
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtSampler;
+        (yyval.interm.type).sampler.set(EbtFloat16, Esd2D);
+#endif
+    }
+#line 7662 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 336:
+#line 2328 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+#ifdef AMD_EXTENSIONS
+        parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel());
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtSampler;
+        (yyval.interm.type).sampler.set(EbtFloat16, Esd3D);
+#endif
+    }
+#line 7675 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 337:
+#line 2336 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+#ifdef AMD_EXTENSIONS
+        parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel());
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtSampler;
+        (yyval.interm.type).sampler.set(EbtFloat16, EsdCube);
+#endif
+    }
+#line 7688 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 338:
+#line 2344 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+#ifdef AMD_EXTENSIONS
+        parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel());
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtSampler;
+        (yyval.interm.type).sampler.set(EbtFloat16, Esd1D, false, true);
+#endif
+    }
+#line 7701 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 339:
+#line 2352 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+#ifdef AMD_EXTENSIONS
+        parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel());
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtSampler;
+        (yyval.interm.type).sampler.set(EbtFloat16, Esd2D, false, true);
+#endif
+    }
+#line 7714 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 340:
+#line 2360 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+#ifdef AMD_EXTENSIONS
+        parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel());
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtSampler;
+        (yyval.interm.type).sampler.set(EbtFloat16, EsdCube, false, true);
+#endif
+    }
+#line 7727 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 341:
+#line 2368 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+#ifdef AMD_EXTENSIONS
+        parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel());
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtSampler;
+        (yyval.interm.type).sampler.set(EbtFloat16, Esd1D, true);
+#endif
+    }
+#line 7740 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 342:
+#line 2376 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+#ifdef AMD_EXTENSIONS
+        parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel());
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtSampler;
+        (yyval.interm.type).sampler.set(EbtFloat16, Esd2D, true);
+#endif
+    }
+#line 7753 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 343:
+#line 2384 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+#ifdef AMD_EXTENSIONS
+        parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel());
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtSampler;
+        (yyval.interm.type).sampler.set(EbtFloat16, Esd1D, true, true);
+#endif
+    }
+#line 7766 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 344:
+#line 2392 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+#ifdef AMD_EXTENSIONS
+        parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel());
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtSampler;
+        (yyval.interm.type).sampler.set(EbtFloat16, Esd2D, true, true);
+#endif
+    }
+#line 7779 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 345:
+#line 2400 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+#ifdef AMD_EXTENSIONS
+        parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel());
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtSampler;
+        (yyval.interm.type).sampler.set(EbtFloat16, EsdCube, true);
+#endif
+    }
+#line 7792 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 346:
+#line 2408 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+#ifdef AMD_EXTENSIONS
+        parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel());
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtSampler;
+        (yyval.interm.type).sampler.set(EbtFloat16, EsdCube, true, true);
+#endif
+    }
+#line 7805 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 347:
+#line 2416 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtInt, Esd1D);
     }
-#line 5951 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7815 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 257:
-#line 1813 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 348:
+#line 2421 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtInt, Esd2D);
     }
-#line 5961 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7825 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 258:
-#line 1818 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 349:
+#line 2426 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtInt, Esd3D);
     }
-#line 5971 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7835 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 259:
-#line 1823 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 350:
+#line 2431 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtInt, EsdCube);
     }
-#line 5981 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7845 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 260:
-#line 1828 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 351:
+#line 2436 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtInt, Esd1D, true);
     }
-#line 5991 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7855 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 261:
-#line 1833 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 352:
+#line 2441 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtInt, Esd2D, true);
     }
-#line 6001 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7865 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 262:
-#line 1838 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 353:
+#line 2446 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtInt, EsdCube, true);
     }
-#line 6011 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7875 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 263:
-#line 1843 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 354:
+#line 2451 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtUint, Esd1D);
     }
-#line 6021 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7885 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 264:
-#line 1848 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 355:
+#line 2456 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtUint, Esd2D);
     }
-#line 6031 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7895 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 265:
-#line 1853 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 356:
+#line 2461 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtUint, Esd3D);
     }
-#line 6041 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7905 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 266:
-#line 1858 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 357:
+#line 2466 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtUint, EsdCube);
     }
-#line 6051 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7915 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 267:
-#line 1863 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 358:
+#line 2471 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtUint, Esd1D, true);
     }
-#line 6061 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7925 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 268:
-#line 1868 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 359:
+#line 2476 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtUint, Esd2D, true);
     }
-#line 6071 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7935 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 269:
-#line 1873 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 360:
+#line 2481 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtUint, EsdCube, true);
     }
-#line 6081 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7945 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 270:
-#line 1878 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 361:
+#line 2486 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtFloat, EsdRect);
     }
-#line 6091 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7955 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 271:
-#line 1883 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 362:
+#line 2491 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtFloat, EsdRect, false, true);
     }
-#line 6101 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7965 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 272:
-#line 1888 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 363:
+#line 2496 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+#ifdef AMD_EXTENSIONS
+        parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel());
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtSampler;
+        (yyval.interm.type).sampler.set(EbtFloat16, EsdRect);
+#endif
+    }
+#line 7978 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 364:
+#line 2504 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+#ifdef AMD_EXTENSIONS
+        parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel());
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtSampler;
+        (yyval.interm.type).sampler.set(EbtFloat16, EsdRect, false, true);
+#endif
+    }
+#line 7991 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 365:
+#line 2512 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtInt, EsdRect);
     }
-#line 6111 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8001 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 273:
-#line 1893 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 366:
+#line 2517 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtUint, EsdRect);
     }
-#line 6121 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8011 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 274:
-#line 1898 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 367:
+#line 2522 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtFloat, EsdBuffer);
     }
-#line 6131 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8021 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 275:
-#line 1903 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 368:
+#line 2527 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+#ifdef AMD_EXTENSIONS
+        parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel());
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtSampler;
+        (yyval.interm.type).sampler.set(EbtFloat16, EsdBuffer);
+#endif
+    }
+#line 8034 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 369:
+#line 2535 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtInt, EsdBuffer);
     }
-#line 6141 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8044 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 276:
-#line 1908 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 370:
+#line 2540 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtUint, EsdBuffer);
     }
-#line 6151 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8054 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 277:
-#line 1913 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 371:
+#line 2545 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtFloat, Esd2D, false, false, true);
     }
-#line 6161 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8064 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 278:
-#line 1918 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 372:
+#line 2550 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+#ifdef AMD_EXTENSIONS
+        parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel());
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtSampler;
+        (yyval.interm.type).sampler.set(EbtFloat16, Esd2D, false, false, true);
+#endif
+    }
+#line 8077 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 373:
+#line 2558 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtInt, Esd2D, false, false, true);
     }
-#line 6171 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8087 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 279:
-#line 1923 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 374:
+#line 2563 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtUint, Esd2D, false, false, true);
     }
-#line 6181 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8097 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 280:
-#line 1928 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 375:
+#line 2568 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtFloat, Esd2D, true, false, true);
     }
-#line 6191 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8107 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 281:
-#line 1933 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 376:
+#line 2573 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+#ifdef AMD_EXTENSIONS
+        parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel());
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtSampler;
+        (yyval.interm.type).sampler.set(EbtFloat16, Esd2D, true, false, true);
+#endif
+    }
+#line 8120 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 377:
+#line 2581 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtInt, Esd2D, true, false, true);
     }
-#line 6201 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8130 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 282:
-#line 1938 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 378:
+#line 2586 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtUint, Esd2D, true, false, true);
     }
-#line 6211 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8140 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 283:
-#line 1943 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 379:
+#line 2591 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setPureSampler(false);
     }
-#line 6221 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8150 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 284:
-#line 1948 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 380:
+#line 2596 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setPureSampler(true);
     }
-#line 6231 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8160 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 285:
-#line 1953 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 381:
+#line 2601 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtFloat, Esd1D);
     }
-#line 6241 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8170 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 286:
-#line 1958 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 382:
+#line 2606 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+#ifdef AMD_EXTENSIONS
+        parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float texture", parseContext.symbolTable.atBuiltInLevel());
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtSampler;
+        (yyval.interm.type).sampler.setTexture(EbtFloat16, Esd1D);
+#endif
+    }
+#line 8183 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 383:
+#line 2614 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtFloat, Esd2D);
     }
-#line 6251 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8193 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 287:
-#line 1963 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 384:
+#line 2619 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+#ifdef AMD_EXTENSIONS
+        parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float texture", parseContext.symbolTable.atBuiltInLevel());
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtSampler;
+        (yyval.interm.type).sampler.setTexture(EbtFloat16, Esd2D);
+#endif
+    }
+#line 8206 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 385:
+#line 2627 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtFloat, Esd3D);
     }
-#line 6261 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8216 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 288:
-#line 1968 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 386:
+#line 2632 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+#ifdef AMD_EXTENSIONS
+        parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float texture", parseContext.symbolTable.atBuiltInLevel());
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtSampler;
+        (yyval.interm.type).sampler.setTexture(EbtFloat16, Esd3D);
+#endif
+    }
+#line 8229 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 387:
+#line 2640 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtFloat, EsdCube);
     }
-#line 6271 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8239 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 289:
-#line 1973 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 388:
+#line 2645 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+#ifdef AMD_EXTENSIONS
+        parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float texture", parseContext.symbolTable.atBuiltInLevel());
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtSampler;
+        (yyval.interm.type).sampler.setTexture(EbtFloat16, EsdCube);
+#endif
+    }
+#line 8252 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 389:
+#line 2653 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtFloat, Esd1D, true);
     }
-#line 6281 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8262 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 290:
-#line 1978 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 390:
+#line 2658 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+#ifdef AMD_EXTENSIONS
+        parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float texture", parseContext.symbolTable.atBuiltInLevel());
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtSampler;
+        (yyval.interm.type).sampler.setTexture(EbtFloat16, Esd1D, true);
+#endif
+    }
+#line 8275 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 391:
+#line 2666 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtFloat, Esd2D, true);
     }
-#line 6291 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8285 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 291:
-#line 1983 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 392:
+#line 2671 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+#ifdef AMD_EXTENSIONS
+        parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float texture", parseContext.symbolTable.atBuiltInLevel());
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtSampler;
+        (yyval.interm.type).sampler.setTexture(EbtFloat16, Esd2D, true);
+#endif
+    }
+#line 8298 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 393:
+#line 2679 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtFloat, EsdCube, true);
     }
-#line 6301 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8308 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 292:
-#line 1988 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 394:
+#line 2684 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+#ifdef AMD_EXTENSIONS
+        parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float texture", parseContext.symbolTable.atBuiltInLevel());
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtSampler;
+        (yyval.interm.type).sampler.setTexture(EbtFloat16, EsdCube, true);
+#endif
+    }
+#line 8321 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 395:
+#line 2692 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtInt, Esd1D);
     }
-#line 6311 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8331 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 293:
-#line 1993 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 396:
+#line 2697 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtInt, Esd2D);
     }
-#line 6321 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8341 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 294:
-#line 1998 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 397:
+#line 2702 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtInt, Esd3D);
     }
-#line 6331 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8351 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 295:
-#line 2003 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 398:
+#line 2707 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtInt, EsdCube);
     }
-#line 6341 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8361 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 296:
-#line 2008 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 399:
+#line 2712 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtInt, Esd1D, true);
     }
-#line 6351 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8371 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 297:
-#line 2013 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 400:
+#line 2717 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtInt, Esd2D, true);
     }
-#line 6361 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8381 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 298:
-#line 2018 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 401:
+#line 2722 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtInt, EsdCube, true);
     }
-#line 6371 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8391 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 299:
-#line 2023 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 402:
+#line 2727 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtUint, Esd1D);
     }
-#line 6381 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8401 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 300:
-#line 2028 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 403:
+#line 2732 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtUint, Esd2D);
     }
-#line 6391 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8411 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 301:
-#line 2033 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 404:
+#line 2737 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtUint, Esd3D);
     }
-#line 6401 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8421 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 302:
-#line 2038 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 405:
+#line 2742 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtUint, EsdCube);
     }
-#line 6411 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8431 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 303:
-#line 2043 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 406:
+#line 2747 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtUint, Esd1D, true);
     }
-#line 6421 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8441 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 304:
-#line 2048 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 407:
+#line 2752 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtUint, Esd2D, true);
     }
-#line 6431 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8451 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 305:
-#line 2053 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 408:
+#line 2757 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtUint, EsdCube, true);
     }
-#line 6441 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8461 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 306:
-#line 2058 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 409:
+#line 2762 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtFloat, EsdRect);
     }
-#line 6451 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8471 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 307:
-#line 2063 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 410:
+#line 2767 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+#ifdef AMD_EXTENSIONS
+        parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float texture", parseContext.symbolTable.atBuiltInLevel());
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtSampler;
+        (yyval.interm.type).sampler.setTexture(EbtFloat16, EsdRect);
+#endif
+    }
+#line 8484 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 411:
+#line 2775 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtInt, EsdRect);
     }
-#line 6461 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8494 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 308:
-#line 2068 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 412:
+#line 2780 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtUint, EsdRect);
     }
-#line 6471 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8504 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 309:
-#line 2073 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 413:
+#line 2785 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtFloat, EsdBuffer);
     }
-#line 6481 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8514 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 310:
-#line 2078 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 414:
+#line 2790 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+#ifdef AMD_EXTENSIONS
+        parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float texture", parseContext.symbolTable.atBuiltInLevel());
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtSampler;
+        (yyval.interm.type).sampler.setTexture(EbtFloat16, EsdBuffer);
+#endif
+    }
+#line 8527 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 415:
+#line 2798 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtInt, EsdBuffer);
     }
-#line 6491 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8537 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 311:
-#line 2083 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 416:
+#line 2803 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtUint, EsdBuffer);
     }
-#line 6501 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8547 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 312:
-#line 2088 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 417:
+#line 2808 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtFloat, Esd2D, false, false, true);
     }
-#line 6511 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8557 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 313:
-#line 2093 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 418:
+#line 2813 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+#ifdef AMD_EXTENSIONS
+        parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float texture", parseContext.symbolTable.atBuiltInLevel());
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtSampler;
+        (yyval.interm.type).sampler.setTexture(EbtFloat16, Esd2D, false, false, true);
+#endif
+    }
+#line 8570 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 419:
+#line 2821 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtInt, Esd2D, false, false, true);
     }
-#line 6521 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8580 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 314:
-#line 2098 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 420:
+#line 2826 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtUint, Esd2D, false, false, true);
     }
-#line 6531 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8590 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 315:
-#line 2103 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 421:
+#line 2831 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtFloat, Esd2D, true, false, true);
     }
-#line 6541 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8600 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 316:
-#line 2108 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 422:
+#line 2836 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+#ifdef AMD_EXTENSIONS
+        parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float texture", parseContext.symbolTable.atBuiltInLevel());
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtSampler;
+        (yyval.interm.type).sampler.setTexture(EbtFloat16, Esd2D, true, false, true);
+#endif
+    }
+#line 8613 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 423:
+#line 2844 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtInt, Esd2D, true, false, true);
     }
-#line 6551 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8623 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 317:
-#line 2113 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 424:
+#line 2849 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtUint, Esd2D, true, false, true);
     }
-#line 6561 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8633 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 318:
-#line 2118 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 425:
+#line 2854 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtFloat, Esd1D);
     }
-#line 6571 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8643 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 319:
-#line 2123 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 426:
+#line 2859 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+#ifdef AMD_EXTENSIONS
+        parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float image", parseContext.symbolTable.atBuiltInLevel());
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtSampler;
+        (yyval.interm.type).sampler.setImage(EbtFloat16, Esd1D);
+#endif
+    }
+#line 8656 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 427:
+#line 2867 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtInt, Esd1D);
     }
-#line 6581 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8666 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 320:
-#line 2128 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 428:
+#line 2872 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtUint, Esd1D);
     }
-#line 6591 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8676 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 321:
-#line 2133 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 429:
+#line 2877 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtFloat, Esd2D);
     }
-#line 6601 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8686 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 322:
-#line 2138 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 430:
+#line 2882 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+#ifdef AMD_EXTENSIONS
+        parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float image", parseContext.symbolTable.atBuiltInLevel());
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtSampler;
+        (yyval.interm.type).sampler.setImage(EbtFloat16, Esd2D);
+#endif
+    }
+#line 8699 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 431:
+#line 2890 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtInt, Esd2D);
     }
-#line 6611 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8709 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 323:
-#line 2143 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 432:
+#line 2895 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtUint, Esd2D);
     }
-#line 6621 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8719 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 324:
-#line 2148 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 433:
+#line 2900 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtFloat, Esd3D);
     }
-#line 6631 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8729 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 325:
-#line 2153 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 434:
+#line 2905 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+#ifdef AMD_EXTENSIONS
+        parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float image", parseContext.symbolTable.atBuiltInLevel());
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtSampler;
+        (yyval.interm.type).sampler.setImage(EbtFloat16, Esd3D);
+#endif
+    }
+#line 8742 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 435:
+#line 2913 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtInt, Esd3D);
     }
-#line 6641 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8752 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 326:
-#line 2158 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 436:
+#line 2918 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtUint, Esd3D);
     }
-#line 6651 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8762 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 327:
-#line 2163 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 437:
+#line 2923 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtFloat, EsdRect);
     }
-#line 6661 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8772 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 328:
-#line 2168 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 438:
+#line 2928 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+#ifdef AMD_EXTENSIONS
+        parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float image", parseContext.symbolTable.atBuiltInLevel());
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtSampler;
+        (yyval.interm.type).sampler.setImage(EbtFloat16, EsdRect);
+#endif
+    }
+#line 8785 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 439:
+#line 2936 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtInt, EsdRect);
     }
-#line 6671 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8795 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 329:
-#line 2173 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 440:
+#line 2941 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtUint, EsdRect);
     }
-#line 6681 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8805 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 330:
-#line 2178 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 441:
+#line 2946 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtFloat, EsdCube);
     }
-#line 6691 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8815 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 331:
-#line 2183 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 442:
+#line 2951 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+#ifdef AMD_EXTENSIONS
+        parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float image", parseContext.symbolTable.atBuiltInLevel());
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtSampler;
+        (yyval.interm.type).sampler.setImage(EbtFloat16, EsdCube);
+#endif
+    }
+#line 8828 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 443:
+#line 2959 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtInt, EsdCube);
     }
-#line 6701 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8838 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 332:
-#line 2188 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 444:
+#line 2964 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtUint, EsdCube);
     }
-#line 6711 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8848 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 333:
-#line 2193 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 445:
+#line 2969 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtFloat, EsdBuffer);
     }
-#line 6721 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8858 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 334:
-#line 2198 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 446:
+#line 2974 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+#ifdef AMD_EXTENSIONS
+        parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float image", parseContext.symbolTable.atBuiltInLevel());
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtSampler;
+        (yyval.interm.type).sampler.setImage(EbtFloat16, EsdBuffer);
+#endif
+    }
+#line 8871 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 447:
+#line 2982 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtInt, EsdBuffer);
     }
-#line 6731 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8881 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 335:
-#line 2203 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 448:
+#line 2987 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtUint, EsdBuffer);
     }
-#line 6741 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8891 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 336:
-#line 2208 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 449:
+#line 2992 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtFloat, Esd1D, true);
     }
-#line 6751 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8901 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 337:
-#line 2213 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 450:
+#line 2997 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+#ifdef AMD_EXTENSIONS
+        parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float image", parseContext.symbolTable.atBuiltInLevel());
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtSampler;
+        (yyval.interm.type).sampler.setImage(EbtFloat16, Esd1D, true);
+#endif
+    }
+#line 8914 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 451:
+#line 3005 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtInt, Esd1D, true);
     }
-#line 6761 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8924 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 338:
-#line 2218 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 452:
+#line 3010 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtUint, Esd1D, true);
     }
-#line 6771 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8934 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 339:
-#line 2223 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 453:
+#line 3015 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtFloat, Esd2D, true);
     }
-#line 6781 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8944 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 340:
-#line 2228 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 454:
+#line 3020 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+#ifdef AMD_EXTENSIONS
+        parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float image", parseContext.symbolTable.atBuiltInLevel());
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtSampler;
+        (yyval.interm.type).sampler.setImage(EbtFloat16, Esd2D, true);
+#endif
+    }
+#line 8957 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 455:
+#line 3028 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtInt, Esd2D, true);
     }
-#line 6791 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8967 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 341:
-#line 2233 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 456:
+#line 3033 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtUint, Esd2D, true);
     }
-#line 6801 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8977 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 342:
-#line 2238 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 457:
+#line 3038 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtFloat, EsdCube, true);
     }
-#line 6811 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8987 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 343:
-#line 2243 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 458:
+#line 3043 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+#ifdef AMD_EXTENSIONS
+        parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float image", parseContext.symbolTable.atBuiltInLevel());
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtSampler;
+        (yyval.interm.type).sampler.setImage(EbtFloat16, EsdCube, true);
+#endif
+    }
+#line 9000 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 459:
+#line 3051 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtInt, EsdCube, true);
     }
-#line 6821 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9010 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 344:
-#line 2248 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 460:
+#line 3056 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtUint, EsdCube, true);
     }
-#line 6831 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9020 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 345:
-#line 2253 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 461:
+#line 3061 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtFloat, Esd2D, false, false, true);
     }
-#line 6841 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9030 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 346:
-#line 2258 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 462:
+#line 3066 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+#ifdef AMD_EXTENSIONS
+        parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float image", parseContext.symbolTable.atBuiltInLevel());
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtSampler;
+        (yyval.interm.type).sampler.setImage(EbtFloat16, Esd2D, false, false, true);
+#endif
+    }
+#line 9043 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 463:
+#line 3074 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtInt, Esd2D, false, false, true);
     }
-#line 6851 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9053 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 347:
-#line 2263 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 464:
+#line 3079 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtUint, Esd2D, false, false, true);
     }
-#line 6861 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9063 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 348:
-#line 2268 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 465:
+#line 3084 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtFloat, Esd2D, true, false, true);
     }
-#line 6871 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9073 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 349:
-#line 2273 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 466:
+#line 3089 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+#ifdef AMD_EXTENSIONS
+        parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float image", parseContext.symbolTable.atBuiltInLevel());
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtSampler;
+        (yyval.interm.type).sampler.setImage(EbtFloat16, Esd2D, true, false, true);
+#endif
+    }
+#line 9086 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 467:
+#line 3097 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtInt, Esd2D, true, false, true);
     }
-#line 6881 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9096 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 350:
-#line 2278 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 468:
+#line 3102 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtUint, Esd2D, true, false, true);
     }
-#line 6891 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9106 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 351:
-#line 2283 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 469:
+#line 3107 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {  // GL_OES_EGL_image_external
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtFloat, Esd2D);
         (yyval.interm.type).sampler.external = true;
     }
-#line 6902 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9117 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 352:
-#line 2289 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 470:
+#line 3113 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.requireStage((yyvsp[0].lex).loc, EShLangFragment, "subpass input");
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setSubpass(EbtFloat);
     }
-#line 6913 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9128 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 353:
-#line 2295 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 471:
+#line 3119 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.requireStage((yyvsp[0].lex).loc, EShLangFragment, "subpass input");
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setSubpass(EbtFloat, true);
     }
-#line 6924 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9139 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 354:
-#line 2301 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 472:
+#line 3125 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+#ifdef AMD_EXTENSIONS
+        parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float subpass input", parseContext.symbolTable.atBuiltInLevel());
+        parseContext.requireStage((yyvsp[0].lex).loc, EShLangFragment, "subpass input");
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtSampler;
+        (yyval.interm.type).sampler.setSubpass(EbtFloat16);
+#endif
+    }
+#line 9153 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 473:
+#line 3134 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+#ifdef AMD_EXTENSIONS
+        parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float subpass input", parseContext.symbolTable.atBuiltInLevel());
+        parseContext.requireStage((yyvsp[0].lex).loc, EShLangFragment, "subpass input");
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtSampler;
+        (yyval.interm.type).sampler.setSubpass(EbtFloat16, true);
+#endif
+    }
+#line 9167 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 474:
+#line 3143 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.requireStage((yyvsp[0].lex).loc, EShLangFragment, "subpass input");
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setSubpass(EbtInt);
     }
-#line 6935 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9178 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 355:
-#line 2307 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 475:
+#line 3149 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.requireStage((yyvsp[0].lex).loc, EShLangFragment, "subpass input");
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setSubpass(EbtInt, true);
     }
-#line 6946 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9189 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 356:
-#line 2313 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 476:
+#line 3155 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.requireStage((yyvsp[0].lex).loc, EShLangFragment, "subpass input");
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setSubpass(EbtUint);
     }
-#line 6957 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9200 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 357:
-#line 2319 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 477:
+#line 3161 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.requireStage((yyvsp[0].lex).loc, EShLangFragment, "subpass input");
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setSubpass(EbtUint, true);
     }
-#line 6968 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9211 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 358:
-#line 2325 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 478:
+#line 3167 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type) = (yyvsp[0].interm.type);
         (yyval.interm.type).qualifier.storage = parseContext.symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
         parseContext.structTypeCheck((yyval.interm.type).loc, (yyval.interm.type));
     }
-#line 6978 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9221 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 359:
-#line 2330 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 479:
+#line 3172 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         //
         // This is for user defined type names.  The lexical phase looked up the
@@ -6992,47 +9235,47 @@
         } else
             parseContext.error((yyvsp[0].lex).loc, "expected type name", (yyvsp[0].lex).string->c_str(), "");
     }
-#line 6996 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9239 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 360:
-#line 2346 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 480:
+#line 3188 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.profileRequires((yyvsp[0].lex).loc, ENoProfile, 130, 0, "highp precision qualifier");
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         parseContext.handlePrecisionQualifier((yyvsp[0].lex).loc, (yyval.interm.type).qualifier, EpqHigh);
     }
-#line 7006 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9249 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 361:
-#line 2351 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 481:
+#line 3193 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.profileRequires((yyvsp[0].lex).loc, ENoProfile, 130, 0, "mediump precision qualifier");
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         parseContext.handlePrecisionQualifier((yyvsp[0].lex).loc, (yyval.interm.type).qualifier, EpqMedium);
     }
-#line 7016 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9259 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 362:
-#line 2356 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 482:
+#line 3198 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.profileRequires((yyvsp[0].lex).loc, ENoProfile, 130, 0, "lowp precision qualifier");
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         parseContext.handlePrecisionQualifier((yyvsp[0].lex).loc, (yyval.interm.type).qualifier, EpqLow);
     }
-#line 7026 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9269 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 363:
-#line 2364 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 483:
+#line 3206 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     { parseContext.nestedStructCheck((yyvsp[-2].lex).loc); }
-#line 7032 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9275 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 364:
-#line 2364 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 484:
+#line 3206 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         TType* structure = new TType((yyvsp[-1].interm.typeList), *(yyvsp[-4].lex).string);
         parseContext.structArrayCheck((yyvsp[-4].lex).loc, *structure);
@@ -7044,17 +9287,17 @@
         (yyval.interm.type).userDef = structure;
         --parseContext.structNestingLevel;
     }
-#line 7048 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9291 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 365:
-#line 2375 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 485:
+#line 3217 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     { parseContext.nestedStructCheck((yyvsp[-1].lex).loc); }
-#line 7054 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9297 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 366:
-#line 2375 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 486:
+#line 3217 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         TType* structure = new TType((yyvsp[-1].interm.typeList), TString(""));
         (yyval.interm.type).init((yyvsp[-4].lex).loc);
@@ -7062,19 +9305,19 @@
         (yyval.interm.type).userDef = structure;
         --parseContext.structNestingLevel;
     }
-#line 7066 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9309 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 367:
-#line 2385 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 487:
+#line 3227 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.typeList) = (yyvsp[0].interm.typeList);
     }
-#line 7074 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9317 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 368:
-#line 2388 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 488:
+#line 3230 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.typeList) = (yyvsp[-1].interm.typeList);
         for (unsigned int i = 0; i < (yyvsp[0].interm.typeList)->size(); ++i) {
@@ -7085,11 +9328,11 @@
             (yyval.interm.typeList)->push_back((*(yyvsp[0].interm.typeList))[i]);
         }
     }
-#line 7089 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9332 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 369:
-#line 2401 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 489:
+#line 3243 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         if ((yyvsp[-2].interm.type).arraySizes) {
             parseContext.profileRequires((yyvsp[-2].interm.type).loc, ENoProfile, 120, E_GL_3DL_array_objects, "arrayed type");
@@ -7104,17 +9347,20 @@
         parseContext.precisionQualifierCheck((yyvsp[-2].interm.type).loc, (yyvsp[-2].interm.type).basicType, (yyvsp[-2].interm.type).qualifier);
 
         for (unsigned int i = 0; i < (yyval.interm.typeList)->size(); ++i) {
-            parseContext.arrayDimCheck((yyvsp[-2].interm.type).loc, (*(yyval.interm.typeList))[i].type, (yyvsp[-2].interm.type).arraySizes);
-            (*(yyval.interm.typeList))[i].type->mergeType((yyvsp[-2].interm.type));
+            TType type((yyvsp[-2].interm.type));
+            type.setFieldName((*(yyval.interm.typeList))[i].type->getFieldName());
+            type.transferArraySizes((*(yyval.interm.typeList))[i].type->getArraySizes());
+            type.copyArrayInnerSizes((yyvsp[-2].interm.type).arraySizes);
+            parseContext.arrayOfArrayVersionCheck((*(yyval.interm.typeList))[i].loc, type.getArraySizes());
+            (*(yyval.interm.typeList))[i].type->shallowCopy(type);
         }
     }
-#line 7112 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9359 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 370:
-#line 2419 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 490:
+#line 3265 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
-        parseContext.globalQualifierFixCheck((yyvsp[-3].interm.type).loc, (yyvsp[-3].interm.type).qualifier);
         if ((yyvsp[-2].interm.type).arraySizes) {
             parseContext.profileRequires((yyvsp[-2].interm.type).loc, ENoProfile, 120, E_GL_3DL_array_objects, "arrayed type");
             parseContext.profileRequires((yyvsp[-2].interm.type).loc, EEsProfile, 300, 0, "arrayed type");
@@ -7124,269 +9370,273 @@
 
         (yyval.interm.typeList) = (yyvsp[-1].interm.typeList);
 
-        parseContext.checkNoShaderLayouts((yyvsp[-3].interm.type).loc, (yyvsp[-3].interm.type).shaderQualifiers);
+        parseContext.memberQualifierCheck((yyvsp[-3].interm.type));
         parseContext.voidErrorCheck((yyvsp[-2].interm.type).loc, (*(yyvsp[-1].interm.typeList))[0].type->getFieldName(), (yyvsp[-2].interm.type).basicType);
         parseContext.mergeQualifiers((yyvsp[-2].interm.type).loc, (yyvsp[-2].interm.type).qualifier, (yyvsp[-3].interm.type).qualifier, true);
         parseContext.precisionQualifierCheck((yyvsp[-2].interm.type).loc, (yyvsp[-2].interm.type).basicType, (yyvsp[-2].interm.type).qualifier);
 
         for (unsigned int i = 0; i < (yyval.interm.typeList)->size(); ++i) {
-            parseContext.arrayDimCheck((yyvsp[-3].interm.type).loc, (*(yyval.interm.typeList))[i].type, (yyvsp[-2].interm.type).arraySizes);
-            (*(yyval.interm.typeList))[i].type->mergeType((yyvsp[-2].interm.type));
+            TType type((yyvsp[-2].interm.type));
+            type.setFieldName((*(yyval.interm.typeList))[i].type->getFieldName());
+            type.transferArraySizes((*(yyval.interm.typeList))[i].type->getArraySizes());
+            type.copyArrayInnerSizes((yyvsp[-2].interm.type).arraySizes);
+            parseContext.arrayOfArrayVersionCheck((*(yyval.interm.typeList))[i].loc, type.getArraySizes());
+            (*(yyval.interm.typeList))[i].type->shallowCopy(type);
         }
     }
-#line 7138 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9388 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 371:
-#line 2443 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 491:
+#line 3292 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.typeList) = new TTypeList;
         (yyval.interm.typeList)->push_back((yyvsp[0].interm.typeLine));
     }
-#line 7147 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9397 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 372:
-#line 2447 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 492:
+#line 3296 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.typeList)->push_back((yyvsp[0].interm.typeLine));
     }
-#line 7155 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9405 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 373:
-#line 2453 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 493:
+#line 3302 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.typeLine).type = new TType(EbtVoid);
         (yyval.interm.typeLine).loc = (yyvsp[0].lex).loc;
         (yyval.interm.typeLine).type->setFieldName(*(yyvsp[0].lex).string);
     }
-#line 7165 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9415 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 374:
-#line 2458 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 494:
+#line 3307 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
-        parseContext.arrayDimCheck((yyvsp[-1].lex).loc, (yyvsp[0].interm).arraySizes, 0);
+        parseContext.arrayOfArrayVersionCheck((yyvsp[-1].lex).loc, (yyvsp[0].interm).arraySizes);
 
         (yyval.interm.typeLine).type = new TType(EbtVoid);
         (yyval.interm.typeLine).loc = (yyvsp[-1].lex).loc;
         (yyval.interm.typeLine).type->setFieldName(*(yyvsp[-1].lex).string);
-        (yyval.interm.typeLine).type->newArraySizes(*(yyvsp[0].interm).arraySizes);
+        (yyval.interm.typeLine).type->transferArraySizes((yyvsp[0].interm).arraySizes);
     }
-#line 7178 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9428 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 375:
-#line 2469 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 495:
+#line 3318 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode);
     }
-#line 7186 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9436 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 376:
-#line 2472 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 496:
+#line 3321 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         const char* initFeature = "{ } style initializers";
         parseContext.requireProfile((yyvsp[-2].lex).loc, ~EEsProfile, initFeature);
         parseContext.profileRequires((yyvsp[-2].lex).loc, ~EEsProfile, 420, E_GL_ARB_shading_language_420pack, initFeature);
         (yyval.interm.intermTypedNode) = (yyvsp[-1].interm.intermTypedNode);
     }
-#line 7197 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9447 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 377:
-#line 2478 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 497:
+#line 3327 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         const char* initFeature = "{ } style initializers";
         parseContext.requireProfile((yyvsp[-3].lex).loc, ~EEsProfile, initFeature);
         parseContext.profileRequires((yyvsp[-3].lex).loc, ~EEsProfile, 420, E_GL_ARB_shading_language_420pack, initFeature);
         (yyval.interm.intermTypedNode) = (yyvsp[-2].interm.intermTypedNode);
     }
-#line 7208 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9458 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 378:
-#line 2487 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 498:
+#line 3336 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.intermTypedNode) = parseContext.intermediate.growAggregate(0, (yyvsp[0].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode)->getLoc());
     }
-#line 7216 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9466 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 379:
-#line 2490 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 499:
+#line 3339 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.intermTypedNode) = parseContext.intermediate.growAggregate((yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode));
     }
-#line 7224 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9474 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 380:
-#line 2496 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 500:
+#line 3345 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
-#line 7230 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9480 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 381:
-#line 2500 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 501:
+#line 3349 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
-#line 7236 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9486 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 382:
-#line 2501 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 502:
+#line 3350 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
-#line 7242 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9492 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 383:
-#line 2507 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 503:
+#line 3356 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
-#line 7248 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9498 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 384:
-#line 2508 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 504:
+#line 3357 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
-#line 7254 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9504 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 385:
-#line 2509 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 505:
+#line 3358 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
-#line 7260 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9510 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 386:
-#line 2510 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 506:
+#line 3359 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
-#line 7266 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9516 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 387:
-#line 2511 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 507:
+#line 3360 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
-#line 7272 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9522 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 388:
-#line 2512 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 508:
+#line 3361 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
-#line 7278 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9528 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 389:
-#line 2513 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 509:
+#line 3362 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
-#line 7284 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9534 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 390:
-#line 2517 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 510:
+#line 3366 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     { (yyval.interm.intermNode) = 0; }
-#line 7290 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9540 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 391:
-#line 2518 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 511:
+#line 3367 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.symbolTable.push();
         ++parseContext.statementNestingLevel;
     }
-#line 7299 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9549 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 392:
-#line 2522 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 512:
+#line 3371 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.symbolTable.pop(&parseContext.defaultPrecision[0]);
         --parseContext.statementNestingLevel;
     }
-#line 7308 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9558 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 393:
-#line 2526 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 513:
+#line 3375 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         if ((yyvsp[-2].interm.intermNode) && (yyvsp[-2].interm.intermNode)->getAsAggregate())
             (yyvsp[-2].interm.intermNode)->getAsAggregate()->setOperator(EOpSequence);
         (yyval.interm.intermNode) = (yyvsp[-2].interm.intermNode);
     }
-#line 7318 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9568 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 394:
-#line 2534 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 514:
+#line 3383 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
-#line 7324 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9574 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 395:
-#line 2535 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 515:
+#line 3384 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
-#line 7330 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9580 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 396:
-#line 2539 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 516:
+#line 3388 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         ++parseContext.controlFlowNestingLevel;
     }
-#line 7338 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9588 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 397:
-#line 2542 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 517:
+#line 3391 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         --parseContext.controlFlowNestingLevel;
         (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);
     }
-#line 7347 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9597 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 398:
-#line 2546 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 518:
+#line 3395 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.symbolTable.push();
         ++parseContext.statementNestingLevel;
         ++parseContext.controlFlowNestingLevel;
     }
-#line 7357 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9607 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 399:
-#line 2551 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 519:
+#line 3400 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.symbolTable.pop(&parseContext.defaultPrecision[0]);
         --parseContext.statementNestingLevel;
         --parseContext.controlFlowNestingLevel;
         (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);
     }
-#line 7368 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9618 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 400:
-#line 2560 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 520:
+#line 3409 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.intermNode) = 0;
     }
-#line 7376 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9626 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 401:
-#line 2563 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 521:
+#line 3412 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         if ((yyvsp[-1].interm.intermNode) && (yyvsp[-1].interm.intermNode)->getAsAggregate())
             (yyvsp[-1].interm.intermNode)->getAsAggregate()->setOperator(EOpSequence);
         (yyval.interm.intermNode) = (yyvsp[-1].interm.intermNode);
     }
-#line 7386 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9636 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 402:
-#line 2571 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 522:
+#line 3420 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.intermNode) = parseContext.intermediate.makeAggregate((yyvsp[0].interm.intermNode));
         if ((yyvsp[0].interm.intermNode) && (yyvsp[0].interm.intermNode)->getAsBranchNode() && ((yyvsp[0].interm.intermNode)->getAsBranchNode()->getFlowOp() == EOpCase ||
@@ -7395,11 +9645,11 @@
             (yyval.interm.intermNode) = 0;  // start a fresh subsequence for what's after this case
         }
     }
-#line 7399 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9649 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 403:
-#line 2579 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 523:
+#line 3428 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         if ((yyvsp[0].interm.intermNode) && (yyvsp[0].interm.intermNode)->getAsBranchNode() && ((yyvsp[0].interm.intermNode)->getAsBranchNode()->getFlowOp() == EOpCase ||
                                             (yyvsp[0].interm.intermNode)->getAsBranchNode()->getFlowOp() == EOpDefault)) {
@@ -7408,59 +9658,76 @@
         } else
             (yyval.interm.intermNode) = parseContext.intermediate.growAggregate((yyvsp[-1].interm.intermNode), (yyvsp[0].interm.intermNode));
     }
-#line 7412 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9662 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 404:
-#line 2590 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 524:
+#line 3439 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     { (yyval.interm.intermNode) = 0; }
-#line 7418 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9668 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 405:
-#line 2591 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 525:
+#line 3440 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     { (yyval.interm.intermNode) = static_cast<TIntermNode*>((yyvsp[-1].interm.intermTypedNode)); }
-#line 7424 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9674 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 406:
-#line 2595 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 526:
+#line 3444 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+        (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);
+    }
+#line 9682 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 527:
+#line 3447 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+        parseContext.handleSelectionAttributes(*(yyvsp[-1].interm.attributes), (yyvsp[0].interm.intermNode));
+        (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);
+    }
+#line 9691 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 528:
+#line 3453 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.boolCheck((yyvsp[-4].lex).loc, (yyvsp[-2].interm.intermTypedNode));
         (yyval.interm.intermNode) = parseContext.intermediate.addSelection((yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.nodePair), (yyvsp[-4].lex).loc);
     }
-#line 7433 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9700 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 407:
-#line 2602 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 529:
+#line 3460 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.nodePair).node1 = (yyvsp[-2].interm.intermNode);
         (yyval.interm.nodePair).node2 = (yyvsp[0].interm.intermNode);
     }
-#line 7442 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9709 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 408:
-#line 2606 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 530:
+#line 3464 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.nodePair).node1 = (yyvsp[0].interm.intermNode);
         (yyval.interm.nodePair).node2 = 0;
     }
-#line 7451 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9718 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 409:
-#line 2614 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 531:
+#line 3472 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode);
         parseContext.boolCheck((yyvsp[0].interm.intermTypedNode)->getLoc(), (yyvsp[0].interm.intermTypedNode));
     }
-#line 7460 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9727 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 410:
-#line 2618 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 532:
+#line 3476 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.boolCheck((yyvsp[-2].lex).loc, (yyvsp[-3].interm.type));
 
@@ -7471,11 +9738,28 @@
         else
             (yyval.interm.intermTypedNode) = 0;
     }
-#line 7475 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9742 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 411:
-#line 2631 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 533:
+#line 3489 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+        (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);
+    }
+#line 9750 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 534:
+#line 3492 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+        parseContext.handleSwitchAttributes(*(yyvsp[-1].interm.attributes), (yyvsp[0].interm.intermNode));
+        (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);
+    }
+#line 9759 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 535:
+#line 3498 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         // start new switch sequence on the switch stack
         ++parseContext.controlFlowNestingLevel;
@@ -7484,11 +9768,11 @@
         parseContext.switchLevel.push_back(parseContext.statementNestingLevel);
         parseContext.symbolTable.push();
     }
-#line 7488 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9772 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 412:
-#line 2639 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 536:
+#line 3506 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.intermNode) = parseContext.addSwitch((yyvsp[-7].lex).loc, (yyvsp[-5].interm.intermTypedNode), (yyvsp[-1].interm.intermNode) ? (yyvsp[-1].interm.intermNode)->getAsAggregate() : 0);
         delete parseContext.switchSequenceStack.back();
@@ -7498,27 +9782,27 @@
         --parseContext.statementNestingLevel;
         --parseContext.controlFlowNestingLevel;
     }
-#line 7502 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9786 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 413:
-#line 2651 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 537:
+#line 3518 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.intermNode) = 0;
     }
-#line 7510 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9794 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 414:
-#line 2654 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 538:
+#line 3521 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);
     }
-#line 7518 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9802 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 415:
-#line 2660 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 539:
+#line 3527 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.intermNode) = 0;
         if (parseContext.switchLevel.size() == 0)
@@ -7531,11 +9815,11 @@
             (yyval.interm.intermNode) = parseContext.intermediate.addBranch(EOpCase, (yyvsp[-1].interm.intermTypedNode), (yyvsp[-2].lex).loc);
         }
     }
-#line 7535 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9819 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 416:
-#line 2672 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 540:
+#line 3539 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.intermNode) = 0;
         if (parseContext.switchLevel.size() == 0)
@@ -7545,11 +9829,28 @@
         else
             (yyval.interm.intermNode) = parseContext.intermediate.addBranch(EOpDefault, (yyvsp[-1].lex).loc);
     }
-#line 7549 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9833 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 417:
-#line 2684 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 541:
+#line 3551 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+        (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);
+    }
+#line 9841 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 542:
+#line 3554 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+        parseContext.handleLoopAttributes(*(yyvsp[-1].interm.attributes), (yyvsp[0].interm.intermNode));
+        (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);
+    }
+#line 9850 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 543:
+#line 3560 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         if (! parseContext.limits.whileLoops)
             parseContext.error((yyvsp[-1].lex).loc, "while loops not available", "limitation", "");
@@ -7558,11 +9859,11 @@
         ++parseContext.statementNestingLevel;
         ++parseContext.controlFlowNestingLevel;
     }
-#line 7562 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9863 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 418:
-#line 2692 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 544:
+#line 3568 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.symbolTable.pop(&parseContext.defaultPrecision[0]);
         (yyval.interm.intermNode) = parseContext.intermediate.addLoop((yyvsp[0].interm.intermNode), (yyvsp[-2].interm.intermTypedNode), 0, true, (yyvsp[-5].lex).loc);
@@ -7570,21 +9871,21 @@
         --parseContext.statementNestingLevel;
         --parseContext.controlFlowNestingLevel;
     }
-#line 7574 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9875 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 419:
-#line 2699 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 545:
+#line 3575 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         ++parseContext.loopNestingLevel;
         ++parseContext.statementNestingLevel;
         ++parseContext.controlFlowNestingLevel;
     }
-#line 7584 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9885 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 420:
-#line 2704 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 546:
+#line 3580 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         if (! parseContext.limits.whileLoops)
             parseContext.error((yyvsp[-7].lex).loc, "do-while loops not available", "limitation", "");
@@ -7596,22 +9897,22 @@
         --parseContext.statementNestingLevel;
         --parseContext.controlFlowNestingLevel;
     }
-#line 7600 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9901 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 421:
-#line 2715 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 547:
+#line 3591 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.symbolTable.push();
         ++parseContext.loopNestingLevel;
         ++parseContext.statementNestingLevel;
         ++parseContext.controlFlowNestingLevel;
     }
-#line 7611 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9912 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 422:
-#line 2721 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 548:
+#line 3597 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.symbolTable.pop(&parseContext.defaultPrecision[0]);
         (yyval.interm.intermNode) = parseContext.intermediate.makeAggregate((yyvsp[-3].interm.intermNode), (yyvsp[-5].lex).loc);
@@ -7624,153 +9925,165 @@
         --parseContext.statementNestingLevel;
         --parseContext.controlFlowNestingLevel;
     }
-#line 7628 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9929 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 423:
-#line 2736 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 549:
+#line 3612 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);
     }
-#line 7636 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9937 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 424:
-#line 2739 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 550:
+#line 3615 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);
     }
-#line 7644 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9945 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 425:
-#line 2745 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 551:
+#line 3621 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode);
     }
-#line 7652 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9953 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 426:
-#line 2748 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 552:
+#line 3624 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.intermTypedNode) = 0;
     }
-#line 7660 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9961 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 427:
-#line 2754 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 553:
+#line 3630 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.nodePair).node1 = (yyvsp[-1].interm.intermTypedNode);
         (yyval.interm.nodePair).node2 = 0;
     }
-#line 7669 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9970 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 428:
-#line 2758 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 554:
+#line 3634 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.nodePair).node1 = (yyvsp[-2].interm.intermTypedNode);
         (yyval.interm.nodePair).node2 = (yyvsp[0].interm.intermTypedNode);
     }
-#line 7678 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9979 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 429:
-#line 2765 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 555:
+#line 3641 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         if (parseContext.loopNestingLevel <= 0)
             parseContext.error((yyvsp[-1].lex).loc, "continue statement only allowed in loops", "", "");
         (yyval.interm.intermNode) = parseContext.intermediate.addBranch(EOpContinue, (yyvsp[-1].lex).loc);
     }
-#line 7688 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9989 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 430:
-#line 2770 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 556:
+#line 3646 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         if (parseContext.loopNestingLevel + parseContext.switchSequenceStack.size() <= 0)
             parseContext.error((yyvsp[-1].lex).loc, "break statement only allowed in switch and loops", "", "");
         (yyval.interm.intermNode) = parseContext.intermediate.addBranch(EOpBreak, (yyvsp[-1].lex).loc);
     }
-#line 7698 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9999 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 431:
-#line 2775 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 557:
+#line 3651 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.intermNode) = parseContext.intermediate.addBranch(EOpReturn, (yyvsp[-1].lex).loc);
         if (parseContext.currentFunctionType->getBasicType() != EbtVoid)
             parseContext.error((yyvsp[-1].lex).loc, "non-void function must return a value", "return", "");
         if (parseContext.inMain)
-            parseContext.postMainReturn = true;
+            parseContext.postEntryPointReturn = true;
     }
-#line 7710 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 10011 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 432:
-#line 2782 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 558:
+#line 3658 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.intermNode) = parseContext.handleReturnValue((yyvsp[-2].lex).loc, (yyvsp[-1].interm.intermTypedNode));
     }
-#line 7718 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 10019 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 433:
-#line 2785 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 559:
+#line 3661 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.requireStage((yyvsp[-1].lex).loc, EShLangFragment, "discard");
         (yyval.interm.intermNode) = parseContext.intermediate.addBranch(EOpKill, (yyvsp[-1].lex).loc);
     }
-#line 7727 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 10028 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 434:
-#line 2794 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 560:
+#line 3670 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);
         parseContext.intermediate.setTreeRoot((yyval.interm.intermNode));
     }
-#line 7736 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 10037 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 435:
-#line 2798 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 561:
+#line 3674 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
-        (yyval.interm.intermNode) = parseContext.intermediate.growAggregate((yyvsp[-1].interm.intermNode), (yyvsp[0].interm.intermNode));
-        parseContext.intermediate.setTreeRoot((yyval.interm.intermNode));
+        if ((yyvsp[0].interm.intermNode) != nullptr) {
+            (yyval.interm.intermNode) = parseContext.intermediate.growAggregate((yyvsp[-1].interm.intermNode), (yyvsp[0].interm.intermNode));
+            parseContext.intermediate.setTreeRoot((yyval.interm.intermNode));
+        }
     }
-#line 7745 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 10048 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 436:
-#line 2805 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 562:
+#line 3683 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);
     }
-#line 7753 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 10056 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 437:
-#line 2808 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 563:
+#line 3686 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);
     }
-#line 7761 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 10064 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 438:
-#line 2814 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 564:
+#line 3689 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+        parseContext.requireProfile((yyvsp[0].lex).loc, ~EEsProfile, "extraneous semicolon");
+        parseContext.profileRequires((yyvsp[0].lex).loc, ~EEsProfile, 460, nullptr, "extraneous semicolon");
+        (yyval.interm.intermNode) = nullptr;
+    }
+#line 10074 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 565:
+#line 3697 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyvsp[0].interm).function = parseContext.handleFunctionDeclarator((yyvsp[0].interm).loc, *(yyvsp[0].interm).function, false /* not prototype */);
         (yyvsp[0].interm).intermNode = parseContext.handleFunctionDefinition((yyvsp[0].interm).loc, *(yyvsp[0].interm).function);
     }
-#line 7770 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 10083 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
-  case 439:
-#line 2818 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+  case 566:
+#line 3701 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         //   May be best done as post process phase on intermediate code
         if (parseContext.currentFunctionType->getBasicType() != EbtVoid && ! parseContext.functionReturnsValue)
@@ -7784,13 +10097,54 @@
         // information. This information can be queried from the parse tree
         (yyval.interm.intermNode)->getAsAggregate()->setOptimize(parseContext.contextPragma.optimize);
         (yyval.interm.intermNode)->getAsAggregate()->setDebug(parseContext.contextPragma.debug);
-        (yyval.interm.intermNode)->getAsAggregate()->addToPragmaTable(parseContext.contextPragma.pragmaTable);
+        (yyval.interm.intermNode)->getAsAggregate()->setPragmaTable(parseContext.contextPragma.pragmaTable);
     }
-#line 7790 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 10103 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 567:
+#line 3719 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+        (yyval.interm.attributes) = (yyvsp[-2].interm.attributes);
+        parseContext.requireExtensions((yyvsp[-4].lex).loc, 1, &E_GL_EXT_control_flow_attributes, "attribute");
+    }
+#line 10112 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 568:
+#line 3725 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+        (yyval.interm.attributes) = (yyvsp[0].interm.attributes);
+    }
+#line 10120 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 569:
+#line 3728 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+        (yyval.interm.attributes) = parseContext.mergeAttributes((yyvsp[-2].interm.attributes), (yyvsp[0].interm.attributes));
+    }
+#line 10128 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 570:
+#line 3733 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+        (yyval.interm.attributes) = parseContext.makeAttributes(*(yyvsp[0].lex).string);
+    }
+#line 10136 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+    break;
+
+  case 571:
+#line 3736 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+    {
+        (yyval.interm.attributes) = parseContext.makeAttributes(*(yyvsp[-3].lex).string, (yyvsp[-1].interm.intermTypedNode));
+    }
+#line 10144 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
 
-#line 7794 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 10148 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
       default: break;
     }
   /* User semantic actions sometimes alter yychar, and that requires
@@ -8018,5 +10372,5 @@
 #endif
   return yyresult;
 }
-#line 2835 "MachineIndependent/glslang.y" /* yacc.c:1906  */
+#line 3740 "MachineIndependent/glslang.y" /* yacc.c:1906  */
 
diff --git a/glslang/MachineIndependent/glslang_tab.cpp.h b/glslang/MachineIndependent/glslang_tab.cpp.h
index bf59a03..50bbcfc 100644
--- a/glslang/MachineIndependent/glslang_tab.cpp.h
+++ b/glslang/MachineIndependent/glslang_tab.cpp.h
@@ -47,289 +47,407 @@
   {
     ATTRIBUTE = 258,
     VARYING = 259,
-    CONST = 260,
-    BOOL = 261,
-    FLOAT = 262,
+    FLOAT16_T = 260,
+    FLOAT = 261,
+    FLOAT32_T = 262,
     DOUBLE = 263,
-    INT = 264,
-    UINT = 265,
-    INT64_T = 266,
-    UINT64_T = 267,
-    FLOAT16_T = 268,
-    BREAK = 269,
-    CONTINUE = 270,
-    DO = 271,
-    ELSE = 272,
-    FOR = 273,
-    IF = 274,
-    DISCARD = 275,
-    RETURN = 276,
-    SWITCH = 277,
-    CASE = 278,
-    DEFAULT = 279,
-    SUBROUTINE = 280,
-    BVEC2 = 281,
-    BVEC3 = 282,
-    BVEC4 = 283,
-    IVEC2 = 284,
-    IVEC3 = 285,
-    IVEC4 = 286,
-    I64VEC2 = 287,
-    I64VEC3 = 288,
-    I64VEC4 = 289,
-    UVEC2 = 290,
-    UVEC3 = 291,
-    UVEC4 = 292,
-    U64VEC2 = 293,
-    U64VEC3 = 294,
-    U64VEC4 = 295,
-    VEC2 = 296,
-    VEC3 = 297,
-    VEC4 = 298,
-    MAT2 = 299,
-    MAT3 = 300,
-    MAT4 = 301,
-    CENTROID = 302,
-    IN = 303,
-    OUT = 304,
-    INOUT = 305,
-    UNIFORM = 306,
-    PATCH = 307,
-    SAMPLE = 308,
-    BUFFER = 309,
-    SHARED = 310,
-    COHERENT = 311,
-    VOLATILE = 312,
-    RESTRICT = 313,
-    READONLY = 314,
-    WRITEONLY = 315,
-    DVEC2 = 316,
-    DVEC3 = 317,
-    DVEC4 = 318,
-    DMAT2 = 319,
-    DMAT3 = 320,
-    DMAT4 = 321,
-    F16VEC2 = 322,
-    F16VEC3 = 323,
-    F16VEC4 = 324,
-    F16MAT2 = 325,
-    F16MAT3 = 326,
-    F16MAT4 = 327,
-    NOPERSPECTIVE = 328,
-    FLAT = 329,
-    SMOOTH = 330,
-    LAYOUT = 331,
-    __EXPLICITINTERPAMD = 332,
-    MAT2X2 = 333,
-    MAT2X3 = 334,
-    MAT2X4 = 335,
-    MAT3X2 = 336,
-    MAT3X3 = 337,
-    MAT3X4 = 338,
-    MAT4X2 = 339,
-    MAT4X3 = 340,
-    MAT4X4 = 341,
-    DMAT2X2 = 342,
-    DMAT2X3 = 343,
-    DMAT2X4 = 344,
-    DMAT3X2 = 345,
-    DMAT3X3 = 346,
-    DMAT3X4 = 347,
-    DMAT4X2 = 348,
-    DMAT4X3 = 349,
-    DMAT4X4 = 350,
-    F16MAT2X2 = 351,
-    F16MAT2X3 = 352,
-    F16MAT2X4 = 353,
-    F16MAT3X2 = 354,
-    F16MAT3X3 = 355,
-    F16MAT3X4 = 356,
-    F16MAT4X2 = 357,
-    F16MAT4X3 = 358,
-    F16MAT4X4 = 359,
-    ATOMIC_UINT = 360,
-    SAMPLER1D = 361,
-    SAMPLER2D = 362,
-    SAMPLER3D = 363,
-    SAMPLERCUBE = 364,
-    SAMPLER1DSHADOW = 365,
-    SAMPLER2DSHADOW = 366,
-    SAMPLERCUBESHADOW = 367,
-    SAMPLER1DARRAY = 368,
-    SAMPLER2DARRAY = 369,
-    SAMPLER1DARRAYSHADOW = 370,
-    SAMPLER2DARRAYSHADOW = 371,
-    ISAMPLER1D = 372,
-    ISAMPLER2D = 373,
-    ISAMPLER3D = 374,
-    ISAMPLERCUBE = 375,
-    ISAMPLER1DARRAY = 376,
-    ISAMPLER2DARRAY = 377,
-    USAMPLER1D = 378,
-    USAMPLER2D = 379,
-    USAMPLER3D = 380,
-    USAMPLERCUBE = 381,
-    USAMPLER1DARRAY = 382,
-    USAMPLER2DARRAY = 383,
-    SAMPLER2DRECT = 384,
-    SAMPLER2DRECTSHADOW = 385,
-    ISAMPLER2DRECT = 386,
-    USAMPLER2DRECT = 387,
-    SAMPLERBUFFER = 388,
-    ISAMPLERBUFFER = 389,
-    USAMPLERBUFFER = 390,
-    SAMPLERCUBEARRAY = 391,
-    SAMPLERCUBEARRAYSHADOW = 392,
-    ISAMPLERCUBEARRAY = 393,
-    USAMPLERCUBEARRAY = 394,
-    SAMPLER2DMS = 395,
-    ISAMPLER2DMS = 396,
-    USAMPLER2DMS = 397,
-    SAMPLER2DMSARRAY = 398,
-    ISAMPLER2DMSARRAY = 399,
-    USAMPLER2DMSARRAY = 400,
-    SAMPLEREXTERNALOES = 401,
-    SAMPLER = 402,
-    SAMPLERSHADOW = 403,
-    TEXTURE1D = 404,
-    TEXTURE2D = 405,
-    TEXTURE3D = 406,
-    TEXTURECUBE = 407,
-    TEXTURE1DARRAY = 408,
-    TEXTURE2DARRAY = 409,
-    ITEXTURE1D = 410,
-    ITEXTURE2D = 411,
-    ITEXTURE3D = 412,
-    ITEXTURECUBE = 413,
-    ITEXTURE1DARRAY = 414,
-    ITEXTURE2DARRAY = 415,
-    UTEXTURE1D = 416,
-    UTEXTURE2D = 417,
-    UTEXTURE3D = 418,
-    UTEXTURECUBE = 419,
-    UTEXTURE1DARRAY = 420,
-    UTEXTURE2DARRAY = 421,
-    TEXTURE2DRECT = 422,
-    ITEXTURE2DRECT = 423,
-    UTEXTURE2DRECT = 424,
-    TEXTUREBUFFER = 425,
-    ITEXTUREBUFFER = 426,
-    UTEXTUREBUFFER = 427,
-    TEXTURECUBEARRAY = 428,
-    ITEXTURECUBEARRAY = 429,
-    UTEXTURECUBEARRAY = 430,
-    TEXTURE2DMS = 431,
-    ITEXTURE2DMS = 432,
-    UTEXTURE2DMS = 433,
-    TEXTURE2DMSARRAY = 434,
-    ITEXTURE2DMSARRAY = 435,
-    UTEXTURE2DMSARRAY = 436,
-    SUBPASSINPUT = 437,
-    SUBPASSINPUTMS = 438,
-    ISUBPASSINPUT = 439,
-    ISUBPASSINPUTMS = 440,
-    USUBPASSINPUT = 441,
-    USUBPASSINPUTMS = 442,
-    IMAGE1D = 443,
-    IIMAGE1D = 444,
-    UIMAGE1D = 445,
-    IMAGE2D = 446,
-    IIMAGE2D = 447,
-    UIMAGE2D = 448,
-    IMAGE3D = 449,
-    IIMAGE3D = 450,
-    UIMAGE3D = 451,
-    IMAGE2DRECT = 452,
-    IIMAGE2DRECT = 453,
-    UIMAGE2DRECT = 454,
-    IMAGECUBE = 455,
-    IIMAGECUBE = 456,
-    UIMAGECUBE = 457,
-    IMAGEBUFFER = 458,
-    IIMAGEBUFFER = 459,
-    UIMAGEBUFFER = 460,
-    IMAGE1DARRAY = 461,
-    IIMAGE1DARRAY = 462,
-    UIMAGE1DARRAY = 463,
-    IMAGE2DARRAY = 464,
-    IIMAGE2DARRAY = 465,
-    UIMAGE2DARRAY = 466,
-    IMAGECUBEARRAY = 467,
-    IIMAGECUBEARRAY = 468,
-    UIMAGECUBEARRAY = 469,
-    IMAGE2DMS = 470,
-    IIMAGE2DMS = 471,
-    UIMAGE2DMS = 472,
-    IMAGE2DMSARRAY = 473,
-    IIMAGE2DMSARRAY = 474,
-    UIMAGE2DMSARRAY = 475,
-    STRUCT = 476,
-    VOID = 477,
-    WHILE = 478,
-    IDENTIFIER = 479,
-    TYPE_NAME = 480,
-    FLOATCONSTANT = 481,
-    DOUBLECONSTANT = 482,
-    INTCONSTANT = 483,
-    UINTCONSTANT = 484,
-    INT64CONSTANT = 485,
-    UINT64CONSTANT = 486,
-    BOOLCONSTANT = 487,
-    FLOAT16CONSTANT = 488,
-    LEFT_OP = 489,
-    RIGHT_OP = 490,
-    INC_OP = 491,
-    DEC_OP = 492,
-    LE_OP = 493,
-    GE_OP = 494,
-    EQ_OP = 495,
-    NE_OP = 496,
-    AND_OP = 497,
-    OR_OP = 498,
-    XOR_OP = 499,
-    MUL_ASSIGN = 500,
-    DIV_ASSIGN = 501,
-    ADD_ASSIGN = 502,
-    MOD_ASSIGN = 503,
-    LEFT_ASSIGN = 504,
-    RIGHT_ASSIGN = 505,
-    AND_ASSIGN = 506,
-    XOR_ASSIGN = 507,
-    OR_ASSIGN = 508,
-    SUB_ASSIGN = 509,
-    LEFT_PAREN = 510,
-    RIGHT_PAREN = 511,
-    LEFT_BRACKET = 512,
-    RIGHT_BRACKET = 513,
-    LEFT_BRACE = 514,
-    RIGHT_BRACE = 515,
-    DOT = 516,
-    COMMA = 517,
-    COLON = 518,
-    EQUAL = 519,
-    SEMICOLON = 520,
-    BANG = 521,
-    DASH = 522,
-    TILDE = 523,
-    PLUS = 524,
-    STAR = 525,
-    SLASH = 526,
-    PERCENT = 527,
-    LEFT_ANGLE = 528,
-    RIGHT_ANGLE = 529,
-    VERTICAL_BAR = 530,
-    CARET = 531,
-    AMPERSAND = 532,
-    QUESTION = 533,
-    INVARIANT = 534,
-    PRECISE = 535,
-    HIGH_PRECISION = 536,
-    MEDIUM_PRECISION = 537,
-    LOW_PRECISION = 538,
-    PRECISION = 539,
-    PACKED = 540,
-    RESOURCE = 541,
-    SUPERP = 542
+    FLOAT64_T = 264,
+    CONST = 265,
+    BOOL = 266,
+    INT = 267,
+    UINT = 268,
+    INT64_T = 269,
+    UINT64_T = 270,
+    INT32_T = 271,
+    UINT32_T = 272,
+    INT16_T = 273,
+    UINT16_T = 274,
+    INT8_T = 275,
+    UINT8_T = 276,
+    BREAK = 277,
+    CONTINUE = 278,
+    DO = 279,
+    ELSE = 280,
+    FOR = 281,
+    IF = 282,
+    DISCARD = 283,
+    RETURN = 284,
+    SWITCH = 285,
+    CASE = 286,
+    DEFAULT = 287,
+    SUBROUTINE = 288,
+    BVEC2 = 289,
+    BVEC3 = 290,
+    BVEC4 = 291,
+    IVEC2 = 292,
+    IVEC3 = 293,
+    IVEC4 = 294,
+    UVEC2 = 295,
+    UVEC3 = 296,
+    UVEC4 = 297,
+    I64VEC2 = 298,
+    I64VEC3 = 299,
+    I64VEC4 = 300,
+    U64VEC2 = 301,
+    U64VEC3 = 302,
+    U64VEC4 = 303,
+    I32VEC2 = 304,
+    I32VEC3 = 305,
+    I32VEC4 = 306,
+    U32VEC2 = 307,
+    U32VEC3 = 308,
+    U32VEC4 = 309,
+    I16VEC2 = 310,
+    I16VEC3 = 311,
+    I16VEC4 = 312,
+    U16VEC2 = 313,
+    U16VEC3 = 314,
+    U16VEC4 = 315,
+    I8VEC2 = 316,
+    I8VEC3 = 317,
+    I8VEC4 = 318,
+    U8VEC2 = 319,
+    U8VEC3 = 320,
+    U8VEC4 = 321,
+    VEC2 = 322,
+    VEC3 = 323,
+    VEC4 = 324,
+    MAT2 = 325,
+    MAT3 = 326,
+    MAT4 = 327,
+    CENTROID = 328,
+    IN = 329,
+    OUT = 330,
+    INOUT = 331,
+    UNIFORM = 332,
+    PATCH = 333,
+    SAMPLE = 334,
+    BUFFER = 335,
+    SHARED = 336,
+    NONUNIFORM = 337,
+    PAYLOADNV = 338,
+    PAYLOADINNV = 339,
+    HITATTRNV = 340,
+    CALLDATANV = 341,
+    CALLDATAINNV = 342,
+    COHERENT = 343,
+    VOLATILE = 344,
+    RESTRICT = 345,
+    READONLY = 346,
+    WRITEONLY = 347,
+    DEVICECOHERENT = 348,
+    QUEUEFAMILYCOHERENT = 349,
+    WORKGROUPCOHERENT = 350,
+    SUBGROUPCOHERENT = 351,
+    NONPRIVATE = 352,
+    DVEC2 = 353,
+    DVEC3 = 354,
+    DVEC4 = 355,
+    DMAT2 = 356,
+    DMAT3 = 357,
+    DMAT4 = 358,
+    F16VEC2 = 359,
+    F16VEC3 = 360,
+    F16VEC4 = 361,
+    F16MAT2 = 362,
+    F16MAT3 = 363,
+    F16MAT4 = 364,
+    F32VEC2 = 365,
+    F32VEC3 = 366,
+    F32VEC4 = 367,
+    F32MAT2 = 368,
+    F32MAT3 = 369,
+    F32MAT4 = 370,
+    F64VEC2 = 371,
+    F64VEC3 = 372,
+    F64VEC4 = 373,
+    F64MAT2 = 374,
+    F64MAT3 = 375,
+    F64MAT4 = 376,
+    NOPERSPECTIVE = 377,
+    FLAT = 378,
+    SMOOTH = 379,
+    LAYOUT = 380,
+    EXPLICITINTERPAMD = 381,
+    PERVERTEXNV = 382,
+    PERPRIMITIVENV = 383,
+    PERVIEWNV = 384,
+    PERTASKNV = 385,
+    MAT2X2 = 386,
+    MAT2X3 = 387,
+    MAT2X4 = 388,
+    MAT3X2 = 389,
+    MAT3X3 = 390,
+    MAT3X4 = 391,
+    MAT4X2 = 392,
+    MAT4X3 = 393,
+    MAT4X4 = 394,
+    DMAT2X2 = 395,
+    DMAT2X3 = 396,
+    DMAT2X4 = 397,
+    DMAT3X2 = 398,
+    DMAT3X3 = 399,
+    DMAT3X4 = 400,
+    DMAT4X2 = 401,
+    DMAT4X3 = 402,
+    DMAT4X4 = 403,
+    F16MAT2X2 = 404,
+    F16MAT2X3 = 405,
+    F16MAT2X4 = 406,
+    F16MAT3X2 = 407,
+    F16MAT3X3 = 408,
+    F16MAT3X4 = 409,
+    F16MAT4X2 = 410,
+    F16MAT4X3 = 411,
+    F16MAT4X4 = 412,
+    F32MAT2X2 = 413,
+    F32MAT2X3 = 414,
+    F32MAT2X4 = 415,
+    F32MAT3X2 = 416,
+    F32MAT3X3 = 417,
+    F32MAT3X4 = 418,
+    F32MAT4X2 = 419,
+    F32MAT4X3 = 420,
+    F32MAT4X4 = 421,
+    F64MAT2X2 = 422,
+    F64MAT2X3 = 423,
+    F64MAT2X4 = 424,
+    F64MAT3X2 = 425,
+    F64MAT3X3 = 426,
+    F64MAT3X4 = 427,
+    F64MAT4X2 = 428,
+    F64MAT4X3 = 429,
+    F64MAT4X4 = 430,
+    ATOMIC_UINT = 431,
+    ACCSTRUCTNV = 432,
+    SAMPLER1D = 433,
+    SAMPLER2D = 434,
+    SAMPLER3D = 435,
+    SAMPLERCUBE = 436,
+    SAMPLER1DSHADOW = 437,
+    SAMPLER2DSHADOW = 438,
+    SAMPLERCUBESHADOW = 439,
+    SAMPLER1DARRAY = 440,
+    SAMPLER2DARRAY = 441,
+    SAMPLER1DARRAYSHADOW = 442,
+    SAMPLER2DARRAYSHADOW = 443,
+    ISAMPLER1D = 444,
+    ISAMPLER2D = 445,
+    ISAMPLER3D = 446,
+    ISAMPLERCUBE = 447,
+    ISAMPLER1DARRAY = 448,
+    ISAMPLER2DARRAY = 449,
+    USAMPLER1D = 450,
+    USAMPLER2D = 451,
+    USAMPLER3D = 452,
+    USAMPLERCUBE = 453,
+    USAMPLER1DARRAY = 454,
+    USAMPLER2DARRAY = 455,
+    SAMPLER2DRECT = 456,
+    SAMPLER2DRECTSHADOW = 457,
+    ISAMPLER2DRECT = 458,
+    USAMPLER2DRECT = 459,
+    SAMPLERBUFFER = 460,
+    ISAMPLERBUFFER = 461,
+    USAMPLERBUFFER = 462,
+    SAMPLERCUBEARRAY = 463,
+    SAMPLERCUBEARRAYSHADOW = 464,
+    ISAMPLERCUBEARRAY = 465,
+    USAMPLERCUBEARRAY = 466,
+    SAMPLER2DMS = 467,
+    ISAMPLER2DMS = 468,
+    USAMPLER2DMS = 469,
+    SAMPLER2DMSARRAY = 470,
+    ISAMPLER2DMSARRAY = 471,
+    USAMPLER2DMSARRAY = 472,
+    SAMPLEREXTERNALOES = 473,
+    F16SAMPLER1D = 474,
+    F16SAMPLER2D = 475,
+    F16SAMPLER3D = 476,
+    F16SAMPLER2DRECT = 477,
+    F16SAMPLERCUBE = 478,
+    F16SAMPLER1DARRAY = 479,
+    F16SAMPLER2DARRAY = 480,
+    F16SAMPLERCUBEARRAY = 481,
+    F16SAMPLERBUFFER = 482,
+    F16SAMPLER2DMS = 483,
+    F16SAMPLER2DMSARRAY = 484,
+    F16SAMPLER1DSHADOW = 485,
+    F16SAMPLER2DSHADOW = 486,
+    F16SAMPLER1DARRAYSHADOW = 487,
+    F16SAMPLER2DARRAYSHADOW = 488,
+    F16SAMPLER2DRECTSHADOW = 489,
+    F16SAMPLERCUBESHADOW = 490,
+    F16SAMPLERCUBEARRAYSHADOW = 491,
+    SAMPLER = 492,
+    SAMPLERSHADOW = 493,
+    TEXTURE1D = 494,
+    TEXTURE2D = 495,
+    TEXTURE3D = 496,
+    TEXTURECUBE = 497,
+    TEXTURE1DARRAY = 498,
+    TEXTURE2DARRAY = 499,
+    ITEXTURE1D = 500,
+    ITEXTURE2D = 501,
+    ITEXTURE3D = 502,
+    ITEXTURECUBE = 503,
+    ITEXTURE1DARRAY = 504,
+    ITEXTURE2DARRAY = 505,
+    UTEXTURE1D = 506,
+    UTEXTURE2D = 507,
+    UTEXTURE3D = 508,
+    UTEXTURECUBE = 509,
+    UTEXTURE1DARRAY = 510,
+    UTEXTURE2DARRAY = 511,
+    TEXTURE2DRECT = 512,
+    ITEXTURE2DRECT = 513,
+    UTEXTURE2DRECT = 514,
+    TEXTUREBUFFER = 515,
+    ITEXTUREBUFFER = 516,
+    UTEXTUREBUFFER = 517,
+    TEXTURECUBEARRAY = 518,
+    ITEXTURECUBEARRAY = 519,
+    UTEXTURECUBEARRAY = 520,
+    TEXTURE2DMS = 521,
+    ITEXTURE2DMS = 522,
+    UTEXTURE2DMS = 523,
+    TEXTURE2DMSARRAY = 524,
+    ITEXTURE2DMSARRAY = 525,
+    UTEXTURE2DMSARRAY = 526,
+    F16TEXTURE1D = 527,
+    F16TEXTURE2D = 528,
+    F16TEXTURE3D = 529,
+    F16TEXTURE2DRECT = 530,
+    F16TEXTURECUBE = 531,
+    F16TEXTURE1DARRAY = 532,
+    F16TEXTURE2DARRAY = 533,
+    F16TEXTURECUBEARRAY = 534,
+    F16TEXTUREBUFFER = 535,
+    F16TEXTURE2DMS = 536,
+    F16TEXTURE2DMSARRAY = 537,
+    SUBPASSINPUT = 538,
+    SUBPASSINPUTMS = 539,
+    ISUBPASSINPUT = 540,
+    ISUBPASSINPUTMS = 541,
+    USUBPASSINPUT = 542,
+    USUBPASSINPUTMS = 543,
+    F16SUBPASSINPUT = 544,
+    F16SUBPASSINPUTMS = 545,
+    IMAGE1D = 546,
+    IIMAGE1D = 547,
+    UIMAGE1D = 548,
+    IMAGE2D = 549,
+    IIMAGE2D = 550,
+    UIMAGE2D = 551,
+    IMAGE3D = 552,
+    IIMAGE3D = 553,
+    UIMAGE3D = 554,
+    IMAGE2DRECT = 555,
+    IIMAGE2DRECT = 556,
+    UIMAGE2DRECT = 557,
+    IMAGECUBE = 558,
+    IIMAGECUBE = 559,
+    UIMAGECUBE = 560,
+    IMAGEBUFFER = 561,
+    IIMAGEBUFFER = 562,
+    UIMAGEBUFFER = 563,
+    IMAGE1DARRAY = 564,
+    IIMAGE1DARRAY = 565,
+    UIMAGE1DARRAY = 566,
+    IMAGE2DARRAY = 567,
+    IIMAGE2DARRAY = 568,
+    UIMAGE2DARRAY = 569,
+    IMAGECUBEARRAY = 570,
+    IIMAGECUBEARRAY = 571,
+    UIMAGECUBEARRAY = 572,
+    IMAGE2DMS = 573,
+    IIMAGE2DMS = 574,
+    UIMAGE2DMS = 575,
+    IMAGE2DMSARRAY = 576,
+    IIMAGE2DMSARRAY = 577,
+    UIMAGE2DMSARRAY = 578,
+    F16IMAGE1D = 579,
+    F16IMAGE2D = 580,
+    F16IMAGE3D = 581,
+    F16IMAGE2DRECT = 582,
+    F16IMAGECUBE = 583,
+    F16IMAGE1DARRAY = 584,
+    F16IMAGE2DARRAY = 585,
+    F16IMAGECUBEARRAY = 586,
+    F16IMAGEBUFFER = 587,
+    F16IMAGE2DMS = 588,
+    F16IMAGE2DMSARRAY = 589,
+    STRUCT = 590,
+    VOID = 591,
+    WHILE = 592,
+    IDENTIFIER = 593,
+    TYPE_NAME = 594,
+    FLOATCONSTANT = 595,
+    DOUBLECONSTANT = 596,
+    INT16CONSTANT = 597,
+    UINT16CONSTANT = 598,
+    INT32CONSTANT = 599,
+    UINT32CONSTANT = 600,
+    INTCONSTANT = 601,
+    UINTCONSTANT = 602,
+    INT64CONSTANT = 603,
+    UINT64CONSTANT = 604,
+    BOOLCONSTANT = 605,
+    FLOAT16CONSTANT = 606,
+    LEFT_OP = 607,
+    RIGHT_OP = 608,
+    INC_OP = 609,
+    DEC_OP = 610,
+    LE_OP = 611,
+    GE_OP = 612,
+    EQ_OP = 613,
+    NE_OP = 614,
+    AND_OP = 615,
+    OR_OP = 616,
+    XOR_OP = 617,
+    MUL_ASSIGN = 618,
+    DIV_ASSIGN = 619,
+    ADD_ASSIGN = 620,
+    MOD_ASSIGN = 621,
+    LEFT_ASSIGN = 622,
+    RIGHT_ASSIGN = 623,
+    AND_ASSIGN = 624,
+    XOR_ASSIGN = 625,
+    OR_ASSIGN = 626,
+    SUB_ASSIGN = 627,
+    LEFT_PAREN = 628,
+    RIGHT_PAREN = 629,
+    LEFT_BRACKET = 630,
+    RIGHT_BRACKET = 631,
+    LEFT_BRACE = 632,
+    RIGHT_BRACE = 633,
+    DOT = 634,
+    COMMA = 635,
+    COLON = 636,
+    EQUAL = 637,
+    SEMICOLON = 638,
+    BANG = 639,
+    DASH = 640,
+    TILDE = 641,
+    PLUS = 642,
+    STAR = 643,
+    SLASH = 644,
+    PERCENT = 645,
+    LEFT_ANGLE = 646,
+    RIGHT_ANGLE = 647,
+    VERTICAL_BAR = 648,
+    CARET = 649,
+    AMPERSAND = 650,
+    QUESTION = 651,
+    INVARIANT = 652,
+    PRECISE = 653,
+    HIGH_PRECISION = 654,
+    MEDIUM_PRECISION = 655,
+    LOW_PRECISION = 656,
+    PRECISION = 657,
+    PACKED = 658,
+    RESOURCE = 659,
+    SUPERP = 660
   };
 #endif
 
@@ -338,7 +456,7 @@
 
 union YYSTYPE
 {
-#line 68 "MachineIndependent/glslang.y" /* yacc.c:1909  */
+#line 70 "MachineIndependent/glslang.y" /* yacc.c:1909  */
 
     struct {
         glslang::TSourceLoc loc;
@@ -360,6 +478,7 @@
             TIntermNode* intermNode;
             glslang::TIntermNodePair nodePair;
             glslang::TIntermTyped* intermTypedNode;
+            glslang::TAttributes* attributes;
         };
         union {
             glslang::TPublicType type;
@@ -372,7 +491,7 @@
         };
     } interm;
 
-#line 376 "MachineIndependent/glslang_tab.cpp.h" /* yacc.c:1909  */
+#line 495 "MachineIndependent/glslang_tab.cpp.h" /* yacc.c:1909  */
 };
 
 typedef union YYSTYPE YYSTYPE;
diff --git a/glslang/MachineIndependent/intermOut.cpp b/glslang/MachineIndependent/intermOut.cpp
index e5b555b..5ad6790 100644
--- a/glslang/MachineIndependent/intermOut.cpp
+++ b/glslang/MachineIndependent/intermOut.cpp
@@ -1,6 +1,7 @@
 //
 // Copyright (C) 2002-2005  3Dlabs Inc. Ltd.
 // Copyright (C) 2012-2016 LunarG, Inc.
+// Copyright (C) 2017 ARM Limited.
 //
 // All rights reserved.
 //
@@ -92,7 +93,13 @@
 //
 class TOutputTraverser : public TIntermTraverser {
 public:
-    TOutputTraverser(TInfoSink& i) : infoSink(i) { }
+    TOutputTraverser(TInfoSink& i) : infoSink(i), extraOutput(NoExtraOutput) { }
+
+    enum EExtraOutput {
+        NoExtraOutput,
+        BinaryDoubleOutput
+    };
+    void setDoubleOutput(EExtraOutput extra) { extraOutput = extra; }
 
     virtual bool visitBinary(TVisit, TIntermBinary* node);
     virtual bool visitUnary(TVisit, TIntermUnary* node);
@@ -108,6 +115,8 @@
 protected:
     TOutputTraverser(TOutputTraverser&);
     TOutputTraverser& operator=(TOutputTraverser&);
+
+    EExtraOutput extraOutput;
 };
 
 //
@@ -196,6 +205,7 @@
     case EOpLogicalOr:  out.debug << "logical-or";   break;
     case EOpLogicalXor: out.debug << "logical-xor"; break;
     case EOpLogicalAnd: out.debug << "logical-and"; break;
+
     default: out.debug << "<unknown op>";
     }
 
@@ -223,48 +233,192 @@
     case EOpPreIncrement:   out.debug << "Pre-Increment";        break;
     case EOpPreDecrement:   out.debug << "Pre-Decrement";        break;
 
+    // * -> bool
+    case EOpConvInt8ToBool:    out.debug << "Convert int8_t to bool";  break;
+    case EOpConvUint8ToBool:   out.debug << "Convert uint8_t to bool"; break;
+    case EOpConvInt16ToBool:   out.debug << "Convert int16_t to bool"; break;
+    case EOpConvUint16ToBool:  out.debug << "Convert uint16_t to bool";break;
     case EOpConvIntToBool:     out.debug << "Convert int to bool";     break;
     case EOpConvUintToBool:    out.debug << "Convert uint to bool";    break;
-    case EOpConvFloatToBool:   out.debug << "Convert float to bool";   break;
-    case EOpConvDoubleToBool:  out.debug << "Convert double to bool";  break;
     case EOpConvInt64ToBool:   out.debug << "Convert int64 to bool";   break;
     case EOpConvUint64ToBool:  out.debug << "Convert uint64 to bool";  break;
-    case EOpConvIntToFloat:    out.debug << "Convert int to float";    break;
-    case EOpConvUintToFloat:   out.debug << "Convert uint to float";   break;
-    case EOpConvDoubleToFloat: out.debug << "Convert double to float"; break;
-    case EOpConvInt64ToFloat:  out.debug << "Convert int64 to float";  break;
-    case EOpConvUint64ToFloat: out.debug << "Convert uint64 to float"; break;
-    case EOpConvBoolToFloat:   out.debug << "Convert bool to float";   break;
-    case EOpConvUintToInt:     out.debug << "Convert uint to int";     break;
-    case EOpConvFloatToInt:    out.debug << "Convert float to int";    break;
-    case EOpConvDoubleToInt:   out.debug << "Convert double to int";   break;
-    case EOpConvBoolToInt:     out.debug << "Convert bool to int";     break;
-    case EOpConvInt64ToInt:    out.debug << "Convert int64 to int";    break;
-    case EOpConvUint64ToInt:   out.debug << "Convert uint64 to int";   break;
-    case EOpConvIntToUint:     out.debug << "Convert int to uint";     break;
-    case EOpConvFloatToUint:   out.debug << "Convert float to uint";   break;
-    case EOpConvDoubleToUint:  out.debug << "Convert double to uint";  break;
+    case EOpConvFloat16ToBool: out.debug << "Convert float16_t to bool";   break;
+    case EOpConvFloatToBool:   out.debug << "Convert float to bool";   break;
+    case EOpConvDoubleToBool:  out.debug << "Convert double to bool";  break;
+
+    // bool -> *
+    case EOpConvBoolToInt8:    out.debug << "Convert bool to int8_t";  break;
+    case EOpConvBoolToUint8:   out.debug << "Convert bool to uint8_t"; break;
+    case EOpConvBoolToInt16:   out.debug << "Convert bool to in16t_t"; break;
+    case EOpConvBoolToUint16:  out.debug << "Convert bool to uint16_t";break;
+    case EOpConvBoolToInt:     out.debug << "Convert bool to int"  ;   break;
     case EOpConvBoolToUint:    out.debug << "Convert bool to uint";    break;
-    case EOpConvInt64ToUint:   out.debug << "Convert int64 to uint";   break;
-    case EOpConvUint64ToUint:  out.debug << "Convert uint64 to uint";  break;
+    case EOpConvBoolToInt64:   out.debug << "Convert bool to int64"; break;
+    case EOpConvBoolToUint64:  out.debug << "Convert bool to uint64";break;
+    case EOpConvBoolToFloat16: out.debug << "Convert bool to float16_t";   break;
+    case EOpConvBoolToFloat:   out.debug << "Convert bool to float";   break;
+    case EOpConvBoolToDouble:  out.debug << "Convert bool to double";   break;
+
+    // int8_t -> (u)int*
+    case EOpConvInt8ToInt16:   out.debug << "Convert int8_t to int16_t";break;
+    case EOpConvInt8ToInt:     out.debug << "Convert int8_t to int";    break;
+    case EOpConvInt8ToInt64:   out.debug << "Convert int8_t to int64";   break;
+    case EOpConvInt8ToUint8:   out.debug << "Convert int8_t to uint8_t";break;
+    case EOpConvInt8ToUint16:  out.debug << "Convert int8_t to uint16_t";break;
+    case EOpConvInt8ToUint:    out.debug << "Convert int8_t to uint";    break;
+    case EOpConvInt8ToUint64:  out.debug << "Convert int8_t to uint64";   break;
+
+    // uint8_t -> (u)int*
+    case EOpConvUint8ToInt8:    out.debug << "Convert uint8_t to int8_t";break;
+    case EOpConvUint8ToInt16:   out.debug << "Convert uint8_t to int16_t";break;
+    case EOpConvUint8ToInt:     out.debug << "Convert uint8_t to int";    break;
+    case EOpConvUint8ToInt64:   out.debug << "Convert uint8_t to int64";   break;
+    case EOpConvUint8ToUint16:  out.debug << "Convert uint8_t to uint16_t";break;
+    case EOpConvUint8ToUint:    out.debug << "Convert uint8_t to uint";    break;
+    case EOpConvUint8ToUint64:  out.debug << "Convert uint8_t to uint64";   break;
+
+    // int8_t -> float*
+    case EOpConvInt8ToFloat16:  out.debug << "Convert int8_t to float16_t";break;
+    case EOpConvInt8ToFloat:    out.debug << "Convert int8_t to float";    break;
+    case EOpConvInt8ToDouble:   out.debug << "Convert int8_t to double";   break;
+
+    // uint8_t -> float*
+    case EOpConvUint8ToFloat16: out.debug << "Convert uint8_t to float16_t";break;
+    case EOpConvUint8ToFloat:   out.debug << "Convert uint8_t to float";    break;
+    case EOpConvUint8ToDouble:  out.debug << "Convert uint8_t to double";   break;
+
+    // int16_t -> (u)int*
+    case EOpConvInt16ToInt8:    out.debug << "Convert int16_t to int8_t";break;
+    case EOpConvInt16ToInt:     out.debug << "Convert int16_t to int";    break;
+    case EOpConvInt16ToInt64:   out.debug << "Convert int16_t to int64";   break;
+    case EOpConvInt16ToUint8:   out.debug << "Convert int16_t to uint8_t";break;
+    case EOpConvInt16ToUint16:  out.debug << "Convert int16_t to uint16_t";break;
+    case EOpConvInt16ToUint:    out.debug << "Convert int16_t to uint";    break;
+    case EOpConvInt16ToUint64:  out.debug << "Convert int16_t to uint64";   break;
+
+    // int16_t -> float*
+    case EOpConvInt16ToFloat16:  out.debug << "Convert int16_t to float16_t";break;
+    case EOpConvInt16ToFloat:    out.debug << "Convert int16_t to float";    break;
+    case EOpConvInt16ToDouble:   out.debug << "Convert int16_t to double";   break;
+
+    // uint16_t -> (u)int*
+    case EOpConvUint16ToInt8:    out.debug << "Convert uint16_t to int8_t";break;
+    case EOpConvUint16ToInt16:   out.debug << "Convert uint16_t to int16_t";break;
+    case EOpConvUint16ToInt:     out.debug << "Convert uint16_t to int";    break;
+    case EOpConvUint16ToInt64:   out.debug << "Convert uint16_t to int64";   break;
+    case EOpConvUint16ToUint8:   out.debug << "Convert uint16_t to uint8_t";break;
+    case EOpConvUint16ToUint:    out.debug << "Convert uint16_t to uint";    break;
+    case EOpConvUint16ToUint64:  out.debug << "Convert uint16_t to uint64";   break;
+
+    // uint16_t -> float*
+    case EOpConvUint16ToFloat16: out.debug << "Convert uint16_t to float16_t";break;
+    case EOpConvUint16ToFloat:   out.debug << "Convert uint16_t to float";    break;
+    case EOpConvUint16ToDouble:  out.debug << "Convert uint16_t to double";   break;
+
+    // int32_t -> (u)int*
+    case EOpConvIntToInt8:    out.debug << "Convert int to int8_t";break;
+    case EOpConvIntToInt16:   out.debug << "Convert int to int16_t";break;
+    case EOpConvIntToInt64:   out.debug << "Convert int to int64";   break;
+    case EOpConvIntToUint8:   out.debug << "Convert int to uint8_t";break;
+    case EOpConvIntToUint16:  out.debug << "Convert int to uint16_t";break;
+    case EOpConvIntToUint:    out.debug << "Convert int to uint";    break;
+    case EOpConvIntToUint64:  out.debug << "Convert int to uint64";   break;
+
+    // int32_t -> float*
+    case EOpConvIntToFloat16:  out.debug << "Convert int to float16_t";break;
+    case EOpConvIntToFloat:    out.debug << "Convert int to float";    break;
     case EOpConvIntToDouble:   out.debug << "Convert int to double";   break;
-    case EOpConvUintToDouble:  out.debug << "Convert uint to double";  break;
-    case EOpConvFloatToDouble: out.debug << "Convert float to double"; break;
-    case EOpConvBoolToDouble:  out.debug << "Convert bool to double";  break;
-    case EOpConvInt64ToDouble: out.debug << "Convert int64 to double"; break;
-    case EOpConvUint64ToDouble: out.debug << "Convert uint64 to double";  break;
-    case EOpConvBoolToInt64:   out.debug << "Convert bool to int64";   break;
-    case EOpConvIntToInt64:    out.debug << "Convert int to int64";    break;
+
+    // uint32_t -> (u)int*
+    case EOpConvUintToInt8:    out.debug << "Convert uint to int8_t";break;
+    case EOpConvUintToInt16:   out.debug << "Convert uint to int16_t";break;
+    case EOpConvUintToInt:     out.debug << "Convert uint to int";break;
     case EOpConvUintToInt64:   out.debug << "Convert uint to int64";   break;
-    case EOpConvFloatToInt64:  out.debug << "Convert float to int64";  break;
-    case EOpConvDoubleToInt64: out.debug << "Convert double to int64"; break;
-    case EOpConvUint64ToInt64: out.debug << "Convert uint64 to int64"; break;
-    case EOpConvBoolToUint64:  out.debug << "Convert bool to uint64";  break;
-    case EOpConvIntToUint64:   out.debug << "Convert int to uint64";   break;
-    case EOpConvUintToUint64:  out.debug << "Convert uint to uint64";  break;
+    case EOpConvUintToUint8:   out.debug << "Convert uint to uint8_t";break;
+    case EOpConvUintToUint16:  out.debug << "Convert uint to uint16_t";break;
+    case EOpConvUintToUint64:  out.debug << "Convert uint to uint64";   break;
+
+    // uint32_t -> float*
+    case EOpConvUintToFloat16: out.debug << "Convert uint to float16_t";break;
+    case EOpConvUintToFloat:   out.debug << "Convert uint to float";    break;
+    case EOpConvUintToDouble:  out.debug << "Convert uint to double";   break;
+
+    // int64 -> (u)int*
+    case EOpConvInt64ToInt8:    out.debug << "Convert int64 to int8_t";  break;
+    case EOpConvInt64ToInt16:   out.debug << "Convert int64 to int16_t"; break;
+    case EOpConvInt64ToInt:     out.debug << "Convert int64 to int";   break;
+    case EOpConvInt64ToUint8:   out.debug << "Convert int64 to uint8_t";break;
+    case EOpConvInt64ToUint16:  out.debug << "Convert int64 to uint16_t";break;
+    case EOpConvInt64ToUint:    out.debug << "Convert int64 to uint";    break;
+    case EOpConvInt64ToUint64:  out.debug << "Convert int64 to uint64";   break;
+
+     // int64 -> float*
+    case EOpConvInt64ToFloat16:  out.debug << "Convert int64 to float16_t";break;
+    case EOpConvInt64ToFloat:    out.debug << "Convert int64 to float";    break;
+    case EOpConvInt64ToDouble:   out.debug << "Convert int64 to double";   break;
+
+    // uint64 -> (u)int*
+    case EOpConvUint64ToInt8:    out.debug << "Convert uint64 to int8_t";break;
+    case EOpConvUint64ToInt16:   out.debug << "Convert uint64 to int16_t";break;
+    case EOpConvUint64ToInt:     out.debug << "Convert uint64 to int";    break;
+    case EOpConvUint64ToInt64:   out.debug << "Convert uint64 to int64";   break;
+    case EOpConvUint64ToUint8:   out.debug << "Convert uint64 to uint8_t";break;
+    case EOpConvUint64ToUint16:  out.debug << "Convert uint64 to uint16";    break;
+    case EOpConvUint64ToUint:    out.debug << "Convert uint64 to uint";   break;
+
+    // uint64 -> float*
+    case EOpConvUint64ToFloat16: out.debug << "Convert uint64 to float16_t";break;
+    case EOpConvUint64ToFloat:   out.debug << "Convert uint64 to float";    break;
+    case EOpConvUint64ToDouble:  out.debug << "Convert uint64 to double";   break;
+
+    // float16_t -> int*
+    case EOpConvFloat16ToInt8:  out.debug << "Convert float16_t to int8_t"; break;
+    case EOpConvFloat16ToInt16: out.debug << "Convert float16_t to int16_t"; break;
+    case EOpConvFloat16ToInt:   out.debug << "Convert float16_t to int"; break;
+    case EOpConvFloat16ToInt64: out.debug << "Convert float16_t to int64"; break;
+
+    // float16_t -> uint*
+    case EOpConvFloat16ToUint8:  out.debug << "Convert float16_t to uint8_t"; break;
+    case EOpConvFloat16ToUint16: out.debug << "Convert float16_t to uint16_t"; break;
+    case EOpConvFloat16ToUint:   out.debug << "Convert float16_t to uint"; break;
+    case EOpConvFloat16ToUint64: out.debug << "Convert float16_t to uint64"; break;
+
+    // float16_t -> float*
+    case EOpConvFloat16ToFloat:  out.debug << "Convert float16_t to float"; break;
+    case EOpConvFloat16ToDouble: out.debug << "Convert float16_t to double"; break;
+
+    // float32 -> float*
+    case EOpConvFloatToFloat16: out.debug << "Convert float to float16_t"; break;
+    case EOpConvFloatToDouble:  out.debug << "Convert float to double"; break;
+
+    // float32_t -> int*
+    case EOpConvFloatToInt8:  out.debug << "Convert float to int8_t"; break;
+    case EOpConvFloatToInt16: out.debug << "Convert float to int16_t"; break;
+    case EOpConvFloatToInt:   out.debug << "Convert float to int"; break;
+    case EOpConvFloatToInt64: out.debug << "Convert float to int64"; break;
+
+    // float32_t -> uint*
+    case EOpConvFloatToUint8:  out.debug << "Convert float to uint8_t"; break;
+    case EOpConvFloatToUint16: out.debug << "Convert float to uint16_t"; break;
+    case EOpConvFloatToUint:   out.debug << "Convert float to uint"; break;
     case EOpConvFloatToUint64: out.debug << "Convert float to uint64"; break;
+
+    // double -> float*
+    case EOpConvDoubleToFloat16: out.debug << "Convert double to float16_t"; break;
+    case EOpConvDoubleToFloat:   out.debug << "Convert double to float"; break;
+
+    // double -> int*
+    case EOpConvDoubleToInt8:  out.debug << "Convert double to int8_t"; break;
+    case EOpConvDoubleToInt16: out.debug << "Convert double to int16_t"; break;
+    case EOpConvDoubleToInt:   out.debug << "Convert double to int"; break;
+    case EOpConvDoubleToInt64: out.debug << "Convert double to int64"; break;
+
+    // float32_t -> uint*
+    case EOpConvDoubleToUint8:  out.debug << "Convert double to uint8_t"; break;
+    case EOpConvDoubleToUint16: out.debug << "Convert double to uint16_t"; break;
+    case EOpConvDoubleToUint:   out.debug << "Convert double to uint"; break;
     case EOpConvDoubleToUint64: out.debug << "Convert double to uint64"; break;
-    case EOpConvInt64ToUint64: out.debug << "Convert uint64 to uint64"; break;
+
 
     case EOpRadians:        out.debug << "radians";              break;
     case EOpDegrees:        out.debug << "degrees";              break;
@@ -308,12 +462,23 @@
     case EOpDoubleBitsToUint64: out.debug << "doubleBitsToUint64"; break;
     case EOpInt64BitsToDouble:  out.debug << "int64BitsToDouble";  break;
     case EOpUint64BitsToDouble: out.debug << "uint64BitsToDouble"; break;
+    case EOpFloat16BitsToInt16:  out.debug << "float16BitsToInt16";  break;
+    case EOpFloat16BitsToUint16: out.debug << "float16BitsToUint16"; break;
+    case EOpInt16BitsToFloat16:  out.debug << "int16BitsToFloat16";  break;
+    case EOpUint16BitsToFloat16: out.debug << "uint16BitsToFloat16"; break;
+
     case EOpPackSnorm2x16:  out.debug << "packSnorm2x16";        break;
     case EOpUnpackSnorm2x16:out.debug << "unpackSnorm2x16";      break;
     case EOpPackUnorm2x16:  out.debug << "packUnorm2x16";        break;
     case EOpUnpackUnorm2x16:out.debug << "unpackUnorm2x16";      break;
     case EOpPackHalf2x16:   out.debug << "packHalf2x16";         break;
     case EOpUnpackHalf2x16: out.debug << "unpackHalf2x16";       break;
+    case EOpPack16:           out.debug << "pack16";                 break;
+    case EOpPack32:           out.debug << "pack32";                 break;
+    case EOpPack64:           out.debug << "pack64";                 break;
+    case EOpUnpack32:         out.debug << "unpack32";               break;
+    case EOpUnpack16:         out.debug << "unpack16";               break;
+    case EOpUnpack8:          out.debug << "unpack8";               break;
 
     case EOpPackSnorm4x8:     out.debug << "PackSnorm4x8";       break;
     case EOpUnpackSnorm4x8:   out.debug << "UnpackSnorm4x8";     break;
@@ -327,10 +492,17 @@
     case EOpPackUint2x32:     out.debug << "packUint2x32";       break;
     case EOpUnpackUint2x32:   out.debug << "unpackUint2x32";     break;
 
-#ifdef AMD_EXTENSIONS
+    case EOpPackInt2x16:      out.debug << "packInt2x16";        break;
+    case EOpUnpackInt2x16:    out.debug << "unpackInt2x16";      break;
+    case EOpPackUint2x16:     out.debug << "packUint2x16";       break;
+    case EOpUnpackUint2x16:   out.debug << "unpackUint2x16";     break;
+
+    case EOpPackInt4x16:      out.debug << "packInt4x16";        break;
+    case EOpUnpackInt4x16:    out.debug << "unpackInt4x16";      break;
+    case EOpPackUint4x16:     out.debug << "packUint4x16";       break;
+    case EOpUnpackUint4x16:   out.debug << "unpackUint4x16";     break;
     case EOpPackFloat2x16:    out.debug << "packFloat2x16";      break;
     case EOpUnpackFloat2x16:  out.debug << "unpackFloat2x16";    break;
-#endif
 
     case EOpLength:         out.debug << "length";               break;
     case EOpNormalize:      out.debug << "normalize";            break;
@@ -384,12 +556,90 @@
     case EOpAllInvocations:         out.debug << "allInvocations";        break;
     case EOpAllInvocationsEqual:    out.debug << "allInvocationsEqual";   break;
 
+    case EOpSubgroupElect:                   out.debug << "subgroupElect";                   break;
+    case EOpSubgroupAll:                     out.debug << "subgroupAll";                     break;
+    case EOpSubgroupAny:                     out.debug << "subgroupAny";                     break;
+    case EOpSubgroupAllEqual:                out.debug << "subgroupAllEqual";                break;
+    case EOpSubgroupBroadcast:               out.debug << "subgroupBroadcast";               break;
+    case EOpSubgroupBroadcastFirst:          out.debug << "subgroupBroadcastFirst";          break;
+    case EOpSubgroupBallot:                  out.debug << "subgroupBallot";                  break;
+    case EOpSubgroupInverseBallot:           out.debug << "subgroupInverseBallot";           break;
+    case EOpSubgroupBallotBitExtract:        out.debug << "subgroupBallotBitExtract";        break;
+    case EOpSubgroupBallotBitCount:          out.debug << "subgroupBallotBitCount";          break;
+    case EOpSubgroupBallotInclusiveBitCount: out.debug << "subgroupBallotInclusiveBitCount"; break;
+    case EOpSubgroupBallotExclusiveBitCount: out.debug << "subgroupBallotExclusiveBitCount"; break;
+    case EOpSubgroupBallotFindLSB:           out.debug << "subgroupBallotFindLSB";           break;
+    case EOpSubgroupBallotFindMSB:           out.debug << "subgroupBallotFindMSB";           break;
+    case EOpSubgroupShuffle:                 out.debug << "subgroupShuffle";                 break;
+    case EOpSubgroupShuffleXor:              out.debug << "subgroupShuffleXor";              break;
+    case EOpSubgroupShuffleUp:               out.debug << "subgroupShuffleUp";               break;
+    case EOpSubgroupShuffleDown:             out.debug << "subgroupShuffleDown";             break;
+    case EOpSubgroupAdd:                     out.debug << "subgroupAdd";                     break;
+    case EOpSubgroupMul:                     out.debug << "subgroupMul";                     break;
+    case EOpSubgroupMin:                     out.debug << "subgroupMin";                     break;
+    case EOpSubgroupMax:                     out.debug << "subgroupMax";                     break;
+    case EOpSubgroupAnd:                     out.debug << "subgroupAnd";                     break;
+    case EOpSubgroupOr:                      out.debug << "subgroupOr";                      break;
+    case EOpSubgroupXor:                     out.debug << "subgroupXor";                     break;
+    case EOpSubgroupInclusiveAdd:            out.debug << "subgroupInclusiveAdd";            break;
+    case EOpSubgroupInclusiveMul:            out.debug << "subgroupInclusiveMul";            break;
+    case EOpSubgroupInclusiveMin:            out.debug << "subgroupInclusiveMin";            break;
+    case EOpSubgroupInclusiveMax:            out.debug << "subgroupInclusiveMax";            break;
+    case EOpSubgroupInclusiveAnd:            out.debug << "subgroupInclusiveAnd";            break;
+    case EOpSubgroupInclusiveOr:             out.debug << "subgroupInclusiveOr";             break;
+    case EOpSubgroupInclusiveXor:            out.debug << "subgroupInclusiveXor";            break;
+    case EOpSubgroupExclusiveAdd:            out.debug << "subgroupExclusiveAdd";            break;
+    case EOpSubgroupExclusiveMul:            out.debug << "subgroupExclusiveMul";            break;
+    case EOpSubgroupExclusiveMin:            out.debug << "subgroupExclusiveMin";            break;
+    case EOpSubgroupExclusiveMax:            out.debug << "subgroupExclusiveMax";            break;
+    case EOpSubgroupExclusiveAnd:            out.debug << "subgroupExclusiveAnd";            break;
+    case EOpSubgroupExclusiveOr:             out.debug << "subgroupExclusiveOr";             break;
+    case EOpSubgroupExclusiveXor:            out.debug << "subgroupExclusiveXor";            break;
+    case EOpSubgroupClusteredAdd:            out.debug << "subgroupClusteredAdd";            break;
+    case EOpSubgroupClusteredMul:            out.debug << "subgroupClusteredMul";            break;
+    case EOpSubgroupClusteredMin:            out.debug << "subgroupClusteredMin";            break;
+    case EOpSubgroupClusteredMax:            out.debug << "subgroupClusteredMax";            break;
+    case EOpSubgroupClusteredAnd:            out.debug << "subgroupClusteredAnd";            break;
+    case EOpSubgroupClusteredOr:             out.debug << "subgroupClusteredOr";             break;
+    case EOpSubgroupClusteredXor:            out.debug << "subgroupClusteredXor";            break;
+    case EOpSubgroupQuadBroadcast:           out.debug << "subgroupQuadBroadcast";           break;
+    case EOpSubgroupQuadSwapHorizontal:      out.debug << "subgroupQuadSwapHorizontal";      break;
+    case EOpSubgroupQuadSwapVertical:        out.debug << "subgroupQuadSwapVertical";        break;
+    case EOpSubgroupQuadSwapDiagonal:        out.debug << "subgroupQuadSwapDiagonal";        break;
+
+#ifdef NV_EXTENSIONS
+    case EOpSubgroupPartition:                          out.debug << "subgroupPartitionNV";                          break;
+    case EOpSubgroupPartitionedAdd:                     out.debug << "subgroupPartitionedAddNV";                     break;
+    case EOpSubgroupPartitionedMul:                     out.debug << "subgroupPartitionedMulNV";                     break;
+    case EOpSubgroupPartitionedMin:                     out.debug << "subgroupPartitionedMinNV";                     break;
+    case EOpSubgroupPartitionedMax:                     out.debug << "subgroupPartitionedMaxNV";                     break;
+    case EOpSubgroupPartitionedAnd:                     out.debug << "subgroupPartitionedAndNV";                     break;
+    case EOpSubgroupPartitionedOr:                      out.debug << "subgroupPartitionedOrNV";                      break;
+    case EOpSubgroupPartitionedXor:                     out.debug << "subgroupPartitionedXorNV";                     break;
+    case EOpSubgroupPartitionedInclusiveAdd:            out.debug << "subgroupPartitionedInclusiveAddNV";            break;
+    case EOpSubgroupPartitionedInclusiveMul:            out.debug << "subgroupPartitionedInclusiveMulNV";            break;
+    case EOpSubgroupPartitionedInclusiveMin:            out.debug << "subgroupPartitionedInclusiveMinNV";            break;
+    case EOpSubgroupPartitionedInclusiveMax:            out.debug << "subgroupPartitionedInclusiveMaxNV";            break;
+    case EOpSubgroupPartitionedInclusiveAnd:            out.debug << "subgroupPartitionedInclusiveAndNV";            break;
+    case EOpSubgroupPartitionedInclusiveOr:             out.debug << "subgroupPartitionedInclusiveOrNV";             break;
+    case EOpSubgroupPartitionedInclusiveXor:            out.debug << "subgroupPartitionedInclusiveXorNV";            break;
+    case EOpSubgroupPartitionedExclusiveAdd:            out.debug << "subgroupPartitionedExclusiveAddNV";            break;
+    case EOpSubgroupPartitionedExclusiveMul:            out.debug << "subgroupPartitionedExclusiveMulNV";            break;
+    case EOpSubgroupPartitionedExclusiveMin:            out.debug << "subgroupPartitionedExclusiveMinNV";            break;
+    case EOpSubgroupPartitionedExclusiveMax:            out.debug << "subgroupPartitionedExclusiveMaxNV";            break;
+    case EOpSubgroupPartitionedExclusiveAnd:            out.debug << "subgroupPartitionedExclusiveAndNV";            break;
+    case EOpSubgroupPartitionedExclusiveOr:             out.debug << "subgroupPartitionedExclusiveOrNV";             break;
+    case EOpSubgroupPartitionedExclusiveXor:            out.debug << "subgroupPartitionedExclusiveXorNV";            break;
+#endif
+
     case EOpClip:                   out.debug << "clip";                  break;
     case EOpIsFinite:               out.debug << "isfinite";              break;
     case EOpLog10:                  out.debug << "log10";                 break;
     case EOpRcp:                    out.debug << "rcp";                   break;
     case EOpSaturate:               out.debug << "saturate";              break;
 
+    case EOpSparseTexelsResident:   out.debug << "sparseTexelsResident";  break;
+
 #ifdef AMD_EXTENSIONS
     case EOpMinInvocations:             out.debug << "minInvocations";              break;
     case EOpMaxInvocations:             out.debug << "maxInvocations";              break;
@@ -412,27 +662,18 @@
     case EOpMaxInvocationsExclusiveScanNonUniform:  out.debug << "maxInvocationsExclusiveScanNonUniform";   break;
     case EOpAddInvocationsExclusiveScanNonUniform:  out.debug << "addInvocationsExclusiveScanNonUniform";   break;
 
-    case EOpMbcnt:                      out.debug << "mbcnt";                       break;
+    case EOpMbcnt:                  out.debug << "mbcnt";                       break;
 
-    case EOpCubeFaceIndex:          out.debug << "cubeFaceIndex";         break;
-    case EOpCubeFaceCoord:          out.debug << "cubeFaceCoord";         break;
+    case EOpFragmentMaskFetch:      out.debug << "fragmentMaskFetchAMD";        break;
+    case EOpFragmentFetch:          out.debug << "fragmentFetchAMD";            break;
 
-    case EOpConvBoolToFloat16:      out.debug << "Convert bool to float16";     break;
-    case EOpConvIntToFloat16:       out.debug << "Convert int to float16";      break;
-    case EOpConvUintToFloat16:      out.debug << "Convert uint to float16";     break;
-    case EOpConvFloatToFloat16:     out.debug << "Convert float to float16";    break;
-    case EOpConvDoubleToFloat16:    out.debug << "Convert double to float16";   break;
-    case EOpConvInt64ToFloat16:     out.debug << "Convert int64 to float16";    break;
-    case EOpConvUint64ToFloat16:    out.debug << "Convert uint64 to float16";   break;
-    case EOpConvFloat16ToBool:      out.debug << "Convert float16 to bool";     break;
-    case EOpConvFloat16ToInt:       out.debug << "Convert float16 to int";      break;
-    case EOpConvFloat16ToUint:      out.debug << "Convert float16 to uint";     break;
-    case EOpConvFloat16ToFloat:     out.debug << "Convert float16 to float";    break;
-    case EOpConvFloat16ToDouble:    out.debug << "Convert float16 to double";   break;
-    case EOpConvFloat16ToInt64:     out.debug << "Convert float16 to int64";    break;
-    case EOpConvFloat16ToUint64:    out.debug << "Convert float16 to uint64";   break;
+    case EOpCubeFaceIndex:          out.debug << "cubeFaceIndex";               break;
+    case EOpCubeFaceCoord:          out.debug << "cubeFaceCoord";               break;
 #endif
 
+    case EOpSubpassLoad:   out.debug << "subpassLoad";   break;
+    case EOpSubpassLoadMS: out.debug << "subpassLoadMS"; break;
+
     default: out.debug.message(EPrefixError, "Bad unary op");
     }
 
@@ -464,29 +705,49 @@
 
     case EOpConstructFloat: out.debug << "Construct float"; break;
     case EOpConstructDouble:out.debug << "Construct double"; break;
+
     case EOpConstructVec2:  out.debug << "Construct vec2";  break;
     case EOpConstructVec3:  out.debug << "Construct vec3";  break;
     case EOpConstructVec4:  out.debug << "Construct vec4";  break;
+    case EOpConstructDVec2: out.debug << "Construct dvec2";  break;
+    case EOpConstructDVec3: out.debug << "Construct dvec3";  break;
+    case EOpConstructDVec4: out.debug << "Construct dvec4";  break;
     case EOpConstructBool:  out.debug << "Construct bool";  break;
     case EOpConstructBVec2: out.debug << "Construct bvec2"; break;
     case EOpConstructBVec3: out.debug << "Construct bvec3"; break;
     case EOpConstructBVec4: out.debug << "Construct bvec4"; break;
+    case EOpConstructInt8:   out.debug << "Construct int8_t";   break;
+    case EOpConstructI8Vec2: out.debug << "Construct i8vec2"; break;
+    case EOpConstructI8Vec3: out.debug << "Construct i8vec3"; break;
+    case EOpConstructI8Vec4: out.debug << "Construct i8vec4"; break;
     case EOpConstructInt:   out.debug << "Construct int";   break;
     case EOpConstructIVec2: out.debug << "Construct ivec2"; break;
     case EOpConstructIVec3: out.debug << "Construct ivec3"; break;
     case EOpConstructIVec4: out.debug << "Construct ivec4"; break;
+    case EOpConstructUint8:    out.debug << "Construct uint8_t";    break;
+    case EOpConstructU8Vec2:   out.debug << "Construct u8vec2";   break;
+    case EOpConstructU8Vec3:   out.debug << "Construct u8vec3";   break;
+    case EOpConstructU8Vec4:   out.debug << "Construct u8vec4";   break;
     case EOpConstructUint:    out.debug << "Construct uint";    break;
     case EOpConstructUVec2:   out.debug << "Construct uvec2";   break;
     case EOpConstructUVec3:   out.debug << "Construct uvec3";   break;
     case EOpConstructUVec4:   out.debug << "Construct uvec4";   break;
-    case EOpConstructInt64:   out.debug << "Construct int64_t"; break;
+    case EOpConstructInt64:   out.debug << "Construct int64"; break;
     case EOpConstructI64Vec2: out.debug << "Construct i64vec2"; break;
     case EOpConstructI64Vec3: out.debug << "Construct i64vec3"; break;
     case EOpConstructI64Vec4: out.debug << "Construct i64vec4"; break;
-    case EOpConstructUint64:  out.debug << "Construct uint64_t"; break;
+    case EOpConstructUint64:  out.debug << "Construct uint64"; break;
     case EOpConstructU64Vec2: out.debug << "Construct u64vec2"; break;
     case EOpConstructU64Vec3: out.debug << "Construct u64vec3"; break;
     case EOpConstructU64Vec4: out.debug << "Construct u64vec4"; break;
+    case EOpConstructInt16:   out.debug << "Construct int16_t"; break;
+    case EOpConstructI16Vec2: out.debug << "Construct i16vec2"; break;
+    case EOpConstructI16Vec3: out.debug << "Construct i16vec3"; break;
+    case EOpConstructI16Vec4: out.debug << "Construct i16vec4"; break;
+    case EOpConstructUint16:  out.debug << "Construct uint16_t"; break;
+    case EOpConstructU16Vec2: out.debug << "Construct u16vec2"; break;
+    case EOpConstructU16Vec3: out.debug << "Construct u16vec3"; break;
+    case EOpConstructU16Vec4: out.debug << "Construct u16vec4"; break;
     case EOpConstructMat2x2:  out.debug << "Construct mat2";    break;
     case EOpConstructMat2x3:  out.debug << "Construct mat2x3";  break;
     case EOpConstructMat2x4:  out.debug << "Construct mat2x4";  break;
@@ -505,7 +766,33 @@
     case EOpConstructDMat4x2: out.debug << "Construct dmat4x2"; break;
     case EOpConstructDMat4x3: out.debug << "Construct dmat4x3"; break;
     case EOpConstructDMat4x4: out.debug << "Construct dmat4";   break;
-#ifdef AMD_EXTENSIONS
+    case EOpConstructIMat2x2: out.debug << "Construct imat2";   break;
+    case EOpConstructIMat2x3: out.debug << "Construct imat2x3"; break;
+    case EOpConstructIMat2x4: out.debug << "Construct imat2x4"; break;
+    case EOpConstructIMat3x2: out.debug << "Construct imat3x2"; break;
+    case EOpConstructIMat3x3: out.debug << "Construct imat3";   break;
+    case EOpConstructIMat3x4: out.debug << "Construct imat3x4"; break;
+    case EOpConstructIMat4x2: out.debug << "Construct imat4x2"; break;
+    case EOpConstructIMat4x3: out.debug << "Construct imat4x3"; break;
+    case EOpConstructIMat4x4: out.debug << "Construct imat4";   break;
+    case EOpConstructUMat2x2: out.debug << "Construct umat2";   break;
+    case EOpConstructUMat2x3: out.debug << "Construct umat2x3"; break;
+    case EOpConstructUMat2x4: out.debug << "Construct umat2x4"; break;
+    case EOpConstructUMat3x2: out.debug << "Construct umat3x2"; break;
+    case EOpConstructUMat3x3: out.debug << "Construct umat3";   break;
+    case EOpConstructUMat3x4: out.debug << "Construct umat3x4"; break;
+    case EOpConstructUMat4x2: out.debug << "Construct umat4x2"; break;
+    case EOpConstructUMat4x3: out.debug << "Construct umat4x3"; break;
+    case EOpConstructUMat4x4: out.debug << "Construct umat4";   break;
+    case EOpConstructBMat2x2: out.debug << "Construct bmat2";   break;
+    case EOpConstructBMat2x3: out.debug << "Construct bmat2x3"; break;
+    case EOpConstructBMat2x4: out.debug << "Construct bmat2x4"; break;
+    case EOpConstructBMat3x2: out.debug << "Construct bmat3x2"; break;
+    case EOpConstructBMat3x3: out.debug << "Construct bmat3";   break;
+    case EOpConstructBMat3x4: out.debug << "Construct bmat3x4"; break;
+    case EOpConstructBMat4x2: out.debug << "Construct bmat4x2"; break;
+    case EOpConstructBMat4x3: out.debug << "Construct bmat4x3"; break;
+    case EOpConstructBMat4x4: out.debug << "Construct bmat4";   break;
     case EOpConstructFloat16:   out.debug << "Construct float16_t"; break;
     case EOpConstructF16Vec2:   out.debug << "Construct f16vec2";   break;
     case EOpConstructF16Vec3:   out.debug << "Construct f16vec3";   break;
@@ -519,7 +806,6 @@
     case EOpConstructF16Mat4x2: out.debug << "Construct f16mat4x2"; break;
     case EOpConstructF16Mat4x3: out.debug << "Construct f16mat4x3"; break;
     case EOpConstructF16Mat4x4: out.debug << "Construct f16mat4";   break;
-#endif
     case EOpConstructStruct:  out.debug << "Construct structure";  break;
     case EOpConstructTextureSampler: out.debug << "Construct combined texture-sampler"; break;
 
@@ -585,6 +871,18 @@
     case EOpAtomicXor:                  out.debug << "AtomicXor";             break;
     case EOpAtomicExchange:             out.debug << "AtomicExchange";        break;
     case EOpAtomicCompSwap:             out.debug << "AtomicCompSwap";        break;
+    case EOpAtomicLoad:                 out.debug << "AtomicLoad";            break;
+    case EOpAtomicStore:                out.debug << "AtomicStore";           break;
+
+    case EOpAtomicCounterAdd:           out.debug << "AtomicCounterAdd";      break;
+    case EOpAtomicCounterSubtract:      out.debug << "AtomicCounterSubtract"; break;
+    case EOpAtomicCounterMin:           out.debug << "AtomicCounterMin";      break;
+    case EOpAtomicCounterMax:           out.debug << "AtomicCounterMax";      break;
+    case EOpAtomicCounterAnd:           out.debug << "AtomicCounterAnd";      break;
+    case EOpAtomicCounterOr:            out.debug << "AtomicCounterOr";       break;
+    case EOpAtomicCounterXor:           out.debug << "AtomicCounterXor";      break;
+    case EOpAtomicCounterExchange:      out.debug << "AtomicCounterExchange"; break;
+    case EOpAtomicCounterCompSwap:      out.debug << "AtomicCounterCompSwap"; break;
 
     case EOpImageQuerySize:             out.debug << "imageQuerySize";        break;
     case EOpImageQuerySamples:          out.debug << "imageQuerySamples";     break;
@@ -598,6 +896,12 @@
     case EOpImageAtomicXor:             out.debug << "imageAtomicXor";        break;
     case EOpImageAtomicExchange:        out.debug << "imageAtomicExchange";   break;
     case EOpImageAtomicCompSwap:        out.debug << "imageAtomicCompSwap";   break;
+    case EOpImageAtomicLoad:            out.debug << "imageAtomicLoad";       break;
+    case EOpImageAtomicStore:           out.debug << "imageAtomicStore";      break;
+#ifdef AMD_EXTENSIONS
+    case EOpImageLoadLod:               out.debug << "imageLoadLod";          break;
+    case EOpImageStoreLod:              out.debug << "imageStoreLod";         break;
+#endif
 
     case EOpTextureQuerySize:           out.debug << "textureSize";           break;
     case EOpTextureQueryLod:            out.debug << "textureQueryLod";       break;
@@ -620,7 +924,45 @@
     case EOpTextureGather:              out.debug << "textureGather";         break;
     case EOpTextureGatherOffset:        out.debug << "textureGatherOffset";   break;
     case EOpTextureGatherOffsets:       out.debug << "textureGatherOffsets";  break;
+    case EOpTextureClamp:               out.debug << "textureClamp";          break;
+    case EOpTextureOffsetClamp:         out.debug << "textureOffsetClamp";    break;
+    case EOpTextureGradClamp:           out.debug << "textureGradClamp";      break;
+    case EOpTextureGradOffsetClamp:     out.debug << "textureGradOffsetClamp";  break;
+#ifdef AMD_EXTENSIONS
+    case EOpTextureGatherLod:           out.debug << "textureGatherLod";        break;
+    case EOpTextureGatherLodOffset:     out.debug << "textureGatherLodOffset";  break;
+    case EOpTextureGatherLodOffsets:    out.debug << "textureGatherLodOffsets"; break;
+#endif
 
+    case EOpSparseTexture:                  out.debug << "sparseTexture";                   break;
+    case EOpSparseTextureOffset:            out.debug << "sparseTextureOffset";             break;
+    case EOpSparseTextureLod:               out.debug << "sparseTextureLod";                break;
+    case EOpSparseTextureLodOffset:         out.debug << "sparseTextureLodOffset";          break;
+    case EOpSparseTextureFetch:             out.debug << "sparseTexelFetch";                break;
+    case EOpSparseTextureFetchOffset:       out.debug << "sparseTexelFetchOffset";          break;
+    case EOpSparseTextureGrad:              out.debug << "sparseTextureGrad";               break;
+    case EOpSparseTextureGradOffset:        out.debug << "sparseTextureGradOffset";         break;
+    case EOpSparseTextureGather:            out.debug << "sparseTextureGather";             break;
+    case EOpSparseTextureGatherOffset:      out.debug << "sparseTextureGatherOffset";       break;
+    case EOpSparseTextureGatherOffsets:     out.debug << "sparseTextureGatherOffsets";      break;
+    case EOpSparseImageLoad:                out.debug << "sparseImageLoad";                 break;
+    case EOpSparseTextureClamp:             out.debug << "sparseTextureClamp";              break;
+    case EOpSparseTextureOffsetClamp:       out.debug << "sparseTextureOffsetClamp";        break;
+    case EOpSparseTextureGradClamp:         out.debug << "sparseTextureGradClamp";          break;
+    case EOpSparseTextureGradOffsetClamp:   out.debug << "sparseTextureGradOffsetClam";     break;
+#ifdef AMD_EXTENSIONS
+    case EOpSparseTextureGatherLod:         out.debug << "sparseTextureGatherLod";          break;
+    case EOpSparseTextureGatherLodOffset:   out.debug << "sparseTextureGatherLodOffset";    break;
+    case EOpSparseTextureGatherLodOffsets:  out.debug << "sparseTextureGatherLodOffsets";   break;
+    case EOpSparseImageLoadLod:             out.debug << "sparseImageLoadLod";              break;
+#endif
+#ifdef NV_EXTENSIONS
+    case EOpImageSampleFootprintNV:             out.debug << "imageSampleFootprintNV";          break;
+    case EOpImageSampleFootprintClampNV:        out.debug << "imageSampleFootprintClampNV";     break;
+    case EOpImageSampleFootprintLodNV:          out.debug << "imageSampleFootprintLodNV";       break;
+    case EOpImageSampleFootprintGradNV:         out.debug << "imageSampleFootprintGradNV";      break;
+    case EOpImageSampleFootprintGradClampNV:    out.debug << "mageSampleFootprintGradClampNV";  break;
+#endif
     case EOpAddCarry:                   out.debug << "addCarry";              break;
     case EOpSubBorrow:                  out.debug << "subBorrow";             break;
     case EOpUMulExtended:               out.debug << "uMulExtended";          break;
@@ -642,10 +984,79 @@
     case EOpGenMul:                     out.debug << "mul";                   break;
 
     case EOpAllMemoryBarrierWithGroupSync:    out.debug << "AllMemoryBarrierWithGroupSync";    break;
-    case EOpGroupMemoryBarrierWithGroupSync: out.debug << "GroupMemoryBarrierWithGroupSync"; break;
+    case EOpDeviceMemoryBarrier:              out.debug << "DeviceMemoryBarrier";              break;
+    case EOpDeviceMemoryBarrierWithGroupSync: out.debug << "DeviceMemoryBarrierWithGroupSync"; break;
     case EOpWorkgroupMemoryBarrier:           out.debug << "WorkgroupMemoryBarrier";           break;
     case EOpWorkgroupMemoryBarrierWithGroupSync: out.debug << "WorkgroupMemoryBarrierWithGroupSync"; break;
 
+    case EOpSubgroupBarrier:                 out.debug << "subgroupBarrier"; break;
+    case EOpSubgroupMemoryBarrier:           out.debug << "subgroupMemoryBarrier"; break;
+    case EOpSubgroupMemoryBarrierBuffer:     out.debug << "subgroupMemoryBarrierBuffer"; break;
+    case EOpSubgroupMemoryBarrierImage:      out.debug << "subgroupMemoryBarrierImage";   break;
+    case EOpSubgroupMemoryBarrierShared:     out.debug << "subgroupMemoryBarrierShared"; break;
+    case EOpSubgroupElect:                   out.debug << "subgroupElect"; break;
+    case EOpSubgroupAll:                     out.debug << "subgroupAll"; break;
+    case EOpSubgroupAny:                     out.debug << "subgroupAny"; break;
+    case EOpSubgroupAllEqual:                out.debug << "subgroupAllEqual"; break;
+    case EOpSubgroupBroadcast:               out.debug << "subgroupBroadcast"; break;
+    case EOpSubgroupBroadcastFirst:          out.debug << "subgroupBroadcastFirst"; break;
+    case EOpSubgroupBallot:                  out.debug << "subgroupBallot"; break;
+    case EOpSubgroupInverseBallot:           out.debug << "subgroupInverseBallot"; break;
+    case EOpSubgroupBallotBitExtract:        out.debug << "subgroupBallotBitExtract"; break;
+    case EOpSubgroupBallotBitCount:          out.debug << "subgroupBallotBitCount"; break;
+    case EOpSubgroupBallotInclusiveBitCount: out.debug << "subgroupBallotInclusiveBitCount"; break;
+    case EOpSubgroupBallotExclusiveBitCount: out.debug << "subgroupBallotExclusiveBitCount"; break;
+    case EOpSubgroupBallotFindLSB:           out.debug << "subgroupBallotFindLSB"; break;
+    case EOpSubgroupBallotFindMSB:           out.debug << "subgroupBallotFindMSB"; break;
+    case EOpSubgroupShuffle:                 out.debug << "subgroupShuffle"; break;
+    case EOpSubgroupShuffleXor:              out.debug << "subgroupShuffleXor"; break;
+    case EOpSubgroupShuffleUp:               out.debug << "subgroupShuffleUp"; break;
+    case EOpSubgroupShuffleDown:             out.debug << "subgroupShuffleDown"; break;
+    case EOpSubgroupAdd:                     out.debug << "subgroupAdd"; break;
+    case EOpSubgroupMul:                     out.debug << "subgroupMul"; break;
+    case EOpSubgroupMin:                     out.debug << "subgroupMin"; break;
+    case EOpSubgroupMax:                     out.debug << "subgroupMax"; break;
+    case EOpSubgroupAnd:                     out.debug << "subgroupAnd"; break;
+    case EOpSubgroupOr:                      out.debug << "subgroupOr"; break;
+    case EOpSubgroupXor:                     out.debug << "subgroupXor"; break;
+    case EOpSubgroupInclusiveAdd:            out.debug << "subgroupInclusiveAdd"; break;
+    case EOpSubgroupInclusiveMul:            out.debug << "subgroupInclusiveMul"; break;
+    case EOpSubgroupInclusiveMin:            out.debug << "subgroupInclusiveMin"; break;
+    case EOpSubgroupInclusiveMax:            out.debug << "subgroupInclusiveMax"; break;
+    case EOpSubgroupInclusiveAnd:            out.debug << "subgroupInclusiveAnd"; break;
+    case EOpSubgroupInclusiveOr:             out.debug << "subgroupInclusiveOr"; break;
+    case EOpSubgroupInclusiveXor:            out.debug << "subgroupInclusiveXor"; break;
+    case EOpSubgroupExclusiveAdd:            out.debug << "subgroupExclusiveAdd"; break;
+    case EOpSubgroupExclusiveMul:            out.debug << "subgroupExclusiveMul"; break;
+    case EOpSubgroupExclusiveMin:            out.debug << "subgroupExclusiveMin"; break;
+    case EOpSubgroupExclusiveMax:            out.debug << "subgroupExclusiveMax"; break;
+    case EOpSubgroupExclusiveAnd:            out.debug << "subgroupExclusiveAnd"; break;
+    case EOpSubgroupExclusiveOr:             out.debug << "subgroupExclusiveOr"; break;
+    case EOpSubgroupExclusiveXor:            out.debug << "subgroupExclusiveXor"; break;
+    case EOpSubgroupClusteredAdd:            out.debug << "subgroupClusteredAdd"; break;
+    case EOpSubgroupClusteredMul:            out.debug << "subgroupClusteredMul"; break;
+    case EOpSubgroupClusteredMin:            out.debug << "subgroupClusteredMin"; break;
+    case EOpSubgroupClusteredMax:            out.debug << "subgroupClusteredMax"; break;
+    case EOpSubgroupClusteredAnd:            out.debug << "subgroupClusteredAnd"; break;
+    case EOpSubgroupClusteredOr:             out.debug << "subgroupClusteredOr"; break;
+    case EOpSubgroupClusteredXor:            out.debug << "subgroupClusteredXor"; break;
+    case EOpSubgroupQuadBroadcast:           out.debug << "subgroupQuadBroadcast"; break;
+    case EOpSubgroupQuadSwapHorizontal:      out.debug << "subgroupQuadSwapHorizontal"; break;
+    case EOpSubgroupQuadSwapVertical:        out.debug << "subgroupQuadSwapVertical"; break;
+    case EOpSubgroupQuadSwapDiagonal:        out.debug << "subgroupQuadSwapDiagonal"; break;
+
+    case EOpSubpassLoad:   out.debug << "subpassLoad";   break;
+    case EOpSubpassLoadMS: out.debug << "subpassLoadMS"; break;
+
+#ifdef NV_EXTENSIONS
+    case EOpTraceNV:                          out.debug << "traceNV"; break;
+    case EOpReportIntersectionNV:             out.debug << "reportIntersectionNV"; break;
+    case EOpIgnoreIntersectionNV:             out.debug << "ignoreIntersectionNV"; break;
+    case EOpTerminateRayNV:                   out.debug << "terminateRayNV"; break;
+    case EOpExecuteCallableNV:                out.debug << "executeCallableNV"; break;
+    case EOpWritePackedPrimitiveIndices4x8NV: out.debug << "writePackedPrimitiveIndices4x8NV"; break;
+#endif
+
     default: out.debug.message(EPrefixError, "Bad aggregation op");
     }
 
@@ -664,7 +1075,15 @@
     OutputTreeText(out, node, depth);
 
     out.debug << "Test condition and select";
-    out.debug << " (" << node->getCompleteString() << ")\n";
+    out.debug << " (" << node->getCompleteString() << ")";
+
+    if (node->getShortCircuit() == false)
+        out.debug << ": no shortcircuit";
+    if (node->getFlatten())
+        out.debug << ": Flatten";
+    if (node->getDontFlatten())
+        out.debug << ": DontFlatten";
+    out.debug << "\n";
 
     ++depth;
 
@@ -690,7 +1109,61 @@
     return false;
 }
 
-static void OutputConstantUnion(TInfoSink& out, const TIntermTyped* node, const TConstUnionArray& constUnion, int depth)
+// Print infinities and NaNs, and numbers in a portable way.
+// Goals:
+//   - portable (across IEEE 754 platforms)
+//   - shows all possible IEEE values
+//   - shows simple numbers in a simple way, e.g., no leading/trailing 0s
+//   - shows all digits, no premature rounding
+static void OutputDouble(TInfoSink& out, double value, TOutputTraverser::EExtraOutput extra)
+{
+    if (IsInfinity(value)) {
+        if (value < 0)
+            out.debug << "-1.#INF";
+        else
+            out.debug << "+1.#INF";
+    } else if (IsNan(value))
+        out.debug << "1.#IND";
+    else {
+        const int maxSize = 340;
+        char buf[maxSize];
+        const char* format = "%f";
+        if (fabs(value) > 0.0 && (fabs(value) < 1e-5 || fabs(value) > 1e12))
+            format = "%-.13e";
+        int len = snprintf(buf, maxSize, format, value);
+        assert(len < maxSize);
+
+        // remove a leading zero in the 100s slot in exponent; it is not portable
+        // pattern:   XX...XXXe+0XX or XX...XXXe-0XX
+        if (len > 5) {
+            if (buf[len-5] == 'e' && (buf[len-4] == '+' || buf[len-4] == '-') && buf[len-3] == '0') {
+                buf[len-3] = buf[len-2];
+                buf[len-2] = buf[len-1];
+                buf[len-1] = '\0';
+            }
+        }
+
+        out.debug << buf;
+
+        switch (extra) {
+        case TOutputTraverser::BinaryDoubleOutput:
+        {
+            out.debug << " : ";
+            long long b = *reinterpret_cast<long long*>(&value);
+            for (size_t i = 0; i < 8 * sizeof(value); ++i, ++b) {
+                out.debug << ((b & 0x8000000000000000) != 0 ? "1" : "0");
+                b <<= 1;
+            }
+            break;
+        }
+        default:
+            break;
+        }
+    }
+}
+
+static void OutputConstantUnion(TInfoSink& out, const TIntermTyped* node, const TConstUnionArray& constUnion,
+    TOutputTraverser::EExtraOutput extra, int depth)
 {
     int size = node->getType().computeNumComponents();
 
@@ -709,26 +1182,44 @@
             break;
         case EbtFloat:
         case EbtDouble:
-#ifdef AMD_EXTENSIONS
         case EbtFloat16:
-#endif
+            OutputDouble(out, constUnion[i].getDConst(), extra);
+            out.debug << "\n";
+            break;
+        case EbtInt8:
             {
-                const double value = constUnion[i].getDConst();
-                // Print infinities and NaNs in a portable way.
-                if (IsInfinity(value)) {
-                    if (value < 0)
-                        out.debug << "-1.#INF\n";
-                    else
-                        out.debug << "+1.#INF\n";
-                } else if (IsNan(value))
-                    out.debug << "1.#IND\n";
-                else {
-                    const int maxSize = 300;
-                    char buf[maxSize];
-                    snprintf(buf, maxSize, "%f", value);
+                const int maxSize = 300;
+                char buf[maxSize];
+                snprintf(buf, maxSize, "%d (%s)", constUnion[i].getI8Const(), "const int8_t");
 
-                    out.debug << buf << "\n";
-                }
+                out.debug << buf << "\n";
+            }
+            break;
+        case EbtUint8:
+            {
+                const int maxSize = 300;
+                char buf[maxSize];
+                snprintf(buf, maxSize, "%u (%s)", constUnion[i].getU8Const(), "const uint8_t");
+
+                out.debug << buf << "\n";
+            }
+            break;
+        case EbtInt16:
+            {
+                const int maxSize = 300;
+                char buf[maxSize];
+                snprintf(buf, maxSize, "%d (%s)", constUnion[i].getI16Const(), "const int16_t");
+
+                out.debug << buf << "\n";
+            }
+            break;
+        case EbtUint16:
+            {
+                const int maxSize = 300;
+                char buf[maxSize];
+                snprintf(buf, maxSize, "%u (%s)", constUnion[i].getU16Const(), "const uint16_t");
+
+                out.debug << buf << "\n";
             }
             break;
         case EbtInt:
@@ -779,7 +1270,7 @@
     OutputTreeText(infoSink, node, depth);
     infoSink.debug << "Constant:\n";
 
-    OutputConstantUnion(infoSink, node, node->getConstArray(), depth + 1);
+    OutputConstantUnion(infoSink, node, node->getConstArray(), extraOutput, depth + 1);
 }
 
 void TOutputTraverser::visitSymbol(TIntermSymbol* node)
@@ -789,7 +1280,7 @@
     infoSink.debug << "'" << node->getName() << "' (" << node->getCompleteString() << ")\n";
 
     if (! node->getConstArray().empty())
-        OutputConstantUnion(infoSink, node, node->getConstArray(), depth + 1);
+        OutputConstantUnion(infoSink, node, node->getConstArray(), extraOutput, depth + 1);
     else if (node->getConstSubtree()) {
         incrementDepth(node);
         node->getConstSubtree()->traverse(this);
@@ -806,7 +1297,17 @@
     out.debug << "Loop with condition ";
     if (! node->testFirst())
         out.debug << "not ";
-    out.debug << "tested first\n";
+    out.debug << "tested first";
+
+    if (node->getUnroll())
+        out.debug << ": Unroll";
+    if (node->getDontUnroll())
+        out.debug << ": DontUnroll";
+    if (node->getLoopDependency()) {
+        out.debug << ": Dependency ";
+        out.debug << node->getLoopDependency();
+    }
+    out.debug << "\n";
 
     ++depth;
 
@@ -867,7 +1368,13 @@
     TInfoSink& out = infoSink;
 
     OutputTreeText(out, node, depth);
-    out.debug << "switch\n";
+    out.debug << "switch";
+
+    if (node->getFlatten())
+        out.debug << ": Flatten";
+    if (node->getDontFlatten())
+        out.debug << ": DontFlatten";
+    out.debug << "\n";
 
     OutputTreeText(out, node, depth);
     out.debug << "condition\n";
@@ -938,6 +1445,8 @@
             infoSink.debug << "gl_FragCoord origin is upper left\n";
         if (earlyFragmentTests)
             infoSink.debug << "using early_fragment_tests\n";
+        if (postDepthCoverage)
+            infoSink.debug << "using post_depth_coverage\n";
         if (depthLayout != EldNone)
             infoSink.debug << "using " << TQualifier::getLayoutDepthString(depthLayout) << "\n";
         if (blendEquations != 0) {
@@ -951,6 +1460,16 @@
         }
         break;
 
+#ifdef NV_EXTENSIONS
+    case EShLangMeshNV:
+        infoSink.debug << "max_vertices = " << vertices << "\n";
+        infoSink.debug << "max_primitives = " << primitives << "\n";
+        infoSink.debug << "output primitive = " << TQualifier::getGeometryString(outputPrimitive) << "\n";
+        // Fall through
+
+    case EShLangTaskNV:
+        // Fall through
+#endif
     case EShLangCompute:
         infoSink.debug << "local_size = (" << localSize[0] << ", " << localSize[1] << ", " << localSize[2] << ")\n";
         {
@@ -973,7 +1492,8 @@
         return;
 
     TOutputTraverser it(infoSink);
-
+    if (getBinaryDoubleOutput())
+        it.setDoubleOutput(TOutputTraverser::BinaryDoubleOutput);
     treeRoot->traverse(&it);
 }
 
diff --git a/glslang/MachineIndependent/iomapper.cpp b/glslang/MachineIndependent/iomapper.cpp
old mode 100644
new mode 100755
index 882a432..46c7558
--- a/glslang/MachineIndependent/iomapper.cpp
+++ b/glslang/MachineIndependent/iomapper.cpp
@@ -132,7 +132,7 @@
             target = &inputList;
         else if (base->getQualifier().storage == EvqVaryingOut)
             target = &outputList;
-        else if (base->getQualifier().isUniformOrBuffer())
+        else if (base->getQualifier().isUniformOrBuffer() && !base->getQualifier().layoutPushConstant)
             target = &uniformList;
 
         if (target) {
@@ -214,6 +214,8 @@
     {
         resolver.notifyBinding(stage, ent.symbol->getName().c_str(), ent.symbol->getType(), ent.live);
     }
+private:
+    TNotifyUniformAdaptor& operator=(TNotifyUniformAdaptor&);
 };
 
 struct TNotifyInOutAdaptor
@@ -229,6 +231,8 @@
     {
         resolver.notifyInOut(stage, ent.symbol->getName().c_str(), ent.symbol->getType(), ent.live);
     }
+private:
+    TNotifyInOutAdaptor& operator=(TNotifyInOutAdaptor&);
 };
 
 struct TResolverUniformAdaptor
@@ -249,10 +253,14 @@
         ent.newBinding = -1;
         ent.newSet = -1;
         ent.newIndex = -1;
-        const bool isValid = resolver.validateBinding(stage, ent.symbol->getName().c_str(), ent.symbol->getType(), ent.live);
+        const bool isValid = resolver.validateBinding(stage, ent.symbol->getName().c_str(), ent.symbol->getType(),
+                                                             ent.live);
         if (isValid) {
-            ent.newBinding = resolver.resolveBinding(stage, ent.symbol->getName().c_str(), ent.symbol->getType(), ent.live);
+            ent.newBinding = resolver.resolveBinding(stage, ent.symbol->getName().c_str(), ent.symbol->getType(),
+                                                            ent.live);
             ent.newSet = resolver.resolveSet(stage, ent.symbol->getName().c_str(), ent.symbol->getType(), ent.live);
+            ent.newLocation = resolver.resolveUniformLocation(stage, ent.symbol->getName().c_str(),
+                                                                     ent.symbol->getType(), ent.live);
 
             if (ent.newBinding != -1) {
                 if (ent.newBinding >= int(TQualifier::layoutBindingEnd)) {
@@ -323,8 +331,14 @@
                                                       ent.symbol->getType(),
                                                       ent.live);
         } else {
-            TString errorMsg = "Invalid shader In/Out variable semantic: ";
-            errorMsg += ent.symbol->getType().getQualifier().semanticName;
+            TString errorMsg;
+            if (ent.symbol->getType().getQualifier().semanticName != nullptr) {
+                errorMsg = "Invalid shader In/Out variable semantic: ";
+                errorMsg += ent.symbol->getType().getQualifier().semanticName;
+            } else {
+                errorMsg = "Invalid shader In/Out variable: ";
+                errorMsg += ent.symbol->getName();
+            }
             infoSink.info.message(EPrefixInternalError, errorMsg.c_str());
             error = true;
         }
@@ -343,13 +357,23 @@
 // Base class for shared TIoMapResolver services, used by several derivations.
 struct TDefaultIoResolverBase : public glslang::TIoMapResolver
 {
-    int baseSamplerBinding;
-    int baseTextureBinding;
-    int baseImageBinding;
-    int baseUboBinding;
-    int baseSsboBinding;
-    int baseUavBinding;
-    bool doAutoMapping;
+    TDefaultIoResolverBase(const TIntermediate &intermediate) :
+        intermediate(intermediate),
+        nextUniformLocation(intermediate.getUniformLocationBase()),
+        nextInputLocation(0),
+        nextOutputLocation(0)
+    { }
+
+    int getBaseBinding(TResourceType res, unsigned int set) const {
+        return selectBaseBinding(intermediate.getShiftBinding(res), 
+                                 intermediate.getShiftBindingForSet(res, set));
+    }
+
+    const std::vector<std::string>& getResourceSetBinding() const { return intermediate.getResourceSetBinding(); }
+
+    bool doAutoBindingMapping() const { return intermediate.getAutoMapBindings(); }
+    bool doAutoLocationMapping() const { return intermediate.getAutoMapLocations(); }
+
     typedef std::vector<int> TSlotSet;
     typedef std::unordered_map<int, TSlotSet> TSlotSetMap;
     TSlotSetMap slots;
@@ -365,24 +389,34 @@
         return !(at != slots[set].end() && *at == slot);
     }
 
-    int reserveSlot(int set, int slot)
+    int reserveSlot(int set, int slot, int size = 1)
     {
         TSlotSet::iterator at = findSlot(set, slot);
-        slots[set].insert(at, slot);
+
+        // tolerate aliasing, by not double-recording aliases
+        // (policy about appropriateness of the alias is higher up)
+        for (int i = 0; i < size; i++) {
+                if (at == slots[set].end() || *at != slot + i)
+                        at = slots[set].insert(at, slot + i);
+                ++at;
+        }
+
         return slot;
     }
 
-    int getFreeSlot(int set, int base)
+    int getFreeSlot(int set, int base, int size = 1)
     {
         TSlotSet::iterator at = findSlot(set, base);
         if (at == slots[set].end())
-            return reserveSlot(set, base);
+            return reserveSlot(set, base, size);
 
-        // look in locksteps, if they not match, then there is a free slot
-        for (; at != slots[set].end(); ++at, ++base)
-            if (*at != base)
+        // look for a big enough gap
+        for (; at != slots[set].end(); ++at) {
+            if (*at - base >= size)
                 break;
-        return reserveSlot(set, base);
+            base = *at + 1;
+        }
+        return reserveSlot(set, base, size);
     }
 
     virtual bool validateBinding(EShLanguage /*stage*/, const char* /*name*/, const glslang::TType& type, bool /*is_live*/) override = 0;
@@ -393,16 +427,84 @@
     {
         if (type.getQualifier().hasSet())
             return type.getQualifier().layoutSet;
+
+        // If a command line or API option requested a single descriptor set, use that (if not overrided by spaceN)
+        if (getResourceSetBinding().size() == 1)
+            return atoi(getResourceSetBinding()[0].c_str());
+
         return 0;
     }
+    int resolveUniformLocation(EShLanguage /*stage*/, const char* name, const glslang::TType& type, bool /*is_live*/) override
+    {
+        // kick out of not doing this
+        if (!doAutoLocationMapping())
+            return -1;
 
+        // no locations added if already present, a built-in variable, a block, or an opaque
+        if (type.getQualifier().hasLocation() || type.isBuiltIn() ||
+            type.getBasicType() == EbtBlock ||
+            type.getBasicType() == EbtAtomicUint ||
+            (type.containsOpaque() && intermediate.getSpv().openGl == 0))
+            return -1;
+
+        // no locations on blocks of built-in variables
+        if (type.isStruct()) {
+            if (type.getStruct()->size() < 1)
+                return -1;
+            if ((*type.getStruct())[0].type->isBuiltIn())
+                return -1;
+        }
+
+        int location = intermediate.getUniformLocationOverride(name);
+        if (location != -1)
+            return location;
+
+        location = nextUniformLocation;
+
+        nextUniformLocation += TIntermediate::computeTypeUniformLocationSize(type);
+
+        return location;
+    }
     bool validateInOut(EShLanguage /*stage*/, const char* /*name*/, const TType& /*type*/, bool /*is_live*/) override
     {
         return true;
     }
-    int resolveInOutLocation(EShLanguage /*stage*/, const char* /*name*/, const TType& /*type*/, bool /*is_live*/) override
+    int resolveInOutLocation(EShLanguage stage, const char* /*name*/, const TType& type, bool /*is_live*/) override
     {
-        return -1;
+        // kick out of not doing this
+        if (!doAutoLocationMapping())
+            return -1;
+
+        // no locations added if already present, or a built-in variable
+        if (type.getQualifier().hasLocation() || type.isBuiltIn())
+            return -1;
+
+        // no locations on blocks of built-in variables
+        if (type.isStruct()) {
+            if (type.getStruct()->size() < 1)
+                return -1;
+            if ((*type.getStruct())[0].type->isBuiltIn())
+                return -1;
+        }
+
+        // point to the right input or output location counter
+        int& nextLocation = type.getQualifier().isPipeInput() ? nextInputLocation : nextOutputLocation;
+
+        // Placeholder. This does not do proper cross-stage lining up, nor
+        // work with mixed location/no-location declarations.
+        int location = nextLocation;
+        int typeLocationSize;
+        // Don’t take into account the outer-most array if the stage’s
+        // interface is automatically an array.
+        if (type.getQualifier().isArrayedIo(stage)) {
+                TType elementType(type, 0);
+                typeLocationSize = TIntermediate::computeTypeLocationSize(elementType, stage);
+        } else {
+                typeLocationSize = TIntermediate::computeTypeLocationSize(type, stage);
+        }
+        nextLocation += typeLocationSize;
+
+        return location;
     }
     int resolveInOutComponent(EShLanguage /*stage*/, const char* /*name*/, const TType& /*type*/, bool /*is_live*/) override
     {
@@ -415,9 +517,25 @@
 
     void notifyBinding(EShLanguage, const char* /*name*/, const TType&, bool /*is_live*/) override {}
     void notifyInOut(EShLanguage, const char* /*name*/, const TType&, bool /*is_live*/) override {}
-    void endNotifications() override {}
+    void endNotifications(EShLanguage) override {}
+    void beginNotifications(EShLanguage) override {}
+    void beginResolve(EShLanguage) override {}
+    void endResolve(EShLanguage) override {}
 
 protected:
+    TDefaultIoResolverBase(TDefaultIoResolverBase&);
+    TDefaultIoResolverBase& operator=(TDefaultIoResolverBase&);
+
+    const TIntermediate &intermediate;
+    int nextUniformLocation;
+    int nextInputLocation;
+    int nextOutputLocation;
+
+    // Return descriptor set specific base if there is one, and the generic base otherwise.
+    int selectBaseBinding(int base, int descriptorSetBase) const {
+        return descriptorSetBase != -1 ? descriptorSetBase : base;
+    }
+
     static int getLayoutSet(const glslang::TType& type) {
         if (type.getQualifier().hasSet())
             return type.getQualifier().layoutSet;
@@ -430,7 +548,8 @@
     }
 
     static bool isTextureType(const glslang::TType& type) {
-        return type.getBasicType() == glslang::EbtSampler && type.getSampler().isTexture();
+        return (type.getBasicType() == glslang::EbtSampler && 
+                (type.getSampler().isTexture() || type.getSampler().isSubpass()));
     }
 
     static bool isUboType(const glslang::TType& type) {
@@ -450,66 +569,52 @@
  */
 struct TDefaultIoResolver : public TDefaultIoResolverBase
 {
-    bool validateBinding(EShLanguage /*stage*/, const char* /*name*/, const glslang::TType& type, bool /*is_live*/) override
+    TDefaultIoResolver(const TIntermediate &intermediate) : TDefaultIoResolverBase(intermediate) { }
+
+    bool validateBinding(EShLanguage /*stage*/, const char* /*name*/, const glslang::TType& /*type*/, bool /*is_live*/) override
     {
-        if (type.getQualifier().hasBinding()) {
-            const int set = getLayoutSet(type);
-
-            if (isImageType(type))
-                return checkEmpty(set, baseImageBinding + type.getQualifier().layoutBinding);
-
-            if (isTextureType(type))
-                return checkEmpty(set, baseTextureBinding + type.getQualifier().layoutBinding);
-
-            if (isSsboType(type))
-                return checkEmpty(set, baseSsboBinding + type.getQualifier().layoutBinding);
-
-            if (isSamplerType(type))
-                return checkEmpty(set, baseSamplerBinding + type.getQualifier().layoutBinding);
-
-            if (isUboType(type))
-                return checkEmpty(set, baseUboBinding + type.getQualifier().layoutBinding);
-        }
         return true;
     }
 
     int resolveBinding(EShLanguage /*stage*/, const char* /*name*/, const glslang::TType& type, bool is_live) override
     {
         const int set = getLayoutSet(type);
+        // On OpenGL arrays of opaque types take a seperate binding for each element
+        int numBindings = intermediate.getSpv().openGl != 0 && type.isSizedArray() ? type.getCumulativeArraySize() : 1;
 
         if (type.getQualifier().hasBinding()) {
             if (isImageType(type))
-                return reserveSlot(set, baseImageBinding + type.getQualifier().layoutBinding);
-                
+                return reserveSlot(set, getBaseBinding(EResImage, set) + type.getQualifier().layoutBinding, numBindings);
+
             if (isTextureType(type))
-                return reserveSlot(set, baseTextureBinding + type.getQualifier().layoutBinding);
+                return reserveSlot(set, getBaseBinding(EResTexture, set) + type.getQualifier().layoutBinding, numBindings);
 
             if (isSsboType(type))
-                return reserveSlot(set, baseSsboBinding + type.getQualifier().layoutBinding);
+                return reserveSlot(set, getBaseBinding(EResSsbo, set) + type.getQualifier().layoutBinding, numBindings);
 
             if (isSamplerType(type))
-                return reserveSlot(set, baseSamplerBinding + type.getQualifier().layoutBinding);
+                return reserveSlot(set, getBaseBinding(EResSampler, set) + type.getQualifier().layoutBinding, numBindings);
 
             if (isUboType(type))
-                return reserveSlot(set, baseUboBinding + type.getQualifier().layoutBinding);
-        } else if (is_live && doAutoMapping) {
+                return reserveSlot(set, getBaseBinding(EResUbo, set) + type.getQualifier().layoutBinding, numBindings);
+        } else if (is_live && doAutoBindingMapping()) {
             // find free slot, the caller did make sure it passes all vars with binding
             // first and now all are passed that do not have a binding and needs one
 
             if (isImageType(type))
-                return getFreeSlot(set, baseImageBinding);
+                return getFreeSlot(set, getBaseBinding(EResImage, set), numBindings);
 
             if (isTextureType(type))
-                return getFreeSlot(set, baseTextureBinding);
+                return getFreeSlot(set, getBaseBinding(EResTexture, set), numBindings);
 
             if (isSsboType(type))
-                return getFreeSlot(set, baseSsboBinding);
+                return getFreeSlot(set, getBaseBinding(EResSsbo, set), numBindings);
 
             if (isSamplerType(type))
-                return getFreeSlot(set, baseSamplerBinding);
+                return getFreeSlot(set, getBaseBinding(EResSampler, set), numBindings);
 
             if (isUboType(type))
-                return getFreeSlot(set, baseUboBinding);
+                return getFreeSlot(set, getBaseBinding(EResUbo, set), numBindings);
         }
 
         return -1;
@@ -528,7 +633,7 @@
 /********************************************************************************
 The following IO resolver maps types in HLSL register space, as follows:
 
-t – for shader resource views (SRV)
+t - for shader resource views (SRV)
    TEXTURE1D
    TEXTURE1DARRAY
    TEXTURE2D
@@ -543,7 +648,7 @@
    BUFFER
    TBUFFER
     
-s – for samplers
+s - for samplers
    SAMPLER
    SAMPLER1D
    SAMPLER2D
@@ -552,7 +657,7 @@
    SAMPLERSTATE
    SAMPLERCOMPARISONSTATE
 
-u – for unordered access views (UAV)
+u - for unordered access views (UAV)
    RWBYTEADDRESSBUFFER
    RWSTRUCTUREDBUFFER
    APPENDSTRUCTUREDBUFFER
@@ -564,29 +669,16 @@
    RWTEXTURE2DARRAY
    RWTEXTURE3D
 
-b – for constant buffer views (CBV)
+b - for constant buffer views (CBV)
    CBUFFER
    CONSTANTBUFFER
  ********************************************************************************/
 struct TDefaultHlslIoResolver : public TDefaultIoResolverBase
 {
-    bool validateBinding(EShLanguage /*stage*/, const char* /*name*/, const glslang::TType& type, bool /*is_live*/) override
+    TDefaultHlslIoResolver(const TIntermediate &intermediate) : TDefaultIoResolverBase(intermediate) { }
+
+    bool validateBinding(EShLanguage /*stage*/, const char* /*name*/, const glslang::TType& /*type*/, bool /*is_live*/) override
     {
-        if (type.getQualifier().hasBinding()) {
-            const int set = getLayoutSet(type);
-
-            if (isUavType(type))
-                return checkEmpty(set, baseUavBinding + type.getQualifier().layoutBinding);
-
-            if (isSrvType(type))
-                return checkEmpty(set, baseTextureBinding + type.getQualifier().layoutBinding);
-
-            if (isSamplerType(type))
-                return checkEmpty(set, baseSamplerBinding + type.getQualifier().layoutBinding);
-
-            if (isUboType(type))
-                return checkEmpty(set, baseUboBinding + type.getQualifier().layoutBinding);
-        }
         return true;
     }
 
@@ -596,31 +688,31 @@
 
         if (type.getQualifier().hasBinding()) {
             if (isUavType(type))
-                return reserveSlot(set, baseUavBinding + type.getQualifier().layoutBinding);
+                return reserveSlot(set, getBaseBinding(EResUav, set) + type.getQualifier().layoutBinding);
 
             if (isSrvType(type))
-                return reserveSlot(set, baseTextureBinding + type.getQualifier().layoutBinding);
+                return reserveSlot(set, getBaseBinding(EResTexture, set) + type.getQualifier().layoutBinding);
 
             if (isSamplerType(type))
-                return reserveSlot(set, baseSamplerBinding + type.getQualifier().layoutBinding);
+                return reserveSlot(set, getBaseBinding(EResSampler, set) + type.getQualifier().layoutBinding);
 
             if (isUboType(type))
-                return reserveSlot(set, baseUboBinding + type.getQualifier().layoutBinding);
-        } else if (is_live && doAutoMapping) {
+                return reserveSlot(set, getBaseBinding(EResUbo, set) + type.getQualifier().layoutBinding);
+        } else if (is_live && doAutoBindingMapping()) {
             // find free slot, the caller did make sure it passes all vars with binding
             // first and now all are passed that do not have a binding and needs one
 
             if (isUavType(type))
-                return getFreeSlot(set, baseUavBinding);
+                return getFreeSlot(set, getBaseBinding(EResUav, set));
 
             if (isSrvType(type))
-                return getFreeSlot(set, baseTextureBinding);
+                return getFreeSlot(set, getBaseBinding(EResTexture, set));
 
             if (isSamplerType(type))
-                return getFreeSlot(set, baseSamplerBinding);
+                return getFreeSlot(set, getBaseBinding(EResSampler, set));
 
             if (isUboType(type))
-                return getFreeSlot(set, baseUboBinding);
+                return getFreeSlot(set, getBaseBinding(EResUbo, set));
         }
 
         return -1;
@@ -649,15 +741,17 @@
 // Returns false if the input is too malformed to do this.
 bool TIoMapper::addStage(EShLanguage stage, TIntermediate &intermediate, TInfoSink &infoSink, TIoMapResolver *resolver)
 {
-    // Trivial return if there is nothing to do.
-    if (intermediate.getShiftSamplerBinding() == 0 &&
-        intermediate.getShiftTextureBinding() == 0 &&
-        intermediate.getShiftImageBinding() == 0 &&
-        intermediate.getShiftUboBinding() == 0 &&
-        intermediate.getShiftSsboBinding() == 0 &&
-        intermediate.getShiftUavBinding() == 0 &&
-        intermediate.getAutoMapBindings() == false &&
-        resolver == nullptr)
+    bool somethingToDo = !intermediate.getResourceSetBinding().empty() ||
+        intermediate.getAutoMapBindings() ||
+        intermediate.getAutoMapLocations();
+
+    for (int res = 0; res < EResCount; ++res) {
+        somethingToDo = somethingToDo ||
+            (intermediate.getShiftBinding(TResourceType(res)) != 0) ||
+            intermediate.hasShiftBindingForSet(TResourceType(res));
+    }
+
+    if (!somethingToDo && resolver == nullptr)
         return true;
 
     if (intermediate.getNumEntryPoints() != 1 || intermediate.isRecursive())
@@ -668,27 +762,15 @@
         return false;
 
     // if no resolver is provided, use the default resolver with the given shifts and auto map settings
-    TDefaultIoResolver defaultResolver;
-    TDefaultHlslIoResolver defaultHlslResolver;
+    TDefaultIoResolver defaultResolver(intermediate);
+    TDefaultHlslIoResolver defaultHlslResolver(intermediate);
 
     if (resolver == nullptr) {
-        TDefaultIoResolverBase* resolverBase;
-
         // TODO: use a passed in IO mapper for this
         if (intermediate.usingHlslIoMapping())
-            resolverBase = &defaultHlslResolver;
+            resolver = &defaultHlslResolver;
         else
-            resolverBase = &defaultResolver;
-
-        resolverBase->baseSamplerBinding = intermediate.getShiftSamplerBinding();
-        resolverBase->baseTextureBinding = intermediate.getShiftTextureBinding();
-        resolverBase->baseImageBinding = intermediate.getShiftImageBinding();
-        resolverBase->baseUboBinding = intermediate.getShiftUboBinding();
-        resolverBase->baseSsboBinding = intermediate.getShiftSsboBinding();
-        resolverBase->baseUavBinding = intermediate.getShiftUavBinding();
-        resolverBase->doAutoMapping = intermediate.getAutoMapBindings();
-
-        resolver = resolverBase;
+            resolver = &defaultResolver;
     }
 
     TVarLiveMap inVarMap, outVarMap, uniformVarMap;
@@ -712,13 +794,16 @@
     TNotifyUniformAdaptor uniformNotify(stage, *resolver);
     TResolverUniformAdaptor uniformResolve(stage, *resolver, infoSink, hadError, intermediate);
     TResolverInOutAdaptor inOutResolve(stage, *resolver, infoSink, hadError, intermediate);
+    resolver->beginNotifications(stage);
     std::for_each(inVarMap.begin(), inVarMap.end(), inOutNotify);
     std::for_each(outVarMap.begin(), outVarMap.end(), inOutNotify);
     std::for_each(uniformVarMap.begin(), uniformVarMap.end(), uniformNotify);
-    resolver->endNotifications();
+    resolver->endNotifications(stage);
+    resolver->beginResolve(stage);
     std::for_each(inVarMap.begin(), inVarMap.end(), inOutResolve);
     std::for_each(outVarMap.begin(), outVarMap.end(), inOutResolve);
     std::for_each(uniformVarMap.begin(), uniformVarMap.end(), uniformResolve);
+    resolver->endResolve(stage);
 
     if (!hadError) {
         // sort by id again, so we can use lower bound to find entries
diff --git a/glslang/MachineIndependent/linkValidate.cpp b/glslang/MachineIndependent/linkValidate.cpp
index 4bb2951..82e7c6e 100644
--- a/glslang/MachineIndependent/linkValidate.cpp
+++ b/glslang/MachineIndependent/linkValidate.cpp
@@ -1,5 +1,6 @@
 //
 // Copyright (C) 2013 LunarG, Inc.
+// Copyright (C) 2017 ARM Limited.
 //
 // All rights reserved.
 //
@@ -76,12 +77,13 @@
 //
 void TIntermediate::merge(TInfoSink& infoSink, TIntermediate& unit)
 {
-    if (source == EShSourceNone)
-        source = unit.source;
+    mergeCallGraphs(infoSink, unit);
+    mergeModes(infoSink, unit);
+    mergeTrees(infoSink, unit);
+}
 
-    if (source != unit.source)
-        error(infoSink, "can't link compilation units from different source languages");
-
+void TIntermediate::mergeCallGraphs(TInfoSink& infoSink, TIntermediate& unit)
+{
     if (unit.getNumEntryPoints() > 0) {
         if (getNumEntryPoints() > 0)
             error(infoSink, "can't handle multiple entry points per stage");
@@ -91,22 +93,75 @@
         }
     }
     numEntryPoints += unit.getNumEntryPoints();
+
+    callGraph.insert(callGraph.end(), unit.callGraph.begin(), unit.callGraph.end());
+}
+
+#define MERGE_MAX(member) member = std::max(member, unit.member)
+#define MERGE_TRUE(member) if (unit.member) member = unit.member;
+
+void TIntermediate::mergeModes(TInfoSink& infoSink, TIntermediate& unit)
+{
+    if (language != unit.language)
+        error(infoSink, "stages must match when linking into a single stage");
+
+    if (source == EShSourceNone)
+        source = unit.source;
+    if (source != unit.source)
+        error(infoSink, "can't link compilation units from different source languages");
+
+    if (treeRoot == nullptr) {
+        profile = unit.profile;
+        version = unit.version;
+        requestedExtensions = unit.requestedExtensions;
+    } else {
+        if ((profile == EEsProfile) != (unit.profile == EEsProfile))
+            error(infoSink, "Cannot cross link ES and desktop profiles");
+        else if (unit.profile == ECompatibilityProfile)
+            profile = ECompatibilityProfile;
+        version = std::max(version, unit.version);
+        requestedExtensions.insert(unit.requestedExtensions.begin(), unit.requestedExtensions.end());
+    }
+
+    MERGE_MAX(spvVersion.spv);
+    MERGE_MAX(spvVersion.vulkanGlsl);
+    MERGE_MAX(spvVersion.vulkan);
+    MERGE_MAX(spvVersion.openGl);
+
     numErrors += unit.getNumErrors();
     numPushConstants += unit.numPushConstants;
-    callGraph.insert(callGraph.end(), unit.callGraph.begin(), unit.callGraph.end());
 
-    if (originUpperLeft != unit.originUpperLeft || pixelCenterInteger != unit.pixelCenterInteger)
-        error(infoSink, "gl_FragCoord redeclarations must match across shaders");
+    if (unit.invocations != TQualifier::layoutNotSet) {
+        if (invocations == TQualifier::layoutNotSet)
+            invocations = unit.invocations;
+        else if (invocations != unit.invocations)
+            error(infoSink, "number of invocations must match between compilation units");
+    }
 
-    if (! earlyFragmentTests)
-        earlyFragmentTests = unit.earlyFragmentTests;
-
-    if (depthLayout == EldNone)
-        depthLayout = unit.depthLayout;
-    else if (depthLayout != unit.depthLayout)
-        error(infoSink, "Contradictory depth layouts");
-
-    blendEquations |= unit.blendEquations;
+    if (vertices == TQualifier::layoutNotSet)
+        vertices = unit.vertices;
+    else if (vertices != unit.vertices) {
+        if (language == EShLangGeometry
+#ifdef NV_EXTENSIONS
+            || language == EShLangMeshNV
+#endif
+            )
+            error(infoSink, "Contradictory layout max_vertices values");
+        else if (language == EShLangTessControl)
+            error(infoSink, "Contradictory layout vertices values");
+        else
+            assert(0);
+    }
+#ifdef NV_EXTENSIONS
+    if (primitives == TQualifier::layoutNotSet)
+        primitives = unit.primitives;
+    else if (primitives != unit.primitives) {
+        if (language == EShLangMeshNV)
+            error(infoSink, "Contradictory layout max_primitives values");
+        else
+            assert(0);
+    }
+#endif
 
     if (inputPrimitive == ElgNone)
         inputPrimitive = unit.inputPrimitive;
@@ -118,16 +173,8 @@
     else if (outputPrimitive != unit.outputPrimitive)
         error(infoSink, "Contradictory output layout primitives");
 
-    if (vertices == TQualifier::layoutNotSet)
-        vertices = unit.vertices;
-    else if (vertices != unit.vertices) {
-        if (language == EShLangGeometry)
-            error(infoSink, "Contradictory layout max_vertices values");
-        else if (language == EShLangTessControl)
-            error(infoSink, "Contradictory layout vertices values");
-        else
-            assert(0);
-    }
+    if (originUpperLeft != unit.originUpperLeft || pixelCenterInteger != unit.pixelCenterInteger)
+        error(infoSink, "gl_FragCoord redeclarations must match across shaders");
 
     if (vertexSpacing == EvsNone)
         vertexSpacing = unit.vertexSpacing;
@@ -139,8 +186,7 @@
     else if (vertexOrder != unit.vertexOrder)
         error(infoSink, "Contradictory triangle ordering");
 
-    if (unit.pointMode)
-        pointMode = true;
+    MERGE_TRUE(pointMode);
 
     for (int i = 0; i < 3; ++i) {
         if (localSize[i] > 1)
@@ -154,8 +200,21 @@
             error(infoSink, "Contradictory local size specialization ids");
     }
 
-    if (unit.xfbMode)
-        xfbMode = true;
+    MERGE_TRUE(earlyFragmentTests);
+    MERGE_TRUE(postDepthCoverage);
+
+    if (depthLayout == EldNone)
+        depthLayout = unit.depthLayout;
+    else if (depthLayout != unit.depthLayout)
+        error(infoSink, "Contradictory depth layouts");
+
+    MERGE_TRUE(depthReplacing);
+    MERGE_TRUE(hlslFunctionality1);
+
+    blendEquations |= unit.blendEquations;
+
+    MERGE_TRUE(xfbMode);
+
     for (size_t b = 0; b < xfbBuffers.size(); ++b) {
         if (xfbBuffers[b].stride == TQualifier::layoutXfbStrideEnd)
             xfbBuffers[b].stride = unit.xfbBuffers[b].stride;
@@ -167,35 +226,181 @@
         // TODO: 4.4 link: enhanced layouts: compare ranges
     }
 
-    if (unit.treeRoot == 0)
+    MERGE_TRUE(multiStream);
+
+#ifdef NV_EXTENSIONS
+    MERGE_TRUE(layoutOverrideCoverage);
+    MERGE_TRUE(geoPassthroughEXT);
+#endif
+
+    for (unsigned int i = 0; i < unit.shiftBinding.size(); ++i) {
+        if (unit.shiftBinding[i] > 0)
+            setShiftBinding((TResourceType)i, unit.shiftBinding[i]);
+    }
+
+    for (unsigned int i = 0; i < unit.shiftBindingForSet.size(); ++i) {
+        for (auto it = unit.shiftBindingForSet[i].begin(); it != unit.shiftBindingForSet[i].end(); ++it)
+            setShiftBindingForSet((TResourceType)i, it->second, it->first);
+    }
+
+    resourceSetBinding.insert(resourceSetBinding.end(), unit.resourceSetBinding.begin(), unit.resourceSetBinding.end());
+
+    MERGE_TRUE(autoMapBindings);
+    MERGE_TRUE(autoMapLocations);
+    MERGE_TRUE(invertY);
+    MERGE_TRUE(flattenUniformArrays);
+    MERGE_TRUE(useUnknownFormat);
+    MERGE_TRUE(hlslOffsets);
+    MERGE_TRUE(useStorageBuffer);
+    MERGE_TRUE(hlslIoMapping);
+
+    // TODO: sourceFile
+    // TODO: sourceText
+    // TODO: processes
+
+    MERGE_TRUE(needToLegalize);
+    MERGE_TRUE(binaryDoubleOutput);
+}
+
+//
+// Merge the 'unit' AST into 'this' AST.
+// That includes rationalizing the unique IDs, which were set up independently,
+// and might have overlaps that are not the same symbol, or might have different
+// IDs for what should be the same shared symbol.
+//
+void TIntermediate::mergeTrees(TInfoSink& infoSink, TIntermediate& unit)
+{
+    if (unit.treeRoot == nullptr)
         return;
 
-    if (treeRoot == 0) {
+    if (treeRoot == nullptr) {
         treeRoot = unit.treeRoot;
-        version = unit.version;
-        requestedExtensions = unit.requestedExtensions;
         return;
     }
 
     // Getting this far means we have two existing trees to merge...
+#ifdef NV_EXTENSIONS
+    numShaderRecordNVBlocks += unit.numShaderRecordNVBlocks;
+#endif
 
-    version = std::max(version, unit.version);
-    requestedExtensions.insert(unit.requestedExtensions.begin(), unit.requestedExtensions.end());
+#ifdef NV_EXTENSIONS
+    numTaskNVBlocks += unit.numTaskNVBlocks;
+#endif
 
     // Get the top-level globals of each unit
     TIntermSequence& globals = treeRoot->getAsAggregate()->getSequence();
     TIntermSequence& unitGlobals = unit.treeRoot->getAsAggregate()->getSequence();
 
     // Get the linker-object lists
-    TIntermSequence& linkerObjects = findLinkerObjects();
-    TIntermSequence& unitLinkerObjects = unit.findLinkerObjects();
+    TIntermSequence& linkerObjects = findLinkerObjects()->getSequence();
+    const TIntermSequence& unitLinkerObjects = unit.findLinkerObjects()->getSequence();
+
+    // Map by global name to unique ID to rationalize the same object having
+    // differing IDs in different trees.
+    TMap<TString, int> idMap;
+    int maxId;
+    seedIdMap(idMap, maxId);
+    remapIds(idMap, maxId + 1, unit);
 
     mergeBodies(infoSink, globals, unitGlobals);
     mergeLinkerObjects(infoSink, linkerObjects, unitLinkerObjects);
-
     ioAccessed.insert(unit.ioAccessed.begin(), unit.ioAccessed.end());
 }
 
+// Traverser that seeds an ID map with all built-ins, and tracks the
+// maximum ID used.
+// (It would be nice to put this in a function, but that causes warnings
+// on having no bodies for the copy-constructor/operator=.)
+class TBuiltInIdTraverser : public TIntermTraverser {
+public:
+    TBuiltInIdTraverser(TMap<TString, int>& idMap) : idMap(idMap), maxId(0) { }
+    // If it's a built in, add it to the map.
+    // Track the max ID.
+    virtual void visitSymbol(TIntermSymbol* symbol)
+    {
+        const TQualifier& qualifier = symbol->getType().getQualifier();
+        if (qualifier.builtIn != EbvNone)
+            idMap[symbol->getName()] = symbol->getId();
+        maxId = std::max(maxId, symbol->getId());
+    }
+    int getMaxId() const { return maxId; }
+protected:
+    TBuiltInIdTraverser(TBuiltInIdTraverser&);
+    TBuiltInIdTraverser& operator=(TBuiltInIdTraverser&);
+    TMap<TString, int>& idMap;
+    int maxId;
+};
+
+// Traverser that seeds an ID map with non-builtins.
+// (It would be nice to put this in a function, but that causes warnings
+// on having no bodies for the copy-constructor/operator=.)
+class TUserIdTraverser : public TIntermTraverser {
+public:
+    TUserIdTraverser(TMap<TString, int>& idMap) : idMap(idMap) { }
+    // If its a non-built-in global, add it to the map.
+    virtual void visitSymbol(TIntermSymbol* symbol)
+    {
+        const TQualifier& qualifier = symbol->getType().getQualifier();
+        if (qualifier.builtIn == EbvNone)
+            idMap[symbol->getName()] = symbol->getId();
+    }
+
+protected:
+    TUserIdTraverser(TUserIdTraverser&);
+    TUserIdTraverser& operator=(TUserIdTraverser&);
+    TMap<TString, int>& idMap; // over biggest id
+};
+
+// Initialize the the ID map with what we know of 'this' AST.
+void TIntermediate::seedIdMap(TMap<TString, int>& idMap, int& maxId)
+{
+    // all built-ins everywhere need to align on IDs and contribute to the max ID
+    TBuiltInIdTraverser builtInIdTraverser(idMap);
+    treeRoot->traverse(&builtInIdTraverser);
+    maxId = builtInIdTraverser.getMaxId();
+
+    // user variables in the linker object list need to align on ids
+    TUserIdTraverser userIdTraverser(idMap);
+    findLinkerObjects()->traverse(&userIdTraverser);
+}
+
+// Traverser to map an AST ID to what was known from the seeding AST.
+// (It would be nice to put this in a function, but that causes warnings
+// on having no bodies for the copy-constructor/operator=.)
+class TRemapIdTraverser : public TIntermTraverser {
+public:
+    TRemapIdTraverser(const TMap<TString, int>& idMap, int idShift) : idMap(idMap), idShift(idShift) { }
+    // Do the mapping:
+    //  - if the same symbol, adopt the 'this' ID
+    //  - otherwise, ensure a unique ID by shifting to a new space
+    virtual void visitSymbol(TIntermSymbol* symbol)
+    {
+        const TQualifier& qualifier = symbol->getType().getQualifier();
+        bool remapped = false;
+        if (qualifier.isLinkable() || qualifier.builtIn != EbvNone) {
+            auto it = idMap.find(symbol->getName());
+            if (it != idMap.end()) {
+                symbol->changeId(it->second);
+                remapped = true;
+            }
+        }
+        if (!remapped)
+            symbol->changeId(symbol->getId() + idShift);
+    }
+protected:
+    TRemapIdTraverser(TRemapIdTraverser&);
+    TRemapIdTraverser& operator=(TRemapIdTraverser&);
+    const TMap<TString, int>& idMap;
+    int idShift;
+};
+
+void TIntermediate::remapIds(const TMap<TString, int>& idMap, int idShift, TIntermediate& unit)
+{
+    // Remap all IDs to either share or be unique, as dictated by the idMap and idShift.
+    TRemapIdTraverser idTraverser(idMap, idShift);
+    unit.getTreeRoot()->traverse(&idTraverser);
+}
+
 //
 // Merge the function bodies and global-level initializers from unitGlobals into globals.
 // Will error check duplication of function bodies for the same signature.
@@ -264,10 +469,13 @@
 // Recursively merge the implicit array sizes through the objects' respective type trees.
 void TIntermediate::mergeImplicitArraySizes(TType& type, const TType& unitType)
 {
-    if (type.isImplicitlySizedArray() && unitType.isArray()) {
-        int newImplicitArraySize = unitType.isImplicitlySizedArray() ? unitType.getImplicitArraySize() : unitType.getOuterArraySize();
-        if (newImplicitArraySize > type.getImplicitArraySize ())
-            type.setImplicitArraySize(newImplicitArraySize);
+    if (type.isUnsizedArray()) {
+        if (unitType.isUnsizedArray()) {
+            type.updateImplicitArraySize(unitType.getImplicitArraySize());
+            if (unitType.isArrayVariablyIndexed())
+                type.setArrayVariablyIndexed();
+        } else if (unitType.isSizedArray())
+            type.changeOuterArraySize(unitType.getOuterArraySize());
     }
 
     // Type mismatches are caught and reported after this, just be careful for now.
@@ -290,8 +498,13 @@
 
     // Types have to match
     if (symbol.getType() != unitSymbol.getType()) {
-        error(infoSink, "Types must match:");
-        writeTypeComparison = true;
+        // but, we make an exception if one is an implicit array and the other is sized
+        if (! (symbol.getType().isArray() && unitSymbol.getType().isArray() &&
+                symbol.getType().sameElementType(unitSymbol.getType()) &&
+                (symbol.getType().isUnsizedArray() || unitSymbol.getType().isUnsizedArray()))) {
+            error(infoSink, "Types must match:");
+            writeTypeComparison = true;
+        }
     }
 
     // Qualifiers have to (almost) match
@@ -332,11 +545,16 @@
     }
 
     // Memory...
-    if (symbol.getQualifier().coherent  != unitSymbol.getQualifier().coherent ||
-        symbol.getQualifier().volatil   != unitSymbol.getQualifier().volatil ||
-        symbol.getQualifier().restrict  != unitSymbol.getQualifier().restrict ||
-        symbol.getQualifier().readonly  != unitSymbol.getQualifier().readonly ||
-        symbol.getQualifier().writeonly != unitSymbol.getQualifier().writeonly) {
+    if (symbol.getQualifier().coherent          != unitSymbol.getQualifier().coherent ||
+        symbol.getQualifier().devicecoherent    != unitSymbol.getQualifier().devicecoherent ||
+        symbol.getQualifier().queuefamilycoherent  != unitSymbol.getQualifier().queuefamilycoherent ||
+        symbol.getQualifier().workgroupcoherent != unitSymbol.getQualifier().workgroupcoherent ||
+        symbol.getQualifier().subgroupcoherent  != unitSymbol.getQualifier().subgroupcoherent ||
+        symbol.getQualifier().nonprivate        != unitSymbol.getQualifier().nonprivate ||
+        symbol.getQualifier().volatil           != unitSymbol.getQualifier().volatil ||
+        symbol.getQualifier().restrict          != unitSymbol.getQualifier().restrict ||
+        symbol.getQualifier().readonly          != unitSymbol.getQualifier().readonly ||
+        symbol.getQualifier().writeonly         != unitSymbol.getQualifier().writeonly) {
         error(infoSink, "Memory qualifiers must match:");
         writeTypeComparison = true;
     }
@@ -459,9 +677,9 @@
             error(infoSink, "At least one shader must specify an output layout(vertices=...)");
         break;
     case EShLangTessEvaluation:
-        if (inputPrimitive == ElgNone)
-            error(infoSink, "At least one shader must specify an input layout primitive");
         if (source == EShSourceGlsl) {
+            if (inputPrimitive == ElgNone)
+                error(infoSink, "At least one shader must specify an input layout primitive");
             if (vertexSpacing == EvsNone)
                 vertexSpacing = EvsEqual;
             if (vertexOrder == EvoNone)
@@ -471,23 +689,56 @@
     case EShLangGeometry:
         if (inputPrimitive == ElgNone)
             error(infoSink, "At least one shader must specify an input layout primitive");
-        if (outputPrimitive == ElgNone
-#ifdef NV_EXTENSIONS
-            && !getGeoPassthroughEXT()
-#endif
-            )
+        if (outputPrimitive == ElgNone)
             error(infoSink, "At least one shader must specify an output layout primitive");
-        if (vertices == TQualifier::layoutNotSet
-#ifdef NV_EXTENSIONS
-            && !getGeoPassthroughEXT()
-#endif
-           )
+        if (vertices == TQualifier::layoutNotSet)
             error(infoSink, "At least one shader must specify a layout(max_vertices = value)");
         break;
     case EShLangFragment:
+        // for GL_ARB_post_depth_coverage, EarlyFragmentTest is set automatically in 
+        // ParseHelper.cpp. So if we reach here, this must be GL_EXT_post_depth_coverage 
+        // requiring explicit early_fragment_tests
+        if (getPostDepthCoverage() && !getEarlyFragmentTests())
+            error(infoSink, "post_depth_coverage requires early_fragment_tests");
         break;
     case EShLangCompute:
         break;
+
+#ifdef NV_EXTENSIONS
+    case EShLangRayGenNV:
+    case EShLangIntersectNV:
+    case EShLangAnyHitNV:
+    case EShLangClosestHitNV:
+    case EShLangMissNV:
+    case EShLangCallableNV:
+        if (numShaderRecordNVBlocks > 1)
+            error(infoSink, "Only one shaderRecordNV buffer block is allowed per stage");
+        break;
+    case EShLangMeshNV:
+        // NV_mesh_shader doesn't allow use of both single-view and per-view builtins.
+        if (inIoAccessed("gl_Position") && inIoAccessed("gl_PositionPerViewNV"))
+            error(infoSink, "Can only use one of gl_Position or gl_PositionPerViewNV");
+        if (inIoAccessed("gl_ClipDistance") && inIoAccessed("gl_ClipDistancePerViewNV"))
+            error(infoSink, "Can only use one of gl_ClipDistance or gl_ClipDistancePerViewNV");
+        if (inIoAccessed("gl_CullDistance") && inIoAccessed("gl_CullDistancePerViewNV"))
+            error(infoSink, "Can only use one of gl_CullDistance or gl_CullDistancePerViewNV");
+        if (inIoAccessed("gl_Layer") && inIoAccessed("gl_LayerPerViewNV"))
+            error(infoSink, "Can only use one of gl_Layer or gl_LayerPerViewNV");
+        if (inIoAccessed("gl_ViewportMask") && inIoAccessed("gl_ViewportMaskPerViewNV"))
+            error(infoSink, "Can only use one of gl_ViewportMask or gl_ViewportMaskPerViewNV");
+        if (outputPrimitive == ElgNone)
+            error(infoSink, "At least one shader must specify an output layout primitive");
+        if (vertices == TQualifier::layoutNotSet)
+            error(infoSink, "At least one shader must specify a layout(max_vertices = value)");
+        if (primitives == TQualifier::layoutNotSet)
+            error(infoSink, "At least one shader must specify a layout(max_primitives = value)");
+        // fall through
+    case EShLangTaskNV:
+        if (numTaskNVBlocks > 1)
+            error(infoSink, "Only one taskNV interface block is allowed per shader");
+        break;
+#endif
+
     default:
         error(infoSink, "Unknown Stage.");
         break;
@@ -502,7 +753,9 @@
         virtual void visitSymbol(TIntermSymbol* symbol)
         {
             // Implicitly size arrays.
-            symbol->getWritableType().adoptImplicitArraySizes();
+            // If an unsized array is left as unsized, it effectively
+            // becomes run-time sized.
+            symbol->getWritableType().adoptImplicitArraySizes(false);
         }
     } finalLinkTraverser;
 
@@ -680,7 +933,7 @@
 
     // TODO: linker functionality: location collision checking
 
-    TIntermSequence& linkObjects = findLinkerObjects();
+    TIntermSequence& linkObjects = findLinkerObjects()->getSequence();
     for (size_t i = 0; i < linkObjects.size(); ++i) {
         const TType& type = linkObjects[i]->getAsTyped()->getType();
         const TQualifier& qualifier = type.getQualifier();
@@ -699,7 +952,7 @@
     }
 }
 
-TIntermSequence& TIntermediate::findLinkerObjects() const
+TIntermAggregate* TIntermediate::findLinkerObjects() const
 {
     // Get the top-level globals
     TIntermSequence& globals = treeRoot->getAsAggregate()->getSequence();
@@ -707,7 +960,7 @@
     // Get the last member of the sequences, expected to be the linker-object lists
     assert(globals.back()->getAsAggregate()->getOp() == EOpLinkerObjects);
 
-    return globals.back()->getAsAggregate()->getSequence();
+    return globals.back()->getAsAggregate();
 }
 
 // See if a variable was both a user-declared output and used.
@@ -715,7 +968,7 @@
 // is more useful, and perhaps the spec should be changed to reflect that.
 bool TIntermediate::userOutputUsed() const
 {
-    const TIntermSequence& linkerObjects = findLinkerObjects();
+    const TIntermSequence& linkerObjects = findLinkerObjects()->getSequence();
 
     bool found = false;
     for (size_t i = 0; i < linkerObjects.size(); ++i) {
@@ -756,8 +1009,8 @@
         return -1;
 
     int size;
-    if (qualifier.isUniformOrBuffer()) {
-        if (type.isExplicitlySizedArray())
+    if (qualifier.isUniformOrBuffer() || qualifier.isTaskMemory()) {
+        if (type.isSizedArray())
             size = type.getCumulativeArraySize();
         else
             size = 1;
@@ -765,9 +1018,9 @@
         // Strip off the outer array dimension for those having an extra one.
         if (type.isArray() && qualifier.isArrayedIo(language)) {
             TType elementType(type, 0);
-            size = computeTypeLocationSize(elementType);
+            size = computeTypeLocationSize(elementType, language);
         } else
-            size = computeTypeLocationSize(type);
+            size = computeTypeLocationSize(type, language);
     }
 
     // Locations, and components within locations.
@@ -828,8 +1081,8 @@
         // combine location and component ranges
         TIoRange range(locationRange, componentRange, type.getBasicType(), qualifier.hasIndex() ? qualifier.layoutIndex : 0);
 
-        // check for collisions, except for vertex inputs on desktop
-        if (! (profile != EEsProfile && language == EShLangVertex && qualifier.isPipeInput()))
+        // check for collisions, except for vertex inputs on desktop targeting OpenGL
+        if (! (profile != EEsProfile && language == EShLangVertex && qualifier.isPipeInput()) || spvVersion.vulkan > 0)
             collision = checkLocationRange(set, range, type, typeCollision);
 
         if (collision < 0)
@@ -860,7 +1113,7 @@
     return -1; // no collision
 }
 
-// Accumulate locations used for inputs, outputs, and uniforms, and check for collisions
+// Accumulate bindings and offsets, and check for collisions
 // as the accumulation is done.
 //
 // Returns < 0 if no collision, >= 0 if collision and the value returned is a colliding value.
@@ -899,18 +1152,27 @@
 
 // Recursively figure out how many locations are used up by an input or output type.
 // Return the size of type, as measured by "locations".
-int TIntermediate::computeTypeLocationSize(const TType& type) const
+int TIntermediate::computeTypeLocationSize(const TType& type, EShLanguage stage)
 {
     // "If the declared input is an array of size n and each element takes m locations, it will be assigned m * n
     // consecutive locations..."
     if (type.isArray()) {
         // TODO: perf: this can be flattened by using getCumulativeArraySize(), and a deref that discards all arrayness
+        // TODO: are there valid cases of having an unsized array with a location?  If so, running this code too early.
         TType elementType(type, 0);
-        if (type.isImplicitlySizedArray()) {
-            // TODO: are there valid cases of having an implicitly-sized array with a location?  If so, running this code too early.
-            return computeTypeLocationSize(elementType);
-        } else
-            return type.getOuterArraySize() * computeTypeLocationSize(elementType);
+        if (type.isSizedArray()
+#ifdef NV_EXTENSIONS
+            && !type.getQualifier().isPerView()
+#endif
+            )
+            return type.getOuterArraySize() * computeTypeLocationSize(elementType, stage);
+        else {
+#ifdef NV_EXTENSIONS
+            // unset perViewNV attributes for arrayed per-view outputs: "perviewNV vec4 v[MAX_VIEWS][3];"
+            elementType.getQualifier().perViewNV = false;
+#endif
+            return computeTypeLocationSize(elementType, stage);
+        }
     }
 
     // "The locations consumed by block and structure members are determined by applying the rules above
@@ -919,7 +1181,7 @@
         int size = 0;
         for (int member = 0; member < (int)type.getStruct()->size(); ++member) {
             TType memberType(type, member);
-            size += computeTypeLocationSize(memberType);
+            size += computeTypeLocationSize(memberType, stage);
         }
         return size;
     }
@@ -933,7 +1195,7 @@
     if (type.isScalar())
         return 1;
     if (type.isVector()) {
-        if (language == EShLangVertex && type.getQualifier().isPipeInput())
+        if (stage == EShLangVertex && type.getQualifier().isPipeInput())
             return 1;
         if (type.getBasicType() == EbtDouble && type.getVectorSize() > 2)
             return 2;
@@ -946,13 +1208,44 @@
     // for an n-element array of m-component vectors..."
     if (type.isMatrix()) {
         TType columnType(type, 0);
-        return type.getMatrixCols() * computeTypeLocationSize(columnType);
+        return type.getMatrixCols() * computeTypeLocationSize(columnType, stage);
     }
 
     assert(0);
     return 1;
 }
 
+// Same as computeTypeLocationSize but for uniforms
+int TIntermediate::computeTypeUniformLocationSize(const TType& type)
+{
+    // "Individual elements of a uniform array are assigned
+    // consecutive locations with the first element taking location
+    // location."
+    if (type.isArray()) {
+        // TODO: perf: this can be flattened by using getCumulativeArraySize(), and a deref that discards all arrayness
+        TType elementType(type, 0);
+        if (type.isSizedArray()) {
+            return type.getOuterArraySize() * computeTypeUniformLocationSize(elementType);
+        } else {
+            // TODO: are there valid cases of having an implicitly-sized array with a location?  If so, running this code too early.
+            return computeTypeUniformLocationSize(elementType);
+        }
+    }
+
+    // "Each subsequent inner-most member or element gets incremental
+    // locations for the entire structure or array."
+    if (type.isStruct()) {
+        int size = 0;
+        for (int member = 0; member < (int)type.getStruct()->size(); ++member) {
+            TType memberType(type, member);
+            size += computeTypeUniformLocationSize(memberType);
+        }
+        return size;
+    }
+
+    return 1;
+}
+
 // Accumulate xfb buffer ranges and check for collisions as the accumulation is done.
 //
 // Returns < 0 if no collision, >= 0 if collision and the value returned is a colliding value.
@@ -997,7 +1290,7 @@
 
     if (type.isArray()) {
         // TODO: perf: this can be flattened by using getCumulativeArraySize(), and a deref that discards all arrayness
-        assert(type.isExplicitlySizedArray());
+        assert(type.isSizedArray());
         TType elementType(type, 0);
         return type.getOuterArraySize() * computeTypeXfbSize(elementType, containsDouble);
     }
@@ -1056,9 +1349,11 @@
     case EbtInt64:
     case EbtUint64:
     case EbtDouble:  size = 8; return 8;
-#ifdef AMD_EXTENSIONS
     case EbtFloat16: size = 2; return 2;
-#endif
+    case EbtInt8:
+    case EbtUint8:   size = 1; return 1;
+    case EbtInt16:
+    case EbtUint16:  size = 2; return 2;
     default:         size = 4; return 4;
     }
 }
@@ -1077,10 +1372,11 @@
 // stride comes from the flattening down to vectors.
 //
 // Return value is the alignment of the type.
-int TIntermediate::getBaseAlignment(const TType& type, int& size, int& stride, bool std140, bool rowMajor)
+int TIntermediate::getBaseAlignment(const TType& type, int& size, int& stride, TLayoutPacking layoutPacking, bool rowMajor)
 {
     int alignment;
 
+    bool std140 = layoutPacking == glslang::ElpStd140;
     // When using the std140 storage layout, structures will be laid out in buffer
     // storage with its members stored in monotonically increasing order based on their
     // location in the declaration. A structure and each structure member have a base
@@ -1144,7 +1440,7 @@
     if (type.isArray()) {
         // TODO: perf: this might be flattened by using getCumulativeArraySize(), and a deref that discards all arrayness
         TType derefType(type, 0);
-        alignment = getBaseAlignment(derefType, size, dummyStride, std140, rowMajor);
+        alignment = getBaseAlignment(derefType, size, dummyStride, layoutPacking, rowMajor);
         if (std140)
             alignment = std::max(baseAlignmentVec4Std140, alignment);
         RoundToPow2(size, alignment);
@@ -1164,7 +1460,7 @@
             int memberSize;
             // modify just the children's view of matrix layout, if there is one for this member
             TLayoutMatrix subMatrixLayout = memberList[m].type->getQualifier().layoutMatrix;
-            int memberAlignment = getBaseAlignment(*memberList[m].type, memberSize, dummyStride, std140,
+            int memberAlignment = getBaseAlignment(*memberList[m].type, memberSize, dummyStride, layoutPacking,
                                                    (subMatrixLayout != ElmNone) ? (subMatrixLayout == ElmRowMajor) : rowMajor);
             maxAlignment = std::max(maxAlignment, memberAlignment);
             RoundToPow2(size, memberAlignment);
@@ -1187,6 +1483,8 @@
     if (type.isVector()) {
         int scalarAlign = getBaseAlignmentScalar(type, size);
         switch (type.getVectorSize()) {
+        case 1: // HLSL has this, GLSL does not
+            return scalarAlign;
         case 2:
             size *= 2;
             return 2 * scalarAlign;
@@ -1201,7 +1499,7 @@
         // rule 5: deref to row, not to column, meaning the size of vector is num columns instead of num rows
         TType derefType(type, 0, rowMajor);
 
-        alignment = getBaseAlignment(derefType, size, dummyStride, std140, rowMajor);
+        alignment = getBaseAlignment(derefType, size, dummyStride, layoutPacking, rowMajor);
         if (std140)
             alignment = std::max(baseAlignmentVec4Std140, alignment);
         RoundToPow2(size, alignment);
@@ -1229,4 +1527,79 @@
                       : offset % 16 != 0;
 }
 
+int TIntermediate::getScalarAlignment(const TType& type, int& size, int& stride, bool rowMajor)
+{
+    int alignment;
+
+    stride = 0;
+    int dummyStride;
+
+    if (type.isArray()) {
+        TType derefType(type, 0);
+        alignment = getScalarAlignment(derefType, size, dummyStride, rowMajor);
+
+        stride = size;
+        RoundToPow2(stride, alignment);
+
+        size = stride * (type.getOuterArraySize() - 1) + size;
+        return alignment;
+    }
+
+    if (type.getBasicType() == EbtStruct) {
+        const TTypeList& memberList = *type.getStruct();
+
+        size = 0;
+        int maxAlignment = 0;
+        for (size_t m = 0; m < memberList.size(); ++m) {
+            int memberSize;
+            // modify just the children's view of matrix layout, if there is one for this member
+            TLayoutMatrix subMatrixLayout = memberList[m].type->getQualifier().layoutMatrix;
+            int memberAlignment = getScalarAlignment(*memberList[m].type, memberSize, dummyStride,
+                                                     (subMatrixLayout != ElmNone) ? (subMatrixLayout == ElmRowMajor) : rowMajor);
+            maxAlignment = std::max(maxAlignment, memberAlignment);
+            RoundToPow2(size, memberAlignment);
+            size += memberSize;
+        }
+
+        return maxAlignment;
+    }
+
+    if (type.isScalar())
+        return getBaseAlignmentScalar(type, size);
+
+    if (type.isVector()) {
+        int scalarAlign = getBaseAlignmentScalar(type, size);
+        
+        size *= type.getVectorSize();
+        return scalarAlign;
+    }
+
+    if (type.isMatrix()) {
+        TType derefType(type, 0, rowMajor);
+
+        alignment = getScalarAlignment(derefType, size, dummyStride, rowMajor);
+
+        stride = size;  // use intra-matrix stride for stride of a just a matrix
+        if (rowMajor)
+            size = stride * type.getMatrixRows();
+        else
+            size = stride * type.getMatrixCols();
+
+        return alignment;
+    }
+
+    assert(0);  // all cases should be covered above
+    size = 1;
+    return 1;    
+}
+
+int TIntermediate::getMemberAlignment(const TType& type, int& size, int& stride, TLayoutPacking layoutPacking, bool rowMajor)
+{
+    if (layoutPacking == glslang::ElpScalar) {
+        return getScalarAlignment(type, size, stride, rowMajor);
+    } else {
+        return getBaseAlignment(type, size, stride, layoutPacking, rowMajor);
+    }
+}
+
 } // end namespace glslang
diff --git a/glslang/MachineIndependent/localintermediate.h b/glslang/MachineIndependent/localintermediate.h
old mode 100644
new mode 100755
index 29d1bba..ff28c0e
--- a/glslang/MachineIndependent/localintermediate.h
+++ b/glslang/MachineIndependent/localintermediate.h
@@ -1,6 +1,7 @@
 //
 // Copyright (C) 2002-2005  3Dlabs Inc. Ltd.
 // Copyright (C) 2016 LunarG, Inc.
+// Copyright (C) 2017 ARM Limited.
 // All rights reserved.
 //
 // Redistribution and use in source and binary forms, with or without
@@ -40,8 +41,11 @@
 #include "../Public/ShaderLang.h"
 #include "Versions.h"
 
+#include <string>
+#include <vector>
 #include <algorithm>
 #include <set>
+#include <array>
 
 class TInfoSink;
 
@@ -77,7 +81,7 @@
         assert(i < MaxSwizzleSelectors);
         return components[i];
     }
-    
+
 private:
     int size_;
     selectorType components[MaxSwizzleSelectors];
@@ -150,38 +154,106 @@
     bool containsDouble;
 };
 
+// Track a set of strings describing how the module was processed.
+// Using the form:
+//   process arg0 arg1 arg2 ...
+//   process arg0 arg1 arg2 ...
+// where everything is textual, and there can be zero or more arguments
+class TProcesses {
+public:
+    TProcesses() {}
+    ~TProcesses() {}
+
+    void addProcess(const char* process)
+    {
+        processes.push_back(process);
+    }
+    void addProcess(const std::string& process)
+    {
+        processes.push_back(process);
+    }
+    void addArgument(int arg)
+    {
+        processes.back().append(" ");
+        std::string argString = std::to_string(arg);
+        processes.back().append(argString);
+    }
+    void addArgument(const char* arg)
+    {
+        processes.back().append(" ");
+        processes.back().append(arg);
+    }
+    void addArgument(const std::string& arg)
+    {
+        processes.back().append(" ");
+        processes.back().append(arg);
+    }
+    void addIfNonZero(const char* process, int value)
+    {
+        if (value != 0) {
+            addProcess(process);
+            addArgument(value);
+        }
+    }
+
+    const std::vector<std::string>& getProcesses() const { return processes; }
+
+private:
+    std::vector<std::string> processes;
+};
+
 class TSymbolTable;
 class TSymbol;
 class TVariable;
 
+#ifdef NV_EXTENSIONS
+//
+// Texture and Sampler transformation mode.
+//
+enum ComputeDerivativeMode {
+    LayoutDerivativeNone,         // default layout as SPV_NV_compute_shader_derivatives not enabled
+    LayoutDerivativeGroupQuads,   // derivative_group_quadsNV
+    LayoutDerivativeGroupLinear,  // derivative_group_linearNV
+};
+#endif
+
 //
 // Set of helper functions to help parse and build the tree.
 //
 class TIntermediate {
 public:
     explicit TIntermediate(EShLanguage l, int v = 0, EProfile p = ENoProfile) :
+        implicitThisName("@this"), implicitCounterName("@count"),
         language(l), source(EShSourceNone), profile(p), version(v), treeRoot(0),
         numEntryPoints(0), numErrors(0), numPushConstants(0), recursive(false),
-        invocations(TQualifier::layoutNotSet), vertices(TQualifier::layoutNotSet), inputPrimitive(ElgNone), outputPrimitive(ElgNone),
+        invocations(TQualifier::layoutNotSet), vertices(TQualifier::layoutNotSet),
+        inputPrimitive(ElgNone), outputPrimitive(ElgNone),
         pixelCenterInteger(false), originUpperLeft(false),
-        vertexSpacing(EvsNone), vertexOrder(EvoNone), pointMode(false), earlyFragmentTests(false), depthLayout(EldNone), depthReplacing(false), blendEquations(0),
-        xfbMode(false), multiStream(false),
+        vertexSpacing(EvsNone), vertexOrder(EvoNone), pointMode(false), earlyFragmentTests(false),
+        postDepthCoverage(false), depthLayout(EldNone), depthReplacing(false),
+        hlslFunctionality1(false),
+        blendEquations(0), xfbMode(false), multiStream(false),
 #ifdef NV_EXTENSIONS
         layoutOverrideCoverage(false),
         geoPassthroughEXT(false),
+        numShaderRecordNVBlocks(0),
+        computeDerivativeMode(LayoutDerivativeNone),
+        primitives(TQualifier::layoutNotSet),
+        numTaskNVBlocks(0),
 #endif
-        shiftSamplerBinding(0),
-        shiftTextureBinding(0),
-        shiftImageBinding(0),
-        shiftUboBinding(0),
-        shiftSsboBinding(0),
-        shiftUavBinding(0),
         autoMapBindings(false),
+        autoMapLocations(false),
+        invertY(false),
         flattenUniformArrays(false),
         useUnknownFormat(false),
         hlslOffsets(false),
         useStorageBuffer(false),
-        hlslIoMapping(false)
+        useVulkanMemoryModel(false),
+        hlslIoMapping(false),
+        textureSamplerTransformMode(EShTexSampTransKeep),
+        needToLegalize(false),
+        binaryDoubleOutput(false),
+        uniformLocationBase(0)
     {
         localSize[0] = 1;
         localSize[1] = 1;
@@ -190,6 +262,8 @@
         localSizeSpecId[1] = TQualifier::layoutNotSet;
         localSizeSpecId[2] = TQualifier::layoutNotSet;
         xfbBuffers.resize(TQualifier::layoutXfbBufferEnd);
+
+        shiftBinding.fill(0);
     }
     void setLimits(const TBuiltInResource& r) { resources = r; }
 
@@ -199,41 +273,153 @@
 
     void setSource(EShSource s) { source = s; }
     EShSource getSource() const { return source; }
-    void setEntryPointName(const char* ep) { entryPointName = ep; }
+    void setEntryPointName(const char* ep)
+    {
+        entryPointName = ep;
+        processes.addProcess("entry-point");
+        processes.addArgument(entryPointName);
+    }
     void setEntryPointMangledName(const char* ep) { entryPointMangledName = ep; }
     const std::string& getEntryPointName() const { return entryPointName; }
     const std::string& getEntryPointMangledName() const { return entryPointMangledName; }
 
-    void setShiftSamplerBinding(unsigned int shift) { shiftSamplerBinding = shift; }
-    unsigned int getShiftSamplerBinding() const { return shiftSamplerBinding; }
-    void setShiftTextureBinding(unsigned int shift) { shiftTextureBinding = shift; }
-    unsigned int getShiftTextureBinding() const { return shiftTextureBinding; }
-    void setShiftImageBinding(unsigned int shift) { shiftImageBinding = shift; }
-    unsigned int getShiftImageBinding() const { return shiftImageBinding; }
-    void setShiftUboBinding(unsigned int shift)     { shiftUboBinding = shift; }
-    unsigned int getShiftUboBinding()     const { return shiftUboBinding; }
-    void setShiftSsboBinding(unsigned int shift)     { shiftSsboBinding = shift; }
-    unsigned int getShiftSsboBinding()  const { return shiftSsboBinding; }
-    void setShiftUavBinding(unsigned int shift) { shiftUavBinding = shift; }
-    unsigned int getShiftUavBinding()  const { return shiftUavBinding; }
-    void setAutoMapBindings(bool map)               { autoMapBindings = map; }
-    bool getAutoMapBindings()             const { return autoMapBindings; }
-    void setFlattenUniformArrays(bool flatten)      { flattenUniformArrays = flatten; }
-    bool getFlattenUniformArrays()        const { return flattenUniformArrays; }
-    void setNoStorageFormat(bool b)             { useUnknownFormat = b; }
-    bool getNoStorageFormat()             const { return useUnknownFormat; }
-    void setHlslOffsets()         { hlslOffsets = true; }
-    bool usingHlslOFfsets() const { return hlslOffsets; }
-    void setUseStorageBuffer() { useStorageBuffer = true; }
+    void setShiftBinding(TResourceType res, unsigned int shift)
+    {
+        shiftBinding[res] = shift;
+
+        const char* name = getResourceName(res);
+        if (name != nullptr)
+            processes.addIfNonZero(name, shift);
+    }
+
+    unsigned int getShiftBinding(TResourceType res) const { return shiftBinding[res]; }
+
+    void setShiftBindingForSet(TResourceType res, unsigned int shift, unsigned int set)
+    {
+        if (shift == 0) // ignore if there's no shift: it's a no-op.
+            return;
+
+        shiftBindingForSet[res][set] = shift;
+
+        const char* name = getResourceName(res);
+        if (name != nullptr) {
+            processes.addProcess(name);
+            processes.addArgument(shift);
+            processes.addArgument(set);
+        }
+    }
+
+    int getShiftBindingForSet(TResourceType res, unsigned int set) const
+    {
+        const auto shift = shiftBindingForSet[res].find(set);
+        return shift == shiftBindingForSet[res].end() ? -1 : shift->second;
+    }
+    bool hasShiftBindingForSet(TResourceType res) const { return !shiftBindingForSet[res].empty(); }
+
+    void setResourceSetBinding(const std::vector<std::string>& shift)
+    {
+        resourceSetBinding = shift;
+        if (shift.size() > 0) {
+            processes.addProcess("resource-set-binding");
+            for (int s = 0; s < (int)shift.size(); ++s)
+                processes.addArgument(shift[s]);
+        }
+    }
+    const std::vector<std::string>& getResourceSetBinding() const { return resourceSetBinding; }
+    void setAutoMapBindings(bool map)
+    {
+        autoMapBindings = map;
+        if (autoMapBindings)
+            processes.addProcess("auto-map-bindings");
+    }
+    bool getAutoMapBindings() const { return autoMapBindings; }
+    void setAutoMapLocations(bool map)
+    {
+        autoMapLocations = map;
+        if (autoMapLocations)
+            processes.addProcess("auto-map-locations");
+    }
+    bool getAutoMapLocations() const { return autoMapLocations; }
+    void setInvertY(bool invert)
+    {
+        invertY = invert;
+        if (invertY)
+            processes.addProcess("invert-y");
+    }
+    bool getInvertY() const { return invertY; }
+
+    void setFlattenUniformArrays(bool flatten)
+    {
+        flattenUniformArrays = flatten;
+        if (flattenUniformArrays)
+            processes.addProcess("flatten-uniform-arrays");
+    }
+    bool getFlattenUniformArrays() const { return flattenUniformArrays; }
+    void setNoStorageFormat(bool b)
+    {
+        useUnknownFormat = b;
+        if (useUnknownFormat)
+            processes.addProcess("no-storage-format");
+    }
+    bool getNoStorageFormat() const { return useUnknownFormat; }
+    void setHlslOffsets()
+    {
+        hlslOffsets = true;
+        if (hlslOffsets)
+            processes.addProcess("hlsl-offsets");
+    }
+    bool usingHlslOffsets() const { return hlslOffsets; }
+    void setUseStorageBuffer()
+    {
+        useStorageBuffer = true;
+        processes.addProcess("use-storage-buffer");
+    }
     bool usingStorageBuffer() const { return useStorageBuffer; }
-    void setHlslIoMapping(bool b) { hlslIoMapping = b; }
-    bool usingHlslIoMapping()     { return hlslIoMapping; }
+    void setHlslIoMapping(bool b)
+    {
+        hlslIoMapping = b;
+        if (hlslIoMapping)
+            processes.addProcess("hlsl-iomap");
+    }
+    bool usingHlslIoMapping() { return hlslIoMapping; }
+    void setUseVulkanMemoryModel()
+    {
+        useVulkanMemoryModel = true;
+        processes.addProcess("use-vulkan-memory-model");
+    }
+    bool usingVulkanMemoryModel() const { return useVulkanMemoryModel; }
+
+    template<class T> T addCounterBufferName(const T& name) const { return name + implicitCounterName; }
+    bool hasCounterBufferName(const TString& name) const {
+        size_t len = strlen(implicitCounterName);
+        return name.size() > len &&
+               name.compare(name.size() - len, len, implicitCounterName) == 0;
+    }
+
+    void setTextureSamplerTransformMode(EShTextureSamplerTransformMode mode) { textureSamplerTransformMode = mode; }
 
     void setVersion(int v) { version = v; }
     int getVersion() const { return version; }
     void setProfile(EProfile p) { profile = p; }
     EProfile getProfile() const { return profile; }
-    void setSpv(const SpvVersion& s) { spvVersion = s; }
+    void setSpv(const SpvVersion& s)
+    {
+        spvVersion = s;
+
+        // client processes
+        if (spvVersion.vulkan > 0)
+            processes.addProcess("client vulkan100");
+        if (spvVersion.openGl > 0)
+            processes.addProcess("client opengl100");
+
+        // target-environment processes
+        if (spvVersion.vulkan > 0)
+            processes.addProcess("target-env vulkan1.0");
+        else if (spvVersion.vulkan > 0)
+            processes.addProcess("target-env vulkanUnknown");
+        if (spvVersion.openGl > 0)
+            processes.addProcess("target-env opengl");
+    }
     const SpvVersion& getSpv() const { return spvVersion; }
     EShLanguage getStage() const { return language; }
     void addRequestedExtension(const char* extension) { requestedExtensions.insert(extension); }
@@ -245,6 +431,11 @@
     int getNumEntryPoints() const { return numEntryPoints; }
     int getNumErrors() const { return numErrors; }
     void addPushConstantCount() { ++numPushConstants; }
+#ifdef NV_EXTENSIONS
+    void addShaderRecordNVCount() { ++numShaderRecordNVBlocks; }
+    void addTaskNVCount() { ++numTaskNVBlocks; }
+#endif
+
     bool isRecursive() const { return recursive; }
 
     TIntermSymbol* addSymbol(const TVariable&);
@@ -252,6 +443,7 @@
     TIntermSymbol* addSymbol(const TType&, const TSourceLoc&);
     TIntermSymbol* addSymbol(const TIntermSymbol&);
     TIntermTyped* addConversion(TOperator, const TType&, TIntermTyped*) const;
+    std::tuple<TIntermTyped*, TIntermTyped*> addConversion(TOperator op, TIntermTyped* node0, TIntermTyped* node1) const;
     TIntermTyped* addUniShapeConversion(TOperator, const TType&, TIntermTyped*);
     void addBiShapeConversion(TOperator, TIntermTyped*& lhsNode, TIntermTyped*& rhsNode);
     TIntermTyped* addShapeConversion(const TType&, TIntermTyped*);
@@ -261,6 +453,11 @@
     TIntermTyped* addUnaryMath(TOperator, TIntermTyped* child, TSourceLoc);
     TIntermTyped* addBuiltInFunctionCall(const TSourceLoc& line, TOperator, bool unary, TIntermNode*, const TType& returnType);
     bool canImplicitlyPromote(TBasicType from, TBasicType to, TOperator op = EOpNull) const;
+    bool isIntegralPromotion(TBasicType from, TBasicType to) const;
+    bool isFPPromotion(TBasicType from, TBasicType to) const;
+    bool isIntegralConversion(TBasicType from, TBasicType to) const;
+    bool isFPConversion(TBasicType from, TBasicType to) const;
+    bool isFPIntegralConversion(TBasicType from, TBasicType to) const;
     TOperator mapTypeToConstructorOp(const TType&) const;
     TIntermAggregate* growAggregate(TIntermNode* left, TIntermNode* right);
     TIntermAggregate* growAggregate(TIntermNode* left, TIntermNode* right, const TSourceLoc&);
@@ -269,11 +466,15 @@
     TIntermAggregate* makeAggregate(const TSourceLoc&);
     TIntermTyped* setAggregateOperator(TIntermNode*, TOperator, const TType& type, TSourceLoc);
     bool areAllChildConst(TIntermAggregate* aggrNode);
-    TIntermTyped* addSelection(TIntermTyped* cond, TIntermNodePair code, const TSourceLoc&);
+    TIntermSelection* addSelection(TIntermTyped* cond, TIntermNodePair code, const TSourceLoc&);
     TIntermTyped* addSelection(TIntermTyped* cond, TIntermTyped* trueBlock, TIntermTyped* falseBlock, const TSourceLoc&);
     TIntermTyped* addComma(TIntermTyped* left, TIntermTyped* right, const TSourceLoc&);
     TIntermTyped* addMethod(TIntermTyped*, const TType&, const TString*, const TSourceLoc&);
     TIntermConstantUnion* addConstantUnion(const TConstUnionArray&, const TType&, const TSourceLoc&, bool literal = false) const;
+    TIntermConstantUnion* addConstantUnion(signed char, const TSourceLoc&, bool literal = false) const;
+    TIntermConstantUnion* addConstantUnion(unsigned char, const TSourceLoc&, bool literal = false) const;
+    TIntermConstantUnion* addConstantUnion(signed short, const TSourceLoc&, bool literal = false) const;
+    TIntermConstantUnion* addConstantUnion(unsigned short, const TSourceLoc&, bool literal = false) const;
     TIntermConstantUnion* addConstantUnion(int, const TSourceLoc&, bool literal = false) const;
     TIntermConstantUnion* addConstantUnion(unsigned int, const TSourceLoc&, bool literal = false) const;
     TIntermConstantUnion* addConstantUnion(long long, const TSourceLoc&, bool literal = false) const;
@@ -283,8 +484,9 @@
     TIntermConstantUnion* addConstantUnion(const TString*, const TSourceLoc&, bool literal = false) const;
     TIntermTyped* promoteConstantUnion(TBasicType, TIntermConstantUnion*) const;
     bool parseConstTree(TIntermNode*, TConstUnionArray, TOperator, const TType&, bool singleConstantParam = false);
-    TIntermLoop* addLoop(TIntermNode*, TIntermTyped*, TIntermTyped*, bool testFirst, const TSourceLoc&, TLoopControl = ELoopControlNone);
-    TIntermAggregate* addForLoop(TIntermNode*, TIntermNode*, TIntermTyped*, TIntermTyped*, bool testFirst, const TSourceLoc&, TLoopControl = ELoopControlNone);
+    TIntermLoop* addLoop(TIntermNode*, TIntermTyped*, TIntermTyped*, bool testFirst, const TSourceLoc&);
+    TIntermAggregate* addForLoop(TIntermNode*, TIntermNode*, TIntermTyped*, TIntermTyped*, bool testFirst,
+        const TSourceLoc&, TIntermLoop*&);
     TIntermBranch* addBranch(TOperator, const TSourceLoc&);
     TIntermBranch* addBranch(TOperator, TIntermTyped*, const TSourceLoc&);
     template<typename selectorType> TIntermTyped* addSwizzle(TSwizzleSelectors<selectorType>&, const TSourceLoc&);
@@ -296,9 +498,6 @@
     TIntermUnary* addUnaryNode(TOperator op, TIntermTyped* child, TSourceLoc) const;
     TIntermUnary* addUnaryNode(TOperator op, TIntermTyped* child, TSourceLoc, const TType&) const;
 
-    // Add conversion from node's type to given basic type.
-    TIntermTyped* convertToBasicType(TOperator op, TBasicType basicType, TIntermTyped* node) const;
-
     // Constant folding (in Constant.cpp)
     TIntermTyped* fold(TIntermAggregate* aggrNode);
     TIntermTyped* foldConstructor(TIntermAggregate* aggrNode);
@@ -391,6 +590,8 @@
     bool getPixelCenterInteger() const { return pixelCenterInteger; }
     void setEarlyFragmentTests() { earlyFragmentTests = true; }
     bool getEarlyFragmentTests() const { return earlyFragmentTests; }
+    void setPostDepthCoverage() { postDepthCoverage = true; }
+    bool getPostDepthCoverage() const { return postDepthCoverage; }
     bool setDepth(TLayoutDepth d)
     {
         if (depthLayout != EldNone)
@@ -402,6 +603,9 @@
     void setDepthReplacing() { depthReplacing = true; }
     bool isDepthReplacing() const { return depthReplacing; }
 
+    void setHlslFunctionality1() { hlslFunctionality1 = true; }
+    bool getHlslFunctionality1() const { return hlslFunctionality1; }
+
     void addBlendEquation(TBlendEquationShift b) { blendEquations |= (1 << b); }
     unsigned int getBlendEquations() const { return blendEquations; }
 
@@ -416,7 +620,8 @@
     int checkLocationRange(int set, const TIoRange& range, const TType&, bool& typeCollision);
     int addUsedOffsets(int binding, int offset, int numOffsets);
     bool addUsedConstantId(int id);
-    int computeTypeLocationSize(const TType&) const;
+    static int computeTypeLocationSize(const TType&, EShLanguage);
+    static int computeTypeUniformLocationSize(const TType&);
 
     bool setXfbBufferStride(int buffer, unsigned stride)
     {
@@ -425,10 +630,13 @@
         xfbBuffers[buffer].stride = stride;
         return true;
     }
+    unsigned getXfbStride(int buffer) const { return xfbBuffers[buffer].stride; }
     int addXfbBufferOffset(const TType&);
     unsigned int computeTypeXfbSize(const TType&, bool& containsDouble) const;
     static int getBaseAlignmentScalar(const TType&, int& size);
-    static int getBaseAlignment(const TType&, int& size, int& stride, bool std140, bool rowMajor);
+    static int getBaseAlignment(const TType&, int& size, int& stride, TLayoutPacking layoutPacking, bool rowMajor);
+    static int getScalarAlignment(const TType&, int& size, int& stride, bool rowMajor);
+    static int getMemberAlignment(const TType&, int& size, int& stride, TLayoutPacking layoutPacking, bool rowMajor);
     static bool improperStraddle(const TType& type, int size, int offset);
     bool promote(TIntermOperator*);
 
@@ -437,6 +645,16 @@
     bool getLayoutOverrideCoverage() const { return layoutOverrideCoverage; }
     void setGeoPassthroughEXT() { geoPassthroughEXT = true; }
     bool getGeoPassthroughEXT() const { return geoPassthroughEXT; }
+    void setLayoutDerivativeMode(ComputeDerivativeMode mode) { computeDerivativeMode = mode; }
+    ComputeDerivativeMode getLayoutDerivativeModeNone() const { return computeDerivativeMode; }
+    bool setPrimitives(int m)
+    {
+        if (primitives != TQualifier::layoutNotSet)
+            return primitives == m;
+        primitives = m;
+        return true;
+    }
+    int getPrimitives() const { return primitives; }
 #endif
 
     const char* addSemanticName(const TString& name)
@@ -444,12 +662,56 @@
         return semanticNameSet.insert(name).first->c_str();
     }
 
-    const char* const implicitThisName = "@this";
+    void setSourceFile(const char* file) { if (file != nullptr) sourceFile = file; }
+    const std::string& getSourceFile() const { return sourceFile; }
+    void addSourceText(const char* text) { sourceText = sourceText + text; }
+    const std::string& getSourceText() const { return sourceText; }
+    void addProcesses(const std::vector<std::string>& p)
+    {
+        for (int i = 0; i < (int)p.size(); ++i)
+            processes.addProcess(p[i]);
+    }
+    void addProcess(const std::string& process) { processes.addProcess(process); }
+    void addProcessArgument(const std::string& arg) { processes.addArgument(arg); }
+    const std::vector<std::string>& getProcesses() const { return processes.getProcesses(); }
+
+    void addUniformLocationOverride(const char* nameStr, int location)
+    {
+        std::string name = nameStr;
+        uniformLocationOverrides[name] = location;
+    }
+
+    int getUniformLocationOverride(const char* nameStr) const
+    {
+        std::string name = nameStr;
+        auto pos = uniformLocationOverrides.find(name);
+        if (pos == uniformLocationOverrides.end())
+            return -1;
+        else
+            return pos->second;
+    }
+
+    void setUniformLocationBase(int base) { uniformLocationBase = base; }
+    int getUniformLocationBase() const { return uniformLocationBase; }
+
+    void setNeedsLegalization() { needToLegalize = true; }
+    bool needsLegalization() const { return needToLegalize; }
+
+    void setBinaryDoubleOutput() { binaryDoubleOutput = true; }
+    bool getBinaryDoubleOutput() { return binaryDoubleOutput; }
+
+    const char* const implicitThisName;
+    const char* const implicitCounterName;
 
 protected:
     TIntermSymbol* addSymbol(int Id, const TString&, const TType&, const TConstUnionArray&, TIntermTyped* subtree, const TSourceLoc&);
     void error(TInfoSink& infoSink, const char*);
     void warn(TInfoSink& infoSink, const char*);
+    void mergeCallGraphs(TInfoSink&, TIntermediate&);
+    void mergeModes(TInfoSink&, TIntermediate&);
+    void mergeTrees(TInfoSink&, TIntermediate&);
+    void seedIdMap(TMap<TString, int>& idMap, int& maxId);
+    void remapIds(const TMap<TString, int>& idMap, int idShift, TIntermediate&);
     void mergeBodies(TInfoSink&, TIntermSequence& globals, const TIntermSequence& unitGlobals);
     void mergeLinkerObjects(TInfoSink&, TIntermSequence& linkerObjects, const TIntermSequence& unitLinkerObjects);
     void mergeImplicitArraySizes(TType&, const TType&);
@@ -457,9 +719,10 @@
     void checkCallGraphCycles(TInfoSink&);
     void checkCallGraphBodies(TInfoSink&, bool keepUncalled);
     void inOutLocationCheck(TInfoSink&);
-    TIntermSequence& findLinkerObjects() const;
+    TIntermAggregate* findLinkerObjects() const;
     bool userOutputUsed() const;
     bool isSpecializationOperation(const TIntermOperator&) const;
+    bool isNonuniformPropagating(TOperator) const;
     bool promoteUnary(TIntermUnary&);
     bool promoteBinary(TIntermBinary&);
     void addSymbolLinkageNode(TIntermAggregate*& linkage, TSymbolTable&, const TString&);
@@ -467,14 +730,22 @@
     void pushSelector(TIntermSequence&, const TVectorSelector&, const TSourceLoc&);
     void pushSelector(TIntermSequence&, const TMatrixSelector&, const TSourceLoc&);
     bool specConstantPropagates(const TIntermTyped&, const TIntermTyped&);
+    void performTextureUpgradeAndSamplerRemovalTransformation(TIntermNode* root);
+    bool isConversionAllowed(TOperator op, TIntermTyped* node) const;
+    TIntermTyped* createConversion(TBasicType convertTo, TIntermTyped* node) const;
+    std::tuple<TBasicType, TBasicType> getConversionDestinatonType(TBasicType type0, TBasicType type1, TOperator op) const;
+    bool extensionRequested(const char *extension) const {return requestedExtensions.find(extension) != requestedExtensions.end();}
+    static const char* getResourceName(TResourceType);
 
     const EShLanguage language;  // stage, known at construction time
     EShSource source;            // source language, known a bit later
     std::string entryPointName;
     std::string entryPointMangledName;
+    typedef std::list<TCall> TGraph;
+    TGraph callGraph;
 
-    EProfile profile;
-    int version;
+    EProfile profile;                           // source profile
+    int version;                                // source version
     SpvVersion spvVersion;
     TIntermNode* treeRoot;
     std::set<std::string> requestedExtensions;  // cumulation of all enabled or required extensions; not connected to what subset of the shader used them
@@ -495,40 +766,62 @@
     int localSize[3];
     int localSizeSpecId[3];
     bool earlyFragmentTests;
+    bool postDepthCoverage;
     TLayoutDepth depthLayout;
     bool depthReplacing;
+    bool hlslFunctionality1;
     int blendEquations;        // an 'or'ing of masks of shifts of TBlendEquationShift
     bool xfbMode;
+    std::vector<TXfbBuffer> xfbBuffers;     // all the data we need to track per xfb buffer
     bool multiStream;
 
 #ifdef NV_EXTENSIONS
     bool layoutOverrideCoverage;
     bool geoPassthroughEXT;
+    int numShaderRecordNVBlocks;
+    ComputeDerivativeMode computeDerivativeMode;
+    int primitives;
+    int numTaskNVBlocks;
 #endif
 
-    unsigned int shiftSamplerBinding;
-    unsigned int shiftTextureBinding;
-    unsigned int shiftImageBinding;
-    unsigned int shiftUboBinding;
-    unsigned int shiftSsboBinding;
-    unsigned int shiftUavBinding;
+    // Base shift values
+    std::array<unsigned int, EResCount> shiftBinding;
+
+    // Per-descriptor-set shift values
+    std::array<std::map<int, int>, EResCount> shiftBindingForSet;
+
+    std::vector<std::string> resourceSetBinding;
     bool autoMapBindings;
+    bool autoMapLocations;
+    bool invertY;
     bool flattenUniformArrays;
     bool useUnknownFormat;
     bool hlslOffsets;
     bool useStorageBuffer;
+    bool useVulkanMemoryModel;
     bool hlslIoMapping;
 
-    typedef std::list<TCall> TGraph;
-    TGraph callGraph;
-
     std::set<TString> ioAccessed;           // set of names of statically read/written I/O that might need extra checking
     std::vector<TIoRange> usedIo[4];        // sets of used locations, one for each of in, out, uniform, and buffers
     std::vector<TOffsetRange> usedAtomics;  // sets of bindings used by atomic counters
-    std::vector<TXfbBuffer> xfbBuffers;     // all the data we need to track per xfb buffer
     std::unordered_set<int> usedConstantId; // specialization constant ids used
     std::set<TString> semanticNameSet;
 
+    EShTextureSamplerTransformMode textureSamplerTransformMode;
+
+    // source code of shader, useful as part of debug information
+    std::string sourceFile;
+    std::string sourceText;
+
+    // for OpModuleProcessed, or equivalent
+    TProcesses processes;
+
+    bool needToLegalize;
+    bool binaryDoubleOutput;
+
+    std::unordered_map<std::string, int> uniformLocationOverrides;
+    int uniformLocationBase;
+
 private:
     void operator=(TIntermediate&); // prevent assignments
 };
diff --git a/glslang/MachineIndependent/parseVersions.h b/glslang/MachineIndependent/parseVersions.h
old mode 100755
new mode 100644
index 0c85f8a..be468da
--- a/glslang/MachineIndependent/parseVersions.h
+++ b/glslang/MachineIndependent/parseVersions.h
@@ -1,5 +1,6 @@
 //
 // Copyright (C) 2016 Google, Inc.
+// Copyright (C) 2017 ARM Limited.
 //
 // All rights reserved.
 //
@@ -68,6 +69,7 @@
     virtual void requireStage(const TSourceLoc&, EShLanguage, const char* featureDesc);
     virtual void checkDeprecated(const TSourceLoc&, int queryProfiles, int depVersion, const char* featureDesc);
     virtual void requireNotRemoved(const TSourceLoc&, int queryProfiles, int removedVersion, const char* featureDesc);
+    virtual void unimplemented(const TSourceLoc&, const char* featureDesc);
     virtual void requireExtensions(const TSourceLoc&, int numExtensions, const char* const extensions[], const char* featureDesc);
     virtual void ppRequireExtensions(const TSourceLoc&, int numExtensions, const char* const extensions[], const char* featureDesc);
     virtual TExtensionBehavior getExtensionBehavior(const char*);
@@ -76,16 +78,32 @@
     virtual void updateExtensionBehavior(int line, const char* const extension, const char* behavior);
     virtual void fullIntegerCheck(const TSourceLoc&, const char* op);
     virtual void doubleCheck(const TSourceLoc&, const char* op);
-#ifdef AMD_EXTENSIONS
     virtual void float16Check(const TSourceLoc&, const char* op, bool builtIn = false);
+    virtual void float16ScalarVectorCheck(const TSourceLoc&, const char* op, bool builtIn = false);
+    virtual bool float16Arithmetic();
+    virtual void requireFloat16Arithmetic(const TSourceLoc& loc, const char* op, const char* featureDesc);
+    virtual void int16ScalarVectorCheck(const TSourceLoc&, const char* op, bool builtIn = false);
+    virtual bool int16Arithmetic();
+    virtual void requireInt16Arithmetic(const TSourceLoc& loc, const char* op, const char* featureDesc);
+    virtual void int8ScalarVectorCheck(const TSourceLoc&, const char* op, bool builtIn = false);
+    virtual bool int8Arithmetic();
+    virtual void requireInt8Arithmetic(const TSourceLoc& loc, const char* op, const char* featureDesc);
+#ifdef AMD_EXTENSIONS
+    virtual void float16OpaqueCheck(const TSourceLoc&, const char* op, bool builtIn = false);
 #endif
     virtual void int64Check(const TSourceLoc&, const char* op, bool builtIn = false);
+    virtual void explicitInt8Check(const TSourceLoc&, const char* op, bool builtIn = false);
+    virtual void explicitInt16Check(const TSourceLoc&, const char* op, bool builtIn = false);
+    virtual void explicitInt32Check(const TSourceLoc&, const char* op, bool builtIn = false);
+    virtual void explicitFloat32Check(const TSourceLoc&, const char* op, bool builtIn = false);
+    virtual void explicitFloat64Check(const TSourceLoc&, const char* op, bool builtIn = false);
     virtual void spvRemoved(const TSourceLoc&, const char* op);
     virtual void vulkanRemoved(const TSourceLoc&, const char* op);
     virtual void requireVulkan(const TSourceLoc&, const char* op);
     virtual void requireSpv(const TSourceLoc&, const char* op);
     virtual bool checkExtensionsRequested(const TSourceLoc&, int numExtensions, const char* const extensions[], const char* featureDesc);
     virtual void updateExtensionBehavior(const char* const extension, TExtensionBehavior);
+    virtual void checkExtensionStage(const TSourceLoc&, const char* const extension);
 
     virtual void C_DECL error(const TSourceLoc&, const char* szReason, const char* szToken,
         const char* szExtraInfoFormat, ...) = 0;
@@ -111,6 +129,7 @@
     bool relaxedErrors()    const { return (messages & EShMsgRelaxedErrors) != 0; }
     bool suppressWarnings() const { return (messages & EShMsgSuppressWarnings) != 0; }
     bool isReadingHLSL()    const { return (messages & EShMsgReadHlsl) == EShMsgReadHlsl; }
+    bool hlslEnable16BitTypes() const { return (messages & EShMsgHlslEnable16BitTypes) != 0; }
 
     TInfoSink& infoSink;
 
diff --git a/glslang/MachineIndependent/pch.cpp b/glslang/MachineIndependent/pch.cpp
new file mode 100644
index 0000000..b7a0865
--- /dev/null
+++ b/glslang/MachineIndependent/pch.cpp
@@ -0,0 +1,35 @@
+//
+// Copyright (C) 2018 The Khronos Group Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+//
+//    Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//    Redistributions in binary form must reproduce the above
+//    copyright notice, this list of conditions and the following
+//    disclaimer in the documentation and/or other materials provided
+//    with the distribution.
+//
+//    Neither the name of 3Dlabs Inc. Ltd. nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+// POSSIBILITY OF SUCH DAMAGE.
+//
+
+#include "pch.h"
diff --git a/glslang/MachineIndependent/pch.h b/glslang/MachineIndependent/pch.h
new file mode 100644
index 0000000..6ea3761
--- /dev/null
+++ b/glslang/MachineIndependent/pch.h
@@ -0,0 +1,49 @@
+#ifndef _PCH_H
+#define _PCH_H
+//
+// Copyright (C) 2018 The Khronos Group Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+//
+//    Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//    Redistributions in binary form must reproduce the above
+//    copyright notice, this list of conditions and the following
+//    disclaimer in the documentation and/or other materials provided
+//    with the distribution.
+//
+//    Neither the name of 3Dlabs Inc. Ltd. nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+// POSSIBILITY OF SUCH DAMAGE.
+//
+#include <sstream>
+#include <cstdlib>
+#include <cstring>
+#include <cctype>
+#include <climits>
+#include <iostream>
+#include <sstream>
+#include <memory>
+#include "SymbolTable.h"
+#include "ParseHelper.h"
+#include "Scan.h"
+#include "ScanContext.h"
+
+#endif /* _PCH_H */
diff --git a/glslang/MachineIndependent/preprocessor/Pp.cpp b/glslang/MachineIndependent/preprocessor/Pp.cpp
old mode 100644
new mode 100755
index e71e79c..2000b77
--- a/glslang/MachineIndependent/preprocessor/Pp.cpp
+++ b/glslang/MachineIndependent/preprocessor/Pp.cpp
@@ -76,12 +76,15 @@
 NVIDIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 \****************************************************************************/
 
+#ifndef _CRT_SECURE_NO_WARNINGS
 #define _CRT_SECURE_NO_WARNINGS
+#endif
 
 #include <sstream>
 #include <cstdlib>
 #include <cstring>
 #include <cctype>
+#include <climits>
 
 #include "PpContext.h"
 #include "PpTokens.h"
@@ -106,11 +109,12 @@
 
     // save the macro name
     const int defAtom = atomStrings.getAddAtom(ppToken->name);
+    TSourceLoc defineLoc = ppToken->loc; // because ppToken might go to the next line before we report errors
 
     // gather parameters to the macro, between (...)
     token = scanToken(ppToken);
-    if (token == '(' && ! ppToken->space) {
-        mac.emptyArgs = 1;
+    if (token == '(' && !ppToken->space) {
+        mac.functionLike = 1;
         do {
             token = scanToken(ppToken);
             if (mac.args.size() == 0 && token == ')')
@@ -120,7 +124,6 @@
 
                 return token;
             }
-            mac.emptyArgs = 0;
             const int argAtom = atomStrings.getAddAtom(ppToken->name);
 
             // check for duplication of parameter name
@@ -146,7 +149,6 @@
     }
 
     // record the definition of the macro
-    TSourceLoc defineLoc = ppToken->loc; // because ppToken is going to go to the next line before we report errors
     while (token != '\n' && token != EndOfInput) {
         mac.body.putToken(token, ppToken);
         token = scanToken(ppToken);
@@ -161,7 +163,9 @@
             // Already defined -- need to make sure they are identical:
             // "Two replacement lists are identical if and only if the preprocessing tokens in both have the same number,
             // ordering, spelling, and white-space separation, where all white-space separations are considered identical."
-            if (existing->args.size() != mac.args.size() || existing->emptyArgs != mac.emptyArgs)
+            if (existing->functionLike != mac.functionLike)
+                parseContext.ppError(defineLoc, "Macro redefined; function-like versus object-like:", "#define", atomStrings.getString(defAtom));
+            else if (existing->args.size() != mac.args.size())
                 parseContext.ppError(defineLoc, "Macro redefined; different number of arguments:", "#define", atomStrings.getString(defAtom));
             else {
                 if (existing->args != mac.args)
@@ -239,15 +243,20 @@
         int nextAtom = atomStrings.getAtom(ppToken->name);
         if (nextAtom == PpAtomIf || nextAtom == PpAtomIfdef || nextAtom == PpAtomIfndef) {
             depth++;
-            ifdepth++;
-            elsetracker++;
+            if (ifdepth >= maxIfNesting || elsetracker >= maxIfNesting) {
+                parseContext.ppError(ppToken->loc, "maximum nesting depth exceeded", "#if/#ifdef/#ifndef", "");
+                return EndOfInput;
+            } else {
+                ifdepth++;
+                elsetracker++;
+            }
         } else if (nextAtom == PpAtomEndif) {
             token = extraTokenCheck(nextAtom, ppToken, scanToken(ppToken));
             elseSeen[elsetracker] = false;
             --elsetracker;
             if (depth == 0) {
                 // found the #endif we are looking for
-                if (ifdepth)
+                if (ifdepth > 0)
                     --ifdepth;
                 break;
             }
@@ -264,7 +273,7 @@
                     parseContext.ppError(ppToken->loc, "#elif after #else", "#elif", "");
                 /* we decrement ifdepth here, because CPPif will increment
                 * it and we really want to leave it alone */
-                if (ifdepth) {
+                if (ifdepth > 0) {
                     --ifdepth;
                     elseSeen[elsetracker] = false;
                     --elsetracker;
@@ -343,8 +352,8 @@
     int op_add(int a, int b) { return a + b; }
     int op_sub(int a, int b) { return a - b; }
     int op_mul(int a, int b) { return a * b; }
-    int op_div(int a, int b) { return a / b; }
-    int op_mod(int a, int b) { return a % b; }
+    int op_div(int a, int b) { return a == INT_MIN && b == -1 ? 0 : a / b; }
+    int op_mod(int a, int b) { return a == INT_MIN && b == -1 ? 0 : a % b; }
     int op_pos(int a) { return a; }
     int op_neg(int a) { return -a; }
     int op_cmpl(int a) { return ~a; }
@@ -391,6 +400,14 @@
     TSourceLoc loc = ppToken->loc;  // because we sometimes read the newline before reporting the error
     if (token == PpAtomIdentifier) {
         if (strcmp("defined", ppToken->name) == 0) {
+            if (! parseContext.isReadingHLSL() && isMacroInput()) {
+                if (parseContext.relaxedErrors())
+                    parseContext.ppWarn(ppToken->loc, "nonportable when expanded from macros for preprocessor expression",
+                                                      "defined", "");
+                else
+                    parseContext.ppError(ppToken->loc, "cannot use in preprocessor expression when expanded from macros",
+                                                       "defined", "");
+            }
             bool needclose = 0;
             token = scanToken(ppToken);
             if (token == '(') {
@@ -499,15 +516,16 @@
 int TPpContext::evalToToken(int token, bool shortCircuit, int& res, bool& err, TPpToken* ppToken)
 {
     while (token == PpAtomIdentifier && strcmp("defined", ppToken->name) != 0) {
-        int macroReturn = MacroExpand(ppToken, true, false);
-        if (macroReturn == 0) {
+        switch (MacroExpand(ppToken, true, false)) {
+        case MacroExpandNotStarted:
+        case MacroExpandError:
             parseContext.ppError(ppToken->loc, "can't evaluate expression", "preprocessor evaluation", "");
             err = true;
             res = 0;
-            token = scanToken(ppToken);
             break;
-        }
-        if (macroReturn == -1) {
+        case MacroExpandStarted:
+            break;
+        case MacroExpandUndef:
             if (! shortCircuit && parseContext.profile == EEsProfile) {
                 const char* message = "undefined macro in expression not allowed in es profile";
                 if (parseContext.relaxedErrors())
@@ -515,8 +533,11 @@
                 else
                     parseContext.ppError(ppToken->loc, message, "preprocessor evaluation", ppToken->name);
             }
+            break;
         }
         token = scanToken(ppToken);
+        if (err)
+            break;
     }
 
     return token;
@@ -526,11 +547,12 @@
 int TPpContext::CPPif(TPpToken* ppToken)
 {
     int token = scanToken(ppToken);
-    elsetracker++;
-    ifdepth++;
-    if (ifdepth > maxIfNesting) {
+    if (ifdepth >= maxIfNesting || elsetracker >= maxIfNesting) {
         parseContext.ppError(ppToken->loc, "maximum nesting depth exceeded", "#if", "");
-        return 0;
+        return EndOfInput;
+    } else {
+        elsetracker++;
+        ifdepth++;
     }
     int res = 0;
     bool err = false;
@@ -546,11 +568,14 @@
 int TPpContext::CPPifdef(int defined, TPpToken* ppToken)
 {
     int token = scanToken(ppToken);
-    if (++ifdepth > maxIfNesting) {
+    if (ifdepth > maxIfNesting || elsetracker > maxIfNesting) {
         parseContext.ppError(ppToken->loc, "maximum nesting depth exceeded", "#ifdef", "");
-        return 0;
+        return EndOfInput;
+    } else {
+        elsetracker++;
+        ifdepth++;
     }
-    elsetracker++;
+
     if (token != PpAtomIdentifier) {
         if (defined)
             parseContext.ppError(ppToken->loc, "must be followed by macro name", "#ifdef", "");
@@ -611,14 +636,14 @@
     TShader::Includer::IncludeResult* res = nullptr;
     if (startWithLocalSearch)
         res = includer.includeLocal(filename.c_str(), currentSourceFile.c_str(), includeStack.size() + 1);
-    if (! res || res->headerName.empty()) {
+    if (res == nullptr || res->headerName.empty()) {
         includer.releaseInclude(res);
         res = includer.includeSystem(filename.c_str(), currentSourceFile.c_str(), includeStack.size() + 1);
     }
 
     // Process the results
-    if (res && !res->headerName.empty()) {
-        if (res->headerData && res->headerLength) {
+    if (res != nullptr && !res->headerName.empty()) {
+        if (res->headerData != nullptr && res->headerLength > 0) {
             // path for processing one or more tokens from an included header, hand off 'res'
             const bool forNextLine = parseContext.lineDirectiveShouldSetNextLine();
             std::ostringstream prologue;
@@ -636,8 +661,8 @@
     } else {
         // error path, clean up
         std::string message =
-            res ? std::string(res->headerData, res->headerLength)
-                : std::string("Could not process include directive");
+            res != nullptr ? std::string(res->headerData, res->headerLength)
+                           : std::string("Could not process include directive");
         parseContext.ppError(directiveLoc, message.c_str(), "#include", "for header name: %s", filename.c_str());
         includer.releaseInclude(res);
     }
@@ -711,11 +736,10 @@
     TSourceLoc loc = ppToken->loc;
 
     while (token != '\n' && token != EndOfInput) {
-        if (token == PpAtomConstInt   || token == PpAtomConstUint   ||
+        if (token == PpAtomConstInt16 || token == PpAtomConstUint16 ||
+            token == PpAtomConstInt   || token == PpAtomConstUint   ||
             token == PpAtomConstInt64 || token == PpAtomConstUint64 ||
-#ifdef AMD_EXTENSIONS
             token == PpAtomConstFloat16 ||
-#endif
             token == PpAtomConstFloat || token == PpAtomConstDouble) {
                 message.append(ppToken->name);
         } else if (token == PpAtomIdentifier || token == PpAtomConstString) {
@@ -748,11 +772,13 @@
         case PpAtomConstUint:
         case PpAtomConstInt64:
         case PpAtomConstUint64:
+#ifdef AMD_EXTENSIONS
+        case PpAtomConstInt16:
+        case PpAtomConstUint16:
+#endif
         case PpAtomConstFloat:
         case PpAtomConstDouble:
-#ifdef AMD_EXTENSIONS
         case PpAtomConstFloat16:
-#endif
             tokens.push_back(ppToken->name);
             break;
         default:
@@ -871,16 +897,16 @@
             token = CPPdefine(ppToken);
             break;
         case PpAtomElse:
-            if (elsetracker[elseSeen])
+            if (elseSeen[elsetracker])
                 parseContext.ppError(ppToken->loc, "#else after #else", "#else", "");
-            elsetracker[elseSeen] = true;
-            if (! ifdepth)
+            elseSeen[elsetracker] = true;
+            if (ifdepth == 0)
                 parseContext.ppError(ppToken->loc, "mismatched statements", "#else", "");
             token = extraTokenCheck(PpAtomElse, ppToken, scanToken(ppToken));
             token = CPPelse(0, ppToken);
             break;
         case PpAtomElif:
-            if (! ifdepth)
+            if (ifdepth == 0)
                 parseContext.ppError(ppToken->loc, "mismatched statements", "#elif", "");
             if (elseSeen[elsetracker])
                 parseContext.ppError(ppToken->loc, "#elif after #else", "#elif", "");
@@ -891,7 +917,7 @@
             token = CPPelse(0, ppToken);
             break;
         case PpAtomEndif:
-            if (! ifdepth)
+            if (ifdepth == 0)
                 parseContext.ppError(ppToken->loc, "mismatched statements", "#endif", "");
             else {
                 elseSeen[elsetracker] = false;
@@ -990,15 +1016,25 @@
     int token;
     while ((token = scanToken(ppToken)) != tMarkerInput::marker && token != EndOfInput) {
         token = tokenPaste(token, *ppToken);
+        if (token == PpAtomIdentifier) {
+            switch (MacroExpand(ppToken, false, newLineOkay)) {
+            case MacroExpandNotStarted:
+                break;
+            case MacroExpandError:
+                token = EndOfInput;
+                break;
+            case MacroExpandStarted:
+            case MacroExpandUndef:
+                continue;
+            }
+        }
         if (token == tMarkerInput::marker || token == EndOfInput)
             break;
-        if (token == PpAtomIdentifier && MacroExpand(ppToken, false, newLineOkay) != 0)
-            continue;
         expandedArg->putToken(token, ppToken);
     }
 
     if (token == EndOfInput) {
-        // MacroExpand ate the marker, so had bad input, recover
+        // Error, or MacroExpand ate the marker, so had bad input, recover
         delete expandedArg;
         expandedArg = nullptr;
     } else {
@@ -1053,6 +1089,10 @@
         pasting = true;
     }
 
+    // HLSL does expand macros before concatenation
+    if (pasting && pp->parseContext.isReadingHLSL())
+        pasting = false;
+
     // TODO: preprocessor:  properly handle whitespace (or lack of it) between tokens when expanding
     if (token == PpAtomIdentifier) {
         int i;
@@ -1090,14 +1130,18 @@
 }
 
 //
-// Check a token to see if it is a macro that should be expanded.
-// If it is, and defined, push a tInput that will produce the appropriate expansion
-// and return 1.
-// If it is, but undefined, and expandUndef is requested, push a tInput that will
-// expand to 0 and return -1.
-// Otherwise, return 0 to indicate no expansion, which is not necessarily an error.
+// Check a token to see if it is a macro that should be expanded:
+// - If it is, and defined, push a tInput that will produce the appropriate
+//   expansion and return MacroExpandStarted.
+// - If it is, but undefined, and expandUndef is requested, push a tInput
+//   that will expand to 0 and return MacroExpandUndef.
+// - Otherwise, there is no expansion, and there are two cases:
+//   * It might be okay there is no expansion, and no specific error was
+//     detected. Returns MacroExpandNotStarted.
+//   * The expansion was started, but could not be completed, due to an error
+//     that cannot be recovered from. Returns MacroExpandError.
 //
-int TPpContext::MacroExpand(TPpToken* ppToken, bool expandUndef, bool newLineOkay)
+MacroExpandResult TPpContext::MacroExpand(TPpToken* ppToken, bool expandUndef, bool newLineOkay)
 {
     ppToken->space = false;
     int macroAtom = atomStrings.getAtom(ppToken->name);
@@ -1106,7 +1150,7 @@
         ppToken->ival = parseContext.getCurrentLoc().line;
         snprintf(ppToken->name, sizeof(ppToken->name), "%d", ppToken->ival);
         UngetToken(PpAtomConstInt, ppToken);
-        return 1;
+        return MacroExpandStarted;
 
     case PpAtomFileMacro: {
         if (parseContext.getCurrentLoc().name)
@@ -1114,52 +1158,55 @@
         ppToken->ival = parseContext.getCurrentLoc().string;
         snprintf(ppToken->name, sizeof(ppToken->name), "%s", ppToken->loc.getStringNameOrNum().c_str());
         UngetToken(PpAtomConstInt, ppToken);
-        return 1;
+        return MacroExpandStarted;
     }
 
     case PpAtomVersionMacro:
         ppToken->ival = parseContext.version;
         snprintf(ppToken->name, sizeof(ppToken->name), "%d", ppToken->ival);
         UngetToken(PpAtomConstInt, ppToken);
-        return 1;
+        return MacroExpandStarted;
 
     default:
         break;
     }
 
     MacroSymbol* macro = macroAtom == 0 ? nullptr : lookupMacroDef(macroAtom);
-    int token;
-    int depth = 0;
 
     // no recursive expansions
     if (macro != nullptr && macro->busy)
-        return 0;
+        return MacroExpandNotStarted;
 
     // not expanding undefined macros
     if ((macro == nullptr || macro->undef) && ! expandUndef)
-        return 0;
+        return MacroExpandNotStarted;
 
     // 0 is the value of an undefined macro
     if ((macro == nullptr || macro->undef) && expandUndef) {
         pushInput(new tZeroInput(this));
-        return -1;
+        return MacroExpandUndef;
     }
 
     tMacroInput *in = new tMacroInput(this);
 
     TSourceLoc loc = ppToken->loc;  // in case we go to the next line before discovering the error
     in->mac = macro;
-    if (macro->args.size() > 0 || macro->emptyArgs) {
-        token = scanToken(ppToken);
+    if (macro->functionLike) {
+        // We don't know yet if this will be a successful call of a
+        // function-like macro; need to look for a '(', but without trashing
+        // the passed in ppToken, until we know we are no longer speculative.
+        TPpToken parenToken;
+        int token = scanToken(&parenToken);
         if (newLineOkay) {
             while (token == '\n')
-                token = scanToken(ppToken);
+                token = scanToken(&parenToken);
         }
         if (token != '(') {
-            parseContext.ppError(loc, "expected '(' following", "macro expansion", atomStrings.getString(macroAtom));
-            UngetToken(token, ppToken);
+            // Function-like macro called with object-like syntax: okay, don't expand.
+            // (We ate exactly one token that might not be white space; put it back.
+            UngetToken(token, &parenToken);
             delete in;
-            return 0;
+            return MacroExpandNotStarted;
         }
         in->args.resize(in->mac->args.size());
         for (size_t i = 0; i < in->mac->args.size(); i++)
@@ -1170,39 +1217,44 @@
         size_t arg = 0;
         bool tokenRecorded = false;
         do {
-            depth = 0;
-            while (1) {
+            TVector<char> nestStack;
+            while (true) {
                 token = scanToken(ppToken);
                 if (token == EndOfInput || token == tMarkerInput::marker) {
                     parseContext.ppError(loc, "End of input in macro", "macro expansion", atomStrings.getString(macroAtom));
                     delete in;
-                    return 0;
+                    return MacroExpandError;
                 }
                 if (token == '\n') {
                     if (! newLineOkay) {
                         parseContext.ppError(loc, "End of line in macro substitution:", "macro expansion", atomStrings.getString(macroAtom));
                         delete in;
-                        return 0;
+                        return MacroExpandError;
                     }
                     continue;
                 }
                 if (token == '#') {
                     parseContext.ppError(ppToken->loc, "unexpected '#'", "macro expansion", atomStrings.getString(macroAtom));
                     delete in;
-                    return 0;
+                    return MacroExpandError;
                 }
                 if (in->mac->args.size() == 0 && token != ')')
                     break;
-                if (depth == 0 && (token == ',' || token == ')'))
+                if (nestStack.size() == 0 && (token == ',' || token == ')'))
                     break;
                 if (token == '(')
-                    depth++;
-                if (token == ')')
-                    depth--;
+                    nestStack.push_back(')');
+                else if (token == '{' && parseContext.isReadingHLSL())
+                    nestStack.push_back('}');
+                else if (nestStack.size() > 0 && token == nestStack.back())
+                    nestStack.pop_back();
                 in->args[arg]->putToken(token, ppToken);
                 tokenRecorded = true;
             }
+            // end of single argument scan
+
             if (token == ')') {
+                // closing paren of call
                 if (in->mac->args.size() == 1 && tokenRecorded == 0)
                     break;
                 arg++;
@@ -1210,23 +1262,25 @@
             }
             arg++;
         } while (arg < in->mac->args.size());
+        // end of all arguments scan
 
         if (arg < in->mac->args.size())
             parseContext.ppError(loc, "Too few args in Macro", "macro expansion", atomStrings.getString(macroAtom));
         else if (token != ')') {
-            depth=0;
+            // Error recover code; find end of call, if possible
+            int depth = 0;
             while (token != EndOfInput && (depth > 0 || token != ')')) {
-                if (token == ')')
+                if (token == ')' || token == '}')
                     depth--;
                 token = scanToken(ppToken);
-                if (token == '(')
+                if (token == '(' || token == '{')
                     depth++;
             }
 
             if (token == EndOfInput) {
                 parseContext.ppError(loc, "End of input in macro", "macro expansion", atomStrings.getString(macroAtom));
                 delete in;
-                return 0;
+                return MacroExpandError;
             }
             parseContext.ppError(loc, "Too many args in macro", "macro expansion", atomStrings.getString(macroAtom));
         }
@@ -1241,7 +1295,7 @@
     macro->busy = 1;
     macro->body.reset();
 
-    return 1;
+    return MacroExpandStarted;
 }
 
 } // end namespace glslang
diff --git a/glslang/MachineIndependent/preprocessor/PpAtom.cpp b/glslang/MachineIndependent/preprocessor/PpAtom.cpp
index 52df3b0..06c2333 100644
--- a/glslang/MachineIndependent/preprocessor/PpAtom.cpp
+++ b/glslang/MachineIndependent/preprocessor/PpAtom.cpp
@@ -76,7 +76,9 @@
 NVIDIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 \****************************************************************************/
 
+#ifndef _CRT_SECURE_NO_WARNINGS
 #define _CRT_SECURE_NO_WARNINGS
+#endif
 
 #include <cassert>
 #include <cstdlib>
diff --git a/glslang/MachineIndependent/preprocessor/PpContext.cpp b/glslang/MachineIndependent/preprocessor/PpContext.cpp
index 6a2e05f..c89b376 100644
--- a/glslang/MachineIndependent/preprocessor/PpContext.cpp
+++ b/glslang/MachineIndependent/preprocessor/PpContext.cpp
@@ -77,6 +77,7 @@
 \****************************************************************************/
 
 #include <cstdlib>
+#include <locale>
 
 #include "PpContext.h"
 
@@ -91,6 +92,8 @@
     for (elsetracker = 0; elsetracker < maxIfNesting; elsetracker++)
         elseSeen[elsetracker] = false;
     elsetracker = 0;
+
+    strtodStream.imbue(std::locale::classic());
 }
 
 TPpContext::~TPpContext()
diff --git a/glslang/MachineIndependent/preprocessor/PpContext.h b/glslang/MachineIndependent/preprocessor/PpContext.h
index a459d9a..64681fc 100644
--- a/glslang/MachineIndependent/preprocessor/PpContext.h
+++ b/glslang/MachineIndependent/preprocessor/PpContext.h
@@ -80,6 +80,7 @@
 
 #include <stack>
 #include <unordered_map>
+#include <sstream>
 
 #include "../ParseHelper.h"
 
@@ -92,13 +93,16 @@
 
 class TPpToken {
 public:
-    TPpToken() : space(false), i64val(0)
+    TPpToken() { clear(); }
+    void clear()
     {
+        space = false;
+        i64val = 0;
         loc.init();
         name[0] = 0;
     }
 
-    // This is used for comparing macro definitions, so checks what is relevant for that.
+    // Used for comparing macro definitions, so checks what is relevant for that.
     bool operator==(const TPpToken& right)
     {
         return space == right.space &&
@@ -108,15 +112,17 @@
     bool operator!=(const TPpToken& right) { return ! operator==(right); }
 
     TSourceLoc loc;
-    bool space;  // true if a space (for white space or a removed comment) should also be recognized, in front of the token returned
-
+    // True if a space (for white space or a removed comment) should also be
+    // recognized, in front of the token returned:
+    bool space;
+    // Numeric value of the token:
     union {
         int ival;
         double dval;
         long long i64val;
     };
-
-    char   name[MaxTokenLength + 1];
+    // Text string of the token:
+    char name[MaxTokenLength + 1];
 };
 
 class TStringAtomMap {
@@ -177,6 +183,13 @@
 
 class TInputScanner;
 
+enum MacroExpandResult {
+    MacroExpandNotStarted, // macro not expanded, which might not be an error
+    MacroExpandError,      // a clear error occurred while expanding, no expansion
+    MacroExpandStarted,    // macro expansion process has started
+    MacroExpandUndef       // macro is undefined and will be expanded
+};
+
 // This class is the result of turning a huge pile of C code communicating through globals
 // into a class.  This was done to allowing instancing to attain thread safety.
 // Don't expect too much in terms of OO design.
@@ -200,6 +213,7 @@
         virtual void ungetch() = 0;
         virtual bool peekPasting() { return false; }          // true when about to see ##
         virtual bool endOfReplacementList() { return false; } // true when at the end of a macro replacement list (RHS of #define)
+        virtual bool isMacroInput() { return false; }
 
         // Will be called when we start reading tokens from this instance
         virtual void notifyActivated() {}
@@ -253,12 +267,12 @@
     //
 
     struct MacroSymbol {
-        MacroSymbol() : emptyArgs(0), busy(0), undef(0) { }
+        MacroSymbol() : functionLike(0), busy(0), undef(0) { }
         TVector<int> args;
         TokenStream body;
-        unsigned emptyArgs : 1;
-        unsigned busy      : 1;
-        unsigned undef     : 1;
+        unsigned functionLike : 1;  // 0 means object-like, 1 means function-like
+        unsigned busy         : 1;
+        unsigned undef        : 1;
     };
 
     typedef TMap<int, MacroSymbol> TSymbolMap;
@@ -306,8 +320,9 @@
     void ungetChar() { inputStack.back()->ungetch(); }
     bool peekPasting() { return !inputStack.empty() && inputStack.back()->peekPasting(); }
     bool endOfReplacementList() { return inputStack.empty() || inputStack.back()->endOfReplacementList(); }
+    bool isMacroInput() { return inputStack.size() > 0 && inputStack.back()->isMacroInput(); }
 
-    static const int maxIfNesting = 64;
+    static const int maxIfNesting = 65;
 
     int ifdepth;                  // current #if-#else-#endif nesting in the cpp.c file (pre-processor)
     bool elseSeen[maxIfNesting];  // Keep a track of whether an else has been seen at a particular depth
@@ -329,6 +344,7 @@
         virtual void ungetch() override { assert(0); }
         bool peekPasting() override { return prepaste; }
         bool endOfReplacementList() override { return mac->body.atEnd(); }
+        bool isMacroInput() override { return true; }
 
         MacroSymbol *mac;
         TVector<TokenStream*> args;
@@ -391,7 +407,7 @@
     int readCPPline(TPpToken * ppToken);
     int scanHeaderName(TPpToken* ppToken, char delimit);
     TokenStream* PrescanMacroArg(TokenStream&, TPpToken*, bool newLineOkay);
-    int MacroExpand(TPpToken* ppToken, bool expandUndef, bool newLineOkay);
+    MacroExpandResult MacroExpand(TPpToken* ppToken, bool expandUndef, bool newLineOkay);
 
     //
     // From PpTokens.cpp
@@ -612,6 +628,8 @@
     std::string rootFileName;
     std::stack<TShader::Includer::IncludeResult*> includeStack;
     std::string currentSourceFile;
+
+    std::istringstream strtodStream;
 };
 
 } // end namespace glslang
diff --git a/glslang/MachineIndependent/preprocessor/PpMemory.cpp b/glslang/MachineIndependent/preprocessor/PpMemory.cpp
deleted file mode 100644
index e30db7f..0000000
--- a/glslang/MachineIndependent/preprocessor/PpMemory.cpp
+++ /dev/null
@@ -1,81 +0,0 @@
-//
-// Copyright (C) 2002-2005  3Dlabs Inc. Ltd.
-// Copyright (C) 2013 LunarG, Inc.
-// All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions
-// are met:
-//
-//    Redistributions of source code must retain the above copyright
-//    notice, this list of conditions and the following disclaimer.
-//
-//    Redistributions in binary form must reproduce the above
-//    copyright notice, this list of conditions and the following
-//    disclaimer in the documentation and/or other materials provided
-//    with the distribution.
-//
-//    Neither the name of 3Dlabs Inc. Ltd. nor the names of its
-//    contributors may be used to endorse or promote products derived
-//    from this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
-// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
-// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
-// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-// POSSIBILITY OF SUCH DAMAGE.
-//
-/****************************************************************************\
-Copyright (c) 2002, NVIDIA Corporation.
-
-NVIDIA Corporation("NVIDIA") supplies this software to you in
-consideration of your agreement to the following terms, and your use,
-installation, modification or redistribution of this NVIDIA software
-constitutes acceptance of these terms.  If you do not agree with these
-terms, please do not use, install, modify or redistribute this NVIDIA
-software.
-
-In consideration of your agreement to abide by the following terms, and
-subject to these terms, NVIDIA grants you a personal, non-exclusive
-license, under NVIDIA's copyrights in this original NVIDIA software (the
-"NVIDIA Software"), to use, reproduce, modify and redistribute the
-NVIDIA Software, with or without modifications, in source and/or binary
-forms; provided that if you redistribute the NVIDIA Software, you must
-retain the copyright notice of NVIDIA, this notice and the following
-text and disclaimers in all such redistributions of the NVIDIA Software.
-Neither the name, trademarks, service marks nor logos of NVIDIA
-Corporation may be used to endorse or promote products derived from the
-NVIDIA Software without specific prior written permission from NVIDIA.
-Except as expressly stated in this notice, no other rights or licenses
-express or implied, are granted by NVIDIA herein, including but not
-limited to any patent rights that may be infringed by your derivative
-works or by other works in which the NVIDIA Software may be
-incorporated. No hardware is licensed hereunder.
-
-THE NVIDIA SOFTWARE IS BEING PROVIDED ON AN "AS IS" BASIS, WITHOUT
-WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED,
-INCLUDING WITHOUT LIMITATION, WARRANTIES OR CONDITIONS OF TITLE,
-NON-INFRINGEMENT, MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
-ITS USE AND OPERATION EITHER ALONE OR IN COMBINATION WITH OTHER
-PRODUCTS.
-
-IN NO EVENT SHALL NVIDIA BE LIABLE FOR ANY SPECIAL, INDIRECT,
-INCIDENTAL, EXEMPLARY, CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
-TO, LOST PROFITS; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) OR ARISING IN ANY WAY
-OUT OF THE USE, REPRODUCTION, MODIFICATION AND/OR DISTRIBUTION OF THE
-NVIDIA SOFTWARE, HOWEVER CAUSED AND WHETHER UNDER THEORY OF CONTRACT,
-TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, EVEN IF
-NVIDIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-\****************************************************************************/
-
-namespace glslang {
-
-} // end namespace glslang
diff --git a/glslang/MachineIndependent/preprocessor/PpScanner.cpp b/glslang/MachineIndependent/preprocessor/PpScanner.cpp
index e72efc0..b1d937c 100644
--- a/glslang/MachineIndependent/preprocessor/PpScanner.cpp
+++ b/glslang/MachineIndependent/preprocessor/PpScanner.cpp
@@ -1,6 +1,7 @@
 //
 // Copyright (C) 2002-2005  3Dlabs Inc. Ltd.
 // Copyright (C) 2013 LunarG, Inc.
+// Copyright (C) 2017 ARM Limited.
 // All rights reserved.
 //
 // Redistribution and use in source and binary forms, with or without
@@ -76,7 +77,9 @@
 NVIDIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 \****************************************************************************/
 
+#ifndef _CRT_SECURE_NO_WARNINGS
 #define _CRT_SECURE_NO_WARNINGS
+#endif
 
 #include <cstdlib>
 #include <cstring>
@@ -99,34 +102,39 @@
 
 int TPpContext::lFloatConst(int len, int ch, TPpToken* ppToken)
 {
-    bool HasDecimalOrExponent = false;
-    int isDouble = 0;
-    bool generateFloat16 = false;
-    bool acceptFloat16 = parseContext.intermediate.getSource() == EShSourceHlsl;
-    bool isFloat16 = false;
-    bool requireHF = false;
-#ifdef AMD_EXTENSIONS
-    if (parseContext.extensionTurnedOn(E_GL_AMD_gpu_shader_half_float)) {
-        acceptFloat16 = true;
-        generateFloat16 = true;
-        requireHF = true;
-    }
-#endif
-
     const auto saveName = [&](int ch) {
         if (len <= MaxTokenLength)
             ppToken->name[len++] = static_cast<char>(ch);
     };
 
-    // Decimal:
+    // find the range of non-zero digits before the decimal point
+    int startNonZero = 0;
+    while (startNonZero < len && ppToken->name[startNonZero] == '0')
+        ++startNonZero;
+    int endNonZero = len;
+    while (endNonZero > startNonZero && ppToken->name[endNonZero-1] == '0')
+        --endNonZero;
+    int numWholeNumberDigits = endNonZero - startNonZero;
 
+    // accumulate the range's value
+    bool fastPath = numWholeNumberDigits <= 15;  // when the number gets too complex, set to false
+    unsigned long long wholeNumber = 0;
+    if (fastPath) {
+        for (int i = startNonZero; i < endNonZero; ++i)
+            wholeNumber = wholeNumber * 10 + (ppToken->name[i] - '0');
+    }
+    int decimalShift = len - endNonZero;
+
+    // Decimal point:
+    bool hasDecimalOrExponent = false;
     if (ch == '.') {
-        HasDecimalOrExponent = true;
+        hasDecimalOrExponent = true;
         saveName(ch);
         ch = getChar();
+        int firstDecimal = len;
 
         // 1.#INF or -1.#INF
-        if (ch == '#') {
+        if (ch == '#' && (ifdepth > 0 || parseContext.intermediate.getSource() == EShSourceHlsl)) {
             if ((len <  2) ||
                 (len == 2 && ppToken->name[0] != '1') ||
                 (len == 3 && ppToken->name[1] != '1' && !(ppToken->name[0] == '-' || ppToken->name[0] == '+')) ||
@@ -153,55 +161,99 @@
             }
         }
 
-        while (ch >= '0' && ch <= '9') {
+        // Consume leading-zero digits after the decimal point
+        while (ch == '0') {
             saveName(ch);
             ch = getChar();
         }
+        int startNonZeroDecimal = len;
+        int endNonZeroDecimal = len;
+
+        // Consume remaining digits, up to the exponent
+        while (ch >= '0' && ch <= '9') {
+            saveName(ch);
+            if (ch != '0')
+                endNonZeroDecimal = len;
+            ch = getChar();
+        }
+
+        // Compute accumulation up to the last non-zero digit
+        if (endNonZeroDecimal > startNonZeroDecimal) {
+            numWholeNumberDigits += endNonZeroDecimal - endNonZero - 1; // don't include the "."
+            if (numWholeNumberDigits > 15)
+                fastPath = false;
+            if (fastPath) {
+                for (int i = endNonZero; i < endNonZeroDecimal; ++i) {
+                    if (ppToken->name[i] != '.')
+                        wholeNumber = wholeNumber * 10 + (ppToken->name[i] - '0');
+                }
+            }
+            decimalShift = firstDecimal - endNonZeroDecimal;
+        }
     }
 
     // Exponent:
-
-    if (ch == 'e' || ch == 'E') {
-        HasDecimalOrExponent = true;
-        saveName(ch);
-        ch = getChar();
-        if (ch == '+' || ch == '-') {
+    bool negativeExponent = false;
+    double exponentValue = 0.0;
+    int exponent = 0;
+    {
+        if (ch == 'e' || ch == 'E') {
+            hasDecimalOrExponent = true;
             saveName(ch);
             ch = getChar();
-        }
-        if (ch >= '0' && ch <= '9') {
-            while (ch >= '0' && ch <= '9') {
+            if (ch == '+' || ch == '-') {
+                negativeExponent = ch == '-';
                 saveName(ch);
                 ch = getChar();
             }
-        } else {
-            parseContext.ppError(ppToken->loc, "bad character in float exponent", "", "");
+            if (ch >= '0' && ch <= '9') {
+                while (ch >= '0' && ch <= '9') {
+                    exponent = exponent * 10 + (ch - '0');
+                    saveName(ch);
+                    ch = getChar();
+                }
+            } else {
+                parseContext.ppError(ppToken->loc, "bad character in float exponent", "", "");
+            }
+        }
+
+        // Compensate for location of decimal
+        if (negativeExponent)
+            exponent -= decimalShift;
+        else {
+            exponent += decimalShift;
+            if (exponent < 0) {
+                negativeExponent = true;
+                exponent = -exponent;
+            }
+        }
+        if (exponent > 22)
+            fastPath = false;
+
+        if (fastPath) {
+            // Compute the floating-point value of the exponent
+            exponentValue = 1.0;
+            if (exponent > 0) {
+                double expFactor = 10;
+                while (exponent > 0) {
+                    if (exponent & 0x1)
+                        exponentValue *= expFactor;
+                    expFactor *= expFactor;
+                    exponent >>= 1;
+                }
+            }
         }
     }
 
     // Suffix:
-
+    bool isDouble = false;
+    bool isFloat16 = false;
     if (ch == 'l' || ch == 'L') {
-        parseContext.doubleCheck(ppToken->loc, "double floating-point suffix");
-        if (! HasDecimalOrExponent)
+        if (ifdepth == 0 && parseContext.intermediate.getSource() == EShSourceGlsl)
+            parseContext.doubleCheck(ppToken->loc, "double floating-point suffix");
+        if (ifdepth == 0 && !hasDecimalOrExponent)
             parseContext.ppError(ppToken->loc, "float literal needs a decimal point or exponent", "", "");
-        int ch2 = getChar();
-        if (ch2 != 'f' && ch2 != 'F') {
-            ungetChar();
-            ungetChar();
-        } else {
-            saveName(ch);
-            saveName(ch2);
-            isDouble = 1;
-        }
-    } else if (acceptFloat16 && (ch == 'h' || ch == 'H')) {
-#ifdef AMD_EXTENSIONS
-        if (generateFloat16)
-            parseContext.float16Check(ppToken->loc, "half floating-point suffix");
-#endif
-        if (!HasDecimalOrExponent)
-            parseContext.ppError(ppToken->loc, "float literal needs a decimal point or exponent", "", "");
-        if (requireHF) {
+        if (parseContext.intermediate.getSource() == EShSourceGlsl) {
             int ch2 = getChar();
             if (ch2 != 'f' && ch2 != 'F') {
                 ungetChar();
@@ -209,23 +261,43 @@
             } else {
                 saveName(ch);
                 saveName(ch2);
-                isFloat16 = generateFloat16;
+                isDouble = true;
             }
-        } else {
+        } else if (parseContext.intermediate.getSource() == EShSourceHlsl) {
             saveName(ch);
-            isFloat16 = generateFloat16;
+            isDouble = true;
+        }
+    } else if (ch == 'h' || ch == 'H') {
+        if (ifdepth == 0 && parseContext.intermediate.getSource() == EShSourceGlsl)
+            parseContext.float16Check(ppToken->loc, "half floating-point suffix");
+        if (ifdepth == 0 && !hasDecimalOrExponent)
+            parseContext.ppError(ppToken->loc, "float literal needs a decimal point or exponent", "", "");
+        if (parseContext.intermediate.getSource() == EShSourceGlsl) {
+            int ch2 = getChar();
+            if (ch2 != 'f' && ch2 != 'F') {
+                ungetChar();
+                ungetChar();
+            } else {
+                saveName(ch);
+                saveName(ch2);
+                isFloat16 = true;
+            }
+        } else if (parseContext.intermediate.getSource() == EShSourceHlsl) {
+            saveName(ch);
+            isFloat16 = true;
         }
     } else if (ch == 'f' || ch == 'F') {
-        parseContext.profileRequires(ppToken->loc,  EEsProfile, 300, nullptr, "floating-point suffix");
-        if (! parseContext.relaxedErrors())
+        if (ifdepth == 0)
+            parseContext.profileRequires(ppToken->loc,  EEsProfile, 300, nullptr, "floating-point suffix");
+        if (ifdepth == 0 && !parseContext.relaxedErrors())
             parseContext.profileRequires(ppToken->loc, ~EEsProfile, 120, nullptr, "floating-point suffix");
-        if (! HasDecimalOrExponent)
+        if (ifdepth == 0 && !hasDecimalOrExponent)
             parseContext.ppError(ppToken->loc, "float literal needs a decimal point or exponent", "", "");
         saveName(ch);
     } else
         ungetChar();
 
-    // Patch up the name, length, etc.
+    // Patch up the name and length for overflow
 
     if (len > MaxTokenLength) {
         len = MaxTokenLength;
@@ -233,8 +305,45 @@
     }
     ppToken->name[len] = '\0';
 
-    // Get the numerical value
-    ppToken->dval = strtod(ppToken->name, nullptr);
+    // Compute the numerical value
+    if (fastPath) {
+        // compute the floating-point value of the exponent
+        if (exponentValue == 0.0)
+            ppToken->dval = (double)wholeNumber;
+        else if (negativeExponent)
+            ppToken->dval = (double)wholeNumber / exponentValue;
+        else
+            ppToken->dval = (double)wholeNumber * exponentValue;
+    } else {
+        // slow path
+        ppToken->dval = 0.0;
+
+        // remove suffix
+        TString numstr(ppToken->name);
+        if (numstr.back() == 'f' || numstr.back() == 'F')
+            numstr.pop_back();
+        if (numstr.back() == 'h' || numstr.back() == 'H')
+            numstr.pop_back();
+        if (numstr.back() == 'l' || numstr.back() == 'L')
+            numstr.pop_back();
+
+        // use platform library
+        strtodStream.clear();
+        strtodStream.str(numstr.c_str());
+        strtodStream >> ppToken->dval;
+        if (strtodStream.fail()) {
+            // Assume failure combined with a large exponent was overflow, in
+            // an attempt to set INF.
+            if (!negativeExponent && exponent + numWholeNumberDigits > 300)
+                ppToken->i64val = 0x7ff0000000000000; // +Infinity
+            // Assume failure combined with a small exponent was overflow.
+            if (negativeExponent && exponent + numWholeNumberDigits > 300)
+                ppToken->dval = 0.0;
+            // Unknown reason for failure. Theory is that either
+            //  - the 0.0 is still there, or
+            //  - something reasonable was written that is better than 0.0
+        }
+    }
 
     // Return the right token type
     if (isDouble)
@@ -331,16 +440,23 @@
     int ch = 0;
     int ii = 0;
     unsigned long long ival = 0;
-    bool enableInt64 = pp->parseContext.version >= 450 && pp->parseContext.extensionTurnedOn(E_GL_ARB_gpu_shader_int64);
-    bool acceptHalf = pp->parseContext.intermediate.getSource() == EShSourceHlsl;
-#ifdef AMD_EXTENSIONS
-    if (pp->parseContext.extensionTurnedOn(E_GL_AMD_gpu_shader_half_float))
-        acceptHalf = true;
-#endif
-
     const auto floatingPointChar = [&](int ch) { return ch == '.' || ch == 'e' || ch == 'E' ||
                                                                      ch == 'f' || ch == 'F' ||
-                                                     (acceptHalf && (ch == 'h' || ch == 'H')); };
+                                                                     ch == 'h' || ch == 'H'; };
+
+    static const char* const Int64_Extensions[] = {
+        E_GL_ARB_gpu_shader_int64,
+        E_GL_EXT_shader_explicit_arithmetic_types,
+        E_GL_EXT_shader_explicit_arithmetic_types_int64 };
+    static const int Num_Int64_Extensions = sizeof(Int64_Extensions) / sizeof(Int64_Extensions[0]);
+
+    static const char* const Int16_Extensions[] = {
+#ifdef AMD_EXTENSIONS
+        E_GL_AMD_gpu_shader_int16,
+#endif
+        E_GL_EXT_shader_explicit_arithmetic_types,
+        E_GL_EXT_shader_explicit_arithmetic_types_int16 };
+    static const int Num_Int16_Extensions = sizeof(Int16_Extensions) / sizeof(Int16_Extensions[0]);
 
     ppToken->ival = 0;
     ppToken->i64val = 0;
@@ -404,6 +520,7 @@
 
                 bool isUnsigned = false;
                 bool isInt64 = false;
+                bool isInt16 = false;
                 ppToken->name[len++] = (char)ch;
                 ch = getch();
                 if ((ch >= '0' && ch <= '9') ||
@@ -412,7 +529,7 @@
 
                     ival = 0;
                     do {
-                        if (ival <= 0x0fffffff || (enableInt64 && ival <= 0x0fffffffffffffffull)) {
+                        if (len < MaxTokenLength && ival <= 0x0fffffffffffffffull) {
                             ppToken->name[len++] = (char)ch;
                             if (ch >= '0' && ch <= '9') {
                                 ii = ch - '0';
@@ -425,7 +542,10 @@
                             ival = (ival << 4) | ii;
                         } else {
                             if (! AlreadyComplained) {
-                                pp->parseContext.ppError(ppToken->loc, "hexadecimal literal too big", "", "");
+                                if(len < MaxTokenLength)
+                                    pp->parseContext.ppError(ppToken->loc, "hexadecimal literal too big", "", "");
+                                else
+                                    pp->parseContext.ppError(ppToken->loc, "hexadecimal literal too long", "", "");
                                 AlreadyComplained = 1;
                             }
                             ival = 0xffffffffffffffffull;
@@ -442,28 +562,62 @@
                         ppToken->name[len++] = (char)ch;
                     isUnsigned = true;
 
-                    if (enableInt64) {
-                        int nextCh = getch();
-                        if ((ch == 'u' && nextCh == 'l') || (ch == 'U' && nextCh == 'L')) {
-                            if (len < MaxTokenLength)
-                                ppToken->name[len++] = (char)nextCh;
-                            isInt64 = true;
-                        } else
-                            ungetch();
-                    }
-                }
-                else if (enableInt64 && (ch == 'l' || ch == 'L')) {
+                    int nextCh = getch();
+                    if (nextCh == 'l' || nextCh == 'L') {
+                        if (len < MaxTokenLength)
+                            ppToken->name[len++] = (char)nextCh;
+                        isInt64 = true;
+                    } else
+                        ungetch();
+
+#ifdef AMD_EXTENSIONS
+                    nextCh = getch();
+                    if ((nextCh == 's' || nextCh == 'S') &&
+                            pp->parseContext.intermediate.getSource() == EShSourceGlsl) {
+                        if (len < MaxTokenLength)
+                            ppToken->name[len++] = (char)nextCh;
+                        isInt16 = true;
+                    } else
+                        ungetch();
+#endif
+                } else if (ch == 'l' || ch == 'L') {
                     if (len < MaxTokenLength)
                         ppToken->name[len++] = (char)ch;
                     isInt64 = true;
+#ifdef AMD_EXTENSIONS
+                } else if ((ch == 's' || ch == 'S') &&
+                           pp->parseContext.intermediate.getSource() == EShSourceGlsl) {
+                    if (len < MaxTokenLength)
+                        ppToken->name[len++] = (char)ch;
+                    isInt16 = true;
+#endif
                 } else
                     ungetch();
                 ppToken->name[len] = '\0';
 
-                if (isInt64) {
+                if (isInt64 && pp->parseContext.intermediate.getSource() == EShSourceGlsl) {
+                    if (pp->ifdepth == 0) {
+                        pp->parseContext.requireProfile(ppToken->loc, ~EEsProfile,
+                                                        "64-bit hexadecimal literal");
+                        pp->parseContext.profileRequires(ppToken->loc, ~EEsProfile, 0,
+                            Num_Int64_Extensions, Int64_Extensions, "64-bit hexadecimal literal");
+                    }
                     ppToken->i64val = ival;
                     return isUnsigned ? PpAtomConstUint64 : PpAtomConstInt64;
+                } else if (isInt16) {
+                    if (pp->ifdepth == 0) {
+                        if (pp->parseContext.intermediate.getSource() == EShSourceGlsl) {
+                            pp->parseContext.requireProfile(ppToken->loc, ~EEsProfile,
+                                                             "16-bit hexadecimal literal");
+                            pp->parseContext.profileRequires(ppToken->loc, ~EEsProfile, 0,
+                                Num_Int16_Extensions, Int16_Extensions, "16-bit hexadecimal literal");
+                        }
+                    }
+                    ppToken->ival = (int)ival;
+                    return isUnsigned ? PpAtomConstUint16 : PpAtomConstInt16;
                 } else {
+                    if (ival > 0xffffffffu && !AlreadyComplained)
+                        pp->parseContext.ppError(ppToken->loc, "hexadecimal literal too big", "", "");
                     ppToken->ival = (int)ival;
                     return isUnsigned ? PpAtomConstUint : PpAtomConstInt;
                 }
@@ -472,6 +626,7 @@
 
                 bool isUnsigned = false;
                 bool isInt64 = false;
+                bool isInt16 = false;
                 bool octalOverflow = false;
                 bool nonOctal = false;
                 ival = 0;
@@ -484,7 +639,7 @@
                         pp->parseContext.ppError(ppToken->loc, "numeric literal too long", "", "");
                         AlreadyComplained = 1;
                     }
-                    if (ival <= 0x1fffffff || (enableInt64 && ival <= 0x1fffffffffffffffull)) {
+                    if (ival <= 0x1fffffffffffffffull) {
                         ii = ch - '0';
                         ival = (ival << 3) | ii;
                     } else
@@ -517,30 +672,65 @@
                         ppToken->name[len++] = (char)ch;
                     isUnsigned = true;
 
-                    if (enableInt64) {
-                        int nextCh = getch();
-                        if ((ch == 'u' && nextCh == 'l') || (ch == 'U' && nextCh == 'L')) {
-                            if (len < MaxTokenLength)
-                                ppToken->name[len++] = (char)nextCh;
-                            isInt64 = true;
-                        } else
-                            ungetch();
-                    }
-                }
-                else if (enableInt64 && (ch == 'l' || ch == 'L')) {
+                    int nextCh = getch();
+                    if (nextCh == 'l' || nextCh == 'L') {
+                        if (len < MaxTokenLength)
+                            ppToken->name[len++] = (char)nextCh;
+                        isInt64 = true;
+                    } else
+                        ungetch();
+
+#ifdef AMD_EXTENSIONS
+                    nextCh = getch();
+                    if ((nextCh == 's' || nextCh == 'S') && 
+                                pp->parseContext.intermediate.getSource() == EShSourceGlsl) {
+                        if (len < MaxTokenLength)
+                            ppToken->name[len++] = (char)nextCh;
+                        isInt16 = true;
+                    } else
+                        ungetch();
+#endif
+                } else if (ch == 'l' || ch == 'L') {
                     if (len < MaxTokenLength)
                         ppToken->name[len++] = (char)ch;
                     isInt64 = true;
+#ifdef AMD_EXTENSIONS
+                } else if ((ch == 's' || ch == 'S') && 
+                                pp->parseContext.intermediate.getSource() == EShSourceGlsl) {
+                    if (len < MaxTokenLength)
+                        ppToken->name[len++] = (char)ch;
+                    isInt16 = true;
+#endif
                 } else
                     ungetch();
                 ppToken->name[len] = '\0';
 
+                if (!isInt64 && ival > 0xffffffffu)
+                    octalOverflow = true;
+
                 if (octalOverflow)
                     pp->parseContext.ppError(ppToken->loc, "octal literal too big", "", "");
 
-                if (isInt64) {
+                if (isInt64 && pp->parseContext.intermediate.getSource() == EShSourceGlsl) {
+                    if (pp->ifdepth == 0) {
+                        pp->parseContext.requireProfile(ppToken->loc, ~EEsProfile,
+                                                        "64-bit octal literal");
+                        pp->parseContext.profileRequires(ppToken->loc, ~EEsProfile, 0,
+                            Num_Int64_Extensions, Int64_Extensions, "64-bit octal literal");
+                    }
                     ppToken->i64val = ival;
                     return isUnsigned ? PpAtomConstUint64 : PpAtomConstInt64;
+                } else if (isInt16) {
+                    if (pp->ifdepth == 0) {
+                        if (pp->parseContext.intermediate.getSource() == EShSourceGlsl) {
+                            pp->parseContext.requireProfile(ppToken->loc, ~EEsProfile,
+                                                            "16-bit octal literal");
+                            pp->parseContext.profileRequires(ppToken->loc, ~EEsProfile, 0,
+                                Num_Int16_Extensions, Int16_Extensions, "16-bit octal literal");
+                        }
+                    }
+                    ppToken->ival = (int)ival;
+                    return isUnsigned ? PpAtomConstUint16 : PpAtomConstInt16;
                 } else {
                     ppToken->ival = (int)ival;
                     return isUnsigned ? PpAtomConstUint : PpAtomConstInt;
@@ -567,24 +757,41 @@
                 int numericLen = len;
                 bool isUnsigned = false;
                 bool isInt64 = false;
+                bool isInt16 = false;
                 if (ch == 'u' || ch == 'U') {
                     if (len < MaxTokenLength)
                         ppToken->name[len++] = (char)ch;
                     isUnsigned = true;
 
-                    if (enableInt64) {
-                        int nextCh = getch();
-                        if ((ch == 'u' && nextCh == 'l') || (ch == 'U' && nextCh == 'L')) {
-                            if (len < MaxTokenLength)
-                                ppToken->name[len++] = (char)nextCh;
-                            isInt64 = true;
-                        } else
-                            ungetch();
-                    }
-                } else if (enableInt64 && (ch == 'l' || ch == 'L')) {
+                    int nextCh = getch();
+                    if (nextCh == 'l' || nextCh == 'L') {
+                        if (len < MaxTokenLength)
+                            ppToken->name[len++] = (char)nextCh;
+                        isInt64 = true;
+                    } else
+                        ungetch();
+
+#ifdef AMD_EXTENSIONS
+                    nextCh = getch();
+                    if ((nextCh == 's' || nextCh == 'S') &&
+                                pp->parseContext.intermediate.getSource() == EShSourceGlsl) {
+                        if (len < MaxTokenLength)
+                            ppToken->name[len++] = (char)nextCh;
+                        isInt16 = true;
+                    } else
+                        ungetch();
+#endif
+                } else if (ch == 'l' || ch == 'L') {
                     if (len < MaxTokenLength)
                         ppToken->name[len++] = (char)ch;
                     isInt64 = true;
+#ifdef AMD_EXTENSIONS
+                } else if ((ch == 's' || ch == 'S') &&
+                                pp->parseContext.intermediate.getSource() == EShSourceGlsl) {
+                    if (len < MaxTokenLength)
+                        ppToken->name[len++] = (char)ch;
+                    isInt16 = true;
+#endif
                 } else
                     ungetch();
 
@@ -594,10 +801,18 @@
                 const unsigned remainderMaxInt = 0xFFFFFFFFu - 10 * oneTenthMaxInt;
                 const unsigned long long oneTenthMaxInt64  = 0xFFFFFFFFFFFFFFFFull / 10;
                 const unsigned long long remainderMaxInt64 = 0xFFFFFFFFFFFFFFFFull - 10 * oneTenthMaxInt64;
+                const unsigned short oneTenthMaxInt16  = 0xFFFFu / 10;
+                const unsigned short remainderMaxInt16 = 0xFFFFu - 10 * oneTenthMaxInt16;
                 for (int i = 0; i < numericLen; i++) {
                     ch = ppToken->name[i] - '0';
-                    if ((enableInt64 == false && ((ival > oneTenthMaxInt) || (ival == oneTenthMaxInt && (unsigned)ch > remainderMaxInt))) ||
-                        (enableInt64 && ((ival > oneTenthMaxInt64) || (ival == oneTenthMaxInt64 && (unsigned long long)ch > remainderMaxInt64)))) {
+                    bool overflow = false;
+                    if (isInt64)
+                        overflow = (ival > oneTenthMaxInt64 || (ival == oneTenthMaxInt64 && (unsigned long long)ch > remainderMaxInt64));
+                    else if (isInt16)
+                        overflow = (ival > oneTenthMaxInt16 || (ival == oneTenthMaxInt16 && (unsigned short)ch > remainderMaxInt16));
+                    else
+                        overflow = (ival > oneTenthMaxInt || (ival == oneTenthMaxInt && (unsigned)ch > remainderMaxInt));
+                    if (overflow) {
                         pp->parseContext.ppError(ppToken->loc, "numeric literal too big", "", "");
                         ival = 0xFFFFFFFFFFFFFFFFull;
                         break;
@@ -605,9 +820,24 @@
                         ival = ival * 10 + ch;
                 }
 
-                if (isInt64) {
+                if (isInt64 && pp->parseContext.intermediate.getSource() == EShSourceGlsl) {
+                    if (pp->ifdepth == 0) {
+                        pp->parseContext.requireProfile(ppToken->loc, ~EEsProfile,
+                                                        "64-bit literal");
+                        pp->parseContext.profileRequires(ppToken->loc, ~EEsProfile, 0,
+                            Num_Int64_Extensions, Int64_Extensions, "64-bit literal");
+                    }
                     ppToken->i64val = ival;
                     return isUnsigned ? PpAtomConstUint64 : PpAtomConstInt64;
+                } else if (isInt16) {
+                    if (pp->ifdepth == 0 && pp->parseContext.intermediate.getSource() == EShSourceGlsl) {
+                        pp->parseContext.requireProfile(ppToken->loc, ~EEsProfile,
+                                                        "16-bit  literal");
+                        pp->parseContext.profileRequires(ppToken->loc, ~EEsProfile, 0,
+                            Num_Int16_Extensions, Int16_Extensions, "16-bit literal");
+                    }
+                    ppToken->ival = (int)ival;
+                    return isUnsigned ? PpAtomConstUint16 : PpAtomConstInt16;
                 } else {
                     ppToken->ival = (int)ival;
                     return isUnsigned ? PpAtomConstUint : PpAtomConstInt;
@@ -847,8 +1077,17 @@
             continue;
 
         // expand macros
-        if (token == PpAtomIdentifier && MacroExpand(&ppToken, false, true) != 0)
-            continue;
+        if (token == PpAtomIdentifier) {
+            switch (MacroExpand(&ppToken, false, true)) {
+            case MacroExpandNotStarted:
+                break;
+            case MacroExpandError:
+                return EndOfInput;
+            case MacroExpandStarted:
+            case MacroExpandUndef:
+                continue;
+            }
+        }
 
         switch (token) {
         case PpAtomIdentifier:
@@ -857,15 +1096,15 @@
         case PpAtomConstFloat:
         case PpAtomConstInt64:
         case PpAtomConstUint64:
+        case PpAtomConstInt16:
+        case PpAtomConstUint16:
         case PpAtomConstDouble:
-#ifdef AMD_EXTENSIONS
         case PpAtomConstFloat16:
-#endif
             if (ppToken.name[0] == '\0')
                 continue;
             break;
         case PpAtomConstString:
-            if (parseContext.intermediate.getSource() != EShSourceHlsl) {
+            if (ifdepth == 0 && parseContext.intermediate.getSource() != EShSourceHlsl) {
                 // HLSL allows string literals.
                 parseContext.ppError(ppToken.loc, "string literals not supported", "\"\"", "");
                 continue;
diff --git a/glslang/MachineIndependent/preprocessor/PpSymbols.cpp b/glslang/MachineIndependent/preprocessor/PpSymbols.cpp
deleted file mode 100644
index 700d82e..0000000
--- a/glslang/MachineIndependent/preprocessor/PpSymbols.cpp
+++ /dev/null
@@ -1,77 +0,0 @@
-//
-// Copyright (C) 2002-2005  3Dlabs Inc. Ltd.
-// Copyright (C) 2013 LunarG, Inc.
-// All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions
-// are met:
-//
-//    Redistributions of source code must retain the above copyright
-//    notice, this list of conditions and the following disclaimer.
-//
-//    Redistributions in binary form must reproduce the above
-//    copyright notice, this list of conditions and the following
-//    disclaimer in the documentation and/or other materials provided
-//    with the distribution.
-//
-//    Neither the name of 3Dlabs Inc. Ltd. nor the names of its
-//    contributors may be used to endorse or promote products derived
-//    from this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
-// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
-// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
-// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-// POSSIBILITY OF SUCH DAMAGE.
-//
-/****************************************************************************\
-Copyright (c) 2002, NVIDIA Corporation.
-
-NVIDIA Corporation("NVIDIA") supplies this software to you in
-consideration of your agreement to the following terms, and your use,
-installation, modification or redistribution of this NVIDIA software
-constitutes acceptance of these terms.  If you do not agree with these
-terms, please do not use, install, modify or redistribute this NVIDIA
-software.
-
-In consideration of your agreement to abide by the following terms, and
-subject to these terms, NVIDIA grants you a personal, non-exclusive
-license, under NVIDIA's copyrights in this original NVIDIA software (the
-"NVIDIA Software"), to use, reproduce, modify and redistribute the
-NVIDIA Software, with or without modifications, in source and/or binary
-forms; provided that if you redistribute the NVIDIA Software, you must
-retain the copyright notice of NVIDIA, this notice and the following
-text and disclaimers in all such redistributions of the NVIDIA Software.
-Neither the name, trademarks, service marks nor logos of NVIDIA
-Corporation may be used to endorse or promote products derived from the
-NVIDIA Software without specific prior written permission from NVIDIA.
-Except as expressly stated in this notice, no other rights or licenses
-express or implied, are granted by NVIDIA herein, including but not
-limited to any patent rights that may be infringed by your derivative
-works or by other works in which the NVIDIA Software may be
-incorporated. No hardware is licensed hereunder.
-
-THE NVIDIA SOFTWARE IS BEING PROVIDED ON AN "AS IS" BASIS, WITHOUT
-WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED,
-INCLUDING WITHOUT LIMITATION, WARRANTIES OR CONDITIONS OF TITLE,
-NON-INFRINGEMENT, MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
-ITS USE AND OPERATION EITHER ALONE OR IN COMBINATION WITH OTHER
-PRODUCTS.
-
-IN NO EVENT SHALL NVIDIA BE LIABLE FOR ANY SPECIAL, INDIRECT,
-INCIDENTAL, EXEMPLARY, CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
-TO, LOST PROFITS; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) OR ARISING IN ANY WAY
-OUT OF THE USE, REPRODUCTION, MODIFICATION AND/OR DISTRIBUTION OF THE
-NVIDIA SOFTWARE, HOWEVER CAUSED AND WHETHER UNDER THEORY OF CONTRACT,
-TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, EVEN IF
-NVIDIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-\****************************************************************************/
diff --git a/glslang/MachineIndependent/preprocessor/PpTokens.cpp b/glslang/MachineIndependent/preprocessor/PpTokens.cpp
index 7fa06a5..f4f1bd0 100644
--- a/glslang/MachineIndependent/preprocessor/PpTokens.cpp
+++ b/glslang/MachineIndependent/preprocessor/PpTokens.cpp
@@ -80,8 +80,10 @@
 // For recording and playing back the stream of tokens in a macro definition.
 //
 
-#if (defined(_MSC_VER) && _MSC_VER < 1900 /*vs2015*/)
+#ifndef _CRT_SECURE_NO_WARNINGS
 #define _CRT_SECURE_NO_WARNINGS
+#endif
+#if (defined(_MSC_VER) && _MSC_VER < 1900 /*vs2015*/)
 #define snprintf sprintf_s
 #endif
 
@@ -95,6 +97,56 @@
 
 namespace glslang {
 
+
+namespace {
+
+    // When recording (and playing back) should the backing name string
+    // be saved (restored)?
+    bool SaveName(int atom)
+    {
+        switch (atom) {
+        case PpAtomIdentifier:
+        case PpAtomConstString:
+        case PpAtomConstInt:
+        case PpAtomConstUint:
+        case PpAtomConstInt64:
+        case PpAtomConstUint64:
+    #ifdef AMD_EXTENSIONS
+        case PpAtomConstInt16:
+        case PpAtomConstUint16:
+    #endif
+        case PpAtomConstFloat:
+        case PpAtomConstDouble:
+        case PpAtomConstFloat16:
+            return true;
+        default:
+            return false;
+        }
+    }
+
+    // When recording (and playing back) should the numeric value
+    // be saved (restored)?
+    bool SaveValue(int atom)
+    {
+        switch (atom) {
+        case PpAtomConstInt:
+        case PpAtomConstUint:
+        case PpAtomConstInt64:
+        case PpAtomConstUint64:
+    #ifdef AMD_EXTENSIONS
+        case PpAtomConstInt16:
+        case PpAtomConstUint16:
+    #endif
+        case PpAtomConstFloat:
+        case PpAtomConstDouble:
+        case PpAtomConstFloat16:
+            return true;
+        default:
+            return false;
+        }
+    }
+}
+
 // push onto back of stream
 void TPpContext::TokenStream::putSubtoken(char subtoken)
 {
@@ -119,40 +171,25 @@
 
 // Add a complete token (including backing string) to the end of a list
 // for later playback.
-void TPpContext::TokenStream::putToken(int token, TPpToken* ppToken)
+void TPpContext::TokenStream::putToken(int atom, TPpToken* ppToken)
 {
-    const char* s;
-    char* str = NULL;
+    // save the atom
+    assert((atom & ~0xff) == 0);
+    putSubtoken(static_cast<char>(atom));
 
-    assert((token & ~0xff) == 0);
-    putSubtoken(static_cast<char>(token));
-
-    switch (token) {
-    case PpAtomIdentifier:
-    case PpAtomConstString:
-        s = ppToken->name;
+    // save the backing name string
+    if (SaveName(atom)) {
+        const char* s = ppToken->name;
         while (*s)
             putSubtoken(*s++);
         putSubtoken(0);
-        break;
-    case PpAtomConstInt:
-    case PpAtomConstUint:
-    case PpAtomConstInt64:
-    case PpAtomConstUint64:
-    case PpAtomConstFloat:
-    case PpAtomConstDouble:
-#ifdef AMD_EXTENSIONS
-    case PpAtomConstFloat16:
-#endif
-        str = ppToken->name;
-        while (*str) {
-            putSubtoken(*str);
-            str++;
-        }
-        putSubtoken(0);
-        break;
-    default:
-        break;
+    }
+
+    // save the numeric value
+    if (SaveValue(atom)) {
+        const char* n = reinterpret_cast<const char*>(&ppToken->i64val);
+        for (size_t i = 0; i < sizeof(ppToken->i64val); ++i)
+            putSubtoken(*n++);
     }
 }
 
@@ -160,36 +197,19 @@
 // (Not the source stream, but a stream used to hold a tokenized macro).
 int TPpContext::TokenStream::getToken(TParseContextBase& parseContext, TPpToken *ppToken)
 {
-    int len;
-    int ch;
+    // get the atom
+    int atom = getSubtoken();
+    if (atom == EndOfInput)
+        return atom;
 
-    int subtoken = getSubtoken();
+    // init the token
+    ppToken->clear();
     ppToken->loc = parseContext.getCurrentLoc();
-    switch (subtoken) {
-    case '#':
-        // Check for ##, unless the current # is the last character
-        if (current < data.size()) {
-            if (getSubtoken() == '#') {
-                parseContext.requireProfile(ppToken->loc, ~EEsProfile, "token pasting (##)");
-                parseContext.profileRequires(ppToken->loc, ~EEsProfile, 130, 0, "token pasting (##)");
-                subtoken = PpAtomPaste;
-            } else
-                ungetSubtoken();
-        }
-        break;
-    case PpAtomConstString:
-    case PpAtomIdentifier:
-    case PpAtomConstFloat:
-    case PpAtomConstDouble:
-#ifdef AMD_EXTENSIONS
-    case PpAtomConstFloat16:
-#endif
-    case PpAtomConstInt:
-    case PpAtomConstUint:
-    case PpAtomConstInt64:
-    case PpAtomConstUint64:
-        len = 0;
-        ch = getSubtoken();
+
+    // get the backing name string
+    if (SaveName(atom)) {
+        int ch = getSubtoken();
+        int len = 0;
         while (ch != 0 && ch != EndOfInput) {
             if (len < MaxTokenLength) {
                 ppToken->name[len] = (char)ch;
@@ -201,59 +221,28 @@
             }
         }
         ppToken->name[len] = 0;
+    }
 
-        switch (subtoken) {
-        case PpAtomIdentifier:
-            break;
-        case PpAtomConstString:
-            break;
-        case PpAtomConstFloat:
-        case PpAtomConstDouble:
-#ifdef AMD_EXTENSIONS
-        case PpAtomConstFloat16:
-#endif
-            ppToken->dval = atof(ppToken->name);
-            break;
-        case PpAtomConstInt:
-            if (len > 0 && ppToken->name[0] == '0') {
-                if (len > 1 && (ppToken->name[1] == 'x' || ppToken->name[1] == 'X'))
-                    ppToken->ival = (int)strtol(ppToken->name, 0, 16);
-                else
-                    ppToken->ival = (int)strtol(ppToken->name, 0, 8);
+    // Check for ##, unless the current # is the last character
+    if (atom == '#') {
+        if (current < data.size()) {
+            if (getSubtoken() == '#') {
+                parseContext.requireProfile(ppToken->loc, ~EEsProfile, "token pasting (##)");
+                parseContext.profileRequires(ppToken->loc, ~EEsProfile, 130, 0, "token pasting (##)");
+                atom = PpAtomPaste;
             } else
-                ppToken->ival = atoi(ppToken->name);
-            break;
-        case PpAtomConstUint:
-            if (len > 0 && ppToken->name[0] == '0') {
-                if (len > 1 && (ppToken->name[1] == 'x' || ppToken->name[1] == 'X'))
-                    ppToken->ival = (int)strtoul(ppToken->name, 0, 16);
-                else
-                    ppToken->ival = (int)strtoul(ppToken->name, 0, 8);
-            } else
-                ppToken->ival = (int)strtoul(ppToken->name, 0, 10);
-            break;
-        case PpAtomConstInt64:
-            if (len > 0 && ppToken->name[0] == '0') {
-                if (len > 1 && (ppToken->name[1] == 'x' || ppToken->name[1] == 'X'))
-                    ppToken->i64val = strtoll(ppToken->name, nullptr, 16);
-                else
-                    ppToken->i64val = strtoll(ppToken->name, nullptr, 8);
-            } else
-                ppToken->i64val = atoll(ppToken->name);
-            break;
-        case PpAtomConstUint64:
-            if (len > 0 && ppToken->name[0] == '0') {
-                if (len > 1 && (ppToken->name[1] == 'x' || ppToken->name[1] == 'X'))
-                    ppToken->i64val = (long long)strtoull(ppToken->name, nullptr, 16);
-                else
-                    ppToken->i64val = (long long)strtoull(ppToken->name, nullptr, 8);
-            } else
-                ppToken->i64val = (long long)strtoull(ppToken->name, 0, 10);
-            break;
+                ungetSubtoken();
         }
     }
 
-    return subtoken;
+    // get the numeric value
+    if (SaveValue(atom)) {
+        char* n = reinterpret_cast<char*>(&ppToken->i64val);
+        for (size_t i = 0; i < sizeof(ppToken->i64val); ++i)
+            *n++ = (char)getSubtoken();
+    }
+
+    return atom;
 }
 
 // We are pasting if
diff --git a/glslang/MachineIndependent/preprocessor/PpTokens.h b/glslang/MachineIndependent/preprocessor/PpTokens.h
index ee442d6..7b0f815 100644
--- a/glslang/MachineIndependent/preprocessor/PpTokens.h
+++ b/glslang/MachineIndependent/preprocessor/PpTokens.h
@@ -127,6 +127,8 @@
     PpAtomConstUint,
     PpAtomConstInt64,
     PpAtomConstUint64,
+    PpAtomConstInt16,
+    PpAtomConstUint16,
     PpAtomConstFloat,
     PpAtomConstDouble,
     PpAtomConstFloat16,
diff --git a/glslang/MachineIndependent/propagateNoContraction.h b/glslang/MachineIndependent/propagateNoContraction.h
index 3412c85..8521ad7 100644
--- a/glslang/MachineIndependent/propagateNoContraction.h
+++ b/glslang/MachineIndependent/propagateNoContraction.h
@@ -37,6 +37,8 @@
 // propagate 'noContraction' qualifier.
 //
 
+#pragma once
+
 #include "../Include/intermediate.h"
 
 namespace glslang {
diff --git a/glslang/MachineIndependent/reflection.cpp b/glslang/MachineIndependent/reflection.cpp
index f0566c6..8cfc2ac 100644
--- a/glslang/MachineIndependent/reflection.cpp
+++ b/glslang/MachineIndependent/reflection.cpp
@@ -131,8 +131,11 @@
         for (int m = 0; m <= index; ++m) {
             // modify just the children's view of matrix layout, if there is one for this member
             TLayoutMatrix subMatrixLayout = memberList[m].type->getQualifier().layoutMatrix;
-            int memberAlignment = intermediate.getBaseAlignment(*memberList[m].type, memberSize, dummyStride, type.getQualifier().layoutPacking == ElpStd140,
-                                                                subMatrixLayout != ElmNone ? subMatrixLayout == ElmRowMajor : type.getQualifier().layoutMatrix == ElmRowMajor);
+            int memberAlignment = intermediate.getMemberAlignment(*memberList[m].type, memberSize, dummyStride,
+                                                                  type.getQualifier().layoutPacking,
+                                                                  subMatrixLayout != ElmNone
+                                                                      ? subMatrixLayout == ElmRowMajor
+                                                                      : type.getQualifier().layoutMatrix == ElmRowMajor);
             RoundToPow2(offset, memberAlignment);
             if (m < index)
                 offset += memberSize;
@@ -151,8 +154,9 @@
 
         int lastMemberSize;
         int dummyStride;
-        intermediate.getBaseAlignment(*memberList[lastIndex].type, lastMemberSize, dummyStride, blockType.getQualifier().layoutPacking == ElpStd140,
-                                      blockType.getQualifier().layoutMatrix == ElmRowMajor);
+        intermediate.getMemberAlignment(*memberList[lastIndex].type, lastMemberSize, dummyStride,
+                                        blockType.getQualifier().layoutPacking,
+                                        blockType.getQualifier().layoutMatrix == ElmRowMajor);
 
         return lastOffset + lastMemberSize;
     }
@@ -167,7 +171,7 @@
     void blowUpActiveAggregate(const TType& baseType, const TString& baseName, const TList<TIntermBinary*>& derefs,
                                TList<TIntermBinary*>::const_iterator deref, int offset, int blockIndex, int arraySize)
     {
-        // process the part of the derefence chain that was explicit in the shader
+        // process the part of the dereference chain that was explicit in the shader
         TString name = baseName;
         const TType* terminalType = &baseType;
         for (; deref != derefs.end(); ++deref) {
@@ -177,7 +181,7 @@
             switch (visitNode->getOp()) {
             case EOpIndexIndirect:
                 // Visit all the indices of this array, and for each one add on the remaining dereferencing
-                for (int i = 0; i < visitNode->getLeft()->getType().getOuterArraySize(); ++i) {
+                for (int i = 0; i < std::max(visitNode->getLeft()->getType().getOuterArraySize(), 1); ++i) {
                     TString newBaseName = name;
                     if (baseType.getBasicType() != EbtBlock)
                         newBaseName.append(TString("[") + String(i) + "]");
@@ -212,7 +216,7 @@
             if (terminalType->isArray()) {
                 // Visit all the indices of this array, and for each one,
                 // fully explode the remaining aggregate to dereference
-                for (int i = 0; i < terminalType->getOuterArraySize(); ++i) {
+                for (int i = 0; i < std::max(terminalType->getOuterArraySize(), 1); ++i) {
                     TString newBaseName = name;
                     newBaseName.append(TString("[") + String(i) + "]");
                     TType derefType(*terminalType, 0);
@@ -235,7 +239,7 @@
         }
 
         // Finally, add a full string to the reflection database, and update the array size if necessary.
-        // If the derefenced entity to record is an array, compute the size and update the maximum size.
+        // If the dereferenced entity to record is an array, compute the size and update the maximum size.
 
         // there might not be a final array dereference, it could have been copied as an array object
         if (arraySize == 0)
@@ -244,7 +248,8 @@
         TReflection::TNameToIndex::const_iterator it = reflection.nameToIndex.find(name);
         if (it == reflection.nameToIndex.end()) {
             reflection.nameToIndex[name] = (int)reflection.indexToUniform.size();
-            reflection.indexToUniform.push_back(TObjectReflection(name, *terminalType, offset, mapToGlType(*terminalType),
+            reflection.indexToUniform.push_back(TObjectReflection(name, *terminalType, offset,
+                                                                  mapToGlType(*terminalType),
                                                                   arraySize, blockIndex));
         } else if (arraySize > 1) {
             int& reflectedArraySize = reflection.indexToUniform[it->second].size;
@@ -410,6 +415,36 @@
                 case EsdBuffer:
                     return GL_SAMPLER_BUFFER;
                 }
+#ifdef AMD_EXTENSIONS
+            case EbtFloat16:
+                switch ((int)sampler.dim) {
+                case Esd1D:
+                    switch ((int)sampler.shadow) {
+                    case false: return sampler.arrayed ? GL_FLOAT16_SAMPLER_1D_ARRAY_AMD : GL_FLOAT16_SAMPLER_1D_AMD;
+                    case true:  return sampler.arrayed ? GL_FLOAT16_SAMPLER_1D_ARRAY_SHADOW_AMD : GL_FLOAT16_SAMPLER_1D_SHADOW_AMD;
+                    }
+                case Esd2D:
+                    switch ((int)sampler.ms) {
+                    case false:
+                        switch ((int)sampler.shadow) {
+                        case false: return sampler.arrayed ? GL_FLOAT16_SAMPLER_2D_ARRAY_AMD : GL_FLOAT16_SAMPLER_2D_AMD;
+                        case true:  return sampler.arrayed ? GL_FLOAT16_SAMPLER_2D_ARRAY_SHADOW_AMD : GL_FLOAT16_SAMPLER_2D_SHADOW_AMD;
+                        }
+                    case true:      return sampler.arrayed ? GL_FLOAT16_SAMPLER_2D_MULTISAMPLE_ARRAY_AMD : GL_FLOAT16_SAMPLER_2D_MULTISAMPLE_AMD;
+                    }
+                case Esd3D:
+                    return GL_FLOAT16_SAMPLER_3D_AMD;
+                case EsdCube:
+                    switch ((int)sampler.shadow) {
+                    case false: return sampler.arrayed ? GL_FLOAT16_SAMPLER_CUBE_MAP_ARRAY_AMD : GL_FLOAT16_SAMPLER_CUBE_AMD;
+                    case true:  return sampler.arrayed ? GL_FLOAT16_SAMPLER_CUBE_MAP_ARRAY_SHADOW_AMD : GL_FLOAT16_SAMPLER_CUBE_SHADOW_AMD;
+                    }
+                case EsdRect:
+                    return sampler.shadow ? GL_FLOAT16_SAMPLER_2D_RECT_SHADOW_AMD : GL_FLOAT16_SAMPLER_2D_RECT_AMD;
+                case EsdBuffer:
+                    return GL_FLOAT16_SAMPLER_BUFFER_AMD;
+                }
+#endif
             case EbtInt:
                 switch ((int)sampler.dim) {
                 case Esd1D:
@@ -417,7 +452,8 @@
                 case Esd2D:
                     switch ((int)sampler.ms) {
                     case false:  return sampler.arrayed ? GL_INT_SAMPLER_2D_ARRAY : GL_INT_SAMPLER_2D;
-                    case true:   return sampler.arrayed ? GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY : GL_INT_SAMPLER_2D_MULTISAMPLE;
+                    case true:   return sampler.arrayed ? GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY
+                                                        : GL_INT_SAMPLER_2D_MULTISAMPLE;
                     }
                 case Esd3D:
                     return GL_INT_SAMPLER_3D;
@@ -435,7 +471,8 @@
                 case Esd2D:
                     switch ((int)sampler.ms) {
                     case false:  return sampler.arrayed ? GL_UNSIGNED_INT_SAMPLER_2D_ARRAY : GL_UNSIGNED_INT_SAMPLER_2D;
-                    case true:   return sampler.arrayed ? GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY : GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE;
+                    case true:   return sampler.arrayed ? GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY
+                                                        : GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE;
                     }
                 case Esd3D:
                     return GL_UNSIGNED_INT_SAMPLER_3D;
@@ -470,6 +507,26 @@
                 case EsdBuffer:
                     return GL_IMAGE_BUFFER;
                 }
+#ifdef AMD_EXTENSIONS
+            case EbtFloat16:
+                switch ((int)sampler.dim) {
+                case Esd1D:
+                    return sampler.arrayed ? GL_FLOAT16_IMAGE_1D_ARRAY_AMD : GL_FLOAT16_IMAGE_1D_AMD;
+                case Esd2D:
+                    switch ((int)sampler.ms) {
+                    case false:     return sampler.arrayed ? GL_FLOAT16_IMAGE_2D_ARRAY_AMD : GL_FLOAT16_IMAGE_2D_AMD;
+                    case true:      return sampler.arrayed ? GL_FLOAT16_IMAGE_2D_MULTISAMPLE_ARRAY_AMD : GL_FLOAT16_IMAGE_2D_MULTISAMPLE_AMD;
+                    }
+                case Esd3D:
+                    return GL_FLOAT16_IMAGE_3D_AMD;
+                case EsdCube:
+                    return sampler.arrayed ? GL_FLOAT16_IMAGE_CUBE_MAP_ARRAY_AMD : GL_FLOAT16_IMAGE_CUBE_AMD;
+                case EsdRect:
+                    return GL_FLOAT16_IMAGE_2D_RECT_AMD;
+                case EsdBuffer:
+                    return GL_FLOAT16_IMAGE_BUFFER_AMD;
+                }
+#endif
             case EbtInt:
                 switch ((int)sampler.dim) {
                 case Esd1D:
@@ -495,7 +552,8 @@
                 case Esd2D:
                     switch ((int)sampler.ms) {
                     case false:  return sampler.arrayed ? GL_UNSIGNED_INT_IMAGE_2D_ARRAY : GL_UNSIGNED_INT_IMAGE_2D;
-                    case true:   return sampler.arrayed ? GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_ARRAY : GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE;
+                    case true:   return sampler.arrayed ? GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_ARRAY
+                                                        : GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE;
                     }
                 case Esd3D:
                     return GL_UNSIGNED_INT_IMAGE_3D;
@@ -708,11 +766,11 @@
 }
 
 // build counter block index associations for buffers
-void TReflection::buildCounterIndices()
+void TReflection::buildCounterIndices(const TIntermediate& intermediate)
 {
     // search for ones that have counters
     for (int i = 0; i < int(indexToUniformBlock.size()); ++i) {
-        const TString counterName(indexToUniformBlock[i].name + "@count");
+        const TString counterName(intermediate.addCounterBufferName(indexToUniformBlock[i].name));
         const int index = getIndex(counterName);
 
         if (index >= 0)
@@ -720,12 +778,22 @@
     }
 }
 
+// build Shader Stages mask for all uniforms
+void TReflection::buildUniformStageMask(const TIntermediate& intermediate)
+{
+    for (int i = 0; i < int(indexToUniform.size()); ++i) {
+        indexToUniform[i].stages = static_cast<EShLanguageMask>(indexToUniform[i].stages | 1 << intermediate.getStage());
+    }
+}
+
 // Merge live symbols from 'intermediate' into the existing reflection database.
 //
 // Returns false if the input is too malformed to do this.
 bool TReflection::addStage(EShLanguage stage, const TIntermediate& intermediate)
 {
-    if (intermediate.getNumEntryPoints() != 1 || intermediate.isRecursive())
+    if (intermediate.getTreeRoot() == nullptr ||
+        intermediate.getNumEntryPoints() != 1 ||
+        intermediate.isRecursive())
         return false;
 
     buildAttributeReflection(stage, intermediate);
@@ -742,7 +810,8 @@
         function->traverse(&it);
     }
 
-    buildCounterIndices();
+    buildCounterIndices(intermediate);
+    buildUniformStageMask(intermediate);
 
     return true;
 }
diff --git a/glslang/MachineIndependent/reflection.h b/glslang/MachineIndependent/reflection.h
index 7a1cc8e..49282c3 100644
--- a/glslang/MachineIndependent/reflection.h
+++ b/glslang/MachineIndependent/reflection.h
@@ -57,19 +57,26 @@
 public:
     TObjectReflection(const TString& pName, const TType& pType, int pOffset, int pGLDefineType, int pSize, int pIndex) :
         name(pName), offset(pOffset),
-        glDefineType(pGLDefineType), size(pSize), index(pIndex), counterIndex(-1), type(pType.clone()) { }
+        glDefineType(pGLDefineType), size(pSize), index(pIndex), counterIndex(-1), stages(EShLanguageMask(0)), type(pType.clone()) { }
 
-    void dump() const {
-        printf("%s: offset %d, type %x, size %d, index %d, binding %d",
-               name.c_str(), offset, glDefineType, size, index, getBinding() );
+    const TType* getType() const { return type; }
+    int getBinding() const
+    {
+        if (type == nullptr || !type->getQualifier().hasBinding())
+            return -1;
+        return type->getQualifier().layoutBinding;
+    }
+    void dump() const
+    {
+        printf("%s: offset %d, type %x, size %d, index %d, binding %d, stages %d",
+               name.c_str(), offset, glDefineType, size, index, getBinding(), stages );
 
         if (counterIndex != -1)
             printf(", counter %d", counterIndex);
 
         printf("\n");
     }
-
-    const TType* const getType() const { return type; }
+    static TObjectReflection badReflection() { return TObjectReflection(); }
 
     TString name;
     int offset;
@@ -77,16 +84,9 @@
     int size;         // data size in bytes for a block, array size for a (non-block) object that's an array
     int index;
     int counterIndex;
-
-    static TObjectReflection badReflection() { return TObjectReflection(); }
+    EShLanguageMask stages;
 
 protected:
-    int getBinding() const {
-        if (type == nullptr || type->getQualifier().layoutBinding == TQualifier::layoutBindingEnd)
-            return -1;
-        return type->getQualifier().layoutBinding;
-    }
-
     TObjectReflection() : offset(-1), glDefineType(-1), size(-1), index(-1), type(nullptr) { }
 
     const TType* type;
@@ -157,7 +157,8 @@
 protected:
     friend class glslang::TReflectionTraverser;
 
-    void buildCounterIndices();
+    void buildCounterIndices(const TIntermediate&);
+    void buildUniformStageMask(const TIntermediate& intermediate);
     void buildAttributeReflection(EShLanguage, const TIntermediate&);
 
     // Need a TString hash: typedef std::unordered_map<TString, int> TNameToIndex;
diff --git a/glslang/OSDependent/Unix/CMakeLists.txt b/glslang/OSDependent/Unix/CMakeLists.txt
index 99e9ce1..1bf49e1 100644
--- a/glslang/OSDependent/Unix/CMakeLists.txt
+++ b/glslang/OSDependent/Unix/CMakeLists.txt
@@ -1,5 +1,8 @@
 add_library(OSDependent STATIC ossource.cpp ../osinclude.h)
-set_property(TARGET OSDependent PROPERTY FOLDER glslang POSITION_INDEPENDENT_CODE ON)
+set_property(TARGET OSDependent PROPERTY FOLDER glslang)
+set_property(TARGET OSDependent PROPERTY POSITION_INDEPENDENT_CODE ON)
 
-install(TARGETS OSDependent
-        ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
+if(ENABLE_GLSLANG_INSTALL)
+    install(TARGETS OSDependent
+            ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
+endif(ENABLE_GLSLANG_INSTALL)
diff --git a/glslang/OSDependent/Unix/ossource.cpp b/glslang/OSDependent/Unix/ossource.cpp
index 1e690af..02d6fe4 100644
--- a/glslang/OSDependent/Unix/ossource.cpp
+++ b/glslang/OSDependent/Unix/ossource.cpp
@@ -43,6 +43,12 @@
 #include <assert.h>
 #include <errno.h>
 #include <stdint.h>
+#include <cstdio>
+#include <sys/time.h>
+
+#ifdef DUMP_COUNTERS
+#include <sys/resource.h>
+#endif
 
 namespace glslang {
 
@@ -185,8 +191,18 @@
   pthread_mutex_unlock(&gMutex);
 }
 
+// #define DUMP_COUNTERS
+
 void OS_DumpMemoryCounters()
 {
+#ifdef DUMP_COUNTERS
+    struct rusage usage;
+
+    if (getrusage(RUSAGE_SELF, &usage) == 0)
+        printf("Working set size: %ld\n", usage.ru_maxrss * 1024);
+#else
+    printf("Recompile with DUMP_COUNTERS defined to see counters.\n");
+#endif
 }
 
 } // end namespace glslang
diff --git a/glslang/OSDependent/Windows/CMakeLists.txt b/glslang/OSDependent/Windows/CMakeLists.txt
index cc65ad6..f257418 100644
--- a/glslang/OSDependent/Windows/CMakeLists.txt
+++ b/glslang/OSDependent/Windows/CMakeLists.txt
@@ -1,7 +1,8 @@
 set(SOURCES ossource.cpp ../osinclude.h)
 
 add_library(OSDependent STATIC ${SOURCES})
-set_property(TARGET OSDependent PROPERTY FOLDER glslang POSITION_INDEPENDENT_CODE ON)
+set_property(TARGET OSDependent PROPERTY FOLDER glslang)
+set_property(TARGET OSDependent PROPERTY POSITION_INDEPENDENT_CODE ON)
 
 # MinGW GCC complains about function pointer casts to void*.
 # Turn that off with -fpermissive.
@@ -13,5 +14,7 @@
     source_group("Source" FILES ${SOURCES})
 endif(WIN32)
 
-install(TARGETS OSDependent
-        ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
+if(ENABLE_GLSLANG_INSTALL)
+    install(TARGETS OSDependent
+            ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
+endif(ENABLE_GLSLANG_INSTALL)
diff --git a/glslang/Public/ShaderLang.h b/glslang/Public/ShaderLang.h
old mode 100644
new mode 100755
index c2aa1ad..c5eca4e
--- a/glslang/Public/ShaderLang.h
+++ b/glslang/Public/ShaderLang.h
@@ -40,6 +40,7 @@
 #include "../MachineIndependent/Versions.h"
 
 #include <cstring>
+#include <vector>
 
 #ifdef _WIN32
 #define C_DECL __cdecl
@@ -66,16 +67,20 @@
     extern "C" {
 #endif
 
+// This should always increase, as some paths to do not consume
+// a more major number.
+// It should increment by one when new functionality is added.
+#define GLSLANG_MINOR_VERSION 11
+
 //
-// Driver must call this first, once, before doing any other
-// compiler/linker operations.
+// Call before doing any other compiler/linker operations.
 //
 // (Call once per process, not once per thread.)
 //
 SH_IMPORT_EXPORT int ShInitialize();
 
 //
-// Driver should call this at process shutdown.
+// Call this at process shutdown to clean up memory.
 //
 SH_IMPORT_EXPORT int __fastcall ShFinalize();
 
@@ -89,6 +94,14 @@
     EShLangGeometry,
     EShLangFragment,
     EShLangCompute,
+    EShLangRayGenNV,
+    EShLangIntersectNV,
+    EShLangAnyHitNV,
+    EShLangClosestHitNV,
+    EShLangMissNV,
+    EShLangCallableNV,
+    EShLangTaskNV,
+    EShLangMeshNV,
     EShLangCount,
 } EShLanguage;         // would be better as stage, but this is ancient now
 
@@ -99,6 +112,14 @@
     EShLangGeometryMask       = (1 << EShLangGeometry),
     EShLangFragmentMask       = (1 << EShLangFragment),
     EShLangComputeMask        = (1 << EShLangCompute),
+    EShLangRayGenNVMask       = (1 << EShLangRayGenNV),
+    EShLangIntersectNVMask    = (1 << EShLangIntersectNV),
+    EShLangAnyHitNVMask       = (1 << EShLangAnyHitNV),
+    EShLangClosestHitNVMask   = (1 << EShLangClosestHitNV),
+    EShLangMissNVMask         = (1 << EShLangMissNV),
+    EShLangCallableNVMask     = (1 << EShLangCallableNV),
+    EShLangTaskNVMask         = (1 << EShLangTaskNV),
+    EShLangMeshNVMask         = (1 << EShLangMeshNV),
 } EShLanguageMask;
 
 namespace glslang {
@@ -109,7 +130,62 @@
     EShSourceNone,
     EShSourceGlsl,
     EShSourceHlsl,
-} EShSource;          // if EShLanguage were EShStage, this could be EShLanguage instead
+} EShSource;                  // if EShLanguage were EShStage, this could be EShLanguage instead
+
+typedef enum {
+    EShClientNone,
+    EShClientVulkan,
+    EShClientOpenGL,
+} EShClient;
+
+typedef enum {
+    EShTargetNone,
+    EShTargetSpv,                 // preferred spelling
+    EshTargetSpv = EShTargetSpv,  // legacy spelling
+} EShTargetLanguage;
+
+typedef enum {
+    EShTargetVulkan_1_0 = (1 << 22),
+    EShTargetVulkan_1_1 = (1 << 22) | (1 << 12),
+    EShTargetOpenGL_450 = 450,
+} EShTargetClientVersion;
+
+typedef EShTargetClientVersion EshTargetClientVersion;
+
+typedef enum {
+    EShTargetSpv_1_0 = (1 << 16),
+    EShTargetSpv_1_1 = (1 << 16) | (1 << 8),
+    EShTargetSpv_1_2 = (1 << 16) | (2 << 8),
+    EShTargetSpv_1_3 = (1 << 16) | (3 << 8),
+    EShTargetSpv_1_4 = (1 << 16) | (4 << 8),
+} EShTargetLanguageVersion;
+
+struct TInputLanguage {
+    EShSource languageFamily; // redundant information with other input, this one overrides when not EShSourceNone
+    EShLanguage stage;        // redundant information with other input, this one overrides when not EShSourceNone
+    EShClient dialect;
+    int dialectVersion;       // version of client's language definition, not the client (when not EShClientNone)
+};
+
+struct TClient {
+    EShClient client;
+    EShTargetClientVersion version;   // version of client itself (not the client's input dialect)
+};
+
+struct TTarget {
+    EShTargetLanguage language;
+    EShTargetLanguageVersion version; // version to target, if SPIR-V, defined by "word 1" of the SPIR-V header
+    bool hlslFunctionality1;          // can target hlsl_functionality1 extension(s)
+};
+
+// All source/client/target versions and settings.
+// Can override previous methods of setting, when items are set here.
+// Expected to grow, as more are added, rather than growing parameter lists.
+struct TEnvironment {
+    TInputLanguage input;     // definition of the input language
+    TClient client;           // what client is the overall compilation being done for?
+    TTarget target;           // what to generate
+};
 
 const char* StageName(EShLanguage);
 
@@ -134,6 +210,14 @@
 } EShOptimizationLevel;
 
 //
+// Texture and Sampler transformation mode.
+//
+typedef enum {
+    EShTexSampTransKeep,   // keep textures and samplers as is (default)
+    EShTexSampTransUpgradeTextureRemoveSampler,  // change texture w/o embeded sampler into sampled texture and throw away all samplers
+} EShTextureSamplerTransformMode;
+
+//
 // Message choices for what errors and warnings are given.
 //
 enum EShMessages {
@@ -148,6 +232,9 @@
     EShMsgCascadingErrors  = (1 << 7),  // get cascading errors; risks error-recovery issues, instead of an early exit
     EShMsgKeepUncalled     = (1 << 8),  // for testing, don't eliminate uncalled functions
     EShMsgHlslOffsets      = (1 << 9),  // allow block offsets to follow HLSL rules instead of GLSL rules
+    EShMsgDebugInfo        = (1 << 10), // save debug information
+    EShMsgHlslEnable16BitTypes  = (1 << 11), // enable use of 16-bit types in SPIR-V for HLSL
+    EShMsgHlslLegalization  = (1 << 12), // enable HLSL Legalization messages
 };
 
 //
@@ -243,7 +330,7 @@
 // Deferred-Lowering C++ Interface
 // -----------------------------------
 //
-// Below is a new alternate C++ interface that might potentially replace the above
+// Below is a new alternate C++ interface, which deprecates the above
 // opaque handle-based interface.
 //
 // The below is further designed to handle multiple compilation units per stage, where
@@ -277,11 +364,26 @@
 // Call once per process to tear down everything
 void FinalizeProcess();
 
-// Make one TShader per shader that you will link into a program.  Then provide
-// the shader through setStrings() or setStringsWithLengths(), then call parse(),
-// then query the info logs.
-// Optionally use setPreamble() to set a special shader string that will be
-// processed before all others but won't affect the validity of #version.
+// Resource type for IO resolver
+enum TResourceType {
+    EResSampler,
+    EResTexture,
+    EResImage,
+    EResUbo,
+    EResSsbo,
+    EResUav,
+    EResCount
+};
+
+// Make one TShader per shader that you will link into a program. Then
+//  - provide the shader through setStrings() or setStringsWithLengths()
+//  - optionally call setEnv*(), see below for more detail
+//  - optionally use setPreamble() to set a special shader string that will be
+//    processed before all others but won't affect the validity of #version
+//  - call parse(): source language and target environment must be selected
+//    either by correct setting of EShMessages sent to parse(), or by
+//    explicitly calling setEnv*()
+//  - query the info logs
 //
 // N.B.: Does not yet support having the same TShader instance being linked into
 // multiple programs.
@@ -299,17 +401,52 @@
     void setPreamble(const char* s) { preamble = s; }
     void setEntryPoint(const char* entryPoint);
     void setSourceEntryPoint(const char* sourceEntryPointName);
-    void setShiftSamplerBinding(unsigned int base);
-    void setShiftTextureBinding(unsigned int base);
-    void setShiftImageBinding(unsigned int base);
-    void setShiftUboBinding(unsigned int base);
-    void setShiftUavBinding(unsigned int base);
-    void setShiftCbufferBinding(unsigned int base); // synonym for setShiftUboBinding
-    void setShiftSsboBinding(unsigned int base);
+    void addProcesses(const std::vector<std::string>&);
+
+    // IO resolver binding data: see comments in ShaderLang.cpp
+    void setShiftBinding(TResourceType res, unsigned int base);
+    void setShiftSamplerBinding(unsigned int base);  // DEPRECATED: use setShiftBinding
+    void setShiftTextureBinding(unsigned int base);  // DEPRECATED: use setShiftBinding
+    void setShiftImageBinding(unsigned int base);    // DEPRECATED: use setShiftBinding
+    void setShiftUboBinding(unsigned int base);      // DEPRECATED: use setShiftBinding
+    void setShiftUavBinding(unsigned int base);      // DEPRECATED: use setShiftBinding
+    void setShiftCbufferBinding(unsigned int base);  // synonym for setShiftUboBinding
+    void setShiftSsboBinding(unsigned int base);     // DEPRECATED: use setShiftBinding
+    void setShiftBindingForSet(TResourceType res, unsigned int base, unsigned int set);
+    void setResourceSetBinding(const std::vector<std::string>& base);
     void setAutoMapBindings(bool map);
+    void setAutoMapLocations(bool map);
+    void addUniformLocationOverride(const char* name, int loc);
+    void setUniformLocationBase(int base);
+    void setInvertY(bool invert);
     void setHlslIoMapping(bool hlslIoMap);
     void setFlattenUniformArrays(bool flatten);
     void setNoStorageFormat(bool useUnknownFormat);
+    void setTextureSamplerTransformMode(EShTextureSamplerTransformMode mode);
+
+    // For setting up the environment (cleared to nothingness in the constructor).
+    // These must be called so that parsing is done for the right source language and
+    // target environment, either indirectly through TranslateEnvironment() based on
+    // EShMessages et. al., or directly by the user.
+    void setEnvInput(EShSource lang, EShLanguage envStage, EShClient client, int version)
+    {
+        environment.input.languageFamily = lang;
+        environment.input.stage = envStage;
+        environment.input.dialect = client;
+        environment.input.dialectVersion = version;
+    }
+    void setEnvClient(EShClient client, EShTargetClientVersion version)
+    {
+        environment.client.client = client;
+        environment.client.version = version;
+    }
+    void setEnvTarget(EShTargetLanguage lang, EShTargetLanguageVersion version)
+    {
+        environment.target.language = lang;
+        environment.target.version = version;
+    }
+    void setEnvTargetHlslFunctionality1() { environment.target.hlslFunctionality1 = true; }
+    bool getEnvTargetHlslFunctionality1() const { return environment.target.hlslFunctionality1; }
 
     // Interface to #include handlers.
     //
@@ -394,6 +531,9 @@
         virtual void releaseInclude(IncludeResult*) override { }
     };
 
+    bool parse(const TBuiltInResource*, int defaultVersion, EProfile defaultProfile, bool forceDefaultVersionAndProfile,
+               bool forwardCompatible, EShMessages, Includer&);
+
     bool parse(const TBuiltInResource* res, int defaultVersion, EProfile defaultProfile, bool forceDefaultVersionAndProfile,
                bool forwardCompatible, EShMessages messages)
     {
@@ -401,12 +541,20 @@
         return parse(res, defaultVersion, defaultProfile, forceDefaultVersionAndProfile, forwardCompatible, messages, includer);
     }
 
-    bool parse(const TBuiltInResource*, int defaultVersion, EProfile defaultProfile, bool forceDefaultVersionAndProfile,
-               bool forwardCompatible, EShMessages, Includer&);
-
     // Equivalent to parse() without a default profile and without forcing defaults.
-    // Provided for backwards compatibility.
-    bool parse(const TBuiltInResource*, int defaultVersion, bool forwardCompatible, EShMessages);
+    bool parse(const TBuiltInResource* builtInResources, int defaultVersion, bool forwardCompatible, EShMessages messages)
+    {
+        return parse(builtInResources, defaultVersion, ENoProfile, false, forwardCompatible, messages);
+    }
+
+    bool parse(const TBuiltInResource* builtInResources, int defaultVersion, bool forwardCompatible, EShMessages messages,
+               Includer& includer)
+    {
+        return parse(builtInResources, defaultVersion, ENoProfile, false, forwardCompatible, messages, includer);
+    }
+
+    // NOTE: Doing just preprocessing to obtain a correct preprocessed shader string
+    // is not an officially supported or fully working path.
     bool preprocess(const TBuiltInResource* builtInResources,
                     int defaultVersion, EProfile defaultProfile, bool forceDefaultVersionAndProfile,
                     bool forwardCompatible, EShMessages message, std::string* outputString,
@@ -414,8 +562,8 @@
 
     const char* getInfoLog();
     const char* getInfoDebugLog();
-
     EShLanguage getStage() const { return stage; }
+    TIntermediate* getIntermediate() const { return intermediate; }
 
 protected:
     TPoolAllocator* pool;
@@ -441,6 +589,8 @@
     // a function in the source string can be renamed FROM this TO the name given in setEntryPoint.
     std::string sourceEntryPointName;
 
+    TEnvironment environment;
+
     friend class TProgram;
 
 private:
@@ -452,9 +602,10 @@
 
 // Allows to customize the binding layout after linking.
 // All used uniform variables will invoke at least validateBinding.
-// If validateBinding returned true then the other resolveBinding
-// and resolveSet are invoked to resolve the binding and descriptor
-// set index respectively.
+// If validateBinding returned true then the other resolveBinding,
+// resolveSet, and resolveLocation are invoked to resolve the binding
+// and descriptor set index respectively.
+//
 // Invocations happen in a particular order:
 // 1) all shader inputs
 // 2) all shader outputs
@@ -486,6 +637,9 @@
   // Should return a value >= 0 if the current set should be overridden.
   // Return -1 if the current set (including no set) should be kept.
   virtual int resolveSet(EShLanguage stage, const char* name, const TType& type, bool is_live) = 0;
+  // Should return a value >= 0 if the current location should be overridden.
+  // Return -1 if the current location (including no location) should be kept.
+  virtual int resolveUniformLocation(EShLanguage stage, const char* name, const TType& type, bool is_live) = 0;
   // Should return true if the resulting/current setup would be okay.
   // Basic idea is to do aliasing checks and reject invalid semantic names.
   virtual bool validateInOut(EShLanguage stage, const char* name, const TType& type, bool is_live) = 0;
@@ -503,7 +657,13 @@
   // Notification of a in or out variable
   virtual void notifyInOut(EShLanguage stage, const char* name, const TType& type, bool is_live) = 0;
   // Called by mapIO when it has finished the notify pass
-  virtual void endNotifications() = 0;
+  virtual void endNotifications(EShLanguage stage) = 0;
+  // Called by mapIO when it starts its notify pass for the given stage
+  virtual void beginNotifications(EShLanguage stage) = 0;
+  // Called by mipIO when it starts its resolve pass for the given stage
+  virtual void beginResolve(EShLanguage stage) = 0;
+  // Called by mapIO when it has finished the resolve pass
+  virtual void endResolve(EShLanguage stage) = 0;
 };
 
 // Make one TProgram per set of shaders that will get linked together.  Add all
@@ -533,6 +693,9 @@
     const char* getUniformBlockName(int blockIndex) const; // can be used for glGetActiveUniformBlockName()
     int getUniformBlockSize(int blockIndex) const;         // can be used for glGetActiveUniformBlockiv(UNIFORM_BLOCK_DATA_SIZE)
     int getUniformIndex(const char* name) const;           // can be used for glGetUniformIndices()
+    int getUniformBinding(int index) const;                // returns the binding number
+    EShLanguageMask getUniformStages(int index) const;     // returns Shaders Stages where a Uniform is present
+    int getUniformBlockBinding(int index) const;           // returns the block binding number
     int getUniformBlockIndex(int index) const;             // can be used for glGetActiveUniformsiv(GL_UNIFORM_BLOCK_INDEX)
     int getUniformBlockCounterIndex(int index) const;      // returns block index of associated counter.
     int getUniformType(int index) const;                   // can be used for glGetActiveUniformsiv(GL_UNIFORM_TYPE)
diff --git a/gtests/AST.FromFile.cpp b/gtests/AST.FromFile.cpp
index d8a5ef9..00bb433 100644
--- a/gtests/AST.FromFile.cpp
+++ b/gtests/AST.FromFile.cpp
@@ -41,13 +41,27 @@
 
 using CompileToAstTest = GlslangTest<::testing::TestWithParam<std::string>>;
 
+#ifdef NV_EXTENSIONS
+using CompileToAstTestNV = GlslangTest<::testing::TestWithParam<std::string>>;
+#endif
+
 TEST_P(CompileToAstTest, FromFile)
 {
     loadFileCompileAndCheck(GlobalTestSettings.testRoot, GetParam(),
-                            Source::GLSL, Semantics::OpenGL,
+                            Source::GLSL, Semantics::OpenGL, glslang::EShTargetVulkan_1_0,
                             Target::AST);
 }
 
+#ifdef NV_EXTENSIONS
+// Compiling GLSL to SPIR-V under OpenGL semantics (NV extensions enabled).
+TEST_P(CompileToAstTestNV, FromFile)
+{
+    loadFileCompileAndCheck(GlobalTestSettings.testRoot, GetParam(),
+                            Source::GLSL, Semantics::OpenGL, glslang::EShTargetVulkan_1_0,
+                            Target::AST);
+}
+#endif
+
 // clang-format off
 INSTANTIATE_TEST_CASE_P(
     Glsl, CompileToAstTest,
@@ -62,6 +76,7 @@
         "versionsErrors.frag",
         "versionsErrors.vert",
         "100.frag",
+        "100samplerExternal.frag",
         "120.vert",
         "120.frag",
         "130.vert",
@@ -77,10 +92,14 @@
         "matrixError.vert",
         "cppSimple.vert",
         "cppIndent.vert",
+        "cppIntMinOverNegativeOne.frag",
         "cppNest.vert",
         "cppBad.vert",
         "cppBad2.vert",
         "cppComplexExpr.vert",
+        "cppDeepNest.frag",
+        "cppPassMacroName.frag",
+        "cppRelaxSkipTokensErrors.vert",
         "badChars.frag",
         "pointCoord.frag",
         "array.frag",
@@ -93,6 +112,7 @@
         "300layout.frag",
         "300operations.frag",
         "300block.frag",
+        "300samplerExternal.frag",
         "310.comp",
         "310.vert",
         "310.geom",
@@ -101,10 +121,18 @@
         "310.tese",
         "310implicitSizeArrayError.vert",
         "310AofA.vert",
+        "310runtimeArray.vert",
+        "320.comp",
+        "320.vert",
+        "320.geom",
+        "320.frag",
+        "320.tesc",
+        "320.tese",
         "330.frag",
         "330comp.frag",
         "constErrors.frag",
         "constFold.frag",
+        "constFoldIntMin.frag",
         "errors.frag",
         "forwardRef.frag",
         "uint.frag",
@@ -136,6 +164,7 @@
         "430.vert",
         "430.comp",
         "430AofA.frag",
+        "435.vert",
         "440.vert",
         "440.frag",
         "450.vert",
@@ -144,8 +173,11 @@
         "450.tese",
         "450.frag",
         "450.comp",
+        "460.frag",
+        "460.vert",
         "dce.frag",
         "atomic_uint.frag",
+        "implicitInnerAtomicUint.frag",
         "aggOps.frag",
         "always-discard.frag",
         "always-discard2.frag",
@@ -168,14 +200,20 @@
         "loopsArtificial.frag",
         "matrix.frag",
         "matrix2.frag",
+        "mixedArrayDecls.frag",
+        "nonuniform.frag",
         "newTexture.frag",
         "Operations.frag",
+        "overlongLiteral.frag",
         "prepost.frag",
+        "runtimeArray.vert",
         "simpleFunctionCall.frag",
+        "stringToDouble.vert",
         "structAssignment.frag",
         "structDeref.frag",
         "structure.frag",
         "swizzle.frag",
+        "invalidSwizzle.vert",
         "syntaxError.frag",
         "test.frag",
         "texture.frag",
@@ -192,9 +230,21 @@
         "precise.tesc",
         "precise_struct_block.vert",
         "maxClipDistances.vert",
+        "findFunction.frag",
+        "constantUnaryConversion.comp"
     })),
     FileNameAsCustomTestSuffix
 );
+
+#ifdef NV_EXTENSIONS
+INSTANTIATE_TEST_CASE_P(
+    Glsl, CompileToAstTestNV,
+    ::testing::ValuesIn(std::vector<std::string>({
+        "nvShaderNoperspectiveInterpolation.frag",
+    })),
+    FileNameAsCustomTestSuffix
+);
+#endif
 // clang-format on
 
 }  // anonymous namespace
diff --git a/gtests/CMakeLists.txt b/gtests/CMakeLists.txt
index 2616ac0..f678cb6 100644
--- a/gtests/CMakeLists.txt
+++ b/gtests/CMakeLists.txt
@@ -25,11 +25,15 @@
             # -- Remapper tests
             ${CMAKE_CURRENT_SOURCE_DIR}/Remap.FromFile.cpp)
 
+        glslang_pch(TEST_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/pch.cpp)
+
         add_executable(glslangtests ${TEST_SOURCES})
         set_property(TARGET glslangtests PROPERTY FOLDER tests)
         glslang_set_link_args(glslangtests)
-        install(TARGETS glslangtests
-                RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
+        if(ENABLE_GLSLANG_INSTALL)
+            install(TARGETS glslangtests
+                    RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
+        endif(ENABLE_GLSLANG_INSTALL)
 
         set(GLSLANG_TEST_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/../Test")
         # Supply a default test root directory, so that manual testing
diff --git a/gtests/Config.FromFile.cpp b/gtests/Config.FromFile.cpp
index a6e93dc..f3a2772 100644
--- a/gtests/Config.FromFile.cpp
+++ b/gtests/Config.FromFile.cpp
@@ -97,7 +97,7 @@
 INSTANTIATE_TEST_CASE_P(
     Glsl, ConfigTest,
     ::testing::ValuesIn(std::vector<TestCaseSpec>({
-        {"specExamples.vert", "baseResults/test.conf", "specExamples.vert.out", (EShMessages)(EShMsgAST | EShMsgCascadingErrors)},
+        {"specExamples.vert", "baseResults/test.conf", "specExamplesConf.vert.out", (EShMessages)(EShMsgAST | EShMsgCascadingErrors)},
         {"100Limits.vert", "100.conf", "100LimitsConf.vert.out", EShMsgCascadingErrors},
     })),
 );
diff --git a/gtests/Hlsl.FromFile.cpp b/gtests/Hlsl.FromFile.cpp
index 3352ff2..809e525 100644
--- a/gtests/Hlsl.FromFile.cpp
+++ b/gtests/Hlsl.FromFile.cpp
@@ -58,15 +58,24 @@
 }
 
 using HlslCompileTest = GlslangTest<::testing::TestWithParam<FileNameEntryPointPair>>;
+using HlslVulkan1_1CompileTest = GlslangTest<::testing::TestWithParam<FileNameEntryPointPair>>;
 using HlslCompileAndFlattenTest = GlslangTest<::testing::TestWithParam<FileNameEntryPointPair>>;
+using HlslLegalizeTest = GlslangTest<::testing::TestWithParam<FileNameEntryPointPair>>;
 
-// Compiling HLSL to SPIR-V under Vulkan semantics. Expected to successfully
-// generate both AST and SPIR-V.
+// Compiling HLSL to pre-legalized SPIR-V under Vulkan semantics. Expected
+// to successfully generate both AST and SPIR-V.
 TEST_P(HlslCompileTest, FromFile)
 {
     loadFileCompileAndCheck(GlobalTestSettings.testRoot, GetParam().fileName,
-                            Source::HLSL, Semantics::Vulkan,
-                            Target::BothASTAndSpv, GetParam().entryPoint);
+                            Source::HLSL, Semantics::Vulkan, glslang::EShTargetVulkan_1_0,
+                            Target::BothASTAndSpv, true, GetParam().entryPoint);
+}
+
+TEST_P(HlslVulkan1_1CompileTest, FromFile)
+{
+    loadFileCompileAndCheck(GlobalTestSettings.testRoot, GetParam().fileName,
+                            Source::HLSL, Semantics::Vulkan, glslang::EShTargetVulkan_1_1,
+                            Target::BothASTAndSpv, true, GetParam().entryPoint);
 }
 
 TEST_P(HlslCompileAndFlattenTest, FromFile)
@@ -76,17 +85,30 @@
                                            Target::BothASTAndSpv, GetParam().entryPoint);
 }
 
+// Compiling HLSL to legal SPIR-V under Vulkan semantics. Expected to
+// successfully generate SPIR-V.
+TEST_P(HlslLegalizeTest, FromFile)
+{
+    loadFileCompileAndCheck(GlobalTestSettings.testRoot, GetParam().fileName,
+                            Source::HLSL, Semantics::Vulkan, glslang::EShTargetVulkan_1_0,
+                            Target::Spv, true, GetParam().entryPoint,
+                            "/baseLegalResults/", true);
+}
+
 // clang-format off
 INSTANTIATE_TEST_CASE_P(
     ToSpirv, HlslCompileTest,
     ::testing::ValuesIn(std::vector<FileNameEntryPointPair>{
         {"hlsl.amend.frag", "f1"},
+        {"hlsl.aliasOpaque.frag", "main"},
         {"hlsl.array.frag", "PixelShaderFunction"},
         {"hlsl.array.implicit-size.frag", "PixelShaderFunction"},
         {"hlsl.array.multidim.frag", "main"},
         {"hlsl.assoc.frag", "PixelShaderFunction"},
         {"hlsl.attribute.frag", "PixelShaderFunction"},
         {"hlsl.attribute.expression.comp", "main"},
+        {"hlsl.attributeC11.frag", "main"},
+        {"hlsl.attributeGlobalBuffer.frag", "main"},
         {"hlsl.basic.comp", "main"},
         {"hlsl.basic.geom", "main"},
         {"hlsl.boolConv.vert", "main"},
@@ -94,12 +116,39 @@
         {"hlsl.calculatelod.dx10.frag", "main"},
         {"hlsl.calculatelodunclamped.dx10.frag", "main"},
         {"hlsl.cast.frag", "PixelShaderFunction"},
+        {"hlsl.cbuffer-identifier.vert", "main"},
         {"hlsl.charLit.vert", "main"},
         {"hlsl.clip.frag", "main"},
+        {"hlsl.clipdistance-1.frag", "main"},
+        {"hlsl.clipdistance-1.geom", "main"},
+        {"hlsl.clipdistance-1.vert", "main"},
+        {"hlsl.clipdistance-2.frag", "main"},
+        {"hlsl.clipdistance-2.geom", "main"},
+        {"hlsl.clipdistance-2.vert", "main"},
+        {"hlsl.clipdistance-3.frag", "main"},
+        {"hlsl.clipdistance-3.geom", "main"},
+        {"hlsl.clipdistance-3.vert", "main"},
+        {"hlsl.clipdistance-4.frag", "main"},
+        {"hlsl.clipdistance-4.geom", "main"},
+        {"hlsl.clipdistance-4.vert", "main"},
+        {"hlsl.clipdistance-5.frag", "main"},
+        {"hlsl.clipdistance-5.vert", "main"},
+        {"hlsl.clipdistance-6.frag", "main"},
+        {"hlsl.clipdistance-6.vert", "main"},
+        {"hlsl.clipdistance-7.frag", "main"},
+        {"hlsl.clipdistance-7.vert", "main"},
+        {"hlsl.clipdistance-8.frag", "main"},
+        {"hlsl.clipdistance-8.vert", "main"},
+        {"hlsl.clipdistance-9.frag", "main"},
+        {"hlsl.clipdistance-9.vert", "main"},
+        {"hlsl.color.hull.tesc", "main"},
         {"hlsl.comparison.vec.frag", "main"},
         {"hlsl.conditional.frag", "PixelShaderFunction"},
         {"hlsl.constantbuffer.frag", "main"},
+        {"hlsl.constructArray.vert", "main"},
         {"hlsl.constructexpr.frag", "main"},
+        {"hlsl.constructimat.frag", "main"},
+        {"hlsl.coverage.frag", "main"},
         {"hlsl.depthGreater.frag", "PixelShaderFunction"},
         {"hlsl.depthLess.frag", "PixelShaderFunction"},
         {"hlsl.discard.frag", "PixelShaderFunction"},
@@ -109,9 +158,15 @@
         {"hlsl.emptystruct.init.vert", "main"},
         {"hlsl.entry-in.frag", "PixelShaderFunction"},
         {"hlsl.entry-out.frag", "PixelShaderFunction"},
+        {"hlsl.fraggeom.frag", "main"},
         {"hlsl.float1.frag", "PixelShaderFunction"},
         {"hlsl.float4.frag", "PixelShaderFunction"},
         {"hlsl.flatten.return.frag", "main"},
+        {"hlsl.flattenOpaque.frag", "main"},
+        {"hlsl.flattenOpaqueInit.vert", "main"},
+        {"hlsl.flattenOpaqueInitMix.vert", "main"},
+        {"hlsl.flattenSubset.frag", "main"},
+        {"hlsl.flattenSubset2.frag", "main"},
         {"hlsl.forLoop.frag", "PixelShaderFunction"},
         {"hlsl.gather.array.dx10.frag", "main"},
         {"hlsl.gather.basic.dx10.frag", "main"},
@@ -127,16 +182,24 @@
         {"hlsl.getdimensions.rw.dx10.frag", "main"},
         {"hlsl.getdimensions.dx10.vert", "main"},
         {"hlsl.getsampleposition.dx10.frag", "main"},
+        {"hlsl.global-const-init.frag", "main"},
+        {"hlsl.gs-hs-mix.tesc", "HSMain"},
         {"hlsl.domain.1.tese", "main"},
         {"hlsl.domain.2.tese", "main"},
         {"hlsl.domain.3.tese", "main"},
+        {"hlsl.function.frag", "main"},
         {"hlsl.hull.1.tesc", "main"},
         {"hlsl.hull.2.tesc", "main"},
+        {"hlsl.hull.3.tesc", "main"},
+        {"hlsl.hull.4.tesc", "main"},
+        {"hlsl.hull.5.tesc", "main"},
         {"hlsl.hull.void.tesc", "main"},
         {"hlsl.hull.ctrlpt-1.tesc", "main"},
         {"hlsl.hull.ctrlpt-2.tesc", "main"},
+        {"hlsl.groupid.comp", "main"},
         {"hlsl.identifier.sample.frag", "main"},
         {"hlsl.if.frag", "PixelShaderFunction"},
+        {"hlsl.imagefetch-subvec4.comp", "main"},
         {"hlsl.implicitBool.frag", "main"},
         {"hlsl.inf.vert", "main"},
         {"hlsl.inoutquals.frag", "main"},
@@ -160,6 +223,7 @@
         {"hlsl.intrinsics.promote.down.frag", "main"},
         {"hlsl.intrinsics.promote.outputs.frag", "main"},
         {"hlsl.layout.frag", "main"},
+        {"hlsl.layoutOverride.vert", "main"},
         {"hlsl.load.2dms.dx10.frag", "main"},
         {"hlsl.load.array.dx10.frag", "main"},
         {"hlsl.load.basic.dx10.frag", "main"},
@@ -171,26 +235,39 @@
         {"hlsl.load.rwtexture.array.dx10.frag", "main"},
         {"hlsl.load.offset.dx10.frag", "main"},
         {"hlsl.load.offsetarray.dx10.frag", "main"},
+        {"hlsl.localStructuredBuffer.comp", "main"},
         {"hlsl.logical.binary.frag", "main"},
         {"hlsl.logical.binary.vec.frag", "main"},
         {"hlsl.logicalConvert.frag", "main"},
         {"hlsl.logical.unary.frag", "main"},
         {"hlsl.loopattr.frag", "main"},
+        {"hlsl.matpack-pragma.frag", "main"},
+        {"hlsl.mip.operator.frag", "main"},
+        {"hlsl.mip.negative.frag", "main"},
+        {"hlsl.mip.negative2.frag", "main"},
         {"hlsl.namespace.frag", "main"},
         {"hlsl.nonint-index.frag", "main"},
         {"hlsl.matNx1.frag", "main"},
+        {"hlsl.matpack-1.frag", "main"},
         {"hlsl.matrixSwizzle.vert", "ShaderFunction"},
+        {"hlsl.memberFunCall.frag", "main"},
         {"hlsl.mintypes.frag", "main"},
+        {"hlsl.mul-truncate.frag", "main"},
         {"hlsl.multiEntry.vert", "RealEntrypoint"},
         {"hlsl.multiReturn.frag", "main"},
         {"hlsl.matrixindex.frag", "main"},
         {"hlsl.nonstaticMemberFunction.frag", "main"},
         {"hlsl.numericsuffixes.frag", "main"},
-        {"hlsl.numthreads.comp", "main_aux1"},
+        {"hlsl.numthreads.comp", "main_aux2"},
         {"hlsl.overload.frag", "PixelShaderFunction"},
+        {"hlsl.opaque-type-bug.frag", "main"},
         {"hlsl.params.default.frag", "main"},
         {"hlsl.params.default.negative.frag", "main"},
         {"hlsl.partialInit.frag", "PixelShaderFunction"},
+        {"hlsl.partialFlattenLocal.vert", "main"},
+        {"hlsl.PointSize.geom", "main"},
+        {"hlsl.PointSize.vert", "main"},
+        {"hlsl.pp.vert", "main"},
         {"hlsl.pp.line.frag", "main"},
         {"hlsl.precise.frag", "main"},
         {"hlsl.promote.atomic.frag", "main"},
@@ -213,6 +290,7 @@
         {"hlsl.samplebias.offsetarray.dx10.frag", "main"},
         {"hlsl.samplecmp.array.dx10.frag", "main"},
         {"hlsl.samplecmp.basic.dx10.frag", "main"},
+        {"hlsl.samplecmp.dualmode.frag", "main"},
         {"hlsl.samplecmp.offset.dx10.frag", "main"},
         {"hlsl.samplecmp.offsetarray.dx10.frag", "main"},
         {"hlsl.samplecmp.negative.frag", "main"},
@@ -237,7 +315,11 @@
         {"hlsl.semicolons.frag", "main"},
         {"hlsl.shapeConv.frag", "main"},
         {"hlsl.shapeConvRet.frag", "main"},
+        {"hlsl.self_cast.frag", "main"},
+        {"hlsl.snorm.uav.comp", "main"},
         {"hlsl.staticMemberFunction.frag", "main"},
+        {"hlsl.staticFuncInit.frag", "main"},
+        {"hlsl.store.rwbyteaddressbuffer.type.comp", "main"},
         {"hlsl.stringtoken.frag", "main"},
         {"hlsl.string.frag", "main"},
         {"hlsl.struct.split-1.vert", "main"},
@@ -251,6 +333,7 @@
         {"hlsl.structarray.flatten.geom", "main"},
         {"hlsl.structbuffer.frag", "main"},
         {"hlsl.structbuffer.append.frag", "main"},
+        {"hlsl.structbuffer.append.fn.frag", "main"},
         {"hlsl.structbuffer.atomics.frag", "main"},
         {"hlsl.structbuffer.byte.frag", "main"},
         {"hlsl.structbuffer.coherent.frag", "main"},
@@ -263,6 +346,11 @@
         {"hlsl.structin.vert", "main"},
         {"hlsl.structIoFourWay.frag", "main"},
         {"hlsl.structStructName.frag", "main"},
+        {"hlsl.subpass.frag", "main"},
+        {"hlsl.synthesizeInput.frag", "main"},
+        {"hlsl.texturebuffer.frag", "main"},
+        {"hlsl.texture.struct.frag", "main"},
+        {"hlsl.texture.subvec4.frag", "main"},
         {"hlsl.this.frag", "main"},
         {"hlsl.intrinsics.vert", "VertexShaderFunction"},
         {"hlsl.intrinsic.frexp.vert", "VertexShaderFunction"},
@@ -270,23 +358,50 @@
         {"hlsl.matType.bool.frag", "main"},
         {"hlsl.matType.int.frag", "main"},
         {"hlsl.max.frag", "PixelShaderFunction"},
+        {"hlsl.preprocessor.frag", "main"},
         {"hlsl.precedence.frag", "PixelShaderFunction"},
         {"hlsl.precedence2.frag", "PixelShaderFunction"},
+        {"hlsl.scalar2matrix.frag", "main"},
         {"hlsl.semantic.geom", "main"},
         {"hlsl.semantic.vert", "main"},
+        {"hlsl.semantic-1.vert", "main"},
         {"hlsl.scope.frag", "PixelShaderFunction"},
         {"hlsl.sin.frag", "PixelShaderFunction"},
         {"hlsl.struct.frag", "PixelShaderFunction"},
         {"hlsl.switch.frag", "PixelShaderFunction"},
         {"hlsl.swizzle.frag", "PixelShaderFunction"},
+        {"hlsl.target.frag", "main"},
+        {"hlsl.targetStruct1.frag", "main"},
+        {"hlsl.targetStruct2.frag", "main"},
         {"hlsl.templatetypes.frag", "PixelShaderFunction"},
+        {"hlsl.tristream-append.geom", "main"},
         {"hlsl.tx.bracket.frag", "main"},
+        {"hlsl.tx.overload.frag", "main"},
         {"hlsl.type.half.frag", "main"},
         {"hlsl.type.identifier.frag", "main"},
         {"hlsl.typeGraphCopy.vert", "main"},
         {"hlsl.typedef.frag", "PixelShaderFunction"},
         {"hlsl.whileLoop.frag", "PixelShaderFunction"},
         {"hlsl.void.frag", "PixelShaderFunction"},
+        {"hlsl.type.type.conversion.all.frag", "main"}
+    }),
+    FileNameAsCustomTestSuffix
+);
+// clang-format on
+
+// clang-format off
+INSTANTIATE_TEST_CASE_P(
+    ToSpirv, HlslVulkan1_1CompileTest,
+    ::testing::ValuesIn(std::vector<FileNameEntryPointPair>{
+        {"hlsl.wavebroadcast.comp", "CSMain"},
+        {"hlsl.waveprefix.comp", "CSMain"},
+        {"hlsl.wavequad.comp", "CSMain"},
+        {"hlsl.wavequery.comp", "CSMain"},
+        {"hlsl.wavequery.frag", "PixelShaderFunction"},
+        {"hlsl.wavereduction.comp", "CSMain"},
+        {"hlsl.wavevote.comp", "CSMain"},
+        { "hlsl.type.type.conversion.valid.frag", "main" },
+        {"hlsl.int.dot.frag", "main"}
     }),
     FileNameAsCustomTestSuffix
 );
@@ -297,10 +412,30 @@
     ToSpirv, HlslCompileAndFlattenTest,
     ::testing::ValuesIn(std::vector<FileNameEntryPointPair>{
         {"hlsl.array.flatten.frag", "main"},
+        {"hlsl.partialFlattenMixed.vert", "main"},
     }),
     FileNameAsCustomTestSuffix
 );
-
 // clang-format on
+
+#if ENABLE_OPT
+// clang-format off
+INSTANTIATE_TEST_CASE_P(
+    ToSpirv, HlslLegalizeTest,
+    ::testing::ValuesIn(std::vector<FileNameEntryPointPair>{
+        {"hlsl.aliasOpaque.frag", "main"},
+        {"hlsl.flattenOpaque.frag", "main"},
+        {"hlsl.flattenOpaqueInit.vert", "main"},
+        {"hlsl.flattenOpaqueInitMix.vert", "main"},
+        {"hlsl.flattenSubset.frag", "main"},
+        {"hlsl.flattenSubset2.frag", "main"},
+        {"hlsl.partialFlattenLocal.vert", "main"},
+        {"hlsl.partialFlattenMixed.vert", "main"}
+    }),
+    FileNameAsCustomTestSuffix
+);
+// clang-format on
+#endif
+
 }  // anonymous namespace
 }  // namespace glslangtest
diff --git a/gtests/Link.FromFile.Vk.cpp b/gtests/Link.FromFile.Vk.cpp
index 6ce1fe9..22892f0 100644
--- a/gtests/Link.FromFile.Vk.cpp
+++ b/gtests/Link.FromFile.Vk.cpp
@@ -52,6 +52,7 @@
     GlslangResult result;
 
     // Compile each input shader file.
+    bool success = true;
     std::vector<std::unique_ptr<glslang::TShader>> shaders;
     for (size_t i = 0; i < fileCount; ++i) {
         std::string contents;
@@ -60,7 +61,8 @@
         shaders.emplace_back(
                 new glslang::TShader(GetShaderStage(GetSuffix(fileNames[i]))));
         auto* shader = shaders.back().get();
-        compile(shader, contents, "", controls);
+        shader->setAutoMapLocations(true);
+        success &= compile(shader, contents, "", controls);
         result.shaderResults.push_back(
             {fileNames[i], shader->getInfoLog(), shader->getInfoDebugLog()});
     }
@@ -68,10 +70,26 @@
     // Link all of them.
     glslang::TProgram program;
     for (const auto& shader : shaders) program.addShader(shader.get());
-    program.link(controls);
+    success &= program.link(controls);
     result.linkingOutput = program.getInfoLog();
     result.linkingError = program.getInfoDebugLog();
 
+    if (success && (controls & EShMsgSpvRules)) {
+        spv::SpvBuildLogger logger;
+        std::vector<uint32_t> spirv_binary;
+        glslang::SpvOptions options;
+        options.disableOptimizer = true;
+        options.validate = true;
+        glslang::GlslangToSpv(*program.getIntermediate(shaders.front()->getStage()),
+                                spirv_binary, &logger, &options);
+
+        std::ostringstream disassembly_stream;
+        spv::Parameterize();
+        spv::Disassemble(disassembly_stream, spirv_binary);
+        result.spirvWarningsErrors = logger.getAllMessages();
+        result.spirv = disassembly_stream.str();
+    }
+
     std::ostringstream stream;
     outputResultToStream(&stream, result, controls);
 
@@ -89,6 +107,7 @@
     Glsl, LinkTestVulkan,
     ::testing::ValuesIn(std::vector<std::vector<std::string>>({
         {"link1.vk.frag", "link2.vk.frag"},
+        {"spv.unit1.frag", "spv.unit2.frag", "spv.unit3.frag"},
     })),
 );
 // clang-format on
diff --git a/gtests/Pp.FromFile.cpp b/gtests/Pp.FromFile.cpp
index 13daac0..1bea877 100644
--- a/gtests/Pp.FromFile.cpp
+++ b/gtests/Pp.FromFile.cpp
@@ -50,6 +50,7 @@
 INSTANTIATE_TEST_CASE_P(
     Glsl, PreprocessingTest,
     ::testing::ValuesIn(std::vector<std::string>({
+        "preprocessor.bad_arg.vert",
         "preprocessor.cpp_style_line_directive.vert",
         "preprocessor.cpp_style___FILE__.vert",
         "preprocessor.edge_cases.vert",
diff --git a/gtests/Remap.FromFile.cpp b/gtests/Remap.FromFile.cpp
index 9f25a6f..50bce8e 100644
--- a/gtests/Remap.FromFile.cpp
+++ b/gtests/Remap.FromFile.cpp
@@ -89,6 +89,7 @@
             { "remap.basic.everything.frag",              "main", Source::GLSL, spv::spirvbin_t::DO_EVERYTHING },
             { "remap.basic.dcefunc.frag",                 "main", Source::GLSL, spv::spirvbin_t::DCE_FUNCS },
             { "remap.basic.strip.frag",                   "main", Source::GLSL, spv::spirvbin_t::STRIP },
+            { "remap.specconst.comp",                     "main", Source::GLSL, spv::spirvbin_t::DO_EVERYTHING },
             { "remap.switch.none.frag",                   "main", Source::GLSL, spv::spirvbin_t::NONE },
             { "remap.switch.everything.frag",             "main", Source::GLSL, spv::spirvbin_t::DO_EVERYTHING },
             { "remap.literal64.none.spv",                 "main", Source::GLSL, spv::spirvbin_t::NONE },
diff --git a/gtests/Spv.FromFile.cpp b/gtests/Spv.FromFile.cpp
old mode 100644
new mode 100755
index e05900b..1e17736
--- a/gtests/Spv.FromFile.cpp
+++ b/gtests/Spv.FromFile.cpp
@@ -63,6 +63,7 @@
 }
 
 using CompileVulkanToSpirvTest = GlslangTest<::testing::TestWithParam<std::string>>;
+using CompileVulkan1_1ToSpirvTest = GlslangTest<::testing::TestWithParam<std::string>>;
 using CompileOpenGLToSpirvTest = GlslangTest<::testing::TestWithParam<std::string>>;
 using VulkanSemantics = GlslangTest<::testing::TestWithParam<std::string>>;
 using OpenGLSemantics = GlslangTest<::testing::TestWithParam<std::string>>;
@@ -75,13 +76,21 @@
 #ifdef NV_EXTENSIONS
 using CompileVulkanToSpirvTestNV = GlslangTest<::testing::TestWithParam<std::string>>;
 #endif
+using CompileUpgradeTextureToSampledTextureAndDropSamplersTest = GlslangTest<::testing::TestWithParam<std::string>>;
 
 // Compiling GLSL to SPIR-V under Vulkan semantics. Expected to successfully
 // generate SPIR-V.
 TEST_P(CompileVulkanToSpirvTest, FromFile)
 {
     loadFileCompileAndCheck(GlobalTestSettings.testRoot, GetParam(),
-                            Source::GLSL, Semantics::Vulkan,
+                            Source::GLSL, Semantics::Vulkan, glslang::EShTargetVulkan_1_0,
+                            Target::Spv);
+}
+
+TEST_P(CompileVulkan1_1ToSpirvTest, FromFile)
+{
+    loadFileCompileAndCheck(GlobalTestSettings.testRoot, GetParam(),
+                            Source::GLSL, Semantics::Vulkan, glslang::EShTargetVulkan_1_1,
                             Target::Spv);
 }
 
@@ -90,7 +99,7 @@
 TEST_P(CompileOpenGLToSpirvTest, FromFile)
 {
     loadFileCompileAndCheck(GlobalTestSettings.testRoot, GetParam(),
-                            Source::GLSL, Semantics::OpenGL,
+                            Source::GLSL, Semantics::OpenGL, glslang::EShTargetVulkan_1_0,
                             Target::Spv);
 }
 
@@ -99,8 +108,8 @@
 TEST_P(VulkanSemantics, FromFile)
 {
     loadFileCompileAndCheck(GlobalTestSettings.testRoot, GetParam(),
-                            Source::GLSL, Semantics::Vulkan,
-                            Target::Spv);
+                            Source::GLSL, Semantics::Vulkan, glslang::EShTargetVulkan_1_0,
+                            Target::Spv, false);
 }
 
 // GLSL-level Vulkan semantics test. Expected to error out before generating
@@ -108,15 +117,15 @@
 TEST_P(OpenGLSemantics, FromFile)
 {
     loadFileCompileAndCheck(GlobalTestSettings.testRoot, GetParam(),
-                            Source::GLSL, Semantics::OpenGL,
-                            Target::Spv);
+                            Source::GLSL, Semantics::OpenGL, glslang::EShTargetVulkan_1_0,
+                            Target::Spv, false);
 }
 
 // GLSL-level Vulkan semantics test that need to see the AST for validation.
 TEST_P(VulkanAstSemantics, FromFile)
 {
     loadFileCompileAndCheck(GlobalTestSettings.testRoot, GetParam(),
-                            Source::GLSL, Semantics::Vulkan,
+                            Source::GLSL, Semantics::Vulkan, glslang::EShTargetVulkan_1_0,
                             Target::AST);
 }
 
@@ -156,22 +165,31 @@
 TEST_P(CompileVulkanToSpirvTestAMD, FromFile)
 {
     loadFileCompileAndCheck(GlobalTestSettings.testRoot, GetParam(),
-                            Source::GLSL, Semantics::Vulkan,
+                            Source::GLSL, Semantics::Vulkan, glslang::EShTargetVulkan_1_0,
                             Target::Spv);
 }
 #endif
 
 #ifdef NV_EXTENSIONS
-// Compiling GLSL to SPIR-V under Vulkan semantics (AMD extensions enabled).
+// Compiling GLSL to SPIR-V under Vulkan semantics (NV extensions enabled).
 // Expected to successfully generate SPIR-V.
 TEST_P(CompileVulkanToSpirvTestNV, FromFile)
 {
     loadFileCompileAndCheck(GlobalTestSettings.testRoot, GetParam(),
-        Source::GLSL, Semantics::Vulkan,
-        Target::Spv);
+                            Source::GLSL, Semantics::Vulkan, glslang::EShTargetVulkan_1_0,
+                            Target::Spv);
 }
 #endif
 
+TEST_P(CompileUpgradeTextureToSampledTextureAndDropSamplersTest, FromFile)
+{
+    loadCompileUpgradeTextureToSampledTextureAndDropSamplersAndCheck(GlobalTestSettings.testRoot,
+                                                                     GetParam(),
+                                                                     Source::GLSL,
+                                                                     Semantics::Vulkan,
+                                                                     Target::Spv);
+}
+
 // clang-format off
 INSTANTIATE_TEST_CASE_P(
     Glsl, CompileVulkanToSpirvTest,
@@ -179,6 +197,7 @@
         // Test looping constructs.
         // No tests yet for making sure break and continue from a nested loop
         // goes to the innermost target.
+        "spv.barrier.vert",
         "spv.do-simple.vert",
         "spv.do-while-continue-break.vert",
         "spv.for-complex-condition.vert",
@@ -196,6 +215,12 @@
         "spv.140.frag",
         "spv.150.geom",
         "spv.150.vert",
+        "spv.16bitstorage.frag",
+        "spv.16bitstorage_Error.frag",
+        "spv.16bitstorage-int.frag",
+        "spv.16bitstorage_Error-int.frag",
+        "spv.16bitstorage-uint.frag",
+        "spv.16bitstorage_Error-uint.frag",
         "spv.300BuiltIns.vert",
         "spv.300layout.frag",
         "spv.300layout.vert",
@@ -212,29 +237,45 @@
         "spv.450.tesc",
         "spv.450.geom",
         "spv.450.noRedecl.tesc",
+        "spv.8bitstorage-int.frag",
+        "spv.8bitstorage_Error-int.frag",
+        "spv.8bitstorage-uint.frag",
+        "spv.8bitstorage_Error-uint.frag",
+        "spv.8bitstorage-ubo.vert",
+        "spv.8bitstorage-ssbo.vert",
         "spv.accessChain.frag",
         "spv.aggOps.frag",
         "spv.always-discard.frag",
         "spv.always-discard2.frag",
+        "spv.arbPostDepthCoverage.frag",
+        "spv.arbPostDepthCoverage_Error.frag",
         "spv.bitCast.frag",
         "spv.bool.vert",
         "spv.boolInBlock.frag",
         "spv.branch-return.vert",
+        "spv.builtInXFB.vert",
         "spv.conditionalDiscard.frag",
+        "spv.constStruct.vert",
+        "spv.controlFlowAttributes.frag",
         "spv.conversion.frag",
         "spv.dataOut.frag",
         "spv.dataOutIndirect.frag",
         "spv.dataOutIndirect.vert",
         "spv.deepRvalue.frag",
         "spv.depthOut.frag",
-        "spv.deviceGroup.frag",
         "spv.discard-dce.frag",
-        "spv.drawParams.vert",
         "spv.doWhileLoop.frag",
         "spv.earlyReturnDiscard.frag",
+        "spv.extPostDepthCoverage.frag",
+        "spv.extPostDepthCoverage_Error.frag",
         "spv.flowControl.frag",
         "spv.forLoop.frag",
         "spv.forwardFun.frag",
+        "spv.fragmentDensity.frag",
+        "spv.fragmentDensity.vert",
+        "spv.fragmentDensity-es.frag",
+        "spv.fragmentDensity-neg.frag",
+        "spv.fullyCovered.frag",
         "spv.functionCall.frag",
         "spv.functionNestedOpaque.vert",
         "spv.functionSemantics.frag",
@@ -251,23 +292,33 @@
         "spv.matrix.frag",
         "spv.matrix2.frag",
         "spv.memoryQualifier.frag",
+        "spv.memoryScopeSemantics.comp",
+        "spv.memoryScopeSemantics_Error.comp",
         "spv.merge-unreachable.frag",
         "spv.multiStruct.comp",
         "spv.multiStructFuncall.frag",
-        "spv.multiView.frag",
         "spv.newTexture.frag",
         "spv.noDeadDecorations.vert",
         "spv.nonSquare.vert",
+        "spv.nonuniform.frag",
         "spv.noWorkgroup.comp",
         "spv.offsets.frag",
         "spv.Operations.frag",
+        "spv.paramMemory.frag",
         "spv.precision.frag",
+        "spv.precisionNonESSamp.frag",
         "spv.prepost.frag",
         "spv.qualifiers.vert",
+        "spv.sample.frag",
+        "spv.sampleId.frag",
+        "spv.samplePosition.frag",
         "spv.sampleMaskOverrideCoverage.frag",
+        "spv.scalarlayout.frag",
+        "spv.scalarlayoutfloat16.frag",
         "spv.shaderBallot.comp",
         "spv.shaderDrawParams.vert",
         "spv.shaderGroupVote.comp",
+        "spv.shaderStencilExport.frag",
         "spv.shiftOps.frag",
         "spv.simpleFunctionCall.frag",
         "spv.simpleMat.vert",
@@ -283,6 +334,7 @@
         "spv.test.vert",
         "spv.texture.frag",
         "spv.texture.vert",
+        "spv.textureBuffer.vert",
         "spv.image.frag",
         "spv.types.frag",
         "spv.uint.frag",
@@ -290,6 +342,7 @@
         "spv.variableArrayIndex.frag",
         "spv.varyingArray.frag",
         "spv.varyingArrayIndirect.frag",
+        "spv.vecMatConstruct.frag",
         "spv.voidFunction.frag",
         "spv.whileLoop.frag",
         "spv.AofA.frag",
@@ -306,6 +359,48 @@
         "spv.storageBuffer.vert",
         "spv.precise.tese",
         "spv.precise.tesc",
+        "spv.vulkan100.subgroupArithmetic.comp",
+        "spv.vulkan100.subgroupPartitioned.comp",
+        "spv.xfb.vert",
+        "spv.xfb2.vert",
+        "spv.xfb3.vert",
+        "spv.samplerlessTextureFunctions.frag",
+    })),
+    FileNameAsCustomTestSuffix
+);
+
+// clang-format off
+INSTANTIATE_TEST_CASE_P(
+    Glsl, CompileVulkan1_1ToSpirvTest,
+    ::testing::ValuesIn(std::vector<std::string>({
+        "spv.1.3.8bitstorage-ubo.vert",
+        "spv.1.3.8bitstorage-ssbo.vert",
+        "spv.deviceGroup.frag",
+        "spv.drawParams.vert",
+        "spv.int8.frag",
+        "spv.vulkan110.int16.frag",
+        "spv.int32.frag",
+        "spv.explicittypes.frag",
+        "spv.float32.frag",
+        "spv.float64.frag",
+        "spv.multiView.frag",
+        "spv.subgroup.frag",
+        "spv.subgroup.geom",
+        "spv.subgroup.tesc",
+        "spv.subgroup.tese",
+        "spv.subgroup.vert",
+        "spv.subgroupArithmetic.comp",
+        "spv.subgroupBasic.comp",
+        "spv.subgroupBallot.comp",
+        "spv.subgroupBallotNeg.comp",
+        "spv.subgroupClustered.comp",
+        "spv.subgroupClusteredNeg.comp",
+        "spv.subgroupPartitioned.comp",
+        "spv.subgroupShuffle.comp",
+        "spv.subgroupShuffleRelative.comp",
+        "spv.subgroupQuad.comp",
+        "spv.subgroupVote.comp",
+        "spv.vulkan110.storageBuffer.vert",
     })),
     FileNameAsCustomTestSuffix
 );
@@ -317,10 +412,12 @@
         { "spv.register.autoassign.frag", "main_ep", 5, 10, 0, 20, 30, true, false },
         { "spv.register.noautoassign.frag", "main_ep", 5, 10, 0, 15, 30, false, false },
         { "spv.register.autoassign-2.frag", "main", 5, 10, 0, 15, 30, true, true },
+        { "spv.register.subpass.frag", "main", 0, 20, 0, 0, 0, true, true },
         { "spv.buffer.autoassign.frag", "main", 5, 10, 0, 15, 30, true, true },
         { "spv.ssbo.autoassign.frag", "main", 5, 10, 0, 15, 30, true, true },
+        { "spv.ssboAlias.frag", "main", 0, 0, 0, 0, 83, true, false },
         { "spv.rw.autoassign.frag", "main", 5, 10, 20, 15, 30, true, true },
-        { "spv.register.autoassign.rangetest.frag", "main", 
+        { "spv.register.autoassign.rangetest.frag", "main",
                 glslang::TQualifier::layoutBindingEnd-2,
                 glslang::TQualifier::layoutBindingEnd+5,
                 20, 30, true, false },
@@ -342,9 +439,18 @@
 INSTANTIATE_TEST_CASE_P(
     Glsl, CompileOpenGLToSpirvTest,
     ::testing::ValuesIn(std::vector<std::string>({
+        "spv.460.frag",
+        "spv.460.vert",
+        "spv.460.comp",
         "spv.atomic.comp",
         "spv.glFragColor.frag",
+        "spv.rankShift.comp",
         "spv.specConst.vert",
+        "spv.OVR_multiview.vert",
+        "spv.xfbOffsetOnBlockMembersAssignment.vert",
+        "spv.xfbOffsetOnStructMembersAssignment.vert",
+        "spv.xfbOverlapOffsetCheckWithBlockAndMember.vert",
+        "spv.xfbStrideJustOnce.vert",
     })),
     FileNameAsCustomTestSuffix
 );
@@ -355,6 +461,7 @@
         "vulkan.frag",
         "vulkan.vert",
         "vulkan.comp",
+        "samplerlessTextureFunctions.frag",
     })),
     FileNameAsCustomTestSuffix
 );
@@ -384,7 +491,13 @@
     Glsl, CompileVulkanToSpirvTestAMD,
     ::testing::ValuesIn(std::vector<std::string>({
         "spv.float16.frag",
-        "spv.shaderBallotAMD.comp"
+        "spv.float16Fetch.frag",
+        "spv.imageLoadStoreLod.frag",
+        "spv.int16.frag",
+        "spv.int16.amd.frag",
+        "spv.shaderBallotAMD.comp",
+        "spv.shaderFragMaskAMD.frag",
+        "spv.textureGatherBiasLod.frag",
     })),
     FileNameAsCustomTestSuffix
 );
@@ -402,10 +515,49 @@
     "spv.stereoViewRendering.tesc",
     "spv.multiviewPerViewAttributes.vert",
     "spv.multiviewPerViewAttributes.tesc",
+    "spv.atomicInt64.comp",
+    "spv.shadingRate.frag",
+    "spv.RayGenShader.rgen",
+    "spv.RayGenShader_Errors.rgen",
+    "spv.RayConstants.rgen",
+    "spv.IntersectShader.rint",
+    "spv.IntersectShader_Errors.rint",
+    "spv.AnyHitShader.rahit",
+    "spv.AnyHitShader_Errors.rahit",
+    "spv.ClosestHitShader.rchit",
+    "spv.ClosestHitShader_Errors.rchit",
+    "spv.MissShader.rmiss",
+    "spv.MissShader_Errors.rmiss",
+    "spv.RayCallable.rcall",
+    "spv.RayCallable_Errors.rcall",
+    "spv.fragmentShaderBarycentric.frag",
+    "spv.fragmentShaderBarycentric2.frag",
+    "spv.computeShaderDerivatives.comp",
+    "spv.computeShaderDerivatives2.comp",
+    "spv.shaderImageFootprint.frag",
+    "spv.meshShaderBuiltins.mesh",
+    "spv.meshShaderUserDefined.mesh",
+    "spv.meshShaderPerViewBuiltins.mesh",
+    "spv.meshShaderPerViewUserDefined.mesh",
+    "spv.meshShaderSharedMem.mesh",
+    "spv.meshShaderTaskMem.mesh",
+    "spv.320.meshShaderUserDefined.mesh",
+    "spv.meshShaderRedeclBuiltins.mesh",
+    "spv.meshShaderRedeclPerViewBuiltins.mesh",
+    "spv.meshTaskShader.task",
+    "spv.perprimitiveNV.frag",
 })),
 FileNameAsCustomTestSuffix
 );
 #endif
+
+INSTANTIATE_TEST_CASE_P(
+    Glsl, CompileUpgradeTextureToSampledTextureAndDropSamplersTest,
+    ::testing::ValuesIn(std::vector<std::string>({
+      "spv.texture.sampler.transform.frag",
+    })),
+    FileNameAsCustomTestSuffix
+);
 // clang-format on
 
 }  // anonymous namespace
diff --git a/gtests/TestFixture.cpp b/gtests/TestFixture.cpp
index db2b81d..d899c78 100644
--- a/gtests/TestFixture.cpp
+++ b/gtests/TestFixture.cpp
@@ -60,6 +60,24 @@
         return EShLangFragment;
     } else if (stage == "comp") {
         return EShLangCompute;
+#ifdef NV_EXTENSIONS
+    } else if (stage == "rgen") {
+        return EShLangRayGenNV;
+    } else if (stage == "rint") {
+        return EShLangIntersectNV;
+    } else if (stage == "rahit") {
+        return EShLangAnyHitNV;
+    } else if (stage == "rchit") {
+        return EShLangClosestHitNV;
+    } else if (stage == "rmiss") {
+        return EShLangMissNV;
+    } else if (stage == "rcall") {
+        return EShLangCallableNV;
+    } else if (stage == "task") {
+        return EShLangTaskNV;
+    } else if (stage == "mesh") {
+        return EShLangMeshNV;
+#endif
     } else {
         assert(0 && "Unknown shader stage");
         return EShLangCount;
@@ -100,6 +118,8 @@
             break;
     }
 
+    result = static_cast<EShMessages>(result | EShMsgHlslLegalization);
+
     return result;
 }
 
diff --git a/gtests/TestFixture.h b/gtests/TestFixture.h
old mode 100644
new mode 100755
index 38ec54c..3329fa3
--- a/gtests/TestFixture.h
+++ b/gtests/TestFixture.h
@@ -70,7 +70,7 @@
 // Enum for shader compilation semantics.
 enum class Semantics {
     OpenGL,
-    Vulkan,
+    Vulkan
 };
 
 // Enum for compilation target.
@@ -197,13 +197,40 @@
     GlslangResult compileAndLink(
             const std::string shaderName, const std::string& code,
             const std::string& entryPointName, EShMessages controls,
-            bool flattenUniformArrays = false)
+            glslang::EShTargetClientVersion clientTargetVersion,
+            bool flattenUniformArrays = false,
+            EShTextureSamplerTransformMode texSampTransMode = EShTexSampTransKeep,
+            bool enableOptimizer = false,
+            bool automap = true)
     {
-        const EShLanguage kind = GetShaderStage(GetSuffix(shaderName));
+        const EShLanguage stage = GetShaderStage(GetSuffix(shaderName));
 
-        glslang::TShader shader(kind);
+        glslang::TShader shader(stage);
+        if (automap) {
+            shader.setAutoMapLocations(true);
+            shader.setAutoMapBindings(true);
+        }
+        shader.setTextureSamplerTransformMode(texSampTransMode);
         shader.setFlattenUniformArrays(flattenUniformArrays);
 
+        if (controls & EShMsgSpvRules) {
+            if (controls & EShMsgVulkanRules) {
+                shader.setEnvInput((controls & EShMsgReadHlsl) ? glslang::EShSourceHlsl
+                                                               : glslang::EShSourceGlsl,
+                                    stage, glslang::EShClientVulkan, 100);
+                shader.setEnvClient(glslang::EShClientVulkan, clientTargetVersion);
+                shader.setEnvTarget(glslang::EShTargetSpv,
+                        clientTargetVersion == glslang::EShTargetVulkan_1_1 ? glslang::EShTargetSpv_1_3
+                                                                            : glslang::EShTargetSpv_1_0);
+            } else {
+                shader.setEnvInput((controls & EShMsgReadHlsl) ? glslang::EShSourceHlsl
+                                                               : glslang::EShSourceGlsl,
+                                    stage, glslang::EShClientOpenGL, 100);
+                shader.setEnvClient(glslang::EShClientOpenGL, clientTargetVersion);
+                shader.setEnvTarget(glslang::EshTargetSpv, glslang::EShTargetSpv_1_0);
+            }
+        }
+
         bool success = compile(&shader, code, entryPointName, controls);
 
         glslang::TProgram program;
@@ -214,8 +241,11 @@
 
         if (success && (controls & EShMsgSpvRules)) {
             std::vector<uint32_t> spirv_binary;
-            glslang::GlslangToSpv(*program.getIntermediate(kind),
-                                  spirv_binary, &logger);
+            glslang::SpvOptions options;
+            options.disableOptimizer = !enableOptimizer;
+            options.validate = true;
+            glslang::GlslangToSpv(*program.getIntermediate(stage),
+                                  spirv_binary, &logger, &options);
 
             std::ostringstream disassembly_stream;
             spv::Parameterize();
@@ -245,15 +275,16 @@
             bool autoMapBindings,
             bool flattenUniformArrays)
     {
-        const EShLanguage kind = GetShaderStage(GetSuffix(shaderName));
+        const EShLanguage stage = GetShaderStage(GetSuffix(shaderName));
 
-        glslang::TShader shader(kind);
+        glslang::TShader shader(stage);
         shader.setShiftSamplerBinding(baseSamplerBinding);
         shader.setShiftTextureBinding(baseTextureBinding);
         shader.setShiftImageBinding(baseImageBinding);
         shader.setShiftUboBinding(baseUboBinding);
         shader.setShiftSsboBinding(baseSsboBinding);
         shader.setAutoMapBindings(autoMapBindings);
+        shader.setAutoMapLocations(true);
         shader.setFlattenUniformArrays(flattenUniformArrays);
 
         bool success = compile(&shader, code, entryPointName, controls);
@@ -268,8 +299,10 @@
 
         if (success && (controls & EShMsgSpvRules)) {
             std::vector<uint32_t> spirv_binary;
-            glslang::GlslangToSpv(*program.getIntermediate(kind),
-                                  spirv_binary, &logger);
+            glslang::SpvOptions options;
+            options.validate = true;
+            glslang::GlslangToSpv(*program.getIntermediate(stage),
+                                  spirv_binary, &logger, &options);
 
             std::ostringstream disassembly_stream;
             spv::Parameterize();
@@ -292,9 +325,12 @@
             const std::string& entryPointName, EShMessages controls,
             const unsigned int remapOptions = spv::spirvbin_t::NONE)
     {
-        const EShLanguage kind = GetShaderStage(GetSuffix(shaderName));
+        const EShLanguage stage = GetShaderStage(GetSuffix(shaderName));
 
-        glslang::TShader shader(kind);
+        glslang::TShader shader(stage);
+        shader.setAutoMapBindings(true);
+        shader.setAutoMapLocations(true);
+
         bool success = compile(&shader, code, entryPointName, controls);
 
         glslang::TProgram program;
@@ -305,8 +341,10 @@
 
         if (success && (controls & EShMsgSpvRules)) {
             std::vector<uint32_t> spirv_binary;
-            glslang::GlslangToSpv(*program.getIntermediate(kind),
-                                  spirv_binary, &logger);
+            glslang::SpvOptions options;
+            options.validate = true;
+            glslang::GlslangToSpv(*program.getIntermediate(stage),
+                                  spirv_binary, &logger, &options);
 
             spv::spirvbin_t(0 /*verbosity*/).remap(spirv_binary, remapOptions);
 
@@ -374,19 +412,26 @@
                                  const std::string& testName,
                                  Source source,
                                  Semantics semantics,
+                                 glslang::EShTargetClientVersion clientTargetVersion,
                                  Target target,
-                                 const std::string& entryPointName="")
+                                 bool automap = true,
+                                 const std::string& entryPointName="",
+                                 const std::string& baseDir="/baseResults/",
+                                 const bool enableOptimizer = false)
     {
         const std::string inputFname = testDir + "/" + testName;
         const std::string expectedOutputFname =
-            testDir + "/baseResults/" + testName + ".out";
+            testDir + baseDir + testName + ".out";
         std::string input, expectedOutput;
 
         tryLoadFile(inputFname, "input", &input);
         tryLoadFile(expectedOutputFname, "expected output", &expectedOutput);
 
-        const EShMessages controls = DeriveOptions(source, semantics, target);
-        GlslangResult result = compileAndLink(testName, input, entryPointName, controls);
+        EShMessages controls = DeriveOptions(source, semantics, target);
+        if (enableOptimizer)
+            controls = static_cast<EShMessages>(controls & ~EShMsgHlslLegalization);
+        GlslangResult result = compileAndLink(testName, input, entryPointName, controls, clientTargetVersion, false,
+                                              EShTexSampTransKeep, enableOptimizer, automap);
 
         // Generate the hybrid output in the way of glslangValidator.
         std::ostringstream stream;
@@ -412,7 +457,8 @@
         tryLoadFile(expectedOutputFname, "expected output", &expectedOutput);
 
         const EShMessages controls = DeriveOptions(source, semantics, target);
-        GlslangResult result = compileAndLink(testName, input, entryPointName, controls, true);
+        GlslangResult result = compileAndLink(testName, input, entryPointName, controls,
+                                              glslang::EShTargetVulkan_1_0, true);
 
         // Generate the hybrid output in the way of glslangValidator.
         std::ostringstream stream;
@@ -566,6 +612,33 @@
                                     expectedErrorFname);
     }
 
+    void loadCompileUpgradeTextureToSampledTextureAndDropSamplersAndCheck(const std::string& testDir,
+                                                                          const std::string& testName,
+                                                                          Source source,
+                                                                          Semantics semantics,
+                                                                          Target target,
+                                                                          const std::string& entryPointName = "")
+    {
+        const std::string inputFname = testDir + "/" + testName;
+        const std::string expectedOutputFname = testDir + "/baseResults/" + testName + ".out";
+        std::string input, expectedOutput;
+
+        tryLoadFile(inputFname, "input", &input);
+        tryLoadFile(expectedOutputFname, "expected output", &expectedOutput);
+
+        const EShMessages controls = DeriveOptions(source, semantics, target);
+        GlslangResult result = compileAndLink(testName, input, entryPointName, controls,
+                                              glslang::EShTargetVulkan_1_0, false,
+                                              EShTexSampTransUpgradeTextureRemoveSampler);
+
+        // Generate the hybrid output in the way of glslangValidator.
+        std::ostringstream stream;
+        outputResultToStream(&stream, result, controls);
+
+        checkEqAndUpdateIfRequested(expectedOutput, stream.str(),
+                                    expectedOutputFname);
+    }
+
 private:
     const int defaultVersion;
     const EProfile defaultProfile;
diff --git a/gtests/main.cpp b/gtests/main.cpp
index 35f30db..9cd06d1 100644
--- a/gtests/main.cpp
+++ b/gtests/main.cpp
@@ -54,7 +54,7 @@
             glslangtest::GlobalTestSettings.updateMode = true;
         }
         if (std::string("--test-root") == argv[i]) {
-            // Allow the user set the tets root directory.  This is useful
+            // Allow the user set the test root directory.  This is useful
             // for testing with files from another source tree.
             if (i + 1 < argc) {
                 glslangtest::GlobalTestSettings.testRoot = argv[i + 1];
@@ -64,6 +64,11 @@
                 return 1;
             }
         }
+        if (std::string("--help") == argv[i]) {
+            printf("\nExtra options:\n\n");
+            printf("  --update-mode\n      Update the golden results for the tests.\n");
+            printf("  --test-root <arg>\n      Specify the test root directory (useful for testing with\n      files from another source tree).\n");
+        }
     }
 
     const int result = RUN_ALL_TESTS();
diff --git a/gtests/pch.cpp b/gtests/pch.cpp
new file mode 100644
index 0000000..b7a0865
--- /dev/null
+++ b/gtests/pch.cpp
@@ -0,0 +1,35 @@
+//
+// Copyright (C) 2018 The Khronos Group Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+//
+//    Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//    Redistributions in binary form must reproduce the above
+//    copyright notice, this list of conditions and the following
+//    disclaimer in the documentation and/or other materials provided
+//    with the distribution.
+//
+//    Neither the name of 3Dlabs Inc. Ltd. nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+// POSSIBILITY OF SUCH DAMAGE.
+//
+
+#include "pch.h"
diff --git a/gtests/pch.h b/gtests/pch.h
new file mode 100644
index 0000000..94e95b1
--- /dev/null
+++ b/gtests/pch.h
@@ -0,0 +1,39 @@
+#ifndef _PCH_H
+#define _PCH_H
+//
+// Copyright (C) 2018 The Khronos Group Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+//
+//    Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//    Redistributions in binary form must reproduce the above
+//    copyright notice, this list of conditions and the following
+//    disclaimer in the documentation and/or other materials provided
+//    with the distribution.
+//
+//    Neither the name of 3Dlabs Inc. Ltd. nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+// POSSIBILITY OF SUCH DAMAGE.
+//
+
+#include "TestFixture.h"
+
+#endif /* _PCH_H */
diff --git a/hlsl/CMakeLists.txt b/hlsl/CMakeLists.txt
old mode 100755
new mode 100644
index 24f5c9a..f918d7a
--- a/hlsl/CMakeLists.txt
+++ b/hlsl/CMakeLists.txt
@@ -17,12 +17,27 @@
     hlslGrammar.h
     hlslParseables.h)
 
-add_library(HLSL STATIC ${SOURCES} ${HEADERS})
-set_property(TARGET HLSL PROPERTY FOLDER hlsl POSITION_INDEPENDENT_CODE ON)
+glslang_pch(SOURCES pch.cpp)
+
+add_library(HLSL ${LIB_TYPE} ${SOURCES} ${HEADERS})
+set_property(TARGET HLSL PROPERTY FOLDER hlsl)
+set_property(TARGET HLSL PROPERTY POSITION_INDEPENDENT_CODE ON)
+
+if(WIN32 AND BUILD_SHARED_LIBS)
+    set_target_properties(HLSL PROPERTIES PREFIX "")
+endif()
 
 if(WIN32)
     source_group("Source" FILES ${SOURCES} ${HEADERS})
 endif(WIN32)
 
-install(TARGETS HLSL
-        ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
+if(ENABLE_GLSLANG_INSTALL)
+    if(BUILD_SHARED_LIBS)
+        install(TARGETS HLSL
+                ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
+                LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR})
+    else()
+        install(TARGETS HLSL
+                ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
+    endif()
+endif(ENABLE_GLSLANG_INSTALL)
diff --git a/hlsl/hlslAttributes.cpp b/hlsl/hlslAttributes.cpp
index 14f7a7b..261cec3 100644
--- a/hlsl/hlslAttributes.cpp
+++ b/hlsl/hlslAttributes.cpp
@@ -34,85 +34,73 @@
 //
 
 #include "hlslAttributes.h"
-#include <cstdlib>
-#include <cctype>
+#include "hlslParseHelper.h"
 
 namespace glslang {
     // Map the given string to an attribute enum from TAttributeType,
     // or EatNone if invalid.
-    TAttributeType TAttributeMap::attributeFromName(const TString& name)
+    TAttributeType HlslParseContext::attributeFromName(const TString& nameSpace, const TString& name) const
     {
-        // These are case insensitive.
-        TString lowername(name);
-        std::transform(lowername.begin(), lowername.end(), lowername.begin(), ::tolower);
+        // handle names within a namespace
 
-        if (lowername == "allow_uav_condition")
+        if (nameSpace == "vk") {
+            if (name == "input_attachment_index")
+                return EatInputAttachment;
+            else if (name == "location")
+                return EatLocation;
+            else if (name == "binding")
+                return EatBinding;
+            else if (name == "global_cbuffer_binding")
+                return EatGlobalBinding;
+            else if (name == "builtin")
+                return EatBuiltIn;
+            else if (name == "constant_id")
+                return EatConstantId;
+            else if (name == "push_constant")
+                return EatPushConstant;
+        } else if (nameSpace.size() > 0)
+            return EatNone;
+
+        // handle names with no namespace
+
+        if (name == "allow_uav_condition")
             return EatAllow_uav_condition;
-        else if (lowername == "branch")
+        else if (name == "branch")
             return EatBranch;
-        else if (lowername == "call")
+        else if (name == "call")
             return EatCall;
-        else if (lowername == "domain")
+        else if (name == "domain")
             return EatDomain;
-        else if (lowername == "earlydepthstencil")
+        else if (name == "earlydepthstencil")
             return EatEarlyDepthStencil;
-        else if (lowername == "fastopt")
+        else if (name == "fastopt")
             return EatFastOpt;
-        else if (lowername == "flatten")
+        else if (name == "flatten")
             return EatFlatten;
-        else if (lowername == "forcecase")
+        else if (name == "forcecase")
             return EatForceCase;
-        else if (lowername == "instance")
+        else if (name == "instance")
             return EatInstance;
-        else if (lowername == "maxtessfactor")
+        else if (name == "maxtessfactor")
             return EatMaxTessFactor;
-        else if (lowername == "maxvertexcount")
+        else if (name == "maxvertexcount")
             return EatMaxVertexCount;
-        else if (lowername == "numthreads")
+        else if (name == "numthreads")
             return EatNumThreads;
-        else if (lowername == "outputcontrolpoints")
+        else if (name == "outputcontrolpoints")
             return EatOutputControlPoints;
-        else if (lowername == "outputtopology")
+        else if (name == "outputtopology")
             return EatOutputTopology;
-        else if (lowername == "partitioning")
+        else if (name == "partitioning")
             return EatPartitioning;
-        else if (lowername == "patchconstantfunc")
+        else if (name == "patchconstantfunc")
             return EatPatchConstantFunc;
-        else if (lowername == "unroll")
+        else if (name == "unroll")
             return EatUnroll;
-        else if (lowername == "loop")
+        else if (name == "loop")
             return EatLoop;
         else
             return EatNone;
     }
 
-    // Look up entry, inserting if it's not there, and if name is a valid attribute name
-    // as known by attributeFromName.
-    TAttributeType TAttributeMap::setAttribute(const TString* name, TIntermAggregate* value)
-    {
-        if (name == nullptr)
-            return EatNone;
-
-        const TAttributeType attr = attributeFromName(*name);
-
-        if (attr != EatNone)
-            attributes[attr] = value;
-
-        return attr;
-    }
-
-    // Look up entry (const version), and return aggregate node.  This cannot change the map.
-    const TIntermAggregate* TAttributeMap::operator[](TAttributeType attr) const
-    {
-        const auto entry = attributes.find(attr);
-
-        return (entry == attributes.end()) ? nullptr : entry->second;
-    }
-
-    // True if entry exists in map (even if value is nullptr)
-    bool TAttributeMap::contains(TAttributeType attr) const
-    {
-        return attributes.find(attr) != attributes.end();
-    }
-
 } // end namespace glslang
diff --git a/hlsl/hlslAttributes.h b/hlsl/hlslAttributes.h
index b32a53c..b1cc037 100644
--- a/hlsl/hlslAttributes.h
+++ b/hlsl/hlslAttributes.h
@@ -38,75 +38,22 @@
 
 #include <unordered_map>
 #include <functional>
+
+#include "../glslang/MachineIndependent/attribute.h"
+#include "../glslang/MachineIndependent/SymbolTable.h"
 #include "hlslScanContext.h"
-#include "../glslang/Include/Common.h"
 
 namespace glslang {
-    enum TAttributeType {
-        EatNone,
-        EatAllow_uav_condition,
-        EatBranch,
-        EatCall,
-        EatDomain,
-        EatEarlyDepthStencil,
-        EatFastOpt,
-        EatFlatten,
-        EatForceCase,
-        EatInstance,
-        EatMaxTessFactor,
-        EatNumThreads,
-        EatMaxVertexCount,
-        EatOutputControlPoints,
-        EatOutputTopology,
-        EatPartitioning,
-        EatPatchConstantFunc,
-        EatPatchSize,
-        EatUnroll,
-        EatLoop,
-    };
-}
-
-namespace std {
-    // Allow use of TAttributeType enum in hash_map without calling code having to cast.
-    template <> struct hash<glslang::TAttributeType> {
-        std::size_t operator()(glslang::TAttributeType attr) const {
-            return std::hash<int>()(int(attr));
-        }
-    };
-} // end namespace std
-
-namespace glslang {
-    class TIntermAggregate;
-
-    class TAttributeMap {
-    public:
-        // Search for and potentially add the attribute into the map.  Return the
-        // attribute type enum for it, if found, else EatNone.
-        TAttributeType setAttribute(const TString* name, TIntermAggregate* value);
-
-        // Const lookup: search for (but do not modify) the attribute in the map.
-        const TIntermAggregate* operator[](TAttributeType) const;
-
-        // True if entry exists in map (even if value is nullptr)
-        bool contains(TAttributeType) const;
-
-    protected:
-        // Find an attribute enum given its name.
-        static TAttributeType attributeFromName(const TString&);
-
-        std::unordered_map<TAttributeType, TIntermAggregate*> attributes;
-    };
 
     class TFunctionDeclarator {
     public:
         TFunctionDeclarator() : function(nullptr), body(nullptr) { }
         TSourceLoc loc;
         TFunction* function;
-        TAttributeMap attributes;
+        TAttributes attributes;
         TVector<HlslToken>* body;
     };
 
 } // end namespace glslang
 
-
 #endif // HLSLATTRIBUTES_H_
diff --git a/hlsl/hlslGrammar.cpp b/hlsl/hlslGrammar.cpp
old mode 100755
new mode 100644
index cdf8a07..6acaccb
--- a/hlsl/hlslGrammar.cpp
+++ b/hlsl/hlslGrammar.cpp
@@ -107,26 +107,14 @@
     // valid identifier, nor is "linear".  This code special cases the known instances of this, so
     // e.g, "int sample;" or "float float;" is accepted.  Other cases can be added here if needed.
 
-    TString* idString = nullptr;
-    switch (peek()) {
-    case EHTokSample:     idString = NewPoolTString("sample");     break;
-    case EHTokHalf:       idString = NewPoolTString("half");       break;
-    case EHTokBool:       idString = NewPoolTString("bool");       break;
-    case EHTokFloat:      idString = NewPoolTString("float");      break;
-    case EHTokDouble:     idString = NewPoolTString("double");     break;
-    case EHTokInt:        idString = NewPoolTString("int");        break;
-    case EHTokUint:       idString = NewPoolTString("uint");       break;
-    case EHTokMin16float: idString = NewPoolTString("min16float"); break;
-    case EHTokMin10float: idString = NewPoolTString("min10float"); break;
-    case EHTokMin16int:   idString = NewPoolTString("min16int");   break;
-    case EHTokMin12int:   idString = NewPoolTString("min12int");   break;
-    default:
+    const char* idString = getTypeString(peek());
+    if (idString == nullptr)
         return false;
-    }
 
-    token.string     = idString;
+    token.string     = NewPoolTString(idString);
     token.tokenClass = EHTokIdentifier;
-    idToken          = token;
+    idToken = token;
+    typeIdentifiers = true;
 
     advanceToken();
 
@@ -138,8 +126,6 @@
 //
 bool HlslGrammar::acceptCompilationUnit()
 {
-    TIntermNode* unitNode = nullptr;
-
     if (! acceptDeclarationList(unitNode))
         return false;
 
@@ -307,12 +293,16 @@
 }
 
 // declaration
+//      : attributes attributed_declaration
+//      | NAMESPACE IDENTIFIER LEFT_BRACE declaration_list RIGHT_BRACE
+//
+// attributed_declaration
 //      : sampler_declaration_dx9 post_decls SEMICOLON
-//      | fully_specified_type declarator_list SEMICOLON(optional for cbuffer/tbuffer)
+//      | fully_specified_type                           // for cbuffer/tbuffer
+//      | fully_specified_type declarator_list SEMICOLON // for non cbuffer/tbuffer
 //      | fully_specified_type identifier function_parameters post_decls compound_statement  // function definition
 //      | fully_specified_type identifier sampler_state post_decls compound_statement        // sampler definition
 //      | typedef declaration
-//      | NAMESPACE IDENTIFIER LEFT_BRACE declaration_list RIGHT_BRACE
 //
 // declarator_list
 //      : declarator COMMA declarator COMMA declarator...  // zero or more declarators
@@ -332,7 +322,7 @@
 // node for all the initializers. Each function created is a top-level node to grow
 // into the passed-in nodeList.
 //
-// If 'nodeList' is passed in as non-null, it must an aggregate to extend for
+// If 'nodeList' is passed in as non-null, it must be an aggregate to extend for
 // each top-level node the declaration creates. Otherwise, if only one top-level
 // node in generated here, that is want is returned in nodeList.
 //
@@ -382,20 +372,31 @@
     // if (acceptSamplerDeclarationDX9(declaredType))
     //     return true;
 
+    bool forbidDeclarators = (peekTokenClass(EHTokCBuffer) || peekTokenClass(EHTokTBuffer));
     // fully_specified_type
-    if (! acceptFullySpecifiedType(declaredType, nodeList))
+    if (! acceptFullySpecifiedType(declaredType, nodeList, declarator.attributes, forbidDeclarators))
         return false;
 
-    // identifier
+    // cbuffer and tbuffer end with the closing '}'.
+    // No semicolon is included.
+    if (forbidDeclarators)
+        return true;
+
+    // declarator_list
+    //    : declarator
+    //         : identifier
     HlslToken idToken;
     TIntermAggregate* initializers = nullptr;
     while (acceptIdentifier(idToken)) {
-        const TString *fullName = idToken.string;
+        TString *fullName = idToken.string;
         if (parseContext.symbolTable.atGlobalLevel())
             parseContext.getFullNamespaceName(fullName);
         if (peekTokenClass(EHTokLeftParen)) {
             // looks like function parameters
 
+            // merge in the attributes into the return type
+            parseContext.transferTypeAttributes(token.loc, declarator.attributes, declaredType, true);
+
             // Potentially rename shader entry point function.  No-op most of the time.
             parseContext.renameShaderFunction(fullName);
 
@@ -423,32 +424,30 @@
                 parseContext.handleFunctionDeclarator(declarator.loc, *declarator.function, true);
             }
         } else {
-            // A variable declaration. Fix the storage qualifier if it's a global.
+            // A variable declaration.
+
+            // merge in the attributes, the first time around, into the shared type
+            if (! declarator_list)
+                parseContext.transferTypeAttributes(token.loc, declarator.attributes, declaredType);
+
+            // Fix the storage qualifier if it's a global.
             if (declaredType.getQualifier().storage == EvqTemporary && parseContext.symbolTable.atGlobalLevel())
                 declaredType.getQualifier().storage = EvqUniform;
 
+            // recognize array_specifier
+            TArraySizes* arraySizes = nullptr;
+            acceptArraySpecifier(arraySizes);
+
             // We can handle multiple variables per type declaration, so
             // the number of types can expand when arrayness is different.
             TType variableType;
             variableType.shallowCopy(declaredType);
 
-            // recognize array_specifier
-            TArraySizes* arraySizes = nullptr;
-            acceptArraySpecifier(arraySizes);
-
-            // Fix arrayness in the variableType
-            if (declaredType.isImplicitlySizedArray()) {
-                // Because "int[] a = int[2](...), b = int[3](...)" makes two arrays a and b
-                // of different sizes, for this case sharing the shallow copy of arrayness
-                // with the parseType oversubscribes it, so get a deep copy of the arrayness.
-                variableType.newArraySizes(declaredType.getArraySizes());
-            }
-            if (arraySizes || variableType.isArray()) {
-                // In the most general case, arrayness is potentially coming both from the
-                // declared type and from the variable: "int[] a[];" or just one or the other.
-                // Merge it all to the variableType, so all arrayness is part of the variableType.
-                parseContext.arrayDimMerge(variableType, arraySizes);
-            }
+            // In the most general case, arrayness is potentially coming both from the
+            // declared type and from the variable: "int[] a[];" or just one or the other.
+            // Merge it all to the variableType, so all arrayness is part of the variableType.
+            variableType.transferArraySizes(arraySizes);
+            variableType.copyArrayInnerSizes(declaredType.getArraySizes());
 
             // samplers accept immediate sampler state
             if (variableType.getBasicType() == EbtSampler) {
@@ -476,8 +475,9 @@
                 if (typedefDecl)
                     parseContext.declareTypedef(idToken.loc, *fullName, variableType);
                 else if (variableType.getBasicType() == EbtBlock) {
-                    parseContext.declareBlock(idToken.loc, variableType, fullName,
-                                              variableType.isArray() ? &variableType.getArraySizes() : nullptr);
+                    if (expressionNode)
+                        parseContext.error(idToken.loc, "buffer aliasing not yet supported", "block initializer", "");
+                    parseContext.declareBlock(idToken.loc, variableType, fullName);
                     parseContext.declareStructBufferCounter(idToken.loc, variableType, *fullName);
                 } else {
                     if (variableType.getQualifier().storage == EvqUniform && ! variableType.containsOpaque()) {
@@ -487,7 +487,7 @@
                         // Declare the variable and add any initializer code to the AST.
                         // The top-level node is always made into an aggregate, as that's
                         // historically how the AST has been.
-                        initializers = intermediate.growAggregate(initializers,
+                        initializers = intermediate.growAggregate(initializers, 
                             parseContext.declareVariable(idToken.loc, *fullName, variableType, expressionNode),
                             idToken.loc);
                     }
@@ -495,38 +495,37 @@
             }
         }
 
-        if (acceptTokenClass(EHTokComma)) {
+        // COMMA
+        if (acceptTokenClass(EHTokComma))
             declarator_list = true;
-            continue;
-        }
-    };
+    }
 
     // The top-level initializer node is a sequence.
     if (initializers != nullptr)
         initializers->setOperator(EOpSequence);
 
-    // Add the initializers' aggregate to the nodeList we were handed.
-    if (nodeList)
-        nodeList = intermediate.growAggregate(nodeList, initializers);
-    else
-        nodeList = initializers;
+    // if we have a locally scoped static, it needs a globally scoped initializer
+    if (declaredType.getQualifier().storage == EvqGlobal && !parseContext.symbolTable.atGlobalLevel()) {
+        unitNode = intermediate.growAggregate(unitNode, initializers, idToken.loc);
+    } else {
+        // Add the initializers' aggregate to the nodeList we were handed.
+        if (nodeList)
+            nodeList = intermediate.growAggregate(nodeList, initializers);
+        else
+            nodeList = initializers;
+    }
 
-    // SEMICOLON(optional for cbuffer/tbuffer)
+    // SEMICOLON
     if (! acceptTokenClass(EHTokSemicolon)) {
-        if (peek() == EHTokAssign || peek() == EHTokLeftBracket || peek() == EHTokDot || peek() == EHTokComma) {
-            // This may have been a false detection of what appeared to be a declaration, but
-            // was actually an assignment such as "float = 4", where "float" is an identifier.
-            // We put the token back to let further parsing happen for cases where that may
-            // happen.  This errors on the side of caution, and mostly triggers the error.
+        // This may have been a false detection of what appeared to be a declaration, but
+        // was actually an assignment such as "float = 4", where "float" is an identifier.
+        // We put the token back to let further parsing happen for cases where that may
+        // happen.  This errors on the side of caution, and mostly triggers the error.
+        if (peek() == EHTokAssign || peek() == EHTokLeftBracket || peek() == EHTokDot || peek() == EHTokComma)
             recedeToken();
-            return false;
-        } else if (declaredType.getBasicType() == EbtBlock) {
-            // cbuffer, et. al. (but not struct) don't have an ending semicolon
-            return true;
-        } else {
+        else
             expected(";");
-            return false;
-        }
+        return false;
     }
 
     return true;
@@ -538,12 +537,16 @@
 bool HlslGrammar::acceptControlDeclaration(TIntermNode*& node)
 {
     node = nullptr;
+    TAttributes attributes;
 
     // fully_specified_type
     TType type;
-    if (! acceptFullySpecifiedType(type))
+    if (! acceptFullySpecifiedType(type, attributes))
         return false;
 
+    if (attributes.size() > 0)
+        parseContext.warn(token.loc, "attributes don't apply to control declaration", "", "");
+
     // filter out type casts
     if (peekTokenClass(EHTokLeftParen)) {
         recedeToken();
@@ -579,12 +582,12 @@
 //      : type_specifier
 //      | type_qualifier type_specifier
 //
-bool HlslGrammar::acceptFullySpecifiedType(TType& type)
+bool HlslGrammar::acceptFullySpecifiedType(TType& type, const TAttributes& attributes)
 {
     TIntermNode* nodeList = nullptr;
-    return acceptFullySpecifiedType(type, nodeList);
+    return acceptFullySpecifiedType(type, nodeList, attributes);
 }
-bool HlslGrammar::acceptFullySpecifiedType(TType& type, TIntermNode*& nodeList)
+bool HlslGrammar::acceptFullySpecifiedType(TType& type, TIntermNode*& nodeList, const TAttributes& attributes, bool forbidDeclarators)
 {
     // type_qualifier
     TQualifier qualifier;
@@ -603,11 +606,18 @@
 
         return false;
     }
+
     if (type.getBasicType() == EbtBlock) {
         // the type was a block, which set some parts of the qualifier
         parseContext.mergeQualifiers(type.getQualifier(), qualifier);
+    
+        // merge in the attributes
+        parseContext.transferTypeAttributes(token.loc, attributes, type);
+
         // further, it can create an anonymous instance of the block
-        if (peek() != EHTokIdentifier)
+        // (cbuffer and tbuffer don't consume the next identifier, and
+        // should set forbidDeclarators)
+        if (forbidDeclarators || peek() != EHTokIdentifier)
             parseContext.declareBlock(loc, type);
     } else {
         // Some qualifiers are set when parsing the type.  Merge those with
@@ -623,10 +633,10 @@
             qualifier.readonly     = type.getQualifier().readonly;
         }
 
-        if (type.getQualifier().builtIn != EbvNone)
+        if (type.isBuiltIn())
             qualifier.builtIn = type.getQualifier().builtIn;
 
-        type.getQualifier()    = qualifier;
+        type.getQualifier() = qualifier;
     }
 
     return true;
@@ -642,7 +652,7 @@
     do {
         switch (peek()) {
         case EHTokStatic:
-            qualifier.storage = parseContext.symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
+            qualifier.storage = EvqGlobal;
             break;
         case EHTokExtern:
             // TODO: no meaning in glslang?
@@ -687,10 +697,10 @@
             qualifier.noContraction = true;
             break;
         case EHTokIn:
-            qualifier.storage = EvqIn;
+            qualifier.storage = (qualifier.storage == EvqOut) ? EvqInOut : EvqIn;
             break;
         case EHTokOut:
-            qualifier.storage = EvqOut;
+            qualifier.storage = (qualifier.storage == EvqIn) ? EvqInOut : EvqOut;
             break;
         case EHTokInOut:
             qualifier.storage = EvqInOut;
@@ -1018,7 +1028,7 @@
 
     TArraySizes* arraySizes = new TArraySizes;
     arraySizes->addInnerSize(size->getAsConstantUnion()->getConstArray()[0].getIConst());
-    type.newArraySizes(*arraySizes);
+    type.transferArraySizes(arraySizes);
     type.getQualifier().builtIn = patchType;
 
     if (! acceptTokenClass(EHTokRightAngle)) {
@@ -1090,6 +1100,69 @@
     return true;
 }
 
+// subpass input type
+//      : SUBPASSINPUT
+//      | SUBPASSINPUT VECTOR LEFT_ANGLE template_type RIGHT_ANGLE
+//      | SUBPASSINPUTMS
+//      | SUBPASSINPUTMS VECTOR LEFT_ANGLE template_type RIGHT_ANGLE
+bool HlslGrammar::acceptSubpassInputType(TType& type)
+{
+    // read subpass type
+    const EHlslTokenClass subpassInputType = peek();
+
+    bool multisample;
+
+    switch (subpassInputType) {
+    case EHTokSubpassInput:   multisample = false; break;
+    case EHTokSubpassInputMS: multisample = true;  break;
+    default:
+        return false;  // not a subpass input declaration
+    }
+
+    advanceToken();  // consume the sampler type keyword
+
+    TType subpassType(EbtFloat, EvqUniform, 4); // default type is float4
+
+    if (acceptTokenClass(EHTokLeftAngle)) {
+        if (! acceptType(subpassType)) {
+            expected("scalar or vector type");
+            return false;
+        }
+
+        const TBasicType basicRetType = subpassType.getBasicType() ;
+
+        switch (basicRetType) {
+        case EbtFloat:
+        case EbtUint:
+        case EbtInt:
+        case EbtStruct:
+            break;
+        default:
+            unimplemented("basic type in subpass input");
+            return false;
+        }
+
+        if (! acceptTokenClass(EHTokRightAngle)) {
+            expected("right angle bracket");
+            return false;
+        }
+    }
+
+    const TBasicType subpassBasicType = subpassType.isStruct() ? (*subpassType.getStruct())[0].type->getBasicType()
+        : subpassType.getBasicType();
+
+    TSampler sampler;
+    sampler.setSubpass(subpassBasicType, multisample);
+
+    // Remember the declared return type.  Function returns false on error.
+    if (!parseContext.setTextureReturnType(sampler, subpassType, token.loc))
+        return false;
+
+    type.shallowCopy(TType(sampler, EvqUniform));
+
+    return true;
+}
+
 // sampler_type
 //      : SAMPLER
 //      | SAMPLER1D
@@ -1196,7 +1269,13 @@
 
         const TBasicType basicRetType = txType.getBasicType() ;
 
-        if (basicRetType != EbtFloat && basicRetType != EbtUint && basicRetType != EbtInt) {
+        switch (basicRetType) {
+        case EbtFloat:
+        case EbtUint:
+        case EbtInt:
+        case EbtStruct:
+            break;
+        default:
             unimplemented("basic type in texture");
             return false;
         }
@@ -1213,8 +1292,8 @@
             return false;
         }
 
-        if (!txType.isScalar() && !txType.isVector()) {
-            expected("scalar or vector type");
+        if (!txType.isScalar() && !txType.isVector() && !txType.isStruct()) {
+            expected("scalar, vector, or struct type");
             return false;
         }
 
@@ -1251,20 +1330,24 @@
     if (image || dim == EsdBuffer)
         format = parseContext.getLayoutFromTxType(token.loc, txType);
 
+    const TBasicType txBasicType = txType.isStruct() ? (*txType.getStruct())[0].type->getBasicType()
+        : txType.getBasicType();
+
     // Non-image Buffers are combined
     if (dim == EsdBuffer && !image) {
         sampler.set(txType.getBasicType(), dim, array);
     } else {
         // DX10 textures are separated.  TODO: DX9.
         if (image) {
-            sampler.setImage(txType.getBasicType(), dim, array, shadow, ms);
+            sampler.setImage(txBasicType, dim, array, shadow, ms);
         } else {
-            sampler.setTexture(txType.getBasicType(), dim, array, shadow, ms);
+            sampler.setTexture(txBasicType, dim, array, shadow, ms);
         }
     }
 
-    // Remember the declared vector size.
-    sampler.vectorSize = txType.getVectorSize();
+    // Remember the declared return type.  Function returns false on error.
+    if (!parseContext.setTextureReturnType(sampler, txType, token.loc))
+        return false;
 
     // Force uncombined, if necessary
     if (!combined)
@@ -1286,14 +1369,44 @@
 }
 bool HlslGrammar::acceptType(TType& type, TIntermNode*& nodeList)
 {
-    // Basic types for min* types, broken out here in case of future
-    // changes, e.g, to use native halfs.
-    static const TBasicType min16float_bt = EbtFloat;
-    static const TBasicType min10float_bt = EbtFloat;
-    static const TBasicType half_bt       = EbtFloat;
-    static const TBasicType min16int_bt   = EbtInt;
-    static const TBasicType min12int_bt   = EbtInt;
-    static const TBasicType min16uint_bt  = EbtUint;
+    // Basic types for min* types, use native halfs if the option allows them.
+    bool enable16BitTypes = parseContext.hlslEnable16BitTypes();
+
+    const TBasicType min16float_bt = enable16BitTypes ? EbtFloat16 : EbtFloat;
+    const TBasicType min10float_bt = enable16BitTypes ? EbtFloat16 : EbtFloat;
+    const TBasicType half_bt       = enable16BitTypes ? EbtFloat16 : EbtFloat;
+    const TBasicType min16int_bt   = enable16BitTypes ? EbtInt16   : EbtInt;
+    const TBasicType min12int_bt   = enable16BitTypes ? EbtInt16   : EbtInt;
+    const TBasicType min16uint_bt  = enable16BitTypes ? EbtUint16  : EbtUint;
+
+    // Some types might have turned into identifiers. Take the hit for checking
+    // when this has happened.
+    if (typeIdentifiers) {
+        const char* identifierString = getTypeString(peek());
+        if (identifierString != nullptr) {
+            TString name = identifierString;
+            // if it's an identifier, it's not a type
+            if (parseContext.symbolTable.find(name) != nullptr)
+                return false;
+        }
+    }
+
+    bool isUnorm = false;
+    bool isSnorm = false;
+
+    // Accept snorm and unorm.  Presently, this is ignored, save for an error check below.
+    switch (peek()) {
+    case EHTokUnorm:
+        isUnorm = true;
+        advanceToken();  // eat the token
+        break;
+    case EHTokSNorm:
+        isSnorm = true;
+        advanceToken();  // eat the token
+        break;
+    default:
+        break;
+    }
 
     switch (peek()) {
     case EHTokVector:
@@ -1337,6 +1450,11 @@
         return acceptSamplerType(type);
         break;
 
+    case EHTokSubpassInput:           // fall through
+    case EHTokSubpassInputMS:         // ...
+        return acceptSubpassInputType(type);
+        break;
+
     case EHTokBuffer:                 // fall through
     case EHTokTexture1d:              // ...
     case EHTokTexture1darray:         // ...
@@ -1365,6 +1483,10 @@
         return acceptStructBufferType(type);
         break;
 
+    case EHTokTextureBuffer:
+        return acceptTextureBufferType(type);
+        break;
+
     case EHTokConstantBuffer:
         return acceptConstantBufferType(type);
 
@@ -1461,6 +1583,10 @@
         new(&type) TType(EbtUint, EvqTemporary, 4);
         break;
 
+    case EHTokUint64:
+        new(&type) TType(EbtUint64);
+        break;
+
     case EHTokBool:
         new(&type) TType(EbtBool);
         break;
@@ -1479,20 +1605,20 @@
         break;
 
     case EHTokHalf:
-        new(&type) TType(half_bt, EvqTemporary, EpqMedium);
+        new(&type) TType(half_bt, EvqTemporary);
         break;
     case EHTokHalf1:
-        new(&type) TType(half_bt, EvqTemporary, EpqMedium);
+        new(&type) TType(half_bt, EvqTemporary);
         type.makeVector();
         break;
     case EHTokHalf2:
-        new(&type) TType(half_bt, EvqTemporary, EpqMedium, 2);
+        new(&type) TType(half_bt, EvqTemporary, 2);
         break;
     case EHTokHalf3:
-        new(&type) TType(half_bt, EvqTemporary, EpqMedium, 3);
+        new(&type) TType(half_bt, EvqTemporary, 3);
         break;
     case EHTokHalf4:
-        new(&type) TType(half_bt, EvqTemporary, EpqMedium, 4);
+        new(&type) TType(half_bt, EvqTemporary, 4);
         break;
 
     case EHTokMin16float:
@@ -1776,6 +1902,55 @@
         new(&type) TType(EbtFloat, EvqTemporary, 0, 4, 4);
         break;
 
+    case EHTokHalf1x1:
+        new(&type) TType(half_bt, EvqTemporary, 0, 1, 1);
+        break;
+    case EHTokHalf1x2:
+        new(&type) TType(half_bt, EvqTemporary, 0, 1, 2);
+        break;
+    case EHTokHalf1x3:
+        new(&type) TType(half_bt, EvqTemporary, 0, 1, 3);
+        break;
+    case EHTokHalf1x4:
+        new(&type) TType(half_bt, EvqTemporary, 0, 1, 4);
+        break;
+    case EHTokHalf2x1:
+        new(&type) TType(half_bt, EvqTemporary, 0, 2, 1);
+        break;
+    case EHTokHalf2x2:
+        new(&type) TType(half_bt, EvqTemporary, 0, 2, 2);
+        break;
+    case EHTokHalf2x3:
+        new(&type) TType(half_bt, EvqTemporary, 0, 2, 3);
+        break;
+    case EHTokHalf2x4:
+        new(&type) TType(half_bt, EvqTemporary, 0, 2, 4);
+        break;
+    case EHTokHalf3x1:
+        new(&type) TType(half_bt, EvqTemporary, 0, 3, 1);
+        break;
+    case EHTokHalf3x2:
+        new(&type) TType(half_bt, EvqTemporary, 0, 3, 2);
+        break;
+    case EHTokHalf3x3:
+        new(&type) TType(half_bt, EvqTemporary, 0, 3, 3);
+        break;
+    case EHTokHalf3x4:
+        new(&type) TType(half_bt, EvqTemporary, 0, 3, 4);
+        break;
+    case EHTokHalf4x1:
+        new(&type) TType(half_bt, EvqTemporary, 0, 4, 1);
+        break;
+    case EHTokHalf4x2:
+        new(&type) TType(half_bt, EvqTemporary, 0, 4, 2);
+        break;
+    case EHTokHalf4x3:
+        new(&type) TType(half_bt, EvqTemporary, 0, 4, 3);
+        break;
+    case EHTokHalf4x4:
+        new(&type) TType(half_bt, EvqTemporary, 0, 4, 4);
+        break;
+
     case EHTokDouble1x1:
         new(&type) TType(EbtDouble, EvqTemporary, 0, 1, 1);
         break;
@@ -1831,6 +2006,11 @@
 
     advanceToken();
 
+    if ((isUnorm || isSnorm) && !type.isFloatingDomain()) {
+        parseContext.error(token.loc, "unorm and snorm only valid in floating point domain", "", "");
+        return false;
+    }
+
     return true;
 }
 
@@ -1852,23 +2032,32 @@
     TStorageQualifier storageQualifier = EvqTemporary;
     bool readonly = false;
 
-    // CBUFFER
     if (acceptTokenClass(EHTokCBuffer)) {
+        // CBUFFER
         storageQualifier = EvqUniform;
-    // TBUFFER
     } else if (acceptTokenClass(EHTokTBuffer)) {
+        // TBUFFER
         storageQualifier = EvqBuffer;
         readonly = true;
-    }
-    // CLASS
-    // STRUCT
-    else if (! acceptTokenClass(EHTokClass) && ! acceptTokenClass(EHTokStruct))
+    } else if (! acceptTokenClass(EHTokClass) && ! acceptTokenClass(EHTokStruct)) {
+        // Neither CLASS nor STRUCT
         return false;
+    }
 
-    // IDENTIFIER
+    // Now known to be one of CBUFFER, TBUFFER, CLASS, or STRUCT
+
+
+    // IDENTIFIER.  It might also be a keyword which can double as an identifier.
+    // For example:  'cbuffer ConstantBuffer' or 'struct ConstantBuffer' is legal.
+    // 'cbuffer int' is also legal, and 'struct int' appears rejected only because
+    // it attempts to redefine the 'int' type.
+    const char* idString = getTypeString(peek());
     TString structName = "";
-    if (peekTokenClass(EHTokIdentifier)) {
-        structName = *token.string;
+    if (peekTokenClass(EHTokIdentifier) || idString != nullptr) {
+        if (idString != nullptr)
+            structName = *idString;
+        else
+            structName = *token.string;
         advanceToken();
     }
 
@@ -1933,7 +2122,7 @@
     // All member functions get parsed inside the class/struct namespace and with the
     // class/struct members in a symbol-table level.
     parseContext.pushNamespace(structName);
-    parseContext.pushThisScope(type);
+    parseContext.pushThisScope(type, functionDeclarators);
     bool deferredSuccess = true;
     for (int b = 0; b < (int)functionDeclarators.size() && deferredSuccess; ++b) {
         // parse body
@@ -1989,6 +2178,43 @@
     }
 }
 
+// texture_buffer
+//    : TEXTUREBUFFER LEFT_ANGLE type RIGHT_ANGLE
+bool HlslGrammar::acceptTextureBufferType(TType& type)
+{
+    if (! acceptTokenClass(EHTokTextureBuffer))
+        return false;
+
+    if (! acceptTokenClass(EHTokLeftAngle)) {
+        expected("left angle bracket");
+        return false;
+    }
+    
+    TType templateType;
+    if (! acceptType(templateType)) {
+        expected("type");
+        return false;
+    }
+
+    if (! acceptTokenClass(EHTokRightAngle)) {
+        expected("right angle bracket");
+        return false;
+    }
+
+    templateType.getQualifier().storage = EvqBuffer;
+    templateType.getQualifier().readonly = true;
+
+    TType blockType(templateType.getWritableStruct(), "", templateType.getQualifier());
+
+    blockType.getQualifier().storage = EvqBuffer;
+    blockType.getQualifier().readonly = true;
+
+    type.shallowCopy(blockType);
+
+    return true;
+}
+
+
 // struct_buffer
 //    : APPENDSTRUCTUREDBUFFER
 //    | BYTEADDRESSBUFFER
@@ -2061,9 +2287,9 @@
 
     // Create an unsized array out of that type.
     // TODO: does this work if it's already an array type?
-    TArraySizes unsizedArray;
-    unsizedArray.addInnerSize(UnsizedArraySize);
-    templateType->newArraySizes(unsizedArray);
+    TArraySizes* unsizedArray = new TArraySizes;
+    unsizedArray->addInnerSize(UnsizedArraySize);
+    templateType->transferArraySizes(unsizedArray);
     templateType->getQualifier().storage = storage;
 
     // field name is canonical for all structbuffers
@@ -2093,8 +2319,8 @@
 //      : struct_declaration SEMI_COLON struct_declaration SEMI_COLON ...
 //
 // struct_declaration
-//      : fully_specified_type struct_declarator COMMA struct_declarator ...
-//      | fully_specified_type IDENTIFIER function_parameters post_decls compound_statement // member-function definition
+//      : attributes fully_specified_type struct_declarator COMMA struct_declarator ...
+//      | attributes fully_specified_type IDENTIFIER function_parameters post_decls compound_statement // member-function definition
 //
 // struct_declarator
 //      : IDENTIFIER post_decls
@@ -2113,15 +2339,22 @@
             break;
 
         // struct_declaration
-    
+
+        // attributes
+        TAttributes attributes;
+        acceptAttributes(attributes);
+
         bool declarator_list = false;
 
         // fully_specified_type
         TType memberType;
-        if (! acceptFullySpecifiedType(memberType, nodeList)) {
+        if (! acceptFullySpecifiedType(memberType, nodeList, attributes)) {
             expected("member type");
             return false;
         }
+        
+        // merge in the attributes
+        parseContext.transferTypeAttributes(token.loc, attributes, memberType);
 
         // struct_declarator COMMA struct_declarator ...
         bool functionDefinitionAccepted = false;
@@ -2154,7 +2387,7 @@
                 TArraySizes* arraySizes = nullptr;
                 acceptArraySpecifier(arraySizes);
                 if (arraySizes)
-                    typeList->back().type->newArraySizes(*arraySizes);
+                    typeList->back().type->transferArraySizes(arraySizes);
 
                 acceptPostDecls(member.type->getQualifier());
 
@@ -2198,12 +2431,12 @@
 //
 // Expects type to have EvqGlobal for a static member and
 // EvqTemporary for non-static member.
-bool HlslGrammar::acceptMemberFunctionDefinition(TIntermNode*& nodeList, const TType& type, const TString& memberName,
+bool HlslGrammar::acceptMemberFunctionDefinition(TIntermNode*& nodeList, const TType& type, TString& memberName,
                                                  TFunctionDeclarator& declarator)
 {
     bool accepted = false;
 
-    const TString* functionName = &memberName;
+    TString* functionName = &memberName;
     parseContext.getFullNamespaceName(functionName);
     declarator.function = new TFunction(functionName, type);
     if (type.getQualifier().storage == EvqTemporary)
@@ -2288,6 +2521,9 @@
         node = parseContext.handleFunctionCall(token.loc, constructor, node);
     }
 
+    if (node == nullptr)
+        return false;
+
     // If this is simply a constant, we can use it directly.
     if (node->getAsConstantUnion())
         return true;
@@ -2306,16 +2542,26 @@
 }
 
 // parameter_declaration
+//      : attributes attributed_declaration
+//
+// attributed_declaration
 //      : fully_specified_type post_decls [ = default_parameter_declaration ]
 //      | fully_specified_type identifier array_specifier post_decls [ = default_parameter_declaration ]
 //
 bool HlslGrammar::acceptParameterDeclaration(TFunction& function)
 {
+    // attributes
+    TAttributes attributes;
+    acceptAttributes(attributes);
+
     // fully_specified_type
     TType* type = new TType;
-    if (! acceptFullySpecifiedType(*type))
+    if (! acceptFullySpecifiedType(*type, attributes))
         return false;
 
+    // merge in the attributes
+    parseContext.transferTypeAttributes(token.loc, attributes, *type);
+
     // identifier
     HlslToken idToken;
     acceptIdentifier(idToken);
@@ -2324,12 +2570,12 @@
     TArraySizes* arraySizes = nullptr;
     acceptArraySpecifier(arraySizes);
     if (arraySizes) {
-        if (arraySizes->isImplicit()) {
-            parseContext.error(token.loc, "function parameter array cannot be implicitly sized", "", "");
+        if (arraySizes->hasUnsized()) {
+            parseContext.error(token.loc, "function parameter requires array size", "[]", "");
             return false;
         }
 
-        type->newArraySizes(*arraySizes);
+        type->transferArraySizes(arraySizes);
     }
 
     // post_decls
@@ -2405,6 +2651,8 @@
 //
 bool HlslGrammar::acceptParenExpression(TIntermTyped*& expression)
 {
+    expression = nullptr;
+
     // LEFT_PAREN
     if (! acceptTokenClass(EHTokLeftParen))
         expected("(");
@@ -2498,8 +2746,19 @@
             expected("assignment expression in initializer list");
             return false;
         }
+
+        const bool firstNode = (node == nullptr);
+
         node = intermediate.growAggregate(node, expr, loc);
 
+        // If every sub-node in the list has qualifier EvqConst, the returned node becomes
+        // EvqConst.  Otherwise, it becomes EvqTemporary. That doesn't happen with e.g.
+        // EvqIn or EvqPosition, since the collection isn't EvqPosition if all the members are.
+        if (firstNode && expr->getQualifier().storage == EvqConst)
+            node->getQualifier().storage = EvqConst;
+        else if (expr->getQualifier().storage != EvqConst)
+            node->getQualifier().storage = EvqTemporary;
+
         // COMMA
         if (acceptTokenClass(EHTokComma)) {
             if (acceptTokenClass(EHTokRightBrace))  // allow trailing comma
@@ -2594,6 +2853,8 @@
     if (node == nullptr)
         return false;
 
+    ++parseContext.controlFlowNestingLevel;  // this only needs to work right if no errors
+
     TIntermTyped* trueNode = nullptr;
     if (! acceptExpression(trueNode)) {
         expected("expression after ?");
@@ -2612,6 +2873,8 @@
         return false;
     }
 
+    --parseContext.controlFlowNestingLevel;
+
     node = intermediate.addSelection(node, trueNode, falseNode, loc);
 
     return true;
@@ -2679,9 +2942,14 @@
     if (acceptTokenClass(EHTokLeftParen)) {
         TType castType;
         if (acceptType(castType)) {
+            // recognize any array_specifier as part of the type
+            TArraySizes* arraySizes = nullptr;
+            acceptArraySpecifier(arraySizes);
+            if (arraySizes != nullptr)
+                castType.transferArraySizes(arraySizes);
+            TSourceLoc loc = token.loc;
             if (acceptTokenClass(EHTokRightParen)) {
                 // We've matched "(type)" now, get the expression to cast
-                TSourceLoc loc = token.loc;
                 if (! acceptUnaryExpression(node))
                     return false;
 
@@ -2695,12 +2963,17 @@
                 parseContext.handleFunctionArgument(constructorFunction, arguments, node);
                 node = parseContext.handleFunctionCall(loc, constructorFunction, arguments);
 
-                return true;
+                return node != nullptr;
             } else {
                 // This could be a parenthesized constructor, ala (int(3)), and we just accepted
                 // the '(int' part.  We must back up twice.
                 recedeToken();
                 recedeToken();
+
+                // Note, there are no array constructors like
+                //   (float[2](...))
+                if (arraySizes != nullptr)
+                    parseContext.error(loc, "parenthesized array constructor not allowed", "([]())", "", "");
             }
         } else {
             // This isn't a type cast, but it still started "(", so if it is a
@@ -2790,6 +3063,8 @@
         }
         if (! peekTokenClass(EHTokLeftParen)) {
             node = parseContext.handleVariable(idToken.loc, fullName);
+            if (node == nullptr)
+                return false;
         } else if (acceptFunctionCall(idToken.loc, *fullName, node, nullptr)) {
             // function_call (nothing else to do yet)
         } else {
@@ -2801,23 +3076,6 @@
         return false;
     }
 
-    // This is to guarantee we do this no matter how we get out of the stack frame.
-    // This way there's no bug if an early return forgets to do it.
-    struct tFinalize {
-        tFinalize(HlslParseContext& p) : parseContext(p) { }
-        ~tFinalize() { parseContext.finalizeFlattening(); }
-        HlslParseContext& parseContext;
-    private:
-        const tFinalize& operator=(const tFinalize&) { return *this; }
-        tFinalize(const tFinalize& f) : parseContext(f.parseContext) { }
-    } finalize(parseContext);
-
-    // Initialize the flattening accumulation data, so we can track data across multiple bracket or
-    // dot operators.  This can also be nested, e.g, for [], so we have to track each nesting
-    // level: hence the init and finalize.  Even though in practice these must be
-    // constants, they are parsed no matter what.
-    parseContext.initFlattening();
-
     // Something was found, chain as many postfix operations as exist.
     do {
         TSourceLoc loc = token.loc;
@@ -2917,7 +3175,7 @@
         // hook it up
         node = parseContext.handleFunctionCall(arguments->getLoc(), constructorFunction, arguments);
 
-        return true;
+        return node != nullptr;
     }
 
     return false;
@@ -2965,7 +3223,7 @@
     // call
     node = parseContext.handleFunctionCall(loc, function, arguments);
 
-    return true;
+    return node != nullptr;
 }
 
 // arguments
@@ -3017,6 +3275,9 @@
     case EHTokUintConstant:
         node = intermediate.addConstantUnion(token.u, token.loc, true);
         break;
+    case EHTokFloat16Constant:
+        node = intermediate.addConstantUnion(token.d, EbtFloat16, token.loc, true);
+        break;
     case EHTokFloatConstant:
         node = intermediate.addConstantUnion(token.d, EbtFloat, token.loc, true);
         break;
@@ -3039,6 +3300,37 @@
     return true;
 }
 
+// simple_statement
+//      : SEMICOLON
+//      | declaration_statement
+//      | expression SEMICOLON
+//
+bool HlslGrammar::acceptSimpleStatement(TIntermNode*& statement)
+{
+    // SEMICOLON
+    if (acceptTokenClass(EHTokSemicolon))
+        return true;
+
+    // declaration
+    if (acceptDeclaration(statement))
+        return true;
+
+    // expression
+    TIntermTyped* node;
+    if (acceptExpression(node))
+        statement = node;
+    else
+        return false;
+
+    // SEMICOLON (following an expression)
+    if (acceptTokenClass(EHTokSemicolon))
+        return true;
+    else {
+        expected(";");
+        return false;
+    }
+}
+
 // compound_statement
 //      : LEFT_CURLY statement statement ... RIGHT_CURLY
 //
@@ -3096,12 +3388,11 @@
 //
 // attributed_statement
 //      : compound_statement
-//      | SEMICOLON
-//      | expression SEMICOLON
-//      | declaration_statement
+//      | simple_statement
 //      | selection_statement
 //      | switch_statement
 //      | case_label
+//      | default_label
 //      | iteration_statement
 //      | jump_statement
 //
@@ -3110,7 +3401,7 @@
     statement = nullptr;
 
     // attributes
-    TAttributeMap attributes;
+    TAttributes attributes;
     acceptAttributes(attributes);
 
     // attributed_statement
@@ -3119,10 +3410,10 @@
         return acceptScopedCompoundStatement(statement);
 
     case EHTokIf:
-        return acceptSelectionStatement(statement);
+        return acceptSelectionStatement(statement, attributes);
 
     case EHTokSwitch:
-        return acceptSwitchStatement(statement);
+        return acceptSwitchStatement(statement, attributes);
 
     case EHTokFor:
     case EHTokDo:
@@ -3140,40 +3431,28 @@
     case EHTokDefault:
         return acceptDefaultLabel(statement);
 
-    case EHTokSemicolon:
-        return acceptTokenClass(EHTokSemicolon);
-
     case EHTokRightBrace:
         // Performance: not strictly necessary, but stops a bunch of hunting early,
         // and is how sequences of statements end.
         return false;
 
     default:
-        {
-            // declaration
-            if (acceptDeclaration(statement))
-                return true;
-
-            // expression
-            TIntermTyped* node;
-            if (acceptExpression(node))
-                statement = node;
-            else
-                return false;
-
-            // SEMICOLON (following an expression)
-            if (! acceptTokenClass(EHTokSemicolon)) {
-                expected(";");
-                return false;
-            }
-        }
+        return acceptSimpleStatement(statement);
     }
 
     return true;
 }
 
 // attributes
-//      : list of zero or more of:  LEFT_BRACKET attribute RIGHT_BRACKET
+//      : [zero or more:] bracketed-attribute
+//
+// bracketed-attribute:
+//      : LEFT_BRACKET scoped-attribute RIGHT_BRACKET
+//      : LEFT_BRACKET LEFT_BRACKET scoped-attribute RIGHT_BRACKET RIGHT_BRACKET
+//
+// scoped-attribute:
+//      : attribute
+//      | namespace COLON COLON attribute
 //
 // attribute:
 //      : UNROLL
@@ -3194,24 +3473,39 @@
 //      | PATCHCONSTANTFUNC
 //      | NUMTHREADS LEFT_PAREN x_size, y_size,z z_size RIGHT_PAREN
 //
-void HlslGrammar::acceptAttributes(TAttributeMap& attributes)
+void HlslGrammar::acceptAttributes(TAttributes& attributes)
 {
     // For now, accept the [ XXX(X) ] syntax, but drop all but
     // numthreads, which is used to set the CS local size.
     // TODO: subset to correct set?  Pass on?
     do {
-        HlslToken idToken;
+        HlslToken attributeToken;
 
         // LEFT_BRACKET?
         if (! acceptTokenClass(EHTokLeftBracket))
             return;
+        // another LEFT_BRACKET?
+        bool doubleBrackets = false;
+        if (acceptTokenClass(EHTokLeftBracket))
+            doubleBrackets = true;
 
-        // attribute
-        if (acceptIdentifier(idToken)) {
-            // 'idToken.string' is the attribute
-        } else if (! peekTokenClass(EHTokRightBracket)) {
-            expected("identifier");
-            advanceToken();
+        // attribute? (could be namespace; will adjust later)
+        if (!acceptIdentifier(attributeToken)) {
+            if (!peekTokenClass(EHTokRightBracket)) {
+                expected("namespace or attribute identifier");
+                advanceToken();
+            }
+        }
+
+        TString nameSpace;
+        if (acceptTokenClass(EHTokColonColon)) {
+            // namespace COLON COLON
+            nameSpace = *attributeToken.string;
+            // attribute
+            if (!acceptIdentifier(attributeToken)) {
+                expected("attribute identifier");
+                return;
+            }
         }
 
         TIntermAggregate* expressions = nullptr;
@@ -3244,10 +3538,22 @@
             expected("]");
             return;
         }
+        // another RIGHT_BRACKET?
+        if (doubleBrackets && !acceptTokenClass(EHTokRightBracket)) {
+            expected("]]");
+            return;
+        }
 
-        // Add any values we found into the attribute map.  This accepts
-        // (and ignores) values not mapping to a known TAttributeType;
-        attributes.setAttribute(idToken.string, expressions);
+        // Add any values we found into the attribute map.
+        if (attributeToken.string != nullptr) {
+            TAttributeType attributeType = parseContext.attributeFromName(nameSpace, *attributeToken.string);
+            if (attributeType == EatNone)
+                parseContext.warn(attributeToken.loc, "unrecognized attribute", attributeToken.string->c_str(), "");
+            else {
+                TAttributeArgs attributeArgs = { attributeType, expressions };
+                attributes.push_back(attributeArgs);
+            }
+        }
     } while (true);
 }
 
@@ -3255,7 +3561,7 @@
 //      : IF LEFT_PAREN expression RIGHT_PAREN statement
 //      : IF LEFT_PAREN expression RIGHT_PAREN statement ELSE statement
 //
-bool HlslGrammar::acceptSelectionStatement(TIntermNode*& statement)
+bool HlslGrammar::acceptSelectionStatement(TIntermNode*& statement, const TAttributes& attributes)
 {
     TSourceLoc loc = token.loc;
 
@@ -3278,6 +3584,8 @@
     // create the child statements
     TIntermNodePair thenElse = { nullptr, nullptr };
 
+    ++parseContext.controlFlowNestingLevel;  // this only needs to work right if no errors
+
     // then statement
     if (! acceptScopedStatement(thenElse.node1)) {
         expected("then statement");
@@ -3295,7 +3603,10 @@
 
     // Put the pieces together
     statement = intermediate.addSelection(condition, thenElse, loc);
+    parseContext.handleSelectionAttributes(loc, statement->getAsSelectionNode(), attributes);
+
     parseContext.popScope();
+    --parseContext.controlFlowNestingLevel;
 
     return true;
 }
@@ -3303,10 +3614,11 @@
 // switch_statement
 //      : SWITCH LEFT_PAREN expression RIGHT_PAREN compound_statement
 //
-bool HlslGrammar::acceptSwitchStatement(TIntermNode*& statement)
+bool HlslGrammar::acceptSwitchStatement(TIntermNode*& statement, const TAttributes& attributes)
 {
     // SWITCH
     TSourceLoc loc = token.loc;
+
     if (! acceptTokenClass(EHTokSwitch))
         return false;
 
@@ -3320,9 +3632,14 @@
 
     // compound_statement
     parseContext.pushSwitchSequence(new TIntermSequence);
+
+    ++parseContext.controlFlowNestingLevel;
     bool statementOkay = acceptCompoundStatement(statement);
+    --parseContext.controlFlowNestingLevel;
+
     if (statementOkay)
-        statement = parseContext.addSwitch(loc, switchExpression, statement ? statement->getAsAggregate() : nullptr);
+        statement = parseContext.addSwitch(loc, switchExpression, statement ? statement->getAsAggregate() : nullptr,
+                                           attributes);
 
     parseContext.popSwitchSequence();
     parseContext.popScope();
@@ -3336,7 +3653,7 @@
 //      | FOR LEFT_PAREN for_init_statement for_rest_statement RIGHT_PAREN statement
 //
 // Non-speculative, only call if it needs to be found; WHILE or DO or FOR already seen.
-bool HlslGrammar::acceptIterationStatement(TIntermNode*& statement, const TAttributeMap& attributes)
+bool HlslGrammar::acceptIterationStatement(TIntermNode*& statement, const TAttributes& attributes)
 {
     TSourceLoc loc = token.loc;
     TIntermTyped* condition = nullptr;
@@ -3346,15 +3663,15 @@
 
     //  WHILE or DO or FOR
     advanceToken();
-    
-    const TLoopControl control = parseContext.handleLoopControl(attributes);
 
+    TIntermLoop* loopNode = nullptr;
     switch (loop) {
     case EHTokWhile:
         // so that something declared in the condition is scoped to the lifetime
         // of the while sub-statement
-        parseContext.pushScope();
+        parseContext.pushScope();  // this only needs to work right if no errors
         parseContext.nestLooping();
+        ++parseContext.controlFlowNestingLevel;
 
         // LEFT_PAREN condition RIGHT_PAREN
         if (! acceptParenExpression(condition))
@@ -3371,13 +3688,15 @@
 
         parseContext.unnestLooping();
         parseContext.popScope();
+        --parseContext.controlFlowNestingLevel;
 
-        statement = intermediate.addLoop(statement, condition, nullptr, true, loc, control);
-
-        return true;
+        loopNode = intermediate.addLoop(statement, condition, nullptr, true, loc);
+        statement = loopNode;
+        break;
 
     case EHTokDo:
-        parseContext.nestLooping();
+        parseContext.nestLooping();  // this only needs to work right if no errors
+        ++parseContext.controlFlowNestingLevel;
 
         // statement
         if (! acceptScopedStatement(statement)) {
@@ -3392,7 +3711,6 @@
         }
 
         // LEFT_PAREN condition RIGHT_PAREN
-        TIntermTyped* condition;
         if (! acceptParenExpression(condition))
             return false;
         condition = parseContext.convertConditionalExpression(loc, condition);
@@ -3403,10 +3721,11 @@
             expected(";");
 
         parseContext.unnestLooping();
+        --parseContext.controlFlowNestingLevel;
 
-        statement = intermediate.addLoop(statement, condition, 0, false, loc, control);
-
-        return true;
+        loopNode = intermediate.addLoop(statement, condition, 0, false, loc);
+        statement = loopNode;
+        break;
 
     case EHTokFor:
     {
@@ -3420,16 +3739,11 @@
 
         // initializer
         TIntermNode* initNode = nullptr;
-        if (! acceptControlDeclaration(initNode)) {
-            TIntermTyped* initExpr = nullptr;
-            acceptExpression(initExpr);
-            initNode = initExpr;
-        }
-        // SEMI_COLON
-        if (! acceptTokenClass(EHTokSemicolon))
-            expected(";");
+        if (! acceptSimpleStatement(initNode))
+            expected("for-loop initializer statement");
 
-        parseContext.nestLooping();
+        parseContext.nestLooping();  // this only needs to work right if no errors
+        ++parseContext.controlFlowNestingLevel;
 
         // condition SEMI_COLON
         acceptExpression(condition);
@@ -3453,17 +3767,21 @@
             return false;
         }
 
-        statement = intermediate.addForLoop(statement, initNode, condition, iterator, true, loc, control);
+        statement = intermediate.addForLoop(statement, initNode, condition, iterator, true, loc, loopNode);
 
         parseContext.popScope();
         parseContext.unnestLooping();
+        --parseContext.controlFlowNestingLevel;
 
-        return true;
+        break;
     }
 
     default:
         return false;
     }
+
+    parseContext.handleLoopAttributes(loc, loopNode, attributes);
+    return true;
 }
 
 // jump_statement
@@ -3491,9 +3809,17 @@
     switch (jump) {
     case EHTokContinue:
         statement = intermediate.addBranch(EOpContinue, token.loc);
+        if (parseContext.loopNestingLevel == 0) {
+            expected("loop");
+            return false;
+        }
         break;
     case EHTokBreak:
         statement = intermediate.addBranch(EOpBreak, token.loc);
+        if (parseContext.loopNestingLevel == 0 && parseContext.switchSequenceStack.size() == 0) {
+            expected("loop or switch");
+            return false;
+        }
         break;
     case EHTokDiscard:
         statement = intermediate.addBranch(EOpKill, token.loc);
@@ -3754,4 +4080,42 @@
     return true;
 }
 
+// Return a string for just the types that can also be declared as an identifier.
+const char* HlslGrammar::getTypeString(EHlslTokenClass tokenClass) const
+{
+    switch (tokenClass) {
+    case EHTokSample:     return "sample";
+    case EHTokHalf:       return "half";
+    case EHTokHalf1x1:    return "half1x1";
+    case EHTokHalf1x2:    return "half1x2";
+    case EHTokHalf1x3:    return "half1x3";
+    case EHTokHalf1x4:    return "half1x4";
+    case EHTokHalf2x1:    return "half2x1";
+    case EHTokHalf2x2:    return "half2x2";
+    case EHTokHalf2x3:    return "half2x3";
+    case EHTokHalf2x4:    return "half2x4";
+    case EHTokHalf3x1:    return "half3x1";
+    case EHTokHalf3x2:    return "half3x2";
+    case EHTokHalf3x3:    return "half3x3";
+    case EHTokHalf3x4:    return "half3x4";
+    case EHTokHalf4x1:    return "half4x1";
+    case EHTokHalf4x2:    return "half4x2";
+    case EHTokHalf4x3:    return "half4x3";
+    case EHTokHalf4x4:    return "half4x4";
+    case EHTokBool:       return "bool";
+    case EHTokFloat:      return "float";
+    case EHTokDouble:     return "double";
+    case EHTokInt:        return "int";
+    case EHTokUint:       return "uint";
+    case EHTokMin16float: return "min16float";
+    case EHTokMin10float: return "min10float";
+    case EHTokMin16int:   return "min16int";
+    case EHTokMin12int:   return "min12int";
+    case EHTokConstantBuffer: return "ConstantBuffer";
+    case EHTokLayout:     return "layout";
+    default:
+        return nullptr;
+    }
+}
+
 } // end namespace glslang
diff --git a/hlsl/hlslGrammar.h b/hlsl/hlslGrammar.h
old mode 100755
new mode 100644
index 07c8878..323f3b1
--- a/hlsl/hlslGrammar.h
+++ b/hlsl/hlslGrammar.h
@@ -43,7 +43,6 @@
 
 namespace glslang {
 
-    class TAttributeMap;
     class TFunctionDeclarator;
 
     // Should just be the grammar aspect of HLSL.
@@ -52,7 +51,8 @@
     class HlslGrammar : public HlslTokenStream {
     public:
         HlslGrammar(HlslScanContext& scanner, HlslParseContext& parseContext)
-            : HlslTokenStream(scanner), parseContext(parseContext), intermediate(parseContext.intermediate) { }
+            : HlslTokenStream(scanner), parseContext(parseContext), intermediate(parseContext.intermediate),
+              typeIdentifiers(false), unitNode(nullptr) { }
         virtual ~HlslGrammar() { }
 
         bool parse();
@@ -70,8 +70,8 @@
         bool acceptControlDeclaration(TIntermNode*& node);
         bool acceptSamplerDeclarationDX9(TType&);
         bool acceptSamplerState();
-        bool acceptFullySpecifiedType(TType&);
-        bool acceptFullySpecifiedType(TType&, TIntermNode*& nodeList);
+        bool acceptFullySpecifiedType(TType&, const TAttributes&);
+        bool acceptFullySpecifiedType(TType&, TIntermNode*& nodeList, const TAttributes&, bool forbidDeclarators = false);
         bool acceptQualifier(TQualifier&);
         bool acceptLayoutQualifierList(TQualifier&);
         bool acceptType(TType&);
@@ -86,11 +86,13 @@
         bool acceptAnnotations(TQualifier&);
         bool acceptSamplerType(TType&);
         bool acceptTextureType(TType&);
+        bool acceptSubpassInputType(TType&);
         bool acceptStructBufferType(TType&);
+        bool acceptTextureBufferType(TType&);
         bool acceptConstantBufferType(TType&);
         bool acceptStruct(TType&, TIntermNode*& nodeList);
         bool acceptStructDeclarationList(TTypeList*&, TIntermNode*& nodeList, TVector<TFunctionDeclarator>&);
-        bool acceptMemberFunctionDefinition(TIntermNode*& nodeList, const TType&, const TString& memberName,
+        bool acceptMemberFunctionDefinition(TIntermNode*& nodeList, const TType&, TString& memberName,
                                             TFunctionDeclarator&);
         bool acceptFunctionParameters(TFunction&);
         bool acceptParameterDeclaration(TFunction&);
@@ -108,15 +110,16 @@
         bool acceptFunctionCall(const TSourceLoc&, TString& name, TIntermTyped*&, TIntermTyped* objectBase);
         bool acceptArguments(TFunction*, TIntermTyped*&);
         bool acceptLiteral(TIntermTyped*&);
+        bool acceptSimpleStatement(TIntermNode*&);
         bool acceptCompoundStatement(TIntermNode*&);
-        bool acceptStatement(TIntermNode*&);
         bool acceptScopedStatement(TIntermNode*&);
         bool acceptScopedCompoundStatement(TIntermNode*&);
+        bool acceptStatement(TIntermNode*&);
         bool acceptNestedStatement(TIntermNode*&);
-        void acceptAttributes(TAttributeMap&);
-        bool acceptSelectionStatement(TIntermNode*&);
-        bool acceptSwitchStatement(TIntermNode*&);
-        bool acceptIterationStatement(TIntermNode*&, const TAttributeMap&);
+        void acceptAttributes(TAttributes&);
+        bool acceptSelectionStatement(TIntermNode*&, const TAttributes&);
+        bool acceptSwitchStatement(TIntermNode*&, const TAttributes&);
+        bool acceptIterationStatement(TIntermNode*&, const TAttributes&);
         bool acceptJumpStatement(TIntermNode*&);
         bool acceptCaseLabel(TIntermNode*&);
         bool acceptDefaultLabel(TIntermNode*&);
@@ -125,9 +128,12 @@
         bool acceptDefaultParameterDeclaration(const TType&, TIntermTyped*&);
 
         bool captureBlockTokens(TVector<HlslToken>& tokens);
+        const char* getTypeString(EHlslTokenClass tokenClass) const;
 
         HlslParseContext& parseContext;  // state of parsing and helper functions for building the intermediate
         TIntermediate& intermediate;     // the final product, the intermediate representation, includes the AST
+        bool typeIdentifiers;            // shader uses some types as identifiers
+        TIntermNode* unitNode;
     };
 
 } // end namespace glslang
diff --git a/hlsl/hlslOpMap.cpp b/hlsl/hlslOpMap.cpp
old mode 100755
new mode 100644
diff --git a/hlsl/hlslOpMap.h b/hlsl/hlslOpMap.h
old mode 100755
new mode 100644
diff --git a/hlsl/hlslParseHelper.cpp b/hlsl/hlslParseHelper.cpp
index 1ee0be8..b536cc9 100755
--- a/hlsl/hlslParseHelper.cpp
+++ b/hlsl/hlslParseHelper.cpp
@@ -1,6 +1,6 @@
 //
-// Copyright (C) 2016 Google, Inc.
-// Copyright (C) 2016 LunarG, Inc.
+// Copyright (C) 2017 Google, Inc.
+// Copyright (C) 2017 LunarG, Inc.
 //
 // All rights reserved.
 //
@@ -53,22 +53,22 @@
 namespace glslang {
 
 HlslParseContext::HlslParseContext(TSymbolTable& symbolTable, TIntermediate& interm, bool parsingBuiltins,
-                                   int version, EProfile profile, const SpvVersion& spvVersion, EShLanguage language, TInfoSink& infoSink,
+                                   int version, EProfile profile, const SpvVersion& spvVersion, EShLanguage language,
+                                   TInfoSink& infoSink,
                                    const TString sourceEntryPointName,
                                    bool forwardCompatible, EShMessages messages) :
-    TParseContextBase(symbolTable, interm, parsingBuiltins, version, profile, spvVersion, language, infoSink, forwardCompatible, messages),
-    contextPragma(true, false),
-    loopNestingLevel(0), annotationNestingLevel(0), structNestingLevel(0), controlFlowNestingLevel(0),
-    postEntryPointReturn(false),
-    limits(resources.limits),
+    TParseContextBase(symbolTable, interm, parsingBuiltins, version, profile, spvVersion, language, infoSink,
+                      forwardCompatible, messages, &sourceEntryPointName),
+    annotationNestingLevel(0),
     inputPatch(nullptr),
-    builtInIoIndex(nullptr),
-    builtInIoBase(nullptr),
     nextInLocation(0), nextOutLocation(0),
-    sourceEntryPointName(sourceEntryPointName),
     entryPointFunction(nullptr),
     entryPointFunctionBody(nullptr),
-    gsStreamOutput(nullptr)
+    gsStreamOutput(nullptr),
+    clipDistanceOutput(nullptr),
+    cullDistanceOutput(nullptr),
+    clipDistanceInput(nullptr),
+    cullDistanceInput(nullptr)
 {
     globalUniformDefaults.clear();
     globalUniformDefaults.layoutMatrix = ElmRowMajor;
@@ -81,6 +81,11 @@
     globalInputDefaults.clear();
     globalOutputDefaults.clear();
 
+    clipSemanticNSizeIn.fill(0);
+    cullSemanticNSizeIn.fill(0);
+    clipSemanticNSizeOut.fill(0);
+    cullSemanticNSizeOut.fill(0);
+
     // "Shaders in the transform
     // feedback capturing mode have an initial global default of
     //     layout(xfb_buffer = 0) out;"
@@ -92,9 +97,6 @@
 
     if (language == EShLangGeometry)
         globalOutputDefaults.layoutStream = 0;
-
-    if (spvVersion.spv == 0 || spvVersion.vulkan == 0)
-        infoSink.info << "ERROR: HLSL currently only supported when requesting SPIR-V for Vulkan.\n";
 }
 
 HlslParseContext::~HlslParseContext()
@@ -131,7 +133,8 @@
         // Print a message formated such that if you click on the message it will take you right to
         // the line through most UIs.
         const glslang::TSourceLoc& sourceLoc = input.getSourceLoc();
-        infoSink.info << sourceLoc.name << "(" << sourceLoc.line << "): error at column " << sourceLoc.column << ", HLSL parsing failed.\n";
+        infoSink.info << sourceLoc.name << "(" << sourceLoc.line << "): error at column " << sourceLoc.column
+                      << ", HLSL parsing failed.\n";
         ++numErrors;
         return false;
     }
@@ -147,7 +150,7 @@
 //
 bool HlslParseContext::shouldConvertLValue(const TIntermNode* node) const
 {
-    if (node == nullptr)
+    if (node == nullptr || node->getAsTyped() == nullptr)
         return false;
 
     const TIntermAggregate* lhsAsAggregate = node->getAsAggregate();
@@ -157,14 +160,14 @@
     if (lhsAsBinary != nullptr &&
         (lhsAsBinary->getOp() == EOpVectorSwizzle || lhsAsBinary->getOp() == EOpIndexDirect))
         lhsAsAggregate = lhsAsBinary->getLeft()->getAsAggregate();
-
     if (lhsAsAggregate != nullptr && lhsAsAggregate->getOp() == EOpImageLoad)
         return true;
 
     return false;
 }
 
-void HlslParseContext::growGlobalUniformBlock(const TSourceLoc& loc, TType& memberType, const TString& memberName, TTypeList* newTypeList)
+void HlslParseContext::growGlobalUniformBlock(const TSourceLoc& loc, TType& memberType, const TString& memberName,
+                                              TTypeList* newTypeList)
 {
     newTypeList = nullptr;
     correctUniform(memberType.getQualifier());
@@ -181,7 +184,14 @@
 //
 TLayoutFormat HlslParseContext::getLayoutFromTxType(const TSourceLoc& loc, const TType& txType)
 {
+    if (txType.isStruct()) {
+        // TODO: implement.
+        error(loc, "unimplemented: structure type in image or buffer", "", "");
+        return ElfNone;
+    }
+
     const int components = txType.getVectorSize();
+    const TBasicType txBasicType = txType.getBasicType();
 
     const auto selectFormat = [this,&components](TLayoutFormat v1, TLayoutFormat v2, TLayoutFormat v4) -> TLayoutFormat {
         if (intermediate.getNoStorageFormat())
@@ -191,7 +201,7 @@
                components == 2 ? v2 : v4;
     };
 
-    switch (txType.getBasicType()) {
+    switch (txBasicType) {
     case EbtFloat: return selectFormat(ElfR32f,  ElfRg32f,  ElfRgba32f);
     case EbtInt:   return selectFormat(ElfR32i,  ElfRg32i,  ElfRgba32i);
     case EbtUint:  return selectFormat(ElfR32ui, ElfRg32ui, ElfRgba32ui);
@@ -221,6 +231,13 @@
         }
     }
 
+    // We tolerate samplers as l-values, even though they are nominally
+    // illegal, because we expect a later optimization to eliminate them.
+    if (node->getType().getBasicType() == EbtSampler) {
+        intermediate.setNeedsLegalization();
+        return false;
+    }
+
     // Let the base class check errors
     return TParseContextBase::lValueErrorCheck(loc, op, node);
 }
@@ -233,7 +250,7 @@
 //
 // Most things are passed through unmodified, except for error checking.
 //
-TIntermTyped* HlslParseContext::handleLvalue(const TSourceLoc& loc, const char* op, TIntermTyped* node)
+TIntermTyped* HlslParseContext::handleLvalue(const TSourceLoc& loc, const char* op, TIntermTyped*& node)
 {
     if (node == nullptr)
         return nullptr;
@@ -358,7 +375,8 @@
 
     const TSampler& texSampler = object->getType().getSampler();
 
-    const TType objDerefType(texSampler.type, EvqTemporary, texSampler.vectorSize);
+    TType objDerefType;
+    getTextureReturnType(texSampler, objDerefType);
 
     if (nodeAsBinary) {
         TIntermTyped* rhs = nodeAsBinary->getRight();
@@ -385,12 +403,13 @@
             // fall through...
         case EOpAssign:
             {
-                // Since this is an lvalue, we'll convert an image load to a sequence like this (to still provide the value):
+                // Since this is an lvalue, we'll convert an image load to a sequence like this
+                // (to still provide the value):
                 //   OpSequence
                 //      OpImageStore(object, lhs, rhs)
                 //      rhs
-                // But if it's not a simple symbol RHS (say, a fn call), we don't want to duplicate the RHS, so we'll convert
-                // instead to this:
+                // But if it's not a simple symbol RHS (say, a fn call), we don't want to duplicate the RHS,
+                // so we'll convert instead to this:
                 //   OpSequence
                 //      rhsTmp = rhs
                 //      OpImageStore(object, coord, rhsTmp)
@@ -507,6 +526,35 @@
 
     if (tokens.size() == 0)
         return;
+
+    // These pragmas are case insensitive in HLSL, so we'll compare in lower case.
+    TVector<TString> lowerTokens = tokens;
+
+    for (auto it = lowerTokens.begin(); it != lowerTokens.end(); ++it)
+        std::transform(it->begin(), it->end(), it->begin(), ::tolower);
+
+    // Handle pack_matrix
+    if (tokens.size() == 4 && lowerTokens[0] == "pack_matrix" && tokens[1] == "(" && tokens[3] == ")") {
+        // Note that HLSL semantic order is Mrc, not Mcr like SPIR-V, so we reverse the sense.
+        // Row major becomes column major and vice versa.
+
+        if (lowerTokens[2] == "row_major") {
+            globalUniformDefaults.layoutMatrix = globalBufferDefaults.layoutMatrix = ElmColumnMajor;
+        } else if (lowerTokens[2] == "column_major") {
+            globalUniformDefaults.layoutMatrix = globalBufferDefaults.layoutMatrix = ElmRowMajor;
+        } else {
+            // unknown majorness strings are treated as (HLSL column major)==(SPIR-V row major)
+            warn(loc, "unknown pack_matrix pragma value", tokens[2].c_str(), "");
+            globalUniformDefaults.layoutMatrix = globalBufferDefaults.layoutMatrix = ElmRowMajor;
+        }
+        return;
+    }
+
+    // Handle once
+    if (lowerTokens[0] == "once") {
+        warn(loc, "not implemented", "#pragma once", "");
+        return;
+    }
 }
 
 //
@@ -649,7 +697,7 @@
         }
 
         // Recovery, if it wasn't found or was not a variable.
-        if (! variable) {
+        if (variable == nullptr) {
             error(loc, "unknown variable", string->c_str(), "");
             variable = new TVariable(string, TType(EbtVoid));
         }
@@ -677,19 +725,33 @@
     if (base->getType().getBasicType() == EbtSampler && !base->isArray()) {
         const TSampler& sampler = base->getType().getSampler();
         if (sampler.isImage() || sampler.isTexture()) {
-            TIntermAggregate* load = new TIntermAggregate(sampler.isImage() ? EOpImageLoad : EOpTextureFetch);
+            if (! mipsOperatorMipArg.empty() && mipsOperatorMipArg.back().mipLevel == nullptr) {
+                // The first operator[] to a .mips[] sequence is the mip level.  We'll remember it.
+                mipsOperatorMipArg.back().mipLevel = index;
+                return base;  // next [] index is to the same base.
+            } else {
+                TIntermAggregate* load = new TIntermAggregate(sampler.isImage() ? EOpImageLoad : EOpTextureFetch);
 
-            load->setType(TType(sampler.type, EvqTemporary, sampler.vectorSize));
-            load->setLoc(loc);
-            load->getSequence().push_back(base);
-            load->getSequence().push_back(index);
+                TType sampReturnType;
+                getTextureReturnType(sampler, sampReturnType);
 
-            // Textures need a MIP.  First indirection is always to mip 0.  If there's another, we'll add it
-            // later.
-            if (sampler.isTexture())
-                load->getSequence().push_back(intermediate.addConstantUnion(0, loc, true));
+                load->setType(sampReturnType);
+                load->setLoc(loc);
+                load->getSequence().push_back(base);
+                load->getSequence().push_back(index);
 
-            return load;
+                // Textures need a MIP.  If we saw one go by, use it.  Otherwise, use zero.
+                if (sampler.isTexture()) {
+                    if (! mipsOperatorMipArg.empty()) {
+                        load->getSequence().push_back(mipsOperatorMipArg.back().mipLevel);
+                        mipsOperatorMipArg.pop_back();
+                    } else {
+                        load->getSequence().push_back(intermediate.addConstantUnion(0, loc, true));
+                    }
+                }
+
+                return load;
+            }
         }
     }
 
@@ -736,7 +798,7 @@
     index = makeIntegerIndex(index);
 
     if (index == nullptr) {
-        error(loc, " unknown undex type ", "", "");
+        error(loc, " unknown index type ", "", "");
         return nullptr;
     }
 
@@ -747,38 +809,43 @@
 
     bool flattened = false;
     int indexValue = 0;
-    if (index->getQualifier().storage == EvqConst) {
+    if (index->getQualifier().isFrontEndConstant())
         indexValue = index->getAsConstantUnion()->getConstArray()[0].getIConst();
-        checkIndex(loc, base->getType(), indexValue);
-    }
 
     variableCheck(base);
     if (! base->isArray() && ! base->isMatrix() && ! base->isVector()) {
         if (base->getAsSymbolNode())
-            error(loc, " left of '[' is not of type array, matrix, or vector ", base->getAsSymbolNode()->getName().c_str(), "");
+            error(loc, " left of '[' is not of type array, matrix, or vector ",
+                  base->getAsSymbolNode()->getName().c_str(), "");
         else
             error(loc, " left of '[' is not of type array, matrix, or vector ", "expression", "");
-    } else if (base->getType().getQualifier().storage == EvqConst && index->getQualifier().storage == EvqConst)
+    } else if (base->getType().getQualifier().storage == EvqConst && index->getQualifier().storage == EvqConst) {
+        // both base and index are front-end constants
+        checkIndex(loc, base->getType(), indexValue);
         return intermediate.foldDereference(base, indexValue, loc);
-    else {
+    } else {
         // at least one of base and index is variable...
 
-        if (base->getAsSymbolNode() && (wasFlattened(base) || shouldFlattenUniform(base->getType()))) {
+        if (index->getQualifier().isFrontEndConstant())
+            checkIndex(loc, base->getType(), indexValue);
+
+        if (base->getType().isScalarOrVec1())
+            result = base;
+        else if (base->getAsSymbolNode() && wasFlattened(base)) {
             if (index->getQualifier().storage != EvqConst)
                 error(loc, "Invalid variable index to flattened array", base->getAsSymbolNode()->getName().c_str(), "");
 
             result = flattenAccess(base, indexValue);
             flattened = (result != base);
         } else {
-            splitAccessArray(loc, base, index);
-
-            if (index->getQualifier().storage == EvqConst) {
-                if (base->getType().isImplicitlySizedArray())
-                    updateImplicitArraySize(loc, base, indexValue);
+            if (index->getQualifier().isFrontEndConstant()) {
+                if (base->getType().isUnsizedArray())
+                    base->getWritableType().updateImplicitArraySize(indexValue + 1);
+                else
+                    checkIndex(loc, base->getType(), indexValue);
                 result = intermediate.addIndex(EOpIndexDirect, base, index, loc);
-            } else {
+            } else
                 result = intermediate.addIndex(EOpIndexIndirect, base, index, loc);
-            }
         }
     }
 
@@ -803,23 +870,20 @@
     return result;
 }
 
-void HlslParseContext::checkIndex(const TSourceLoc& /*loc*/, const TType& /*type*/, int& /*index*/)
-{
-    // HLSL todo: any rules for index fixups?
-}
-
 // Handle seeing a binary node with a math operation.
-TIntermTyped* HlslParseContext::handleBinaryMath(const TSourceLoc& loc, const char* str, TOperator op, TIntermTyped* left, TIntermTyped* right)
+TIntermTyped* HlslParseContext::handleBinaryMath(const TSourceLoc& loc, const char* str, TOperator op,
+                                                 TIntermTyped* left, TIntermTyped* right)
 {
     TIntermTyped* result = intermediate.addBinaryMath(op, left, right, loc);
-    if (! result)
+    if (result == nullptr)
         binaryOpError(loc, str, left->getCompleteString(), right->getCompleteString());
 
     return result;
 }
 
 // Handle seeing a unary node with a math operation.
-TIntermTyped* HlslParseContext::handleUnaryMath(const TSourceLoc& loc, const char* str, TOperator op, TIntermTyped* childNode)
+TIntermTyped* HlslParseContext::handleUnaryMath(const TSourceLoc& loc, const char* str, TOperator op,
+                                                TIntermTyped* childNode)
 {
     TIntermTyped* result = intermediate.addUnaryMath(op, childNode, loc);
 
@@ -874,7 +938,23 @@
     }
 
     TIntermTyped* result = base;
-    if (base->isVector() || base->isScalar()) {
+
+    if (base->getType().getBasicType() == EbtSampler) {
+        // Handle .mips[mipid][pos] operation on textures
+        const TSampler& sampler = base->getType().getSampler();
+        if (sampler.isTexture() && field == "mips") {
+            // Push a null to signify that we expect a mip level under operator[] next.
+            mipsOperatorMipArg.push_back(tMipsOperatorData(loc, nullptr));
+            // Keep 'result' pointing to 'base', since we expect an operator[] to go by next.
+        } else {
+            if (field == "mips")
+                error(loc, "unexpected texture type for .mips[][] operator:",
+                      base->getType().getCompleteString().c_str(), "");
+            else
+                error(loc, "unexpected operator on texture type:", field.c_str(),
+                      base->getType().getCompleteString().c_str());
+        }
+    } else if (base->isVector() || base->isScalar()) {
         TSwizzleSelectors<TVectorSelector> selectors;
         parseSwizzleSelector(loc, field, base->getVectorSize(), selectors);
 
@@ -906,7 +986,8 @@
             } else {
                 TIntermTyped* index = intermediate.addSwizzle(selectors, loc);
                 result = intermediate.addIndex(EOpVectorSwizzle, base, index, loc);
-                result->setType(TType(base->getBasicType(), EvqTemporary, base->getType().getQualifier().precision, selectors.size()));
+                result->setType(TType(base->getBasicType(), EvqTemporary, base->getType().getQualifier().precision,
+                                selectors.size()));
             }
         }
     } else if (base->isMatrix()) {
@@ -920,10 +1001,14 @@
                 result = intermediate.foldDereference(base, selectors[0].coord1, loc);
                 result = intermediate.foldDereference(result, selectors[0].coord2, loc);
             } else {
-                result = intermediate.addIndex(EOpIndexDirect, base, intermediate.addConstantUnion(selectors[0].coord1, loc), loc);
+                result = intermediate.addIndex(EOpIndexDirect, base,
+                                               intermediate.addConstantUnion(selectors[0].coord1, loc),
+                                               loc);
                 TType dereferencedCol(base->getType(), 0);
                 result->setType(dereferencedCol);
-                result = intermediate.addIndex(EOpIndexDirect, result, intermediate.addConstantUnion(selectors[0].coord2, loc), loc);
+                result = intermediate.addIndex(EOpIndexDirect, result,
+                                               intermediate.addConstantUnion(selectors[0].coord2, loc),
+                                               loc);
                 TType dereferenced(dereferencedCol, 0);
                 result->setType(dereferenced);
             }
@@ -934,7 +1019,8 @@
                 if (base->getType().getQualifier().isFrontEndConstant())
                     result = intermediate.foldDereference(base, column, loc);
                 else {
-                    result = intermediate.addIndex(EOpIndexDirect, base, intermediate.addConstantUnion(column, loc), loc);
+                    result = intermediate.addIndex(EOpIndexDirect, base, intermediate.addConstantUnion(column, loc),
+                                                   loc);
                     TType dereferenced(base->getType(), 0);
                     result->setType(dereferenced);
                 }
@@ -942,7 +1028,8 @@
                 // general case, not a column, not a single component
                 TIntermTyped* index = intermediate.addSwizzle(selectors, loc);
                 result = intermediate.addIndex(EOpMatrixSwizzle, base, index, loc);
-                result->setType(TType(base->getBasicType(), EvqTemporary, base->getType().getQualifier().precision, selectors.size()));
+                result->setType(TType(base->getBasicType(), EvqTemporary, base->getType().getQualifier().precision,
+                                      selectors.size()));
            }
         }
     } else if (base->getBasicType() == EbtStruct || base->getBasicType() == EbtBlock) {
@@ -956,21 +1043,15 @@
             }
         }
         if (fieldFound) {
-            if (base->getAsSymbolNode() && (wasFlattened(base) || shouldFlattenUniform(base->getType()))) {
+            if (base->getAsSymbolNode() && wasFlattened(base)) {
                 result = flattenAccess(base, member);
             } else {
-                // Update the base and member to access if this was a split structure.
-                result = splitAccessStruct(loc, base, member);
-                fields = base->getType().getStruct();
-
-                if (result == nullptr) {
-                    if (base->getType().getQualifier().storage == EvqConst)
-                        result = intermediate.foldDereference(base, member, loc);
-                    else {
-                        TIntermTyped* index = intermediate.addConstantUnion(member, loc);
-                        result = intermediate.addIndex(EOpIndexDirectStruct, base, index, loc);
-                        result->setType(*(*fields)[member].type);
-                    }
+                if (base->getType().getQualifier().storage == EvqConst)
+                    result = intermediate.foldDereference(base, member, loc);
+                else {
+                    TIntermTyped* index = intermediate.addConstantUnion(member, loc);
+                    result = intermediate.addIndex(EOpIndexDirectStruct, base, index, loc);
+                    result->setType(*(*fields)[member].type);
                 }
             }
         } else
@@ -1005,111 +1086,107 @@
         return false;
 }
 
-// Split the type of the given node into two structs:
-//   1. interstage IO
-//   2. everything else
-// IO members are put into the ioStruct.  The type is modified to remove them.
-void HlslParseContext::split(TIntermTyped* node)
+// Independently establish a built-in that is a member of a structure.
+// 'arraySizes' are what's desired for the independent built-in, whatever
+// the higher-level source/expression of them was.
+void HlslParseContext::splitBuiltIn(const TString& baseName, const TType& memberType, const TArraySizes* arraySizes,
+                                    const TQualifier& outerQualifier)
 {
-    if (node == nullptr)
-        return;
+    // Because of arrays of structs, we might be asked more than once,
+    // but the arraySizes passed in should have captured the whole thing
+    // the first time.
+    // However, clip/cull rely on multiple updates.
+    if (!isClipOrCullDistance(memberType))
+        if (splitBuiltIns.find(tInterstageIoData(memberType.getQualifier().builtIn, outerQualifier.storage)) !=
+            splitBuiltIns.end())
+            return;
 
-    TIntermSymbol* symNode = node->getAsSymbolNode();
+    TVariable* ioVar = makeInternalVariable(baseName + "." + memberType.getFieldName(), memberType);
 
-    if (symNode == nullptr)
-        return;
+    if (arraySizes != nullptr && !memberType.isArray())
+        ioVar->getWritableType().copyArraySizes(*arraySizes);
 
-    // Create a new variable:
-    TType& splitType = split(*symNode->getType().clone(), symNode->getName());
+    splitBuiltIns[tInterstageIoData(memberType.getQualifier().builtIn, outerQualifier.storage)] = ioVar;
+    if (!isClipOrCullDistance(ioVar->getType()))
+        trackLinkage(*ioVar);
 
-    splitIoVars[symNode->getId()] = makeInternalVariable(symNode->getName(), splitType);
+    // Merge qualifier from the user structure
+    mergeQualifiers(ioVar->getWritableType().getQualifier(), outerQualifier);
+
+    // Fix the builtin type if needed (e.g, some types require fixed array sizes, no matter how the
+    // shader declared them).  This is done after mergeQualifiers(), in case fixBuiltInIoType looks
+    // at the qualifier to determine e.g, in or out qualifications.
+    fixBuiltInIoType(ioVar->getWritableType());
+
+    // But, not location, we're losing that
+    ioVar->getWritableType().getQualifier().layoutLocation = TQualifier::layoutLocationEnd;
 }
 
-// Split the type of the given variable into two structs:
+// Split a type into
+//   1. a struct of non-I/O members
+//   2. a collection of independent I/O variables
 void HlslParseContext::split(const TVariable& variable)
 {
-    const TType& type = variable.getType();
-
-    TString name = variable.getName();
-
     // Create a new variable:
-    TType& splitType = split(*type.clone(), name);
-
-    splitIoVars[variable.getUniqueId()] = makeInternalVariable(variable.getName(), splitType);
+    const TType& clonedType = *variable.getType().clone();
+    const TType& splitType = split(clonedType, variable.getName(), clonedType.getQualifier());
+    splitNonIoVars[variable.getUniqueId()] = makeInternalVariable(variable.getName(), splitType);
 }
 
-// Recursive implementation of split(const TVariable& variable).
+// Recursive implementation of split().
 // Returns reference to the modified type.
-TType& HlslParseContext::split(TType& type, TString name, const TType* outerStructType)
+const TType& HlslParseContext::split(const TType& type, const TString& name, const TQualifier& outerQualifier)
 {
-    const TArraySizes* arraySizes = nullptr;
-
-    // At the outer-most scope, remember the struct type so we can examine its storage class
-    // at deeper levels.
-    if (outerStructType == nullptr)
-        outerStructType = &type;
-
-    if (type.isArray())
-        arraySizes = &type.getArraySizes();
-
-    // We can ignore arrayness: it's uninvolved.
     if (type.isStruct()) {
         TTypeList* userStructure = type.getWritableStruct();
-
-        // Get iterator to (now at end) set of builtin interstage IO members
-        const auto firstIo = std::stable_partition(userStructure->begin(), userStructure->end(),
-                                                   [this](const TTypeLoc& t) {return !t.type->isBuiltInInterstageIO(language);});
-
-        // Move those to the builtin IO.  However, we also propagate arrayness (just one level is handled
-        // now) to this variable.
-        for (auto ioType = firstIo; ioType != userStructure->end(); ++ioType) {
-            const TType& memberType = *ioType->type;
-            TVariable* ioVar = makeInternalVariable(name + (name.empty() ? "" : "_") + memberType.getFieldName(), memberType);
-
-            if (arraySizes)
-                ioVar->getWritableType().newArraySizes(*arraySizes);
-
-            fixBuiltInIoType(ioVar->getWritableType());
-
-            interstageBuiltInIo[tInterstageIoData(memberType, *outerStructType)] = ioVar;
-
-            // Merge qualifier from the user structure
-            mergeQualifiers(ioVar->getWritableType().getQualifier(), outerStructType->getQualifier());
+        for (auto ioType = userStructure->begin(); ioType != userStructure->end(); ) {
+            if (ioType->type->isBuiltIn()) {
+                // move out the built-in
+                splitBuiltIn(name, *ioType->type, type.getArraySizes(), outerQualifier);
+                ioType = userStructure->erase(ioType);
+            } else {
+                split(*ioType->type, name + "." + ioType->type->getFieldName(), outerQualifier);
+                ++ioType;
+            }
         }
-
-        // Erase the IO vars from the user structure.
-        userStructure->erase(firstIo, userStructure->end());
-
-        // Recurse further into the members.
-        for (unsigned int i = 0; i < userStructure->size(); ++i)
-            split(*(*userStructure)[i].type,
-                  name + (name.empty() ? "" : "_") + (*userStructure)[i].type->getFieldName(),
-                  outerStructType);
     }
 
     return type;
 }
 
-// Is this a uniform array which should be flattened?
-bool HlslParseContext::shouldFlattenUniform(const TType& type) const
+// Is this an aggregate that should be flattened?
+// Can be applied to intermediate levels of type in a hierarchy.
+// Some things like flattening uniform arrays are only about the top level
+// of the aggregate, triggered on 'topLevel'.
+bool HlslParseContext::shouldFlatten(const TType& type, TStorageQualifier qualifier, bool topLevel) const
 {
-    const TStorageQualifier qualifier = type.getQualifier().storage;
-
-    return qualifier == EvqUniform &&
-        ((type.isArray() && intermediate.getFlattenUniformArrays()) || type.isStruct()) &&
-        type.containsOpaque();
+    switch (qualifier) {
+    case EvqVaryingIn:
+    case EvqVaryingOut:
+        return type.isStruct() || type.isArray();
+    case EvqUniform:
+        return (type.isArray() && intermediate.getFlattenUniformArrays() && topLevel) ||
+               (type.isStruct() && type.containsOpaque());
+    default:
+        return false;
+    };
 }
 
 // Top level variable flattening: construct data
-void HlslParseContext::flatten(const TSourceLoc& loc, const TVariable& variable)
+void HlslParseContext::flatten(const TVariable& variable, bool linkage)
 {
     const TType& type = variable.getType();
 
+    // If it's a standalone built-in, there is nothing to flatten
+    if (type.isBuiltIn() && !type.isStruct())
+        return;
+
     auto entry = flattenMap.insert(std::make_pair(variable.getUniqueId(),
-                                                  TFlattenData(type.getQualifier().layoutBinding)));
+                                                  TFlattenData(type.getQualifier().layoutBinding,
+                                                               type.getQualifier().layoutLocation)));
 
     // the item is a map pair, so first->second is the TFlattenData itself.
-    flatten(loc, variable, type, entry.first->second, "");
+    flatten(variable, type, entry.first->second, variable.getName(), linkage, type.getQualifier(), nullptr);
 }
 
 // Recursively flatten the given variable at the provided type, building the flattenData as we go.
@@ -1139,15 +1216,17 @@
 //
 // so the 4th flattened member in traversal order is ours.
 //
-int HlslParseContext::flatten(const TSourceLoc& loc, const TVariable& variable, const TType& type,
-                              TFlattenData& flattenData, TString name)
+int HlslParseContext::flatten(const TVariable& variable, const TType& type,
+                              TFlattenData& flattenData, TString name, bool linkage,
+                              const TQualifier& outerQualifier,
+                              const TArraySizes* builtInArraySizes)
 {
     // If something is an arrayed struct, the array flattener will recursively call flatten()
     // to then flatten the struct, so this is an "if else": we don't do both.
     if (type.isArray())
-        return flattenArray(loc, variable, type, flattenData, name);
+        return flattenArray(variable, type, flattenData, name, linkage, outerQualifier);
     else if (type.isStruct())
-        return flattenStruct(loc, variable, type, flattenData, name);
+        return flattenStruct(variable, type, flattenData, name, linkage, outerQualifier, builtInArraySizes);
     else {
         assert(0); // should never happen
         return -1;
@@ -1156,11 +1235,12 @@
 
 // Add a single flattened member to the flattened data being tracked for the composite
 // Returns true for the final flattening level.
-int HlslParseContext::addFlattenedMember(const TSourceLoc& loc,
-                                         const TVariable& variable, const TType& type, TFlattenData& flattenData,
-                                         const TString& memberName, bool track)
+int HlslParseContext::addFlattenedMember(const TVariable& variable, const TType& type, TFlattenData& flattenData,
+                                         const TString& memberName, bool linkage,
+                                         const TQualifier& outerQualifier,
+                                         const TArraySizes* builtInArraySizes)
 {
-    if (isFinalFlattening(type)) {
+    if (!shouldFlatten(type, outerQualifier.storage, false)) {
         // This is as far as we flatten.  Insert the variable.
         TVariable* memberVariable = makeInternalVariable(memberName, type);
         mergeQualifiers(memberVariable->getWritableType().getQualifier(), variable.getType().getQualifier());
@@ -1168,16 +1248,28 @@
         if (flattenData.nextBinding != TQualifier::layoutBindingEnd)
             memberVariable->getWritableType().getQualifier().layoutBinding = flattenData.nextBinding++;
 
+        if (memberVariable->getType().isBuiltIn()) {
+            // inherited locations are nonsensical for built-ins (TODO: what if semantic had a number)
+            memberVariable->getWritableType().getQualifier().layoutLocation = TQualifier::layoutLocationEnd;
+        } else {
+            // inherited locations must be auto bumped, not replicated
+            if (flattenData.nextLocation != TQualifier::layoutLocationEnd) {
+                memberVariable->getWritableType().getQualifier().layoutLocation = flattenData.nextLocation;
+                flattenData.nextLocation += intermediate.computeTypeLocationSize(memberVariable->getType(), language);
+                nextOutLocation = std::max(nextOutLocation, flattenData.nextLocation);
+            }
+        }
+
         flattenData.offsets.push_back(static_cast<int>(flattenData.members.size()));
         flattenData.members.push_back(memberVariable);
 
-        if (track)
+        if (linkage)
             trackLinkage(*memberVariable);
 
-        return static_cast<int>(flattenData.offsets.size())-1; // location of the member reference
+        return static_cast<int>(flattenData.offsets.size()) - 1; // location of the member reference
     } else {
         // Further recursion required
-        return flatten(loc, variable, type, flattenData, memberName);
+        return flatten(variable, type, flattenData, memberName, linkage, outerQualifier, builtInArraySizes);
     }
 }
 
@@ -1185,8 +1277,10 @@
 // equivalent set of individual variables.
 //
 // Assumes shouldFlatten() or equivalent was called first.
-int HlslParseContext::flattenStruct(const TSourceLoc& loc, const TVariable& variable, const TType& type,
-                                    TFlattenData& flattenData, TString name)
+int HlslParseContext::flattenStruct(const TVariable& variable, const TType& type,
+                                    TFlattenData& flattenData, TString name, bool linkage,
+                                    const TQualifier& outerQualifier,
+                                    const TArraySizes* builtInArraySizes)
 {
     assert(type.isStruct());
 
@@ -1194,15 +1288,22 @@
 
     // Reserve space for this tree level.
     int start = static_cast<int>(flattenData.offsets.size());
-    int pos   = start;
+    int pos = start;
     flattenData.offsets.resize(int(pos + members.size()), -1);
 
     for (int member = 0; member < (int)members.size(); ++member) {
         TType& dereferencedType = *members[member].type;
-        const TString memberName = name + (name.empty() ? "" : ".") + dereferencedType.getFieldName();
-
-        const int mpos = addFlattenedMember(loc, variable, dereferencedType, flattenData, memberName, false);
-        flattenData.offsets[pos++] = mpos;
+        if (dereferencedType.isBuiltIn())
+            splitBuiltIn(variable.getName(), dereferencedType, builtInArraySizes, outerQualifier);
+        else {
+            const int mpos = addFlattenedMember(variable, dereferencedType, flattenData,
+                                                name + "." + dereferencedType.getFieldName(),
+                                                linkage, outerQualifier,
+                                                builtInArraySizes == nullptr && dereferencedType.isArray()
+                                                                       ? dereferencedType.getArraySizes()
+                                                                       : builtInArraySizes);
+            flattenData.offsets[pos++] = mpos;
+        }
     }
 
     return start;
@@ -1212,13 +1313,11 @@
 // equivalent set of individual variables.
 //
 // Assumes shouldFlatten() or equivalent was called first.
-int HlslParseContext::flattenArray(const TSourceLoc& loc, const TVariable& variable, const TType& type,
-                                   TFlattenData& flattenData, TString name)
+int HlslParseContext::flattenArray(const TVariable& variable, const TType& type,
+                                   TFlattenData& flattenData, TString name, bool linkage,
+                                   const TQualifier& outerQualifier)
 {
-    assert(type.isArray());
-
-    if (type.isImplicitlySizedArray())
-        error(loc, "cannot flatten implicitly sized array", variable.getName().c_str(), "");
+    assert(type.isSizedArray());
 
     const int size = type.getOuterArraySize();
     const TType dereferencedType(type, 0);
@@ -1234,8 +1333,9 @@
     for (int element=0; element < size; ++element) {
         char elementNumBuf[20];  // sufficient for MAXINT
         snprintf(elementNumBuf, sizeof(elementNumBuf)-1, "[%d]", element);
-        const int mpos = addFlattenedMember(loc, variable, dereferencedType, flattenData,
-                                            name + elementNumBuf, true);
+        const int mpos = addFlattenedMember(variable, dereferencedType, flattenData,
+                                            name + elementNumBuf, linkage, outerQualifier,
+                                            type.getArraySizes());
 
         flattenData.offsets[pos++] = mpos;
     }
@@ -1247,165 +1347,123 @@
 bool HlslParseContext::wasFlattened(const TIntermTyped* node) const
 {
     return node != nullptr && node->getAsSymbolNode() != nullptr &&
-        wasFlattened(node->getAsSymbolNode()->getId());
+           wasFlattened(node->getAsSymbolNode()->getId());
 }
 
 // Return true if we have split this structure
 bool HlslParseContext::wasSplit(const TIntermTyped* node) const
 {
     return node != nullptr && node->getAsSymbolNode() != nullptr &&
-        wasSplit(node->getAsSymbolNode()->getId());
+           wasSplit(node->getAsSymbolNode()->getId());
 }
 
 // Turn an access into an aggregate that was flattened to instead be
 // an access to the individual variable the member was flattened to.
-// Assumes shouldFlatten() or equivalent was called first.
+// Assumes wasFlattened() or equivalent was called first.
 TIntermTyped* HlslParseContext::flattenAccess(TIntermTyped* base, int member)
 {
     const TType dereferencedType(base->getType(), member);  // dereferenced type
-
     const TIntermSymbol& symbolNode = *base->getAsSymbolNode();
+    TIntermTyped* flattened = flattenAccess(symbolNode.getId(), member, base->getQualifier().storage,
+                                            dereferencedType, symbolNode.getFlattenSubset());
 
-    const auto flattenData = flattenMap.find(symbolNode.getId());
+    return flattened ? flattened : base;
+}
+TIntermTyped* HlslParseContext::flattenAccess(int uniqueId, int member, TStorageQualifier outerStorage,
+    const TType& dereferencedType, int subset)
+{
+    const auto flattenData = flattenMap.find(uniqueId);
 
     if (flattenData == flattenMap.end())
-        return base;
+        return nullptr;
 
     // Calculate new cumulative offset from the packed tree
-    flattenOffset.back() = flattenData->second.offsets[flattenOffset.back() + member];
+    int newSubset = flattenData->second.offsets[subset >= 0 ? subset + member : member];
 
-    if (isFinalFlattening(dereferencedType)) {
+    TIntermSymbol* subsetSymbol;
+    if (!shouldFlatten(dereferencedType, outerStorage, false)) {
         // Finished flattening: create symbol for variable
-        member = flattenData->second.offsets[flattenOffset.back()];
+        member = flattenData->second.offsets[newSubset];
         const TVariable* memberVariable = flattenData->second.members[member];
-        return intermediate.addSymbol(*memberVariable);
+        subsetSymbol = intermediate.addSymbol(*memberVariable);
+        subsetSymbol->setFlattenSubset(-1);
     } else {
+
         // If this is not the final flattening, accumulate the position and return
         // an object of the partially dereferenced type.
-        return new TIntermSymbol(symbolNode.getId(), "flattenShadow", dereferencedType);
+        subsetSymbol = new TIntermSymbol(uniqueId, "flattenShadow", dereferencedType);
+        subsetSymbol->setFlattenSubset(newSubset);
     }
+
+    return subsetSymbol;
 }
 
+// For finding where the first leaf is in a subtree of a multi-level aggregate
+// that is just getting a subset assigned. Follows the same logic as flattenAccess,
+// but logically going down the "left-most" tree branch each step of the way.
+//
+// Returns the offset into the first leaf of the subset.
+int HlslParseContext::findSubtreeOffset(const TIntermNode& node) const
+{
+    const TIntermSymbol* sym = node.getAsSymbolNode();
+    if (sym == nullptr)
+        return 0;
+    if (!sym->isArray() && !sym->isStruct())
+        return 0;
+    int subset = sym->getFlattenSubset();
+    if (subset == -1)
+        return 0;
+
+    // Getting this far means a partial aggregate is identified by the flatten subset.
+    // Find the first leaf of the subset.
+
+    const auto flattenData = flattenMap.find(sym->getId());
+    if (flattenData == flattenMap.end())
+        return 0;
+
+    return findSubtreeOffset(sym->getType(), subset, flattenData->second.offsets);
+
+    do {
+        subset = flattenData->second.offsets[subset];
+    } while (true);
+}
+// Recursively do the desent
+int HlslParseContext::findSubtreeOffset(const TType& type, int subset, const TVector<int>& offsets) const
+{
+    if (!type.isArray() && !type.isStruct())
+        return offsets[subset];
+    TType derefType(type, 0);
+    return findSubtreeOffset(derefType, offsets[subset], offsets);
+};
+
 // Find and return the split IO TVariable for id, or nullptr if none.
-TVariable* HlslParseContext::getSplitIoVar(int id) const
+TVariable* HlslParseContext::getSplitNonIoVar(int id) const
 {
-    const auto splitIoVar = splitIoVars.find(id);
-
-    if (splitIoVar == splitIoVars.end())
+    const auto splitNonIoVar = splitNonIoVars.find(id);
+    if (splitNonIoVar == splitNonIoVars.end())
         return nullptr;
 
-    return splitIoVar->second;
+    return splitNonIoVar->second;
 }
 
-// Find and return the split IO TVariable for variable, or nullptr if none.
-TVariable* HlslParseContext::getSplitIoVar(const TVariable* var) const
-{
-    if (var == nullptr)
-        return nullptr;
-
-    return getSplitIoVar(var->getUniqueId());
-}
-
-// Find and return the split IO TVariable for symbol in this node, or nullptr if none.
-TVariable* HlslParseContext::getSplitIoVar(const TIntermTyped* node) const
-{
-    if (node == nullptr)
-        return nullptr;
-
-    const TIntermSymbol* symbolNode = node->getAsSymbolNode();
-
-    if (symbolNode == nullptr)
-        return nullptr;
-
-    return getSplitIoVar(symbolNode->getId());
-}
-
-// Remember the index used to dereference into this structure, in case it has to be moved to a
-// split-off builtin IO member.
-void HlslParseContext::splitAccessArray(const TSourceLoc& loc, TIntermTyped* base, TIntermTyped* index)
-{
-    const TVariable* splitIoVar = getSplitIoVar(base);
-
-    // Not a split structure
-    if (splitIoVar == nullptr)
-        return;
-
-    if (builtInIoBase) {
-        error(loc, "only one array dimension supported for builtIn IO variable", "", "");
-        return;
-    }
-
-    builtInIoBase  = base;
-    builtInIoIndex = index;
-}
-
-// Turn an access into an struct that was split to instead be an
-// access to either the modified structure, or a direct reference to
-// one of the split member variables.
-TIntermTyped* HlslParseContext::splitAccessStruct(const TSourceLoc& loc, TIntermTyped*& base, int& member)
-{
-    // nothing to do
-    if (base == nullptr)
-        return nullptr;
-
-    // We have a pending bracket reference to an outer struct that we may want to move to an inner member.
-    if (builtInIoBase)
-        base = builtInIoBase;
-
-    const TVariable* splitIoVar = getSplitIoVar(base);
-
-    if (splitIoVar == nullptr)
-        return nullptr;
-
-    const TTypeList& members = *base->getType().getStruct();
-
-    const TType& memberType = *members[member].type;
-
-    if (memberType.isBuiltInInterstageIO(language)) {
-        // It's one of the interstage IO variables we split off.
-        TIntermTyped* builtIn = intermediate.addSymbol(*interstageBuiltInIo[tInterstageIoData(memberType, base->getType())], loc);
-
-        // If there's an array reference to an outer split struct, we re-apply it here.
-        if (builtInIoIndex != nullptr) {
-            if (builtInIoIndex->getQualifier().storage == EvqConst)
-                builtIn = intermediate.addIndex(EOpIndexDirect, builtIn, builtInIoIndex, loc);
-            else
-                builtIn = intermediate.addIndex(EOpIndexIndirect, builtIn, builtInIoIndex, loc);
-
-            builtIn->setType(memberType);
-
-            builtInIoIndex = nullptr;
-            builtInIoBase  = nullptr;
-        }
-
-        return builtIn;
-    } else {
-        // It's not an IO variable.  Find the equivalent index into the new variable.
-        base = intermediate.addSymbol(*splitIoVar, loc);
-
-        int newMember = 0;
-        for (int m=0; m<member; ++m)
-            if (!members[m].type->isBuiltInInterstageIO(language))
-                ++newMember;
-
-        member = newMember;
-
-        return nullptr;
-    }
-}
-
-// Pass through to base class after remembering builtin mappings.
+// Pass through to base class after remembering built-in mappings.
 void HlslParseContext::trackLinkage(TSymbol& symbol)
 {
     TBuiltInVariable biType = symbol.getType().getQualifier().builtIn;
 
     if (biType != EbvNone)
-        builtInLinkageSymbols[biType] = symbol.clone();
+        builtInTessLinkageSymbols[biType] = symbol.clone();
 
     TParseContextBase::trackLinkage(symbol);
 }
 
 
+// Returns true if the built-in is a clip or cull distance variable.
+bool HlslParseContext::isClipOrCullDistance(TBuiltInVariable builtIn)
+{
+    return builtIn == EbvClipDistance || builtIn == EbvCullDistance;
+}
+
 // Some types require fixed array sizes in SPIR-V, but can be scalars or
 // arrays of sizes SPIR-V doesn't allow.  For example, tessellation factors.
 // This creates the right size.  A conversion is performed when the internal
@@ -1414,72 +1472,94 @@
 void HlslParseContext::fixBuiltInIoType(TType& type)
 {
     int requiredArraySize = 0;
+    int requiredVectorSize = 0;
 
     switch (type.getQualifier().builtIn) {
     case EbvTessLevelOuter: requiredArraySize = 4; break;
     case EbvTessLevelInner: requiredArraySize = 2; break;
-    case EbvClipDistance:   // TODO: ...
-    case EbvCullDistance:   // TODO: ...
-        return;
-    case EbvTessCoord:
+
+    case EbvSampleMask:
         {
-            // tesscoord is always a vec3 for the IO variable, no matter the shader's
-            // declared vector size.
-            TType tessCoordType(type.getBasicType(), type.getQualifier().storage, 3);
-
-            tessCoordType.getQualifier() = type.getQualifier();
-            type.shallowCopy(tessCoordType);
-
+            // Promote scalar to array of size 1.  Leave existing arrays alone.
+            if (!type.isArray())
+                requiredArraySize = 1;
             break;
         }
+
+    case EbvWorkGroupId:        requiredVectorSize = 3; break;
+    case EbvGlobalInvocationId: requiredVectorSize = 3; break;
+    case EbvLocalInvocationId:  requiredVectorSize = 3; break;
+    case EbvTessCoord:          requiredVectorSize = 3; break;
+
     default:
+        if (isClipOrCullDistance(type)) {
+            const int loc = type.getQualifier().layoutLocation;
+
+            if (type.getQualifier().builtIn == EbvClipDistance) {
+                if (type.getQualifier().storage == EvqVaryingIn)
+                    clipSemanticNSizeIn[loc] = type.getVectorSize();
+                else
+                    clipSemanticNSizeOut[loc] = type.getVectorSize();
+            } else {
+                if (type.getQualifier().storage == EvqVaryingIn)
+                    cullSemanticNSizeIn[loc] = type.getVectorSize();
+                else
+                    cullSemanticNSizeOut[loc] = type.getVectorSize();
+            }
+        }
+
         return;
     }
 
+    // Alter or set vector size as needed.
+    if (requiredVectorSize > 0) {
+        TType newType(type.getBasicType(), type.getQualifier().storage, requiredVectorSize);
+        newType.getQualifier() = type.getQualifier();
+
+        type.shallowCopy(newType);
+    }
+
     // Alter or set array size as needed.
     if (requiredArraySize > 0) {
-        if (type.isArray()) {
-            // Already an array.  Fix the size.
-            type.changeOuterArraySize(requiredArraySize);
-        } else {
-            // it wasn't an array, but needs to be.
-            TArraySizes arraySizes;
-            arraySizes.addInnerSize(requiredArraySize);
-            type.newArraySizes(arraySizes);
+        if (!type.isArray() || type.getOuterArraySize() != requiredArraySize) {
+            TArraySizes* arraySizes = new TArraySizes;
+            arraySizes->addInnerSize(requiredArraySize);
+            type.transferArraySizes(arraySizes);
         }
     }
 }
 
 // Variables that correspond to the user-interface in and out of a stage
-// (not the built-in interface) are assigned locations and
-// registered as a linkage node (part of the stage's external interface).
-//
+// (not the built-in interface) are
+//  - assigned locations
+//  - registered as a linkage node (part of the stage's external interface).
 // Assumes it is called in the order in which locations should be assigned.
-void HlslParseContext::assignLocations(TVariable& variable)
+void HlslParseContext::assignToInterface(TVariable& variable)
 {
     const auto assignLocation = [&](TVariable& variable) {
-        const TType& type = variable.getType();
-        const TQualifier& qualifier = type.getQualifier();
-        if (qualifier.storage == EvqVaryingIn || qualifier.storage == EvqVaryingOut) {
-            if (qualifier.builtIn == EbvNone) {
-                // Strip off the outer array dimension for those having an extra one.
-                int size;
-                if (type.isArray() && qualifier.isArrayedIo(language)) {
-                    TType elementType(type, 0);
-                    size = intermediate.computeTypeLocationSize(elementType);
-                } else
-                    size = intermediate.computeTypeLocationSize(type);
+        TType& type = variable.getWritableType();
+        if (!type.isStruct() || type.getStruct()->size() > 0) {
+            TQualifier& qualifier = type.getQualifier();
+            if (qualifier.storage == EvqVaryingIn || qualifier.storage == EvqVaryingOut) {
+                if (qualifier.builtIn == EbvNone && !qualifier.hasLocation()) {
+                    // Strip off the outer array dimension for those having an extra one.
+                    int size;
+                    if (type.isArray() && qualifier.isArrayedIo(language)) {
+                        TType elementType(type, 0);
+                        size = intermediate.computeTypeLocationSize(elementType, language);
+                    } else
+                        size = intermediate.computeTypeLocationSize(type, language);
 
-                if (qualifier.storage == EvqVaryingIn) {
-                    variable.getWritableType().getQualifier().layoutLocation = nextInLocation;
-                    nextInLocation += size;
-                } else {
-                    variable.getWritableType().getQualifier().layoutLocation = nextOutLocation;
-                    nextOutLocation += size;
+                    if (qualifier.storage == EvqVaryingIn) {
+                        variable.getWritableType().getQualifier().layoutLocation = nextInLocation;
+                        nextInLocation += size;
+                    } else {
+                        variable.getWritableType().getQualifier().layoutLocation = nextOutLocation;
+                        nextOutLocation += size;
+                    }
                 }
+                trackLinkage(variable);
             }
-
-            trackLinkage(variable);
         }
     };
 
@@ -1488,7 +1568,7 @@
         for (auto member = memberList.begin(); member != memberList.end(); ++member)
             assignLocation(**member);
     } else if (wasSplit(variable.getUniqueId())) {
-        TVariable* splitIoVar = getSplitIoVar(&variable);
+        TVariable* splitIoVar = getSplitNonIoVar(variable.getUniqueId());
         assignLocation(*splitIoVar);
     } else {
         assignLocation(variable);
@@ -1529,30 +1609,27 @@
         error(loc, "function name is redeclaration of existing name", function.getName().c_str(), "");
 }
 
-// Finalization step: Add interstage IO variables to the linkage in canonical order.
-void HlslParseContext::addInterstageIoToLinkage()
+// For struct buffers with counters, we must pass the counter buffer as hidden parameter.
+// This adds the hidden parameter to the parameter list in 'paramNodes' if needed.
+// Otherwise, it's a no-op
+void HlslParseContext::addStructBufferHiddenCounterParam(const TSourceLoc& loc, TParameter& param,
+                                                         TIntermAggregate*& paramNodes)
 {
-    TSourceLoc loc;
-    loc.init();
+    if (! hasStructBuffCounter(*param.type))
+        return;
 
-    std::vector<tInterstageIoData> io;
-    io.reserve(interstageBuiltInIo.size());
+    const TString counterBlockName(intermediate.addCounterBufferName(*param.name));
 
-    for (auto ioVar = interstageBuiltInIo.begin(); ioVar != interstageBuiltInIo.end(); ++ioVar)
-        io.push_back(ioVar->first);
+    TType counterType;
+    counterBufferType(loc, counterType);
+    TVariable *variable = makeInternalVariable(counterBlockName, counterType);
 
-    // Our canonical order is the TBuiltInVariable numeric order.
-    std::sort(io.begin(), io.end());
+    if (! symbolTable.insert(*variable))
+        error(loc, "redefinition", variable->getName().c_str(), "");
 
-    // We have to (potentially) track two IO blocks, one in, one out.  E.g, a GS may have a
-    // PerVertex block in both directions, possibly with different members.
-    for (int idx = 0; idx < int(io.size()); ++idx) {
-        TVariable* var = interstageBuiltInIo[io[idx]];
-
-        // Add the loose interstage IO to the linkage
-        if (var->getType().isLooseAndBuiltIn(language))
-            trackLinkage(*var);
-    }
+    paramNodes = intermediate.growAggregate(paramNodes,
+                                            intermediate.addSymbol(*variable, loc),
+                                            loc);
 }
 
 //
@@ -1562,13 +1639,14 @@
 // Returns an aggregate of parameter-symbol nodes.
 //
 TIntermAggregate* HlslParseContext::handleFunctionDefinition(const TSourceLoc& loc, TFunction& function,
-                                                             const TAttributeMap& attributes, TIntermNode*& entryPointTree)
+                                                             const TAttributes& attributes,
+                                                             TIntermNode*& entryPointTree)
 {
     currentCaller = function.getMangledName();
     TSymbol* symbol = symbolTable.find(function.getMangledName());
     TFunction* prevDec = symbol ? symbol->getAsFunction() : nullptr;
 
-    if (! prevDec)
+    if (prevDec == nullptr)
         error(loc, "can't find function", function.getName().c_str(), "");
     // Note:  'prevDec' could be 'function' if this is the first time we've seen function
     // as it would have just been put in the symbol table.  Otherwise, we're looking up
@@ -1616,15 +1694,33 @@
                 symbolTable.makeInternalVariable(*variable);
                 pushImplicitThis(variable);
             }
+
             // Insert the parameters with name in the symbol table.
             if (! symbolTable.insert(*variable))
                 error(loc, "redefinition", variable->getName().c_str(), "");
-            // Add the parameter to the AST
-            paramNodes = intermediate.growAggregate(paramNodes,
-                                                    intermediate.addSymbol(*variable, loc),
-                                                    loc);
 
-            // TODO: for struct buffers with counters, pass counter buffer as hidden parameter
+            // Add parameters to the AST list.
+            if (shouldFlatten(variable->getType(), variable->getType().getQualifier().storage, true)) {
+                // Expand the AST parameter nodes (but not the name mangling or symbol table view)
+                // for structures that need to be flattened.
+                flatten(*variable, false);
+                const TTypeList* structure = variable->getType().getStruct();
+                for (int mem = 0; mem < (int)structure->size(); ++mem) {
+                    paramNodes = intermediate.growAggregate(paramNodes,
+                                                            flattenAccess(variable->getUniqueId(), mem,
+                                                                          variable->getType().getQualifier().storage,
+                                                                          *(*structure)[mem].type),
+                                                            loc);
+                }
+            } else {
+                // Add the parameter to the AST
+                paramNodes = intermediate.growAggregate(paramNodes,
+                                                        intermediate.addSymbol(*variable, loc),
+                                                        loc);
+            }
+
+            // Add hidden AST parameter for struct buffer counters, if needed.
+            addStructBufferHiddenCounterParam(loc, param, paramNodes);
         } else
             paramNodes = intermediate.growAggregate(paramNodes, intermediate.addSymbol(*param.type, loc), loc);
     }
@@ -1639,142 +1735,217 @@
     return paramNodes;
 }
 
-
 // Handle all [attrib] attribute for the shader entry point
-void HlslParseContext::handleEntryPointAttributes(const TSourceLoc& loc, const TAttributeMap& attributes)
+void HlslParseContext::handleEntryPointAttributes(const TSourceLoc& loc, const TAttributes& attributes)
 {
-    // Handle entry-point function attributes
-    const TIntermAggregate* numThreads = attributes[EatNumThreads];
-    if (numThreads != nullptr) {
-        const TIntermSequence& sequence = numThreads->getSequence();
-
-        for (int lid = 0; lid < int(sequence.size()); ++lid)
-            intermediate.setLocalSize(lid, sequence[lid]->getAsConstantUnion()->getConstArray()[0].getIConst());
-    }
-
-    // MaxVertexCount
-    const TIntermAggregate* maxVertexCount = attributes[EatMaxVertexCount];
-    if (maxVertexCount != nullptr) {
-        if (! intermediate.setVertices(maxVertexCount->getSequence()[0]->getAsConstantUnion()->getConstArray()[0].getIConst())) {
-            error(loc, "cannot change previously set maxvertexcount attribute", "", "");
+    for (auto it = attributes.begin(); it != attributes.end(); ++it) {
+        switch (it->name) {
+        case EatNumThreads:
+        {
+            const TIntermSequence& sequence = it->args->getSequence();
+            for (int lid = 0; lid < int(sequence.size()); ++lid)
+                intermediate.setLocalSize(lid, sequence[lid]->getAsConstantUnion()->getConstArray()[0].getIConst());
+            break;
         }
-    }
+        case EatMaxVertexCount:
+        {
+            int maxVertexCount;
 
-    // Handle [patchconstantfunction("...")]
-    const TIntermAggregate* pcfAttr = attributes[EatPatchConstantFunc]; 
-    if (pcfAttr != nullptr) {
-        const TConstUnion& pcfName = pcfAttr->getSequence()[0]->getAsConstantUnion()->getConstArray()[0];
-
-        if (pcfName.getType() != EbtString) {
-            error(loc, "invalid patch constant function", "", "");
-        } else {
-            patchConstantFunctionName = *pcfName.getSConst();
+            if (! it->getInt(maxVertexCount)) {
+                error(loc, "invalid maxvertexcount", "", "");
+            } else {
+                if (! intermediate.setVertices(maxVertexCount))
+                    error(loc, "cannot change previously set maxvertexcount attribute", "", "");
+            }
+            break;
         }
-    }
-
-    // Handle [domain("...")]
-    const TIntermAggregate* domainAttr = attributes[EatDomain]; 
-    if (domainAttr != nullptr) {
-        const TConstUnion& domainType = domainAttr->getSequence()[0]->getAsConstantUnion()->getConstArray()[0];
-        if (domainType.getType() != EbtString) {
-            error(loc, "invalid domain", "", "");
-        } else {
-            TString domainStr = *domainType.getSConst();
-            std::transform(domainStr.begin(), domainStr.end(), domainStr.begin(), ::tolower);
-
-            TLayoutGeometry domain = ElgNone;
-
-            if (domainStr == "tri") {
-                domain = ElgTriangles;
-            } else if (domainStr == "quad") {
-                domain = ElgQuads;
-            } else if (domainStr == "isoline") {
-                domain = ElgIsolines;
+        case EatPatchConstantFunc:
+        {
+            TString pcfName;
+            if (! it->getString(pcfName, 0, false)) {
+                error(loc, "invalid patch constant function", "", "");
             } else {
-                error(loc, "unsupported domain type", domainStr.c_str(), "");
+                patchConstantFunctionName = pcfName;
             }
-
-            if (language == EShLangTessEvaluation) {
-                if (! intermediate.setInputPrimitive(domain))
-                    error(loc, "cannot change previously set domain", TQualifier::getGeometryString(domain), "");
-            } else {
-                if (! intermediate.setOutputPrimitive(domain))
-                    error(loc, "cannot change previously set domain", TQualifier::getGeometryString(domain), "");
-            }
+            break;
         }
-    }
-
-    // Handle [outputtoplogy("...")]
-    const TIntermAggregate* topologyAttr = attributes[EatOutputTopology];
-    if (topologyAttr != nullptr) {
-        const TConstUnion& topoType = topologyAttr->getSequence()[0]->getAsConstantUnion()->getConstArray()[0];
-        if (topoType.getType() != EbtString) {
-            error(loc, "invalid outputtoplogy", "", "");
-        } else {
-            TString topologyStr = *topoType.getSConst();
-            std::transform(topologyStr.begin(), topologyStr.end(), topologyStr.begin(), ::tolower);
-
-            TVertexOrder topology = EvoNone;
-                
-            if (topologyStr == "point") {
-                topology = EvoNone;
-            } else if (topologyStr == "line") {
-                topology = EvoNone;
-            } else if (topologyStr == "triangle_cw") {
-                topology = EvoCw;
-            } else if (topologyStr == "triangle_ccw") {
-                topology = EvoCcw;
+        case EatDomain:
+        {
+            // Handle [domain("...")]
+            TString domainStr;
+            if (! it->getString(domainStr)) {
+                error(loc, "invalid domain", "", "");
             } else {
-                error(loc, "unsupported outputtoplogy type", topologyStr.c_str(), "");
-            }
+                TLayoutGeometry domain = ElgNone;
 
-            if (topology != EvoNone) {
-                if (! intermediate.setVertexOrder(topology)) {
-                    error(loc, "cannot change previously set outputtopology", TQualifier::getVertexOrderString(topology), "");
+                if (domainStr == "tri") {
+                    domain = ElgTriangles;
+                } else if (domainStr == "quad") {
+                    domain = ElgQuads;
+                } else if (domainStr == "isoline") {
+                    domain = ElgIsolines;
+                } else {
+                    error(loc, "unsupported domain type", domainStr.c_str(), "");
+                }
+
+                if (language == EShLangTessEvaluation) {
+                    if (! intermediate.setInputPrimitive(domain))
+                        error(loc, "cannot change previously set domain", TQualifier::getGeometryString(domain), "");
+                } else {
+                    if (! intermediate.setOutputPrimitive(domain))
+                        error(loc, "cannot change previously set domain", TQualifier::getGeometryString(domain), "");
                 }
             }
+            break;
         }
-    }
-
-    // Handle [partitioning("...")]
-    const TIntermAggregate* partitionAttr = attributes[EatPartitioning]; 
-    if (partitionAttr != nullptr) {
-        const TConstUnion& partType = partitionAttr->getSequence()[0]->getAsConstantUnion()->getConstArray()[0];
-        if (partType.getType() != EbtString) {
-            error(loc, "invalid partitioning", "", "");
-        } else {
-            TString partitionStr = *partType.getSConst();
-            std::transform(partitionStr.begin(), partitionStr.end(), partitionStr.begin(), ::tolower);
-
-            TVertexSpacing partitioning = EvsNone;
-                
-            if (partitionStr == "integer") {
-                partitioning = EvsEqual;
-            } else if (partitionStr == "fractional_even") {
-                partitioning = EvsFractionalEven;
-            } else if (partitionStr == "fractional_odd") {
-                partitioning = EvsFractionalOdd;
-                //} else if (partition == "pow2") { // TODO: currently nothing to map this to.
+        case EatOutputTopology:
+        {
+            // Handle [outputtopology("...")]
+            TString topologyStr;
+            if (! it->getString(topologyStr)) {
+                error(loc, "invalid outputtopology", "", "");
             } else {
-                error(loc, "unsupported partitioning type", partitionStr.c_str(), "");
-            }
+                TVertexOrder vertexOrder = EvoNone;
+                TLayoutGeometry primitive = ElgNone;
 
-            if (! intermediate.setVertexSpacing(partitioning))
-                error(loc, "cannot change previously set partitioning", TQualifier::getVertexSpacingString(partitioning), "");
+                if (topologyStr == "point") {
+                    intermediate.setPointMode();
+                } else if (topologyStr == "line") {
+                    primitive = ElgIsolines;
+                } else if (topologyStr == "triangle_cw") {
+                    vertexOrder = EvoCw;
+                    primitive = ElgTriangles;
+                } else if (topologyStr == "triangle_ccw") {
+                    vertexOrder = EvoCcw;
+                    primitive = ElgTriangles;
+                } else {
+                    error(loc, "unsupported outputtopology type", topologyStr.c_str(), "");
+                }
+
+                if (vertexOrder != EvoNone) {
+                    if (! intermediate.setVertexOrder(vertexOrder)) {
+                        error(loc, "cannot change previously set outputtopology",
+                              TQualifier::getVertexOrderString(vertexOrder), "");
+                    }
+                }
+                if (primitive != ElgNone)
+                    intermediate.setOutputPrimitive(primitive);
+            }
+            break;
+        }
+        case EatPartitioning:
+        {
+            // Handle [partitioning("...")]
+            TString partitionStr;
+            if (! it->getString(partitionStr)) {
+                error(loc, "invalid partitioning", "", "");
+            } else {
+                TVertexSpacing partitioning = EvsNone;
+                
+                if (partitionStr == "integer") {
+                    partitioning = EvsEqual;
+                } else if (partitionStr == "fractional_even") {
+                    partitioning = EvsFractionalEven;
+                } else if (partitionStr == "fractional_odd") {
+                    partitioning = EvsFractionalOdd;
+                    //} else if (partition == "pow2") { // TODO: currently nothing to map this to.
+                } else {
+                    error(loc, "unsupported partitioning type", partitionStr.c_str(), "");
+                }
+
+                if (! intermediate.setVertexSpacing(partitioning))
+                    error(loc, "cannot change previously set partitioning",
+                          TQualifier::getVertexSpacingString(partitioning), "");
+            }
+            break;
+        }
+        case EatOutputControlPoints:
+        {
+            // Handle [outputcontrolpoints("...")]
+            int ctrlPoints;
+            if (! it->getInt(ctrlPoints)) {
+                error(loc, "invalid outputcontrolpoints", "", "");
+            } else {
+                if (! intermediate.setVertices(ctrlPoints)) {
+                    error(loc, "cannot change previously set outputcontrolpoints attribute", "", "");
+                }
+            }
+            break;
+        }
+        case EatBuiltIn:
+        case EatLocation:
+            // tolerate these because of dual use of entrypoint and type attributes
+            break;
+        default:
+            warn(loc, "attribute does not apply to entry point", "", "");
+            break;
         }
     }
+}
 
-    // Handle [outputcontrolpoints("...")]
-    const TIntermAggregate* outputControlPoints = attributes[EatOutputControlPoints]; 
-    if (outputControlPoints != nullptr) {
-        const TConstUnion& ctrlPointConst = outputControlPoints->getSequence()[0]->getAsConstantUnion()->getConstArray()[0];
-        if (ctrlPointConst.getType() != EbtInt) {
-            error(loc, "invalid outputcontrolpoints", "", "");
-        } else {
-            const int ctrlPoints = ctrlPointConst.getIConst();
-            if (! intermediate.setVertices(ctrlPoints)) {
-                error(loc, "cannot change previously set outputcontrolpoints attribute", "", "");
+// Update the given type with any type-like attribute information in the
+// attributes.
+void HlslParseContext::transferTypeAttributes(const TSourceLoc& loc, const TAttributes& attributes, TType& type,
+    bool allowEntry)
+{
+    if (attributes.size() == 0)
+        return;
+
+    int value;
+    TString builtInString;
+    for (auto it = attributes.begin(); it != attributes.end(); ++it) {
+        switch (it->name) {
+        case EatLocation:
+            // location
+            if (it->getInt(value))
+                type.getQualifier().layoutLocation = value;
+            break;
+        case EatBinding:
+            // binding
+            if (it->getInt(value)) {
+                type.getQualifier().layoutBinding = value;
+                type.getQualifier().layoutSet = 0;
             }
+            // set
+            if (it->getInt(value, 1))
+                type.getQualifier().layoutSet = value;
+            break;
+        case EatGlobalBinding:
+            // global cbuffer binding
+            if (it->getInt(value))
+                globalUniformBinding = value;
+            // global cbuffer binding
+            if (it->getInt(value, 1))
+                globalUniformSet = value;
+            break;
+        case EatInputAttachment:
+            // input attachment
+            if (it->getInt(value))
+                type.getQualifier().layoutAttachment = value;
+            break;
+        case EatBuiltIn:
+            // PointSize built-in
+            if (it->getString(builtInString, 0, false)) {
+                if (builtInString == "PointSize")
+                    type.getQualifier().builtIn = EbvPointSize;
+            }
+            break;
+        case EatPushConstant:
+            // push_constant
+            type.getQualifier().layoutPushConstant = true;
+            break;
+        case EatConstantId:
+            // specialization constant
+            if (it->getInt(value)) {
+                TSourceLoc loc;
+                loc.init();
+                setSpecConstantId(loc, type.getQualifier(), value);
+            }
+            break;
+        default:
+            if (! allowEntry)
+                warn(loc, "attribute does not apply to a type", "", "");
+            break;
         }
     }
 }
@@ -1800,23 +1971,26 @@
 //        ret = @shaderEntryPoint(args...);
 //        oargs = args<that are output>...;
 //    }
+//    retType @shaderEntryPoint(args...)
+//    { body }
 //
 // The symbol table will still map the original entry point name to the
-// the modified function and it's new name:
+// the modified function and its new name:
 //
 //    symbol table:  shaderEntryPoint  ->   @shaderEntryPoint
 //
 // Returns nullptr if no entry-point tree was built, otherwise, returns
 // a subtree that creates the entry point.
 //
-TIntermNode* HlslParseContext::transformEntryPoint(const TSourceLoc& loc, TFunction& userFunction, const TAttributeMap& attributes)
+TIntermNode* HlslParseContext::transformEntryPoint(const TSourceLoc& loc, TFunction& userFunction,
+                                                   const TAttributes& attributes)
 {
     // Return true if this is a tessellation patch constant function input to a domain shader.
     const auto isDsPcfInput = [this](const TType& type) {
         return language == EShLangTessEvaluation &&
         type.contains([](const TType* t) {
                 return t->getQualifier().builtIn == EbvTessLevelOuter ||
-                t->getQualifier().builtIn == EbvTessLevelInner;
+                       t->getQualifier().builtIn == EbvTessLevelInner;
             });
     };
 
@@ -1842,22 +2016,26 @@
     // Further this return/in/out transform by flattening, splitting, and assigning locations
     const auto makeVariableInOut = [&](TVariable& variable) {
         if (variable.getType().isStruct()) {
-            const TStorageQualifier qualifier = variable.getType().getQualifier().storage;
-            // struct inputs to the vertex stage and outputs from the fragment stage must be flattened
-            if ((language == EShLangVertex   && qualifier == EvqVaryingIn) ||
-                (language == EShLangFragment && qualifier == EvqVaryingOut))
-                flatten(loc, variable);
-            // Mixture of IO and non-IO must be split
-            else if (variable.getType().containsBuiltInInterstageIO(language))
-                split(variable);
+            if (variable.getType().getQualifier().isArrayedIo(language)) {
+                if (variable.getType().containsBuiltIn())
+                    split(variable);
+            } else if (shouldFlatten(variable.getType(), EvqVaryingIn /* not assigned yet, but close enough */, true))
+                flatten(variable, false /* don't track linkage here, it will be tracked in assignToInterface() */);
         }
+        // TODO: flatten arrays too
+        // TODO: flatten everything in I/O
+        // TODO: replace all split with flatten, make all paths can create flattened I/O, then split code can be removed
 
-        assignLocations(variable);
+        // For clip and cull distance, multiple output variables potentially get merged
+        // into one in assignClipCullDistance.  That code in assignClipCullDistance
+        // handles the interface logic, so we avoid it here in that case.
+        if (!isClipOrCullDistance(variable.getType()))
+            assignToInterface(variable);
     };
-    if (entryPointOutput)
+    if (entryPointOutput != nullptr)
         makeVariableInOut(*entryPointOutput);
     for (auto it = inputs.begin(); it != inputs.end(); ++it)
-        if (!isDsPcfInput((*it)->getType()))  // skip domain shader PCF input (see comment below)
+        if (!isDsPcfInput((*it)->getType()))  // wait until the end for PCF input (see comment below)
             makeVariableInOut(*(*it));
     for (auto it = outputs.begin(); it != outputs.end(); ++it)
         makeVariableInOut(*(*it));
@@ -1869,7 +2047,7 @@
     // however, so this ensures the linkage is built in the correct order regardless of argument order.
     if (language == EShLangTessEvaluation) {
         for (auto it = inputs.begin(); it != inputs.end(); ++it)
-            if (isDsPcfInput((*it)->getType()))  // skip domain shader PCF input (see comment below)
+            if (isDsPcfInput((*it)->getType()))
                 makeVariableInOut(*(*it));
     }
 
@@ -1898,11 +2076,13 @@
     for (int i = 0; i < userFunction.getParamCount(); i++) {
         TParameter& param = userFunction[i];
         argVars.push_back(makeInternalVariable(*param.name, *param.type));
-
         argVars.back()->getWritableType().getQualifier().makeTemporary();
 
-        TIntermSymbol* arg = intermediate.addSymbol(*argVars.back());
+        // Track the input patch, which is the only non-builtin supported by hull shader PCF.
+        if (param.getDeclaredBuiltIn() == EbvInputPatch)
+            inputPatch = argVars.back();
 
+        TIntermSymbol* arg = intermediate.addSymbol(*argVars.back());
         handleFunctionArgument(&callee, callingArgs, arg);
         if (param.type->getQualifier().isParamInput()) {
             intermediate.growAggregate(synthBody, handleAssign(loc, EOpAssign, arg,
@@ -1924,7 +2104,7 @@
         // an array element as indexed by invocation ID, which we might have to make up.
         // This is required to match SPIR-V semantics.
         if (language == EShLangTessControl) {
-            TIntermSymbol* invocationIdSym = findLinkageSymbol(EbvInvocationId);
+            TIntermSymbol* invocationIdSym = findTessLinkageSymbol(EbvInvocationId);
 
             // If there is no user declared invocation ID, we must make one.
             if (invocationIdSym == nullptr) {
@@ -1942,13 +2122,15 @@
 
             TIntermTyped* element = intermediate.addIndex(EOpIndexIndirect, intermediate.addSymbol(*entryPointOutput),
                                                           invocationIdSym, loc);
-            element->setType(callReturn->getType());
+
+            // Set the type of the array element being dereferenced
+            const TType derefElementType(entryPointOutput->getType(), 0);
+            element->setType(derefElementType);
 
             returnAssign = handleAssign(loc, EOpAssign, element, callReturn);
         } else {
             returnAssign = handleAssign(loc, EOpAssign, intermediate.addSymbol(*entryPointOutput), callReturn);
         }
-        
         intermediate.growAggregate(synthBody, returnAssign);
     } else
         intermediate.growAggregate(synthBody, callReturn);
@@ -1960,7 +2142,7 @@
 
         // GS outputs are via emit, so we do not copy them here.
         if (param.type->getQualifier().isParamOutput()) {
-            if (param.declaredBuiltIn == EbvGsOutputStream) {
+            if (param.getDeclaredBuiltIn() == EbvGsOutputStream) {
                 // GS output stream does not assign outputs here: it's the Append() method
                 // which writes to the output, probably multiple times separated by Emit.
                 // We merely remember the output to use, here.
@@ -1986,7 +2168,8 @@
     return synthFunctionDef;
 }
 
-void HlslParseContext::handleFunctionBody(const TSourceLoc& loc, TFunction& function, TIntermNode* functionBody, TIntermNode*& node)
+void HlslParseContext::handleFunctionBody(const TSourceLoc& loc, TFunction& function, TIntermNode* functionBody,
+                                          TIntermNode*& node)
 {
     node = intermediate.growAggregate(node, functionBody);
     intermediate.setAggregateOperator(node, EOpFunction, function.getType(), loc);
@@ -2006,12 +2189,63 @@
 void HlslParseContext::remapEntryPointIO(TFunction& function, TVariable*& returnValue,
     TVector<TVariable*>& inputs, TVector<TVariable*>& outputs)
 {
+    // We might have in input structure type with no decorations that caused it
+    // to look like an input type, yet it has (e.g.) interpolation types that
+    // must be modified that turn it into an input type.
+    // Hence, a missing ioTypeMap for 'input' might need to be synthesized.
+    const auto synthesizeEditedInput = [this](TType& type) {
+        // True if a type needs to be 'flat'
+        const auto needsFlat = [](const TType& type) {
+            return type.containsBasicType(EbtInt) ||
+                    type.containsBasicType(EbtUint) ||
+                    type.containsBasicType(EbtInt64) ||
+                    type.containsBasicType(EbtUint64) ||
+                    type.containsBasicType(EbtBool) ||
+                    type.containsBasicType(EbtDouble);
+        };
+
+        if (language == EShLangFragment && needsFlat(type)) {
+            if (type.isStruct()) {
+                TTypeList* finalList = nullptr;
+                auto it = ioTypeMap.find(type.getStruct());
+                if (it == ioTypeMap.end() || it->second.input == nullptr) {
+                    // Getting here means we have no input struct, but we need one.
+                    auto list = new TTypeList;
+                    for (auto member = type.getStruct()->begin(); member != type.getStruct()->end(); ++member) {
+                        TType* newType = new TType;
+                        newType->shallowCopy(*member->type);
+                        TTypeLoc typeLoc = { newType, member->loc };
+                        list->push_back(typeLoc);
+                    }
+                    // install the new input type
+                    if (it == ioTypeMap.end()) {
+                        tIoKinds newLists = { list, nullptr, nullptr };
+                        ioTypeMap[type.getStruct()] = newLists;
+                    } else
+                        it->second.input = list;
+                    finalList = list;
+                } else
+                    finalList = it->second.input;
+                // edit for 'flat'
+                for (auto member = finalList->begin(); member != finalList->end(); ++member) {
+                    if (needsFlat(*member->type)) {
+                        member->type->getQualifier().clearInterpolation();
+                        member->type->getQualifier().flat = true;
+                    }
+                }
+            } else {
+                type.getQualifier().clearInterpolation();
+                type.getQualifier().flat = true;
+            }
+        }
+    };
+
     // Do the actual work to make a type be a shader input or output variable,
     // and clear the original to be non-IO (for use as a normal function parameter/return).
     const auto makeIoVariable = [this](const char* name, TType& type, TStorageQualifier storage) -> TVariable* {
         TVariable* ioVariable = makeInternalVariable(name, type);
         clearUniformInputOutput(type.getQualifier());
-        if (type.getStruct() != nullptr) {
+        if (type.isStruct()) {
             auto newLists = ioTypeMap.find(ioVariable->getType().getStruct());
             if (newLists != ioTypeMap.end()) {
                 if (storage == EvqVaryingIn && newLists->second.input)
@@ -2049,9 +2283,9 @@
             outputType.shallowCopy(function.getType());
 
             // vertices has necessarily already been set when handling entry point attributes.
-            TArraySizes arraySizes;
-            arraySizes.addInnerSize(intermediate.getVertices());
-            outputType.newArraySizes(arraySizes);
+            TArraySizes* arraySizes = new TArraySizes;
+            arraySizes->addInnerSize(intermediate.getVertices());
+            outputType.transferArraySizes(arraySizes);
 
             clearUniformInputOutput(function.getWritableType().getQualifier());
             returnValue = makeIoVariable("@entryPointOutput", outputType, EvqVaryingOut);
@@ -2064,11 +2298,9 @@
     for (int i = 0; i < function.getParamCount(); i++) {
         TType& paramType = *function[i].type;
         if (paramType.getQualifier().isParamInput()) {
+            synthesizeEditedInput(paramType);
             TVariable* argAsGlobal = makeIoVariable(function[i].name->c_str(), paramType, EvqVaryingIn);
             inputs.push_back(argAsGlobal);
-
-            if (function[i].declaredBuiltIn == EbvInputPatch)
-                inputPatch = argAsGlobal;
         }
         if (paramType.getQualifier().isParamOutput()) {
             TVariable* argAsGlobal = makeIoVariable(function[i].name->c_str(), paramType, EvqVaryingOut);
@@ -2105,7 +2337,7 @@
         value = intermediate.addConversion(EOpReturn, *currentFunctionType, value);
         if (value && *currentFunctionType != value->getType())
             value = intermediate.addUniShapeConversion(EOpReturn, *currentFunctionType, value);
-        if (value == nullptr) {
+        if (value == nullptr || *currentFunctionType != value->getType()) {
             error(loc, "type does not match, or is not convertible to, the function's return type", "return", "");
             return value;
         }
@@ -2127,30 +2359,365 @@
         arguments = newArg;
 }
 
+// Position may require special handling: we can optionally invert Y.
+// See: https://github.com/KhronosGroup/glslang/issues/1173
+//      https://github.com/KhronosGroup/glslang/issues/494
+TIntermTyped* HlslParseContext::assignPosition(const TSourceLoc& loc, TOperator op,
+                                               TIntermTyped* left, TIntermTyped* right)
+{
+    // If we are not asked for Y inversion, use a plain old assign.
+    if (!intermediate.getInvertY())
+        return intermediate.addAssign(op, left, right, loc);
+
+    // If we get here, we should invert Y.
+    TIntermAggregate* assignList = nullptr;
+
+    // If this is a complex rvalue, we don't want to dereference it many times.  Create a temporary.
+    TVariable* rhsTempVar = nullptr;
+    rhsTempVar = makeInternalVariable("@position", right->getType());
+    rhsTempVar->getWritableType().getQualifier().makeTemporary();
+
+    {
+        TIntermTyped* rhsTempSym = intermediate.addSymbol(*rhsTempVar, loc);
+        assignList = intermediate.growAggregate(assignList,
+                                                intermediate.addAssign(EOpAssign, rhsTempSym, right, loc), loc);
+    }
+
+    // pos.y = -pos.y
+    {
+        const int Y = 1;
+
+        TIntermTyped* tempSymL = intermediate.addSymbol(*rhsTempVar, loc);
+        TIntermTyped* tempSymR = intermediate.addSymbol(*rhsTempVar, loc);
+        TIntermTyped* index = intermediate.addConstantUnion(Y, loc);
+
+        TIntermTyped* lhsElement = intermediate.addIndex(EOpIndexDirect, tempSymL, index, loc);
+        TIntermTyped* rhsElement = intermediate.addIndex(EOpIndexDirect, tempSymR, index, loc);
+
+        const TType derefType(right->getType(), 0);
+    
+        lhsElement->setType(derefType);
+        rhsElement->setType(derefType);
+
+        TIntermTyped* yNeg = intermediate.addUnaryMath(EOpNegative, rhsElement, loc);
+
+        assignList = intermediate.growAggregate(assignList, intermediate.addAssign(EOpAssign, lhsElement, yNeg, loc));
+    }
+
+    // Assign the rhs temp (now with Y inversion) to the final output
+    {
+        TIntermTyped* rhsTempSym = intermediate.addSymbol(*rhsTempVar, loc);
+        assignList = intermediate.growAggregate(assignList, intermediate.addAssign(op, left, rhsTempSym, loc));
+    }
+
+    assert(assignList != nullptr);
+    assignList->setOperator(EOpSequence);
+
+    return assignList;
+}
+    
+// Clip and cull distance require special handling due to a semantic mismatch.  In HLSL,
+// these can be float scalar, float vector, or arrays of float scalar or float vector.
+// In SPIR-V, they are arrays of scalar floats in all cases.  We must copy individual components
+// (e.g, both x and y components of a float2) out into the destination float array.
+//
+// The values are assigned to sequential members of the output array.  The inner dimension
+// is vector components.  The outer dimension is array elements.
+TIntermAggregate* HlslParseContext::assignClipCullDistance(const TSourceLoc& loc, TOperator op, int semanticId,
+                                                           TIntermTyped* left, TIntermTyped* right)
+{
+    switch (language) {
+    case EShLangFragment:
+    case EShLangVertex:
+    case EShLangGeometry:
+        break;
+    default:
+        error(loc, "unimplemented: clip/cull not currently implemented for this stage", "", "");
+        return nullptr;
+    }
+
+    TVariable** clipCullVar = nullptr;
+
+    // Figure out if we are assigning to, or from, clip or cull distance.
+    const bool isOutput = isClipOrCullDistance(left->getType());
+
+    // This is the rvalue or lvalue holding the clip or cull distance.
+    TIntermTyped* clipCullNode = isOutput ? left : right;
+    // This is the value going into or out of the clip or cull distance.
+    TIntermTyped* internalNode = isOutput ? right : left;
+
+    const TBuiltInVariable builtInType = clipCullNode->getQualifier().builtIn;
+
+    decltype(clipSemanticNSizeIn)* semanticNSize = nullptr;
+
+    // Refer to either the clip or the cull distance, depending on semantic.
+    switch (builtInType) {
+    case EbvClipDistance:
+        clipCullVar = isOutput ? &clipDistanceOutput : &clipDistanceInput;
+        semanticNSize = isOutput ? &clipSemanticNSizeOut : &clipSemanticNSizeIn;
+        break;
+    case EbvCullDistance:
+        clipCullVar = isOutput ? &cullDistanceOutput : &cullDistanceInput;
+        semanticNSize = isOutput ? &cullSemanticNSizeOut : &cullSemanticNSizeIn;
+        break;
+
+    // called invalidly: we expected a clip or a cull distance.
+    // static compile time problem: should not happen.
+    default: assert(0); return nullptr;
+    }
+
+    // This is the offset in the destination array of a given semantic's data
+    std::array<int, maxClipCullRegs> semanticOffset;
+
+    // Calculate offset of variable of semantic N in destination array
+    int arrayLoc = 0;
+    int vecItems = 0;
+
+    for (int x = 0; x < maxClipCullRegs; ++x) {
+        // See if we overflowed the vec4 packing
+        if ((vecItems + (*semanticNSize)[x]) > 4) {
+            arrayLoc = (arrayLoc + 3) & (~0x3); // round up to next multiple of 4
+            vecItems = 0;
+        }
+
+        semanticOffset[x] = arrayLoc;
+        vecItems += (*semanticNSize)[x];
+        arrayLoc += (*semanticNSize)[x];
+    }
+ 
+
+    // It can have up to 2 array dimensions (in the case of geometry shader inputs)
+    const TArraySizes* const internalArraySizes = internalNode->getType().getArraySizes();
+    const int internalArrayDims = internalNode->getType().isArray() ? internalArraySizes->getNumDims() : 0;
+    // vector sizes:
+    const int internalVectorSize = internalNode->getType().getVectorSize();
+    // array sizes, or 1 if it's not an array:
+    const int internalInnerArraySize = (internalArrayDims > 0 ? internalArraySizes->getDimSize(internalArrayDims-1) : 1);
+    const int internalOuterArraySize = (internalArrayDims > 1 ? internalArraySizes->getDimSize(0) : 1);
+
+    // The created type may be an array of arrays, e.g, for geometry shader inputs.
+    const bool isImplicitlyArrayed = (language == EShLangGeometry && !isOutput);
+
+    // If we haven't created the output already, create it now.
+    if (*clipCullVar == nullptr) {
+        // ClipDistance and CullDistance are handled specially in the entry point input/output copy
+        // algorithm, because they may need to be unpacked from components of vectors (or a scalar)
+        // into a float array, or vice versa.  Here, we make the array the right size and type,
+        // which depends on the incoming data, which has several potential dimensions:
+        //    * Semantic ID
+        //    * vector size 
+        //    * array size
+        // Of those, semantic ID and array size cannot appear simultaneously.
+        //
+        // Also to note: for implicitly arrayed forms (e.g, geometry shader inputs), we need to create two
+        // array dimensions.  The shader's declaration may have one or two array dimensions.  One is always
+        // the geometry's dimension.
+
+        const bool useInnerSize = internalArrayDims > 1 || !isImplicitlyArrayed;
+
+        const int requiredInnerArraySize = arrayLoc * (useInnerSize ? internalInnerArraySize : 1);
+        const int requiredOuterArraySize = (internalArrayDims > 0) ? internalArraySizes->getDimSize(0) : 1;
+
+        TType clipCullType(EbtFloat, clipCullNode->getType().getQualifier().storage, 1);
+        clipCullType.getQualifier() = clipCullNode->getType().getQualifier();
+
+        // Create required array dimension
+        TArraySizes* arraySizes = new TArraySizes;
+        if (isImplicitlyArrayed)
+            arraySizes->addInnerSize(requiredOuterArraySize);
+        arraySizes->addInnerSize(requiredInnerArraySize);
+        clipCullType.transferArraySizes(arraySizes);
+
+        // Obtain symbol name: we'll use that for the symbol we introduce.
+        TIntermSymbol* sym = clipCullNode->getAsSymbolNode();
+        assert(sym != nullptr);
+
+        // We are moving the semantic ID from the layout location, so it is no longer needed or
+        // desired there.
+        clipCullType.getQualifier().layoutLocation = TQualifier::layoutLocationEnd;
+
+        // Create variable and track its linkage
+        *clipCullVar = makeInternalVariable(sym->getName().c_str(), clipCullType);
+
+        trackLinkage(**clipCullVar);
+    }
+
+    // Create symbol for the clip or cull variable.
+    TIntermSymbol* clipCullSym = intermediate.addSymbol(**clipCullVar);
+
+    // vector sizes:
+    const int clipCullVectorSize = clipCullSym->getType().getVectorSize();
+
+    // array sizes, or 1 if it's not an array:
+    const TArraySizes* const clipCullArraySizes = clipCullSym->getType().getArraySizes();
+    const int clipCullOuterArraySize = isImplicitlyArrayed ? clipCullArraySizes->getDimSize(0) : 1;
+    const int clipCullInnerArraySize = clipCullArraySizes->getDimSize(isImplicitlyArrayed ? 1 : 0);
+
+    // clipCullSym has got to be an array of scalar floats, per SPIR-V semantics.
+    // fixBuiltInIoType() should have handled that upstream.
+    assert(clipCullSym->getType().isArray());
+    assert(clipCullSym->getType().getVectorSize() == 1);
+    assert(clipCullSym->getType().getBasicType() == EbtFloat);
+
+    // We may be creating multiple sub-assignments.  This is an aggregate to hold them.
+    // TODO: it would be possible to be clever sometimes and avoid the sequence node if not needed.
+    TIntermAggregate* assignList = nullptr;
+
+    // Holds individual component assignments as we make them.
+    TIntermTyped* clipCullAssign = nullptr;
+
+    // If the types are homomorphic, use a simple assign.  No need to mess about with 
+    // individual components.
+    if (clipCullSym->getType().isArray() == internalNode->getType().isArray() &&
+        clipCullInnerArraySize == internalInnerArraySize &&
+        clipCullOuterArraySize == internalOuterArraySize &&
+        clipCullVectorSize == internalVectorSize) {
+
+        if (isOutput)
+            clipCullAssign = intermediate.addAssign(op, clipCullSym, internalNode, loc);
+        else
+            clipCullAssign = intermediate.addAssign(op, internalNode, clipCullSym, loc);
+
+        assignList = intermediate.growAggregate(assignList, clipCullAssign);
+        assignList->setOperator(EOpSequence);
+
+        return assignList;
+    }
+
+    // We are going to copy each component of the internal (per array element if indicated) to sequential
+    // array elements of the clipCullSym.  This tracks the lhs element we're writing to as we go along.
+    // We may be starting in the middle - e.g, for a non-zero semantic ID calculated above.
+    int clipCullInnerArrayPos = semanticOffset[semanticId];
+    int clipCullOuterArrayPos = 0;
+
+    // Lambda to add an index to a node, set the type of the result, and return the new node.
+    const auto addIndex = [this, &loc](TIntermTyped* node, int pos) -> TIntermTyped* {
+        const TType derefType(node->getType(), 0);
+        node = intermediate.addIndex(EOpIndexDirect, node, intermediate.addConstantUnion(pos, loc), loc);
+        node->setType(derefType);
+        return node;
+    };
+
+    // Loop through every component of every element of the internal, and copy to or from the matching external.
+    for (int internalOuterArrayPos = 0; internalOuterArrayPos < internalOuterArraySize; ++internalOuterArrayPos) {
+        for (int internalInnerArrayPos = 0; internalInnerArrayPos < internalInnerArraySize; ++internalInnerArrayPos) {
+            for (int internalComponent = 0; internalComponent < internalVectorSize; ++internalComponent) {
+                // clip/cull array member to read from / write to:
+                TIntermTyped* clipCullMember = clipCullSym;
+
+                // If implicitly arrayed, there is an outer array dimension involved
+                if (isImplicitlyArrayed)
+                    clipCullMember = addIndex(clipCullMember, clipCullOuterArrayPos);
+
+                // Index into proper array position for clip cull member
+                clipCullMember = addIndex(clipCullMember, clipCullInnerArrayPos++);
+
+                // if needed, start over with next outer array slice.
+                if (isImplicitlyArrayed && clipCullInnerArrayPos >= clipCullInnerArraySize) {
+                    clipCullInnerArrayPos = semanticOffset[semanticId];
+                    ++clipCullOuterArrayPos;
+                }
+
+                // internal member to read from / write to:
+                TIntermTyped* internalMember = internalNode;
+
+                // If internal node has outer array dimension, index appropriately.
+                if (internalArrayDims > 1)
+                    internalMember = addIndex(internalMember, internalOuterArrayPos);
+
+                // If internal node has inner array dimension, index appropriately.
+                if (internalArrayDims > 0)
+                    internalMember = addIndex(internalMember, internalInnerArrayPos);
+
+                // If internal node is a vector, extract the component of interest.
+                if (internalNode->getType().isVector())
+                    internalMember = addIndex(internalMember, internalComponent);
+
+                // Create an assignment: output from internal to clip cull, or input from clip cull to internal.
+                if (isOutput)
+                    clipCullAssign = intermediate.addAssign(op, clipCullMember, internalMember, loc);
+                else
+                    clipCullAssign = intermediate.addAssign(op, internalMember, clipCullMember, loc);
+
+                // Track assignment in the sequence.
+                assignList = intermediate.growAggregate(assignList, clipCullAssign);
+            }
+        }
+    }
+
+    assert(assignList != nullptr);
+    assignList->setOperator(EOpSequence);
+
+    return assignList;
+}
+
 // Some simple source assignments need to be flattened to a sequence
 // of AST assignments. Catch these and flatten, otherwise, pass through
 // to intermediate.addAssign().
 //
 // Also, assignment to matrix swizzles requires multiple component assignments,
 // intercept those as well.
-TIntermTyped* HlslParseContext::handleAssign(const TSourceLoc& loc, TOperator op, TIntermTyped* left, TIntermTyped* right)
+TIntermTyped* HlslParseContext::handleAssign(const TSourceLoc& loc, TOperator op, TIntermTyped* left,
+                                             TIntermTyped* right)
 {
     if (left == nullptr || right == nullptr)
         return nullptr;
 
+    // writing to opaques will require fixing transforms
+    if (left->getType().containsOpaque())
+        intermediate.setNeedsLegalization();
+
     if (left->getAsOperator() && left->getAsOperator()->getOp() == EOpMatrixSwizzle)
         return handleAssignToMatrixSwizzle(loc, op, left, right);
 
-    const bool isSplitLeft    = wasSplit(left);
-    const bool isSplitRight   = wasSplit(right);
+    // Return true if the given node is an index operation into a split variable.
+    const auto indexesSplit = [this](const TIntermTyped* node) -> bool {
+        const TIntermBinary* binaryNode = node->getAsBinaryNode();
+
+        if (binaryNode == nullptr)
+            return false;
+
+        return (binaryNode->getOp() == EOpIndexDirect || binaryNode->getOp() == EOpIndexIndirect) && 
+               wasSplit(binaryNode->getLeft());
+    };
+
+    // Return true if this stage assigns clip position with potentially inverted Y
+    const auto assignsClipPos = [this](const TIntermTyped* node) -> bool {
+        return node->getType().getQualifier().builtIn == EbvPosition &&
+               (language == EShLangVertex || language == EShLangGeometry || language == EShLangTessEvaluation);
+    };
+
+    const bool isSplitLeft    = wasSplit(left) || indexesSplit(left);
+    const bool isSplitRight   = wasSplit(right) || indexesSplit(right);
 
     const bool isFlattenLeft  = wasFlattened(left);
     const bool isFlattenRight = wasFlattened(right);
 
-    // OK to do a single assign if both are split, or both are unsplit.  But if one is and the other
-    // isn't, we fall back to a member-wise copy.
-    if (! isFlattenLeft && ! isFlattenRight && !isSplitLeft && !isSplitRight)
+    // OK to do a single assign if neither side is split or flattened.  Otherwise, 
+    // fall through to a member-wise copy.
+    if (!isFlattenLeft && !isFlattenRight && !isSplitLeft && !isSplitRight) {
+        // Clip and cull distance requires more processing.  See comment above assignClipCullDistance.
+        if (isClipOrCullDistance(left->getType()) || isClipOrCullDistance(right->getType())) {
+            const bool isOutput = isClipOrCullDistance(left->getType());
+
+            const int semanticId = (isOutput ? left : right)->getType().getQualifier().layoutLocation;
+            return assignClipCullDistance(loc, op, semanticId, left, right);
+        } else if (assignsClipPos(left)) {
+            // Position can require special handling: see comment above assignPosition
+            return assignPosition(loc, op, left, right);
+        } else if (left->getQualifier().builtIn == EbvSampleMask) {
+            // Certain builtins are required to be arrayed outputs in SPIR-V, but may internally be scalars
+            // in the shader.  Copy the scalar RHS into the LHS array element zero, if that happens.
+            if (left->isArray() && !right->isArray()) {
+                const TType derefType(left->getType(), 0);
+                left = intermediate.addIndex(EOpIndexDirect, left, intermediate.addConstantUnion(0, loc), loc);
+                left->setType(derefType);
+                // Fall through to add assign.
+            }
+        }
+
         return intermediate.addAssign(op, left, right, loc);
+    }
 
     TIntermAggregate* assignList = nullptr;
     const TVector<TVariable*>* leftVariables = nullptr;
@@ -2158,7 +2725,7 @@
 
     // A temporary to store the right node's value, so we don't keep indirecting into it
     // if it's not a simple symbol.
-    TVariable*     rhsTempVar   = nullptr;
+    TVariable* rhsTempVar = nullptr;
 
     // If the RHS is a simple symbol node, we'll copy it for each member.
     TIntermSymbol* cloneSymNode = nullptr;
@@ -2195,55 +2762,76 @@
                 TIntermTyped* noFlattenRHS = intermediate.addSymbol(*rhsTempVar, loc);
 
                 // Add this to the aggregate being built.
-                assignList = intermediate.growAggregate(assignList, intermediate.addAssign(op, noFlattenRHS, right, loc), loc);
+                assignList = intermediate.growAggregate(assignList,
+                                                        intermediate.addAssign(op, noFlattenRHS, right, loc), loc);
             }
         }
     }
 
-    int memberIdx = 0;
-
-    // When dealing with split arrayed structures of builtins, the arrayness is moved to the extracted builtin
+    // When dealing with split arrayed structures of built-ins, the arrayness is moved to the extracted built-in
     // variables, which is awkward when copying between split and unsplit structures.  This variable tracks
     // array indirections so they can be percolated from outer structs to inner variables.
     std::vector <int> arrayElement;
 
-    // We track the outer-most aggregate, so that we can use its storage class later.
-    const TIntermTyped* outerLeft  = left;
-    const TIntermTyped* outerRight = right;
+    TStorageQualifier leftStorage = left->getType().getQualifier().storage;
+    TStorageQualifier rightStorage = right->getType().getQualifier().storage;
 
-    const auto getMember = [&](bool isLeft, TIntermTyped* node, int member, TIntermTyped* splitNode, int splitMember) -> TIntermTyped * {
+    int leftOffset = findSubtreeOffset(*left);
+    int rightOffset = findSubtreeOffset(*right);
+
+    const auto getMember = [&](bool isLeft, const TType& type, int member, TIntermTyped* splitNode, int splitMember,
+                               bool flattened)
+                           -> TIntermTyped * {
+        const bool split     = isLeft ? isSplitLeft   : isSplitRight;
+
         TIntermTyped* subTree;
+        const TType derefType(type, member);
+        const TVariable* builtInVar = nullptr;
+        if ((flattened || split) && derefType.isBuiltIn()) {
+            auto splitPair = splitBuiltIns.find(HlslParseContext::tInterstageIoData(
+                                                   derefType.getQualifier().builtIn,
+                                                   isLeft ? leftStorage : rightStorage));
+            if (splitPair != splitBuiltIns.end())
+                builtInVar = splitPair->second;
+        }
+        if (builtInVar != nullptr) {
+            // copy from interstage IO built-in if needed
+            subTree = intermediate.addSymbol(*builtInVar);
 
-        const bool flattened      = isLeft ? isFlattenLeft : isFlattenRight;
-        const bool split          = isLeft ? isSplitLeft : isSplitRight;
-        const TIntermTyped* outer = isLeft ? outerLeft   : outerRight;
-        const TVector<TVariable*>& flatVariables      = isLeft ? *leftVariables : *rightVariables;
+            if (subTree->getType().isArray()) {
+                // Arrayness of builtIn symbols isn't handled by the normal recursion:
+                // it's been extracted and moved to the built-in.
+                if (!arrayElement.empty()) {
+                    const TType splitDerefType(subTree->getType(), arrayElement.back());
+                    subTree = intermediate.addIndex(EOpIndexDirect, subTree,
+                                                    intermediate.addConstantUnion(arrayElement.back(), loc), loc);
+                    subTree->setType(splitDerefType);
+                } else if (splitNode->getAsOperator() != nullptr && (splitNode->getAsOperator()->getOp() == EOpIndexIndirect)) {
+                    // This might also be a stage with arrayed outputs, in which case there's an index
+                    // operation we should transfer to the output builtin.
 
-        // Index operator if it's an aggregate, else EOpNull
-        const TOperator op = node->getType().isArray()  ? EOpIndexDirect : 
-                             node->getType().isStruct() ? EOpIndexDirectStruct : EOpNull;
-
-        const TType derefType(node->getType(), member);
-
-        if (split && derefType.isBuiltInInterstageIO(language)) {
-            // copy from interstage IO builtin if needed
-            subTree = intermediate.addSymbol(*interstageBuiltInIo.find(HlslParseContext::tInterstageIoData(derefType, outer->getType()))->second);
-
-            // Arrayness of builtIn symbols isn't handled by the normal recursion: it's been extracted and moved to the builtin.
-            if (subTree->getType().isArray() && !arrayElement.empty()) {
-                const TType splitDerefType(subTree->getType(), arrayElement.back());
-                subTree = intermediate.addIndex(EOpIndexDirect, subTree, intermediate.addConstantUnion(arrayElement.back(), loc), loc);
-                subTree->setType(splitDerefType);
+                    const TType splitDerefType(subTree->getType(), 0);
+                    subTree = intermediate.addIndex(splitNode->getAsOperator()->getOp(), subTree,
+                                                    splitNode->getAsBinaryNode()->getRight(), loc);
+                    subTree->setType(splitDerefType);
+                }
             }
-        } else if (flattened && isFinalFlattening(derefType)) {
-            subTree = intermediate.addSymbol(*flatVariables[memberIdx++]);
+        } else if (flattened && !shouldFlatten(derefType, isLeft ? leftStorage : rightStorage, false)) {
+            if (isLeft)
+                subTree = intermediate.addSymbol(*(*leftVariables)[leftOffset++]);
+            else
+                subTree = intermediate.addSymbol(*(*rightVariables)[rightOffset++]);
         } else {
-            if (op == EOpNull) {
+            // Index operator if it's an aggregate, else EOpNull
+            const TOperator accessOp = type.isArray()  ? EOpIndexDirect
+                                     : type.isStruct() ? EOpIndexDirectStruct
+                                     : EOpNull;
+            if (accessOp == EOpNull) {
                 subTree = splitNode;
             } else {
+                subTree = intermediate.addIndex(accessOp, splitNode, intermediate.addConstantUnion(splitMember, loc),
+                                                loc);
                 const TType splitDerefType(splitNode->getType(), splitMember);
-
-                subTree = intermediate.addIndex(op, splitNode, intermediate.addConstantUnion(splitMember, loc), loc);
                 subTree->setType(splitDerefType);
             }
         }
@@ -2253,40 +2841,55 @@
 
     // Use the proper RHS node: a new symbol from a TVariable, copy
     // of an TIntermSymbol node, or sometimes the right node directly.
-    right = rhsTempVar   ? intermediate.addSymbol(*rhsTempVar, loc) :
-            cloneSymNode ? intermediate.addSymbol(*cloneSymNode) :
+    right = rhsTempVar != nullptr   ? intermediate.addSymbol(*rhsTempVar, loc) :
+            cloneSymNode != nullptr ? intermediate.addSymbol(*cloneSymNode) :
             right;
 
     // Cannot use auto here, because this is recursive, and auto can't work out the type without seeing the
     // whole thing.  So, we'll resort to an explicit type via std::function.
-    const std::function<void(TIntermTyped* left, TIntermTyped* right, TIntermTyped* splitLeft, TIntermTyped* splitRight)>
-    traverse = [&](TIntermTyped* left, TIntermTyped* right, TIntermTyped* splitLeft, TIntermTyped* splitRight) -> void {
+    const std::function<void(TIntermTyped* left, TIntermTyped* right, TIntermTyped* splitLeft, TIntermTyped* splitRight,
+                             bool topLevel)>
+    traverse = [&](TIntermTyped* left, TIntermTyped* right, TIntermTyped* splitLeft, TIntermTyped* splitRight,
+                   bool topLevel) -> void {
         // If we get here, we are assigning to or from a whole array or struct that must be
         // flattened, so have to do member-by-member assignment:
 
-        if (left->getType().isArray() || right->getType().isArray()) {
-            const int elementsL = left->getType().isArray() ? left->getType().getOuterArraySize() : 1;
+        bool shouldFlattenSubsetLeft = isFlattenLeft && shouldFlatten(left->getType(), leftStorage, topLevel);
+        bool shouldFlattenSubsetRight = isFlattenRight && shouldFlatten(right->getType(), rightStorage, topLevel);
+
+        if ((left->getType().isArray() || right->getType().isArray()) &&
+              (shouldFlattenSubsetLeft  || isSplitLeft ||
+               shouldFlattenSubsetRight || isSplitRight)) {
+            const int elementsL = left->getType().isArray()  ? left->getType().getOuterArraySize()  : 1;
             const int elementsR = right->getType().isArray() ? right->getType().getOuterArraySize() : 1;
 
-            // The arrays may not be the same size, e.g, if the size has been forced for EbvTessLevelInner or Outer.
+            // The arrays might not be the same size,
+            // e.g., if the size has been forced for EbvTessLevelInner/Outer.
             const int elementsToCopy = std::min(elementsL, elementsR);
 
             // array case
-            for (int element=0; element < elementsToCopy; ++element) {
+            for (int element = 0; element < elementsToCopy; ++element) {
                 arrayElement.push_back(element);
 
                 // Add a new AST symbol node if we have a temp variable holding a complex RHS.
-                TIntermTyped* subLeft  = getMember(true,  left,  element, left, element);
-                TIntermTyped* subRight = getMember(false, right, element, right, element);
+                TIntermTyped* subLeft  = getMember(true,  left->getType(),  element, left, element,
+                                                   shouldFlattenSubsetLeft);
+                TIntermTyped* subRight = getMember(false, right->getType(), element, right, element,
+                                                   shouldFlattenSubsetRight);
 
-                TIntermTyped* subSplitLeft =  isSplitLeft  ? getMember(true,  left,  element, splitLeft, element) : subLeft;
-                TIntermTyped* subSplitRight = isSplitRight ? getMember(false, right, element, splitRight, element) : subRight; 
+                TIntermTyped* subSplitLeft =  isSplitLeft  ? getMember(true,  left->getType(),  element, splitLeft,
+                                                                       element, shouldFlattenSubsetLeft)
+                                                           : subLeft;
+                TIntermTyped* subSplitRight = isSplitRight ? getMember(false, right->getType(), element, splitRight,
+                                                                       element, shouldFlattenSubsetRight)
+                                                           : subRight;
 
-                traverse(subLeft, subRight, subSplitLeft, subSplitRight);
+                traverse(subLeft, subRight, subSplitLeft, subSplitRight, false);
 
                 arrayElement.pop_back();
             }
-        } else if (left->getType().isStruct()) {
+        } else if (left->getType().isStruct() && (shouldFlattenSubsetLeft  || isSplitLeft ||
+                                                  shouldFlattenSubsetRight || isSplitRight)) {
             // struct case
             const auto& membersL = *left->getType().getStruct();
             const auto& membersR = *right->getType().getStruct();
@@ -2304,27 +2907,57 @@
                 const TType& typeL = *membersL[member].type;
                 const TType& typeR = *membersR[member].type;
 
-                TIntermTyped* subLeft  = getMember(true,  left, member, left, member);
-                TIntermTyped* subRight = getMember(false, right, member, right, member);
+                TIntermTyped* subLeft  = getMember(true,  left->getType(), member, left, member,
+                                                   shouldFlattenSubsetLeft);
+                TIntermTyped* subRight = getMember(false, right->getType(), member, right, member,
+                                                   shouldFlattenSubsetRight);
 
                 // If there is no splitting, use the same values to avoid inefficiency.
-                TIntermTyped* subSplitLeft =  isSplitLeft  ? getMember(true,  left,  member, splitLeft, memberL) : subLeft;
-                TIntermTyped* subSplitRight = isSplitRight ? getMember(false, right, member, splitRight, memberR) : subRight;
+                TIntermTyped* subSplitLeft =  isSplitLeft  ? getMember(true,  left->getType(),  member, splitLeft,
+                                                                       memberL, shouldFlattenSubsetLeft)
+                                                           : subLeft;
+                TIntermTyped* subSplitRight = isSplitRight ? getMember(false, right->getType(), member, splitRight,
+                                                                       memberR, shouldFlattenSubsetRight)
+                                                           : subRight;
 
-                // If this is the final flattening (no nested types below to flatten) we'll copy the member, else
-                // recurse into the type hierarchy.  However, if splitting the struct, that means we can copy a whole
-                // subtree here IFF it does not itself contain any interstage built-in IO variables, so we only have to
-                // recurse into it if there's something for splitting to do.  That can save a lot of AST verbosity for
-                // a bunch of memberwise copies.
-                if ((!isFlattenLeft && !isFlattenRight &&
-                     !typeL.containsBuiltInInterstageIO(language) && !typeR.containsBuiltInInterstageIO(language))) {
-                    assignList = intermediate.growAggregate(assignList, intermediate.addAssign(op, subSplitLeft, subSplitRight, loc), loc);
+                if (isClipOrCullDistance(subSplitLeft->getType()) || isClipOrCullDistance(subSplitRight->getType())) {
+                    // Clip and cull distance built-in assignment is complex in its own right, and is handled in
+                    // a separate function dedicated to that task.  See comment above assignClipCullDistance;
+
+                    const bool isOutput = isClipOrCullDistance(subSplitLeft->getType());
+
+                    // Since all clip/cull semantics boil down to the same built-in type, we need to get the
+                    // semantic ID from the dereferenced type's layout location, to avoid an N-1 mapping.
+                    const TType derefType((isOutput ? left : right)->getType(), member);
+                    const int semanticId = derefType.getQualifier().layoutLocation;
+
+                    TIntermAggregate* clipCullAssign = assignClipCullDistance(loc, op, semanticId,
+                                                                              subSplitLeft, subSplitRight);
+
+                    assignList = intermediate.growAggregate(assignList, clipCullAssign, loc);
+                } else if (assignsClipPos(subSplitLeft)) {
+                    // Position can require special handling: see comment above assignPosition
+                    TIntermTyped* positionAssign = assignPosition(loc, op, subSplitLeft, subSplitRight);
+                    assignList = intermediate.growAggregate(assignList, positionAssign, loc);
+                } else if (!shouldFlattenSubsetLeft && !shouldFlattenSubsetRight &&
+                           !typeL.containsBuiltIn() && !typeR.containsBuiltIn()) {
+                    // If this is the final flattening (no nested types below to flatten)
+                    // we'll copy the member, else recurse into the type hierarchy.
+                    // However, if splitting the struct, that means we can copy a whole
+                    // subtree here IFF it does not itself contain any interstage built-in
+                    // IO variables, so we only have to recurse into it if there's something
+                    // for splitting to do.  That can save a lot of AST verbosity for
+                    // a bunch of memberwise copies.
+
+                    assignList = intermediate.growAggregate(assignList,
+                                                            intermediate.addAssign(op, subSplitLeft, subSplitRight, loc),
+                                                            loc);
                 } else {
-                    traverse(subLeft, subRight, subSplitLeft, subSplitRight);
+                    traverse(subLeft, subRight, subSplitLeft, subSplitRight, false);
                 }
 
-                memberL += (typeL.isBuiltInInterstageIO(language) ? 0 : 1);
-                memberR += (typeR.isBuiltInInterstageIO(language) ? 0 : 1);
+                memberL += (typeL.isBuiltIn() ? 0 : 1);
+                memberR += (typeR.isBuiltIn() ? 0 : 1);
             }
         } else {
             // Member copy
@@ -2337,15 +2970,32 @@
     TIntermTyped* splitRight = right;
 
     // If either left or right was a split structure, we must read or write it, but still have to
-    // parallel-recurse through the unsplit structure to identify the builtin IO vars.
-    if (isSplitLeft)
-        splitLeft = intermediate.addSymbol(*getSplitIoVar(left), loc);
+    // parallel-recurse through the unsplit structure to identify the built-in IO vars.
+    // The left can be either a symbol, or an index into a symbol (e.g, array reference)
+    if (isSplitLeft) {
+        if (indexesSplit(left)) {
+            // Index case: Refer to the indexed symbol, if the left is an index operator.
+            const TIntermSymbol* symNode = left->getAsBinaryNode()->getLeft()->getAsSymbolNode();
+
+            TIntermTyped* splitLeftNonIo = intermediate.addSymbol(*getSplitNonIoVar(symNode->getId()), loc);
+
+            splitLeft = intermediate.addIndex(left->getAsBinaryNode()->getOp(), splitLeftNonIo,
+                                              left->getAsBinaryNode()->getRight(), loc);
+
+            const TType derefType(splitLeftNonIo->getType(), 0);
+            splitLeft->setType(derefType);
+        } else {
+            // Symbol case: otherwise, if not indexed, we have the symbol directly.
+            const TIntermSymbol* symNode = left->getAsSymbolNode();
+            splitLeft = intermediate.addSymbol(*getSplitNonIoVar(symNode->getId()), loc);
+        }
+    }
 
     if (isSplitRight)
-        splitRight = intermediate.addSymbol(*getSplitIoVar(right), loc);
+        splitRight = intermediate.addSymbol(*getSplitNonIoVar(right->getAsSymbolNode()->getId()), loc);
 
     // This makes the whole assignment, recursing through subtypes as needed.
-    traverse(left, right, splitLeft, splitRight);
+    traverse(left, right, splitLeft, splitRight, true);
 
     assert(assignList != nullptr);
     assignList->setOperator(EOpSequence);
@@ -2356,7 +3006,8 @@
 // An assignment to matrix swizzle must be decomposed into individual assignments.
 // These must be selected component-wise from the RHS and stored component-wise
 // into the LHS.
-TIntermTyped* HlslParseContext::handleAssignToMatrixSwizzle(const TSourceLoc& loc, TOperator op, TIntermTyped* left, TIntermTyped* right)
+TIntermTyped* HlslParseContext::handleAssignToMatrixSwizzle(const TSourceLoc& loc, TOperator op, TIntermTyped* left,
+                                                            TIntermTyped* right)
 {
     assert(left->getAsOperator() && left->getAsOperator()->getOp() == EOpMatrixSwizzle);
 
@@ -2438,7 +3089,8 @@
 //
 // Create a combined sampler/texture from separate sampler and texture.
 //
-TIntermAggregate* HlslParseContext::handleSamplerTextureCombine(const TSourceLoc& loc, TIntermTyped* argTex, TIntermTyped* argSampler)
+TIntermAggregate* HlslParseContext::handleSamplerTextureCombine(const TSourceLoc& loc, TIntermTyped* argTex,
+                                                                TIntermTyped* argSampler)
 {
     TIntermAggregate* txcombine = new TIntermAggregate(EOpConstructTextureSampler);
 
@@ -2447,7 +3099,66 @@
 
     TSampler samplerType = argTex->getType().getSampler();
     samplerType.combined = true;
-    samplerType.shadow   = argSampler->getType().getSampler().shadow;
+
+    // TODO:
+    // This block exists until the spec no longer requires shadow modes on texture objects.
+    // It can be deleted after that, along with the shadowTextureVariant member.
+    {
+        const bool shadowMode = argSampler->getType().getSampler().shadow;
+
+        TIntermSymbol* texSymbol = argTex->getAsSymbolNode();
+
+        if (texSymbol == nullptr)
+            texSymbol = argTex->getAsBinaryNode()->getLeft()->getAsSymbolNode();
+
+        if (texSymbol == nullptr) {
+            error(loc, "unable to find texture symbol", "", "");
+            return nullptr;
+        }
+
+        // This forces the texture's shadow state to be the sampler's
+        // shadow state.  This depends on downstream optimization to
+        // DCE one variant in [shadow, nonshadow] if both are present,
+        // or the SPIR-V module would be invalid.
+        int newId = texSymbol->getId();
+
+        // Check to see if this texture has been given a shadow mode already.
+        // If so, look up the one we already have.
+        const auto textureShadowEntry = textureShadowVariant.find(texSymbol->getId());
+
+        if (textureShadowEntry != textureShadowVariant.end())
+            newId = textureShadowEntry->second->get(shadowMode);
+        else
+            textureShadowVariant[texSymbol->getId()] = new tShadowTextureSymbols;
+
+        // Sometimes we have to create another symbol (if this texture has been seen before,
+        // and we haven't created the form for this shadow mode).
+        if (newId == -1) {
+            TType texType;
+            texType.shallowCopy(argTex->getType());
+            texType.getSampler().shadow = shadowMode;  // set appropriate shadow mode.
+            globalQualifierFix(loc, texType.getQualifier());
+
+            TVariable* newTexture = makeInternalVariable(texSymbol->getName(), texType);
+
+            trackLinkage(*newTexture);
+
+            newId = newTexture->getUniqueId();
+        }
+
+        assert(newId != -1);
+
+        if (textureShadowVariant.find(newId) == textureShadowVariant.end())
+            textureShadowVariant[newId] = textureShadowVariant[texSymbol->getId()];
+
+        textureShadowVariant[newId]->set(shadowMode, newId);
+
+        // Remember this shadow mode in the texture and the merged type.
+        argTex->getWritableType().getSampler().shadow = shadowMode;
+        samplerType.shadow = shadowMode;
+
+        texSymbol->switchId(newId);
+    }
 
     txcombine->setType(TType(samplerType, EvqTemporary));
     txcombine->setLoc(loc);
@@ -2456,21 +3167,34 @@
 }
 
 // Return true if this a buffer type that has an associated counter buffer.
-bool HlslParseContext::hasStructBuffCounter(const TString& name) const
+bool HlslParseContext::hasStructBuffCounter(const TType& type) const
 {
-    const auto bivIt = structBufferBuiltIn.find(name);
-    if (bivIt == structBufferBuiltIn.end())
-        return false;
-
-    switch (bivIt->second) {
+    switch (type.getQualifier().declaredBuiltIn) {
     case EbvAppendConsume:       // fall through...
     case EbvRWStructuredBuffer:  // ...
         return true;
     default:
-        return false; // the other structuredbfufer types do not have a counter.
+        return false; // the other structuredbuffer types do not have a counter.
     }
 }
 
+void HlslParseContext::counterBufferType(const TSourceLoc& loc, TType& type)
+{
+    // Counter type
+    TType* counterType = new TType(EbtUint, EvqBuffer);
+    counterType->setFieldName(intermediate.implicitCounterName);
+
+    TTypeList* blockStruct = new TTypeList;
+    TTypeLoc  member = { counterType, loc };
+    blockStruct->push_back(member);
+
+    TType blockType(blockStruct, "", counterType->getQualifier());
+    blockType.getQualifier().storage = EvqBuffer;
+
+    type.shallowCopy(blockType);
+    shareStructBufferType(type);
+}
+
 // declare counter for a structured buffer type
 void HlslParseContext::declareStructBufferCounter(const TSourceLoc& loc, const TType& bufferType, const TString& name)
 {
@@ -2478,25 +3202,17 @@
     if (! isStructBufferType(bufferType))
         return;
 
-    if (! hasStructBuffCounter(name))
+    if (! hasStructBuffCounter(bufferType))
         return;
 
-    // Counter type
-    TType* counterType = new TType(EbtInt, EvqBuffer);
-    counterType->setFieldName("@count");
+    TType blockType;
+    counterBufferType(loc, blockType);
 
-    TTypeList* blockStruct = new TTypeList;
-    TTypeLoc  member = { counterType, loc };
-    blockStruct->push_back(member);
+    TString* blockName = new TString(intermediate.addCounterBufferName(name));
 
-    TString* blockName = new TString(name);
-    *blockName += "@count";
-
+    // Counter buffer is not yet in use
     structBufferCounter[*blockName] = false;
 
-    TType blockType(blockStruct, "", counterType->getQualifier());
-    blockType.getQualifier().storage = EvqBuffer;
-
     shareStructBufferType(blockType);
     declareBlock(loc, blockType, blockName);
 }
@@ -2508,21 +3224,19 @@
     if (buffer == nullptr || ! isStructBufferType(buffer->getType()))
         return nullptr;
 
-    TString blockName(buffer->getAsSymbolNode()->getName());
-    blockName += "@count";
+    const TString counterBlockName(intermediate.addCounterBufferName(buffer->getAsSymbolNode()->getName()));
 
     // Mark the counter as being used
-    structBufferCounter[blockName] = true;
+    structBufferCounter[counterBlockName] = true;
 
-    TIntermTyped* counterVar = handleVariable(loc, &blockName);  // find the block structure
+    TIntermTyped* counterVar = handleVariable(loc, &counterBlockName);  // find the block structure
     TIntermTyped* index = intermediate.addConstantUnion(0, loc); // index to counter inside block struct
 
     TIntermTyped* counterMember = intermediate.addIndex(EOpIndexDirectStruct, counterVar, index, loc);
-    counterMember->setType(TType(EbtInt));
+    counterMember->setType(TType(EbtUint));
     return counterMember;
 }
 
-
 //
 // Decompose structure buffer methods into AST
 //
@@ -2549,12 +3263,10 @@
     if (bufferObj == nullptr || bufferObj->getAsSymbolNode() == nullptr)
         return;
 
-    const TString bufferName(bufferObj->getAsSymbolNode()->getName());
-
     // Some methods require a hidden internal counter, obtained via getStructBufferCounter().
     // This lambda adds something to it and returns the old value.
     const auto incDecCounter = [&](int incval) -> TIntermTyped* {
-        TIntermTyped* incrementValue = intermediate.addConstantUnion(incval, loc, true);
+        TIntermTyped* incrementValue = intermediate.addConstantUnion(static_cast<unsigned int>(incval), loc, true);
         TIntermTyped* counter = getStructBufferCounter(loc, bufferObj); // obtain the counter member
 
         if (counter == nullptr)
@@ -2579,24 +3291,19 @@
         {
             TIntermTyped* argIndex = makeIntegerIndex(argAggregate->getSequence()[1]->getAsTyped());  // index
 
-            const auto bivIt = structBufferBuiltIn.find(bufferName);
-
-            const TBuiltInVariable builtInType = (bivIt != structBufferBuiltIn.end()) ? bivIt->second : EbvNone;
-
             const TType& bufferType = bufferObj->getType();
 
+            const TBuiltInVariable builtInType = bufferType.getQualifier().declaredBuiltIn;
+
             // Byte address buffers index in bytes (only multiples of 4 permitted... not so much a byte address
             // buffer then, but that's what it calls itself.
-            // TODO: it would be easier to track the declared (pre-sanitized) builtInType in the TType.
-            //       If/when that happens, this should be simplified to look *only* at the builtin type.
             const bool isByteAddressBuffer = (builtInType == EbvByteAddressBuffer   || 
-                                              builtInType == EbvRWByteAddressBuffer ||
-                                              (builtInType == EbvNone && !bufferType.isVector() &&
-                                               bufferType.getBasicType() == EbtUint));
+                                              builtInType == EbvRWByteAddressBuffer);
                 
 
             if (isByteAddressBuffer)
-                argIndex = intermediate.addBinaryNode(EOpRightShift, argIndex, intermediate.addConstantUnion(2, loc, true),
+                argIndex = intermediate.addBinaryNode(EOpRightShift, argIndex,
+                                                      intermediate.addConstantUnion(2, loc, true),
                                                       loc, TType(EbtInt));
 
             // Index into the array to find the item being loaded.
@@ -2631,7 +3338,8 @@
             // First, we'll store the address in a variable to avoid multiple shifts
             // (we must convert the byte address to an item address)
             TIntermTyped* byteAddrIdx = intermediate.addBinaryNode(EOpRightShift, argIndex,
-                                                                   intermediate.addConstantUnion(2, loc, true), loc, TType(EbtInt));
+                                                                   intermediate.addConstantUnion(2, loc, true),
+                                                                   loc, TType(EbtInt));
 
             TVariable* byteAddrSym = makeInternalVariable("byteAddrTemp", TType(EbtInt, EvqTemporary));
             TIntermTyped* byteAddrIdxVar = intermediate.addSymbol(*byteAddrSym, loc);
@@ -2647,12 +3355,20 @@
 
                 // add index offset
                 if (idx != 0)
-                    offsetIdx = intermediate.addBinaryNode(EOpAdd, offsetIdx, intermediate.addConstantUnion(idx, loc, true),
+                    offsetIdx = intermediate.addBinaryNode(EOpAdd, offsetIdx,
+                                                           intermediate.addConstantUnion(idx, loc, true),
                                                            loc, TType(EbtInt));
 
-                const TOperator idxOp = (offsetIdx->getQualifier().storage == EvqConst) ? EOpIndexDirect : EOpIndexIndirect;
+                const TOperator idxOp = (offsetIdx->getQualifier().storage == EvqConst) ? EOpIndexDirect
+                                                                                        : EOpIndexIndirect;
 
-                vec = intermediate.growAggregate(vec, intermediate.addIndex(idxOp, argArray, offsetIdx, loc));
+                TIntermTyped* indexVal = intermediate.addIndex(idxOp, argArray, offsetIdx, loc);
+
+                TType derefType(argArray->getType(), 0);
+                derefType.getQualifier().makeTemporary();
+                indexVal->setType(derefType);
+
+                vec = intermediate.growAggregate(vec, indexVal);
             }
 
             vec->setType(TType(argArray->getBasicType(), EvqTemporary, size));
@@ -2677,7 +3393,7 @@
 
             // Index into the array to find the item being loaded.
             // Byte address buffers index in bytes (only multiples of 4 permitted... not so much a byte address
-            // buffer then, but that's what it calls itself.
+            // buffer then, but that's what it calls itself).
 
             int size = 0;
 
@@ -2709,11 +3425,21 @@
                 if (idx != 0)
                     offsetIdx = intermediate.addBinaryNode(EOpAdd, offsetIdx, idxConst, loc, TType(EbtInt));
 
-                const TOperator idxOp = (offsetIdx->getQualifier().storage == EvqConst) ? EOpIndexDirect : EOpIndexIndirect;
+                const TOperator idxOp = (offsetIdx->getQualifier().storage == EvqConst) ? EOpIndexDirect
+                                                                                        : EOpIndexIndirect;
 
                 TIntermTyped* lValue = intermediate.addIndex(idxOp, argArray, offsetIdx, loc);
-                TIntermTyped* rValue = (size == 1) ? argValue :
-                    intermediate.addIndex(EOpIndexDirect, argValue, idxConst, loc);
+                const TType derefType(argArray->getType(), 0);
+                lValue->setType(derefType);
+
+                TIntermTyped* rValue;
+                if (size == 1) {
+                    rValue = argValue;
+                } else {
+                    rValue = intermediate.addIndex(EOpIndexDirect, argValue, idxConst, loc);
+                    const TType indexType(argValue->getType(), 0);
+                    rValue->setType(indexType);
+                }
                     
                 TIntermTyped* assign = intermediate.addAssign(EOpAssign, lValue, rValue, loc); 
 
@@ -2735,25 +3461,27 @@
             TIntermAggregate* body = nullptr;
 
             // Length output:
-            if (argArray->getType().isRuntimeSizedArray()) {
+            if (argArray->getType().isSizedArray()) {
+                const int length = argArray->getType().getOuterArraySize();
+                TIntermTyped* assign = intermediate.addAssign(EOpAssign, argNumItems,
+                                                              intermediate.addConstantUnion(length, loc, true), loc);
+                body = intermediate.growAggregate(body, assign, loc);
+            } else {
                 TIntermTyped* lengthCall = intermediate.addBuiltInFunctionCall(loc, EOpArrayLength, true, argArray,
                                                                                argNumItems->getType());
                 TIntermTyped* assign = intermediate.addAssign(EOpAssign, argNumItems, lengthCall, loc);
                 body = intermediate.growAggregate(body, assign, loc);
-            } else {
-                const int length = argArray->getType().getOuterArraySize();
-                TIntermTyped* assign = intermediate.addAssign(EOpAssign, argNumItems, intermediate.addConstantUnion(length, loc, true), loc);
-                body = intermediate.growAggregate(body, assign, loc);
             }
 
             // Stride output:
             if (argStride != nullptr) {
                 int size;
                 int stride;
-                intermediate.getBaseAlignment(argArray->getType(), size, stride, false,
-                                              argArray->getType().getQualifier().layoutMatrix == ElmRowMajor);
+                intermediate.getMemberAlignment(argArray->getType(), size, stride, argArray->getType().getQualifier().layoutPacking,
+                                                argArray->getType().getQualifier().layoutMatrix == ElmRowMajor);
 
-                TIntermTyped* assign = intermediate.addAssign(EOpAssign, argStride, intermediate.addConstantUnion(stride, loc, true), loc);
+                TIntermTyped* assign = intermediate.addAssign(EOpAssign, argStride,
+                                                              intermediate.addConstantUnion(stride, loc, true), loc);
 
                 body = intermediate.growAggregate(body, assign);
             }
@@ -2828,8 +3556,9 @@
         {
             TIntermTyped* oldCounter = incDecCounter(-1);
 
-            TIntermTyped* newCounter = intermediate.addBinaryNode(EOpAdd, oldCounter, intermediate.addConstantUnion(-1, loc, true), loc,
-                                                        oldCounter->getType());
+            TIntermTyped* newCounter = intermediate.addBinaryNode(EOpAdd, oldCounter,
+                                                                  intermediate.addConstantUnion(-1, loc, true), loc,
+                                                                  oldCounter->getType());
 
             node = intermediate.addIndex(EOpIndexIndirect, argArray, newCounter, loc);
 
@@ -2902,9 +3631,9 @@
     TType retType(EbtFloat, EvqConst, 2);
 
     if (numSamples != 1) {
-        TArraySizes arraySizes;
-        arraySizes.addInnerSize(numSamples);
-        retType.newArraySizes(arraySizes);
+        TArraySizes* arraySizes = new TArraySizes;
+        arraySizes->addInnerSize(numSamples);
+        retType.transferArraySizes(arraySizes);
     }
 
     return new TIntermConstantUnion(*values, retType);
@@ -2915,36 +3644,120 @@
 //
 void HlslParseContext::decomposeSampleMethods(const TSourceLoc& loc, TIntermTyped*& node, TIntermNode* arguments)
 {
-    if (!node || !node->getAsOperator())
+    if (node == nullptr || !node->getAsOperator())
         return;
 
-    const auto clampReturn = [&loc, &node, this](TIntermTyped* result, const TSampler& sampler) -> TIntermTyped* {
-        // Sampler return must always be a vec4, but we can construct a shorter vector
+    // Sampler return must always be a vec4, but we can construct a shorter vector or a structure from it.
+    const auto convertReturn = [&loc, &node, this](TIntermTyped* result, const TSampler& sampler) -> TIntermTyped* {
         result->setType(TType(node->getType().getBasicType(), EvqTemporary, node->getVectorSize()));
 
-        if (sampler.vectorSize < (unsigned)node->getVectorSize()) {
-            // Too many components.  Construct shorter vector from it.
-            const TType clampedType(result->getType().getBasicType(), EvqTemporary, sampler.vectorSize);
+        TIntermTyped* convertedResult = nullptr;
+        
+        TType retType;
+        getTextureReturnType(sampler, retType);
 
-            const TOperator op = intermediate.mapTypeToConstructorOp(clampedType);
+        if (retType.isStruct()) {
+            // For type convenience, conversionAggregate points to the convertedResult (we know it's an aggregate here)
+            TIntermAggregate* conversionAggregate = new TIntermAggregate;
+            convertedResult = conversionAggregate;
 
-            result = constructBuiltIn(clampedType, op, result, loc, false);
+            // Convert vector output to return structure.  We will need a temp symbol to copy the results to.
+            TVariable* structVar = makeInternalVariable("@sampleStructTemp", retType);
+
+            // We also need a temp symbol to hold the result of the texture.  We don't want to re-fetch the
+            // sample each time we'll index into the result, so we'll copy to this, and index into the copy.
+            TVariable* sampleShadow = makeInternalVariable("@sampleResultShadow", result->getType());
+
+            // Initial copy from texture to our sample result shadow.
+            TIntermTyped* shadowCopy = intermediate.addAssign(EOpAssign, intermediate.addSymbol(*sampleShadow, loc),
+                                                              result, loc);
+
+            conversionAggregate->getSequence().push_back(shadowCopy);
+
+            unsigned vec4Pos = 0;
+
+            for (unsigned m = 0; m < unsigned(retType.getStruct()->size()); ++m) {
+                const TType memberType(retType, m); // dereferenced type of the member we're about to assign.
+                
+                // Check for bad struct members.  This should have been caught upstream.  Complain, because
+                // wwe don't know what to do with it.  This algorithm could be generalized to handle
+                // other things, e.g, sub-structures, but HLSL doesn't allow them.
+                if (!memberType.isVector() && !memberType.isScalar()) {
+                    error(loc, "expected: scalar or vector type in texture structure", "", "");
+                    return nullptr;
+                }
+                    
+                // Index into the struct variable to find the member to assign.
+                TIntermTyped* structMember = intermediate.addIndex(EOpIndexDirectStruct,
+                                                                   intermediate.addSymbol(*structVar, loc),
+                                                                   intermediate.addConstantUnion(m, loc), loc);
+
+                structMember->setType(memberType);
+
+                // Assign each component of (possible) vector in struct member.
+                for (int component = 0; component < memberType.getVectorSize(); ++component) {
+                    TIntermTyped* vec4Member = intermediate.addIndex(EOpIndexDirect,
+                                                                     intermediate.addSymbol(*sampleShadow, loc),
+                                                                     intermediate.addConstantUnion(vec4Pos++, loc), loc);
+                    vec4Member->setType(TType(memberType.getBasicType(), EvqTemporary, 1));
+
+                    TIntermTyped* memberAssign = nullptr;
+
+                    if (memberType.isVector()) {
+                        // Vector member: we need to create an access chain to the vector component.
+
+                        TIntermTyped* structVecComponent = intermediate.addIndex(EOpIndexDirect, structMember,
+                                                                                 intermediate.addConstantUnion(component, loc), loc);
+                        
+                        memberAssign = intermediate.addAssign(EOpAssign, structVecComponent, vec4Member, loc);
+                    } else {
+                        // Scalar member: we can assign to it directly.
+                        memberAssign = intermediate.addAssign(EOpAssign, structMember, vec4Member, loc);
+                    }
+
+                    
+                    conversionAggregate->getSequence().push_back(memberAssign);
+                }
+            }
+
+            // Add completed variable so the expression results in the whole struct value we just built.
+            conversionAggregate->getSequence().push_back(intermediate.addSymbol(*structVar, loc));
+
+            // Make it a sequence.
+            intermediate.setAggregateOperator(conversionAggregate, EOpSequence, retType, loc);
+        } else {
+            // vector clamp the output if template vector type is smaller than sample result.
+            if (retType.getVectorSize() < node->getVectorSize()) {
+                // Too many components.  Construct shorter vector from it.
+                const TOperator op = intermediate.mapTypeToConstructorOp(retType);
+
+                convertedResult = constructBuiltIn(retType, op, result, loc, false);
+            } else {
+                // Enough components.  Use directly.
+                convertedResult = result;
+            }
         }
 
-        result->setLoc(loc);
-        return result;
+        convertedResult->setLoc(loc);
+        return convertedResult;
     };
 
     const TOperator op  = node->getAsOperator()->getOp();
     const TIntermAggregate* argAggregate = arguments ? arguments->getAsAggregate() : nullptr;
 
-    // Bail out if not a sampler method
+    // Bail out if not a sampler method.
+    // Note though this is odd to do before checking the op, because the op
+    // could be something that takes the arguments, and the function in question
+    // takes the result of the op.  So, this is not the final word.
     if (arguments != nullptr) {
-        if ((argAggregate != nullptr && argAggregate->getSequence()[0]->getAsTyped()->getBasicType() != EbtSampler))
-            return;
-
-        if (argAggregate == nullptr && arguments->getAsTyped()->getBasicType() != EbtSampler)
-            return;
+        if (argAggregate == nullptr) {
+            if (arguments->getAsTyped()->getBasicType() != EbtSampler)
+                return;
+        } else {
+            if (argAggregate->getSequence().size() == 0 ||
+                argAggregate->getSequence()[0]->getAsTyped()->getBasicType() != EbtSampler)
+                return;
+        }
     }
 
     switch (op) {
@@ -2992,7 +3805,7 @@
             tex->getSequence().push_back(constructCoord); // coordinate
             tex->getSequence().push_back(bias);           // bias
 
-            node = clampReturn(tex, sampler);
+            node = convertReturn(tex, sampler);
 
             break;
         }
@@ -3032,7 +3845,7 @@
             if (argOffset != nullptr)
                 txsample->getSequence().push_back(argOffset);
 
-            node = clampReturn(txsample, sampler);
+            node = convertReturn(txsample, sampler);
 
             break;
         }
@@ -3065,7 +3878,7 @@
             if (argOffset != nullptr)
                 txsample->getSequence().push_back(argOffset);
 
-            node = clampReturn(txsample, sampler);
+            node = convertReturn(txsample, sampler);
 
             break;
         }
@@ -3341,7 +4154,7 @@
                 txfetch->getSequence().push_back(argOffset);
             }
 
-            node = clampReturn(txfetch, sampler);
+            node = convertReturn(txfetch, sampler);
 
             break;
         }
@@ -3372,7 +4185,7 @@
             if (argOffset != nullptr)
                 txsample->getSequence().push_back(argOffset);
 
-            node = clampReturn(txsample, sampler);
+            node = convertReturn(txsample, sampler);
 
             break;
         }
@@ -3517,9 +4330,9 @@
             // we construct an array from the separate args.
             if (hasOffset4) {
                 TType arrayType(EbtInt, EvqTemporary, 2);
-                TArraySizes arraySizes;
-                arraySizes.addInnerSize(4);
-                arrayType.newArraySizes(arraySizes);
+                TArraySizes* arraySizes = new TArraySizes;
+                arraySizes->addInnerSize(4);
+                arrayType.transferArraySizes(arraySizes);
 
                 TIntermAggregate* initList = new TIntermAggregate(EOpNull);
 
@@ -3561,16 +4374,13 @@
             txquerylod->getSequence().push_back(txcombine);
             txquerylod->getSequence().push_back(argCoord);
 
-            TIntermTyped* lodComponent = intermediate.addConstantUnion(0, loc, true);
+            TIntermTyped* lodComponent = intermediate.addConstantUnion(
+                op == EOpMethodCalculateLevelOfDetail ? 0 : 1,
+                loc, true);
             TIntermTyped* lodComponentIdx = intermediate.addIndex(EOpIndexDirect, txquerylod, lodComponent, loc);
             lodComponentIdx->setType(TType(EbtFloat, EvqTemporary, 1));
-
             node = lodComponentIdx;
 
-            // We cannot currently obtain the unclamped LOD
-            if (op == EOpMethodCalculateLevelOfDetailUnclamped)
-                error(loc, "unimplemented: CalculateLevelOfDetailUnclamped", "", "");
-
             break;
         }
 
@@ -3641,6 +4451,25 @@
             break;
         }
 
+    case EOpSubpassLoad:
+        {
+            const TIntermTyped* argSubpass = 
+                argAggregate ? argAggregate->getSequence()[0]->getAsTyped() :
+                arguments->getAsTyped();
+
+            const TSampler& sampler = argSubpass->getType().getSampler();
+
+            // subpass load: the multisample form is overloaded.  Here, we convert that to
+            // the EOpSubpassLoadMS opcode.
+            if (argAggregate != nullptr && argAggregate->getSequence().size() > 1)
+                node->getAsOperator()->setOp(EOpSubpassLoadMS);
+
+            node = convertReturn(node, sampler);
+
+            break;
+        }
+        
+
     default:
         break; // most pass through unchanged
     }
@@ -3651,7 +4480,7 @@
 //
 void HlslParseContext::decomposeGeometryMethods(const TSourceLoc& loc, TIntermTyped*& node, TIntermNode* arguments)
 {
-    if (!node || !node->getAsOperator())
+    if (node == nullptr || !node->getAsOperator())
         return;
 
     const TOperator op  = node->getAsOperator()->getOp();
@@ -3660,35 +4489,42 @@
     switch (op) {
     case EOpMethodAppend:
         if (argAggregate) {
+            // Don't emit these for non-GS stage, since we won't have the gsStreamOutput symbol.
+            if (language != EShLangGeometry) {
+                node = nullptr;
+                return;
+            }
+
             TIntermAggregate* sequence = nullptr;
             TIntermAggregate* emit = new TIntermAggregate(EOpEmitVertex);
 
             emit->setLoc(loc);
             emit->setType(TType(EbtVoid));
 
-            // find the matching output
-            if (gsStreamOutput == nullptr) {
-                error(loc, "unable to find output symbol for Append()", "", "");
-                return;
-            }
+            TIntermTyped* data = argAggregate->getSequence()[1]->getAsTyped();
 
-            sequence = intermediate.growAggregate(sequence,
-                                                  handleAssign(loc, EOpAssign,
-                                                               intermediate.addSymbol(*gsStreamOutput, loc),
-                                                               argAggregate->getSequence()[1]->getAsTyped()),
-                                                  loc);
-
+            // This will be patched in finalization during finalizeAppendMethods()
+            sequence = intermediate.growAggregate(sequence, data, loc);
             sequence = intermediate.growAggregate(sequence, emit);
 
             sequence->setOperator(EOpSequence);
             sequence->setLoc(loc);
             sequence->setType(TType(EbtVoid));
+
+            gsAppends.push_back({sequence, loc});
+
             node = sequence;
         }
         break;
 
     case EOpMethodRestartStrip:
         {
+            // Don't emit these for non-GS stage, since we won't have the gsStreamOutput symbol.
+            if (language != EShLangGeometry) {
+                node = nullptr;
+                return;
+            }
+
             TIntermAggregate* cut = new TIntermAggregate(EOpEndPrimitive);
             cut->setLoc(loc);
             cut->setType(TType(EbtVoid));
@@ -3727,6 +4563,22 @@
         return imageAggregate != nullptr && imageAggregate->getOp() == EOpImageLoad;
     };
 
+    const auto lookupBuiltinVariable = [&](const char* name, TBuiltInVariable builtin, TType& type) -> TIntermTyped* {
+        TSymbol* symbol = symbolTable.find(name);
+        if (nullptr == symbol) {
+            type.getQualifier().builtIn = builtin;
+
+            TVariable* variable = new TVariable(new TString(name), type);
+
+            symbolTable.insert(*variable);
+
+            symbol = symbolTable.find(name);
+            assert(symbol && "Inserted symbol could not be found!");
+        }
+
+        return intermediate.addSymbol(*(symbol->getAsVariable()), loc);
+    };
+
     // HLSL intrinsics can be pass through to native AST opcodes, or decomposed here to existing AST
     // opcodes for compatibility with existing software stacks.
     static const bool decomposeHlslIntrinsics = true;
@@ -3767,6 +4619,28 @@
             break;
         }
 
+    case EOpAny: // fall through
+    case EOpAll:
+        {
+            TIntermTyped* typedArg = arguments->getAsTyped();
+
+            // HLSL allows float/etc types here, and the SPIR-V opcode requires a bool.
+            // We'll convert here.  Note that for efficiency, we could add a smarter
+            // decomposition for some type cases, e.g, maybe by decomposing a dot product.
+            if (typedArg->getType().getBasicType() != EbtBool) {
+                const TType boolType(EbtBool, EvqTemporary,
+                                     typedArg->getVectorSize(),
+                                     typedArg->getMatrixCols(),
+                                     typedArg->getMatrixRows(),
+                                     typedArg->isVector());
+
+                typedArg = intermediate.addConversion(EOpConstructBool, boolType, typedArg);
+                node->getAsUnaryNode()->setOperand(typedArg);
+            }
+
+            break;
+        }
+
     case EOpSaturate:
         {
             // saturate(a) -> clamp(a,0,1)
@@ -3836,14 +4710,21 @@
                     std::max(arg0->getType().getMatrixRows(), 1);
 
                 TConstUnion zero;
-                zero.setDConst(0.0);
+                if (arg0->getType().isIntegerDomain())
+                    zero.setDConst(0);
+                else
+                    zero.setDConst(0.0);
                 TConstUnionArray zeros(constComponentCount, zero);
 
                 less->getSequence().push_back(intermediate.addConstantUnion(zeros, arg0->getType(), loc, true));
 
                 compareNode = intermediate.addBuiltInFunctionCall(loc, EOpAny, true, less, TType(EbtBool));
             } else {
-                TIntermTyped* zero = intermediate.addConstantUnion(0, type0, loc, true);
+                TIntermTyped* zero;
+                if (arg0->getType().isIntegerDomain())
+                    zero = intermediate.addConstantUnion(0, loc, true);
+                else
+                    zero = intermediate.addConstantUnion(0.0, type0, loc, true);
                 compareNode = handleBinaryMath(loc, "clip", EOpLessThan, arg0, zero);
             }
 
@@ -3943,6 +4824,7 @@
                 } else {
                     // Set the matching operator.  Since output is absent, this is all we need to do.
                     node->getAsAggregate()->setOperator(atomicOp);
+                    node->setType(atomic->getType());
                 }
             }
 
@@ -4227,7 +5109,8 @@
 
             TIntermAggregate* compoundStatement = intermediate.makeAggregate(tmpArgAssign, loc);
 
-            const TType boolType(EbtBool, EvqTemporary, arg0->getVectorSize(), arg0->getMatrixCols(), arg0->getMatrixRows());
+            const TType boolType(EbtBool, EvqTemporary, arg0->getVectorSize(), arg0->getMatrixCols(),
+                                 arg0->getMatrixRows());
 
             TIntermTyped* isnan = handleUnaryMath(loc, "isnan", EOpIsNan, intermediate.addSymbol(*tempArg, loc));
             isnan->setType(boolType);
@@ -4253,7 +5136,65 @@
 
             break;
         }
-        
+    case EOpWaveGetLaneCount:
+        {
+            // Mapped to gl_SubgroupSize builtin (We preprend @ to the symbol
+            // so that it inhabits the symbol table, but has a user-invalid name
+            // in-case some source HLSL defined the symbol also).
+            TType type(EbtUint, EvqVaryingIn);
+            node = lookupBuiltinVariable("@gl_SubgroupSize", EbvSubgroupSize2, type);
+            break;
+        }
+    case EOpWaveGetLaneIndex:
+        {
+            // Mapped to gl_SubgroupInvocationID builtin (We preprend @ to the
+            // symbol so that it inhabits the symbol table, but has a
+            // user-invalid name in-case some source HLSL defined the symbol
+            // also).
+            TType type(EbtUint, EvqVaryingIn);
+            node = lookupBuiltinVariable("@gl_SubgroupInvocationID", EbvSubgroupInvocation2, type);
+            break;
+        }
+    case EOpWaveActiveCountBits:
+        {
+            // Mapped to subgroupBallotBitCount(subgroupBallot()) builtin
+
+            // uvec4 type.
+            TType uvec4Type(EbtUint, EvqTemporary, 4);
+
+            // Get the uvec4 return from subgroupBallot().
+            TIntermTyped* res = intermediate.addBuiltInFunctionCall(loc,
+                EOpSubgroupBallot, true, arguments, uvec4Type);
+
+            // uint type.
+            TType uintType(EbtUint, EvqTemporary);
+
+            node = intermediate.addBuiltInFunctionCall(loc,
+                EOpSubgroupBallotBitCount, true, res, uintType);
+
+            break;
+        }
+    case EOpWavePrefixCountBits:
+        {
+            // Mapped to subgroupBallotInclusiveBitCount(subgroupBallot())
+            // builtin
+
+            // uvec4 type.
+            TType uvec4Type(EbtUint, EvqTemporary, 4);
+
+            // Get the uvec4 return from subgroupBallot().
+            TIntermTyped* res = intermediate.addBuiltInFunctionCall(loc,
+                EOpSubgroupBallot, true, arguments, uvec4Type);
+
+            // uint type.
+            TType uintType(EbtUint, EvqTemporary);
+
+            node = intermediate.addBuiltInFunctionCall(loc,
+                EOpSubgroupBallotInclusiveBitCount, true, res, uintType);
+
+            break;
+        }
+
     default:
         break; // most pass through unchanged
     }
@@ -4285,8 +5226,10 @@
             // It's a constructor, of type 'type'.
             //
             result = handleConstructor(loc, arguments, type);
-            if (result == nullptr)
+            if (result == nullptr) {
                 error(loc, "cannot construct with these arguments", type.getCompleteString().c_str(), "");
+                return nullptr;
+            }
         }
     } else {
         //
@@ -4294,6 +5237,15 @@
         //
         const TFunction* fnCandidate = nullptr;
         bool builtIn = false;
+        int thisDepth = 0;
+
+        // For mat mul, the situation is unusual: we have to compare vector sizes to mat row or col sizes,
+        // and clamp the opposite arg.  Since that's complex, we farm it off to a separate method.
+        // It doesn't naturally fall out of processing an argument at a time in isolation.
+        if (function->getName() == "mul")
+            addGenMulArgumentConversion(loc, *function, arguments);
+
+        TIntermAggregate* aggregate = arguments ? arguments->getAsAggregate() : nullptr;
 
         // TODO: this needs improvement: there's no way at present to look up a signature in
         // the symbol table for an arbitrary type.  This is a temporary hack until that ability exists.
@@ -4304,14 +5256,12 @@
 
             TIntermTyped* arg0 = nullptr;
 
-            if (arguments->getAsAggregate() && arguments->getAsAggregate()->getSequence().size() > 0)
-                arg0 = arguments->getAsAggregate()->getSequence()[0]->getAsTyped();
+            if (aggregate && aggregate->getSequence().size() > 0)
+                arg0 = aggregate->getSequence()[0]->getAsTyped();
             else if (arguments->getAsSymbolNode())
                 arg0 = arguments->getAsSymbolNode();
 
             if (arg0 != nullptr && isStructBufferType(arg0->getType())) {
-                // TODO: for struct buffers with counters, pass counter buffer as hidden parameter
-
                 static const int methodPrefixSize = sizeof(BUILTIN_PREFIX)-1;
 
                 if (function->getName().length() > methodPrefixSize &&
@@ -4326,7 +5276,7 @@
         }
 
         if (fnCandidate == nullptr)
-            fnCandidate = findFunction(loc, *function, builtIn, arguments);
+            fnCandidate = findFunction(loc, *function, builtIn, thisDepth, arguments);
 
         if (fnCandidate) {
             // This is a declared function that might map to
@@ -4336,16 +5286,39 @@
 
             // Error check for a function requiring specific extensions present.
             if (builtIn && fnCandidate->getNumExtensions())
-                requireExtensions(loc, fnCandidate->getNumExtensions(), fnCandidate->getExtensions(), fnCandidate->getName().c_str());
+                requireExtensions(loc, fnCandidate->getNumExtensions(), fnCandidate->getExtensions(),
+                                  fnCandidate->getName().c_str());
 
-            // Convert 'in' arguments
+            // turn an implicit member-function resolution into an explicit call
+            TString callerName;
+            if (thisDepth == 0)
+                callerName = fnCandidate->getMangledName();
+            else {
+                // get the explicit (full) name of the function
+                callerName = currentTypePrefix[currentTypePrefix.size() - thisDepth];
+                callerName += fnCandidate->getMangledName();
+                // insert the implicit calling argument
+                pushFrontArguments(intermediate.addSymbol(*getImplicitThis(thisDepth)), arguments);
+            }
+
+            // Convert 'in' arguments, so that types match.
+            // However, skip those that need expansion, that is covered next.
             if (arguments)
                 addInputArgumentConversions(*fnCandidate, arguments);
 
+            // Expand arguments.  Some arguments must physically expand to a different set
+            // than what the shader declared and passes.
+            if (arguments && !builtIn)
+                expandArguments(loc, *fnCandidate, arguments);
+
+            // Expansion may have changed the form of arguments
+            aggregate = arguments ? arguments->getAsAggregate() : nullptr;
+
             op = fnCandidate->getBuiltInOp();
             if (builtIn && op != EOpNull) {
                 // A function call mapped to a built-in operation.
-                result = intermediate.addBuiltInFunctionCall(loc, op, fnCandidate->getParamCount() == 1, arguments, fnCandidate->getType());
+                result = intermediate.addBuiltInFunctionCall(loc, op, fnCandidate->getParamCount() == 1, arguments,
+                                                             fnCandidate->getType());
                 if (result == nullptr)  {
                     error(arguments->getLoc(), " wrong operand type", "Internal Error",
                         "built in unary operator function.  Type: %s",
@@ -4358,14 +5331,14 @@
                 // It could still be a built-in function, but only if PureOperatorBuiltins == false.
                 result = intermediate.setAggregateOperator(arguments, EOpFunctionCall, fnCandidate->getType(), loc);
                 TIntermAggregate* call = result->getAsAggregate();
-                call->setName(fnCandidate->getMangledName());
+                call->setName(callerName);
 
                 // this is how we know whether the given function is a built-in function or a user-defined function
                 // if builtIn == false, it's a userDefined -> could be an overloaded built-in function also
                 // if builtIn == true, it's definitely a built-in function with EOpNull
                 if (! builtIn) {
                     call->setUserDefined();
-                    intermediate.addToCallGraph(infoSink, currentCaller, fnCandidate->getMangledName());
+                    intermediate.addToCallGraph(infoSink, currentCaller, callerName);
                 }
             }
 
@@ -4378,50 +5351,160 @@
             decomposeSampleMethods(loc, result, arguments);       // HLSL->AST sample method decompositions
             decomposeGeometryMethods(loc, result, arguments);     // HLSL->AST geometry method decompositions
 
+            // Create the qualifier list, carried in the AST for the call.
+            // Because some arguments expand to multiple arguments, the qualifier list will
+            // be longer than the formal parameter list.
+            if (result == fnNode && result->getAsAggregate()) {
+                TQualifierList& qualifierList = result->getAsAggregate()->getQualifierList();
+                for (int i = 0; i < fnCandidate->getParamCount(); ++i) {
+                    TStorageQualifier qual = (*fnCandidate)[i].type->getQualifier().storage;
+                    if (hasStructBuffCounter(*(*fnCandidate)[i].type)) {
+                        // add buffer and counter buffer argument qualifier
+                        qualifierList.push_back(qual);
+                        qualifierList.push_back(qual);
+                    } else if (shouldFlatten(*(*fnCandidate)[i].type, (*fnCandidate)[i].type->getQualifier().storage,
+                                             true)) {
+                        // add structure member expansion
+                        for (int memb = 0; memb < (int)(*fnCandidate)[i].type->getStruct()->size(); ++memb)
+                            qualifierList.push_back(qual);
+                    } else {
+                        // Normal 1:1 case
+                        qualifierList.push_back(qual);
+                    }
+                }
+            }
+
             // Convert 'out' arguments.  If it was a constant folded built-in, it won't be an aggregate anymore.
             // Built-ins with a single argument aren't called with an aggregate, but they also don't have an output.
             // Also, build the qualifier list for user function calls, which are always called with an aggregate.
             // We don't do this is if there has been a decomposition, which will have added its own conversions
             // for output parameters.
-            if (result == fnNode && result->getAsAggregate()) {
-                TQualifierList& qualifierList = result->getAsAggregate()->getQualifierList();
-                for (int i = 0; i < fnCandidate->getParamCount(); ++i) {
-                    TStorageQualifier qual = (*fnCandidate)[i].type->getQualifier().storage;
-                    qualifierList.push_back(qual);
-                }
+            if (result == fnNode && result->getAsAggregate())
                 result = addOutputArgumentConversions(*fnCandidate, *result->getAsOperator());
-            }
         }
     }
 
     // generic error recovery
-    // TODO: simplification: localize all the error recoveries that look like this, and taking type into account to reduce cascades
+    // TODO: simplification: localize all the error recoveries that look like this, and taking type into account to
+    //       reduce cascades
     if (result == nullptr)
         result = intermediate.addConstantUnion(0.0, EbtFloat, loc);
 
     return result;
 }
 
+// An initial argument list is difficult: it can be null, or a single node,
+// or an aggregate if more than one argument.  Add one to the front, maintaining
+// this lack of uniformity.
+void HlslParseContext::pushFrontArguments(TIntermTyped* front, TIntermTyped*& arguments)
+{
+    if (arguments == nullptr)
+        arguments = front;
+    else if (arguments->getAsAggregate() != nullptr)
+        arguments->getAsAggregate()->getSequence().insert(arguments->getAsAggregate()->getSequence().begin(), front);
+    else
+        arguments = intermediate.growAggregate(front, arguments);
+}
+
+//
+// HLSL allows mismatched dimensions on vec*mat, mat*vec, vec*vec, and mat*mat.  This is a
+// situation not well suited to resolution in intrinsic selection, but we can do so here, since we
+// can look at both arguments insert explicit shape changes if required.
+//
+void HlslParseContext::addGenMulArgumentConversion(const TSourceLoc& loc, TFunction& call, TIntermTyped*& args)
+{
+    TIntermAggregate* argAggregate = args ? args->getAsAggregate() : nullptr;
+
+    if (argAggregate == nullptr || argAggregate->getSequence().size() != 2) {
+        // It really ought to have two arguments.
+        error(loc, "expected: mul arguments", "", "");
+        return;
+    }
+
+    TIntermTyped* arg0 = argAggregate->getSequence()[0]->getAsTyped();
+    TIntermTyped* arg1 = argAggregate->getSequence()[1]->getAsTyped();
+
+    if (arg0->isVector() && arg1->isVector()) {
+        // For:
+        //    vec * vec: it's handled during intrinsic selection, so while we could do it here,
+        //               we can also ignore it, which is easier.
+    } else if (arg0->isVector() && arg1->isMatrix()) {
+        // vec * mat: we clamp the vec if the mat col is smaller, else clamp the mat col.
+        if (arg0->getVectorSize() < arg1->getMatrixCols()) {
+            // vec is smaller, so truncate larger mat dimension
+            const TType truncType(arg1->getBasicType(), arg1->getQualifier().storage, arg1->getQualifier().precision,
+                                  0, arg0->getVectorSize(), arg1->getMatrixRows());
+            arg1 = addConstructor(loc, arg1, truncType);
+        } else if (arg0->getVectorSize() > arg1->getMatrixCols()) {
+            // vec is larger, so truncate vec to mat size
+            const TType truncType(arg0->getBasicType(), arg0->getQualifier().storage, arg0->getQualifier().precision,
+                                  arg1->getMatrixCols());
+            arg0 = addConstructor(loc, arg0, truncType);
+        }
+    } else if (arg0->isMatrix() && arg1->isVector()) {
+        // mat * vec: we clamp the vec if the mat col is smaller, else clamp the mat col.
+        if (arg1->getVectorSize() < arg0->getMatrixRows()) {
+            // vec is smaller, so truncate larger mat dimension
+            const TType truncType(arg0->getBasicType(), arg0->getQualifier().storage, arg0->getQualifier().precision,
+                                  0, arg0->getMatrixCols(), arg1->getVectorSize());
+            arg0 = addConstructor(loc, arg0, truncType);
+        } else if (arg1->getVectorSize() > arg0->getMatrixRows()) {
+            // vec is larger, so truncate vec to mat size
+            const TType truncType(arg1->getBasicType(), arg1->getQualifier().storage, arg1->getQualifier().precision,
+                                  arg0->getMatrixRows());
+            arg1 = addConstructor(loc, arg1, truncType);
+        }
+    } else if (arg0->isMatrix() && arg1->isMatrix()) {
+        // mat * mat: we clamp the smaller inner dimension to match the other matrix size.
+        // Remember, HLSL Mrc = GLSL/SPIRV Mcr.
+        if (arg0->getMatrixRows() > arg1->getMatrixCols()) {
+            const TType truncType(arg0->getBasicType(), arg0->getQualifier().storage, arg0->getQualifier().precision,
+                                  0, arg0->getMatrixCols(), arg1->getMatrixCols());
+            arg0 = addConstructor(loc, arg0, truncType);
+        } else if (arg0->getMatrixRows() < arg1->getMatrixCols()) {
+            const TType truncType(arg1->getBasicType(), arg1->getQualifier().storage, arg1->getQualifier().precision,
+                                  0, arg0->getMatrixRows(), arg1->getMatrixRows());
+            arg1 = addConstructor(loc, arg1, truncType);
+        }
+    } else {
+        // It's something with scalars: we'll just leave it alone.  Function selection will handle it
+        // downstream.
+    }
+
+    // Warn if we altered one of the arguments
+    if (arg0 != argAggregate->getSequence()[0] || arg1 != argAggregate->getSequence()[1])
+        warn(loc, "mul() matrix size mismatch", "", "");
+
+    // Put arguments back.  (They might be unchanged, in which case this is harmless).
+    argAggregate->getSequence()[0] = arg0;
+    argAggregate->getSequence()[1] = arg1;
+
+    call[0].type = &arg0->getWritableType();
+    call[1].type = &arg1->getWritableType();
+}
+
 //
 // Add any needed implicit conversions for function-call arguments to input parameters.
 //
 void HlslParseContext::addInputArgumentConversions(const TFunction& function, TIntermTyped*& arguments)
 {
     TIntermAggregate* aggregate = arguments->getAsAggregate();
-    const auto setArg = [&](int argNum, TIntermTyped* arg) {
+
+    // Replace a single argument with a single argument.
+    const auto setArg = [&](int paramNum, TIntermTyped* arg) {
         if (function.getParamCount() == 1)
             arguments = arg;
         else {
-            if (aggregate)
-                aggregate->getSequence()[argNum] = arg;
-            else
+            if (aggregate == nullptr)
                 arguments = arg;
+            else
+                aggregate->getSequence()[paramNum] = arg;
         }
     };
 
     // Process each argument's conversion
-    for (int i = 0; i < function.getParamCount(); ++i) {
-        if (! function[i].type->getQualifier().isParamInput())
+    for (int param = 0; param < function.getParamCount(); ++param) {
+        if (! function[param].type->getQualifier().isParamInput())
             continue;
 
         // At this early point there is a slight ambiguity between whether an aggregate 'arguments'
@@ -4429,43 +5512,120 @@
         // means take 'arguments' itself as the one argument.
         TIntermTyped* arg = function.getParamCount() == 1
                                    ? arguments->getAsTyped()
-                                   : (aggregate ? aggregate->getSequence()[i]->getAsTyped() : arguments->getAsTyped());
-        if (*function[i].type != arg->getType()) {
+                                   : (aggregate ? 
+                                        aggregate->getSequence()[param]->getAsTyped() :
+                                        arguments->getAsTyped());
+        if (*function[param].type != arg->getType()) {
             // In-qualified arguments just need an extra node added above the argument to
             // convert to the correct type.
-            TIntermTyped* convArg = intermediate.addConversion(EOpFunctionCall, *function[i].type, arg);
+            TIntermTyped* convArg = intermediate.addConversion(EOpFunctionCall, *function[param].type, arg);
             if (convArg != nullptr)
-                convArg = intermediate.addUniShapeConversion(EOpFunctionCall, *function[i].type, convArg);
+                convArg = intermediate.addUniShapeConversion(EOpFunctionCall, *function[param].type, convArg);
             if (convArg != nullptr)
-                setArg(i, convArg);
+                setArg(param, convArg);
             else
-                error(arg->getLoc(), "cannot convert input argument, argument", "", "%d", i);
+                error(arg->getLoc(), "cannot convert input argument, argument", "", "%d", param);
         } else {
-            if (wasFlattened(arg) || wasSplit(arg)) {
-                // Will make a two-level subtree.
-                // The deepest will copy member-by-member to build the structure to pass.
-                // The level above that will be a two-operand EOpComma sequence that follows the copy by the
-                // object itself.
-                TVariable* internalAggregate = makeInternalVariable("aggShadow", *function[i].type);
-                internalAggregate->getWritableType().getQualifier().makeTemporary();
-                TIntermSymbol* internalSymbolNode = new TIntermSymbol(internalAggregate->getUniqueId(),
-                                                                      internalAggregate->getName(),
-                                                                      internalAggregate->getType());
-                internalSymbolNode->setLoc(arg->getLoc());
-                // This makes the deepest level, the member-wise copy
-                TIntermAggregate* assignAgg = handleAssign(arg->getLoc(), EOpAssign, internalSymbolNode, arg)->getAsAggregate();
+            if (wasFlattened(arg)) {
+                // If both formal and calling arg are to be flattened, leave that to argument
+                // expansion, not conversion.
+                if (!shouldFlatten(*function[param].type, function[param].type->getQualifier().storage, true)) {
+                    // Will make a two-level subtree.
+                    // The deepest will copy member-by-member to build the structure to pass.
+                    // The level above that will be a two-operand EOpComma sequence that follows the copy by the
+                    // object itself.
+                    TVariable* internalAggregate = makeInternalVariable("aggShadow", *function[param].type);
+                    internalAggregate->getWritableType().getQualifier().makeTemporary();
+                    TIntermSymbol* internalSymbolNode = new TIntermSymbol(internalAggregate->getUniqueId(),
+                                                                          internalAggregate->getName(),
+                                                                          internalAggregate->getType());
+                    internalSymbolNode->setLoc(arg->getLoc());
+                    // This makes the deepest level, the member-wise copy
+                    TIntermAggregate* assignAgg = handleAssign(arg->getLoc(), EOpAssign,
+                                                               internalSymbolNode, arg)->getAsAggregate();
 
-                // Now, pair that with the resulting aggregate.
-                assignAgg = intermediate.growAggregate(assignAgg, internalSymbolNode, arg->getLoc());
-                assignAgg->setOperator(EOpComma);
-                assignAgg->setType(internalAggregate->getType());
-                setArg(i, assignAgg);
+                    // Now, pair that with the resulting aggregate.
+                    assignAgg = intermediate.growAggregate(assignAgg, internalSymbolNode, arg->getLoc());
+                    assignAgg->setOperator(EOpComma);
+                    assignAgg->setType(internalAggregate->getType());
+                    setArg(param, assignAgg);
+                }
             }
         }
     }
 }
 
 //
+// Add any needed implicit expansion of calling arguments from what the shader listed to what's
+// internally needed for the AST (given the constraints downstream).
+//
+void HlslParseContext::expandArguments(const TSourceLoc& loc, const TFunction& function, TIntermTyped*& arguments)
+{
+    TIntermAggregate* aggregate = arguments->getAsAggregate();
+    int functionParamNumberOffset = 0;
+
+    // Replace a single argument with a single argument.
+    const auto setArg = [&](int paramNum, TIntermTyped* arg) {
+        if (function.getParamCount() + functionParamNumberOffset == 1)
+            arguments = arg;
+        else {
+            if (aggregate == nullptr)
+                arguments = arg;
+            else
+                aggregate->getSequence()[paramNum] = arg;
+        }
+    };
+
+    // Replace a single argument with a list of arguments
+    const auto setArgList = [&](int paramNum, const TVector<TIntermTyped*>& args) {
+        if (args.size() == 1)
+            setArg(paramNum, args.front());
+        else if (args.size() > 1) {
+            if (function.getParamCount() + functionParamNumberOffset == 1) {
+                arguments = intermediate.makeAggregate(args.front());
+                std::for_each(args.begin() + 1, args.end(), 
+                    [&](TIntermTyped* arg) {
+                        arguments = intermediate.growAggregate(arguments, arg);
+                    });
+            } else {
+                auto it = aggregate->getSequence().erase(aggregate->getSequence().begin() + paramNum);
+                aggregate->getSequence().insert(it, args.begin(), args.end());
+            }
+            functionParamNumberOffset += (int)(args.size() - 1);
+        }
+    };
+
+    // Process each argument's conversion
+    for (int param = 0; param < function.getParamCount(); ++param) {
+        // At this early point there is a slight ambiguity between whether an aggregate 'arguments'
+        // is the single argument itself or its children are the arguments.  Only one argument
+        // means take 'arguments' itself as the one argument.
+        TIntermTyped* arg = function.getParamCount() == 1
+                                   ? arguments->getAsTyped()
+                                   : (aggregate ? 
+                                        aggregate->getSequence()[param + functionParamNumberOffset]->getAsTyped() :
+                                        arguments->getAsTyped());
+
+        if (wasFlattened(arg) && shouldFlatten(*function[param].type, function[param].type->getQualifier().storage, true)) {
+            // Need to pass the structure members instead of the structure.
+            TVector<TIntermTyped*> memberArgs;
+            for (int memb = 0; memb < (int)arg->getType().getStruct()->size(); ++memb)
+                memberArgs.push_back(flattenAccess(arg, memb));
+            setArgList(param + functionParamNumberOffset, memberArgs);
+        }
+    }
+
+    // TODO: if we need both hidden counter args (below) and struct expansion (above)
+    // the two algorithms need to be merged: Each assumes the list starts out 1:1 between
+    // parameters and arguments.
+
+    // If any argument is a pass-by-reference struct buffer with an associated counter
+    // buffer, we have to add another hidden parameter for that counter.
+    if (aggregate)
+        addStructBuffArguments(loc, aggregate);
+}
+
+//
 // Add any needed implicit output conversions for function-call arguments.  This
 // can require a new tree topology, complicated further by whether the function
 // has a return value.
@@ -4536,7 +5696,8 @@
             TIntermSymbol* tempArgNode = intermediate.addSymbol(*tempArg, loc);
 
             // This makes the deepest level, the member-wise copy
-            TIntermTyped* tempAssign = handleAssign(arguments[i]->getLoc(), EOpAssign, arguments[i]->getAsTyped(), tempArgNode);
+            TIntermTyped* tempAssign = handleAssign(arguments[i]->getLoc(), EOpAssign, arguments[i]->getAsTyped(),
+                                                    tempArgNode);
             tempAssign = handleLvalue(arguments[i]->getLoc(), "assign", tempAssign);
             conversionTree = intermediate.growAggregate(conversionTree, tempAssign, arguments[i]->getLoc());
 
@@ -4558,6 +5719,54 @@
 }
 
 //
+// Add any needed "hidden" counter buffer arguments for function calls.
+//
+// Modifies the 'aggregate' argument if needed.  Otherwise, is no-op.
+//
+void HlslParseContext::addStructBuffArguments(const TSourceLoc& loc, TIntermAggregate*& aggregate)
+{
+    // See if there are any SB types with counters.
+    const bool hasStructBuffArg =
+        std::any_of(aggregate->getSequence().begin(),
+                    aggregate->getSequence().end(),
+                    [this](const TIntermNode* node) {
+                        return (node->getAsTyped() != nullptr) && hasStructBuffCounter(node->getAsTyped()->getType());
+                    });
+
+    // Nothing to do, if we didn't find one.
+    if (! hasStructBuffArg)
+        return;
+
+    TIntermSequence argsWithCounterBuffers;
+
+    for (int param = 0; param < int(aggregate->getSequence().size()); ++param) {
+        argsWithCounterBuffers.push_back(aggregate->getSequence()[param]);
+
+        if (hasStructBuffCounter(aggregate->getSequence()[param]->getAsTyped()->getType())) {
+            const TIntermSymbol* blockSym = aggregate->getSequence()[param]->getAsSymbolNode();
+            if (blockSym != nullptr) {
+                TType counterType;
+                counterBufferType(loc, counterType);
+
+                const TString counterBlockName(intermediate.addCounterBufferName(blockSym->getName()));
+
+                TVariable* variable = makeInternalVariable(counterBlockName, counterType);
+
+                // Mark this buffer's counter block as being in use
+                structBufferCounter[counterBlockName] = true;
+
+                TIntermSymbol* sym = intermediate.addSymbol(*variable, loc);
+                argsWithCounterBuffers.push_back(sym);
+            }
+        }
+    }
+
+    // Swap with the temp list we've built up.
+    aggregate->getSequence().swap(argsWithCounterBuffers);
+}
+
+
+//
 // Do additional checking of built-in function calls that is not caught
 // by normal semantic checks on argument type, extension tagging, etc.
 //
@@ -4597,7 +5806,8 @@
         case EOpTextureGather:
             // More than two arguments needs gpu_shader5, and rectangular or shadow needs gpu_shader5,
             // otherwise, need GL_ARB_texture_gather.
-            if (fnCandidate.getParamCount() > 2 || fnCandidate[0].type->getSampler().dim == EsdRect || fnCandidate[0].type->getSampler().shadow) {
+            if (fnCandidate.getParamCount() > 2 || fnCandidate[0].type->getSampler().dim == EsdRect ||
+                fnCandidate[0].type->getSampler().shadow) {
                 if (! fnCandidate[0].type->getSampler().shadow)
                     compArg = 2;
             }
@@ -4652,14 +5862,15 @@
         }
 
         if (arg > 0) {
-            if (! aggArgs[arg]->getAsConstantUnion())
+            if (aggArgs[arg]->getAsConstantUnion() == nullptr)
                 error(loc, "argument must be compile-time constant", "texel offset", "");
             else {
                 const TType& type = aggArgs[arg]->getAsTyped()->getType();
                 for (int c = 0; c < type.getVectorSize(); ++c) {
                     int offset = aggArgs[arg]->getAsConstantUnion()->getConstArray()[c].getIConst();
                     if (offset > resources.maxProgramTexelOffset || offset < resources.minProgramTexelOffset)
-                        error(loc, "value is out of range:", "texel offset", "[gl_MinProgramTexelOffset, gl_MaxProgramTexelOffset]");
+                        error(loc, "value is out of range:", "texel offset",
+                              "[gl_MinProgramTexelOffset, gl_MaxProgramTexelOffset]");
                 }
             }
         }
@@ -4695,7 +5906,8 @@
             // desktop 4.4 and later: swizzles may be used
             const TIntermTyped* base = TIntermediate::findLValueBase(arg0, true);
             if (base == nullptr || base->getType().getQualifier().storage != EvqVaryingIn)
-                error(loc, "first argument must be an interpolant, or interpolant-array element", fnCandidate.getName().c_str(), "");
+                error(loc, "first argument must be an interpolant, or interpolant-array element",
+                      fnCandidate.getName().c_str(), "");
         }
         break;
 
@@ -4729,16 +5941,49 @@
 // Handle seeing a "COLON semantic" at the end of a type declaration,
 // by updating the type according to the semantic.
 //
-void HlslParseContext::handleSemantic(TSourceLoc loc, TQualifier& qualifier, TBuiltInVariable builtIn, const TString& upperCase)
+void HlslParseContext::handleSemantic(TSourceLoc loc, TQualifier& qualifier, TBuiltInVariable builtIn,
+                                      const TString& upperCase)
 {
-    // adjust for stage in/out
+    // Parse and return semantic number.  If limit is 0, it will be ignored.  Otherwise, if the parsed
+    // semantic number is >= limit, errorMsg is issued and 0 is returned.
+    // TODO: it would be nicer if limit and errorMsg had default parameters, but some compilers don't yet
+    // accept those in lambda functions.
+    const auto getSemanticNumber = [this, loc](const TString& semantic, unsigned int limit, const char* errorMsg) -> unsigned int {
+        size_t pos = semantic.find_last_not_of("0123456789");
+        if (pos == std::string::npos)
+            return 0u;
+
+        unsigned int semanticNum = (unsigned int)atoi(semantic.c_str() + pos + 1);
+
+        if (limit != 0 && semanticNum >= limit) {
+            error(loc, errorMsg, semantic.c_str(), "");
+            return 0u;
+        }
+
+        return semanticNum;
+    };
 
     switch(builtIn) {
+    case EbvNone:
+        // Get location numbers from fragment outputs, instead of
+        // auto-assigning them.
+        if (language == EShLangFragment && upperCase.compare(0, 9, "SV_TARGET") == 0) {
+            qualifier.layoutLocation = getSemanticNumber(upperCase, 0, nullptr);
+            nextOutLocation = std::max(nextOutLocation, qualifier.layoutLocation + 1u);
+        } else if (upperCase.compare(0, 15, "SV_CLIPDISTANCE") == 0) {
+            builtIn = EbvClipDistance;
+            qualifier.layoutLocation = getSemanticNumber(upperCase, maxClipCullRegs, "invalid clip semantic");
+        } else if (upperCase.compare(0, 15, "SV_CULLDISTANCE") == 0) {
+            builtIn = EbvCullDistance;
+            qualifier.layoutLocation = getSemanticNumber(upperCase, maxClipCullRegs, "invalid cull semantic");
+        }
+        break;
     case EbvPosition:
+        // adjust for stage in/out
         if (language == EShLangFragment)
             builtIn = EbvFragCoord;
         break;
-    case EbvStencilRef:
+    case EbvFragStencilRef:
         error(loc, "unimplemented; need ARB_shader_stencil_export", "SV_STENCILREF", "");
         break;
     case EbvTessLevelInner:
@@ -4749,7 +5994,8 @@
         break;
     }
 
-    qualifier.builtIn = builtIn;
+    if (qualifier.builtIn == EbvNone)
+        qualifier.builtIn = builtIn;
     qualifier.semanticName = intermediate.addSemanticName(upperCase);
 }
 
@@ -4820,14 +6066,40 @@
         }
     }
 
-    // TODO: learn what all these really mean and how they interact with regNumber and subComponent
+    // more information about register types see
+    // https://docs.microsoft.com/en-us/windows/desktop/direct3dhlsl/dx-graphics-hlsl-variable-register
+    const std::vector<std::string>& resourceInfo = intermediate.getResourceSetBinding();
     switch (std::tolower(desc[0])) {
-    case 'b':
-    case 't':
     case 'c':
+        // c register is the register slot in the global const buffer
+        // each slot is a vector of 4 32 bit components
+        qualifier.layoutOffset = regNumber * 4 * 4;
+        break;
+        // const buffer register slot
+    case 'b':
+        // textrues and structured buffers
+    case 't':
+        // samplers
     case 's':
+        // uav resources
     case 'u':
-        qualifier.layoutBinding = regNumber + subComponent;
+        // if nothing else has set the binding, do so now
+        // (other mechanisms override this one)
+        if (!qualifier.hasBinding())
+            qualifier.layoutBinding = regNumber + subComponent;
+
+        // This handles per-register layout sets numbers.  For the global mode which sets
+        // every symbol to the same value, see setLinkageLayoutSets().
+        if ((resourceInfo.size() % 3) == 0) {
+            // Apply per-symbol resource set and binding.
+            for (auto it = resourceInfo.cbegin(); it != resourceInfo.cend(); it = it + 3) {
+                if (strcmp(desc.c_str(), it[0].c_str()) == 0) {
+                    qualifier.layoutSet = atoi(it[1].c_str());
+                    qualifier.layoutBinding = atoi(it[2].c_str()) + subComponent;
+                    break;
+                }
+            }
+        }
         break;
     default:
         warn(loc, "ignoring unrecognized register type", "register", "%c", desc[0]);
@@ -4848,7 +6120,9 @@
         return true;
     };
 
-    if (spaceDesc) {
+    // if nothing else has set the set, do so now
+    // (other mechanisms override this one)
+    if (spaceDesc && !qualifier.hasSet()) {
         if (! crackSpace()) {
             error(loc, "expected spaceN", "register", "");
             return;
@@ -4859,14 +6133,16 @@
 
 // Convert to a scalar boolean, or if not allowed by HLSL semantics,
 // report an error and return nullptr.
-TIntermTyped* HlslParseContext::convertConditionalExpression(const TSourceLoc& loc, TIntermTyped* condition, bool mustBeScalar)
+TIntermTyped* HlslParseContext::convertConditionalExpression(const TSourceLoc& loc, TIntermTyped* condition,
+                                                             bool mustBeScalar)
 {
     if (mustBeScalar && !condition->getType().isScalarOrVec1()) {
         error(loc, "requires a scalar", "conditional expression", "");
         return nullptr;
     }
 
-    return intermediate.addConversion(EOpConstructBool, TType(EbtBool, EvqTemporary, condition->getVectorSize()), condition);
+    return intermediate.addConversion(EOpConstructBool, TType(EbtBool, EvqTemporary, condition->getVectorSize()),
+                                      condition);
 }
 
 //
@@ -4976,7 +6252,8 @@
     bool constructingMatrix = false;
     switch (op) {
     case EOpConstructTextureSampler:
-        return constructorTextureSamplerError(loc, function);
+        error(loc, "unhandled texture constructor", "constructor", "");
+        return true;
     case EOpConstructMat2x2:
     case EOpConstructMat2x3:
     case EOpConstructMat2x4:
@@ -4995,6 +6272,33 @@
     case EOpConstructDMat4x2:
     case EOpConstructDMat4x3:
     case EOpConstructDMat4x4:
+    case EOpConstructIMat2x2:
+    case EOpConstructIMat2x3:
+    case EOpConstructIMat2x4:
+    case EOpConstructIMat3x2:
+    case EOpConstructIMat3x3:
+    case EOpConstructIMat3x4:
+    case EOpConstructIMat4x2:
+    case EOpConstructIMat4x3:
+    case EOpConstructIMat4x4:
+    case EOpConstructUMat2x2:
+    case EOpConstructUMat2x3:
+    case EOpConstructUMat2x4:
+    case EOpConstructUMat3x2:
+    case EOpConstructUMat3x3:
+    case EOpConstructUMat3x4:
+    case EOpConstructUMat4x2:
+    case EOpConstructUMat4x3:
+    case EOpConstructUMat4x4:
+    case EOpConstructBMat2x2:
+    case EOpConstructBMat2x3:
+    case EOpConstructBMat2x4:
+    case EOpConstructBMat3x2:
+    case EOpConstructBMat3x3:
+    case EOpConstructBMat3x4:
+    case EOpConstructBMat4x2:
+    case EOpConstructBMat4x3:
+    case EOpConstructBMat4x4:
         constructingMatrix = true;
         break;
     default:
@@ -5013,7 +6317,7 @@
     bool arrayArg = false;
     for (int arg = 0; arg < function.getParamCount(); ++arg) {
         if (function[arg].type->isArray()) {
-            if (! function[arg].type->isExplicitlySizedArray()) {
+            if (function[arg].type->isUnsizedArray()) {
                 // Can't construct from an unsized array.
                 error(loc, "array argument must be sized", "constructor", "");
                 return true;
@@ -5048,10 +6352,10 @@
             return true;
         }
 
-        if (type.isImplicitlySizedArray()) {
+        if (type.isUnsizedArray()) {
             // auto adapt the constructor type to the number of arguments
             type.changeOuterArraySize(function.getParamCount());
-        } else if (type.getOuterArraySize() != function.getParamCount()) {
+        } else if (type.getOuterArraySize() != function.getParamCount() && type.computeNumComponents() > size) {
             error(loc, "array constructor needs one argument per array element", "constructor", "");
             return true;
         }
@@ -5060,26 +6364,33 @@
             // Types have to match, but we're still making the type.
             // Finish making the type, and the comparison is done later
             // when checking for conversion.
-            TArraySizes& arraySizes = type.getArraySizes();
+            TArraySizes& arraySizes = *type.getArraySizes();
 
             // At least the dimensionalities have to match.
-            if (! function[0].type->isArray() || arraySizes.getNumDims() != function[0].type->getArraySizes().getNumDims() + 1) {
+            if (! function[0].type->isArray() ||
+                arraySizes.getNumDims() != function[0].type->getArraySizes()->getNumDims() + 1) {
                 error(loc, "array constructor argument not correct type to construct array element", "constructor", "");
                 return true;
             }
 
-            if (arraySizes.isInnerImplicit()) {
+            if (arraySizes.isInnerUnsized()) {
                 // "Arrays of arrays ..., and the size for any dimension is optional"
                 // That means we need to adopt (from the first argument) the other array sizes into the type.
                 for (int d = 1; d < arraySizes.getNumDims(); ++d) {
                     if (arraySizes.getDimSize(d) == UnsizedArraySize) {
-                        arraySizes.setDimSize(d, function[0].type->getArraySizes().getDimSize(d - 1));
+                        arraySizes.setDimSize(d, function[0].type->getArraySizes()->getDimSize(d - 1));
                     }
                 }
             }
         }
     }
 
+    // Some array -> array type casts are okay
+    if (arrayArg && function.getParamCount() == 1 && op != EOpConstructStruct && type.isArray() &&
+        !type.isArrayOfArrays() && !function[0].type->isArrayOfArrays() &&
+        type.getVectorSize() >= 1 && function[0].type->getVectorSize() >= 1)
+        return false;
+
     if (arrayArg && op != EOpConstructStruct && ! type.isArrayOfArrays()) {
         error(loc, "constructing non-array constituent from array argument", "constructor", "");
         return true;
@@ -5094,12 +6405,18 @@
         return true;
     }
 
-    if (op == EOpConstructStruct && ! type.isArray() && isScalarConstructor(node))
-        return false;
+    if (op == EOpConstructStruct && ! type.isArray()) {
+        if (isScalarConstructor(node))
+            return false;
 
-    if (op == EOpConstructStruct && ! type.isArray() && (int)type.getStruct()->size() != function.getParamCount()) {
-        error(loc, "Number of constructor parameters does not match the number of structure fields", "constructor", "");
-        return true;
+        // Self-type construction: e.g, we can construct a struct from a single identically typed object.
+        if (function.getParamCount() == 1 && type == *function[0].type)
+            return false;
+
+        if ((int)type.getStruct()->size() != function.getParamCount()) {
+            error(loc, "Number of constructor parameters does not match the number of structure fields", "constructor", "");
+            return true;
+        }
     }
 
     if ((op != EOpConstructStruct && size != 1 && size < type.computeNumComponents()) ||
@@ -5128,66 +6445,6 @@
            (node->getAsAggregate() == nullptr || node->getAsAggregate()->getOp() != EOpNull);
 }
 
-// Verify all the correct semantics for constructing a combined texture/sampler.
-// Return true if the semantics are incorrect.
-bool HlslParseContext::constructorTextureSamplerError(const TSourceLoc& loc, const TFunction& function)
-{
-    TString constructorName = function.getType().getBasicTypeString();  // TODO: performance: should not be making copy; interface needs to change
-    const char* token = constructorName.c_str();
-
-    // exactly two arguments needed
-    if (function.getParamCount() != 2) {
-        error(loc, "sampler-constructor requires two arguments", token, "");
-        return true;
-    }
-
-    // For now, not allowing arrayed constructors, the rest of this function
-    // is set up to allow them, if this test is removed:
-    if (function.getType().isArray()) {
-        error(loc, "sampler-constructor cannot make an array of samplers", token, "");
-        return true;
-    }
-
-    // first argument
-    //  * the constructor's first argument must be a texture type
-    //  * the dimensionality (1D, 2D, 3D, Cube, Rect, Buffer, MS, and Array)
-    //    of the texture type must match that of the constructed sampler type
-    //    (that is, the suffixes of the type of the first argument and the
-    //    type of the constructor will be spelled the same way)
-    if (function[0].type->getBasicType() != EbtSampler ||
-        ! function[0].type->getSampler().isTexture() ||
-        function[0].type->isArray()) {
-        error(loc, "sampler-constructor first argument must be a scalar textureXXX type", token, "");
-        return true;
-    }
-    // simulate the first argument's impact on the result type, so it can be compared with the encapsulated operator!=()
-    TSampler texture = function.getType().getSampler();
-    texture.combined = false;
-    texture.shadow = false;
-    if (texture != function[0].type->getSampler()) {
-        error(loc, "sampler-constructor first argument must match type and dimensionality of constructor type", token, "");
-        return true;
-    }
-
-    // second argument
-    //   * the constructor's second argument must be a scalar of type
-    //     *sampler* or *samplerShadow*
-    //   * the presence or absence of depth comparison (Shadow) must match
-    //     between the constructed sampler type and the type of the second argument
-    if (function[1].type->getBasicType() != EbtSampler ||
-        ! function[1].type->getSampler().isPureSampler() ||
-        function[1].type->isArray()) {
-        error(loc, "sampler-constructor second argument must be a scalar type 'sampler'", token, "");
-        return true;
-    }
-    if (function.getType().getSampler().shadow != function[1].type->getSampler().shadow) {
-        error(loc, "sampler-constructor second argument presence of shadow must match constructor presence of shadow", token, "");
-        return true;
-    }
-
-    return false;
-}
-
 // Checks to see if a void variable has been declared and raise an error message for such a case
 //
 // returns true in case of an error
@@ -5261,6 +6518,7 @@
     MERGE_SINGLETON(readonly);
     MERGE_SINGLETON(writeonly);
     MERGE_SINGLETON(specConstant);
+    MERGE_SINGLETON(nonUniform);
 }
 
 // used to flatten the sampler type space into a single dimension
@@ -5271,7 +6529,8 @@
     int shadowIndex = sampler.shadow ? 1 : 0;
     int externalIndex = sampler.external ? 1 : 0;
 
-    return EsdNumDims * (EbtNumTypes * (2 * (2 * arrayIndex + shadowIndex) + externalIndex) + sampler.type) + sampler.dim;
+    return EsdNumDims *
+           (EbtNumTypes * (2 * (2 * arrayIndex + shadowIndex) + externalIndex) + sampler.type) + sampler.dim;
 }
 
 //
@@ -5315,7 +6574,7 @@
 //
 void HlslParseContext::arraySizeRequiredCheck(const TSourceLoc& loc, const TArraySizes& arraySizes)
 {
-    if (arraySizes.isImplicit())
+    if (arraySizes.hasUnsized())
         error(loc, "array size required", "", "");
 }
 
@@ -5329,27 +6588,14 @@
     }
 }
 
-// Merge array dimensions listed in 'sizes' onto the type's array dimensions.
-//
-// From the spec: "vec4[2] a[3]; // size-3 array of size-2 array of vec4"
-//
-// That means, the 'sizes' go in front of the 'type' as outermost sizes.
-// 'type' is the type part of the declaration (to the left)
-// 'sizes' is the arrayness tagged on the identifier (to the right)
-//
-void HlslParseContext::arrayDimMerge(TType& type, const TArraySizes* sizes)
-{
-    if (sizes)
-        type.addArrayOuterSizes(*sizes);
-}
-
 //
 // Do all the semantic checking for declaring or redeclaring an array, with and
 // without a size, and make the right changes to the symbol table.
 //
-void HlslParseContext::declareArray(const TSourceLoc& loc, const TString& identifier, const TType& type, TSymbol*& symbol, bool track)
+void HlslParseContext::declareArray(const TSourceLoc& loc, const TString& identifier, const TType& type,
+                                    TSymbol*& symbol, bool track)
 {
-    if (! symbol) {
+    if (symbol == nullptr) {
         bool currentScope;
         symbol = symbolTable.find(identifier, nullptr, &currentScope);
 
@@ -5380,7 +6626,7 @@
     // Process a redeclaration.
     //
 
-    if (! symbol) {
+    if (symbol == nullptr) {
         error(loc, "array variable name expected", identifier.c_str(), "");
         return;
     }
@@ -5388,64 +6634,20 @@
     // redeclareBuiltinVariable() should have already done the copyUp()
     TType& existingType = symbol->getWritableType();
 
-    if (existingType.isExplicitlySizedArray()) {
-        // be more lenient for input arrays to geometry shaders and tessellation control outputs, where the redeclaration is the same size
+    if (existingType.isSizedArray()) {
+        // be more lenient for input arrays to geometry shaders and tessellation control outputs,
+        // where the redeclaration is the same size
         return;
     }
 
     existingType.updateArraySizes(type);
 }
 
-void HlslParseContext::updateImplicitArraySize(const TSourceLoc& loc, TIntermNode *node, int index)
-{
-    // maybe there is nothing to do...
-    TIntermTyped* typedNode = node->getAsTyped();
-    if (typedNode->getType().getImplicitArraySize() > index)
-        return;
-
-    // something to do...
-
-    // Figure out what symbol to lookup, as we will use its type to edit for the size change,
-    // as that type will be shared through shallow copies for future references.
-    TSymbol* symbol = nullptr;
-    int blockIndex = -1;
-    const TString* lookupName = nullptr;
-    if (node->getAsSymbolNode())
-        lookupName = &node->getAsSymbolNode()->getName();
-    else if (node->getAsBinaryNode()) {
-        const TIntermBinary* deref = node->getAsBinaryNode();
-        // This has to be the result of a block dereference, unless it's bad shader code
-        // If it's a uniform block, then an error will be issued elsewhere, but
-        // return early now to avoid crashing later in this function.
-        if (! deref->getLeft()->getAsSymbolNode() || deref->getLeft()->getBasicType() != EbtBlock ||
-            deref->getLeft()->getType().getQualifier().storage == EvqUniform ||
-            deref->getRight()->getAsConstantUnion() == nullptr)
-            return;
-
-        blockIndex = deref->getRight()->getAsConstantUnion()->getConstArray()[0].getIConst();
-
-        lookupName = &deref->getLeft()->getAsSymbolNode()->getName();
-        if (IsAnonymous(*lookupName))
-            lookupName = &(*deref->getLeft()->getType().getStruct())[blockIndex].type->getFieldName();
-    }
-
-    // Lookup the symbol, should only fail if shader code is incorrect
-    symbol = symbolTable.find(*lookupName);
-    if (symbol == nullptr)
-        return;
-
-    if (symbol->getAsFunction()) {
-        error(loc, "array variable name expected", symbol->getName().c_str(), "");
-        return;
-    }
-
-    symbol->getWritableType().setImplicitArraySize(index + 1);
-}
-
 //
 // Enforce non-initializer type/qualifier rules.
 //
-void HlslParseContext::fixConstInit(const TSourceLoc& loc, const TString& identifier, TType& type, TIntermTyped*& initializer)
+void HlslParseContext::fixConstInit(const TSourceLoc& loc, const TString& identifier, TType& type,
+                                    TIntermTyped*& initializer)
 {
     //
     // Make the qualifier make sense, given that there is an initializer.
@@ -5480,126 +6682,6 @@
 }
 
 //
-// Either redeclare the requested block, or give an error message why it can't be done.
-//
-// TODO: functionality: explicitly sizing members of redeclared blocks is not giving them an explicit size
-void HlslParseContext::redeclareBuiltinBlock(const TSourceLoc& loc, TTypeList& newTypeList, const TString& blockName, const TString* instanceName, TArraySizes* arraySizes)
-{
-    // Redeclaring a built-in block...
-
-    // Blocks with instance names are easy to find, lookup the instance name,
-    // Anonymous blocks need to be found via a member.
-    bool builtIn;
-    TSymbol* block;
-    if (instanceName)
-        block = symbolTable.find(*instanceName, &builtIn);
-    else
-        block = symbolTable.find(newTypeList.front().type->getFieldName(), &builtIn);
-
-    // If the block was not found, this must be a version/profile/stage
-    // that doesn't have it, or the instance name is wrong.
-    const char* errorName = instanceName ? instanceName->c_str() : newTypeList.front().type->getFieldName().c_str();
-    if (! block) {
-        error(loc, "no declaration found for redeclaration", errorName, "");
-        return;
-    }
-    // Built-in blocks cannot be redeclared more than once, which if happened,
-    // we'd be finding the already redeclared one here, rather than the built in.
-    if (! builtIn) {
-        error(loc, "can only redeclare a built-in block once, and before any use", blockName.c_str(), "");
-        return;
-    }
-
-    // Copy the block to make a writable version, to insert into the block table after editing.
-    block = symbolTable.copyUpDeferredInsert(block);
-
-    if (block->getType().getBasicType() != EbtBlock) {
-        error(loc, "cannot redeclare a non block as a block", errorName, "");
-        return;
-    }
-
-    // Edit and error check the container against the redeclaration
-    //  - remove unused members
-    //  - ensure remaining qualifiers/types match
-    TType& type = block->getWritableType();
-    TTypeList::iterator member = type.getWritableStruct()->begin();
-    size_t numOriginalMembersFound = 0;
-    while (member != type.getStruct()->end()) {
-        // look for match
-        bool found = false;
-        TTypeList::const_iterator newMember;
-        TSourceLoc memberLoc;
-        memberLoc.init();
-        for (newMember = newTypeList.begin(); newMember != newTypeList.end(); ++newMember) {
-            if (member->type->getFieldName() == newMember->type->getFieldName()) {
-                found = true;
-                memberLoc = newMember->loc;
-                break;
-            }
-        }
-
-        if (found) {
-            ++numOriginalMembersFound;
-            // - ensure match between redeclared members' types
-            // - check for things that can't be changed
-            // - update things that can be changed
-            TType& oldType = *member->type;
-            const TType& newType = *newMember->type;
-            if (! newType.sameElementType(oldType))
-                error(memberLoc, "cannot redeclare block member with a different type", member->type->getFieldName().c_str(), "");
-            if (oldType.isArray() != newType.isArray())
-                error(memberLoc, "cannot change arrayness of redeclared block member", member->type->getFieldName().c_str(), "");
-            else if (! oldType.sameArrayness(newType) && oldType.isExplicitlySizedArray())
-                error(memberLoc, "cannot change array size of redeclared block member", member->type->getFieldName().c_str(), "");
-            if (newType.getQualifier().isMemory())
-                error(memberLoc, "cannot add memory qualifier to redeclared block member", member->type->getFieldName().c_str(), "");
-            if (newType.getQualifier().hasLayout())
-                error(memberLoc, "cannot add layout to redeclared block member", member->type->getFieldName().c_str(), "");
-            if (newType.getQualifier().patch)
-                error(memberLoc, "cannot add patch to redeclared block member", member->type->getFieldName().c_str(), "");
-            oldType.getQualifier().centroid = newType.getQualifier().centroid;
-            oldType.getQualifier().sample = newType.getQualifier().sample;
-            oldType.getQualifier().invariant = newType.getQualifier().invariant;
-            oldType.getQualifier().noContraction = newType.getQualifier().noContraction;
-            oldType.getQualifier().smooth = newType.getQualifier().smooth;
-            oldType.getQualifier().flat = newType.getQualifier().flat;
-            oldType.getQualifier().nopersp = newType.getQualifier().nopersp;
-
-            // go to next member
-            ++member;
-        } else {
-            // For missing members of anonymous blocks that have been redeclared,
-            // hide the original (shared) declaration.
-            // Instance-named blocks can just have the member removed.
-            if (instanceName)
-                member = type.getWritableStruct()->erase(member);
-            else {
-                member->type->hideMember();
-                ++member;
-            }
-        }
-    }
-
-    if (numOriginalMembersFound < newTypeList.size())
-        error(loc, "block redeclaration has extra members", blockName.c_str(), "");
-    if (type.isArray() != (arraySizes != nullptr))
-        error(loc, "cannot change arrayness of redeclared block", blockName.c_str(), "");
-    else if (type.isArray()) {
-        if (type.isExplicitlySizedArray() && arraySizes->getOuterSize() == UnsizedArraySize)
-            error(loc, "block already declared with size, can't redeclare as implicitly-sized", blockName.c_str(), "");
-        else if (type.isExplicitlySizedArray() && type.getArraySizes() != *arraySizes)
-            error(loc, "cannot change array size of redeclared block", blockName.c_str(), "");
-        else if (type.isImplicitlySizedArray() && arraySizes->getOuterSize() != UnsizedArraySize)
-            type.changeOuterArraySize(arraySizes->getOuterSize());
-    }
-
-    symbolTable.insert(*block);
-
-    // Save it in the AST for linker use.
-    trackLinkage(*block);
-}
-
-//
 // Generate index to the array element in a structure buffer (SSBO)
 //
 TIntermTyped* HlslParseContext::indexStructBufferContent(const TSourceLoc& loc, TIntermTyped* buffer) const
@@ -5624,7 +6706,7 @@
 //
 TType* HlslParseContext::getStructBufferContentType(const TType& type) const
 {
-    if (type.getBasicType() != EbtBlock)
+    if (type.getBasicType() != EbtBlock || type.getQualifier().storage != EvqBuffer)
         return nullptr;
 
     const int memberCount = (int)type.getStruct()->size();
@@ -5632,7 +6714,7 @@
 
     TType* contentType = (*type.getStruct())[memberCount-1].type;
 
-    return contentType->isRuntimeSizedArray() ? contentType : nullptr;
+    return contentType->isUnsizedArray() ? contentType : nullptr;
 }
 
 //
@@ -5695,6 +6777,7 @@
         type.getQualifier().storage = EvqConstReadOnly;
         break;
     case EvqGlobal:
+    case EvqUniform:
     case EvqTemporary:
         type.getQualifier().storage = EvqIn;
         break;
@@ -5707,6 +6790,7 @@
             bufferQualifier.storage = type.getQualifier().storage;
             bufferQualifier.readonly = type.getQualifier().readonly;
             bufferQualifier.coherent = type.getQualifier().coherent;
+            bufferQualifier.declaredBuiltIn = type.getQualifier().declaredBuiltIn;
             type.getQualifier() = bufferQualifier;
             break;
         }
@@ -5883,7 +6967,8 @@
 
 // Put the id's layout qualifier value into the public type, for qualifiers having a number set.
 // This is before we know any type information for error checking.
-void HlslParseContext::setLayoutQualifier(const TSourceLoc& loc, TQualifier& qualifier, TString& id, const TIntermTyped* node)
+void HlslParseContext::setLayoutQualifier(const TSourceLoc& loc, TQualifier& qualifier, TString& id,
+                                          const TIntermTyped* node)
 {
     const char* feature = "layout-id value";
     // const char* nonLiteralFeature = "non-literal layout-id value";
@@ -5941,7 +7026,8 @@
             // "It is a compile-time error to specify an *xfb_buffer* that is greater than
             // the implementation-dependent constant gl_MaxTransformFeedbackBuffers."
             if (value >= resources.maxTransformFeedbackBuffers)
-                error(loc, "buffer is too large:", id.c_str(), "gl_MaxTransformFeedbackBuffers is %d", resources.maxTransformFeedbackBuffers);
+                error(loc, "buffer is too large:", id.c_str(), "gl_MaxTransformFeedbackBuffers is %d",
+                      resources.maxTransformFeedbackBuffers);
             if (value >= (int)TQualifier::layoutXfbBufferEnd)
                 error(loc, "buffer is too large:", id.c_str(), "internal max is %d", TQualifier::layoutXfbBufferEnd - 1);
             else
@@ -5957,7 +7043,8 @@
             // "The resulting stride (implicit or explicit), when divided by 4, must be less than or equal to the
             // implementation-dependent constant gl_MaxTransformFeedbackInterleavedComponents."
             if (value > 4 * resources.maxTransformFeedbackInterleavedComponents)
-                error(loc, "1/4 stride is too large:", id.c_str(), "gl_MaxTransformFeedbackInterleavedComponents is %d", resources.maxTransformFeedbackInterleavedComponents);
+                error(loc, "1/4 stride is too large:", id.c_str(), "gl_MaxTransformFeedbackInterleavedComponents is %d",
+                      resources.maxTransformFeedbackInterleavedComponents);
             else if (value >= (int)TQualifier::layoutXfbStrideEnd)
                 error(loc, "stride is too large:", id.c_str(), "internal max is %d", TQualifier::layoutXfbStrideEnd - 1);
             if (value < (int)TQualifier::layoutXfbStrideEnd)
@@ -5975,15 +7062,7 @@
         return;
     }
     if (id == "constant_id") {
-        requireSpv(loc, "constant_id");
-        if (value >= (int)TQualifier::layoutSpecConstantIdEnd) {
-            error(loc, "specialization-constant id is too large", id.c_str(), "");
-        } else {
-            qualifier.layoutSpecConstantId = value;
-            qualifier.specConstant = true;
-            if (! intermediate.addUsedConstantId(value))
-                error(loc, "specialization-constant id already used", id.c_str(), "");
-        }
+        setSpecConstantId(loc, qualifier, value);
         return;
     }
 
@@ -6078,6 +7157,19 @@
     error(loc, "there is no such layout identifier for this stage taking an assigned value", id.c_str(), "");
 }
 
+void HlslParseContext::setSpecConstantId(const TSourceLoc& loc, TQualifier& qualifier, int value)
+{
+    if (value >= (int)TQualifier::layoutSpecConstantIdEnd) {
+        error(loc, "specialization-constant id is too large", "constant_id", "");
+    } else {
+        qualifier.layoutSpecConstantId = value;
+        qualifier.specConstant = true;
+        if (! intermediate.addUsedConstantId(value))
+            error(loc, "specialization-constant id already used", "constant_id", "");
+    }
+    return;
+}
+
 // Merge any layout qualifier information from src into dst, leaving everything else in dst alone
 //
 // "More than one layout qualifier may appear in a single declaration.
@@ -6142,6 +7234,7 @@
     }
 }
 
+
 //
 // Look up a function name in the symbol table, and make sure it is a function.
 //
@@ -6151,18 +7244,17 @@
 //
 // Return the function symbol if found, otherwise nullptr.
 //
-const TFunction* HlslParseContext::findFunction(const TSourceLoc& loc, TFunction& call, bool& builtIn,
+const TFunction* HlslParseContext::findFunction(const TSourceLoc& loc, TFunction& call, bool& builtIn, int& thisDepth,
                                                 TIntermTyped*& args)
 {
-    // const TFunction* function = nullptr;
-
     if (symbolTable.isFunctionNameVariable(call.getName())) {
         error(loc, "can't use function syntax on variable", call.getName().c_str(), "");
         return nullptr;
     }
 
     // first, look for an exact match
-    TSymbol* symbol = symbolTable.find(call.getMangledName(), &builtIn);
+    bool dummyScope;
+    TSymbol* symbol = symbolTable.find(call.getMangledName(), &builtIn, &dummyScope, &thisDepth);
     if (symbol)
         return symbol->getAsFunction();
 
@@ -6172,7 +7264,7 @@
     TVector<const TFunction*> candidateList;
     symbolTable.findFunctionNameList(call.getMangledName(), candidateList, builtIn);
 
-    // These builtin ops can accept any type, so we bypass the argument selection
+    // These built-in ops can accept any type, so we bypass the argument selection
     if (candidateList.size() == 1 && builtIn &&
         (candidateList[0]->getBuiltInOp() == EOpMethodAppend ||
          candidateList[0]->getBuiltInOp() == EOpMethodRestartStrip ||
@@ -6259,6 +7351,7 @@
         // shapes have to be convertible
         if ((from.isScalarOrVec1() && to.isScalarOrVec1()) ||
             (from.isScalarOrVec1() && to.isVector())    ||
+            (from.isScalarOrVec1() && to.isMatrix())    ||
             (from.isVector() && to.isVector() && from.getVectorSize() >= to.getVectorSize()))
             return true;
 
@@ -6326,8 +7419,8 @@
             }
         };
 
-        return std::abs(linearize(to2.getBasicType()) - linearize(from.getBasicType())) <
-               std::abs(linearize(to1.getBasicType()) - linearize(from.getBasicType()));
+        return abs(linearize(to2.getBasicType()) - linearize(from.getBasicType())) <
+               abs(linearize(to1.getBasicType()) - linearize(from.getBasicType()));
     };
 
     // for ambiguity reporting
@@ -6349,7 +7442,7 @@
         return nullptr;
     }
 
-    // For builtins, we can convert across the arguments.  This will happen in several steps:
+    // For built-ins, we can convert across the arguments.  This will happen in several steps:
     // Step 1:  If there's an exact match, use it.
     // Step 2a: Otherwise, get the operator from the best match and promote arguments:
     // Step 2b: reconstruct the TFunction based on the new arg types
@@ -6524,6 +7617,11 @@
         }
         if (newLists.uniform) {
             newMember(newUniformMember);
+
+            // inherit default matrix layout (changeable via #pragma pack_matrix), if none given.
+            if (member->type->isMatrix() && member->type->getQualifier().layoutMatrix == ElmNone)
+                newUniformMember.type->getQualifier().layoutMatrix = globalUniformDefaults.layoutMatrix;
+
             correctUniform(newUniformMember.type->getQualifier());
             newLists.uniform->push_back(newUniformMember);
         }
@@ -6568,11 +7666,27 @@
 // 'parseType' is the type part of the declaration (to the left)
 // 'arraySizes' is the arrayness tagged on the identifier (to the right)
 //
-TIntermNode* HlslParseContext::declareVariable(const TSourceLoc& loc, const TString& identifier, TType& type, TIntermTyped* initializer)
+TIntermNode* HlslParseContext::declareVariable(const TSourceLoc& loc, const TString& identifier, TType& type,
+                                               TIntermTyped* initializer)
 {
     if (voidErrorCheck(loc, identifier, type.getBasicType()))
         return nullptr;
 
+    // Global consts with initializers that are non-const act like EvqGlobal in HLSL.
+    // This test is implicitly recursive, because initializers propagate constness
+    // up the aggregate node tree during creation.  E.g, for:
+    //    { { 1, 2 }, { 3, 4 } }
+    // the initializer list is marked EvqConst at the top node, and remains so here.  However:
+    //    { 1, { myvar, 2 }, 3 }
+    // is not a const intializer, and still becomes EvqGlobal here.
+
+    const bool nonConstInitializer = (initializer != nullptr && initializer->getQualifier().storage != EvqConst);
+
+    if (type.getQualifier().storage == EvqConst && symbolTable.atGlobalLevel() && nonConstInitializer) {
+        // Force to global
+        type.getQualifier().storage = EvqGlobal;
+    }
+
     // make const and initialization consistent
     fixConstInit(loc, identifier, type, initializer);
 
@@ -6581,7 +7695,7 @@
 
     inheritGlobalDefaults(type.getQualifier());
 
-    const bool flattenVar = shouldFlattenUniform(type);
+    const bool flattenVar = shouldFlatten(type, type.getQualifier().storage, true);
 
     // correct IO in the type
     switch (type.getQualifier().storage) {
@@ -6609,33 +7723,28 @@
         declareArray(loc, identifier, type, symbol, !flattenVar);
     } else {
         // non-array case
-        if (! symbol)
+        if (symbol == nullptr)
             symbol = declareNonArray(loc, identifier, type, !flattenVar);
         else if (type != symbol->getType())
             error(loc, "cannot change the type of", "redeclaration", symbol->getName().c_str());
     }
 
-    if (flattenVar)
-        flatten(loc, *symbol->getAsVariable());
+    if (symbol == nullptr)
+        return nullptr;
 
-    if (! symbol)
+    if (flattenVar)
+        flatten(*symbol->getAsVariable(), symbolTable.atGlobalLevel());
+
+    if (initializer == nullptr)
         return nullptr;
 
     // Deal with initializer
-    TIntermNode* initNode = nullptr;
-    if (symbol && initializer) {
-        if (flattenVar)
-            error(loc, "flattened array with initializer list unsupported", identifier.c_str(), "");
-
-        TVariable* variable = symbol->getAsVariable();
-        if (! variable) {
-            error(loc, "initializer requires a variable, not a member", identifier.c_str(), "");
-            return nullptr;
-        }
-        initNode = executeInitializer(loc, initializer, variable);
+    TVariable* variable = symbol->getAsVariable();
+    if (variable == nullptr) {
+        error(loc, "initializer requires a variable, not a member", identifier.c_str(), "");
+        return nullptr;
     }
-
-    return initNode;
+    return executeInitializer(loc, initializer, variable);
 }
 
 // Pick up global defaults from the provide global defaults into dst.
@@ -6665,7 +7774,8 @@
 }
 
 // Make a symbol node holding a new internal temporary variable.
-TIntermSymbol* HlslParseContext::makeInternalVariableNode(const TSourceLoc& loc, const char* name, const TType& type) const
+TIntermSymbol* HlslParseContext::makeInternalVariableNode(const TSourceLoc& loc, const char* name,
+                                                          const TType& type) const
 {
     TVariable* tmpVar = makeInternalVariable(name, type);
     tmpVar->getWritableType().getQualifier().makeTemporary();
@@ -6679,7 +7789,8 @@
 //
 // Return the successfully declared variable.
 //
-TVariable* HlslParseContext::declareNonArray(const TSourceLoc& loc, const TString& identifier, const TType& type, bool track)
+TVariable* HlslParseContext::declareNonArray(const TSourceLoc& loc, const TString& identifier, const TType& type,
+                                             bool track)
 {
     // make a new variable
     TVariable* variable = new TVariable(&identifier, type);
@@ -6701,6 +7812,8 @@
 // Returning nullptr just means there is no code to execute to handle the
 // initializer, which will, for example, be the case for constant initializers.
 //
+// Returns a subtree that accomplished the initialization.
+//
 TIntermNode* HlslParseContext::executeInitializer(const TSourceLoc& loc, TIntermTyped* initializer, TVariable* variable)
 {
     //
@@ -6724,7 +7837,7 @@
     skeletalType.getQualifier().makeTemporary();
     if (initializer->getAsAggregate() && initializer->getAsAggregate()->getOp() == EOpNull)
         initializer = convertInitializerList(loc, skeletalType, initializer, nullptr);
-    if (! initializer) {
+    if (initializer == nullptr) {
         // error recovery; don't leave const without constant values
         if (qualifier == EvqConst)
             variable->getWritableType().getQualifier().storage = EvqTemporary;
@@ -6732,8 +7845,7 @@
     }
 
     // Fix outer arrayness if variable is unsized, getting size from the initializer
-    if (initializer->getType().isExplicitlySizedArray() &&
-        variable->getType().isImplicitlySizedArray())
+    if (initializer->getType().isSizedArray() && variable->getType().isUnsizedArray())
         variable->getWritableType().changeOuterArraySize(initializer->getType().getOuterArraySize());
 
     // Inner arrayness can also get set by an initializer
@@ -6742,8 +7854,10 @@
         variable->getType().getArraySizes()->getNumDims()) {
         // adopt unsized sizes from the initializer's sizes
         for (int d = 1; d < variable->getType().getArraySizes()->getNumDims(); ++d) {
-            if (variable->getType().getArraySizes()->getDimSize(d) == UnsizedArraySize)
-                variable->getWritableType().getArraySizes().setDimSize(d, initializer->getType().getArraySizes()->getDimSize(d));
+            if (variable->getType().getArraySizes()->getDimSize(d) == UnsizedArraySize) {
+                variable->getWritableType().getArraySizes()->setDimSize(d,
+                    initializer->getType().getArraySizes()->getDimSize(d));
+            }
         }
     }
 
@@ -6753,11 +7867,6 @@
         variable->getWritableType().getQualifier().storage = EvqTemporary;
         return nullptr;
     }
-    if (qualifier == EvqConst && symbolTable.atGlobalLevel() && initializer->getType().getQualifier().storage != EvqConst) {
-        error(loc, "global const initializers must be constant", "=", "'%s'", variable->getType().getCompleteString().c_str());
-        variable->getWritableType().getQualifier().storage = EvqTemporary;
-        return nullptr;
-    }
 
     // Const variables require a constant initializer
     if (qualifier == EvqConst) {
@@ -6787,9 +7896,8 @@
         specializationCheck(loc, initializer->getType(), "initializer");
         TIntermSymbol* intermSymbol = intermediate.addSymbol(*variable, loc);
         TIntermNode* initNode = handleAssign(loc, EOpAssign, intermSymbol, initializer);
-        if (! initNode)
+        if (initNode == nullptr)
             assignError(loc, "=", intermSymbol->getCompleteString(), initializer->getCompleteString());
-
         return initNode;
     }
 
@@ -6817,7 +7925,7 @@
 
     // see if we have bottomed out in the tree within the initializer-list part
     TIntermAggregate* initList = initializer->getAsAggregate();
-    if (! initList || initList->getOp() != EOpNull) {
+    if (initList == nullptr || initList->getOp() != EOpNull) {
         // We don't have a list, but if it's a scalar and the 'type' is a
         // composite, we need to lengthen below to make it useful.
         // Otherwise, this is an already formed object to initialize with.
@@ -6836,20 +7944,20 @@
         // Later on, initializer execution code will deal with array size logic.
         TType arrayType;
         arrayType.shallowCopy(type);                     // sharing struct stuff is fine
-        arrayType.newArraySizes(*type.getArraySizes());  // but get a fresh copy of the array information, to edit below
+        arrayType.copyArraySizes(*type.getArraySizes()); // but get a fresh copy of the array information, to edit below
 
         // edit array sizes to fill in unsized dimensions
-        if (type.isImplicitlySizedArray())
+        if (type.isUnsizedArray())
             arrayType.changeOuterArraySize((int)initList->getSequence().size());
 
         // set unsized array dimensions that can be derived from the initializer's first element
         if (arrayType.isArrayOfArrays() && initList->getSequence().size() > 0) {
             TIntermTyped* firstInit = initList->getSequence()[0]->getAsTyped();
             if (firstInit->getType().isArray() &&
-                arrayType.getArraySizes().getNumDims() == firstInit->getType().getArraySizes()->getNumDims() + 1) {
-                for (int d = 1; d < arrayType.getArraySizes().getNumDims(); ++d) {
-                    if (arrayType.getArraySizes().getDimSize(d) == UnsizedArraySize)
-                        arrayType.getArraySizes().setDimSize(d, firstInit->getType().getArraySizes()->getDimSize(d - 1));
+                arrayType.getArraySizes()->getNumDims() == firstInit->getType().getArraySizes()->getNumDims() + 1) {
+                for (int d = 1; d < arrayType.getArraySizes()->getNumDims(); ++d) {
+                    if (arrayType.getArraySizes()->getDimSize(d) == UnsizedArraySize)
+                        arrayType.getArraySizes()->setDimSize(d, firstInit->getType().getArraySizes()->getDimSize(d - 1));
                 }
             }
         }
@@ -6860,13 +7968,22 @@
         // recursively process each element
         TType elementType(arrayType, 0); // dereferenced type
         for (int i = 0; i < arrayType.getOuterArraySize(); ++i) {
-            initList->getSequence()[i] = convertInitializerList(loc, elementType, initList->getSequence()[i]->getAsTyped(), scalarInit);
+            initList->getSequence()[i] = convertInitializerList(loc, elementType,
+                                                                initList->getSequence()[i]->getAsTyped(), scalarInit);
             if (initList->getSequence()[i] == nullptr)
                 return nullptr;
         }
 
         return addConstructor(loc, initList, arrayType);
     } else if (type.isStruct()) {
+        // do we have implicit assignments to opaques?
+        for (size_t i = initList->getSequence().size(); i < type.getStruct()->size(); ++i) {
+            if ((*type.getStruct())[i].type->containsOpaque()) {
+                error(loc, "cannot implicitly initialize opaque members", "initializer list", "");
+                return nullptr;
+            }
+        }
+
         // lengthen list to be long enough
         lengthenList(loc, initList->getSequence(), static_cast<int>(type.getStruct()->size()), scalarInit);
 
@@ -6875,7 +7992,8 @@
             return nullptr;
         }
         for (size_t i = 0; i < type.getStruct()->size(); ++i) {
-            initList->getSequence()[i] = convertInitializerList(loc, *(*type.getStruct())[i].type, initList->getSequence()[i]->getAsTyped(), scalarInit);
+            initList->getSequence()[i] = convertInitializerList(loc, *(*type.getStruct())[i].type,
+                                                                initList->getSequence()[i]->getAsTyped(), scalarInit);
             if (initList->getSequence()[i] == nullptr)
                 return nullptr;
         }
@@ -6894,7 +8012,8 @@
             }
             TType vectorType(type, 0); // dereferenced type
             for (int i = 0; i < type.getMatrixCols(); ++i) {
-                initList->getSequence()[i] = convertInitializerList(loc, vectorType, initList->getSequence()[i]->getAsTyped(), scalarInit);
+                initList->getSequence()[i] = convertInitializerList(loc, vectorType,
+                                                                    initList->getSequence()[i]->getAsTyped(), scalarInit);
                 if (initList->getSequence()[i] == nullptr)
                     return nullptr;
             }
@@ -6905,7 +8024,8 @@
 
         // error check; we're at bottom, so work is finished below
         if (type.getVectorSize() != (int)initList->getSequence().size()) {
-            error(loc, "wrong vector size (or rows in a matrix column):", "initializer list", type.getCompleteString().c_str());
+            error(loc, "wrong vector size (or rows in a matrix column):", "initializer list",
+                  type.getCompleteString().c_str());
             return nullptr;
         }
     } else if (type.isScalar()) {
@@ -6963,6 +8083,10 @@
     if (node == nullptr)
         return nullptr;
 
+    // Construct identical type
+    if (type == node->getType())
+        return node;
+
     // Handle the idiom "(struct type)<scalar value>"
     if (type.isStruct() && isScalarConstructor(node)) {
         // 'node' will almost always get used multiple times, so should not be used directly,
@@ -6986,6 +8110,10 @@
 
 // Add a constructor, either from the grammar, or other programmatic reasons.
 //
+// 'node' is what to construct from.
+// 'type' is what type to construct.
+//
+// Returns the constructed object.
 // Return nullptr if it can't be done.
 //
 TIntermTyped* HlslParseContext::addConstructor(const TSourceLoc& loc, TIntermTyped* node, const TType& type)
@@ -6993,8 +8121,6 @@
     TIntermAggregate* aggrNode = node->getAsAggregate();
     TOperator op = intermediate.mapTypeToConstructorOp(type);
 
-    // Combined texture-sampler constructors are completely semantic checked
-    // in constructorTextureSamplerError()
     if (op == EOpConstructTextureSampler)
         return intermediate.setAggregateOperator(aggrNode, op, type, loc);
 
@@ -7010,8 +8136,8 @@
         elementType.shallowCopy(type);
 
     bool singleArg;
-    if (aggrNode) {
-        if (aggrNode->getOp() != EOpNull || aggrNode->getSequence().size() == 1)
+    if (aggrNode != nullptr) {
+        if (aggrNode->getOp() != EOpNull)
             singleArg = true;
         else
             singleArg = false;
@@ -7020,14 +8146,27 @@
 
     TIntermTyped *newNode;
     if (singleArg) {
+        // Handle array -> array conversion
+        // Constructing an array of one type from an array of another type is allowed,
+        // assuming there are enough components available (semantic-checked earlier).
+        if (type.isArray() && node->isArray())
+            newNode = convertArray(node, type);
+
         // If structure constructor or array constructor is being called
-        // for only one parameter inside the structure, we need to call constructAggregate function once.
-        if (type.isArray())
+        // for only one parameter inside the aggregate, we need to call constructAggregate function once.
+        else if (type.isArray())
             newNode = constructAggregate(node, elementType, 1, node->getLoc());
         else if (op == EOpConstructStruct)
             newNode = constructAggregate(node, *(*memberTypes).type, 1, node->getLoc());
-        else
+        else {
+            // shape conversion for matrix constructor from scalar.  HLSL semantics are: scalar
+            // is replicated into every element of the matrix (not just the diagnonal), so
+            // that is handled specially here.
+            if (type.isMatrix() && node->getType().isScalarOrVec1())
+                node = intermediate.addShapeConversion(type, node);
+
             newNode = constructBuiltIn(type, op, node, node->getLoc(), false);
+        }
 
         if (newNode && (type.isArray() || op == EOpConstructStruct))
             newNode = intermediate.setAggregateOperator(newNode, EOpConstructStruct, type, loc);
@@ -7038,7 +8177,7 @@
     //
     // Handle list of arguments.
     //
-    TIntermSequence &sequenceVector = aggrNode->getSequence();    // Stores the information about the parameter to the constructor
+    TIntermSequence& sequenceVector = aggrNode->getSequence();    // Stores the information about the parameter to the constructor
     // if the structure constructor contains more than one parameter, then construct
     // each parameter
 
@@ -7075,7 +8214,8 @@
 //
 // Returns nullptr for an error or the constructed node.
 //
-TIntermTyped* HlslParseContext::constructBuiltIn(const TType& type, TOperator op, TIntermTyped* node, const TSourceLoc& loc, bool subset)
+TIntermTyped* HlslParseContext::constructBuiltIn(const TType& type, TOperator op, TIntermTyped* node,
+                                                 const TSourceLoc& loc, bool subset)
 {
     TIntermTyped* newNode;
     TOperator basicOp;
@@ -7084,6 +8224,22 @@
     // First, convert types as needed.
     //
     switch (op) {
+    case EOpConstructF16Vec2:
+    case EOpConstructF16Vec3:
+    case EOpConstructF16Vec4:
+    case EOpConstructF16Mat2x2:
+    case EOpConstructF16Mat2x3:
+    case EOpConstructF16Mat2x4:
+    case EOpConstructF16Mat3x2:
+    case EOpConstructF16Mat3x3:
+    case EOpConstructF16Mat3x4:
+    case EOpConstructF16Mat4x2:
+    case EOpConstructF16Mat4x3:
+    case EOpConstructF16Mat4x4:
+    case EOpConstructFloat16:
+        basicOp = EOpConstructFloat16;
+        break;
+
     case EOpConstructVec2:
     case EOpConstructVec3:
     case EOpConstructVec4:
@@ -7116,16 +8272,48 @@
         basicOp = EOpConstructDouble;
         break;
 
+    case EOpConstructI16Vec2:
+    case EOpConstructI16Vec3:
+    case EOpConstructI16Vec4:
+    case EOpConstructInt16:
+        basicOp = EOpConstructInt16;
+        break;
+
     case EOpConstructIVec2:
     case EOpConstructIVec3:
     case EOpConstructIVec4:
+    case EOpConstructIMat2x2:
+    case EOpConstructIMat2x3:
+    case EOpConstructIMat2x4:
+    case EOpConstructIMat3x2:
+    case EOpConstructIMat3x3:
+    case EOpConstructIMat3x4:
+    case EOpConstructIMat4x2:
+    case EOpConstructIMat4x3:
+    case EOpConstructIMat4x4:
     case EOpConstructInt:
         basicOp = EOpConstructInt;
         break;
 
+    case EOpConstructU16Vec2:
+    case EOpConstructU16Vec3:
+    case EOpConstructU16Vec4:
+    case EOpConstructUint16:
+        basicOp = EOpConstructUint16;
+        break;
+
     case EOpConstructUVec2:
     case EOpConstructUVec3:
     case EOpConstructUVec4:
+    case EOpConstructUMat2x2:
+    case EOpConstructUMat2x3:
+    case EOpConstructUMat2x4:
+    case EOpConstructUMat3x2:
+    case EOpConstructUMat3x3:
+    case EOpConstructUMat3x4:
+    case EOpConstructUMat4x2:
+    case EOpConstructUMat4x3:
+    case EOpConstructUMat4x4:
     case EOpConstructUint:
         basicOp = EOpConstructUint;
         break;
@@ -7133,6 +8321,15 @@
     case EOpConstructBVec2:
     case EOpConstructBVec3:
     case EOpConstructBVec4:
+    case EOpConstructBMat2x2:
+    case EOpConstructBMat2x3:
+    case EOpConstructBMat2x4:
+    case EOpConstructBMat3x2:
+    case EOpConstructBMat3x3:
+    case EOpConstructBMat3x4:
+    case EOpConstructBMat4x2:
+    case EOpConstructBMat4x3:
+    case EOpConstructBMat4x4:
     case EOpConstructBool:
         basicOp = EOpConstructBool;
         break;
@@ -7160,15 +8357,88 @@
     return intermediate.setAggregateOperator(newNode, op, type, loc);
 }
 
+// Convert the array in node to the requested type, which is also an array.
+// Returns nullptr on failure, otherwise returns aggregate holding the list of
+// elements needed to construct the array.
+TIntermTyped* HlslParseContext::convertArray(TIntermTyped* node, const TType& type)
+{
+    assert(node->isArray() && type.isArray());
+    if (node->getType().computeNumComponents() < type.computeNumComponents())
+        return nullptr;
+
+    // TODO: write an argument replicator, for the case the argument should not be
+    // executed multiple times, yet multiple copies are needed.
+
+    TIntermTyped* constructee = node->getAsTyped();
+    // track where we are in consuming the argument
+    int constructeeElement = 0;
+    int constructeeComponent = 0;
+
+    // bump up to the next component to consume
+    const auto getNextComponent = [&]() {
+        TIntermTyped* component;
+        component = handleBracketDereference(node->getLoc(), constructee, 
+                                             intermediate.addConstantUnion(constructeeElement, node->getLoc()));
+        if (component->isVector())
+            component = handleBracketDereference(node->getLoc(), component,
+                                                 intermediate.addConstantUnion(constructeeComponent, node->getLoc()));
+        // bump component pointer up
+        ++constructeeComponent;
+        if (constructeeComponent == constructee->getVectorSize()) {
+            constructeeComponent = 0;
+            ++constructeeElement;
+        }
+        return component;
+    };
+
+    // make one subnode per constructed array element
+    TIntermAggregate* constructor = nullptr;
+    TType derefType(type, 0);
+    TType speculativeComponentType(derefType, 0);
+    TType* componentType = derefType.isVector() ? &speculativeComponentType : &derefType;
+    TOperator componentOp = intermediate.mapTypeToConstructorOp(*componentType);
+    TType crossType(node->getBasicType(), EvqTemporary, type.getVectorSize());
+    for (int e = 0; e < type.getOuterArraySize(); ++e) {
+        // construct an element
+        TIntermTyped* elementArg;
+        if (type.getVectorSize() == constructee->getVectorSize()) {
+            // same element shape
+            elementArg = handleBracketDereference(node->getLoc(), constructee,
+                                                  intermediate.addConstantUnion(e, node->getLoc()));
+        } else {
+            // mismatched element shapes
+            if (type.getVectorSize() == 1)
+                elementArg = getNextComponent();
+            else {
+                // make a vector
+                TIntermAggregate* elementConstructee = nullptr;
+                for (int c = 0; c < type.getVectorSize(); ++c)
+                    elementConstructee = intermediate.growAggregate(elementConstructee, getNextComponent());
+                elementArg = addConstructor(node->getLoc(), elementConstructee, crossType);
+            }
+        }
+        // convert basic types
+        elementArg = intermediate.addConversion(componentOp, derefType, elementArg);
+        if (elementArg == nullptr)
+            return nullptr;
+        // combine with top-level constructor
+        constructor = intermediate.growAggregate(constructor, elementArg);
+    }
+
+    return constructor;
+}
+
 // This function tests for the type of the parameters to the structure or array constructor. Raises
 // an error message if the expected type does not match the parameter passed to the constructor.
 //
 // Returns nullptr for an error or the input node itself if the expected and the given parameter types match.
 //
-TIntermTyped* HlslParseContext::constructAggregate(TIntermNode* node, const TType& type, int paramCount, const TSourceLoc& loc)
+TIntermTyped* HlslParseContext::constructAggregate(TIntermNode* node, const TType& type, int paramCount,
+                                                   const TSourceLoc& loc)
 {
+    // Handle cases that map more 1:1 between constructor arguments and constructed.
     TIntermTyped* converted = intermediate.addConversion(EOpConstructStruct, type, node->getAsTyped());
-    if (! converted || converted->getType() != type) {
+    if (converted == nullptr || converted->getType() != type) {
         error(loc, "", "constructor", "cannot convert parameter %d from '%s' to '%s'", paramCount,
             node->getAsTyped()->getType().getCompleteString().c_str(), type.getCompleteString().c_str());
 
@@ -7181,7 +8451,7 @@
 //
 // Do everything needed to add an interface block.
 //
-void HlslParseContext::declareBlock(const TSourceLoc& loc, TType& type, const TString* instanceName, TArraySizes* arraySizes)
+void HlslParseContext::declareBlock(const TSourceLoc& loc, TType& type, const TString* instanceName)
 {
     assert(type.getWritableStruct() != nullptr);
 
@@ -7189,10 +8459,6 @@
     switch (type.getQualifier().storage) {
     case EvqUniform:
     case EvqBuffer:
-        // remember pre-sanitized builtin type
-        if (type.getQualifier().storage == EvqBuffer && instanceName != nullptr)
-            structBufferBuiltIn[*instanceName] = type.getQualifier().builtIn;
-
         correctUniform(type.getQualifier());
         break;
     case EvqVaryingIn:
@@ -7222,17 +8488,17 @@
             case EvqBuffer:
                 correctUniform(type.getQualifier());
                 if (it != ioTypeMap.end() && it->second.uniform)
-                    type.setStruct(it->second.uniform);
+                    memberType.setStruct(it->second.uniform);
                 break;
             case EvqVaryingIn:
                 correctInput(type.getQualifier());
                 if (it != ioTypeMap.end() && it->second.input)
-                    type.setStruct(it->second.input);
+                    memberType.setStruct(it->second.input);
                 break;
             case EvqVaryingOut:
                 correctOutput(type.getQualifier());
                 if (it != ioTypeMap.end() && it->second.output)
-                    type.setStruct(it->second.output);
+                    memberType.setStruct(it->second.output);
                 break;
             default:
                 break;
@@ -7240,13 +8506,6 @@
         }
     }
 
-    // This might be a redeclaration of a built-in block.  If so, redeclareBuiltinBlock() will
-    // do all the rest.
-    // if (! symbolTable.atBuiltInLevel() && builtInName(*blockName)) {
-    //    redeclareBuiltinBlock(loc, typeList, *blockName, instanceName, arraySizes);
-    //    return;
-    //}
-
     // Make default block qualification, and adjust the member qualifications
 
     TQualifier defaultQualification;
@@ -7305,7 +8564,7 @@
 
     // Process the members
     fixBlockLocations(loc, type.getQualifier(), typeList, memberWithLocation, memberWithoutLocation);
-    fixBlockXfbOffsets(type.getQualifier(), typeList);
+    fixXfbOffsets(type.getQualifier(), typeList);
     fixBlockUniformOffsets(type.getQualifier(), typeList);
 
     // reverse merge, so that currentBlockQualifier now has all layout information
@@ -7320,18 +8579,19 @@
     const TString& interfaceName = (instanceName && !instanceName->empty()) ? *instanceName : type.getTypeName();
 
     TType blockType(&typeList, interfaceName, type.getQualifier());
-    if (arraySizes)
-        blockType.newArraySizes(*arraySizes);
+    if (type.isArray())
+        blockType.transferArraySizes(type.getArraySizes());
 
     // Add the variable, as anonymous or named instanceName.
     // Make an anonymous variable if no name was provided.
-    if (! instanceName)
+    if (instanceName == nullptr)
         instanceName = NewPoolTString("");
 
     TVariable& variable = *new TVariable(instanceName, blockType);
     if (! symbolTable.insert(variable)) {
         if (*instanceName == "")
-            error(loc, "nameless block contains a member that already has a name at global scope", "" /* blockName->c_str() */, "");
+            error(loc, "nameless block contains a member that already has a name at global scope",
+                  "" /* blockName->c_str() */, "");
         else
             error(loc, "block instance name redefinition", variable.getName().c_str(), "");
 
@@ -7339,7 +8599,8 @@
     }
 
     // Save it in the AST for linker use.
-    trackLinkage(variable);
+    if (symbolTable.atGlobalLevel())
+        trackLinkage(variable);
 }
 
 //
@@ -7379,13 +8640,14 @@
                     memberQualifier.layoutLocation = nextLocation;
                     memberQualifier.layoutComponent = 0;
                 }
-                nextLocation = memberQualifier.layoutLocation + intermediate.computeTypeLocationSize(*typeList[member].type);
+                nextLocation = memberQualifier.layoutLocation +
+                               intermediate.computeTypeLocationSize(*typeList[member].type, language);
             }
         }
     }
 }
 
-void HlslParseContext::fixBlockXfbOffsets(TQualifier& qualifier, TTypeList& typeList)
+void HlslParseContext::fixXfbOffsets(TQualifier& qualifier, TTypeList& typeList)
 {
     // "If a block is qualified with xfb_offset, all its
     // members are assigned transform feedback buffer offsets. If a block is not qualified with xfb_offset, any
@@ -7426,7 +8688,7 @@
 {
     if (! qualifier.isUniformOrBuffer())
         return;
-    if (qualifier.layoutPacking != ElpStd140 && qualifier.layoutPacking != ElpStd430)
+    if (qualifier.layoutPacking != ElpStd140 && qualifier.layoutPacking != ElpStd430 && qualifier.layoutPacking != ElpScalar)
         return;
 
     int offset = 0;
@@ -7440,10 +8702,11 @@
         // modify just the children's view of matrix layout, if there is one for this member
         TLayoutMatrix subMatrixLayout = typeList[member].type->getQualifier().layoutMatrix;
         int dummyStride;
-        int memberAlignment = intermediate.getBaseAlignment(*typeList[member].type, memberSize, dummyStride,
-                                                            qualifier.layoutPacking == ElpStd140,
-                                                            subMatrixLayout != ElmNone ? subMatrixLayout == ElmRowMajor
-                                                                                       : qualifier.layoutMatrix == ElmRowMajor);
+        int memberAlignment = intermediate.getMemberAlignment(*typeList[member].type, memberSize, dummyStride,
+                                                              qualifier.layoutPacking,
+                                                              subMatrixLayout != ElmNone
+                                                                  ? subMatrixLayout == ElmRowMajor
+                                                                  : qualifier.layoutMatrix == ElmRowMajor);
         if (memberQualifier.hasOffset()) {
             // "The specified offset must be a multiple
             // of the base alignment of the type of the block member it qualifies, or a compile-time error results."
@@ -7475,7 +8738,7 @@
 void HlslParseContext::addQualifierToExisting(const TSourceLoc& loc, TQualifier qualifier, const TString& identifier)
 {
     TSymbol* symbol = symbolTable.find(identifier);
-    if (! symbol) {
+    if (symbol == nullptr) {
         error(loc, "identifier not previously declared", identifier.c_str(), "");
         return;
     }
@@ -7551,6 +8814,11 @@
 //
 bool HlslParseContext::handleOutputGeometry(const TSourceLoc& loc, const TLayoutGeometry& geometry)
 {
+    // If this is not a geometry shader, ignore.  It might be a mixed shader including several stages.
+    // Since that's an OK situation, return true for success.
+    if (language != EShLangGeometry)
+        return true;
+
     switch (geometry) {
     case ElgPoints:
     case ElgLineStrip:
@@ -7569,18 +8837,76 @@
 }
 
 //
-// Loop hints
+// Selection attributes
 //
-TLoopControl HlslParseContext::handleLoopControl(const TAttributeMap& attributes) const
+void HlslParseContext::handleSelectionAttributes(const TSourceLoc& loc, TIntermSelection* selection,
+    const TAttributes& attributes)
 {
-    if (attributes.contains(EatUnroll))
-        return ELoopControlUnroll;
-    else if (attributes.contains(EatLoop))
-        return ELoopControlDontUnroll;
-    else
-        return ELoopControlNone;
+    if (selection == nullptr)
+        return;
+
+    for (auto it = attributes.begin(); it != attributes.end(); ++it) {
+        switch (it->name) {
+        case EatFlatten:
+            selection->setFlatten();
+            break;
+        case EatBranch:
+            selection->setDontFlatten();
+            break;
+        default:
+            warn(loc, "attribute does not apply to a selection", "", "");
+            break;
+        }
+    }
 }
 
+//
+// Switch attributes
+//
+void HlslParseContext::handleSwitchAttributes(const TSourceLoc& loc, TIntermSwitch* selection,
+    const TAttributes& attributes)
+{
+    if (selection == nullptr)
+        return;
+
+    for (auto it = attributes.begin(); it != attributes.end(); ++it) {
+        switch (it->name) {
+        case EatFlatten:
+            selection->setFlatten();
+            break;
+        case EatBranch:
+            selection->setDontFlatten();
+            break;
+        default:
+            warn(loc, "attribute does not apply to a switch", "", "");
+            break;
+        }
+    }
+}
+
+//
+// Loop attributes
+//
+void HlslParseContext::handleLoopAttributes(const TSourceLoc& loc, TIntermLoop* loop,
+    const TAttributes& attributes)
+{
+    if (loop == nullptr)
+        return;
+
+    for (auto it = attributes.begin(); it != attributes.end(); ++it) {
+        switch (it->name) {
+        case EatUnroll:
+            loop->setUnroll();
+            break;
+        case EatLoop:
+            loop->setDontUnroll();
+            break;
+        default:
+            warn(loc, "attribute does not apply to a loop", "", "");
+            break;
+        }
+    }
+}
 
 //
 // Updating default qualifier for the case of a declaration with just a qualifier,
@@ -7608,12 +8934,14 @@
             case ElgIsolines:
                 break;
             default:
-                error(loc, "cannot apply to input", TQualifier::getGeometryString(publicType.shaderQualifiers.geometry), "");
+                error(loc, "cannot apply to input", TQualifier::getGeometryString(publicType.shaderQualifiers.geometry),
+                      "");
             }
         } else if (publicType.qualifier.storage == EvqVaryingOut) {
             handleOutputGeometry(loc, publicType.shaderQualifiers.geometry);
         } else
-            error(loc, "cannot apply to:", TQualifier::getGeometryString(publicType.shaderQualifiers.geometry), GetStorageQualifierString(publicType.qualifier.storage));
+            error(loc, "cannot apply to:", TQualifier::getGeometryString(publicType.shaderQualifiers.geometry),
+                  GetStorageQualifierString(publicType.qualifier.storage));
     }
     if (publicType.shaderQualifiers.spacing != EvsNone)
         intermediate.setVertexSpacing(publicType.shaderQualifiers.spacing);
@@ -7671,7 +8999,8 @@
             globalOutputDefaults.layoutXfbBuffer = qualifier.layoutXfbBuffer;
         if (globalOutputDefaults.hasXfbBuffer() && qualifier.hasXfbStride()) {
             if (! intermediate.setXfbBufferStride(globalOutputDefaults.layoutXfbBuffer, qualifier.layoutXfbStride))
-                error(loc, "all stride settings must match for xfb buffer", "xfb_stride", "%d", qualifier.layoutXfbBuffer);
+                error(loc, "all stride settings must match for xfb buffer", "xfb_stride", "%d",
+                      qualifier.layoutXfbBuffer);
         }
         break;
     default:
@@ -7720,7 +9049,8 @@
 // Turn the top-level node sequence built up of wrapupSwitchSubsequence
 // into a switch node.
 //
-TIntermNode* HlslParseContext::addSwitch(const TSourceLoc& loc, TIntermTyped* expression, TIntermAggregate* lastStatements)
+TIntermNode* HlslParseContext::addSwitch(const TSourceLoc& loc, TIntermTyped* expression,
+                                         TIntermAggregate* lastStatements, const TAttributes& attributes)
 {
     wrapupSwitchSubsequence(lastStatements, nullptr);
 
@@ -7747,17 +9077,30 @@
 
     TIntermSwitch* switchNode = new TIntermSwitch(expression, body);
     switchNode->setLoc(loc);
+    handleSwitchAttributes(loc, switchNode, attributes);
 
     return switchNode;
 }
 
 // Make a new symbol-table level that is made out of the members of a structure.
 // This should be done as an anonymous struct (name is "") so that the symbol table
-// finds the members with on explicit reference to a 'this' variable.
-void HlslParseContext::pushThisScope(const TType& thisStruct)
+// finds the members with no explicit reference to a 'this' variable.
+void HlslParseContext::pushThisScope(const TType& thisStruct, const TVector<TFunctionDeclarator>& functionDeclarators)
 {
+    // member variables
     TVariable& thisVariable = *new TVariable(NewPoolTString(""), thisStruct);
     symbolTable.pushThis(thisVariable);
+
+    // member functions
+    for (auto it = functionDeclarators.begin(); it != functionDeclarators.end(); ++it) {
+        // member should have a prefix matching currentTypePrefix.back()
+        // but, symbol lookup within the class scope will just use the
+        // unprefixed name. Hence, there are two: one fully prefixed and
+        // one with no prefix.
+        TFunction& member = *it->function->clone();
+        member.removePrefix(currentTypePrefix.back());
+        symbolTable.insert(member);
+    }
 }
 
 // Track levels of class/struct/namespace nesting with a prefix string using
@@ -7772,11 +9115,10 @@
 {
     // make new type prefix
     TString newPrefix;
-    if (currentTypePrefix.size() > 0) {
+    if (currentTypePrefix.size() > 0)
         newPrefix = currentTypePrefix.back();
-        newPrefix.append(scopeMangler);
-    }
     newPrefix.append(typeName);
+    newPrefix.append(scopeMangler);
     currentTypePrefix.push_back(newPrefix);
 }
 
@@ -7788,13 +9130,12 @@
 
 // Use the class/struct nesting string to create a global name for
 // a member of a class/struct.
-void HlslParseContext::getFullNamespaceName(const TString*& name) const
+void HlslParseContext::getFullNamespaceName(TString*& name) const
 {
     if (currentTypePrefix.size() == 0)
         return;
 
     TString* fullName = NewPoolTString(currentTypePrefix.back().c_str());
-    fullName->append(scopeMangler);
     fullName->append(*name);
     name = fullName;
 }
@@ -7805,15 +9146,6 @@
     name.append(scopeMangler);
 }
 
-// Potentially rename shader entry point function
-void HlslParseContext::renameShaderFunction(const TString*& name) const
-{
-    // Replace the entry point name given in the shader with the real entry point name,
-    // if there is a substitution.
-    if (name != nullptr && *name == sourceEntryPointName)
-        name = NewPoolTString(intermediate.getEntryPointName().c_str());
-}
-
 // Return true if this has uniform-interface like decorations.
 bool HlslParseContext::hasUniform(const TQualifier& qualifier) const
 {
@@ -7867,7 +9199,7 @@
     case EbvVertexIndex:
         return language == EShLangVertex;
     case EbvPrimitiveId:
-        return language == EShLangGeometry || language == EShLangFragment;
+        return language == EShLangGeometry || language == EShLangFragment || language == EShLangTessControl;
     case EbvTessLevelInner:
     case EbvTessLevelOuter:
         return language == EShLangTessEvaluation;
@@ -7913,9 +9245,9 @@
         return language == EShLangFragment;
     case EbvLayer:
     case EbvViewportIndex:
-        return language == EShLangGeometry;
+        return language == EShLangGeometry || language == EShLangVertex;
     case EbvPrimitiveId:
-        return language == EShLangGeometry || language == EShLangTessControl || language == EShLangTessEvaluation;
+        return language == EShLangGeometry;
     case EbvTessLevelInner:
     case EbvTessLevelOuter:
         return language == EShLangTessControl;
@@ -7979,11 +9311,17 @@
         qualifier.patch = false;
 
     switch (qualifier.builtIn) {
+    case EbvFragDepth:
+        intermediate.setDepthReplacing();
+        intermediate.setDepth(EldAny);
+        break;
     case EbvFragDepthGreater:
+        intermediate.setDepthReplacing();
         intermediate.setDepth(EldGreater);
         qualifier.builtIn = EbvFragDepth;
         break;
     case EbvFragDepthLesser:
+        intermediate.setDepthReplacing();
         intermediate.setDepth(EldLess);
         qualifier.builtIn = EbvFragDepth;
         break;
@@ -7998,6 +9336,9 @@
 // Make the IO decorations etc. be appropriate only for uniform type interfaces.
 void HlslParseContext::correctUniform(TQualifier& qualifier)
 {
+    if (qualifier.declaredBuiltIn == EbvNone)
+        qualifier.declaredBuiltIn = qualifier.builtIn;
+
     qualifier.builtIn = EbvNone;
     qualifier.clearInterstage();
     qualifier.clearInterstageLayout();
@@ -8011,29 +9352,128 @@
 }
 
 
-// Return a symbol for the linkage variable of the given TBuiltInVariable type
-TIntermSymbol* HlslParseContext::findLinkageSymbol(TBuiltInVariable biType) const
+// Set texture return type.  Returns success (not all types are valid).
+bool HlslParseContext::setTextureReturnType(TSampler& sampler, const TType& retType, const TSourceLoc& loc)
 {
-    const auto it = builtInLinkageSymbols.find(biType);
-    if (it == builtInLinkageSymbols.end())  // if it wasn't declared by the user, return nullptr
+    // Seed the output with an invalid index.  We will set it to a valid one if we can.
+    sampler.structReturnIndex = TSampler::noReturnStruct;
+
+    // Arrays aren't supported.
+    if (retType.isArray()) {
+        error(loc, "Arrays not supported in texture template types", "", "");
+        return false;
+    }
+
+    // If return type is a vector, remember the vector size in the sampler, and return.
+    if (retType.isVector() || retType.isScalar()) {
+        sampler.vectorSize = retType.getVectorSize();
+        return true;
+    }
+
+    // If it wasn't a vector, it must be a struct meeting certain requirements.  The requirements
+    // are checked below: just check for struct-ness here.
+    if (!retType.isStruct()) {
+        error(loc, "Invalid texture template type", "", "");
+        return false;
+    }
+
+    // TODO: Subpass doesn't handle struct returns, due to some oddities with fn overloading.
+    if (sampler.isSubpass()) {
+        error(loc, "Unimplemented: structure template type in subpass input", "", "");
+        return false;
+    }
+
+    TTypeList* members = retType.getWritableStruct();
+
+    // Check for too many or not enough structure members.
+    if (members->size() > 4 || members->size() == 0) {
+        error(loc, "Invalid member count in texture template structure", "", "");
+        return false;
+    }
+
+    // Error checking: We must have <= 4 total components, all of the same basic type.
+    unsigned totalComponents = 0;
+    for (unsigned m = 0; m < members->size(); ++m) {
+        // Check for bad member types
+        if (!(*members)[m].type->isScalar() && !(*members)[m].type->isVector()) {
+            error(loc, "Invalid texture template struct member type", "", "");
+            return false;
+        }
+
+        const unsigned memberVectorSize = (*members)[m].type->getVectorSize();
+        totalComponents += memberVectorSize;
+
+        // too many total member components
+        if (totalComponents > 4) {
+            error(loc, "Too many components in texture template structure type", "", "");
+            return false;
+        }
+
+        // All members must be of a common basic type
+        if ((*members)[m].type->getBasicType() != (*members)[0].type->getBasicType()) {
+            error(loc, "Texture template structure members must same basic type", "", "");
+            return false;
+        }
+    }
+
+    // If the structure in the return type already exists in the table, we'll use it.  Otherwise, we'll make
+    // a new entry.  This is a linear search, but it hardly ever happens, and the list cannot be very large.
+    for (unsigned int idx = 0; idx < textureReturnStruct.size(); ++idx) {
+        if (textureReturnStruct[idx] == members) {
+            sampler.structReturnIndex = idx;
+            return true;
+        }
+    }
+
+    // It wasn't found as an existing entry.  See if we have room for a new one.
+    if (textureReturnStruct.size() >= TSampler::structReturnSlots) {
+        error(loc, "Texture template struct return slots exceeded", "", "");
+        return false;
+    }
+
+    // Insert it in the vector that tracks struct return types.
+    sampler.structReturnIndex = unsigned(textureReturnStruct.size());
+    textureReturnStruct.push_back(members);
+    
+    // Success!
+    return true;
+}
+
+// Return the sampler return type in retType.
+void HlslParseContext::getTextureReturnType(const TSampler& sampler, TType& retType) const
+{
+    if (sampler.hasReturnStruct()) {
+        assert(textureReturnStruct.size() >= sampler.structReturnIndex);
+
+        // We land here if the texture return is a structure.
+        TTypeList* blockStruct = textureReturnStruct[sampler.structReturnIndex];
+
+        const TType resultType(blockStruct, "");
+        retType.shallowCopy(resultType);
+    } else {
+        // We land here if the texture return is a vector or scalar.
+        const TType resultType(sampler.type, EvqTemporary, sampler.getVectorSize());
+        retType.shallowCopy(resultType);
+    }
+}
+
+
+// Return a symbol for the tessellation linkage variable of the given TBuiltInVariable type
+TIntermSymbol* HlslParseContext::findTessLinkageSymbol(TBuiltInVariable biType) const
+{
+    const auto it = builtInTessLinkageSymbols.find(biType);
+    if (it == builtInTessLinkageSymbols.end())  // if it wasn't declared by the user, return nullptr
         return nullptr;
 
     return intermediate.addSymbol(*it->second->getAsVariable());
 }
 
-// Finalization step: Add patch constant function invocation
-void HlslParseContext::addPatchConstantInvocation()
+// Find the patch constant function (issues error, returns nullptr if not found)
+const TFunction* HlslParseContext::findPatchConstantFunction(const TSourceLoc& loc)
 {
-    TSourceLoc loc;
-    loc.init();
-
-    // If there's no patch constant function, or we're not a HS, do nothing.
-    if (patchConstantFunctionName.empty() || language != EShLangTessControl)
-        return;
-
     if (symbolTable.isFunctionNameVariable(patchConstantFunctionName)) {
         error(loc, "can't use variable in patch constant function", patchConstantFunctionName.c_str(), "");
-        return;
+        return nullptr;
     }
 
     const TString mangledName = patchConstantFunctionName + "(";
@@ -8047,7 +9487,7 @@
     // allow any disambiguation of overloads.
     if (candidateList.empty()) {
         error(loc, "patch constant function not found", patchConstantFunctionName.c_str(), "");
-        return;
+        return nullptr;
     }
 
     // Based on directed experiments, it appears that if there are overloaded patchconstantfunctions,
@@ -8055,10 +9495,23 @@
     // out if there is more than one candidate.
     if (candidateList.size() > 1) {
         error(loc, "ambiguous patch constant function", patchConstantFunctionName.c_str(), "");
-        return;
+        return nullptr;
     }
 
-    // Look for builtin variables in a function's parameter list.
+    return candidateList[0];
+}
+
+// Finalization step: Add patch constant function invocation
+void HlslParseContext::addPatchConstantInvocation()
+{
+    TSourceLoc loc;
+    loc.init();
+
+    // If there's no patch constant function, or we're not a HS, do nothing.
+    if (patchConstantFunctionName.empty() || language != EShLangTessControl)
+        return;
+
+    // Look for built-in variables in a function's parameter list.
     const auto findBuiltIns = [&](const TFunction& function, std::set<tInterstageIoData>& builtIns) {
         for (int p=0; p<function.getParamCount(); ++p) {
             TStorageQualifier storage = function[p].type->getQualifier().storage;
@@ -8066,15 +9519,14 @@
             if (storage == EvqConstReadOnly) // treated identically to input
                 storage = EvqIn;
 
-            if (function[p].declaredBuiltIn != EbvNone)
-                builtIns.insert(HlslParseContext::tInterstageIoData(function[p].declaredBuiltIn, storage));
+            if (function[p].getDeclaredBuiltIn() != EbvNone)
+                builtIns.insert(HlslParseContext::tInterstageIoData(function[p].getDeclaredBuiltIn(), storage));
             else
                 builtIns.insert(HlslParseContext::tInterstageIoData(function[p].type->getQualifier().builtIn, storage));
         }
     };
 
-
-    // If we synthesize a builtin interface variable, we must add it to the linkage.
+    // If we synthesize a built-in interface variable, we must add it to the linkage.
     const auto addToLinkage = [&](const TType& type, const TString* name, TIntermSymbol** symbolNode) {
         if (name == nullptr) {
             error(loc, "unable to locate patch function parameter name", "", "");
@@ -8095,21 +9547,21 @@
         }
     };
 
-    const auto isOutputPatch = [this](TFunction& patchConstantFunction, int param) {
+    const auto isOutputPatch = [](TFunction& patchConstantFunction, int param) {
         const TType& type = *patchConstantFunction[param].type;
-        const TBuiltInVariable biType = patchConstantFunction[param].declaredBuiltIn;
+        const TBuiltInVariable biType = patchConstantFunction[param].getDeclaredBuiltIn();
 
-        return type.isArray() && !type.isRuntimeSizedArray() && biType == EbvOutputPatch;
+        return type.isSizedArray() && biType == EbvOutputPatch;
     };
     
     // We will perform these steps.  Each is in a scoped block for separation: they could
     // become separate functions to make addPatchConstantInvocation shorter.
     // 
-    // 1. Union the interfaces, and create builtins for anything present in the PCF and
-    //    declared as a builtin variable that isn't present in the entry point's signature.
+    // 1. Union the interfaces, and create built-ins for anything present in the PCF and
+    //    declared as a built-in variable that isn't present in the entry point's signature.
     //
-    // 2. Synthesizes a call to the patchconstfunction using builtin variables from either main,
-    //    or the ones we created.  Matching is based on builtin type.  We may use synthesized
+    // 2. Synthesizes a call to the patchconstfunction using built-in variables from either main,
+    //    or the ones we created.  Matching is based on built-in type.  We may use synthesized
     //    variables from (1) above.
     // 
     // 2B: Synthesize per control point invocations of wrapped entry point if the PCF requires them.
@@ -8123,9 +9575,15 @@
     // 
     // 5/5B. Call the PCF inside an if test for (invocation id == 0).
 
-    TFunction& patchConstantFunction = const_cast<TFunction&>(*candidateList[0]);
+    TFunction* patchConstantFunctionPtr = const_cast<TFunction*>(findPatchConstantFunction(loc));
+
+    if (patchConstantFunctionPtr == nullptr)
+        return;
+
+    TFunction& patchConstantFunction = *patchConstantFunctionPtr;
+
     const int pcfParamCount = patchConstantFunction.getParamCount();
-    TIntermSymbol* invocationIdSym = findLinkageSymbol(EbvInvocationId);
+    TIntermSymbol* invocationIdSym = findTessLinkageSymbol(EbvInvocationId);
     TIntermSequence& epBodySeq = entryPointFunctionBody->getAsAggregate()->getSequence();
 
     int outPatchParam = -1; // -1 means there isn't one.
@@ -8133,8 +9591,8 @@
     // ================ Step 1A: Union Interfaces ================
     // Our patch constant function.
     {
-        std::set<tInterstageIoData> pcfBuiltIns;  // patch constant function builtins
-        std::set<tInterstageIoData> epfBuiltIns;  // entry point function builtins
+        std::set<tInterstageIoData> pcfBuiltIns;  // patch constant function built-ins
+        std::set<tInterstageIoData> epfBuiltIns;  // entry point function built-ins
 
         assert(entryPointFunction);
         assert(entryPointFunctionBody);
@@ -8142,7 +9600,7 @@
         findBuiltIns(patchConstantFunction, pcfBuiltIns);
         findBuiltIns(*entryPointFunction,   epfBuiltIns);
 
-        // Find the set of builtins in the PCF that are not present in the entry point.
+        // Find the set of built-ins in the PCF that are not present in the entry point.
         std::set<tInterstageIoData> notInEntryPoint;
 
         notInEntryPoint = pcfBuiltIns;
@@ -8153,7 +9611,7 @@
 
         // Now we'll add those to the entry and to the linkage.
         for (int p=0; p<pcfParamCount; ++p) {
-            const TBuiltInVariable biType   = patchConstantFunction[p].declaredBuiltIn;
+            const TBuiltInVariable biType   = patchConstantFunction[p].getDeclaredBuiltIn();
             TStorageQualifier storage = patchConstantFunction[p].type->getQualifier().storage;
 
             // Track whether there is an output patch param
@@ -8172,10 +9630,10 @@
                 if (storage == EvqConstReadOnly) // treated identically to input
                     storage = EvqIn;
 
-                // Presently, the only non-builtin we support is InputPatch, which is treated as
-                // a pseudo-builtin.
+                // Presently, the only non-built-in we support is InputPatch, which is treated as
+                // a pseudo-built-in.
                 if (biType == EbvInputPatch) {
-                    builtInLinkageSymbols[biType] = inputPatch;
+                    builtInTessLinkageSymbols[biType] = inputPatch;
                 } else if (biType == EbvOutputPatch) {
                     // Nothing...
                 } else {
@@ -8204,10 +9662,9 @@
 
     // ================ Step 1B: Argument synthesis ================
     // Create pcfArguments for synthesis of patchconstantfunction invocation
-    // TODO: handle struct or array inputs
     {
         for (int p=0; p<pcfParamCount; ++p) {
-            TIntermSymbol* inputArg = nullptr;
+            TIntermTyped* inputArg = nullptr;
 
             if (p == outPatchParam) {
                 if (perCtrlPtVar == nullptr) {
@@ -8218,13 +9675,18 @@
                 }
                 inputArg = intermediate.addSymbol(*perCtrlPtVar, loc);
             } else {
-                // find which builtin it is
-                const TBuiltInVariable biType = patchConstantFunction[p].declaredBuiltIn;
+                // find which built-in it is
+                const TBuiltInVariable biType = patchConstantFunction[p].getDeclaredBuiltIn();
                 
-                inputArg = findLinkageSymbol(biType);
+                if (biType == EbvInputPatch && inputPatch == nullptr) {
+                    error(loc, "unimplemented: PCF input patch without entry point input patch parameter", "", "");
+                    return;
+                }
+
+                inputArg = findTessLinkageSymbol(biType);
 
                 if (inputArg == nullptr) {
-                    error(loc, "unable to find patch constant function builtin variable", "", "");
+                    error(loc, "unable to find patch constant function built-in variable", "", "");
                     return;
                 }
             }
@@ -8300,7 +9762,7 @@
 
                 if (paramType.getQualifier().isParamInput())  {
                     TIntermTyped* arg = nullptr;
-                    if ((*entryPointFunction)[i].declaredBuiltIn == EbvInvocationId) {
+                    if ((*entryPointFunction)[i].getDeclaredBuiltIn() == EbvInvocationId) {
                         // substitute invocation ID with the array element ID
                         arg = intermediate.addConstantUnion(cpt, loc);
                     } else {
@@ -8339,7 +9801,7 @@
         if (newLists != ioTypeMap.end())
             outType.setStruct(newLists->second.output);
 
-        // Substitute the top level type's builtin type
+        // Substitute the top level type's built-in type
         if (patchConstantFunction.getDeclaredBuiltInType() != EbvNone)
             outType.getQualifier().builtIn = patchConstantFunction.getDeclaredBuiltInType();
 
@@ -8348,10 +9810,10 @@
         TVariable* pcfOutput = makeInternalVariable("@patchConstantOutput", outType);
         pcfOutput->getWritableType().getQualifier().storage = EvqVaryingOut;
 
-        if (pcfOutput->getType().containsBuiltInInterstageIO(language))
+        if (pcfOutput->getType().containsBuiltIn())
             split(*pcfOutput);
 
-        assignLocations(*pcfOutput);
+        assignToInterface(*pcfOutput);
 
         TIntermSymbol* pcfOutputSym = intermediate.addSymbol(*pcfOutput, loc);
 
@@ -8362,7 +9824,8 @@
 
         TIntermSymbol* pcfResultVar = intermediate.addSymbol(*pcfCallResult, loc);
         TIntermNode* pcfResultAssign = handleAssign(loc, EOpAssign, pcfResultVar, pcfCall);
-        TIntermNode* pcfResultToOut = handleAssign(loc, EOpAssign, pcfOutputSym, intermediate.addSymbol(*pcfCallResult, loc));
+        TIntermNode* pcfResultToOut = handleAssign(loc, EOpAssign, pcfOutputSym,
+                                                   intermediate.addSymbol(*pcfCallResult, loc));
 
         pcfCallSequence = intermediate.growAggregate(pcfCallSequence, pcfResultAssign);
         pcfCallSequence = intermediate.growAggregate(pcfCallSequence, pcfResultToOut);
@@ -8391,7 +9854,8 @@
 }
 
 // Finalization step: remove unused buffer blocks from linkage (we don't know until the
-// shader is entirely compiled)
+// shader is entirely compiled).
+// Preserve order of remaining symbols.
 void HlslParseContext::removeUnusedStructBufferCounters()
 {
     const auto endIt = std::remove_if(linkageSymbols.begin(), linkageSymbols.end(),
@@ -8403,12 +9867,69 @@
     linkageSymbols.erase(endIt, linkageSymbols.end());
 }
 
+// Finalization step: patch texture shadow modes to match samplers they were combined with
+void HlslParseContext::fixTextureShadowModes()
+{
+    for (auto symbol = linkageSymbols.begin(); symbol != linkageSymbols.end(); ++symbol) {
+        TSampler& sampler = (*symbol)->getWritableType().getSampler();
+
+        if (sampler.isTexture()) {
+            const auto shadowMode = textureShadowVariant.find((*symbol)->getUniqueId());
+            if (shadowMode != textureShadowVariant.end()) {
+
+                if (shadowMode->second->overloaded())
+                    // Texture needs legalization if it's been seen with both shadow and non-shadow modes.
+                    intermediate.setNeedsLegalization();
+
+                sampler.shadow = shadowMode->second->isShadowId((*symbol)->getUniqueId());
+            }
+        }
+    }
+}
+
+// Finalization step: patch append methods to use proper stream output, which isn't known until
+// main is parsed, which could happen after the append method is parsed.
+void HlslParseContext::finalizeAppendMethods()
+{
+    TSourceLoc loc;
+    loc.init();
+
+    // Nothing to do: bypass test for valid stream output.
+    if (gsAppends.empty())
+        return;
+
+    if (gsStreamOutput == nullptr) {
+        error(loc, "unable to find output symbol for Append()", "", "");
+        return;
+    }
+
+    // Patch append sequences, now that we know the stream output symbol.
+    for (auto append = gsAppends.begin(); append != gsAppends.end(); ++append) {
+        append->node->getSequence()[0] = 
+            handleAssign(append->loc, EOpAssign,
+                         intermediate.addSymbol(*gsStreamOutput, append->loc),
+                         append->node->getSequence()[0]->getAsTyped());
+    }
+}
+
 // post-processing
 void HlslParseContext::finish()
 {
+    // Error check: There was a dangling .mips operator.  These are not nested constructs in the grammar, so
+    // cannot be detected there.  This is not strictly needed in a non-validating parser; it's just helpful.
+    if (! mipsOperatorMipArg.empty()) {
+        error(mipsOperatorMipArg.back().loc, "unterminated mips operator:", "", "");
+    }
+
     removeUnusedStructBufferCounters();
     addPatchConstantInvocation();
-    addInterstageIoToLinkage();
+    fixTextureShadowModes();
+    finalizeAppendMethods();
+
+    // Communicate out (esp. for command line) that we formed AST that will make
+    // illegal AST SPIR-V and it needs transforms to legalize it.
+    if (intermediate.needsLegalization() && (messages & EShMsgHlslLegalization))
+        infoSink.info << "WARNING: AST will form illegal SPIR-V; need to transform to legalize";
 
     TParseContextBase::finish();
 }
diff --git a/hlsl/hlslParseHelper.h b/hlsl/hlslParseHelper.h
old mode 100755
new mode 100644
index d5cbc06..f99d5c7
--- a/hlsl/hlslParseHelper.h
+++ b/hlsl/hlslParseHelper.h
@@ -38,10 +38,13 @@
 
 #include "../glslang/MachineIndependent/parseVersions.h"
 #include "../glslang/MachineIndependent/ParseHelper.h"
+#include "../glslang/MachineIndependent/attribute.h"
+
+#include <array>
 
 namespace glslang {
 
-class TAttributeMap; // forward declare
+class TFunctionDeclarator;
 
 class HlslParseContext : public TParseContextBase {
 public:
@@ -70,17 +73,17 @@
     TIntermTyped* handleVariable(const TSourceLoc&, const TString* string);
     TIntermTyped* handleBracketDereference(const TSourceLoc&, TIntermTyped* base, TIntermTyped* index);
     TIntermTyped* handleBracketOperator(const TSourceLoc&, TIntermTyped* base, TIntermTyped* index);
-    void checkIndex(const TSourceLoc&, const TType&, int& index);
 
     TIntermTyped* handleBinaryMath(const TSourceLoc&, const char* str, TOperator op, TIntermTyped* left, TIntermTyped* right);
     TIntermTyped* handleUnaryMath(const TSourceLoc&, const char* str, TOperator op, TIntermTyped* childNode);
     TIntermTyped* handleDotDereference(const TSourceLoc&, TIntermTyped* base, const TString& field);
     bool isBuiltInMethod(const TSourceLoc&, TIntermTyped* base, const TString& field);
-    void assignLocations(TVariable& variable);
+    void assignToInterface(TVariable& variable);
     void handleFunctionDeclarator(const TSourceLoc&, TFunction& function, bool prototype);
-    TIntermAggregate* handleFunctionDefinition(const TSourceLoc&, TFunction&, const TAttributeMap&, TIntermNode*& entryPointTree);
-    TIntermNode* transformEntryPoint(const TSourceLoc&, TFunction&, const TAttributeMap&);
-    void handleEntryPointAttributes(const TSourceLoc&, const TAttributeMap&);
+    TIntermAggregate* handleFunctionDefinition(const TSourceLoc&, TFunction&, const TAttributes&, TIntermNode*& entryPointTree);
+    TIntermNode* transformEntryPoint(const TSourceLoc&, TFunction&, const TAttributes&);
+    void handleEntryPointAttributes(const TSourceLoc&, const TAttributes&);
+    void transferTypeAttributes(const TSourceLoc&, const TAttributes&, TType&, bool allowEntry = false);
     void handleFunctionBody(const TSourceLoc&, TFunction&, TIntermNode* functionBody, TIntermNode*& node);
     void remapEntryPointIO(TFunction& function, TVariable*& returnValue, TVector<TVariable*>& inputs, TVector<TVariable*>& outputs);
     void remapNonEntryPointIO(TFunction& function);
@@ -89,11 +92,15 @@
     TIntermTyped* handleAssign(const TSourceLoc&, TOperator, TIntermTyped* left, TIntermTyped* right);
     TIntermTyped* handleAssignToMatrixSwizzle(const TSourceLoc&, TOperator, TIntermTyped* left, TIntermTyped* right);
     TIntermTyped* handleFunctionCall(const TSourceLoc&, TFunction*, TIntermTyped*);
+    TIntermAggregate* assignClipCullDistance(const TSourceLoc&, TOperator, int semanticId, TIntermTyped* left, TIntermTyped* right);
+    TIntermTyped* assignPosition(const TSourceLoc&, TOperator, TIntermTyped* left, TIntermTyped* right);
     void decomposeIntrinsic(const TSourceLoc&, TIntermTyped*& node, TIntermNode* arguments);
     void decomposeSampleMethods(const TSourceLoc&, TIntermTyped*& node, TIntermNode* arguments);
     void decomposeStructBufferMethods(const TSourceLoc&, TIntermTyped*& node, TIntermNode* arguments);
     void decomposeGeometryMethods(const TSourceLoc&, TIntermTyped*& node, TIntermNode* arguments);
+    void pushFrontArguments(TIntermTyped* front, TIntermTyped*& arguments);
     void addInputArgumentConversions(const TFunction&, TIntermTyped*&);
+    void expandArguments(const TSourceLoc&, const TFunction&, TIntermTyped*&);
     TIntermTyped* addOutputArgumentConversions(const TFunction&, TIntermOperator&);
     void builtInOpCheck(const TSourceLoc&, const TFunction&, TIntermOperator&);
     TFunction* makeConstructorCall(const TSourceLoc&, const TType&);
@@ -115,27 +122,26 @@
     void integerCheck(const TIntermTyped* node, const char* token);
     void globalCheck(const TSourceLoc&, const char* token);
     bool constructorError(const TSourceLoc&, TIntermNode*, TFunction&, TOperator, TType&);
-    bool constructorTextureSamplerError(const TSourceLoc&, const TFunction&);
     void arraySizeCheck(const TSourceLoc&, TIntermTyped* expr, TArraySize&);
     void arraySizeRequiredCheck(const TSourceLoc&, const TArraySizes&);
     void structArrayCheck(const TSourceLoc&, const TType& structure);
-    void arrayDimMerge(TType& type, const TArraySizes* sizes);
     bool voidErrorCheck(const TSourceLoc&, const TString&, TBasicType);
     void globalQualifierFix(const TSourceLoc&, TQualifier&);
     bool structQualifierErrorCheck(const TSourceLoc&, const TPublicType& pType);
     void mergeQualifiers(TQualifier& dst, const TQualifier& src);
     int computeSamplerTypeIndex(TSampler&);
     TSymbol* redeclareBuiltinVariable(const TSourceLoc&, const TString&, const TQualifier&, const TShaderQualifiers&);
-    void redeclareBuiltinBlock(const TSourceLoc&, TTypeList& typeList, const TString& blockName, const TString* instanceName, TArraySizes* arraySizes);
     void paramFix(TType& type);
     void specializationCheck(const TSourceLoc&, const TType&, const char* op);
 
     void setLayoutQualifier(const TSourceLoc&, TQualifier&, TString&);
     void setLayoutQualifier(const TSourceLoc&, TQualifier&, TString&, const TIntermTyped*);
+    void setSpecConstantId(const TSourceLoc&, TQualifier&, int value);
     void mergeObjectLayoutQualifiers(TQualifier& dest, const TQualifier& src, bool inheritOnly);
     void checkNoShaderLayouts(const TSourceLoc&, const TShaderQualifiers&);
 
-    const TFunction* findFunction(const TSourceLoc& loc, TFunction& call, bool& builtIn, TIntermTyped*& args);
+    const TFunction* findFunction(const TSourceLoc& loc, TFunction& call, bool& builtIn, int& thisDepth, TIntermTyped*& args);
+    void addGenMulArgumentConversion(const TSourceLoc& loc, TFunction& call, TIntermTyped*& args);
     void declareTypedef(const TSourceLoc&, const TString& identifier, const TType&);
     void declareStruct(const TSourceLoc&, TString& structName, TType&);
     TSymbol* lookupUserType(const TString&, TType&);
@@ -143,20 +149,19 @@
     void lengthenList(const TSourceLoc&, TIntermSequence& list, int size, TIntermTyped* scalarInit);
     TIntermTyped* handleConstructor(const TSourceLoc&, TIntermTyped*, const TType&);
     TIntermTyped* addConstructor(const TSourceLoc&, TIntermTyped*, const TType&);
+    TIntermTyped* convertArray(TIntermTyped*, const TType&);
     TIntermTyped* constructAggregate(TIntermNode*, const TType&, int, const TSourceLoc&);
     TIntermTyped* constructBuiltIn(const TType&, TOperator, TIntermTyped*, const TSourceLoc&, bool subset);
-    void declareBlock(const TSourceLoc&, TType&, const TString* instanceName = 0, TArraySizes* arraySizes = 0);
+    void declareBlock(const TSourceLoc&, TType&, const TString* instanceName = 0);
     void declareStructBufferCounter(const TSourceLoc& loc, const TType& bufferType, const TString& name);
     void fixBlockLocations(const TSourceLoc&, TQualifier&, TTypeList&, bool memberWithLocation, bool memberWithoutLocation);
-    void fixBlockXfbOffsets(TQualifier&, TTypeList&);
+    void fixXfbOffsets(TQualifier&, TTypeList&);
     void fixBlockUniformOffsets(const TQualifier&, TTypeList&);
     void addQualifierToExisting(const TSourceLoc&, TQualifier, const TString& identifier);
     void addQualifierToExisting(const TSourceLoc&, TQualifier, TIdentifierList&);
     void updateStandaloneQualifierDefaults(const TSourceLoc&, const TPublicType&);
     void wrapupSwitchSubsequence(TIntermAggregate* statements, TIntermNode* branchNode);
-    TIntermNode* addSwitch(const TSourceLoc&, TIntermTyped* expression, TIntermAggregate* body);
-
-    void updateImplicitArraySize(const TSourceLoc&, TIntermNode*, int index);
+    TIntermNode* addSwitch(const TSourceLoc&, TIntermTyped* expression, TIntermAggregate* body, const TAttributes&);
 
     void nestLooping()       { ++loopNestingLevel; }
     void unnestLooping()     { --loopNestingLevel; }
@@ -166,7 +171,7 @@
     void pushScope()         { symbolTable.push(); }
     void popScope()          { symbolTable.pop(0); }
 
-    void pushThisScope(const TType&);
+    void pushThisScope(const TType&, const TVector<TFunctionDeclarator>&);
     void popThisScope()      { symbolTable.pop(0); }
 
     void pushImplicitThis(TVariable* thisParameter) { implicitThisStack.push_back(thisParameter); }
@@ -175,16 +180,17 @@
 
     void pushNamespace(const TString& name);
     void popNamespace();
-    void getFullNamespaceName(const TString*&) const;
+    void getFullNamespaceName(TString*&) const;
     void addScopeMangler(TString&);
 
     void pushSwitchSequence(TIntermSequence* sequence) { switchSequenceStack.push_back(sequence); }
     void popSwitchSequence() { switchSequenceStack.pop_back(); }
 
-    virtual void growGlobalUniformBlock(const TSourceLoc&, TType&, const TString& memberName, TTypeList* typeList = nullptr) override;
+    virtual void growGlobalUniformBlock(const TSourceLoc&, TType&, const TString& memberName,
+        TTypeList* typeList = nullptr) override;
 
     // Apply L-value conversions.  E.g, turning a write to a RWTexture into an ImageStore.
-    TIntermTyped* handleLvalue(const TSourceLoc&, const char* op, TIntermTyped* node);
+    TIntermTyped* handleLvalue(const TSourceLoc&, const char* op, TIntermTyped*& node);
     bool lValueErrorCheck(const TSourceLoc&, const char* op, TIntermTyped*) override;
 
     TLayoutFormat getLayoutFromTxType(const TSourceLoc&, const TType&);
@@ -192,27 +198,34 @@
     bool handleOutputGeometry(const TSourceLoc&, const TLayoutGeometry& geometry);
     bool handleInputGeometry(const TSourceLoc&, const TLayoutGeometry& geometry);
 
+    // Determine selection control from attributes
+    void handleSelectionAttributes(const TSourceLoc& loc, TIntermSelection*, const TAttributes& attributes);
+    void handleSwitchAttributes(const TSourceLoc& loc, TIntermSwitch*, const TAttributes& attributes);
+
     // Determine loop control from attributes
-    TLoopControl handleLoopControl(const TAttributeMap& attributes) const;
-
-    // Potentially rename shader entry point function
-    void renameShaderFunction(const TString*& name) const;
-
-    // Reset data for incrementally built referencing of flattened composite structures
-    void initFlattening() { flattenLevel.push_back(0); flattenOffset.push_back(0); }
-    void finalizeFlattening() { flattenLevel.pop_back(); flattenOffset.pop_back(); }
+    void handleLoopAttributes(const TSourceLoc& loc, TIntermLoop*, const TAttributes& attributes);
 
     // Share struct buffer deep types
     void shareStructBufferType(TType&);
 
+    // Set texture return type of the given sampler.  Returns success (not all types are valid).
+    bool setTextureReturnType(TSampler& sampler, const TType& retType, const TSourceLoc& loc);
+
+    // Obtain the sampler return type of the given sampler in retType.
+    void getTextureReturnType(const TSampler& sampler, TType& retType) const;
+
+    TAttributeType attributeFromName(const TString& nameSpace, const TString& name) const;
+
 protected:
     struct TFlattenData {
-        TFlattenData() : nextBinding(TQualifier::layoutBindingEnd) { }
-        TFlattenData(int nb) : nextBinding(nb) { }
+        TFlattenData() : nextBinding(TQualifier::layoutBindingEnd),
+                         nextLocation(TQualifier::layoutLocationEnd) { }
+        TFlattenData(int nb, int nl) : nextBinding(nb), nextLocation(nl) { }
 
         TVector<TVariable*> members;     // individual flattened variables
-        TVector<int>        offsets;     // offset to next tree level
-        int                 nextBinding; // next binding to use.
+        TVector<int> offsets;            // offset to next tree level
+        unsigned int nextBinding;        // next binding to use.
+        unsigned int nextLocation;       // next location to use
     };
 
     void fixConstInit(const TSourceLoc&, const TString& identifier, TType& type, TIntermTyped*& initializer);
@@ -234,33 +247,36 @@
 
     // Array and struct flattening
     TIntermTyped* flattenAccess(TIntermTyped* base, int member);
-    bool shouldFlattenUniform(const TType&) const;
+    TIntermTyped* flattenAccess(int uniqueId, int member, TStorageQualifier outerStorage, const TType&, int subset = -1);
+    int findSubtreeOffset(const TIntermNode&) const;
+    int findSubtreeOffset(const TType&, int subset, const TVector<int>& offsets) const;
+    bool shouldFlatten(const TType&, TStorageQualifier, bool topLevel) const;
     bool wasFlattened(const TIntermTyped* node) const;
     bool wasFlattened(int id) const { return flattenMap.find(id) != flattenMap.end(); }
-    int  addFlattenedMember(const TSourceLoc& loc, const TVariable&, const TType&, TFlattenData&, const TString& name, bool track);
-    bool isFinalFlattening(const TType& type) const { return !(type.isStruct() || type.isArray()); }
+    int  addFlattenedMember(const TVariable&, const TType&, TFlattenData&, const TString& name, bool linkage,
+                            const TQualifier& outerQualifier, const TArraySizes* builtInArraySizes);
 
-    // Structure splitting (splits interstage builtin types into its own struct)
-    TIntermTyped* splitAccessStruct(const TSourceLoc& loc, TIntermTyped*& base, int& member);
-    void splitAccessArray(const TSourceLoc& loc, TIntermTyped* base, TIntermTyped* index);
-    TType& split(TType& type, TString name, const TType* outerStructType = nullptr);
-    void split(TIntermTyped*);
+    // Structure splitting (splits interstage built-in types into its own struct)
     void split(const TVariable&);
+    void splitBuiltIn(const TString& baseName, const TType& memberType, const TArraySizes*, const TQualifier&);
+    const TType& split(const TType& type, const TString& name, const TQualifier&);
     bool wasSplit(const TIntermTyped* node) const;
-    bool wasSplit(int id) const { return splitIoVars.find(id) != splitIoVars.end(); }
-    TVariable* getSplitIoVar(const TIntermTyped* node) const;
-    TVariable* getSplitIoVar(const TVariable* var) const;
-    TVariable* getSplitIoVar(int id) const;
-    void addInterstageIoToLinkage();
+    bool wasSplit(int id) const { return splitNonIoVars.find(id) != splitNonIoVars.end(); }
+    TVariable* getSplitNonIoVar(int id) const;
     void addPatchConstantInvocation();
+    void fixTextureShadowModes();
+    void finalizeAppendMethods();
     TIntermTyped* makeIntegerIndex(TIntermTyped*);
 
     void fixBuiltInIoType(TType&);
 
-    void flatten(const TSourceLoc& loc, const TVariable& variable);
-    int flatten(const TSourceLoc& loc, const TVariable& variable, const TType&, TFlattenData&, TString name);
-    int flattenStruct(const TSourceLoc& loc, const TVariable& variable, const TType&, TFlattenData&, TString name);
-    int flattenArray(const TSourceLoc& loc, const TVariable& variable, const TType&, TFlattenData&, TString name);
+    void flatten(const TVariable& variable, bool linkage);
+    int flatten(const TVariable& variable, const TType&, TFlattenData&, TString name, bool linkage,
+                const TQualifier& outerQualifier, const TArraySizes* builtInArraySizes);
+    int flattenStruct(const TVariable& variable, const TType&, TFlattenData&, TString name, bool linkage,
+                      const TQualifier& outerQualifier, const TArraySizes* builtInArraySizes);
+    int flattenArray(const TVariable& variable, const TType&, TFlattenData&, TString name, bool linkage,
+                     const TQualifier& outerQualifier);
 
     bool hasUniform(const TQualifier& qualifier) const;
     void clearUniform(TQualifier& qualifier);
@@ -275,6 +291,7 @@
 
     // Test method names
     bool isStructBufferMethod(const TString& name) const;
+    void counterBufferType(const TSourceLoc& loc, TType& type);
 
     // Return standard sample position array
     TIntermConstantUnion* getSamplePosArray(int count);
@@ -283,39 +300,39 @@
     bool isStructBufferType(const TType& type) const { return getStructBufferContentType(type) != nullptr; }
     TIntermTyped* indexStructBufferContent(const TSourceLoc& loc, TIntermTyped* buffer) const;
     TIntermTyped* getStructBufferCounter(const TSourceLoc& loc, TIntermTyped* buffer);
+    TString getStructBuffCounterName(const TString&) const;
+    void addStructBuffArguments(const TSourceLoc& loc, TIntermAggregate*&);
+    void addStructBufferHiddenCounterParam(const TSourceLoc& loc, TParameter&, TIntermAggregate*&);
 
     // Return true if this type is a reference.  This is not currently a type method in case that's
     // a language specific answer.
     bool isReference(const TType& type) const { return isStructBufferType(type); }
 
     // Return true if this a buffer type that has an associated counter buffer.
-    bool hasStructBuffCounter(const TString& name) const;
+    bool hasStructBuffCounter(const TType&) const;
 
     // Finalization step: remove unused buffer blocks from linkage (we don't know until the
     // shader is entirely compiled)
     void removeUnusedStructBufferCounters();
+ 
+    static bool isClipOrCullDistance(TBuiltInVariable);
+    static bool isClipOrCullDistance(const TQualifier& qual) { return isClipOrCullDistance(qual.builtIn); }
+    static bool isClipOrCullDistance(const TType& type) { return isClipOrCullDistance(type.getQualifier()); }
 
-    // Pass through to base class after remembering builtin mappings.
+    // Find the patch constant function (issues error, returns nullptr if not found)
+    const TFunction* findPatchConstantFunction(const TSourceLoc& loc);
+
+    // Pass through to base class after remembering built-in mappings.
     using TParseContextBase::trackLinkage;
     void trackLinkage(TSymbol& variable) override;
 
     void finish() override; // post-processing
 
     // Linkage symbol helpers
-    TIntermSymbol* findLinkageSymbol(TBuiltInVariable biType) const;
+    TIntermSymbol* findTessLinkageSymbol(TBuiltInVariable biType) const;
 
     // Current state of parsing
-    struct TPragma contextPragma;
-    int loopNestingLevel;        // 0 if outside all loops
     int annotationNestingLevel;  // 0 if outside all annotations
-    int structNestingLevel;      // 0 if outside blocks and structures
-    int controlFlowNestingLevel; // 0 if outside all flow control
-    TList<TIntermSequence*> switchSequenceStack;  // case, node, case, case, node, ...; ensure only one node between cases;   stack of them for nesting
-    bool postEntryPointReturn;         // if inside a function, true if the function is the entry point and this is after a return statement
-    const TType* currentFunctionType;  // the return type of the function that's currently being parsed
-    bool functionReturnsValue;   // true if a non-void function has a return
-    TBuiltInResource resources;
-    TLimits& limits;
 
     HlslParseContext(HlslParseContext&);
     HlslParseContext& operator=(HlslParseContext&);
@@ -364,8 +381,6 @@
     TVector<TSymbol*> ioArraySymbolResizeList;
 
     TMap<int, TFlattenData> flattenMap;
-    TVector<int> flattenLevel;  // nested postfix operator level for flattening
-    TVector<int> flattenOffset; // cumulative offset for flattening
 
     // IO-type map. Maps a pure symbol-table form of a structure-member list into
     // each of the (up to) three kinds of IO, as each as different allowed decorations,
@@ -378,25 +393,24 @@
     TMap<const TTypeList*, tIoKinds> ioTypeMap;
 
     // Structure splitting data:
-    TMap<int, TVariable*>              splitIoVars;  // variables with the builtin interstage IO removed, indexed by unique ID.
+    TMap<int, TVariable*> splitNonIoVars;  // variables with the built-in interstage IO removed, indexed by unique ID.
 
     // Structuredbuffer shared types.  Typically there are only a few.
     TVector<TType*> structBufferTypes;
-    
-    TMap<TString, TBuiltInVariable> structBufferBuiltIn;
-    TMap<TString, bool> structBufferCounter;
 
-    // The builtin interstage IO map considers e.g, EvqPosition on input and output separately, so that we
+    // This tracks texture sample user structure return types.  Only a limited number are supported, as
+    // may fit in TSampler::structReturnIndex.
+    TVector<TTypeList*> textureReturnStruct;
+    
+    TMap<TString, bool> structBufferCounter;  // true if counter buffer is in use
+
+    // The built-in interstage IO map considers e.g, EvqPosition on input and output separately, so that we
     // can build the linkage correctly if position appears on both sides.  Otherwise, multiple positions
     // are considered identical.
     struct tInterstageIoData {
         tInterstageIoData(TBuiltInVariable bi, TStorageQualifier q) :
             builtIn(bi), storage(q) { }
 
-        tInterstageIoData(const TType& memberType, const TType& storageType) :
-            builtIn(memberType.getQualifier().builtIn),
-            storage(storageType.getQualifier().storage) { }
-
         TBuiltInVariable  builtIn;
         TStorageQualifier storage;
 
@@ -406,32 +420,83 @@
         }
     };
 
-    TMap<tInterstageIoData, TVariable*> interstageBuiltInIo; // individual builtin interstage IO vars, indexed by builtin type.
-    TVariable* inputPatch;
-
-    // We have to move array references to structs containing builtin interstage IO to the split variables.
-    // This is only handled for one level.  This stores the index, because we'll need it in the future, since
-    // unlike normal array references, here the index happens before we discover what it applies to.
-    TIntermTyped* builtInIoIndex;
-    TIntermTyped* builtInIoBase;
+    TMap<tInterstageIoData, TVariable*> splitBuiltIns; // split built-ins, indexed by built-in type.
+    TVariable* inputPatch; // input patch is special for PCF: it's the only non-builtin PCF input,
+                           // and is handled as a pseudo-builtin.
 
     unsigned int nextInLocation;
     unsigned int nextOutLocation;
 
-    TString    sourceEntryPointName;
     TFunction* entryPointFunction;
     TIntermNode* entryPointFunctionBody;
 
     TString patchConstantFunctionName; // hull shader patch constant function name, from function level attribute.
-    TMap<TBuiltInVariable, TSymbol*> builtInLinkageSymbols; // used for tessellation, finding declared builtins
+    TMap<TBuiltInVariable, TSymbol*> builtInTessLinkageSymbols; // used for tessellation, finding declared built-ins
 
     TVector<TString> currentTypePrefix;      // current scoping prefix for nested structures
     TVector<TVariable*> implicitThisStack;   // currently active 'this' variables for nested structures
 
     TVariable* gsStreamOutput;               // geometry shader stream outputs, for emit (Append method)
+
+    TVariable* clipDistanceOutput;           // synthesized clip distance out variable (shader might have >1)
+    TVariable* cullDistanceOutput;           // synthesized cull distance out variable (shader might have >1)
+    TVariable* clipDistanceInput;            // synthesized clip distance in variable (shader might have >1)
+    TVariable* cullDistanceInput;            // synthesized cull distance in variable (shader might have >1)
+
+    static const int maxClipCullRegs = 2;
+    std::array<int, maxClipCullRegs> clipSemanticNSizeIn;  // vector, indexed by clip semantic ID
+    std::array<int, maxClipCullRegs> cullSemanticNSizeIn;  // vector, indexed by cull semantic ID
+    std::array<int, maxClipCullRegs> clipSemanticNSizeOut; // vector, indexed by clip semantic ID
+    std::array<int, maxClipCullRegs> cullSemanticNSizeOut; // vector, indexed by cull semantic ID
+
+    // This tracks the first (mip level) argument to the .mips[][] operator.  Since this can be nested as
+    // in tx.mips[tx.mips[0][1].x][2], we need a stack.  We also track the TSourceLoc for error reporting 
+    // purposes.
+    struct tMipsOperatorData {
+        tMipsOperatorData(TSourceLoc l, TIntermTyped* m) : loc(l), mipLevel(m) { }
+        TSourceLoc loc;
+        TIntermTyped* mipLevel;
+    };
+
+    TVector<tMipsOperatorData> mipsOperatorMipArg;
+
+    // The geometry output stream is not copied out from the entry point as a typical output variable
+    // is.  It's written via EmitVertex (hlsl=Append), which may happen in arbitrary control flow.
+    // For this we need the real output symbol.  Since it may not be known at the time and Append()
+    // method is parsed, the sequence will be patched during finalization.
+    struct tGsAppendData {
+        TIntermAggregate* node;
+        TSourceLoc loc;
+    };
+
+    TVector<tGsAppendData> gsAppends;
+
+    // A texture object may be used with shadow and non-shadow samplers, but both may not be
+    // alive post-DCE in the same shader.  We do not know at compilation time which are alive: that's
+    // only known post-DCE.  If a texture is used both ways, we create two textures, and
+    // leave the elimiation of one to the optimizer.  This maps the shader variant to
+    // the shadow variant.
+    //
+    // This can be removed if and when the texture shadow code in
+    // HlslParseContext::handleSamplerTextureCombine is removed.
+    struct tShadowTextureSymbols {
+        tShadowTextureSymbols() { symId.fill(-1); }
+
+        void set(bool shadow, int id) { symId[int(shadow)] = id; }
+        int get(bool shadow) const { return symId[int(shadow)]; }
+
+        // True if this texture has been seen with both shadow and non-shadow modes
+        bool overloaded() const { return symId[0] != -1 && symId[1] != -1; }
+        bool isShadowId(int id) const { return symId[1] == id; }
+
+    private:
+        std::array<int, 2> symId;
+    };
+
+    TMap<int, tShadowTextureSymbols*> textureShadowVariant;
 };
 
-// This is the prefix we use for builtin methods to avoid namespace collisions with
+// This is the prefix we use for built-in methods to avoid namespace collisions with
 // global scope user functions.
 // TODO: this would be better as a nonparseable character, but that would
 // require changing the scanner.
diff --git a/hlsl/hlslParseables.cpp b/hlsl/hlslParseables.cpp
old mode 100755
new mode 100644
index e094aef..6500091
--- a/hlsl/hlslParseables.cpp
+++ b/hlsl/hlslParseables.cpp
@@ -68,14 +68,21 @@
     }
 }
 
-bool IsSamplerType(const char argType) { return argType == 'S' || argType == 's'; }
-bool IsArrayed(const char argOrder)    { return argOrder == '@' || argOrder == '&' || argOrder == '#'; }
-bool IsTextureMS(const char argOrder)  { return argOrder == '$' || argOrder == '&'; }
-bool IsBuffer(const char argOrder)     { return argOrder == '*' || argOrder == '~'; }
-bool IsImage(const char argOrder)      { return argOrder == '!' || argOrder == '#' || argOrder == '~'; }
+// arg order queries
+bool IsSamplerType(const char argType)     { return argType == 'S' || argType == 's'; }
+bool IsArrayed(const char argOrder)        { return argOrder == '@' || argOrder == '&' || argOrder == '#'; }
+bool IsTextureNonMS(const char argOrder)   { return argOrder == '%'; }
+bool IsSubpassInput(const char argOrder)   { return argOrder == '[' || argOrder == ']'; }
+bool IsArrayedTexture(const char argOrder) { return argOrder == '@'; }
+bool IsTextureMS(const char argOrder)      { return argOrder == '$' || argOrder == '&'; }
+bool IsMS(const char argOrder)             { return IsTextureMS(argOrder) || argOrder == ']'; }
+bool IsBuffer(const char argOrder)         { return argOrder == '*' || argOrder == '~'; }
+bool IsImage(const char argOrder)          { return argOrder == '!' || argOrder == '#' || argOrder == '~'; }
+
 bool IsTextureType(const char argOrder)
 {
-    return argOrder == '%' || argOrder == '@' || IsTextureMS(argOrder) || IsBuffer(argOrder) | IsImage(argOrder);
+    return IsTextureNonMS(argOrder) || IsArrayedTexture(argOrder) ||
+           IsTextureMS(argOrder) || IsBuffer(argOrder) || IsImage(argOrder);
 }
 
 // Reject certain combinations that are illegal sample methods.  For example,
@@ -222,15 +229,16 @@
     const bool isTexture   = IsTextureType(argOrder[0]);
     const bool isArrayed   = IsArrayed(argOrder[0]);
     const bool isSampler   = IsSamplerType(argType[0]);
-    const bool isMS        = IsTextureMS(argOrder[0]);
+    const bool isMS        = IsMS(argOrder[0]);
     const bool isBuffer    = IsBuffer(argOrder[0]);
     const bool isImage     = IsImage(argOrder[0]);
+    const bool isSubpass   = IsSubpassInput(argOrder[0]);
 
     char type  = *argType;
 
     if (isTranspose) {  // Take transpose of matrix dimensions
         std::swap(dim0, dim1);
-    } else if (isTexture) {
+    } else if (isTexture || isSubpass) {
         if (type == 'F')       // map base type to texture of that type.
             type = 'T';        // e.g, int -> itexture, uint -> utexture, etc.
         else if (type == 'I')
@@ -251,20 +259,29 @@
         case 'D': s += "double";                              break;
         case 'I': s += "int";                                 break;
         case 'U': s += "uint";                                break;
+        case 'L': s += "int64_t";                             break;
+        case 'M': s += "uint64_t";                            break;
         case 'B': s += "bool";                                break;
         case 'S': s += "sampler";                             break;
         case 's': s += "SamplerComparisonState";              break;
         case 'T': s += ((isBuffer && isImage) ? "RWBuffer" :
+                        isSubpass ? "SubpassInput" :
                         isBuffer ? "Buffer" :
                         isImage  ? "RWTexture" : "Texture");  break;
         case 'i': s += ((isBuffer && isImage) ? "RWBuffer" :
+                        isSubpass ? "SubpassInput" :
                         isBuffer ? "Buffer" :
                         isImage ? "RWTexture" : "Texture");   break;
         case 'u': s += ((isBuffer && isImage) ? "RWBuffer" :
+                        isSubpass ? "SubpassInput" :
                         isBuffer ? "Buffer" :
                         isImage ? "RWTexture" : "Texture");   break;
         default:  s += "UNKNOWN_TYPE";                        break;
         }
+
+        if (isSubpass && isMS)
+            s += "MS";
+
     } else {
         switch (type) {
         case '-': s += "void"; break;
@@ -282,6 +299,7 @@
                 s += type;
 
             s += ((isImage && isBuffer) ? "imageBuffer"   :
+                  isSubpass             ? "subpassInput" :
                   isImage               ? "image"         :
                   isBuffer              ? "samplerBuffer" :
                   "texture");
@@ -296,6 +314,9 @@
     if (fixedVecSize != 0)
         dim0 = dim1 = fixedVecSize;
 
+    const char dim0Char = ('0' + char(dim0));
+    const char dim1Char = ('0' + char(dim1));
+
     // Add sampler dimensions
     if (isSampler || isTexture) {
         if ((order == 'V' || isTexture) && !isBuffer) {
@@ -320,12 +341,12 @@
         case '-': break;  // no dimensions for voids
         case 'S': break;  // no dimensions on scalars
         case 'V':
-            s += ('0' + char(dim0));
+            s += dim0Char;
             break;
         case 'M':
-            s += ('0' + char(dim0));
+            s += dim0Char;
             s += 'x';
-            s += ('0' + char(dim1));
+            s += dim1Char;
             break;
         default:
             break;
@@ -339,9 +360,9 @@
     // For HLSL, append return type for texture types
     if (UseHlslTypes) {
         switch (type) {
-        case 'i': s += "<int4>";   break;
-        case 'u': s += "<uint4>";  break;
-        case 'T': s += "<float4>"; break;
+        case 'i': s += "<int";   s += dim0Char; s += ">"; break;
+        case 'u': s += "<uint";  s += dim0Char; s += ">"; break;
+        case 'T': s += "<float"; s += dim0Char; s += ">"; break;
         default: break;
         }
     }
@@ -414,7 +435,7 @@
         const char* nthArgOrder(NthArg(argOrder, arg));
         if (nthArgOrder == nullptr)
             break;
-        else if (*nthArgOrder == 'V')
+        else if (*nthArgOrder == 'V' || IsSubpassInput(*nthArgOrder))
             dim0Max = 4;
         else if (*nthArgOrder == 'M')
             dim0Max = dim1Max = 4;
@@ -502,7 +523,7 @@
     static const EShLanguageMask EShLangAll    = EShLanguageMask(EShLangCount - 1);
 
     // These are the actual stage masks defined in the documentation, in case they are
-    // needed for furture validation.  For now, they are commented out, and set below
+    // needed for future validation.  For now, they are commented out, and set below
     // to EShLangAll, to allow any intrinsic to be used in any shader, which is legal
     // if it is not called.
     //
@@ -525,7 +546,7 @@
     // orderKey can be:
     //   S = scalar, V = vector, M = matrix, - = void
     // typekey can be:
-    //   D = double, F = float, U = uint, I = int, B = bool, S = sampler, s = shadowSampler
+    //   D = double, F = float, U = uint, I = int, B = bool, S = sampler, s = shadowSampler, M = uint64_t, L = int64_t
     // An empty order or type key repeats the first one.  E.g: SVM,, means 3 args each of SVM.
     // '>' as first letter of order creates an output parameter
     // '<' as first letter of order creates an input parameter
@@ -537,6 +558,7 @@
     // '!' as first letter of order creates image object
     // '#' as first letter of order creates arrayed image object
     // '~' as first letter of order creates an image buffer object
+    // '[' / ']' as first letter of order creates a SubpassInput/SubpassInputMS object
 
     static const struct {
         const char*   name;      // intrinsic name
@@ -547,8 +569,8 @@
         unsigned int  stage;     // stage mask
         bool          method;    // true if it's a method.
     } hlslIntrinsics[] = {
-        // name                               retOrd   retType    argOrder          argType   stage mask
-        // -----------------------------------------------------------------------------------------------
+        // name                               retOrd   retType    argOrder          argType          stage mask     method
+        // ----------------------------------------------------------------------------------------------------------------
         { "abort",                            nullptr, nullptr,   "-",              "-",             EShLangAll,    false },
         { "abs",                              nullptr, nullptr,   "SVM",            "DFUI",          EShLangAll,    false },
         { "acos",                             nullptr, nullptr,   "SVM",            "F",             EShLangAll,    false },
@@ -560,14 +582,14 @@
         { "asdouble",                         "V2",    "D",       "V2,",            "UI,",           EShLangAll,    false },
         { "asfloat",                          nullptr, "F",       "SVM",            "BFIU",          EShLangAll,    false },
         { "asin",                             nullptr, nullptr,   "SVM",            "F",             EShLangAll,    false },
-        { "asint",                            nullptr, "I",       "SVM",            "FU",            EShLangAll,    false },
-        { "asuint",                           nullptr, "U",       "SVM",            "FU",            EShLangAll,    false },
+        { "asint",                            nullptr, "I",       "SVM",            "FIU",           EShLangAll,    false },
+        { "asuint",                           nullptr, "U",       "SVM",            "FIU",           EShLangAll,    false },
         { "atan",                             nullptr, nullptr,   "SVM",            "F",             EShLangAll,    false },
         { "atan2",                            nullptr, nullptr,   "SVM,",           "F,",            EShLangAll,    false },
         { "ceil",                             nullptr, nullptr,   "SVM",            "F",             EShLangAll,    false },
         { "CheckAccessFullyMapped",           "S",     "B" ,      "S",              "U",             EShLangPSCS,   false },
         { "clamp",                            nullptr, nullptr,   "SVM,,",          "FUI,,",         EShLangAll,    false },
-        { "clip",                             "-",     "-",       "SVM",            "F",             EShLangPS,     false },
+        { "clip",                             "-",     "-",       "SVM",            "FUI",           EShLangPS,     false },
         { "cos",                              nullptr, nullptr,   "SVM",            "F",             EShLangAll,    false },
         { "cosh",                             nullptr, nullptr,   "SVM",            "F",             EShLangAll,    false },
         { "countbits",                        nullptr, nullptr,   "SV",             "UI",            EShLangAll,    false },
@@ -583,7 +605,7 @@
         { "determinant",                      "S",     "F",       "M",              "F",             EShLangAll,    false },
         { "DeviceMemoryBarrier",              nullptr, nullptr,   "-",              "-",             EShLangPSCS,   false },
         { "DeviceMemoryBarrierWithGroupSync", nullptr, nullptr,   "-",              "-",             EShLangCS,     false },
-        { "distance",                         "S",     "F",       "V,",             "F,",            EShLangAll,    false },
+        { "distance",                         "S",     "F",       "SV,",            "F,",            EShLangAll,    false },
         { "dot",                              "S",     nullptr,   "SV,",            "FI,",           EShLangAll,    false },
         { "dst",                              nullptr, nullptr,   "V4,",            "F,",            EShLangAll,    false },
         // { "errorf",                           "-",     "-",       "",             "",             EShLangAll,    false }, TODO: varargs
@@ -882,6 +904,39 @@
         { "DecrementCounter",                 nullptr, nullptr,   "-",              "-",              EShLangAll,   true },
         { "Consume",                          nullptr, nullptr,   "-",              "-",              EShLangAll,   true },
 
+        // SM 6.0
+
+        { "WaveIsFirstLane",                  "S",     "B",       "-",              "-",              EShLangPSCS,  false},
+        { "WaveGetLaneCount",                 "S",     "U",       "-",              "-",              EShLangPSCS,  false},
+        { "WaveGetLaneIndex",                 "S",     "U",       "-",              "-",              EShLangPSCS,  false},
+        { "WaveActiveAnyTrue",                "S",     "B",       "S",              "B",              EShLangPSCS,  false},
+        { "WaveActiveAllTrue",                "S",     "B",       "S",              "B",              EShLangPSCS,  false},
+        { "WaveActiveBallot",                 "V4",    "U",       "S",              "B",              EShLangPSCS,  false},
+        { "WaveReadLaneAt",                   nullptr, nullptr,   "SV,S",           "DFUI,U",         EShLangPSCS,  false},
+        { "WaveReadLaneFirst",                nullptr, nullptr,   "SV",             "DFUI",           EShLangPSCS,  false},
+        { "WaveActiveAllEqual",               "S",     "B",       "SV",             "DFUI",           EShLangPSCS,  false},
+        { "WaveActiveAllEqualBool",           "S",     "B",       "S",              "B",              EShLangPSCS,  false},
+        { "WaveActiveCountBits",              "S",     "U",       "S",              "B",              EShLangPSCS,  false},
+        
+        { "WaveActiveSum",                    nullptr, nullptr,   "SV",             "DFUI",           EShLangPSCS,  false},
+        { "WaveActiveProduct",                nullptr, nullptr,   "SV",             "DFUI",           EShLangPSCS,  false},
+        { "WaveActiveBitAnd",                 nullptr, nullptr,   "SV",             "DFUI",           EShLangPSCS,  false},
+        { "WaveActiveBitOr",                  nullptr, nullptr,   "SV",             "DFUI",           EShLangPSCS,  false},
+        { "WaveActiveBitXor",                 nullptr, nullptr,   "SV",             "DFUI",           EShLangPSCS,  false},
+        { "WaveActiveMin",                    nullptr, nullptr,   "SV",             "DFUI",           EShLangPSCS,  false},
+        { "WaveActiveMax",                    nullptr, nullptr,   "SV",             "DFUI",           EShLangPSCS,  false},
+        { "WavePrefixSum",                    nullptr, nullptr,   "SV",             "DFUI",           EShLangPSCS,  false},
+        { "WavePrefixProduct",                nullptr, nullptr,   "SV",             "DFUI",           EShLangPSCS,  false},
+        { "WavePrefixCountBits",              "S",     "U",       "S",              "B",              EShLangPSCS,  false},
+        { "QuadReadAcrossX",                  nullptr, nullptr,   "SV",             "DFUI",           EShLangPSCS,  false},
+        { "QuadReadAcrossY",                  nullptr, nullptr,   "SV",             "DFUI",           EShLangPSCS,  false},
+        { "QuadReadAcrossDiagonal",           nullptr, nullptr,   "SV",             "DFUI",           EShLangPSCS,  false},
+        { "QuadReadLaneAt",                   nullptr, nullptr,   "SV,S",           "DFUI,U",         EShLangPSCS,  false},
+
+        // Methods for subpass input objects
+        { "SubpassLoad",                      "V4",    nullptr,   "[",              "FIU",            EShLangPS,    true },
+        { "SubpassLoad",                      "V4",    nullptr,   "],S",            "FIU,I",          EShLangPS,    true },
+
         // Mark end of list, since we want to avoid a range-based for, as some compilers don't handle it yet.
         { nullptr,                            nullptr, nullptr,   nullptr,      nullptr,  0, false },
     };
@@ -1063,8 +1118,8 @@
     symbolTable.relateToOperator("ddy_fine",                    EOpDPdyFine);
     symbolTable.relateToOperator("degrees",                     EOpDegrees);
     symbolTable.relateToOperator("determinant",                 EOpDeterminant);
-    symbolTable.relateToOperator("DeviceMemoryBarrier",         EOpGroupMemoryBarrier);
-    symbolTable.relateToOperator("DeviceMemoryBarrierWithGroupSync", EOpGroupMemoryBarrierWithGroupSync); // ...
+    symbolTable.relateToOperator("DeviceMemoryBarrier",         EOpDeviceMemoryBarrier);
+    symbolTable.relateToOperator("DeviceMemoryBarrierWithGroupSync", EOpDeviceMemoryBarrierWithGroupSync);
     symbolTable.relateToOperator("distance",                    EOpDistance);
     symbolTable.relateToOperator("dot",                         EOpDot);
     symbolTable.relateToOperator("dst",                         EOpDst);
@@ -1219,6 +1274,37 @@
     // GS methods
     symbolTable.relateToOperator(BUILTIN_PREFIX "Append",                      EOpMethodAppend);
     symbolTable.relateToOperator(BUILTIN_PREFIX "RestartStrip",                EOpMethodRestartStrip);
+
+    // Wave ops
+    symbolTable.relateToOperator("WaveIsFirstLane",                            EOpSubgroupElect);
+    symbolTable.relateToOperator("WaveGetLaneCount",                           EOpWaveGetLaneCount);
+    symbolTable.relateToOperator("WaveGetLaneIndex",                           EOpWaveGetLaneIndex);
+    symbolTable.relateToOperator("WaveActiveAnyTrue",                          EOpSubgroupAny);
+    symbolTable.relateToOperator("WaveActiveAllTrue",                          EOpSubgroupAll);
+    symbolTable.relateToOperator("WaveActiveBallot",                           EOpSubgroupBallot);
+    symbolTable.relateToOperator("WaveReadLaneFirst",                          EOpSubgroupBroadcastFirst);
+    symbolTable.relateToOperator("WaveReadLaneAt",                             EOpSubgroupShuffle);
+    symbolTable.relateToOperator("WaveActiveAllEqual",                         EOpSubgroupAllEqual);
+    symbolTable.relateToOperator("WaveActiveAllEqualBool",                     EOpSubgroupAllEqual);
+    symbolTable.relateToOperator("WaveActiveCountBits",                        EOpWaveActiveCountBits);
+    symbolTable.relateToOperator("WaveActiveSum",                              EOpSubgroupAdd);
+    symbolTable.relateToOperator("WaveActiveProduct",                          EOpSubgroupMul);
+    symbolTable.relateToOperator("WaveActiveBitAnd",                           EOpSubgroupAnd);
+    symbolTable.relateToOperator("WaveActiveBitOr",                            EOpSubgroupOr);
+    symbolTable.relateToOperator("WaveActiveBitXor",                           EOpSubgroupXor);
+    symbolTable.relateToOperator("WaveActiveMin",                              EOpSubgroupMin);
+    symbolTable.relateToOperator("WaveActiveMax",                              EOpSubgroupMax);
+    symbolTable.relateToOperator("WavePrefixSum",                              EOpSubgroupInclusiveAdd);
+    symbolTable.relateToOperator("WavePrefixProduct",                          EOpSubgroupInclusiveMul);
+    symbolTable.relateToOperator("WavePrefixCountBits",                        EOpWavePrefixCountBits);
+    symbolTable.relateToOperator("QuadReadAcrossX",                            EOpSubgroupQuadSwapHorizontal);
+    symbolTable.relateToOperator("QuadReadAcrossY",                            EOpSubgroupQuadSwapVertical);
+    symbolTable.relateToOperator("QuadReadAcrossDiagonal",                     EOpSubgroupQuadSwapDiagonal);
+    symbolTable.relateToOperator("QuadReadLaneAt",                             EOpSubgroupQuadBroadcast);
+
+    // Subpass input methods
+    symbolTable.relateToOperator(BUILTIN_PREFIX "SubpassLoad",                 EOpSubpassLoad);
+    symbolTable.relateToOperator(BUILTIN_PREFIX "SubpassLoadMS",               EOpSubpassLoadMS);
 }
 
 //
diff --git a/hlsl/hlslParseables.h b/hlsl/hlslParseables.h
old mode 100755
new mode 100644
diff --git a/hlsl/hlslScanContext.cpp b/hlsl/hlslScanContext.cpp
old mode 100755
new mode 100644
index 0eb5bf5..28a66bb
--- a/hlsl/hlslScanContext.cpp
+++ b/hlsl/hlslScanContext.cpp
@@ -143,6 +143,7 @@
     (*KeywordMap)["bool"] =                    EHTokBool;
     (*KeywordMap)["int"] =                     EHTokInt;
     (*KeywordMap)["uint"] =                    EHTokUint;
+    (*KeywordMap)["uint64_t"] =                EHTokUint64;
     (*KeywordMap)["dword"] =                   EHTokDword;
     (*KeywordMap)["half"] =                    EHTokHalf;
     (*KeywordMap)["float"] =                   EHTokFloat;
@@ -279,6 +280,22 @@
     (*KeywordMap)["float4x2"] =                EHTokFloat4x2;
     (*KeywordMap)["float4x3"] =                EHTokFloat4x3;
     (*KeywordMap)["float4x4"] =                EHTokFloat4x4;
+    (*KeywordMap)["half1x1"] =                 EHTokHalf1x1;
+    (*KeywordMap)["half1x2"] =                 EHTokHalf1x2;
+    (*KeywordMap)["half1x3"] =                 EHTokHalf1x3;
+    (*KeywordMap)["half1x4"] =                 EHTokHalf1x4;
+    (*KeywordMap)["half2x1"] =                 EHTokHalf2x1;
+    (*KeywordMap)["half2x2"] =                 EHTokHalf2x2;
+    (*KeywordMap)["half2x3"] =                 EHTokHalf2x3;
+    (*KeywordMap)["half2x4"] =                 EHTokHalf2x4;
+    (*KeywordMap)["half3x1"] =                 EHTokHalf3x1;
+    (*KeywordMap)["half3x2"] =                 EHTokHalf3x2;
+    (*KeywordMap)["half3x3"] =                 EHTokHalf3x3;
+    (*KeywordMap)["half3x4"] =                 EHTokHalf3x4;
+    (*KeywordMap)["half4x1"] =                 EHTokHalf4x1;
+    (*KeywordMap)["half4x2"] =                 EHTokHalf4x2;
+    (*KeywordMap)["half4x3"] =                 EHTokHalf4x3;
+    (*KeywordMap)["half4x4"] =                 EHTokHalf4x4;
     (*KeywordMap)["double1x1"] =               EHTokDouble1x1;
     (*KeywordMap)["double1x2"] =               EHTokDouble1x2;
     (*KeywordMap)["double1x3"] =               EHTokDouble1x3;
@@ -320,6 +337,8 @@
     (*KeywordMap)["RWTexture2DArray"] =        EHTokRWTexture2darray;
     (*KeywordMap)["RWTexture3D"] =             EHTokRWTexture3d;
     (*KeywordMap)["RWBuffer"] =                EHTokRWBuffer;
+    (*KeywordMap)["SubpassInput"] =            EHTokSubpassInput;
+    (*KeywordMap)["SubpassInputMS"] =          EHTokSubpassInputMS;
 
     (*KeywordMap)["AppendStructuredBuffer"] =  EHTokAppendStructuredBuffer;
     (*KeywordMap)["ByteAddressBuffer"] =       EHTokByteAddressBuffer;
@@ -327,6 +346,7 @@
     (*KeywordMap)["RWByteAddressBuffer"] =     EHTokRWByteAddressBuffer;
     (*KeywordMap)["RWStructuredBuffer"] =      EHTokRWStructuredBuffer;
     (*KeywordMap)["StructuredBuffer"] =        EHTokStructuredBuffer;
+    (*KeywordMap)["TextureBuffer"] =           EHTokTextureBuffer;
 
     (*KeywordMap)["class"] =                   EHTokClass;
     (*KeywordMap)["struct"] =                  EHTokStruct;
@@ -404,32 +424,6 @@
     }
 
     (*SemanticMap)["SV_POSITION"] =               EbvPosition;
-    (*SemanticMap)["SV_CLIPDISTANCE"] =           EbvClipDistance;
-    (*SemanticMap)["SV_CLIPDISTANCE0"] =          EbvClipDistance;
-    (*SemanticMap)["SV_CLIPDISTANCE1"] =          EbvClipDistance;
-    (*SemanticMap)["SV_CLIPDISTANCE2"] =          EbvClipDistance;
-    (*SemanticMap)["SV_CLIPDISTANCE3"] =          EbvClipDistance;
-    (*SemanticMap)["SV_CLIPDISTANCE4"] =          EbvClipDistance;
-    (*SemanticMap)["SV_CLIPDISTANCE5"] =          EbvClipDistance;
-    (*SemanticMap)["SV_CLIPDISTANCE6"] =          EbvClipDistance;
-    (*SemanticMap)["SV_CLIPDISTANCE7"] =          EbvClipDistance;
-    (*SemanticMap)["SV_CLIPDISTANCE8"] =          EbvClipDistance;
-    (*SemanticMap)["SV_CLIPDISTANCE9"] =          EbvClipDistance;
-    (*SemanticMap)["SV_CLIPDISTANCE10"] =         EbvClipDistance;
-    (*SemanticMap)["SV_CLIPDISTANCE11"] =         EbvClipDistance;
-    (*SemanticMap)["SV_CULLDISTANCE"] =           EbvCullDistance;
-    (*SemanticMap)["SV_CULLDISTANCE0"] =          EbvCullDistance;
-    (*SemanticMap)["SV_CULLDISTANCE1"] =          EbvCullDistance;
-    (*SemanticMap)["SV_CULLDISTANCE2"] =          EbvCullDistance;
-    (*SemanticMap)["SV_CULLDISTANCE3"] =          EbvCullDistance;
-    (*SemanticMap)["SV_CULLDISTANCE4"] =          EbvCullDistance;
-    (*SemanticMap)["SV_CULLDISTANCE5"] =          EbvCullDistance;
-    (*SemanticMap)["SV_CULLDISTANCE6"] =          EbvCullDistance;
-    (*SemanticMap)["SV_CULLDISTANCE7"] =          EbvCullDistance;
-    (*SemanticMap)["SV_CULLDISTANCE8"] =          EbvCullDistance;
-    (*SemanticMap)["SV_CULLDISTANCE9"] =          EbvCullDistance;
-    (*SemanticMap)["SV_CULLDISTANCE10"] =         EbvCullDistance;
-    (*SemanticMap)["SV_CULLDISTANCE11"] =         EbvCullDistance;
     (*SemanticMap)["SV_VERTEXID"] =               EbvVertexIndex;
     (*SemanticMap)["SV_VIEWPORTARRAYINDEX"] =     EbvViewportIndex;
     (*SemanticMap)["SV_TESSFACTOR"] =             EbvTessLevelOuter;
@@ -450,7 +444,7 @@
     (*SemanticMap)["SV_COVERAGE"] =               EbvSampleMask;
     (*SemanticMap)["SV_DEPTHGREATEREQUAL"] =      EbvFragDepthGreater;
     (*SemanticMap)["SV_DEPTHLESSEQUAL"] =         EbvFragDepthLesser;
-    (*SemanticMap)["SV_STENCILREF"] =             EbvStencilRef;
+    (*SemanticMap)["SV_STENCILREF"] =             EbvFragStencilRef;
 }
 
 void HlslScanContext::deleteKeywordMap()
@@ -556,6 +550,7 @@
 
         case PpAtomConstInt:           parserToken->i = ppToken.ival;       return EHTokIntConstant;
         case PpAtomConstUint:          parserToken->i = ppToken.ival;       return EHTokUintConstant;
+        case PpAtomConstFloat16:       parserToken->d = ppToken.dval;       return EHTokFloat16Constant;
         case PpAtomConstFloat:         parserToken->d = ppToken.dval;       return EHTokFloatConstant;
         case PpAtomConstDouble:        parserToken->d = ppToken.dval;       return EHTokDoubleConstant;
         case PpAtomIdentifier:
@@ -572,10 +567,15 @@
         case EndOfInput:               return EHTokNone;
 
         default:
-            char buf[2];
-            buf[0] = (char)token;
-            buf[1] = 0;
-            parseContext.error(loc, "unexpected token", buf, "");
+            if (token < PpAtomMaxSingle) {
+                char buf[2];
+                buf[0] = (char)token;
+                buf[1] = 0;
+                parseContext.error(loc, "unexpected token", buf, "");
+            } else if (tokenText[0] != 0)
+                parseContext.error(loc, "unexpected token", tokenText, "");
+            else
+                parseContext.error(loc, "unexpected token", "", "");
             break;
         }
     } while (true);
@@ -652,6 +652,7 @@
     case EHTokBool:
     case EHTokInt:
     case EHTokUint:
+    case EHTokUint64:
     case EHTokDword:
     case EHTokHalf:
     case EHTokFloat:
@@ -773,6 +774,22 @@
     case EHTokFloat4x2:
     case EHTokFloat4x3:
     case EHTokFloat4x4:
+    case EHTokHalf1x1:
+    case EHTokHalf1x2:
+    case EHTokHalf1x3:
+    case EHTokHalf1x4:
+    case EHTokHalf2x1:
+    case EHTokHalf2x2:
+    case EHTokHalf2x3:
+    case EHTokHalf2x4:
+    case EHTokHalf3x1:
+    case EHTokHalf3x2:
+    case EHTokHalf3x3:
+    case EHTokHalf3x4:
+    case EHTokHalf4x1:
+    case EHTokHalf4x2:
+    case EHTokHalf4x3:
+    case EHTokHalf4x4:
     case EHTokDouble1x1:
     case EHTokDouble1x2:
     case EHTokDouble1x3:
@@ -821,6 +838,9 @@
     case EHTokRWByteAddressBuffer:
     case EHTokRWStructuredBuffer:
     case EHTokStructuredBuffer:
+    case EHTokTextureBuffer:
+    case EHTokSubpassInput:
+    case EHTokSubpassInputMS:
         return keyword;
 
     // variable, user type, ...
diff --git a/hlsl/hlslScanContext.h b/hlsl/hlslScanContext.h
old mode 100755
new mode 100644
diff --git a/hlsl/hlslTokenStream.cpp b/hlsl/hlslTokenStream.cpp
old mode 100755
new mode 100644
diff --git a/hlsl/hlslTokenStream.h b/hlsl/hlslTokenStream.h
old mode 100755
new mode 100644
diff --git a/hlsl/hlslTokens.h b/hlsl/hlslTokens.h
old mode 100755
new mode 100644
index f6a2c96..4426bcc
--- a/hlsl/hlslTokens.h
+++ b/hlsl/hlslTokens.h
@@ -95,6 +95,7 @@
     EHTokBool,
     EHTokInt,
     EHTokUint,
+    EHTokUint64,
     EHTokDword,
     EHTokHalf,
     EHTokFloat,
@@ -216,6 +217,22 @@
     EHTokFloat4x2,
     EHTokFloat4x3,
     EHTokFloat4x4,
+    EHTokHalf1x1,
+    EHTokHalf1x2,
+    EHTokHalf1x3,
+    EHTokHalf1x4,
+    EHTokHalf2x1,
+    EHTokHalf2x2,
+    EHTokHalf2x3,
+    EHTokHalf2x4,
+    EHTokHalf3x1,
+    EHTokHalf3x2,
+    EHTokHalf3x3,
+    EHTokHalf3x4,
+    EHTokHalf4x1,
+    EHTokHalf4x2,
+    EHTokHalf4x3,
+    EHTokHalf4x4,
     EHTokDouble1x1,
     EHTokDouble1x2,
     EHTokDouble1x3,
@@ -257,6 +274,8 @@
     EHTokRWTexture2darray,
     EHTokRWTexture3d,
     EHTokRWBuffer,
+    EHTokSubpassInput,
+    EHTokSubpassInputMS,
 
     // Structure buffer variants
     EHTokAppendStructuredBuffer,
@@ -265,6 +284,7 @@
     EHTokRWByteAddressBuffer,
     EHTokRWStructuredBuffer,
     EHTokStructuredBuffer,
+    EHTokTextureBuffer,
 
     // variable, user type, ...
     EHTokIdentifier,
@@ -278,6 +298,7 @@
     EHTokConstantBuffer,
 
     // constant
+    EHTokFloat16Constant,
     EHTokFloatConstant,
     EHTokDoubleConstant,
     EHTokIntConstant,
diff --git a/hlsl/pch.cpp b/hlsl/pch.cpp
new file mode 100644
index 0000000..b7a0865
--- /dev/null
+++ b/hlsl/pch.cpp
@@ -0,0 +1,35 @@
+//
+// Copyright (C) 2018 The Khronos Group Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+//
+//    Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//    Redistributions in binary form must reproduce the above
+//    copyright notice, this list of conditions and the following
+//    disclaimer in the documentation and/or other materials provided
+//    with the distribution.
+//
+//    Neither the name of 3Dlabs Inc. Ltd. nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+// POSSIBILITY OF SUCH DAMAGE.
+//
+
+#include "pch.h"
diff --git a/hlsl/pch.h b/hlsl/pch.h
new file mode 100644
index 0000000..e0bc491
--- /dev/null
+++ b/hlsl/pch.h
@@ -0,0 +1,54 @@
+#ifndef _PCH_H
+#define _PCH_H
+//
+// Copyright (C) 2018 The Khronos Group Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+//
+//    Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//    Redistributions in binary form must reproduce the above
+//    copyright notice, this list of conditions and the following
+//    disclaimer in the documentation and/or other materials provided
+//    with the distribution.
+//
+//    Neither the name of 3Dlabs Inc. Ltd. nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+// POSSIBILITY OF SUCH DAMAGE.
+//
+
+#include "hlslParseHelper.h"
+#include "hlslScanContext.h"
+#include "hlslGrammar.h"
+#include "hlslAttributes.h"
+
+#include "../glslang/MachineIndependent/Scan.h"
+#include "../glslang/MachineIndependent/preprocessor/PpContext.h"
+
+#include "../glslang/OSDependent/osinclude.h"
+
+#include <algorithm>
+#include <functional>
+#include <cctype>
+#include <array>
+#include <set>
+
+
+#endif /* _PCH_H */
diff --git a/known_good.json b/known_good.json
new file mode 100755
index 0000000..837255d
--- /dev/null
+++ b/known_good.json
@@ -0,0 +1,18 @@
+{
+  "commits" : [
+    {
+      "name" : "spirv-tools",
+      "site" : "github",
+      "subrepo" : "KhronosGroup/SPIRV-Tools",
+      "subdir" : "External/spirv-tools",
+      "commit" : "d543f7dfed9ba02910996121375e57fff92c3c93"
+    },
+    {
+      "name" : "spirv-tools/external/spirv-headers",
+      "site" : "github",
+      "subrepo" : "KhronosGroup/SPIRV-Headers",
+      "subdir" : "External/spirv-tools/external/spirv-headers",
+      "commit" : "282879ca34563020dbe73fd8f7d45bed6755626a"
+    }
+  ]
+}
diff --git a/known_good_khr.json b/known_good_khr.json
new file mode 100644
index 0000000..a64198a
--- /dev/null
+++ b/known_good_khr.json
@@ -0,0 +1,18 @@
+{
+  "commits" : [
+    {
+      "name" : "spirv-tools",
+      "site" : "gitlab",
+      "subrepo" : "spirv/spirv-tools",
+      "subdir" : "External/spirv-tools",
+      "commit" : "d4e2c2eaa6fd2e9f9cd218ea9add9b0c8ae759ba"
+    },
+    {
+      "name" : "spirv-tools/external/spirv-headers",
+      "site" : "gitlab",
+      "subrepo" : "spirv/SPIRV-Headers",
+      "subdir" : "External/spirv-tools/external/spirv-headers",
+      "commit" : "gitlab-prelim-rc4"
+    }
+  ]
+}
diff --git a/make-revision b/make-revision
index 492e437..a89ff08 100755
--- a/make-revision
+++ b/make-revision
@@ -1,10 +1,6 @@
 #!/bin/sh
 (
 echo "// This header is generated by the make-revision script."
-echo "// For the version, it uses the latest git tag followed by the number of commits."
-echo "// For the date, it uses the current date (when then script is run)."
-
 echo
-echo \#define GLSLANG_REVISION \"`git describe --tags --abbrev=0`.`git log --oneline | wc -l`\"
-echo \#define GLSLANG_DATE \"`date +%d-%b-%Y`\"
+echo \#define GLSLANG_PATCH_LEVEL `git log --oneline | wc -l`
 ) > glslang/Include/revision.h
diff --git a/ndk_test/Android.mk b/ndk_test/Android.mk
new file mode 100644
index 0000000..bcf82dd
--- /dev/null
+++ b/ndk_test/Android.mk
@@ -0,0 +1,12 @@
+LOCAL_PATH:= $(call my-dir)
+
+include $(CLEAR_VARS)
+LOCAL_CPP_EXTENSION := .cc .cpp .cxx
+LOCAL_SRC_FILES:=test.cpp
+LOCAL_MODULE:=glslang_ndk_test
+LOCAL_LDLIBS:=-landroid
+LOCAL_CXXFLAGS:=-std=c++11 -fno-exceptions -fno-rtti -Werror
+LOCAL_STATIC_LIBRARIES:=glslang SPIRV HLSL
+include $(BUILD_SHARED_LIBRARY)
+
+include $(LOCAL_PATH)/../Android.mk
diff --git a/ndk_test/jni/Application.mk b/ndk_test/jni/Application.mk
new file mode 100644
index 0000000..d7ccd34
--- /dev/null
+++ b/ndk_test/jni/Application.mk
@@ -0,0 +1,5 @@
+APP_ABI := all
+APP_BUILD_SCRIPT := Android.mk
+APP_STL := gnustl_static
+APP_PLATFORM := android-9
+NDK_TOOLCHAIN_VERSION := 4.9
diff --git a/ndk_test/test.cpp b/ndk_test/test.cpp
new file mode 100644
index 0000000..dec53d0
--- /dev/null
+++ b/ndk_test/test.cpp
@@ -0,0 +1,19 @@
+// Copyright 2018 Google LLC.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "SPIRV/GlslangToSpv.h"
+
+void android_main(struct android_app* state) {
+  int version = glslang::GetSpirvGeneratorVersion();
+}
diff --git a/update_glslang_sources.py b/update_glslang_sources.py
new file mode 100755
index 0000000..65be2f6
--- /dev/null
+++ b/update_glslang_sources.py
@@ -0,0 +1,155 @@
+#!/usr/bin/env python
+
+# Copyright 2017 The Glslang Authors. All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""Get source files for Glslang and its dependencies from public repositories.
+"""
+
+from __future__ import print_function
+
+import argparse
+import json
+import distutils.dir_util
+import os.path
+import subprocess
+import sys
+
+KNOWN_GOOD_FILE = 'known_good.json'
+
+SITE_TO_KNOWN_GOOD_FILE = { 'github' : 'known_good.json',
+                            'gitlab' : 'known_good_khr.json' }
+
+# Maps a site name to its hostname.
+SITE_TO_HOST = { 'github' : 'https://github.com/',
+                 'gitlab' : 'git@gitlab.khronos.org:' }
+
+VERBOSE = True
+
+
+def command_output(cmd, directory, fail_ok=False):
+    """Runs a command in a directory and returns its standard output stream.
+
+    Captures the standard error stream.
+
+    Raises a RuntimeError if the command fails to launch or otherwise fails.
+    """
+    if VERBOSE:
+        print('In {d}: {cmd}'.format(d=directory, cmd=cmd))
+    p = subprocess.Popen(cmd,
+                         cwd=directory,
+                         stdout=subprocess.PIPE)
+    (stdout, _) = p.communicate()
+    if p.returncode != 0 and not fail_ok:
+        raise RuntimeError('Failed to run {} in {}'.format(cmd, directory))
+    if VERBOSE:
+        print(stdout)
+    return stdout
+
+
+def command_retval(cmd, directory):
+    """Runs a command in a directory and returns its return value.
+
+    Captures the standard error stream.
+    """
+    p = subprocess.Popen(cmd,
+                         cwd=directory,
+                         stdout=subprocess.PIPE)
+    p.communicate()
+    return p.returncode
+
+
+class GoodCommit(object):
+    """Represents a good commit for a repository."""
+
+    def __init__(self, json):
+        """Initializes this good commit object.
+
+        Args:
+        'json':  A fully populated JSON object describing the commit.
+        """
+        self._json = json
+        self.name = json['name']
+        self.site = json['site']
+        self.subrepo = json['subrepo']
+        self.subdir = json['subdir'] if ('subdir' in json) else '.'
+        self.commit = json['commit']
+
+    def GetUrl(self):
+        """Returns the URL for the repository."""
+        host = SITE_TO_HOST[self.site]
+        return '{host}{subrepo}'.format(
+                    host=host,
+                    subrepo=self.subrepo)
+
+    def AddRemote(self):
+        """Add the remote 'known-good' if it does not exist."""
+        remotes = command_output(['git', 'remote'], self.subdir).splitlines()
+        if b'known-good' not in remotes:
+            command_output(['git', 'remote', 'add', 'known-good', self.GetUrl()], self.subdir)
+
+    def HasCommit(self):
+        """Check if the repository contains the known-good commit."""
+        return 0 == subprocess.call(['git', 'rev-parse', '--verify', '--quiet',
+                                     self.commit + "^{commit}"],
+                                    cwd=self.subdir)
+
+    def Clone(self):
+        distutils.dir_util.mkpath(self.subdir)
+        command_output(['git', 'clone', self.GetUrl(), '.'], self.subdir)
+
+    def Fetch(self):
+        command_output(['git', 'fetch', 'known-good'], self.subdir)
+
+    def Checkout(self):
+        if not os.path.exists(os.path.join(self.subdir,'.git')):
+            self.Clone()
+        self.AddRemote()
+        if not self.HasCommit():
+            self.Fetch()
+        command_output(['git', 'checkout', self.commit], self.subdir)
+
+
+def GetGoodCommits(site):
+    """Returns the latest list of GoodCommit objects."""
+    known_good_file = SITE_TO_KNOWN_GOOD_FILE[site]
+    with open(known_good_file) as known_good:
+        return [GoodCommit(c) for c in json.loads(known_good.read())['commits']]
+
+
+def main():
+    parser = argparse.ArgumentParser(description='Get Glslang source dependencies at a known-good commit')
+    parser.add_argument('--dir', dest='dir', default='.',
+                        help="Set target directory for Glslang source root. Default is \'.\'.")
+    parser.add_argument('--site', dest='site', default='github',
+                        help="Set git server site. Default is github.")
+
+    args = parser.parse_args()
+
+    commits = GetGoodCommits(args.site)
+
+    distutils.dir_util.mkpath(args.dir)
+    print('Change directory to {d}'.format(d=args.dir))
+    os.chdir(args.dir)
+
+    # Create the subdirectories in sorted order so that parent git repositories
+    # are created first.
+    for c in sorted(commits, key=lambda x: x.subdir):
+        print('Get {n}\n'.format(n=c.name))
+        c.Checkout()
+    sys.exit(0)
+
+
+if __name__ == '__main__':
+    main()